usb: bc: fix compile error
[firefly-linux-kernel-4.4.55.git] / drivers / spi / spidev.c
1 /*
2  * 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/err.h>
29 #include <linux/list.h>
30 #include <linux/errno.h>
31 #include <linux/mutex.h>
32 #include <linux/slab.h>
33 #include <linux/compat.h>
34 #include <linux/of.h>
35 #include <linux/of_device.h>
36
37 #include <linux/spi/spi.h>
38 #include <linux/spi/spidev.h>
39
40 #include <asm/uaccess.h>
41
42
43 /*
44  * This supports access to SPI devices using normal userspace I/O calls.
45  * Note that while traditional UNIX/POSIX I/O semantics are half duplex,
46  * and often mask message boundaries, full SPI support requires full duplex
47  * transfers.  There are several kinds of internal message boundaries to
48  * handle chipselect management and other protocol options.
49  *
50  * SPI has a character major number assigned.  We allocate minor numbers
51  * dynamically using a bitmask.  You must use hotplug tools, such as udev
52  * (or mdev with busybox) to create and destroy the /dev/spidevB.C device
53  * nodes, since there is no fixed association of minor numbers with any
54  * particular SPI bus or device.
55  */
56 #define SPIDEV_MAJOR                    153     /* assigned */
57 #define N_SPI_MINORS                    32      /* ... up to 256 */
58
59 static DECLARE_BITMAP(minors, N_SPI_MINORS);
60
61
62 /* Bit masks for spi_device.mode management.  Note that incorrect
63  * settings for some settings can cause *lots* of trouble for other
64  * devices on a shared bus:
65  *
66  *  - CS_HIGH ... this device will be active when it shouldn't be
67  *  - 3WIRE ... when active, it won't behave as it should
68  *  - NO_CS ... there will be no explicit message boundaries; this
69  *      is completely incompatible with the shared bus model
70  *  - READY ... transfers may proceed when they shouldn't.
71  *
72  * REVISIT should changing those flags be privileged?
73  */
74 #define SPI_MODE_MASK           (SPI_CPHA | SPI_CPOL | SPI_CS_HIGH \
75                                 | SPI_LSB_FIRST | SPI_3WIRE | SPI_LOOP \
76                                 | SPI_NO_CS | SPI_READY)
77
78 struct spidev_data {
79         dev_t                   devt;
80         spinlock_t              spi_lock;
81         struct spi_device       *spi;
82         struct list_head        device_entry;
83
84         /* buffer is NULL unless this device is open (users > 0) */
85         struct mutex            buf_lock;
86         unsigned                users;
87         u8                      *buffer;
88 };
89
90 static LIST_HEAD(device_list);
91 static DEFINE_MUTEX(device_list_lock);
92
93 static unsigned bufsiz = 4096;
94 module_param(bufsiz, uint, S_IRUGO);
95 MODULE_PARM_DESC(bufsiz, "data bytes in biggest supported SPI message");
96
97 /*-------------------------------------------------------------------------*/
98
99 /*
100  * We can't use the standard synchronous wrappers for file I/O; we
101  * need to protect against async removal of the underlying spi_device.
102  */
103 static void spidev_complete(void *arg)
104 {
105         complete(arg);
106 }
107
108 static ssize_t
109 spidev_sync(struct spidev_data *spidev, struct spi_message *message)
110 {
111         DECLARE_COMPLETION_ONSTACK(done);
112         int status;
113
114         message->complete = spidev_complete;
115         message->context = &done;
116
117         spin_lock_irq(&spidev->spi_lock);
118         if (spidev->spi == NULL)
119                 status = -ESHUTDOWN;
120         else
121                 status = spi_async(spidev->spi, message);
122         spin_unlock_irq(&spidev->spi_lock);
123
124         if (status == 0) {
125                 wait_for_completion(&done);
126                 status = message->status;
127                 if (status == 0)
128                         status = message->actual_length;
129         }
130         return status;
131 }
132
133 static inline ssize_t
134 spidev_sync_write(struct spidev_data *spidev, size_t len)
135 {
136         struct spi_transfer     t = {
137                         .tx_buf         = spidev->buffer,
138                         .len            = len,
139                 };
140         struct spi_message      m;
141
142         spi_message_init(&m);
143         spi_message_add_tail(&t, &m);
144         return spidev_sync(spidev, &m);
145 }
146
147 static inline ssize_t
148 spidev_sync_read(struct spidev_data *spidev, size_t len)
149 {
150         struct spi_transfer     t = {
151                         .rx_buf         = spidev->buffer,
152                         .len            = len,
153                 };
154         struct spi_message      m;
155
156         spi_message_init(&m);
157         spi_message_add_tail(&t, &m);
158         return spidev_sync(spidev, &m);
159 }
160
161 /*-------------------------------------------------------------------------*/
162
163 /* Read-only message with current device setup */
164 static ssize_t
165 spidev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
166 {
167         struct spidev_data      *spidev;
168         ssize_t                 status = 0;
169
170         /* chipselect only toggles at start or end of operation */
171         if (count > bufsiz)
172                 return -EMSGSIZE;
173
174         spidev = filp->private_data;
175
176         mutex_lock(&spidev->buf_lock);
177         status = spidev_sync_read(spidev, count);
178         if (status > 0) {
179                 unsigned long   missing;
180
181                 missing = copy_to_user(buf, spidev->buffer, status);
182                 if (missing == status)
183                         status = -EFAULT;
184                 else
185                         status = status - missing;
186         }
187         mutex_unlock(&spidev->buf_lock);
188
189         return status;
190 }
191
192 /* Write-only message with current device setup */
193 static ssize_t
194 spidev_write(struct file *filp, const char __user *buf,
195                 size_t count, loff_t *f_pos)
196 {
197         struct spidev_data      *spidev;
198         ssize_t                 status = 0;
199         unsigned long           missing;
200
201         /* chipselect only toggles at start or end of operation */
202         if (count > bufsiz)
203                 return -EMSGSIZE;
204
205         spidev = filp->private_data;
206
207         mutex_lock(&spidev->buf_lock);
208         missing = copy_from_user(spidev->buffer, buf, count);
209         if (missing == 0) {
210                 status = spidev_sync_write(spidev, count);
211         } else
212                 status = -EFAULT;
213         mutex_unlock(&spidev->buf_lock);
214
215         return status;
216 }
217
218 static int spidev_message(struct spidev_data *spidev,
219                 struct spi_ioc_transfer *u_xfers, unsigned n_xfers)
220 {
221         struct spi_message      msg;
222         struct spi_transfer     *k_xfers;
223         struct spi_transfer     *k_tmp;
224         struct spi_ioc_transfer *u_tmp;
225         unsigned                n, total;
226         u8                      *buf;
227         int                     status = -EFAULT;
228
229         spi_message_init(&msg);
230         k_xfers = kcalloc(n_xfers, sizeof(*k_tmp), GFP_KERNEL);
231         if (k_xfers == NULL)
232                 return -ENOMEM;
233
234         /* Construct spi_message, copying any tx data to bounce buffer.
235          * We walk the array of user-provided transfers, using each one
236          * to initialize a kernel version of the same transfer.
237          */
238         buf = spidev->buffer;
239         total = 0;
240         for (n = n_xfers, k_tmp = k_xfers, u_tmp = u_xfers;
241                         n;
242                         n--, k_tmp++, u_tmp++) {
243                 k_tmp->len = u_tmp->len;
244
245                 total += k_tmp->len;
246                 /* Check total length of transfers.  Also check each
247                  * transfer length to avoid arithmetic overflow.
248                  */
249                 if (total > bufsiz || k_tmp->len > bufsiz) {
250                         status = -EMSGSIZE;
251                         goto done;
252                 }
253
254                 if (u_tmp->rx_buf) {
255                         k_tmp->rx_buf = buf;
256                         if (!access_ok(VERIFY_WRITE, (u8 __user *)
257                                                 (uintptr_t) u_tmp->rx_buf,
258                                                 u_tmp->len))
259                                 goto done;
260                 }
261                 if (u_tmp->tx_buf) {
262                         k_tmp->tx_buf = buf;
263                         if (copy_from_user(buf, (const u8 __user *)
264                                                 (uintptr_t) u_tmp->tx_buf,
265                                         u_tmp->len))
266                                 goto done;
267                 }
268                 buf += k_tmp->len;
269
270                 k_tmp->cs_change = !!u_tmp->cs_change;
271                 k_tmp->bits_per_word = u_tmp->bits_per_word;
272                 k_tmp->delay_usecs = u_tmp->delay_usecs;
273                 k_tmp->speed_hz = u_tmp->speed_hz;
274 #ifdef VERBOSE
275                 dev_dbg(&spidev->spi->dev,
276                         "  xfer len %zd %s%s%s%dbits %u usec %uHz\n",
277                         u_tmp->len,
278                         u_tmp->rx_buf ? "rx " : "",
279                         u_tmp->tx_buf ? "tx " : "",
280                         u_tmp->cs_change ? "cs " : "",
281                         u_tmp->bits_per_word ? : spidev->spi->bits_per_word,
282                         u_tmp->delay_usecs,
283                         u_tmp->speed_hz ? : spidev->spi->max_speed_hz);
284 #endif
285                 spi_message_add_tail(k_tmp, &msg);
286         }
287
288         status = spidev_sync(spidev, &msg);
289         if (status < 0)
290                 goto done;
291
292         /* copy any rx data out of bounce buffer */
293         buf = spidev->buffer;
294         for (n = n_xfers, u_tmp = u_xfers; n; n--, u_tmp++) {
295                 if (u_tmp->rx_buf) {
296                         if (__copy_to_user((u8 __user *)
297                                         (uintptr_t) u_tmp->rx_buf, buf,
298                                         u_tmp->len)) {
299                                 status = -EFAULT;
300                                 goto done;
301                         }
302                 }
303                 buf += u_tmp->len;
304         }
305         status = total;
306
307 done:
308         kfree(k_xfers);
309         return status;
310 }
311
312 static long
313 spidev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
314 {
315         int                     err = 0;
316         int                     retval = 0;
317         struct spidev_data      *spidev;
318         struct spi_device       *spi;
319         u32                     tmp;
320         unsigned                n_ioc;
321         struct spi_ioc_transfer *ioc;
322
323         /* Check type and command number */
324         if (_IOC_TYPE(cmd) != SPI_IOC_MAGIC)
325                 return -ENOTTY;
326
327         /* Check access direction once here; don't repeat below.
328          * IOC_DIR is from the user perspective, while access_ok is
329          * from the kernel perspective; so they look reversed.
330          */
331         if (_IOC_DIR(cmd) & _IOC_READ)
332                 err = !access_ok(VERIFY_WRITE,
333                                 (void __user *)arg, _IOC_SIZE(cmd));
334         if (err == 0 && _IOC_DIR(cmd) & _IOC_WRITE)
335                 err = !access_ok(VERIFY_READ,
336                                 (void __user *)arg, _IOC_SIZE(cmd));
337         if (err)
338                 return -EFAULT;
339
340         /* guard against device removal before, or while,
341          * we issue this ioctl.
342          */
343         spidev = filp->private_data;
344         spin_lock_irq(&spidev->spi_lock);
345         spi = spi_dev_get(spidev->spi);
346         spin_unlock_irq(&spidev->spi_lock);
347
348         if (spi == NULL)
349                 return -ESHUTDOWN;
350
351         /* use the buffer lock here for triple duty:
352          *  - prevent I/O (from us) so calling spi_setup() is safe;
353          *  - prevent concurrent SPI_IOC_WR_* from morphing
354          *    data fields while SPI_IOC_RD_* reads them;
355          *  - SPI_IOC_MESSAGE needs the buffer locked "normally".
356          */
357         mutex_lock(&spidev->buf_lock);
358
359         switch (cmd) {
360         /* read requests */
361         case SPI_IOC_RD_MODE:
362                 retval = __put_user(spi->mode & SPI_MODE_MASK,
363                                         (__u8 __user *)arg);
364                 break;
365         case SPI_IOC_RD_LSB_FIRST:
366                 retval = __put_user((spi->mode & SPI_LSB_FIRST) ?  1 : 0,
367                                         (__u8 __user *)arg);
368                 break;
369         case SPI_IOC_RD_BITS_PER_WORD:
370                 retval = __put_user(spi->bits_per_word, (__u8 __user *)arg);
371                 break;
372         case SPI_IOC_RD_MAX_SPEED_HZ:
373                 retval = __put_user(spi->max_speed_hz, (__u32 __user *)arg);
374                 break;
375
376         /* write requests */
377         case SPI_IOC_WR_MODE:
378                 retval = __get_user(tmp, (u8 __user *)arg);
379                 if (retval == 0) {
380                         u8      save = spi->mode;
381
382                         if (tmp & ~SPI_MODE_MASK) {
383                                 retval = -EINVAL;
384                                 break;
385                         }
386
387                         tmp |= spi->mode & ~SPI_MODE_MASK;
388                         spi->mode = (u8)tmp;
389                         retval = spi_setup(spi);
390                         if (retval < 0)
391                                 spi->mode = save;
392                         else
393                                 dev_dbg(&spi->dev, "spi mode %02x\n", tmp);
394                 }
395                 break;
396         case SPI_IOC_WR_LSB_FIRST:
397                 retval = __get_user(tmp, (__u8 __user *)arg);
398                 if (retval == 0) {
399                         u8      save = spi->mode;
400
401                         if (tmp)
402                                 spi->mode |= SPI_LSB_FIRST;
403                         else
404                                 spi->mode &= ~SPI_LSB_FIRST;
405                         retval = spi_setup(spi);
406                         if (retval < 0)
407                                 spi->mode = save;
408                         else
409                                 dev_dbg(&spi->dev, "%csb first\n",
410                                                 tmp ? 'l' : 'm');
411                 }
412                 break;
413         case SPI_IOC_WR_BITS_PER_WORD:
414                 retval = __get_user(tmp, (__u8 __user *)arg);
415                 if (retval == 0) {
416                         u8      save = spi->bits_per_word;
417
418                         spi->bits_per_word = tmp;
419                         retval = spi_setup(spi);
420                         if (retval < 0)
421                                 spi->bits_per_word = save;
422                         else
423                                 dev_dbg(&spi->dev, "%d bits per word\n", tmp);
424                 }
425                 break;
426         case SPI_IOC_WR_MAX_SPEED_HZ:
427                 retval = __get_user(tmp, (__u32 __user *)arg);
428                 if (retval == 0) {
429                         u32     save = spi->max_speed_hz;
430
431                         spi->max_speed_hz = tmp;
432                         retval = spi_setup(spi);
433                         if (retval < 0)
434                                 spi->max_speed_hz = save;
435                         else
436                                 dev_dbg(&spi->dev, "%d Hz (max)\n", tmp);
437                 }
438                 break;
439
440         default:
441                 /* segmented and/or full-duplex I/O request */
442                 if (_IOC_NR(cmd) != _IOC_NR(SPI_IOC_MESSAGE(0))
443                                 || _IOC_DIR(cmd) != _IOC_WRITE) {
444                         retval = -ENOTTY;
445                         break;
446                 }
447
448                 tmp = _IOC_SIZE(cmd);
449                 if ((tmp % sizeof(struct spi_ioc_transfer)) != 0) {
450                         retval = -EINVAL;
451                         break;
452                 }
453                 n_ioc = tmp / sizeof(struct spi_ioc_transfer);
454                 if (n_ioc == 0)
455                         break;
456
457                 /* copy into scratch area */
458                 ioc = kmalloc(tmp, GFP_KERNEL);
459                 if (!ioc) {
460                         retval = -ENOMEM;
461                         break;
462                 }
463                 if (__copy_from_user(ioc, (void __user *)arg, tmp)) {
464                         kfree(ioc);
465                         retval = -EFAULT;
466                         break;
467                 }
468
469                 /* translate to spi_message, execute */
470                 retval = spidev_message(spidev, ioc, n_ioc);
471                 kfree(ioc);
472                 break;
473         }
474
475         mutex_unlock(&spidev->buf_lock);
476         spi_dev_put(spi);
477         return retval;
478 }
479
480 #ifdef CONFIG_COMPAT
481 static long
482 spidev_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
483 {
484         return spidev_ioctl(filp, cmd, (unsigned long)compat_ptr(arg));
485 }
486 #else
487 #define spidev_compat_ioctl NULL
488 #endif /* CONFIG_COMPAT */
489
490 static int spidev_open(struct inode *inode, struct file *filp)
491 {
492         struct spidev_data      *spidev;
493         int                     status = -ENXIO;
494
495         mutex_lock(&device_list_lock);
496
497         list_for_each_entry(spidev, &device_list, device_entry) {
498                 if (spidev->devt == inode->i_rdev) {
499                         status = 0;
500                         break;
501                 }
502         }
503         if (status == 0) {
504                 if (!spidev->buffer) {
505                         spidev->buffer = kmalloc(bufsiz, GFP_KERNEL);
506                         if (!spidev->buffer) {
507                                 dev_dbg(&spidev->spi->dev, "open/ENOMEM\n");
508                                 status = -ENOMEM;
509                         }
510                 }
511                 if (status == 0) {
512                         spidev->users++;
513                         filp->private_data = spidev;
514                         nonseekable_open(inode, filp);
515                 }
516         } else
517                 pr_debug("spidev: nothing for minor %d\n", iminor(inode));
518
519         mutex_unlock(&device_list_lock);
520         return status;
521 }
522
523 static int spidev_release(struct inode *inode, struct file *filp)
524 {
525         struct spidev_data      *spidev;
526         int                     status = 0;
527
528         mutex_lock(&device_list_lock);
529         spidev = filp->private_data;
530         filp->private_data = NULL;
531
532         /* last close? */
533         spidev->users--;
534         if (!spidev->users) {
535                 int             dofree;
536
537                 kfree(spidev->buffer);
538                 spidev->buffer = NULL;
539
540                 /* ... after we unbound from the underlying device? */
541                 spin_lock_irq(&spidev->spi_lock);
542                 dofree = (spidev->spi == NULL);
543                 spin_unlock_irq(&spidev->spi_lock);
544
545                 if (dofree)
546                         kfree(spidev);
547         }
548         mutex_unlock(&device_list_lock);
549
550         return status;
551 }
552
553 static const struct file_operations spidev_fops = {
554         .owner =        THIS_MODULE,
555         /* REVISIT switch to aio primitives, so that userspace
556          * gets more complete API coverage.  It'll simplify things
557          * too, except for the locking.
558          */
559         .write =        spidev_write,
560         .read =         spidev_read,
561         .unlocked_ioctl = spidev_ioctl,
562         .compat_ioctl = spidev_compat_ioctl,
563         .open =         spidev_open,
564         .release =      spidev_release,
565         .llseek =       no_llseek,
566 };
567
568 /*-------------------------------------------------------------------------*/
569
570 /* The main reason to have this class is to make mdev/udev create the
571  * /dev/spidevB.C character device nodes exposing our userspace API.
572  * It also simplifies memory management.
573  */
574
575 static struct class *spidev_class;
576
577 /*-------------------------------------------------------------------------*/
578
579 static int spidev_probe(struct spi_device *spi)
580 {
581         struct spidev_data      *spidev;
582         int                     status;
583         unsigned long           minor;
584
585         /* Allocate driver data */
586         spidev = kzalloc(sizeof(*spidev), GFP_KERNEL);
587         if (!spidev)
588                 return -ENOMEM;
589
590         /* Initialize the driver data */
591         spidev->spi = spi;
592         spin_lock_init(&spidev->spi_lock);
593         mutex_init(&spidev->buf_lock);
594
595         INIT_LIST_HEAD(&spidev->device_entry);
596
597         /* If we can allocate a minor number, hook up this device.
598          * Reusing minors is fine so long as udev or mdev is working.
599          */
600         mutex_lock(&device_list_lock);
601         minor = find_first_zero_bit(minors, N_SPI_MINORS);
602         if (minor < N_SPI_MINORS) {
603                 struct device *dev;
604
605                 spidev->devt = MKDEV(SPIDEV_MAJOR, minor);
606                 dev = device_create(spidev_class, &spi->dev, spidev->devt,
607                                     spidev, "spidev%d.%d",
608                                     spi->master->bus_num, spi->chip_select);
609                 status = PTR_RET(dev);
610         } else {
611                 dev_dbg(&spi->dev, "no minor number available!\n");
612                 status = -ENODEV;
613         }
614         if (status == 0) {
615                 set_bit(minor, minors);
616                 list_add(&spidev->device_entry, &device_list);
617         }
618         mutex_unlock(&device_list_lock);
619
620         if (status == 0)
621                 spi_set_drvdata(spi, spidev);
622         else
623                 kfree(spidev);
624
625         return status;
626 }
627
628 static int spidev_remove(struct spi_device *spi)
629 {
630         struct spidev_data      *spidev = spi_get_drvdata(spi);
631
632         /* make sure ops on existing fds can abort cleanly */
633         spin_lock_irq(&spidev->spi_lock);
634         spidev->spi = NULL;
635         spi_set_drvdata(spi, NULL);
636         spin_unlock_irq(&spidev->spi_lock);
637
638         /* prevent new opens */
639         mutex_lock(&device_list_lock);
640         list_del(&spidev->device_entry);
641         device_destroy(spidev_class, spidev->devt);
642         clear_bit(MINOR(spidev->devt), minors);
643         if (spidev->users == 0)
644                 kfree(spidev);
645         mutex_unlock(&device_list_lock);
646
647         return 0;
648 }
649
650 static const struct of_device_id spidev_dt_ids[] = {
651         { .compatible = "rohm,dh2228fv" },
652         {},
653 };
654
655 MODULE_DEVICE_TABLE(of, spidev_dt_ids);
656
657 static struct spi_driver spidev_spi_driver = {
658         .driver = {
659                 .name =         "spidev",
660                 .owner =        THIS_MODULE,
661                 .of_match_table = of_match_ptr(spidev_dt_ids),
662         },
663         .probe =        spidev_probe,
664         .remove =       spidev_remove,
665
666         /* NOTE:  suspend/resume methods are not necessary here.
667          * We don't do anything except pass the requests to/from
668          * the underlying controller.  The refrigerator handles
669          * most issues; the controller driver handles the rest.
670          */
671 };
672
673 /*-------------------------------------------------------------------------*/
674
675 static int __init spidev_init(void)
676 {
677         int status;
678
679         /* Claim our 256 reserved device numbers.  Then register a class
680          * that will key udev/mdev to add/remove /dev nodes.  Last, register
681          * the driver which manages those device numbers.
682          */
683         BUILD_BUG_ON(N_SPI_MINORS > 256);
684         status = register_chrdev(SPIDEV_MAJOR, "spi", &spidev_fops);
685         if (status < 0)
686                 return status;
687
688         spidev_class = class_create(THIS_MODULE, "spidev");
689         if (IS_ERR(spidev_class)) {
690                 unregister_chrdev(SPIDEV_MAJOR, spidev_spi_driver.driver.name);
691                 return PTR_ERR(spidev_class);
692         }
693
694         status = spi_register_driver(&spidev_spi_driver);
695         if (status < 0) {
696                 class_destroy(spidev_class);
697                 unregister_chrdev(SPIDEV_MAJOR, spidev_spi_driver.driver.name);
698         }
699         return status;
700 }
701 module_init(spidev_init);
702
703 static void __exit spidev_exit(void)
704 {
705         spi_unregister_driver(&spidev_spi_driver);
706         class_destroy(spidev_class);
707         unregister_chrdev(SPIDEV_MAJOR, spidev_spi_driver.driver.name);
708 }
709 module_exit(spidev_exit);
710
711 MODULE_AUTHOR("Andrea Paterniani, <a.paterniani@swapp-eng.it>");
712 MODULE_DESCRIPTION("User mode SPI device interface");
713 MODULE_LICENSE("GPL");
714 MODULE_ALIAS("spi:spidev");