lkml.org 
[lkml]   [2015]   [Jun]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v7 8/8] mfd: cros_ec: spi: Add delay for asserting CS
    Date
    From: Alexandru M Stan <amstan@chromium.org>

    Some ECs need a little time for waking up before they can accept
    SPI data at a high speed. This is configurable via a DT property
    "google,cros-ec-spi-pre-delay".

    This patch makes the cros_ec_spi driver to cause a delay before
    the beginning of a SPI transaction, to make sure that the EC has
    already woken up, if the property has been defined in the DTS.

    Signed-off-by: Alexandru M Stan <amstan@chromium.org>
    Reviewed-by: Doug Anderson <dianders@chromium.org>
    Signed-off-by: Chris Zhong <zyw@rock-chips.com>
    Signed-off-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
    Tested-by: Heiko Stuebner <heiko@sntech.de>
    Acked-by: Lee Jones <lee.jones@linaro.org>
    Acked-by: Olof Johansson <olof@lixom.net>
    ---

    Changes since v6:
    - Add Olof Johansson Acked-by tag

    Changes since v5: None.

    Changes since v4: None.

    Changes since v3:
    - New patch, split DT binding and driver implementation as suggested
    by Lee Jones.
    - Add tested-by tag from Heiko Stuebner.
    - Add acked-by tag from Lee Jones.
    ---
    drivers/mfd/cros_ec_spi.c | 21 +++++++++++++++++++--
    1 file changed, 19 insertions(+), 2 deletions(-)

    diff --git a/drivers/mfd/cros_ec_spi.c b/drivers/mfd/cros_ec_spi.c
    index faba03e2f1ef..16f228dc243f 100644
    --- a/drivers/mfd/cros_ec_spi.c
    +++ b/drivers/mfd/cros_ec_spi.c
    @@ -71,12 +71,15 @@
    * @spi: SPI device we are connected to
    * @last_transfer_ns: time that we last finished a transfer, or 0 if there
    * if no record
    + * @start_of_msg_delay: used to set the delay_usecs on the spi_transfer that
    + * is sent when we want to turn on CS at the start of a transaction.
    * @end_of_msg_delay: used to set the delay_usecs on the spi_transfer that
    * is sent when we want to turn off CS at the end of a transaction.
    */
    struct cros_ec_spi {
    struct spi_device *spi;
    s64 last_transfer_ns;
    + unsigned int start_of_msg_delay;
    unsigned int end_of_msg_delay;
    };

    @@ -366,7 +369,7 @@ static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev,
    struct ec_host_request *request;
    struct ec_host_response *response;
    struct cros_ec_spi *ec_spi = ec_dev->priv;
    - struct spi_transfer trans;
    + struct spi_transfer trans, trans_delay;
    struct spi_message msg;
    int i, len;
    u8 *ptr;
    @@ -393,13 +396,23 @@ static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev,
    goto exit;
    }

    + /*
    + * Leave a gap between CS assertion and clocking of data to allow the
    + * EC time to wakeup.
    + */
    + spi_message_init(&msg);
    + if (ec_spi->start_of_msg_delay) {
    + memset(&trans_delay, 0, sizeof(trans_delay));
    + trans_delay.delay_usecs = ec_spi->start_of_msg_delay;
    + spi_message_add_tail(&trans_delay, &msg);
    + }
    +
    /* Transmit phase - send our message */
    memset(&trans, 0, sizeof(trans));
    trans.tx_buf = ec_dev->dout;
    trans.rx_buf = rx_buf;
    trans.len = len;
    trans.cs_change = 1;
    - spi_message_init(&msg);
    spi_message_add_tail(&trans, &msg);
    ret = spi_sync(ec_spi->spi, &msg);

    @@ -602,6 +615,10 @@ static void cros_ec_spi_dt_probe(struct cros_ec_spi *ec_spi, struct device *dev)
    u32 val;
    int ret;

    + ret = of_property_read_u32(np, "google,cros-ec-spi-pre-delay", &val);
    + if (!ret)
    + ec_spi->start_of_msg_delay = val;
    +
    ret = of_property_read_u32(np, "google,cros-ec-spi-msg-delay", &val);
    if (!ret)
    ec_spi->end_of_msg_delay = val;
    --
    2.1.4


    \
     
     \ /
      Last update: 2015-06-09 13:21    [W:2.392 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site