Update ChromeOS CEC EC driver to the new notifier API. Signed-off-by: Dariusz Marcinkiewicz <darekm@xxxxxxxxxx> --- .../media/platform/cros-ec-cec/cros-ec-cec.c | 70 ++++++++++++------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/drivers/media/platform/cros-ec-cec/cros-ec-cec.c b/drivers/media/platform/cros-ec-cec/cros-ec-cec.c index 068df9888dbf0..d74795836e5c8 100644 --- a/drivers/media/platform/cros-ec-cec/cros-ec-cec.c +++ b/drivers/media/platform/cros-ec-cec/cros-ec-cec.c @@ -217,8 +217,9 @@ static const struct cec_dmi_match cec_dmi_match_table[] = { { "Google", "Fizz", "0000:00:02.0", "Port B" }, }; -static int cros_ec_cec_get_notifier(struct device *dev, - struct cec_notifier **notify) +static int cros_ec_cec_get_hdmi_dev(struct device *dev, + struct device **hdmi_dev, + const char **conn_name) { int i; @@ -227,16 +228,13 @@ static int cros_ec_cec_get_notifier(struct device *dev, if (dmi_match(DMI_SYS_VENDOR, m->sys_vendor) && dmi_match(DMI_PRODUCT_NAME, m->product_name)) { - struct device *d; - /* Find the device, bail out if not yet registered */ - d = bus_find_device_by_name(&pci_bus_type, NULL, - m->devname); - if (!d) + *hdmi_dev = bus_find_device_by_name(&pci_bus_type, NULL, + m->devname); + if (*hdmi_dev == NULL) return -EPROBE_DEFER; - *notify = cec_notifier_get_conn(d, m->conn); - put_device(d); + *conn_name = m->conn; return 0; } } @@ -249,8 +247,9 @@ static int cros_ec_cec_get_notifier(struct device *dev, #else -static int cros_ec_cec_get_notifier(struct device *dev, - struct cec_notifier **notify) +static int cros_ec_cec_get_hdmi_dev(struct device *dev, + struct cec_notifier **hdmi_dev, + const char **conn_name) { return -ENODEV; } @@ -262,6 +261,8 @@ static int cros_ec_cec_probe(struct platform_device *pdev) struct cros_ec_dev *ec_dev = dev_get_drvdata(pdev->dev.parent); struct cros_ec_device *cros_ec = ec_dev->ec_dev; struct cros_ec_cec *cros_ec_cec; + struct device *hdmi_dev; + const char *conn_name; int ret; cros_ec_cec = devm_kzalloc(&pdev->dev, sizeof(*cros_ec_cec), @@ -272,20 +273,33 @@ static int cros_ec_cec_probe(struct platform_device *pdev) platform_set_drvdata(pdev, cros_ec_cec); cros_ec_cec->cros_ec = cros_ec; - ret = cros_ec_cec_get_notifier(&pdev->dev, &cros_ec_cec->notify); + ret = cros_ec_cec_get_hdmi_dev(&pdev->dev, &hdmi_dev, &conn_name); if (ret) return ret; ret = device_init_wakeup(&pdev->dev, 1); if (ret) { dev_err(&pdev->dev, "failed to initialize wakeup\n"); - return ret; + goto err_put_hdmi_dev; } cros_ec_cec->adap = cec_allocate_adapter(&cros_ec_cec_ops, cros_ec_cec, - DRV_NAME, CEC_CAP_DEFAULTS, 1); - if (IS_ERR(cros_ec_cec->adap)) - return PTR_ERR(cros_ec_cec->adap); + DRV_NAME, + CEC_CAP_DEFAULTS | + CEC_CAP_CONNECTOR_INFO, 1); + if (IS_ERR(cros_ec_cec->adap)) { + ret = PTR_ERR(cros_ec_cec->adap); + goto err_put_hdmi_dev; + } + + cros_ec_cec->notify = + cec_notifier_cec_adap_register(hdmi_dev, conn_name, + cros_ec_cec->adap); + if (!cros_ec_cec->notify) { + ret = -ENOMEM; + goto err_adap_del; + } + /* Get CEC events from the EC. */ cros_ec_cec->notifier.notifier_call = cros_ec_cec_event; @@ -293,19 +307,25 @@ static int cros_ec_cec_probe(struct platform_device *pdev) &cros_ec_cec->notifier); if (ret) { dev_err(&pdev->dev, "failed to register notifier\n"); - cec_delete_adapter(cros_ec_cec->adap); - return ret; + goto err_notifier_adap_unreg; } ret = cec_register_adapter(cros_ec_cec->adap, &pdev->dev); - if (ret < 0) { - cec_delete_adapter(cros_ec_cec->adap); - return ret; - } + if (ret < 0) + goto err_notifier_adap_unreg; - cec_register_cec_notifier(cros_ec_cec->adap, cros_ec_cec->notify); + put_device(hdmi_dev); return 0; + +err_notifier_adap_unreg: + cec_notifier_cec_adap_unregister(cros_ec_cec->notify); +err_adap_del: + cec_delete_adapter(cros_ec_cec->adap); +err_put_hdmi_dev: + put_device(hdmi_dev); + + return ret; } static int cros_ec_cec_remove(struct platform_device *pdev) @@ -324,9 +344,7 @@ static int cros_ec_cec_remove(struct platform_device *pdev) } cec_unregister_adapter(cros_ec_cec->adap); - - if (cros_ec_cec->notify) - cec_notifier_put(cros_ec_cec->notify); + cec_notifier_cec_adap_unregister(cros_ec_cec->notify); return 0; } -- 2.18.1