mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
Merge branch 'omap2-upstream' into devel
This commit is contained in:
commit
adf6d34e46
737 changed files with 24475 additions and 14528 deletions
|
|
@ -476,6 +476,7 @@ config ARCH_DAVINCI
|
|||
config ARCH_OMAP
|
||||
bool "TI OMAP"
|
||||
select GENERIC_GPIO
|
||||
select HAVE_GPIO_LIB
|
||||
select GENERIC_TIME
|
||||
select GENERIC_CLOCKEVENTS
|
||||
help
|
||||
|
|
|
|||
|
|
@ -120,6 +120,7 @@ void it8152_irq_demux(unsigned int irq, struct irq_desc *desc)
|
|||
time, when they all three were 0. */
|
||||
bits_pd = __raw_readl(IT8152_INTC_PDCNIRR);
|
||||
bits_lp = __raw_readl(IT8152_INTC_LPCNIRR);
|
||||
bits_ld = __raw_readl(IT8152_INTC_LDCNIRR);
|
||||
if (!(bits_ld | bits_lp | bits_pd))
|
||||
return;
|
||||
}
|
||||
|
|
@ -133,14 +134,14 @@ void it8152_irq_demux(unsigned int irq, struct irq_desc *desc)
|
|||
|
||||
bits_lp &= ((1 << IT8152_LP_IRQ_COUNT) - 1);
|
||||
while (bits_lp) {
|
||||
i = __ffs(bits_pd);
|
||||
i = __ffs(bits_lp);
|
||||
it8152_irq(IT8152_LP_IRQ(i));
|
||||
bits_lp &= ~(1 << i);
|
||||
}
|
||||
|
||||
bits_ld &= ((1 << IT8152_LD_IRQ_COUNT) - 1);
|
||||
while (bits_ld) {
|
||||
i = __ffs(bits_pd);
|
||||
i = __ffs(bits_ld);
|
||||
it8152_irq(IT8152_LD_IRQ(i));
|
||||
bits_ld &= ~(1 << i);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -336,7 +336,7 @@
|
|||
CALL(sys_mknodat)
|
||||
/* 325 */ CALL(sys_fchownat)
|
||||
CALL(sys_futimesat)
|
||||
CALL(sys_fstatat64)
|
||||
CALL(ABI(sys_fstatat64, sys_oabi_fstatat64))
|
||||
CALL(sys_unlinkat)
|
||||
CALL(sys_renameat)
|
||||
/* 330 */ CALL(sys_linkat)
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
* sys_stat64:
|
||||
* sys_lstat64:
|
||||
* sys_fstat64:
|
||||
* sys_fstatat64:
|
||||
*
|
||||
* struct stat64 has different sizes and some members are shifted
|
||||
* Compatibility wrappers are needed for them and provided below.
|
||||
|
|
@ -169,6 +170,29 @@ asmlinkage long sys_oabi_fstat64(unsigned long fd,
|
|||
return error;
|
||||
}
|
||||
|
||||
asmlinkage long sys_oabi_fstatat64(int dfd,
|
||||
char __user *filename,
|
||||
struct oldabi_stat64 __user *statbuf,
|
||||
int flag)
|
||||
{
|
||||
struct kstat stat;
|
||||
int error = -EINVAL;
|
||||
|
||||
if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)
|
||||
goto out;
|
||||
|
||||
if (flag & AT_SYMLINK_NOFOLLOW)
|
||||
error = vfs_lstat_fd(dfd, filename, &stat);
|
||||
else
|
||||
error = vfs_stat_fd(dfd, filename, &stat);
|
||||
|
||||
if (!error)
|
||||
error = cp_oldabi_stat64(&stat, statbuf);
|
||||
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
struct oabi_flock64 {
|
||||
short l_type;
|
||||
short l_whence;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@
|
|||
# Common support
|
||||
obj-y := io.o id.o clock.o irq.o mux.o serial.o devices.o
|
||||
|
||||
obj-$(CONFIG_OMAP_MPU_TIMER) += time.o
|
||||
obj-$(CONFIG_OMAP_MPU_TIMER) += time.o
|
||||
obj-$(CONFIG_OMAP_32K_TIMER) += timer32k.o
|
||||
|
||||
# Power Management
|
||||
obj-$(CONFIG_PM) += pm.o sleep.o
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
|
@ -183,11 +184,80 @@ static struct platform_device *osk5912_devices[] __initdata = {
|
|||
&osk5912_mcbsp1_device,
|
||||
};
|
||||
|
||||
static struct gpio_led tps_leds[] = {
|
||||
/* NOTE: D9 and D2 have hardware blink support.
|
||||
* Also, D9 requires non-battery power.
|
||||
*/
|
||||
{ .gpio = OSK_TPS_GPIO_LED_D9, .name = "d9", },
|
||||
{ .gpio = OSK_TPS_GPIO_LED_D2, .name = "d2", },
|
||||
{ .gpio = OSK_TPS_GPIO_LED_D3, .name = "d3", .active_low = 1,
|
||||
.default_trigger = "heartbeat", },
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data tps_leds_data = {
|
||||
.num_leds = 3,
|
||||
.leds = tps_leds,
|
||||
};
|
||||
|
||||
static struct platform_device osk5912_tps_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = 0,
|
||||
.dev.platform_data = &tps_leds_data,
|
||||
};
|
||||
|
||||
static int osk_tps_setup(struct i2c_client *client, void *context)
|
||||
{
|
||||
/* Set GPIO 1 HIGH to disable VBUS power supply;
|
||||
* OHCI driver powers it up/down as needed.
|
||||
*/
|
||||
gpio_request(OSK_TPS_GPIO_USB_PWR_EN, "n_vbus_en");
|
||||
gpio_direction_output(OSK_TPS_GPIO_USB_PWR_EN, 1);
|
||||
|
||||
/* Set GPIO 2 high so LED D3 is off by default */
|
||||
tps65010_set_gpio_out_value(GPIO2, HIGH);
|
||||
|
||||
/* Set GPIO 3 low to take ethernet out of reset */
|
||||
gpio_request(OSK_TPS_GPIO_LAN_RESET, "smc_reset");
|
||||
gpio_direction_output(OSK_TPS_GPIO_LAN_RESET, 0);
|
||||
|
||||
/* GPIO4 is VDD_DSP */
|
||||
gpio_request(OSK_TPS_GPIO_DSP_PWR_EN, "dsp_power");
|
||||
gpio_direction_output(OSK_TPS_GPIO_DSP_PWR_EN, 1);
|
||||
/* REVISIT if DSP support isn't configured, power it off ... */
|
||||
|
||||
/* Let LED1 (D9) blink; leds-gpio may override it */
|
||||
tps65010_set_led(LED1, BLINK);
|
||||
|
||||
/* Set LED2 off by default */
|
||||
tps65010_set_led(LED2, OFF);
|
||||
|
||||
/* Enable LOW_PWR handshake */
|
||||
tps65010_set_low_pwr(ON);
|
||||
|
||||
/* Switch VLDO2 to 3.0V for AIC23 */
|
||||
tps65010_config_vregs1(TPS_LDO2_ENABLE | TPS_VLDO2_3_0V
|
||||
| TPS_LDO1_ENABLE);
|
||||
|
||||
/* register these three LEDs */
|
||||
osk5912_tps_leds.dev.parent = &client->dev;
|
||||
platform_device_register(&osk5912_tps_leds);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct tps65010_board tps_board = {
|
||||
.base = OSK_TPS_GPIO_BASE,
|
||||
.outmask = 0x0f,
|
||||
.setup = osk_tps_setup,
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata osk_i2c_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("tps65010", 0x48),
|
||||
.type = "tps65010",
|
||||
.irq = OMAP_GPIO_IRQ(OMAP_MPUIO(1)),
|
||||
.platform_data = &tps_board,
|
||||
|
||||
},
|
||||
/* TODO when driver support is ready:
|
||||
* - aic23 audio chip at 0x1a
|
||||
|
|
@ -198,7 +268,7 @@ static struct i2c_board_info __initdata osk_i2c_board_info[] = {
|
|||
|
||||
static void __init osk_init_smc91x(void)
|
||||
{
|
||||
if ((omap_request_gpio(0)) < 0) {
|
||||
if ((gpio_request(0, "smc_irq")) < 0) {
|
||||
printk("Error requesting gpio 0 for smc91x irq\n");
|
||||
return;
|
||||
}
|
||||
|
|
@ -210,7 +280,7 @@ static void __init osk_init_smc91x(void)
|
|||
static void __init osk_init_cf(void)
|
||||
{
|
||||
omap_cfg_reg(M7_1610_GPIO62);
|
||||
if ((omap_request_gpio(62)) < 0) {
|
||||
if ((gpio_request(62, "cf_irq")) < 0) {
|
||||
printk("Error requesting gpio 62 for CF irq\n");
|
||||
return;
|
||||
}
|
||||
|
|
@ -334,7 +404,7 @@ static struct platform_device *mistral_devices[] __initdata = {
|
|||
|
||||
static int mistral_get_pendown_state(void)
|
||||
{
|
||||
return !omap_get_gpio_datain(4);
|
||||
return !gpio_get_value(4);
|
||||
}
|
||||
|
||||
static const struct ads7846_platform_data mistral_ts_info = {
|
||||
|
|
@ -396,25 +466,31 @@ static void __init osk_mistral_init(void)
|
|||
omap_cfg_reg(W14_1610_CCP_DATAP);
|
||||
|
||||
/* CAM_PWDN */
|
||||
if (omap_request_gpio(11) == 0) {
|
||||
if (gpio_request(11, "cam_pwdn") == 0) {
|
||||
omap_cfg_reg(N20_1610_GPIO11);
|
||||
omap_set_gpio_direction(11, 0 /* out */);
|
||||
omap_set_gpio_dataout(11, 0 /* off */);
|
||||
gpio_direction_output(11, 0);
|
||||
} else
|
||||
pr_debug("OSK+Mistral: CAM_PWDN is awol\n");
|
||||
|
||||
|
||||
/* omap_cfg_reg(P19_1610_GPIO6); */ /* BUSY */
|
||||
gpio_request(6, "ts_busy");
|
||||
gpio_direction_input(6);
|
||||
|
||||
omap_cfg_reg(P20_1610_GPIO4); /* PENIRQ */
|
||||
gpio_request(4, "ts_int");
|
||||
gpio_direction_input(4);
|
||||
set_irq_type(OMAP_GPIO_IRQ(4), IRQT_FALLING);
|
||||
|
||||
spi_register_board_info(mistral_boardinfo,
|
||||
ARRAY_SIZE(mistral_boardinfo));
|
||||
|
||||
/* the sideways button (SW1) is for use as a "wakeup" button */
|
||||
omap_cfg_reg(N15_1610_MPUIO2);
|
||||
if (omap_request_gpio(OMAP_MPUIO(2)) == 0) {
|
||||
if (gpio_request(OMAP_MPUIO(2), "wakeup") == 0) {
|
||||
int ret = 0;
|
||||
omap_set_gpio_direction(OMAP_MPUIO(2), 1);
|
||||
|
||||
gpio_direction_input(OMAP_MPUIO(2));
|
||||
set_irq_type(OMAP_GPIO_IRQ(OMAP_MPUIO(2)), IRQT_RISING);
|
||||
#ifdef CONFIG_PM
|
||||
/* share the IRQ in case someone wants to use the
|
||||
|
|
@ -425,7 +501,7 @@ static void __init osk_mistral_init(void)
|
|||
IRQF_SHARED, "mistral_wakeup",
|
||||
&osk_mistral_wake_interrupt);
|
||||
if (ret != 0) {
|
||||
omap_free_gpio(OMAP_MPUIO(2));
|
||||
gpio_free(OMAP_MPUIO(2));
|
||||
printk(KERN_ERR "OSK+Mistral: no wakeup irq, %d?\n",
|
||||
ret);
|
||||
} else
|
||||
|
|
@ -438,10 +514,8 @@ static void __init osk_mistral_init(void)
|
|||
* board, like the touchscreen, EEPROM, and wakeup (!) switch.
|
||||
*/
|
||||
omap_cfg_reg(PWL);
|
||||
if (omap_request_gpio(2) == 0) {
|
||||
omap_set_gpio_direction(2, 0 /* out */);
|
||||
omap_set_gpio_dataout(2, 1 /* on */);
|
||||
}
|
||||
if (gpio_request(2, "lcd_pwr") == 0)
|
||||
gpio_direction_output(2, 1);
|
||||
|
||||
platform_add_devices(mistral_devices, ARRAY_SIZE(mistral_devices));
|
||||
}
|
||||
|
|
@ -484,44 +558,6 @@ static void __init osk_map_io(void)
|
|||
omap1_map_common_io();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TPS65010
|
||||
static int __init osk_tps_init(void)
|
||||
{
|
||||
if (!machine_is_omap_osk())
|
||||
return 0;
|
||||
|
||||
/* Let LED1 (D9) blink */
|
||||
tps65010_set_led(LED1, BLINK);
|
||||
|
||||
/* Disable LED 2 (D2) */
|
||||
tps65010_set_led(LED2, OFF);
|
||||
|
||||
/* Set GPIO 1 HIGH to disable VBUS power supply;
|
||||
* OHCI driver powers it up/down as needed.
|
||||
*/
|
||||
tps65010_set_gpio_out_value(GPIO1, HIGH);
|
||||
|
||||
/* Set GPIO 2 low to turn on LED D3 */
|
||||
tps65010_set_gpio_out_value(GPIO2, HIGH);
|
||||
|
||||
/* Set GPIO 3 low to take ethernet out of reset */
|
||||
tps65010_set_gpio_out_value(GPIO3, LOW);
|
||||
|
||||
/* gpio4 for VDD_DSP */
|
||||
/* FIXME send power to DSP iff it's configured */
|
||||
|
||||
/* Enable LOW_PWR */
|
||||
tps65010_set_low_pwr(ON);
|
||||
|
||||
/* Switch VLDO2 to 3.0V for AIC23 */
|
||||
tps65010_config_vregs1(TPS_LDO2_ENABLE | TPS_VLDO2_3_0V
|
||||
| TPS_LDO1_ENABLE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
fs_initcall(osk_tps_init);
|
||||
#endif
|
||||
|
||||
MACHINE_START(OMAP_OSK, "TI-OSK")
|
||||
/* Maintainer: Dirk Behme <[email protected]> */
|
||||
.phys_io = 0xfff00000,
|
||||
|
|
|
|||
|
|
@ -1,11 +1,9 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap1/leds-osk.c
|
||||
*
|
||||
* LED driver for OSK, and optionally Mistral QVGA, boards
|
||||
* LED driver for OSK with optional Mistral QVGA board
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/i2c/tps65010.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/leds.h>
|
||||
|
|
@ -20,49 +18,11 @@
|
|||
#define LED_STATE_CLAIMED (1 << 1)
|
||||
static u8 led_state;
|
||||
|
||||
#define GREEN_LED (1 << 0) /* TPS65010 LED1 */
|
||||
#define AMBER_LED (1 << 1) /* TPS65010 LED2 */
|
||||
#define RED_LED (1 << 2) /* TPS65010 GPIO2 */
|
||||
#define TIMER_LED (1 << 3) /* Mistral board */
|
||||
#define IDLE_LED (1 << 4) /* Mistral board */
|
||||
static u8 hw_led_state;
|
||||
|
||||
|
||||
/* TPS65010 leds are changed using i2c -- from a task context.
|
||||
* Using one of these for the "idle" LED would be impractical...
|
||||
*/
|
||||
#define TPS_LEDS (GREEN_LED | RED_LED | AMBER_LED)
|
||||
|
||||
static u8 tps_leds_change;
|
||||
|
||||
static void tps_work(struct work_struct *unused)
|
||||
{
|
||||
for (;;) {
|
||||
u8 leds;
|
||||
|
||||
local_irq_disable();
|
||||
leds = tps_leds_change;
|
||||
tps_leds_change = 0;
|
||||
local_irq_enable();
|
||||
|
||||
if (!leds)
|
||||
break;
|
||||
|
||||
/* careful: the set_led() value is on/off/blink */
|
||||
if (leds & GREEN_LED)
|
||||
tps65010_set_led(LED1, !!(hw_led_state & GREEN_LED));
|
||||
if (leds & AMBER_LED)
|
||||
tps65010_set_led(LED2, !!(hw_led_state & AMBER_LED));
|
||||
|
||||
/* the gpio led doesn't have that issue */
|
||||
if (leds & RED_LED)
|
||||
tps65010_set_gpio_out_value(GPIO2,
|
||||
!(hw_led_state & RED_LED));
|
||||
}
|
||||
}
|
||||
|
||||
static DECLARE_WORK(work, tps_work);
|
||||
|
||||
#ifdef CONFIG_OMAP_OSK_MISTRAL
|
||||
|
||||
/* For now, all system indicators require the Mistral board, since that
|
||||
|
|
@ -112,7 +72,6 @@ void osk_leds_event(led_event_t evt)
|
|||
case led_stop:
|
||||
led_state &= ~LED_STATE_ENABLED;
|
||||
hw_led_state = 0;
|
||||
/* NOTE: work may still be pending!! */
|
||||
break;
|
||||
|
||||
case led_claim:
|
||||
|
|
@ -145,48 +104,11 @@ void osk_leds_event(led_event_t evt)
|
|||
|
||||
#endif /* CONFIG_OMAP_OSK_MISTRAL */
|
||||
|
||||
/* "green" == tps LED1 (leftmost, normally power-good)
|
||||
* works only with DC adapter, not on battery power!
|
||||
*/
|
||||
case led_green_on:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state |= GREEN_LED;
|
||||
break;
|
||||
case led_green_off:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state &= ~GREEN_LED;
|
||||
break;
|
||||
|
||||
/* "amber" == tps LED2 (middle) */
|
||||
case led_amber_on:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state |= AMBER_LED;
|
||||
break;
|
||||
case led_amber_off:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state &= ~AMBER_LED;
|
||||
break;
|
||||
|
||||
/* "red" == LED on tps gpio3 (rightmost) */
|
||||
case led_red_on:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state |= RED_LED;
|
||||
break;
|
||||
case led_red_off:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state &= ~RED_LED;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
leds ^= hw_led_state;
|
||||
leds &= TPS_LEDS;
|
||||
if (leds && (led_state & LED_STATE_CLAIMED)) {
|
||||
tps_leds_change |= leds;
|
||||
schedule_work(&work);
|
||||
}
|
||||
|
||||
done:
|
||||
local_irq_restore(flags);
|
||||
|
|
|
|||
|
|
@ -3,9 +3,9 @@
|
|||
*
|
||||
* OMAP1 pin multiplexing configurations
|
||||
*
|
||||
* Copyright (C) 2003 - 2005 Nokia Corporation
|
||||
* Copyright (C) 2003 - 2008 Nokia Corporation
|
||||
*
|
||||
* Written by Tony Lindgren <tony.lindgren@nokia.com>
|
||||
* Written by Tony Lindgren
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -32,8 +32,10 @@
|
|||
|
||||
#ifdef CONFIG_OMAP_MUX
|
||||
|
||||
static struct omap_mux_cfg arch_mux_cfg;
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP730
|
||||
struct pin_config __initdata_or_module omap730_pins[] = {
|
||||
static struct pin_config __initdata_or_module omap730_pins[] = {
|
||||
MUX_CFG_730("E2_730_KBR0", 12, 21, 0, 20, 1, 0)
|
||||
MUX_CFG_730("J7_730_KBR1", 12, 25, 0, 24, 1, 0)
|
||||
MUX_CFG_730("E1_730_KBR2", 12, 29, 0, 28, 1, 0)
|
||||
|
|
@ -49,10 +51,14 @@ MUX_CFG_730("AA17_730_USB_DM", 2, 21, 0, 20, 0, 0)
|
|||
MUX_CFG_730("W16_730_USB_PU_EN", 2, 25, 0, 24, 0, 0)
|
||||
MUX_CFG_730("W17_730_USB_VBUSI", 2, 29, 0, 28, 0, 0)
|
||||
};
|
||||
#endif
|
||||
#define OMAP730_PINS_SZ ARRAY_SIZE(omap730_pins)
|
||||
#else
|
||||
#define omap730_pins NULL
|
||||
#define OMAP730_PINS_SZ 0
|
||||
#endif /* CONFIG_ARCH_OMAP730 */
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX)
|
||||
struct pin_config __initdata_or_module omap1xxx_pins[] = {
|
||||
static struct pin_config __initdata_or_module omap1xxx_pins[] = {
|
||||
/*
|
||||
* description mux mode mux pull pull pull pu_pd pu dbg
|
||||
* reg offset mode reg bit ena reg
|
||||
|
|
@ -306,22 +312,136 @@ MUX_CFG("Y12_1610_CCP_CLKP", 8, 18, 6, 1, 24, 1, 1, 0, 0)
|
|||
MUX_CFG("W13_1610_CCP_CLKM", 9, 0, 6, 1, 28, 1, 1, 0, 0)
|
||||
MUX_CFG("W14_1610_CCP_DATAP", 9, 24, 6, 2, 4, 1, 2, 0, 0)
|
||||
MUX_CFG("Y14_1610_CCP_DATAM", 9, 21, 6, 2, 3, 1, 2, 0, 0)
|
||||
|
||||
};
|
||||
#define OMAP1XXX_PINS_SZ ARRAY_SIZE(omap1xxx_pins)
|
||||
#else
|
||||
#define omap1xxx_pins NULL
|
||||
#define OMAP1XXX_PINS_SZ 0
|
||||
#endif /* CONFIG_ARCH_OMAP15XX || CONFIG_ARCH_OMAP16XX */
|
||||
|
||||
int __init_or_module omap1_cfg_reg(const struct pin_config *cfg)
|
||||
{
|
||||
static DEFINE_SPINLOCK(mux_spin_lock);
|
||||
unsigned long flags;
|
||||
unsigned int reg_orig = 0, reg = 0, pu_pd_orig = 0, pu_pd = 0,
|
||||
pull_orig = 0, pull = 0;
|
||||
unsigned int mask, warn = 0;
|
||||
|
||||
/* Check the mux register in question */
|
||||
if (cfg->mux_reg) {
|
||||
unsigned tmp1, tmp2;
|
||||
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
reg_orig = omap_readl(cfg->mux_reg);
|
||||
|
||||
/* The mux registers always seem to be 3 bits long */
|
||||
mask = (0x7 << cfg->mask_offset);
|
||||
tmp1 = reg_orig & mask;
|
||||
reg = reg_orig & ~mask;
|
||||
|
||||
tmp2 = (cfg->mask << cfg->mask_offset);
|
||||
reg |= tmp2;
|
||||
|
||||
if (tmp1 != tmp2)
|
||||
warn = 1;
|
||||
|
||||
omap_writel(reg, cfg->mux_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
}
|
||||
|
||||
/* Check for pull up or pull down selection on 1610 */
|
||||
if (!cpu_is_omap15xx()) {
|
||||
if (cfg->pu_pd_reg && cfg->pull_val) {
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
pu_pd_orig = omap_readl(cfg->pu_pd_reg);
|
||||
mask = 1 << cfg->pull_bit;
|
||||
|
||||
if (cfg->pu_pd_val) {
|
||||
if (!(pu_pd_orig & mask))
|
||||
warn = 1;
|
||||
/* Use pull up */
|
||||
pu_pd = pu_pd_orig | mask;
|
||||
} else {
|
||||
if (pu_pd_orig & mask)
|
||||
warn = 1;
|
||||
/* Use pull down */
|
||||
pu_pd = pu_pd_orig & ~mask;
|
||||
}
|
||||
omap_writel(pu_pd, cfg->pu_pd_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check for an associated pull down register */
|
||||
if (cfg->pull_reg) {
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
pull_orig = omap_readl(cfg->pull_reg);
|
||||
mask = 1 << cfg->pull_bit;
|
||||
|
||||
if (cfg->pull_val) {
|
||||
if (pull_orig & mask)
|
||||
warn = 1;
|
||||
/* Low bit = pull enabled */
|
||||
pull = pull_orig & ~mask;
|
||||
} else {
|
||||
if (!(pull_orig & mask))
|
||||
warn = 1;
|
||||
/* High bit = pull disabled */
|
||||
pull = pull_orig | mask;
|
||||
}
|
||||
|
||||
omap_writel(pull, cfg->pull_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
}
|
||||
|
||||
if (warn) {
|
||||
#ifdef CONFIG_OMAP_MUX_WARNINGS
|
||||
printk(KERN_WARNING "MUX: initialized %s\n", cfg->name);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX_DEBUG
|
||||
if (cfg->debug || warn) {
|
||||
printk("MUX: Setting register %s\n", cfg->name);
|
||||
printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n",
|
||||
cfg->mux_reg_name, cfg->mux_reg, reg_orig, reg);
|
||||
|
||||
if (!cpu_is_omap15xx()) {
|
||||
if (cfg->pu_pd_reg && cfg->pull_val) {
|
||||
printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n",
|
||||
cfg->pu_pd_name, cfg->pu_pd_reg,
|
||||
pu_pd_orig, pu_pd);
|
||||
}
|
||||
}
|
||||
|
||||
if (cfg->pull_reg)
|
||||
printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n",
|
||||
cfg->pull_name, cfg->pull_reg, pull_orig, pull);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX_ERRORS
|
||||
return warn ? -ETXTBSY : 0;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
int __init omap1_mux_init(void)
|
||||
{
|
||||
if (cpu_is_omap730()) {
|
||||
arch_mux_cfg.pins = omap730_pins;
|
||||
arch_mux_cfg.size = OMAP730_PINS_SZ;
|
||||
arch_mux_cfg.cfg_reg = omap1_cfg_reg;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP730
|
||||
omap_mux_register(omap730_pins, ARRAY_SIZE(omap730_pins));
|
||||
#endif
|
||||
if (cpu_is_omap15xx() || cpu_is_omap16xx()) {
|
||||
arch_mux_cfg.pins = omap1xxx_pins;
|
||||
arch_mux_cfg.size = OMAP1XXX_PINS_SZ;
|
||||
arch_mux_cfg.cfg_reg = omap1_cfg_reg;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX)
|
||||
omap_mux_register(omap1xxx_pins, ARRAY_SIZE(omap1xxx_pins));
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
return omap_mux_register(&arch_mux_cfg);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -56,37 +56,6 @@
|
|||
#define OMAP_MPU_TIMER_BASE OMAP_MPU_TIMER1_BASE
|
||||
#define OMAP_MPU_TIMER_OFFSET 0x100
|
||||
|
||||
/* cycles to nsec conversions taken from arch/i386/kernel/timers/timer_tsc.c,
|
||||
* converted to use kHz by Kevin Hilman */
|
||||
/* convert from cycles(64bits) => nanoseconds (64bits)
|
||||
* basic equation:
|
||||
* ns = cycles / (freq / ns_per_sec)
|
||||
* ns = cycles * (ns_per_sec / freq)
|
||||
* ns = cycles * (10^9 / (cpu_khz * 10^3))
|
||||
* ns = cycles * (10^6 / cpu_khz)
|
||||
*
|
||||
* Then we use scaling math (suggested by george at mvista.com) to get:
|
||||
* ns = cycles * (10^6 * SC / cpu_khz / SC
|
||||
* ns = cycles * cyc2ns_scale / SC
|
||||
*
|
||||
* And since SC is a constant power of two, we can convert the div
|
||||
* into a shift.
|
||||
* -johnstul at us.ibm.com "math is hard, lets go shopping!"
|
||||
*/
|
||||
static unsigned long cyc2ns_scale;
|
||||
#define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */
|
||||
|
||||
static inline void set_cyc2ns_scale(unsigned long cpu_khz)
|
||||
{
|
||||
cyc2ns_scale = (1000000 << CYC2NS_SCALE_FACTOR)/cpu_khz;
|
||||
}
|
||||
|
||||
static inline unsigned long long cycles_2_ns(unsigned long long cyc)
|
||||
{
|
||||
return (cyc * cyc2ns_scale) >> CYC2NS_SCALE_FACTOR;
|
||||
}
|
||||
|
||||
|
||||
typedef struct {
|
||||
u32 cntl; /* CNTL_TIMER, R/W */
|
||||
u32 load_tim; /* LOAD_TIM, W */
|
||||
|
|
@ -194,8 +163,6 @@ static struct irqaction omap_mpu_timer1_irq = {
|
|||
|
||||
static __init void omap_init_mpu_timer(unsigned long rate)
|
||||
{
|
||||
set_cyc2ns_scale(rate / 1000);
|
||||
|
||||
setup_irq(INT_TIMER1, &omap_mpu_timer1_irq);
|
||||
omap_mpu_timer_start(0, (rate / HZ) - 1, 1);
|
||||
|
||||
|
|
@ -260,22 +227,6 @@ static void __init omap_init_clocksource(unsigned long rate)
|
|||
printk(err, clocksource_mpu.name);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Scheduler clock - returns current time in nanosec units.
|
||||
*/
|
||||
unsigned long long sched_clock(void)
|
||||
{
|
||||
unsigned long ticks = 0 - omap_mpu_timer_read(1);
|
||||
unsigned long long ticks64;
|
||||
|
||||
ticks64 = omap_mpu_timer2_overflows;
|
||||
ticks64 <<= 32;
|
||||
ticks64 |= ticks;
|
||||
|
||||
return cycles_2_ns(ticks64);
|
||||
}
|
||||
|
||||
/*
|
||||
* ---------------------------------------------------------------------------
|
||||
* Timer initialization
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/plat-omap/timer32k.c
|
||||
* linux/arch/arm/mach-omap1/timer32k.c
|
||||
*
|
||||
* OMAP 32K Timer
|
||||
*
|
||||
|
|
@ -70,8 +70,6 @@ struct sys_timer omap_timer;
|
|||
|
||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||
#define TIMER_32K_SYNCHRONIZED 0xfffbc410
|
||||
#elif defined(CONFIG_ARCH_OMAP24XX)
|
||||
#define TIMER_32K_SYNCHRONIZED (OMAP24XX_32KSYNCT_BASE + 0x10)
|
||||
#else
|
||||
#error OMAP 32KHz timer does not currently work on 15XX!
|
||||
#endif
|
||||
|
|
@ -93,8 +91,6 @@ struct sys_timer omap_timer;
|
|||
#define JIFFIES_TO_HW_TICKS(nr_jiffies, clock_rate) \
|
||||
(((nr_jiffies) * (clock_rate)) / HZ)
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP1)
|
||||
|
||||
static inline void omap_32k_timer_write(int val, int reg)
|
||||
{
|
||||
omap_writew(val, OMAP1_32K_TIMER_BASE + reg);
|
||||
|
|
@ -120,30 +116,14 @@ static inline void omap_32k_timer_stop(void)
|
|||
|
||||
#define omap_32k_timer_ack_irq()
|
||||
|
||||
#elif defined(CONFIG_ARCH_OMAP2)
|
||||
|
||||
static struct omap_dm_timer *gptimer;
|
||||
|
||||
static inline void omap_32k_timer_start(unsigned long load_val)
|
||||
static int omap_32k_timer_set_next_event(unsigned long delta,
|
||||
struct clock_event_device *dev)
|
||||
{
|
||||
omap_dm_timer_set_load(gptimer, 1, 0xffffffff - load_val);
|
||||
omap_dm_timer_set_int_enable(gptimer, OMAP_TIMER_INT_OVERFLOW);
|
||||
omap_dm_timer_start(gptimer);
|
||||
}
|
||||
omap_32k_timer_start(delta);
|
||||
|
||||
static inline void omap_32k_timer_stop(void)
|
||||
{
|
||||
omap_dm_timer_stop(gptimer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void omap_32k_timer_ack_irq(void)
|
||||
{
|
||||
u32 status = omap_dm_timer_read_status(gptimer);
|
||||
omap_dm_timer_write_status(gptimer, status);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static void omap_32k_timer_set_mode(enum clock_event_mode mode,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
|
|
@ -164,8 +144,9 @@ static void omap_32k_timer_set_mode(enum clock_event_mode mode,
|
|||
|
||||
static struct clock_event_device clockevent_32k_timer = {
|
||||
.name = "32k-timer",
|
||||
.features = CLOCK_EVT_FEAT_PERIODIC,
|
||||
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
|
||||
.shift = 32,
|
||||
.set_next_event = omap_32k_timer_set_next_event,
|
||||
.set_mode = omap_32k_timer_set_mode,
|
||||
};
|
||||
|
||||
|
|
@ -178,32 +159,6 @@ static inline unsigned long omap_32k_sync_timer_read(void)
|
|||
return omap_readl(TIMER_32K_SYNCHRONIZED);
|
||||
}
|
||||
|
||||
/*
|
||||
* Rounds down to nearest usec. Note that this will overflow for larger values.
|
||||
*/
|
||||
static inline unsigned long omap_32k_ticks_to_usecs(unsigned long ticks_32k)
|
||||
{
|
||||
return (ticks_32k * 5*5*5*5*5*5) >> 9;
|
||||
}
|
||||
|
||||
/*
|
||||
* Rounds down to nearest nsec.
|
||||
*/
|
||||
static inline unsigned long long
|
||||
omap_32k_ticks_to_nsecs(unsigned long ticks_32k)
|
||||
{
|
||||
return (unsigned long long) ticks_32k * 1000 * 5*5*5*5*5*5 >> 9;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns current time from boot in nsecs. It's OK for this to wrap
|
||||
* around for now, as it's just a relative time stamp.
|
||||
*/
|
||||
unsigned long long sched_clock(void)
|
||||
{
|
||||
return omap_32k_ticks_to_nsecs(omap_32k_sync_timer_read());
|
||||
}
|
||||
|
||||
static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct clock_event_device *evt = &clockevent_32k_timer;
|
||||
|
|
@ -222,22 +177,7 @@ static struct irqaction omap_32k_timer_irq = {
|
|||
|
||||
static __init void omap_init_32k_timer(void)
|
||||
{
|
||||
if (cpu_class_is_omap1())
|
||||
setup_irq(INT_OS_TIMER, &omap_32k_timer_irq);
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP2
|
||||
/* REVISIT: Check 24xx TIOCP_CFG settings after idle works */
|
||||
if (cpu_is_omap24xx()) {
|
||||
gptimer = omap_dm_timer_request_specific(1);
|
||||
BUG_ON(gptimer == NULL);
|
||||
|
||||
omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_32_KHZ);
|
||||
setup_irq(omap_dm_timer_get_irq(gptimer), &omap_32k_timer_irq);
|
||||
omap_dm_timer_set_int_enable(gptimer,
|
||||
OMAP_TIMER_INT_CAPTURE | OMAP_TIMER_INT_OVERFLOW |
|
||||
OMAP_TIMER_INT_MATCH);
|
||||
}
|
||||
#endif
|
||||
setup_irq(INT_OS_TIMER, &omap_32k_timer_irq);
|
||||
|
||||
clockevent_32k_timer.mult = div_sc(OMAP_32K_TICKS_PER_SEC,
|
||||
NSEC_PER_SEC,
|
||||
|
|
@ -3,13 +3,15 @@
|
|||
#
|
||||
|
||||
# Common support
|
||||
obj-y := irq.o id.o io.o sram-fn.o memory.o prcm.o clock.o mux.o devices.o \
|
||||
serial.o gpmc.o
|
||||
|
||||
obj-$(CONFIG_OMAP_MPU_TIMER) += timer-gp.o
|
||||
obj-y := irq.o id.o io.o sram-fn.o memory.o control.o prcm.o clock.o mux.o \
|
||||
devices.o serial.o gpmc.o timer-gp.o
|
||||
|
||||
# Power Management
|
||||
obj-$(CONFIG_PM) += pm.o pm-domain.o sleep.o
|
||||
obj-$(CONFIG_PM) += pm.o sleep.o
|
||||
|
||||
# Clock framework
|
||||
obj-$(CONFIG_ARCH_OMAP2) += clock24xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += clock34xx.o
|
||||
|
||||
# Specific board support
|
||||
obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o
|
||||
|
|
|
|||
|
|
@ -33,7 +33,6 @@
|
|||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/common.h>
|
||||
#include <asm/arch/gpmc.h>
|
||||
#include "prcm-regs.h"
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
|
|
@ -125,15 +124,18 @@ static inline void __init sdp2430_init_smc91x(void)
|
|||
int eth_cs;
|
||||
unsigned long cs_mem_base;
|
||||
unsigned int rate;
|
||||
struct clk *l3ck;
|
||||
struct clk *gpmc_fck;
|
||||
|
||||
eth_cs = SDP2430_SMC91X_CS;
|
||||
|
||||
l3ck = clk_get(NULL, "core_l3_ck");
|
||||
if (IS_ERR(l3ck))
|
||||
rate = 100000000;
|
||||
else
|
||||
rate = clk_get_rate(l3ck);
|
||||
gpmc_fck = clk_get(NULL, "gpmc_fck"); /* Always on ENABLE_ON_INIT */
|
||||
if (IS_ERR(gpmc_fck)) {
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
|
||||
clk_enable(gpmc_fck);
|
||||
rate = clk_get_rate(gpmc_fck);
|
||||
|
||||
/* Make sure CS1 timings are correct, for 2430 always muxed */
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG1, 0x00011200);
|
||||
|
|
@ -160,7 +162,7 @@ static inline void __init sdp2430_init_smc91x(void)
|
|||
|
||||
if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
|
||||
printk(KERN_ERR "Failed to request GPMC mem for smc91x\n");
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
|
||||
sdp2430_smc91x_resources[0].start = cs_mem_base + 0x300;
|
||||
|
|
@ -171,10 +173,13 @@ static inline void __init sdp2430_init_smc91x(void)
|
|||
printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n",
|
||||
OMAP24XX_ETHR_GPIO_IRQ);
|
||||
gpmc_cs_free(eth_cs);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
omap_set_gpio_direction(OMAP24XX_ETHR_GPIO_IRQ, 1);
|
||||
|
||||
out:
|
||||
clk_disable(gpmc_fck);
|
||||
clk_put(gpmc_fck);
|
||||
}
|
||||
|
||||
static void __init omap_2430sdp_init_irq(void)
|
||||
|
|
|
|||
|
|
@ -26,6 +26,8 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
|
@ -39,7 +41,7 @@
|
|||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/common.h>
|
||||
#include <asm/arch/gpmc.h>
|
||||
#include "prcm-regs.h"
|
||||
#include <asm/arch/control.h>
|
||||
|
||||
/* LED & Switch macros */
|
||||
#define LED0_GPIO13 13
|
||||
|
|
@ -187,17 +189,47 @@ static inline void __init apollon_init_smc91x(void)
|
|||
{
|
||||
unsigned long base;
|
||||
|
||||
unsigned int rate;
|
||||
struct clk *gpmc_fck;
|
||||
int eth_cs;
|
||||
|
||||
gpmc_fck = clk_get(NULL, "gpmc_fck"); /* Always on ENABLE_ON_INIT */
|
||||
if (IS_ERR(gpmc_fck)) {
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
|
||||
clk_enable(gpmc_fck);
|
||||
rate = clk_get_rate(gpmc_fck);
|
||||
|
||||
eth_cs = APOLLON_ETH_CS;
|
||||
|
||||
/* Make sure CS1 timings are correct */
|
||||
GPMC_CONFIG1_1 = 0x00011203;
|
||||
GPMC_CONFIG2_1 = 0x001f1f01;
|
||||
GPMC_CONFIG3_1 = 0x00080803;
|
||||
GPMC_CONFIG4_1 = 0x1c091c09;
|
||||
GPMC_CONFIG5_1 = 0x041f1f1f;
|
||||
GPMC_CONFIG6_1 = 0x000004c4;
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG1, 0x00011200);
|
||||
|
||||
if (rate >= 160000000) {
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f01);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080803);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1c0b1c0a);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x041f1F1F);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000004C4);
|
||||
} else if (rate >= 130000000) {
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f00);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080802);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1C091C09);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x041f1F1F);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000004C4);
|
||||
} else {/* rate = 100000000 */
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f00);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080802);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1C091C09);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x031A1F1F);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000003C2);
|
||||
}
|
||||
|
||||
if (gpmc_cs_request(APOLLON_ETH_CS, SZ_16M, &base) < 0) {
|
||||
printk(KERN_ERR "Failed to request GPMC CS for smc91x\n");
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
apollon_smc91x_resources[0].start = base + 0x300;
|
||||
apollon_smc91x_resources[0].end = base + 0x30f;
|
||||
|
|
@ -208,9 +240,13 @@ static inline void __init apollon_init_smc91x(void)
|
|||
printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n",
|
||||
APOLLON_ETHR_GPIO_IRQ);
|
||||
gpmc_cs_free(APOLLON_ETH_CS);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
omap_set_gpio_direction(APOLLON_ETHR_GPIO_IRQ, 1);
|
||||
|
||||
out:
|
||||
clk_disable(gpmc_fck);
|
||||
clk_put(gpmc_fck);
|
||||
}
|
||||
|
||||
static void __init omap_apollon_init_irq(void)
|
||||
|
|
@ -330,6 +366,8 @@ static void __init apollon_usb_init(void)
|
|||
|
||||
static void __init omap_apollon_init(void)
|
||||
{
|
||||
u32 v;
|
||||
|
||||
apollon_led_init();
|
||||
apollon_sw_init();
|
||||
apollon_flash_init();
|
||||
|
|
@ -339,7 +377,9 @@ static void __init omap_apollon_init(void)
|
|||
omap_cfg_reg(W19_24XX_SYS_NIRQ);
|
||||
|
||||
/* Use Interal loop-back in MMC/SDIO Module Input Clock selection */
|
||||
CONTROL_DEVCONF |= (1 << 24);
|
||||
v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
|
||||
v |= (1 << 24);
|
||||
omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0);
|
||||
|
||||
/*
|
||||
* Make sure the serial ports are muxed on at this point.
|
||||
|
|
|
|||
|
|
@ -19,6 +19,8 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
|
@ -26,6 +28,7 @@
|
|||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/flash.h>
|
||||
|
||||
#include <asm/arch/control.h>
|
||||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/gpioexpander.h>
|
||||
#include <asm/arch/mux.h>
|
||||
|
|
@ -36,10 +39,13 @@
|
|||
#include <asm/arch/keypad.h>
|
||||
#include <asm/arch/menelaus.h>
|
||||
#include <asm/arch/dma.h>
|
||||
#include "prcm-regs.h"
|
||||
#include <asm/arch/gpmc.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#define H4_FLASH_CS 0
|
||||
#define H4_SMC91X_CS 1
|
||||
|
||||
static unsigned int row_gpios[6] = { 88, 89, 124, 11, 6, 96 };
|
||||
static unsigned int col_gpios[7] = { 90, 91, 100, 36, 12, 97, 98 };
|
||||
|
||||
|
|
@ -116,8 +122,6 @@ static struct flash_platform_data h4_flash_data = {
|
|||
};
|
||||
|
||||
static struct resource h4_flash_resource = {
|
||||
.start = H4_CS0_BASE,
|
||||
.end = H4_CS0_BASE + SZ_64M - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
|
|
@ -253,21 +257,107 @@ static struct platform_device *h4_devices[] __initdata = {
|
|||
&h4_lcd_device,
|
||||
};
|
||||
|
||||
/* 2420 Sysboot setup (2430 is different) */
|
||||
static u32 get_sysboot_value(void)
|
||||
{
|
||||
return (omap_ctrl_readl(OMAP24XX_CONTROL_STATUS) &
|
||||
(OMAP2_SYSBOOT_5_MASK | OMAP2_SYSBOOT_4_MASK |
|
||||
OMAP2_SYSBOOT_3_MASK | OMAP2_SYSBOOT_2_MASK |
|
||||
OMAP2_SYSBOOT_1_MASK | OMAP2_SYSBOOT_0_MASK));
|
||||
}
|
||||
|
||||
/* H4-2420's always used muxed mode, H4-2422's always use non-muxed
|
||||
*
|
||||
* Note: OMAP-GIT doesn't correctly do is_cpu_omap2422 and is_cpu_omap2423
|
||||
* correctly. The macro needs to look at production_id not just hawkeye.
|
||||
*/
|
||||
static u32 is_gpmc_muxed(void)
|
||||
{
|
||||
u32 mux;
|
||||
mux = get_sysboot_value();
|
||||
if ((mux & 0xF) == 0xd)
|
||||
return 1; /* NAND config (could be either) */
|
||||
if (mux & 0x2) /* if mux'ed */
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void __init h4_init_debug(void)
|
||||
{
|
||||
int eth_cs;
|
||||
unsigned long cs_mem_base;
|
||||
unsigned int muxed, rate;
|
||||
struct clk *gpmc_fck;
|
||||
|
||||
eth_cs = H4_SMC91X_CS;
|
||||
|
||||
gpmc_fck = clk_get(NULL, "gpmc_fck"); /* Always on ENABLE_ON_INIT */
|
||||
if (IS_ERR(gpmc_fck)) {
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
|
||||
clk_enable(gpmc_fck);
|
||||
rate = clk_get_rate(gpmc_fck);
|
||||
clk_disable(gpmc_fck);
|
||||
clk_put(gpmc_fck);
|
||||
|
||||
if (is_gpmc_muxed())
|
||||
muxed = 0x200;
|
||||
else
|
||||
muxed = 0;
|
||||
|
||||
/* Make sure CS1 timings are correct */
|
||||
GPMC_CONFIG1_1 = 0x00011200;
|
||||
GPMC_CONFIG2_1 = 0x001f1f01;
|
||||
GPMC_CONFIG3_1 = 0x00080803;
|
||||
GPMC_CONFIG4_1 = 0x1c091c09;
|
||||
GPMC_CONFIG5_1 = 0x041f1f1f;
|
||||
GPMC_CONFIG6_1 = 0x000004c4;
|
||||
GPMC_CONFIG7_1 = 0x00000f40 | (0x08000000 >> 24);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG1,
|
||||
0x00011000 | muxed);
|
||||
|
||||
if (rate >= 160000000) {
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f01);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080803);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1c0b1c0a);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x041f1F1F);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000004C4);
|
||||
} else if (rate >= 130000000) {
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f00);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080802);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1C091C09);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x041f1F1F);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000004C4);
|
||||
} else {/* rate = 100000000 */
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f00);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080802);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1C091C09);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x031A1F1F);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000003C2);
|
||||
}
|
||||
|
||||
if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
|
||||
printk(KERN_ERR "Failed to request GPMC mem for smc91x\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
udelay(100);
|
||||
|
||||
omap_cfg_reg(M15_24XX_GPIO92);
|
||||
if (debug_card_init(cs_mem_base, OMAP24XX_ETHR_GPIO_IRQ) < 0)
|
||||
gpmc_cs_free(eth_cs);
|
||||
|
||||
out:
|
||||
clk_disable(gpmc_fck);
|
||||
clk_put(gpmc_fck);
|
||||
}
|
||||
|
||||
static void __init h4_init_flash(void)
|
||||
{
|
||||
unsigned long base;
|
||||
|
||||
if (gpmc_cs_request(H4_FLASH_CS, SZ_64M, &base) < 0) {
|
||||
printk("Can't request GPMC CS for flash\n");
|
||||
return;
|
||||
}
|
||||
h4_flash_resource.start = base;
|
||||
h4_flash_resource.end = base + SZ_64M - 1;
|
||||
}
|
||||
|
||||
static void __init omap_h4_init_irq(void)
|
||||
|
|
@ -275,6 +365,7 @@ static void __init omap_h4_init_irq(void)
|
|||
omap2_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap_gpio_init();
|
||||
h4_init_flash();
|
||||
}
|
||||
|
||||
static struct omap_uart_config h4_uart_config __initdata = {
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
539
arch/arm/mach-omap2/clock24xx.c
Normal file
539
arch/arm/mach-omap2/clock24xx.c
Normal file
|
|
@ -0,0 +1,539 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap2/clock.c
|
||||
*
|
||||
* Copyright (C) 2005-2008 Texas Instruments, Inc.
|
||||
* Copyright (C) 2004-2008 Nokia Corporation
|
||||
*
|
||||
* Contacts:
|
||||
* Richard Woodruff <r-woodruff2@ti.com>
|
||||
* Paul Walmsley
|
||||
*
|
||||
* Based on earlier work by Tuukka Tikkanen, Tony Lindgren,
|
||||
* Gordon McNutt and RidgeRun, Inc.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/cpufreq.h>
|
||||
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/sram.h>
|
||||
#include <asm/div64.h>
|
||||
#include <asm/bitops.h>
|
||||
|
||||
#include "memory.h"
|
||||
#include "clock.h"
|
||||
#include "clock24xx.h"
|
||||
#include "prm.h"
|
||||
#include "prm-regbits-24xx.h"
|
||||
#include "cm.h"
|
||||
#include "cm-regbits-24xx.h"
|
||||
|
||||
/* CM_CLKEN_PLL.EN_{54,96}M_PLL options (24XX) */
|
||||
#define EN_APLL_STOPPED 0
|
||||
#define EN_APLL_LOCKED 3
|
||||
|
||||
/* CM_CLKSEL1_PLL.APLLS_CLKIN options (24XX) */
|
||||
#define APLLS_CLKIN_19_2MHZ 0
|
||||
#define APLLS_CLKIN_13MHZ 2
|
||||
#define APLLS_CLKIN_12MHZ 3
|
||||
|
||||
/* #define DOWN_VARIABLE_DPLL 1 */ /* Experimental */
|
||||
|
||||
static struct prcm_config *curr_prcm_set;
|
||||
static struct clk *vclk;
|
||||
static struct clk *sclk;
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Omap24xx specific clock functions
|
||||
*-------------------------------------------------------------------------*/
|
||||
|
||||
/* This actually returns the rate of core_ck, not dpll_ck. */
|
||||
static u32 omap2_get_dpll_rate_24xx(struct clk *tclk)
|
||||
{
|
||||
long long dpll_clk;
|
||||
u8 amult;
|
||||
|
||||
dpll_clk = omap2_get_dpll_rate(tclk);
|
||||
|
||||
amult = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
|
||||
amult &= OMAP24XX_CORE_CLK_SRC_MASK;
|
||||
dpll_clk *= amult;
|
||||
|
||||
return dpll_clk;
|
||||
}
|
||||
|
||||
static int omap2_enable_osc_ck(struct clk *clk)
|
||||
{
|
||||
u32 pcc;
|
||||
|
||||
pcc = __raw_readl(OMAP24XX_PRCM_CLKSRC_CTRL);
|
||||
|
||||
__raw_writel(pcc & ~OMAP_AUTOEXTCLKMODE_MASK,
|
||||
OMAP24XX_PRCM_CLKSRC_CTRL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void omap2_disable_osc_ck(struct clk *clk)
|
||||
{
|
||||
u32 pcc;
|
||||
|
||||
pcc = __raw_readl(OMAP24XX_PRCM_CLKSRC_CTRL);
|
||||
|
||||
__raw_writel(pcc | OMAP_AUTOEXTCLKMODE_MASK,
|
||||
OMAP24XX_PRCM_CLKSRC_CTRL);
|
||||
}
|
||||
|
||||
#ifdef OLD_CK
|
||||
/* Recalculate SYST_CLK */
|
||||
static void omap2_sys_clk_recalc(struct clk * clk)
|
||||
{
|
||||
u32 div = PRCM_CLKSRC_CTRL;
|
||||
div &= (1 << 7) | (1 << 6); /* Test if ext clk divided by 1 or 2 */
|
||||
div >>= clk->rate_offset;
|
||||
clk->rate = (clk->parent->rate / div);
|
||||
propagate_rate(clk);
|
||||
}
|
||||
#endif /* OLD_CK */
|
||||
|
||||
/* Enable an APLL if off */
|
||||
static int omap2_clk_fixed_enable(struct clk *clk)
|
||||
{
|
||||
u32 cval, apll_mask;
|
||||
|
||||
apll_mask = EN_APLL_LOCKED << clk->enable_bit;
|
||||
|
||||
cval = cm_read_mod_reg(PLL_MOD, CM_CLKEN);
|
||||
|
||||
if ((cval & apll_mask) == apll_mask)
|
||||
return 0; /* apll already enabled */
|
||||
|
||||
cval &= ~apll_mask;
|
||||
cval |= apll_mask;
|
||||
cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN);
|
||||
|
||||
if (clk == &apll96_ck)
|
||||
cval = OMAP24XX_ST_96M_APLL;
|
||||
else if (clk == &apll54_ck)
|
||||
cval = OMAP24XX_ST_54M_APLL;
|
||||
|
||||
omap2_wait_clock_ready(OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), cval,
|
||||
clk->name);
|
||||
|
||||
/*
|
||||
* REVISIT: Should we return an error code if omap2_wait_clock_ready()
|
||||
* fails?
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Stop APLL */
|
||||
static void omap2_clk_fixed_disable(struct clk *clk)
|
||||
{
|
||||
u32 cval;
|
||||
|
||||
cval = cm_read_mod_reg(PLL_MOD, CM_CLKEN);
|
||||
cval &= ~(EN_APLL_LOCKED << clk->enable_bit);
|
||||
cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN);
|
||||
}
|
||||
|
||||
/*
|
||||
* Uses the current prcm set to tell if a rate is valid.
|
||||
* You can go slower, but not faster within a given rate set.
|
||||
*/
|
||||
static u32 omap2_dpll_round_rate(unsigned long target_rate)
|
||||
{
|
||||
u32 high, low, core_clk_src;
|
||||
|
||||
core_clk_src = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
|
||||
core_clk_src &= OMAP24XX_CORE_CLK_SRC_MASK;
|
||||
|
||||
if (core_clk_src == CORE_CLK_SRC_DPLL) { /* DPLL clockout */
|
||||
high = curr_prcm_set->dpll_speed * 2;
|
||||
low = curr_prcm_set->dpll_speed;
|
||||
} else { /* DPLL clockout x 2 */
|
||||
high = curr_prcm_set->dpll_speed;
|
||||
low = curr_prcm_set->dpll_speed / 2;
|
||||
}
|
||||
|
||||
#ifdef DOWN_VARIABLE_DPLL
|
||||
if (target_rate > high)
|
||||
return high;
|
||||
else
|
||||
return target_rate;
|
||||
#else
|
||||
if (target_rate > low)
|
||||
return high;
|
||||
else
|
||||
return low;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
static void omap2_dpll_recalc(struct clk *clk)
|
||||
{
|
||||
clk->rate = omap2_get_dpll_rate_24xx(clk);
|
||||
|
||||
propagate_rate(clk);
|
||||
}
|
||||
|
||||
static int omap2_reprogram_dpll(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
u32 cur_rate, low, mult, div, valid_rate, done_rate;
|
||||
u32 bypass = 0;
|
||||
struct prcm_config tmpset;
|
||||
const struct dpll_data *dd;
|
||||
unsigned long flags;
|
||||
int ret = -EINVAL;
|
||||
|
||||
local_irq_save(flags);
|
||||
cur_rate = omap2_get_dpll_rate_24xx(&dpll_ck);
|
||||
mult = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
|
||||
mult &= OMAP24XX_CORE_CLK_SRC_MASK;
|
||||
|
||||
if ((rate == (cur_rate / 2)) && (mult == 2)) {
|
||||
omap2_reprogram_sdrc(CORE_CLK_SRC_DPLL, 1);
|
||||
} else if ((rate == (cur_rate * 2)) && (mult == 1)) {
|
||||
omap2_reprogram_sdrc(CORE_CLK_SRC_DPLL_X2, 1);
|
||||
} else if (rate != cur_rate) {
|
||||
valid_rate = omap2_dpll_round_rate(rate);
|
||||
if (valid_rate != rate)
|
||||
goto dpll_exit;
|
||||
|
||||
if (mult == 1)
|
||||
low = curr_prcm_set->dpll_speed;
|
||||
else
|
||||
low = curr_prcm_set->dpll_speed / 2;
|
||||
|
||||
dd = clk->dpll_data;
|
||||
if (!dd)
|
||||
goto dpll_exit;
|
||||
|
||||
tmpset.cm_clksel1_pll = __raw_readl(dd->mult_div1_reg);
|
||||
tmpset.cm_clksel1_pll &= ~(dd->mult_mask |
|
||||
dd->div1_mask);
|
||||
div = ((curr_prcm_set->xtal_speed / 1000000) - 1);
|
||||
tmpset.cm_clksel2_pll = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
|
||||
tmpset.cm_clksel2_pll &= ~OMAP24XX_CORE_CLK_SRC_MASK;
|
||||
if (rate > low) {
|
||||
tmpset.cm_clksel2_pll |= CORE_CLK_SRC_DPLL_X2;
|
||||
mult = ((rate / 2) / 1000000);
|
||||
done_rate = CORE_CLK_SRC_DPLL_X2;
|
||||
} else {
|
||||
tmpset.cm_clksel2_pll |= CORE_CLK_SRC_DPLL;
|
||||
mult = (rate / 1000000);
|
||||
done_rate = CORE_CLK_SRC_DPLL;
|
||||
}
|
||||
tmpset.cm_clksel1_pll |= (div << __ffs(dd->mult_mask));
|
||||
tmpset.cm_clksel1_pll |= (mult << __ffs(dd->div1_mask));
|
||||
|
||||
/* Worst case */
|
||||
tmpset.base_sdrc_rfr = SDRC_RFR_CTRL_BYPASS;
|
||||
|
||||
if (rate == curr_prcm_set->xtal_speed) /* If asking for 1-1 */
|
||||
bypass = 1;
|
||||
|
||||
omap2_reprogram_sdrc(CORE_CLK_SRC_DPLL_X2, 1); /* For init_mem */
|
||||
|
||||
/* Force dll lock mode */
|
||||
omap2_set_prcm(tmpset.cm_clksel1_pll, tmpset.base_sdrc_rfr,
|
||||
bypass);
|
||||
|
||||
/* Errata: ret dll entry state */
|
||||
omap2_init_memory_params(omap2_dll_force_needed());
|
||||
omap2_reprogram_sdrc(done_rate, 0);
|
||||
}
|
||||
omap2_dpll_recalc(&dpll_ck);
|
||||
ret = 0;
|
||||
|
||||
dpll_exit:
|
||||
local_irq_restore(flags);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
/**
|
||||
* omap2_table_mpu_recalc - just return the MPU speed
|
||||
* @clk: virt_prcm_set struct clk
|
||||
*
|
||||
* Set virt_prcm_set's rate to the mpu_speed field of the current PRCM set.
|
||||
*/
|
||||
static void omap2_table_mpu_recalc(struct clk *clk)
|
||||
{
|
||||
clk->rate = curr_prcm_set->mpu_speed;
|
||||
}
|
||||
|
||||
/*
|
||||
* Look for a rate equal or less than the target rate given a configuration set.
|
||||
*
|
||||
* What's not entirely clear is "which" field represents the key field.
|
||||
* Some might argue L3-DDR, others ARM, others IVA. This code is simple and
|
||||
* just uses the ARM rates.
|
||||
*/
|
||||
static long omap2_round_to_table_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
struct prcm_config *ptr;
|
||||
long highest_rate;
|
||||
|
||||
if (clk != &virt_prcm_set)
|
||||
return -EINVAL;
|
||||
|
||||
highest_rate = -EINVAL;
|
||||
|
||||
for (ptr = rate_table; ptr->mpu_speed; ptr++) {
|
||||
if (!(ptr->flags & cpu_mask))
|
||||
continue;
|
||||
if (ptr->xtal_speed != sys_ck.rate)
|
||||
continue;
|
||||
|
||||
highest_rate = ptr->mpu_speed;
|
||||
|
||||
/* Can check only after xtal frequency check */
|
||||
if (ptr->mpu_speed <= rate)
|
||||
break;
|
||||
}
|
||||
return highest_rate;
|
||||
}
|
||||
|
||||
/* Sets basic clocks based on the specified rate */
|
||||
static int omap2_select_table_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
u32 cur_rate, done_rate, bypass = 0, tmp;
|
||||
struct prcm_config *prcm;
|
||||
unsigned long found_speed = 0;
|
||||
unsigned long flags;
|
||||
|
||||
if (clk != &virt_prcm_set)
|
||||
return -EINVAL;
|
||||
|
||||
for (prcm = rate_table; prcm->mpu_speed; prcm++) {
|
||||
if (!(prcm->flags & cpu_mask))
|
||||
continue;
|
||||
|
||||
if (prcm->xtal_speed != sys_ck.rate)
|
||||
continue;
|
||||
|
||||
if (prcm->mpu_speed <= rate) {
|
||||
found_speed = prcm->mpu_speed;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found_speed) {
|
||||
printk(KERN_INFO "Could not set MPU rate to %luMHz\n",
|
||||
rate / 1000000);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
curr_prcm_set = prcm;
|
||||
cur_rate = omap2_get_dpll_rate_24xx(&dpll_ck);
|
||||
|
||||
if (prcm->dpll_speed == cur_rate / 2) {
|
||||
omap2_reprogram_sdrc(CORE_CLK_SRC_DPLL, 1);
|
||||
} else if (prcm->dpll_speed == cur_rate * 2) {
|
||||
omap2_reprogram_sdrc(CORE_CLK_SRC_DPLL_X2, 1);
|
||||
} else if (prcm->dpll_speed != cur_rate) {
|
||||
local_irq_save(flags);
|
||||
|
||||
if (prcm->dpll_speed == prcm->xtal_speed)
|
||||
bypass = 1;
|
||||
|
||||
if ((prcm->cm_clksel2_pll & OMAP24XX_CORE_CLK_SRC_MASK) ==
|
||||
CORE_CLK_SRC_DPLL_X2)
|
||||
done_rate = CORE_CLK_SRC_DPLL_X2;
|
||||
else
|
||||
done_rate = CORE_CLK_SRC_DPLL;
|
||||
|
||||
/* MPU divider */
|
||||
cm_write_mod_reg(prcm->cm_clksel_mpu, MPU_MOD, CM_CLKSEL);
|
||||
|
||||
/* dsp + iva1 div(2420), iva2.1(2430) */
|
||||
cm_write_mod_reg(prcm->cm_clksel_dsp,
|
||||
OMAP24XX_DSP_MOD, CM_CLKSEL);
|
||||
|
||||
cm_write_mod_reg(prcm->cm_clksel_gfx, GFX_MOD, CM_CLKSEL);
|
||||
|
||||
/* Major subsystem dividers */
|
||||
tmp = cm_read_mod_reg(CORE_MOD, CM_CLKSEL1) & OMAP24XX_CLKSEL_DSS2_MASK;
|
||||
cm_write_mod_reg(prcm->cm_clksel1_core | tmp, CORE_MOD, CM_CLKSEL1);
|
||||
if (cpu_is_omap2430())
|
||||
cm_write_mod_reg(prcm->cm_clksel_mdm,
|
||||
OMAP2430_MDM_MOD, CM_CLKSEL);
|
||||
|
||||
/* x2 to enter init_mem */
|
||||
omap2_reprogram_sdrc(CORE_CLK_SRC_DPLL_X2, 1);
|
||||
|
||||
omap2_set_prcm(prcm->cm_clksel1_pll, prcm->base_sdrc_rfr,
|
||||
bypass);
|
||||
|
||||
omap2_init_memory_params(omap2_dll_force_needed());
|
||||
omap2_reprogram_sdrc(done_rate, 0);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
omap2_dpll_recalc(&dpll_ck);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct clk_functions omap2_clk_functions = {
|
||||
.clk_enable = omap2_clk_enable,
|
||||
.clk_disable = omap2_clk_disable,
|
||||
.clk_round_rate = omap2_clk_round_rate,
|
||||
.clk_set_rate = omap2_clk_set_rate,
|
||||
.clk_set_parent = omap2_clk_set_parent,
|
||||
.clk_disable_unused = omap2_clk_disable_unused,
|
||||
};
|
||||
|
||||
static u32 omap2_get_apll_clkin(void)
|
||||
{
|
||||
u32 aplls, sclk = 0;
|
||||
|
||||
aplls = cm_read_mod_reg(PLL_MOD, CM_CLKSEL1);
|
||||
aplls &= OMAP24XX_APLLS_CLKIN_MASK;
|
||||
aplls >>= OMAP24XX_APLLS_CLKIN_SHIFT;
|
||||
|
||||
if (aplls == APLLS_CLKIN_19_2MHZ)
|
||||
sclk = 19200000;
|
||||
else if (aplls == APLLS_CLKIN_13MHZ)
|
||||
sclk = 13000000;
|
||||
else if (aplls == APLLS_CLKIN_12MHZ)
|
||||
sclk = 12000000;
|
||||
|
||||
return sclk;
|
||||
}
|
||||
|
||||
static u32 omap2_get_sysclkdiv(void)
|
||||
{
|
||||
u32 div;
|
||||
|
||||
div = __raw_readl(OMAP24XX_PRCM_CLKSRC_CTRL);
|
||||
div &= OMAP_SYSCLKDIV_MASK;
|
||||
div >>= OMAP_SYSCLKDIV_SHIFT;
|
||||
|
||||
return div;
|
||||
}
|
||||
|
||||
static void omap2_osc_clk_recalc(struct clk *clk)
|
||||
{
|
||||
clk->rate = omap2_get_apll_clkin() * omap2_get_sysclkdiv();
|
||||
propagate_rate(clk);
|
||||
}
|
||||
|
||||
static void omap2_sys_clk_recalc(struct clk *clk)
|
||||
{
|
||||
clk->rate = clk->parent->rate / omap2_get_sysclkdiv();
|
||||
propagate_rate(clk);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set clocks for bypass mode for reboot to work.
|
||||
*/
|
||||
void omap2_clk_prepare_for_reboot(void)
|
||||
{
|
||||
u32 rate;
|
||||
|
||||
if (vclk == NULL || sclk == NULL)
|
||||
return;
|
||||
|
||||
rate = clk_get_rate(sclk);
|
||||
clk_set_rate(vclk, rate);
|
||||
}
|
||||
|
||||
/*
|
||||
* Switch the MPU rate if specified on cmdline.
|
||||
* We cannot do this early until cmdline is parsed.
|
||||
*/
|
||||
static int __init omap2_clk_arch_init(void)
|
||||
{
|
||||
if (!mpurate)
|
||||
return -EINVAL;
|
||||
|
||||
if (omap2_select_table_rate(&virt_prcm_set, mpurate))
|
||||
printk(KERN_ERR "Could not find matching MPU rate\n");
|
||||
|
||||
recalculate_root_clocks();
|
||||
|
||||
printk(KERN_INFO "Switched to new clocking rate (Crystal/DPLL/MPU): "
|
||||
"%ld.%01ld/%ld/%ld MHz\n",
|
||||
(sys_ck.rate / 1000000), (sys_ck.rate / 100000) % 10,
|
||||
(dpll_ck.rate / 1000000), (mpu_ck.rate / 1000000)) ;
|
||||
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(omap2_clk_arch_init);
|
||||
|
||||
int __init omap2_clk_init(void)
|
||||
{
|
||||
struct prcm_config *prcm;
|
||||
struct clk **clkp;
|
||||
u32 clkrate;
|
||||
|
||||
if (cpu_is_omap242x())
|
||||
cpu_mask = RATE_IN_242X;
|
||||
else if (cpu_is_omap2430())
|
||||
cpu_mask = RATE_IN_243X;
|
||||
|
||||
clk_init(&omap2_clk_functions);
|
||||
|
||||
omap2_osc_clk_recalc(&osc_ck);
|
||||
omap2_sys_clk_recalc(&sys_ck);
|
||||
|
||||
for (clkp = onchip_24xx_clks;
|
||||
clkp < onchip_24xx_clks + ARRAY_SIZE(onchip_24xx_clks);
|
||||
clkp++) {
|
||||
|
||||
if ((*clkp)->flags & CLOCK_IN_OMAP242X && cpu_is_omap2420()) {
|
||||
clk_register(*clkp);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((*clkp)->flags & CLOCK_IN_OMAP243X && cpu_is_omap2430()) {
|
||||
clk_register(*clkp);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check the MPU rate set by bootloader */
|
||||
clkrate = omap2_get_dpll_rate_24xx(&dpll_ck);
|
||||
for (prcm = rate_table; prcm->mpu_speed; prcm++) {
|
||||
if (!(prcm->flags & cpu_mask))
|
||||
continue;
|
||||
if (prcm->xtal_speed != sys_ck.rate)
|
||||
continue;
|
||||
if (prcm->dpll_speed <= clkrate)
|
||||
break;
|
||||
}
|
||||
curr_prcm_set = prcm;
|
||||
|
||||
recalculate_root_clocks();
|
||||
|
||||
printk(KERN_INFO "Clocking rate (Crystal/DPLL/MPU): "
|
||||
"%ld.%01ld/%ld/%ld MHz\n",
|
||||
(sys_ck.rate / 1000000), (sys_ck.rate / 100000) % 10,
|
||||
(dpll_ck.rate / 1000000), (mpu_ck.rate / 1000000)) ;
|
||||
|
||||
/*
|
||||
* Only enable those clocks we will need, let the drivers
|
||||
* enable other clocks as necessary
|
||||
*/
|
||||
clk_enable_init_clocks();
|
||||
|
||||
/* Avoid sleeping sleeping during omap2_clk_prepare_for_reboot() */
|
||||
vclk = clk_get(NULL, "virt_prcm_set");
|
||||
sclk = clk_get(NULL, "sys_ck");
|
||||
|
||||
return 0;
|
||||
}
|
||||
2643
arch/arm/mach-omap2/clock24xx.h
Normal file
2643
arch/arm/mach-omap2/clock24xx.h
Normal file
File diff suppressed because it is too large
Load diff
235
arch/arm/mach-omap2/clock34xx.c
Normal file
235
arch/arm/mach-omap2/clock34xx.c
Normal file
|
|
@ -0,0 +1,235 @@
|
|||
/*
|
||||
* OMAP3-specific clock framework functions
|
||||
*
|
||||
* Copyright (C) 2007 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* Parts of this code are based on code written by
|
||||
* Richard Woodruff, Tony Lindgren, Tuukka Tikkanen, Karthik Dasu
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/sram.h>
|
||||
#include <asm/div64.h>
|
||||
#include <asm/bitops.h>
|
||||
|
||||
#include "memory.h"
|
||||
#include "clock.h"
|
||||
#include "clock34xx.h"
|
||||
#include "prm.h"
|
||||
#include "prm-regbits-34xx.h"
|
||||
#include "cm.h"
|
||||
#include "cm-regbits-34xx.h"
|
||||
|
||||
/* CM_CLKEN_PLL*.EN* bit values */
|
||||
#define DPLL_LOCKED 0x7
|
||||
|
||||
/**
|
||||
* omap3_dpll_recalc - recalculate DPLL rate
|
||||
* @clk: DPLL struct clk
|
||||
*
|
||||
* Recalculate and propagate the DPLL rate.
|
||||
*/
|
||||
static void omap3_dpll_recalc(struct clk *clk)
|
||||
{
|
||||
clk->rate = omap2_get_dpll_rate(clk);
|
||||
|
||||
propagate_rate(clk);
|
||||
}
|
||||
|
||||
/**
|
||||
* omap3_clkoutx2_recalc - recalculate DPLL X2 output virtual clock rate
|
||||
* @clk: DPLL output struct clk
|
||||
*
|
||||
* Using parent clock DPLL data, look up DPLL state. If locked, set our
|
||||
* rate to the dpll_clk * 2; otherwise, just use dpll_clk.
|
||||
*/
|
||||
static void omap3_clkoutx2_recalc(struct clk *clk)
|
||||
{
|
||||
const struct dpll_data *dd;
|
||||
u32 v;
|
||||
struct clk *pclk;
|
||||
|
||||
/* Walk up the parents of clk, looking for a DPLL */
|
||||
pclk = clk->parent;
|
||||
while (pclk && !pclk->dpll_data)
|
||||
pclk = pclk->parent;
|
||||
|
||||
/* clk does not have a DPLL as a parent? */
|
||||
WARN_ON(!pclk);
|
||||
|
||||
dd = pclk->dpll_data;
|
||||
|
||||
WARN_ON(!dd->control_reg || !dd->enable_mask);
|
||||
|
||||
v = __raw_readl(dd->control_reg) & dd->enable_mask;
|
||||
v >>= __ffs(dd->enable_mask);
|
||||
if (v != DPLL_LOCKED)
|
||||
clk->rate = clk->parent->rate;
|
||||
else
|
||||
clk->rate = clk->parent->rate * 2;
|
||||
|
||||
if (clk->flags & RATE_PROPAGATES)
|
||||
propagate_rate(clk);
|
||||
}
|
||||
|
||||
/*
|
||||
* As it is structured now, this will prevent an OMAP2/3 multiboot
|
||||
* kernel from compiling. This will need further attention.
|
||||
*/
|
||||
#if defined(CONFIG_ARCH_OMAP3)
|
||||
|
||||
static struct clk_functions omap2_clk_functions = {
|
||||
.clk_enable = omap2_clk_enable,
|
||||
.clk_disable = omap2_clk_disable,
|
||||
.clk_round_rate = omap2_clk_round_rate,
|
||||
.clk_set_rate = omap2_clk_set_rate,
|
||||
.clk_set_parent = omap2_clk_set_parent,
|
||||
.clk_disable_unused = omap2_clk_disable_unused,
|
||||
};
|
||||
|
||||
/*
|
||||
* Set clocks for bypass mode for reboot to work.
|
||||
*/
|
||||
void omap2_clk_prepare_for_reboot(void)
|
||||
{
|
||||
/* REVISIT: Not ready for 343x */
|
||||
#if 0
|
||||
u32 rate;
|
||||
|
||||
if (vclk == NULL || sclk == NULL)
|
||||
return;
|
||||
|
||||
rate = clk_get_rate(sclk);
|
||||
clk_set_rate(vclk, rate);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* REVISIT: Move this init stuff out into clock.c */
|
||||
|
||||
/*
|
||||
* Switch the MPU rate if specified on cmdline.
|
||||
* We cannot do this early until cmdline is parsed.
|
||||
*/
|
||||
static int __init omap2_clk_arch_init(void)
|
||||
{
|
||||
if (!mpurate)
|
||||
return -EINVAL;
|
||||
|
||||
/* REVISIT: not yet ready for 343x */
|
||||
#if 0
|
||||
if (omap2_select_table_rate(&virt_prcm_set, mpurate))
|
||||
printk(KERN_ERR "Could not find matching MPU rate\n");
|
||||
#endif
|
||||
|
||||
recalculate_root_clocks();
|
||||
|
||||
printk(KERN_INFO "Switched to new clocking rate (Crystal/DPLL3/MPU): "
|
||||
"%ld.%01ld/%ld/%ld MHz\n",
|
||||
(osc_sys_ck.rate / 1000000), (osc_sys_ck.rate / 100000) % 10,
|
||||
(core_ck.rate / 1000000), (dpll1_fck.rate / 1000000)) ;
|
||||
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(omap2_clk_arch_init);
|
||||
|
||||
int __init omap2_clk_init(void)
|
||||
{
|
||||
/* struct prcm_config *prcm; */
|
||||
struct clk **clkp;
|
||||
/* u32 clkrate; */
|
||||
u32 cpu_clkflg;
|
||||
|
||||
/* REVISIT: Ultimately this will be used for multiboot */
|
||||
#if 0
|
||||
if (cpu_is_omap242x()) {
|
||||
cpu_mask = RATE_IN_242X;
|
||||
cpu_clkflg = CLOCK_IN_OMAP242X;
|
||||
clkp = onchip_24xx_clks;
|
||||
} else if (cpu_is_omap2430()) {
|
||||
cpu_mask = RATE_IN_243X;
|
||||
cpu_clkflg = CLOCK_IN_OMAP243X;
|
||||
clkp = onchip_24xx_clks;
|
||||
}
|
||||
#endif
|
||||
if (cpu_is_omap34xx()) {
|
||||
cpu_mask = RATE_IN_343X;
|
||||
cpu_clkflg = CLOCK_IN_OMAP343X;
|
||||
clkp = onchip_34xx_clks;
|
||||
|
||||
/*
|
||||
* Update this if there are further clock changes between ES2
|
||||
* and production parts
|
||||
*/
|
||||
if (is_sil_rev_equal_to(OMAP3430_REV_ES1_0)) {
|
||||
/* No 3430ES1-only rates exist, so no RATE_IN_3430ES1 */
|
||||
cpu_clkflg |= CLOCK_IN_OMAP3430ES1;
|
||||
} else {
|
||||
cpu_mask |= RATE_IN_3430ES2;
|
||||
cpu_clkflg |= CLOCK_IN_OMAP3430ES2;
|
||||
}
|
||||
}
|
||||
|
||||
clk_init(&omap2_clk_functions);
|
||||
|
||||
for (clkp = onchip_34xx_clks;
|
||||
clkp < onchip_34xx_clks + ARRAY_SIZE(onchip_34xx_clks);
|
||||
clkp++) {
|
||||
if ((*clkp)->flags & cpu_clkflg)
|
||||
clk_register(*clkp);
|
||||
}
|
||||
|
||||
/* REVISIT: Not yet ready for OMAP3 */
|
||||
#if 0
|
||||
/* Check the MPU rate set by bootloader */
|
||||
clkrate = omap2_get_dpll_rate_24xx(&dpll_ck);
|
||||
for (prcm = rate_table; prcm->mpu_speed; prcm++) {
|
||||
if (!(prcm->flags & cpu_mask))
|
||||
continue;
|
||||
if (prcm->xtal_speed != sys_ck.rate)
|
||||
continue;
|
||||
if (prcm->dpll_speed <= clkrate)
|
||||
break;
|
||||
}
|
||||
curr_prcm_set = prcm;
|
||||
#endif
|
||||
|
||||
recalculate_root_clocks();
|
||||
|
||||
printk(KERN_INFO "Clocking rate (Crystal/DPLL/ARM core): "
|
||||
"%ld.%01ld/%ld/%ld MHz\n",
|
||||
(osc_sys_ck.rate / 1000000), (osc_sys_ck.rate / 100000) % 10,
|
||||
(core_ck.rate / 1000000), (arm_fck.rate / 1000000));
|
||||
|
||||
/*
|
||||
* Only enable those clocks we will need, let the drivers
|
||||
* enable other clocks as necessary
|
||||
*/
|
||||
clk_enable_init_clocks();
|
||||
|
||||
/* Avoid sleeping during omap2_clk_prepare_for_reboot() */
|
||||
/* REVISIT: not yet ready for 343x */
|
||||
#if 0
|
||||
vclk = clk_get(NULL, "virt_prcm_set");
|
||||
sclk = clk_get(NULL, "sys_ck");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
3009
arch/arm/mach-omap2/clock34xx.h
Normal file
3009
arch/arm/mach-omap2/clock34xx.h
Normal file
File diff suppressed because it is too large
Load diff
401
arch/arm/mach-omap2/cm-regbits-24xx.h
Normal file
401
arch/arm/mach-omap2/cm-regbits-24xx.h
Normal file
|
|
@ -0,0 +1,401 @@
|
|||
#ifndef __ARCH_ARM_MACH_OMAP2_CM_REGBITS_24XX_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_CM_REGBITS_24XX_H
|
||||
|
||||
/*
|
||||
* OMAP24XX Clock Management register bits
|
||||
*
|
||||
* Copyright (C) 2007 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* 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 "cm.h"
|
||||
|
||||
/* Bits shared between registers */
|
||||
|
||||
/* CM_FCLKEN1_CORE and CM_ICLKEN1_CORE shared bits */
|
||||
#define OMAP24XX_EN_CAM_SHIFT 31
|
||||
#define OMAP24XX_EN_CAM (1 << 31)
|
||||
#define OMAP24XX_EN_WDT4_SHIFT 29
|
||||
#define OMAP24XX_EN_WDT4 (1 << 29)
|
||||
#define OMAP2420_EN_WDT3_SHIFT 28
|
||||
#define OMAP2420_EN_WDT3 (1 << 28)
|
||||
#define OMAP24XX_EN_MSPRO_SHIFT 27
|
||||
#define OMAP24XX_EN_MSPRO (1 << 27)
|
||||
#define OMAP24XX_EN_FAC_SHIFT 25
|
||||
#define OMAP24XX_EN_FAC (1 << 25)
|
||||
#define OMAP2420_EN_EAC_SHIFT 24
|
||||
#define OMAP2420_EN_EAC (1 << 24)
|
||||
#define OMAP24XX_EN_HDQ_SHIFT 23
|
||||
#define OMAP24XX_EN_HDQ (1 << 23)
|
||||
#define OMAP2420_EN_I2C2_SHIFT 20
|
||||
#define OMAP2420_EN_I2C2 (1 << 20)
|
||||
#define OMAP2420_EN_I2C1_SHIFT 19
|
||||
#define OMAP2420_EN_I2C1 (1 << 19)
|
||||
|
||||
/* CM_FCLKEN2_CORE and CM_ICLKEN2_CORE shared bits */
|
||||
#define OMAP2430_EN_MCBSP5_SHIFT 5
|
||||
#define OMAP2430_EN_MCBSP5 (1 << 5)
|
||||
#define OMAP2430_EN_MCBSP4_SHIFT 4
|
||||
#define OMAP2430_EN_MCBSP4 (1 << 4)
|
||||
#define OMAP2430_EN_MCBSP3_SHIFT 3
|
||||
#define OMAP2430_EN_MCBSP3 (1 << 3)
|
||||
#define OMAP24XX_EN_SSI_SHIFT 1
|
||||
#define OMAP24XX_EN_SSI (1 << 1)
|
||||
|
||||
/* CM_FCLKEN_WKUP and CM_ICLKEN_WKUP shared bits */
|
||||
#define OMAP24XX_EN_MPU_WDT_SHIFT 3
|
||||
#define OMAP24XX_EN_MPU_WDT (1 << 3)
|
||||
|
||||
/* Bits specific to each register */
|
||||
|
||||
/* CM_IDLEST_MPU */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_ST_MPU (1 << 0)
|
||||
|
||||
/* CM_CLKSEL_MPU */
|
||||
#define OMAP24XX_CLKSEL_MPU_SHIFT 0
|
||||
#define OMAP24XX_CLKSEL_MPU_MASK (0x1f << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_MPU */
|
||||
#define OMAP24XX_AUTOSTATE_MPU (1 << 0)
|
||||
|
||||
/* CM_FCLKEN1_CORE specific bits*/
|
||||
#define OMAP24XX_EN_TV_SHIFT 2
|
||||
#define OMAP24XX_EN_TV (1 << 2)
|
||||
#define OMAP24XX_EN_DSS2_SHIFT 1
|
||||
#define OMAP24XX_EN_DSS2 (1 << 1)
|
||||
#define OMAP24XX_EN_DSS1_SHIFT 0
|
||||
#define OMAP24XX_EN_DSS1 (1 << 0)
|
||||
|
||||
/* CM_FCLKEN2_CORE specific bits */
|
||||
#define OMAP2430_EN_I2CHS2_SHIFT 20
|
||||
#define OMAP2430_EN_I2CHS2 (1 << 20)
|
||||
#define OMAP2430_EN_I2CHS1_SHIFT 19
|
||||
#define OMAP2430_EN_I2CHS1 (1 << 19)
|
||||
#define OMAP2430_EN_MMCHSDB2_SHIFT 17
|
||||
#define OMAP2430_EN_MMCHSDB2 (1 << 17)
|
||||
#define OMAP2430_EN_MMCHSDB1_SHIFT 16
|
||||
#define OMAP2430_EN_MMCHSDB1 (1 << 16)
|
||||
|
||||
/* CM_ICLKEN1_CORE specific bits */
|
||||
#define OMAP24XX_EN_MAILBOXES_SHIFT 30
|
||||
#define OMAP24XX_EN_MAILBOXES (1 << 30)
|
||||
#define OMAP24XX_EN_DSS_SHIFT 0
|
||||
#define OMAP24XX_EN_DSS (1 << 0)
|
||||
|
||||
/* CM_ICLKEN2_CORE specific bits */
|
||||
|
||||
/* CM_ICLKEN3_CORE */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_EN_SDRC_SHIFT 2
|
||||
#define OMAP2430_EN_SDRC (1 << 2)
|
||||
|
||||
/* CM_ICLKEN4_CORE */
|
||||
#define OMAP24XX_EN_PKA_SHIFT 4
|
||||
#define OMAP24XX_EN_PKA (1 << 4)
|
||||
#define OMAP24XX_EN_AES_SHIFT 3
|
||||
#define OMAP24XX_EN_AES (1 << 3)
|
||||
#define OMAP24XX_EN_RNG_SHIFT 2
|
||||
#define OMAP24XX_EN_RNG (1 << 2)
|
||||
#define OMAP24XX_EN_SHA_SHIFT 1
|
||||
#define OMAP24XX_EN_SHA (1 << 1)
|
||||
#define OMAP24XX_EN_DES_SHIFT 0
|
||||
#define OMAP24XX_EN_DES (1 << 0)
|
||||
|
||||
/* CM_IDLEST1_CORE specific bits */
|
||||
#define OMAP24XX_ST_MAILBOXES (1 << 30)
|
||||
#define OMAP24XX_ST_WDT4 (1 << 29)
|
||||
#define OMAP2420_ST_WDT3 (1 << 28)
|
||||
#define OMAP24XX_ST_MSPRO (1 << 27)
|
||||
#define OMAP24XX_ST_FAC (1 << 25)
|
||||
#define OMAP2420_ST_EAC (1 << 24)
|
||||
#define OMAP24XX_ST_HDQ (1 << 23)
|
||||
#define OMAP24XX_ST_I2C2 (1 << 20)
|
||||
#define OMAP24XX_ST_I2C1 (1 << 19)
|
||||
#define OMAP24XX_ST_MCBSP2 (1 << 16)
|
||||
#define OMAP24XX_ST_MCBSP1 (1 << 15)
|
||||
#define OMAP24XX_ST_DSS (1 << 0)
|
||||
|
||||
/* CM_IDLEST2_CORE */
|
||||
#define OMAP2430_ST_MCBSP5 (1 << 5)
|
||||
#define OMAP2430_ST_MCBSP4 (1 << 4)
|
||||
#define OMAP2430_ST_MCBSP3 (1 << 3)
|
||||
#define OMAP24XX_ST_SSI (1 << 1)
|
||||
|
||||
/* CM_IDLEST3_CORE */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_ST_SDRC (1 << 2)
|
||||
|
||||
/* CM_IDLEST4_CORE */
|
||||
#define OMAP24XX_ST_PKA (1 << 4)
|
||||
#define OMAP24XX_ST_AES (1 << 3)
|
||||
#define OMAP24XX_ST_RNG (1 << 2)
|
||||
#define OMAP24XX_ST_SHA (1 << 1)
|
||||
#define OMAP24XX_ST_DES (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE1_CORE */
|
||||
#define OMAP24XX_AUTO_CAM (1 << 31)
|
||||
#define OMAP24XX_AUTO_MAILBOXES (1 << 30)
|
||||
#define OMAP24XX_AUTO_WDT4 (1 << 29)
|
||||
#define OMAP2420_AUTO_WDT3 (1 << 28)
|
||||
#define OMAP24XX_AUTO_MSPRO (1 << 27)
|
||||
#define OMAP2420_AUTO_MMC (1 << 26)
|
||||
#define OMAP24XX_AUTO_FAC (1 << 25)
|
||||
#define OMAP2420_AUTO_EAC (1 << 24)
|
||||
#define OMAP24XX_AUTO_HDQ (1 << 23)
|
||||
#define OMAP24XX_AUTO_UART2 (1 << 22)
|
||||
#define OMAP24XX_AUTO_UART1 (1 << 21)
|
||||
#define OMAP24XX_AUTO_I2C2 (1 << 20)
|
||||
#define OMAP24XX_AUTO_I2C1 (1 << 19)
|
||||
#define OMAP24XX_AUTO_MCSPI2 (1 << 18)
|
||||
#define OMAP24XX_AUTO_MCSPI1 (1 << 17)
|
||||
#define OMAP24XX_AUTO_MCBSP2 (1 << 16)
|
||||
#define OMAP24XX_AUTO_MCBSP1 (1 << 15)
|
||||
#define OMAP24XX_AUTO_GPT12 (1 << 14)
|
||||
#define OMAP24XX_AUTO_GPT11 (1 << 13)
|
||||
#define OMAP24XX_AUTO_GPT10 (1 << 12)
|
||||
#define OMAP24XX_AUTO_GPT9 (1 << 11)
|
||||
#define OMAP24XX_AUTO_GPT8 (1 << 10)
|
||||
#define OMAP24XX_AUTO_GPT7 (1 << 9)
|
||||
#define OMAP24XX_AUTO_GPT6 (1 << 8)
|
||||
#define OMAP24XX_AUTO_GPT5 (1 << 7)
|
||||
#define OMAP24XX_AUTO_GPT4 (1 << 6)
|
||||
#define OMAP24XX_AUTO_GPT3 (1 << 5)
|
||||
#define OMAP24XX_AUTO_GPT2 (1 << 4)
|
||||
#define OMAP2420_AUTO_VLYNQ (1 << 3)
|
||||
#define OMAP24XX_AUTO_DSS (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE2_CORE */
|
||||
#define OMAP2430_AUTO_MDM_INTC (1 << 11)
|
||||
#define OMAP2430_AUTO_GPIO5 (1 << 10)
|
||||
#define OMAP2430_AUTO_MCSPI3 (1 << 9)
|
||||
#define OMAP2430_AUTO_MMCHS2 (1 << 8)
|
||||
#define OMAP2430_AUTO_MMCHS1 (1 << 7)
|
||||
#define OMAP2430_AUTO_USBHS (1 << 6)
|
||||
#define OMAP2430_AUTO_MCBSP5 (1 << 5)
|
||||
#define OMAP2430_AUTO_MCBSP4 (1 << 4)
|
||||
#define OMAP2430_AUTO_MCBSP3 (1 << 3)
|
||||
#define OMAP24XX_AUTO_UART3 (1 << 2)
|
||||
#define OMAP24XX_AUTO_SSI (1 << 1)
|
||||
#define OMAP24XX_AUTO_USB (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE3_CORE */
|
||||
#define OMAP24XX_AUTO_SDRC (1 << 2)
|
||||
#define OMAP24XX_AUTO_GPMC (1 << 1)
|
||||
#define OMAP24XX_AUTO_SDMA (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE4_CORE */
|
||||
#define OMAP24XX_AUTO_PKA (1 << 4)
|
||||
#define OMAP24XX_AUTO_AES (1 << 3)
|
||||
#define OMAP24XX_AUTO_RNG (1 << 2)
|
||||
#define OMAP24XX_AUTO_SHA (1 << 1)
|
||||
#define OMAP24XX_AUTO_DES (1 << 0)
|
||||
|
||||
/* CM_CLKSEL1_CORE */
|
||||
#define OMAP24XX_CLKSEL_USB_SHIFT 25
|
||||
#define OMAP24XX_CLKSEL_USB_MASK (0x7 << 25)
|
||||
#define OMAP24XX_CLKSEL_SSI_SHIFT 20
|
||||
#define OMAP24XX_CLKSEL_SSI_MASK (0x1f << 20)
|
||||
#define OMAP2420_CLKSEL_VLYNQ_SHIFT 15
|
||||
#define OMAP2420_CLKSEL_VLYNQ_MASK (0x1f << 15)
|
||||
#define OMAP24XX_CLKSEL_DSS2_SHIFT 13
|
||||
#define OMAP24XX_CLKSEL_DSS2_MASK (0x1 << 13)
|
||||
#define OMAP24XX_CLKSEL_DSS1_SHIFT 8
|
||||
#define OMAP24XX_CLKSEL_DSS1_MASK (0x1f << 8)
|
||||
#define OMAP24XX_CLKSEL_L4_SHIFT 5
|
||||
#define OMAP24XX_CLKSEL_L4_MASK (0x3 << 5)
|
||||
#define OMAP24XX_CLKSEL_L3_SHIFT 0
|
||||
#define OMAP24XX_CLKSEL_L3_MASK (0x1f << 0)
|
||||
|
||||
/* CM_CLKSEL2_CORE */
|
||||
#define OMAP24XX_CLKSEL_GPT12_SHIFT 22
|
||||
#define OMAP24XX_CLKSEL_GPT12_MASK (0x3 << 22)
|
||||
#define OMAP24XX_CLKSEL_GPT11_SHIFT 20
|
||||
#define OMAP24XX_CLKSEL_GPT11_MASK (0x3 << 20)
|
||||
#define OMAP24XX_CLKSEL_GPT10_SHIFT 18
|
||||
#define OMAP24XX_CLKSEL_GPT10_MASK (0x3 << 18)
|
||||
#define OMAP24XX_CLKSEL_GPT9_SHIFT 16
|
||||
#define OMAP24XX_CLKSEL_GPT9_MASK (0x3 << 16)
|
||||
#define OMAP24XX_CLKSEL_GPT8_SHIFT 14
|
||||
#define OMAP24XX_CLKSEL_GPT8_MASK (0x3 << 14)
|
||||
#define OMAP24XX_CLKSEL_GPT7_SHIFT 12
|
||||
#define OMAP24XX_CLKSEL_GPT7_MASK (0x3 << 12)
|
||||
#define OMAP24XX_CLKSEL_GPT6_SHIFT 10
|
||||
#define OMAP24XX_CLKSEL_GPT6_MASK (0x3 << 10)
|
||||
#define OMAP24XX_CLKSEL_GPT5_SHIFT 8
|
||||
#define OMAP24XX_CLKSEL_GPT5_MASK (0x3 << 8)
|
||||
#define OMAP24XX_CLKSEL_GPT4_SHIFT 6
|
||||
#define OMAP24XX_CLKSEL_GPT4_MASK (0x3 << 6)
|
||||
#define OMAP24XX_CLKSEL_GPT3_SHIFT 4
|
||||
#define OMAP24XX_CLKSEL_GPT3_MASK (0x3 << 4)
|
||||
#define OMAP24XX_CLKSEL_GPT2_SHIFT 2
|
||||
#define OMAP24XX_CLKSEL_GPT2_MASK (0x3 << 2)
|
||||
|
||||
/* CM_CLKSTCTRL_CORE */
|
||||
#define OMAP24XX_AUTOSTATE_DSS (1 << 2)
|
||||
#define OMAP24XX_AUTOSTATE_L4 (1 << 1)
|
||||
#define OMAP24XX_AUTOSTATE_L3 (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_GFX */
|
||||
#define OMAP24XX_EN_3D_SHIFT 2
|
||||
#define OMAP24XX_EN_3D (1 << 2)
|
||||
#define OMAP24XX_EN_2D_SHIFT 1
|
||||
#define OMAP24XX_EN_2D (1 << 1)
|
||||
|
||||
/* CM_ICLKEN_GFX specific bits */
|
||||
|
||||
/* CM_IDLEST_GFX specific bits */
|
||||
|
||||
/* CM_CLKSEL_GFX specific bits */
|
||||
|
||||
/* CM_CLKSTCTRL_GFX */
|
||||
#define OMAP24XX_AUTOSTATE_GFX (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_WKUP specific bits */
|
||||
|
||||
/* CM_ICLKEN_WKUP specific bits */
|
||||
#define OMAP2430_EN_ICR_SHIFT 6
|
||||
#define OMAP2430_EN_ICR (1 << 6)
|
||||
#define OMAP24XX_EN_OMAPCTRL_SHIFT 5
|
||||
#define OMAP24XX_EN_OMAPCTRL (1 << 5)
|
||||
#define OMAP24XX_EN_WDT1_SHIFT 4
|
||||
#define OMAP24XX_EN_WDT1 (1 << 4)
|
||||
#define OMAP24XX_EN_32KSYNC_SHIFT 1
|
||||
#define OMAP24XX_EN_32KSYNC (1 << 1)
|
||||
|
||||
/* CM_IDLEST_WKUP specific bits */
|
||||
#define OMAP2430_ST_ICR (1 << 6)
|
||||
#define OMAP24XX_ST_OMAPCTRL (1 << 5)
|
||||
#define OMAP24XX_ST_WDT1 (1 << 4)
|
||||
#define OMAP24XX_ST_MPU_WDT (1 << 3)
|
||||
#define OMAP24XX_ST_32KSYNC (1 << 1)
|
||||
|
||||
/* CM_AUTOIDLE_WKUP */
|
||||
#define OMAP24XX_AUTO_OMAPCTRL (1 << 5)
|
||||
#define OMAP24XX_AUTO_WDT1 (1 << 4)
|
||||
#define OMAP24XX_AUTO_MPU_WDT (1 << 3)
|
||||
#define OMAP24XX_AUTO_GPIOS (1 << 2)
|
||||
#define OMAP24XX_AUTO_32KSYNC (1 << 1)
|
||||
#define OMAP24XX_AUTO_GPT1 (1 << 0)
|
||||
|
||||
/* CM_CLKSEL_WKUP */
|
||||
#define OMAP24XX_CLKSEL_GPT1_SHIFT 0
|
||||
#define OMAP24XX_CLKSEL_GPT1_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKEN_PLL */
|
||||
#define OMAP24XX_EN_54M_PLL_SHIFT 6
|
||||
#define OMAP24XX_EN_54M_PLL_MASK (0x3 << 6)
|
||||
#define OMAP24XX_EN_96M_PLL_SHIFT 2
|
||||
#define OMAP24XX_EN_96M_PLL_MASK (0x3 << 2)
|
||||
#define OMAP24XX_EN_DPLL_SHIFT 0
|
||||
#define OMAP24XX_EN_DPLL_MASK (0x3 << 0)
|
||||
|
||||
/* CM_IDLEST_CKGEN */
|
||||
#define OMAP24XX_ST_54M_APLL (1 << 9)
|
||||
#define OMAP24XX_ST_96M_APLL (1 << 8)
|
||||
#define OMAP24XX_ST_54M_CLK (1 << 6)
|
||||
#define OMAP24XX_ST_12M_CLK (1 << 5)
|
||||
#define OMAP24XX_ST_48M_CLK (1 << 4)
|
||||
#define OMAP24XX_ST_96M_CLK (1 << 2)
|
||||
#define OMAP24XX_ST_CORE_CLK_SHIFT 0
|
||||
#define OMAP24XX_ST_CORE_CLK_MASK (0x3 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_PLL */
|
||||
#define OMAP24XX_AUTO_54M_SHIFT 6
|
||||
#define OMAP24XX_AUTO_54M_MASK (0x3 << 6)
|
||||
#define OMAP24XX_AUTO_96M_SHIFT 2
|
||||
#define OMAP24XX_AUTO_96M_MASK (0x3 << 2)
|
||||
#define OMAP24XX_AUTO_DPLL_SHIFT 0
|
||||
#define OMAP24XX_AUTO_DPLL_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSEL1_PLL */
|
||||
#define OMAP2430_MAXDPLLFASTLOCK_SHIFT 28
|
||||
#define OMAP2430_MAXDPLLFASTLOCK_MASK (0x7 << 28)
|
||||
#define OMAP24XX_APLLS_CLKIN_SHIFT 23
|
||||
#define OMAP24XX_APLLS_CLKIN_MASK (0x7 << 23)
|
||||
#define OMAP24XX_DPLL_MULT_SHIFT 12
|
||||
#define OMAP24XX_DPLL_MULT_MASK (0x3ff << 12)
|
||||
#define OMAP24XX_DPLL_DIV_SHIFT 8
|
||||
#define OMAP24XX_DPLL_DIV_MASK (0xf << 8)
|
||||
#define OMAP24XX_54M_SOURCE_SHIFT 5
|
||||
#define OMAP24XX_54M_SOURCE (1 << 5)
|
||||
#define OMAP2430_96M_SOURCE_SHIFT 4
|
||||
#define OMAP2430_96M_SOURCE (1 << 4)
|
||||
#define OMAP24XX_48M_SOURCE_SHIFT 3
|
||||
#define OMAP24XX_48M_SOURCE (1 << 3)
|
||||
#define OMAP2430_ALTCLK_SOURCE_SHIFT 0
|
||||
#define OMAP2430_ALTCLK_SOURCE_MASK (0x7 << 0)
|
||||
|
||||
/* CM_CLKSEL2_PLL */
|
||||
#define OMAP24XX_CORE_CLK_SRC_SHIFT 0
|
||||
#define OMAP24XX_CORE_CLK_SRC_MASK (0x3 << 0)
|
||||
|
||||
/* CM_FCLKEN_DSP */
|
||||
#define OMAP2420_EN_IVA_COP_SHIFT 10
|
||||
#define OMAP2420_EN_IVA_COP (1 << 10)
|
||||
#define OMAP2420_EN_IVA_MPU_SHIFT 8
|
||||
#define OMAP2420_EN_IVA_MPU (1 << 8)
|
||||
#define OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT 0
|
||||
#define OMAP24XX_CM_FCLKEN_DSP_EN_DSP (1 << 0)
|
||||
|
||||
/* CM_ICLKEN_DSP */
|
||||
#define OMAP2420_EN_DSP_IPI_SHIFT 1
|
||||
#define OMAP2420_EN_DSP_IPI (1 << 1)
|
||||
|
||||
/* CM_IDLEST_DSP */
|
||||
#define OMAP2420_ST_IVA (1 << 8)
|
||||
#define OMAP2420_ST_IPI (1 << 1)
|
||||
#define OMAP24XX_ST_DSP (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_DSP */
|
||||
#define OMAP2420_AUTO_DSP_IPI (1 << 1)
|
||||
|
||||
/* CM_CLKSEL_DSP */
|
||||
#define OMAP2420_SYNC_IVA (1 << 13)
|
||||
#define OMAP2420_CLKSEL_IVA_SHIFT 8
|
||||
#define OMAP2420_CLKSEL_IVA_MASK (0x1f << 8)
|
||||
#define OMAP24XX_SYNC_DSP (1 << 7)
|
||||
#define OMAP24XX_CLKSEL_DSP_IF_SHIFT 5
|
||||
#define OMAP24XX_CLKSEL_DSP_IF_MASK (0x3 << 5)
|
||||
#define OMAP24XX_CLKSEL_DSP_SHIFT 0
|
||||
#define OMAP24XX_CLKSEL_DSP_MASK (0x1f << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_DSP */
|
||||
#define OMAP2420_AUTOSTATE_IVA (1 << 8)
|
||||
#define OMAP24XX_AUTOSTATE_DSP (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_MDM */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_EN_OSC_SHIFT 1
|
||||
#define OMAP2430_EN_OSC (1 << 1)
|
||||
|
||||
/* CM_ICLKEN_MDM */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_CM_ICLKEN_MDM_EN_MDM_SHIFT 0
|
||||
#define OMAP2430_CM_ICLKEN_MDM_EN_MDM (1 << 0)
|
||||
|
||||
/* CM_IDLEST_MDM specific bits */
|
||||
/* 2430 only */
|
||||
|
||||
/* CM_AUTOIDLE_MDM */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_AUTO_OSC (1 << 1)
|
||||
#define OMAP2430_AUTO_MDM (1 << 0)
|
||||
|
||||
/* CM_CLKSEL_MDM */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_SYNC_MDM (1 << 4)
|
||||
#define OMAP2430_CLKSEL_MDM_SHIFT 0
|
||||
#define OMAP2430_CLKSEL_MDM_MASK (0xf << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_MDM */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_AUTOSTATE_MDM (1 << 0)
|
||||
|
||||
#endif
|
||||
673
arch/arm/mach-omap2/cm-regbits-34xx.h
Normal file
673
arch/arm/mach-omap2/cm-regbits-34xx.h
Normal file
|
|
@ -0,0 +1,673 @@
|
|||
#ifndef __ARCH_ARM_MACH_OMAP2_CM_REGBITS_34XX_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_CM_REGBITS_34XX_H
|
||||
|
||||
/*
|
||||
* OMAP3430 Clock Management register bits
|
||||
*
|
||||
* Copyright (C) 2007-2008 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007-2008 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* 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 "cm.h"
|
||||
|
||||
/* Bits shared between registers */
|
||||
|
||||
/* CM_FCLKEN1_CORE and CM_ICLKEN1_CORE shared bits */
|
||||
#define OMAP3430ES2_EN_MMC3_MASK (1 << 30)
|
||||
#define OMAP3430ES2_EN_MMC3_SHIFT 30
|
||||
#define OMAP3430_EN_MSPRO (1 << 23)
|
||||
#define OMAP3430_EN_MSPRO_SHIFT 23
|
||||
#define OMAP3430_EN_HDQ (1 << 22)
|
||||
#define OMAP3430_EN_HDQ_SHIFT 22
|
||||
#define OMAP3430ES1_EN_FSHOSTUSB (1 << 5)
|
||||
#define OMAP3430ES1_EN_FSHOSTUSB_SHIFT 5
|
||||
#define OMAP3430ES1_EN_D2D (1 << 3)
|
||||
#define OMAP3430ES1_EN_D2D_SHIFT 3
|
||||
#define OMAP3430_EN_SSI (1 << 0)
|
||||
#define OMAP3430_EN_SSI_SHIFT 0
|
||||
|
||||
/* CM_FCLKEN3_CORE and CM_ICLKEN3_CORE shared bits */
|
||||
#define OMAP3430ES2_EN_USBTLL_SHIFT 2
|
||||
#define OMAP3430ES2_EN_USBTLL_MASK (1 << 2)
|
||||
|
||||
/* CM_FCLKEN_WKUP and CM_ICLKEN_WKUP shared bits */
|
||||
#define OMAP3430_EN_WDT2 (1 << 5)
|
||||
#define OMAP3430_EN_WDT2_SHIFT 5
|
||||
|
||||
/* CM_ICLKEN_CAM, CM_FCLKEN_CAM shared bits */
|
||||
#define OMAP3430_EN_CAM (1 << 0)
|
||||
#define OMAP3430_EN_CAM_SHIFT 0
|
||||
|
||||
/* CM_FCLKEN_PER, CM_ICLKEN_PER shared bits */
|
||||
#define OMAP3430_EN_WDT3 (1 << 12)
|
||||
#define OMAP3430_EN_WDT3_SHIFT 12
|
||||
|
||||
/* CM_CLKSEL2_EMU, CM_CLKSEL3_EMU shared bits */
|
||||
#define OMAP3430_OVERRIDE_ENABLE (1 << 19)
|
||||
|
||||
|
||||
/* Bits specific to each register */
|
||||
|
||||
/* CM_FCLKEN_IVA2 */
|
||||
#define OMAP3430_CM_FCLKEN_IVA2_EN_IVA2 (1 << 0)
|
||||
|
||||
/* CM_CLKEN_PLL_IVA2 */
|
||||
#define OMAP3430_IVA2_DPLL_RAMPTIME_SHIFT 8
|
||||
#define OMAP3430_IVA2_DPLL_RAMPTIME_MASK (0x3 << 8)
|
||||
#define OMAP3430_IVA2_DPLL_FREQSEL_SHIFT 4
|
||||
#define OMAP3430_IVA2_DPLL_FREQSEL_MASK (0xf << 4)
|
||||
#define OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_SHIFT 3
|
||||
#define OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_MASK (1 << 3)
|
||||
#define OMAP3430_EN_IVA2_DPLL_SHIFT 0
|
||||
#define OMAP3430_EN_IVA2_DPLL_MASK (0x7 << 0)
|
||||
|
||||
/* CM_IDLEST_IVA2 */
|
||||
#define OMAP3430_ST_IVA2 (1 << 0)
|
||||
|
||||
/* CM_IDLEST_PLL_IVA2 */
|
||||
#define OMAP3430_ST_IVA2_CLK (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_PLL_IVA2 */
|
||||
#define OMAP3430_AUTO_IVA2_DPLL_SHIFT 0
|
||||
#define OMAP3430_AUTO_IVA2_DPLL_MASK (0x7 << 0)
|
||||
|
||||
/* CM_CLKSEL1_PLL_IVA2 */
|
||||
#define OMAP3430_IVA2_CLK_SRC_SHIFT 19
|
||||
#define OMAP3430_IVA2_CLK_SRC_MASK (0x3 << 19)
|
||||
#define OMAP3430_IVA2_DPLL_MULT_SHIFT 8
|
||||
#define OMAP3430_IVA2_DPLL_MULT_MASK (0x7ff << 8)
|
||||
#define OMAP3430_IVA2_DPLL_DIV_SHIFT 0
|
||||
#define OMAP3430_IVA2_DPLL_DIV_MASK (0x7f << 0)
|
||||
|
||||
/* CM_CLKSEL2_PLL_IVA2 */
|
||||
#define OMAP3430_IVA2_DPLL_CLKOUT_DIV_SHIFT 0
|
||||
#define OMAP3430_IVA2_DPLL_CLKOUT_DIV_MASK (0x1f << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_IVA2 */
|
||||
#define OMAP3430_CLKTRCTRL_IVA2_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_IVA2_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_IVA2 */
|
||||
#define OMAP3430_CLKACTIVITY_IVA2 (1 << 0)
|
||||
|
||||
/* CM_REVISION specific bits */
|
||||
|
||||
/* CM_SYSCONFIG specific bits */
|
||||
|
||||
/* CM_CLKEN_PLL_MPU */
|
||||
#define OMAP3430_MPU_DPLL_RAMPTIME_SHIFT 8
|
||||
#define OMAP3430_MPU_DPLL_RAMPTIME_MASK (0x3 << 8)
|
||||
#define OMAP3430_MPU_DPLL_FREQSEL_SHIFT 4
|
||||
#define OMAP3430_MPU_DPLL_FREQSEL_MASK (0xf << 4)
|
||||
#define OMAP3430_EN_MPU_DPLL_DRIFTGUARD_SHIFT 3
|
||||
#define OMAP3430_EN_MPU_DPLL_DRIFTGUARD_MASK (1 << 3)
|
||||
#define OMAP3430_EN_MPU_DPLL_SHIFT 0
|
||||
#define OMAP3430_EN_MPU_DPLL_MASK (0x7 << 0)
|
||||
|
||||
/* CM_IDLEST_MPU */
|
||||
#define OMAP3430_ST_MPU (1 << 0)
|
||||
|
||||
/* CM_IDLEST_PLL_MPU */
|
||||
#define OMAP3430_ST_MPU_CLK (1 << 0)
|
||||
#define OMAP3430_ST_IVA2_CLK_MASK (1 << 0)
|
||||
|
||||
/* CM_IDLEST_PLL_MPU */
|
||||
#define OMAP3430_ST_MPU_CLK_MASK (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_PLL_MPU */
|
||||
#define OMAP3430_AUTO_MPU_DPLL_SHIFT 0
|
||||
#define OMAP3430_AUTO_MPU_DPLL_MASK (0x7 << 0)
|
||||
|
||||
/* CM_CLKSEL1_PLL_MPU */
|
||||
#define OMAP3430_MPU_CLK_SRC_SHIFT 19
|
||||
#define OMAP3430_MPU_CLK_SRC_MASK (0x3 << 19)
|
||||
#define OMAP3430_MPU_DPLL_MULT_SHIFT 8
|
||||
#define OMAP3430_MPU_DPLL_MULT_MASK (0x7ff << 8)
|
||||
#define OMAP3430_MPU_DPLL_DIV_SHIFT 0
|
||||
#define OMAP3430_MPU_DPLL_DIV_MASK (0x7f << 0)
|
||||
|
||||
/* CM_CLKSEL2_PLL_MPU */
|
||||
#define OMAP3430_MPU_DPLL_CLKOUT_DIV_SHIFT 0
|
||||
#define OMAP3430_MPU_DPLL_CLKOUT_DIV_MASK (0x1f << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_MPU */
|
||||
#define OMAP3430_CLKTRCTRL_MPU_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_MPU_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_MPU */
|
||||
#define OMAP3430_CLKACTIVITY_MPU (1 << 0)
|
||||
|
||||
/* CM_FCLKEN1_CORE specific bits */
|
||||
|
||||
/* CM_ICLKEN1_CORE specific bits */
|
||||
#define OMAP3430_EN_ICR (1 << 29)
|
||||
#define OMAP3430_EN_ICR_SHIFT 29
|
||||
#define OMAP3430_EN_AES2 (1 << 28)
|
||||
#define OMAP3430_EN_AES2_SHIFT 28
|
||||
#define OMAP3430_EN_SHA12 (1 << 27)
|
||||
#define OMAP3430_EN_SHA12_SHIFT 27
|
||||
#define OMAP3430_EN_DES2 (1 << 26)
|
||||
#define OMAP3430_EN_DES2_SHIFT 26
|
||||
#define OMAP3430ES1_EN_FAC (1 << 8)
|
||||
#define OMAP3430ES1_EN_FAC_SHIFT 8
|
||||
#define OMAP3430_EN_MAILBOXES (1 << 7)
|
||||
#define OMAP3430_EN_MAILBOXES_SHIFT 7
|
||||
#define OMAP3430_EN_OMAPCTRL (1 << 6)
|
||||
#define OMAP3430_EN_OMAPCTRL_SHIFT 6
|
||||
#define OMAP3430_EN_SDRC (1 << 1)
|
||||
#define OMAP3430_EN_SDRC_SHIFT 1
|
||||
|
||||
/* CM_ICLKEN2_CORE */
|
||||
#define OMAP3430_EN_PKA (1 << 4)
|
||||
#define OMAP3430_EN_PKA_SHIFT 4
|
||||
#define OMAP3430_EN_AES1 (1 << 3)
|
||||
#define OMAP3430_EN_AES1_SHIFT 3
|
||||
#define OMAP3430_EN_RNG (1 << 2)
|
||||
#define OMAP3430_EN_RNG_SHIFT 2
|
||||
#define OMAP3430_EN_SHA11 (1 << 1)
|
||||
#define OMAP3430_EN_SHA11_SHIFT 1
|
||||
#define OMAP3430_EN_DES1 (1 << 0)
|
||||
#define OMAP3430_EN_DES1_SHIFT 0
|
||||
|
||||
/* CM_FCLKEN3_CORE specific bits */
|
||||
#define OMAP3430ES2_EN_TS_SHIFT 1
|
||||
#define OMAP3430ES2_EN_TS_MASK (1 << 1)
|
||||
#define OMAP3430ES2_EN_CPEFUSE_SHIFT 0
|
||||
#define OMAP3430ES2_EN_CPEFUSE_MASK (1 << 0)
|
||||
|
||||
/* CM_IDLEST1_CORE specific bits */
|
||||
#define OMAP3430_ST_ICR (1 << 29)
|
||||
#define OMAP3430_ST_AES2 (1 << 28)
|
||||
#define OMAP3430_ST_SHA12 (1 << 27)
|
||||
#define OMAP3430_ST_DES2 (1 << 26)
|
||||
#define OMAP3430_ST_MSPRO (1 << 23)
|
||||
#define OMAP3430_ST_HDQ (1 << 22)
|
||||
#define OMAP3430ES1_ST_FAC (1 << 8)
|
||||
#define OMAP3430ES1_ST_MAILBOXES (1 << 7)
|
||||
#define OMAP3430_ST_OMAPCTRL (1 << 6)
|
||||
#define OMAP3430_ST_SDMA (1 << 2)
|
||||
#define OMAP3430_ST_SDRC (1 << 1)
|
||||
#define OMAP3430_ST_SSI (1 << 0)
|
||||
|
||||
/* CM_IDLEST2_CORE */
|
||||
#define OMAP3430_ST_PKA (1 << 4)
|
||||
#define OMAP3430_ST_AES1 (1 << 3)
|
||||
#define OMAP3430_ST_RNG (1 << 2)
|
||||
#define OMAP3430_ST_SHA11 (1 << 1)
|
||||
#define OMAP3430_ST_DES1 (1 << 0)
|
||||
|
||||
/* CM_IDLEST3_CORE */
|
||||
#define OMAP3430ES2_ST_USBTLL_SHIFT 2
|
||||
#define OMAP3430ES2_ST_USBTLL_MASK (1 << 2)
|
||||
|
||||
/* CM_AUTOIDLE1_CORE */
|
||||
#define OMAP3430_AUTO_AES2 (1 << 28)
|
||||
#define OMAP3430_AUTO_AES2_SHIFT 28
|
||||
#define OMAP3430_AUTO_SHA12 (1 << 27)
|
||||
#define OMAP3430_AUTO_SHA12_SHIFT 27
|
||||
#define OMAP3430_AUTO_DES2 (1 << 26)
|
||||
#define OMAP3430_AUTO_DES2_SHIFT 26
|
||||
#define OMAP3430_AUTO_MMC2 (1 << 25)
|
||||
#define OMAP3430_AUTO_MMC2_SHIFT 25
|
||||
#define OMAP3430_AUTO_MMC1 (1 << 24)
|
||||
#define OMAP3430_AUTO_MMC1_SHIFT 24
|
||||
#define OMAP3430_AUTO_MSPRO (1 << 23)
|
||||
#define OMAP3430_AUTO_MSPRO_SHIFT 23
|
||||
#define OMAP3430_AUTO_HDQ (1 << 22)
|
||||
#define OMAP3430_AUTO_HDQ_SHIFT 22
|
||||
#define OMAP3430_AUTO_MCSPI4 (1 << 21)
|
||||
#define OMAP3430_AUTO_MCSPI4_SHIFT 21
|
||||
#define OMAP3430_AUTO_MCSPI3 (1 << 20)
|
||||
#define OMAP3430_AUTO_MCSPI3_SHIFT 20
|
||||
#define OMAP3430_AUTO_MCSPI2 (1 << 19)
|
||||
#define OMAP3430_AUTO_MCSPI2_SHIFT 19
|
||||
#define OMAP3430_AUTO_MCSPI1 (1 << 18)
|
||||
#define OMAP3430_AUTO_MCSPI1_SHIFT 18
|
||||
#define OMAP3430_AUTO_I2C3 (1 << 17)
|
||||
#define OMAP3430_AUTO_I2C3_SHIFT 17
|
||||
#define OMAP3430_AUTO_I2C2 (1 << 16)
|
||||
#define OMAP3430_AUTO_I2C2_SHIFT 16
|
||||
#define OMAP3430_AUTO_I2C1 (1 << 15)
|
||||
#define OMAP3430_AUTO_I2C1_SHIFT 15
|
||||
#define OMAP3430_AUTO_UART2 (1 << 14)
|
||||
#define OMAP3430_AUTO_UART2_SHIFT 14
|
||||
#define OMAP3430_AUTO_UART1 (1 << 13)
|
||||
#define OMAP3430_AUTO_UART1_SHIFT 13
|
||||
#define OMAP3430_AUTO_GPT11 (1 << 12)
|
||||
#define OMAP3430_AUTO_GPT11_SHIFT 12
|
||||
#define OMAP3430_AUTO_GPT10 (1 << 11)
|
||||
#define OMAP3430_AUTO_GPT10_SHIFT 11
|
||||
#define OMAP3430_AUTO_MCBSP5 (1 << 10)
|
||||
#define OMAP3430_AUTO_MCBSP5_SHIFT 10
|
||||
#define OMAP3430_AUTO_MCBSP1 (1 << 9)
|
||||
#define OMAP3430_AUTO_MCBSP1_SHIFT 9
|
||||
#define OMAP3430ES1_AUTO_FAC (1 << 8)
|
||||
#define OMAP3430ES1_AUTO_FAC_SHIFT 8
|
||||
#define OMAP3430_AUTO_MAILBOXES (1 << 7)
|
||||
#define OMAP3430_AUTO_MAILBOXES_SHIFT 7
|
||||
#define OMAP3430_AUTO_OMAPCTRL (1 << 6)
|
||||
#define OMAP3430_AUTO_OMAPCTRL_SHIFT 6
|
||||
#define OMAP3430ES1_AUTO_FSHOSTUSB (1 << 5)
|
||||
#define OMAP3430ES1_AUTO_FSHOSTUSB_SHIFT 5
|
||||
#define OMAP3430_AUTO_HSOTGUSB (1 << 4)
|
||||
#define OMAP3430_AUTO_HSOTGUSB_SHIFT 4
|
||||
#define OMAP3430ES1_AUTO_D2D (1 << 3)
|
||||
#define OMAP3430ES1_AUTO_D2D_SHIFT 3
|
||||
#define OMAP3430_AUTO_SSI (1 << 0)
|
||||
#define OMAP3430_AUTO_SSI_SHIFT 0
|
||||
|
||||
/* CM_AUTOIDLE2_CORE */
|
||||
#define OMAP3430_AUTO_PKA (1 << 4)
|
||||
#define OMAP3430_AUTO_PKA_SHIFT 4
|
||||
#define OMAP3430_AUTO_AES1 (1 << 3)
|
||||
#define OMAP3430_AUTO_AES1_SHIFT 3
|
||||
#define OMAP3430_AUTO_RNG (1 << 2)
|
||||
#define OMAP3430_AUTO_RNG_SHIFT 2
|
||||
#define OMAP3430_AUTO_SHA11 (1 << 1)
|
||||
#define OMAP3430_AUTO_SHA11_SHIFT 1
|
||||
#define OMAP3430_AUTO_DES1 (1 << 0)
|
||||
#define OMAP3430_AUTO_DES1_SHIFT 0
|
||||
|
||||
/* CM_AUTOIDLE3_CORE */
|
||||
#define OMAP3430ES2_AUTO_USBTLL_SHIFT 2
|
||||
#define OMAP3430ES2_AUTO_USBTLL_MASK (1 << 2)
|
||||
|
||||
/* CM_CLKSEL_CORE */
|
||||
#define OMAP3430_CLKSEL_SSI_SHIFT 8
|
||||
#define OMAP3430_CLKSEL_SSI_MASK (0xf << 8)
|
||||
#define OMAP3430_CLKSEL_GPT11_MASK (1 << 7)
|
||||
#define OMAP3430_CLKSEL_GPT11_SHIFT 7
|
||||
#define OMAP3430_CLKSEL_GPT10_MASK (1 << 6)
|
||||
#define OMAP3430_CLKSEL_GPT10_SHIFT 6
|
||||
#define OMAP3430ES1_CLKSEL_FSHOSTUSB_SHIFT 4
|
||||
#define OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK (0x3 << 4)
|
||||
#define OMAP3430_CLKSEL_L4_SHIFT 2
|
||||
#define OMAP3430_CLKSEL_L4_MASK (0x3 << 2)
|
||||
#define OMAP3430_CLKSEL_L3_SHIFT 0
|
||||
#define OMAP3430_CLKSEL_L3_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_CORE */
|
||||
#define OMAP3430ES1_CLKTRCTRL_D2D_SHIFT 4
|
||||
#define OMAP3430ES1_CLKTRCTRL_D2D_MASK (0x3 << 4)
|
||||
#define OMAP3430_CLKTRCTRL_L4_SHIFT 2
|
||||
#define OMAP3430_CLKTRCTRL_L4_MASK (0x3 << 2)
|
||||
#define OMAP3430_CLKTRCTRL_L3_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_L3_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_CORE */
|
||||
#define OMAP3430ES1_CLKACTIVITY_D2D (1 << 2)
|
||||
#define OMAP3430_CLKACTIVITY_L4 (1 << 1)
|
||||
#define OMAP3430_CLKACTIVITY_L3 (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_GFX */
|
||||
#define OMAP3430ES1_EN_3D (1 << 2)
|
||||
#define OMAP3430ES1_EN_3D_SHIFT 2
|
||||
#define OMAP3430ES1_EN_2D (1 << 1)
|
||||
#define OMAP3430ES1_EN_2D_SHIFT 1
|
||||
|
||||
/* CM_ICLKEN_GFX specific bits */
|
||||
|
||||
/* CM_IDLEST_GFX specific bits */
|
||||
|
||||
/* CM_CLKSEL_GFX specific bits */
|
||||
|
||||
/* CM_SLEEPDEP_GFX specific bits */
|
||||
|
||||
/* CM_CLKSTCTRL_GFX */
|
||||
#define OMAP3430ES1_CLKTRCTRL_GFX_SHIFT 0
|
||||
#define OMAP3430ES1_CLKTRCTRL_GFX_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_GFX */
|
||||
#define OMAP3430ES1_CLKACTIVITY_GFX (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_SGX */
|
||||
#define OMAP3430ES2_EN_SGX_SHIFT 1
|
||||
#define OMAP3430ES2_EN_SGX_MASK (1 << 1)
|
||||
|
||||
/* CM_CLKSEL_SGX */
|
||||
#define OMAP3430ES2_CLKSEL_SGX_SHIFT 0
|
||||
#define OMAP3430ES2_CLKSEL_SGX_MASK (0x7 << 0)
|
||||
|
||||
/* CM_FCLKEN_WKUP specific bits */
|
||||
#define OMAP3430ES2_EN_USIMOCP_SHIFT 9
|
||||
|
||||
/* CM_ICLKEN_WKUP specific bits */
|
||||
#define OMAP3430_EN_WDT1 (1 << 4)
|
||||
#define OMAP3430_EN_WDT1_SHIFT 4
|
||||
#define OMAP3430_EN_32KSYNC (1 << 2)
|
||||
#define OMAP3430_EN_32KSYNC_SHIFT 2
|
||||
|
||||
/* CM_IDLEST_WKUP specific bits */
|
||||
#define OMAP3430_ST_WDT2 (1 << 5)
|
||||
#define OMAP3430_ST_WDT1 (1 << 4)
|
||||
#define OMAP3430_ST_32KSYNC (1 << 2)
|
||||
|
||||
/* CM_AUTOIDLE_WKUP */
|
||||
#define OMAP3430_AUTO_WDT2 (1 << 5)
|
||||
#define OMAP3430_AUTO_WDT2_SHIFT 5
|
||||
#define OMAP3430_AUTO_WDT1 (1 << 4)
|
||||
#define OMAP3430_AUTO_WDT1_SHIFT 4
|
||||
#define OMAP3430_AUTO_GPIO1 (1 << 3)
|
||||
#define OMAP3430_AUTO_GPIO1_SHIFT 3
|
||||
#define OMAP3430_AUTO_32KSYNC (1 << 2)
|
||||
#define OMAP3430_AUTO_32KSYNC_SHIFT 2
|
||||
#define OMAP3430_AUTO_GPT12 (1 << 1)
|
||||
#define OMAP3430_AUTO_GPT12_SHIFT 1
|
||||
#define OMAP3430_AUTO_GPT1 (1 << 0)
|
||||
#define OMAP3430_AUTO_GPT1_SHIFT 0
|
||||
|
||||
/* CM_CLKSEL_WKUP */
|
||||
#define OMAP3430ES2_CLKSEL_USIMOCP_MASK (0xf << 3)
|
||||
#define OMAP3430_CLKSEL_RM_SHIFT 1
|
||||
#define OMAP3430_CLKSEL_RM_MASK (0x3 << 1)
|
||||
#define OMAP3430_CLKSEL_GPT1_SHIFT 0
|
||||
#define OMAP3430_CLKSEL_GPT1_MASK (1 << 0)
|
||||
|
||||
/* CM_CLKEN_PLL */
|
||||
#define OMAP3430_PWRDN_EMU_PERIPH_SHIFT 31
|
||||
#define OMAP3430_PWRDN_CAM_SHIFT 30
|
||||
#define OMAP3430_PWRDN_DSS1_SHIFT 29
|
||||
#define OMAP3430_PWRDN_TV_SHIFT 28
|
||||
#define OMAP3430_PWRDN_96M_SHIFT 27
|
||||
#define OMAP3430_PERIPH_DPLL_RAMPTIME_SHIFT 24
|
||||
#define OMAP3430_PERIPH_DPLL_RAMPTIME_MASK (0x3 << 24)
|
||||
#define OMAP3430_PERIPH_DPLL_FREQSEL_SHIFT 20
|
||||
#define OMAP3430_PERIPH_DPLL_FREQSEL_MASK (0xf << 20)
|
||||
#define OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT 19
|
||||
#define OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_MASK (1 << 19)
|
||||
#define OMAP3430_EN_PERIPH_DPLL_SHIFT 16
|
||||
#define OMAP3430_EN_PERIPH_DPLL_MASK (0x7 << 16)
|
||||
#define OMAP3430_PWRDN_EMU_CORE_SHIFT 12
|
||||
#define OMAP3430_CORE_DPLL_RAMPTIME_SHIFT 8
|
||||
#define OMAP3430_CORE_DPLL_RAMPTIME_MASK (0x3 << 8)
|
||||
#define OMAP3430_CORE_DPLL_FREQSEL_SHIFT 4
|
||||
#define OMAP3430_CORE_DPLL_FREQSEL_MASK (0xf << 4)
|
||||
#define OMAP3430_EN_CORE_DPLL_DRIFTGUARD_SHIFT 3
|
||||
#define OMAP3430_EN_CORE_DPLL_DRIFTGUARD_MASK (1 << 3)
|
||||
#define OMAP3430_EN_CORE_DPLL_SHIFT 0
|
||||
#define OMAP3430_EN_CORE_DPLL_MASK (0x7 << 0)
|
||||
|
||||
/* CM_CLKEN2_PLL */
|
||||
#define OMAP3430ES2_EN_PERIPH2_DPLL_LPMODE_SHIFT 10
|
||||
#define OMAP3430ES2_PERIPH2_DPLL_RAMPTIME_MASK (0x3 << 8)
|
||||
#define OMAP3430ES2_PERIPH2_DPLL_FREQSEL_SHIFT 4
|
||||
#define OMAP3430ES2_PERIPH2_DPLL_FREQSEL_MASK (0xf << 4)
|
||||
#define OMAP3430ES2_EN_PERIPH2_DPLL_DRIFTGUARD_SHIFT 3
|
||||
#define OMAP3430ES2_EN_PERIPH2_DPLL_SHIFT 0
|
||||
#define OMAP3430ES2_EN_PERIPH2_DPLL_MASK (0x7 << 0)
|
||||
|
||||
/* CM_IDLEST_CKGEN */
|
||||
#define OMAP3430_ST_54M_CLK (1 << 5)
|
||||
#define OMAP3430_ST_12M_CLK (1 << 4)
|
||||
#define OMAP3430_ST_48M_CLK (1 << 3)
|
||||
#define OMAP3430_ST_96M_CLK (1 << 2)
|
||||
#define OMAP3430_ST_PERIPH_CLK (1 << 1)
|
||||
#define OMAP3430_ST_CORE_CLK (1 << 0)
|
||||
|
||||
/* CM_IDLEST2_CKGEN */
|
||||
#define OMAP3430ES2_ST_120M_CLK_SHIFT 1
|
||||
#define OMAP3430ES2_ST_120M_CLK_MASK (1 << 1)
|
||||
#define OMAP3430ES2_ST_PERIPH2_CLK_SHIFT 0
|
||||
#define OMAP3430ES2_ST_PERIPH2_CLK_MASK (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_PLL */
|
||||
#define OMAP3430_AUTO_PERIPH_DPLL_SHIFT 3
|
||||
#define OMAP3430_AUTO_PERIPH_DPLL_MASK (0x7 << 3)
|
||||
#define OMAP3430_AUTO_CORE_DPLL_SHIFT 0
|
||||
#define OMAP3430_AUTO_CORE_DPLL_MASK (0x7 << 0)
|
||||
|
||||
/* CM_CLKSEL1_PLL */
|
||||
/* Note that OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK was (0x3 << 27) on 3430ES1 */
|
||||
#define OMAP3430_CORE_DPLL_CLKOUT_DIV_SHIFT 27
|
||||
#define OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK (0x1f << 27)
|
||||
#define OMAP3430_CORE_DPLL_MULT_SHIFT 16
|
||||
#define OMAP3430_CORE_DPLL_MULT_MASK (0x7ff << 16)
|
||||
#define OMAP3430_CORE_DPLL_DIV_SHIFT 8
|
||||
#define OMAP3430_CORE_DPLL_DIV_MASK (0x7f << 8)
|
||||
#define OMAP3430_SOURCE_54M (1 << 5)
|
||||
#define OMAP3430_SOURCE_48M (1 << 3)
|
||||
|
||||
/* CM_CLKSEL2_PLL */
|
||||
#define OMAP3430_PERIPH_DPLL_MULT_SHIFT 8
|
||||
#define OMAP3430_PERIPH_DPLL_MULT_MASK (0x7ff << 8)
|
||||
#define OMAP3430_PERIPH_DPLL_DIV_SHIFT 0
|
||||
#define OMAP3430_PERIPH_DPLL_DIV_MASK (0x7f << 0)
|
||||
|
||||
/* CM_CLKSEL3_PLL */
|
||||
#define OMAP3430_DIV_96M_SHIFT 0
|
||||
#define OMAP3430_DIV_96M_MASK (0x1f << 0)
|
||||
|
||||
/* CM_CLKSEL4_PLL */
|
||||
#define OMAP3430ES2_PERIPH2_DPLL_MULT_SHIFT 8
|
||||
#define OMAP3430ES2_PERIPH2_DPLL_MULT_MASK (0x7ff << 8)
|
||||
#define OMAP3430ES2_PERIPH2_DPLL_DIV_SHIFT 0
|
||||
#define OMAP3430ES2_PERIPH2_DPLL_DIV_MASK (0x7f << 0)
|
||||
|
||||
/* CM_CLKSEL5_PLL */
|
||||
#define OMAP3430ES2_DIV_120M_SHIFT 0
|
||||
#define OMAP3430ES2_DIV_120M_MASK (0x1f << 0)
|
||||
|
||||
/* CM_CLKOUT_CTRL */
|
||||
#define OMAP3430_CLKOUT2_EN_SHIFT 7
|
||||
#define OMAP3430_CLKOUT2_EN (1 << 7)
|
||||
#define OMAP3430_CLKOUT2_DIV_SHIFT 3
|
||||
#define OMAP3430_CLKOUT2_DIV_MASK (0x7 << 3)
|
||||
#define OMAP3430_CLKOUT2SOURCE_SHIFT 0
|
||||
#define OMAP3430_CLKOUT2SOURCE_MASK (0x3 << 0)
|
||||
|
||||
/* CM_FCLKEN_DSS */
|
||||
#define OMAP3430_EN_TV (1 << 2)
|
||||
#define OMAP3430_EN_TV_SHIFT 2
|
||||
#define OMAP3430_EN_DSS2 (1 << 1)
|
||||
#define OMAP3430_EN_DSS2_SHIFT 1
|
||||
#define OMAP3430_EN_DSS1 (1 << 0)
|
||||
#define OMAP3430_EN_DSS1_SHIFT 0
|
||||
|
||||
/* CM_ICLKEN_DSS */
|
||||
#define OMAP3430_CM_ICLKEN_DSS_EN_DSS (1 << 0)
|
||||
#define OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT 0
|
||||
|
||||
/* CM_IDLEST_DSS */
|
||||
#define OMAP3430_ST_DSS (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_DSS */
|
||||
#define OMAP3430_AUTO_DSS (1 << 0)
|
||||
#define OMAP3430_AUTO_DSS_SHIFT 0
|
||||
|
||||
/* CM_CLKSEL_DSS */
|
||||
#define OMAP3430_CLKSEL_TV_SHIFT 8
|
||||
#define OMAP3430_CLKSEL_TV_MASK (0x1f << 8)
|
||||
#define OMAP3430_CLKSEL_DSS1_SHIFT 0
|
||||
#define OMAP3430_CLKSEL_DSS1_MASK (0x1f << 0)
|
||||
|
||||
/* CM_SLEEPDEP_DSS specific bits */
|
||||
|
||||
/* CM_CLKSTCTRL_DSS */
|
||||
#define OMAP3430_CLKTRCTRL_DSS_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_DSS_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_DSS */
|
||||
#define OMAP3430_CLKACTIVITY_DSS (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_CAM specific bits */
|
||||
|
||||
/* CM_ICLKEN_CAM specific bits */
|
||||
|
||||
/* CM_IDLEST_CAM */
|
||||
#define OMAP3430_ST_CAM (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_CAM */
|
||||
#define OMAP3430_AUTO_CAM (1 << 0)
|
||||
#define OMAP3430_AUTO_CAM_SHIFT 0
|
||||
|
||||
/* CM_CLKSEL_CAM */
|
||||
#define OMAP3430_CLKSEL_CAM_SHIFT 0
|
||||
#define OMAP3430_CLKSEL_CAM_MASK (0x1f << 0)
|
||||
|
||||
/* CM_SLEEPDEP_CAM specific bits */
|
||||
|
||||
/* CM_CLKSTCTRL_CAM */
|
||||
#define OMAP3430_CLKTRCTRL_CAM_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_CAM_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_CAM */
|
||||
#define OMAP3430_CLKACTIVITY_CAM (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_PER specific bits */
|
||||
|
||||
/* CM_ICLKEN_PER specific bits */
|
||||
|
||||
/* CM_IDLEST_PER */
|
||||
#define OMAP3430_ST_WDT3 (1 << 12)
|
||||
#define OMAP3430_ST_MCBSP4 (1 << 2)
|
||||
#define OMAP3430_ST_MCBSP3 (1 << 1)
|
||||
#define OMAP3430_ST_MCBSP2 (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_PER */
|
||||
#define OMAP3430_AUTO_GPIO6 (1 << 17)
|
||||
#define OMAP3430_AUTO_GPIO6_SHIFT 17
|
||||
#define OMAP3430_AUTO_GPIO5 (1 << 16)
|
||||
#define OMAP3430_AUTO_GPIO5_SHIFT 16
|
||||
#define OMAP3430_AUTO_GPIO4 (1 << 15)
|
||||
#define OMAP3430_AUTO_GPIO4_SHIFT 15
|
||||
#define OMAP3430_AUTO_GPIO3 (1 << 14)
|
||||
#define OMAP3430_AUTO_GPIO3_SHIFT 14
|
||||
#define OMAP3430_AUTO_GPIO2 (1 << 13)
|
||||
#define OMAP3430_AUTO_GPIO2_SHIFT 13
|
||||
#define OMAP3430_AUTO_WDT3 (1 << 12)
|
||||
#define OMAP3430_AUTO_WDT3_SHIFT 12
|
||||
#define OMAP3430_AUTO_UART3 (1 << 11)
|
||||
#define OMAP3430_AUTO_UART3_SHIFT 11
|
||||
#define OMAP3430_AUTO_GPT9 (1 << 10)
|
||||
#define OMAP3430_AUTO_GPT9_SHIFT 10
|
||||
#define OMAP3430_AUTO_GPT8 (1 << 9)
|
||||
#define OMAP3430_AUTO_GPT8_SHIFT 9
|
||||
#define OMAP3430_AUTO_GPT7 (1 << 8)
|
||||
#define OMAP3430_AUTO_GPT7_SHIFT 8
|
||||
#define OMAP3430_AUTO_GPT6 (1 << 7)
|
||||
#define OMAP3430_AUTO_GPT6_SHIFT 7
|
||||
#define OMAP3430_AUTO_GPT5 (1 << 6)
|
||||
#define OMAP3430_AUTO_GPT5_SHIFT 6
|
||||
#define OMAP3430_AUTO_GPT4 (1 << 5)
|
||||
#define OMAP3430_AUTO_GPT4_SHIFT 5
|
||||
#define OMAP3430_AUTO_GPT3 (1 << 4)
|
||||
#define OMAP3430_AUTO_GPT3_SHIFT 4
|
||||
#define OMAP3430_AUTO_GPT2 (1 << 3)
|
||||
#define OMAP3430_AUTO_GPT2_SHIFT 3
|
||||
#define OMAP3430_AUTO_MCBSP4 (1 << 2)
|
||||
#define OMAP3430_AUTO_MCBSP4_SHIFT 2
|
||||
#define OMAP3430_AUTO_MCBSP3 (1 << 1)
|
||||
#define OMAP3430_AUTO_MCBSP3_SHIFT 1
|
||||
#define OMAP3430_AUTO_MCBSP2 (1 << 0)
|
||||
#define OMAP3430_AUTO_MCBSP2_SHIFT 0
|
||||
|
||||
/* CM_CLKSEL_PER */
|
||||
#define OMAP3430_CLKSEL_GPT9_MASK (1 << 7)
|
||||
#define OMAP3430_CLKSEL_GPT9_SHIFT 7
|
||||
#define OMAP3430_CLKSEL_GPT8_MASK (1 << 6)
|
||||
#define OMAP3430_CLKSEL_GPT8_SHIFT 6
|
||||
#define OMAP3430_CLKSEL_GPT7_MASK (1 << 5)
|
||||
#define OMAP3430_CLKSEL_GPT7_SHIFT 5
|
||||
#define OMAP3430_CLKSEL_GPT6_MASK (1 << 4)
|
||||
#define OMAP3430_CLKSEL_GPT6_SHIFT 4
|
||||
#define OMAP3430_CLKSEL_GPT5_MASK (1 << 3)
|
||||
#define OMAP3430_CLKSEL_GPT5_SHIFT 3
|
||||
#define OMAP3430_CLKSEL_GPT4_MASK (1 << 2)
|
||||
#define OMAP3430_CLKSEL_GPT4_SHIFT 2
|
||||
#define OMAP3430_CLKSEL_GPT3_MASK (1 << 1)
|
||||
#define OMAP3430_CLKSEL_GPT3_SHIFT 1
|
||||
#define OMAP3430_CLKSEL_GPT2_MASK (1 << 0)
|
||||
#define OMAP3430_CLKSEL_GPT2_SHIFT 0
|
||||
|
||||
/* CM_SLEEPDEP_PER specific bits */
|
||||
#define OMAP3430_CM_SLEEPDEP_PER_EN_IVA2 (1 << 2)
|
||||
|
||||
/* CM_CLKSTCTRL_PER */
|
||||
#define OMAP3430_CLKTRCTRL_PER_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_PER_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_PER */
|
||||
#define OMAP3430_CLKACTIVITY_PER (1 << 0)
|
||||
|
||||
/* CM_CLKSEL1_EMU */
|
||||
#define OMAP3430_DIV_DPLL4_SHIFT 24
|
||||
#define OMAP3430_DIV_DPLL4_MASK (0x1f << 24)
|
||||
#define OMAP3430_DIV_DPLL3_SHIFT 16
|
||||
#define OMAP3430_DIV_DPLL3_MASK (0x1f << 16)
|
||||
#define OMAP3430_CLKSEL_TRACECLK_SHIFT 11
|
||||
#define OMAP3430_CLKSEL_TRACECLK_MASK (0x7 << 11)
|
||||
#define OMAP3430_CLKSEL_PCLK_SHIFT 8
|
||||
#define OMAP3430_CLKSEL_PCLK_MASK (0x7 << 8)
|
||||
#define OMAP3430_CLKSEL_PCLKX2_SHIFT 6
|
||||
#define OMAP3430_CLKSEL_PCLKX2_MASK (0x3 << 6)
|
||||
#define OMAP3430_CLKSEL_ATCLK_SHIFT 4
|
||||
#define OMAP3430_CLKSEL_ATCLK_MASK (0x3 << 4)
|
||||
#define OMAP3430_TRACE_MUX_CTRL_SHIFT 2
|
||||
#define OMAP3430_TRACE_MUX_CTRL_MASK (0x3 << 2)
|
||||
#define OMAP3430_MUX_CTRL_SHIFT 0
|
||||
#define OMAP3430_MUX_CTRL_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_EMU */
|
||||
#define OMAP3430_CLKTRCTRL_EMU_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_EMU_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_EMU */
|
||||
#define OMAP3430_CLKACTIVITY_EMU (1 << 0)
|
||||
|
||||
/* CM_CLKSEL2_EMU specific bits */
|
||||
#define OMAP3430_CORE_DPLL_EMU_MULT_SHIFT 8
|
||||
#define OMAP3430_CORE_DPLL_EMU_MULT_MASK (0x7ff << 8)
|
||||
#define OMAP3430_CORE_DPLL_EMU_DIV_SHIFT 0
|
||||
#define OMAP3430_CORE_DPLL_EMU_DIV_MASK (0x7f << 0)
|
||||
|
||||
/* CM_CLKSEL3_EMU specific bits */
|
||||
#define OMAP3430_PERIPH_DPLL_EMU_MULT_SHIFT 8
|
||||
#define OMAP3430_PERIPH_DPLL_EMU_MULT_MASK (0x7ff << 8)
|
||||
#define OMAP3430_PERIPH_DPLL_EMU_DIV_SHIFT 0
|
||||
#define OMAP3430_PERIPH_DPLL_EMU_DIV_MASK (0x7f << 0)
|
||||
|
||||
/* CM_POLCTRL */
|
||||
#define OMAP3430_CLKOUT2_POL (1 << 0)
|
||||
|
||||
/* CM_IDLEST_NEON */
|
||||
#define OMAP3430_ST_NEON (1 << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_NEON */
|
||||
#define OMAP3430_CLKTRCTRL_NEON_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_NEON_MASK (0x3 << 0)
|
||||
|
||||
/* CM_FCLKEN_USBHOST */
|
||||
#define OMAP3430ES2_EN_USBHOST2_SHIFT 1
|
||||
#define OMAP3430ES2_EN_USBHOST2_MASK (1 << 1)
|
||||
#define OMAP3430ES2_EN_USBHOST1_SHIFT 0
|
||||
#define OMAP3430ES2_EN_USBHOST1_MASK (1 << 0)
|
||||
|
||||
/* CM_ICLKEN_USBHOST */
|
||||
#define OMAP3430ES2_EN_USBHOST_SHIFT 0
|
||||
#define OMAP3430ES2_EN_USBHOST_MASK (1 << 0)
|
||||
|
||||
/* CM_IDLEST_USBHOST */
|
||||
|
||||
/* CM_AUTOIDLE_USBHOST */
|
||||
#define OMAP3430ES2_AUTO_USBHOST_SHIFT 0
|
||||
#define OMAP3430ES2_AUTO_USBHOST_MASK (1 << 0)
|
||||
|
||||
/* CM_SLEEPDEP_USBHOST */
|
||||
#define OMAP3430ES2_EN_MPU_SHIFT 1
|
||||
#define OMAP3430ES2_EN_MPU_MASK (1 << 1)
|
||||
#define OMAP3430ES2_EN_IVA2_SHIFT 2
|
||||
#define OMAP3430ES2_EN_IVA2_MASK (1 << 2)
|
||||
|
||||
/* CM_CLKSTCTRL_USBHOST */
|
||||
#define OMAP3430ES2_CLKTRCTRL_USBHOST_SHIFT 0
|
||||
#define OMAP3430ES2_CLKTRCTRL_USBHOST_MASK (3 << 0)
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
124
arch/arm/mach-omap2/cm.h
Normal file
124
arch/arm/mach-omap2/cm.h
Normal file
|
|
@ -0,0 +1,124 @@
|
|||
#ifndef __ARCH_ASM_MACH_OMAP2_CM_H
|
||||
#define __ARCH_ASM_MACH_OMAP2_CM_H
|
||||
|
||||
/*
|
||||
* OMAP2/3 Clock Management (CM) register definitions
|
||||
*
|
||||
* Copyright (C) 2007-2008 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007-2008 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* 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 "prcm-common.h"
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
#define OMAP_CM_REGADDR(module, reg) \
|
||||
(void __iomem *)IO_ADDRESS(OMAP2_CM_BASE + (module) + (reg))
|
||||
#else
|
||||
#define OMAP2420_CM_REGADDR(module, reg) \
|
||||
IO_ADDRESS(OMAP2420_CM_BASE + (module) + (reg))
|
||||
#define OMAP2430_CM_REGADDR(module, reg) \
|
||||
IO_ADDRESS(OMAP2430_CM_BASE + (module) + (reg))
|
||||
#define OMAP34XX_CM_REGADDR(module, reg) \
|
||||
IO_ADDRESS(OMAP3430_CM_BASE + (module) + (reg))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Architecture-specific global CM registers
|
||||
* Use cm_{read,write}_reg() with these registers.
|
||||
* These registers appear once per CM module.
|
||||
*/
|
||||
|
||||
#define OMAP3430_CM_REVISION OMAP_CM_REGADDR(OCP_MOD, 0x0000)
|
||||
#define OMAP3430_CM_SYSCONFIG OMAP_CM_REGADDR(OCP_MOD, 0x0010)
|
||||
#define OMAP3430_CM_POLCTRL OMAP_CM_REGADDR(OCP_MOD, 0x009c)
|
||||
|
||||
#define OMAP3430_CM_CLKOUT_CTRL OMAP_CM_REGADDR(OMAP3430_CCR_MOD, 0x0070)
|
||||
|
||||
/*
|
||||
* Module specific CM registers from CM_BASE + domain offset
|
||||
* Use cm_{read,write}_mod_reg() with these registers.
|
||||
* These register offsets generally appear in more than one PRCM submodule.
|
||||
*/
|
||||
|
||||
/* Common between 24xx and 34xx */
|
||||
|
||||
#define CM_FCLKEN 0x0000
|
||||
#define CM_FCLKEN1 CM_FCLKEN
|
||||
#define CM_CLKEN CM_FCLKEN
|
||||
#define CM_ICLKEN 0x0010
|
||||
#define CM_ICLKEN1 CM_ICLKEN
|
||||
#define CM_ICLKEN2 0x0014
|
||||
#define CM_ICLKEN3 0x0018
|
||||
#define CM_IDLEST 0x0020
|
||||
#define CM_IDLEST1 CM_IDLEST
|
||||
#define CM_IDLEST2 0x0024
|
||||
#define CM_AUTOIDLE 0x0030
|
||||
#define CM_AUTOIDLE1 CM_AUTOIDLE
|
||||
#define CM_AUTOIDLE2 0x0034
|
||||
#define CM_AUTOIDLE3 0x0038
|
||||
#define CM_CLKSEL 0x0040
|
||||
#define CM_CLKSEL1 CM_CLKSEL
|
||||
#define CM_CLKSEL2 0x0044
|
||||
#define CM_CLKSTCTRL 0x0048
|
||||
|
||||
|
||||
/* Architecture-specific registers */
|
||||
|
||||
#define OMAP24XX_CM_FCLKEN2 0x0004
|
||||
#define OMAP24XX_CM_ICLKEN4 0x001c
|
||||
#define OMAP24XX_CM_AUTOIDLE4 0x003c
|
||||
|
||||
#define OMAP2430_CM_IDLEST3 0x0028
|
||||
|
||||
#define OMAP3430_CM_CLKEN_PLL 0x0004
|
||||
#define OMAP3430ES2_CM_CLKEN2 0x0004
|
||||
#define OMAP3430ES2_CM_FCLKEN3 0x0008
|
||||
#define OMAP3430_CM_IDLEST_PLL CM_IDLEST2
|
||||
#define OMAP3430_CM_AUTOIDLE_PLL CM_AUTOIDLE2
|
||||
#define OMAP3430_CM_CLKSEL1 CM_CLKSEL
|
||||
#define OMAP3430_CM_CLKSEL1_PLL CM_CLKSEL
|
||||
#define OMAP3430_CM_CLKSEL2_PLL CM_CLKSEL2
|
||||
#define OMAP3430_CM_SLEEPDEP CM_CLKSEL2
|
||||
#define OMAP3430_CM_CLKSEL3 CM_CLKSTCTRL
|
||||
#define OMAP3430_CM_CLKSTST 0x004c
|
||||
#define OMAP3430ES2_CM_CLKSEL4 0x004c
|
||||
#define OMAP3430ES2_CM_CLKSEL5 0x0050
|
||||
#define OMAP3430_CM_CLKSEL2_EMU 0x0050
|
||||
#define OMAP3430_CM_CLKSEL3_EMU 0x0054
|
||||
|
||||
|
||||
/* Clock management domain register get/set */
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
static inline void cm_write_mod_reg(u32 val, s16 module, s16 idx)
|
||||
{
|
||||
__raw_writel(val, OMAP_CM_REGADDR(module, idx));
|
||||
}
|
||||
|
||||
static inline u32 cm_read_mod_reg(s16 module, s16 idx)
|
||||
{
|
||||
return __raw_readl(OMAP_CM_REGADDR(module, idx));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* CM register bits shared between 24XX and 3430 */
|
||||
|
||||
/* CM_CLKSEL_GFX */
|
||||
#define OMAP_CLKSEL_GFX_SHIFT 0
|
||||
#define OMAP_CLKSEL_GFX_MASK (0x7 << 0)
|
||||
|
||||
/* CM_ICLKEN_GFX */
|
||||
#define OMAP_EN_GFX_SHIFT 0
|
||||
#define OMAP_EN_GFX (1 << 0)
|
||||
|
||||
/* CM_IDLEST_GFX */
|
||||
#define OMAP_ST_GFX (1 << 0)
|
||||
|
||||
|
||||
#endif
|
||||
74
arch/arm/mach-omap2/control.c
Normal file
74
arch/arm/mach-omap2/control.c
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* OMAP2/3 System Control Module register access
|
||||
*
|
||||
* Copyright (C) 2007 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <asm/arch/control.h>
|
||||
|
||||
static u32 omap2_ctrl_base;
|
||||
|
||||
#define OMAP_CTRL_REGADDR(reg) (void __iomem *)IO_ADDRESS(omap2_ctrl_base \
|
||||
+ (reg))
|
||||
|
||||
void omap_ctrl_base_set(u32 base)
|
||||
{
|
||||
omap2_ctrl_base = base;
|
||||
}
|
||||
|
||||
u32 omap_ctrl_base_get(void)
|
||||
{
|
||||
return omap2_ctrl_base;
|
||||
}
|
||||
|
||||
u8 omap_ctrl_readb(u16 offset)
|
||||
{
|
||||
return __raw_readb(OMAP_CTRL_REGADDR(offset));
|
||||
}
|
||||
|
||||
u16 omap_ctrl_readw(u16 offset)
|
||||
{
|
||||
return __raw_readw(OMAP_CTRL_REGADDR(offset));
|
||||
}
|
||||
|
||||
u32 omap_ctrl_readl(u16 offset)
|
||||
{
|
||||
return __raw_readl(OMAP_CTRL_REGADDR(offset));
|
||||
}
|
||||
|
||||
void omap_ctrl_writeb(u8 val, u16 offset)
|
||||
{
|
||||
pr_debug("omap_ctrl_writeb: writing 0x%0x to 0x%0x\n", val,
|
||||
(u32)OMAP_CTRL_REGADDR(offset));
|
||||
|
||||
__raw_writeb(val, OMAP_CTRL_REGADDR(offset));
|
||||
}
|
||||
|
||||
void omap_ctrl_writew(u16 val, u16 offset)
|
||||
{
|
||||
pr_debug("omap_ctrl_writew: writing 0x%0x to 0x%0x\n", val,
|
||||
(u32)OMAP_CTRL_REGADDR(offset));
|
||||
|
||||
__raw_writew(val, OMAP_CTRL_REGADDR(offset));
|
||||
}
|
||||
|
||||
void omap_ctrl_writel(u32 val, u16 offset)
|
||||
{
|
||||
pr_debug("omap_ctrl_writel: writing 0x%0x to 0x%0x\n", val,
|
||||
(u32)OMAP_CTRL_REGADDR(offset));
|
||||
|
||||
__raw_writel(val, OMAP_CTRL_REGADDR(offset));
|
||||
}
|
||||
|
||||
|
|
@ -69,7 +69,7 @@ static void __iomem *gpmc_base =
|
|||
static void __iomem *gpmc_cs_base =
|
||||
(void __iomem *) IO_ADDRESS(GPMC_BASE) + GPMC_CS0;
|
||||
|
||||
static struct clk *gpmc_l3_clk;
|
||||
static struct clk *gpmc_fck;
|
||||
|
||||
static void gpmc_write_reg(int idx, u32 val)
|
||||
{
|
||||
|
|
@ -94,11 +94,10 @@ u32 gpmc_cs_read_reg(int cs, int idx)
|
|||
return __raw_readl(gpmc_cs_base + (cs * GPMC_CS_SIZE) + idx);
|
||||
}
|
||||
|
||||
/* TODO: Add support for gpmc_fck to clock framework and use it */
|
||||
unsigned long gpmc_get_fclk_period(void)
|
||||
{
|
||||
/* In picoseconds */
|
||||
return 1000000000 / ((clk_get_rate(gpmc_l3_clk)) / 1000);
|
||||
return 1000000000 / ((clk_get_rate(gpmc_fck)) / 1000);
|
||||
}
|
||||
|
||||
unsigned int gpmc_ns_to_ticks(unsigned int time_ns)
|
||||
|
|
@ -398,8 +397,11 @@ void __init gpmc_init(void)
|
|||
{
|
||||
u32 l;
|
||||
|
||||
gpmc_l3_clk = clk_get(NULL, "core_l3_ck");
|
||||
BUG_ON(IS_ERR(gpmc_l3_clk));
|
||||
gpmc_fck = clk_get(NULL, "gpmc_fck"); /* Always on ENABLE_ON_INIT */
|
||||
if (IS_ERR(gpmc_fck))
|
||||
WARN_ON(1);
|
||||
else
|
||||
clk_enable(gpmc_fck);
|
||||
|
||||
l = gpmc_read_reg(GPMC_REVISION);
|
||||
printk(KERN_INFO "GPMC revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f);
|
||||
|
|
|
|||
|
|
@ -27,11 +27,16 @@
|
|||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/sram.h>
|
||||
|
||||
#include "prcm-regs.h"
|
||||
#include "memory.h"
|
||||
#include "prm.h"
|
||||
|
||||
#include "memory.h"
|
||||
#include "sdrc.h"
|
||||
|
||||
unsigned long omap2_sdrc_base;
|
||||
unsigned long omap2_sms_base;
|
||||
|
||||
static struct memory_timings mem_timings;
|
||||
static u32 curr_perf_level = CORE_CLK_SRC_DPLL_X2;
|
||||
|
||||
u32 omap2_memory_get_slow_dll_ctrl(void)
|
||||
{
|
||||
|
|
@ -48,12 +53,60 @@ u32 omap2_memory_get_type(void)
|
|||
return mem_timings.m_type;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check the DLL lock state, and return tue if running in unlock mode.
|
||||
* This is needed to compensate for the shifted DLL value in unlock mode.
|
||||
*/
|
||||
u32 omap2_dll_force_needed(void)
|
||||
{
|
||||
/* dlla and dllb are a set */
|
||||
u32 dll_state = sdrc_read_reg(SDRC_DLLA_CTRL);
|
||||
|
||||
if ((dll_state & (1 << 2)) == (1 << 2))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* 'level' is the value to store to CM_CLKSEL2_PLL.CORE_CLK_SRC.
|
||||
* Practical values are CORE_CLK_SRC_DPLL (for CORE_CLK = DPLL_CLK) or
|
||||
* CORE_CLK_SRC_DPLL_X2 (for CORE_CLK = * DPLL_CLK * 2)
|
||||
*/
|
||||
u32 omap2_reprogram_sdrc(u32 level, u32 force)
|
||||
{
|
||||
u32 dll_ctrl, m_type;
|
||||
u32 prev = curr_perf_level;
|
||||
unsigned long flags;
|
||||
|
||||
if ((curr_perf_level == level) && !force)
|
||||
return prev;
|
||||
|
||||
if (level == CORE_CLK_SRC_DPLL) {
|
||||
dll_ctrl = omap2_memory_get_slow_dll_ctrl();
|
||||
} else if (level == CORE_CLK_SRC_DPLL_X2) {
|
||||
dll_ctrl = omap2_memory_get_fast_dll_ctrl();
|
||||
} else {
|
||||
return prev;
|
||||
}
|
||||
|
||||
m_type = omap2_memory_get_type();
|
||||
|
||||
local_irq_save(flags);
|
||||
__raw_writel(0xffff, OMAP24XX_PRCM_VOLTSETUP);
|
||||
omap2_sram_reprogram_sdrc(level, dll_ctrl, m_type);
|
||||
curr_perf_level = level;
|
||||
local_irq_restore(flags);
|
||||
|
||||
return prev;
|
||||
}
|
||||
|
||||
void omap2_init_memory_params(u32 force_lock_to_unlock_mode)
|
||||
{
|
||||
unsigned long dll_cnt;
|
||||
u32 fast_dll = 0;
|
||||
|
||||
mem_timings.m_type = !((SDRC_MR_0 & 0x3) == 0x1); /* DDR = 1, SDR = 0 */
|
||||
mem_timings.m_type = !((sdrc_read_reg(SDRC_MR_0) & 0x3) == 0x1); /* DDR = 1, SDR = 0 */
|
||||
|
||||
/* 2422 es2.05 and beyond has a single SIP DDR instead of 2 like others.
|
||||
* In the case of 2422, its ok to use CS1 instead of CS0.
|
||||
|
|
@ -73,11 +126,11 @@ void omap2_init_memory_params(u32 force_lock_to_unlock_mode)
|
|||
mem_timings.dll_mode = M_LOCK;
|
||||
|
||||
if (mem_timings.base_cs == 0) {
|
||||
fast_dll = SDRC_DLLA_CTRL;
|
||||
dll_cnt = SDRC_DLLA_STATUS & 0xff00;
|
||||
fast_dll = sdrc_read_reg(SDRC_DLLA_CTRL);
|
||||
dll_cnt = sdrc_read_reg(SDRC_DLLA_STATUS) & 0xff00;
|
||||
} else {
|
||||
fast_dll = SDRC_DLLB_CTRL;
|
||||
dll_cnt = SDRC_DLLB_STATUS & 0xff00;
|
||||
fast_dll = sdrc_read_reg(SDRC_DLLB_CTRL);
|
||||
dll_cnt = sdrc_read_reg(SDRC_DLLB_STATUS) & 0xff00;
|
||||
}
|
||||
if (force_lock_to_unlock_mode) {
|
||||
fast_dll &= ~0xff00;
|
||||
|
|
@ -106,14 +159,13 @@ void __init omap2_init_memory(void)
|
|||
{
|
||||
u32 l;
|
||||
|
||||
l = SMS_SYSCONFIG;
|
||||
l = sms_read_reg(SMS_SYSCONFIG);
|
||||
l &= ~(0x3 << 3);
|
||||
l |= (0x2 << 3);
|
||||
SMS_SYSCONFIG = l;
|
||||
sms_write_reg(l, SMS_SYSCONFIG);
|
||||
|
||||
l = SDRC_SYSCONFIG;
|
||||
l = sdrc_read_reg(SDRC_SYSCONFIG);
|
||||
l &= ~(0x3 << 3);
|
||||
l |= (0x2 << 3);
|
||||
SDRC_SYSCONFIG = l;
|
||||
|
||||
sdrc_write_reg(l, SDRC_SYSCONFIG);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,3 +32,5 @@ extern void omap2_init_memory_params(u32 force_lock_to_unlock_mode);
|
|||
extern u32 omap2_memory_get_slow_dll_ctrl(void);
|
||||
extern u32 omap2_memory_get_fast_dll_ctrl(void);
|
||||
extern u32 omap2_memory_get_type(void);
|
||||
u32 omap2_dll_force_needed(void);
|
||||
u32 omap2_reprogram_sdrc(u32 level, u32 force);
|
||||
|
|
|
|||
|
|
@ -1,11 +1,12 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap2/mux.c
|
||||
*
|
||||
* OMAP1 pin multiplexing configurations
|
||||
* OMAP2 pin multiplexing configurations
|
||||
*
|
||||
* Copyright (C) 2003 - 2005 Nokia Corporation
|
||||
* Copyright (C) 2004 - 2008 Texas Instruments Inc.
|
||||
* Copyright (C) 2003 - 2008 Nokia Corporation
|
||||
*
|
||||
* Written by Tony Lindgren <tony.lindgren@nokia.com>
|
||||
* Written by Tony Lindgren
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -28,13 +29,17 @@
|
|||
#include <asm/io.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <asm/arch/control.h>
|
||||
#include <asm/arch/mux.h>
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX
|
||||
|
||||
static struct omap_mux_cfg arch_mux_cfg;
|
||||
|
||||
/* NOTE: See mux.h for the enumeration */
|
||||
|
||||
struct pin_config __initdata_or_module omap24xx_pins[] = {
|
||||
#ifdef CONFIG_ARCH_OMAP24XX
|
||||
static struct pin_config __initdata_or_module omap24xx_pins[] = {
|
||||
/*
|
||||
* description mux mux pull pull debug
|
||||
* offset mode ena type
|
||||
|
|
@ -77,7 +82,12 @@ MUX_CFG_24XX("AA12_242X_GPIO17", 0x0e9, 3, 0, 0, 1)
|
|||
MUX_CFG_24XX("AA8_242X_GPIO58", 0x0ea, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("Y20_24XX_GPIO60", 0x12c, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("W4__24XX_GPIO74", 0x0f2, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("N15_24XX_GPIO85", 0x103, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("M15_24XX_GPIO92", 0x10a, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("P20_24XX_GPIO93", 0x10b, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("P18_24XX_GPIO95", 0x10d, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("M18_24XX_GPIO96", 0x10e, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("L14_24XX_GPIO97", 0x10f, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("J15_24XX_GPIO99", 0x113, 3, 1, 1, 1)
|
||||
MUX_CFG_24XX("V14_24XX_GPIO117", 0x128, 3, 1, 0, 1)
|
||||
MUX_CFG_24XX("P14_24XX_GPIO125", 0x140, 3, 1, 1, 1)
|
||||
|
|
@ -102,9 +112,6 @@ MUX_CFG_24XX("G4_242X_DMAREQ3", 0x073, 2, 0, 0, 1)
|
|||
MUX_CFG_24XX("D3_242X_DMAREQ4", 0x072, 2, 0, 0, 1)
|
||||
MUX_CFG_24XX("E3_242X_DMAREQ5", 0x071, 2, 0, 0, 1)
|
||||
|
||||
/* TSC IRQ */
|
||||
MUX_CFG_24XX("P20_24XX_TSC_IRQ", 0x108, 0, 0, 0, 1)
|
||||
|
||||
/* UART3 */
|
||||
MUX_CFG_24XX("K15_24XX_UART3_TX", 0x118, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("K14_24XX_UART3_RX", 0x119, 0, 0, 0, 1)
|
||||
|
|
@ -167,12 +174,108 @@ MUX_CFG_24XX("B3__24XX_KBR5", 0x30, 3, 1, 1, 1)
|
|||
MUX_CFG_24XX("AA4_24XX_KBC2", 0xe7, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("B13_24XX_KBC6", 0x110, 3, 0, 0, 1)
|
||||
|
||||
/* 2430 USB */
|
||||
MUX_CFG_24XX("AD9_2430_USB0_PUEN", 0x133, 4, 0, 0, 1)
|
||||
MUX_CFG_24XX("Y11_2430_USB0_VP", 0x134, 4, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD7_2430_USB0_VM", 0x135, 4, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE7_2430_USB0_RCV", 0x136, 4, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD4_2430_USB0_TXEN", 0x137, 4, 0, 0, 1)
|
||||
MUX_CFG_24XX("AF9_2430_USB0_SE0", 0x138, 4, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE6_2430_USB0_DAT", 0x139, 4, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD24_2430_USB1_SE0", 0x107, 2, 0, 0, 1)
|
||||
MUX_CFG_24XX("AB24_2430_USB1_RCV", 0x108, 2, 0, 0, 1)
|
||||
MUX_CFG_24XX("Y25_2430_USB1_TXEN", 0x109, 2, 0, 0, 1)
|
||||
MUX_CFG_24XX("AA26_2430_USB1_DAT", 0x10A, 2, 0, 0, 1)
|
||||
|
||||
/* 2430 HS-USB */
|
||||
MUX_CFG_24XX("AD9_2430_USB0HS_DATA3", 0x133, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("Y11_2430_USB0HS_DATA4", 0x134, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD7_2430_USB0HS_DATA5", 0x135, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE7_2430_USB0HS_DATA6", 0x136, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD4_2430_USB0HS_DATA2", 0x137, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AF9_2430_USB0HS_DATA0", 0x138, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE6_2430_USB0HS_DATA1", 0x139, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE8_2430_USB0HS_CLK", 0x13A, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD8_2430_USB0HS_DIR", 0x13B, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE5_2430_USB0HS_STP", 0x13c, 0, 1, 1, 1)
|
||||
MUX_CFG_24XX("AE9_2430_USB0HS_NXT", 0x13D, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AC7_2430_USB0HS_DATA7", 0x13E, 0, 0, 0, 1)
|
||||
|
||||
/* 2430 McBSP */
|
||||
MUX_CFG_24XX("AC10_2430_MCBSP2_FSX", 0x012E, 1, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD16_2430_MCBSP2_CLX", 0x012F, 1, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE13_2430_MCBSP2_DX", 0x0130, 1, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD13_2430_MCBSP2_DR", 0x0131, 1, 0, 0, 1)
|
||||
MUX_CFG_24XX("AC10_2430_MCBSP2_FSX_OFF",0x012E, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD16_2430_MCBSP2_CLX_OFF",0x012F, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE13_2430_MCBSP2_DX_OFF", 0x0130, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD13_2430_MCBSP2_DR_OFF", 0x0131, 0, 0, 0, 1)
|
||||
};
|
||||
|
||||
#define OMAP24XX_PINS_SZ ARRAY_SIZE(omap24xx_pins)
|
||||
|
||||
#else
|
||||
#define omap24xx_pins NULL
|
||||
#define OMAP24XX_PINS_SZ 0
|
||||
#endif /* CONFIG_ARCH_OMAP24XX */
|
||||
|
||||
#define OMAP24XX_PULL_ENA (1 << 3)
|
||||
#define OMAP24XX_PULL_UP (1 << 4)
|
||||
|
||||
#if defined(CONFIG_OMAP_MUX_DEBUG) || defined(CONFIG_OMAP_MUX_WARNINGS)
|
||||
void __init_or_module omap2_cfg_debug(const struct pin_config *cfg, u8 reg)
|
||||
{
|
||||
u16 orig;
|
||||
u8 warn = 0, debug = 0;
|
||||
|
||||
orig = omap_ctrl_readb(cfg->mux_reg);
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX_DEBUG
|
||||
debug = cfg->debug;
|
||||
#endif
|
||||
warn = (orig != reg);
|
||||
if (debug || warn)
|
||||
printk(KERN_WARNING
|
||||
"MUX: setup %s (0x%08x): 0x%02x -> 0x%02x\n",
|
||||
cfg->name, omap_ctrl_base_get() + cfg->mux_reg,
|
||||
orig, reg);
|
||||
}
|
||||
#else
|
||||
#define omap2_cfg_debug(x, y) do {} while (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP24XX
|
||||
int __init_or_module omap24xx_cfg_reg(const struct pin_config *cfg)
|
||||
{
|
||||
static DEFINE_SPINLOCK(mux_spin_lock);
|
||||
unsigned long flags;
|
||||
u8 reg = 0;
|
||||
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
reg |= cfg->mask & 0x7;
|
||||
if (cfg->pull_val)
|
||||
reg |= OMAP24XX_PULL_ENA;
|
||||
if (cfg->pu_pd_val)
|
||||
reg |= OMAP24XX_PULL_UP;
|
||||
omap2_cfg_debug(cfg, reg);
|
||||
omap_ctrl_writeb(reg, cfg->mux_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#define omap24xx_cfg_reg 0
|
||||
#endif
|
||||
|
||||
int __init omap2_mux_init(void)
|
||||
{
|
||||
omap_mux_register(omap24xx_pins, ARRAY_SIZE(omap24xx_pins));
|
||||
return 0;
|
||||
if (cpu_is_omap24xx()) {
|
||||
arch_mux_cfg.pins = omap24xx_pins;
|
||||
arch_mux_cfg.size = OMAP24XX_PINS_SZ;
|
||||
arch_mux_cfg.cfg_reg = omap24xx_cfg_reg;
|
||||
}
|
||||
|
||||
return omap_mux_register(&arch_mux_cfg);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,299 +0,0 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap2/pm-domain.c
|
||||
*
|
||||
* Power domain functions for OMAP2
|
||||
*
|
||||
* Copyright (C) 2006 Nokia Corporation
|
||||
* Tony Lindgren <tony@atomide.com>
|
||||
*
|
||||
* Some code based on earlier OMAP2 sample PM code
|
||||
* Copyright (C) 2005 Texas Instruments, Inc.
|
||||
* Richard Woodruff <r-woodruff2@ti.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/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#include "prcm-regs.h"
|
||||
|
||||
/* Power domain offsets */
|
||||
#define PM_MPU_OFFSET 0x100
|
||||
#define PM_CORE_OFFSET 0x200
|
||||
#define PM_GFX_OFFSET 0x300
|
||||
#define PM_WKUP_OFFSET 0x400 /* Autoidle only */
|
||||
#define PM_PLL_OFFSET 0x500 /* Autoidle only */
|
||||
#define PM_DSP_OFFSET 0x800
|
||||
#define PM_MDM_OFFSET 0xc00
|
||||
|
||||
/* Power domain wake-up dependency control register */
|
||||
#define PM_WKDEP_OFFSET 0xc8
|
||||
#define EN_MDM (1 << 5)
|
||||
#define EN_WKUP (1 << 4)
|
||||
#define EN_GFX (1 << 3)
|
||||
#define EN_DSP (1 << 2)
|
||||
#define EN_MPU (1 << 1)
|
||||
#define EN_CORE (1 << 0)
|
||||
|
||||
/* Core power domain state transition control register */
|
||||
#define PM_PWSTCTRL_OFFSET 0xe0
|
||||
#define FORCESTATE (1 << 18) /* Only for DSP & GFX */
|
||||
#define MEM4RETSTATE (1 << 6)
|
||||
#define MEM3RETSTATE (1 << 5)
|
||||
#define MEM2RETSTATE (1 << 4)
|
||||
#define MEM1RETSTATE (1 << 3)
|
||||
#define LOGICRETSTATE (1 << 2) /* Logic is retained */
|
||||
#define POWERSTATE_OFF 0x3
|
||||
#define POWERSTATE_RETENTION 0x1
|
||||
#define POWERSTATE_ON 0x0
|
||||
|
||||
/* Power domain state register */
|
||||
#define PM_PWSTST_OFFSET 0xe4
|
||||
|
||||
/* Hardware supervised state transition control register */
|
||||
#define CM_CLKSTCTRL_OFFSET 0x48
|
||||
#define AUTOSTAT_MPU (1 << 0) /* MPU */
|
||||
#define AUTOSTAT_DSS (1 << 2) /* Core */
|
||||
#define AUTOSTAT_L4 (1 << 1) /* Core */
|
||||
#define AUTOSTAT_L3 (1 << 0) /* Core */
|
||||
#define AUTOSTAT_GFX (1 << 0) /* GFX */
|
||||
#define AUTOSTAT_IVA (1 << 8) /* 2420 IVA in DSP domain */
|
||||
#define AUTOSTAT_DSP (1 << 0) /* DSP */
|
||||
#define AUTOSTAT_MDM (1 << 0) /* MDM */
|
||||
|
||||
/* Automatic control of interface clock idling */
|
||||
#define CM_AUTOIDLE1_OFFSET 0x30
|
||||
#define CM_AUTOIDLE2_OFFSET 0x34 /* Core only */
|
||||
#define CM_AUTOIDLE3_OFFSET 0x38 /* Core only */
|
||||
#define CM_AUTOIDLE4_OFFSET 0x3c /* Core only */
|
||||
#define AUTO_54M(x) (((x) & 0x3) << 6)
|
||||
#define AUTO_96M(x) (((x) & 0x3) << 2)
|
||||
#define AUTO_DPLL(x) (((x) & 0x3) << 0)
|
||||
#define AUTO_STOPPED 0x3
|
||||
#define AUTO_BYPASS_FAST 0x2 /* DPLL only */
|
||||
#define AUTO_BYPASS_LOW_POWER 0x1 /* DPLL only */
|
||||
#define AUTO_DISABLED 0x0
|
||||
|
||||
/* Voltage control PRCM_VOLTCTRL bits */
|
||||
#define AUTO_EXTVOLT (1 << 15)
|
||||
#define FORCE_EXTVOLT (1 << 14)
|
||||
#define SETOFF_LEVEL(x) (((x) & 0x3) << 12)
|
||||
#define MEMRETCTRL (1 << 8)
|
||||
#define SETRET_LEVEL(x) (((x) & 0x3) << 6)
|
||||
#define VOLT_LEVEL(x) (((x) & 0x3) << 0)
|
||||
|
||||
#define OMAP24XX_PRCM_VBASE IO_ADDRESS(OMAP24XX_PRCM_BASE)
|
||||
#define prcm_readl(r) __raw_readl(OMAP24XX_PRCM_VBASE + (r))
|
||||
#define prcm_writel(v, r) __raw_writel((v), OMAP24XX_PRCM_VBASE + (r))
|
||||
|
||||
static u32 pmdomain_get_wakeup_dependencies(int domain_offset)
|
||||
{
|
||||
return prcm_readl(domain_offset + PM_WKDEP_OFFSET);
|
||||
}
|
||||
|
||||
static void pmdomain_set_wakeup_dependencies(u32 state, int domain_offset)
|
||||
{
|
||||
prcm_writel(state, domain_offset + PM_WKDEP_OFFSET);
|
||||
}
|
||||
|
||||
static u32 pmdomain_get_powerstate(int domain_offset)
|
||||
{
|
||||
return prcm_readl(domain_offset + PM_PWSTCTRL_OFFSET);
|
||||
}
|
||||
|
||||
static void pmdomain_set_powerstate(u32 state, int domain_offset)
|
||||
{
|
||||
prcm_writel(state, domain_offset + PM_PWSTCTRL_OFFSET);
|
||||
}
|
||||
|
||||
static u32 pmdomain_get_clock_autocontrol(int domain_offset)
|
||||
{
|
||||
return prcm_readl(domain_offset + CM_CLKSTCTRL_OFFSET);
|
||||
}
|
||||
|
||||
static void pmdomain_set_clock_autocontrol(u32 state, int domain_offset)
|
||||
{
|
||||
prcm_writel(state, domain_offset + CM_CLKSTCTRL_OFFSET);
|
||||
}
|
||||
|
||||
static u32 pmdomain_get_clock_autoidle1(int domain_offset)
|
||||
{
|
||||
return prcm_readl(domain_offset + CM_AUTOIDLE1_OFFSET);
|
||||
}
|
||||
|
||||
/* Core domain only */
|
||||
static u32 pmdomain_get_clock_autoidle2(int domain_offset)
|
||||
{
|
||||
return prcm_readl(domain_offset + CM_AUTOIDLE2_OFFSET);
|
||||
}
|
||||
|
||||
/* Core domain only */
|
||||
static u32 pmdomain_get_clock_autoidle3(int domain_offset)
|
||||
{
|
||||
return prcm_readl(domain_offset + CM_AUTOIDLE3_OFFSET);
|
||||
}
|
||||
|
||||
/* Core domain only */
|
||||
static u32 pmdomain_get_clock_autoidle4(int domain_offset)
|
||||
{
|
||||
return prcm_readl(domain_offset + CM_AUTOIDLE4_OFFSET);
|
||||
}
|
||||
|
||||
static void pmdomain_set_clock_autoidle1(u32 state, int domain_offset)
|
||||
{
|
||||
prcm_writel(state, CM_AUTOIDLE1_OFFSET + domain_offset);
|
||||
}
|
||||
|
||||
/* Core domain only */
|
||||
static void pmdomain_set_clock_autoidle2(u32 state, int domain_offset)
|
||||
{
|
||||
prcm_writel(state, CM_AUTOIDLE2_OFFSET + domain_offset);
|
||||
}
|
||||
|
||||
/* Core domain only */
|
||||
static void pmdomain_set_clock_autoidle3(u32 state, int domain_offset)
|
||||
{
|
||||
prcm_writel(state, CM_AUTOIDLE3_OFFSET + domain_offset);
|
||||
}
|
||||
|
||||
/* Core domain only */
|
||||
static void pmdomain_set_clock_autoidle4(u32 state, int domain_offset)
|
||||
{
|
||||
prcm_writel(state, CM_AUTOIDLE4_OFFSET + domain_offset);
|
||||
}
|
||||
|
||||
/*
|
||||
* Configures power management domains to idle clocks automatically.
|
||||
*/
|
||||
void pmdomain_set_autoidle(void)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
/* Set PLL auto stop for 54M, 96M & DPLL */
|
||||
pmdomain_set_clock_autoidle1(AUTO_54M(AUTO_STOPPED) |
|
||||
AUTO_96M(AUTO_STOPPED) |
|
||||
AUTO_DPLL(AUTO_STOPPED), PM_PLL_OFFSET);
|
||||
|
||||
/* External clock input control
|
||||
* REVISIT: Should this be in clock framework?
|
||||
*/
|
||||
PRCM_CLKSRC_CTRL |= (0x3 << 3);
|
||||
|
||||
/* Configure number of 32KHz clock cycles for sys_clk */
|
||||
PRCM_CLKSSETUP = 0x00ff;
|
||||
|
||||
/* Configure automatic voltage transition */
|
||||
PRCM_VOLTSETUP = 0;
|
||||
val = PRCM_VOLTCTRL;
|
||||
val &= ~(SETOFF_LEVEL(0x3) | VOLT_LEVEL(0x3));
|
||||
val |= SETOFF_LEVEL(1) | VOLT_LEVEL(1) | AUTO_EXTVOLT;
|
||||
PRCM_VOLTCTRL = val;
|
||||
|
||||
/* Disable emulation tools functional clock */
|
||||
PRCM_CLKEMUL_CTRL = 0x0;
|
||||
|
||||
/* Set core memory retention state */
|
||||
val = pmdomain_get_powerstate(PM_CORE_OFFSET);
|
||||
if (cpu_is_omap2420()) {
|
||||
val &= ~(0x7 << 3);
|
||||
val |= (MEM3RETSTATE | MEM2RETSTATE | MEM1RETSTATE);
|
||||
} else {
|
||||
val &= ~(0xf << 3);
|
||||
val |= (MEM4RETSTATE | MEM3RETSTATE | MEM2RETSTATE |
|
||||
MEM1RETSTATE);
|
||||
}
|
||||
pmdomain_set_powerstate(val, PM_CORE_OFFSET);
|
||||
|
||||
/* OCP interface smart idle. REVISIT: Enable autoidle bit0 ? */
|
||||
val = SMS_SYSCONFIG;
|
||||
val &= ~(0x3 << 3);
|
||||
val |= (0x2 << 3) | (1 << 0);
|
||||
SMS_SYSCONFIG |= val;
|
||||
|
||||
val = SDRC_SYSCONFIG;
|
||||
val &= ~(0x3 << 3);
|
||||
val |= (0x2 << 3);
|
||||
SDRC_SYSCONFIG = val;
|
||||
|
||||
/* Configure L3 interface for smart idle.
|
||||
* REVISIT: Enable autoidle bit0 ?
|
||||
*/
|
||||
val = GPMC_SYSCONFIG;
|
||||
val &= ~(0x3 << 3);
|
||||
val |= (0x2 << 3) | (1 << 0);
|
||||
GPMC_SYSCONFIG = val;
|
||||
|
||||
pmdomain_set_powerstate(LOGICRETSTATE | POWERSTATE_RETENTION,
|
||||
PM_MPU_OFFSET);
|
||||
pmdomain_set_powerstate(POWERSTATE_RETENTION, PM_CORE_OFFSET);
|
||||
if (!cpu_is_omap2420())
|
||||
pmdomain_set_powerstate(POWERSTATE_RETENTION, PM_MDM_OFFSET);
|
||||
|
||||
/* Assume suspend function has saved the state for DSP and GFX */
|
||||
pmdomain_set_powerstate(FORCESTATE | POWERSTATE_OFF, PM_DSP_OFFSET);
|
||||
pmdomain_set_powerstate(FORCESTATE | POWERSTATE_OFF, PM_GFX_OFFSET);
|
||||
|
||||
#if 0
|
||||
/* REVISIT: Internal USB needs special handling */
|
||||
force_standby_usb();
|
||||
if (cpu_is_omap2430())
|
||||
force_hsmmc();
|
||||
sdram_self_refresh_on_idle_req(1);
|
||||
#endif
|
||||
|
||||
/* Enable clock auto control for all domains.
|
||||
* Note that CORE domain includes also DSS, L4 & L3.
|
||||
*/
|
||||
pmdomain_set_clock_autocontrol(AUTOSTAT_MPU, PM_MPU_OFFSET);
|
||||
pmdomain_set_clock_autocontrol(AUTOSTAT_GFX, PM_GFX_OFFSET);
|
||||
pmdomain_set_clock_autocontrol(AUTOSTAT_DSS | AUTOSTAT_L4 | AUTOSTAT_L3,
|
||||
PM_CORE_OFFSET);
|
||||
if (cpu_is_omap2420())
|
||||
pmdomain_set_clock_autocontrol(AUTOSTAT_IVA | AUTOSTAT_DSP,
|
||||
PM_DSP_OFFSET);
|
||||
else {
|
||||
pmdomain_set_clock_autocontrol(AUTOSTAT_DSP, PM_DSP_OFFSET);
|
||||
pmdomain_set_clock_autocontrol(AUTOSTAT_MDM, PM_MDM_OFFSET);
|
||||
}
|
||||
|
||||
/* Enable clock autoidle for all domains */
|
||||
pmdomain_set_clock_autoidle1(0x2, PM_DSP_OFFSET);
|
||||
if (cpu_is_omap2420()) {
|
||||
pmdomain_set_clock_autoidle1(0xfffffff9, PM_CORE_OFFSET);
|
||||
pmdomain_set_clock_autoidle2(0x7, PM_CORE_OFFSET);
|
||||
pmdomain_set_clock_autoidle1(0x3f, PM_WKUP_OFFSET);
|
||||
} else {
|
||||
pmdomain_set_clock_autoidle1(0xeafffff1, PM_CORE_OFFSET);
|
||||
pmdomain_set_clock_autoidle2(0xfff, PM_CORE_OFFSET);
|
||||
pmdomain_set_clock_autoidle1(0x7f, PM_WKUP_OFFSET);
|
||||
pmdomain_set_clock_autoidle1(0x3, PM_MDM_OFFSET);
|
||||
}
|
||||
pmdomain_set_clock_autoidle3(0x7, PM_CORE_OFFSET);
|
||||
pmdomain_set_clock_autoidle4(0x1f, PM_CORE_OFFSET);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initializes power domains by removing wake-up dependencies and powering
|
||||
* down DSP and GFX. Gets called from PM init. Note that DSP and IVA code
|
||||
* must re-enable DSP and GFX when used.
|
||||
*/
|
||||
void __init pmdomain_init(void)
|
||||
{
|
||||
/* Remove all domain wakeup dependencies */
|
||||
pmdomain_set_wakeup_dependencies(EN_WKUP | EN_CORE, PM_MPU_OFFSET);
|
||||
pmdomain_set_wakeup_dependencies(0, PM_DSP_OFFSET);
|
||||
pmdomain_set_wakeup_dependencies(0, PM_GFX_OFFSET);
|
||||
pmdomain_set_wakeup_dependencies(EN_WKUP | EN_MPU, PM_CORE_OFFSET);
|
||||
if (cpu_is_omap2430())
|
||||
pmdomain_set_wakeup_dependencies(0, PM_MDM_OFFSET);
|
||||
|
||||
/* Power down DSP and GFX */
|
||||
pmdomain_set_powerstate(POWERSTATE_OFF | FORCESTATE, PM_DSP_OFFSET);
|
||||
pmdomain_set_powerstate(POWERSTATE_OFF | FORCESTATE, PM_GFX_OFFSET);
|
||||
}
|
||||
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/sysfs.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
|
@ -36,8 +37,6 @@
|
|||
#include <asm/arch/sram.h>
|
||||
#include <asm/arch/pm.h>
|
||||
|
||||
#include "prcm-regs.h"
|
||||
|
||||
static struct clk *vclk;
|
||||
static void (*omap2_sram_idle)(void);
|
||||
static void (*omap2_sram_suspend)(int dllctrl, int cpu_rev);
|
||||
|
|
@ -78,251 +77,8 @@ static int omap2_pm_prepare(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#define INT0_WAKE_MASK (OMAP_IRQ_BIT(INT_24XX_GPIO_BANK1) | \
|
||||
OMAP_IRQ_BIT(INT_24XX_GPIO_BANK2) | \
|
||||
OMAP_IRQ_BIT(INT_24XX_GPIO_BANK3))
|
||||
|
||||
#define INT1_WAKE_MASK (OMAP_IRQ_BIT(INT_24XX_GPIO_BANK4))
|
||||
|
||||
#define INT2_WAKE_MASK (OMAP_IRQ_BIT(INT_24XX_UART1_IRQ) | \
|
||||
OMAP_IRQ_BIT(INT_24XX_UART2_IRQ) | \
|
||||
OMAP_IRQ_BIT(INT_24XX_UART3_IRQ))
|
||||
|
||||
#define preg(reg) printk("%s\t(0x%p):\t0x%08x\n", #reg, ®, reg);
|
||||
|
||||
static void omap2_pm_debug(char * desc)
|
||||
{
|
||||
printk("%s:\n", desc);
|
||||
|
||||
preg(CM_CLKSTCTRL_MPU);
|
||||
preg(CM_CLKSTCTRL_CORE);
|
||||
preg(CM_CLKSTCTRL_GFX);
|
||||
preg(CM_CLKSTCTRL_DSP);
|
||||
preg(CM_CLKSTCTRL_MDM);
|
||||
|
||||
preg(PM_PWSTCTRL_MPU);
|
||||
preg(PM_PWSTCTRL_CORE);
|
||||
preg(PM_PWSTCTRL_GFX);
|
||||
preg(PM_PWSTCTRL_DSP);
|
||||
preg(PM_PWSTCTRL_MDM);
|
||||
|
||||
preg(PM_PWSTST_MPU);
|
||||
preg(PM_PWSTST_CORE);
|
||||
preg(PM_PWSTST_GFX);
|
||||
preg(PM_PWSTST_DSP);
|
||||
preg(PM_PWSTST_MDM);
|
||||
|
||||
preg(CM_AUTOIDLE1_CORE);
|
||||
preg(CM_AUTOIDLE2_CORE);
|
||||
preg(CM_AUTOIDLE3_CORE);
|
||||
preg(CM_AUTOIDLE4_CORE);
|
||||
preg(CM_AUTOIDLE_WKUP);
|
||||
preg(CM_AUTOIDLE_PLL);
|
||||
preg(CM_AUTOIDLE_DSP);
|
||||
preg(CM_AUTOIDLE_MDM);
|
||||
|
||||
preg(CM_ICLKEN1_CORE);
|
||||
preg(CM_ICLKEN2_CORE);
|
||||
preg(CM_ICLKEN3_CORE);
|
||||
preg(CM_ICLKEN4_CORE);
|
||||
preg(CM_ICLKEN_GFX);
|
||||
preg(CM_ICLKEN_WKUP);
|
||||
preg(CM_ICLKEN_DSP);
|
||||
preg(CM_ICLKEN_MDM);
|
||||
|
||||
preg(CM_IDLEST1_CORE);
|
||||
preg(CM_IDLEST2_CORE);
|
||||
preg(CM_IDLEST3_CORE);
|
||||
preg(CM_IDLEST4_CORE);
|
||||
preg(CM_IDLEST_GFX);
|
||||
preg(CM_IDLEST_WKUP);
|
||||
preg(CM_IDLEST_CKGEN);
|
||||
preg(CM_IDLEST_DSP);
|
||||
preg(CM_IDLEST_MDM);
|
||||
|
||||
preg(RM_RSTST_MPU);
|
||||
preg(RM_RSTST_GFX);
|
||||
preg(RM_RSTST_WKUP);
|
||||
preg(RM_RSTST_DSP);
|
||||
preg(RM_RSTST_MDM);
|
||||
|
||||
preg(PM_WKDEP_MPU);
|
||||
preg(PM_WKDEP_CORE);
|
||||
preg(PM_WKDEP_GFX);
|
||||
preg(PM_WKDEP_DSP);
|
||||
preg(PM_WKDEP_MDM);
|
||||
|
||||
preg(CM_FCLKEN_WKUP);
|
||||
preg(CM_ICLKEN_WKUP);
|
||||
preg(CM_IDLEST_WKUP);
|
||||
preg(CM_AUTOIDLE_WKUP);
|
||||
preg(CM_CLKSEL_WKUP);
|
||||
|
||||
preg(PM_WKEN_WKUP);
|
||||
preg(PM_WKST_WKUP);
|
||||
}
|
||||
|
||||
static inline void omap2_pm_save_registers(void)
|
||||
{
|
||||
/* Save interrupt registers */
|
||||
OMAP24XX_SAVE(INTC_MIR0);
|
||||
OMAP24XX_SAVE(INTC_MIR1);
|
||||
OMAP24XX_SAVE(INTC_MIR2);
|
||||
|
||||
/* Save power control registers */
|
||||
OMAP24XX_SAVE(CM_CLKSTCTRL_MPU);
|
||||
OMAP24XX_SAVE(CM_CLKSTCTRL_CORE);
|
||||
OMAP24XX_SAVE(CM_CLKSTCTRL_GFX);
|
||||
OMAP24XX_SAVE(CM_CLKSTCTRL_DSP);
|
||||
OMAP24XX_SAVE(CM_CLKSTCTRL_MDM);
|
||||
|
||||
/* Save power state registers */
|
||||
OMAP24XX_SAVE(PM_PWSTCTRL_MPU);
|
||||
OMAP24XX_SAVE(PM_PWSTCTRL_CORE);
|
||||
OMAP24XX_SAVE(PM_PWSTCTRL_GFX);
|
||||
OMAP24XX_SAVE(PM_PWSTCTRL_DSP);
|
||||
OMAP24XX_SAVE(PM_PWSTCTRL_MDM);
|
||||
|
||||
/* Save autoidle registers */
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE1_CORE);
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE2_CORE);
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE3_CORE);
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE4_CORE);
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE_WKUP);
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE_PLL);
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE_DSP);
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE_MDM);
|
||||
|
||||
/* Save idle state registers */
|
||||
OMAP24XX_SAVE(CM_IDLEST1_CORE);
|
||||
OMAP24XX_SAVE(CM_IDLEST2_CORE);
|
||||
OMAP24XX_SAVE(CM_IDLEST3_CORE);
|
||||
OMAP24XX_SAVE(CM_IDLEST4_CORE);
|
||||
OMAP24XX_SAVE(CM_IDLEST_GFX);
|
||||
OMAP24XX_SAVE(CM_IDLEST_WKUP);
|
||||
OMAP24XX_SAVE(CM_IDLEST_CKGEN);
|
||||
OMAP24XX_SAVE(CM_IDLEST_DSP);
|
||||
OMAP24XX_SAVE(CM_IDLEST_MDM);
|
||||
|
||||
/* Save clock registers */
|
||||
OMAP24XX_SAVE(CM_FCLKEN1_CORE);
|
||||
OMAP24XX_SAVE(CM_FCLKEN2_CORE);
|
||||
OMAP24XX_SAVE(CM_ICLKEN1_CORE);
|
||||
OMAP24XX_SAVE(CM_ICLKEN2_CORE);
|
||||
OMAP24XX_SAVE(CM_ICLKEN3_CORE);
|
||||
OMAP24XX_SAVE(CM_ICLKEN4_CORE);
|
||||
}
|
||||
|
||||
static inline void omap2_pm_restore_registers(void)
|
||||
{
|
||||
/* Restore clock state registers */
|
||||
OMAP24XX_RESTORE(CM_CLKSTCTRL_MPU);
|
||||
OMAP24XX_RESTORE(CM_CLKSTCTRL_CORE);
|
||||
OMAP24XX_RESTORE(CM_CLKSTCTRL_GFX);
|
||||
OMAP24XX_RESTORE(CM_CLKSTCTRL_DSP);
|
||||
OMAP24XX_RESTORE(CM_CLKSTCTRL_MDM);
|
||||
|
||||
/* Restore power state registers */
|
||||
OMAP24XX_RESTORE(PM_PWSTCTRL_MPU);
|
||||
OMAP24XX_RESTORE(PM_PWSTCTRL_CORE);
|
||||
OMAP24XX_RESTORE(PM_PWSTCTRL_GFX);
|
||||
OMAP24XX_RESTORE(PM_PWSTCTRL_DSP);
|
||||
OMAP24XX_RESTORE(PM_PWSTCTRL_MDM);
|
||||
|
||||
/* Restore idle state registers */
|
||||
OMAP24XX_RESTORE(CM_IDLEST1_CORE);
|
||||
OMAP24XX_RESTORE(CM_IDLEST2_CORE);
|
||||
OMAP24XX_RESTORE(CM_IDLEST3_CORE);
|
||||
OMAP24XX_RESTORE(CM_IDLEST4_CORE);
|
||||
OMAP24XX_RESTORE(CM_IDLEST_GFX);
|
||||
OMAP24XX_RESTORE(CM_IDLEST_WKUP);
|
||||
OMAP24XX_RESTORE(CM_IDLEST_CKGEN);
|
||||
OMAP24XX_RESTORE(CM_IDLEST_DSP);
|
||||
OMAP24XX_RESTORE(CM_IDLEST_MDM);
|
||||
|
||||
/* Restore autoidle registers */
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE1_CORE);
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE2_CORE);
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE3_CORE);
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE4_CORE);
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE_WKUP);
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE_PLL);
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE_DSP);
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE_MDM);
|
||||
|
||||
/* Restore clock registers */
|
||||
OMAP24XX_RESTORE(CM_FCLKEN1_CORE);
|
||||
OMAP24XX_RESTORE(CM_FCLKEN2_CORE);
|
||||
OMAP24XX_RESTORE(CM_ICLKEN1_CORE);
|
||||
OMAP24XX_RESTORE(CM_ICLKEN2_CORE);
|
||||
OMAP24XX_RESTORE(CM_ICLKEN3_CORE);
|
||||
OMAP24XX_RESTORE(CM_ICLKEN4_CORE);
|
||||
|
||||
/* REVISIT: Clear interrupts here */
|
||||
|
||||
/* Restore interrupt registers */
|
||||
OMAP24XX_RESTORE(INTC_MIR0);
|
||||
OMAP24XX_RESTORE(INTC_MIR1);
|
||||
OMAP24XX_RESTORE(INTC_MIR2);
|
||||
}
|
||||
|
||||
static int omap2_pm_suspend(void)
|
||||
{
|
||||
int processor_type = 0;
|
||||
|
||||
/* REVISIT: 0x21 or 0x26? */
|
||||
if (cpu_is_omap2420())
|
||||
processor_type = 0x21;
|
||||
|
||||
if (!processor_type)
|
||||
return -ENOTSUPP;
|
||||
|
||||
local_irq_disable();
|
||||
local_fiq_disable();
|
||||
|
||||
omap2_pm_save_registers();
|
||||
|
||||
/* Disable interrupts except for the wake events */
|
||||
INTC_MIR_SET0 = 0xffffffff & ~INT0_WAKE_MASK;
|
||||
INTC_MIR_SET1 = 0xffffffff & ~INT1_WAKE_MASK;
|
||||
INTC_MIR_SET2 = 0xffffffff & ~INT2_WAKE_MASK;
|
||||
|
||||
pmdomain_set_autoidle();
|
||||
|
||||
/* Clear old wake-up events */
|
||||
PM_WKST1_CORE = 0;
|
||||
PM_WKST2_CORE = 0;
|
||||
PM_WKST_WKUP = 0;
|
||||
|
||||
/* Enable wake-up events */
|
||||
PM_WKEN1_CORE = (1 << 22) | (1 << 21); /* UART1 & 2 */
|
||||
PM_WKEN2_CORE = (1 << 2); /* UART3 */
|
||||
PM_WKEN_WKUP = (1 << 2) | (1 << 0); /* GPIO & GPT1 */
|
||||
|
||||
/* Disable clocks except for CM_ICLKEN2_CORE. It gets disabled
|
||||
* in the SRAM suspend code */
|
||||
CM_FCLKEN1_CORE = 0;
|
||||
CM_FCLKEN2_CORE = 0;
|
||||
CM_ICLKEN1_CORE = 0;
|
||||
CM_ICLKEN3_CORE = 0;
|
||||
CM_ICLKEN4_CORE = 0;
|
||||
|
||||
omap2_pm_debug("Status before suspend");
|
||||
|
||||
/* Must wait for serial buffers to clear */
|
||||
mdelay(200);
|
||||
|
||||
/* Jump to SRAM suspend code
|
||||
* REVISIT: When is this SDRC_DLLB_CTRL?
|
||||
*/
|
||||
omap2_sram_suspend(SDRC_DLLA_CTRL, processor_type);
|
||||
|
||||
/* Back from sleep */
|
||||
omap2_pm_restore_registers();
|
||||
|
||||
local_fiq_enable();
|
||||
local_irq_enable();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -357,30 +113,6 @@ static struct platform_suspend_ops omap_pm_ops = {
|
|||
|
||||
int __init omap2_pm_init(void)
|
||||
{
|
||||
printk("Power Management for TI OMAP.\n");
|
||||
|
||||
vclk = clk_get(NULL, "virt_prcm_set");
|
||||
if (IS_ERR(vclk)) {
|
||||
printk(KERN_ERR "Could not get PM vclk\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/*
|
||||
* We copy the assembler sleep/wakeup routines to SRAM.
|
||||
* These routines need to be in SRAM as that's the only
|
||||
* memory the MPU can see when it wakes up.
|
||||
*/
|
||||
omap2_sram_idle = omap_sram_push(omap24xx_idle_loop_suspend,
|
||||
omap24xx_idle_loop_suspend_sz);
|
||||
|
||||
omap2_sram_suspend = omap_sram_push(omap24xx_cpu_suspend,
|
||||
omap24xx_cpu_suspend_sz);
|
||||
|
||||
suspend_set_ops(&omap_pm_ops);
|
||||
pm_idle = omap2_pm_idle;
|
||||
|
||||
pmdomain_init();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
317
arch/arm/mach-omap2/prcm-common.h
Normal file
317
arch/arm/mach-omap2/prcm-common.h
Normal file
|
|
@ -0,0 +1,317 @@
|
|||
#ifndef __ARCH_ASM_MACH_OMAP2_PRCM_COMMON_H
|
||||
#define __ARCH_ASM_MACH_OMAP2_PRCM_COMMON_H
|
||||
|
||||
/*
|
||||
* OMAP2/3 PRCM base and module definitions
|
||||
*
|
||||
* Copyright (C) 2007-2008 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007-2008 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
|
||||
/* Module offsets from both CM_BASE & PRM_BASE */
|
||||
|
||||
/*
|
||||
* Offsets that are the same on 24xx and 34xx
|
||||
*
|
||||
* Technically, in terms of the TRM, OCP_MOD is 34xx only; PLL_MOD is
|
||||
* CCR_MOD on 3430; and GFX_MOD only exists < 3430ES2.
|
||||
*/
|
||||
#define OCP_MOD 0x000
|
||||
#define MPU_MOD 0x100
|
||||
#define CORE_MOD 0x200
|
||||
#define GFX_MOD 0x300
|
||||
#define WKUP_MOD 0x400
|
||||
#define PLL_MOD 0x500
|
||||
|
||||
|
||||
/* Chip-specific module offsets */
|
||||
#define OMAP24XX_DSP_MOD 0x800
|
||||
|
||||
#define OMAP2430_MDM_MOD 0xc00
|
||||
|
||||
/* IVA2 module is < base on 3430 */
|
||||
#define OMAP3430_IVA2_MOD -0x800
|
||||
#define OMAP3430ES2_SGX_MOD GFX_MOD
|
||||
#define OMAP3430_CCR_MOD PLL_MOD
|
||||
#define OMAP3430_DSS_MOD 0x600
|
||||
#define OMAP3430_CAM_MOD 0x700
|
||||
#define OMAP3430_PER_MOD 0x800
|
||||
#define OMAP3430_EMU_MOD 0x900
|
||||
#define OMAP3430_GR_MOD 0xa00
|
||||
#define OMAP3430_NEON_MOD 0xb00
|
||||
#define OMAP3430ES2_USBHOST_MOD 0xc00
|
||||
|
||||
|
||||
/* 24XX register bits shared between CM & PRM registers */
|
||||
|
||||
/* CM_FCLKEN1_CORE, CM_ICLKEN1_CORE, PM_WKEN1_CORE shared bits */
|
||||
#define OMAP2420_EN_MMC_SHIFT 26
|
||||
#define OMAP2420_EN_MMC (1 << 26)
|
||||
#define OMAP24XX_EN_UART2_SHIFT 22
|
||||
#define OMAP24XX_EN_UART2 (1 << 22)
|
||||
#define OMAP24XX_EN_UART1_SHIFT 21
|
||||
#define OMAP24XX_EN_UART1 (1 << 21)
|
||||
#define OMAP24XX_EN_MCSPI2_SHIFT 18
|
||||
#define OMAP24XX_EN_MCSPI2 (1 << 18)
|
||||
#define OMAP24XX_EN_MCSPI1_SHIFT 17
|
||||
#define OMAP24XX_EN_MCSPI1 (1 << 17)
|
||||
#define OMAP24XX_EN_MCBSP2_SHIFT 16
|
||||
#define OMAP24XX_EN_MCBSP2 (1 << 16)
|
||||
#define OMAP24XX_EN_MCBSP1_SHIFT 15
|
||||
#define OMAP24XX_EN_MCBSP1 (1 << 15)
|
||||
#define OMAP24XX_EN_GPT12_SHIFT 14
|
||||
#define OMAP24XX_EN_GPT12 (1 << 14)
|
||||
#define OMAP24XX_EN_GPT11_SHIFT 13
|
||||
#define OMAP24XX_EN_GPT11 (1 << 13)
|
||||
#define OMAP24XX_EN_GPT10_SHIFT 12
|
||||
#define OMAP24XX_EN_GPT10 (1 << 12)
|
||||
#define OMAP24XX_EN_GPT9_SHIFT 11
|
||||
#define OMAP24XX_EN_GPT9 (1 << 11)
|
||||
#define OMAP24XX_EN_GPT8_SHIFT 10
|
||||
#define OMAP24XX_EN_GPT8 (1 << 10)
|
||||
#define OMAP24XX_EN_GPT7_SHIFT 9
|
||||
#define OMAP24XX_EN_GPT7 (1 << 9)
|
||||
#define OMAP24XX_EN_GPT6_SHIFT 8
|
||||
#define OMAP24XX_EN_GPT6 (1 << 8)
|
||||
#define OMAP24XX_EN_GPT5_SHIFT 7
|
||||
#define OMAP24XX_EN_GPT5 (1 << 7)
|
||||
#define OMAP24XX_EN_GPT4_SHIFT 6
|
||||
#define OMAP24XX_EN_GPT4 (1 << 6)
|
||||
#define OMAP24XX_EN_GPT3_SHIFT 5
|
||||
#define OMAP24XX_EN_GPT3 (1 << 5)
|
||||
#define OMAP24XX_EN_GPT2_SHIFT 4
|
||||
#define OMAP24XX_EN_GPT2 (1 << 4)
|
||||
#define OMAP2420_EN_VLYNQ_SHIFT 3
|
||||
#define OMAP2420_EN_VLYNQ (1 << 3)
|
||||
|
||||
/* CM_FCLKEN2_CORE, CM_ICLKEN2_CORE, PM_WKEN2_CORE shared bits */
|
||||
#define OMAP2430_EN_GPIO5_SHIFT 10
|
||||
#define OMAP2430_EN_GPIO5 (1 << 10)
|
||||
#define OMAP2430_EN_MCSPI3_SHIFT 9
|
||||
#define OMAP2430_EN_MCSPI3 (1 << 9)
|
||||
#define OMAP2430_EN_MMCHS2_SHIFT 8
|
||||
#define OMAP2430_EN_MMCHS2 (1 << 8)
|
||||
#define OMAP2430_EN_MMCHS1_SHIFT 7
|
||||
#define OMAP2430_EN_MMCHS1 (1 << 7)
|
||||
#define OMAP24XX_EN_UART3_SHIFT 2
|
||||
#define OMAP24XX_EN_UART3 (1 << 2)
|
||||
#define OMAP24XX_EN_USB_SHIFT 0
|
||||
#define OMAP24XX_EN_USB (1 << 0)
|
||||
|
||||
/* CM_ICLKEN2_CORE, PM_WKEN2_CORE shared bits */
|
||||
#define OMAP2430_EN_MDM_INTC_SHIFT 11
|
||||
#define OMAP2430_EN_MDM_INTC (1 << 11)
|
||||
#define OMAP2430_EN_USBHS_SHIFT 6
|
||||
#define OMAP2430_EN_USBHS (1 << 6)
|
||||
|
||||
/* CM_IDLEST1_CORE, PM_WKST1_CORE shared bits */
|
||||
#define OMAP2420_ST_MMC (1 << 26)
|
||||
#define OMAP24XX_ST_UART2 (1 << 22)
|
||||
#define OMAP24XX_ST_UART1 (1 << 21)
|
||||
#define OMAP24XX_ST_MCSPI2 (1 << 18)
|
||||
#define OMAP24XX_ST_MCSPI1 (1 << 17)
|
||||
#define OMAP24XX_ST_GPT12 (1 << 14)
|
||||
#define OMAP24XX_ST_GPT11 (1 << 13)
|
||||
#define OMAP24XX_ST_GPT10 (1 << 12)
|
||||
#define OMAP24XX_ST_GPT9 (1 << 11)
|
||||
#define OMAP24XX_ST_GPT8 (1 << 10)
|
||||
#define OMAP24XX_ST_GPT7 (1 << 9)
|
||||
#define OMAP24XX_ST_GPT6 (1 << 8)
|
||||
#define OMAP24XX_ST_GPT5 (1 << 7)
|
||||
#define OMAP24XX_ST_GPT4 (1 << 6)
|
||||
#define OMAP24XX_ST_GPT3 (1 << 5)
|
||||
#define OMAP24XX_ST_GPT2 (1 << 4)
|
||||
#define OMAP2420_ST_VLYNQ (1 << 3)
|
||||
|
||||
/* CM_IDLEST2_CORE, PM_WKST2_CORE shared bits */
|
||||
#define OMAP2430_ST_MDM_INTC (1 << 11)
|
||||
#define OMAP2430_ST_GPIO5 (1 << 10)
|
||||
#define OMAP2430_ST_MCSPI3 (1 << 9)
|
||||
#define OMAP2430_ST_MMCHS2 (1 << 8)
|
||||
#define OMAP2430_ST_MMCHS1 (1 << 7)
|
||||
#define OMAP2430_ST_USBHS (1 << 6)
|
||||
#define OMAP24XX_ST_UART3 (1 << 2)
|
||||
#define OMAP24XX_ST_USB (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_WKUP, CM_ICLKEN_WKUP, PM_WKEN_WKUP shared bits */
|
||||
#define OMAP24XX_EN_GPIOS_SHIFT 2
|
||||
#define OMAP24XX_EN_GPIOS (1 << 2)
|
||||
#define OMAP24XX_EN_GPT1_SHIFT 0
|
||||
#define OMAP24XX_EN_GPT1 (1 << 0)
|
||||
|
||||
/* PM_WKST_WKUP, CM_IDLEST_WKUP shared bits */
|
||||
#define OMAP24XX_ST_GPIOS (1 << 2)
|
||||
#define OMAP24XX_ST_GPT1 (1 << 0)
|
||||
|
||||
/* CM_IDLEST_MDM and PM_WKST_MDM shared bits */
|
||||
#define OMAP2430_ST_MDM (1 << 0)
|
||||
|
||||
|
||||
/* 3430 register bits shared between CM & PRM registers */
|
||||
|
||||
/* CM_REVISION, PRM_REVISION shared bits */
|
||||
#define OMAP3430_REV_SHIFT 0
|
||||
#define OMAP3430_REV_MASK (0xff << 0)
|
||||
|
||||
/* CM_SYSCONFIG, PRM_SYSCONFIG shared bits */
|
||||
#define OMAP3430_AUTOIDLE (1 << 0)
|
||||
|
||||
/* CM_FCLKEN1_CORE, CM_ICLKEN1_CORE, PM_WKEN1_CORE shared bits */
|
||||
#define OMAP3430_EN_MMC2 (1 << 25)
|
||||
#define OMAP3430_EN_MMC2_SHIFT 25
|
||||
#define OMAP3430_EN_MMC1 (1 << 24)
|
||||
#define OMAP3430_EN_MMC1_SHIFT 24
|
||||
#define OMAP3430_EN_MCSPI4 (1 << 21)
|
||||
#define OMAP3430_EN_MCSPI4_SHIFT 21
|
||||
#define OMAP3430_EN_MCSPI3 (1 << 20)
|
||||
#define OMAP3430_EN_MCSPI3_SHIFT 20
|
||||
#define OMAP3430_EN_MCSPI2 (1 << 19)
|
||||
#define OMAP3430_EN_MCSPI2_SHIFT 19
|
||||
#define OMAP3430_EN_MCSPI1 (1 << 18)
|
||||
#define OMAP3430_EN_MCSPI1_SHIFT 18
|
||||
#define OMAP3430_EN_I2C3 (1 << 17)
|
||||
#define OMAP3430_EN_I2C3_SHIFT 17
|
||||
#define OMAP3430_EN_I2C2 (1 << 16)
|
||||
#define OMAP3430_EN_I2C2_SHIFT 16
|
||||
#define OMAP3430_EN_I2C1 (1 << 15)
|
||||
#define OMAP3430_EN_I2C1_SHIFT 15
|
||||
#define OMAP3430_EN_UART2 (1 << 14)
|
||||
#define OMAP3430_EN_UART2_SHIFT 14
|
||||
#define OMAP3430_EN_UART1 (1 << 13)
|
||||
#define OMAP3430_EN_UART1_SHIFT 13
|
||||
#define OMAP3430_EN_GPT11 (1 << 12)
|
||||
#define OMAP3430_EN_GPT11_SHIFT 12
|
||||
#define OMAP3430_EN_GPT10 (1 << 11)
|
||||
#define OMAP3430_EN_GPT10_SHIFT 11
|
||||
#define OMAP3430_EN_MCBSP5 (1 << 10)
|
||||
#define OMAP3430_EN_MCBSP5_SHIFT 10
|
||||
#define OMAP3430_EN_MCBSP1 (1 << 9)
|
||||
#define OMAP3430_EN_MCBSP1_SHIFT 9
|
||||
#define OMAP3430_EN_FSHOSTUSB (1 << 5)
|
||||
#define OMAP3430_EN_FSHOSTUSB_SHIFT 5
|
||||
#define OMAP3430_EN_D2D (1 << 3)
|
||||
#define OMAP3430_EN_D2D_SHIFT 3
|
||||
|
||||
/* CM_ICLKEN1_CORE, PM_WKEN1_CORE shared bits */
|
||||
#define OMAP3430_EN_HSOTGUSB (1 << 4)
|
||||
#define OMAP3430_EN_HSOTGUSB_SHIFT 4
|
||||
|
||||
/* PM_WKST1_CORE, CM_IDLEST1_CORE shared bits */
|
||||
#define OMAP3430_ST_MMC2 (1 << 25)
|
||||
#define OMAP3430_ST_MMC1 (1 << 24)
|
||||
#define OMAP3430_ST_MCSPI4 (1 << 21)
|
||||
#define OMAP3430_ST_MCSPI3 (1 << 20)
|
||||
#define OMAP3430_ST_MCSPI2 (1 << 19)
|
||||
#define OMAP3430_ST_MCSPI1 (1 << 18)
|
||||
#define OMAP3430_ST_I2C3 (1 << 17)
|
||||
#define OMAP3430_ST_I2C2 (1 << 16)
|
||||
#define OMAP3430_ST_I2C1 (1 << 15)
|
||||
#define OMAP3430_ST_UART2 (1 << 14)
|
||||
#define OMAP3430_ST_UART1 (1 << 13)
|
||||
#define OMAP3430_ST_GPT11 (1 << 12)
|
||||
#define OMAP3430_ST_GPT10 (1 << 11)
|
||||
#define OMAP3430_ST_MCBSP5 (1 << 10)
|
||||
#define OMAP3430_ST_MCBSP1 (1 << 9)
|
||||
#define OMAP3430_ST_FSHOSTUSB (1 << 5)
|
||||
#define OMAP3430_ST_HSOTGUSB (1 << 4)
|
||||
#define OMAP3430_ST_D2D (1 << 3)
|
||||
|
||||
/* CM_FCLKEN_WKUP, CM_ICLKEN_WKUP, PM_WKEN_WKUP shared bits */
|
||||
#define OMAP3430_EN_GPIO1 (1 << 3)
|
||||
#define OMAP3430_EN_GPIO1_SHIFT 3
|
||||
#define OMAP3430_EN_GPT1 (1 << 0)
|
||||
#define OMAP3430_EN_GPT1_SHIFT 0
|
||||
|
||||
/* CM_FCLKEN_WKUP, PM_WKEN_WKUP shared bits */
|
||||
#define OMAP3430_EN_SR2 (1 << 7)
|
||||
#define OMAP3430_EN_SR2_SHIFT 7
|
||||
#define OMAP3430_EN_SR1 (1 << 6)
|
||||
#define OMAP3430_EN_SR1_SHIFT 6
|
||||
|
||||
/* CM_ICLKEN_WKUP, PM_WKEN_WKUP shared bits */
|
||||
#define OMAP3430_EN_GPT12 (1 << 1)
|
||||
#define OMAP3430_EN_GPT12_SHIFT 1
|
||||
|
||||
/* CM_IDLEST_WKUP, PM_WKST_WKUP shared bits */
|
||||
#define OMAP3430_ST_SR2 (1 << 7)
|
||||
#define OMAP3430_ST_SR1 (1 << 6)
|
||||
#define OMAP3430_ST_GPIO1 (1 << 3)
|
||||
#define OMAP3430_ST_GPT12 (1 << 1)
|
||||
#define OMAP3430_ST_GPT1 (1 << 0)
|
||||
|
||||
/*
|
||||
* CM_SLEEPDEP_GFX, CM_SLEEPDEP_DSS, CM_SLEEPDEP_CAM,
|
||||
* CM_SLEEPDEP_PER, PM_WKDEP_IVA2, PM_WKDEP_GFX,
|
||||
* PM_WKDEP_DSS, PM_WKDEP_CAM, PM_WKDEP_PER, PM_WKDEP_NEON shared bits
|
||||
*/
|
||||
#define OMAP3430_EN_MPU (1 << 1)
|
||||
#define OMAP3430_EN_MPU_SHIFT 1
|
||||
|
||||
/* CM_FCLKEN_PER, CM_ICLKEN_PER, PM_WKEN_PER shared bits */
|
||||
#define OMAP3430_EN_GPIO6 (1 << 17)
|
||||
#define OMAP3430_EN_GPIO6_SHIFT 17
|
||||
#define OMAP3430_EN_GPIO5 (1 << 16)
|
||||
#define OMAP3430_EN_GPIO5_SHIFT 16
|
||||
#define OMAP3430_EN_GPIO4 (1 << 15)
|
||||
#define OMAP3430_EN_GPIO4_SHIFT 15
|
||||
#define OMAP3430_EN_GPIO3 (1 << 14)
|
||||
#define OMAP3430_EN_GPIO3_SHIFT 14
|
||||
#define OMAP3430_EN_GPIO2 (1 << 13)
|
||||
#define OMAP3430_EN_GPIO2_SHIFT 13
|
||||
#define OMAP3430_EN_UART3 (1 << 11)
|
||||
#define OMAP3430_EN_UART3_SHIFT 11
|
||||
#define OMAP3430_EN_GPT9 (1 << 10)
|
||||
#define OMAP3430_EN_GPT9_SHIFT 10
|
||||
#define OMAP3430_EN_GPT8 (1 << 9)
|
||||
#define OMAP3430_EN_GPT8_SHIFT 9
|
||||
#define OMAP3430_EN_GPT7 (1 << 8)
|
||||
#define OMAP3430_EN_GPT7_SHIFT 8
|
||||
#define OMAP3430_EN_GPT6 (1 << 7)
|
||||
#define OMAP3430_EN_GPT6_SHIFT 7
|
||||
#define OMAP3430_EN_GPT5 (1 << 6)
|
||||
#define OMAP3430_EN_GPT5_SHIFT 6
|
||||
#define OMAP3430_EN_GPT4 (1 << 5)
|
||||
#define OMAP3430_EN_GPT4_SHIFT 5
|
||||
#define OMAP3430_EN_GPT3 (1 << 4)
|
||||
#define OMAP3430_EN_GPT3_SHIFT 4
|
||||
#define OMAP3430_EN_GPT2 (1 << 3)
|
||||
#define OMAP3430_EN_GPT2_SHIFT 3
|
||||
|
||||
/* CM_FCLKEN_PER, CM_ICLKEN_PER, PM_WKEN_PER, PM_WKST_PER shared bits */
|
||||
/* XXX Possible TI documentation bug: should the PM_WKST_PER EN_* bits
|
||||
* be ST_* bits instead? */
|
||||
#define OMAP3430_EN_MCBSP4 (1 << 2)
|
||||
#define OMAP3430_EN_MCBSP4_SHIFT 2
|
||||
#define OMAP3430_EN_MCBSP3 (1 << 1)
|
||||
#define OMAP3430_EN_MCBSP3_SHIFT 1
|
||||
#define OMAP3430_EN_MCBSP2 (1 << 0)
|
||||
#define OMAP3430_EN_MCBSP2_SHIFT 0
|
||||
|
||||
/* CM_IDLEST_PER, PM_WKST_PER shared bits */
|
||||
#define OMAP3430_ST_GPIO6 (1 << 17)
|
||||
#define OMAP3430_ST_GPIO5 (1 << 16)
|
||||
#define OMAP3430_ST_GPIO4 (1 << 15)
|
||||
#define OMAP3430_ST_GPIO3 (1 << 14)
|
||||
#define OMAP3430_ST_GPIO2 (1 << 13)
|
||||
#define OMAP3430_ST_UART3 (1 << 11)
|
||||
#define OMAP3430_ST_GPT9 (1 << 10)
|
||||
#define OMAP3430_ST_GPT8 (1 << 9)
|
||||
#define OMAP3430_ST_GPT7 (1 << 8)
|
||||
#define OMAP3430_ST_GPT6 (1 << 7)
|
||||
#define OMAP3430_ST_GPT5 (1 << 6)
|
||||
#define OMAP3430_ST_GPT4 (1 << 5)
|
||||
#define OMAP3430_ST_GPT3 (1 << 4)
|
||||
#define OMAP3430_ST_GPT2 (1 << 3)
|
||||
|
||||
/* CM_SLEEPDEP_PER, PM_WKDEP_IVA2, PM_WKDEP_MPU, PM_WKDEP_PER shared bits */
|
||||
#define OMAP3430_EN_CORE (1 << 0)
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -1,483 +0,0 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-omap2/prcm-regs.h
|
||||
*
|
||||
* OMAP24XX Power Reset and Clock Management (PRCM) registers
|
||||
*
|
||||
* Copyright (C) 2005 Texas Instruments, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_ARM_MACH_OMAP2_PRCM_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_PRCM_H
|
||||
|
||||
/* SET_PERFORMANCE_LEVEL PARAMETERS */
|
||||
#define PRCM_HALF_SPEED 1
|
||||
#define PRCM_FULL_SPEED 2
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#define PRCM_REG32(offset) __REG32(OMAP24XX_PRCM_BASE + (offset))
|
||||
|
||||
#define PRCM_REVISION PRCM_REG32(0x000)
|
||||
#define PRCM_SYSCONFIG PRCM_REG32(0x010)
|
||||
#define PRCM_IRQSTATUS_MPU PRCM_REG32(0x018)
|
||||
#define PRCM_IRQENABLE_MPU PRCM_REG32(0x01C)
|
||||
#define PRCM_VOLTCTRL PRCM_REG32(0x050)
|
||||
#define PRCM_VOLTST PRCM_REG32(0x054)
|
||||
#define PRCM_CLKSRC_CTRL PRCM_REG32(0x060)
|
||||
#define PRCM_CLKOUT_CTRL PRCM_REG32(0x070)
|
||||
#define PRCM_CLKEMUL_CTRL PRCM_REG32(0x078)
|
||||
#define PRCM_CLKCFG_CTRL PRCM_REG32(0x080)
|
||||
#define PRCM_CLKCFG_STATUS PRCM_REG32(0x084)
|
||||
#define PRCM_VOLTSETUP PRCM_REG32(0x090)
|
||||
#define PRCM_CLKSSETUP PRCM_REG32(0x094)
|
||||
#define PRCM_POLCTRL PRCM_REG32(0x098)
|
||||
|
||||
/* GENERAL PURPOSE */
|
||||
#define GENERAL_PURPOSE1 PRCM_REG32(0x0B0)
|
||||
#define GENERAL_PURPOSE2 PRCM_REG32(0x0B4)
|
||||
#define GENERAL_PURPOSE3 PRCM_REG32(0x0B8)
|
||||
#define GENERAL_PURPOSE4 PRCM_REG32(0x0BC)
|
||||
#define GENERAL_PURPOSE5 PRCM_REG32(0x0C0)
|
||||
#define GENERAL_PURPOSE6 PRCM_REG32(0x0C4)
|
||||
#define GENERAL_PURPOSE7 PRCM_REG32(0x0C8)
|
||||
#define GENERAL_PURPOSE8 PRCM_REG32(0x0CC)
|
||||
#define GENERAL_PURPOSE9 PRCM_REG32(0x0D0)
|
||||
#define GENERAL_PURPOSE10 PRCM_REG32(0x0D4)
|
||||
#define GENERAL_PURPOSE11 PRCM_REG32(0x0D8)
|
||||
#define GENERAL_PURPOSE12 PRCM_REG32(0x0DC)
|
||||
#define GENERAL_PURPOSE13 PRCM_REG32(0x0E0)
|
||||
#define GENERAL_PURPOSE14 PRCM_REG32(0x0E4)
|
||||
#define GENERAL_PURPOSE15 PRCM_REG32(0x0E8)
|
||||
#define GENERAL_PURPOSE16 PRCM_REG32(0x0EC)
|
||||
#define GENERAL_PURPOSE17 PRCM_REG32(0x0F0)
|
||||
#define GENERAL_PURPOSE18 PRCM_REG32(0x0F4)
|
||||
#define GENERAL_PURPOSE19 PRCM_REG32(0x0F8)
|
||||
#define GENERAL_PURPOSE20 PRCM_REG32(0x0FC)
|
||||
|
||||
/* MPU */
|
||||
#define CM_CLKSEL_MPU PRCM_REG32(0x140)
|
||||
#define CM_CLKSTCTRL_MPU PRCM_REG32(0x148)
|
||||
#define RM_RSTST_MPU PRCM_REG32(0x158)
|
||||
#define PM_WKDEP_MPU PRCM_REG32(0x1C8)
|
||||
#define PM_EVGENCTRL_MPU PRCM_REG32(0x1D4)
|
||||
#define PM_EVEGENONTIM_MPU PRCM_REG32(0x1D8)
|
||||
#define PM_EVEGENOFFTIM_MPU PRCM_REG32(0x1DC)
|
||||
#define PM_PWSTCTRL_MPU PRCM_REG32(0x1E0)
|
||||
#define PM_PWSTST_MPU PRCM_REG32(0x1E4)
|
||||
|
||||
/* CORE */
|
||||
#define CM_FCLKEN1_CORE PRCM_REG32(0x200)
|
||||
#define CM_FCLKEN2_CORE PRCM_REG32(0x204)
|
||||
#define CM_FCLKEN3_CORE PRCM_REG32(0x208)
|
||||
#define CM_ICLKEN1_CORE PRCM_REG32(0x210)
|
||||
#define CM_ICLKEN2_CORE PRCM_REG32(0x214)
|
||||
#define CM_ICLKEN3_CORE PRCM_REG32(0x218)
|
||||
#define CM_ICLKEN4_CORE PRCM_REG32(0x21C)
|
||||
#define CM_IDLEST1_CORE PRCM_REG32(0x220)
|
||||
#define CM_IDLEST2_CORE PRCM_REG32(0x224)
|
||||
#define CM_IDLEST3_CORE PRCM_REG32(0x228)
|
||||
#define CM_IDLEST4_CORE PRCM_REG32(0x22C)
|
||||
#define CM_AUTOIDLE1_CORE PRCM_REG32(0x230)
|
||||
#define CM_AUTOIDLE2_CORE PRCM_REG32(0x234)
|
||||
#define CM_AUTOIDLE3_CORE PRCM_REG32(0x238)
|
||||
#define CM_AUTOIDLE4_CORE PRCM_REG32(0x23C)
|
||||
#define CM_CLKSEL1_CORE PRCM_REG32(0x240)
|
||||
#define CM_CLKSEL2_CORE PRCM_REG32(0x244)
|
||||
#define CM_CLKSTCTRL_CORE PRCM_REG32(0x248)
|
||||
#define PM_WKEN1_CORE PRCM_REG32(0x2A0)
|
||||
#define PM_WKEN2_CORE PRCM_REG32(0x2A4)
|
||||
#define PM_WKST1_CORE PRCM_REG32(0x2B0)
|
||||
#define PM_WKST2_CORE PRCM_REG32(0x2B4)
|
||||
#define PM_WKDEP_CORE PRCM_REG32(0x2C8)
|
||||
#define PM_PWSTCTRL_CORE PRCM_REG32(0x2E0)
|
||||
#define PM_PWSTST_CORE PRCM_REG32(0x2E4)
|
||||
|
||||
/* GFX */
|
||||
#define CM_FCLKEN_GFX PRCM_REG32(0x300)
|
||||
#define CM_ICLKEN_GFX PRCM_REG32(0x310)
|
||||
#define CM_IDLEST_GFX PRCM_REG32(0x320)
|
||||
#define CM_CLKSEL_GFX PRCM_REG32(0x340)
|
||||
#define CM_CLKSTCTRL_GFX PRCM_REG32(0x348)
|
||||
#define RM_RSTCTRL_GFX PRCM_REG32(0x350)
|
||||
#define RM_RSTST_GFX PRCM_REG32(0x358)
|
||||
#define PM_WKDEP_GFX PRCM_REG32(0x3C8)
|
||||
#define PM_PWSTCTRL_GFX PRCM_REG32(0x3E0)
|
||||
#define PM_PWSTST_GFX PRCM_REG32(0x3E4)
|
||||
|
||||
/* WAKE-UP */
|
||||
#define CM_FCLKEN_WKUP PRCM_REG32(0x400)
|
||||
#define CM_ICLKEN_WKUP PRCM_REG32(0x410)
|
||||
#define CM_IDLEST_WKUP PRCM_REG32(0x420)
|
||||
#define CM_AUTOIDLE_WKUP PRCM_REG32(0x430)
|
||||
#define CM_CLKSEL_WKUP PRCM_REG32(0x440)
|
||||
#define RM_RSTCTRL_WKUP PRCM_REG32(0x450)
|
||||
#define RM_RSTTIME_WKUP PRCM_REG32(0x454)
|
||||
#define RM_RSTST_WKUP PRCM_REG32(0x458)
|
||||
#define PM_WKEN_WKUP PRCM_REG32(0x4A0)
|
||||
#define PM_WKST_WKUP PRCM_REG32(0x4B0)
|
||||
|
||||
/* CLOCKS */
|
||||
#define CM_CLKEN_PLL PRCM_REG32(0x500)
|
||||
#define CM_IDLEST_CKGEN PRCM_REG32(0x520)
|
||||
#define CM_AUTOIDLE_PLL PRCM_REG32(0x530)
|
||||
#define CM_CLKSEL1_PLL PRCM_REG32(0x540)
|
||||
#define CM_CLKSEL2_PLL PRCM_REG32(0x544)
|
||||
|
||||
/* DSP */
|
||||
#define CM_FCLKEN_DSP PRCM_REG32(0x800)
|
||||
#define CM_ICLKEN_DSP PRCM_REG32(0x810)
|
||||
#define CM_IDLEST_DSP PRCM_REG32(0x820)
|
||||
#define CM_AUTOIDLE_DSP PRCM_REG32(0x830)
|
||||
#define CM_CLKSEL_DSP PRCM_REG32(0x840)
|
||||
#define CM_CLKSTCTRL_DSP PRCM_REG32(0x848)
|
||||
#define RM_RSTCTRL_DSP PRCM_REG32(0x850)
|
||||
#define RM_RSTST_DSP PRCM_REG32(0x858)
|
||||
#define PM_WKEN_DSP PRCM_REG32(0x8A0)
|
||||
#define PM_WKDEP_DSP PRCM_REG32(0x8C8)
|
||||
#define PM_PWSTCTRL_DSP PRCM_REG32(0x8E0)
|
||||
#define PM_PWSTST_DSP PRCM_REG32(0x8E4)
|
||||
#define PRCM_IRQSTATUS_DSP PRCM_REG32(0x8F0)
|
||||
#define PRCM_IRQENABLE_DSP PRCM_REG32(0x8F4)
|
||||
|
||||
/* IVA */
|
||||
#define PRCM_IRQSTATUS_IVA PRCM_REG32(0x8F8)
|
||||
#define PRCM_IRQENABLE_IVA PRCM_REG32(0x8FC)
|
||||
|
||||
/* Modem on 2430 */
|
||||
#define CM_FCLKEN_MDM PRCM_REG32(0xC00)
|
||||
#define CM_ICLKEN_MDM PRCM_REG32(0xC10)
|
||||
#define CM_IDLEST_MDM PRCM_REG32(0xC20)
|
||||
#define CM_AUTOIDLE_MDM PRCM_REG32(0xC30)
|
||||
#define CM_CLKSEL_MDM PRCM_REG32(0xC40)
|
||||
#define CM_CLKSTCTRL_MDM PRCM_REG32(0xC48)
|
||||
#define RM_RSTCTRL_MDM PRCM_REG32(0xC50)
|
||||
#define RM_RSTST_MDM PRCM_REG32(0xC58)
|
||||
#define PM_WKEN_MDM PRCM_REG32(0xCA0)
|
||||
#define PM_WKST_MDM PRCM_REG32(0xCB0)
|
||||
#define PM_WKDEP_MDM PRCM_REG32(0xCC8)
|
||||
#define PM_PWSTCTRL_MDM PRCM_REG32(0xCE0)
|
||||
#define PM_PWSTST_MDM PRCM_REG32(0xCE4)
|
||||
|
||||
#define OMAP24XX_L4_IO_BASE 0x48000000
|
||||
|
||||
#define DISP_BASE (OMAP24XX_L4_IO_BASE + 0x50000)
|
||||
#define DISP_REG32(offset) __REG32(DISP_BASE + (offset))
|
||||
|
||||
#define OMAP24XX_GPMC_BASE (L3_24XX_BASE + 0xa000)
|
||||
#define GPMC_REG32(offset) __REG32(OMAP24XX_GPMC_BASE + (offset))
|
||||
|
||||
/* FIXME: Move these to timer code */
|
||||
#define GPT1_BASE (0x48028000)
|
||||
#define GPT1_REG32(offset) __REG32(GPT1_BASE + (offset))
|
||||
|
||||
/* Misc sysconfig */
|
||||
#define DISPC_SYSCONFIG DISP_REG32(0x410)
|
||||
#define SPI_BASE (OMAP24XX_L4_IO_BASE + 0x98000)
|
||||
#define MCSPI1_SYSCONFIG __REG32(SPI_BASE + 0x10)
|
||||
#define MCSPI2_SYSCONFIG __REG32(SPI_BASE + 0x2000 + 0x10)
|
||||
#define MCSPI3_SYSCONFIG __REG32(OMAP24XX_L4_IO_BASE + 0xb8010)
|
||||
|
||||
#define CAMERA_MMU_SYSCONFIG __REG32(DISP_BASE + 0x2C10)
|
||||
#define CAMERA_DMA_SYSCONFIG __REG32(DISP_BASE + 0x282C)
|
||||
#define SYSTEM_DMA_SYSCONFIG __REG32(DISP_BASE + 0x602C)
|
||||
#define GPMC_SYSCONFIG GPMC_REG32(0x010)
|
||||
#define MAILBOXES_SYSCONFIG __REG32(OMAP24XX_L4_IO_BASE + 0x94010)
|
||||
#define UART1_SYSCONFIG __REG32(OMAP24XX_L4_IO_BASE + 0x6A054)
|
||||
#define UART2_SYSCONFIG __REG32(OMAP24XX_L4_IO_BASE + 0x6C054)
|
||||
#define UART3_SYSCONFIG __REG32(OMAP24XX_L4_IO_BASE + 0x6E054)
|
||||
#define SDRC_SYSCONFIG __REG32(OMAP24XX_SDRC_BASE + 0x10)
|
||||
#define OMAP24XX_SMS_BASE (L3_24XX_BASE + 0x8000)
|
||||
#define SMS_SYSCONFIG __REG32(OMAP24XX_SMS_BASE + 0x10)
|
||||
#define SSI_SYSCONFIG __REG32(DISP_BASE + 0x8010)
|
||||
|
||||
/* rkw - good cannidates for PM_ to start what nm was trying */
|
||||
#define OMAP24XX_GPT2 (OMAP24XX_L4_IO_BASE + 0x2A000)
|
||||
#define OMAP24XX_GPT3 (OMAP24XX_L4_IO_BASE + 0x78000)
|
||||
#define OMAP24XX_GPT4 (OMAP24XX_L4_IO_BASE + 0x7A000)
|
||||
#define OMAP24XX_GPT5 (OMAP24XX_L4_IO_BASE + 0x7C000)
|
||||
#define OMAP24XX_GPT6 (OMAP24XX_L4_IO_BASE + 0x7E000)
|
||||
#define OMAP24XX_GPT7 (OMAP24XX_L4_IO_BASE + 0x80000)
|
||||
#define OMAP24XX_GPT8 (OMAP24XX_L4_IO_BASE + 0x82000)
|
||||
#define OMAP24XX_GPT9 (OMAP24XX_L4_IO_BASE + 0x84000)
|
||||
#define OMAP24XX_GPT10 (OMAP24XX_L4_IO_BASE + 0x86000)
|
||||
#define OMAP24XX_GPT11 (OMAP24XX_L4_IO_BASE + 0x88000)
|
||||
#define OMAP24XX_GPT12 (OMAP24XX_L4_IO_BASE + 0x8A000)
|
||||
|
||||
/* FIXME: Move these to timer code */
|
||||
#define GPTIMER1_SYSCONFIG GPT1_REG32(0x010)
|
||||
#define GPTIMER2_SYSCONFIG __REG32(OMAP24XX_GPT2 + 0x10)
|
||||
#define GPTIMER3_SYSCONFIG __REG32(OMAP24XX_GPT3 + 0x10)
|
||||
#define GPTIMER4_SYSCONFIG __REG32(OMAP24XX_GPT4 + 0x10)
|
||||
#define GPTIMER5_SYSCONFIG __REG32(OMAP24XX_GPT5 + 0x10)
|
||||
#define GPTIMER6_SYSCONFIG __REG32(OMAP24XX_GPT6 + 0x10)
|
||||
#define GPTIMER7_SYSCONFIG __REG32(OMAP24XX_GPT7 + 0x10)
|
||||
#define GPTIMER8_SYSCONFIG __REG32(OMAP24XX_GPT8 + 0x10)
|
||||
#define GPTIMER9_SYSCONFIG __REG32(OMAP24XX_GPT9 + 0x10)
|
||||
#define GPTIMER10_SYSCONFIG __REG32(OMAP24XX_GPT10 + 0x10)
|
||||
#define GPTIMER11_SYSCONFIG __REG32(OMAP24XX_GPT11 + 0x10)
|
||||
#define GPTIMER12_SYSCONFIG __REG32(OMAP24XX_GPT12 + 0x10)
|
||||
|
||||
/* FIXME: Move these to gpio code */
|
||||
#define OMAP24XX_GPIO_BASE 0x48018000
|
||||
#define GPIOX_BASE(X) (OMAP24XX_GPIO_BASE + (0x2000 * ((X) - 1)))
|
||||
|
||||
#define GPIO1_SYSCONFIG __REG32((GPIOX_BASE(1) + 0x10))
|
||||
#define GPIO2_SYSCONFIG __REG32((GPIOX_BASE(2) + 0x10))
|
||||
#define GPIO3_SYSCONFIG __REG32((GPIOX_BASE(3) + 0x10))
|
||||
#define GPIO4_SYSCONFIG __REG32((GPIOX_BASE(4) + 0x10))
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP243X)
|
||||
#define GPIO5_SYSCONFIG __REG32((OMAP24XX_GPIO5_BASE + 0x10))
|
||||
#endif
|
||||
|
||||
/* GP TIMER 1 */
|
||||
#define GPTIMER1_TISTAT GPT1_REG32(0x014)
|
||||
#define GPTIMER1_TISR GPT1_REG32(0x018)
|
||||
#define GPTIMER1_TIER GPT1_REG32(0x01C)
|
||||
#define GPTIMER1_TWER GPT1_REG32(0x020)
|
||||
#define GPTIMER1_TCLR GPT1_REG32(0x024)
|
||||
#define GPTIMER1_TCRR GPT1_REG32(0x028)
|
||||
#define GPTIMER1_TLDR GPT1_REG32(0x02C)
|
||||
#define GPTIMER1_TTGR GPT1_REG32(0x030)
|
||||
#define GPTIMER1_TWPS GPT1_REG32(0x034)
|
||||
#define GPTIMER1_TMAR GPT1_REG32(0x038)
|
||||
#define GPTIMER1_TCAR1 GPT1_REG32(0x03C)
|
||||
#define GPTIMER1_TSICR GPT1_REG32(0x040)
|
||||
#define GPTIMER1_TCAR2 GPT1_REG32(0x044)
|
||||
|
||||
/* rkw -- base fix up please... */
|
||||
#define GPTIMER3_TISR __REG32(OMAP24XX_L4_IO_BASE + 0x78018)
|
||||
|
||||
/* SDRC */
|
||||
#define SDRC_DLLA_CTRL __REG32(OMAP24XX_SDRC_BASE + 0x060)
|
||||
#define SDRC_DLLA_STATUS __REG32(OMAP24XX_SDRC_BASE + 0x064)
|
||||
#define SDRC_DLLB_CTRL __REG32(OMAP24XX_SDRC_BASE + 0x068)
|
||||
#define SDRC_DLLB_STATUS __REG32(OMAP24XX_SDRC_BASE + 0x06C)
|
||||
#define SDRC_POWER __REG32(OMAP24XX_SDRC_BASE + 0x070)
|
||||
#define SDRC_MR_0 __REG32(OMAP24XX_SDRC_BASE + 0x084)
|
||||
|
||||
/* GPIO 1 */
|
||||
#define GPIO1_BASE GPIOX_BASE(1)
|
||||
#define GPIO1_REG32(offset) __REG32(GPIO1_BASE + (offset))
|
||||
#define GPIO1_IRQENABLE1 GPIO1_REG32(0x01C)
|
||||
#define GPIO1_IRQSTATUS1 GPIO1_REG32(0x018)
|
||||
#define GPIO1_IRQENABLE2 GPIO1_REG32(0x02C)
|
||||
#define GPIO1_IRQSTATUS2 GPIO1_REG32(0x028)
|
||||
#define GPIO1_WAKEUPENABLE GPIO1_REG32(0x020)
|
||||
#define GPIO1_RISINGDETECT GPIO1_REG32(0x048)
|
||||
#define GPIO1_DATAIN GPIO1_REG32(0x038)
|
||||
#define GPIO1_OE GPIO1_REG32(0x034)
|
||||
#define GPIO1_DATAOUT GPIO1_REG32(0x03C)
|
||||
|
||||
/* GPIO2 */
|
||||
#define GPIO2_BASE GPIOX_BASE(2)
|
||||
#define GPIO2_REG32(offset) __REG32(GPIO2_BASE + (offset))
|
||||
#define GPIO2_IRQENABLE1 GPIO2_REG32(0x01C)
|
||||
#define GPIO2_IRQSTATUS1 GPIO2_REG32(0x018)
|
||||
#define GPIO2_IRQENABLE2 GPIO2_REG32(0x02C)
|
||||
#define GPIO2_IRQSTATUS2 GPIO2_REG32(0x028)
|
||||
#define GPIO2_WAKEUPENABLE GPIO2_REG32(0x020)
|
||||
#define GPIO2_RISINGDETECT GPIO2_REG32(0x048)
|
||||
#define GPIO2_DATAIN GPIO2_REG32(0x038)
|
||||
#define GPIO2_OE GPIO2_REG32(0x034)
|
||||
#define GPIO2_DATAOUT GPIO2_REG32(0x03C)
|
||||
#define GPIO2_DEBOUNCENABLE GPIO2_REG32(0x050)
|
||||
#define GPIO2_DEBOUNCINGTIME GPIO2_REG32(0x054)
|
||||
|
||||
/* GPIO 3 */
|
||||
#define GPIO3_BASE GPIOX_BASE(3)
|
||||
#define GPIO3_REG32(offset) __REG32(GPIO3_BASE + (offset))
|
||||
#define GPIO3_IRQENABLE1 GPIO3_REG32(0x01C)
|
||||
#define GPIO3_IRQSTATUS1 GPIO3_REG32(0x018)
|
||||
#define GPIO3_IRQENABLE2 GPIO3_REG32(0x02C)
|
||||
#define GPIO3_IRQSTATUS2 GPIO3_REG32(0x028)
|
||||
#define GPIO3_WAKEUPENABLE GPIO3_REG32(0x020)
|
||||
#define GPIO3_RISINGDETECT GPIO3_REG32(0x048)
|
||||
#define GPIO3_FALLINGDETECT GPIO3_REG32(0x04C)
|
||||
#define GPIO3_DATAIN GPIO3_REG32(0x038)
|
||||
#define GPIO3_OE GPIO3_REG32(0x034)
|
||||
#define GPIO3_DATAOUT GPIO3_REG32(0x03C)
|
||||
#define GPIO3_DEBOUNCENABLE GPIO3_REG32(0x050)
|
||||
#define GPIO3_DEBOUNCINGTIME GPIO3_REG32(0x054)
|
||||
#define GPIO3_DEBOUNCENABLE GPIO3_REG32(0x050)
|
||||
#define GPIO3_DEBOUNCINGTIME GPIO3_REG32(0x054)
|
||||
|
||||
/* GPIO 4 */
|
||||
#define GPIO4_BASE GPIOX_BASE(4)
|
||||
#define GPIO4_REG32(offset) __REG32(GPIO4_BASE + (offset))
|
||||
#define GPIO4_IRQENABLE1 GPIO4_REG32(0x01C)
|
||||
#define GPIO4_IRQSTATUS1 GPIO4_REG32(0x018)
|
||||
#define GPIO4_IRQENABLE2 GPIO4_REG32(0x02C)
|
||||
#define GPIO4_IRQSTATUS2 GPIO4_REG32(0x028)
|
||||
#define GPIO4_WAKEUPENABLE GPIO4_REG32(0x020)
|
||||
#define GPIO4_RISINGDETECT GPIO4_REG32(0x048)
|
||||
#define GPIO4_FALLINGDETECT GPIO4_REG32(0x04C)
|
||||
#define GPIO4_DATAIN GPIO4_REG32(0x038)
|
||||
#define GPIO4_OE GPIO4_REG32(0x034)
|
||||
#define GPIO4_DATAOUT GPIO4_REG32(0x03C)
|
||||
#define GPIO4_DEBOUNCENABLE GPIO4_REG32(0x050)
|
||||
#define GPIO4_DEBOUNCINGTIME GPIO4_REG32(0x054)
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP243X)
|
||||
/* GPIO 5 */
|
||||
#define GPIO5_REG32(offset) __REG32((OMAP24XX_GPIO5_BASE + (offset)))
|
||||
#define GPIO5_IRQENABLE1 GPIO5_REG32(0x01C)
|
||||
#define GPIO5_IRQSTATUS1 GPIO5_REG32(0x018)
|
||||
#define GPIO5_IRQENABLE2 GPIO5_REG32(0x02C)
|
||||
#define GPIO5_IRQSTATUS2 GPIO5_REG32(0x028)
|
||||
#define GPIO5_WAKEUPENABLE GPIO5_REG32(0x020)
|
||||
#define GPIO5_RISINGDETECT GPIO5_REG32(0x048)
|
||||
#define GPIO5_FALLINGDETECT GPIO5_REG32(0x04C)
|
||||
#define GPIO5_DATAIN GPIO5_REG32(0x038)
|
||||
#define GPIO5_OE GPIO5_REG32(0x034)
|
||||
#define GPIO5_DATAOUT GPIO5_REG32(0x03C)
|
||||
#define GPIO5_DEBOUNCENABLE GPIO5_REG32(0x050)
|
||||
#define GPIO5_DEBOUNCINGTIME GPIO5_REG32(0x054)
|
||||
#endif
|
||||
|
||||
/* IO CONFIG */
|
||||
#define OMAP24XX_CTRL_BASE (L4_24XX_BASE)
|
||||
#define CONTROL_REG32(offset) __REG32(OMAP24XX_CTRL_BASE + (offset))
|
||||
|
||||
#define CONTROL_PADCONF_SPI1_NCS2 CONTROL_REG32(0x104)
|
||||
#define CONTROL_PADCONF_SYS_XTALOUT CONTROL_REG32(0x134)
|
||||
#define CONTROL_PADCONF_UART1_RX CONTROL_REG32(0x0C8)
|
||||
#define CONTROL_PADCONF_MCBSP1_DX CONTROL_REG32(0x10C)
|
||||
#define CONTROL_PADCONF_GPMC_NCS4 CONTROL_REG32(0x090)
|
||||
#define CONTROL_PADCONF_DSS_D5 CONTROL_REG32(0x0B8)
|
||||
#define CONTROL_PADCONF_DSS_D9 CONTROL_REG32(0x0BC) /* 2420 */
|
||||
#define CONTROL_PADCONF_DSS_D13 CONTROL_REG32(0x0C0)
|
||||
#define CONTROL_PADCONF_DSS_VSYNC CONTROL_REG32(0x0CC)
|
||||
#define CONTROL_PADCONF_SYS_NIRQW0 CONTROL_REG32(0x0BC) /* 2430 */
|
||||
#define CONTROL_PADCONF_SSI1_FLAG_TX CONTROL_REG32(0x108) /* 2430 */
|
||||
|
||||
/* CONTROL */
|
||||
#define CONTROL_DEVCONF CONTROL_REG32(0x274)
|
||||
#define CONTROL_DEVCONF1 CONTROL_REG32(0x2E8)
|
||||
|
||||
/* INTERRUPT CONTROLLER */
|
||||
#define INTC_BASE ((L4_24XX_BASE) + 0xfe000)
|
||||
#define INTC_REG32(offset) __REG32(INTC_BASE + (offset))
|
||||
|
||||
#define INTC1_U_BASE INTC_REG32(0x000)
|
||||
#define INTC_MIR0 INTC_REG32(0x084)
|
||||
#define INTC_MIR_SET0 INTC_REG32(0x08C)
|
||||
#define INTC_MIR_CLEAR0 INTC_REG32(0x088)
|
||||
#define INTC_ISR_CLEAR0 INTC_REG32(0x094)
|
||||
#define INTC_MIR1 INTC_REG32(0x0A4)
|
||||
#define INTC_MIR_SET1 INTC_REG32(0x0AC)
|
||||
#define INTC_MIR_CLEAR1 INTC_REG32(0x0A8)
|
||||
#define INTC_ISR_CLEAR1 INTC_REG32(0x0B4)
|
||||
#define INTC_MIR2 INTC_REG32(0x0C4)
|
||||
#define INTC_MIR_SET2 INTC_REG32(0x0CC)
|
||||
#define INTC_MIR_CLEAR2 INTC_REG32(0x0C8)
|
||||
#define INTC_ISR_CLEAR2 INTC_REG32(0x0D4)
|
||||
#define INTC_SIR_IRQ INTC_REG32(0x040)
|
||||
#define INTC_CONTROL INTC_REG32(0x048)
|
||||
#define INTC_ILR11 INTC_REG32(0x12C) /* PRCM on MPU PIC */
|
||||
#define INTC_ILR30 INTC_REG32(0x178)
|
||||
#define INTC_ILR31 INTC_REG32(0x17C)
|
||||
#define INTC_ILR32 INTC_REG32(0x180)
|
||||
#define INTC_ILR37 INTC_REG32(0x194) /* GPIO4 on MPU PIC */
|
||||
#define INTC_SYSCONFIG INTC_REG32(0x010) /* GPT1 on MPU PIC */
|
||||
|
||||
/* RAM FIREWALL */
|
||||
#define RAMFW_BASE (0x68005000)
|
||||
#define RAMFW_REG32(offset) __REG32(RAMFW_BASE + (offset))
|
||||
|
||||
#define RAMFW_REQINFOPERM0 RAMFW_REG32(0x048)
|
||||
#define RAMFW_READPERM0 RAMFW_REG32(0x050)
|
||||
#define RAMFW_WRITEPERM0 RAMFW_REG32(0x058)
|
||||
|
||||
/* GPMC CS1 FPGA ON USER INTERFACE MODULE */
|
||||
//#define DEBUG_BOARD_LED_REGISTER 0x04000014
|
||||
|
||||
/* GPMC CS0 */
|
||||
#define GPMC_CONFIG1_0 GPMC_REG32(0x060)
|
||||
#define GPMC_CONFIG2_0 GPMC_REG32(0x064)
|
||||
#define GPMC_CONFIG3_0 GPMC_REG32(0x068)
|
||||
#define GPMC_CONFIG4_0 GPMC_REG32(0x06C)
|
||||
#define GPMC_CONFIG5_0 GPMC_REG32(0x070)
|
||||
#define GPMC_CONFIG6_0 GPMC_REG32(0x074)
|
||||
#define GPMC_CONFIG7_0 GPMC_REG32(0x078)
|
||||
|
||||
/* GPMC CS1 */
|
||||
#define GPMC_CONFIG1_1 GPMC_REG32(0x090)
|
||||
#define GPMC_CONFIG2_1 GPMC_REG32(0x094)
|
||||
#define GPMC_CONFIG3_1 GPMC_REG32(0x098)
|
||||
#define GPMC_CONFIG4_1 GPMC_REG32(0x09C)
|
||||
#define GPMC_CONFIG5_1 GPMC_REG32(0x0a0)
|
||||
#define GPMC_CONFIG6_1 GPMC_REG32(0x0a4)
|
||||
#define GPMC_CONFIG7_1 GPMC_REG32(0x0a8)
|
||||
|
||||
/* GPMC CS3 */
|
||||
#define GPMC_CONFIG1_3 GPMC_REG32(0x0F0)
|
||||
#define GPMC_CONFIG2_3 GPMC_REG32(0x0F4)
|
||||
#define GPMC_CONFIG3_3 GPMC_REG32(0x0F8)
|
||||
#define GPMC_CONFIG4_3 GPMC_REG32(0x0FC)
|
||||
#define GPMC_CONFIG5_3 GPMC_REG32(0x100)
|
||||
#define GPMC_CONFIG6_3 GPMC_REG32(0x104)
|
||||
#define GPMC_CONFIG7_3 GPMC_REG32(0x108)
|
||||
|
||||
/* DSS */
|
||||
#define DSS_CONTROL DISP_REG32(0x040)
|
||||
#define DISPC_CONTROL DISP_REG32(0x440)
|
||||
#define DISPC_SYSSTATUS DISP_REG32(0x414)
|
||||
#define DISPC_IRQSTATUS DISP_REG32(0x418)
|
||||
#define DISPC_IRQENABLE DISP_REG32(0x41C)
|
||||
#define DISPC_CONFIG DISP_REG32(0x444)
|
||||
#define DISPC_DEFAULT_COLOR0 DISP_REG32(0x44C)
|
||||
#define DISPC_DEFAULT_COLOR1 DISP_REG32(0x450)
|
||||
#define DISPC_TRANS_COLOR0 DISP_REG32(0x454)
|
||||
#define DISPC_TRANS_COLOR1 DISP_REG32(0x458)
|
||||
#define DISPC_LINE_NUMBER DISP_REG32(0x460)
|
||||
#define DISPC_TIMING_H DISP_REG32(0x464)
|
||||
#define DISPC_TIMING_V DISP_REG32(0x468)
|
||||
#define DISPC_POL_FREQ DISP_REG32(0x46C)
|
||||
#define DISPC_DIVISOR DISP_REG32(0x470)
|
||||
#define DISPC_SIZE_DIG DISP_REG32(0x478)
|
||||
#define DISPC_SIZE_LCD DISP_REG32(0x47C)
|
||||
#define DISPC_GFX_BA0 DISP_REG32(0x480)
|
||||
#define DISPC_GFX_BA1 DISP_REG32(0x484)
|
||||
#define DISPC_GFX_POSITION DISP_REG32(0x488)
|
||||
#define DISPC_GFX_SIZE DISP_REG32(0x48C)
|
||||
#define DISPC_GFX_ATTRIBUTES DISP_REG32(0x4A0)
|
||||
#define DISPC_GFX_FIFO_THRESHOLD DISP_REG32(0x4A4)
|
||||
#define DISPC_GFX_ROW_INC DISP_REG32(0x4AC)
|
||||
#define DISPC_GFX_PIXEL_INC DISP_REG32(0x4B0)
|
||||
#define DISPC_GFX_WINDOW_SKIP DISP_REG32(0x4B4)
|
||||
#define DISPC_GFX_TABLE_BA DISP_REG32(0x4B8)
|
||||
#define DISPC_DATA_CYCLE1 DISP_REG32(0x5D4)
|
||||
#define DISPC_DATA_CYCLE2 DISP_REG32(0x5D8)
|
||||
#define DISPC_DATA_CYCLE3 DISP_REG32(0x5DC)
|
||||
|
||||
/* HSUSB Suspend */
|
||||
#define HSUSB_CTRL __REG8(0x480AC001)
|
||||
#define USBOTG_POWER __REG32(0x480AC000)
|
||||
|
||||
/* HS MMC */
|
||||
#define MMCHS1_SYSCONFIG __REG32(0x4809C010)
|
||||
#define MMCHS2_SYSCONFIG __REG32(0x480b4010)
|
||||
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -17,19 +17,27 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include "prcm-regs.h"
|
||||
#include <asm/io.h>
|
||||
|
||||
#include "prm.h"
|
||||
#include "prm-regbits-24xx.h"
|
||||
|
||||
extern void omap2_clk_prepare_for_reboot(void);
|
||||
|
||||
u32 omap_prcm_get_reset_sources(void)
|
||||
{
|
||||
return RM_RSTST_WKUP & 0x7f;
|
||||
return prm_read_mod_reg(WKUP_MOD, RM_RSTST) & 0x7f;
|
||||
}
|
||||
EXPORT_SYMBOL(omap_prcm_get_reset_sources);
|
||||
|
||||
/* Resets clock rates and reboots the system. Only called from system.h */
|
||||
void omap_prcm_arch_reset(char mode)
|
||||
{
|
||||
u32 wkup;
|
||||
omap2_clk_prepare_for_reboot();
|
||||
RM_RSTCTRL_WKUP |= 2;
|
||||
|
||||
if (cpu_is_omap24xx()) {
|
||||
wkup = prm_read_mod_reg(WKUP_MOD, RM_RSTCTRL) | OMAP_RST_DPLL3;
|
||||
prm_write_mod_reg(wkup, WKUP_MOD, RM_RSTCTRL);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
279
arch/arm/mach-omap2/prm-regbits-24xx.h
Normal file
279
arch/arm/mach-omap2/prm-regbits-24xx.h
Normal file
|
|
@ -0,0 +1,279 @@
|
|||
#ifndef __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_24XX_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_24XX_H
|
||||
|
||||
/*
|
||||
* OMAP24XX Power/Reset Management register bits
|
||||
*
|
||||
* Copyright (C) 2007 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* 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 "prm.h"
|
||||
|
||||
/* Bits shared between registers */
|
||||
|
||||
/* PRCM_IRQSTATUS_MPU, PM_IRQSTATUS_DSP, PRCM_IRQSTATUS_IVA shared bits */
|
||||
#define OMAP24XX_VOLTTRANS_ST (1 << 2)
|
||||
#define OMAP24XX_WKUP2_ST (1 << 1)
|
||||
#define OMAP24XX_WKUP1_ST (1 << 0)
|
||||
|
||||
/* PRCM_IRQENABLE_MPU, PM_IRQENABLE_DSP, PRCM_IRQENABLE_IVA shared bits */
|
||||
#define OMAP24XX_VOLTTRANS_EN (1 << 2)
|
||||
#define OMAP24XX_WKUP2_EN (1 << 1)
|
||||
#define OMAP24XX_WKUP1_EN (1 << 0)
|
||||
|
||||
/* PM_WKDEP_GFX, PM_WKDEP_MPU, PM_WKDEP_DSP, PM_WKDEP_MDM shared bits */
|
||||
#define OMAP24XX_EN_MPU (1 << 1)
|
||||
#define OMAP24XX_EN_CORE (1 << 0)
|
||||
|
||||
/*
|
||||
* PM_PWSTCTRL_MPU, PM_PWSTCTRL_GFX, PM_PWSTCTRL_DSP, PM_PWSTCTRL_MDM
|
||||
* shared bits
|
||||
*/
|
||||
#define OMAP24XX_MEMONSTATE_SHIFT 10
|
||||
#define OMAP24XX_MEMONSTATE_MASK (0x3 << 10)
|
||||
#define OMAP24XX_MEMRETSTATE (1 << 3)
|
||||
|
||||
/* PM_PWSTCTRL_GFX, PM_PWSTCTRL_DSP, PM_PWSTCTRL_MDM shared bits */
|
||||
#define OMAP24XX_FORCESTATE (1 << 18)
|
||||
|
||||
/*
|
||||
* PM_PWSTST_CORE, PM_PWSTST_GFX, PM_PWSTST_MPU, PM_PWSTST_DSP,
|
||||
* PM_PWSTST_MDM shared bits
|
||||
*/
|
||||
#define OMAP24XX_CLKACTIVITY (1 << 19)
|
||||
|
||||
/* PM_PWSTST_MPU, PM_PWSTST_CORE, PM_PWSTST_DSP shared bits */
|
||||
#define OMAP24XX_LASTSTATEENTERED_SHIFT 4
|
||||
#define OMAP24XX_LASTSTATEENTERED_MASK (0x3 << 4)
|
||||
|
||||
/* PM_PWSTST_MPU and PM_PWSTST_DSP shared bits */
|
||||
#define OMAP2430_MEMSTATEST_SHIFT 10
|
||||
#define OMAP2430_MEMSTATEST_MASK (0x3 << 10)
|
||||
|
||||
/* PM_PWSTST_GFX, PM_PWSTST_DSP, PM_PWSTST_MDM shared bits */
|
||||
#define OMAP24XX_POWERSTATEST_SHIFT 0
|
||||
#define OMAP24XX_POWERSTATEST_MASK (0x3 << 0)
|
||||
|
||||
|
||||
/* Bits specific to each register */
|
||||
|
||||
/* PRCM_REVISION */
|
||||
#define OMAP24XX_REV_SHIFT 0
|
||||
#define OMAP24XX_REV_MASK (0xff << 0)
|
||||
|
||||
/* PRCM_SYSCONFIG */
|
||||
#define OMAP24XX_AUTOIDLE (1 << 0)
|
||||
|
||||
/* PRCM_IRQSTATUS_MPU specific bits */
|
||||
#define OMAP2430_DPLL_RECAL_ST (1 << 6)
|
||||
#define OMAP24XX_TRANSITION_ST (1 << 5)
|
||||
#define OMAP24XX_EVGENOFF_ST (1 << 4)
|
||||
#define OMAP24XX_EVGENON_ST (1 << 3)
|
||||
|
||||
/* PRCM_IRQENABLE_MPU specific bits */
|
||||
#define OMAP2430_DPLL_RECAL_EN (1 << 6)
|
||||
#define OMAP24XX_TRANSITION_EN (1 << 5)
|
||||
#define OMAP24XX_EVGENOFF_EN (1 << 4)
|
||||
#define OMAP24XX_EVGENON_EN (1 << 3)
|
||||
|
||||
/* PRCM_VOLTCTRL */
|
||||
#define OMAP24XX_AUTO_EXTVOLT (1 << 15)
|
||||
#define OMAP24XX_FORCE_EXTVOLT (1 << 14)
|
||||
#define OMAP24XX_SETOFF_LEVEL_SHIFT 12
|
||||
#define OMAP24XX_SETOFF_LEVEL_MASK (0x3 << 12)
|
||||
#define OMAP24XX_MEMRETCTRL (1 << 8)
|
||||
#define OMAP24XX_SETRET_LEVEL_SHIFT 6
|
||||
#define OMAP24XX_SETRET_LEVEL_MASK (0x3 << 6)
|
||||
#define OMAP24XX_VOLT_LEVEL_SHIFT 0
|
||||
#define OMAP24XX_VOLT_LEVEL_MASK (0x3 << 0)
|
||||
|
||||
/* PRCM_VOLTST */
|
||||
#define OMAP24XX_ST_VOLTLEVEL_SHIFT 0
|
||||
#define OMAP24XX_ST_VOLTLEVEL_MASK (0x3 << 0)
|
||||
|
||||
/* PRCM_CLKSRC_CTRL specific bits */
|
||||
|
||||
/* PRCM_CLKOUT_CTRL */
|
||||
#define OMAP2420_CLKOUT2_EN_SHIFT 15
|
||||
#define OMAP2420_CLKOUT2_EN (1 << 15)
|
||||
#define OMAP2420_CLKOUT2_DIV_SHIFT 11
|
||||
#define OMAP2420_CLKOUT2_DIV_MASK (0x7 << 11)
|
||||
#define OMAP2420_CLKOUT2_SOURCE_SHIFT 8
|
||||
#define OMAP2420_CLKOUT2_SOURCE_MASK (0x3 << 8)
|
||||
#define OMAP24XX_CLKOUT_EN_SHIFT 7
|
||||
#define OMAP24XX_CLKOUT_EN (1 << 7)
|
||||
#define OMAP24XX_CLKOUT_DIV_SHIFT 3
|
||||
#define OMAP24XX_CLKOUT_DIV_MASK (0x7 << 3)
|
||||
#define OMAP24XX_CLKOUT_SOURCE_SHIFT 0
|
||||
#define OMAP24XX_CLKOUT_SOURCE_MASK (0x3 << 0)
|
||||
|
||||
/* PRCM_CLKEMUL_CTRL */
|
||||
#define OMAP24XX_EMULATION_EN_SHIFT 0
|
||||
#define OMAP24XX_EMULATION_EN (1 << 0)
|
||||
|
||||
/* PRCM_CLKCFG_CTRL */
|
||||
#define OMAP24XX_VALID_CONFIG (1 << 0)
|
||||
|
||||
/* PRCM_CLKCFG_STATUS */
|
||||
#define OMAP24XX_CONFIG_STATUS (1 << 0)
|
||||
|
||||
/* PRCM_VOLTSETUP specific bits */
|
||||
|
||||
/* PRCM_CLKSSETUP specific bits */
|
||||
|
||||
/* PRCM_POLCTRL */
|
||||
#define OMAP2420_CLKOUT2_POL (1 << 10)
|
||||
#define OMAP24XX_CLKOUT_POL (1 << 9)
|
||||
#define OMAP24XX_CLKREQ_POL (1 << 8)
|
||||
#define OMAP2430_USE_POWEROK (1 << 2)
|
||||
#define OMAP2430_POWEROK_POL (1 << 1)
|
||||
#define OMAP24XX_EXTVOL_POL (1 << 0)
|
||||
|
||||
/* RM_RSTST_MPU specific bits */
|
||||
/* 2430 calls GLOBALWMPU_RST "GLOBALWARM_RST" instead */
|
||||
|
||||
/* PM_WKDEP_MPU specific bits */
|
||||
#define OMAP2430_PM_WKDEP_MPU_EN_MDM (1 << 5)
|
||||
#define OMAP24XX_PM_WKDEP_MPU_EN_DSP (1 << 2)
|
||||
|
||||
/* PM_EVGENCTRL_MPU specific bits */
|
||||
|
||||
/* PM_EVEGENONTIM_MPU specific bits */
|
||||
|
||||
/* PM_EVEGENOFFTIM_MPU specific bits */
|
||||
|
||||
/* PM_PWSTCTRL_MPU specific bits */
|
||||
#define OMAP2430_FORCESTATE (1 << 18)
|
||||
|
||||
/* PM_PWSTST_MPU specific bits */
|
||||
/* INTRANSITION, CLKACTIVITY, POWERSTATE, MEMSTATEST are 2430 only */
|
||||
|
||||
/* PM_WKEN1_CORE specific bits */
|
||||
|
||||
/* PM_WKEN2_CORE specific bits */
|
||||
|
||||
/* PM_WKST1_CORE specific bits*/
|
||||
|
||||
/* PM_WKST2_CORE specific bits */
|
||||
|
||||
/* PM_WKDEP_CORE specific bits*/
|
||||
#define OMAP2430_PM_WKDEP_CORE_EN_MDM (1 << 5)
|
||||
#define OMAP24XX_PM_WKDEP_CORE_EN_GFX (1 << 3)
|
||||
#define OMAP24XX_PM_WKDEP_CORE_EN_DSP (1 << 2)
|
||||
|
||||
/* PM_PWSTCTRL_CORE specific bits */
|
||||
#define OMAP24XX_MEMORYCHANGE (1 << 20)
|
||||
#define OMAP24XX_MEM3ONSTATE_SHIFT 14
|
||||
#define OMAP24XX_MEM3ONSTATE_MASK (0x3 << 14)
|
||||
#define OMAP24XX_MEM2ONSTATE_SHIFT 12
|
||||
#define OMAP24XX_MEM2ONSTATE_MASK (0x3 << 12)
|
||||
#define OMAP24XX_MEM1ONSTATE_SHIFT 10
|
||||
#define OMAP24XX_MEM1ONSTATE_MASK (0x3 << 10)
|
||||
#define OMAP24XX_MEM3RETSTATE (1 << 5)
|
||||
#define OMAP24XX_MEM2RETSTATE (1 << 4)
|
||||
#define OMAP24XX_MEM1RETSTATE (1 << 3)
|
||||
|
||||
/* PM_PWSTST_CORE specific bits */
|
||||
#define OMAP24XX_MEM3STATEST_SHIFT 14
|
||||
#define OMAP24XX_MEM3STATEST_MASK (0x3 << 14)
|
||||
#define OMAP24XX_MEM2STATEST_SHIFT 12
|
||||
#define OMAP24XX_MEM2STATEST_MASK (0x3 << 12)
|
||||
#define OMAP24XX_MEM1STATEST_SHIFT 10
|
||||
#define OMAP24XX_MEM1STATEST_MASK (0x3 << 10)
|
||||
|
||||
/* RM_RSTCTRL_GFX */
|
||||
#define OMAP24XX_GFX_RST (1 << 0)
|
||||
|
||||
/* RM_RSTST_GFX specific bits */
|
||||
#define OMAP24XX_GFX_SW_RST (1 << 4)
|
||||
|
||||
/* PM_PWSTCTRL_GFX specific bits */
|
||||
|
||||
/* PM_WKDEP_GFX specific bits */
|
||||
/* 2430 often calls EN_WAKEUP "EN_WKUP" */
|
||||
|
||||
/* RM_RSTCTRL_WKUP specific bits */
|
||||
|
||||
/* RM_RSTTIME_WKUP specific bits */
|
||||
|
||||
/* RM_RSTST_WKUP specific bits */
|
||||
/* 2430 calls EXTWMPU_RST "EXTWARM_RST" and GLOBALWMPU_RST "GLOBALWARM_RST" */
|
||||
#define OMAP24XX_EXTWMPU_RST (1 << 6)
|
||||
#define OMAP24XX_SECU_WD_RST (1 << 5)
|
||||
#define OMAP24XX_MPU_WD_RST (1 << 4)
|
||||
#define OMAP24XX_SECU_VIOL_RST (1 << 3)
|
||||
|
||||
/* PM_WKEN_WKUP specific bits */
|
||||
|
||||
/* PM_WKST_WKUP specific bits */
|
||||
|
||||
/* RM_RSTCTRL_DSP */
|
||||
#define OMAP2420_RST_IVA (1 << 8)
|
||||
#define OMAP24XX_RST2_DSP (1 << 1)
|
||||
#define OMAP24XX_RST1_DSP (1 << 0)
|
||||
|
||||
/* RM_RSTST_DSP specific bits */
|
||||
/* 2430 calls GLOBALWMPU_RST "GLOBALWARM_RST" */
|
||||
#define OMAP2420_IVA_SW_RST (1 << 8)
|
||||
#define OMAP24XX_DSP_SW_RST2 (1 << 5)
|
||||
#define OMAP24XX_DSP_SW_RST1 (1 << 4)
|
||||
|
||||
/* PM_WKDEP_DSP specific bits */
|
||||
|
||||
/* PM_PWSTCTRL_DSP specific bits */
|
||||
/* 2430 only: MEMONSTATE, MEMRETSTATE */
|
||||
#define OMAP2420_MEMIONSTATE_SHIFT 12
|
||||
#define OMAP2420_MEMIONSTATE_MASK (0x3 << 12)
|
||||
#define OMAP2420_MEMIRETSTATE (1 << 4)
|
||||
|
||||
/* PM_PWSTST_DSP specific bits */
|
||||
/* MEMSTATEST is 2430 only */
|
||||
#define OMAP2420_MEMISTATEST_SHIFT 12
|
||||
#define OMAP2420_MEMISTATEST_MASK (0x3 << 12)
|
||||
|
||||
/* PRCM_IRQSTATUS_DSP specific bits */
|
||||
|
||||
/* PRCM_IRQENABLE_DSP specific bits */
|
||||
|
||||
/* RM_RSTCTRL_MDM */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_PWRON1_MDM (1 << 1)
|
||||
#define OMAP2430_RST1_MDM (1 << 0)
|
||||
|
||||
/* RM_RSTST_MDM specific bits */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_MDM_SECU_VIOL (1 << 6)
|
||||
#define OMAP2430_MDM_SW_PWRON1 (1 << 5)
|
||||
#define OMAP2430_MDM_SW_RST1 (1 << 4)
|
||||
|
||||
/* PM_WKEN_MDM */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_PM_WKEN_MDM_EN_MDM (1 << 0)
|
||||
|
||||
/* PM_WKST_MDM specific bits */
|
||||
/* 2430 only */
|
||||
|
||||
/* PM_WKDEP_MDM specific bits */
|
||||
/* 2430 only */
|
||||
|
||||
/* PM_PWSTCTRL_MDM specific bits */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_KILLDOMAINWKUP (1 << 19)
|
||||
|
||||
/* PM_PWSTST_MDM specific bits */
|
||||
/* 2430 only */
|
||||
|
||||
/* PRCM_IRQSTATUS_IVA */
|
||||
/* 2420 only */
|
||||
|
||||
/* PRCM_IRQENABLE_IVA */
|
||||
/* 2420 only */
|
||||
|
||||
#endif
|
||||
582
arch/arm/mach-omap2/prm-regbits-34xx.h
Normal file
582
arch/arm/mach-omap2/prm-regbits-34xx.h
Normal file
|
|
@ -0,0 +1,582 @@
|
|||
#ifndef __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_34XX_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_34XX_H
|
||||
|
||||
/*
|
||||
* OMAP3430 Power/Reset Management register bits
|
||||
*
|
||||
* Copyright (C) 2007-2008 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007-2008 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* 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 "prm.h"
|
||||
|
||||
/* Shared register bits */
|
||||
|
||||
/* PRM_VC_CMD_VAL_0, PRM_VC_CMD_VAL_1 shared bits */
|
||||
#define OMAP3430_ON_SHIFT 24
|
||||
#define OMAP3430_ON_MASK (0xff << 24)
|
||||
#define OMAP3430_ONLP_SHIFT 16
|
||||
#define OMAP3430_ONLP_MASK (0xff << 16)
|
||||
#define OMAP3430_RET_SHIFT 8
|
||||
#define OMAP3430_RET_MASK (0xff << 8)
|
||||
#define OMAP3430_OFF_SHIFT 0
|
||||
#define OMAP3430_OFF_MASK (0xff << 0)
|
||||
|
||||
/* PRM_VP1_CONFIG, PRM_VP2_CONFIG shared bits */
|
||||
#define OMAP3430_ERROROFFSET_SHIFT 24
|
||||
#define OMAP3430_ERROROFFSET_MASK (0xff << 24)
|
||||
#define OMAP3430_ERRORGAIN_SHIFT 16
|
||||
#define OMAP3430_ERRORGAIN_MASK (0xff << 16)
|
||||
#define OMAP3430_INITVOLTAGE_SHIFT 8
|
||||
#define OMAP3430_INITVOLTAGE_MASK (0xff << 8)
|
||||
#define OMAP3430_TIMEOUTEN (1 << 3)
|
||||
#define OMAP3430_INITVDD (1 << 2)
|
||||
#define OMAP3430_FORCEUPDATE (1 << 1)
|
||||
#define OMAP3430_VPENABLE (1 << 0)
|
||||
|
||||
/* PRM_VP1_VSTEPMIN, PRM_VP2_VSTEPMIN shared bits */
|
||||
#define OMAP3430_SMPSWAITTIMEMIN_SHIFT 8
|
||||
#define OMAP3430_SMPSWAITTIMEMIN_MASK (0xffff << 8)
|
||||
#define OMAP3430_VSTEPMIN_SHIFT 0
|
||||
#define OMAP3430_VSTEPMIN_MASK (0xff << 0)
|
||||
|
||||
/* PRM_VP1_VSTEPMAX, PRM_VP2_VSTEPMAX shared bits */
|
||||
#define OMAP3430_SMPSWAITTIMEMAX_SHIFT 8
|
||||
#define OMAP3430_SMPSWAITTIMEMAX_MASK (0xffff << 8)
|
||||
#define OMAP3430_VSTEPMAX_SHIFT 0
|
||||
#define OMAP3430_VSTEPMAX_MASK (0xff << 0)
|
||||
|
||||
/* PRM_VP1_VLIMITTO, PRM_VP2_VLIMITTO shared bits */
|
||||
#define OMAP3430_VDDMAX_SHIFT 24
|
||||
#define OMAP3430_VDDMAX_MASK (0xff << 24)
|
||||
#define OMAP3430_VDDMIN_SHIFT 16
|
||||
#define OMAP3430_VDDMIN_MASK (0xff << 16)
|
||||
#define OMAP3430_TIMEOUT_SHIFT 0
|
||||
#define OMAP3430_TIMEOUT_MASK (0xffff << 0)
|
||||
|
||||
/* PRM_VP1_VOLTAGE, PRM_VP2_VOLTAGE shared bits */
|
||||
#define OMAP3430_VPVOLTAGE_SHIFT 0
|
||||
#define OMAP3430_VPVOLTAGE_MASK (0xff << 0)
|
||||
|
||||
/* PRM_VP1_STATUS, PRM_VP2_STATUS shared bits */
|
||||
#define OMAP3430_VPINIDLE (1 << 0)
|
||||
|
||||
/* PM_WKDEP_IVA2, PM_WKDEP_MPU shared bits */
|
||||
#define OMAP3430_EN_PER (1 << 7)
|
||||
|
||||
/* PM_PWSTCTRL_IVA2, PM_PWSTCTRL_MPU, PM_PWSTCTRL_CORE shared bits */
|
||||
#define OMAP3430_MEMORYCHANGE (1 << 3)
|
||||
|
||||
/* PM_PWSTST_IVA2, PM_PWSTST_CORE shared bits */
|
||||
#define OMAP3430_LOGICSTATEST (1 << 2)
|
||||
|
||||
/* PM_PREPWSTST_IVA2, PM_PREPWSTST_CORE shared bits */
|
||||
#define OMAP3430_LASTLOGICSTATEENTERED (1 << 2)
|
||||
|
||||
/*
|
||||
* PM_PREPWSTST_IVA2, PM_PREPWSTST_MPU, PM_PREPWSTST_CORE,
|
||||
* PM_PREPWSTST_GFX, PM_PREPWSTST_DSS, PM_PREPWSTST_CAM,
|
||||
* PM_PREPWSTST_PER, PM_PREPWSTST_NEON shared bits
|
||||
*/
|
||||
#define OMAP3430_LASTPOWERSTATEENTERED_SHIFT 0
|
||||
#define OMAP3430_LASTPOWERSTATEENTERED_MASK (0x3 << 0)
|
||||
|
||||
/* PRM_IRQSTATUS_IVA2, PRM_IRQSTATUS_MPU shared bits */
|
||||
#define OMAP3430_WKUP_ST (1 << 0)
|
||||
|
||||
/* PRM_IRQENABLE_IVA2, PRM_IRQENABLE_MPU shared bits */
|
||||
#define OMAP3430_WKUP_EN (1 << 0)
|
||||
|
||||
/* PM_MPUGRPSEL1_CORE, PM_IVA2GRPSEL1_CORE shared bits */
|
||||
#define OMAP3430_GRPSEL_MMC2 (1 << 25)
|
||||
#define OMAP3430_GRPSEL_MMC1 (1 << 24)
|
||||
#define OMAP3430_GRPSEL_MCSPI4 (1 << 21)
|
||||
#define OMAP3430_GRPSEL_MCSPI3 (1 << 20)
|
||||
#define OMAP3430_GRPSEL_MCSPI2 (1 << 19)
|
||||
#define OMAP3430_GRPSEL_MCSPI1 (1 << 18)
|
||||
#define OMAP3430_GRPSEL_I2C3 (1 << 17)
|
||||
#define OMAP3430_GRPSEL_I2C2 (1 << 16)
|
||||
#define OMAP3430_GRPSEL_I2C1 (1 << 15)
|
||||
#define OMAP3430_GRPSEL_UART2 (1 << 14)
|
||||
#define OMAP3430_GRPSEL_UART1 (1 << 13)
|
||||
#define OMAP3430_GRPSEL_GPT11 (1 << 12)
|
||||
#define OMAP3430_GRPSEL_GPT10 (1 << 11)
|
||||
#define OMAP3430_GRPSEL_MCBSP5 (1 << 10)
|
||||
#define OMAP3430_GRPSEL_MCBSP1 (1 << 9)
|
||||
#define OMAP3430_GRPSEL_HSOTGUSB (1 << 4)
|
||||
#define OMAP3430_GRPSEL_D2D (1 << 3)
|
||||
|
||||
/*
|
||||
* PM_PWSTCTRL_GFX, PM_PWSTCTRL_DSS, PM_PWSTCTRL_CAM,
|
||||
* PM_PWSTCTRL_PER shared bits
|
||||
*/
|
||||
#define OMAP3430_MEMONSTATE_SHIFT 16
|
||||
#define OMAP3430_MEMONSTATE_MASK (0x3 << 16)
|
||||
#define OMAP3430_MEMRETSTATE (1 << 8)
|
||||
|
||||
/* PM_MPUGRPSEL_PER, PM_IVA2GRPSEL_PER shared bits */
|
||||
#define OMAP3430_GRPSEL_GPIO6 (1 << 17)
|
||||
#define OMAP3430_GRPSEL_GPIO5 (1 << 16)
|
||||
#define OMAP3430_GRPSEL_GPIO4 (1 << 15)
|
||||
#define OMAP3430_GRPSEL_GPIO3 (1 << 14)
|
||||
#define OMAP3430_GRPSEL_GPIO2 (1 << 13)
|
||||
#define OMAP3430_GRPSEL_UART3 (1 << 11)
|
||||
#define OMAP3430_GRPSEL_GPT9 (1 << 10)
|
||||
#define OMAP3430_GRPSEL_GPT8 (1 << 9)
|
||||
#define OMAP3430_GRPSEL_GPT7 (1 << 8)
|
||||
#define OMAP3430_GRPSEL_GPT6 (1 << 7)
|
||||
#define OMAP3430_GRPSEL_GPT5 (1 << 6)
|
||||
#define OMAP3430_GRPSEL_GPT4 (1 << 5)
|
||||
#define OMAP3430_GRPSEL_GPT3 (1 << 4)
|
||||
#define OMAP3430_GRPSEL_GPT2 (1 << 3)
|
||||
#define OMAP3430_GRPSEL_MCBSP4 (1 << 2)
|
||||
#define OMAP3430_GRPSEL_MCBSP3 (1 << 1)
|
||||
#define OMAP3430_GRPSEL_MCBSP2 (1 << 0)
|
||||
|
||||
/* PM_MPUGRPSEL_WKUP, PM_IVA2GRPSEL_WKUP shared bits */
|
||||
#define OMAP3430_GRPSEL_IO (1 << 8)
|
||||
#define OMAP3430_GRPSEL_SR2 (1 << 7)
|
||||
#define OMAP3430_GRPSEL_SR1 (1 << 6)
|
||||
#define OMAP3430_GRPSEL_GPIO1 (1 << 3)
|
||||
#define OMAP3430_GRPSEL_GPT12 (1 << 1)
|
||||
#define OMAP3430_GRPSEL_GPT1 (1 << 0)
|
||||
|
||||
/* Bits specific to each register */
|
||||
|
||||
/* RM_RSTCTRL_IVA2 */
|
||||
#define OMAP3430_RST3_IVA2 (1 << 2)
|
||||
#define OMAP3430_RST2_IVA2 (1 << 1)
|
||||
#define OMAP3430_RST1_IVA2 (1 << 0)
|
||||
|
||||
/* RM_RSTST_IVA2 specific bits */
|
||||
#define OMAP3430_EMULATION_VSEQ_RST (1 << 13)
|
||||
#define OMAP3430_EMULATION_VHWA_RST (1 << 12)
|
||||
#define OMAP3430_EMULATION_IVA2_RST (1 << 11)
|
||||
#define OMAP3430_IVA2_SW_RST3 (1 << 10)
|
||||
#define OMAP3430_IVA2_SW_RST2 (1 << 9)
|
||||
#define OMAP3430_IVA2_SW_RST1 (1 << 8)
|
||||
|
||||
/* PM_WKDEP_IVA2 specific bits */
|
||||
|
||||
/* PM_PWSTCTRL_IVA2 specific bits */
|
||||
#define OMAP3430_L2FLATMEMONSTATE_SHIFT 22
|
||||
#define OMAP3430_L2FLATMEMONSTATE_MASK (0x3 << 22)
|
||||
#define OMAP3430_SHAREDL2CACHEFLATONSTATE_SHIFT 20
|
||||
#define OMAP3430_SHAREDL2CACHEFLATONSTATE_MASK (0x3 << 20)
|
||||
#define OMAP3430_L1FLATMEMONSTATE_SHIFT 18
|
||||
#define OMAP3430_L1FLATMEMONSTATE_MASK (0x3 << 18)
|
||||
#define OMAP3430_SHAREDL1CACHEFLATONSTATE_SHIFT 16
|
||||
#define OMAP3430_SHAREDL1CACHEFLATONSTATE_MASK (0x3 << 16)
|
||||
#define OMAP3430_L2FLATMEMRETSTATE (1 << 11)
|
||||
#define OMAP3430_SHAREDL2CACHEFLATRETSTATE (1 << 10)
|
||||
#define OMAP3430_L1FLATMEMRETSTATE (1 << 9)
|
||||
#define OMAP3430_SHAREDL1CACHEFLATRETSTATE (1 << 8)
|
||||
|
||||
/* PM_PWSTST_IVA2 specific bits */
|
||||
#define OMAP3430_L2FLATMEMSTATEST_SHIFT 10
|
||||
#define OMAP3430_L2FLATMEMSTATEST_MASK (0x3 << 10)
|
||||
#define OMAP3430_SHAREDL2CACHEFLATSTATEST_SHIFT 8
|
||||
#define OMAP3430_SHAREDL2CACHEFLATSTATEST_MASK (0x3 << 8)
|
||||
#define OMAP3430_L1FLATMEMSTATEST_SHIFT 6
|
||||
#define OMAP3430_L1FLATMEMSTATEST_MASK (0x3 << 6)
|
||||
#define OMAP3430_SHAREDL1CACHEFLATSTATEST_SHIFT 4
|
||||
#define OMAP3430_SHAREDL1CACHEFLATSTATEST_MASK (0x3 << 4)
|
||||
|
||||
/* PM_PREPWSTST_IVA2 specific bits */
|
||||
#define OMAP3430_LASTL2FLATMEMSTATEENTERED_SHIFT 10
|
||||
#define OMAP3430_LASTL2FLATMEMSTATEENTERED_MASK (0x3 << 10)
|
||||
#define OMAP3430_LASTSHAREDL2CACHEFLATSTATEENTERED_SHIFT 8
|
||||
#define OMAP3430_LASTSHAREDL2CACHEFLATSTATEENTERED_MASK (0x3 << 8)
|
||||
#define OMAP3430_LASTL1FLATMEMSTATEENTERED_SHIFT 6
|
||||
#define OMAP3430_LASTL1FLATMEMSTATEENTERED_MASK (0x3 << 6)
|
||||
#define OMAP3430_LASTSHAREDL1CACHEFLATSTATEENTERED_SHIFT 4
|
||||
#define OMAP3430_LASTSHAREDL1CACHEFLATSTATEENTERED_MASK (0x3 << 4)
|
||||
|
||||
/* PRM_IRQSTATUS_IVA2 specific bits */
|
||||
#define OMAP3430_PRM_IRQSTATUS_IVA2_IVA2_DPLL_ST (1 << 2)
|
||||
#define OMAP3430_FORCEWKUP_ST (1 << 1)
|
||||
|
||||
/* PRM_IRQENABLE_IVA2 specific bits */
|
||||
#define OMAP3430_PRM_IRQENABLE_IVA2_IVA2_DPLL_RECAL_EN (1 << 2)
|
||||
#define OMAP3430_FORCEWKUP_EN (1 << 1)
|
||||
|
||||
/* PRM_REVISION specific bits */
|
||||
|
||||
/* PRM_SYSCONFIG specific bits */
|
||||
|
||||
/* PRM_IRQSTATUS_MPU specific bits */
|
||||
#define OMAP3430ES2_SND_PERIPH_DPLL_ST_SHIFT 25
|
||||
#define OMAP3430ES2_SND_PERIPH_DPLL_ST (1 << 25)
|
||||
#define OMAP3430_VC_TIMEOUTERR_ST (1 << 24)
|
||||
#define OMAP3430_VC_RAERR_ST (1 << 23)
|
||||
#define OMAP3430_VC_SAERR_ST (1 << 22)
|
||||
#define OMAP3430_VP2_TRANXDONE_ST (1 << 21)
|
||||
#define OMAP3430_VP2_EQVALUE_ST (1 << 20)
|
||||
#define OMAP3430_VP2_NOSMPSACK_ST (1 << 19)
|
||||
#define OMAP3430_VP2_MAXVDD_ST (1 << 18)
|
||||
#define OMAP3430_VP2_MINVDD_ST (1 << 17)
|
||||
#define OMAP3430_VP2_OPPCHANGEDONE_ST (1 << 16)
|
||||
#define OMAP3430_VP1_TRANXDONE_ST (1 << 15)
|
||||
#define OMAP3430_VP1_EQVALUE_ST (1 << 14)
|
||||
#define OMAP3430_VP1_NOSMPSACK_ST (1 << 13)
|
||||
#define OMAP3430_VP1_MAXVDD_ST (1 << 12)
|
||||
#define OMAP3430_VP1_MINVDD_ST (1 << 11)
|
||||
#define OMAP3430_VP1_OPPCHANGEDONE_ST (1 << 10)
|
||||
#define OMAP3430_IO_ST (1 << 9)
|
||||
#define OMAP3430_PRM_IRQSTATUS_MPU_IVA2_DPLL_ST (1 << 8)
|
||||
#define OMAP3430_PRM_IRQSTATUS_MPU_IVA2_DPLL_ST_SHIFT 8
|
||||
#define OMAP3430_MPU_DPLL_ST (1 << 7)
|
||||
#define OMAP3430_MPU_DPLL_ST_SHIFT 7
|
||||
#define OMAP3430_PERIPH_DPLL_ST (1 << 6)
|
||||
#define OMAP3430_PERIPH_DPLL_ST_SHIFT 6
|
||||
#define OMAP3430_CORE_DPLL_ST (1 << 5)
|
||||
#define OMAP3430_CORE_DPLL_ST_SHIFT 5
|
||||
#define OMAP3430_TRANSITION_ST (1 << 4)
|
||||
#define OMAP3430_EVGENOFF_ST (1 << 3)
|
||||
#define OMAP3430_EVGENON_ST (1 << 2)
|
||||
#define OMAP3430_FS_USB_WKUP_ST (1 << 1)
|
||||
|
||||
/* PRM_IRQENABLE_MPU specific bits */
|
||||
#define OMAP3430ES2_SND_PERIPH_DPLL_RECAL_EN_SHIFT 25
|
||||
#define OMAP3430ES2_SND_PERIPH_DPLL_RECAL_EN (1 << 25)
|
||||
#define OMAP3430_VC_TIMEOUTERR_EN (1 << 24)
|
||||
#define OMAP3430_VC_RAERR_EN (1 << 23)
|
||||
#define OMAP3430_VC_SAERR_EN (1 << 22)
|
||||
#define OMAP3430_VP2_TRANXDONE_EN (1 << 21)
|
||||
#define OMAP3430_VP2_EQVALUE_EN (1 << 20)
|
||||
#define OMAP3430_VP2_NOSMPSACK_EN (1 << 19)
|
||||
#define OMAP3430_VP2_MAXVDD_EN (1 << 18)
|
||||
#define OMAP3430_VP2_MINVDD_EN (1 << 17)
|
||||
#define OMAP3430_VP2_OPPCHANGEDONE_EN (1 << 16)
|
||||
#define OMAP3430_VP1_TRANXDONE_EN (1 << 15)
|
||||
#define OMAP3430_VP1_EQVALUE_EN (1 << 14)
|
||||
#define OMAP3430_VP1_NOSMPSACK_EN (1 << 13)
|
||||
#define OMAP3430_VP1_MAXVDD_EN (1 << 12)
|
||||
#define OMAP3430_VP1_MINVDD_EN (1 << 11)
|
||||
#define OMAP3430_VP1_OPPCHANGEDONE_EN (1 << 10)
|
||||
#define OMAP3430_IO_EN (1 << 9)
|
||||
#define OMAP3430_PRM_IRQENABLE_MPU_IVA2_DPLL_RECAL_EN (1 << 8)
|
||||
#define OMAP3430_PRM_IRQENABLE_MPU_IVA2_DPLL_RECAL_EN_SHIFT 8
|
||||
#define OMAP3430_MPU_DPLL_RECAL_EN (1 << 7)
|
||||
#define OMAP3430_MPU_DPLL_RECAL_EN_SHIFT 7
|
||||
#define OMAP3430_PERIPH_DPLL_RECAL_EN (1 << 6)
|
||||
#define OMAP3430_PERIPH_DPLL_RECAL_EN_SHIFT 6
|
||||
#define OMAP3430_CORE_DPLL_RECAL_EN (1 << 5)
|
||||
#define OMAP3430_CORE_DPLL_RECAL_EN_SHIFT 5
|
||||
#define OMAP3430_TRANSITION_EN (1 << 4)
|
||||
#define OMAP3430_EVGENOFF_EN (1 << 3)
|
||||
#define OMAP3430_EVGENON_EN (1 << 2)
|
||||
#define OMAP3430_FS_USB_WKUP_EN (1 << 1)
|
||||
|
||||
/* RM_RSTST_MPU specific bits */
|
||||
#define OMAP3430_EMULATION_MPU_RST (1 << 11)
|
||||
|
||||
/* PM_WKDEP_MPU specific bits */
|
||||
#define OMAP3430_PM_WKDEP_MPU_EN_DSS (1 << 5)
|
||||
#define OMAP3430_PM_WKDEP_MPU_EN_IVA2 (1 << 2)
|
||||
|
||||
/* PM_EVGENCTRL_MPU */
|
||||
#define OMAP3430_OFFLOADMODE_SHIFT 3
|
||||
#define OMAP3430_OFFLOADMODE_MASK (0x3 << 3)
|
||||
#define OMAP3430_ONLOADMODE_SHIFT 1
|
||||
#define OMAP3430_ONLOADMODE_MASK (0x3 << 1)
|
||||
#define OMAP3430_ENABLE (1 << 0)
|
||||
|
||||
/* PM_EVGENONTIM_MPU */
|
||||
#define OMAP3430_ONTIMEVAL_SHIFT 0
|
||||
#define OMAP3430_ONTIMEVAL_MASK (0xffffffff << 0)
|
||||
|
||||
/* PM_EVGENOFFTIM_MPU */
|
||||
#define OMAP3430_OFFTIMEVAL_SHIFT 0
|
||||
#define OMAP3430_OFFTIMEVAL_MASK (0xffffffff << 0)
|
||||
|
||||
/* PM_PWSTCTRL_MPU specific bits */
|
||||
#define OMAP3430_L2CACHEONSTATE_SHIFT 16
|
||||
#define OMAP3430_L2CACHEONSTATE_MASK (0x3 << 16)
|
||||
#define OMAP3430_L2CACHERETSTATE (1 << 8)
|
||||
#define OMAP3430_LOGICL1CACHERETSTATE (1 << 2)
|
||||
|
||||
/* PM_PWSTST_MPU specific bits */
|
||||
#define OMAP3430_L2CACHESTATEST_SHIFT 6
|
||||
#define OMAP3430_L2CACHESTATEST_MASK (0x3 << 6)
|
||||
#define OMAP3430_LOGICL1CACHESTATEST (1 << 2)
|
||||
|
||||
/* PM_PREPWSTST_MPU specific bits */
|
||||
#define OMAP3430_LASTL2CACHESTATEENTERED_SHIFT 6
|
||||
#define OMAP3430_LASTL2CACHESTATEENTERED_MASK (0x3 << 6)
|
||||
#define OMAP3430_LASTLOGICL1CACHESTATEENTERED (1 << 2)
|
||||
|
||||
/* RM_RSTCTRL_CORE */
|
||||
#define OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON (1 << 1)
|
||||
#define OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST (1 << 0)
|
||||
|
||||
/* RM_RSTST_CORE specific bits */
|
||||
#define OMAP3430_MODEM_SECURITY_VIOL_RST (1 << 10)
|
||||
#define OMAP3430_RM_RSTST_CORE_MODEM_SW_RSTPWRON (1 << 9)
|
||||
#define OMAP3430_RM_RSTST_CORE_MODEM_SW_RST (1 << 8)
|
||||
|
||||
/* PM_WKEN1_CORE specific bits */
|
||||
|
||||
/* PM_MPUGRPSEL1_CORE specific bits */
|
||||
#define OMAP3430_GRPSEL_FSHOSTUSB (1 << 5)
|
||||
|
||||
/* PM_IVA2GRPSEL1_CORE specific bits */
|
||||
|
||||
/* PM_WKST1_CORE specific bits */
|
||||
|
||||
/* PM_PWSTCTRL_CORE specific bits */
|
||||
#define OMAP3430_MEM2ONSTATE_SHIFT 18
|
||||
#define OMAP3430_MEM2ONSTATE_MASK (0x3 << 18)
|
||||
#define OMAP3430_MEM1ONSTATE_SHIFT 16
|
||||
#define OMAP3430_MEM1ONSTATE_MASK (0x3 << 16)
|
||||
#define OMAP3430_MEM2RETSTATE (1 << 9)
|
||||
#define OMAP3430_MEM1RETSTATE (1 << 8)
|
||||
|
||||
/* PM_PWSTST_CORE specific bits */
|
||||
#define OMAP3430_MEM2STATEST_SHIFT 6
|
||||
#define OMAP3430_MEM2STATEST_MASK (0x3 << 6)
|
||||
#define OMAP3430_MEM1STATEST_SHIFT 4
|
||||
#define OMAP3430_MEM1STATEST_MASK (0x3 << 4)
|
||||
|
||||
/* PM_PREPWSTST_CORE specific bits */
|
||||
#define OMAP3430_LASTMEM2STATEENTERED_SHIFT 6
|
||||
#define OMAP3430_LASTMEM2STATEENTERED_MASK (0x3 << 6)
|
||||
#define OMAP3430_LASTMEM1STATEENTERED_SHIFT 4
|
||||
#define OMAP3430_LASTMEM1STATEENTERED_MASK (0x3 << 4)
|
||||
|
||||
/* RM_RSTST_GFX specific bits */
|
||||
|
||||
/* PM_WKDEP_GFX specific bits */
|
||||
#define OMAP3430_PM_WKDEP_GFX_EN_IVA2 (1 << 2)
|
||||
|
||||
/* PM_PWSTCTRL_GFX specific bits */
|
||||
|
||||
/* PM_PWSTST_GFX specific bits */
|
||||
|
||||
/* PM_PREPWSTST_GFX specific bits */
|
||||
|
||||
/* PM_WKEN_WKUP specific bits */
|
||||
#define OMAP3430_EN_IO (1 << 8)
|
||||
|
||||
/* PM_MPUGRPSEL_WKUP specific bits */
|
||||
|
||||
/* PM_IVA2GRPSEL_WKUP specific bits */
|
||||
|
||||
/* PM_WKST_WKUP specific bits */
|
||||
#define OMAP3430_ST_IO (1 << 8)
|
||||
|
||||
/* PRM_CLKSEL */
|
||||
#define OMAP3430_SYS_CLKIN_SEL_SHIFT 0
|
||||
#define OMAP3430_SYS_CLKIN_SEL_MASK (0x7 << 0)
|
||||
|
||||
/* PRM_CLKOUT_CTRL */
|
||||
#define OMAP3430_CLKOUT_EN (1 << 7)
|
||||
#define OMAP3430_CLKOUT_EN_SHIFT 7
|
||||
|
||||
/* RM_RSTST_DSS specific bits */
|
||||
|
||||
/* PM_WKEN_DSS */
|
||||
#define OMAP3430_PM_WKEN_DSS_EN_DSS (1 << 0)
|
||||
|
||||
/* PM_WKDEP_DSS specific bits */
|
||||
#define OMAP3430_PM_WKDEP_DSS_EN_IVA2 (1 << 2)
|
||||
|
||||
/* PM_PWSTCTRL_DSS specific bits */
|
||||
|
||||
/* PM_PWSTST_DSS specific bits */
|
||||
|
||||
/* PM_PREPWSTST_DSS specific bits */
|
||||
|
||||
/* RM_RSTST_CAM specific bits */
|
||||
|
||||
/* PM_WKDEP_CAM specific bits */
|
||||
#define OMAP3430_PM_WKDEP_CAM_EN_IVA2 (1 << 2)
|
||||
|
||||
/* PM_PWSTCTRL_CAM specific bits */
|
||||
|
||||
/* PM_PWSTST_CAM specific bits */
|
||||
|
||||
/* PM_PREPWSTST_CAM specific bits */
|
||||
|
||||
/* PM_PWSTCTRL_USBHOST specific bits */
|
||||
#define OMAP3430ES2_SAVEANDRESTORE_SHIFT (1 << 4)
|
||||
|
||||
/* RM_RSTST_PER specific bits */
|
||||
|
||||
/* PM_WKEN_PER specific bits */
|
||||
|
||||
/* PM_MPUGRPSEL_PER specific bits */
|
||||
|
||||
/* PM_IVA2GRPSEL_PER specific bits */
|
||||
|
||||
/* PM_WKST_PER specific bits */
|
||||
|
||||
/* PM_WKDEP_PER specific bits */
|
||||
#define OMAP3430_PM_WKDEP_PER_EN_IVA2 (1 << 2)
|
||||
|
||||
/* PM_PWSTCTRL_PER specific bits */
|
||||
|
||||
/* PM_PWSTST_PER specific bits */
|
||||
|
||||
/* PM_PREPWSTST_PER specific bits */
|
||||
|
||||
/* RM_RSTST_EMU specific bits */
|
||||
|
||||
/* PM_PWSTST_EMU specific bits */
|
||||
|
||||
/* PRM_VC_SMPS_SA */
|
||||
#define OMAP3430_PRM_VC_SMPS_SA_SA1_SHIFT 16
|
||||
#define OMAP3430_PRM_VC_SMPS_SA_SA1_MASK (0x7f << 16)
|
||||
#define OMAP3430_PRM_VC_SMPS_SA_SA0_SHIFT 0
|
||||
#define OMAP3430_PRM_VC_SMPS_SA_SA0_MASK (0x7f << 0)
|
||||
|
||||
/* PRM_VC_SMPS_VOL_RA */
|
||||
#define OMAP3430_VOLRA1_SHIFT 16
|
||||
#define OMAP3430_VOLRA1_MASK (0xff << 16)
|
||||
#define OMAP3430_VOLRA0_SHIFT 0
|
||||
#define OMAP3430_VOLRA0_MASK (0xff << 0)
|
||||
|
||||
/* PRM_VC_SMPS_CMD_RA */
|
||||
#define OMAP3430_CMDRA1_SHIFT 16
|
||||
#define OMAP3430_CMDRA1_MASK (0xff << 16)
|
||||
#define OMAP3430_CMDRA0_SHIFT 0
|
||||
#define OMAP3430_CMDRA0_MASK (0xff << 0)
|
||||
|
||||
/* PRM_VC_CMD_VAL_0 specific bits */
|
||||
|
||||
/* PRM_VC_CMD_VAL_1 specific bits */
|
||||
|
||||
/* PRM_VC_CH_CONF */
|
||||
#define OMAP3430_CMD1 (1 << 20)
|
||||
#define OMAP3430_RACEN1 (1 << 19)
|
||||
#define OMAP3430_RAC1 (1 << 18)
|
||||
#define OMAP3430_RAV1 (1 << 17)
|
||||
#define OMAP3430_PRM_VC_CH_CONF_SA1 (1 << 16)
|
||||
#define OMAP3430_CMD0 (1 << 4)
|
||||
#define OMAP3430_RACEN0 (1 << 3)
|
||||
#define OMAP3430_RAC0 (1 << 2)
|
||||
#define OMAP3430_RAV0 (1 << 1)
|
||||
#define OMAP3430_PRM_VC_CH_CONF_SA0 (1 << 0)
|
||||
|
||||
/* PRM_VC_I2C_CFG */
|
||||
#define OMAP3430_HSMASTER (1 << 5)
|
||||
#define OMAP3430_SREN (1 << 4)
|
||||
#define OMAP3430_HSEN (1 << 3)
|
||||
#define OMAP3430_MCODE_SHIFT 0
|
||||
#define OMAP3430_MCODE_MASK (0x7 << 0)
|
||||
|
||||
/* PRM_VC_BYPASS_VAL */
|
||||
#define OMAP3430_VALID (1 << 24)
|
||||
#define OMAP3430_DATA_SHIFT 16
|
||||
#define OMAP3430_DATA_MASK (0xff << 16)
|
||||
#define OMAP3430_REGADDR_SHIFT 8
|
||||
#define OMAP3430_REGADDR_MASK (0xff << 8)
|
||||
#define OMAP3430_SLAVEADDR_SHIFT 0
|
||||
#define OMAP3430_SLAVEADDR_MASK (0x7f << 0)
|
||||
|
||||
/* PRM_RSTCTRL */
|
||||
#define OMAP3430_RST_DPLL3 (1 << 2)
|
||||
#define OMAP3430_RST_GS (1 << 1)
|
||||
|
||||
/* PRM_RSTTIME */
|
||||
#define OMAP3430_RSTTIME2_SHIFT 8
|
||||
#define OMAP3430_RSTTIME2_MASK (0x1f << 8)
|
||||
#define OMAP3430_RSTTIME1_SHIFT 0
|
||||
#define OMAP3430_RSTTIME1_MASK (0xff << 0)
|
||||
|
||||
/* PRM_RSTST */
|
||||
#define OMAP3430_ICECRUSHER_RST (1 << 10)
|
||||
#define OMAP3430_ICEPICK_RST (1 << 9)
|
||||
#define OMAP3430_VDD2_VOLTAGE_MANAGER_RST (1 << 8)
|
||||
#define OMAP3430_VDD1_VOLTAGE_MANAGER_RST (1 << 7)
|
||||
#define OMAP3430_EXTERNAL_WARM_RST (1 << 6)
|
||||
#define OMAP3430_SECURE_WD_RST (1 << 5)
|
||||
#define OMAP3430_MPU_WD_RST (1 << 4)
|
||||
#define OMAP3430_SECURITY_VIOL_RST (1 << 3)
|
||||
#define OMAP3430_GLOBAL_SW_RST (1 << 1)
|
||||
#define OMAP3430_GLOBAL_COLD_RST (1 << 0)
|
||||
|
||||
/* PRM_VOLTCTRL */
|
||||
#define OMAP3430_SEL_VMODE (1 << 4)
|
||||
#define OMAP3430_SEL_OFF (1 << 3)
|
||||
#define OMAP3430_AUTO_OFF (1 << 2)
|
||||
#define OMAP3430_AUTO_RET (1 << 1)
|
||||
#define OMAP3430_AUTO_SLEEP (1 << 0)
|
||||
|
||||
/* PRM_SRAM_PCHARGE */
|
||||
#define OMAP3430_PCHARGE_TIME_SHIFT 0
|
||||
#define OMAP3430_PCHARGE_TIME_MASK (0xff << 0)
|
||||
|
||||
/* PRM_CLKSRC_CTRL */
|
||||
#define OMAP3430_SYSCLKDIV_SHIFT 6
|
||||
#define OMAP3430_SYSCLKDIV_MASK (0x3 << 6)
|
||||
#define OMAP3430_AUTOEXTCLKMODE_SHIFT 3
|
||||
#define OMAP3430_AUTOEXTCLKMODE_MASK (0x3 << 3)
|
||||
#define OMAP3430_SYSCLKSEL_SHIFT 0
|
||||
#define OMAP3430_SYSCLKSEL_MASK (0x3 << 0)
|
||||
|
||||
/* PRM_VOLTSETUP1 */
|
||||
#define OMAP3430_SETUP_TIME2_SHIFT 16
|
||||
#define OMAP3430_SETUP_TIME2_MASK (0xffff << 16)
|
||||
#define OMAP3430_SETUP_TIME1_SHIFT 0
|
||||
#define OMAP3430_SETUP_TIME1_MASK (0xffff << 0)
|
||||
|
||||
/* PRM_VOLTOFFSET */
|
||||
#define OMAP3430_OFFSET_TIME_SHIFT 0
|
||||
#define OMAP3430_OFFSET_TIME_MASK (0xffff << 0)
|
||||
|
||||
/* PRM_CLKSETUP */
|
||||
#define OMAP3430_SETUP_TIME_SHIFT 0
|
||||
#define OMAP3430_SETUP_TIME_MASK (0xffff << 0)
|
||||
|
||||
/* PRM_POLCTRL */
|
||||
#define OMAP3430_OFFMODE_POL (1 << 3)
|
||||
#define OMAP3430_CLKOUT_POL (1 << 2)
|
||||
#define OMAP3430_CLKREQ_POL (1 << 1)
|
||||
#define OMAP3430_EXTVOL_POL (1 << 0)
|
||||
|
||||
/* PRM_VOLTSETUP2 */
|
||||
#define OMAP3430_OFFMODESETUPTIME_SHIFT 0
|
||||
#define OMAP3430_OFFMODESETUPTIME_MASK (0xffff << 0)
|
||||
|
||||
/* PRM_VP1_CONFIG specific bits */
|
||||
|
||||
/* PRM_VP1_VSTEPMIN specific bits */
|
||||
|
||||
/* PRM_VP1_VSTEPMAX specific bits */
|
||||
|
||||
/* PRM_VP1_VLIMITTO specific bits */
|
||||
|
||||
/* PRM_VP1_VOLTAGE specific bits */
|
||||
|
||||
/* PRM_VP1_STATUS specific bits */
|
||||
|
||||
/* PRM_VP2_CONFIG specific bits */
|
||||
|
||||
/* PRM_VP2_VSTEPMIN specific bits */
|
||||
|
||||
/* PRM_VP2_VSTEPMAX specific bits */
|
||||
|
||||
/* PRM_VP2_VLIMITTO specific bits */
|
||||
|
||||
/* PRM_VP2_VOLTAGE specific bits */
|
||||
|
||||
/* PRM_VP2_STATUS specific bits */
|
||||
|
||||
/* RM_RSTST_NEON specific bits */
|
||||
|
||||
/* PM_WKDEP_NEON specific bits */
|
||||
|
||||
/* PM_PWSTCTRL_NEON specific bits */
|
||||
|
||||
/* PM_PWSTST_NEON specific bits */
|
||||
|
||||
/* PM_PREPWSTST_NEON specific bits */
|
||||
|
||||
#endif
|
||||
316
arch/arm/mach-omap2/prm.h
Normal file
316
arch/arm/mach-omap2/prm.h
Normal file
|
|
@ -0,0 +1,316 @@
|
|||
#ifndef __ARCH_ARM_MACH_OMAP2_PRM_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_PRM_H
|
||||
|
||||
/*
|
||||
* OMAP2/3 Power/Reset Management (PRM) register definitions
|
||||
*
|
||||
* Copyright (C) 2007 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* 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 "prcm-common.h"
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
#define OMAP_PRM_REGADDR(module, reg) \
|
||||
(void __iomem *)IO_ADDRESS(OMAP2_PRM_BASE + (module) + (reg))
|
||||
#else
|
||||
#define OMAP2420_PRM_REGADDR(module, reg) \
|
||||
IO_ADDRESS(OMAP2420_PRM_BASE + (module) + (reg))
|
||||
#define OMAP2430_PRM_REGADDR(module, reg) \
|
||||
IO_ADDRESS(OMAP2430_PRM_BASE + (module) + (reg))
|
||||
#define OMAP34XX_PRM_REGADDR(module, reg) \
|
||||
IO_ADDRESS(OMAP3430_PRM_BASE + (module) + (reg))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Architecture-specific global PRM registers
|
||||
* Use prm_{read,write}_reg() with these registers.
|
||||
*
|
||||
* With a few exceptions, these are the register names beginning with
|
||||
* PRCM_* on 24xx, and PRM_* on 34xx. (The exceptions are the
|
||||
* IRQSTATUS and IRQENABLE bits.)
|
||||
*
|
||||
*/
|
||||
|
||||
#define OMAP24XX_PRCM_REVISION OMAP_PRM_REGADDR(OCP_MOD, 0x0000)
|
||||
#define OMAP24XX_PRCM_SYSCONFIG OMAP_PRM_REGADDR(OCP_MOD, 0x0010)
|
||||
|
||||
#define OMAP24XX_PRCM_IRQSTATUS_MPU OMAP_PRM_REGADDR(OCP_MOD, 0x0018)
|
||||
#define OMAP24XX_PRCM_IRQENABLE_MPU OMAP_PRM_REGADDR(OCP_MOD, 0x001c)
|
||||
|
||||
#define OMAP24XX_PRCM_VOLTCTRL OMAP_PRM_REGADDR(OCP_MOD, 0x0050)
|
||||
#define OMAP24XX_PRCM_VOLTST OMAP_PRM_REGADDR(OCP_MOD, 0x0054)
|
||||
#define OMAP24XX_PRCM_CLKSRC_CTRL OMAP_PRM_REGADDR(OCP_MOD, 0x0060)
|
||||
#define OMAP24XX_PRCM_CLKOUT_CTRL OMAP_PRM_REGADDR(OCP_MOD, 0x0070)
|
||||
#define OMAP24XX_PRCM_CLKEMUL_CTRL OMAP_PRM_REGADDR(OCP_MOD, 0x0078)
|
||||
#define OMAP24XX_PRCM_CLKCFG_CTRL OMAP_PRM_REGADDR(OCP_MOD, 0x0080)
|
||||
#define OMAP24XX_PRCM_CLKCFG_STATUS OMAP_PRM_REGADDR(OCP_MOD, 0x0084)
|
||||
#define OMAP24XX_PRCM_VOLTSETUP OMAP_PRM_REGADDR(OCP_MOD, 0x0090)
|
||||
#define OMAP24XX_PRCM_CLKSSETUP OMAP_PRM_REGADDR(OCP_MOD, 0x0094)
|
||||
#define OMAP24XX_PRCM_POLCTRL OMAP_PRM_REGADDR(OCP_MOD, 0x0098)
|
||||
|
||||
#define OMAP3430_PRM_REVISION OMAP_PRM_REGADDR(OCP_MOD, 0x0004)
|
||||
#define OMAP3430_PRM_SYSCONFIG OMAP_PRM_REGADDR(OCP_MOD, 0x0014)
|
||||
|
||||
#define OMAP3430_PRM_IRQSTATUS_MPU OMAP_PRM_REGADDR(OCP_MOD, 0x0018)
|
||||
#define OMAP3430_PRM_IRQENABLE_MPU OMAP_PRM_REGADDR(OCP_MOD, 0x001c)
|
||||
|
||||
|
||||
#define OMAP3430_PRM_VC_SMPS_SA OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0020)
|
||||
#define OMAP3430_PRM_VC_SMPS_VOL_RA OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0024)
|
||||
#define OMAP3430_PRM_VC_SMPS_CMD_RA OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0028)
|
||||
#define OMAP3430_PRM_VC_CMD_VAL_0 OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x002c)
|
||||
#define OMAP3430_PRM_VC_CMD_VAL_1 OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0030)
|
||||
#define OMAP3430_PRM_VC_CH_CONF OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0034)
|
||||
#define OMAP3430_PRM_VC_I2C_CFG OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0038)
|
||||
#define OMAP3430_PRM_VC_BYPASS_VAL OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x003c)
|
||||
#define OMAP3430_PRM_RSTCTRL OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0050)
|
||||
#define OMAP3430_PRM_RSTTIME OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0054)
|
||||
#define OMAP3430_PRM_RSTST OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0058)
|
||||
#define OMAP3430_PRM_VOLTCTRL OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0060)
|
||||
#define OMAP3430_PRM_SRAM_PCHARGE OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0064)
|
||||
#define OMAP3430_PRM_CLKSRC_CTRL OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0070)
|
||||
#define OMAP3430_PRM_VOLTSETUP1 OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0090)
|
||||
#define OMAP3430_PRM_VOLTOFFSET OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0094)
|
||||
#define OMAP3430_PRM_CLKSETUP OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0098)
|
||||
#define OMAP3430_PRM_POLCTRL OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x009c)
|
||||
#define OMAP3430_PRM_VOLTSETUP2 OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00a0)
|
||||
#define OMAP3430_PRM_VP1_CONFIG OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00b0)
|
||||
#define OMAP3430_PRM_VP1_VSTEPMIN OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00b4)
|
||||
#define OMAP3430_PRM_VP1_VSTEPMAX OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00b8)
|
||||
#define OMAP3430_PRM_VP1_VLIMITTO OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00bc)
|
||||
#define OMAP3430_PRM_VP1_VOLTAGE OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00c0)
|
||||
#define OMAP3430_PRM_VP1_STATUS OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00c4)
|
||||
#define OMAP3430_PRM_VP2_CONFIG OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00d0)
|
||||
#define OMAP3430_PRM_VP2_VSTEPMIN OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00d4)
|
||||
#define OMAP3430_PRM_VP2_VSTEPMAX OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00d8)
|
||||
#define OMAP3430_PRM_VP2_VLIMITTO OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00dc)
|
||||
#define OMAP3430_PRM_VP2_VOLTAGE OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00e0)
|
||||
#define OMAP3430_PRM_VP2_STATUS OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00e4)
|
||||
|
||||
#define OMAP3430_PRM_CLKSEL OMAP_PRM_REGADDR(OMAP3430_CCR_MOD, 0x0040)
|
||||
#define OMAP3430_PRM_CLKOUT_CTRL OMAP_PRM_REGADDR(OMAP3430_CCR_MOD, 0x0070)
|
||||
|
||||
/*
|
||||
* Module specific PRM registers from PRM_BASE + domain offset
|
||||
*
|
||||
* Use prm_{read,write}_mod_reg() with these registers.
|
||||
*
|
||||
* With a few exceptions, these are the register names beginning with
|
||||
* {PM,RM}_* on both architectures. (The exceptions are the IRQSTATUS
|
||||
* and IRQENABLE bits.)
|
||||
*
|
||||
*/
|
||||
|
||||
/* Registers appearing on both 24xx and 34xx */
|
||||
|
||||
#define RM_RSTCTRL 0x0050
|
||||
#define RM_RSTTIME 0x0054
|
||||
#define RM_RSTST 0x0058
|
||||
|
||||
#define PM_WKEN 0x00a0
|
||||
#define PM_WKEN1 PM_WKEN
|
||||
#define PM_WKST 0x00b0
|
||||
#define PM_WKST1 PM_WKST
|
||||
#define PM_WKDEP 0x00c8
|
||||
#define PM_EVGENCTRL 0x00d4
|
||||
#define PM_EVGENONTIM 0x00d8
|
||||
#define PM_EVGENOFFTIM 0x00dc
|
||||
#define PM_PWSTCTRL 0x00e0
|
||||
#define PM_PWSTST 0x00e4
|
||||
|
||||
#define OMAP3430_PM_MPUGRPSEL 0x00a4
|
||||
#define OMAP3430_PM_MPUGRPSEL1 OMAP3430_PM_MPUGRPSEL
|
||||
|
||||
#define OMAP3430_PM_IVAGRPSEL 0x00a8
|
||||
#define OMAP3430_PM_IVAGRPSEL1 OMAP3430_PM_IVAGRPSEL
|
||||
|
||||
#define OMAP3430_PM_PREPWSTST 0x00e8
|
||||
|
||||
#define OMAP3430_PRM_IRQSTATUS_IVA2 0x00f8
|
||||
#define OMAP3430_PRM_IRQENABLE_IVA2 0x00fc
|
||||
|
||||
|
||||
/* Architecture-specific registers */
|
||||
|
||||
#define OMAP24XX_PM_WKEN2 0x00a4
|
||||
#define OMAP24XX_PM_WKST2 0x00b4
|
||||
|
||||
#define OMAP24XX_PRCM_IRQSTATUS_DSP 0x00f0 /* IVA mod */
|
||||
#define OMAP24XX_PRCM_IRQENABLE_DSP 0x00f4 /* IVA mod */
|
||||
#define OMAP24XX_PRCM_IRQSTATUS_IVA 0x00f8
|
||||
#define OMAP24XX_PRCM_IRQENABLE_IVA 0x00fc
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
/* Power/reset management domain register get/set */
|
||||
|
||||
static inline void prm_write_mod_reg(u32 val, s16 module, s16 idx)
|
||||
{
|
||||
__raw_writel(val, OMAP_PRM_REGADDR(module, idx));
|
||||
}
|
||||
|
||||
static inline u32 prm_read_mod_reg(s16 module, s16 idx)
|
||||
{
|
||||
return __raw_readl(OMAP_PRM_REGADDR(module, idx));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Bits common to specific registers
|
||||
*
|
||||
* The 3430 register and bit names are generally used,
|
||||
* since they tend to make more sense
|
||||
*/
|
||||
|
||||
/* PM_EVGENONTIM_MPU */
|
||||
/* Named PM_EVEGENONTIM_MPU on the 24XX */
|
||||
#define OMAP_ONTIMEVAL_SHIFT 0
|
||||
#define OMAP_ONTIMEVAL_MASK (0xffffffff << 0)
|
||||
|
||||
/* PM_EVGENOFFTIM_MPU */
|
||||
/* Named PM_EVEGENOFFTIM_MPU on the 24XX */
|
||||
#define OMAP_OFFTIMEVAL_SHIFT 0
|
||||
#define OMAP_OFFTIMEVAL_MASK (0xffffffff << 0)
|
||||
|
||||
/* PRM_CLKSETUP and PRCM_VOLTSETUP */
|
||||
/* Named PRCM_CLKSSETUP on the 24XX */
|
||||
#define OMAP_SETUP_TIME_SHIFT 0
|
||||
#define OMAP_SETUP_TIME_MASK (0xffff << 0)
|
||||
|
||||
/* PRM_CLKSRC_CTRL */
|
||||
/* Named PRCM_CLKSRC_CTRL on the 24XX */
|
||||
#define OMAP_SYSCLKDIV_SHIFT 6
|
||||
#define OMAP_SYSCLKDIV_MASK (0x3 << 6)
|
||||
#define OMAP_AUTOEXTCLKMODE_SHIFT 3
|
||||
#define OMAP_AUTOEXTCLKMODE_MASK (0x3 << 3)
|
||||
#define OMAP_SYSCLKSEL_SHIFT 0
|
||||
#define OMAP_SYSCLKSEL_MASK (0x3 << 0)
|
||||
|
||||
/* PM_EVGENCTRL_MPU */
|
||||
#define OMAP_OFFLOADMODE_SHIFT 3
|
||||
#define OMAP_OFFLOADMODE_MASK (0x3 << 3)
|
||||
#define OMAP_ONLOADMODE_SHIFT 1
|
||||
#define OMAP_ONLOADMODE_MASK (0x3 << 1)
|
||||
#define OMAP_ENABLE (1 << 0)
|
||||
|
||||
/* PRM_RSTTIME */
|
||||
/* Named RM_RSTTIME_WKUP on the 24xx */
|
||||
#define OMAP_RSTTIME2_SHIFT 8
|
||||
#define OMAP_RSTTIME2_MASK (0x1f << 8)
|
||||
#define OMAP_RSTTIME1_SHIFT 0
|
||||
#define OMAP_RSTTIME1_MASK (0xff << 0)
|
||||
|
||||
|
||||
/* PRM_RSTCTRL */
|
||||
/* Named RM_RSTCTRL_WKUP on the 24xx */
|
||||
/* 2420 calls RST_DPLL3 'RST_DPLL' */
|
||||
#define OMAP_RST_DPLL3 (1 << 2)
|
||||
#define OMAP_RST_GS (1 << 1)
|
||||
|
||||
|
||||
/*
|
||||
* Bits common to module-shared registers
|
||||
*
|
||||
* Not all registers of a particular type support all of these bits -
|
||||
* check TRM if you are unsure
|
||||
*/
|
||||
|
||||
/*
|
||||
* 24XX: PM_PWSTST_CORE, PM_PWSTST_GFX, PM_PWSTST_MPU, PM_PWSTST_DSP
|
||||
*
|
||||
* 2430: PM_PWSTST_MDM
|
||||
*
|
||||
* 3430: PM_PWSTST_IVA2, PM_PWSTST_MPU, PM_PWSTST_CORE, PM_PWSTST_GFX,
|
||||
* PM_PWSTST_DSS, PM_PWSTST_CAM, PM_PWSTST_PER, PM_PWSTST_EMU,
|
||||
* PM_PWSTST_NEON
|
||||
*/
|
||||
#define OMAP_INTRANSITION (1 << 20)
|
||||
|
||||
|
||||
/*
|
||||
* 24XX: PM_PWSTST_GFX, PM_PWSTST_DSP
|
||||
*
|
||||
* 2430: PM_PWSTST_MDM
|
||||
*
|
||||
* 3430: PM_PWSTST_IVA2, PM_PWSTST_MPU, PM_PWSTST_CORE, PM_PWSTST_GFX,
|
||||
* PM_PWSTST_DSS, PM_PWSTST_CAM, PM_PWSTST_PER, PM_PWSTST_EMU,
|
||||
* PM_PWSTST_NEON
|
||||
*/
|
||||
#define OMAP_POWERSTATEST_SHIFT 0
|
||||
#define OMAP_POWERSTATEST_MASK (0x3 << 0)
|
||||
|
||||
/*
|
||||
* 24XX: RM_RSTST_MPU and RM_RSTST_DSP - on 24XX, 'COREDOMAINWKUP_RST' is
|
||||
* called 'COREWKUP_RST'
|
||||
*
|
||||
* 3430: RM_RSTST_IVA2, RM_RSTST_MPU, RM_RSTST_GFX, RM_RSTST_DSS,
|
||||
* RM_RSTST_CAM, RM_RSTST_PER, RM_RSTST_NEON
|
||||
*/
|
||||
#define OMAP_COREDOMAINWKUP_RST (1 << 3)
|
||||
|
||||
/*
|
||||
* 24XX: RM_RSTST_MPU, RM_RSTST_GFX, RM_RSTST_DSP
|
||||
*
|
||||
* 2430: RM_RSTST_MDM
|
||||
*
|
||||
* 3430: RM_RSTST_CORE, RM_RSTST_EMU
|
||||
*/
|
||||
#define OMAP_DOMAINWKUP_RST (1 << 2)
|
||||
|
||||
/*
|
||||
* 24XX: RM_RSTST_MPU, RM_RSTST_WKUP, RM_RSTST_DSP
|
||||
* On 24XX, 'GLOBALWARM_RST' is called 'GLOBALWMPU_RST'.
|
||||
*
|
||||
* 2430: RM_RSTST_MDM
|
||||
*
|
||||
* 3430: RM_RSTST_CORE, RM_RSTST_EMU
|
||||
*/
|
||||
#define OMAP_GLOBALWARM_RST (1 << 1)
|
||||
#define OMAP_GLOBALCOLD_RST (1 << 0)
|
||||
|
||||
/*
|
||||
* 24XX: PM_WKDEP_GFX, PM_WKDEP_MPU, PM_WKDEP_CORE, PM_WKDEP_DSP
|
||||
* 2420 TRM sometimes uses "EN_WAKEUP" instead of "EN_WKUP"
|
||||
*
|
||||
* 2430: PM_WKDEP_MDM
|
||||
*
|
||||
* 3430: PM_WKDEP_IVA2, PM_WKDEP_GFX, PM_WKDEP_DSS, PM_WKDEP_CAM,
|
||||
* PM_WKDEP_PER
|
||||
*/
|
||||
#define OMAP_EN_WKUP (1 << 4)
|
||||
|
||||
/*
|
||||
* 24XX: PM_PWSTCTRL_MPU, PM_PWSTCTRL_CORE, PM_PWSTCTRL_GFX,
|
||||
* PM_PWSTCTRL_DSP
|
||||
*
|
||||
* 2430: PM_PWSTCTRL_MDM
|
||||
*
|
||||
* 3430: PM_PWSTCTRL_IVA2, PM_PWSTCTRL_CORE, PM_PWSTCTRL_GFX,
|
||||
* PM_PWSTCTRL_DSS, PM_PWSTCTRL_CAM, PM_PWSTCTRL_PER,
|
||||
* PM_PWSTCTRL_NEON
|
||||
*/
|
||||
#define OMAP_LOGICRETSTATE (1 << 2)
|
||||
|
||||
/*
|
||||
* 24XX: PM_PWSTCTRL_MPU, PM_PWSTCTRL_CORE, PM_PWSTCTRL_GFX,
|
||||
* PM_PWSTCTRL_DSP, PM_PWSTST_MPU
|
||||
*
|
||||
* 2430: PM_PWSTCTRL_MDM shared bits
|
||||
*
|
||||
* 3430: PM_PWSTCTRL_IVA2, PM_PWSTCTRL_MPU, PM_PWSTCTRL_CORE,
|
||||
* PM_PWSTCTRL_GFX, PM_PWSTCTRL_DSS, PM_PWSTCTRL_CAM, PM_PWSTCTRL_PER,
|
||||
* PM_PWSTCTRL_NEON shared bits
|
||||
*/
|
||||
#define OMAP_POWERSTATE_SHIFT 0
|
||||
#define OMAP_POWERSTATE_MASK (0x3 << 0)
|
||||
|
||||
|
||||
#endif
|
||||
58
arch/arm/mach-omap2/sdrc.h
Normal file
58
arch/arm/mach-omap2/sdrc.h
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
#ifndef __ARCH_ARM_MACH_OMAP2_SDRC_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_SDRC_H
|
||||
|
||||
/*
|
||||
* OMAP2 SDRC register definitions
|
||||
*
|
||||
* Copyright (C) 2007 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#undef DEBUG
|
||||
|
||||
#include <asm/arch/sdrc.h>
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
extern unsigned long omap2_sdrc_base;
|
||||
extern unsigned long omap2_sms_base;
|
||||
|
||||
#define OMAP_SDRC_REGADDR(reg) \
|
||||
(void __iomem *)IO_ADDRESS(omap2_sdrc_base + (reg))
|
||||
#define OMAP_SMS_REGADDR(reg) \
|
||||
(void __iomem *)IO_ADDRESS(omap2_sms_base + (reg))
|
||||
|
||||
/* SDRC global register get/set */
|
||||
|
||||
static inline void sdrc_write_reg(u32 val, u16 reg)
|
||||
{
|
||||
__raw_writel(val, OMAP_SDRC_REGADDR(reg));
|
||||
}
|
||||
|
||||
static inline u32 sdrc_read_reg(u16 reg)
|
||||
{
|
||||
return __raw_readl(OMAP_SDRC_REGADDR(reg));
|
||||
}
|
||||
|
||||
/* SMS global register get/set */
|
||||
|
||||
static inline void sms_write_reg(u32 val, u16 reg)
|
||||
{
|
||||
__raw_writel(val, OMAP_SMS_REGADDR(reg));
|
||||
}
|
||||
|
||||
static inline u32 sms_read_reg(u16 reg)
|
||||
{
|
||||
return __raw_readl(OMAP_SMS_REGADDR(reg));
|
||||
}
|
||||
#else
|
||||
#define OMAP242X_SDRC_REGADDR(reg) IO_ADDRESS(OMAP2420_SDRC_BASE + (reg))
|
||||
#define OMAP243X_SDRC_REGADDR(reg) IO_ADDRESS(OMAP243X_SDRC_BASE + (reg))
|
||||
#define OMAP34XX_SDRC_REGADDR(reg) IO_ADDRESS(OMAP343X_SDRC_BASE + (reg))
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif
|
||||
|
|
@ -26,19 +26,10 @@
|
|||
#include <asm/arch/io.h>
|
||||
#include <asm/arch/pm.h>
|
||||
|
||||
#define A_32KSYNC_CR_V IO_ADDRESS(OMAP_TIMER32K_BASE+0x10)
|
||||
#define A_PRCM_VOLTCTRL_V IO_ADDRESS(OMAP24XX_PRCM_BASE+0x50)
|
||||
#define A_PRCM_CLKCFG_CTRL_V IO_ADDRESS(OMAP24XX_PRCM_BASE+0x80)
|
||||
#define A_CM_CLKEN_PLL_V IO_ADDRESS(OMAP24XX_PRCM_BASE+0x500)
|
||||
#define A_CM_IDLEST_CKGEN_V IO_ADDRESS(OMAP24XX_PRCM_BASE+0x520)
|
||||
#define A_CM_CLKSEL1_PLL_V IO_ADDRESS(OMAP24XX_PRCM_BASE+0x540)
|
||||
#define A_CM_CLKSEL2_PLL_V IO_ADDRESS(OMAP24XX_PRCM_BASE+0x544)
|
||||
#include "sdrc.h"
|
||||
|
||||
#define A_SDRC_DLLA_CTRL_V IO_ADDRESS(OMAP24XX_SDRC_BASE+0x60)
|
||||
#define A_SDRC_POWER_V IO_ADDRESS(OMAP24XX_SDRC_BASE+0x70)
|
||||
#define A_SDRC_RFR_CTRL_V IO_ADDRESS(OMAP24XX_SDRC_BASE+0xA4)
|
||||
/* First address of reserved address space? apparently valid for OMAP2 & 3 */
|
||||
#define A_SDRC0_V (0xC0000000)
|
||||
#define A_SDRC_MANUAL_V IO_ADDRESS(OMAP24XX_SDRC_BASE+0xA8)
|
||||
|
||||
.text
|
||||
|
||||
|
|
@ -126,17 +117,11 @@ loop2:
|
|||
ldmfd sp!, {r0 - r12, pc} @ restore regs and return
|
||||
|
||||
A_SDRC_POWER:
|
||||
.word A_SDRC_POWER_V
|
||||
.word OMAP242X_SDRC_REGADDR(SDRC_POWER)
|
||||
A_SDRC0:
|
||||
.word A_SDRC0_V
|
||||
A_CM_CLKSEL2_PLL_S:
|
||||
.word A_CM_CLKSEL2_PLL_V
|
||||
A_CM_CLKEN_PLL:
|
||||
.word A_CM_CLKEN_PLL_V
|
||||
A_SDRC_DLLA_CTRL_S:
|
||||
.word A_SDRC_DLLA_CTRL_V
|
||||
A_SDRC_MANUAL_S:
|
||||
.word A_SDRC_MANUAL_V
|
||||
.word OMAP242X_SDRC_REGADDR(SDRC_DLLA_CTRL)
|
||||
|
||||
ENTRY(omap24xx_cpu_suspend_sz)
|
||||
.word . - omap24xx_cpu_suspend
|
||||
|
|
|
|||
|
|
@ -27,19 +27,11 @@
|
|||
#include <asm/arch/io.h>
|
||||
#include <asm/hardware.h>
|
||||
|
||||
#include "prcm-regs.h"
|
||||
#include "sdrc.h"
|
||||
#include "prm.h"
|
||||
#include "cm.h"
|
||||
|
||||
#define TIMER_32KSYNCT_CR_V IO_ADDRESS(OMAP24XX_32KSYNCT_BASE + 0x010)
|
||||
|
||||
#define CM_CLKSEL2_PLL_V IO_ADDRESS(OMAP24XX_PRCM_BASE + 0x544)
|
||||
#define PRCM_VOLTCTRL_V IO_ADDRESS(OMAP24XX_PRCM_BASE + 0x050)
|
||||
#define PRCM_CLKCFG_CTRL_V IO_ADDRESS(OMAP24XX_PRCM_BASE + 0x080)
|
||||
#define CM_CLKEN_PLL_V IO_ADDRESS(OMAP24XX_PRCM_BASE + 0x500)
|
||||
#define CM_IDLEST_CKGEN_V IO_ADDRESS(OMAP24XX_PRCM_BASE + 0x520)
|
||||
#define CM_CLKSEL1_PLL_V IO_ADDRESS(OMAP24XX_PRCM_BASE + 0x540)
|
||||
|
||||
#define SDRC_DLLA_CTRL_V IO_ADDRESS(OMAP24XX_SDRC_BASE + 0x060)
|
||||
#define SDRC_RFR_CTRL_V IO_ADDRESS(OMAP24XX_SDRC_BASE + 0x0a4)
|
||||
#define TIMER_32KSYNCT_CR_V IO_ADDRESS(OMAP2420_32KSYNCT_BASE + 0x010)
|
||||
|
||||
.text
|
||||
|
||||
|
|
@ -131,11 +123,11 @@ volt_delay:
|
|||
|
||||
/* relative load constants */
|
||||
cm_clksel2_pll:
|
||||
.word CM_CLKSEL2_PLL_V
|
||||
.word OMAP2420_CM_REGADDR(PLL_MOD, CM_CLKSEL2)
|
||||
sdrc_dlla_ctrl:
|
||||
.word SDRC_DLLA_CTRL_V
|
||||
.word OMAP242X_SDRC_REGADDR(SDRC_DLLA_CTRL)
|
||||
prcm_voltctrl:
|
||||
.word PRCM_VOLTCTRL_V
|
||||
.word OMAP2420_PRM_REGADDR(OCP_MOD, 0x50)
|
||||
prcm_mask_val:
|
||||
.word 0xFFFF3FFC
|
||||
timer_32ksynct_cr:
|
||||
|
|
@ -225,13 +217,13 @@ volt_delay_c:
|
|||
mov pc, lr @ back to caller
|
||||
|
||||
ddr_cm_clksel2_pll:
|
||||
.word CM_CLKSEL2_PLL_V
|
||||
.word OMAP2420_CM_REGADDR(PLL_MOD, CM_CLKSEL2)
|
||||
ddr_sdrc_dlla_ctrl:
|
||||
.word SDRC_DLLA_CTRL_V
|
||||
.word OMAP242X_SDRC_REGADDR(SDRC_DLLA_CTRL)
|
||||
ddr_sdrc_rfr_ctrl:
|
||||
.word SDRC_RFR_CTRL_V
|
||||
.word OMAP242X_SDRC_REGADDR(SDRC_RFR_CTRL_0)
|
||||
ddr_prcm_voltctrl:
|
||||
.word PRCM_VOLTCTRL_V
|
||||
.word OMAP2420_PRM_REGADDR(OCP_MOD, 0x50)
|
||||
ddr_prcm_mask_val:
|
||||
.word 0xFFFF3FFC
|
||||
ddr_timer_32ksynct:
|
||||
|
|
@ -316,17 +308,17 @@ wait_dll_lock:
|
|||
ldmfd sp!, {r0-r12, pc} @ restore regs and return
|
||||
|
||||
set_config:
|
||||
.word PRCM_CLKCFG_CTRL_V
|
||||
.word OMAP2420_PRM_REGADDR(OCP_MOD, 0x80)
|
||||
pll_ctl:
|
||||
.word CM_CLKEN_PLL_V
|
||||
.word OMAP2420_CM_REGADDR(PLL_MOD, CM_FCLKEN1)
|
||||
pll_stat:
|
||||
.word CM_IDLEST_CKGEN_V
|
||||
.word OMAP2420_CM_REGADDR(PLL_MOD, CM_IDLEST1)
|
||||
pll_div:
|
||||
.word CM_CLKSEL1_PLL_V
|
||||
.word OMAP2420_CM_REGADDR(PLL_MOD, CM_CLKSEL)
|
||||
sdrc_rfr:
|
||||
.word SDRC_RFR_CTRL_V
|
||||
.word OMAP242X_SDRC_REGADDR(SDRC_RFR_CTRL_0)
|
||||
dlla_ctrl:
|
||||
.word SDRC_DLLA_CTRL_V
|
||||
.word OMAP242X_SDRC_REGADDR(SDRC_DLLA_CTRL)
|
||||
|
||||
ENTRY(sram_set_prcm_sz)
|
||||
.word . - sram_set_prcm
|
||||
|
|
|
|||
|
|
@ -3,6 +3,11 @@
|
|||
*
|
||||
* OMAP2 GP timer support.
|
||||
*
|
||||
* Update to use new clocksource/clockevent layers
|
||||
* Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com>
|
||||
* Copyright (C) 2007 MontaVista Software, Inc.
|
||||
*
|
||||
* Original driver:
|
||||
* Copyright (C) 2005 Nokia Corporation
|
||||
* Author: Paul Mundt <paul.mundt@nokia.com>
|
||||
* Juha Yrjölä <juha.yrjola@nokia.com>
|
||||
|
|
@ -25,24 +30,23 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/clockchips.h>
|
||||
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/arch/dmtimer.h>
|
||||
|
||||
static struct omap_dm_timer *gptimer;
|
||||
|
||||
static inline void omap2_gp_timer_start(unsigned long load_val)
|
||||
{
|
||||
omap_dm_timer_set_load(gptimer, 1, 0xffffffff - load_val);
|
||||
omap_dm_timer_set_int_enable(gptimer, OMAP_TIMER_INT_OVERFLOW);
|
||||
omap_dm_timer_start(gptimer);
|
||||
}
|
||||
static struct clock_event_device clockevent_gpt;
|
||||
|
||||
static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
omap_dm_timer_write_status(gptimer, OMAP_TIMER_INT_OVERFLOW);
|
||||
timer_tick();
|
||||
struct omap_dm_timer *gpt = (struct omap_dm_timer *)dev_id;
|
||||
struct clock_event_device *evt = &clockevent_gpt;
|
||||
|
||||
omap_dm_timer_write_status(gpt, OMAP_TIMER_INT_OVERFLOW);
|
||||
|
||||
evt->event_handler(evt);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
|
@ -52,20 +56,138 @@ static struct irqaction omap2_gp_timer_irq = {
|
|||
.handler = omap2_gp_timer_interrupt,
|
||||
};
|
||||
|
||||
static void __init omap2_gp_timer_init(void)
|
||||
static int omap2_gp_timer_set_next_event(unsigned long cycles,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
u32 tick_period;
|
||||
omap_dm_timer_set_load(gptimer, 0, 0xffffffff - cycles);
|
||||
omap_dm_timer_start(gptimer);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void omap2_gp_timer_set_mode(enum clock_event_mode mode,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
u32 period;
|
||||
|
||||
omap_dm_timer_stop(gptimer);
|
||||
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
period = clk_get_rate(omap_dm_timer_get_fclk(gptimer)) / HZ;
|
||||
period -= 1;
|
||||
|
||||
omap_dm_timer_set_load(gptimer, 1, 0xffffffff - period);
|
||||
omap_dm_timer_start(gptimer);
|
||||
break;
|
||||
case CLOCK_EVT_MODE_ONESHOT:
|
||||
break;
|
||||
case CLOCK_EVT_MODE_UNUSED:
|
||||
case CLOCK_EVT_MODE_SHUTDOWN:
|
||||
case CLOCK_EVT_MODE_RESUME:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static struct clock_event_device clockevent_gpt = {
|
||||
.name = "gp timer",
|
||||
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
|
||||
.shift = 32,
|
||||
.set_next_event = omap2_gp_timer_set_next_event,
|
||||
.set_mode = omap2_gp_timer_set_mode,
|
||||
};
|
||||
|
||||
static void __init omap2_gp_clockevent_init(void)
|
||||
{
|
||||
u32 tick_rate;
|
||||
|
||||
omap_dm_timer_init();
|
||||
gptimer = omap_dm_timer_request_specific(1);
|
||||
BUG_ON(gptimer == NULL);
|
||||
|
||||
#if defined(CONFIG_OMAP_32K_TIMER)
|
||||
omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_32_KHZ);
|
||||
#else
|
||||
omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_SYS_CLK);
|
||||
tick_period = clk_get_rate(omap_dm_timer_get_fclk(gptimer)) / HZ;
|
||||
tick_period -= 1;
|
||||
#endif
|
||||
tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer));
|
||||
|
||||
omap2_gp_timer_irq.dev_id = (void *)gptimer;
|
||||
setup_irq(omap_dm_timer_get_irq(gptimer), &omap2_gp_timer_irq);
|
||||
omap2_gp_timer_start(tick_period);
|
||||
omap_dm_timer_set_int_enable(gptimer, OMAP_TIMER_INT_OVERFLOW);
|
||||
|
||||
clockevent_gpt.mult = div_sc(tick_rate, NSEC_PER_SEC,
|
||||
clockevent_gpt.shift);
|
||||
clockevent_gpt.max_delta_ns =
|
||||
clockevent_delta2ns(0xffffffff, &clockevent_gpt);
|
||||
clockevent_gpt.min_delta_ns =
|
||||
clockevent_delta2ns(1, &clockevent_gpt);
|
||||
|
||||
clockevent_gpt.cpumask = cpumask_of_cpu(0);
|
||||
clockevents_register_device(&clockevent_gpt);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OMAP_32K_TIMER
|
||||
/*
|
||||
* When 32k-timer is enabled, don't use GPTimer for clocksource
|
||||
* instead, just leave default clocksource which uses the 32k
|
||||
* sync counter. See clocksource setup in see plat-omap/common.c.
|
||||
*/
|
||||
|
||||
static inline void __init omap2_gp_clocksource_init(void) {}
|
||||
#else
|
||||
/*
|
||||
* clocksource
|
||||
*/
|
||||
static struct omap_dm_timer *gpt_clocksource;
|
||||
static cycle_t clocksource_read_cycles(void)
|
||||
{
|
||||
return (cycle_t)omap_dm_timer_read_counter(gpt_clocksource);
|
||||
}
|
||||
|
||||
static struct clocksource clocksource_gpt = {
|
||||
.name = "gp timer",
|
||||
.rating = 300,
|
||||
.read = clocksource_read_cycles,
|
||||
.mask = CLOCKSOURCE_MASK(32),
|
||||
.shift = 24,
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
/* Setup free-running counter for clocksource */
|
||||
static void __init omap2_gp_clocksource_init(void)
|
||||
{
|
||||
static struct omap_dm_timer *gpt;
|
||||
u32 tick_rate, tick_period;
|
||||
static char err1[] __initdata = KERN_ERR
|
||||
"%s: failed to request dm-timer\n";
|
||||
static char err2[] __initdata = KERN_ERR
|
||||
"%s: can't register clocksource!\n";
|
||||
|
||||
gpt = omap_dm_timer_request();
|
||||
if (!gpt)
|
||||
printk(err1, clocksource_gpt.name);
|
||||
gpt_clocksource = gpt;
|
||||
|
||||
omap_dm_timer_set_source(gpt, OMAP_TIMER_SRC_SYS_CLK);
|
||||
tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gpt));
|
||||
tick_period = (tick_rate / HZ) - 1;
|
||||
|
||||
omap_dm_timer_set_load(gpt, 1, 0);
|
||||
omap_dm_timer_start(gpt);
|
||||
|
||||
clocksource_gpt.mult =
|
||||
clocksource_khz2mult(tick_rate/1000, clocksource_gpt.shift);
|
||||
if (clocksource_register(&clocksource_gpt))
|
||||
printk(err2, clocksource_gpt.name);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void __init omap2_gp_timer_init(void)
|
||||
{
|
||||
omap_dm_timer_init();
|
||||
|
||||
omap2_gp_clockevent_init();
|
||||
omap2_gp_clocksource_init();
|
||||
}
|
||||
|
||||
struct sys_timer omap_timer = {
|
||||
|
|
|
|||
|
|
@ -9,8 +9,6 @@ obj-m :=
|
|||
obj-n :=
|
||||
obj- :=
|
||||
|
||||
obj-$(CONFIG_OMAP_32K_TIMER) += timer32k.o
|
||||
|
||||
# OCPI interconnect support for 1710, 1610 and 5912
|
||||
obj-$(CONFIG_ARCH_OMAP16XX) += ocpi.o
|
||||
|
||||
|
|
|
|||
|
|
@ -304,6 +304,23 @@ void propagate_rate(struct clk * tclk)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* recalculate_root_clocks - recalculate and propagate all root clocks
|
||||
*
|
||||
* Recalculates all root clocks (clocks with no parent), which if the
|
||||
* clock's .recalc is set correctly, should also propagate their rates.
|
||||
* Called at init.
|
||||
*/
|
||||
void recalculate_root_clocks(void)
|
||||
{
|
||||
struct clk *clkp;
|
||||
|
||||
list_for_each_entry(clkp, &clocks, node) {
|
||||
if (unlikely(!clkp->parent) && likely((u32)clkp->recalc))
|
||||
clkp->recalc(clkp);
|
||||
}
|
||||
}
|
||||
|
||||
int clk_register(struct clk *clk)
|
||||
{
|
||||
if (clk == NULL || IS_ERR(clk))
|
||||
|
|
@ -358,6 +375,30 @@ void clk_allow_idle(struct clk *clk)
|
|||
}
|
||||
EXPORT_SYMBOL(clk_allow_idle);
|
||||
|
||||
void clk_enable_init_clocks(void)
|
||||
{
|
||||
struct clk *clkp;
|
||||
|
||||
list_for_each_entry(clkp, &clocks, node) {
|
||||
if (clkp->flags & ENABLE_ON_INIT)
|
||||
clk_enable(clkp);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(clk_enable_init_clocks);
|
||||
|
||||
#ifdef CONFIG_CPU_FREQ
|
||||
void clk_init_cpufreq_table(struct cpufreq_frequency_table **table)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&clockfw_lock, flags);
|
||||
if (arch_clock->clk_init_cpufreq_table)
|
||||
arch_clock->clk_init_cpufreq_table(table);
|
||||
spin_unlock_irqrestore(&clockfw_lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(clk_init_cpufreq_table);
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef CONFIG_OMAP_RESET_CLOCKS
|
||||
|
|
@ -396,3 +437,4 @@ int __init clk_init(struct clk_functions * custom_clocks)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -27,11 +27,16 @@
|
|||
#include <asm/setup.h>
|
||||
|
||||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/control.h>
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/fpga.h>
|
||||
|
||||
#include <asm/arch/clock.h>
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
|
||||
# include "../mach-omap2/sdrc.h"
|
||||
#endif
|
||||
|
||||
#define NO_LENGTH_CHECK 0xffffffff
|
||||
|
||||
unsigned char omap_bootloader_tag[512];
|
||||
|
|
@ -171,8 +176,8 @@ console_initcall(omap_add_serial_console);
|
|||
|
||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||
#define TIMER_32K_SYNCHRONIZED 0xfffbc410
|
||||
#elif defined(CONFIG_ARCH_OMAP24XX)
|
||||
#define TIMER_32K_SYNCHRONIZED (OMAP24XX_32KSYNCT_BASE + 0x10)
|
||||
#elif defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
|
||||
#define TIMER_32K_SYNCHRONIZED (OMAP2_32KSYNCT_BASE + 0x10)
|
||||
#endif
|
||||
|
||||
#ifdef TIMER_32K_SYNCHRONIZED
|
||||
|
|
@ -193,12 +198,35 @@ static struct clocksource clocksource_32k = {
|
|||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
/*
|
||||
* Rounds down to nearest nsec.
|
||||
*/
|
||||
unsigned long long omap_32k_ticks_to_nsecs(unsigned long ticks_32k)
|
||||
{
|
||||
return cyc2ns(&clocksource_32k, ticks_32k);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns current time from boot in nsecs. It's OK for this to wrap
|
||||
* around for now, as it's just a relative time stamp.
|
||||
*/
|
||||
unsigned long long sched_clock(void)
|
||||
{
|
||||
return omap_32k_ticks_to_nsecs(omap_32k_read());
|
||||
}
|
||||
|
||||
static int __init omap_init_clocksource_32k(void)
|
||||
{
|
||||
static char err[] __initdata = KERN_ERR
|
||||
"%s: can't register clocksource!\n";
|
||||
|
||||
if (cpu_is_omap16xx() || cpu_is_omap24xx()) {
|
||||
if (cpu_is_omap16xx() || cpu_class_is_omap2()) {
|
||||
struct clk *sync_32k_ick;
|
||||
|
||||
sync_32k_ick = clk_get(NULL, "omap_32ksync_ick");
|
||||
if (sync_32k_ick)
|
||||
clk_enable(sync_32k_ick);
|
||||
|
||||
clocksource_32k.mult = clocksource_hz2mult(32768,
|
||||
clocksource_32k.shift);
|
||||
|
||||
|
|
@ -210,3 +238,33 @@ static int __init omap_init_clocksource_32k(void)
|
|||
arch_initcall(omap_init_clocksource_32k);
|
||||
|
||||
#endif /* TIMER_32K_SYNCHRONIZED */
|
||||
|
||||
/* Global address base setup code */
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP2420)
|
||||
void __init omap2_set_globals_242x(void)
|
||||
{
|
||||
omap2_sdrc_base = OMAP2420_SDRC_BASE;
|
||||
omap2_sms_base = OMAP2420_SMS_BASE;
|
||||
omap_ctrl_base_set(OMAP2420_CTRL_BASE);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP2430)
|
||||
void __init omap2_set_globals_243x(void)
|
||||
{
|
||||
omap2_sdrc_base = OMAP243X_SDRC_BASE;
|
||||
omap2_sms_base = OMAP243X_SMS_BASE;
|
||||
omap_ctrl_base_set(OMAP243X_CTRL_BASE);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP3430)
|
||||
void __init omap2_set_globals_343x(void)
|
||||
{
|
||||
omap2_sdrc_base = OMAP343X_SDRC_BASE;
|
||||
omap2_sms_base = OMAP343X_SMS_BASE;
|
||||
omap_ctrl_base_set(OMAP343X_CTRL_BASE);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -136,7 +136,6 @@ struct gpio_bank {
|
|||
u16 irq;
|
||||
u16 virtual_irq_start;
|
||||
int method;
|
||||
u32 reserved_map;
|
||||
#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
|
||||
u32 suspend_wakeup;
|
||||
u32 saved_wakeup;
|
||||
|
|
@ -149,7 +148,9 @@ struct gpio_bank {
|
|||
u32 saved_fallingdetect;
|
||||
u32 saved_risingdetect;
|
||||
#endif
|
||||
u32 level_mask;
|
||||
spinlock_t lock;
|
||||
struct gpio_chip chip;
|
||||
};
|
||||
|
||||
#define METHOD_MPUIO 0
|
||||
|
|
@ -538,10 +539,9 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
|
|||
bank->enabled_non_wakeup_gpios &= ~gpio_bit;
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME: Possibly do 'set_irq_handler(j, handle_level_irq)' if only
|
||||
* level triggering requested.
|
||||
*/
|
||||
bank->level_mask =
|
||||
__raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0) |
|
||||
__raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -652,6 +652,12 @@ static int gpio_irq_type(unsigned irq, unsigned type)
|
|||
irq_desc[irq].status |= type;
|
||||
}
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
|
||||
if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
|
||||
__set_irq_handler_unlocked(irq, handle_level_irq);
|
||||
else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
|
||||
__set_irq_handler_unlocked(irq, handle_edge_irq);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
@ -903,19 +909,17 @@ int omap_request_gpio(int gpio)
|
|||
{
|
||||
struct gpio_bank *bank;
|
||||
unsigned long flags;
|
||||
int status;
|
||||
|
||||
if (check_gpio(gpio) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
status = gpio_request(gpio, NULL);
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
bank = get_gpio_bank(gpio);
|
||||
spin_lock_irqsave(&bank->lock, flags);
|
||||
if (unlikely(bank->reserved_map & (1 << get_gpio_index(gpio)))) {
|
||||
printk(KERN_ERR "omap-gpio: GPIO %d is already reserved!\n", gpio);
|
||||
dump_stack();
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
return -1;
|
||||
}
|
||||
bank->reserved_map |= (1 << get_gpio_index(gpio));
|
||||
|
||||
/* Set trigger to none. You need to enable the desired trigger with
|
||||
* request_irq() or set_irq_type().
|
||||
|
|
@ -945,10 +949,11 @@ void omap_free_gpio(int gpio)
|
|||
return;
|
||||
bank = get_gpio_bank(gpio);
|
||||
spin_lock_irqsave(&bank->lock, flags);
|
||||
if (unlikely(!(bank->reserved_map & (1 << get_gpio_index(gpio))))) {
|
||||
if (unlikely(!gpiochip_is_requested(&bank->chip,
|
||||
get_gpio_index(gpio)))) {
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
printk(KERN_ERR "omap-gpio: GPIO %d wasn't reserved!\n", gpio);
|
||||
dump_stack();
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
return;
|
||||
}
|
||||
#ifdef CONFIG_ARCH_OMAP16XX
|
||||
|
|
@ -965,9 +970,9 @@ void omap_free_gpio(int gpio)
|
|||
__raw_writel(1 << get_gpio_index(gpio), reg);
|
||||
}
|
||||
#endif
|
||||
bank->reserved_map &= ~(1 << get_gpio_index(gpio));
|
||||
_reset_gpio(bank, gpio);
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
gpio_free(gpio);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1022,12 +1027,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
|
|||
isr &= 0x0000ffff;
|
||||
|
||||
if (cpu_class_is_omap2()) {
|
||||
level_mask =
|
||||
__raw_readl(bank->base +
|
||||
OMAP24XX_GPIO_LEVELDETECT0) |
|
||||
__raw_readl(bank->base +
|
||||
OMAP24XX_GPIO_LEVELDETECT1);
|
||||
level_mask &= enabled;
|
||||
level_mask = bank->level_mask & enabled;
|
||||
}
|
||||
|
||||
/* clear edge sensitive interrupts before handler(s) are
|
||||
|
|
@ -1052,51 +1052,13 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
|
|||
gpio_irq = bank->virtual_irq_start;
|
||||
for (; isr != 0; isr >>= 1, gpio_irq++) {
|
||||
struct irq_desc *d;
|
||||
int irq_mask;
|
||||
|
||||
if (!(isr & 1))
|
||||
continue;
|
||||
d = irq_desc + gpio_irq;
|
||||
/* Don't run the handler if it's already running
|
||||
* or was disabled lazely.
|
||||
*/
|
||||
if (unlikely((d->depth ||
|
||||
(d->status & IRQ_INPROGRESS)))) {
|
||||
irq_mask = 1 <<
|
||||
(gpio_irq - bank->virtual_irq_start);
|
||||
/* The unmasking will be done by
|
||||
* enable_irq in case it is disabled or
|
||||
* after returning from the handler if
|
||||
* it's already running.
|
||||
*/
|
||||
_enable_gpio_irqbank(bank, irq_mask, 0);
|
||||
if (!d->depth) {
|
||||
/* Level triggered interrupts
|
||||
* won't ever be reentered
|
||||
*/
|
||||
BUG_ON(level_mask & irq_mask);
|
||||
d->status |= IRQ_PENDING;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
desc_handle_irq(gpio_irq, d);
|
||||
|
||||
if (unlikely((d->status & IRQ_PENDING) && !d->depth)) {
|
||||
irq_mask = 1 <<
|
||||
(gpio_irq - bank->virtual_irq_start);
|
||||
d->status &= ~IRQ_PENDING;
|
||||
_enable_gpio_irqbank(bank, irq_mask, 1);
|
||||
retrigger |= irq_mask;
|
||||
}
|
||||
}
|
||||
|
||||
if (cpu_class_is_omap2()) {
|
||||
/* clear level sensitive interrupts after handler(s) */
|
||||
_enable_gpio_irqbank(bank, isr_saved & level_mask, 0);
|
||||
_clear_gpio_irqbank(bank, isr_saved & level_mask);
|
||||
_enable_gpio_irqbank(bank, isr_saved & level_mask, 1);
|
||||
}
|
||||
|
||||
}
|
||||
/* if bank has any level sensitive GPIO pin interrupt
|
||||
configured, we must unmask the bank interrupt only after
|
||||
|
|
@ -1135,6 +1097,14 @@ static void gpio_unmask_irq(unsigned int irq)
|
|||
{
|
||||
unsigned int gpio = irq - IH_GPIO_BASE;
|
||||
struct gpio_bank *bank = get_irq_chip_data(irq);
|
||||
unsigned int irq_mask = 1 << get_gpio_index(gpio);
|
||||
|
||||
/* For level-triggered GPIOs, the clearing must be done after
|
||||
* the HW source is cleared, thus after the handler has run */
|
||||
if (bank->level_mask & irq_mask) {
|
||||
_set_gpio_irqenable(bank, gpio, 0);
|
||||
_clear_gpio_irqstatus(bank, gpio);
|
||||
}
|
||||
|
||||
_set_gpio_irqenable(bank, gpio, 1);
|
||||
}
|
||||
|
|
@ -1266,6 +1236,53 @@ static inline void mpuio_init(void) {}
|
|||
|
||||
/*---------------------------------------------------------------------*/
|
||||
|
||||
/* REVISIT these are stupid implementations! replace by ones that
|
||||
* don't switch on METHOD_* and which mostly avoid spinlocks
|
||||
*/
|
||||
|
||||
static int gpio_input(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
struct gpio_bank *bank;
|
||||
unsigned long flags;
|
||||
|
||||
bank = container_of(chip, struct gpio_bank, chip);
|
||||
spin_lock_irqsave(&bank->lock, flags);
|
||||
_set_gpio_direction(bank, offset, 1);
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
return omap_get_gpio_datain(chip->base + offset);
|
||||
}
|
||||
|
||||
static int gpio_output(struct gpio_chip *chip, unsigned offset, int value)
|
||||
{
|
||||
struct gpio_bank *bank;
|
||||
unsigned long flags;
|
||||
|
||||
bank = container_of(chip, struct gpio_bank, chip);
|
||||
spin_lock_irqsave(&bank->lock, flags);
|
||||
_set_gpio_dataout(bank, offset, value);
|
||||
_set_gpio_direction(bank, offset, 0);
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void gpio_set(struct gpio_chip *chip, unsigned offset, int value)
|
||||
{
|
||||
struct gpio_bank *bank;
|
||||
unsigned long flags;
|
||||
|
||||
bank = container_of(chip, struct gpio_bank, chip);
|
||||
spin_lock_irqsave(&bank->lock, flags);
|
||||
_set_gpio_dataout(bank, offset, value);
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
|
||||
static int initialized;
|
||||
#if !defined(CONFIG_ARCH_OMAP3)
|
||||
static struct clk * gpio_ick;
|
||||
|
|
@ -1293,6 +1310,7 @@ static struct lock_class_key gpio_lock_class;
|
|||
static int __init _omap_gpio_init(void)
|
||||
{
|
||||
int i;
|
||||
int gpio = 0;
|
||||
struct gpio_bank *bank;
|
||||
#if defined(CONFIG_ARCH_OMAP3)
|
||||
char clk_name[11];
|
||||
|
|
@ -1423,7 +1441,6 @@ static int __init _omap_gpio_init(void)
|
|||
int j, gpio_count = 16;
|
||||
|
||||
bank = &gpio_bank[i];
|
||||
bank->reserved_map = 0;
|
||||
bank->base = IO_ADDRESS(bank->base);
|
||||
spin_lock_init(&bank->lock);
|
||||
if (bank_is_mpuio(bank))
|
||||
|
|
@ -1461,6 +1478,26 @@ static int __init _omap_gpio_init(void)
|
|||
gpio_count = 32;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* REVISIT eventually switch from OMAP-specific gpio structs
|
||||
* over to the generic ones
|
||||
*/
|
||||
bank->chip.direction_input = gpio_input;
|
||||
bank->chip.get = gpio_get;
|
||||
bank->chip.direction_output = gpio_output;
|
||||
bank->chip.set = gpio_set;
|
||||
if (bank_is_mpuio(bank)) {
|
||||
bank->chip.label = "mpuio";
|
||||
bank->chip.base = OMAP_MPUIO(0);
|
||||
} else {
|
||||
bank->chip.label = "gpio";
|
||||
bank->chip.base = gpio;
|
||||
gpio += gpio_count;
|
||||
}
|
||||
bank->chip.ngpio = gpio_count;
|
||||
|
||||
gpiochip_add(&bank->chip);
|
||||
|
||||
for (j = bank->virtual_irq_start;
|
||||
j < bank->virtual_irq_start + gpio_count; j++) {
|
||||
lockdep_set_class(&irq_desc[j].lock, &gpio_lock_class);
|
||||
|
|
@ -1757,8 +1794,10 @@ static int dbg_gpio_show(struct seq_file *s, void *unused)
|
|||
|
||||
for (j = 0; j < bankwidth; j++, gpio++, mask <<= 1) {
|
||||
unsigned irq, value, is_in, irqstat;
|
||||
const char *label;
|
||||
|
||||
if (!(bank->reserved_map & mask))
|
||||
label = gpiochip_is_requested(&bank->chip, j);
|
||||
if (!label)
|
||||
continue;
|
||||
|
||||
irq = bank->virtual_irq_start + j;
|
||||
|
|
@ -1766,13 +1805,16 @@ static int dbg_gpio_show(struct seq_file *s, void *unused)
|
|||
is_in = gpio_is_input(bank, mask);
|
||||
|
||||
if (bank_is_mpuio(bank))
|
||||
seq_printf(s, "MPUIO %2d: ", j);
|
||||
seq_printf(s, "MPUIO %2d ", j);
|
||||
else
|
||||
seq_printf(s, "GPIO %3d: ", gpio);
|
||||
seq_printf(s, "%s %s",
|
||||
seq_printf(s, "GPIO %3d ", gpio);
|
||||
seq_printf(s, "(%10s): %s %s",
|
||||
label,
|
||||
is_in ? "in " : "out",
|
||||
value ? "hi" : "lo");
|
||||
|
||||
/* FIXME for at least omap2, show pullup/pulldown state */
|
||||
|
||||
irqstat = irq_desc[irq].status;
|
||||
if (is_in && ((bank->suspend_wakeup & mask)
|
||||
|| irqstat & IRQ_TYPE_SENSE_MASK)) {
|
||||
|
|
@ -1795,10 +1837,10 @@ static int dbg_gpio_show(struct seq_file *s, void *unused)
|
|||
trigger = "high";
|
||||
break;
|
||||
case IRQ_TYPE_NONE:
|
||||
trigger = "(unspecified)";
|
||||
trigger = "(?)";
|
||||
break;
|
||||
}
|
||||
seq_printf(s, ", irq-%d %s%s",
|
||||
seq_printf(s, ", irq-%d %-8s%s",
|
||||
irq, trigger,
|
||||
(bank->suspend_wakeup & mask)
|
||||
? " wakeup" : "");
|
||||
|
|
|
|||
|
|
@ -3,9 +3,9 @@
|
|||
*
|
||||
* Utility to set the Omap MUX and PULL_DWN registers from a table in mux.h
|
||||
*
|
||||
* Copyright (C) 2003 - 2005 Nokia Corporation
|
||||
* Copyright (C) 2003 - 2008 Nokia Corporation
|
||||
*
|
||||
* Written by Tony Lindgren <tony.lindgren@nokia.com>
|
||||
* Written by Tony Lindgren
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -32,21 +32,17 @@
|
|||
|
||||
#ifdef CONFIG_OMAP_MUX
|
||||
|
||||
#define OMAP24XX_L4_BASE 0x48000000
|
||||
#define OMAP24XX_PULL_ENA (1 << 3)
|
||||
#define OMAP24XX_PULL_UP (1 << 4)
|
||||
static struct omap_mux_cfg *mux_cfg;
|
||||
|
||||
static struct pin_config * pin_table;
|
||||
static unsigned long pin_table_sz;
|
||||
|
||||
extern struct pin_config * omap730_pins;
|
||||
extern struct pin_config * omap1xxx_pins;
|
||||
extern struct pin_config * omap24xx_pins;
|
||||
|
||||
int __init omap_mux_register(struct pin_config * pins, unsigned long size)
|
||||
int __init omap_mux_register(struct omap_mux_cfg *arch_mux_cfg)
|
||||
{
|
||||
pin_table = pins;
|
||||
pin_table_sz = size;
|
||||
if (!arch_mux_cfg || !arch_mux_cfg->pins || arch_mux_cfg->size == 0
|
||||
|| !arch_mux_cfg->cfg_reg) {
|
||||
printk(KERN_ERR "Invalid pin table\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mux_cfg = arch_mux_cfg;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -56,152 +52,26 @@ int __init omap_mux_register(struct pin_config * pins, unsigned long size)
|
|||
*/
|
||||
int __init_or_module omap_cfg_reg(const unsigned long index)
|
||||
{
|
||||
static DEFINE_SPINLOCK(mux_spin_lock);
|
||||
struct pin_config *reg;
|
||||
|
||||
unsigned long flags;
|
||||
struct pin_config *cfg;
|
||||
unsigned int reg_orig = 0, reg = 0, pu_pd_orig = 0, pu_pd = 0,
|
||||
pull_orig = 0, pull = 0;
|
||||
unsigned int mask, warn = 0;
|
||||
if (mux_cfg == NULL) {
|
||||
printk(KERN_ERR "Pin mux table not initialized\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!pin_table)
|
||||
BUG();
|
||||
|
||||
if (index >= pin_table_sz) {
|
||||
if (index >= mux_cfg->size) {
|
||||
printk(KERN_ERR "Invalid pin mux index: %lu (%lu)\n",
|
||||
index, pin_table_sz);
|
||||
index, mux_cfg->size);
|
||||
dump_stack();
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
cfg = (struct pin_config *)&pin_table[index];
|
||||
if (cpu_is_omap24xx()) {
|
||||
u8 reg = 0;
|
||||
reg = (struct pin_config *)&mux_cfg->pins[index];
|
||||
|
||||
reg |= cfg->mask & 0x7;
|
||||
if (cfg->pull_val)
|
||||
reg |= OMAP24XX_PULL_ENA;
|
||||
if(cfg->pu_pd_val)
|
||||
reg |= OMAP24XX_PULL_UP;
|
||||
#if defined(CONFIG_OMAP_MUX_DEBUG) || defined(CONFIG_OMAP_MUX_WARNINGS)
|
||||
{
|
||||
u8 orig = omap_readb(OMAP24XX_L4_BASE + cfg->mux_reg);
|
||||
u8 debug = 0;
|
||||
if (!mux_cfg->cfg_reg)
|
||||
return -ENODEV;
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX_DEBUG
|
||||
debug = cfg->debug;
|
||||
#endif
|
||||
warn = (orig != reg);
|
||||
if (debug || warn)
|
||||
printk("MUX: setup %s (0x%08x): 0x%02x -> 0x%02x\n",
|
||||
cfg->name,
|
||||
OMAP24XX_L4_BASE + cfg->mux_reg,
|
||||
orig, reg);
|
||||
}
|
||||
#endif
|
||||
omap_writeb(reg, OMAP24XX_L4_BASE + cfg->mux_reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Check the mux register in question */
|
||||
if (cfg->mux_reg) {
|
||||
unsigned tmp1, tmp2;
|
||||
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
reg_orig = omap_readl(cfg->mux_reg);
|
||||
|
||||
/* The mux registers always seem to be 3 bits long */
|
||||
mask = (0x7 << cfg->mask_offset);
|
||||
tmp1 = reg_orig & mask;
|
||||
reg = reg_orig & ~mask;
|
||||
|
||||
tmp2 = (cfg->mask << cfg->mask_offset);
|
||||
reg |= tmp2;
|
||||
|
||||
if (tmp1 != tmp2)
|
||||
warn = 1;
|
||||
|
||||
omap_writel(reg, cfg->mux_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
}
|
||||
|
||||
/* Check for pull up or pull down selection on 1610 */
|
||||
if (!cpu_is_omap15xx()) {
|
||||
if (cfg->pu_pd_reg && cfg->pull_val) {
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
pu_pd_orig = omap_readl(cfg->pu_pd_reg);
|
||||
mask = 1 << cfg->pull_bit;
|
||||
|
||||
if (cfg->pu_pd_val) {
|
||||
if (!(pu_pd_orig & mask))
|
||||
warn = 1;
|
||||
/* Use pull up */
|
||||
pu_pd = pu_pd_orig | mask;
|
||||
} else {
|
||||
if (pu_pd_orig & mask)
|
||||
warn = 1;
|
||||
/* Use pull down */
|
||||
pu_pd = pu_pd_orig & ~mask;
|
||||
}
|
||||
omap_writel(pu_pd, cfg->pu_pd_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check for an associated pull down register */
|
||||
if (cfg->pull_reg) {
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
pull_orig = omap_readl(cfg->pull_reg);
|
||||
mask = 1 << cfg->pull_bit;
|
||||
|
||||
if (cfg->pull_val) {
|
||||
if (pull_orig & mask)
|
||||
warn = 1;
|
||||
/* Low bit = pull enabled */
|
||||
pull = pull_orig & ~mask;
|
||||
} else {
|
||||
if (!(pull_orig & mask))
|
||||
warn = 1;
|
||||
/* High bit = pull disabled */
|
||||
pull = pull_orig | mask;
|
||||
}
|
||||
|
||||
omap_writel(pull, cfg->pull_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
}
|
||||
|
||||
if (warn) {
|
||||
#ifdef CONFIG_OMAP_MUX_WARNINGS
|
||||
printk(KERN_WARNING "MUX: initialized %s\n", cfg->name);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX_DEBUG
|
||||
if (cfg->debug || warn) {
|
||||
printk("MUX: Setting register %s\n", cfg->name);
|
||||
printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n",
|
||||
cfg->mux_reg_name, cfg->mux_reg, reg_orig, reg);
|
||||
|
||||
if (!cpu_is_omap15xx()) {
|
||||
if (cfg->pu_pd_reg && cfg->pull_val) {
|
||||
printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n",
|
||||
cfg->pu_pd_name, cfg->pu_pd_reg,
|
||||
pu_pd_orig, pu_pd);
|
||||
}
|
||||
}
|
||||
|
||||
if (cfg->pull_reg)
|
||||
printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n",
|
||||
cfg->pull_name, cfg->pull_reg, pull_orig, pull);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX_ERRORS
|
||||
return warn ? -ETXTBSY : 0;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
return mux_cfg->cfg_reg(reg);
|
||||
}
|
||||
EXPORT_SYMBOL(omap_cfg_reg);
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
#include <asm/system.h>
|
||||
#include <asm/hardware.h>
|
||||
|
||||
#include <asm/arch/control.h>
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/usb.h>
|
||||
#include <asm/arch/board.h>
|
||||
|
|
@ -76,7 +77,7 @@
|
|||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP_OTG
|
||||
#if defined(CONFIG_ARCH_OMAP_OTG) || defined(CONFIG_USB_MUSB_OTG)
|
||||
|
||||
static struct otg_transceiver *xceiv;
|
||||
|
||||
|
|
@ -110,12 +111,48 @@ EXPORT_SYMBOL(otg_set_transceiver);
|
|||
|
||||
#if defined(CONFIG_ARCH_OMAP_OTG) || defined(CONFIG_ARCH_OMAP15XX)
|
||||
|
||||
static void omap2_usb_devconf_clear(u8 port, u32 mask)
|
||||
{
|
||||
u32 r;
|
||||
|
||||
r = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
|
||||
r &= ~USBTXWRMODEI(port, mask);
|
||||
omap_ctrl_writel(r, OMAP2_CONTROL_DEVCONF0);
|
||||
}
|
||||
|
||||
static void omap2_usb_devconf_set(u8 port, u32 mask)
|
||||
{
|
||||
u32 r;
|
||||
|
||||
r = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
|
||||
r |= USBTXWRMODEI(port, mask);
|
||||
omap_ctrl_writel(r, OMAP2_CONTROL_DEVCONF0);
|
||||
}
|
||||
|
||||
static void omap2_usb2_disable_5pinbitll(void)
|
||||
{
|
||||
u32 r;
|
||||
|
||||
r = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
|
||||
r &= ~(USBTXWRMODEI(2, USB_BIDIR_TLL) | USBT2TLL5PI);
|
||||
omap_ctrl_writel(r, OMAP2_CONTROL_DEVCONF0);
|
||||
}
|
||||
|
||||
static void omap2_usb2_enable_5pinunitll(void)
|
||||
{
|
||||
u32 r;
|
||||
|
||||
r = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
|
||||
r |= USBTXWRMODEI(2, USB_UNIDIR_TLL) | USBT2TLL5PI;
|
||||
omap_ctrl_writel(r, OMAP2_CONTROL_DEVCONF0);
|
||||
}
|
||||
|
||||
static u32 __init omap_usb0_init(unsigned nwires, unsigned is_device)
|
||||
{
|
||||
u32 syscon1 = 0;
|
||||
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG &= ~USBT0WRMODEI(USB_BIDIR_TLL);
|
||||
omap2_usb_devconf_clear(0, USB_BIDIR_TLL);
|
||||
|
||||
if (nwires == 0) {
|
||||
if (cpu_class_is_omap1() && !cpu_is_omap15xx()) {
|
||||
|
|
@ -187,19 +224,19 @@ static u32 __init omap_usb0_init(unsigned nwires, unsigned is_device)
|
|||
case 3:
|
||||
syscon1 = 2;
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG |= USBT0WRMODEI(USB_BIDIR);
|
||||
omap2_usb_devconf_set(0, USB_BIDIR);
|
||||
break;
|
||||
case 4:
|
||||
syscon1 = 1;
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG |= USBT0WRMODEI(USB_BIDIR);
|
||||
omap2_usb_devconf_set(0, USB_BIDIR);
|
||||
break;
|
||||
case 6:
|
||||
syscon1 = 3;
|
||||
if (cpu_is_omap24xx()) {
|
||||
omap_cfg_reg(J19_24XX_USB0_VP);
|
||||
omap_cfg_reg(K20_24XX_USB0_VM);
|
||||
CONTROL_DEVCONF_REG |= USBT0WRMODEI(USB_UNIDIR);
|
||||
omap2_usb_devconf_set(0, USB_UNIDIR);
|
||||
} else {
|
||||
omap_cfg_reg(AA9_USB0_VP);
|
||||
omap_cfg_reg(R9_USB0_VM);
|
||||
|
|
@ -220,7 +257,7 @@ static u32 __init omap_usb1_init(unsigned nwires)
|
|||
if (cpu_class_is_omap1() && !cpu_is_omap15xx() && nwires != 6)
|
||||
USB_TRANSCEIVER_CTRL_REG &= ~CONF_USB1_UNI_R;
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG &= ~USBT1WRMODEI(USB_BIDIR_TLL);
|
||||
omap2_usb_devconf_clear(1, USB_BIDIR_TLL);
|
||||
|
||||
if (nwires == 0)
|
||||
return 0;
|
||||
|
|
@ -261,17 +298,17 @@ static u32 __init omap_usb1_init(unsigned nwires)
|
|||
* this TLL link is not using DP/DM
|
||||
*/
|
||||
syscon1 = 1;
|
||||
CONTROL_DEVCONF_REG |= USBT1WRMODEI(USB_BIDIR_TLL);
|
||||
omap2_usb_devconf_set(1, USB_BIDIR_TLL);
|
||||
break;
|
||||
case 3:
|
||||
syscon1 = 2;
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG |= USBT1WRMODEI(USB_BIDIR);
|
||||
omap2_usb_devconf_set(1, USB_BIDIR);
|
||||
break;
|
||||
case 4:
|
||||
syscon1 = 1;
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG |= USBT1WRMODEI(USB_BIDIR);
|
||||
omap2_usb_devconf_set(1, USB_BIDIR);
|
||||
break;
|
||||
case 6:
|
||||
if (cpu_is_omap24xx())
|
||||
|
|
@ -295,8 +332,7 @@ static u32 __init omap_usb2_init(unsigned nwires, unsigned alt_pingroup)
|
|||
u32 syscon1 = 0;
|
||||
|
||||
if (cpu_is_omap24xx()) {
|
||||
CONTROL_DEVCONF_REG &= ~(USBT2WRMODEI(USB_BIDIR_TLL)
|
||||
| USBT2TLL5PI);
|
||||
omap2_usb2_disable_5pinbitll();
|
||||
alt_pingroup = 0;
|
||||
}
|
||||
|
||||
|
|
@ -343,17 +379,17 @@ static u32 __init omap_usb2_init(unsigned nwires, unsigned alt_pingroup)
|
|||
* this TLL link is not using DP/DM
|
||||
*/
|
||||
syscon1 = 1;
|
||||
CONTROL_DEVCONF_REG |= USBT2WRMODEI(USB_BIDIR_TLL);
|
||||
omap2_usb_devconf_set(2, USB_BIDIR_TLL);
|
||||
break;
|
||||
case 3:
|
||||
syscon1 = 2;
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG |= USBT2WRMODEI(USB_BIDIR);
|
||||
omap2_usb_devconf_set(2, USB_BIDIR);
|
||||
break;
|
||||
case 4:
|
||||
syscon1 = 1;
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG |= USBT2WRMODEI(USB_BIDIR);
|
||||
omap2_usb_devconf_set(2, USB_BIDIR);
|
||||
break;
|
||||
case 5:
|
||||
if (!cpu_is_omap24xx())
|
||||
|
|
@ -364,8 +400,7 @@ static u32 __init omap_usb2_init(unsigned nwires, unsigned alt_pingroup)
|
|||
* set up OTG_SYSCON2.HMC_TLL{ATTACH,SPEED}
|
||||
*/
|
||||
syscon1 = 3;
|
||||
CONTROL_DEVCONF_REG |= USBT2WRMODEI(USB_UNIDIR_TLL)
|
||||
| USBT2TLL5PI;
|
||||
omap2_usb2_enable_5pinunitll();
|
||||
break;
|
||||
case 6:
|
||||
if (cpu_is_omap24xx())
|
||||
|
|
|
|||
Loading…
Reference in a new issue