From patchwork Fri Oct 20 06:59:41 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 116460 Delivered-To: patch@linaro.org Received: by 10.140.22.164 with SMTP id 33csp1351246qgn; Fri, 20 Oct 2017 00:01:52 -0700 (PDT) X-Received: by 10.98.89.82 with SMTP id n79mr3989492pfb.133.1508482912746; Fri, 20 Oct 2017 00:01:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1508482912; cv=none; d=google.com; s=arc-20160816; b=mAJ+Crv+ZveWglfFwoAf6Z4EQ0JhxPa+Vkt4YEdbQMoI6eDRfPgmAqIo3wsA/bIXgU bLcnhxFBleRJXVuzNTbPlzQzI13OyG/U8kahjj4Q0YZzYuoyElJ9dZR/ZtO124ynTXc9 UyyiP1MSZnbk+xCw1i0k19aAaj/2qeIWjCg9ovs2GTOLGQPEXhAaBZqsmWP9Ic+id2KV 1rsiJWydiNvobQp0WSd+qgn0pHRCGMNvhtHq4X6WhJB/Aj8JbYIQ5guuZTjPmbpfyTqb mCgP99bjYf/Sz0w+2/nahu/YweHWOlr3Cln7qVKJPzS1QPolmshTMuXcYzM0j6xRgGPS TL9w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:cc:message-id:date:subject:to:from :dkim-signature:delivered-to:arc-authentication-results; bh=ikpg2tUPBPwGgL3TLJBdj1Ut0ZDXrxrmiWxYKpPuPzc=; b=fkJo4wALJmdIH9gPwLKcSEWhH+Q/NV9XsX3AQESVkNQkq+oiAOlLJP9DOzqUdlSYy4 EJ0j92iGq8r0HI/bFZwyeTHp2+AZsOCWV5y7almcQw18FW9at2kFr0GQHMkzFDmg0o0W EB/Pwf5UV8Z/0A0ZCbt0T0bSHLv7YyEL7aS5OmurCoSzs/qWLhmDLlEMGhDEWzKpFPkW 4rJvrV5LcfVaY4Fy8xyCLST3UJ+iqtG/T5zBj+yUx6Lf7RzBEn/tirh77X3ONjGHSKvy KI+r+fRs0AqaAcOVQxEi3AJfrAmVJ3EAuRjYRqDG9UC8gptOWLV1Cko3gAHHzq4YCa4c r0+g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=WQ98SNep; spf=pass (google.com: best guess record for domain of dri-devel-bounces@lists.freedesktop.org designates 131.252.210.177 as permitted sender) smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from gabe.freedesktop.org (gabe.freedesktop.org. [131.252.210.177]) by mx.google.com with ESMTPS id y73si311924pfj.569.2017.10.20.00.01.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 20 Oct 2017 00:01:52 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of dri-devel-bounces@lists.freedesktop.org designates 131.252.210.177 as permitted sender) client-ip=131.252.210.177; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=WQ98SNep; spf=pass (google.com: best guess record for domain of dri-devel-bounces@lists.freedesktop.org designates 131.252.210.177 as permitted sender) smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id B7C826EBD8; Fri, 20 Oct 2017 07:01:50 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-lf0-x241.google.com (mail-lf0-x241.google.com [IPv6:2a00:1450:4010:c07::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7FF5F6EBD8 for ; Fri, 20 Oct 2017 07:01:48 +0000 (UTC) Received: by mail-lf0-x241.google.com with SMTP id p184so12081577lfe.12 for ; Fri, 20 Oct 2017 00:01:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=xsxd4tUWQ6m/g8HyJEgbnO7qnnAugC4UQ+5IzPARrdc=; b=WQ98SNeplqrznJHMhxVojHdTFb1P4lYBAi/fiaF7W2eyEYgcdp5QTOiCFwwugVUT4W 0sqGdq1/LbCiMwiTG0SAKDTYhodHWAoEaLEXuYHN4WCaflJFCNqLDkfpAY3gNGmo1lXM mSbtzczc8DY8bMUMaRwaS/E7mOgjZQ3XSBjI4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=xsxd4tUWQ6m/g8HyJEgbnO7qnnAugC4UQ+5IzPARrdc=; b=tLHsc7SrT/EpjqkzkbnBR8hPhM13O0W7pBZDQYhNjRndYy53l2gdedHP50CvoREzsk OHMgl31f4BGaMTIUbOgpJkc7OEA8ZPetaaY+ndmIiMzv5nlIm/ZBV155gROr99PSROXQ vc7BZPU86B1rbm6g6z98Cbi5RpFZFvI9tAxCSAn0dY8Q25blUcgzLkb8DhJjrUlqgRTX NVjwc6unQ70JRBfeMq7IO3JzD8gWl3zQR7LFSRsk8kuOmUaXwYf/J3y9r/dqL+lUUiAm FWlvZA5BFKlgiqrPCOmoy3vkGpZxNsp5DoXLcBrkx48d5jZs85zglGRV5+5id6B6Hp7r q9QQ== X-Gm-Message-State: AMCzsaU9WdhqANXWXPYbjy78BxtOsorT6LusniU0HN/qtK49SNEZ3LUZ 6/oFYi4PhfYrpHuA3doBbzVDvg== X-Google-Smtp-Source: ABhQp+RjGDVHEDIH1UAN7kx8zWOsatmfHm831wu9Y7TLkLMIiDXgl/mOt9bww9/wG9pc8PXG1ttRWA== X-Received: by 10.46.16.218 with SMTP id 87mr1873366ljq.115.1508482906508; Fri, 20 Oct 2017 00:01:46 -0700 (PDT) Received: from localhost.localdomain (c-5f7c71d5.014-348-6c756e10.cust.bredbandsbolaget.se. [213.113.124.95]) by smtp.gmail.com with ESMTPSA id h26sm79005lja.69.2017.10.20.00.01.44 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 20 Oct 2017 00:01:45 -0700 (PDT) From: Linus Walleij To: Archit Taneja , Andrzej Hajda , Laurent Pinchart Subject: [PATCH 2/2 v3] drm: bridge: Add THS8134A/B support to dumb VGA DAC Date: Fri, 20 Oct 2017 08:59:41 +0200 Message-Id: <20171020065941.3877-1-linus.walleij@linaro.org> X-Mailer: git-send-email 2.13.6 Cc: Laurent Pinchart , dri-devel@lists.freedesktop.org, Bartosz Golaszewski , Maxime Ripard , linux-arm-kernel@lists.infradead.org X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" This extends the dumb VGA DAC bridge to handle the THS8134A and THS8134B VGA DACs in addition to those already handled. The THS8134A, THS8134B and as it turns out also THS8135 need to have data clocked out at the negative edge of the clock pulse, since they clock it into the DAC at the positive edge (so by then it needs to be stable) so we need some extra logic to flag this on the connector to the driver. The semantics of the flag DRM_BUS_FLAG_PIXDATA_NEGEDGE in clearly indicates that this flag tells when to *drive* the data, not when the receiver *reads* it, so the TI variants needs to be handled like this. Introduce a variant struct and contain the information there, and add a bit of helpful comments about how this works so people will get it right when adding new DACs or connectiong new display drivers to DACs. The fact that THS8135 might be working on some systems today is probably due to the fact that the display driver cannot configure when the data is clocked out and the electronics have simply been designed around it so it works anyways. The phenomenon is very real on the ARM reference designs using PL111 where the hardware can control which edge to push out the data. Cc: Laurent Pinchart Cc: Bartosz Golaszewski Cc: Maxime Ripard Signed-off-by: Linus Walleij --- ChangeLog v2->v3: - Move const specifier. - Cut one line of code assigning bus flags. - Preserve the "ti,ths8135" compatible for elder device trees. ChangeLog v1->v2: - Alphabetize includes - Use a u32 with the bus polarity flags and just encode the polarity using the DRM define directly. - Rename vendor_data to vendor_info. - Simplify assignment of the flag as it is just a simple u32 now. - Probe all TI variants on the "ti,ths813x" wildcard for now, we only need to know that the device is in this family to set the clock edge flag right. --- drivers/gpu/drm/bridge/dumb-vga-dac.c | 55 ++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/bridge/dumb-vga-dac.c b/drivers/gpu/drm/bridge/dumb-vga-dac.c index 831a606c4706..2622e2f778d1 100644 --- a/drivers/gpu/drm/bridge/dumb-vga-dac.c +++ b/drivers/gpu/drm/bridge/dumb-vga-dac.c @@ -11,6 +11,7 @@ */ #include +#include #include #include @@ -19,9 +20,18 @@ #include #include +/** + * struct vga_dac_info - characteristics of the DAC + * @clk_edge_latch: this defines the clock edge latch for the variant + */ +struct vga_dac_info { + u32 clk_edge_latch; +}; + struct dumb_vga { struct drm_bridge bridge; struct drm_connector connector; + const struct vga_dac_info *variant; struct i2c_adapter *ddc; struct regulator *vdd; @@ -55,7 +65,8 @@ static int dumb_vga_get_modes(struct drm_connector *connector) } drm_mode_connector_update_edid_property(connector, edid); - return drm_add_edid_modes(connector, edid); + connector->display_info.bus_flags |= vga->variant->clk_edge_latch; + retturn drm_add_edid_modes(connector, edid); fallback: /* @@ -67,6 +78,8 @@ static int dumb_vga_get_modes(struct drm_connector *connector) /* And prefer a mode pretty much anyone can handle */ drm_set_preferred_mode(connector, 1024, 768); + connector->display_info.bus_flags |= vga->variant->clk_edge_latch; + return ret; } @@ -183,6 +196,7 @@ static int dumb_vga_probe(struct platform_device *pdev) if (!vga) return -ENOMEM; platform_set_drvdata(pdev, vga); + vga->variant = of_device_get_match_data(&pdev->dev); vga->vdd = devm_regulator_get_optional(&pdev->dev, "vdd"); if (IS_ERR(vga->vdd)) { @@ -226,10 +240,43 @@ static int dumb_vga_remove(struct platform_device *pdev) return 0; } +static const struct vga_dac_info default_dac_variant = { + /* + * These DACs read data on the negative edge. For example in the + * ADV7123 datasheet (revision D, page 8) there is a timing diagram + * making this clear. So consequently we need to latch the data + * on the positive edge. + */ + .clk_edge_latch = DRM_BUS_FLAG_PIXDATA_POSEDGE, +}; + +static const struct vga_dac_info ti_ths_dac_variant = { + /* + * The TI DACs read the data on the positive edge of the CLK, + * so consequently we need to latch the data on the negative + * edge. + */ + .clk_edge_latch = DRM_BUS_FLAG_PIXDATA_NEGEDGE, +}; + static const struct of_device_id dumb_vga_match[] = { - { .compatible = "dumb-vga-dac" }, - { .compatible = "adi,adv7123" }, - { .compatible = "ti,ths8135" }, + { + .compatible = "dumb-vga-dac", + .data = &default_dac_variant, + }, + { + .compatible = "adi,adv7123", + .data = &default_dac_variant, + }, + { + /* Some trees contain just this compatible and no "ti,ths813x" */ + .compatible = "ti,ths8135", + .data = &ti_ths_dac_variant, + }, + { + .compatible = "ti,ths813x", + .data = &ti_ths_dac_variant, + }, {}, }; MODULE_DEVICE_TABLE(of, dumb_vga_match);