[media] media: change email address
[cascardo/linux.git] / drivers / media / usb / dvb-usb / dvb-usb-dvb.c
1 /* dvb-usb-dvb.c is part of the DVB USB library.
2  *
3  * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@posteo.de)
4  * see dvb-usb-init.c for copyright information.
5  *
6  * This file contains functions for initializing and handling the
7  * linux-dvb API.
8  */
9 #include "dvb-usb-common.h"
10
11 /* does the complete input transfer handling */
12 static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
13 {
14         struct dvb_usb_adapter *adap = dvbdmxfeed->demux->priv;
15         int newfeedcount, ret;
16
17         if (adap == NULL)
18                 return -ENODEV;
19
20         if ((adap->active_fe < 0) ||
21             (adap->active_fe >= adap->num_frontends_initialized)) {
22                 return -EINVAL;
23         }
24
25         newfeedcount = adap->feedcount + (onoff ? 1 : -1);
26
27         /* stop feed before setting a new pid if there will be no pid anymore */
28         if (newfeedcount == 0) {
29                 deb_ts("stop feeding\n");
30                 usb_urb_kill(&adap->fe_adap[adap->active_fe].stream);
31
32                 if (adap->props.fe[adap->active_fe].streaming_ctrl != NULL) {
33                         ret = adap->props.fe[adap->active_fe].streaming_ctrl(adap, 0);
34                         if (ret < 0) {
35                                 err("error while stopping stream.");
36                                 return ret;
37                         }
38                 }
39         }
40
41         adap->feedcount = newfeedcount;
42
43         /* activate the pid on the device specific pid_filter */
44         deb_ts("setting pid (%s): %5d %04x at index %d '%s'\n",
45                 adap->fe_adap[adap->active_fe].pid_filtering ?
46                 "yes" : "no", dvbdmxfeed->pid, dvbdmxfeed->pid,
47                 dvbdmxfeed->index, onoff ? "on" : "off");
48         if (adap->props.fe[adap->active_fe].caps & DVB_USB_ADAP_HAS_PID_FILTER &&
49                 adap->fe_adap[adap->active_fe].pid_filtering &&
50                 adap->props.fe[adap->active_fe].pid_filter != NULL)
51                 adap->props.fe[adap->active_fe].pid_filter(adap, dvbdmxfeed->index, dvbdmxfeed->pid, onoff);
52
53         /* start the feed if this was the first feed and there is still a feed
54          * for reception.
55          */
56         if (adap->feedcount == onoff && adap->feedcount > 0) {
57                 deb_ts("submitting all URBs\n");
58                 usb_urb_submit(&adap->fe_adap[adap->active_fe].stream);
59
60                 deb_ts("controlling pid parser\n");
61                 if (adap->props.fe[adap->active_fe].caps & DVB_USB_ADAP_HAS_PID_FILTER &&
62                         adap->props.fe[adap->active_fe].caps &
63                         DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF &&
64                         adap->props.fe[adap->active_fe].pid_filter_ctrl != NULL) {
65                         ret = adap->props.fe[adap->active_fe].pid_filter_ctrl(adap,
66                                 adap->fe_adap[adap->active_fe].pid_filtering);
67                         if (ret < 0) {
68                                 err("could not handle pid_parser");
69                                 return ret;
70                         }
71                 }
72                 deb_ts("start feeding\n");
73                 if (adap->props.fe[adap->active_fe].streaming_ctrl != NULL) {
74                         ret = adap->props.fe[adap->active_fe].streaming_ctrl(adap, 1);
75                         if (ret < 0) {
76                                 err("error while enabling fifo.");
77                                 return ret;
78                         }
79                 }
80
81         }
82         return 0;
83 }
84
85 static int dvb_usb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
86 {
87         deb_ts("start pid: 0x%04x, feedtype: %d\n", dvbdmxfeed->pid,
88                dvbdmxfeed->type);
89         return dvb_usb_ctrl_feed(dvbdmxfeed, 1);
90 }
91
92 static int dvb_usb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
93 {
94         deb_ts("stop pid: 0x%04x, feedtype: %d\n", dvbdmxfeed->pid, dvbdmxfeed->type);
95         return dvb_usb_ctrl_feed(dvbdmxfeed, 0);
96 }
97
98 static int dvb_usb_media_device_init(struct dvb_usb_adapter *adap)
99 {
100 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
101         struct media_device *mdev;
102         struct dvb_usb_device *d = adap->dev;
103         struct usb_device *udev = d->udev;
104
105         mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
106         if (!mdev)
107                 return -ENOMEM;
108
109         mdev->dev = &udev->dev;
110         strlcpy(mdev->model, d->desc->name, sizeof(mdev->model));
111         if (udev->serial)
112                 strlcpy(mdev->serial, udev->serial, sizeof(mdev->serial));
113         strcpy(mdev->bus_info, udev->devpath);
114         mdev->hw_revision = le16_to_cpu(udev->descriptor.bcdDevice);
115         mdev->driver_version = LINUX_VERSION_CODE;
116
117         media_device_init(mdev);
118
119         dvb_register_media_controller(&adap->dvb_adap, mdev);
120
121         dev_info(&d->udev->dev, "media controller created\n");
122 #endif
123         return 0;
124 }
125
126 static int  dvb_usb_media_device_register(struct dvb_usb_adapter *adap)
127 {
128 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
129         return media_device_register(adap->dvb_adap.mdev);
130 #else
131         return 0;
132 #endif
133 }
134
135 static void dvb_usb_media_device_unregister(struct dvb_usb_adapter *adap)
136 {
137 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
138         if (!adap->dvb_adap.mdev)
139                 return;
140
141         media_device_unregister(adap->dvb_adap.mdev);
142         media_device_cleanup(adap->dvb_adap.mdev);
143         kfree(adap->dvb_adap.mdev);
144         adap->dvb_adap.mdev = NULL;
145 #endif
146 }
147
148 int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap, short *adapter_nums)
149 {
150         int i;
151         int ret = dvb_register_adapter(&adap->dvb_adap, adap->dev->desc->name,
152                                        adap->dev->owner, &adap->dev->udev->dev,
153                                        adapter_nums);
154
155         if (ret < 0) {
156                 deb_info("dvb_register_adapter failed: error %d", ret);
157                 goto err;
158         }
159         adap->dvb_adap.priv = adap;
160
161         ret = dvb_usb_media_device_init(adap);
162         if (ret < 0) {
163                 deb_info("dvb_usb_media_device_init failed: error %d", ret);
164                 goto err_mc;
165         }
166
167         if (adap->dev->props.read_mac_address) {
168                 if (adap->dev->props.read_mac_address(adap->dev, adap->dvb_adap.proposed_mac) == 0)
169                         info("MAC address: %pM", adap->dvb_adap.proposed_mac);
170                 else
171                         err("MAC address reading failed.");
172         }
173
174
175         adap->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING;
176         adap->demux.priv             = adap;
177
178         adap->demux.filternum        = 0;
179         for (i = 0; i < adap->props.num_frontends; i++) {
180                 if (adap->demux.filternum < adap->fe_adap[i].max_feed_count)
181                         adap->demux.filternum = adap->fe_adap[i].max_feed_count;
182         }
183         adap->demux.feednum          = adap->demux.filternum;
184         adap->demux.start_feed       = dvb_usb_start_feed;
185         adap->demux.stop_feed        = dvb_usb_stop_feed;
186         adap->demux.write_to_decoder = NULL;
187         if ((ret = dvb_dmx_init(&adap->demux)) < 0) {
188                 err("dvb_dmx_init failed: error %d", ret);
189                 goto err_dmx;
190         }
191
192         adap->dmxdev.filternum       = adap->demux.filternum;
193         adap->dmxdev.demux           = &adap->demux.dmx;
194         adap->dmxdev.capabilities    = 0;
195         if ((ret = dvb_dmxdev_init(&adap->dmxdev, &adap->dvb_adap)) < 0) {
196                 err("dvb_dmxdev_init failed: error %d", ret);
197                 goto err_dmx_dev;
198         }
199
200         if ((ret = dvb_net_init(&adap->dvb_adap, &adap->dvb_net,
201                                                 &adap->demux.dmx)) < 0) {
202                 err("dvb_net_init failed: error %d", ret);
203                 goto err_net_init;
204         }
205
206         adap->state |= DVB_USB_ADAP_STATE_DVB;
207         return 0;
208
209 err_net_init:
210         dvb_dmxdev_release(&adap->dmxdev);
211 err_dmx_dev:
212         dvb_dmx_release(&adap->demux);
213 err_dmx:
214         dvb_usb_media_device_unregister(adap);
215 err_mc:
216         dvb_unregister_adapter(&adap->dvb_adap);
217 err:
218         return ret;
219 }
220
221 int dvb_usb_adapter_dvb_exit(struct dvb_usb_adapter *adap)
222 {
223         if (adap->state & DVB_USB_ADAP_STATE_DVB) {
224                 deb_info("unregistering DVB part\n");
225                 dvb_net_release(&adap->dvb_net);
226                 adap->demux.dmx.close(&adap->demux.dmx);
227                 dvb_dmxdev_release(&adap->dmxdev);
228                 dvb_dmx_release(&adap->demux);
229                 dvb_usb_media_device_unregister(adap);
230                 dvb_unregister_adapter(&adap->dvb_adap);
231                 adap->state &= ~DVB_USB_ADAP_STATE_DVB;
232         }
233         return 0;
234 }
235
236 static int dvb_usb_set_active_fe(struct dvb_frontend *fe, int onoff)
237 {
238         struct dvb_usb_adapter *adap = fe->dvb->priv;
239
240         int ret = (adap->props.frontend_ctrl) ?
241                 adap->props.frontend_ctrl(fe, onoff) : 0;
242
243         if (ret < 0) {
244                 err("frontend_ctrl request failed");
245                 return ret;
246         }
247         if (onoff)
248                 adap->active_fe = fe->id;
249
250         return 0;
251 }
252
253 static int dvb_usb_fe_wakeup(struct dvb_frontend *fe)
254 {
255         struct dvb_usb_adapter *adap = fe->dvb->priv;
256
257         dvb_usb_device_power_ctrl(adap->dev, 1);
258
259         dvb_usb_set_active_fe(fe, 1);
260
261         if (adap->fe_adap[fe->id].fe_init)
262                 adap->fe_adap[fe->id].fe_init(fe);
263
264         return 0;
265 }
266
267 static int dvb_usb_fe_sleep(struct dvb_frontend *fe)
268 {
269         struct dvb_usb_adapter *adap = fe->dvb->priv;
270
271         if (adap->fe_adap[fe->id].fe_sleep)
272                 adap->fe_adap[fe->id].fe_sleep(fe);
273
274         dvb_usb_set_active_fe(fe, 0);
275
276         return dvb_usb_device_power_ctrl(adap->dev, 0);
277 }
278
279 int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap)
280 {
281         int ret, i;
282
283         /* register all given adapter frontends */
284         for (i = 0; i < adap->props.num_frontends; i++) {
285
286                 if (adap->props.fe[i].frontend_attach == NULL) {
287                         err("strange: '%s' #%d,%d "
288                             "doesn't want to attach a frontend.",
289                             adap->dev->desc->name, adap->id, i);
290
291                         return 0;
292                 }
293
294                 ret = adap->props.fe[i].frontend_attach(adap);
295                 if (ret || adap->fe_adap[i].fe == NULL) {
296                         /* only print error when there is no FE at all */
297                         if (i == 0)
298                                 err("no frontend was attached by '%s'",
299                                         adap->dev->desc->name);
300
301                         return 0;
302                 }
303
304                 adap->fe_adap[i].fe->id = i;
305
306                 /* re-assign sleep and wakeup functions */
307                 adap->fe_adap[i].fe_init = adap->fe_adap[i].fe->ops.init;
308                 adap->fe_adap[i].fe->ops.init  = dvb_usb_fe_wakeup;
309                 adap->fe_adap[i].fe_sleep = adap->fe_adap[i].fe->ops.sleep;
310                 adap->fe_adap[i].fe->ops.sleep = dvb_usb_fe_sleep;
311
312                 if (dvb_register_frontend(&adap->dvb_adap, adap->fe_adap[i].fe)) {
313                         err("Frontend %d registration failed.", i);
314                         dvb_frontend_detach(adap->fe_adap[i].fe);
315                         adap->fe_adap[i].fe = NULL;
316                         /* In error case, do not try register more FEs,
317                          * still leaving already registered FEs alive. */
318                         if (i == 0)
319                                 return -ENODEV;
320                         else
321                                 return 0;
322                 }
323
324                 /* only attach the tuner if the demod is there */
325                 if (adap->props.fe[i].tuner_attach != NULL)
326                         adap->props.fe[i].tuner_attach(adap);
327
328                 adap->num_frontends_initialized++;
329         }
330         if (ret)
331                 return ret;
332
333         ret = dvb_create_media_graph(&adap->dvb_adap, true);
334         if (ret)
335                 return ret;
336
337         ret = dvb_usb_media_device_register(adap);
338
339         return ret;
340 }
341
342 int dvb_usb_adapter_frontend_exit(struct dvb_usb_adapter *adap)
343 {
344         int i = adap->num_frontends_initialized - 1;
345
346         /* unregister all given adapter frontends */
347         for (; i >= 0; i--) {
348                 if (adap->fe_adap[i].fe != NULL) {
349                         dvb_unregister_frontend(adap->fe_adap[i].fe);
350                         dvb_frontend_detach(adap->fe_adap[i].fe);
351                 }
352         }
353         adap->num_frontends_initialized = 0;
354
355         return 0;
356 }