Module: xenomai-2.4 Branch: master Commit: e9485ec918efaa8e1f2eee7d7f35e25d6b029dc1 URL: http://git.xenomai.org/?p=xenomai-2.4.git;a=commit;h=e9485ec918efaa8e1f2eee7d7f35e25d6b029dc1
Author: Philippe Gerum <r...@xenomai.org> Date: Sun Jul 19 22:04:58 2009 +0200 arm: upgrade I-pipe support to 2.6.28-arm-1.12-03 --- ....patch => adeos-ipipe-2.6.28-arm-1.12-03.patch} | 415 +++++++++++++++++++- 1 files changed, 400 insertions(+), 15 deletions(-) diff --git a/ksrc/arch/arm/patches/adeos-ipipe-2.6.28-arm-1.12-02.patch b/ksrc/arch/arm/patches/adeos-ipipe-2.6.28-arm-1.12-03.patch similarity index 97% rename from ksrc/arch/arm/patches/adeos-ipipe-2.6.28-arm-1.12-02.patch rename to ksrc/arch/arm/patches/adeos-ipipe-2.6.28-arm-1.12-03.patch index 1f8dc1b..4642cc7 100644 --- a/ksrc/arch/arm/patches/adeos-ipipe-2.6.28-arm-1.12-02.patch +++ b/ksrc/arch/arm/patches/adeos-ipipe-2.6.28-arm-1.12-03.patch @@ -445,7 +445,7 @@ index 0000000..2a0c0e3 +#endif /* __ASM_ARM_FCSE_H */ diff --git a/arch/arm/include/asm/ipipe.h b/arch/arm/include/asm/ipipe.h new file mode 100644 -index 0000000..e8e76e1 +index 0000000..060c97c --- /dev/null +++ b/arch/arm/include/asm/ipipe.h @@ -0,0 +1,226 @@ @@ -479,10 +479,10 @@ index 0000000..e8e76e1 + +#include <linux/ipipe_percpu.h> + -+#define IPIPE_ARCH_STRING "1.12-02" ++#define IPIPE_ARCH_STRING "1.12-03" +#define IPIPE_MAJOR_NUMBER 1 +#define IPIPE_MINOR_NUMBER 12 -+#define IPIPE_PATCH_NUMBER 2 ++#define IPIPE_PATCH_NUMBER 3 + +#ifdef CONFIG_SMP +#error "I-pipe/arm: SMP not yet implemented" @@ -2738,10 +2738,10 @@ index 5aafb2e..db52503 100644 config MTD_AT91_DATAFLASH_CARD diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile -index cca612d..644ef85 100644 +index cca612d..6d8be0e 100644 --- a/arch/arm/mach-at91/Makefile +++ b/arch/arm/mach-at91/Makefile -@@ -70,3 +70,13 @@ obj-$(CONFIG_AT91_SLOW_CLOCK) += pm_slowclock.o +@@ -70,3 +70,14 @@ obj-$(CONFIG_AT91_SLOW_CLOCK) += pm_slowclock.o ifeq ($(CONFIG_PM_DEBUG),y) CFLAGS_pm.o += -DDEBUG endif @@ -2750,6 +2750,7 @@ index cca612d..644ef85 100644 +obj-y := $(filter-out at91rm9200_time.o at91sam926x_time.o at91x40_time.o, $(obj-y)) +obj-$(CONFIG_ARCH_AT91RM9200) += at91_ipipe_time.o +obj-$(CONFIG_ARCH_AT91SAM9260) += at91_ipipe_time.o ++obj-$(CONFIG_ARCH_AT91SAM9G20) += at91_ipipe_time.o +obj-$(CONFIG_ARCH_AT91SAM9261) += at91_ipipe_time.o +obj-$(CONFIG_ARCH_AT91SAM9263) += at91_ipipe_time.o +obj-$(CONFIG_ARCH_AT91SAM9RL) += at91_ipipe_time.o @@ -2757,14 +2758,14 @@ index cca612d..644ef85 100644 +endif diff --git a/arch/arm/mach-at91/at91_ipipe_time.c b/arch/arm/mach-at91/at91_ipipe_time.c new file mode 100644 -index 0000000..43a6d49 +index 0000000..61f51a0 --- /dev/null +++ b/arch/arm/mach-at91/at91_ipipe_time.c -@@ -0,0 +1,412 @@ +@@ -0,0 +1,414 @@ +/* + * linux/arch/arm/mach-at91/at91_ipipe_time.c + * -+ * Copyright (C) 2007 Gilles Chanteperdrix <gilles.chanteperd...@laposte.net> ++ * Copyright (C) 2007 Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org> + * + * Adaptation to AT91SAM926x: + * Copyright (C) 2007 Gregory CLEMENT, Adeneo @@ -2797,7 +2798,7 @@ index 0000000..43a6d49 +#define AT91_ID_TC0 AT91RM9200_ID_TC0 +#define AT91_ID_TC1 AT91RM9200_ID_TC1 +#define AT91_ID_TC2 AT91RM9200_ID_TC2 -+#elif defined(CONFIG_ARCH_AT91SAM9260) ++#elif defined(CONFIG_ARCH_AT91SAM9260) || defined(CONFIG_ARCH_AT91SAM9G20) +#define AT91_ID_TC0 AT91SAM9260_ID_TC0 +#define AT91_ID_TC1 AT91SAM9260_ID_TC1 +#define AT91_ID_TC2 AT91SAM9260_ID_TC2 @@ -3102,7 +3103,8 @@ index 0000000..43a6d49 + at91_sys_write(AT91_ST_IDR, AT91_ST_PITS | AT91_ST_WDOVF | AT91_ST_RTTINC | AT91_ST_ALMS); + (void) at91_sys_read(AT91_ST_SR); /* Clear any pending interrupts */ +#elif defined(CONFIG_ARCH_AT91SAM9260) || defined(CONFIG_ARCH_AT91SAM9261) \ -+ || defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91SAM9RL) ++ || defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91SAM9RL) \ ++ || defined(CONFIG_ARCH_AT91SAM9RL) || defined(CONFIG_ARCH_AT91SAM9G20) + at91_sys_write(AT91_PIT_MR, 0); + + /* Clear any pending interrupts */ @@ -3162,7 +3164,8 @@ index 0000000..43a6d49 +#ifdef CONFIG_ARCH_AT91RM9200 +struct sys_timer at91rm9200_timer = { +#elif defined(CONFIG_ARCH_AT91SAM9260) || defined(CONFIG_ARCH_AT91SAM9261) \ -+ || defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91SAM9RL) ++ || defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91SAM9RL) \ ++ || defined(CONFIG_ARCH_AT91SAM9RL) || defined(CONFIG_ARCH_AT91SAM9G20) +struct sys_timer at91sam926x_timer = { +#elif defined(CONFIG_ARCH_AT91X40) +struct sys_timer at91x40_timer = { @@ -3619,7 +3622,7 @@ index 9b0447c..6e7c3c8 100644 /* diff --git a/arch/arm/mach-at91/include/mach/hardware.h b/arch/arm/mach-at91/include/mach/hardware.h -index da0b681..9f34c0a 100644 +index da0b681..f737d38 100644 --- a/arch/arm/mach-at91/include/mach/hardware.h +++ b/arch/arm/mach-at91/include/mach/hardware.h @@ -61,6 +61,25 @@ @@ -3629,7 +3632,7 @@ index da0b681..9f34c0a 100644 +#ifdef CONFIG_IPIPE +#if defined(CONFIG_ARCH_AT91RM9200) +#define AT91_BASE_TCB0 AT91RM9200_BASE_TCB0 -+#elif defined(CONFIG_ARCH_AT91SAM9260) ++#elif defined(CONFIG_ARCH_AT91SAM9260) || defined(CONFIG_ARCH_AT91SAM9G20) +#define AT91_BASE_TCB0 AT91SAM9260_BASE_TCB0 +#elif defined(CONFIG_ARCH_AT91SAM9261) +#define AT91_BASE_TCB0 AT91SAM9261_BASE_TCB0 @@ -3649,7 +3652,7 @@ index da0b681..9f34c0a 100644 #define AT91_SRAM_MAX SZ_1M #define AT91_VIRT_BASE (AT91_IO_VIRT_BASE - AT91_SRAM_MAX) diff --git a/arch/arm/mach-at91/include/mach/irqs.h b/arch/arm/mach-at91/include/mach/irqs.h -index 36bd55f..88d8a31 100644 +index 36bd55f..f187d91 100644 --- a/arch/arm/mach-at91/include/mach/irqs.h +++ b/arch/arm/mach-at91/include/mach/irqs.h @@ -45,4 +45,35 @@ @@ -3663,7 +3666,7 @@ index 36bd55f..88d8a31 100644 +#define __ipipe_mach_irq_mux_p(irq) \ + ((unsigned) (irq - AT91RM9200_ID_PIOA) < __ipipe_at91_gpio_banks) + -+#elif defined(CONFIG_ARCH_AT91SAM9260) ++#elif defined(CONFIG_ARCH_AT91SAM9260) || defined(CONFIG_ARCH_AT91SAM9G20) +#define __ipipe_mach_irq_mux_p(irq) \ + ((unsigned) (irq - AT91SAM9260_ID_PIOA) < __ipipe_at91_gpio_banks) + @@ -4805,6 +4808,218 @@ index f902a7c..316a8d7 100644 /* * The following uses standard kernel macros defined in arch.h in order to * initialize __mach_desc_MX31ADS data structure. +diff --git a/arch/arm/mach-omap2/timer-gp.c b/arch/arm/mach-omap2/timer-gp.c +index 589393b..7d34665 100644 +--- a/arch/arm/mach-omap2/timer-gp.c ++++ b/arch/arm/mach-omap2/timer-gp.c +@@ -38,13 +38,74 @@ + + static struct omap_dm_timer *gptimer; + static struct clock_event_device clockevent_gpt; ++#ifndef CONFIG_OMAP_32K_TIMER ++static struct omap_dm_timer *gpt_clocksource; ++#endif /* !CONFIG_OMAP_32K_TIMER */ ++ ++#ifdef CONFIG_IPIPE ++#ifdef CONFIG_NO_IDLE_HZ ++#error "dynamic tick timer not yet supported with IPIPE" ++#endif /* CONFIG_NO_IDLE_HZ */ ++int __ipipe_mach_timerint; ++EXPORT_SYMBOL(__ipipe_mach_timerint); ++ ++int __ipipe_mach_timerstolen; ++EXPORT_SYMBOL(__ipipe_mach_timerstolen); ++ ++unsigned int __ipipe_mach_ticks_per_jiffy; ++EXPORT_SYMBOL(__ipipe_mach_ticks_per_jiffy); ++ ++static int omap2_timer_initialized; ++ ++union tsc_reg { ++#ifdef __BIG_ENDIAN ++ struct { ++ unsigned long high; ++ unsigned long low; ++ }; ++#else /* __LITTLE_ENDIAN */ ++ struct { ++ unsigned long low; ++ unsigned long high; ++ }; ++#endif /* __LITTLE_ENDIAN */ ++ unsigned long long full; ++}; ++ ++#ifdef CONFIG_SMP ++static union tsc_reg tsc[NR_CPUS]; ++ ++void __ipipe_mach_get_tscinfo(struct __ipipe_tscinfo *info) ++{ ++ info->type = IPIPE_TSC_TYPE_NONE; ++} ++ ++#else /* !CONFIG_SMP */ ++static union tsc_reg *tsc; ++ ++void __ipipe_mach_get_tscinfo(struct __ipipe_tscinfo *info) ++{ ++ info->type = IPIPE_TSC_TYPE_FREERUNNING; ++ info->u.fr.counter = (unsigned *) ++ omap_dm_timer_get_phys_counter_addr(gpt_clocksource); ++ info->u.fr.mask = 0xffffffff; ++ info->u.fr.tsc = &tsc->full; ++} ++#endif /* !CONFIG_SMP */ ++ ++static void ipipe_mach_update_tsc(void); + ++#endif /* CONFIG_IPIPE */ + static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id) + { +- struct omap_dm_timer *gpt = (struct omap_dm_timer *)dev_id; + struct clock_event_device *evt = &clockevent_gpt; ++#ifndef CONFIG_IPIPE ++ struct omap_dm_timer *gpt = (struct omap_dm_timer *)dev_id; + + omap_dm_timer_write_status(gpt, OMAP_TIMER_INT_OVERFLOW); ++#else /* CONFIG_IPIPE */ ++ ipipe_mach_update_tsc(); ++#endif /* CONFIG_IPIPE */ + + evt->event_handler(evt); + return IRQ_HANDLED; +@@ -95,6 +156,13 @@ static struct clock_event_device clockevent_gpt = { + .set_mode = omap2_gp_timer_set_mode, + }; + ++#ifdef CONFIG_IPIPE ++int __ipipe_check_tickdev(const char *devname) ++{ ++ return !strcmp(devname, clockevent_gpt.name); ++} ++#endif /* CONFIG_IPIPE */ ++ + static void __init omap2_gp_clockevent_init(void) + { + u32 tick_rate; +@@ -110,6 +178,12 @@ static void __init omap2_gp_clockevent_init(void) + tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer)); + + omap2_gp_timer_irq.dev_id = (void *)gptimer; ++ ++#ifdef CONFIG_IPIPE ++ __ipipe_mach_timerint = omap_dm_timer_get_irq(gptimer); ++ __ipipe_mach_ticks_per_jiffy = (tick_rate + HZ / 2) / HZ; ++#endif /* CONFIG_IPIPE */ ++ + setup_irq(omap_dm_timer_get_irq(gptimer), &omap2_gp_timer_irq); + omap_dm_timer_set_int_enable(gptimer, OMAP_TIMER_INT_OVERFLOW); + +@@ -136,7 +210,6 @@ static inline void __init omap2_gp_clocksource_init(void) {} + /* + * 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); +@@ -174,6 +247,16 @@ static void __init omap2_gp_clocksource_init(void) + + clocksource_gpt.mult = + clocksource_khz2mult(tick_rate/1000, clocksource_gpt.shift); ++ ++#ifdef CONFIG_IPIPE ++#ifndef CONFIG_SMP ++ tsc = (union tsc_reg *) __ipipe_tsc_area; ++ barrier(); ++#endif /* CONFIG_SMP */ ++ ++ omap2_timer_initialized = 1; ++#endif /* CONFIG_IPIPE */ ++ + if (clocksource_register(&clocksource_gpt)) + printk(err2, clocksource_gpt.name); + } +@@ -190,3 +273,79 @@ static void __init omap2_gp_timer_init(void) + struct sys_timer omap_timer = { + .init = omap2_gp_timer_init, + }; ++ ++#ifdef CONFIG_IPIPE ++void __ipipe_mach_acktimer(void) ++{ ++ omap_dm_timer_write_status(gptimer, OMAP_TIMER_INT_OVERFLOW); ++ omap_dm_timer_read_status(gptimer); ++} ++ ++static void ipipe_mach_update_tsc(void) ++{ ++ union tsc_reg *local_tsc; ++ unsigned long stamp, flags; ++ ++ if (likely(omap2_timer_initialized)) { ++ local_irq_save_hw(flags); ++ local_tsc = &tsc[ipipe_processor_id()]; ++ stamp = omap_dm_timer_read_counter(gpt_clocksource); ++ if (unlikely(stamp < local_tsc->low)) ++ /* 32 bit counter wrapped, increment high word. */ ++ local_tsc->high++; ++ local_tsc->low = stamp; ++ local_irq_restore_hw(flags); ++ } ++} ++ ++notrace unsigned long long __ipipe_mach_get_tsc(void) ++{ ++ if (likely(omap2_timer_initialized)) { ++ union tsc_reg *local_tsc, result; ++ unsigned long stamp; ++ ++ local_tsc = &tsc[ipipe_processor_id()]; ++ ++ __asm__ ("ldmia %1, %M0\n" : ++ "=r"(result.full) : "r"(local_tsc), "m"(*local_tsc)); ++ barrier(); ++ stamp = omap_dm_timer_read_counter(gpt_clocksource); ++ if (unlikely(stamp < result.low)) ++ /* 32 bit counter wrapped, increment high word. */ ++ result.high++; ++ result.low = stamp; ++ ++ return result.full; ++ } ++ ++ return 0; ++} ++EXPORT_SYMBOL(__ipipe_mach_get_tsc); ++ ++/* ++ * Reprogram the timer ++ */ ++ ++void __ipipe_mach_set_dec(unsigned long delay) ++{ ++ if (delay > 3) ++ omap_dm_timer_set_load_start(gptimer, 0, 0xffffffff - delay); ++ else ++ ipipe_trigger_irq(__ipipe_mach_timerint); ++} ++EXPORT_SYMBOL(__ipipe_mach_set_dec); ++ ++void __ipipe_mach_release_timer(void) ++{ ++ struct clock_event_device *ckdev = &clockevent_gpt; ++ ckdev->set_mode(ckdev->mode, ckdev); ++ if (ckdev->mode == CLOCK_EVT_MODE_ONESHOT) ++ ckdev->set_next_event(__ipipe_mach_ticks_per_jiffy, ckdev); ++} ++EXPORT_SYMBOL(__ipipe_mach_release_timer); ++ ++unsigned long __ipipe_mach_get_dec(void) ++{ ++ return 0xffffffff - omap_dm_timer_read_counter(gptimer); ++} ++#endif /* CONFIG_IPIPE */ diff --git a/arch/arm/mach-pxa/gpio.c b/arch/arm/mach-pxa/gpio.c index 14930cf..149b825 100644 --- a/arch/arm/mach-pxa/gpio.c @@ -6496,6 +6711,176 @@ index fd28f51..c3d7da2 100644 + - __raw_readl(TIMER_BASE + MXC_TCN); +} +#endif /* CONFIG_IPIPE */ +diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig +index a94f0c4..ed2927f 100644 +--- a/arch/arm/plat-omap/Kconfig ++++ b/arch/arm/plat-omap/Kconfig +@@ -115,7 +115,7 @@ config OMAP_MPU_TIMER + + config OMAP_32K_TIMER + bool "Use 32KHz timer" +- depends on ARCH_OMAP16XX || ARCH_OMAP24XX || ARCH_OMAP34XX ++ depends on (ARCH_OMAP16XX || ARCH_OMAP24XX || ARCH_OMAP34XX) && !IPIPE + help + Select this option if you want to enable the OMAP 32KHz timer. + This timer saves power compared to the OMAP_MPU_TIMER, and has +diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c +index 963c31c..6b1cb7a 100644 +--- a/arch/arm/plat-omap/dmtimer.c ++++ b/arch/arm/plat-omap/dmtimer.c +@@ -423,6 +423,13 @@ int omap_dm_timer_get_irq(struct omap_dm_timer *timer) + return timer->irq; + } + ++#ifdef CONFIG_IPIPE ++unsigned long omap_dm_timer_get_phys_counter_addr(struct omap_dm_timer *timer) ++{ ++ return timer->phys_base + (OMAP_TIMER_COUNTER_REG & 0xff); ++} ++#endif /* CONFIG_IPIPE */ ++ + #if defined(CONFIG_ARCH_OMAP1) + + /** +diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c +index 424049d..dad956b 100644 +--- a/arch/arm/plat-omap/gpio.c ++++ b/arch/arm/plat-omap/gpio.c +@@ -17,6 +17,7 @@ + #include <linux/sysdev.h> + #include <linux/err.h> + #include <linux/clk.h> ++#include <linux/irq.h> /* For irq_desc */ + #include <linux/io.h> + + #include <mach/hardware.h> +@@ -1067,6 +1068,93 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) + + } + ++#ifdef CONFIG_IPIPE ++/* Same as function above, except it calls __ipipe_handle_irq. */ ++void __ipipe_mach_demux_irq(unsigned int irq, struct pt_regs *regs) ++{ ++ void __iomem *isr_reg = NULL; ++ u32 isr; ++ unsigned int gpio_irq; ++ struct gpio_bank *bank; ++ struct irq_desc *desc; ++ u32 retrigger = 0; ++ int unmasked = 0; ++ ++ desc = &irq_desc[irq]; ++ ++ desc->chip->ack(irq); ++ ++ bank = get_irq_data(irq); ++#ifdef CONFIG_ARCH_OMAP1 ++ if (bank->method == METHOD_MPUIO) ++ isr_reg = bank->base + OMAP_MPUIO_GPIO_INT; ++#endif ++#ifdef CONFIG_ARCH_OMAP15XX ++ if (bank->method == METHOD_GPIO_1510) ++ isr_reg = bank->base + OMAP1510_GPIO_INT_STATUS; ++#endif ++#if defined(CONFIG_ARCH_OMAP16XX) ++ if (bank->method == METHOD_GPIO_1610) ++ isr_reg = bank->base + OMAP1610_GPIO_IRQSTATUS1; ++#endif ++#ifdef CONFIG_ARCH_OMAP730 ++ if (bank->method == METHOD_GPIO_730) ++ isr_reg = bank->base + OMAP730_GPIO_INT_STATUS; ++#endif ++#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) ++ if (bank->method == METHOD_GPIO_24XX) ++ isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1; ++#endif ++ while (1) { ++ u32 isr_saved, level_mask = 0; ++ u32 enabled; ++ ++ enabled = _get_gpio_irqbank_mask(bank); ++ isr_saved = isr = __raw_readl(isr_reg) & enabled; ++ ++ if (cpu_is_omap15xx() && (bank->method == METHOD_MPUIO)) ++ isr &= 0x0000ffff; ++ ++ if (cpu_class_is_omap2()) ++ level_mask = bank->level_mask & enabled; ++ ++ /* clear edge sensitive interrupts before handler(s) are ++ called so that we don't miss any interrupt occurred while ++ executing them */ ++ _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 there is only edge sensitive GPIO pin interrupts ++ configured, we could unmask GPIO bank interrupt immediately */ ++ if (!level_mask && !unmasked) { ++ unmasked = 1; ++ desc->chip->unmask(irq); ++ } ++ ++ isr |= retrigger; ++ retrigger = 0; ++ if (!isr) ++ break; ++ ++ gpio_irq = bank->virtual_irq_start; ++ for (; isr != 0; isr >>= 1, gpio_irq++) { ++ if (!(isr & 1)) ++ continue; ++ ++ __ipipe_handle_irq(gpio_irq, regs); ++ } ++ } ++ /* if bank has any level sensitive GPIO pin interrupt ++ configured, we must unmask the bank interrupt only after ++ handler(s) are executed in order to avoid spurious bank ++ interrupt */ ++ if (!unmasked) ++ desc->chip->unmask(irq); ++ ++} ++#endif /* CONFIG_IPIPE */ ++ + static void gpio_irq_shutdown(unsigned int irq) + { + unsigned int gpio = irq - IH_GPIO_BASE; +diff --git a/arch/arm/plat-omap/include/mach/dmtimer.h b/arch/arm/plat-omap/include/mach/dmtimer.h +index 6dc7031..b2e8fcc 100644 +--- a/arch/arm/plat-omap/include/mach/dmtimer.h ++++ b/arch/arm/plat-omap/include/mach/dmtimer.h +@@ -56,6 +56,9 @@ void omap_dm_timer_enable(struct omap_dm_timer *timer); + void omap_dm_timer_disable(struct omap_dm_timer *timer); + + int omap_dm_timer_get_irq(struct omap_dm_timer *timer); ++#ifdef CONFIG_IPIPE ++unsigned long omap_dm_timer_get_phys_counter_addr(struct omap_dm_timer *timer); ++#endif /* CONFIG_IPIPE */ + + u32 omap_dm_timer_modify_idlect_mask(u32 inputmask); + struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer); +diff --git a/arch/arm/plat-omap/include/mach/irqs.h b/arch/arm/plat-omap/include/mach/irqs.h +index bed5274..6eaf67b 100644 +--- a/arch/arm/plat-omap/include/mach/irqs.h ++++ b/arch/arm/plat-omap/include/mach/irqs.h +@@ -388,6 +388,14 @@ + extern void omap_init_irq(void); + #endif + ++#ifdef CONFIG_IPIPE ++#ifdef CONFIG_ARCH_OMAP34XX ++#define __ipipe_mach_irq_mux_p(irq) \ ++ ((unsigned) (irq - INT_34XX_GPIO_BANK1) \ ++ <= (INT_34XX_GPIO_BANK6 - INT_34XX_GPIO_BANK1)) ++#endif /* OMAP34XX */ ++#endif /* CONFIG_IPIPE */ ++ + #include <mach/hardware.h> + + #endif diff --git a/arch/arm/plat-s3c24xx/irq.c b/arch/arm/plat-s3c24xx/irq.c index 963f7a4..4b94743 100644 --- a/arch/arm/plat-s3c24xx/irq.c _______________________________________________ Xenomai-git mailing list Xenomai-git@gna.org https://mail.gna.org/listinfo/xenomai-git