xref: /rk3399_rockchip-uboot/drivers/video/drm/rockchip_rgb.c (revision f1fc975dacf3d9cf751d82fdb6f9d48b37aa9c65)
1 /*
2  * (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd
3  *
4  * SPDX-License-Identifier:	GPL-2.0+
5  */
6 
7 #include <common.h>
8 #include <errno.h>
9 #include <syscon.h>
10 #include <regmap.h>
11 #include <dm/device.h>
12 #include <dm/read.h>
13 #include <linux/media-bus-format.h>
14 
15 #include "rockchip_display.h"
16 #include "rockchip_crtc.h"
17 #include "rockchip_connector.h"
18 
19 #define PX30_GRF_PD_VO_CON1	0x0438
20 #define PX30_LCDC_DCLK_INV(v)	HIWORD_UPDATE(v, 4, 4)
21 #define PX30_RGB_SYNC_BYPASS(v)	HIWORD_UPDATE(v, 3, 3)
22 #define PX30_RGB_VOP_SEL(v)	HIWORD_UPDATE(v, 2, 2)
23 
24 struct rockchip_rgb_priv {
25 	struct regmap *grf;
26 };
27 
28 static int rockchip_rgb_enable(struct display_state *state)
29 {
30 	struct connector_state *conn_state = &state->conn_state;
31 	struct rockchip_rgb_priv *priv = dev_get_priv(conn_state->dev);
32 	struct crtc_state *crtc_state = &state->crtc_state;
33 	int pipe = crtc_state->crtc_id;
34 
35 	if (!IS_ERR_OR_NULL(priv->grf)) {
36 		regmap_write(priv->grf, PX30_GRF_PD_VO_CON1,
37 			     PX30_RGB_VOP_SEL(pipe));
38 		regmap_write(priv->grf, PX30_GRF_PD_VO_CON1,
39 			     PX30_RGB_SYNC_BYPASS(1));
40 	}
41 
42 	return 0;
43 }
44 
45 static int rockchip_rgb_disable(struct display_state *state)
46 {
47 	return 0;
48 }
49 
50 static int rockchip_rgb_init(struct display_state *state)
51 {
52 	struct connector_state *conn_state = &state->conn_state;
53 
54 	conn_state->type = DRM_MODE_CONNECTOR_LVDS;
55 	conn_state->color_space = V4L2_COLORSPACE_DEFAULT;
56 
57 	switch (conn_state->bus_format) {
58 	case MEDIA_BUS_FMT_RGB666_1X18:
59 		conn_state->output_mode = ROCKCHIP_OUT_MODE_P666;
60 		break;
61 	case MEDIA_BUS_FMT_RGB565_1X16:
62 		conn_state->output_mode = ROCKCHIP_OUT_MODE_P565;
63 		break;
64 	case MEDIA_BUS_FMT_RGB888_1X24:
65 	case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
66 	default:
67 		conn_state->output_mode = ROCKCHIP_OUT_MODE_P888;
68 		break;
69 	}
70 
71 	return 0;
72 }
73 
74 static const struct rockchip_connector_funcs rockchip_rgb_funcs = {
75 	.init = rockchip_rgb_init,
76 	.enable = rockchip_rgb_enable,
77 	.disable = rockchip_rgb_disable,
78 };
79 
80 static int rockchip_rgb_probe(struct udevice *dev)
81 {
82 	struct rockchip_rgb_priv *priv = dev_get_priv(dev);
83 
84 	priv->grf = syscon_get_regmap(dev_get_parent(dev));
85 
86 	return 0;
87 }
88 
89 static const struct rockchip_connector rockchip_rgb_data = {
90 	 .funcs = &rockchip_rgb_funcs,
91 };
92 
93 static const struct udevice_id rockchip_rgb_ids[] = {
94 	{
95 		.compatible = "rockchip,px30-rgb",
96 		.data = (ulong)&rockchip_rgb_data,
97 	},
98 	{
99 		.compatible = "rockchip,rk3066-rgb",
100 		.data = (ulong)&rockchip_rgb_data,
101 	},
102 	{
103 		.compatible = "rockchip,rk3308-rgb",
104 		.data = (ulong)&rockchip_rgb_data,
105 	},
106 	{
107 		.compatible = "rockchip,rv1108-rgb",
108 		.data = (ulong)&rockchip_rgb_data,
109 	},
110 	{}
111 };
112 
113 U_BOOT_DRIVER(rockchip_rgb) = {
114 	.name = "rockchip_rgb",
115 	.id = UCLASS_DISPLAY,
116 	.of_match = rockchip_rgb_ids,
117 	.probe = rockchip_rgb_probe,
118 	.priv_auto_alloc_size = sizeof(struct rockchip_rgb_priv),
119 };
120