diff options
Diffstat (limited to 'drivers/media/dvb/dvb-usb/dvb_usb_init.c')
-rw-r--r-- | drivers/media/dvb/dvb-usb/dvb_usb_init.c | 69 |
1 files changed, 33 insertions, 36 deletions
diff --git a/drivers/media/dvb/dvb-usb/dvb_usb_init.c b/drivers/media/dvb/dvb-usb/dvb_usb_init.c index 60011f56cc9..be58b8422a3 100644 --- a/drivers/media/dvb/dvb-usb/dvb_usb_init.c +++ b/drivers/media/dvb/dvb-usb/dvb_usb_init.c | |||
@@ -30,14 +30,14 @@ static int dvb_usbv2_download_firmware(struct dvb_usb_device *d) | |||
30 | const char *name; | 30 | const char *name; |
31 | 31 | ||
32 | /* resolve firmware name */ | 32 | /* resolve firmware name */ |
33 | name = d->props.firmware; | 33 | name = d->props->firmware; |
34 | if (d->props.get_firmware_name) { | 34 | if (d->props->get_firmware_name) { |
35 | ret = d->props.get_firmware_name(d, &name); | 35 | ret = d->props->get_firmware_name(d, &name); |
36 | if (ret < 0) | 36 | if (ret < 0) |
37 | goto err; | 37 | goto err; |
38 | } | 38 | } |
39 | 39 | ||
40 | if (!d->props.download_firmware) { | 40 | if (!d->props->download_firmware) { |
41 | ret = -EINVAL; | 41 | ret = -EINVAL; |
42 | goto err; | 42 | goto err; |
43 | } | 43 | } |
@@ -54,7 +54,7 @@ static int dvb_usbv2_download_firmware(struct dvb_usb_device *d) | |||
54 | pr_info("%s: downloading firmware from file '%s'\n", KBUILD_MODNAME, | 54 | pr_info("%s: downloading firmware from file '%s'\n", KBUILD_MODNAME, |
55 | name); | 55 | name); |
56 | 56 | ||
57 | ret = d->props.download_firmware(d, fw); | 57 | ret = d->props->download_firmware(d, fw); |
58 | 58 | ||
59 | release_firmware(fw); | 59 | release_firmware(fw); |
60 | 60 | ||
@@ -71,13 +71,13 @@ static int dvb_usbv2_i2c_init(struct dvb_usb_device *d) | |||
71 | { | 71 | { |
72 | int ret; | 72 | int ret; |
73 | 73 | ||
74 | if (!d->props.i2c_algo) { | 74 | if (!d->props->i2c_algo) { |
75 | ret = 0; | 75 | ret = 0; |
76 | goto err; | 76 | goto err; |
77 | } | 77 | } |
78 | 78 | ||
79 | strlcpy(d->i2c_adap.name, d->name, sizeof(d->i2c_adap.name)); | 79 | strlcpy(d->i2c_adap.name, d->name, sizeof(d->i2c_adap.name)); |
80 | d->i2c_adap.algo = d->props.i2c_algo; | 80 | d->i2c_adap.algo = d->props->i2c_algo; |
81 | d->i2c_adap.algo_data = NULL; | 81 | d->i2c_adap.algo_data = NULL; |
82 | d->i2c_adap.dev.parent = &d->udev->dev; | 82 | d->i2c_adap.dev.parent = &d->udev->dev; |
83 | 83 | ||
@@ -113,9 +113,9 @@ static int dvb_usbv2_adapter_init(struct dvb_usb_device *d) | |||
113 | int ret, i, adapter_count; | 113 | int ret, i, adapter_count; |
114 | 114 | ||
115 | /* resolve adapter count */ | 115 | /* resolve adapter count */ |
116 | adapter_count = d->props.num_adapters; | 116 | adapter_count = d->props->num_adapters; |
117 | if (d->props.get_adapter_count) { | 117 | if (d->props->get_adapter_count) { |
118 | ret = d->props.get_adapter_count(d); | 118 | ret = d->props->get_adapter_count(d); |
119 | if (ret < 0) | 119 | if (ret < 0) |
120 | goto err; | 120 | goto err; |
121 | 121 | ||
@@ -125,28 +125,26 @@ static int dvb_usbv2_adapter_init(struct dvb_usb_device *d) | |||
125 | for (i = 0; i < adapter_count; i++) { | 125 | for (i = 0; i < adapter_count; i++) { |
126 | adap = &d->adapter[i]; | 126 | adap = &d->adapter[i]; |
127 | adap->dev = d; | 127 | adap->dev = d; |
128 | adap->id = i; | 128 | adap->id = i; |
129 | 129 | adap->props = &d->props->adapter[i]; | |
130 | memcpy(&adap->props, &d->props.adapter[i], | ||
131 | sizeof(struct dvb_usb_adapter_properties)); | ||
132 | 130 | ||
133 | /* speed - when running at FULL speed we need a HW PID filter */ | 131 | /* speed - when running at FULL speed we need a HW PID filter */ |
134 | if (d->udev->speed == USB_SPEED_FULL && | 132 | if (d->udev->speed == USB_SPEED_FULL && |
135 | !(adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER)) { | 133 | !(adap->props->caps & DVB_USB_ADAP_HAS_PID_FILTER)) { |
136 | pr_err("%s: this USB2.0 device cannot be run on a " \ | 134 | pr_err("%s: this USB2.0 device cannot be run on a " \ |
137 | "USB1.1 port (it lacks a hardware " \ | 135 | "USB1.1 port (it lacks a hardware " \ |
138 | "PID filter)\n", KBUILD_MODNAME); | 136 | "PID filter)\n", KBUILD_MODNAME); |
139 | ret = -ENODEV; | 137 | ret = -ENODEV; |
140 | goto err; | 138 | goto err; |
141 | } else if ((d->udev->speed == USB_SPEED_FULL && | 139 | } else if ((d->udev->speed == USB_SPEED_FULL && |
142 | adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER) || | 140 | adap->props->caps & DVB_USB_ADAP_HAS_PID_FILTER) || |
143 | (adap->props.caps & DVB_USB_ADAP_NEED_PID_FILTERING)) { | 141 | (adap->props->caps & DVB_USB_ADAP_NEED_PID_FILTERING)) { |
144 | pr_info("%s: will use the device's hardware PID " \ | 142 | pr_info("%s: will use the device's hardware PID " \ |
145 | "filter (table count: %d)\n", | 143 | "filter (table count: %d)\n", |
146 | KBUILD_MODNAME, | 144 | KBUILD_MODNAME, |
147 | adap->props.pid_filter_count); | 145 | adap->props->pid_filter_count); |
148 | adap->pid_filtering = 1; | 146 | adap->pid_filtering = 1; |
149 | adap->max_feed_count = adap->props.pid_filter_count; | 147 | adap->max_feed_count = adap->props->pid_filter_count; |
150 | } else { | 148 | } else { |
151 | pr_info("%s: will pass the complete MPEG2 transport " \ | 149 | pr_info("%s: will pass the complete MPEG2 transport " \ |
152 | "stream to the software demuxer\n", | 150 | "stream to the software demuxer\n", |
@@ -156,11 +154,11 @@ static int dvb_usbv2_adapter_init(struct dvb_usb_device *d) | |||
156 | } | 154 | } |
157 | 155 | ||
158 | if (!adap->pid_filtering && dvb_usb_force_pid_filter_usage && | 156 | if (!adap->pid_filtering && dvb_usb_force_pid_filter_usage && |
159 | adap->props.caps & DVB_USB_ADAP_HAS_PID_FILTER) { | 157 | adap->props->caps & DVB_USB_ADAP_HAS_PID_FILTER) { |
160 | pr_info("%s: pid filter enabled by module option\n", | 158 | pr_info("%s: pid filter enabled by module option\n", |
161 | KBUILD_MODNAME); | 159 | KBUILD_MODNAME); |
162 | adap->pid_filtering = 1; | 160 | adap->pid_filtering = 1; |
163 | adap->max_feed_count = adap->props.pid_filter_count; | 161 | adap->max_feed_count = adap->props->pid_filter_count; |
164 | } | 162 | } |
165 | 163 | ||
166 | ret = dvb_usbv2_adapter_stream_init(adap); | 164 | ret = dvb_usbv2_adapter_stream_init(adap); |
@@ -229,8 +227,8 @@ static int dvb_usbv2_init(struct dvb_usb_device *d) | |||
229 | /* check the capabilities and set appropriate variables */ | 227 | /* check the capabilities and set appropriate variables */ |
230 | dvb_usbv2_device_power_ctrl(d, 1); | 228 | dvb_usbv2_device_power_ctrl(d, 1); |
231 | 229 | ||
232 | if (d->props.read_config) { | 230 | if (d->props->read_config) { |
233 | ret = d->props.read_config(d); | 231 | ret = d->props->read_config(d); |
234 | if (ret < 0) | 232 | if (ret < 0) |
235 | goto err; | 233 | goto err; |
236 | } | 234 | } |
@@ -243,8 +241,8 @@ static int dvb_usbv2_init(struct dvb_usb_device *d) | |||
243 | if (ret < 0) | 241 | if (ret < 0) |
244 | goto err; | 242 | goto err; |
245 | 243 | ||
246 | if (d->props.init) { | 244 | if (d->props->init) { |
247 | ret = d->props.init(d); | 245 | ret = d->props->init(d); |
248 | if (ret < 0) | 246 | if (ret < 0) |
249 | goto err; | 247 | goto err; |
250 | } | 248 | } |
@@ -274,8 +272,8 @@ int dvb_usbv2_device_power_ctrl(struct dvb_usb_device *d, int onoff) | |||
274 | if (d->powered == 0 || (onoff && d->powered == 1)) { | 272 | if (d->powered == 0 || (onoff && d->powered == 1)) { |
275 | /* when switching from 1 to 0 or from 0 to 1 */ | 273 | /* when switching from 1 to 0 or from 0 to 1 */ |
276 | pr_debug("%s: power control=%d\n", __func__, onoff); | 274 | pr_debug("%s: power control=%d\n", __func__, onoff); |
277 | if (d->props.power_ctrl) { | 275 | if (d->props->power_ctrl) { |
278 | ret = d->props.power_ctrl(d, onoff); | 276 | ret = d->props->power_ctrl(d, onoff); |
279 | goto err; | 277 | goto err; |
280 | } | 278 | } |
281 | } | 279 | } |
@@ -304,8 +302,8 @@ static void dvb_usbv2_init_work(struct work_struct *work) | |||
304 | 302 | ||
305 | pr_debug("%s: work_pid=%d\n", __func__, d->work_pid); | 303 | pr_debug("%s: work_pid=%d\n", __func__, d->work_pid); |
306 | 304 | ||
307 | if (d->props.size_of_priv) { | 305 | if (d->props->size_of_priv) { |
308 | d->priv = kzalloc(d->props.size_of_priv, GFP_KERNEL); | 306 | d->priv = kzalloc(d->props->size_of_priv, GFP_KERNEL); |
309 | if (!d->priv) { | 307 | if (!d->priv) { |
310 | pr_err("%s: kzalloc() failed\n", KBUILD_MODNAME); | 308 | pr_err("%s: kzalloc() failed\n", KBUILD_MODNAME); |
311 | ret = -ENOMEM; | 309 | ret = -ENOMEM; |
@@ -313,8 +311,8 @@ static void dvb_usbv2_init_work(struct work_struct *work) | |||
313 | } | 311 | } |
314 | } | 312 | } |
315 | 313 | ||
316 | if (d->props.identify_state) { | 314 | if (d->props->identify_state) { |
317 | ret = d->props.identify_state(d); | 315 | ret = d->props->identify_state(d); |
318 | if (ret == 0) { | 316 | if (ret == 0) { |
319 | ; | 317 | ; |
320 | } else if (ret == COLD) { | 318 | } else if (ret == COLD) { |
@@ -388,11 +386,10 @@ int dvb_usbv2_probe(struct usb_interface *intf, | |||
388 | d->rc_map = driver_info->rc_map; | 386 | d->rc_map = driver_info->rc_map; |
389 | d->udev = interface_to_usbdev(intf); | 387 | d->udev = interface_to_usbdev(intf); |
390 | d->intf = intf; | 388 | d->intf = intf; |
391 | memcpy(&d->props, driver_info->props, | 389 | d->props = driver_info->props; |
392 | sizeof(struct dvb_usb_device_properties)); | ||
393 | 390 | ||
394 | if (d->intf->cur_altsetting->desc.bInterfaceNumber != | 391 | if (d->intf->cur_altsetting->desc.bInterfaceNumber != |
395 | d->props.bInterfaceNumber) { | 392 | d->props->bInterfaceNumber) { |
396 | ret = -ENODEV; | 393 | ret = -ENODEV; |
397 | goto err_kfree; | 394 | goto err_kfree; |
398 | } | 395 | } |
@@ -428,8 +425,8 @@ void dvb_usbv2_disconnect(struct usb_interface *intf) | |||
428 | if (d->work_pid != current->pid) | 425 | if (d->work_pid != current->pid) |
429 | cancel_work_sync(&d->probe_work); | 426 | cancel_work_sync(&d->probe_work); |
430 | 427 | ||
431 | if (d->props.disconnect) | 428 | if (d->props->disconnect) |
432 | d->props.disconnect(d); | 429 | d->props->disconnect(d); |
433 | 430 | ||
434 | name = d->name; | 431 | name = d->name; |
435 | dvb_usbv2_exit(d); | 432 | dvb_usbv2_exit(d); |