diff options
Diffstat (limited to 'include/linux/spi')
-rw-r--r-- | include/linux/spi/mmc_spi.h | 2 | ||||
-rw-r--r-- | include/linux/spi/orion_spi.h | 1 | ||||
-rw-r--r-- | include/linux/spi/s3c24xx.h | 26 | ||||
-rw-r--r-- | include/linux/spi/sh_hspi.h | 23 | ||||
-rw-r--r-- | include/linux/spi/spi.h | 53 |
5 files changed, 102 insertions, 3 deletions
diff --git a/include/linux/spi/mmc_spi.h b/include/linux/spi/mmc_spi.h index 0f4eb165f254..32be8dbdf191 100644 --- a/include/linux/spi/mmc_spi.h +++ b/include/linux/spi/mmc_spi.h | |||
@@ -1,10 +1,10 @@ | |||
1 | #ifndef __LINUX_SPI_MMC_SPI_H | 1 | #ifndef __LINUX_SPI_MMC_SPI_H |
2 | #define __LINUX_SPI_MMC_SPI_H | 2 | #define __LINUX_SPI_MMC_SPI_H |
3 | 3 | ||
4 | #include <linux/device.h> | ||
5 | #include <linux/spi/spi.h> | 4 | #include <linux/spi/spi.h> |
6 | #include <linux/interrupt.h> | 5 | #include <linux/interrupt.h> |
7 | 6 | ||
7 | struct device; | ||
8 | struct mmc_host; | 8 | struct mmc_host; |
9 | 9 | ||
10 | /* Put this in platform_data of a device being used to manage an MMC/SD | 10 | /* Put this in platform_data of a device being used to manage an MMC/SD |
diff --git a/include/linux/spi/orion_spi.h b/include/linux/spi/orion_spi.h index decf6d8c77b7..b4d9fa6f797c 100644 --- a/include/linux/spi/orion_spi.h +++ b/include/linux/spi/orion_spi.h | |||
@@ -11,7 +11,6 @@ | |||
11 | 11 | ||
12 | struct orion_spi_info { | 12 | struct orion_spi_info { |
13 | u32 tclk; /* no <linux/clk.h> support yet */ | 13 | u32 tclk; /* no <linux/clk.h> support yet */ |
14 | u32 enable_clock_fix; | ||
15 | }; | 14 | }; |
16 | 15 | ||
17 | 16 | ||
diff --git a/include/linux/spi/s3c24xx.h b/include/linux/spi/s3c24xx.h new file mode 100644 index 000000000000..c23b923e493b --- /dev/null +++ b/include/linux/spi/s3c24xx.h | |||
@@ -0,0 +1,26 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2006 Simtec Electronics | ||
3 | * Ben Dooks <ben@simtec.co.uk> | ||
4 | * | ||
5 | * S3C2410 - SPI Controller platform_device info | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #ifndef __LINUX_SPI_S3C24XX_H | ||
13 | #define __LINUX_SPI_S3C24XX_H __FILE__ | ||
14 | |||
15 | struct s3c2410_spi_info { | ||
16 | int pin_cs; /* simple gpio cs */ | ||
17 | unsigned int num_cs; /* total chipselects */ | ||
18 | int bus_num; /* bus number to use. */ | ||
19 | |||
20 | unsigned int use_fiq:1; /* use fiq */ | ||
21 | |||
22 | void (*gpio_setup)(struct s3c2410_spi_info *spi, int enable); | ||
23 | void (*set_cs)(struct s3c2410_spi_info *spi, int cs, int pol); | ||
24 | }; | ||
25 | |||
26 | #endif /* __LINUX_SPI_S3C24XX_H */ | ||
diff --git a/include/linux/spi/sh_hspi.h b/include/linux/spi/sh_hspi.h new file mode 100644 index 000000000000..a1121f872ac1 --- /dev/null +++ b/include/linux/spi/sh_hspi.h | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 Kuninori Morimoto | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; version 2 of the License. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program; if not, write to the Free Software | ||
15 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
16 | */ | ||
17 | #ifndef SH_HSPI_H | ||
18 | #define SH_HSPI_H | ||
19 | |||
20 | struct sh_hspi_info { | ||
21 | }; | ||
22 | |||
23 | #endif | ||
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 176fce9cc6b1..98679b061b63 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/device.h> | 22 | #include <linux/device.h> |
23 | #include <linux/mod_devicetable.h> | 23 | #include <linux/mod_devicetable.h> |
24 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
25 | #include <linux/kthread.h> | ||
25 | 26 | ||
26 | /* | 27 | /* |
27 | * INTERFACES between SPI master-side drivers and SPI infrastructure. | 28 | * INTERFACES between SPI master-side drivers and SPI infrastructure. |
@@ -235,6 +236,27 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv) | |||
235 | * the device whose settings are being modified. | 236 | * the device whose settings are being modified. |
236 | * @transfer: adds a message to the controller's transfer queue. | 237 | * @transfer: adds a message to the controller's transfer queue. |
237 | * @cleanup: frees controller-specific state | 238 | * @cleanup: frees controller-specific state |
239 | * @queued: whether this master is providing an internal message queue | ||
240 | * @kworker: thread struct for message pump | ||
241 | * @kworker_task: pointer to task for message pump kworker thread | ||
242 | * @pump_messages: work struct for scheduling work to the message pump | ||
243 | * @queue_lock: spinlock to syncronise access to message queue | ||
244 | * @queue: message queue | ||
245 | * @cur_msg: the currently in-flight message | ||
246 | * @busy: message pump is busy | ||
247 | * @running: message pump is running | ||
248 | * @rt: whether this queue is set to run as a realtime task | ||
249 | * @prepare_transfer_hardware: a message will soon arrive from the queue | ||
250 | * so the subsystem requests the driver to prepare the transfer hardware | ||
251 | * by issuing this call | ||
252 | * @transfer_one_message: the subsystem calls the driver to transfer a single | ||
253 | * message while queuing transfers that arrive in the meantime. When the | ||
254 | * driver is finished with this message, it must call | ||
255 | * spi_finalize_current_message() so the subsystem can issue the next | ||
256 | * transfer | ||
257 | * @prepare_transfer_hardware: there are currently no more messages on the | ||
258 | * queue so the subsystem notifies the driver that it may relax the | ||
259 | * hardware by issuing this call | ||
238 | * | 260 | * |
239 | * Each SPI master controller can communicate with one or more @spi_device | 261 | * Each SPI master controller can communicate with one or more @spi_device |
240 | * children. These make a small bus, sharing MOSI, MISO and SCK signals | 262 | * children. These make a small bus, sharing MOSI, MISO and SCK signals |
@@ -318,6 +340,28 @@ struct spi_master { | |||
318 | 340 | ||
319 | /* called on release() to free memory provided by spi_master */ | 341 | /* called on release() to free memory provided by spi_master */ |
320 | void (*cleanup)(struct spi_device *spi); | 342 | void (*cleanup)(struct spi_device *spi); |
343 | |||
344 | /* | ||
345 | * These hooks are for drivers that want to use the generic | ||
346 | * master transfer queueing mechanism. If these are used, the | ||
347 | * transfer() function above must NOT be specified by the driver. | ||
348 | * Over time we expect SPI drivers to be phased over to this API. | ||
349 | */ | ||
350 | bool queued; | ||
351 | struct kthread_worker kworker; | ||
352 | struct task_struct *kworker_task; | ||
353 | struct kthread_work pump_messages; | ||
354 | spinlock_t queue_lock; | ||
355 | struct list_head queue; | ||
356 | struct spi_message *cur_msg; | ||
357 | bool busy; | ||
358 | bool running; | ||
359 | bool rt; | ||
360 | |||
361 | int (*prepare_transfer_hardware)(struct spi_master *master); | ||
362 | int (*transfer_one_message)(struct spi_master *master, | ||
363 | struct spi_message *mesg); | ||
364 | int (*unprepare_transfer_hardware)(struct spi_master *master); | ||
321 | }; | 365 | }; |
322 | 366 | ||
323 | static inline void *spi_master_get_devdata(struct spi_master *master) | 367 | static inline void *spi_master_get_devdata(struct spi_master *master) |
@@ -343,6 +387,13 @@ static inline void spi_master_put(struct spi_master *master) | |||
343 | put_device(&master->dev); | 387 | put_device(&master->dev); |
344 | } | 388 | } |
345 | 389 | ||
390 | /* PM calls that need to be issued by the driver */ | ||
391 | extern int spi_master_suspend(struct spi_master *master); | ||
392 | extern int spi_master_resume(struct spi_master *master); | ||
393 | |||
394 | /* Calls the driver make to interact with the message queue */ | ||
395 | extern struct spi_message *spi_get_next_queued_message(struct spi_master *master); | ||
396 | extern void spi_finalize_current_message(struct spi_master *master); | ||
346 | 397 | ||
347 | /* the spi driver core manages memory for the spi_master classdev */ | 398 | /* the spi driver core manages memory for the spi_master classdev */ |
348 | extern struct spi_master * | 399 | extern struct spi_master * |
@@ -549,7 +600,7 @@ static inline struct spi_message *spi_message_alloc(unsigned ntrans, gfp_t flags | |||
549 | + ntrans * sizeof(struct spi_transfer), | 600 | + ntrans * sizeof(struct spi_transfer), |
550 | flags); | 601 | flags); |
551 | if (m) { | 602 | if (m) { |
552 | int i; | 603 | unsigned i; |
553 | struct spi_transfer *t = (struct spi_transfer *)(m + 1); | 604 | struct spi_transfer *t = (struct spi_transfer *)(m + 1); |
554 | 605 | ||
555 | INIT_LIST_HEAD(&m->transfers); | 606 | INIT_LIST_HEAD(&m->transfers); |