Merge tag 'lsk-android-14.02' into develop-3.10
[firefly-linux-kernel-4.4.55.git] / drivers / spi / spi-rockchip-test.c
1 /*drivers/serial/spi_test.c -spi test driver\r
2  *\r
3  *\r
4  * This program is distributed in the hope that it will be useful,\r
5  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
6  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
7  * GNU General Public License for more details.\r
8  */\r
9 #include <linux/interrupt.h>\r
10 #include <linux/slab.h>\r
11 #include <linux/init.h>\r
12 #include <linux/module.h>\r
13 #include <linux/workqueue.h>\r
14 #include <linux/interrupt.h>\r
15 #include <linux/delay.h>\r
16 #include <linux/clk.h>\r
17 #include <linux/fs.h>\r
18 #include <linux/dma-mapping.h>\r
19 #include <linux/dmaengine.h>\r
20 #include <linux/platform_device.h>\r
21 #include <linux/pm_runtime.h>\r
22 #include <linux/spi/spi.h>\r
23 #include <linux/gpio.h>\r
24 #include <linux/of.h>\r
25 #include <linux/of_gpio.h>\r
26 #include <linux/miscdevice.h>\r
27 #include <linux/platform_data/spi-rockchip.h>\r
28 #include <asm/uaccess.h>\r
29 \r
30 #include "spi-rockchip-core.h"\r
31 \r
32 \r
33 #define MAX_SPI_BUS_NUM 2\r
34 \r
35 struct spi_test_data {\r
36         struct device   *dev;\r
37         struct spi_device       *spi;   \r
38         char *rx_buf;\r
39         int rx_len; \r
40         char *tx_buf;\r
41         int tx_len; \r
42 };\r
43 static struct spi_test_data *g_spi_test_data[MAX_SPI_BUS_NUM];\r
44 \r
45 \r
46 static struct dw_spi_chip spi_test_chip[] = {\r
47 {\r
48         //.poll_mode = 1,\r
49         .enable_dma = 1,\r
50 },\r
51 {\r
52         //.poll_mode = 1,\r
53         .enable_dma = 1,\r
54 },\r
55 \r
56 };\r
57 \r
58         \r
59 static struct spi_board_info board_spi_test_devices[] = {       \r
60 //#if defined(CONFIG_SPIM0_RK29)\r
61         {\r
62                 .modalias  = "spi_test_bus0",\r
63                 .bus_num = 0,   //0 or 1\r
64                 .max_speed_hz  = 12*1000*1000,\r
65                 .chip_select   = 0,             \r
66                 .mode   = SPI_MODE_0,\r
67                 .controller_data = &spi_test_chip[0],\r
68         },\r
69 //#endif\r
70 //#if defined(CONFIG_SPIM1_RK29)\r
71         {\r
72                 .modalias  = "spi_test_bus1",\r
73                 .bus_num = 1,   //0 or 1\r
74                 .max_speed_hz  = 12*1000*1000,\r
75                 .chip_select   = 0,             \r
76                 .mode   = SPI_MODE_0,\r
77                 .controller_data = &spi_test_chip[1],\r
78         }\r
79 //#endif\r
80 };\r
81 \r
82 static ssize_t spi_test_write(struct file *file, \r
83                         const char __user *buf, size_t count, loff_t *offset)\r
84 {\r
85         u8 nr_buf[8];\r
86         int nr = 0, ret;\r
87         int i = 0;\r
88         struct spi_device *spi = NULL;\r
89         char txbuf[256],rxbuf[256];\r
90 \r
91         printk("%s:0:bus=0,cs=0; 1:bus=0,cs=1; 2:bus=1,cs=0; 3:bus=1,cs=1\n",__func__);\r
92 \r
93         if(count > 3)\r
94             return -EFAULT;\r
95         \r
96         ret = copy_from_user(nr_buf, buf, count);\r
97         if(ret < 0)\r
98             return -EFAULT;\r
99 \r
100         sscanf(nr_buf, "%d", &nr);\r
101         if(nr >= 4 || nr < 0)\r
102         {\r
103                 printk("%s:cmd is error\n",__func__);\r
104             return -EFAULT;\r
105         }\r
106         \r
107         for(i=0; i<256; i++)\r
108         txbuf[i] = i;\r
109 \r
110 \r
111 /*\r
112         if((nr == 0) || (nr == 1))\r
113         {\r
114                 printk("%s:error SPIM0 need selected\n",__func__);      \r
115                 return -EFAULT;\r
116         }\r
117 \r
118         if((nr == 2) || (nr == 3))\r
119         {\r
120                 printk("%s:error SPIM1 need selected\n",__func__);      \r
121                 return -EFAULT;\r
122         }\r
123 */\r
124 \r
125         switch(nr)\r
126         {\r
127                 case 0: \r
128                         if(!g_spi_test_data[0]->spi)            \r
129                         return -EFAULT;\r
130                         spi = g_spi_test_data[0]->spi;\r
131                         spi->chip_select = 0;\r
132                         break;\r
133                 case 1: \r
134                         if(!g_spi_test_data[0]->spi)            \r
135                         return -EFAULT;\r
136                         spi = g_spi_test_data[0]->spi;\r
137                         spi->chip_select = 1;\r
138                         break;\r
139                 case 2: \r
140                         if(!g_spi_test_data[1]->spi)            \r
141                         return -EFAULT;\r
142                         spi = g_spi_test_data[1]->spi;\r
143                         spi->chip_select = 0;\r
144                         break;\r
145                 case 3: \r
146                         if(!g_spi_test_data[1]->spi)            \r
147                         return -EFAULT;\r
148                         spi = g_spi_test_data[1]->spi;\r
149                         spi->chip_select = 1;\r
150                         break;\r
151                 \r
152                 default:\r
153                         break;\r
154         }\r
155 \r
156         for(i=0; i<100; i++)\r
157         {\r
158                 ret = spi_write(spi, txbuf, 256);\r
159                 ret = spi_read(spi, rxbuf, 256);\r
160                 ret = spi_write_then_read(spi,txbuf,256,rxbuf,256);             \r
161                 ret = spi_write_and_read(spi,txbuf,rxbuf,256);\r
162                 printk("%s:test %d times\n\n",__func__,i+1);\r
163         }\r
164         \r
165         if(!ret)\r
166         printk("%s:bus_num=%d,chip_select=%d,ok\n",__func__,spi->master->bus_num, spi->chip_select);\r
167         else\r
168         printk("%s:bus_num=%d,chip_select=%d,error\n",__func__,spi->master->bus_num, spi->chip_select);\r
169         \r
170         return count;\r
171 }\r
172 \r
173 \r
174 static const struct file_operations spi_test_fops = {\r
175         .write = spi_test_write,\r
176 };\r
177 \r
178 static struct miscdevice spi_test_misc = {\r
179         .minor = MISC_DYNAMIC_MINOR,\r
180         .name = "spi_misc_test",\r
181         .fops = &spi_test_fops,\r
182 };\r
183 \r
184 static int spi_test_probe(struct spi_device *spi)\r
185 {       \r
186         struct spi_test_data *spi_test_data;\r
187         int ret;\r
188         int i =0;\r
189         char txbuf[256],rxbuf[256];\r
190         \r
191         if(!spi)        \r
192         return -ENOMEM;\r
193 \r
194         if((spi->master->bus_num >= MAX_SPI_BUS_NUM) || (spi->master->bus_num < 0))\r
195         {\r
196                 printk("%s:error:bus_num=%d\n",__func__, spi->master->bus_num); \r
197                 return -ENOMEM;\r
198         }\r
199         \r
200         spi_test_data = (struct spi_test_data *)kzalloc(sizeof(struct spi_test_data), GFP_KERNEL);\r
201         if(!spi_test_data){\r
202                 dev_err(&spi->dev, "ERR: no memory for spi_test_data\n");\r
203                 return -ENOMEM;
204         }\r
205 \r
206         spi->bits_per_word = 8;\r
207         \r
208         spi_test_data->spi = spi;\r
209         spi_test_data->dev = &spi->dev;\r
210         ret = spi_setup(spi);\r
211         if (ret < 0){\r
212                 dev_err(spi_test_data->dev, "ERR: fail to setup spi\n");\r
213                 return -1;\r
214         }       \r
215 \r
216         g_spi_test_data[spi->master->bus_num] = spi_test_data;\r
217 \r
218         printk("%s:bus_num=%d,ok\n",__func__,spi->master->bus_num);\r
219         return ret;\r
220 \r
221 }\r
222 \r
223 static const struct spi_device_id spi_test_id[] = {             \r
224         {"spi_test_bus0", 0},\r
225         {"spi_test_bus1", 1},\r
226         {},\r
227 };\r
228 \r
229 \r
230 static struct spi_driver spi_test_driver = {\r
231         .driver = {\r
232                 .name           = "spi_test",\r
233                 .bus            = &spi_bus_type,\r
234                 .owner          = THIS_MODULE,\r
235         },\r
236         .id_table = spi_test_id,\r
237 \r
238         .probe          = spi_test_probe,\r
239 };\r
240 \r
241 static int __init spi_test_init(void)\r
242 {       \r
243         printk("%s\n",__func__);\r
244         spi_register_board_info(board_spi_test_devices, ARRAY_SIZE(board_spi_test_devices));\r
245         misc_register(&spi_test_misc);\r
246         return spi_register_driver(&spi_test_driver);\r
247 }\r
248 \r
249 static void __exit spi_test_exit(void)\r
250 {\r
251         misc_deregister(&spi_test_misc);\r
252         return spi_unregister_driver(&spi_test_driver);\r
253 }\r
254 module_init(spi_test_init);\r
255 module_exit(spi_test_exit);\r
256 \r