Skip to content

Commit d01cb04

Browse files
miquelraynalbbrezillon
authored andcommitted
drm: atmel-hlcdc: Support inverting the pixel clock polarity
On the SoC host controller, the pixel clock can be: * standard: data is launched on the rising edge * inverted: data is launched on the falling edge Some panels may need the inverted option to be used so let's support this DRM flag. Signed-off-by: Miquel Raynal <[email protected]> Reviewed-by: Sam Ravnborg <[email protected]> Signed-off-by: Boris Brezillon <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 2da20c9 commit d01cb04

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,35 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c)
6868
struct atmel_hlcdc_crtc *crtc = drm_crtc_to_atmel_hlcdc_crtc(c);
6969
struct regmap *regmap = crtc->dc->hlcdc->regmap;
7070
struct drm_display_mode *adj = &c->state->adjusted_mode;
71+
struct drm_encoder *encoder = NULL, *en_iter;
72+
struct drm_connector *connector = NULL;
7173
struct atmel_hlcdc_crtc_state *state;
74+
struct drm_device *ddev = c->dev;
75+
struct drm_connector_list_iter iter;
7276
unsigned long mode_rate;
7377
struct videomode vm;
7478
unsigned long prate;
7579
unsigned int mask = ATMEL_HLCDC_CLKDIV_MASK | ATMEL_HLCDC_CLKPOL;
7680
unsigned int cfg = 0;
7781
int div, ret;
7882

83+
/* get encoder from crtc */
84+
drm_for_each_encoder(en_iter, ddev) {
85+
if (en_iter->crtc == c) {
86+
encoder = en_iter;
87+
break;
88+
}
89+
}
90+
91+
if (encoder) {
92+
/* Get the connector from encoder */
93+
drm_connector_list_iter_begin(ddev, &iter);
94+
drm_for_each_connector_iter(connector, &iter)
95+
if (connector->encoder == encoder)
96+
break;
97+
drm_connector_list_iter_end(&iter);
98+
}
99+
79100
ret = clk_prepare_enable(crtc->dc->hlcdc->sys_clk);
80101
if (ret)
81102
return;
@@ -134,6 +155,10 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c)
134155

135156
cfg |= ATMEL_HLCDC_CLKDIV(div);
136157

158+
if (connector &&
159+
connector->display_info.bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE)
160+
cfg |= ATMEL_HLCDC_CLKPOL;
161+
137162
regmap_update_bits(regmap, ATMEL_HLCDC_CFG(0), mask, cfg);
138163

139164
state = drm_crtc_state_to_atmel_hlcdc_crtc_state(c->state);

0 commit comments

Comments
 (0)