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

[media] siano: register media controller earlier

We need to initialize the media controller earlier, as the core
will call the smsdvb hotplug during register time. Ok, this is
an async operation, so, when the module is not loaded, the media
controller works.

However, if the module is already loaded, nothing will be
registered at the media controller, as it will load too late.

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

+22 -11
+6 -1
drivers/media/common/siano/smscoreapi.c
··· 653 653 * @return 0 on success, <0 on error. 654 654 */ 655 655 int smscore_register_device(struct smsdevice_params_t *params, 656 - struct smscore_device_t **coredev) 656 + struct smscore_device_t **coredev, 657 + void *mdev) 657 658 { 658 659 struct smscore_device_t *dev; 659 660 u8 *buffer; ··· 662 661 dev = kzalloc(sizeof(struct smscore_device_t), GFP_KERNEL); 663 662 if (!dev) 664 663 return -ENOMEM; 664 + 665 + #ifdef CONFIG_MEDIA_CONTROLLER_DVB 666 + dev->media_dev = mdev; 667 + #endif 665 668 666 669 /* init list entry so it could be safe in smscore_unregister_device */ 667 670 INIT_LIST_HEAD(&dev->entry);
+2 -1
drivers/media/common/siano/smscoreapi.h
··· 1123 1123 extern void smscore_unregister_hotplug(hotplug_t hotplug); 1124 1124 1125 1125 extern int smscore_register_device(struct smsdevice_params_t *params, 1126 - struct smscore_device_t **coredev); 1126 + struct smscore_device_t **coredev, 1127 + void *mdev); 1127 1128 extern void smscore_unregister_device(struct smscore_device_t *coredev); 1128 1129 1129 1130 extern int smscore_start_device(struct smscore_device_t *coredev);
+1 -1
drivers/media/mmc/siano/smssdio.c
··· 279 279 goto free; 280 280 } 281 281 282 - ret = smscore_register_device(&params, &smsdev->coredev); 282 + ret = smscore_register_device(&params, &smsdev->coredev, NULL); 283 283 if (ret < 0) 284 284 goto free; 285 285
+13 -8
drivers/media/usb/siano/smsusb.c
··· 340 340 usb_set_intfdata(intf, NULL); 341 341 } 342 342 343 - static void siano_media_device_register(struct smsusb_device_t *dev) 343 + static void *siano_media_device_register(struct smsusb_device_t *dev, 344 + int board_id) 344 345 { 345 346 #ifdef CONFIG_MEDIA_CONTROLLER_DVB 346 347 struct media_device *mdev; 347 348 struct usb_device *udev = dev->udev; 348 - int board_id = smscore_get_board_id(dev->coredev); 349 349 struct sms_board *board = sms_get_board(board_id); 350 350 int ret; 351 351 352 352 mdev = kzalloc(sizeof(*mdev), GFP_KERNEL); 353 353 if (!mdev) 354 - return; 354 + return NULL; 355 355 356 356 mdev->dev = &udev->dev; 357 357 strlcpy(mdev->model, board->name, sizeof(mdev->model)); ··· 366 366 pr_err("Couldn't create a media device. Error: %d\n", 367 367 ret); 368 368 kfree(mdev); 369 - return; 369 + return NULL; 370 370 } 371 - 372 - dev->coredev->media_dev = mdev; 373 371 374 372 pr_info("media controller created\n"); 375 373 374 + return mdev; 375 + #else 376 + return NULL; 376 377 #endif 377 378 } 378 379 ··· 381 380 { 382 381 struct smsdevice_params_t params; 383 382 struct smsusb_device_t *dev; 383 + void *mdev; 384 384 int i, rc; 385 385 386 386 /* create device object */ ··· 433 431 params.context = dev; 434 432 usb_make_path(dev->udev, params.devpath, sizeof(params.devpath)); 435 433 434 + mdev = siano_media_device_register(dev, board_id); 435 + 436 436 /* register in smscore */ 437 - rc = smscore_register_device(&params, &dev->coredev); 437 + rc = smscore_register_device(&params, &dev->coredev, mdev); 438 438 if (rc < 0) { 439 439 pr_err("smscore_register_device(...) failed, rc %d\n", rc); 440 440 smsusb_term_device(intf); 441 + media_device_unregister(mdev); 442 + kfree(mdev); 441 443 return rc; 442 444 } 443 445 ··· 473 467 } 474 468 475 469 pr_debug("device 0x%p created\n", dev); 476 - siano_media_device_register(dev); 477 470 478 471 return rc; 479 472 }