Message ID | 20180917120808.20224-6-lkundrak@v3.sk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Signal pxa2xx SPI slave readiness via handshake signal [Was: SPI Slave with handshaking] | expand |
Hi Lubomir, On Mon, Sep 17, 2018 at 2:08 PM Lubomir Rintel <lkundrak@v3.sk> wrote: > Strobe a GPIO line when the slave TX FIFO is filled. This is how the > Embedded Controller on an OLPC XO-1.75 machine, that happens to be a SPI > master, learns that it can initiate a transaction. > > Signed-off-by: Lubomir Rintel <lkundrak@v3.sk> Thanks for your patch! > --- a/drivers/spi/spi-pxa2xx.c > +++ b/drivers/spi/spi-pxa2xx.c > @@ -1079,6 +1079,9 @@ static int pxa2xx_spi_transfer_one(struct spi_controller *master, > if (spi_controller_is_slave(master)) { > while (drv_data->write(drv_data)) > ; > + gpiod_set_value(drv_data->gpiod_ready, 1); > + udelay(1); > + gpiod_set_value(drv_data->gpiod_ready, 0); While gpiod_set_value() handles the case of no GPIO fine, I think it's better to explicitly check for that, so you can avoid spinning for 1 µs if the GPIO is not present. > @@ -1784,6 +1787,15 @@ static int pxa2xx_spi_probe(struct platform_device *pdev) > } > } > > + if (platform_info->is_slave) { > + drv_data->gpiod_ready = devm_gpiod_get_optional(dev, > + "ready", GPIOD_OUT_LOW); > + if (IS_ERR(drv_data->gpiod_ready)) { > + status = (int)PTR_ERR(drv_data->gpiod_ready); The cast to int is not needed. > + goto out_error_clock_enabled; > + } > + } Gr{oetje,eeting}s, Geert
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c index 9552f5335679..59dd149b029b 100644 --- a/drivers/spi/spi-pxa2xx.c +++ b/drivers/spi/spi-pxa2xx.c @@ -1079,6 +1079,9 @@ static int pxa2xx_spi_transfer_one(struct spi_controller *master, if (spi_controller_is_slave(master)) { while (drv_data->write(drv_data)) ; + gpiod_set_value(drv_data->gpiod_ready, 1); + udelay(1); + gpiod_set_value(drv_data->gpiod_ready, 0); } /* @@ -1784,6 +1787,15 @@ static int pxa2xx_spi_probe(struct platform_device *pdev) } } + if (platform_info->is_slave) { + drv_data->gpiod_ready = devm_gpiod_get_optional(dev, + "ready", GPIOD_OUT_LOW); + if (IS_ERR(drv_data->gpiod_ready)) { + status = (int)PTR_ERR(drv_data->gpiod_ready); + goto out_error_clock_enabled; + } + } + pm_runtime_set_autosuspend_delay(&pdev->dev, 50); pm_runtime_use_autosuspend(&pdev->dev); pm_runtime_set_active(&pdev->dev); diff --git a/drivers/spi/spi-pxa2xx.h b/drivers/spi/spi-pxa2xx.h index 513c53aaeab2..4e324da66ef7 100644 --- a/drivers/spi/spi-pxa2xx.h +++ b/drivers/spi/spi-pxa2xx.h @@ -64,6 +64,9 @@ struct driver_data { /* GPIOs for chip selects */ struct gpio_desc **cs_gpiods; + + /* Optional slave FIFO ready signal */ + struct gpio_desc *gpiod_ready; }; struct chip_data {
Strobe a GPIO line when the slave TX FIFO is filled. This is how the Embedded Controller on an OLPC XO-1.75 machine, that happens to be a SPI master, learns that it can initiate a transaction. Signed-off-by: Lubomir Rintel <lkundrak@v3.sk> --- drivers/spi/spi-pxa2xx.c | 12 ++++++++++++ drivers/spi/spi-pxa2xx.h | 3 +++ 2 files changed, 15 insertions(+)