Message ID | 14ba5323c657e66b005b38a0104e28d0b070bfc2.1520691344.git.meghana.madhyastha@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Den 10.03.2018 16.52, skrev Meghana Madhyastha: > Remove chunk splitting in tinydrm_spi_transfer in tinydrm-helpers as the spi core will split > a buffer into max_dma_len chunks for the spi controller driver to handle, automatic byte > swapping in tinydrm_spi_transfer as it doesn't have users. > > Signed-off-by: Meghana Madhyastha <meghana.madhyastha@gmail.com> > --- > drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c | 48 ++++---------------------- > drivers/gpu/drm/tinydrm/mipi-dbi.c | 10 ++---- > drivers/spi/spi-bcm2835.c | 2 +- > 3 files changed, 9 insertions(+), 51 deletions(-) > > diff --git a/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c b/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c > index bf96072d1b97..6064099e8e63 100644 > --- a/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c > +++ b/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c > @@ -452,62 +452,26 @@ int tinydrm_spi_transfer(struct spi_device *spi, u32 speed_hz, > struct spi_transfer tr = { > .bits_per_word = bpw, > .speed_hz = speed_hz, > + .tx_buf = buf, > + .len = len > }; > struct spi_message m; > - u16 *swap_buf = NULL; > size_t max_chunk; > - size_t chunk; > - int ret = 0; > > - if (WARN_ON_ONCE(bpw != 8 && bpw != 16)) > - return -EINVAL; > - > - max_chunk = tinydrm_spi_max_transfer_size(spi, 0); > + max_chunk = SIZE_MAX; max_chunk isn't used so can be removed. tinydrm_spi_max_transfer_size() can also be remove now. > > if (drm_debug & DRM_UT_DRIVER) > pr_debug("[drm:%s] bpw=%u, max_chunk=%zu, transfers:\n", > - __func__, bpw, max_chunk); > - > - if (bpw == 16 && !tinydrm_spi_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; > - } > - } > + __func__, bpw, max_chunk); > > spi_message_init(&m); > if (header) > spi_message_add_tail(header, &m); > spi_message_add_tail(&tr, &m); > > - 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; > - > - tinydrm_dbg_spi_message(spi, &m); > - ret = spi_sync(spi, &m); > - if (ret) > - return ret; > - } > + tinydrm_dbg_spi_message(spi, &m); > > - return 0; > + return spi_sync(spi, &m); > } > EXPORT_SYMBOL(tinydrm_spi_transfer); > > diff --git a/drivers/gpu/drm/tinydrm/mipi-dbi.c b/drivers/gpu/drm/tinydrm/mipi-dbi.c > index 75dd65c57e74..c8af2d65c2ad 100644 > --- a/drivers/gpu/drm/tinydrm/mipi-dbi.c > +++ b/drivers/gpu/drm/tinydrm/mipi-dbi.c > @@ -886,15 +886,9 @@ static int mipi_dbi_typec3_command(struct mipi_dbi *mipi, u8 cmd, > int mipi_dbi_spi_init(struct spi_device *spi, struct mipi_dbi *mipi, > struct gpio_desc *dc) > { > - size_t tx_size = tinydrm_spi_max_transfer_size(spi, 0); > struct device *dev = &spi->dev; > int ret; > > - if (tx_size < 16) { > - DRM_ERROR("SPI transmit buffer too small: %zu\n", tx_size); > - return -EINVAL; > - } > - > /* > * Even though it's not the SPI device that does DMA (the master does), > * the dma mask is necessary for the dma_alloc_wc() in > @@ -924,8 +918,8 @@ int mipi_dbi_spi_init(struct spi_device *spi, struct mipi_dbi *mipi, > mipi->swap_bytes = true; > } else { > mipi->command = mipi_dbi_typec1_command; > - mipi->tx_buf9_len = tx_size; > - mipi->tx_buf9 = devm_kmalloc(dev, tx_size, GFP_KERNEL); > + mipi->tx_buf9_len = SZ_16K; > + mipi->tx_buf9 = devm_kmalloc(dev, mipi->tx_buf9_len, GFP_KERNEL); > if (!mipi->tx_buf9) > return -ENOMEM; > } > diff --git a/drivers/spi/spi-bcm2835.c b/drivers/spi/spi-bcm2835.c > index 0dcc45f158b8..2fd650891c07 100644 > --- a/drivers/spi/spi-bcm2835.c > +++ b/drivers/spi/spi-bcm2835.c > @@ -448,7 +448,7 @@ static void bcm2835_dma_init(struct spi_master *master, struct device *dev) > > /* all went well, so set can_dma */ > master->can_dma = bcm2835_spi_can_dma; > - master->max_dma_len = 65535; /* limitation by BCM2835_SPI_DLEN */ > + master->max_dma_len = 65528; /* limitation by BCM2835_SPI_DLEN */ This change belongs in the spi-bcm2835 patch. You need to tell us why the change is needed. Noralf. > /* need to do TX AND RX DMA, so we need dummy buffers */ > master->flags = SPI_MASTER_MUST_RX | SPI_MASTER_MUST_TX; > -- 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 --git a/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c b/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c index bf96072d1b97..6064099e8e63 100644 --- a/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c +++ b/drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c @@ -452,62 +452,26 @@ int tinydrm_spi_transfer(struct spi_device *spi, u32 speed_hz, struct spi_transfer tr = { .bits_per_word = bpw, .speed_hz = speed_hz, + .tx_buf = buf, + .len = len }; struct spi_message m; - u16 *swap_buf = NULL; size_t max_chunk; - size_t chunk; - int ret = 0; - if (WARN_ON_ONCE(bpw != 8 && bpw != 16)) - return -EINVAL; - - max_chunk = tinydrm_spi_max_transfer_size(spi, 0); + max_chunk = SIZE_MAX; if (drm_debug & DRM_UT_DRIVER) pr_debug("[drm:%s] bpw=%u, max_chunk=%zu, transfers:\n", - __func__, bpw, max_chunk); - - if (bpw == 16 && !tinydrm_spi_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; - } - } + __func__, bpw, max_chunk); spi_message_init(&m); if (header) spi_message_add_tail(header, &m); spi_message_add_tail(&tr, &m); - 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; - - tinydrm_dbg_spi_message(spi, &m); - ret = spi_sync(spi, &m); - if (ret) - return ret; - } + tinydrm_dbg_spi_message(spi, &m); - return 0; + return spi_sync(spi, &m); } EXPORT_SYMBOL(tinydrm_spi_transfer); diff --git a/drivers/gpu/drm/tinydrm/mipi-dbi.c b/drivers/gpu/drm/tinydrm/mipi-dbi.c index 75dd65c57e74..c8af2d65c2ad 100644 --- a/drivers/gpu/drm/tinydrm/mipi-dbi.c +++ b/drivers/gpu/drm/tinydrm/mipi-dbi.c @@ -886,15 +886,9 @@ static int mipi_dbi_typec3_command(struct mipi_dbi *mipi, u8 cmd, int mipi_dbi_spi_init(struct spi_device *spi, struct mipi_dbi *mipi, struct gpio_desc *dc) { - size_t tx_size = tinydrm_spi_max_transfer_size(spi, 0); struct device *dev = &spi->dev; int ret; - if (tx_size < 16) { - DRM_ERROR("SPI transmit buffer too small: %zu\n", tx_size); - return -EINVAL; - } - /* * Even though it's not the SPI device that does DMA (the master does), * the dma mask is necessary for the dma_alloc_wc() in @@ -924,8 +918,8 @@ int mipi_dbi_spi_init(struct spi_device *spi, struct mipi_dbi *mipi, mipi->swap_bytes = true; } else { mipi->command = mipi_dbi_typec1_command; - mipi->tx_buf9_len = tx_size; - mipi->tx_buf9 = devm_kmalloc(dev, tx_size, GFP_KERNEL); + mipi->tx_buf9_len = SZ_16K; + mipi->tx_buf9 = devm_kmalloc(dev, mipi->tx_buf9_len, GFP_KERNEL); if (!mipi->tx_buf9) return -ENOMEM; } diff --git a/drivers/spi/spi-bcm2835.c b/drivers/spi/spi-bcm2835.c index 0dcc45f158b8..2fd650891c07 100644 --- a/drivers/spi/spi-bcm2835.c +++ b/drivers/spi/spi-bcm2835.c @@ -448,7 +448,7 @@ static void bcm2835_dma_init(struct spi_master *master, struct device *dev) /* all went well, so set can_dma */ master->can_dma = bcm2835_spi_can_dma; - master->max_dma_len = 65535; /* limitation by BCM2835_SPI_DLEN */ + master->max_dma_len = 65528; /* limitation by BCM2835_SPI_DLEN */ /* need to do TX AND RX DMA, so we need dummy buffers */ master->flags = SPI_MASTER_MUST_RX | SPI_MASTER_MUST_TX;
Remove chunk splitting in tinydrm_spi_transfer in tinydrm-helpers as the spi core will split a buffer into max_dma_len chunks for the spi controller driver to handle, automatic byte swapping in tinydrm_spi_transfer as it doesn't have users. Signed-off-by: Meghana Madhyastha <meghana.madhyastha@gmail.com> --- drivers/gpu/drm/tinydrm/core/tinydrm-helpers.c | 48 ++++---------------------- drivers/gpu/drm/tinydrm/mipi-dbi.c | 10 ++---- drivers/spi/spi-bcm2835.c | 2 +- 3 files changed, 9 insertions(+), 51 deletions(-)