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
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
27 struct spi_test_data {
\r
29 struct spi_device *spi;
\r
35 static struct spi_test_data *g_spi_test_data;
\r
38 static struct rk29xx_spi_chip spi_test_chip = {
\r
43 static struct spi_board_info board_spi_test_devices[] = {
\r
45 .modalias = "spi_test",
\r
46 .bus_num = 0, //0 or 1
\r
47 .max_speed_hz = 12*1000*1000,
\r
49 .controller_data = &spi_test_chip,
\r
54 static ssize_t spi_test_write(struct file *file,
\r
55 const char __user *buf, size_t count, loff_t *offset)
\r
60 struct spi_device *spi = g_spi_test_data->spi;
\r
61 char txbuf[256],rxbuf[256];
\r
65 ret = copy_from_user(nr_buf, buf, count);
\r
69 sscanf(nr_buf, "%d", &nr);
\r
70 if(nr >= 2 || nr < 0)
\r
72 printk("%s:data is error\n",__func__);
\r
76 for(i=0; i<256; i++)
\r
82 spi->chip_select = 0;
\r
85 spi->chip_select = 1;
\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
102 printk("%s:ok\n",__func__);
\r
104 printk("%s:error\n",__func__);
\r
110 static const struct file_operations spi_test_fops = {
\r
111 .write = spi_test_write,
\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
120 static int __devinit spi_test_probe(struct spi_device *spi)
\r
122 struct spi_test_data *spi_test_data;
\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
131 spi->bits_per_word = 8;
\r
132 spi->mode = SPI_MODE_0;
\r
134 spi_test_data->spi = spi;
\r
135 spi_test_data->dev = &spi->dev;
\r
136 ret = spi_setup(spi);
\r
138 dev_err(spi_test_data->dev, "ERR: fail to setup spi\n");
\r
142 g_spi_test_data = spi_test_data;
\r
144 printk("%s:bus_num=%d,ok\n",__func__,spi->bus_num);
\r
151 static struct spi_driver spi_test_driver = {
\r
153 .name = "spi_test",
\r
154 .bus = &spi_bus_type,
\r
155 .owner = THIS_MODULE,
\r
158 .probe = spi_test_probe,
\r
161 static int __init spi_test_init(void)
\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
168 static void __exit spi_test_exit(void)
\r
170 misc_deregister(&spi_test_misc);
\r
171 return spi_unregister_driver(&spi_test_driver);
\r
173 module_init(spi_test_init);
\r
174 module_exit(spi_test_exit);
\r