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