aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/rcar-du/rcar_du_group.c
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2013-06-16 21:20:08 -0400
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2013-08-09 17:17:52 -0400
commit7cbc05cb518304b746bea00bc7c0b005217bcaf7 (patch)
tree32162ad351e9048403ec95ec3192fa6a8ee02b2b /drivers/gpu/drm/rcar-du/rcar_du_group.c
parentef67a902e946ad1ef51040cf287a45cc4714e2b5 (diff)
drm/rcar-du: Configure RGB output routing to DPAD0
The R8A7790 DU variant has a single RGB output called DPAD0 that can be fed with the output of DU0, DU1 or DU2. Making the routing configurable. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Diffstat (limited to 'drivers/gpu/drm/rcar-du/rcar_du_group.c')
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_group.c45
1 files changed, 42 insertions, 3 deletions
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_group.c b/drivers/gpu/drm/rcar-du/rcar_du_group.c
index 9df6fb635c96..eb53cd97e8c6 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_group.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_group.c
@@ -27,6 +27,7 @@
27 * counterpart in the DU documentation, that models those semi-global resources. 27 * counterpart in the DU documentation, that models those semi-global resources.
28 */ 28 */
29 29
30#include <linux/clk.h>
30#include <linux/io.h> 31#include <linux/io.h>
31 32
32#include "rcar_du_drv.h" 33#include "rcar_du_drv.h"
@@ -43,6 +44,22 @@ void rcar_du_group_write(struct rcar_du_group *rgrp, u32 reg, u32 data)
43 rcar_du_write(rgrp->dev, rgrp->mmio_offset + reg, data); 44 rcar_du_write(rgrp->dev, rgrp->mmio_offset + reg, data);
44} 45}
45 46
47static void rcar_du_group_setup_defr8(struct rcar_du_group *rgrp)
48{
49 u32 defr8 = DEFR8_CODE | DEFR8_DEFE8;
50
51 if (!rcar_du_has(rgrp->dev, RCAR_DU_FEATURE_DEFR8))
52 return;
53
54 /* The DEFR8 register for the first group also controls RGB output
55 * routing to DPAD0
56 */
57 if (rgrp->index == 0)
58 defr8 |= DEFR8_DRGBS_DU(rgrp->dev->dpad0_source);
59
60 rcar_du_group_write(rgrp, DEFR8, defr8);
61}
62
46static void rcar_du_group_setup(struct rcar_du_group *rgrp) 63static void rcar_du_group_setup(struct rcar_du_group *rgrp)
47{ 64{
48 /* Enable extended features */ 65 /* Enable extended features */
@@ -51,8 +68,8 @@ static void rcar_du_group_setup(struct rcar_du_group *rgrp)
51 rcar_du_group_write(rgrp, DEFR3, DEFR3_CODE | DEFR3_DEFE3); 68 rcar_du_group_write(rgrp, DEFR3, DEFR3_CODE | DEFR3_DEFE3);
52 rcar_du_group_write(rgrp, DEFR4, DEFR4_CODE); 69 rcar_du_group_write(rgrp, DEFR4, DEFR4_CODE);
53 rcar_du_group_write(rgrp, DEFR5, DEFR5_CODE | DEFR5_DEFE5); 70 rcar_du_group_write(rgrp, DEFR5, DEFR5_CODE | DEFR5_DEFE5);
54 if (rcar_du_has(rgrp->dev, RCAR_DU_FEATURE_DEFR8)) 71
55 rcar_du_group_write(rgrp, DEFR8, DEFR8_CODE | DEFR8_DEFE8); 72 rcar_du_group_setup_defr8(rgrp);
56 73
57 /* Use DS1PR and DS2PR to configure planes priorities and connects the 74 /* Use DS1PR and DS2PR to configure planes priorities and connects the
58 * superposition 0 to DU0 pins. DU1 pins will be configured dynamically. 75 * superposition 0 to DU0 pins. DU1 pins will be configured dynamically.
@@ -128,7 +145,27 @@ void rcar_du_group_restart(struct rcar_du_group *rgrp)
128 __rcar_du_group_start_stop(rgrp, true); 145 __rcar_du_group_start_stop(rgrp, true);
129} 146}
130 147
131void rcar_du_group_set_routing(struct rcar_du_group *rgrp) 148static int rcar_du_set_dpad0_routing(struct rcar_du_device *rcdu)
149{
150 int ret;
151
152 /* RGB output routing to DPAD0 is configured in the DEFR8 register of
153 * the first group. As this function can be called with the DU0 and DU1
154 * CRTCs disabled, we need to enable the first group clock before
155 * accessing the register.
156 */
157 ret = clk_prepare_enable(rcdu->crtcs[0].clock);
158 if (ret < 0)
159 return ret;
160
161 rcar_du_group_setup_defr8(&rcdu->groups[0]);
162
163 clk_disable_unprepare(rcdu->crtcs[0].clock);
164
165 return 0;
166}
167
168int rcar_du_group_set_routing(struct rcar_du_group *rgrp)
132{ 169{
133 struct rcar_du_crtc *crtc0 = &rgrp->dev->crtcs[rgrp->index * 2]; 170 struct rcar_du_crtc *crtc0 = &rgrp->dev->crtcs[rgrp->index * 2];
134 u32 dorcr = rcar_du_group_read(rgrp, DORCR); 171 u32 dorcr = rcar_du_group_read(rgrp, DORCR);
@@ -145,4 +182,6 @@ void rcar_du_group_set_routing(struct rcar_du_group *rgrp)
145 dorcr |= DORCR_PG2T | DORCR_DK2S | DORCR_PG2D_DS2; 182 dorcr |= DORCR_PG2T | DORCR_DK2S | DORCR_PG2D_DS2;
146 183
147 rcar_du_group_write(rgrp, DORCR, dorcr); 184 rcar_du_group_write(rgrp, DORCR, dorcr);
185
186 return rcar_du_set_dpad0_routing(rgrp->dev);
148} 187}