Commit d64a1fd8 authored by Arnd Bergmann's avatar Arnd Bergmann

Merge branch 'lpc32xx/multiplatform' into arm/soc

I revisited some older patches here, getting two of the remaining
ARM platforms to build with ARCH_MULTIPLATFORM like most others do.

In case of lpc32xx, I created a new set of patches, which seemed
easier than digging out what I did for an older release many
years ago.

* lpc32xx/multiplatform:
  ARM: lpc32xx: allow multiplatform build
  ARM: lpc32xx: clean up header files
  serial: lpc32xx: allow compile testing
  net: lpc-enet: allow compile testing
  net: lpc-enet: fix printk format strings
  net: lpc-enet: fix badzero.cocci warnings
  net: lpc-enet: move phy setup into platform code
  net: lpc-enet: factor out iram access
  gpio: lpc32xx: allow building on non-lpc32xx targets
  serial: lpc32xx_hs: allow compile-testing
  watchdog: pnx4008_wdt: allow compile-testing
  usb: udc: lpc32xx: allow compile-testing
  usb: ohci-nxp: enable compile-testing
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parents 3584be9e 75bf1bd7
...@@ -424,21 +424,6 @@ config ARCH_DOVE ...@@ -424,21 +424,6 @@ config ARCH_DOVE
help help
Support for the Marvell Dove SoC 88AP510 Support for the Marvell Dove SoC 88AP510
config ARCH_LPC32XX
bool "NXP LPC32XX"
select ARM_AMBA
select CLKDEV_LOOKUP
select CLKSRC_LPC32XX
select COMMON_CLK
select CPU_ARM926T
select GENERIC_CLOCKEVENTS
select GENERIC_IRQ_MULTI_HANDLER
select GPIOLIB
select SPARSE_IRQ
select USE_OF
help
Support for the NXP LPC32XX family of processors
config ARCH_PXA config ARCH_PXA
bool "PXA2xx/PXA3xx-based" bool "PXA2xx/PXA3xx-based"
depends on MMU depends on MMU
...@@ -686,6 +671,8 @@ source "arch/arm/mach-ixp4xx/Kconfig" ...@@ -686,6 +671,8 @@ source "arch/arm/mach-ixp4xx/Kconfig"
source "arch/arm/mach-keystone/Kconfig" source "arch/arm/mach-keystone/Kconfig"
source "arch/arm/mach-lpc32xx/Kconfig"
source "arch/arm/mach-mediatek/Kconfig" source "arch/arm/mach-mediatek/Kconfig"
source "arch/arm/mach-meson/Kconfig" source "arch/arm/mach-meson/Kconfig"
......
...@@ -12,6 +12,7 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y ...@@ -12,6 +12,7 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SYSCTL_SYSCALL=y CONFIG_SYSCTL_SYSCALL=y
CONFIG_EMBEDDED=y CONFIG_EMBEDDED=y
CONFIG_SLAB=y CONFIG_SLAB=y
# CONFIG_ARCH_MULTI_V7 is not set
CONFIG_ARCH_LPC32XX=y CONFIG_ARCH_LPC32XX=y
CONFIG_AEABI=y CONFIG_AEABI=y
CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_TEXT=0x0
...@@ -93,6 +94,7 @@ CONFIG_SERIAL_HS_LPC32XX_CONSOLE=y ...@@ -93,6 +94,7 @@ CONFIG_SERIAL_HS_LPC32XX_CONSOLE=y
# CONFIG_HW_RANDOM is not set # CONFIG_HW_RANDOM is not set
CONFIG_I2C_CHARDEV=y CONFIG_I2C_CHARDEV=y
CONFIG_I2C_PNX=y CONFIG_I2C_PNX=y
CONFIG_GPIO_LPC32XX=y
CONFIG_SPI=y CONFIG_SPI=y
CONFIG_SPI_PL022=y CONFIG_SPI_PL022=y
CONFIG_GPIO_SYSFS=y CONFIG_GPIO_SYSFS=y
......
# SPDX-License-Identifier: GPL-2.0-only
config ARCH_LPC32XX
bool "NXP LPC32XX"
depends on ARCH_MULTI_V5
select ARM_AMBA
select CLKSRC_LPC32XX
select CPU_ARM926T
select GPIOLIB
help
Support for the NXP LPC32XX family of processors
...@@ -8,12 +8,12 @@ ...@@ -8,12 +8,12 @@
*/ */
#include <linux/init.h> #include <linux/init.h>
#include <linux/soc/nxp/lpc32xx-misc.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <asm/system_info.h> #include <asm/system_info.h>
#include <mach/hardware.h> #include "lpc32xx.h"
#include <mach/platform.h>
#include "common.h" #include "common.h"
/* /*
...@@ -32,7 +32,7 @@ void lpc32xx_get_uid(u32 devid[4]) ...@@ -32,7 +32,7 @@ void lpc32xx_get_uid(u32 devid[4])
*/ */
#define LPC32XX_IRAM_BANK_SIZE SZ_128K #define LPC32XX_IRAM_BANK_SIZE SZ_128K
static u32 iram_size; 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) { if (iram_size == 0) {
u32 savedval1, savedval2; u32 savedval1, savedval2;
...@@ -53,10 +53,26 @@ u32 lpc32xx_return_iram_size(void) ...@@ -53,10 +53,26 @@ u32 lpc32xx_return_iram_size(void)
} else } else
iram_size = LPC32XX_IRAM_BANK_SIZE * 2; iram_size = LPC32XX_IRAM_BANK_SIZE * 2;
} }
if (dmaaddr)
*dmaaddr = LPC32XX_IRAM_BASE;
if (mapbase)
*mapbase = io_p2v(LPC32XX_IRAM_BASE);
return iram_size; return iram_size;
} }
EXPORT_SYMBOL_GPL(lpc32xx_return_iram_size); EXPORT_SYMBOL_GPL(lpc32xx_return_iram);
void lpc32xx_set_phy_interface_mode(phy_interface_t mode)
{
u32 tmp = __raw_readl(LPC32XX_CLKPWR_MACCLK_CTRL);
tmp &= ~LPC32XX_CLKPWR_MACCTRL_PINS_MSK;
if (mode == PHY_INTERFACE_MODE_MII)
tmp |= LPC32XX_CLKPWR_MACCTRL_USE_MII_PINS;
else
tmp |= LPC32XX_CLKPWR_MACCTRL_USE_RMII_PINS;
__raw_writel(tmp, LPC32XX_CLKPWR_MACCLK_CTRL);
}
EXPORT_SYMBOL_GPL(lpc32xx_set_phy_interface_mode);
static struct map_desc lpc32xx_io_desc[] __initdata = { static struct map_desc lpc32xx_io_desc[] __initdata = {
{ {
......
...@@ -23,7 +23,6 @@ extern void __init lpc32xx_serial_init(void); ...@@ -23,7 +23,6 @@ extern void __init lpc32xx_serial_init(void);
*/ */
extern void lpc32xx_get_uid(u32 devid[4]); extern void lpc32xx_get_uid(u32 devid[4]);
extern u32 lpc32xx_return_iram_size(void);
/* /*
* Pointers used for sizing and copying suspend function data * Pointers used for sizing and copying suspend function data
*/ */
......
/* 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 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* arch/arm/mach-lpc32xx/include/mach/entry-macro.S
*
* Author: Kevin Wells <kevin.wells@nxp.com>
*
* Copyright (C) 2010 NXP Semiconductors
*/
#include <mach/hardware.h>
#include <mach/platform.h>
#define LPC32XX_INTC_MASKED_STATUS_OFS 0x8
.macro get_irqnr_preamble, base, tmp
ldr \base, =IO_ADDRESS(LPC32XX_MIC_BASE)
.endm
/*
* Return IRQ number in irqnr. Also return processor Z flag status in CPSR
* as set if an interrupt is pending.
*/
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
ldr \irqstat, [\base, #LPC32XX_INTC_MASKED_STATUS_OFS]
clz \irqnr, \irqstat
rsb \irqnr, \irqnr, #31
teq \irqstat, #0
.endm
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* arch/arm/mach-lpc32xx/include/mach/hardware.h
*
* Copyright (c) 2005 MontaVista Software, Inc. <source@mvista.com>
*/
#ifndef __ASM_ARCH_HARDWARE_H
#define __ASM_ARCH_HARDWARE_H
/*
* Start of virtual addresses for IO devices
*/
#define IO_BASE 0xF0000000
/*
* This macro relies on fact that for all HW i/o addresses bits 20-23 are 0
*/
#define IO_ADDRESS(x) IOMEM(((((x) & 0xff000000) >> 4) | ((x) & 0xfffff)) |\
IO_BASE)
#define io_p2v(x) ((void __iomem *) (unsigned long) IO_ADDRESS(x))
#define io_v2p(x) ((((x) & 0x0ff00000) << 4) | ((x) & 0x000fffff))
#endif
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* arch/arm/mach-lpc32xx/include/mach/uncompress.h
*
* Author: Kevin Wells <kevin.wells@nxp.com>
*
* Copyright (C) 2010 NXP Semiconductors
*/
#ifndef __ASM_ARM_ARCH_UNCOMPRESS_H
#define __ASM_ARM_ARCH_UNCOMPRESS_H
#include <linux/io.h>
#include <mach/hardware.h>
#include <mach/platform.h>
/*
* Uncompress output is hardcoded to standard UART 5
*/
#define UART_FIFO_CTL_TX_RESET (1 << 2)
#define UART_STATUS_TX_MT (1 << 6)
#define _UARTREG(x) (void __iomem *)(LPC32XX_UART5_BASE + (x))
#define LPC32XX_UART_DLLFIFO_O 0x00
#define LPC32XX_UART_IIRFCR_O 0x08
#define LPC32XX_UART_LSR_O 0x14
static inline void putc(int ch)
{
/* Wait for transmit FIFO to empty */
while ((__raw_readl(_UARTREG(LPC32XX_UART_LSR_O)) &
UART_STATUS_TX_MT) == 0)
;
__raw_writel((u32) ch, _UARTREG(LPC32XX_UART_DLLFIFO_O));
}
static inline void flush(void)
{
__raw_writel(__raw_readl(_UARTREG(LPC32XX_UART_IIRFCR_O)) |
UART_FIFO_CTL_TX_RESET, _UARTREG(LPC32XX_UART_IIRFCR_O));
}
/* NULL functions; we don't presently need them */
#define arch_decomp_setup()
#endif
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
* Copyright (C) 2010 NXP Semiconductors * Copyright (C) 2010 NXP Semiconductors
*/ */
#ifndef __ASM_ARCH_PLATFORM_H #ifndef __ARM_LPC32XX_H
#define __ASM_ARCH_PLATFORM_H #define __ARM_LPC32XX_H
#define _SBF(f, v) ((v) << (f)) #define _SBF(f, v) ((v) << (f))
#define _BIT(n) _SBF(n, 1) #define _BIT(n) _SBF(n, 1)
...@@ -700,4 +700,18 @@ ...@@ -700,4 +700,18 @@
#define LPC32XX_USB_OTG_DEV_CLOCK_ON _BIT(1) #define LPC32XX_USB_OTG_DEV_CLOCK_ON _BIT(1)
#define LPC32XX_USB_OTG_HOST_CLOCK_ON _BIT(0) #define LPC32XX_USB_OTG_HOST_CLOCK_ON _BIT(0)
/*
* Start of virtual addresses for IO devices
*/
#define IO_BASE 0xF0000000
/*
* This macro relies on fact that for all HW i/o addresses bits 20-23 are 0
*/
#define IO_ADDRESS(x) IOMEM(((((x) & 0xff000000) >> 4) | ((x) & 0xfffff)) |\
IO_BASE)
#define io_p2v(x) ((void __iomem *) (unsigned long) IO_ADDRESS(x))
#define io_v2p(x) ((((x) & 0x0ff00000) << 4) | ((x) & 0x000fffff))
#endif #endif
...@@ -70,8 +70,7 @@ ...@@ -70,8 +70,7 @@
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <mach/hardware.h> #include "lpc32xx.h"
#include <mach/platform.h>
#include "common.h" #include "common.h"
#define TEMP_IRAM_AREA IO_ADDRESS(LPC32XX_IRAM_BASE) #define TEMP_IRAM_AREA IO_ADDRESS(LPC32XX_IRAM_BASE)
......
...@@ -16,8 +16,7 @@ ...@@ -16,8 +16,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/io.h> #include <linux/io.h>
#include <mach/hardware.h> #include "lpc32xx.h"
#include <mach/platform.h>
#include "common.h" #include "common.h"
#define LPC32XX_SUART_FIFO_SIZE 64 #define LPC32XX_SUART_FIFO_SIZE 64
...@@ -60,6 +59,36 @@ static struct uartinit uartinit_data[] __initdata = { ...@@ -60,6 +59,36 @@ static struct uartinit uartinit_data[] __initdata = {
}, },
}; };
/* LPC3250 Errata HSUART.1: Hang workaround via loopback mode on inactivity */
void lpc32xx_loopback_set(resource_size_t mapbase, int state)
{
int bit;
u32 tmp;
switch (mapbase) {
case LPC32XX_HS_UART1_BASE:
bit = 0;
break;
case LPC32XX_HS_UART2_BASE:
bit = 1;
break;
case LPC32XX_HS_UART7_BASE:
bit = 6;
break;
default:
WARN(1, "lpc32xx_hs: Warning: Unknown port at %08x\n", mapbase);
return;
}
tmp = readl(LPC32XX_UARTCTL_CLOOP);
if (state)
tmp |= (1 << bit);
else
tmp &= ~(1 << bit);
writel(tmp, LPC32XX_UARTCTL_CLOOP);
}
EXPORT_SYMBOL_GPL(lpc32xx_loopback_set);
void __init lpc32xx_serial_init(void) void __init lpc32xx_serial_init(void)
{ {
u32 tmp, clkmodes = 0; u32 tmp, clkmodes = 0;
......
...@@ -11,8 +11,7 @@ ...@@ -11,8 +11,7 @@
*/ */
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/assembler.h> #include <asm/assembler.h>
#include <mach/platform.h> #include "lpc32xx.h"
#include <mach/hardware.h>
/* Using named register defines makes the code easier to follow */ /* Using named register defines makes the code easier to follow */
#define WORK1_REG r0 #define WORK1_REG r0
......
...@@ -311,6 +311,13 @@ config GPIO_LPC18XX ...@@ -311,6 +311,13 @@ config GPIO_LPC18XX
Select this option to enable GPIO driver for Select this option to enable GPIO driver for
NXP LPC18XX/43XX devices. NXP LPC18XX/43XX devices.
config GPIO_LPC32XX
tristate "NXP LPC32XX GPIO support"
depends on OF_GPIO && (ARCH_LPC32XX || COMPILE_TEST)
help
Select this option to enable GPIO driver for
NXP LPC32XX devices.
config GPIO_LYNXPOINT config GPIO_LYNXPOINT
tristate "Intel Lynxpoint GPIO support" tristate "Intel Lynxpoint GPIO support"
depends on ACPI && X86 depends on ACPI && X86
......
...@@ -74,7 +74,7 @@ obj-$(CONFIG_GPIO_LP3943) += gpio-lp3943.o ...@@ -74,7 +74,7 @@ obj-$(CONFIG_GPIO_LP3943) += gpio-lp3943.o
obj-$(CONFIG_GPIO_LP873X) += gpio-lp873x.o obj-$(CONFIG_GPIO_LP873X) += gpio-lp873x.o
obj-$(CONFIG_GPIO_LP87565) += gpio-lp87565.o obj-$(CONFIG_GPIO_LP87565) += gpio-lp87565.o
obj-$(CONFIG_GPIO_LPC18XX) += gpio-lpc18xx.o obj-$(CONFIG_GPIO_LPC18XX) += gpio-lpc18xx.o
obj-$(CONFIG_ARCH_LPC32XX) += gpio-lpc32xx.o obj-$(CONFIG_GPIO_LPC32XX) += gpio-lpc32xx.o
obj-$(CONFIG_GPIO_LYNXPOINT) += gpio-lynxpoint.o obj-$(CONFIG_GPIO_LYNXPOINT) += gpio-lynxpoint.o
obj-$(CONFIG_GPIO_MADERA) += gpio-madera.o obj-$(CONFIG_GPIO_MADERA) += gpio-madera.o
obj-$(CONFIG_GPIO_MAX3191X) += gpio-max3191x.o obj-$(CONFIG_GPIO_MAX3191X) += gpio-max3191x.o
......
...@@ -16,36 +16,33 @@ ...@@ -16,36 +16,33 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/module.h> #include <linux/module.h>
#include <mach/hardware.h> #define LPC32XX_GPIO_P3_INP_STATE (0x000)
#include <mach/platform.h> #define LPC32XX_GPIO_P3_OUTP_SET (0x004)
#define LPC32XX_GPIO_P3_OUTP_CLR (0x008)
#define LPC32XX_GPIO_P3_INP_STATE _GPREG(0x000) #define LPC32XX_GPIO_P3_OUTP_STATE (0x00C)
#define LPC32XX_GPIO_P3_OUTP_SET _GPREG(0x004) #define LPC32XX_GPIO_P2_DIR_SET (0x010)
#define LPC32XX_GPIO_P3_OUTP_CLR _GPREG(0x008) #define LPC32XX_GPIO_P2_DIR_CLR (0x014)
#define LPC32XX_GPIO_P3_OUTP_STATE _GPREG(0x00C) #define LPC32XX_GPIO_P2_DIR_STATE (0x018)
#define LPC32XX_GPIO_P2_DIR_SET _GPREG(0x010) #define LPC32XX_GPIO_P2_INP_STATE (0x01C)
#define LPC32XX_GPIO_P2_DIR_CLR _GPREG(0x014) #define LPC32XX_GPIO_P2_OUTP_SET (0x020)
#define LPC32XX_GPIO_P2_DIR_STATE _GPREG(0x018) #define LPC32XX_GPIO_P2_OUTP_CLR (0x024)
#define LPC32XX_GPIO_P2_INP_STATE _GPREG(0x01C) #define LPC32XX_GPIO_P2_MUX_SET (0x028)
#define LPC32XX_GPIO_P2_OUTP_SET _GPREG(0x020) #define LPC32XX_GPIO_P2_MUX_CLR (0x02C)
#define LPC32XX_GPIO_P2_OUTP_CLR _GPREG(0x024) #define LPC32XX_GPIO_P2_MUX_STATE (0x030)
#define LPC32XX_GPIO_P2_MUX_SET _GPREG(0x028) #define LPC32XX_GPIO_P0_INP_STATE (0x040)
#define LPC32XX_GPIO_P2_MUX_CLR _GPREG(0x02C) #define LPC32XX_GPIO_P0_OUTP_SET (0x044)
#define LPC32XX_GPIO_P2_MUX_STATE _GPREG(0x030) #define LPC32XX_GPIO_P0_OUTP_CLR (0x048)
#define LPC32XX_GPIO_P0_INP_STATE _GPREG(0x040) #define LPC32XX_GPIO_P0_OUTP_STATE (0x04C)
#define LPC32XX_GPIO_P0_OUTP_SET _GPREG(0x044) #define LPC32XX_GPIO_P0_DIR_SET (0x050)
#define LPC32XX_GPIO_P0_OUTP_CLR _GPREG(0x048) #define LPC32XX_GPIO_P0_DIR_CLR (0x054)
#define LPC32XX_GPIO_P0_OUTP_STATE _GPREG(0x04C) #define LPC32XX_GPIO_P0_DIR_STATE (0x058)
#define LPC32XX_GPIO_P0_DIR_SET _GPREG(0x050) #define LPC32XX_GPIO_P1_INP_STATE (0x060)
#define LPC32XX_GPIO_P0_DIR_CLR _GPREG(0x054) #define LPC32XX_GPIO_P1_OUTP_SET (0x064)
#define LPC32XX_GPIO_P0_DIR_STATE _GPREG(0x058) #define LPC32XX_GPIO_P1_OUTP_CLR (0x068)
#define LPC32XX_GPIO_P1_INP_STATE _GPREG(0x060) #define LPC32XX_GPIO_P1_OUTP_STATE (0x06C)
#define LPC32XX_GPIO_P1_OUTP_SET _GPREG(0x064) #define LPC32XX_GPIO_P1_DIR_SET (0x070)
#define LPC32XX_GPIO_P1_OUTP_CLR _GPREG(0x068) #define LPC32XX_GPIO_P1_DIR_CLR (0x074)
#define LPC32XX_GPIO_P1_OUTP_STATE _GPREG(0x06C) #define LPC32XX_GPIO_P1_DIR_STATE (0x078)
#define LPC32XX_GPIO_P1_DIR_SET _GPREG(0x070)
#define LPC32XX_GPIO_P1_DIR_CLR _GPREG(0x074)
#define LPC32XX_GPIO_P1_DIR_STATE _GPREG(0x078)
#define GPIO012_PIN_TO_BIT(x) (1 << (x)) #define GPIO012_PIN_TO_BIT(x) (1 << (x))
#define GPIO3_PIN_TO_BIT(x) (1 << ((x) + 25)) #define GPIO3_PIN_TO_BIT(x) (1 << ((x) + 25))
...@@ -72,12 +69,12 @@ ...@@ -72,12 +69,12 @@
#define LPC32XX_GPO_P3_GRP (LPC32XX_GPI_P3_GRP + LPC32XX_GPI_P3_MAX) #define LPC32XX_GPO_P3_GRP (LPC32XX_GPI_P3_GRP + LPC32XX_GPI_P3_MAX)
struct gpio_regs { struct gpio_regs {
void __iomem *inp_state; unsigned long inp_state;
void __iomem *outp_state; unsigned long outp_state;
void __iomem *outp_set; unsigned long outp_set;
void __iomem *outp_clr; unsigned long outp_clr;
void __iomem *dir_set; unsigned long dir_set;
void __iomem *dir_clr; unsigned long dir_clr;
}; };
/* /*
...@@ -165,16 +162,27 @@ static struct gpio_regs gpio_grp_regs_p3 = { ...@@ -165,16 +162,27 @@ static struct gpio_regs gpio_grp_regs_p3 = {
struct lpc32xx_gpio_chip { struct lpc32xx_gpio_chip {
struct gpio_chip chip; struct gpio_chip chip;
struct gpio_regs *gpio_grp; struct gpio_regs *gpio_grp;
void __iomem *reg_base;
}; };
static inline u32 gpreg_read(struct lpc32xx_gpio_chip *group, unsigned long offset)
{
return __raw_readl(group->reg_base + offset);
}
static inline void gpreg_write(struct lpc32xx_gpio_chip *group, u32 val, unsigned long offset)
{
__raw_writel(val, group->reg_base + offset);
}
static void __set_gpio_dir_p012(struct lpc32xx_gpio_chip *group, static void __set_gpio_dir_p012(struct lpc32xx_gpio_chip *group,
unsigned pin, int input) unsigned pin, int input)
{ {
if (input) if (input)
__raw_writel(GPIO012_PIN_TO_BIT(pin), gpreg_write(group, GPIO012_PIN_TO_BIT(pin),
group->gpio_grp->dir_clr); group->gpio_grp->dir_clr);
else else
__raw_writel(GPIO012_PIN_TO_BIT(pin), gpreg_write(group, GPIO012_PIN_TO_BIT(pin),
group->gpio_grp->dir_set); group->gpio_grp->dir_set);
} }
...@@ -184,19 +192,19 @@ static void __set_gpio_dir_p3(struct lpc32xx_gpio_chip *group, ...@@ -184,19 +192,19 @@ static void __set_gpio_dir_p3(struct lpc32xx_gpio_chip *group,
u32 u = GPIO3_PIN_TO_BIT(pin); u32 u = GPIO3_PIN_TO_BIT(pin);
if (input) if (input)
__raw_writel(u, group->gpio_grp->dir_clr); gpreg_write(group, u, group->gpio_grp->dir_clr);
else else
__raw_writel(u, group->gpio_grp->dir_set); gpreg_write(group, u, group->gpio_grp->dir_set);
} }
static void __set_gpio_level_p012(struct lpc32xx_gpio_chip *group, static void __set_gpio_level_p012(struct lpc32xx_gpio_chip *group,
unsigned pin, int high) unsigned pin, int high)
{ {
if (high) if (high)
__raw_writel(GPIO012_PIN_TO_BIT(pin), gpreg_write(group, GPIO012_PIN_TO_BIT(pin),
group->gpio_grp->outp_set); group->gpio_grp->outp_set);
else else
__raw_writel(GPIO012_PIN_TO_BIT(pin), gpreg_write(group, GPIO012_PIN_TO_BIT(pin),
group->gpio_grp->outp_clr); group->gpio_grp->outp_clr);
} }
...@@ -206,31 +214,31 @@ static void __set_gpio_level_p3(struct lpc32xx_gpio_chip *group, ...@@ -206,31 +214,31 @@ static void __set_gpio_level_p3(struct lpc32xx_gpio_chip *group,
u32 u = GPIO3_PIN_TO_BIT(pin); u32 u = GPIO3_PIN_TO_BIT(pin);
if (high) if (high)
__raw_writel(u, group->gpio_grp->outp_set); gpreg_write(group, u, group->gpio_grp->outp_set);
else else
__raw_writel(u, group->gpio_grp->outp_clr); gpreg_write(group, u, group->gpio_grp->outp_clr);
} }
static void __set_gpo_level_p3(struct lpc32xx_gpio_chip *group, static void __set_gpo_level_p3(struct lpc32xx_gpio_chip *group,
unsigned pin, int high) unsigned pin, int high)
{ {
if (high) if (high)
__raw_writel(GPO3_PIN_TO_BIT(pin), group->gpio_grp->outp_set); gpreg_write(group, GPO3_PIN_TO_BIT(pin), group->gpio_grp->outp_set);
else else
__raw_writel(GPO3_PIN_TO_BIT(pin), group->gpio_grp->outp_clr); gpreg_write(group, GPO3_PIN_TO_BIT(pin), group->gpio_grp->outp_clr);
} }
static int __get_gpio_state_p012(struct lpc32xx_gpio_chip *group, static int __get_gpio_state_p012(struct lpc32xx_gpio_chip *group,
unsigned pin) unsigned pin)
{ {
return GPIO012_PIN_IN_SEL(__raw_readl(group->gpio_grp->inp_state), return GPIO012_PIN_IN_SEL(gpreg_read(group, group->gpio_grp->inp_state),
pin); pin);
} }
static int __get_gpio_state_p3(struct lpc32xx_gpio_chip *group, static int __get_gpio_state_p3(struct lpc32xx_gpio_chip *group,
unsigned pin) unsigned pin)
{ {
int state = __raw_readl(group->gpio_grp->inp_state); int state = gpreg_read(group, group->gpio_grp->inp_state);
/* /*
* P3 GPIO pin input mapping is not contiguous, GPIOP3-0..4 is mapped * P3 GPIO pin input mapping is not contiguous, GPIOP3-0..4 is mapped
...@@ -242,13 +250,13 @@ static int __get_gpio_state_p3(struct lpc32xx_gpio_chip *group, ...@@ -242,13 +250,13 @@ static int __get_gpio_state_p3(struct lpc32xx_gpio_chip *group,
static int __get_gpi_state_p3(struct lpc32xx_gpio_chip *group, static int __get_gpi_state_p3(struct lpc32xx_gpio_chip *group,
unsigned pin) unsigned pin)
{ {
return GPI3_PIN_IN_SEL(__raw_readl(group->gpio_grp->inp_state), pin); return GPI3_PIN_IN_SEL(gpreg_read(group, group->gpio_grp->inp_state), pin);
} }
static int __get_gpo_state_p3(struct lpc32xx_gpio_chip *group, static int __get_gpo_state_p3(struct lpc32xx_gpio_chip *group,
unsigned pin) unsigned pin)
{ {
return GPO3_PIN_IN_SEL(__raw_readl(group->gpio_grp->outp_state), pin); return GPO3_PIN_IN_SEL(gpreg_read(group, group->gpio_grp->outp_state), pin);
} }
/* /*
...@@ -497,12 +505,18 @@ static int lpc32xx_of_xlate(struct gpio_chip *gc, ...@@ -497,12 +505,18 @@ static int lpc32xx_of_xlate(struct gpio_chip *gc,
static int lpc32xx_gpio_probe(struct platform_device *pdev) static int lpc32xx_gpio_probe(struct platform_device *pdev)
{ {
int i; int i;
void __iomem *reg_base;
reg_base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(reg_base))
return PTR_ERR(reg_base);
for (i = 0; i < ARRAY_SIZE(lpc32xx_gpiochip); i++) { for (i = 0; i < ARRAY_SIZE(lpc32xx_gpiochip); i++) {
if (pdev->dev.of_node) { if (pdev->dev.of_node) {
lpc32xx_gpiochip[i].chip.of_xlate = lpc32xx_of_xlate; lpc32xx_gpiochip[i].chip.of_xlate = lpc32xx_of_xlate;
lpc32xx_gpiochip[i].chip.of_gpio_n_cells = 3; lpc32xx_gpiochip[i].chip.of_gpio_n_cells = 3;
lpc32xx_gpiochip[i].chip.of_node = pdev->dev.of_node; lpc32xx_gpiochip[i].chip.of_node = pdev->dev.of_node;
lpc32xx_gpiochip[i].reg_base = reg_base;
} }
devm_gpiochip_add_data(&pdev->dev, &lpc32xx_gpiochip[i].chip, devm_gpiochip_add_data(&pdev->dev, &lpc32xx_gpiochip[i].chip,
&lpc32xx_gpiochip[i]); &lpc32xx_gpiochip[i]);
...@@ -527,3 +541,7 @@ static struct platform_driver lpc32xx_gpio_driver = { ...@@ -527,3 +541,7 @@ static struct platform_driver lpc32xx_gpio_driver = {
}; };
module_platform_driver(lpc32xx_gpio_driver); module_platform_driver(lpc32xx_gpio_driver);
MODULE_AUTHOR("Kevin Wells <kevin.wells@nxp.com>");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("GPIO driver for LPC32xx SoC");
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
config LPC_ENET config LPC_ENET
tristate "NXP ethernet MAC on LPC devices" tristate "NXP ethernet MAC on LPC devices"
depends on ARCH_LPC32XX depends on ARCH_LPC32XX || COMPILE_TEST
select PHYLIB select PHYLIB
help help
Say Y or M here if you want to use the NXP ethernet MAC included on Say Y or M here if you want to use the NXP ethernet MAC included on
......
...@@ -14,14 +14,12 @@ ...@@ -14,14 +14,12 @@
#include <linux/crc32.h> #include <linux/crc32.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h>
#include <linux/of_net.h> #include <linux/of_net.h>
#include <linux/phy.h> #include <linux/phy.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/soc/nxp/lpc32xx-misc.h>
#include <mach/board.h>
#include <mach/hardware.h>
#include <mach/platform.h>
#define MODNAME "lpc-eth" #define MODNAME "lpc-eth"
#define DRV_VERSION "1.00" #define DRV_VERSION "1.00"
...@@ -1237,16 +1235,9 @@ static int lpc_eth_drv_probe(struct platform_device *pdev) ...@@ -1237,16 +1235,9 @@ static int lpc_eth_drv_probe(struct platform_device *pdev)
dma_addr_t dma_handle; dma_addr_t dma_handle;
struct resource *res; struct resource *res;
int irq, ret; int irq, ret;
u32 tmp;
/* Setup network interface for RMII or MII mode */ /* Setup network interface for RMII or MII mode */
tmp = __raw_readl(LPC32XX_CLKPWR_MACCLK_CTRL); lpc32xx_set_phy_interface_mode(lpc_phy_interface_mode(dev));
tmp &= ~LPC32XX_CLKPWR_MACCTRL_PINS_MSK;
if (lpc_phy_interface_mode(dev) == PHY_INTERFACE_MODE_MII)
tmp |= LPC32XX_CLKPWR_MACCTRL_USE_MII_PINS;
else
tmp |= LPC32XX_CLKPWR_MACCTRL_USE_RMII_PINS;
__raw_writel(tmp, LPC32XX_CLKPWR_MACCLK_CTRL);
/* Get platform resources */ /* Get platform resources */
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
...@@ -1311,19 +1302,18 @@ static int lpc_eth_drv_probe(struct platform_device *pdev) ...@@ -1311,19 +1302,18 @@ static int lpc_eth_drv_probe(struct platform_device *pdev)
/* Get size of DMA buffers/descriptors region */ /* Get size of DMA buffers/descriptors region */
pldat->dma_buff_size = (ENET_TX_DESC + ENET_RX_DESC) * (ENET_MAXF_SIZE + pldat->dma_buff_size = (ENET_TX_DESC + ENET_RX_DESC) * (ENET_MAXF_SIZE +
sizeof(struct txrx_desc_t) + sizeof(struct rx_status_t)); sizeof(struct txrx_desc_t) + sizeof(struct rx_status_t));
pldat->dma_buff_base_v = 0;
if (use_iram_for_net(dev)) { if (use_iram_for_net(dev)) {
dma_handle = LPC32XX_IRAM_BASE; if (pldat->dma_buff_size >
if (pldat->dma_buff_size <= lpc32xx_return_iram_size()) lpc32xx_return_iram(&pldat->dma_buff_base_v, &dma_handle)) {
pldat->dma_buff_base_v = pldat->dma_buff_base_v = NULL;
io_p2v(LPC32XX_IRAM_BASE); pldat->dma_buff_size = 0;
else
netdev_err(ndev, netdev_err(ndev,
"IRAM not big enough for net buffers, using SDRAM instead.\n"); "IRAM not big enough for net buffers, using SDRAM instead.\n");
}
} }
if (pldat->dma_buff_base_v == 0) { if (pldat->dma_buff_base_v == NULL) {
ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32)); ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32));
if (ret) if (ret)
goto err_out_free_irq; goto err_out_free_irq;
...@@ -1344,13 +1334,14 @@ static int lpc_eth_drv_probe(struct platform_device *pdev) ...@@ -1344,13 +1334,14 @@ static int lpc_eth_drv_probe(struct platform_device *pdev)
pldat->dma_buff_base_p = dma_handle; pldat->dma_buff_base_p = dma_handle;
netdev_dbg(ndev, "IO address space :%pR\n", res); netdev_dbg(ndev, "IO address space :%pR\n", res);
netdev_dbg(ndev, "IO address size :%d\n", resource_size(res)); netdev_dbg(ndev, "IO address size :%zd\n",
(size_t)resource_size(res));
netdev_dbg(ndev, "IO address (mapped) :0x%p\n", netdev_dbg(ndev, "IO address (mapped) :0x%p\n",
pldat->net_base); pldat->net_base);
netdev_dbg(ndev, "IRQ number :%d\n", ndev->irq); netdev_dbg(ndev, "IRQ number :%d\n", ndev->irq);
netdev_dbg(ndev, "DMA buffer size :%d\n", pldat->dma_buff_size); netdev_dbg(ndev, "DMA buffer size :%zd\n", pldat->dma_buff_size);
netdev_dbg(ndev, "DMA buffer P address :0x%08x\n", netdev_dbg(ndev, "DMA buffer P address :%pad\n",
pldat->dma_buff_base_p); &pldat->dma_buff_base_p);
netdev_dbg(ndev, "DMA buffer V address :0x%p\n", netdev_dbg(ndev, "DMA buffer V address :0x%p\n",
pldat->dma_buff_base_v); pldat->dma_buff_base_v);
...@@ -1397,8 +1388,8 @@ static int lpc_eth_drv_probe(struct platform_device *pdev) ...@@ -1397,8 +1388,8 @@ static int lpc_eth_drv_probe(struct platform_device *pdev)
if (ret) if (ret)
goto err_out_unregister_netdev; goto err_out_unregister_netdev;
netdev_info(ndev, "LPC mac at 0x%08x irq %d\n", netdev_info(ndev, "LPC mac at 0x%08lx irq %d\n",
res->start, ndev->irq); (unsigned long)res->start, ndev->irq);
device_init_wakeup(dev, 1); device_init_wakeup(dev, 1);
device_set_wakeup_enable(dev, 0); device_set_wakeup_enable(dev, 0);
...@@ -1409,7 +1400,7 @@ static int lpc_eth_drv_probe(struct platform_device *pdev) ...@@ -1409,7 +1400,7 @@ static int lpc_eth_drv_probe(struct platform_device *pdev)
unregister_netdev(ndev); unregister_netdev(ndev);
err_out_dma_unmap: err_out_dma_unmap:
if (!use_iram_for_net(dev) || 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, dma_free_coherent(dev, pldat->dma_buff_size,
pldat->dma_buff_base_v, pldat->dma_buff_base_v,
pldat->dma_buff_base_p); pldat->dma_buff_base_p);
...@@ -1436,7 +1427,7 @@ static int lpc_eth_drv_remove(struct platform_device *pdev) ...@@ -1436,7 +1427,7 @@ static int lpc_eth_drv_remove(struct platform_device *pdev)
unregister_netdev(ndev); unregister_netdev(ndev);
if (!use_iram_for_net(&pldat->pdev->dev) || 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, dma_free_coherent(&pldat->pdev->dev, pldat->dma_buff_size,
pldat->dma_buff_base_v, pldat->dma_buff_base_v,
pldat->dma_buff_base_p); pldat->dma_buff_base_p);
......
...@@ -739,7 +739,8 @@ config SERIAL_PNX8XXX_CONSOLE ...@@ -739,7 +739,8 @@ config SERIAL_PNX8XXX_CONSOLE
config SERIAL_HS_LPC32XX config SERIAL_HS_LPC32XX
tristate "LPC32XX high speed serial port support" tristate "LPC32XX high speed serial port support"
depends on ARCH_LPC32XX && OF depends on ARCH_LPC32XX || COMPILE_TEST
depends on OF
select SERIAL_CORE select SERIAL_CORE
help help
Support for the LPC32XX high speed serial ports (up to 900kbps). Support for the LPC32XX high speed serial ports (up to 900kbps).
......
...@@ -25,8 +25,8 @@ ...@@ -25,8 +25,8 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/of.h> #include <linux/of.h>
#include <mach/platform.h> #include <linux/sizes.h>
#include <mach/hardware.h> #include <linux/soc/nxp/lpc32xx-misc.h>
/* /*
* High Speed UART register offsets * High Speed UART register offsets
...@@ -81,6 +81,8 @@ ...@@ -81,6 +81,8 @@
#define LPC32XX_HSU_TX_TL8B (0x2 << 0) #define LPC32XX_HSU_TX_TL8B (0x2 << 0)
#define LPC32XX_HSU_TX_TL16B (0x3 << 0) #define LPC32XX_HSU_TX_TL16B (0x3 << 0)
#define LPC32XX_MAIN_OSC_FREQ 13000000
#define MODNAME "lpc32xx_hsuart" #define MODNAME "lpc32xx_hsuart"
struct lpc32xx_hsuart_port { struct lpc32xx_hsuart_port {
...@@ -151,8 +153,6 @@ static void lpc32xx_hsuart_console_write(struct console *co, const char *s, ...@@ -151,8 +153,6 @@ static void lpc32xx_hsuart_console_write(struct console *co, const char *s,
local_irq_restore(flags); local_irq_restore(flags);
} }
static void lpc32xx_loopback_set(resource_size_t mapbase, int state);
static int __init lpc32xx_hsuart_console_setup(struct console *co, static int __init lpc32xx_hsuart_console_setup(struct console *co,
char *options) char *options)
{ {
...@@ -439,35 +439,6 @@ static void serial_lpc32xx_break_ctl(struct uart_port *port, ...@@ -439,35 +439,6 @@ static void serial_lpc32xx_break_ctl(struct uart_port *port,
spin_unlock_irqrestore(&port->lock, flags); spin_unlock_irqrestore(&port->lock, flags);
} }
/* LPC3250 Errata HSUART.1: Hang workaround via loopback mode on inactivity */
static void lpc32xx_loopback_set(resource_size_t mapbase, int state)
{
int bit;
u32 tmp;
switch (mapbase) {
case LPC32XX_HS_UART1_BASE:
bit = 0;
break;
case LPC32XX_HS_UART2_BASE:
bit = 1;
break;
case LPC32XX_HS_UART7_BASE:
bit = 6;
break;
default:
WARN(1, "lpc32xx_hs: Warning: Unknown port at %08x\n", mapbase);
return;
}
tmp = readl(LPC32XX_UARTCTL_CLOOP);
if (state)
tmp |= (1 << bit);
else
tmp &= ~(1 << bit);
writel(tmp, LPC32XX_UARTCTL_CLOOP);
}
/* port->lock is not held. */ /* port->lock is not held. */
static int serial_lpc32xx_startup(struct uart_port *port) static int serial_lpc32xx_startup(struct uart_port *port)
{ {
......
...@@ -45,7 +45,8 @@ config USB_AT91 ...@@ -45,7 +45,8 @@ config USB_AT91
config USB_LPC32XX config USB_LPC32XX
tristate "LPC32XX USB Peripheral Controller" tristate "LPC32XX USB Peripheral Controller"
depends on ARCH_LPC32XX && I2C depends on ARCH_LPC32XX || COMPILE_TEST
depends on I2C
select USB_ISP1301 select USB_ISP1301
help help
This option selects the USB device controller in the LPC32xx SoC. This option selects the USB device controller in the LPC32xx SoC.
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/prefetch.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/usb/ch9.h> #include <linux/usb/ch9.h>
...@@ -35,8 +36,6 @@ ...@@ -35,8 +36,6 @@
#include <linux/seq_file.h> #include <linux/seq_file.h>
#endif #endif
#include <mach/hardware.h>
/* /*
* USB device configuration structure * USB device configuration structure
*/ */
......
...@@ -441,7 +441,8 @@ config USB_OHCI_HCD_S3C2410 ...@@ -441,7 +441,8 @@ config USB_OHCI_HCD_S3C2410
config USB_OHCI_HCD_LPC32XX config USB_OHCI_HCD_LPC32XX
tristate "Support for LPC on-chip OHCI USB controller" tristate "Support for LPC on-chip OHCI USB controller"
depends on USB_OHCI_HCD && ARCH_LPC32XX depends on USB_OHCI_HCD
depends on ARCH_LPC32XX || COMPILE_TEST
depends on USB_ISP1301 depends on USB_ISP1301
default y default y
---help--- ---help---
......
...@@ -29,10 +29,7 @@ ...@@ -29,10 +29,7 @@
#include "ohci.h" #include "ohci.h"
#include <mach/hardware.h>
#define USB_CONFIG_BASE 0x31020000 #define USB_CONFIG_BASE 0x31020000
#define USB_OTG_STAT_CONTROL IO_ADDRESS(USB_CONFIG_BASE + 0x110)
/* USB_OTG_STAT_CONTROL bit defines */ /* USB_OTG_STAT_CONTROL bit defines */
#define TRANSPARENT_I2C_EN (1 << 7) #define TRANSPARENT_I2C_EN (1 << 7)
...@@ -122,19 +119,33 @@ static inline void isp1301_vbus_off(void) ...@@ -122,19 +119,33 @@ static inline void isp1301_vbus_off(void)
static void ohci_nxp_start_hc(void) static void ohci_nxp_start_hc(void)
{ {
unsigned long tmp = __raw_readl(USB_OTG_STAT_CONTROL) | HOST_EN; void __iomem *usb_otg_stat_control = ioremap(USB_CONFIG_BASE + 0x110, 4);
unsigned long tmp;
if (WARN_ON(!usb_otg_stat_control))
return;
tmp = __raw_readl(usb_otg_stat_control) | HOST_EN;
__raw_writel(tmp, USB_OTG_STAT_CONTROL); __raw_writel(tmp, usb_otg_stat_control);
isp1301_vbus_on(); isp1301_vbus_on();
iounmap(usb_otg_stat_control);
} }
static void ohci_nxp_stop_hc(void) static void ohci_nxp_stop_hc(void)
{ {
void __iomem *usb_otg_stat_control = ioremap(USB_CONFIG_BASE + 0x110, 4);
unsigned long tmp; unsigned long tmp;
if (WARN_ON(!usb_otg_stat_control))
return;
isp1301_vbus_off(); isp1301_vbus_off();
tmp = __raw_readl(USB_OTG_STAT_CONTROL) & ~HOST_EN; tmp = __raw_readl(usb_otg_stat_control) & ~HOST_EN;
__raw_writel(tmp, USB_OTG_STAT_CONTROL); __raw_writel(tmp, usb_otg_stat_control);
iounmap(usb_otg_stat_control);
} }
static int ohci_hcd_nxp_probe(struct platform_device *pdev) static int ohci_hcd_nxp_probe(struct platform_device *pdev)
......
...@@ -551,7 +551,7 @@ config OMAP_WATCHDOG ...@@ -551,7 +551,7 @@ config OMAP_WATCHDOG
config PNX4008_WATCHDOG config PNX4008_WATCHDOG
tristate "LPC32XX Watchdog" tristate "LPC32XX Watchdog"
depends on ARCH_LPC32XX depends on ARCH_LPC32XX || COMPILE_TEST
select WATCHDOG_CORE select WATCHDOG_CORE
help help
Say Y here if to include support for the watchdog timer Say Y here if to include support for the watchdog timer
......
...@@ -30,7 +30,6 @@ ...@@ -30,7 +30,6 @@
#include <linux/of.h> #include <linux/of.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/reboot.h> #include <linux/reboot.h>
#include <mach/hardware.h>
/* WatchDog Timer - Chapter 23 Page 207 */ /* WatchDog Timer - Chapter 23 Page 207 */
......
/* 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>
#include <linux/phy.h>
#ifdef CONFIG_ARCH_LPC32XX
extern u32 lpc32xx_return_iram(void __iomem **mapbase, dma_addr_t *dmaaddr);
extern void lpc32xx_set_phy_interface_mode(phy_interface_t mode);
extern void lpc32xx_loopback_set(resource_size_t mapbase, int state);
#else
static inline u32 lpc32xx_return_iram(void __iomem **mapbase, dma_addr_t *dmaaddr)
{
*mapbase = NULL;
*dmaaddr = 0;
return 0;
}
static inline void lpc32xx_set_phy_interface_mode(phy_interface_t mode)
{
}
static inline void lpc32xx_loopback_set(resource_size_t mapbase, int state)
{
}
#endif
#endif /* __SOC_LPC32XX_MISC_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment