MIPS: BCM47XX: Get rid of calls to KSEG1ADDR
authorRafał Miłecki <zajec5@gmail.com>
Wed, 3 Sep 2014 20:51:06 +0000 (22:51 +0200)
committerRalf Baechle <ralf@linux-mips.org>
Mon, 24 Nov 2014 06:44:59 +0000 (07:44 +0100)
We should be using ioremap_nocache helper which handles remaps in a
smarter way.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Cc: linux-mips@linux-mips.org
Cc: Hauke Mehrtens <hauke@hauke-m.de>
Patchwork: http://patchwork.linux-mips.org/patch/7611/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/bcm47xx/nvram.c

index 2bed73a684aea021b4a296076880fed6a2ec489b..e07976bbb7396a69d75fa51eb516e9f584cd3ce7 100644 (file)
 static char nvram_buf[NVRAM_SPACE];
 static const u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000};
 
-static u32 find_nvram_size(u32 end)
+static u32 find_nvram_size(void __iomem *end)
 {
-       struct nvram_header *header;
+       struct nvram_header __iomem *header;
        int i;
 
        for (i = 0; i < ARRAY_SIZE(nvram_sizes); i++) {
-               header = (struct nvram_header *)KSEG1ADDR(end - nvram_sizes[i]);
+               header = (struct nvram_header *)(end - nvram_sizes[i]);
                if (header->magic == NVRAM_HEADER)
                        return nvram_sizes[i];
        }
@@ -38,35 +38,39 @@ static u32 find_nvram_size(u32 end)
 }
 
 /* Probe for NVRAM header */
-static int nvram_find_and_copy(u32 base, u32 lim)
+static int nvram_find_and_copy(void __iomem *iobase, u32 lim)
 {
-       struct nvram_header *header;
+       struct nvram_header __iomem *header;
        int i;
        u32 off;
        u32 *src, *dst;
        u32 size;
 
+       if (nvram_buf[0]) {
+               pr_warn("nvram already initialized\n");
+               return -EEXIST;
+       }
+
        /* TODO: when nvram is on nand flash check for bad blocks first. */
        off = FLASH_MIN;
        while (off <= lim) {
                /* Windowed flash access */
-               size = find_nvram_size(base + off);
+               size = find_nvram_size(iobase + off);
                if (size) {
-                       header = (struct nvram_header *)KSEG1ADDR(base + off -
-                                                                 size);
+                       header = (struct nvram_header *)(iobase + off - size);
                        goto found;
                }
                off <<= 1;
        }
 
        /* Try embedded NVRAM at 4 KB and 1 KB as last resorts */
-       header = (struct nvram_header *) KSEG1ADDR(base + 4096);
+       header = (struct nvram_header *)(iobase + 4096);
        if (header->magic == NVRAM_HEADER) {
                size = NVRAM_SPACE;
                goto found;
        }
 
-       header = (struct nvram_header *) KSEG1ADDR(base + 1024);
+       header = (struct nvram_header *)(iobase + 1024);
        if (header->magic == NVRAM_HEADER) {
                size = NVRAM_SPACE;
                goto found;
@@ -94,6 +98,22 @@ found:
        return 0;
 }
 
+static int bcm47xx_nvram_init_from_mem(u32 base, u32 lim)
+{
+       void __iomem *iobase;
+       int err;
+
+       iobase = ioremap_nocache(base, lim);
+       if (!iobase)
+               return -ENOMEM;
+
+       err = nvram_find_and_copy(iobase, lim);
+
+       iounmap(iobase);
+
+       return err;
+}
+
 #ifdef CONFIG_BCM47XX_SSB
 static int nvram_init_ssb(void)
 {
@@ -109,7 +129,7 @@ static int nvram_init_ssb(void)
                return -ENXIO;
        }
 
-       return nvram_find_and_copy(base, lim);
+       return bcm47xx_nvram_init_from_mem(base, lim);
 }
 #endif
 
@@ -139,7 +159,7 @@ static int nvram_init_bcma(void)
                return -ENXIO;
        }
 
-       return nvram_find_and_copy(base, lim);
+       return bcm47xx_nvram_init_from_mem(base, lim);
 }
 #endif