From 5c5dccad31670faa716cbc9d8a6f918487f60a09 Mon Sep 17 00:00:00 2001 From: Kevin Hilman Date: Wed, 16 May 2007 08:52:05 -0700 Subject: ARM: OMAP: Fix 32k timer unsupported one-shot mode Fix unsupported one-shot mode in set_mode hook. Signed-off-by: Kevin Hilman Signed-off-by: Tony Lindgren --- arch/arm/plat-omap/common.c | 2 +- arch/arm/plat-omap/timer32k.c | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) (limited to 'arch') diff --git a/arch/arm/plat-omap/common.c b/arch/arm/plat-omap/common.c index 7987aa6e95..4f0f9c4e93 100644 --- a/arch/arm/plat-omap/common.c +++ b/arch/arm/plat-omap/common.c @@ -172,7 +172,7 @@ 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 0x48004010 +#define TIMER_32K_SYNCHRONIZED (OMAP24XX_32KSYNCT_BASE + 0x10) #endif #ifdef TIMER_32K_SYNCHRONIZED diff --git a/arch/arm/plat-omap/timer32k.c b/arch/arm/plat-omap/timer32k.c index b0af014b0e..ea76f1979a 100644 --- a/arch/arm/plat-omap/timer32k.c +++ b/arch/arm/plat-omap/timer32k.c @@ -71,7 +71,7 @@ struct sys_timer omap_timer; #if defined(CONFIG_ARCH_OMAP16XX) #define TIMER_32K_SYNCHRONIZED 0xfffbc410 #elif defined(CONFIG_ARCH_OMAP24XX) -#define TIMER_32K_SYNCHRONIZED 0x48004010 +#define TIMER_32K_SYNCHRONIZED (OMAP24XX_32KSYNCT_BASE + 0x10) #else #error OMAP 32KHz timer does not currently work on 15XX! #endif @@ -147,14 +147,15 @@ static inline void omap_32k_timer_ack_irq(void) static void omap_32k_timer_set_mode(enum clock_event_mode mode, struct clock_event_device *evt) { + omap_32k_timer_stop(); + switch (mode) { - case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_PERIODIC: omap_32k_timer_start(OMAP_32K_TIMER_TICK_PERIOD); break; + case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_SHUTDOWN: - omap_32k_timer_stop(); break; case CLOCK_EVT_MODE_RESUME: break; @@ -194,8 +195,6 @@ omap_32k_ticks_to_nsecs(unsigned long ticks_32k) return (unsigned long long) ticks_32k * 1000 * 5*5*5*5*5*5 >> 9; } -static unsigned long omap_32k_last_tick = 0; - /* * 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. @@ -225,7 +224,6 @@ static __init void omap_init_32k_timer(void) { if (cpu_class_is_omap1()) setup_irq(INT_OS_TIMER, &omap_32k_timer_irq); - omap_32k_last_tick = omap_32k_sync_timer_read(); #ifdef CONFIG_ARCH_OMAP2 /* REVISIT: Check 24xx TIOCP_CFG settings after idle works */ -- cgit v1.2.2 From 4e63915cbe4525beb9c0281f8e22945d88acc9bc Mon Sep 17 00:00:00 2001 From: David Brownell Date: Mon, 2 Apr 2007 12:45:50 -0700 Subject: ARM: OMAP: fix OMAP1 dmtimer build warning Remove the OMAP1 version of omap_dm_timer_get_fclk(), and its associated compile-time warning. It would only BUG() if called, while it's only called on OMAP2. Signed-off-by: David Brownell Signed-off-by: Tony Lindgren --- arch/arm/plat-omap/dmtimer.c | 5 ----- 1 file changed, 5 deletions(-) (limited to 'arch') diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index 36073dfaa4..3856f5aedf 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c @@ -271,11 +271,6 @@ int omap_dm_timer_get_irq(struct omap_dm_timer *timer) #if defined(CONFIG_ARCH_OMAP1) -struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) -{ - BUG(); -} - /** * omap_dm_timer_modify_idlect_mask - Check if any running timers use ARMXOR * @inputmask: current value of idlect mask -- cgit v1.2.2 From eebdf7d7c478682756fd29d376223f350311f105 Mon Sep 17 00:00:00 2001 From: David Brownell Date: Mon, 2 Apr 2007 12:48:10 -0700 Subject: ARM: OMAP: OSK led fixes Bugfixes for the OSK led support: - Fix Kconfig merge glitches: Mistral handles idle and timer leds just fine - Fix pm_suspend() runtime botch: can't sleep, so can't touch tps65010 leds Improvements: - Switch sense of Mistral idle led, so idle == off Probably the TPS65010 leds should be handled only by the "new led" API. Signed-off-by: David Brownell Signed-off-by: Tony Lindgren --- arch/arm/Kconfig | 7 +++++-- arch/arm/mach-omap1/leds-osk.c | 6 +++--- arch/arm/mach-omap1/pm.c | 11 ----------- 3 files changed, 8 insertions(+), 16 deletions(-) (limited to 'arch') diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index d6145298a3..691aae309c 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -721,7 +721,8 @@ config LEDS config LEDS_TIMER bool "Timer LED" if (!ARCH_CDB89712 && !ARCH_OMAP) || \ - MACH_OMAP_H2 || MACH_OMAP_PERSEUS2 + OMAP_OSK_MISTRAL || MACH_OMAP_H2 \ + || MACH_OMAP_PERSEUS2 depends on LEDS depends on !GENERIC_CLOCKEVENTS default y if ARCH_EBSA110 @@ -738,7 +739,9 @@ config LEDS_TIMER config LEDS_CPU bool "CPU usage LED" if (!ARCH_CDB89712 && !ARCH_EBSA110 && \ - !ARCH_OMAP) || MACH_OMAP_H2 || MACH_OMAP_PERSEUS2 + !ARCH_OMAP) \ + || OMAP_OSK_MISTRAL || MACH_OMAP_H2 \ + || MACH_OMAP_PERSEUS2 depends on LEDS help If you say Y here, the red LED will be used to give a good real diff --git a/arch/arm/mach-omap1/leds-osk.c b/arch/arm/mach-omap1/leds-osk.c index 0cbf1b0071..86de303eca 100644 --- a/arch/arm/mach-omap1/leds-osk.c +++ b/arch/arm/mach-omap1/leds-osk.c @@ -133,13 +133,13 @@ void osk_leds_event(led_event_t evt) mistral_setled(); break; - case led_idle_start: - hw_led_state |= IDLE_LED; + case led_idle_start: /* idle == off */ + hw_led_state &= ~IDLE_LED; mistral_setled(); break; case led_idle_end: - hw_led_state &= ~IDLE_LED; + hw_led_state |= IDLE_LED; mistral_setled(); break; diff --git a/arch/arm/mach-omap1/pm.c b/arch/arm/mach-omap1/pm.c index 5bb348e2e3..2e68be6072 100644 --- a/arch/arm/mach-omap1/pm.c +++ b/arch/arm/mach-omap1/pm.c @@ -57,7 +57,6 @@ #include #include #include -#include #include #include #include @@ -250,11 +249,6 @@ void omap_pm_suspend(void) omap_serial_wake_trigger(1); - if (machine_is_omap_osk()) { - /* Stop LED1 (D9) blink */ - tps65010_set_led(LED1, OFF); - } - if (!cpu_is_omap15xx()) omap_writew(0xffff, ULPD_SOFT_DISABLE_REQ_REG); @@ -447,11 +441,6 @@ void omap_pm_suspend(void) omap_serial_wake_trigger(0); printk("PM: OMAP%x is re-starting from deep sleep...\n", system_rev); - - if (machine_is_omap_osk()) { - /* Let LED1 (D9) blink again */ - tps65010_set_led(LED1, BLINK); - } } #if defined(DEBUG) && defined(CONFIG_PROC_FS) -- cgit v1.2.2 From 666cd174c451c172dd115b9d94f150efe627b609 Mon Sep 17 00:00:00 2001 From: Dirk Behme Date: Thu, 25 Jan 2007 16:26:46 -0800 Subject: ARM: OMAP: H3 workqueue fixes Signed-off-by: Dirk Behme Signed-off-by: Tony Lindgren --- arch/arm/mach-omap1/board-h3.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'arch') diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index 7b260b7c53..79d4ef4c54 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c @@ -294,9 +294,11 @@ static int h3_select_irda(struct device *dev, int state) return err; } -static void set_trans_mode(void *data) +static void set_trans_mode(struct work_struct *work) { - int *mode = data; + struct omap_irda_config *irda_config = + container_of(work, struct omap_irda_config, gpio_expa.work); + int mode = irda_config->mode; unsigned char expa; int err = 0; @@ -306,7 +308,7 @@ static void set_trans_mode(void *data) expa &= ~0x03; - if (*mode & IR_SIRMODE) { + if (mode & IR_SIRMODE) { expa |= 0x01; } else { /* MIR/FIR */ expa |= 0x03; @@ -321,9 +323,9 @@ static int h3_transceiver_mode(struct device *dev, int mode) { struct omap_irda_config *irda_config = dev->platform_data; + irda_config->mode = mode; cancel_delayed_work(&irda_config->gpio_expa); - PREPARE_WORK(&irda_config->gpio_expa, set_trans_mode, &mode); -#error this is not permitted - mode is an argument variable + PREPARE_DELAYED_WORK(&irda_config->gpio_expa, set_trans_mode); schedule_delayed_work(&irda_config->gpio_expa, 0); return 0; -- cgit v1.2.2 From 1abc70fcd81b920dd7a1091ba8863dfe5463b130 Mon Sep 17 00:00:00 2001 From: Juha Yrjola Date: Wed, 6 Dec 2006 17:13:47 -0800 Subject: ARM: OMAP2: Force APLLs always active The APLLs are most efficiently idled by hardware. Signed-off-by: Juha Yrjola Signed-off-by: Tony Lindgren --- arch/arm/mach-omap2/clock.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) (limited to 'arch') diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index 588adb5ab4..d9af4367f8 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c @@ -1160,8 +1160,8 @@ int __init omap2_clk_init(void) clk_enable(&sync_32k_ick); clk_enable(&omapctrl_ick); - /* Force the APLLs active during bootup to avoid disabling and - * enabling them unnecessarily. */ + /* Force the APLLs always active. The clocks are idled + * automatically by hardware. */ clk_enable(&apll96_ck); clk_enable(&apll54_ck); @@ -1174,12 +1174,3 @@ int __init omap2_clk_init(void) return 0; } - -static int __init omap2_disable_aplls(void) -{ - clk_disable(&apll96_ck); - clk_disable(&apll54_ck); - - return 0; -} -late_initcall(omap2_disable_aplls); -- cgit v1.2.2 From 671c7235ccd537f828986ef5a4071bf477541dc0 Mon Sep 17 00:00:00 2001 From: Juha Yrjola Date: Wed, 6 Dec 2006 17:13:49 -0800 Subject: ARM: OMAP: Enable serial idling and wakeup features Enable serial idling and wakeup features Signed-off-by: Juha Yrjola Signed-off-by: Tony Lindgren --- arch/arm/mach-omap2/serial.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'arch') diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index aaa5589e81..e9c367fc9f 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c @@ -84,7 +84,7 @@ static inline void __init omap_serial_reset(struct plat_serial8250_port *p) serial_write_reg(p, UART_OMAP_MDR1, 0x07); serial_write_reg(p, UART_OMAP_SCR, 0x08); serial_write_reg(p, UART_OMAP_MDR1, 0x00); - serial_write_reg(p, UART_OMAP_SYSC, 0x01); + serial_write_reg(p, UART_OMAP_SYSC, (0x02 << 3) | (1 << 2) | (1 << 0)); } void __init omap_serial_init() -- cgit v1.2.2 From a228d6e7ed8e3624b6c1497a550d8d0e2cac889f Mon Sep 17 00:00:00 2001 From: Pavel Pisa Date: Mon, 20 Aug 2007 21:39:41 +0100 Subject: [ARM] 4552/1: i.MX/MX1 GPIO output setup fix The pins for GPIO should be provided as plain number build as (GPIO_PORTx + pin_number). But to setup the output GPIO_GIUS and GPIO_DR have to be specified in mode to route right value to the pin. This is a fix, it should go to 2.6.23 Signed-off-by: Pavel Pisa Acked-by: Sascha Hauer Signed-off-by: Russell King --- arch/arm/mach-imx/generic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'arch') diff --git a/arch/arm/mach-imx/generic.c b/arch/arm/mach-imx/generic.c index a58b678006..c342595dc3 100644 --- a/arch/arm/mach-imx/generic.c +++ b/arch/arm/mach-imx/generic.c @@ -138,7 +138,7 @@ EXPORT_SYMBOL(imx_gpio_direction_input); int imx_gpio_direction_output(unsigned gpio, int value) { imx_gpio_set_value(gpio, value); - imx_gpio_mode(gpio| GPIO_OUT); + imx_gpio_mode(gpio | GPIO_OUT | GPIO_GIUS | GPIO_DR); return 0; } -- cgit v1.2.2 From fd51bcc5dc4073b18308f25846aa3b421fa3c42e Mon Sep 17 00:00:00 2001 From: Samuel Date: Tue, 28 Aug 2007 19:56:34 +0100 Subject: [ARM] 4557/1: Fix PXA irq gpio initialization As pointed out by Jrgen, we are overflowing the number of GPIOs in pxa_init_irq_gpio(). I'm seeing the same problem on my HTC Universal PXA270 based PDA. According to Eric, the function argument is the number of GPIOs, so we should keep the semantics and reduce the number of iteration by 1. Signed-off-by: Samuel Ortiz Acked-by: Jrgen Schindele Signed-off-by: Russell King --- arch/arm/mach-pxa/irq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'arch') diff --git a/arch/arm/mach-pxa/irq.c b/arch/arm/mach-pxa/irq.c index 4b867b0789..ae2ae08032 100644 --- a/arch/arm/mach-pxa/irq.c +++ b/arch/arm/mach-pxa/irq.c @@ -365,7 +365,7 @@ void __init pxa_init_irq_gpio(int gpio_nr) set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); } - for (irq = IRQ_GPIO(2); irq <= IRQ_GPIO(gpio_nr); irq++) { + for (irq = IRQ_GPIO(2); irq < IRQ_GPIO(gpio_nr); irq++) { set_irq_chip(irq, &pxa_muxed_gpio_chip); set_irq_handler(irq, handle_edge_irq); set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); -- cgit v1.2.2 From a98b38b83db3d377ede6b72cebe7ed2dc4127766 Mon Sep 17 00:00:00 2001 From: Pavel Pisa Date: Wed, 29 Aug 2007 23:23:38 +0100 Subject: [ARM] 4561/1: i.MX/MX1 GPIO parenthes omission and input setup fix During GPIO testing on PiMX1 board there has been revealed problem with some pins input functions. The GIUS bit has to be set for inputs to work reliably too. It is surprising that input worked on some inputs with incorrect setup before. DR is not mandatory, but it ensures stable constant level on internal traces. Signed-off-by: Pavel Pisa Acked-by: Sascha Hauer Signed-off-by: Russell King --- arch/arm/mach-imx/generic.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'arch') diff --git a/arch/arm/mach-imx/generic.c b/arch/arm/mach-imx/generic.c index c342595dc3..4cfc9d3af2 100644 --- a/arch/arm/mach-imx/generic.c +++ b/arch/arm/mach-imx/generic.c @@ -101,10 +101,11 @@ EXPORT_SYMBOL(imx_gpio_mode); int imx_gpio_request(unsigned gpio, const char *label) { - if(gpio >= (GPIO_PORT_MAX + 1) * 32) + if(gpio >= (GPIO_PORT_MAX + 1) * 32) { printk(KERN_ERR "imx_gpio: Attempt to request nonexistent GPIO %d for \"%s\"\n", gpio, label ? label : "?"); return -EINVAL; + } if(test_and_set_bit(gpio, imx_gpio_alloc_map)) { printk(KERN_ERR "imx_gpio: GPIO %d already used. Allocation for \"%s\" failed\n", @@ -129,7 +130,7 @@ EXPORT_SYMBOL(imx_gpio_free); int imx_gpio_direction_input(unsigned gpio) { - imx_gpio_mode(gpio| GPIO_IN); + imx_gpio_mode(gpio | GPIO_IN | GPIO_GIUS | GPIO_DR); return 0; } -- cgit v1.2.2