On Mon, May 04, 2015 at 07:32:59PM +0200, Kamil Debski wrote:
> From: Hans Verkuil <hansverk at cisco.com>
> 
> The added HDMI CEC framework provides a generic kernel interface for
> HDMI CEC devices.
> 
> Signed-off-by: Hans Verkuil <hansverk at cisco.com>

-snip-

> +int cec_create_adapter(struct cec_adapter *adap, const char *name, u32 caps)
> +{
> +     int res = 0;
> +
> +     adap->state = CEC_ADAP_STATE_DISABLED;
> +     adap->name = name;
> +     adap->phys_addr = 0xffff;
> +     adap->capabilities = caps;
> +     adap->version = CEC_VERSION_1_4;
> +     adap->sequence = 0;
> +     mutex_init(&adap->lock);
> +     adap->kthread = kthread_run(cec_thread_func, adap, name);
> +     init_waitqueue_head(&adap->kthread_waitq);
> +     init_waitqueue_head(&adap->waitq);
> +     if (IS_ERR(adap->kthread)) {
> +             pr_err("cec-%s: kernel_thread() failed\n", name);
> +             return PTR_ERR(adap->kthread);
> +     }
> +     if (caps) {
> +             res = cec_devnode_register(&adap->devnode, adap->owner);
> +             if (res)
> +                     kthread_stop(adap->kthread);
> +     }
> +     adap->recv_notifier = cec_receive_notify;
> +
> +     /* Prepare the RC input device */
> +     adap->rc = rc_allocate_device();
> +     if (!adap->rc) {
> +             pr_err("cec-%s: failed to allocate memory for rc_dev\n", name);
> +             cec_devnode_unregister(&adap->devnode);
> +             kthread_stop(adap->kthread);
> +             return -ENOMEM;
> +     }
> +
> +     snprintf(adap->input_name, sizeof(adap->input_name), "RC for %s", name);
> +     snprintf(adap->input_phys, sizeof(adap->input_phys), "%s/input0", name);
> +     strncpy(adap->input_drv, name, sizeof(adap->input_drv));
> +
> +     adap->rc->input_name = adap->input_name;
> +     adap->rc->input_phys = adap->input_phys;
> +     adap->rc->dev.parent = &adap->devnode.dev;
> +     adap->rc->driver_name = adap->input_drv;
> +     adap->rc->driver_type = RC_DRIVER_CEC;
> +     adap->rc->allowed_protocols = RC_BIT_CEC;
> +     adap->rc->priv = adap;
> +     adap->rc->map_name = RC_MAP_CEC;
> +     adap->rc->timeout = MS_TO_NS(100);
> +

rc->input_id is not populated. It would be nice if input_phys has some 
resemblance to a physical path (like the output of usb_make_path() if it
is a usb device).

> +     res = rc_register_device(adap->rc);
> +
> +     if (res) {
> +             pr_err("cec-%s: failed to prepare input device\n", name);
> +             cec_devnode_unregister(&adap->devnode);
> +             rc_free_device(adap->rc);
> +             kthread_stop(adap->kthread);
> +     }
> +
> +     return res;
> +}
> +EXPORT_SYMBOL_GPL(cec_create_adapter);
> +
> +void cec_delete_adapter(struct cec_adapter *adap)
> +{
> +     if (adap->kthread == NULL)
> +             return;
> +     kthread_stop(adap->kthread);
> +     if (adap->kthread_config)
> +             kthread_stop(adap->kthread_config);
> +     adap->state = CEC_ADAP_STATE_DISABLED;
> +     if (cec_devnode_is_registered(&adap->devnode))
> +             cec_devnode_unregister(&adap->devnode);

I think you're missing a rc_unregister_device() here.

> +}
> +EXPORT_SYMBOL_GPL(cec_delete_adapter);


Sean

Reply via email to