change source file mode to 0644 instead of 0755
[profile/mobile/platform/kernel/u-boot-tm1.git] / drivers / video / sprdfb / sprdfb_spi.c
1 /*\r
2  * Copyright (C) 2012 Spreadtrum Communications Inc.\r
3  *\r
4  */\r
5 #include <common.h>\r
6 #include <asm/arch/sci_types.h>\r
7 #include <asm/arch/sprd_lcd.h>\r
8 #include <asm/arch/sprd_spi.h>\r
9 \r
10 #include "sprdfb.h"\r
11 \r
12 #define REG32(x)              (*((volatile uint32 *)(x)))\r
13 \r
14 \r
15  SPI_INIT_PARM spi_int_parm[] =\r
16  {\r
17         {\r
18          TX_POS_EDGE,\r
19          RX_NEG_EDGE,\r
20          TX_RX_MSB,\r
21          RX_TX_MODE,\r
22          NO_SWITCH,\r
23          MASTER_MODE,\r
24          0x0,\r
25          0x0,\r
26          0xF0, //clk_div:(n+1)*2\r
27          0x0, //data_width.0-32bits per word; n-nbits per word\r
28          0x0,\r
29          SPI_TX_FIFO_DEPTH - 1,\r
30          0x0,\r
31          SPI_RX_FIFO_DEPTH - 1\r
32          },  //for spi_lcm test\r
33         //{TX_POS_EDGE,RX_NEG_EDGE,TX_RX_LSB,RX_TX_MODE,NO_SWITCH,SLAVE_MODE,0x0,0x0,0xF0,0x0,0x0,SPI_TX_FIFO_DEPTH - 1,0x0,SPI_RX_FIFO_DEPTH - 1},\r
34  };\r
35 \r
36 \r
37  /**---------------------------------------------------------------------------*\r
38  **                 SPI Interface for LCM test case  depend on spi_drv.c      *\r
39  **---------------------------------------------------------------------------*/\r
40 //CASE1: \r
41 // --------------------------------------------------------------------------- //\r
42 //  Description:   configure the start byte\r
43 //      Global resource dependence: \r
44 //  Author:         lichd\r
45 //  Note  : LCM test code \r
46 // --------------------------------------------------------------------------- //\r
47 \r
48 static void DISPC_SpiWriteCmd(uint32_t cmd)\r
49 {\r
50         SPI_SetDatawidth(8);\r
51         SPI_SetCsLow(0, TRUE);\r
52         SPI_SetCd( 0 );\r
53 \r
54         // Write a data identical with buswidth\r
55         SPI_WriteData( cmd, 1, 0);\r
56 \r
57         SPI_SetCsLow(0, FALSE);\r
58 }\r
59 \r
60 static void DISPC_SpiWriteData(uint32_t data)\r
61 {\r
62         SPI_SetDatawidth(8);\r
63 \r
64         SPI_SetCsLow(0, TRUE);\r
65         SPI_SetCd( 1 );\r
66 \r
67         // Write a data identical with buswidth\r
68         SPI_WriteData( data, 1, 0);\r
69 \r
70         SPI_SetCsLow(0, FALSE);\r
71 }\r
72 \r
73 static void SPI_Read( uint32_t* data)\r
74 {\r
75         uint32_t lcm_id=0;\r
76 \r
77         SPI_SetCsLow(0, FALSE);\r
78         {\r
79                 uint32_t i=0;\r
80                 for(i=0; i<1000; i++);\r
81         }\r
82 \r
83         SPI_SetCsLow(0, TRUE);\r
84         SPI_SetCd( 1 );\r
85         SPI_SetDatawidth(8);\r
86 \r
87         //Read data 16bits\r
88         lcm_id = SPI_ReadData(1, 0);  //unit of buswidth\r
89 \r
90         *data = lcm_id;\r
91 }\r
92 \r
93 void SPI_PinCfg( void )\r
94 {\r
95         /*enable access the spi reg*/\r
96         *((volatile uint32 *)(0x4b000008)) |= BIT_1;\r
97         *((volatile uint32 *)(0x4b0000c0)) |= BIT_0;\r
98 /*\r
99         //select spi0_2\r
100         CHIP_REG_SET (PIN_LCD_D6_REG, (PIN_FPD_EN | PIN_FUNC_1 | PIN_O_EN)); //SPI0_2_CD\r
101         CHIP_REG_SET (PIN_LCD_RDN_REG, (PIN_FPD_EN | PIN_FUNC_1 | PIN_I_EN)); //SPI0_2_DI\r
102         CHIP_REG_SET (PIN_LCD_WRN_REG, (PIN_FPD_EN | PIN_FUNC_1 | PIN_O_EN)); //SPI0_2_DO\r
103         CHIP_REG_SET (PIN_LCD_CD_REG, (PIN_FPD_EN | PIN_FUNC_1 | PIN_O_EN)); //SPI0_2_CLK\r
104         CHIP_REG_SET (PIN_LCD_CSN0_REG, (PIN_FPD_EN | PIN_FUNC_1 | PIN_O_EN)); //SPI0_2_CS0\r
105 */\r
106 #if 0\r
107         TB_REG_OR(GEN0, (1 << 13));\r
108 \r
109         //select spi0_1\r
110         TB_REG_SET (PIN_LCD_D0_REG, (PIN_DS_2 | PIN_FUNC_1 )); //SPI0_1_DI\r
111         TB_REG_SET (PIN_LCD_D1_REG, (PIN_DS_2 | PIN_FUNC_1 )); //SPI0_1_DO\r
112         TB_REG_SET (PIN_LCD_D2_REG, (PIN_DS_2 | PIN_FUNC_1 )); //SPI0_1_CLK     \r
113         TB_REG_SET (PIN_LCD_D3_REG, (PIN_DS_2 | PIN_FUNC_1 )); //SPI0_1_CS0    \r
114         TB_REG_SET (PIN_LCD_D4_REG, (PIN_DS_2 | PIN_FUNC_1 )); //SPI0_1_CS1       \r
115         TB_REG_SET (PIN_LCD_D5_REG, (PIN_DS_2 | PIN_FUNC_1 )); //SPI0_1_CD \r
116 \r
117         // \r
118         TB_REG_AND(PIN_CTL_REG, ~(BIT_29|BIT_30));\r
119         TB_REG_OR(PIN_CTL_REG, (1<<29));\r
120 #endif\r
121 }\r
122 \r
123 BOOLEAN sprdfb_spi_init(struct sprdfb_device *dev)\r
124 {\r
125 #ifdef CONFIG_SPX15\r
126 \r
127         /*enable the SPISPI1 and SPI2*/\r
128         REG32(0x71300000) |= BIT_5 | BIT_6 | BIT_7;\r
129 \r
130         REG32(0x71300004) |= BIT_5 | BIT_6 | BIT_7;\r
131 \r
132         REG32(0x71300004) &= ~(BIT_5 | BIT_6 | BIT_7);\r
133 \r
134 #else\r
135         SPI_PinCfg();\r
136 \r
137         /*reset the spi2*/\r
138         *((volatile uint32 *)(0x4b00004c))|= BIT_31;\r
139         *((volatile uint32 *)(0x4b00004c)) &= ~BIT_31;\r
140 \r
141 #endif\r
142 \r
143 \r
144 //      SPI_Enable(SPI_USED_ID, TRUE);\r
145         SPI_Init( spi_int_parm);\r
146 \r
147 //      SPI_ClkSetting( SPI_USED_ID, SPICLK_SEL_78M, 0);\r
148 //      SPI_SetDatawidth(9);\r
149 //      SPI_SetSpiMode( SPIMODE_3WIRE_9BIT_SDIO );\r
150         return TRUE;\r
151 }\r
152 \r
153 BOOLEAN sprdfb_spi_uninit(struct sprdfb_device *dev)\r
154 {\r
155         return TRUE;\r
156 }\r
157 \r
158 struct ops_spi sprdfb_spi_ops = {\r
159         .spi_send_cmd = DISPC_SpiWriteCmd,\r
160         .spi_send_data = DISPC_SpiWriteData,\r
161         .spi_read = SPI_Read,\r
162 };\r
163 \r
164 \r