spi: cadence_qspi_apb: Ensure baudrate doesn't exceed max value
authorChin Liang See <clsee@altera.com>
Sun, 7 Aug 2016 14:50:40 +0000 (22:50 +0800)
committerMarek Vasut <marex@denx.de>
Sun, 7 Aug 2016 19:54:21 +0000 (21:54 +0200)
Ensuring the baudrate divisor value doesn't exceed the max value
in the calculation.It will be capped at max value to ensure the
correct value being written into the register.

Example of the existing bug is when calculated div = 16. After and
with the mask, the value written to register is actually 0 (register
field for baudrate divisor). With this fix, the value written is now
15 which is max value for baudrate divisor.

Signed-off-by: Chin Liang See <clsee@altera.com>
Cc: Marek Vasut <marex@denx.de>
Cc: Jagan Teki <jteki@openedev.com>
Cc: Dinh Nguyen <dinguyen@altera.com>
drivers/spi/cadence_qspi_apb.c

index 1a35d558a6df0c76eaf96d57e3217cbdaf294a30..1d68379c93691983e5e505084f99ee8c4512a7d0 100644 (file)
@@ -293,8 +293,11 @@ void cadence_qspi_apb_config_baudrate_div(void *reg_base,
        debug("%s: ref_clk %dHz sclk %dHz Div 0x%x\n", __func__,
              ref_clk_hz, sclk_hz, div);
 
-       div = (div & CQSPI_REG_CONFIG_BAUD_MASK) << CQSPI_REG_CONFIG_BAUD_LSB;
-       reg |= div;
+       /* ensure the baud rate doesn't exceed the max value */
+       if (div > CQSPI_REG_CONFIG_BAUD_MASK)
+               div = CQSPI_REG_CONFIG_BAUD_MASK;
+
+       reg |= (div << CQSPI_REG_CONFIG_BAUD_LSB);
        writel(reg, reg_base + CQSPI_REG_CONFIG);
 
        cadence_qspi_apb_controller_enable(reg_base);