|
@@ -23,6 +23,7 @@
|
|
#include <linux/mod_devicetable.h>
|
|
#include <linux/mod_devicetable.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/kthread.h>
|
|
#include <linux/kthread.h>
|
|
|
|
+#include <linux/completion.h>
|
|
|
|
|
|
/*
|
|
/*
|
|
* INTERFACES between SPI master-side drivers and SPI infrastructure.
|
|
* INTERFACES between SPI master-side drivers and SPI infrastructure.
|
|
@@ -150,8 +151,7 @@ static inline void *spi_get_drvdata(struct spi_device *spi)
|
|
}
|
|
}
|
|
|
|
|
|
struct spi_message;
|
|
struct spi_message;
|
|
-
|
|
|
|
-
|
|
|
|
|
|
+struct spi_transfer;
|
|
|
|
|
|
/**
|
|
/**
|
|
* struct spi_driver - Host side "protocol" driver
|
|
* struct spi_driver - Host side "protocol" driver
|
|
@@ -259,6 +259,7 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)
|
|
* @cur_msg: the currently in-flight message
|
|
* @cur_msg: the currently in-flight message
|
|
* @cur_msg_prepared: spi_prepare_message was called for the currently
|
|
* @cur_msg_prepared: spi_prepare_message was called for the currently
|
|
* in-flight message
|
|
* in-flight message
|
|
|
|
+ * @xfer_completion: used by core tranfer_one_message()
|
|
* @busy: message pump is busy
|
|
* @busy: message pump is busy
|
|
* @running: message pump is running
|
|
* @running: message pump is running
|
|
* @rt: whether this queue is set to run as a realtime task
|
|
* @rt: whether this queue is set to run as a realtime task
|
|
@@ -276,9 +277,15 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)
|
|
* @unprepare_transfer_hardware: there are currently no more messages on the
|
|
* @unprepare_transfer_hardware: there are currently no more messages on the
|
|
* queue so the subsystem notifies the driver that it may relax the
|
|
* queue so the subsystem notifies the driver that it may relax the
|
|
* hardware by issuing this call
|
|
* hardware by issuing this call
|
|
|
|
+ * @set_cs: assert or deassert chip select, true to assert. May be called
|
|
|
|
+ * from interrupt context.
|
|
* @prepare_message: set up the controller to transfer a single message,
|
|
* @prepare_message: set up the controller to transfer a single message,
|
|
* for example doing DMA mapping. Called from threaded
|
|
* for example doing DMA mapping. Called from threaded
|
|
* context.
|
|
* context.
|
|
|
|
+ * @transfer_one: transfer a single spi_transfer. When the
|
|
|
|
+ * driver is finished with this transfer it must call
|
|
|
|
+ * spi_finalize_current_transfer() so the subsystem can issue
|
|
|
|
+ * the next transfer
|
|
* @unprepare_message: undo any work done by prepare_message().
|
|
* @unprepare_message: undo any work done by prepare_message().
|
|
* @cs_gpios: Array of GPIOs to use as chip select lines; one per CS
|
|
* @cs_gpios: Array of GPIOs to use as chip select lines; one per CS
|
|
* number. Any individual value may be -ENOENT for CS lines that
|
|
* number. Any individual value may be -ENOENT for CS lines that
|
|
@@ -395,6 +402,7 @@ struct spi_master {
|
|
bool rt;
|
|
bool rt;
|
|
bool auto_runtime_pm;
|
|
bool auto_runtime_pm;
|
|
bool cur_msg_prepared;
|
|
bool cur_msg_prepared;
|
|
|
|
+ struct completion xfer_completion;
|
|
|
|
|
|
int (*prepare_transfer_hardware)(struct spi_master *master);
|
|
int (*prepare_transfer_hardware)(struct spi_master *master);
|
|
int (*transfer_one_message)(struct spi_master *master,
|
|
int (*transfer_one_message)(struct spi_master *master,
|
|
@@ -405,6 +413,14 @@ struct spi_master {
|
|
int (*unprepare_message)(struct spi_master *master,
|
|
int (*unprepare_message)(struct spi_master *master,
|
|
struct spi_message *message);
|
|
struct spi_message *message);
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * These hooks are for drivers that use a generic implementation
|
|
|
|
+ * of transfer_one_message() provied by the core.
|
|
|
|
+ */
|
|
|
|
+ void (*set_cs)(struct spi_device *spi, bool enable);
|
|
|
|
+ int (*transfer_one)(struct spi_master *master, struct spi_device *spi,
|
|
|
|
+ struct spi_transfer *transfer);
|
|
|
|
+
|
|
/* gpio chip select */
|
|
/* gpio chip select */
|
|
int *cs_gpios;
|
|
int *cs_gpios;
|
|
};
|
|
};
|
|
@@ -439,6 +455,7 @@ extern int spi_master_resume(struct spi_master *master);
|
|
/* Calls the driver make to interact with the message queue */
|
|
/* Calls the driver make to interact with the message queue */
|
|
extern struct spi_message *spi_get_next_queued_message(struct spi_master *master);
|
|
extern struct spi_message *spi_get_next_queued_message(struct spi_master *master);
|
|
extern void spi_finalize_current_message(struct spi_master *master);
|
|
extern void spi_finalize_current_message(struct spi_master *master);
|
|
|
|
+extern void spi_finalize_current_transfer(struct spi_master *master);
|
|
|
|
|
|
/* the spi driver core manages memory for the spi_master classdev */
|
|
/* the spi driver core manages memory for the spi_master classdev */
|
|
extern struct spi_master *
|
|
extern struct spi_master *
|