From mboxrd@z Thu Jan 1 00:00:00 1970 From: laurent.pinchart@ideasonboard.com (Laurent Pinchart) Date: Mon, 18 Dec 2017 12:53:17 +0200 Subject: [PATCH 4/4 v5] drm/pl111: Support handling bridge timings In-Reply-To: <20171215121047.3650-5-linus.walleij@linaro.org> References: <20171215121047.3650-1-linus.walleij@linaro.org> <20171215121047.3650-5-linus.walleij@linaro.org> Message-ID: <3137231.G6WLouAvdk@avalon> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Linus, Thank you for the patch. On Friday, 15 December 2017 14:10:47 EET Linus Walleij wrote: > If the bridge has a too strict setup time for the incoming > signals, we may not be fast enough and then we need to > compensate by outputting the signal on the inverse clock > edge so it is for sure stable when the bridge samples it. > > Since bridges in difference to panels does not expose their > connectors, make the connector optional in the display > setup code. > > Signed-off-by: Linus Walleij > --- > ChangeLog v4->v5: > - Use the new bridge timings setup method. > --- > drivers/gpu/drm/pl111/Kconfig | 1 + > drivers/gpu/drm/pl111/pl111_display.c | 35 ++++++++++++++++++++++++++++---- > drivers/gpu/drm/pl111/pl111_drv.c | 20 +++++++++++--------- > 3 files changed, 43 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/pl111/Kconfig b/drivers/gpu/drm/pl111/Kconfig > index e5e2abd66491..82cb3e60ddc8 100644 > --- a/drivers/gpu/drm/pl111/Kconfig > +++ b/drivers/gpu/drm/pl111/Kconfig > @@ -8,6 +8,7 @@ config DRM_PL111 > select DRM_GEM_CMA_HELPER > select DRM_BRIDGE > select DRM_PANEL_BRIDGE > + select DRM_DUMB_VGA_DAC > select VT_HW_CONSOLE_BINDING if FRAMEBUFFER_CONSOLE > help > Choose this option for DRM support for the PL111 CLCD controller. > diff --git a/drivers/gpu/drm/pl111/pl111_display.c > b/drivers/gpu/drm/pl111/pl111_display.c index 06c4bf756b69..7fe4040aea46 > 100644 > --- a/drivers/gpu/drm/pl111/pl111_display.c > +++ b/drivers/gpu/drm/pl111/pl111_display.c > @@ -94,6 +94,7 @@ static void pl111_display_enable(struct > drm_simple_display_pipe *pipe, const struct drm_display_mode *mode = > &cstate->mode; > struct drm_framebuffer *fb = plane->state->fb; > struct drm_connector *connector = priv->connector; > + struct drm_bridge *bridge = priv->bridge; > u32 cntl; > u32 ppl, hsw, hfp, hbp; > u32 lpp, vsw, vfp, vbp; > @@ -143,11 +144,37 @@ static void pl111_display_enable(struct > drm_simple_display_pipe *pipe, if (mode->flags & DRM_MODE_FLAG_NVSYNC) > tim2 |= TIM2_IVS; > > - if (connector->display_info.bus_flags & DRM_BUS_FLAG_DE_LOW) > - tim2 |= TIM2_IOE; > + if (connector) { > + if (connector->display_info.bus_flags & DRM_BUS_FLAG_DE_LOW) > + tim2 |= TIM2_IOE; > > - if (connector->display_info.bus_flags & DRM_BUS_FLAG_PIXDATA_NEGEDGE) > - tim2 |= TIM2_IPC; > + if (connector->display_info.bus_flags & > + DRM_BUS_FLAG_PIXDATA_NEGEDGE) > + tim2 |= TIM2_IPC; > + } > + > + if (bridge) { > + const struct drm_bridge_timings *btimings = bridge->timings; > + > + /* > + * Here is when things get really fun. Sometimes the bridge > + * timings are such that the signal out from PL11x is not > + * stable before the receiving bridge (such as a dumb VGA DAC > + * or similar) samples it. If that happens, we compensate by > + * the only method we have: output the data on the opposite > + * edge of the clock so it is for sure stable when it gets > + * sampled. > + * > + * The PL111 manual does not contain proper timining diagrams > + * or data for these details, but we know from experiments > + * that the setup time is more than 3000 picoseconds (3 ns). > + * If we have a bridge that requires the signal to be stable > + * earlier than 3000 ps before the clock pulse, we have to > + * output the data on the opposite edge to avoid flicker. This should probably depend on the pixel clock frequency, but if it works for you for now, I have no objection. Acked-by: Laurent Pinchart > + */ > + if (btimings && btimings->setup_time_ps >= 3000) > + tim2 ^= TIM2_IPC; > + } > > tim2 |= cpl << 16; > writel(tim2, priv->regs + CLCD_TIM2); > diff --git a/drivers/gpu/drm/pl111/pl111_drv.c > b/drivers/gpu/drm/pl111/pl111_drv.c index 201d57d5cb54..101a9c7db6ff 100644 > --- a/drivers/gpu/drm/pl111/pl111_drv.c > +++ b/drivers/gpu/drm/pl111/pl111_drv.c > @@ -107,11 +107,17 @@ static int pl111_modeset_init(struct drm_device *dev) > ret = PTR_ERR(bridge); > goto out_config; > } > - /* > - * TODO: when we are using a different bridge than a panel > - * (such as a dumb VGA connector) we need to devise a different > - * method to get the connector out of the bridge. > - */ > + } else if (bridge) { > + dev_info(dev->dev, "Using non-panel bridge\n"); > + } else { > + dev_err(dev->dev, "No bridge, exiting\n"); > + return -ENODEV; > + } > + > + priv->bridge = bridge; > + if (panel) { > + priv->panel = panel; > + priv->connector = panel->connector; > } > > ret = pl111_display_init(dev); > @@ -125,10 +131,6 @@ static int pl111_modeset_init(struct drm_device *dev) > if (ret) > return ret; > > - priv->bridge = bridge; > - priv->panel = panel; > - priv->connector = panel->connector; > - > ret = drm_vblank_init(dev, 1); > if (ret != 0) { > dev_err(dev->dev, "Failed to init vblank\n"); -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH 4/4 v5] drm/pl111: Support handling bridge timings Date: Mon, 18 Dec 2017 12:53:17 +0200 Message-ID: <3137231.G6WLouAvdk@avalon> References: <20171215121047.3650-1-linus.walleij@linaro.org> <20171215121047.3650-5-linus.walleij@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from galahad.ideasonboard.com (galahad.ideasonboard.com [IPv6:2001:4b98:dc2:45:216:3eff:febb:480d]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9B53B6E18F for ; Mon, 18 Dec 2017 10:53:08 +0000 (UTC) In-Reply-To: <20171215121047.3650-5-linus.walleij@linaro.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Linus Walleij Cc: linux-arm-kernel@lists.infradead.org, dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org SGkgTGludXMsCgpUaGFuayB5b3UgZm9yIHRoZSBwYXRjaC4KCk9uIEZyaWRheSwgMTUgRGVjZW1i ZXIgMjAxNyAxNDoxMDo0NyBFRVQgTGludXMgV2FsbGVpaiB3cm90ZToKPiBJZiB0aGUgYnJpZGdl IGhhcyBhIHRvbyBzdHJpY3Qgc2V0dXAgdGltZSBmb3IgdGhlIGluY29taW5nCj4gc2lnbmFscywg d2UgbWF5IG5vdCBiZSBmYXN0IGVub3VnaCBhbmQgdGhlbiB3ZSBuZWVkIHRvCj4gY29tcGVuc2F0 ZSBieSBvdXRwdXR0aW5nIHRoZSBzaWduYWwgb24gdGhlIGludmVyc2UgY2xvY2sKPiBlZGdlIHNv IGl0IGlzIGZvciBzdXJlIHN0YWJsZSB3aGVuIHRoZSBicmlkZ2Ugc2FtcGxlcyBpdC4KPiAKPiBT aW5jZSBicmlkZ2VzIGluIGRpZmZlcmVuY2UgdG8gcGFuZWxzIGRvZXMgbm90IGV4cG9zZSB0aGVp cgo+IGNvbm5lY3RvcnMsIG1ha2UgdGhlIGNvbm5lY3RvciBvcHRpb25hbCBpbiB0aGUgZGlzcGxh eQo+IHNldHVwIGNvZGUuCj4gCj4gU2lnbmVkLW9mZi1ieTogTGludXMgV2FsbGVpaiA8bGludXMu d2FsbGVpakBsaW5hcm8ub3JnPgo+IC0tLQo+IENoYW5nZUxvZyB2NC0+djU6Cj4gLSBVc2UgdGhl IG5ldyBicmlkZ2UgdGltaW5ncyBzZXR1cCBtZXRob2QuCj4gLS0tCj4gIGRyaXZlcnMvZ3B1L2Ry bS9wbDExMS9LY29uZmlnICAgICAgICAgfCAgMSArCj4gIGRyaXZlcnMvZ3B1L2RybS9wbDExMS9w bDExMV9kaXNwbGF5LmMgfCAzNSArKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLQo+ICBk cml2ZXJzL2dwdS9kcm0vcGwxMTEvcGwxMTFfZHJ2LmMgICAgIHwgMjAgKysrKysrKysrKystLS0t LS0tLS0KPiAgMyBmaWxlcyBjaGFuZ2VkLCA0MyBpbnNlcnRpb25zKCspLCAxMyBkZWxldGlvbnMo LSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3BsMTExL0tjb25maWcgYi9kcml2 ZXJzL2dwdS9kcm0vcGwxMTEvS2NvbmZpZwo+IGluZGV4IGU1ZTJhYmQ2NjQ5MS4uODJjYjNlNjBk ZGM4IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9wbDExMS9LY29uZmlnCj4gKysrIGIv ZHJpdmVycy9ncHUvZHJtL3BsMTExL0tjb25maWcKPiBAQCAtOCw2ICs4LDcgQEAgY29uZmlnIERS TV9QTDExMQo+ICAJc2VsZWN0IERSTV9HRU1fQ01BX0hFTFBFUgo+ICAJc2VsZWN0IERSTV9CUklE R0UKPiAgCXNlbGVjdCBEUk1fUEFORUxfQlJJREdFCj4gKwlzZWxlY3QgRFJNX0RVTUJfVkdBX0RB Qwo+ICAJc2VsZWN0IFZUX0hXX0NPTlNPTEVfQklORElORyBpZiBGUkFNRUJVRkZFUl9DT05TT0xF Cj4gIAloZWxwCj4gIAkgIENob29zZSB0aGlzIG9wdGlvbiBmb3IgRFJNIHN1cHBvcnQgZm9yIHRo ZSBQTDExMSBDTENEIGNvbnRyb2xsZXIuCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9w bDExMS9wbDExMV9kaXNwbGF5LmMKPiBiL2RyaXZlcnMvZ3B1L2RybS9wbDExMS9wbDExMV9kaXNw bGF5LmMgaW5kZXggMDZjNGJmNzU2YjY5Li43ZmU0MDQwYWVhNDYKPiAxMDA2NDQKPiAtLS0gYS9k cml2ZXJzL2dwdS9kcm0vcGwxMTEvcGwxMTFfZGlzcGxheS5jCj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL3BsMTExL3BsMTExX2Rpc3BsYXkuYwo+IEBAIC05NCw2ICs5NCw3IEBAIHN0YXRpYyB2b2lk IHBsMTExX2Rpc3BsYXlfZW5hYmxlKHN0cnVjdAo+IGRybV9zaW1wbGVfZGlzcGxheV9waXBlICpw aXBlLCBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9Cj4gJmNzdGF0ZS0+bW9k ZTsKPiAgCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiID0gcGxhbmUtPnN0YXRlLT5mYjsKPiAg CXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSBwcml2LT5jb25uZWN0b3I7Cj4gKwlz dHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlID0gcHJpdi0+YnJpZGdlOwo+ICAJdTMyIGNudGw7Cj4g IAl1MzIgcHBsLCBoc3csIGhmcCwgaGJwOwo+ICAJdTMyIGxwcCwgdnN3LCB2ZnAsIHZicDsKPiBA QCAtMTQzLDExICsxNDQsMzcgQEAgc3RhdGljIHZvaWQgcGwxMTFfZGlzcGxheV9lbmFibGUoc3Ry dWN0Cj4gZHJtX3NpbXBsZV9kaXNwbGF5X3BpcGUgKnBpcGUsIGlmIChtb2RlLT5mbGFncyAmIERS TV9NT0RFX0ZMQUdfTlZTWU5DKQo+ICAJCXRpbTIgfD0gVElNMl9JVlM7Cj4gCj4gLQlpZiAoY29u bmVjdG9yLT5kaXNwbGF5X2luZm8uYnVzX2ZsYWdzICYgRFJNX0JVU19GTEFHX0RFX0xPVykKPiAt CQl0aW0yIHw9IFRJTTJfSU9FOwo+ICsJaWYgKGNvbm5lY3Rvcikgewo+ICsJCWlmIChjb25uZWN0 b3ItPmRpc3BsYXlfaW5mby5idXNfZmxhZ3MgJiBEUk1fQlVTX0ZMQUdfREVfTE9XKQo+ICsJCQl0 aW0yIHw9IFRJTTJfSU9FOwo+IAo+IC0JaWYgKGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmJ1c19m bGFncyAmIERSTV9CVVNfRkxBR19QSVhEQVRBX05FR0VER0UpCj4gLQkJdGltMiB8PSBUSU0yX0lQ QzsKPiArCQlpZiAoY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uYnVzX2ZsYWdzICYKPiArCQkgICAg RFJNX0JVU19GTEFHX1BJWERBVEFfTkVHRURHRSkKPiArCQkJdGltMiB8PSBUSU0yX0lQQzsKPiAr CX0KPiArCj4gKwlpZiAoYnJpZGdlKSB7Cj4gKwkJY29uc3Qgc3RydWN0IGRybV9icmlkZ2VfdGlt aW5ncyAqYnRpbWluZ3MgPSBicmlkZ2UtPnRpbWluZ3M7Cj4gKwo+ICsJCS8qCj4gKwkJICogSGVy ZSBpcyB3aGVuIHRoaW5ncyBnZXQgcmVhbGx5IGZ1bi4gU29tZXRpbWVzIHRoZSBicmlkZ2UKPiAr CQkgKiB0aW1pbmdzIGFyZSBzdWNoIHRoYXQgdGhlIHNpZ25hbCBvdXQgZnJvbSBQTDExeCBpcyBu b3QKPiArCQkgKiBzdGFibGUgYmVmb3JlIHRoZSByZWNlaXZpbmcgYnJpZGdlIChzdWNoIGFzIGEg ZHVtYiBWR0EgREFDCj4gKwkJICogb3Igc2ltaWxhcikgc2FtcGxlcyBpdC4gSWYgdGhhdCBoYXBw ZW5zLCB3ZSBjb21wZW5zYXRlIGJ5Cj4gKwkJICogdGhlIG9ubHkgbWV0aG9kIHdlIGhhdmU6IG91 dHB1dCB0aGUgZGF0YSBvbiB0aGUgb3Bwb3NpdGUKPiArCQkgKiBlZGdlIG9mIHRoZSBjbG9jayBz byBpdCBpcyBmb3Igc3VyZSBzdGFibGUgd2hlbiBpdCBnZXRzCj4gKwkJICogc2FtcGxlZC4KPiAr CQkgKgo+ICsJCSAqIFRoZSBQTDExMSBtYW51YWwgZG9lcyBub3QgY29udGFpbiBwcm9wZXIgdGlt aW5pbmcgZGlhZ3JhbXMKPiArCQkgKiBvciBkYXRhIGZvciB0aGVzZSBkZXRhaWxzLCBidXQgd2Ug a25vdyBmcm9tIGV4cGVyaW1lbnRzCj4gKwkJICogdGhhdCB0aGUgc2V0dXAgdGltZSBpcyBtb3Jl IHRoYW4gMzAwMCBwaWNvc2Vjb25kcyAoMyBucykuCj4gKwkJICogSWYgd2UgaGF2ZSBhIGJyaWRn ZSB0aGF0IHJlcXVpcmVzIHRoZSBzaWduYWwgdG8gYmUgc3RhYmxlCj4gKwkJICogZWFybGllciB0 aGFuIDMwMDAgcHMgYmVmb3JlIHRoZSBjbG9jayBwdWxzZSwgd2UgaGF2ZSB0bwo+ICsJCSAqIG91 dHB1dCB0aGUgZGF0YSBvbiB0aGUgb3Bwb3NpdGUgZWRnZSB0byBhdm9pZCBmbGlja2VyLgoKVGhp cyBzaG91bGQgcHJvYmFibHkgZGVwZW5kIG9uIHRoZSBwaXhlbCBjbG9jayBmcmVxdWVuY3ksIGJ1 dCBpZiBpdCB3b3JrcyBmb3IgCnlvdSBmb3Igbm93LCBJIGhhdmUgbm8gb2JqZWN0aW9uLgoKQWNr ZWQtYnk6IExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAaWRlYXNvbmJvYXJkLmNv bT4KCj4gKwkJICovCj4gKwkJaWYgKGJ0aW1pbmdzICYmIGJ0aW1pbmdzLT5zZXR1cF90aW1lX3Bz ID49IDMwMDApCj4gKwkJCXRpbTIgXj0gVElNMl9JUEM7Cj4gKwl9Cj4gCj4gIAl0aW0yIHw9IGNw bCA8PCAxNjsKPiAgCXdyaXRlbCh0aW0yLCBwcml2LT5yZWdzICsgQ0xDRF9USU0yKTsKPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3BsMTExL3BsMTExX2Rydi5jCj4gYi9kcml2ZXJzL2dw dS9kcm0vcGwxMTEvcGwxMTFfZHJ2LmMgaW5kZXggMjAxZDU3ZDVjYjU0Li4xMDFhOWM3ZGI2ZmYg MTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3BsMTExL3BsMTExX2Rydi5jCj4gKysrIGIv ZHJpdmVycy9ncHUvZHJtL3BsMTExL3BsMTExX2Rydi5jCj4gQEAgLTEwNywxMSArMTA3LDE3IEBA IHN0YXRpYyBpbnQgcGwxMTFfbW9kZXNldF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCj4g IAkJCXJldCA9IFBUUl9FUlIoYnJpZGdlKTsKPiAgCQkJZ290byBvdXRfY29uZmlnOwo+ICAJCX0K PiAtCQkvKgo+IC0JCSAqIFRPRE86IHdoZW4gd2UgYXJlIHVzaW5nIGEgZGlmZmVyZW50IGJyaWRn ZSB0aGFuIGEgcGFuZWwKPiAtCQkgKiAoc3VjaCBhcyBhIGR1bWIgVkdBIGNvbm5lY3Rvcikgd2Ug bmVlZCB0byBkZXZpc2UgYSBkaWZmZXJlbnQKPiAtCQkgKiBtZXRob2QgdG8gZ2V0IHRoZSBjb25u ZWN0b3Igb3V0IG9mIHRoZSBicmlkZ2UuCj4gLQkJICovCj4gKwl9IGVsc2UgaWYgKGJyaWRnZSkg ewo+ICsJCWRldl9pbmZvKGRldi0+ZGV2LCAiVXNpbmcgbm9uLXBhbmVsIGJyaWRnZVxuIik7Cj4g Kwl9IGVsc2Ugewo+ICsJCWRldl9lcnIoZGV2LT5kZXYsICJObyBicmlkZ2UsIGV4aXRpbmdcbiIp Owo+ICsJCXJldHVybiAtRU5PREVWOwo+ICsJfQo+ICsKPiArCXByaXYtPmJyaWRnZSA9IGJyaWRn ZTsKPiArCWlmIChwYW5lbCkgewo+ICsJCXByaXYtPnBhbmVsID0gcGFuZWw7Cj4gKwkJcHJpdi0+ Y29ubmVjdG9yID0gcGFuZWwtPmNvbm5lY3RvcjsKPiAgCX0KPiAKPiAgCXJldCA9IHBsMTExX2Rp c3BsYXlfaW5pdChkZXYpOwo+IEBAIC0xMjUsMTAgKzEzMSw2IEBAIHN0YXRpYyBpbnQgcGwxMTFf bW9kZXNldF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCj4gIAlpZiAocmV0KQo+ICAJCXJl dHVybiByZXQ7Cj4gCj4gLQlwcml2LT5icmlkZ2UgPSBicmlkZ2U7Cj4gLQlwcml2LT5wYW5lbCA9 IHBhbmVsOwo+IC0JcHJpdi0+Y29ubmVjdG9yID0gcGFuZWwtPmNvbm5lY3RvcjsKPiAtCj4gIAly ZXQgPSBkcm1fdmJsYW5rX2luaXQoZGV2LCAxKTsKPiAgCWlmIChyZXQgIT0gMCkgewo+ICAJCWRl dl9lcnIoZGV2LT5kZXYsICJGYWlsZWQgdG8gaW5pdCB2YmxhbmtcbiIpOwoKCi0tIApSZWdhcmRz LAoKTGF1cmVudCBQaW5jaGFydAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRl c2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8v ZHJpLWRldmVsCg==