• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Analogix DP (Display port) core register interface driver.
4  *
5  * Copyright (C) 2012 Samsung Electronics Co., Ltd.
6  * Author: Jingoo Han <jg1.han@samsung.com>
7  */
8 
9 #include <linux/delay.h>
10 #include <linux/device.h>
11 #include <linux/gpio/consumer.h>
12 #include <linux/io.h>
13 #include <linux/iopoll.h>
14 #include <linux/phy/phy.h>
15 
16 #include <drm/bridge/analogix_dp.h>
17 
18 #include "analogix_dp_core.h"
19 #include "analogix_dp_reg.h"
20 
21 #define COMMON_INT_MASK_1 0
22 #define COMMON_INT_MASK_2 0
23 #define COMMON_INT_MASK_3 0
24 #define COMMON_INT_MASK_4 (HOTPLUG_CHG | HPD_LOST | PLUG)
25 
analogix_dp_write(struct analogix_dp_device * dp,u32 reg,u32 val)26 static void analogix_dp_write(struct analogix_dp_device *dp, u32 reg, u32 val)
27 {
28     if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
29         readl(dp->reg_base);
30         writel(val, dp->reg_base + reg);
31     }
32 
33     writel(val, dp->reg_base + reg);
34 }
35 
analogix_dp_read(struct analogix_dp_device * dp,u32 reg)36 static u32 analogix_dp_read(struct analogix_dp_device *dp, u32 reg)
37 {
38     if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
39         readl(dp->reg_base + reg);
40     }
41 
42     return readl(dp->reg_base + reg);
43 }
44 
analogix_dp_enable_video_mute(struct analogix_dp_device * dp,bool enable)45 void analogix_dp_enable_video_mute(struct analogix_dp_device *dp, bool enable)
46 {
47     u32 reg;
48 
49     if (enable) {
50         reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_1);
51         reg |= HDCP_VIDEO_MUTE;
52         analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_1, reg);
53     } else {
54         reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_1);
55         reg &= ~HDCP_VIDEO_MUTE;
56         analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_1, reg);
57     }
58 }
59 
analogix_dp_stop_video(struct analogix_dp_device * dp)60 void analogix_dp_stop_video(struct analogix_dp_device *dp)
61 {
62     u32 reg;
63 
64     reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_1);
65     reg &= ~VIDEO_EN;
66     analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_1, reg);
67 }
68 
analogix_dp_lane_swap(struct analogix_dp_device * dp,bool enable)69 void analogix_dp_lane_swap(struct analogix_dp_device *dp, bool enable)
70 {
71     u32 reg;
72 
73     if (enable) {
74         reg = LANE3_MAP_LOGIC_LANE_0 | LANE2_MAP_LOGIC_LANE_1 | LANE1_MAP_LOGIC_LANE_2 | LANE0_MAP_LOGIC_LANE_3;
75     } else {
76         reg = LANE3_MAP_LOGIC_LANE_3 | LANE2_MAP_LOGIC_LANE_2 | LANE1_MAP_LOGIC_LANE_1 | LANE0_MAP_LOGIC_LANE_0;
77     }
78 
79     analogix_dp_write(dp, ANALOGIX_DP_LANE_MAP, reg);
80 }
81 
analogix_dp_init_analog_param(struct analogix_dp_device * dp)82 void analogix_dp_init_analog_param(struct analogix_dp_device *dp)
83 {
84     u32 reg;
85 
86     reg = TX_TERMINAL_CTRL_50_OHM;
87     analogix_dp_write(dp, ANALOGIX_DP_ANALOG_CTL_1, reg);
88 
89     reg = SEL_24M | TX_DVDD_BIT_1_0625V;
90     analogix_dp_write(dp, ANALOGIX_DP_ANALOG_CTL_2, reg);
91 
92     if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
93         reg = REF_CLK_24M;
94         if (dp->plat_data->dev_type == RK3288_DP) {
95             reg ^= REF_CLK_MASK;
96         }
97 
98         analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_1, reg);
99         analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_2, 0x99);
100         analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_3, 0x40);
101         analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_4, 0x58);
102         analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_5, 0x22);
103         analogix_dp_write(dp, ANALOGIX_DP_BIAS, 0x44);
104     }
105 
106     reg = DRIVE_DVDD_BIT_1_0625V | VCO_BIT_600_MICRO;
107     analogix_dp_write(dp, ANALOGIX_DP_ANALOG_CTL_3, reg);
108 
109     reg = PD_RING_OSC | AUX_TERMINAL_CTRL_50_OHM | TX_CUR1_2X | TX_CUR_16_MA;
110     analogix_dp_write(dp, ANALOGIX_DP_PLL_FILTER_CTL_1, reg);
111 
112     reg = CH3_AMP_400_MV | CH2_AMP_400_MV | CH1_AMP_400_MV | CH0_AMP_400_MV;
113     analogix_dp_write(dp, ANALOGIX_DP_TX_AMP_TUNING_CTL, reg);
114 }
115 
analogix_dp_init_interrupt(struct analogix_dp_device * dp)116 void analogix_dp_init_interrupt(struct analogix_dp_device *dp)
117 {
118     /* Set interrupt pin assertion polarity as high */
119     analogix_dp_write(dp, ANALOGIX_DP_INT_CTL, INT_POL1 | INT_POL0);
120 
121     /* Clear pending regisers */
122     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_STA_1, 0xff);
123     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_STA_2, 0x4f);
124     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_STA_3, 0xe0);
125     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_STA_4, 0xe7);
126     analogix_dp_write(dp, ANALOGIX_DP_INT_STA, 0x63);
127 
128     /* 0:mask,1: unmask */
129     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_1, 0x00);
130     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_2, 0x00);
131     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_3, 0x00);
132     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_4, 0x00);
133     analogix_dp_write(dp, ANALOGIX_DP_INT_STA_MASK, 0x00);
134 }
135 
analogix_dp_reset(struct analogix_dp_device * dp)136 void analogix_dp_reset(struct analogix_dp_device *dp)
137 {
138     u32 reg;
139 
140     analogix_dp_stop_video(dp);
141     analogix_dp_enable_video_mute(dp, 0);
142 
143     if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
144         reg = RK_VID_CAP_FUNC_EN_N | RK_VID_FIFO_FUNC_EN_N | SW_FUNC_EN_N;
145     } else {
146         reg = MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N | AUD_FIFO_FUNC_EN_N | AUD_FUNC_EN_N | HDCP_FUNC_EN_N |
147               SW_FUNC_EN_N;
148     }
149 
150     analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_1, reg);
151 
152     reg = SSC_FUNC_EN_N | AUX_FUNC_EN_N | SERDES_FIFO_FUNC_EN_N | LS_CLK_DOMAIN_FUNC_EN_N;
153     analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_2, reg);
154 
155     usleep_range(0x14, 0x1e);
156 
157     analogix_dp_lane_swap(dp, 0);
158 
159     analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_1, 0x0);
160     analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_2, 0x40);
161     analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_3, 0x0);
162     analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_4, 0x0);
163 
164     analogix_dp_write(dp, ANALOGIX_DP_PKT_SEND_CTL, 0x0);
165     analogix_dp_write(dp, ANALOGIX_DP_HDCP_CTL, 0x0);
166 
167     analogix_dp_write(dp, ANALOGIX_DP_HPD_DEGLITCH_L, 0x5e);
168     analogix_dp_write(dp, ANALOGIX_DP_HPD_DEGLITCH_H, 0x1a);
169 
170     analogix_dp_write(dp, ANALOGIX_DP_LINK_DEBUG_CTL, 0x10);
171 
172     analogix_dp_write(dp, ANALOGIX_DP_PHY_TEST, 0x0);
173 
174     analogix_dp_write(dp, ANALOGIX_DP_VIDEO_FIFO_THRD, 0x0);
175     analogix_dp_write(dp, ANALOGIX_DP_AUDIO_MARGIN, 0x20);
176 
177     analogix_dp_write(dp, ANALOGIX_DP_M_VID_GEN_FILTER_TH, 0x4);
178     analogix_dp_write(dp, ANALOGIX_DP_M_AUD_GEN_FILTER_TH, 0x2);
179 
180     analogix_dp_write(dp, ANALOGIX_DP_SOC_GENERAL_CTL, 0x00000101);
181 }
182 
analogix_dp_swreset(struct analogix_dp_device * dp)183 void analogix_dp_swreset(struct analogix_dp_device *dp)
184 {
185     analogix_dp_write(dp, ANALOGIX_DP_TX_SW_RESET, RESET_DP_TX);
186 }
187 
analogix_dp_config_interrupt(struct analogix_dp_device * dp)188 void analogix_dp_config_interrupt(struct analogix_dp_device *dp)
189 {
190     u32 reg;
191 
192     /* 0: mask, 1: unmask */
193     reg = COMMON_INT_MASK_1;
194     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_1, reg);
195 
196     reg = COMMON_INT_MASK_2;
197     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_2, reg);
198 
199     reg = COMMON_INT_MASK_3;
200     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_3, reg);
201 
202     if (dp->force_hpd || dp->hpd_gpiod) {
203         analogix_dp_mute_hpd_interrupt(dp);
204     } else {
205         analogix_dp_unmute_hpd_interrupt(dp);
206     }
207 }
208 
analogix_dp_mute_hpd_interrupt(struct analogix_dp_device * dp)209 void analogix_dp_mute_hpd_interrupt(struct analogix_dp_device *dp)
210 {
211     u32 reg;
212 
213     /* 0: mask, 1: unmask */
214     reg = analogix_dp_read(dp, ANALOGIX_DP_COMMON_INT_MASK_4);
215     reg &= ~COMMON_INT_MASK_4;
216     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_4, reg);
217 
218     reg = analogix_dp_read(dp, ANALOGIX_DP_INT_STA_MASK);
219     reg &= ~INT_HPD;
220     analogix_dp_write(dp, ANALOGIX_DP_INT_STA_MASK, reg);
221 }
222 
analogix_dp_unmute_hpd_interrupt(struct analogix_dp_device * dp)223 void analogix_dp_unmute_hpd_interrupt(struct analogix_dp_device *dp)
224 {
225     u32 reg;
226 
227     /* 0: mask, 1: unmask */
228     reg = COMMON_INT_MASK_4;
229     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_4, reg);
230 
231     reg = analogix_dp_read(dp, ANALOGIX_DP_INT_STA_MASK);
232     reg |= INT_HPD;
233     analogix_dp_write(dp, ANALOGIX_DP_INT_STA_MASK, reg);
234 }
235 
analogix_dp_get_pll_lock_status(struct analogix_dp_device * dp)236 enum pll_status analogix_dp_get_pll_lock_status(struct analogix_dp_device *dp)
237 {
238     u32 reg;
239 
240     reg = analogix_dp_read(dp, ANALOGIX_DP_DEBUG_CTL);
241     if (reg & PLL_LOCK) {
242         return PLL_LOCKED;
243     } else {
244         return PLL_UNLOCKED;
245     }
246 }
247 
analogix_dp_set_pll_power_down(struct analogix_dp_device * dp,bool enable)248 void analogix_dp_set_pll_power_down(struct analogix_dp_device *dp, bool enable)
249 {
250     u32 reg;
251     u32 mask = DP_PLL_PD;
252     u32 pd_addr = ANALOGIX_DP_PLL_CTL;
253 
254     if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
255         pd_addr = ANALOGIX_DP_PD;
256         mask = RK_PLL_PD;
257     }
258 
259     reg = analogix_dp_read(dp, pd_addr);
260     if (enable) {
261         reg |= mask;
262     } else {
263         reg &= ~mask;
264     }
265     analogix_dp_write(dp, pd_addr, reg);
266 }
267 
analogix_dp_set_analog_power_down(struct analogix_dp_device * dp,enum analog_power_block block,bool enable)268 void analogix_dp_set_analog_power_down(struct analogix_dp_device *dp, enum analog_power_block block, bool enable)
269 {
270     u32 reg;
271     u32 phy_pd_addr = ANALOGIX_DP_PHY_PD;
272     u32 mask;
273 
274     if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
275         phy_pd_addr = ANALOGIX_DP_PD;
276     }
277 
278     switch (block) {
279         case AUX_BLOCK:
280             if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
281                 mask = RK_AUX_PD;
282             } else {
283                 mask = AUX_PD;
284             }
285 
286             reg = analogix_dp_read(dp, phy_pd_addr);
287             if (enable) {
288                 reg &= ~(DP_INC_BG | DP_EXP_BG);
289                 reg |= mask;
290             } else {
291                 reg &= ~mask;
292             }
293             analogix_dp_write(dp, phy_pd_addr, reg);
294             break;
295         case CH0_BLOCK:
296             mask = CH0_PD;
297             reg = analogix_dp_read(dp, phy_pd_addr);
298 
299             if (enable) {
300                 reg |= mask;
301             } else {
302                 reg &= ~mask;
303             }
304             analogix_dp_write(dp, phy_pd_addr, reg);
305             break;
306         case CH1_BLOCK:
307             mask = CH1_PD;
308             reg = analogix_dp_read(dp, phy_pd_addr);
309 
310             if (enable) {
311                 reg |= mask;
312             } else {
313                 reg &= ~mask;
314             }
315             analogix_dp_write(dp, phy_pd_addr, reg);
316             break;
317         case CH2_BLOCK:
318             mask = CH2_PD;
319             reg = analogix_dp_read(dp, phy_pd_addr);
320 
321             if (enable) {
322                 reg |= mask;
323             } else {
324                 reg &= ~mask;
325             }
326             analogix_dp_write(dp, phy_pd_addr, reg);
327             break;
328         case CH3_BLOCK:
329             mask = CH3_PD;
330             reg = analogix_dp_read(dp, phy_pd_addr);
331 
332             if (enable) {
333                 reg |= mask;
334             } else {
335                 reg &= ~mask;
336             }
337             analogix_dp_write(dp, phy_pd_addr, reg);
338             break;
339         case ANALOG_TOTAL:
340             /*
341              * There is no bit named DP_PHY_PD, so We used DP_INC_BG
342              * to power off everything instead of DP_PHY_PD in
343              * Rockchip
344              */
345             if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
346                 mask = DP_INC_BG;
347             } else {
348                 mask = DP_PHY_PD;
349             }
350 
351             reg = analogix_dp_read(dp, phy_pd_addr);
352             if (enable) {
353                 reg |= mask;
354             } else {
355                 reg &= ~mask;
356             }
357 
358             analogix_dp_write(dp, phy_pd_addr, reg);
359             if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
360                 usleep_range(10, 15);
361             }
362             break;
363         case POWER_ALL:
364             if (enable) {
365                 reg = DP_ALL_PD;
366                 analogix_dp_write(dp, phy_pd_addr, reg);
367             } else {
368                 reg = DP_ALL_PD;
369                 analogix_dp_write(dp, phy_pd_addr, reg);
370                 usleep_range(10, 15);
371                 reg &= ~DP_INC_BG;
372                 analogix_dp_write(dp, phy_pd_addr, reg);
373                 usleep_range(10, 15);
374 
375                 analogix_dp_write(dp, phy_pd_addr, 0x00);
376             }
377             break;
378         default:
379             break;
380     }
381 }
382 
analogix_dp_init_analog_func(struct analogix_dp_device * dp)383 int analogix_dp_init_analog_func(struct analogix_dp_device *dp)
384 {
385     u32 reg;
386 
387     analogix_dp_set_analog_power_down(dp, POWER_ALL, 0);
388 
389     reg = PLL_LOCK_CHG;
390     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_STA_1, reg);
391 
392     reg = analogix_dp_read(dp, ANALOGIX_DP_DEBUG_CTL);
393     reg &= ~(F_PLL_LOCK | PLL_LOCK_CTRL);
394     analogix_dp_write(dp, ANALOGIX_DP_DEBUG_CTL, reg);
395 
396     /* Power up PLL */
397     analogix_dp_set_pll_power_down(dp, 0);
398 
399     /* Enable Serdes FIFO function and Link symbol clock domain module */
400     reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_2);
401     reg &= ~(SERDES_FIFO_FUNC_EN_N | LS_CLK_DOMAIN_FUNC_EN_N | AUX_FUNC_EN_N);
402     analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_2, reg);
403     return 0;
404 }
405 
analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device * dp)406 void analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device *dp)
407 {
408     u32 reg;
409 
410     if (dp->hpd_gpiod) {
411         return;
412     }
413 
414     reg = HOTPLUG_CHG | HPD_LOST | PLUG;
415     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_STA_4, reg);
416 
417     reg = INT_HPD;
418     analogix_dp_write(dp, ANALOGIX_DP_INT_STA, reg);
419 }
420 
analogix_dp_init_hpd(struct analogix_dp_device * dp)421 void analogix_dp_init_hpd(struct analogix_dp_device *dp)
422 {
423     u32 reg;
424 
425     if (dp->hpd_gpiod) {
426         return;
427     }
428 
429     analogix_dp_clear_hotplug_interrupts(dp);
430 
431     reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_3);
432     reg &= ~(F_HPD | HPD_CTRL);
433     analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_3, reg);
434 }
435 
analogix_dp_force_hpd(struct analogix_dp_device * dp)436 void analogix_dp_force_hpd(struct analogix_dp_device *dp)
437 {
438     u32 reg;
439 
440     reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_3);
441     reg |= (F_HPD | HPD_CTRL);
442     analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_3, reg);
443 }
444 
analogix_dp_get_irq_type(struct analogix_dp_device * dp)445 enum dp_irq_type analogix_dp_get_irq_type(struct analogix_dp_device *dp)
446 {
447     u32 reg;
448 
449     /* Parse hotplug interrupt status register */
450     reg = analogix_dp_read(dp, ANALOGIX_DP_COMMON_INT_STA_4);
451     if (reg & PLUG) {
452         return DP_IRQ_TYPE_HP_CABLE_IN;
453     }
454 
455     if (reg & HPD_LOST) {
456         return DP_IRQ_TYPE_HP_CABLE_OUT;
457     }
458 
459     if (reg & HOTPLUG_CHG) {
460         return DP_IRQ_TYPE_HP_CHANGE;
461     }
462 
463     return DP_IRQ_TYPE_UNKNOWN;
464 }
465 
analogix_dp_reset_aux(struct analogix_dp_device * dp)466 void analogix_dp_reset_aux(struct analogix_dp_device *dp)
467 {
468     u32 reg;
469 
470     /* Disable AUX channel module */
471     reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_2);
472     reg |= AUX_FUNC_EN_N;
473     analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_2, reg);
474 }
475 
analogix_dp_init_aux(struct analogix_dp_device * dp)476 void analogix_dp_init_aux(struct analogix_dp_device *dp)
477 {
478     u32 reg;
479 
480     /* Clear inerrupts related to AUX channel */
481     reg = RPLY_RECEIV | AUX_ERR;
482     analogix_dp_write(dp, ANALOGIX_DP_INT_STA, reg);
483 
484     analogix_dp_set_analog_power_down(dp, AUX_BLOCK, true);
485     usleep_range(10, 11);
486     analogix_dp_set_analog_power_down(dp, AUX_BLOCK, false);
487 
488     analogix_dp_reset_aux(dp);
489 
490     /* AUX_BIT_PERIOD_EXPECTED_DELAY doesn't apply to Rockchip IP */
491     if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
492         reg = 0;
493     } else {
494         reg = AUX_BIT_PERIOD_EXPECTED_DELAY(3);
495     }
496 
497     /* Disable AUX transaction H/W retry */
498     reg |= AUX_HW_RETRY_COUNT_SEL(0) | AUX_HW_RETRY_INTERVAL_600_MICROSECONDS;
499 
500     analogix_dp_write(dp, ANALOGIX_DP_AUX_HW_RETRY_CTL, reg);
501 
502     /* Receive AUX Channel DEFER commands equal to DEFFER_COUNT*64 */
503     reg = DEFER_CTRL_EN | DEFER_COUNT(1);
504     analogix_dp_write(dp, ANALOGIX_DP_AUX_CH_DEFER_CTL, reg);
505 
506     /* Enable AUX channel module */
507     analogix_dp_enable_sw_function(dp);
508     reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_2);
509     reg &= ~AUX_FUNC_EN_N;
510     analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_2, reg);
511 }
512 
analogix_dp_get_plug_in_status(struct analogix_dp_device * dp)513 int analogix_dp_get_plug_in_status(struct analogix_dp_device *dp)
514 {
515     u32 reg;
516 
517     if (dp->hpd_gpiod) {
518         if (gpiod_get_value(dp->hpd_gpiod)) {
519             return 0;
520         }
521     } else {
522         reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_3);
523         if (reg & HPD_STATUS) {
524             return 0;
525         }
526     }
527 
528     return -EINVAL;
529 }
530 
analogix_dp_enable_sw_function(struct analogix_dp_device * dp)531 void analogix_dp_enable_sw_function(struct analogix_dp_device *dp)
532 {
533     u32 reg;
534 
535     reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_1);
536     reg &= ~SW_FUNC_EN_N;
537     analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_1, reg);
538 }
539 
analogix_dp_ssc_enable(struct analogix_dp_device * dp)540 static void analogix_dp_ssc_enable(struct analogix_dp_device *dp)
541 {
542     u32 reg;
543 
544     /* 4500ppm */
545     writel(0x19, dp->reg_base + ANALOIGX_DP_SSC_REG);
546     /*
547      * To apply updated SSC parameters into SSC operation,
548      * firmware must disable and enable this bit.
549      */
550     reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
551     reg |= SSC_FUNC_EN_N;
552     writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
553     reg &= ~SSC_FUNC_EN_N;
554     writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
555 }
556 
analogix_dp_ssc_disable(struct analogix_dp_device * dp)557 static void analogix_dp_ssc_disable(struct analogix_dp_device *dp)
558 {
559     u32 reg;
560 
561     reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
562     reg |= SSC_FUNC_EN_N;
563     writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
564 }
565 
analogix_dp_ssc_supported(struct analogix_dp_device * dp)566 bool analogix_dp_ssc_supported(struct analogix_dp_device *dp)
567 {
568     /* Check if SSC is supported by both sides */
569     return dp->plat_data->ssc && dp->link_train.ssc;
570 }
571 
analogix_dp_set_link_bandwidth(struct analogix_dp_device * dp,u32 bwtype)572 void analogix_dp_set_link_bandwidth(struct analogix_dp_device *dp, u32 bwtype)
573 {
574     u32 status;
575     int ret;
576 
577     analogix_dp_write(dp, ANALOGIX_DP_LINK_BW_SET, bwtype);
578 
579     if (dp->phy) {
580         union phy_configure_opts phy_cfg = {0};
581 
582         phy_cfg.dp.lanes = dp->link_train.lane_count;
583         phy_cfg.dp.link_rate = drm_dp_bw_code_to_link_rate(dp->link_train.link_rate) / 100;
584         phy_cfg.dp.ssc = analogix_dp_ssc_supported(dp);
585         phy_cfg.dp.set_lanes = false;
586         phy_cfg.dp.set_rate = true;
587         phy_cfg.dp.set_voltages = false;
588         ret = phy_configure(dp->phy, &phy_cfg);
589         if (ret && ret != -EOPNOTSUPP) {
590             dev_err(dp->dev, "%s: phy_configure failed: %d\n", __func__, ret);
591             return;
592         }
593     } else {
594         if (analogix_dp_ssc_supported(dp)) {
595             analogix_dp_ssc_enable(dp);
596         } else {
597             analogix_dp_ssc_disable(dp);
598         }
599     }
600 
601     ret = readx_poll_timeout(analogix_dp_get_pll_lock_status, dp, status, status != PLL_UNLOCKED, 120,
602                              120 * DP_TIMEOUT_LOOP_COUNT);
603     if (ret) {
604         dev_err(dp->dev, "Wait for pll lock failed %d\n", ret);
605         return;
606     }
607 }
608 
analogix_dp_get_link_bandwidth(struct analogix_dp_device * dp,u32 * bwtype)609 void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype)
610 {
611     u32 reg;
612 
613     reg = analogix_dp_read(dp, ANALOGIX_DP_LINK_BW_SET);
614     *bwtype = reg;
615 }
616 
analogix_dp_set_lane_count(struct analogix_dp_device * dp,u32 count)617 void analogix_dp_set_lane_count(struct analogix_dp_device *dp, u32 count)
618 {
619     u32 reg;
620     int ret;
621 
622     reg = count;
623     analogix_dp_write(dp, ANALOGIX_DP_LANE_COUNT_SET, reg);
624 
625     if (dp->phy) {
626         union phy_configure_opts phy_cfg = {0};
627 
628         phy_cfg.dp.lanes = dp->link_train.lane_count;
629         phy_cfg.dp.set_lanes = true;
630         phy_cfg.dp.set_rate = false;
631         phy_cfg.dp.set_voltages = false;
632         ret = phy_configure(dp->phy, &phy_cfg);
633         if (ret && ret != -EOPNOTSUPP) {
634             dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret);
635             return;
636         }
637     }
638 }
639 
analogix_dp_get_lane_count(struct analogix_dp_device * dp,u32 * count)640 void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count)
641 {
642     u32 reg;
643 
644     reg = analogix_dp_read(dp, ANALOGIX_DP_LANE_COUNT_SET);
645     *count = reg;
646 }
647 
analogix_dp_set_lane_link_training(struct analogix_dp_device * dp)648 void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp)
649 {
650     u8 lane;
651     int ret;
652 
653     for (lane = 0; lane < dp->link_train.lane_count; lane++) {
654         analogix_dp_write(dp, ANALOGIX_DP_LN0_LINK_TRAINING_CTL + 4 * lane, dp->link_train.training_lane[lane]);
655     }
656 
657     if (dp->phy) {
658         union phy_configure_opts phy_cfg = {0};
659 
660         for (lane = 0; lane < dp->link_train.lane_count; lane++) {
661             u8 training_lane = dp->link_train.training_lane[lane];
662             u8 vs, pe;
663 
664             vs = (training_lane & DP_TRAIN_VOLTAGE_SWING_MASK) >> DP_TRAIN_VOLTAGE_SWING_SHIFT;
665             pe = (training_lane & DP_TRAIN_PRE_EMPHASIS_MASK) >> DP_TRAIN_PRE_EMPHASIS_SHIFT;
666             phy_cfg.dp.voltage[lane] = vs;
667             phy_cfg.dp.pre[lane] = pe;
668         }
669 
670         phy_cfg.dp.lanes = dp->link_train.lane_count;
671         phy_cfg.dp.link_rate = drm_dp_bw_code_to_link_rate(dp->link_train.link_rate) / 100;
672         phy_cfg.dp.set_lanes = false;
673         phy_cfg.dp.set_rate = false;
674         phy_cfg.dp.set_voltages = true;
675         ret = phy_configure(dp->phy, &phy_cfg);
676         if (ret && ret != -EOPNOTSUPP) {
677             dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret);
678             return;
679         }
680     }
681 }
682 
analogix_dp_get_lane_link_training(struct analogix_dp_device * dp,u8 lane)683 u32 analogix_dp_get_lane_link_training(struct analogix_dp_device *dp, u8 lane)
684 {
685     return analogix_dp_read(dp, ANALOGIX_DP_LN0_LINK_TRAINING_CTL + 4 * lane);
686 }
687 
analogix_dp_enable_enhanced_mode(struct analogix_dp_device * dp,bool enable)688 void analogix_dp_enable_enhanced_mode(struct analogix_dp_device *dp, bool enable)
689 {
690     u32 reg;
691 
692     if (enable) {
693         reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_4);
694         reg |= ENHANCED;
695         analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_4, reg);
696     } else {
697         reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_4);
698         reg &= ~ENHANCED;
699         analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_4, reg);
700     }
701 }
702 
analogix_dp_set_training_pattern(struct analogix_dp_device * dp,enum pattern_set pattern)703 void analogix_dp_set_training_pattern(struct analogix_dp_device *dp, enum pattern_set pattern)
704 {
705     u32 reg;
706 
707     switch (pattern) {
708         case PRBS7:
709             reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_PRBS7;
710             analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
711             break;
712         case D10_2:
713             reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_D10_2;
714             analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
715             break;
716         case TRAINING_PTN1:
717             reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN1;
718             analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
719             break;
720         case TRAINING_PTN2:
721             reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN2;
722             analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
723             break;
724         case TRAINING_PTN3:
725             reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN3;
726             analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
727             break;
728         case DP_NONE:
729             reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_DISABLE | SW_TRAINING_PATTERN_SET_NORMAL;
730             analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
731             break;
732         default:
733             break;
734     }
735 }
736 
analogix_dp_reset_macro(struct analogix_dp_device * dp)737 void analogix_dp_reset_macro(struct analogix_dp_device *dp)
738 {
739     u32 reg;
740 
741     reg = analogix_dp_read(dp, ANALOGIX_DP_PHY_TEST);
742     reg |= MACRO_RST;
743     analogix_dp_write(dp, ANALOGIX_DP_PHY_TEST, reg);
744 
745     /* 10 us is the minimum reset time. */
746     usleep_range(10, 20);
747 
748     reg &= ~MACRO_RST;
749     analogix_dp_write(dp, ANALOGIX_DP_PHY_TEST, reg);
750 }
751 
analogix_dp_init_video(struct analogix_dp_device * dp)752 void analogix_dp_init_video(struct analogix_dp_device *dp)
753 {
754     u32 reg;
755 
756     reg = VSYNC_DET | VID_FORMAT_CHG | VID_CLK_CHG;
757     analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_STA_1, reg);
758 
759     reg = 0x0;
760     analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_1, reg);
761 
762     reg = CHA_CRI(4) | CHA_CTRL;
763     analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_2, reg);
764 
765     reg = 0x0;
766     analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_3, reg);
767 
768     reg = VID_HRES_TH(2) | VID_VRES_TH(0);
769     analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_8, reg);
770 }
771 
analogix_dp_set_video_color_format(struct analogix_dp_device * dp)772 void analogix_dp_set_video_color_format(struct analogix_dp_device *dp)
773 {
774     u32 reg;
775 
776     /* Configure the input color depth, color space, dynamic range */
777     reg = (dp->video_info.dynamic_range << IN_D_RANGE_SHIFT) | (dp->video_info.color_depth << IN_BPC_SHIFT) |
778           (dp->video_info.color_space << IN_COLOR_F_SHIFT);
779     analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_2, reg);
780 
781     /* Set Input Color YCbCr Coefficients to ITU601 or ITU709 */
782     reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_3);
783     reg &= ~IN_YC_COEFFI_MASK;
784     if (dp->video_info.ycbcr_coeff) {
785         reg |= IN_YC_COEFFI_ITU709;
786     } else {
787         reg |= IN_YC_COEFFI_ITU601;
788     }
789     analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_3, reg);
790 }
791 
analogix_dp_is_slave_video_stream_clock_on(struct analogix_dp_device * dp)792 int analogix_dp_is_slave_video_stream_clock_on(struct analogix_dp_device *dp)
793 {
794     u32 reg;
795 
796     reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_1);
797     analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_1, reg);
798 
799     reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_1);
800     if (!(reg & DET_STA)) {
801         dev_dbg(dp->dev, "Input stream clock not detected.\n");
802         return -EINVAL;
803     }
804 
805     reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_2);
806     analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_2, reg);
807 
808     reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_2);
809     dev_dbg(dp->dev, "wait SYS_CTL_2.\n");
810 
811     if (reg & CHA_STA) {
812         dev_dbg(dp->dev, "Input stream clk is changing\n");
813         return -EINVAL;
814     }
815 
816     return 0;
817 }
818 
analogix_dp_set_video_cr_mn(struct analogix_dp_device * dp,enum clock_recovery_m_value_type type,u32 m_value,u32 n_value)819 void analogix_dp_set_video_cr_mn(struct analogix_dp_device *dp, enum clock_recovery_m_value_type type, u32 m_value,
820                                  u32 n_value)
821 {
822     u32 reg;
823 
824     if (type == REGISTER_M) {
825         reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_4);
826         reg |= FIX_M_VID;
827         analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_4, reg);
828         reg = m_value & 0xff;
829         analogix_dp_write(dp, ANALOGIX_DP_M_VID_0, reg);
830         reg = (m_value >> 8) & 0xff;
831         analogix_dp_write(dp, ANALOGIX_DP_M_VID_1, reg);
832         reg = (m_value >> 16) & 0xff;
833         analogix_dp_write(dp, ANALOGIX_DP_M_VID_2, reg);
834 
835         reg = n_value & 0xff;
836         analogix_dp_write(dp, ANALOGIX_DP_N_VID_0, reg);
837         reg = (n_value >> 8) & 0xff;
838         analogix_dp_write(dp, ANALOGIX_DP_N_VID_1, reg);
839         reg = (n_value >> 16) & 0xff;
840         analogix_dp_write(dp, ANALOGIX_DP_N_VID_2, reg);
841     } else {
842         reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_4);
843         reg &= ~FIX_M_VID;
844         analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_4, reg);
845 
846         analogix_dp_write(dp, ANALOGIX_DP_N_VID_0, 0x00);
847         analogix_dp_write(dp, ANALOGIX_DP_N_VID_1, 0x80);
848         analogix_dp_write(dp, ANALOGIX_DP_N_VID_2, 0x00);
849     }
850 }
851 
analogix_dp_set_video_timing_mode(struct analogix_dp_device * dp,u32 type)852 void analogix_dp_set_video_timing_mode(struct analogix_dp_device *dp, u32 type)
853 {
854     u32 reg;
855 
856     if (type == VIDEO_TIMING_FROM_CAPTURE) {
857         reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_10);
858         reg &= ~FORMAT_SEL;
859         analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_10, reg);
860     } else {
861         reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_10);
862         reg |= FORMAT_SEL;
863         analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_10, reg);
864     }
865 }
866 
analogix_dp_enable_video_master(struct analogix_dp_device * dp,bool enable)867 void analogix_dp_enable_video_master(struct analogix_dp_device *dp, bool enable)
868 {
869     u32 reg;
870 
871     if (enable) {
872         reg = analogix_dp_read(dp, ANALOGIX_DP_SOC_GENERAL_CTL);
873         reg &= ~VIDEO_MODE_MASK;
874         reg |= VIDEO_MASTER_MODE_EN | VIDEO_MODE_MASTER_MODE;
875         analogix_dp_write(dp, ANALOGIX_DP_SOC_GENERAL_CTL, reg);
876     } else {
877         reg = analogix_dp_read(dp, ANALOGIX_DP_SOC_GENERAL_CTL);
878         reg &= ~VIDEO_MODE_MASK;
879         reg |= VIDEO_MODE_SLAVE_MODE;
880         analogix_dp_write(dp, ANALOGIX_DP_SOC_GENERAL_CTL, reg);
881     }
882 }
883 
analogix_dp_start_video(struct analogix_dp_device * dp)884 void analogix_dp_start_video(struct analogix_dp_device *dp)
885 {
886     u32 reg;
887 
888     reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_1);
889     reg |= VIDEO_EN;
890     analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_1, reg);
891 }
892 
analogix_dp_is_video_stream_on(struct analogix_dp_device * dp)893 int analogix_dp_is_video_stream_on(struct analogix_dp_device *dp)
894 {
895     u32 reg;
896 
897     reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_3);
898     analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_3, reg);
899 
900     reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_3);
901     if (!(reg & STRM_VALID)) {
902         dev_dbg(dp->dev, "Input video stream is not detected.\n");
903         return -EINVAL;
904     }
905 
906     return 0;
907 }
908 
analogix_dp_config_video_slave_mode(struct analogix_dp_device * dp)909 void analogix_dp_config_video_slave_mode(struct analogix_dp_device *dp)
910 {
911     u32 reg;
912 
913     reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_1);
914     if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
915         reg &= ~(RK_VID_CAP_FUNC_EN_N | RK_VID_FIFO_FUNC_EN_N);
916     } else {
917         reg &= ~(MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N);
918         reg |= MASTER_VID_FUNC_EN_N;
919     }
920     analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_1, reg);
921 
922     reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_10);
923     reg &= ~INTERACE_SCAN_CFG;
924     reg |= (dp->video_info.interlaced << 2);
925     analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_10, reg);
926 
927     reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_10);
928     reg &= ~VSYNC_POLARITY_CFG;
929     reg |= (dp->video_info.v_sync_polarity << 1);
930     analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_10, reg);
931 
932     reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_10);
933     reg &= ~HSYNC_POLARITY_CFG;
934     reg |= (dp->video_info.h_sync_polarity << 0);
935     analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_10, reg);
936 
937     reg = AUDIO_MODE_SPDIF_MODE | VIDEO_MODE_SLAVE_MODE;
938     analogix_dp_write(dp, ANALOGIX_DP_SOC_GENERAL_CTL, reg);
939 }
940 
analogix_dp_enable_scrambling(struct analogix_dp_device * dp)941 void analogix_dp_enable_scrambling(struct analogix_dp_device *dp)
942 {
943     u32 reg;
944 
945     reg = analogix_dp_read(dp, ANALOGIX_DP_TRAINING_PTN_SET);
946     reg &= ~SCRAMBLING_DISABLE;
947     analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
948 }
949 
analogix_dp_disable_scrambling(struct analogix_dp_device * dp)950 void analogix_dp_disable_scrambling(struct analogix_dp_device *dp)
951 {
952     u32 reg;
953 
954     reg = analogix_dp_read(dp, ANALOGIX_DP_TRAINING_PTN_SET);
955     reg |= SCRAMBLING_DISABLE;
956     analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
957 }
958 
analogix_dp_enable_psr_crc(struct analogix_dp_device * dp)959 void analogix_dp_enable_psr_crc(struct analogix_dp_device *dp)
960 {
961     analogix_dp_write(dp, ANALOGIX_DP_CRC_CON, PSR_VID_CRC_ENABLE);
962 }
963 
analogix_dp_get_psr_status(struct analogix_dp_device * dp)964 static ssize_t analogix_dp_get_psr_status(struct analogix_dp_device *dp)
965 {
966     ssize_t val;
967     u8 status;
968 
969     val = drm_dp_dpcd_readb(&dp->aux, DP_PSR_STATUS, &status);
970     if (val < 0) {
971         dev_err(dp->dev, "PSR_STATUS read failed ret=%zd", val);
972         return val;
973     }
974     return status;
975 }
976 
analogix_dp_send_psr_spd(struct analogix_dp_device * dp,struct dp_sdp * vsc,bool blocking)977 int analogix_dp_send_psr_spd(struct analogix_dp_device *dp, struct dp_sdp *vsc, bool blocking)
978 {
979     unsigned int val;
980     int ret;
981     ssize_t psr_status;
982 
983     /* don't send info frame */
984     val = analogix_dp_read(dp, ANALOGIX_DP_PKT_SEND_CTL);
985     val &= ~IF_EN;
986     analogix_dp_write(dp, ANALOGIX_DP_PKT_SEND_CTL, val);
987 
988     /* configure single frame update mode */
989     analogix_dp_write(dp, ANALOGIX_DP_PSR_FRAME_UPDATE_CTRL, PSR_FRAME_UP_TYPE_BURST | PSR_CRC_SEL_HARDWARE);
990 
991     /* configure VSC HB0~HB3 */
992     analogix_dp_write(dp, ANALOGIX_DP_SPD_HB0, vsc->sdp_header.HB0);
993     analogix_dp_write(dp, ANALOGIX_DP_SPD_HB1, vsc->sdp_header.HB1);
994     analogix_dp_write(dp, ANALOGIX_DP_SPD_HB2, vsc->sdp_header.HB2);
995     analogix_dp_write(dp, ANALOGIX_DP_SPD_HB3, vsc->sdp_header.HB3);
996 
997     /* configure reused VSC PB0~PB3, magic number from vendor */
998     analogix_dp_write(dp, ANALOGIX_DP_SPD_PB0, 0x00);
999     analogix_dp_write(dp, ANALOGIX_DP_SPD_PB1, 0x16);
1000     analogix_dp_write(dp, ANALOGIX_DP_SPD_PB2, 0xCE);
1001     analogix_dp_write(dp, ANALOGIX_DP_SPD_PB3, 0x5D);
1002 
1003     /* configure DB0 / DB1 values */
1004     analogix_dp_write(dp, ANALOGIX_DP_VSC_SHADOW_DB0, vsc->db[0]);
1005     analogix_dp_write(dp, ANALOGIX_DP_VSC_SHADOW_DB1, vsc->db[1]);
1006 
1007     /* set reuse spd inforframe */
1008     val = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_3);
1009     val |= REUSE_SPD_EN;
1010     analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_3, val);
1011 
1012     /* mark info frame update */
1013     val = analogix_dp_read(dp, ANALOGIX_DP_PKT_SEND_CTL);
1014     val = (val | IF_UP) & ~IF_EN;
1015     analogix_dp_write(dp, ANALOGIX_DP_PKT_SEND_CTL, val);
1016 
1017     /* send info frame */
1018     val = analogix_dp_read(dp, ANALOGIX_DP_PKT_SEND_CTL);
1019     val |= IF_EN;
1020     analogix_dp_write(dp, ANALOGIX_DP_PKT_SEND_CTL, val);
1021 
1022     if (!blocking) {
1023         return 0;
1024     }
1025 
1026     ret = readx_poll_timeout(analogix_dp_get_psr_status, dp, psr_status,
1027                              psr_status >= 0 && ((vsc->db[1] && psr_status == DP_PSR_SINK_ACTIVE_RFB) ||
1028                                                  (!vsc->db[1] && psr_status == DP_PSR_SINK_INACTIVE)),
1029                              1500, DP_TIMEOUT_PSR_LOOP_MS * 1000);
1030     if (ret) {
1031         dev_warn(dp->dev, "Failed to apply PSR %d\n", ret);
1032         return ret;
1033     }
1034     return 0;
1035 }
1036 
analogix_dp_phy_power_on(struct analogix_dp_device * dp)1037 void analogix_dp_phy_power_on(struct analogix_dp_device *dp)
1038 {
1039     if (dp->phy_enabled) {
1040         return;
1041     }
1042 
1043     phy_set_mode(dp->phy, PHY_MODE_DP);
1044     phy_power_on(dp->phy);
1045 
1046     dp->phy_enabled = true;
1047 }
1048 
analogix_dp_phy_power_off(struct analogix_dp_device * dp)1049 void analogix_dp_phy_power_off(struct analogix_dp_device *dp)
1050 {
1051     if (!dp->phy_enabled) {
1052         return;
1053     }
1054 
1055     phy_power_off(dp->phy);
1056 
1057     dp->phy_enabled = false;
1058 }
1059 
1060 enum {
1061     AUX_STATUS_OK,
1062     AUX_STATUS_NACK_ERROR,
1063     AUX_STATUS_TIMEOUT_ERROR,
1064     AUX_STATUS_UNKNOWN_ERROR,
1065     AUX_STATUS_MUCH_DEFER_ERROR,
1066     AUX_STATUS_TX_SHORT_ERROR,
1067     AUX_STATUS_RX_SHORT_ERROR,
1068     AUX_STATUS_NACK_WITHOUT_M_ERROR,
1069     AUX_STATUS_I2C_NACK_ERROR
1070 };
1071 
analogix_dp_transfer(struct analogix_dp_device * dp,struct drm_dp_aux_msg * msg)1072 ssize_t analogix_dp_transfer(struct analogix_dp_device *dp, struct drm_dp_aux_msg *msg)
1073 {
1074     u32 reg;
1075     u8 *buffer = msg->buffer;
1076     unsigned int i;
1077     int num_transferred = 0;
1078     int ret;
1079 
1080     /* Buffer size of AUX CH is 16 bytes */
1081     if (WARN_ON(msg->size > 16)) {
1082         return -E2BIG;
1083     }
1084 
1085     reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_2);
1086     if (reg & AUX_FUNC_EN_N) {
1087         analogix_dp_phy_power_on(dp);
1088         analogix_dp_init_aux(dp);
1089     }
1090 
1091     /* Clear AUX CH data buffer */
1092     reg = BUF_CLR;
1093     analogix_dp_write(dp, ANALOGIX_DP_BUFFER_DATA_CTL, reg);
1094 
1095     switch (msg->request & ~DP_AUX_I2C_MOT) {
1096         case DP_AUX_I2C_WRITE:
1097             reg = AUX_TX_COMM_WRITE | AUX_TX_COMM_I2C_TRANSACTION;
1098             if (msg->request & DP_AUX_I2C_MOT) {
1099                 reg |= AUX_TX_COMM_MOT;
1100             }
1101             break;
1102 
1103         case DP_AUX_I2C_READ:
1104             reg = AUX_TX_COMM_READ | AUX_TX_COMM_I2C_TRANSACTION;
1105             if (msg->request & DP_AUX_I2C_MOT) {
1106                 reg |= AUX_TX_COMM_MOT;
1107             }
1108             break;
1109 
1110         case DP_AUX_NATIVE_WRITE:
1111             reg = AUX_TX_COMM_WRITE | AUX_TX_COMM_DP_TRANSACTION;
1112             break;
1113 
1114         case DP_AUX_NATIVE_READ:
1115             reg = AUX_TX_COMM_READ | AUX_TX_COMM_DP_TRANSACTION;
1116             break;
1117 
1118         default:
1119             return -EINVAL;
1120     }
1121 
1122     reg |= AUX_LENGTH(msg->size);
1123     analogix_dp_write(dp, ANALOGIX_DP_AUX_CH_CTL_1, reg);
1124 
1125     /* Select DPCD device address */
1126     reg = AUX_ADDR_7_0(msg->address);
1127     analogix_dp_write(dp, ANALOGIX_DP_AUX_ADDR_7_0, reg);
1128     reg = AUX_ADDR_15_8(msg->address);
1129     analogix_dp_write(dp, ANALOGIX_DP_AUX_ADDR_15_8, reg);
1130     reg = AUX_ADDR_19_16(msg->address);
1131     analogix_dp_write(dp, ANALOGIX_DP_AUX_ADDR_19_16, reg);
1132 
1133     if (!(msg->request & DP_AUX_I2C_READ)) {
1134         for (i = 0; i < msg->size; i++) {
1135             reg = buffer[i];
1136             analogix_dp_write(dp, ANALOGIX_DP_BUF_DATA_0 + 0x4 * i, reg);
1137             num_transferred++;
1138         }
1139     }
1140 
1141     /* Enable AUX CH operation */
1142     reg = AUX_EN;
1143 
1144     /* Zero-sized messages specify address-only transactions. */
1145     if (msg->size < 1) {
1146         reg |= ADDR_ONLY;
1147     }
1148 
1149     analogix_dp_write(dp, ANALOGIX_DP_AUX_CH_CTL_2, reg);
1150 
1151     ret = readx_poll_timeout(readl, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2, reg, !(reg & AUX_EN), 0x19, 0x7a120);
1152     if (ret) {
1153         dev_err(dp->dev, "AUX CH enable timeout!\n");
1154         goto aux_error;
1155     }
1156 
1157     /* Wait for an interrupt instead of looping? */
1158     /* Is AUX CH command reply received? */
1159     ret = readx_poll_timeout(readl, dp->reg_base + ANALOGIX_DP_INT_STA, reg, reg & RPLY_RECEIV, 0xa, 0x4e20);
1160     if (ret) {
1161         dev_err(dp->dev, "AUX CH cmd reply timeout!\n");
1162         goto aux_error;
1163     }
1164 
1165     /* Clear interrupt source for AUX CH command reply */
1166     analogix_dp_write(dp, ANALOGIX_DP_INT_STA, RPLY_RECEIV);
1167 
1168     reg = analogix_dp_read(dp, ANALOGIX_DP_AUX_CH_STA);
1169     if ((reg & AUX_STATUS_MASK) == AUX_STATUS_TIMEOUT_ERROR) {
1170         return -ETIMEDOUT;
1171     }
1172 
1173     if (msg->request & DP_AUX_I2C_READ) {
1174         size_t buf_data_count;
1175 
1176         reg = analogix_dp_read(dp, ANALOGIX_DP_BUFFER_DATA_CTL);
1177         buf_data_count = BUF_DATA_COUNT(reg);
1178         if (buf_data_count != msg->size) {
1179             return -EBUSY;
1180         }
1181 
1182         for (i = 0; i < msg->size; i++) {
1183             reg = analogix_dp_read(dp, ANALOGIX_DP_BUF_DATA_0 + 0x4 * i);
1184             buffer[i] = (unsigned char)reg;
1185             num_transferred++;
1186         }
1187     }
1188 
1189     /* Check if Rx sends defer */
1190     reg = analogix_dp_read(dp, ANALOGIX_DP_AUX_RX_COMM);
1191     if (reg == AUX_RX_COMM_AUX_DEFER) {
1192         msg->reply = DP_AUX_NATIVE_REPLY_DEFER;
1193     } else if (reg == AUX_RX_COMM_I2C_DEFER) {
1194         msg->reply = DP_AUX_I2C_REPLY_DEFER;
1195     } else if ((msg->request & ~DP_AUX_I2C_MOT) == DP_AUX_I2C_WRITE ||
1196                (msg->request & ~DP_AUX_I2C_MOT) == DP_AUX_I2C_READ) {
1197         msg->reply = DP_AUX_I2C_REPLY_ACK;
1198     } else if ((msg->request & ~DP_AUX_I2C_MOT) == DP_AUX_NATIVE_WRITE ||
1199                (msg->request & ~DP_AUX_I2C_MOT) == DP_AUX_NATIVE_READ) {
1200         msg->reply = DP_AUX_NATIVE_REPLY_ACK;
1201     }
1202 
1203     return (num_transferred == msg->size) ? num_transferred : -EBUSY;
1204 
1205 aux_error:
1206     /* if aux err happen, reset aux */
1207     analogix_dp_init_aux(dp);
1208 
1209     return -EREMOTEIO;
1210 }
1211 
analogix_dp_set_video_format(struct analogix_dp_device * dp)1212 void analogix_dp_set_video_format(struct analogix_dp_device *dp)
1213 {
1214     struct video_info *video = &dp->video_info;
1215     const struct drm_display_mode *mode = &video->mode;
1216     unsigned int hsw, hfp, hbp, vsw, vfp, vbp;
1217 
1218     hsw = mode->hsync_end - mode->hsync_start;
1219     hfp = mode->hsync_start - mode->hdisplay;
1220     hbp = mode->htotal - mode->hsync_end;
1221     vsw = mode->vsync_end - mode->vsync_start;
1222     vfp = mode->vsync_start - mode->vdisplay;
1223     vbp = mode->vtotal - mode->vsync_end;
1224 
1225     /* Set Video Format Parameters */
1226     analogix_dp_write(dp, ANALOGIX_DP_TOTAL_LINE_CFG_L, TOTAL_LINE_CFG_L(mode->vtotal));
1227     analogix_dp_write(dp, ANALOGIX_DP_TOTAL_LINE_CFG_H, TOTAL_LINE_CFG_H(mode->vtotal >> 0x8));
1228     analogix_dp_write(dp, ANALOGIX_DP_ACTIVE_LINE_CFG_L, ACTIVE_LINE_CFG_L(mode->vdisplay));
1229     analogix_dp_write(dp, ANALOGIX_DP_ACTIVE_LINE_CFG_H, ACTIVE_LINE_CFG_H(mode->vdisplay >> 0x8));
1230     analogix_dp_write(dp, ANALOGIX_DP_V_F_PORCH_CFG, V_F_PORCH_CFG(vfp));
1231     analogix_dp_write(dp, ANALOGIX_DP_V_SYNC_WIDTH_CFG, V_SYNC_WIDTH_CFG(vsw));
1232     analogix_dp_write(dp, ANALOGIX_DP_V_B_PORCH_CFG, V_B_PORCH_CFG(vbp));
1233     analogix_dp_write(dp, ANALOGIX_DP_TOTAL_PIXEL_CFG_L, TOTAL_PIXEL_CFG_L(mode->htotal));
1234     analogix_dp_write(dp, ANALOGIX_DP_TOTAL_PIXEL_CFG_H, TOTAL_PIXEL_CFG_H(mode->htotal >> 0x8));
1235     analogix_dp_write(dp, ANALOGIX_DP_ACTIVE_PIXEL_CFG_L, ACTIVE_PIXEL_CFG_L(mode->hdisplay));
1236     analogix_dp_write(dp, ANALOGIX_DP_ACTIVE_PIXEL_CFG_H, ACTIVE_PIXEL_CFG_H(mode->hdisplay >> 0x8));
1237     analogix_dp_write(dp, ANALOGIX_DP_H_F_PORCH_CFG_L, H_F_PORCH_CFG_L(hfp));
1238     analogix_dp_write(dp, ANALOGIX_DP_H_F_PORCH_CFG_H, H_F_PORCH_CFG_H(hfp >> 0x8));
1239     analogix_dp_write(dp, ANALOGIX_DP_H_SYNC_CFG_L, H_SYNC_CFG_L(hsw));
1240     analogix_dp_write(dp, ANALOGIX_DP_H_SYNC_CFG_H, H_SYNC_CFG_H(hsw >> 0x8));
1241     analogix_dp_write(dp, ANALOGIX_DP_H_B_PORCH_CFG_L, H_B_PORCH_CFG_L(hbp));
1242     analogix_dp_write(dp, ANALOGIX_DP_H_B_PORCH_CFG_H, H_B_PORCH_CFG_H(hbp >> 0x8));
1243 }
1244 
analogix_dp_video_bist_enable(struct analogix_dp_device * dp)1245 void analogix_dp_video_bist_enable(struct analogix_dp_device *dp)
1246 {
1247     u32 reg;
1248 
1249     /* Enable Video BIST */
1250     analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_4, BIST_EN);
1251 
1252     /*
1253      * Note that if BIST_EN is set to 1, F_SEL must be cleared to 0
1254      * although video format information comes from registers set by user.
1255      */
1256     reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_10);
1257     reg &= ~FORMAT_SEL;
1258     analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_10, reg);
1259 }
1260 
analogix_dp_audio_config_i2s(struct analogix_dp_device * dp)1261 void analogix_dp_audio_config_i2s(struct analogix_dp_device *dp)
1262 {
1263     u32 reg;
1264 
1265     reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_4);
1266     reg &= ~FIX_M_AUD;
1267     analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_4, reg);
1268 
1269     reg = analogix_dp_read(dp, ANALOGIX_DP_I2S_CTRL);
1270     reg |= I2S_EN;
1271     analogix_dp_write(dp, ANALOGIX_DP_I2S_CTRL, reg);
1272 }
1273 
analogix_dp_audio_config_spdif(struct analogix_dp_device * dp)1274 void analogix_dp_audio_config_spdif(struct analogix_dp_device *dp)
1275 {
1276     u32 reg;
1277 
1278     reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_4);
1279     reg &= ~FIX_M_AUD;
1280     analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_4, reg);
1281 
1282     reg = analogix_dp_read(dp, ANALOGIX_DP_SPDIF_AUDIO_CTL_0);
1283     reg |= AUD_SPDIF_EN;
1284     analogix_dp_write(dp, ANALOGIX_DP_SPDIF_AUDIO_CTL_0, reg);
1285 }
1286 
analogix_dp_audio_enable(struct analogix_dp_device * dp)1287 void analogix_dp_audio_enable(struct analogix_dp_device *dp)
1288 {
1289     u32 reg;
1290 
1291     reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_1);
1292     reg &= ~(AUD_FIFO_FUNC_EN_N | AUD_FUNC_EN_N);
1293     analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_1, reg);
1294 
1295     reg = analogix_dp_read(dp, ANALOGIX_DP_AUD_CTL);
1296     reg |= MISC_CTRL_RESET | DP_AUDIO_EN;
1297     analogix_dp_write(dp, ANALOGIX_DP_AUD_CTL, reg);
1298 }
1299 
analogix_dp_audio_disable(struct analogix_dp_device * dp)1300 void analogix_dp_audio_disable(struct analogix_dp_device *dp)
1301 {
1302     u32 reg;
1303 
1304     analogix_dp_write(dp, ANALOGIX_DP_AUD_CTL, 0);
1305 
1306     reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_1);
1307     reg |= AUD_FIFO_FUNC_EN_N | AUD_FUNC_EN_N;
1308     analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_1, reg);
1309 }
1310