From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rob Clark Subject: [RFC 3/3] drm/bridge: adv7511: deal with bootloader lighting up display Date: Tue, 11 Jul 2017 14:20:08 -0400 Message-ID: <20170711182008.28298-4-robdclark@gmail.com> References: <20170711182008.28298-1-robdclark@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20170711182008.28298-1-robdclark@gmail.com> 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, linux-clk@vger.kernel.org Cc: linux-arm-msm@vger.kernel.org, Michael Turquette , Stephen Boyd , viresh.kumar@linaro.org List-Id: linux-arm-msm@vger.kernel.org V2UgbmVlZCB0byBkbyBzb21lIHRoaW5ncyBhIGJpdCBkaWZmZXJlbnRseSBpZiB0aGUgYnJpZGdl IGNoaXAgaXMKYWxyZWFkeSBwb3dlcmVkIHVwIHdoZW4gdGhlIGRyaXZlciBsb2FkcyAoaWUuIGJv b3Rsb2FkZXIgaGFzIGFscmVhZHkKZW5hYmxlZCBkaXNwbGF5KS4gIEluIHBhcnRpY3VsYXIgd2Ug ZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyB0aGF0CndvdWxkIGtpbGwgdGhlIGRpc3BsYXkuCi0t LQogZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hZHY3NTExL2Fkdjc1MTFfZHJ2LmMgfCA1NyArKysr KysrKysrKysrKysrKysrLS0tLS0tLS0tCiBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2Fkdjc1MTEv YWR2NzUzMy5jICAgICB8ICAzICsrCiAyIGZpbGVzIGNoYW5nZWQsIDQyIGluc2VydGlvbnMoKyks IDE4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvYWR2 NzUxMS9hZHY3NTExX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hZHY3NTExL2Fkdjc1 MTFfZHJ2LmMKaW5kZXggZjc1YWI2Mjc4MTEzLi4xNWU3MjVmYTg2MTYgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9icmlkZ2UvYWR2NzUxMS9hZHY3NTExX2Rydi5jCisrKyBiL2RyaXZlcnMv Z3B1L2RybS9icmlkZ2UvYWR2NzUxMS9hZHY3NTExX2Rydi5jCkBAIC0xMDcsNiArMTA3LDcgQEAg c3RhdGljIGJvb2wgYWR2NzUxMV9yZWdpc3Rlcl92b2xhdGlsZShzdHJ1Y3QgZGV2aWNlICpkZXYs IHVuc2lnbmVkIGludCByZWcpCiAJY2FzZSBBRFY3NTExX1JFR19CU1RBVFVTKDEpOgogCWNhc2Ug QURWNzUxMV9SRUdfQ0hJUF9JRF9ISUdIOgogCWNhc2UgQURWNzUxMV9SRUdfQ0hJUF9JRF9MT1c6 CisJY2FzZSBBRFY3NTExX1JFR19QT1dFUjoKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC01ODQs NiArNTg1LDggQEAgc3RhdGljIGludCBhZHY3NTExX2dldF9tb2RlcyhzdHJ1Y3QgYWR2NzUxMSAq YWR2NzUxMSwKIAkJCSAgICAgZWRpZF9pMmNfYWRkcik7CiAJfQogCisJYWR2NzUxMS0+Y3VycmVu dF9lZGlkX3NlZ21lbnQgPSAtMTsKKwogCWVkaWQgPSBkcm1fZG9fZ2V0X2VkaWQoY29ubmVjdG9y LCBhZHY3NTExX2dldF9lZGlkX2Jsb2NrLCBhZHY3NTExKTsKIAogCWlmICghYWR2NzUxMS0+cG93 ZXJlZCkKQEAgLTYyNyw3ICs2MzAsOCBAQCBhZHY3NTExX2RldGVjdChzdHJ1Y3QgYWR2NzUxMSAq YWR2NzUxMSwgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIAkgKiBoYXMgdG8gYmUg cmVpbml0aWFsaXplZC4gKi8KIAlpZiAoc3RhdHVzID09IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVj dGVkICYmIGhwZCAmJiBhZHY3NTExLT5wb3dlcmVkKSB7CiAJCXJlZ2NhY2hlX21hcmtfZGlydHko YWR2NzUxMS0+cmVnbWFwKTsKLQkJYWR2NzUxMV9wb3dlcl9vbihhZHY3NTExKTsKKwkJaWYgKCFh ZHY3NTExLT5wb3dlcmVkKQorCQkJYWR2NzUxMV9wb3dlcl9vbihhZHY3NTExKTsKIAkJYWR2NzUx MV9nZXRfbW9kZXMoYWR2NzUxMSwgY29ubmVjdG9yKTsKIAkJaWYgKGFkdjc1MTEtPnN0YXR1cyA9 PSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCkKIAkJCXN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0 dXNfZGlzY29ubmVjdGVkOwpAQCAtMTA0NCwzMyArMTA0OCw0NyBAQCBzdGF0aWMgaW50IGFkdjc1 MTFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywgY29uc3Qgc3RydWN0IGkyY19kZXZpY2Vf aWQgKmlkKQogCQlyZXR1cm4gcmV0OwogCX0KIAorCWFkdjc1MTEtPnJlZ21hcCA9IGRldm1fcmVn bWFwX2luaXRfaTJjKGkyYywgJmFkdjc1MTFfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihh ZHY3NTExLT5yZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIoYWR2NzUxMS0+cmVnbWFwKTsKKwkJ Z290byB1bmluaXRfcmVndWxhdG9yczsKKwl9CisKKwlyZXQgPSByZWdtYXBfcmVhZChhZHY3NTEx LT5yZWdtYXAsIEFEVjc1MTFfUkVHX0NISVBfUkVWSVNJT04sICZ2YWwpOworCWlmIChyZXQpCisJ CWdvdG8gdW5pbml0X3JlZ3VsYXRvcnM7CisJZGV2X2RiZyhkZXYsICJSZXYuICVkXG4iLCB2YWwp OworCisJcmV0ID0gcmVnbWFwX3JlYWQoYWR2NzUxMS0+cmVnbWFwLCBBRFY3NTExX1JFR19QT1dF UiwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byB1bmluaXRfcmVndWxhdG9yczsKKwlkZXZfZGJn KGRldiwgIlBvd2VyOiAleFxuIiwgdmFsKTsKKworCWlmICgodmFsICYgQURWNzUxMV9QT1dFUl9Q T1dFUl9ET1dOKSA9PSAwKSB7CisJCWRldl9kYmcoZGV2LCAicG93ZXJlZCBvbiBhdCBwcm9iZSFc biIpOworCQlyZWdjYWNoZV9zeW5jKGFkdjc1MTEtPnJlZ21hcCk7CisJCWFkdjc1MTEtPnBvd2Vy ZWQgPSB0cnVlOworCX0KKwogCS8qCiAJICogVGhlIHBvd2VyIGRvd24gR1BJTyBpcyBvcHRpb25h bC4gSWYgcHJlc2VudCwgdG9nZ2xlIGl0IGZyb20gYWN0aXZlIHRvCiAJICogaW5hY3RpdmUgdG8g d2FrZSB1cCB0aGUgZW5jb2Rlci4KIAkgKi8KLQlhZHY3NTExLT5ncGlvX3BkID0gZGV2bV9ncGlv ZF9nZXRfb3B0aW9uYWwoZGV2LCAicGQiLCBHUElPRF9PVVRfSElHSCk7CisJYWR2NzUxMS0+Z3Bp b19wZCA9IGRldm1fZ3Bpb2RfZ2V0X29wdGlvbmFsKGRldiwgInBkIiwKKwkJCWFkdjc1MTEtPnBv d2VyZWQgPyBHUElPRF9BU0lTIDogR1BJT0RfT1VUX0hJR0gpOwogCWlmIChJU19FUlIoYWR2NzUx MS0+Z3Bpb19wZCkpIHsKIAkJcmV0ID0gUFRSX0VSUihhZHY3NTExLT5ncGlvX3BkKTsKIAkJZ290 byB1bmluaXRfcmVndWxhdG9yczsKIAl9CiAKLQlpZiAoYWR2NzUxMS0+Z3Bpb19wZCkgeworCWlm IChhZHY3NTExLT5ncGlvX3BkICYmICFhZHY3NTExLT5wb3dlcmVkKSB7CiAJCW1kZWxheSg1KTsK IAkJZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKGFkdjc1MTEtPmdwaW9fcGQsIDApOwogCX0KIAot CWFkdjc1MTEtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJmFkdjc1MTFfcmVn bWFwX2NvbmZpZyk7Ci0JaWYgKElTX0VSUihhZHY3NTExLT5yZWdtYXApKSB7Ci0JCXJldCA9IFBU Ul9FUlIoYWR2NzUxMS0+cmVnbWFwKTsKLQkJZ290byB1bmluaXRfcmVndWxhdG9yczsKLQl9Ci0K LQlyZXQgPSByZWdtYXBfcmVhZChhZHY3NTExLT5yZWdtYXAsIEFEVjc1MTFfUkVHX0NISVBfUkVW SVNJT04sICZ2YWwpOwotCWlmIChyZXQpCi0JCWdvdG8gdW5pbml0X3JlZ3VsYXRvcnM7Ci0JZGV2 X2RiZyhkZXYsICJSZXYuICVkXG4iLCB2YWwpOwotCi0JaWYgKGFkdjc1MTEtPnR5cGUgPT0gQURW NzUxMSkKKwlpZiAoYWR2NzUxMS0+cG93ZXJlZCkKKwkJYWR2NzUxMV9ocGQoYWR2NzUxMSk7ICAv KiBjbGVhciBwZW5kaW5nIGlycSdzICovCisJZWxzZSBpZiAoYWR2NzUxMS0+dHlwZSA9PSBBRFY3 NTExKQogCQlyZXQgPSByZWdtYXBfcmVnaXN0ZXJfcGF0Y2goYWR2NzUxMS0+cmVnbWFwLAogCQkJ CQkgICAgYWR2NzUxMV9maXhlZF9yZWdpc3RlcnMsCiAJCQkJCSAgICBBUlJBWV9TSVpFKGFkdjc1 MTFfZml4ZWRfcmVnaXN0ZXJzKSk7CkBAIC0xMDg1LDcgKzExMDMsOCBAQCBzdGF0aWMgaW50IGFk djc1MTFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywgY29uc3Qgc3RydWN0IGkyY19kZXZp Y2VfaWQgKmlkKQogCXJlZ21hcF93cml0ZShhZHY3NTExLT5yZWdtYXAsIEFEVjc1MTFfUkVHX0NF Q19JMkNfQUREUiwKIAkJICAgICBtYWluX2kyY19hZGRyIC0gMik7CiAKLQlhZHY3NTExX3BhY2tl dF9kaXNhYmxlKGFkdjc1MTEsIDB4ZmZmZik7CisJaWYgKCFhZHY3NTExLT5wb3dlcmVkKQorCQlh ZHY3NTExX3BhY2tldF9kaXNhYmxlKGFkdjc1MTEsIDB4ZmZmZik7CiAKIAlhZHY3NTExLT5pMmNf ZWRpZCA9IGkyY19uZXdfZHVtbXkoaTJjLT5hZGFwdGVyLCBlZGlkX2kyY19hZGRyID4+IDEpOwog CWlmICghYWR2NzUxMS0+aTJjX2VkaWQpIHsKQEAgLTExMTYsNyArMTEzNSw4IEBAIHN0YXRpYyBp bnQgYWR2NzUxMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLCBjb25zdCBzdHJ1Y3QgaTJj X2RldmljZV9pZCAqaWQpCiAJcmVnbWFwX3dyaXRlKGFkdjc1MTEtPnJlZ21hcCwgQURWNzUxMV9S RUdfQ0VDX0NUUkwsCiAJCSAgICAgQURWNzUxMV9DRUNfQ1RSTF9QT1dFUl9ET1dOKTsKIAotCWFk djc1MTFfcG93ZXJfb2ZmKGFkdjc1MTEpOworCWlmICghYWR2NzUxMS0+cG93ZXJlZCkKKwkJYWR2 NzUxMV9wb3dlcl9vZmYoYWR2NzUxMSk7CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBhZHY3 NTExKTsKIApAQCAtMTEzMiw3ICsxMTUyLDggQEAgc3RhdGljIGludCBhZHY3NTExX3Byb2JlKHN0 cnVjdCBpMmNfY2xpZW50ICppMmMsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIAkJ Z290byBlcnJfdW5yZWdpc3Rlcl9jZWM7CiAJfQogCi0JYWR2NzUxMV9hdWRpb19pbml0KGRldiwg YWR2NzUxMSk7CisJaWYgKCFhZHY3NTExLT5wb3dlcmVkKQorCQlhZHY3NTExX2F1ZGlvX2luaXQo ZGV2LCBhZHY3NTExKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vYnJpZGdlL2Fkdjc1MTEvYWR2NzUzMy5jIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hZHY3 NTExL2Fkdjc1MzMuYwppbmRleCBhYzgwNGY4MWUyZjYuLjQzZGM1MzgyMWFjYiAxMDA2NDQKLS0t IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hZHY3NTExL2Fkdjc1MzMuYworKysgYi9kcml2ZXJz L2dwdS9kcm0vYnJpZGdlL2Fkdjc1MTEvYWR2NzUzMy5jCkBAIC0xNjYsNiArMTY2LDkgQEAgaW50 IGFkdjc1MzNfaW5pdF9jZWMoc3RydWN0IGFkdjc1MTEgKmFkdikKIAkJZ290byBlcnI7CiAJfQog CisJaWYgKGFkdi0+cG93ZXJlZCkKKwkJcmV0dXJuIDA7CisKIAlyZXQgPSByZWdtYXBfcmVnaXN0 ZXJfcGF0Y2goYWR2LT5yZWdtYXBfY2VjLAogCQkJCSAgICBhZHY3NTMzX2NlY19maXhlZF9yZWdp c3RlcnMsCiAJCQkJICAgIEFSUkFZX1NJWkUoYWR2NzUzM19jZWNfZml4ZWRfcmVnaXN0ZXJzKSk7 Ci0tIAoyLjEzLjAKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9y ZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZl bAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Return-Path: From: Rob Clark To: dri-devel@lists.freedesktop.org, linux-clk@vger.kernel.org Cc: Stephen Boyd , Michael Turquette , Archit Taneja , linux-arm-msm@vger.kernel.org, viresh.kumar@linaro.org, Rob Clark Subject: [RFC 3/3] drm/bridge: adv7511: deal with bootloader lighting up display Date: Tue, 11 Jul 2017 14:20:08 -0400 Message-Id: <20170711182008.28298-4-robdclark@gmail.com> In-Reply-To: <20170711182008.28298-1-robdclark@gmail.com> References: <20170711182008.28298-1-robdclark@gmail.com> List-ID: We need to do some things a bit differently if the bridge chip is already powered up when the driver loads (ie. bootloader has already enabled display). In particular we don't want to do anything that would kill the display. --- drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 57 +++++++++++++++++++--------- drivers/gpu/drm/bridge/adv7511/adv7533.c | 3 ++ 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c index f75ab6278113..15e725fa8616 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c @@ -107,6 +107,7 @@ static bool adv7511_register_volatile(struct device *dev, unsigned int reg) case ADV7511_REG_BSTATUS(1): case ADV7511_REG_CHIP_ID_HIGH: case ADV7511_REG_CHIP_ID_LOW: + case ADV7511_REG_POWER: return true; } @@ -584,6 +585,8 @@ static int adv7511_get_modes(struct adv7511 *adv7511, edid_i2c_addr); } + adv7511->current_edid_segment = -1; + edid = drm_do_get_edid(connector, adv7511_get_edid_block, adv7511); if (!adv7511->powered) @@ -627,7 +630,8 @@ adv7511_detect(struct adv7511 *adv7511, struct drm_connector *connector) * has to be reinitialized. */ if (status == connector_status_connected && hpd && adv7511->powered) { regcache_mark_dirty(adv7511->regmap); - adv7511_power_on(adv7511); + if (!adv7511->powered) + adv7511_power_on(adv7511); adv7511_get_modes(adv7511, connector); if (adv7511->status == connector_status_connected) status = connector_status_disconnected; @@ -1044,33 +1048,47 @@ static int adv7511_probe(struct i2c_client *i2c, const struct i2c_device_id *id) return ret; } + adv7511->regmap = devm_regmap_init_i2c(i2c, &adv7511_regmap_config); + if (IS_ERR(adv7511->regmap)) { + ret = PTR_ERR(adv7511->regmap); + goto uninit_regulators; + } + + ret = regmap_read(adv7511->regmap, ADV7511_REG_CHIP_REVISION, &val); + if (ret) + goto uninit_regulators; + dev_dbg(dev, "Rev. %d\n", val); + + ret = regmap_read(adv7511->regmap, ADV7511_REG_POWER, &val); + if (ret) + goto uninit_regulators; + dev_dbg(dev, "Power: %x\n", val); + + if ((val & ADV7511_POWER_POWER_DOWN) == 0) { + dev_dbg(dev, "powered on at probe!\n"); + regcache_sync(adv7511->regmap); + adv7511->powered = true; + } + /* * The power down GPIO is optional. If present, toggle it from active to * inactive to wake up the encoder. */ - adv7511->gpio_pd = devm_gpiod_get_optional(dev, "pd", GPIOD_OUT_HIGH); + adv7511->gpio_pd = devm_gpiod_get_optional(dev, "pd", + adv7511->powered ? GPIOD_ASIS : GPIOD_OUT_HIGH); if (IS_ERR(adv7511->gpio_pd)) { ret = PTR_ERR(adv7511->gpio_pd); goto uninit_regulators; } - if (adv7511->gpio_pd) { + if (adv7511->gpio_pd && !adv7511->powered) { mdelay(5); gpiod_set_value_cansleep(adv7511->gpio_pd, 0); } - adv7511->regmap = devm_regmap_init_i2c(i2c, &adv7511_regmap_config); - if (IS_ERR(adv7511->regmap)) { - ret = PTR_ERR(adv7511->regmap); - goto uninit_regulators; - } - - ret = regmap_read(adv7511->regmap, ADV7511_REG_CHIP_REVISION, &val); - if (ret) - goto uninit_regulators; - dev_dbg(dev, "Rev. %d\n", val); - - if (adv7511->type == ADV7511) + if (adv7511->powered) + adv7511_hpd(adv7511); /* clear pending irq's */ + else if (adv7511->type == ADV7511) ret = regmap_register_patch(adv7511->regmap, adv7511_fixed_registers, ARRAY_SIZE(adv7511_fixed_registers)); @@ -1085,7 +1103,8 @@ static int adv7511_probe(struct i2c_client *i2c, const struct i2c_device_id *id) regmap_write(adv7511->regmap, ADV7511_REG_CEC_I2C_ADDR, main_i2c_addr - 2); - adv7511_packet_disable(adv7511, 0xffff); + if (!adv7511->powered) + adv7511_packet_disable(adv7511, 0xffff); adv7511->i2c_edid = i2c_new_dummy(i2c->adapter, edid_i2c_addr >> 1); if (!adv7511->i2c_edid) { @@ -1116,7 +1135,8 @@ static int adv7511_probe(struct i2c_client *i2c, const struct i2c_device_id *id) regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL, ADV7511_CEC_CTRL_POWER_DOWN); - adv7511_power_off(adv7511); + if (!adv7511->powered) + adv7511_power_off(adv7511); i2c_set_clientdata(i2c, adv7511); @@ -1132,7 +1152,8 @@ static int adv7511_probe(struct i2c_client *i2c, const struct i2c_device_id *id) goto err_unregister_cec; } - adv7511_audio_init(dev, adv7511); + if (!adv7511->powered) + adv7511_audio_init(dev, adv7511); return 0; diff --git a/drivers/gpu/drm/bridge/adv7511/adv7533.c b/drivers/gpu/drm/bridge/adv7511/adv7533.c index ac804f81e2f6..43dc53821acb 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7533.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7533.c @@ -166,6 +166,9 @@ int adv7533_init_cec(struct adv7511 *adv) goto err; } + if (adv->powered) + return 0; + ret = regmap_register_patch(adv->regmap_cec, adv7533_cec_fixed_registers, ARRAY_SIZE(adv7533_cec_fixed_registers)); -- 2.13.0