s6e63m0.c revision 39a6ec28bdc1385d29d9cbd4a9b385230b3cc755
1ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae/* 2ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * S6E63M0 AMOLED LCD panel driver. 3ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * 4ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * Author: InKi Dae <inki.dae@samsung.com> 5ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * 6ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * Derived from drivers/video/omap/lcd-apollon.c 7ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * 8ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * This program is free software; you can redistribute it and/or modify it 9ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * under the terms of the GNU General Public License as published by the 10ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * Free Software Foundation; either version 2 of the License, or (at your 11ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * option) any later version. 12ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae */ 13ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 14f5cede7c0db36b4733462ada25f6992521c48fb5Jingoo Han#include <linux/backlight.h> 15ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include <linux/delay.h> 16f5cede7c0db36b4733462ada25f6992521c48fb5Jingoo Han#include <linux/fb.h> 17ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include <linux/gpio.h> 18ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include <linux/interrupt.h> 19f5cede7c0db36b4733462ada25f6992521c48fb5Jingoo Han#include <linux/irq.h> 20ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include <linux/kernel.h> 21ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include <linux/lcd.h> 22355b200bacdb6017669cdc5bc9e7b1037aac42a2Paul Gortmaker#include <linux/module.h> 23f5cede7c0db36b4733462ada25f6992521c48fb5Jingoo Han#include <linux/spi/spi.h> 24f5cede7c0db36b4733462ada25f6992521c48fb5Jingoo Han#include <linux/wait.h> 25ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 26ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include "s6e63m0_gamma.h" 27ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 28ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define SLEEPMSEC 0x1000 29ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define ENDDEF 0x2000 30ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define DEFMASK 0xFF00 31ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define COMMAND_ONLY 0xFE 32ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define DATA_ONLY 0xFF 33ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 34ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define MIN_BRIGHTNESS 0 35ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define MAX_BRIGHTNESS 10 36ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 37ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestruct s6e63m0 { 38ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct device *dev; 39ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct spi_device *spi; 40ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae unsigned int power; 41ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae unsigned int current_brightness; 42ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae unsigned int gamma_mode; 43ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae unsigned int gamma_table_count; 44ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct lcd_device *ld; 45ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct backlight_device *bd; 46ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct lcd_platform_data *lcd_pd; 47ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 48ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 494a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Hanstatic const unsigned short seq_panel_condition_set[] = { 50ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xF8, 0x01, 51ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x27, 52ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x27, 53ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x07, 54ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x07, 55ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x54, 56ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x9f, 57ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x63, 58ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x86, 59ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1a, 60ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x33, 61ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0d, 62ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 63ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 64ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 65ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 66ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 67ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 684a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Hanstatic const unsigned short seq_display_condition_set[] = { 69ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xf2, 0x02, 70ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x03, 71ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1c, 72ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x10, 73ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x10, 74ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 75ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xf7, 0x03, 76ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 77ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 78ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 79ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 80ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 81ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 824a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Hanstatic const unsigned short seq_gamma_setting[] = { 83ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xfa, 0x00, 84ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x18, 85ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x08, 86ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x24, 87ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x64, 88ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x56, 89ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x33, 90ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xb6, 91ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xba, 92ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xa8, 93ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xac, 94ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xb1, 95ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x9d, 96ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xc1, 97ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xc1, 98ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xb7, 99ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 100ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x9c, 101ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 102ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x9f, 103ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 104ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xd6, 105ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 106ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xfa, 0x01, 107ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 108ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 109ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 110ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 1114a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Hanstatic const unsigned short seq_etc_condition_set[] = { 112ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xf6, 0x00, 113ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x8c, 114ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x07, 115ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 116ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb3, 0xc, 117ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 118ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb5, 0x2c, 119ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x12, 120ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0c, 121ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0a, 122ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x10, 123ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0e, 124ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x17, 125ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x13, 126ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1f, 127ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1a, 128ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2a, 129ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x24, 130ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1f, 131ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1b, 132ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1a, 133ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x17, 134ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 135ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2b, 136ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x26, 137ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x22, 138ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x20, 139ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x3a, 140ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x34, 141ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x30, 142ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2c, 143ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x29, 144ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x26, 145ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x25, 146ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x23, 147ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x21, 148ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x20, 149ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1e, 150ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1e, 151ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 152ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb6, 0x00, 153ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 154ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x11, 155ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x22, 156ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x33, 157ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 158ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 159ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 160ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 161ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x55, 162ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x55, 163ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 164ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 165ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 166ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 167ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 168ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 169ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 170ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb7, 0x2c, 171ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x12, 172ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0c, 173ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0a, 174ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x10, 175ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0e, 176ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x17, 177ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x13, 178ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1f, 179ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1a, 180ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2a, 181ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x24, 182ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1f, 183ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1b, 184ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1a, 185ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x17, 186ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 187ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2b, 188ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x26, 189ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x22, 190ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x20, 191ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x3a, 192ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x34, 193ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x30, 194ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2c, 195ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x29, 196ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x26, 197ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x25, 198ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x23, 199ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x21, 200ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x20, 201ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1e, 202ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1e, 203ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 204ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb8, 0x00, 205ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 206ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x11, 207ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x22, 208ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x33, 209ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 210ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 211ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 212ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 213ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x55, 214ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x55, 215ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 216ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 217ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 218ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 219ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 220ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 221ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 222ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb9, 0x2c, 223ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x12, 224ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0c, 225ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0a, 226ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x10, 227ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0e, 228ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x17, 229ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x13, 230ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1f, 231ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1a, 232ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2a, 233ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x24, 234ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1f, 235ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1b, 236ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1a, 237ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x17, 238ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 239ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2b, 240ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x26, 241ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x22, 242ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x20, 243ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x3a, 244ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x34, 245ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x30, 246ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2c, 247ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x29, 248ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x26, 249ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x25, 250ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x23, 251ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x21, 252ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x20, 253ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1e, 254ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1e, 255ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 256ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xba, 0x00, 257ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 258ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x11, 259ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x22, 260ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x33, 261ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 262ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 263ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 264ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 265ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x55, 266ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x55, 267ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 268ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 269ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 270ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 271ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 272ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 273ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 274ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xc1, 0x4d, 275ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x96, 276ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1d, 277ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 278ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 279ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x01, 280ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xdf, 281ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 282ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 283ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x03, 284ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1f, 285ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 286ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 287ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 288ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 289ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 290ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 291ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 292ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 293ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x03, 294ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x06, 295ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x09, 296ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0d, 297ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0f, 298ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x12, 299ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x15, 300ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x18, 301ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 302ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb2, 0x10, 303ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x10, 304ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0b, 305ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x05, 306ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 307ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 308ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 309ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 3104a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Hanstatic const unsigned short seq_acl_on[] = { 311ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* ACL on */ 312ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xc0, 0x01, 313ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 314ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 315ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 316ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 3174a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Hanstatic const unsigned short seq_acl_off[] = { 318ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* ACL off */ 319ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xc0, 0x00, 320ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 321ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 322ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 323ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 3244a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Hanstatic const unsigned short seq_elvss_on[] = { 325ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* ELVSS on */ 326ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb1, 0x0b, 327ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 328ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 329ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 330ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 3314a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Hanstatic const unsigned short seq_elvss_off[] = { 332ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* ELVSS off */ 333ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb1, 0x0a, 334ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 335ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 336ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 337ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 3384a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Hanstatic const unsigned short seq_stand_by_off[] = { 339ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0x11, COMMAND_ONLY, 340ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 341ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 342ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 343ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 3444a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Hanstatic const unsigned short seq_stand_by_on[] = { 345ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0x10, COMMAND_ONLY, 346ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 347ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 348ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 349ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 3504a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Hanstatic const unsigned short seq_display_on[] = { 351ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0x29, COMMAND_ONLY, 352ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 353ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 354ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 355ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 356ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 357ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_spi_write_byte(struct s6e63m0 *lcd, int addr, int data) 358ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 359ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae u16 buf[1]; 360ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct spi_message msg; 361ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 362ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct spi_transfer xfer = { 363ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .len = 2, 364ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .tx_buf = buf, 365ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae }; 366ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 367ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae buf[0] = (addr << 8) | data; 368ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 369ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae spi_message_init(&msg); 370ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae spi_message_add_tail(&xfer, &msg); 371ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 372ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return spi_sync(lcd->spi, &msg); 373ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 374ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 375ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_spi_write(struct s6e63m0 *lcd, unsigned char address, 376ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae unsigned char command) 377ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 378ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 379ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 380ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (address != DATA_ONLY) 381ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_spi_write_byte(lcd, 0x0, address); 382ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (command != COMMAND_ONLY) 383ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_spi_write_byte(lcd, 0x1, command); 384ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 385ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 386ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 387ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 388ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_panel_send_sequence(struct s6e63m0 *lcd, 389ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae const unsigned short *wbuf) 390ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 391ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0, i = 0; 392ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 393ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae while ((wbuf[i] & DEFMASK) != ENDDEF) { 394ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if ((wbuf[i] & DEFMASK) != SLEEPMSEC) { 395ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_spi_write(lcd, wbuf[i], wbuf[i+1]); 396ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) 397ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 39897a4d9d53a2c63706cb5bf222c37bf273939a7ebJingoo Han } else { 39997a4d9d53a2c63706cb5bf222c37bf273939a7ebJingoo Han msleep(wbuf[i+1]); 40097a4d9d53a2c63706cb5bf222c37bf273939a7ebJingoo Han } 401ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae i += 2; 402ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 403ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 404ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 405ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 406ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 407ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int _s6e63m0_gamma_ctl(struct s6e63m0 *lcd, const unsigned int *gamma) 408ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 409ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae unsigned int i = 0; 410ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 411ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 412ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* disable gamma table updating. */ 413ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_spi_write(lcd, 0xfa, 0x00); 414ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) { 415ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "failed to disable gamma table updating.\n"); 416ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae goto gamma_err; 417ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 418ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 419ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae for (i = 0 ; i < GAMMA_TABLE_COUNT; i++) { 420ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_spi_write(lcd, DATA_ONLY, gamma[i]); 421ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) { 422ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "failed to set gamma table.\n"); 423ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae goto gamma_err; 424ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 425ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 426ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 427ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* update gamma table. */ 428ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_spi_write(lcd, 0xfa, 0x01); 429ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) 430ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "failed to update gamma table.\n"); 431ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 432ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daegamma_err: 433ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 434ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 435ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 436ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_gamma_ctl(struct s6e63m0 *lcd, int gamma) 437ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 438ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 439ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 440ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = _s6e63m0_gamma_ctl(lcd, gamma_table.gamma_22_table[gamma]); 441ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 442ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 443ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 444ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 445ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 446ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_ldi_init(struct s6e63m0 *lcd) 447ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 448ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret, i; 449ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae const unsigned short *init_seq[] = { 4504a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Han seq_panel_condition_set, 4514a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Han seq_display_condition_set, 4524a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Han seq_gamma_setting, 4534a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Han seq_etc_condition_set, 4544a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Han seq_acl_on, 4554a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Han seq_elvss_on, 456ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae }; 457ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 458ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae for (i = 0; i < ARRAY_SIZE(init_seq); i++) { 459ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_panel_send_sequence(lcd, init_seq[i]); 460ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) 461ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 462ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 463ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 464ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 465ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 466ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 467ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_ldi_enable(struct s6e63m0 *lcd) 468ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 469ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0, i; 470ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae const unsigned short *enable_seq[] = { 4714a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Han seq_stand_by_off, 4724a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Han seq_display_on, 473ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae }; 474ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 475ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae for (i = 0; i < ARRAY_SIZE(enable_seq); i++) { 476ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_panel_send_sequence(lcd, enable_seq[i]); 477ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) 478ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 479ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 480ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 481ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 482ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 483ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 484ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_ldi_disable(struct s6e63m0 *lcd) 485ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 486ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret; 487ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 4884a959e598ebb20caeec0b5e5c4455597f4836661Jingoo Han ret = s6e63m0_panel_send_sequence(lcd, seq_stand_by_on); 489ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 490ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 491ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 492ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 493892dc2e6603034188f51b30e702498a51d8c7365Jingoo Hanstatic int s6e63m0_power_is_on(int power) 494892dc2e6603034188f51b30e702498a51d8c7365Jingoo Han{ 495892dc2e6603034188f51b30e702498a51d8c7365Jingoo Han return power <= FB_BLANK_NORMAL; 496892dc2e6603034188f51b30e702498a51d8c7365Jingoo Han} 497892dc2e6603034188f51b30e702498a51d8c7365Jingoo Han 498ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_power_on(struct s6e63m0 *lcd) 499ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 500ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 501892dc2e6603034188f51b30e702498a51d8c7365Jingoo Han struct lcd_platform_data *pd; 502892dc2e6603034188f51b30e702498a51d8c7365Jingoo Han struct backlight_device *bd; 503ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 504ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae pd = lcd->lcd_pd; 505ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae bd = lcd->bd; 506ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 507ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!pd->power_on) { 508ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "power_on is NULL.\n"); 50981c650e3accca9ca20232e96058aa759ceae06a5Jingoo Han return -EINVAL; 510ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } else { 511ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae pd->power_on(lcd->ld, 1); 51297a4d9d53a2c63706cb5bf222c37bf273939a7ebJingoo Han msleep(pd->power_on_delay); 513ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 514ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 515ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!pd->reset) { 516ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "reset is NULL.\n"); 51781c650e3accca9ca20232e96058aa759ceae06a5Jingoo Han return -EINVAL; 518ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } else { 519ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae pd->reset(lcd->ld); 52097a4d9d53a2c63706cb5bf222c37bf273939a7ebJingoo Han msleep(pd->reset_delay); 521ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 522ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 523ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_ldi_init(lcd); 524ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) { 525ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "failed to initialize ldi.\n"); 526ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 527ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 528ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 529ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_ldi_enable(lcd); 530ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) { 531ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "failed to enable ldi.\n"); 532ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 533ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 534ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 535ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* set brightness to current value after power on or resume. */ 536ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_gamma_ctl(lcd, bd->props.brightness); 537ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) { 538ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "lcd gamma setting failed.\n"); 539ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 540ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 541ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 542ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return 0; 543ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 544ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 545ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_power_off(struct s6e63m0 *lcd) 546ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 547892dc2e6603034188f51b30e702498a51d8c7365Jingoo Han int ret; 548892dc2e6603034188f51b30e702498a51d8c7365Jingoo Han struct lcd_platform_data *pd; 549ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 550ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae pd = lcd->lcd_pd; 551ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 552ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_ldi_disable(lcd); 553ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) { 554ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "lcd setting failed.\n"); 555ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EIO; 556ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 557ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 55897a4d9d53a2c63706cb5bf222c37bf273939a7ebJingoo Han msleep(pd->power_off_delay); 559ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 560892dc2e6603034188f51b30e702498a51d8c7365Jingoo Han pd->power_on(lcd->ld, 0); 561ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 562ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return 0; 563ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 564ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 565ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_power(struct s6e63m0 *lcd, int power) 566ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 567ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 568ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 569892dc2e6603034188f51b30e702498a51d8c7365Jingoo Han if (s6e63m0_power_is_on(power) && !s6e63m0_power_is_on(lcd->power)) 570ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_power_on(lcd); 571892dc2e6603034188f51b30e702498a51d8c7365Jingoo Han else if (!s6e63m0_power_is_on(power) && s6e63m0_power_is_on(lcd->power)) 572ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_power_off(lcd); 573ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 574ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!ret) 575ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->power = power; 576ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 577ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 578ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 579ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 580ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_set_power(struct lcd_device *ld, int power) 581ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 582ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = lcd_get_data(ld); 583ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 584ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (power != FB_BLANK_UNBLANK && power != FB_BLANK_POWERDOWN && 585ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae power != FB_BLANK_NORMAL) { 586ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "power value should be 0, 1 or 4.\n"); 587ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EINVAL; 588ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 589ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 590ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return s6e63m0_power(lcd, power); 591ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 592ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 593ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_get_power(struct lcd_device *ld) 594ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 595ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = lcd_get_data(ld); 596ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 597ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return lcd->power; 598ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 599ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 600ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_get_brightness(struct backlight_device *bd) 601ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 602ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return bd->props.brightness; 603ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 604ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 605ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_set_brightness(struct backlight_device *bd) 606ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 607ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0, brightness = bd->props.brightness; 608ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = bl_get_data(bd); 609ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 610ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (brightness < MIN_BRIGHTNESS || 611ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae brightness > bd->props.max_brightness) { 612ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&bd->dev, "lcd brightness should be %d to %d.\n", 613ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae MIN_BRIGHTNESS, MAX_BRIGHTNESS); 614ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EINVAL; 615ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 616ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 617ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_gamma_ctl(lcd, bd->props.brightness); 618ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) { 619ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&bd->dev, "lcd brightness setting failed.\n"); 620ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EIO; 621ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 622ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 623ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 624ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 625ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 626ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic struct lcd_ops s6e63m0_lcd_ops = { 627ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .set_power = s6e63m0_set_power, 628ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .get_power = s6e63m0_get_power, 629ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 630ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 631ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic const struct backlight_ops s6e63m0_backlight_ops = { 632ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .get_brightness = s6e63m0_get_brightness, 633ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .update_status = s6e63m0_set_brightness, 634ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 635ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 636ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic ssize_t s6e63m0_sysfs_show_gamma_mode(struct device *dev, 637ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct device_attribute *attr, char *buf) 638ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 639ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = dev_get_drvdata(dev); 640ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae char temp[10]; 641ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 642ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae switch (lcd->gamma_mode) { 643ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 0: 644ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae sprintf(temp, "2.2 mode\n"); 645ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae strcat(buf, temp); 646ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 647ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 1: 648ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae sprintf(temp, "1.9 mode\n"); 649ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae strcat(buf, temp); 650ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 651ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 2: 652ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae sprintf(temp, "1.7 mode\n"); 653ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae strcat(buf, temp); 654ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 655ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae default: 656ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_info(dev, "gamma mode could be 0:2.2, 1:1.9 or 2:1.7)n"); 657ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 658ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 659ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 660ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return strlen(buf); 661ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 662ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 663ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic ssize_t s6e63m0_sysfs_store_gamma_mode(struct device *dev, 664ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct device_attribute *attr, 665ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae const char *buf, size_t len) 666ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 667ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = dev_get_drvdata(dev); 668ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct backlight_device *bd = NULL; 669ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int brightness, rc; 670ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 671cf2b94daab9f3d21b0a393bef91292622f6a8ca4Dan Carpenter rc = kstrtouint(buf, 0, &lcd->gamma_mode); 672ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (rc < 0) 673ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return rc; 674ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 675ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae bd = lcd->bd; 676ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 677ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae brightness = bd->props.brightness; 678ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 679ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae switch (lcd->gamma_mode) { 680ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 0: 681ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae _s6e63m0_gamma_ctl(lcd, gamma_table.gamma_22_table[brightness]); 682ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 683ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 1: 684ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae _s6e63m0_gamma_ctl(lcd, gamma_table.gamma_19_table[brightness]); 685ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 686ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 2: 687ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae _s6e63m0_gamma_ctl(lcd, gamma_table.gamma_17_table[brightness]); 688ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 689ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae default: 690ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_info(dev, "gamma mode could be 0:2.2, 1:1.9 or 2:1.7\n"); 691ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae _s6e63m0_gamma_ctl(lcd, gamma_table.gamma_22_table[brightness]); 692ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 693ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 694ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return len; 695ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 696ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 697ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic DEVICE_ATTR(gamma_mode, 0644, 698ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae s6e63m0_sysfs_show_gamma_mode, s6e63m0_sysfs_store_gamma_mode); 699ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 700ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic ssize_t s6e63m0_sysfs_show_gamma_table(struct device *dev, 701ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct device_attribute *attr, char *buf) 702ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 703ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = dev_get_drvdata(dev); 704ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae char temp[3]; 705ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 70639a6ec28bdc1385d29d9cbd4a9b385230b3cc755Masanari Iida sprintf(temp, "%u\n", lcd->gamma_table_count); 707ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae strcpy(buf, temp); 708ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 709ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return strlen(buf); 710ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 711ed3a6787bfff125a7aee88e5be0e0661887dfd15Axel Linstatic DEVICE_ATTR(gamma_table, 0444, 712ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae s6e63m0_sysfs_show_gamma_table, NULL); 713ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 7141b9e450de105c1429a15f4e2566695f4f425672aBill Pembertonstatic int s6e63m0_probe(struct spi_device *spi) 715ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 716ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 717ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = NULL; 718ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct lcd_device *ld = NULL; 719ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct backlight_device *bd = NULL; 720ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin struct backlight_properties props; 721ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 722541f936f5d3993c5bbed33bdb53acd6de2403b04Jingoo Han lcd = devm_kzalloc(&spi->dev, sizeof(struct s6e63m0), GFP_KERNEL); 723ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!lcd) 724ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -ENOMEM; 725ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 726ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* s6e63m0 lcd panel uses 3-wire 9bits SPI Mode. */ 727ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae spi->bits_per_word = 9; 728ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 729ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = spi_setup(spi); 730ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret < 0) { 731ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&spi->dev, "spi setup failed.\n"); 732541f936f5d3993c5bbed33bdb53acd6de2403b04Jingoo Han return ret; 733ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 734ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 735ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->spi = spi; 736ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->dev = &spi->dev; 737ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 738c512794cada491e008eeca822af7e4ad5db72a56Jingoo Han lcd->lcd_pd = dev_get_platdata(&spi->dev); 739ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!lcd->lcd_pd) { 740ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&spi->dev, "platform data is NULL.\n"); 74181c650e3accca9ca20232e96058aa759ceae06a5Jingoo Han return -EINVAL; 742ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 743ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 744a18863f5e83881e3ed1f4ee92496898045e1f5c3Jingoo Han ld = devm_lcd_device_register(&spi->dev, "s6e63m0", &spi->dev, lcd, 745a18863f5e83881e3ed1f4ee92496898045e1f5c3Jingoo Han &s6e63m0_lcd_ops); 746541f936f5d3993c5bbed33bdb53acd6de2403b04Jingoo Han if (IS_ERR(ld)) 747541f936f5d3993c5bbed33bdb53acd6de2403b04Jingoo Han return PTR_ERR(ld); 748ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 749ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->ld = ld; 750ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 751ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin memset(&props, 0, sizeof(struct backlight_properties)); 752ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin props.type = BACKLIGHT_RAW; 753ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin props.max_brightness = MAX_BRIGHTNESS; 754ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin 755a18863f5e83881e3ed1f4ee92496898045e1f5c3Jingoo Han bd = devm_backlight_device_register(&spi->dev, "s6e63m0bl-bl", 756a18863f5e83881e3ed1f4ee92496898045e1f5c3Jingoo Han &spi->dev, lcd, &s6e63m0_backlight_ops, 757a18863f5e83881e3ed1f4ee92496898045e1f5c3Jingoo Han &props); 758a18863f5e83881e3ed1f4ee92496898045e1f5c3Jingoo Han if (IS_ERR(bd)) 759a18863f5e83881e3ed1f4ee92496898045e1f5c3Jingoo Han return PTR_ERR(bd); 760ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 761ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae bd->props.brightness = MAX_BRIGHTNESS; 762ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->bd = bd; 763ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 764ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* 765ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * it gets gamma table count available so it gets user 766ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * know that. 767ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae */ 768ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->gamma_table_count = 769eeb1ef3b641f078cb1079cec48a8da2bdf449f21Dan Carpenter sizeof(gamma_table) / (MAX_GAMMA_LEVEL * sizeof(int *)); 770ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 771ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = device_create_file(&(spi->dev), &dev_attr_gamma_mode); 772ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret < 0) 773ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&(spi->dev), "failed to add sysfs entries\n"); 774ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 775ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = device_create_file(&(spi->dev), &dev_attr_gamma_table); 776ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret < 0) 777ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&(spi->dev), "failed to add sysfs entries\n"); 778ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 779ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* 780ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * if lcd panel was on from bootloader like u-boot then 781ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * do not lcd on. 782ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae */ 783ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!lcd->lcd_pd->lcd_enabled) { 784ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* 785ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * if lcd panel was off from bootloader then 786ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * current lcd status is powerdown and then 787ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * it enables lcd panel. 788ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae */ 789ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->power = FB_BLANK_POWERDOWN; 790ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 791ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae s6e63m0_power(lcd, FB_BLANK_UNBLANK); 792892dc2e6603034188f51b30e702498a51d8c7365Jingoo Han } else { 793ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->power = FB_BLANK_UNBLANK; 794892dc2e6603034188f51b30e702498a51d8c7365Jingoo Han } 795ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 7967652c18d5c658a155ec2708c574096ad22d1e8d1Jingoo Han spi_set_drvdata(spi, lcd); 797ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 798ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_info(&spi->dev, "s6e63m0 panel driver has been probed.\n"); 799ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 800ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return 0; 801ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 802ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 8037e4b9d0bb2a6464e541d51a1e59ba73470c7c453Bill Pembertonstatic int s6e63m0_remove(struct spi_device *spi) 804ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 8057652c18d5c658a155ec2708c574096ad22d1e8d1Jingoo Han struct s6e63m0 *lcd = spi_get_drvdata(spi); 806ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 807ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae s6e63m0_power(lcd, FB_BLANK_POWERDOWN); 808d974e00b955ee390e02ae2f0eeb5ed921599ec07Axel Lin device_remove_file(&spi->dev, &dev_attr_gamma_table); 809d974e00b955ee390e02ae2f0eeb5ed921599ec07Axel Lin device_remove_file(&spi->dev, &dev_attr_gamma_mode); 810ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 811ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return 0; 812ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 813ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 814d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Han#ifdef CONFIG_PM_SLEEP 815d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Hanstatic int s6e63m0_suspend(struct device *dev) 816ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 817d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Han struct s6e63m0 *lcd = dev_get_drvdata(dev); 818ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 819d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Han dev_dbg(dev, "lcd->power = %d\n", lcd->power); 820ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 821ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* 822ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * when lcd panel is suspend, lcd panel becomes off 823ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * regardless of status. 824ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae */ 825b6bef463f5e42e959c46773806693c3277179bc4Jingoo Han return s6e63m0_power(lcd, FB_BLANK_POWERDOWN); 826ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 827ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 828d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Hanstatic int s6e63m0_resume(struct device *dev) 829ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 830d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Han struct s6e63m0 *lcd = dev_get_drvdata(dev); 831ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 832b6bef463f5e42e959c46773806693c3277179bc4Jingoo Han lcd->power = FB_BLANK_POWERDOWN; 833ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 834b6bef463f5e42e959c46773806693c3277179bc4Jingoo Han return s6e63m0_power(lcd, FB_BLANK_UNBLANK); 835ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 836ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#endif 837ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 838d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Hanstatic SIMPLE_DEV_PM_OPS(s6e63m0_pm_ops, s6e63m0_suspend, s6e63m0_resume); 839d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Han 840ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae/* Power down all displays on reboot, poweroff or halt. */ 841ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic void s6e63m0_shutdown(struct spi_device *spi) 842ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 8437652c18d5c658a155ec2708c574096ad22d1e8d1Jingoo Han struct s6e63m0 *lcd = spi_get_drvdata(spi); 844ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 845ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae s6e63m0_power(lcd, FB_BLANK_POWERDOWN); 846ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 847ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 848ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic struct spi_driver s6e63m0_driver = { 849ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .driver = { 850ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .name = "s6e63m0", 851ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .owner = THIS_MODULE, 852d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Han .pm = &s6e63m0_pm_ops, 853ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae }, 854ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .probe = s6e63m0_probe, 855d1723fa266aff677571cad0bac7203ed2e424823Bill Pemberton .remove = s6e63m0_remove, 856ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .shutdown = s6e63m0_shutdown, 857ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 858ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 859462dd83833065a6b3add3f102f4fe69efa1422e9Axel Linmodule_spi_driver(s6e63m0_driver); 860ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 861ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi DaeMODULE_AUTHOR("InKi Dae <inki.dae@samsung.com>"); 862ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi DaeMODULE_DESCRIPTION("S6E63M0 LCD Driver"); 863ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi DaeMODULE_LICENSE("GPL"); 864ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 865