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