]> pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/spi/spidev.c
630f781aeb190b59851324f18afeb94b343e5180
[linux-2.6-omap-h63xx.git] / drivers / spi / spidev.c
1 /*
2  * spidev.c -- simple synchronous userspace interface to SPI devices
3  *
4  * Copyright (C) 2006 SWAPP
5  *      Andrea Paterniani <a.paterniani@swapp-eng.it>
6  * Copyright (C) 2007 David Brownell (simplification, cleanup)
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  */
22
23 #include <linux/init.h>
24 #include <linux/module.h>
25 #include <linux/ioctl.h>
26 #include <linux/fs.h>
27 #include <linux/device.h>
28 #include <linux/list.h>
29 #include <linux/errno.h>
30 #include <linux/mutex.h>
31 #include <linux/slab.h>
32
33 #include <linux/spi/spi.h>
34 #include <linux/spi/spidev.h>
35
36 #include <asm/uaccess.h>
37
38
39 /*
40  * This supports acccess to SPI devices using normal userspace I/O calls.
41  * Note that while traditional UNIX/POSIX I/O semantics are half duplex,
42  * and often mask message boundaries, full SPI support requires full duplex
43  * transfers.  There are several kinds of of internal message boundaries to
44  * handle chipselect management and other protocol options.
45  *
46  * SPI has a character major number assigned.  We allocate minor numbers
47  * dynamically using a bitmask.  You must use hotplug tools, such as udev
48  * (or mdev with busybox) to create and destroy the /dev/spidevB.C device
49  * nodes, since there is no fixed association of minor numbers with any
50  * particular SPI bus or device.
51  */
52 #define SPIDEV_MAJOR                    153     /* assigned */
53 #define N_SPI_MINORS                    32      /* ... up to 256 */
54
55 static unsigned long    minors[N_SPI_MINORS / BITS_PER_LONG];
56
57
58 /* Bit masks for spi_device.mode management.  Note that incorrect
59  * settings for CS_HIGH and 3WIRE can cause *lots* of trouble for other
60  * devices on a shared bus:  CS_HIGH, because this device will be
61  * active when it shouldn't be;  3WIRE, because when active it won't
62  * behave as it should.
63  *
64  * REVISIT should changing those two modes be privileged?
65  */
66 #define SPI_MODE_MASK           (SPI_CPHA | SPI_CPOL | SPI_CS_HIGH \
67                                 | SPI_LSB_FIRST | SPI_3WIRE | SPI_LOOP)
68
69 struct spidev_data {
70         struct device           dev;
71         struct spi_device       *spi;
72         struct list_head        device_entry;
73
74         struct mutex            buf_lock;
75         unsigned                users;
76         u8                      *buffer;
77 };
78
79 static LIST_HEAD(device_list);
80 static DEFINE_MUTEX(device_list_lock);
81
82 static unsigned bufsiz = 4096;
83 module_param(bufsiz, uint, S_IRUGO);
84 MODULE_PARM_DESC(bufsiz, "data bytes in biggest supported SPI message");
85
86 /*-------------------------------------------------------------------------*/
87
88 /* Read-only message with current device setup */
89 static ssize_t
90 spidev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
91 {
92         struct spidev_data      *spidev;
93         struct spi_device       *spi;
94         ssize_t                 status = 0;
95
96         /* chipselect only toggles at start or end of operation */
97         if (count > bufsiz)
98                 return -EMSGSIZE;
99
100         spidev = filp->private_data;
101         spi = spidev->spi;
102
103         mutex_lock(&spidev->buf_lock);
104         status = spi_read(spi, spidev->buffer, count);
105         if (status == 0) {
106                 unsigned long   missing;
107
108                 missing = copy_to_user(buf, spidev->buffer, count);
109                 if (count && missing == count)
110                         status = -EFAULT;
111                 else
112                         status = count - missing;
113         }
114         mutex_unlock(&spidev->buf_lock);
115
116         return status;
117 }
118
119 /* Write-only message with current device setup */
120 static ssize_t
121 spidev_write(struct file *filp, const char __user *buf,
122                 size_t count, loff_t *f_pos)
123 {
124         struct spidev_data      *spidev;
125         struct spi_device       *spi;
126         ssize_t                 status = 0;
127         unsigned long           missing;
128
129         /* chipselect only toggles at start or end of operation */
130         if (count > bufsiz)
131                 return -EMSGSIZE;
132
133         spidev = filp->private_data;
134         spi = spidev->spi;
135
136         mutex_lock(&spidev->buf_lock);
137         missing = copy_from_user(spidev->buffer, buf, count);
138         if (missing == 0) {
139                 status = spi_write(spi, spidev->buffer, count);
140                 if (status == 0)
141                         status = count;
142         } else
143                 status = -EFAULT;
144         mutex_unlock(&spidev->buf_lock);
145
146         return status;
147 }
148
149 static int spidev_message(struct spidev_data *spidev,
150                 struct spi_ioc_transfer *u_xfers, unsigned n_xfers)
151 {
152         struct spi_message      msg;
153         struct spi_transfer     *k_xfers;
154         struct spi_transfer     *k_tmp;
155         struct spi_ioc_transfer *u_tmp;
156         struct spi_device       *spi = spidev->spi;
157         unsigned                n, total;
158         u8                      *buf;
159         int                     status = -EFAULT;
160
161         spi_message_init(&msg);
162         k_xfers = kcalloc(n_xfers, sizeof(*k_tmp), GFP_KERNEL);
163         if (k_xfers == NULL)
164                 return -ENOMEM;
165
166         /* Construct spi_message, copying any tx data to bounce buffer.
167          * We walk the array of user-provided transfers, using each one
168          * to initialize a kernel version of the same transfer.
169          */
170         mutex_lock(&spidev->buf_lock);
171         buf = spidev->buffer;
172         total = 0;
173         for (n = n_xfers, k_tmp = k_xfers, u_tmp = u_xfers;
174                         n;
175                         n--, k_tmp++, u_tmp++) {
176                 k_tmp->len = u_tmp->len;
177
178                 total += k_tmp->len;
179                 if (total > bufsiz) {
180                         status = -EMSGSIZE;
181                         goto done;
182                 }
183
184                 if (u_tmp->rx_buf) {
185                         k_tmp->rx_buf = buf;
186                         if (!access_ok(VERIFY_WRITE, u_tmp->rx_buf, u_tmp->len))
187                                 goto done;
188                 }
189                 if (u_tmp->tx_buf) {
190                         k_tmp->tx_buf = buf;
191                         if (copy_from_user(buf, (const u8 __user *)
192                                                 (ptrdiff_t) u_tmp->tx_buf,
193                                         u_tmp->len))
194                                 goto done;
195                 }
196                 buf += k_tmp->len;
197
198                 k_tmp->cs_change = !!u_tmp->cs_change;
199                 k_tmp->bits_per_word = u_tmp->bits_per_word;
200                 k_tmp->delay_usecs = u_tmp->delay_usecs;
201                 k_tmp->speed_hz = u_tmp->speed_hz;
202 #ifdef VERBOSE
203                 dev_dbg(&spi->dev,
204                         "  xfer len %zd %s%s%s%dbits %u usec %uHz\n",
205                         u_tmp->len,
206                         u_tmp->rx_buf ? "rx " : "",
207                         u_tmp->tx_buf ? "tx " : "",
208                         u_tmp->cs_change ? "cs " : "",
209                         u_tmp->bits_per_word ? : spi->bits_per_word,
210                         u_tmp->delay_usecs,
211                         u_tmp->speed_hz ? : spi->max_speed_hz);
212 #endif
213                 spi_message_add_tail(k_tmp, &msg);
214         }
215
216         status = spi_sync(spi, &msg);
217         if (status < 0)
218                 goto done;
219
220         /* copy any rx data out of bounce buffer */
221         buf = spidev->buffer;
222         for (n = n_xfers, u_tmp = u_xfers; n; n--, u_tmp++) {
223                 if (u_tmp->rx_buf) {
224                         if (__copy_to_user((u8 __user *)
225                                         (ptrdiff_t) u_tmp->rx_buf, buf,
226                                         u_tmp->len)) {
227                                 status = -EFAULT;
228                                 goto done;
229                         }
230                 }
231                 buf += u_tmp->len;
232         }
233         status = total;
234
235 done:
236         mutex_unlock(&spidev->buf_lock);
237         kfree(k_xfers);
238         return status;
239 }
240
241 static int
242 spidev_ioctl(struct inode *inode, struct file *filp,
243                 unsigned int cmd, unsigned long arg)
244 {
245         int                     err = 0;
246         int                     retval = 0;
247         struct spidev_data      *spidev;
248         struct spi_device       *spi;
249         u32                     tmp;
250         unsigned                n_ioc;
251         struct spi_ioc_transfer *ioc;
252
253         /* Check type and command number */
254         if (_IOC_TYPE(cmd) != SPI_IOC_MAGIC)
255                 return -ENOTTY;
256
257         /* Check access direction once here; don't repeat below.
258          * IOC_DIR is from the user perspective, while access_ok is
259          * from the kernel perspective; so they look reversed.
260          */
261         if (_IOC_DIR(cmd) & _IOC_READ)
262                 err = !access_ok(VERIFY_WRITE,
263                                 (void __user *)arg, _IOC_SIZE(cmd));
264         if (err == 0 && _IOC_DIR(cmd) & _IOC_WRITE)
265                 err = !access_ok(VERIFY_READ,
266                                 (void __user *)arg, _IOC_SIZE(cmd));
267         if (err)
268                 return -EFAULT;
269
270         spidev = filp->private_data;
271         spi = spidev->spi;
272
273         switch (cmd) {
274         /* read requests */
275         case SPI_IOC_RD_MODE:
276                 retval = __put_user(spi->mode & SPI_MODE_MASK,
277                                         (__u8 __user *)arg);
278                 break;
279         case SPI_IOC_RD_LSB_FIRST:
280                 retval = __put_user((spi->mode & SPI_LSB_FIRST) ?  1 : 0,
281                                         (__u8 __user *)arg);
282                 break;
283         case SPI_IOC_RD_BITS_PER_WORD:
284                 retval = __put_user(spi->bits_per_word, (__u8 __user *)arg);
285                 break;
286         case SPI_IOC_RD_MAX_SPEED_HZ:
287                 retval = __put_user(spi->max_speed_hz, (__u32 __user *)arg);
288                 break;
289
290         /* write requests */
291         case SPI_IOC_WR_MODE:
292                 retval = __get_user(tmp, (u8 __user *)arg);
293                 if (retval == 0) {
294                         u8      save = spi->mode;
295
296                         if (tmp & ~SPI_MODE_MASK) {
297                                 retval = -EINVAL;
298                                 break;
299                         }
300
301                         tmp |= spi->mode & ~SPI_MODE_MASK;
302                         spi->mode = (u8)tmp;
303                         retval = spi_setup(spi);
304                         if (retval < 0)
305                                 spi->mode = save;
306                         else
307                                 dev_dbg(&spi->dev, "spi mode %02x\n", tmp);
308                 }
309                 break;
310         case SPI_IOC_WR_LSB_FIRST:
311                 retval = __get_user(tmp, (__u8 __user *)arg);
312                 if (retval == 0) {
313                         u8      save = spi->mode;
314
315                         if (tmp)
316                                 spi->mode |= SPI_LSB_FIRST;
317                         else
318                                 spi->mode &= ~SPI_LSB_FIRST;
319                         retval = spi_setup(spi);
320                         if (retval < 0)
321                                 spi->mode = save;
322                         else
323                                 dev_dbg(&spi->dev, "%csb first\n",
324                                                 tmp ? 'l' : 'm');
325                 }
326                 break;
327         case SPI_IOC_WR_BITS_PER_WORD:
328                 retval = __get_user(tmp, (__u8 __user *)arg);
329                 if (retval == 0) {
330                         u8      save = spi->bits_per_word;
331
332                         spi->bits_per_word = tmp;
333                         retval = spi_setup(spi);
334                         if (retval < 0)
335                                 spi->bits_per_word = save;
336                         else
337                                 dev_dbg(&spi->dev, "%d bits per word\n", tmp);
338                 }
339                 break;
340         case SPI_IOC_WR_MAX_SPEED_HZ:
341                 retval = __get_user(tmp, (__u32 __user *)arg);
342                 if (retval == 0) {
343                         u32     save = spi->max_speed_hz;
344
345                         spi->max_speed_hz = tmp;
346                         retval = spi_setup(spi);
347                         if (retval < 0)
348                                 spi->max_speed_hz = save;
349                         else
350                                 dev_dbg(&spi->dev, "%d Hz (max)\n", tmp);
351                 }
352                 break;
353
354         default:
355                 /* segmented and/or full-duplex I/O request */
356                 if (_IOC_NR(cmd) != _IOC_NR(SPI_IOC_MESSAGE(0))
357                                 || _IOC_DIR(cmd) != _IOC_WRITE)
358                         return -ENOTTY;
359
360                 tmp = _IOC_SIZE(cmd);
361                 if ((tmp % sizeof(struct spi_ioc_transfer)) != 0) {
362                         retval = -EINVAL;
363                         break;
364                 }
365                 n_ioc = tmp / sizeof(struct spi_ioc_transfer);
366                 if (n_ioc == 0)
367                         break;
368
369                 /* copy into scratch area */
370                 ioc = kmalloc(tmp, GFP_KERNEL);
371                 if (!ioc) {
372                         retval = -ENOMEM;
373                         break;
374                 }
375                 if (__copy_from_user(ioc, (void __user *)arg, tmp)) {
376                         kfree(ioc);
377                         retval = -EFAULT;
378                         break;
379                 }
380
381                 /* translate to spi_message, execute */
382                 retval = spidev_message(spidev, ioc, n_ioc);
383                 kfree(ioc);
384                 break;
385         }
386         return retval;
387 }
388
389 static int spidev_open(struct inode *inode, struct file *filp)
390 {
391         struct spidev_data      *spidev;
392         int                     status = -ENXIO;
393
394         mutex_lock(&device_list_lock);
395
396         list_for_each_entry(spidev, &device_list, device_entry) {
397                 if (spidev->dev.devt == inode->i_rdev) {
398                         status = 0;
399                         break;
400                 }
401         }
402         if (status == 0) {
403                 if (!spidev->buffer) {
404                         spidev->buffer = kmalloc(bufsiz, GFP_KERNEL);
405                         if (!spidev->buffer) {
406                                 dev_dbg(&spidev->spi->dev, "open/ENOMEM\n");
407                                 status = -ENOMEM;
408                         }
409                 }
410                 if (status == 0) {
411                         spidev->users++;
412                         filp->private_data = spidev;
413                         nonseekable_open(inode, filp);
414                 }
415         } else
416                 pr_debug("spidev: nothing for minor %d\n", iminor(inode));
417
418         mutex_unlock(&device_list_lock);
419         return status;
420 }
421
422 static int spidev_release(struct inode *inode, struct file *filp)
423 {
424         struct spidev_data      *spidev;
425         int                     status = 0;
426
427         mutex_lock(&device_list_lock);
428         spidev = filp->private_data;
429         filp->private_data = NULL;
430         spidev->users--;
431         if (!spidev->users) {
432                 kfree(spidev->buffer);
433                 spidev->buffer = NULL;
434         }
435         mutex_unlock(&device_list_lock);
436
437         return status;
438 }
439
440 static struct file_operations spidev_fops = {
441         .owner =        THIS_MODULE,
442         /* REVISIT switch to aio primitives, so that userspace
443          * gets more complete API coverage.  It'll simplify things
444          * too, except for the locking.
445          */
446         .write =        spidev_write,
447         .read =         spidev_read,
448         .ioctl =        spidev_ioctl,
449         .open =         spidev_open,
450         .release =      spidev_release,
451 };
452
453 /*-------------------------------------------------------------------------*/
454
455 /* The main reason to have this class is to make mdev/udev create the
456  * /dev/spidevB.C character device nodes exposing our userspace API.
457  * It also simplifies memory management.
458  */
459
460 static void spidev_classdev_release(struct device *dev)
461 {
462         struct spidev_data      *spidev;
463
464         spidev = container_of(dev, struct spidev_data, dev);
465         kfree(spidev);
466 }
467
468 static struct class spidev_class = {
469         .name           = "spidev",
470         .owner          = THIS_MODULE,
471         .dev_release    = spidev_classdev_release,
472 };
473
474 /*-------------------------------------------------------------------------*/
475
476 static int spidev_probe(struct spi_device *spi)
477 {
478         struct spidev_data      *spidev;
479         int                     status;
480         unsigned long           minor;
481
482         /* Allocate driver data */
483         spidev = kzalloc(sizeof(*spidev), GFP_KERNEL);
484         if (!spidev)
485                 return -ENOMEM;
486
487         /* Initialize the driver data */
488         spidev->spi = spi;
489         mutex_init(&spidev->buf_lock);
490
491         INIT_LIST_HEAD(&spidev->device_entry);
492
493         /* If we can allocate a minor number, hook up this device.
494          * Reusing minors is fine so long as udev or mdev is working.
495          */
496         mutex_lock(&device_list_lock);
497         minor = find_first_zero_bit(minors, N_SPI_MINORS);
498         if (minor < N_SPI_MINORS) {
499                 spidev->dev.parent = &spi->dev;
500                 spidev->dev.class = &spidev_class;
501                 spidev->dev.devt = MKDEV(SPIDEV_MAJOR, minor);
502                 snprintf(spidev->dev.bus_id, sizeof spidev->dev.bus_id,
503                                 "spidev%d.%d",
504                                 spi->master->bus_num, spi->chip_select);
505                 status = device_register(&spidev->dev);
506         } else {
507                 dev_dbg(&spi->dev, "no minor number available!\n");
508                 status = -ENODEV;
509         }
510         if (status == 0) {
511                 set_bit(minor, minors);
512                 dev_set_drvdata(&spi->dev, spidev);
513                 list_add(&spidev->device_entry, &device_list);
514         }
515         mutex_unlock(&device_list_lock);
516
517         if (status != 0)
518                 kfree(spidev);
519
520         return status;
521 }
522
523 static int spidev_remove(struct spi_device *spi)
524 {
525         struct spidev_data      *spidev = dev_get_drvdata(&spi->dev);
526
527         mutex_lock(&device_list_lock);
528
529         list_del(&spidev->device_entry);
530         dev_set_drvdata(&spi->dev, NULL);
531         clear_bit(MINOR(spidev->dev.devt), minors);
532         device_unregister(&spidev->dev);
533
534         mutex_unlock(&device_list_lock);
535
536         return 0;
537 }
538
539 static struct spi_driver spidev_spi = {
540         .driver = {
541                 .name =         "spidev",
542                 .owner =        THIS_MODULE,
543         },
544         .probe =        spidev_probe,
545         .remove =       __devexit_p(spidev_remove),
546
547         /* NOTE:  suspend/resume methods are not necessary here.
548          * We don't do anything except pass the requests to/from
549          * the underlying controller.  The refrigerator handles
550          * most issues; the controller driver handles the rest.
551          */
552 };
553
554 /*-------------------------------------------------------------------------*/
555
556 static int __init spidev_init(void)
557 {
558         int status;
559
560         /* Claim our 256 reserved device numbers.  Then register a class
561          * that will key udev/mdev to add/remove /dev nodes.  Last, register
562          * the driver which manages those device numbers.
563          */
564         BUILD_BUG_ON(N_SPI_MINORS > 256);
565         status = register_chrdev(SPIDEV_MAJOR, "spi", &spidev_fops);
566         if (status < 0)
567                 return status;
568
569         status = class_register(&spidev_class);
570         if (status < 0) {
571                 unregister_chrdev(SPIDEV_MAJOR, spidev_spi.driver.name);
572                 return status;
573         }
574
575         status = spi_register_driver(&spidev_spi);
576         if (status < 0) {
577                 class_unregister(&spidev_class);
578                 unregister_chrdev(SPIDEV_MAJOR, spidev_spi.driver.name);
579         }
580         return status;
581 }
582 module_init(spidev_init);
583
584 static void __exit spidev_exit(void)
585 {
586         spi_unregister_driver(&spidev_spi);
587         class_unregister(&spidev_class);
588         unregister_chrdev(SPIDEV_MAJOR, spidev_spi.driver.name);
589 }
590 module_exit(spidev_exit);
591
592 MODULE_AUTHOR("Andrea Paterniani, <a.paterniani@swapp-eng.it>");
593 MODULE_DESCRIPTION("User mode SPI device interface");
594 MODULE_LICENSE("GPL");