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