drm/tinydrm: Clean up tinydrm_spi_transfer()
authorNoralf Trønnes <noralf@tronnes.org>
Fri, 19 Jul 2019 15:59:11 +0000 (17:59 +0200)
committerNoralf Trønnes <noralf@tronnes.org>
Tue, 23 Jul 2019 13:46:56 +0000 (15:46 +0200)
Prep work before moving the function to mipi-dbi.

tinydrm_spi_transfer() was made to support one class of drivers in
drivers/staging/fbtft that has not been converted to DRM yet, so strip
away the unused functionality:
- Start byte (header) is not used.
- No driver relies on the automatic 16-bit byte swapping on little endian
  machines with SPI controllers only supporting 8 bits per word.

Other changes:
- No need to initialize ret
- No need for the WARN since mipi-dbi only uses 8 and 16 bpw.
- Use spi_message_init_with_transfers()

Cc: David Lechner <david@lechnology.com>
Acked-by: : David Lechner <david@lechnology.com>
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20190719155916.62465-7-noralf@tronnes.org
drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c
drivers/gpu/drm/tinydrm/ili9225.c
drivers/gpu/drm/tinydrm/mipi-dbi.c
include/drm/tinydrm/tinydrm-helpers.h

index af5bec8861def750d3a242abb37e45f71da359e8..d95eb50fa9d4b99e693e23c3e35a78838d2d6e1b 100644 (file)
  * tinydrm_spi_transfer - SPI transfer helper
  * @spi: SPI device
  * @speed_hz: Override speed (optional)
- * @header: Optional header transfer
  * @bpw: Bits per word
  * @buf: Buffer to transfer
  * @len: Buffer length
  *
  * This SPI transfer helper breaks up the transfer of @buf into chunks which
- * the SPI master driver can handle. If the machine is Little Endian and the
- * SPI master driver doesn't support 16 bits per word, it swaps the bytes and
- * does a 8-bit transfer.
- * If @header is set, it is prepended to each SPI message.
+ * the SPI controller driver can handle.
  *
  * Returns:
  * Zero on success, negative error code on failure.
  */
 int tinydrm_spi_transfer(struct spi_device *spi, u32 speed_hz,
-                        struct spi_transfer *header, u8 bpw, const void *buf,
-                        size_t len)
+                        u8 bpw, const void *buf, size_t len)
 {
        size_t max_chunk = spi_max_transfer_size(spi);
        struct spi_transfer tr = {
@@ -48,43 +43,16 @@ int tinydrm_spi_transfer(struct spi_device *spi, u32 speed_hz,
                .speed_hz = speed_hz,
        };
        struct spi_message m;
-       u16 *swap_buf = NULL;
        size_t chunk;
-       int ret = 0;
+       int ret;
 
-       if (WARN_ON_ONCE(bpw != 8 && bpw != 16))
-               return -EINVAL;
-
-       if (bpw == 16 && !spi_is_bpw_supported(spi, 16)) {
-               tr.bits_per_word = 8;
-               if (tinydrm_machine_little_endian()) {
-                       swap_buf = kmalloc(min(len, max_chunk), GFP_KERNEL);
-                       if (!swap_buf)
-                               return -ENOMEM;
-               }
-       }
-
-       spi_message_init(&m);
-       if (header)
-               spi_message_add_tail(header, &m);
-       spi_message_add_tail(&tr, &m);
+       spi_message_init_with_transfers(&m, &tr, 1);
 
        while (len) {
                chunk = min(len, max_chunk);
 
                tr.tx_buf = buf;
                tr.len = chunk;
-
-               if (swap_buf) {
-                       const u16 *buf16 = buf;
-                       unsigned int i;
-
-                       for (i = 0; i < chunk / 2; i++)
-                               swap_buf[i] = swab16(buf16[i]);
-
-                       tr.tx_buf = swap_buf;
-               }
-
                buf += chunk;
                len -= chunk;
 
index 7a8e1b4a37ee2dcf19e377c155ec28e8b4da1390..21677e3ed38ba5dbba3c3e3f20202b25ec2b5943 100644 (file)
@@ -323,7 +323,7 @@ static int ili9225_dbi_command(struct mipi_dbi *mipi, u8 *cmd, u8 *par,
 
        gpiod_set_value_cansleep(mipi->dc, 0);
        speed_hz = mipi_dbi_spi_cmd_max_speed(spi, 1);
-       ret = tinydrm_spi_transfer(spi, speed_hz, NULL, 8, cmd, 1);
+       ret = tinydrm_spi_transfer(spi, speed_hz, 8, cmd, 1);
        if (ret || !num)
                return ret;
 
@@ -333,7 +333,7 @@ static int ili9225_dbi_command(struct mipi_dbi *mipi, u8 *cmd, u8 *par,
        gpiod_set_value_cansleep(mipi->dc, 1);
        speed_hz = mipi_dbi_spi_cmd_max_speed(spi, num);
 
-       return tinydrm_spi_transfer(spi, speed_hz, NULL, bpw, par, num);
+       return tinydrm_spi_transfer(spi, speed_hz, bpw, par, num);
 }
 
 static const struct drm_simple_display_pipe_funcs ili9225_pipe_funcs = {
index ae31a5c9aa1bddcd84101090093f56e66d3977e3..8fb6ce4ca6fcb90f61dbe96727e48b29adcdec10 100644 (file)
@@ -926,7 +926,7 @@ static int mipi_dbi_typec3_command(struct mipi_dbi *mipi, u8 *cmd,
 
        gpiod_set_value_cansleep(mipi->dc, 0);
        speed_hz = mipi_dbi_spi_cmd_max_speed(spi, 1);
-       ret = tinydrm_spi_transfer(spi, speed_hz, NULL, 8, cmd, 1);
+       ret = tinydrm_spi_transfer(spi, speed_hz, 8, cmd, 1);
        if (ret || !num)
                return ret;
 
@@ -936,7 +936,7 @@ static int mipi_dbi_typec3_command(struct mipi_dbi *mipi, u8 *cmd,
        gpiod_set_value_cansleep(mipi->dc, 1);
        speed_hz = mipi_dbi_spi_cmd_max_speed(spi, num);
 
-       return tinydrm_spi_transfer(spi, speed_hz, NULL, bpw, par, num);
+       return tinydrm_spi_transfer(spi, speed_hz, bpw, par, num);
 }
 
 /**
index 10b35375a0097ee52d66319c1eb57579c0f337c9..708c5a7d51e0c990e2fbbfe61d1c39585c8ead64 100644 (file)
@@ -42,7 +42,6 @@ int tinydrm_display_pipe_init(struct drm_device *drm,
                              unsigned int rotation);
 
 int tinydrm_spi_transfer(struct spi_device *spi, u32 speed_hz,
-                        struct spi_transfer *header, u8 bpw, const void *buf,
-                        size_t len);
+                        u8 bpw, const void *buf, size_t len);
 
 #endif /* __LINUX_TINYDRM_HELPERS_H */