Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] dvb-usb: create one media_dev per adapter

Instead of assuming just one adapter, change the code to store
one media controller per adapter.

This works fine for dvb-usb, as, on all drivers here, it is not
possible to write a media graph that would mix resources between
the two different adapters.

Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>

+12 -20
+12 -16
drivers/media/usb/dvb-usb/dvb-usb-dvb.c
··· 94 94 return dvb_usb_ctrl_feed(dvbdmxfeed,0); 95 95 } 96 96 97 - static void dvb_usb_media_device_register(struct dvb_usb_device *d) 97 + static void dvb_usb_media_device_register(struct dvb_usb_adapter *adap) 98 98 { 99 99 #ifdef CONFIG_MEDIA_CONTROLLER_DVB 100 - 101 100 struct media_device *mdev; 101 + struct dvb_usb_device *d = adap->dev; 102 102 struct usb_device *udev = d->udev; 103 103 int ret; 104 104 ··· 122 122 kfree(mdev); 123 123 return; 124 124 } 125 - 126 - d->media_dev = mdev; 125 + adap->dvb_adap.mdev = mdev; 127 126 128 127 dev_info(&d->udev->dev, "media controller created\n"); 129 - 130 128 #endif 131 129 } 132 130 133 - static void dvb_usb_media_device_unregister(struct dvb_usb_device *d) 131 + static void dvb_usb_media_device_unregister(struct dvb_usb_adapter *adap) 134 132 { 135 133 #ifdef CONFIG_MEDIA_CONTROLLER_DVB 136 - if (!d->media_dev) 134 + if (!adap->dvb_adap.mdev) 137 135 return; 138 136 139 - media_device_unregister(d->media_dev); 140 - kfree(d->media_dev); 141 - d->media_dev = NULL; 142 - 137 + media_device_unregister(adap->dvb_adap.mdev); 138 + kfree(adap->dvb_adap.mdev); 139 + adap->dvb_adap.mdev = NULL; 143 140 #endif 144 141 } 145 142 ··· 154 157 adap->dvb_adap.priv = adap; 155 158 156 159 #ifdef CONFIG_MEDIA_CONTROLLER_DVB 157 - dvb_usb_media_device_register(adap->dev); 158 - adap->dvb_adap.mdev = adap->dev->media_dev; 160 + dvb_usb_media_device_register(adap); 159 161 #endif 160 162 161 163 if (adap->dev->props.read_mac_address) { ··· 204 208 err_dmx_dev: 205 209 dvb_dmx_release(&adap->demux); 206 210 err_dmx: 207 - dvb_usb_media_device_unregister(adap->dev); 211 + dvb_usb_media_device_unregister(adap); 208 212 dvb_unregister_adapter(&adap->dvb_adap); 209 213 err: 210 214 return ret; ··· 218 222 adap->demux.dmx.close(&adap->demux.dmx); 219 223 dvb_dmxdev_release(&adap->dmxdev); 220 224 dvb_dmx_release(&adap->demux); 221 - dvb_usb_media_device_unregister(adap->dev); 225 + dvb_usb_media_device_unregister(adap); 222 226 dvb_unregister_adapter(&adap->dvb_adap); 223 227 adap->state &= ~DVB_USB_ADAP_STATE_DVB; 224 228 } ··· 320 324 adap->num_frontends_initialized++; 321 325 } 322 326 323 - dvb_create_media_graph(adap->dev->media_dev); 327 + dvb_create_media_graph(adap->dvb_adap.mdev); 324 328 325 329 return 0; 326 330 }
-4
drivers/media/usb/dvb-usb/dvb-usb.h
··· 453 453 struct module *owner; 454 454 455 455 void *priv; 456 - 457 - #ifdef CONFIG_MEDIA_CONTROLLER_DVB 458 - struct media_device *media_dev; 459 - #endif 460 456 }; 461 457 462 458 extern int dvb_usb_device_init(struct usb_interface *,