Merge remote-tracking branch 'stable/linux-3.0.y' into develop-3.0
[firefly-linux-kernel-4.4.55.git] / drivers / video / display / screen / lcd_hx8357.c
1 #include <linux/fb.h>
2 #include <linux/delay.h>
3 #include "../../rk29_fb.h"
4 #include <mach/gpio.h>
5 #include <mach/iomux.h>
6 #include <mach/board.h>
7 #include "screen.h"
8
9
10 /* Base */
11 #define OUT_TYPE                SCREEN_RGB
12 #define OUT_FACE                OUT_P666        /*OUT_P888*/
13 #define OUT_CLK                  10000000       //***27
14 #define LCDC_ACLK       150000000     //29 lcdc axi DMA ÆµÂÊ
15
16 /* Timing */
17 #define H_PW                    8
18 #define H_BP                    6
19 #define H_VD                    320     //***800
20 #define H_FP                    60
21
22 #define V_PW                    12
23 #define V_BP                    4
24 #define V_VD                    480     //***480
25 #define V_FP                    40
26
27 #define LCD_WIDTH       320    //need modify
28 #define LCD_HEIGHT      480
29
30 /* Other */
31 #define DCLK_POL                0
32 #define SWAP_RB                 0
33
34 static struct rk29lcd_info *gLcd_info = NULL;
35 int init(void);
36 int standby(u8 enable);
37
38
39 #define TXD_PORT        gLcd_info->txd_pin
40 #define CLK_PORT        gLcd_info->clk_pin
41 #define CS_PORT         gLcd_info->cs_pin
42
43 #define CS_OUT()        gpio_direction_output(CS_PORT, 0)
44 #define CS_SET()        gpio_set_value(CS_PORT, GPIO_HIGH)
45 #define CS_CLR()        gpio_set_value(CS_PORT, GPIO_LOW)
46 #define CLK_OUT()       gpio_direction_output(CLK_PORT, 0)
47 #define CLK_SET()       gpio_set_value(CLK_PORT, GPIO_HIGH)
48 #define CLK_CLR()       gpio_set_value(CLK_PORT, GPIO_LOW)
49 #define TXD_OUT()       gpio_direction_output(TXD_PORT, 0)
50 #define TXD_SET()       gpio_set_value(TXD_PORT, GPIO_HIGH)
51 #define TXD_CLR()       gpio_set_value(TXD_PORT, GPIO_LOW)
52
53 #if 0
54 static void screen_set_iomux(u8 enable)
55 {
56     int ret=-1;
57     if(enable)
58     {
59         rk29_mux_api_set(GPIOH6_IQ_SEL_NAME, 0);
60         ret = gpio_request(RK29_PIN_PH6, NULL);
61         if(0)//(ret != 0)
62         {
63             gpio_free(RK29_PIN_PH6);
64             printk(">>>>>> lcd cs gpio_request err \n ");
65             goto pin_err;
66         }
67
68         rk29_mux_api_set(GPIOE_I2C0_SEL_NAME, 1);
69
70         ret = gpio_request(RK29_PIN_PE5, NULL);
71         if(0)//(ret != 0)
72         {
73             gpio_free(RK29_PIN_PE5);
74             printk(">>>>>> lcd clk gpio_request err \n ");
75             goto pin_err;
76         }
77
78         ret = gpio_request(RK29_PIN_PE4, NULL);
79         if(0)//(ret != 0)
80         {
81             gpio_free(RK29_PIN_PE4);
82             printk(">>>>>> lcd txd gpio_request err \n ");
83             goto pin_err;
84         }
85     }
86     else
87     {
88          gpio_free(RK29_PIN_PH6);
89        //  rk29_mux_api_set(CXGPIO_HSADC_SEL_NAME, 1);
90
91          gpio_free(RK29_PIN_PE5);
92          gpio_free(RK29_PIN_PE4);
93          rk29_mux_api_set(GPIOE_I2C0_SEL_NAME, 0);
94     }
95     return ;
96 pin_err:
97     return ;
98
99 }
100 #endif
101
102 void spi_screenreg_set(u32 Addr, u32 Data)
103 {
104 #define DRVDelayUs(i)   udelay(i*2)
105
106     u32 i;
107     u32 control_bit;
108
109
110     TXD_OUT();
111     CLK_OUT();
112     CS_OUT();
113     DRVDelayUs(2);
114     DRVDelayUs(2);
115
116     CS_SET();
117     TXD_SET();
118     CLK_SET();
119     DRVDelayUs(2);
120
121         CS_CLR();
122         control_bit = 0x70<<8;
123         Addr = (control_bit | Addr);
124         //printk("addr is 0x%x \n", Addr);
125         for(i = 0; i < 16; i++)  //reg
126         {
127                 if(Addr &(1<<(15-i)))
128                         TXD_SET();
129                 else
130                         TXD_CLR();
131
132                 // \u6a21\u62dfCLK
133                 CLK_CLR();
134                 DRVDelayUs(2);
135                 CLK_SET();
136                 DRVDelayUs(2);
137         }
138
139         CS_SET();
140         TXD_SET();
141         CLK_SET();
142         DRVDelayUs(2);
143         CS_CLR();
144
145         control_bit = 0x72<<8;
146         Data = (control_bit | Data);
147         //printk("data is 0x%x \n", Data);
148         for(i = 0; i < 16; i++)  //data
149         {
150                 if(Data &(1<<(15-i)))
151                         TXD_SET();
152                 else
153                         TXD_CLR();
154
155                 // \u6a21\u62dfCLK
156                 CLK_CLR();
157                 DRVDelayUs(2);
158                 CLK_SET();
159                 DRVDelayUs(2);
160         }
161
162         CS_SET();
163         CLK_CLR();
164         TXD_CLR();
165         DRVDelayUs(2);
166 }
167
168 void set_lcd_info(struct rk29fb_screen *screen, struct rk29lcd_info *lcd_info )
169 {
170         //printk("lcd_hx8357 set_lcd_info \n");
171     /* screen type & face */
172     screen->type = OUT_TYPE;
173     screen->face = OUT_FACE;
174
175     /* Screen size */
176     screen->x_res = H_VD;
177     screen->y_res = V_VD;
178
179     screen->width = LCD_WIDTH;
180     screen->height = LCD_HEIGHT;
181
182     /* Timing */
183     screen->lcdc_aclk = LCDC_ACLK;
184     screen->pixclock = OUT_CLK;
185         screen->left_margin = H_BP;             /*>2*/
186         screen->right_margin = H_FP;    /*>2*/
187         screen->hsync_len = H_PW;               /*>2*/ //***all > 326, 4<PW+BP<15,
188         screen->upper_margin = V_BP;    /*>2*/
189         screen->lower_margin = V_FP;    /*>2*/
190         screen->vsync_len = V_PW;               /*>6*/
191
192         /* Pin polarity */
193         screen->pin_hsync = 0;
194         screen->pin_vsync = 0;
195         screen->pin_den = 0;
196         screen->pin_dclk = DCLK_POL;
197
198         /* Swap rule */
199     screen->swap_rb = SWAP_RB;
200     screen->swap_rg = 0;
201     screen->swap_gb = 0;
202     screen->swap_delta = 0;
203     screen->swap_dumy = 0;
204
205     /* Operation function*/
206     screen->init = init;
207     screen->standby = standby;
208     if(lcd_info)
209         gLcd_info = lcd_info;
210 }
211
212 int init(void)
213 {
214
215     if(gLcd_info)
216         gLcd_info->io_init();
217
218 #if 0                                                                                   //***Õâ¾ä´úÂëÊDz»ÊÇд´íÁË
219     spi_screenreg_set(0x02, 0x07);
220     spi_screenreg_set(0x03, 0x5f);
221     spi_screenreg_set(0x04, 0x17);
222     spi_screenreg_set(0x05, 0x20);
223     spi_screenreg_set(0x06, 0x08);
224     spi_screenreg_set(0x07, 0x20);
225     spi_screenreg_set(0x08, 0x20);
226     spi_screenreg_set(0x09, 0x20);
227     spi_screenreg_set(0x0a, 0x20);
228     spi_screenreg_set(0x0b, 0x22);
229     spi_screenreg_set(0x0c, 0x22);
230     spi_screenreg_set(0x0d, 0x22);
231     spi_screenreg_set(0x0e, 0x10);
232     spi_screenreg_set(0x0f, 0x10);
233     spi_screenreg_set(0x10, 0x10);
234
235     spi_screenreg_set(0x11, 0x15);
236     spi_screenreg_set(0x12, 0xAA);
237     spi_screenreg_set(0x13, 0xFF);
238     spi_screenreg_set(0x14, 0xb0);
239     spi_screenreg_set(0x15, 0x8e);
240     spi_screenreg_set(0x16, 0xd6);
241     spi_screenreg_set(0x17, 0xfe);
242     spi_screenreg_set(0x18, 0x28);
243     spi_screenreg_set(0x19, 0x52);
244     spi_screenreg_set(0x1A, 0x7c);
245
246     spi_screenreg_set(0x1B, 0xe9);
247     spi_screenreg_set(0x1C, 0x42);
248     spi_screenreg_set(0x1D, 0x88);
249     spi_screenreg_set(0x1E, 0xb8);
250     spi_screenreg_set(0x1F, 0xFF);
251     spi_screenreg_set(0x20, 0xF0);
252     spi_screenreg_set(0x21, 0xF0);
253     spi_screenreg_set(0x22, 0x09);
254 #else
255         spi_screenreg_set(0xff, 0x00);
256         spi_screenreg_set(0x16, 0x08);
257         spi_screenreg_set(0x01, 0x02);
258         spi_screenreg_set(0xe2, 0x00);
259         spi_screenreg_set(0xe3, 0x00);
260         spi_screenreg_set(0xf2, 0x00);
261         spi_screenreg_set(0xe4, 0x1c);
262         spi_screenreg_set(0xe5, 0x1c);
263         spi_screenreg_set(0xe6, 0x00);
264         spi_screenreg_set(0xe7, 0x1c);
265
266         spi_screenreg_set(0x19, 0x01);
267         mdelay(10);
268         spi_screenreg_set(0x2a, 0x00);
269         spi_screenreg_set(0x2b, 0x13);
270         spi_screenreg_set(0x2f, 0x01);
271         spi_screenreg_set(0x02, 0x00);
272         spi_screenreg_set(0x03, 0x00);
273         spi_screenreg_set(0x04, 0x01);
274         spi_screenreg_set(0x05, 0x3f);
275         spi_screenreg_set(0x06, 0x00);
276         spi_screenreg_set(0x07, 0x00);
277
278         spi_screenreg_set(0x08, 0x01);
279         spi_screenreg_set(0x09, 0xdf);
280         spi_screenreg_set(0x24, 0x91);
281         spi_screenreg_set(0x25, 0x8a);
282         spi_screenreg_set(0x29, 0x01);
283         spi_screenreg_set(0x18, 0x22);
284         spi_screenreg_set(0x1b, 0x30);
285         mdelay(10);
286         spi_screenreg_set(0x1d, 0x22);
287         mdelay(10);
288         spi_screenreg_set(0x40, 0x00);
289         spi_screenreg_set(0x41, 0x3c);
290         spi_screenreg_set(0x42, 0x38);
291         spi_screenreg_set(0x43, 0x34);
292         spi_screenreg_set(0x44, 0x2e);
293         spi_screenreg_set(0x45, 0x2f);
294         spi_screenreg_set(0x46, 0x41);
295         spi_screenreg_set(0x47, 0x7d);
296         spi_screenreg_set(0x48, 0x0b);
297         spi_screenreg_set(0x49, 0x05);
298         spi_screenreg_set(0x4a, 0x06);
299         spi_screenreg_set(0x4b, 0x12);
300         spi_screenreg_set(0x4c, 0x16);
301         spi_screenreg_set(0x50, 0x10);
302         spi_screenreg_set(0x51, 0x11);
303         spi_screenreg_set(0x52, 0x0b);
304         spi_screenreg_set(0x53, 0x07);
305         spi_screenreg_set(0x54, 0x03);
306         spi_screenreg_set(0x55, 0x3f);
307         spi_screenreg_set(0x56, 0x02);
308         spi_screenreg_set(0x57, 0x3e);
309         spi_screenreg_set(0x58, 0x09);
310         spi_screenreg_set(0x59, 0x0d);
311         spi_screenreg_set(0x5a, 0x19);
312         spi_screenreg_set(0x5b, 0x1a);
313         spi_screenreg_set(0x5c, 0x14);
314         spi_screenreg_set(0x5d, 0xc0);
315         spi_screenreg_set(0x1a, 0x05);
316         mdelay(10);
317
318         spi_screenreg_set(0x1c, 0x03);
319         mdelay(10);
320         spi_screenreg_set(0x1f, 0x90);
321         mdelay(10);
322         spi_screenreg_set(0x1f, 0xd2);
323         mdelay(10);
324         spi_screenreg_set(0x28, 0x04);
325         mdelay(40);
326         spi_screenreg_set(0x28, 0x38);
327         mdelay(40);
328         spi_screenreg_set(0x28, 0x3c);
329         mdelay(40);
330         spi_screenreg_set(0x80, 0x00);
331         spi_screenreg_set(0x81, 0x00);
332         spi_screenreg_set(0x82, 0x00);
333         spi_screenreg_set(0x83, 0x00);
334
335         spi_screenreg_set(0x60, 0x08);
336         spi_screenreg_set(0x31, 0x02);
337         spi_screenreg_set(0x32, 0x08 /*0x00*/);
338         spi_screenreg_set(0x17, 0x60);  //***RGB666
339         spi_screenreg_set(0x2d, 0x1f);
340         spi_screenreg_set(0xe8, 0x90);
341 #endif
342     if(gLcd_info)
343         gLcd_info->io_deinit();
344
345     return 0;
346 }
347
348 int standby(u8 enable)  //***enable =1 means suspend, 0 means resume
349 {
350
351     if(gLcd_info)
352         gLcd_info->io_init();
353         if(enable) {
354                 //printk("---------hx8357   screen suspend--------------\n");
355                 #if 0
356                 spi_screenreg_set(0x03, 0xde);
357                 #else
358                 //modify by robert
359                 #if 0
360                 spi_screenreg_set(0x1f, 0x91);
361                 spi_screenreg_set(0x19, 0x00);
362                 #else
363                 spi_screenreg_set(0x28, 0x38);
364                 msleep(10);
365                 spi_screenreg_set(0x28, 0x24);
366                 msleep(10);
367                 spi_screenreg_set(0x28, 0x04);
368                 #endif
369                 //modify end
370                 #endif
371         } else {
372                 //printk("---------  hx8357 screen resume--------------\n ");
373                 #if 0
374                 spi_screenreg_set(0x03, 0x5f);
375                 #else
376                 //modify by robert
377                 #if 0
378                 spi_screenreg_set(0x19, 0x01);
379                 spi_screenreg_set(0x1f, 0x90);
380                 mdelay(10);
381                 spi_screenreg_set(0x1f, 0xd2);
382                 #else
383                 spi_screenreg_set(0x28, 0x38);
384                 msleep(10);
385                 spi_screenreg_set(0x28, 0x3c);
386                 msleep(10);
387                 spi_screenreg_set(0x80, 0x00);
388                 spi_screenreg_set(0x81, 0x00);
389                 spi_screenreg_set(0x82, 0x00);
390                 spi_screenreg_set(0x83, 0x00);
391
392                 #endif
393                 //modify end
394                 #endif
395         }
396
397     if(gLcd_info)
398         gLcd_info->io_deinit();
399     return 0;
400 }
401