1 /*drivers/serial/spi_test.c -spi test driver
\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
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
30 #include "spi-rockchip-core.h"
\r
33 #define MAX_SPI_BUS_NUM 2
\r
35 struct spi_test_data {
\r
37 struct spi_device *spi;
\r
43 static struct spi_test_data *g_spi_test_data[MAX_SPI_BUS_NUM];
\r
46 static struct dw_spi_chip spi_test_chip[] = {
\r
59 static struct spi_board_info board_spi_test_devices[] = {
\r
60 //#if defined(CONFIG_SPIM0_RK29)
\r
62 .modalias = "spi_test_bus0",
\r
63 .bus_num = 0, //0 or 1
\r
64 .max_speed_hz = 12*1000*1000,
\r
67 .controller_data = &spi_test_chip[0],
\r
70 //#if defined(CONFIG_SPIM1_RK29)
\r
72 .modalias = "spi_test_bus1",
\r
73 .bus_num = 1, //0 or 1
\r
74 .max_speed_hz = 12*1000*1000,
\r
77 .controller_data = &spi_test_chip[1],
\r
82 static ssize_t spi_test_write(struct file *file,
\r
83 const char __user *buf, size_t count, loff_t *offset)
\r
88 struct spi_device *spi = NULL;
\r
89 char txbuf[256],rxbuf[256];
\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
96 ret = copy_from_user(nr_buf, buf, count);
\r
100 sscanf(nr_buf, "%d", &nr);
\r
101 if(nr >= 4 || nr < 0)
\r
103 printk("%s:cmd is error\n",__func__);
\r
107 for(i=0; i<256; i++)
\r
112 if((nr == 0) || (nr == 1))
\r
114 printk("%s:error SPIM0 need selected\n",__func__);
\r
118 if((nr == 2) || (nr == 3))
\r
120 printk("%s:error SPIM1 need selected\n",__func__);
\r
128 if(!g_spi_test_data[0]->spi)
\r
130 spi = g_spi_test_data[0]->spi;
\r
131 spi->chip_select = 0;
\r
134 if(!g_spi_test_data[0]->spi)
\r
136 spi = g_spi_test_data[0]->spi;
\r
137 spi->chip_select = 1;
\r
140 if(!g_spi_test_data[1]->spi)
\r
142 spi = g_spi_test_data[1]->spi;
\r
143 spi->chip_select = 0;
\r
146 if(!g_spi_test_data[1]->spi)
\r
148 spi = g_spi_test_data[1]->spi;
\r
149 spi->chip_select = 1;
\r
156 for(i=0; i<100; i++)
\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
166 printk("%s:bus_num=%d,chip_select=%d,ok\n",__func__,spi->master->bus_num, spi->chip_select);
\r
168 printk("%s:bus_num=%d,chip_select=%d,error\n",__func__,spi->master->bus_num, spi->chip_select);
\r
174 static const struct file_operations spi_test_fops = {
\r
175 .write = spi_test_write,
\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
184 static int spi_test_probe(struct spi_device *spi)
\r
186 struct spi_test_data *spi_test_data;
\r
189 char txbuf[256],rxbuf[256];
\r
194 if((spi->master->bus_num >= MAX_SPI_BUS_NUM) || (spi->master->bus_num < 0))
\r
196 printk("%s:error:bus_num=%d\n",__func__, spi->master->bus_num);
\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
206 spi->bits_per_word = 8;
\r
208 spi_test_data->spi = spi;
\r
209 spi_test_data->dev = &spi->dev;
\r
210 ret = spi_setup(spi);
\r
212 dev_err(spi_test_data->dev, "ERR: fail to setup spi\n");
\r
216 g_spi_test_data[spi->master->bus_num] = spi_test_data;
\r
218 printk("%s:bus_num=%d,ok\n",__func__,spi->master->bus_num);
\r
223 static const struct spi_device_id spi_test_id[] = {
\r
224 {"spi_test_bus0", 0},
\r
225 {"spi_test_bus1", 1},
\r
230 static struct spi_driver spi_test_driver = {
\r
232 .name = "spi_test",
\r
233 .bus = &spi_bus_type,
\r
234 .owner = THIS_MODULE,
\r
236 .id_table = spi_test_id,
\r
238 .probe = spi_test_probe,
\r
241 static int __init spi_test_init(void)
\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
249 static void __exit spi_test_exit(void)
\r
251 misc_deregister(&spi_test_misc);
\r
252 return spi_unregister_driver(&spi_test_driver);
\r
254 module_init(spi_test_init);
\r
255 module_exit(spi_test_exit);
\r