static int timbradio_probe(struct platform_device *pdev) #endif { struct timb_radio_platform_data *pdata = pdev->dev.platform_data; struct timbradio *tr; int err; if (!pdata) { dev_err(&pdev->dev, "Platform data missing\n"); err = -EINVAL; goto err; } tr = kzalloc(sizeof(*tr), GFP_KERNEL); if (!tr) { err = -ENOMEM; goto err; } tr->pdata = *pdata; mutex_init(&tr->lock); strlcpy(tr->video_dev.name, "Timberdale Radio", sizeof(tr->video_dev.name)); tr->video_dev.fops = &timbradio_fops; tr->video_dev.ioctl_ops = &timbradio_ioctl_ops; tr->video_dev.release = video_device_release_empty; tr->video_dev.minor = -1; tr->video_dev.lock = &tr->lock; strlcpy(tr->v4l2_dev.name, DRIVER_NAME, sizeof(tr->v4l2_dev.name)); err = v4l2_device_register(NULL, &tr->v4l2_dev); if (err) goto err_v4l2_dev; tr->video_dev.v4l2_dev = &tr->v4l2_dev; err = video_register_device(&tr->video_dev, VFL_TYPE_RADIO, -1); if (err) { dev_err(&pdev->dev, "Error reg video\n"); goto err_video_req; } video_set_drvdata(&tr->video_dev, tr); platform_set_drvdata(pdev, tr); return 0; err_video_req: video_device_release_empty(&tr->video_dev); v4l2_device_unregister(&tr->v4l2_dev); err_v4l2_dev: kfree(tr); err: dev_err(&pdev->dev, "Failed to register: %d\n", err); return err; }
static int timbradio_remove(struct platform_device *pdev) { struct timbradio *tr = platform_get_drvdata(pdev); video_unregister_device(&tr->video_dev); video_device_release_empty(&tr->video_dev); v4l2_device_unregister(&tr->v4l2_dev); return 0; }