hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/gpu/drm/bridge/rk630-tve.c
....@@ -15,7 +15,7 @@
1515 #include <drm/drm_atomic_helper.h>
1616 #include <drm/drm_crtc_helper.h>
1717 #include <drm/drm_of.h>
18
-#include <drm/drmP.h>
18
+#include <drm/drm_probe_helper.h>
1919
2020 #include "../rockchip/rockchip_drm_drv.h"
2121
....@@ -24,12 +24,12 @@
2424 816, 864, 0, 576, 580, 586, 625, 0,
2525 DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
2626 DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
27
- .vrefresh = 50, 0, },
27
+ 0, },
2828 { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, 720, 753,
2929 815, 858, 0, 480, 483, 489, 525, 0,
3030 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
3131 DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
32
- .vrefresh = 60, 0, },
32
+ 0, },
3333 };
3434
3535 struct rk630_tve {
....@@ -59,6 +59,7 @@
5959 };
6060
6161 static struct env_config ntsc_bt656_config[] = {
62
+ { BT656_DECODER_CTRL, 0x00000001 },
6263 { BT656_DECODER_CROP, 0x00000000 },
6364 { BT656_DECODER_SIZE, 0x01e002d0 },
6465 { BT656_DECODER_HTOTAL_HS_END, 0x035a003e },
....@@ -66,7 +67,6 @@
6667 { BT656_DECODER_VTOTAL_VS_END, 0x020d0003 },
6768 { BT656_DECODER_VS_ST_END_F1, 0x01060109 },
6869 { BT656_DECODER_DBG_REG, 0x024002d0 },
69
- { BT656_DECODER_CTRL, 0x00000001 },
7070 };
7171
7272 static struct env_config ntsc_tve_config[] = {
....@@ -100,6 +100,7 @@
100100 };
101101
102102 static struct env_config pal_bt656_config[] = {
103
+ { BT656_DECODER_CTRL, 0x00000001 },
103104 { BT656_DECODER_CROP, 0x00000000 },
104105 { BT656_DECODER_SIZE, 0x024002d0 },
105106 { BT656_DECODER_HTOTAL_HS_END, 0x0360003f },
....@@ -107,7 +108,6 @@
107108 { BT656_DECODER_VTOTAL_VS_END, 0x02710003 },
108109 { BT656_DECODER_VS_ST_END_F1, 0x0138013b },
109110 { BT656_DECODER_DBG_REG, 0x024002d0 },
110
- { BT656_DECODER_CTRL, 0x00000001 },
111111 };
112112
113113 static struct env_config pal_tve_config[] = {
....@@ -125,16 +125,16 @@
125125 { TVE_LUMA_FILTER7, 0x0ffa0e43 },
126126 { TVE_LUMA_FILTER8, 0x08200527 },
127127 { TVE_IMAGE_POSITION, 0x001500f6 },
128
- { TVE_ROUTING, 0x10008882 },
128
+ { TVE_ROUTING, 0x1000088a },
129129 { TVE_SYNC_ADJUST, 0x00000000 },
130130 { TVE_STATUS, 0x000000b0 },
131131 { TVE_CTRL, 0x00000000 },
132132 { TVE_INTR_STATUS, 0x00000000 },
133133 { TVE_INTR_EN, 0x00000000 },
134134 { TVE_INTR_CLR, 0x00000000 },
135
- { TVE_COLOR_BUSRT_SAT, 0x00366044 },
135
+ { TVE_COLOR_BUSRT_SAT, 0x002e553c },
136136 { TVE_CHROMA_BANDWIDTH, 0x00000022 },
137
- { TVE_BRIGHTNESS_CONTRAST, 0x0000a300 },
137
+ { TVE_BRIGHTNESS_CONTRAST, 0x00008900 },
138138 { TVE_ID, 0x0a010000 },
139139 { TVE_REVISION, 0x00010108 },
140140 { TVE_CLAMP, 0x00000000 },
....@@ -164,6 +164,7 @@
164164 .val_format_endian = REGMAP_ENDIAN_NATIVE,
165165 .rd_table = &rk630_tve_readable_table,
166166 };
167
+EXPORT_SYMBOL_GPL(rk630_tve_regmap_config);
167168
168169 static struct rk630_tve *bridge_to_tve(struct drm_bridge *bridge)
169170 {
....@@ -194,7 +195,6 @@
194195 {
195196 int ret;
196197 struct env_config *bt656_cfg, *tve_cfg;
197
- int upsample_en = tve->is_4x ? 1 : 0;
198198
199199 switch (tve->mode) {
200200 case CVBS_PAL:
....@@ -225,7 +225,7 @@
225225 SW_DCLK_UPSAMPLE_EN_MASK |
226226 SW_TVE_MODE_MASK | SW_TVE_EN_MASK,
227227 SW_TVE_DCLK_POL(0) | SW_TVE_DCLK_EN(1) |
228
- SW_DCLK_UPSAMPLE_EN(upsample_en) |
228
+ SW_DCLK_UPSAMPLE_EN(tve->is_4x) |
229229 SW_TVE_MODE(1) | SW_TVE_EN(1));
230230 else
231231 regmap_update_bits(tve->grf, PLUMAGE_GRF_SOC_CON0,
....@@ -234,12 +234,8 @@
234234 SW_DCLK_UPSAMPLE_EN_MASK |
235235 SW_TVE_MODE_MASK | SW_TVE_EN_MASK,
236236 SW_TVE_DCLK_POL(0) | SW_TVE_DCLK_EN(1) |
237
- SW_DCLK_UPSAMPLE_EN(upsample_en) |
237
+ SW_DCLK_UPSAMPLE_EN(tve->is_4x) |
238238 SW_TVE_MODE(0) | SW_TVE_EN(1));
239
-
240
- regmap_update_bits(tve->grf, PLUMAGE_GRF_SOC_CON3,
241
- DCLK_UPSAMPLE_2X4X_MASK,
242
- DCLK_UPSAMPLE_2X4X(tve->is_4x - 1));
243239
244240 ret = rk630_tve_write_block(tve, tve_cfg, 27);
245241 if (ret < 0) {
....@@ -260,15 +256,16 @@
260256
261257 static int rk630_tve_enable(struct rk630_tve *tve)
262258 {
263
- int ret;
259
+ int ret, i;
260
+ u32 val = 0;
264261
265262 dev_dbg(tve->dev, "%s\n", __func__);
266263
267264 /* config bt656 input gpio*/
268265 regmap_write(tve->grf, PLUMAGE_GRF_GPIO0A_IOMUX, 0x55555555);
269266
270
- regmap_update_bits(tve->grf, PLUMAGE_GRF_GPIO0B_IOMUX, PIN0_SEL_MASK,
271
- PIN0_SEL(1));
267
+ regmap_update_bits(tve->grf, PLUMAGE_GRF_GPIO0B_IOMUX, GPIO0B0_SEL_MASK,
268
+ GPIO0B0_SEL(1));
272269
273270 regmap_update_bits(tve->grf, PLUMAGE_GRF_SOC_CON3, VDAC_ENDAC0_MASK,
274271 VDAC_ENDAC0(0));
....@@ -279,21 +276,31 @@
279276
280277 /*config clk*/
281278 if (!tve->is_4x) {
282
- regmap_update_bits(tve->cru, CRU_GATE_CON0,
283
- DCLK_CVBS_4X_PLL_CLK_GATE_MASK,
284
- DCLK_CVBS_4X_PLL_CLK_GATE(1));
279
+ regmap_update_bits(tve->cru, CRU_MODE_CON, CLK_SPLL_MODE_MASK,
280
+ CLK_SPLL_MODE(2));
285281 } else {
286
- regmap_update_bits(tve->cru, CRU_CLKSEL_CON1,
287
- DCLK_CVBS_4X_DIV_CON_MASK,
288
- DCLK_CVBS_4X_DIV_CON(0));
282
+ regmap_update_bits(tve->cru, CRU_SPLL_CON1, PLLPD0_MASK,
283
+ PLLPD0(1));
289284
290
- regmap_update_bits(tve->cru, CRU_GATE_CON0,
291
- DCLK_CVBS_4X_PLL_CLK_GATE_MASK,
292
- DCLK_CVBS_4X_PLL_CLK_GATE(0));
285
+ regmap_update_bits(tve->cru, CRU_MODE_CON, CLK_SPLL_MODE_MASK,
286
+ CLK_SPLL_MODE(1));
287
+
288
+ regmap_update_bits(tve->cru, CRU_SPLL_CON1, PLLPD0_MASK,
289
+ PLLPD0(0));
290
+
291
+ for (i = 0; i < 10; i++) {
292
+ usleep_range(1000, 2000);
293
+ regmap_read(tve->cru, CRU_SPLL_CON1, &val);
294
+ if (val & PLL_LOCK) {
295
+ dev_dbg(tve->dev, "rk630 pll locked\n");
296
+ break;
297
+ }
298
+ }
299
+ if (!(val & PLL_LOCK)) {
300
+ dev_err(tve->dev, "rk630 pll unlock\n");
301
+ return -EINVAL;
302
+ }
293303 }
294
-
295
- /* set vdac gain */
296
- regmap_write(tve->grf, PLUMAGE_GRF_SOC_CON3, 0x003f003f);
297304
298305 /* enable vdac */
299306 regmap_update_bits(tve->grf, PLUMAGE_GRF_SOC_CON3,
....@@ -369,8 +376,8 @@
369376
370377 static void
371378 rk630_tve_bridge_mode_set(struct drm_bridge *bridge,
372
- struct drm_display_mode *mode,
373
- struct drm_display_mode *adjusted_mode)
379
+ const struct drm_display_mode *mode,
380
+ const struct drm_display_mode *adjusted_mode)
374381 {
375382 struct rk630_tve *tve;
376383
....@@ -401,7 +408,8 @@
401408 rk630_tve_disable(tve);
402409 }
403410
404
-static int rk630_tve_bridge_attach(struct drm_bridge *bridge)
411
+static int rk630_tve_bridge_attach(struct drm_bridge *bridge,
412
+ enum drm_bridge_attach_flags flags)
405413 {
406414 struct rk630_tve *tve = bridge_to_tve(bridge);
407415 int ret;
....@@ -455,7 +463,6 @@
455463 struct rk630 *rk630 = dev_get_drvdata(pdev->dev.parent);
456464 struct rk630_tve *tve;
457465 struct device *dev = &pdev->dev;
458
- int ret;
459466
460467 if (!of_device_is_available(dev->of_node))
461468 return -ENODEV;
....@@ -473,11 +480,6 @@
473480 tve->tvemap = rk630->tve;
474481 if (!tve->grf | !tve->cru | !tve->tvemap)
475482 return -ENODEV;
476
-
477
- ret = device_property_read_u32(dev, "rockchip,tve-upsample",
478
- &tve->is_4x);
479
- if (ret < 0)
480
- tve->is_4x = 0;
481483
482484 tve->mode = CVBS_PAL;
483485