diff options
Diffstat (limited to 'drivers/media/video/tea6420.c')
-rw-r--r-- | drivers/media/video/tea6420.c | 49 |
1 files changed, 37 insertions, 12 deletions
diff --git a/drivers/media/video/tea6420.c b/drivers/media/video/tea6420.c index e50820969e64..38e519f04bde 100644 --- a/drivers/media/video/tea6420.c +++ b/drivers/media/video/tea6420.c | |||
@@ -31,7 +31,7 @@ | |||
31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
32 | #include <linux/ioctl.h> | 32 | #include <linux/ioctl.h> |
33 | #include <linux/i2c.h> | 33 | #include <linux/i2c.h> |
34 | #include <media/v4l2-common.h> | 34 | #include <media/v4l2-device.h> |
35 | #include <media/v4l2-i2c-drv-legacy.h> | 35 | #include <media/v4l2-i2c-drv-legacy.h> |
36 | #include "tea6420.h" | 36 | #include "tea6420.h" |
37 | 37 | ||
@@ -90,26 +90,37 @@ static int tea6420_switch(struct i2c_client *client, int i, int o, int g) | |||
90 | return 0; | 90 | return 0; |
91 | } | 91 | } |
92 | 92 | ||
93 | static int tea6420_command(struct i2c_client *client, unsigned cmd, void *arg) | 93 | static int tea6420_ioctl(struct v4l2_subdev *sd, unsigned cmd, void *arg) |
94 | { | 94 | { |
95 | struct tea6420_multiplex *a = (struct tea6420_multiplex *)arg; | 95 | if (cmd == TEA6420_SWITCH) { |
96 | int result = 0; | 96 | struct i2c_client *client = v4l2_get_subdevdata(sd); |
97 | struct tea6420_multiplex *a = (struct tea6420_multiplex *)arg; | ||
97 | 98 | ||
98 | switch (cmd) { | 99 | return tea6420_switch(client, a->in, a->out, a->gain); |
99 | case TEA6420_SWITCH: | ||
100 | result = tea6420_switch(client, a->in, a->out, a->gain); | ||
101 | break; | ||
102 | default: | ||
103 | return -ENOIOCTLCMD; | ||
104 | } | 100 | } |
101 | return -ENOIOCTLCMD; | ||
102 | } | ||
105 | 103 | ||
106 | return result; | 104 | static int tea6420_command(struct i2c_client *client, unsigned cmd, void *arg) |
105 | { | ||
106 | return v4l2_subdev_command(i2c_get_clientdata(client), cmd, arg); | ||
107 | } | 107 | } |
108 | 108 | ||
109 | /* ----------------------------------------------------------------------- */ | ||
110 | |||
111 | static const struct v4l2_subdev_core_ops tea6420_core_ops = { | ||
112 | .ioctl = tea6420_ioctl, | ||
113 | }; | ||
114 | |||
115 | static const struct v4l2_subdev_ops tea6420_ops = { | ||
116 | .core = &tea6420_core_ops, | ||
117 | }; | ||
118 | |||
109 | /* this function is called by i2c_probe */ | 119 | /* this function is called by i2c_probe */ |
110 | static int tea6420_probe(struct i2c_client *client, | 120 | static int tea6420_probe(struct i2c_client *client, |
111 | const struct i2c_device_id *id) | 121 | const struct i2c_device_id *id) |
112 | { | 122 | { |
123 | struct v4l2_subdev *sd; | ||
113 | int err, i; | 124 | int err, i; |
114 | 125 | ||
115 | /* let's see whether this adapter can support what we need */ | 126 | /* let's see whether this adapter can support what we need */ |
@@ -126,9 +137,22 @@ static int tea6420_probe(struct i2c_client *client, | |||
126 | } | 137 | } |
127 | if (err) { | 138 | if (err) { |
128 | v4l_dbg(1, debug, client, "could not initialize tea6420\n"); | 139 | v4l_dbg(1, debug, client, "could not initialize tea6420\n"); |
129 | kfree(client); | ||
130 | return -ENODEV; | 140 | return -ENODEV; |
131 | } | 141 | } |
142 | |||
143 | sd = kmalloc(sizeof(struct v4l2_subdev), GFP_KERNEL); | ||
144 | if (sd == NULL) | ||
145 | return -ENOMEM; | ||
146 | v4l2_i2c_subdev_init(sd, client, &tea6420_ops); | ||
147 | return 0; | ||
148 | } | ||
149 | |||
150 | static int tea6420_remove(struct i2c_client *client) | ||
151 | { | ||
152 | struct v4l2_subdev *sd = i2c_get_clientdata(client); | ||
153 | |||
154 | v4l2_device_unregister_subdev(sd); | ||
155 | kfree(sd); | ||
132 | return 0; | 156 | return 0; |
133 | } | 157 | } |
134 | 158 | ||
@@ -150,6 +174,7 @@ static struct v4l2_i2c_driver_data v4l2_i2c_data = { | |||
150 | .driverid = I2C_DRIVERID_TEA6420, | 174 | .driverid = I2C_DRIVERID_TEA6420, |
151 | .command = tea6420_command, | 175 | .command = tea6420_command, |
152 | .probe = tea6420_probe, | 176 | .probe = tea6420_probe, |
177 | .remove = tea6420_remove, | ||
153 | .legacy_probe = tea6420_legacy_probe, | 178 | .legacy_probe = tea6420_legacy_probe, |
154 | .id_table = tea6420_id, | 179 | .id_table = tea6420_id, |
155 | }; | 180 | }; |