1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd
4 */
5
6 #include <linux/clk.h>
7 #include <linux/component.h>
8 #include <linux/iopoll.h>
9 #include <linux/math64.h>
10 #include <linux/module.h>
11 #include <linux/of_device.h>
12 #include <linux/phy/phy.h>
13 #include <linux/pm_runtime.h>
14 #include <linux/regmap.h>
15 #include <linux/reset.h>
16 #include <linux/mfd/syscon.h>
17 #include <drm/drm_atomic_helper.h>
18 #include <drm/drm_crtc.h>
19 #include <drm/drm_crtc_helper.h>
20 #include <drm/drm_mipi_dsi.h>
21 #include <drm/drm_of.h>
22 #include <drm/drm_panel.h>
23 #include <drm/drmP.h>
24 #include <uapi/linux/videodev2.h>
25 #include <video/mipi_display.h>
26 #include <asm/unaligned.h>
27
28 #include "rockchip_drm_drv.h"
29 #include "rockchip_drm_vop.h"
30 #include "rockchip-mipi-csi-tx.h"
31
32 #define DSI_PHY_TMR_LPCLK_CFG 0x98
33 #define PHY_CLKHS2LP_TIME(lbcc) (((lbcc) & 0x3ff) << 16)
34 #define PHY_CLKLP2HS_TIME(lbcc) ((lbcc) & 0x3ff)
35
36 #define DSI_PHY_TMR_CFG 0x9c
37 #define PHY_HS2LP_TIME(lbcc) (((lbcc) & 0xff) << 24)
38 #define PHY_LP2HS_TIME(lbcc) (((lbcc) & 0xff) << 16)
39 #define MAX_RD_TIME(lbcc) ((lbcc) & 0x7fff)
40
41 #define DSI_PHY_RSTZ 0xa0
42 #define PHY_DISFORCEPLL 0
43 #define PHY_ENFORCEPLL BIT(3)
44 #define PHY_DISABLECLK 0
45 #define PHY_ENABLECLK BIT(2)
46 #define PHY_RSTZ 0
47 #define PHY_UNRSTZ BIT(1)
48 #define PHY_SHUTDOWNZ 0
49 #define PHY_UNSHUTDOWNZ BIT(0)
50 #define DSI_PHY_TST_CTRL0 0xb4
51 #define PHY_TESTCLK BIT(1)
52 #define PHY_UNTESTCLK 0
53 #define PHY_TESTCLR BIT(0)
54 #define PHY_UNTESTCLR 0
55
56 #define DSI_PHY_TST_CTRL1 0xb8
57 #define PHY_TESTEN BIT(16)
58 #define PHY_UNTESTEN 0
59 #define PHY_TESTDOUT(n) (((n) & 0xff) << 8)
60 #define PHY_TESTDIN(n) (((n) & 0xff) << 0)
61 #define BYPASS_VCO_RANGE BIT(7)
62 #define VCO_RANGE_CON_SEL(val) (((val) & 0x7) << 3)
63 #define VCO_IN_CAP_CON_DEFAULT (0x0 << 1)
64 #define VCO_IN_CAP_CON_LOW (0x1 << 1)
65 #define VCO_IN_CAP_CON_HIGH (0x2 << 1)
66 #define REF_BIAS_CUR_SEL BIT(0)
67
68 #define CP_CURRENT_3MA BIT(3)
69 #define CP_PROGRAM_EN BIT(7)
70 #define LPF_PROGRAM_EN BIT(6)
71 #define LPF_RESISTORS_20_KOHM 0
72 #define HSFREQRANGE_SEL(val) (((val) & 0x3f) << 1)
73
74 #define INPUT_DIVIDER(val) (((val) - 1) & 0x7f)
75 #define LOW_PROGRAM_EN 0
76 #define HIGH_PROGRAM_EN BIT(7)
77 #define LOOP_DIV_LOW_SEL(val) (((val) - 1) & 0x1f)
78 #define LOOP_DIV_HIGH_SEL(val) ((((val) - 1) >> 5) & 0x1f)
79 #define PLL_LOOP_DIV_EN BIT(5)
80 #define PLL_INPUT_DIV_EN BIT(4)
81
82 #define POWER_CONTROL BIT(6)
83 #define INTERNAL_REG_CURRENT BIT(3)
84 #define BIAS_BLOCK_ON BIT(2)
85 #define BANDGAP_ON BIT(0)
86
87 #define TER_RESISTOR_HIGH BIT(7)
88 #define TER_RESISTOR_LOW 0
89 #define LEVEL_SHIFTERS_ON BIT(6)
90 #define TER_CAL_DONE BIT(5)
91 #define SETRD_MAX (0x7 << 2)
92 #define POWER_MANAGE BIT(1)
93 #define TER_RESISTORS_ON BIT(0)
94
95 #define BIASEXTR_SEL(val) ((val) & 0x7)
96 #define BANDGAP_SEL(val) ((val) & 0x7)
97 #define TLP_PROGRAM_EN BIT(7)
98 #define THS_PRE_PROGRAM_EN BIT(7)
99 #define THS_ZERO_PROGRAM_EN BIT(6)
100
101 #define FPGA_DSI_PHY_TST_READ 0x18
102 #define FPGA_DSI_PHY_TST_CTRL0 0x20
103
104 /* #define FPGA_PLATFORM_TEST 1 */
105
106 struct dphy_pll_testdin_map {
107 unsigned int max_mbps;
108 u8 testdin;
109 };
110
111 /* The table is based on 27MHz DPHY pll reference clock. */
112 static const struct dphy_pll_testdin_map dp_tdin_map[] = {
113 { 90, 0x00}, { 100, 0x10}, { 110, 0x20}, { 130, 0x01},
114 { 140, 0x11}, { 150, 0x21}, { 170, 0x02}, { 180, 0x12},
115 { 200, 0x22}, { 220, 0x03}, { 240, 0x13}, { 250, 0x23},
116 { 270, 0x04}, { 300, 0x14}, { 330, 0x05}, { 360, 0x15},
117 { 400, 0x25}, { 450, 0x06}, { 500, 0x16}, { 550, 0x07},
118 { 600, 0x17}, { 650, 0x08}, { 700, 0x18}, { 750, 0x09},
119 { 800, 0x19}, { 850, 0x29}, { 900, 0x39}, { 950, 0x0a},
120 {1000, 0x1a}, {1050, 0x2a}, {1100, 0x3a}, {1150, 0x0b},
121 {1200, 0x1b}, {1250, 0x2b}, {1300, 0x3b}, {1350, 0x0c},
122 {1400, 0x1c}, {1450, 0x2c}, {1500, 0x3c}
123 };
124
125 enum {
126 BANDGAP_97_07,
127 BANDGAP_98_05,
128 BANDGAP_99_02,
129 BANDGAP_100_00,
130 BANDGAP_93_17,
131 BANDGAP_94_15,
132 BANDGAP_95_12,
133 BANDGAP_96_10,
134 };
135
136 enum {
137 BIASEXTR_87_1,
138 BIASEXTR_91_5,
139 BIASEXTR_95_9,
140 BIASEXTR_100,
141 BIASEXTR_105_94,
142 BIASEXTR_111_88,
143 BIASEXTR_118_8,
144 BIASEXTR_127_7,
145 };
146
147 static const char * const csi_tx_intr[] = {
148 "RX frame start interrupt status!",
149 "RX frame end interrupt status!",
150 "RX line end interrupt status!",
151 "TX frame start interrupt status!",
152 "TX frame end interrupt status!",
153 "TX line end interrupt status!",
154 "Line flag0 interrupt status!",
155 "Line flag1 interrupt status!",
156 "PHY stopstate interrupt status!",
157 "PHY PLL lock interrupt status!",
158 "CSITX idle interrupt status!"
159 };
160
161 static const char * const csi_tx_err_intr[] = {
162 "IDI header fifo overflow raw interrupt!",
163 "IDI header fifo underflow raw interrupt!",
164 "IDI payload fifo overflow raw interrupt!",
165 "IDI payload fifo underflow raw interrupt!",
166 "Header fifo overflow raw interrupt!",
167 "Header fifo underflow raw interrupt!",
168 "Payload fifo overflow raw interrupt!",
169 "Payload fifo underflow raw interrupt!",
170 "Output fifo overflow raw interrupt!",
171 "Output fifo underflow raw interrupt!",
172 "Txreadyhs error0 raw interrupt!",
173 "Txreadyhs error1 raw interrupt!"
174 };
175
176 static void
grf_field_write(struct rockchip_mipi_csi * csi,enum grf_reg_fields index,unsigned int val)177 grf_field_write(struct rockchip_mipi_csi *csi, enum grf_reg_fields index,
178 unsigned int val)
179 {
180 const u32 field = csi->pdata->csi0_grf_reg_fields[index];
181 u16 reg;
182 u8 msb, lsb;
183
184 if (!field || !csi->grf)
185 return;
186
187 reg = (field >> 16) & 0xffff;
188 lsb = (field >> 8) & 0xff;
189 msb = (field >> 0) & 0xff;
190
191 regmap_write(csi->grf, reg, (val << lsb) | (GENMASK(msb, lsb) << 16));
192 }
193
csi_writel(struct rockchip_mipi_csi * csi,u32 offset,u32 v)194 static inline void csi_writel(struct rockchip_mipi_csi *csi, u32 offset, u32 v)
195 {
196 writel(v, csi->regs + offset);
197 csi->regsbak[offset >> 2] = v;
198 }
199
csi_readl(struct rockchip_mipi_csi * csi,u32 offset)200 static inline u32 csi_readl(struct rockchip_mipi_csi *csi, u32 offset)
201 {
202 return readl(csi->regs + offset);
203 }
204
csi_mask_write(struct rockchip_mipi_csi * csi,u32 offset,u32 mask,u32 val,bool regbak)205 static inline void csi_mask_write(struct rockchip_mipi_csi *csi, u32 offset,
206 u32 mask, u32 val, bool regbak)
207 {
208 u32 v;
209 u32 cached_val = csi->regsbak[offset >> 2];
210
211 v = (cached_val & ~(mask)) | val;
212
213 if (regbak)
214 csi_writel(csi, offset, v);
215 else
216 writel(v, csi->regs + offset);
217 }
218
phy_max_mbps_to_testdin(unsigned int max_mbps)219 static int phy_max_mbps_to_testdin(unsigned int max_mbps)
220 {
221 unsigned int i;
222
223 for (i = 0; i < ARRAY_SIZE(dp_tdin_map); i++)
224 if (dp_tdin_map[i].max_mbps > max_mbps)
225 return dp_tdin_map[i].testdin;
226
227 return -EINVAL;
228 }
229
host_to_csi(struct mipi_dsi_host * host)230 static inline struct rockchip_mipi_csi *host_to_csi(struct mipi_dsi_host *host)
231 {
232 return container_of(host, struct rockchip_mipi_csi, dsi_host);
233 }
234
con_to_csi(struct drm_connector * con)235 static inline struct rockchip_mipi_csi *con_to_csi(struct drm_connector *con)
236 {
237 return container_of(con, struct rockchip_mipi_csi, connector);
238 }
239
240 static inline
encoder_to_csi(struct drm_encoder * encoder)241 struct rockchip_mipi_csi *encoder_to_csi(struct drm_encoder *encoder)
242 {
243 return container_of(encoder, struct rockchip_mipi_csi, encoder);
244 }
245
rockchip_mipi_csi_phy_write(struct rockchip_mipi_csi * csi,u8 test_code,u8 test_data)246 static void rockchip_mipi_csi_phy_write(struct rockchip_mipi_csi *csi,
247 u8 test_code, u8 test_data)
248 {
249 /*
250 * With the falling edge on TESTCLK, the TESTDIN[7:0] signal content
251 * is latched internally as the current test code. Test data is
252 * programmed internally by rising edge on TESTCLK.
253 */
254 writel(0x01000100, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
255 writel(0x00ff0000 | test_code,
256 csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
257 writel(0x02000200, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
258 writel(0x01000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
259 writel(0x02000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
260 writel(0x01000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
261 writel(0x00ff0000 | test_data,
262 csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
263 writel(0x01000100, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
264 }
265
266 static u8 __maybe_unused
rockchip_mipi_csi_phy_read(struct rockchip_mipi_csi * csi,u8 test_code)267 rockchip_mipi_csi_phy_read(struct rockchip_mipi_csi *csi, u8 test_code)
268 {
269 u8 val;
270
271 writel(0x02ff0200 | test_code,
272 csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
273 writel(0x01000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
274
275 val = readl(csi->test_code_regs + FPGA_DSI_PHY_TST_READ) & 0xff;
276 writel(0x03000100, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
277
278 return val;
279 }
280
rockchip_bidir4l_board_phy_reset(struct rockchip_mipi_csi * csi)281 static void rockchip_bidir4l_board_phy_reset(struct rockchip_mipi_csi *csi)
282 {
283 writel(0x04000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
284 writel(0x08000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
285 writel(0x01000100, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
286 writel(0x80008000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
287 writel(0x80000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
288 writel(0x40004000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
289 }
290
rockchip_bidir4l_board_phy_enable(struct rockchip_mipi_csi * csi)291 static void rockchip_bidir4l_board_phy_enable(struct rockchip_mipi_csi *csi)
292 {
293 writel(0x01000100, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
294 writel(0x02000000, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
295 writel(0x08000800, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
296 writel(0x04000400, csi->test_code_regs + FPGA_DSI_PHY_TST_CTRL0);
297 }
298
rockchip_mipi_csi_irq_init(struct rockchip_mipi_csi * csi)299 static void rockchip_mipi_csi_irq_init(struct rockchip_mipi_csi *csi)
300 {
301 /* enable csi err irq */
302 writel(m_ERR_INTR_EN | m_ERR_INTR_MASK, csi->regs + CSITX_ERR_INTR_EN);
303
304 /* disable csi frame end tx irq */
305 writel(m_FRM_END_TX | v_FRM_END_TX(0), csi->regs + CSITX_INTR_EN);
306 }
307
rockchip_mipi_csi_irq_disable(struct rockchip_mipi_csi * csi)308 static void rockchip_mipi_csi_irq_disable(struct rockchip_mipi_csi *csi)
309 {
310 /* disable csi err irq */
311 writel(m_ERR_INTR_MASK, csi->regs + CSITX_ERR_INTR_EN);
312
313 /* disable csi tx irq */
314 writel(m_INTR_MASK, csi->regs + CSITX_INTR_EN);
315 }
316
rockchip_mipi_dphy_power_on(struct rockchip_mipi_csi * csi)317 static int rockchip_mipi_dphy_power_on(struct rockchip_mipi_csi *csi)
318 {
319 if (csi->dphy.phy)
320 phy_power_on(csi->dphy.phy);
321
322 udelay(10);
323
324 return 0;
325 }
326
rockchip_mipi_dphy_power_off(struct rockchip_mipi_csi * csi)327 static void rockchip_mipi_dphy_power_off(struct rockchip_mipi_csi *csi)
328 {
329 if (csi->dphy.phy)
330 phy_power_off(csi->dphy.phy);
331 }
332
rockchip_mipi_csi_tx_en(struct rockchip_mipi_csi * csi)333 static void rockchip_mipi_csi_tx_en(struct rockchip_mipi_csi *csi)
334 {
335 u32 mask, val;
336
337 /* enable csi tx, dphy and config lane num */
338 mask = m_CSITX_EN | m_DPHY_EN | m_LANE_NUM;
339 val = v_CSITX_EN(1) | v_DPHY_EN(1) | v_LANE_NUM(csi->lanes - 1);
340 csi_mask_write(csi, CSITX_ENABLE, mask, val, true);
341 }
342
rockchip_mipi_csi_host_power_on(struct rockchip_mipi_csi * csi)343 static void rockchip_mipi_csi_host_power_on(struct rockchip_mipi_csi *csi)
344 {
345 u32 mask, val;
346
347 rockchip_mipi_csi_tx_en(csi);
348 rockchip_mipi_csi_irq_init(csi);
349
350 mask = m_CONFIG_DONE | m_CONFIG_DONE_IMD | m_CONFIG_DONE_MODE;
351 val = v_CONFIG_DONE(0) | v_CONFIG_DONE_IMD(1) | v_CONFIG_DONE_MODE(0);
352 csi_mask_write(csi, CSITX_CONFIG_DONE, mask, val, false);
353 }
354
rockchip_mipi_csi_host_power_off(struct rockchip_mipi_csi * csi)355 static void rockchip_mipi_csi_host_power_off(struct rockchip_mipi_csi *csi)
356 {
357 u32 mask, val;
358
359 rockchip_mipi_csi_irq_disable(csi);
360
361 /* disable csi tx, dphy and config lane num */
362 mask = m_CSITX_EN | m_DPHY_EN;
363 val = v_CSITX_EN(0) | v_DPHY_EN(0);
364 csi_mask_write(csi, CSITX_ENABLE, mask, val, true);
365 csi_mask_write(csi, CSITX_CONFIG_DONE, m_CONFIG_DONE,
366 v_CONFIG_DONE(1), false);
367 }
368
rockchip_mipi_csi_phy_pll_init(struct rockchip_mipi_csi * csi)369 static void rockchip_mipi_csi_phy_pll_init(struct rockchip_mipi_csi *csi)
370 {
371 rockchip_mipi_csi_phy_write(csi, 0x17,
372 INPUT_DIVIDER(csi->dphy.input_div));
373 rockchip_mipi_csi_phy_write(csi, 0x18,
374 LOOP_DIV_LOW_SEL(csi->dphy.feedback_div) |
375 LOW_PROGRAM_EN);
376 rockchip_mipi_csi_phy_write(csi, 0x19,
377 PLL_LOOP_DIV_EN | PLL_INPUT_DIV_EN);
378 rockchip_mipi_csi_phy_write(csi, 0x18,
379 LOOP_DIV_HIGH_SEL(csi->dphy.feedback_div) |
380 HIGH_PROGRAM_EN);
381 rockchip_mipi_csi_phy_write(csi, 0x19,
382 PLL_LOOP_DIV_EN | PLL_INPUT_DIV_EN);
383 }
384
385 static int __maybe_unused
rockchip_mipi_csi_phy_init(struct rockchip_mipi_csi * csi)386 rockchip_mipi_csi_phy_init(struct rockchip_mipi_csi *csi)
387 {
388 int testdin, vco;
389
390 vco = (csi->lane_mbps < 200) ? 0 : (csi->lane_mbps + 100) / 200;
391
392 testdin = phy_max_mbps_to_testdin(csi->lane_mbps);
393 if (testdin < 0) {
394 dev_err(csi->dev,
395 "failed to get testdin for %dmbps lane clock\n",
396 csi->lane_mbps);
397 return testdin;
398 }
399
400 rockchip_mipi_csi_phy_write(csi, 0xb0, 0x01);
401 rockchip_mipi_csi_phy_write(csi, 0xac, csi->lanes - 1);
402 rockchip_mipi_csi_phy_write(csi, 0xb1, 0x00);
403 rockchip_mipi_csi_phy_write(csi, 0xb2, 0x00);
404 rockchip_mipi_csi_phy_write(csi, 0xb3, 0x00);
405 rockchip_mipi_csi_phy_write(csi, 0x10, BYPASS_VCO_RANGE |
406 VCO_RANGE_CON_SEL(vco) |
407 VCO_IN_CAP_CON_LOW |
408 REF_BIAS_CUR_SEL);
409
410 rockchip_mipi_csi_phy_write(csi, 0x11, CP_CURRENT_3MA);
411 rockchip_mipi_csi_phy_write(csi, 0x12, CP_PROGRAM_EN | LPF_PROGRAM_EN |
412 LPF_RESISTORS_20_KOHM);
413
414 rockchip_mipi_csi_phy_write(csi, 0x44, HSFREQRANGE_SEL(testdin));
415
416 rockchip_mipi_csi_phy_pll_init(csi);
417
418 rockchip_mipi_csi_phy_write(csi, 0x20, POWER_CONTROL |
419 INTERNAL_REG_CURRENT | BIAS_BLOCK_ON |
420 BANDGAP_ON);
421
422 rockchip_mipi_csi_phy_write(csi, 0x21, TER_RESISTOR_LOW | TER_CAL_DONE |
423 SETRD_MAX | TER_RESISTORS_ON);
424 rockchip_mipi_csi_phy_write(csi, 0x21, TER_RESISTOR_HIGH |
425 LEVEL_SHIFTERS_ON | SETRD_MAX |
426 POWER_MANAGE | TER_RESISTORS_ON);
427
428 rockchip_mipi_csi_phy_write(csi, 0x22, LOW_PROGRAM_EN |
429 BIASEXTR_SEL(BIASEXTR_127_7));
430 rockchip_mipi_csi_phy_write(csi, 0x22, HIGH_PROGRAM_EN |
431 BANDGAP_SEL(BANDGAP_96_10));
432
433 rockchip_mipi_csi_phy_write(csi, 0x70, TLP_PROGRAM_EN | 0xf);
434 rockchip_mipi_csi_phy_write(csi, 0x71, THS_PRE_PROGRAM_EN | 0x2d);
435 rockchip_mipi_csi_phy_write(csi, 0x72, THS_ZERO_PROGRAM_EN | 0xa);
436
437 return 0;
438 }
439
440 /**
441 * mipi_csi_pixel_format_to_bpp - obtain the number of bits per pixel for any
442 * given pixel format defined by the MIPI CSI
443 * specification
444 * @fmt: MIPI CSI pixel format
445 *
446 * Returns: The number of bits per pixel of the given pixel format.
447 */
mipi_csi_pixel_format_to_bpp(int fmt)448 static inline int mipi_csi_pixel_format_to_bpp(int fmt)
449 {
450 switch (fmt) {
451 case MIPI_CSI_FMT_RAW8:
452 return 8;
453 case MIPI_CSI_FMT_RAW10:
454 return 10;
455 default:
456 pr_info("mipi csi unsupported format: %d\n", fmt);
457 return 24;
458 }
459
460 return -EINVAL;
461 }
462
463 static unsigned long
rockchip_mipi_csi_calc_bandwidth(struct rockchip_mipi_csi * csi)464 rockchip_mipi_csi_calc_bandwidth(struct rockchip_mipi_csi *csi)
465 {
466 int bpp;
467 unsigned long mpclk, tmp;
468 unsigned long target_mbps = 1000;
469 unsigned int value;
470 struct device_node *np = csi->dev->of_node;
471 unsigned int max_mbps;
472 int lanes;
473
474 /* optional override of the desired bandwidth */
475 if (!of_property_read_u32(np, "rockchip,lane-rate", &value))
476 return value;
477
478 max_mbps = csi->pdata->max_bit_rate_per_lane / USEC_PER_SEC;
479
480 bpp = mipi_csi_pixel_format_to_bpp(csi->format);
481 if (bpp < 0) {
482 dev_err(csi->dev, "failed to get bpp for pixel format %d\n",
483 csi->format);
484 bpp = 24;
485 }
486
487 lanes = csi->lanes;
488
489 mpclk = DIV_ROUND_UP(csi->mode.clock, MSEC_PER_SEC);
490 if (mpclk) {
491 /*
492 * vop raw 1 cycle pclk can process 4 pixel, so multiply 4.
493 */
494 tmp = mpclk * (bpp / lanes) * 4;
495 if (tmp <= max_mbps)
496 target_mbps = tmp;
497 else
498 dev_err(csi->dev, "DPHY clock freq is out of range\n");
499 }
500
501 return target_mbps;
502 }
503
rockchip_mipi_csi_get_lane_bps(struct rockchip_mipi_csi * csi)504 static int rockchip_mipi_csi_get_lane_bps(struct rockchip_mipi_csi *csi)
505 {
506 unsigned int i, pre;
507 unsigned long pllref, tmp;
508 unsigned int m = 1, n = 1;
509 unsigned long target_mbps;
510
511 target_mbps = rockchip_mipi_csi_calc_bandwidth(csi);
512 #ifdef FPGA_PLATFORM_TEST
513 pllref = DIV_ROUND_UP(27000000, USEC_PER_SEC);
514 #else
515 pllref = DIV_ROUND_UP(clk_get_rate(csi->dphy.ref_clk), USEC_PER_SEC);
516 #endif
517 tmp = pllref;
518
519 for (i = 1; i < 6; i++) {
520 pre = pllref / i;
521 if ((tmp > (target_mbps % pre)) && (target_mbps / pre < 512)) {
522 tmp = target_mbps % pre;
523 n = i;
524 m = target_mbps / pre;
525 }
526 if (tmp == 0)
527 break;
528 }
529
530 csi->lane_mbps = pllref / n * m;
531 csi->dphy.input_div = n;
532 csi->dphy.feedback_div = m;
533
534 return 0;
535 }
536
rockchip_mipi_csi_set_hs_clk(struct rockchip_mipi_csi * csi)537 static void rockchip_mipi_csi_set_hs_clk(struct rockchip_mipi_csi *csi)
538 {
539 int ret;
540 unsigned long target_mbps;
541 unsigned long bw, rate;
542
543 target_mbps = rockchip_mipi_csi_calc_bandwidth(csi);
544 bw = target_mbps * USEC_PER_SEC;
545
546 rate = clk_round_rate(csi->dphy.hs_clk, bw);
547 ret = clk_set_rate(csi->dphy.hs_clk, rate);
548 if (ret)
549 dev_err(csi->dev, "failed to set hs clock rate: %lu\n",
550 rate);
551
552 csi->lane_mbps = rate / USEC_PER_SEC;
553 }
554
rockchip_mipi_csi_host_attach(struct mipi_dsi_host * host,struct mipi_dsi_device * device)555 static int rockchip_mipi_csi_host_attach(struct mipi_dsi_host *host,
556 struct mipi_dsi_device *device)
557 {
558 struct rockchip_mipi_csi *csi = host_to_csi(host);
559
560 if (device->lanes == 0 || device->lanes > 8) {
561 dev_err(csi->dev, "the number of data lanes(%u) is too many\n",
562 device->lanes);
563 return -EINVAL;
564 }
565 csi->client = device->dev.of_node;
566 csi->lanes = device->lanes;
567 csi->channel = device->channel;
568 csi->format = device->format;
569 csi->mode_flags = device->mode_flags;
570
571 return 0;
572 }
573
rockchip_mipi_csi_host_detach(struct mipi_dsi_host * host,struct mipi_dsi_device * device)574 static int rockchip_mipi_csi_host_detach(struct mipi_dsi_host *host,
575 struct mipi_dsi_device *device)
576 {
577 struct rockchip_mipi_csi *csi = host_to_csi(host);
578
579 if (csi->panel)
580 drm_panel_detach(csi->panel);
581
582 csi->panel = NULL;
583 return 0;
584 }
585
586 static const struct mipi_dsi_host_ops rockchip_mipi_csi_host_ops = {
587 .attach = rockchip_mipi_csi_host_attach,
588 .detach = rockchip_mipi_csi_host_detach,
589 };
590
rockchip_mipi_csi_path_config(struct rockchip_mipi_csi * csi)591 static void rockchip_mipi_csi_path_config(struct rockchip_mipi_csi *csi)
592 {
593 u32 mask, val;
594 u32 vop_wc = 0;
595 u32 data_type = 0x2a;
596
597 switch (csi->format) {
598 case MIPI_CSI_FMT_RAW8:
599 vop_wc = csi->mode.hdisplay;
600 data_type = 0x2a;
601 break;
602 case MIPI_CSI_FMT_RAW10:
603 vop_wc = csi->mode.hdisplay * 5 / 4;
604 data_type = 0x2b;
605 break;
606 default:
607 vop_wc = csi->mode.hdisplay;
608 data_type = 0x2a;
609 WARN_ON(1);
610 }
611
612 if (csi->path_mode == VOP_PATH) {
613 /* bypass select */
614 mask = m_BYPASS_SELECT;
615 val = v_BYPASS_SELECT(0);
616 csi_mask_write(csi, CSITX_SYS_CTRL1, mask, val, true);
617
618 /* enable vop path
619 * todo: vc
620 */
621 mask = m_VOP_PATH_EN | m_VOP_WC_USERDEFINE_EN |
622 m_VOP_WC_USERDEFINE | m_VOP_DT_USERDEFINE_EN |
623 m_VOP_DT_USERDEFINE;
624 val = v_VOP_PATH_EN(1) | v_VOP_WC_USERDEFINE_EN(1) |
625 v_VOP_WC_USERDEFINE(vop_wc) |
626 v_VOP_DT_USERDEFINE_EN(1) |
627 v_VOP_DT_USERDEFINE(data_type);
628 csi_mask_write(csi, CSITX_VOP_PATH_CTRL, mask, val, true);
629
630 /* disable bypass path */
631 mask = m_BYPASS_PATH_EN;
632 val = v_BYPASS_PATH_EN(0);
633 csi_mask_write(csi, CSITX_BYPASS_PATH_CTRL, mask, val, true);
634 } else {
635 mask = m_BYPASS_SELECT;
636 val = v_BYPASS_SELECT(1);
637 /* bypass select */
638 csi_mask_write(csi, CSITX_SYS_CTRL1, mask, val, true);
639
640 /* disable vop path
641 * todo: dt, vc, wc
642 */
643 mask = m_VOP_PATH_EN | m_VOP_WC_USERDEFINE_EN |
644 m_VOP_DT_USERDEFINE_EN;
645 val = v_VOP_PATH_EN(0) | v_VOP_WC_USERDEFINE_EN(0) |
646 v_VOP_DT_USERDEFINE_EN(0);
647 csi_mask_write(csi, CSITX_VOP_PATH_CTRL, mask, val, true);
648
649 /* enable bypass path */
650 mask = m_BYPASS_PATH_EN;
651 val = v_BYPASS_PATH_EN(1);
652 csi_mask_write(csi, CSITX_BYPASS_PATH_CTRL, mask, val, true);
653
654 /* enable idi_48bit path */
655 mask = m_IDI_48BIT_EN;
656 val = v_IDI_48BIT_EN(0);
657 csi_mask_write(csi, CSITX_ENABLE, mask, val, true);
658 }
659 }
660
rockchip_mipi_csi_video_mode_config(struct rockchip_mipi_csi * csi)661 static void rockchip_mipi_csi_video_mode_config(struct rockchip_mipi_csi *csi)
662 {
663 u32 mask, val;
664
665 if (csi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) {
666 /* enable non continue mode */
667 val = v_NON_CONTINUES_MODE_EN(1) | v_CONT_MODE_CLK_SET(0);
668 } else {
669 /* disable non continue mode */
670 val = v_NON_CONTINUES_MODE_EN(0) | v_CONT_MODE_CLK_SET(1);
671 }
672 mask = m_NON_CONTINUES_MODE_EN | m_CONT_MODE_CLK_SET;
673 csi_mask_write(csi, CSITX_SYS_CTRL3, mask, val, true);
674 }
675
rockchip_mipi_dphy_init(struct rockchip_mipi_csi * csi)676 static void rockchip_mipi_dphy_init(struct rockchip_mipi_csi *csi)
677 {
678 u32 map[] = {0x1, 0x3, 0x7, 0xf};
679
680 /* Configures DPHY Selete */
681 grf_field_write(csi, DPHY_SEL, 0);
682
683 /* Configures DPHY to work as a Master */
684 grf_field_write(csi, MASTERSLAVEZ, 1);
685
686 /* Configures lane as TX */
687 grf_field_write(csi, BASEDIR, 0);
688
689 /* Set all REQUEST inputs to zero */
690 grf_field_write(csi, TURNREQUEST, 0);
691 grf_field_write(csi, TURNDISABLE, 0);
692 grf_field_write(csi, FORCETXSTOPMODE, 0);
693 grf_field_write(csi, FORCERXMODE, 0);
694
695 /* Enable Data Lane Module */
696 grf_field_write(csi, ENABLE_N, map[csi->lanes - 1]);
697
698 /* Enable Clock Lane Module */
699 grf_field_write(csi, ENABLECLK, 1);
700 if (!csi->dphy.phy) {
701 /* reset dphy */
702 rockchip_bidir4l_board_phy_reset(csi);
703 udelay(1);
704 #ifdef FPGA_PLATFORM_TEST
705 /* init dphy */
706 rockchip_mipi_csi_phy_write(csi, 0xb0, 0x01);
707 rockchip_mipi_csi_phy_write(csi, 0xac, csi->lanes - 1);
708
709 rockchip_mipi_csi_phy_write(csi, 0x44, 0x0a);/* fpga:324Mbps */
710 rockchip_mipi_csi_phy_write(csi, 0x19, 0x30);
711 rockchip_mipi_csi_phy_write(csi, 0x17, 0x00);
712 rockchip_mipi_csi_phy_write(csi, 0x18, 0xb);
713 rockchip_mipi_csi_phy_write(csi, 0x18, 0x80);
714
715 rockchip_mipi_csi_phy_write(csi, 0x10, 0x80);
716 rockchip_mipi_csi_phy_write(csi, 0x11, 0x09);
717 rockchip_mipi_csi_phy_write(csi, 0x12, 0xc2);
718 #else
719 rockchip_mipi_csi_phy_init(csi);
720 #endif
721 /* enable dphy */
722 rockchip_bidir4l_board_phy_enable(csi);
723 }
724 udelay(1);
725 }
726
rockchip_mipi_csi_fmt_config(struct rockchip_mipi_csi * csi,struct drm_display_mode * mode)727 static void rockchip_mipi_csi_fmt_config(struct rockchip_mipi_csi *csi,
728 struct drm_display_mode *mode)
729 {
730 u32 mask, val;
731
732 mask = m_PIXEL_FORMAT;
733 val = v_PIXEL_FORMAT(csi->format);
734 csi_mask_write(csi, CSITX_VOP_PATH_CTRL, mask, val, true);
735
736 mask = m_CAM_FORMAT;
737 val = v_CAM_FORMAT(csi->format);
738 csi_mask_write(csi, CSITX_BYPASS_PATH_CTRL, mask, val, true);
739 }
740
741 static void
rockchip_mipi_csi_encoder_mode_set(struct drm_encoder * encoder,struct drm_display_mode * mode,struct drm_display_mode * adjusted_mode)742 rockchip_mipi_csi_encoder_mode_set(struct drm_encoder *encoder,
743 struct drm_display_mode *mode,
744 struct drm_display_mode *adjusted_mode)
745 {
746 struct rockchip_mipi_csi *csi = encoder_to_csi(encoder);
747
748 drm_mode_copy(&csi->mode, adjusted_mode);
749 }
750
rockchip_mipi_csi_post_disable(struct rockchip_mipi_csi * csi)751 static void rockchip_mipi_csi_post_disable(struct rockchip_mipi_csi *csi)
752 {
753 rockchip_mipi_csi_host_power_off(csi);
754 rockchip_mipi_dphy_power_off(csi);
755
756 pm_runtime_put(csi->dev);
757 clk_disable_unprepare(csi->pclk);
758 clk_disable_unprepare(csi->dphy.hs_clk);
759 clk_disable_unprepare(csi->dphy.ref_clk);
760 }
761
rockchip_mipi_csi_encoder_disable(struct drm_encoder * encoder)762 static void rockchip_mipi_csi_encoder_disable(struct drm_encoder *encoder)
763 {
764 struct rockchip_mipi_csi *csi = encoder_to_csi(encoder);
765
766 if (csi->panel)
767 drm_panel_disable(csi->panel);
768
769 if (csi->panel)
770 drm_panel_unprepare(csi->panel);
771
772 rockchip_mipi_csi_post_disable(csi);
773 }
774
775 static bool
rockchip_mipi_csi_encoder_mode_fixup(struct drm_encoder * encoder,const struct drm_display_mode * mode,struct drm_display_mode * adjusted_mode)776 rockchip_mipi_csi_encoder_mode_fixup(struct drm_encoder *encoder,
777 const struct drm_display_mode *mode,
778 struct drm_display_mode *adjusted_mode)
779 {
780 return true;
781 }
782
rockchip_mipi_csi_pre_init(struct rockchip_mipi_csi * csi)783 static void rockchip_mipi_csi_pre_init(struct rockchip_mipi_csi *csi)
784 {
785 if (csi->dphy.phy)
786 rockchip_mipi_csi_set_hs_clk(csi);
787 else
788 rockchip_mipi_csi_get_lane_bps(csi);
789
790 dev_info(csi->dev, "final CSI-Link bandwidth: %u x %d Mbps\n",
791 csi->lane_mbps, csi->lanes);
792 }
793
rockchip_mipi_csihost_enable_phy(struct rockchip_mipi_csi * csi)794 static void rockchip_mipi_csihost_enable_phy(struct rockchip_mipi_csi *csi)
795 {
796 u32 mask, val;
797 u32 map[] = {0x3, 0x7, 0xf, 0x1f};
798
799 mask = m_CSITX_ENABLE_PHY;
800 val = v_CSITX_ENABLE_PHY(map[csi->lanes - 1]);
801 csi_mask_write(csi, CSITX_DPHY_CTRL, mask, val, true);
802 }
803
rockchip_mipi_csi_host_init(struct rockchip_mipi_csi * csi)804 static void rockchip_mipi_csi_host_init(struct rockchip_mipi_csi *csi)
805 {
806 rockchip_mipi_csi_fmt_config(csi, &csi->mode);
807 rockchip_mipi_csi_video_mode_config(csi);
808 rockchip_mipi_csi_path_config(csi);
809 rockchip_mipi_csihost_enable_phy(csi);
810
811 /* timging config */
812 }
813
rockchip_mipi_csi_calibration(struct rockchip_mipi_csi * csi)814 static int rockchip_mipi_csi_calibration(struct rockchip_mipi_csi *csi)
815 {
816 int ret = 0;
817 unsigned int val, mask;
818
819 /* calibration */
820 grf_field_write(csi, TXSKEWCALHS, 0x1f);
821 udelay(17);
822 grf_field_write(csi, TXSKEWCALHS, 0x0);
823
824 ret = readl_poll_timeout(csi->regs + CSITX_STATUS1,
825 val, (val & m_DPHY_PLL_LOCK),
826 1000, PHY_STATUS_TIMEOUT_US);
827 if (ret < 0) {
828 dev_err(csi->dev, "PHY is not locked\n");
829 return ret;
830 }
831
832 mask = PHY_STOPSTATELANE;
833 ret = readl_poll_timeout(csi->regs + CSITX_STATUS1,
834 val, (val & mask) == mask,
835 1000, PHY_STATUS_TIMEOUT_US);
836 if (ret < 0) {
837 dev_err(csi->dev, "lane module is not in stop state\n");
838 return ret;
839 }
840 udelay(10);
841
842 return 0;
843 }
844
rockchip_mipi_csi_pre_enable(struct rockchip_mipi_csi * csi)845 static int rockchip_mipi_csi_pre_enable(struct rockchip_mipi_csi *csi)
846 {
847 int i = 0;
848
849 rockchip_mipi_csi_pre_init(csi);
850 clk_prepare_enable(csi->dphy.ref_clk);
851 clk_prepare_enable(csi->dphy.hs_clk);
852 clk_prepare_enable(csi->pclk);
853 pm_runtime_get_sync(csi->dev);
854
855 /* MIPI CSI TX software reset request. */
856 for (i = 0; i < csi->pdata->rsts_num; i++) {
857 if (csi->tx_rsts[i])
858 reset_control_assert(csi->tx_rsts[i]);
859 }
860 usleep_range(20, 100);
861 for (i = 0; i < csi->pdata->rsts_num; i++) {
862 if (csi->tx_rsts[i])
863 reset_control_deassert(csi->tx_rsts[i]);
864 }
865
866 if (!csi->regsbak) {
867 csi->regsbak =
868 devm_kzalloc(csi->dev, csi->regs_len, GFP_KERNEL);
869
870 if (!csi->regsbak)
871 return -ENOMEM;
872
873 memcpy(csi->regsbak, csi->regs, csi->regs_len);
874 }
875
876 rockchip_mipi_csi_host_init(csi);
877 rockchip_mipi_dphy_init(csi);
878 rockchip_mipi_dphy_power_on(csi);
879 rockchip_mipi_csi_calibration(csi);
880 rockchip_mipi_csi_host_power_on(csi);
881
882 return 0;
883 }
884
rockchip_mipi_csi_encoder_enable(struct drm_encoder * encoder)885 static void rockchip_mipi_csi_encoder_enable(struct drm_encoder *encoder)
886 {
887 struct rockchip_mipi_csi *csi = encoder_to_csi(encoder);
888
889 rockchip_mipi_csi_pre_enable(csi);
890
891 if (csi->panel)
892 drm_panel_prepare(csi->panel);
893
894 if (csi->panel)
895 drm_panel_enable(csi->panel);
896 }
897
898 static int
rockchip_mipi_csi_encoder_atomic_check(struct drm_encoder * encoder,struct drm_crtc_state * crtc_state,struct drm_connector_state * conn_state)899 rockchip_mipi_csi_encoder_atomic_check(struct drm_encoder *encoder,
900 struct drm_crtc_state *crtc_state,
901 struct drm_connector_state *conn_state)
902 {
903 struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
904 struct rockchip_mipi_csi *csi = encoder_to_csi(encoder);
905 struct drm_connector *connector = conn_state->connector;
906 struct drm_display_info *info = &connector->display_info;
907
908 switch (csi->format) {
909 case MIPI_CSI_FMT_RAW8:
910 s->output_mode = ROCKCHIP_OUT_MODE_P888;
911 break;
912 case MIPI_CSI_FMT_RAW10:
913 s->output_mode = ROCKCHIP_OUT_MODE_P666;
914 break;
915 default:
916 WARN_ON(1);
917 s->output_mode = ROCKCHIP_OUT_MODE_P888;
918 break;
919 }
920
921 s->output_type = DRM_MODE_CONNECTOR_DSI;
922 if (info->num_bus_formats)
923 s->bus_format = info->bus_formats[0];
924 else
925 s->bus_format = MEDIA_BUS_FMT_RGB888_1X24;
926 s->tv_state = &conn_state->tv;
927 s->eotf = TRADITIONAL_GAMMA_SDR;
928 s->color_space = V4L2_COLORSPACE_DEFAULT;
929
930 return 0;
931 }
932
933 static const struct drm_encoder_helper_funcs
934 rockchip_mipi_csi_encoder_helper_funcs = {
935 .mode_fixup = rockchip_mipi_csi_encoder_mode_fixup,
936 .mode_set = rockchip_mipi_csi_encoder_mode_set,
937 .enable = rockchip_mipi_csi_encoder_enable,
938 .disable = rockchip_mipi_csi_encoder_disable,
939 .atomic_check = rockchip_mipi_csi_encoder_atomic_check,
940 };
941
942 static const struct drm_encoder_funcs rockchip_mipi_csi_encoder_funcs = {
943 .destroy = drm_encoder_cleanup,
944 };
945
946 static int
rockchip_mipi_csi_connector_get_modes(struct drm_connector * connector)947 rockchip_mipi_csi_connector_get_modes(struct drm_connector *connector)
948 {
949 struct rockchip_mipi_csi *csi = con_to_csi(connector);
950
951 return drm_panel_get_modes(csi->panel);
952 }
953
954 static struct drm_encoder *
rockchip_mipi_csi_connector_best_encoder(struct drm_connector * connector)955 rockchip_mipi_csi_connector_best_encoder(struct drm_connector *connector)
956 {
957 struct rockchip_mipi_csi *csi = con_to_csi(connector);
958
959 return &csi->encoder;
960 }
961
962 static int
rockchip_mipi_loader_protect(struct drm_connector * connector,bool on)963 rockchip_mipi_loader_protect(struct drm_connector *connector, bool on)
964 {
965 struct rockchip_mipi_csi *csi = con_to_csi(connector);
966
967 if (csi->panel)
968 drm_panel_loader_protect(csi->panel, on);
969 if (on) {
970 pm_runtime_get_sync(csi->dev);
971 if (!csi->regsbak) {
972 csi->regsbak = devm_kzalloc(csi->dev, csi->regs_len,
973 GFP_KERNEL);
974 if (!csi->regsbak)
975 return -ENOMEM;
976 memcpy(csi->regsbak, csi->regs, csi->regs_len);
977 }
978 } else {
979 pm_runtime_put(csi->dev);
980 }
981 return 0;
982 }
983
984 static void
rockchip_mipi_csi_connector_atomic_flush(struct drm_connector * connector,struct drm_connector_state * conn_state)985 rockchip_mipi_csi_connector_atomic_flush(struct drm_connector *connector,
986 struct drm_connector_state *conn_state)
987 {
988 struct rockchip_mipi_csi *csi = con_to_csi(connector);
989 u32 mask, val;
990
991 rockchip_mipi_csi_path_config(csi);
992 mask = m_CONFIG_DONE | m_CONFIG_DONE_IMD | m_CONFIG_DONE_MODE;
993 val = v_CONFIG_DONE(0) | v_CONFIG_DONE_IMD(1) | v_CONFIG_DONE_MODE(0);
994 csi_mask_write(csi, CSITX_CONFIG_DONE, mask, val, false);
995 }
996
997 static const struct drm_connector_helper_funcs
998 rockchip_mipi_csi_connector_helper_funcs = {
999 .loader_protect = rockchip_mipi_loader_protect,
1000 .get_modes = rockchip_mipi_csi_connector_get_modes,
1001 .best_encoder = rockchip_mipi_csi_connector_best_encoder,
1002 .atomic_flush = rockchip_mipi_csi_connector_atomic_flush,
1003 };
1004
1005 static enum drm_connector_status
rockchip_mipi_csi_detect(struct drm_connector * connector,bool force)1006 rockchip_mipi_csi_detect(struct drm_connector *connector, bool force)
1007 {
1008 return connector_status_connected;
1009 }
1010
1011 static void
rockchip_mipi_csi_drm_connector_destroy(struct drm_connector * connector)1012 rockchip_mipi_csi_drm_connector_destroy(struct drm_connector *connector)
1013 {
1014 drm_connector_unregister(connector);
1015 drm_connector_cleanup(connector);
1016 }
1017
1018 static int
rockchip_mipi_csi_connector_set_property(struct drm_connector * connector,struct drm_connector_state * state,struct drm_property * property,uint64_t val)1019 rockchip_mipi_csi_connector_set_property(struct drm_connector *connector,
1020 struct drm_connector_state *state,
1021 struct drm_property *property,
1022 uint64_t val)
1023 {
1024 struct rockchip_mipi_csi *csi = con_to_csi(connector);
1025
1026 if (property == csi->csi_tx_path_property) {
1027 /*
1028 * csi->path_mode = val;
1029 * we get path mode from dts now
1030 */
1031 return 0;
1032 }
1033
1034 DRM_ERROR("failed to set mipi csi tx cproperty\n");
1035 return -EINVAL;
1036 }
1037
1038 static int
rockchip_mipi_csi_connector_get_property(struct drm_connector * connector,const struct drm_connector_state * state,struct drm_property * property,uint64_t * val)1039 rockchip_mipi_csi_connector_get_property(struct drm_connector *connector,
1040 const struct drm_connector_state *state,
1041 struct drm_property *property,
1042 uint64_t *val)
1043 {
1044 struct rockchip_mipi_csi *csi = con_to_csi(connector);
1045
1046 if (property == csi->csi_tx_path_property) {
1047 *val = csi->path_mode;
1048 return 0;
1049 }
1050
1051 DRM_ERROR("failed to get mipi csi tx cproperty\n");
1052 return -EINVAL;
1053 }
1054
1055 static const
1056 struct drm_connector_funcs rockchip_mipi_csi_atomic_connector_funcs = {
1057 .dpms = drm_atomic_helper_connector_dpms,
1058 .fill_modes = drm_helper_probe_single_connector_modes,
1059 .detect = rockchip_mipi_csi_detect,
1060 .destroy = rockchip_mipi_csi_drm_connector_destroy,
1061 .reset = drm_atomic_helper_connector_reset,
1062 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
1063 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1064 .atomic_set_property = rockchip_mipi_csi_connector_set_property,
1065 .atomic_get_property = rockchip_mipi_csi_connector_get_property,
1066 };
1067
rockchip_mipi_csi_property_create(struct rockchip_mipi_csi * csi)1068 static int rockchip_mipi_csi_property_create(struct rockchip_mipi_csi *csi)
1069 {
1070 struct drm_property *prop;
1071
1072 prop = drm_property_create_range(csi->connector.dev, 0,
1073 "CSI-TX-PATH",
1074 0, 0x1);
1075 if (prop) {
1076 csi->csi_tx_path_property = prop;
1077 drm_object_attach_property(&csi->connector.base, prop, 0);
1078 }
1079
1080 return 0;
1081 }
1082
rockchip_mipi_csi_register(struct drm_device * drm,struct rockchip_mipi_csi * csi)1083 static int rockchip_mipi_csi_register(struct drm_device *drm,
1084 struct rockchip_mipi_csi *csi)
1085 {
1086 struct drm_encoder *encoder = &csi->encoder;
1087 struct drm_connector *connector = &csi->connector;
1088 struct device *dev = csi->dev;
1089 int ret;
1090
1091 encoder->possible_crtcs = rockchip_drm_of_find_possible_crtcs(drm,
1092 dev->of_node);
1093 /*
1094 * If we failed to find the CRTC(s) which this encoder is
1095 * supposed to be connected to, it's because the CRTC has
1096 * not been registered yet. Defer probing, and hope that
1097 * the required CRTC is added later.
1098 */
1099 if (encoder->possible_crtcs == 0)
1100 return -EPROBE_DEFER;
1101
1102 drm_encoder_helper_add(&csi->encoder,
1103 &rockchip_mipi_csi_encoder_helper_funcs);
1104 ret = drm_encoder_init(drm, &csi->encoder,
1105 &rockchip_mipi_csi_encoder_funcs,
1106 DRM_MODE_ENCODER_DSI, NULL);
1107 if (ret) {
1108 dev_err(dev, "Failed to initialize encoder with drm\n");
1109 return ret;
1110 }
1111
1112 csi->connector.port = dev->of_node;
1113 ret = drm_connector_init(drm, &csi->connector,
1114 &rockchip_mipi_csi_atomic_connector_funcs,
1115 DRM_MODE_CONNECTOR_DSI);
1116 if (ret) {
1117 dev_err(dev, "Failed to initialize connector\n");
1118 goto encoder_cleanup;
1119 }
1120
1121 drm_connector_helper_add(connector,
1122 &rockchip_mipi_csi_connector_helper_funcs);
1123
1124 drm_mode_connector_attach_encoder(connector, encoder);
1125
1126 ret = drm_panel_attach(csi->panel, &csi->connector);
1127 if (ret) {
1128 dev_err(dev, "Failed to attach panel: %d\n", ret);
1129 goto connector_cleanup;
1130 }
1131 return 0;
1132
1133 connector_cleanup:
1134 drm_connector_cleanup(connector);
1135 encoder_cleanup:
1136 drm_encoder_cleanup(encoder);
1137 return ret;
1138 }
1139
rockchip_mipi_csi_bind(struct device * dev,struct device * master,void * data)1140 static int rockchip_mipi_csi_bind(struct device *dev, struct device *master,
1141 void *data)
1142 {
1143 struct drm_device *drm = data;
1144 struct rockchip_mipi_csi *csi = dev_get_drvdata(dev);
1145 int ret;
1146
1147 csi->panel = of_drm_find_panel(csi->client);
1148 if (!csi->panel) {
1149 DRM_ERROR("failed to find panel\n");
1150 return -EPROBE_DEFER;
1151 }
1152
1153 ret = rockchip_mipi_csi_register(drm, csi);
1154 if (ret) {
1155 dev_err(dev, "Failed to register mipi_csi: %d\n", ret);
1156 return ret;
1157 }
1158
1159 rockchip_mipi_csi_property_create(csi);
1160 pm_runtime_enable(dev);
1161
1162 return ret;
1163 }
1164
rockchip_mipi_csi_unbind(struct device * dev,struct device * master,void * data)1165 static void rockchip_mipi_csi_unbind(struct device *dev, struct device *master,
1166 void *data)
1167 {
1168 pm_runtime_disable(dev);
1169 }
1170
1171 static const struct component_ops rockchip_mipi_csi_ops = {
1172 .bind = rockchip_mipi_csi_bind,
1173 .unbind = rockchip_mipi_csi_unbind,
1174 };
1175
rockchip_mipi_csi_irq_handler(int irq,void * data)1176 static irqreturn_t rockchip_mipi_csi_irq_handler(int irq, void *data)
1177 {
1178 struct rockchip_mipi_csi *csi = data;
1179 u32 int_status, err_int_status;
1180 unsigned int i;
1181
1182 int_status = csi_readl(csi, CSITX_INTR_STATUS);
1183 err_int_status = csi_readl(csi, CSITX_ERR_INTR_STATUS);
1184
1185 for (i = 0; i < ARRAY_SIZE(csi_tx_intr); i++)
1186 if (int_status & BIT(i))
1187 DRM_DEV_ERROR_RATELIMITED(csi->dev, "%s\n",
1188 csi_tx_intr[i]);
1189
1190 for (i = 0; i < ARRAY_SIZE(csi_tx_err_intr); i++)
1191 if (err_int_status & BIT(i))
1192 DRM_DEV_ERROR_RATELIMITED(csi->dev, "%s\n",
1193 csi_tx_err_intr[i]);
1194 writel(int_status | m_INTR_MASK, csi->regs + CSITX_INTR_CLR);
1195 writel(err_int_status | m_ERR_INTR_MASK,
1196 csi->regs + CSITX_ERR_INTR_CLR);
1197
1198 return IRQ_HANDLED;
1199 }
1200
rockchip_mipi_dphy_attach(struct rockchip_mipi_csi * csi)1201 static int rockchip_mipi_dphy_attach(struct rockchip_mipi_csi *csi)
1202 {
1203 struct device *dev = csi->dev;
1204 int ret;
1205
1206 csi->dphy.phy = devm_phy_optional_get(dev, "mipi_dphy");
1207 if (IS_ERR(csi->dphy.phy)) {
1208 ret = PTR_ERR(csi->dphy.phy);
1209 dev_err(dev, "failed to get mipi dphy: %d\n", ret);
1210 return ret;
1211 }
1212
1213 if (csi->dphy.phy) {
1214 dev_dbg(dev, "Use Non-SNPS PHY\n");
1215
1216 csi->dphy.hs_clk = devm_clk_get(dev, "hs_clk");
1217 if (IS_ERR(csi->dphy.hs_clk)) {
1218 dev_err(dev, "failed to get PHY high-speed clock\n");
1219 return PTR_ERR(csi->dphy.hs_clk);
1220 }
1221 } else {
1222 dev_dbg(dev, "Use SNPS PHY\n");
1223 csi->dphy.ref_clk = devm_clk_get(dev, "ref");
1224 if (IS_ERR(csi->dphy.ref_clk)) {
1225 dev_err(dev, "failed to get PHY reference clock\n");
1226 return PTR_ERR(csi->dphy.ref_clk);
1227 }
1228 }
1229
1230 return 0;
1231 }
1232
dw_mipi_csi_parse_dt(struct rockchip_mipi_csi * csi)1233 static int dw_mipi_csi_parse_dt(struct rockchip_mipi_csi *csi)
1234 {
1235 struct device *dev = csi->dev;
1236 struct device_node *np = dev->of_node;
1237 struct device_node *endpoint, *remote = NULL;
1238
1239 endpoint = of_graph_get_endpoint_by_regs(np, 1, -1);
1240 if (endpoint) {
1241 remote = of_graph_get_remote_port_parent(endpoint);
1242
1243 of_node_put(endpoint);
1244 if (!remote) {
1245 dev_err(dev, "no panel/bridge connected\n");
1246 return -ENODEV;
1247 }
1248 of_node_put(remote);
1249 }
1250
1251 csi->client = remote;
1252
1253 return 0;
1254 }
1255
rockchip_mipi_csi_probe(struct platform_device * pdev)1256 static int rockchip_mipi_csi_probe(struct platform_device *pdev)
1257 {
1258 struct device *dev = &pdev->dev;
1259 struct rockchip_mipi_csi *csi;
1260 struct device_node *np = dev->of_node;
1261 struct resource *res;
1262 int ret, val, i;
1263
1264 csi = devm_kzalloc(dev, sizeof(*csi), GFP_KERNEL);
1265 if (!csi)
1266 return -ENOMEM;
1267
1268 csi->dev = dev;
1269 csi->pdata = of_device_get_match_data(dev);
1270 platform_set_drvdata(pdev, csi);
1271
1272 ret = dw_mipi_csi_parse_dt(csi);
1273 if (ret) {
1274 dev_err(dev, "failed to parse DT\n");
1275 return ret;
1276 }
1277
1278 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "csi_regs");
1279 csi->regs = devm_ioremap_resource(dev, res);
1280 if (IS_ERR(csi->regs))
1281 return PTR_ERR(csi->regs);
1282 csi->regs_len = resource_size(res);
1283 csi->regsbak = NULL;
1284
1285 res = platform_get_resource_byname(pdev,
1286 IORESOURCE_MEM, "test_code_regs");
1287 if (res) {
1288 csi->test_code_regs = devm_ioremap_resource(dev, res);
1289 if (IS_ERR(csi->test_code_regs))
1290 dev_err(dev, "Unable to get test_code_regs\n");
1291 }
1292
1293 csi->irq = platform_get_irq(pdev, 0);
1294 if (csi->irq < 0) {
1295 dev_err(dev, "Failed to ger csi tx irq\n");
1296 return -EINVAL;
1297 }
1298
1299 csi->pclk = devm_clk_get(dev, "pclk");
1300 if (IS_ERR(csi->pclk)) {
1301 ret = PTR_ERR(csi->pclk);
1302 dev_err(dev, "Unable to get pclk: %d\n", ret);
1303 return ret;
1304 }
1305
1306 csi->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
1307 if (IS_ERR(csi->grf)) {
1308 dev_err(dev, "Unable to get rockchip,grf\n");
1309 csi->grf = NULL;
1310 }
1311
1312 for (i = 0; i < csi->pdata->rsts_num; i++) {
1313 struct reset_control *rst =
1314 devm_reset_control_get(dev, csi->pdata->rsts[i]);
1315 if (IS_ERR(rst)) {
1316 dev_err(dev, "failed to get %s\n", csi->pdata->rsts[i]);
1317 return PTR_ERR(rst);
1318 }
1319 csi->tx_rsts[i] = rst;
1320 }
1321
1322 ret = rockchip_mipi_dphy_attach(csi);
1323 if (ret)
1324 return ret;
1325
1326 ret = devm_request_irq(dev, csi->irq, rockchip_mipi_csi_irq_handler,
1327 IRQF_SHARED, dev_name(dev), csi);
1328 if (ret) {
1329 dev_err(dev, "failed to request irq: %d\n", ret);
1330 return ret;
1331 }
1332
1333 csi->dsi_host.ops = &rockchip_mipi_csi_host_ops;
1334 csi->dsi_host.dev = dev;
1335
1336 ret = mipi_dsi_host_register(&csi->dsi_host);
1337 if (ret)
1338 return ret;
1339
1340 ret = component_add(dev, &rockchip_mipi_csi_ops);
1341 if (ret)
1342 mipi_dsi_host_unregister(&csi->dsi_host);
1343
1344 if (!of_property_read_u32(np, "csi-tx-bypass-mode", &val))
1345 csi->path_mode = val;
1346
1347 return ret;
1348 }
1349
rockchip_mipi_csi_remove(struct platform_device * pdev)1350 static int rockchip_mipi_csi_remove(struct platform_device *pdev)
1351 {
1352 struct rockchip_mipi_csi *csi = dev_get_drvdata(&pdev->dev);
1353
1354 if (csi)
1355 mipi_dsi_host_unregister(&csi->dsi_host);
1356 component_del(&pdev->dev, &rockchip_mipi_csi_ops);
1357 return 0;
1358 }
1359
1360 static const u32 rk1808_csi_grf_reg_fields[MAX_FIELDS] = {
1361 [DPHY_SEL] = GRF_REG_FIELD(0x0440, 8, 8),
1362 [TXSKEWCALHS] = GRF_REG_FIELD(0x0444, 11, 15),
1363 [FORCETXSTOPMODE] = GRF_REG_FIELD(0x0444, 7, 10),
1364 [FORCERXMODE] = GRF_REG_FIELD(0x0444, 6, 6),
1365 [TURNDISABLE] = GRF_REG_FIELD(0x0444, 5, 5),
1366 };
1367
1368 static const char * const rk1808_csi_tx_rsts[] = {
1369 "tx_apb",
1370 "tx_bytehs",
1371 "tx_esc",
1372 "tx_cam",
1373 "tx_i",
1374 };
1375
1376 static const struct rockchip_mipi_csi_plat_data rk1808_socdata = {
1377 .csi0_grf_reg_fields = rk1808_csi_grf_reg_fields,
1378 .max_bit_rate_per_lane = 2000000000UL,
1379 .soc_type = RK1808,
1380 .rsts = rk1808_csi_tx_rsts,
1381 .rsts_num = ARRAY_SIZE(rk1808_csi_tx_rsts),
1382 };
1383
1384 static const struct of_device_id rockchip_mipi_csi_dt_ids[] = {
1385 { .compatible = "rockchip,rk1808-mipi-csi", .data = &rk1808_socdata, },
1386 { /* sentinel */ }
1387 };
1388 MODULE_DEVICE_TABLE(of, rockchip_mipi_csi_dt_ids);
1389
1390 static struct platform_driver rockchip_mipi_csi_driver = {
1391 .probe = rockchip_mipi_csi_probe,
1392 .remove = rockchip_mipi_csi_remove,
1393 .driver = {
1394 .of_match_table = rockchip_mipi_csi_dt_ids,
1395 .name = DRIVER_NAME,
1396 },
1397 };
1398 module_platform_driver(rockchip_mipi_csi_driver);
1399
1400 MODULE_DESCRIPTION("ROCKCHIP MIPI CSI TX controller driver");
1401 MODULE_AUTHOR("Sandy huang <hjc@rock-chips.com>");
1402 MODULE_LICENSE("GPL");
1403 MODULE_ALIAS("platform:" DRIVER_NAME);
1404