From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Anholt Subject: [PATCH 2/2] drm/vc4: Switch to using the panel-bridge layer, and support bridges. Date: Thu, 27 Apr 2017 09:36:01 -0700 Message-ID: <20170427163601.7313-2-eric@anholt.net> References: <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 356866E69E for ; Thu, 27 Apr 2017 16:36:06 +0000 (UTC) In-Reply-To: <20170427163601.7313-1-eric@anholt.net> 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 VGhlIG5ld2VyIHZlcnNpb24gb2YgdGhlIFJQaSBwYW5lbCBkcml2ZXIgaXMgZ29pbmcgdG8gYmUg YSBjb21iaW5hdGlvbgpvZiBhIGJyaWRnZSBhbmQgYSBwYW5lbCwgYnV0IHdlIHNob3VsZCBhbHNv IHN1cHBvcnQgcGFuZWxzIHdpdGhvdXQgYQpicmlkZ2UsIHNvIHRoZSBwYW5lbC1icmlkZ2UgbGF5 ZXIgbGV0cyB1cyBkbyB0aGF0IGNsZWFubHkuCgpTaWduZWQtb2ZmLWJ5OiBFcmljIEFuaG9sdCA8 ZXJpY0BhbmhvbHQubmV0PgotLS0KIGRyaXZlcnMvZ3B1L2RybS92YzQvS2NvbmZpZyAgIHwgICAy ICstCiBkcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9kc2kuYyB8IDE1OCArKysrKysrLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDIgZmlsZXMgY2hhbmdlZCwgMjYgaW5zZXJ0aW9u cygrKSwgMTM0IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92YzQv S2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS92YzQvS2NvbmZpZwppbmRleCA5NzNiNDIwM2MwYjIu LjExOGRlZjY3YzlhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZjNC9LY29uZmlnCisr KyBiL2RyaXZlcnMvZ3B1L2RybS92YzQvS2NvbmZpZwpAQCAtNyw3ICs3LDcgQEAgY29uZmlnIERS TV9WQzQKIAlzZWxlY3QgRFJNX0tNU19IRUxQRVIKIAlzZWxlY3QgRFJNX0tNU19DTUFfSEVMUEVS CiAJc2VsZWN0IERSTV9HRU1fQ01BX0hFTFBFUgotCXNlbGVjdCBEUk1fUEFORUwKKwlzZWxlY3Qg RFJNX1BBTkVMX0JSSURHRQogCXNlbGVjdCBTTkRfUENNCiAJc2VsZWN0IFNORF9QQ01fRUxECiAJ c2VsZWN0IFNORF9TT0NfR0VORVJJQ19ETUFFTkdJTkVfUENNCmRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vdmM0L3ZjNF9kc2kuYyBiL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2RzaS5jCmlu ZGV4IGRlYmE2MjAwOGZkMC4uYTI3OTE4OGUzMTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9k cm0vdmM0L3ZjNF9kc2kuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9kc2kuYwpAQCAt NTAzLDggKzUwMyw4IEBAIHN0cnVjdCB2YzRfZHNpIHsKIAogCXN0cnVjdCBtaXBpX2RzaV9ob3N0 IGRzaV9ob3N0OwogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKLQlzdHJ1Y3QgZHJtX2Nv bm5lY3RvciAqY29ubmVjdG9yOwotCXN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsOworCXN0cnVjdCBk cm1fYnJpZGdlICpicmlkZ2U7CisJYm9vbCBpc19wYW5lbF9icmlkZ2U7CiAKIAl2b2lkIF9faW9t ZW0gKnJlZ3M7CiAKQEAgLTYwNCwxOCArNjA0LDYgQEAgdG9fdmM0X2RzaV9lbmNvZGVyKHN0cnVj dCBkcm1fZW5jb2RlciAqZW5jb2RlcikKIAlyZXR1cm4gY29udGFpbmVyX29mKGVuY29kZXIsIHN0 cnVjdCB2YzRfZHNpX2VuY29kZXIsIGJhc2UuYmFzZSk7CiB9CiAKLS8qIFZDNCBEU0kgY29ubmVj dG9yIEtNUyBzdHJ1Y3QgKi8KLXN0cnVjdCB2YzRfZHNpX2Nvbm5lY3RvciB7Ci0Jc3RydWN0IGRy bV9jb25uZWN0b3IgYmFzZTsKLQlzdHJ1Y3QgdmM0X2RzaSAqZHNpOwotfTsKLQotc3RhdGljIGlu bGluZSBzdHJ1Y3QgdmM0X2RzaV9jb25uZWN0b3IgKgotdG9fdmM0X2RzaV9jb25uZWN0b3Ioc3Ry dWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGNv bm5lY3Rvciwgc3RydWN0IHZjNF9kc2lfY29ubmVjdG9yLCBiYXNlKTsKLX0KLQogI2RlZmluZSBE U0lfUkVHKHJlZykgeyByZWcsICNyZWcgfQogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJdTMyIHJl ZzsKQEAgLTcyMyw3OSArNzExLDYgQEAgaW50IHZjNF9kc2lfZGVidWdmc19yZWdzKHN0cnVjdCBz ZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKQogfQogI2VuZGlmCiAKLXN0YXRpYyBlbnVtIGRybV9j b25uZWN0b3Jfc3RhdHVzCi12YzRfZHNpX2Nvbm5lY3Rvcl9kZXRlY3Qoc3RydWN0IGRybV9jb25u ZWN0b3IgKmNvbm5lY3RvciwgYm9vbCBmb3JjZSkKLXsKLQlzdHJ1Y3QgdmM0X2RzaV9jb25uZWN0 b3IgKnZjNF9jb25uZWN0b3IgPQotCQl0b192YzRfZHNpX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwot CXN0cnVjdCB2YzRfZHNpICpkc2kgPSB2YzRfY29ubmVjdG9yLT5kc2k7Ci0KLQlpZiAoZHNpLT5w YW5lbCkKLQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwotCWVsc2UKLQkJcmV0 dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwotfQotCi1zdGF0aWMgdm9pZCB2YzRf ZHNpX2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17 Ci0JZHJtX2Nvbm5lY3Rvcl91bnJlZ2lzdGVyKGNvbm5lY3Rvcik7Ci0JZHJtX2Nvbm5lY3Rvcl9j bGVhbnVwKGNvbm5lY3Rvcik7Ci19Ci0KLXN0YXRpYyBpbnQgdmM0X2RzaV9jb25uZWN0b3JfZ2V0 X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci0Jc3RydWN0IHZjNF9k c2lfY29ubmVjdG9yICp2YzRfY29ubmVjdG9yID0KLQkJdG9fdmM0X2RzaV9jb25uZWN0b3IoY29u bmVjdG9yKTsKLQlzdHJ1Y3QgdmM0X2RzaSAqZHNpID0gdmM0X2Nvbm5lY3Rvci0+ZHNpOwotCi0J aWYgKGRzaS0+cGFuZWwpCi0JCXJldHVybiBkcm1fcGFuZWxfZ2V0X21vZGVzKGRzaS0+cGFuZWwp OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9m dW5jcyB2YzRfZHNpX2Nvbm5lY3Rvcl9mdW5jcyA9IHsKLQkuZHBtcyA9IGRybV9hdG9taWNfaGVs cGVyX2Nvbm5lY3Rvcl9kcG1zLAotCS5kZXRlY3QgPSB2YzRfZHNpX2Nvbm5lY3Rvcl9kZXRlY3Qs Ci0JLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMs Ci0JLmRlc3Ryb3kgPSB2YzRfZHNpX2Nvbm5lY3Rvcl9kZXN0cm95LAotCS5yZXNldCA9IGRybV9h dG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9yZXNldCwKLQkuYXRvbWljX2R1cGxpY2F0ZV9zdGF0ZSA9 IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9kdXBsaWNhdGVfc3RhdGUsCi0JLmF0b21pY19k ZXN0cm95X3N0YXRlID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2Rlc3Ryb3lfc3RhdGUs Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIHZj NF9kc2lfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKLQkuZ2V0X21vZGVzID0gdmM0X2RzaV9j b25uZWN0b3JfZ2V0X21vZGVzLAotfTsKLQotc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yICp2 YzRfZHNpX2Nvbm5lY3Rvcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJCQkgICAg c3RydWN0IHZjNF9kc2kgKmRzaSkKLXsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9y OwotCXN0cnVjdCB2YzRfZHNpX2Nvbm5lY3RvciAqZHNpX2Nvbm5lY3RvcjsKLQotCWRzaV9jb25u ZWN0b3IgPSBkZXZtX2t6YWxsb2MoZGV2LT5kZXYsIHNpemVvZigqZHNpX2Nvbm5lY3RvciksCi0J CQkJICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWRzaV9jb25uZWN0b3IpCi0JCXJldHVybiBFUlJf UFRSKC1FTk9NRU0pOwotCi0JY29ubmVjdG9yID0gJmRzaV9jb25uZWN0b3ItPmJhc2U7Ci0KLQlk c2lfY29ubmVjdG9yLT5kc2kgPSBkc2k7Ci0KLQlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCBjb25u ZWN0b3IsICZ2YzRfZHNpX2Nvbm5lY3Rvcl9mdW5jcywKLQkJCSAgIERSTV9NT0RFX0NPTk5FQ1RP Ul9EU0kpOwotCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZChjb25uZWN0b3IsICZ2YzRfZHNpX2Nv bm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwotCi0JY29ubmVjdG9yLT5wb2xsZWQgPSAwOwotCWNvbm5l Y3Rvci0+aW50ZXJsYWNlX2FsbG93ZWQgPSAwOwotCWNvbm5lY3Rvci0+ZG91Ymxlc2Nhbl9hbGxv d2VkID0gMDsKLQotCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2Rlcihjb25uZWN0b3Is IGRzaS0+ZW5jb2Rlcik7Ci0KLQlyZXR1cm4gY29ubmVjdG9yOwotfQotCiBzdGF0aWMgdm9pZCB2 YzRfZHNpX2VuY29kZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJ ZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKQEAgLTg5MywxMiArODA4LDggQEAgc3RhdGlj IHZvaWQgdmM0X2RzaV9lbmNvZGVyX2Rpc2FibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVy KQogCXN0cnVjdCB2YzRfZHNpICpkc2kgPSB2YzRfZW5jb2Rlci0+ZHNpOwogCXN0cnVjdCBkZXZp Y2UgKmRldiA9ICZkc2ktPnBkZXYtPmRldjsKIAotCWRybV9wYW5lbF9kaXNhYmxlKGRzaS0+cGFu ZWwpOwotCiAJdmM0X2RzaV91bHBzKGRzaSwgdHJ1ZSk7CiAKLQlkcm1fcGFuZWxfdW5wcmVwYXJl KGRzaS0+cGFuZWwpOwotCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRzaS0+cGxsX3BoeV9jbG9j ayk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRzaS0+ZXNjYXBlX2Nsb2NrKTsKIAljbGtfZGlz YWJsZV91bnByZXBhcmUoZHNpLT5waXhlbF9jbG9jayk7CkBAIC05MjksMTIgKzg0MCw2IEBAIHN0 YXRpYyB2b2lkIHZjNF9kc2lfZW5jb2Rlcl9lbmFibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNv ZGVyKQogCQlyZXR1cm47CiAJfQogCi0JcmV0ID0gZHJtX3BhbmVsX3ByZXBhcmUoZHNpLT5wYW5l bCk7Ci0JaWYgKHJldCkgewotCQlEUk1fRVJST1IoIlBhbmVsIGZhaWxlZCB0byBwcmVwYXJlXG4i KTsKLQkJcmV0dXJuOwotCX0KLQogCWlmIChkZWJ1Z19kdW1wX3JlZ3MpIHsKIAkJRFJNX0lORk8o IkRTSSByZWdzIGJlZm9yZTpcbiIpOwogCQl2YzRfZHNpX2R1bXBfcmVncyhkc2kpOwpAQCAtMTE4 NCwxMyArMTA4OSw2IEBAIHN0YXRpYyB2b2lkIHZjNF9kc2lfZW5jb2Rlcl9lbmFibGUoc3RydWN0 IGRybV9lbmNvZGVyICplbmNvZGVyKQogCQlEUk1fSU5GTygiRFNJIHJlZ3MgYWZ0ZXI6XG4iKTsK IAkJdmM0X2RzaV9kdW1wX3JlZ3MoZHNpKTsKIAl9Ci0KLQlyZXQgPSBkcm1fcGFuZWxfZW5hYmxl KGRzaS0+cGFuZWwpOwotCWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJQYW5lbCBmYWlsZWQgdG8g ZW5hYmxlXG4iKTsKLQkJZHJtX3BhbmVsX3VucHJlcGFyZShkc2ktPnBhbmVsKTsKLQkJcmV0dXJu OwotCX0KIH0KIAogc3RhdGljIHNzaXplX3QgdmM0X2RzaV9ob3N0X3RyYW5zZmVyKHN0cnVjdCBt aXBpX2RzaV9ob3N0ICpob3N0LApAQCAtMTM2NiwxNSArMTI2NCwyOCBAQCBzdGF0aWMgaW50IHZj NF9kc2lfaG9zdF9hdHRhY2goc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCiAJCXJldHVybiAw OwogCX0KIAotCWRzaS0+cGFuZWwgPSBvZl9kcm1fZmluZF9wYW5lbChkZXZpY2UtPmRldi5vZl9u b2RlKTsKLQlpZiAoIWRzaS0+cGFuZWwpCi0JCXJldHVybiAwOworCWRzaS0+YnJpZGdlID0gb2Zf ZHJtX2ZpbmRfYnJpZGdlKGRldmljZS0+ZGV2Lm9mX25vZGUpOworCWlmICghZHNpLT5icmlkZ2Up IHsKKwkJc3RydWN0IGRybV9wYW5lbCAqcGFuZWwgPQorCQkJb2ZfZHJtX2ZpbmRfcGFuZWwoZGV2 aWNlLT5kZXYub2Zfbm9kZSk7CisKKwkJZHNpLT5icmlkZ2UgPSBkcm1fcGFuZWxfYnJpZGdlX2Fk ZCgmZGV2aWNlLT5kZXYsCisJCQkJCQkgICBwYW5lbCwKKwkJCQkJCSAgIERSTV9NT0RFX0NPTk5F Q1RPUl9EU0kpOworCQlpZiAoSVNfRVJSKGRzaS0+YnJpZGdlKSkgeworCQkJcmV0ID0gUFRSX0VS Uihkc2ktPmJyaWRnZSk7CisJCQlkc2ktPmJyaWRnZSA9IE5VTEw7CisJCQlyZXR1cm4gcmV0Owor CQl9CisJCWRzaS0+aXNfcGFuZWxfYnJpZGdlID0gdHJ1ZTsKKwl9CiAKLQlyZXQgPSBkcm1fcGFu ZWxfYXR0YWNoKGRzaS0+cGFuZWwsIGRzaS0+Y29ubmVjdG9yKTsKLQlpZiAocmV0ICE9IDApCisJ cmV0ID0gZHJtX2JyaWRnZV9hdHRhY2goZHNpLT5lbmNvZGVyLCBkc2ktPmJyaWRnZSwgTlVMTCk7 CisJaWYgKHJldCkgeworCQlpZiAoZHNpLT5pc19wYW5lbF9icmlkZ2UpCisJCQlkcm1fcGFuZWxf YnJpZGdlX3JlbW92ZSgmZGV2aWNlLT5kZXYsIGRzaS0+YnJpZGdlKTsKIAkJcmV0dXJuIHJldDsK LQotCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChkc2ktPmNvbm5lY3Rvci0+ZGV2KTsKKwl9CiAK IAlyZXR1cm4gMDsKIH0KQEAgLTEzODQsMTYgKzEyOTUsOCBAQCBzdGF0aWMgaW50IHZjNF9kc2lf aG9zdF9kZXRhY2goc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCiB7CiAJc3RydWN0IHZjNF9k c2kgKmRzaSA9IGhvc3RfdG9fZHNpKGhvc3QpOwogCi0JaWYgKGRzaS0+cGFuZWwpIHsKLQkJaW50 IHJldCA9IGRybV9wYW5lbF9kZXRhY2goZHNpLT5wYW5lbCk7Ci0KLQkJaWYgKHJldCkKLQkJCXJl dHVybiByZXQ7Ci0KLQkJZHNpLT5wYW5lbCA9IE5VTEw7Ci0KLQkJZHJtX2hlbHBlcl9ocGRfaXJx X2V2ZW50KGRzaS0+Y29ubmVjdG9yLT5kZXYpOwotCX0KKwlpZiAoZHNpLT5pc19wYW5lbF9icmlk Z2UpCisJCWRybV9wYW5lbF9icmlkZ2VfcmVtb3ZlKCZkZXZpY2UtPmRldiwgZHNpLT5icmlkZ2Up OwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNjU4LDEyICsxNTYxLDYgQEAgc3RhdGljIGludCB2YzRf ZHNpX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQg KmRhdGEpCiAJCQkgRFJNX01PREVfRU5DT0RFUl9EU0ksIE5VTEwpOwogCWRybV9lbmNvZGVyX2hl bHBlcl9hZGQoZHNpLT5lbmNvZGVyLCAmdmM0X2RzaV9lbmNvZGVyX2hlbHBlcl9mdW5jcyk7CiAK LQlkc2ktPmNvbm5lY3RvciA9IHZjNF9kc2lfY29ubmVjdG9yX2luaXQoZHJtLCBkc2kpOwotCWlm IChJU19FUlIoZHNpLT5jb25uZWN0b3IpKSB7Ci0JCXJldCA9IFBUUl9FUlIoZHNpLT5jb25uZWN0 b3IpOwotCQlnb3RvIGVycl9kZXN0cm95X2VuY29kZXI7Ci0JfQotCiAJZHNpLT5kc2lfaG9zdC5v cHMgPSAmdmM0X2RzaV9ob3N0X29wczsKIAlkc2ktPmRzaV9ob3N0LmRldiA9IGRldjsKIApAQCAt MTY3NCwxMSArMTU3MSw2IEBAIHN0YXRpYyBpbnQgdmM0X2RzaV9iaW5kKHN0cnVjdCBkZXZpY2Ug KmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLCB2b2lkICpkYXRhKQogCXBtX3J1bnRpbWVfZW5h YmxlKGRldik7CiAKIAlyZXR1cm4gMDsKLQotZXJyX2Rlc3Ryb3lfZW5jb2RlcjoKLQl2YzRfZHNp X2VuY29kZXJfZGVzdHJveShkc2ktPmVuY29kZXIpOwotCi0JcmV0dXJuIHJldDsKIH0KIAogc3Rh dGljIHZvaWQgdmM0X2RzaV91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNl ICptYXN0ZXIsCkBAIC0xNjkwLDcgKzE1ODIsNyBAQCBzdGF0aWMgdm9pZCB2YzRfZHNpX3VuYmlu ZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKIAogCXBtX3J1bnRp bWVfZGlzYWJsZShkZXYpOwogCi0JdmM0X2RzaV9jb25uZWN0b3JfZGVzdHJveShkc2ktPmNvbm5l Y3Rvcik7CisJZHJtX2JyaWRnZV9yZW1vdmUoZHNpLT5icmlkZ2UpOwogCXZjNF9kc2lfZW5jb2Rl cl9kZXN0cm95KGRzaS0+ZW5jb2Rlcik7CiAKIAltaXBpX2RzaV9ob3N0X3VucmVnaXN0ZXIoJmRz aS0+ZHNpX2hvc3QpOwotLSAKMi4xMS4wCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5m cmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0 aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754107AbdD0QgU (ORCPT ); Thu, 27 Apr 2017 12:36:20 -0400 Received: from anholt.net ([50.246.234.109]:34056 "EHLO anholt.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932777AbdD0QgH (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 2/2] drm/vc4: Switch to using the panel-bridge layer, and support bridges. Date: Thu, 27 Apr 2017 09:36:01 -0700 Message-Id: <20170427163601.7313-2-eric@anholt.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170427163601.7313-1-eric@anholt.net> References: <20170427163601.7313-1-eric@anholt.net> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The newer version of the RPi panel driver is going to be a combination of a bridge and a panel, but we should also support panels without a bridge, so the panel-bridge layer lets us do that cleanly. Signed-off-by: Eric Anholt --- drivers/gpu/drm/vc4/Kconfig | 2 +- drivers/gpu/drm/vc4/vc4_dsi.c | 158 +++++++----------------------------------- 2 files changed, 26 insertions(+), 134 deletions(-) diff --git a/drivers/gpu/drm/vc4/Kconfig b/drivers/gpu/drm/vc4/Kconfig index 973b4203c0b2..118def67c9a9 100644 --- a/drivers/gpu/drm/vc4/Kconfig +++ b/drivers/gpu/drm/vc4/Kconfig @@ -7,7 +7,7 @@ config DRM_VC4 select DRM_KMS_HELPER select DRM_KMS_CMA_HELPER select DRM_GEM_CMA_HELPER - select DRM_PANEL + select DRM_PANEL_BRIDGE select SND_PCM select SND_PCM_ELD select SND_SOC_GENERIC_DMAENGINE_PCM diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c index deba62008fd0..a279188e310c 100644 --- a/drivers/gpu/drm/vc4/vc4_dsi.c +++ b/drivers/gpu/drm/vc4/vc4_dsi.c @@ -503,8 +503,8 @@ struct vc4_dsi { struct mipi_dsi_host dsi_host; struct drm_encoder *encoder; - struct drm_connector *connector; - struct drm_panel *panel; + struct drm_bridge *bridge; + bool is_panel_bridge; void __iomem *regs; @@ -604,18 +604,6 @@ to_vc4_dsi_encoder(struct drm_encoder *encoder) return container_of(encoder, struct vc4_dsi_encoder, base.base); } -/* VC4 DSI connector KMS struct */ -struct vc4_dsi_connector { - struct drm_connector base; - struct vc4_dsi *dsi; -}; - -static inline struct vc4_dsi_connector * -to_vc4_dsi_connector(struct drm_connector *connector) -{ - return container_of(connector, struct vc4_dsi_connector, base); -} - #define DSI_REG(reg) { reg, #reg } static const struct { u32 reg; @@ -723,79 +711,6 @@ int vc4_dsi_debugfs_regs(struct seq_file *m, void *unused) } #endif -static enum drm_connector_status -vc4_dsi_connector_detect(struct drm_connector *connector, bool force) -{ - struct vc4_dsi_connector *vc4_connector = - to_vc4_dsi_connector(connector); - struct vc4_dsi *dsi = vc4_connector->dsi; - - if (dsi->panel) - return connector_status_connected; - else - return connector_status_disconnected; -} - -static void vc4_dsi_connector_destroy(struct drm_connector *connector) -{ - drm_connector_unregister(connector); - drm_connector_cleanup(connector); -} - -static int vc4_dsi_connector_get_modes(struct drm_connector *connector) -{ - struct vc4_dsi_connector *vc4_connector = - to_vc4_dsi_connector(connector); - struct vc4_dsi *dsi = vc4_connector->dsi; - - if (dsi->panel) - return drm_panel_get_modes(dsi->panel); - - return 0; -} - -static const struct drm_connector_funcs vc4_dsi_connector_funcs = { - .dpms = drm_atomic_helper_connector_dpms, - .detect = vc4_dsi_connector_detect, - .fill_modes = drm_helper_probe_single_connector_modes, - .destroy = vc4_dsi_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 const struct drm_connector_helper_funcs vc4_dsi_connector_helper_funcs = { - .get_modes = vc4_dsi_connector_get_modes, -}; - -static struct drm_connector *vc4_dsi_connector_init(struct drm_device *dev, - struct vc4_dsi *dsi) -{ - struct drm_connector *connector; - struct vc4_dsi_connector *dsi_connector; - - dsi_connector = devm_kzalloc(dev->dev, sizeof(*dsi_connector), - GFP_KERNEL); - if (!dsi_connector) - return ERR_PTR(-ENOMEM); - - connector = &dsi_connector->base; - - dsi_connector->dsi = dsi; - - drm_connector_init(dev, connector, &vc4_dsi_connector_funcs, - DRM_MODE_CONNECTOR_DSI); - drm_connector_helper_add(connector, &vc4_dsi_connector_helper_funcs); - - connector->polled = 0; - connector->interlace_allowed = 0; - connector->doublescan_allowed = 0; - - drm_mode_connector_attach_encoder(connector, dsi->encoder); - - return connector; -} - static void vc4_dsi_encoder_destroy(struct drm_encoder *encoder) { drm_encoder_cleanup(encoder); @@ -893,12 +808,8 @@ static void vc4_dsi_encoder_disable(struct drm_encoder *encoder) struct vc4_dsi *dsi = vc4_encoder->dsi; struct device *dev = &dsi->pdev->dev; - drm_panel_disable(dsi->panel); - vc4_dsi_ulps(dsi, true); - drm_panel_unprepare(dsi->panel); - clk_disable_unprepare(dsi->pll_phy_clock); clk_disable_unprepare(dsi->escape_clock); clk_disable_unprepare(dsi->pixel_clock); @@ -929,12 +840,6 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) return; } - ret = drm_panel_prepare(dsi->panel); - if (ret) { - DRM_ERROR("Panel failed to prepare\n"); - return; - } - if (debug_dump_regs) { DRM_INFO("DSI regs before:\n"); vc4_dsi_dump_regs(dsi); @@ -1184,13 +1089,6 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) DRM_INFO("DSI regs after:\n"); vc4_dsi_dump_regs(dsi); } - - ret = drm_panel_enable(dsi->panel); - if (ret) { - DRM_ERROR("Panel failed to enable\n"); - drm_panel_unprepare(dsi->panel); - return; - } } static ssize_t vc4_dsi_host_transfer(struct mipi_dsi_host *host, @@ -1366,15 +1264,28 @@ static int vc4_dsi_host_attach(struct mipi_dsi_host *host, return 0; } - dsi->panel = of_drm_find_panel(device->dev.of_node); - if (!dsi->panel) - return 0; + dsi->bridge = of_drm_find_bridge(device->dev.of_node); + if (!dsi->bridge) { + struct drm_panel *panel = + of_drm_find_panel(device->dev.of_node); + + dsi->bridge = drm_panel_bridge_add(&device->dev, + panel, + DRM_MODE_CONNECTOR_DSI); + if (IS_ERR(dsi->bridge)) { + ret = PTR_ERR(dsi->bridge); + dsi->bridge = NULL; + return ret; + } + dsi->is_panel_bridge = true; + } - ret = drm_panel_attach(dsi->panel, dsi->connector); - if (ret != 0) + ret = drm_bridge_attach(dsi->encoder, dsi->bridge, NULL); + if (ret) { + if (dsi->is_panel_bridge) + drm_panel_bridge_remove(&device->dev, dsi->bridge); return ret; - - drm_helper_hpd_irq_event(dsi->connector->dev); + } return 0; } @@ -1384,16 +1295,8 @@ static int vc4_dsi_host_detach(struct mipi_dsi_host *host, { struct vc4_dsi *dsi = host_to_dsi(host); - if (dsi->panel) { - int ret = drm_panel_detach(dsi->panel); - - if (ret) - return ret; - - dsi->panel = NULL; - - drm_helper_hpd_irq_event(dsi->connector->dev); - } + if (dsi->is_panel_bridge) + drm_panel_bridge_remove(&device->dev, dsi->bridge); return 0; } @@ -1658,12 +1561,6 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) DRM_MODE_ENCODER_DSI, NULL); drm_encoder_helper_add(dsi->encoder, &vc4_dsi_encoder_helper_funcs); - dsi->connector = vc4_dsi_connector_init(drm, dsi); - if (IS_ERR(dsi->connector)) { - ret = PTR_ERR(dsi->connector); - goto err_destroy_encoder; - } - dsi->dsi_host.ops = &vc4_dsi_host_ops; dsi->dsi_host.dev = dev; @@ -1674,11 +1571,6 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) pm_runtime_enable(dev); return 0; - -err_destroy_encoder: - vc4_dsi_encoder_destroy(dsi->encoder); - - return ret; } static void vc4_dsi_unbind(struct device *dev, struct device *master, @@ -1690,7 +1582,7 @@ static void vc4_dsi_unbind(struct device *dev, struct device *master, pm_runtime_disable(dev); - vc4_dsi_connector_destroy(dsi->connector); + drm_bridge_remove(dsi->bridge); vc4_dsi_encoder_destroy(dsi->encoder); mipi_dsi_host_unregister(&dsi->dsi_host); -- 2.11.0