s6e63m0.c revision d1723fa266aff677571cad0bac7203ed2e424823
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 * This program is distributed in the hope that it will be useful, but 14ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * WITHOUT ANY WARRANTY; without even the implied warranty of 15ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * General Public License for more details. 17ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * 18ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * You should have received a copy of the GNU General Public License along 19ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * with this program; if not, write to the Free Software Foundation, Inc., 20ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 21ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae */ 22ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 23ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include <linux/wait.h> 24ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include <linux/fb.h> 25ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include <linux/delay.h> 26ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include <linux/gpio.h> 27ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include <linux/spi/spi.h> 28ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include <linux/irq.h> 29ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include <linux/interrupt.h> 30ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include <linux/kernel.h> 31ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include <linux/lcd.h> 32ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include <linux/backlight.h> 33355b200bacdb6017669cdc5bc9e7b1037aac42a2Paul Gortmaker#include <linux/module.h> 34ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 35ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#include "s6e63m0_gamma.h" 36ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 37ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define SLEEPMSEC 0x1000 38ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define ENDDEF 0x2000 39ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define DEFMASK 0xFF00 40ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define COMMAND_ONLY 0xFE 41ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define DATA_ONLY 0xFF 42ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 43ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define MIN_BRIGHTNESS 0 44ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define MAX_BRIGHTNESS 10 45ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 46ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define POWER_IS_ON(pwr) ((pwr) <= FB_BLANK_NORMAL) 47ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 48ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestruct s6e63m0 { 49ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct device *dev; 50ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct spi_device *spi; 51ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae unsigned int power; 52ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae unsigned int current_brightness; 53ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae unsigned int gamma_mode; 54ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae unsigned int gamma_table_count; 55ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct lcd_device *ld; 56ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct backlight_device *bd; 57ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct lcd_platform_data *lcd_pd; 58ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 59ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 60ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic const unsigned short SEQ_PANEL_CONDITION_SET[] = { 61ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xF8, 0x01, 62ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x27, 63ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x27, 64ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x07, 65ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x07, 66ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x54, 67ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x9f, 68ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x63, 69ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x86, 70ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1a, 71ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x33, 72ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0d, 73ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 74ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 75ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 76ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 77ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 78ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 79ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic const unsigned short SEQ_DISPLAY_CONDITION_SET[] = { 80ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xf2, 0x02, 81ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x03, 82ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1c, 83ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x10, 84ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x10, 85ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 86ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xf7, 0x03, 87ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 88ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 89ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 90ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 91ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 92ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 93ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic const unsigned short SEQ_GAMMA_SETTING[] = { 94ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xfa, 0x00, 95ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x18, 96ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x08, 97ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x24, 98ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x64, 99ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x56, 100ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x33, 101ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xb6, 102ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xba, 103ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xa8, 104ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xac, 105ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xb1, 106ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x9d, 107ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xc1, 108ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xc1, 109ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xb7, 110ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 111ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x9c, 112ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 113ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x9f, 114ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 115ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xd6, 116ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 117ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xfa, 0x01, 118ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 119ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 120ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 121ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 122ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic const unsigned short SEQ_ETC_CONDITION_SET[] = { 123ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xf6, 0x00, 124ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x8c, 125ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x07, 126ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 127ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb3, 0xc, 128ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 129ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb5, 0x2c, 130ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x12, 131ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0c, 132ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0a, 133ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x10, 134ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0e, 135ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x17, 136ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x13, 137ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1f, 138ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1a, 139ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2a, 140ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x24, 141ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1f, 142ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1b, 143ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1a, 144ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x17, 145ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 146ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2b, 147ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x26, 148ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x22, 149ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x20, 150ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x3a, 151ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x34, 152ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x30, 153ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2c, 154ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x29, 155ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x26, 156ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x25, 157ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x23, 158ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x21, 159ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x20, 160ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1e, 161ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1e, 162ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 163ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb6, 0x00, 164ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 165ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x11, 166ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x22, 167ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x33, 168ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 169ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 170ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 171ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 172ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x55, 173ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x55, 174ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 175ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 176ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 177ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 178ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 179ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 180ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 181ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb7, 0x2c, 182ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x12, 183ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0c, 184ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0a, 185ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x10, 186ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0e, 187ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x17, 188ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x13, 189ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1f, 190ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1a, 191ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2a, 192ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x24, 193ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1f, 194ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1b, 195ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1a, 196ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x17, 197ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 198ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2b, 199ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x26, 200ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x22, 201ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x20, 202ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x3a, 203ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x34, 204ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x30, 205ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2c, 206ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x29, 207ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x26, 208ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x25, 209ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x23, 210ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x21, 211ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x20, 212ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1e, 213ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1e, 214ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 215ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb8, 0x00, 216ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 217ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x11, 218ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x22, 219ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x33, 220ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 221ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 222ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 223ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 224ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x55, 225ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x55, 226ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 227ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 228ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 229ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 230ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 231ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 232ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 233ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb9, 0x2c, 234ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x12, 235ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0c, 236ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0a, 237ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x10, 238ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0e, 239ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x17, 240ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x13, 241ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1f, 242ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1a, 243ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2a, 244ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x24, 245ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1f, 246ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1b, 247ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1a, 248ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x17, 249ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 250ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2b, 251ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x26, 252ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x22, 253ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x20, 254ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x3a, 255ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x34, 256ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x30, 257ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x2c, 258ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x29, 259ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x26, 260ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x25, 261ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x23, 262ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x21, 263ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x20, 264ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1e, 265ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1e, 266ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 267ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xba, 0x00, 268ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 269ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x11, 270ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x22, 271ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x33, 272ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 273ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 274ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x44, 275ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 276ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x55, 277ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x55, 278ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 279ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 280ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 281ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 282ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 283ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x66, 284ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 285ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xc1, 0x4d, 286ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x96, 287ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1d, 288ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 289ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 290ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x01, 291ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0xdf, 292ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 293ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 294ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x03, 295ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x1f, 296ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 297ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 298ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 299ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 300ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 301ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 302ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 303ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x00, 304ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x03, 305ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x06, 306ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x09, 307ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0d, 308ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0f, 309ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x12, 310ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x15, 311ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x18, 312ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 313ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb2, 0x10, 314ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x10, 315ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x0b, 316ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae DATA_ONLY, 0x05, 317ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 318ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 319ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 320ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 321ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic const unsigned short SEQ_ACL_ON[] = { 322ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* ACL on */ 323ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xc0, 0x01, 324ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 325ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 326ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 327ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 328ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic const unsigned short SEQ_ACL_OFF[] = { 329ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* ACL off */ 330ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xc0, 0x00, 331ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 332ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 333ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 334ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 335ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic const unsigned short SEQ_ELVSS_ON[] = { 336ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* ELVSS on */ 337ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb1, 0x0b, 338ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 339ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 340ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 341ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 342ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic const unsigned short SEQ_ELVSS_OFF[] = { 343ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* ELVSS off */ 344ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0xb1, 0x0a, 345ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 346ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 347ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 348ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 349ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic const unsigned short SEQ_STAND_BY_OFF[] = { 350ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0x11, COMMAND_ONLY, 351ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 352ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 353ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 354ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 355ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic const unsigned short SEQ_STAND_BY_ON[] = { 356ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0x10, COMMAND_ONLY, 357ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 358ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 359ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 360ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 361ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic const unsigned short SEQ_DISPLAY_ON[] = { 362ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 0x29, COMMAND_ONLY, 363ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 364ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ENDDEF, 0x0000 365ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 366ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 367ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 368ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_spi_write_byte(struct s6e63m0 *lcd, int addr, int data) 369ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 370ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae u16 buf[1]; 371ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct spi_message msg; 372ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 373ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct spi_transfer xfer = { 374ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .len = 2, 375ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .tx_buf = buf, 376ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae }; 377ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 378ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae buf[0] = (addr << 8) | data; 379ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 380ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae spi_message_init(&msg); 381ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae spi_message_add_tail(&xfer, &msg); 382ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 383ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return spi_sync(lcd->spi, &msg); 384ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 385ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 386ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_spi_write(struct s6e63m0 *lcd, unsigned char address, 387ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae unsigned char command) 388ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 389ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 390ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 391ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (address != DATA_ONLY) 392ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_spi_write_byte(lcd, 0x0, address); 393ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (command != COMMAND_ONLY) 394ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_spi_write_byte(lcd, 0x1, command); 395ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 396ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 397ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 398ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 399ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_panel_send_sequence(struct s6e63m0 *lcd, 400ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae const unsigned short *wbuf) 401ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 402ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0, i = 0; 403ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 404ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae while ((wbuf[i] & DEFMASK) != ENDDEF) { 405ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if ((wbuf[i] & DEFMASK) != SLEEPMSEC) { 406ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_spi_write(lcd, wbuf[i], wbuf[i+1]); 407ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) 408ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 409ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } else 410ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae udelay(wbuf[i+1]*1000); 411ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae i += 2; 412ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 413ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 414ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 415ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 416ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 417ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int _s6e63m0_gamma_ctl(struct s6e63m0 *lcd, const unsigned int *gamma) 418ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 419ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae unsigned int i = 0; 420ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 421ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 422ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* disable gamma table updating. */ 423ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_spi_write(lcd, 0xfa, 0x00); 424ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) { 425ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "failed to disable gamma table updating.\n"); 426ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae goto gamma_err; 427ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 428ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 429ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae for (i = 0 ; i < GAMMA_TABLE_COUNT; i++) { 430ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_spi_write(lcd, DATA_ONLY, gamma[i]); 431ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) { 432ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "failed to set gamma table.\n"); 433ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae goto gamma_err; 434ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 435ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 436ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 437ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* update gamma table. */ 438ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_spi_write(lcd, 0xfa, 0x01); 439ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) 440ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "failed to update gamma table.\n"); 441ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 442ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daegamma_err: 443ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 444ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 445ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 446ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_gamma_ctl(struct s6e63m0 *lcd, int gamma) 447ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 448ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 449ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 450ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = _s6e63m0_gamma_ctl(lcd, gamma_table.gamma_22_table[gamma]); 451ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 452ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 453ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 454ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 455ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 456ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_ldi_init(struct s6e63m0 *lcd) 457ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 458ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret, i; 459ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae const unsigned short *init_seq[] = { 460ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae SEQ_PANEL_CONDITION_SET, 461ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae SEQ_DISPLAY_CONDITION_SET, 462ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae SEQ_GAMMA_SETTING, 463ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae SEQ_ETC_CONDITION_SET, 464ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae SEQ_ACL_ON, 465ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae SEQ_ELVSS_ON, 466ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae }; 467ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 468ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae for (i = 0; i < ARRAY_SIZE(init_seq); i++) { 469ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_panel_send_sequence(lcd, init_seq[i]); 470ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) 471ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 472ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 473ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 474ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 475ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 476ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 477ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_ldi_enable(struct s6e63m0 *lcd) 478ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 479ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0, i; 480ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae const unsigned short *enable_seq[] = { 481ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae SEQ_STAND_BY_OFF, 482ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae SEQ_DISPLAY_ON, 483ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae }; 484ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 485ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae for (i = 0; i < ARRAY_SIZE(enable_seq); i++) { 486ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_panel_send_sequence(lcd, enable_seq[i]); 487ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) 488ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 489ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 490ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 491ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 492ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 493ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 494ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_ldi_disable(struct s6e63m0 *lcd) 495ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 496ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret; 497ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 498ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_panel_send_sequence(lcd, SEQ_STAND_BY_ON); 499ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 500ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 501ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 502ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 503ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_power_on(struct s6e63m0 *lcd) 504ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 505ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 506ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct lcd_platform_data *pd = NULL; 507ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct backlight_device *bd = NULL; 508ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 509ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae pd = lcd->lcd_pd; 510ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!pd) { 511ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "platform data is NULL.\n"); 512ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EFAULT; 513ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 514ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 515ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae bd = lcd->bd; 516ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!bd) { 517ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "backlight device is NULL.\n"); 518ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EFAULT; 519ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 520ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 521ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!pd->power_on) { 522ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "power_on is NULL.\n"); 523ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EFAULT; 524ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } else { 525ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae pd->power_on(lcd->ld, 1); 526ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae mdelay(pd->power_on_delay); 527ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 528ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 529ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!pd->reset) { 530ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "reset is NULL.\n"); 531ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EFAULT; 532ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } else { 533ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae pd->reset(lcd->ld); 534ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae mdelay(pd->reset_delay); 535ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 536ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 537ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_ldi_init(lcd); 538ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) { 539ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "failed to initialize ldi.\n"); 540ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 541ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 542ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 543ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_ldi_enable(lcd); 544ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) { 545ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "failed to enable ldi.\n"); 546ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 547ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 548ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 549ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* set brightness to current value after power on or resume. */ 550ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_gamma_ctl(lcd, bd->props.brightness); 551ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) { 552ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "lcd gamma setting failed.\n"); 553ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 554ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 555ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 556ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return 0; 557ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 558ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 559ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_power_off(struct s6e63m0 *lcd) 560ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 561ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 562ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct lcd_platform_data *pd = NULL; 563ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 564ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae pd = lcd->lcd_pd; 565ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!pd) { 566ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "platform data is NULL.\n"); 567ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EFAULT; 568ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 569ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 570ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_ldi_disable(lcd); 571ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) { 572ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "lcd setting failed.\n"); 573ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EIO; 574ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 575ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 576ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae mdelay(pd->power_off_delay); 577ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 578ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!pd->power_on) { 579ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "power_on is NULL.\n"); 580ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EFAULT; 581ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } else 582ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae pd->power_on(lcd->ld, 0); 583ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 584ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return 0; 585ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 586ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 587ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_power(struct s6e63m0 *lcd, int power) 588ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 589ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 590ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 591ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (POWER_IS_ON(power) && !POWER_IS_ON(lcd->power)) 592ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_power_on(lcd); 593ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae else if (!POWER_IS_ON(power) && POWER_IS_ON(lcd->power)) 594ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_power_off(lcd); 595ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 596ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!ret) 597ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->power = power; 598ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 599ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 600ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 601ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 602ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_set_power(struct lcd_device *ld, int power) 603ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 604ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = lcd_get_data(ld); 605ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 606ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (power != FB_BLANK_UNBLANK && power != FB_BLANK_POWERDOWN && 607ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae power != FB_BLANK_NORMAL) { 608ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "power value should be 0, 1 or 4.\n"); 609ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EINVAL; 610ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 611ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 612ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return s6e63m0_power(lcd, power); 613ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 614ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 615ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_get_power(struct lcd_device *ld) 616ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 617ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = lcd_get_data(ld); 618ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 619ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return lcd->power; 620ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 621ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 622ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_get_brightness(struct backlight_device *bd) 623ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 624ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return bd->props.brightness; 625ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 626ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 627ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_set_brightness(struct backlight_device *bd) 628ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 629ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0, brightness = bd->props.brightness; 630ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = bl_get_data(bd); 631ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 632ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (brightness < MIN_BRIGHTNESS || 633ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae brightness > bd->props.max_brightness) { 634ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&bd->dev, "lcd brightness should be %d to %d.\n", 635ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae MIN_BRIGHTNESS, MAX_BRIGHTNESS); 636ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EINVAL; 637ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 638ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 639ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_gamma_ctl(lcd, bd->props.brightness); 640ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) { 641ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&bd->dev, "lcd brightness setting failed.\n"); 642ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EIO; 643ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 644ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 645ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 646ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 647ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 648ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic struct lcd_ops s6e63m0_lcd_ops = { 649ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .set_power = s6e63m0_set_power, 650ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .get_power = s6e63m0_get_power, 651ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 652ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 653ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic const struct backlight_ops s6e63m0_backlight_ops = { 654ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .get_brightness = s6e63m0_get_brightness, 655ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .update_status = s6e63m0_set_brightness, 656ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 657ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 658ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic ssize_t s6e63m0_sysfs_show_gamma_mode(struct device *dev, 659ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct device_attribute *attr, char *buf) 660ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 661ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = dev_get_drvdata(dev); 662ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae char temp[10]; 663ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 664ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae switch (lcd->gamma_mode) { 665ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 0: 666ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae sprintf(temp, "2.2 mode\n"); 667ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae strcat(buf, temp); 668ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 669ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 1: 670ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae sprintf(temp, "1.9 mode\n"); 671ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae strcat(buf, temp); 672ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 673ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 2: 674ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae sprintf(temp, "1.7 mode\n"); 675ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae strcat(buf, temp); 676ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 677ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae default: 678ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_info(dev, "gamma mode could be 0:2.2, 1:1.9 or 2:1.7)n"); 679ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 680ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 681ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 682ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return strlen(buf); 683ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 684ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 685ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic ssize_t s6e63m0_sysfs_store_gamma_mode(struct device *dev, 686ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct device_attribute *attr, 687ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae const char *buf, size_t len) 688ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 689ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = dev_get_drvdata(dev); 690ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct backlight_device *bd = NULL; 691ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int brightness, rc; 692ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 693cf2b94daab9f3d21b0a393bef91292622f6a8ca4Dan Carpenter rc = kstrtouint(buf, 0, &lcd->gamma_mode); 694ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (rc < 0) 695ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return rc; 696ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 697ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae bd = lcd->bd; 698ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 699ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae brightness = bd->props.brightness; 700ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 701ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae switch (lcd->gamma_mode) { 702ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 0: 703ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae _s6e63m0_gamma_ctl(lcd, gamma_table.gamma_22_table[brightness]); 704ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 705ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 1: 706ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae _s6e63m0_gamma_ctl(lcd, gamma_table.gamma_19_table[brightness]); 707ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 708ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 2: 709ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae _s6e63m0_gamma_ctl(lcd, gamma_table.gamma_17_table[brightness]); 710ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 711ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae default: 712ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_info(dev, "gamma mode could be 0:2.2, 1:1.9 or 2:1.7\n"); 713ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae _s6e63m0_gamma_ctl(lcd, gamma_table.gamma_22_table[brightness]); 714ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 715ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 716ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return len; 717ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 718ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 719ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic DEVICE_ATTR(gamma_mode, 0644, 720ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae s6e63m0_sysfs_show_gamma_mode, s6e63m0_sysfs_store_gamma_mode); 721ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 722ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic ssize_t s6e63m0_sysfs_show_gamma_table(struct device *dev, 723ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct device_attribute *attr, char *buf) 724ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 725ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = dev_get_drvdata(dev); 726ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae char temp[3]; 727ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 728ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae sprintf(temp, "%d\n", lcd->gamma_table_count); 729ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae strcpy(buf, temp); 730ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 731ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return strlen(buf); 732ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 733ed3a6787bfff125a7aee88e5be0e0661887dfd15Axel Linstatic DEVICE_ATTR(gamma_table, 0444, 734ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae s6e63m0_sysfs_show_gamma_table, NULL); 735ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 736a1025e224c518dceb342d0cc54e5513c6476f60cAxel Linstatic int __devinit s6e63m0_probe(struct spi_device *spi) 737ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 738ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 739ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = NULL; 740ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct lcd_device *ld = NULL; 741ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct backlight_device *bd = NULL; 742ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin struct backlight_properties props; 743ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 744541f936f5d3993c5bbed33bdb53acd6de2403b04Jingoo Han lcd = devm_kzalloc(&spi->dev, sizeof(struct s6e63m0), GFP_KERNEL); 745ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!lcd) 746ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -ENOMEM; 747ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 748ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* s6e63m0 lcd panel uses 3-wire 9bits SPI Mode. */ 749ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae spi->bits_per_word = 9; 750ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 751ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = spi_setup(spi); 752ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret < 0) { 753ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&spi->dev, "spi setup failed.\n"); 754541f936f5d3993c5bbed33bdb53acd6de2403b04Jingoo Han return ret; 755ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 756ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 757ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->spi = spi; 758ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->dev = &spi->dev; 759ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 760ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->lcd_pd = (struct lcd_platform_data *)spi->dev.platform_data; 761ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!lcd->lcd_pd) { 762ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&spi->dev, "platform data is NULL.\n"); 763541f936f5d3993c5bbed33bdb53acd6de2403b04Jingoo Han return -EFAULT; 764ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 765ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 766ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ld = lcd_device_register("s6e63m0", &spi->dev, lcd, &s6e63m0_lcd_ops); 767541f936f5d3993c5bbed33bdb53acd6de2403b04Jingoo Han if (IS_ERR(ld)) 768541f936f5d3993c5bbed33bdb53acd6de2403b04Jingoo Han return PTR_ERR(ld); 769ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 770ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->ld = ld; 771ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 772ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin memset(&props, 0, sizeof(struct backlight_properties)); 773ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin props.type = BACKLIGHT_RAW; 774ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin props.max_brightness = MAX_BRIGHTNESS; 775ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin 776ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae bd = backlight_device_register("s6e63m0bl-bl", &spi->dev, lcd, 777ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin &s6e63m0_backlight_ops, &props); 778ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (IS_ERR(bd)) { 779ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = PTR_ERR(bd); 780ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae goto out_lcd_unregister; 781ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 782ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 783ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae bd->props.brightness = MAX_BRIGHTNESS; 784ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->bd = bd; 785ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 786ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* 787ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * it gets gamma table count available so it gets user 788ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * know that. 789ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae */ 790ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->gamma_table_count = 791ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae sizeof(gamma_table) / (MAX_GAMMA_LEVEL * sizeof(int)); 792ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 793ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = device_create_file(&(spi->dev), &dev_attr_gamma_mode); 794ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret < 0) 795ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&(spi->dev), "failed to add sysfs entries\n"); 796ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 797ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = device_create_file(&(spi->dev), &dev_attr_gamma_table); 798ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret < 0) 799ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&(spi->dev), "failed to add sysfs entries\n"); 800ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 801ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* 802ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * if lcd panel was on from bootloader like u-boot then 803ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * do not lcd on. 804ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae */ 805ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!lcd->lcd_pd->lcd_enabled) { 806ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* 807ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * if lcd panel was off from bootloader then 808ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * current lcd status is powerdown and then 809ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * it enables lcd panel. 810ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae */ 811ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->power = FB_BLANK_POWERDOWN; 812ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 813ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae s6e63m0_power(lcd, FB_BLANK_UNBLANK); 814ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } else 815ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->power = FB_BLANK_UNBLANK; 816ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 817ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_set_drvdata(&spi->dev, lcd); 818ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 819ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_info(&spi->dev, "s6e63m0 panel driver has been probed.\n"); 820ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 821ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return 0; 822ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 823ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daeout_lcd_unregister: 824ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd_device_unregister(ld); 825ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 826ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 827ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 828ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int __devexit s6e63m0_remove(struct spi_device *spi) 829ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 830ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = dev_get_drvdata(&spi->dev); 831ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 832ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae s6e63m0_power(lcd, FB_BLANK_POWERDOWN); 833d974e00b955ee390e02ae2f0eeb5ed921599ec07Axel Lin device_remove_file(&spi->dev, &dev_attr_gamma_table); 834d974e00b955ee390e02ae2f0eeb5ed921599ec07Axel Lin device_remove_file(&spi->dev, &dev_attr_gamma_mode); 835d974e00b955ee390e02ae2f0eeb5ed921599ec07Axel Lin backlight_device_unregister(lcd->bd); 836ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd_device_unregister(lcd->ld); 837ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 838ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return 0; 839ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 840ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 841ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#if defined(CONFIG_PM) 842a4c8aaa559733d03cb6bb4fa62c25ae756c53e94Jingoo Hanstatic unsigned int before_power; 843ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 844ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_suspend(struct spi_device *spi, pm_message_t mesg) 845ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 846ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 847ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = dev_get_drvdata(&spi->dev); 848ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 849ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_dbg(&spi->dev, "lcd->power = %d\n", lcd->power); 850ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 851ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae before_power = lcd->power; 852ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 853ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* 854ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * when lcd panel is suspend, lcd panel becomes off 855ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * regardless of status. 856ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae */ 857ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_power(lcd, FB_BLANK_POWERDOWN); 858ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 859ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 860ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 861ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 862ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic int s6e63m0_resume(struct spi_device *spi) 863ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 864ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 865ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = dev_get_drvdata(&spi->dev); 866ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 867ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* 868ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * after suspended, if lcd panel status is FB_BLANK_UNBLANK 869ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * (at that time, before_power is FB_BLANK_UNBLANK) then 870ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * it changes that status to FB_BLANK_POWERDOWN to get lcd on. 871ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae */ 872ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (before_power == FB_BLANK_UNBLANK) 873ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->power = FB_BLANK_POWERDOWN; 874ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 875ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_dbg(&spi->dev, "before_power = %d\n", before_power); 876ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 877ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_power(lcd, before_power); 878ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 879ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 880ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 881ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#else 882ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define s6e63m0_suspend NULL 883ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#define s6e63m0_resume NULL 884ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#endif 885ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 886ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae/* Power down all displays on reboot, poweroff or halt. */ 887ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic void s6e63m0_shutdown(struct spi_device *spi) 888ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 889ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = dev_get_drvdata(&spi->dev); 890ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 891ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae s6e63m0_power(lcd, FB_BLANK_POWERDOWN); 892ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 893ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 894ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic struct spi_driver s6e63m0_driver = { 895ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .driver = { 896ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .name = "s6e63m0", 897ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .owner = THIS_MODULE, 898ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae }, 899ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .probe = s6e63m0_probe, 900d1723fa266aff677571cad0bac7203ed2e424823Bill Pemberton .remove = s6e63m0_remove, 901ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .shutdown = s6e63m0_shutdown, 902ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .suspend = s6e63m0_suspend, 903ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .resume = s6e63m0_resume, 904ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 905ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 906462dd83833065a6b3add3f102f4fe69efa1422e9Axel Linmodule_spi_driver(s6e63m0_driver); 907ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 908ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi DaeMODULE_AUTHOR("InKi Dae <inki.dae@samsung.com>"); 909ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi DaeMODULE_DESCRIPTION("S6E63M0 LCD Driver"); 910ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi DaeMODULE_LICENSE("GPL"); 911ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 912