From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v2 02/25] drm/panel: add backlight support Date: Mon, 9 Dec 2019 02:55:54 +0200 Message-ID: <20191209005554.GK14311@pendragon.ideasonboard.com> References: <20191207140353.23967-1-sam@ravnborg.org> <20191207140353.23967-3-sam@ravnborg.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <20191207140353.23967-3-sam@ravnborg.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Sam Ravnborg Cc: Neil Armstrong , David Airlie , dri-devel@lists.freedesktop.org, Thierry Reding , linux-samsung-soc@vger.kernel.org, linux-rockchip@lists.infradead.org, Tomi Valkeinen , NXP Linux Team , Jagan Teki , Jitao Shi , Pengutronix Kernel Team , linux-mediatek@lists.infradead.org, Abhinav Kumar , linux-tegra@vger.kernel.org, Maxime Ripard , Sean Paul , linux-arm-kernel@lists.infradead.org, Purism Kernel Team , linux-renesas-soc@vger.kernel.org, Boris Brezillon List-Id: linux-tegra@vger.kernel.org SGkgU2FtLAoKVGhhbmsgeW91IGZvciB0aGUgcGF0Y2guCgpPbiBTYXQsIERlYyAwNywgMjAxOSBh dCAwMzowMzozMFBNICswMTAwLCBTYW0gUmF2bmJvcmcgd3JvdGU6Cj4gUGFuZWxzIG9mdGVuIHN1 cHBvcnRzIGJhY2tsaWdodCBhcyBzcGVjaWZpZWQgaW4gYSBkZXZpY2UgdHJlZS4KCnMvc3VwcG9y dHMvc3VwcG9ydC8KCj4gVXBkYXRlIHRoZSBkcm1fcGFuZWwgaW5mcmFzdHJ1Y3R1cmUgdG8gc3Vw cG9ydCB0aGlzIHRvCj4gc2ltcGxpZnkgdGhlIGRyaXZlcnMuCj4gCj4gV2l0aCB0aGlzIHRoZSBw YW5lbCBkcml2ZXIganVzdCBuZWVkcyB0byBhZGQgdGhlIGZvbGxvd2luZyB0byB0aGUKPiBwcm9i ZSgpIGZ1bmN0aW9uOgo+IAo+ICAgICBlcnIgPSBkcm1fcGFuZWxfb2ZfYmFja2xpZ2h0KHBhbmVs KTsKPiAgICAgaWYgKGVycikKPiAgICAgICAgICAgICByZXR1cm4gZXJyOwo+IAo+IFRoZW4gZHJt X3BhbmVsIHdpbGwgaGFuZGxlIGFsbCB0aGUgcmVzdC4KPiAKPiBUaGVyZSBpcyBvbmUgY2F2ZWF0 IHdpdGggdGhlIGJhY2tsaWdodCBzdXBwb3J0Lgo+IElmIGRybV9wYW5lbF8oZW5hYmxlfGRpc2Fi bGUpIGFyZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMKPiBpbiByb3cgdGhlbiBiYWNrbGlnaHRfKGVu YWJsZXxkaXNhYmxlKSB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KCnMvaW4gcm93L2lu IGEgcm93LwoKPiBUaGUgYWJvdmUgd2lsbCBoYXBwZW4gd2hlbiBhIHBhbmVsIGRyaXZlcnMgdW5j b25kaXRpb25hbGx5Cj4gY2FsbHMgZHJtX3BhbmVsX2Rpc2FibGUoKSBpbiB0aGVpciBzaHV0ZG93 bigpIGZ1bmN0aW9uLAo+IHdoYW4gdGhlIHBhbmVsIGlzIGFscmVhZHkgZGlzYWJsZWQgYW5kIHRo ZW4gc2h1dGRvd24oKSBpcyBjYWxsZWQuCj4gCj4gUmVhZGluZyB0aGUgYmFja2xpZ2h0IGNvZGUg aXQgc2VlbXMgc2FmZSB0byBjYWxsCj4gdGhlIGJhY2tsaWdodF8oZW5hYmxlfGRpc2FibGUpIHNl dmVyYWwgdGltZXMuCj4gCj4gdjM6Cj4gLSBJbXByb3ZlIGNvbW1lbnRzLCBmaXggZ3JhbW1hciAo TGF1cmVudCkKPiAtIERvIG5vdCBmYWlsIGluIGRybV9wYW5lbF9vZl9iYWNrbGlnaHQoKSBpZiBu byBEVCBzdXBwb3J0IChMYXVyZW50KQo+IC0gTG9nIGlmIGJhY2tsaWdodF8oZW5hYmxlfGRpc2Fi bGUpIGZhaWxzIChMYXVyZW50KQo+IC0gSW1wcm92ZSBkcm1fcGFuZWxfb2ZfYmFja2xpZ2h0KCkg ZG9jcwo+IC0gVXBkYXRlZCBjaGFuZ2Vsb2cgd2l0aCBiYWNrbGlnaHQgYW5hbHlzaXMgKHRyaWdn ZXJlZCBieSBMYXVyZW50KQo+IAo+IHYyOgo+IC0gRHJvcCB0ZXN0IG9mIENPTkZJR19EUk1fUEFO RUwgaW4gaGVhZGVyLWZpbGUgKExhdXJlbnQpCj4gLSBkbyBub3QgZW5hYmxlIGJhY2tsaWdodCBp ZiAtPmVuYWJsZSgpIHJldHVybnMgYW4gZXJyb3IKPiAKPiBTaWduZWQtb2ZmLWJ5OiBTYW0gUmF2 bmJvcmcgPHNhbUByYXZuYm9yZy5vcmc+Cj4gQ2M6IFRoaWVycnkgUmVkaW5nIDx0aGllcnJ5LnJl ZGluZ0BnbWFpbC5jb20+Cj4gQ2M6IExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRA aWRlYXNvbmJvYXJkLmNvbT4KPiBDYzogTWFhcnRlbiBMYW5raG9yc3QgPG1hYXJ0ZW4ubGFua2hv cnN0QGxpbnV4LmludGVsLmNvbT4KPiBDYzogTWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJpcGFyZEBi b290bGluLmNvbT4KPiBDYzogU2VhbiBQYXVsIDxzZWFuQHBvb3JseS5ydW4+Cj4gQ2M6IERhdmlk IEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KPiBDYzogRGFuaWVsIFZldHRlciA8ZGFuaWVsQGZm d2xsLmNoPgo+IC0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vZHJtX3BhbmVsLmMgfCA1OCArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKystCj4gIGluY2x1ZGUvZHJtL2RybV9wYW5lbC5o ICAgICB8IDI1ICsrKysrKysrKysrKysrKysKPiAgMiBmaWxlcyBjaGFuZ2VkLCA4MiBpbnNlcnRp b25zKCspLCAxIGRlbGV0aW9uKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9k cm1fcGFuZWwuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGFuZWwuYwo+IGluZGV4IDRhYjcyMjlm YjIyYi4uYzMxMmQ1ZWIyMTRkIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGFu ZWwuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGFuZWwuYwo+IEBAIC0yMSwxMSArMjEs MTMgQEAKPiAgICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgo+ICAgKi8KPiAgCj4gKyNpbmNs dWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KPiAgI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgo+ICAjaW5j bHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gIAo+ICAjaW5jbHVkZSA8ZHJtL2RybV9jcnRjLmg+Cj4g ICNpbmNsdWRlIDxkcm0vZHJtX3BhbmVsLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX3ByaW50Lmg+ Cj4gIAo+ICBzdGF0aWMgREVGSU5FX01VVEVYKHBhbmVsX2xvY2spOwo+ICBzdGF0aWMgTElTVF9I RUFEKHBhbmVsX2xpc3QpOwo+IEBAIC0xOTYsMTEgKzE5OCwyMCBAQCBFWFBPUlRfU1lNQk9MKGRy bV9wYW5lbF91bnByZXBhcmUpOwo+ICAgKi8KPiAgaW50IGRybV9wYW5lbF9lbmFibGUoc3RydWN0 IGRybV9wYW5lbCAqcGFuZWwpCj4gIHsKPiArCWludCByZXQgPSAwOwo+ICsKPiAgCWlmICghcGFu ZWwpCj4gIAkJcmV0dXJuIC1FSU5WQUw7Cj4gIAo+ICAJaWYgKHBhbmVsLT5mdW5jcyAmJiBwYW5l bC0+ZnVuY3MtPmVuYWJsZSkKPiAtCQlyZXR1cm4gcGFuZWwtPmZ1bmNzLT5lbmFibGUocGFuZWwp Owo+ICsJCXJldCA9IHBhbmVsLT5mdW5jcy0+ZW5hYmxlKHBhbmVsKTsKPiArCj4gKwlpZiAocmV0 IDwgMCkKPiArCQlyZXR1cm4gcmV0OwoKWW91IGNhbiBtb3ZlIHRoaXMgd2l0aGluIHRoZSBhYm92 ZSBpZiAoKSBibG9jayBhbmQgYXZvaWQgaW5pdGlhbGl6aW5nCnJldCB0byAwOgoKCWlmIChwYW5l bC0+ZnVuY3MgJiYgcGFuZWwtPmZ1bmNzLT5lbmFibGUpIHsKCQlyZXQgPSBwYW5lbC0+ZnVuY3Mt PmVuYWJsZShwYW5lbCk7CgkJaWYgKHJldCA8IDApCgkJCXJldHVybiByZXQ7Cgl9CgpXaXRoIHRo ZXNlIHNtYWxsIGlzc3VlcyBhZGRyZXNzZWQsCgpSZXZpZXdlZC1ieTogTGF1cmVudCBQaW5jaGFy dCA8bGF1cmVudC5waW5jaGFydEBpZGVhc29uYm9hcmQuY29tPgoKPiArCXJldCA9IGJhY2tsaWdo dF9lbmFibGUocGFuZWwtPmJhY2tsaWdodCk7Cj4gKwlpZiAocmV0IDwgMCkKPiArCQlEUk1fREVW X0lORk8ocGFuZWwtPmRldiwgImZhaWxlZCB0byBlbmFibGUgYmFja2xpZ2h0OiAlZFxuIiwgcmV0 KTsKPiAgCj4gIAlyZXR1cm4gMDsKPiAgfQo+IEBAIC0yMTgsOSArMjI5LDE1IEBAIEVYUE9SVF9T WU1CT0woZHJtX3BhbmVsX2VuYWJsZSk7Cj4gICAqLwo+ICBpbnQgZHJtX3BhbmVsX2Rpc2FibGUo c3RydWN0IGRybV9wYW5lbCAqcGFuZWwpCj4gIHsKPiArCWludCByZXQ7Cj4gKwo+ICAJaWYgKCFw YW5lbCkKPiAgCQlyZXR1cm4gLUVJTlZBTDsKPiAgCj4gKwlyZXQgPSBiYWNrbGlnaHRfZGlzYWJs ZShwYW5lbC0+YmFja2xpZ2h0KTsKPiArCWlmIChyZXQgPCAwKQo+ICsJCURSTV9ERVZfSU5GTyhw YW5lbC0+ZGV2LCAiZmFpbGVkIHRvIGRpc2FibGUgYmFja2xpZ2h0OiAlZFxuIiwgcmV0KTsKPiAr Cj4gIAlpZiAocGFuZWwtPmZ1bmNzICYmIHBhbmVsLT5mdW5jcy0+ZGlzYWJsZSkKPiAgCQlyZXR1 cm4gcGFuZWwtPmZ1bmNzLT5kaXNhYmxlKHBhbmVsKTsKPiAgCj4gQEAgLTI4OSw2ICszMDYsNDUg QEAgc3RydWN0IGRybV9wYW5lbCAqb2ZfZHJtX2ZpbmRfcGFuZWwoY29uc3Qgc3RydWN0IGRldmlj ZV9ub2RlICpucCkKPiAgRVhQT1JUX1NZTUJPTChvZl9kcm1fZmluZF9wYW5lbCk7Cj4gICNlbmRp Zgo+ICAKPiArI2lmZGVmIENPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFCj4gKy8qKgo+ICsg KiBkcm1fcGFuZWxfb2ZfYmFja2xpZ2h0IC0gdXNlIGJhY2tsaWdodCBkZXZpY2Ugbm9kZSBmb3Ig YmFja2xpZ2h0Cj4gKyAqIEBwYW5lbDogRFJNIHBhbmVsCj4gKyAqCj4gKyAqIFVzZSB0aGlzIGZ1 bmN0aW9uIHRvIGVuYWJsZSBiYWNrbGlnaHQgaGFuZGxpbmcgaWYgeW91ciBwYW5lbAo+ICsgKiB1 c2VzIGRldmljZSB0cmVlIGFuZCBoYXMgYSBiYWNrbGlnaHQgcGhhbmRsZS4KPiArICoKPiArICog V2hlbiB0aGUgcGFuZWwgaXMgZW5hYmxlZCBiYWNrbGlnaHQgd2lsbCBiZSBlbmFibGVkIGFmdGVy IGEKPiArICogc3VjY2Vzc2Z1bGwgY2FsbCB0byAmZHJtX3BhbmVsX2Z1bmNzLmVuYWJsZSgpCj4g KyAqCj4gKyAqIFdoZW4gdGhlIHBhbmVsIGlzIGRpc2FibGVkIGJhY2tsaWdodCB3aWxsIGJlIGRp c2FibGVkIGJlZm9yZSB0aGUKPiArICogY2FsbCB0byAmZHJtX3BhbmVsX2Z1bmNzLmRpc2FibGUo KS4KPiArICoKPiArICogQSB0eXBpY2FsIGltcGxlbWVudGF0aW9uIGZvciBhIHBhbmVsIGRyaXZl ciBzdXBwb3J0aW5nIGRldmljZSB0cmVlCj4gKyAqIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGF0 IHByb2JlIHRpbWUuIEJhY2tsaWdodCB3aWxsIHRoZW4gYmUgaGFuZGxlZAo+ICsgKiB0cmFuc3Bh cmVudGx5IHdpdGhvdXQgcmVxdWlyaW5nIGFueSBpbnRlcnZlbnRpb24gZnJvbSB0aGUgZHJpdmVy Lgo+ICsgKiBkcm1fcGFuZWxfb2ZfYmFja2xpZ2h0KCkgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhl IGNhbGwgdG8gZHJtX3BhbmVsX2luaXQoKS4KPiArICoKPiArICogUmV0dXJuOiAwIG9uIHN1Y2Nl c3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCj4gKyAqLwo+ICtpbnQgZHJt X3BhbmVsX29mX2JhY2tsaWdodChzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkKPiArewo+ICsJc3Ry dWN0IGJhY2tsaWdodF9kZXZpY2UgKmJhY2tsaWdodDsKPiArCj4gKwlpZiAoIXBhbmVsIHx8ICFw YW5lbC0+ZGV2KQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCWJhY2tsaWdodCA9IGRldm1f b2ZfZmluZF9iYWNrbGlnaHQocGFuZWwtPmRldik7Cj4gKwo+ICsJaWYgKElTX0VSUihiYWNrbGln aHQpKQo+ICsgICAgICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIoYmFja2xpZ2h0KTsKPiArCj4g KwlwYW5lbC0+YmFja2xpZ2h0ID0gYmFja2xpZ2h0Owo+ICsJcmV0dXJuIDA7Cj4gK30KPiArRVhQ T1JUX1NZTUJPTChkcm1fcGFuZWxfb2ZfYmFja2xpZ2h0KTsKPiArI2VuZGlmCj4gKwo+ICBNT0RV TEVfQVVUSE9SKCJUaGllcnJ5IFJlZGluZyA8dHJlZGluZ0BudmlkaWEuY29tPiIpOwo+ICBNT0RV TEVfREVTQ1JJUFRJT04oIkRSTSBwYW5lbCBpbmZyYXN0cnVjdHVyZSIpOwo+ICBNT0RVTEVfTElD RU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwo+IGRpZmYgLS1naXQgYS9pbmNsdWRl L2RybS9kcm1fcGFuZWwuaCBiL2luY2x1ZGUvZHJtL2RybV9wYW5lbC5oCj4gaW5kZXggZDcxNjU1 YjI2MzRjLi5jNzUxYzliMTdkZjAgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9kcm0vZHJtX3BhbmVs LmgKPiArKysgYi9pbmNsdWRlL2RybS9kcm1fcGFuZWwuaAo+IEBAIC0yOCw2ICsyOCw3IEBACj4g ICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgo+ICAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgo+ICAK PiArc3RydWN0IGJhY2tsaWdodF9kZXZpY2U7Cj4gIHN0cnVjdCBkZXZpY2Vfbm9kZTsKPiAgc3Ry dWN0IGRybV9jb25uZWN0b3I7Cj4gIHN0cnVjdCBkcm1fZGV2aWNlOwo+IEBAIC01OSw2ICs2MCwx MCBAQCBzdHJ1Y3QgZGlzcGxheV90aW1pbmc7Cj4gICAqCj4gICAqIFRvIHNhdmUgcG93ZXIgd2hl biBubyB2aWRlbyBkYXRhIGlzIHRyYW5zbWl0dGVkLCBhIGRyaXZlciBjYW4gcG93ZXIgZG93bgo+ ICAgKiB0aGUgcGFuZWwuIFRoaXMgaXMgdGhlIGpvYiBvZiB0aGUgLnVucHJlcGFyZSgpIGZ1bmN0 aW9uLgo+ICsgKgo+ICsgKiBCYWNrbGlnaHQgY2FuIGJlIGhhbmRsZWQgYXV0b21hdGljYWxseSBp ZiBjb25maWd1cmVkIHVzaW5nCj4gKyAqIGRybV9wYW5lbF9vZl9iYWNrbGlnaHQoKS4gVGhlbiB0 aGUgZHJpdmVyIGRvZXMgbm90IG5lZWQgdG8gaW1wbGVtZW50IHRoZQo+ICsgKiBmdW5jdGlvbmFs aXR5IHRvIGVuYWJsZS9kaXNhYmxlIGJhY2tsaWdodC4KPiAgICovCj4gIHN0cnVjdCBkcm1fcGFu ZWxfZnVuY3Mgewo+ICAJLyoqCj4gQEAgLTE0Niw2ICsxNTEsMTcgQEAgc3RydWN0IGRybV9wYW5l bCB7Cj4gIAkgKi8KPiAgCXN0cnVjdCBkZXZpY2UgKmRldjsKPiAgCj4gKwkvKioKPiArCSAqIEBi YWNrbGlnaHQ6Cj4gKwkgKgo+ICsJICogQmFja2xpZ2h0IGRldmljZSwgdXNlZCB0byB0dXJuIG9u IGJhY2tsaWdodCBhZnRlciB0aGUgY2FsbAo+ICsJICogdG8gZW5hYmxlKCksIGFuZCB0byB0dXJu IG9mZiBiYWNrbGlnaHQgYmVmb3JlIHRoZSBjYWxsIHRvCj4gKwkgKiBkaXNhYmxlKCkuCj4gKwkg KiBiYWNrbGlnaHQgaXMgc2V0IGJ5IGRybV9wYW5lbF9vZl9iYWNrbGlnaHQoKSBhbmQgZHJpdmVy cwo+ICsJICogc2hhbGwgbm90IGFzc2lnbiBpdC4KPiArCSAqLwo+ICsJc3RydWN0IGJhY2tsaWdo dF9kZXZpY2UgKmJhY2tsaWdodDsKPiArCj4gIAkvKioKPiAgCSAqIEBmdW5jczoKPiAgCSAqCj4g QEAgLTE5Nyw0ICsyMTMsMTMgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJtX3BhbmVsICpvZl9k cm1fZmluZF9wYW5lbChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQo+ICB9Cj4gICNlbmRp Zgo+ICAKPiArI2lmIElTX0VOQUJMRUQoQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0UpCj4g K2ludCBkcm1fcGFuZWxfb2ZfYmFja2xpZ2h0KHN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsKTsKPiAr I2Vsc2UKPiArc3RhdGljIGlubGluZSBpbnQgZHJtX3BhbmVsX29mX2JhY2tsaWdodChzdHJ1Y3Qg ZHJtX3BhbmVsICpwYW5lbCkKPiArewo+ICsJcmV0dXJuIDA7Cj4gK30KPiArI2VuZGlmCj4gKwo+ ICAjZW5kaWYKCi0tIApSZWdhcmRzLAoKTGF1cmVudCBQaW5jaGFydApfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRy aS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5v cmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWw= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BF36EC2D0C0 for ; Mon, 9 Dec 2019 00:56:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8F56420700 for ; Mon, 9 Dec 2019 00:56:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="T5cbUBsZ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726826AbfLIA4E (ORCPT ); Sun, 8 Dec 2019 19:56:04 -0500 Received: from perceval.ideasonboard.com ([213.167.242.64]:49858 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726596AbfLIA4D (ORCPT ); Sun, 8 Dec 2019 19:56:03 -0500 Received: from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi [81.175.216.236]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E011752B; Mon, 9 Dec 2019 01:56:00 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1575852961; bh=J6yIt17nBqwPKwVZXRtdxjHrhpUgI8Kou5WpdOIZ5YE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=T5cbUBsZJFEm8iBpxpsDzOaQbbEBdWh0bc55kfLncjhrFA90srpzIJTF5ep242mQO b5t70DxIKO2bWncxDKMv8rEKTqbMGB6Wc4rf0t1JrZ0hGjCETsQDuEAh6St3IsX09H Vk/pTQgLD1qS5KsBNhE3mVt1u8/X3js4Qn7p822U= Date: Mon, 9 Dec 2019 02:55:54 +0200 From: Laurent Pinchart To: Sam Ravnborg Cc: dri-devel@lists.freedesktop.org, Thierry Reding , Linus Walleij , Abhinav Kumar , Andrzej Hajda , Benjamin Gaignard , Boris Brezillon , Daniel Vetter , David Airlie , Jagan Teki , Jitao Shi , linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-renesas-soc@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-tegra@vger.kernel.org, Maarten Lankhorst , Maxime Ripard , Neil Armstrong , NXP Linux Team , Pengutronix Kernel Team , Purism Kernel Team , Sean Paul , Stefan Agner , Tomi Valkeinen , Maxime Ripard Subject: Re: [PATCH v2 02/25] drm/panel: add backlight support Message-ID: <20191209005554.GK14311@pendragon.ideasonboard.com> References: <20191207140353.23967-1-sam@ravnborg.org> <20191207140353.23967-3-sam@ravnborg.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20191207140353.23967-3-sam@ravnborg.org> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-renesas-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-renesas-soc@vger.kernel.org Hi Sam, Thank you for the patch. On Sat, Dec 07, 2019 at 03:03:30PM +0100, Sam Ravnborg wrote: > Panels often supports backlight as specified in a device tree. s/supports/support/ > Update the drm_panel infrastructure to support this to > simplify the drivers. > > With this the panel driver just needs to add the following to the > probe() function: > > err = drm_panel_of_backlight(panel); > if (err) > return err; > > Then drm_panel will handle all the rest. > > There is one caveat with the backlight support. > If drm_panel_(enable|disable) are called multiple times > in row then backlight_(enable|disable) will be called multiple times. s/in row/in a row/ > The above will happen when a panel drivers unconditionally > calls drm_panel_disable() in their shutdown() function, > whan the panel is already disabled and then shutdown() is called. > > Reading the backlight code it seems safe to call > the backlight_(enable|disable) several times. > > v3: > - Improve comments, fix grammar (Laurent) > - Do not fail in drm_panel_of_backlight() if no DT support (Laurent) > - Log if backlight_(enable|disable) fails (Laurent) > - Improve drm_panel_of_backlight() docs > - Updated changelog with backlight analysis (triggered by Laurent) > > v2: > - Drop test of CONFIG_DRM_PANEL in header-file (Laurent) > - do not enable backlight if ->enable() returns an error > > Signed-off-by: Sam Ravnborg > Cc: Thierry Reding > Cc: Laurent Pinchart > Cc: Maarten Lankhorst > Cc: Maxime Ripard > Cc: Sean Paul > Cc: David Airlie > Cc: Daniel Vetter > --- > drivers/gpu/drm/drm_panel.c | 58 ++++++++++++++++++++++++++++++++++++- > include/drm/drm_panel.h | 25 ++++++++++++++++ > 2 files changed, 82 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c > index 4ab7229fb22b..c312d5eb214d 100644 > --- a/drivers/gpu/drm/drm_panel.c > +++ b/drivers/gpu/drm/drm_panel.c > @@ -21,11 +21,13 @@ > * DEALINGS IN THE SOFTWARE. > */ > > +#include > #include > #include > > #include > #include > +#include > > static DEFINE_MUTEX(panel_lock); > static LIST_HEAD(panel_list); > @@ -196,11 +198,20 @@ EXPORT_SYMBOL(drm_panel_unprepare); > */ > int drm_panel_enable(struct drm_panel *panel) > { > + int ret = 0; > + > if (!panel) > return -EINVAL; > > if (panel->funcs && panel->funcs->enable) > - return panel->funcs->enable(panel); > + ret = panel->funcs->enable(panel); > + > + if (ret < 0) > + return ret; You can move this within the above if () block and avoid initializing ret to 0: if (panel->funcs && panel->funcs->enable) { ret = panel->funcs->enable(panel); if (ret < 0) return ret; } With these small issues addressed, Reviewed-by: Laurent Pinchart > + ret = backlight_enable(panel->backlight); > + if (ret < 0) > + DRM_DEV_INFO(panel->dev, "failed to enable backlight: %d\n", ret); > > return 0; > } > @@ -218,9 +229,15 @@ EXPORT_SYMBOL(drm_panel_enable); > */ > int drm_panel_disable(struct drm_panel *panel) > { > + int ret; > + > if (!panel) > return -EINVAL; > > + ret = backlight_disable(panel->backlight); > + if (ret < 0) > + DRM_DEV_INFO(panel->dev, "failed to disable backlight: %d\n", ret); > + > if (panel->funcs && panel->funcs->disable) > return panel->funcs->disable(panel); > > @@ -289,6 +306,45 @@ struct drm_panel *of_drm_find_panel(const struct device_node *np) > EXPORT_SYMBOL(of_drm_find_panel); > #endif > > +#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE > +/** > + * drm_panel_of_backlight - use backlight device node for backlight > + * @panel: DRM panel > + * > + * Use this function to enable backlight handling if your panel > + * uses device tree and has a backlight phandle. > + * > + * When the panel is enabled backlight will be enabled after a > + * successfull call to &drm_panel_funcs.enable() > + * > + * When the panel is disabled backlight will be disabled before the > + * call to &drm_panel_funcs.disable(). > + * > + * A typical implementation for a panel driver supporting device tree > + * will call this function at probe time. Backlight will then be handled > + * transparently without requiring any intervention from the driver. > + * drm_panel_of_backlight() must be called after the call to drm_panel_init(). > + * > + * Return: 0 on success or a negative error code on failure. > + */ > +int drm_panel_of_backlight(struct drm_panel *panel) > +{ > + struct backlight_device *backlight; > + > + if (!panel || !panel->dev) > + return -EINVAL; > + > + backlight = devm_of_find_backlight(panel->dev); > + > + if (IS_ERR(backlight)) > + return PTR_ERR(backlight); > + > + panel->backlight = backlight; > + return 0; > +} > +EXPORT_SYMBOL(drm_panel_of_backlight); > +#endif > + > MODULE_AUTHOR("Thierry Reding "); > MODULE_DESCRIPTION("DRM panel infrastructure"); > MODULE_LICENSE("GPL and additional rights"); > diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h > index d71655b2634c..c751c9b17df0 100644 > --- a/include/drm/drm_panel.h > +++ b/include/drm/drm_panel.h > @@ -28,6 +28,7 @@ > #include > #include > > +struct backlight_device; > struct device_node; > struct drm_connector; > struct drm_device; > @@ -59,6 +60,10 @@ struct display_timing; > * > * To save power when no video data is transmitted, a driver can power down > * the panel. This is the job of the .unprepare() function. > + * > + * Backlight can be handled automatically if configured using > + * drm_panel_of_backlight(). Then the driver does not need to implement the > + * functionality to enable/disable backlight. > */ > struct drm_panel_funcs { > /** > @@ -146,6 +151,17 @@ struct drm_panel { > */ > struct device *dev; > > + /** > + * @backlight: > + * > + * Backlight device, used to turn on backlight after the call > + * to enable(), and to turn off backlight before the call to > + * disable(). > + * backlight is set by drm_panel_of_backlight() and drivers > + * shall not assign it. > + */ > + struct backlight_device *backlight; > + > /** > * @funcs: > * > @@ -197,4 +213,13 @@ static inline struct drm_panel *of_drm_find_panel(const struct device_node *np) > } > #endif > > +#if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE) > +int drm_panel_of_backlight(struct drm_panel *panel); > +#else > +static inline int drm_panel_of_backlight(struct drm_panel *panel) > +{ > + return 0; > +} > +#endif > + > #endif -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0A2D3C2D0BF for ; Mon, 9 Dec 2019 00:56:45 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D3A78206E0 for ; Mon, 9 Dec 2019 00:56:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="mXZlRMDU"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="T5cbUBsZ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D3A78206E0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ideasonboard.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=9NzlUWsfSPuT2wXEEFU3xdEZWti+ZGiiepi5ziwhkTI=; b=mXZlRMDU89S25U y36bmlh9CNKsx5qkYVcxrUuhE3OdWQbCFelOLLoWtlQl2HeR5CjFy8htNEzAaiOMGFyUoWXXkKihj bGkA5ES29Xuvp12Ah8kekxiy3l28/xctIvTRh02hUkEtrI9LPrm/JLfcEq7OY7To7wITPC3HobMX0 fgMJ0Nw6todZvTrM7zjcbLfM9AxDz5dg/hh8GAJfVl7c9DNAOvCfysBG4XMbnJzJhN6Ll54m3xGh0 KYZ4sFVO/D+0GuTkhBBKlKZf6ZPxrQKZadLy6HYMz+DN7GvLiv6ubHzb2mGx2Q5hd4RCijW+3oC3H nnAVP5RTpnhJrKLmxUZA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ie7Lk-0007bx-45; Mon, 09 Dec 2019 00:56:32 +0000 Received: from perceval.ideasonboard.com ([2001:4b98:dc2:55:216:3eff:fef7:d647]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ie7LH-00077B-6j; Mon, 09 Dec 2019 00:56:05 +0000 Received: from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi [81.175.216.236]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E011752B; Mon, 9 Dec 2019 01:56:00 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1575852961; bh=J6yIt17nBqwPKwVZXRtdxjHrhpUgI8Kou5WpdOIZ5YE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=T5cbUBsZJFEm8iBpxpsDzOaQbbEBdWh0bc55kfLncjhrFA90srpzIJTF5ep242mQO b5t70DxIKO2bWncxDKMv8rEKTqbMGB6Wc4rf0t1JrZ0hGjCETsQDuEAh6St3IsX09H Vk/pTQgLD1qS5KsBNhE3mVt1u8/X3js4Qn7p822U= Date: Mon, 9 Dec 2019 02:55:54 +0200 From: Laurent Pinchart To: Sam Ravnborg Subject: Re: [PATCH v2 02/25] drm/panel: add backlight support Message-ID: <20191209005554.GK14311@pendragon.ideasonboard.com> References: <20191207140353.23967-1-sam@ravnborg.org> <20191207140353.23967-3-sam@ravnborg.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20191207140353.23967-3-sam@ravnborg.org> User-Agent: Mutt/1.10.1 (2018-07-13) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20191208_165603_554460_19BA7985 X-CRM114-Status: GOOD ( 31.04 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Neil Armstrong , David Airlie , Linus Walleij , dri-devel@lists.freedesktop.org, Andrzej Hajda , Thierry Reding , Benjamin Gaignard , Stefan Agner , linux-samsung-soc@vger.kernel.org, linux-rockchip@lists.infradead.org, Tomi Valkeinen , NXP Linux Team , Jagan Teki , Jitao Shi , Pengutronix Kernel Team , Maarten Lankhorst , Maxime Ripard , linux-mediatek@lists.infradead.org, Abhinav Kumar , linux-tegra@vger.kernel.org, Maxime Ripard , Sean Paul , linux-arm-kernel@lists.infradead.org, Purism Kernel Team , linux-renesas-soc@vger.kernel.org, Boris Brezillon , Daniel Vetter Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org Hi Sam, Thank you for the patch. On Sat, Dec 07, 2019 at 03:03:30PM +0100, Sam Ravnborg wrote: > Panels often supports backlight as specified in a device tree. s/supports/support/ > Update the drm_panel infrastructure to support this to > simplify the drivers. > > With this the panel driver just needs to add the following to the > probe() function: > > err = drm_panel_of_backlight(panel); > if (err) > return err; > > Then drm_panel will handle all the rest. > > There is one caveat with the backlight support. > If drm_panel_(enable|disable) are called multiple times > in row then backlight_(enable|disable) will be called multiple times. s/in row/in a row/ > The above will happen when a panel drivers unconditionally > calls drm_panel_disable() in their shutdown() function, > whan the panel is already disabled and then shutdown() is called. > > Reading the backlight code it seems safe to call > the backlight_(enable|disable) several times. > > v3: > - Improve comments, fix grammar (Laurent) > - Do not fail in drm_panel_of_backlight() if no DT support (Laurent) > - Log if backlight_(enable|disable) fails (Laurent) > - Improve drm_panel_of_backlight() docs > - Updated changelog with backlight analysis (triggered by Laurent) > > v2: > - Drop test of CONFIG_DRM_PANEL in header-file (Laurent) > - do not enable backlight if ->enable() returns an error > > Signed-off-by: Sam Ravnborg > Cc: Thierry Reding > Cc: Laurent Pinchart > Cc: Maarten Lankhorst > Cc: Maxime Ripard > Cc: Sean Paul > Cc: David Airlie > Cc: Daniel Vetter > --- > drivers/gpu/drm/drm_panel.c | 58 ++++++++++++++++++++++++++++++++++++- > include/drm/drm_panel.h | 25 ++++++++++++++++ > 2 files changed, 82 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c > index 4ab7229fb22b..c312d5eb214d 100644 > --- a/drivers/gpu/drm/drm_panel.c > +++ b/drivers/gpu/drm/drm_panel.c > @@ -21,11 +21,13 @@ > * DEALINGS IN THE SOFTWARE. > */ > > +#include > #include > #include > > #include > #include > +#include > > static DEFINE_MUTEX(panel_lock); > static LIST_HEAD(panel_list); > @@ -196,11 +198,20 @@ EXPORT_SYMBOL(drm_panel_unprepare); > */ > int drm_panel_enable(struct drm_panel *panel) > { > + int ret = 0; > + > if (!panel) > return -EINVAL; > > if (panel->funcs && panel->funcs->enable) > - return panel->funcs->enable(panel); > + ret = panel->funcs->enable(panel); > + > + if (ret < 0) > + return ret; You can move this within the above if () block and avoid initializing ret to 0: if (panel->funcs && panel->funcs->enable) { ret = panel->funcs->enable(panel); if (ret < 0) return ret; } With these small issues addressed, Reviewed-by: Laurent Pinchart > + ret = backlight_enable(panel->backlight); > + if (ret < 0) > + DRM_DEV_INFO(panel->dev, "failed to enable backlight: %d\n", ret); > > return 0; > } > @@ -218,9 +229,15 @@ EXPORT_SYMBOL(drm_panel_enable); > */ > int drm_panel_disable(struct drm_panel *panel) > { > + int ret; > + > if (!panel) > return -EINVAL; > > + ret = backlight_disable(panel->backlight); > + if (ret < 0) > + DRM_DEV_INFO(panel->dev, "failed to disable backlight: %d\n", ret); > + > if (panel->funcs && panel->funcs->disable) > return panel->funcs->disable(panel); > > @@ -289,6 +306,45 @@ struct drm_panel *of_drm_find_panel(const struct device_node *np) > EXPORT_SYMBOL(of_drm_find_panel); > #endif > > +#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE > +/** > + * drm_panel_of_backlight - use backlight device node for backlight > + * @panel: DRM panel > + * > + * Use this function to enable backlight handling if your panel > + * uses device tree and has a backlight phandle. > + * > + * When the panel is enabled backlight will be enabled after a > + * successfull call to &drm_panel_funcs.enable() > + * > + * When the panel is disabled backlight will be disabled before the > + * call to &drm_panel_funcs.disable(). > + * > + * A typical implementation for a panel driver supporting device tree > + * will call this function at probe time. Backlight will then be handled > + * transparently without requiring any intervention from the driver. > + * drm_panel_of_backlight() must be called after the call to drm_panel_init(). > + * > + * Return: 0 on success or a negative error code on failure. > + */ > +int drm_panel_of_backlight(struct drm_panel *panel) > +{ > + struct backlight_device *backlight; > + > + if (!panel || !panel->dev) > + return -EINVAL; > + > + backlight = devm_of_find_backlight(panel->dev); > + > + if (IS_ERR(backlight)) > + return PTR_ERR(backlight); > + > + panel->backlight = backlight; > + return 0; > +} > +EXPORT_SYMBOL(drm_panel_of_backlight); > +#endif > + > MODULE_AUTHOR("Thierry Reding "); > MODULE_DESCRIPTION("DRM panel infrastructure"); > MODULE_LICENSE("GPL and additional rights"); > diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h > index d71655b2634c..c751c9b17df0 100644 > --- a/include/drm/drm_panel.h > +++ b/include/drm/drm_panel.h > @@ -28,6 +28,7 @@ > #include > #include > > +struct backlight_device; > struct device_node; > struct drm_connector; > struct drm_device; > @@ -59,6 +60,10 @@ struct display_timing; > * > * To save power when no video data is transmitted, a driver can power down > * the panel. This is the job of the .unprepare() function. > + * > + * Backlight can be handled automatically if configured using > + * drm_panel_of_backlight(). Then the driver does not need to implement the > + * functionality to enable/disable backlight. > */ > struct drm_panel_funcs { > /** > @@ -146,6 +151,17 @@ struct drm_panel { > */ > struct device *dev; > > + /** > + * @backlight: > + * > + * Backlight device, used to turn on backlight after the call > + * to enable(), and to turn off backlight before the call to > + * disable(). > + * backlight is set by drm_panel_of_backlight() and drivers > + * shall not assign it. > + */ > + struct backlight_device *backlight; > + > /** > * @funcs: > * > @@ -197,4 +213,13 @@ static inline struct drm_panel *of_drm_find_panel(const struct device_node *np) > } > #endif > > +#if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE) > +int drm_panel_of_backlight(struct drm_panel *panel); > +#else > +static inline int drm_panel_of_backlight(struct drm_panel *panel) > +{ > + return 0; > +} > +#endif > + > #endif -- Regards, Laurent Pinchart _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 18F66C43603 for ; Mon, 9 Dec 2019 00:56:23 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id DD79F206F4 for ; Mon, 9 Dec 2019 00:56:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="ZY2lPwvr"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="T5cbUBsZ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DD79F206F4 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ideasonboard.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=GGDksl0OuOnuAh69bx340PQPojt82O2aR5LWRx1MVhQ=; b=ZY2lPwvr3LaHOc EFUVlqHo6PjpKdt8aTKsJJgZMjGOqCfg1ti3C7KmynO1zO9RbdGLI1Xuou3Fb0gyKeVlRDvy8D0AR 0k3bq9zB3V5/nksee4nSAHI905v/oJVP0PYWOfeBacunAFjuEjMttacraP43in7wNYkBWDPIHI/WN OvN9wikHYB2WynAr3gDBw0vQmov0Hi7oyWw2Pg+QAZgldyQwz560+YIWJM7uSO7h0C3l5/4ex79/U 5GCl/AoEwiVEw95XubhCj9YJVOUeIssYRz+Gw/F0ARuu016J9/1CI4VN8tK9UP66QFz0zl5HVa+s3 S6R/pga8pRnOFXNXU8Ug==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ie7LX-0007L3-0I; Mon, 09 Dec 2019 00:56:19 +0000 Received: from perceval.ideasonboard.com ([2001:4b98:dc2:55:216:3eff:fef7:d647]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ie7LH-00077B-6j; Mon, 09 Dec 2019 00:56:05 +0000 Received: from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi [81.175.216.236]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E011752B; Mon, 9 Dec 2019 01:56:00 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1575852961; bh=J6yIt17nBqwPKwVZXRtdxjHrhpUgI8Kou5WpdOIZ5YE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=T5cbUBsZJFEm8iBpxpsDzOaQbbEBdWh0bc55kfLncjhrFA90srpzIJTF5ep242mQO b5t70DxIKO2bWncxDKMv8rEKTqbMGB6Wc4rf0t1JrZ0hGjCETsQDuEAh6St3IsX09H Vk/pTQgLD1qS5KsBNhE3mVt1u8/X3js4Qn7p822U= Date: Mon, 9 Dec 2019 02:55:54 +0200 From: Laurent Pinchart To: Sam Ravnborg Subject: Re: [PATCH v2 02/25] drm/panel: add backlight support Message-ID: <20191209005554.GK14311@pendragon.ideasonboard.com> References: <20191207140353.23967-1-sam@ravnborg.org> <20191207140353.23967-3-sam@ravnborg.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20191207140353.23967-3-sam@ravnborg.org> User-Agent: Mutt/1.10.1 (2018-07-13) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20191208_165603_554460_19BA7985 X-CRM114-Status: GOOD ( 31.04 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Neil Armstrong , David Airlie , Linus Walleij , dri-devel@lists.freedesktop.org, Andrzej Hajda , Thierry Reding , Benjamin Gaignard , Stefan Agner , linux-samsung-soc@vger.kernel.org, linux-rockchip@lists.infradead.org, Tomi Valkeinen , NXP Linux Team , Jagan Teki , Jitao Shi , Pengutronix Kernel Team , Maarten Lankhorst , Maxime Ripard , linux-mediatek@lists.infradead.org, Abhinav Kumar , linux-tegra@vger.kernel.org, Maxime Ripard , Sean Paul , linux-arm-kernel@lists.infradead.org, Purism Kernel Team , linux-renesas-soc@vger.kernel.org, Boris Brezillon , Daniel Vetter Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi Sam, Thank you for the patch. On Sat, Dec 07, 2019 at 03:03:30PM +0100, Sam Ravnborg wrote: > Panels often supports backlight as specified in a device tree. s/supports/support/ > Update the drm_panel infrastructure to support this to > simplify the drivers. > > With this the panel driver just needs to add the following to the > probe() function: > > err = drm_panel_of_backlight(panel); > if (err) > return err; > > Then drm_panel will handle all the rest. > > There is one caveat with the backlight support. > If drm_panel_(enable|disable) are called multiple times > in row then backlight_(enable|disable) will be called multiple times. s/in row/in a row/ > The above will happen when a panel drivers unconditionally > calls drm_panel_disable() in their shutdown() function, > whan the panel is already disabled and then shutdown() is called. > > Reading the backlight code it seems safe to call > the backlight_(enable|disable) several times. > > v3: > - Improve comments, fix grammar (Laurent) > - Do not fail in drm_panel_of_backlight() if no DT support (Laurent) > - Log if backlight_(enable|disable) fails (Laurent) > - Improve drm_panel_of_backlight() docs > - Updated changelog with backlight analysis (triggered by Laurent) > > v2: > - Drop test of CONFIG_DRM_PANEL in header-file (Laurent) > - do not enable backlight if ->enable() returns an error > > Signed-off-by: Sam Ravnborg > Cc: Thierry Reding > Cc: Laurent Pinchart > Cc: Maarten Lankhorst > Cc: Maxime Ripard > Cc: Sean Paul > Cc: David Airlie > Cc: Daniel Vetter > --- > drivers/gpu/drm/drm_panel.c | 58 ++++++++++++++++++++++++++++++++++++- > include/drm/drm_panel.h | 25 ++++++++++++++++ > 2 files changed, 82 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c > index 4ab7229fb22b..c312d5eb214d 100644 > --- a/drivers/gpu/drm/drm_panel.c > +++ b/drivers/gpu/drm/drm_panel.c > @@ -21,11 +21,13 @@ > * DEALINGS IN THE SOFTWARE. > */ > > +#include > #include > #include > > #include > #include > +#include > > static DEFINE_MUTEX(panel_lock); > static LIST_HEAD(panel_list); > @@ -196,11 +198,20 @@ EXPORT_SYMBOL(drm_panel_unprepare); > */ > int drm_panel_enable(struct drm_panel *panel) > { > + int ret = 0; > + > if (!panel) > return -EINVAL; > > if (panel->funcs && panel->funcs->enable) > - return panel->funcs->enable(panel); > + ret = panel->funcs->enable(panel); > + > + if (ret < 0) > + return ret; You can move this within the above if () block and avoid initializing ret to 0: if (panel->funcs && panel->funcs->enable) { ret = panel->funcs->enable(panel); if (ret < 0) return ret; } With these small issues addressed, Reviewed-by: Laurent Pinchart > + ret = backlight_enable(panel->backlight); > + if (ret < 0) > + DRM_DEV_INFO(panel->dev, "failed to enable backlight: %d\n", ret); > > return 0; > } > @@ -218,9 +229,15 @@ EXPORT_SYMBOL(drm_panel_enable); > */ > int drm_panel_disable(struct drm_panel *panel) > { > + int ret; > + > if (!panel) > return -EINVAL; > > + ret = backlight_disable(panel->backlight); > + if (ret < 0) > + DRM_DEV_INFO(panel->dev, "failed to disable backlight: %d\n", ret); > + > if (panel->funcs && panel->funcs->disable) > return panel->funcs->disable(panel); > > @@ -289,6 +306,45 @@ struct drm_panel *of_drm_find_panel(const struct device_node *np) > EXPORT_SYMBOL(of_drm_find_panel); > #endif > > +#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE > +/** > + * drm_panel_of_backlight - use backlight device node for backlight > + * @panel: DRM panel > + * > + * Use this function to enable backlight handling if your panel > + * uses device tree and has a backlight phandle. > + * > + * When the panel is enabled backlight will be enabled after a > + * successfull call to &drm_panel_funcs.enable() > + * > + * When the panel is disabled backlight will be disabled before the > + * call to &drm_panel_funcs.disable(). > + * > + * A typical implementation for a panel driver supporting device tree > + * will call this function at probe time. Backlight will then be handled > + * transparently without requiring any intervention from the driver. > + * drm_panel_of_backlight() must be called after the call to drm_panel_init(). > + * > + * Return: 0 on success or a negative error code on failure. > + */ > +int drm_panel_of_backlight(struct drm_panel *panel) > +{ > + struct backlight_device *backlight; > + > + if (!panel || !panel->dev) > + return -EINVAL; > + > + backlight = devm_of_find_backlight(panel->dev); > + > + if (IS_ERR(backlight)) > + return PTR_ERR(backlight); > + > + panel->backlight = backlight; > + return 0; > +} > +EXPORT_SYMBOL(drm_panel_of_backlight); > +#endif > + > MODULE_AUTHOR("Thierry Reding "); > MODULE_DESCRIPTION("DRM panel infrastructure"); > MODULE_LICENSE("GPL and additional rights"); > diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h > index d71655b2634c..c751c9b17df0 100644 > --- a/include/drm/drm_panel.h > +++ b/include/drm/drm_panel.h > @@ -28,6 +28,7 @@ > #include > #include > > +struct backlight_device; > struct device_node; > struct drm_connector; > struct drm_device; > @@ -59,6 +60,10 @@ struct display_timing; > * > * To save power when no video data is transmitted, a driver can power down > * the panel. This is the job of the .unprepare() function. > + * > + * Backlight can be handled automatically if configured using > + * drm_panel_of_backlight(). Then the driver does not need to implement the > + * functionality to enable/disable backlight. > */ > struct drm_panel_funcs { > /** > @@ -146,6 +151,17 @@ struct drm_panel { > */ > struct device *dev; > > + /** > + * @backlight: > + * > + * Backlight device, used to turn on backlight after the call > + * to enable(), and to turn off backlight before the call to > + * disable(). > + * backlight is set by drm_panel_of_backlight() and drivers > + * shall not assign it. > + */ > + struct backlight_device *backlight; > + > /** > * @funcs: > * > @@ -197,4 +213,13 @@ static inline struct drm_panel *of_drm_find_panel(const struct device_node *np) > } > #endif > > +#if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE) > +int drm_panel_of_backlight(struct drm_panel *panel); > +#else > +static inline int drm_panel_of_backlight(struct drm_panel *panel) > +{ > + return 0; > +} > +#endif > + > #endif -- Regards, Laurent Pinchart _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel