Hi Christophe

On 7/31/20 9:53 AM, Christophe Kerello wrote:
> This patch uses clrsetbits_le32 function instead of multiple instructions.
>
> Signed-off-by: Christophe Kerello <christophe.kere...@st.com>
> ---
>
>  drivers/mtd/nand/raw/stm32_fmc2_nand.c | 56 
> +++++++++++++---------------------
>  1 file changed, 21 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/mtd/nand/raw/stm32_fmc2_nand.c 
> b/drivers/mtd/nand/raw/stm32_fmc2_nand.c
> index eba1ded..1e4d757 100644
> --- a/drivers/mtd/nand/raw/stm32_fmc2_nand.c
> +++ b/drivers/mtd/nand/raw/stm32_fmc2_nand.c
> @@ -178,40 +178,37 @@ static void stm32_fmc2_nfc_timings_init(struct 
> nand_chip *chip)
>       struct stm32_fmc2_nfc *nfc = to_stm32_nfc(chip->controller);
>       struct stm32_fmc2_nand *nand = to_fmc2_nand(chip);
>       struct stm32_fmc2_timings *timings = &nand->timings;
> -     u32 pcr = readl(nfc->io_base + FMC2_PCR);
>       u32 pmem, patt;
>  
>       /* Set tclr/tar timings */
> -     pcr &= ~FMC2_PCR_TCLR;
> -     pcr |= FIELD_PREP(FMC2_PCR_TCLR, timings->tclr);
> -     pcr &= ~FMC2_PCR_TAR;
> -     pcr |= FIELD_PREP(FMC2_PCR_TAR, timings->tar);
> +     clrsetbits_le32(nfc->io_base + FMC2_PCR,
> +                     FMC2_PCR_TCLR | FMC2_PCR_TAR,
> +                     FIELD_PREP(FMC2_PCR_TCLR, timings->tclr) |
> +                     FIELD_PREP(FMC2_PCR_TAR, timings->tar));
>  
>       /* Set tset/twait/thold/thiz timings in common bank */
>       pmem = FIELD_PREP(FMC2_PMEM_MEMSET, timings->tset_mem);
>       pmem |= FIELD_PREP(FMC2_PMEM_MEMWAIT, timings->twait);
>       pmem |= FIELD_PREP(FMC2_PMEM_MEMHOLD, timings->thold_mem);
>       pmem |= FIELD_PREP(FMC2_PMEM_MEMHIZ, timings->thiz);
> +     writel(pmem, nfc->io_base + FMC2_PMEM);
>  
>       /* Set tset/twait/thold/thiz timings in attribut bank */
>       patt = FIELD_PREP(FMC2_PATT_ATTSET, timings->tset_att);
>       patt |= FIELD_PREP(FMC2_PATT_ATTWAIT, timings->twait);
>       patt |= FIELD_PREP(FMC2_PATT_ATTHOLD, timings->thold_att);
>       patt |= FIELD_PREP(FMC2_PATT_ATTHIZ, timings->thiz);
> -
> -     writel(pcr, nfc->io_base + FMC2_PCR);
> -     writel(pmem, nfc->io_base + FMC2_PMEM);
>       writel(patt, nfc->io_base + FMC2_PATT);
>  }
>  
>  static void stm32_fmc2_nfc_setup(struct nand_chip *chip)
>  {
>       struct stm32_fmc2_nfc *nfc = to_stm32_nfc(chip->controller);
> -     u32 pcr = readl(nfc->io_base + FMC2_PCR);
> +     u32 pcr = 0, pcr_mask;
>  
>       /* Configure ECC algorithm (default configuration is Hamming) */
> -     pcr &= ~FMC2_PCR_ECCALG;
> -     pcr &= ~FMC2_PCR_BCHECC;
> +     pcr_mask = FMC2_PCR_ECCALG;
> +     pcr_mask |= FMC2_PCR_BCHECC;
>       if (chip->ecc.strength == FMC2_ECC_BCH8) {
>               pcr |= FMC2_PCR_ECCALG;
>               pcr |= FMC2_PCR_BCHECC;
> @@ -220,15 +217,15 @@ static void stm32_fmc2_nfc_setup(struct nand_chip *chip)
>       }
>  
>       /* Set buswidth */
> -     pcr &= ~FMC2_PCR_PWID;
> +     pcr_mask |= FMC2_PCR_PWID;
>       if (chip->options & NAND_BUSWIDTH_16)
>               pcr |= FIELD_PREP(FMC2_PCR_PWID, FMC2_PCR_PWID_BUSWIDTH_16);
>  
>       /* Set ECC sector size */
> -     pcr &= ~FMC2_PCR_ECCSS;
> +     pcr_mask |= FMC2_PCR_ECCSS;
>       pcr |= FIELD_PREP(FMC2_PCR_ECCSS, FMC2_PCR_ECCSS_512);
>  
> -     writel(pcr, nfc->io_base + FMC2_PCR);
> +     clrsetbits_le32(nfc->io_base + FMC2_PCR, pcr_mask, pcr);
>  }
>  
>  static void stm32_fmc2_nfc_select_chip(struct mtd_info *mtd, int chipnr)
> @@ -254,22 +251,18 @@ static void stm32_fmc2_nfc_select_chip(struct mtd_info 
> *mtd, int chipnr)
>  static void stm32_fmc2_nfc_set_buswidth_16(struct stm32_fmc2_nfc *nfc,
>                                          bool set)
>  {
> -     u32 pcr = readl(nfc->io_base + FMC2_PCR);
> +     u32 pcr;
>  
> -     pcr &= ~FMC2_PCR_PWID;
> -     if (set)
> -             pcr |= FIELD_PREP(FMC2_PCR_PWID, FMC2_PCR_PWID_BUSWIDTH_16);
> -     writel(pcr, nfc->io_base + FMC2_PCR);
> +     pcr = set ? FIELD_PREP(FMC2_PCR_PWID, FMC2_PCR_PWID_BUSWIDTH_16) :
> +                 FIELD_PREP(FMC2_PCR_PWID, FMC2_PCR_PWID_BUSWIDTH_8);
> +
> +     clrsetbits_le32(nfc->io_base + FMC2_PCR, FMC2_PCR_PWID, pcr);
>  }
>  
>  static void stm32_fmc2_nfc_set_ecc(struct stm32_fmc2_nfc *nfc, bool enable)
>  {
> -     u32 pcr = readl(nfc->io_base + FMC2_PCR);
> -
> -     pcr &= ~FMC2_PCR_ECCEN;
> -     if (enable)
> -             pcr |= FMC2_PCR_ECCEN;
> -     writel(pcr, nfc->io_base + FMC2_PCR);
> +     clrsetbits_le32(nfc->io_base + FMC2_PCR, FMC2_PCR_ECCEN,
> +                     enable ? FMC2_PCR_ECCEN : 0);
>  }
>  
>  static void stm32_fmc2_nfc_clear_bch_irq(struct stm32_fmc2_nfc *nfc)
> @@ -306,13 +299,8 @@ static void stm32_fmc2_nfc_hwctl(struct mtd_info *mtd, 
> int mode)
>       stm32_fmc2_nfc_set_ecc(nfc, false);
>  
>       if (chip->ecc.strength != FMC2_ECC_HAM) {
> -             u32 pcr = readl(nfc->io_base + FMC2_PCR);
> -
> -             if (mode == NAND_ECC_WRITE)
> -                     pcr |= FMC2_PCR_WEN;
> -             else
> -                     pcr &= ~FMC2_PCR_WEN;
> -             writel(pcr, nfc->io_base + FMC2_PCR);
> +             clrsetbits_le32(nfc->io_base + FMC2_PCR, FMC2_PCR_WEN,
> +                             mode == NAND_ECC_WRITE ? FMC2_PCR_WEN : 0);
>  
>               stm32_fmc2_nfc_clear_bch_irq(nfc);
>       }
> @@ -563,7 +551,6 @@ static int stm32_fmc2_nfc_read_page(struct mtd_info *mtd,
>  static void stm32_fmc2_nfc_init(struct stm32_fmc2_nfc *nfc)
>  {
>       u32 pcr = readl(nfc->io_base + FMC2_PCR);
> -     u32 bcr1 = readl(nfc->io_base + FMC2_BCR1);
>  
>       /* Set CS used to undefined */
>       nfc->cs_sel = -1;
> @@ -594,9 +581,8 @@ static void stm32_fmc2_nfc_init(struct stm32_fmc2_nfc 
> *nfc)
>       pcr |= FIELD_PREP(FMC2_PCR_TAR, FMC2_PCR_TAR_DEFAULT);
>  
>       /* Enable FMC2 controller */
> -     bcr1 |= FMC2_BCR1_FMC2EN;
> +     setbits_le32(nfc->io_base + FMC2_BCR1, FMC2_BCR1_FMC2EN);
>  
> -     writel(bcr1, nfc->io_base + FMC2_BCR1);
>       writel(pcr, nfc->io_base + FMC2_PCR);
>       writel(FMC2_PMEM_DEFAULT, nfc->io_base + FMC2_PMEM);
>       writel(FMC2_PATT_DEFAULT, nfc->io_base + FMC2_PATT);

Reviewed-by: Patrice Chotard <patrice.chot...@st.com>

Thanks

Patrice

Reply via email to