1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * arch/arm/mach-lpc32xx/common.c
5 * Author: Kevin Wells <kevin.wells@nxp.com>
7 * Copyright (C) 2010 NXP Semiconductors
10 #include <linux/init.h>
11 #include <linux/soc/nxp/lpc32xx-misc.h>
13 #include <asm/mach/map.h>
14 #include <asm/system_info.h>
20 * Returns the unique ID for the device
22 void lpc32xx_get_uid(u32 devid
[4])
26 for (i
= 0; i
< 4; i
++)
27 devid
[i
] = __raw_readl(LPC32XX_CLKPWR_DEVID(i
<< 2));
31 * Detects and returns IRAM size for the device variation
33 #define LPC32XX_IRAM_BANK_SIZE SZ_128K
35 u32
lpc32xx_return_iram(void __iomem
**mapbase
, dma_addr_t
*dmaaddr
)
38 u32 savedval1
, savedval2
;
39 void __iomem
*iramptr1
, *iramptr2
;
41 iramptr1
= io_p2v(LPC32XX_IRAM_BASE
);
42 iramptr2
= io_p2v(LPC32XX_IRAM_BASE
+ LPC32XX_IRAM_BANK_SIZE
);
43 savedval1
= __raw_readl(iramptr1
);
44 savedval2
= __raw_readl(iramptr2
);
46 if (savedval1
== savedval2
) {
47 __raw_writel(savedval2
+ 1, iramptr2
);
48 if (__raw_readl(iramptr1
) == savedval2
+ 1)
49 iram_size
= LPC32XX_IRAM_BANK_SIZE
;
51 iram_size
= LPC32XX_IRAM_BANK_SIZE
* 2;
52 __raw_writel(savedval2
, iramptr2
);
54 iram_size
= LPC32XX_IRAM_BANK_SIZE
* 2;
57 *dmaaddr
= LPC32XX_IRAM_BASE
;
59 *mapbase
= io_p2v(LPC32XX_IRAM_BASE
);
63 EXPORT_SYMBOL_GPL(lpc32xx_return_iram
);
65 void lpc32xx_set_phy_interface_mode(phy_interface_t mode
)
67 u32 tmp
= __raw_readl(LPC32XX_CLKPWR_MACCLK_CTRL
);
68 tmp
&= ~LPC32XX_CLKPWR_MACCTRL_PINS_MSK
;
69 if (mode
== PHY_INTERFACE_MODE_MII
)
70 tmp
|= LPC32XX_CLKPWR_MACCTRL_USE_MII_PINS
;
72 tmp
|= LPC32XX_CLKPWR_MACCTRL_USE_RMII_PINS
;
73 __raw_writel(tmp
, LPC32XX_CLKPWR_MACCLK_CTRL
);
75 EXPORT_SYMBOL_GPL(lpc32xx_set_phy_interface_mode
);
77 static struct map_desc lpc32xx_io_desc
[] __initdata
= {
79 .virtual = (unsigned long)IO_ADDRESS(LPC32XX_AHB0_START
),
80 .pfn
= __phys_to_pfn(LPC32XX_AHB0_START
),
81 .length
= LPC32XX_AHB0_SIZE
,
85 .virtual = (unsigned long)IO_ADDRESS(LPC32XX_AHB1_START
),
86 .pfn
= __phys_to_pfn(LPC32XX_AHB1_START
),
87 .length
= LPC32XX_AHB1_SIZE
,
91 .virtual = (unsigned long)IO_ADDRESS(LPC32XX_FABAPB_START
),
92 .pfn
= __phys_to_pfn(LPC32XX_FABAPB_START
),
93 .length
= LPC32XX_FABAPB_SIZE
,
97 .virtual = (unsigned long)IO_ADDRESS(LPC32XX_IRAM_BASE
),
98 .pfn
= __phys_to_pfn(LPC32XX_IRAM_BASE
),
99 .length
= (LPC32XX_IRAM_BANK_SIZE
* 2),
104 void __init
lpc32xx_map_io(void)
106 iotable_init(lpc32xx_io_desc
, ARRAY_SIZE(lpc32xx_io_desc
));
109 static int __init
lpc32xx_check_uid(void)
113 lpc32xx_get_uid(uid
);
115 printk(KERN_INFO
"LPC32XX unique ID: %08x%08x%08x%08x\n",
116 uid
[3], uid
[2], uid
[1], uid
[0]);
118 if (!system_serial_low
&& !system_serial_high
) {
119 system_serial_low
= uid
[0];
120 system_serial_high
= uid
[1];
125 arch_initcall(lpc32xx_check_uid
);