rk3066b:add spi support
[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 struct spi_test_data {\r
28         struct device   *dev;\r
29         struct spi_device       *spi;   \r
30         char *rx_buf;\r
31         int rx_len; \r
32         char *tx_buf;\r
33         int tx_len; \r
34 };\r
35 static struct spi_test_data *g_spi_test_data;\r
36 \r
37 \r
38 static struct rk29xx_spi_chip spi_test_chip = {\r
39         //.poll_mode = 1,\r
40         .enable_dma = 1,\r
41 };\r
42         \r
43 static struct spi_board_info board_spi_test_devices[] = {       \r
44         {\r
45                 .modalias  = "spi_test",\r
46                 .bus_num = 0,   //0 or 1\r
47                 .max_speed_hz  = 12*1000*1000,\r
48                 .chip_select   = 0,             \r
49                 .controller_data = &spi_test_chip,\r
50         },      \r
51         \r
52 };\r
53 \r
54 static ssize_t spi_test_write(struct file *file, \r
55                         const char __user *buf, size_t count, loff_t *offset)\r
56 {\r
57         char nr_buf[8];\r
58         int nr = 0, ret;\r
59         int i = 0;\r
60         struct spi_device *spi = g_spi_test_data->spi;\r
61         char txbuf[256],rxbuf[256];\r
62 \r
63         if(count > 3)\r
64                 return -EFAULT;\r
65         ret = copy_from_user(nr_buf, buf, count);\r
66         if(ret < 0)\r
67                 return -EFAULT;\r
68 \r
69         sscanf(nr_buf, "%d", &nr);\r
70         if(nr >= 2 || nr < 0)\r
71         {\r
72                 printk("%s:data is error\n",__func__);\r
73                 return -EFAULT;\r
74         }\r
75         \r
76         for(i=0; i<256; i++)\r
77         txbuf[i] = i;\r
78 \r
79         switch(nr)\r
80         {\r
81                 case 0:\r
82                         spi->chip_select = 0;\r
83                         break;\r
84                 case 1:\r
85                         spi->chip_select = 1;\r
86                         break;\r
87 \r
88                 default:\r
89                         break;\r
90 \r
91         }\r
92 \r
93         for(i=0; i<10; i++)\r
94         {\r
95                 ret = spi_write(spi, txbuf, 256);\r
96                 ret = spi_read(spi, rxbuf, 256);\r
97                 ret = spi_write_then_read(spi,txbuf,256,rxbuf,256);\r
98                 printk("%s:test %d times\n\n",__func__,i+1);\r
99         }\r
100         \r
101         if(!ret)\r
102         printk("%s:ok\n",__func__);\r
103         else\r
104         printk("%s:error\n",__func__);\r
105         \r
106         return count;\r
107 }\r
108 \r
109 \r
110 static const struct file_operations spi_test_fops = {\r
111         .write = spi_test_write,\r
112 };\r
113 \r
114 static struct miscdevice spi_test_misc = {\r
115         .minor = MISC_DYNAMIC_MINOR,\r
116         .name = "spi_misc_test",\r
117         .fops = &spi_test_fops,\r
118 };\r
119 \r
120 static int __devinit spi_test_probe(struct spi_device *spi)\r
121 {       \r
122         struct spi_test_data *spi_test_data;\r
123         int ret;\r
124         \r
125         spi_test_data = (struct spi_test_data *)kzalloc(sizeof(struct spi_test_data), GFP_KERNEL);\r
126         if(!spi_test_data){\r
127                 dev_err(&spi->dev, "ERR: no memory for spi_test_data\n");\r
128                 return -ENOMEM;
129         }\r
130 \r
131         spi->bits_per_word = 8;\r
132         spi->mode = SPI_MODE_0;\r
133         \r
134         spi_test_data->spi = spi;\r
135         spi_test_data->dev = &spi->dev;\r
136         ret = spi_setup(spi);\r
137         if (ret < 0){\r
138                 dev_err(spi_test_data->dev, "ERR: fail to setup spi\n");\r
139                 return -1;\r
140         }       \r
141 \r
142         g_spi_test_data = spi_test_data;\r
143 \r
144         printk("%s:bus_num=%d,ok\n",__func__,spi->master->bus_num);\r
145 \r
146         return ret;\r
147 \r
148 }\r
149 \r
150 \r
151 static struct spi_driver spi_test_driver = {\r
152         .driver = {\r
153                 .name           = "spi_test",\r
154                 .bus            = &spi_bus_type,\r
155                 .owner          = THIS_MODULE,\r
156         },\r
157 \r
158         .probe          = spi_test_probe,\r
159 };\r
160 \r
161 static int __init spi_test_init(void)\r
162 {       \r
163         spi_register_board_info(board_spi_test_devices, ARRAY_SIZE(board_spi_test_devices));\r
164         misc_register(&spi_test_misc);\r
165         return spi_register_driver(&spi_test_driver);\r
166 }\r
167 \r
168 static void __exit spi_test_exit(void)\r
169 {\r
170         misc_deregister(&spi_test_misc);\r
171         return spi_unregister_driver(&spi_test_driver);\r
172 }\r
173 module_init(spi_test_init);\r
174 module_exit(spi_test_exit);\r
175 \r