diff mbox

[2/2] spi: cadence: Configure SPI clock in the prepare_message() callback

Message ID 1404984389-12802-2-git-send-email-lars@metafoo.de (mailing list archive)
State Accepted
Commit b48b9488e3180b173f37782a348b76ea6bff2c48
Headers show

Commit Message

Lars-Peter Clausen July 10, 2014, 9:26 a.m. UTC
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(-)

Comments

Harini Katakam July 10, 2014, 10:43 a.m. UTC | #1
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
Lars-Peter Clausen July 10, 2014, 10:50 a.m. UTC | #2
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 mbox

Patch

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;