Commit 181d8ce0 authored by Richard Rjfors's avatar Richard Rjfors Committed by James Toy

Signed-off-by: Richard Rjfors <richard.rojfors.ext@mocean-labs.com>

Cc: Mauro Carvalho Chehab <mchehab@infradead.org>
Cc: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 21112fb7
......@@ -27,8 +27,8 @@
#include <linux/videodev2.h>
#include <media/v4l2-device.h>
#include <media/v4l2-chip-ident.h>
#include <media/v4l2-i2c-drv.h>
#define DRIVER_NAME "adv7180"
#define ADV7180_INPUT_CONTROL_REG 0x00
#define ADV7180_INPUT_CONTROL_PAL_BG_NTSC_J_SECAM 0x00
......@@ -51,10 +51,6 @@
#define ADV7180_ID_7180 0x18
static unsigned short normal_i2c[] = { 0x42 >> 1, I2C_CLIENT_END };
I2C_CLIENT_INSMOD;
struct adv7180_state {
struct v4l2_subdev sd;
};
......@@ -98,16 +94,6 @@ static int adv7180_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
return 0;
}
static int adv7180_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
{
return -EINVAL;
}
static int adv7180_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
{
return -EINVAL;
}
static int adv7180_g_chip_ident(struct v4l2_subdev *sd,
struct v4l2_dbg_chip_ident *chip)
{
......@@ -116,26 +102,12 @@ static int adv7180_g_chip_ident(struct v4l2_subdev *sd,
return v4l2_chip_ident_i2c_client(client, chip, V4L2_IDENT_ADV7180, 0);
}
static int adv7180_log_status(struct v4l2_subdev *sd)
{
v4l2_info(sd, "Normal operation\n");
return 0;
}
static irqreturn_t adv7180_irq(int irq, void *devid)
{
return IRQ_NONE;
}
static const struct v4l2_subdev_video_ops adv7180_video_ops = {
.querystd = adv7180_querystd,
};
static const struct v4l2_subdev_core_ops adv7180_core_ops = {
.log_status = adv7180_log_status,
.g_chip_ident = adv7180_g_chip_ident,
.g_ctrl = adv7180_g_ctrl,
.s_ctrl = adv7180_s_ctrl,
};
static const struct v4l2_subdev_ops adv7180_ops = {
......@@ -153,6 +125,7 @@ static int adv7180_probe(struct i2c_client *client,
{
struct adv7180_state *state;
struct v4l2_subdev *sd;
int ret;
/* Check if the adapter supports the needed features */
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
......@@ -161,32 +134,26 @@ static int adv7180_probe(struct i2c_client *client,
v4l_info(client, "chip found @ 0x%02x (%s)\n",
client->addr << 1, client->adapter->name);
state = kmalloc(sizeof(struct adv7180_state), GFP_KERNEL);
state = kzalloc(sizeof(struct adv7180_state), GFP_KERNEL);
if (state == NULL)
return -ENOMEM;
sd = &state->sd;
v4l2_i2c_subdev_init(sd, client, &adv7180_ops);
/* Initialize adv7180 */
/* register interrupt, can be used later */
if (client->irq > 0) {
/* we can use IRQ */
int err = request_irq(client->irq, adv7180_irq, IRQF_SHARED,
"adv7180", sd);
if (err) {
printk(KERN_ERR "adv7180: Failed to request IRQ\n");
v4l2_device_unregister_subdev(sd);
kfree(state);
return err;
}
}
/* enable autodetection */
i2c_smbus_write_byte_data(client, ADV7180_INPUT_CONTROL_REG,
ret = i2c_smbus_write_byte_data(client, ADV7180_INPUT_CONTROL_REG,
ADV7180_INPUT_CONTROL_PAL_BG_NTSC_J_SECAM);
i2c_smbus_write_byte_data(client, ADV7180_AUTODETECT_ENABLE_REG,
ADV7180_AUTODETECT_DEFAULT);
if (ret > 0)
ret = i2c_smbus_write_byte_data(client,
ADV7180_AUTODETECT_ENABLE_REG,
ADV7180_AUTODETECT_DEFAULT);
if (ret < 0) {
printk(KERN_ERR DRIVER_NAME
": Failed to communicate to chip: %d\n", ret);
return ret;
}
return 0;
}
......@@ -194,27 +161,41 @@ static int adv7180_remove(struct i2c_client *client)
{
struct v4l2_subdev *sd = i2c_get_clientdata(client);
if (client->irq > 0)
free_irq(client->irq, sd);
v4l2_device_unregister_subdev(sd);
kfree(to_state(sd));
return 0;
}
static const struct i2c_device_id adv7180_id[] = {
{ "adv7180", 0 },
{ }
{DRIVER_NAME, 0},
{},
};
MODULE_DEVICE_TABLE(i2c, adv7180_id);
static struct v4l2_i2c_driver_data v4l2_i2c_data = {
.name = "adv7180",
.probe = adv7180_probe,
.remove = adv7180_remove,
.id_table = adv7180_id,
static struct i2c_driver adv7180_driver = {
.driver = {
.owner = THIS_MODULE,
.name = DRIVER_NAME,
},
.probe = adv7180_probe,
.remove = adv7180_remove,
.id_table = adv7180_id,
};
static __init int adv7180_init(void)
{
return i2c_add_driver(&adv7180_driver);
}
static __exit void adv7180_exit(void)
{
i2c_del_driver(&adv7180_driver);
}
module_init(adv7180_init);
module_exit(adv7180_exit);
MODULE_DESCRIPTION("Analog Devices ADV7180 video decoder driver");
MODULE_AUTHOR("Mocean Laboratories");
MODULE_LICENSE("GPL v2");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment