Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

backlight: add support for Toppoly TDO35S series to tdo24m lcd driver

Signed-off-by: Mike Rapoport <mike@compulab.co.il>
Acked-by: Eric Miao <eric.miao@marvell.com>
Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>

authored by

Mike Rapoport and committed by
Richard Purdie
f4f6bda0 c835ee7f

+101 -10
+2 -2
drivers/video/backlight/Kconfig
··· 52 52 then say y to include a power driver for it. 53 53 54 54 config LCD_TDO24M 55 - tristate "Toppoly TDO24M LCD Panels support" 55 + tristate "Toppoly TDO24M and TDO35S LCD Panels support" 56 56 depends on LCD_CLASS_DEVICE && SPI_MASTER 57 57 default n 58 58 help 59 - If you have a Toppoly TDO24M series LCD panel, say y here to 59 + If you have a Toppoly TDO24M/TDO35S series LCD panel, say y here to 60 60 include the support for it. 61 61 62 62 config LCD_VGG2432A4
+86 -8
drivers/video/backlight/tdo24m.c
··· 14 14 #include <linux/init.h> 15 15 #include <linux/device.h> 16 16 #include <linux/spi/spi.h> 17 + #include <linux/spi/tdo24m.h> 17 18 #include <linux/fb.h> 18 19 #include <linux/lcd.h> 19 20 ··· 31 30 struct spi_message msg; 32 31 struct spi_transfer xfer; 33 32 uint8_t *buf; 33 + 34 + int (*adj_mode)(struct tdo24m *lcd, int mode); 35 + int color_invert; 34 36 35 37 int power; 36 38 int mode; ··· 70 66 CMD_NULL, 71 67 }; 72 68 73 - static uint32_t lcd_vga_pass_through[] = { 69 + static uint32_t lcd_vga_pass_through_tdo24m[] = { 74 70 CMD1(0xB0, 0x16), 75 71 CMD1(0xBC, 0x80), 76 72 CMD1(0xE1, 0x00), ··· 79 75 CMD_NULL, 80 76 }; 81 77 82 - static uint32_t lcd_qvga_pass_through[] = { 78 + static uint32_t lcd_qvga_pass_through_tdo24m[] = { 83 79 CMD1(0xB0, 0x16), 84 80 CMD1(0xBC, 0x81), 85 81 CMD1(0xE1, 0x00), ··· 88 84 CMD_NULL, 89 85 }; 90 86 91 - static uint32_t lcd_vga_transfer[] = { 87 + static uint32_t lcd_vga_transfer_tdo24m[] = { 92 88 CMD1(0xcf, 0x02), /* Blanking period control (1) */ 93 89 CMD2(0xd0, 0x08, 0x04), /* Blanking period control (2) */ 94 90 CMD1(0xd1, 0x01), /* CKV timing control on/off */ ··· 109 105 CMD2(0xde, 0x05, 0x0a), /* OEV timing control */ 110 106 CMD2(0xdf, 0x0a, 0x19), /* ASW timing control (1) */ 111 107 CMD1(0xe0, 0x0a), /* ASW timing control (2) */ 108 + CMD0(0x21), /* Invert for normally black display */ 109 + CMD0(0x29), /* Display on */ 110 + CMD_NULL, 111 + }; 112 + 113 + static uint32_t lcd_vga_pass_through_tdo35s[] = { 114 + CMD1(0xB0, 0x16), 115 + CMD1(0xBC, 0x80), 116 + CMD1(0xE1, 0x00), 117 + CMD1(0x3B, 0x00), 118 + CMD_NULL, 119 + }; 120 + 121 + static uint32_t lcd_qvga_pass_through_tdo35s[] = { 122 + CMD1(0xB0, 0x16), 123 + CMD1(0xBC, 0x81), 124 + CMD1(0xE1, 0x00), 125 + CMD1(0x3B, 0x22), 126 + CMD_NULL, 127 + }; 128 + 129 + static uint32_t lcd_vga_transfer_tdo35s[] = { 130 + CMD1(0xcf, 0x02), /* Blanking period control (1) */ 131 + CMD2(0xd0, 0x08, 0x04), /* Blanking period control (2) */ 132 + CMD1(0xd1, 0x01), /* CKV timing control on/off */ 133 + CMD2(0xd2, 0x00, 0x1e), /* CKV 1,2 timing control */ 134 + CMD2(0xd3, 0x14, 0x28), /* OEV timing control */ 135 + CMD2(0xd4, 0x28, 0x64), /* ASW timing control (1) */ 136 + CMD1(0xd5, 0x28), /* ASW timing control (2) */ 112 137 CMD0(0x21), /* Invert for normally black display */ 113 138 CMD0(0x29), /* Display on */ 114 139 CMD_NULL, ··· 181 148 int nparams, err = 0; 182 149 183 150 for (; *p != CMD_NULL; p++) { 151 + if (!lcd->color_invert && *p == CMD0(0x21)) 152 + continue; 184 153 185 154 nparams = (*p >> 30) & 0x3; 186 155 ··· 219 184 { 220 185 switch (mode) { 221 186 case MODE_VGA: 222 - tdo24m_writes(lcd, lcd_vga_pass_through); 187 + tdo24m_writes(lcd, lcd_vga_pass_through_tdo24m); 223 188 tdo24m_writes(lcd, lcd_panel_config); 224 - tdo24m_writes(lcd, lcd_vga_transfer); 189 + tdo24m_writes(lcd, lcd_vga_transfer_tdo24m); 225 190 break; 226 191 case MODE_QVGA: 227 - tdo24m_writes(lcd, lcd_qvga_pass_through); 192 + tdo24m_writes(lcd, lcd_qvga_pass_through_tdo24m); 193 + tdo24m_writes(lcd, lcd_panel_config); 194 + tdo24m_writes(lcd, lcd_qvga_transfer); 195 + break; 196 + default: 197 + return -EINVAL; 198 + } 199 + 200 + lcd->mode = mode; 201 + return 0; 202 + } 203 + 204 + static int tdo35s_adj_mode(struct tdo24m *lcd, int mode) 205 + { 206 + switch (mode) { 207 + case MODE_VGA: 208 + tdo24m_writes(lcd, lcd_vga_pass_through_tdo35s); 209 + tdo24m_writes(lcd, lcd_panel_config); 210 + tdo24m_writes(lcd, lcd_vga_transfer_tdo35s); 211 + break; 212 + case MODE_QVGA: 213 + tdo24m_writes(lcd, lcd_qvga_pass_through_tdo35s); 228 214 tdo24m_writes(lcd, lcd_panel_config); 229 215 tdo24m_writes(lcd, lcd_qvga_transfer); 230 216 break; ··· 269 213 if (err) 270 214 goto out; 271 215 272 - err = tdo24m_adj_mode(lcd, lcd->mode); 216 + err = lcd->adj_mode(lcd, lcd->mode); 273 217 out: 274 218 return err; 275 219 } ··· 318 262 if (lcd->mode == mode) 319 263 return 0; 320 264 321 - return tdo24m_adj_mode(lcd, mode); 265 + return lcd->adj_mode(lcd, mode); 322 266 } 323 267 324 268 static struct lcd_ops tdo24m_ops = { ··· 332 276 struct tdo24m *lcd; 333 277 struct spi_message *m; 334 278 struct spi_transfer *x; 279 + struct tdo24m_platform_data *pdata; 280 + enum tdo24m_model model; 335 281 int err; 282 + 283 + pdata = spi->dev.platform_data; 284 + if (pdata) 285 + model = pdata->model; 286 + else 287 + model = TDO24M; 336 288 337 289 spi->bits_per_word = 8; 338 290 spi->mode = SPI_MODE_3; ··· 369 305 370 306 x->tx_buf = &lcd->buf[0]; 371 307 spi_message_add_tail(x, m); 308 + 309 + switch (model) { 310 + case TDO24M: 311 + lcd->color_invert = 1; 312 + lcd->adj_mode = tdo24m_adj_mode; 313 + break; 314 + case TDO35S: 315 + lcd->adj_mode = tdo35s_adj_mode; 316 + lcd->color_invert = 0; 317 + break; 318 + default: 319 + dev_err(&spi->dev, "Unsupported model"); 320 + goto out_free; 321 + } 372 322 373 323 lcd->lcd_dev = lcd_device_register("tdo24m", &spi->dev, 374 324 lcd, &tdo24m_ops);
+13
include/linux/spi/tdo24m.h
··· 1 + #ifndef __TDO24M_H__ 2 + #define __TDO24M_H__ 3 + 4 + enum tdo24m_model { 5 + TDO24M, 6 + TDO35S, 7 + }; 8 + 9 + struct tdo24m_platform_data { 10 + enum tdo24m_model model; 11 + }; 12 + 13 + #endif /* __TDO24M_H__ */