1 /* 2 * LCD: LG4573, TFT 4.3", 480x800, RGB24 3 * LCD initialization via SPI 4 * 5 * SPDX-License-Identifier: GPL-2.0 6 * 7 */ 8 #include <common.h> 9 #include <errno.h> 10 #include <spi.h> 11 12 #define PWR_ON_DELAY_MSECS 120 13 14 static int lb043wv_spi_write_u16(struct spi_slave *spi, u16 val) 15 { 16 unsigned long flags = SPI_XFER_BEGIN; 17 unsigned short buf16 = htons(val); 18 int ret = 0; 19 20 flags |= SPI_XFER_END; 21 22 ret = spi_xfer(spi, 16, &buf16, NULL, flags); 23 if (ret) 24 debug("%s: Failed to send: %d\n", __func__, ret); 25 26 return ret; 27 } 28 29 static void lb043wv_spi_write_u16_array(struct spi_slave *spi, u16 *buff, 30 int size) 31 { 32 int i; 33 34 for (i = 0; i < size; i++) 35 lb043wv_spi_write_u16(spi, buff[i]); 36 } 37 38 static void lb043wv_display_mode_settings(struct spi_slave *spi) 39 { 40 static u16 display_mode_settings[] = { 41 0x703A, 42 0x7270, 43 0x70B1, 44 0x7208, 45 0x723B, 46 0x720F, 47 0x70B2, 48 0x7200, 49 0x72C8, 50 0x70B3, 51 0x7200, 52 0x70B4, 53 0x7200, 54 0x70B5, 55 0x7242, 56 0x7210, 57 0x7210, 58 0x7200, 59 0x7220, 60 0x70B6, 61 0x720B, 62 0x720F, 63 0x723C, 64 0x7213, 65 0x7213, 66 0x72E8, 67 0x70B7, 68 0x7246, 69 0x7206, 70 0x720C, 71 0x7200, 72 0x7200, 73 }; 74 75 debug("transfer display mode settings\n"); 76 lb043wv_spi_write_u16_array(spi, display_mode_settings, 77 ARRAY_SIZE(display_mode_settings)); 78 } 79 80 static void lb043wv_power_settings(struct spi_slave *spi) 81 { 82 static u16 power_settings[] = { 83 0x70C0, 84 0x7201, 85 0x7211, 86 0x70C3, 87 0x7207, 88 0x7203, 89 0x7204, 90 0x7204, 91 0x7204, 92 0x70C4, 93 0x7212, 94 0x7224, 95 0x7218, 96 0x7218, 97 0x7202, 98 0x7249, 99 0x70C5, 100 0x726F, 101 0x70C6, 102 0x7241, 103 0x7263, 104 }; 105 106 debug("transfer power settings\n"); 107 lb043wv_spi_write_u16_array(spi, power_settings, 108 ARRAY_SIZE(power_settings)); 109 } 110 111 static void lb043wv_gamma_settings(struct spi_slave *spi) 112 { 113 static u16 gamma_settings[] = { 114 0x70D0, 115 0x7203, 116 0x7207, 117 0x7273, 118 0x7235, 119 0x7200, 120 0x7201, 121 0x7220, 122 0x7200, 123 0x7203, 124 0x70D1, 125 0x7203, 126 0x7207, 127 0x7273, 128 0x7235, 129 0x7200, 130 0x7201, 131 0x7220, 132 0x7200, 133 0x7203, 134 0x70D2, 135 0x7203, 136 0x7207, 137 0x7273, 138 0x7235, 139 0x7200, 140 0x7201, 141 0x7220, 142 0x7200, 143 0x7203, 144 0x70D3, 145 0x7203, 146 0x7207, 147 0x7273, 148 0x7235, 149 0x7200, 150 0x7201, 151 0x7220, 152 0x7200, 153 0x7203, 154 0x70D4, 155 0x7203, 156 0x7207, 157 0x7273, 158 0x7235, 159 0x7200, 160 0x7201, 161 0x7220, 162 0x7200, 163 0x7203, 164 0x70D5, 165 0x7203, 166 0x7207, 167 0x7273, 168 0x7235, 169 0x7200, 170 0x7201, 171 0x7220, 172 0x7200, 173 0x7203, 174 }; 175 176 debug("transfer gamma settings\n"); 177 lb043wv_spi_write_u16_array(spi, gamma_settings, 178 ARRAY_SIZE(gamma_settings)); 179 } 180 181 static void lb043wv_display_on(struct spi_slave *spi) 182 { 183 static u16 sleep_out = 0x7011; 184 static u16 display_on = 0x7029; 185 186 lb043wv_spi_write_u16(spi, sleep_out); 187 mdelay(PWR_ON_DELAY_MSECS); 188 lb043wv_spi_write_u16(spi, display_on); 189 } 190 191 int lg4573_spi_startup(unsigned int bus, unsigned int cs, 192 unsigned int max_hz, unsigned int spi_mode) 193 { 194 struct spi_slave *spi; 195 int ret; 196 197 spi = spi_setup_slave(bus, cs, max_hz, spi_mode); 198 if (!spi) { 199 debug("%s: Failed to set up slave\n", __func__); 200 return -1; 201 } 202 203 ret = spi_claim_bus(spi); 204 if (ret) { 205 debug("%s: Failed to claim SPI bus: %d\n", __func__, ret); 206 goto err_claim_bus; 207 } 208 209 lb043wv_display_mode_settings(spi); 210 lb043wv_power_settings(spi); 211 lb043wv_gamma_settings(spi); 212 213 lb043wv_display_on(spi); 214 return 0; 215 err_claim_bus: 216 spi_free_slave(spi); 217 return -1; 218 } 219 220 static int do_lgset(cmd_tbl_t *cmdtp, int flag, int argc, 221 char * const argv[]) 222 { 223 lg4573_spi_startup(0, 0, 10000000, SPI_MODE_0); 224 return 0; 225 } 226 227 U_BOOT_CMD( 228 lgset, 2, 1, do_lgset, 229 "set lgdisplay", 230 "" 231 ); 232