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