mirror of https://gitee.com/openkylin/linux.git
Merge remote-tracking branch 'spi/topic/pump-rt' into spi-next
This commit is contained in:
commit
26ac56506b
|
@ -1417,10 +1417,32 @@ static void spi_pump_messages(struct kthread_work *work)
|
||||||
__spi_pump_messages(ctlr, true);
|
__spi_pump_messages(ctlr, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int spi_init_queue(struct spi_controller *ctlr)
|
/**
|
||||||
|
* spi_set_thread_rt - set the controller to pump at realtime priority
|
||||||
|
* @ctlr: controller to boost priority of
|
||||||
|
*
|
||||||
|
* This can be called because the controller requested realtime priority
|
||||||
|
* (by setting the ->rt value before calling spi_register_controller()) or
|
||||||
|
* because a device on the bus said that its transfers needed realtime
|
||||||
|
* priority.
|
||||||
|
*
|
||||||
|
* NOTE: at the moment if any device on a bus says it needs realtime then
|
||||||
|
* the thread will be at realtime priority for all transfers on that
|
||||||
|
* controller. If this eventually becomes a problem we may see if we can
|
||||||
|
* find a way to boost the priority only temporarily during relevant
|
||||||
|
* transfers.
|
||||||
|
*/
|
||||||
|
static void spi_set_thread_rt(struct spi_controller *ctlr)
|
||||||
{
|
{
|
||||||
struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 };
|
struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 };
|
||||||
|
|
||||||
|
dev_info(&ctlr->dev,
|
||||||
|
"will run message pump with realtime priority\n");
|
||||||
|
sched_setscheduler(ctlr->kworker_task, SCHED_FIFO, ¶m);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int spi_init_queue(struct spi_controller *ctlr)
|
||||||
|
{
|
||||||
ctlr->running = false;
|
ctlr->running = false;
|
||||||
ctlr->busy = false;
|
ctlr->busy = false;
|
||||||
|
|
||||||
|
@ -1440,11 +1462,8 @@ static int spi_init_queue(struct spi_controller *ctlr)
|
||||||
* request and the scheduling of the message pump thread. Without this
|
* request and the scheduling of the message pump thread. Without this
|
||||||
* setting the message pump thread will remain at default priority.
|
* setting the message pump thread will remain at default priority.
|
||||||
*/
|
*/
|
||||||
if (ctlr->rt) {
|
if (ctlr->rt)
|
||||||
dev_info(&ctlr->dev,
|
spi_set_thread_rt(ctlr);
|
||||||
"will run message pump with realtime priority\n");
|
|
||||||
sched_setscheduler(ctlr->kworker_task, SCHED_FIFO, ¶m);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -3071,6 +3090,11 @@ int spi_setup(struct spi_device *spi)
|
||||||
|
|
||||||
spi_set_cs(spi, false);
|
spi_set_cs(spi, false);
|
||||||
|
|
||||||
|
if (spi->rt && !spi->controller->rt) {
|
||||||
|
spi->controller->rt = true;
|
||||||
|
spi_set_thread_rt(spi->controller);
|
||||||
|
}
|
||||||
|
|
||||||
dev_dbg(&spi->dev, "setup mode %d, %s%s%s%s%u bits/w, %u Hz max --> %d\n",
|
dev_dbg(&spi->dev, "setup mode %d, %s%s%s%s%u bits/w, %u Hz max --> %d\n",
|
||||||
(int) (spi->mode & (SPI_CPOL | SPI_CPHA)),
|
(int) (spi->mode & (SPI_CPOL | SPI_CPHA)),
|
||||||
(spi->mode & SPI_CS_HIGH) ? "cs_high, " : "",
|
(spi->mode & SPI_CS_HIGH) ? "cs_high, " : "",
|
||||||
|
|
|
@ -109,6 +109,7 @@ void spi_statistics_add_transfer_stats(struct spi_statistics *stats,
|
||||||
* This may be changed by the device's driver, or left at the
|
* This may be changed by the device's driver, or left at the
|
||||||
* default (0) indicating protocol words are eight bit bytes.
|
* default (0) indicating protocol words are eight bit bytes.
|
||||||
* The spi_transfer.bits_per_word can override this for each transfer.
|
* The spi_transfer.bits_per_word can override this for each transfer.
|
||||||
|
* @rt: Make the pump thread real time priority.
|
||||||
* @irq: Negative, or the number passed to request_irq() to receive
|
* @irq: Negative, or the number passed to request_irq() to receive
|
||||||
* interrupts from this device.
|
* interrupts from this device.
|
||||||
* @controller_state: Controller's runtime state
|
* @controller_state: Controller's runtime state
|
||||||
|
@ -143,6 +144,7 @@ struct spi_device {
|
||||||
u32 max_speed_hz;
|
u32 max_speed_hz;
|
||||||
u8 chip_select;
|
u8 chip_select;
|
||||||
u8 bits_per_word;
|
u8 bits_per_word;
|
||||||
|
bool rt;
|
||||||
u32 mode;
|
u32 mode;
|
||||||
#define SPI_CPHA 0x01 /* clock phase */
|
#define SPI_CPHA 0x01 /* clock phase */
|
||||||
#define SPI_CPOL 0x02 /* clock polarity */
|
#define SPI_CPOL 0x02 /* clock polarity */
|
||||||
|
|
Loading…
Reference in New Issue