[U-Boot] [PATCH v1 15/19] spi: mvebu_a3700_spi: Use Armada 37xx clk driver for SPI clock frequency
Stefan Roese
sr at denx.de
Wed Mar 21 09:37:33 UTC 2018
Please add Jagan (on Cc) to Cc for SPI driver related changes.
Please find some comments below...
On 07.03.2018 22:52, Marek BehĂșn wrote:
> Since now we have driver for clocks on Armada 37xx, use it to determine
> SQF clock frequency for the SPI driver.
>
> Also change the default config files for Armada 37xx devices so that
> the clock driver is enabled by default, otherwise the SPI driver cannot
> be enabled.
>
> Signed-off-by: Marek Behun <marek.behun at nic.cz>
> ---
> arch/arm/dts/armada-37xx.dtsi | 4 +--
> configs/mvebu_db-88f3720_defconfig | 3 ++
> configs/mvebu_espressobin-88f3720_defconfig | 3 ++
> drivers/spi/Kconfig | 1 +
> drivers/spi/mvebu_a3700_spi.c | 52 ++++++++++++++++-------------
> 5 files changed, 37 insertions(+), 26 deletions(-)
>
> diff --git a/arch/arm/dts/armada-37xx.dtsi b/arch/arm/dts/armada-37xx.dtsi
> index e848812fca..c254c0aded 100644
> --- a/arch/arm/dts/armada-37xx.dtsi
> +++ b/arch/arm/dts/armada-37xx.dtsi
> @@ -281,8 +281,8 @@
> #address-cells = <1>;
> #size-cells = <0>;
> #clock-cells = <0>;
> - clock-frequency = <160000>;
> - spi-max-frequency = <40000>;
> + spi-max-frequency = <50000000>;
> + clocks = <&nb_periph_clk 7>;
> status = "disabled";
> };
>
> diff --git a/configs/mvebu_db-88f3720_defconfig b/configs/mvebu_db-88f3720_defconfig
> index 338d764d84..c8ca06e428 100644
> --- a/configs/mvebu_db-88f3720_defconfig
> +++ b/configs/mvebu_db-88f3720_defconfig
> @@ -33,6 +33,9 @@ CONFIG_DM_GPIO=y
> # CONFIG_MVEBU_GPIO is not set
> CONFIG_DM_I2C=y
> CONFIG_MISC=y
> +CONFIG_CLK=y
> +CONFIG_CLK_MVEBU=y
> +CONFIG_CLK_ARMADA_3720=y
> CONFIG_DM_MMC=y
> CONFIG_MMC_SDHCI=y
> CONFIG_MMC_SDHCI_SDMA=y
> diff --git a/configs/mvebu_espressobin-88f3720_defconfig b/configs/mvebu_espressobin-88f3720_defconfig
> index 28005e6131..5f449d34ea 100644
> --- a/configs/mvebu_espressobin-88f3720_defconfig
> +++ b/configs/mvebu_espressobin-88f3720_defconfig
> @@ -30,6 +30,9 @@ CONFIG_SCSI_AHCI=y
> CONFIG_BLOCK_CACHE=y
> CONFIG_DM_I2C=y
> CONFIG_MISC=y
> +CONFIG_CLK=y
> +CONFIG_CLK_MVEBU=y
> +CONFIG_CLK_ARMADA_3720=y
> CONFIG_DM_MMC=y
> CONFIG_MMC_SDHCI=y
> CONFIG_MMC_SDHCI_SDMA=y
> diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
> index 235a8c7d73..4ea94a5f35 100644
> --- a/drivers/spi/Kconfig
> +++ b/drivers/spi/Kconfig
> @@ -94,6 +94,7 @@ config ICH_SPI
>
> config MVEBU_A3700_SPI
> bool "Marvell Armada 3700 SPI driver"
> + depends on CLK_ARMADA_3720
Wouldn't it be easier to "select" CLK_ARMADA_3720 here instead? No
changes to the config files necessary this way.
> help
> Enable the Marvell Armada 3700 SPI driver. This driver can be
> used to access the SPI NOR flash on platforms embedding this
> diff --git a/drivers/spi/mvebu_a3700_spi.c b/drivers/spi/mvebu_a3700_spi.c
> index d1708a8d56..19e854945b 100644
> --- a/drivers/spi/mvebu_a3700_spi.c
> +++ b/drivers/spi/mvebu_a3700_spi.c
> @@ -10,6 +10,7 @@
> #include <dm.h>
> #include <malloc.h>
> #include <spi.h>
> +#include <clk.h>
> #include <wait_bit.h>
> #include <asm/io.h>
>
> @@ -22,9 +23,8 @@ DECLARE_GLOBAL_DATA_PTR;
> #define MVEBU_SPI_A3700_CLK_POL BIT(7)
> #define MVEBU_SPI_A3700_FIFO_EN BIT(17)
> #define MVEBU_SPI_A3700_SPI_EN_0 BIT(16)
> -#define MVEBU_SPI_A3700_CLK_PRESCALE_BIT 0
> -#define MVEBU_SPI_A3700_CLK_PRESCALE_MASK \
> - (0x1f << MVEBU_SPI_A3700_CLK_PRESCALE_BIT)
> +#define MVEBU_SPI_A3700_CLK_PRESCALE_MASK 0x1f
> +
>
> /* SPI registers */
> struct spi_reg {
> @@ -36,8 +36,7 @@ struct spi_reg {
>
> struct mvebu_spi_platdata {
> struct spi_reg *spireg;
> - unsigned int frequency;
> - unsigned int clock;
> + struct clk clk;
> };
>
> static void spi_cs_activate(struct spi_reg *reg, int cs)
> @@ -178,17 +177,18 @@ static int mvebu_spi_set_speed(struct udevice *bus, uint hz)
> {
> struct mvebu_spi_platdata *plat = dev_get_platdata(bus);
> struct spi_reg *reg = plat->spireg;
> - u32 data;
> + u32 data, prescale;
>
> data = readl(®->cfg);
>
> - /* Set Prescaler */
> - data &= ~MVEBU_SPI_A3700_CLK_PRESCALE_MASK;
> + prescale = DIV_ROUND_UP(clk_get_rate(&plat->clk), hz);
> + if (prescale > 31)
> + prescale = 0x1f;
> + else if (prescale > 15)
> + prescale = 0x10 + (prescale + 1)/2;
checkpatch will most likely complain about missing space in the line
above.
>
> - /* Calculate Prescaler = (spi_input_freq / spi_max_freq) */
> - if (hz > plat->frequency)
> - hz = plat->frequency;
> - data |= plat->clock / hz;
> + data &= ~MVEBU_SPI_A3700_CLK_PRESCALE_MASK;
> + data |= prescale & MVEBU_SPI_A3700_CLK_PRESCALE_MASK;
Perhaps its better to check on "prescale > MVEBU_SPI_A3700_CLK_PRESCALE_MASK"
instead of silently removing the potential additional bits.
Thanks,
Stefan
More information about the U-Boot
mailing list