From mboxrd@z Thu Jan 1 00:00:00 1970 From: laurent.pinchart@ideasonboard.com (Laurent Pinchart) Date: Wed, 02 Aug 2017 01:32:40 +0300 Subject: [PATCH v2 3/4] drm/bridge: dw-hdmi: add cec driver In-Reply-To: References: <20170731142906.GX31807@n2100.armlinux.org.uk> Message-ID: <1884159.hmXKyeR78T@avalon> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Russell, Thank you for the patch. On Monday 31 Jul 2017 15:29:51 Russell King wrote: > Add a CEC driver for the dw-hdmi hardware. > > Reviewed-by: Neil Armstrong > Signed-off-by: Russell King > --- > drivers/gpu/drm/bridge/synopsys/Kconfig | 9 + > drivers/gpu/drm/bridge/synopsys/Makefile | 1 + > drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c | 326 +++++++++++++++++++++++ > drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.h | 19 ++ > drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 42 +++- > drivers/gpu/drm/bridge/synopsys/dw-hdmi.h | 1 + > 6 files changed, 397 insertions(+), 1 deletion(-) > create mode 100644 drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c > create mode 100644 drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.h [snip] > diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c > b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c new file mode 100644 > index 000000000000..52c9d93b9602 > --- /dev/null > +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c [snip] > +static int dw_hdmi_cec_probe(struct platform_device *pdev) > +{ > + struct dw_hdmi_cec_data *data = dev_get_platdata(&pdev->dev); > + struct dw_hdmi_cec *cec; > + int ret; > + > + if (!data) > + return -ENXIO; > + > + /* > + * Our device is just a convenience - we want to link to the real > + * hardware device here, so that userspace can see the association > + * between the HDMI hardware and its associated CEC chardev. > + */ > + cec = devm_kzalloc(&pdev->dev, sizeof(*cec), GFP_KERNEL); > + if (!cec) > + return -ENOMEM; > + > + cec->irq = data->irq; > + cec->ops = data->ops; > + cec->hdmi = data->hdmi; > + > + platform_set_drvdata(pdev, cec); > + > + dw_hdmi_write(cec, 0, HDMI_CEC_TX_CNT); > + dw_hdmi_write(cec, ~0, HDMI_CEC_MASK); > + dw_hdmi_write(cec, ~0, HDMI_IH_MUTE_CEC_STAT0); > + dw_hdmi_write(cec, 0, HDMI_CEC_POLARITY); > + > + cec->adap = cec_allocate_adapter(&dw_hdmi_cec_ops, cec, "dw_hdmi", > + CEC_CAP_LOG_ADDRS | CEC_CAP_TRANSMIT | > + CEC_CAP_RC, CEC_MAX_LOG_ADDRS); > + if (IS_ERR(cec->adap)) > + return PTR_ERR(cec->adap); > + > + /* override the module pointer */ > + cec->adap->owner = THIS_MODULE; > + > + ret = devm_add_action(&pdev->dev, dw_hdmi_cec_del, cec); > + if (ret) { > + cec_delete_adapter(cec->adap); > + return ret; > + } > + > + ret = devm_request_threaded_irq(&pdev->dev, cec->irq, > + dw_hdmi_cec_hardirq, > + dw_hdmi_cec_thread, IRQF_SHARED, > + "dw-hdmi-cec", cec->adap); > + if (ret < 0) > + return ret; > + > + cec->notify = cec_notifier_get(pdev->dev.parent); > + if (!cec->notify) > + return -ENOMEM; > + > + ret = cec_register_adapter(cec->adap, pdev->dev.parent); > + if (ret < 0) { > + cec_notifier_put(cec->notify); > + return ret; > + } > + > + /* > + * CEC documentation says we must not call cec_delete_adapter > + * after a successful call to cec_register_adapter(). > + */ > + devm_remove_action(&pdev->dev, dw_hdmi_cec_del, cec); dw_hdmi_cec_del() is only used to clean up in the error path of the probe function. It would be simpler and less resource-consuming to add an error label to this function instead of using devm. > + > + cec_register_cec_notifier(cec->adap, cec->notify); > + > + return 0; > +} > + > +static int dw_hdmi_cec_remove(struct platform_device *pdev) > +{ > + struct dw_hdmi_cec *cec = platform_get_drvdata(pdev); > + > + cec_unregister_adapter(cec->adap); > + cec_notifier_put(cec->notify); > + > + return 0; > +} > + > +static struct platform_driver dw_hdmi_cec_driver = { > + .probe = dw_hdmi_cec_probe, > + .remove = dw_hdmi_cec_remove, > + .driver = { > + .name = "dw-hdmi-cec", > + }, > +}; > +module_platform_driver(dw_hdmi_cec_driver); Is there a particular reason why this has to be a separate module instead of simply calling the CEC init/cleanup functions directly from the main dw-hdmi driver ? > +MODULE_AUTHOR("Russell King "); > +MODULE_DESCRIPTION("Synopsys Designware HDMI CEC driver for i.MX"); > +MODULE_LICENSE("GPL"); > +MODULE_ALIAS(PLATFORM_MODULE_PREFIX "dw-hdmi-cec"); -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v2 3/4] drm/bridge: dw-hdmi: add cec driver Date: Wed, 02 Aug 2017 01:32:40 +0300 Message-ID: <1884159.hmXKyeR78T@avalon> References: <20170731142906.GX31807@n2100.armlinux.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from galahad.ideasonboard.com (galahad.ideasonboard.com [185.26.127.97]) by gabe.freedesktop.org (Postfix) with ESMTPS id EEC4A6EED7 for ; Tue, 1 Aug 2017 22:32:28 +0000 (UTC) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: Hans Verkuil , Russell King , linux-arm-kernel@lists.infradead.org List-Id: dri-devel@lists.freedesktop.org SGkgUnVzc2VsbCwKClRoYW5rIHlvdSBmb3IgdGhlIHBhdGNoLgoKT24gTW9uZGF5IDMxIEp1bCAy MDE3IDE1OjI5OjUxIFJ1c3NlbGwgS2luZyB3cm90ZToKPiBBZGQgYSBDRUMgZHJpdmVyIGZvciB0 aGUgZHctaGRtaSBoYXJkd2FyZS4KPiAKPiBSZXZpZXdlZC1ieTogTmVpbCBBcm1zdHJvbmcgPG5h cm1zdHJvbmdAYmF5bGlicmUuY29tPgo+IFNpZ25lZC1vZmYtYnk6IFJ1c3NlbGwgS2luZyA8cm1r K2tlcm5lbEBhcm1saW51eC5vcmcudWs+Cj4gLS0tCj4gIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2Uv c3lub3BzeXMvS2NvbmZpZyAgICAgICB8ICAgOSArCj4gIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2Uv c3lub3BzeXMvTWFrZWZpbGUgICAgICB8ICAgMSArCj4gIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2Uv c3lub3BzeXMvZHctaGRtaS1jZWMuYyB8IDMyNiArKysrKysrKysrKysrKysrKysrKysrKwo+ICBk cml2ZXJzL2dwdS9kcm0vYnJpZGdlL3N5bm9wc3lzL2R3LWhkbWktY2VjLmggfCAgMTkgKysKPiAg ZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9zeW5vcHN5cy9kdy1oZG1pLmMgICAgIHwgIDQyICsrKy0K PiAgZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9zeW5vcHN5cy9kdy1oZG1pLmggICAgIHwgICAxICsK PiAgNiBmaWxlcyBjaGFuZ2VkLCAzOTcgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQo+ICBj cmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9zeW5vcHN5cy9kdy1oZG1p LWNlYy5jCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL3N5bm9w c3lzL2R3LWhkbWktY2VjLmgKCltzbmlwXQoKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L2JyaWRnZS9zeW5vcHN5cy9kdy1oZG1pLWNlYy5jCj4gYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdl L3N5bm9wc3lzL2R3LWhkbWktY2VjLmMgbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAw MDAwMDAwMDAuLjUyYzlkOTNiOTYwMgo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dw dS9kcm0vYnJpZGdlL3N5bm9wc3lzL2R3LWhkbWktY2VjLmMKCltzbmlwXQoKPiArc3RhdGljIGlu dCBkd19oZG1pX2NlY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4g KwlzdHJ1Y3QgZHdfaGRtaV9jZWNfZGF0YSAqZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYt PmRldik7Cj4gKwlzdHJ1Y3QgZHdfaGRtaV9jZWMgKmNlYzsKPiArCWludCByZXQ7Cj4gKwo+ICsJ aWYgKCFkYXRhKQo+ICsJCXJldHVybiAtRU5YSU87Cj4gKwo+ICsJLyoKPiArCSAqIE91ciBkZXZp Y2UgaXMganVzdCBhIGNvbnZlbmllbmNlIC0gd2Ugd2FudCB0byBsaW5rIHRvIHRoZSByZWFsCj4g KwkgKiBoYXJkd2FyZSBkZXZpY2UgaGVyZSwgc28gdGhhdCB1c2Vyc3BhY2UgY2FuIHNlZSB0aGUg YXNzb2NpYXRpb24KPiArCSAqIGJldHdlZW4gdGhlIEhETUkgaGFyZHdhcmUgYW5kIGl0cyBhc3Nv Y2lhdGVkIENFQyBjaGFyZGV2Lgo+ICsJICovCj4gKwljZWMgPSBkZXZtX2t6YWxsb2MoJnBkZXYt PmRldiwgc2l6ZW9mKCpjZWMpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghY2VjKQo+ICsJCXJldHVy biAtRU5PTUVNOwo+ICsKPiArCWNlYy0+aXJxID0gZGF0YS0+aXJxOwo+ICsJY2VjLT5vcHMgPSBk YXRhLT5vcHM7Cj4gKwljZWMtPmhkbWkgPSBkYXRhLT5oZG1pOwo+ICsKPiArCXBsYXRmb3JtX3Nl dF9kcnZkYXRhKHBkZXYsIGNlYyk7Cj4gKwo+ICsJZHdfaGRtaV93cml0ZShjZWMsIDAsIEhETUlf Q0VDX1RYX0NOVCk7Cj4gKwlkd19oZG1pX3dyaXRlKGNlYywgfjAsIEhETUlfQ0VDX01BU0spOwo+ ICsJZHdfaGRtaV93cml0ZShjZWMsIH4wLCBIRE1JX0lIX01VVEVfQ0VDX1NUQVQwKTsKPiArCWR3 X2hkbWlfd3JpdGUoY2VjLCAwLCBIRE1JX0NFQ19QT0xBUklUWSk7Cj4gKwo+ICsJY2VjLT5hZGFw ID0gY2VjX2FsbG9jYXRlX2FkYXB0ZXIoJmR3X2hkbWlfY2VjX29wcywgY2VjLCAiZHdfaGRtaSIs Cj4gKwkJCQkJIENFQ19DQVBfTE9HX0FERFJTIHwgQ0VDX0NBUF9UUkFOU01JVCAKfAo+ICsJCQkJ CSBDRUNfQ0FQX1JDLCBDRUNfTUFYX0xPR19BRERSUyk7Cj4gKwlpZiAoSVNfRVJSKGNlYy0+YWRh cCkpCj4gKwkJcmV0dXJuIFBUUl9FUlIoY2VjLT5hZGFwKTsKPiArCj4gKwkvKiBvdmVycmlkZSB0 aGUgbW9kdWxlIHBvaW50ZXIgKi8KPiArCWNlYy0+YWRhcC0+b3duZXIgPSBUSElTX01PRFVMRTsK PiArCj4gKwlyZXQgPSBkZXZtX2FkZF9hY3Rpb24oJnBkZXYtPmRldiwgZHdfaGRtaV9jZWNfZGVs LCBjZWMpOwo+ICsJaWYgKHJldCkgewo+ICsJCWNlY19kZWxldGVfYWRhcHRlcihjZWMtPmFkYXAp Owo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVh ZGVkX2lycSgmcGRldi0+ZGV2LCBjZWMtPmlycSwKPiArCQkJCQlkd19oZG1pX2NlY19oYXJkaXJx LAo+ICsJCQkJCWR3X2hkbWlfY2VjX3RocmVhZCwgSVJRRl9TSEFSRUQsCj4gKwkJCQkJImR3LWhk bWktY2VjIiwgY2VjLT5hZGFwKTsKPiArCWlmIChyZXQgPCAwKQo+ICsJCXJldHVybiByZXQ7Cj4g Kwo+ICsJY2VjLT5ub3RpZnkgPSBjZWNfbm90aWZpZXJfZ2V0KHBkZXYtPmRldi5wYXJlbnQpOwo+ ICsJaWYgKCFjZWMtPm5vdGlmeSkKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwlyZXQgPSBj ZWNfcmVnaXN0ZXJfYWRhcHRlcihjZWMtPmFkYXAsIHBkZXYtPmRldi5wYXJlbnQpOwo+ICsJaWYg KHJldCA8IDApIHsKPiArCQljZWNfbm90aWZpZXJfcHV0KGNlYy0+bm90aWZ5KTsKPiArCQlyZXR1 cm4gcmV0Owo+ICsJfQo+ICsKPiArCS8qCj4gKwkgKiBDRUMgZG9jdW1lbnRhdGlvbiBzYXlzIHdl IG11c3Qgbm90IGNhbGwgY2VjX2RlbGV0ZV9hZGFwdGVyCj4gKwkgKiBhZnRlciBhIHN1Y2Nlc3Nm dWwgY2FsbCB0byBjZWNfcmVnaXN0ZXJfYWRhcHRlcigpLgo+ICsJICovCj4gKwlkZXZtX3JlbW92 ZV9hY3Rpb24oJnBkZXYtPmRldiwgZHdfaGRtaV9jZWNfZGVsLCBjZWMpOwoKZHdfaGRtaV9jZWNf ZGVsKCkgaXMgb25seSB1c2VkIHRvIGNsZWFuIHVwIGluIHRoZSBlcnJvciBwYXRoIG9mIHRoZSBw cm9iZSAKZnVuY3Rpb24uIEl0IHdvdWxkIGJlIHNpbXBsZXIgYW5kIGxlc3MgcmVzb3VyY2UtY29u c3VtaW5nIHRvIGFkZCBhbiBlcnJvciAKbGFiZWwgdG8gdGhpcyBmdW5jdGlvbiBpbnN0ZWFkIG9m IHVzaW5nIGRldm0uCgo+ICsKPiArCWNlY19yZWdpc3Rlcl9jZWNfbm90aWZpZXIoY2VjLT5hZGFw LCBjZWMtPm5vdGlmeSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQg ZHdfaGRtaV9jZWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gK3sKPiAr CXN0cnVjdCBkd19oZG1pX2NlYyAqY2VjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Cj4g Kwo+ICsJY2VjX3VucmVnaXN0ZXJfYWRhcHRlcihjZWMtPmFkYXApOwo+ICsJY2VjX25vdGlmaWVy X3B1dChjZWMtPm5vdGlmeSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBz dHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGR3X2hkbWlfY2VjX2RyaXZlciA9IHsKPiArCS5wcm9iZQk9 IGR3X2hkbWlfY2VjX3Byb2JlLAo+ICsJLnJlbW92ZQk9IGR3X2hkbWlfY2VjX3JlbW92ZSwKPiAr CS5kcml2ZXIgPSB7Cj4gKwkJLm5hbWUgPSAiZHctaGRtaS1jZWMiLAo+ICsJfSwKPiArfTsKPiAr bW9kdWxlX3BsYXRmb3JtX2RyaXZlcihkd19oZG1pX2NlY19kcml2ZXIpOwoKSXMgdGhlcmUgYSBw YXJ0aWN1bGFyIHJlYXNvbiB3aHkgdGhpcyBoYXMgdG8gYmUgYSBzZXBhcmF0ZSBtb2R1bGUgaW5z dGVhZCBvZiAKc2ltcGx5IGNhbGxpbmcgdGhlIENFQyBpbml0L2NsZWFudXAgZnVuY3Rpb25zIGRp cmVjdGx5IGZyb20gdGhlIG1haW4gZHctaGRtaSAKZHJpdmVyID8KCj4gK01PRFVMRV9BVVRIT1Io IlJ1c3NlbGwgS2luZyA8cm1rK2tlcm5lbEBhcm1saW51eC5vcmcudWs+Iik7Cj4gK01PRFVMRV9E RVNDUklQVElPTigiU3lub3BzeXMgRGVzaWdud2FyZSBIRE1JIENFQyBkcml2ZXIgZm9yIGkuTVgi KTsKPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo+ICtNT0RVTEVfQUxJQVMoUExBVEZPUk1fTU9E VUxFX1BSRUZJWCAiZHctaGRtaS1jZWMiKTsKCi0tIApSZWdhcmRzLAoKTGF1cmVudCBQaW5jaGFy dAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRl dmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8v bGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==