mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 15:40:56 +07:00
Merge branch 'devel-stable' of master.kernel.org:/home/rmk/linux-2.6-arm
* 'devel-stable' of master.kernel.org:/home/rmk/linux-2.6-arm: (289 commits) davinci: DM644x EVM: register MUSB device earlier davinci: add spi devices on tnetv107x evm davinci: add ssp config for tnetv107x evm board davinci: add tnetv107x ssp platform device spi: add ti-ssp spi master driver mfd: add driver for sequencer serial port ARM: EXYNOS4: Implement Clock gating for System MMU ARM: EXYNOS4: Enhancement of System MMU driver ARM: EXYNOS4: Add support for gpio interrupts ARM: S5P: Add function to register gpio interrupt bank data ARM: S5P: Cleanup S5P gpio interrupt code ARM: EXYNOS4: Add missing GPYx banks ARM: S3C64XX: Fix section mismatch from cpufreq init ARM: EXYNOS4: Add keypad device to the SMDKV310 ARM: EXYNOS4: Update clocks for keypad ARM: EXYNOS4: Update keypad base address ARM: EXYNOS4: Add keypad device helpers ARM: EXYNOS4: Add support for SATA on ARMLEX4210 plat-nomadik: make GPIO interrupts work with cpuidle ApSleep mach-u300: define a dummy filter function for coh901318 ... Fix up various conflicts in - arch/arm/mach-exynos4/cpufreq.c - arch/arm/mach-mxs/gpio.c - drivers/net/Kconfig - drivers/tty/serial/Kconfig - drivers/tty/serial/Makefile - drivers/usb/gadget/fsl_mxc_udc.c - drivers/video/Kconfig
This commit is contained in:
commit
411f5c7a50
@ -5676,7 +5676,8 @@ F: arch/arm/mach-s3c2410/bast-ide.c
|
||||
F: arch/arm/mach-s3c2410/bast-irq.c
|
||||
|
||||
TI DAVINCI MACHINE SUPPORT
|
||||
M: Kevin Hilman <khilman@deeprootsystems.com>
|
||||
M: Sekhar Nori <nsekhar@ti.com>
|
||||
M: Kevin Hilman <khilman@ti.com>
|
||||
L: davinci-linux-open-source@linux.davincidsp.com (subscribers-only)
|
||||
Q: http://patchwork.kernel.org/project/linux-davinci/list/
|
||||
S: Supported
|
||||
|
@ -722,7 +722,8 @@ config ARCH_S5P64X0
|
||||
select GENERIC_GPIO
|
||||
select HAVE_CLK
|
||||
select HAVE_S3C2410_WATCHDOG if WATCHDOG
|
||||
select ARCH_USES_GETTIMEOFFSET
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select HAVE_SCHED_CLOCK
|
||||
select HAVE_S3C2410_I2C if I2C
|
||||
select HAVE_S3C_RTC if RTC_CLASS
|
||||
help
|
||||
@ -760,15 +761,16 @@ config ARCH_S5PV210
|
||||
select HAVE_CLK
|
||||
select ARM_L1_CACHE_SHIFT_6
|
||||
select ARCH_HAS_CPUFREQ
|
||||
select ARCH_USES_GETTIMEOFFSET
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select HAVE_SCHED_CLOCK
|
||||
select HAVE_S3C2410_I2C if I2C
|
||||
select HAVE_S3C_RTC if RTC_CLASS
|
||||
select HAVE_S3C2410_WATCHDOG if WATCHDOG
|
||||
help
|
||||
Samsung S5PV210/S5PC110 series based systems
|
||||
|
||||
config ARCH_S5PV310
|
||||
bool "Samsung S5PV310/S5PC210"
|
||||
config ARCH_EXYNOS4
|
||||
bool "Samsung EXYNOS4"
|
||||
select CPU_V7
|
||||
select ARCH_SPARSEMEM_ENABLE
|
||||
select GENERIC_GPIO
|
||||
@ -779,7 +781,7 @@ config ARCH_S5PV310
|
||||
select HAVE_S3C2410_I2C if I2C
|
||||
select HAVE_S3C2410_WATCHDOG if WATCHDOG
|
||||
help
|
||||
Samsung S5PV310 series based systems
|
||||
Samsung EXYNOS4 series based systems
|
||||
|
||||
config ARCH_SHARK
|
||||
bool "Shark"
|
||||
@ -993,7 +995,7 @@ source "arch/arm/mach-s5pc100/Kconfig"
|
||||
|
||||
source "arch/arm/mach-s5pv210/Kconfig"
|
||||
|
||||
source "arch/arm/mach-s5pv310/Kconfig"
|
||||
source "arch/arm/mach-exynos4/Kconfig"
|
||||
|
||||
source "arch/arm/mach-shmobile/Kconfig"
|
||||
|
||||
@ -1315,7 +1317,7 @@ config SMP
|
||||
depends on GENERIC_CLOCKEVENTS
|
||||
depends on REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP || \
|
||||
MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \
|
||||
ARCH_S5PV310 || ARCH_TEGRA || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || \
|
||||
ARCH_EXYNOS4 || ARCH_TEGRA || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || \
|
||||
ARCH_MSM_SCORPIONMP || ARCH_SHMOBILE
|
||||
select USE_GENERIC_SMP_HELPERS
|
||||
select HAVE_ARM_SCU if !ARCH_MSM_SCORPIONMP
|
||||
@ -1403,7 +1405,7 @@ config LOCAL_TIMERS
|
||||
bool "Use local timer interrupts"
|
||||
depends on SMP
|
||||
default y
|
||||
select HAVE_ARM_TWD if !ARCH_MSM_SCORPIONMP
|
||||
select HAVE_ARM_TWD if (!ARCH_MSM_SCORPIONMP && !EXYNOS4_MCT)
|
||||
help
|
||||
Enable support for local timers on SMP platforms, rather then the
|
||||
legacy IPI broadcast method. Local timers allows the system
|
||||
@ -1415,7 +1417,7 @@ source kernel/Kconfig.preempt
|
||||
config HZ
|
||||
int
|
||||
default 200 if ARCH_EBSA110 || ARCH_S3C2410 || ARCH_S5P64X0 || \
|
||||
ARCH_S5P6442 || ARCH_S5PV210 || ARCH_S5PV310
|
||||
ARCH_S5P6442 || ARCH_S5PV210 || ARCH_EXYNOS4
|
||||
default OMAP_32K_TIMER_HZ if ARCH_OMAP && OMAP_32K_TIMER
|
||||
default AT91_TIMER_HZ if ARCH_AT91
|
||||
default SHMOBILE_TIMER_HZ if ARCH_SHMOBILE
|
||||
|
@ -181,7 +181,7 @@ machine-$(CONFIG_ARCH_S5P64X0) := s5p64x0
|
||||
machine-$(CONFIG_ARCH_S5P6442) := s5p6442
|
||||
machine-$(CONFIG_ARCH_S5PC100) := s5pc100
|
||||
machine-$(CONFIG_ARCH_S5PV210) := s5pv210
|
||||
machine-$(CONFIG_ARCH_S5PV310) := s5pv310
|
||||
machine-$(CONFIG_ARCH_EXYNOS4) := exynos4
|
||||
machine-$(CONFIG_ARCH_SA1100) := sa1100
|
||||
machine-$(CONFIG_ARCH_SHARK) := shark
|
||||
machine-$(CONFIG_ARCH_SHMOBILE) := shmobile
|
||||
|
70
arch/arm/configs/exynos4_defconfig
Normal file
70
arch/arm/configs/exynos4_defconfig
Normal file
@ -0,0 +1,70 @@
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
CONFIG_ARCH_EXYNOS4=y
|
||||
CONFIG_S3C_LOWLEVEL_UART_PORT=1
|
||||
CONFIG_MACH_SMDKC210=y
|
||||
CONFIG_MACH_SMDKV310=y
|
||||
CONFIG_MACH_UNIVERSAL_C210=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=2
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_AEABI=y
|
||||
CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc mem=256M"
|
||||
CONFIG_VFP=y
|
||||
CONFIG_NEON=y
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
CONFIG_INPUT_TOUCHSCREEN=y
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_SAMSUNG=y
|
||||
CONFIG_SERIAL_SAMSUNG_CONSOLE=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_I2C=y
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_MFD_SUPPORT is not set
|
||||
# CONFIG_HID_SUPPORT is not set
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_MSDOS_FS=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_TMPFS_POSIX_ACL=y
|
||||
CONFIG_CRAMFS=y
|
||||
CONFIG_ROMFS_FS=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_BSD_DISKLABEL=y
|
||||
CONFIG_SOLARIS_X86_PARTITION=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ASCII=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
CONFIG_DEBUG_RT_MUTEXES=y
|
||||
CONFIG_DEBUG_SPINLOCK=y
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
CONFIG_DEBUG_SPINLOCK_SLEEP=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||
CONFIG_DEBUG_USER=y
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
CONFIG_DEBUG_LL=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_DEBUG_S3C_UART=1
|
||||
CONFIG_CRC_CCITT=y
|
@ -24,6 +24,7 @@ CONFIG_MACH_OPENRD_ULTIMATE=y
|
||||
CONFIG_MACH_NETSPACE_V2=y
|
||||
CONFIG_MACH_INETSPACE_V2=y
|
||||
CONFIG_MACH_NETSPACE_MAX_V2=y
|
||||
CONFIG_MACH_D2NET_V2=y
|
||||
CONFIG_MACH_NET2BIG_V2=y
|
||||
CONFIG_MACH_NET5BIG_V2=y
|
||||
CONFIG_MACH_T5325=y
|
||||
|
@ -110,7 +110,7 @@ CONFIG_MMC=y
|
||||
CONFIG_MMC_BLOCK=m
|
||||
CONFIG_MMC_SDHCI=m
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=m
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_INTF_DEV_UIE_EMUL=y
|
||||
CONFIG_EXT2_FS=y
|
||||
|
@ -10,6 +10,8 @@ CONFIG_S3C_BOOT_ERROR_RESET=y
|
||||
CONFIG_S3C_LOWLEVEL_UART_PORT=1
|
||||
CONFIG_MACH_SMDK6440=y
|
||||
CONFIG_MACH_SMDK6450=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_CPU_32v6K=y
|
||||
CONFIG_AEABI=y
|
||||
CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x20800000,8M console=ttySAC1,115200 init=/linuxrc"
|
||||
|
@ -13,6 +13,8 @@ CONFIG_MACH_AQUILA=y
|
||||
CONFIG_MACH_GONI=y
|
||||
CONFIG_MACH_SMDKC110=y
|
||||
CONFIG_MACH_SMDKV210=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_VMSPLIT_2G=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_AEABI=y
|
||||
|
@ -50,6 +50,9 @@ static inline void crash_setup_regs(struct pt_regs *newregs,
|
||||
}
|
||||
}
|
||||
|
||||
/* Function pointer to optional machine-specific reinitialization */
|
||||
extern void (*kexec_reinit)(void);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* CONFIG_KEXEC */
|
||||
|
@ -12,11 +12,25 @@
|
||||
#ifndef __ARM_PMU_H__
|
||||
#define __ARM_PMU_H__
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
enum arm_pmu_type {
|
||||
ARM_PMU_DEVICE_CPU = 0,
|
||||
ARM_NUM_PMU_DEVICES,
|
||||
};
|
||||
|
||||
/*
|
||||
* struct arm_pmu_platdata - ARM PMU platform data
|
||||
*
|
||||
* @handle_irq: an optional handler which will be called from the interrupt and
|
||||
* passed the address of the low level handler, and can be used to implement
|
||||
* any platform specific handling before or after calling it.
|
||||
*/
|
||||
struct arm_pmu_platdata {
|
||||
irqreturn_t (*handle_irq)(int irq, void *dev,
|
||||
irq_handler_t pmu_handler);
|
||||
};
|
||||
|
||||
#ifdef CONFIG_CPU_HAS_PMU
|
||||
|
||||
/**
|
||||
|
@ -75,6 +75,11 @@ void machine_crash_shutdown(struct pt_regs *regs)
|
||||
printk(KERN_INFO "Loading crashdump kernel...\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Function pointer to optional machine-specific reinitialization
|
||||
*/
|
||||
void (*kexec_reinit)(void);
|
||||
|
||||
void machine_kexec(struct kimage *image)
|
||||
{
|
||||
unsigned long page_list;
|
||||
@ -104,6 +109,8 @@ void machine_kexec(struct kimage *image)
|
||||
(unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE);
|
||||
printk(KERN_INFO "Bye!\n");
|
||||
|
||||
if (kexec_reinit)
|
||||
kexec_reinit();
|
||||
local_irq_disable();
|
||||
local_fiq_disable();
|
||||
setup_mm_for_reboot(0); /* mode is not used, so just pass 0*/
|
||||
|
@ -377,9 +377,18 @@ validate_group(struct perf_event *event)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t armpmu_platform_irq(int irq, void *dev)
|
||||
{
|
||||
struct arm_pmu_platdata *plat = dev_get_platdata(&pmu_device->dev);
|
||||
|
||||
return plat->handle_irq(irq, dev, armpmu->handle_irq);
|
||||
}
|
||||
|
||||
static int
|
||||
armpmu_reserve_hardware(void)
|
||||
{
|
||||
struct arm_pmu_platdata *plat;
|
||||
irq_handler_t handle_irq;
|
||||
int i, err = -ENODEV, irq;
|
||||
|
||||
pmu_device = reserve_pmu(ARM_PMU_DEVICE_CPU);
|
||||
@ -390,6 +399,12 @@ armpmu_reserve_hardware(void)
|
||||
|
||||
init_pmu(ARM_PMU_DEVICE_CPU);
|
||||
|
||||
plat = dev_get_platdata(&pmu_device->dev);
|
||||
if (plat && plat->handle_irq)
|
||||
handle_irq = armpmu_platform_irq;
|
||||
else
|
||||
handle_irq = armpmu->handle_irq;
|
||||
|
||||
if (pmu_device->num_resources < 1) {
|
||||
pr_err("no irqs for PMUs defined\n");
|
||||
return -ENODEV;
|
||||
@ -400,7 +415,7 @@ armpmu_reserve_hardware(void)
|
||||
if (irq < 0)
|
||||
continue;
|
||||
|
||||
err = request_irq(irq, armpmu->handle_irq,
|
||||
err = request_irq(irq, handle_irq,
|
||||
IRQF_DISABLED | IRQF_NOBALANCING,
|
||||
"armpmu", NULL);
|
||||
if (err) {
|
||||
|
@ -20,6 +20,8 @@
|
||||
#include <linux/i2c/at24.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/flash.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -30,6 +32,7 @@
|
||||
#include <mach/da8xx.h>
|
||||
#include <mach/usb.h>
|
||||
#include <mach/aemif.h>
|
||||
#include <mach/spi.h>
|
||||
|
||||
#define DA830_EVM_PHY_ID ""
|
||||
/*
|
||||
@ -534,6 +537,64 @@ static struct edma_rsv_info da830_edma_rsv[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition da830evm_spiflash_part[] = {
|
||||
[0] = {
|
||||
.name = "DSP-UBL",
|
||||
.offset = 0,
|
||||
.size = SZ_8K,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
[1] = {
|
||||
.name = "ARM-UBL",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = SZ_16K + SZ_8K,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
[2] = {
|
||||
.name = "U-Boot",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = SZ_256K - SZ_32K,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
[3] = {
|
||||
.name = "U-Boot-Environment",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = SZ_16K,
|
||||
.mask_flags = 0,
|
||||
},
|
||||
[4] = {
|
||||
.name = "Kernel",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
.mask_flags = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static struct flash_platform_data da830evm_spiflash_data = {
|
||||
.name = "m25p80",
|
||||
.parts = da830evm_spiflash_part,
|
||||
.nr_parts = ARRAY_SIZE(da830evm_spiflash_part),
|
||||
.type = "w25x32",
|
||||
};
|
||||
|
||||
static struct davinci_spi_config da830evm_spiflash_cfg = {
|
||||
.io_type = SPI_IO_TYPE_DMA,
|
||||
.c2tdelay = 8,
|
||||
.t2cdelay = 8,
|
||||
};
|
||||
|
||||
static struct spi_board_info da830evm_spi_info[] = {
|
||||
{
|
||||
.modalias = "m25p80",
|
||||
.platform_data = &da830evm_spiflash_data,
|
||||
.controller_data = &da830evm_spiflash_cfg,
|
||||
.mode = SPI_MODE_0,
|
||||
.max_speed_hz = 30000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static __init void da830_evm_init(void)
|
||||
{
|
||||
struct davinci_soc_info *soc_info = &davinci_soc_info;
|
||||
@ -590,6 +651,12 @@ static __init void da830_evm_init(void)
|
||||
ret = da8xx_register_rtc();
|
||||
if (ret)
|
||||
pr_warning("da830_evm_init: rtc setup failed: %d\n", ret);
|
||||
|
||||
ret = da8xx_register_spi(0, da830evm_spi_info,
|
||||
ARRAY_SIZE(da830evm_spi_info));
|
||||
if (ret)
|
||||
pr_warning("da830_evm_init: spi 0 registration failed: %d\n",
|
||||
ret);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SERIAL_8250_CONSOLE
|
||||
|
@ -29,6 +29,8 @@
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/regulator/tps6507x.h>
|
||||
#include <linux/input/tps6507x-ts.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/flash.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -38,6 +40,7 @@
|
||||
#include <mach/nand.h>
|
||||
#include <mach/mux.h>
|
||||
#include <mach/aemif.h>
|
||||
#include <mach/spi.h>
|
||||
|
||||
#define DA850_EVM_PHY_ID "0:00"
|
||||
#define DA850_LCD_PWR_PIN GPIO_TO_PIN(2, 8)
|
||||
@ -48,6 +51,70 @@
|
||||
|
||||
#define DA850_MII_MDIO_CLKEN_PIN GPIO_TO_PIN(2, 6)
|
||||
|
||||
static struct mtd_partition da850evm_spiflash_part[] = {
|
||||
[0] = {
|
||||
.name = "UBL",
|
||||
.offset = 0,
|
||||
.size = SZ_64K,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
[1] = {
|
||||
.name = "U-Boot",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = SZ_512K,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
[2] = {
|
||||
.name = "U-Boot-Env",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = SZ_64K,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
[3] = {
|
||||
.name = "Kernel",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = SZ_2M + SZ_512K,
|
||||
.mask_flags = 0,
|
||||
},
|
||||
[4] = {
|
||||
.name = "Filesystem",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = SZ_4M,
|
||||
.mask_flags = 0,
|
||||
},
|
||||
[5] = {
|
||||
.name = "MAC-Address",
|
||||
.offset = SZ_8M - SZ_64K,
|
||||
.size = SZ_64K,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct flash_platform_data da850evm_spiflash_data = {
|
||||
.name = "m25p80",
|
||||
.parts = da850evm_spiflash_part,
|
||||
.nr_parts = ARRAY_SIZE(da850evm_spiflash_part),
|
||||
.type = "m25p64",
|
||||
};
|
||||
|
||||
static struct davinci_spi_config da850evm_spiflash_cfg = {
|
||||
.io_type = SPI_IO_TYPE_DMA,
|
||||
.c2tdelay = 8,
|
||||
.t2cdelay = 8,
|
||||
};
|
||||
|
||||
static struct spi_board_info da850evm_spi_info[] = {
|
||||
{
|
||||
.modalias = "m25p80",
|
||||
.platform_data = &da850evm_spiflash_data,
|
||||
.controller_data = &da850evm_spiflash_cfg,
|
||||
.mode = SPI_MODE_0,
|
||||
.max_speed_hz = 30000000,
|
||||
.bus_num = 1,
|
||||
.chip_select = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition da850_evm_norflash_partition[] = {
|
||||
{
|
||||
.name = "bootloaders + env",
|
||||
@ -231,8 +298,6 @@ static const short da850_evm_nor_pins[] = {
|
||||
-1
|
||||
};
|
||||
|
||||
static u32 ui_card_detected;
|
||||
|
||||
#if defined(CONFIG_MMC_DAVINCI) || \
|
||||
defined(CONFIG_MMC_DAVINCI_MODULE)
|
||||
#define HAS_MMC 1
|
||||
@ -244,7 +309,7 @@ static inline void da850_evm_setup_nor_nand(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (ui_card_detected & !HAS_MMC) {
|
||||
if (!HAS_MMC) {
|
||||
ret = davinci_cfg_reg_list(da850_evm_nand_pins);
|
||||
if (ret)
|
||||
pr_warning("da850_evm_init: nand mux setup failed: "
|
||||
@ -394,7 +459,6 @@ static int da850_evm_ui_expander_setup(struct i2c_client *client, unsigned gpio,
|
||||
goto exp_setup_keys_fail;
|
||||
}
|
||||
|
||||
ui_card_detected = 1;
|
||||
pr_info("DA850/OMAP-L138 EVM UI card detected\n");
|
||||
|
||||
da850_evm_setup_nor_nand();
|
||||
@ -664,6 +728,13 @@ static struct snd_platform_data da850_evm_snd_data = {
|
||||
.rxnumevt = 1,
|
||||
};
|
||||
|
||||
static const short da850_evm_mcasp_pins[] __initconst = {
|
||||
DA850_AHCLKX, DA850_ACLKX, DA850_AFSX,
|
||||
DA850_AHCLKR, DA850_ACLKR, DA850_AFSR, DA850_AMUTE,
|
||||
DA850_AXR_11, DA850_AXR_12,
|
||||
-1
|
||||
};
|
||||
|
||||
static int da850_evm_mmc_get_ro(int index)
|
||||
{
|
||||
return gpio_get_value(DA850_MMCSD_WP_PIN);
|
||||
@ -683,6 +754,13 @@ static struct davinci_mmc_config da850_mmc_config = {
|
||||
.version = MMC_CTLR_VERSION_2,
|
||||
};
|
||||
|
||||
static const short da850_evm_mmcsd0_pins[] __initconst = {
|
||||
DA850_MMCSD0_DAT_0, DA850_MMCSD0_DAT_1, DA850_MMCSD0_DAT_2,
|
||||
DA850_MMCSD0_DAT_3, DA850_MMCSD0_CLK, DA850_MMCSD0_CMD,
|
||||
DA850_GPIO4_0, DA850_GPIO4_1,
|
||||
-1
|
||||
};
|
||||
|
||||
static void da850_panel_power_ctrl(int val)
|
||||
{
|
||||
/* lcd backlight */
|
||||
@ -1070,7 +1148,7 @@ static __init void da850_evm_init(void)
|
||||
ret);
|
||||
|
||||
if (HAS_MMC) {
|
||||
ret = davinci_cfg_reg_list(da850_mmcsd0_pins);
|
||||
ret = davinci_cfg_reg_list(da850_evm_mmcsd0_pins);
|
||||
if (ret)
|
||||
pr_warning("da850_evm_init: mmcsd0 mux setup failed:"
|
||||
" %d\n", ret);
|
||||
@ -1106,7 +1184,7 @@ static __init void da850_evm_init(void)
|
||||
__raw_writel(0, IO_ADDRESS(DA8XX_UART1_BASE) + 0x30);
|
||||
__raw_writel(0, IO_ADDRESS(DA8XX_UART0_BASE) + 0x30);
|
||||
|
||||
ret = davinci_cfg_reg_list(da850_mcasp_pins);
|
||||
ret = davinci_cfg_reg_list(da850_evm_mcasp_pins);
|
||||
if (ret)
|
||||
pr_warning("da850_evm_init: mcasp mux setup failed: %d\n",
|
||||
ret);
|
||||
@ -1153,6 +1231,12 @@ static __init void da850_evm_init(void)
|
||||
if (ret)
|
||||
pr_warning("da850_evm_init: suspend registration failed: %d\n",
|
||||
ret);
|
||||
|
||||
ret = da8xx_register_spi(1, da850evm_spi_info,
|
||||
ARRAY_SIZE(da850evm_spi_info));
|
||||
if (ret)
|
||||
pr_warning("da850_evm_init: spi 1 registration failed: %d\n",
|
||||
ret);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SERIAL_8250_CONSOLE
|
||||
|
@ -440,11 +440,6 @@ evm_u35_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
|
||||
gpio_request(gpio + 7, "nCF_SEL");
|
||||
gpio_direction_output(gpio + 7, 1);
|
||||
|
||||
/* irlml6401 switches over 1A, in under 8 msec;
|
||||
* now it can be managed by nDRV_VBUS ...
|
||||
*/
|
||||
davinci_setup_usb(1000, 8);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -705,6 +700,9 @@ static __init void davinci_evm_init(void)
|
||||
davinci_serial_init(&uart_config);
|
||||
dm644x_init_asp(&dm644x_evm_snd_data);
|
||||
|
||||
/* irlml6401 switches over 1A, in under 8 msec */
|
||||
davinci_setup_usb(1000, 8);
|
||||
|
||||
soc_info->emac_pdata->phy_id = DM644X_EVM_PHY_ID;
|
||||
/* Register the fixup for PHY on DaVinci */
|
||||
phy_register_fixup_for_uid(LXT971_PHY_ID, LXT971_PHY_MASK,
|
||||
|
@ -17,6 +17,8 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c/at24.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/flash.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -25,6 +27,7 @@
|
||||
#include <mach/da8xx.h>
|
||||
#include <mach/nand.h>
|
||||
#include <mach/mux.h>
|
||||
#include <mach/spi.h>
|
||||
|
||||
#define MITYOMAPL138_PHY_ID "0:03"
|
||||
|
||||
@ -44,38 +47,109 @@ struct factory_config {
|
||||
|
||||
static struct factory_config factory_config;
|
||||
|
||||
struct part_no_info {
|
||||
const char *part_no; /* part number string of interest */
|
||||
int max_freq; /* khz */
|
||||
};
|
||||
|
||||
static struct part_no_info mityomapl138_pn_info[] = {
|
||||
{
|
||||
.part_no = "L138-C",
|
||||
.max_freq = 300000,
|
||||
},
|
||||
{
|
||||
.part_no = "L138-D",
|
||||
.max_freq = 375000,
|
||||
},
|
||||
{
|
||||
.part_no = "L138-F",
|
||||
.max_freq = 456000,
|
||||
},
|
||||
{
|
||||
.part_no = "1808-C",
|
||||
.max_freq = 300000,
|
||||
},
|
||||
{
|
||||
.part_no = "1808-D",
|
||||
.max_freq = 375000,
|
||||
},
|
||||
{
|
||||
.part_no = "1808-F",
|
||||
.max_freq = 456000,
|
||||
},
|
||||
{
|
||||
.part_no = "1810-D",
|
||||
.max_freq = 375000,
|
||||
},
|
||||
};
|
||||
|
||||
#ifdef CONFIG_CPU_FREQ
|
||||
static void mityomapl138_cpufreq_init(const char *partnum)
|
||||
{
|
||||
int i, ret;
|
||||
|
||||
for (i = 0; partnum && i < ARRAY_SIZE(mityomapl138_pn_info); i++) {
|
||||
/*
|
||||
* the part number has additional characters beyond what is
|
||||
* stored in the table. This information is not needed for
|
||||
* determining the speed grade, and would require several
|
||||
* more table entries. Only check the first N characters
|
||||
* for a match.
|
||||
*/
|
||||
if (!strncmp(partnum, mityomapl138_pn_info[i].part_no,
|
||||
strlen(mityomapl138_pn_info[i].part_no))) {
|
||||
da850_max_speed = mityomapl138_pn_info[i].max_freq;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ret = da850_register_cpufreq("pll0_sysclk3");
|
||||
if (ret)
|
||||
pr_warning("cpufreq registration failed: %d\n", ret);
|
||||
}
|
||||
#else
|
||||
static void mityomapl138_cpufreq_init(const char *partnum) { }
|
||||
#endif
|
||||
|
||||
static void read_factory_config(struct memory_accessor *a, void *context)
|
||||
{
|
||||
int ret;
|
||||
const char *partnum = NULL;
|
||||
struct davinci_soc_info *soc_info = &davinci_soc_info;
|
||||
|
||||
ret = a->read(a, (char *)&factory_config, 0, sizeof(factory_config));
|
||||
if (ret != sizeof(struct factory_config)) {
|
||||
pr_warning("MityOMAPL138: Read Factory Config Failed: %d\n",
|
||||
ret);
|
||||
return;
|
||||
goto bad_config;
|
||||
}
|
||||
|
||||
if (factory_config.magic != FACTORY_CONFIG_MAGIC) {
|
||||
pr_warning("MityOMAPL138: Factory Config Magic Wrong (%X)\n",
|
||||
factory_config.magic);
|
||||
return;
|
||||
goto bad_config;
|
||||
}
|
||||
|
||||
if (factory_config.version != FACTORY_CONFIG_VERSION) {
|
||||
pr_warning("MityOMAPL138: Factory Config Version Wrong (%X)\n",
|
||||
factory_config.version);
|
||||
return;
|
||||
goto bad_config;
|
||||
}
|
||||
|
||||
pr_info("MityOMAPL138: Found MAC = %pM\n", factory_config.mac);
|
||||
pr_info("MityOMAPL138: Part Number = %s\n", factory_config.partnum);
|
||||
if (is_valid_ether_addr(factory_config.mac))
|
||||
memcpy(soc_info->emac_pdata->mac_addr,
|
||||
factory_config.mac, ETH_ALEN);
|
||||
else
|
||||
pr_warning("MityOMAPL138: Invalid MAC found "
|
||||
"in factory config block\n");
|
||||
|
||||
partnum = factory_config.partnum;
|
||||
pr_info("MityOMAPL138: Part Number = %s\n", partnum);
|
||||
|
||||
bad_config:
|
||||
/* default maximum speed is valid for all platforms */
|
||||
mityomapl138_cpufreq_init(partnum);
|
||||
}
|
||||
|
||||
static struct at24_platform_data mityomapl138_fd_chip = {
|
||||
@ -222,6 +296,82 @@ static int __init pmic_tps65023_init(void)
|
||||
ARRAY_SIZE(mityomap_tps65023_info));
|
||||
}
|
||||
|
||||
/*
|
||||
* SPI Devices:
|
||||
* SPI1_CS0: 8M Flash ST-M25P64-VME6G
|
||||
*/
|
||||
static struct mtd_partition spi_flash_partitions[] = {
|
||||
[0] = {
|
||||
.name = "ubl",
|
||||
.offset = 0,
|
||||
.size = SZ_64K,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
[1] = {
|
||||
.name = "u-boot",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = SZ_512K,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
[2] = {
|
||||
.name = "u-boot-env",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = SZ_64K,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
[3] = {
|
||||
.name = "periph-config",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = SZ_64K,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
[4] = {
|
||||
.name = "reserved",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = SZ_256K + SZ_64K,
|
||||
},
|
||||
[5] = {
|
||||
.name = "kernel",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = SZ_2M + SZ_1M,
|
||||
},
|
||||
[6] = {
|
||||
.name = "fpga",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = SZ_2M,
|
||||
},
|
||||
[7] = {
|
||||
.name = "spare",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct flash_platform_data mityomapl138_spi_flash_data = {
|
||||
.name = "m25p80",
|
||||
.parts = spi_flash_partitions,
|
||||
.nr_parts = ARRAY_SIZE(spi_flash_partitions),
|
||||
.type = "m24p64",
|
||||
};
|
||||
|
||||
static struct davinci_spi_config spi_eprom_config = {
|
||||
.io_type = SPI_IO_TYPE_DMA,
|
||||
.c2tdelay = 8,
|
||||
.t2cdelay = 8,
|
||||
};
|
||||
|
||||
static struct spi_board_info mityomapl138_spi_flash_info[] = {
|
||||
{
|
||||
.modalias = "m25p80",
|
||||
.platform_data = &mityomapl138_spi_flash_data,
|
||||
.controller_data = &spi_eprom_config,
|
||||
.mode = SPI_MODE_0,
|
||||
.max_speed_hz = 30000000,
|
||||
.bus_num = 1,
|
||||
.chip_select = 0,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* MityDSP-L138 includes a 256 MByte large-page NAND flash
|
||||
* (128K blocks).
|
||||
@ -377,16 +527,17 @@ static void __init mityomapl138_init(void)
|
||||
|
||||
mityomapl138_setup_nand();
|
||||
|
||||
ret = da8xx_register_spi(1, mityomapl138_spi_flash_info,
|
||||
ARRAY_SIZE(mityomapl138_spi_flash_info));
|
||||
if (ret)
|
||||
pr_warning("spi 1 registration failed: %d\n", ret);
|
||||
|
||||
mityomapl138_config_emac();
|
||||
|
||||
ret = da8xx_register_rtc();
|
||||
if (ret)
|
||||
pr_warning("rtc setup failed: %d\n", ret);
|
||||
|
||||
ret = da850_register_cpufreq("pll0_sysclk3");
|
||||
if (ret)
|
||||
pr_warning("cpufreq registration failed: %d\n", ret);
|
||||
|
||||
ret = da8xx_register_cpuidle();
|
||||
if (ret)
|
||||
pr_warning("cpuidle registration failed: %d\n", ret);
|
||||
|
@ -19,6 +19,279 @@
|
||||
|
||||
#include <mach/cp_intc.h>
|
||||
#include <mach/da8xx.h>
|
||||
#include <mach/mux.h>
|
||||
|
||||
#define HAWKBOARD_PHY_ID "0:07"
|
||||
#define DA850_HAWK_MMCSD_CD_PIN GPIO_TO_PIN(3, 12)
|
||||
#define DA850_HAWK_MMCSD_WP_PIN GPIO_TO_PIN(3, 13)
|
||||
|
||||
#define DA850_USB1_VBUS_PIN GPIO_TO_PIN(2, 4)
|
||||
#define DA850_USB1_OC_PIN GPIO_TO_PIN(6, 13)
|
||||
|
||||
static short omapl138_hawk_mii_pins[] __initdata = {
|
||||
DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3,
|
||||
DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER,
|
||||
DA850_MII_CRS, DA850_MII_RXCLK, DA850_MII_RXDV, DA850_MII_RXD_3,
|
||||
DA850_MII_RXD_2, DA850_MII_RXD_1, DA850_MII_RXD_0, DA850_MDIO_CLK,
|
||||
DA850_MDIO_D,
|
||||
-1
|
||||
};
|
||||
|
||||
static __init void omapl138_hawk_config_emac(void)
|
||||
{
|
||||
void __iomem *cfgchip3 = DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG);
|
||||
int ret;
|
||||
u32 val;
|
||||
struct davinci_soc_info *soc_info = &davinci_soc_info;
|
||||
|
||||
val = __raw_readl(cfgchip3);
|
||||
val &= ~BIT(8);
|
||||
ret = davinci_cfg_reg_list(omapl138_hawk_mii_pins);
|
||||
if (ret) {
|
||||
pr_warning("%s: cpgmac/mii mux setup failed: %d\n",
|
||||
__func__, ret);
|
||||
return;
|
||||
}
|
||||
|
||||
/* configure the CFGCHIP3 register for MII */
|
||||
__raw_writel(val, cfgchip3);
|
||||
pr_info("EMAC: MII PHY configured\n");
|
||||
|
||||
soc_info->emac_pdata->phy_id = HAWKBOARD_PHY_ID;
|
||||
|
||||
ret = da8xx_register_emac();
|
||||
if (ret)
|
||||
pr_warning("%s: emac registration failed: %d\n",
|
||||
__func__, ret);
|
||||
}
|
||||
|
||||
/*
|
||||
* The following EDMA channels/slots are not being used by drivers (for
|
||||
* example: Timer, GPIO, UART events etc) on da850/omap-l138 EVM/Hawkboard,
|
||||
* hence they are being reserved for codecs on the DSP side.
|
||||
*/
|
||||
static const s16 da850_dma0_rsv_chans[][2] = {
|
||||
/* (offset, number) */
|
||||
{ 8, 6},
|
||||
{24, 4},
|
||||
{30, 2},
|
||||
{-1, -1}
|
||||
};
|
||||
|
||||
static const s16 da850_dma0_rsv_slots[][2] = {
|
||||
/* (offset, number) */
|
||||
{ 8, 6},
|
||||
{24, 4},
|
||||
{30, 50},
|
||||
{-1, -1}
|
||||
};
|
||||
|
||||
static const s16 da850_dma1_rsv_chans[][2] = {
|
||||
/* (offset, number) */
|
||||
{ 0, 28},
|
||||
{30, 2},
|
||||
{-1, -1}
|
||||
};
|
||||
|
||||
static const s16 da850_dma1_rsv_slots[][2] = {
|
||||
/* (offset, number) */
|
||||
{ 0, 28},
|
||||
{30, 90},
|
||||
{-1, -1}
|
||||
};
|
||||
|
||||
static struct edma_rsv_info da850_edma_cc0_rsv = {
|
||||
.rsv_chans = da850_dma0_rsv_chans,
|
||||
.rsv_slots = da850_dma0_rsv_slots,
|
||||
};
|
||||
|
||||
static struct edma_rsv_info da850_edma_cc1_rsv = {
|
||||
.rsv_chans = da850_dma1_rsv_chans,
|
||||
.rsv_slots = da850_dma1_rsv_slots,
|
||||
};
|
||||
|
||||
static struct edma_rsv_info *da850_edma_rsv[2] = {
|
||||
&da850_edma_cc0_rsv,
|
||||
&da850_edma_cc1_rsv,
|
||||
};
|
||||
|
||||
static const short hawk_mmcsd0_pins[] = {
|
||||
DA850_MMCSD0_DAT_0, DA850_MMCSD0_DAT_1, DA850_MMCSD0_DAT_2,
|
||||
DA850_MMCSD0_DAT_3, DA850_MMCSD0_CLK, DA850_MMCSD0_CMD,
|
||||
DA850_GPIO3_12, DA850_GPIO3_13,
|
||||
-1
|
||||
};
|
||||
|
||||
static int da850_hawk_mmc_get_ro(int index)
|
||||
{
|
||||
return gpio_get_value(DA850_HAWK_MMCSD_WP_PIN);
|
||||
}
|
||||
|
||||
static int da850_hawk_mmc_get_cd(int index)
|
||||
{
|
||||
return !gpio_get_value(DA850_HAWK_MMCSD_CD_PIN);
|
||||
}
|
||||
|
||||
static struct davinci_mmc_config da850_mmc_config = {
|
||||
.get_ro = da850_hawk_mmc_get_ro,
|
||||
.get_cd = da850_hawk_mmc_get_cd,
|
||||
.wires = 4,
|
||||
.max_freq = 50000000,
|
||||
.caps = MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
|
||||
.version = MMC_CTLR_VERSION_2,
|
||||
};
|
||||
|
||||
static __init void omapl138_hawk_mmc_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = davinci_cfg_reg_list(hawk_mmcsd0_pins);
|
||||
if (ret) {
|
||||
pr_warning("%s: MMC/SD0 mux setup failed: %d\n",
|
||||
__func__, ret);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = gpio_request_one(DA850_HAWK_MMCSD_CD_PIN,
|
||||
GPIOF_DIR_IN, "MMC CD");
|
||||
if (ret < 0) {
|
||||
pr_warning("%s: can not open GPIO %d\n",
|
||||
__func__, DA850_HAWK_MMCSD_CD_PIN);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = gpio_request_one(DA850_HAWK_MMCSD_WP_PIN,
|
||||
GPIOF_DIR_IN, "MMC WP");
|
||||
if (ret < 0) {
|
||||
pr_warning("%s: can not open GPIO %d\n",
|
||||
__func__, DA850_HAWK_MMCSD_WP_PIN);
|
||||
goto mmc_setup_wp_fail;
|
||||
}
|
||||
|
||||
ret = da8xx_register_mmcsd0(&da850_mmc_config);
|
||||
if (ret) {
|
||||
pr_warning("%s: MMC/SD0 registration failed: %d\n",
|
||||
__func__, ret);
|
||||
goto mmc_setup_mmcsd_fail;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
mmc_setup_mmcsd_fail:
|
||||
gpio_free(DA850_HAWK_MMCSD_WP_PIN);
|
||||
mmc_setup_wp_fail:
|
||||
gpio_free(DA850_HAWK_MMCSD_CD_PIN);
|
||||
}
|
||||
|
||||
static irqreturn_t omapl138_hawk_usb_ocic_irq(int irq, void *dev_id);
|
||||
static da8xx_ocic_handler_t hawk_usb_ocic_handler;
|
||||
|
||||
static const short da850_hawk_usb11_pins[] = {
|
||||
DA850_GPIO2_4, DA850_GPIO6_13,
|
||||
-1
|
||||
};
|
||||
|
||||
static int hawk_usb_set_power(unsigned port, int on)
|
||||
{
|
||||
gpio_set_value(DA850_USB1_VBUS_PIN, on);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hawk_usb_get_power(unsigned port)
|
||||
{
|
||||
return gpio_get_value(DA850_USB1_VBUS_PIN);
|
||||
}
|
||||
|
||||
static int hawk_usb_get_oci(unsigned port)
|
||||
{
|
||||
return !gpio_get_value(DA850_USB1_OC_PIN);
|
||||
}
|
||||
|
||||
static int hawk_usb_ocic_notify(da8xx_ocic_handler_t handler)
|
||||
{
|
||||
int irq = gpio_to_irq(DA850_USB1_OC_PIN);
|
||||
int error = 0;
|
||||
|
||||
if (handler != NULL) {
|
||||
hawk_usb_ocic_handler = handler;
|
||||
|
||||
error = request_irq(irq, omapl138_hawk_usb_ocic_irq,
|
||||
IRQF_DISABLED | IRQF_TRIGGER_RISING |
|
||||
IRQF_TRIGGER_FALLING,
|
||||
"OHCI over-current indicator", NULL);
|
||||
if (error)
|
||||
pr_err("%s: could not request IRQ to watch "
|
||||
"over-current indicator changes\n", __func__);
|
||||
} else {
|
||||
free_irq(irq, NULL);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
static struct da8xx_ohci_root_hub omapl138_hawk_usb11_pdata = {
|
||||
.set_power = hawk_usb_set_power,
|
||||
.get_power = hawk_usb_get_power,
|
||||
.get_oci = hawk_usb_get_oci,
|
||||
.ocic_notify = hawk_usb_ocic_notify,
|
||||
/* TPS2087 switch @ 5V */
|
||||
.potpgt = (3 + 1) / 2, /* 3 ms max */
|
||||
};
|
||||
|
||||
static irqreturn_t omapl138_hawk_usb_ocic_irq(int irq, void *dev_id)
|
||||
{
|
||||
hawk_usb_ocic_handler(&omapl138_hawk_usb11_pdata, 1);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static __init void omapl138_hawk_usb_init(void)
|
||||
{
|
||||
int ret;
|
||||
u32 cfgchip2;
|
||||
|
||||
ret = davinci_cfg_reg_list(da850_hawk_usb11_pins);
|
||||
if (ret) {
|
||||
pr_warning("%s: USB 1.1 PinMux setup failed: %d\n",
|
||||
__func__, ret);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Setup the Ref. clock frequency for the HAWK at 24 MHz. */
|
||||
|
||||
cfgchip2 = __raw_readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
|
||||
cfgchip2 &= ~CFGCHIP2_REFFREQ;
|
||||
cfgchip2 |= CFGCHIP2_REFFREQ_24MHZ;
|
||||
__raw_writel(cfgchip2, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
|
||||
|
||||
ret = gpio_request_one(DA850_USB1_VBUS_PIN,
|
||||
GPIOF_DIR_OUT, "USB1 VBUS");
|
||||
if (ret < 0) {
|
||||
pr_err("%s: failed to request GPIO for USB 1.1 port "
|
||||
"power control: %d\n", __func__, ret);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = gpio_request_one(DA850_USB1_OC_PIN,
|
||||
GPIOF_DIR_IN, "USB1 OC");
|
||||
if (ret < 0) {
|
||||
pr_err("%s: failed to request GPIO for USB 1.1 port "
|
||||
"over-current indicator: %d\n", __func__, ret);
|
||||
goto usb11_setup_oc_fail;
|
||||
}
|
||||
|
||||
ret = da8xx_register_usb11(&omapl138_hawk_usb11_pdata);
|
||||
if (ret) {
|
||||
pr_warning("%s: USB 1.1 registration failed: %d\n",
|
||||
__func__, ret);
|
||||
goto usb11_setup_fail;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
usb11_setup_fail:
|
||||
gpio_free(DA850_USB1_OC_PIN);
|
||||
usb11_setup_oc_fail:
|
||||
gpio_free(DA850_USB1_VBUS_PIN);
|
||||
}
|
||||
|
||||
static struct davinci_uart_config omapl138_hawk_uart_config __initdata = {
|
||||
.enabled_uarts = 0x7,
|
||||
@ -30,6 +303,17 @@ static __init void omapl138_hawk_init(void)
|
||||
|
||||
davinci_serial_init(&omapl138_hawk_uart_config);
|
||||
|
||||
omapl138_hawk_config_emac();
|
||||
|
||||
ret = da850_register_edma(da850_edma_rsv);
|
||||
if (ret)
|
||||
pr_warning("%s: EDMA registration failed: %d\n",
|
||||
__func__, ret);
|
||||
|
||||
omapl138_hawk_mmc_init();
|
||||
|
||||
omapl138_hawk_usb_init();
|
||||
|
||||
ret = da8xx_register_watchdog();
|
||||
if (ret)
|
||||
pr_warning("omapl138_hawk_init: "
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
@ -37,6 +38,7 @@
|
||||
|
||||
#define EVM_MMC_WP_GPIO 21
|
||||
#define EVM_MMC_CD_GPIO 24
|
||||
#define EVM_SPI_CS_GPIO 54
|
||||
|
||||
static int initialize_gpio(int gpio, char *desc)
|
||||
{
|
||||
@ -99,6 +101,12 @@ static const short uart1_pins[] __initdata = {
|
||||
-1
|
||||
};
|
||||
|
||||
static const short ssp_pins[] __initdata = {
|
||||
TNETV107X_SSP0_0, TNETV107X_SSP0_1, TNETV107X_SSP0_2,
|
||||
TNETV107X_SSP1_0, TNETV107X_SSP1_1, TNETV107X_SSP1_2,
|
||||
TNETV107X_SSP1_3, -1
|
||||
};
|
||||
|
||||
static struct mtd_partition nand_partitions[] = {
|
||||
/* bootloader (U-Boot, etc) in first 12 sectors */
|
||||
{
|
||||
@ -196,19 +204,68 @@ static struct matrix_keypad_platform_data keypad_config = {
|
||||
.no_autorepeat = 0,
|
||||
};
|
||||
|
||||
static void spi_select_device(int cs)
|
||||
{
|
||||
static int gpio;
|
||||
|
||||
if (!gpio) {
|
||||
int ret;
|
||||
ret = gpio_request(EVM_SPI_CS_GPIO, "spi chipsel");
|
||||
if (ret < 0) {
|
||||
pr_err("cannot open spi chipsel gpio\n");
|
||||
gpio = -ENOSYS;
|
||||
return;
|
||||
} else {
|
||||
gpio = EVM_SPI_CS_GPIO;
|
||||
gpio_direction_output(gpio, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (gpio < 0)
|
||||
return;
|
||||
|
||||
return gpio_set_value(gpio, cs ? 1 : 0);
|
||||
}
|
||||
|
||||
static struct ti_ssp_spi_data spi_master_data = {
|
||||
.num_cs = 2,
|
||||
.select = spi_select_device,
|
||||
.iosel = SSP_PIN_SEL(0, SSP_CLOCK) | SSP_PIN_SEL(1, SSP_DATA) |
|
||||
SSP_PIN_SEL(2, SSP_CHIPSEL) | SSP_PIN_SEL(3, SSP_IN) |
|
||||
SSP_INPUT_SEL(3),
|
||||
};
|
||||
|
||||
static struct ti_ssp_data ssp_config = {
|
||||
.out_clock = 250 * 1000,
|
||||
.dev_data = {
|
||||
[1] = {
|
||||
.dev_name = "ti-ssp-spi",
|
||||
.pdata = &spi_master_data,
|
||||
.pdata_size = sizeof(spi_master_data),
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct tnetv107x_device_info evm_device_info __initconst = {
|
||||
.serial_config = &serial_config,
|
||||
.mmc_config[1] = &mmc_config, /* controller 1 */
|
||||
.nand_config[0] = &nand_config, /* chip select 0 */
|
||||
.keypad_config = &keypad_config,
|
||||
.ssp_config = &ssp_config,
|
||||
};
|
||||
|
||||
static struct spi_board_info spi_info[] __initconst = {
|
||||
};
|
||||
|
||||
static __init void tnetv107x_evm_board_init(void)
|
||||
{
|
||||
davinci_cfg_reg_list(sdio1_pins);
|
||||
davinci_cfg_reg_list(uart1_pins);
|
||||
davinci_cfg_reg_list(ssp_pins);
|
||||
|
||||
tnetv107x_devices_init(&evm_device_info);
|
||||
|
||||
spi_register_board_info(spi_info, ARRAY_SIZE(spi_info));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SERIAL_8250_CONSOLE
|
||||
|
@ -148,7 +148,7 @@ static struct clk scr2_ss_clk = {
|
||||
static struct clk dmax_clk = {
|
||||
.name = "dmax",
|
||||
.parent = &pll0_sysclk2,
|
||||
.lpsc = DA8XX_LPSC0_DMAX,
|
||||
.lpsc = DA8XX_LPSC0_PRUSS,
|
||||
.flags = ALWAYS_ENABLED,
|
||||
};
|
||||
|
||||
@ -397,8 +397,8 @@ static struct clk_lookup da830_clks[] = {
|
||||
CLK(NULL, "uart0", &uart0_clk),
|
||||
CLK(NULL, "uart1", &uart1_clk),
|
||||
CLK(NULL, "uart2", &uart2_clk),
|
||||
CLK("dm_spi.0", NULL, &spi0_clk),
|
||||
CLK("dm_spi.1", NULL, &spi1_clk),
|
||||
CLK("spi_davinci.0", NULL, &spi0_clk),
|
||||
CLK("spi_davinci.1", NULL, &spi1_clk),
|
||||
CLK(NULL, "ecap0", &ecap0_clk),
|
||||
CLK(NULL, "ecap1", &ecap1_clk),
|
||||
CLK(NULL, "ecap2", &ecap2_clk),
|
||||
|
@ -345,6 +345,34 @@ static struct clk aemif_clk = {
|
||||
.flags = ALWAYS_ENABLED,
|
||||
};
|
||||
|
||||
static struct clk usb11_clk = {
|
||||
.name = "usb11",
|
||||
.parent = &pll0_sysclk4,
|
||||
.lpsc = DA8XX_LPSC1_USB11,
|
||||
.gpsc = 1,
|
||||
};
|
||||
|
||||
static struct clk usb20_clk = {
|
||||
.name = "usb20",
|
||||
.parent = &pll0_sysclk2,
|
||||
.lpsc = DA8XX_LPSC1_USB20,
|
||||
.gpsc = 1,
|
||||
};
|
||||
|
||||
static struct clk spi0_clk = {
|
||||
.name = "spi0",
|
||||
.parent = &pll0_sysclk2,
|
||||
.lpsc = DA8XX_LPSC0_SPI0,
|
||||
};
|
||||
|
||||
static struct clk spi1_clk = {
|
||||
.name = "spi1",
|
||||
.parent = &pll0_sysclk2,
|
||||
.lpsc = DA8XX_LPSC1_SPI1,
|
||||
.gpsc = 1,
|
||||
.flags = DA850_CLK_ASYNC3,
|
||||
};
|
||||
|
||||
static struct clk_lookup da850_clks[] = {
|
||||
CLK(NULL, "ref", &ref_clk),
|
||||
CLK(NULL, "pll0", &pll0_clk),
|
||||
@ -387,6 +415,10 @@ static struct clk_lookup da850_clks[] = {
|
||||
CLK("davinci_mmc.0", NULL, &mmcsd0_clk),
|
||||
CLK("davinci_mmc.1", NULL, &mmcsd1_clk),
|
||||
CLK(NULL, "aemif", &aemif_clk),
|
||||
CLK(NULL, "usb11", &usb11_clk),
|
||||
CLK(NULL, "usb20", &usb20_clk),
|
||||
CLK("spi_davinci.0", NULL, &spi0_clk),
|
||||
CLK("spi_davinci.1", NULL, &spi1_clk),
|
||||
CLK(NULL, NULL, NULL),
|
||||
};
|
||||
|
||||
@ -543,30 +575,19 @@ static const struct mux_config da850_pins[] = {
|
||||
MUX_CFG(DA850, EMA_WAIT_1, 6, 24, 15, 1, false)
|
||||
MUX_CFG(DA850, NEMA_CS_2, 7, 0, 15, 1, false)
|
||||
/* GPIO function */
|
||||
MUX_CFG(DA850, GPIO2_4, 6, 12, 15, 8, false)
|
||||
MUX_CFG(DA850, GPIO2_6, 6, 4, 15, 8, false)
|
||||
MUX_CFG(DA850, GPIO2_8, 5, 28, 15, 8, false)
|
||||
MUX_CFG(DA850, GPIO2_15, 5, 0, 15, 8, false)
|
||||
MUX_CFG(DA850, GPIO3_12, 7, 12, 15, 8, false)
|
||||
MUX_CFG(DA850, GPIO3_13, 7, 8, 15, 8, false)
|
||||
MUX_CFG(DA850, GPIO4_0, 10, 28, 15, 8, false)
|
||||
MUX_CFG(DA850, GPIO4_1, 10, 24, 15, 8, false)
|
||||
MUX_CFG(DA850, GPIO6_13, 13, 8, 15, 8, false)
|
||||
MUX_CFG(DA850, RTC_ALARM, 0, 28, 15, 2, false)
|
||||
#endif
|
||||
};
|
||||
|
||||
const short da850_uart0_pins[] __initdata = {
|
||||
DA850_NUART0_CTS, DA850_NUART0_RTS, DA850_UART0_RXD, DA850_UART0_TXD,
|
||||
-1
|
||||
};
|
||||
|
||||
const short da850_uart1_pins[] __initdata = {
|
||||
DA850_UART1_RXD, DA850_UART1_TXD,
|
||||
-1
|
||||
};
|
||||
|
||||
const short da850_uart2_pins[] __initdata = {
|
||||
DA850_UART2_RXD, DA850_UART2_TXD,
|
||||
-1
|
||||
};
|
||||
|
||||
const short da850_i2c0_pins[] __initdata = {
|
||||
DA850_I2C0_SDA, DA850_I2C0_SCL,
|
||||
-1
|
||||
@ -577,24 +598,6 @@ const short da850_i2c1_pins[] __initdata = {
|
||||
-1
|
||||
};
|
||||
|
||||
const short da850_cpgmac_pins[] __initdata = {
|
||||
DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3,
|
||||
DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER,
|
||||
DA850_MII_CRS, DA850_MII_RXCLK, DA850_MII_RXDV, DA850_MII_RXD_3,
|
||||
DA850_MII_RXD_2, DA850_MII_RXD_1, DA850_MII_RXD_0, DA850_MDIO_CLK,
|
||||
DA850_MDIO_D, DA850_RMII_TXD_0, DA850_RMII_TXD_1, DA850_RMII_TXEN,
|
||||
DA850_RMII_CRS_DV, DA850_RMII_RXD_0, DA850_RMII_RXD_1, DA850_RMII_RXER,
|
||||
DA850_RMII_MHZ_50_CLK,
|
||||
-1
|
||||
};
|
||||
|
||||
const short da850_mcasp_pins[] __initdata = {
|
||||
DA850_AHCLKX, DA850_ACLKX, DA850_AFSX,
|
||||
DA850_AHCLKR, DA850_ACLKR, DA850_AFSR, DA850_AMUTE,
|
||||
DA850_AXR_11, DA850_AXR_12,
|
||||
-1
|
||||
};
|
||||
|
||||
const short da850_lcdcntl_pins[] __initdata = {
|
||||
DA850_LCD_D_0, DA850_LCD_D_1, DA850_LCD_D_2, DA850_LCD_D_3,
|
||||
DA850_LCD_D_4, DA850_LCD_D_5, DA850_LCD_D_6, DA850_LCD_D_7,
|
||||
@ -604,29 +607,6 @@ const short da850_lcdcntl_pins[] __initdata = {
|
||||
-1
|
||||
};
|
||||
|
||||
const short da850_mmcsd0_pins[] __initdata = {
|
||||
DA850_MMCSD0_DAT_0, DA850_MMCSD0_DAT_1, DA850_MMCSD0_DAT_2,
|
||||
DA850_MMCSD0_DAT_3, DA850_MMCSD0_CLK, DA850_MMCSD0_CMD,
|
||||
DA850_GPIO4_0, DA850_GPIO4_1,
|
||||
-1
|
||||
};
|
||||
|
||||
const short da850_emif25_pins[] __initdata = {
|
||||
DA850_EMA_BA_1, DA850_EMA_CLK, DA850_EMA_WAIT_1, DA850_NEMA_CS_2,
|
||||
DA850_NEMA_CS_3, DA850_NEMA_CS_4, DA850_NEMA_WE, DA850_NEMA_OE,
|
||||
DA850_EMA_D_0, DA850_EMA_D_1, DA850_EMA_D_2, DA850_EMA_D_3,
|
||||
DA850_EMA_D_4, DA850_EMA_D_5, DA850_EMA_D_6, DA850_EMA_D_7,
|
||||
DA850_EMA_D_8, DA850_EMA_D_9, DA850_EMA_D_10, DA850_EMA_D_11,
|
||||
DA850_EMA_D_12, DA850_EMA_D_13, DA850_EMA_D_14, DA850_EMA_D_15,
|
||||
DA850_EMA_A_0, DA850_EMA_A_1, DA850_EMA_A_2, DA850_EMA_A_3,
|
||||
DA850_EMA_A_4, DA850_EMA_A_5, DA850_EMA_A_6, DA850_EMA_A_7,
|
||||
DA850_EMA_A_8, DA850_EMA_A_9, DA850_EMA_A_10, DA850_EMA_A_11,
|
||||
DA850_EMA_A_12, DA850_EMA_A_13, DA850_EMA_A_14, DA850_EMA_A_15,
|
||||
DA850_EMA_A_16, DA850_EMA_A_17, DA850_EMA_A_18, DA850_EMA_A_19,
|
||||
DA850_EMA_A_20, DA850_EMA_A_21, DA850_EMA_A_22, DA850_EMA_A_23,
|
||||
-1
|
||||
};
|
||||
|
||||
/* FIQ are pri 0-1; otherwise 2-7, with 7 lowest priority */
|
||||
static u8 da850_default_priorities[DA850_N_CP_INTC_IRQ] = {
|
||||
[IRQ_DA8XX_COMMTX] = 7,
|
||||
@ -764,6 +744,13 @@ static struct davinci_id da850_ids[] = {
|
||||
.cpu_id = DAVINCI_CPU_ID_DA850,
|
||||
.name = "da850/omap-l138",
|
||||
},
|
||||
{
|
||||
.variant = 0x1,
|
||||
.part_no = 0xb7d1,
|
||||
.manufacturer = 0x017, /* 0x02f >> 1 */
|
||||
.cpu_id = DAVINCI_CPU_ID_DA850,
|
||||
.name = "da850/omap-l138/am18x",
|
||||
},
|
||||
};
|
||||
|
||||
static struct davinci_timer_instance da850_timer_instance[4] = {
|
||||
|
@ -38,12 +38,23 @@
|
||||
#define DA8XX_EMAC_MDIO_BASE 0x01e24000
|
||||
#define DA8XX_GPIO_BASE 0x01e26000
|
||||
#define DA8XX_I2C1_BASE 0x01e28000
|
||||
#define DA8XX_SPI0_BASE 0x01c41000
|
||||
#define DA8XX_SPI1_BASE 0x01f0e000
|
||||
|
||||
#define DA8XX_EMAC_CTRL_REG_OFFSET 0x3000
|
||||
#define DA8XX_EMAC_MOD_REG_OFFSET 0x2000
|
||||
#define DA8XX_EMAC_RAM_OFFSET 0x0000
|
||||
#define DA8XX_EMAC_CTRL_RAM_SIZE SZ_8K
|
||||
|
||||
#define DA8XX_DMA_SPI0_RX EDMA_CTLR_CHAN(0, 14)
|
||||
#define DA8XX_DMA_SPI0_TX EDMA_CTLR_CHAN(0, 15)
|
||||
#define DA8XX_DMA_MMCSD0_RX EDMA_CTLR_CHAN(0, 16)
|
||||
#define DA8XX_DMA_MMCSD0_TX EDMA_CTLR_CHAN(0, 17)
|
||||
#define DA8XX_DMA_SPI1_RX EDMA_CTLR_CHAN(0, 18)
|
||||
#define DA8XX_DMA_SPI1_TX EDMA_CTLR_CHAN(0, 19)
|
||||
#define DA850_DMA_MMCSD1_RX EDMA_CTLR_CHAN(1, 28)
|
||||
#define DA850_DMA_MMCSD1_TX EDMA_CTLR_CHAN(1, 29)
|
||||
|
||||
void __iomem *da8xx_syscfg0_base;
|
||||
void __iomem *da8xx_syscfg1_base;
|
||||
|
||||
@ -573,13 +584,13 @@ static struct resource da8xx_mmcsd0_resources[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
{ /* DMA RX */
|
||||
.start = EDMA_CTLR_CHAN(0, 16),
|
||||
.end = EDMA_CTLR_CHAN(0, 16),
|
||||
.start = DA8XX_DMA_MMCSD0_RX,
|
||||
.end = DA8XX_DMA_MMCSD0_RX,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
{ /* DMA TX */
|
||||
.start = EDMA_CTLR_CHAN(0, 17),
|
||||
.end = EDMA_CTLR_CHAN(0, 17),
|
||||
.start = DA8XX_DMA_MMCSD0_TX,
|
||||
.end = DA8XX_DMA_MMCSD0_TX,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
@ -610,13 +621,13 @@ static struct resource da850_mmcsd1_resources[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
{ /* DMA RX */
|
||||
.start = EDMA_CTLR_CHAN(1, 28),
|
||||
.end = EDMA_CTLR_CHAN(1, 28),
|
||||
.start = DA850_DMA_MMCSD1_RX,
|
||||
.end = DA850_DMA_MMCSD1_RX,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
{ /* DMA TX */
|
||||
.start = EDMA_CTLR_CHAN(1, 29),
|
||||
.end = EDMA_CTLR_CHAN(1, 29),
|
||||
.start = DA850_DMA_MMCSD1_TX,
|
||||
.end = DA850_DMA_MMCSD1_TX,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
@ -725,3 +736,101 @@ int __init da8xx_register_cpuidle(void)
|
||||
|
||||
return platform_device_register(&da8xx_cpuidle_device);
|
||||
}
|
||||
|
||||
static struct resource da8xx_spi0_resources[] = {
|
||||
[0] = {
|
||||
.start = DA8XX_SPI0_BASE,
|
||||
.end = DA8XX_SPI0_BASE + SZ_4K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = IRQ_DA8XX_SPINT0,
|
||||
.end = IRQ_DA8XX_SPINT0,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = DA8XX_DMA_SPI0_RX,
|
||||
.end = DA8XX_DMA_SPI0_RX,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[3] = {
|
||||
.start = DA8XX_DMA_SPI0_TX,
|
||||
.end = DA8XX_DMA_SPI0_TX,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource da8xx_spi1_resources[] = {
|
||||
[0] = {
|
||||
.start = DA8XX_SPI1_BASE,
|
||||
.end = DA8XX_SPI1_BASE + SZ_4K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = IRQ_DA8XX_SPINT1,
|
||||
.end = IRQ_DA8XX_SPINT1,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = DA8XX_DMA_SPI1_RX,
|
||||
.end = DA8XX_DMA_SPI1_RX,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
[3] = {
|
||||
.start = DA8XX_DMA_SPI1_TX,
|
||||
.end = DA8XX_DMA_SPI1_TX,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
struct davinci_spi_platform_data da8xx_spi_pdata[] = {
|
||||
[0] = {
|
||||
.version = SPI_VERSION_2,
|
||||
.intr_line = 1,
|
||||
.dma_event_q = EVENTQ_0,
|
||||
},
|
||||
[1] = {
|
||||
.version = SPI_VERSION_2,
|
||||
.intr_line = 1,
|
||||
.dma_event_q = EVENTQ_0,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device da8xx_spi_device[] = {
|
||||
[0] = {
|
||||
.name = "spi_davinci",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(da8xx_spi0_resources),
|
||||
.resource = da8xx_spi0_resources,
|
||||
.dev = {
|
||||
.platform_data = &da8xx_spi_pdata[0],
|
||||
},
|
||||
},
|
||||
[1] = {
|
||||
.name = "spi_davinci",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(da8xx_spi1_resources),
|
||||
.resource = da8xx_spi1_resources,
|
||||
.dev = {
|
||||
.platform_data = &da8xx_spi_pdata[1],
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
int __init da8xx_register_spi(int instance, struct spi_board_info *info,
|
||||
unsigned len)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (instance < 0 || instance > 1)
|
||||
return -EINVAL;
|
||||
|
||||
ret = spi_register_board_info(info, len);
|
||||
if (ret)
|
||||
pr_warning("%s: failed to register board info for spi %d :"
|
||||
" %d\n", __func__, instance, ret);
|
||||
|
||||
da8xx_spi_pdata[instance].num_chipselect = len;
|
||||
|
||||
return platform_device_register(&da8xx_spi_device[instance]);
|
||||
}
|
||||
|
@ -35,6 +35,7 @@
|
||||
#define TNETV107X_SDIO0_BASE 0x08088700
|
||||
#define TNETV107X_SDIO1_BASE 0x08088800
|
||||
#define TNETV107X_KEYPAD_BASE 0x08088a00
|
||||
#define TNETV107X_SSP_BASE 0x08088c00
|
||||
#define TNETV107X_ASYNC_EMIF_CNTRL_BASE 0x08200000
|
||||
#define TNETV107X_ASYNC_EMIF_DATA_CE0_BASE 0x30000000
|
||||
#define TNETV107X_ASYNC_EMIF_DATA_CE1_BASE 0x40000000
|
||||
@ -342,6 +343,25 @@ static struct platform_device tsc_device = {
|
||||
.resource = tsc_resources,
|
||||
};
|
||||
|
||||
static struct resource ssp_resources[] = {
|
||||
{
|
||||
.start = TNETV107X_SSP_BASE,
|
||||
.end = TNETV107X_SSP_BASE + 0x1ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = IRQ_TNETV107X_SSP,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device ssp_device = {
|
||||
.name = "ti-ssp",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(ssp_resources),
|
||||
.resource = ssp_resources,
|
||||
};
|
||||
|
||||
void __init tnetv107x_devices_init(struct tnetv107x_device_info *info)
|
||||
{
|
||||
int i, error;
|
||||
@ -380,4 +400,9 @@ void __init tnetv107x_devices_init(struct tnetv107x_device_info *info)
|
||||
keypad_device.dev.platform_data = info->keypad_config;
|
||||
platform_device_register(&keypad_device);
|
||||
}
|
||||
|
||||
if (info->ssp_config) {
|
||||
ssp_device.dev.platform_data = info->ssp_config;
|
||||
platform_device_register(&ssp_device);
|
||||
}
|
||||
}
|
||||
|
@ -403,16 +403,13 @@ static struct resource dm355_spi0_resources[] = {
|
||||
.start = 16,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
{
|
||||
.start = EVENTQ_1,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
static struct davinci_spi_platform_data dm355_spi0_pdata = {
|
||||
.version = SPI_VERSION_1,
|
||||
.num_chipselect = 2,
|
||||
.cshold_bug = true,
|
||||
.dma_event_q = EVENTQ_1,
|
||||
};
|
||||
static struct platform_device dm355_spi0_device = {
|
||||
.name = "spi_davinci",
|
||||
|
@ -625,6 +625,7 @@ static u64 dm365_spi0_dma_mask = DMA_BIT_MASK(32);
|
||||
static struct davinci_spi_platform_data dm365_spi0_pdata = {
|
||||
.version = SPI_VERSION_1,
|
||||
.num_chipselect = 2,
|
||||
.dma_event_q = EVENTQ_3,
|
||||
};
|
||||
|
||||
static struct resource dm365_spi0_resources[] = {
|
||||
@ -645,10 +646,6 @@ static struct resource dm365_spi0_resources[] = {
|
||||
.start = 16,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
{
|
||||
.start = EVENTQ_3,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device dm365_spi0_device = {
|
||||
|
@ -15,6 +15,7 @@
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/davinci_emac.h>
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
#include <mach/serial.h>
|
||||
#include <mach/edma.h>
|
||||
@ -23,6 +24,7 @@
|
||||
#include <mach/mmc.h>
|
||||
#include <mach/usb.h>
|
||||
#include <mach/pm.h>
|
||||
#include <mach/spi.h>
|
||||
|
||||
extern void __iomem *da8xx_syscfg0_base;
|
||||
extern void __iomem *da8xx_syscfg1_base;
|
||||
@ -77,6 +79,7 @@ void __init da850_init(void);
|
||||
int da830_register_edma(struct edma_rsv_info *rsv);
|
||||
int da850_register_edma(struct edma_rsv_info *rsv[2]);
|
||||
int da8xx_register_i2c(int instance, struct davinci_i2c_platform_data *pdata);
|
||||
int da8xx_register_spi(int instance, struct spi_board_info *info, unsigned len);
|
||||
int da8xx_register_watchdog(void);
|
||||
int da8xx_register_usb20(unsigned mA, unsigned potpgt);
|
||||
int da8xx_register_usb11(struct da8xx_ohci_root_hub *pdata);
|
||||
@ -95,6 +98,7 @@ extern struct platform_device da8xx_serial_device;
|
||||
extern struct emac_platform_data da8xx_emac_pdata;
|
||||
extern struct da8xx_lcdc_platform_data sharp_lcd035q3dg01_pdata;
|
||||
extern struct da8xx_lcdc_platform_data sharp_lk043t1dg01_pdata;
|
||||
extern struct davinci_spi_platform_data da8xx_spi_pdata[];
|
||||
|
||||
extern struct platform_device da8xx_wdt_device;
|
||||
|
||||
@ -123,15 +127,8 @@ extern const short da830_ecap2_pins[];
|
||||
extern const short da830_eqep0_pins[];
|
||||
extern const short da830_eqep1_pins[];
|
||||
|
||||
extern const short da850_uart0_pins[];
|
||||
extern const short da850_uart1_pins[];
|
||||
extern const short da850_uart2_pins[];
|
||||
extern const short da850_i2c0_pins[];
|
||||
extern const short da850_i2c1_pins[];
|
||||
extern const short da850_cpgmac_pins[];
|
||||
extern const short da850_mcasp_pins[];
|
||||
extern const short da850_lcdcntl_pins[];
|
||||
extern const short da850_mmcsd0_pins[];
|
||||
extern const short da850_emif25_pins[];
|
||||
|
||||
#endif /* __ASM_ARCH_DAVINCI_DA8XX_H */
|
||||
|
@ -151,42 +151,6 @@ struct edmacc_param {
|
||||
#define DA830_DMACH2EVENT_MAP1 0x00000000u
|
||||
#define DA830_EDMA_ARM_OWN 0x30FFCCFFu
|
||||
|
||||
/* DA830 specific EDMA3 Events Information */
|
||||
enum DA830_edma_ch {
|
||||
DA830_DMACH_MCASP0_RX,
|
||||
DA830_DMACH_MCASP0_TX,
|
||||
DA830_DMACH_MCASP1_RX,
|
||||
DA830_DMACH_MCASP1_TX,
|
||||
DA830_DMACH_MCASP2_RX,
|
||||
DA830_DMACH_MCASP2_TX,
|
||||
DA830_DMACH_GPIO_BNK0INT,
|
||||
DA830_DMACH_GPIO_BNK1INT,
|
||||
DA830_DMACH_UART0_RX,
|
||||
DA830_DMACH_UART0_TX,
|
||||
DA830_DMACH_TMR64P0_EVTOUT12,
|
||||
DA830_DMACH_TMR64P0_EVTOUT34,
|
||||
DA830_DMACH_UART1_RX,
|
||||
DA830_DMACH_UART1_TX,
|
||||
DA830_DMACH_SPI0_RX,
|
||||
DA830_DMACH_SPI0_TX,
|
||||
DA830_DMACH_MMCSD_RX,
|
||||
DA830_DMACH_MMCSD_TX,
|
||||
DA830_DMACH_SPI1_RX,
|
||||
DA830_DMACH_SPI1_TX,
|
||||
DA830_DMACH_DMAX_EVTOUT6,
|
||||
DA830_DMACH_DMAX_EVTOUT7,
|
||||
DA830_DMACH_GPIO_BNK2INT,
|
||||
DA830_DMACH_GPIO_BNK3INT,
|
||||
DA830_DMACH_I2C0_RX,
|
||||
DA830_DMACH_I2C0_TX,
|
||||
DA830_DMACH_I2C1_RX,
|
||||
DA830_DMACH_I2C1_TX,
|
||||
DA830_DMACH_GPIO_BNK4INT,
|
||||
DA830_DMACH_GPIO_BNK5INT,
|
||||
DA830_DMACH_UART2_RX,
|
||||
DA830_DMACH_UART2_TX
|
||||
};
|
||||
|
||||
/*ch_status paramater of callback function possible values*/
|
||||
#define DMA_COMPLETE 1
|
||||
#define DMA_CC_ERROR 2
|
||||
|
@ -908,11 +908,15 @@ enum davinci_da850_index {
|
||||
DA850_NEMA_CS_2,
|
||||
|
||||
/* GPIO function */
|
||||
DA850_GPIO2_4,
|
||||
DA850_GPIO2_6,
|
||||
DA850_GPIO2_8,
|
||||
DA850_GPIO2_15,
|
||||
DA850_GPIO3_12,
|
||||
DA850_GPIO3_13,
|
||||
DA850_GPIO4_0,
|
||||
DA850_GPIO4_1,
|
||||
DA850_GPIO6_13,
|
||||
DA850_RTC_ALARM,
|
||||
};
|
||||
|
||||
|
@ -150,7 +150,7 @@
|
||||
#define DA8XX_LPSC0_SCR0_SS 10
|
||||
#define DA8XX_LPSC0_SCR1_SS 11
|
||||
#define DA8XX_LPSC0_SCR2_SS 12
|
||||
#define DA8XX_LPSC0_DMAX 13
|
||||
#define DA8XX_LPSC0_PRUSS 13
|
||||
#define DA8XX_LPSC0_ARM 14
|
||||
#define DA8XX_LPSC0_GEM 15
|
||||
|
||||
|
@ -19,6 +19,8 @@
|
||||
#ifndef __ARCH_ARM_DAVINCI_SPI_H
|
||||
#define __ARCH_ARM_DAVINCI_SPI_H
|
||||
|
||||
#include <mach/edma.h>
|
||||
|
||||
#define SPI_INTERN_CS 0xFF
|
||||
|
||||
enum {
|
||||
@ -39,13 +41,16 @@ enum {
|
||||
* to populate if all chip-selects are internal.
|
||||
* @cshold_bug: set this to true if the SPI controller on your chip requires
|
||||
* a write to CSHOLD bit in between transfers (like in DM355).
|
||||
* @dma_event_q: DMA event queue to use if SPI_IO_TYPE_DMA is used for any
|
||||
* device on the bus.
|
||||
*/
|
||||
struct davinci_spi_platform_data {
|
||||
u8 version;
|
||||
u8 num_chipselect;
|
||||
u8 intr_line;
|
||||
u8 *chip_sel;
|
||||
bool cshold_bug;
|
||||
u8 version;
|
||||
u8 num_chipselect;
|
||||
u8 intr_line;
|
||||
u8 *chip_sel;
|
||||
bool cshold_bug;
|
||||
enum dma_event_q dma_event_q;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -34,6 +34,7 @@
|
||||
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
#include <linux/mfd/ti_ssp.h>
|
||||
|
||||
#include <mach/mmc.h>
|
||||
#include <mach/nand.h>
|
||||
@ -44,6 +45,7 @@ struct tnetv107x_device_info {
|
||||
struct davinci_mmc_config *mmc_config[2]; /* 2 controllers */
|
||||
struct davinci_nand_pdata *nand_config[4]; /* 4 chipsels */
|
||||
struct matrix_keypad_platform_data *keypad_config;
|
||||
struct ti_ssp_data *ssp_config;
|
||||
};
|
||||
|
||||
extern struct platform_device tnetv107x_wdt_device;
|
||||
|
@ -278,7 +278,7 @@ static struct clk_lookup clks[] = {
|
||||
CLK(NULL, "timer1", &clk_timer1),
|
||||
CLK("tnetv107x_wdt.0", NULL, &clk_wdt_arm),
|
||||
CLK(NULL, "clk_wdt_dsp", &clk_wdt_dsp),
|
||||
CLK("ti-ssp.0", NULL, &clk_ssp),
|
||||
CLK("ti-ssp", NULL, &clk_ssp),
|
||||
CLK(NULL, "clk_tdm0", &clk_tdm0),
|
||||
CLK(NULL, "clk_vlynq", &clk_vlynq),
|
||||
CLK(NULL, "clk_mcdma", &clk_mcdma),
|
||||
|
@ -90,6 +90,7 @@ MACHINE_START(CM_A510, "Compulab CM-A510 Board")
|
||||
.boot_params = 0x00000100,
|
||||
.init_machine = cm_a510_init,
|
||||
.map_io = dove_map_io,
|
||||
.init_early = dove_init_early,
|
||||
.init_irq = dove_init_irq,
|
||||
.timer = &dove_timer,
|
||||
MACHINE_END
|
||||
|
@ -532,6 +532,11 @@ void __init dove_i2c_init(void)
|
||||
/*****************************************************************************
|
||||
* Time handling
|
||||
****************************************************************************/
|
||||
void __init dove_init_early(void)
|
||||
{
|
||||
orion_time_set_base(TIMER_VIRT_BASE);
|
||||
}
|
||||
|
||||
static int get_tclk(void)
|
||||
{
|
||||
/* use DOVE_RESET_SAMPLE_HI/LO to detect tclk */
|
||||
@ -540,7 +545,8 @@ static int get_tclk(void)
|
||||
|
||||
static void dove_timer_init(void)
|
||||
{
|
||||
orion_time_init(IRQ_DOVE_BRIDGE, get_tclk());
|
||||
orion_time_init(BRIDGE_VIRT_BASE, BRIDGE_INT_TIMER1_CLR,
|
||||
IRQ_DOVE_BRIDGE, get_tclk());
|
||||
}
|
||||
|
||||
struct sys_timer dove_timer = {
|
||||
|
@ -22,6 +22,7 @@ extern struct mbus_dram_target_info dove_mbus_dram_info;
|
||||
*/
|
||||
void dove_map_io(void);
|
||||
void dove_init(void);
|
||||
void dove_init_early(void);
|
||||
void dove_init_irq(void);
|
||||
void dove_setup_cpu_mbus(void);
|
||||
void dove_ge00_init(struct mv643xx_eth_platform_data *eth_data);
|
||||
|
@ -97,6 +97,7 @@ MACHINE_START(DOVE_DB, "Marvell DB-MV88AP510-BP Development Board")
|
||||
.boot_params = 0x00000100,
|
||||
.init_machine = dove_db_init,
|
||||
.map_io = dove_map_io,
|
||||
.init_early = dove_init_early,
|
||||
.init_irq = dove_init_irq,
|
||||
.timer = &dove_timer,
|
||||
MACHINE_END
|
||||
|
@ -26,10 +26,6 @@
|
||||
#define SYSTEM_SOFT_RESET (BRIDGE_VIRT_BASE | 0x010c)
|
||||
#define SOFT_RESET 0x00000001
|
||||
|
||||
#define BRIDGE_CAUSE (BRIDGE_VIRT_BASE | 0x0110)
|
||||
#define BRIDGE_MASK (BRIDGE_VIRT_BASE | 0x0114)
|
||||
#define BRIDGE_INT_TIMER0 0x0002
|
||||
#define BRIDGE_INT_TIMER1 0x0004
|
||||
#define BRIDGE_INT_TIMER1_CLR (~0x0004)
|
||||
|
||||
#define IRQ_VIRT_BASE (BRIDGE_VIRT_BASE | 0x0200)
|
||||
|
@ -130,7 +130,8 @@
|
||||
#define DOVE_PMU_MPP_GENERAL_CTRL (DOVE_MPP_VIRT_BASE + 0x10)
|
||||
#define DOVE_RESET_SAMPLE_LO (DOVE_MPP_VIRT_BASE | 0x014)
|
||||
#define DOVE_RESET_SAMPLE_HI (DOVE_MPP_VIRT_BASE | 0x018)
|
||||
#define DOVE_GPIO_VIRT_BASE (DOVE_SB_REGS_VIRT_BASE | 0xd0400)
|
||||
#define DOVE_GPIO_LO_VIRT_BASE (DOVE_SB_REGS_VIRT_BASE | 0xd0400)
|
||||
#define DOVE_GPIO_HI_VIRT_BASE (DOVE_SB_REGS_VIRT_BASE | 0xd0420)
|
||||
#define DOVE_GPIO2_VIRT_BASE (DOVE_SB_REGS_VIRT_BASE | 0xe8400)
|
||||
#define DOVE_MPP_GENERAL_VIRT_BASE (DOVE_SB_REGS_VIRT_BASE | 0xe803c)
|
||||
#define DOVE_AU1_SPDIFO_GPIO_EN (1 << 1)
|
||||
|
@ -6,46 +6,4 @@
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_GPIO_H
|
||||
#define __ASM_ARCH_GPIO_H
|
||||
|
||||
#include <asm/errno.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <plat/gpio.h>
|
||||
#include <asm-generic/gpio.h> /* cansleep wrappers */
|
||||
|
||||
#define GPIO_MAX 72
|
||||
|
||||
#define GPIO_BASE_LO (DOVE_GPIO_VIRT_BASE + 0x00)
|
||||
#define GPIO_BASE_HI (DOVE_GPIO_VIRT_BASE + 0x20)
|
||||
|
||||
#define GPIO_BASE(pin) ((pin < 32) ? GPIO_BASE_LO : \
|
||||
((pin < 64) ? GPIO_BASE_HI : \
|
||||
DOVE_GPIO2_VIRT_BASE))
|
||||
|
||||
#define GPIO_OUT(pin) (GPIO_BASE(pin) + 0x00)
|
||||
#define GPIO_IO_CONF(pin) (GPIO_BASE(pin) + 0x04)
|
||||
#define GPIO_BLINK_EN(pin) (GPIO_BASE(pin) + 0x08)
|
||||
#define GPIO_IN_POL(pin) (GPIO_BASE(pin) + 0x0c)
|
||||
#define GPIO_DATA_IN(pin) (GPIO_BASE(pin) + 0x10)
|
||||
#define GPIO_EDGE_CAUSE(pin) (GPIO_BASE(pin) + 0x14)
|
||||
#define GPIO_EDGE_MASK(pin) (GPIO_BASE(pin) + 0x18)
|
||||
#define GPIO_LEVEL_MASK(pin) (GPIO_BASE(pin) + 0x1c)
|
||||
|
||||
static inline int gpio_to_irq(int pin)
|
||||
{
|
||||
if (pin < NR_GPIO_IRQS)
|
||||
return pin + IRQ_DOVE_GPIO_START;
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int irq_to_gpio(int irq)
|
||||
{
|
||||
if (IRQ_DOVE_GPIO_START < irq && irq < NR_IRQS)
|
||||
return irq - IRQ_DOVE_GPIO_START;
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -92,10 +92,5 @@
|
||||
|
||||
#define NR_IRQS (IRQ_DOVE_PMU_START + NR_PMU_IRQS)
|
||||
|
||||
/* Required for compatability with PXA AC97 driver. */
|
||||
#define IRQ_AC97 IRQ_DOVE_AC97
|
||||
/* Required for compatability with PXA DMA driver. */
|
||||
#define IRQ_DMA IRQ_DOVE_PDMA
|
||||
/* Required for compatability with PXA NAND driver */
|
||||
#define IRQ_NAND IRQ_DOVE_NAND
|
||||
|
||||
#endif
|
||||
|
@ -99,11 +99,21 @@ void __init dove_init_irq(void)
|
||||
orion_irq_init(32, (void __iomem *)(IRQ_VIRT_BASE + IRQ_MASK_HIGH_OFF));
|
||||
|
||||
/*
|
||||
* Mask and clear GPIO IRQ interrupts.
|
||||
* Initialize gpiolib for GPIOs 0-71.
|
||||
*/
|
||||
writel(0, GPIO_LEVEL_MASK(0));
|
||||
writel(0, GPIO_EDGE_MASK(0));
|
||||
writel(0, GPIO_EDGE_CAUSE(0));
|
||||
orion_gpio_init(0, 32, DOVE_GPIO_LO_VIRT_BASE, 0,
|
||||
IRQ_DOVE_GPIO_START);
|
||||
set_irq_chained_handler(IRQ_DOVE_GPIO_0_7, gpio_irq_handler);
|
||||
set_irq_chained_handler(IRQ_DOVE_GPIO_8_15, gpio_irq_handler);
|
||||
set_irq_chained_handler(IRQ_DOVE_GPIO_16_23, gpio_irq_handler);
|
||||
set_irq_chained_handler(IRQ_DOVE_GPIO_24_31, gpio_irq_handler);
|
||||
|
||||
orion_gpio_init(32, 32, DOVE_GPIO_HI_VIRT_BASE, 0,
|
||||
IRQ_DOVE_GPIO_START + 32);
|
||||
set_irq_chained_handler(IRQ_DOVE_HIGH_GPIO, gpio_irq_handler);
|
||||
|
||||
orion_gpio_init(64, 8, DOVE_GPIO2_VIRT_BASE, 0,
|
||||
IRQ_DOVE_GPIO_START + 64);
|
||||
|
||||
/*
|
||||
* Mask and clear PMU interrupts
|
||||
@ -111,18 +121,6 @@ void __init dove_init_irq(void)
|
||||
writel(0, PMU_INTERRUPT_MASK);
|
||||
writel(0, PMU_INTERRUPT_CAUSE);
|
||||
|
||||
for (i = IRQ_DOVE_GPIO_START; i < IRQ_DOVE_PMU_START; i++) {
|
||||
set_irq_chip(i, &orion_gpio_irq_chip);
|
||||
set_irq_handler(i, handle_level_irq);
|
||||
irq_desc[i].status |= IRQ_LEVEL;
|
||||
set_irq_flags(i, IRQF_VALID);
|
||||
}
|
||||
set_irq_chained_handler(IRQ_DOVE_GPIO_0_7, gpio_irq_handler);
|
||||
set_irq_chained_handler(IRQ_DOVE_GPIO_8_15, gpio_irq_handler);
|
||||
set_irq_chained_handler(IRQ_DOVE_GPIO_16_23, gpio_irq_handler);
|
||||
set_irq_chained_handler(IRQ_DOVE_GPIO_24_31, gpio_irq_handler);
|
||||
set_irq_chained_handler(IRQ_DOVE_HIGH_GPIO, gpio_irq_handler);
|
||||
|
||||
for (i = IRQ_DOVE_PMU_START; i < NR_IRQS; i++) {
|
||||
set_irq_chip(i, &pmu_irq_chip);
|
||||
set_irq_handler(i, handle_level_irq);
|
||||
|
195
arch/arm/mach-exynos4/Kconfig
Normal file
195
arch/arm/mach-exynos4/Kconfig
Normal file
@ -0,0 +1,195 @@
|
||||
# arch/arm/mach-exynos4/Kconfig
|
||||
#
|
||||
# Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
# http://www.samsung.com/
|
||||
#
|
||||
# Licensed under GPLv2
|
||||
|
||||
# Configuration options for the EXYNOS4
|
||||
|
||||
if ARCH_EXYNOS4
|
||||
|
||||
config CPU_EXYNOS4210
|
||||
bool
|
||||
select S3C_PL330_DMA
|
||||
help
|
||||
Enable EXYNOS4210 CPU support
|
||||
|
||||
config EXYNOS4_MCT
|
||||
bool "Kernel timer support by MCT"
|
||||
help
|
||||
Use MCT (Multi Core Timer) as kernel timers
|
||||
|
||||
config EXYNOS4_DEV_PD
|
||||
bool
|
||||
help
|
||||
Compile in platform device definitions for Power Domain
|
||||
|
||||
config EXYNOS4_DEV_SYSMMU
|
||||
bool
|
||||
help
|
||||
Common setup code for SYSTEM MMU in EXYNOS4
|
||||
|
||||
config EXYNOS4_SETUP_I2C1
|
||||
bool
|
||||
help
|
||||
Common setup code for i2c bus 1.
|
||||
|
||||
config EXYNOS4_SETUP_I2C2
|
||||
bool
|
||||
help
|
||||
Common setup code for i2c bus 2.
|
||||
|
||||
config EXYNOS4_SETUP_I2C3
|
||||
bool
|
||||
help
|
||||
Common setup code for i2c bus 3.
|
||||
|
||||
config EXYNOS4_SETUP_I2C4
|
||||
bool
|
||||
help
|
||||
Common setup code for i2c bus 4.
|
||||
|
||||
config EXYNOS4_SETUP_I2C5
|
||||
bool
|
||||
help
|
||||
Common setup code for i2c bus 5.
|
||||
|
||||
config EXYNOS4_SETUP_I2C6
|
||||
bool
|
||||
help
|
||||
Common setup code for i2c bus 6.
|
||||
|
||||
config EXYNOS4_SETUP_I2C7
|
||||
bool
|
||||
help
|
||||
Common setup code for i2c bus 7.
|
||||
|
||||
config EXYNOS4_SETUP_KEYPAD
|
||||
bool
|
||||
help
|
||||
Common setup code for keypad.
|
||||
|
||||
config EXYNOS4_SETUP_SDHCI
|
||||
bool
|
||||
select EXYNOS4_SETUP_SDHCI_GPIO
|
||||
help
|
||||
Internal helper functions for EXYNOS4 based SDHCI systems.
|
||||
|
||||
config EXYNOS4_SETUP_SDHCI_GPIO
|
||||
bool
|
||||
help
|
||||
Common setup code for SDHCI gpio.
|
||||
|
||||
config EXYNOS4_SETUP_FIMC
|
||||
bool
|
||||
help
|
||||
Common setup code for the camera interfaces.
|
||||
|
||||
# machine support
|
||||
|
||||
menu "EXYNOS4 Machines"
|
||||
|
||||
config MACH_SMDKC210
|
||||
bool "SMDKC210"
|
||||
select CPU_EXYNOS4210
|
||||
select S3C_DEV_RTC
|
||||
select S3C_DEV_WDT
|
||||
select S3C_DEV_I2C1
|
||||
select S3C_DEV_HSMMC
|
||||
select S3C_DEV_HSMMC1
|
||||
select S3C_DEV_HSMMC2
|
||||
select S3C_DEV_HSMMC3
|
||||
select EXYNOS4_DEV_PD
|
||||
select EXYNOS4_DEV_SYSMMU
|
||||
select EXYNOS4_SETUP_I2C1
|
||||
select EXYNOS4_SETUP_SDHCI
|
||||
help
|
||||
Machine support for Samsung SMDKC210
|
||||
|
||||
config MACH_SMDKV310
|
||||
bool "SMDKV310"
|
||||
select CPU_EXYNOS4210
|
||||
select S3C_DEV_RTC
|
||||
select S3C_DEV_WDT
|
||||
select S3C_DEV_I2C1
|
||||
select S3C_DEV_HSMMC
|
||||
select S3C_DEV_HSMMC1
|
||||
select S3C_DEV_HSMMC2
|
||||
select S3C_DEV_HSMMC3
|
||||
select SAMSUNG_DEV_KEYPAD
|
||||
select EXYNOS4_DEV_PD
|
||||
select EXYNOS4_DEV_SYSMMU
|
||||
select EXYNOS4_SETUP_I2C1
|
||||
select EXYNOS4_SETUP_KEYPAD
|
||||
select EXYNOS4_SETUP_SDHCI
|
||||
help
|
||||
Machine support for Samsung SMDKV310
|
||||
|
||||
config MACH_ARMLEX4210
|
||||
bool "ARMLEX4210"
|
||||
select CPU_EXYNOS4210
|
||||
select S3C_DEV_RTC
|
||||
select S3C_DEV_WDT
|
||||
select S3C_DEV_HSMMC
|
||||
select S3C_DEV_HSMMC2
|
||||
select S3C_DEV_HSMMC3
|
||||
select EXYNOS4_DEV_SYSMMU
|
||||
select EXYNOS4_SETUP_SDHCI
|
||||
select SATA_AHCI_PLATFORM
|
||||
help
|
||||
Machine support for Samsung ARMLEX4210 based on EXYNOS4210
|
||||
|
||||
config MACH_UNIVERSAL_C210
|
||||
bool "Mobile UNIVERSAL_C210 Board"
|
||||
select CPU_EXYNOS4210
|
||||
select S3C_DEV_HSMMC
|
||||
select S3C_DEV_HSMMC2
|
||||
select S3C_DEV_HSMMC3
|
||||
select S3C_DEV_I2C1
|
||||
select S3C_DEV_I2C5
|
||||
select S5P_DEV_ONENAND
|
||||
select EXYNOS4_SETUP_I2C1
|
||||
select EXYNOS4_SETUP_I2C5
|
||||
select EXYNOS4_SETUP_SDHCI
|
||||
help
|
||||
Machine support for Samsung Mobile Universal S5PC210 Reference
|
||||
Board.
|
||||
|
||||
config MACH_NURI
|
||||
bool "Mobile NURI Board"
|
||||
select CPU_EXYNOS4210
|
||||
select S3C_DEV_WDT
|
||||
select S3C_DEV_HSMMC
|
||||
select S3C_DEV_HSMMC2
|
||||
select S3C_DEV_HSMMC3
|
||||
select S3C_DEV_I2C1
|
||||
select S3C_DEV_I2C5
|
||||
select EXYNOS4_SETUP_I2C1
|
||||
select EXYNOS4_SETUP_I2C5
|
||||
select EXYNOS4_SETUP_SDHCI
|
||||
select SAMSUNG_DEV_PWM
|
||||
help
|
||||
Machine support for Samsung Mobile NURI Board.
|
||||
|
||||
endmenu
|
||||
|
||||
comment "Configuration for HSMMC bus width"
|
||||
|
||||
menu "Use 8-bit bus width"
|
||||
|
||||
config EXYNOS4_SDHCI_CH0_8BIT
|
||||
bool "Channel 0 with 8-bit bus"
|
||||
help
|
||||
Support HSMMC Channel 0 8-bit bus.
|
||||
If selected, Channel 1 is disabled.
|
||||
|
||||
config EXYNOS4_SDHCI_CH2_8BIT
|
||||
bool "Channel 2 with 8-bit bus"
|
||||
help
|
||||
Support HSMMC Channel 2 8-bit bus.
|
||||
If selected, Channel 3 is disabled.
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
56
arch/arm/mach-exynos4/Makefile
Normal file
56
arch/arm/mach-exynos4/Makefile
Normal file
@ -0,0 +1,56 @@
|
||||
# arch/arm/mach-exynos4/Makefile
|
||||
#
|
||||
# Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
# http://www.samsung.com/
|
||||
#
|
||||
# Licensed under GPLv2
|
||||
|
||||
obj-y :=
|
||||
obj-m :=
|
||||
obj-n :=
|
||||
obj- :=
|
||||
|
||||
# Core support for EXYNOS4 system
|
||||
|
||||
obj-$(CONFIG_CPU_EXYNOS4210) += cpu.o init.o clock.o irq-combiner.o
|
||||
obj-$(CONFIG_CPU_EXYNOS4210) += setup-i2c0.o gpiolib.o irq-eint.o dma.o
|
||||
obj-$(CONFIG_PM) += pm.o sleep.o
|
||||
obj-$(CONFIG_CPU_FREQ) += cpufreq.o
|
||||
|
||||
obj-$(CONFIG_SMP) += platsmp.o headsmp.o
|
||||
|
||||
ifeq ($(CONFIG_EXYNOS4_MCT),y)
|
||||
obj-y += mct.o
|
||||
else
|
||||
obj-y += time.o
|
||||
obj-$(CONFIG_LOCAL_TIMERS) += localtimer.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
|
||||
|
||||
# machine support
|
||||
|
||||
obj-$(CONFIG_MACH_SMDKC210) += mach-smdkc210.o
|
||||
obj-$(CONFIG_MACH_SMDKV310) += mach-smdkv310.o
|
||||
obj-$(CONFIG_MACH_ARMLEX4210) += mach-armlex4210.o
|
||||
obj-$(CONFIG_MACH_UNIVERSAL_C210) += mach-universal_c210.o
|
||||
obj-$(CONFIG_MACH_NURI) += mach-nuri.o
|
||||
|
||||
# device support
|
||||
|
||||
obj-y += dev-audio.o
|
||||
obj-$(CONFIG_EXYNOS4_DEV_PD) += dev-pd.o
|
||||
obj-$(CONFIG_EXYNOS4_DEV_SYSMMU) += dev-sysmmu.o
|
||||
|
||||
obj-$(CONFIG_EXYNOS4_SETUP_FIMC) += setup-fimc.o
|
||||
obj-$(CONFIG_EXYNOS4_SETUP_I2C1) += setup-i2c1.o
|
||||
obj-$(CONFIG_EXYNOS4_SETUP_I2C2) += setup-i2c2.o
|
||||
obj-$(CONFIG_EXYNOS4_SETUP_I2C3) += setup-i2c3.o
|
||||
obj-$(CONFIG_EXYNOS4_SETUP_I2C4) += setup-i2c4.o
|
||||
obj-$(CONFIG_EXYNOS4_SETUP_I2C5) += setup-i2c5.o
|
||||
obj-$(CONFIG_EXYNOS4_SETUP_I2C6) += setup-i2c6.o
|
||||
obj-$(CONFIG_EXYNOS4_SETUP_I2C7) += setup-i2c7.o
|
||||
obj-$(CONFIG_EXYNOS4_SETUP_KEYPAD) += setup-keypad.o
|
||||
obj-$(CONFIG_EXYNOS4_SETUP_SDHCI) += setup-sdhci.o
|
||||
obj-$(CONFIG_EXYNOS4_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o
|
||||
obj-$(CONFIG_SATA_AHCI_PLATFORM) += dev-ahci.o
|
@ -1,9 +1,9 @@
|
||||
/* linux/arch/arm/mach-s5pv310/clock.c
|
||||
/* linux/arch/arm/mach-exynos4/clock.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* S5PV310 - Clock support
|
||||
* EXYNOS4 - Clock support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@ -23,6 +23,7 @@
|
||||
|
||||
#include <mach/map.h>
|
||||
#include <mach/regs-clock.h>
|
||||
#include <mach/sysmmu.h>
|
||||
|
||||
static struct clk clk_sclk_hdmi27m = {
|
||||
.name = "sclk_hdmi27m",
|
||||
@ -46,72 +47,82 @@ static struct clk clk_sclk_usbphy1 = {
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static int s5pv310_clksrc_mask_top_ctrl(struct clk *clk, int enable)
|
||||
static int exynos4_clksrc_mask_top_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKSRC_MASK_TOP, clk, enable);
|
||||
}
|
||||
|
||||
static int s5pv310_clksrc_mask_cam_ctrl(struct clk *clk, int enable)
|
||||
static int exynos4_clksrc_mask_cam_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKSRC_MASK_CAM, clk, enable);
|
||||
}
|
||||
|
||||
static int s5pv310_clksrc_mask_lcd0_ctrl(struct clk *clk, int enable)
|
||||
static int exynos4_clksrc_mask_lcd0_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKSRC_MASK_LCD0, clk, enable);
|
||||
}
|
||||
|
||||
static int s5pv310_clksrc_mask_lcd1_ctrl(struct clk *clk, int enable)
|
||||
static int exynos4_clksrc_mask_lcd1_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKSRC_MASK_LCD1, clk, enable);
|
||||
}
|
||||
|
||||
static int s5pv310_clksrc_mask_fsys_ctrl(struct clk *clk, int enable)
|
||||
static int exynos4_clksrc_mask_fsys_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKSRC_MASK_FSYS, clk, enable);
|
||||
}
|
||||
|
||||
static int s5pv310_clksrc_mask_peril0_ctrl(struct clk *clk, int enable)
|
||||
static int exynos4_clksrc_mask_peril0_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKSRC_MASK_PERIL0, clk, enable);
|
||||
}
|
||||
|
||||
static int s5pv310_clksrc_mask_peril1_ctrl(struct clk *clk, int enable)
|
||||
static int exynos4_clksrc_mask_peril1_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKSRC_MASK_PERIL1, clk, enable);
|
||||
}
|
||||
|
||||
static int s5pv310_clk_ip_cam_ctrl(struct clk *clk, int enable)
|
||||
static int exynos4_clk_ip_mfc_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKGATE_IP_MFC, clk, enable);
|
||||
}
|
||||
|
||||
static int exynos4_clk_ip_cam_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKGATE_IP_CAM, clk, enable);
|
||||
}
|
||||
|
||||
static int s5pv310_clk_ip_image_ctrl(struct clk *clk, int enable)
|
||||
static int exynos4_clk_ip_tv_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKGATE_IP_TV, clk, enable);
|
||||
}
|
||||
|
||||
static int exynos4_clk_ip_image_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKGATE_IP_IMAGE, clk, enable);
|
||||
}
|
||||
|
||||
static int s5pv310_clk_ip_lcd0_ctrl(struct clk *clk, int enable)
|
||||
static int exynos4_clk_ip_lcd0_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKGATE_IP_LCD0, clk, enable);
|
||||
}
|
||||
|
||||
static int s5pv310_clk_ip_lcd1_ctrl(struct clk *clk, int enable)
|
||||
static int exynos4_clk_ip_lcd1_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKGATE_IP_LCD1, clk, enable);
|
||||
}
|
||||
|
||||
static int s5pv310_clk_ip_fsys_ctrl(struct clk *clk, int enable)
|
||||
static int exynos4_clk_ip_fsys_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKGATE_IP_FSYS, clk, enable);
|
||||
}
|
||||
|
||||
static int s5pv310_clk_ip_peril_ctrl(struct clk *clk, int enable)
|
||||
static int exynos4_clk_ip_peril_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKGATE_IP_PERIL, clk, enable);
|
||||
}
|
||||
|
||||
static int s5pv310_clk_ip_perir_ctrl(struct clk *clk, int enable)
|
||||
static int exynos4_clk_ip_perir_ctrl(struct clk *clk, int enable)
|
||||
{
|
||||
return s5p_gatectrl(S5P_CLKGATE_IP_PERIR, clk, enable);
|
||||
}
|
||||
@ -358,7 +369,7 @@ static struct clksrc_clk clk_vpllsrc = {
|
||||
.clk = {
|
||||
.name = "vpll_src",
|
||||
.id = -1,
|
||||
.enable = s5pv310_clksrc_mask_top_ctrl,
|
||||
.enable = exynos4_clksrc_mask_top_ctrl,
|
||||
.ctrlbit = (1 << 0),
|
||||
},
|
||||
.sources = &clkset_vpllsrc,
|
||||
@ -389,239 +400,322 @@ static struct clk init_clocks_off[] = {
|
||||
.name = "timers",
|
||||
.id = -1,
|
||||
.parent = &clk_aclk_100.clk,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1<<24),
|
||||
}, {
|
||||
.name = "csis",
|
||||
.id = 0,
|
||||
.enable = s5pv310_clk_ip_cam_ctrl,
|
||||
.enable = exynos4_clk_ip_cam_ctrl,
|
||||
.ctrlbit = (1 << 4),
|
||||
}, {
|
||||
.name = "csis",
|
||||
.id = 1,
|
||||
.enable = s5pv310_clk_ip_cam_ctrl,
|
||||
.enable = exynos4_clk_ip_cam_ctrl,
|
||||
.ctrlbit = (1 << 5),
|
||||
}, {
|
||||
.name = "fimc",
|
||||
.id = 0,
|
||||
.enable = s5pv310_clk_ip_cam_ctrl,
|
||||
.enable = exynos4_clk_ip_cam_ctrl,
|
||||
.ctrlbit = (1 << 0),
|
||||
}, {
|
||||
.name = "fimc",
|
||||
.id = 1,
|
||||
.enable = s5pv310_clk_ip_cam_ctrl,
|
||||
.enable = exynos4_clk_ip_cam_ctrl,
|
||||
.ctrlbit = (1 << 1),
|
||||
}, {
|
||||
.name = "fimc",
|
||||
.id = 2,
|
||||
.enable = s5pv310_clk_ip_cam_ctrl,
|
||||
.enable = exynos4_clk_ip_cam_ctrl,
|
||||
.ctrlbit = (1 << 2),
|
||||
}, {
|
||||
.name = "fimc",
|
||||
.id = 3,
|
||||
.enable = s5pv310_clk_ip_cam_ctrl,
|
||||
.enable = exynos4_clk_ip_cam_ctrl,
|
||||
.ctrlbit = (1 << 3),
|
||||
}, {
|
||||
.name = "fimd",
|
||||
.id = 0,
|
||||
.enable = s5pv310_clk_ip_lcd0_ctrl,
|
||||
.enable = exynos4_clk_ip_lcd0_ctrl,
|
||||
.ctrlbit = (1 << 0),
|
||||
}, {
|
||||
.name = "fimd",
|
||||
.id = 1,
|
||||
.enable = s5pv310_clk_ip_lcd1_ctrl,
|
||||
.enable = exynos4_clk_ip_lcd1_ctrl,
|
||||
.ctrlbit = (1 << 0),
|
||||
}, {
|
||||
.name = "sataphy",
|
||||
.id = -1,
|
||||
.parent = &clk_aclk_133.clk,
|
||||
.enable = exynos4_clk_ip_fsys_ctrl,
|
||||
.ctrlbit = (1 << 3),
|
||||
}, {
|
||||
.name = "hsmmc",
|
||||
.id = 0,
|
||||
.parent = &clk_aclk_133.clk,
|
||||
.enable = s5pv310_clk_ip_fsys_ctrl,
|
||||
.enable = exynos4_clk_ip_fsys_ctrl,
|
||||
.ctrlbit = (1 << 5),
|
||||
}, {
|
||||
.name = "hsmmc",
|
||||
.id = 1,
|
||||
.parent = &clk_aclk_133.clk,
|
||||
.enable = s5pv310_clk_ip_fsys_ctrl,
|
||||
.enable = exynos4_clk_ip_fsys_ctrl,
|
||||
.ctrlbit = (1 << 6),
|
||||
}, {
|
||||
.name = "hsmmc",
|
||||
.id = 2,
|
||||
.parent = &clk_aclk_133.clk,
|
||||
.enable = s5pv310_clk_ip_fsys_ctrl,
|
||||
.enable = exynos4_clk_ip_fsys_ctrl,
|
||||
.ctrlbit = (1 << 7),
|
||||
}, {
|
||||
.name = "hsmmc",
|
||||
.id = 3,
|
||||
.parent = &clk_aclk_133.clk,
|
||||
.enable = s5pv310_clk_ip_fsys_ctrl,
|
||||
.enable = exynos4_clk_ip_fsys_ctrl,
|
||||
.ctrlbit = (1 << 8),
|
||||
}, {
|
||||
.name = "hsmmc",
|
||||
.id = 4,
|
||||
.parent = &clk_aclk_133.clk,
|
||||
.enable = s5pv310_clk_ip_fsys_ctrl,
|
||||
.enable = exynos4_clk_ip_fsys_ctrl,
|
||||
.ctrlbit = (1 << 9),
|
||||
}, {
|
||||
.name = "sata",
|
||||
.id = -1,
|
||||
.enable = s5pv310_clk_ip_fsys_ctrl,
|
||||
.parent = &clk_aclk_133.clk,
|
||||
.enable = exynos4_clk_ip_fsys_ctrl,
|
||||
.ctrlbit = (1 << 10),
|
||||
}, {
|
||||
.name = "pdma",
|
||||
.id = 0,
|
||||
.enable = s5pv310_clk_ip_fsys_ctrl,
|
||||
.enable = exynos4_clk_ip_fsys_ctrl,
|
||||
.ctrlbit = (1 << 0),
|
||||
}, {
|
||||
.name = "pdma",
|
||||
.id = 1,
|
||||
.enable = s5pv310_clk_ip_fsys_ctrl,
|
||||
.enable = exynos4_clk_ip_fsys_ctrl,
|
||||
.ctrlbit = (1 << 1),
|
||||
}, {
|
||||
.name = "adc",
|
||||
.id = -1,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 15),
|
||||
}, {
|
||||
.name = "keypad",
|
||||
.id = -1,
|
||||
.enable = exynos4_clk_ip_perir_ctrl,
|
||||
.ctrlbit = (1 << 16),
|
||||
}, {
|
||||
.name = "rtc",
|
||||
.id = -1,
|
||||
.enable = s5pv310_clk_ip_perir_ctrl,
|
||||
.enable = exynos4_clk_ip_perir_ctrl,
|
||||
.ctrlbit = (1 << 15),
|
||||
}, {
|
||||
.name = "watchdog",
|
||||
.id = -1,
|
||||
.enable = s5pv310_clk_ip_perir_ctrl,
|
||||
.parent = &clk_aclk_100.clk,
|
||||
.enable = exynos4_clk_ip_perir_ctrl,
|
||||
.ctrlbit = (1 << 14),
|
||||
}, {
|
||||
.name = "usbhost",
|
||||
.id = -1,
|
||||
.enable = s5pv310_clk_ip_fsys_ctrl ,
|
||||
.enable = exynos4_clk_ip_fsys_ctrl ,
|
||||
.ctrlbit = (1 << 12),
|
||||
}, {
|
||||
.name = "otg",
|
||||
.id = -1,
|
||||
.enable = s5pv310_clk_ip_fsys_ctrl,
|
||||
.enable = exynos4_clk_ip_fsys_ctrl,
|
||||
.ctrlbit = (1 << 13),
|
||||
}, {
|
||||
.name = "spi",
|
||||
.id = 0,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 16),
|
||||
}, {
|
||||
.name = "spi",
|
||||
.id = 1,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 17),
|
||||
}, {
|
||||
.name = "spi",
|
||||
.id = 2,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 18),
|
||||
}, {
|
||||
.name = "iis",
|
||||
.id = 0,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 19),
|
||||
}, {
|
||||
.name = "iis",
|
||||
.id = 1,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 20),
|
||||
}, {
|
||||
.name = "iis",
|
||||
.id = 2,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 21),
|
||||
}, {
|
||||
.name = "ac97",
|
||||
.id = -1,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 27),
|
||||
}, {
|
||||
.name = "fimg2d",
|
||||
.id = -1,
|
||||
.enable = s5pv310_clk_ip_image_ctrl,
|
||||
.enable = exynos4_clk_ip_image_ctrl,
|
||||
.ctrlbit = (1 << 0),
|
||||
}, {
|
||||
.name = "i2c",
|
||||
.id = 0,
|
||||
.parent = &clk_aclk_100.clk,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 6),
|
||||
}, {
|
||||
.name = "i2c",
|
||||
.id = 1,
|
||||
.parent = &clk_aclk_100.clk,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 7),
|
||||
}, {
|
||||
.name = "i2c",
|
||||
.id = 2,
|
||||
.parent = &clk_aclk_100.clk,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 8),
|
||||
}, {
|
||||
.name = "i2c",
|
||||
.id = 3,
|
||||
.parent = &clk_aclk_100.clk,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 9),
|
||||
}, {
|
||||
.name = "i2c",
|
||||
.id = 4,
|
||||
.parent = &clk_aclk_100.clk,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 10),
|
||||
}, {
|
||||
.name = "i2c",
|
||||
.id = 5,
|
||||
.parent = &clk_aclk_100.clk,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 11),
|
||||
}, {
|
||||
.name = "i2c",
|
||||
.id = 6,
|
||||
.parent = &clk_aclk_100.clk,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 12),
|
||||
}, {
|
||||
.name = "i2c",
|
||||
.id = 7,
|
||||
.parent = &clk_aclk_100.clk,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 13),
|
||||
},
|
||||
}, {
|
||||
.name = "SYSMMU_MDMA",
|
||||
.id = -1,
|
||||
.enable = exynos4_clk_ip_image_ctrl,
|
||||
.ctrlbit = (1 << 5),
|
||||
}, {
|
||||
.name = "SYSMMU_FIMC0",
|
||||
.id = -1,
|
||||
.enable = exynos4_clk_ip_cam_ctrl,
|
||||
.ctrlbit = (1 << 7),
|
||||
}, {
|
||||
.name = "SYSMMU_FIMC1",
|
||||
.id = -1,
|
||||
.enable = exynos4_clk_ip_cam_ctrl,
|
||||
.ctrlbit = (1 << 8),
|
||||
}, {
|
||||
.name = "SYSMMU_FIMC2",
|
||||
.id = -1,
|
||||
.enable = exynos4_clk_ip_cam_ctrl,
|
||||
.ctrlbit = (1 << 9),
|
||||
}, {
|
||||
.name = "SYSMMU_FIMC3",
|
||||
.id = -1,
|
||||
.enable = exynos4_clk_ip_cam_ctrl,
|
||||
.ctrlbit = (1 << 10),
|
||||
}, {
|
||||
.name = "SYSMMU_JPEG",
|
||||
.id = -1,
|
||||
.enable = exynos4_clk_ip_cam_ctrl,
|
||||
.ctrlbit = (1 << 11),
|
||||
}, {
|
||||
.name = "SYSMMU_FIMD0",
|
||||
.id = -1,
|
||||
.enable = exynos4_clk_ip_lcd0_ctrl,
|
||||
.ctrlbit = (1 << 4),
|
||||
}, {
|
||||
.name = "SYSMMU_FIMD1",
|
||||
.id = -1,
|
||||
.enable = exynos4_clk_ip_lcd1_ctrl,
|
||||
.ctrlbit = (1 << 4),
|
||||
}, {
|
||||
.name = "SYSMMU_PCIe",
|
||||
.id = -1,
|
||||
.enable = exynos4_clk_ip_fsys_ctrl,
|
||||
.ctrlbit = (1 << 18),
|
||||
}, {
|
||||
.name = "SYSMMU_G2D",
|
||||
.id = -1,
|
||||
.enable = exynos4_clk_ip_image_ctrl,
|
||||
.ctrlbit = (1 << 3),
|
||||
}, {
|
||||
.name = "SYSMMU_ROTATOR",
|
||||
.id = -1,
|
||||
.enable = exynos4_clk_ip_image_ctrl,
|
||||
.ctrlbit = (1 << 4),
|
||||
}, {
|
||||
.name = "SYSMMU_TV",
|
||||
.id = -1,
|
||||
.enable = exynos4_clk_ip_tv_ctrl,
|
||||
.ctrlbit = (1 << 4),
|
||||
}, {
|
||||
.name = "SYSMMU_MFC_L",
|
||||
.id = -1,
|
||||
.enable = exynos4_clk_ip_mfc_ctrl,
|
||||
.ctrlbit = (1 << 1),
|
||||
}, {
|
||||
.name = "SYSMMU_MFC_R",
|
||||
.id = -1,
|
||||
.enable = exynos4_clk_ip_mfc_ctrl,
|
||||
.ctrlbit = (1 << 2),
|
||||
}
|
||||
};
|
||||
|
||||
static struct clk init_clocks[] = {
|
||||
{
|
||||
.name = "uart",
|
||||
.id = 0,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 0),
|
||||
}, {
|
||||
.name = "uart",
|
||||
.id = 1,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 1),
|
||||
}, {
|
||||
.name = "uart",
|
||||
.id = 2,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 2),
|
||||
}, {
|
||||
.name = "uart",
|
||||
.id = 3,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 3),
|
||||
}, {
|
||||
.name = "uart",
|
||||
.id = 4,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 4),
|
||||
}, {
|
||||
.name = "uart",
|
||||
.id = 5,
|
||||
.enable = s5pv310_clk_ip_peril_ctrl,
|
||||
.enable = exynos4_clk_ip_peril_ctrl,
|
||||
.ctrlbit = (1 << 5),
|
||||
}
|
||||
};
|
||||
@ -746,7 +840,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "uclk1",
|
||||
.id = 0,
|
||||
.enable = s5pv310_clksrc_mask_peril0_ctrl,
|
||||
.enable = exynos4_clksrc_mask_peril0_ctrl,
|
||||
.ctrlbit = (1 << 0),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -756,7 +850,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "uclk1",
|
||||
.id = 1,
|
||||
.enable = s5pv310_clksrc_mask_peril0_ctrl,
|
||||
.enable = exynos4_clksrc_mask_peril0_ctrl,
|
||||
.ctrlbit = (1 << 4),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -766,7 +860,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "uclk1",
|
||||
.id = 2,
|
||||
.enable = s5pv310_clksrc_mask_peril0_ctrl,
|
||||
.enable = exynos4_clksrc_mask_peril0_ctrl,
|
||||
.ctrlbit = (1 << 8),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -776,7 +870,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "uclk1",
|
||||
.id = 3,
|
||||
.enable = s5pv310_clksrc_mask_peril0_ctrl,
|
||||
.enable = exynos4_clksrc_mask_peril0_ctrl,
|
||||
.ctrlbit = (1 << 12),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -786,7 +880,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "sclk_pwm",
|
||||
.id = -1,
|
||||
.enable = s5pv310_clksrc_mask_peril0_ctrl,
|
||||
.enable = exynos4_clksrc_mask_peril0_ctrl,
|
||||
.ctrlbit = (1 << 24),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -796,7 +890,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "sclk_csis",
|
||||
.id = 0,
|
||||
.enable = s5pv310_clksrc_mask_cam_ctrl,
|
||||
.enable = exynos4_clksrc_mask_cam_ctrl,
|
||||
.ctrlbit = (1 << 24),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -806,7 +900,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "sclk_csis",
|
||||
.id = 1,
|
||||
.enable = s5pv310_clksrc_mask_cam_ctrl,
|
||||
.enable = exynos4_clksrc_mask_cam_ctrl,
|
||||
.ctrlbit = (1 << 28),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -816,7 +910,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "sclk_cam",
|
||||
.id = 0,
|
||||
.enable = s5pv310_clksrc_mask_cam_ctrl,
|
||||
.enable = exynos4_clksrc_mask_cam_ctrl,
|
||||
.ctrlbit = (1 << 16),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -826,7 +920,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "sclk_cam",
|
||||
.id = 1,
|
||||
.enable = s5pv310_clksrc_mask_cam_ctrl,
|
||||
.enable = exynos4_clksrc_mask_cam_ctrl,
|
||||
.ctrlbit = (1 << 20),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -836,7 +930,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "sclk_fimc",
|
||||
.id = 0,
|
||||
.enable = s5pv310_clksrc_mask_cam_ctrl,
|
||||
.enable = exynos4_clksrc_mask_cam_ctrl,
|
||||
.ctrlbit = (1 << 0),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -846,7 +940,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "sclk_fimc",
|
||||
.id = 1,
|
||||
.enable = s5pv310_clksrc_mask_cam_ctrl,
|
||||
.enable = exynos4_clksrc_mask_cam_ctrl,
|
||||
.ctrlbit = (1 << 4),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -856,7 +950,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "sclk_fimc",
|
||||
.id = 2,
|
||||
.enable = s5pv310_clksrc_mask_cam_ctrl,
|
||||
.enable = exynos4_clksrc_mask_cam_ctrl,
|
||||
.ctrlbit = (1 << 8),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -866,7 +960,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "sclk_fimc",
|
||||
.id = 3,
|
||||
.enable = s5pv310_clksrc_mask_cam_ctrl,
|
||||
.enable = exynos4_clksrc_mask_cam_ctrl,
|
||||
.ctrlbit = (1 << 12),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -876,7 +970,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "sclk_fimd",
|
||||
.id = 0,
|
||||
.enable = s5pv310_clksrc_mask_lcd0_ctrl,
|
||||
.enable = exynos4_clksrc_mask_lcd0_ctrl,
|
||||
.ctrlbit = (1 << 0),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -886,7 +980,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "sclk_fimd",
|
||||
.id = 1,
|
||||
.enable = s5pv310_clksrc_mask_lcd1_ctrl,
|
||||
.enable = exynos4_clksrc_mask_lcd1_ctrl,
|
||||
.ctrlbit = (1 << 0),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -896,7 +990,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "sclk_sata",
|
||||
.id = -1,
|
||||
.enable = s5pv310_clksrc_mask_fsys_ctrl,
|
||||
.enable = exynos4_clksrc_mask_fsys_ctrl,
|
||||
.ctrlbit = (1 << 24),
|
||||
},
|
||||
.sources = &clkset_mout_corebus,
|
||||
@ -906,7 +1000,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "sclk_spi",
|
||||
.id = 0,
|
||||
.enable = s5pv310_clksrc_mask_peril1_ctrl,
|
||||
.enable = exynos4_clksrc_mask_peril1_ctrl,
|
||||
.ctrlbit = (1 << 16),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -916,7 +1010,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "sclk_spi",
|
||||
.id = 1,
|
||||
.enable = s5pv310_clksrc_mask_peril1_ctrl,
|
||||
.enable = exynos4_clksrc_mask_peril1_ctrl,
|
||||
.ctrlbit = (1 << 20),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -926,7 +1020,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.clk = {
|
||||
.name = "sclk_spi",
|
||||
.id = 2,
|
||||
.enable = s5pv310_clksrc_mask_peril1_ctrl,
|
||||
.enable = exynos4_clksrc_mask_peril1_ctrl,
|
||||
.ctrlbit = (1 << 24),
|
||||
},
|
||||
.sources = &clkset_group,
|
||||
@ -945,7 +1039,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.name = "sclk_mmc",
|
||||
.id = 0,
|
||||
.parent = &clk_dout_mmc0.clk,
|
||||
.enable = s5pv310_clksrc_mask_fsys_ctrl,
|
||||
.enable = exynos4_clksrc_mask_fsys_ctrl,
|
||||
.ctrlbit = (1 << 0),
|
||||
},
|
||||
.reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 8, .size = 8 },
|
||||
@ -954,7 +1048,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.name = "sclk_mmc",
|
||||
.id = 1,
|
||||
.parent = &clk_dout_mmc1.clk,
|
||||
.enable = s5pv310_clksrc_mask_fsys_ctrl,
|
||||
.enable = exynos4_clksrc_mask_fsys_ctrl,
|
||||
.ctrlbit = (1 << 4),
|
||||
},
|
||||
.reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 24, .size = 8 },
|
||||
@ -963,7 +1057,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.name = "sclk_mmc",
|
||||
.id = 2,
|
||||
.parent = &clk_dout_mmc2.clk,
|
||||
.enable = s5pv310_clksrc_mask_fsys_ctrl,
|
||||
.enable = exynos4_clksrc_mask_fsys_ctrl,
|
||||
.ctrlbit = (1 << 8),
|
||||
},
|
||||
.reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 8, .size = 8 },
|
||||
@ -972,7 +1066,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.name = "sclk_mmc",
|
||||
.id = 3,
|
||||
.parent = &clk_dout_mmc3.clk,
|
||||
.enable = s5pv310_clksrc_mask_fsys_ctrl,
|
||||
.enable = exynos4_clksrc_mask_fsys_ctrl,
|
||||
.ctrlbit = (1 << 12),
|
||||
},
|
||||
.reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 24, .size = 8 },
|
||||
@ -981,7 +1075,7 @@ static struct clksrc_clk clksrcs[] = {
|
||||
.name = "sclk_mmc",
|
||||
.id = 4,
|
||||
.parent = &clk_dout_mmc4.clk,
|
||||
.enable = s5pv310_clksrc_mask_fsys_ctrl,
|
||||
.enable = exynos4_clksrc_mask_fsys_ctrl,
|
||||
.ctrlbit = (1 << 16),
|
||||
},
|
||||
.reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 8, .size = 8 },
|
||||
@ -1022,16 +1116,16 @@ static struct clksrc_clk *sysclks[] = {
|
||||
|
||||
static int xtal_rate;
|
||||
|
||||
static unsigned long s5pv310_fout_apll_get_rate(struct clk *clk)
|
||||
static unsigned long exynos4_fout_apll_get_rate(struct clk *clk)
|
||||
{
|
||||
return s5p_get_pll45xx(xtal_rate, __raw_readl(S5P_APLL_CON0), pll_4508);
|
||||
}
|
||||
|
||||
static struct clk_ops s5pv310_fout_apll_ops = {
|
||||
.get_rate = s5pv310_fout_apll_get_rate,
|
||||
static struct clk_ops exynos4_fout_apll_ops = {
|
||||
.get_rate = exynos4_fout_apll_get_rate,
|
||||
};
|
||||
|
||||
void __init_or_cpufreq s5pv310_setup_clocks(void)
|
||||
void __init_or_cpufreq exynos4_setup_clocks(void)
|
||||
{
|
||||
struct clk *xtal_clk;
|
||||
unsigned long apll;
|
||||
@ -1070,12 +1164,12 @@ void __init_or_cpufreq s5pv310_setup_clocks(void)
|
||||
vpll = s5p_get_pll46xx(vpllsrc, __raw_readl(S5P_VPLL_CON0),
|
||||
__raw_readl(S5P_VPLL_CON1), pll_4650);
|
||||
|
||||
clk_fout_apll.ops = &s5pv310_fout_apll_ops;
|
||||
clk_fout_apll.ops = &exynos4_fout_apll_ops;
|
||||
clk_fout_mpll.rate = mpll;
|
||||
clk_fout_epll.rate = epll;
|
||||
clk_fout_vpll.rate = vpll;
|
||||
|
||||
printk(KERN_INFO "S5PV310: PLL settings, A=%ld, M=%ld, E=%ld V=%ld",
|
||||
printk(KERN_INFO "EXYNOS4: PLL settings, A=%ld, M=%ld, E=%ld V=%ld",
|
||||
apll, mpll, epll, vpll);
|
||||
|
||||
armclk = clk_get_rate(&clk_armclk.clk);
|
||||
@ -1086,7 +1180,7 @@ void __init_or_cpufreq s5pv310_setup_clocks(void)
|
||||
aclk_160 = clk_get_rate(&clk_aclk_160.clk);
|
||||
aclk_133 = clk_get_rate(&clk_aclk_133.clk);
|
||||
|
||||
printk(KERN_INFO "S5PV310: ARMCLK=%ld, DMC=%ld, ACLK200=%ld\n"
|
||||
printk(KERN_INFO "EXYNOS4: ARMCLK=%ld, DMC=%ld, ACLK200=%ld\n"
|
||||
"ACLK100=%ld, ACLK160=%ld, ACLK133=%ld\n",
|
||||
armclk, sclk_dmc, aclk_200,
|
||||
aclk_100, aclk_160, aclk_133);
|
||||
@ -1103,7 +1197,7 @@ static struct clk *clks[] __initdata = {
|
||||
/* Nothing here yet */
|
||||
};
|
||||
|
||||
void __init s5pv310_register_clocks(void)
|
||||
void __init exynos4_register_clocks(void)
|
||||
{
|
||||
int ptr;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/* linux/arch/arm/mach-s5pv310/cpu.c
|
||||
/* linux/arch/arm/mach-exynos4/cpu.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@ -19,8 +19,10 @@
|
||||
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/clock.h>
|
||||
#include <plat/s5pv310.h>
|
||||
#include <plat/exynos4.h>
|
||||
#include <plat/sdhci.h>
|
||||
#include <plat/devs.h>
|
||||
#include <plat/fimc-core.h>
|
||||
|
||||
#include <mach/regs-irq.h>
|
||||
|
||||
@ -29,55 +31,60 @@ extern int combiner_init(unsigned int combiner_nr, void __iomem *base,
|
||||
extern void combiner_cascade_irq(unsigned int combiner_nr, unsigned int irq);
|
||||
|
||||
/* Initial IO mappings */
|
||||
static struct map_desc s5pv310_iodesc[] __initdata = {
|
||||
static struct map_desc exynos4_iodesc[] __initdata = {
|
||||
{
|
||||
.virtual = (unsigned long)S5P_VA_SYSTIMER,
|
||||
.pfn = __phys_to_pfn(EXYNOS4_PA_SYSTIMER),
|
||||
.length = SZ_4K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)S5P_VA_SYSRAM,
|
||||
.pfn = __phys_to_pfn(S5PV310_PA_SYSRAM),
|
||||
.pfn = __phys_to_pfn(EXYNOS4_PA_SYSRAM),
|
||||
.length = SZ_4K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)S5P_VA_CMU,
|
||||
.pfn = __phys_to_pfn(S5PV310_PA_CMU),
|
||||
.pfn = __phys_to_pfn(EXYNOS4_PA_CMU),
|
||||
.length = SZ_128K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)S5P_VA_PMU,
|
||||
.pfn = __phys_to_pfn(S5PV310_PA_PMU),
|
||||
.pfn = __phys_to_pfn(EXYNOS4_PA_PMU),
|
||||
.length = SZ_64K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)S5P_VA_COMBINER_BASE,
|
||||
.pfn = __phys_to_pfn(S5PV310_PA_COMBINER),
|
||||
.pfn = __phys_to_pfn(EXYNOS4_PA_COMBINER),
|
||||
.length = SZ_4K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)S5P_VA_COREPERI_BASE,
|
||||
.pfn = __phys_to_pfn(S5PV310_PA_COREPERI),
|
||||
.pfn = __phys_to_pfn(EXYNOS4_PA_COREPERI),
|
||||
.length = SZ_8K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)S5P_VA_L2CC,
|
||||
.pfn = __phys_to_pfn(S5PV310_PA_L2CC),
|
||||
.pfn = __phys_to_pfn(EXYNOS4_PA_L2CC),
|
||||
.length = SZ_4K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)S5P_VA_GPIO1,
|
||||
.pfn = __phys_to_pfn(S5PV310_PA_GPIO1),
|
||||
.pfn = __phys_to_pfn(EXYNOS4_PA_GPIO1),
|
||||
.length = SZ_4K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)S5P_VA_GPIO2,
|
||||
.pfn = __phys_to_pfn(S5PV310_PA_GPIO2),
|
||||
.pfn = __phys_to_pfn(EXYNOS4_PA_GPIO2),
|
||||
.length = SZ_4K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)S5P_VA_GPIO3,
|
||||
.pfn = __phys_to_pfn(S5PV310_PA_GPIO3),
|
||||
.pfn = __phys_to_pfn(EXYNOS4_PA_GPIO3),
|
||||
.length = SZ_256,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)S5P_VA_DMC0,
|
||||
.pfn = __phys_to_pfn(S5PV310_PA_DMC0),
|
||||
.pfn = __phys_to_pfn(EXYNOS4_PA_DMC0),
|
||||
.length = SZ_4K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
@ -87,13 +94,13 @@ static struct map_desc s5pv310_iodesc[] __initdata = {
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)S5P_VA_SROMC,
|
||||
.pfn = __phys_to_pfn(S5PV310_PA_SROMC),
|
||||
.pfn = __phys_to_pfn(EXYNOS4_PA_SROMC),
|
||||
.length = SZ_4K,
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
};
|
||||
|
||||
static void s5pv310_idle(void)
|
||||
static void exynos4_idle(void)
|
||||
{
|
||||
if (!need_resched())
|
||||
cpu_do_idle();
|
||||
@ -101,32 +108,38 @@ static void s5pv310_idle(void)
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
/* s5pv310_map_io
|
||||
/*
|
||||
* exynos4_map_io
|
||||
*
|
||||
* register the standard cpu IO areas
|
||||
*/
|
||||
void __init s5pv310_map_io(void)
|
||||
*/
|
||||
void __init exynos4_map_io(void)
|
||||
{
|
||||
iotable_init(s5pv310_iodesc, ARRAY_SIZE(s5pv310_iodesc));
|
||||
iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc));
|
||||
|
||||
/* initialize device information early */
|
||||
s5pv310_default_sdhci0();
|
||||
s5pv310_default_sdhci1();
|
||||
s5pv310_default_sdhci2();
|
||||
s5pv310_default_sdhci3();
|
||||
exynos4_default_sdhci0();
|
||||
exynos4_default_sdhci1();
|
||||
exynos4_default_sdhci2();
|
||||
exynos4_default_sdhci3();
|
||||
|
||||
s3c_fimc_setname(0, "exynos4-fimc");
|
||||
s3c_fimc_setname(1, "exynos4-fimc");
|
||||
s3c_fimc_setname(2, "exynos4-fimc");
|
||||
s3c_fimc_setname(3, "exynos4-fimc");
|
||||
}
|
||||
|
||||
void __init s5pv310_init_clocks(int xtal)
|
||||
void __init exynos4_init_clocks(int xtal)
|
||||
{
|
||||
printk(KERN_DEBUG "%s: initializing clocks\n", __func__);
|
||||
|
||||
s3c24xx_register_baseclocks(xtal);
|
||||
s5p_register_clocks(xtal);
|
||||
s5pv310_register_clocks();
|
||||
s5pv310_setup_clocks();
|
||||
exynos4_register_clocks();
|
||||
exynos4_setup_clocks();
|
||||
}
|
||||
|
||||
void __init s5pv310_init_irq(void)
|
||||
void __init exynos4_init_irq(void)
|
||||
{
|
||||
int irq;
|
||||
|
||||
@ -148,29 +161,29 @@ void __init s5pv310_init_irq(void)
|
||||
}
|
||||
|
||||
/* The parameters of s5p_init_irq() are for VIC init.
|
||||
* Theses parameters should be NULL and 0 because S5PV310
|
||||
* Theses parameters should be NULL and 0 because EXYNOS4
|
||||
* uses GIC instead of VIC.
|
||||
*/
|
||||
s5p_init_irq(NULL, 0);
|
||||
}
|
||||
|
||||
struct sysdev_class s5pv310_sysclass = {
|
||||
.name = "s5pv310-core",
|
||||
struct sysdev_class exynos4_sysclass = {
|
||||
.name = "exynos4-core",
|
||||
};
|
||||
|
||||
static struct sys_device s5pv310_sysdev = {
|
||||
.cls = &s5pv310_sysclass,
|
||||
static struct sys_device exynos4_sysdev = {
|
||||
.cls = &exynos4_sysclass,
|
||||
};
|
||||
|
||||
static int __init s5pv310_core_init(void)
|
||||
static int __init exynos4_core_init(void)
|
||||
{
|
||||
return sysdev_class_register(&s5pv310_sysclass);
|
||||
return sysdev_class_register(&exynos4_sysclass);
|
||||
}
|
||||
|
||||
core_initcall(s5pv310_core_init);
|
||||
core_initcall(exynos4_core_init);
|
||||
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
static int __init s5pv310_l2x0_cache_init(void)
|
||||
static int __init exynos4_l2x0_cache_init(void)
|
||||
{
|
||||
/* TAG, Data Latency Control: 2cycle */
|
||||
__raw_writel(0x110, S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL);
|
||||
@ -188,15 +201,15 @@ static int __init s5pv310_l2x0_cache_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
early_initcall(s5pv310_l2x0_cache_init);
|
||||
early_initcall(exynos4_l2x0_cache_init);
|
||||
#endif
|
||||
|
||||
int __init s5pv310_init(void)
|
||||
int __init exynos4_init(void)
|
||||
{
|
||||
printk(KERN_INFO "S5PV310: Initializing architecture\n");
|
||||
printk(KERN_INFO "EXYNOS4: Initializing architecture\n");
|
||||
|
||||
/* set idle function */
|
||||
pm_idle = s5pv310_idle;
|
||||
pm_idle = exynos4_idle;
|
||||
|
||||
return sysdev_register(&s5pv310_sysdev);
|
||||
return sysdev_register(&exynos4_sysdev);
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
/* linux/arch/arm/mach-s5pv310/cpufreq.c
|
||||
/* linux/arch/arm/mach-exynos4/cpufreq.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* S5PV310 - CPU frequency scaling support
|
||||
* EXYNOS4 - CPU frequency scaling support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@ -31,15 +31,13 @@ static struct clk *moutcore;
|
||||
static struct clk *mout_mpll;
|
||||
static struct clk *mout_apll;
|
||||
|
||||
#ifdef CONFIG_REGULATOR
|
||||
static struct regulator *arm_regulator;
|
||||
static struct regulator *int_regulator;
|
||||
#endif
|
||||
|
||||
static struct cpufreq_freqs freqs;
|
||||
static unsigned int memtype;
|
||||
|
||||
enum s5pv310_memory_type {
|
||||
enum exynos4_memory_type {
|
||||
DDR2 = 4,
|
||||
LPDDR2,
|
||||
DDR3,
|
||||
@ -49,7 +47,7 @@ enum cpufreq_level_index {
|
||||
L0, L1, L2, L3, CPUFREQ_LEVEL_END,
|
||||
};
|
||||
|
||||
static struct cpufreq_frequency_table s5pv310_freq_table[] = {
|
||||
static struct cpufreq_frequency_table exynos4_freq_table[] = {
|
||||
{L0, 1000*1000},
|
||||
{L1, 800*1000},
|
||||
{L2, 400*1000},
|
||||
@ -160,7 +158,7 @@ struct cpufreq_voltage_table {
|
||||
unsigned int int_volt;
|
||||
};
|
||||
|
||||
static struct cpufreq_voltage_table s5pv310_volt_table[CPUFREQ_LEVEL_END] = {
|
||||
static struct cpufreq_voltage_table exynos4_volt_table[CPUFREQ_LEVEL_END] = {
|
||||
{
|
||||
.index = L0,
|
||||
.arm_volt = 1200000,
|
||||
@ -180,7 +178,7 @@ static struct cpufreq_voltage_table s5pv310_volt_table[CPUFREQ_LEVEL_END] = {
|
||||
},
|
||||
};
|
||||
|
||||
static unsigned int s5pv310_apll_pms_table[CPUFREQ_LEVEL_END] = {
|
||||
static unsigned int exynos4_apll_pms_table[CPUFREQ_LEVEL_END] = {
|
||||
/* APLL FOUT L0: 1000MHz */
|
||||
((250 << 16) | (6 << 8) | 1),
|
||||
|
||||
@ -194,17 +192,17 @@ static unsigned int s5pv310_apll_pms_table[CPUFREQ_LEVEL_END] = {
|
||||
((200 << 16) | (6 << 8) | 4),
|
||||
};
|
||||
|
||||
int s5pv310_verify_speed(struct cpufreq_policy *policy)
|
||||
int exynos4_verify_speed(struct cpufreq_policy *policy)
|
||||
{
|
||||
return cpufreq_frequency_table_verify(policy, s5pv310_freq_table);
|
||||
return cpufreq_frequency_table_verify(policy, exynos4_freq_table);
|
||||
}
|
||||
|
||||
unsigned int s5pv310_getspeed(unsigned int cpu)
|
||||
unsigned int exynos4_getspeed(unsigned int cpu)
|
||||
{
|
||||
return clk_get_rate(cpu_clk) / 1000;
|
||||
}
|
||||
|
||||
void s5pv310_set_clkdiv(unsigned int div_index)
|
||||
void exynos4_set_clkdiv(unsigned int div_index)
|
||||
{
|
||||
unsigned int tmp;
|
||||
|
||||
@ -321,7 +319,7 @@ void s5pv310_set_clkdiv(unsigned int div_index)
|
||||
} while (tmp & 0x11);
|
||||
}
|
||||
|
||||
static void s5pv310_set_apll(unsigned int index)
|
||||
static void exynos4_set_apll(unsigned int index)
|
||||
{
|
||||
unsigned int tmp;
|
||||
|
||||
@ -340,7 +338,7 @@ static void s5pv310_set_apll(unsigned int index)
|
||||
/* 3. Change PLL PMS values */
|
||||
tmp = __raw_readl(S5P_APLL_CON0);
|
||||
tmp &= ~((0x3ff << 16) | (0x3f << 8) | (0x7 << 0));
|
||||
tmp |= s5pv310_apll_pms_table[index];
|
||||
tmp |= exynos4_apll_pms_table[index];
|
||||
__raw_writel(tmp, S5P_APLL_CON0);
|
||||
|
||||
/* 4. wait_lock_time */
|
||||
@ -357,99 +355,95 @@ static void s5pv310_set_apll(unsigned int index)
|
||||
} while (tmp != (0x1 << S5P_CLKSRC_CPU_MUXCORE_SHIFT));
|
||||
}
|
||||
|
||||
static void s5pv310_set_frequency(unsigned int old_index, unsigned int new_index)
|
||||
static void exynos4_set_frequency(unsigned int old_index, unsigned int new_index)
|
||||
{
|
||||
unsigned int tmp;
|
||||
|
||||
if (old_index > new_index) {
|
||||
/* The frequency changing to L0 needs to change apll */
|
||||
if (freqs.new == s5pv310_freq_table[L0].frequency) {
|
||||
if (freqs.new == exynos4_freq_table[L0].frequency) {
|
||||
/* 1. Change the system clock divider values */
|
||||
s5pv310_set_clkdiv(new_index);
|
||||
exynos4_set_clkdiv(new_index);
|
||||
|
||||
/* 2. Change the apll m,p,s value */
|
||||
s5pv310_set_apll(new_index);
|
||||
exynos4_set_apll(new_index);
|
||||
} else {
|
||||
/* 1. Change the system clock divider values */
|
||||
s5pv310_set_clkdiv(new_index);
|
||||
exynos4_set_clkdiv(new_index);
|
||||
|
||||
/* 2. Change just s value in apll m,p,s value */
|
||||
tmp = __raw_readl(S5P_APLL_CON0);
|
||||
tmp &= ~(0x7 << 0);
|
||||
tmp |= (s5pv310_apll_pms_table[new_index] & 0x7);
|
||||
tmp |= (exynos4_apll_pms_table[new_index] & 0x7);
|
||||
__raw_writel(tmp, S5P_APLL_CON0);
|
||||
}
|
||||
}
|
||||
|
||||
else if (old_index < new_index) {
|
||||
/* The frequency changing from L0 needs to change apll */
|
||||
if (freqs.old == s5pv310_freq_table[L0].frequency) {
|
||||
if (freqs.old == exynos4_freq_table[L0].frequency) {
|
||||
/* 1. Change the apll m,p,s value */
|
||||
s5pv310_set_apll(new_index);
|
||||
exynos4_set_apll(new_index);
|
||||
|
||||
/* 2. Change the system clock divider values */
|
||||
s5pv310_set_clkdiv(new_index);
|
||||
exynos4_set_clkdiv(new_index);
|
||||
} else {
|
||||
/* 1. Change just s value in apll m,p,s value */
|
||||
tmp = __raw_readl(S5P_APLL_CON0);
|
||||
tmp &= ~(0x7 << 0);
|
||||
tmp |= (s5pv310_apll_pms_table[new_index] & 0x7);
|
||||
tmp |= (exynos4_apll_pms_table[new_index] & 0x7);
|
||||
__raw_writel(tmp, S5P_APLL_CON0);
|
||||
|
||||
/* 2. Change the system clock divider values */
|
||||
s5pv310_set_clkdiv(new_index);
|
||||
exynos4_set_clkdiv(new_index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int s5pv310_target(struct cpufreq_policy *policy,
|
||||
static int exynos4_target(struct cpufreq_policy *policy,
|
||||
unsigned int target_freq,
|
||||
unsigned int relation)
|
||||
{
|
||||
unsigned int index, old_index;
|
||||
unsigned int arm_volt, int_volt;
|
||||
|
||||
freqs.old = s5pv310_getspeed(policy->cpu);
|
||||
freqs.old = exynos4_getspeed(policy->cpu);
|
||||
|
||||
if (cpufreq_frequency_table_target(policy, s5pv310_freq_table,
|
||||
if (cpufreq_frequency_table_target(policy, exynos4_freq_table,
|
||||
freqs.old, relation, &old_index))
|
||||
return -EINVAL;
|
||||
|
||||
if (cpufreq_frequency_table_target(policy, s5pv310_freq_table,
|
||||
if (cpufreq_frequency_table_target(policy, exynos4_freq_table,
|
||||
target_freq, relation, &index))
|
||||
return -EINVAL;
|
||||
|
||||
freqs.new = s5pv310_freq_table[index].frequency;
|
||||
freqs.new = exynos4_freq_table[index].frequency;
|
||||
freqs.cpu = policy->cpu;
|
||||
|
||||
if (freqs.new == freqs.old)
|
||||
return 0;
|
||||
|
||||
/* get the voltage value */
|
||||
arm_volt = s5pv310_volt_table[index].arm_volt;
|
||||
int_volt = s5pv310_volt_table[index].int_volt;
|
||||
arm_volt = exynos4_volt_table[index].arm_volt;
|
||||
int_volt = exynos4_volt_table[index].int_volt;
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
/* control regulator */
|
||||
if (freqs.new > freqs.old) {
|
||||
/* Voltage up */
|
||||
#ifdef CONFIG_REGULATOR
|
||||
regulator_set_voltage(arm_regulator, arm_volt, arm_volt);
|
||||
regulator_set_voltage(int_regulator, int_volt, int_volt);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Clock Configuration Procedure */
|
||||
s5pv310_set_frequency(old_index, index);
|
||||
exynos4_set_frequency(old_index, index);
|
||||
|
||||
/* control regulator */
|
||||
if (freqs.new < freqs.old) {
|
||||
/* Voltage down */
|
||||
#ifdef CONFIG_REGULATOR
|
||||
regulator_set_voltage(arm_regulator, arm_volt, arm_volt);
|
||||
regulator_set_voltage(int_regulator, int_volt, int_volt);
|
||||
#endif
|
||||
}
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
@ -458,51 +452,51 @@ static int s5pv310_target(struct cpufreq_policy *policy,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int s5pv310_cpufreq_suspend(struct cpufreq_policy *policy)
|
||||
static int exynos4_cpufreq_suspend(struct cpufreq_policy *policy)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int s5pv310_cpufreq_resume(struct cpufreq_policy *policy)
|
||||
static int exynos4_cpufreq_resume(struct cpufreq_policy *policy)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int s5pv310_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
||||
static int exynos4_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
policy->cur = policy->min = policy->max = s5pv310_getspeed(policy->cpu);
|
||||
policy->cur = policy->min = policy->max = exynos4_getspeed(policy->cpu);
|
||||
|
||||
cpufreq_frequency_table_get_attr(s5pv310_freq_table, policy->cpu);
|
||||
cpufreq_frequency_table_get_attr(exynos4_freq_table, policy->cpu);
|
||||
|
||||
/* set the transition latency value */
|
||||
policy->cpuinfo.transition_latency = 100000;
|
||||
|
||||
/*
|
||||
* S5PV310 multi-core processors has 2 cores
|
||||
* EXYNOS4 multi-core processors has 2 cores
|
||||
* that the frequency cannot be set independently.
|
||||
* Each cpu is bound to the same speed.
|
||||
* So the affected cpu is all of the cpus.
|
||||
*/
|
||||
cpumask_setall(policy->cpus);
|
||||
|
||||
return cpufreq_frequency_table_cpuinfo(policy, s5pv310_freq_table);
|
||||
return cpufreq_frequency_table_cpuinfo(policy, exynos4_freq_table);
|
||||
}
|
||||
|
||||
static struct cpufreq_driver s5pv310_driver = {
|
||||
static struct cpufreq_driver exynos4_driver = {
|
||||
.flags = CPUFREQ_STICKY,
|
||||
.verify = s5pv310_verify_speed,
|
||||
.target = s5pv310_target,
|
||||
.get = s5pv310_getspeed,
|
||||
.init = s5pv310_cpufreq_cpu_init,
|
||||
.name = "s5pv310_cpufreq",
|
||||
.verify = exynos4_verify_speed,
|
||||
.target = exynos4_target,
|
||||
.get = exynos4_getspeed,
|
||||
.init = exynos4_cpufreq_cpu_init,
|
||||
.name = "exynos4_cpufreq",
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = s5pv310_cpufreq_suspend,
|
||||
.resume = s5pv310_cpufreq_resume,
|
||||
.suspend = exynos4_cpufreq_suspend,
|
||||
.resume = exynos4_cpufreq_resume,
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init s5pv310_cpufreq_init(void)
|
||||
static int __init exynos4_cpufreq_init(void)
|
||||
{
|
||||
cpu_clk = clk_get(NULL, "armclk");
|
||||
if (IS_ERR(cpu_clk))
|
||||
@ -520,7 +514,6 @@ static int __init s5pv310_cpufreq_init(void)
|
||||
if (IS_ERR(mout_apll))
|
||||
goto out;
|
||||
|
||||
#ifdef CONFIG_REGULATOR
|
||||
arm_regulator = regulator_get(NULL, "vdd_arm");
|
||||
if (IS_ERR(arm_regulator)) {
|
||||
printk(KERN_ERR "failed to get resource %s\n", "vdd_arm");
|
||||
@ -532,7 +525,6 @@ static int __init s5pv310_cpufreq_init(void)
|
||||
printk(KERN_ERR "failed to get resource %s\n", "vdd_int");
|
||||
goto out;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Check DRAM type.
|
||||
@ -549,7 +541,7 @@ static int __init s5pv310_cpufreq_init(void)
|
||||
printk(KERN_DEBUG "%s: memtype= 0x%x\n", __func__, memtype);
|
||||
}
|
||||
|
||||
return cpufreq_register_driver(&s5pv310_driver);
|
||||
return cpufreq_register_driver(&exynos4_driver);
|
||||
|
||||
out:
|
||||
if (!IS_ERR(cpu_clk))
|
||||
@ -564,16 +556,14 @@ static int __init s5pv310_cpufreq_init(void)
|
||||
if (!IS_ERR(mout_apll))
|
||||
clk_put(mout_apll);
|
||||
|
||||
#ifdef CONFIG_REGULATOR
|
||||
if (!IS_ERR(arm_regulator))
|
||||
regulator_put(arm_regulator);
|
||||
|
||||
if (!IS_ERR(int_regulator))
|
||||
regulator_put(int_regulator);
|
||||
#endif
|
||||
|
||||
printk(KERN_ERR "%s: failed initialization\n", __func__);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
late_initcall(s5pv310_cpufreq_init);
|
||||
late_initcall(exynos4_cpufreq_init);
|
263
arch/arm/mach-exynos4/dev-ahci.c
Normal file
263
arch/arm/mach-exynos4/dev-ahci.c
Normal file
@ -0,0 +1,263 @@
|
||||
/* linux/arch/arm/mach-exynos4/dev-ahci.c
|
||||
*
|
||||
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* EXYNOS4 - AHCI support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/ahci_platform.h>
|
||||
|
||||
#include <plat/cpu.h>
|
||||
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/map.h>
|
||||
#include <mach/regs-pmu.h>
|
||||
|
||||
/* PHY Control Register */
|
||||
#define SATA_CTRL0 0x0
|
||||
/* PHY Link Control Register */
|
||||
#define SATA_CTRL1 0x4
|
||||
/* PHY Status Register */
|
||||
#define SATA_PHY_STATUS 0x8
|
||||
|
||||
#define SATA_CTRL0_RX_DATA_VALID(x) (x << 27)
|
||||
#define SATA_CTRL0_SPEED_MODE (1 << 26)
|
||||
#define SATA_CTRL0_M_PHY_CAL (1 << 19)
|
||||
#define SATA_CTRL0_PHY_CMU_RST_N (1 << 10)
|
||||
#define SATA_CTRL0_M_PHY_LN_RST_N (1 << 9)
|
||||
#define SATA_CTRL0_PHY_POR_N (1 << 8)
|
||||
|
||||
#define SATA_CTRL1_RST_PMALIVE_N (1 << 8)
|
||||
#define SATA_CTRL1_RST_RXOOB_N (1 << 7)
|
||||
#define SATA_CTRL1_RST_RX_N (1 << 6)
|
||||
#define SATA_CTRL1_RST_TX_N (1 << 5)
|
||||
|
||||
#define SATA_PHY_STATUS_CMU_OK (1 << 18)
|
||||
#define SATA_PHY_STATUS_LANE_OK (1 << 16)
|
||||
|
||||
#define LANE0 0x200
|
||||
#define COM_LANE 0xA00
|
||||
|
||||
#define HOST_PORTS_IMPL 0xC
|
||||
#define SCLK_SATA_FREQ (67 * MHZ)
|
||||
|
||||
static void __iomem *phy_base, *phy_ctrl;
|
||||
|
||||
struct phy_reg {
|
||||
u8 reg;
|
||||
u8 val;
|
||||
};
|
||||
|
||||
/* SATA PHY setup */
|
||||
static const struct phy_reg exynos4_sataphy_cmu[] = {
|
||||
{ 0x00, 0x06 }, { 0x02, 0x80 }, { 0x22, 0xa0 }, { 0x23, 0x42 },
|
||||
{ 0x2e, 0x04 }, { 0x2f, 0x50 }, { 0x30, 0x70 }, { 0x31, 0x02 },
|
||||
{ 0x32, 0x25 }, { 0x33, 0x40 }, { 0x34, 0x01 }, { 0x35, 0x40 },
|
||||
{ 0x61, 0x2e }, { 0x63, 0x5e }, { 0x65, 0x42 }, { 0x66, 0xd1 },
|
||||
{ 0x67, 0x20 }, { 0x68, 0x28 }, { 0x69, 0x78 }, { 0x6a, 0x04 },
|
||||
{ 0x6b, 0xc8 }, { 0x6c, 0x06 },
|
||||
};
|
||||
|
||||
static const struct phy_reg exynos4_sataphy_lane[] = {
|
||||
{ 0x00, 0x02 }, { 0x05, 0x10 }, { 0x06, 0x84 }, { 0x07, 0x04 },
|
||||
{ 0x08, 0xe0 }, { 0x10, 0x23 }, { 0x13, 0x05 }, { 0x14, 0x30 },
|
||||
{ 0x15, 0x00 }, { 0x17, 0x70 }, { 0x18, 0xf2 }, { 0x19, 0x1e },
|
||||
{ 0x1a, 0x18 }, { 0x1b, 0x0d }, { 0x1c, 0x08 }, { 0x50, 0x60 },
|
||||
{ 0x51, 0x0f },
|
||||
};
|
||||
|
||||
static const struct phy_reg exynos4_sataphy_comlane[] = {
|
||||
{ 0x01, 0x20 }, { 0x03, 0x40 }, { 0x04, 0x3c }, { 0x05, 0x7d },
|
||||
{ 0x06, 0x1d }, { 0x07, 0xcf }, { 0x08, 0x05 }, { 0x09, 0x63 },
|
||||
{ 0x0a, 0x29 }, { 0x0b, 0xc4 }, { 0x0c, 0x01 }, { 0x0d, 0x03 },
|
||||
{ 0x0e, 0x28 }, { 0x0f, 0x98 }, { 0x10, 0x19 }, { 0x13, 0x80 },
|
||||
{ 0x14, 0xf0 }, { 0x15, 0xd0 }, { 0x39, 0xa0 }, { 0x3a, 0xa0 },
|
||||
{ 0x3b, 0xa0 }, { 0x3c, 0xa0 }, { 0x3d, 0xa0 }, { 0x3e, 0xa0 },
|
||||
{ 0x3f, 0xa0 }, { 0x40, 0x42 }, { 0x42, 0x80 }, { 0x43, 0x58 },
|
||||
{ 0x45, 0x44 }, { 0x46, 0x5c }, { 0x47, 0x86 }, { 0x48, 0x8d },
|
||||
{ 0x49, 0xd0 }, { 0x4a, 0x09 }, { 0x4b, 0x90 }, { 0x4c, 0x07 },
|
||||
{ 0x4d, 0x40 }, { 0x51, 0x20 }, { 0x52, 0x32 }, { 0x7f, 0xd8 },
|
||||
{ 0x80, 0x1a }, { 0x81, 0xff }, { 0x82, 0x11 }, { 0x83, 0x00 },
|
||||
{ 0x87, 0xf0 }, { 0x87, 0xff }, { 0x87, 0xff }, { 0x87, 0xff },
|
||||
{ 0x87, 0xff }, { 0x8c, 0x1c }, { 0x8d, 0xc2 }, { 0x8e, 0xc3 },
|
||||
{ 0x8f, 0x3f }, { 0x90, 0x0a }, { 0x96, 0xf8 },
|
||||
};
|
||||
|
||||
static int wait_for_phy_ready(void __iomem *reg, unsigned long bit)
|
||||
{
|
||||
unsigned long timeout;
|
||||
|
||||
/* wait for maximum of 3 sec */
|
||||
timeout = jiffies + msecs_to_jiffies(3000);
|
||||
while (!(__raw_readl(reg) & bit)) {
|
||||
if (time_after(jiffies, timeout))
|
||||
return -1;
|
||||
cpu_relax();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ahci_phy_init(void __iomem *mmio)
|
||||
{
|
||||
int i, ctrl0;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(exynos4_sataphy_cmu); i++)
|
||||
__raw_writeb(exynos4_sataphy_cmu[i].val,
|
||||
phy_base + (exynos4_sataphy_cmu[i].reg * 4));
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(exynos4_sataphy_lane); i++)
|
||||
__raw_writeb(exynos4_sataphy_lane[i].val,
|
||||
phy_base + (LANE0 + exynos4_sataphy_lane[i].reg) * 4);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(exynos4_sataphy_comlane); i++)
|
||||
__raw_writeb(exynos4_sataphy_comlane[i].val,
|
||||
phy_base + (COM_LANE + exynos4_sataphy_comlane[i].reg) * 4);
|
||||
|
||||
__raw_writeb(0x07, phy_base);
|
||||
|
||||
ctrl0 = __raw_readl(phy_ctrl + SATA_CTRL0);
|
||||
ctrl0 |= SATA_CTRL0_PHY_CMU_RST_N;
|
||||
__raw_writel(ctrl0, phy_ctrl + SATA_CTRL0);
|
||||
|
||||
if (wait_for_phy_ready(phy_ctrl + SATA_PHY_STATUS,
|
||||
SATA_PHY_STATUS_CMU_OK) < 0) {
|
||||
printk(KERN_ERR "PHY CMU not ready\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
__raw_writeb(0x03, phy_base + (COM_LANE * 4));
|
||||
|
||||
ctrl0 = __raw_readl(phy_ctrl + SATA_CTRL0);
|
||||
ctrl0 |= SATA_CTRL0_M_PHY_LN_RST_N;
|
||||
__raw_writel(ctrl0, phy_ctrl + SATA_CTRL0);
|
||||
|
||||
if (wait_for_phy_ready(phy_ctrl + SATA_PHY_STATUS,
|
||||
SATA_PHY_STATUS_LANE_OK) < 0) {
|
||||
printk(KERN_ERR "PHY LANE not ready\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
ctrl0 = __raw_readl(phy_ctrl + SATA_CTRL0);
|
||||
ctrl0 |= SATA_CTRL0_M_PHY_CAL;
|
||||
__raw_writel(ctrl0, phy_ctrl + SATA_CTRL0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int exynos4_ahci_init(struct device *dev, void __iomem *mmio)
|
||||
{
|
||||
struct clk *clk_sata, *clk_sataphy, *clk_sclk_sata;
|
||||
int val, ret;
|
||||
|
||||
phy_base = ioremap(EXYNOS4_PA_SATAPHY, SZ_64K);
|
||||
if (!phy_base) {
|
||||
dev_err(dev, "failed to allocate memory for SATA PHY\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
phy_ctrl = ioremap(EXYNOS4_PA_SATAPHY_CTRL, SZ_16);
|
||||
if (!phy_ctrl) {
|
||||
dev_err(dev, "failed to allocate memory for SATA PHY CTRL\n");
|
||||
ret = -ENOMEM;
|
||||
goto err1;
|
||||
}
|
||||
|
||||
clk_sata = clk_get(dev, "sata");
|
||||
if (IS_ERR(clk_sata)) {
|
||||
dev_err(dev, "failed to get sata clock\n");
|
||||
ret = PTR_ERR(clk_sata);
|
||||
clk_sata = NULL;
|
||||
goto err2;
|
||||
|
||||
}
|
||||
clk_enable(clk_sata);
|
||||
|
||||
clk_sataphy = clk_get(dev, "sataphy");
|
||||
if (IS_ERR(clk_sataphy)) {
|
||||
dev_err(dev, "failed to get sataphy clock\n");
|
||||
ret = PTR_ERR(clk_sataphy);
|
||||
clk_sataphy = NULL;
|
||||
goto err3;
|
||||
}
|
||||
clk_enable(clk_sataphy);
|
||||
|
||||
clk_sclk_sata = clk_get(dev, "sclk_sata");
|
||||
if (IS_ERR(clk_sclk_sata)) {
|
||||
dev_err(dev, "failed to get sclk_sata\n");
|
||||
ret = PTR_ERR(clk_sclk_sata);
|
||||
clk_sclk_sata = NULL;
|
||||
goto err4;
|
||||
}
|
||||
clk_enable(clk_sclk_sata);
|
||||
clk_set_rate(clk_sclk_sata, SCLK_SATA_FREQ);
|
||||
|
||||
__raw_writel(S5P_PMU_SATA_PHY_CONTROL_EN, S5P_PMU_SATA_PHY_CONTROL);
|
||||
|
||||
/* Enable PHY link control */
|
||||
val = SATA_CTRL1_RST_PMALIVE_N | SATA_CTRL1_RST_RXOOB_N |
|
||||
SATA_CTRL1_RST_RX_N | SATA_CTRL1_RST_TX_N;
|
||||
__raw_writel(val, phy_ctrl + SATA_CTRL1);
|
||||
|
||||
/* Set communication speed as 3Gbps and enable PHY power */
|
||||
val = SATA_CTRL0_RX_DATA_VALID(3) | SATA_CTRL0_SPEED_MODE |
|
||||
SATA_CTRL0_PHY_POR_N;
|
||||
__raw_writel(val, phy_ctrl + SATA_CTRL0);
|
||||
|
||||
/* Port0 is available */
|
||||
__raw_writel(0x1, mmio + HOST_PORTS_IMPL);
|
||||
|
||||
return ahci_phy_init(mmio);
|
||||
|
||||
err4:
|
||||
clk_disable(clk_sataphy);
|
||||
clk_put(clk_sataphy);
|
||||
err3:
|
||||
clk_disable(clk_sata);
|
||||
clk_put(clk_sata);
|
||||
err2:
|
||||
iounmap(phy_ctrl);
|
||||
err1:
|
||||
iounmap(phy_base);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct ahci_platform_data exynos4_ahci_pdata = {
|
||||
.init = exynos4_ahci_init,
|
||||
};
|
||||
|
||||
static struct resource exynos4_ahci_resource[] = {
|
||||
[0] = {
|
||||
.start = EXYNOS4_PA_SATA,
|
||||
.end = EXYNOS4_PA_SATA + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = IRQ_SATA,
|
||||
.end = IRQ_SATA,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static u64 exynos4_ahci_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
struct platform_device exynos4_device_ahci = {
|
||||
.name = "ahci",
|
||||
.id = -1,
|
||||
.resource = exynos4_ahci_resource,
|
||||
.num_resources = ARRAY_SIZE(exynos4_ahci_resource),
|
||||
.dev = {
|
||||
.platform_data = &exynos4_ahci_pdata,
|
||||
.dma_mask = &exynos4_ahci_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
@ -1,4 +1,7 @@
|
||||
/* linux/arch/arm/mach-s5pv310/dev-audio.c
|
||||
/* linux/arch/arm/mach-exynos4/dev-audio.c
|
||||
*
|
||||
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co. Ltd
|
||||
* Jaswinder Singh <jassi.brar@samsung.com>
|
||||
@ -24,18 +27,18 @@ static const char *rclksrc[] = {
|
||||
[1] = "i2sclk",
|
||||
};
|
||||
|
||||
static int s5pv310_cfg_i2s(struct platform_device *pdev)
|
||||
static int exynos4_cfg_i2s(struct platform_device *pdev)
|
||||
{
|
||||
/* configure GPIO for i2s port */
|
||||
switch (pdev->id) {
|
||||
case 0:
|
||||
s3c_gpio_cfgpin_range(S5PV310_GPZ(0), 7, S3C_GPIO_SFN(2));
|
||||
s3c_gpio_cfgpin_range(EXYNOS4_GPZ(0), 7, S3C_GPIO_SFN(2));
|
||||
break;
|
||||
case 1:
|
||||
s3c_gpio_cfgpin_range(S5PV310_GPC0(0), 5, S3C_GPIO_SFN(2));
|
||||
s3c_gpio_cfgpin_range(EXYNOS4_GPC0(0), 5, S3C_GPIO_SFN(2));
|
||||
break;
|
||||
case 2:
|
||||
s3c_gpio_cfgpin_range(S5PV310_GPC1(0), 5, S3C_GPIO_SFN(4));
|
||||
s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 5, S3C_GPIO_SFN(4));
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "Invalid Device %d\n", pdev->id);
|
||||
@ -46,7 +49,7 @@ static int s5pv310_cfg_i2s(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
static struct s3c_audio_pdata i2sv5_pdata = {
|
||||
.cfg_gpio = s5pv310_cfg_i2s,
|
||||
.cfg_gpio = exynos4_cfg_i2s,
|
||||
.type = {
|
||||
.i2s = {
|
||||
.quirks = QUIRK_PRI_6CHAN | QUIRK_SEC_DAI
|
||||
@ -56,10 +59,10 @@ static struct s3c_audio_pdata i2sv5_pdata = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource s5pv310_i2s0_resource[] = {
|
||||
static struct resource exynos4_i2s0_resource[] = {
|
||||
[0] = {
|
||||
.start = S5PV310_PA_I2S0,
|
||||
.end = S5PV310_PA_I2S0 + 0x100 - 1,
|
||||
.start = EXYNOS4_PA_I2S0,
|
||||
.end = EXYNOS4_PA_I2S0 + 0x100 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
@ -79,11 +82,11 @@ static struct resource s5pv310_i2s0_resource[] = {
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device s5pv310_device_i2s0 = {
|
||||
struct platform_device exynos4_device_i2s0 = {
|
||||
.name = "samsung-i2s",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(s5pv310_i2s0_resource),
|
||||
.resource = s5pv310_i2s0_resource,
|
||||
.num_resources = ARRAY_SIZE(exynos4_i2s0_resource),
|
||||
.resource = exynos4_i2s0_resource,
|
||||
.dev = {
|
||||
.platform_data = &i2sv5_pdata,
|
||||
},
|
||||
@ -95,7 +98,7 @@ static const char *rclksrc_v3[] = {
|
||||
};
|
||||
|
||||
static struct s3c_audio_pdata i2sv3_pdata = {
|
||||
.cfg_gpio = s5pv310_cfg_i2s,
|
||||
.cfg_gpio = exynos4_cfg_i2s,
|
||||
.type = {
|
||||
.i2s = {
|
||||
.quirks = QUIRK_NO_MUXPSR,
|
||||
@ -104,10 +107,10 @@ static struct s3c_audio_pdata i2sv3_pdata = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource s5pv310_i2s1_resource[] = {
|
||||
static struct resource exynos4_i2s1_resource[] = {
|
||||
[0] = {
|
||||
.start = S5PV310_PA_I2S1,
|
||||
.end = S5PV310_PA_I2S1 + 0x100 - 1,
|
||||
.start = EXYNOS4_PA_I2S1,
|
||||
.end = EXYNOS4_PA_I2S1 + 0x100 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
@ -122,20 +125,20 @@ static struct resource s5pv310_i2s1_resource[] = {
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device s5pv310_device_i2s1 = {
|
||||
struct platform_device exynos4_device_i2s1 = {
|
||||
.name = "samsung-i2s",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(s5pv310_i2s1_resource),
|
||||
.resource = s5pv310_i2s1_resource,
|
||||
.num_resources = ARRAY_SIZE(exynos4_i2s1_resource),
|
||||
.resource = exynos4_i2s1_resource,
|
||||
.dev = {
|
||||
.platform_data = &i2sv3_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource s5pv310_i2s2_resource[] = {
|
||||
static struct resource exynos4_i2s2_resource[] = {
|
||||
[0] = {
|
||||
.start = S5PV310_PA_I2S2,
|
||||
.end = S5PV310_PA_I2S2 + 0x100 - 1,
|
||||
.start = EXYNOS4_PA_I2S2,
|
||||
.end = EXYNOS4_PA_I2S2 + 0x100 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
@ -150,11 +153,11 @@ static struct resource s5pv310_i2s2_resource[] = {
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device s5pv310_device_i2s2 = {
|
||||
struct platform_device exynos4_device_i2s2 = {
|
||||
.name = "samsung-i2s",
|
||||
.id = 2,
|
||||
.num_resources = ARRAY_SIZE(s5pv310_i2s2_resource),
|
||||
.resource = s5pv310_i2s2_resource,
|
||||
.num_resources = ARRAY_SIZE(exynos4_i2s2_resource),
|
||||
.resource = exynos4_i2s2_resource,
|
||||
.dev = {
|
||||
.platform_data = &i2sv3_pdata,
|
||||
},
|
||||
@ -162,17 +165,17 @@ struct platform_device s5pv310_device_i2s2 = {
|
||||
|
||||
/* PCM Controller platform_devices */
|
||||
|
||||
static int s5pv310_pcm_cfg_gpio(struct platform_device *pdev)
|
||||
static int exynos4_pcm_cfg_gpio(struct platform_device *pdev)
|
||||
{
|
||||
switch (pdev->id) {
|
||||
case 0:
|
||||
s3c_gpio_cfgpin_range(S5PV310_GPZ(0), 5, S3C_GPIO_SFN(3));
|
||||
s3c_gpio_cfgpin_range(EXYNOS4_GPZ(0), 5, S3C_GPIO_SFN(3));
|
||||
break;
|
||||
case 1:
|
||||
s3c_gpio_cfgpin_range(S5PV310_GPC0(0), 5, S3C_GPIO_SFN(3));
|
||||
s3c_gpio_cfgpin_range(EXYNOS4_GPC0(0), 5, S3C_GPIO_SFN(3));
|
||||
break;
|
||||
case 2:
|
||||
s3c_gpio_cfgpin_range(S5PV310_GPC1(0), 5, S3C_GPIO_SFN(3));
|
||||
s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 5, S3C_GPIO_SFN(3));
|
||||
break;
|
||||
default:
|
||||
printk(KERN_DEBUG "Invalid PCM Controller number!");
|
||||
@ -183,13 +186,13 @@ static int s5pv310_pcm_cfg_gpio(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
static struct s3c_audio_pdata s3c_pcm_pdata = {
|
||||
.cfg_gpio = s5pv310_pcm_cfg_gpio,
|
||||
.cfg_gpio = exynos4_pcm_cfg_gpio,
|
||||
};
|
||||
|
||||
static struct resource s5pv310_pcm0_resource[] = {
|
||||
static struct resource exynos4_pcm0_resource[] = {
|
||||
[0] = {
|
||||
.start = S5PV310_PA_PCM0,
|
||||
.end = S5PV310_PA_PCM0 + 0x100 - 1,
|
||||
.start = EXYNOS4_PA_PCM0,
|
||||
.end = EXYNOS4_PA_PCM0 + 0x100 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
@ -204,20 +207,20 @@ static struct resource s5pv310_pcm0_resource[] = {
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device s5pv310_device_pcm0 = {
|
||||
struct platform_device exynos4_device_pcm0 = {
|
||||
.name = "samsung-pcm",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(s5pv310_pcm0_resource),
|
||||
.resource = s5pv310_pcm0_resource,
|
||||
.num_resources = ARRAY_SIZE(exynos4_pcm0_resource),
|
||||
.resource = exynos4_pcm0_resource,
|
||||
.dev = {
|
||||
.platform_data = &s3c_pcm_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource s5pv310_pcm1_resource[] = {
|
||||
static struct resource exynos4_pcm1_resource[] = {
|
||||
[0] = {
|
||||
.start = S5PV310_PA_PCM1,
|
||||
.end = S5PV310_PA_PCM1 + 0x100 - 1,
|
||||
.start = EXYNOS4_PA_PCM1,
|
||||
.end = EXYNOS4_PA_PCM1 + 0x100 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
@ -232,20 +235,20 @@ static struct resource s5pv310_pcm1_resource[] = {
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device s5pv310_device_pcm1 = {
|
||||
struct platform_device exynos4_device_pcm1 = {
|
||||
.name = "samsung-pcm",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(s5pv310_pcm1_resource),
|
||||
.resource = s5pv310_pcm1_resource,
|
||||
.num_resources = ARRAY_SIZE(exynos4_pcm1_resource),
|
||||
.resource = exynos4_pcm1_resource,
|
||||
.dev = {
|
||||
.platform_data = &s3c_pcm_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource s5pv310_pcm2_resource[] = {
|
||||
static struct resource exynos4_pcm2_resource[] = {
|
||||
[0] = {
|
||||
.start = S5PV310_PA_PCM2,
|
||||
.end = S5PV310_PA_PCM2 + 0x100 - 1,
|
||||
.start = EXYNOS4_PA_PCM2,
|
||||
.end = EXYNOS4_PA_PCM2 + 0x100 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
@ -260,11 +263,11 @@ static struct resource s5pv310_pcm2_resource[] = {
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device s5pv310_device_pcm2 = {
|
||||
struct platform_device exynos4_device_pcm2 = {
|
||||
.name = "samsung-pcm",
|
||||
.id = 2,
|
||||
.num_resources = ARRAY_SIZE(s5pv310_pcm2_resource),
|
||||
.resource = s5pv310_pcm2_resource,
|
||||
.num_resources = ARRAY_SIZE(exynos4_pcm2_resource),
|
||||
.resource = exynos4_pcm2_resource,
|
||||
.dev = {
|
||||
.platform_data = &s3c_pcm_pdata,
|
||||
},
|
||||
@ -272,15 +275,15 @@ struct platform_device s5pv310_device_pcm2 = {
|
||||
|
||||
/* AC97 Controller platform devices */
|
||||
|
||||
static int s5pv310_ac97_cfg_gpio(struct platform_device *pdev)
|
||||
static int exynos4_ac97_cfg_gpio(struct platform_device *pdev)
|
||||
{
|
||||
return s3c_gpio_cfgpin_range(S5PV310_GPC0(0), 5, S3C_GPIO_SFN(4));
|
||||
return s3c_gpio_cfgpin_range(EXYNOS4_GPC0(0), 5, S3C_GPIO_SFN(4));
|
||||
}
|
||||
|
||||
static struct resource s5pv310_ac97_resource[] = {
|
||||
static struct resource exynos4_ac97_resource[] = {
|
||||
[0] = {
|
||||
.start = S5PV310_PA_AC97,
|
||||
.end = S5PV310_PA_AC97 + 0x100 - 1,
|
||||
.start = EXYNOS4_PA_AC97,
|
||||
.end = EXYNOS4_PA_AC97 + 0x100 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
@ -306,36 +309,36 @@ static struct resource s5pv310_ac97_resource[] = {
|
||||
};
|
||||
|
||||
static struct s3c_audio_pdata s3c_ac97_pdata = {
|
||||
.cfg_gpio = s5pv310_ac97_cfg_gpio,
|
||||
.cfg_gpio = exynos4_ac97_cfg_gpio,
|
||||
};
|
||||
|
||||
static u64 s5pv310_ac97_dmamask = DMA_BIT_MASK(32);
|
||||
static u64 exynos4_ac97_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
struct platform_device s5pv310_device_ac97 = {
|
||||
struct platform_device exynos4_device_ac97 = {
|
||||
.name = "samsung-ac97",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(s5pv310_ac97_resource),
|
||||
.resource = s5pv310_ac97_resource,
|
||||
.num_resources = ARRAY_SIZE(exynos4_ac97_resource),
|
||||
.resource = exynos4_ac97_resource,
|
||||
.dev = {
|
||||
.platform_data = &s3c_ac97_pdata,
|
||||
.dma_mask = &s5pv310_ac97_dmamask,
|
||||
.dma_mask = &exynos4_ac97_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
/* S/PDIF Controller platform_device */
|
||||
|
||||
static int s5pv310_spdif_cfg_gpio(struct platform_device *pdev)
|
||||
static int exynos4_spdif_cfg_gpio(struct platform_device *pdev)
|
||||
{
|
||||
s3c_gpio_cfgpin_range(S5PV310_GPC1(0), 2, S3C_GPIO_SFN(3));
|
||||
s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 2, S3C_GPIO_SFN(3));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct resource s5pv310_spdif_resource[] = {
|
||||
static struct resource exynos4_spdif_resource[] = {
|
||||
[0] = {
|
||||
.start = S5PV310_PA_SPDIF,
|
||||
.end = S5PV310_PA_SPDIF + 0x100 - 1,
|
||||
.start = EXYNOS4_PA_SPDIF,
|
||||
.end = EXYNOS4_PA_SPDIF + 0x100 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
@ -346,19 +349,19 @@ static struct resource s5pv310_spdif_resource[] = {
|
||||
};
|
||||
|
||||
static struct s3c_audio_pdata samsung_spdif_pdata = {
|
||||
.cfg_gpio = s5pv310_spdif_cfg_gpio,
|
||||
.cfg_gpio = exynos4_spdif_cfg_gpio,
|
||||
};
|
||||
|
||||
static u64 s5pv310_spdif_dmamask = DMA_BIT_MASK(32);
|
||||
static u64 exynos4_spdif_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
struct platform_device s5pv310_device_spdif = {
|
||||
struct platform_device exynos4_device_spdif = {
|
||||
.name = "samsung-spdif",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(s5pv310_spdif_resource),
|
||||
.resource = s5pv310_spdif_resource,
|
||||
.num_resources = ARRAY_SIZE(exynos4_spdif_resource),
|
||||
.resource = exynos4_spdif_resource,
|
||||
.dev = {
|
||||
.platform_data = &samsung_spdif_pdata,
|
||||
.dma_mask = &s5pv310_spdif_dmamask,
|
||||
.dma_mask = &exynos4_spdif_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
@ -1,9 +1,9 @@
|
||||
/* linux/arch/arm/mach-s5pv310/dev-pd.c
|
||||
/* linux/arch/arm/mach-exynos4/dev-pd.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* S5PV310 - Power Domain support
|
||||
* EXYNOS4 - Power Domain support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@ -19,7 +19,7 @@
|
||||
|
||||
#include <plat/pd.h>
|
||||
|
||||
static int s5pv310_pd_enable(struct device *dev)
|
||||
static int exynos4_pd_enable(struct device *dev)
|
||||
{
|
||||
struct samsung_pd_info *pdata = dev->platform_data;
|
||||
u32 timeout;
|
||||
@ -42,7 +42,7 @@ static int s5pv310_pd_enable(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int s5pv310_pd_disable(struct device *dev)
|
||||
static int exynos4_pd_disable(struct device *dev)
|
||||
{
|
||||
struct samsung_pd_info *pdata = dev->platform_data;
|
||||
u32 timeout;
|
||||
@ -64,14 +64,14 @@ static int s5pv310_pd_disable(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct platform_device s5pv310_device_pd[] = {
|
||||
struct platform_device exynos4_device_pd[] = {
|
||||
{
|
||||
.name = "samsung-pd",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &(struct samsung_pd_info) {
|
||||
.enable = s5pv310_pd_enable,
|
||||
.disable = s5pv310_pd_disable,
|
||||
.enable = exynos4_pd_enable,
|
||||
.disable = exynos4_pd_disable,
|
||||
.base = S5P_PMU_MFC_CONF,
|
||||
},
|
||||
},
|
||||
@ -80,8 +80,8 @@ struct platform_device s5pv310_device_pd[] = {
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &(struct samsung_pd_info) {
|
||||
.enable = s5pv310_pd_enable,
|
||||
.disable = s5pv310_pd_disable,
|
||||
.enable = exynos4_pd_enable,
|
||||
.disable = exynos4_pd_disable,
|
||||
.base = S5P_PMU_G3D_CONF,
|
||||
},
|
||||
},
|
||||
@ -90,8 +90,8 @@ struct platform_device s5pv310_device_pd[] = {
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.platform_data = &(struct samsung_pd_info) {
|
||||
.enable = s5pv310_pd_enable,
|
||||
.disable = s5pv310_pd_disable,
|
||||
.enable = exynos4_pd_enable,
|
||||
.disable = exynos4_pd_disable,
|
||||
.base = S5P_PMU_LCD0_CONF,
|
||||
},
|
||||
},
|
||||
@ -100,8 +100,8 @@ struct platform_device s5pv310_device_pd[] = {
|
||||
.id = 3,
|
||||
.dev = {
|
||||
.platform_data = &(struct samsung_pd_info) {
|
||||
.enable = s5pv310_pd_enable,
|
||||
.disable = s5pv310_pd_disable,
|
||||
.enable = exynos4_pd_enable,
|
||||
.disable = exynos4_pd_disable,
|
||||
.base = S5P_PMU_LCD1_CONF,
|
||||
},
|
||||
},
|
||||
@ -110,8 +110,8 @@ struct platform_device s5pv310_device_pd[] = {
|
||||
.id = 4,
|
||||
.dev = {
|
||||
.platform_data = &(struct samsung_pd_info) {
|
||||
.enable = s5pv310_pd_enable,
|
||||
.disable = s5pv310_pd_disable,
|
||||
.enable = exynos4_pd_enable,
|
||||
.disable = exynos4_pd_disable,
|
||||
.base = S5P_PMU_TV_CONF,
|
||||
},
|
||||
},
|
||||
@ -120,8 +120,8 @@ struct platform_device s5pv310_device_pd[] = {
|
||||
.id = 5,
|
||||
.dev = {
|
||||
.platform_data = &(struct samsung_pd_info) {
|
||||
.enable = s5pv310_pd_enable,
|
||||
.disable = s5pv310_pd_disable,
|
||||
.enable = exynos4_pd_enable,
|
||||
.disable = exynos4_pd_disable,
|
||||
.base = S5P_PMU_CAM_CONF,
|
||||
},
|
||||
},
|
||||
@ -130,8 +130,8 @@ struct platform_device s5pv310_device_pd[] = {
|
||||
.id = 6,
|
||||
.dev = {
|
||||
.platform_data = &(struct samsung_pd_info) {
|
||||
.enable = s5pv310_pd_enable,
|
||||
.disable = s5pv310_pd_disable,
|
||||
.enable = exynos4_pd_enable,
|
||||
.disable = exynos4_pd_disable,
|
||||
.base = S5P_PMU_GPS_CONF,
|
||||
},
|
||||
},
|
@ -1,8 +1,10 @@
|
||||
/* linux/arch/arm/mach-s5pv310/dev-sysmmu.c
|
||||
/* linux/arch/arm/mach-exynos4/dev-sysmmu.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* EXYNOS4 - System MMU support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
@ -13,11 +15,33 @@
|
||||
|
||||
#include <mach/map.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/sysmmu.h>
|
||||
#include <plat/s5p-clock.h>
|
||||
|
||||
static struct resource s5pv310_sysmmu_resource[] = {
|
||||
/* These names must be equal to the clock names in mach-exynos4/clock.c */
|
||||
const char *sysmmu_ips_name[EXYNOS4_SYSMMU_TOTAL_IPNUM] = {
|
||||
"SYSMMU_MDMA" ,
|
||||
"SYSMMU_SSS" ,
|
||||
"SYSMMU_FIMC0" ,
|
||||
"SYSMMU_FIMC1" ,
|
||||
"SYSMMU_FIMC2" ,
|
||||
"SYSMMU_FIMC3" ,
|
||||
"SYSMMU_JPEG" ,
|
||||
"SYSMMU_FIMD0" ,
|
||||
"SYSMMU_FIMD1" ,
|
||||
"SYSMMU_PCIe" ,
|
||||
"SYSMMU_G2D" ,
|
||||
"SYSMMU_ROTATOR",
|
||||
"SYSMMU_MDMA2" ,
|
||||
"SYSMMU_TV" ,
|
||||
"SYSMMU_MFC_L" ,
|
||||
"SYSMMU_MFC_R" ,
|
||||
};
|
||||
|
||||
static struct resource exynos4_sysmmu_resource[] = {
|
||||
[0] = {
|
||||
.start = S5PV310_PA_SYSMMU_MDMA,
|
||||
.end = S5PV310_PA_SYSMMU_MDMA + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_MDMA,
|
||||
.end = EXYNOS4_PA_SYSMMU_MDMA + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
@ -26,8 +50,8 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = S5PV310_PA_SYSMMU_SSS,
|
||||
.end = S5PV310_PA_SYSMMU_SSS + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_SSS,
|
||||
.end = EXYNOS4_PA_SYSMMU_SSS + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[3] = {
|
||||
@ -36,8 +60,8 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[4] = {
|
||||
.start = S5PV310_PA_SYSMMU_FIMC0,
|
||||
.end = S5PV310_PA_SYSMMU_FIMC0 + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_FIMC0,
|
||||
.end = EXYNOS4_PA_SYSMMU_FIMC0 + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[5] = {
|
||||
@ -46,8 +70,8 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[6] = {
|
||||
.start = S5PV310_PA_SYSMMU_FIMC1,
|
||||
.end = S5PV310_PA_SYSMMU_FIMC1 + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_FIMC1,
|
||||
.end = EXYNOS4_PA_SYSMMU_FIMC1 + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[7] = {
|
||||
@ -56,8 +80,8 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[8] = {
|
||||
.start = S5PV310_PA_SYSMMU_FIMC2,
|
||||
.end = S5PV310_PA_SYSMMU_FIMC2 + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_FIMC2,
|
||||
.end = EXYNOS4_PA_SYSMMU_FIMC2 + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[9] = {
|
||||
@ -66,8 +90,8 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[10] = {
|
||||
.start = S5PV310_PA_SYSMMU_FIMC3,
|
||||
.end = S5PV310_PA_SYSMMU_FIMC3 + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_FIMC3,
|
||||
.end = EXYNOS4_PA_SYSMMU_FIMC3 + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[11] = {
|
||||
@ -76,8 +100,8 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[12] = {
|
||||
.start = S5PV310_PA_SYSMMU_JPEG,
|
||||
.end = S5PV310_PA_SYSMMU_JPEG + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_JPEG,
|
||||
.end = EXYNOS4_PA_SYSMMU_JPEG + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[13] = {
|
||||
@ -86,8 +110,8 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[14] = {
|
||||
.start = S5PV310_PA_SYSMMU_FIMD0,
|
||||
.end = S5PV310_PA_SYSMMU_FIMD0 + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_FIMD0,
|
||||
.end = EXYNOS4_PA_SYSMMU_FIMD0 + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[15] = {
|
||||
@ -96,8 +120,8 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[16] = {
|
||||
.start = S5PV310_PA_SYSMMU_FIMD1,
|
||||
.end = S5PV310_PA_SYSMMU_FIMD1 + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_FIMD1,
|
||||
.end = EXYNOS4_PA_SYSMMU_FIMD1 + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[17] = {
|
||||
@ -106,8 +130,8 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[18] = {
|
||||
.start = S5PV310_PA_SYSMMU_PCIe,
|
||||
.end = S5PV310_PA_SYSMMU_PCIe + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_PCIe,
|
||||
.end = EXYNOS4_PA_SYSMMU_PCIe + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[19] = {
|
||||
@ -116,8 +140,8 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[20] = {
|
||||
.start = S5PV310_PA_SYSMMU_G2D,
|
||||
.end = S5PV310_PA_SYSMMU_G2D + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_G2D,
|
||||
.end = EXYNOS4_PA_SYSMMU_G2D + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[21] = {
|
||||
@ -126,8 +150,8 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[22] = {
|
||||
.start = S5PV310_PA_SYSMMU_ROTATOR,
|
||||
.end = S5PV310_PA_SYSMMU_ROTATOR + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_ROTATOR,
|
||||
.end = EXYNOS4_PA_SYSMMU_ROTATOR + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[23] = {
|
||||
@ -136,8 +160,8 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[24] = {
|
||||
.start = S5PV310_PA_SYSMMU_MDMA2,
|
||||
.end = S5PV310_PA_SYSMMU_MDMA2 + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_MDMA2,
|
||||
.end = EXYNOS4_PA_SYSMMU_MDMA2 + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[25] = {
|
||||
@ -146,8 +170,8 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[26] = {
|
||||
.start = S5PV310_PA_SYSMMU_TV,
|
||||
.end = S5PV310_PA_SYSMMU_TV + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_TV,
|
||||
.end = EXYNOS4_PA_SYSMMU_TV + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[27] = {
|
||||
@ -156,8 +180,8 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[28] = {
|
||||
.start = S5PV310_PA_SYSMMU_MFC_L,
|
||||
.end = S5PV310_PA_SYSMMU_MFC_L + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_MFC_L,
|
||||
.end = EXYNOS4_PA_SYSMMU_MFC_L + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[29] = {
|
||||
@ -166,8 +190,8 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[30] = {
|
||||
.start = S5PV310_PA_SYSMMU_MFC_R,
|
||||
.end = S5PV310_PA_SYSMMU_MFC_R + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SYSMMU_MFC_R,
|
||||
.end = EXYNOS4_PA_SYSMMU_MFC_R + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[31] = {
|
||||
@ -177,11 +201,32 @@ static struct resource s5pv310_sysmmu_resource[] = {
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device s5pv310_device_sysmmu = {
|
||||
struct platform_device exynos4_device_sysmmu = {
|
||||
.name = "s5p-sysmmu",
|
||||
.id = 32,
|
||||
.num_resources = ARRAY_SIZE(s5pv310_sysmmu_resource),
|
||||
.resource = s5pv310_sysmmu_resource,
|
||||
.num_resources = ARRAY_SIZE(exynos4_sysmmu_resource),
|
||||
.resource = exynos4_sysmmu_resource,
|
||||
};
|
||||
EXPORT_SYMBOL(exynos4_device_sysmmu);
|
||||
|
||||
EXPORT_SYMBOL(s5pv310_device_sysmmu);
|
||||
static struct clk *sysmmu_clk[S5P_SYSMMU_TOTAL_IPNUM];
|
||||
void sysmmu_clk_init(struct device *dev, sysmmu_ips ips)
|
||||
{
|
||||
sysmmu_clk[ips] = clk_get(dev, sysmmu_ips_name[ips]);
|
||||
if (IS_ERR(sysmmu_clk[ips]))
|
||||
sysmmu_clk[ips] = NULL;
|
||||
else
|
||||
clk_put(sysmmu_clk[ips]);
|
||||
}
|
||||
|
||||
void sysmmu_clk_enable(sysmmu_ips ips)
|
||||
{
|
||||
if (sysmmu_clk[ips])
|
||||
clk_enable(sysmmu_clk[ips]);
|
||||
}
|
||||
|
||||
void sysmmu_clk_disable(sysmmu_ips ips)
|
||||
{
|
||||
if (sysmmu_clk[ips])
|
||||
clk_disable(sysmmu_clk[ips]);
|
||||
}
|
@ -1,4 +1,8 @@
|
||||
/*
|
||||
/* linux/arch/arm/mach-exynos4/dma.c
|
||||
*
|
||||
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* Copyright (C) 2010 Samsung Electronics Co. Ltd.
|
||||
* Jaswinder Singh <jassi.brar@samsung.com>
|
||||
*
|
||||
@ -30,10 +34,10 @@
|
||||
|
||||
static u64 dma_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource s5pv310_pdma0_resource[] = {
|
||||
static struct resource exynos4_pdma0_resource[] = {
|
||||
[0] = {
|
||||
.start = S5PV310_PA_PDMA0,
|
||||
.end = S5PV310_PA_PDMA0 + SZ_4K,
|
||||
.start = EXYNOS4_PA_PDMA0,
|
||||
.end = EXYNOS4_PA_PDMA0 + SZ_4K,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
@ -43,7 +47,7 @@ static struct resource s5pv310_pdma0_resource[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct s3c_pl330_platdata s5pv310_pdma0_pdata = {
|
||||
static struct s3c_pl330_platdata exynos4_pdma0_pdata = {
|
||||
.peri = {
|
||||
[0] = DMACH_PCM0_RX,
|
||||
[1] = DMACH_PCM0_TX,
|
||||
@ -80,22 +84,22 @@ static struct s3c_pl330_platdata s5pv310_pdma0_pdata = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device s5pv310_device_pdma0 = {
|
||||
static struct platform_device exynos4_device_pdma0 = {
|
||||
.name = "s3c-pl330",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(s5pv310_pdma0_resource),
|
||||
.resource = s5pv310_pdma0_resource,
|
||||
.num_resources = ARRAY_SIZE(exynos4_pdma0_resource),
|
||||
.resource = exynos4_pdma0_resource,
|
||||
.dev = {
|
||||
.dma_mask = &dma_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &s5pv310_pdma0_pdata,
|
||||
.platform_data = &exynos4_pdma0_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource s5pv310_pdma1_resource[] = {
|
||||
static struct resource exynos4_pdma1_resource[] = {
|
||||
[0] = {
|
||||
.start = S5PV310_PA_PDMA1,
|
||||
.end = S5PV310_PA_PDMA1 + SZ_4K,
|
||||
.start = EXYNOS4_PA_PDMA1,
|
||||
.end = EXYNOS4_PA_PDMA1 + SZ_4K,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
@ -105,7 +109,7 @@ static struct resource s5pv310_pdma1_resource[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct s3c_pl330_platdata s5pv310_pdma1_pdata = {
|
||||
static struct s3c_pl330_platdata exynos4_pdma1_pdata = {
|
||||
.peri = {
|
||||
[0] = DMACH_PCM0_RX,
|
||||
[1] = DMACH_PCM0_TX,
|
||||
@ -142,27 +146,27 @@ static struct s3c_pl330_platdata s5pv310_pdma1_pdata = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device s5pv310_device_pdma1 = {
|
||||
static struct platform_device exynos4_device_pdma1 = {
|
||||
.name = "s3c-pl330",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(s5pv310_pdma1_resource),
|
||||
.resource = s5pv310_pdma1_resource,
|
||||
.num_resources = ARRAY_SIZE(exynos4_pdma1_resource),
|
||||
.resource = exynos4_pdma1_resource,
|
||||
.dev = {
|
||||
.dma_mask = &dma_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &s5pv310_pdma1_pdata,
|
||||
.platform_data = &exynos4_pdma1_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *s5pv310_dmacs[] __initdata = {
|
||||
&s5pv310_device_pdma0,
|
||||
&s5pv310_device_pdma1,
|
||||
static struct platform_device *exynos4_dmacs[] __initdata = {
|
||||
&exynos4_device_pdma0,
|
||||
&exynos4_device_pdma1,
|
||||
};
|
||||
|
||||
static int __init s5pv310_dma_init(void)
|
||||
static int __init exynos4_dma_init(void)
|
||||
{
|
||||
platform_add_devices(s5pv310_dmacs, ARRAY_SIZE(s5pv310_dmacs));
|
||||
platform_add_devices(exynos4_dmacs, ARRAY_SIZE(exynos4_dmacs));
|
||||
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(s5pv310_dma_init);
|
||||
arch_initcall(exynos4_dma_init);
|
365
arch/arm/mach-exynos4/gpiolib.c
Normal file
365
arch/arm/mach-exynos4/gpiolib.c
Normal file
@ -0,0 +1,365 @@
|
||||
/* linux/arch/arm/mach-exynos4/gpiolib.c
|
||||
*
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* EXYNOS4 - GPIOlib support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
#include <mach/map.h>
|
||||
|
||||
#include <plat/gpio-core.h>
|
||||
#include <plat/gpio-cfg.h>
|
||||
#include <plat/gpio-cfg-helpers.h>
|
||||
|
||||
static struct s3c_gpio_cfg gpio_cfg = {
|
||||
.set_config = s3c_gpio_setcfg_s3c64xx_4bit,
|
||||
.set_pull = s3c_gpio_setpull_updown,
|
||||
.get_pull = s3c_gpio_getpull_updown,
|
||||
};
|
||||
|
||||
static struct s3c_gpio_cfg gpio_cfg_noint = {
|
||||
.set_config = s3c_gpio_setcfg_s3c64xx_4bit,
|
||||
.set_pull = s3c_gpio_setpull_updown,
|
||||
.get_pull = s3c_gpio_getpull_updown,
|
||||
};
|
||||
|
||||
/*
|
||||
* Following are the gpio banks in v310.
|
||||
*
|
||||
* The 'config' member when left to NULL, is initialized to the default
|
||||
* structure gpio_cfg in the init function below.
|
||||
*
|
||||
* The 'base' member is also initialized in the init function below.
|
||||
* Note: The initialization of 'base' member of s3c_gpio_chip structure
|
||||
* uses the above macro and depends on the banks being listed in order here.
|
||||
*/
|
||||
static struct s3c_gpio_chip exynos4_gpio_part1_4bit[] = {
|
||||
{
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPA0(0),
|
||||
.ngpio = EXYNOS4_GPIO_A0_NR,
|
||||
.label = "GPA0",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPA1(0),
|
||||
.ngpio = EXYNOS4_GPIO_A1_NR,
|
||||
.label = "GPA1",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPB(0),
|
||||
.ngpio = EXYNOS4_GPIO_B_NR,
|
||||
.label = "GPB",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPC0(0),
|
||||
.ngpio = EXYNOS4_GPIO_C0_NR,
|
||||
.label = "GPC0",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPC1(0),
|
||||
.ngpio = EXYNOS4_GPIO_C1_NR,
|
||||
.label = "GPC1",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPD0(0),
|
||||
.ngpio = EXYNOS4_GPIO_D0_NR,
|
||||
.label = "GPD0",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPD1(0),
|
||||
.ngpio = EXYNOS4_GPIO_D1_NR,
|
||||
.label = "GPD1",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPE0(0),
|
||||
.ngpio = EXYNOS4_GPIO_E0_NR,
|
||||
.label = "GPE0",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPE1(0),
|
||||
.ngpio = EXYNOS4_GPIO_E1_NR,
|
||||
.label = "GPE1",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPE2(0),
|
||||
.ngpio = EXYNOS4_GPIO_E2_NR,
|
||||
.label = "GPE2",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPE3(0),
|
||||
.ngpio = EXYNOS4_GPIO_E3_NR,
|
||||
.label = "GPE3",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPE4(0),
|
||||
.ngpio = EXYNOS4_GPIO_E4_NR,
|
||||
.label = "GPE4",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPF0(0),
|
||||
.ngpio = EXYNOS4_GPIO_F0_NR,
|
||||
.label = "GPF0",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPF1(0),
|
||||
.ngpio = EXYNOS4_GPIO_F1_NR,
|
||||
.label = "GPF1",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPF2(0),
|
||||
.ngpio = EXYNOS4_GPIO_F2_NR,
|
||||
.label = "GPF2",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPF3(0),
|
||||
.ngpio = EXYNOS4_GPIO_F3_NR,
|
||||
.label = "GPF3",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct s3c_gpio_chip exynos4_gpio_part2_4bit[] = {
|
||||
{
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPJ0(0),
|
||||
.ngpio = EXYNOS4_GPIO_J0_NR,
|
||||
.label = "GPJ0",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPJ1(0),
|
||||
.ngpio = EXYNOS4_GPIO_J1_NR,
|
||||
.label = "GPJ1",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPK0(0),
|
||||
.ngpio = EXYNOS4_GPIO_K0_NR,
|
||||
.label = "GPK0",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPK1(0),
|
||||
.ngpio = EXYNOS4_GPIO_K1_NR,
|
||||
.label = "GPK1",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPK2(0),
|
||||
.ngpio = EXYNOS4_GPIO_K2_NR,
|
||||
.label = "GPK2",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPK3(0),
|
||||
.ngpio = EXYNOS4_GPIO_K3_NR,
|
||||
.label = "GPK3",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPL0(0),
|
||||
.ngpio = EXYNOS4_GPIO_L0_NR,
|
||||
.label = "GPL0",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPL1(0),
|
||||
.ngpio = EXYNOS4_GPIO_L1_NR,
|
||||
.label = "GPL1",
|
||||
},
|
||||
}, {
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPL2(0),
|
||||
.ngpio = EXYNOS4_GPIO_L2_NR,
|
||||
.label = "GPL2",
|
||||
},
|
||||
}, {
|
||||
.config = &gpio_cfg_noint,
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPY0(0),
|
||||
.ngpio = EXYNOS4_GPIO_Y0_NR,
|
||||
.label = "GPY0",
|
||||
},
|
||||
}, {
|
||||
.config = &gpio_cfg_noint,
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPY1(0),
|
||||
.ngpio = EXYNOS4_GPIO_Y1_NR,
|
||||
.label = "GPY1",
|
||||
},
|
||||
}, {
|
||||
.config = &gpio_cfg_noint,
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPY2(0),
|
||||
.ngpio = EXYNOS4_GPIO_Y2_NR,
|
||||
.label = "GPY2",
|
||||
},
|
||||
}, {
|
||||
.config = &gpio_cfg_noint,
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPY3(0),
|
||||
.ngpio = EXYNOS4_GPIO_Y3_NR,
|
||||
.label = "GPY3",
|
||||
},
|
||||
}, {
|
||||
.config = &gpio_cfg_noint,
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPY4(0),
|
||||
.ngpio = EXYNOS4_GPIO_Y4_NR,
|
||||
.label = "GPY4",
|
||||
},
|
||||
}, {
|
||||
.config = &gpio_cfg_noint,
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPY5(0),
|
||||
.ngpio = EXYNOS4_GPIO_Y5_NR,
|
||||
.label = "GPY5",
|
||||
},
|
||||
}, {
|
||||
.config = &gpio_cfg_noint,
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPY6(0),
|
||||
.ngpio = EXYNOS4_GPIO_Y6_NR,
|
||||
.label = "GPY6",
|
||||
},
|
||||
}, {
|
||||
.base = (S5P_VA_GPIO2 + 0xC00),
|
||||
.config = &gpio_cfg_noint,
|
||||
.irq_base = IRQ_EINT(0),
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPX0(0),
|
||||
.ngpio = EXYNOS4_GPIO_X0_NR,
|
||||
.label = "GPX0",
|
||||
.to_irq = samsung_gpiolib_to_irq,
|
||||
},
|
||||
}, {
|
||||
.base = (S5P_VA_GPIO2 + 0xC20),
|
||||
.config = &gpio_cfg_noint,
|
||||
.irq_base = IRQ_EINT(8),
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPX1(0),
|
||||
.ngpio = EXYNOS4_GPIO_X1_NR,
|
||||
.label = "GPX1",
|
||||
.to_irq = samsung_gpiolib_to_irq,
|
||||
},
|
||||
}, {
|
||||
.base = (S5P_VA_GPIO2 + 0xC40),
|
||||
.config = &gpio_cfg_noint,
|
||||
.irq_base = IRQ_EINT(16),
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPX2(0),
|
||||
.ngpio = EXYNOS4_GPIO_X2_NR,
|
||||
.label = "GPX2",
|
||||
.to_irq = samsung_gpiolib_to_irq,
|
||||
},
|
||||
}, {
|
||||
.base = (S5P_VA_GPIO2 + 0xC60),
|
||||
.config = &gpio_cfg_noint,
|
||||
.irq_base = IRQ_EINT(24),
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPX3(0),
|
||||
.ngpio = EXYNOS4_GPIO_X3_NR,
|
||||
.label = "GPX3",
|
||||
.to_irq = samsung_gpiolib_to_irq,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct s3c_gpio_chip exynos4_gpio_part3_4bit[] = {
|
||||
{
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPZ(0),
|
||||
.ngpio = EXYNOS4_GPIO_Z_NR,
|
||||
.label = "GPZ",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static __init int exynos4_gpiolib_init(void)
|
||||
{
|
||||
struct s3c_gpio_chip *chip;
|
||||
int i;
|
||||
int group = 0;
|
||||
int nr_chips;
|
||||
|
||||
/* GPIO part 1 */
|
||||
|
||||
chip = exynos4_gpio_part1_4bit;
|
||||
nr_chips = ARRAY_SIZE(exynos4_gpio_part1_4bit);
|
||||
|
||||
for (i = 0; i < nr_chips; i++, chip++) {
|
||||
if (chip->config == NULL) {
|
||||
chip->config = &gpio_cfg;
|
||||
/* Assign the GPIO interrupt group */
|
||||
chip->group = group++;
|
||||
}
|
||||
if (chip->base == NULL)
|
||||
chip->base = S5P_VA_GPIO1 + (i) * 0x20;
|
||||
}
|
||||
|
||||
samsung_gpiolib_add_4bit_chips(exynos4_gpio_part1_4bit, nr_chips);
|
||||
|
||||
/* GPIO part 2 */
|
||||
|
||||
chip = exynos4_gpio_part2_4bit;
|
||||
nr_chips = ARRAY_SIZE(exynos4_gpio_part2_4bit);
|
||||
|
||||
for (i = 0; i < nr_chips; i++, chip++) {
|
||||
if (chip->config == NULL) {
|
||||
chip->config = &gpio_cfg;
|
||||
/* Assign the GPIO interrupt group */
|
||||
chip->group = group++;
|
||||
}
|
||||
if (chip->base == NULL)
|
||||
chip->base = S5P_VA_GPIO2 + (i) * 0x20;
|
||||
}
|
||||
|
||||
samsung_gpiolib_add_4bit_chips(exynos4_gpio_part2_4bit, nr_chips);
|
||||
|
||||
/* GPIO part 3 */
|
||||
|
||||
chip = exynos4_gpio_part3_4bit;
|
||||
nr_chips = ARRAY_SIZE(exynos4_gpio_part3_4bit);
|
||||
|
||||
for (i = 0; i < nr_chips; i++, chip++) {
|
||||
if (chip->config == NULL) {
|
||||
chip->config = &gpio_cfg;
|
||||
/* Assign the GPIO interrupt group */
|
||||
chip->group = group++;
|
||||
}
|
||||
if (chip->base == NULL)
|
||||
chip->base = S5P_VA_GPIO3 + (i) * 0x20;
|
||||
}
|
||||
|
||||
samsung_gpiolib_add_4bit_chips(exynos4_gpio_part3_4bit, nr_chips);
|
||||
s5p_register_gpioint_bank(IRQ_GPIO_XA, 0, IRQ_GPIO1_NR_GROUPS);
|
||||
s5p_register_gpioint_bank(IRQ_GPIO_XB, IRQ_GPIO1_NR_GROUPS, IRQ_GPIO2_NR_GROUPS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
core_initcall(exynos4_gpiolib_init);
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-s5pv310/headsmp.S
|
||||
* linux/arch/arm/mach-exynos4/headsmp.S
|
||||
*
|
||||
* Cloned from linux/arch/arm/mach-realview/headsmp.S
|
||||
*
|
||||
@ -16,11 +16,11 @@
|
||||
__INIT
|
||||
|
||||
/*
|
||||
* s5pv310 specific entry point for secondary CPUs. This provides
|
||||
* exynos4 specific entry point for secondary CPUs. This provides
|
||||
* a "holding pen" into which all secondary cores are held until we're
|
||||
* ready for them to initialise.
|
||||
*/
|
||||
ENTRY(s5pv310_secondary_startup)
|
||||
ENTRY(exynos4_secondary_startup)
|
||||
mrc p15, 0, r0, c0, c0, 5
|
||||
and r0, r0, #15
|
||||
adr r4, 1f
|
@ -1,4 +1,4 @@
|
||||
/* linux arch/arm/mach-s5pv310/hotplug.c
|
||||
/* linux arch/arm/mach-exynos4/hotplug.c
|
||||
*
|
||||
* Cloned from linux/arch/arm/mach-realview/hotplug.c
|
||||
*
|
||||
@ -30,13 +30,13 @@ static inline void cpu_enter_lowpower(void)
|
||||
* Turn off coherency
|
||||
*/
|
||||
" mrc p15, 0, %0, c1, c0, 1\n"
|
||||
" bic %0, %0, #0x20\n"
|
||||
" bic %0, %0, %3\n"
|
||||
" mcr p15, 0, %0, c1, c0, 1\n"
|
||||
" mrc p15, 0, %0, c1, c0, 0\n"
|
||||
" bic %0, %0, %2\n"
|
||||
" mcr p15, 0, %0, c1, c0, 0\n"
|
||||
: "=&r" (v)
|
||||
: "r" (0), "Ir" (CR_C)
|
||||
: "r" (0), "Ir" (CR_C), "Ir" (0x40)
|
||||
: "cc");
|
||||
}
|
||||
|
||||
@ -49,10 +49,10 @@ static inline void cpu_leave_lowpower(void)
|
||||
" orr %0, %0, %1\n"
|
||||
" mcr p15, 0, %0, c1, c0, 0\n"
|
||||
" mrc p15, 0, %0, c1, c0, 1\n"
|
||||
" orr %0, %0, #0x20\n"
|
||||
" orr %0, %0, %2\n"
|
||||
" mcr p15, 0, %0, c1, c0, 1\n"
|
||||
: "=&r" (v)
|
||||
: "Ir" (CR_C)
|
||||
: "Ir" (CR_C), "Ir" (0x40)
|
||||
: "cc");
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/* linux/arch/arm/mach-s5pv310/include/mach/debug-macro.S
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/debug-macro.S
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* Based on arch/arm/mach-s3c6400/include/mach/debug-macro.S
|
||||
*
|
@ -1,8 +1,8 @@
|
||||
/* arch/arm/mach-s5pv310/include/mach/entry-macro.S
|
||||
/* arch/arm/mach-exynos4/include/mach/entry-macro.S
|
||||
*
|
||||
* Cloned from arch/arm/mach-realview/include/mach/entry-macro.S
|
||||
*
|
||||
* Low-level IRQ helper macros for S5PV310 platforms
|
||||
* Low-level IRQ helper macros for EXYNOS4 platforms
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
156
arch/arm/mach-exynos4/include/mach/gpio.h
Normal file
156
arch/arm/mach-exynos4/include/mach/gpio.h
Normal file
@ -0,0 +1,156 @@
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/gpio.h
|
||||
*
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* EXYNOS4 - GPIO lib support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_GPIO_H
|
||||
#define __ASM_ARCH_GPIO_H __FILE__
|
||||
|
||||
#define gpio_get_value __gpio_get_value
|
||||
#define gpio_set_value __gpio_set_value
|
||||
#define gpio_cansleep __gpio_cansleep
|
||||
#define gpio_to_irq __gpio_to_irq
|
||||
|
||||
/* Practically, GPIO banks upto GPZ are the configurable gpio banks */
|
||||
|
||||
/* GPIO bank sizes */
|
||||
#define EXYNOS4_GPIO_A0_NR (8)
|
||||
#define EXYNOS4_GPIO_A1_NR (6)
|
||||
#define EXYNOS4_GPIO_B_NR (8)
|
||||
#define EXYNOS4_GPIO_C0_NR (5)
|
||||
#define EXYNOS4_GPIO_C1_NR (5)
|
||||
#define EXYNOS4_GPIO_D0_NR (4)
|
||||
#define EXYNOS4_GPIO_D1_NR (4)
|
||||
#define EXYNOS4_GPIO_E0_NR (5)
|
||||
#define EXYNOS4_GPIO_E1_NR (8)
|
||||
#define EXYNOS4_GPIO_E2_NR (6)
|
||||
#define EXYNOS4_GPIO_E3_NR (8)
|
||||
#define EXYNOS4_GPIO_E4_NR (8)
|
||||
#define EXYNOS4_GPIO_F0_NR (8)
|
||||
#define EXYNOS4_GPIO_F1_NR (8)
|
||||
#define EXYNOS4_GPIO_F2_NR (8)
|
||||
#define EXYNOS4_GPIO_F3_NR (6)
|
||||
#define EXYNOS4_GPIO_J0_NR (8)
|
||||
#define EXYNOS4_GPIO_J1_NR (5)
|
||||
#define EXYNOS4_GPIO_K0_NR (7)
|
||||
#define EXYNOS4_GPIO_K1_NR (7)
|
||||
#define EXYNOS4_GPIO_K2_NR (7)
|
||||
#define EXYNOS4_GPIO_K3_NR (7)
|
||||
#define EXYNOS4_GPIO_L0_NR (8)
|
||||
#define EXYNOS4_GPIO_L1_NR (3)
|
||||
#define EXYNOS4_GPIO_L2_NR (8)
|
||||
#define EXYNOS4_GPIO_X0_NR (8)
|
||||
#define EXYNOS4_GPIO_X1_NR (8)
|
||||
#define EXYNOS4_GPIO_X2_NR (8)
|
||||
#define EXYNOS4_GPIO_X3_NR (8)
|
||||
#define EXYNOS4_GPIO_Y0_NR (6)
|
||||
#define EXYNOS4_GPIO_Y1_NR (4)
|
||||
#define EXYNOS4_GPIO_Y2_NR (6)
|
||||
#define EXYNOS4_GPIO_Y3_NR (8)
|
||||
#define EXYNOS4_GPIO_Y4_NR (8)
|
||||
#define EXYNOS4_GPIO_Y5_NR (8)
|
||||
#define EXYNOS4_GPIO_Y6_NR (8)
|
||||
#define EXYNOS4_GPIO_Z_NR (7)
|
||||
|
||||
/* GPIO bank numbers */
|
||||
|
||||
#define EXYNOS4_GPIO_NEXT(__gpio) \
|
||||
((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 1)
|
||||
|
||||
enum s5p_gpio_number {
|
||||
EXYNOS4_GPIO_A0_START = 0,
|
||||
EXYNOS4_GPIO_A1_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_A0),
|
||||
EXYNOS4_GPIO_B_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_A1),
|
||||
EXYNOS4_GPIO_C0_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_B),
|
||||
EXYNOS4_GPIO_C1_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_C0),
|
||||
EXYNOS4_GPIO_D0_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_C1),
|
||||
EXYNOS4_GPIO_D1_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_D0),
|
||||
EXYNOS4_GPIO_E0_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_D1),
|
||||
EXYNOS4_GPIO_E1_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_E0),
|
||||
EXYNOS4_GPIO_E2_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_E1),
|
||||
EXYNOS4_GPIO_E3_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_E2),
|
||||
EXYNOS4_GPIO_E4_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_E3),
|
||||
EXYNOS4_GPIO_F0_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_E4),
|
||||
EXYNOS4_GPIO_F1_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_F0),
|
||||
EXYNOS4_GPIO_F2_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_F1),
|
||||
EXYNOS4_GPIO_F3_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_F2),
|
||||
EXYNOS4_GPIO_J0_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_F3),
|
||||
EXYNOS4_GPIO_J1_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_J0),
|
||||
EXYNOS4_GPIO_K0_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_J1),
|
||||
EXYNOS4_GPIO_K1_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_K0),
|
||||
EXYNOS4_GPIO_K2_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_K1),
|
||||
EXYNOS4_GPIO_K3_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_K2),
|
||||
EXYNOS4_GPIO_L0_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_K3),
|
||||
EXYNOS4_GPIO_L1_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_L0),
|
||||
EXYNOS4_GPIO_L2_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_L1),
|
||||
EXYNOS4_GPIO_X0_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_L2),
|
||||
EXYNOS4_GPIO_X1_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_X0),
|
||||
EXYNOS4_GPIO_X2_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_X1),
|
||||
EXYNOS4_GPIO_X3_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_X2),
|
||||
EXYNOS4_GPIO_Y0_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_X3),
|
||||
EXYNOS4_GPIO_Y1_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_Y0),
|
||||
EXYNOS4_GPIO_Y2_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_Y1),
|
||||
EXYNOS4_GPIO_Y3_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_Y2),
|
||||
EXYNOS4_GPIO_Y4_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_Y3),
|
||||
EXYNOS4_GPIO_Y5_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_Y4),
|
||||
EXYNOS4_GPIO_Y6_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_Y5),
|
||||
EXYNOS4_GPIO_Z_START = EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_Y6),
|
||||
};
|
||||
|
||||
/* EXYNOS4 GPIO number definitions */
|
||||
#define EXYNOS4_GPA0(_nr) (EXYNOS4_GPIO_A0_START + (_nr))
|
||||
#define EXYNOS4_GPA1(_nr) (EXYNOS4_GPIO_A1_START + (_nr))
|
||||
#define EXYNOS4_GPB(_nr) (EXYNOS4_GPIO_B_START + (_nr))
|
||||
#define EXYNOS4_GPC0(_nr) (EXYNOS4_GPIO_C0_START + (_nr))
|
||||
#define EXYNOS4_GPC1(_nr) (EXYNOS4_GPIO_C1_START + (_nr))
|
||||
#define EXYNOS4_GPD0(_nr) (EXYNOS4_GPIO_D0_START + (_nr))
|
||||
#define EXYNOS4_GPD1(_nr) (EXYNOS4_GPIO_D1_START + (_nr))
|
||||
#define EXYNOS4_GPE0(_nr) (EXYNOS4_GPIO_E0_START + (_nr))
|
||||
#define EXYNOS4_GPE1(_nr) (EXYNOS4_GPIO_E1_START + (_nr))
|
||||
#define EXYNOS4_GPE2(_nr) (EXYNOS4_GPIO_E2_START + (_nr))
|
||||
#define EXYNOS4_GPE3(_nr) (EXYNOS4_GPIO_E3_START + (_nr))
|
||||
#define EXYNOS4_GPE4(_nr) (EXYNOS4_GPIO_E4_START + (_nr))
|
||||
#define EXYNOS4_GPF0(_nr) (EXYNOS4_GPIO_F0_START + (_nr))
|
||||
#define EXYNOS4_GPF1(_nr) (EXYNOS4_GPIO_F1_START + (_nr))
|
||||
#define EXYNOS4_GPF2(_nr) (EXYNOS4_GPIO_F2_START + (_nr))
|
||||
#define EXYNOS4_GPF3(_nr) (EXYNOS4_GPIO_F3_START + (_nr))
|
||||
#define EXYNOS4_GPJ0(_nr) (EXYNOS4_GPIO_J0_START + (_nr))
|
||||
#define EXYNOS4_GPJ1(_nr) (EXYNOS4_GPIO_J1_START + (_nr))
|
||||
#define EXYNOS4_GPK0(_nr) (EXYNOS4_GPIO_K0_START + (_nr))
|
||||
#define EXYNOS4_GPK1(_nr) (EXYNOS4_GPIO_K1_START + (_nr))
|
||||
#define EXYNOS4_GPK2(_nr) (EXYNOS4_GPIO_K2_START + (_nr))
|
||||
#define EXYNOS4_GPK3(_nr) (EXYNOS4_GPIO_K3_START + (_nr))
|
||||
#define EXYNOS4_GPL0(_nr) (EXYNOS4_GPIO_L0_START + (_nr))
|
||||
#define EXYNOS4_GPL1(_nr) (EXYNOS4_GPIO_L1_START + (_nr))
|
||||
#define EXYNOS4_GPL2(_nr) (EXYNOS4_GPIO_L2_START + (_nr))
|
||||
#define EXYNOS4_GPX0(_nr) (EXYNOS4_GPIO_X0_START + (_nr))
|
||||
#define EXYNOS4_GPX1(_nr) (EXYNOS4_GPIO_X1_START + (_nr))
|
||||
#define EXYNOS4_GPX2(_nr) (EXYNOS4_GPIO_X2_START + (_nr))
|
||||
#define EXYNOS4_GPX3(_nr) (EXYNOS4_GPIO_X3_START + (_nr))
|
||||
#define EXYNOS4_GPY0(_nr) (EXYNOS4_GPIO_Y0_START + (_nr))
|
||||
#define EXYNOS4_GPY1(_nr) (EXYNOS4_GPIO_Y1_START + (_nr))
|
||||
#define EXYNOS4_GPY2(_nr) (EXYNOS4_GPIO_Y2_START + (_nr))
|
||||
#define EXYNOS4_GPY3(_nr) (EXYNOS4_GPIO_Y3_START + (_nr))
|
||||
#define EXYNOS4_GPY4(_nr) (EXYNOS4_GPIO_Y4_START + (_nr))
|
||||
#define EXYNOS4_GPY5(_nr) (EXYNOS4_GPIO_Y5_START + (_nr))
|
||||
#define EXYNOS4_GPY6(_nr) (EXYNOS4_GPIO_Y6_START + (_nr))
|
||||
#define EXYNOS4_GPZ(_nr) (EXYNOS4_GPIO_Z_START + (_nr))
|
||||
|
||||
/* the end of the EXYNOS4 specific gpios */
|
||||
#define EXYNOS4_GPIO_END (EXYNOS4_GPZ(EXYNOS4_GPIO_Z_NR) + 1)
|
||||
#define S3C_GPIO_END EXYNOS4_GPIO_END
|
||||
|
||||
/* define the number of gpios we need to the one after the GPZ() range */
|
||||
#define ARCH_NR_GPIOS (EXYNOS4_GPZ(EXYNOS4_GPIO_Z_NR) + \
|
||||
CONFIG_SAMSUNG_GPIO_EXTRA + 1)
|
||||
|
||||
#include <asm-generic/gpio.h>
|
||||
|
||||
#endif /* __ASM_ARCH_GPIO_H */
|
@ -1,9 +1,9 @@
|
||||
/* linux/arch/arm/mach-s5pv310/include/mach/hardware.h
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/hardware.h
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* S5PV310 - Hardware support
|
||||
* EXYNOS4 - Hardware support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
@ -1,13 +1,13 @@
|
||||
/* linux/arch/arm/mach-s5pv310/include/mach/io.h
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/io.h
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* Copyright 2008-2010 Ben Dooks <ben-linux@fluff.org>
|
||||
*
|
||||
* Based on arch/arm/mach-s5p6442/include/mach/io.h
|
||||
*
|
||||
* Default IO routines for S5PV310
|
||||
* Default IO routines for EXYNOS4
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
@ -1,9 +1,9 @@
|
||||
/* linux/arch/arm/mach-s5pv310/include/mach/irqs.h
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/irqs.h
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* S5PV310 - IRQ definitions
|
||||
* EXYNOS4 - IRQ definitions
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@ -85,6 +85,9 @@
|
||||
#define IRQ_RTC_ALARM COMBINER_IRQ(23, 0)
|
||||
#define IRQ_RTC_TIC COMBINER_IRQ(23, 1)
|
||||
|
||||
#define IRQ_GPIO_XB COMBINER_IRQ(24, 0)
|
||||
#define IRQ_GPIO_XA COMBINER_IRQ(24, 1)
|
||||
|
||||
#define IRQ_UART0 COMBINER_IRQ(26, 0)
|
||||
#define IRQ_UART1 COMBINER_IRQ(26, 1)
|
||||
#define IRQ_UART2 COMBINER_IRQ(26, 2)
|
||||
@ -108,6 +111,11 @@
|
||||
#define IRQ_MIPI_CSIS0 COMBINER_IRQ(30, 0)
|
||||
#define IRQ_MIPI_CSIS1 COMBINER_IRQ(30, 1)
|
||||
|
||||
#define IRQ_FIMC0 COMBINER_IRQ(32, 0)
|
||||
#define IRQ_FIMC1 COMBINER_IRQ(32, 1)
|
||||
#define IRQ_FIMC2 COMBINER_IRQ(33, 0)
|
||||
#define IRQ_FIMC3 COMBINER_IRQ(33, 1)
|
||||
|
||||
#define IRQ_ONENAND_AUDI COMBINER_IRQ(34, 0)
|
||||
|
||||
#define IRQ_MCT_L1 COMBINER_IRQ(35, 3)
|
||||
@ -131,6 +139,7 @@
|
||||
#define IRQ_MCT_L0 COMBINER_IRQ(51, 0)
|
||||
|
||||
#define IRQ_WDT COMBINER_IRQ(53, 0)
|
||||
#define IRQ_MCT_G0 COMBINER_IRQ(53, 4)
|
||||
|
||||
#define MAX_COMBINER_NR 54
|
||||
|
||||
@ -139,8 +148,13 @@
|
||||
#define S5P_EINT_BASE1 (S5P_IRQ_EINT_BASE + 0)
|
||||
#define S5P_EINT_BASE2 (S5P_IRQ_EINT_BASE + 16)
|
||||
|
||||
/* Set the default NR_IRQS */
|
||||
/* optional GPIO interrupts */
|
||||
#define S5P_GPIOINT_BASE (S5P_IRQ_EINT_BASE + 32)
|
||||
#define IRQ_GPIO1_NR_GROUPS 16
|
||||
#define IRQ_GPIO2_NR_GROUPS 9
|
||||
#define IRQ_GPIO_END (S5P_GPIOINT_BASE + S5P_GPIOINT_COUNT)
|
||||
|
||||
#define NR_IRQS (S5P_IRQ_EINT_BASE + 32)
|
||||
/* Set the default NR_IRQS */
|
||||
#define NR_IRQS (IRQ_GPIO_END)
|
||||
|
||||
#endif /* __ASM_ARCH_IRQS_H */
|
162
arch/arm/mach-exynos4/include/mach/map.h
Normal file
162
arch/arm/mach-exynos4/include/mach/map.h
Normal file
@ -0,0 +1,162 @@
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/map.h
|
||||
*
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
*
|
||||
* EXYNOS4 - Memory map definitions
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_MAP_H
|
||||
#define __ASM_ARCH_MAP_H __FILE__
|
||||
|
||||
#include <plat/map-base.h>
|
||||
|
||||
/*
|
||||
* EXYNOS4 UART offset is 0x10000 but the older S5P SoCs are 0x400.
|
||||
* So need to define it, and here is to avoid redefinition warning.
|
||||
*/
|
||||
#define S3C_UART_OFFSET (0x10000)
|
||||
|
||||
#include <plat/map-s5p.h>
|
||||
|
||||
#define EXYNOS4_PA_SYSRAM 0x02020000
|
||||
|
||||
#define EXYNOS4_PA_FIMC0 0x11800000
|
||||
#define EXYNOS4_PA_FIMC1 0x11810000
|
||||
#define EXYNOS4_PA_FIMC2 0x11820000
|
||||
#define EXYNOS4_PA_FIMC3 0x11830000
|
||||
|
||||
#define EXYNOS4_PA_I2S0 0x03830000
|
||||
#define EXYNOS4_PA_I2S1 0xE3100000
|
||||
#define EXYNOS4_PA_I2S2 0xE2A00000
|
||||
|
||||
#define EXYNOS4_PA_PCM0 0x03840000
|
||||
#define EXYNOS4_PA_PCM1 0x13980000
|
||||
#define EXYNOS4_PA_PCM2 0x13990000
|
||||
|
||||
#define EXYNOS4_PA_SROM_BANK(x) (0x04000000 + ((x) * 0x01000000))
|
||||
|
||||
#define EXYNOS4_PA_ONENAND 0x0C000000
|
||||
#define EXYNOS4_PA_ONENAND_DMA 0x0C600000
|
||||
|
||||
#define EXYNOS4_PA_CHIPID 0x10000000
|
||||
|
||||
#define EXYNOS4_PA_SYSCON 0x10010000
|
||||
#define EXYNOS4_PA_PMU 0x10020000
|
||||
#define EXYNOS4_PA_CMU 0x10030000
|
||||
|
||||
#define EXYNOS4_PA_SYSTIMER 0x10050000
|
||||
#define EXYNOS4_PA_WATCHDOG 0x10060000
|
||||
#define EXYNOS4_PA_RTC 0x10070000
|
||||
|
||||
#define EXYNOS4_PA_KEYPAD 0x100A0000
|
||||
|
||||
#define EXYNOS4_PA_DMC0 0x10400000
|
||||
|
||||
#define EXYNOS4_PA_COMBINER 0x10448000
|
||||
|
||||
#define EXYNOS4_PA_COREPERI 0x10500000
|
||||
#define EXYNOS4_PA_GIC_CPU 0x10500100
|
||||
#define EXYNOS4_PA_TWD 0x10500600
|
||||
#define EXYNOS4_PA_GIC_DIST 0x10501000
|
||||
#define EXYNOS4_PA_L2CC 0x10502000
|
||||
|
||||
#define EXYNOS4_PA_MDMA 0x10810000
|
||||
#define EXYNOS4_PA_PDMA0 0x12680000
|
||||
#define EXYNOS4_PA_PDMA1 0x12690000
|
||||
|
||||
#define EXYNOS4_PA_SYSMMU_MDMA 0x10A40000
|
||||
#define EXYNOS4_PA_SYSMMU_SSS 0x10A50000
|
||||
#define EXYNOS4_PA_SYSMMU_FIMC0 0x11A20000
|
||||
#define EXYNOS4_PA_SYSMMU_FIMC1 0x11A30000
|
||||
#define EXYNOS4_PA_SYSMMU_FIMC2 0x11A40000
|
||||
#define EXYNOS4_PA_SYSMMU_FIMC3 0x11A50000
|
||||
#define EXYNOS4_PA_SYSMMU_JPEG 0x11A60000
|
||||
#define EXYNOS4_PA_SYSMMU_FIMD0 0x11E20000
|
||||
#define EXYNOS4_PA_SYSMMU_FIMD1 0x12220000
|
||||
#define EXYNOS4_PA_SYSMMU_PCIe 0x12620000
|
||||
#define EXYNOS4_PA_SYSMMU_G2D 0x12A20000
|
||||
#define EXYNOS4_PA_SYSMMU_ROTATOR 0x12A30000
|
||||
#define EXYNOS4_PA_SYSMMU_MDMA2 0x12A40000
|
||||
#define EXYNOS4_PA_SYSMMU_TV 0x12E20000
|
||||
#define EXYNOS4_PA_SYSMMU_MFC_L 0x13620000
|
||||
#define EXYNOS4_PA_SYSMMU_MFC_R 0x13630000
|
||||
|
||||
#define EXYNOS4_PA_GPIO1 0x11400000
|
||||
#define EXYNOS4_PA_GPIO2 0x11000000
|
||||
#define EXYNOS4_PA_GPIO3 0x03860000
|
||||
|
||||
#define EXYNOS4_PA_MIPI_CSIS0 0x11880000
|
||||
#define EXYNOS4_PA_MIPI_CSIS1 0x11890000
|
||||
|
||||
#define EXYNOS4_PA_HSMMC(x) (0x12510000 + ((x) * 0x10000))
|
||||
|
||||
#define EXYNOS4_PA_SATA 0x12560000
|
||||
#define EXYNOS4_PA_SATAPHY 0x125D0000
|
||||
#define EXYNOS4_PA_SATAPHY_CTRL 0x126B0000
|
||||
|
||||
#define EXYNOS4_PA_SROMC 0x12570000
|
||||
|
||||
#define EXYNOS4_PA_UART 0x13800000
|
||||
|
||||
#define EXYNOS4_PA_IIC(x) (0x13860000 + ((x) * 0x10000))
|
||||
|
||||
#define EXYNOS4_PA_AC97 0x139A0000
|
||||
|
||||
#define EXYNOS4_PA_SPDIF 0x139B0000
|
||||
|
||||
#define EXYNOS4_PA_TIMER 0x139D0000
|
||||
|
||||
#define EXYNOS4_PA_SDRAM 0x40000000
|
||||
|
||||
/* Compatibiltiy Defines */
|
||||
|
||||
#define S3C_PA_HSMMC0 EXYNOS4_PA_HSMMC(0)
|
||||
#define S3C_PA_HSMMC1 EXYNOS4_PA_HSMMC(1)
|
||||
#define S3C_PA_HSMMC2 EXYNOS4_PA_HSMMC(2)
|
||||
#define S3C_PA_HSMMC3 EXYNOS4_PA_HSMMC(3)
|
||||
#define S3C_PA_IIC EXYNOS4_PA_IIC(0)
|
||||
#define S3C_PA_IIC1 EXYNOS4_PA_IIC(1)
|
||||
#define S3C_PA_IIC2 EXYNOS4_PA_IIC(2)
|
||||
#define S3C_PA_IIC3 EXYNOS4_PA_IIC(3)
|
||||
#define S3C_PA_IIC4 EXYNOS4_PA_IIC(4)
|
||||
#define S3C_PA_IIC5 EXYNOS4_PA_IIC(5)
|
||||
#define S3C_PA_IIC6 EXYNOS4_PA_IIC(6)
|
||||
#define S3C_PA_IIC7 EXYNOS4_PA_IIC(7)
|
||||
#define S3C_PA_RTC EXYNOS4_PA_RTC
|
||||
#define S3C_PA_WDT EXYNOS4_PA_WATCHDOG
|
||||
|
||||
#define S5P_PA_CHIPID EXYNOS4_PA_CHIPID
|
||||
#define S5P_PA_FIMC0 EXYNOS4_PA_FIMC0
|
||||
#define S5P_PA_FIMC1 EXYNOS4_PA_FIMC1
|
||||
#define S5P_PA_FIMC2 EXYNOS4_PA_FIMC2
|
||||
#define S5P_PA_FIMC3 EXYNOS4_PA_FIMC3
|
||||
#define S5P_PA_MIPI_CSIS0 EXYNOS4_PA_MIPI_CSIS0
|
||||
#define S5P_PA_MIPI_CSIS1 EXYNOS4_PA_MIPI_CSIS1
|
||||
#define S5P_PA_ONENAND EXYNOS4_PA_ONENAND
|
||||
#define S5P_PA_ONENAND_DMA EXYNOS4_PA_ONENAND_DMA
|
||||
#define S5P_PA_SDRAM EXYNOS4_PA_SDRAM
|
||||
#define S5P_PA_SROMC EXYNOS4_PA_SROMC
|
||||
#define S5P_PA_SYSCON EXYNOS4_PA_SYSCON
|
||||
#define S5P_PA_TIMER EXYNOS4_PA_TIMER
|
||||
|
||||
#define SAMSUNG_PA_KEYPAD EXYNOS4_PA_KEYPAD
|
||||
|
||||
/* UART */
|
||||
|
||||
#define S3C_PA_UART EXYNOS4_PA_UART
|
||||
|
||||
#define S5P_PA_UART(x) (S3C_PA_UART + ((x) * S3C_UART_OFFSET))
|
||||
#define S5P_PA_UART0 S5P_PA_UART(0)
|
||||
#define S5P_PA_UART1 S5P_PA_UART(1)
|
||||
#define S5P_PA_UART2 S5P_PA_UART(2)
|
||||
#define S5P_PA_UART3 S5P_PA_UART(3)
|
||||
#define S5P_PA_UART4 S5P_PA_UART(4)
|
||||
|
||||
#define S5P_SZ_UART SZ_256
|
||||
|
||||
#endif /* __ASM_ARCH_MAP_H */
|
@ -1,9 +1,9 @@
|
||||
/* linux/arch/arm/mach-s5pv310/include/mach/memory.h
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/memory.h
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* S5PV310 - Memory definitions
|
||||
* EXYNOS4 - Memory definitions
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
49
arch/arm/mach-exynos4/include/mach/pm-core.h
Normal file
49
arch/arm/mach-exynos4/include/mach/pm-core.h
Normal file
@ -0,0 +1,49 @@
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/pm-core.h
|
||||
*
|
||||
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* Based on arch/arm/mach-s3c2410/include/mach/pm-core.h,
|
||||
* Copyright 2008 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
* http://armlinux.simtec.co.uk/
|
||||
*
|
||||
* EXYNOS4210 - PM core support for arch/arm/plat-s5p/pm.c
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <mach/regs-pmu.h>
|
||||
|
||||
static inline void s3c_pm_debug_init_uart(void)
|
||||
{
|
||||
/* nothing here yet */
|
||||
}
|
||||
|
||||
static inline void s3c_pm_arch_prepare_irqs(void)
|
||||
{
|
||||
unsigned int tmp;
|
||||
tmp = __raw_readl(S5P_WAKEUP_MASK);
|
||||
tmp &= ~(1 << 31);
|
||||
__raw_writel(tmp, S5P_WAKEUP_MASK);
|
||||
|
||||
__raw_writel(s3c_irqwake_intmask, S5P_WAKEUP_MASK);
|
||||
__raw_writel(s3c_irqwake_eintmask, S5P_EINT_WAKEUP_MASK);
|
||||
}
|
||||
|
||||
static inline void s3c_pm_arch_stop_clocks(void)
|
||||
{
|
||||
/* nothing here yet */
|
||||
}
|
||||
|
||||
static inline void s3c_pm_arch_show_resume_irqs(void)
|
||||
{
|
||||
/* nothing here yet */
|
||||
}
|
||||
|
||||
static inline void s3c_pm_arch_update_uart(void __iomem *regs,
|
||||
struct pm_uart_save *save)
|
||||
{
|
||||
/* nothing here yet */
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
/* linux/arch/arm/mach-s5pv310/include/mach/pwm-clock.h
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/pwm-clock.h
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* Copyright 2008 Openmoko, Inc.
|
||||
* Copyright 2008 Simtec Electronics
|
||||
@ -10,7 +10,7 @@
|
||||
*
|
||||
* Based on arch/arm/mach-s3c64xx/include/mach/pwm-clock.h
|
||||
*
|
||||
* S5PV310 - pwm clock and timer support
|
||||
* EXYNOS4 - pwm clock and timer support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
@ -1,9 +1,9 @@
|
||||
/* linux/arch/arm/mach-s5pv310/include/mach/regs-clock.h
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/regs-clock.h
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* S5PV310 - Clock register definitions
|
||||
* EXYNOS4 - Clock register definitions
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@ -17,13 +17,13 @@
|
||||
|
||||
#define S5P_CLKREG(x) (S5P_VA_CMU + (x))
|
||||
|
||||
#define S5P_INFORM0 S5P_CLKREG(0x800)
|
||||
|
||||
#define S5P_CLKDIV_LEFTBUS S5P_CLKREG(0x04500)
|
||||
#define S5P_CLKDIV_STAT_LEFTBUS S5P_CLKREG(0x04600)
|
||||
#define S5P_CLKGATE_IP_LEFTBUS S5P_CLKREG(0x04800)
|
||||
|
||||
#define S5P_CLKDIV_RIGHTBUS S5P_CLKREG(0x08500)
|
||||
#define S5P_CLKDIV_STAT_RIGHTBUS S5P_CLKREG(0x08600)
|
||||
#define S5P_CLKGATE_IP_RIGHTBUS S5P_CLKREG(0x08800)
|
||||
|
||||
#define S5P_EPLL_CON0 S5P_CLKREG(0x0C110)
|
||||
#define S5P_EPLL_CON1 S5P_CLKREG(0x0C114)
|
||||
@ -33,18 +33,24 @@
|
||||
#define S5P_CLKSRC_TOP0 S5P_CLKREG(0x0C210)
|
||||
#define S5P_CLKSRC_TOP1 S5P_CLKREG(0x0C214)
|
||||
#define S5P_CLKSRC_CAM S5P_CLKREG(0x0C220)
|
||||
#define S5P_CLKSRC_MFC S5P_CLKREG(0x0C228)
|
||||
#define S5P_CLKSRC_IMAGE S5P_CLKREG(0x0C230)
|
||||
#define S5P_CLKSRC_LCD0 S5P_CLKREG(0x0C234)
|
||||
#define S5P_CLKSRC_LCD1 S5P_CLKREG(0x0C238)
|
||||
#define S5P_CLKSRC_MAUDIO S5P_CLKREG(0x0C23C)
|
||||
#define S5P_CLKSRC_FSYS S5P_CLKREG(0x0C240)
|
||||
#define S5P_CLKSRC_PERIL0 S5P_CLKREG(0x0C250)
|
||||
#define S5P_CLKSRC_PERIL1 S5P_CLKREG(0x0C254)
|
||||
|
||||
#define S5P_CLKDIV_TOP S5P_CLKREG(0x0C510)
|
||||
#define S5P_CLKDIV_CAM S5P_CLKREG(0x0C520)
|
||||
#define S5P_CLKDIV_TV S5P_CLKREG(0x0C524)
|
||||
#define S5P_CLKDIV_MFC S5P_CLKREG(0x0C528)
|
||||
#define S5P_CLKDIV_G3D S5P_CLKREG(0x0C52C)
|
||||
#define S5P_CLKDIV_IMAGE S5P_CLKREG(0x0C530)
|
||||
#define S5P_CLKDIV_LCD0 S5P_CLKREG(0x0C534)
|
||||
#define S5P_CLKDIV_LCD1 S5P_CLKREG(0x0C538)
|
||||
#define S5P_CLKDIV_MAUDIO S5P_CLKREG(0x0C53C)
|
||||
#define S5P_CLKDIV_FSYS0 S5P_CLKREG(0x0C540)
|
||||
#define S5P_CLKDIV_FSYS1 S5P_CLKREG(0x0C544)
|
||||
#define S5P_CLKDIV_FSYS2 S5P_CLKREG(0x0C548)
|
||||
@ -58,25 +64,36 @@
|
||||
|
||||
#define S5P_CLKSRC_MASK_TOP S5P_CLKREG(0x0C310)
|
||||
#define S5P_CLKSRC_MASK_CAM S5P_CLKREG(0x0C320)
|
||||
#define S5P_CLKSRC_MASK_TV S5P_CLKREG(0x0C324)
|
||||
#define S5P_CLKSRC_MASK_LCD0 S5P_CLKREG(0x0C334)
|
||||
#define S5P_CLKSRC_MASK_LCD1 S5P_CLKREG(0x0C338)
|
||||
#define S5P_CLKSRC_MASK_MAUDIO S5P_CLKREG(0x0C33C)
|
||||
#define S5P_CLKSRC_MASK_FSYS S5P_CLKREG(0x0C340)
|
||||
#define S5P_CLKSRC_MASK_PERIL0 S5P_CLKREG(0x0C350)
|
||||
#define S5P_CLKSRC_MASK_PERIL1 S5P_CLKREG(0x0C354)
|
||||
|
||||
#define S5P_CLKDIV_STAT_TOP S5P_CLKREG(0x0C610)
|
||||
|
||||
#define S5P_CLKGATE_SCLKCAM S5P_CLKREG(0x0C820)
|
||||
#define S5P_CLKGATE_IP_CAM S5P_CLKREG(0x0C920)
|
||||
#define S5P_CLKGATE_IP_TV S5P_CLKREG(0x0C924)
|
||||
#define S5P_CLKGATE_IP_MFC S5P_CLKREG(0x0C928)
|
||||
#define S5P_CLKGATE_IP_G3D S5P_CLKREG(0x0C92C)
|
||||
#define S5P_CLKGATE_IP_IMAGE S5P_CLKREG(0x0C930)
|
||||
#define S5P_CLKGATE_IP_LCD0 S5P_CLKREG(0x0C934)
|
||||
#define S5P_CLKGATE_IP_LCD1 S5P_CLKREG(0x0C938)
|
||||
#define S5P_CLKGATE_IP_FSYS S5P_CLKREG(0x0C940)
|
||||
#define S5P_CLKGATE_IP_GPS S5P_CLKREG(0x0C94C)
|
||||
#define S5P_CLKGATE_IP_PERIL S5P_CLKREG(0x0C950)
|
||||
#define S5P_CLKGATE_IP_PERIR S5P_CLKREG(0x0C960)
|
||||
#define S5P_CLKGATE_BLOCK S5P_CLKREG(0x0C970)
|
||||
|
||||
#define S5P_CLKSRC_MASK_DMC S5P_CLKREG(0x10300)
|
||||
#define S5P_CLKSRC_DMC S5P_CLKREG(0x10200)
|
||||
#define S5P_CLKDIV_DMC0 S5P_CLKREG(0x10500)
|
||||
#define S5P_CLKDIV_DMC1 S5P_CLKREG(0x10504)
|
||||
#define S5P_CLKDIV_STAT_DMC0 S5P_CLKREG(0x10600)
|
||||
#define S5P_CLKGATE_IP_DMC S5P_CLKREG(0x10900)
|
||||
|
||||
#define S5P_APLL_LOCK S5P_CLKREG(0x14000)
|
||||
#define S5P_MPLL_LOCK S5P_CLKREG(0x14004)
|
||||
@ -94,21 +111,18 @@
|
||||
#define S5P_CLKDIV_STATCPU1 S5P_CLKREG(0x14604)
|
||||
|
||||
#define S5P_CLKGATE_SCLKCPU S5P_CLKREG(0x14800)
|
||||
#define S5P_CLKGATE_IP_CPU S5P_CLKREG(0x14900)
|
||||
|
||||
/* APLL_LOCK */
|
||||
#define S5P_APLL_LOCKTIME (0x1C20) /* 300us */
|
||||
|
||||
/* APLL_CON0 */
|
||||
#define S5P_APLLCON0_ENABLE_SHIFT (31)
|
||||
#define S5P_APLLCON0_LOCKED_SHIFT (29)
|
||||
#define S5P_APLL_VAL_1000 ((250 << 16) | (6 << 8) | 1)
|
||||
#define S5P_APLL_VAL_800 ((200 << 16) | (6 << 8) | 1)
|
||||
|
||||
/* CLK_SRC_CPU */
|
||||
#define S5P_CLKSRC_CPU_MUXCORE_SHIFT (16)
|
||||
#define S5P_CLKMUX_STATCPU_MUXCORE_MASK (0x7 << S5P_CLKSRC_CPU_MUXCORE_SHIFT)
|
||||
|
||||
/* CLKDIV_CPU0 */
|
||||
#define S5P_CLKDIV_CPU0_CORE_SHIFT (0)
|
||||
#define S5P_CLKDIV_CPU0_CORE_MASK (0x7 << S5P_CLKDIV_CPU0_CORE_SHIFT)
|
||||
#define S5P_CLKDIV_CPU0_COREM0_SHIFT (4)
|
||||
@ -124,7 +138,6 @@
|
||||
#define S5P_CLKDIV_CPU0_APLL_SHIFT (24)
|
||||
#define S5P_CLKDIV_CPU0_APLL_MASK (0x7 << S5P_CLKDIV_CPU0_APLL_SHIFT)
|
||||
|
||||
/* CLKDIV_DMC0 */
|
||||
#define S5P_CLKDIV_DMC0_ACP_SHIFT (0)
|
||||
#define S5P_CLKDIV_DMC0_ACP_MASK (0x7 << S5P_CLKDIV_DMC0_ACP_SHIFT)
|
||||
#define S5P_CLKDIV_DMC0_ACPPCLK_SHIFT (4)
|
||||
@ -142,7 +155,6 @@
|
||||
#define S5P_CLKDIV_DMC0_CORETI_SHIFT (28)
|
||||
#define S5P_CLKDIV_DMC0_CORETI_MASK (0x7 << S5P_CLKDIV_DMC0_CORETI_SHIFT)
|
||||
|
||||
/* CLKDIV_TOP */
|
||||
#define S5P_CLKDIV_TOP_ACLK200_SHIFT (0)
|
||||
#define S5P_CLKDIV_TOP_ACLK200_MASK (0x7 << S5P_CLKDIV_TOP_ACLK200_SHIFT)
|
||||
#define S5P_CLKDIV_TOP_ACLK100_SHIFT (4)
|
||||
@ -154,13 +166,14 @@
|
||||
#define S5P_CLKDIV_TOP_ONENAND_SHIFT (16)
|
||||
#define S5P_CLKDIV_TOP_ONENAND_MASK (0x7 << S5P_CLKDIV_TOP_ONENAND_SHIFT)
|
||||
|
||||
/* CLKDIV_LEFTBUS / CLKDIV_RIGHTBUS*/
|
||||
#define S5P_CLKDIV_BUS_GDLR_SHIFT (0)
|
||||
#define S5P_CLKDIV_BUS_GDLR_MASK (0x7 << S5P_CLKDIV_BUS_GDLR_SHIFT)
|
||||
#define S5P_CLKDIV_BUS_GPLR_SHIFT (4)
|
||||
#define S5P_CLKDIV_BUS_GPLR_MASK (0x7 << S5P_CLKDIV_BUS_GPLR_SHIFT)
|
||||
|
||||
/* Compatibility defines */
|
||||
/* Compatibility defines and inclusion */
|
||||
|
||||
#include <mach/regs-pmu.h>
|
||||
|
||||
#define S5P_EPLL_CON S5P_EPLL_CON0
|
||||
|
42
arch/arm/mach-exynos4/include/mach/regs-gpio.h
Normal file
42
arch/arm/mach-exynos4/include/mach/regs-gpio.h
Normal file
@ -0,0 +1,42 @@
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/regs-gpio.h
|
||||
*
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* EXYNOS4 - GPIO (including EINT) register definitions
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_REGS_GPIO_H
|
||||
#define __ASM_ARCH_REGS_GPIO_H __FILE__
|
||||
|
||||
#include <mach/map.h>
|
||||
#include <mach/irqs.h>
|
||||
|
||||
#define EXYNOS4_EINT40CON (S5P_VA_GPIO2 + 0xE00)
|
||||
#define S5P_EINT_CON(x) (EXYNOS4_EINT40CON + ((x) * 0x4))
|
||||
|
||||
#define EXYNOS4_EINT40FLTCON0 (S5P_VA_GPIO2 + 0xE80)
|
||||
#define S5P_EINT_FLTCON(x) (EXYNOS4_EINT40FLTCON0 + ((x) * 0x4))
|
||||
|
||||
#define EXYNOS4_EINT40MASK (S5P_VA_GPIO2 + 0xF00)
|
||||
#define S5P_EINT_MASK(x) (EXYNOS4_EINT40MASK + ((x) * 0x4))
|
||||
|
||||
#define EXYNOS4_EINT40PEND (S5P_VA_GPIO2 + 0xF40)
|
||||
#define S5P_EINT_PEND(x) (EXYNOS4_EINT40PEND + ((x) * 0x4))
|
||||
|
||||
#define EINT_REG_NR(x) (EINT_OFFSET(x) >> 3)
|
||||
|
||||
#define eint_irq_to_bit(irq) (1 << (EINT_OFFSET(irq) & 0x7))
|
||||
|
||||
#define EINT_MODE S3C_GPIO_SFN(0xf)
|
||||
|
||||
#define EINT_GPIO_0(x) EXYNOS4_GPX0(x)
|
||||
#define EINT_GPIO_1(x) EXYNOS4_GPX1(x)
|
||||
#define EINT_GPIO_2(x) EXYNOS4_GPX2(x)
|
||||
#define EINT_GPIO_3(x) EXYNOS4_GPX3(x)
|
||||
|
||||
#endif /* __ASM_ARCH_REGS_GPIO_H */
|
@ -1,9 +1,9 @@
|
||||
/* linux/arch/arm/mach-s5pv310/include/mach/regs-irq.h
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/regs-irq.h
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* S5PV310 - IRQ register definitions
|
||||
* EXYNOS4 - IRQ register definitions
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
52
arch/arm/mach-exynos4/include/mach/regs-mct.h
Normal file
52
arch/arm/mach-exynos4/include/mach/regs-mct.h
Normal file
@ -0,0 +1,52 @@
|
||||
/* arch/arm/mach-exynos4/include/mach/regs-mct.h
|
||||
*
|
||||
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* EXYNOS4 MCT configutation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_REGS_MCT_H
|
||||
#define __ASM_ARCH_REGS_MCT_H __FILE__
|
||||
|
||||
#include <mach/map.h>
|
||||
|
||||
#define EXYNOS4_MCTREG(x) (S5P_VA_SYSTIMER + (x))
|
||||
|
||||
#define EXYNOS4_MCT_G_CNT_L EXYNOS4_MCTREG(0x100)
|
||||
#define EXYNOS4_MCT_G_CNT_U EXYNOS4_MCTREG(0x104)
|
||||
#define EXYNOS4_MCT_G_CNT_WSTAT EXYNOS4_MCTREG(0x110)
|
||||
|
||||
#define EXYNOS4_MCT_G_COMP0_L EXYNOS4_MCTREG(0x200)
|
||||
#define EXYNOS4_MCT_G_COMP0_U EXYNOS4_MCTREG(0x204)
|
||||
#define EXYNOS4_MCT_G_COMP0_ADD_INCR EXYNOS4_MCTREG(0x208)
|
||||
|
||||
#define EXYNOS4_MCT_G_TCON EXYNOS4_MCTREG(0x240)
|
||||
|
||||
#define EXYNOS4_MCT_G_INT_CSTAT EXYNOS4_MCTREG(0x244)
|
||||
#define EXYNOS4_MCT_G_INT_ENB EXYNOS4_MCTREG(0x248)
|
||||
#define EXYNOS4_MCT_G_WSTAT EXYNOS4_MCTREG(0x24C)
|
||||
|
||||
#define EXYNOS4_MCT_L0_BASE EXYNOS4_MCTREG(0x300)
|
||||
#define EXYNOS4_MCT_L1_BASE EXYNOS4_MCTREG(0x400)
|
||||
|
||||
#define MCT_L_TCNTB_OFFSET (0x00)
|
||||
#define MCT_L_ICNTB_OFFSET (0x08)
|
||||
#define MCT_L_TCON_OFFSET (0x20)
|
||||
#define MCT_L_INT_CSTAT_OFFSET (0x30)
|
||||
#define MCT_L_INT_ENB_OFFSET (0x34)
|
||||
#define MCT_L_WSTAT_OFFSET (0x40)
|
||||
|
||||
#define MCT_G_TCON_START (1 << 8)
|
||||
#define MCT_G_TCON_COMP0_AUTO_INC (1 << 1)
|
||||
#define MCT_G_TCON_COMP0_ENABLE (1 << 0)
|
||||
|
||||
#define MCT_L_TCON_INTERVAL_MODE (1 << 2)
|
||||
#define MCT_L_TCON_INT_START (1 << 1)
|
||||
#define MCT_L_TCON_TIMER_START (1 << 0)
|
||||
|
||||
#endif /* __ASM_ARCH_REGS_MCT_H */
|
@ -1,9 +1,9 @@
|
||||
/* linux/arch/arm/mach-s5pv310/include/mach/regs-mem.h
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/regs-mem.h
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* S5PV310 - SROMC and DMC register definitions
|
||||
* EXYNOS4 - SROMC and DMC register definitions
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
162
arch/arm/mach-exynos4/include/mach/regs-pmu.h
Normal file
162
arch/arm/mach-exynos4/include/mach/regs-pmu.h
Normal file
@ -0,0 +1,162 @@
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/regs-pmu.h
|
||||
*
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* EXYNOS4 - Power management unit definition
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_REGS_PMU_H
|
||||
#define __ASM_ARCH_REGS_PMU_H __FILE__
|
||||
|
||||
#include <mach/map.h>
|
||||
|
||||
#define S5P_PMUREG(x) (S5P_VA_PMU + (x))
|
||||
|
||||
#define S5P_CENTRAL_SEQ_CONFIGURATION S5P_PMUREG(0x0200)
|
||||
|
||||
#define S5P_CENTRAL_LOWPWR_CFG (1 << 16)
|
||||
|
||||
#define S5P_CENTRAL_SEQ_OPTION S5P_PMUREG(0x0208)
|
||||
|
||||
#define S5P_USE_STANDBY_WFI0 (1 << 16)
|
||||
#define S5P_USE_STANDBY_WFI1 (1 << 17)
|
||||
#define S5P_USE_STANDBY_WFE0 (1 << 24)
|
||||
#define S5P_USE_STANDBY_WFE1 (1 << 25)
|
||||
#define S5P_USE_MASK ((0x3 << 16) | (0x3 << 24))
|
||||
|
||||
#define S5P_WAKEUP_STAT S5P_PMUREG(0x0600)
|
||||
#define S5P_EINT_WAKEUP_MASK S5P_PMUREG(0x0604)
|
||||
#define S5P_WAKEUP_MASK S5P_PMUREG(0x0608)
|
||||
|
||||
#define S5P_MIPI_DPHY_CONTROL(n) S5P_PMUREG(0x0710 + (n) * 4)
|
||||
#define S5P_MIPI_DPHY_ENABLE (1 << 0)
|
||||
#define S5P_MIPI_DPHY_SRESETN (1 << 1)
|
||||
#define S5P_MIPI_DPHY_MRESETN (1 << 2)
|
||||
|
||||
#define S5P_PMU_SATA_PHY_CONTROL S5P_PMUREG(0x0720)
|
||||
#define S5P_INFORM0 S5P_PMUREG(0x0800)
|
||||
#define S5P_INFORM1 S5P_PMUREG(0x0804)
|
||||
#define S5P_INFORM2 S5P_PMUREG(0x0808)
|
||||
#define S5P_INFORM3 S5P_PMUREG(0x080C)
|
||||
#define S5P_INFORM4 S5P_PMUREG(0x0810)
|
||||
#define S5P_INFORM5 S5P_PMUREG(0x0814)
|
||||
#define S5P_INFORM6 S5P_PMUREG(0x0818)
|
||||
#define S5P_INFORM7 S5P_PMUREG(0x081C)
|
||||
|
||||
#define S5P_ARM_CORE0_LOWPWR S5P_PMUREG(0x1000)
|
||||
#define S5P_DIS_IRQ_CORE0 S5P_PMUREG(0x1004)
|
||||
#define S5P_DIS_IRQ_CENTRAL0 S5P_PMUREG(0x1008)
|
||||
#define S5P_ARM_CORE1_LOWPWR S5P_PMUREG(0x1010)
|
||||
#define S5P_DIS_IRQ_CORE1 S5P_PMUREG(0x1014)
|
||||
#define S5P_DIS_IRQ_CENTRAL1 S5P_PMUREG(0x1018)
|
||||
#define S5P_ARM_COMMON_LOWPWR S5P_PMUREG(0x1080)
|
||||
#define S5P_L2_0_LOWPWR S5P_PMUREG(0x10C0)
|
||||
#define S5P_L2_1_LOWPWR S5P_PMUREG(0x10C4)
|
||||
#define S5P_CMU_ACLKSTOP_LOWPWR S5P_PMUREG(0x1100)
|
||||
#define S5P_CMU_SCLKSTOP_LOWPWR S5P_PMUREG(0x1104)
|
||||
#define S5P_CMU_RESET_LOWPWR S5P_PMUREG(0x110C)
|
||||
#define S5P_APLL_SYSCLK_LOWPWR S5P_PMUREG(0x1120)
|
||||
#define S5P_MPLL_SYSCLK_LOWPWR S5P_PMUREG(0x1124)
|
||||
#define S5P_VPLL_SYSCLK_LOWPWR S5P_PMUREG(0x1128)
|
||||
#define S5P_EPLL_SYSCLK_LOWPWR S5P_PMUREG(0x112C)
|
||||
#define S5P_CMU_CLKSTOP_GPS_ALIVE_LOWPWR S5P_PMUREG(0x1138)
|
||||
#define S5P_CMU_RESET_GPSALIVE_LOWPWR S5P_PMUREG(0x113C)
|
||||
#define S5P_CMU_CLKSTOP_CAM_LOWPWR S5P_PMUREG(0x1140)
|
||||
#define S5P_CMU_CLKSTOP_TV_LOWPWR S5P_PMUREG(0x1144)
|
||||
#define S5P_CMU_CLKSTOP_MFC_LOWPWR S5P_PMUREG(0x1148)
|
||||
#define S5P_CMU_CLKSTOP_G3D_LOWPWR S5P_PMUREG(0x114C)
|
||||
#define S5P_CMU_CLKSTOP_LCD0_LOWPWR S5P_PMUREG(0x1150)
|
||||
#define S5P_CMU_CLKSTOP_LCD1_LOWPWR S5P_PMUREG(0x1154)
|
||||
#define S5P_CMU_CLKSTOP_MAUDIO_LOWPWR S5P_PMUREG(0x1158)
|
||||
#define S5P_CMU_CLKSTOP_GPS_LOWPWR S5P_PMUREG(0x115C)
|
||||
#define S5P_CMU_RESET_CAM_LOWPWR S5P_PMUREG(0x1160)
|
||||
#define S5P_CMU_RESET_TV_LOWPWR S5P_PMUREG(0x1164)
|
||||
#define S5P_CMU_RESET_MFC_LOWPWR S5P_PMUREG(0x1168)
|
||||
#define S5P_CMU_RESET_G3D_LOWPWR S5P_PMUREG(0x116C)
|
||||
#define S5P_CMU_RESET_LCD0_LOWPWR S5P_PMUREG(0x1170)
|
||||
#define S5P_CMU_RESET_LCD1_LOWPWR S5P_PMUREG(0x1174)
|
||||
#define S5P_CMU_RESET_MAUDIO_LOWPWR S5P_PMUREG(0x1178)
|
||||
#define S5P_CMU_RESET_GPS_LOWPWR S5P_PMUREG(0x117C)
|
||||
#define S5P_TOP_BUS_LOWPWR S5P_PMUREG(0x1180)
|
||||
#define S5P_TOP_RETENTION_LOWPWR S5P_PMUREG(0x1184)
|
||||
#define S5P_TOP_PWR_LOWPWR S5P_PMUREG(0x1188)
|
||||
#define S5P_LOGIC_RESET_LOWPWR S5P_PMUREG(0x11A0)
|
||||
#define S5P_ONENAND_MEM_LOWPWR S5P_PMUREG(0x11C0)
|
||||
#define S5P_MODIMIF_MEM_LOWPWR S5P_PMUREG(0x11C4)
|
||||
#define S5P_G2D_ACP_MEM_LOWPWR S5P_PMUREG(0x11C8)
|
||||
#define S5P_USBOTG_MEM_LOWPWR S5P_PMUREG(0x11CC)
|
||||
#define S5P_HSMMC_MEM_LOWPWR S5P_PMUREG(0x11D0)
|
||||
#define S5P_CSSYS_MEM_LOWPWR S5P_PMUREG(0x11D4)
|
||||
#define S5P_SECSS_MEM_LOWPWR S5P_PMUREG(0x11D8)
|
||||
#define S5P_PCIE_MEM_LOWPWR S5P_PMUREG(0x11E0)
|
||||
#define S5P_SATA_MEM_LOWPWR S5P_PMUREG(0x11E4)
|
||||
#define S5P_PAD_RETENTION_DRAM_LOWPWR S5P_PMUREG(0x1200)
|
||||
#define S5P_PAD_RETENTION_MAUDIO_LOWPWR S5P_PMUREG(0x1204)
|
||||
#define S5P_PAD_RETENTION_GPIO_LOWPWR S5P_PMUREG(0x1220)
|
||||
#define S5P_PAD_RETENTION_UART_LOWPWR S5P_PMUREG(0x1224)
|
||||
#define S5P_PAD_RETENTION_MMCA_LOWPWR S5P_PMUREG(0x1228)
|
||||
#define S5P_PAD_RETENTION_MMCB_LOWPWR S5P_PMUREG(0x122C)
|
||||
#define S5P_PAD_RETENTION_EBIA_LOWPWR S5P_PMUREG(0x1230)
|
||||
#define S5P_PAD_RETENTION_EBIB_LOWPWR S5P_PMUREG(0x1234)
|
||||
#define S5P_PAD_RETENTION_ISOLATION_LOWPWR S5P_PMUREG(0x1240)
|
||||
#define S5P_PAD_RETENTION_ALV_SEL_LOWPWR S5P_PMUREG(0x1260)
|
||||
#define S5P_XUSBXTI_LOWPWR S5P_PMUREG(0x1280)
|
||||
#define S5P_XXTI_LOWPWR S5P_PMUREG(0x1284)
|
||||
#define S5P_EXT_REGULATOR_LOWPWR S5P_PMUREG(0x12C0)
|
||||
#define S5P_GPIO_MODE_LOWPWR S5P_PMUREG(0x1300)
|
||||
#define S5P_GPIO_MODE_MAUDIO_LOWPWR S5P_PMUREG(0x1340)
|
||||
#define S5P_CAM_LOWPWR S5P_PMUREG(0x1380)
|
||||
#define S5P_TV_LOWPWR S5P_PMUREG(0x1384)
|
||||
#define S5P_MFC_LOWPWR S5P_PMUREG(0x1388)
|
||||
#define S5P_G3D_LOWPWR S5P_PMUREG(0x138C)
|
||||
#define S5P_LCD0_LOWPWR S5P_PMUREG(0x1390)
|
||||
#define S5P_LCD1_LOWPWR S5P_PMUREG(0x1394)
|
||||
#define S5P_MAUDIO_LOWPWR S5P_PMUREG(0x1398)
|
||||
#define S5P_GPS_LOWPWR S5P_PMUREG(0x139C)
|
||||
#define S5P_GPS_ALIVE_LOWPWR S5P_PMUREG(0x13A0)
|
||||
|
||||
#define S5P_ARM_CORE0_CONFIGURATION S5P_PMUREG(0x2000)
|
||||
#define S5P_ARM_CORE0_OPTION S5P_PMUREG(0x2008)
|
||||
#define S5P_ARM_CORE1_CONFIGURATION S5P_PMUREG(0x2080)
|
||||
#define S5P_ARM_CORE1_STATUS S5P_PMUREG(0x2084)
|
||||
#define S5P_ARM_CORE1_OPTION S5P_PMUREG(0x2088)
|
||||
|
||||
#define S5P_ARM_COMMON_OPTION S5P_PMUREG(0x2408)
|
||||
#define S5P_TOP_PWR_OPTION S5P_PMUREG(0x2C48)
|
||||
#define S5P_CAM_OPTION S5P_PMUREG(0x3C08)
|
||||
#define S5P_TV_OPTION S5P_PMUREG(0x3C28)
|
||||
#define S5P_MFC_OPTION S5P_PMUREG(0x3C48)
|
||||
#define S5P_G3D_OPTION S5P_PMUREG(0x3C68)
|
||||
#define S5P_LCD0_OPTION S5P_PMUREG(0x3C88)
|
||||
#define S5P_LCD1_OPTION S5P_PMUREG(0x3CA8)
|
||||
#define S5P_MAUDIO_OPTION S5P_PMUREG(0x3CC8)
|
||||
#define S5P_GPS_OPTION S5P_PMUREG(0x3CE8)
|
||||
#define S5P_GPS_ALIVE_OPTION S5P_PMUREG(0x3D08)
|
||||
|
||||
#define S5P_PAD_RET_MAUDIO_OPTION S5P_PMUREG(0x3028)
|
||||
#define S5P_PAD_RET_GPIO_OPTION S5P_PMUREG(0x3108)
|
||||
#define S5P_PAD_RET_UART_OPTION S5P_PMUREG(0x3128)
|
||||
#define S5P_PAD_RET_MMCA_OPTION S5P_PMUREG(0x3148)
|
||||
#define S5P_PAD_RET_MMCB_OPTION S5P_PMUREG(0x3168)
|
||||
#define S5P_PAD_RET_EBIA_OPTION S5P_PMUREG(0x3188)
|
||||
#define S5P_PAD_RET_EBIB_OPTION S5P_PMUREG(0x31A8)
|
||||
|
||||
#define S5P_PMU_CAM_CONF S5P_PMUREG(0x3C00)
|
||||
#define S5P_PMU_TV_CONF S5P_PMUREG(0x3C20)
|
||||
#define S5P_PMU_MFC_CONF S5P_PMUREG(0x3C40)
|
||||
#define S5P_PMU_G3D_CONF S5P_PMUREG(0x3C60)
|
||||
#define S5P_PMU_LCD0_CONF S5P_PMUREG(0x3C80)
|
||||
#define S5P_PMU_LCD1_CONF S5P_PMUREG(0x3CA0)
|
||||
#define S5P_PMU_GPS_CONF S5P_PMUREG(0x3CE0)
|
||||
|
||||
#define S5P_PMU_SATA_PHY_CONTROL_EN 0x1
|
||||
#define S5P_INT_LOCAL_PWR_EN 0x7
|
||||
|
||||
#define S5P_CHECK_SLEEP 0x00000BAD
|
||||
|
||||
#endif /* __ASM_ARCH_REGS_PMU_H */
|
@ -1,9 +1,9 @@
|
||||
/* linux/arch/arm/mach-s5pv310/include/mach/regs-sysmmu.h
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/regs-sysmmu.h
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* S5PV310 - System MMU register
|
||||
* EXYNOS4 - System MMU register
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@ -19,6 +19,10 @@
|
||||
#define S5P_MMU_FLUSH 0x00C
|
||||
#define S5P_PT_BASE_ADDR 0x014
|
||||
#define S5P_INT_STATUS 0x018
|
||||
#define S5P_INT_CLEAR 0x01C
|
||||
#define S5P_PAGE_FAULT_ADDR 0x024
|
||||
#define S5P_AW_FAULT_ADDR 0x028
|
||||
#define S5P_AR_FAULT_ADDR 0x02C
|
||||
#define S5P_DEFAULT_SLAVE_ADDR 0x030
|
||||
|
||||
#endif /* __ASM_ARCH_REGS_SYSMMU_H */
|
@ -1,4 +1,4 @@
|
||||
/* linux/arch/arm/mach-s5pv310/include/mach/smp.h
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/smp.h
|
||||
*
|
||||
* Cloned from arch/arm/mach-realview/include/mach/smp.h
|
||||
*/
|
46
arch/arm/mach-exynos4/include/mach/sysmmu.h
Normal file
46
arch/arm/mach-exynos4/include/mach/sysmmu.h
Normal file
@ -0,0 +1,46 @@
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/sysmmu.h
|
||||
*
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* Samsung sysmmu driver for EXYNOS4
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARM_ARCH_SYSMMU_H
|
||||
#define __ASM_ARM_ARCH_SYSMMU_H __FILE__
|
||||
|
||||
enum exynos4_sysmmu_ips {
|
||||
SYSMMU_MDMA,
|
||||
SYSMMU_SSS,
|
||||
SYSMMU_FIMC0,
|
||||
SYSMMU_FIMC1,
|
||||
SYSMMU_FIMC2,
|
||||
SYSMMU_FIMC3,
|
||||
SYSMMU_JPEG,
|
||||
SYSMMU_FIMD0,
|
||||
SYSMMU_FIMD1,
|
||||
SYSMMU_PCIe,
|
||||
SYSMMU_G2D,
|
||||
SYSMMU_ROTATOR,
|
||||
SYSMMU_MDMA2,
|
||||
SYSMMU_TV,
|
||||
SYSMMU_MFC_L,
|
||||
SYSMMU_MFC_R,
|
||||
EXYNOS4_SYSMMU_TOTAL_IPNUM,
|
||||
};
|
||||
|
||||
#define S5P_SYSMMU_TOTAL_IPNUM EXYNOS4_SYSMMU_TOTAL_IPNUM
|
||||
|
||||
extern const char *sysmmu_ips_name[EXYNOS4_SYSMMU_TOTAL_IPNUM];
|
||||
|
||||
typedef enum exynos4_sysmmu_ips sysmmu_ips;
|
||||
|
||||
void sysmmu_clk_init(struct device *dev, sysmmu_ips ips);
|
||||
void sysmmu_clk_enable(sysmmu_ips ips);
|
||||
void sysmmu_clk_disable(sysmmu_ips ips);
|
||||
|
||||
#endif /* __ASM_ARM_ARCH_SYSMMU_H */
|
@ -1,9 +1,9 @@
|
||||
/* linux/arch/arm/mach-s5pv310/include/mach/system.h
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/system.h
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* S5PV310 - system support header
|
||||
* EXYNOS4 - system support header
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
@ -1,14 +1,14 @@
|
||||
/* linux/arch/arm/mach-s5pv310/include/mach/timex.h
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/timex.h
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* Copyright (c) 2003-2010 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* Based on arch/arm/mach-s5p6442/include/mach/timex.h
|
||||
*
|
||||
* S5PV310 - time parameters
|
||||
* EXYNOS4 - time parameters
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
@ -1,9 +1,9 @@
|
||||
/* linux/arch/arm/mach-s5pv310/include/mach/uncompress.h
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/uncompress.h
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* S5PV310 - uncompress code
|
||||
* EXYNOS4 - uncompress code
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
@ -1,7 +1,7 @@
|
||||
/* linux/arch/arm/mach-s5pv310/include/mach/vmalloc.h
|
||||
/* linux/arch/arm/mach-exynos4/include/mach/vmalloc.h
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* Copyright 2010 Ben Dooks <ben-linux@fluff.org>
|
||||
*
|
||||
@ -11,7 +11,7 @@
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* S5PV310 vmalloc definition
|
||||
* EXYNOS4 vmalloc definition
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_VMALLOC_H
|
@ -1,4 +1,4 @@
|
||||
/* linux/arch/arm/mach-s5pv310/init.c
|
||||
/* linux/arch/arm/mach-exynos4/init.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
@ -14,7 +14,7 @@
|
||||
#include <plat/devs.h>
|
||||
#include <plat/regs-serial.h>
|
||||
|
||||
static struct s3c24xx_uart_clksrc s5pv310_serial_clocks[] = {
|
||||
static struct s3c24xx_uart_clksrc exynos4_serial_clocks[] = {
|
||||
[0] = {
|
||||
.name = "uclk1",
|
||||
.divisor = 1,
|
||||
@ -24,7 +24,7 @@ static struct s3c24xx_uart_clksrc s5pv310_serial_clocks[] = {
|
||||
};
|
||||
|
||||
/* uart registration process */
|
||||
void __init s5pv310_common_init_uarts(struct s3c2410_uartcfg *cfg, int no)
|
||||
void __init exynos4_common_init_uarts(struct s3c2410_uartcfg *cfg, int no)
|
||||
{
|
||||
struct s3c2410_uartcfg *tcfg = cfg;
|
||||
u32 ucnt;
|
||||
@ -32,8 +32,8 @@ void __init s5pv310_common_init_uarts(struct s3c2410_uartcfg *cfg, int no)
|
||||
for (ucnt = 0; ucnt < no; ucnt++, tcfg++) {
|
||||
if (!tcfg->clocks) {
|
||||
tcfg->has_fracval = 1;
|
||||
tcfg->clocks = s5pv310_serial_clocks;
|
||||
tcfg->clocks_size = ARRAY_SIZE(s5pv310_serial_clocks);
|
||||
tcfg->clocks = exynos4_serial_clocks;
|
||||
tcfg->clocks_size = ARRAY_SIZE(exynos4_serial_clocks);
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* linux/arch/arm/mach-s5pv310/irq-combiner.c
|
||||
/* linux/arch/arm/mach-exynos4/irq-combiner.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* Based on arch/arm/common/gic.c
|
@ -1,9 +1,9 @@
|
||||
/* linux/arch/arm/mach-s5pv310/irq-eint.c
|
||||
/* linux/arch/arm/mach-exynos4/irq-eint.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* S5PV310 - IRQ EINT support
|
||||
* EXYNOS4 - IRQ EINT support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@ -27,7 +27,7 @@ static DEFINE_SPINLOCK(eint_lock);
|
||||
|
||||
static unsigned int eint0_15_data[16];
|
||||
|
||||
static unsigned int s5pv310_get_irq_nr(unsigned int number)
|
||||
static unsigned int exynos4_get_irq_nr(unsigned int number)
|
||||
{
|
||||
u32 ret = 0;
|
||||
|
||||
@ -48,7 +48,7 @@ static unsigned int s5pv310_get_irq_nr(unsigned int number)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void s5pv310_irq_eint_mask(struct irq_data *data)
|
||||
static inline void exynos4_irq_eint_mask(struct irq_data *data)
|
||||
{
|
||||
u32 mask;
|
||||
|
||||
@ -59,7 +59,7 @@ static inline void s5pv310_irq_eint_mask(struct irq_data *data)
|
||||
spin_unlock(&eint_lock);
|
||||
}
|
||||
|
||||
static void s5pv310_irq_eint_unmask(struct irq_data *data)
|
||||
static void exynos4_irq_eint_unmask(struct irq_data *data)
|
||||
{
|
||||
u32 mask;
|
||||
|
||||
@ -70,19 +70,19 @@ static void s5pv310_irq_eint_unmask(struct irq_data *data)
|
||||
spin_unlock(&eint_lock);
|
||||
}
|
||||
|
||||
static inline void s5pv310_irq_eint_ack(struct irq_data *data)
|
||||
static inline void exynos4_irq_eint_ack(struct irq_data *data)
|
||||
{
|
||||
__raw_writel(eint_irq_to_bit(data->irq),
|
||||
S5P_EINT_PEND(EINT_REG_NR(data->irq)));
|
||||
}
|
||||
|
||||
static void s5pv310_irq_eint_maskack(struct irq_data *data)
|
||||
static void exynos4_irq_eint_maskack(struct irq_data *data)
|
||||
{
|
||||
s5pv310_irq_eint_mask(data);
|
||||
s5pv310_irq_eint_ack(data);
|
||||
exynos4_irq_eint_mask(data);
|
||||
exynos4_irq_eint_ack(data);
|
||||
}
|
||||
|
||||
static int s5pv310_irq_eint_set_type(struct irq_data *data, unsigned int type)
|
||||
static int exynos4_irq_eint_set_type(struct irq_data *data, unsigned int type)
|
||||
{
|
||||
int offs = EINT_OFFSET(data->irq);
|
||||
int shift;
|
||||
@ -145,19 +145,19 @@ static int s5pv310_irq_eint_set_type(struct irq_data *data, unsigned int type)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct irq_chip s5pv310_irq_eint = {
|
||||
.name = "s5pv310-eint",
|
||||
.irq_mask = s5pv310_irq_eint_mask,
|
||||
.irq_unmask = s5pv310_irq_eint_unmask,
|
||||
.irq_mask_ack = s5pv310_irq_eint_maskack,
|
||||
.irq_ack = s5pv310_irq_eint_ack,
|
||||
.irq_set_type = s5pv310_irq_eint_set_type,
|
||||
static struct irq_chip exynos4_irq_eint = {
|
||||
.name = "exynos4-eint",
|
||||
.irq_mask = exynos4_irq_eint_mask,
|
||||
.irq_unmask = exynos4_irq_eint_unmask,
|
||||
.irq_mask_ack = exynos4_irq_eint_maskack,
|
||||
.irq_ack = exynos4_irq_eint_ack,
|
||||
.irq_set_type = exynos4_irq_eint_set_type,
|
||||
#ifdef CONFIG_PM
|
||||
.irq_set_wake = s3c_irqext_wake,
|
||||
#endif
|
||||
};
|
||||
|
||||
/* s5pv310_irq_demux_eint
|
||||
/* exynos4_irq_demux_eint
|
||||
*
|
||||
* This function demuxes the IRQ from from EINTs 16 to 31.
|
||||
* It is designed to be inlined into the specific handler
|
||||
@ -165,7 +165,7 @@ static struct irq_chip s5pv310_irq_eint = {
|
||||
*
|
||||
* Each EINT pend/mask registers handle eight of them.
|
||||
*/
|
||||
static inline void s5pv310_irq_demux_eint(unsigned int start)
|
||||
static inline void exynos4_irq_demux_eint(unsigned int start)
|
||||
{
|
||||
unsigned int irq;
|
||||
|
||||
@ -182,13 +182,13 @@ static inline void s5pv310_irq_demux_eint(unsigned int start)
|
||||
}
|
||||
}
|
||||
|
||||
static void s5pv310_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc)
|
||||
static void exynos4_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
s5pv310_irq_demux_eint(IRQ_EINT(16));
|
||||
s5pv310_irq_demux_eint(IRQ_EINT(24));
|
||||
exynos4_irq_demux_eint(IRQ_EINT(16));
|
||||
exynos4_irq_demux_eint(IRQ_EINT(24));
|
||||
}
|
||||
|
||||
static void s5pv310_irq_eint0_15(unsigned int irq, struct irq_desc *desc)
|
||||
static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
u32 *irq_data = get_irq_data(irq);
|
||||
struct irq_chip *chip = get_irq_chip(irq);
|
||||
@ -203,27 +203,27 @@ static void s5pv310_irq_eint0_15(unsigned int irq, struct irq_desc *desc)
|
||||
chip->irq_unmask(&desc->irq_data);
|
||||
}
|
||||
|
||||
int __init s5pv310_init_irq_eint(void)
|
||||
int __init exynos4_init_irq_eint(void)
|
||||
{
|
||||
int irq;
|
||||
|
||||
for (irq = 0 ; irq <= 31 ; irq++) {
|
||||
set_irq_chip(IRQ_EINT(irq), &s5pv310_irq_eint);
|
||||
set_irq_chip(IRQ_EINT(irq), &exynos4_irq_eint);
|
||||
set_irq_handler(IRQ_EINT(irq), handle_level_irq);
|
||||
set_irq_flags(IRQ_EINT(irq), IRQF_VALID);
|
||||
}
|
||||
|
||||
set_irq_chained_handler(IRQ_EINT16_31, s5pv310_irq_demux_eint16_31);
|
||||
set_irq_chained_handler(IRQ_EINT16_31, exynos4_irq_demux_eint16_31);
|
||||
|
||||
for (irq = 0 ; irq <= 15 ; irq++) {
|
||||
eint0_15_data[irq] = IRQ_EINT(irq);
|
||||
|
||||
set_irq_data(s5pv310_get_irq_nr(irq), &eint0_15_data[irq]);
|
||||
set_irq_chained_handler(s5pv310_get_irq_nr(irq),
|
||||
s5pv310_irq_eint0_15);
|
||||
set_irq_data(exynos4_get_irq_nr(irq), &eint0_15_data[irq]);
|
||||
set_irq_chained_handler(exynos4_get_irq_nr(irq),
|
||||
exynos4_irq_eint0_15);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
arch_initcall(s5pv310_init_irq_eint);
|
||||
arch_initcall(exynos4_init_irq_eint);
|
@ -1,4 +1,4 @@
|
||||
/* linux/arch/arm/mach-s5pv310/localtimer.c
|
||||
/* linux/arch/arm/mach-exynos4/localtimer.c
|
||||
*
|
||||
* Cloned from linux/arch/arm/mach-realview/localtimer.c
|
||||
*
|
215
arch/arm/mach-exynos4/mach-armlex4210.c
Normal file
215
arch/arm/mach-exynos4/mach-armlex4210.c
Normal file
@ -0,0 +1,215 @@
|
||||
/* linux/arch/arm/mach-exynos4/mach-armlex4210.c
|
||||
*
|
||||
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/smsc911x.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/devs.h>
|
||||
#include <plat/exynos4.h>
|
||||
#include <plat/gpio-cfg.h>
|
||||
#include <plat/regs-serial.h>
|
||||
#include <plat/regs-srom.h>
|
||||
#include <plat/sdhci.h>
|
||||
|
||||
#include <mach/map.h>
|
||||
|
||||
/* Following are default values for UCON, ULCON and UFCON UART registers */
|
||||
#define ARMLEX4210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \
|
||||
S3C2410_UCON_RXILEVEL | \
|
||||
S3C2410_UCON_TXIRQMODE | \
|
||||
S3C2410_UCON_RXIRQMODE | \
|
||||
S3C2410_UCON_RXFIFO_TOI | \
|
||||
S3C2443_UCON_RXERR_IRQEN)
|
||||
|
||||
#define ARMLEX4210_ULCON_DEFAULT S3C2410_LCON_CS8
|
||||
|
||||
#define ARMLEX4210_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \
|
||||
S5PV210_UFCON_TXTRIG4 | \
|
||||
S5PV210_UFCON_RXTRIG4)
|
||||
|
||||
static struct s3c2410_uartcfg armlex4210_uartcfgs[] __initdata = {
|
||||
[0] = {
|
||||
.hwport = 0,
|
||||
.flags = 0,
|
||||
.ucon = ARMLEX4210_UCON_DEFAULT,
|
||||
.ulcon = ARMLEX4210_ULCON_DEFAULT,
|
||||
.ufcon = ARMLEX4210_UFCON_DEFAULT,
|
||||
},
|
||||
[1] = {
|
||||
.hwport = 1,
|
||||
.flags = 0,
|
||||
.ucon = ARMLEX4210_UCON_DEFAULT,
|
||||
.ulcon = ARMLEX4210_ULCON_DEFAULT,
|
||||
.ufcon = ARMLEX4210_UFCON_DEFAULT,
|
||||
},
|
||||
[2] = {
|
||||
.hwport = 2,
|
||||
.flags = 0,
|
||||
.ucon = ARMLEX4210_UCON_DEFAULT,
|
||||
.ulcon = ARMLEX4210_ULCON_DEFAULT,
|
||||
.ufcon = ARMLEX4210_UFCON_DEFAULT,
|
||||
},
|
||||
[3] = {
|
||||
.hwport = 3,
|
||||
.flags = 0,
|
||||
.ucon = ARMLEX4210_UCON_DEFAULT,
|
||||
.ulcon = ARMLEX4210_ULCON_DEFAULT,
|
||||
.ufcon = ARMLEX4210_UFCON_DEFAULT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct s3c_sdhci_platdata armlex4210_hsmmc0_pdata __initdata = {
|
||||
.cd_type = S3C_SDHCI_CD_PERMANENT,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
#ifdef CONFIG_EXYNOS4_SDHCI_CH0_8BIT
|
||||
.max_width = 8,
|
||||
.host_caps = MMC_CAP_8_BIT_DATA,
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct s3c_sdhci_platdata armlex4210_hsmmc2_pdata __initdata = {
|
||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
||||
.ext_cd_gpio = EXYNOS4_GPX2(5),
|
||||
.ext_cd_gpio_invert = 1,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
.max_width = 4,
|
||||
};
|
||||
|
||||
static struct s3c_sdhci_platdata armlex4210_hsmmc3_pdata __initdata = {
|
||||
.cd_type = S3C_SDHCI_CD_PERMANENT,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
.max_width = 4,
|
||||
};
|
||||
|
||||
static void __init armlex4210_sdhci_init(void)
|
||||
{
|
||||
s3c_sdhci0_set_platdata(&armlex4210_hsmmc0_pdata);
|
||||
s3c_sdhci2_set_platdata(&armlex4210_hsmmc2_pdata);
|
||||
s3c_sdhci3_set_platdata(&armlex4210_hsmmc3_pdata);
|
||||
}
|
||||
|
||||
static void __init armlex4210_wlan_init(void)
|
||||
{
|
||||
/* enable */
|
||||
s3c_gpio_cfgpin(EXYNOS4_GPX2(0), S3C_GPIO_SFN(0xf));
|
||||
s3c_gpio_setpull(EXYNOS4_GPX2(0), S3C_GPIO_PULL_UP);
|
||||
|
||||
/* reset */
|
||||
s3c_gpio_cfgpin(EXYNOS4_GPX1(6), S3C_GPIO_SFN(0xf));
|
||||
s3c_gpio_setpull(EXYNOS4_GPX1(6), S3C_GPIO_PULL_UP);
|
||||
|
||||
/* wakeup */
|
||||
s3c_gpio_cfgpin(EXYNOS4_GPX1(5), S3C_GPIO_SFN(0xf));
|
||||
s3c_gpio_setpull(EXYNOS4_GPX1(5), S3C_GPIO_PULL_UP);
|
||||
}
|
||||
|
||||
static struct resource armlex4210_smsc911x_resources[] = {
|
||||
[0] = {
|
||||
.start = EXYNOS4_PA_SROM_BANK(3),
|
||||
.end = EXYNOS4_PA_SROM_BANK(3) + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = IRQ_EINT(27),
|
||||
.end = IRQ_EINT(27),
|
||||
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH,
|
||||
},
|
||||
};
|
||||
|
||||
static struct smsc911x_platform_config smsc9215_config = {
|
||||
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH,
|
||||
.irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
|
||||
.flags = SMSC911X_USE_16BIT | SMSC911X_FORCE_INTERNAL_PHY,
|
||||
.phy_interface = PHY_INTERFACE_MODE_MII,
|
||||
.mac = {0x00, 0x80, 0x00, 0x23, 0x45, 0x67},
|
||||
};
|
||||
|
||||
static struct platform_device armlex4210_smsc911x = {
|
||||
.name = "smsc911x",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(armlex4210_smsc911x_resources),
|
||||
.resource = armlex4210_smsc911x_resources,
|
||||
.dev = {
|
||||
.platform_data = &smsc9215_config,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *armlex4210_devices[] __initdata = {
|
||||
&s3c_device_hsmmc0,
|
||||
&s3c_device_hsmmc2,
|
||||
&s3c_device_hsmmc3,
|
||||
&s3c_device_rtc,
|
||||
&s3c_device_wdt,
|
||||
&exynos4_device_sysmmu,
|
||||
&samsung_asoc_dma,
|
||||
&armlex4210_smsc911x,
|
||||
&exynos4_device_ahci,
|
||||
};
|
||||
|
||||
static void __init armlex4210_smsc911x_init(void)
|
||||
{
|
||||
u32 cs1;
|
||||
|
||||
/* configure nCS1 width to 16 bits */
|
||||
cs1 = __raw_readl(S5P_SROM_BW) &
|
||||
~(S5P_SROM_BW__CS_MASK << S5P_SROM_BW__NCS1__SHIFT);
|
||||
cs1 |= ((1 << S5P_SROM_BW__DATAWIDTH__SHIFT) |
|
||||
(0 << S5P_SROM_BW__WAITENABLE__SHIFT) |
|
||||
(1 << S5P_SROM_BW__ADDRMODE__SHIFT) |
|
||||
(1 << S5P_SROM_BW__BYTEENABLE__SHIFT)) <<
|
||||
S5P_SROM_BW__NCS1__SHIFT;
|
||||
__raw_writel(cs1, S5P_SROM_BW);
|
||||
|
||||
/* set timing for nCS1 suitable for ethernet chip */
|
||||
__raw_writel((0x1 << S5P_SROM_BCX__PMC__SHIFT) |
|
||||
(0x9 << S5P_SROM_BCX__TACP__SHIFT) |
|
||||
(0xc << S5P_SROM_BCX__TCAH__SHIFT) |
|
||||
(0x1 << S5P_SROM_BCX__TCOH__SHIFT) |
|
||||
(0x6 << S5P_SROM_BCX__TACC__SHIFT) |
|
||||
(0x1 << S5P_SROM_BCX__TCOS__SHIFT) |
|
||||
(0x1 << S5P_SROM_BCX__TACS__SHIFT), S5P_SROM_BC1);
|
||||
}
|
||||
|
||||
static void __init armlex4210_map_io(void)
|
||||
{
|
||||
s5p_init_io(NULL, 0, S5P_VA_CHIPID);
|
||||
s3c24xx_init_clocks(24000000);
|
||||
s3c24xx_init_uarts(armlex4210_uartcfgs,
|
||||
ARRAY_SIZE(armlex4210_uartcfgs));
|
||||
}
|
||||
|
||||
static void __init armlex4210_machine_init(void)
|
||||
{
|
||||
armlex4210_smsc911x_init();
|
||||
|
||||
armlex4210_sdhci_init();
|
||||
|
||||
armlex4210_wlan_init();
|
||||
|
||||
platform_add_devices(armlex4210_devices,
|
||||
ARRAY_SIZE(armlex4210_devices));
|
||||
}
|
||||
|
||||
MACHINE_START(ARMLEX4210, "ARMLEX4210")
|
||||
/* Maintainer: Alim Akhtar <alim.akhtar@samsung.com> */
|
||||
.boot_params = S5P_PA_SDRAM + 0x100,
|
||||
.init_irq = exynos4_init_irq,
|
||||
.map_io = armlex4210_map_io,
|
||||
.init_machine = armlex4210_machine_init,
|
||||
.timer = &exynos4_timer,
|
||||
MACHINE_END
|
305
arch/arm/mach-exynos4/mach-nuri.c
Normal file
305
arch/arm/mach-exynos4/mach-nuri.c
Normal file
@ -0,0 +1,305 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-exynos4/mach-nuri.c
|
||||
*
|
||||
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
|
||||
#include <video/platform_lcd.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <plat/regs-serial.h>
|
||||
#include <plat/exynos4.h>
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/devs.h>
|
||||
#include <plat/sdhci.h>
|
||||
|
||||
#include <mach/map.h>
|
||||
|
||||
/* Following are default values for UCON, ULCON and UFCON UART registers */
|
||||
#define NURI_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \
|
||||
S3C2410_UCON_RXILEVEL | \
|
||||
S3C2410_UCON_TXIRQMODE | \
|
||||
S3C2410_UCON_RXIRQMODE | \
|
||||
S3C2410_UCON_RXFIFO_TOI | \
|
||||
S3C2443_UCON_RXERR_IRQEN)
|
||||
|
||||
#define NURI_ULCON_DEFAULT S3C2410_LCON_CS8
|
||||
|
||||
#define NURI_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \
|
||||
S5PV210_UFCON_TXTRIG256 | \
|
||||
S5PV210_UFCON_RXTRIG256)
|
||||
|
||||
enum fixed_regulator_id {
|
||||
FIXED_REG_ID_MMC = 0,
|
||||
};
|
||||
|
||||
static struct s3c2410_uartcfg nuri_uartcfgs[] __initdata = {
|
||||
{
|
||||
.hwport = 0,
|
||||
.ucon = NURI_UCON_DEFAULT,
|
||||
.ulcon = NURI_ULCON_DEFAULT,
|
||||
.ufcon = NURI_UFCON_DEFAULT,
|
||||
},
|
||||
{
|
||||
.hwport = 1,
|
||||
.ucon = NURI_UCON_DEFAULT,
|
||||
.ulcon = NURI_ULCON_DEFAULT,
|
||||
.ufcon = NURI_UFCON_DEFAULT,
|
||||
},
|
||||
{
|
||||
.hwport = 2,
|
||||
.ucon = NURI_UCON_DEFAULT,
|
||||
.ulcon = NURI_ULCON_DEFAULT,
|
||||
.ufcon = NURI_UFCON_DEFAULT,
|
||||
},
|
||||
{
|
||||
.hwport = 3,
|
||||
.ucon = NURI_UCON_DEFAULT,
|
||||
.ulcon = NURI_ULCON_DEFAULT,
|
||||
.ufcon = NURI_UFCON_DEFAULT,
|
||||
},
|
||||
};
|
||||
|
||||
/* eMMC */
|
||||
static struct s3c_sdhci_platdata nuri_hsmmc0_data __initdata = {
|
||||
.max_width = 8,
|
||||
.host_caps = (MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA |
|
||||
MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
|
||||
MMC_CAP_DISABLE | MMC_CAP_ERASE),
|
||||
.cd_type = S3C_SDHCI_CD_PERMANENT,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply emmc_supplies[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),
|
||||
REGULATOR_SUPPLY("vmmc", "dw_mmc"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data emmc_fixed_voltage_init_data = {
|
||||
.constraints = {
|
||||
.name = "VMEM_VDD_2.8V",
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(emmc_supplies),
|
||||
.consumer_supplies = emmc_supplies,
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config emmc_fixed_voltage_config = {
|
||||
.supply_name = "MASSMEMORY_EN (inverted)",
|
||||
.microvolts = 2800000,
|
||||
.gpio = EXYNOS4_GPL1(1),
|
||||
.enable_high = false,
|
||||
.init_data = &emmc_fixed_voltage_init_data,
|
||||
};
|
||||
|
||||
static struct platform_device emmc_fixed_voltage = {
|
||||
.name = "reg-fixed-voltage",
|
||||
.id = FIXED_REG_ID_MMC,
|
||||
.dev = {
|
||||
.platform_data = &emmc_fixed_voltage_config,
|
||||
},
|
||||
};
|
||||
|
||||
/* SD */
|
||||
static struct s3c_sdhci_platdata nuri_hsmmc2_data __initdata = {
|
||||
.max_width = 4,
|
||||
.host_caps = MMC_CAP_4_BIT_DATA |
|
||||
MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
|
||||
MMC_CAP_DISABLE,
|
||||
.ext_cd_gpio = EXYNOS4_GPX3(3), /* XEINT_27 */
|
||||
.ext_cd_gpio_invert = 1,
|
||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
};
|
||||
|
||||
/* WLAN */
|
||||
static struct s3c_sdhci_platdata nuri_hsmmc3_data __initdata = {
|
||||
.max_width = 4,
|
||||
.host_caps = MMC_CAP_4_BIT_DATA |
|
||||
MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
|
||||
.cd_type = S3C_SDHCI_CD_EXTERNAL,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
};
|
||||
|
||||
static void __init nuri_sdhci_init(void)
|
||||
{
|
||||
s3c_sdhci0_set_platdata(&nuri_hsmmc0_data);
|
||||
s3c_sdhci2_set_platdata(&nuri_hsmmc2_data);
|
||||
s3c_sdhci3_set_platdata(&nuri_hsmmc3_data);
|
||||
}
|
||||
|
||||
/* GPIO KEYS */
|
||||
static struct gpio_keys_button nuri_gpio_keys_tables[] = {
|
||||
{
|
||||
.code = KEY_VOLUMEUP,
|
||||
.gpio = EXYNOS4_GPX2(0), /* XEINT16 */
|
||||
.desc = "gpio-keys: KEY_VOLUMEUP",
|
||||
.type = EV_KEY,
|
||||
.active_low = 1,
|
||||
.debounce_interval = 1,
|
||||
}, {
|
||||
.code = KEY_VOLUMEDOWN,
|
||||
.gpio = EXYNOS4_GPX2(1), /* XEINT17 */
|
||||
.desc = "gpio-keys: KEY_VOLUMEDOWN",
|
||||
.type = EV_KEY,
|
||||
.active_low = 1,
|
||||
.debounce_interval = 1,
|
||||
}, {
|
||||
.code = KEY_POWER,
|
||||
.gpio = EXYNOS4_GPX2(7), /* XEINT23 */
|
||||
.desc = "gpio-keys: KEY_POWER",
|
||||
.type = EV_KEY,
|
||||
.active_low = 1,
|
||||
.wakeup = 1,
|
||||
.debounce_interval = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_keys_platform_data nuri_gpio_keys_data = {
|
||||
.buttons = nuri_gpio_keys_tables,
|
||||
.nbuttons = ARRAY_SIZE(nuri_gpio_keys_tables),
|
||||
};
|
||||
|
||||
static struct platform_device nuri_gpio_keys = {
|
||||
.name = "gpio-keys",
|
||||
.dev = {
|
||||
.platform_data = &nuri_gpio_keys_data,
|
||||
},
|
||||
};
|
||||
|
||||
static void nuri_lcd_power_on(struct plat_lcd_data *pd, unsigned int power)
|
||||
{
|
||||
int gpio = EXYNOS4_GPE1(5);
|
||||
|
||||
gpio_request(gpio, "LVDS_nSHDN");
|
||||
gpio_direction_output(gpio, power);
|
||||
gpio_free(gpio);
|
||||
}
|
||||
|
||||
static int nuri_bl_init(struct device *dev)
|
||||
{
|
||||
int ret, gpio = EXYNOS4_GPE2(3);
|
||||
|
||||
ret = gpio_request(gpio, "LCD_LDO_EN");
|
||||
if (!ret)
|
||||
gpio_direction_output(gpio, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int nuri_bl_notify(struct device *dev, int brightness)
|
||||
{
|
||||
if (brightness < 1)
|
||||
brightness = 0;
|
||||
|
||||
gpio_set_value(EXYNOS4_GPE2(3), 1);
|
||||
|
||||
return brightness;
|
||||
}
|
||||
|
||||
static void nuri_bl_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(EXYNOS4_GPE2(3));
|
||||
}
|
||||
|
||||
/* nuri pwm backlight */
|
||||
static struct platform_pwm_backlight_data nuri_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.pwm_period_ns = 30000,
|
||||
.max_brightness = 100,
|
||||
.dft_brightness = 50,
|
||||
.init = nuri_bl_init,
|
||||
.notify = nuri_bl_notify,
|
||||
.exit = nuri_bl_exit,
|
||||
};
|
||||
|
||||
static struct platform_device nuri_backlight_device = {
|
||||
.name = "pwm-backlight",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.parent = &s3c_device_timer[0].dev,
|
||||
.platform_data = &nuri_backlight_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct plat_lcd_data nuri_lcd_platform_data = {
|
||||
.set_power = nuri_lcd_power_on,
|
||||
};
|
||||
|
||||
static struct platform_device nuri_lcd_device = {
|
||||
.name = "platform-lcd",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &nuri_lcd_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* I2C1 */
|
||||
static struct i2c_board_info i2c1_devs[] __initdata = {
|
||||
/* Gyro, To be updated */
|
||||
};
|
||||
|
||||
/* GPIO I2C 5 (PMIC) */
|
||||
static struct i2c_board_info i2c5_devs[] __initdata = {
|
||||
/* max8997, To be updated */
|
||||
};
|
||||
|
||||
static struct platform_device *nuri_devices[] __initdata = {
|
||||
/* Samsung Platform Devices */
|
||||
&emmc_fixed_voltage,
|
||||
&s3c_device_hsmmc0,
|
||||
&s3c_device_hsmmc2,
|
||||
&s3c_device_hsmmc3,
|
||||
&s3c_device_wdt,
|
||||
&s3c_device_timer[0],
|
||||
|
||||
/* NURI Devices */
|
||||
&nuri_gpio_keys,
|
||||
&nuri_lcd_device,
|
||||
&nuri_backlight_device,
|
||||
};
|
||||
|
||||
static void __init nuri_map_io(void)
|
||||
{
|
||||
s5p_init_io(NULL, 0, S5P_VA_CHIPID);
|
||||
s3c24xx_init_clocks(24000000);
|
||||
s3c24xx_init_uarts(nuri_uartcfgs, ARRAY_SIZE(nuri_uartcfgs));
|
||||
}
|
||||
|
||||
static void __init nuri_machine_init(void)
|
||||
{
|
||||
nuri_sdhci_init();
|
||||
|
||||
i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs));
|
||||
i2c_register_board_info(5, i2c5_devs, ARRAY_SIZE(i2c5_devs));
|
||||
|
||||
/* Last */
|
||||
platform_add_devices(nuri_devices, ARRAY_SIZE(nuri_devices));
|
||||
}
|
||||
|
||||
MACHINE_START(NURI, "NURI")
|
||||
/* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
|
||||
.boot_params = S5P_PA_SDRAM + 0x100,
|
||||
.init_irq = exynos4_init_irq,
|
||||
.map_io = nuri_map_io,
|
||||
.init_machine = nuri_machine_init,
|
||||
.timer = &exynos4_timer,
|
||||
MACHINE_END
|
@ -1,7 +1,7 @@
|
||||
/* linux/arch/arm/mach-s5pv310/mach-smdkc210.c
|
||||
/* linux/arch/arm/mach-exynos4/mach-smdkc210.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@ -21,7 +21,7 @@
|
||||
|
||||
#include <plat/regs-serial.h>
|
||||
#include <plat/regs-srom.h>
|
||||
#include <plat/s5pv310.h>
|
||||
#include <plat/exynos4.h>
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/devs.h>
|
||||
#include <plat/sdhci.h>
|
||||
@ -77,10 +77,10 @@ static struct s3c2410_uartcfg smdkc210_uartcfgs[] __initdata = {
|
||||
|
||||
static struct s3c_sdhci_platdata smdkc210_hsmmc0_pdata __initdata = {
|
||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
||||
.ext_cd_gpio = S5PV310_GPK0(2),
|
||||
.ext_cd_gpio = EXYNOS4_GPK0(2),
|
||||
.ext_cd_gpio_invert = 1,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
#ifdef CONFIG_S5PV310_SDHCI_CH0_8BIT
|
||||
#ifdef CONFIG_EXYNOS4_SDHCI_CH0_8BIT
|
||||
.max_width = 8,
|
||||
.host_caps = MMC_CAP_8_BIT_DATA,
|
||||
#endif
|
||||
@ -88,17 +88,17 @@ static struct s3c_sdhci_platdata smdkc210_hsmmc0_pdata __initdata = {
|
||||
|
||||
static struct s3c_sdhci_platdata smdkc210_hsmmc1_pdata __initdata = {
|
||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
||||
.ext_cd_gpio = S5PV310_GPK0(2),
|
||||
.ext_cd_gpio = EXYNOS4_GPK0(2),
|
||||
.ext_cd_gpio_invert = 1,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
};
|
||||
|
||||
static struct s3c_sdhci_platdata smdkc210_hsmmc2_pdata __initdata = {
|
||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
||||
.ext_cd_gpio = S5PV310_GPK2(2),
|
||||
.ext_cd_gpio = EXYNOS4_GPK2(2),
|
||||
.ext_cd_gpio_invert = 1,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
#ifdef CONFIG_S5PV310_SDHCI_CH2_8BIT
|
||||
#ifdef CONFIG_EXYNOS4_SDHCI_CH2_8BIT
|
||||
.max_width = 8,
|
||||
.host_caps = MMC_CAP_8_BIT_DATA,
|
||||
#endif
|
||||
@ -106,15 +106,15 @@ static struct s3c_sdhci_platdata smdkc210_hsmmc2_pdata __initdata = {
|
||||
|
||||
static struct s3c_sdhci_platdata smdkc210_hsmmc3_pdata __initdata = {
|
||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
||||
.ext_cd_gpio = S5PV310_GPK2(2),
|
||||
.ext_cd_gpio = EXYNOS4_GPK2(2),
|
||||
.ext_cd_gpio_invert = 1,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
};
|
||||
|
||||
static struct resource smdkc210_smsc911x_resources[] = {
|
||||
[0] = {
|
||||
.start = S5PV310_PA_SROM_BANK(1),
|
||||
.end = S5PV310_PA_SROM_BANK(1) + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SROM_BANK(1),
|
||||
.end = EXYNOS4_PA_SROM_BANK(1) + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
@ -154,16 +154,16 @@ static struct platform_device *smdkc210_devices[] __initdata = {
|
||||
&s3c_device_i2c1,
|
||||
&s3c_device_rtc,
|
||||
&s3c_device_wdt,
|
||||
&s5pv310_device_ac97,
|
||||
&s5pv310_device_i2s0,
|
||||
&s5pv310_device_pd[PD_MFC],
|
||||
&s5pv310_device_pd[PD_G3D],
|
||||
&s5pv310_device_pd[PD_LCD0],
|
||||
&s5pv310_device_pd[PD_LCD1],
|
||||
&s5pv310_device_pd[PD_CAM],
|
||||
&s5pv310_device_pd[PD_TV],
|
||||
&s5pv310_device_pd[PD_GPS],
|
||||
&s5pv310_device_sysmmu,
|
||||
&exynos4_device_ac97,
|
||||
&exynos4_device_i2s0,
|
||||
&exynos4_device_pd[PD_MFC],
|
||||
&exynos4_device_pd[PD_G3D],
|
||||
&exynos4_device_pd[PD_LCD0],
|
||||
&exynos4_device_pd[PD_LCD1],
|
||||
&exynos4_device_pd[PD_CAM],
|
||||
&exynos4_device_pd[PD_TV],
|
||||
&exynos4_device_pd[PD_GPS],
|
||||
&exynos4_device_sysmmu,
|
||||
&samsung_asoc_dma,
|
||||
&smdkc210_smsc911x,
|
||||
};
|
||||
@ -216,8 +216,8 @@ static void __init smdkc210_machine_init(void)
|
||||
MACHINE_START(SMDKC210, "SMDKC210")
|
||||
/* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
|
||||
.boot_params = S5P_PA_SDRAM + 0x100,
|
||||
.init_irq = s5pv310_init_irq,
|
||||
.init_irq = exynos4_init_irq,
|
||||
.map_io = smdkc210_map_io,
|
||||
.init_machine = smdkc210_machine_init,
|
||||
.timer = &s5pv310_timer,
|
||||
.timer = &exynos4_timer,
|
||||
MACHINE_END
|
@ -1,7 +1,7 @@
|
||||
/* linux/arch/arm/mach-s5pv310/mach-smdkv310.c
|
||||
/* linux/arch/arm/mach-exynos4/mach-smdkv310.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@ -15,15 +15,17 @@
|
||||
#include <linux/smsc911x.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <plat/regs-serial.h>
|
||||
#include <plat/regs-srom.h>
|
||||
#include <plat/s5pv310.h>
|
||||
#include <plat/exynos4.h>
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/devs.h>
|
||||
#include <plat/keypad.h>
|
||||
#include <plat/sdhci.h>
|
||||
#include <plat/iic.h>
|
||||
#include <plat/pd.h>
|
||||
@ -77,10 +79,10 @@ static struct s3c2410_uartcfg smdkv310_uartcfgs[] __initdata = {
|
||||
|
||||
static struct s3c_sdhci_platdata smdkv310_hsmmc0_pdata __initdata = {
|
||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
||||
.ext_cd_gpio = S5PV310_GPK0(2),
|
||||
.ext_cd_gpio = EXYNOS4_GPK0(2),
|
||||
.ext_cd_gpio_invert = 1,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
#ifdef CONFIG_S5PV310_SDHCI_CH0_8BIT
|
||||
#ifdef CONFIG_EXYNOS4_SDHCI_CH0_8BIT
|
||||
.max_width = 8,
|
||||
.host_caps = MMC_CAP_8_BIT_DATA,
|
||||
#endif
|
||||
@ -88,17 +90,17 @@ static struct s3c_sdhci_platdata smdkv310_hsmmc0_pdata __initdata = {
|
||||
|
||||
static struct s3c_sdhci_platdata smdkv310_hsmmc1_pdata __initdata = {
|
||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
||||
.ext_cd_gpio = S5PV310_GPK0(2),
|
||||
.ext_cd_gpio = EXYNOS4_GPK0(2),
|
||||
.ext_cd_gpio_invert = 1,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
};
|
||||
|
||||
static struct s3c_sdhci_platdata smdkv310_hsmmc2_pdata __initdata = {
|
||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
||||
.ext_cd_gpio = S5PV310_GPK2(2),
|
||||
.ext_cd_gpio = EXYNOS4_GPK2(2),
|
||||
.ext_cd_gpio_invert = 1,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
#ifdef CONFIG_S5PV310_SDHCI_CH2_8BIT
|
||||
#ifdef CONFIG_EXYNOS4_SDHCI_CH2_8BIT
|
||||
.max_width = 8,
|
||||
.host_caps = MMC_CAP_8_BIT_DATA,
|
||||
#endif
|
||||
@ -106,15 +108,15 @@ static struct s3c_sdhci_platdata smdkv310_hsmmc2_pdata __initdata = {
|
||||
|
||||
static struct s3c_sdhci_platdata smdkv310_hsmmc3_pdata __initdata = {
|
||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
||||
.ext_cd_gpio = S5PV310_GPK2(2),
|
||||
.ext_cd_gpio = EXYNOS4_GPK2(2),
|
||||
.ext_cd_gpio_invert = 1,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
};
|
||||
|
||||
static struct resource smdkv310_smsc911x_resources[] = {
|
||||
[0] = {
|
||||
.start = S5PV310_PA_SROM_BANK(1),
|
||||
.end = S5PV310_PA_SROM_BANK(1) + SZ_64K - 1,
|
||||
.start = EXYNOS4_PA_SROM_BANK(1),
|
||||
.end = EXYNOS4_PA_SROM_BANK(1) + SZ_64K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
@ -142,6 +144,25 @@ static struct platform_device smdkv310_smsc911x = {
|
||||
},
|
||||
};
|
||||
|
||||
static uint32_t smdkv310_keymap[] __initdata = {
|
||||
/* KEY(row, col, keycode) */
|
||||
KEY(0, 3, KEY_1), KEY(0, 4, KEY_2), KEY(0, 5, KEY_3),
|
||||
KEY(0, 6, KEY_4), KEY(0, 7, KEY_5),
|
||||
KEY(1, 3, KEY_A), KEY(1, 4, KEY_B), KEY(1, 5, KEY_C),
|
||||
KEY(1, 6, KEY_D), KEY(1, 7, KEY_E)
|
||||
};
|
||||
|
||||
static struct matrix_keymap_data smdkv310_keymap_data __initdata = {
|
||||
.keymap = smdkv310_keymap,
|
||||
.keymap_size = ARRAY_SIZE(smdkv310_keymap),
|
||||
};
|
||||
|
||||
static struct samsung_keypad_platdata smdkv310_keypad_data __initdata = {
|
||||
.keymap_data = &smdkv310_keymap_data,
|
||||
.rows = 2,
|
||||
.cols = 8,
|
||||
};
|
||||
|
||||
static struct i2c_board_info i2c_devs1[] __initdata = {
|
||||
{I2C_BOARD_INFO("wm8994", 0x1a),},
|
||||
};
|
||||
@ -154,16 +175,17 @@ static struct platform_device *smdkv310_devices[] __initdata = {
|
||||
&s3c_device_i2c1,
|
||||
&s3c_device_rtc,
|
||||
&s3c_device_wdt,
|
||||
&s5pv310_device_ac97,
|
||||
&s5pv310_device_i2s0,
|
||||
&s5pv310_device_pd[PD_MFC],
|
||||
&s5pv310_device_pd[PD_G3D],
|
||||
&s5pv310_device_pd[PD_LCD0],
|
||||
&s5pv310_device_pd[PD_LCD1],
|
||||
&s5pv310_device_pd[PD_CAM],
|
||||
&s5pv310_device_pd[PD_TV],
|
||||
&s5pv310_device_pd[PD_GPS],
|
||||
&s5pv310_device_sysmmu,
|
||||
&exynos4_device_ac97,
|
||||
&exynos4_device_i2s0,
|
||||
&samsung_device_keypad,
|
||||
&exynos4_device_pd[PD_MFC],
|
||||
&exynos4_device_pd[PD_G3D],
|
||||
&exynos4_device_pd[PD_LCD0],
|
||||
&exynos4_device_pd[PD_LCD1],
|
||||
&exynos4_device_pd[PD_CAM],
|
||||
&exynos4_device_pd[PD_TV],
|
||||
&exynos4_device_pd[PD_GPS],
|
||||
&exynos4_device_sysmmu,
|
||||
&samsung_asoc_dma,
|
||||
&smdkv310_smsc911x,
|
||||
};
|
||||
@ -210,6 +232,8 @@ static void __init smdkv310_machine_init(void)
|
||||
s3c_sdhci2_set_platdata(&smdkv310_hsmmc2_pdata);
|
||||
s3c_sdhci3_set_platdata(&smdkv310_hsmmc3_pdata);
|
||||
|
||||
samsung_keypad_set_platdata(&smdkv310_keypad_data);
|
||||
|
||||
platform_add_devices(smdkv310_devices, ARRAY_SIZE(smdkv310_devices));
|
||||
}
|
||||
|
||||
@ -217,8 +241,8 @@ MACHINE_START(SMDKV310, "SMDKV310")
|
||||
/* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
|
||||
/* Maintainer: Changhwan Youn <chaos.youn@samsung.com> */
|
||||
.boot_params = S5P_PA_SDRAM + 0x100,
|
||||
.init_irq = s5pv310_init_irq,
|
||||
.init_irq = exynos4_init_irq,
|
||||
.map_io = smdkv310_map_io,
|
||||
.init_machine = smdkv310_machine_init,
|
||||
.timer = &s5pv310_timer,
|
||||
.timer = &exynos4_timer,
|
||||
MACHINE_END
|
650
arch/arm/mach-exynos4/mach-universal_c210.c
Normal file
650
arch/arm/mach-exynos4/mach-universal_c210.c
Normal file
@ -0,0 +1,650 @@
|
||||
/* linux/arch/arm/mach-exynos4/mach-universal_c210.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/mfd/max8998.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/regulator/max8952.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <plat/regs-serial.h>
|
||||
#include <plat/exynos4.h>
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/devs.h>
|
||||
#include <plat/iic.h>
|
||||
#include <plat/sdhci.h>
|
||||
|
||||
#include <mach/map.h>
|
||||
|
||||
/* Following are default values for UCON, ULCON and UFCON UART registers */
|
||||
#define UNIVERSAL_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \
|
||||
S3C2410_UCON_RXILEVEL | \
|
||||
S3C2410_UCON_TXIRQMODE | \
|
||||
S3C2410_UCON_RXIRQMODE | \
|
||||
S3C2410_UCON_RXFIFO_TOI | \
|
||||
S3C2443_UCON_RXERR_IRQEN)
|
||||
|
||||
#define UNIVERSAL_ULCON_DEFAULT S3C2410_LCON_CS8
|
||||
|
||||
#define UNIVERSAL_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \
|
||||
S5PV210_UFCON_TXTRIG256 | \
|
||||
S5PV210_UFCON_RXTRIG256)
|
||||
|
||||
static struct s3c2410_uartcfg universal_uartcfgs[] __initdata = {
|
||||
[0] = {
|
||||
.hwport = 0,
|
||||
.ucon = UNIVERSAL_UCON_DEFAULT,
|
||||
.ulcon = UNIVERSAL_ULCON_DEFAULT,
|
||||
.ufcon = UNIVERSAL_UFCON_DEFAULT,
|
||||
},
|
||||
[1] = {
|
||||
.hwport = 1,
|
||||
.ucon = UNIVERSAL_UCON_DEFAULT,
|
||||
.ulcon = UNIVERSAL_ULCON_DEFAULT,
|
||||
.ufcon = UNIVERSAL_UFCON_DEFAULT,
|
||||
},
|
||||
[2] = {
|
||||
.hwport = 2,
|
||||
.ucon = UNIVERSAL_UCON_DEFAULT,
|
||||
.ulcon = UNIVERSAL_ULCON_DEFAULT,
|
||||
.ufcon = UNIVERSAL_UFCON_DEFAULT,
|
||||
},
|
||||
[3] = {
|
||||
.hwport = 3,
|
||||
.ucon = UNIVERSAL_UCON_DEFAULT,
|
||||
.ulcon = UNIVERSAL_ULCON_DEFAULT,
|
||||
.ufcon = UNIVERSAL_UFCON_DEFAULT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply max8952_consumer =
|
||||
REGULATOR_SUPPLY("vddarm", NULL);
|
||||
|
||||
static struct max8952_platform_data universal_max8952_pdata __initdata = {
|
||||
.gpio_vid0 = EXYNOS4_GPX0(3),
|
||||
.gpio_vid1 = EXYNOS4_GPX0(4),
|
||||
.gpio_en = -1, /* Not controllable, set "Always High" */
|
||||
.default_mode = 0, /* vid0 = 0, vid1 = 0 */
|
||||
.dvs_mode = { 48, 32, 28, 18 }, /* 1.25, 1.20, 1.05, 0.95V */
|
||||
.sync_freq = 0, /* default: fastest */
|
||||
.ramp_speed = 0, /* default: fastest */
|
||||
|
||||
.reg_data = {
|
||||
.constraints = {
|
||||
.name = "VARM_1.2V",
|
||||
.min_uV = 770000,
|
||||
.max_uV = 1400000,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||
.always_on = 1,
|
||||
.boot_on = 1,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &max8952_consumer,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply lp3974_buck1_consumer =
|
||||
REGULATOR_SUPPLY("vddint", NULL);
|
||||
|
||||
static struct regulator_consumer_supply lp3974_buck2_consumer =
|
||||
REGULATOR_SUPPLY("vddg3d", NULL);
|
||||
|
||||
static struct regulator_init_data lp3974_buck1_data = {
|
||||
.constraints = {
|
||||
.name = "VINT_1.1V",
|
||||
.min_uV = 750000,
|
||||
.max_uV = 1500000,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
|
||||
REGULATOR_CHANGE_STATUS,
|
||||
.boot_on = 1,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &lp3974_buck1_consumer,
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_buck2_data = {
|
||||
.constraints = {
|
||||
.name = "VG3D_1.1V",
|
||||
.min_uV = 750000,
|
||||
.max_uV = 1500000,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
|
||||
REGULATOR_CHANGE_STATUS,
|
||||
.boot_on = 1,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &lp3974_buck2_consumer,
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_buck3_data = {
|
||||
.constraints = {
|
||||
.name = "VCC_1.8V",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.apply_uV = 1,
|
||||
.always_on = 1,
|
||||
.state_mem = {
|
||||
.enabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_buck4_data = {
|
||||
.constraints = {
|
||||
.name = "VMEM_1.2V",
|
||||
.min_uV = 1200000,
|
||||
.max_uV = 1200000,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.apply_uV = 1,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo2_data = {
|
||||
.constraints = {
|
||||
.name = "VALIVE_1.2V",
|
||||
.min_uV = 1200000,
|
||||
.max_uV = 1200000,
|
||||
.apply_uV = 1,
|
||||
.always_on = 1,
|
||||
.state_mem = {
|
||||
.enabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo3_data = {
|
||||
.constraints = {
|
||||
.name = "VUSB+MIPI_1.1V",
|
||||
.min_uV = 1100000,
|
||||
.max_uV = 1100000,
|
||||
.apply_uV = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo4_data = {
|
||||
.constraints = {
|
||||
.name = "VADC_3.3V",
|
||||
.min_uV = 3300000,
|
||||
.max_uV = 3300000,
|
||||
.apply_uV = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo5_data = {
|
||||
.constraints = {
|
||||
.name = "VTF_2.8V",
|
||||
.min_uV = 2800000,
|
||||
.max_uV = 2800000,
|
||||
.apply_uV = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo6_data = {
|
||||
.constraints = {
|
||||
.name = "LDO6",
|
||||
.min_uV = 2000000,
|
||||
.max_uV = 2000000,
|
||||
.apply_uV = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo7_data = {
|
||||
.constraints = {
|
||||
.name = "VLCD+VMIPI_1.8V",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.apply_uV = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo8_data = {
|
||||
.constraints = {
|
||||
.name = "VUSB+VDAC_3.3V",
|
||||
.min_uV = 3300000,
|
||||
.max_uV = 3300000,
|
||||
.apply_uV = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo9_data = {
|
||||
.constraints = {
|
||||
.name = "VCC_2.8V",
|
||||
.min_uV = 2800000,
|
||||
.max_uV = 2800000,
|
||||
.apply_uV = 1,
|
||||
.always_on = 1,
|
||||
.state_mem = {
|
||||
.enabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo10_data = {
|
||||
.constraints = {
|
||||
.name = "VPLL_1.1V",
|
||||
.min_uV = 1100000,
|
||||
.max_uV = 1100000,
|
||||
.boot_on = 1,
|
||||
.apply_uV = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo11_data = {
|
||||
.constraints = {
|
||||
.name = "CAM_AF_3.3V",
|
||||
.min_uV = 3300000,
|
||||
.max_uV = 3300000,
|
||||
.apply_uV = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo12_data = {
|
||||
.constraints = {
|
||||
.name = "PS_2.8V",
|
||||
.min_uV = 2800000,
|
||||
.max_uV = 2800000,
|
||||
.apply_uV = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo13_data = {
|
||||
.constraints = {
|
||||
.name = "VHIC_1.2V",
|
||||
.min_uV = 1200000,
|
||||
.max_uV = 1200000,
|
||||
.apply_uV = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo14_data = {
|
||||
.constraints = {
|
||||
.name = "CAM_I_HOST_1.8V",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.apply_uV = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo15_data = {
|
||||
.constraints = {
|
||||
.name = "CAM_S_DIG+FM33_CORE_1.2V",
|
||||
.min_uV = 1200000,
|
||||
.max_uV = 1200000,
|
||||
.apply_uV = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo16_data = {
|
||||
.constraints = {
|
||||
.name = "CAM_S_ANA_2.8V",
|
||||
.min_uV = 2800000,
|
||||
.max_uV = 2800000,
|
||||
.apply_uV = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo17_data = {
|
||||
.constraints = {
|
||||
.name = "VCC_3.0V_LCD",
|
||||
.min_uV = 3000000,
|
||||
.max_uV = 3000000,
|
||||
.apply_uV = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.boot_on = 1,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_32khz_ap_data = {
|
||||
.constraints = {
|
||||
.name = "32KHz AP",
|
||||
.always_on = 1,
|
||||
.state_mem = {
|
||||
.enabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_32khz_cp_data = {
|
||||
.constraints = {
|
||||
.name = "32KHz CP",
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_vichg_data = {
|
||||
.constraints = {
|
||||
.name = "VICHG",
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_esafeout1_data = {
|
||||
.constraints = {
|
||||
.name = "SAFEOUT1",
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.enabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_esafeout2_data = {
|
||||
.constraints = {
|
||||
.name = "SAFEOUT2",
|
||||
.boot_on = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.enabled = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct max8998_regulator_data lp3974_regulators[] = {
|
||||
{ MAX8998_LDO2, &lp3974_ldo2_data },
|
||||
{ MAX8998_LDO3, &lp3974_ldo3_data },
|
||||
{ MAX8998_LDO4, &lp3974_ldo4_data },
|
||||
{ MAX8998_LDO5, &lp3974_ldo5_data },
|
||||
{ MAX8998_LDO6, &lp3974_ldo6_data },
|
||||
{ MAX8998_LDO7, &lp3974_ldo7_data },
|
||||
{ MAX8998_LDO8, &lp3974_ldo8_data },
|
||||
{ MAX8998_LDO9, &lp3974_ldo9_data },
|
||||
{ MAX8998_LDO10, &lp3974_ldo10_data },
|
||||
{ MAX8998_LDO11, &lp3974_ldo11_data },
|
||||
{ MAX8998_LDO12, &lp3974_ldo12_data },
|
||||
{ MAX8998_LDO13, &lp3974_ldo13_data },
|
||||
{ MAX8998_LDO14, &lp3974_ldo14_data },
|
||||
{ MAX8998_LDO15, &lp3974_ldo15_data },
|
||||
{ MAX8998_LDO16, &lp3974_ldo16_data },
|
||||
{ MAX8998_LDO17, &lp3974_ldo17_data },
|
||||
{ MAX8998_BUCK1, &lp3974_buck1_data },
|
||||
{ MAX8998_BUCK2, &lp3974_buck2_data },
|
||||
{ MAX8998_BUCK3, &lp3974_buck3_data },
|
||||
{ MAX8998_BUCK4, &lp3974_buck4_data },
|
||||
{ MAX8998_EN32KHZ_AP, &lp3974_32khz_ap_data },
|
||||
{ MAX8998_EN32KHZ_CP, &lp3974_32khz_cp_data },
|
||||
{ MAX8998_ENVICHG, &lp3974_vichg_data },
|
||||
{ MAX8998_ESAFEOUT1, &lp3974_esafeout1_data },
|
||||
{ MAX8998_ESAFEOUT2, &lp3974_esafeout2_data },
|
||||
};
|
||||
|
||||
static struct max8998_platform_data universal_lp3974_pdata = {
|
||||
.num_regulators = ARRAY_SIZE(lp3974_regulators),
|
||||
.regulators = lp3974_regulators,
|
||||
.buck1_voltage1 = 1100000, /* INT */
|
||||
.buck1_voltage2 = 1000000,
|
||||
.buck1_voltage3 = 1100000,
|
||||
.buck1_voltage4 = 1000000,
|
||||
.buck1_set1 = EXYNOS4_GPX0(5),
|
||||
.buck1_set2 = EXYNOS4_GPX0(6),
|
||||
.buck2_voltage1 = 1200000, /* G3D */
|
||||
.buck2_voltage2 = 1100000,
|
||||
.buck1_default_idx = 0,
|
||||
.buck2_set3 = EXYNOS4_GPE2(0),
|
||||
.buck2_default_idx = 0,
|
||||
.wakeup = true,
|
||||
};
|
||||
|
||||
/* GPIO I2C 5 (PMIC) */
|
||||
static struct i2c_board_info i2c5_devs[] __initdata = {
|
||||
{
|
||||
I2C_BOARD_INFO("max8952", 0xC0 >> 1),
|
||||
.platform_data = &universal_max8952_pdata,
|
||||
}, {
|
||||
I2C_BOARD_INFO("lp3974", 0xCC >> 1),
|
||||
.platform_data = &universal_lp3974_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
/* GPIO KEYS */
|
||||
static struct gpio_keys_button universal_gpio_keys_tables[] = {
|
||||
{
|
||||
.code = KEY_VOLUMEUP,
|
||||
.gpio = EXYNOS4_GPX2(0), /* XEINT16 */
|
||||
.desc = "gpio-keys: KEY_VOLUMEUP",
|
||||
.type = EV_KEY,
|
||||
.active_low = 1,
|
||||
.debounce_interval = 1,
|
||||
}, {
|
||||
.code = KEY_VOLUMEDOWN,
|
||||
.gpio = EXYNOS4_GPX2(1), /* XEINT17 */
|
||||
.desc = "gpio-keys: KEY_VOLUMEDOWN",
|
||||
.type = EV_KEY,
|
||||
.active_low = 1,
|
||||
.debounce_interval = 1,
|
||||
}, {
|
||||
.code = KEY_CONFIG,
|
||||
.gpio = EXYNOS4_GPX2(2), /* XEINT18 */
|
||||
.desc = "gpio-keys: KEY_CONFIG",
|
||||
.type = EV_KEY,
|
||||
.active_low = 1,
|
||||
.debounce_interval = 1,
|
||||
}, {
|
||||
.code = KEY_CAMERA,
|
||||
.gpio = EXYNOS4_GPX2(3), /* XEINT19 */
|
||||
.desc = "gpio-keys: KEY_CAMERA",
|
||||
.type = EV_KEY,
|
||||
.active_low = 1,
|
||||
.debounce_interval = 1,
|
||||
}, {
|
||||
.code = KEY_OK,
|
||||
.gpio = EXYNOS4_GPX3(5), /* XEINT29 */
|
||||
.desc = "gpio-keys: KEY_OK",
|
||||
.type = EV_KEY,
|
||||
.active_low = 1,
|
||||
.debounce_interval = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_keys_platform_data universal_gpio_keys_data = {
|
||||
.buttons = universal_gpio_keys_tables,
|
||||
.nbuttons = ARRAY_SIZE(universal_gpio_keys_tables),
|
||||
};
|
||||
|
||||
static struct platform_device universal_gpio_keys = {
|
||||
.name = "gpio-keys",
|
||||
.dev = {
|
||||
.platform_data = &universal_gpio_keys_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* eMMC */
|
||||
static struct s3c_sdhci_platdata universal_hsmmc0_data __initdata = {
|
||||
.max_width = 8,
|
||||
.host_caps = (MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA |
|
||||
MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
|
||||
MMC_CAP_DISABLE),
|
||||
.cd_type = S3C_SDHCI_CD_PERMANENT,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply mmc0_supplies[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data mmc0_fixed_voltage_init_data = {
|
||||
.constraints = {
|
||||
.name = "VMEM_VDD_2.8V",
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(mmc0_supplies),
|
||||
.consumer_supplies = mmc0_supplies,
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config mmc0_fixed_voltage_config = {
|
||||
.supply_name = "MASSMEMORY_EN",
|
||||
.microvolts = 2800000,
|
||||
.gpio = EXYNOS4_GPE1(3),
|
||||
.enable_high = true,
|
||||
.init_data = &mmc0_fixed_voltage_init_data,
|
||||
};
|
||||
|
||||
static struct platform_device mmc0_fixed_voltage = {
|
||||
.name = "reg-fixed-voltage",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &mmc0_fixed_voltage_config,
|
||||
},
|
||||
};
|
||||
|
||||
/* SD */
|
||||
static struct s3c_sdhci_platdata universal_hsmmc2_data __initdata = {
|
||||
.max_width = 4,
|
||||
.host_caps = MMC_CAP_4_BIT_DATA |
|
||||
MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
|
||||
MMC_CAP_DISABLE,
|
||||
.ext_cd_gpio = EXYNOS4_GPX3(4), /* XEINT_28 */
|
||||
.ext_cd_gpio_invert = 1,
|
||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||
};
|
||||
|
||||
/* WiFi */
|
||||
static struct s3c_sdhci_platdata universal_hsmmc3_data __initdata = {
|
||||
.max_width = 4,
|
||||
.host_caps = MMC_CAP_4_BIT_DATA |
|
||||
MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
|
||||
MMC_CAP_DISABLE,
|
||||
.cd_type = S3C_SDHCI_CD_EXTERNAL,
|
||||
};
|
||||
|
||||
static void __init universal_sdhci_init(void)
|
||||
{
|
||||
s3c_sdhci0_set_platdata(&universal_hsmmc0_data);
|
||||
s3c_sdhci2_set_platdata(&universal_hsmmc2_data);
|
||||
s3c_sdhci3_set_platdata(&universal_hsmmc3_data);
|
||||
}
|
||||
|
||||
/* I2C0 */
|
||||
static struct i2c_board_info i2c0_devs[] __initdata = {
|
||||
/* Camera, To be updated */
|
||||
};
|
||||
|
||||
/* I2C1 */
|
||||
static struct i2c_board_info i2c1_devs[] __initdata = {
|
||||
/* Gyro, To be updated */
|
||||
};
|
||||
|
||||
static struct platform_device *universal_devices[] __initdata = {
|
||||
/* Samsung Platform Devices */
|
||||
&mmc0_fixed_voltage,
|
||||
&s3c_device_hsmmc0,
|
||||
&s3c_device_hsmmc2,
|
||||
&s3c_device_hsmmc3,
|
||||
&s3c_device_i2c5,
|
||||
|
||||
/* Universal Devices */
|
||||
&universal_gpio_keys,
|
||||
&s5p_device_onenand,
|
||||
};
|
||||
|
||||
static void __init universal_map_io(void)
|
||||
{
|
||||
s5p_init_io(NULL, 0, S5P_VA_CHIPID);
|
||||
s3c24xx_init_clocks(24000000);
|
||||
s3c24xx_init_uarts(universal_uartcfgs, ARRAY_SIZE(universal_uartcfgs));
|
||||
}
|
||||
|
||||
static void __init universal_machine_init(void)
|
||||
{
|
||||
universal_sdhci_init();
|
||||
|
||||
i2c_register_board_info(0, i2c0_devs, ARRAY_SIZE(i2c0_devs));
|
||||
i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs));
|
||||
|
||||
s3c_i2c5_set_platdata(NULL);
|
||||
i2c_register_board_info(5, i2c5_devs, ARRAY_SIZE(i2c5_devs));
|
||||
|
||||
/* Last */
|
||||
platform_add_devices(universal_devices, ARRAY_SIZE(universal_devices));
|
||||
}
|
||||
|
||||
MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210")
|
||||
/* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
|
||||
.boot_params = S5P_PA_SDRAM + 0x100,
|
||||
.init_irq = exynos4_init_irq,
|
||||
.map_io = universal_map_io,
|
||||
.init_machine = universal_machine_init,
|
||||
.timer = &exynos4_timer,
|
||||
MACHINE_END
|
421
arch/arm/mach-exynos4/mct.c
Normal file
421
arch/arm/mach-exynos4/mct.c
Normal file
@ -0,0 +1,421 @@
|
||||
/* linux/arch/arm/mach-exynos4/mct.c
|
||||
*
|
||||
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* EXYNOS4 MCT(Multi-Core Timer) support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clockchips.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/percpu.h>
|
||||
|
||||
#include <mach/map.h>
|
||||
#include <mach/regs-mct.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
static unsigned long clk_cnt_per_tick;
|
||||
static unsigned long clk_rate;
|
||||
|
||||
struct mct_clock_event_device {
|
||||
struct clock_event_device *evt;
|
||||
void __iomem *base;
|
||||
};
|
||||
|
||||
struct mct_clock_event_device mct_tick[2];
|
||||
|
||||
static void exynos4_mct_write(unsigned int value, void *addr)
|
||||
{
|
||||
void __iomem *stat_addr;
|
||||
u32 mask;
|
||||
u32 i;
|
||||
|
||||
__raw_writel(value, addr);
|
||||
|
||||
switch ((u32) addr) {
|
||||
case (u32) EXYNOS4_MCT_G_TCON:
|
||||
stat_addr = EXYNOS4_MCT_G_WSTAT;
|
||||
mask = 1 << 16; /* G_TCON write status */
|
||||
break;
|
||||
case (u32) EXYNOS4_MCT_G_COMP0_L:
|
||||
stat_addr = EXYNOS4_MCT_G_WSTAT;
|
||||
mask = 1 << 0; /* G_COMP0_L write status */
|
||||
break;
|
||||
case (u32) EXYNOS4_MCT_G_COMP0_U:
|
||||
stat_addr = EXYNOS4_MCT_G_WSTAT;
|
||||
mask = 1 << 1; /* G_COMP0_U write status */
|
||||
break;
|
||||
case (u32) EXYNOS4_MCT_G_COMP0_ADD_INCR:
|
||||
stat_addr = EXYNOS4_MCT_G_WSTAT;
|
||||
mask = 1 << 2; /* G_COMP0_ADD_INCR write status */
|
||||
break;
|
||||
case (u32) EXYNOS4_MCT_G_CNT_L:
|
||||
stat_addr = EXYNOS4_MCT_G_CNT_WSTAT;
|
||||
mask = 1 << 0; /* G_CNT_L write status */
|
||||
break;
|
||||
case (u32) EXYNOS4_MCT_G_CNT_U:
|
||||
stat_addr = EXYNOS4_MCT_G_CNT_WSTAT;
|
||||
mask = 1 << 1; /* G_CNT_U write status */
|
||||
break;
|
||||
case (u32)(EXYNOS4_MCT_L0_BASE + MCT_L_TCON_OFFSET):
|
||||
stat_addr = EXYNOS4_MCT_L0_BASE + MCT_L_WSTAT_OFFSET;
|
||||
mask = 1 << 3; /* L0_TCON write status */
|
||||
break;
|
||||
case (u32)(EXYNOS4_MCT_L1_BASE + MCT_L_TCON_OFFSET):
|
||||
stat_addr = EXYNOS4_MCT_L1_BASE + MCT_L_WSTAT_OFFSET;
|
||||
mask = 1 << 3; /* L1_TCON write status */
|
||||
break;
|
||||
case (u32)(EXYNOS4_MCT_L0_BASE + MCT_L_TCNTB_OFFSET):
|
||||
stat_addr = EXYNOS4_MCT_L0_BASE + MCT_L_WSTAT_OFFSET;
|
||||
mask = 1 << 0; /* L0_TCNTB write status */
|
||||
break;
|
||||
case (u32)(EXYNOS4_MCT_L1_BASE + MCT_L_TCNTB_OFFSET):
|
||||
stat_addr = EXYNOS4_MCT_L1_BASE + MCT_L_WSTAT_OFFSET;
|
||||
mask = 1 << 0; /* L1_TCNTB write status */
|
||||
break;
|
||||
case (u32)(EXYNOS4_MCT_L0_BASE + MCT_L_ICNTB_OFFSET):
|
||||
stat_addr = EXYNOS4_MCT_L0_BASE + MCT_L_WSTAT_OFFSET;
|
||||
mask = 1 << 1; /* L0_ICNTB write status */
|
||||
break;
|
||||
case (u32)(EXYNOS4_MCT_L1_BASE + MCT_L_ICNTB_OFFSET):
|
||||
stat_addr = EXYNOS4_MCT_L1_BASE + MCT_L_WSTAT_OFFSET;
|
||||
mask = 1 << 1; /* L1_ICNTB write status */
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
/* Wait maximum 1 ms until written values are applied */
|
||||
for (i = 0; i < loops_per_jiffy / 1000 * HZ; i++)
|
||||
if (__raw_readl(stat_addr) & mask) {
|
||||
__raw_writel(mask, stat_addr);
|
||||
return;
|
||||
}
|
||||
|
||||
panic("MCT hangs after writing %d (addr:0x%08x)\n", value, (u32)addr);
|
||||
}
|
||||
|
||||
/* Clocksource handling */
|
||||
static void exynos4_mct_frc_start(u32 hi, u32 lo)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
exynos4_mct_write(lo, EXYNOS4_MCT_G_CNT_L);
|
||||
exynos4_mct_write(hi, EXYNOS4_MCT_G_CNT_U);
|
||||
|
||||
reg = __raw_readl(EXYNOS4_MCT_G_TCON);
|
||||
reg |= MCT_G_TCON_START;
|
||||
exynos4_mct_write(reg, EXYNOS4_MCT_G_TCON);
|
||||
}
|
||||
|
||||
static cycle_t exynos4_frc_read(struct clocksource *cs)
|
||||
{
|
||||
unsigned int lo, hi;
|
||||
u32 hi2 = __raw_readl(EXYNOS4_MCT_G_CNT_U);
|
||||
|
||||
do {
|
||||
hi = hi2;
|
||||
lo = __raw_readl(EXYNOS4_MCT_G_CNT_L);
|
||||
hi2 = __raw_readl(EXYNOS4_MCT_G_CNT_U);
|
||||
} while (hi != hi2);
|
||||
|
||||
return ((cycle_t)hi << 32) | lo;
|
||||
}
|
||||
|
||||
struct clocksource mct_frc = {
|
||||
.name = "mct-frc",
|
||||
.rating = 400,
|
||||
.read = exynos4_frc_read,
|
||||
.mask = CLOCKSOURCE_MASK(64),
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
static void __init exynos4_clocksource_init(void)
|
||||
{
|
||||
exynos4_mct_frc_start(0, 0);
|
||||
|
||||
if (clocksource_register_hz(&mct_frc, clk_rate))
|
||||
panic("%s: can't register clocksource\n", mct_frc.name);
|
||||
}
|
||||
|
||||
static void exynos4_mct_comp0_stop(void)
|
||||
{
|
||||
unsigned int tcon;
|
||||
|
||||
tcon = __raw_readl(EXYNOS4_MCT_G_TCON);
|
||||
tcon &= ~(MCT_G_TCON_COMP0_ENABLE | MCT_G_TCON_COMP0_AUTO_INC);
|
||||
|
||||
exynos4_mct_write(tcon, EXYNOS4_MCT_G_TCON);
|
||||
exynos4_mct_write(0, EXYNOS4_MCT_G_INT_ENB);
|
||||
}
|
||||
|
||||
static void exynos4_mct_comp0_start(enum clock_event_mode mode,
|
||||
unsigned long cycles)
|
||||
{
|
||||
unsigned int tcon;
|
||||
cycle_t comp_cycle;
|
||||
|
||||
tcon = __raw_readl(EXYNOS4_MCT_G_TCON);
|
||||
|
||||
if (mode == CLOCK_EVT_MODE_PERIODIC) {
|
||||
tcon |= MCT_G_TCON_COMP0_AUTO_INC;
|
||||
exynos4_mct_write(cycles, EXYNOS4_MCT_G_COMP0_ADD_INCR);
|
||||
}
|
||||
|
||||
comp_cycle = exynos4_frc_read(&mct_frc) + cycles;
|
||||
exynos4_mct_write((u32)comp_cycle, EXYNOS4_MCT_G_COMP0_L);
|
||||
exynos4_mct_write((u32)(comp_cycle >> 32), EXYNOS4_MCT_G_COMP0_U);
|
||||
|
||||
exynos4_mct_write(0x1, EXYNOS4_MCT_G_INT_ENB);
|
||||
|
||||
tcon |= MCT_G_TCON_COMP0_ENABLE;
|
||||
exynos4_mct_write(tcon , EXYNOS4_MCT_G_TCON);
|
||||
}
|
||||
|
||||
static int exynos4_comp_set_next_event(unsigned long cycles,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
exynos4_mct_comp0_start(evt->mode, cycles);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void exynos4_comp_set_mode(enum clock_event_mode mode,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
exynos4_mct_comp0_stop();
|
||||
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
exynos4_mct_comp0_start(mode, clk_cnt_per_tick);
|
||||
break;
|
||||
|
||||
case CLOCK_EVT_MODE_ONESHOT:
|
||||
case CLOCK_EVT_MODE_UNUSED:
|
||||
case CLOCK_EVT_MODE_SHUTDOWN:
|
||||
case CLOCK_EVT_MODE_RESUME:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static struct clock_event_device mct_comp_device = {
|
||||
.name = "mct-comp",
|
||||
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
|
||||
.rating = 250,
|
||||
.set_next_event = exynos4_comp_set_next_event,
|
||||
.set_mode = exynos4_comp_set_mode,
|
||||
};
|
||||
|
||||
static irqreturn_t exynos4_mct_comp_isr(int irq, void *dev_id)
|
||||
{
|
||||
struct clock_event_device *evt = dev_id;
|
||||
|
||||
exynos4_mct_write(0x1, EXYNOS4_MCT_G_INT_CSTAT);
|
||||
|
||||
evt->event_handler(evt);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static struct irqaction mct_comp_event_irq = {
|
||||
.name = "mct_comp_irq",
|
||||
.flags = IRQF_TIMER | IRQF_IRQPOLL,
|
||||
.handler = exynos4_mct_comp_isr,
|
||||
.dev_id = &mct_comp_device,
|
||||
};
|
||||
|
||||
static void exynos4_clockevent_init(void)
|
||||
{
|
||||
clk_cnt_per_tick = clk_rate / 2 / HZ;
|
||||
|
||||
clockevents_calc_mult_shift(&mct_comp_device, clk_rate / 2, 5);
|
||||
mct_comp_device.max_delta_ns =
|
||||
clockevent_delta2ns(0xffffffff, &mct_comp_device);
|
||||
mct_comp_device.min_delta_ns =
|
||||
clockevent_delta2ns(0xf, &mct_comp_device);
|
||||
mct_comp_device.cpumask = cpumask_of(0);
|
||||
clockevents_register_device(&mct_comp_device);
|
||||
|
||||
setup_irq(IRQ_MCT_G0, &mct_comp_event_irq);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_LOCAL_TIMERS
|
||||
/* Clock event handling */
|
||||
static void exynos4_mct_tick_stop(struct mct_clock_event_device *mevt)
|
||||
{
|
||||
unsigned long tmp;
|
||||
unsigned long mask = MCT_L_TCON_INT_START | MCT_L_TCON_TIMER_START;
|
||||
void __iomem *addr = mevt->base + MCT_L_TCON_OFFSET;
|
||||
|
||||
tmp = __raw_readl(addr);
|
||||
if (tmp & mask) {
|
||||
tmp &= ~mask;
|
||||
exynos4_mct_write(tmp, addr);
|
||||
}
|
||||
}
|
||||
|
||||
static void exynos4_mct_tick_start(unsigned long cycles,
|
||||
struct mct_clock_event_device *mevt)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
||||
exynos4_mct_tick_stop(mevt);
|
||||
|
||||
tmp = (1 << 31) | cycles; /* MCT_L_UPDATE_ICNTB */
|
||||
|
||||
/* update interrupt count buffer */
|
||||
exynos4_mct_write(tmp, mevt->base + MCT_L_ICNTB_OFFSET);
|
||||
|
||||
/* enable MCT tick interupt */
|
||||
exynos4_mct_write(0x1, mevt->base + MCT_L_INT_ENB_OFFSET);
|
||||
|
||||
tmp = __raw_readl(mevt->base + MCT_L_TCON_OFFSET);
|
||||
tmp |= MCT_L_TCON_INT_START | MCT_L_TCON_TIMER_START |
|
||||
MCT_L_TCON_INTERVAL_MODE;
|
||||
exynos4_mct_write(tmp, mevt->base + MCT_L_TCON_OFFSET);
|
||||
}
|
||||
|
||||
static int exynos4_tick_set_next_event(unsigned long cycles,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
struct mct_clock_event_device *mevt = &mct_tick[smp_processor_id()];
|
||||
|
||||
exynos4_mct_tick_start(cycles, mevt);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void exynos4_tick_set_mode(enum clock_event_mode mode,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
struct mct_clock_event_device *mevt = &mct_tick[smp_processor_id()];
|
||||
|
||||
exynos4_mct_tick_stop(mevt);
|
||||
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
exynos4_mct_tick_start(clk_cnt_per_tick, mevt);
|
||||
break;
|
||||
|
||||
case CLOCK_EVT_MODE_ONESHOT:
|
||||
case CLOCK_EVT_MODE_UNUSED:
|
||||
case CLOCK_EVT_MODE_SHUTDOWN:
|
||||
case CLOCK_EVT_MODE_RESUME:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static irqreturn_t exynos4_mct_tick_isr(int irq, void *dev_id)
|
||||
{
|
||||
struct mct_clock_event_device *mevt = dev_id;
|
||||
struct clock_event_device *evt = mevt->evt;
|
||||
|
||||
/*
|
||||
* This is for supporting oneshot mode.
|
||||
* Mct would generate interrupt periodically
|
||||
* without explicit stopping.
|
||||
*/
|
||||
if (evt->mode != CLOCK_EVT_MODE_PERIODIC)
|
||||
exynos4_mct_tick_stop(mevt);
|
||||
|
||||
/* Clear the MCT tick interrupt */
|
||||
exynos4_mct_write(0x1, mevt->base + MCT_L_INT_CSTAT_OFFSET);
|
||||
|
||||
evt->event_handler(evt);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static struct irqaction mct_tick0_event_irq = {
|
||||
.name = "mct_tick0_irq",
|
||||
.flags = IRQF_TIMER | IRQF_NOBALANCING,
|
||||
.handler = exynos4_mct_tick_isr,
|
||||
};
|
||||
|
||||
static struct irqaction mct_tick1_event_irq = {
|
||||
.name = "mct_tick1_irq",
|
||||
.flags = IRQF_TIMER | IRQF_NOBALANCING,
|
||||
.handler = exynos4_mct_tick_isr,
|
||||
};
|
||||
|
||||
static void exynos4_mct_tick_init(struct clock_event_device *evt)
|
||||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
|
||||
mct_tick[cpu].evt = evt;
|
||||
|
||||
if (cpu == 0) {
|
||||
mct_tick[cpu].base = EXYNOS4_MCT_L0_BASE;
|
||||
evt->name = "mct_tick0";
|
||||
} else {
|
||||
mct_tick[cpu].base = EXYNOS4_MCT_L1_BASE;
|
||||
evt->name = "mct_tick1";
|
||||
}
|
||||
|
||||
evt->cpumask = cpumask_of(cpu);
|
||||
evt->set_next_event = exynos4_tick_set_next_event;
|
||||
evt->set_mode = exynos4_tick_set_mode;
|
||||
evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
|
||||
evt->rating = 450;
|
||||
|
||||
clockevents_calc_mult_shift(evt, clk_rate / 2, 5);
|
||||
evt->max_delta_ns =
|
||||
clockevent_delta2ns(0x7fffffff, evt);
|
||||
evt->min_delta_ns =
|
||||
clockevent_delta2ns(0xf, evt);
|
||||
|
||||
clockevents_register_device(evt);
|
||||
|
||||
exynos4_mct_write(0x1, mct_tick[cpu].base + MCT_L_TCNTB_OFFSET);
|
||||
|
||||
if (cpu == 0) {
|
||||
mct_tick0_event_irq.dev_id = &mct_tick[cpu];
|
||||
setup_irq(IRQ_MCT_L0, &mct_tick0_event_irq);
|
||||
} else {
|
||||
mct_tick1_event_irq.dev_id = &mct_tick[cpu];
|
||||
irq_set_affinity(IRQ_MCT1, cpumask_of(1));
|
||||
setup_irq(IRQ_MCT_L1, &mct_tick1_event_irq);
|
||||
}
|
||||
}
|
||||
|
||||
/* Setup the local clock events for a CPU */
|
||||
void __cpuinit local_timer_setup(struct clock_event_device *evt)
|
||||
{
|
||||
exynos4_mct_tick_init(evt);
|
||||
}
|
||||
|
||||
int local_timer_ack(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_LOCAL_TIMERS */
|
||||
|
||||
static void __init exynos4_timer_resources(void)
|
||||
{
|
||||
struct clk *mct_clk;
|
||||
mct_clk = clk_get(NULL, "xtal");
|
||||
|
||||
clk_rate = clk_get_rate(mct_clk);
|
||||
}
|
||||
|
||||
static void __init exynos4_timer_init(void)
|
||||
{
|
||||
exynos4_timer_resources();
|
||||
exynos4_clocksource_init();
|
||||
exynos4_clockevent_init();
|
||||
}
|
||||
|
||||
struct sys_timer exynos4_timer = {
|
||||
.init = exynos4_timer_init,
|
||||
};
|
@ -1,7 +1,7 @@
|
||||
/* linux/arch/arm/mach-s5pv310/platsmp.c
|
||||
/* linux/arch/arm/mach-exynos4/platsmp.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* Cloned from linux/arch/arm/mach-vexpress/platsmp.c
|
||||
*
|
||||
@ -28,7 +28,7 @@
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/regs-clock.h>
|
||||
|
||||
extern void s5pv310_secondary_startup(void);
|
||||
extern void exynos4_secondary_startup(void);
|
||||
|
||||
/*
|
||||
* control for which core is the next to come out of the secondary
|
||||
@ -139,7 +139,7 @@ void __init smp_init_cpus(void)
|
||||
/* sanity check */
|
||||
if (ncores > NR_CPUS) {
|
||||
printk(KERN_WARNING
|
||||
"S5PV310: no. of cores (%d) greater than configured "
|
||||
"EXYNOS4: no. of cores (%d) greater than configured "
|
||||
"maximum of %d - clipping\n",
|
||||
ncores, NR_CPUS);
|
||||
ncores = NR_CPUS;
|
||||
@ -168,5 +168,5 @@ void __init platform_smp_prepare_cpus(unsigned int max_cpus)
|
||||
* until it receives a soft interrupt, and then the
|
||||
* secondary CPU branches to this address.
|
||||
*/
|
||||
__raw_writel(BSYM(virt_to_phys(s5pv310_secondary_startup)), S5P_VA_SYSRAM);
|
||||
__raw_writel(BSYM(virt_to_phys(exynos4_secondary_startup)), S5P_VA_SYSRAM);
|
||||
}
|
420
arch/arm/mach-exynos4/pm.c
Normal file
420
arch/arm/mach-exynos4/pm.c
Normal file
@ -0,0 +1,420 @@
|
||||
/* linux/arch/arm/mach-exynos4/pm.c
|
||||
*
|
||||
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* EXYNOS4210 - Power Management support
|
||||
*
|
||||
* Based on arch/arm/mach-s3c2410/pm.c
|
||||
* Copyright (c) 2006 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/pm.h>
|
||||
|
||||
#include <mach/regs-irq.h>
|
||||
#include <mach/regs-gpio.h>
|
||||
#include <mach/regs-clock.h>
|
||||
#include <mach/regs-pmu.h>
|
||||
#include <mach/pm-core.h>
|
||||
|
||||
static struct sleep_save exynos4_sleep[] = {
|
||||
{ .reg = S5P_ARM_CORE0_LOWPWR , .val = 0x2, },
|
||||
{ .reg = S5P_DIS_IRQ_CORE0 , .val = 0x0, },
|
||||
{ .reg = S5P_DIS_IRQ_CENTRAL0 , .val = 0x0, },
|
||||
{ .reg = S5P_ARM_CORE1_LOWPWR , .val = 0x2, },
|
||||
{ .reg = S5P_DIS_IRQ_CORE1 , .val = 0x0, },
|
||||
{ .reg = S5P_DIS_IRQ_CENTRAL1 , .val = 0x0, },
|
||||
{ .reg = S5P_ARM_COMMON_LOWPWR , .val = 0x2, },
|
||||
{ .reg = S5P_L2_0_LOWPWR , .val = 0x3, },
|
||||
{ .reg = S5P_L2_1_LOWPWR , .val = 0x3, },
|
||||
{ .reg = S5P_CMU_ACLKSTOP_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_SCLKSTOP_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_RESET_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_APLL_SYSCLK_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_MPLL_SYSCLK_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_VPLL_SYSCLK_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_EPLL_SYSCLK_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_CLKSTOP_GPS_ALIVE_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_RESET_GPSALIVE_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_CLKSTOP_CAM_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_CLKSTOP_TV_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_CLKSTOP_MFC_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_CLKSTOP_G3D_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_CLKSTOP_LCD0_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_CLKSTOP_LCD1_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_CLKSTOP_MAUDIO_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_CLKSTOP_GPS_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_RESET_CAM_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_RESET_TV_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_RESET_MFC_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_RESET_G3D_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_RESET_LCD0_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_RESET_LCD1_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_RESET_MAUDIO_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CMU_RESET_GPS_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_TOP_BUS_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_TOP_RETENTION_LOWPWR , .val = 0x1, },
|
||||
{ .reg = S5P_TOP_PWR_LOWPWR , .val = 0x3, },
|
||||
{ .reg = S5P_LOGIC_RESET_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_ONENAND_MEM_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_MODIMIF_MEM_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_G2D_ACP_MEM_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_USBOTG_MEM_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_HSMMC_MEM_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CSSYS_MEM_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_SECSS_MEM_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_PCIE_MEM_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_SATA_MEM_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_PAD_RETENTION_DRAM_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_PAD_RETENTION_MAUDIO_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_PAD_RETENTION_GPIO_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_PAD_RETENTION_UART_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_PAD_RETENTION_MMCA_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_PAD_RETENTION_MMCB_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_PAD_RETENTION_EBIA_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_PAD_RETENTION_EBIB_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_PAD_RETENTION_ISOLATION_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_PAD_RETENTION_ALV_SEL_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_XUSBXTI_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_XXTI_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_EXT_REGULATOR_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_GPIO_MODE_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_GPIO_MODE_MAUDIO_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_CAM_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_TV_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_MFC_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_G3D_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_LCD0_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_LCD1_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_MAUDIO_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_GPS_LOWPWR , .val = 0x0, },
|
||||
{ .reg = S5P_GPS_ALIVE_LOWPWR , .val = 0x0, },
|
||||
};
|
||||
|
||||
static struct sleep_save exynos4_set_clksrc[] = {
|
||||
{ .reg = S5P_CLKSRC_MASK_TOP , .val = 0x00000001, },
|
||||
{ .reg = S5P_CLKSRC_MASK_CAM , .val = 0x11111111, },
|
||||
{ .reg = S5P_CLKSRC_MASK_TV , .val = 0x00000111, },
|
||||
{ .reg = S5P_CLKSRC_MASK_LCD0 , .val = 0x00001111, },
|
||||
{ .reg = S5P_CLKSRC_MASK_LCD1 , .val = 0x00001111, },
|
||||
{ .reg = S5P_CLKSRC_MASK_MAUDIO , .val = 0x00000001, },
|
||||
{ .reg = S5P_CLKSRC_MASK_FSYS , .val = 0x01011111, },
|
||||
{ .reg = S5P_CLKSRC_MASK_PERIL0 , .val = 0x01111111, },
|
||||
{ .reg = S5P_CLKSRC_MASK_PERIL1 , .val = 0x01110111, },
|
||||
{ .reg = S5P_CLKSRC_MASK_DMC , .val = 0x00010000, },
|
||||
};
|
||||
|
||||
static struct sleep_save exynos4_core_save[] = {
|
||||
/* CMU side */
|
||||
SAVE_ITEM(S5P_CLKDIV_LEFTBUS),
|
||||
SAVE_ITEM(S5P_CLKGATE_IP_LEFTBUS),
|
||||
SAVE_ITEM(S5P_CLKDIV_RIGHTBUS),
|
||||
SAVE_ITEM(S5P_CLKGATE_IP_RIGHTBUS),
|
||||
SAVE_ITEM(S5P_EPLL_CON0),
|
||||
SAVE_ITEM(S5P_EPLL_CON1),
|
||||
SAVE_ITEM(S5P_VPLL_CON0),
|
||||
SAVE_ITEM(S5P_VPLL_CON1),
|
||||
SAVE_ITEM(S5P_CLKSRC_TOP0),
|
||||
SAVE_ITEM(S5P_CLKSRC_TOP1),
|
||||
SAVE_ITEM(S5P_CLKSRC_CAM),
|
||||
SAVE_ITEM(S5P_CLKSRC_MFC),
|
||||
SAVE_ITEM(S5P_CLKSRC_IMAGE),
|
||||
SAVE_ITEM(S5P_CLKSRC_LCD0),
|
||||
SAVE_ITEM(S5P_CLKSRC_LCD1),
|
||||
SAVE_ITEM(S5P_CLKSRC_MAUDIO),
|
||||
SAVE_ITEM(S5P_CLKSRC_FSYS),
|
||||
SAVE_ITEM(S5P_CLKSRC_PERIL0),
|
||||
SAVE_ITEM(S5P_CLKSRC_PERIL1),
|
||||
SAVE_ITEM(S5P_CLKDIV_CAM),
|
||||
SAVE_ITEM(S5P_CLKDIV_TV),
|
||||
SAVE_ITEM(S5P_CLKDIV_MFC),
|
||||
SAVE_ITEM(S5P_CLKDIV_G3D),
|
||||
SAVE_ITEM(S5P_CLKDIV_IMAGE),
|
||||
SAVE_ITEM(S5P_CLKDIV_LCD0),
|
||||
SAVE_ITEM(S5P_CLKDIV_LCD1),
|
||||
SAVE_ITEM(S5P_CLKDIV_MAUDIO),
|
||||
SAVE_ITEM(S5P_CLKDIV_FSYS0),
|
||||
SAVE_ITEM(S5P_CLKDIV_FSYS1),
|
||||
SAVE_ITEM(S5P_CLKDIV_FSYS2),
|
||||
SAVE_ITEM(S5P_CLKDIV_FSYS3),
|
||||
SAVE_ITEM(S5P_CLKDIV_PERIL0),
|
||||
SAVE_ITEM(S5P_CLKDIV_PERIL1),
|
||||
SAVE_ITEM(S5P_CLKDIV_PERIL2),
|
||||
SAVE_ITEM(S5P_CLKDIV_PERIL3),
|
||||
SAVE_ITEM(S5P_CLKDIV_PERIL4),
|
||||
SAVE_ITEM(S5P_CLKDIV_PERIL5),
|
||||
SAVE_ITEM(S5P_CLKDIV_TOP),
|
||||
SAVE_ITEM(S5P_CLKSRC_MASK_CAM),
|
||||
SAVE_ITEM(S5P_CLKSRC_MASK_TV),
|
||||
SAVE_ITEM(S5P_CLKSRC_MASK_LCD0),
|
||||
SAVE_ITEM(S5P_CLKSRC_MASK_LCD1),
|
||||
SAVE_ITEM(S5P_CLKSRC_MASK_MAUDIO),
|
||||
SAVE_ITEM(S5P_CLKSRC_MASK_FSYS),
|
||||
SAVE_ITEM(S5P_CLKSRC_MASK_PERIL0),
|
||||
SAVE_ITEM(S5P_CLKSRC_MASK_PERIL1),
|
||||
SAVE_ITEM(S5P_CLKGATE_SCLKCAM),
|
||||
SAVE_ITEM(S5P_CLKGATE_IP_CAM),
|
||||
SAVE_ITEM(S5P_CLKGATE_IP_TV),
|
||||
SAVE_ITEM(S5P_CLKGATE_IP_MFC),
|
||||
SAVE_ITEM(S5P_CLKGATE_IP_G3D),
|
||||
SAVE_ITEM(S5P_CLKGATE_IP_IMAGE),
|
||||
SAVE_ITEM(S5P_CLKGATE_IP_LCD0),
|
||||
SAVE_ITEM(S5P_CLKGATE_IP_LCD1),
|
||||
SAVE_ITEM(S5P_CLKGATE_IP_FSYS),
|
||||
SAVE_ITEM(S5P_CLKGATE_IP_GPS),
|
||||
SAVE_ITEM(S5P_CLKGATE_IP_PERIL),
|
||||
SAVE_ITEM(S5P_CLKGATE_IP_PERIR),
|
||||
SAVE_ITEM(S5P_CLKGATE_BLOCK),
|
||||
SAVE_ITEM(S5P_CLKSRC_MASK_DMC),
|
||||
SAVE_ITEM(S5P_CLKSRC_DMC),
|
||||
SAVE_ITEM(S5P_CLKDIV_DMC0),
|
||||
SAVE_ITEM(S5P_CLKDIV_DMC1),
|
||||
SAVE_ITEM(S5P_CLKGATE_IP_DMC),
|
||||
SAVE_ITEM(S5P_CLKSRC_CPU),
|
||||
SAVE_ITEM(S5P_CLKDIV_CPU),
|
||||
SAVE_ITEM(S5P_CLKGATE_SCLKCPU),
|
||||
SAVE_ITEM(S5P_CLKGATE_IP_CPU),
|
||||
/* GIC side */
|
||||
SAVE_ITEM(S5P_VA_GIC_CPU + 0x000),
|
||||
SAVE_ITEM(S5P_VA_GIC_CPU + 0x004),
|
||||
SAVE_ITEM(S5P_VA_GIC_CPU + 0x008),
|
||||
SAVE_ITEM(S5P_VA_GIC_CPU + 0x00C),
|
||||
SAVE_ITEM(S5P_VA_GIC_CPU + 0x014),
|
||||
SAVE_ITEM(S5P_VA_GIC_CPU + 0x018),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x000),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x004),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x100),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x104),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x108),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x300),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x304),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x308),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x400),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x404),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x408),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x40C),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x410),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x414),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x418),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x41C),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x420),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x424),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x428),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x42C),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x430),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x434),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x438),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x43C),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x440),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x444),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x448),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x44C),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x450),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x454),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x458),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x45C),
|
||||
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x800),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x804),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x808),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x80C),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x810),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x814),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x818),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x81C),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x820),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x824),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x828),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x82C),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x830),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x834),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x838),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x83C),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x840),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x844),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x848),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x84C),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x850),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x854),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x858),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0x85C),
|
||||
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0xC00),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0xC04),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0xC08),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0xC0C),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0xC10),
|
||||
SAVE_ITEM(S5P_VA_GIC_DIST + 0xC14),
|
||||
|
||||
SAVE_ITEM(S5P_VA_COMBINER_BASE + 0x000),
|
||||
SAVE_ITEM(S5P_VA_COMBINER_BASE + 0x010),
|
||||
SAVE_ITEM(S5P_VA_COMBINER_BASE + 0x020),
|
||||
SAVE_ITEM(S5P_VA_COMBINER_BASE + 0x030),
|
||||
SAVE_ITEM(S5P_VA_COMBINER_BASE + 0x040),
|
||||
SAVE_ITEM(S5P_VA_COMBINER_BASE + 0x050),
|
||||
SAVE_ITEM(S5P_VA_COMBINER_BASE + 0x060),
|
||||
SAVE_ITEM(S5P_VA_COMBINER_BASE + 0x070),
|
||||
SAVE_ITEM(S5P_VA_COMBINER_BASE + 0x080),
|
||||
SAVE_ITEM(S5P_VA_COMBINER_BASE + 0x090),
|
||||
};
|
||||
|
||||
static struct sleep_save exynos4_l2cc_save[] = {
|
||||
SAVE_ITEM(S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL),
|
||||
SAVE_ITEM(S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL),
|
||||
SAVE_ITEM(S5P_VA_L2CC + L2X0_PREFETCH_CTRL),
|
||||
SAVE_ITEM(S5P_VA_L2CC + L2X0_POWER_CTRL),
|
||||
SAVE_ITEM(S5P_VA_L2CC + L2X0_AUX_CTRL),
|
||||
};
|
||||
|
||||
void exynos4_cpu_suspend(void)
|
||||
{
|
||||
unsigned long tmp;
|
||||
unsigned long mask = 0xFFFFFFFF;
|
||||
|
||||
/* Setting Central Sequence Register for power down mode */
|
||||
|
||||
tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION);
|
||||
tmp &= ~(S5P_CENTRAL_LOWPWR_CFG);
|
||||
__raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
|
||||
|
||||
/* Setting Central Sequence option Register */
|
||||
|
||||
tmp = __raw_readl(S5P_CENTRAL_SEQ_OPTION);
|
||||
tmp &= ~(S5P_USE_MASK);
|
||||
tmp |= S5P_USE_STANDBY_WFI0;
|
||||
__raw_writel(tmp, S5P_CENTRAL_SEQ_OPTION);
|
||||
|
||||
/* Clear all interrupt pending to avoid early wakeup */
|
||||
|
||||
__raw_writel(mask, (S5P_VA_GIC_DIST + 0x280));
|
||||
__raw_writel(mask, (S5P_VA_GIC_DIST + 0x284));
|
||||
__raw_writel(mask, (S5P_VA_GIC_DIST + 0x288));
|
||||
|
||||
/* Disable all interrupt */
|
||||
|
||||
__raw_writel(0x0, (S5P_VA_GIC_CPU + 0x000));
|
||||
__raw_writel(0x0, (S5P_VA_GIC_DIST + 0x000));
|
||||
__raw_writel(mask, (S5P_VA_GIC_DIST + 0x184));
|
||||
__raw_writel(mask, (S5P_VA_GIC_DIST + 0x188));
|
||||
|
||||
outer_flush_all();
|
||||
|
||||
/* issue the standby signal into the pm unit. */
|
||||
cpu_do_idle();
|
||||
|
||||
/* we should never get past here */
|
||||
panic("sleep resumed to originator?");
|
||||
}
|
||||
|
||||
static void exynos4_pm_prepare(void)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
s3c_pm_do_save(exynos4_core_save, ARRAY_SIZE(exynos4_core_save));
|
||||
s3c_pm_do_save(exynos4_l2cc_save, ARRAY_SIZE(exynos4_l2cc_save));
|
||||
|
||||
tmp = __raw_readl(S5P_INFORM1);
|
||||
|
||||
/* Set value of power down register for sleep mode */
|
||||
|
||||
s3c_pm_do_restore_core(exynos4_sleep, ARRAY_SIZE(exynos4_sleep));
|
||||
__raw_writel(S5P_CHECK_SLEEP, S5P_INFORM1);
|
||||
|
||||
/* ensure at least INFORM0 has the resume address */
|
||||
|
||||
__raw_writel(virt_to_phys(s3c_cpu_resume), S5P_INFORM0);
|
||||
|
||||
/* Before enter central sequence mode, clock src register have to set */
|
||||
|
||||
s3c_pm_do_restore_core(exynos4_set_clksrc, ARRAY_SIZE(exynos4_set_clksrc));
|
||||
|
||||
}
|
||||
|
||||
static int exynos4_pm_add(struct sys_device *sysdev)
|
||||
{
|
||||
pm_cpu_prep = exynos4_pm_prepare;
|
||||
pm_cpu_sleep = exynos4_cpu_suspend;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This function copy from linux/arch/arm/kernel/smp_scu.c */
|
||||
|
||||
void exynos4_scu_enable(void __iomem *scu_base)
|
||||
{
|
||||
u32 scu_ctrl;
|
||||
|
||||
scu_ctrl = __raw_readl(scu_base);
|
||||
/* already enabled? */
|
||||
if (scu_ctrl & 1)
|
||||
return;
|
||||
|
||||
scu_ctrl |= 1;
|
||||
__raw_writel(scu_ctrl, scu_base);
|
||||
|
||||
/*
|
||||
* Ensure that the data accessed by CPU0 before the SCU was
|
||||
* initialised is visible to the other CPUs.
|
||||
*/
|
||||
flush_cache_all();
|
||||
}
|
||||
|
||||
static int exynos4_pm_resume(struct sys_device *dev)
|
||||
{
|
||||
/* For release retention */
|
||||
|
||||
__raw_writel((1 << 28), S5P_PAD_RET_MAUDIO_OPTION);
|
||||
__raw_writel((1 << 28), S5P_PAD_RET_GPIO_OPTION);
|
||||
__raw_writel((1 << 28), S5P_PAD_RET_UART_OPTION);
|
||||
__raw_writel((1 << 28), S5P_PAD_RET_MMCA_OPTION);
|
||||
__raw_writel((1 << 28), S5P_PAD_RET_MMCB_OPTION);
|
||||
__raw_writel((1 << 28), S5P_PAD_RET_EBIA_OPTION);
|
||||
__raw_writel((1 << 28), S5P_PAD_RET_EBIB_OPTION);
|
||||
|
||||
s3c_pm_do_restore_core(exynos4_core_save, ARRAY_SIZE(exynos4_core_save));
|
||||
|
||||
exynos4_scu_enable(S5P_VA_SCU);
|
||||
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
s3c_pm_do_restore_core(exynos4_l2cc_save, ARRAY_SIZE(exynos4_l2cc_save));
|
||||
outer_inv_all();
|
||||
/* enable L2X0*/
|
||||
writel_relaxed(1, S5P_VA_L2CC + L2X0_CTRL);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_driver exynos4_pm_driver = {
|
||||
.add = exynos4_pm_add,
|
||||
.resume = exynos4_pm_resume,
|
||||
};
|
||||
|
||||
static __init int exynos4_pm_drvinit(void)
|
||||
{
|
||||
unsigned int tmp;
|
||||
|
||||
s3c_pm_init();
|
||||
|
||||
/* All wakeup disable */
|
||||
|
||||
tmp = __raw_readl(S5P_WAKEUP_MASK);
|
||||
tmp |= ((0xFF << 8) | (0x1F << 1));
|
||||
__raw_writel(tmp, S5P_WAKEUP_MASK);
|
||||
|
||||
return sysdev_driver_register(&exynos4_sysclass, &exynos4_pm_driver);
|
||||
}
|
||||
arch_initcall(exynos4_pm_drvinit);
|
44
arch/arm/mach-exynos4/setup-fimc.c
Normal file
44
arch/arm/mach-exynos4/setup-fimc.c
Normal file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (C) 2011 Samsung Electronics Co., Ltd.
|
||||
*
|
||||
* Exynos4 camera interface GPIO configuration.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/gpio.h>
|
||||
#include <plat/gpio-cfg.h>
|
||||
#include <plat/camport.h>
|
||||
|
||||
int exynos4_fimc_setup_gpio(enum s5p_camport_id id)
|
||||
{
|
||||
u32 gpio8, gpio5;
|
||||
u32 sfn;
|
||||
int ret;
|
||||
|
||||
switch (id) {
|
||||
case S5P_CAMPORT_A:
|
||||
gpio8 = EXYNOS4_GPJ0(0); /* PCLK, VSYNC, HREF, DATA[0:4] */
|
||||
gpio5 = EXYNOS4_GPJ1(0); /* DATA[5:7], CLKOUT, FIELD */
|
||||
sfn = S3C_GPIO_SFN(2);
|
||||
break;
|
||||
|
||||
case S5P_CAMPORT_B:
|
||||
gpio8 = EXYNOS4_GPE0(0); /* DATA[0:7] */
|
||||
gpio5 = EXYNOS4_GPE1(0); /* PCLK, VSYNC, HREF, CLKOUT, FIELD */
|
||||
sfn = S3C_GPIO_SFN(3);
|
||||
break;
|
||||
|
||||
default:
|
||||
WARN(1, "Wrong camport id: %d\n", id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = s3c_gpio_cfgall_range(gpio8, 8, sfn, S3C_GPIO_PULL_UP);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return s3c_gpio_cfgall_range(gpio5, 5, sfn, S3C_GPIO_PULL_UP);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-s5pv310/setup-i2c0.c
|
||||
* linux/arch/arm/mach-exynos4/setup-i2c0.c
|
||||
*
|
||||
* Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com/
|
||||
@ -21,6 +21,6 @@ struct platform_device; /* don't need the contents */
|
||||
|
||||
void s3c_i2c0_cfg_gpio(struct platform_device *dev)
|
||||
{
|
||||
s3c_gpio_cfgall_range(S5PV310_GPD1(0), 2,
|
||||
s3c_gpio_cfgall_range(EXYNOS4_GPD1(0), 2,
|
||||
S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-s5pv310/setup-i2c1.c
|
||||
* linux/arch/arm/mach-exynos4/setup-i2c1.c
|
||||
*
|
||||
* Copyright (C) 2010 Samsung Electronics Co., Ltd.
|
||||
*
|
||||
@ -18,6 +18,6 @@ struct platform_device; /* don't need the contents */
|
||||
|
||||
void s3c_i2c1_cfg_gpio(struct platform_device *dev)
|
||||
{
|
||||
s3c_gpio_cfgall_range(S5PV310_GPD1(2), 2,
|
||||
s3c_gpio_cfgall_range(EXYNOS4_GPD1(2), 2,
|
||||
S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-s5pv310/setup-i2c2.c
|
||||
* linux/arch/arm/mach-exynos4/setup-i2c2.c
|
||||
*
|
||||
* Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
|
||||
*
|
||||
@ -18,6 +18,6 @@ struct platform_device; /* don't need the contents */
|
||||
|
||||
void s3c_i2c2_cfg_gpio(struct platform_device *dev)
|
||||
{
|
||||
s3c_gpio_cfgall_range(S5PV310_GPA0(6), 2,
|
||||
s3c_gpio_cfgall_range(EXYNOS4_GPA0(6), 2,
|
||||
S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-s5pv310/setup-i2c3.c
|
||||
* linux/arch/arm/mach-exynos4/setup-i2c3.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
*
|
||||
@ -18,6 +18,6 @@ struct platform_device; /* don't need the contents */
|
||||
|
||||
void s3c_i2c3_cfg_gpio(struct platform_device *dev)
|
||||
{
|
||||
s3c_gpio_cfgall_range(S5PV310_GPA1(2), 2,
|
||||
s3c_gpio_cfgall_range(EXYNOS4_GPA1(2), 2,
|
||||
S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-s5pv310/setup-i2c4.c
|
||||
* linux/arch/arm/mach-exynos4/setup-i2c4.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
*
|
||||
@ -18,6 +18,6 @@ struct platform_device; /* don't need the contents */
|
||||
|
||||
void s3c_i2c4_cfg_gpio(struct platform_device *dev)
|
||||
{
|
||||
s3c_gpio_cfgall_range(S5PV310_GPB(2), 2,
|
||||
s3c_gpio_cfgall_range(EXYNOS4_GPB(2), 2,
|
||||
S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-s5pv310/setup-i2c5.c
|
||||
* linux/arch/arm/mach-exynos4/setup-i2c5.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
*
|
||||
@ -18,6 +18,6 @@ struct platform_device; /* don't need the contents */
|
||||
|
||||
void s3c_i2c5_cfg_gpio(struct platform_device *dev)
|
||||
{
|
||||
s3c_gpio_cfgall_range(S5PV310_GPB(6), 2,
|
||||
s3c_gpio_cfgall_range(EXYNOS4_GPB(6), 2,
|
||||
S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-s5pv310/setup-i2c6.c
|
||||
* linux/arch/arm/mach-exynos4/setup-i2c6.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
*
|
||||
@ -18,6 +18,6 @@ struct platform_device; /* don't need the contents */
|
||||
|
||||
void s3c_i2c6_cfg_gpio(struct platform_device *dev)
|
||||
{
|
||||
s3c_gpio_cfgall_range(S5PV310_GPC1(3), 2,
|
||||
s3c_gpio_cfgall_range(EXYNOS4_GPC1(3), 2,
|
||||
S3C_GPIO_SFN(4), S3C_GPIO_PULL_UP);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-s5pv310/setup-i2c7.c
|
||||
* linux/arch/arm/mach-exynos4/setup-i2c7.c
|
||||
*
|
||||
* Copyright (c) 2010 Samsung Electronics Co., Ltd.
|
||||
*
|
||||
@ -18,6 +18,6 @@ struct platform_device; /* don't need the contents */
|
||||
|
||||
void s3c_i2c7_cfg_gpio(struct platform_device *dev)
|
||||
{
|
||||
s3c_gpio_cfgall_range(S5PV310_GPD0(2), 2,
|
||||
s3c_gpio_cfgall_range(EXYNOS4_GPD0(2), 2,
|
||||
S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP);
|
||||
}
|
35
arch/arm/mach-exynos4/setup-keypad.c
Normal file
35
arch/arm/mach-exynos4/setup-keypad.c
Normal file
@ -0,0 +1,35 @@
|
||||
/* linux/arch/arm/mach-exynos4/setup-keypad.c
|
||||
*
|
||||
* Copyright (c) 2011 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* GPIO configuration for Exynos4 KeyPad device
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/gpio.h>
|
||||
#include <plat/gpio-cfg.h>
|
||||
|
||||
void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols)
|
||||
{
|
||||
/* Keypads can be of various combinations, Just making sure */
|
||||
|
||||
if (rows > 8) {
|
||||
/* Set all the necessary GPX2 pins: KP_ROW[0~7] */
|
||||
s3c_gpio_cfgrange_nopull(EXYNOS4_GPX2(0), 8, S3C_GPIO_SFN(3));
|
||||
|
||||
/* Set all the necessary GPX3 pins: KP_ROW[8~] */
|
||||
s3c_gpio_cfgrange_nopull(EXYNOS4_GPX3(0), (rows - 8),
|
||||
S3C_GPIO_SFN(3));
|
||||
} else {
|
||||
/* Set all the necessary GPX2 pins: KP_ROW[x] */
|
||||
s3c_gpio_cfgrange_nopull(EXYNOS4_GPX2(0), rows,
|
||||
S3C_GPIO_SFN(3));
|
||||
}
|
||||
|
||||
/* Set all the necessary GPX1 pins to special-function 3: KP_COL[x] */
|
||||
s3c_gpio_cfgrange_nopull(EXYNOS4_GPX1(0), cols, S3C_GPIO_SFN(3));
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user