mirror of https://gitee.com/openkylin/linux.git
Merge branch 'wells/lpc32xx-arch_v2' of git://git.lpclinux.com/linux-2.6-lpc into devel-stable
This commit is contained in:
commit
129961ecaf
|
@ -32,8 +32,6 @@ DocBook/
|
|||
- directory with DocBook templates etc. for kernel documentation.
|
||||
HOWTO
|
||||
- the process and procedures of how to do Linux kernel development.
|
||||
IO-mapping.txt
|
||||
- how to access I/O mapped memory from within device drivers.
|
||||
IPMI.txt
|
||||
- info on Linux Intelligent Platform Management Interface (IPMI) Driver.
|
||||
IRQ-affinity.txt
|
||||
|
@ -84,6 +82,8 @@ blockdev/
|
|||
- info on block devices & drivers
|
||||
btmrvl.txt
|
||||
- info on Marvell Bluetooth driver usage.
|
||||
bus-virt-phys-mapping.txt
|
||||
- how to access I/O mapped memory from within device drivers.
|
||||
cachetlb.txt
|
||||
- describes the cache/TLB flushing interfaces Linux uses.
|
||||
cdrom/
|
||||
|
@ -168,6 +168,8 @@ initrd.txt
|
|||
- how to use the RAM disk as an initial/temporary root filesystem.
|
||||
input/
|
||||
- info on Linux input device support.
|
||||
io-mapping.txt
|
||||
- description of io_mapping functions in linux/io-mapping.h
|
||||
io_ordering.txt
|
||||
- info on ordering I/O writes to memory-mapped addresses.
|
||||
ioctl/
|
||||
|
|
|
@ -647,3 +647,10 @@ Who: Stefan Richter <stefanr@s5r6.in-berlin.de>
|
|||
|
||||
----------------------------
|
||||
|
||||
What: The acpi_sleep=s4_nonvs command line option
|
||||
When: 2.6.37
|
||||
Files: arch/x86/kernel/acpi/sleep.c
|
||||
Why: superseded by acpi_sleep=nonvs
|
||||
Who: Rafael J. Wysocki <rjw@sisk.pl>
|
||||
|
||||
----------------------------
|
||||
|
|
|
@ -254,8 +254,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
control method, with respect to putting devices into
|
||||
low power states, to be enforced (the ACPI 2.0 ordering
|
||||
of _PTS is used by default).
|
||||
s4_nonvs prevents the kernel from saving/restoring the
|
||||
ACPI NVS memory during hibernation.
|
||||
nonvs prevents the kernel from saving/restoring the
|
||||
ACPI NVS memory during suspend/hibernation and resume.
|
||||
sci_force_enable causes the kernel to set SCI_EN directly
|
||||
on resume from S1/S3 (which is against the ACPI spec,
|
||||
but some broken systems don't work without it).
|
||||
|
|
|
@ -5336,6 +5336,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6.git
|
|||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git
|
||||
S: Maintained
|
||||
F: arch/sparc/
|
||||
F: drivers/sbus
|
||||
|
||||
SPARC SERIAL DRIVERS
|
||||
M: "David S. Miller" <davem@davemloft.net>
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 35
|
||||
EXTRAVERSION = -rc5
|
||||
EXTRAVERSION = -rc6
|
||||
NAME = Sheep on Meth
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -483,6 +483,19 @@ config ARCH_LOKI
|
|||
help
|
||||
Support for the Marvell Loki (88RC8480) SoC.
|
||||
|
||||
config ARCH_LPC32XX
|
||||
bool "NXP LPC32XX"
|
||||
select CPU_ARM926T
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select HAVE_IDE
|
||||
select ARM_AMBA
|
||||
select USB_ARCH_HAS_OHCI
|
||||
select COMMON_CLKDEV
|
||||
select GENERIC_TIME
|
||||
select GENERIC_CLOCKEVENTS
|
||||
help
|
||||
Support for the NXP LPC32XX family of processors
|
||||
|
||||
config ARCH_MV78XX0
|
||||
bool "Marvell MV78xx0"
|
||||
select CPU_FEROCEON
|
||||
|
@ -847,6 +860,8 @@ source "arch/arm/mach-lh7a40x/Kconfig"
|
|||
|
||||
source "arch/arm/mach-loki/Kconfig"
|
||||
|
||||
source "arch/arm/mach-lpc32xx/Kconfig"
|
||||
|
||||
source "arch/arm/mach-msm/Kconfig"
|
||||
|
||||
source "arch/arm/mach-mv78xx0/Kconfig"
|
||||
|
|
|
@ -146,6 +146,7 @@ machine-$(CONFIG_ARCH_KS8695) := ks8695
|
|||
machine-$(CONFIG_ARCH_L7200) := l7200
|
||||
machine-$(CONFIG_ARCH_LH7A40X) := lh7a40x
|
||||
machine-$(CONFIG_ARCH_LOKI) := loki
|
||||
machine-$(CONFIG_ARCH_LPC32XX) := lpc32xx
|
||||
machine-$(CONFIG_ARCH_MMP) := mmp
|
||||
machine-$(CONFIG_ARCH_MSM) := msm
|
||||
machine-$(CONFIG_ARCH_MV78XX0) := mv78xx0
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/hardware/clps7111.h>
|
||||
|
||||
.macro addruart, rx, tmp
|
||||
|
|
|
@ -232,7 +232,7 @@ EXPORT_SYMBOL(__bus_to_virt);
|
|||
|
||||
unsigned long __pfn_to_bus(unsigned long pfn)
|
||||
{
|
||||
return __pfn_to_phys(pfn) + (fb_bus_sdram_offset() - PHYS_OFFSET));
|
||||
return __pfn_to_phys(pfn) + (fb_bus_sdram_offset() - PHYS_OFFSET);
|
||||
}
|
||||
EXPORT_SYMBOL(__pfn_to_bus);
|
||||
|
||||
|
|
|
@ -11,8 +11,10 @@
|
|||
*
|
||||
*/
|
||||
|
||||
.equ io_virt, IO_BASE
|
||||
.equ io_phys, IO_START
|
||||
#include <mach/hardware.h>
|
||||
|
||||
.equ io_virt, IO_VIRT
|
||||
.equ io_phys, IO_PHYS
|
||||
|
||||
.macro addruart, rx, tmp
|
||||
mrc p15, 0, \rx, c1, c0
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef __ARCH_KIRKWOOD_TSX1X_COMMON_H
|
||||
#define __ARCH_KIRKWOOD_TSX1X_COMMON_H
|
||||
|
||||
extern void qnap_tsx1x_register_flash(void);
|
||||
extern void __init qnap_tsx1x_register_flash(void);
|
||||
extern void qnap_tsx1x_power_off(void);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
if ARCH_LPC32XX
|
||||
|
||||
menu "Individual UART enable selections"
|
||||
|
||||
config ARCH_LPC32XX_UART3_SELECT
|
||||
bool "Add support for standard UART3"
|
||||
help
|
||||
Adds support for standard UART 3 when the 8250 serial support
|
||||
is enabled.
|
||||
|
||||
config ARCH_LPC32XX_UART4_SELECT
|
||||
bool "Add support for standard UART4"
|
||||
help
|
||||
Adds support for standard UART 4 when the 8250 serial support
|
||||
is enabled.
|
||||
|
||||
config ARCH_LPC32XX_UART5_SELECT
|
||||
bool "Add support for standard UART5"
|
||||
default y
|
||||
help
|
||||
Adds support for standard UART 5 when the 8250 serial support
|
||||
is enabled.
|
||||
|
||||
config ARCH_LPC32XX_UART6_SELECT
|
||||
bool "Add support for standard UART6"
|
||||
help
|
||||
Adds support for standard UART 6 when the 8250 serial support
|
||||
is enabled.
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
#
|
||||
# Makefile for the linux kernel.
|
||||
#
|
||||
|
||||
obj-y := timer.o irq.o common.o serial.o clock.o
|
||||
obj-y += gpiolib.o pm.o suspend.o
|
||||
obj-y += phy3250.o
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
zreladdr-y := 0x80008000
|
||||
params_phys-y := 0x80000100
|
||||
initrd_phys-y := 0x82000000
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/clock.h
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __LPC32XX_CLOCK_H
|
||||
#define __LPC32XX_CLOCK_H
|
||||
|
||||
struct clk {
|
||||
struct list_head node;
|
||||
struct clk *parent;
|
||||
u32 rate;
|
||||
u32 usecount;
|
||||
|
||||
int (*set_rate) (struct clk *, unsigned long);
|
||||
unsigned long (*round_rate) (struct clk *, unsigned long);
|
||||
unsigned long (*get_rate) (struct clk *clk);
|
||||
int (*enable) (struct clk *, int);
|
||||
|
||||
/* Register address and bit mask for simple clocks */
|
||||
void __iomem *enable_reg;
|
||||
u32 enable_mask;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,271 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/common.c
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-pnx.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <mach/i2c.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/platform.h>
|
||||
#include "common.h"
|
||||
|
||||
/*
|
||||
* Watchdog timer
|
||||
*/
|
||||
static struct resource watchdog_resources[] = {
|
||||
[0] = {
|
||||
.start = LPC32XX_WDTIM_BASE,
|
||||
.end = LPC32XX_WDTIM_BASE + SZ_4K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device lpc32xx_watchdog_device = {
|
||||
.name = "pnx4008-watchdog",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(watchdog_resources),
|
||||
.resource = watchdog_resources,
|
||||
};
|
||||
|
||||
/*
|
||||
* I2C busses
|
||||
*/
|
||||
static struct i2c_pnx_data i2c0_data = {
|
||||
.name = I2C_CHIP_NAME "1",
|
||||
.base = LPC32XX_I2C1_BASE,
|
||||
.irq = IRQ_LPC32XX_I2C_1,
|
||||
};
|
||||
|
||||
static struct i2c_pnx_data i2c1_data = {
|
||||
.name = I2C_CHIP_NAME "2",
|
||||
.base = LPC32XX_I2C2_BASE,
|
||||
.irq = IRQ_LPC32XX_I2C_2,
|
||||
};
|
||||
|
||||
static struct i2c_pnx_data i2c2_data = {
|
||||
.name = "USB-I2C",
|
||||
.base = LPC32XX_OTG_I2C_BASE,
|
||||
.irq = IRQ_LPC32XX_USB_I2C,
|
||||
};
|
||||
|
||||
struct platform_device lpc32xx_i2c0_device = {
|
||||
.name = "pnx-i2c",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &i2c0_data,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device lpc32xx_i2c1_device = {
|
||||
.name = "pnx-i2c",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &i2c1_data,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device lpc32xx_i2c2_device = {
|
||||
.name = "pnx-i2c",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.platform_data = &i2c2_data,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* Returns the unique ID for the device
|
||||
*/
|
||||
void lpc32xx_get_uid(u32 devid[4])
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
devid[i] = __raw_readl(LPC32XX_CLKPWR_DEVID(i << 2));
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns SYSCLK source
|
||||
* 0 = PLL397, 1 = main oscillator
|
||||
*/
|
||||
int clk_is_sysclk_mainosc(void)
|
||||
{
|
||||
if ((__raw_readl(LPC32XX_CLKPWR_SYSCLK_CTRL) &
|
||||
LPC32XX_CLKPWR_SYSCTRL_SYSCLKMUX) == 0)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* System reset via the watchdog timer
|
||||
*/
|
||||
void lpc32xx_watchdog_reset(void)
|
||||
{
|
||||
/* Make sure WDT clocks are enabled */
|
||||
__raw_writel(LPC32XX_CLKPWR_PWMCLK_WDOG_EN,
|
||||
LPC32XX_CLKPWR_TIMER_CLK_CTRL);
|
||||
|
||||
/* Instant assert of RESETOUT_N with pulse length 1mS */
|
||||
__raw_writel(13000, io_p2v(LPC32XX_WDTIM_BASE + 0x18));
|
||||
__raw_writel(0x70, io_p2v(LPC32XX_WDTIM_BASE + 0xC));
|
||||
}
|
||||
|
||||
/*
|
||||
* Detects and returns IRAM size for the device variation
|
||||
*/
|
||||
#define LPC32XX_IRAM_BANK_SIZE SZ_128K
|
||||
static u32 iram_size;
|
||||
u32 lpc32xx_return_iram_size(void)
|
||||
{
|
||||
if (iram_size == 0) {
|
||||
u32 savedval1, savedval2;
|
||||
void __iomem *iramptr1, *iramptr2;
|
||||
|
||||
iramptr1 = io_p2v(LPC32XX_IRAM_BASE);
|
||||
iramptr2 = io_p2v(LPC32XX_IRAM_BASE + LPC32XX_IRAM_BANK_SIZE);
|
||||
savedval1 = __raw_readl(iramptr1);
|
||||
savedval2 = __raw_readl(iramptr2);
|
||||
|
||||
if (savedval1 == savedval2) {
|
||||
__raw_writel(savedval2 + 1, iramptr2);
|
||||
if (__raw_readl(iramptr1) == savedval2 + 1)
|
||||
iram_size = LPC32XX_IRAM_BANK_SIZE;
|
||||
else
|
||||
iram_size = LPC32XX_IRAM_BANK_SIZE * 2;
|
||||
__raw_writel(savedval2, iramptr2);
|
||||
} else
|
||||
iram_size = LPC32XX_IRAM_BANK_SIZE * 2;
|
||||
}
|
||||
|
||||
return iram_size;
|
||||
}
|
||||
|
||||
/*
|
||||
* Computes PLL rate from PLL register and input clock
|
||||
*/
|
||||
u32 clk_check_pll_setup(u32 ifreq, struct clk_pll_setup *pllsetup)
|
||||
{
|
||||
u32 ilfreq, p, m, n, fcco, fref, cfreq;
|
||||
int mode;
|
||||
|
||||
/*
|
||||
* PLL requirements
|
||||
* ifreq must be >= 1MHz and <= 20MHz
|
||||
* FCCO must be >= 156MHz and <= 320MHz
|
||||
* FREF must be >= 1MHz and <= 27MHz
|
||||
* Assume the passed input data is not valid
|
||||
*/
|
||||
|
||||
ilfreq = ifreq;
|
||||
m = pllsetup->pll_m;
|
||||
n = pllsetup->pll_n;
|
||||
p = pllsetup->pll_p;
|
||||
|
||||
mode = (pllsetup->cco_bypass_b15 << 2) |
|
||||
(pllsetup->direct_output_b14 << 1) |
|
||||
pllsetup->fdbk_div_ctrl_b13;
|
||||
|
||||
switch (mode) {
|
||||
case 0x0: /* Non-integer mode */
|
||||
cfreq = (m * ilfreq) / (2 * p * n);
|
||||
fcco = (m * ilfreq) / n;
|
||||
fref = ilfreq / n;
|
||||
break;
|
||||
|
||||
case 0x1: /* integer mode */
|
||||
cfreq = (m * ilfreq) / n;
|
||||
fcco = (m * ilfreq) / (n * 2 * p);
|
||||
fref = ilfreq / n;
|
||||
break;
|
||||
|
||||
case 0x2:
|
||||
case 0x3: /* Direct mode */
|
||||
cfreq = (m * ilfreq) / n;
|
||||
fcco = cfreq;
|
||||
fref = ilfreq / n;
|
||||
break;
|
||||
|
||||
case 0x4:
|
||||
case 0x5: /* Bypass mode */
|
||||
cfreq = ilfreq / (2 * p);
|
||||
fcco = 156000000;
|
||||
fref = 1000000;
|
||||
break;
|
||||
|
||||
case 0x6:
|
||||
case 0x7: /* Direct bypass mode */
|
||||
default:
|
||||
cfreq = ilfreq;
|
||||
fcco = 156000000;
|
||||
fref = 1000000;
|
||||
break;
|
||||
}
|
||||
|
||||
if (fcco < 156000000 || fcco > 320000000)
|
||||
cfreq = 0;
|
||||
|
||||
if (fref < 1000000 || fref > 27000000)
|
||||
cfreq = 0;
|
||||
|
||||
return (u32) cfreq;
|
||||
}
|
||||
|
||||
u32 clk_get_pclk_div(void)
|
||||
{
|
||||
return 1 + ((__raw_readl(LPC32XX_CLKPWR_HCLK_DIV) >> 2) & 0x1F);
|
||||
}
|
||||
|
||||
static struct map_desc lpc32xx_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = IO_ADDRESS(LPC32XX_AHB0_START),
|
||||
.pfn = __phys_to_pfn(LPC32XX_AHB0_START),
|
||||
.length = LPC32XX_AHB0_SIZE,
|
||||
.type = MT_DEVICE
|
||||
},
|
||||
{
|
||||
.virtual = IO_ADDRESS(LPC32XX_AHB1_START),
|
||||
.pfn = __phys_to_pfn(LPC32XX_AHB1_START),
|
||||
.length = LPC32XX_AHB1_SIZE,
|
||||
.type = MT_DEVICE
|
||||
},
|
||||
{
|
||||
.virtual = IO_ADDRESS(LPC32XX_FABAPB_START),
|
||||
.pfn = __phys_to_pfn(LPC32XX_FABAPB_START),
|
||||
.length = LPC32XX_FABAPB_SIZE,
|
||||
.type = MT_DEVICE
|
||||
},
|
||||
{
|
||||
.virtual = IO_ADDRESS(LPC32XX_IRAM_BASE),
|
||||
.pfn = __phys_to_pfn(LPC32XX_IRAM_BASE),
|
||||
.length = (LPC32XX_IRAM_BANK_SIZE * 2),
|
||||
.type = MT_DEVICE
|
||||
},
|
||||
};
|
||||
|
||||
void __init lpc32xx_map_io(void)
|
||||
{
|
||||
iotable_init(lpc32xx_io_desc, ARRAY_SIZE(lpc32xx_io_desc));
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/common.h
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2009-2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __LPC32XX_COMMON_H
|
||||
#define __LPC32XX_COMMON_H
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
/*
|
||||
* Arch specific platform device structures
|
||||
*/
|
||||
extern struct platform_device lpc32xx_watchdog_device;
|
||||
extern struct platform_device lpc32xx_i2c0_device;
|
||||
extern struct platform_device lpc32xx_i2c1_device;
|
||||
extern struct platform_device lpc32xx_i2c2_device;
|
||||
|
||||
/*
|
||||
* Other arch specific structures and functions
|
||||
*/
|
||||
extern struct sys_timer lpc32xx_timer;
|
||||
extern void __init lpc32xx_init_irq(void);
|
||||
extern void __init lpc32xx_map_io(void);
|
||||
extern void __init lpc32xx_serial_init(void);
|
||||
extern void __init lpc32xx_gpio_init(void);
|
||||
|
||||
/*
|
||||
* Structure used for setting up and querying the PLLS
|
||||
*/
|
||||
struct clk_pll_setup {
|
||||
int analog_on;
|
||||
int cco_bypass_b15;
|
||||
int direct_output_b14;
|
||||
int fdbk_div_ctrl_b13;
|
||||
int pll_p;
|
||||
int pll_n;
|
||||
u32 pll_m;
|
||||
};
|
||||
|
||||
extern int clk_is_sysclk_mainosc(void);
|
||||
extern u32 clk_check_pll_setup(u32 ifreq, struct clk_pll_setup *pllsetup);
|
||||
extern u32 clk_get_pllrate_from_reg(u32 inputclk, u32 regval);
|
||||
extern u32 clk_get_pclk_div(void);
|
||||
|
||||
/*
|
||||
* Returns the LPC32xx unique 128-bit chip ID
|
||||
*/
|
||||
extern void lpc32xx_get_uid(u32 devid[4]);
|
||||
|
||||
extern void lpc32xx_watchdog_reset(void);
|
||||
extern u32 lpc32xx_return_iram_size(void);
|
||||
|
||||
/*
|
||||
* Pointers used for sizing and copying suspend function data
|
||||
*/
|
||||
extern int lpc32xx_sys_suspend(void);
|
||||
extern int lpc32xx_sys_suspend_sz;
|
||||
|
||||
#endif
|
|
@ -0,0 +1,446 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/gpiolib.c
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/platform.h>
|
||||
#include "common.h"
|
||||
|
||||
#define LPC32XX_GPIO_P3_INP_STATE _GPREG(0x000)
|
||||
#define LPC32XX_GPIO_P3_OUTP_SET _GPREG(0x004)
|
||||
#define LPC32XX_GPIO_P3_OUTP_CLR _GPREG(0x008)
|
||||
#define LPC32XX_GPIO_P3_OUTP_STATE _GPREG(0x00C)
|
||||
#define LPC32XX_GPIO_P2_DIR_SET _GPREG(0x010)
|
||||
#define LPC32XX_GPIO_P2_DIR_CLR _GPREG(0x014)
|
||||
#define LPC32XX_GPIO_P2_DIR_STATE _GPREG(0x018)
|
||||
#define LPC32XX_GPIO_P2_INP_STATE _GPREG(0x01C)
|
||||
#define LPC32XX_GPIO_P2_OUTP_SET _GPREG(0x020)
|
||||
#define LPC32XX_GPIO_P2_OUTP_CLR _GPREG(0x024)
|
||||
#define LPC32XX_GPIO_P2_MUX_SET _GPREG(0x028)
|
||||
#define LPC32XX_GPIO_P2_MUX_CLR _GPREG(0x02C)
|
||||
#define LPC32XX_GPIO_P2_MUX_STATE _GPREG(0x030)
|
||||
#define LPC32XX_GPIO_P0_INP_STATE _GPREG(0x040)
|
||||
#define LPC32XX_GPIO_P0_OUTP_SET _GPREG(0x044)
|
||||
#define LPC32XX_GPIO_P0_OUTP_CLR _GPREG(0x048)
|
||||
#define LPC32XX_GPIO_P0_OUTP_STATE _GPREG(0x04C)
|
||||
#define LPC32XX_GPIO_P0_DIR_SET _GPREG(0x050)
|
||||
#define LPC32XX_GPIO_P0_DIR_CLR _GPREG(0x054)
|
||||
#define LPC32XX_GPIO_P0_DIR_STATE _GPREG(0x058)
|
||||
#define LPC32XX_GPIO_P1_INP_STATE _GPREG(0x060)
|
||||
#define LPC32XX_GPIO_P1_OUTP_SET _GPREG(0x064)
|
||||
#define LPC32XX_GPIO_P1_OUTP_CLR _GPREG(0x068)
|
||||
#define LPC32XX_GPIO_P1_OUTP_STATE _GPREG(0x06C)
|
||||
#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 GPIO3_PIN_TO_BIT(x) (1 << ((x) + 25))
|
||||
#define GPO3_PIN_TO_BIT(x) (1 << (x))
|
||||
#define GPIO012_PIN_IN_SEL(x, y) (((x) >> (y)) & 1)
|
||||
#define GPIO3_PIN_IN_SHIFT(x) ((x) == 5 ? 24 : 10 + (x))
|
||||
#define GPIO3_PIN_IN_SEL(x, y) ((x) >> GPIO3_PIN_IN_SHIFT(y))
|
||||
#define GPIO3_PIN5_IN_SEL(x) (((x) >> 24) & 1)
|
||||
#define GPI3_PIN_IN_SEL(x, y) (((x) >> (y)) & 1)
|
||||
|
||||
struct gpio_regs {
|
||||
void __iomem *inp_state;
|
||||
void __iomem *outp_set;
|
||||
void __iomem *outp_clr;
|
||||
void __iomem *dir_set;
|
||||
void __iomem *dir_clr;
|
||||
};
|
||||
|
||||
/*
|
||||
* GPIO names
|
||||
*/
|
||||
static const char *gpio_p0_names[LPC32XX_GPIO_P0_MAX] = {
|
||||
"p0.0", "p0.1", "p0.2", "p0.3",
|
||||
"p0.4", "p0.5", "p0.6", "p0.7"
|
||||
};
|
||||
|
||||
static const char *gpio_p1_names[LPC32XX_GPIO_P1_MAX] = {
|
||||
"p1.0", "p1.1", "p1.2", "p1.3",
|
||||
"p1.4", "p1.5", "p1.6", "p1.7",
|
||||
"p1.8", "p1.9", "p1.10", "p1.11",
|
||||
"p1.12", "p1.13", "p1.14", "p1.15",
|
||||
"p1.16", "p1.17", "p1.18", "p1.19",
|
||||
"p1.20", "p1.21", "p1.22", "p1.23",
|
||||
};
|
||||
|
||||
static const char *gpio_p2_names[LPC32XX_GPIO_P2_MAX] = {
|
||||
"p2.0", "p2.1", "p2.2", "p2.3",
|
||||
"p2.4", "p2.5", "p2.6", "p2.7",
|
||||
"p2.8", "p2.9", "p2.10", "p2.11",
|
||||
"p2.12"
|
||||
};
|
||||
|
||||
static const char *gpio_p3_names[LPC32XX_GPIO_P3_MAX] = {
|
||||
"gpi000", "gpio01", "gpio02", "gpio03",
|
||||
"gpio04", "gpio05"
|
||||
};
|
||||
|
||||
static const char *gpi_p3_names[LPC32XX_GPI_P3_MAX] = {
|
||||
"gpi00", "gpi01", "gpi02", "gpi03",
|
||||
"gpi04", "gpi05", "gpi06", "gpi07",
|
||||
"gpi08", "gpi09", NULL, NULL,
|
||||
NULL, NULL, NULL, "gpi15",
|
||||
"gpi16", "gpi17", "gpi18", "gpi19",
|
||||
"gpi20", "gpi21", "gpi22", "gpi23",
|
||||
"gpi24", "gpi25", "gpi26", "gpi27"
|
||||
};
|
||||
|
||||
static const char *gpo_p3_names[LPC32XX_GPO_P3_MAX] = {
|
||||
"gpo00", "gpo01", "gpo02", "gpo03",
|
||||
"gpo04", "gpo05", "gpo06", "gpo07",
|
||||
"gpo08", "gpo09", "gpo10", "gpo11",
|
||||
"gpo12", "gpo13", "gpo14", "gpo15",
|
||||
"gpo16", "gpo17", "gpo18", "gpo19",
|
||||
"gpo20", "gpo21", "gpo22", "gpo23"
|
||||
};
|
||||
|
||||
static struct gpio_regs gpio_grp_regs_p0 = {
|
||||
.inp_state = LPC32XX_GPIO_P0_INP_STATE,
|
||||
.outp_set = LPC32XX_GPIO_P0_OUTP_SET,
|
||||
.outp_clr = LPC32XX_GPIO_P0_OUTP_CLR,
|
||||
.dir_set = LPC32XX_GPIO_P0_DIR_SET,
|
||||
.dir_clr = LPC32XX_GPIO_P0_DIR_CLR,
|
||||
};
|
||||
|
||||
static struct gpio_regs gpio_grp_regs_p1 = {
|
||||
.inp_state = LPC32XX_GPIO_P1_INP_STATE,
|
||||
.outp_set = LPC32XX_GPIO_P1_OUTP_SET,
|
||||
.outp_clr = LPC32XX_GPIO_P1_OUTP_CLR,
|
||||
.dir_set = LPC32XX_GPIO_P1_DIR_SET,
|
||||
.dir_clr = LPC32XX_GPIO_P1_DIR_CLR,
|
||||
};
|
||||
|
||||
static struct gpio_regs gpio_grp_regs_p2 = {
|
||||
.inp_state = LPC32XX_GPIO_P2_INP_STATE,
|
||||
.outp_set = LPC32XX_GPIO_P2_OUTP_SET,
|
||||
.outp_clr = LPC32XX_GPIO_P2_OUTP_CLR,
|
||||
.dir_set = LPC32XX_GPIO_P2_DIR_SET,
|
||||
.dir_clr = LPC32XX_GPIO_P2_DIR_CLR,
|
||||
};
|
||||
|
||||
static struct gpio_regs gpio_grp_regs_p3 = {
|
||||
.inp_state = LPC32XX_GPIO_P3_INP_STATE,
|
||||
.outp_set = LPC32XX_GPIO_P3_OUTP_SET,
|
||||
.outp_clr = LPC32XX_GPIO_P3_OUTP_CLR,
|
||||
.dir_set = LPC32XX_GPIO_P2_DIR_SET,
|
||||
.dir_clr = LPC32XX_GPIO_P2_DIR_CLR,
|
||||
};
|
||||
|
||||
struct lpc32xx_gpio_chip {
|
||||
struct gpio_chip chip;
|
||||
struct gpio_regs *gpio_grp;
|
||||
};
|
||||
|
||||
static inline struct lpc32xx_gpio_chip *to_lpc32xx_gpio(
|
||||
struct gpio_chip *gpc)
|
||||
{
|
||||
return container_of(gpc, struct lpc32xx_gpio_chip, chip);
|
||||
}
|
||||
|
||||
static void __set_gpio_dir_p012(struct lpc32xx_gpio_chip *group,
|
||||
unsigned pin, int input)
|
||||
{
|
||||
if (input)
|
||||
__raw_writel(GPIO012_PIN_TO_BIT(pin),
|
||||
group->gpio_grp->dir_clr);
|
||||
else
|
||||
__raw_writel(GPIO012_PIN_TO_BIT(pin),
|
||||
group->gpio_grp->dir_set);
|
||||
}
|
||||
|
||||
static void __set_gpio_dir_p3(struct lpc32xx_gpio_chip *group,
|
||||
unsigned pin, int input)
|
||||
{
|
||||
u32 u = GPIO3_PIN_TO_BIT(pin);
|
||||
|
||||
if (input)
|
||||
__raw_writel(u, group->gpio_grp->dir_clr);
|
||||
else
|
||||
__raw_writel(u, group->gpio_grp->dir_set);
|
||||
}
|
||||
|
||||
static void __set_gpio_level_p012(struct lpc32xx_gpio_chip *group,
|
||||
unsigned pin, int high)
|
||||
{
|
||||
if (high)
|
||||
__raw_writel(GPIO012_PIN_TO_BIT(pin),
|
||||
group->gpio_grp->outp_set);
|
||||
else
|
||||
__raw_writel(GPIO012_PIN_TO_BIT(pin),
|
||||
group->gpio_grp->outp_clr);
|
||||
}
|
||||
|
||||
static void __set_gpio_level_p3(struct lpc32xx_gpio_chip *group,
|
||||
unsigned pin, int high)
|
||||
{
|
||||
u32 u = GPIO3_PIN_TO_BIT(pin);
|
||||
|
||||
if (high)
|
||||
__raw_writel(u, group->gpio_grp->outp_set);
|
||||
else
|
||||
__raw_writel(u, group->gpio_grp->outp_clr);
|
||||
}
|
||||
|
||||
static void __set_gpo_level_p3(struct lpc32xx_gpio_chip *group,
|
||||
unsigned pin, int high)
|
||||
{
|
||||
if (high)
|
||||
__raw_writel(GPO3_PIN_TO_BIT(pin), group->gpio_grp->outp_set);
|
||||
else
|
||||
__raw_writel(GPO3_PIN_TO_BIT(pin), group->gpio_grp->outp_clr);
|
||||
}
|
||||
|
||||
static int __get_gpio_state_p012(struct lpc32xx_gpio_chip *group,
|
||||
unsigned pin)
|
||||
{
|
||||
return GPIO012_PIN_IN_SEL(__raw_readl(group->gpio_grp->inp_state),
|
||||
pin);
|
||||
}
|
||||
|
||||
static int __get_gpio_state_p3(struct lpc32xx_gpio_chip *group,
|
||||
unsigned pin)
|
||||
{
|
||||
int state = __raw_readl(group->gpio_grp->inp_state);
|
||||
|
||||
/*
|
||||
* P3 GPIO pin input mapping is not contiguous, GPIOP3-0..4 is mapped
|
||||
* to bits 10..14, while GPIOP3-5 is mapped to bit 24.
|
||||
*/
|
||||
return GPIO3_PIN_IN_SEL(state, pin);
|
||||
}
|
||||
|
||||
static int __get_gpi_state_p3(struct lpc32xx_gpio_chip *group,
|
||||
unsigned pin)
|
||||
{
|
||||
return GPI3_PIN_IN_SEL(__raw_readl(group->gpio_grp->inp_state), pin);
|
||||
}
|
||||
|
||||
/*
|
||||
* GENERIC_GPIO primitives.
|
||||
*/
|
||||
static int lpc32xx_gpio_dir_input_p012(struct gpio_chip *chip,
|
||||
unsigned pin)
|
||||
{
|
||||
struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip);
|
||||
|
||||
__set_gpio_dir_p012(group, pin, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lpc32xx_gpio_dir_input_p3(struct gpio_chip *chip,
|
||||
unsigned pin)
|
||||
{
|
||||
struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip);
|
||||
|
||||
__set_gpio_dir_p3(group, pin, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lpc32xx_gpio_dir_in_always(struct gpio_chip *chip,
|
||||
unsigned pin)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lpc32xx_gpio_get_value_p012(struct gpio_chip *chip, unsigned pin)
|
||||
{
|
||||
struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip);
|
||||
|
||||
return __get_gpio_state_p012(group, pin);
|
||||
}
|
||||
|
||||
static int lpc32xx_gpio_get_value_p3(struct gpio_chip *chip, unsigned pin)
|
||||
{
|
||||
struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip);
|
||||
|
||||
return __get_gpio_state_p3(group, pin);
|
||||
}
|
||||
|
||||
static int lpc32xx_gpi_get_value(struct gpio_chip *chip, unsigned pin)
|
||||
{
|
||||
struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip);
|
||||
|
||||
return __get_gpi_state_p3(group, pin);
|
||||
}
|
||||
|
||||
static int lpc32xx_gpio_dir_output_p012(struct gpio_chip *chip, unsigned pin,
|
||||
int value)
|
||||
{
|
||||
struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip);
|
||||
|
||||
__set_gpio_dir_p012(group, pin, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lpc32xx_gpio_dir_output_p3(struct gpio_chip *chip, unsigned pin,
|
||||
int value)
|
||||
{
|
||||
struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip);
|
||||
|
||||
__set_gpio_dir_p3(group, pin, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lpc32xx_gpio_dir_out_always(struct gpio_chip *chip, unsigned pin,
|
||||
int value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void lpc32xx_gpio_set_value_p012(struct gpio_chip *chip, unsigned pin,
|
||||
int value)
|
||||
{
|
||||
struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip);
|
||||
|
||||
__set_gpio_level_p012(group, pin, value);
|
||||
}
|
||||
|
||||
static void lpc32xx_gpio_set_value_p3(struct gpio_chip *chip, unsigned pin,
|
||||
int value)
|
||||
{
|
||||
struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip);
|
||||
|
||||
__set_gpio_level_p3(group, pin, value);
|
||||
}
|
||||
|
||||
static void lpc32xx_gpo_set_value(struct gpio_chip *chip, unsigned pin,
|
||||
int value)
|
||||
{
|
||||
struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip);
|
||||
|
||||
__set_gpo_level_p3(group, pin, value);
|
||||
}
|
||||
|
||||
static int lpc32xx_gpio_request(struct gpio_chip *chip, unsigned pin)
|
||||
{
|
||||
if (pin < chip->ngpio)
|
||||
return 0;
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static struct lpc32xx_gpio_chip lpc32xx_gpiochip[] = {
|
||||
{
|
||||
.chip = {
|
||||
.label = "gpio_p0",
|
||||
.direction_input = lpc32xx_gpio_dir_input_p012,
|
||||
.get = lpc32xx_gpio_get_value_p012,
|
||||
.direction_output = lpc32xx_gpio_dir_output_p012,
|
||||
.set = lpc32xx_gpio_set_value_p012,
|
||||
.request = lpc32xx_gpio_request,
|
||||
.base = LPC32XX_GPIO_P0_GRP,
|
||||
.ngpio = LPC32XX_GPIO_P0_MAX,
|
||||
.names = gpio_p0_names,
|
||||
.can_sleep = 0,
|
||||
},
|
||||
.gpio_grp = &gpio_grp_regs_p0,
|
||||
},
|
||||
{
|
||||
.chip = {
|
||||
.label = "gpio_p1",
|
||||
.direction_input = lpc32xx_gpio_dir_input_p012,
|
||||
.get = lpc32xx_gpio_get_value_p012,
|
||||
.direction_output = lpc32xx_gpio_dir_output_p012,
|
||||
.set = lpc32xx_gpio_set_value_p012,
|
||||
.request = lpc32xx_gpio_request,
|
||||
.base = LPC32XX_GPIO_P1_GRP,
|
||||
.ngpio = LPC32XX_GPIO_P1_MAX,
|
||||
.names = gpio_p1_names,
|
||||
.can_sleep = 0,
|
||||
},
|
||||
.gpio_grp = &gpio_grp_regs_p1,
|
||||
},
|
||||
{
|
||||
.chip = {
|
||||
.label = "gpio_p2",
|
||||
.direction_input = lpc32xx_gpio_dir_input_p012,
|
||||
.get = lpc32xx_gpio_get_value_p012,
|
||||
.direction_output = lpc32xx_gpio_dir_output_p012,
|
||||
.set = lpc32xx_gpio_set_value_p012,
|
||||
.request = lpc32xx_gpio_request,
|
||||
.base = LPC32XX_GPIO_P2_GRP,
|
||||
.ngpio = LPC32XX_GPIO_P2_MAX,
|
||||
.names = gpio_p2_names,
|
||||
.can_sleep = 0,
|
||||
},
|
||||
.gpio_grp = &gpio_grp_regs_p2,
|
||||
},
|
||||
{
|
||||
.chip = {
|
||||
.label = "gpio_p3",
|
||||
.direction_input = lpc32xx_gpio_dir_input_p3,
|
||||
.get = lpc32xx_gpio_get_value_p3,
|
||||
.direction_output = lpc32xx_gpio_dir_output_p3,
|
||||
.set = lpc32xx_gpio_set_value_p3,
|
||||
.request = lpc32xx_gpio_request,
|
||||
.base = LPC32XX_GPIO_P3_GRP,
|
||||
.ngpio = LPC32XX_GPIO_P3_MAX,
|
||||
.names = gpio_p3_names,
|
||||
.can_sleep = 0,
|
||||
},
|
||||
.gpio_grp = &gpio_grp_regs_p3,
|
||||
},
|
||||
{
|
||||
.chip = {
|
||||
.label = "gpi_p3",
|
||||
.direction_input = lpc32xx_gpio_dir_in_always,
|
||||
.get = lpc32xx_gpi_get_value,
|
||||
.request = lpc32xx_gpio_request,
|
||||
.base = LPC32XX_GPI_P3_GRP,
|
||||
.ngpio = LPC32XX_GPI_P3_MAX,
|
||||
.names = gpi_p3_names,
|
||||
.can_sleep = 0,
|
||||
},
|
||||
.gpio_grp = &gpio_grp_regs_p3,
|
||||
},
|
||||
{
|
||||
.chip = {
|
||||
.label = "gpo_p3",
|
||||
.direction_output = lpc32xx_gpio_dir_out_always,
|
||||
.set = lpc32xx_gpo_set_value,
|
||||
.request = lpc32xx_gpio_request,
|
||||
.base = LPC32XX_GPO_P3_GRP,
|
||||
.ngpio = LPC32XX_GPO_P3_MAX,
|
||||
.names = gpo_p3_names,
|
||||
.can_sleep = 0,
|
||||
},
|
||||
.gpio_grp = &gpio_grp_regs_p3,
|
||||
},
|
||||
};
|
||||
|
||||
void __init lpc32xx_gpio_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(lpc32xx_gpiochip); i++)
|
||||
gpiochip_add(&lpc32xx_gpiochip[i].chip);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/include/mach/clkdev.h
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_CLKDEV_H
|
||||
#define __ASM_ARCH_CLKDEV_H
|
||||
|
||||
#define __clk_get(clk) ({ 1; })
|
||||
#define __clk_put(clk) do { } while (0)
|
||||
|
||||
#endif
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/include/mach/debug-macro.S
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Debug output is hardcoded to standard UART 5
|
||||
*/
|
||||
|
||||
.macro addruart,rx, tmp
|
||||
mrc p15, 0, \rx, c1, c0
|
||||
tst \rx, #1 @ MMU enabled?
|
||||
ldreq \rx, =0x40090000
|
||||
ldrne \rx, =0xF4090000
|
||||
.endm
|
||||
|
||||
#define UART_SHIFT 2
|
||||
#include <asm/hardware/debug-8250.S>
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/include/mach/entry-macro.S
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/platform.h>
|
||||
|
||||
#define LPC32XX_INTC_MASKED_STATUS_OFS 0x8
|
||||
|
||||
.macro disable_fiq
|
||||
.endm
|
||||
|
||||
.macro get_irqnr_preamble, base, tmp
|
||||
ldr \base, =IO_ADDRESS(LPC32XX_MIC_BASE)
|
||||
.endm
|
||||
|
||||
.macro arch_ret_to_user, tmp1, tmp2
|
||||
.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
|
||||
|
||||
.macro irq_prio_table
|
||||
.endm
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/include/mach/gpio.h
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_GPIO_H
|
||||
#define __ASM_ARCH_GPIO_H
|
||||
|
||||
#include <asm-generic/gpio.h>
|
||||
|
||||
/*
|
||||
* Note!
|
||||
* Muxed GP pins need to be setup to the GP state in the board level
|
||||
* code prior to using this driver.
|
||||
* GPI pins : 28xP3 group
|
||||
* GPO pins : 24xP3 group
|
||||
* GPIO pins: 8xP0 group, 24xP1 group, 13xP2 group, 6xP3 group
|
||||
*/
|
||||
|
||||
#define LPC32XX_GPIO_P0_MAX 8
|
||||
#define LPC32XX_GPIO_P1_MAX 24
|
||||
#define LPC32XX_GPIO_P2_MAX 13
|
||||
#define LPC32XX_GPIO_P3_MAX 6
|
||||
#define LPC32XX_GPI_P3_MAX 28
|
||||
#define LPC32XX_GPO_P3_MAX 24
|
||||
|
||||
#define LPC32XX_GPIO_P0_GRP 0
|
||||
#define LPC32XX_GPIO_P1_GRP (LPC32XX_GPIO_P0_GRP + LPC32XX_GPIO_P0_MAX)
|
||||
#define LPC32XX_GPIO_P2_GRP (LPC32XX_GPIO_P1_GRP + LPC32XX_GPIO_P1_MAX)
|
||||
#define LPC32XX_GPIO_P3_GRP (LPC32XX_GPIO_P2_GRP + LPC32XX_GPIO_P2_MAX)
|
||||
#define LPC32XX_GPI_P3_GRP (LPC32XX_GPIO_P3_GRP + LPC32XX_GPIO_P3_MAX)
|
||||
#define LPC32XX_GPO_P3_GRP (LPC32XX_GPI_P3_GRP + LPC32XX_GPI_P3_MAX)
|
||||
|
||||
/*
|
||||
* A specific GPIO can be selected with this macro
|
||||
* ie, GPIO_05 can be selected with LPC32XX_GPIO(LPC32XX_GPIO_P3_GRP, 5)
|
||||
* See the LPC32x0 User's guide for GPIO group numbers
|
||||
*/
|
||||
#define LPC32XX_GPIO(x, y) ((x) + (y))
|
||||
|
||||
static inline int gpio_get_value(unsigned gpio)
|
||||
{
|
||||
return __gpio_get_value(gpio);
|
||||
}
|
||||
|
||||
static inline void gpio_set_value(unsigned gpio, int value)
|
||||
{
|
||||
__gpio_set_value(gpio, value);
|
||||
}
|
||||
|
||||
static inline int gpio_cansleep(unsigned gpio)
|
||||
{
|
||||
return __gpio_cansleep(gpio);
|
||||
}
|
||||
|
||||
static inline int gpio_to_irq(unsigned gpio)
|
||||
{
|
||||
return __gpio_to_irq(gpio);
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/include/mach/hardware.h
|
||||
*
|
||||
* Copyright (c) 2005 MontaVista Software, Inc. <source@mvista.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#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) (((((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
|
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* PNX4008-specific tweaks for I2C IP3204 block
|
||||
*
|
||||
* Author: Vitaly Wool <vwool@ru.mvista.com>
|
||||
*
|
||||
* 2005 (c) MontaVista Software, Inc. This file is licensed under
|
||||
* the terms of the GNU General Public License version 2. This program
|
||||
* is licensed "as is" without any warranty of any kind, whether express
|
||||
* or implied.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_I2C_H
|
||||
#define __ASM_ARCH_I2C_H
|
||||
|
||||
enum {
|
||||
mstatus_tdi = 0x00000001,
|
||||
mstatus_afi = 0x00000002,
|
||||
mstatus_nai = 0x00000004,
|
||||
mstatus_drmi = 0x00000008,
|
||||
mstatus_active = 0x00000020,
|
||||
mstatus_scl = 0x00000040,
|
||||
mstatus_sda = 0x00000080,
|
||||
mstatus_rff = 0x00000100,
|
||||
mstatus_rfe = 0x00000200,
|
||||
mstatus_tff = 0x00000400,
|
||||
mstatus_tfe = 0x00000800,
|
||||
};
|
||||
|
||||
enum {
|
||||
mcntrl_tdie = 0x00000001,
|
||||
mcntrl_afie = 0x00000002,
|
||||
mcntrl_naie = 0x00000004,
|
||||
mcntrl_drmie = 0x00000008,
|
||||
mcntrl_daie = 0x00000020,
|
||||
mcntrl_rffie = 0x00000040,
|
||||
mcntrl_tffie = 0x00000080,
|
||||
mcntrl_reset = 0x00000100,
|
||||
mcntrl_cdbmode = 0x00000400,
|
||||
};
|
||||
|
||||
enum {
|
||||
rw_bit = 1 << 0,
|
||||
start_bit = 1 << 8,
|
||||
stop_bit = 1 << 9,
|
||||
};
|
||||
|
||||
#define I2C_REG_RX(a) ((a)->ioaddr) /* Rx FIFO reg (RO) */
|
||||
#define I2C_REG_TX(a) ((a)->ioaddr) /* Tx FIFO reg (WO) */
|
||||
#define I2C_REG_STS(a) ((a)->ioaddr + 0x04) /* Status reg (RO) */
|
||||
#define I2C_REG_CTL(a) ((a)->ioaddr + 0x08) /* Ctl reg */
|
||||
#define I2C_REG_CKL(a) ((a)->ioaddr + 0x0c) /* Clock divider low */
|
||||
#define I2C_REG_CKH(a) ((a)->ioaddr + 0x10) /* Clock divider high */
|
||||
#define I2C_REG_ADR(a) ((a)->ioaddr + 0x14) /* I2C address */
|
||||
#define I2C_REG_RFL(a) ((a)->ioaddr + 0x18) /* Rx FIFO level (RO) */
|
||||
#define I2C_REG_TFL(a) ((a)->ioaddr + 0x1c) /* Tx FIFO level (RO) */
|
||||
#define I2C_REG_RXB(a) ((a)->ioaddr + 0x20) /* Num of bytes Rx-ed (RO) */
|
||||
#define I2C_REG_TXB(a) ((a)->ioaddr + 0x24) /* Num of bytes Tx-ed (RO) */
|
||||
#define I2C_REG_TXS(a) ((a)->ioaddr + 0x28) /* Tx slave FIFO (RO) */
|
||||
#define I2C_REG_STFL(a) ((a)->ioaddr + 0x2c) /* Tx slave FIFO level (RO) */
|
||||
|
||||
#define I2C_CHIP_NAME "PNX4008-I2C"
|
||||
|
||||
#endif /* __ASM_ARCH_I2C_H */
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/include/mach/io.h
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARM_ARCH_IO_H
|
||||
#define __ASM_ARM_ARCH_IO_H
|
||||
|
||||
#define IO_SPACE_LIMIT 0xffffffff
|
||||
|
||||
#define __io(a) __typesafe_io(a)
|
||||
#define __mem_pci(a) (a)
|
||||
|
||||
#endif
|
|
@ -0,0 +1,117 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/include/mach/irqs.h
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARM_ARCH_IRQS_H
|
||||
#define __ASM_ARM_ARCH_IRQS_H
|
||||
|
||||
#define LPC32XX_SIC1_IRQ(n) (32 + (n))
|
||||
#define LPC32XX_SIC2_IRQ(n) (64 + (n))
|
||||
|
||||
/*
|
||||
* MIC interrupts
|
||||
*/
|
||||
#define IRQ_LPC32XX_SUB1IRQ 0
|
||||
#define IRQ_LPC32XX_SUB2IRQ 1
|
||||
#define IRQ_LPC32XX_PWM3 3
|
||||
#define IRQ_LPC32XX_PWM4 4
|
||||
#define IRQ_LPC32XX_HSTIMER 5
|
||||
#define IRQ_LPC32XX_WATCH 6
|
||||
#define IRQ_LPC32XX_UART_IIR3 7
|
||||
#define IRQ_LPC32XX_UART_IIR4 8
|
||||
#define IRQ_LPC32XX_UART_IIR5 9
|
||||
#define IRQ_LPC32XX_UART_IIR6 10
|
||||
#define IRQ_LPC32XX_FLASH 11
|
||||
#define IRQ_LPC32XX_SD1 13
|
||||
#define IRQ_LPC32XX_LCD 14
|
||||
#define IRQ_LPC32XX_SD0 15
|
||||
#define IRQ_LPC32XX_TIMER0 16
|
||||
#define IRQ_LPC32XX_TIMER1 17
|
||||
#define IRQ_LPC32XX_TIMER2 18
|
||||
#define IRQ_LPC32XX_TIMER3 19
|
||||
#define IRQ_LPC32XX_SSP0 20
|
||||
#define IRQ_LPC32XX_SSP1 21
|
||||
#define IRQ_LPC32XX_I2S0 22
|
||||
#define IRQ_LPC32XX_I2S1 23
|
||||
#define IRQ_LPC32XX_UART_IIR7 24
|
||||
#define IRQ_LPC32XX_UART_IIR2 25
|
||||
#define IRQ_LPC32XX_UART_IIR1 26
|
||||
#define IRQ_LPC32XX_MSTIMER 27
|
||||
#define IRQ_LPC32XX_DMA 28
|
||||
#define IRQ_LPC32XX_ETHERNET 29
|
||||
#define IRQ_LPC32XX_SUB1FIQ 30
|
||||
#define IRQ_LPC32XX_SUB2FIQ 31
|
||||
|
||||
/*
|
||||
* SIC1 interrupts start at offset 32
|
||||
*/
|
||||
#define IRQ_LPC32XX_JTAG_COMM_TX LPC32XX_SIC1_IRQ(1)
|
||||
#define IRQ_LPC32XX_JTAG_COMM_RX LPC32XX_SIC1_IRQ(2)
|
||||
#define IRQ_LPC32XX_GPI_11 LPC32XX_SIC1_IRQ(4)
|
||||
#define IRQ_LPC32XX_TS_P LPC32XX_SIC1_IRQ(6)
|
||||
#define IRQ_LPC32XX_TS_IRQ LPC32XX_SIC1_IRQ(7)
|
||||
#define IRQ_LPC32XX_TS_AUX LPC32XX_SIC1_IRQ(8)
|
||||
#define IRQ_LPC32XX_SPI2 LPC32XX_SIC1_IRQ(12)
|
||||
#define IRQ_LPC32XX_PLLUSB LPC32XX_SIC1_IRQ(13)
|
||||
#define IRQ_LPC32XX_PLLHCLK LPC32XX_SIC1_IRQ(14)
|
||||
#define IRQ_LPC32XX_PLL397 LPC32XX_SIC1_IRQ(17)
|
||||
#define IRQ_LPC32XX_I2C_2 LPC32XX_SIC1_IRQ(18)
|
||||
#define IRQ_LPC32XX_I2C_1 LPC32XX_SIC1_IRQ(19)
|
||||
#define IRQ_LPC32XX_RTC LPC32XX_SIC1_IRQ(20)
|
||||
#define IRQ_LPC32XX_KEY LPC32XX_SIC1_IRQ(22)
|
||||
#define IRQ_LPC32XX_SPI1 LPC32XX_SIC1_IRQ(23)
|
||||
#define IRQ_LPC32XX_SW LPC32XX_SIC1_IRQ(24)
|
||||
#define IRQ_LPC32XX_USB_OTG_TIMER LPC32XX_SIC1_IRQ(25)
|
||||
#define IRQ_LPC32XX_USB_OTG_ATX LPC32XX_SIC1_IRQ(26)
|
||||
#define IRQ_LPC32XX_USB_HOST LPC32XX_SIC1_IRQ(27)
|
||||
#define IRQ_LPC32XX_USB_DEV_DMA LPC32XX_SIC1_IRQ(28)
|
||||
#define IRQ_LPC32XX_USB_DEV_LP LPC32XX_SIC1_IRQ(29)
|
||||
#define IRQ_LPC32XX_USB_DEV_HP LPC32XX_SIC1_IRQ(30)
|
||||
#define IRQ_LPC32XX_USB_I2C LPC32XX_SIC1_IRQ(31)
|
||||
|
||||
/*
|
||||
* SIC2 interrupts start at offset 64
|
||||
*/
|
||||
#define IRQ_LPC32XX_GPIO_00 LPC32XX_SIC2_IRQ(0)
|
||||
#define IRQ_LPC32XX_GPIO_01 LPC32XX_SIC2_IRQ(1)
|
||||
#define IRQ_LPC32XX_GPIO_02 LPC32XX_SIC2_IRQ(2)
|
||||
#define IRQ_LPC32XX_GPIO_03 LPC32XX_SIC2_IRQ(3)
|
||||
#define IRQ_LPC32XX_GPIO_04 LPC32XX_SIC2_IRQ(4)
|
||||
#define IRQ_LPC32XX_GPIO_05 LPC32XX_SIC2_IRQ(5)
|
||||
#define IRQ_LPC32XX_SPI2_DATAIN LPC32XX_SIC2_IRQ(6)
|
||||
#define IRQ_LPC32XX_U2_HCTS LPC32XX_SIC2_IRQ(7)
|
||||
#define IRQ_LPC32XX_P0_P1_IRQ LPC32XX_SIC2_IRQ(8)
|
||||
#define IRQ_LPC32XX_GPI_08 LPC32XX_SIC2_IRQ(9)
|
||||
#define IRQ_LPC32XX_GPI_09 LPC32XX_SIC2_IRQ(10)
|
||||
#define IRQ_LPC32XX_GPI_19 LPC32XX_SIC2_IRQ(11)
|
||||
#define IRQ_LPC32XX_U7_HCTS LPC32XX_SIC2_IRQ(12)
|
||||
#define IRQ_LPC32XX_GPI_07 LPC32XX_SIC2_IRQ(15)
|
||||
#define IRQ_LPC32XX_SDIO LPC32XX_SIC2_IRQ(18)
|
||||
#define IRQ_LPC32XX_U5_RX LPC32XX_SIC2_IRQ(19)
|
||||
#define IRQ_LPC32XX_SPI1_DATAIN LPC32XX_SIC2_IRQ(20)
|
||||
#define IRQ_LPC32XX_GPI_00 LPC32XX_SIC2_IRQ(22)
|
||||
#define IRQ_LPC32XX_GPI_01 LPC32XX_SIC2_IRQ(23)
|
||||
#define IRQ_LPC32XX_GPI_02 LPC32XX_SIC2_IRQ(24)
|
||||
#define IRQ_LPC32XX_GPI_03 LPC32XX_SIC2_IRQ(25)
|
||||
#define IRQ_LPC32XX_GPI_04 LPC32XX_SIC2_IRQ(26)
|
||||
#define IRQ_LPC32XX_GPI_05 LPC32XX_SIC2_IRQ(27)
|
||||
#define IRQ_LPC32XX_GPI_06 LPC32XX_SIC2_IRQ(28)
|
||||
#define IRQ_LPC32XX_SYSCLK LPC32XX_SIC2_IRQ(31)
|
||||
|
||||
#define NR_IRQS 96
|
||||
|
||||
#endif
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/include/mach/memory.h
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_MEMORY_H
|
||||
#define __ASM_ARCH_MEMORY_H
|
||||
|
||||
/*
|
||||
* Physical DRAM offset of bank 0
|
||||
*/
|
||||
#define PHYS_OFFSET UL(0x80000000)
|
||||
|
||||
#endif
|
|
@ -0,0 +1,694 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/include/mach/platform.h
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_PLATFORM_H
|
||||
#define __ASM_ARCH_PLATFORM_H
|
||||
|
||||
#define _SBF(f, v) ((v) << (f))
|
||||
#define _BIT(n) _SBF(n, 1)
|
||||
|
||||
/*
|
||||
* AHB 0 physical base addresses
|
||||
*/
|
||||
#define LPC32XX_SLC_BASE 0x20020000
|
||||
#define LPC32XX_SSP0_BASE 0x20084000
|
||||
#define LPC32XX_SPI1_BASE 0x20088000
|
||||
#define LPC32XX_SSP1_BASE 0x2008C000
|
||||
#define LPC32XX_SPI2_BASE 0x20090000
|
||||
#define LPC32XX_I2S0_BASE 0x20094000
|
||||
#define LPC32XX_SD_BASE 0x20098000
|
||||
#define LPC32XX_I2S1_BASE 0x2009C000
|
||||
#define LPC32XX_MLC_BASE 0x200A8000
|
||||
#define LPC32XX_AHB0_START LPC32XX_SLC_BASE
|
||||
#define LPC32XX_AHB0_SIZE 0x00089000
|
||||
|
||||
/*
|
||||
* AHB 1 physical base addresses
|
||||
*/
|
||||
#define LPC32XX_DMA_BASE 0x31000000
|
||||
#define LPC32XX_USB_BASE 0x31020000
|
||||
#define LPC32XX_USBH_BASE 0x31020000
|
||||
#define LPC32XX_USB_OTG_BASE 0x31020000
|
||||
#define LPC32XX_OTG_I2C_BASE 0x31020300
|
||||
#define LPC32XX_LCD_BASE 0x31040000
|
||||
#define LPC32XX_ETHERNET_BASE 0x31060000
|
||||
#define LPC32XX_EMC_BASE 0x31080000
|
||||
#define LPC32XX_ETB_CFG_BASE 0x310C0000
|
||||
#define LPC32XX_ETB_DATA_BASE 0x310E0000
|
||||
#define LPC32XX_AHB1_START LPC32XX_DMA_BASE
|
||||
#define LPC32XX_AHB1_SIZE 0x000E1000
|
||||
|
||||
/*
|
||||
* FAB physical base addresses
|
||||
*/
|
||||
#define LPC32XX_CLK_PM_BASE 0x40004000
|
||||
#define LPC32XX_MIC_BASE 0x40008000
|
||||
#define LPC32XX_SIC1_BASE 0x4000C000
|
||||
#define LPC32XX_SIC2_BASE 0x40010000
|
||||
#define LPC32XX_HS_UART1_BASE 0x40014000
|
||||
#define LPC32XX_HS_UART2_BASE 0x40018000
|
||||
#define LPC32XX_HS_UART7_BASE 0x4001C000
|
||||
#define LPC32XX_RTC_BASE 0x40024000
|
||||
#define LPC32XX_RTC_RAM_BASE 0x40024080
|
||||
#define LPC32XX_GPIO_BASE 0x40028000
|
||||
#define LPC32XX_PWM3_BASE 0x4002C000
|
||||
#define LPC32XX_PWM4_BASE 0x40030000
|
||||
#define LPC32XX_MSTIM_BASE 0x40034000
|
||||
#define LPC32XX_HSTIM_BASE 0x40038000
|
||||
#define LPC32XX_WDTIM_BASE 0x4003C000
|
||||
#define LPC32XX_DEBUG_CTRL_BASE 0x40040000
|
||||
#define LPC32XX_TIMER0_BASE 0x40044000
|
||||
#define LPC32XX_ADC_BASE 0x40048000
|
||||
#define LPC32XX_TIMER1_BASE 0x4004C000
|
||||
#define LPC32XX_KSCAN_BASE 0x40050000
|
||||
#define LPC32XX_UART_CTRL_BASE 0x40054000
|
||||
#define LPC32XX_TIMER2_BASE 0x40058000
|
||||
#define LPC32XX_PWM1_BASE 0x4005C000
|
||||
#define LPC32XX_PWM2_BASE 0x4005C004
|
||||
#define LPC32XX_TIMER3_BASE 0x40060000
|
||||
|
||||
/*
|
||||
* APB physical base addresses
|
||||
*/
|
||||
#define LPC32XX_UART3_BASE 0x40080000
|
||||
#define LPC32XX_UART4_BASE 0x40088000
|
||||
#define LPC32XX_UART5_BASE 0x40090000
|
||||
#define LPC32XX_UART6_BASE 0x40098000
|
||||
#define LPC32XX_I2C1_BASE 0x400A0000
|
||||
#define LPC32XX_I2C2_BASE 0x400A8000
|
||||
|
||||
/*
|
||||
* FAB and APB base and sizing
|
||||
*/
|
||||
#define LPC32XX_FABAPB_START LPC32XX_CLK_PM_BASE
|
||||
#define LPC32XX_FABAPB_SIZE 0x000A5000
|
||||
|
||||
/*
|
||||
* Internal memory bases and sizes
|
||||
*/
|
||||
#define LPC32XX_IRAM_BASE 0x08000000
|
||||
#define LPC32XX_IROM_BASE 0x0C000000
|
||||
|
||||
/*
|
||||
* External Static Memory Bank Address Space Bases
|
||||
*/
|
||||
#define LPC32XX_EMC_CS0_BASE 0xE0000000
|
||||
#define LPC32XX_EMC_CS1_BASE 0xE1000000
|
||||
#define LPC32XX_EMC_CS2_BASE 0xE2000000
|
||||
#define LPC32XX_EMC_CS3_BASE 0xE3000000
|
||||
|
||||
/*
|
||||
* External SDRAM Memory Bank Address Space Bases
|
||||
*/
|
||||
#define LPC32XX_EMC_DYCS0_BASE 0x80000000
|
||||
#define LPC32XX_EMC_DYCS1_BASE 0xA0000000
|
||||
|
||||
/*
|
||||
* Clock and crystal information
|
||||
*/
|
||||
#define LPC32XX_MAIN_OSC_FREQ 13000000
|
||||
#define LPC32XX_CLOCK_OSC_FREQ 32768
|
||||
|
||||
/*
|
||||
* Clock and Power control register offsets
|
||||
*/
|
||||
#define _PMREG(x) io_p2v(LPC32XX_CLK_PM_BASE +\
|
||||
(x))
|
||||
#define LPC32XX_CLKPWR_DEBUG_CTRL _PMREG(0x000)
|
||||
#define LPC32XX_CLKPWR_BOOTMAP _PMREG(0x014)
|
||||
#define LPC32XX_CLKPWR_P01_ER _PMREG(0x018)
|
||||
#define LPC32XX_CLKPWR_USBCLK_PDIV _PMREG(0x01C)
|
||||
#define LPC32XX_CLKPWR_INT_ER _PMREG(0x020)
|
||||
#define LPC32XX_CLKPWR_INT_RS _PMREG(0x024)
|
||||
#define LPC32XX_CLKPWR_INT_SR _PMREG(0x028)
|
||||
#define LPC32XX_CLKPWR_INT_AP _PMREG(0x02C)
|
||||
#define LPC32XX_CLKPWR_PIN_ER _PMREG(0x030)
|
||||
#define LPC32XX_CLKPWR_PIN_RS _PMREG(0x034)
|
||||
#define LPC32XX_CLKPWR_PIN_SR _PMREG(0x038)
|
||||
#define LPC32XX_CLKPWR_PIN_AP _PMREG(0x03C)
|
||||
#define LPC32XX_CLKPWR_HCLK_DIV _PMREG(0x040)
|
||||
#define LPC32XX_CLKPWR_PWR_CTRL _PMREG(0x044)
|
||||
#define LPC32XX_CLKPWR_PLL397_CTRL _PMREG(0x048)
|
||||
#define LPC32XX_CLKPWR_MAIN_OSC_CTRL _PMREG(0x04C)
|
||||
#define LPC32XX_CLKPWR_SYSCLK_CTRL _PMREG(0x050)
|
||||
#define LPC32XX_CLKPWR_LCDCLK_CTRL _PMREG(0x054)
|
||||
#define LPC32XX_CLKPWR_HCLKPLL_CTRL _PMREG(0x058)
|
||||
#define LPC32XX_CLKPWR_ADC_CLK_CTRL_1 _PMREG(0x060)
|
||||
#define LPC32XX_CLKPWR_USB_CTRL _PMREG(0x064)
|
||||
#define LPC32XX_CLKPWR_SDRAMCLK_CTRL _PMREG(0x068)
|
||||
#define LPC32XX_CLKPWR_DDR_LAP_NOM _PMREG(0x06C)
|
||||
#define LPC32XX_CLKPWR_DDR_LAP_COUNT _PMREG(0x070)
|
||||
#define LPC32XX_CLKPWR_DDR_LAP_DELAY _PMREG(0x074)
|
||||
#define LPC32XX_CLKPWR_SSP_CLK_CTRL _PMREG(0x078)
|
||||
#define LPC32XX_CLKPWR_I2S_CLK_CTRL _PMREG(0x07C)
|
||||
#define LPC32XX_CLKPWR_MS_CTRL _PMREG(0x080)
|
||||
#define LPC32XX_CLKPWR_MACCLK_CTRL _PMREG(0x090)
|
||||
#define LPC32XX_CLKPWR_TEST_CLK_SEL _PMREG(0x0A4)
|
||||
#define LPC32XX_CLKPWR_SFW_INT _PMREG(0x0A8)
|
||||
#define LPC32XX_CLKPWR_I2C_CLK_CTRL _PMREG(0x0AC)
|
||||
#define LPC32XX_CLKPWR_KEY_CLK_CTRL _PMREG(0x0B0)
|
||||
#define LPC32XX_CLKPWR_ADC_CLK_CTRL _PMREG(0x0B4)
|
||||
#define LPC32XX_CLKPWR_PWM_CLK_CTRL _PMREG(0x0B8)
|
||||
#define LPC32XX_CLKPWR_TIMER_CLK_CTRL _PMREG(0x0BC)
|
||||
#define LPC32XX_CLKPWR_TIMERS_PWMS_CLK_CTRL_1 _PMREG(0x0C0)
|
||||
#define LPC32XX_CLKPWR_SPI_CLK_CTRL _PMREG(0x0C4)
|
||||
#define LPC32XX_CLKPWR_NAND_CLK_CTRL _PMREG(0x0C8)
|
||||
#define LPC32XX_CLKPWR_UART3_CLK_CTRL _PMREG(0x0D0)
|
||||
#define LPC32XX_CLKPWR_UART4_CLK_CTRL _PMREG(0x0D4)
|
||||
#define LPC32XX_CLKPWR_UART5_CLK_CTRL _PMREG(0x0D8)
|
||||
#define LPC32XX_CLKPWR_UART6_CLK_CTRL _PMREG(0x0DC)
|
||||
#define LPC32XX_CLKPWR_IRDA_CLK_CTRL _PMREG(0x0E0)
|
||||
#define LPC32XX_CLKPWR_UART_CLK_CTRL _PMREG(0x0E4)
|
||||
#define LPC32XX_CLKPWR_DMA_CLK_CTRL _PMREG(0x0E8)
|
||||
#define LPC32XX_CLKPWR_AUTOCLOCK _PMREG(0x0EC)
|
||||
#define LPC32XX_CLKPWR_DEVID(x) _PMREG(0x130 + (x))
|
||||
|
||||
/*
|
||||
* clkpwr_debug_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_VFP_CLOCK_ENABLE_BIT _BIT(4)
|
||||
|
||||
/*
|
||||
* clkpwr_bootmap register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_BOOTMAP_SEL_BIT _BIT(1)
|
||||
|
||||
/*
|
||||
* clkpwr_start_gpio register bit definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO23_BIT _BIT(31)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO22_BIT _BIT(30)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO21_BIT _BIT(29)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO20_BIT _BIT(28)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO19_BIT _BIT(27)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO18_BIT _BIT(26)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO17_BIT _BIT(25)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO16_BIT _BIT(24)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO15_BIT _BIT(23)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO14_BIT _BIT(22)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO13_BIT _BIT(21)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO12_BIT _BIT(20)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO11_BIT _BIT(19)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO10_BIT _BIT(18)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO9_BIT _BIT(17)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO8_BIT _BIT(16)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO7_BIT _BIT(15)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO6_BIT _BIT(14)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO5_BIT _BIT(13)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO4_BIT _BIT(12)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO3_BIT _BIT(11)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO2_BIT _BIT(10)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO1_BIT _BIT(9)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P1IO0_BIT _BIT(8)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P0IO7_BIT _BIT(7)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P0IO6_BIT _BIT(6)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P0IO5_BIT _BIT(5)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P0IO4_BIT _BIT(4)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P0IO3_BIT _BIT(3)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P0IO2_BIT _BIT(2)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P0IO1_BIT _BIT(1)
|
||||
#define LPC32XX_CLKPWR_GPIOSRC_P0IO0_BIT _BIT(0)
|
||||
|
||||
/*
|
||||
* clkpwr_usbclk_pdiv register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_USBPDIV_PLL_MASK 0xF
|
||||
|
||||
/*
|
||||
* clkpwr_start_int, clkpwr_start_raw_sts_int, clkpwr_start_sts_int,
|
||||
* clkpwr_start_pol_int, register bit definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_INTSRC_ADC_BIT _BIT(31)
|
||||
#define LPC32XX_CLKPWR_INTSRC_TS_P_BIT _BIT(30)
|
||||
#define LPC32XX_CLKPWR_INTSRC_TS_AUX_BIT _BIT(29)
|
||||
#define LPC32XX_CLKPWR_INTSRC_USBAHNEEDCLK_BIT _BIT(26)
|
||||
#define LPC32XX_CLKPWR_INTSRC_MSTIMER_BIT _BIT(25)
|
||||
#define LPC32XX_CLKPWR_INTSRC_RTC_BIT _BIT(24)
|
||||
#define LPC32XX_CLKPWR_INTSRC_USBNEEDCLK_BIT _BIT(23)
|
||||
#define LPC32XX_CLKPWR_INTSRC_USB_BIT _BIT(22)
|
||||
#define LPC32XX_CLKPWR_INTSRC_I2C_BIT _BIT(21)
|
||||
#define LPC32XX_CLKPWR_INTSRC_USBOTGTIMER_BIT _BIT(20)
|
||||
#define LPC32XX_CLKPWR_INTSRC_USBATXINT_BIT _BIT(19)
|
||||
#define LPC32XX_CLKPWR_INTSRC_KEY_BIT _BIT(16)
|
||||
#define LPC32XX_CLKPWR_INTSRC_MAC_BIT _BIT(7)
|
||||
#define LPC32XX_CLKPWR_INTSRC_P0P1_BIT _BIT(6)
|
||||
#define LPC32XX_CLKPWR_INTSRC_GPIO_05_BIT _BIT(5)
|
||||
#define LPC32XX_CLKPWR_INTSRC_GPIO_04_BIT _BIT(4)
|
||||
#define LPC32XX_CLKPWR_INTSRC_GPIO_03_BIT _BIT(3)
|
||||
#define LPC32XX_CLKPWR_INTSRC_GPIO_02_BIT _BIT(2)
|
||||
#define LPC32XX_CLKPWR_INTSRC_GPIO_01_BIT _BIT(1)
|
||||
#define LPC32XX_CLKPWR_INTSRC_GPIO_00_BIT _BIT(0)
|
||||
|
||||
/*
|
||||
* clkpwr_start_pin, clkpwr_start_raw_sts_pin, clkpwr_start_sts_pin,
|
||||
* clkpwr_start_pol_pin register bit definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_EXTSRC_U7_RX_BIT _BIT(31)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_U7_HCTS_BIT _BIT(30)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_U6_IRRX_BIT _BIT(28)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_U5_RX_BIT _BIT(26)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_GPI_28_BIT _BIT(25)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_U3_RX_BIT _BIT(24)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_U2_HCTS_BIT _BIT(23)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_U2_RX_BIT _BIT(22)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_U1_RX_BIT _BIT(21)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_MSDIO_INT_BIT _BIT(18)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_MSDIO_SRT_BIT _BIT(17)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_GPI_06_BIT _BIT(16)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_GPI_05_BIT _BIT(15)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_GPI_04_BIT _BIT(14)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_GPI_03_BIT _BIT(13)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_GPI_02_BIT _BIT(12)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_GPI_01_BIT _BIT(11)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_GPI_00_BIT _BIT(10)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_SYSCLKEN_BIT _BIT(9)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_SPI1_DATIN_BIT _BIT(8)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_GPI_07_BIT _BIT(7)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_SPI2_DATIN_BIT _BIT(6)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_GPI_19_BIT _BIT(5)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_GPI_09_BIT _BIT(4)
|
||||
#define LPC32XX_CLKPWR_EXTSRC_GPI_08_BIT _BIT(3)
|
||||
|
||||
/*
|
||||
* clkpwr_hclk_div register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_HCLKDIV_DDRCLK_STOP (0x0 << 7)
|
||||
#define LPC32XX_CLKPWR_HCLKDIV_DDRCLK_NORM (0x1 << 7)
|
||||
#define LPC32XX_CLKPWR_HCLKDIV_DDRCLK_HALF (0x2 << 7)
|
||||
#define LPC32XX_CLKPWR_HCLKDIV_PCLK_DIV(n) (((n) & 0x1F) << 2)
|
||||
#define LPC32XX_CLKPWR_HCLKDIV_DIV_2POW(n) ((n) & 0x3)
|
||||
|
||||
/*
|
||||
* clkpwr_pwr_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_CTRL_FORCE_PCLK _BIT(10)
|
||||
#define LPC32XX_CLKPWR_SDRAM_SELF_RFSH _BIT(9)
|
||||
#define LPC32XX_CLKPWR_UPD_SDRAM_SELF_RFSH _BIT(8)
|
||||
#define LPC32XX_CLKPWR_AUTO_SDRAM_SELF_RFSH _BIT(7)
|
||||
#define LPC32XX_CLKPWR_HIGHCORE_STATE_BIT _BIT(5)
|
||||
#define LPC32XX_CLKPWR_SYSCLKEN_STATE_BIT _BIT(4)
|
||||
#define LPC32XX_CLKPWR_SYSCLKEN_GPIO_EN _BIT(3)
|
||||
#define LPC32XX_CLKPWR_SELECT_RUN_MODE _BIT(2)
|
||||
#define LPC32XX_CLKPWR_HIGHCORE_GPIO_EN _BIT(1)
|
||||
#define LPC32XX_CLKPWR_STOP_MODE_CTRL _BIT(0)
|
||||
|
||||
/*
|
||||
* clkpwr_pll397_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_PLL397_MSLOCK_STS _BIT(10)
|
||||
#define LPC32XX_CLKPWR_PLL397_BYPASS _BIT(9)
|
||||
#define LPC32XX_CLKPWR_PLL397_BIAS_NORM 0x000
|
||||
#define LPC32XX_CLKPWR_PLL397_BIAS_N12_5 0x040
|
||||
#define LPC32XX_CLKPWR_PLL397_BIAS_N25 0x080
|
||||
#define LPC32XX_CLKPWR_PLL397_BIAS_N37_5 0x0C0
|
||||
#define LPC32XX_CLKPWR_PLL397_BIAS_P12_5 0x100
|
||||
#define LPC32XX_CLKPWR_PLL397_BIAS_P25 0x140
|
||||
#define LPC32XX_CLKPWR_PLL397_BIAS_P37_5 0x180
|
||||
#define LPC32XX_CLKPWR_PLL397_BIAS_P50 0x1C0
|
||||
#define LPC32XX_CLKPWR_PLL397_BIAS_MASK 0x1C0
|
||||
#define LPC32XX_CLKPWR_SYSCTRL_PLL397_DIS _BIT(1)
|
||||
#define LPC32XX_CLKPWR_SYSCTRL_PLL397_STS _BIT(0)
|
||||
|
||||
/*
|
||||
* clkpwr_main_osc_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_MOSC_ADD_CAP(n) (((n) & 0x7F) << 2)
|
||||
#define LPC32XX_CLKPWR_MOSC_CAP_MASK (0x7F << 2)
|
||||
#define LPC32XX_CLKPWR_TEST_MODE _BIT(1)
|
||||
#define LPC32XX_CLKPWR_MOSC_DISABLE _BIT(0)
|
||||
|
||||
/*
|
||||
* clkpwr_sysclk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_SYSCTRL_BP_TRIG(n) (((n) & 0x3FF) << 2)
|
||||
#define LPC32XX_CLKPWR_SYSCTRL_BP_MASK (0x3FF << 2)
|
||||
#define LPC32XX_CLKPWR_SYSCTRL_USEPLL397 _BIT(1)
|
||||
#define LPC32XX_CLKPWR_SYSCTRL_SYSCLKMUX _BIT(0)
|
||||
|
||||
/*
|
||||
* clkpwr_lcdclk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_LCDCTRL_LCDTYPE_TFT12 0x000
|
||||
#define LPC32XX_CLKPWR_LCDCTRL_LCDTYPE_TFT16 0x040
|
||||
#define LPC32XX_CLKPWR_LCDCTRL_LCDTYPE_TFT15 0x080
|
||||
#define LPC32XX_CLKPWR_LCDCTRL_LCDTYPE_TFT24 0x0C0
|
||||
#define LPC32XX_CLKPWR_LCDCTRL_LCDTYPE_STN4M 0x100
|
||||
#define LPC32XX_CLKPWR_LCDCTRL_LCDTYPE_STN8C 0x140
|
||||
#define LPC32XX_CLKPWR_LCDCTRL_LCDTYPE_DSTN4M 0x180
|
||||
#define LPC32XX_CLKPWR_LCDCTRL_LCDTYPE_DSTN8C 0x1C0
|
||||
#define LPC32XX_CLKPWR_LCDCTRL_LCDTYPE_MSK 0x01C0
|
||||
#define LPC32XX_CLKPWR_LCDCTRL_CLK_EN 0x020
|
||||
#define LPC32XX_CLKPWR_LCDCTRL_SET_PSCALE(n) ((n - 1) & 0x1F)
|
||||
#define LPC32XX_CLKPWR_LCDCTRL_PSCALE_MSK 0x001F
|
||||
|
||||
/*
|
||||
* clkpwr_hclkpll_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_HCLKPLL_POWER_UP _BIT(16)
|
||||
#define LPC32XX_CLKPWR_HCLKPLL_CCO_BYPASS _BIT(15)
|
||||
#define LPC32XX_CLKPWR_HCLKPLL_POSTDIV_BYPASS _BIT(14)
|
||||
#define LPC32XX_CLKPWR_HCLKPLL_FDBK_SEL_FCLK _BIT(13)
|
||||
#define LPC32XX_CLKPWR_HCLKPLL_POSTDIV_2POW(n) (((n) & 0x3) << 11)
|
||||
#define LPC32XX_CLKPWR_HCLKPLL_PREDIV_PLUS1(n) (((n) & 0x3) << 9)
|
||||
#define LPC32XX_CLKPWR_HCLKPLL_PLLM(n) (((n) & 0xFF) << 1)
|
||||
#define LPC32XX_CLKPWR_HCLKPLL_PLL_STS _BIT(0)
|
||||
|
||||
/*
|
||||
* clkpwr_adc_clk_ctrl_1 register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_ADCCTRL1_RTDIV(n) (((n) & 0xFF) << 0)
|
||||
#define LPC32XX_CLKPWR_ADCCTRL1_PCLK_SEL _BIT(8)
|
||||
|
||||
/*
|
||||
* clkpwr_usb_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_USBCTRL_HCLK_EN _BIT(24)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_USBI2C_EN _BIT(23)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_USBDVND_EN _BIT(22)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_USBHSTND_EN _BIT(21)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_PU_ADD (0x0 << 19)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_BUS_KEEPER (0x1 << 19)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_PD_ADD (0x3 << 19)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_CLK_EN2 _BIT(18)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_CLK_EN1 _BIT(17)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_PLL_PWRUP _BIT(16)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_CCO_BYPASS _BIT(15)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_POSTDIV_BYPASS _BIT(14)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_FDBK_SEL_FCLK _BIT(13)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_POSTDIV_2POW(n) (((n) & 0x3) << 11)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_PREDIV_PLUS1(n) (((n) & 0x3) << 9)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_FDBK_PLUS1(n) (((n) & 0xFF) << 1)
|
||||
#define LPC32XX_CLKPWR_USBCTRL_PLL_STS _BIT(0)
|
||||
|
||||
/*
|
||||
* clkpwr_sdramclk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_SDRCLK_FASTSLEW_CLK _BIT(22)
|
||||
#define LPC32XX_CLKPWR_SDRCLK_FASTSLEW _BIT(21)
|
||||
#define LPC32XX_CLKPWR_SDRCLK_FASTSLEW_DAT _BIT(20)
|
||||
#define LPC32XX_CLKPWR_SDRCLK_SW_DDR_RESET _BIT(19)
|
||||
#define LPC32XX_CLKPWR_SDRCLK_HCLK_DLY(n) (((n) & 0x1F) << 14)
|
||||
#define LPC32XX_CLKPWR_SDRCLK_DLY_ADDR_STS _BIT(13)
|
||||
#define LPC32XX_CLKPWR_SDRCLK_SENS_FACT(n) (((n) & 0x7) << 10)
|
||||
#define LPC32XX_CLKPWR_SDRCLK_USE_CAL _BIT(9)
|
||||
#define LPC32XX_CLKPWR_SDRCLK_DO_CAL _BIT(8)
|
||||
#define LPC32XX_CLKPWR_SDRCLK_CAL_ON_RTC _BIT(7)
|
||||
#define LPC32XX_CLKPWR_SDRCLK_DQS_DLY(n) (((n) & 0x1F) << 2)
|
||||
#define LPC32XX_CLKPWR_SDRCLK_USE_DDR _BIT(1)
|
||||
#define LPC32XX_CLKPWR_SDRCLK_CLK_DIS _BIT(0)
|
||||
|
||||
/*
|
||||
* clkpwr_ssp_blk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_SSPCTRL_DMA_SSP1RX _BIT(5)
|
||||
#define LPC32XX_CLKPWR_SSPCTRL_DMA_SSP1TX _BIT(4)
|
||||
#define LPC32XX_CLKPWR_SSPCTRL_DMA_SSP0RX _BIT(3)
|
||||
#define LPC32XX_CLKPWR_SSPCTRL_DMA_SSP0TX _BIT(2)
|
||||
#define LPC32XX_CLKPWR_SSPCTRL_SSPCLK1_EN _BIT(1)
|
||||
#define LPC32XX_CLKPWR_SSPCTRL_SSPCLK0_EN _BIT(0)
|
||||
|
||||
/*
|
||||
* clkpwr_i2s_clk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_I2SCTRL_I2S1_RX_FOR_TX _BIT(6)
|
||||
#define LPC32XX_CLKPWR_I2SCTRL_I2S1_TX_FOR_RX _BIT(5)
|
||||
#define LPC32XX_CLKPWR_I2SCTRL_I2S1_USE_DMA _BIT(4)
|
||||
#define LPC32XX_CLKPWR_I2SCTRL_I2S0_RX_FOR_TX _BIT(3)
|
||||
#define LPC32XX_CLKPWR_I2SCTRL_I2S0_TX_FOR_RX _BIT(2)
|
||||
#define LPC32XX_CLKPWR_I2SCTRL_I2SCLK1_EN _BIT(1)
|
||||
#define LPC32XX_CLKPWR_I2SCTRL_I2SCLK0_EN _BIT(0)
|
||||
|
||||
/*
|
||||
* clkpwr_ms_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_MSCARD_MSDIO_PIN_DIS _BIT(10)
|
||||
#define LPC32XX_CLKPWR_MSCARD_MSDIO_PU_EN _BIT(9)
|
||||
#define LPC32XX_CLKPWR_MSCARD_MSDIO23_DIS _BIT(8)
|
||||
#define LPC32XX_CLKPWR_MSCARD_MSDIO1_DIS _BIT(7)
|
||||
#define LPC32XX_CLKPWR_MSCARD_MSDIO0_DIS _BIT(6)
|
||||
#define LPC32XX_CLKPWR_MSCARD_SDCARD_EN _BIT(5)
|
||||
#define LPC32XX_CLKPWR_MSCARD_SDCARD_DIV(n) ((n) & 0xF)
|
||||
|
||||
/*
|
||||
* clkpwr_macclk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_MACCTRL_NO_ENET_PIS 0x00
|
||||
#define LPC32XX_CLKPWR_MACCTRL_USE_MII_PINS 0x08
|
||||
#define LPC32XX_CLKPWR_MACCTRL_USE_RMII_PINS 0x18
|
||||
#define LPC32XX_CLKPWR_MACCTRL_PINS_MSK 0x18
|
||||
#define LPC32XX_CLKPWR_MACCTRL_DMACLK_EN _BIT(2)
|
||||
#define LPC32XX_CLKPWR_MACCTRL_MMIOCLK_EN _BIT(1)
|
||||
#define LPC32XX_CLKPWR_MACCTRL_HRCCLK_EN _BIT(0)
|
||||
|
||||
/*
|
||||
* clkpwr_test_clk_sel register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_TESTCLK1_SEL_PERCLK (0x0 << 5)
|
||||
#define LPC32XX_CLKPWR_TESTCLK1_SEL_RTC (0x1 << 5)
|
||||
#define LPC32XX_CLKPWR_TESTCLK1_SEL_MOSC (0x2 << 5)
|
||||
#define LPC32XX_CLKPWR_TESTCLK1_SEL_MASK (0x3 << 5)
|
||||
#define LPC32XX_CLKPWR_TESTCLK_TESTCLK1_EN _BIT(4)
|
||||
#define LPC32XX_CLKPWR_TESTCLK2_SEL_HCLK (0x0 << 1)
|
||||
#define LPC32XX_CLKPWR_TESTCLK2_SEL_PERCLK (0x1 << 1)
|
||||
#define LPC32XX_CLKPWR_TESTCLK2_SEL_USBCLK (0x2 << 1)
|
||||
#define LPC32XX_CLKPWR_TESTCLK2_SEL_MOSC (0x5 << 1)
|
||||
#define LPC32XX_CLKPWR_TESTCLK2_SEL_PLL397 (0x7 << 1)
|
||||
#define LPC32XX_CLKPWR_TESTCLK2_SEL_MASK (0x7 << 1)
|
||||
#define LPC32XX_CLKPWR_TESTCLK_TESTCLK2_EN _BIT(0)
|
||||
|
||||
/*
|
||||
* clkpwr_sw_int register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_SW_INT(n) (_BIT(0) | (((n) & 0x7F) << 1))
|
||||
#define LPC32XX_CLKPWR_SW_GET_ARG(n) (((n) & 0xFE) >> 1)
|
||||
|
||||
/*
|
||||
* clkpwr_i2c_clk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_I2CCLK_USBI2CHI_DRIVE _BIT(4)
|
||||
#define LPC32XX_CLKPWR_I2CCLK_I2C2HI_DRIVE _BIT(3)
|
||||
#define LPC32XX_CLKPWR_I2CCLK_I2C1HI_DRIVE _BIT(2)
|
||||
#define LPC32XX_CLKPWR_I2CCLK_I2C2CLK_EN _BIT(1)
|
||||
#define LPC32XX_CLKPWR_I2CCLK_I2C1CLK_EN _BIT(0)
|
||||
|
||||
/*
|
||||
* clkpwr_key_clk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_KEYCLKCTRL_CLK_EN 0x1
|
||||
|
||||
/*
|
||||
* clkpwr_adc_clk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_ADC32CLKCTRL_CLK_EN 0x1
|
||||
|
||||
/*
|
||||
* clkpwr_pwm_clk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_PWMCLK_PWM2_DIV(n) (((n) & 0xF) << 8)
|
||||
#define LPC32XX_CLKPWR_PWMCLK_PWM1_DIV(n) (((n) & 0xF) << 4)
|
||||
#define LPC32XX_CLKPWR_PWMCLK_PWM2SEL_PCLK 0x8
|
||||
#define LPC32XX_CLKPWR_PWMCLK_PWM2CLK_EN 0x4
|
||||
#define LPC32XX_CLKPWR_PWMCLK_PWM1SEL_PCLK 0x2
|
||||
#define LPC32XX_CLKPWR_PWMCLK_PWM1CLK_EN 0x1
|
||||
|
||||
/*
|
||||
* clkpwr_timer_clk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_PWMCLK_HSTIMER_EN 0x2
|
||||
#define LPC32XX_CLKPWR_PWMCLK_WDOG_EN 0x1
|
||||
|
||||
/*
|
||||
* clkpwr_timers_pwms_clk_ctrl_1 register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_TMRPWMCLK_TIMER3_EN 0x20
|
||||
#define LPC32XX_CLKPWR_TMRPWMCLK_TIMER2_EN 0x10
|
||||
#define LPC32XX_CLKPWR_TMRPWMCLK_TIMER1_EN 0x08
|
||||
#define LPC32XX_CLKPWR_TMRPWMCLK_TIMER0_EN 0x04
|
||||
#define LPC32XX_CLKPWR_TMRPWMCLK_PWM4_EN 0x02
|
||||
#define LPC32XX_CLKPWR_TMRPWMCLK_PWM3_EN 0x01
|
||||
|
||||
/*
|
||||
* clkpwr_spi_clk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_SPICLK_SET_SPI2DATIO 0x80
|
||||
#define LPC32XX_CLKPWR_SPICLK_SET_SPI2CLK 0x40
|
||||
#define LPC32XX_CLKPWR_SPICLK_USE_SPI2 0x20
|
||||
#define LPC32XX_CLKPWR_SPICLK_SPI2CLK_EN 0x10
|
||||
#define LPC32XX_CLKPWR_SPICLK_SET_SPI1DATIO 0x08
|
||||
#define LPC32XX_CLKPWR_SPICLK_SET_SPI1CLK 0x04
|
||||
#define LPC32XX_CLKPWR_SPICLK_USE_SPI1 0x02
|
||||
#define LPC32XX_CLKPWR_SPICLK_SPI1CLK_EN 0x01
|
||||
|
||||
/*
|
||||
* clkpwr_nand_clk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_NANDCLK_INTSEL_MLC 0x20
|
||||
#define LPC32XX_CLKPWR_NANDCLK_DMA_RNB 0x10
|
||||
#define LPC32XX_CLKPWR_NANDCLK_DMA_INT 0x08
|
||||
#define LPC32XX_CLKPWR_NANDCLK_SEL_SLC 0x04
|
||||
#define LPC32XX_CLKPWR_NANDCLK_MLCCLK_EN 0x02
|
||||
#define LPC32XX_CLKPWR_NANDCLK_SLCCLK_EN 0x01
|
||||
|
||||
/*
|
||||
* clkpwr_uart3_clk_ctrl, clkpwr_uart4_clk_ctrl, clkpwr_uart5_clk_ctrl
|
||||
* and clkpwr_uart6_clk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_UART_Y_DIV(y) ((y) & 0xFF)
|
||||
#define LPC32XX_CLKPWR_UART_X_DIV(x) (((x) & 0xFF) << 8)
|
||||
#define LPC32XX_CLKPWR_UART_USE_HCLK _BIT(16)
|
||||
|
||||
/*
|
||||
* clkpwr_irda_clk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_IRDA_Y_DIV(y) ((y) & 0xFF)
|
||||
#define LPC32XX_CLKPWR_IRDA_X_DIV(x) (((x) & 0xFF) << 8)
|
||||
|
||||
/*
|
||||
* clkpwr_uart_clk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_UARTCLKCTRL_UART6_EN _BIT(3)
|
||||
#define LPC32XX_CLKPWR_UARTCLKCTRL_UART5_EN _BIT(2)
|
||||
#define LPC32XX_CLKPWR_UARTCLKCTRL_UART4_EN _BIT(1)
|
||||
#define LPC32XX_CLKPWR_UARTCLKCTRL_UART3_EN _BIT(0)
|
||||
|
||||
/*
|
||||
* clkpwr_dmaclk_ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_DMACLKCTRL_CLK_EN 0x1
|
||||
|
||||
/*
|
||||
* clkpwr_autoclock register definitions
|
||||
*/
|
||||
#define LPC32XX_CLKPWR_AUTOCLK_USB_EN 0x40
|
||||
#define LPC32XX_CLKPWR_AUTOCLK_IRAM_EN 0x02
|
||||
#define LPC32XX_CLKPWR_AUTOCLK_IROM_EN 0x01
|
||||
|
||||
/*
|
||||
* Interrupt controller register offsets
|
||||
*/
|
||||
#define LPC32XX_INTC_MASK(x) io_p2v((x) + 0x00)
|
||||
#define LPC32XX_INTC_RAW_STAT(x) io_p2v((x) + 0x04)
|
||||
#define LPC32XX_INTC_STAT(x) io_p2v((x) + 0x08)
|
||||
#define LPC32XX_INTC_POLAR(x) io_p2v((x) + 0x0C)
|
||||
#define LPC32XX_INTC_ACT_TYPE(x) io_p2v((x) + 0x10)
|
||||
#define LPC32XX_INTC_TYPE(x) io_p2v((x) + 0x14)
|
||||
|
||||
/*
|
||||
* Timer/counter register offsets
|
||||
*/
|
||||
#define LCP32XX_TIMER_IR(x) io_p2v((x) + 0x00)
|
||||
#define LCP32XX_TIMER_TCR(x) io_p2v((x) + 0x04)
|
||||
#define LCP32XX_TIMER_TC(x) io_p2v((x) + 0x08)
|
||||
#define LCP32XX_TIMER_PR(x) io_p2v((x) + 0x0C)
|
||||
#define LCP32XX_TIMER_PC(x) io_p2v((x) + 0x10)
|
||||
#define LCP32XX_TIMER_MCR(x) io_p2v((x) + 0x14)
|
||||
#define LCP32XX_TIMER_MR0(x) io_p2v((x) + 0x18)
|
||||
#define LCP32XX_TIMER_MR1(x) io_p2v((x) + 0x1C)
|
||||
#define LCP32XX_TIMER_MR2(x) io_p2v((x) + 0x20)
|
||||
#define LCP32XX_TIMER_MR3(x) io_p2v((x) + 0x24)
|
||||
#define LCP32XX_TIMER_CCR(x) io_p2v((x) + 0x28)
|
||||
#define LCP32XX_TIMER_CR0(x) io_p2v((x) + 0x2C)
|
||||
#define LCP32XX_TIMER_CR1(x) io_p2v((x) + 0x30)
|
||||
#define LCP32XX_TIMER_CR2(x) io_p2v((x) + 0x34)
|
||||
#define LCP32XX_TIMER_CR3(x) io_p2v((x) + 0x38)
|
||||
#define LCP32XX_TIMER_EMR(x) io_p2v((x) + 0x3C)
|
||||
#define LCP32XX_TIMER_CTCR(x) io_p2v((x) + 0x70)
|
||||
|
||||
/*
|
||||
* ir register definitions
|
||||
*/
|
||||
#define LCP32XX_TIMER_CNTR_MTCH_BIT(n) (1 << ((n) & 0x3))
|
||||
#define LCP32XX_TIMER_CNTR_CAPT_BIT(n) (1 << (4 + ((n) & 0x3)))
|
||||
|
||||
/*
|
||||
* tcr register definitions
|
||||
*/
|
||||
#define LCP32XX_TIMER_CNTR_TCR_EN 0x1
|
||||
#define LCP32XX_TIMER_CNTR_TCR_RESET 0x2
|
||||
|
||||
/*
|
||||
* mcr register definitions
|
||||
*/
|
||||
#define LCP32XX_TIMER_CNTR_MCR_MTCH(n) (0x1 << ((n) * 3))
|
||||
#define LCP32XX_TIMER_CNTR_MCR_RESET(n) (0x1 << (((n) * 3) + 1))
|
||||
#define LCP32XX_TIMER_CNTR_MCR_STOP(n) (0x1 << (((n) * 3) + 2))
|
||||
|
||||
/*
|
||||
* Standard UART register offsets
|
||||
*/
|
||||
#define LPC32XX_UART_DLL_FIFO(x) io_p2v((x) + 0x00)
|
||||
#define LPC32XX_UART_DLM_IER(x) io_p2v((x) + 0x04)
|
||||
#define LPC32XX_UART_IIR_FCR(x) io_p2v((x) + 0x08)
|
||||
#define LPC32XX_UART_LCR(x) io_p2v((x) + 0x0C)
|
||||
#define LPC32XX_UART_MODEM_CTRL(x) io_p2v((x) + 0x10)
|
||||
#define LPC32XX_UART_LSR(x) io_p2v((x) + 0x14)
|
||||
#define LPC32XX_UART_MODEM_STATUS(x) io_p2v((x) + 0x18)
|
||||
#define LPC32XX_UART_RXLEV(x) io_p2v((x) + 0x1C)
|
||||
|
||||
/*
|
||||
* UART control structure offsets
|
||||
*/
|
||||
#define _UCREG(x) io_p2v(\
|
||||
LPC32XX_UART_CTRL_BASE + (x))
|
||||
#define LPC32XX_UARTCTL_CTRL _UCREG(0x00)
|
||||
#define LPC32XX_UARTCTL_CLKMODE _UCREG(0x04)
|
||||
#define LPC32XX_UARTCTL_CLOOP _UCREG(0x08)
|
||||
|
||||
/*
|
||||
* ctrl register definitions
|
||||
*/
|
||||
#define LPC32XX_UART_U3_MD_CTRL_EN _BIT(11)
|
||||
#define LPC32XX_UART_IRRX6_INV_EN _BIT(10)
|
||||
#define LPC32XX_UART_HDPX_EN _BIT(9)
|
||||
#define LPC32XX_UART_UART6_IRDAMOD_BYPASS _BIT(5)
|
||||
#define LPC32XX_RT_IRTX6_INV_EN _BIT(4)
|
||||
#define LPC32XX_RT_IRTX6_INV_MIR_EN _BIT(3)
|
||||
#define LPC32XX_RT_RX_IRPULSE_3_16_115K _BIT(2)
|
||||
#define LPC32XX_RT_TX_IRPULSE_3_16_115K _BIT(1)
|
||||
#define LPC32XX_UART_U5_ROUTE_TO_USB _BIT(0)
|
||||
|
||||
/*
|
||||
* clkmode register definitions
|
||||
*/
|
||||
#define LPC32XX_UART_ENABLED_CLOCKS(n) (((n) >> 16) & 0x7F)
|
||||
#define LPC32XX_UART_ENABLED_CLOCK(n, u) (((n) >> (16 + (u))) & 0x1)
|
||||
#define LPC32XX_UART_ENABLED_CLKS_ANY _BIT(14)
|
||||
#define LPC32XX_UART_CLKMODE_OFF 0x0
|
||||
#define LPC32XX_UART_CLKMODE_ON 0x1
|
||||
#define LPC32XX_UART_CLKMODE_AUTO 0x2
|
||||
#define LPC32XX_UART_CLKMODE_MASK(u) (0x3 << ((((u) - 3) * 2) + 4))
|
||||
#define LPC32XX_UART_CLKMODE_LOAD(m, u) ((m) << ((((u) - 3) * 2) + 4))
|
||||
|
||||
/*
|
||||
* GPIO Module Register offsets
|
||||
*/
|
||||
#define _GPREG(x) io_p2v(LPC32XX_GPIO_BASE + (x))
|
||||
#define LPC32XX_GPIO_P_MUX_SET _GPREG(0x100)
|
||||
#define LPC32XX_GPIO_P_MUX_CLR _GPREG(0x104)
|
||||
#define LPC32XX_GPIO_P_MUX_STATE _GPREG(0x108)
|
||||
#define LPC32XX_GPIO_P3_MUX_SET _GPREG(0x110)
|
||||
#define LPC32XX_GPIO_P3_MUX_CLR _GPREG(0x114)
|
||||
#define LPC32XX_GPIO_P3_MUX_STATE _GPREG(0x118)
|
||||
#define LPC32XX_GPIO_P0_MUX_SET _GPREG(0x120)
|
||||
#define LPC32XX_GPIO_P0_MUX_CLR _GPREG(0x124)
|
||||
#define LPC32XX_GPIO_P0_MUX_STATE _GPREG(0x128)
|
||||
#define LPC32XX_GPIO_P1_MUX_SET _GPREG(0x130)
|
||||
#define LPC32XX_GPIO_P1_MUX_CLR _GPREG(0x134)
|
||||
#define LPC32XX_GPIO_P1_MUX_STATE _GPREG(0x138)
|
||||
|
||||
#endif
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/include/mach/system.h
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_SYSTEM_H
|
||||
#define __ASM_ARCH_SYSTEM_H
|
||||
|
||||
static void arch_idle(void)
|
||||
{
|
||||
cpu_do_idle();
|
||||
}
|
||||
|
||||
static inline void arch_reset(char mode, const char *cmd)
|
||||
{
|
||||
extern void lpc32xx_watchdog_reset(void);
|
||||
|
||||
switch (mode) {
|
||||
case 's':
|
||||
case 'h':
|
||||
printk(KERN_CRIT "RESET: Rebooting system\n");
|
||||
|
||||
/* Disable interrupts */
|
||||
local_irq_disable();
|
||||
|
||||
lpc32xx_watchdog_reset();
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Do nothing */
|
||||
break;
|
||||
}
|
||||
|
||||
/* Wait for watchdog to reset system */
|
||||
while (1)
|
||||
;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/include/mach/timex.h
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_TIMEX_H
|
||||
#define __ASM_ARCH_TIMEX_H
|
||||
|
||||
/*
|
||||
* Rate in Hz of the main system oscillator. This value should match
|
||||
* the value 'MAIN_OSC_FREQ' in platform.h
|
||||
*/
|
||||
#define CLOCK_TICK_RATE 13000000
|
||||
|
||||
#endif
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/include/mach/uncompress.h
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#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()
|
||||
#define arch_decomp_wdog()
|
||||
|
||||
#endif
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/include/mach/vmalloc.h
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_VMALLOC_H
|
||||
#define __ASM_ARCH_VMALLOC_H
|
||||
|
||||
#define VMALLOC_END 0xF0000000
|
||||
|
||||
#endif
|
|
@ -0,0 +1,432 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/irq.c
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/platform.h>
|
||||
#include "common.h"
|
||||
|
||||
/*
|
||||
* Default value representing the Activation polarity of all internal
|
||||
* interrupt sources
|
||||
*/
|
||||
#define MIC_APR_DEFAULT 0x3FF0EFE0
|
||||
#define SIC1_APR_DEFAULT 0xFBD27186
|
||||
#define SIC2_APR_DEFAULT 0x801810C0
|
||||
|
||||
/*
|
||||
* Default value representing the Activation Type of all internal
|
||||
* interrupt sources. All are level sensitive.
|
||||
*/
|
||||
#define MIC_ATR_DEFAULT 0x00000000
|
||||
#define SIC1_ATR_DEFAULT 0x00026000
|
||||
#define SIC2_ATR_DEFAULT 0x00000000
|
||||
|
||||
struct lpc32xx_event_group_regs {
|
||||
void __iomem *enab_reg;
|
||||
void __iomem *edge_reg;
|
||||
void __iomem *maskstat_reg;
|
||||
void __iomem *rawstat_reg;
|
||||
};
|
||||
|
||||
static const struct lpc32xx_event_group_regs lpc32xx_event_int_regs = {
|
||||
.enab_reg = LPC32XX_CLKPWR_INT_ER,
|
||||
.edge_reg = LPC32XX_CLKPWR_INT_AP,
|
||||
.maskstat_reg = LPC32XX_CLKPWR_INT_SR,
|
||||
.rawstat_reg = LPC32XX_CLKPWR_INT_RS,
|
||||
};
|
||||
|
||||
static const struct lpc32xx_event_group_regs lpc32xx_event_pin_regs = {
|
||||
.enab_reg = LPC32XX_CLKPWR_PIN_ER,
|
||||
.edge_reg = LPC32XX_CLKPWR_PIN_AP,
|
||||
.maskstat_reg = LPC32XX_CLKPWR_PIN_SR,
|
||||
.rawstat_reg = LPC32XX_CLKPWR_PIN_RS,
|
||||
};
|
||||
|
||||
struct lpc32xx_event_info {
|
||||
const struct lpc32xx_event_group_regs *event_group;
|
||||
u32 mask;
|
||||
};
|
||||
|
||||
/*
|
||||
* Maps an IRQ number to and event mask and register
|
||||
*/
|
||||
static const struct lpc32xx_event_info lpc32xx_events[NR_IRQS] = {
|
||||
[IRQ_LPC32XX_GPI_08] = {
|
||||
.event_group = &lpc32xx_event_pin_regs,
|
||||
.mask = LPC32XX_CLKPWR_EXTSRC_GPI_08_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPI_09] = {
|
||||
.event_group = &lpc32xx_event_pin_regs,
|
||||
.mask = LPC32XX_CLKPWR_EXTSRC_GPI_09_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPI_19] = {
|
||||
.event_group = &lpc32xx_event_pin_regs,
|
||||
.mask = LPC32XX_CLKPWR_EXTSRC_GPI_19_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPI_07] = {
|
||||
.event_group = &lpc32xx_event_pin_regs,
|
||||
.mask = LPC32XX_CLKPWR_EXTSRC_GPI_07_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPI_00] = {
|
||||
.event_group = &lpc32xx_event_pin_regs,
|
||||
.mask = LPC32XX_CLKPWR_EXTSRC_GPI_00_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPI_01] = {
|
||||
.event_group = &lpc32xx_event_pin_regs,
|
||||
.mask = LPC32XX_CLKPWR_EXTSRC_GPI_01_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPI_02] = {
|
||||
.event_group = &lpc32xx_event_pin_regs,
|
||||
.mask = LPC32XX_CLKPWR_EXTSRC_GPI_02_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPI_03] = {
|
||||
.event_group = &lpc32xx_event_pin_regs,
|
||||
.mask = LPC32XX_CLKPWR_EXTSRC_GPI_03_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPI_04] = {
|
||||
.event_group = &lpc32xx_event_pin_regs,
|
||||
.mask = LPC32XX_CLKPWR_EXTSRC_GPI_04_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPI_05] = {
|
||||
.event_group = &lpc32xx_event_pin_regs,
|
||||
.mask = LPC32XX_CLKPWR_EXTSRC_GPI_05_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPI_06] = {
|
||||
.event_group = &lpc32xx_event_pin_regs,
|
||||
.mask = LPC32XX_CLKPWR_EXTSRC_GPI_06_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPIO_00] = {
|
||||
.event_group = &lpc32xx_event_int_regs,
|
||||
.mask = LPC32XX_CLKPWR_INTSRC_GPIO_00_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPIO_01] = {
|
||||
.event_group = &lpc32xx_event_int_regs,
|
||||
.mask = LPC32XX_CLKPWR_INTSRC_GPIO_01_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPIO_02] = {
|
||||
.event_group = &lpc32xx_event_int_regs,
|
||||
.mask = LPC32XX_CLKPWR_INTSRC_GPIO_02_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPIO_03] = {
|
||||
.event_group = &lpc32xx_event_int_regs,
|
||||
.mask = LPC32XX_CLKPWR_INTSRC_GPIO_03_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPIO_04] = {
|
||||
.event_group = &lpc32xx_event_int_regs,
|
||||
.mask = LPC32XX_CLKPWR_INTSRC_GPIO_04_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPIO_05] = {
|
||||
.event_group = &lpc32xx_event_int_regs,
|
||||
.mask = LPC32XX_CLKPWR_INTSRC_GPIO_05_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_KEY] = {
|
||||
.event_group = &lpc32xx_event_int_regs,
|
||||
.mask = LPC32XX_CLKPWR_INTSRC_KEY_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_USB_OTG_ATX] = {
|
||||
.event_group = &lpc32xx_event_int_regs,
|
||||
.mask = LPC32XX_CLKPWR_INTSRC_USBATXINT_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_USB_HOST] = {
|
||||
.event_group = &lpc32xx_event_int_regs,
|
||||
.mask = LPC32XX_CLKPWR_INTSRC_USB_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_RTC] = {
|
||||
.event_group = &lpc32xx_event_int_regs,
|
||||
.mask = LPC32XX_CLKPWR_INTSRC_RTC_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_MSTIMER] = {
|
||||
.event_group = &lpc32xx_event_int_regs,
|
||||
.mask = LPC32XX_CLKPWR_INTSRC_MSTIMER_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_TS_AUX] = {
|
||||
.event_group = &lpc32xx_event_int_regs,
|
||||
.mask = LPC32XX_CLKPWR_INTSRC_TS_AUX_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_TS_P] = {
|
||||
.event_group = &lpc32xx_event_int_regs,
|
||||
.mask = LPC32XX_CLKPWR_INTSRC_TS_P_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_TS_IRQ] = {
|
||||
.event_group = &lpc32xx_event_int_regs,
|
||||
.mask = LPC32XX_CLKPWR_INTSRC_ADC_BIT,
|
||||
},
|
||||
};
|
||||
|
||||
static void get_controller(unsigned int irq, unsigned int *base,
|
||||
unsigned int *irqbit)
|
||||
{
|
||||
if (irq < 32) {
|
||||
*base = LPC32XX_MIC_BASE;
|
||||
*irqbit = 1 << irq;
|
||||
} else if (irq < 64) {
|
||||
*base = LPC32XX_SIC1_BASE;
|
||||
*irqbit = 1 << (irq - 32);
|
||||
} else {
|
||||
*base = LPC32XX_SIC2_BASE;
|
||||
*irqbit = 1 << (irq - 64);
|
||||
}
|
||||
}
|
||||
|
||||
static void lpc32xx_mask_irq(unsigned int irq)
|
||||
{
|
||||
unsigned int reg, ctrl, mask;
|
||||
|
||||
get_controller(irq, &ctrl, &mask);
|
||||
|
||||
reg = __raw_readl(LPC32XX_INTC_MASK(ctrl)) & ~mask;
|
||||
__raw_writel(reg, LPC32XX_INTC_MASK(ctrl));
|
||||
}
|
||||
|
||||
static void lpc32xx_unmask_irq(unsigned int irq)
|
||||
{
|
||||
unsigned int reg, ctrl, mask;
|
||||
|
||||
get_controller(irq, &ctrl, &mask);
|
||||
|
||||
reg = __raw_readl(LPC32XX_INTC_MASK(ctrl)) | mask;
|
||||
__raw_writel(reg, LPC32XX_INTC_MASK(ctrl));
|
||||
}
|
||||
|
||||
static void lpc32xx_ack_irq(unsigned int irq)
|
||||
{
|
||||
unsigned int ctrl, mask;
|
||||
|
||||
get_controller(irq, &ctrl, &mask);
|
||||
|
||||
__raw_writel(mask, LPC32XX_INTC_RAW_STAT(ctrl));
|
||||
|
||||
/* Also need to clear pending wake event */
|
||||
if (lpc32xx_events[irq].mask != 0)
|
||||
__raw_writel(lpc32xx_events[irq].mask,
|
||||
lpc32xx_events[irq].event_group->rawstat_reg);
|
||||
}
|
||||
|
||||
static void __lpc32xx_set_irq_type(unsigned int irq, int use_high_level,
|
||||
int use_edge)
|
||||
{
|
||||
unsigned int reg, ctrl, mask;
|
||||
|
||||
get_controller(irq, &ctrl, &mask);
|
||||
|
||||
/* Activation level, high or low */
|
||||
reg = __raw_readl(LPC32XX_INTC_POLAR(ctrl));
|
||||
if (use_high_level)
|
||||
reg |= mask;
|
||||
else
|
||||
reg &= ~mask;
|
||||
__raw_writel(reg, LPC32XX_INTC_POLAR(ctrl));
|
||||
|
||||
/* Activation type, edge or level */
|
||||
reg = __raw_readl(LPC32XX_INTC_ACT_TYPE(ctrl));
|
||||
if (use_edge)
|
||||
reg |= mask;
|
||||
else
|
||||
reg &= ~mask;
|
||||
__raw_writel(reg, LPC32XX_INTC_ACT_TYPE(ctrl));
|
||||
|
||||
/* Use same polarity for the wake events */
|
||||
if (lpc32xx_events[irq].mask != 0) {
|
||||
reg = __raw_readl(lpc32xx_events[irq].event_group->edge_reg);
|
||||
|
||||
if (use_high_level)
|
||||
reg |= lpc32xx_events[irq].mask;
|
||||
else
|
||||
reg &= ~lpc32xx_events[irq].mask;
|
||||
|
||||
__raw_writel(reg, lpc32xx_events[irq].event_group->edge_reg);
|
||||
}
|
||||
}
|
||||
|
||||
static int lpc32xx_set_irq_type(unsigned int irq, unsigned int type)
|
||||
{
|
||||
switch (type) {
|
||||
case IRQ_TYPE_EDGE_RISING:
|
||||
/* Rising edge sensitive */
|
||||
__lpc32xx_set_irq_type(irq, 1, 1);
|
||||
break;
|
||||
|
||||
case IRQ_TYPE_EDGE_FALLING:
|
||||
/* Falling edge sensitive */
|
||||
__lpc32xx_set_irq_type(irq, 0, 1);
|
||||
break;
|
||||
|
||||
case IRQ_TYPE_LEVEL_LOW:
|
||||
/* Low level sensitive */
|
||||
__lpc32xx_set_irq_type(irq, 0, 0);
|
||||
break;
|
||||
|
||||
case IRQ_TYPE_LEVEL_HIGH:
|
||||
/* High level sensitive */
|
||||
__lpc32xx_set_irq_type(irq, 1, 0);
|
||||
break;
|
||||
|
||||
/* Other modes are not supported */
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Ok to use the level handler for all types */
|
||||
set_irq_handler(irq, handle_level_irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lpc32xx_irq_wake(unsigned int irqno, unsigned int state)
|
||||
{
|
||||
unsigned long eventreg;
|
||||
|
||||
if (lpc32xx_events[irqno].mask != 0) {
|
||||
eventreg = __raw_readl(lpc32xx_events[irqno].
|
||||
event_group->enab_reg);
|
||||
|
||||
if (state)
|
||||
eventreg |= lpc32xx_events[irqno].mask;
|
||||
else
|
||||
eventreg &= ~lpc32xx_events[irqno].mask;
|
||||
|
||||
__raw_writel(eventreg,
|
||||
lpc32xx_events[irqno].event_group->enab_reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Clear event */
|
||||
__raw_writel(lpc32xx_events[irqno].mask,
|
||||
lpc32xx_events[irqno].event_group->rawstat_reg);
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static void __init lpc32xx_set_default_mappings(unsigned int apr,
|
||||
unsigned int atr, unsigned int offset)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
/* Set activation levels for each interrupt */
|
||||
i = 0;
|
||||
while (i < 32) {
|
||||
__lpc32xx_set_irq_type(offset + i, ((apr >> i) & 0x1),
|
||||
((atr >> i) & 0x1));
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
static struct irq_chip lpc32xx_irq_chip = {
|
||||
.ack = lpc32xx_ack_irq,
|
||||
.mask = lpc32xx_mask_irq,
|
||||
.unmask = lpc32xx_unmask_irq,
|
||||
.set_type = lpc32xx_set_irq_type,
|
||||
.set_wake = lpc32xx_irq_wake
|
||||
};
|
||||
|
||||
static void lpc32xx_sic1_handler(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
unsigned long ints = __raw_readl(LPC32XX_INTC_STAT(LPC32XX_SIC1_BASE));
|
||||
|
||||
while (ints != 0) {
|
||||
int irqno = fls(ints) - 1;
|
||||
|
||||
ints &= ~(1 << irqno);
|
||||
|
||||
generic_handle_irq(LPC32XX_SIC1_IRQ(irqno));
|
||||
}
|
||||
}
|
||||
|
||||
static void lpc32xx_sic2_handler(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
unsigned long ints = __raw_readl(LPC32XX_INTC_STAT(LPC32XX_SIC2_BASE));
|
||||
|
||||
while (ints != 0) {
|
||||
int irqno = fls(ints) - 1;
|
||||
|
||||
ints &= ~(1 << irqno);
|
||||
|
||||
generic_handle_irq(LPC32XX_SIC2_IRQ(irqno));
|
||||
}
|
||||
}
|
||||
|
||||
void __init lpc32xx_init_irq(void)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
/* Setup MIC */
|
||||
__raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_MIC_BASE));
|
||||
__raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_MIC_BASE));
|
||||
__raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_MIC_BASE));
|
||||
|
||||
/* Setup SIC1 */
|
||||
__raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC1_BASE));
|
||||
__raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC1_BASE));
|
||||
__raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC1_BASE));
|
||||
|
||||
/* Setup SIC2 */
|
||||
__raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC2_BASE));
|
||||
__raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC2_BASE));
|
||||
__raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC2_BASE));
|
||||
|
||||
/* Configure supported IRQ's */
|
||||
for (i = 0; i < NR_IRQS; i++) {
|
||||
set_irq_chip(i, &lpc32xx_irq_chip);
|
||||
set_irq_handler(i, handle_level_irq);
|
||||
set_irq_flags(i, IRQF_VALID);
|
||||
}
|
||||
|
||||
/* Set default mappings */
|
||||
lpc32xx_set_default_mappings(MIC_APR_DEFAULT, MIC_ATR_DEFAULT, 0);
|
||||
lpc32xx_set_default_mappings(SIC1_APR_DEFAULT, SIC1_ATR_DEFAULT, 32);
|
||||
lpc32xx_set_default_mappings(SIC2_APR_DEFAULT, SIC2_ATR_DEFAULT, 64);
|
||||
|
||||
/* mask all interrupts except SUBIRQ */
|
||||
__raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_MIC_BASE));
|
||||
__raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC1_BASE));
|
||||
__raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC2_BASE));
|
||||
|
||||
/* MIC SUBIRQx interrupts will route handling to the chain handlers */
|
||||
set_irq_chained_handler(IRQ_LPC32XX_SUB1IRQ, lpc32xx_sic1_handler);
|
||||
set_irq_chained_handler(IRQ_LPC32XX_SUB2IRQ, lpc32xx_sic2_handler);
|
||||
|
||||
/* Initially disable all wake events */
|
||||
__raw_writel(0, LPC32XX_CLKPWR_P01_ER);
|
||||
__raw_writel(0, LPC32XX_CLKPWR_INT_ER);
|
||||
__raw_writel(0, LPC32XX_CLKPWR_PIN_ER);
|
||||
|
||||
/*
|
||||
* Default wake activation polarities, all pin sources are low edge
|
||||
* triggered
|
||||
*/
|
||||
__raw_writel(LPC32XX_CLKPWR_INTSRC_TS_P_BIT |
|
||||
LPC32XX_CLKPWR_INTSRC_MSTIMER_BIT |
|
||||
LPC32XX_CLKPWR_INTSRC_RTC_BIT,
|
||||
LPC32XX_CLKPWR_INT_AP);
|
||||
__raw_writel(0, LPC32XX_CLKPWR_PIN_AP);
|
||||
|
||||
/* Clear latched wake event states */
|
||||
__raw_writel(__raw_readl(LPC32XX_CLKPWR_PIN_RS),
|
||||
LPC32XX_CLKPWR_PIN_RS);
|
||||
__raw_writel(__raw_readl(LPC32XX_CLKPWR_INT_RS),
|
||||
LPC32XX_CLKPWR_INT_RS);
|
||||
}
|
|
@ -0,0 +1,397 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/phy3250.c
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/eeprom.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/amba/bus.h>
|
||||
#include <linux/amba/clcd.h>
|
||||
#include <linux/amba/pl022.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/platform.h>
|
||||
#include "common.h"
|
||||
|
||||
/*
|
||||
* Mapped GPIOLIB GPIOs
|
||||
*/
|
||||
#define SPI0_CS_GPIO LPC32XX_GPIO(LPC32XX_GPIO_P3_GRP, 5)
|
||||
#define LCD_POWER_GPIO LPC32XX_GPIO(LPC32XX_GPO_P3_GRP, 0)
|
||||
#define BKL_POWER_GPIO LPC32XX_GPIO(LPC32XX_GPO_P3_GRP, 4)
|
||||
#define LED_GPIO LPC32XX_GPIO(LPC32XX_GPO_P3_GRP, 1)
|
||||
|
||||
/*
|
||||
* AMBA LCD controller
|
||||
*/
|
||||
static struct clcd_panel conn_lcd_panel = {
|
||||
.mode = {
|
||||
.name = "QVGA portrait",
|
||||
.refresh = 60,
|
||||
.xres = 240,
|
||||
.yres = 320,
|
||||
.pixclock = 191828,
|
||||
.left_margin = 22,
|
||||
.right_margin = 11,
|
||||
.upper_margin = 2,
|
||||
.lower_margin = 1,
|
||||
.hsync_len = 5,
|
||||
.vsync_len = 2,
|
||||
.sync = 0,
|
||||
.vmode = FB_VMODE_NONINTERLACED,
|
||||
},
|
||||
.width = -1,
|
||||
.height = -1,
|
||||
.tim2 = (TIM2_IVS | TIM2_IHS),
|
||||
.cntl = (CNTL_BGR | CNTL_LCDTFT | CNTL_LCDVCOMP(1) |
|
||||
CNTL_LCDBPP16_565),
|
||||
.bpp = 16,
|
||||
};
|
||||
#define PANEL_SIZE (3 * SZ_64K)
|
||||
|
||||
static int lpc32xx_clcd_setup(struct clcd_fb *fb)
|
||||
{
|
||||
dma_addr_t dma;
|
||||
|
||||
fb->fb.screen_base = dma_alloc_writecombine(&fb->dev->dev,
|
||||
PANEL_SIZE, &dma, GFP_KERNEL);
|
||||
if (!fb->fb.screen_base) {
|
||||
printk(KERN_ERR "CLCD: unable to map framebuffer\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
fb->fb.fix.smem_start = dma;
|
||||
fb->fb.fix.smem_len = PANEL_SIZE;
|
||||
fb->panel = &conn_lcd_panel;
|
||||
|
||||
if (gpio_request(LCD_POWER_GPIO, "LCD power"))
|
||||
printk(KERN_ERR "Error requesting gpio %u",
|
||||
LCD_POWER_GPIO);
|
||||
else if (gpio_direction_output(LCD_POWER_GPIO, 1))
|
||||
printk(KERN_ERR "Error setting gpio %u to output",
|
||||
LCD_POWER_GPIO);
|
||||
|
||||
if (gpio_request(BKL_POWER_GPIO, "LCD backlight power"))
|
||||
printk(KERN_ERR "Error requesting gpio %u",
|
||||
BKL_POWER_GPIO);
|
||||
else if (gpio_direction_output(BKL_POWER_GPIO, 1))
|
||||
printk(KERN_ERR "Error setting gpio %u to output",
|
||||
BKL_POWER_GPIO);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lpc32xx_clcd_mmap(struct clcd_fb *fb, struct vm_area_struct *vma)
|
||||
{
|
||||
return dma_mmap_writecombine(&fb->dev->dev, vma,
|
||||
fb->fb.screen_base, fb->fb.fix.smem_start,
|
||||
fb->fb.fix.smem_len);
|
||||
}
|
||||
|
||||
static void lpc32xx_clcd_remove(struct clcd_fb *fb)
|
||||
{
|
||||
dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len,
|
||||
fb->fb.screen_base, fb->fb.fix.smem_start);
|
||||
}
|
||||
|
||||
/*
|
||||
* On some early LCD modules (1307.0), the backlight logic is inverted.
|
||||
* For those board variants, swap the disable and enable states for
|
||||
* BKL_POWER_GPIO.
|
||||
*/
|
||||
static void clcd_disable(struct clcd_fb *fb)
|
||||
{
|
||||
gpio_set_value(BKL_POWER_GPIO, 0);
|
||||
gpio_set_value(LCD_POWER_GPIO, 0);
|
||||
}
|
||||
|
||||
static void clcd_enable(struct clcd_fb *fb)
|
||||
{
|
||||
gpio_set_value(BKL_POWER_GPIO, 1);
|
||||
gpio_set_value(LCD_POWER_GPIO, 1);
|
||||
}
|
||||
|
||||
static struct clcd_board lpc32xx_clcd_data = {
|
||||
.name = "Phytec LCD",
|
||||
.check = clcdfb_check,
|
||||
.decode = clcdfb_decode,
|
||||
.disable = clcd_disable,
|
||||
.enable = clcd_enable,
|
||||
.setup = lpc32xx_clcd_setup,
|
||||
.mmap = lpc32xx_clcd_mmap,
|
||||
.remove = lpc32xx_clcd_remove,
|
||||
};
|
||||
|
||||
static struct amba_device lpc32xx_clcd_device = {
|
||||
.dev = {
|
||||
.coherent_dma_mask = ~0,
|
||||
.init_name = "dev:clcd",
|
||||
.platform_data = &lpc32xx_clcd_data,
|
||||
},
|
||||
.res = {
|
||||
.start = LPC32XX_LCD_BASE,
|
||||
.end = (LPC32XX_LCD_BASE + SZ_4K - 1),
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
.dma_mask = ~0,
|
||||
.irq = {IRQ_LPC32XX_LCD, NO_IRQ},
|
||||
};
|
||||
|
||||
/*
|
||||
* AMBA SSP (SPI)
|
||||
*/
|
||||
static void phy3250_spi_cs_set(u32 control)
|
||||
{
|
||||
gpio_set_value(SPI0_CS_GPIO, (int) control);
|
||||
}
|
||||
|
||||
static struct pl022_config_chip spi0_chip_info = {
|
||||
.lbm = LOOPBACK_DISABLED,
|
||||
.com_mode = INTERRUPT_TRANSFER,
|
||||
.iface = SSP_INTERFACE_MOTOROLA_SPI,
|
||||
.hierarchy = SSP_MASTER,
|
||||
.slave_tx_disable = 0,
|
||||
.endian_tx = SSP_TX_LSB,
|
||||
.endian_rx = SSP_RX_LSB,
|
||||
.data_size = SSP_DATA_BITS_8,
|
||||
.rx_lev_trig = SSP_RX_4_OR_MORE_ELEM,
|
||||
.tx_lev_trig = SSP_TX_4_OR_MORE_EMPTY_LOC,
|
||||
.clk_phase = SSP_CLK_FIRST_EDGE,
|
||||
.clk_pol = SSP_CLK_POL_IDLE_LOW,
|
||||
.ctrl_len = SSP_BITS_8,
|
||||
.wait_state = SSP_MWIRE_WAIT_ZERO,
|
||||
.duplex = SSP_MICROWIRE_CHANNEL_FULL_DUPLEX,
|
||||
.cs_control = phy3250_spi_cs_set,
|
||||
};
|
||||
|
||||
static struct pl022_ssp_controller lpc32xx_ssp0_data = {
|
||||
.bus_id = 0,
|
||||
.num_chipselect = 1,
|
||||
.enable_dma = 0,
|
||||
};
|
||||
|
||||
static struct amba_device lpc32xx_ssp0_device = {
|
||||
.dev = {
|
||||
.coherent_dma_mask = ~0,
|
||||
.init_name = "dev:ssp0",
|
||||
.platform_data = &lpc32xx_ssp0_data,
|
||||
},
|
||||
.res = {
|
||||
.start = LPC32XX_SSP0_BASE,
|
||||
.end = (LPC32XX_SSP0_BASE + SZ_4K - 1),
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
.dma_mask = ~0,
|
||||
.irq = {IRQ_LPC32XX_SSP0, NO_IRQ},
|
||||
};
|
||||
|
||||
/* AT25 driver registration */
|
||||
static int __init phy3250_spi_board_register(void)
|
||||
{
|
||||
#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
|
||||
static struct spi_board_info info[] = {
|
||||
{
|
||||
.modalias = "spidev",
|
||||
.max_speed_hz = 5000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.controller_data = &spi0_chip_info,
|
||||
},
|
||||
};
|
||||
|
||||
#else
|
||||
static struct spi_eeprom eeprom = {
|
||||
.name = "at25256a",
|
||||
.byte_len = 0x8000,
|
||||
.page_size = 64,
|
||||
.flags = EE_ADDR2,
|
||||
};
|
||||
|
||||
static struct spi_board_info info[] = {
|
||||
{
|
||||
.modalias = "at25",
|
||||
.max_speed_hz = 5000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.platform_data = &eeprom,
|
||||
.controller_data = &spi0_chip_info,
|
||||
},
|
||||
};
|
||||
#endif
|
||||
return spi_register_board_info(info, ARRAY_SIZE(info));
|
||||
}
|
||||
arch_initcall(phy3250_spi_board_register);
|
||||
|
||||
static struct i2c_board_info __initdata phy3250_i2c_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("pcf8563", 0x51),
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led phy_leds[] = {
|
||||
{
|
||||
.name = "led0",
|
||||
.gpio = LED_GPIO,
|
||||
.active_low = 1,
|
||||
.default_trigger = "heartbeat",
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data led_data = {
|
||||
.leds = phy_leds,
|
||||
.num_leds = ARRAY_SIZE(phy_leds),
|
||||
};
|
||||
|
||||
static struct platform_device lpc32xx_gpio_led_device = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev.platform_data = &led_data,
|
||||
};
|
||||
|
||||
static struct platform_device *phy3250_devs[] __initdata = {
|
||||
&lpc32xx_i2c0_device,
|
||||
&lpc32xx_i2c1_device,
|
||||
&lpc32xx_i2c2_device,
|
||||
&lpc32xx_watchdog_device,
|
||||
&lpc32xx_gpio_led_device,
|
||||
};
|
||||
|
||||
static struct amba_device *amba_devs[] __initdata = {
|
||||
&lpc32xx_clcd_device,
|
||||
&lpc32xx_ssp0_device,
|
||||
};
|
||||
|
||||
/*
|
||||
* Board specific functions
|
||||
*/
|
||||
static void __init phy3250_board_init(void)
|
||||
{
|
||||
u32 tmp;
|
||||
int i;
|
||||
|
||||
lpc32xx_gpio_init();
|
||||
|
||||
/* Register GPIOs used on this board */
|
||||
if (gpio_request(SPI0_CS_GPIO, "spi0 cs"))
|
||||
printk(KERN_ERR "Error requesting gpio %u",
|
||||
SPI0_CS_GPIO);
|
||||
else if (gpio_direction_output(SPI0_CS_GPIO, 1))
|
||||
printk(KERN_ERR "Error setting gpio %u to output",
|
||||
SPI0_CS_GPIO);
|
||||
|
||||
/* Setup network interface for RMII mode */
|
||||
tmp = __raw_readl(LPC32XX_CLKPWR_MACCLK_CTRL);
|
||||
tmp &= ~LPC32XX_CLKPWR_MACCTRL_PINS_MSK;
|
||||
tmp |= LPC32XX_CLKPWR_MACCTRL_USE_RMII_PINS;
|
||||
__raw_writel(tmp, LPC32XX_CLKPWR_MACCLK_CTRL);
|
||||
|
||||
/* Setup SLC NAND controller muxing */
|
||||
__raw_writel(LPC32XX_CLKPWR_NANDCLK_SEL_SLC,
|
||||
LPC32XX_CLKPWR_NAND_CLK_CTRL);
|
||||
|
||||
/* Setup LCD muxing to RGB565 */
|
||||
tmp = __raw_readl(LPC32XX_CLKPWR_LCDCLK_CTRL) &
|
||||
~(LPC32XX_CLKPWR_LCDCTRL_LCDTYPE_MSK |
|
||||
LPC32XX_CLKPWR_LCDCTRL_PSCALE_MSK);
|
||||
tmp |= LPC32XX_CLKPWR_LCDCTRL_LCDTYPE_TFT16;
|
||||
__raw_writel(tmp, LPC32XX_CLKPWR_LCDCLK_CTRL);
|
||||
|
||||
/* Set up I2C pull levels */
|
||||
tmp = __raw_readl(LPC32XX_CLKPWR_I2C_CLK_CTRL);
|
||||
tmp |= LPC32XX_CLKPWR_I2CCLK_USBI2CHI_DRIVE |
|
||||
LPC32XX_CLKPWR_I2CCLK_I2C2HI_DRIVE;
|
||||
__raw_writel(tmp, LPC32XX_CLKPWR_I2C_CLK_CTRL);
|
||||
|
||||
/* Disable IrDA pulsing support on UART6 */
|
||||
tmp = __raw_readl(LPC32XX_UARTCTL_CTRL);
|
||||
tmp |= LPC32XX_UART_UART6_IRDAMOD_BYPASS;
|
||||
__raw_writel(tmp, LPC32XX_UARTCTL_CTRL);
|
||||
|
||||
/* Enable DMA for I2S1 channel */
|
||||
tmp = __raw_readl(LPC32XX_CLKPWR_I2S_CLK_CTRL);
|
||||
tmp = LPC32XX_CLKPWR_I2SCTRL_I2S1_USE_DMA;
|
||||
__raw_writel(tmp, LPC32XX_CLKPWR_I2S_CLK_CTRL);
|
||||
|
||||
lpc32xx_serial_init();
|
||||
|
||||
/*
|
||||
* AMBA peripheral clocks need to be enabled prior to AMBA device
|
||||
* detection or a data fault will occur, so enable the clocks
|
||||
* here. However, we don't want to enable them if the peripheral
|
||||
* isn't included in the image
|
||||
*/
|
||||
#ifdef CONFIG_FB_ARMCLCD
|
||||
tmp = __raw_readl(LPC32XX_CLKPWR_LCDCLK_CTRL);
|
||||
__raw_writel((tmp | LPC32XX_CLKPWR_LCDCTRL_CLK_EN),
|
||||
LPC32XX_CLKPWR_LCDCLK_CTRL);
|
||||
#endif
|
||||
#ifdef CONFIG_SPI_PL022
|
||||
tmp = __raw_readl(LPC32XX_CLKPWR_SSP_CLK_CTRL);
|
||||
__raw_writel((tmp | LPC32XX_CLKPWR_SSPCTRL_SSPCLK0_EN),
|
||||
LPC32XX_CLKPWR_SSP_CLK_CTRL);
|
||||
#endif
|
||||
|
||||
platform_add_devices(phy3250_devs, ARRAY_SIZE(phy3250_devs));
|
||||
for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
|
||||
struct amba_device *d = amba_devs[i];
|
||||
amba_device_register(d, &iomem_resource);
|
||||
}
|
||||
|
||||
/* Test clock needed for UDA1380 initial init */
|
||||
__raw_writel(LPC32XX_CLKPWR_TESTCLK2_SEL_MOSC |
|
||||
LPC32XX_CLKPWR_TESTCLK_TESTCLK2_EN,
|
||||
LPC32XX_CLKPWR_TEST_CLK_SEL);
|
||||
|
||||
i2c_register_board_info(0, phy3250_i2c_board_info,
|
||||
ARRAY_SIZE(phy3250_i2c_board_info));
|
||||
}
|
||||
|
||||
static int __init lpc32xx_display_uid(void)
|
||||
{
|
||||
u32 uid[4];
|
||||
|
||||
lpc32xx_get_uid(uid);
|
||||
|
||||
printk(KERN_INFO "LPC32XX unique ID: %08x%08x%08x%08x\n",
|
||||
uid[3], uid[2], uid[1], uid[0]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
arch_initcall(lpc32xx_display_uid);
|
||||
|
||||
MACHINE_START(PHY3250, "Phytec 3250 board with the LPC3250 Microcontroller")
|
||||
/* Maintainer: Kevin Wells, NXP Semiconductors */
|
||||
.phys_io = LPC32XX_UART5_BASE,
|
||||
.io_pg_offst = ((IO_ADDRESS(LPC32XX_UART5_BASE))>>18) & 0xfffc,
|
||||
.boot_params = 0x80000100,
|
||||
.map_io = lpc32xx_map_io,
|
||||
.init_irq = lpc32xx_init_irq,
|
||||
.timer = &lpc32xx_timer,
|
||||
.init_machine = phy3250_board_init,
|
||||
MACHINE_END
|
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/pm.c
|
||||
*
|
||||
* Original authors: Vitaly Wool, Dmitry Chigirev <source@mvista.com>
|
||||
* Modified by Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* 2005 (c) MontaVista Software, Inc. This file is licensed under
|
||||
* the terms of the GNU General Public License version 2. This program
|
||||
* is licensed "as is" without any warranty of any kind, whether express
|
||||
* or implied.
|
||||
*/
|
||||
|
||||
/*
|
||||
* LPC32XX CPU and system power management
|
||||
*
|
||||
* The LCP32XX has three CPU modes for controlling system power: run,
|
||||
* direct-run, and halt modes. When switching between halt and run modes,
|
||||
* the CPU transistions through direct-run mode. For Linux, direct-run
|
||||
* mode is not used in normal operation. Halt mode is used when the
|
||||
* system is fully suspended.
|
||||
*
|
||||
* Run mode:
|
||||
* The ARM CPU clock (HCLK_PLL), HCLK bus clock, and PCLK bus clocks are
|
||||
* derived from the HCLK PLL. The HCLK and PCLK bus rates are divided from
|
||||
* the HCLK_PLL rate. Linux runs in this mode.
|
||||
*
|
||||
* Direct-run mode:
|
||||
* The ARM CPU clock, HCLK bus clock, and PCLK bus clocks are driven from
|
||||
* SYSCLK. SYSCLK is usually around 13MHz, but may vary based on SYSCLK
|
||||
* source or the frequency of the main oscillator. In this mode, the
|
||||
* HCLK_PLL can be safely enabled, changed, or disabled.
|
||||
*
|
||||
* Halt mode:
|
||||
* SYSCLK is gated off and the CPU and system clocks are halted.
|
||||
* Peripherals based on the 32KHz oscillator clock (ie, RTC, touch,
|
||||
* key scanner, etc.) still operate if enabled. In this state, an enabled
|
||||
* system event (ie, GPIO state change, RTC match, key press, etc.) will
|
||||
* wake the system up back into direct-run mode.
|
||||
*
|
||||
* DRAM refresh
|
||||
* DRAM clocking and refresh are slightly different for systems with DDR
|
||||
* DRAM or regular SDRAM devices. If SDRAM is used in the system, the
|
||||
* SDRAM will still be accessible in direct-run mode. In DDR based systems,
|
||||
* a transistion to direct-run mode will stop all DDR accesses (no clocks).
|
||||
* Because of this, the code to switch power modes and the code to enter
|
||||
* and exit DRAM self-refresh modes must not be executed in DRAM. A small
|
||||
* section of IRAM is used instead for this.
|
||||
*
|
||||
* Suspend is handled with the following logic:
|
||||
* Backup a small area of IRAM used for the suspend code
|
||||
* Copy suspend code to IRAM
|
||||
* Transfer control to code in IRAM
|
||||
* Places DRAMs in self-refresh mode
|
||||
* Enter direct-run mode
|
||||
* Save state of HCLK_PLL PLL
|
||||
* Disable HCLK_PLL PLL
|
||||
* Enter halt mode - CPU and buses will stop
|
||||
* System enters direct-run mode when an enabled event occurs
|
||||
* HCLK PLL state is restored
|
||||
* Run mode is entered
|
||||
* DRAMS are placed back into normal mode
|
||||
* Code execution returns from IRAM
|
||||
* IRAM code are used for suspend is restored
|
||||
* Suspend mode is exited
|
||||
*/
|
||||
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/platform.h>
|
||||
#include "common.h"
|
||||
#include "clock.h"
|
||||
|
||||
#define TEMP_IRAM_AREA IO_ADDRESS(LPC32XX_IRAM_BASE)
|
||||
|
||||
/*
|
||||
* Both STANDBY and MEM suspend states are handled the same with no
|
||||
* loss of CPU or memory state
|
||||
*/
|
||||
static int lpc32xx_pm_enter(suspend_state_t state)
|
||||
{
|
||||
int (*lpc32xx_suspend_ptr) (void);
|
||||
void *iram_swap_area;
|
||||
|
||||
/* Allocate some space for temporary IRAM storage */
|
||||
iram_swap_area = kmalloc(lpc32xx_sys_suspend_sz, GFP_KERNEL);
|
||||
if (!iram_swap_area) {
|
||||
printk(KERN_ERR
|
||||
"PM Suspend: cannot allocate memory to save portion "
|
||||
"of SRAM\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Backup a small area of IRAM used for the suspend code */
|
||||
memcpy(iram_swap_area, (void *) TEMP_IRAM_AREA,
|
||||
lpc32xx_sys_suspend_sz);
|
||||
|
||||
/*
|
||||
* Copy code to suspend system into IRAM. The suspend code
|
||||
* needs to run from IRAM as DRAM may no longer be available
|
||||
* when the PLL is stopped.
|
||||
*/
|
||||
memcpy((void *) TEMP_IRAM_AREA, &lpc32xx_sys_suspend,
|
||||
lpc32xx_sys_suspend_sz);
|
||||
flush_icache_range((unsigned long)TEMP_IRAM_AREA,
|
||||
(unsigned long)(TEMP_IRAM_AREA) + lpc32xx_sys_suspend_sz);
|
||||
|
||||
/* Transfer to suspend code in IRAM */
|
||||
lpc32xx_suspend_ptr = (void *) TEMP_IRAM_AREA;
|
||||
flush_cache_all();
|
||||
(void) lpc32xx_suspend_ptr();
|
||||
|
||||
/* Restore original IRAM contents */
|
||||
memcpy((void *) TEMP_IRAM_AREA, iram_swap_area,
|
||||
lpc32xx_sys_suspend_sz);
|
||||
|
||||
kfree(iram_swap_area);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_suspend_ops lpc32xx_pm_ops = {
|
||||
.valid = suspend_valid_only_mem,
|
||||
.enter = lpc32xx_pm_enter,
|
||||
};
|
||||
|
||||
#define EMC_DYN_MEM_CTRL_OFS 0x20
|
||||
#define EMC_SRMMC (1 << 3)
|
||||
#define EMC_CTRL_REG io_p2v(LPC32XX_EMC_BASE + EMC_DYN_MEM_CTRL_OFS)
|
||||
static int __init lpc32xx_pm_init(void)
|
||||
{
|
||||
/*
|
||||
* Setup SDRAM self-refresh clock to automatically disable o
|
||||
* start of self-refresh. This only needs to be done once.
|
||||
*/
|
||||
__raw_writel(__raw_readl(EMC_CTRL_REG) | EMC_SRMMC, EMC_CTRL_REG);
|
||||
|
||||
suspend_set_ops(&lpc32xx_pm_ops);
|
||||
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(lpc32xx_pm_init);
|
|
@ -0,0 +1,190 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/serial.c
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2010 NXP Semiconductors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/serial_reg.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/platform.h>
|
||||
#include "common.h"
|
||||
|
||||
#define LPC32XX_SUART_FIFO_SIZE 64
|
||||
|
||||
/* Standard 8250/16550 compatible serial ports */
|
||||
static struct plat_serial8250_port serial_std_platform_data[] = {
|
||||
#ifdef CONFIG_ARCH_LPC32XX_UART5_SELECT
|
||||
{
|
||||
.membase = io_p2v(LPC32XX_UART5_BASE),
|
||||
.mapbase = LPC32XX_UART5_BASE,
|
||||
.irq = IRQ_LPC32XX_UART_IIR5,
|
||||
.uartclk = LPC32XX_MAIN_OSC_FREQ,
|
||||
.regshift = 2,
|
||||
.iotype = UPIO_MEM32,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_BUGGY_UART |
|
||||
UPF_SKIP_TEST,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_LPC32XX_UART3_SELECT
|
||||
{
|
||||
.membase = io_p2v(LPC32XX_UART3_BASE),
|
||||
.mapbase = LPC32XX_UART3_BASE,
|
||||
.irq = IRQ_LPC32XX_UART_IIR3,
|
||||
.uartclk = LPC32XX_MAIN_OSC_FREQ,
|
||||
.regshift = 2,
|
||||
.iotype = UPIO_MEM32,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_BUGGY_UART |
|
||||
UPF_SKIP_TEST,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_LPC32XX_UART4_SELECT
|
||||
{
|
||||
.membase = io_p2v(LPC32XX_UART4_BASE),
|
||||
.mapbase = LPC32XX_UART4_BASE,
|
||||
.irq = IRQ_LPC32XX_UART_IIR4,
|
||||
.uartclk = LPC32XX_MAIN_OSC_FREQ,
|
||||
.regshift = 2,
|
||||
.iotype = UPIO_MEM32,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_BUGGY_UART |
|
||||
UPF_SKIP_TEST,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_LPC32XX_UART6_SELECT
|
||||
{
|
||||
.membase = io_p2v(LPC32XX_UART6_BASE),
|
||||
.mapbase = LPC32XX_UART6_BASE,
|
||||
.irq = IRQ_LPC32XX_UART_IIR6,
|
||||
.uartclk = LPC32XX_MAIN_OSC_FREQ,
|
||||
.regshift = 2,
|
||||
.iotype = UPIO_MEM32,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_BUGGY_UART |
|
||||
UPF_SKIP_TEST,
|
||||
},
|
||||
#endif
|
||||
{ },
|
||||
};
|
||||
|
||||
struct uartinit {
|
||||
char *uart_ck_name;
|
||||
u32 ck_mode_mask;
|
||||
void __iomem *pdiv_clk_reg;
|
||||
};
|
||||
|
||||
static struct uartinit uartinit_data[] __initdata = {
|
||||
#ifdef CONFIG_ARCH_LPC32XX_UART5_SELECT
|
||||
{
|
||||
.uart_ck_name = "uart5_ck",
|
||||
.ck_mode_mask =
|
||||
LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 5),
|
||||
.pdiv_clk_reg = LPC32XX_CLKPWR_UART5_CLK_CTRL,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_LPC32XX_UART3_SELECT
|
||||
{
|
||||
.uart_ck_name = "uart3_ck",
|
||||
.ck_mode_mask =
|
||||
LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 3),
|
||||
.pdiv_clk_reg = LPC32XX_CLKPWR_UART3_CLK_CTRL,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_LPC32XX_UART4_SELECT
|
||||
{
|
||||
.uart_ck_name = "uart4_ck",
|
||||
.ck_mode_mask =
|
||||
LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 4),
|
||||
.pdiv_clk_reg = LPC32XX_CLKPWR_UART4_CLK_CTRL,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_LPC32XX_UART6_SELECT
|
||||
{
|
||||
.uart_ck_name = "uart6_ck",
|
||||
.ck_mode_mask =
|
||||
LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 6),
|
||||
.pdiv_clk_reg = LPC32XX_CLKPWR_UART6_CLK_CTRL,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct platform_device serial_std_platform_device = {
|
||||
.name = "serial8250",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = serial_std_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *lpc32xx_serial_devs[] __initdata = {
|
||||
&serial_std_platform_device,
|
||||
};
|
||||
|
||||
void __init lpc32xx_serial_init(void)
|
||||
{
|
||||
u32 tmp, clkmodes = 0;
|
||||
struct clk *clk;
|
||||
unsigned int puart;
|
||||
int i, j;
|
||||
|
||||
/* UART clocks are off, let clock driver manage them */
|
||||
__raw_writel(0, LPC32XX_CLKPWR_UART_CLK_CTRL);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(uartinit_data); i++) {
|
||||
clk = clk_get(NULL, uartinit_data[i].uart_ck_name);
|
||||
if (!IS_ERR(clk)) {
|
||||
clk_enable(clk);
|
||||
serial_std_platform_data[i].uartclk =
|
||||
clk_get_rate(clk);
|
||||
}
|
||||
|
||||
/* Fall back on main osc rate if clock rate return fails */
|
||||
if (serial_std_platform_data[i].uartclk == 0)
|
||||
serial_std_platform_data[i].uartclk =
|
||||
LPC32XX_MAIN_OSC_FREQ;
|
||||
|
||||
/* Setup UART clock modes for all UARTs, disable autoclock */
|
||||
clkmodes |= uartinit_data[i].ck_mode_mask;
|
||||
|
||||
/* pre-UART clock divider set to 1 */
|
||||
__raw_writel(0x0101, uartinit_data[i].pdiv_clk_reg);
|
||||
}
|
||||
|
||||
/* This needs to be done after all UART clocks are setup */
|
||||
__raw_writel(clkmodes, LPC32XX_UARTCTL_CLKMODE);
|
||||
for (i = 0; i < ARRAY_SIZE(uartinit_data) - 1; i++) {
|
||||
/* Force a flush of the RX FIFOs to work around a HW bug */
|
||||
puart = serial_std_platform_data[i].mapbase;
|
||||
__raw_writel(0xC1, LPC32XX_UART_IIR_FCR(puart));
|
||||
__raw_writel(0x00, LPC32XX_UART_DLL_FIFO(puart));
|
||||
j = LPC32XX_SUART_FIFO_SIZE;
|
||||
while (j--)
|
||||
tmp = __raw_readl(LPC32XX_UART_DLL_FIFO(puart));
|
||||
__raw_writel(0, LPC32XX_UART_IIR_FCR(puart));
|
||||
}
|
||||
|
||||
/* Disable UART5->USB transparent mode or USB won't work */
|
||||
tmp = __raw_readl(LPC32XX_UARTCTL_CTRL);
|
||||
tmp &= ~LPC32XX_UART_U5_ROUTE_TO_USB;
|
||||
__raw_writel(tmp, LPC32XX_UARTCTL_CTRL);
|
||||
|
||||
platform_add_devices(lpc32xx_serial_devs,
|
||||
ARRAY_SIZE(lpc32xx_serial_devs));
|
||||
}
|
|
@ -0,0 +1,151 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/suspend.S
|
||||
*
|
||||
* Original authors: Dmitry Chigirev, Vitaly Wool <source@mvista.com>
|
||||
* Modified by Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* 2005 (c) MontaVista Software, Inc. This file is licensed under
|
||||
* the terms of the GNU General Public License version 2. This program
|
||||
* is licensed "as is" without any warranty of any kind, whether express
|
||||
* or implied.
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <mach/platform.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
/* Using named register defines makes the code easier to follow */
|
||||
#define WORK1_REG r0
|
||||
#define WORK2_REG r1
|
||||
#define SAVED_HCLK_DIV_REG r2
|
||||
#define SAVED_HCLK_PLL_REG r3
|
||||
#define SAVED_DRAM_CLKCTRL_REG r4
|
||||
#define SAVED_PWR_CTRL_REG r5
|
||||
#define CLKPWRBASE_REG r6
|
||||
#define EMCBASE_REG r7
|
||||
|
||||
#define LPC32XX_EMC_STATUS_OFFS 0x04
|
||||
#define LPC32XX_EMC_STATUS_BUSY 0x1
|
||||
#define LPC32XX_EMC_STATUS_SELF_RFSH 0x4
|
||||
|
||||
#define LPC32XX_CLKPWR_PWR_CTRL_OFFS 0x44
|
||||
#define LPC32XX_CLKPWR_HCLK_DIV_OFFS 0x40
|
||||
#define LPC32XX_CLKPWR_HCLKPLL_CTRL_OFFS 0x58
|
||||
|
||||
#define CLKPWR_PCLK_DIV_MASK 0xFFFFFE7F
|
||||
|
||||
.text
|
||||
|
||||
ENTRY(lpc32xx_sys_suspend)
|
||||
@ Save a copy of the used registers in IRAM, r0 is corrupted
|
||||
adr r0, tmp_stack_end
|
||||
stmfd r0!, {r3 - r7, sp, lr}
|
||||
|
||||
@ Load a few common register addresses
|
||||
adr WORK1_REG, reg_bases
|
||||
ldr CLKPWRBASE_REG, [WORK1_REG, #0]
|
||||
ldr EMCBASE_REG, [WORK1_REG, #4]
|
||||
|
||||
ldr SAVED_PWR_CTRL_REG, [CLKPWRBASE_REG,\
|
||||
#LPC32XX_CLKPWR_PWR_CTRL_OFFS]
|
||||
orr WORK1_REG, SAVED_PWR_CTRL_REG, #LPC32XX_CLKPWR_SDRAM_SELF_RFSH
|
||||
|
||||
@ Wait for SDRAM busy status to go busy and then idle
|
||||
@ This guarantees a small windows where DRAM isn't busy
|
||||
1:
|
||||
ldr WORK2_REG, [EMCBASE_REG, #LPC32XX_EMC_STATUS_OFFS]
|
||||
and WORK2_REG, WORK2_REG, #LPC32XX_EMC_STATUS_BUSY
|
||||
cmp WORK2_REG, #LPC32XX_EMC_STATUS_BUSY
|
||||
bne 1b @ Branch while idle
|
||||
2:
|
||||
ldr WORK2_REG, [EMCBASE_REG, #LPC32XX_EMC_STATUS_OFFS]
|
||||
and WORK2_REG, WORK2_REG, #LPC32XX_EMC_STATUS_BUSY
|
||||
cmp WORK2_REG, #LPC32XX_EMC_STATUS_BUSY
|
||||
beq 2b @ Branch until idle
|
||||
|
||||
@ Setup self-refresh with support for manual exit of
|
||||
@ self-refresh mode
|
||||
str WORK1_REG, [CLKPWRBASE_REG, #LPC32XX_CLKPWR_PWR_CTRL_OFFS]
|
||||
orr WORK2_REG, WORK1_REG, #LPC32XX_CLKPWR_UPD_SDRAM_SELF_RFSH
|
||||
str WORK2_REG, [CLKPWRBASE_REG, #LPC32XX_CLKPWR_PWR_CTRL_OFFS]
|
||||
str WORK1_REG, [CLKPWRBASE_REG, #LPC32XX_CLKPWR_PWR_CTRL_OFFS]
|
||||
|
||||
@ Wait for self-refresh acknowledge, clocks to the DRAM device
|
||||
@ will automatically stop on start of self-refresh
|
||||
3:
|
||||
ldr WORK2_REG, [EMCBASE_REG, #LPC32XX_EMC_STATUS_OFFS]
|
||||
and WORK2_REG, WORK2_REG, #LPC32XX_EMC_STATUS_SELF_RFSH
|
||||
cmp WORK2_REG, #LPC32XX_EMC_STATUS_SELF_RFSH
|
||||
bne 3b @ Branch until self-refresh mode starts
|
||||
|
||||
@ Enter direct-run mode from run mode
|
||||
bic WORK1_REG, WORK1_REG, #LPC32XX_CLKPWR_SELECT_RUN_MODE
|
||||
str WORK1_REG, [CLKPWRBASE_REG, #LPC32XX_CLKPWR_PWR_CTRL_OFFS]
|
||||
|
||||
@ Safe disable of DRAM clock in EMC block, prevents DDR sync
|
||||
@ issues on restart
|
||||
ldr SAVED_HCLK_DIV_REG, [CLKPWRBASE_REG,\
|
||||
#LPC32XX_CLKPWR_HCLK_DIV_OFFS]
|
||||
and WORK2_REG, SAVED_HCLK_DIV_REG, #CLKPWR_PCLK_DIV_MASK
|
||||
str WORK2_REG, [CLKPWRBASE_REG, #LPC32XX_CLKPWR_HCLK_DIV_OFFS]
|
||||
|
||||
@ Save HCLK PLL state and disable HCLK PLL
|
||||
ldr SAVED_HCLK_PLL_REG, [CLKPWRBASE_REG,\
|
||||
#LPC32XX_CLKPWR_HCLKPLL_CTRL_OFFS]
|
||||
bic WORK2_REG, SAVED_HCLK_PLL_REG, #LPC32XX_CLKPWR_HCLKPLL_POWER_UP
|
||||
str WORK2_REG, [CLKPWRBASE_REG, #LPC32XX_CLKPWR_HCLKPLL_CTRL_OFFS]
|
||||
|
||||
@ Enter stop mode until an enabled event occurs
|
||||
orr WORK1_REG, WORK1_REG, #LPC32XX_CLKPWR_STOP_MODE_CTRL
|
||||
str WORK1_REG, [CLKPWRBASE_REG, #LPC32XX_CLKPWR_PWR_CTRL_OFFS]
|
||||
.rept 9
|
||||
nop
|
||||
.endr
|
||||
|
||||
@ Clear stop status
|
||||
bic WORK1_REG, WORK1_REG, #LPC32XX_CLKPWR_STOP_MODE_CTRL
|
||||
|
||||
@ Restore original HCLK PLL value and wait for PLL lock
|
||||
str SAVED_HCLK_PLL_REG, [CLKPWRBASE_REG,\
|
||||
#LPC32XX_CLKPWR_HCLKPLL_CTRL_OFFS]
|
||||
4:
|
||||
ldr WORK2_REG, [CLKPWRBASE_REG, #LPC32XX_CLKPWR_HCLKPLL_CTRL_OFFS]
|
||||
and WORK2_REG, WORK2_REG, #LPC32XX_CLKPWR_HCLKPLL_PLL_STS
|
||||
bne 4b
|
||||
|
||||
@ Re-enter run mode with self-refresh flag cleared, but no DRAM
|
||||
@ update yet. DRAM is still in self-refresh
|
||||
str SAVED_PWR_CTRL_REG, [CLKPWRBASE_REG,\
|
||||
#LPC32XX_CLKPWR_PWR_CTRL_OFFS]
|
||||
|
||||
@ Restore original DRAM clock mode to restore DRAM clocks
|
||||
str SAVED_HCLK_DIV_REG, [CLKPWRBASE_REG,\
|
||||
#LPC32XX_CLKPWR_HCLK_DIV_OFFS]
|
||||
|
||||
@ Clear self-refresh mode
|
||||
orr WORK1_REG, SAVED_PWR_CTRL_REG,\
|
||||
#LPC32XX_CLKPWR_UPD_SDRAM_SELF_RFSH
|
||||
str WORK1_REG, [CLKPWRBASE_REG, #LPC32XX_CLKPWR_PWR_CTRL_OFFS]
|
||||
str SAVED_PWR_CTRL_REG, [CLKPWRBASE_REG,\
|
||||
#LPC32XX_CLKPWR_PWR_CTRL_OFFS]
|
||||
|
||||
@ Wait for EMC to clear self-refresh mode
|
||||
5:
|
||||
ldr WORK2_REG, [EMCBASE_REG, #LPC32XX_EMC_STATUS_OFFS]
|
||||
and WORK2_REG, WORK2_REG, #LPC32XX_EMC_STATUS_SELF_RFSH
|
||||
bne 5b @ Branch until self-refresh has exited
|
||||
|
||||
@ restore regs and return
|
||||
adr r0, tmp_stack
|
||||
ldmfd r0!, {r3 - r7, sp, pc}
|
||||
|
||||
reg_bases:
|
||||
.long IO_ADDRESS(LPC32XX_CLK_PM_BASE)
|
||||
.long IO_ADDRESS(LPC32XX_EMC_BASE)
|
||||
|
||||
tmp_stack:
|
||||
.long 0, 0, 0, 0, 0, 0, 0
|
||||
tmp_stack_end:
|
||||
|
||||
ENTRY(lpc32xx_sys_suspend_sz)
|
||||
.word . - lpc32xx_sys_suspend
|
|
@ -0,0 +1,182 @@
|
|||
/*
|
||||
* arch/arm/mach-lpc32xx/timer.c
|
||||
*
|
||||
* Author: Kevin Wells <kevin.wells@nxp.com>
|
||||
*
|
||||
* Copyright (C) 2009 - 2010 NXP Semiconductors
|
||||
* Copyright (C) 2009 Fontys University of Applied Sciences, Eindhoven
|
||||
* Ed Schouten <e.schouten@fontys.nl>
|
||||
* Laurens Timmermans <l.timmermans@fontys.nl>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/clockchips.h>
|
||||
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/platform.h>
|
||||
#include "common.h"
|
||||
|
||||
static cycle_t lpc32xx_clksrc_read(struct clocksource *cs)
|
||||
{
|
||||
return (cycle_t)__raw_readl(LCP32XX_TIMER_TC(LPC32XX_TIMER1_BASE));
|
||||
}
|
||||
|
||||
static struct clocksource lpc32xx_clksrc = {
|
||||
.name = "lpc32xx_clksrc",
|
||||
.shift = 24,
|
||||
.rating = 300,
|
||||
.read = lpc32xx_clksrc_read,
|
||||
.mask = CLOCKSOURCE_MASK(32),
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
static int lpc32xx_clkevt_next_event(unsigned long delta,
|
||||
struct clock_event_device *dev)
|
||||
{
|
||||
__raw_writel(LCP32XX_TIMER_CNTR_TCR_RESET,
|
||||
LCP32XX_TIMER_TCR(LPC32XX_TIMER0_BASE));
|
||||
__raw_writel(delta, LCP32XX_TIMER_PR(LPC32XX_TIMER0_BASE));
|
||||
__raw_writel(LCP32XX_TIMER_CNTR_TCR_EN,
|
||||
LCP32XX_TIMER_TCR(LPC32XX_TIMER0_BASE));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void lpc32xx_clkevt_mode(enum clock_event_mode mode,
|
||||
struct clock_event_device *dev)
|
||||
{
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
WARN_ON(1);
|
||||
break;
|
||||
|
||||
case CLOCK_EVT_MODE_ONESHOT:
|
||||
case CLOCK_EVT_MODE_SHUTDOWN:
|
||||
/*
|
||||
* Disable the timer. When using oneshot, we must also
|
||||
* disable the timer to wait for the first call to
|
||||
* set_next_event().
|
||||
*/
|
||||
__raw_writel(0, LCP32XX_TIMER_TCR(LPC32XX_TIMER0_BASE));
|
||||
break;
|
||||
|
||||
case CLOCK_EVT_MODE_UNUSED:
|
||||
case CLOCK_EVT_MODE_RESUME:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static struct clock_event_device lpc32xx_clkevt = {
|
||||
.name = "lpc32xx_clkevt",
|
||||
.features = CLOCK_EVT_FEAT_ONESHOT,
|
||||
.shift = 32,
|
||||
.rating = 300,
|
||||
.set_next_event = lpc32xx_clkevt_next_event,
|
||||
.set_mode = lpc32xx_clkevt_mode,
|
||||
};
|
||||
|
||||
static irqreturn_t lpc32xx_timer_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct clock_event_device *evt = &lpc32xx_clkevt;
|
||||
|
||||
/* Clear match */
|
||||
__raw_writel(LCP32XX_TIMER_CNTR_MTCH_BIT(0),
|
||||
LCP32XX_TIMER_IR(LPC32XX_TIMER0_BASE));
|
||||
|
||||
evt->event_handler(evt);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static struct irqaction lpc32xx_timer_irq = {
|
||||
.name = "LPC32XX Timer Tick",
|
||||
.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
|
||||
.handler = lpc32xx_timer_interrupt,
|
||||
};
|
||||
|
||||
/*
|
||||
* The clock management driver isn't initialized at this point, so the
|
||||
* clocks need to be enabled here manually and then tagged as used in
|
||||
* the clock driver initialization
|
||||
*/
|
||||
static void __init lpc32xx_timer_init(void)
|
||||
{
|
||||
u32 clkrate, pllreg;
|
||||
|
||||
/* Enable timer clock */
|
||||
__raw_writel(LPC32XX_CLKPWR_TMRPWMCLK_TIMER0_EN |
|
||||
LPC32XX_CLKPWR_TMRPWMCLK_TIMER1_EN,
|
||||
LPC32XX_CLKPWR_TIMERS_PWMS_CLK_CTRL_1);
|
||||
|
||||
/*
|
||||
* The clock driver isn't initialized at this point. So determine if
|
||||
* the SYSCLK is driven from the PLL397 or main oscillator and then use
|
||||
* it to compute the PLL frequency and the PCLK divider to get the base
|
||||
* timer rates. This rate is needed to compute the tick rate.
|
||||
*/
|
||||
if (clk_is_sysclk_mainosc() != 0)
|
||||
clkrate = LPC32XX_MAIN_OSC_FREQ;
|
||||
else
|
||||
clkrate = 397 * LPC32XX_CLOCK_OSC_FREQ;
|
||||
|
||||
/* Get ARM HCLKPLL register and convert it into a frequency */
|
||||
pllreg = __raw_readl(LPC32XX_CLKPWR_HCLKPLL_CTRL) & 0x1FFFF;
|
||||
clkrate = clk_get_pllrate_from_reg(clkrate, pllreg);
|
||||
|
||||
/* Get PCLK divider and divide ARM PLL clock by it to get timer rate */
|
||||
clkrate = clkrate / clk_get_pclk_div();
|
||||
|
||||
/* Initial timer setup */
|
||||
__raw_writel(0, LCP32XX_TIMER_TCR(LPC32XX_TIMER0_BASE));
|
||||
__raw_writel(LCP32XX_TIMER_CNTR_MTCH_BIT(0),
|
||||
LCP32XX_TIMER_IR(LPC32XX_TIMER0_BASE));
|
||||
__raw_writel(1, LCP32XX_TIMER_MR0(LPC32XX_TIMER0_BASE));
|
||||
__raw_writel(LCP32XX_TIMER_CNTR_MCR_MTCH(0) |
|
||||
LCP32XX_TIMER_CNTR_MCR_STOP(0) |
|
||||
LCP32XX_TIMER_CNTR_MCR_RESET(0),
|
||||
LCP32XX_TIMER_MCR(LPC32XX_TIMER0_BASE));
|
||||
|
||||
/* Setup tick interrupt */
|
||||
setup_irq(IRQ_LPC32XX_TIMER0, &lpc32xx_timer_irq);
|
||||
|
||||
/* Setup the clockevent structure. */
|
||||
lpc32xx_clkevt.mult = div_sc(clkrate, NSEC_PER_SEC,
|
||||
lpc32xx_clkevt.shift);
|
||||
lpc32xx_clkevt.max_delta_ns = clockevent_delta2ns(-1,
|
||||
&lpc32xx_clkevt);
|
||||
lpc32xx_clkevt.min_delta_ns = clockevent_delta2ns(1,
|
||||
&lpc32xx_clkevt) + 1;
|
||||
lpc32xx_clkevt.cpumask = cpumask_of(0);
|
||||
clockevents_register_device(&lpc32xx_clkevt);
|
||||
|
||||
/* Use timer1 as clock source. */
|
||||
__raw_writel(LCP32XX_TIMER_CNTR_TCR_RESET,
|
||||
LCP32XX_TIMER_TCR(LPC32XX_TIMER1_BASE));
|
||||
__raw_writel(0, LCP32XX_TIMER_PR(LPC32XX_TIMER1_BASE));
|
||||
__raw_writel(0, LCP32XX_TIMER_MCR(LPC32XX_TIMER1_BASE));
|
||||
__raw_writel(LCP32XX_TIMER_CNTR_TCR_EN,
|
||||
LCP32XX_TIMER_TCR(LPC32XX_TIMER1_BASE));
|
||||
lpc32xx_clksrc.mult = clocksource_hz2mult(clkrate,
|
||||
lpc32xx_clksrc.shift);
|
||||
clocksource_register(&lpc32xx_clksrc);
|
||||
}
|
||||
|
||||
struct sys_timer lpc32xx_timer = {
|
||||
.init = &lpc32xx_timer_init,
|
||||
};
|
||||
|
|
@ -8,6 +8,7 @@
|
|||
* the Free Software Foundation.
|
||||
*/
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/memory.h>
|
||||
|
||||
#include <mach/regs-board-a9m9750dev.h>
|
||||
|
||||
|
|
|
@ -20,50 +20,49 @@ static void putc_dummy(char c, void __iomem *base)
|
|||
/* nothing */
|
||||
}
|
||||
|
||||
static int timeout;
|
||||
|
||||
static void putc_ns9360(char c, void __iomem *base)
|
||||
{
|
||||
static int t = 0x10000;
|
||||
do {
|
||||
if (t)
|
||||
--t;
|
||||
if (timeout)
|
||||
--timeout;
|
||||
|
||||
if (__raw_readl(base + 8) & (1 << 3)) {
|
||||
__raw_writeb(c, base + 16);
|
||||
t = 0x10000;
|
||||
timeout = 0x10000;
|
||||
break;
|
||||
}
|
||||
} while (t);
|
||||
} while (timeout);
|
||||
}
|
||||
|
||||
static void putc_a9m9750dev(char c, void __iomem *base)
|
||||
{
|
||||
static int t = 0x10000;
|
||||
do {
|
||||
if (t)
|
||||
--t;
|
||||
if (timeout)
|
||||
--timeout;
|
||||
|
||||
if (__raw_readb(base + 5) & (1 << 5)) {
|
||||
__raw_writeb(c, base);
|
||||
t = 0x10000;
|
||||
timeout = 0x10000;
|
||||
break;
|
||||
}
|
||||
} while (t);
|
||||
} while (timeout);
|
||||
|
||||
}
|
||||
|
||||
static void putc_ns921x(char c, void __iomem *base)
|
||||
{
|
||||
static int t = 0x10000;
|
||||
do {
|
||||
if (t)
|
||||
--t;
|
||||
if (timeout)
|
||||
--timeout;
|
||||
|
||||
if (!(__raw_readl(base) & (1 << 11))) {
|
||||
__raw_writeb(c, base + 0x0028);
|
||||
t = 0x10000;
|
||||
timeout = 0x10000;
|
||||
break;
|
||||
}
|
||||
} while (t);
|
||||
} while (timeout);
|
||||
}
|
||||
|
||||
#define MSCS __REG(0xA0900184)
|
||||
|
@ -89,6 +88,7 @@ static void putc_ns921x(char c, void __iomem *base)
|
|||
|
||||
static void autodetect(void (**putc)(char, void __iomem *), void __iomem **base)
|
||||
{
|
||||
timeout = 0x10000;
|
||||
if (((__raw_readl(MSCS) >> 16) & 0xfe) == 0x00) {
|
||||
/* ns9360 or ns9750 */
|
||||
if (NS9360_UART_ENABLED(NS9360_UARTA)) {
|
||||
|
|
|
@ -175,6 +175,10 @@ static void __init rx51_add_gpio_keys(void)
|
|||
#endif /* CONFIG_KEYBOARD_GPIO || CONFIG_KEYBOARD_GPIO_MODULE */
|
||||
|
||||
static int board_keymap[] = {
|
||||
/*
|
||||
* Note that KEY(x, 8, KEY_XXX) entries represent "entrire row
|
||||
* connected to the ground" matrix state.
|
||||
*/
|
||||
KEY(0, 0, KEY_Q),
|
||||
KEY(0, 1, KEY_O),
|
||||
KEY(0, 2, KEY_P),
|
||||
|
@ -182,6 +186,7 @@ static int board_keymap[] = {
|
|||
KEY(0, 4, KEY_BACKSPACE),
|
||||
KEY(0, 6, KEY_A),
|
||||
KEY(0, 7, KEY_S),
|
||||
|
||||
KEY(1, 0, KEY_W),
|
||||
KEY(1, 1, KEY_D),
|
||||
KEY(1, 2, KEY_F),
|
||||
|
@ -190,6 +195,7 @@ static int board_keymap[] = {
|
|||
KEY(1, 5, KEY_J),
|
||||
KEY(1, 6, KEY_K),
|
||||
KEY(1, 7, KEY_L),
|
||||
|
||||
KEY(2, 0, KEY_E),
|
||||
KEY(2, 1, KEY_DOT),
|
||||
KEY(2, 2, KEY_UP),
|
||||
|
@ -197,6 +203,8 @@ static int board_keymap[] = {
|
|||
KEY(2, 5, KEY_Z),
|
||||
KEY(2, 6, KEY_X),
|
||||
KEY(2, 7, KEY_C),
|
||||
KEY(2, 8, KEY_F9),
|
||||
|
||||
KEY(3, 0, KEY_R),
|
||||
KEY(3, 1, KEY_V),
|
||||
KEY(3, 2, KEY_B),
|
||||
|
@ -205,20 +213,23 @@ static int board_keymap[] = {
|
|||
KEY(3, 5, KEY_SPACE),
|
||||
KEY(3, 6, KEY_SPACE),
|
||||
KEY(3, 7, KEY_LEFT),
|
||||
|
||||
KEY(4, 0, KEY_T),
|
||||
KEY(4, 1, KEY_DOWN),
|
||||
KEY(4, 2, KEY_RIGHT),
|
||||
KEY(4, 4, KEY_LEFTCTRL),
|
||||
KEY(4, 5, KEY_RIGHTALT),
|
||||
KEY(4, 6, KEY_LEFTSHIFT),
|
||||
KEY(4, 8, KEY_F10),
|
||||
|
||||
KEY(5, 0, KEY_Y),
|
||||
KEY(5, 8, KEY_F11),
|
||||
|
||||
KEY(6, 0, KEY_U),
|
||||
|
||||
KEY(7, 0, KEY_I),
|
||||
KEY(7, 1, KEY_F7),
|
||||
KEY(7, 2, KEY_F8),
|
||||
KEY(0xff, 2, KEY_F9),
|
||||
KEY(0xff, 4, KEY_F10),
|
||||
KEY(0xff, 5, KEY_F11),
|
||||
};
|
||||
|
||||
static struct matrix_keymap_data board_map_data = {
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <mach/colibri.h>
|
||||
#include <mach/ohci.h>
|
||||
#include <mach/pxafb.h>
|
||||
#include <mach/audio.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "devices.h"
|
||||
|
@ -145,7 +146,7 @@ static void __init colibri_pxa300_init_lcd(void)
|
|||
static inline void colibri_pxa300_init_lcd(void) {}
|
||||
#endif /* CONFIG_FB_PXA || CONFIG_FB_PXA_MODULE */
|
||||
|
||||
#if defined(SND_AC97_CODEC) || defined(SND_AC97_CODEC_MODULE)
|
||||
#if defined(CONFIG_SND_AC97_CODEC) || defined(CONFIG_SND_AC97_CODEC_MODULE)
|
||||
static mfp_cfg_t colibri_pxa310_ac97_pin_config[] __initdata = {
|
||||
GPIO24_AC97_SYSCLK,
|
||||
GPIO23_AC97_nACRESET,
|
||||
|
|
|
@ -446,7 +446,7 @@ static struct platform_device corgiled_device = {
|
|||
static struct pxamci_platform_data corgi_mci_platform_data = {
|
||||
.detect_delay_ms = 250,
|
||||
.ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
|
||||
.gpio_card_detect = -1,
|
||||
.gpio_card_detect = CORGI_GPIO_nSD_DETECT,
|
||||
.gpio_card_ro = CORGI_GPIO_nSD_WP,
|
||||
.gpio_power = CORGI_GPIO_SD_PWR,
|
||||
};
|
||||
|
|
|
@ -256,13 +256,9 @@ static void init_sdram_rows(void)
|
|||
|
||||
static u32 mdrefr_dri(unsigned int freq)
|
||||
{
|
||||
u32 dri = 0;
|
||||
u32 interval = freq * SDRAM_TREF / sdram_rows;
|
||||
|
||||
if (cpu_is_pxa25x())
|
||||
dri = ((freq * SDRAM_TREF) / (sdram_rows * 32));
|
||||
if (cpu_is_pxa27x())
|
||||
dri = ((freq * SDRAM_TREF) / (sdram_rows - 31)) / 32;
|
||||
return dri;
|
||||
return (interval - (cpu_is_pxa27x() ? 31 : 0)) / 32;
|
||||
}
|
||||
|
||||
/* find a valid frequency point */
|
||||
|
|
|
@ -41,10 +41,10 @@ void pxa27x_clear_otgph(void)
|
|||
EXPORT_SYMBOL(pxa27x_clear_otgph);
|
||||
|
||||
static unsigned long ac97_reset_config[] = {
|
||||
GPIO95_AC97_nRESET,
|
||||
GPIO95_GPIO,
|
||||
GPIO113_AC97_nRESET,
|
||||
GPIO113_GPIO,
|
||||
GPIO113_AC97_nRESET,
|
||||
GPIO95_GPIO,
|
||||
GPIO95_AC97_nRESET,
|
||||
};
|
||||
|
||||
void pxa27x_assert_ac97reset(int reset_gpio, int on)
|
||||
|
|
|
@ -20,6 +20,9 @@
|
|||
strb \rd, [\rx]
|
||||
.endm
|
||||
|
||||
.macro waituart,rd,rx
|
||||
.endm
|
||||
|
||||
.macro busyuart,rd,rx
|
||||
mov \rd, #0
|
||||
1001: add \rd, \rd, #1
|
||||
|
|
|
@ -93,7 +93,7 @@ static struct clk_lookup nuc900_clkregs[] = {
|
|||
DEF_CLKLOOK(&clk_kpi, "nuc900-kpi", NULL),
|
||||
DEF_CLKLOOK(&clk_wdt, "nuc900-wdt", NULL),
|
||||
DEF_CLKLOOK(&clk_gdma, "nuc900-gdma", NULL),
|
||||
DEF_CLKLOOK(&clk_adc, "nuc900-adc", NULL),
|
||||
DEF_CLKLOOK(&clk_adc, "nuc900-ts", NULL),
|
||||
DEF_CLKLOOK(&clk_usi, "nuc900-spi", NULL),
|
||||
DEF_CLKLOOK(&clk_ext, NULL, "ext"),
|
||||
DEF_CLKLOOK(&clk_timer0, NULL, "timer0"),
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
.macro addruart, rx
|
||||
mrc p15, 0, \rx, c1, c0
|
||||
tst \rx, #1 @ MMU enabled?
|
||||
moveq \rx, =SPEAR_DBG_UART_BASE @ Physical base
|
||||
movne \rx, =VA_SPEAR_DBG_UART_BASE @ Virtual base
|
||||
moveq \rx, #SPEAR_DBG_UART_BASE @ Physical base
|
||||
movne \rx, #VA_SPEAR_DBG_UART_BASE @ Virtual base
|
||||
.endm
|
||||
|
||||
.macro senduart, rd, rx
|
||||
|
|
|
@ -54,6 +54,9 @@
|
|||
#define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
|
||||
#define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */
|
||||
|
||||
#define TIOCGRS485 0x542E
|
||||
#define TIOCSRS485 0x542F
|
||||
|
||||
#define FIONCLEX 0x5450
|
||||
#define FIOCLEX 0x5451
|
||||
#define FIOASYNC 0x5452
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#define __ASM_ARCH_BOARD_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/serial.h>
|
||||
|
||||
#define GPIO_PIN_NONE (-1)
|
||||
|
||||
|
@ -35,6 +36,7 @@ struct atmel_uart_data {
|
|||
short use_dma_tx; /* use transmit DMA? */
|
||||
short use_dma_rx; /* use receive DMA? */
|
||||
void __iomem *regs; /* virtual base address, if any */
|
||||
struct serial_rs485 rs485; /* rs485 settings */
|
||||
};
|
||||
void at32_map_usart(unsigned int hw_id, unsigned int line, int flags);
|
||||
struct platform_device *at32_add_device_usart(unsigned int id);
|
||||
|
|
|
@ -435,20 +435,21 @@ static struct platform_device *au1xxx_platform_devices[] __initdata = {
|
|||
static int __init au1xxx_platform_init(void)
|
||||
{
|
||||
unsigned int uartclk = get_au1x00_uart_baud_base() * 16;
|
||||
int i;
|
||||
int err, i;
|
||||
|
||||
/* Fill up uartclk. */
|
||||
for (i = 0; au1x00_uart_data[i].flags; i++)
|
||||
au1x00_uart_data[i].uartclk = uartclk;
|
||||
|
||||
err = platform_add_devices(au1xxx_platform_devices,
|
||||
ARRAY_SIZE(au1xxx_platform_devices));
|
||||
#ifndef CONFIG_SOC_AU1100
|
||||
/* Register second MAC if enabled in pinfunc */
|
||||
if (!(au_readl(SYS_PINFUNC) & (u32)SYS_PF_NI2))
|
||||
if (!err && !(au_readl(SYS_PINFUNC) & (u32)SYS_PF_NI2))
|
||||
platform_device_register(&au1xxx_eth1_device);
|
||||
#endif
|
||||
|
||||
return platform_add_devices(au1xxx_platform_devices,
|
||||
ARRAY_SIZE(au1xxx_platform_devices));
|
||||
return err;
|
||||
}
|
||||
|
||||
arch_initcall(au1xxx_platform_init);
|
||||
|
|
|
@ -67,8 +67,6 @@ static void mtx1_power_off(void)
|
|||
|
||||
void __init board_setup(void)
|
||||
{
|
||||
alchemy_gpio2_enable();
|
||||
|
||||
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
|
||||
/* Enable USB power switch */
|
||||
alchemy_gpio_direction_output(204, 0);
|
||||
|
@ -117,11 +115,11 @@ mtx1_pci_idsel(unsigned int devsel, int assert)
|
|||
|
||||
if (assert && devsel != 0)
|
||||
/* Suppress signal to Cardbus */
|
||||
gpio_set_value(1, 0); /* set EXT_IO3 OFF */
|
||||
alchemy_gpio_set_value(1, 0); /* set EXT_IO3 OFF */
|
||||
else
|
||||
gpio_set_value(1, 1); /* set EXT_IO3 ON */
|
||||
alchemy_gpio_set_value(1, 1); /* set EXT_IO3 ON */
|
||||
|
||||
au_sync_udelay(1);
|
||||
udelay(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -104,6 +104,9 @@ int __init bcm63xx_enet_register(int unit,
|
|||
if (unit > 1)
|
||||
return -ENODEV;
|
||||
|
||||
if (unit == 1 && BCMCPU_IS_6338())
|
||||
return -ENODEV;
|
||||
|
||||
if (!shared_device_registered) {
|
||||
shared_res[0].start = bcm63xx_regset_address(RSET_ENETDMA);
|
||||
shared_res[0].end = shared_res[0].start;
|
||||
|
|
|
@ -434,7 +434,7 @@ static __inline__ void atomic64_add(long i, atomic64_t * v)
|
|||
__asm__ __volatile__(
|
||||
" .set mips3 \n"
|
||||
"1: lld %0, %1 # atomic64_add \n"
|
||||
" addu %0, %2 \n"
|
||||
" daddu %0, %2 \n"
|
||||
" scd %0, %1 \n"
|
||||
" beqzl %0, 1b \n"
|
||||
" .set mips0 \n"
|
||||
|
@ -446,7 +446,7 @@ static __inline__ void atomic64_add(long i, atomic64_t * v)
|
|||
__asm__ __volatile__(
|
||||
" .set mips3 \n"
|
||||
"1: lld %0, %1 # atomic64_add \n"
|
||||
" addu %0, %2 \n"
|
||||
" daddu %0, %2 \n"
|
||||
" scd %0, %1 \n"
|
||||
" beqz %0, 2f \n"
|
||||
" .subsection 2 \n"
|
||||
|
@ -479,7 +479,7 @@ static __inline__ void atomic64_sub(long i, atomic64_t * v)
|
|||
__asm__ __volatile__(
|
||||
" .set mips3 \n"
|
||||
"1: lld %0, %1 # atomic64_sub \n"
|
||||
" subu %0, %2 \n"
|
||||
" dsubu %0, %2 \n"
|
||||
" scd %0, %1 \n"
|
||||
" beqzl %0, 1b \n"
|
||||
" .set mips0 \n"
|
||||
|
@ -491,7 +491,7 @@ static __inline__ void atomic64_sub(long i, atomic64_t * v)
|
|||
__asm__ __volatile__(
|
||||
" .set mips3 \n"
|
||||
"1: lld %0, %1 # atomic64_sub \n"
|
||||
" subu %0, %2 \n"
|
||||
" dsubu %0, %2 \n"
|
||||
" scd %0, %1 \n"
|
||||
" beqz %0, 2f \n"
|
||||
" .subsection 2 \n"
|
||||
|
@ -524,10 +524,10 @@ static __inline__ long atomic64_add_return(long i, atomic64_t * v)
|
|||
__asm__ __volatile__(
|
||||
" .set mips3 \n"
|
||||
"1: lld %1, %2 # atomic64_add_return \n"
|
||||
" addu %0, %1, %3 \n"
|
||||
" daddu %0, %1, %3 \n"
|
||||
" scd %0, %2 \n"
|
||||
" beqzl %0, 1b \n"
|
||||
" addu %0, %1, %3 \n"
|
||||
" daddu %0, %1, %3 \n"
|
||||
" .set mips0 \n"
|
||||
: "=&r" (result), "=&r" (temp), "=m" (v->counter)
|
||||
: "Ir" (i), "m" (v->counter)
|
||||
|
@ -538,10 +538,10 @@ static __inline__ long atomic64_add_return(long i, atomic64_t * v)
|
|||
__asm__ __volatile__(
|
||||
" .set mips3 \n"
|
||||
"1: lld %1, %2 # atomic64_add_return \n"
|
||||
" addu %0, %1, %3 \n"
|
||||
" daddu %0, %1, %3 \n"
|
||||
" scd %0, %2 \n"
|
||||
" beqz %0, 2f \n"
|
||||
" addu %0, %1, %3 \n"
|
||||
" daddu %0, %1, %3 \n"
|
||||
" .subsection 2 \n"
|
||||
"2: b 1b \n"
|
||||
" .previous \n"
|
||||
|
@ -576,10 +576,10 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
|
|||
__asm__ __volatile__(
|
||||
" .set mips3 \n"
|
||||
"1: lld %1, %2 # atomic64_sub_return \n"
|
||||
" subu %0, %1, %3 \n"
|
||||
" dsubu %0, %1, %3 \n"
|
||||
" scd %0, %2 \n"
|
||||
" beqzl %0, 1b \n"
|
||||
" subu %0, %1, %3 \n"
|
||||
" dsubu %0, %1, %3 \n"
|
||||
" .set mips0 \n"
|
||||
: "=&r" (result), "=&r" (temp), "=m" (v->counter)
|
||||
: "Ir" (i), "m" (v->counter)
|
||||
|
@ -590,10 +590,10 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
|
|||
__asm__ __volatile__(
|
||||
" .set mips3 \n"
|
||||
"1: lld %1, %2 # atomic64_sub_return \n"
|
||||
" subu %0, %1, %3 \n"
|
||||
" dsubu %0, %1, %3 \n"
|
||||
" scd %0, %2 \n"
|
||||
" beqz %0, 2f \n"
|
||||
" subu %0, %1, %3 \n"
|
||||
" dsubu %0, %1, %3 \n"
|
||||
" .subsection 2 \n"
|
||||
"2: b 1b \n"
|
||||
" .previous \n"
|
||||
|
|
|
@ -984,16 +984,17 @@
|
|||
#define __NR_perf_event_open (__NR_Linux + 296)
|
||||
#define __NR_accept4 (__NR_Linux + 297)
|
||||
#define __NR_recvmmsg (__NR_Linux + 298)
|
||||
#define __NR_getdents64 (__NR_Linux + 299)
|
||||
|
||||
/*
|
||||
* Offset of the last N32 flavoured syscall
|
||||
*/
|
||||
#define __NR_Linux_syscalls 298
|
||||
#define __NR_Linux_syscalls 299
|
||||
|
||||
#endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */
|
||||
|
||||
#define __NR_N32_Linux 6000
|
||||
#define __NR_N32_Linux_syscalls 298
|
||||
#define __NR_N32_Linux_syscalls 299
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
|
|
|
@ -419,4 +419,5 @@ EXPORT(sysn32_call_table)
|
|||
PTR sys_perf_event_open
|
||||
PTR sys_accept4
|
||||
PTR compat_sys_recvmmsg
|
||||
PTR sys_getdents
|
||||
.size sysn32_call_table,.-sysn32_call_table
|
||||
|
|
|
@ -61,11 +61,9 @@ static int __init init_vdso(void)
|
|||
|
||||
vunmap(vdso);
|
||||
|
||||
pr_notice("init_vdso successfull\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
device_initcall(init_vdso);
|
||||
subsys_initcall(init_vdso);
|
||||
|
||||
static unsigned long vdso_addr(unsigned long start)
|
||||
{
|
||||
|
|
|
@ -247,6 +247,8 @@ void __init mips_pcibios_init(void)
|
|||
iomem_resource.end &= 0xfffffffffULL; /* 64 GB */
|
||||
ioport_resource.end = controller->io_resource->end;
|
||||
|
||||
controller->io_map_base = mips_io_port_base;
|
||||
|
||||
register_pci_controller(controller);
|
||||
}
|
||||
|
||||
|
|
|
@ -44,6 +44,7 @@ extern struct pci_ops pnx8550_pci_ops;
|
|||
|
||||
static struct pci_controller pnx8550_controller = {
|
||||
.pci_ops = &pnx8550_pci_ops,
|
||||
.io_map_base = PNX8550_PORT_BASE,
|
||||
.io_resource = &pci_io_resource,
|
||||
.mem_resource = &pci_mem_resource,
|
||||
};
|
||||
|
|
|
@ -113,7 +113,7 @@ void __init plat_mem_setup(void)
|
|||
PNX8550_GLB2_ENAB_INTA_O = 0;
|
||||
|
||||
/* IO/MEM resources. */
|
||||
set_io_port_base(KSEG1);
|
||||
set_io_port_base(PNX8550_PORT_BASE);
|
||||
ioport_resource.start = 0;
|
||||
ioport_resource.end = ~0;
|
||||
iomem_resource.start = 0;
|
||||
|
|
|
@ -944,6 +944,7 @@ static struct pci_controller msp_pci_controller = {
|
|||
.pci_ops = &msp_pci_ops,
|
||||
.mem_resource = &pci_mem_resource,
|
||||
.mem_offset = 0,
|
||||
.io_map_base = MSP_PCI_IOSPACE_BASE,
|
||||
.io_resource = &pci_io_resource,
|
||||
.io_offset = 0
|
||||
};
|
||||
|
|
|
@ -54,6 +54,7 @@ static int __init pmc_yosemite_setup(void)
|
|||
panic(ioremap_failed);
|
||||
|
||||
set_io_port_base(io_v_base);
|
||||
py_controller.io_map_base = io_v_base;
|
||||
TITAN_WRITE(RM9000x2_OCD_LKM7, TITAN_READ(RM9000x2_OCD_LKM7) | 1);
|
||||
|
||||
ioport_resource.end = TITAN_IO_SIZE - 1;
|
||||
|
|
|
@ -472,6 +472,9 @@ void __init configure_platform(void)
|
|||
* it*/
|
||||
platform_features = FFS_CAPABLE | DISPLAY_CAPABLE;
|
||||
|
||||
/* Cronus and Cronus Lite have the same register map */
|
||||
set_register_map(CRONUS_IO_BASE, &cronus_register_map);
|
||||
|
||||
/* ASIC version will determine if this is a real CronusLite or
|
||||
* Castrati(Cronus) */
|
||||
chipversion = asic_read(chipver3) << 24;
|
||||
|
@ -484,8 +487,6 @@ void __init configure_platform(void)
|
|||
else
|
||||
asic = ASIC_CRONUSLITE;
|
||||
|
||||
/* Cronus and Cronus Lite have the same register map */
|
||||
set_register_map(CRONUS_IO_BASE, &cronus_register_map);
|
||||
gp_resources = non_dvr_cronuslite_resources;
|
||||
pr_info("Platform: 4600 - %s, NON_DVR_CAPABLE, "
|
||||
"chipversion=0x%08X\n",
|
||||
|
|
|
@ -8,9 +8,9 @@
|
|||
* On FSL-BookE we setup a 1:1 mapping which covers the first 2GiB of memory
|
||||
* and therefore we can only deal with memory within this range
|
||||
*/
|
||||
#define KEXEC_SOURCE_MEMORY_LIMIT (2 * 1024 * 1024 * 1024UL)
|
||||
#define KEXEC_DESTINATION_MEMORY_LIMIT (2 * 1024 * 1024 * 1024UL)
|
||||
#define KEXEC_CONTROL_MEMORY_LIMIT (2 * 1024 * 1024 * 1024UL)
|
||||
#define KEXEC_SOURCE_MEMORY_LIMIT (2 * 1024 * 1024 * 1024UL - 1)
|
||||
#define KEXEC_DESTINATION_MEMORY_LIMIT (2 * 1024 * 1024 * 1024UL - 1)
|
||||
#define KEXEC_CONTROL_MEMORY_LIMIT (2 * 1024 * 1024 * 1024UL - 1)
|
||||
|
||||
#else
|
||||
|
||||
|
|
|
@ -250,7 +250,9 @@ extern int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
|
|||
int __hash_page_huge(unsigned long ea, unsigned long access, unsigned long vsid,
|
||||
pte_t *ptep, unsigned long trap, int local, int ssize,
|
||||
unsigned int shift, unsigned int mmu_psize);
|
||||
|
||||
extern void hash_failure_debug(unsigned long ea, unsigned long access,
|
||||
unsigned long vsid, unsigned long trap,
|
||||
int ssize, int psize, unsigned long pte);
|
||||
extern int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
|
||||
unsigned long pstart, unsigned long prot,
|
||||
int psize, int ssize);
|
||||
|
|
|
@ -566,9 +566,9 @@ static void record_and_restart(struct perf_event *event, unsigned long val,
|
|||
* Finally record data if requested.
|
||||
*/
|
||||
if (record) {
|
||||
struct perf_sample_data data = {
|
||||
.period = event->hw.last_period,
|
||||
};
|
||||
struct perf_sample_data data;
|
||||
|
||||
perf_sample_data_init(&data, 0);
|
||||
|
||||
if (perf_event_overflow(event, nmi, &data, regs)) {
|
||||
/*
|
||||
|
|
|
@ -414,7 +414,7 @@ static int __init early_init_dt_scan_drconf_memory(unsigned long node)
|
|||
u64 base, size, memblock_size;
|
||||
unsigned int is_kexec_kdump = 0, rngs;
|
||||
|
||||
ls = of_get_flat_dt_prop(node, "ibm,memblock-size", &l);
|
||||
ls = of_get_flat_dt_prop(node, "ibm,lmb-size", &l);
|
||||
if (ls == NULL || l < dt_root_size_cells * sizeof(__be32))
|
||||
return 0;
|
||||
memblock_size = dt_mem_next_cell(dt_root_size_cells, &ls);
|
||||
|
|
|
@ -68,9 +68,6 @@ _GLOBAL(__hash_page_4K)
|
|||
std r8,STK_PARM(r8)(r1)
|
||||
std r9,STK_PARM(r9)(r1)
|
||||
|
||||
/* Add _PAGE_PRESENT to access */
|
||||
ori r4,r4,_PAGE_PRESENT
|
||||
|
||||
/* Save non-volatile registers.
|
||||
* r31 will hold "old PTE"
|
||||
* r30 is "new PTE"
|
||||
|
@ -347,9 +344,6 @@ _GLOBAL(__hash_page_4K)
|
|||
std r8,STK_PARM(r8)(r1)
|
||||
std r9,STK_PARM(r9)(r1)
|
||||
|
||||
/* Add _PAGE_PRESENT to access */
|
||||
ori r4,r4,_PAGE_PRESENT
|
||||
|
||||
/* Save non-volatile registers.
|
||||
* r31 will hold "old PTE"
|
||||
* r30 is "new PTE"
|
||||
|
@ -687,9 +681,6 @@ _GLOBAL(__hash_page_64K)
|
|||
std r8,STK_PARM(r8)(r1)
|
||||
std r9,STK_PARM(r9)(r1)
|
||||
|
||||
/* Add _PAGE_PRESENT to access */
|
||||
ori r4,r4,_PAGE_PRESENT
|
||||
|
||||
/* Save non-volatile registers.
|
||||
* r31 will hold "old PTE"
|
||||
* r30 is "new PTE"
|
||||
|
|
|
@ -871,6 +871,18 @@ static inline int subpage_protection(struct mm_struct *mm, unsigned long ea)
|
|||
}
|
||||
#endif
|
||||
|
||||
void hash_failure_debug(unsigned long ea, unsigned long access,
|
||||
unsigned long vsid, unsigned long trap,
|
||||
int ssize, int psize, unsigned long pte)
|
||||
{
|
||||
if (!printk_ratelimit())
|
||||
return;
|
||||
pr_info("mm: Hashing failure ! EA=0x%lx access=0x%lx current=%s\n",
|
||||
ea, access, current->comm);
|
||||
pr_info(" trap=0x%lx vsid=0x%lx ssize=%d psize=%d pte=0x%lx\n",
|
||||
trap, vsid, ssize, psize, pte);
|
||||
}
|
||||
|
||||
/* Result code is:
|
||||
* 0 - handled
|
||||
* 1 - normal page fault
|
||||
|
@ -955,6 +967,17 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* Add _PAGE_PRESENT to the required access perm */
|
||||
access |= _PAGE_PRESENT;
|
||||
|
||||
/* Pre-check access permissions (will be re-checked atomically
|
||||
* in __hash_page_XX but this pre-check is a fast path
|
||||
*/
|
||||
if (access & ~pte_val(*ptep)) {
|
||||
DBG_LOW(" no access !\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HUGETLB_PAGE
|
||||
if (hugeshift)
|
||||
return __hash_page_huge(ea, access, vsid, ptep, trap, local,
|
||||
|
@ -967,14 +990,6 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
|
|||
DBG_LOW(" i-pte: %016lx %016lx\n", pte_val(*ptep),
|
||||
pte_val(*(ptep + PTRS_PER_PTE)));
|
||||
#endif
|
||||
/* Pre-check access permissions (will be re-checked atomically
|
||||
* in __hash_page_XX but this pre-check is a fast path
|
||||
*/
|
||||
if (access & ~pte_val(*ptep)) {
|
||||
DBG_LOW(" no access !\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Do actual hashing */
|
||||
#ifdef CONFIG_PPC_64K_PAGES
|
||||
/* If _PAGE_4K_PFN is set, make sure this is a 4k segment */
|
||||
|
@ -1033,6 +1048,12 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
|
|||
local, ssize, spp);
|
||||
}
|
||||
|
||||
/* Dump some info in case of hash insertion failure, they should
|
||||
* never happen so it is really useful to know if/when they do
|
||||
*/
|
||||
if (rc == -1)
|
||||
hash_failure_debug(ea, access, vsid, trap, ssize, psize,
|
||||
pte_val(*ptep));
|
||||
#ifndef CONFIG_PPC_64K_PAGES
|
||||
DBG_LOW(" o-pte: %016lx\n", pte_val(*ptep));
|
||||
#else
|
||||
|
@ -1051,8 +1072,7 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
|
|||
void *pgdir;
|
||||
pte_t *ptep;
|
||||
unsigned long flags;
|
||||
int local = 0;
|
||||
int ssize;
|
||||
int rc, ssize, local = 0;
|
||||
|
||||
BUG_ON(REGION_ID(ea) != USER_REGION_ID);
|
||||
|
||||
|
@ -1098,11 +1118,18 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
|
|||
/* Hash it in */
|
||||
#ifdef CONFIG_PPC_HAS_HASH_64K
|
||||
if (mm->context.user_psize == MMU_PAGE_64K)
|
||||
__hash_page_64K(ea, access, vsid, ptep, trap, local, ssize);
|
||||
rc = __hash_page_64K(ea, access, vsid, ptep, trap, local, ssize);
|
||||
else
|
||||
#endif /* CONFIG_PPC_HAS_HASH_64K */
|
||||
__hash_page_4K(ea, access, vsid, ptep, trap, local, ssize,
|
||||
subpage_protection(pgdir, ea));
|
||||
rc = __hash_page_4K(ea, access, vsid, ptep, trap, local, ssize,
|
||||
subpage_protection(pgdir, ea));
|
||||
|
||||
/* Dump some info in case of hash insertion failure, they should
|
||||
* never happen so it is really useful to know if/when they do
|
||||
*/
|
||||
if (rc == -1)
|
||||
hash_failure_debug(ea, access, vsid, trap, ssize,
|
||||
mm->context.user_psize, pte_val(*ptep));
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
|
|
@ -21,21 +21,13 @@ int __hash_page_huge(unsigned long ea, unsigned long access, unsigned long vsid,
|
|||
unsigned long old_pte, new_pte;
|
||||
unsigned long va, rflags, pa, sz;
|
||||
long slot;
|
||||
int err = 1;
|
||||
|
||||
BUG_ON(shift != mmu_psize_defs[mmu_psize].shift);
|
||||
|
||||
/* Search the Linux page table for a match with va */
|
||||
va = hpt_va(ea, vsid, ssize);
|
||||
|
||||
/*
|
||||
* Check the user's access rights to the page. If access should be
|
||||
* prevented then send the problem up to do_page_fault.
|
||||
*/
|
||||
if (unlikely(access & ~pte_val(*ptep)))
|
||||
goto out;
|
||||
/*
|
||||
* At this point, we have a pte (old_pte) which can be used to build
|
||||
/* At this point, we have a pte (old_pte) which can be used to build
|
||||
* or update an HPTE. There are 2 cases:
|
||||
*
|
||||
* 1. There is a valid (present) pte with no associated HPTE (this is
|
||||
|
@ -49,9 +41,17 @@ int __hash_page_huge(unsigned long ea, unsigned long access, unsigned long vsid,
|
|||
|
||||
do {
|
||||
old_pte = pte_val(*ptep);
|
||||
if (old_pte & _PAGE_BUSY)
|
||||
goto out;
|
||||
/* If PTE busy, retry the access */
|
||||
if (unlikely(old_pte & _PAGE_BUSY))
|
||||
return 0;
|
||||
/* If PTE permissions don't match, take page fault */
|
||||
if (unlikely(access & ~old_pte))
|
||||
return 1;
|
||||
/* Try to lock the PTE, add ACCESSED and DIRTY if it was
|
||||
* a write access */
|
||||
new_pte = old_pte | _PAGE_BUSY | _PAGE_ACCESSED;
|
||||
if (access & _PAGE_RW)
|
||||
new_pte |= _PAGE_DIRTY;
|
||||
} while(old_pte != __cmpxchg_u64((unsigned long *)ptep,
|
||||
old_pte, new_pte));
|
||||
|
||||
|
@ -121,8 +121,16 @@ int __hash_page_huge(unsigned long ea, unsigned long access, unsigned long vsid,
|
|||
}
|
||||
}
|
||||
|
||||
if (unlikely(slot == -2))
|
||||
panic("hash_huge_page: pte_insert failed\n");
|
||||
/*
|
||||
* Hypervisor failure. Restore old pte and return -1
|
||||
* similar to __hash_page_*
|
||||
*/
|
||||
if (unlikely(slot == -2)) {
|
||||
*ptep = __pte(old_pte);
|
||||
hash_failure_debug(ea, access, vsid, trap, ssize,
|
||||
mmu_psize, old_pte);
|
||||
return -1;
|
||||
}
|
||||
|
||||
new_pte |= (slot << 12) & (_PAGE_F_SECOND | _PAGE_F_GIX);
|
||||
}
|
||||
|
@ -131,9 +139,5 @@ int __hash_page_huge(unsigned long ea, unsigned long access, unsigned long vsid,
|
|||
* No need to use ldarx/stdcx here
|
||||
*/
|
||||
*ptep = __pte(new_pte & ~_PAGE_BUSY);
|
||||
|
||||
err = 0;
|
||||
|
||||
out:
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -398,15 +398,15 @@ static int of_get_drconf_memory(struct device_node *memory, const u32 **dm)
|
|||
}
|
||||
|
||||
/*
|
||||
* Retreive and validate the ibm,memblock-size property for drconf memory
|
||||
* Retreive and validate the ibm,lmb-size property for drconf memory
|
||||
* from the device tree.
|
||||
*/
|
||||
static u64 of_get_memblock_size(struct device_node *memory)
|
||||
static u64 of_get_lmb_size(struct device_node *memory)
|
||||
{
|
||||
const u32 *prop;
|
||||
u32 len;
|
||||
|
||||
prop = of_get_property(memory, "ibm,memblock-size", &len);
|
||||
prop = of_get_property(memory, "ibm,lmb-size", &len);
|
||||
if (!prop || len < sizeof(unsigned int))
|
||||
return 0;
|
||||
|
||||
|
@ -562,7 +562,7 @@ static unsigned long __init numa_enforce_memory_limit(unsigned long start,
|
|||
static inline int __init read_usm_ranges(const u32 **usm)
|
||||
{
|
||||
/*
|
||||
* For each memblock in ibm,dynamic-memory a corresponding
|
||||
* For each lmb in ibm,dynamic-memory a corresponding
|
||||
* entry in linux,drconf-usable-memory property contains
|
||||
* a counter followed by that many (base, size) duple.
|
||||
* read the counter from linux,drconf-usable-memory
|
||||
|
@ -578,7 +578,7 @@ static void __init parse_drconf_memory(struct device_node *memory)
|
|||
{
|
||||
const u32 *dm, *usm;
|
||||
unsigned int n, rc, ranges, is_kexec_kdump = 0;
|
||||
unsigned long memblock_size, base, size, sz;
|
||||
unsigned long lmb_size, base, size, sz;
|
||||
int nid;
|
||||
struct assoc_arrays aa;
|
||||
|
||||
|
@ -586,8 +586,8 @@ static void __init parse_drconf_memory(struct device_node *memory)
|
|||
if (!n)
|
||||
return;
|
||||
|
||||
memblock_size = of_get_memblock_size(memory);
|
||||
if (!memblock_size)
|
||||
lmb_size = of_get_lmb_size(memory);
|
||||
if (!lmb_size)
|
||||
return;
|
||||
|
||||
rc = of_get_assoc_arrays(memory, &aa);
|
||||
|
@ -611,7 +611,7 @@ static void __init parse_drconf_memory(struct device_node *memory)
|
|||
continue;
|
||||
|
||||
base = drmem.base_addr;
|
||||
size = memblock_size;
|
||||
size = lmb_size;
|
||||
ranges = 1;
|
||||
|
||||
if (is_kexec_kdump) {
|
||||
|
@ -1072,7 +1072,7 @@ static int hot_add_drconf_scn_to_nid(struct device_node *memory,
|
|||
{
|
||||
const u32 *dm;
|
||||
unsigned int drconf_cell_cnt, rc;
|
||||
unsigned long memblock_size;
|
||||
unsigned long lmb_size;
|
||||
struct assoc_arrays aa;
|
||||
int nid = -1;
|
||||
|
||||
|
@ -1080,8 +1080,8 @@ static int hot_add_drconf_scn_to_nid(struct device_node *memory,
|
|||
if (!drconf_cell_cnt)
|
||||
return -1;
|
||||
|
||||
memblock_size = of_get_memblock_size(memory);
|
||||
if (!memblock_size)
|
||||
lmb_size = of_get_lmb_size(memory);
|
||||
if (!lmb_size)
|
||||
return -1;
|
||||
|
||||
rc = of_get_assoc_arrays(memory, &aa);
|
||||
|
@ -1100,7 +1100,7 @@ static int hot_add_drconf_scn_to_nid(struct device_node *memory,
|
|||
continue;
|
||||
|
||||
if ((scn_addr < drmem.base_addr)
|
||||
|| (scn_addr >= (drmem.base_addr + memblock_size)))
|
||||
|| (scn_addr >= (drmem.base_addr + lmb_size)))
|
||||
continue;
|
||||
|
||||
nid = of_drconf_to_nid_single(&drmem, &aa);
|
||||
|
|
|
@ -69,7 +69,7 @@ static int pseries_remove_memory(struct device_node *np)
|
|||
const char *type;
|
||||
const unsigned int *regs;
|
||||
unsigned long base;
|
||||
unsigned int memblock_size;
|
||||
unsigned int lmb_size;
|
||||
int ret = -EINVAL;
|
||||
|
||||
/*
|
||||
|
@ -87,9 +87,9 @@ static int pseries_remove_memory(struct device_node *np)
|
|||
return ret;
|
||||
|
||||
base = *(unsigned long *)regs;
|
||||
memblock_size = regs[3];
|
||||
lmb_size = regs[3];
|
||||
|
||||
ret = pseries_remove_memblock(base, memblock_size);
|
||||
ret = pseries_remove_memblock(base, lmb_size);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -98,7 +98,7 @@ static int pseries_add_memory(struct device_node *np)
|
|||
const char *type;
|
||||
const unsigned int *regs;
|
||||
unsigned long base;
|
||||
unsigned int memblock_size;
|
||||
unsigned int lmb_size;
|
||||
int ret = -EINVAL;
|
||||
|
||||
/*
|
||||
|
@ -116,36 +116,36 @@ static int pseries_add_memory(struct device_node *np)
|
|||
return ret;
|
||||
|
||||
base = *(unsigned long *)regs;
|
||||
memblock_size = regs[3];
|
||||
lmb_size = regs[3];
|
||||
|
||||
/*
|
||||
* Update memory region to represent the memory add
|
||||
*/
|
||||
ret = memblock_add(base, memblock_size);
|
||||
ret = memblock_add(base, lmb_size);
|
||||
return (ret < 0) ? -EINVAL : 0;
|
||||
}
|
||||
|
||||
static int pseries_drconf_memory(unsigned long *base, unsigned int action)
|
||||
{
|
||||
struct device_node *np;
|
||||
const unsigned long *memblock_size;
|
||||
const unsigned long *lmb_size;
|
||||
int rc;
|
||||
|
||||
np = of_find_node_by_path("/ibm,dynamic-reconfiguration-memory");
|
||||
if (!np)
|
||||
return -EINVAL;
|
||||
|
||||
memblock_size = of_get_property(np, "ibm,memblock-size", NULL);
|
||||
if (!memblock_size) {
|
||||
lmb_size = of_get_property(np, "ibm,lmb-size", NULL);
|
||||
if (!lmb_size) {
|
||||
of_node_put(np);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (action == PSERIES_DRCONF_MEM_ADD) {
|
||||
rc = memblock_add(*base, *memblock_size);
|
||||
rc = memblock_add(*base, *lmb_size);
|
||||
rc = (rc < 0) ? -EINVAL : 0;
|
||||
} else if (action == PSERIES_DRCONF_MEM_REMOVE) {
|
||||
rc = pseries_remove_memblock(*base, *memblock_size);
|
||||
rc = pseries_remove_memblock(*base, *lmb_size);
|
||||
} else {
|
||||
rc = -EINVAL;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.34-rc3
|
||||
# Sat Apr 3 15:49:56 2010
|
||||
# Linux kernel version: 2.6.34
|
||||
# Wed May 26 21:14:01 2010
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_SPARC=y
|
||||
|
@ -107,10 +107,9 @@ CONFIG_PERF_COUNTERS=y
|
|||
# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_PCI_QUIRKS=y
|
||||
CONFIG_SLUB_DEBUG=y
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
# CONFIG_SLAB is not set
|
||||
CONFIG_SLUB=y
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_SLUB is not set
|
||||
# CONFIG_SLOB is not set
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_TRACEPOINTS=y
|
||||
|
@ -239,6 +238,7 @@ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
|
|||
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_MIGRATION=y
|
||||
CONFIG_PHYS_ADDR_T_64BIT=y
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
||||
|
@ -351,6 +351,7 @@ CONFIG_IPV6_TUNNEL=m
|
|||
# CONFIG_RDS is not set
|
||||
# CONFIG_TIPC is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_L2TP is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_NET_DSA is not set
|
||||
CONFIG_VLAN_8021Q=m
|
||||
|
@ -367,6 +368,7 @@ CONFIG_VLAN_8021Q=m
|
|||
# CONFIG_IEEE802154 is not set
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_DCB is not set
|
||||
CONFIG_RPS=y
|
||||
|
||||
#
|
||||
# Network testing
|
||||
|
@ -386,9 +388,14 @@ CONFIG_WIRELESS=y
|
|||
#
|
||||
# CFG80211 needs to be enabled for MAC80211
|
||||
#
|
||||
|
||||
#
|
||||
# Some wireless drivers require a rate control algorithm
|
||||
#
|
||||
# CONFIG_WIMAX is not set
|
||||
# CONFIG_RFKILL is not set
|
||||
# CONFIG_NET_9P is not set
|
||||
# CONFIG_CAIF is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
|
@ -658,6 +665,7 @@ CONFIG_PHYLIB=m
|
|||
# CONFIG_NATIONAL_PHY is not set
|
||||
# CONFIG_STE10XP is not set
|
||||
# CONFIG_LSI_ET1011C_PHY is not set
|
||||
# CONFIG_MICREL_PHY is not set
|
||||
# CONFIG_MDIO_BITBANG is not set
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=m
|
||||
|
@ -734,6 +742,8 @@ CONFIG_NETDEV_10000=y
|
|||
# CONFIG_CHELSIO_T1 is not set
|
||||
CONFIG_CHELSIO_T3_DEPENDS=y
|
||||
# CONFIG_CHELSIO_T3 is not set
|
||||
CONFIG_CHELSIO_T4_DEPENDS=y
|
||||
# CONFIG_CHELSIO_T4 is not set
|
||||
# CONFIG_ENIC is not set
|
||||
# CONFIG_IXGBE is not set
|
||||
# CONFIG_IXGBEVF is not set
|
||||
|
@ -766,6 +776,7 @@ CONFIG_NIU=m
|
|||
# CONFIG_USB_PEGASUS is not set
|
||||
# CONFIG_USB_RTL8150 is not set
|
||||
# CONFIG_USB_USBNET is not set
|
||||
# CONFIG_USB_IPHETH is not set
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_FDDI is not set
|
||||
# CONFIG_HIPPI is not set
|
||||
|
@ -778,7 +789,6 @@ CONFIG_PPP_DEFLATE=m
|
|||
CONFIG_PPP_BSDCOMP=m
|
||||
CONFIG_PPP_MPPE=m
|
||||
CONFIG_PPPOE=m
|
||||
# CONFIG_PPPOL2TP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
CONFIG_SLHC=m
|
||||
# CONFIG_NET_FC is not set
|
||||
|
@ -816,6 +826,7 @@ CONFIG_INPUT_KEYBOARD=y
|
|||
CONFIG_KEYBOARD_ATKBD=y
|
||||
# CONFIG_QT2160 is not set
|
||||
CONFIG_KEYBOARD_LKKBD=m
|
||||
# CONFIG_KEYBOARD_TCA6416 is not set
|
||||
# CONFIG_KEYBOARD_MAX7359 is not set
|
||||
# CONFIG_KEYBOARD_NEWTON is not set
|
||||
# CONFIG_KEYBOARD_OPENCORES is not set
|
||||
|
@ -840,6 +851,7 @@ CONFIG_MOUSE_SERIAL=y
|
|||
# CONFIG_INPUT_TABLET is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
CONFIG_INPUT_MISC=y
|
||||
# CONFIG_INPUT_AD714X is not set
|
||||
CONFIG_INPUT_SPARCSPKR=y
|
||||
# CONFIG_INPUT_ATI_REMOTE is not set
|
||||
# CONFIG_INPUT_ATI_REMOTE2 is not set
|
||||
|
@ -848,6 +860,7 @@ CONFIG_INPUT_SPARCSPKR=y
|
|||
# CONFIG_INPUT_YEALINK is not set
|
||||
# CONFIG_INPUT_CM109 is not set
|
||||
# CONFIG_INPUT_UINPUT is not set
|
||||
# CONFIG_INPUT_PCF8574 is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
|
@ -871,6 +884,7 @@ CONFIG_HW_CONSOLE=y
|
|||
# CONFIG_VT_HW_CONSOLE_BINDING is not set
|
||||
# CONFIG_DEVKMEM is not set
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
# CONFIG_N_GSM is not set
|
||||
# CONFIG_NOZOMI is not set
|
||||
|
||||
#
|
||||
|
@ -893,6 +907,8 @@ CONFIG_SERIAL_CORE_CONSOLE=y
|
|||
# CONFIG_SERIAL_JSM is not set
|
||||
# CONFIG_SERIAL_TIMBERDALE is not set
|
||||
# CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set
|
||||
# CONFIG_SERIAL_ALTERA_JTAGUART is not set
|
||||
# CONFIG_SERIAL_ALTERA_UART is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
|
@ -1306,11 +1322,14 @@ CONFIG_USB_HIDDEV=y
|
|||
CONFIG_HID_A4TECH=y
|
||||
CONFIG_HID_APPLE=y
|
||||
CONFIG_HID_BELKIN=y
|
||||
# CONFIG_HID_CANDO is not set
|
||||
CONFIG_HID_CHERRY=y
|
||||
CONFIG_HID_CHICONY=y
|
||||
# CONFIG_HID_PRODIKEYS is not set
|
||||
CONFIG_HID_CYPRESS=y
|
||||
CONFIG_HID_DRAGONRISE=y
|
||||
# CONFIG_DRAGONRISE_FF is not set
|
||||
# CONFIG_HID_EGALAX is not set
|
||||
CONFIG_HID_EZKEY=y
|
||||
CONFIG_HID_KYE=y
|
||||
CONFIG_HID_GYRATION=y
|
||||
|
@ -1328,7 +1347,9 @@ CONFIG_HID_ORTEK=y
|
|||
CONFIG_HID_PANTHERLORD=y
|
||||
# CONFIG_PANTHERLORD_FF is not set
|
||||
CONFIG_HID_PETALYNX=y
|
||||
# CONFIG_HID_PICOLCD is not set
|
||||
# CONFIG_HID_QUANTA is not set
|
||||
# CONFIG_HID_ROCCAT_KONE is not set
|
||||
CONFIG_HID_SAMSUNG=y
|
||||
CONFIG_HID_SONY=y
|
||||
# CONFIG_HID_STANTUM is not set
|
||||
|
@ -1342,6 +1363,7 @@ CONFIG_HID_THRUSTMASTER=y
|
|||
# CONFIG_THRUSTMASTER_FF is not set
|
||||
CONFIG_HID_ZEROPLUS=y
|
||||
# CONFIG_ZEROPLUS_FF is not set
|
||||
# CONFIG_HID_ZYDACRON is not set
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
|
@ -1356,7 +1378,6 @@ CONFIG_USB=y
|
|||
# CONFIG_USB_DEVICEFS is not set
|
||||
# CONFIG_USB_DEVICE_CLASS is not set
|
||||
# CONFIG_USB_DYNAMIC_MINORS is not set
|
||||
# CONFIG_USB_OTG is not set
|
||||
# CONFIG_USB_MON is not set
|
||||
# CONFIG_USB_WUSB is not set
|
||||
# CONFIG_USB_WUSB_CBAF is not set
|
||||
|
@ -1521,10 +1542,6 @@ CONFIG_RTC_DRV_STARFIRE=y
|
|||
# CONFIG_DMADEVICES is not set
|
||||
# CONFIG_AUXDISPLAY is not set
|
||||
# CONFIG_UIO is not set
|
||||
|
||||
#
|
||||
# TI VLYNQ
|
||||
#
|
||||
# CONFIG_STAGING is not set
|
||||
|
||||
#
|
||||
|
@ -1706,8 +1723,8 @@ CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
|
|||
CONFIG_SCHEDSTATS=y
|
||||
# CONFIG_TIMER_STATS is not set
|
||||
# CONFIG_DEBUG_OBJECTS is not set
|
||||
# CONFIG_SLUB_DEBUG_ON is not set
|
||||
# CONFIG_SLUB_STATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_KMEMLEAK is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
|
@ -1742,6 +1759,9 @@ CONFIG_SYSCTL_SYSCALL_CHECK=y
|
|||
# CONFIG_DEBUG_PAGEALLOC is not set
|
||||
CONFIG_NOP_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
|
||||
CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
|
||||
|
@ -1769,12 +1789,12 @@ CONFIG_BLK_DEV_IO_TRACE=y
|
|||
# CONFIG_RING_BUFFER_BENCHMARK is not set
|
||||
# CONFIG_DYNAMIC_DEBUG is not set
|
||||
# CONFIG_DMA_API_DEBUG is not set
|
||||
# CONFIG_ATOMIC64_SELFTEST is not set
|
||||
# CONFIG_SAMPLES is not set
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
# CONFIG_KGDB is not set
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
# CONFIG_DEBUG_DCFLUSH is not set
|
||||
# CONFIG_STACK_DEBUG is not set
|
||||
# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
|
||||
|
||||
#
|
||||
|
@ -1895,6 +1915,7 @@ CONFIG_CRYPTO_DEFLATE=y
|
|||
#
|
||||
# CONFIG_CRYPTO_ANSI_CPRNG is not set
|
||||
CONFIG_CRYPTO_HW=y
|
||||
# CONFIG_CRYPTO_DEV_NIAGARA2 is not set
|
||||
# CONFIG_CRYPTO_DEV_HIFN_795X is not set
|
||||
CONFIG_BINARY_PRINTF=y
|
||||
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
|
||||
#define L1_CACHE_SHIFT 5
|
||||
#define L1_CACHE_BYTES 32
|
||||
#define L1_CACHE_ALIGN(x) ((((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1)))
|
||||
|
||||
#ifdef CONFIG_SPARC32
|
||||
#define SMP_CACHE_BYTES_SHIFT 5
|
||||
|
|
|
@ -142,13 +142,12 @@ BTFIXUPDEF_CALL_CONST(unsigned long, pgd_page_vaddr, pgd_t)
|
|||
#define pmd_page(pmd) BTFIXUP_CALL(pmd_page)(pmd)
|
||||
#define pgd_page_vaddr(pgd) BTFIXUP_CALL(pgd_page_vaddr)(pgd)
|
||||
|
||||
BTFIXUPDEF_SETHI(none_mask)
|
||||
BTFIXUPDEF_CALL_CONST(int, pte_present, pte_t)
|
||||
BTFIXUPDEF_CALL(void, pte_clear, pte_t *)
|
||||
|
||||
static inline int pte_none(pte_t pte)
|
||||
{
|
||||
return !(pte_val(pte) & ~BTFIXUP_SETHI(none_mask));
|
||||
return !pte_val(pte);
|
||||
}
|
||||
|
||||
#define pte_present(pte) BTFIXUP_CALL(pte_present)(pte)
|
||||
|
@ -160,7 +159,7 @@ BTFIXUPDEF_CALL(void, pmd_clear, pmd_t *)
|
|||
|
||||
static inline int pmd_none(pmd_t pmd)
|
||||
{
|
||||
return !(pmd_val(pmd) & ~BTFIXUP_SETHI(none_mask));
|
||||
return !pmd_val(pmd);
|
||||
}
|
||||
|
||||
#define pmd_bad(pmd) BTFIXUP_CALL(pmd_bad)(pmd)
|
||||
|
|
|
@ -657,6 +657,7 @@ static u64 maybe_change_configuration(struct cpu_hw_events *cpuc, u64 pcr)
|
|||
cpuc->current_idx[i] = idx;
|
||||
|
||||
enc = perf_event_get_enc(cpuc->events[i]);
|
||||
pcr &= ~mask_for_index(idx);
|
||||
pcr |= event_encoding(enc, idx);
|
||||
}
|
||||
out:
|
||||
|
|
|
@ -183,7 +183,7 @@ void sun4d_free_irq(unsigned int irq, void *dev_id)
|
|||
goto out_unlock;
|
||||
}
|
||||
|
||||
if (action && tmp)
|
||||
if (tmp)
|
||||
tmp->next = action->next;
|
||||
else
|
||||
*actionp = action->next;
|
||||
|
|
|
@ -64,7 +64,7 @@ tl0_irq6: TRAP_IRQ(smp_call_function_single_client, 6)
|
|||
tl0_irq6: BTRAP(0x46)
|
||||
#endif
|
||||
tl0_irq7: TRAP_IRQ(deferred_pcr_work_irq, 7)
|
||||
#ifdef CONFIG_KGDB
|
||||
#if defined(CONFIG_KGDB) && defined(CONFIG_SMP)
|
||||
tl0_irq8: TRAP_IRQ(smp_kgdb_capture_client, 8)
|
||||
#else
|
||||
tl0_irq8: BTRAP(0x48)
|
||||
|
|
|
@ -2215,8 +2215,6 @@ void __init ld_mmu_srmmu(void)
|
|||
BTFIXUPSET_CALL(pmd_page, srmmu_pmd_page, BTFIXUPCALL_NORM);
|
||||
BTFIXUPSET_CALL(pgd_page_vaddr, srmmu_pgd_page, BTFIXUPCALL_NORM);
|
||||
|
||||
BTFIXUPSET_SETHI(none_mask, 0xF0000000);
|
||||
|
||||
BTFIXUPSET_CALL(pte_present, srmmu_pte_present, BTFIXUPCALL_NORM);
|
||||
BTFIXUPSET_CALL(pte_clear, srmmu_pte_clear, BTFIXUPCALL_SWAPO0G0);
|
||||
|
||||
|
|
|
@ -2087,9 +2087,6 @@ void __init ld_mmu_sun4c(void)
|
|||
|
||||
BTFIXUPSET_CALL(set_pte, sun4c_set_pte, BTFIXUPCALL_STO1O0);
|
||||
|
||||
/* The 2.4.18 code does not set this on sun4c, how does it work? XXX */
|
||||
/* BTFIXUPSET_SETHI(none_mask, 0x00000000); */ /* Defaults to zero? */
|
||||
|
||||
BTFIXUPSET_CALL(pte_pfn, sun4c_pte_pfn, BTFIXUPCALL_NORM);
|
||||
#if 0 /* PAGE_SHIFT <= 12 */ /* Eek. Investigate. XXX */
|
||||
BTFIXUPSET_CALL(pmd_page, sun4c_pmd_page, BTFIXUPCALL_ANDNINT(PAGE_SIZE - 1));
|
||||
|
|
|
@ -145,6 +145,15 @@ int acpi_processor_ffh_cstate_probe(unsigned int cpu,
|
|||
percpu_entry->states[cx->index].eax = cx->address;
|
||||
percpu_entry->states[cx->index].ecx = MWAIT_ECX_INTERRUPT_BREAK;
|
||||
}
|
||||
|
||||
/*
|
||||
* For _CST FFH on Intel, if GAS.access_size bit 1 is cleared,
|
||||
* then we should skip checking BM_STS for this C-state.
|
||||
* ref: "Intel Processor Vendor-Specific ACPI Interface Specification"
|
||||
*/
|
||||
if ((c->x86_vendor == X86_VENDOR_INTEL) && !(reg->access_size & 0x2))
|
||||
cx->bm_sts_skip = 1;
|
||||
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_processor_ffh_cstate_probe);
|
||||
|
|
|
@ -157,9 +157,14 @@ static int __init acpi_sleep_setup(char *str)
|
|||
#ifdef CONFIG_HIBERNATION
|
||||
if (strncmp(str, "s4_nohwsig", 10) == 0)
|
||||
acpi_no_s4_hw_signature();
|
||||
if (strncmp(str, "s4_nonvs", 8) == 0)
|
||||
acpi_s4_no_nvs();
|
||||
if (strncmp(str, "s4_nonvs", 8) == 0) {
|
||||
pr_warning("ACPI: acpi_sleep=s4_nonvs is deprecated, "
|
||||
"please use acpi_sleep=nonvs instead");
|
||||
acpi_nvs_nosave();
|
||||
}
|
||||
#endif
|
||||
if (strncmp(str, "nonvs", 5) == 0)
|
||||
acpi_nvs_nosave();
|
||||
if (strncmp(str, "old_ordering", 12) == 0)
|
||||
acpi_old_suspend_ordering();
|
||||
str = strchr(str, ',');
|
||||
|
|
|
@ -921,7 +921,7 @@ void disable_local_APIC(void)
|
|||
unsigned int value;
|
||||
|
||||
/* APIC hasn't been mapped yet */
|
||||
if (!apic_phys)
|
||||
if (!x2apic_mode && !apic_phys)
|
||||
return;
|
||||
|
||||
clear_local_APIC();
|
||||
|
|
|
@ -368,22 +368,16 @@ static int __init pcc_cpufreq_do_osc(acpi_handle *handle)
|
|||
return -ENODEV;
|
||||
|
||||
out_obj = output.pointer;
|
||||
if (out_obj->type != ACPI_TYPE_BUFFER) {
|
||||
ret = -ENODEV;
|
||||
goto out_free;
|
||||
}
|
||||
if (out_obj->type != ACPI_TYPE_BUFFER)
|
||||
return -ENODEV;
|
||||
|
||||
errors = *((u32 *)out_obj->buffer.pointer) & ~(1 << 0);
|
||||
if (errors) {
|
||||
ret = -ENODEV;
|
||||
goto out_free;
|
||||
}
|
||||
if (errors)
|
||||
return -ENODEV;
|
||||
|
||||
supported = *((u32 *)(out_obj->buffer.pointer + 4));
|
||||
if (!(supported & 0x1)) {
|
||||
ret = -ENODEV;
|
||||
goto out_free;
|
||||
}
|
||||
if (!(supported & 0x1))
|
||||
return -ENODEV;
|
||||
|
||||
out_free:
|
||||
kfree(output.pointer);
|
||||
|
@ -397,13 +391,17 @@ static int __init pcc_cpufreq_probe(void)
|
|||
struct pcc_memory_resource *mem_resource;
|
||||
struct pcc_register_resource *reg_resource;
|
||||
union acpi_object *out_obj, *member;
|
||||
acpi_handle handle, osc_handle;
|
||||
acpi_handle handle, osc_handle, pcch_handle;
|
||||
int ret = 0;
|
||||
|
||||
status = acpi_get_handle(NULL, "\\_SB", &handle);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
|
||||
status = acpi_get_handle(handle, "PCCH", &pcch_handle);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
|
||||
status = acpi_get_handle(handle, "_OSC", &osc_handle);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
ret = pcc_cpufreq_do_osc(&osc_handle);
|
||||
|
@ -543,13 +541,13 @@ static int pcc_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
|||
|
||||
if (!pcch_virt_addr) {
|
||||
result = -1;
|
||||
goto pcch_null;
|
||||
goto out;
|
||||
}
|
||||
|
||||
result = pcc_get_offset(cpu);
|
||||
if (result) {
|
||||
dprintk("init: PCCP evaluation failed\n");
|
||||
goto free;
|
||||
goto out;
|
||||
}
|
||||
|
||||
policy->max = policy->cpuinfo.max_freq =
|
||||
|
@ -558,14 +556,15 @@ static int pcc_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
|||
ioread32(&pcch_hdr->minimum_frequency) * 1000;
|
||||
policy->cur = pcc_get_freq(cpu);
|
||||
|
||||
if (!policy->cur) {
|
||||
dprintk("init: Unable to get current CPU frequency\n");
|
||||
result = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
dprintk("init: policy->max is %d, policy->min is %d\n",
|
||||
policy->max, policy->min);
|
||||
|
||||
return 0;
|
||||
free:
|
||||
pcc_clear_mapping();
|
||||
free_percpu(pcc_cpu_info);
|
||||
pcch_null:
|
||||
out:
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -1023,13 +1023,12 @@ static int get_transition_latency(struct powernow_k8_data *data)
|
|||
}
|
||||
if (max_latency == 0) {
|
||||
/*
|
||||
* Fam 11h always returns 0 as transition latency.
|
||||
* This is intended and means "very fast". While cpufreq core
|
||||
* and governors currently can handle that gracefully, better
|
||||
* set it to 1 to avoid problems in the future.
|
||||
* For all others it's a BIOS bug.
|
||||
* Fam 11h and later may return 0 as transition latency. This
|
||||
* is intended and means "very fast". While cpufreq core and
|
||||
* governors currently can handle that gracefully, better set it
|
||||
* to 1 to avoid problems in the future.
|
||||
*/
|
||||
if (boot_cpu_data.x86 != 0x11)
|
||||
if (boot_cpu_data.x86 < 0x11)
|
||||
printk(KERN_ERR FW_WARN PFX "Invalid zero transition "
|
||||
"latency\n");
|
||||
max_latency = 1;
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <asm/apic.h>
|
||||
#include <asm/iommu.h>
|
||||
#include <asm/gart.h>
|
||||
#include <asm/hpet.h>
|
||||
|
||||
static void __init fix_hypertransport_config(int num, int slot, int func)
|
||||
{
|
||||
|
@ -191,6 +192,21 @@ static void __init ati_bugs_contd(int num, int slot, int func)
|
|||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Force the read back of the CMP register in hpet_next_event()
|
||||
* to work around the problem that the CMP register write seems to be
|
||||
* delayed. See hpet_next_event() for details.
|
||||
*
|
||||
* We do this on all SMBUS incarnations for now until we have more
|
||||
* information about the affected chipsets.
|
||||
*/
|
||||
static void __init ati_hpet_bugs(int num, int slot, int func)
|
||||
{
|
||||
#ifdef CONFIG_HPET_TIMER
|
||||
hpet_readback_cmp = 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
#define QFLAG_APPLY_ONCE 0x1
|
||||
#define QFLAG_APPLIED 0x2
|
||||
#define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
|
||||
|
@ -220,6 +236,8 @@ static struct chipset early_qrk[] __initdata = {
|
|||
PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs },
|
||||
{ PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,
|
||||
PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs_contd },
|
||||
{ PCI_VENDOR_ID_ATI, PCI_ANY_ID,
|
||||
PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_hpet_bugs },
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
@ -571,8 +571,8 @@ auditsys:
|
|||
* masked off.
|
||||
*/
|
||||
sysret_audit:
|
||||
movq %rax,%rsi /* second arg, syscall return value */
|
||||
cmpq $0,%rax /* is it < 0? */
|
||||
movq RAX-ARGOFFSET(%rsp),%rsi /* second arg, syscall return value */
|
||||
cmpq $0,%rsi /* is it < 0? */
|
||||
setl %al /* 1 if so, 0 if not */
|
||||
movzbl %al,%edi /* zero-extend that into %edi */
|
||||
inc %edi /* first arg, 0->1(AUDITSC_SUCCESS), 1->2(AUDITSC_FAILURE) */
|
||||
|
|
|
@ -964,7 +964,7 @@ fs_initcall(hpet_late_init);
|
|||
|
||||
void hpet_disable(void)
|
||||
{
|
||||
if (is_hpet_capable()) {
|
||||
if (is_hpet_capable() && hpet_virt_address) {
|
||||
unsigned int cfg = hpet_readl(HPET_CFG);
|
||||
|
||||
if (hpet_legacy_int_enabled) {
|
||||
|
|
|
@ -276,16 +276,6 @@ static struct sys_device device_i8259A = {
|
|||
.cls = &i8259_sysdev_class,
|
||||
};
|
||||
|
||||
static int __init i8259A_init_sysfs(void)
|
||||
{
|
||||
int error = sysdev_class_register(&i8259_sysdev_class);
|
||||
if (!error)
|
||||
error = sysdev_register(&device_i8259A);
|
||||
return error;
|
||||
}
|
||||
|
||||
device_initcall(i8259A_init_sysfs);
|
||||
|
||||
static void mask_8259A(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
@ -407,3 +397,18 @@ struct legacy_pic default_legacy_pic = {
|
|||
};
|
||||
|
||||
struct legacy_pic *legacy_pic = &default_legacy_pic;
|
||||
|
||||
static int __init i8259A_init_sysfs(void)
|
||||
{
|
||||
int error;
|
||||
|
||||
if (legacy_pic != &default_legacy_pic)
|
||||
return 0;
|
||||
|
||||
error = sysdev_class_register(&i8259_sysdev_class);
|
||||
if (!error)
|
||||
error = sysdev_register(&device_i8259A);
|
||||
return error;
|
||||
}
|
||||
|
||||
device_initcall(i8259A_init_sysfs);
|
||||
|
|
|
@ -640,8 +640,8 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
|
|||
/* Skip cs, ip, orig_ax and gs. */ \
|
||||
" subl $16, %esp\n" \
|
||||
" pushl %fs\n" \
|
||||
" pushl %ds\n" \
|
||||
" pushl %es\n" \
|
||||
" pushl %ds\n" \
|
||||
" pushl %eax\n" \
|
||||
" pushl %ebp\n" \
|
||||
" pushl %edi\n" \
|
||||
|
|
|
@ -498,15 +498,10 @@ void force_hpet_resume(void)
|
|||
* See erratum #27 (Misinterpreted MSI Requests May Result in
|
||||
* Corrupted LPC DMA Data) in AMD Publication #46837,
|
||||
* "SB700 Family Product Errata", Rev. 1.0, March 2010.
|
||||
*
|
||||
* Also force the read back of the CMP register in hpet_next_event()
|
||||
* to work around the problem that the CMP register write seems to be
|
||||
* delayed. See hpet_next_event() for details.
|
||||
*/
|
||||
static void force_disable_hpet_msi(struct pci_dev *unused)
|
||||
{
|
||||
hpet_msi_disable = 1;
|
||||
hpet_readback_cmp = 1;
|
||||
}
|
||||
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,
|
||||
|
|
|
@ -238,6 +238,15 @@ void __init setup_per_cpu_areas(void)
|
|||
#ifdef CONFIG_NUMA
|
||||
per_cpu(x86_cpu_to_node_map, cpu) =
|
||||
early_per_cpu_map(x86_cpu_to_node_map, cpu);
|
||||
/*
|
||||
* Ensure that the boot cpu numa_node is correct when the boot
|
||||
* cpu is on a node that doesn't have memory installed.
|
||||
* Also cpu_up() will call cpu_to_node() for APs when
|
||||
* MEMORY_HOTPLUG is defined, before per_cpu(numa_node) is set
|
||||
* up later with c_init aka intel_init/amd_init.
|
||||
* So set them all (boot cpu and all APs).
|
||||
*/
|
||||
set_cpu_numa_node(cpu, early_cpu_to_node(cpu));
|
||||
#endif
|
||||
#endif
|
||||
/*
|
||||
|
@ -257,14 +266,6 @@ void __init setup_per_cpu_areas(void)
|
|||
early_per_cpu_ptr(x86_cpu_to_node_map) = NULL;
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_X86_64) && defined(CONFIG_NUMA)
|
||||
/*
|
||||
* make sure boot cpu numa_node is right, when boot cpu is on the
|
||||
* node that doesn't have mem installed
|
||||
*/
|
||||
set_cpu_numa_node(boot_cpu_id, early_cpu_to_node(boot_cpu_id));
|
||||
#endif
|
||||
|
||||
/* Setup node to cpumask map */
|
||||
setup_node_to_cpumask_map();
|
||||
|
||||
|
|
|
@ -2926,7 +2926,7 @@ static int kvm_mmu_remove_some_alloc_mmu_pages(struct kvm *kvm)
|
|||
return kvm_mmu_zap_page(kvm, page) + 1;
|
||||
}
|
||||
|
||||
static int mmu_shrink(int nr_to_scan, gfp_t gfp_mask)
|
||||
static int mmu_shrink(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask)
|
||||
{
|
||||
struct kvm *kvm;
|
||||
struct kvm *kvm_freed = NULL;
|
||||
|
|
|
@ -342,6 +342,7 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
|
|||
/* advance table_gfn when emulating 1gb pages with 4k */
|
||||
if (delta == 0)
|
||||
table_gfn += PT_INDEX(addr, level);
|
||||
access &= gw->pte_access;
|
||||
} else {
|
||||
direct = 0;
|
||||
table_gfn = gw->table_gfn[level - 2];
|
||||
|
|
|
@ -1562,7 +1562,7 @@ static int msr_io(struct kvm_vcpu *vcpu, struct kvm_msrs __user *user_msrs,
|
|||
|
||||
r = -ENOMEM;
|
||||
size = sizeof(struct kvm_msr_entry) * msrs.nmsrs;
|
||||
entries = vmalloc(size);
|
||||
entries = kmalloc(size, GFP_KERNEL);
|
||||
if (!entries)
|
||||
goto out;
|
||||
|
||||
|
@ -1581,7 +1581,7 @@ static int msr_io(struct kvm_vcpu *vcpu, struct kvm_msrs __user *user_msrs,
|
|||
r = n;
|
||||
|
||||
out_free:
|
||||
vfree(entries);
|
||||
kfree(entries);
|
||||
out:
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -184,6 +184,7 @@ static void __init pcibios_allocate_resources(int pass)
|
|||
idx, r, disabled, pass);
|
||||
if (pci_claim_resource(dev, idx) < 0) {
|
||||
/* We'll assign a new address later */
|
||||
dev->fw_addr[idx] = r->start;
|
||||
r->end -= r->start;
|
||||
r->start = 0;
|
||||
}
|
||||
|
|
|
@ -66,8 +66,9 @@ static int fixed_bar_cap(struct pci_bus *bus, unsigned int devfn)
|
|||
devfn, pos, 4, &pcie_cap))
|
||||
return 0;
|
||||
|
||||
if (pcie_cap == 0xffffffff)
|
||||
return 0;
|
||||
if (PCI_EXT_CAP_ID(pcie_cap) == 0x0000 ||
|
||||
PCI_EXT_CAP_ID(pcie_cap) == 0xffff)
|
||||
break;
|
||||
|
||||
if (PCI_EXT_CAP_ID(pcie_cap) == PCI_EXT_CAP_ID_VNDR) {
|
||||
raw_pci_ext_ops->read(pci_domain_nr(bus), bus->number,
|
||||
|
@ -76,7 +77,7 @@ static int fixed_bar_cap(struct pci_bus *bus, unsigned int devfn)
|
|||
return pos;
|
||||
}
|
||||
|
||||
pos = pcie_cap >> 20;
|
||||
pos = PCI_EXT_CAP_NEXT(pcie_cap);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -70,6 +70,7 @@ acpi_ev_get_gpe_device(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
|||
acpi_status acpi_enable(void)
|
||||
{
|
||||
acpi_status status;
|
||||
int retry;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_enable);
|
||||
|
||||
|
@ -98,16 +99,18 @@ acpi_status acpi_enable(void)
|
|||
|
||||
/* Sanity check that transition succeeded */
|
||||
|
||||
if (acpi_hw_get_mode() != ACPI_SYS_MODE_ACPI) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Hardware did not enter ACPI mode"));
|
||||
return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
|
||||
for (retry = 0; retry < 30000; ++retry) {
|
||||
if (acpi_hw_get_mode() == ACPI_SYS_MODE_ACPI) {
|
||||
if (retry != 0)
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"Platform took > %d00 usec to enter ACPI mode", retry));
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
acpi_os_stall(100); /* 100 usec */
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INIT,
|
||||
"Transition to ACPI mode successful\n"));
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
ACPI_ERROR((AE_INFO, "Hardware did not enter ACPI mode"));
|
||||
return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_enable)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue