From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?Q?Noralf_Tr=c3=b8nnes?= Subject: Re: [PATCH v2] drm/tinydrm: Move backlight helpers to a separate file Date: Tue, 26 Sep 2017 15:06:06 +0200 Message-ID: <938e964a-9b4e-b9fe-fdcc-a04d24f3a330@tronnes.org> References: <20170922150935.GA15912@meghana-HP-Pavilion-Notebook> <3dd313c8-daa7-a395-183c-c2dfac4dd4b4@tronnes.org> <20170926111650.GA7624@meghana-HP-Pavilion-Notebook> <20170926113214.ahxqmqspsd3olu73@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from smtp.domeneshop.no (smtp.domeneshop.no [IPv6:2a01:5b40:0:3005::1]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7F7356E4D6 for ; Tue, 26 Sep 2017 13:06:13 +0000 (UTC) In-Reply-To: <20170926113214.ahxqmqspsd3olu73@phenom.ffwll.local> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Daniel Vetter , Meghana Madhyastha Cc: outreachy-kernel , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org CkRlbiAyNi4wOS4yMDE3IDEzLjMyLCBza3JldiBEYW5pZWwgVmV0dGVyOgo+IE9uIFR1ZSwgU2Vw IDI2LCAyMDE3IGF0IDA0OjQ2OjUzUE0gKzA1MzAsIE1lZ2hhbmEgTWFkaHlhc3RoYSB3cm90ZToK Pj4gT24gTW9uLCBTZXAgMjUsIDIwMTcgYXQgMDY6MzE6NThQTSArMDIwMCwgTm9yYWxmIFRyw7hu bmVzIHdyb3RlOgo+Pj4gRGVuIDI1LjA5LjIwMTcgMTYuNTYsIHNrcmV2IE5vcmFsZiBUcsO4bm5l czoKPj4+PiBIaSBNZWdoYW5hLAo+Pj4+Cj4+Pj4KPj4+PiBEZW4gMjIuMDkuMjAxNyAxNy4wOSwg c2tyZXYgTWVnaGFuYSBNYWRoeWFzdGhhOgo+Pj4+PiBNb3ZlIGJhY2tsaWdodCBoZWxwZXJzIGZy b20gdGlueWRybS1oZWxwZXJzLmMgdG8KPj4+Pj4gdGlueWRybS1iYWNrbGlnaHQuYy4gVGhpcyBp cyBiZWNhdXNlIGl0IGlzIG9yZ2FuaXphdGlvbmFsbHkKPj4+Pj4gc2ltcGxlciB0byB1bmRlcnN0 YW5kIGFuZCBhZHZhbnRhZ2VvdXMgdG8gZ3JvdXAgZnVuY3Rpb25zCj4+Pj4+IHBlcmZvcm1pbmcg YSBzaW1pbGFyIGZ1bmN0aW9uIHRvIGEgc2VwYXJhdGUgZmlsZSBhcyBvcHBvc2VkIHRvCj4+Pj4+ IGhhdmluZyBvbmUgaGVscGVyIGZpbGUgd2l0aCBoZXRlcmVnZW5vdXMgaGVscGVyIGZ1bmN0aW9u cy4KPj4+Pj4KPj4+Pj4gU2lnbmVkLW9mZi1ieTogTWVnaGFuYSBNYWRoeWFzdGhhIDxtZWdoYW5h Lm1hZGh5YXN0aGFAZ21haWwuY29tPgo+Pj4+PiAtLS0KPj4+PiBJIGRvbid0IHRoaW5rIHRoZXJl IGlzIG11Y2ggZ2FpbiBpbiBqdXN0IG1vdmluZyB0aGUgY29kZSBsaWtlIHRoaXMuCj4+Pj4KPj4+ PiBUaGUgaWRlYSBpcyB0byBhZGQgYSBkcm1fYmFja2xpZ2h0IGhlbHBlciB0aGF0IGNhbiBiZSB1 c2VmdWwgZm9yIGFsbAo+Pj4+IERSTSBkcml2ZXJzIHRoYXQgdXNlIHRoZSBiYWNrbGlnaHQgc3Vi c3lzdGVtLgo+PiBZZXMgSSBhZ3JlZS4gVGhhdCBkZWZpbml0ZWx5IG1ha2VzIG1vcmUgc2Vuc2Uu Cj4+PiBUaGUgZnVsbCBwYXRoIHRvIHRoYXQgaGVscGVyIHdvdWxkIGJlOgo+Pj4gZHJpdmVycy9n cHUvZHJtL2RybV9iYWNrbGlnaHQuYwo+Pj4KPj4+PiBUaGlzIGlzIHdoYXQgdGhlIFRPRE8gc2F5 czoKPj4+PiBodHRwczovL2RyaS5mcmVlZGVza3RvcC5vcmcvZG9jcy9kcm0vZ3B1L3RvZG8uaHRt bCN0aW55ZHJtCj4+Pj4KPj4+PiAtIGJhY2tsaWdodCBoZWxwZXJzLCBwcm9iYWJseSBiZXN0IHRv IHB1dCB0aGVtIGludG8gYSBuZXcgZHJtX2JhY2tsaWdodC5jLgo+Pj4+ICDCoCBUaGlzIGlzIGJl Y2F1c2UgZHJpdmVycy92aWRlbyBpcyBkZS1mYWN0byB1bm1haW50YWluZWQuIFdlIGNvdWxkIGFs c28KPj4+PiAgwqAgbW92ZSBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodCB0byBkcml2ZXJzL2dwdS9i YWNrbGlnaHQgYW5kIHRha2UgaXQgYWxsCj4+Pj4gIMKgIG92ZXIgd2l0aGluIGRybS1taXNjLCBi dXQgdGhhdOKAmXMgbW9yZSB3b3JrLgo+Pj4+Cj4+Pj4gVGhlcmUgaXMgYWxzbyB0aGlzIGRpc2N1 c3Npb24gdG8gdGFrZSBpbnRvIGFjY291bnQ6Cj4+Pj4gS01TIGJhY2tsaWdodCBBQkkgcHJvcG9z aXRpb24KPj4+PiBodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kcmktZGV2 ZWwvMjAxNy1GZWJydWFyeS8xMzMyMDYuaHRtbAo+Pj4+Cj4+Pj4KPj4+PiBJIGRvbid0IHJlbWVt YmVyIHdoYXQgY2FtZSBvdXQgb2YgdGhhdCBkaXNjdXNzaW9uLgo+Pj4+Cj4+Pj4gTm9yYWxmLgo+ PiBBZnRlciBoYXZpbmcgZGlzY3Vzc2VkIHRoaXMgd2l0aCBEYW5pZWwgb24gdGhlICNkcmktZGV2 ZWwgaXJjIGNoYW5uZWwsCj4+IGhlcmUgYXJlIHNvbWUgb2YgdGhlIHBvaW50cyBzdWdnZXN0ZWQu Cj4+Cj4+IERhbmllbCBzdWdnZXN0ZWQgdGhhdCBJIGZpcnN0IGxvb2sgaW50byB0aGUgdXNhZ2Ug b2Ygc2hhcmVkIGJhY2tsaWdodAo+PiBoZWxwZXJzIGluIGRybSAoc3BlY2lmaWNhbGx5IGJhY2ts aWdodF91cGRhdGVfc3RhdHVzIHRvIGJlZ2luIHdpdGgpLiBUaGUgaWRlYQo+PiB3YXMgdG8gc2Vl IHdoZXRoZXIgdGhlcmUgaXMgYW55IHBhdHRlcm4gaW4gdXNhZ2UgYW5kL29yIGNvZGUgZHVwaWNh dGlvbi4KPj4gSWYgdGhlcmUgaXMsIHRoZW4gdGhlIG5leHQgc3RlcCB3b3VsZCBiZSB0byB3cml0 ZSBoZWxwZXIgZnVuY3Rpb25zIHdoaWNoCj4+IGNhbiBiZSB1c2VkIGJ5IG90aGVyIGRyaXZlcnMg KGFuZCBub3QganVzdCB0aW55ZHJtKS4KPj4KPj4gVG8gc3RhcnQgd2l0aCwgSSB3ZW50IHRocm91 Z2ggdGhlIGluc3RhbmNlcyBvZiBiYWNrbGlnaHRfdXBkYXRlX3N0YXR1cwo+PiBpbiB0aGUgZHJt IGNvZGUsIGFuZCBtYWRlIHRoZSBmb2xsb3dpbmcgb2JzZXJ2YXRpb25zKG1vc3Qgb2YgdGhlbSBh cmUKPj4gdmVyeSBzaW1wbGUvbmFpdmUgb2JzZXJ2YXRpb25zKS4KPj4KPj4gLSBiYWNrbGlnaHRf dXBkYXRlX3N0YXR1cyBpcyB1c3VhbGx5IGNhbGxlZCBpbiBiYWNrbGlnaHQgaW5pdCAoYW5kCj4+ ICAgIHNvbWV0aW1lcyBleGl0KSBmdW5jdGlvbnMgb2YgdGhlIGRyaXZlcnMganVzdCBhZnRlciB0 aGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQuCj4+ICAgIFNvIGJhY2tsaWdodF91cGRhdGVfc3RhdHVz IGlzIGNhbGxlZCB3aXRoIHRoZSByZWdpc3RlcmVkIGRldmljZSBhcyB0aGUKPj4gICAgcGFyYW1l dGVyLgo+Pgo+PiBIZXJlIGFyZSB0aGUgZm9sbG93aW5nIGNhc2VzIG9mIHByb3BlcnRpZXMgY2hh bmdlZC9zZXQgYmVmb3JlCj4+IGJhY2tsaWdodF91cGRhdGVfc3RhdHVzIGlzIGNhbGxlZC4KPj4K Pj4gLSBDQVNFIDE6IEJyaWdodG5lc3MgaXMgY2hhbmdlZCAoZWl0aGVyIGEgbWFjcm8gQlJJR0hU TkVTU19NQVhfTEVWRUwgMTAwCj4+ICAgIGlzIGRlZmluZWQgb3IgaXQgaXMgbWFudWFsbHkgc2V0 KSBUaGlzIGhhcHBlbnMgaW4gdGhlIGZvbGxvd2luZyBmaWxlczoKPj4KPj4gICAgZ21hNTAwL2Nk dl9kZXZpY2UuYywgZ21hNTAwL21kZmxkX2RldmljZS5jLCBnbWE1MDAvb2FrdHJhaWxfZGV2aWNl LmMsCj4+ICAgIGdtYTUwMC9wc2JfZGV2aWNlLmMsIG5vdmVhdS9ub3ZlYXVfYmFja2xpZ2h0LmMo aGVyZSBicmlnaHRuZXNzIGlzIGRldGVybWluZWQgYnkgZnVjdGlvbgo+PiAgICBzdGF0aWMgaW50 IG52NTBfZ2V0X2ludGVuc2l0eSkKPj4KPj4gLSBDQVNFIDI6IFBvd2VyIHByb3BlcnR5IGlzIHNl dCAodG8gRkJfQkxBTktfVU5CTEFOSyBtb3N0bHkpCj4+ICAgIFRoaXMgaGFwcGVucyBpbiB0aGUg Zm9sbG93aW5nIGZpbGVzOgo+Pgo+PiAgICBvbWFwZHJtL2Rpc3BsYXlzL3BhbmVsLWRwaS5jLCBw YW5lbC9wYW5lbC1pbm5vbHV4LXAwNzl6Y2EuYywKPj4gICAgcGFuZWwvcGFuZWwtamRpLWx0MDcw bWUwNTAwMC5jLCBwYW5lbC9wYW5lbC1zaGFycC1scTEwMXIxc3gwMS5jLAo+PiAgICBwYW5lbC9w YW5lbC1zaGFycC1sczA0M3QxbGUwMS5jLCB0aWxjZGMvdGlsY2RjX3BhbmVsLmMKPj4gICAgCj4+ IC0gQ0FTRSAzOiBTdGF0ZSBpcyBzZXQKPj4gICAgVGhpcyBoYXBwZW5zIGluIHRoZSBmb2xsb3dp bmcgZmlsZXM6Cj4+Cj4+ICAgIHRpbnlkcm0vdGlueWRybS1oZWxwZXJzLmMKPj4KPj4gLSBDQVNF IDQ6IFBvd2VyIGFuZCBicmlnaHRuZXNzIHByb3BlcnRpZXMgYXJlIHNldAo+PiAgICBUaGlzIGhh cHBlbnMgaW4gdGhlIGZvbGxvd2luZyBmaWxlczoKPj4KPj4gICAgYXRvbWJpb3NfZW5jb2RlcnMu YywgcmFkZW9uL3JhZGVvbl9sZWdhY3lfZW5jb2RlcnMuYywKPj4gICAgc2htb2JpbGUvc2htb2Jf ZHJtX2JhY2tsaWdodC5jCj4+Cj4+IC0gQ0FTRSA1OiBQb3dlciBhbmQgdGhlIHN0YXRlIHByb3Bl cnRpZXMgYXJlIHNldAo+PiAgICBUaGlzIGhhcHBlbnMgaW4gdGhlIGZvbGxvd2luZyBmaWxlczoK Pj4KPj4gICAgcGFuZWwvcGFuZWwtbHZkcy5jLCBwYW5lbC9wYW5lbC1wYW5hc29uaWMtdnZ4MTBm MDM0bjAwLmMsCj4+ICAgIHBhbmVsL3BhbmVsLXNpbXBsZS5jLCBwYW5lbC9wYW5lbC1zaXRyb25p eC1zdDc3ODl2LmMKPj4KPj4gUGxlYXNlIGxldCBtZSBrbm93IGlmIEkgYW0gd3JvbmcgLyBtaXNz ZWQgc29tZXRoaW5nLiBBcyBmb3IgbmV4dCBzdGVwcywKPj4gd291bGRuJ3QgaXQgYmUgYW4gb3Zl cmtpbGwgdG8gaGF2ZSBhIHNlcGFyYXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgZWFjaAo+PiBvZiB0 aGVzZSBjYXNlcyA/IFBlcmhhcHMgYSBnZW5lcmljIGhlbHBlciBmdW5jdGlvbiB3aGljaCB3b3Vs ZCBzb21laG93Cj4+IGFkZHJlc3MgdGhlc2UgY2FzZXMgd291bGQgYmUgbW9yZSBhcHByb3ByaWF0 ZSA/IFRoYW5rIHlvdSBmb3IgeW91cgo+PiB0aW1lL3BhdGllbmNlLgo+IEkgc3VzcGVjdCB0aGF0 IGEgbG90IG9mIHRoZXNlIGNvbWJpbmF0aW9ucyBhcmUganVzdCBwbGFpbiB3cm9uZywgYnV0Cj4g aGFwcGVuIHRvIGtpbmRhIHdvcmsgd2l0aCB0aGUgY29tYmluYXRpb24gb2YgZ3B1IGRyaXZlciBh bmQgYmFja2xpZ2h0Cj4gZHJpdmVyIHRoZXkncmUgdXNlZCBvbi4gdGJoIEkgaGF2ZSBubyBpZGVh IHdoaWNoIG9uZSBpcyB0aGUgY29ycmVjdAo+IHZlcnNpb24gZm9yIGVuYWJsaW5nIGEgYmFja2xp Z2h0IGNvcnJlY3RseSAuLi4KPgo+IFNvIGRlZmluaXRlbHkgYSBnb29kIHRhc2sgdG8gcmVmYWN0 b3IgdGhpcyBpbnRvIGEgcHJvcGVyIGhlbHBlciwgYnV0IGxvb2tzCj4gYSBsb3QgbW9yZSBpbnZv bHZlZCB0aGFuIGF0IGZpcnN0IHNpZ2h0LgoKQmFja2xpZ2h0IGlzIHRyaWNreS4KCk9uZSBhbm5v eWluZyB0aGluZyBmcm9tIGEgRFJNIHBvaW50IG9mIHZpZXcgaXMgdGhhdCBpdCdzIHRpZWQgdG8g ZmJkZXYKd2l0aCBhIG5vdGlmaWVyIGZiX25vdGlmaWVyX2NhbGxiYWNrKCkgdGhhdCB0dXJucyBp dCBvZmYgb24KRkJfRVZFTlRfQkxBTksgYW5kIEZCX0VWRU5UX0NPTkJMQU5LLiBBbmQgdGhlIGxv Z2ljIGluIHRoYXQgZnVuY3Rpb24gaXMKdmVyeSBjb252b2x1dGVkLgoKQW5kIGlmIHdlIGxvb2sg YXQgdGhlIGdwaW8gYmFja2xpZ2h0IGRyaXZlciwgd2Ugc2VlIHRoYXQgdGhlcmUgYXJlCjMgcHJv cGVydGllcyB0aGF0IHR1cm4gb2ZmIHRoZSBiYWNrbGlnaHQ6CgpzdGF0aWMgaW50IGdwaW9fYmFj a2xpZ2h0X3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsKQp7CiDCoMKg wqAgc3RydWN0IGdwaW9fYmFja2xpZ2h0ICpnYmwgPSBibF9nZXRfZGF0YShibCk7CiDCoMKgwqAg aW50IGJyaWdodG5lc3MgPSBibC0+cHJvcHMuYnJpZ2h0bmVzczsKCiDCoMKgwqAgaWYgKGJsLT5w cm9wcy5wb3dlciAhPSBGQl9CTEFOS19VTkJMQU5LIHx8CiDCoMKgwqAgwqDCoMKgIGJsLT5wcm9w cy5mYl9ibGFuayAhPSBGQl9CTEFOS19VTkJMQU5LIHx8CiDCoMKgwqAgwqDCoMKgIGJsLT5wcm9w cy5zdGF0ZSAmIChCTF9DT1JFX1NVU1BFTkRFRCB8IEJMX0NPUkVfRkJCTEFOSykpCiDCoMKgwqAg wqDCoMKgIGJyaWdodG5lc3MgPSAwOwoKIMKgwqDCoCBncGlvZF9zZXRfdmFsdWVfY2Fuc2xlZXAo Z2JsLT5ncGlvZCwgYnJpZ2h0bmVzcyk7CgogwqDCoMKgIHJldHVybiAwOwp9CgpUaGlzIG1heSBh Y2NvdW50IGZvciB0aGUgZGlmZmVyZW50IHdheXMgb2YgY29udHJvbGxpbmcgYmFja2xpZ2h0IGlu IERSTS4KClNvbWUgb3RoZXIgYXNwZWN0czoKLSBUaGUgYmFja2xpZ2h0IGRldmljZSBoYXMgaXQn cyBvd24gc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb25zLgotIHN5c3RlbWQgdHJpZXMgdG8gYmUgc21h cnQgYW5kIHR1cm4gb24vb2ZmIGJhY2tsaWdodCwgYnV0IHRoYXQgaXMganVzdAogwqAgYW5ub3lp bmcgd2l0aCB0aW55ZHJtIGRyaXZlcnMgdGhhdCBhcmUgbG9hZGVkIGxhdGUgc2luY2UgaXQgdHVy bnMgb24KIMKgIGFuIHVuaW5pdGlhbGl6ZWQgZGlzcGxheS4gRGlzYWJsaW5nIHRoZSBzZXJ2aWNl IGZpeGVzIGl0LgoKTm9yYWxmLgoKPiBEbyB5b3UgaGF2ZSBhbnkgb2YgdGhlIGhhcmR3YXJlIHN1 cHBvcnRlZCBieSBhbnkgb2YgdGhlc2UgZHJpdmVycz8gbHNtb2QKPiBhbmQgdGhlbiBjb21wYXJp bmcgd2l0aCB0aGUgbW9kdWxlcyB5b3UncmUgYnVpbGRpbmcgaW4geW91ciBvd24gdHJlZQo+IHNo b3VsZCBoZWxwIHlvdSBmaWd1cmUgdGhpcyBvdXQuCj4gLURhbmllbAo+Cj4+IC1NZWdoYW5hCj4+ Cj4+Pj4+IENoYW5nZXMgaW4gdjI6Cj4+Pj4+ICDCoCAtSW1wcm92ZWQgY29tbWl0IG1lc3NhZ2Ug YnkgZXhwbGFpbmluZyB3aHkgdGhlIGNoYW5nZXMgd2VyZSBtYWRlLgo+Pj4+Pgo+Pj4+PiAgwqAg ZHJpdmVycy9ncHUvZHJtL3Rpbnlkcm0vY29yZS9NYWtlZmlsZcKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgfMKgwqAgMiArLQo+Pj4+PiAgwqAgZHJpdmVycy9ncHUvZHJtL3Rpbnlkcm0vY29yZS90aW55 ZHJtLWJhY2tsaWdodC5jIHwgMTAzCj4+Pj4+ICsrKysrKysrKysrKysrKysrKysrKysrCj4+Pj4+ ICDCoCBkcml2ZXJzL2dwdS9kcm0vdGlueWRybS9jb3JlL3Rpbnlkcm0taGVscGVycy5jwqDCoCB8 wqAgOTQKPj4+Pj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+Pj4+ICDCoCBkcml2ZXJzL2dwdS9k cm0vdGlueWRybS9taTAyODNxdC5jwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoCAx ICsKPj4+Pj4gIMKgIGRyaXZlcnMvZ3B1L2RybS90aW55ZHJtL21pcGktZGJpLmPCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKgIDEgKwo+Pj4+PiAgwqAgaW5jbHVkZS9kcm0vdGlueWRy bS90aW55ZHJtLWJhY2tsaWdodC5owqDCoMKgwqDCoMKgwqDCoMKgIHzCoCAxOCArKysrCj4+Pj4+ ICDCoCA2IGZpbGVzIGNoYW5nZWQsIDEyNCBpbnNlcnRpb25zKCspLCA5NSBkZWxldGlvbnMoLSkK Pj4+Pj4gIMKgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vdGlueWRybS9jb3Jl L3Rpbnlkcm0tYmFja2xpZ2h0LmMKPj4+Pj4gIMKgIGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRl L2RybS90aW55ZHJtL3Rpbnlkcm0tYmFja2xpZ2h0LmgKPj4+Pj4KPj4+Pj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS90aW55ZHJtL2NvcmUvTWFrZWZpbGUKPj4+Pj4gYi9kcml2ZXJzL2dw dS9kcm0vdGlueWRybS9jb3JlL01ha2VmaWxlCj4+Pj4+IGluZGV4IGZiMjIxZTYuLjM4OWNhN2Eg MTAwNjQ0Cj4+Pj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS90aW55ZHJtL2NvcmUvTWFrZWZpbGUK Pj4+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3Rpbnlkcm0vY29yZS9NYWtlZmlsZQo+Pj4+PiBA QCAtMSwzICsxLDMgQEAKPj4+Pj4gLXRpbnlkcm0teSA6PSB0aW55ZHJtLWNvcmUubyB0aW55ZHJt LXBpcGUubyB0aW55ZHJtLWhlbHBlcnMubwo+Pj4+PiArdGlueWRybS15IDo9IHRpbnlkcm0tY29y ZS5vIHRpbnlkcm0tcGlwZS5vIHRpbnlkcm0tYmFja2xpZ2h0Lm8KPj4+Pj4gdGlueWRybS1oZWxw ZXJzLm8KPj4+Pj4gIMKgIMKgIG9iai0kKENPTkZJR19EUk1fVElOWURSTSkgKz0gdGlueWRybS5v Cj4+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGlueWRybS9jb3JlL3Rpbnlkcm0t YmFja2xpZ2h0LmMKPj4+Pj4gYi9kcml2ZXJzL2dwdS9kcm0vdGlueWRybS9jb3JlL3Rpbnlkcm0t YmFja2xpZ2h0LmMKPj4+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4+Pj4gaW5kZXggMDAwMDAw MC4uZGM2ZjE3ZAo+Pj4+PiAtLS0gL2Rldi9udWxsCj4+Pj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2Ry bS90aW55ZHJtL2NvcmUvdGlueWRybS1iYWNrbGlnaHQuYwo+Pj4+PiBAQCAtMCwwICsxLDEwMyBA QAo+Pj4+PiArI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgo+Pj4+PiArI2luY2x1ZGUgPGxp bnV4L2RtYS1idWYuaD4KPj4+Pj4gKyNpbmNsdWRlIDxsaW51eC9wbS5oPgo+Pj4+PiArI2luY2x1 ZGUgPGxpbnV4L3N3YWIuaD4KPj4+Pj4gKwo+Pj4+PiArI2luY2x1ZGUgPGRybS90aW55ZHJtL3Rp bnlkcm0uaD4KPj4+Pj4gKyNpbmNsdWRlIDxkcm0vdGlueWRybS90aW55ZHJtLWJhY2tsaWdodC5o Pgo+Pj4+PiArCj4+Pj4+ICsvKioKPj4+Pj4gKyAqIHRpbnlkcm1fb2ZfZmluZF9iYWNrbGlnaHQg LSBGaW5kIGJhY2tsaWdodCBkZXZpY2UgaW4gZGV2aWNlLXRyZWUKPj4+Pj4gKyAqIEBkZXY6IERl dmljZQo+Pj4+PiArICoKPj4+Pj4gKyAqIFRoaXMgZnVuY3Rpb24gbG9va3MgZm9yIGEgRFQgbm9k ZSBwb2ludGVkIHRvIGJ5IGEgcHJvcGVydHkgbmFtZWQKPj4+Pj4gJ2JhY2tsaWdodCcKPj4+Pj4g KyAqIGFuZCB1c2VzIG9mX2ZpbmRfYmFja2xpZ2h0X2J5X25vZGUoKSB0byBnZXQgdGhlIGJhY2ts aWdodCBkZXZpY2UuCj4+Pj4+ICsgKiBBZGRpdGlvbmFsbHkgaWYgdGhlIGJyaWdodG5lc3MgcHJv cGVydHkgaXMgemVybywgaXQgaXMgc2V0IHRvCj4+Pj4+ICsgKiBtYXhfYnJpZ2h0bmVzcy4KPj4+ Pj4gKyAqCj4+Pj4+ICsgKiBSZXR1cm5zOgo+Pj4+PiArICogTlVMTCBpZiB0aGVyZSdzIG5vIGJh Y2tsaWdodCBwcm9wZXJ0eS4KPj4+Pj4gKyAqIEVycm9yIHBvaW50ZXIgLUVQUk9CRV9ERUZFUiBp ZiB0aGUgRFQgbm9kZSBpcyBmb3VuZCwgYnV0IG5vCj4+Pj4+IGJhY2tsaWdodCBkZXZpY2UKPj4+ Pj4gKyAqIGlzIGZvdW5kLgo+Pj4+PiArICogSWYgdGhlIGJhY2tsaWdodCBkZXZpY2UgaXMgZm91 bmQsIGEgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIGlzCj4+Pj4+IHJldHVybmVkLgo+Pj4+PiAr ICovCj4+Pj4+ICsKPj4+Pj4gK3N0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICp0aW55ZHJtX29mX2Zp bmRfYmFja2xpZ2h0KHN0cnVjdCBkZXZpY2UgKmRldikKPj4+Pj4gK3sKPj4+Pj4gK8KgwqDCoCBz dHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmFja2xpZ2h0Owo+Pj4+PiArwqDCoMKgIHN0cnVjdCBk ZXZpY2Vfbm9kZSAqbnA7Cj4+Pj4+ICsKPj4+Pj4gK8KgwqDCoCBucCA9IG9mX3BhcnNlX3BoYW5k bGUoZGV2LT5vZl9ub2RlLCAiYmFja2xpZ2h0IiwgMCk7Cj4+Pj4+ICvCoMKgwqAgaWYgKCFucCkK Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBOVUxMOwo+Pj4+PiArCj4+Pj4+ICvCoMKgwqAg YmFja2xpZ2h0ID0gb2ZfZmluZF9iYWNrbGlnaHRfYnlfbm9kZShucCk7Cj4+Pj4+ICvCoMKgwqAg b2Zfbm9kZV9wdXQobnApOwo+Pj4+PiArCj4+Pj4+ICvCoMKgwqAgaWYgKCFiYWNrbGlnaHQpCj4+ Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gRVJSX1BUUigtRVBST0JFX0RFRkVSKTsKPj4+Pj4g Kwo+Pj4+PiArwqDCoMKgIGlmICghYmFja2xpZ2h0LT5wcm9wcy5icmlnaHRuZXNzKSB7Cj4+Pj4+ ICvCoMKgwqDCoMKgwqDCoCBiYWNrbGlnaHQtPnByb3BzLmJyaWdodG5lc3MgPSBiYWNrbGlnaHQt PnByb3BzLm1heF9icmlnaHRuZXNzOwo+Pj4+PiArwqDCoMKgwqDCoMKgwqAgRFJNX0RFQlVHX0tN UygiQmFja2xpZ2h0IGJyaWdodG5lc3Mgc2V0IHRvICVkXG4iLAo+Pj4+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBiYWNrbGlnaHQtPnByb3BzLmJyaWdodG5lc3MpOwo+Pj4+ PiArwqDCoMKgIH0KPj4+Pj4gKwo+Pj4+PiArwqDCoMKgIHJldHVybiBiYWNrbGlnaHQ7Cj4+Pj4+ ICt9Cj4+Pj4+ICtFWFBPUlRfU1lNQk9MKHRpbnlkcm1fb2ZfZmluZF9iYWNrbGlnaHQpOwo+Pj4+ PiArCj4+Pj4+ICsvKioKPj4+Pj4gKyAqIHRpbnlkcm1fZW5hYmxlX2JhY2tsaWdodCAtIEVuYWJs ZSBiYWNrbGlnaHQgaGVscGVyCj4+Pj4+ICsgKiBAYmFja2xpZ2h0OiBCYWNrbGlnaHQgZGV2aWNl Cj4+Pj4+ICsgKgo+Pj4+PiArICogUmV0dXJuczoKPj4+Pj4gKyAqIFplcm8gb24gc3VjY2Vzcywg bmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgo+Pj4+PiArICovCj4+Pj4+ICtpbnQgdGlu eWRybV9lbmFibGVfYmFja2xpZ2h0KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiYWNrbGlnaHQp Cj4+Pj4+ICt7Cj4+Pj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IG9sZF9zdGF0ZTsKPj4+Pj4gK8Kg wqDCoCBpbnQgcmV0Owo+Pj4+PiArCj4+Pj4+ICvCoMKgwqAgaWYgKCFiYWNrbGlnaHQpCj4+Pj4+ ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4+Pj4gKwo+Pj4+PiArwqDCoMKgIG9sZF9zdGF0 ZSA9IGJhY2tsaWdodC0+cHJvcHMuc3RhdGU7Cj4+Pj4+ICvCoMKgwqAgYmFja2xpZ2h0LT5wcm9w cy5zdGF0ZSAmPSB+QkxfQ09SRV9GQkJMQU5LOwo+Pj4+PiArwqDCoMKgIERSTV9ERUJVR19LTVMo IkJhY2tsaWdodCBzdGF0ZTogMHgleCAtPiAweCV4XG4iLCBvbGRfc3RhdGUsCj4+Pj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBiYWNrbGlnaHQtPnByb3BzLnN0YXRlKTsKPj4+Pj4gKwo+ Pj4+PiArwqDCoMKgIHJldCA9IGJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGJhY2tsaWdodCk7Cj4+ Pj4+ICvCoMKgwqAgaWYgKHJldCkKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgIERSTV9FUlJPUigiRmFp bGVkIHRvIGVuYWJsZSBiYWNrbGlnaHQgJWRcbiIsIHJldCk7Cj4+Pj4+ICsKPj4+Pj4gK8KgwqDC oCByZXR1cm4gcmV0Owo+Pj4+PiArfQo+Pj4+PiArRVhQT1JUX1NZTUJPTCh0aW55ZHJtX2VuYWJs ZV9iYWNrbGlnaHQpOwo+Pj4+PiArCj4+Pj4+ICsvKioKPj4+Pj4gKyAqIHRpbnlkcm1fZGlzYWJs ZV9iYWNrbGlnaHQgLSBEaXNhYmxlIGJhY2tsaWdodCBoZWxwZXIKPj4+Pj4gKyAqIEBiYWNrbGln aHQ6IEJhY2tsaWdodCBkZXZpY2UKPj4+Pj4gKyAqCj4+Pj4+ICsgKiBSZXR1cm5zOgo+Pj4+PiAr ICogWmVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCj4+Pj4+ ICsgKi8KPj4+Pj4gK2ludCB0aW55ZHJtX2Rpc2FibGVfYmFja2xpZ2h0KHN0cnVjdCBiYWNrbGln aHRfZGV2aWNlICpiYWNrbGlnaHQpCj4+Pj4+ICt7Cj4+Pj4+ICvCoMKgwqAgdW5zaWduZWQgaW50 IG9sZF9zdGF0ZTsKPj4+Pj4gK8KgwqDCoCBpbnQgcmV0Owo+Pj4+PiArCj4+Pj4+ICvCoMKgwqAg aWYgKCFiYWNrbGlnaHQpCj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4+Pj4gKwo+ Pj4+PiArwqDCoMKgIG9sZF9zdGF0ZSA9IGJhY2tsaWdodC0+cHJvcHMuc3RhdGU7Cj4+Pj4+ICvC oMKgwqAgYmFja2xpZ2h0LT5wcm9wcy5zdGF0ZSB8PSBCTF9DT1JFX0ZCQkxBTks7Cj4+Pj4+ICvC oMKgwqAgRFJNX0RFQlVHX0tNUygiQmFja2xpZ2h0IHN0YXRlOiAweCV4IC0+IDB4JXhcbiIsIG9s ZF9zdGF0ZSwKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJhY2tsaWdodC0+cHJv cHMuc3RhdGUpOwo+Pj4+PiArwqDCoMKgIHJldCA9IGJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGJh Y2tsaWdodCk7Cj4+Pj4+ICvCoMKgwqAgaWYgKHJldCkKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgIERS TV9FUlJPUigiRmFpbGVkIHRvIGRpc2FibGUgYmFja2xpZ2h0ICVkXG4iLCByZXQpOwo+Pj4+PiAr Cj4+Pj4+ICvCoMKgwqAgcmV0dXJuIHJldDsKPj4+Pj4gK30KPj4+Pj4gK0VYUE9SVF9TWU1CT0wo dGlueWRybV9kaXNhYmxlX2JhY2tsaWdodCk7Cj4+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vdGlueWRybS9jb3JlL3Rpbnlkcm0taGVscGVycy5jCj4+Pj4+IGIvZHJpdmVycy9ncHUv ZHJtL3Rpbnlkcm0vY29yZS90aW55ZHJtLWhlbHBlcnMuYwo+Pj4+PiBpbmRleCBiZDZjY2UwLi5l ZThhZDhjIDEwMDY0NAo+Pj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vdGlueWRybS9jb3JlL3Rp bnlkcm0taGVscGVycy5jCj4+Pj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS90aW55ZHJtL2NvcmUv dGlueWRybS1oZWxwZXJzLmMKPj4+Pj4gQEAgLTIzNiwxMDAgKzIzNiw2IEBAIHZvaWQgdGlueWRy bV94cmdiODg4OF90b19ncmF5OCh1OCAqZHN0LCB2b2lkCj4+Pj4+ICp2YWRkciwgc3RydWN0IGRy bV9mcmFtZWJ1ZmZlciAqZmIsCj4+Pj4+ICDCoCB9Cj4+Pj4+ICDCoCBFWFBPUlRfU1lNQk9MKHRp bnlkcm1feHJnYjg4ODhfdG9fZ3JheTgpOwo+Pj4+PiAgwqAgLS8qKgo+Pj4+PiAtICogdGlueWRy bV9vZl9maW5kX2JhY2tsaWdodCAtIEZpbmQgYmFja2xpZ2h0IGRldmljZSBpbiBkZXZpY2UtdHJl ZQo+Pj4+PiAtICogQGRldjogRGV2aWNlCj4+Pj4+IC0gKgo+Pj4+PiAtICogVGhpcyBmdW5jdGlv biBsb29rcyBmb3IgYSBEVCBub2RlIHBvaW50ZWQgdG8gYnkgYSBwcm9wZXJ0eSBuYW1lZAo+Pj4+ PiAnYmFja2xpZ2h0Jwo+Pj4+PiAtICogYW5kIHVzZXMgb2ZfZmluZF9iYWNrbGlnaHRfYnlfbm9k ZSgpIHRvIGdldCB0aGUgYmFja2xpZ2h0IGRldmljZS4KPj4+Pj4gLSAqIEFkZGl0aW9uYWxseSBp ZiB0aGUgYnJpZ2h0bmVzcyBwcm9wZXJ0eSBpcyB6ZXJvLCBpdCBpcyBzZXQgdG8KPj4+Pj4gLSAq IG1heF9icmlnaHRuZXNzLgo+Pj4+PiAtICoKPj4+Pj4gLSAqIFJldHVybnM6Cj4+Pj4+IC0gKiBO VUxMIGlmIHRoZXJlJ3Mgbm8gYmFja2xpZ2h0IHByb3BlcnR5Lgo+Pj4+PiAtICogRXJyb3IgcG9p bnRlciAtRVBST0JFX0RFRkVSIGlmIHRoZSBEVCBub2RlIGlzIGZvdW5kLCBidXQgbm8KPj4+Pj4g YmFja2xpZ2h0IGRldmljZQo+Pj4+PiAtICogaXMgZm91bmQuCj4+Pj4+IC0gKiBJZiB0aGUgYmFj a2xpZ2h0IGRldmljZSBpcyBmb3VuZCwgYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgaXMKPj4+ Pj4gcmV0dXJuZWQuCj4+Pj4+IC0gKi8KPj4+Pj4gLXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICp0 aW55ZHJtX29mX2ZpbmRfYmFja2xpZ2h0KHN0cnVjdCBkZXZpY2UgKmRldikKPj4+Pj4gLXsKPj4+ Pj4gLcKgwqDCoCBzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmFja2xpZ2h0Owo+Pj4+PiAtwqDC oMKgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Cj4+Pj4+IC0KPj4+Pj4gLcKgwqDCoCBucCA9IG9m X3BhcnNlX3BoYW5kbGUoZGV2LT5vZl9ub2RlLCAiYmFja2xpZ2h0IiwgMCk7Cj4+Pj4+IC3CoMKg wqAgaWYgKCFucCkKPj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiBOVUxMOwo+Pj4+PiAtCj4+ Pj4+IC3CoMKgwqAgYmFja2xpZ2h0ID0gb2ZfZmluZF9iYWNrbGlnaHRfYnlfbm9kZShucCk7Cj4+ Pj4+IC3CoMKgwqAgb2Zfbm9kZV9wdXQobnApOwo+Pj4+PiAtCj4+Pj4+IC3CoMKgwqAgaWYgKCFi YWNrbGlnaHQpCj4+Pj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gRVJSX1BUUigtRVBST0JFX0RF RkVSKTsKPj4+Pj4gLQo+Pj4+PiAtwqDCoMKgIGlmICghYmFja2xpZ2h0LT5wcm9wcy5icmlnaHRu ZXNzKSB7Cj4+Pj4+IC3CoMKgwqDCoMKgwqDCoCBiYWNrbGlnaHQtPnByb3BzLmJyaWdodG5lc3Mg PSBiYWNrbGlnaHQtPnByb3BzLm1heF9icmlnaHRuZXNzOwo+Pj4+PiAtwqDCoMKgwqDCoMKgwqAg RFJNX0RFQlVHX0tNUygiQmFja2xpZ2h0IGJyaWdodG5lc3Mgc2V0IHRvICVkXG4iLAo+Pj4+PiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBiYWNrbGlnaHQtPnByb3BzLmJyaWdo dG5lc3MpOwo+Pj4+PiAtwqDCoMKgIH0KPj4+Pj4gLQo+Pj4+PiAtwqDCoMKgIHJldHVybiBiYWNr bGlnaHQ7Cj4+Pj4+IC19Cj4+Pj4+IC1FWFBPUlRfU1lNQk9MKHRpbnlkcm1fb2ZfZmluZF9iYWNr bGlnaHQpOwo+Pj4+PiAtCj4+Pj4+IC0vKioKPj4+Pj4gLSAqIHRpbnlkcm1fZW5hYmxlX2JhY2ts aWdodCAtIEVuYWJsZSBiYWNrbGlnaHQgaGVscGVyCj4+Pj4+IC0gKiBAYmFja2xpZ2h0OiBCYWNr bGlnaHQgZGV2aWNlCj4+Pj4+IC0gKgo+Pj4+PiAtICogUmV0dXJuczoKPj4+Pj4gLSAqIFplcm8g b24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgo+Pj4+PiAtICovCj4+ Pj4+IC1pbnQgdGlueWRybV9lbmFibGVfYmFja2xpZ2h0KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNl ICpiYWNrbGlnaHQpCj4+Pj4+IC17Cj4+Pj4+IC3CoMKgwqAgdW5zaWduZWQgaW50IG9sZF9zdGF0 ZTsKPj4+Pj4gLcKgwqDCoCBpbnQgcmV0Owo+Pj4+PiAtCj4+Pj4+IC3CoMKgwqAgaWYgKCFiYWNr bGlnaHQpCj4+Pj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4+Pj4gLQo+Pj4+PiAtwqDC oMKgIG9sZF9zdGF0ZSA9IGJhY2tsaWdodC0+cHJvcHMuc3RhdGU7Cj4+Pj4+IC3CoMKgwqAgYmFj a2xpZ2h0LT5wcm9wcy5zdGF0ZSAmPSB+QkxfQ09SRV9GQkJMQU5LOwo+Pj4+PiAtwqDCoMKgIERS TV9ERUJVR19LTVMoIkJhY2tsaWdodCBzdGF0ZTogMHgleCAtPiAweCV4XG4iLCBvbGRfc3RhdGUs Cj4+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBiYWNrbGlnaHQtPnByb3BzLnN0YXRl KTsKPj4+Pj4gLQo+Pj4+PiAtwqDCoMKgIHJldCA9IGJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGJh Y2tsaWdodCk7Cj4+Pj4+IC3CoMKgwqAgaWYgKHJldCkKPj4+Pj4gLcKgwqDCoMKgwqDCoMKgIERS TV9FUlJPUigiRmFpbGVkIHRvIGVuYWJsZSBiYWNrbGlnaHQgJWRcbiIsIHJldCk7Cj4+Pj4+IC0K Pj4+Pj4gLcKgwqDCoCByZXR1cm4gcmV0Owo+Pj4+PiAtfQo+Pj4+PiAtRVhQT1JUX1NZTUJPTCh0 aW55ZHJtX2VuYWJsZV9iYWNrbGlnaHQpOwo+Pj4+PiAtCj4+Pj4+IC0vKioKPj4+Pj4gLSAqIHRp bnlkcm1fZGlzYWJsZV9iYWNrbGlnaHQgLSBEaXNhYmxlIGJhY2tsaWdodCBoZWxwZXIKPj4+Pj4g LSAqIEBiYWNrbGlnaHQ6IEJhY2tsaWdodCBkZXZpY2UKPj4+Pj4gLSAqCj4+Pj4+IC0gKiBSZXR1 cm5zOgo+Pj4+PiAtICogWmVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZh aWx1cmUuCj4+Pj4+IC0gKi8KPj4+Pj4gLWludCB0aW55ZHJtX2Rpc2FibGVfYmFja2xpZ2h0KHN0 cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiYWNrbGlnaHQpCj4+Pj4+IC17Cj4+Pj4+IC3CoMKgwqAg dW5zaWduZWQgaW50IG9sZF9zdGF0ZTsKPj4+Pj4gLcKgwqDCoCBpbnQgcmV0Owo+Pj4+PiAtCj4+ Pj4+IC3CoMKgwqAgaWYgKCFiYWNrbGlnaHQpCj4+Pj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4g MDsKPj4+Pj4gLQo+Pj4+PiAtwqDCoMKgIG9sZF9zdGF0ZSA9IGJhY2tsaWdodC0+cHJvcHMuc3Rh dGU7Cj4+Pj4+IC3CoMKgwqAgYmFja2xpZ2h0LT5wcm9wcy5zdGF0ZSB8PSBCTF9DT1JFX0ZCQkxB Tks7Cj4+Pj4+IC3CoMKgwqAgRFJNX0RFQlVHX0tNUygiQmFja2xpZ2h0IHN0YXRlOiAweCV4IC0+ IDB4JXhcbiIsIG9sZF9zdGF0ZSwKPj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJh Y2tsaWdodC0+cHJvcHMuc3RhdGUpOwo+Pj4+PiAtwqDCoMKgIHJldCA9IGJhY2tsaWdodF91cGRh dGVfc3RhdHVzKGJhY2tsaWdodCk7Cj4+Pj4+IC3CoMKgwqAgaWYgKHJldCkKPj4+Pj4gLcKgwqDC oMKgwqDCoMKgIERSTV9FUlJPUigiRmFpbGVkIHRvIGRpc2FibGUgYmFja2xpZ2h0ICVkXG4iLCBy ZXQpOwo+Pj4+PiAtCj4+Pj4+IC3CoMKgwqAgcmV0dXJuIHJldDsKPj4+Pj4gLX0KPj4+Pj4gLUVY UE9SVF9TWU1CT0wodGlueWRybV9kaXNhYmxlX2JhY2tsaWdodCk7Cj4+Pj4+ICDCoCDCoCAjaWYg SVNfRU5BQkxFRChDT05GSUdfU1BJKQo+Pj4+PiAgwqAgZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS90aW55ZHJtL21pMDI4M3F0LmMKPj4+Pj4gYi9kcml2ZXJzL2dwdS9kcm0vdGlueWRybS9t aTAyODNxdC5jCj4+Pj4+IGluZGV4IDdlNWJiN2QuLmMxNjFkNDUgMTAwNjQ0Cj4+Pj4+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS90aW55ZHJtL21pMDI4M3F0LmMKPj4+Pj4gKysrIGIvZHJpdmVycy9n cHUvZHJtL3Rpbnlkcm0vbWkwMjgzcXQuYwo+Pj4+PiBAQCAtMTIsNiArMTIsNyBAQAo+Pj4+PiAg wqAgI2luY2x1ZGUgPGRybS90aW55ZHJtL2lsaTkzNDEuaD4KPj4+Pj4gIMKgICNpbmNsdWRlIDxk cm0vdGlueWRybS9taXBpLWRiaS5oPgo+Pj4+PiAgwqAgI2luY2x1ZGUgPGRybS90aW55ZHJtL3Rp bnlkcm0taGVscGVycy5oPgo+Pj4+PiArI2luY2x1ZGUgPGRybS90aW55ZHJtL3Rpbnlkcm0tYmFj a2xpZ2h0Lmg+Cj4+Pj4+ICDCoCAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KPj4+Pj4gIMKgICNp bmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+Cj4+Pj4+ICDCoCAjaW5jbHVkZSA8bGludXgv bW9kdWxlLmg+Cj4+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGlueWRybS9taXBp LWRiaS5jCj4+Pj4+IGIvZHJpdmVycy9ncHUvZHJtL3Rpbnlkcm0vbWlwaS1kYmkuYwo+Pj4+PiBp bmRleCAyY2FlYWJjLi5kYzg0ZjI2IDEwMDY0NAo+Pj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0v dGlueWRybS9taXBpLWRiaS5jCj4+Pj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS90aW55ZHJtL21p cGktZGJpLmMKPj4+Pj4gQEAgLTExLDYgKzExLDcgQEAKPj4+Pj4gIMKgIMKgICNpbmNsdWRlIDxk cm0vdGlueWRybS9taXBpLWRiaS5oPgo+Pj4+PiAgwqAgI2luY2x1ZGUgPGRybS90aW55ZHJtL3Rp bnlkcm0taGVscGVycy5oPgo+Pj4+PiArI2luY2x1ZGUgPGRybS90aW55ZHJtL3Rpbnlkcm0tYmFj a2xpZ2h0Lmg+Cj4+Pj4+ICDCoCAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgo+Pj4+PiAgwqAg I2luY2x1ZGUgPGxpbnV4L2RtYS1idWYuaD4KPj4+Pj4gIMKgICNpbmNsdWRlIDxsaW51eC9ncGlv L2NvbnN1bWVyLmg+Cj4+Pj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS90aW55ZHJtL3Rpbnlk cm0tYmFja2xpZ2h0LmgKPj4+Pj4gYi9pbmNsdWRlL2RybS90aW55ZHJtL3Rpbnlkcm0tYmFja2xp Z2h0LmgKPj4+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4+Pj4gaW5kZXggMDAwMDAwMC4uNmE3 YjZkNQo+Pj4+PiAtLS0gL2Rldi9udWxsCj4+Pj4+ICsrKyBiL2luY2x1ZGUvZHJtL3Rpbnlkcm0v dGlueWRybS1iYWNrbGlnaHQuaAo+Pj4+PiBAQCAtMCwwICsxLDE4IEBACj4+Pj4+ICsvKgo+Pj4+ PiArICogQ29weXJpZ2h0IChDKSAyMDE2IE5vcmFsZiBUcsO4bm5lcwo+Pj4+PiArICoKPj4+Pj4g KyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5Cj4+Pj4+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQo+Pj4+PiArICogdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IK Pj4+Pj4gKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCj4+Pj4+ICsgKi8K Pj4+Pj4gKwo+Pj4+PiArI2lmbmRlZiBfX0xJTlVYX1RJTllEUk1fQkFDS0xJR0hUX0gKPj4+Pj4g KyNkZWZpbmUgX19MSU5VWF9USU5ZRFJNX0JBQ0tMSUdIVF9ICj4+Pj4+ICsKPj4+Pj4gK3N0cnVj dCBiYWNrbGlnaHRfZGV2aWNlOwo+Pj4+PiArc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKnRpbnlk cm1fb2ZfZmluZF9iYWNrbGlnaHQoc3RydWN0IGRldmljZSAqZGV2KTsKPj4+Pj4gK2ludCB0aW55 ZHJtX2VuYWJsZV9iYWNrbGlnaHQoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJhY2tsaWdodCk7 Cj4+Pj4+ICtpbnQgdGlueWRybV9kaXNhYmxlX2JhY2tsaWdodChzdHJ1Y3QgYmFja2xpZ2h0X2Rl dmljZSAqYmFja2xpZ2h0KTsKPj4+Pj4gKwo+Pj4+PiArI2VuZGlmIC8qIF9fTElOVVhfVElOWURS TV9CQUNLTElHSFRfSCAqLwo+Pj4+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCj4+Pj4gZHJpLWRldmVsIG1haWxpbmcgbGlzdAo+Pj4+IGRyaS1kZXZlbEBs aXN0cy5mcmVlZGVza3RvcC5vcmcKPj4+PiBodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo+Pj4+CgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBs aXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1h bi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 X-GM-THRID: 6468555141619384320 X-Received: by 10.28.72.135 with SMTP id v129mr351853wma.14.1506431173717; Tue, 26 Sep 2017 06:06:13 -0700 (PDT) X-BeenThere: outreachy-kernel@googlegroups.com Received: by 10.28.167.85 with SMTP id q82ls1044987wme.10.canary-gmail; Tue, 26 Sep 2017 06:06:12 -0700 (PDT) X-Google-Smtp-Source: AOwi7QDec86M9MOQe6p1equV1gfDl6U3WU2RHqDx38SeiH0liBBQ2aojdHfqz3IAlYBmTJAGEVQf X-Received: by 10.28.136.143 with SMTP id k137mr327052wmd.3.1506431172587; Tue, 26 Sep 2017 06:06:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1506431172; cv=none; d=google.com; s=arc-20160816; b=Qyc7JPP7ygAfLZeYzV2eRzRhlyASyaWwhs2WEE2bY7ZeusE/HJADR6aDb1QyPhMm1u hQD3YjRoIIQ6AvjyJ3eIWitNN+rf8N9yt2qOPolTmLP6zZ+bqK77kr1P7PtixQwN1sws +aUVGU52f/vwSIKUNUTWcI6UXs4jZDomgNXo2APiO5d7eCZrpLXrctV/+IOImZRXPS98 uLo8sf9WCRfC7EluD9KIrSDUccil/bm2+QDn8n3JNHLmL0WwX0/QWOrYGQonJTDB17iN rsTMzQAGYCPaQa4iAGEIvaoiaED54N6LlG6e6wkegqpnVxSvbpj5+Nx0xRucfVPUJWGT N5xA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:arc-authentication-results; bh=aLZULJ6wKQ4l3QNcG4mkPIceW0xZt3icb732s1ocGkI=; b=FxICnpXaZXs4tYxtpLq+d3scJ47mIsETNa5HeZWHN5IMNBOH4n8LLvU4R0Fr2/JhTV RZs3lB4kziab7sOmn5Lu8/hSXitomR3yXWz2uStKKjaPPcoJe+gB1wN+NNfqKmmolDzK VoznKcAu5cG9fmx05pUwJfvvCYY8D/MVHpMV3QX2ZqUkLVaW12FS2p/HqhQ99wtRNQr3 ei+508aZnXvU1iTzOCzHCnyjI1Ln2rmPBNdxQTjn4VSPZTYqertrGdNBKH/E81um33fN 2cV+U52LMY6GJOTXgZimZBK6pnyQb2GOAWyZbbb9+/avdBt6tuN6AsE6pV66+1CrDWqp jYtw== ARC-Authentication-Results: i=1; gmr-mx.google.com; spf=pass (google.com: domain of noralf@tronnes.org designates 2a01:5b40:0:3005::1 as permitted sender) smtp.mailfrom=noralf@tronnes.org Return-Path: Received: from smtp.domeneshop.no (smtp.domeneshop.no. [2a01:5b40:0:3005::1]) by gmr-mx.google.com with ESMTPS id x130si194180lff.1.2017.09.26.06.06.12 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 26 Sep 2017 06:06:12 -0700 (PDT) Received-SPF: pass (google.com: domain of noralf@tronnes.org designates 2a01:5b40:0:3005::1 as permitted sender) client-ip=2a01:5b40:0:3005::1; Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of noralf@tronnes.org designates 2a01:5b40:0:3005::1 as permitted sender) smtp.mailfrom=noralf@tronnes.org Received: from 211.81-166-168.customer.lyse.net ([81.166.168.211]:61469 helo=[192.168.10.157]) by smtp.domeneshop.no with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1dwpYx-0005Mw-Hp; Tue, 26 Sep 2017 15:06:11 +0200 Subject: Re: [PATCH v2] drm/tinydrm: Move backlight helpers to a separate file To: Daniel Vetter , Meghana Madhyastha Cc: outreachy-kernel , Sean Paul , dri-devel@lists.freedesktop.org References: <20170922150935.GA15912@meghana-HP-Pavilion-Notebook> <3dd313c8-daa7-a395-183c-c2dfac4dd4b4@tronnes.org> <20170926111650.GA7624@meghana-HP-Pavilion-Notebook> <20170926113214.ahxqmqspsd3olu73@phenom.ffwll.local> From: =?UTF-8?Q?Noralf_Tr=c3=b8nnes?= Message-ID: <938e964a-9b4e-b9fe-fdcc-a04d24f3a330@tronnes.org> Date: Tue, 26 Sep 2017 15:06:06 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0 MIME-Version: 1.0 In-Reply-To: <20170926113214.ahxqmqspsd3olu73@phenom.ffwll.local> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Den 26.09.2017 13.32, skrev Daniel Vetter: > On Tue, Sep 26, 2017 at 04:46:53PM +0530, Meghana Madhyastha wrote: >> On Mon, Sep 25, 2017 at 06:31:58PM +0200, Noralf Trønnes wrote: >>> Den 25.09.2017 16.56, skrev Noralf Trønnes: >>>> Hi Meghana, >>>> >>>> >>>> Den 22.09.2017 17.09, skrev Meghana Madhyastha: >>>>> Move backlight helpers from tinydrm-helpers.c to >>>>> tinydrm-backlight.c. This is because it is organizationally >>>>> simpler to understand and advantageous to group functions >>>>> performing a similar function to a separate file as opposed to >>>>> having one helper file with heteregenous helper functions. >>>>> >>>>> Signed-off-by: Meghana Madhyastha >>>>> --- >>>> I don't think there is much gain in just moving the code like this. >>>> >>>> The idea is to add a drm_backlight helper that can be useful for all >>>> DRM drivers that use the backlight subsystem. >> Yes I agree. That definitely makes more sense. >>> The full path to that helper would be: >>> drivers/gpu/drm/drm_backlight.c >>> >>>> This is what the TODO says: >>>> https://dri.freedesktop.org/docs/drm/gpu/todo.html#tinydrm >>>> >>>> - backlight helpers, probably best to put them into a new drm_backlight.c. >>>>   This is because drivers/video is de-facto unmaintained. We could also >>>>   move drivers/video/backlight to drivers/gpu/backlight and take it all >>>>   over within drm-misc, but that’s more work. >>>> >>>> There is also this discussion to take into account: >>>> KMS backlight ABI proposition >>>> https://lists.freedesktop.org/archives/dri-devel/2017-February/133206.html >>>> >>>> >>>> I don't remember what came out of that discussion. >>>> >>>> Noralf. >> After having discussed this with Daniel on the #dri-devel irc channel, >> here are some of the points suggested. >> >> Daniel suggested that I first look into the usage of shared backlight >> helpers in drm (specifically backlight_update_status to begin with). The idea >> was to see whether there is any pattern in usage and/or code dupication. >> If there is, then the next step would be to write helper functions which >> can be used by other drivers (and not just tinydrm). >> >> To start with, I went through the instances of backlight_update_status >> in the drm code, and made the following observations(most of them are >> very simple/naive observations). >> >> - backlight_update_status is usually called in backlight init (and >> sometimes exit) functions of the drivers just after the device is registered. >> So backlight_update_status is called with the registered device as the >> parameter. >> >> Here are the following cases of properties changed/set before >> backlight_update_status is called. >> >> - CASE 1: Brightness is changed (either a macro BRIGHTNESS_MAX_LEVEL 100 >> is defined or it is manually set) This happens in the following files: >> >> gma500/cdv_device.c, gma500/mdfld_device.c, gma500/oaktrail_device.c, >> gma500/psb_device.c, noveau/noveau_backlight.c(here brightness is determined by fuction >> static int nv50_get_intensity) >> >> - CASE 2: Power property is set (to FB_BLANK_UNBLANK mostly) >> This happens in the following files: >> >> omapdrm/displays/panel-dpi.c, panel/panel-innolux-p079zca.c, >> panel/panel-jdi-lt070me05000.c, panel/panel-sharp-lq101r1sx01.c, >> panel/panel-sharp-ls043t1le01.c, tilcdc/tilcdc_panel.c >> >> - CASE 3: State is set >> This happens in the following files: >> >> tinydrm/tinydrm-helpers.c >> >> - CASE 4: Power and brightness properties are set >> This happens in the following files: >> >> atombios_encoders.c, radeon/radeon_legacy_encoders.c, >> shmobile/shmob_drm_backlight.c >> >> - CASE 5: Power and the state properties are set >> This happens in the following files: >> >> panel/panel-lvds.c, panel/panel-panasonic-vvx10f034n00.c, >> panel/panel-simple.c, panel/panel-sitronix-st7789v.c >> >> Please let me know if I am wrong / missed something. As for next steps, >> wouldn't it be an overkill to have a separate helper function for each >> of these cases ? Perhaps a generic helper function which would somehow >> address these cases would be more appropriate ? Thank you for your >> time/patience. > I suspect that a lot of these combinations are just plain wrong, but > happen to kinda work with the combination of gpu driver and backlight > driver they're used on. tbh I have no idea which one is the correct > version for enabling a backlight correctly ... > > So definitely a good task to refactor this into a proper helper, but looks > a lot more involved than at first sight. Backlight is tricky. One annoying thing from a DRM point of view is that it's tied to fbdev with a notifier fb_notifier_callback() that turns it off on FB_EVENT_BLANK and FB_EVENT_CONBLANK. And the logic in that function is very convoluted. And if we look at the gpio backlight driver, we see that there are 3 properties that turn off the backlight: static int gpio_backlight_update_status(struct backlight_device *bl) {     struct gpio_backlight *gbl = bl_get_data(bl);     int brightness = bl->props.brightness;     if (bl->props.power != FB_BLANK_UNBLANK ||         bl->props.fb_blank != FB_BLANK_UNBLANK ||         bl->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK))         brightness = 0;     gpiod_set_value_cansleep(gbl->gpiod, brightness);     return 0; } This may account for the different ways of controlling backlight in DRM. Some other aspects: - The backlight device has it's own suspend/resume functions. - systemd tries to be smart and turn on/off backlight, but that is just   annoying with tinydrm drivers that are loaded late since it turns on   an uninitialized display. Disabling the service fixes it. Noralf. > Do you have any of the hardware supported by any of these drivers? lsmod > and then comparing with the modules you're building in your own tree > should help you figure this out. > -Daniel > >> -Meghana >> >>>>> Changes in v2: >>>>>   -Improved commit message by explaining why the changes were made. >>>>> >>>>>   drivers/gpu/drm/tinydrm/core/Makefile            |   2 +- >>>>>   drivers/gpu/drm/tinydrm/core/tinydrm-backlight.c | 103 >>>>> +++++++++++++++++++++++ >>>>>   drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c   |  94 >>>>> --------------------- >>>>>   drivers/gpu/drm/tinydrm/mi0283qt.c               |   1 + >>>>>   drivers/gpu/drm/tinydrm/mipi-dbi.c               |   1 + >>>>>   include/drm/tinydrm/tinydrm-backlight.h          |  18 ++++ >>>>>   6 files changed, 124 insertions(+), 95 deletions(-) >>>>>   create mode 100644 drivers/gpu/drm/tinydrm/core/tinydrm-backlight.c >>>>>   create mode 100644 include/drm/tinydrm/tinydrm-backlight.h >>>>> >>>>> diff --git a/drivers/gpu/drm/tinydrm/core/Makefile >>>>> b/drivers/gpu/drm/tinydrm/core/Makefile >>>>> index fb221e6..389ca7a 100644 >>>>> --- a/drivers/gpu/drm/tinydrm/core/Makefile >>>>> +++ b/drivers/gpu/drm/tinydrm/core/Makefile >>>>> @@ -1,3 +1,3 @@ >>>>> -tinydrm-y := tinydrm-core.o tinydrm-pipe.o tinydrm-helpers.o >>>>> +tinydrm-y := tinydrm-core.o tinydrm-pipe.o tinydrm-backlight.o >>>>> tinydrm-helpers.o >>>>>     obj-$(CONFIG_DRM_TINYDRM) += tinydrm.o >>>>> diff --git a/drivers/gpu/drm/tinydrm/core/tinydrm-backlight.c >>>>> b/drivers/gpu/drm/tinydrm/core/tinydrm-backlight.c >>>>> new file mode 100644 >>>>> index 0000000..dc6f17d >>>>> --- /dev/null >>>>> +++ b/drivers/gpu/drm/tinydrm/core/tinydrm-backlight.c >>>>> @@ -0,0 +1,103 @@ >>>>> +#include >>>>> +#include >>>>> +#include >>>>> +#include >>>>> + >>>>> +#include >>>>> +#include >>>>> + >>>>> +/** >>>>> + * tinydrm_of_find_backlight - Find backlight device in device-tree >>>>> + * @dev: Device >>>>> + * >>>>> + * This function looks for a DT node pointed to by a property named >>>>> 'backlight' >>>>> + * and uses of_find_backlight_by_node() to get the backlight device. >>>>> + * Additionally if the brightness property is zero, it is set to >>>>> + * max_brightness. >>>>> + * >>>>> + * Returns: >>>>> + * NULL if there's no backlight property. >>>>> + * Error pointer -EPROBE_DEFER if the DT node is found, but no >>>>> backlight device >>>>> + * is found. >>>>> + * If the backlight device is found, a pointer to the structure is >>>>> returned. >>>>> + */ >>>>> + >>>>> +struct backlight_device *tinydrm_of_find_backlight(struct device *dev) >>>>> +{ >>>>> +    struct backlight_device *backlight; >>>>> +    struct device_node *np; >>>>> + >>>>> +    np = of_parse_phandle(dev->of_node, "backlight", 0); >>>>> +    if (!np) >>>>> +        return NULL; >>>>> + >>>>> +    backlight = of_find_backlight_by_node(np); >>>>> +    of_node_put(np); >>>>> + >>>>> +    if (!backlight) >>>>> +        return ERR_PTR(-EPROBE_DEFER); >>>>> + >>>>> +    if (!backlight->props.brightness) { >>>>> +        backlight->props.brightness = backlight->props.max_brightness; >>>>> +        DRM_DEBUG_KMS("Backlight brightness set to %d\n", >>>>> +                  backlight->props.brightness); >>>>> +    } >>>>> + >>>>> +    return backlight; >>>>> +} >>>>> +EXPORT_SYMBOL(tinydrm_of_find_backlight); >>>>> + >>>>> +/** >>>>> + * tinydrm_enable_backlight - Enable backlight helper >>>>> + * @backlight: Backlight device >>>>> + * >>>>> + * Returns: >>>>> + * Zero on success, negative error code on failure. >>>>> + */ >>>>> +int tinydrm_enable_backlight(struct backlight_device *backlight) >>>>> +{ >>>>> +    unsigned int old_state; >>>>> +    int ret; >>>>> + >>>>> +    if (!backlight) >>>>> +        return 0; >>>>> + >>>>> +    old_state = backlight->props.state; >>>>> +    backlight->props.state &= ~BL_CORE_FBBLANK; >>>>> +    DRM_DEBUG_KMS("Backlight state: 0x%x -> 0x%x\n", old_state, >>>>> +              backlight->props.state); >>>>> + >>>>> +    ret = backlight_update_status(backlight); >>>>> +    if (ret) >>>>> +        DRM_ERROR("Failed to enable backlight %d\n", ret); >>>>> + >>>>> +    return ret; >>>>> +} >>>>> +EXPORT_SYMBOL(tinydrm_enable_backlight); >>>>> + >>>>> +/** >>>>> + * tinydrm_disable_backlight - Disable backlight helper >>>>> + * @backlight: Backlight device >>>>> + * >>>>> + * Returns: >>>>> + * Zero on success, negative error code on failure. >>>>> + */ >>>>> +int tinydrm_disable_backlight(struct backlight_device *backlight) >>>>> +{ >>>>> +    unsigned int old_state; >>>>> +    int ret; >>>>> + >>>>> +    if (!backlight) >>>>> +        return 0; >>>>> + >>>>> +    old_state = backlight->props.state; >>>>> +    backlight->props.state |= BL_CORE_FBBLANK; >>>>> +    DRM_DEBUG_KMS("Backlight state: 0x%x -> 0x%x\n", old_state, >>>>> +              backlight->props.state); >>>>> +    ret = backlight_update_status(backlight); >>>>> +    if (ret) >>>>> +        DRM_ERROR("Failed to disable backlight %d\n", ret); >>>>> + >>>>> +    return ret; >>>>> +} >>>>> +EXPORT_SYMBOL(tinydrm_disable_backlight); >>>>> diff --git a/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c >>>>> b/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c >>>>> index bd6cce0..ee8ad8c 100644 >>>>> --- a/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c >>>>> +++ b/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c >>>>> @@ -236,100 +236,6 @@ void tinydrm_xrgb8888_to_gray8(u8 *dst, void >>>>> *vaddr, struct drm_framebuffer *fb, >>>>>   } >>>>>   EXPORT_SYMBOL(tinydrm_xrgb8888_to_gray8); >>>>>   -/** >>>>> - * tinydrm_of_find_backlight - Find backlight device in device-tree >>>>> - * @dev: Device >>>>> - * >>>>> - * This function looks for a DT node pointed to by a property named >>>>> 'backlight' >>>>> - * and uses of_find_backlight_by_node() to get the backlight device. >>>>> - * Additionally if the brightness property is zero, it is set to >>>>> - * max_brightness. >>>>> - * >>>>> - * Returns: >>>>> - * NULL if there's no backlight property. >>>>> - * Error pointer -EPROBE_DEFER if the DT node is found, but no >>>>> backlight device >>>>> - * is found. >>>>> - * If the backlight device is found, a pointer to the structure is >>>>> returned. >>>>> - */ >>>>> -struct backlight_device *tinydrm_of_find_backlight(struct device *dev) >>>>> -{ >>>>> -    struct backlight_device *backlight; >>>>> -    struct device_node *np; >>>>> - >>>>> -    np = of_parse_phandle(dev->of_node, "backlight", 0); >>>>> -    if (!np) >>>>> -        return NULL; >>>>> - >>>>> -    backlight = of_find_backlight_by_node(np); >>>>> -    of_node_put(np); >>>>> - >>>>> -    if (!backlight) >>>>> -        return ERR_PTR(-EPROBE_DEFER); >>>>> - >>>>> -    if (!backlight->props.brightness) { >>>>> -        backlight->props.brightness = backlight->props.max_brightness; >>>>> -        DRM_DEBUG_KMS("Backlight brightness set to %d\n", >>>>> -                  backlight->props.brightness); >>>>> -    } >>>>> - >>>>> -    return backlight; >>>>> -} >>>>> -EXPORT_SYMBOL(tinydrm_of_find_backlight); >>>>> - >>>>> -/** >>>>> - * tinydrm_enable_backlight - Enable backlight helper >>>>> - * @backlight: Backlight device >>>>> - * >>>>> - * Returns: >>>>> - * Zero on success, negative error code on failure. >>>>> - */ >>>>> -int tinydrm_enable_backlight(struct backlight_device *backlight) >>>>> -{ >>>>> -    unsigned int old_state; >>>>> -    int ret; >>>>> - >>>>> -    if (!backlight) >>>>> -        return 0; >>>>> - >>>>> -    old_state = backlight->props.state; >>>>> -    backlight->props.state &= ~BL_CORE_FBBLANK; >>>>> -    DRM_DEBUG_KMS("Backlight state: 0x%x -> 0x%x\n", old_state, >>>>> -              backlight->props.state); >>>>> - >>>>> -    ret = backlight_update_status(backlight); >>>>> -    if (ret) >>>>> -        DRM_ERROR("Failed to enable backlight %d\n", ret); >>>>> - >>>>> -    return ret; >>>>> -} >>>>> -EXPORT_SYMBOL(tinydrm_enable_backlight); >>>>> - >>>>> -/** >>>>> - * tinydrm_disable_backlight - Disable backlight helper >>>>> - * @backlight: Backlight device >>>>> - * >>>>> - * Returns: >>>>> - * Zero on success, negative error code on failure. >>>>> - */ >>>>> -int tinydrm_disable_backlight(struct backlight_device *backlight) >>>>> -{ >>>>> -    unsigned int old_state; >>>>> -    int ret; >>>>> - >>>>> -    if (!backlight) >>>>> -        return 0; >>>>> - >>>>> -    old_state = backlight->props.state; >>>>> -    backlight->props.state |= BL_CORE_FBBLANK; >>>>> -    DRM_DEBUG_KMS("Backlight state: 0x%x -> 0x%x\n", old_state, >>>>> -              backlight->props.state); >>>>> -    ret = backlight_update_status(backlight); >>>>> -    if (ret) >>>>> -        DRM_ERROR("Failed to disable backlight %d\n", ret); >>>>> - >>>>> -    return ret; >>>>> -} >>>>> -EXPORT_SYMBOL(tinydrm_disable_backlight); >>>>>     #if IS_ENABLED(CONFIG_SPI) >>>>>   diff --git a/drivers/gpu/drm/tinydrm/mi0283qt.c >>>>> b/drivers/gpu/drm/tinydrm/mi0283qt.c >>>>> index 7e5bb7d..c161d45 100644 >>>>> --- a/drivers/gpu/drm/tinydrm/mi0283qt.c >>>>> +++ b/drivers/gpu/drm/tinydrm/mi0283qt.c >>>>> @@ -12,6 +12,7 @@ >>>>>   #include >>>>>   #include >>>>>   #include >>>>> +#include >>>>>   #include >>>>>   #include >>>>>   #include >>>>> diff --git a/drivers/gpu/drm/tinydrm/mipi-dbi.c >>>>> b/drivers/gpu/drm/tinydrm/mipi-dbi.c >>>>> index 2caeabc..dc84f26 100644 >>>>> --- a/drivers/gpu/drm/tinydrm/mipi-dbi.c >>>>> +++ b/drivers/gpu/drm/tinydrm/mipi-dbi.c >>>>> @@ -11,6 +11,7 @@ >>>>>     #include >>>>>   #include >>>>> +#include >>>>>   #include >>>>>   #include >>>>>   #include >>>>> diff --git a/include/drm/tinydrm/tinydrm-backlight.h >>>>> b/include/drm/tinydrm/tinydrm-backlight.h >>>>> new file mode 100644 >>>>> index 0000000..6a7b6d5 >>>>> --- /dev/null >>>>> +++ b/include/drm/tinydrm/tinydrm-backlight.h >>>>> @@ -0,0 +1,18 @@ >>>>> +/* >>>>> + * Copyright (C) 2016 Noralf Trønnes >>>>> + * >>>>> + * This program is free software; you can redistribute it and/or modify >>>>> + * it under the terms of the GNU General Public License as published by >>>>> + * the Free Software Foundation; either version 2 of the License, or >>>>> + * (at your option) any later version. >>>>> + */ >>>>> + >>>>> +#ifndef __LINUX_TINYDRM_BACKLIGHT_H >>>>> +#define __LINUX_TINYDRM_BACKLIGHT_H >>>>> + >>>>> +struct backlight_device; >>>>> +struct backlight_device *tinydrm_of_find_backlight(struct device *dev); >>>>> +int tinydrm_enable_backlight(struct backlight_device *backlight); >>>>> +int tinydrm_disable_backlight(struct backlight_device *backlight); >>>>> + >>>>> +#endif /* __LINUX_TINYDRM_BACKLIGHT_H */ >>>> _______________________________________________ >>>> dri-devel mailing list >>>> dri-devel@lists.freedesktop.org >>>> https://lists.freedesktop.org/mailman/listinfo/dri-devel >>>>