Fix a cast to pointer from integer warning on ARM64

On 64bits platform, the casts done in {read,write}l() give that kind of
warnings:
drivers/mtd/nand/raw/sunxi_nand_spl.c: In function ‘check_value_inner’:
./arch/arm/include/asm/io.h:110:43: warning: cast to pointer from \
integer of different size [-Wint-to-pointer-cast]
  110 | #define __raw_readl(a) (*(volatile unsigned int *)(a))
      |                          ^
[...]
drivers/mtd/nand/raw/sunxi_nand_spl.c:81:27: note: in expansion of \
macro ‘readl’
   81 |                 int val = readl(offset) & expected_bits;

Introduce {read,write}l_nfc inline function to do the right cast and
push the base address (SUNXI_NFC_BASE) into those functions, making the
code more readable.

Signed-off-by: Richard Genoud <[email protected]>
---
 drivers/mtd/nand/raw/sunxi_nand_spl.c | 97 +++++++++++++++------------
 1 file changed, 53 insertions(+), 44 deletions(-)

diff --git a/drivers/mtd/nand/raw/sunxi_nand_spl.c 
b/drivers/mtd/nand/raw/sunxi_nand_spl.c
index 17e6031a9811..8f5057f2841b 100644
--- a/drivers/mtd/nand/raw/sunxi_nand_spl.c
+++ b/drivers/mtd/nand/raw/sunxi_nand_spl.c
@@ -80,11 +80,25 @@ __maybe_unused static const struct sunxi_nfc_caps 
sunxi_nfc_h616_caps = {
 
 #define DEFAULT_TIMEOUT_US     100000
 
+static inline u32 readl_nfc(u32 offset)
+{
+       void * __iomem base = (void *)(uintptr_t)SUNXI_NFC_BASE;
+
+       return readl(base + offset);
+}
+
+static inline u32 writel_nfc(u32 val, u32 offset)
+{
+       void * __iomem base = (void *)(uintptr_t)SUNXI_NFC_BASE;
+
+       return writel(val, base + offset);
+}
+
 static int check_value_inner(int offset, int expected_bits,
                             int timeout_us, int negation)
 {
        do {
-               int val = readl(offset) & expected_bits;
+               int val = readl_nfc(offset) & expected_bits;
                if (negation ? !val : val)
                        return 1;
                udelay(1);
@@ -107,8 +121,8 @@ static inline int check_value_negated(int offset, int 
unexpected_bits,
 
 static int nand_wait_cmd_fifo_empty(void)
 {
-       if (!check_value_negated(SUNXI_NFC_BASE + NFC_REG_ST,
-                                NFC_CMD_FIFO_STATUS, DEFAULT_TIMEOUT_US)) {
+       if (!check_value_negated(NFC_REG_ST, NFC_CMD_FIFO_STATUS,
+                                DEFAULT_TIMEOUT_US)) {
                printf("nand: timeout waiting for empty cmd FIFO\n");
                return -ETIMEDOUT;
        }
@@ -118,7 +132,7 @@ static int nand_wait_cmd_fifo_empty(void)
 
 static int nand_wait_int(void)
 {
-       if (!check_value(SUNXI_NFC_BASE + NFC_REG_ST, NFC_CMD_INT_FLAG,
+       if (!check_value(NFC_REG_ST, NFC_CMD_INT_FLAG,
                         DEFAULT_TIMEOUT_US)) {
                printf("nand: timeout waiting for interruption\n");
                return -ETIMEDOUT;
@@ -135,8 +149,8 @@ static int nand_exec_cmd(u32 cmd)
        if (ret)
                return ret;
 
-       writel(NFC_CMD_INT_FLAG, SUNXI_NFC_BASE + NFC_REG_ST);
-       writel(cmd, SUNXI_NFC_BASE + NFC_REG_CMD);
+       writel_nfc(NFC_CMD_INT_FLAG, NFC_REG_ST);
+       writel_nfc(cmd, NFC_REG_CMD);
 
        return nand_wait_int();
 }
@@ -147,15 +161,12 @@ void nand_init(void)
 
        board_nand_init();
 
-       val = readl(SUNXI_NFC_BASE + NFC_REG_CTL);
+       val = readl_nfc(NFC_REG_CTL);
        /* enable and reset CTL */
-       writel(val | NFC_EN | NFC_RESET,
-              SUNXI_NFC_BASE + NFC_REG_CTL);
+       writel_nfc(val | NFC_EN | NFC_RESET, NFC_REG_CTL);
 
-       if (!check_value_negated(SUNXI_NFC_BASE + NFC_REG_CTL,
-                                NFC_RESET, DEFAULT_TIMEOUT_US)) {
+       if (!check_value_negated(NFC_REG_CTL, NFC_RESET, DEFAULT_TIMEOUT_US))
                printf("Couldn't initialize nand\n");
-       }
 
        /* reset NAND */
        nand_exec_cmd(NFC_SEND_CMD1 | NFC_WAIT_FLAG | NAND_CMD_RESET);
@@ -167,24 +178,23 @@ static void nand_apply_config(const struct nfc_config 
*conf)
 
        nand_wait_cmd_fifo_empty();
 
-       val = readl(SUNXI_NFC_BASE + NFC_REG_CTL);
+       val = readl_nfc(NFC_REG_CTL);
        val &= ~NFC_PAGE_SHIFT_MSK;
-       writel(val | NFC_PAGE_SIZE(conf->page_size),
-              SUNXI_NFC_BASE + NFC_REG_CTL);
-       writel(conf->ecc_size, SUNXI_NFC_BASE + NFC_REG_CNT);
-       writel(conf->page_size, SUNXI_NFC_BASE + NFC_REG_SPARE_AREA(conf));
+       writel_nfc(val | NFC_PAGE_SIZE(conf->page_size), NFC_REG_CTL);
+       writel_nfc(conf->ecc_size, NFC_REG_CNT);
+       writel_nfc(conf->page_size, NFC_REG_SPARE_AREA(conf));
 }
 
 static int nand_load_page(const struct nfc_config *conf, u32 offs)
 {
        int page = offs / conf->page_size;
 
-       writel((NAND_CMD_RNDOUTSTART << NFC_RND_READ_CMD1_OFFSET) |
-              (NAND_CMD_RNDOUT << NFC_RND_READ_CMD0_OFFSET) |
-              (NAND_CMD_READSTART << NFC_READ_CMD_OFFSET),
-              SUNXI_NFC_BASE + NFC_REG_RCMD_SET);
-       writel(((page & 0xFFFF) << 16), SUNXI_NFC_BASE + NFC_REG_ADDR_LOW);
-       writel((page >> 16) & 0xFF, SUNXI_NFC_BASE + NFC_REG_ADDR_HIGH);
+       writel_nfc((NAND_CMD_RNDOUTSTART << NFC_RND_READ_CMD1_OFFSET) |
+                  (NAND_CMD_RNDOUT << NFC_RND_READ_CMD0_OFFSET) |
+                  (NAND_CMD_READSTART << NFC_READ_CMD_OFFSET),
+                  NFC_REG_RCMD_SET);
+       writel_nfc(((page & 0xFFFF) << 16), NFC_REG_ADDR_LOW);
+       writel_nfc((page >> 16) & 0xFF, NFC_REG_ADDR_HIGH);
 
        return nand_exec_cmd(NFC_SEND_CMD1 | NFC_SEND_CMD2 | NFC_NORMAL_OP |
                             NFC_SEND_ADR | NFC_WAIT_FLAG |
@@ -195,11 +205,11 @@ static int nand_change_column(u16 column)
 {
        int ret;
 
-       writel((NAND_CMD_RNDOUTSTART << NFC_RND_READ_CMD1_OFFSET) |
-              (NAND_CMD_RNDOUT << NFC_RND_READ_CMD0_OFFSET) |
-              (NAND_CMD_RNDOUTSTART << NFC_READ_CMD_OFFSET),
-              SUNXI_NFC_BASE + NFC_REG_RCMD_SET);
-       writel(column, SUNXI_NFC_BASE + NFC_REG_ADDR_LOW);
+       writel_nfc((NAND_CMD_RNDOUTSTART << NFC_RND_READ_CMD1_OFFSET) |
+                  (NAND_CMD_RNDOUT << NFC_RND_READ_CMD0_OFFSET) |
+                  (NAND_CMD_RNDOUTSTART << NFC_READ_CMD_OFFSET),
+                  NFC_REG_RCMD_SET);
+       writel_nfc(column, NFC_REG_ADDR_LOW);
 
        ret = nand_exec_cmd(NFC_SEND_CMD1 | NFC_SEND_CMD2 | NFC_NORMAL_OP |
                            (1 << NFC_ADR_NUM_OFFSET) | NFC_SEND_ADR |
@@ -226,7 +236,7 @@ static void sunxi_nfc_reset_user_data_len(const struct 
nfc_config *nfc)
                return;
 
        for (int i = 0; i < nfc->caps->max_ecc_steps; i += loop_step)
-               writel(0, SUNXI_NFC_BASE + NFC_REG_USER_DATA_LEN(nfc, i));
+               writel_nfc(0, NFC_REG_USER_DATA_LEN(nfc, i));
 }
 
 static void sunxi_nfc_set_user_data_len(const struct nfc_config *nfc,
@@ -252,11 +262,11 @@ static void sunxi_nfc_set_user_data_len(const struct 
nfc_config *nfc,
                return;
        }
 
-       val = readl(SUNXI_NFC_BASE + NFC_REG_USER_DATA_LEN(nfc, step));
+       val = readl_nfc(NFC_REG_USER_DATA_LEN(nfc, step));
 
        val &= ~NFC_USER_DATA_LEN_MSK(step);
        val |= field_prep(NFC_USER_DATA_LEN_MSK(step), i);
-       writel(val, SUNXI_NFC_BASE + NFC_REG_USER_DATA_LEN(nfc, step));
+       writel_nfc(val, NFC_REG_USER_DATA_LEN(nfc, step));
 }
 
 #if defined(CONFIG_MACH_SUN50I_H616) || defined(CONFIG_MACH_SUN50I_H6)
@@ -298,18 +308,18 @@ static int nand_read_page(const struct nfc_config *conf, 
u32 offs,
                        ecc512_bit = NFC_ECC_BLOCK_512;
 
                /* Clear ECC status and restart ECC engine */
-               writel(0, SUNXI_NFC_BASE + NFC_REG_ECC_ST);
+               writel_nfc(0, NFC_REG_ECC_ST);
 
-               writel(NFC_RANDOM_SEED(rand_seed) |
-                      NFC_ECC_MODE(conf, conf->ecc_strength) |
-                      (conf->randomize ? NFC_RANDOM_EN(conf) : 0) |
-                      ecc512_bit |
-                      NFC_ECC_EN | NFC_ECC_EXCEPTION,
-                      SUNXI_NFC_BASE + NFC_REG_ECC_CTL);
+               writel_nfc(NFC_RANDOM_SEED(rand_seed) |
+                          NFC_ECC_MODE(conf, conf->ecc_strength) |
+                          (conf->randomize ? NFC_RANDOM_EN(conf) : 0) |
+                          ecc512_bit |
+                          NFC_ECC_EN | NFC_ECC_EXCEPTION,
+                          NFC_REG_ECC_CTL);
 
                /* Move the data in SRAM */
                nand_change_column(data_off);
-               writel(conf->ecc_size, SUNXI_NFC_BASE + NFC_REG_CNT);
+               writel_nfc(conf->ecc_size, NFC_REG_CNT);
                nand_exec_cmd(NFC_DATA_TRANS);
 
                /*
@@ -323,7 +333,7 @@ static int nand_read_page(const struct nfc_config *conf, 
u32 offs,
 
                nand_exec_cmd(NFC_DATA_TRANS | NFC_ECC_OP);
                /* Get the ECC status */
-               ecc_st = readl(SUNXI_NFC_BASE + NFC_REG_ECC_ST);
+               ecc_st = readl_nfc(NFC_REG_ECC_ST);
 
                /* ECC error detected. */
                if (ecc_st & NFC_ECC_ERR_MSK(conf))
@@ -334,8 +344,7 @@ static int nand_read_page(const struct nfc_config *conf, 
u32 offs,
                 * (needed for configuration detection).
                 */
                if (!i) {
-                       pattern_found = readl(SUNXI_NFC_BASE +
-                                             conf->caps->reg_pat_found);
+                       pattern_found = readl_nfc(conf->caps->reg_pat_found);
                        pattern_found = field_get(NFC_ECC_PAT_FOUND_MSK(conf),
                                                  pattern_found);
                        if (pattern_found & NFC_ECC_PAT_FOUND(0))
@@ -348,8 +357,8 @@ static int nand_read_page(const struct nfc_config *conf, 
u32 offs,
                              conf->ecc_size);
 
                /* Stop the ECC engine */
-               writel(readl(SUNXI_NFC_BASE + NFC_REG_ECC_CTL) & ~NFC_ECC_EN,
-                      SUNXI_NFC_BASE + NFC_REG_ECC_CTL);
+               writel_nfc(readl_nfc(NFC_REG_ECC_CTL) & ~NFC_ECC_EN,
+                          NFC_REG_ECC_CTL);
 
                if (data_off + conf->ecc_size >= len)
                        break;

Reply via email to