Most current controller IP support 64-bit words. Update the mask to u64 from u32.
Signed-off-by: Da Xue da@libre.computer --- drivers/iio/adc/ad7949.c | 2 +- drivers/spi/spi-dln2.c | 2 +- drivers/spi/spi-ingenic.c | 2 +- drivers/spi/spi-sh-msiof.c | 2 +- drivers/spi/spi.c | 4 ++-- drivers/staging/greybus/spilib.c | 2 +- include/linux/spi/altera.h | 2 +- include/linux/spi/spi.h | 6 +++--- 8 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/drivers/iio/adc/ad7949.c b/drivers/iio/adc/ad7949.c index edd0c3a35ab7..469789ffa4a3 100644 --- a/drivers/iio/adc/ad7949.c +++ b/drivers/iio/adc/ad7949.c @@ -308,7 +308,7 @@ static void ad7949_disable_reg(void *reg)
static int ad7949_spi_probe(struct spi_device *spi) { - u32 spi_ctrl_mask = spi->controller->bits_per_word_mask; + u64 spi_ctrl_mask = spi->controller->bits_per_word_mask; struct device *dev = &spi->dev; const struct ad7949_adc_spec *spec; struct ad7949_adc_chip *ad7949_adc; diff --git a/drivers/spi/spi-dln2.c b/drivers/spi/spi-dln2.c index 2013bc56ded8..cccbb00ad5ce 100644 --- a/drivers/spi/spi-dln2.c +++ b/drivers/spi/spi-dln2.c @@ -315,7 +315,7 @@ static int dln2_spi_set_bpw(struct dln2_spi *dln2, u8 bpw) }
static int dln2_spi_get_supported_frame_sizes(struct dln2_spi *dln2, - u32 *bpw_mask) + u64 *bpw_mask) { int ret; struct { diff --git a/drivers/spi/spi-ingenic.c b/drivers/spi/spi-ingenic.c index 318b0768701e..21d453d6e46e 100644 --- a/drivers/spi/spi-ingenic.c +++ b/drivers/spi/spi-ingenic.c @@ -51,7 +51,7 @@ #define SPI_INGENIC_FIFO_SIZE 128u
struct jz_soc_info { - u32 bits_per_word_mask; + u64 bits_per_word_mask; struct reg_field flen_field; bool has_trendian;
diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c index 94a867967e02..97f5a6192279 100644 --- a/drivers/spi/spi-sh-msiof.c +++ b/drivers/spi/spi-sh-msiof.c @@ -33,7 +33,7 @@ #define SH_MSIOF_FLAG_FIXED_DTDL_200 BIT(0)
struct sh_msiof_chipdata { - u32 bits_per_word_mask; + u64 bits_per_word_mask; u16 tx_fifo_size; u16 rx_fifo_size; u16 ctlr_flags; diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 1bc0fdbb1bd7..4f47201f2462 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -3824,8 +3824,8 @@ static int __spi_validate_bits_per_word(struct spi_controller *ctlr, u8 bits_per_word) { if (ctlr->bits_per_word_mask) { - /* Only 32 bits fit in the mask */ - if (bits_per_word > 32) + /* Only 64 bits fit in the mask */ + if (bits_per_word > 64) return -EINVAL; if (!(ctlr->bits_per_word_mask & SPI_BPW_MASK(bits_per_word))) return -EINVAL; diff --git a/drivers/staging/greybus/spilib.c b/drivers/staging/greybus/spilib.c index 24e9c909fa02..087eed1879b1 100644 --- a/drivers/staging/greybus/spilib.c +++ b/drivers/staging/greybus/spilib.c @@ -27,7 +27,7 @@ struct gb_spilib { unsigned int op_timeout; u16 mode; u16 flags; - u32 bits_per_word_mask; + u64 bits_per_word_mask; u8 num_chipselect; u32 min_speed_hz; u32 max_speed_hz; diff --git a/include/linux/spi/altera.h b/include/linux/spi/altera.h index 3b74c3750caf..d6e036ed00e2 100644 --- a/include/linux/spi/altera.h +++ b/include/linux/spi/altera.h @@ -24,7 +24,7 @@ struct altera_spi_platform_data { u16 mode_bits; u16 num_chipselect; - u32 bits_per_word_mask; + u64 bits_per_word_mask; u16 num_devices; struct spi_board_info *devices; }; diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 4789f91dae94..f44120d5a63c 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -586,7 +586,7 @@ struct spi_controller { u32 buswidth_override_bits;
/* Bitmask of supported bits_per_word for transfers */ - u32 bits_per_word_mask; + u64 bits_per_word_mask; #define SPI_BPW_MASK(bits) BIT((bits) - 1) #define SPI_BPW_RANGE_MASK(min, max) GENMASK((max) - 1, (min) - 1)
@@ -1329,9 +1329,9 @@ spi_max_transfer_size(struct spi_device *spi) */ static inline bool spi_is_bpw_supported(struct spi_device *spi, u32 bpw) { - u32 bpw_mask = spi->controller->bits_per_word_mask; + u64 bpw_mask = spi->controller->bits_per_word_mask;
- if (bpw == 8 || (bpw <= 32 && bpw_mask & SPI_BPW_MASK(bpw))) + if (bpw == 8 || (bpw <= 64 && bpw_mask & SPI_BPW_MASK(bpw))) return true;
return false;
On Tue, Jun 10, 2025 at 08:05:15PM -0400, Da Xue wrote:
Most current controller IP support 64-bit words.
"Most of the current controllers support..."
Update the mask to u64 from u32.
drivers/iio/adc/ad7949.c | 2 +- drivers/spi/spi-dln2.c | 2 +- drivers/spi/spi-ingenic.c | 2 +- drivers/spi/spi-sh-msiof.c | 2 +- drivers/spi/spi.c | 4 ++-- drivers/staging/greybus/spilib.c | 2 +- include/linux/spi/altera.h | 2 +- include/linux/spi/spi.h | 6 +++---
I guess it would be nice to split on per-driver basis, starting from updating the SPI core. I counted 6 patches in such a case.
On Tue, Jun 10, 2025 at 08:05:15PM -0400, Da Xue wrote:
Most current controller IP support 64-bit words. Update the mask to u64 from u32.
The change looks broadly good, the only concern I have is making sure that the controllers are individually checked for support and impose any restrictions they need.
On 6/10/25 7:05 PM, Da Xue wrote:
Most current controller IP support 64-bit words. Update the mask to u64 from u32.
Signed-off-by: Da Xue da@libre.computer
drivers/iio/adc/ad7949.c | 2 +- drivers/spi/spi-dln2.c | 2 +- drivers/spi/spi-ingenic.c | 2 +- drivers/spi/spi-sh-msiof.c | 2 +- drivers/spi/spi.c | 4 ++-- drivers/staging/greybus/spilib.c | 2 +- include/linux/spi/altera.h | 2 +- include/linux/spi/spi.h | 6 +++--- 8 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/drivers/iio/adc/ad7949.c b/drivers/iio/adc/ad7949.c index edd0c3a35ab7..469789ffa4a3 100644 --- a/drivers/iio/adc/ad7949.c +++ b/drivers/iio/adc/ad7949.c @@ -308,7 +308,7 @@ static void ad7949_disable_reg(void *reg) static int ad7949_spi_probe(struct spi_device *spi) {
- u32 spi_ctrl_mask = spi->controller->bits_per_word_mask;
- u64 spi_ctrl_mask = spi->controller->bits_per_word_mask;
I think this driver is incorrectly accessing bits_per_word_mask directly and should be using spi_is_bpw_supported() instead.
This driver checks for SPI_BPW_MASK(8) at one point but doesn't take into account that if bits_per_word_mask == 0, then 8 is implied. spi_is_bpw_supported(), on the other hand, takes this into account.
struct device *dev = &spi->dev; const struct ad7949_adc_spec *spec; struct ad7949_adc_chip *ad7949_adc;
...
diff --git a/drivers/staging/greybus/spilib.c b/drivers/staging/greybus/spilib.c index 24e9c909fa02..087eed1879b1 100644 --- a/drivers/staging/greybus/spilib.c +++ b/drivers/staging/greybus/spilib.c @@ -27,7 +27,7 @@ struct gb_spilib { unsigned int op_timeout; u16 mode; u16 flags;
- u32 bits_per_word_mask;
- u64 bits_per_word_mask;
This is assigned by:
spi->bits_per_word_mask = le32_to_cpu(response.bits_per_word_mask);
in gb_spi_get_master_config(), so changing to u64 doesn't have any effect and should likely be omitted to avoid confusion.
(The response struct is defined by a communication protocol and can't be changed, otherwise it would break the communications.)
u8 num_chipselect; u32 min_speed_hz; u32 max_speed_hz;
On Wed, Jun 11, 2025 at 09:16:06AM -0500, David Lechner wrote:
On 6/10/25 7:05 PM, Da Xue wrote:
static int ad7949_spi_probe(struct spi_device *spi) {
- u32 spi_ctrl_mask = spi->controller->bits_per_word_mask;
- u64 spi_ctrl_mask = spi->controller->bits_per_word_mask;
I think this driver is incorrectly accessing bits_per_word_mask directly and should be using spi_is_bpw_supported() instead.
Yes, that'd be an improvemnet.
On Wed, Jun 11, 2025 at 09:16:06AM -0500, David Lechner wrote:
On 6/10/25 7:05 PM, Da Xue wrote:
...
struct gb_spilib {
- u32 bits_per_word_mask;
- u64 bits_per_word_mask;
This is assigned by:
spi->bits_per_word_mask = le32_to_cpu(response.bits_per_word_mask);
in gb_spi_get_master_config(), so changing to u64 doesn't have any effect and should likely be omitted to avoid confusion.
(The response struct is defined by a communication protocol and can't be changed, otherwise it would break the communications.)
Perhaps the name of the field should be different to avoid appearance of the similar changes in the future (esp. if this series in general makes the upstream)?