Lines Matching +full:d +full:-
1 // SPDX-License-Identifier: GPL-2.0-only
3 * DVB USB library - provides a generic interface for a DVB USB device driver.
5 * dvb-usb-init.c
7 * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@posteo.de)
9 * see Documentation/driver-api/media/drivers/dvb-usb.rst for more information
11 #include "dvb-usb-common.h"
16 …ng level (1=info,xfer=2,pll=4,ts=8,err=16,rc=32,fw=64,mem=128,uxfer=256 (or-able))." DVB_USB_DEBU…
24 MODULE_PARM_DESC(force_pid_filter_usage, "force all dvb-usb-devices to use a PID filter, if any (de…
26 static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs) in dvb_usb_adapter_init() argument
31 for (n = 0; n < d->props.num_adapters; n++) { in dvb_usb_adapter_init()
32 adap = &d->adapter[n]; in dvb_usb_adapter_init()
33 adap->dev = d; in dvb_usb_adapter_init()
34 adap->id = n; in dvb_usb_adapter_init()
36 memcpy(&adap->props, &d->props.adapter[n], sizeof(struct dvb_usb_adapter_properties)); in dvb_usb_adapter_init()
38 for (o = 0; o < adap->props.num_frontends; o++) { in dvb_usb_adapter_init()
39 struct dvb_usb_adapter_fe_properties *props = &adap->props.fe[o]; in dvb_usb_adapter_init()
40 /* speed - when running at FULL speed we need a HW PID filter */ in dvb_usb_adapter_init()
41 if (d->udev->speed == USB_SPEED_FULL && !(props->caps & DVB_USB_ADAP_HAS_PID_FILTER)) { in dvb_usb_adapter_init()
43 return -ENODEV; in dvb_usb_adapter_init()
46 if ((d->udev->speed == USB_SPEED_FULL && props->caps & DVB_USB_ADAP_HAS_PID_FILTER) || in dvb_usb_adapter_init()
47 (props->caps & DVB_USB_ADAP_NEED_PID_FILTERING)) { in dvb_usb_adapter_init()
48 info("will use the device's hardware PID filter (table count: %d).", props->pid_filter_count); in dvb_usb_adapter_init()
49 adap->fe_adap[o].pid_filtering = 1; in dvb_usb_adapter_init()
50 adap->fe_adap[o].max_feed_count = props->pid_filter_count; in dvb_usb_adapter_init()
53 adap->fe_adap[o].pid_filtering = 0; in dvb_usb_adapter_init()
54 adap->fe_adap[o].max_feed_count = 255; in dvb_usb_adapter_init()
57 if (!adap->fe_adap[o].pid_filtering && in dvb_usb_adapter_init()
59 props->caps & DVB_USB_ADAP_HAS_PID_FILTER) { in dvb_usb_adapter_init()
61 adap->fe_adap[o].pid_filtering = 1; in dvb_usb_adapter_init()
62 adap->fe_adap[o].max_feed_count = props->pid_filter_count; in dvb_usb_adapter_init()
65 if (props->size_of_priv > 0) { in dvb_usb_adapter_init()
66 adap->fe_adap[o].priv = kzalloc(props->size_of_priv, GFP_KERNEL); in dvb_usb_adapter_init()
67 if (adap->fe_adap[o].priv == NULL) { in dvb_usb_adapter_init()
68 err("no memory for priv for adapter %d fe %d.", n, o); in dvb_usb_adapter_init()
69 return -ENOMEM; in dvb_usb_adapter_init()
74 if (adap->props.size_of_priv > 0) { in dvb_usb_adapter_init()
75 adap->priv = kzalloc(adap->props.size_of_priv, GFP_KERNEL); in dvb_usb_adapter_init()
76 if (adap->priv == NULL) { in dvb_usb_adapter_init()
77 err("no memory for priv for adapter %d.", n); in dvb_usb_adapter_init()
78 return -ENOMEM; in dvb_usb_adapter_init()
95 if (adap->fe_adap[1].fe) in dvb_usb_adapter_init()
96 adap->dvb_adap.mfe_shared = 1; in dvb_usb_adapter_init()
98 d->num_adapters_initialized++; in dvb_usb_adapter_init()
99 d->state |= DVB_USB_STATE_DVB; in dvb_usb_adapter_init()
106 if (d->props.generic_bulk_ctrl_endpoint != 0) { in dvb_usb_adapter_init()
107 usb_clear_halt(d->udev, usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint)); in dvb_usb_adapter_init()
108 usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint)); in dvb_usb_adapter_init()
120 static int dvb_usb_adapter_exit(struct dvb_usb_device *d) in dvb_usb_adapter_exit() argument
124 for (n = 0; n < d->num_adapters_initialized; n++) { in dvb_usb_adapter_exit()
125 dvb_usb_adapter_frontend_exit(&d->adapter[n]); in dvb_usb_adapter_exit()
126 dvb_usb_adapter_dvb_exit(&d->adapter[n]); in dvb_usb_adapter_exit()
127 dvb_usb_adapter_stream_exit(&d->adapter[n]); in dvb_usb_adapter_exit()
128 kfree(d->adapter[n].priv); in dvb_usb_adapter_exit()
130 d->num_adapters_initialized = 0; in dvb_usb_adapter_exit()
131 d->state &= ~DVB_USB_STATE_DVB; in dvb_usb_adapter_exit()
137 static int dvb_usb_exit(struct dvb_usb_device *d) in dvb_usb_exit() argument
139 deb_info("state before exiting everything: %x\n", d->state); in dvb_usb_exit()
140 dvb_usb_remote_exit(d); in dvb_usb_exit()
141 dvb_usb_adapter_exit(d); in dvb_usb_exit()
142 dvb_usb_i2c_exit(d); in dvb_usb_exit()
143 deb_info("state should be zero now: %x\n", d->state); in dvb_usb_exit()
144 d->state = DVB_USB_STATE_INIT; in dvb_usb_exit()
146 if (d->priv != NULL && d->props.priv_destroy != NULL) in dvb_usb_exit()
147 d->props.priv_destroy(d); in dvb_usb_exit()
149 kfree(d->priv); in dvb_usb_exit()
150 kfree(d); in dvb_usb_exit()
154 static int dvb_usb_init(struct dvb_usb_device *d, short *adapter_nums) in dvb_usb_init() argument
158 mutex_init(&d->data_mutex); in dvb_usb_init()
159 mutex_init(&d->usb_mutex); in dvb_usb_init()
160 mutex_init(&d->i2c_mutex); in dvb_usb_init()
162 d->state = DVB_USB_STATE_INIT; in dvb_usb_init()
164 if (d->props.size_of_priv > 0) { in dvb_usb_init()
165 d->priv = kzalloc(d->props.size_of_priv, GFP_KERNEL); in dvb_usb_init()
166 if (d->priv == NULL) { in dvb_usb_init()
168 return -ENOMEM; in dvb_usb_init()
171 if (d->props.priv_init != NULL) { in dvb_usb_init()
172 ret = d->props.priv_init(d); in dvb_usb_init()
179 dvb_usb_device_power_ctrl(d, 1); in dvb_usb_init()
181 ret = dvb_usb_i2c_init(d); in dvb_usb_init()
184 ret = dvb_usb_adapter_init(d, adapter_nums); in dvb_usb_init()
188 if ((ret = dvb_usb_remote_init(d))) in dvb_usb_init()
191 dvb_usb_device_power_ctrl(d, 0); in dvb_usb_init()
196 dvb_usb_adapter_exit(d); in dvb_usb_init()
197 dvb_usb_i2c_exit(d); in dvb_usb_init()
199 if (d->priv && d->props.priv_destroy) in dvb_usb_init()
200 d->props.priv_destroy(d); in dvb_usb_init()
202 kfree(d->priv); in dvb_usb_init()
203 d->priv = NULL; in dvb_usb_init()
213 *cold = -1; in dvb_usb_find_device()
215 for (i = 0; i < props->num_device_descs; i++) { in dvb_usb_find_device()
217 for (j = 0; j < DVB_USB_ID_MAX_NUM && props->devices[i].cold_ids[j] != NULL; j++) { in dvb_usb_find_device()
218 …deb_info("check for cold %x %x\n", props->devices[i].cold_ids[j]->idVendor, props->devices[i].cold… in dvb_usb_find_device()
219 if (props->devices[i].cold_ids[j]->idVendor == le16_to_cpu(udev->descriptor.idVendor) && in dvb_usb_find_device()
220 props->devices[i].cold_ids[j]->idProduct == le16_to_cpu(udev->descriptor.idProduct)) { in dvb_usb_find_device()
222 desc = &props->devices[i]; in dvb_usb_find_device()
230 for (j = 0; j < DVB_USB_ID_MAX_NUM && props->devices[i].warm_ids[j] != NULL; j++) { in dvb_usb_find_device()
231 …deb_info("check for warm %x %x\n", props->devices[i].warm_ids[j]->idVendor, props->devices[i].warm… in dvb_usb_find_device()
232 if (props->devices[i].warm_ids[j]->idVendor == le16_to_cpu(udev->descriptor.idVendor) && in dvb_usb_find_device()
233 props->devices[i].warm_ids[j]->idProduct == le16_to_cpu(udev->descriptor.idProduct)) { in dvb_usb_find_device()
235 desc = &props->devices[i]; in dvb_usb_find_device()
241 if (desc != NULL && props->identify_state != NULL) in dvb_usb_find_device()
242 props->identify_state(udev, props, &desc, cold); in dvb_usb_find_device()
247 int dvb_usb_device_power_ctrl(struct dvb_usb_device *d, int onoff) in dvb_usb_device_power_ctrl() argument
250 d->powered++; in dvb_usb_device_power_ctrl()
252 d->powered--; in dvb_usb_device_power_ctrl()
254 …if (d->powered == 0 || (onoff && d->powered == 1)) { /* when switching from 1 to 0 or from 0 to 1 … in dvb_usb_device_power_ctrl()
255 deb_info("power control: %d\n", onoff); in dvb_usb_device_power_ctrl()
256 if (d->props.power_ctrl) in dvb_usb_device_power_ctrl()
257 return d->props.power_ctrl(d, onoff); in dvb_usb_device_power_ctrl()
271 struct dvb_usb_device *d = NULL; in dvb_usb_device_init() local
274 int ret = -ENOMEM, cold = 0; in dvb_usb_device_init()
279 d = kzalloc(sizeof(*d), GFP_KERNEL); in dvb_usb_device_init()
280 if (!d) { in dvb_usb_device_init()
282 return -ENOMEM; in dvb_usb_device_init()
285 memcpy(&d->props, props, sizeof(struct dvb_usb_device_properties)); in dvb_usb_device_init()
287 desc = dvb_usb_find_device(udev, &d->props, &cold); in dvb_usb_device_init()
289 …deb_err("something went very wrong, device was not found in current device list - let's see what c… in dvb_usb_device_init()
290 ret = -ENODEV; in dvb_usb_device_init()
295 info("found a '%s' in cold state, will try to load a firmware", desc->name); in dvb_usb_device_init()
297 if (!props->no_reconnect || ret != 0) in dvb_usb_device_init()
301 info("found a '%s' in warm state.", desc->name); in dvb_usb_device_init()
302 d->udev = udev; in dvb_usb_device_init()
303 d->desc = desc; in dvb_usb_device_init()
304 d->owner = owner; in dvb_usb_device_init()
306 usb_set_intfdata(intf, d); in dvb_usb_device_init()
308 ret = dvb_usb_init(d, adapter_nums); in dvb_usb_device_init()
310 info("%s error while loading driver (%d)", desc->name, ret); in dvb_usb_device_init()
315 *du = d; in dvb_usb_device_init()
317 info("%s successfully initialized and connected.", desc->name); in dvb_usb_device_init()
322 kfree(d); in dvb_usb_device_init()
329 struct dvb_usb_device *d = usb_get_intfdata(intf); in dvb_usb_device_exit() local
330 const char *default_name = "generic DVB-USB module"; in dvb_usb_device_exit()
334 if (d != NULL && d->desc != NULL) { in dvb_usb_device_exit()
335 strscpy(name, d->desc->name, sizeof(name)); in dvb_usb_device_exit()
336 dvb_usb_exit(d); in dvb_usb_device_exit()