From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH 13/20] drm/bridge: Add RGB to VGA bridge support Date: Mon, 16 May 2016 16:24:15 +0300 Message-ID: <1773896.kpi58ilqqm@avalon> References: <1463402840-17062-1-git-send-email-maxime.ripard@free-electrons.com> <1463402840-17062-14-git-send-email-maxime.ripard@free-electrons.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1463402840-17062-14-git-send-email-maxime.ripard@free-electrons.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Maxime Ripard Cc: devicetree@vger.kernel.org, Mike Turquette , Stephen Boyd , dri-devel@lists.freedesktop.org, Chen-Yu Tsai , Rob Herring , Daniel Vetter , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org List-Id: devicetree@vger.kernel.org SGkgTWF4aW1lLAoKVGhhbmsgeW91IGZvciB0aGUgcGF0Y2guCgpPbiBNb25kYXkgMTYgTWF5IDIw MTYgMTQ6NDc6MTMgTWF4aW1lIFJpcGFyZCB3cm90ZToKPiBTb21lIGJvYXJkcyBoYXZlIGFuIGVu dGlyZWx5IHBhc3NpdmUgUkdCIHRvIFZHQSBicmlkZ2UsIGJhc2VkIG9uIGVpdGhlcgo+IERBQ3Mg b3IgcmVzaXN0b3IgbGFkZGVycy4KPiAKPiBUaG9zZSBtaWdodCBvciBtaWdodCBub3QgaGF2ZSBh biBpMmMgYnVzIHJvdXRlZCB0byB0aGUgVkdBIGNvbm5lY3RvciBpbgo+IG9yZGVyIHRvIGFjY2Vz cyB0aGUgc2NyZWVuIEVESURzLgo+IAo+IEFkZCBhIGJyaWRnZSB0aGF0IGRvZXNuJ3QgZG8gYW55 dGhpbmcgYnV0IGV4cG9zZSB0aGUgbW9kZXMgYXZhaWxhYmxlIG9uIHRoZQo+IHNjcmVlbiwgZWl0 aGVyIGJhc2VkIG9uIHRoZSBFRElEcyBpZiBhdmFpbGFibGUsIG9yIGJhc2VkIG9uIHRoZSBYR0EK PiBzdGFuZGFyZHMuCj4gCj4gU2lnbmVkLW9mZi1ieTogTWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJp cGFyZEBmcmVlLWVsZWN0cm9ucy5jb20+Cj4gLS0tCj4gIC4uLi9iaW5kaW5ncy9kaXNwbGF5L2Jy aWRnZS9kdW1iLXZnYS50eHQgICAgICAgICAgIHwgIDQwICsrKysrCj4gIGRyaXZlcnMvZ3B1L2Ry bS9icmlkZ2UvS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgIHwgICA2ICsKPiAgZHJpdmVycy9n cHUvZHJtL2JyaWRnZS9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgfCAgIDEgKwo+ICBkcml2 ZXJzL2dwdS9kcm0vYnJpZGdlL2R1bWItdmdhLmMgICAgICAgICAgICAgICAgICB8IDE4NiArKysr KysrKysrKysrKysrKysKPiAgNCBmaWxlcyBjaGFuZ2VkLCAyMzMgaW5zZXJ0aW9ucygrKQo+ICBj cmVhdGUgbW9kZSAxMDA2NDQKPiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZGlz cGxheS9icmlkZ2UvZHVtYi12Z2EudHh0IGNyZWF0ZSBtb2RlCj4gMTAwNjQ0IGRyaXZlcnMvZ3B1 L2RybS9icmlkZ2UvZHVtYi12Z2EuYwo+IAo+IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Rl dmljZXRyZWUvYmluZGluZ3MvZGlzcGxheS9icmlkZ2UvZHVtYi12Z2EudHh0Cj4gYi9Eb2N1bWVu dGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZGlzcGxheS9icmlkZ2UvZHVtYi12Z2EudHh0IG5l dyBmaWxlCj4gbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjc1N2YwNGRlOTdmMwo+ IC0tLSAvZGV2L251bGwKPiArKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mv ZGlzcGxheS9icmlkZ2UvZHVtYi12Z2EudHh0Cj4gQEAgLTAsMCArMSw0MCBAQAo+ICtQYXNzaXZl IFJHQiB0byBWR0EgYnJpZGdlCj4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArCj4gK1Ro aXMgYmluZGluZyBpcyBhaW1lZCBmb3IgZW50aXJlbHkgcGFzc2l2ZSBSR0IgdG8gVkdBIGJyaWRn ZXMgdGhhdCBkbyBub3QKPiArcmVxdWlyZSBhbnkgY29uZmlndXJhdGlvbi4KPiArCj4gK1JlcXVp cmVkIHByb3BlcnRpZXM6Cj4gKwo+ICstIGNvbXBhdGlibGU6IFNob3VsZCBiZSAiZHVtYi12Z2Et YnJpZGdlIgo+ICsKPiArT3B0aW9uYWwgcHJvcGVydGllczoKPiArCj4gKy0gZGRjLWkyYy1idXM6 IHBoYW5kbGUgdG8gdGhlIGkyYyBidXMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBtb25p dG9yCj4gKwo+ICtSZXF1aXJlZCBub2RlczoKPiArCj4gK1RoaXMgZGV2aWNlIGhhcyBvbmUgdmlk ZW8gcG9ydC4gSXRzIGNvbm5lY3Rpb24gaXMgbW9kZWxsZWQgdXNpbmcgdGhlIE9GCj4gK2dyYXBo IGJpbmRpbmdzIHNwZWNpZmllZCBpbiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mv Z3JhcGgudHh0Lgo+IFRoaXMgK2Nvbm5lY3Rpb24gaXMgbWVhbnQgdG8gYmUgdGhlIFJHQiBpbnB1 dCBidXMuCgpTaG91bGQgdGhlIGJyaWRnZSBoYXZlIHR3byBwb3J0cywgb25lIGlucHV0IHBvcnQg Y29ubmVjdGVkIHRvIGEgZGlzcGxheSBlbmdpbmUgCmFuZCBvbmUgb3V0cHV0IHBvcnQgY29ubmVj dGVkIHRvIGEgVkdBIGNvbm5lY3RvciA/Cgo+ICsKPiArCj4gK0V4YW1wbGUKPiArLS0tLS0tLQo+ ICsKPiArYnJpZGdlIHsKPiArICAgICAgICBjb21wYXRpYmxlID0gImR1bWItdmdhLWJyaWRnZSI7 Cj4gKyAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSA8MT47Cj4gKyAgICAgICAgI3NpemUtY2VsbHMg PSA8MD47Cj4gKwo+ICsgICAgICAgIHBvcnRAMCB7Cj4gKyAgICAgICAgICAgICAgICByZWcgPSA8 MD47Cj4gKyAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKPiArICAgICAgICAg ICAgICAgICNzaXplLWNlbGxzID0gPDA+Owo+ICsKPiArICAgICAgICAgICAgICAgIHZnYV9pbnB1 dDogZW5kcG9pbnRAMCB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwwPjsKPiAr ICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlLWVuZHBvaW50ID0gPCZ0Y29uMF9vdXRfdmdh PjsKPiArICAgICAgICAgICAgICAgfTsKPiArICAgICAgICB9Owo+ICt9Owo+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdl L0tjb25maWcKPiBpbmRleCA4Zjc0MjNmMThkYTUuLmNmMjc5OTU2Y2JlYyAxMDA2NDQKPiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tjb25maWcKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0v YnJpZGdlL0tjb25maWcKPiBAQCAtMTcsNiArMTcsMTIgQEAgY29uZmlnIERSTV9BTkFMT0dJWF9B Tlg3OFhYCj4gIAkgIHRoZSBIRE1JIG91dHB1dCBvZiBhbiBhcHBsaWNhdGlvbiBwcm9jZXNzb3Ig dG8gTXlEUAo+ICAJICBvciBEaXNwbGF5UG9ydC4KPiAKPiArY29uZmlnIERSTV9EVU1CX1ZHQQo+ ICsJdHJpc3RhdGUgIkR1bWIgUkdCIHRvIFZHQSBCcmlkZ2Ugc3VwcG9ydCIKPiArCXNlbGVjdCBE Uk1fS01TX0hFTFBFUgo+ICsJaGVscAo+ICsJICBTdXBwb3J0IGZvciBwYXNzaXZlIFJHQiB0byBW R0EgYnJpZGdlcwo+ICsKPiAgY29uZmlnIERSTV9EV19IRE1JCj4gIAl0cmlzdGF0ZQo+ICAJc2Vs ZWN0IERSTV9LTVNfSEVMUEVSCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2Uv TWFrZWZpbGUKPiBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZpbGUgaW5kZXggOTZiMTNi MzBlNmFiLi42M2YyMTEyMGU4ZjggMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2JyaWRn ZS9NYWtlZmlsZQo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZpbGUKPiBAQCAt MSw2ICsxLDcgQEAKPiAgY2NmbGFncy15IDo9IC1JaW5jbHVkZS9kcm0KPiAKPiAgb2JqLSQoQ09O RklHX0RSTV9BTkFMT0dJWF9BTlg3OFhYKSArPSBhbmFsb2dpeC1hbng3OHh4Lm8KPiArb2JqLSQo Q09ORklHX0RSTV9EVU1CX1ZHQSkgKz0gZHVtYi12Z2Eubwo+ICBvYmotJChDT05GSUdfRFJNX0RX X0hETUkpICs9IGR3LWhkbWkubwo+ICBvYmotJChDT05GSUdfRFJNX0RXX0hETUlfQUhCX0FVRElP KSArPSBkdy1oZG1pLWFoYi1hdWRpby5vCj4gIG9iai0kKENPTkZJR19EUk1fTlhQX1BUTjM0NjAp ICs9IG54cC1wdG4zNDYwLm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9k dW1iLXZnYS5jCj4gYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2R1bWItdmdhLmMgbmV3IGZpbGUg bW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjI4NjRmYTUzNWJmOAo+IC0tLSAvZGV2 L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2R1bWItdmdhLmMKPiBAQCAtMCww ICsxLDE4NiBAQAo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsKPiArI2luY2x1 ZGUgPGRybS9kcm1QLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2F0b21pY19oZWxwZXIuaD4KPiAr I2luY2x1ZGUgPGRybS9kcm1fY3J0Yy5oPgo+ICsjaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBl ci5oPgo+ICsKPiArc3RydWN0IGR1bWJfdmdhIHsKPiArCXN0cnVjdCBkcm1fYnJpZGdlCWJyaWRn ZTsKPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yCWNvbm5lY3RvcjsKPiArCj4gKwlzdHJ1Y3QgaTJj X2FkYXB0ZXIJKmRkYzsKPiArfTsKPiArCj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR1bWJfdmdh ICoKPiArZHJtX2JyaWRnZV90b19kdW1iX3ZnYShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ ICt7Cj4gKwlyZXR1cm4gY29udGFpbmVyX29mKGJyaWRnZSwgc3RydWN0IGR1bWJfdmdhLCBicmlk Z2UpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCBkdW1iX3ZnYSAqCj4gK2RybV9j b25uZWN0b3JfdG9fZHVtYl92Z2Eoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiAr ewo+ICsJcmV0dXJuIGNvbnRhaW5lcl9vZihjb25uZWN0b3IsIHN0cnVjdCBkdW1iX3ZnYSwgY29u bmVjdG9yKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBkdW1iX3ZnYV9nZXRfbW9kZXMoc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiArewo+ICsJc3RydWN0IGR1bWJfdmdhICp2Z2Eg PSBkcm1fY29ubmVjdG9yX3RvX2R1bWJfdmdhKGNvbm5lY3Rvcik7Cj4gKwlzdHJ1Y3QgZWRpZCAq ZWRpZDsKPiArCWludCByZXQ7Cj4gKwo+ICsJaWYgKCF2Z2EtPmRkYykKPiArCQlnb3RvIGZhbGxi YWNrOwo+ICsKPiArCWVkaWQgPSBkcm1fZ2V0X2VkaWQoY29ubmVjdG9yLCB2Z2EtPmRkYyk7Cj4g KwlpZiAoIWVkaWQpIHsKPiArCQlEUk1fSU5GTygiRURJRCByZWFkb3V0IGZhaWxlZCwgZmFsbGlu ZyBiYWNrIHRvIHN0YW5kYXJkIG1vZGVzXG4iKTsKPiArCQlnb3RvIGZhbGxiYWNrOwo+ICsJfQo+ ICsKPiArCWRybV9tb2RlX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShjb25uZWN0b3Is IGVkaWQpOwo+ICsJcmV0dXJuIGRybV9hZGRfZWRpZF9tb2Rlcyhjb25uZWN0b3IsIGVkaWQpOwo+ ICsKPiArZmFsbGJhY2s6Cj4gKwkvKgo+ICsJICogSW4gY2FzZSB3ZSBjYW5ub3QgcmV0cmlldmUg dGhlIEVESURzIChicm9rZW4gb3IgbWlzc2luZyBpMmMKPiArCSAqIGJ1cyksIGZhbGxiYWNrIG9u IHRoZSBYR0Egc3RhbmRhcmRzCj4gKwkgKi8KPiArCXJldCA9IGRybV9hZGRfbW9kZXNfbm9lZGlk KGNvbm5lY3RvciwgMTkyMCwgMTIwMCk7CgpUaGUgRFJNIGNvcmUgYWRkcyBtb2RlcyB1cCB0byAx MDI0eDc2OCBpbiAKZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzKCkuIEkg d29uZGVyIGlmIGl0IHJlYWxseSBtYWtlcyBzZW5zZSAKdG8gb3ZlcnJpZGUgdGhhdCBpbiBkcml2 ZXJzLCBjb21wYXJlZCB0byBpbmNyZWFzaW5nIHRoZSBtYXhpbXVtIHJlc29sdXRpb24gaW4gCnRo ZSBjb3JlLiBXaGF0IHdlIGNhbiByZWFzb25hYmxlIGV4cGVjdCBmcm9tIGEgVkdBIG1vbml0b3Ig ZG9lc24ndCByZWFsbHkgCmRlcGVuZCBvbiB3aGljaCBkaXNwbGF5IGVuZ2luZSBpdCBpcyBjb25u ZWN0ZWQgdG8uCgo+ICsJLyogQW5kIHByZWZlciBhIG1vZGUgcHJldHR5IG11Y2ggYW55b25lIGNh biBoYW5kbGUgKi8KPiArCWRybV9zZXRfcHJlZmVycmVkX21vZGUoY29ubmVjdG9yLCAxMDI0LCA3 NjgpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBzdHJ1Y3QgZHJtX2Vu Y29kZXIgKgo+ICtkdW1iX3ZnYV9iZXN0X2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNv bm5lY3RvcikKPiArewo+ICsJc3RydWN0IGR1bWJfdmdhICp2Z2EgPSBkcm1fY29ubmVjdG9yX3Rv X2R1bWJfdmdhKGNvbm5lY3Rvcik7Cj4gKwo+ICsJcmV0dXJuIHZnYS0+YnJpZGdlLmVuY29kZXI7 Cj4gK30KPiArCj4gK3N0YXRpYyBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgZHVt Yl92Z2FfY29uX2hlbHBlcl9mdW5jcyA9IHsKPiArCS5nZXRfbW9kZXMJPSBkdW1iX3ZnYV9nZXRf bW9kZXMsCj4gKwkuYmVzdF9lbmNvZGVyCT0gZHVtYl92Z2FfYmVzdF9lbmNvZGVyLAo+ICt9Owo+ ICsKPiArc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKPiArZHVtYl92Z2FfY29ubmVj dG9yX2RldGVjdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBib29sIGZvcmNlKQo+ ICt7Cj4gKwlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CgpTaG91bGRuJ3QgdGhh dCBiZSBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd24gaWYgeW91IGhhdmUgbm8gaW5mb3JtYXRpb24g YWJvdXQgCnRoZSBjb25uZWN0aW9uIHN0YXR1cyA/CgpXb3VsZCBpdCBtYWtlIHNlbnNlIHRvIGFk ZCBhbiBvcHRpb25hbCBHUElPLWJhc2VkIGNvbm5lY3Rpb24gZGV0ZWN0aW9uIHRvIHRoaXMgCmRy aXZlciA/Cgo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZAo+ICtkdW1iX3ZnYV9jb25uZWN0b3JfZGVz dHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ICt7Cj4gKwlkcm1fY29ubmVj dG9yX2NsZWFudXAoY29ubmVjdG9yKTsKPiArfQo+ICsKPiArc3RhdGljIHN0cnVjdCBkcm1fY29u bmVjdG9yX2Z1bmNzIGR1bWJfdmdhX2Nvbl9mdW5jcyA9IHsKPiArCS5kcG1zCQkJPSBkcm1fYXRv bWljX2hlbHBlcl9jb25uZWN0b3JfZHBtcywKPiArCS5kZXRlY3QJCQk9IGR1bWJfdmdhX2Nvbm5l Y3Rvcl9kZXRlY3QsCj4gKwkuZmlsbF9tb2RlcwkJPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9j b25uZWN0b3JfbW9kZXMsCj4gKwkuZGVzdHJveQkJPSBkdW1iX3ZnYV9jb25uZWN0b3JfZGVzdHJv eSwKPiArCS5yZXNldAkJCT0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX3Jlc2V0LAo+ICsJ LmF0b21pY19kdXBsaWNhdGVfc3RhdGUJPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZHVw bGljYXRlX3N0YXRlLAo+ICsJLmF0b21pY19kZXN0cm95X3N0YXRlCT0gZHJtX2F0b21pY19oZWxw ZXJfY29ubmVjdG9yX2Rlc3Ryb3lfc3RhdGUsCj4gK307Cj4gKwo+ICtzdGF0aWMgaW50IGR1bWJf dmdhX2F0dGFjaChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ICt7Cj4gKwlzdHJ1Y3QgZHVt Yl92Z2EgKnZnYSA9IGRybV9icmlkZ2VfdG9fZHVtYl92Z2EoYnJpZGdlKTsKPiArCWludCByZXQ7 Cj4gKwo+ICsJaWYgKCFicmlkZ2UtPmVuY29kZXIpIHsKPiArCQlEUk1fRVJST1IoIk1pc3Npbmcg ZW5jb2RlclxuIik7Cj4gKwkJcmV0dXJuIC1FTk9ERVY7Cj4gKwl9Cj4gKwo+ICsJZHJtX2Nvbm5l Y3Rvcl9oZWxwZXJfYWRkKCZ2Z2EtPmNvbm5lY3RvciwKPiArCQkJCSAmZHVtYl92Z2FfY29uX2hl bHBlcl9mdW5jcyk7Cj4gKwlyZXQgPSBkcm1fY29ubmVjdG9yX2luaXQoYnJpZGdlLT5kZXYsICZ2 Z2EtPmNvbm5lY3RvciwKPiArCQkJCSAmZHVtYl92Z2FfY29uX2Z1bmNzLCBEUk1fTU9ERV9DT05O RUNUT1JfVkdBKTsKPiArCWlmIChyZXQpIHsKPiArCQlEUk1fRVJST1IoIkZhaWxlZCB0byBpbml0 aWFsaXplIGNvbm5lY3RvclxuIik7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlkcm1f bW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoJnZnYS0+Y29ubmVjdG9yLAo+ICsJCQkJCSAg YnJpZGdlLT5lbmNvZGVyKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZv aWQgZHVtYl92Z2Ffbm9wKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpIHt9Owo+ICsKPiArc3Rh dGljIHN0cnVjdCBkcm1fYnJpZGdlX2Z1bmNzIGR1bWJfdmdhX2JyaWRnZV9mdW5jcyA9IHsKPiAr CS5hdHRhY2gJCT0gZHVtYl92Z2FfYXR0YWNoLAo+ICsJLmVuYWJsZQkJPSBkdW1iX3ZnYV9ub3As Cj4gKwkuZGlzYWJsZQk9IGR1bWJfdmdhX25vcCwKPiArCS5wcmVfZW5hYmxlCT0gZHVtYl92Z2Ff bm9wLAo+ICsJLnBvc3RfZGlzYWJsZQk9IGR1bWJfdmdhX25vcCwKPiArfTsKPiArCj4gK3N0YXRp YyBpbnQgZHVtYl92Z2FfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ ICsJc3RydWN0IGR1bWJfdmdhICp2Z2E7Cj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRkYzsKPiAr Cj4gKwl2Z2EgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp2Z2EpLCBHRlBfS0VS TkVMKTsKPiArCWlmICghdmdhKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsJcGxhdGZvcm1fc2V0 X2RydmRhdGEocGRldiwgdmdhKTsKPiArCj4gKwlkZGMgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYt PmRldi5vZl9ub2RlLCAiZGRjLWkyYy1idXMiLCAwKTsKPiArCWlmIChkZGMpIHsKPiArCQl2Z2Et PmRkYyA9IG9mX2ZpbmRfaTJjX2FkYXB0ZXJfYnlfbm9kZShkZGMpOwoKWW91J3JlIGxlYWtpbmcg dGhlIHJlZmVyZW5jZSB0byB0aGUgSTJDIGFkYXB0ZXIuCgpBbHNvLCBzaG91bGRuJ3QgeW91IHVz ZSBvZl9nZXRfaTJjX2FkYXB0ZXJfYnlfbm9kZSgpID8gT3RoZXJ3aXNlIHlvdSB3b24ndCAKdGFr ZSBhIHJlZmVyZW5jZSB0byB0aGUgYWRhcHRlciBtb2R1bGUuCgo+ICsJCW9mX25vZGVfcHV0KGRk Yyk7Cj4gKwo+ICsJCWlmICghdmdhLT5kZGMpIHsKPiArCQkJZGV2X2VycigmcGRldi0+ZGV2LCAi Q291bGRuJ3QgcmV0cmlldmUgaTJjIGJ1c1xuIik7Cj4gKwkJCXJldHVybiAtRVBST0JFX0RFRkVS Owo+ICsJCX0KPiArCX0gZWxzZSB7Cj4gKwkJZGV2X2luZm8oJnBkZXYtPmRldiwKPiArCQkJICJO byBpMmMgYnVzIHNwZWNpZmllZC4uLiBEaXNhYmxpbmcgRURJRCByZWFkb3V0XG4iKTsKPiArCX0K PiArCj4gKwl2Z2EtPmJyaWRnZS5mdW5jcyA9ICZkdW1iX3ZnYV9icmlkZ2VfZnVuY3M7Cj4gKwl2 Z2EtPmJyaWRnZS5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7Cj4gKwo+ICsJcmV0dXJuIGRy bV9icmlkZ2VfYWRkKCZ2Z2EtPmJyaWRnZSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHVtYl92 Z2FfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gK3sKPiArCXN0cnVjdCBk dW1iX3ZnYSAqdmdhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Cj4gKwo+ICsJZHJtX2Jy aWRnZV9yZW1vdmUoJnZnYS0+YnJpZGdlKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiAr c3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZHVtYl92Z2FfbWF0Y2hbXSA9IHsKPiAr CXsgLmNvbXBhdGlibGUgPSAiZHVtYi12Z2EtYnJpZGdlIiB9LAo+ICsJe30sCj4gK307Cj4gK01P RFVMRV9ERVZJQ0VfVEFCTEUob2YsIGR1bWJfdmdhX21hdGNoKTsKPiArCj4gK3N0cnVjdCBwbGF0 Zm9ybV9kcml2ZXIgZHVtYl92Z2FfZHJpdmVyID0gewo+ICsJLnByb2JlCT0gZHVtYl92Z2FfcHJv YmUsCj4gKwkucmVtb3ZlCT0gZHVtYl92Z2FfcmVtb3ZlLAo+ICsJLmRyaXZlcgkJPSB7Cj4gKwkJ Lm5hbWUJCT0gImR1bWItdmdhLWJyaWRnZSIsCj4gKwkJLm9mX21hdGNoX3RhYmxlCT0gZHVtYl92 Z2FfbWF0Y2gsCj4gKwl9LAo+ICt9Owo+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGR1bWJfdmdh X2RyaXZlcik7Cj4gKwo+ICtNT0RVTEVfQVVUSE9SKCJNYXhpbWUgUmlwYXJkIDxtYXhpbWUucmlw YXJkQGZyZWUtZWxlY3Ryb25zLmNvbT4iKTsKPiArTU9EVUxFX0RFU0NSSVBUSU9OKCJEdW1iIFJH QiB0byBWR0EgYnJpZGdlIGRyaXZlciIpOwo+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7CgotLSAK UmVnYXJkcywKCkxhdXJlbnQgUGluY2hhcnQKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3Rz LmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Laurent Pinchart To: Maxime Ripard Cc: Rob Herring , Chen-Yu Tsai , Mike Turquette , Stephen Boyd , Daniel Vetter , David Airlie , Boris Brezillon , dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-clk@vger.kernel.org Subject: Re: [PATCH 13/20] drm/bridge: Add RGB to VGA bridge support Date: Mon, 16 May 2016 16:24:15 +0300 Message-ID: <1773896.kpi58ilqqm@avalon> In-Reply-To: <1463402840-17062-14-git-send-email-maxime.ripard@free-electrons.com> References: <1463402840-17062-1-git-send-email-maxime.ripard@free-electrons.com> <1463402840-17062-14-git-send-email-maxime.ripard@free-electrons.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" List-ID: Hi Maxime, Thank you for the patch. On Monday 16 May 2016 14:47:13 Maxime Ripard wrote: > Some boards have an entirely passive RGB to VGA bridge, based on either > DACs or resistor ladders. > > Those might or might not have an i2c bus routed to the VGA connector in > order to access the screen EDIDs. > > Add a bridge that doesn't do anything but expose the modes available on the > screen, either based on the EDIDs if available, or based on the XGA > standards. > > Signed-off-by: Maxime Ripard > --- > .../bindings/display/bridge/dumb-vga.txt | 40 +++++ > drivers/gpu/drm/bridge/Kconfig | 6 + > drivers/gpu/drm/bridge/Makefile | 1 + > drivers/gpu/drm/bridge/dumb-vga.c | 186 ++++++++++++++++++ > 4 files changed, 233 insertions(+) > create mode 100644 > Documentation/devicetree/bindings/display/bridge/dumb-vga.txt create mode > 100644 drivers/gpu/drm/bridge/dumb-vga.c > > diff --git a/Documentation/devicetree/bindings/display/bridge/dumb-vga.txt > b/Documentation/devicetree/bindings/display/bridge/dumb-vga.txt new file > mode 100644 > index 000000000000..757f04de97f3 > --- /dev/null > +++ b/Documentation/devicetree/bindings/display/bridge/dumb-vga.txt > @@ -0,0 +1,40 @@ > +Passive RGB to VGA bridge > +------------------------- > + > +This binding is aimed for entirely passive RGB to VGA bridges that do not > +require any configuration. > + > +Required properties: > + > +- compatible: Should be "dumb-vga-bridge" > + > +Optional properties: > + > +- ddc-i2c-bus: phandle to the i2c bus used to communicate with the monitor > + > +Required nodes: > + > +This device has one video port. Its connection is modelled using the OF > +graph bindings specified in Documentation/devicetree/bindings/graph.txt. > This +connection is meant to be the RGB input bus. Should the bridge have two ports, one input port connected to a display engine and one output port connected to a VGA connector ? > + > + > +Example > +------- > + > +bridge { > + compatible = "dumb-vga-bridge"; > + #address-cells = <1>; > + #size-cells = <0>; > + > + port@0 { > + reg = <0>; > + #address-cells = <1>; > + #size-cells = <0>; > + > + vga_input: endpoint@0 { > + reg = <0>; > + remote-endpoint = <&tcon0_out_vga>; > + }; > + }; > +}; > diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig > index 8f7423f18da5..cf279956cbec 100644 > --- a/drivers/gpu/drm/bridge/Kconfig > +++ b/drivers/gpu/drm/bridge/Kconfig > @@ -17,6 +17,12 @@ config DRM_ANALOGIX_ANX78XX > the HDMI output of an application processor to MyDP > or DisplayPort. > > +config DRM_DUMB_VGA > + tristate "Dumb RGB to VGA Bridge support" > + select DRM_KMS_HELPER > + help > + Support for passive RGB to VGA bridges > + > config DRM_DW_HDMI > tristate > select DRM_KMS_HELPER > diff --git a/drivers/gpu/drm/bridge/Makefile > b/drivers/gpu/drm/bridge/Makefile index 96b13b30e6ab..63f21120e8f8 100644 > --- a/drivers/gpu/drm/bridge/Makefile > +++ b/drivers/gpu/drm/bridge/Makefile > @@ -1,6 +1,7 @@ > ccflags-y := -Iinclude/drm > > obj-$(CONFIG_DRM_ANALOGIX_ANX78XX) += analogix-anx78xx.o > +obj-$(CONFIG_DRM_DUMB_VGA) += dumb-vga.o > obj-$(CONFIG_DRM_DW_HDMI) += dw-hdmi.o > obj-$(CONFIG_DRM_DW_HDMI_AHB_AUDIO) += dw-hdmi-ahb-audio.o > obj-$(CONFIG_DRM_NXP_PTN3460) += nxp-ptn3460.o > diff --git a/drivers/gpu/drm/bridge/dumb-vga.c > b/drivers/gpu/drm/bridge/dumb-vga.c new file mode 100644 > index 000000000000..2864fa535bf8 > --- /dev/null > +++ b/drivers/gpu/drm/bridge/dumb-vga.c > @@ -0,0 +1,186 @@ > + > +#include > + > +#include > +#include > +#include > +#include > + > +struct dumb_vga { > + struct drm_bridge bridge; > + struct drm_connector connector; > + > + struct i2c_adapter *ddc; > +}; > + > +static inline struct dumb_vga * > +drm_bridge_to_dumb_vga(struct drm_bridge *bridge) > +{ > + return container_of(bridge, struct dumb_vga, bridge); > +} > + > +static inline struct dumb_vga * > +drm_connector_to_dumb_vga(struct drm_connector *connector) > +{ > + return container_of(connector, struct dumb_vga, connector); > +} > + > +static int dumb_vga_get_modes(struct drm_connector *connector) > +{ > + struct dumb_vga *vga = drm_connector_to_dumb_vga(connector); > + struct edid *edid; > + int ret; > + > + if (!vga->ddc) > + goto fallback; > + > + edid = drm_get_edid(connector, vga->ddc); > + if (!edid) { > + DRM_INFO("EDID readout failed, falling back to standard modes\n"); > + goto fallback; > + } > + > + drm_mode_connector_update_edid_property(connector, edid); > + return drm_add_edid_modes(connector, edid); > + > +fallback: > + /* > + * In case we cannot retrieve the EDIDs (broken or missing i2c > + * bus), fallback on the XGA standards > + */ > + ret = drm_add_modes_noedid(connector, 1920, 1200); The DRM core adds modes up to 1024x768 in drm_helper_probe_single_connector_modes(). I wonder if it really makes sense to override that in drivers, compared to increasing the maximum resolution in the core. What we can reasonable expect from a VGA monitor doesn't really depend on which display engine it is connected to. > + /* And prefer a mode pretty much anyone can handle */ > + drm_set_preferred_mode(connector, 1024, 768); > + > + return ret; > +} > + > +static struct drm_encoder * > +dumb_vga_best_encoder(struct drm_connector *connector) > +{ > + struct dumb_vga *vga = drm_connector_to_dumb_vga(connector); > + > + return vga->bridge.encoder; > +} > + > +static struct drm_connector_helper_funcs dumb_vga_con_helper_funcs = { > + .get_modes = dumb_vga_get_modes, > + .best_encoder = dumb_vga_best_encoder, > +}; > + > +static enum drm_connector_status > +dumb_vga_connector_detect(struct drm_connector *connector, bool force) > +{ > + return connector_status_connected; Shouldn't that be connector_status_unknown if you have no information about the connection status ? Would it make sense to add an optional GPIO-based connection detection to this driver ? > +} > + > +static void > +dumb_vga_connector_destroy(struct drm_connector *connector) > +{ > + drm_connector_cleanup(connector); > +} > + > +static struct drm_connector_funcs dumb_vga_con_funcs = { > + .dpms = drm_atomic_helper_connector_dpms, > + .detect = dumb_vga_connector_detect, > + .fill_modes = drm_helper_probe_single_connector_modes, > + .destroy = dumb_vga_connector_destroy, > + .reset = drm_atomic_helper_connector_reset, > + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, > + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > +}; > + > +static int dumb_vga_attach(struct drm_bridge *bridge) > +{ > + struct dumb_vga *vga = drm_bridge_to_dumb_vga(bridge); > + int ret; > + > + if (!bridge->encoder) { > + DRM_ERROR("Missing encoder\n"); > + return -ENODEV; > + } > + > + drm_connector_helper_add(&vga->connector, > + &dumb_vga_con_helper_funcs); > + ret = drm_connector_init(bridge->dev, &vga->connector, > + &dumb_vga_con_funcs, DRM_MODE_CONNECTOR_VGA); > + if (ret) { > + DRM_ERROR("Failed to initialize connector\n"); > + return ret; > + } > + > + drm_mode_connector_attach_encoder(&vga->connector, > + bridge->encoder); > + > + return 0; > +} > + > +static void dumb_vga_nop(struct drm_bridge *bridge) {}; > + > +static struct drm_bridge_funcs dumb_vga_bridge_funcs = { > + .attach = dumb_vga_attach, > + .enable = dumb_vga_nop, > + .disable = dumb_vga_nop, > + .pre_enable = dumb_vga_nop, > + .post_disable = dumb_vga_nop, > +}; > + > +static int dumb_vga_probe(struct platform_device *pdev) > +{ > + struct dumb_vga *vga; > + struct device_node *ddc; > + > + vga = devm_kzalloc(&pdev->dev, sizeof(*vga), GFP_KERNEL); > + if (!vga) > + return -ENOMEM; > + platform_set_drvdata(pdev, vga); > + > + ddc = of_parse_phandle(pdev->dev.of_node, "ddc-i2c-bus", 0); > + if (ddc) { > + vga->ddc = of_find_i2c_adapter_by_node(ddc); You're leaking the reference to the I2C adapter. Also, shouldn't you use of_get_i2c_adapter_by_node() ? Otherwise you won't take a reference to the adapter module. > + of_node_put(ddc); > + > + if (!vga->ddc) { > + dev_err(&pdev->dev, "Couldn't retrieve i2c bus\n"); > + return -EPROBE_DEFER; > + } > + } else { > + dev_info(&pdev->dev, > + "No i2c bus specified... Disabling EDID readout\n"); > + } > + > + vga->bridge.funcs = &dumb_vga_bridge_funcs; > + vga->bridge.of_node = pdev->dev.of_node; > + > + return drm_bridge_add(&vga->bridge); > +} > + > +static int dumb_vga_remove(struct platform_device *pdev) > +{ > + struct dumb_vga *vga = platform_get_drvdata(pdev); > + > + drm_bridge_remove(&vga->bridge); > + > + return 0; > +} > + > +static const struct of_device_id dumb_vga_match[] = { > + { .compatible = "dumb-vga-bridge" }, > + {}, > +}; > +MODULE_DEVICE_TABLE(of, dumb_vga_match); > + > +struct platform_driver dumb_vga_driver = { > + .probe = dumb_vga_probe, > + .remove = dumb_vga_remove, > + .driver = { > + .name = "dumb-vga-bridge", > + .of_match_table = dumb_vga_match, > + }, > +}; > +module_platform_driver(dumb_vga_driver); > + > +MODULE_AUTHOR("Maxime Ripard "); > +MODULE_DESCRIPTION("Dumb RGB to VGA bridge driver"); > +MODULE_LICENSE("GPL"); -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: laurent.pinchart@ideasonboard.com (Laurent Pinchart) Date: Mon, 16 May 2016 16:24:15 +0300 Subject: [PATCH 13/20] drm/bridge: Add RGB to VGA bridge support In-Reply-To: <1463402840-17062-14-git-send-email-maxime.ripard@free-electrons.com> References: <1463402840-17062-1-git-send-email-maxime.ripard@free-electrons.com> <1463402840-17062-14-git-send-email-maxime.ripard@free-electrons.com> Message-ID: <1773896.kpi58ilqqm@avalon> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Maxime, Thank you for the patch. On Monday 16 May 2016 14:47:13 Maxime Ripard wrote: > Some boards have an entirely passive RGB to VGA bridge, based on either > DACs or resistor ladders. > > Those might or might not have an i2c bus routed to the VGA connector in > order to access the screen EDIDs. > > Add a bridge that doesn't do anything but expose the modes available on the > screen, either based on the EDIDs if available, or based on the XGA > standards. > > Signed-off-by: Maxime Ripard > --- > .../bindings/display/bridge/dumb-vga.txt | 40 +++++ > drivers/gpu/drm/bridge/Kconfig | 6 + > drivers/gpu/drm/bridge/Makefile | 1 + > drivers/gpu/drm/bridge/dumb-vga.c | 186 ++++++++++++++++++ > 4 files changed, 233 insertions(+) > create mode 100644 > Documentation/devicetree/bindings/display/bridge/dumb-vga.txt create mode > 100644 drivers/gpu/drm/bridge/dumb-vga.c > > diff --git a/Documentation/devicetree/bindings/display/bridge/dumb-vga.txt > b/Documentation/devicetree/bindings/display/bridge/dumb-vga.txt new file > mode 100644 > index 000000000000..757f04de97f3 > --- /dev/null > +++ b/Documentation/devicetree/bindings/display/bridge/dumb-vga.txt > @@ -0,0 +1,40 @@ > +Passive RGB to VGA bridge > +------------------------- > + > +This binding is aimed for entirely passive RGB to VGA bridges that do not > +require any configuration. > + > +Required properties: > + > +- compatible: Should be "dumb-vga-bridge" > + > +Optional properties: > + > +- ddc-i2c-bus: phandle to the i2c bus used to communicate with the monitor > + > +Required nodes: > + > +This device has one video port. Its connection is modelled using the OF > +graph bindings specified in Documentation/devicetree/bindings/graph.txt. > This +connection is meant to be the RGB input bus. Should the bridge have two ports, one input port connected to a display engine and one output port connected to a VGA connector ? > + > + > +Example > +------- > + > +bridge { > + compatible = "dumb-vga-bridge"; > + #address-cells = <1>; > + #size-cells = <0>; > + > + port at 0 { > + reg = <0>; > + #address-cells = <1>; > + #size-cells = <0>; > + > + vga_input: endpoint at 0 { > + reg = <0>; > + remote-endpoint = <&tcon0_out_vga>; > + }; > + }; > +}; > diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig > index 8f7423f18da5..cf279956cbec 100644 > --- a/drivers/gpu/drm/bridge/Kconfig > +++ b/drivers/gpu/drm/bridge/Kconfig > @@ -17,6 +17,12 @@ config DRM_ANALOGIX_ANX78XX > the HDMI output of an application processor to MyDP > or DisplayPort. > > +config DRM_DUMB_VGA > + tristate "Dumb RGB to VGA Bridge support" > + select DRM_KMS_HELPER > + help > + Support for passive RGB to VGA bridges > + > config DRM_DW_HDMI > tristate > select DRM_KMS_HELPER > diff --git a/drivers/gpu/drm/bridge/Makefile > b/drivers/gpu/drm/bridge/Makefile index 96b13b30e6ab..63f21120e8f8 100644 > --- a/drivers/gpu/drm/bridge/Makefile > +++ b/drivers/gpu/drm/bridge/Makefile > @@ -1,6 +1,7 @@ > ccflags-y := -Iinclude/drm > > obj-$(CONFIG_DRM_ANALOGIX_ANX78XX) += analogix-anx78xx.o > +obj-$(CONFIG_DRM_DUMB_VGA) += dumb-vga.o > obj-$(CONFIG_DRM_DW_HDMI) += dw-hdmi.o > obj-$(CONFIG_DRM_DW_HDMI_AHB_AUDIO) += dw-hdmi-ahb-audio.o > obj-$(CONFIG_DRM_NXP_PTN3460) += nxp-ptn3460.o > diff --git a/drivers/gpu/drm/bridge/dumb-vga.c > b/drivers/gpu/drm/bridge/dumb-vga.c new file mode 100644 > index 000000000000..2864fa535bf8 > --- /dev/null > +++ b/drivers/gpu/drm/bridge/dumb-vga.c > @@ -0,0 +1,186 @@ > + > +#include > + > +#include > +#include > +#include > +#include > + > +struct dumb_vga { > + struct drm_bridge bridge; > + struct drm_connector connector; > + > + struct i2c_adapter *ddc; > +}; > + > +static inline struct dumb_vga * > +drm_bridge_to_dumb_vga(struct drm_bridge *bridge) > +{ > + return container_of(bridge, struct dumb_vga, bridge); > +} > + > +static inline struct dumb_vga * > +drm_connector_to_dumb_vga(struct drm_connector *connector) > +{ > + return container_of(connector, struct dumb_vga, connector); > +} > + > +static int dumb_vga_get_modes(struct drm_connector *connector) > +{ > + struct dumb_vga *vga = drm_connector_to_dumb_vga(connector); > + struct edid *edid; > + int ret; > + > + if (!vga->ddc) > + goto fallback; > + > + edid = drm_get_edid(connector, vga->ddc); > + if (!edid) { > + DRM_INFO("EDID readout failed, falling back to standard modes\n"); > + goto fallback; > + } > + > + drm_mode_connector_update_edid_property(connector, edid); > + return drm_add_edid_modes(connector, edid); > + > +fallback: > + /* > + * In case we cannot retrieve the EDIDs (broken or missing i2c > + * bus), fallback on the XGA standards > + */ > + ret = drm_add_modes_noedid(connector, 1920, 1200); The DRM core adds modes up to 1024x768 in drm_helper_probe_single_connector_modes(). I wonder if it really makes sense to override that in drivers, compared to increasing the maximum resolution in the core. What we can reasonable expect from a VGA monitor doesn't really depend on which display engine it is connected to. > + /* And prefer a mode pretty much anyone can handle */ > + drm_set_preferred_mode(connector, 1024, 768); > + > + return ret; > +} > + > +static struct drm_encoder * > +dumb_vga_best_encoder(struct drm_connector *connector) > +{ > + struct dumb_vga *vga = drm_connector_to_dumb_vga(connector); > + > + return vga->bridge.encoder; > +} > + > +static struct drm_connector_helper_funcs dumb_vga_con_helper_funcs = { > + .get_modes = dumb_vga_get_modes, > + .best_encoder = dumb_vga_best_encoder, > +}; > + > +static enum drm_connector_status > +dumb_vga_connector_detect(struct drm_connector *connector, bool force) > +{ > + return connector_status_connected; Shouldn't that be connector_status_unknown if you have no information about the connection status ? Would it make sense to add an optional GPIO-based connection detection to this driver ? > +} > + > +static void > +dumb_vga_connector_destroy(struct drm_connector *connector) > +{ > + drm_connector_cleanup(connector); > +} > + > +static struct drm_connector_funcs dumb_vga_con_funcs = { > + .dpms = drm_atomic_helper_connector_dpms, > + .detect = dumb_vga_connector_detect, > + .fill_modes = drm_helper_probe_single_connector_modes, > + .destroy = dumb_vga_connector_destroy, > + .reset = drm_atomic_helper_connector_reset, > + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, > + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > +}; > + > +static int dumb_vga_attach(struct drm_bridge *bridge) > +{ > + struct dumb_vga *vga = drm_bridge_to_dumb_vga(bridge); > + int ret; > + > + if (!bridge->encoder) { > + DRM_ERROR("Missing encoder\n"); > + return -ENODEV; > + } > + > + drm_connector_helper_add(&vga->connector, > + &dumb_vga_con_helper_funcs); > + ret = drm_connector_init(bridge->dev, &vga->connector, > + &dumb_vga_con_funcs, DRM_MODE_CONNECTOR_VGA); > + if (ret) { > + DRM_ERROR("Failed to initialize connector\n"); > + return ret; > + } > + > + drm_mode_connector_attach_encoder(&vga->connector, > + bridge->encoder); > + > + return 0; > +} > + > +static void dumb_vga_nop(struct drm_bridge *bridge) {}; > + > +static struct drm_bridge_funcs dumb_vga_bridge_funcs = { > + .attach = dumb_vga_attach, > + .enable = dumb_vga_nop, > + .disable = dumb_vga_nop, > + .pre_enable = dumb_vga_nop, > + .post_disable = dumb_vga_nop, > +}; > + > +static int dumb_vga_probe(struct platform_device *pdev) > +{ > + struct dumb_vga *vga; > + struct device_node *ddc; > + > + vga = devm_kzalloc(&pdev->dev, sizeof(*vga), GFP_KERNEL); > + if (!vga) > + return -ENOMEM; > + platform_set_drvdata(pdev, vga); > + > + ddc = of_parse_phandle(pdev->dev.of_node, "ddc-i2c-bus", 0); > + if (ddc) { > + vga->ddc = of_find_i2c_adapter_by_node(ddc); You're leaking the reference to the I2C adapter. Also, shouldn't you use of_get_i2c_adapter_by_node() ? Otherwise you won't take a reference to the adapter module. > + of_node_put(ddc); > + > + if (!vga->ddc) { > + dev_err(&pdev->dev, "Couldn't retrieve i2c bus\n"); > + return -EPROBE_DEFER; > + } > + } else { > + dev_info(&pdev->dev, > + "No i2c bus specified... Disabling EDID readout\n"); > + } > + > + vga->bridge.funcs = &dumb_vga_bridge_funcs; > + vga->bridge.of_node = pdev->dev.of_node; > + > + return drm_bridge_add(&vga->bridge); > +} > + > +static int dumb_vga_remove(struct platform_device *pdev) > +{ > + struct dumb_vga *vga = platform_get_drvdata(pdev); > + > + drm_bridge_remove(&vga->bridge); > + > + return 0; > +} > + > +static const struct of_device_id dumb_vga_match[] = { > + { .compatible = "dumb-vga-bridge" }, > + {}, > +}; > +MODULE_DEVICE_TABLE(of, dumb_vga_match); > + > +struct platform_driver dumb_vga_driver = { > + .probe = dumb_vga_probe, > + .remove = dumb_vga_remove, > + .driver = { > + .name = "dumb-vga-bridge", > + .of_match_table = dumb_vga_match, > + }, > +}; > +module_platform_driver(dumb_vga_driver); > + > +MODULE_AUTHOR("Maxime Ripard "); > +MODULE_DESCRIPTION("Dumb RGB to VGA bridge driver"); > +MODULE_LICENSE("GPL"); -- Regards, Laurent Pinchart