Den 11.06.2021 23.42, skrev Linus Walleij:
> The SPI access to s6e63m0 is using the DBI protocol, so switch
> to using the elaborate DBI protocol implementation in the DRM
> DBI helper library.
> 
> Cc: Douglas Anderson <[email protected]>
> Cc: Noralf Trønnes <[email protected]>
> Signed-off-by: Linus Walleij <[email protected]>
> ---

> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e63m0-spi.c 
> b/drivers/gpu/drm/panel/panel-samsung-s6e63m0-spi.c
> index 326deb3177b6..293c18ee448a 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6e63m0-spi.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e63m0-spi.c
> @@ -5,62 +5,42 @@
>  #include <linux/spi/spi.h>
>  #include <linux/delay.h>
>  
> +#include <drm/drm_mipi_dbi.h>
>  #include <drm/drm_print.h>
>  
>  #include "panel-samsung-s6e63m0.h"
>  
> -#define DATA_MASK    0x100
> +static const u8 s6e63m0_dbi_read_commands[] = {
> +     MCS_READ_ID1,
> +     MCS_READ_ID2,
> +     MCS_READ_ID3,
> +     0, /* sentinel */
> +};
>  
> -static int s6e63m0_spi_dcs_read(struct device *dev, const u8 cmd, u8 *data)
> +static int s6e63m0_spi_dcs_read(struct device *dev, void *trsp,
> +                             const u8 cmd, u8 *data)
>  {
> -     struct spi_device *spi = to_spi_device(dev);
> -     u16 buf[1];
> -     u16 rbuf[1];
> +     struct mipi_dbi *dbi = trsp;
>       int ret;
>  
> -     /* SPI buffers are always in CPU order */
> -     buf[0] = (u16)cmd;
> -     ret = spi_write_then_read(spi, buf, 2, rbuf, 2);
> -     dev_dbg(dev, "READ CMD: %04x RET: %04x\n", buf[0], rbuf[0]);
> -     if (!ret)
> -             /* These high 8 bits of the 9 contains the readout */
> -             *data = (rbuf[0] & 0x1ff) >> 1;
> +     ret = mipi_dbi_command_read(dbi, cmd, data);
> +     if (ret)
> +             dev_err(dev, "error on DBI read command %02x\n", cmd);
> +     else
> +             dev_dbg(dev, "read DBI %02x\n", *data);

You could drop this dev_dbg() and set drm.debug=2 instead to get the
same info. See MIPI_DBI_DEBUG_COMMAND().

>  
>       return ret;
>  }
>  
> -static int s6e63m0_spi_write_word(struct device *dev, u16 data)
> -{
> -     struct spi_device *spi = to_spi_device(dev);
> -
> -     /* SPI buffers are always in CPU order */
> -     return spi_write(spi, &data, 2);
> -}
> -
> -static int s6e63m0_spi_dcs_write(struct device *dev, const u8 *data, size_t 
> len)
> +static int s6e63m0_spi_dcs_write(struct device *dev, void *trsp,
> +                              const u8 *data, size_t len)
>  {
> -     int ret = 0;
> +     struct mipi_dbi *dbi = trsp;
> +     int ret;
>  
>       dev_dbg(dev, "SPI writing dcs seq: %*ph\n", (int)len, data);

Same here MIPI_DBI_DEBUG_COMMAND() can print this.

>  
> -     /*
> -      * This sends 9 bits with the first bit (bit 8) set to 0
> -      * This indicates that this is a command. Anything after the
> -      * command is data.
> -      */
> -     ret = s6e63m0_spi_write_word(dev, *data);
> -
> -     while (!ret && --len) {
> -             ++data;
> -             /* This sends 9 bits with the first bit (bit 8) set to 1 */
> -             ret = s6e63m0_spi_write_word(dev, *data | DATA_MASK);
> -     }
> -
> -     if (ret) {
> -             dev_err(dev, "SPI error %d writing dcs seq: %*ph\n", ret,
> -                     (int)len, data);
> -     }
> -
> +     ret = mipi_dbi_command_stackbuf(dbi, data[0], (data + 1), (len - 1));

_stackbuf was not meant to be used by drivers, but I see that the driver
layering gives you no choice (except open coding ofc). So:

Acked-by: Noralf Trønnes <[email protected]>

Noralf.

>       usleep_range(300, 310);
>  
>       return ret;

Reply via email to