From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Anholt Subject: [PATCH 1/2] drm/bridge: Refactor out the panel wrapper from the lvds-encoder bridge. Date: Thu, 27 Apr 2017 09:36:00 -0700 Message-ID: <20170427163601.7313-1-eric@anholt.net> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from anholt.net (anholt.net [50.246.234.109]) by gabe.freedesktop.org (Postfix) with ESMTP id C4DF26E69E for ; Thu, 27 Apr 2017 16:36:06 +0000 (UTC) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: Yannick Fertre , linux-kernel@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org TWFueSBEUk0gZHJpdmVycyBoYXZlIGNvbW1vbiBjb2RlIHRvIG1ha2UgYSBzdHViIGNvbm5lY3Rv cgppbXBsZW1lbnRhdGlvbiB0aGF0IHdyYXBzIGEgZHJtX3BhbmVsLiAgQnkgd3JhcHBpbmcgdGhl IHBhbmVsIGluIGEgRFJNCmJyaWRnZSwgYWxsIG9mIHRoZSBjb25uZWN0b3IgY29kZSAoaW5jbHVk aW5nIGNhbGxzIGR1cmluZyBlbmNvZGVyCmVuYWJsZS9kaXNhYmxlKSBnb2VzIGF3YXkuCgpTaWdu ZWQtb2ZmLWJ5OiBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgotLS0KIERvY3VtZW50YXRp b24vZ3B1L2RybS1rbXMtaGVscGVycy5yc3QgfCAgIDMgKwogZHJpdmVycy9ncHUvZHJtL2JyaWRn ZS9LY29uZmlnICAgICAgICB8ICAxMSArLQogZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9NYWtlZmls ZSAgICAgICB8ICAgMSArCiBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2x2ZHMtZW5jb2Rlci5jIHwg MTU4ICsrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2Uv cGFuZWwuYyAgICAgICAgfCAxODggKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwog aW5jbHVkZS9kcm0vZHJtX2JyaWRnZS5oICAgICAgICAgICAgICB8ICAgOCArKwogNiBmaWxlcyBj aGFuZ2VkLCAyMjggaW5zZXJ0aW9ucygrKSwgMTQxIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUg MTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvcGFuZWwuYwoKZGlmZiAtLWdpdCBhL0RvY3Vt ZW50YXRpb24vZ3B1L2RybS1rbXMtaGVscGVycy5yc3QgYi9Eb2N1bWVudGF0aW9uL2dwdS9kcm0t a21zLWhlbHBlcnMucnN0CmluZGV4IGMwNzVhYWRkNzA3OC4uNjBlYjNiNDE3MDJiIDEwMDY0NAot LS0gYS9Eb2N1bWVudGF0aW9uL2dwdS9kcm0ta21zLWhlbHBlcnMucnN0CisrKyBiL0RvY3VtZW50 YXRpb24vZ3B1L2RybS1rbXMtaGVscGVycy5yc3QKQEAgLTE0Myw2ICsxNDMsOSBAQCBCcmlkZ2Ug SGVscGVyIFJlZmVyZW5jZQogLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvZ3B1L2RybS9kcm1fYnJp ZGdlLmMKICAgIDpleHBvcnQ6CiAKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2dwdS9kcm0vYnJp ZGdlL3BhbmVsLmMKKyAgIDpleHBvcnQ6CisKIC4uIF9kcm1fcGFuZWxfaGVscGVyOgogCiBQYW5l bCBIZWxwZXIgUmVmZXJlbmNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tj b25maWcgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tjb25maWcKaW5kZXggZjY5NjhkM2I0YjQx Li5jNGRhY2EzODc0M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvS2NvbmZp ZworKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tjb25maWcKQEAgLTQsNiArNCwxNCBAQCBj b25maWcgRFJNX0JSSURHRQogCWhlbHAKIAkgIEJyaWRnZSByZWdpc3RyYXRpb24gYW5kIGxvb2t1 cCBmcmFtZXdvcmsuCiAKK2NvbmZpZyBEUk1fUEFORUxfQlJJREdFCisJZGVmX2Jvb2wgeQorCWRl cGVuZHMgb24gRFJNX0JSSURHRQorCXNlbGVjdCBEUk1fS01TX0hFTFBFUgorCXNlbGVjdCBEUk1f UEFORUwKKwloZWxwCisJICBEUk0gYnJpZGdlIHdyYXBwZXIgb2YgRFJNIHBhbmVscworCiBtZW51 ICJEaXNwbGF5IEludGVyZmFjZSBCcmlkZ2VzIgogCWRlcGVuZHMgb24gRFJNICYmIERSTV9CUklE R0UKIApAQCAtMjcsOCArMzUsNyBAQCBjb25maWcgRFJNX0RVTUJfVkdBX0RBQwogY29uZmlnIERS TV9MVkRTX0VOQ09ERVIKIAl0cmlzdGF0ZSAiVHJhbnNwYXJlbnQgcGFyYWxsZWwgdG8gTFZEUyBl bmNvZGVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBPRgotCXNlbGVjdCBEUk1fS01TX0hFTFBFUgot CXNlbGVjdCBEUk1fUEFORUwKKwlzZWxlY3QgRFJNX1BBTkVMX0JSSURHRQogCWhlbHAKIAkgIFN1 cHBvcnQgZm9yIHRyYW5zcGFyZW50IHBhcmFsbGVsIHRvIExWRFMgZW5jb2RlcnMgdGhhdCBkb24n dCByZXF1aXJlCiAJICBhbnkgY29uZmlndXJhdGlvbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9icmlkZ2UvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL01ha2VmaWxlCmlu ZGV4IDNmZTIyMjZlZTJmMi4uNDBhNDM3NTBhZDU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9k cm0vYnJpZGdlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZpbGUK QEAgLTUsNiArNSw3IEBAIG9iai0kKENPTkZJR19EUk1fRFVNQl9WR0FfREFDKSArPSBkdW1iLXZn YS1kYWMubwogb2JqLSQoQ09ORklHX0RSTV9MVkRTX0VOQ09ERVIpICs9IGx2ZHMtZW5jb2Rlci5v CiBvYmotJChDT05GSUdfRFJNX01FR0FDSElQU19TVERQWFhYWF9HRV9CODUwVjNfRlcpICs9IG1l Z2FjaGlwcy1zdGRweHh4eC1nZS1iODUwdjMtZncubwogb2JqLSQoQ09ORklHX0RSTV9OWFBfUFRO MzQ2MCkgKz0gbnhwLXB0bjM0NjAubworb2JqLSQoQ09ORklHX0RSTV9QQU5FTF9CUklER0UpICs9 IHBhbmVsLm8KIG9iai0kKENPTkZJR19EUk1fUEFSQURFX1BTODYyMikgKz0gcGFyYWRlLXBzODYy Mi5vCiBvYmotJChDT05GSUdfRFJNX1NJTF9TSUk4NjIwKSArPSBzaWwtc2lpODYyMC5vCiBvYmot JChDT05GSUdfRFJNX1NJSTkwMlgpICs9IHNpaTkwMngubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2JyaWRnZS9sdmRzLWVuY29kZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvbHZk cy1lbmNvZGVyLmMKaW5kZXggZjFmNjdhMjc5NDI2Li4wNGUxNTA0YzRkOGYgMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvbHZkcy1lbmNvZGVyLmMKKysrIGIvZHJpdmVycy9ncHUv ZHJtL2JyaWRnZS9sdmRzLWVuY29kZXIuYwpAQCAtOCwxNDQgKzgsMTggQEAKICAqLwogCiAjaW5j bHVkZSA8ZHJtL2RybVAuaD4KLSNpbmNsdWRlIDxkcm0vZHJtX2F0b21pY19oZWxwZXIuaD4KLSNp bmNsdWRlIDxkcm0vZHJtX2Nvbm5lY3Rvci5oPgotI2luY2x1ZGUgPGRybS9kcm1fY3J0Y19oZWxw ZXIuaD4KLSNpbmNsdWRlIDxkcm0vZHJtX2VuY29kZXIuaD4KLSNpbmNsdWRlIDxkcm0vZHJtX21v ZGVzZXRfaGVscGVyX3Z0YWJsZXMuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2JyaWRnZS5oPgogI2lu Y2x1ZGUgPGRybS9kcm1fcGFuZWwuaD4KIAogI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+CiAK LXN0cnVjdCBsdmRzX2VuY29kZXIgewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQotCXN0cnVjdCBk cm1fYnJpZGdlIGJyaWRnZTsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7Ci0Jc3Ry dWN0IGRybV9wYW5lbCAqcGFuZWw7Ci19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBsdmRzX2Vu Y29kZXIgKgotZHJtX2JyaWRnZV90b19sdmRzX2VuY29kZXIoc3RydWN0IGRybV9icmlkZ2UgKmJy aWRnZSkKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGJyaWRnZSwgc3RydWN0IGx2ZHNfZW5jb2Rl ciwgYnJpZGdlKTsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgbHZkc19lbmNvZGVyICoKLWRy bV9jb25uZWN0b3JfdG9fbHZkc19lbmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0 b3IpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihjb25uZWN0b3IsIHN0cnVjdCBsdmRzX2VuY29k ZXIsIGNvbm5lY3Rvcik7Ci19Ci0KLXN0YXRpYyBpbnQgbHZkc19jb25uZWN0b3JfZ2V0X21vZGVz KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci0Jc3RydWN0IGx2ZHNfZW5jb2Rl ciAqbHZkcyA9IGRybV9jb25uZWN0b3JfdG9fbHZkc19lbmNvZGVyKGNvbm5lY3Rvcik7Ci0KLQly ZXR1cm4gZHJtX3BhbmVsX2dldF9tb2RlcyhsdmRzLT5wYW5lbCk7Ci19Ci0KLXN0YXRpYyBjb25z dCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgbHZkc19jb25uZWN0b3JfaGVscGVy X2Z1bmNzID0gewotCS5nZXRfbW9kZXMgPSBsdmRzX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCi19Owot Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3MgbHZkc19jb25uZWN0b3Jf ZnVuY3MgPSB7Ci0JLmRwbXMgPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZHBtcywKLQku cmVzZXQgPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfcmVzZXQsCi0JLmZpbGxfbW9kZXMg PSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMsCi0JLmRlc3Ryb3kgPSBk cm1fY29ubmVjdG9yX2NsZWFudXAsCi0JLmF0b21pY19kdXBsaWNhdGVfc3RhdGUgPSBkcm1fYXRv bWljX2hlbHBlcl9jb25uZWN0b3JfZHVwbGljYXRlX3N0YXRlLAotCS5hdG9taWNfZGVzdHJveV9z dGF0ZSA9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9kZXN0cm95X3N0YXRlLAotfTsKLQot c3RhdGljIGludCBsdmRzX2VuY29kZXJfYXR0YWNoKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2Up Ci17Ci0Jc3RydWN0IGx2ZHNfZW5jb2RlciAqbHZkcyA9IGRybV9icmlkZ2VfdG9fbHZkc19lbmNv ZGVyKGJyaWRnZSk7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9ICZsdmRzLT5j b25uZWN0b3I7Ci0JaW50IHJldDsKLQotCWlmICghYnJpZGdlLT5lbmNvZGVyKSB7Ci0JCURSTV9F UlJPUigiTWlzc2luZyBlbmNvZGVyXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JZHJt X2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5lY3RvciwgJmx2ZHNfY29ubmVjdG9yX2hlbHBlcl9m dW5jcyk7Ci0KLQlyZXQgPSBkcm1fY29ubmVjdG9yX2luaXQoYnJpZGdlLT5kZXYsIGNvbm5lY3Rv ciwgJmx2ZHNfY29ubmVjdG9yX2Z1bmNzLAotCQkJCSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUyk7 Ci0JaWYgKHJldCkgewotCQlEUk1fRVJST1IoIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbm5lY3Rv clxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9l bmNvZGVyKCZsdmRzLT5jb25uZWN0b3IsIGJyaWRnZS0+ZW5jb2Rlcik7Ci0KLQlyZXQgPSBkcm1f cGFuZWxfYXR0YWNoKGx2ZHMtPnBhbmVsLCAmbHZkcy0+Y29ubmVjdG9yKTsKLQlpZiAocmV0IDwg MCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBsdmRzX2Vu Y29kZXJfZGV0YWNoKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCi17Ci0Jc3RydWN0IGx2ZHNf ZW5jb2RlciAqbHZkcyA9IGRybV9icmlkZ2VfdG9fbHZkc19lbmNvZGVyKGJyaWRnZSk7Ci0KLQlk cm1fcGFuZWxfZGV0YWNoKGx2ZHMtPnBhbmVsKTsKLX0KLQotc3RhdGljIHZvaWQgbHZkc19lbmNv ZGVyX3ByZV9lbmFibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKLXsKLQlzdHJ1Y3QgbHZk c19lbmNvZGVyICpsdmRzID0gZHJtX2JyaWRnZV90b19sdmRzX2VuY29kZXIoYnJpZGdlKTsKLQot CWRybV9wYW5lbF9wcmVwYXJlKGx2ZHMtPnBhbmVsKTsKLX0KLQotc3RhdGljIHZvaWQgbHZkc19l bmNvZGVyX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQotewotCXN0cnVjdCBsdmRz X2VuY29kZXIgKmx2ZHMgPSBkcm1fYnJpZGdlX3RvX2x2ZHNfZW5jb2RlcihicmlkZ2UpOwotCi0J ZHJtX3BhbmVsX2VuYWJsZShsdmRzLT5wYW5lbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGx2ZHNfZW5j b2Rlcl9kaXNhYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCi17Ci0Jc3RydWN0IGx2ZHNf ZW5jb2RlciAqbHZkcyA9IGRybV9icmlkZ2VfdG9fbHZkc19lbmNvZGVyKGJyaWRnZSk7Ci0KLQlk cm1fcGFuZWxfZGlzYWJsZShsdmRzLT5wYW5lbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGx2ZHNfZW5j b2Rlcl9wb3N0X2Rpc2FibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKLXsKLQlzdHJ1Y3Qg bHZkc19lbmNvZGVyICpsdmRzID0gZHJtX2JyaWRnZV90b19sdmRzX2VuY29kZXIoYnJpZGdlKTsK LQotCWRybV9wYW5lbF91bnByZXBhcmUobHZkcy0+cGFuZWwpOwotfQotCi1zdGF0aWMgY29uc3Qg c3RydWN0IGRybV9icmlkZ2VfZnVuY3MgbHZkc19lbmNvZGVyX2JyaWRnZV9mdW5jcyA9IHsKLQku YXR0YWNoID0gbHZkc19lbmNvZGVyX2F0dGFjaCwKLQkuZGV0YWNoID0gbHZkc19lbmNvZGVyX2Rl dGFjaCwKLQkucHJlX2VuYWJsZSA9IGx2ZHNfZW5jb2Rlcl9wcmVfZW5hYmxlLAotCS5lbmFibGUg PSBsdmRzX2VuY29kZXJfZW5hYmxlLAotCS5kaXNhYmxlID0gbHZkc19lbmNvZGVyX2Rpc2FibGUs Ci0JLnBvc3RfZGlzYWJsZSA9IGx2ZHNfZW5jb2Rlcl9wb3N0X2Rpc2FibGUsCi19OwotCiBzdGF0 aWMgaW50IGx2ZHNfZW5jb2Rlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQog ewotCXN0cnVjdCBsdmRzX2VuY29kZXIgKmx2ZHM7CiAJc3RydWN0IGRldmljZV9ub2RlICpwb3J0 OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZW5kcG9pbnQ7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpw YW5lbDsKLQotCWx2ZHMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpsdmRzKSwg R0ZQX0tFUk5FTCk7Ci0JaWYgKCFsdmRzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWx2ZHMtPmRl diA9ICZwZGV2LT5kZXY7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbHZkcyk7Ci0KLQls dmRzLT5icmlkZ2UuZnVuY3MgPSAmbHZkc19lbmNvZGVyX2JyaWRnZV9mdW5jczsKLQlsdmRzLT5i cmlkZ2Uub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAq cGFuZWxfbm9kZTsKKwlzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbDsKKwlzdHJ1Y3QgZHJtX2JyaWRn ZSAqYnJpZGdlOwogCiAJLyogTG9jYXRlIHRoZSBwYW5lbCBEVCBub2RlLiAqLwogCXBvcnQgPSBv Zl9ncmFwaF9nZXRfcG9ydF9ieV9pZChwZGV2LT5kZXYub2Zfbm9kZSwgMSk7CkBAIC0xNjEsMjkg KzM1LDM1IEBAIHN0YXRpYyBpbnQgbHZkc19lbmNvZGVyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYpCiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0JcGFuZWwgPSBvZl9ncmFwaF9n ZXRfcmVtb3RlX3BvcnRfcGFyZW50KGVuZHBvaW50KTsKKwlwYW5lbF9ub2RlID0gb2ZfZ3JhcGhf Z2V0X3JlbW90ZV9wb3J0X3BhcmVudChlbmRwb2ludCk7CiAJb2Zfbm9kZV9wdXQoZW5kcG9pbnQp OwotCWlmICghcGFuZWwpIHsKKwlpZiAoIXBhbmVsX25vZGUpIHsKIAkJZGV2X2RiZygmcGRldi0+ ZGV2LCAibm8gcmVtb3RlIGVuZHBvaW50IGZvciBwb3J0IDFcbiIpOwogCQlyZXR1cm4gLUVOWElP OwogCX0KIAotCWx2ZHMtPnBhbmVsID0gb2ZfZHJtX2ZpbmRfcGFuZWwocGFuZWwpOwotCW9mX25v ZGVfcHV0KHBhbmVsKTsKLQlpZiAoIWx2ZHMtPnBhbmVsKSB7CisJcGFuZWwgPSBvZl9kcm1fZmlu ZF9wYW5lbChwYW5lbF9ub2RlKTsKKwlvZl9ub2RlX3B1dChwYW5lbF9ub2RlKTsKKwlpZiAoIXBh bmVsKSB7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgInBhbmVsIG5vdCBmb3VuZCwgZGVmZXJyaW5n IHByb2JlXG4iKTsKIAkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CiAJfQogCi0JLyogUmVnaXN0ZXIg dGhlIGJyaWRnZS4gKi8KLQlyZXR1cm4gZHJtX2JyaWRnZV9hZGQoJmx2ZHMtPmJyaWRnZSk7CisJ YnJpZGdlID0gZHJtX3BhbmVsX2JyaWRnZV9hZGQoJnBkZXYtPmRldiwgcGFuZWwsCisJCQkJICAg ICAgRFJNX01PREVfQ09OTkVDVE9SX0xWRFMpOworCWlmIChJU19FUlIoYnJpZGdlKSkKKwkJcmV0 dXJuIFBUUl9FUlIoYnJpZGdlKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGJyaWRn ZSk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBsdmRzX2VuY29kZXJfcmVtb3ZlKHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGx2ZHNfZW5jb2RlciAqZW5j b2RlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkcm1fYnJpZGdlICpi cmlkZ2UgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWRybV9icmlkZ2VfcmVtb3Zl KCZlbmNvZGVyLT5icmlkZ2UpOworCWRybV9icmlkZ2VfcmVtb3ZlKGJyaWRnZSk7CiAKIAlyZXR1 cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvcGFuZWwuYyBiL2Ry aXZlcnMvZ3B1L2RybS9icmlkZ2UvcGFuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMDAwMDAuLjIwODEyNDU0NTVjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1 L2RybS9icmlkZ2UvcGFuZWwuYwpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAo QykgMjAxNiBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5j b20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQnJvYWRjb20KKyAqCisgKiBUaGlzIHByb2dyYW0g aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2Rp ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2 ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl ciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgorI2luY2x1ZGUgPGRybS9k cm1fcGFuZWwuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2F0b21pY19oZWxwZXIuaD4KKyNpbmNsdWRl IDxkcm0vZHJtX2Nvbm5lY3Rvci5oPgorI2luY2x1ZGUgPGRybS9kcm1fY3J0Y19oZWxwZXIuaD4K KyNpbmNsdWRlIDxkcm0vZHJtX2VuY29kZXIuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX21vZGVzZXRf aGVscGVyX3Z0YWJsZXMuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX3BhbmVsLmg+CisKK3N0cnVjdCBw YW5lbF9icmlkZ2UgeworCXN0cnVjdCBkcm1fYnJpZGdlIGJyaWRnZTsKKwlzdHJ1Y3QgZGV2aWNl ICpkZXY7CisJc3RydWN0IGRybV9jb25uZWN0b3IgY29ubmVjdG9yOworCXN0cnVjdCBkcm1fcGFu ZWwgKnBhbmVsOworCXUzMiBjb25uZWN0b3JfdHlwZTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3Ry dWN0IHBhbmVsX2JyaWRnZSAqCitkcm1fYnJpZGdlX3RvX3BhbmVsX2JyaWRnZShzdHJ1Y3QgZHJt X2JyaWRnZSAqYnJpZGdlKQoreworCXJldHVybiBjb250YWluZXJfb2YoYnJpZGdlLCBzdHJ1Y3Qg cGFuZWxfYnJpZGdlLCBicmlkZ2UpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYW5lbF9i cmlkZ2UgKgorZHJtX2Nvbm5lY3Rvcl90b19wYW5lbF9icmlkZ2Uoc3RydWN0IGRybV9jb25uZWN0 b3IgKmNvbm5lY3RvcikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNvbm5lY3Rvciwgc3RydWN0 IHBhbmVsX2JyaWRnZSwgY29ubmVjdG9yKTsKK30KKworc3RhdGljIGludCBwYW5lbF9icmlkZ2Vf Y29ubmVjdG9yX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQorewor CXN0cnVjdCBwYW5lbF9icmlkZ2UgKnBhbmVsX2JyaWRnZSA9CisJCWRybV9jb25uZWN0b3JfdG9f cGFuZWxfYnJpZGdlKGNvbm5lY3Rvcik7CisKKwlyZXR1cm4gZHJtX3BhbmVsX2dldF9tb2Rlcyhw YW5lbF9icmlkZ2UtPnBhbmVsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVj dG9yX2hlbHBlcl9mdW5jcyBwYW5lbF9icmlkZ2VfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsK KwkuZ2V0X21vZGVzID0gcGFuZWxfYnJpZGdlX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCit9OworCitz dGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3MgcGFuZWxfYnJpZGdlX2Nvbm5l Y3Rvcl9mdW5jcyA9IHsKKwkuZHBtcyA9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9kcG1z LAorCS5yZXNldCA9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9yZXNldCwKKwkuZmlsbF9t b2RlcyA9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKKwkuZGVzdHJv eSA9IGRybV9jb25uZWN0b3JfY2xlYW51cCwKKwkuYXRvbWljX2R1cGxpY2F0ZV9zdGF0ZSA9IGRy bV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9kdXBsaWNhdGVfc3RhdGUsCisJLmF0b21pY19kZXN0 cm95X3N0YXRlID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2Rlc3Ryb3lfc3RhdGUsCit9 OworCitzdGF0aWMgaW50IHBhbmVsX2JyaWRnZV9hdHRhY2goc3RydWN0IGRybV9icmlkZ2UgKmJy aWRnZSkKK3sKKwlzdHJ1Y3QgcGFuZWxfYnJpZGdlICpwYW5lbF9icmlkZ2UgPSBkcm1fYnJpZGdl X3RvX3BhbmVsX2JyaWRnZShicmlkZ2UpOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0 b3IgPSAmcGFuZWxfYnJpZGdlLT5jb25uZWN0b3I7CisJaW50IHJldDsKKworCWlmICghYnJpZGdl LT5lbmNvZGVyKSB7CisJCURSTV9FUlJPUigiTWlzc2luZyBlbmNvZGVyXG4iKTsKKwkJcmV0dXJu IC1FTk9ERVY7CisJfQorCisJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5lY3RvciwKKwkJ CQkgJnBhbmVsX2JyaWRnZV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKworCXJldCA9IGRybV9j b25uZWN0b3JfaW5pdChicmlkZ2UtPmRldiwgY29ubmVjdG9yLAorCQkJCSAmcGFuZWxfYnJpZGdl X2Nvbm5lY3Rvcl9mdW5jcywKKwkJCQkgcGFuZWxfYnJpZGdlLT5jb25uZWN0b3JfdHlwZSk7CisJ aWYgKHJldCkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbm5lY3Rvclxu Iik7CisJCXJldHVybiByZXQ7CisJfQorCisJZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNv ZGVyKCZwYW5lbF9icmlkZ2UtPmNvbm5lY3RvciwKKwkJCQkJICBicmlkZ2UtPmVuY29kZXIpOwor CisJcmV0ID0gZHJtX3BhbmVsX2F0dGFjaChwYW5lbF9icmlkZ2UtPnBhbmVsLCAmcGFuZWxfYnJp ZGdlLT5jb25uZWN0b3IpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhbmVsX2JyaWRnZV9kZXRhY2goc3RydWN0IGRybV9icmlk Z2UgKmJyaWRnZSkKK3sKKwlzdHJ1Y3QgcGFuZWxfYnJpZGdlICpwYW5lbF9icmlkZ2UgPSBkcm1f YnJpZGdlX3RvX3BhbmVsX2JyaWRnZShicmlkZ2UpOworCisJZHJtX3BhbmVsX2RldGFjaChwYW5l bF9icmlkZ2UtPnBhbmVsKTsKK30KKworc3RhdGljIHZvaWQgcGFuZWxfYnJpZGdlX3ByZV9lbmFi bGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKK3sKKwlzdHJ1Y3QgcGFuZWxfYnJpZGdlICpw YW5lbF9icmlkZ2UgPSBkcm1fYnJpZGdlX3RvX3BhbmVsX2JyaWRnZShicmlkZ2UpOworCisJZHJt X3BhbmVsX3ByZXBhcmUocGFuZWxfYnJpZGdlLT5wYW5lbCk7Cit9CisKK3N0YXRpYyB2b2lkIHBh bmVsX2JyaWRnZV9lbmFibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKK3sKKwlzdHJ1Y3Qg cGFuZWxfYnJpZGdlICpwYW5lbF9icmlkZ2UgPSBkcm1fYnJpZGdlX3RvX3BhbmVsX2JyaWRnZShi cmlkZ2UpOworCisJZHJtX3BhbmVsX2VuYWJsZShwYW5lbF9icmlkZ2UtPnBhbmVsKTsKK30KKwor c3RhdGljIHZvaWQgcGFuZWxfYnJpZGdlX2Rpc2FibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRn ZSkKK3sKKwlzdHJ1Y3QgcGFuZWxfYnJpZGdlICpwYW5lbF9icmlkZ2UgPSBkcm1fYnJpZGdlX3Rv X3BhbmVsX2JyaWRnZShicmlkZ2UpOworCisJZHJtX3BhbmVsX2Rpc2FibGUocGFuZWxfYnJpZGdl LT5wYW5lbCk7Cit9CisKK3N0YXRpYyB2b2lkIHBhbmVsX2JyaWRnZV9wb3N0X2Rpc2FibGUoc3Ry dWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKK3sKKwlzdHJ1Y3QgcGFuZWxfYnJpZGdlICpwYW5lbF9i cmlkZ2UgPSBkcm1fYnJpZGdlX3RvX3BhbmVsX2JyaWRnZShicmlkZ2UpOworCisJZHJtX3BhbmVs X3VucHJlcGFyZShwYW5lbF9icmlkZ2UtPnBhbmVsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVj dCBkcm1fYnJpZGdlX2Z1bmNzIHBhbmVsX2JyaWRnZV9icmlkZ2VfZnVuY3MgPSB7CisJLmF0dGFj aCA9IHBhbmVsX2JyaWRnZV9hdHRhY2gsCisJLmRldGFjaCA9IHBhbmVsX2JyaWRnZV9kZXRhY2gs CisJLnByZV9lbmFibGUgPSBwYW5lbF9icmlkZ2VfcHJlX2VuYWJsZSwKKwkuZW5hYmxlID0gcGFu ZWxfYnJpZGdlX2VuYWJsZSwKKwkuZGlzYWJsZSA9IHBhbmVsX2JyaWRnZV9kaXNhYmxlLAorCS5w b3N0X2Rpc2FibGUgPSBwYW5lbF9icmlkZ2VfcG9zdF9kaXNhYmxlLAorfTsKKworLyoqCisgKiBk cm1fcGFuZWxfYnJpZGdlX2FkZCAtIENyZWF0ZXMgYSBkcm1fYnJpZGdlIGFuZCBkcm1fY29ubmVj dG9yIHRoYXQKKyAqIGp1c3QgY2FsbCB0aGUgYXBwcm9wcmlhdGUgZnVuY3Rpb25zIGZyb20gZHJt X3BhbmVsLgorICoKKyAqIEBkZXY6IFRoZSBzdHJ1Y3QgZGV2aWNlIG9mIHRoZSBwYW5lbCBkZXZp Y2UuICBUaGlzIGlzIHVzZWQgZm9yCisgKiByZWdpc3RlcmluZyB0aGUgZHJtX2JyaWRnZS4KKyAq IEBwYW5lbDogVGhlIGRybV9wYW5lbCBiZWluZyB3cmFwcGVkLiAgTXVzdCBiZSBub24tTlVMTC4K KyAqIEBjb25uZWN0b3JfdHlwZTogVGhlIERSTV9NT0RFX0NPTk5FQ1RPUl8qIGZvciB0aGUgY29u bmVjdG9yIHRvIGJlCisgKiBjcmVhdGVkLgorICoKKyAqIEZvciBkcml2ZXJzIGNvbnZlcnRpbmcg ZnJvbSBkaXJlY3RseSB1c2luZyBkcm1fcGFuZWw6IFRoZSBleHBlY3RlZAorICogdXNhZ2UgcGF0 dGVybiBpcyB0aGF0IGR1cmluZyBlaXRoZXIgZW5jb2RlciBtb2R1bGUgcHJvYmUgb3IgRFNJCisg KiBob3N0IGF0dGFjaCwgYSBkcm1fcGFuZWwgd2lsbCBiZSBsb29rZWQgdXAgdGhyb3VnaAorICog ZHJtX29mX2ZpbmRfcGFuZWxfb3JfYnJpZGdlKCkuICBkcm1fcGFuZWxfYnJpZGdlX2FkZCgpIGlz IHVzZWQgdG8KKyAqIHdyYXAgdGhhdCBwYW5lbCBpbiB0aGUgbmV3IGJyaWRnZSwgYW5kIHRoZSBy ZXN1bHQgY2FuIHRoZW4gYmUKKyAqIHBhc3NlZCB0byBkcm1fYnJpZGdlX2F0dGFjaCgpLiAgVGhl IGRybV9wYW5lbF9wcmVwYXJlKCkgYW5kIHJlbGF0ZWQKKyAqIGZ1bmN0aW9ucyBjYW4gYmUgZHJv cHBlZCBmcm9tIHRoZSBlbmNvZGVyIGRyaXZlciAodGhleSdyZSBub3cKKyAqIGNhbGxlZCBieSB0 aGUgS01TIGhlbHBlcnMgYmVmb3JlIGNhbGxpbmcgaW50byB0aGUgZW5jb2RlciksIGFsb25nCisg KiB3aXRoIGNvbm5lY3RvciBjcmVhdGlvbi4KKyAqLworc3RydWN0IGRybV9icmlkZ2UgKmRybV9w YW5lbF9icmlkZ2VfYWRkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRybV9wYW5l bCAqcGFuZWwsCisJCQkJCXUzMiBjb25uZWN0b3JfdHlwZSkKK3sKKwlzdHJ1Y3QgcGFuZWxfYnJp ZGdlICpwYW5lbF9icmlkZ2UgPQorCQlkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBhbmVsX2Jy aWRnZSksIEdGUF9LRVJORUwpOworCWludCByZXQ7CisKKwlpZiAoIWRldiB8fCAhcGFuZWwpCisJ CXJldHVybiBFUlJfUFRSKEVJTlZBTCk7CisKKwlwYW5lbF9icmlkZ2UtPmRldiA9IGRldjsKKwlw YW5lbF9icmlkZ2UtPmNvbm5lY3Rvcl90eXBlID0gY29ubmVjdG9yX3R5cGU7CisJcGFuZWxfYnJp ZGdlLT5wYW5lbCA9IHBhbmVsOworCisJcGFuZWxfYnJpZGdlLT5icmlkZ2UuZnVuY3MgPSAmcGFu ZWxfYnJpZGdlX2JyaWRnZV9mdW5jczsKKwlwYW5lbF9icmlkZ2UtPmJyaWRnZS5vZl9ub2RlID0g ZGV2LT5vZl9ub2RlOworCisJcmV0ID0gZHJtX2JyaWRnZV9hZGQoJnBhbmVsX2JyaWRnZS0+YnJp ZGdlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCisJcmV0dXJuICZwYW5l bF9icmlkZ2UtPmJyaWRnZTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX3BhbmVsX2JyaWRnZV9hZGQp OworCit2b2lkIGRybV9wYW5lbF9icmlkZ2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3Ry dWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKK3sKKwlkcm1fYnJpZGdlX3JlbW92ZShicmlkZ2UpOwor CWRldm1fa2ZyZWUoZGV2LCBicmlkZ2UpOworfQorRVhQT1JUX1NZTUJPTChkcm1fcGFuZWxfYnJp ZGdlX3JlbW92ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fYnJpZGdlLmggYi9pbmNs dWRlL2RybS9kcm1fYnJpZGdlLmgKaW5kZXggZmRkODJmY2JmMTY4Li5lMDg1NjNlZTA1NDYgMTAw NjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9icmlkZ2UuaAorKysgYi9pbmNsdWRlL2RybS9kcm1f YnJpZGdlLmgKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxkcm0vZHJtX21vZGVzLmg+CiAK IHN0cnVjdCBkcm1fYnJpZGdlOworc3RydWN0IGRybV9wYW5lbDsKIAogLyoqCiAgKiBzdHJ1Y3Qg ZHJtX2JyaWRnZV9mdW5jcyAtIGRybV9icmlkZ2UgY29udHJvbCBmdW5jdGlvbnMKQEAgLTIyMSw0 ICsyMjIsMTEgQEAgdm9pZCBkcm1fYnJpZGdlX21vZGVfc2V0KHN0cnVjdCBkcm1fYnJpZGdlICpi cmlkZ2UsCiB2b2lkIGRybV9icmlkZ2VfcHJlX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJp ZGdlKTsKIHZvaWQgZHJtX2JyaWRnZV9lbmFibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSk7 CiAKKyNpZmRlZiBDT05GSUdfRFJNX1BBTkVMCitzdHJ1Y3QgZHJtX2JyaWRnZSAqZHJtX3BhbmVs X2JyaWRnZV9hZGQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZHJtX3BhbmVsICpw YW5lbCwKKwkJCQkJdTMyIGNvbm5lY3Rvcl90eXBlKTsKK3ZvaWQgZHJtX3BhbmVsX2JyaWRnZV9y ZW1vdmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKTsKKyNl bmRpZgorCiAjZW5kaWYKLS0gCjIuMTEuMAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMu ZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlz dGluZm8vZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S939373AbdD0Qgd (ORCPT ); Thu, 27 Apr 2017 12:36:33 -0400 Received: from anholt.net ([50.246.234.109]:34064 "EHLO anholt.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S938674AbdD0QgH (ORCPT ); Thu, 27 Apr 2017 12:36:07 -0400 From: Eric Anholt To: dri-devel@lists.freedesktop.org Cc: linux-kernel@vger.kernel.org, Yannick Fertre , Eric Anholt Subject: [PATCH 1/2] drm/bridge: Refactor out the panel wrapper from the lvds-encoder bridge. Date: Thu, 27 Apr 2017 09:36:00 -0700 Message-Id: <20170427163601.7313-1-eric@anholt.net> X-Mailer: git-send-email 2.11.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Many DRM drivers have common code to make a stub connector implementation that wraps a drm_panel. By wrapping the panel in a DRM bridge, all of the connector code (including calls during encoder enable/disable) goes away. Signed-off-by: Eric Anholt --- Documentation/gpu/drm-kms-helpers.rst | 3 + drivers/gpu/drm/bridge/Kconfig | 11 +- drivers/gpu/drm/bridge/Makefile | 1 + drivers/gpu/drm/bridge/lvds-encoder.c | 158 ++++------------------------ drivers/gpu/drm/bridge/panel.c | 188 ++++++++++++++++++++++++++++++++++ include/drm/drm_bridge.h | 8 ++ 6 files changed, 228 insertions(+), 141 deletions(-) create mode 100644 drivers/gpu/drm/bridge/panel.c diff --git a/Documentation/gpu/drm-kms-helpers.rst b/Documentation/gpu/drm-kms-helpers.rst index c075aadd7078..60eb3b41702b 100644 --- a/Documentation/gpu/drm-kms-helpers.rst +++ b/Documentation/gpu/drm-kms-helpers.rst @@ -143,6 +143,9 @@ Bridge Helper Reference .. kernel-doc:: drivers/gpu/drm/drm_bridge.c :export: +.. kernel-doc:: drivers/gpu/drm/bridge/panel.c + :export: + .. _drm_panel_helper: Panel Helper Reference diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig index f6968d3b4b41..c4daca38743c 100644 --- a/drivers/gpu/drm/bridge/Kconfig +++ b/drivers/gpu/drm/bridge/Kconfig @@ -4,6 +4,14 @@ config DRM_BRIDGE help Bridge registration and lookup framework. +config DRM_PANEL_BRIDGE + def_bool y + depends on DRM_BRIDGE + select DRM_KMS_HELPER + select DRM_PANEL + help + DRM bridge wrapper of DRM panels + menu "Display Interface Bridges" depends on DRM && DRM_BRIDGE @@ -27,8 +35,7 @@ config DRM_DUMB_VGA_DAC config DRM_LVDS_ENCODER tristate "Transparent parallel to LVDS encoder support" depends on OF - select DRM_KMS_HELPER - select DRM_PANEL + select DRM_PANEL_BRIDGE help Support for transparent parallel to LVDS encoders that don't require any configuration. diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makefile index 3fe2226ee2f2..40a43750ad55 100644 --- a/drivers/gpu/drm/bridge/Makefile +++ b/drivers/gpu/drm/bridge/Makefile @@ -5,6 +5,7 @@ obj-$(CONFIG_DRM_DUMB_VGA_DAC) += dumb-vga-dac.o obj-$(CONFIG_DRM_LVDS_ENCODER) += lvds-encoder.o obj-$(CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW) += megachips-stdpxxxx-ge-b850v3-fw.o obj-$(CONFIG_DRM_NXP_PTN3460) += nxp-ptn3460.o +obj-$(CONFIG_DRM_PANEL_BRIDGE) += panel.o obj-$(CONFIG_DRM_PARADE_PS8622) += parade-ps8622.o obj-$(CONFIG_DRM_SIL_SII8620) += sil-sii8620.o obj-$(CONFIG_DRM_SII902X) += sii902x.o diff --git a/drivers/gpu/drm/bridge/lvds-encoder.c b/drivers/gpu/drm/bridge/lvds-encoder.c index f1f67a279426..04e1504c4d8f 100644 --- a/drivers/gpu/drm/bridge/lvds-encoder.c +++ b/drivers/gpu/drm/bridge/lvds-encoder.c @@ -8,144 +8,18 @@ */ #include -#include -#include -#include -#include -#include +#include #include #include -struct lvds_encoder { - struct device *dev; - - struct drm_bridge bridge; - struct drm_connector connector; - struct drm_panel *panel; -}; - -static inline struct lvds_encoder * -drm_bridge_to_lvds_encoder(struct drm_bridge *bridge) -{ - return container_of(bridge, struct lvds_encoder, bridge); -} - -static inline struct lvds_encoder * -drm_connector_to_lvds_encoder(struct drm_connector *connector) -{ - return container_of(connector, struct lvds_encoder, connector); -} - -static int lvds_connector_get_modes(struct drm_connector *connector) -{ - struct lvds_encoder *lvds = drm_connector_to_lvds_encoder(connector); - - return drm_panel_get_modes(lvds->panel); -} - -static const struct drm_connector_helper_funcs lvds_connector_helper_funcs = { - .get_modes = lvds_connector_get_modes, -}; - -static const struct drm_connector_funcs lvds_connector_funcs = { - .dpms = drm_atomic_helper_connector_dpms, - .reset = drm_atomic_helper_connector_reset, - .fill_modes = drm_helper_probe_single_connector_modes, - .destroy = drm_connector_cleanup, - .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, - .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, -}; - -static int lvds_encoder_attach(struct drm_bridge *bridge) -{ - struct lvds_encoder *lvds = drm_bridge_to_lvds_encoder(bridge); - struct drm_connector *connector = &lvds->connector; - int ret; - - if (!bridge->encoder) { - DRM_ERROR("Missing encoder\n"); - return -ENODEV; - } - - drm_connector_helper_add(connector, &lvds_connector_helper_funcs); - - ret = drm_connector_init(bridge->dev, connector, &lvds_connector_funcs, - DRM_MODE_CONNECTOR_LVDS); - if (ret) { - DRM_ERROR("Failed to initialize connector\n"); - return ret; - } - - drm_mode_connector_attach_encoder(&lvds->connector, bridge->encoder); - - ret = drm_panel_attach(lvds->panel, &lvds->connector); - if (ret < 0) - return ret; - - return 0; -} - -static void lvds_encoder_detach(struct drm_bridge *bridge) -{ - struct lvds_encoder *lvds = drm_bridge_to_lvds_encoder(bridge); - - drm_panel_detach(lvds->panel); -} - -static void lvds_encoder_pre_enable(struct drm_bridge *bridge) -{ - struct lvds_encoder *lvds = drm_bridge_to_lvds_encoder(bridge); - - drm_panel_prepare(lvds->panel); -} - -static void lvds_encoder_enable(struct drm_bridge *bridge) -{ - struct lvds_encoder *lvds = drm_bridge_to_lvds_encoder(bridge); - - drm_panel_enable(lvds->panel); -} - -static void lvds_encoder_disable(struct drm_bridge *bridge) -{ - struct lvds_encoder *lvds = drm_bridge_to_lvds_encoder(bridge); - - drm_panel_disable(lvds->panel); -} - -static void lvds_encoder_post_disable(struct drm_bridge *bridge) -{ - struct lvds_encoder *lvds = drm_bridge_to_lvds_encoder(bridge); - - drm_panel_unprepare(lvds->panel); -} - -static const struct drm_bridge_funcs lvds_encoder_bridge_funcs = { - .attach = lvds_encoder_attach, - .detach = lvds_encoder_detach, - .pre_enable = lvds_encoder_pre_enable, - .enable = lvds_encoder_enable, - .disable = lvds_encoder_disable, - .post_disable = lvds_encoder_post_disable, -}; - static int lvds_encoder_probe(struct platform_device *pdev) { - struct lvds_encoder *lvds; struct device_node *port; struct device_node *endpoint; - struct device_node *panel; - - lvds = devm_kzalloc(&pdev->dev, sizeof(*lvds), GFP_KERNEL); - if (!lvds) - return -ENOMEM; - - lvds->dev = &pdev->dev; - platform_set_drvdata(pdev, lvds); - - lvds->bridge.funcs = &lvds_encoder_bridge_funcs; - lvds->bridge.of_node = pdev->dev.of_node; + struct device_node *panel_node; + struct drm_panel *panel; + struct drm_bridge *bridge; /* Locate the panel DT node. */ port = of_graph_get_port_by_id(pdev->dev.of_node, 1); @@ -161,29 +35,35 @@ static int lvds_encoder_probe(struct platform_device *pdev) return -ENXIO; } - panel = of_graph_get_remote_port_parent(endpoint); + panel_node = of_graph_get_remote_port_parent(endpoint); of_node_put(endpoint); - if (!panel) { + if (!panel_node) { dev_dbg(&pdev->dev, "no remote endpoint for port 1\n"); return -ENXIO; } - lvds->panel = of_drm_find_panel(panel); - of_node_put(panel); - if (!lvds->panel) { + panel = of_drm_find_panel(panel_node); + of_node_put(panel_node); + if (!panel) { dev_dbg(&pdev->dev, "panel not found, deferring probe\n"); return -EPROBE_DEFER; } - /* Register the bridge. */ - return drm_bridge_add(&lvds->bridge); + bridge = drm_panel_bridge_add(&pdev->dev, panel, + DRM_MODE_CONNECTOR_LVDS); + if (IS_ERR(bridge)) + return PTR_ERR(bridge); + + platform_set_drvdata(pdev, bridge); + + return 0; } static int lvds_encoder_remove(struct platform_device *pdev) { - struct lvds_encoder *encoder = platform_get_drvdata(pdev); + struct drm_bridge *bridge = platform_get_drvdata(pdev); - drm_bridge_remove(&encoder->bridge); + drm_bridge_remove(bridge); return 0; } diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c new file mode 100644 index 000000000000..2081245455c6 --- /dev/null +++ b/drivers/gpu/drm/bridge/panel.c @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2016 Laurent Pinchart + * Copyright (C) 2017 Broadcom + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +struct panel_bridge { + struct drm_bridge bridge; + struct device *dev; + struct drm_connector connector; + struct drm_panel *panel; + u32 connector_type; +}; + +static inline struct panel_bridge * +drm_bridge_to_panel_bridge(struct drm_bridge *bridge) +{ + return container_of(bridge, struct panel_bridge, bridge); +} + +static inline struct panel_bridge * +drm_connector_to_panel_bridge(struct drm_connector *connector) +{ + return container_of(connector, struct panel_bridge, connector); +} + +static int panel_bridge_connector_get_modes(struct drm_connector *connector) +{ + struct panel_bridge *panel_bridge = + drm_connector_to_panel_bridge(connector); + + return drm_panel_get_modes(panel_bridge->panel); +} + +static const struct drm_connector_helper_funcs panel_bridge_connector_helper_funcs = { + .get_modes = panel_bridge_connector_get_modes, +}; + +static const struct drm_connector_funcs panel_bridge_connector_funcs = { + .dpms = drm_atomic_helper_connector_dpms, + .reset = drm_atomic_helper_connector_reset, + .fill_modes = drm_helper_probe_single_connector_modes, + .destroy = drm_connector_cleanup, + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, +}; + +static int panel_bridge_attach(struct drm_bridge *bridge) +{ + struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); + struct drm_connector *connector = &panel_bridge->connector; + int ret; + + if (!bridge->encoder) { + DRM_ERROR("Missing encoder\n"); + return -ENODEV; + } + + drm_connector_helper_add(connector, + &panel_bridge_connector_helper_funcs); + + ret = drm_connector_init(bridge->dev, connector, + &panel_bridge_connector_funcs, + panel_bridge->connector_type); + if (ret) { + DRM_ERROR("Failed to initialize connector\n"); + return ret; + } + + drm_mode_connector_attach_encoder(&panel_bridge->connector, + bridge->encoder); + + ret = drm_panel_attach(panel_bridge->panel, &panel_bridge->connector); + if (ret < 0) + return ret; + + return 0; +} + +static void panel_bridge_detach(struct drm_bridge *bridge) +{ + struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); + + drm_panel_detach(panel_bridge->panel); +} + +static void panel_bridge_pre_enable(struct drm_bridge *bridge) +{ + struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); + + drm_panel_prepare(panel_bridge->panel); +} + +static void panel_bridge_enable(struct drm_bridge *bridge) +{ + struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); + + drm_panel_enable(panel_bridge->panel); +} + +static void panel_bridge_disable(struct drm_bridge *bridge) +{ + struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); + + drm_panel_disable(panel_bridge->panel); +} + +static void panel_bridge_post_disable(struct drm_bridge *bridge) +{ + struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); + + drm_panel_unprepare(panel_bridge->panel); +} + +static const struct drm_bridge_funcs panel_bridge_bridge_funcs = { + .attach = panel_bridge_attach, + .detach = panel_bridge_detach, + .pre_enable = panel_bridge_pre_enable, + .enable = panel_bridge_enable, + .disable = panel_bridge_disable, + .post_disable = panel_bridge_post_disable, +}; + +/** + * drm_panel_bridge_add - Creates a drm_bridge and drm_connector that + * just call the appropriate functions from drm_panel. + * + * @dev: The struct device of the panel device. This is used for + * registering the drm_bridge. + * @panel: The drm_panel being wrapped. Must be non-NULL. + * @connector_type: The DRM_MODE_CONNECTOR_* for the connector to be + * created. + * + * For drivers converting from directly using drm_panel: The expected + * usage pattern is that during either encoder module probe or DSI + * host attach, a drm_panel will be looked up through + * drm_of_find_panel_or_bridge(). drm_panel_bridge_add() is used to + * wrap that panel in the new bridge, and the result can then be + * passed to drm_bridge_attach(). The drm_panel_prepare() and related + * functions can be dropped from the encoder driver (they're now + * called by the KMS helpers before calling into the encoder), along + * with connector creation. + */ +struct drm_bridge *drm_panel_bridge_add(struct device *dev, + struct drm_panel *panel, + u32 connector_type) +{ + struct panel_bridge *panel_bridge = + devm_kzalloc(dev, sizeof(*panel_bridge), GFP_KERNEL); + int ret; + + if (!dev || !panel) + return ERR_PTR(EINVAL); + + panel_bridge->dev = dev; + panel_bridge->connector_type = connector_type; + panel_bridge->panel = panel; + + panel_bridge->bridge.funcs = &panel_bridge_bridge_funcs; + panel_bridge->bridge.of_node = dev->of_node; + + ret = drm_bridge_add(&panel_bridge->bridge); + if (ret) + return ERR_PTR(ret); + + return &panel_bridge->bridge; +} +EXPORT_SYMBOL(drm_panel_bridge_add); + +void drm_panel_bridge_remove(struct device *dev, struct drm_bridge *bridge) +{ + drm_bridge_remove(bridge); + devm_kfree(dev, bridge); +} +EXPORT_SYMBOL(drm_panel_bridge_remove); diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index fdd82fcbf168..e08563ee0546 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -29,6 +29,7 @@ #include struct drm_bridge; +struct drm_panel; /** * struct drm_bridge_funcs - drm_bridge control functions @@ -221,4 +222,11 @@ void drm_bridge_mode_set(struct drm_bridge *bridge, void drm_bridge_pre_enable(struct drm_bridge *bridge); void drm_bridge_enable(struct drm_bridge *bridge); +#ifdef CONFIG_DRM_PANEL +struct drm_bridge *drm_panel_bridge_add(struct device *dev, + struct drm_panel *panel, + u32 connector_type); +void drm_panel_bridge_remove(struct device *dev, struct drm_bridge *bridge); +#endif + #endif -- 2.11.0