tizen 2.4 release
[profile/mobile/platform/kernel/u-boot-tm1.git] / drivers / video / sprdfb / spi_gpio_drv.c
1 /*
2  * drivers/video/sprdfb/lcd/lcd_ili6150_lvds.c
3  *
4  * Copyright (C) 2014 Spreadtrum Communications Inc.
5  *
6  * Author: Haibing.Yang <haibing.yang@spreadtrum.com>
7  *
8  */
9
10 #include <common.h>
11
12 #include <asm/arch/sprd_lcd.h>
13 #include <asm/arch/dispc_reg.h>
14
15 #include "sprdfb.h"
16
17 #define GPIO_BASE_ADDR 0x40280000
18 #define GPIO_LVDSCHIP_OFFSET 0x480
19
20 #ifndef BIT
21 #define BIT(x) (1<<x)
22 #endif
23
24 #define GPIO_SCK_BIT BIT(6)
25 #define GPIO_CS_BIT BIT(7)
26 #define GPIO_SDI_BIT BIT(8)
27
28 #define GPIO_SPI_SCK_PIN 6
29 #define GPIO_SPI_CS_PIN 7
30 #define GPIO_SPI_SDI_PIN 8
31
32 #define DELAY_CNT 10
33
34 struct gpio_ctrl_reg {
35         volatile uint32 data; /* bits data */
36         volatile uint32 msk; /* bits data mask */
37         volatile uint32 dir; /* bits data direction */
38         volatile uint32 is; /* bits interrupt sense */
39         volatile uint32 ibe; /* bits both edges interrupt */
40         volatile uint32 iev; /* bits interrupt event */
41         volatile uint32 ie; /* bits interrupt enable */
42         volatile uint32 ris; /* bits raw interrupt status */
43         volatile uint32 mis; /* bits masked interrupt status */
44         volatile uint32 inen; /* input enable */
45 };
46
47 static int gpio_spi_write(uint32 index, uint8 len_i, uint32 data, uint8 len_d)
48 {
49         uint32 i, reg_val;
50         volatile struct gpio_ctrl_reg *regs =
51                         (volatile struct gpio_ctrl_reg *)
52                         (GPIO_BASE_ADDR + GPIO_LVDSCHIP_OFFSET);
53
54         regs->inen = 0;
55         regs->msk = GPIO_SCK_BIT | GPIO_CS_BIT | GPIO_SDI_BIT;
56         regs->dir = GPIO_SCK_BIT | GPIO_CS_BIT | GPIO_SDI_BIT;
57         regs->data = GPIO_SCK_BIT | GPIO_CS_BIT;
58
59         /* Bit[7] output 1, CS Enable */
60         reg_val = GPIO_CS_BIT;
61         regs->data = reg_val;
62         udelay(DELAY_CNT);
63
64         /* all output 0 */
65         reg_val = 0;
66         regs->data = reg_val;
67         /* Write data */
68         for (i = 0; i < len_d; ++i) {
69                 reg_val = 0;
70                 /* Get a bit value */
71                 reg_val = ((data >> (len_d - i -1)) << GPIO_SPI_SDI_PIN) & GPIO_SDI_BIT;
72                 regs->data = reg_val;
73                 udelay(DELAY_CNT);
74                 /* High clock to set bit */
75                 regs->data |= GPIO_SCK_BIT;
76                 udelay(DELAY_CNT);
77         }
78
79         /* Write index */
80         for (i = 0; i < len_i; ++i) {
81                 reg_val = 0;
82                 /* Get a bit value */
83                 reg_val = ((index >> (len_i - i -1)) << GPIO_SPI_SDI_PIN) & GPIO_SDI_BIT;
84                 regs->data = reg_val;
85                 udelay(DELAY_CNT);
86                 /* High clock to set bit */
87                 regs->data |= GPIO_SCK_BIT;
88                 udelay(DELAY_CNT);
89         }
90
91         regs->data = 0;
92         udelay(DELAY_CNT);
93         regs->data |= GPIO_CS_BIT;
94         udelay(DELAY_CNT);
95         regs->data |= GPIO_SCK_BIT;
96         udelay(DELAY_CNT * 20);
97
98         return 0;
99 }
100
101 static int gpio_spi_read(uint32 index, uint8 len_i, uint32 data, uint8 len_d)
102 {
103         uint32 i, reg_val = 0, rd_val = 0;
104         uint32 rd_reg[16] = { 0 };
105         uint32 rd_reg1[16] = { 0 };
106         uint32 rd_reg2[16] = { 0 };
107         volatile struct gpio_ctrl_reg *regs =
108                         (volatile struct gpio_ctrl_reg *)
109                         (GPIO_BASE_ADDR + GPIO_LVDSCHIP_OFFSET);
110
111         regs->inen = 0;
112         regs->msk = GPIO_SCK_BIT | GPIO_CS_BIT | GPIO_SDI_BIT;
113         regs->dir = GPIO_SCK_BIT | GPIO_CS_BIT | GPIO_SDI_BIT;
114         regs->data = GPIO_SCK_BIT | GPIO_CS_BIT;
115
116         /* Bit[7] output 1 */
117         reg_val = GPIO_CS_BIT;
118         regs->data = reg_val;
119         udelay(DELAY_CNT);
120
121         /* all output 0 */
122         reg_val = 0;
123         regs->data = reg_val;
124
125         for (i = 0; i < len_d; ++i) {
126                 reg_val = 0;
127                 reg_val = ((data >> (len_d - i -1)) << GPIO_SPI_SDI_PIN) & GPIO_SDI_BIT;
128                 regs->data = reg_val;
129                 udelay(DELAY_CNT);
130
131                 regs->data |= GPIO_SCK_BIT;
132                 udelay(DELAY_CNT);
133         }
134
135         for (i = 0; i < len_i; ++i) {
136                 reg_val = 0;
137                 reg_val = ((index >> (len_i - i -1)) << GPIO_SPI_SDI_PIN) & GPIO_SDI_BIT;
138                 regs->data = reg_val;
139                 udelay(DELAY_CNT);
140
141                 regs->data |= GPIO_SCK_BIT;
142                 udelay(DELAY_CNT);
143         }
144
145         regs->data = 0;
146         udelay(DELAY_CNT);
147         regs->data |= GPIO_CS_BIT;
148         udelay(DELAY_CNT);
149         regs->inen |= GPIO_SDI_BIT;
150         regs->dir &= ~GPIO_SDI_BIT;
151         regs->data |= GPIO_SCK_BIT;
152         udelay(DELAY_CNT);
153         regs->data &= ~GPIO_SCK_BIT;
154
155         for (i = 0; i < 16; ++i) {
156                 udelay(DELAY_CNT);
157                 regs->data |= GPIO_SCK_BIT;
158                 rd_reg[i] = regs->data & GPIO_SDI_BIT;
159                 rd_reg1[i] = rd_reg[i] >> 10;
160                 rd_reg2[i] = rd_reg1[i] << (15 - i);
161                 rd_val |= rd_reg2[i];
162                 udelay(DELAY_CNT);
163                 regs->data &= ~GPIO_SCK_BIT;
164         }
165
166         udelay(DELAY_CNT);
167         regs->data |= GPIO_CS_BIT;
168         udelay(DELAY_CNT);
169         regs->data |= GPIO_SCK_BIT;
170         regs->data |= GPIO_SDI_BIT;
171         udelay(DELAY_CNT * 50);
172
173         return rd_val;
174 }
175
176 int sprdchip_lvds_init(void)
177 {
178         uint32 i, rd_val1, rd_val2;
179         for (i = 0; i < 50; ++i) {
180                 gpio_spi_write(27, 18, 0, 16);
181                 rd_val1 = gpio_spi_read(63, 18, 27, 16);
182         }
183
184         for (i = 0; i < 50; ++i) {
185                 gpio_spi_write(28, 18, 10240, 16);
186                 gpio_spi_write(27, 18, 16, 16);
187                 rd_val1 = gpio_spi_read(63, 18, 27, 16);
188                 rd_val2 = gpio_spi_read(63, 18, 28, 16);
189         }
190 }