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 } 511ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 5123bf3b79fab16b97b0a5a1232af760e8d7a2d3a78Jingoo Han pd->power_on(lcd->ld, 1); 5133bf3b79fab16b97b0a5a1232af760e8d7a2d3a78Jingoo Han msleep(pd->power_on_delay); 5143bf3b79fab16b97b0a5a1232af760e8d7a2d3a78Jingoo Han 515ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!pd->reset) { 516ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(lcd->dev, "reset is NULL.\n"); 51781c650e3accca9ca20232e96058aa759ceae06a5Jingoo Han return -EINVAL; 518ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 519ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 5203bf3b79fab16b97b0a5a1232af760e8d7a2d3a78Jingoo Han pd->reset(lcd->ld); 5213bf3b79fab16b97b0a5a1232af760e8d7a2d3a78Jingoo Han msleep(pd->reset_delay); 5223bf3b79fab16b97b0a5a1232af760e8d7a2d3a78Jingoo Han 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_set_brightness(struct backlight_device *bd) 601ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 602ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0, brightness = bd->props.brightness; 603ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = bl_get_data(bd); 604ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 605ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (brightness < MIN_BRIGHTNESS || 606ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae brightness > bd->props.max_brightness) { 607ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&bd->dev, "lcd brightness should be %d to %d.\n", 608ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae MIN_BRIGHTNESS, MAX_BRIGHTNESS); 609ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EINVAL; 610ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 611ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 612ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = s6e63m0_gamma_ctl(lcd, bd->props.brightness); 613ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret) { 614ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&bd->dev, "lcd brightness setting failed.\n"); 615ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -EIO; 616ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 617ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 618ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return ret; 619ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 620ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 621ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic struct lcd_ops s6e63m0_lcd_ops = { 622ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .set_power = s6e63m0_set_power, 623ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .get_power = s6e63m0_get_power, 624ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 625ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 626ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic const struct backlight_ops s6e63m0_backlight_ops = { 627ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .update_status = s6e63m0_set_brightness, 628ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 629ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 630ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic ssize_t s6e63m0_sysfs_show_gamma_mode(struct device *dev, 631ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct device_attribute *attr, char *buf) 632ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 633ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = dev_get_drvdata(dev); 634ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae char temp[10]; 635ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 636ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae switch (lcd->gamma_mode) { 637ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 0: 638ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae sprintf(temp, "2.2 mode\n"); 639ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae strcat(buf, temp); 640ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 641ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 1: 642ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae sprintf(temp, "1.9 mode\n"); 643ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae strcat(buf, temp); 644ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 645ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 2: 646ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae sprintf(temp, "1.7 mode\n"); 647ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae strcat(buf, temp); 648ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 649ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae default: 650ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_info(dev, "gamma mode could be 0:2.2, 1:1.9 or 2:1.7)n"); 651ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 652ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 653ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 654ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return strlen(buf); 655ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 656ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 657ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic ssize_t s6e63m0_sysfs_store_gamma_mode(struct device *dev, 658ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct device_attribute *attr, 659ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae const char *buf, size_t len) 660ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 661ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = dev_get_drvdata(dev); 662ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct backlight_device *bd = NULL; 663ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int brightness, rc; 664ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 665cf2b94daab9f3d21b0a393bef91292622f6a8ca4Dan Carpenter rc = kstrtouint(buf, 0, &lcd->gamma_mode); 666ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (rc < 0) 667ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return rc; 668ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 669ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae bd = lcd->bd; 670ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 671ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae brightness = bd->props.brightness; 672ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 673ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae switch (lcd->gamma_mode) { 674ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 0: 675ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae _s6e63m0_gamma_ctl(lcd, gamma_table.gamma_22_table[brightness]); 676ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 677ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 1: 678ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae _s6e63m0_gamma_ctl(lcd, gamma_table.gamma_19_table[brightness]); 679ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 680ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae case 2: 681ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae _s6e63m0_gamma_ctl(lcd, gamma_table.gamma_17_table[brightness]); 682ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 683ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae default: 684ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_info(dev, "gamma mode could be 0:2.2, 1:1.9 or 2:1.7\n"); 685ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae _s6e63m0_gamma_ctl(lcd, gamma_table.gamma_22_table[brightness]); 686ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae break; 687ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 688ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return len; 689ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 690ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 691ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic DEVICE_ATTR(gamma_mode, 0644, 692ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae s6e63m0_sysfs_show_gamma_mode, s6e63m0_sysfs_store_gamma_mode); 693ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 694ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic ssize_t s6e63m0_sysfs_show_gamma_table(struct device *dev, 695ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct device_attribute *attr, char *buf) 696ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 697ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = dev_get_drvdata(dev); 698ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae char temp[3]; 699ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 70039a6ec28bdc1385d29d9cbd4a9b385230b3cc755Masanari Iida sprintf(temp, "%u\n", lcd->gamma_table_count); 701ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae strcpy(buf, temp); 702ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 703ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return strlen(buf); 704ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 705ed3a6787bfff125a7aee88e5be0e0661887dfd15Axel Linstatic DEVICE_ATTR(gamma_table, 0444, 706ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae s6e63m0_sysfs_show_gamma_table, NULL); 707ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 7081b9e450de105c1429a15f4e2566695f4f425672aBill Pembertonstatic int s6e63m0_probe(struct spi_device *spi) 709ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 710ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae int ret = 0; 711ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct s6e63m0 *lcd = NULL; 712ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct lcd_device *ld = NULL; 713ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae struct backlight_device *bd = NULL; 714ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin struct backlight_properties props; 715ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 716541f936f5d3993c5bbed33bdb53acd6de2403b04Jingoo Han lcd = devm_kzalloc(&spi->dev, sizeof(struct s6e63m0), GFP_KERNEL); 717ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!lcd) 718ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return -ENOMEM; 719ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 720ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* s6e63m0 lcd panel uses 3-wire 9bits SPI Mode. */ 721ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae spi->bits_per_word = 9; 722ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 723ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = spi_setup(spi); 724ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret < 0) { 725ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&spi->dev, "spi setup failed.\n"); 726541f936f5d3993c5bbed33bdb53acd6de2403b04Jingoo Han return ret; 727ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 728ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 729ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->spi = spi; 730ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->dev = &spi->dev; 731ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 732c512794cada491e008eeca822af7e4ad5db72a56Jingoo Han lcd->lcd_pd = dev_get_platdata(&spi->dev); 733ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!lcd->lcd_pd) { 734ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&spi->dev, "platform data is NULL.\n"); 73581c650e3accca9ca20232e96058aa759ceae06a5Jingoo Han return -EINVAL; 736ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae } 737ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 738a18863f5e83881e3ed1f4ee92496898045e1f5c3Jingoo Han ld = devm_lcd_device_register(&spi->dev, "s6e63m0", &spi->dev, lcd, 739a18863f5e83881e3ed1f4ee92496898045e1f5c3Jingoo Han &s6e63m0_lcd_ops); 740541f936f5d3993c5bbed33bdb53acd6de2403b04Jingoo Han if (IS_ERR(ld)) 741541f936f5d3993c5bbed33bdb53acd6de2403b04Jingoo Han return PTR_ERR(ld); 742ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 743ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->ld = ld; 744ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 745ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin memset(&props, 0, sizeof(struct backlight_properties)); 746ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin props.type = BACKLIGHT_RAW; 747ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin props.max_brightness = MAX_BRIGHTNESS; 748ef22f6a70c9186c8e25f757b0e8f7374b37f69bfAxel Lin 749a18863f5e83881e3ed1f4ee92496898045e1f5c3Jingoo Han bd = devm_backlight_device_register(&spi->dev, "s6e63m0bl-bl", 750a18863f5e83881e3ed1f4ee92496898045e1f5c3Jingoo Han &spi->dev, lcd, &s6e63m0_backlight_ops, 751a18863f5e83881e3ed1f4ee92496898045e1f5c3Jingoo Han &props); 752a18863f5e83881e3ed1f4ee92496898045e1f5c3Jingoo Han if (IS_ERR(bd)) 753a18863f5e83881e3ed1f4ee92496898045e1f5c3Jingoo Han return PTR_ERR(bd); 754ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 755ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae bd->props.brightness = MAX_BRIGHTNESS; 756ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->bd = bd; 757ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 758ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* 759ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * it gets gamma table count available so it gets user 760ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * know that. 761ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae */ 762ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->gamma_table_count = 763eeb1ef3b641f078cb1079cec48a8da2bdf449f21Dan Carpenter sizeof(gamma_table) / (MAX_GAMMA_LEVEL * sizeof(int *)); 764ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 765ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = device_create_file(&(spi->dev), &dev_attr_gamma_mode); 766ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret < 0) 767ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&(spi->dev), "failed to add sysfs entries\n"); 768ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 769ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae ret = device_create_file(&(spi->dev), &dev_attr_gamma_table); 770ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (ret < 0) 771ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_err(&(spi->dev), "failed to add sysfs entries\n"); 772ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 773ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* 774ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * if lcd panel was on from bootloader like u-boot then 775ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * do not lcd on. 776ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae */ 777ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae if (!lcd->lcd_pd->lcd_enabled) { 778ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* 779ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * if lcd panel was off from bootloader then 780ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * current lcd status is powerdown and then 781ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * it enables lcd panel. 782ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae */ 783ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->power = FB_BLANK_POWERDOWN; 784ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 785ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae s6e63m0_power(lcd, FB_BLANK_UNBLANK); 786892dc2e6603034188f51b30e702498a51d8c7365Jingoo Han } else { 787ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae lcd->power = FB_BLANK_UNBLANK; 788892dc2e6603034188f51b30e702498a51d8c7365Jingoo Han } 789ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 7907652c18d5c658a155ec2708c574096ad22d1e8d1Jingoo Han spi_set_drvdata(spi, lcd); 791ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 792ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae dev_info(&spi->dev, "s6e63m0 panel driver has been probed.\n"); 793ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 794ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return 0; 795ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 796ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 7977e4b9d0bb2a6464e541d51a1e59ba73470c7c453Bill Pembertonstatic int s6e63m0_remove(struct spi_device *spi) 798ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 7997652c18d5c658a155ec2708c574096ad22d1e8d1Jingoo Han struct s6e63m0 *lcd = spi_get_drvdata(spi); 800ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 801ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae s6e63m0_power(lcd, FB_BLANK_POWERDOWN); 802d974e00b955ee390e02ae2f0eeb5ed921599ec07Axel Lin device_remove_file(&spi->dev, &dev_attr_gamma_table); 803d974e00b955ee390e02ae2f0eeb5ed921599ec07Axel Lin device_remove_file(&spi->dev, &dev_attr_gamma_mode); 804ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 805ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae return 0; 806ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 807ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 808d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Han#ifdef CONFIG_PM_SLEEP 809d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Hanstatic int s6e63m0_suspend(struct device *dev) 810ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 811d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Han struct s6e63m0 *lcd = dev_get_drvdata(dev); 812ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 813d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Han dev_dbg(dev, "lcd->power = %d\n", lcd->power); 814ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 815ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae /* 816ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * when lcd panel is suspend, lcd panel becomes off 817ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae * regardless of status. 818ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae */ 819b6bef463f5e42e959c46773806693c3277179bc4Jingoo Han return s6e63m0_power(lcd, FB_BLANK_POWERDOWN); 820ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 821ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 822d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Hanstatic int s6e63m0_resume(struct device *dev) 823ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 824d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Han struct s6e63m0 *lcd = dev_get_drvdata(dev); 825ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 826b6bef463f5e42e959c46773806693c3277179bc4Jingoo Han lcd->power = FB_BLANK_POWERDOWN; 827ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 828b6bef463f5e42e959c46773806693c3277179bc4Jingoo Han return s6e63m0_power(lcd, FB_BLANK_UNBLANK); 829ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 830ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae#endif 831ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 832d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Hanstatic SIMPLE_DEV_PM_OPS(s6e63m0_pm_ops, s6e63m0_suspend, s6e63m0_resume); 833d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Han 834ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae/* Power down all displays on reboot, poweroff or halt. */ 835ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic void s6e63m0_shutdown(struct spi_device *spi) 836ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae{ 8377652c18d5c658a155ec2708c574096ad22d1e8d1Jingoo Han struct s6e63m0 *lcd = spi_get_drvdata(spi); 838ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 839ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae s6e63m0_power(lcd, FB_BLANK_POWERDOWN); 840ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae} 841ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 842ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Daestatic struct spi_driver s6e63m0_driver = { 843ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .driver = { 844ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .name = "s6e63m0", 845ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .owner = THIS_MODULE, 846d50d7ac08b8330a6164c2a4b3ecd305f89e1fae8Jingoo Han .pm = &s6e63m0_pm_ops, 847ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae }, 848ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .probe = s6e63m0_probe, 849d1723fa266aff677571cad0bac7203ed2e424823Bill Pemberton .remove = s6e63m0_remove, 850ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae .shutdown = s6e63m0_shutdown, 851ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae}; 852ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 853462dd83833065a6b3add3f102f4fe69efa1422e9Axel Linmodule_spi_driver(s6e63m0_driver); 854ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 855ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi DaeMODULE_AUTHOR("InKi Dae <inki.dae@samsung.com>"); 856ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi DaeMODULE_DESCRIPTION("S6E63M0 LCD Driver"); 857ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi DaeMODULE_LICENSE("GPL"); 858ee378a5c6550dcbfe6fa9c71b84ca2eb19cb288eInKi Dae 859