diff options
Diffstat (limited to 'drivers/staging/media/as102/as102_drv.c')
-rw-r--r-- | drivers/staging/media/as102/as102_drv.c | 126 |
1 files changed, 47 insertions, 79 deletions
diff --git a/drivers/staging/media/as102/as102_drv.c b/drivers/staging/media/as102/as102_drv.c index 828526d4c28..aae0505a36c 100644 --- a/drivers/staging/media/as102/as102_drv.c +++ b/drivers/staging/media/as102/as102_drv.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
25 | #include <linux/mm.h> | 25 | #include <linux/mm.h> |
26 | #include <linux/kref.h> | 26 | #include <linux/kref.h> |
27 | #include <asm/uaccess.h> | 27 | #include <linux/uaccess.h> |
28 | #include <linux/usb.h> | 28 | #include <linux/usb.h> |
29 | 29 | ||
30 | /* header file for Usb device driver*/ | 30 | /* header file for Usb device driver*/ |
@@ -56,13 +56,11 @@ int elna_enable = 1; | |||
56 | module_param_named(elna_enable, elna_enable, int, 0644); | 56 | module_param_named(elna_enable, elna_enable, int, 0644); |
57 | MODULE_PARM_DESC(elna_enable, "Activate eLNA (default: on)"); | 57 | MODULE_PARM_DESC(elna_enable, "Activate eLNA (default: on)"); |
58 | 58 | ||
59 | #ifdef DVB_DEFINE_MOD_OPT_ADAPTER_NR | ||
60 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 59 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
61 | #endif | ||
62 | 60 | ||
63 | static void as102_stop_stream(struct as102_dev_t *dev) | 61 | static void as102_stop_stream(struct as102_dev_t *dev) |
64 | { | 62 | { |
65 | struct as102_bus_adapter_t *bus_adap; | 63 | struct as10x_bus_adapter_t *bus_adap; |
66 | 64 | ||
67 | if (dev != NULL) | 65 | if (dev != NULL) |
68 | bus_adap = &dev->bus_adap; | 66 | bus_adap = &dev->bus_adap; |
@@ -85,7 +83,7 @@ static void as102_stop_stream(struct as102_dev_t *dev) | |||
85 | 83 | ||
86 | static int as102_start_stream(struct as102_dev_t *dev) | 84 | static int as102_start_stream(struct as102_dev_t *dev) |
87 | { | 85 | { |
88 | struct as102_bus_adapter_t *bus_adap; | 86 | struct as10x_bus_adapter_t *bus_adap; |
89 | int ret = -EFAULT; | 87 | int ret = -EFAULT; |
90 | 88 | ||
91 | if (dev != NULL) | 89 | if (dev != NULL) |
@@ -111,7 +109,7 @@ static int as102_start_stream(struct as102_dev_t *dev) | |||
111 | static int as10x_pid_filter(struct as102_dev_t *dev, | 109 | static int as10x_pid_filter(struct as102_dev_t *dev, |
112 | int index, u16 pid, int onoff) { | 110 | int index, u16 pid, int onoff) { |
113 | 111 | ||
114 | struct as102_bus_adapter_t *bus_adap = &dev->bus_adap; | 112 | struct as10x_bus_adapter_t *bus_adap = &dev->bus_adap; |
115 | int ret = -EFAULT; | 113 | int ret = -EFAULT; |
116 | 114 | ||
117 | ENTER(); | 115 | ENTER(); |
@@ -123,22 +121,22 @@ static int as10x_pid_filter(struct as102_dev_t *dev, | |||
123 | 121 | ||
124 | switch (onoff) { | 122 | switch (onoff) { |
125 | case 0: | 123 | case 0: |
126 | ret = as10x_cmd_del_PID_filter(bus_adap, (uint16_t) pid); | 124 | ret = as10x_cmd_del_PID_filter(bus_adap, (uint16_t) pid); |
127 | dprintk(debug, "DEL_PID_FILTER([%02d] 0x%04x) ret = %d\n", | 125 | dprintk(debug, "DEL_PID_FILTER([%02d] 0x%04x) ret = %d\n", |
128 | index, pid, ret); | 126 | index, pid, ret); |
129 | break; | 127 | break; |
130 | case 1: | 128 | case 1: |
131 | { | 129 | { |
132 | struct as10x_ts_filter filter; | 130 | struct as10x_ts_filter filter; |
133 | 131 | ||
134 | filter.type = TS_PID_TYPE_TS; | 132 | filter.type = TS_PID_TYPE_TS; |
135 | filter.idx = 0xFF; | 133 | filter.idx = 0xFF; |
136 | filter.pid = pid; | 134 | filter.pid = pid; |
137 | 135 | ||
138 | ret = as10x_cmd_add_PID_filter(bus_adap, &filter); | 136 | ret = as10x_cmd_add_PID_filter(bus_adap, &filter); |
139 | dprintk(debug, "ADD_PID_FILTER([%02d -> %02d], 0x%04x) ret = %d\n", | 137 | dprintk(debug, "ADD_PID_FILTER([%02d -> %02d], 0x%04x) ret = %d\n", |
140 | index, filter.idx, filter.pid, ret); | 138 | index, filter.idx, filter.pid, ret); |
141 | break; | 139 | break; |
142 | } | 140 | } |
143 | } | 141 | } |
144 | 142 | ||
@@ -159,10 +157,9 @@ static int as102_dvb_dmx_start_feed(struct dvb_demux_feed *dvbdmxfeed) | |||
159 | if (mutex_lock_interruptible(&as102_dev->sem)) | 157 | if (mutex_lock_interruptible(&as102_dev->sem)) |
160 | return -ERESTARTSYS; | 158 | return -ERESTARTSYS; |
161 | 159 | ||
162 | if (pid_filtering) { | 160 | if (pid_filtering) |
163 | as10x_pid_filter(as102_dev, | 161 | as10x_pid_filter(as102_dev, dvbdmxfeed->index, |
164 | dvbdmxfeed->index, dvbdmxfeed->pid, 1); | 162 | dvbdmxfeed->pid, 1); |
165 | } | ||
166 | 163 | ||
167 | if (as102_dev->streaming++ == 0) | 164 | if (as102_dev->streaming++ == 0) |
168 | ret = as102_start_stream(as102_dev); | 165 | ret = as102_start_stream(as102_dev); |
@@ -185,10 +182,9 @@ static int as102_dvb_dmx_stop_feed(struct dvb_demux_feed *dvbdmxfeed) | |||
185 | if (--as102_dev->streaming == 0) | 182 | if (--as102_dev->streaming == 0) |
186 | as102_stop_stream(as102_dev); | 183 | as102_stop_stream(as102_dev); |
187 | 184 | ||
188 | if (pid_filtering) { | 185 | if (pid_filtering) |
189 | as10x_pid_filter(as102_dev, | 186 | as10x_pid_filter(as102_dev, dvbdmxfeed->index, |
190 | dvbdmxfeed->index, dvbdmxfeed->pid, 0); | 187 | dvbdmxfeed->pid, 0); |
191 | } | ||
192 | 188 | ||
193 | mutex_unlock(&as102_dev->sem); | 189 | mutex_unlock(&as102_dev->sem); |
194 | LEAVE(); | 190 | LEAVE(); |
@@ -197,27 +193,16 @@ static int as102_dvb_dmx_stop_feed(struct dvb_demux_feed *dvbdmxfeed) | |||
197 | 193 | ||
198 | int as102_dvb_register(struct as102_dev_t *as102_dev) | 194 | int as102_dvb_register(struct as102_dev_t *as102_dev) |
199 | { | 195 | { |
200 | int ret = 0; | 196 | struct device *dev = &as102_dev->bus_adap.usb_dev->dev; |
201 | ENTER(); | 197 | int ret; |
202 | 198 | ||
203 | ret = dvb_register_adapter(&as102_dev->dvb_adap, | 199 | ret = dvb_register_adapter(&as102_dev->dvb_adap, |
204 | as102_dev->name, | 200 | as102_dev->name, THIS_MODULE, |
205 | THIS_MODULE, | 201 | dev, adapter_nr); |
206 | #if defined(CONFIG_AS102_USB) | ||
207 | &as102_dev->bus_adap.usb_dev->dev | ||
208 | #elif defined(CONFIG_AS102_SPI) | ||
209 | &as102_dev->bus_adap.spi_dev->dev | ||
210 | #else | ||
211 | #error >>> dvb_register_adapter <<< | ||
212 | #endif | ||
213 | #ifdef DVB_DEFINE_MOD_OPT_ADAPTER_NR | ||
214 | , adapter_nr | ||
215 | #endif | ||
216 | ); | ||
217 | if (ret < 0) { | 202 | if (ret < 0) { |
218 | err("%s: dvb_register_adapter() failed (errno = %d)", | 203 | dev_err(dev, "%s: dvb_register_adapter() failed: %d\n", |
219 | __func__, ret); | 204 | __func__, ret); |
220 | goto failed; | 205 | return ret; |
221 | } | 206 | } |
222 | 207 | ||
223 | as102_dev->dvb_dmx.priv = as102_dev; | 208 | as102_dev->dvb_dmx.priv = as102_dev; |
@@ -235,22 +220,22 @@ int as102_dvb_register(struct as102_dev_t *as102_dev) | |||
235 | 220 | ||
236 | ret = dvb_dmx_init(&as102_dev->dvb_dmx); | 221 | ret = dvb_dmx_init(&as102_dev->dvb_dmx); |
237 | if (ret < 0) { | 222 | if (ret < 0) { |
238 | err("%s: dvb_dmx_init() failed (errno = %d)", __func__, ret); | 223 | dev_err(dev, "%s: dvb_dmx_init() failed: %d\n", __func__, ret); |
239 | goto failed; | 224 | goto edmxinit; |
240 | } | 225 | } |
241 | 226 | ||
242 | ret = dvb_dmxdev_init(&as102_dev->dvb_dmxdev, &as102_dev->dvb_adap); | 227 | ret = dvb_dmxdev_init(&as102_dev->dvb_dmxdev, &as102_dev->dvb_adap); |
243 | if (ret < 0) { | 228 | if (ret < 0) { |
244 | err("%s: dvb_dmxdev_init() failed (errno = %d)", __func__, | 229 | dev_err(dev, "%s: dvb_dmxdev_init() failed: %d\n", |
245 | ret); | 230 | __func__, ret); |
246 | goto failed; | 231 | goto edmxdinit; |
247 | } | 232 | } |
248 | 233 | ||
249 | ret = as102_dvb_register_fe(as102_dev, &as102_dev->dvb_fe); | 234 | ret = as102_dvb_register_fe(as102_dev, &as102_dev->dvb_fe); |
250 | if (ret < 0) { | 235 | if (ret < 0) { |
251 | err("%s: as102_dvb_register_frontend() failed (errno = %d)", | 236 | dev_err(dev, "%s: as102_dvb_register_frontend() failed: %d", |
252 | __func__, ret); | 237 | __func__, ret); |
253 | goto failed; | 238 | goto efereg; |
254 | } | 239 | } |
255 | 240 | ||
256 | /* init bus mutex for token locking */ | 241 | /* init bus mutex for token locking */ |
@@ -259,7 +244,6 @@ int as102_dvb_register(struct as102_dev_t *as102_dev) | |||
259 | /* init start / stop stream mutex */ | 244 | /* init start / stop stream mutex */ |
260 | mutex_init(&as102_dev->sem); | 245 | mutex_init(&as102_dev->sem); |
261 | 246 | ||
262 | #if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE) | ||
263 | /* | 247 | /* |
264 | * try to load as102 firmware. If firmware upload failed, we'll be | 248 | * try to load as102 firmware. If firmware upload failed, we'll be |
265 | * able to upload it later. | 249 | * able to upload it later. |
@@ -267,18 +251,21 @@ int as102_dvb_register(struct as102_dev_t *as102_dev) | |||
267 | if (fw_upload) | 251 | if (fw_upload) |
268 | try_then_request_module(as102_fw_upload(&as102_dev->bus_adap), | 252 | try_then_request_module(as102_fw_upload(&as102_dev->bus_adap), |
269 | "firmware_class"); | 253 | "firmware_class"); |
270 | #endif | ||
271 | 254 | ||
272 | failed: | 255 | pr_info("Registered device %s", as102_dev->name); |
273 | LEAVE(); | 256 | return 0; |
274 | /* FIXME: free dvb_XXX */ | 257 | |
258 | efereg: | ||
259 | dvb_dmxdev_release(&as102_dev->dvb_dmxdev); | ||
260 | edmxdinit: | ||
261 | dvb_dmx_release(&as102_dev->dvb_dmx); | ||
262 | edmxinit: | ||
263 | dvb_unregister_adapter(&as102_dev->dvb_adap); | ||
275 | return ret; | 264 | return ret; |
276 | } | 265 | } |
277 | 266 | ||
278 | void as102_dvb_unregister(struct as102_dev_t *as102_dev) | 267 | void as102_dvb_unregister(struct as102_dev_t *as102_dev) |
279 | { | 268 | { |
280 | ENTER(); | ||
281 | |||
282 | /* unregister as102 frontend */ | 269 | /* unregister as102 frontend */ |
283 | as102_dvb_unregister_fe(&as102_dev->dvb_fe); | 270 | as102_dvb_unregister_fe(&as102_dev->dvb_fe); |
284 | 271 | ||
@@ -289,28 +276,18 @@ void as102_dvb_unregister(struct as102_dev_t *as102_dev) | |||
289 | /* unregister dvb adapter */ | 276 | /* unregister dvb adapter */ |
290 | dvb_unregister_adapter(&as102_dev->dvb_adap); | 277 | dvb_unregister_adapter(&as102_dev->dvb_adap); |
291 | 278 | ||
292 | LEAVE(); | 279 | pr_info("Unregistered device %s", as102_dev->name); |
293 | } | 280 | } |
294 | 281 | ||
295 | static int __init as102_driver_init(void) | 282 | static int __init as102_driver_init(void) |
296 | { | 283 | { |
297 | int ret = 0; | 284 | int ret; |
298 | |||
299 | ENTER(); | ||
300 | 285 | ||
301 | /* register this driver with the low level subsystem */ | 286 | /* register this driver with the low level subsystem */ |
302 | #if defined(CONFIG_AS102_USB) | ||
303 | ret = usb_register(&as102_usb_driver); | 287 | ret = usb_register(&as102_usb_driver); |
304 | if (ret) | 288 | if (ret) |
305 | err("usb_register failed (ret = %d)", ret); | 289 | err("usb_register failed (ret = %d)", ret); |
306 | #endif | ||
307 | #if defined(CONFIG_AS102_SPI) | ||
308 | ret = spi_register_driver(&as102_spi_driver); | ||
309 | if (ret) | ||
310 | printk(KERN_ERR "spi_register failed (ret = %d)", ret); | ||
311 | #endif | ||
312 | 290 | ||
313 | LEAVE(); | ||
314 | return ret; | 291 | return ret; |
315 | } | 292 | } |
316 | 293 | ||
@@ -327,15 +304,8 @@ module_init(as102_driver_init); | |||
327 | */ | 304 | */ |
328 | static void __exit as102_driver_exit(void) | 305 | static void __exit as102_driver_exit(void) |
329 | { | 306 | { |
330 | ENTER(); | ||
331 | /* deregister this driver with the low level bus subsystem */ | 307 | /* deregister this driver with the low level bus subsystem */ |
332 | #if defined(CONFIG_AS102_USB) | ||
333 | usb_deregister(&as102_usb_driver); | 308 | usb_deregister(&as102_usb_driver); |
334 | #endif | ||
335 | #if defined(CONFIG_AS102_SPI) | ||
336 | spi_unregister_driver(&as102_spi_driver); | ||
337 | #endif | ||
338 | LEAVE(); | ||
339 | } | 309 | } |
340 | 310 | ||
341 | /* | 311 | /* |
@@ -347,5 +317,3 @@ module_exit(as102_driver_exit); | |||
347 | MODULE_DESCRIPTION(DRIVER_FULL_NAME); | 317 | MODULE_DESCRIPTION(DRIVER_FULL_NAME); |
348 | MODULE_LICENSE("GPL"); | 318 | MODULE_LICENSE("GPL"); |
349 | MODULE_AUTHOR("Pierrick Hascoet <pierrick.hascoet@abilis.com>"); | 319 | MODULE_AUTHOR("Pierrick Hascoet <pierrick.hascoet@abilis.com>"); |
350 | |||
351 | /* EOF - vim: set textwidth=80 ts=8 sw=8 sts=8 noet: */ | ||