Commit 34686fe6 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'omap-fixes-for-linus' of...

Merge branch 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6

* 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6:
  omap: DMA: clear interrupt status correctly
  OMAP3: Devkit8000: Fix tps65930 pullup/pulldown configuration
  arm: omap3: cm-t3517: minor comment fix
  arm: omap3: cm-t3517: rtc fix
  omap1: Fix sched_clock implementation when both MPU timer and 32K timer are used
  omap1: Fix booting for 15xx and 730 with omap1_defconfig
  omap1: Fix sched_clock for the MPU timer
  OMAP: PRCM: remove duplicated headers
  OMAP4: clockdomain: bypass unimplemented wake-up dependency functions on OMAP4
  OMAP: counter_32k: init clocksource as part of machine timer init
parents 500d85ce 4fb699b4
...@@ -9,6 +9,7 @@ config ARCH_OMAP730 ...@@ -9,6 +9,7 @@ config ARCH_OMAP730
depends on ARCH_OMAP1 depends on ARCH_OMAP1
bool "OMAP730 Based System" bool "OMAP730 Based System"
select CPU_ARM926T select CPU_ARM926T
select OMAP_MPU_TIMER
select ARCH_OMAP_OTG select ARCH_OMAP_OTG
config ARCH_OMAP850 config ARCH_OMAP850
...@@ -22,6 +23,7 @@ config ARCH_OMAP15XX ...@@ -22,6 +23,7 @@ config ARCH_OMAP15XX
default y default y
bool "OMAP15xx Based System" bool "OMAP15xx Based System"
select CPU_ARM925T select CPU_ARM925T
select OMAP_MPU_TIMER
config ARCH_OMAP16XX config ARCH_OMAP16XX
depends on ARCH_OMAP1 depends on ARCH_OMAP1
......
...@@ -3,12 +3,11 @@ ...@@ -3,12 +3,11 @@
# #
# Common support # Common support
obj-y := io.o id.o sram.o irq.o mux.o flash.o serial.o devices.o dma.o obj-y := io.o id.o sram.o time.o irq.o mux.o flash.o serial.o devices.o dma.o
obj-y += clock.o clock_data.o opp_data.o obj-y += clock.o clock_data.o opp_data.o
obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o
obj-$(CONFIG_OMAP_MPU_TIMER) += time.o
obj-$(CONFIG_OMAP_32K_TIMER) += timer32k.o obj-$(CONFIG_OMAP_32K_TIMER) += timer32k.o
# Power Management # Power Management
......
...@@ -44,16 +44,21 @@ ...@@ -44,16 +44,21 @@
#include <linux/clocksource.h> #include <linux/clocksource.h>
#include <linux/clockchips.h> #include <linux/clockchips.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/sched.h>
#include <asm/system.h> #include <asm/system.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <asm/leds.h> #include <asm/leds.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/sched_clock.h>
#include <asm/mach/irq.h> #include <asm/mach/irq.h>
#include <asm/mach/time.h> #include <asm/mach/time.h>
#include <plat/common.h> #include <plat/common.h>
#ifdef CONFIG_OMAP_MPU_TIMER
#define OMAP_MPU_TIMER_BASE OMAP_MPU_TIMER1_BASE #define OMAP_MPU_TIMER_BASE OMAP_MPU_TIMER1_BASE
#define OMAP_MPU_TIMER_OFFSET 0x100 #define OMAP_MPU_TIMER_OFFSET 0x100
...@@ -67,7 +72,7 @@ typedef struct { ...@@ -67,7 +72,7 @@ typedef struct {
((volatile omap_mpu_timer_regs_t*)OMAP1_IO_ADDRESS(OMAP_MPU_TIMER_BASE + \ ((volatile omap_mpu_timer_regs_t*)OMAP1_IO_ADDRESS(OMAP_MPU_TIMER_BASE + \
(n)*OMAP_MPU_TIMER_OFFSET)) (n)*OMAP_MPU_TIMER_OFFSET))
static inline unsigned long omap_mpu_timer_read(int nr) static inline unsigned long notrace omap_mpu_timer_read(int nr)
{ {
volatile omap_mpu_timer_regs_t* timer = omap_mpu_timer_base(nr); volatile omap_mpu_timer_regs_t* timer = omap_mpu_timer_base(nr);
return timer->read_tim; return timer->read_tim;
...@@ -212,6 +217,32 @@ static struct clocksource clocksource_mpu = { ...@@ -212,6 +217,32 @@ static struct clocksource clocksource_mpu = {
.flags = CLOCK_SOURCE_IS_CONTINUOUS, .flags = CLOCK_SOURCE_IS_CONTINUOUS,
}; };
static DEFINE_CLOCK_DATA(cd);
static inline unsigned long long notrace _omap_mpu_sched_clock(void)
{
u32 cyc = mpu_read(&clocksource_mpu);
return cyc_to_sched_clock(&cd, cyc, (u32)~0);
}
#ifndef CONFIG_OMAP_32K_TIMER
unsigned long long notrace sched_clock(void)
{
return _omap_mpu_sched_clock();
}
#else
static unsigned long long notrace omap_mpu_sched_clock(void)
{
return _omap_mpu_sched_clock();
}
#endif
static void notrace mpu_update_sched_clock(void)
{
u32 cyc = mpu_read(&clocksource_mpu);
update_sched_clock(&cd, cyc, (u32)~0);
}
static void __init omap_init_clocksource(unsigned long rate) static void __init omap_init_clocksource(unsigned long rate)
{ {
static char err[] __initdata = KERN_ERR static char err[] __initdata = KERN_ERR
...@@ -219,17 +250,13 @@ static void __init omap_init_clocksource(unsigned long rate) ...@@ -219,17 +250,13 @@ static void __init omap_init_clocksource(unsigned long rate)
setup_irq(INT_TIMER2, &omap_mpu_timer2_irq); setup_irq(INT_TIMER2, &omap_mpu_timer2_irq);
omap_mpu_timer_start(1, ~0, 1); omap_mpu_timer_start(1, ~0, 1);
init_sched_clock(&cd, mpu_update_sched_clock, 32, rate);
if (clocksource_register_hz(&clocksource_mpu, rate)) if (clocksource_register_hz(&clocksource_mpu, rate))
printk(err, clocksource_mpu.name); printk(err, clocksource_mpu.name);
} }
/* static void __init omap_mpu_timer_init(void)
* ---------------------------------------------------------------------------
* Timer initialization
* ---------------------------------------------------------------------------
*/
static void __init omap_timer_init(void)
{ {
struct clk *ck_ref = clk_get(NULL, "ck_ref"); struct clk *ck_ref = clk_get(NULL, "ck_ref");
unsigned long rate; unsigned long rate;
...@@ -246,6 +273,66 @@ static void __init omap_timer_init(void) ...@@ -246,6 +273,66 @@ static void __init omap_timer_init(void)
omap_init_clocksource(rate); omap_init_clocksource(rate);
} }
#else
static inline void omap_mpu_timer_init(void)
{
pr_err("Bogus timer, should not happen\n");
}
#endif /* CONFIG_OMAP_MPU_TIMER */
#if defined(CONFIG_OMAP_MPU_TIMER) && defined(CONFIG_OMAP_32K_TIMER)
static unsigned long long (*preferred_sched_clock)(void);
unsigned long long notrace sched_clock(void)
{
if (!preferred_sched_clock)
return 0;
return preferred_sched_clock();
}
static inline void preferred_sched_clock_init(bool use_32k_sched_clock)
{
if (use_32k_sched_clock)
preferred_sched_clock = omap_32k_sched_clock;
else
preferred_sched_clock = omap_mpu_sched_clock;
}
#else
static inline void preferred_sched_clock_init(bool use_32k_sched_clcok)
{
}
#endif
static inline int omap_32k_timer_usable(void)
{
int res = false;
if (cpu_is_omap730() || cpu_is_omap15xx())
return res;
#ifdef CONFIG_OMAP_32K_TIMER
res = omap_32k_timer_init();
#endif
return res;
}
/*
* ---------------------------------------------------------------------------
* Timer initialization
* ---------------------------------------------------------------------------
*/
static void __init omap_timer_init(void)
{
if (omap_32k_timer_usable()) {
preferred_sched_clock_init(1);
} else {
omap_mpu_timer_init();
preferred_sched_clock_init(0);
}
}
struct sys_timer omap_timer = { struct sys_timer omap_timer = {
.init = omap_timer_init, .init = omap_timer_init,
}; };
...@@ -52,10 +52,9 @@ ...@@ -52,10 +52,9 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/mach/irq.h> #include <asm/mach/irq.h>
#include <asm/mach/time.h> #include <asm/mach/time.h>
#include <plat/common.h>
#include <plat/dmtimer.h> #include <plat/dmtimer.h>
struct sys_timer omap_timer;
/* /*
* --------------------------------------------------------------------------- * ---------------------------------------------------------------------------
* 32KHz OS timer * 32KHz OS timer
...@@ -181,14 +180,14 @@ static __init void omap_init_32k_timer(void) ...@@ -181,14 +180,14 @@ static __init void omap_init_32k_timer(void)
* Timer initialization * Timer initialization
* --------------------------------------------------------------------------- * ---------------------------------------------------------------------------
*/ */
static void __init omap_timer_init(void) bool __init omap_32k_timer_init(void)
{ {
omap_init_clocksource_32k();
#ifdef CONFIG_OMAP_DM_TIMER #ifdef CONFIG_OMAP_DM_TIMER
omap_dm_timer_init(); omap_dm_timer_init();
#endif #endif
omap_init_32k_timer(); omap_init_32k_timer();
}
struct sys_timer omap_timer = { return true;
.init = omap_timer_init, }
};
...@@ -124,8 +124,9 @@ static inline void cm_t3517_init_hecc(void) {} ...@@ -124,8 +124,9 @@ static inline void cm_t3517_init_hecc(void) {}
#if defined(CONFIG_RTC_DRV_V3020) || defined(CONFIG_RTC_DRV_V3020_MODULE) #if defined(CONFIG_RTC_DRV_V3020) || defined(CONFIG_RTC_DRV_V3020_MODULE)
#define RTC_IO_GPIO (153) #define RTC_IO_GPIO (153)
#define RTC_WR_GPIO (154) #define RTC_WR_GPIO (154)
#define RTC_RD_GPIO (160) #define RTC_RD_GPIO (53)
#define RTC_CS_GPIO (163) #define RTC_CS_GPIO (163)
#define RTC_CS_EN_GPIO (160)
struct v3020_platform_data cm_t3517_v3020_pdata = { struct v3020_platform_data cm_t3517_v3020_pdata = {
.use_gpio = 1, .use_gpio = 1,
...@@ -145,6 +146,16 @@ static struct platform_device cm_t3517_rtc_device = { ...@@ -145,6 +146,16 @@ static struct platform_device cm_t3517_rtc_device = {
static void __init cm_t3517_init_rtc(void) static void __init cm_t3517_init_rtc(void)
{ {
int err;
err = gpio_request(RTC_CS_EN_GPIO, "rtc cs en");
if (err) {
pr_err("CM-T3517: rtc cs en gpio request failed: %d\n", err);
return;
}
gpio_direction_output(RTC_CS_EN_GPIO, 1);
platform_device_register(&cm_t3517_rtc_device); platform_device_register(&cm_t3517_rtc_device);
} }
#else #else
...@@ -214,12 +225,12 @@ static struct mtd_partition cm_t3517_nand_partitions[] = { ...@@ -214,12 +225,12 @@ static struct mtd_partition cm_t3517_nand_partitions[] = {
}, },
{ {
.name = "linux", .name = "linux",
.offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */ .offset = MTDPART_OFS_APPEND, /* Offset = 0x2A0000 */
.size = 32 * NAND_BLOCK_SIZE, .size = 32 * NAND_BLOCK_SIZE,
}, },
{ {
.name = "rootfs", .name = "rootfs",
.offset = MTDPART_OFS_APPEND, /* Offset = 0x680000 */ .offset = MTDPART_OFS_APPEND, /* Offset = 0x6A0000 */
.size = MTDPART_SIZ_FULL, .size = MTDPART_SIZ_FULL,
}, },
}; };
...@@ -256,11 +267,19 @@ static void __init cm_t3517_init_irq(void) ...@@ -256,11 +267,19 @@ static void __init cm_t3517_init_irq(void)
static struct omap_board_mux board_mux[] __initdata = { static struct omap_board_mux board_mux[] __initdata = {
/* GPIO186 - Green LED */ /* GPIO186 - Green LED */
OMAP3_MUX(SYS_CLKOUT2, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), OMAP3_MUX(SYS_CLKOUT2, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
/* RTC GPIOs: IO, WR#, RD#, CS# */
/* RTC GPIOs: */
/* IO - GPIO153 */
OMAP3_MUX(MCBSP4_DR, OMAP_MUX_MODE4 | OMAP_PIN_INPUT), OMAP3_MUX(MCBSP4_DR, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
/* WR# - GPIO154 */
OMAP3_MUX(MCBSP4_DX, OMAP_MUX_MODE4 | OMAP_PIN_INPUT), OMAP3_MUX(MCBSP4_DX, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
OMAP3_MUX(MCBSP_CLKS, OMAP_MUX_MODE4 | OMAP_PIN_INPUT), /* RD# - GPIO53 */
OMAP3_MUX(GPMC_NCS2, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
/* CS# - GPIO163 */
OMAP3_MUX(UART3_CTS_RCTX, OMAP_MUX_MODE4 | OMAP_PIN_INPUT), OMAP3_MUX(UART3_CTS_RCTX, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
/* CS EN - GPIO160 */
OMAP3_MUX(MCBSP_CLKS, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
/* HSUSB1 RESET */ /* HSUSB1 RESET */
OMAP3_MUX(UART2_TX, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), OMAP3_MUX(UART2_TX, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
/* HSUSB2 RESET */ /* HSUSB2 RESET */
......
...@@ -275,8 +275,7 @@ static struct twl4030_gpio_platform_data devkit8000_gpio_data = { ...@@ -275,8 +275,7 @@ static struct twl4030_gpio_platform_data devkit8000_gpio_data = {
.irq_base = TWL4030_GPIO_IRQ_BASE, .irq_base = TWL4030_GPIO_IRQ_BASE,
.irq_end = TWL4030_GPIO_IRQ_END, .irq_end = TWL4030_GPIO_IRQ_END,
.use_leds = true, .use_leds = true,
.pullups = BIT(1), .pulldowns = BIT(1) | BIT(2) | BIT(6) | BIT(8) | BIT(13)
.pulldowns = BIT(2) | BIT(6) | BIT(7) | BIT(8) | BIT(13)
| BIT(15) | BIT(16) | BIT(17), | BIT(15) | BIT(16) | BIT(17),
.setup = devkit8000_twl_gpio_setup, .setup = devkit8000_twl_gpio_setup,
}; };
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#include "cm2_44xx.h" #include "cm2_44xx.h"
#include "cm-regbits-44xx.h" #include "cm-regbits-44xx.h"
#include "prm44xx.h" #include "prm44xx.h"
#include "prm44xx.h"
#include "prm-regbits-44xx.h" #include "prm-regbits-44xx.h"
#include "control.h" #include "control.h"
#include "scrm44xx.h" #include "scrm44xx.h"
......
...@@ -423,6 +423,12 @@ int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) ...@@ -423,6 +423,12 @@ int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2)
{ {
struct clkdm_dep *cd; struct clkdm_dep *cd;
if (!cpu_is_omap24xx() && !cpu_is_omap34xx()) {
pr_err("clockdomain: %s/%s: %s: not yet implemented\n",
clkdm1->name, clkdm2->name, __func__);
return -EINVAL;
}
if (!clkdm1 || !clkdm2) if (!clkdm1 || !clkdm2)
return -EINVAL; return -EINVAL;
...@@ -458,6 +464,12 @@ int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) ...@@ -458,6 +464,12 @@ int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2)
{ {
struct clkdm_dep *cd; struct clkdm_dep *cd;
if (!cpu_is_omap24xx() && !cpu_is_omap34xx()) {
pr_err("clockdomain: %s/%s: %s: not yet implemented\n",
clkdm1->name, clkdm2->name, __func__);
return -EINVAL;
}
if (!clkdm1 || !clkdm2) if (!clkdm1 || !clkdm2)
return -EINVAL; return -EINVAL;
...@@ -500,6 +512,12 @@ int clkdm_read_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) ...@@ -500,6 +512,12 @@ int clkdm_read_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2)
if (!clkdm1 || !clkdm2) if (!clkdm1 || !clkdm2)
return -EINVAL; return -EINVAL;
if (!cpu_is_omap24xx() && !cpu_is_omap34xx()) {
pr_err("clockdomain: %s/%s: %s: not yet implemented\n",
clkdm1->name, clkdm2->name, __func__);
return -EINVAL;
}
cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs);
if (IS_ERR(cd)) { if (IS_ERR(cd)) {
pr_debug("clockdomain: hardware cannot set/clear wake up of " pr_debug("clockdomain: hardware cannot set/clear wake up of "
...@@ -527,6 +545,12 @@ int clkdm_clear_all_wkdeps(struct clockdomain *clkdm) ...@@ -527,6 +545,12 @@ int clkdm_clear_all_wkdeps(struct clockdomain *clkdm)
struct clkdm_dep *cd; struct clkdm_dep *cd;
u32 mask = 0; u32 mask = 0;
if (!cpu_is_omap24xx() && !cpu_is_omap34xx()) {
pr_err("clockdomain: %s: %s: not yet implemented\n",
clkdm->name, __func__);
return -EINVAL;
}
if (!clkdm) if (!clkdm)
return -EINVAL; return -EINVAL;
...@@ -830,8 +854,7 @@ void omap2_clkdm_allow_idle(struct clockdomain *clkdm) ...@@ -830,8 +854,7 @@ void omap2_clkdm_allow_idle(struct clockdomain *clkdm)
* dependency code and data for OMAP4. * dependency code and data for OMAP4.
*/ */
if (cpu_is_omap44xx()) { if (cpu_is_omap44xx()) {
WARN_ONCE(1, "clockdomain: OMAP4 wakeup/sleep dependency " pr_err("clockdomain: %s: OMAP4 wakeup/sleep dependency support: not yet implemented\n", clkdm->name);
"support is not yet implemented\n");
} else { } else {
if (atomic_read(&clkdm->usecount) > 0) if (atomic_read(&clkdm->usecount) > 0)
_clkdm_add_autodeps(clkdm); _clkdm_add_autodeps(clkdm);
...@@ -872,8 +895,7 @@ void omap2_clkdm_deny_idle(struct clockdomain *clkdm) ...@@ -872,8 +895,7 @@ void omap2_clkdm_deny_idle(struct clockdomain *clkdm)
* dependency code and data for OMAP4. * dependency code and data for OMAP4.
*/ */
if (cpu_is_omap44xx()) { if (cpu_is_omap44xx()) {
WARN_ONCE(1, "clockdomain: OMAP4 wakeup/sleep dependency " pr_err("clockdomain: %s: OMAP4 wakeup/sleep dependency support: not yet implemented\n", clkdm->name);
"support is not yet implemented\n");
} else { } else {
if (atomic_read(&clkdm->usecount) > 0) if (atomic_read(&clkdm->usecount) > 0)
_clkdm_del_autodeps(clkdm); _clkdm_del_autodeps(clkdm);
......
...@@ -30,8 +30,6 @@ ...@@ -30,8 +30,6 @@
#include "cm1_44xx.h" #include "cm1_44xx.h"
#include "cm2_44xx.h" #include "cm2_44xx.h"
#include "cm1_44xx.h"
#include "cm2_44xx.h"
#include "cm-regbits-44xx.h" #include "cm-regbits-44xx.h"
#include "prm44xx.h" #include "prm44xx.h"
#include "prcm44xx.h" #include "prcm44xx.h"
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include <plat/prcm.h> #include <plat/prcm.h>
#include "powerdomain.h" #include "powerdomain.h"
#include "prm-regbits-34xx.h"
#include "prm.h" #include "prm.h"
#include "prm-regbits-24xx.h" #include "prm-regbits-24xx.h"
#include "prm-regbits-34xx.h" #include "prm-regbits-34xx.h"
......
...@@ -42,6 +42,8 @@ ...@@ -42,6 +42,8 @@
#include "timer-gp.h" #include "timer-gp.h"
#include <plat/common.h>
/* MAX_GPTIMER_ID: number of GPTIMERs on the chip */ /* MAX_GPTIMER_ID: number of GPTIMERs on the chip */
#define MAX_GPTIMER_ID 12 #define MAX_GPTIMER_ID 12
...@@ -176,10 +178,14 @@ static void __init omap2_gp_clockevent_init(void) ...@@ -176,10 +178,14 @@ static void __init omap2_gp_clockevent_init(void)
/* /*
* When 32k-timer is enabled, don't use GPTimer for clocksource * When 32k-timer is enabled, don't use GPTimer for clocksource
* instead, just leave default clocksource which uses the 32k * instead, just leave default clocksource which uses the 32k
* sync counter. See clocksource setup in see plat-omap/common.c. * sync counter. See clocksource setup in plat-omap/counter_32k.c
*/ */
static inline void __init omap2_gp_clocksource_init(void) {} static void __init omap2_gp_clocksource_init(void)
{
omap_init_clocksource_32k();
}
#else #else
/* /*
* clocksource * clocksource
......
...@@ -144,12 +144,9 @@ config OMAP_IOMMU_DEBUG ...@@ -144,12 +144,9 @@ config OMAP_IOMMU_DEBUG
config OMAP_IOMMU_IVA2 config OMAP_IOMMU_IVA2
bool bool
choice
prompt "System timer"
default OMAP_32K_TIMER if !ARCH_OMAP15XX
config OMAP_MPU_TIMER config OMAP_MPU_TIMER
bool "Use mpu timer" bool "Use mpu timer"
depends on ARCH_OMAP1
help help
Select this option if you want to use the OMAP mpu timer. This Select this option if you want to use the OMAP mpu timer. This
timer provides more intra-tick resolution than the 32KHz timer, timer provides more intra-tick resolution than the 32KHz timer,
...@@ -158,6 +155,7 @@ config OMAP_MPU_TIMER ...@@ -158,6 +155,7 @@ config OMAP_MPU_TIMER
config OMAP_32K_TIMER config OMAP_32K_TIMER
bool "Use 32KHz timer" bool "Use 32KHz timer"
depends on ARCH_OMAP16XX || ARCH_OMAP2PLUS depends on ARCH_OMAP16XX || ARCH_OMAP2PLUS
default y if (ARCH_OMAP16XX || ARCH_OMAP2PLUS)
help help
Select this option if you want to enable the OMAP 32KHz timer. Select this option if you want to enable the OMAP 32KHz timer.
This timer saves power compared to the OMAP_MPU_TIMER, and has This timer saves power compared to the OMAP_MPU_TIMER, and has
...@@ -165,8 +163,6 @@ config OMAP_32K_TIMER ...@@ -165,8 +163,6 @@ config OMAP_32K_TIMER
intra-tick resolution than OMAP_MPU_TIMER. The 32KHz timer is intra-tick resolution than OMAP_MPU_TIMER. The 32KHz timer is
currently only available for OMAP16XX, 24XX, 34XX and OMAP4. currently only available for OMAP16XX, 24XX, 34XX and OMAP4.
endchoice
config OMAP3_L2_AUX_SECURE_SAVE_RESTORE config OMAP3_L2_AUX_SECURE_SAVE_RESTORE
bool "OMAP3 HS/EMU save and restore for L2 AUX control register" bool "OMAP3 HS/EMU save and restore for L2 AUX control register"
depends on ARCH_OMAP3 && PM depends on ARCH_OMAP3 && PM
......
...@@ -36,8 +36,6 @@ ...@@ -36,8 +36,6 @@
#define OMAP16XX_TIMER_32K_SYNCHRONIZED 0xfffbc410 #define OMAP16XX_TIMER_32K_SYNCHRONIZED 0xfffbc410
#if !(defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP15XX))
#include <linux/clocksource.h> #include <linux/clocksource.h>
/* /*
...@@ -122,12 +120,24 @@ static DEFINE_CLOCK_DATA(cd); ...@@ -122,12 +120,24 @@ static DEFINE_CLOCK_DATA(cd);
#define SC_MULT 4000000000u #define SC_MULT 4000000000u
#define SC_SHIFT 17 #define SC_SHIFT 17
unsigned long long notrace sched_clock(void) static inline unsigned long long notrace _omap_32k_sched_clock(void)
{ {
u32 cyc = clocksource_32k.read(&clocksource_32k); u32 cyc = clocksource_32k.read(&clocksource_32k);
return cyc_to_fixed_sched_clock(&cd, cyc, (u32)~0, SC_MULT, SC_SHIFT); return cyc_to_fixed_sched_clock(&cd, cyc, (u32)~0, SC_MULT, SC_SHIFT);
} }
#ifndef CONFIG_OMAP_MPU_TIMER
unsigned long long notrace sched_clock(void)
{
return _omap_32k_sched_clock();
}
#else
unsigned long long notrace omap_32k_sched_clock(void)
{
return _omap_32k_sched_clock();
}
#endif
static void notrace omap_update_sched_clock(void) static void notrace omap_update_sched_clock(void)
{ {
u32 cyc = clocksource_32k.read(&clocksource_32k); u32 cyc = clocksource_32k.read(&clocksource_32k);
...@@ -160,7 +170,7 @@ void read_persistent_clock(struct timespec *ts) ...@@ -160,7 +170,7 @@ void read_persistent_clock(struct timespec *ts)
*ts = *tsp; *ts = *tsp;
} }
static int __init omap_init_clocksource_32k(void) int __init omap_init_clocksource_32k(void)
{ {
static char err[] __initdata = KERN_ERR static char err[] __initdata = KERN_ERR
"%s: can't register clocksource!\n"; "%s: can't register clocksource!\n";
...@@ -195,7 +205,3 @@ static int __init omap_init_clocksource_32k(void) ...@@ -195,7 +205,3 @@ static int __init omap_init_clocksource_32k(void)
} }
return 0; return 0;
} }
arch_initcall(omap_init_clocksource_32k);
#endif /* !(defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP15XX)) */
...@@ -53,7 +53,7 @@ enum { DMA_CHAIN_STARTED, DMA_CHAIN_NOTSTARTED }; ...@@ -53,7 +53,7 @@ enum { DMA_CHAIN_STARTED, DMA_CHAIN_NOTSTARTED };
#endif #endif
#define OMAP_DMA_ACTIVE 0x01 #define OMAP_DMA_ACTIVE 0x01
#define OMAP2_DMA_CSR_CLEAR_MASK 0xffe #define OMAP2_DMA_CSR_CLEAR_MASK 0xffffffff
#define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec) #define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec)
...@@ -1873,7 +1873,7 @@ static int omap2_dma_handle_ch(int ch) ...@@ -1873,7 +1873,7 @@ static int omap2_dma_handle_ch(int ch)
printk(KERN_INFO "DMA misaligned error with device %d\n", printk(KERN_INFO "DMA misaligned error with device %d\n",
dma_chan[ch].dev_id); dma_chan[ch].dev_id);
p->dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR, ch); p->dma_write(status, CSR, ch);
p->dma_write(1 << ch, IRQSTATUS_L0, ch); p->dma_write(1 << ch, IRQSTATUS_L0, ch);
/* read back the register to flush the write */ /* read back the register to flush the write */
p->dma_read(IRQSTATUS_L0, ch); p->dma_read(IRQSTATUS_L0, ch);
...@@ -1893,9 +1893,8 @@ static int omap2_dma_handle_ch(int ch) ...@@ -1893,9 +1893,8 @@ static int omap2_dma_handle_ch(int ch)
OMAP_DMA_CHAIN_INCQHEAD(chain_id); OMAP_DMA_CHAIN_INCQHEAD(chain_id);
status = p->dma_read(CSR, ch); status = p->dma_read(CSR, ch);
}
p->dma_write(status, CSR, ch); p->dma_write(status, CSR, ch);
}
if (likely(dma_chan[ch].callback != NULL)) if (likely(dma_chan[ch].callback != NULL))
dma_chan[ch].callback(ch, status, dma_chan[ch].data); dma_chan[ch].callback(ch, status, dma_chan[ch].data);
......
...@@ -35,6 +35,9 @@ struct sys_timer; ...@@ -35,6 +35,9 @@ struct sys_timer;
extern void omap_map_common_io(void); extern void omap_map_common_io(void);
extern struct sys_timer omap_timer; extern struct sys_timer omap_timer;
extern bool omap_32k_timer_init(void);
extern int __init omap_init_clocksource_32k(void);
extern unsigned long long notrace omap_32k_sched_clock(void);
extern void omap_reserve(void); extern void omap_reserve(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment