Re: [PATCH v2] spi-imx: Implements handling of the SPI_READY mode flag.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




Hi,

On 23 April 2017 at 13:18, Leif Middelschulte
<leif.middelschulte@xxxxxxxxx> wrote:
> From: Leif Middelschulte <leif.middelschulte@xxxxxxxxx>
>
> This patch implements consideration of the SPI_READY mode flag as
> defined in spi.h. It extends the device tree bindings to support
> the values defined by the reference manual for the DRCTL field.
>
> Thus supporting edge-triggered and level-triggered bursts.
>
> Signed-off-by: Leif Middelschulte <Leif.Middelschulte@xxxxxxxxx>
> ---
>  .../devicetree/bindings/spi/fsl-imx-cspi.txt       |  5 +++++
>  drivers/spi/spi-imx.c                              | 23 ++++++++++++++++++++--
>  2 files changed, 26 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/spi/fsl-imx-cspi.txt b/Documentation/devicetree/bindings/spi/fsl-imx-cspi.txt
> index 8bc95e2fc47f..890b3ff3325f 100644
> --- a/Documentation/devicetree/bindings/spi/fsl-imx-cspi.txt
> +++ b/Documentation/devicetree/bindings/spi/fsl-imx-cspi.txt

You are modifying device tree documentation, you need to CC the
appropriate mailing list as well (as I now did).

> @@ -23,6 +23,10 @@ See the clock consumer binding,
>  Obsolete properties:
>  - fsl,spi-num-chipselects : Contains the number of the chipselect
>
> +Optional properties:
> +- fsl,spi-drctl: Integer, representing the value of DRCTL. Note that to
> +enable the DRCTL consideration, the SPI_READY mode-flag needs to be set.

Maybe document the valid values here as well? Also spi-drctl isn't
really a nice name, maybe something human understandable that doesn't
require looking into the datasheet?

> +
>  Example:
>
>  ecspi@70010000 {
> @@ -35,4 +39,5 @@ ecspi@70010000 {
>                    <&gpio3 25 0>; /* GPIO3_25 */
>         dmas = <&sdma 3 7 1>, <&sdma 4 7 2>;
>         dma-names = "rx", "tx";
> +       fsl,spi-drctl = <1>;
>  };
> diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
> index 9a7c62f471dc..647a4bf18705 100644
> --- a/drivers/spi/spi-imx.c
> +++ b/drivers/spi/spi-imx.c
> @@ -95,6 +95,7 @@ struct spi_imx_data {
>         unsigned int spi_bus_clk;
>
>         unsigned int bytes_per_word;
> +       unsigned int spi_drctl;
>
>         unsigned int count;
>         void (*tx)(struct spi_imx_data *);
> @@ -246,6 +247,7 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi,
>  #define MX51_ECSPI_CTRL_XCH            (1 <<  2)
>  #define MX51_ECSPI_CTRL_SMC            (1 << 3)
>  #define MX51_ECSPI_CTRL_MODE_MASK      (0xf << 4)
> +#define MX51_ECSPI_CTRL_DRCTL(drctl)   ((drctl) << 16)
>  #define MX51_ECSPI_CTRL_POSTDIV_OFFSET 8
>  #define MX51_ECSPI_CTRL_PREDIV_OFFSET  12
>  #define MX51_ECSPI_CTRL_CS(cs)         ((cs) << 18)
> @@ -355,6 +357,12 @@ static int mx51_ecspi_config(struct spi_device *spi,
>          */
>         ctrl |= MX51_ECSPI_CTRL_MODE_MASK;
>
> +       /*
> +        * Enable SPI_RDY handling (falling edge/level triggered).
> +        */
> +       if (spi->mode & SPI_READY)
> +               ctrl |= MX51_ECSPI_CTRL_DRCTL(spi_imx->spi_drctl);
> +
>         /* set clock speed */
>         ctrl |= mx51_ecspi_clkdiv(spi_imx, config->speed_hz, &clk);
>         spi_imx->spi_bus_clk = clk;
> @@ -1173,7 +1181,7 @@ static int spi_imx_probe(struct platform_device *pdev)
>         struct spi_master *master;
>         struct spi_imx_data *spi_imx;
>         struct resource *res;
> -       int i, ret, irq;
> +       int i, ret, irq, spi_drctl;
>
>         if (!np && !mxc_platform_info) {
>                 dev_err(&pdev->dev, "can't get the platform data\n");
> @@ -1181,6 +1189,15 @@ static int spi_imx_probe(struct platform_device *pdev)
>         }
>
>         master = spi_alloc_master(&pdev->dev, sizeof(struct spi_imx_data));
> +       ret = of_property_read_u32(np, "fsl,spi-drctl", &spi_drctl);
> +       if ((ret < 0) || (spi_drctl == 0x3)) {
> +               // '11' is reserved

Don't use C99 comments, use /* */ comments.

> +               spi_drctl = 0;

Here you say '11' is reserved and force 0 if set

> +       } else {
> +               // only the values '00', '01' and '11' are valid

And here you say '11' is valid. So which is it? Did you mean '10'?

> +               spi_drctl &= 0x3;

Also with this code flow if fsl,spi-drctl is set to <7>, it will cause
spi_drctl set to '11' / 0x3.

Maybe it would be easier to do

       if (ret < 0 || spi_drctl >= 0x3)
              spi_drctl = 0;

to only accept valid values. Assuming '11' is the invalid one and not '10'.


Regards
Jonas
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]
  Powered by Linux