| From 86b145e8164f7674f9b87afbd86fc83429d6a15b Mon Sep 17 00:00:00 2001 |
| From: Geert Uytterhoeven <geert+renesas@glider.be> |
| Date: Tue, 17 Sep 2019 08:23:53 +0200 |
| Subject: [PATCH] drm: rcar_lvds: Fix color mismatches on R-Car H2 ES2.0 and |
| later |
| |
| commit 3986457110a054466bf02f9c4a85aa2bba96177b upstream. |
| |
| Commit 5cca30ebe089be23 ("drm/rcar-du: Add LVDS_LANES quirk") states |
| that LVDS lanes 1 and 3 are inverted on R-Car H2 ES1 only, and that the |
| problem has been fixed in newer revisions. |
| |
| However, the code didn't take into account the actual hardware revision, |
| thus applying the quirk also on newer hardware revisions, causing green |
| color reversals. |
| |
| Fix this by applying the quirk when running on R-Car H2 ES1.x only. |
| |
| Reported-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> |
| Fixes: 5cca30ebe089be23 ("drm/rcar-du: Add LVDS_LANES quirk") |
| Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> |
| Tested-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> |
| Reviewed-by: Ulrich Hecht <uli+renesas@fpond.eu> |
| Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c b/drivers/gpu/drm/rcar-du/rcar_lvds.c |
| index 620b51aab291..6b623310f36a 100644 |
| --- a/drivers/gpu/drm/rcar-du/rcar_lvds.c |
| +++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c |
| @@ -16,6 +16,7 @@ |
| #include <linux/of_graph.h> |
| #include <linux/platform_device.h> |
| #include <linux/slab.h> |
| +#include <linux/sys_soc.h> |
| |
| #include <drm/drm_atomic.h> |
| #include <drm/drm_atomic_helper.h> |
| @@ -779,8 +780,23 @@ static int rcar_lvds_get_clocks(struct rcar_lvds *lvds) |
| return 0; |
| } |
| |
| +static const struct rcar_lvds_device_info rcar_lvds_r8a7790es1_info = { |
| + .gen = 2, |
| + .quirks = RCAR_LVDS_QUIRK_LANES, |
| + .pll_setup = rcar_lvds_pll_setup_gen2, |
| +}; |
| + |
| +static const struct soc_device_attribute lvds_quirk_matches[] = { |
| + { |
| + .soc_id = "r8a7790", .revision = "ES1.*", |
| + .data = &rcar_lvds_r8a7790es1_info, |
| + }, |
| + { /* sentinel */ } |
| +}; |
| + |
| static int rcar_lvds_probe(struct platform_device *pdev) |
| { |
| + const struct soc_device_attribute *attr; |
| struct rcar_lvds *lvds; |
| struct resource *mem; |
| int ret; |
| @@ -795,6 +811,10 @@ static int rcar_lvds_probe(struct platform_device *pdev) |
| lvds->info = of_device_get_match_data(&pdev->dev); |
| lvds->enabled = false; |
| |
| + attr = soc_device_match(lvds_quirk_matches); |
| + if (attr) |
| + lvds->info = attr->data; |
| + |
| ret = rcar_lvds_parse_dt(lvds); |
| if (ret < 0) |
| return ret; |
| @@ -831,12 +851,6 @@ static const struct rcar_lvds_device_info rcar_lvds_gen2_info = { |
| .pll_setup = rcar_lvds_pll_setup_gen2, |
| }; |
| |
| -static const struct rcar_lvds_device_info rcar_lvds_r8a7790_info = { |
| - .gen = 2, |
| - .quirks = RCAR_LVDS_QUIRK_LANES, |
| - .pll_setup = rcar_lvds_pll_setup_gen2, |
| -}; |
| - |
| static const struct rcar_lvds_device_info rcar_lvds_gen3_info = { |
| .gen = 3, |
| .quirks = RCAR_LVDS_QUIRK_PWD, |
| @@ -867,7 +881,7 @@ static const struct of_device_id rcar_lvds_of_table[] = { |
| { .compatible = "renesas,r8a7743-lvds", .data = &rcar_lvds_gen2_info }, |
| { .compatible = "renesas,r8a7744-lvds", .data = &rcar_lvds_gen2_info }, |
| { .compatible = "renesas,r8a774c0-lvds", .data = &rcar_lvds_r8a77990_info }, |
| - { .compatible = "renesas,r8a7790-lvds", .data = &rcar_lvds_r8a7790_info }, |
| + { .compatible = "renesas,r8a7790-lvds", .data = &rcar_lvds_gen2_info }, |
| { .compatible = "renesas,r8a7791-lvds", .data = &rcar_lvds_gen2_info }, |
| { .compatible = "renesas,r8a7793-lvds", .data = &rcar_lvds_gen2_info }, |
| { .compatible = "renesas,r8a7795-lvds", .data = &rcar_lvds_gen3_info }, |
| -- |
| 2.7.4 |
| |