Introduce the to_prescale_mod and set_char_len inline functions to make
the code more readable.

Note that the added "if (bitlen > 16)" check does not change the
semantics of the current code, and hence only preserves the current
error (this will be fixed in a later patch in the series).

Signed-off-by: Mario Six <mario....@gdsys.cc>
---
 drivers/spi/mpc8xxx_spi.c | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/drivers/spi/mpc8xxx_spi.c b/drivers/spi/mpc8xxx_spi.c
index 5bf84aaec6..af3762737f 100644
--- a/drivers/spi/mpc8xxx_spi.c
+++ b/drivers/spi/mpc8xxx_spi.c
@@ -31,6 +31,16 @@ enum {
        SPI_COM_LST = BIT(31 - 9),
 };
 
+static inline u32 to_prescale_mod(u32 val)
+{
+       return (min(val, (u32)15) << 16);
+}
+
+static void set_char_len(spi8xxx_t *spi, u32 val)
+{
+       clrsetbits_be32(&spi->mode, SPI_MODE_LEN_MASK, (val << 20));
+}
+
 #define SPI_TIMEOUT    1000
 
 struct spi_slave *spi_setup_slave(uint bus, uint cs, uint max_hz, uint mode)
@@ -67,7 +77,7 @@ void spi_init(void)
         */
        out_be32(&spi->mode, SPI_MODE_REV | SPI_MODE_MS | SPI_MODE_EN);
        /* Use SYSCLK / 8 (16.67MHz typ.) */
-       clrsetbits_be32(&spi->mode, 0x000f0000, BIT(16));
+       clrsetbits_be32(&spi->mode, SPI_MODE_PM_MASK, to_prescale_mod(1));
        /* Clear all SPI events */
        setbits_be32(&spi->event, 0xffffffff);
        /* Mask  all SPI interrupts */
@@ -120,13 +130,14 @@ int spi_xfer(struct spi_slave *slave, uint bitlen, const 
void *dout, void *din,
 
                clrbits_be32(&spi->mode, SPI_MODE_EN);
 
-               if (bitlen <= 4) {
-                       clrsetbits_be32(&spi->mode, 0x00f00000, (3 << 20));
-               } else if (bitlen <= 16) {
-                       clrsetbits_be32(&spi->mode, 0x00f00000,
-                                       ((bitlen - 1) << 20));
-               } else {
-                       clrbits_be32(&spi->mode, 0x00f00000);
+               if (bitlen <= 4)
+                       set_char_len(spi, 3);
+               else if (bitlen <= 16)
+                       set_char_len(spi, bitlen - 1);
+               else
+                       set_char_len(spi, 0);
+
+               if (bitlen > 16) {
                        /* Set up the next iteration if sending > 32 bits */
                        bitlen -= 32;
                        dout += 4;
-- 
2.11.0

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to