@@ -68,14 +68,35 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c)
68
68
struct atmel_hlcdc_crtc * crtc = drm_crtc_to_atmel_hlcdc_crtc (c );
69
69
struct regmap * regmap = crtc -> dc -> hlcdc -> regmap ;
70
70
struct drm_display_mode * adj = & c -> state -> adjusted_mode ;
71
+ struct drm_encoder * encoder = NULL , * en_iter ;
72
+ struct drm_connector * connector = NULL ;
71
73
struct atmel_hlcdc_crtc_state * state ;
74
+ struct drm_device * ddev = c -> dev ;
75
+ struct drm_connector_list_iter iter ;
72
76
unsigned long mode_rate ;
73
77
struct videomode vm ;
74
78
unsigned long prate ;
75
79
unsigned int mask = ATMEL_HLCDC_CLKDIV_MASK | ATMEL_HLCDC_CLKPOL ;
76
80
unsigned int cfg = 0 ;
77
81
int div , ret ;
78
82
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
+
79
100
ret = clk_prepare_enable (crtc -> dc -> hlcdc -> sys_clk );
80
101
if (ret )
81
102
return ;
@@ -134,6 +155,10 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c)
134
155
135
156
cfg |= ATMEL_HLCDC_CLKDIV (div );
136
157
158
+ if (connector &&
159
+ connector -> display_info .bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE )
160
+ cfg |= ATMEL_HLCDC_CLKPOL ;
161
+
137
162
regmap_update_bits (regmap , ATMEL_HLCDC_CFG (0 ), mask , cfg );
138
163
139
164
state = drm_crtc_state_to_atmel_hlcdc_crtc_state (c -> state );
0 commit comments