diff options
| -rw-r--r-- | drivers/video/backlight/Kconfig | 12 | ||||
| -rw-r--r-- | drivers/video/backlight/Makefile | 2 | ||||
| -rw-r--r-- | drivers/video/backlight/ltv350qv.c | 330 | ||||
| -rw-r--r-- | drivers/video/backlight/ltv350qv.h | 95 |
4 files changed, 439 insertions, 0 deletions
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index 2580f5fa2486..b6f936a09185 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig | |||
| @@ -24,6 +24,18 @@ config LCD_CLASS_DEVICE | |||
| 24 | To have support for your specific LCD panel you will have to | 24 | To have support for your specific LCD panel you will have to |
| 25 | select the proper drivers which depend on this option. | 25 | select the proper drivers which depend on this option. |
| 26 | 26 | ||
| 27 | config LCD_LTV350QV | ||
| 28 | tristate "Samsung LTV350QV LCD Panel" | ||
| 29 | depends on LCD_CLASS_DEVICE && SPI_MASTER | ||
| 30 | default n | ||
| 31 | help | ||
| 32 | If you have a Samsung LTV350QV LCD panel, say y to include a | ||
| 33 | power control driver for it. The panel starts up in power | ||
| 34 | off state, so you need this driver in order to see any | ||
| 35 | output. | ||
| 36 | |||
| 37 | The LTV350QV panel is present on all ATSTK1000 boards. | ||
| 38 | |||
| 27 | # | 39 | # |
| 28 | # Backlight | 40 | # Backlight |
| 29 | # | 41 | # |
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index c6e2266f63e2..965a78b18118 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | # Backlight & LCD drivers | 1 | # Backlight & LCD drivers |
| 2 | 2 | ||
| 3 | obj-$(CONFIG_LCD_CLASS_DEVICE) += lcd.o | 3 | obj-$(CONFIG_LCD_CLASS_DEVICE) += lcd.o |
| 4 | obj-$(CONFIG_LCD_LTV350QV) += ltv350qv.o | ||
| 5 | |||
| 4 | obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o | 6 | obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o |
| 5 | obj-$(CONFIG_BACKLIGHT_CORGI) += corgi_bl.o | 7 | obj-$(CONFIG_BACKLIGHT_CORGI) += corgi_bl.o |
| 6 | obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o | 8 | obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o |
diff --git a/drivers/video/backlight/ltv350qv.c b/drivers/video/backlight/ltv350qv.c new file mode 100644 index 000000000000..2eb206bf73e6 --- /dev/null +++ b/drivers/video/backlight/ltv350qv.c | |||
| @@ -0,0 +1,330 @@ | |||
| 1 | /* | ||
| 2 | * Power control for Samsung LTV350QV Quarter VGA LCD Panel | ||
| 3 | * | ||
| 4 | * Copyright (C) 2006, 2007 Atmel Corporation | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | #include <linux/delay.h> | ||
| 11 | #include <linux/err.h> | ||
| 12 | #include <linux/fb.h> | ||
| 13 | #include <linux/init.h> | ||
| 14 | #include <linux/lcd.h> | ||
| 15 | #include <linux/module.h> | ||
| 16 | #include <linux/spi/spi.h> | ||
| 17 | |||
| 18 | #include "ltv350qv.h" | ||
| 19 | |||
| 20 | #define POWER_IS_ON(pwr) ((pwr) <= FB_BLANK_NORMAL) | ||
| 21 | |||
| 22 | struct ltv350qv { | ||
| 23 | struct spi_device *spi; | ||
| 24 | u8 *buffer; | ||
| 25 | int power; | ||
| 26 | struct lcd_device *ld; | ||
| 27 | }; | ||
| 28 | |||
| 29 | /* | ||
| 30 | * The power-on and power-off sequences are taken from the | ||
| 31 | * LTV350QV-F04 data sheet from Samsung. The register definitions are | ||
| 32 | * taken from the S6F2002 command list also from Samsung. Both | ||
| 33 | * documents are distributed with the AVR32 Linux BSP CD from Atmel. | ||
| 34 | * | ||
| 35 | * There's still some voodoo going on here, but it's a lot better than | ||
| 36 | * in the first incarnation of the driver where all we had was the raw | ||
| 37 | * numbers from the initialization sequence. | ||
| 38 | */ | ||
| 39 | static int ltv350qv_write_reg(struct ltv350qv *lcd, u8 reg, u16 val) | ||
| 40 | { | ||
| 41 | struct spi_message msg; | ||
| 42 | struct spi_transfer index_xfer = { | ||
| 43 | .len = 3, | ||
| 44 | .cs_change = 1, | ||
| 45 | }; | ||
| 46 | struct spi_transfer value_xfer = { | ||
| 47 | .len = 3, | ||
| 48 | }; | ||
| 49 | |||
| 50 | spi_message_init(&msg); | ||
| 51 | |||
| 52 | /* register index */ | ||
| 53 | lcd->buffer[0] = LTV_OPC_INDEX; | ||
| 54 | lcd->buffer[1] = 0x00; | ||
| 55 | lcd->buffer[2] = reg & 0x7f; | ||
| 56 | index_xfer.tx_buf = lcd->buffer; | ||
| 57 | spi_message_add_tail(&index_xfer, &msg); | ||
| 58 | |||
| 59 | /* register value */ | ||
| 60 | lcd->buffer[4] = LTV_OPC_DATA; | ||
| 61 | lcd->buffer[5] = val >> 8; | ||
| 62 | lcd->buffer[6] = val; | ||
| 63 | value_xfer.tx_buf = lcd->buffer + 4; | ||
| 64 | spi_message_add_tail(&value_xfer, &msg); | ||
| 65 | |||
| 66 | return spi_sync(lcd->spi, &msg); | ||
| 67 | } | ||
| 68 | |||
| 69 | /* The comments are taken straight from the data sheet */ | ||
| 70 | static int ltv350qv_power_on(struct ltv350qv *lcd) | ||
| 71 | { | ||
| 72 | int ret; | ||
| 73 | |||
| 74 | /* Power On Reset Display off State */ | ||
| 75 | if (ltv350qv_write_reg(lcd, LTV_PWRCTL1, 0x0000)) | ||
| 76 | goto err; | ||
| 77 | msleep(15); | ||
| 78 | |||
| 79 | /* Power Setting Function 1 */ | ||
| 80 | if (ltv350qv_write_reg(lcd, LTV_PWRCTL1, LTV_VCOM_DISABLE)) | ||
| 81 | goto err; | ||
| 82 | if (ltv350qv_write_reg(lcd, LTV_PWRCTL2, LTV_VCOML_ENABLE)) | ||
| 83 | goto err_power1; | ||
| 84 | |||
| 85 | /* Power Setting Function 2 */ | ||
| 86 | if (ltv350qv_write_reg(lcd, LTV_PWRCTL1, | ||
| 87 | LTV_VCOM_DISABLE | LTV_DRIVE_CURRENT(5) | ||
| 88 | | LTV_SUPPLY_CURRENT(5))) | ||
| 89 | goto err_power2; | ||
| 90 | |||
| 91 | msleep(55); | ||
| 92 | |||
| 93 | /* Instruction Setting */ | ||
| 94 | ret = ltv350qv_write_reg(lcd, LTV_IFCTL, | ||
| 95 | LTV_NMD | LTV_REV | LTV_NL(0x1d)); | ||
| 96 | ret |= ltv350qv_write_reg(lcd, LTV_DATACTL, | ||
| 97 | LTV_DS_SAME | LTV_CHS_480 | ||
| 98 | | LTV_DF_RGB | LTV_RGB_BGR); | ||
| 99 | ret |= ltv350qv_write_reg(lcd, LTV_ENTRY_MODE, | ||
| 100 | LTV_VSPL_ACTIVE_LOW | ||
| 101 | | LTV_HSPL_ACTIVE_LOW | ||
| 102 | | LTV_DPL_SAMPLE_RISING | ||
| 103 | | LTV_EPL_ACTIVE_LOW | ||
| 104 | | LTV_SS_RIGHT_TO_LEFT); | ||
| 105 | ret |= ltv350qv_write_reg(lcd, LTV_GATECTL1, LTV_CLW(3)); | ||
| 106 | ret |= ltv350qv_write_reg(lcd, LTV_GATECTL2, | ||
| 107 | LTV_NW_INV_1LINE | LTV_FWI(3)); | ||
| 108 | ret |= ltv350qv_write_reg(lcd, LTV_VBP, 0x000a); | ||
| 109 | ret |= ltv350qv_write_reg(lcd, LTV_HBP, 0x0021); | ||
| 110 | ret |= ltv350qv_write_reg(lcd, LTV_SOTCTL, LTV_SDT(3) | LTV_EQ(0)); | ||
| 111 | ret |= ltv350qv_write_reg(lcd, LTV_GAMMA(0), 0x0103); | ||
| 112 | ret |= ltv350qv_write_reg(lcd, LTV_GAMMA(1), 0x0301); | ||
| 113 | ret |= ltv350qv_write_reg(lcd, LTV_GAMMA(2), 0x1f0f); | ||
| 114 | ret |= ltv350qv_write_reg(lcd, LTV_GAMMA(3), 0x1f0f); | ||
| 115 | ret |= ltv350qv_write_reg(lcd, LTV_GAMMA(4), 0x0707); | ||
| 116 | ret |= ltv350qv_write_reg(lcd, LTV_GAMMA(5), 0x0307); | ||
| 117 | ret |= ltv350qv_write_reg(lcd, LTV_GAMMA(6), 0x0707); | ||
| 118 | ret |= ltv350qv_write_reg(lcd, LTV_GAMMA(7), 0x0000); | ||
| 119 | ret |= ltv350qv_write_reg(lcd, LTV_GAMMA(8), 0x0004); | ||
| 120 | ret |= ltv350qv_write_reg(lcd, LTV_GAMMA(9), 0x0000); | ||
| 121 | if (ret) | ||
| 122 | goto err_settings; | ||
| 123 | |||
| 124 | /* Wait more than 2 frames */ | ||
| 125 | msleep(20); | ||
| 126 | |||
| 127 | /* Display On Sequence */ | ||
| 128 | ret = ltv350qv_write_reg(lcd, LTV_PWRCTL1, | ||
| 129 | LTV_VCOM_DISABLE | LTV_VCOMOUT_ENABLE | ||
| 130 | | LTV_POWER_ON | LTV_DRIVE_CURRENT(5) | ||
| 131 | | LTV_SUPPLY_CURRENT(5)); | ||
| 132 | ret |= ltv350qv_write_reg(lcd, LTV_GATECTL2, | ||
| 133 | LTV_NW_INV_1LINE | LTV_DSC | LTV_FWI(3)); | ||
| 134 | if (ret) | ||
| 135 | goto err_disp_on; | ||
| 136 | |||
| 137 | /* Display should now be ON. Phew. */ | ||
| 138 | return 0; | ||
| 139 | |||
| 140 | err_disp_on: | ||
| 141 | /* | ||
| 142 | * Try to recover. Error handling probably isn't very useful | ||
| 143 | * at this point, just make a best effort to switch the panel | ||
| 144 | * off. | ||
| 145 | */ | ||
| 146 | ltv350qv_write_reg(lcd, LTV_PWRCTL1, | ||
| 147 | LTV_VCOM_DISABLE | LTV_DRIVE_CURRENT(5) | ||
| 148 | | LTV_SUPPLY_CURRENT(5)); | ||
| 149 | ltv350qv_write_reg(lcd, LTV_GATECTL2, | ||
| 150 | LTV_NW_INV_1LINE | LTV_FWI(3)); | ||
| 151 | err_settings: | ||
| 152 | err_power2: | ||
| 153 | err_power1: | ||
| 154 | ltv350qv_write_reg(lcd, LTV_PWRCTL2, 0x0000); | ||
| 155 | msleep(1); | ||
| 156 | err: | ||
| 157 | ltv350qv_write_reg(lcd, LTV_PWRCTL1, LTV_VCOM_DISABLE); | ||
| 158 | return -EIO; | ||
| 159 | } | ||
| 160 | |||
| 161 | static int ltv350qv_power_off(struct ltv350qv *lcd) | ||
| 162 | { | ||
| 163 | int ret; | ||
| 164 | |||
| 165 | /* Display Off Sequence */ | ||
| 166 | ret = ltv350qv_write_reg(lcd, LTV_PWRCTL1, | ||
| 167 | LTV_VCOM_DISABLE | ||
| 168 | | LTV_DRIVE_CURRENT(5) | ||
| 169 | | LTV_SUPPLY_CURRENT(5)); | ||
| 170 | ret |= ltv350qv_write_reg(lcd, LTV_GATECTL2, | ||
| 171 | LTV_NW_INV_1LINE | LTV_FWI(3)); | ||
| 172 | |||
| 173 | /* Power down setting 1 */ | ||
| 174 | ret |= ltv350qv_write_reg(lcd, LTV_PWRCTL2, 0x0000); | ||
| 175 | |||
| 176 | /* Wait at least 1 ms */ | ||
| 177 | msleep(1); | ||
| 178 | |||
| 179 | /* Power down setting 2 */ | ||
| 180 | ret |= ltv350qv_write_reg(lcd, LTV_PWRCTL1, LTV_VCOM_DISABLE); | ||
| 181 | |||
| 182 | /* | ||
| 183 | * No point in trying to recover here. If we can't switch the | ||
| 184 | * panel off, what are we supposed to do other than inform the | ||
| 185 | * user about the failure? | ||
| 186 | */ | ||
| 187 | if (ret) | ||
| 188 | return -EIO; | ||
| 189 | |||
| 190 | /* Display power should now be OFF */ | ||
| 191 | return 0; | ||
| 192 | } | ||
| 193 | |||
| 194 | static int ltv350qv_power(struct ltv350qv *lcd, int power) | ||
| 195 | { | ||
| 196 | int ret = 0; | ||
| 197 | |||
| 198 | if (POWER_IS_ON(power) && !POWER_IS_ON(lcd->power)) | ||
| 199 | ret = ltv350qv_power_on(lcd); | ||
| 200 | else if (!POWER_IS_ON(power) && POWER_IS_ON(lcd->power)) | ||
| 201 | ret = ltv350qv_power_off(lcd); | ||
| 202 | |||
| 203 | if (!ret) | ||
| 204 | lcd->power = power; | ||
| 205 | |||
| 206 | return ret; | ||
| 207 | } | ||
| 208 | |||
| 209 | static int ltv350qv_set_power(struct lcd_device *ld, int power) | ||
| 210 | { | ||
| 211 | struct ltv350qv *lcd = lcd_get_data(ld); | ||
| 212 | |||
| 213 | return ltv350qv_power(lcd, power); | ||
| 214 | } | ||
| 215 | |||
| 216 | static int ltv350qv_get_power(struct lcd_device *ld) | ||
| 217 | { | ||
| 218 | struct ltv350qv *lcd = lcd_get_data(ld); | ||
| 219 | |||
| 220 | return lcd->power; | ||
| 221 | } | ||
| 222 | |||
| 223 | static struct lcd_ops ltv_ops = { | ||
| 224 | .get_power = ltv350qv_get_power, | ||
| 225 | .set_power = ltv350qv_set_power, | ||
| 226 | }; | ||
| 227 | |||
| 228 | static int __devinit ltv350qv_probe(struct spi_device *spi) | ||
| 229 | { | ||
| 230 | struct ltv350qv *lcd; | ||
| 231 | struct lcd_device *ld; | ||
| 232 | int ret; | ||
| 233 | |||
| 234 | lcd = kzalloc(sizeof(struct ltv350qv), GFP_KERNEL); | ||
| 235 | if (!lcd) | ||
| 236 | return -ENOMEM; | ||
| 237 | |||
| 238 | lcd->spi = spi; | ||
| 239 | lcd->power = FB_BLANK_POWERDOWN; | ||
| 240 | lcd->buffer = kzalloc(8, GFP_KERNEL); | ||
| 241 | |||
| 242 | ld = lcd_device_register("ltv350qv", &spi->dev, lcd, <v_ops); | ||
| 243 | if (IS_ERR(ld)) { | ||
| 244 | ret = PTR_ERR(ld); | ||
| 245 | goto out_free_lcd; | ||
| 246 | } | ||
| 247 | lcd->ld = ld; | ||
| 248 | |||
| 249 | ret = ltv350qv_power(lcd, FB_BLANK_UNBLANK); | ||
| 250 | if (ret) | ||
| 251 | goto out_unregister; | ||
| 252 | |||
| 253 | dev_set_drvdata(&spi->dev, lcd); | ||
| 254 | |||
| 255 | return 0; | ||
| 256 | |||
| 257 | out_unregister: | ||
| 258 | lcd_device_unregister(ld); | ||
| 259 | out_free_lcd: | ||
| 260 | kfree(lcd); | ||
| 261 | return ret; | ||
| 262 | } | ||
| 263 | |||
| 264 | static int __devexit ltv350qv_remove(struct spi_device *spi) | ||
| 265 | { | ||
| 266 | struct ltv350qv *lcd = dev_get_drvdata(&spi->dev); | ||
| 267 | |||
| 268 | ltv350qv_power(lcd, FB_BLANK_POWERDOWN); | ||
| 269 | lcd_device_unregister(lcd->ld); | ||
| 270 | kfree(lcd); | ||
| 271 | |||
| 272 | return 0; | ||
| 273 | } | ||
| 274 | |||
| 275 | #ifdef CONFIG_PM | ||
| 276 | static int ltv350qv_suspend(struct spi_device *spi, pm_message_t state) | ||
| 277 | { | ||
| 278 | struct ltv350qv *lcd = dev_get_drvdata(&spi->dev); | ||
| 279 | |||
| 280 | return ltv350qv_power(lcd, FB_BLANK_POWERDOWN); | ||
| 281 | } | ||
| 282 | |||
| 283 | static int ltv350qv_resume(struct spi_device *spi) | ||
| 284 | { | ||
| 285 | struct ltv350qv *lcd = dev_get_drvdata(&spi->dev); | ||
| 286 | |||
| 287 | return ltv350qv_power(lcd, FB_BLANK_UNBLANK); | ||
| 288 | } | ||
| 289 | #else | ||
| 290 | #define ltv350qv_suspend NULL | ||
| 291 | #define ltv350qv_resume NULL | ||
| 292 | #endif | ||
| 293 | |||
| 294 | /* Power down all displays on reboot, poweroff or halt */ | ||
| 295 | static void ltv350qv_shutdown(struct spi_device *spi) | ||
| 296 | { | ||
| 297 | struct ltv350qv *lcd = dev_get_drvdata(&spi->dev); | ||
| 298 | |||
| 299 | ltv350qv_power(lcd, FB_BLANK_POWERDOWN); | ||
| 300 | } | ||
| 301 | |||
| 302 | static struct spi_driver ltv350qv_driver = { | ||
| 303 | .driver = { | ||
| 304 | .name = "ltv350qv", | ||
| 305 | .bus = &spi_bus_type, | ||
| 306 | .owner = THIS_MODULE, | ||
| 307 | }, | ||
| 308 | |||
| 309 | .probe = ltv350qv_probe, | ||
| 310 | .remove = __devexit_p(ltv350qv_remove), | ||
| 311 | .shutdown = ltv350qv_shutdown, | ||
| 312 | .suspend = ltv350qv_suspend, | ||
| 313 | .resume = ltv350qv_resume, | ||
| 314 | }; | ||
| 315 | |||
| 316 | static int __init ltv350qv_init(void) | ||
| 317 | { | ||
| 318 | return spi_register_driver(<v350qv_driver); | ||
| 319 | } | ||
| 320 | |||
| 321 | static void __exit ltv350qv_exit(void) | ||
| 322 | { | ||
| 323 | spi_unregister_driver(<v350qv_driver); | ||
| 324 | } | ||
| 325 | module_init(ltv350qv_init); | ||
| 326 | module_exit(ltv350qv_exit); | ||
| 327 | |||
| 328 | MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>"); | ||
| 329 | MODULE_DESCRIPTION("Samsung LTV350QV LCD Driver"); | ||
| 330 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/video/backlight/ltv350qv.h b/drivers/video/backlight/ltv350qv.h new file mode 100644 index 000000000000..189112e3fc7a --- /dev/null +++ b/drivers/video/backlight/ltv350qv.h | |||
| @@ -0,0 +1,95 @@ | |||
| 1 | /* | ||
| 2 | * Register definitions for Samsung LTV350QV Quarter VGA LCD Panel | ||
| 3 | * | ||
| 4 | * Copyright (C) 2006, 2007 Atmel Corporation | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | #ifndef __LTV350QV_H | ||
| 11 | #define __LTV350QV_H | ||
| 12 | |||
| 13 | #define LTV_OPC_INDEX 0x74 | ||
| 14 | #define LTV_OPC_DATA 0x76 | ||
| 15 | |||
| 16 | #define LTV_ID 0x00 /* ID Read */ | ||
| 17 | #define LTV_IFCTL 0x01 /* Display Interface Control */ | ||
| 18 | #define LTV_DATACTL 0x02 /* Display Data Control */ | ||
| 19 | #define LTV_ENTRY_MODE 0x03 /* Entry Mode */ | ||
| 20 | #define LTV_GATECTL1 0x04 /* Gate Control 1 */ | ||
| 21 | #define LTV_GATECTL2 0x05 /* Gate Control 2 */ | ||
| 22 | #define LTV_VBP 0x06 /* Vertical Back Porch */ | ||
| 23 | #define LTV_HBP 0x07 /* Horizontal Back Porch */ | ||
| 24 | #define LTV_SOTCTL 0x08 /* Source Output Timing Control */ | ||
| 25 | #define LTV_PWRCTL1 0x09 /* Power Control 1 */ | ||
| 26 | #define LTV_PWRCTL2 0x0a /* Power Control 2 */ | ||
| 27 | #define LTV_GAMMA(x) (0x10 + (x)) /* Gamma control */ | ||
| 28 | |||
| 29 | /* Bit definitions for LTV_IFCTL */ | ||
| 30 | #define LTV_IM (1 << 15) | ||
| 31 | #define LTV_NMD (1 << 14) | ||
| 32 | #define LTV_SSMD (1 << 13) | ||
| 33 | #define LTV_REV (1 << 7) | ||
| 34 | #define LTV_NL(x) (((x) & 0x001f) << 0) | ||
| 35 | |||
| 36 | /* Bit definitions for LTV_DATACTL */ | ||
| 37 | #define LTV_DS_SAME (0 << 12) | ||
| 38 | #define LTV_DS_D_TO_S (1 << 12) | ||
| 39 | #define LTV_DS_S_TO_D (2 << 12) | ||
| 40 | #define LTV_CHS_384 (0 << 9) | ||
| 41 | #define LTV_CHS_480 (1 << 9) | ||
| 42 | #define LTV_CHS_492 (2 << 9) | ||
| 43 | #define LTV_DF_RGB (0 << 6) | ||
| 44 | #define LTV_DF_RGBX (1 << 6) | ||
| 45 | #define LTV_DF_XRGB (2 << 6) | ||
| 46 | #define LTV_RGB_RGB (0 << 2) | ||
| 47 | #define LTV_RGB_BGR (1 << 2) | ||
| 48 | #define LTV_RGB_GRB (2 << 2) | ||
| 49 | #define LTV_RGB_RBG (3 << 2) | ||
| 50 | |||
| 51 | /* Bit definitions for LTV_ENTRY_MODE */ | ||
| 52 | #define LTV_VSPL_ACTIVE_LOW (0 << 15) | ||
| 53 | #define LTV_VSPL_ACTIVE_HIGH (1 << 15) | ||
| 54 | #define LTV_HSPL_ACTIVE_LOW (0 << 14) | ||
| 55 | #define LTV_HSPL_ACTIVE_HIGH (1 << 14) | ||
| 56 | #define LTV_DPL_SAMPLE_RISING (0 << 13) | ||
| 57 | #define LTV_DPL_SAMPLE_FALLING (1 << 13) | ||
| 58 | #define LTV_EPL_ACTIVE_LOW (0 << 12) | ||
| 59 | #define LTV_EPL_ACTIVE_HIGH (1 << 12) | ||
| 60 | #define LTV_SS_LEFT_TO_RIGHT (0 << 8) | ||
| 61 | #define LTV_SS_RIGHT_TO_LEFT (1 << 8) | ||
| 62 | #define LTV_STB (1 << 1) | ||
| 63 | |||
| 64 | /* Bit definitions for LTV_GATECTL1 */ | ||
| 65 | #define LTV_CLW(x) (((x) & 0x0007) << 12) | ||
| 66 | #define LTV_GAON (1 << 5) | ||
| 67 | #define LTV_SDR (1 << 3) | ||
| 68 | |||
| 69 | /* Bit definitions for LTV_GATECTL2 */ | ||
| 70 | #define LTV_NW_INV_FRAME (0 << 14) | ||
| 71 | #define LTV_NW_INV_1LINE (1 << 14) | ||
| 72 | #define LTV_NW_INV_2LINE (2 << 14) | ||
| 73 | #define LTV_DSC (1 << 12) | ||
| 74 | #define LTV_GIF (1 << 8) | ||
| 75 | #define LTV_FHN (1 << 7) | ||
| 76 | #define LTV_FTI(x) (((x) & 0x0003) << 4) | ||
| 77 | #define LTV_FWI(x) (((x) & 0x0003) << 0) | ||
| 78 | |||
| 79 | /* Bit definitions for LTV_SOTCTL */ | ||
| 80 | #define LTV_SDT(x) (((x) & 0x0007) << 10) | ||
| 81 | #define LTV_EQ(x) (((x) & 0x0007) << 2) | ||
| 82 | |||
| 83 | /* Bit definitions for LTV_PWRCTL1 */ | ||
| 84 | #define LTV_VCOM_DISABLE (1 << 14) | ||
| 85 | #define LTV_VCOMOUT_ENABLE (1 << 11) | ||
| 86 | #define LTV_POWER_ON (1 << 9) | ||
| 87 | #define LTV_DRIVE_CURRENT(x) (((x) & 0x0007) << 4) /* 0=off, 5=max */ | ||
| 88 | #define LTV_SUPPLY_CURRENT(x) (((x) & 0x0007) << 0) /* 0=off, 5=max */ | ||
| 89 | |||
| 90 | /* Bit definitions for LTV_PWRCTL2 */ | ||
| 91 | #define LTV_VCOML_ENABLE (1 << 13) | ||
| 92 | #define LTV_VCOML_VOLTAGE(x) (((x) & 0x001f) << 8) /* 0=1V, 31=-1V */ | ||
| 93 | #define LTV_VCOMH_VOLTAGE(x) (((x) & 0x001f) << 0) /* 0=3V, 31=4.5V */ | ||
| 94 | |||
| 95 | #endif /* __LTV350QV_H */ | ||
