[PATCH v1 2/2] spi: sunxi: Add support for R329/D1/R528/T113 SPI controller
Andre Przywara
andre.przywara at arm.com
Tue Dec 12 18:39:36 CET 2023
On Sat, 11 Nov 2023 16:33:08 +0300
Maksim Kiselev <bigunclemax at gmail.com> wrote:
Hi Maksim,
thanks for sending this!
> These SoCs have two SPI controllers that are quite similar to the SPI
> on previous Allwinner SoCs. The main difference is that new SoCs
> don't have a clock divider (SPI_CCR register) inside SPI IP.
>
> Instead SPI sample mode should be configured depending on the input clock.
>
> For now SPI input clock source selection is not supported by this driver,
> and only HOSC at 24MHz can be used as input clock. Therefore, according to
> the, manual we could change the SPI sample mode from delay half
> cycle(default) to normal.
>
> This patch adds a quirk for this kind of SPI controllers
>
> Signed-off-by: Maksim Kiselev <bigunclemax at gmail.com>
> Tested-by: Sam Edwards <CFSworks at gmail.com>
Compared against the Linux driver:
Reviewed-by: Andre Przywara <andre.przywara at arm.com>
Thanks,
Andre
> ---
> drivers/spi/spi-sunxi.c | 34 +++++++++++++++++++++++++++++++++-
> 1 file changed, 33 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/spi/spi-sunxi.c b/drivers/spi/spi-sunxi.c
> index c56d82d998..9ec6b359e2 100644
> --- a/drivers/spi/spi-sunxi.c
> +++ b/drivers/spi/spi-sunxi.c
> @@ -117,6 +117,8 @@ enum sun4i_spi_bits {
> SPI_TCR_XCH,
> SPI_TCR_CS_MANUAL,
> SPI_TCR_CS_LEVEL,
> + SPI_TCR_SDC,
> + SPI_TCR_SDM,
> SPI_FCR_TF_RST,
> SPI_FCR_RF_RST,
> SPI_FSR_RF_CNT_MASK,
> @@ -128,6 +130,7 @@ struct sun4i_spi_variant {
> u32 fifo_depth;
> bool has_soft_reset;
> bool has_burst_ctl;
> + bool has_clk_ctl;
> };
>
> struct sun4i_spi_plat {
> @@ -302,7 +305,19 @@ static int sun4i_spi_claim_bus(struct udevice *dev)
> setbits_le32(SPI_REG(priv, SPI_TCR), SPI_BIT(priv, SPI_TCR_CS_MANUAL) |
> SPI_BIT(priv, SPI_TCR_CS_ACTIVE_LOW));
>
> - sun4i_spi_set_speed_mode(dev->parent);
> + if (priv->variant->has_clk_ctl) {
> + sun4i_spi_set_speed_mode(dev->parent);
> + } else {
> + /*
> + * At this moment there is no ability to change input clock.
> + * Therefore, we can only use default HOSC at 24MHz clock and
> + * set SPI sampling mode to normal
> + */
> + clrsetbits_le32(SPI_REG(priv, SPI_TCR),
> + SPI_BIT(priv, SPI_TCR_SDC) |
> + SPI_BIT(priv, SPI_TCR_SDM),
> + SPI_BIT(priv, SPI_TCR_SDM));
> + }
>
> return 0;
> }
> @@ -516,6 +531,8 @@ static const u32 sun6i_spi_bits[] = {
> [SPI_TCR_CS_MASK] = 0x30,
> [SPI_TCR_CS_MANUAL] = BIT(6),
> [SPI_TCR_CS_LEVEL] = BIT(7),
> + [SPI_TCR_SDC] = BIT(11),
> + [SPI_TCR_SDM] = BIT(13),
> [SPI_TCR_XCH] = BIT(31),
> [SPI_FCR_RF_RST] = BIT(15),
> [SPI_FCR_TF_RST] = BIT(31),
> @@ -526,6 +543,7 @@ static const struct sun4i_spi_variant sun4i_a10_spi_variant = {
> .regs = sun4i_spi_regs,
> .bits = sun4i_spi_bits,
> .fifo_depth = 64,
> + .has_clk_ctl = true,
> };
>
> static const struct sun4i_spi_variant sun6i_a31_spi_variant = {
> @@ -534,6 +552,7 @@ static const struct sun4i_spi_variant sun6i_a31_spi_variant = {
> .fifo_depth = 128,
> .has_soft_reset = true,
> .has_burst_ctl = true,
> + .has_clk_ctl = true,
> };
>
> static const struct sun4i_spi_variant sun8i_h3_spi_variant = {
> @@ -542,6 +561,15 @@ static const struct sun4i_spi_variant sun8i_h3_spi_variant = {
> .fifo_depth = 64,
> .has_soft_reset = true,
> .has_burst_ctl = true,
> + .has_clk_ctl = true,
> +};
> +
> +static const struct sun4i_spi_variant sun50i_r329_spi_variant = {
> + .regs = sun6i_spi_regs,
> + .bits = sun6i_spi_bits,
> + .fifo_depth = 64,
> + .has_soft_reset = true,
> + .has_burst_ctl = true,
> };
>
> static const struct udevice_id sun4i_spi_ids[] = {
> @@ -557,6 +585,10 @@ static const struct udevice_id sun4i_spi_ids[] = {
> .compatible = "allwinner,sun8i-h3-spi",
> .data = (ulong)&sun8i_h3_spi_variant,
> },
> + {
> + .compatible = "allwinner,sun50i-r329-spi",
> + .data = (ulong)&sun50i_r329_spi_variant,
> + },
> { /* sentinel */ }
> };
>
More information about the U-Boot
mailing list