Stefan Bosch | 48397f1 | 2020-07-10 19:07:25 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0+ |
| 2 | * |
| 3 | * Copyright (C) 2016 Nexell Co., Ltd. |
| 4 | * |
| 5 | * Author: junghyun, kim <jhkim@nexell.co.kr> |
| 6 | */ |
| 7 | |
| 8 | #ifndef _NX__DISPLAY_H_ |
| 9 | #define _NX__DISPLAY_H_ |
| 10 | |
| 11 | #define DP_PLANS_NUM 3 |
| 12 | |
| 13 | /* the display output format. */ |
| 14 | #define DPC_FORMAT_RGB555 0 /* RGB555 Format */ |
| 15 | #define DPC_FORMAT_RGB565 1 /* RGB565 Format */ |
| 16 | #define DPC_FORMAT_RGB666 2 /* RGB666 Format */ |
| 17 | #define DPC_FORMAT_RGB888 3 /* RGB888 Format */ |
| 18 | #define DPC_FORMAT_MRGB555A 4 /* MRGB555A Format */ |
| 19 | #define DPC_FORMAT_MRGB555B 5 /* MRGB555B Format */ |
| 20 | #define DPC_FORMAT_MRGB565 6 /* MRGB565 Format */ |
| 21 | #define DPC_FORMAT_MRGB666 7 /* MRGB666 Format */ |
| 22 | #define DPC_FORMAT_MRGB888A 8 /* MRGB888A Format */ |
| 23 | #define DPC_FORMAT_MRGB888B 9 /* MRGB888B Format */ |
| 24 | #define DPC_FORMAT_CCIR656 10 /* ITU-R BT.656 / 601(8-bit) */ |
| 25 | #define DPC_FORMAT_CCIR601A 12 /* ITU-R BT.601A */ |
| 26 | #define DPC_FORMAT_CCIR601B 13 /* ITU-R BT.601B */ |
| 27 | #define DPC_FORMAT_4096COLOR 1 /* 4096 Color Format */ |
| 28 | #define DPC_FORMAT_16GRAY 3 /* 16 Level Gray Format */ |
| 29 | |
| 30 | /* layer pixel format. */ |
| 31 | #define MLC_RGBFMT_R5G6B5 0x44320000 /* {R5,G6,B5 }. */ |
| 32 | #define MLC_RGBFMT_B5G6R5 0xC4320000 /* {B5,G6,R5 }. */ |
| 33 | #define MLC_RGBFMT_X1R5G5B5 0x43420000 /* {X1,R5,G5,B5}. */ |
| 34 | #define MLC_RGBFMT_X1B5G5R5 0xC3420000 /* {X1,B5,G5,R5}. */ |
| 35 | #define MLC_RGBFMT_X4R4G4B4 0x42110000 /* {X4,R4,G4,B4}. */ |
| 36 | #define MLC_RGBFMT_X4B4G4R4 0xC2110000 /* {X4,B4,G4,R4}. */ |
| 37 | #define MLC_RGBFMT_X8R3G3B2 0x41200000 /* {X8,R3,G3,B2}. */ |
| 38 | #define MLC_RGBFMT_X8B3G3R2 0xC1200000 /* {X8,B3,G3,R2}. */ |
| 39 | #define MLC_RGBFMT_A1R5G5B5 0x33420000 /* {A1,R5,G5,B5}. */ |
| 40 | #define MLC_RGBFMT_A1B5G5R5 0xB3420000 /* {A1,B5,G5,R5}. */ |
| 41 | #define MLC_RGBFMT_A4R4G4B4 0x22110000 /* {A4,R4,G4,B4}. */ |
| 42 | #define MLC_RGBFMT_A4B4G4R4 0xA2110000 /* {A4,B4,G4,R4}. */ |
| 43 | #define MLC_RGBFMT_A8R3G3B2 0x11200000 /* {A8,R3,G3,B2}. */ |
| 44 | #define MLC_RGBFMT_A8B3G3R2 0x91200000 /* {A8,B3,G3,R2}. */ |
| 45 | #define MLC_RGBFMT_R8G8B8 0x46530000 /* {R8,G8,B8 }. */ |
| 46 | #define MLC_RGBFMT_B8G8R8 0xC6530000 /* {B8,G8,R8 }. */ |
| 47 | #define MLC_RGBFMT_X8R8G8B8 0x46530000 /* {X8,R8,G8,B8}. */ |
| 48 | #define MLC_RGBFMT_X8B8G8R8 0xC6530000 /* {X8,B8,G8,R8}. */ |
| 49 | #define MLC_RGBFMT_A8R8G8B8 0x06530000 /* {A8,R8,G8,B8}. */ |
| 50 | #define MLC_RGBFMT_A8B8G8R8 0x86530000 /* {A8,B8,G8,R8}. */ |
| 51 | |
| 52 | /* the data output order in case of ITU-R BT.656 / 601. */ |
| 53 | #define DPC_YCORDER_CBYCRY 0 |
| 54 | #define DPC_YCORDER_CRYCBY 1 |
| 55 | #define DPC_YCORDER_YCBYCR 2 |
| 56 | #define DPC_YCORDER_YCRYCB 3 |
| 57 | |
| 58 | /* the PAD output clock. */ |
| 59 | #define DPC_PADCLKSEL_VCLK 0 /* VCLK */ |
| 60 | #define DPC_PADCLKSEL_VCLK2 1 /* VCLK2 */ |
| 61 | |
| 62 | /* display sync info for DPC */ |
| 63 | struct dp_sync_info { |
| 64 | int interlace; |
| 65 | int h_active_len; |
| 66 | int h_sync_width; |
| 67 | int h_back_porch; |
| 68 | int h_front_porch; |
| 69 | int h_sync_invert; /* default active low */ |
| 70 | int v_active_len; |
| 71 | int v_sync_width; |
| 72 | int v_back_porch; |
| 73 | int v_front_porch; |
| 74 | int v_sync_invert; /* default active low */ |
| 75 | int pixel_clock_hz; /* HZ */ |
| 76 | }; |
| 77 | |
| 78 | /* syncgen control (DPC) */ |
| 79 | #define DP_SYNC_DELAY_RGB_PVD (1 << 0) |
| 80 | #define DP_SYNC_DELAY_HSYNC_CP1 (1 << 1) |
| 81 | #define DP_SYNC_DELAY_VSYNC_FRAM (1 << 2) |
| 82 | #define DP_SYNC_DELAY_DE_CP (1 << 3) |
| 83 | |
| 84 | struct dp_ctrl_info { |
| 85 | /* clock gen */ |
| 86 | int clk_src_lv0; |
| 87 | int clk_div_lv0; |
| 88 | int clk_src_lv1; |
| 89 | int clk_div_lv1; |
| 90 | /* scan format */ |
| 91 | int interlace; |
| 92 | /* syncgen format */ |
| 93 | unsigned int out_format; |
| 94 | int invert_field; /* 0:normal(Low odd), 1:invert (low even) */ |
| 95 | int swap_RB; |
| 96 | unsigned int yc_order; /* for CCIR output */ |
| 97 | /* extern sync delay */ |
| 98 | int delay_mask; /* if 0, set defalut delays */ |
| 99 | int d_rgb_pvd; /* delay for RGB/PVD, 0~16, default 0 */ |
| 100 | int d_hsync_cp1; /* delay for HSYNC/CP1, 0~63, default 12 */ |
| 101 | int d_vsync_fram; /* delay for VSYNC/FRAM, 0~63, default 12 */ |
| 102 | int d_de_cp2; /* delay for DE/CP2, 0~63, default 12 */ |
| 103 | /* sync offset */ |
| 104 | int vs_start_offset; /* start vsync offset, defatult 0 */ |
| 105 | int vs_end_offset; /* end vsync offset, default 0 */ |
| 106 | int ev_start_offset; /* start even vsync offset, default 0 */ |
| 107 | int ev_end_offset; /* end even vsync offset , default 0 */ |
| 108 | /* pad clock seletor */ |
| 109 | int vck_select; /* 0=vclk0, 1=vclk2 */ |
| 110 | int clk_inv_lv0; /* OUTCLKINVn */ |
| 111 | int clk_delay_lv0; /* OUTCLKDELAYn */ |
| 112 | int clk_inv_lv1; /* OUTCLKINVn */ |
| 113 | int clk_delay_lv1; /* OUTCLKDELAYn */ |
| 114 | int clk_sel_div1; /* 0=clk1_inv, 1=clk1_div_2_ns */ |
| 115 | }; |
| 116 | |
| 117 | /* multi layer control (MLC) */ |
| 118 | struct dp_plane_top { |
| 119 | int screen_width; |
| 120 | int screen_height; |
| 121 | int video_prior; /* 0: video>RGBn, 1: RGB0>video>RGB1, |
| 122 | * 2: RGB0 > RGB1 > video .. */ |
| 123 | int interlace; |
| 124 | int plane_num; |
| 125 | unsigned int back_color; |
| 126 | }; |
| 127 | |
| 128 | struct dp_plane_info { |
| 129 | int layer; |
| 130 | unsigned int fb_base; |
| 131 | int left; |
| 132 | int top; |
| 133 | int width; |
| 134 | int height; |
| 135 | int pixel_byte; |
| 136 | unsigned int format; |
| 137 | int alpha_on; |
| 138 | int alpha_depth; |
| 139 | int tp_on; /* transparency color enable */ |
| 140 | unsigned int tp_color; |
| 141 | unsigned int mem_lock_size; /* memory burst access (4,8,16) */ |
| 142 | int video_layer; |
| 143 | int enable; |
| 144 | }; |
| 145 | |
| 146 | /* |
| 147 | * LCD device dependency struct |
| 148 | * RGB, LVDS, MiPi, HDMI |
| 149 | */ |
| 150 | enum { |
| 151 | DP_DEVICE_RESCONV = 0, |
| 152 | DP_DEVICE_RGBLCD = 1, |
| 153 | DP_DEVICE_HDMI = 2, |
| 154 | DP_DEVICE_MIPI = 3, |
| 155 | DP_DEVICE_LVDS = 4, |
| 156 | DP_DEVICE_CVBS = 5, |
| 157 | DP_DEVICE_DP0 = 6, |
| 158 | DP_DEVICE_DP1 = 7, |
| 159 | DP_DEVICE_END, |
| 160 | }; |
| 161 | |
| 162 | enum { |
| 163 | DP_CLOCK_RESCONV = 0, |
| 164 | DP_CLOCK_LCDIF = 1, |
| 165 | DP_CLOCK_MIPI = 2, |
| 166 | DP_CLOCK_LVDS = 3, |
| 167 | DP_CLOCK_HDMI = 4, |
| 168 | DP_CLOCK_END, |
| 169 | }; |
| 170 | |
| 171 | enum dp_lvds_format { |
| 172 | DP_LVDS_FORMAT_VESA = 0, |
| 173 | DP_LVDS_FORMAT_JEIDA = 1, |
| 174 | DP_LVDS_FORMAT_LOC = 2, |
| 175 | }; |
| 176 | |
| 177 | #define DEF_VOLTAGE_LEVEL (0x20) |
| 178 | |
| 179 | struct dp_lvds_dev { |
| 180 | enum dp_lvds_format lvds_format; /* 0:VESA, 1:JEIDA, 2: Location */ |
| 181 | int pol_inv_hs; /* hsync polarity invert for VESA, JEIDA */ |
| 182 | int pol_inv_vs; /* bsync polarity invert for VESA, JEIDA */ |
| 183 | int pol_inv_de; /* de polarity invert for VESA, JEIDA */ |
| 184 | int pol_inv_ck; /* input clock(pixel clock) polarity invert */ |
| 185 | int voltage_level; |
| 186 | /* Location setting */ |
| 187 | unsigned int loc_map[9]; /* Location Setting */ |
| 188 | unsigned int loc_mask[2]; /* Location Setting, 0 ~ 34 */ |
| 189 | unsigned int loc_pol[2]; /* Location Setting, 0 ~ 34 */ |
| 190 | }; |
| 191 | |
| 192 | #include "mipi_display.h" |
| 193 | |
| 194 | struct dp_mipi_dev { |
| 195 | int lp_bitrate; /* to lcd setup, low power bitrate (150, 100, 80 Mhz) */ |
| 196 | int hs_bitrate; /* to lcd data, high speed bitrate (1000, ... Mhz) */ |
| 197 | int lpm_trans; |
| 198 | int command_mode; |
| 199 | unsigned int hs_pllpms; |
| 200 | unsigned int hs_bandctl; |
| 201 | unsigned int lp_pllpms; |
| 202 | unsigned int lp_bandctl; |
| 203 | struct mipi_dsi_device dsi; |
| 204 | }; |
| 205 | |
| 206 | struct dp_rgb_dev { |
| 207 | int lcd_mpu_type; |
| 208 | }; |
| 209 | |
| 210 | struct dp_hdmi_dev { |
| 211 | int preset; |
| 212 | }; |
| 213 | |
| 214 | /* platform data for the driver model */ |
Simon Glass | b75b15b | 2020-12-03 16:55:23 -0700 | [diff] [blame] | 215 | struct nx_display_plat { |
Stefan Bosch | 48397f1 | 2020-07-10 19:07:25 +0200 | [diff] [blame] | 216 | int module; |
| 217 | struct dp_sync_info sync; |
| 218 | struct dp_ctrl_info ctrl; |
| 219 | struct dp_plane_top top; |
| 220 | struct dp_plane_info plane[DP_PLANS_NUM]; |
| 221 | int dev_type; |
| 222 | void *device; |
| 223 | }; |
| 224 | |
| 225 | /* Lcd api */ |
| 226 | void nx_lvds_display(int module, |
| 227 | struct dp_sync_info *sync, struct dp_ctrl_info *ctrl, |
| 228 | struct dp_plane_top *top, |
| 229 | struct dp_plane_info *planes, |
| 230 | struct dp_lvds_dev *dev); |
| 231 | |
| 232 | void nx_rgb_display(int module, |
| 233 | struct dp_sync_info *sync, struct dp_ctrl_info *ctrl, |
| 234 | struct dp_plane_top *top, struct dp_plane_info *planes, |
| 235 | struct dp_rgb_dev *dev); |
| 236 | |
| 237 | void nx_hdmi_display(int module, |
| 238 | struct dp_sync_info *sync, struct dp_ctrl_info *ctrl, |
| 239 | struct dp_plane_top *top, |
| 240 | struct dp_plane_info *planes, |
| 241 | struct dp_hdmi_dev *dev); |
| 242 | |
| 243 | void nx_mipi_display(int module, |
| 244 | struct dp_sync_info *sync, struct dp_ctrl_info *ctrl, |
| 245 | struct dp_plane_top *top, |
| 246 | struct dp_plane_info *planes, |
| 247 | struct dp_mipi_dev *dev); |
| 248 | |
| 249 | int nx_mipi_dsi_lcd_bind(struct mipi_dsi_device *dsi); |
| 250 | |
| 251 | /* disaply api */ |
| 252 | void dp_control_init(int module); |
| 253 | int dp_control_setup(int module, struct dp_sync_info *sync, |
| 254 | struct dp_ctrl_info *ctrl); |
| 255 | void dp_control_enable(int module, int on); |
| 256 | |
| 257 | void dp_plane_init(int module); |
| 258 | int dp_plane_screen_setup(int module, struct dp_plane_top *top); |
| 259 | void dp_plane_screen_enable(int module, int on); |
| 260 | |
| 261 | int dp_plane_layer_setup(int module, struct dp_plane_info *plane); |
| 262 | void dp_plane_layer_enable(int module, struct dp_plane_info *plane, int on); |
| 263 | |
| 264 | int dp_plane_set_enable(int module, int layer, int on); |
| 265 | int dp_plane_set_address(int module, int layer, unsigned int address); |
| 266 | int dp_plane_wait_vsync(int module, int layer, int fps); |
| 267 | |
| 268 | #if defined CONFIG_SPL_BUILD || \ |
| 269 | (!defined(CONFIG_DM) && !defined(CONFIG_OF_CONTROL)) |
Simon Glass | b75b15b | 2020-12-03 16:55:23 -0700 | [diff] [blame] | 270 | int nx_display_probe(struct nx_display_plat *plat); |
Stefan Bosch | 48397f1 | 2020-07-10 19:07:25 +0200 | [diff] [blame] | 271 | #endif |
| 272 | |
| 273 | #endif |