Commit fc1a79d95e9038e9cf53f99c1825005b4dfaf7f4

Authored by Heiko Schocher
Committed by Anatolij Gustschin
1 parent cb9f8e6a73

video, lg4573: add support for the lg4573 display

Signed-off-by: Heiko Schocher <hs@denx.de>

Showing 3 changed files with 236 additions and 0 deletions Side-by-side Diff

drivers/video/Makefile
... ... @@ -45,6 +45,7 @@
45 45 obj-$(CONFIG_VIDEO_VCXK) += bus_vcxk.o
46 46 obj-$(CONFIG_VIDEO_VESA) += vesa_fb.o
47 47 obj-$(CONFIG_FORMIKE) += formike.o
  48 +obj-$(CONFIG_LG4573) += lg4573.o
48 49 obj-$(CONFIG_AM335X_LCD) += am335x-fb.o
49 50 obj-$(CONFIG_VIDEO_PARADE) += parade.o
drivers/video/lg4573.c
  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 +);
... ... @@ -69,5 +69,9 @@
69 69 int kwh043st20_f01_spi_startup(unsigned int bus, unsigned int cs,
70 70 unsigned int max_hz, unsigned int spi_mode);
71 71 #endif
  72 +#if defined(CONFIG_LG4573)
  73 +int lg4573_spi_startup(unsigned int bus, unsigned int cs,
  74 + unsigned int max_hz, unsigned int spi_mode);
  75 +#endif
72 76 #endif