net: lpc-enet: factor out iram access
authorArnd Bergmann <arnd@arndb.de>
Fri, 9 Aug 2019 14:40:32 +0000 (16:40 +0200)
committerArnd Bergmann <arnd@arndb.de>
Thu, 15 Aug 2019 19:33:49 +0000 (21:33 +0200)
The lpc_eth driver uses a platform specific method to find
the internal sram. This prevents building it on other machines.

Rework to only use one function call and keep the other platform
internals where they belong. Ideally this would look up the
sram location from DT, but as this is a rarely used driver,
I want to keep the modifications to a minimum.

Link: https://lore.kernel.org/r/20190809144043.476786-7-arnd@arndb.de
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
arch/arm/mach-lpc32xx/common.c
arch/arm/mach-lpc32xx/common.h
arch/arm/mach-lpc32xx/include/mach/board.h [deleted file]
drivers/net/ethernet/nxp/lpc_eth.c
include/linux/soc/nxp/lpc32xx-misc.h [new file with mode: 0644]

index 5b71b4fab2cd94dbe373568f8d33210b44af8cc7..f648324d5fb4b5d2c7d55d6271f3628c26577f2b 100644 (file)
@@ -8,6 +8,7 @@
  */
 
 #include <linux/init.h>
+#include <linux/soc/nxp/lpc32xx-misc.h>
 
 #include <asm/mach/map.h>
 #include <asm/system_info.h>
@@ -32,7 +33,7 @@ void lpc32xx_get_uid(u32 devid[4])
  */
 #define LPC32XX_IRAM_BANK_SIZE SZ_128K
 static u32 iram_size;
-u32 lpc32xx_return_iram_size(void)
+u32 lpc32xx_return_iram(void __iomem **mapbase, dma_addr_t *dmaaddr)
 {
        if (iram_size == 0) {
                u32 savedval1, savedval2;
@@ -53,10 +54,14 @@ u32 lpc32xx_return_iram_size(void)
                } else
                        iram_size = LPC32XX_IRAM_BANK_SIZE * 2;
        }
+       if (dmaaddr)
+               *dmaaddr = LPC32XX_IRAM_BASE;
+       if (mapbase)
+               *mapbase = io_p2v(LPC32XX_IRAM_BASE);
 
        return iram_size;
 }
-EXPORT_SYMBOL_GPL(lpc32xx_return_iram_size);
+EXPORT_SYMBOL_GPL(lpc32xx_return_iram);
 
 static struct map_desc lpc32xx_io_desc[] __initdata = {
        {
index 8e597ce48a730fe70d761824858c8f89f779b615..32f0ad2178077a9d3b225a92138efcd74bd83be5 100644 (file)
@@ -23,7 +23,6 @@ extern void __init lpc32xx_serial_init(void);
  */
 extern void lpc32xx_get_uid(u32 devid[4]);
 
-extern u32 lpc32xx_return_iram_size(void);
 /*
  * Pointers used for sizing and copying suspend function data
  */
diff --git a/arch/arm/mach-lpc32xx/include/mach/board.h b/arch/arm/mach-lpc32xx/include/mach/board.h
deleted file mode 100644 (file)
index 476513d..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-/*
- * arm/arch/mach-lpc32xx/include/mach/board.h
- *
- * Author: Kevin Wells <kevin.wells@nxp.com>
- *
- * Copyright (C) 2010 NXP Semiconductors
- */
-
-#ifndef __ASM_ARCH_BOARD_H
-#define __ASM_ARCH_BOARD_H
-
-extern u32 lpc32xx_return_iram_size(void);
-
-#endif  /* __ASM_ARCH_BOARD_H */
index f7e11f1b0426c1e553d36fe9b9f52a717e06304f..bcdd0adcfb0c69b6dbfb5a7b37d3ba3dc3e87004 100644 (file)
@@ -18,8 +18,8 @@
 #include <linux/phy.h>
 #include <linux/platform_device.h>
 #include <linux/spinlock.h>
+#include <linux/soc/nxp/lpc32xx-misc.h>
 
-#include <mach/board.h>
 #include <mach/hardware.h>
 #include <mach/platform.h>
 
@@ -1311,16 +1311,15 @@ static int lpc_eth_drv_probe(struct platform_device *pdev)
        /* Get size of DMA buffers/descriptors region */
        pldat->dma_buff_size = (ENET_TX_DESC + ENET_RX_DESC) * (ENET_MAXF_SIZE +
                sizeof(struct txrx_desc_t) + sizeof(struct rx_status_t));
-       pldat->dma_buff_base_v = 0;
 
        if (use_iram_for_net(dev)) {
-               dma_handle = LPC32XX_IRAM_BASE;
-               if (pldat->dma_buff_size <= lpc32xx_return_iram_size())
-                       pldat->dma_buff_base_v =
-                               io_p2v(LPC32XX_IRAM_BASE);
-               else
+               if (pldat->dma_buff_size >
+                   lpc32xx_return_iram(&pldat->dma_buff_base_v, &dma_handle)) {
+                       pldat->dma_buff_base_v = NULL;
+                       pldat->dma_buff_size = 0;
                        netdev_err(ndev,
                                "IRAM not big enough for net buffers, using SDRAM instead.\n");
+               }
        }
 
        if (pldat->dma_buff_base_v == 0) {
@@ -1409,7 +1408,7 @@ err_out_unregister_netdev:
        unregister_netdev(ndev);
 err_out_dma_unmap:
        if (!use_iram_for_net(dev) ||
-           pldat->dma_buff_size > lpc32xx_return_iram_size())
+           pldat->dma_buff_size > lpc32xx_return_iram(NULL, NULL))
                dma_free_coherent(dev, pldat->dma_buff_size,
                                  pldat->dma_buff_base_v,
                                  pldat->dma_buff_base_p);
@@ -1436,7 +1435,7 @@ static int lpc_eth_drv_remove(struct platform_device *pdev)
        unregister_netdev(ndev);
 
        if (!use_iram_for_net(&pldat->pdev->dev) ||
-           pldat->dma_buff_size > lpc32xx_return_iram_size())
+           pldat->dma_buff_size > lpc32xx_return_iram(NULL, NULL))
                dma_free_coherent(&pldat->pdev->dev, pldat->dma_buff_size,
                                  pldat->dma_buff_base_v,
                                  pldat->dma_buff_base_p);
diff --git a/include/linux/soc/nxp/lpc32xx-misc.h b/include/linux/soc/nxp/lpc32xx-misc.h
new file mode 100644 (file)
index 0000000..f232e1a
--- /dev/null
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Author: Kevin Wells <kevin.wells@nxp.com>
+ *
+ * Copyright (C) 2010 NXP Semiconductors
+ */
+
+#ifndef __SOC_LPC32XX_MISC_H
+#define __SOC_LPC32XX_MISC_H
+
+#include <linux/types.h>
+
+#ifdef CONFIG_ARCH_LPC32XX
+extern u32 lpc32xx_return_iram(void __iomem **mapbase, dma_addr_t *dmaaddr);
+#else
+static inline u32 lpc32xx_return_iram(void __iomem **mapbase, dma_addr_t *dmaaddr)
+{
+       *mapbase = NULL;
+       *dmaaddr = 0;
+       return 0;
+}
+#endif
+
+#endif  /* __SOC_LPC32XX_MISC_H */