1 /* 2 * (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #include <config.h> 8 #include <common.h> 9 #include <errno.h> 10 #include <malloc.h> 11 #include <fdtdec.h> 12 #include <fdt_support.h> 13 #include <asm/unaligned.h> 14 #include <linux/list.h> 15 #include <dm/device.h> 16 17 #include "rockchip_display.h" 18 #include "rockchip_crtc.h" 19 #include "rockchip_connector.h" 20 #include "rockchip_panel.h" 21 22 static const struct drm_display_mode auo_b125han03_mode = { 23 .clock = 146900, 24 .hdisplay = 1920, 25 .hsync_start = 1920 + 48, 26 .hsync_end = 1920 + 48 + 32, 27 .htotal = 1920 + 48 + 32 + 140, 28 .vdisplay = 1080, 29 .vsync_start = 1080 + 2, 30 .vsync_end = 1080 + 2 + 5, 31 .vtotal = 1080 + 2 + 5 + 57, 32 .vrefresh = 60, 33 .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC, 34 }; 35 36 static const struct drm_display_mode lg_lp079qx1_sp0v_mode = { 37 .clock = 200000, 38 .hdisplay = 1536, 39 .hsync_start = 1536 + 12, 40 .hsync_end = 1536 + 12 + 16, 41 .htotal = 1536 + 12 + 16 + 48, 42 .vdisplay = 2048, 43 .vsync_start = 2048 + 8, 44 .vsync_end = 2048 + 8 + 4, 45 .vtotal = 2048 + 8 + 4 + 8, 46 .vrefresh = 60, 47 .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC, 48 }; 49 #if 0 50 static const struct rockchip_panel simple_panel_data = { 51 .funcs = &panel_simple_funcs, 52 }; 53 #endif 54 55 static const struct rockchip_panel simple_panel_dsi_data = { 56 .funcs = &rockchip_dsi_panel_funcs, 57 }; 58 #if 0 59 static const struct rockchip_panel lg_lp079qx1_sp0v_data = { 60 .funcs = &panel_simple_funcs, 61 .data = &lg_lp079qx1_sp0v_mode, 62 }; 63 64 static const struct rockchip_panel auo_b125han03_data = { 65 .funcs = &panel_simple_funcs, 66 .data = &auo_b125han03_mode, 67 }; 68 #endif 69 70 static const struct udevice_id rockchip_panel_ids[] = { 71 #if 0 72 }, { 73 .compatible = "simple-panel", 74 .funcs = &simple_panel_data, 75 }, 76 #endif 77 { 78 .compatible = "simple-panel-dsi", 79 .data = (ulong)&simple_panel_dsi_data, 80 }, 81 #if 0 82 { 83 .compatible = "lg,lp079qx1-sp0v", 84 .funcs = &lg_lp079qx1_sp0v_data, 85 }, { 86 .compatible = "auo,b125han03", 87 .funcs = &auo_b125han03_data, 88 }, 89 #endif 90 {} 91 }; 92 93 static int rockchip_panel_probe(struct udevice *dev) 94 { 95 printf("--->yzq %s %d\n", __func__, __LINE__); 96 return 0; 97 } 98 99 static int rockchip_panel_bind(struct udevice *dev) 100 { 101 printf("--->yzq %s %d\n", __func__, __LINE__); 102 return 0; 103 } 104 105 106 U_BOOT_DRIVER(rockchip_panel) = { 107 .name = "rockchip_panel", 108 .id = UCLASS_PANEL, 109 .of_match = rockchip_panel_ids, 110 .bind = rockchip_panel_bind, 111 .probe = rockchip_panel_probe, 112 }; 113 114 const struct drm_display_mode * 115 rockchip_get_display_mode_from_panel(struct display_state *state) 116 { 117 struct panel_state *panel_state = &state->panel_state; 118 const struct rockchip_panel *panel = panel_state->panel; 119 120 if (!panel || !panel->data) 121 return NULL; 122 123 return (const struct drm_display_mode *)panel->data; 124 } 125 126 #if 0 127 const struct rockchip_panel *rockchip_get_panel(const void *blob, int node) 128 { 129 const char *name; 130 int i; 131 132 name = fdt_stringlist_get(blob, node, "compatible", 0, NULL); 133 134 for (i = 0; i < ARRAY_SIZE(g_panel); i++) 135 if (!strcmp(name, g_panel[i].compatible)) 136 break; 137 138 if (i >= ARRAY_SIZE(g_panel)) 139 return NULL; 140 141 return &g_panel[i]; 142 } 143 #endif 144 145 int rockchip_panel_init(struct display_state *state) 146 { 147 struct panel_state *panel_state = &state->panel_state; 148 const struct rockchip_panel *panel = panel_state->panel; 149 150 if (!panel || !panel->funcs || !panel->funcs->init) { 151 printf("%s: failed to find panel init funcs\n", __func__); 152 return -ENODEV; 153 } 154 155 return panel->funcs->init(state); 156 } 157 158 void rockchip_panel_deinit(struct display_state *state) 159 { 160 struct panel_state *panel_state = &state->panel_state; 161 const struct rockchip_panel *panel = panel_state->panel; 162 163 if (!panel || !panel->funcs || !panel->funcs->deinit) { 164 printf("%s: failed to find panel deinit funcs\n", __func__); 165 return; 166 } 167 168 panel->funcs->deinit(state); 169 } 170 171 int rockchip_panel_prepare(struct display_state *state) 172 { 173 struct panel_state *panel_state = &state->panel_state; 174 const struct rockchip_panel *panel = panel_state->panel; 175 176 printf("--->yzq %s %d\n", __func__, __LINE__); 177 if (!panel || !panel->funcs || !panel->funcs->prepare) { 178 printf("--->yzq %s %d panel=%p\n", __func__, __LINE__, panel); 179 printf("--->yzq %s %d panel->funcs=%p\n", __func__, __LINE__, panel->funcs); 180 printf("--->yzq %s %d panel->funcs->prepare=%p\n", __func__, __LINE__, panel->funcs->prepare); 181 printf("%s: failed to find panel prepare funcs\n", __func__); 182 return -ENODEV; 183 } 184 printf("--->yzq %s %d\n", __func__, __LINE__); 185 186 return panel->funcs->prepare(state); 187 } 188 189 int rockchip_panel_unprepare(struct display_state *state) 190 { 191 struct panel_state *panel_state = &state->panel_state; 192 const struct rockchip_panel *panel = panel_state->panel; 193 194 if (!panel || !panel->funcs || !panel->funcs->unprepare) { 195 printf("%s: failed to find panel unprepare funcs\n", __func__); 196 return -ENODEV; 197 } 198 199 return panel->funcs->unprepare(state); 200 } 201 202 int rockchip_panel_enable(struct display_state *state) 203 { 204 struct panel_state *panel_state = &state->panel_state; 205 const struct rockchip_panel *panel = panel_state->panel; 206 207 if (!panel || !panel->funcs || !panel->funcs->enable) { 208 printf("%s: failed to find panel prepare funcs\n", __func__); 209 return -ENODEV; 210 } 211 212 return panel->funcs->enable(state); 213 } 214 215 int rockchip_panel_disable(struct display_state *state) 216 { 217 struct panel_state *panel_state = &state->panel_state; 218 const struct rockchip_panel *panel = panel_state->panel; 219 220 if (!panel || !panel->funcs || !panel->funcs->disable) { 221 printf("%s: failed to find panel disable funcs\n", __func__); 222 return -ENODEV; 223 } 224 225 return panel->funcs->disable(state); 226 } 227