[PATCH linux dev-4.7 2/8] mtd: spi-nor: aspeed: improve 4 bytes mode

Joel Stanley joel at jms.id.au
Mon Nov 7 13:24:52 AEDT 2016


On Sat, Nov 5, 2016 at 3:30 AM, Cédric Le Goater <clg at kaod.org> wrote:
> The AST2400 SPI flash uses the CE0 control register to set 4Byte mode
> and the AST2500 FMC and AST2400 FMC flash controllers use the CE
> Control register for this purpose or they are strapped by hardware.
>
> Currently, the setting of the CE0 control register is done for all,
> which is incorrect, so fix that to keep only the AST2400 SPI. Luckily,
> the bogus setting has no impact on operations as bit 13 defines a SPI
> clock divisor.
>
> Signed-off-by: Cédric Le Goater <clg at kaod.org>
> ---
>  drivers/mtd/spi-nor/aspeed-smc.c | 51 +++++++++++++++++++++++-----------------
>  1 file changed, 29 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/mtd/spi-nor/aspeed-smc.c b/drivers/mtd/spi-nor/aspeed-smc.c
> index 75ba73ef0660..763f3c604140 100644
> --- a/drivers/mtd/spi-nor/aspeed-smc.c
> +++ b/drivers/mtd/spi-nor/aspeed-smc.c
> @@ -751,6 +751,33 @@ static void aspeed_smc_chip_set_type(struct aspeed_smc_chip *chip, int type)
>         writel(reg, controller->regs + CONFIG_REG);
>  }
>
> +static void aspeed_smc_chip_set_4b(struct aspeed_smc_chip *chip)
> +{
> +       struct aspeed_smc_controller *controller = chip->controller;
> +       u32 reg;
> +
> +       /*
> +        * The AST2400 SPI flash controller does not have a CE Control
> +        * register. It uses the CE0 control register to set 4Byte
> +        * mode at the controller level.
> +        */
> +       if (chip->controller->info == &smc_2400_info) {

Should we add a callback that calls either a ast2400 or ast2500
version of aspeed_smc_chip_set_4b instead of this method?

Cheers,

Joel

> +               chip->ctl_val[smc_base] |= CONTROL_SPI_IO_ADDRESS_4B;
> +               chip->ctl_val[smc_read] |= CONTROL_SPI_IO_ADDRESS_4B;
> +       }
> +
> +       /*
> +        * The AST2500 FMC and AST2400 FMC flash controllers should be
> +        * strapped by hardware, or autodetected, but the AST2500 SPI
> +        * flash needs to be set.
> +        */
> +       if (chip->controller->info == &smc_2500_info) {
> +               reg = readl(controller->regs + CE_CONTROL_REG);
> +               reg |= 1 << chip->cs;
> +               writel(reg, controller->regs + CE_CONTROL_REG);
> +       }
> +}
> +
>  static int aspeed_smc_chip_setup_init(struct aspeed_smc_chip *chip,
>                                       struct resource *r)
>  {
> @@ -814,28 +841,8 @@ static int aspeed_smc_chip_setup_init(struct aspeed_smc_chip *chip,
>
>  static void aspeed_smc_chip_setup_finish(struct aspeed_smc_chip *chip)
>  {
> -       struct aspeed_smc_controller *controller = chip->controller;
> -       u32 reg;
> -
> -       /*
> -        * Set 4 byte mode in the chip controller register and also in
> -        * controller config register. The BMC flash controller is
> -        * strapped by hardware, or autodetected, but the SPI flash
> -        * controller of the AST2500 still needs to be set.
> -        */
> -       if (chip->nor.mtd.size > SZ_16M) {
> -               chip->ctl_val[smc_base] |= CONTROL_SPI_IO_ADDRESS_4B;
> -
> -               /*
> -                * The SPI flash controller of the AST2400 does not
> -                * have such a setting.
> -                */
> -               if (chip->controller->info == &smc_2500_info) {
> -                       reg = readl(controller->regs + CE_CONTROL_REG);
> -                       reg |= 1 << chip->cs;
> -                       writel(reg, controller->regs + CE_CONTROL_REG);
> -               }
> -       }
> +       if (chip->nor.mtd.size > SZ_16M)
> +               aspeed_smc_chip_set_4b(chip);
>
>         chip->ctl_val[smc_write] = chip->ctl_val[smc_base] |
>                 spi_control_fill_opcode(chip->nor.program_opcode) |
> --
> 2.7.4
>


More information about the openbmc mailing list