mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
spi: Fixes for v6.10
A number of fixes that have built up for SPI, a bunch of driver specific ones including an unfortunate revert of an optimisation for the i.MX driver which was causing issues with some configurations, plus a couple of core fixes for the rarely used octal mode and for a bad interaction between multi-CS support and target mode. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmZ2+ekACgkQJNaLcl1U h9DD8Af/fGg7Sf7Ajt8IVI4D33+4SujFWHmu0ELgZVS4k7i+BpiZFJwHpKsfX0eN I1/gVq5K6SJc1n1kiR2z2xCGD4JL0uqwk8y6QhARGnwQUVNrcsrM6TvT9N8uRelB tEoCfDu8Wj2KNLHn5v4LL4uNnIEBamOHbRVTVq62JcXawgVZiiLQT436APXaS7uq JstmiaiRzFVSQfoU2SBpbvXwp8QjqeV3l02DKwaafpoiMpccaUz2TNAXytXysHkE h3je8uFMU+yYqK3G8t9HQQQema3GHFi1NtK472TDQe3FxZr8IzW6Gy/iFRArcSZV rVEP07Q/X5OlK5LAs/hFbl+sEzkYbw== =8xay -----END PGP SIGNATURE----- Merge tag 'spi-fix-v6.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi Pull spi fixes from Mark Brown: "A number of fixes that have built up for SPI, a bunch of driver specific ones including an unfortunate revert of an optimisation for the i.MX driver which was causing issues with some configurations, plus a couple of core fixes for the rarely used octal mode and for a bad interaction between multi-CS support and target mode" * tag 'spi-fix-v6.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi: spi: spi-imx: imx51: revert burst length calculation back to bits_per_word spi: Fix SPI slave probe failure spi: Fix OCTAL mode support spi: stm32: qspi: Clamp stm32_qspi_get_mode() output to CCR_BUSWIDTH_4 spi: stm32: qspi: Fix dual flash mode sanity test in stm32_qspi_setup() spi: cs42l43: Drop cs35l56 SPI speed down to 11MHz spi: cs42l43: Correct SPI root clock speed
This commit is contained in:
commit
e24638afe2
@ -26,7 +26,7 @@
|
||||
#include <linux/units.h>
|
||||
|
||||
#define CS42L43_FIFO_SIZE 16
|
||||
#define CS42L43_SPI_ROOT_HZ (40 * HZ_PER_MHZ)
|
||||
#define CS42L43_SPI_ROOT_HZ 49152000
|
||||
#define CS42L43_SPI_MAX_LENGTH 65532
|
||||
|
||||
enum cs42l43_spi_cmd {
|
||||
@ -54,7 +54,7 @@ static const struct software_node ampr = {
|
||||
|
||||
static struct spi_board_info ampl_info = {
|
||||
.modalias = "cs35l56",
|
||||
.max_speed_hz = 20 * HZ_PER_MHZ,
|
||||
.max_speed_hz = 11 * HZ_PER_MHZ,
|
||||
.chip_select = 0,
|
||||
.mode = SPI_MODE_0,
|
||||
.swnode = &l,
|
||||
@ -62,7 +62,7 @@ static struct spi_board_info ampl_info = {
|
||||
|
||||
static struct spi_board_info ampr_info = {
|
||||
.modalias = "cs35l56",
|
||||
.max_speed_hz = 20 * HZ_PER_MHZ,
|
||||
.max_speed_hz = 11 * HZ_PER_MHZ,
|
||||
.chip_select = 1,
|
||||
.mode = SPI_MODE_0,
|
||||
.swnode = &r,
|
||||
|
@ -660,18 +660,8 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx,
|
||||
ctrl |= (spi_imx->target_burst * 8 - 1)
|
||||
<< MX51_ECSPI_CTRL_BL_OFFSET;
|
||||
else {
|
||||
if (spi_imx->usedma) {
|
||||
ctrl |= (spi_imx->bits_per_word - 1)
|
||||
<< MX51_ECSPI_CTRL_BL_OFFSET;
|
||||
} else {
|
||||
if (spi_imx->count >= MX51_ECSPI_CTRL_MAX_BURST)
|
||||
ctrl |= (MX51_ECSPI_CTRL_MAX_BURST * BITS_PER_BYTE - 1)
|
||||
<< MX51_ECSPI_CTRL_BL_OFFSET;
|
||||
else
|
||||
ctrl |= (spi_imx->count / DIV_ROUND_UP(spi_imx->bits_per_word,
|
||||
BITS_PER_BYTE) * spi_imx->bits_per_word - 1)
|
||||
<< MX51_ECSPI_CTRL_BL_OFFSET;
|
||||
}
|
||||
ctrl |= (spi_imx->bits_per_word - 1)
|
||||
<< MX51_ECSPI_CTRL_BL_OFFSET;
|
||||
}
|
||||
|
||||
/* set clock speed */
|
||||
|
@ -349,7 +349,7 @@ static int stm32_qspi_wait_poll_status(struct stm32_qspi *qspi)
|
||||
|
||||
static int stm32_qspi_get_mode(u8 buswidth)
|
||||
{
|
||||
if (buswidth == 4)
|
||||
if (buswidth >= 4)
|
||||
return CCR_BUSWIDTH_4;
|
||||
|
||||
return buswidth;
|
||||
@ -653,9 +653,7 @@ static int stm32_qspi_setup(struct spi_device *spi)
|
||||
return -EINVAL;
|
||||
|
||||
mode = spi->mode & (SPI_TX_OCTAL | SPI_RX_OCTAL);
|
||||
if ((mode == SPI_TX_OCTAL || mode == SPI_RX_OCTAL) ||
|
||||
((mode == (SPI_TX_OCTAL | SPI_RX_OCTAL)) &&
|
||||
gpiod_count(qspi->dev, "cs") == -ENOENT)) {
|
||||
if (mode && gpiod_count(qspi->dev, "cs") == -ENOENT) {
|
||||
dev_err(qspi->dev, "spi-rx-bus-width\\/spi-tx-bus-width\\/cs-gpios\n");
|
||||
dev_err(qspi->dev, "configuration not supported\n");
|
||||
|
||||
@ -676,10 +674,10 @@ static int stm32_qspi_setup(struct spi_device *spi)
|
||||
qspi->cr_reg = CR_APMS | 3 << CR_FTHRES_SHIFT | CR_SSHIFT | CR_EN;
|
||||
|
||||
/*
|
||||
* Dual flash mode is only enable in case SPI_TX_OCTAL and SPI_TX_OCTAL
|
||||
* are both set in spi->mode and "cs-gpios" properties is found in DT
|
||||
* Dual flash mode is only enable in case SPI_TX_OCTAL or SPI_RX_OCTAL
|
||||
* is set in spi->mode and "cs-gpios" properties is found in DT
|
||||
*/
|
||||
if (mode == (SPI_TX_OCTAL | SPI_RX_OCTAL)) {
|
||||
if (mode) {
|
||||
qspi->cr_reg |= CR_DFM;
|
||||
dev_dbg(qspi->dev, "Dual flash mode enable");
|
||||
}
|
||||
|
@ -689,10 +689,12 @@ static int __spi_add_device(struct spi_device *spi)
|
||||
* Make sure that multiple logical CS doesn't map to the same physical CS.
|
||||
* For example, spi->chip_select[0] != spi->chip_select[1] and so on.
|
||||
*/
|
||||
for (idx = 0; idx < SPI_CS_CNT_MAX; idx++) {
|
||||
status = spi_dev_check_cs(dev, spi, idx, spi, idx + 1);
|
||||
if (status)
|
||||
return status;
|
||||
if (!spi_controller_is_target(ctlr)) {
|
||||
for (idx = 0; idx < SPI_CS_CNT_MAX; idx++) {
|
||||
status = spi_dev_check_cs(dev, spi, idx, spi, idx + 1);
|
||||
if (status)
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
/* Set the bus ID string */
|
||||
@ -4156,7 +4158,8 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)
|
||||
return -EINVAL;
|
||||
if (xfer->tx_nbits != SPI_NBITS_SINGLE &&
|
||||
xfer->tx_nbits != SPI_NBITS_DUAL &&
|
||||
xfer->tx_nbits != SPI_NBITS_QUAD)
|
||||
xfer->tx_nbits != SPI_NBITS_QUAD &&
|
||||
xfer->tx_nbits != SPI_NBITS_OCTAL)
|
||||
return -EINVAL;
|
||||
if ((xfer->tx_nbits == SPI_NBITS_DUAL) &&
|
||||
!(spi->mode & (SPI_TX_DUAL | SPI_TX_QUAD)))
|
||||
@ -4171,7 +4174,8 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)
|
||||
return -EINVAL;
|
||||
if (xfer->rx_nbits != SPI_NBITS_SINGLE &&
|
||||
xfer->rx_nbits != SPI_NBITS_DUAL &&
|
||||
xfer->rx_nbits != SPI_NBITS_QUAD)
|
||||
xfer->rx_nbits != SPI_NBITS_QUAD &&
|
||||
xfer->rx_nbits != SPI_NBITS_OCTAL)
|
||||
return -EINVAL;
|
||||
if ((xfer->rx_nbits == SPI_NBITS_DUAL) &&
|
||||
!(spi->mode & (SPI_RX_DUAL | SPI_RX_QUAD)))
|
||||
|
@ -1085,12 +1085,13 @@ struct spi_transfer {
|
||||
unsigned dummy_data:1;
|
||||
unsigned cs_off:1;
|
||||
unsigned cs_change:1;
|
||||
unsigned tx_nbits:3;
|
||||
unsigned rx_nbits:3;
|
||||
unsigned tx_nbits:4;
|
||||
unsigned rx_nbits:4;
|
||||
unsigned timestamped:1;
|
||||
#define SPI_NBITS_SINGLE 0x01 /* 1-bit transfer */
|
||||
#define SPI_NBITS_DUAL 0x02 /* 2-bit transfer */
|
||||
#define SPI_NBITS_QUAD 0x04 /* 4-bit transfer */
|
||||
#define SPI_NBITS_OCTAL 0x08 /* 8-bit transfer */
|
||||
u8 bits_per_word;
|
||||
struct spi_delay delay;
|
||||
struct spi_delay cs_change_delay;
|
||||
|
Loading…
Reference in New Issue
Block a user