Message ID | 1404984389-12802-2-git-send-email-lars@metafoo.de (mailing list archive) |
---|---|
State | Accepted |
Commit | b48b9488e3180b173f37782a348b76ea6bff2c48 |
Headers | show |
Hi, On Thu, Jul 10, 2014 at 2:56 PM, Lars-Peter Clausen <lars@metafoo.de> wrote: > Currently the cadence SPI driver does the SPI clock configuration (setup CPOL > and CPHA) in the prepare_transfer_hardware() callback. The > prepare_transfer_hardware() callback is only called though when the controller > transitions from a idle state to a non-idle state. Such a transitions happens > when the message queue goes from empty to non-empty. If multiple messages from > different SPI slaves with different clock settings are in the message queue the > clock settings will not be properly updated when switching from one slave device > to another. Instead do the updating of the clock configuration in the > prepare_message() callback which will be called for each individual message. > Yes, the requirement from the controller is that CPOL/CPHA setting changes will not take effect when SPI is enabled. CPOL/CPHA setting is done in prepare_hardware before SPI is enabled. So this works. According to your patches I understand that you might change CPOL/CPHA for each message. Is this possible? Is this a requirement? Regards, Harini -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 07/10/2014 12:43 PM, Harini Katakam wrote: > Hi, > > On Thu, Jul 10, 2014 at 2:56 PM, Lars-Peter Clausen <lars@metafoo.de> wrote: >> Currently the cadence SPI driver does the SPI clock configuration (setup CPOL >> and CPHA) in the prepare_transfer_hardware() callback. The >> prepare_transfer_hardware() callback is only called though when the controller >> transitions from a idle state to a non-idle state. Such a transitions happens >> when the message queue goes from empty to non-empty. If multiple messages from >> different SPI slaves with different clock settings are in the message queue the >> clock settings will not be properly updated when switching from one slave device >> to another. Instead do the updating of the clock configuration in the >> prepare_message() callback which will be called for each individual message. >> > > Yes, the requirement from the controller is that CPOL/CPHA setting changes > will not take effect when SPI is enabled. CPOL/CPHA setting is done in > prepare_hardware > before SPI is enabled. So this works. > According to your patches I understand that you might change CPOL/CPHA for > each message. Is this possible? Is this a requirement? The message can be from different SPI devices, so yes this is a requirement. I'm seeing the issue in one of my setups. - Lars -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/spi/spi-cadence.c b/drivers/spi/spi-cadence.c index 03f4d5e..562ff83 100644 --- a/drivers/spi/spi-cadence.c +++ b/drivers/spi/spi-cadence.c @@ -382,6 +382,12 @@ static irqreturn_t cdns_spi_irq(int irq, void *dev_id) return status; } +static int cdns_prepare_message(struct spi_master *master, + struct spi_message *msg) +{ + cdns_spi_config_clock_mode(msg->spi); + return 0; +} /** * cdns_transfer_one - Initiates the SPI transfer @@ -428,8 +434,6 @@ static int cdns_prepare_transfer_hardware(struct spi_master *master) { struct cdns_spi *xspi = spi_master_get_devdata(master); - cdns_spi_config_clock_mode(master->cur_msg->spi); - cdns_spi_write(xspi, CDNS_SPI_ER_OFFSET, CDNS_SPI_ER_ENABLE_MASK); @@ -544,6 +548,7 @@ static int cdns_spi_probe(struct platform_device *pdev) xspi->is_decoded_cs = 0; master->prepare_transfer_hardware = cdns_prepare_transfer_hardware; + master->prepare_message = cdns_prepare_message; master->transfer_one = cdns_transfer_one; master->unprepare_transfer_hardware = cdns_unprepare_transfer_hardware; master->set_cs = cdns_spi_chipselect;
Currently the cadence SPI driver does the SPI clock configuration (setup CPOL and CPHA) in the prepare_transfer_hardware() callback. The prepare_transfer_hardware() callback is only called though when the controller transitions from a idle state to a non-idle state. Such a transitions happens when the message queue goes from empty to non-empty. If multiple messages from different SPI slaves with different clock settings are in the message queue the clock settings will not be properly updated when switching from one slave device to another. Instead do the updating of the clock configuration in the prepare_message() callback which will be called for each individual message. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> --- drivers/spi/spi-cadence.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)