aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/media/as102/as102_drv.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/media/as102/as102_drv.c')
-rw-r--r--drivers/staging/media/as102/as102_drv.c126
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;
56module_param_named(elna_enable, elna_enable, int, 0644); 56module_param_named(elna_enable, elna_enable, int, 0644);
57MODULE_PARM_DESC(elna_enable, "Activate eLNA (default: on)"); 57MODULE_PARM_DESC(elna_enable, "Activate eLNA (default: on)");
58 58
59#ifdef DVB_DEFINE_MOD_OPT_ADAPTER_NR
60DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 59DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
61#endif
62 60
63static void as102_stop_stream(struct as102_dev_t *dev) 61static 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
86static int as102_start_stream(struct as102_dev_t *dev) 84static 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)
111static int as10x_pid_filter(struct as102_dev_t *dev, 109static 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
198int as102_dvb_register(struct as102_dev_t *as102_dev) 194int 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
272failed: 255 pr_info("Registered device %s", as102_dev->name);
273 LEAVE(); 256 return 0;
274 /* FIXME: free dvb_XXX */ 257
258efereg:
259 dvb_dmxdev_release(&as102_dev->dvb_dmxdev);
260edmxdinit:
261 dvb_dmx_release(&as102_dev->dvb_dmx);
262edmxinit:
263 dvb_unregister_adapter(&as102_dev->dvb_adap);
275 return ret; 264 return ret;
276} 265}
277 266
278void as102_dvb_unregister(struct as102_dev_t *as102_dev) 267void 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
295static int __init as102_driver_init(void) 282static 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 */
328static void __exit as102_driver_exit(void) 305static 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);
347MODULE_DESCRIPTION(DRIVER_FULL_NAME); 317MODULE_DESCRIPTION(DRIVER_FULL_NAME);
348MODULE_LICENSE("GPL"); 318MODULE_LICENSE("GPL");
349MODULE_AUTHOR("Pierrick Hascoet <pierrick.hascoet@abilis.com>"); 319MODULE_AUTHOR("Pierrick Hascoet <pierrick.hascoet@abilis.com>");
350
351/* EOF - vim: set textwidth=80 ts=8 sw=8 sts=8 noet: */