From 1edd84270be4a8dabd332434f28d57e62f2f501d Mon Sep 17 00:00:00 2001 From: Ben Dooks Date: Wed, 16 Apr 2008 00:04:19 +0100 Subject: [PATCH] --- yaml --- r: 91278 b: refs/heads/master c: c63fc13f806b11576e8c41969d4b1598dd261d80 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/arm/Kconfig | 3 - trunk/arch/arm/common/scoop.c | 183 ++++-------------- trunk/arch/arm/mach-sa1100/Makefile | 2 +- trunk/arch/arm/mach-sa1100/generic.c | 31 +++ trunk/arch/arm/mach-sa1100/generic.h | 1 - trunk/arch/arm/mach-sa1100/gpio.c | 65 ------- trunk/arch/arm/mach-sa1100/irq.c | 2 - trunk/arch/arm/mach-sa1100/time.c | 159 ++++++++------- .../asm-arm/arch-s3c2410/regs-s3c2412-mem.h | 29 +++ trunk/include/asm-arm/arch-sa1100/gpio.h | 31 +-- trunk/include/asm-arm/hardware/scoop.h | 5 +- 12 files changed, 213 insertions(+), 300 deletions(-) delete mode 100644 trunk/arch/arm/mach-sa1100/gpio.c create mode 100644 trunk/include/asm-arm/arch-s3c2410/regs-s3c2412-mem.h diff --git a/[refs] b/[refs] index b4af5535503a..d13f8905c4b8 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3e238be2f75f2a6d5d5064eda46ac96268c6411e +refs/heads/master: c63fc13f806b11576e8c41969d4b1598dd261d80 diff --git a/trunk/arch/arm/Kconfig b/trunk/arch/arm/Kconfig index 63cc733fdb32..4039a133006e 100644 --- a/trunk/arch/arm/Kconfig +++ b/trunk/arch/arm/Kconfig @@ -425,10 +425,7 @@ config ARCH_SA1100 select ARCH_MTD_XIP select GENERIC_GPIO select GENERIC_TIME - select GENERIC_CLOCKEVENTS - select TICK_ONESHOT select HAVE_IDE - select HAVE_GPIO_LIB help Support for StrongARM 11x0 based boards. diff --git a/trunk/arch/arm/common/scoop.c b/trunk/arch/arm/common/scoop.c index bc299b07a6fa..314ebd3a1d71 100644 --- a/trunk/arch/arm/common/scoop.c +++ b/trunk/arch/arm/common/scoop.c @@ -16,7 +16,6 @@ #include #include #include -#include #include /* PCMCIA to Scoop linkage @@ -31,9 +30,10 @@ struct scoop_pcmcia_config *platform_scoop_config; EXPORT_SYMBOL(platform_scoop_config); +#define SCOOP_REG(d,adr) (*(volatile unsigned short*)(d +(adr))) + struct scoop_dev { - void __iomem *base; - struct gpio_chip gpio; + void *base; spinlock_t scoop_lock; unsigned short suspend_clr; unsigned short suspend_set; @@ -44,84 +44,13 @@ void reset_scoop(struct device *dev) { struct scoop_dev *sdev = dev_get_drvdata(dev); - iowrite16(0x0100, sdev->base + SCOOP_MCR); // 00 - iowrite16(0x0000, sdev->base + SCOOP_CDR); // 04 - iowrite16(0x0000, sdev->base + SCOOP_CCR); // 10 - iowrite16(0x0000, sdev->base + SCOOP_IMR); // 18 - iowrite16(0x00FF, sdev->base + SCOOP_IRM); // 14 - iowrite16(0x0000, sdev->base + SCOOP_ISR); // 1C - iowrite16(0x0000, sdev->base + SCOOP_IRM); -} - -static void __scoop_gpio_set(struct scoop_dev *sdev, - unsigned offset, int value) -{ - unsigned short gpwr; - - gpwr = ioread16(sdev->base + SCOOP_GPWR); - if (value) - gpwr |= 1 << (offset + 1); - else - gpwr &= ~(1 << (offset + 1)); - iowrite16(gpwr, sdev->base + SCOOP_GPWR); -} - -static void scoop_gpio_set(struct gpio_chip *chip, unsigned offset, int value) -{ - struct scoop_dev *sdev = container_of(chip, struct scoop_dev, gpio); - unsigned long flags; - - spin_lock_irqsave(&sdev->scoop_lock, flags); - - __scoop_gpio_set(sdev, offset, value); - - spin_unlock_irqrestore(&sdev->scoop_lock, flags); -} - -static int scoop_gpio_get(struct gpio_chip *chip, unsigned offset) -{ - struct scoop_dev *sdev = container_of(chip, struct scoop_dev, gpio); - - /* XXX: I'm usure, but it seems so */ - return ioread16(sdev->base + SCOOP_GPRR) & (1 << (offset + 1)); -} - -static int scoop_gpio_direction_input(struct gpio_chip *chip, - unsigned offset) -{ - struct scoop_dev *sdev = container_of(chip, struct scoop_dev, gpio); - unsigned long flags; - unsigned short gpcr; - - spin_lock_irqsave(&sdev->scoop_lock, flags); - - gpcr = ioread16(sdev->base + SCOOP_GPCR); - gpcr &= ~(1 << (offset + 1)); - iowrite16(gpcr, sdev->base + SCOOP_GPCR); - - spin_unlock_irqrestore(&sdev->scoop_lock, flags); - - return 0; -} - -static int scoop_gpio_direction_output(struct gpio_chip *chip, - unsigned offset, int value) -{ - struct scoop_dev *sdev = container_of(chip, struct scoop_dev, gpio); - unsigned long flags; - unsigned short gpcr; - - spin_lock_irqsave(&sdev->scoop_lock, flags); - - __scoop_gpio_set(sdev, offset, value); - - gpcr = ioread16(sdev->base + SCOOP_GPCR); - gpcr |= 1 << (offset + 1); - iowrite16(gpcr, sdev->base + SCOOP_GPCR); - - spin_unlock_irqrestore(&sdev->scoop_lock, flags); - - return 0; + SCOOP_REG(sdev->base,SCOOP_MCR) = 0x0100; // 00 + SCOOP_REG(sdev->base,SCOOP_CDR) = 0x0000; // 04 + SCOOP_REG(sdev->base,SCOOP_CCR) = 0x0000; // 10 + SCOOP_REG(sdev->base,SCOOP_IMR) = 0x0000; // 18 + SCOOP_REG(sdev->base,SCOOP_IRM) = 0x00FF; // 14 + SCOOP_REG(sdev->base,SCOOP_ISR) = 0x0000; // 1C + SCOOP_REG(sdev->base,SCOOP_IRM) = 0x0000; } unsigned short set_scoop_gpio(struct device *dev, unsigned short bit) @@ -131,8 +60,8 @@ unsigned short set_scoop_gpio(struct device *dev, unsigned short bit) struct scoop_dev *sdev = dev_get_drvdata(dev); spin_lock_irqsave(&sdev->scoop_lock, flag); - gpio_bit = ioread16(sdev->base + SCOOP_GPWR) | bit; - iowrite16(gpio_bit, sdev->base + SCOOP_GPWR); + gpio_bit = SCOOP_REG(sdev->base, SCOOP_GPWR) | bit; + SCOOP_REG(sdev->base, SCOOP_GPWR) = gpio_bit; spin_unlock_irqrestore(&sdev->scoop_lock, flag); return gpio_bit; @@ -145,8 +74,8 @@ unsigned short reset_scoop_gpio(struct device *dev, unsigned short bit) struct scoop_dev *sdev = dev_get_drvdata(dev); spin_lock_irqsave(&sdev->scoop_lock, flag); - gpio_bit = ioread16(sdev->base + SCOOP_GPWR) & ~bit; - iowrite16(gpio_bit, sdev->base + SCOOP_GPWR); + gpio_bit = SCOOP_REG(sdev->base, SCOOP_GPWR) & ~bit; + SCOOP_REG(sdev->base,SCOOP_GPWR) = gpio_bit; spin_unlock_irqrestore(&sdev->scoop_lock, flag); return gpio_bit; @@ -158,13 +87,13 @@ EXPORT_SYMBOL(reset_scoop_gpio); unsigned short read_scoop_reg(struct device *dev, unsigned short reg) { struct scoop_dev *sdev = dev_get_drvdata(dev); - return ioread16(sdev->base + reg); + return SCOOP_REG(sdev->base,reg); } void write_scoop_reg(struct device *dev, unsigned short reg, unsigned short data) { struct scoop_dev *sdev = dev_get_drvdata(dev); - iowrite16(data, sdev->base + reg); + SCOOP_REG(sdev->base,reg)=data; } EXPORT_SYMBOL(reset_scoop); @@ -175,9 +104,9 @@ static void check_scoop_reg(struct scoop_dev *sdev) { unsigned short mcr; - mcr = ioread16(sdev->base + SCOOP_MCR); + mcr = SCOOP_REG(sdev->base, SCOOP_MCR); if ((mcr & 0x100) == 0) - iowrite16(0x0101, sdev->base + SCOOP_MCR); + SCOOP_REG(sdev->base, SCOOP_MCR) = 0x0101; } #ifdef CONFIG_PM @@ -186,8 +115,8 @@ static int scoop_suspend(struct platform_device *dev, pm_message_t state) struct scoop_dev *sdev = platform_get_drvdata(dev); check_scoop_reg(sdev); - sdev->scoop_gpwr = ioread16(sdev->base + SCOOP_GPWR); - iowrite16((sdev->scoop_gpwr & ~sdev->suspend_clr) | sdev->suspend_set, sdev->base + SCOOP_GPWR); + sdev->scoop_gpwr = SCOOP_REG(sdev->base, SCOOP_GPWR); + SCOOP_REG(sdev->base, SCOOP_GPWR) = (sdev->scoop_gpwr & ~sdev->suspend_clr) | sdev->suspend_set; return 0; } @@ -197,7 +126,7 @@ static int scoop_resume(struct platform_device *dev) struct scoop_dev *sdev = platform_get_drvdata(dev); check_scoop_reg(sdev); - iowrite16(sdev->scoop_gpwr, sdev->base + SCOOP_GPWR); + SCOOP_REG(sdev->base,SCOOP_GPWR) = sdev->scoop_gpwr; return 0; } @@ -206,13 +135,11 @@ static int scoop_resume(struct platform_device *dev) #define scoop_resume NULL #endif -static int __devinit scoop_probe(struct platform_device *pdev) +int __init scoop_probe(struct platform_device *pdev) { struct scoop_dev *devptr; struct scoop_config *inf; struct resource *mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); - int ret; - int temp; if (!mem) return -EINVAL; @@ -227,78 +154,40 @@ static int __devinit scoop_probe(struct platform_device *pdev) devptr->base = ioremap(mem->start, mem->end - mem->start + 1); if (!devptr->base) { - ret = -ENOMEM; - goto err_ioremap; + kfree(devptr); + return -ENOMEM; } platform_set_drvdata(pdev, devptr); - printk("Sharp Scoop Device found at 0x%08x -> 0x%8p\n",(unsigned int)mem->start, devptr->base); + printk("Sharp Scoop Device found at 0x%08x -> 0x%08x\n",(unsigned int)mem->start,(unsigned int)devptr->base); - iowrite16(0x0140, devptr->base + SCOOP_MCR); + SCOOP_REG(devptr->base, SCOOP_MCR) = 0x0140; reset_scoop(&pdev->dev); - iowrite16(0x0000, devptr->base + SCOOP_CPR); - iowrite16(inf->io_dir & 0xffff, devptr->base + SCOOP_GPCR); - iowrite16(inf->io_out & 0xffff, devptr->base + SCOOP_GPWR); + SCOOP_REG(devptr->base, SCOOP_CPR) = 0x0000; + SCOOP_REG(devptr->base, SCOOP_GPCR) = inf->io_dir & 0xffff; + SCOOP_REG(devptr->base, SCOOP_GPWR) = inf->io_out & 0xffff; devptr->suspend_clr = inf->suspend_clr; devptr->suspend_set = inf->suspend_set; - devptr->gpio.base = -1; - - if (inf->gpio_base != 0) { - devptr->gpio.label = pdev->dev.bus_id; - devptr->gpio.base = inf->gpio_base; - devptr->gpio.ngpio = 12; /* PA11 = 0, PA12 = 1, etc. up to PA22 = 11 */ - devptr->gpio.set = scoop_gpio_set; - devptr->gpio.get = scoop_gpio_get; - devptr->gpio.direction_input = scoop_gpio_direction_input; - devptr->gpio.direction_output = scoop_gpio_direction_output; - - ret = gpiochip_add(&devptr->gpio); - if (ret) - goto err_gpio; - } - return 0; - - if (devptr->gpio.base != -1) - temp = gpiochip_remove(&devptr->gpio); -err_gpio: - platform_set_drvdata(pdev, NULL); -err_ioremap: - iounmap(devptr->base); - kfree(devptr); - - return ret; } -static int __devexit scoop_remove(struct platform_device *pdev) +static int scoop_remove(struct platform_device *pdev) { struct scoop_dev *sdev = platform_get_drvdata(pdev); - int ret; - - if (!sdev) - return -EINVAL; - - if (sdev->gpio.base != -1) { - ret = gpiochip_remove(&sdev->gpio); - if (ret) { - dev_err(&pdev->dev, "Can't remove gpio chip: %d\n", ret); - return ret; - } + if (sdev) { + iounmap(sdev->base); + kfree(sdev); + platform_set_drvdata(pdev, NULL); } - - platform_set_drvdata(pdev, NULL); - iounmap(sdev->base); - kfree(sdev); - return 0; } static struct platform_driver scoop_driver = { .probe = scoop_probe, - .remove = __devexit_p(scoop_remove), + .remove = scoop_remove, .suspend = scoop_suspend, .resume = scoop_resume, .driver = { @@ -306,7 +195,7 @@ static struct platform_driver scoop_driver = { }, }; -static int __init scoop_init(void) +int __init scoop_init(void) { return platform_driver_register(&scoop_driver); } diff --git a/trunk/arch/arm/mach-sa1100/Makefile b/trunk/arch/arm/mach-sa1100/Makefile index 8e0244631d65..7a61e8d33ab7 100644 --- a/trunk/arch/arm/mach-sa1100/Makefile +++ b/trunk/arch/arm/mach-sa1100/Makefile @@ -3,7 +3,7 @@ # # Common support -obj-y := clock.o generic.o gpio.o irq.o dma.o time.o #nmi-oopser.o +obj-y := clock.o generic.o irq.o dma.o time.o #nmi-oopser.o obj-m := obj-n := obj- := diff --git a/trunk/arch/arm/mach-sa1100/generic.c b/trunk/arch/arm/mach-sa1100/generic.c index 0c2fa1c4fb4c..5c84c604ed86 100644 --- a/trunk/arch/arm/mach-sa1100/generic.c +++ b/trunk/arch/arm/mach-sa1100/generic.c @@ -139,6 +139,37 @@ unsigned long long sched_clock(void) return v; } +int gpio_direction_input(unsigned gpio) +{ + unsigned long flags; + + if (gpio > GPIO_MAX) + return -EINVAL; + + local_irq_save(flags); + GPDR &= ~GPIO_GPIO(gpio); + local_irq_restore(flags); + return 0; +} + +EXPORT_SYMBOL(gpio_direction_input); + +int gpio_direction_output(unsigned gpio, int value) +{ + unsigned long flags; + + if (gpio > GPIO_MAX) + return -EINVAL; + + local_irq_save(flags); + gpio_set_value(gpio, value); + GPDR |= GPIO_GPIO(gpio); + local_irq_restore(flags); + return 0; +} + +EXPORT_SYMBOL(gpio_direction_output); + /* * Default power-off for SA1100 */ diff --git a/trunk/arch/arm/mach-sa1100/generic.h b/trunk/arch/arm/mach-sa1100/generic.h index 793c2e6c991f..f085d68e568e 100644 --- a/trunk/arch/arm/mach-sa1100/generic.h +++ b/trunk/arch/arm/mach-sa1100/generic.h @@ -9,7 +9,6 @@ struct sys_timer; extern struct sys_timer sa1100_timer; extern void __init sa1100_map_io(void); extern void __init sa1100_init_irq(void); -extern void __init sa1100_init_gpio(void); #define SET_BANK(__nr,__start,__size) \ mi->bank[__nr].start = (__start), \ diff --git a/trunk/arch/arm/mach-sa1100/gpio.c b/trunk/arch/arm/mach-sa1100/gpio.c deleted file mode 100644 index 372f1f4f54a1..000000000000 --- a/trunk/arch/arm/mach-sa1100/gpio.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * linux/arch/arm/mach-sa1100/gpio.c - * - * Generic SA-1100 GPIO handling - * - * 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 -#include - -#include -#include -#include "generic.h" - -static int sa1100_gpio_get(struct gpio_chip *chip, unsigned offset) -{ - return GPLR & GPIO_GPIO(offset); -} - -static void sa1100_gpio_set(struct gpio_chip *chip, unsigned offset, int value) -{ - if (value) - GPSR = GPIO_GPIO(offset); - else - GPCR = GPIO_GPIO(offset); -} - -static int sa1100_direction_input(struct gpio_chip *chip, unsigned offset) -{ - unsigned long flags; - - local_irq_save(flags); - GPDR &= ~GPIO_GPIO(offset); - local_irq_restore(flags); - return 0; -} - -static int sa1100_direction_output(struct gpio_chip *chip, unsigned offset, int value) -{ - unsigned long flags; - - local_irq_save(flags); - sa1100_gpio_set(chip, offset, value); - GPDR |= GPIO_GPIO(offset); - local_irq_restore(flags); - return 0; -} - -static struct gpio_chip sa1100_gpio_chip = { - .label = "gpio", - .direction_input = sa1100_direction_input, - .direction_output = sa1100_direction_output, - .set = sa1100_gpio_set, - .get = sa1100_gpio_get, - .base = 0, - .ngpio = GPIO_MAX + 1, -}; - -void __init sa1100_init_gpio(void) -{ - gpiochip_add(&sa1100_gpio_chip); -} diff --git a/trunk/arch/arm/mach-sa1100/irq.c b/trunk/arch/arm/mach-sa1100/irq.c index fa0403af7eec..3dc17d7bf38e 100644 --- a/trunk/arch/arm/mach-sa1100/irq.c +++ b/trunk/arch/arm/mach-sa1100/irq.c @@ -347,6 +347,4 @@ void __init sa1100_init_irq(void) */ set_irq_chip(IRQ_GPIO11_27, &sa1100_normal_chip); set_irq_chained_handler(IRQ_GPIO11_27, sa1100_high_gpio_handler); - - sa1100_init_gpio(); } diff --git a/trunk/arch/arm/mach-sa1100/time.c b/trunk/arch/arm/mach-sa1100/time.c index a9799cb35b74..c2677368d6af 100644 --- a/trunk/arch/arm/mach-sa1100/time.c +++ b/trunk/arch/arm/mach-sa1100/time.c @@ -13,69 +13,67 @@ #include #include #include -#include +#include +#include #include #include -#define MIN_OSCR_DELTA 2 +#define RTC_DEF_DIVIDER (32768 - 1) +#define RTC_DEF_TRIM 0 -static irqreturn_t sa1100_ost0_interrupt(int irq, void *dev_id) +static int sa1100_set_rtc(void) { - struct clock_event_device *c = dev_id; + unsigned long current_time = xtime.tv_sec; - /* Disarm the compare/match, signal the event. */ - OIER &= ~OIER_E0; - OSSR = OSSR_M0; - c->event_handler(c); - - return IRQ_HANDLED; + if (RTSR & RTSR_ALE) { + /* make sure not to forward the clock over an alarm */ + unsigned long alarm = RTAR; + if (current_time >= alarm && alarm >= RCNR) + return -ERESTARTSYS; + } + RCNR = current_time; + return 0; } -static int -sa1100_osmr0_set_next_event(unsigned long delta, struct clock_event_device *c) -{ - unsigned long flags, next, oscr; - - raw_local_irq_save(flags); - OIER |= OIER_E0; - next = OSCR + delta; - OSMR0 = next; - oscr = OSCR; - raw_local_irq_restore(flags); - - return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0; -} +#ifdef CONFIG_NO_IDLE_HZ +static unsigned long initial_match; +static int match_posponed; +#endif -static void -sa1100_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *c) +static irqreturn_t +sa1100_timer_interrupt(int irq, void *dev_id) { - unsigned long flags; + unsigned int next_match; - switch (mode) { - case CLOCK_EVT_MODE_ONESHOT: - case CLOCK_EVT_MODE_UNUSED: - case CLOCK_EVT_MODE_SHUTDOWN: - raw_local_irq_save(flags); - OIER &= ~OIER_E0; - OSSR = OSSR_M0; - raw_local_irq_restore(flags); - break; - - case CLOCK_EVT_MODE_RESUME: - case CLOCK_EVT_MODE_PERIODIC: - break; +#ifdef CONFIG_NO_IDLE_HZ + if (match_posponed) { + match_posponed = 0; + OSMR0 = initial_match; } +#endif + + /* + * Loop until we get ahead of the free running timer. + * This ensures an exact clock tick count and time accuracy. + * Since IRQs are disabled at this point, coherence between + * lost_ticks(updated in do_timer()) and the match reg value is + * ensured, hence we can use do_gettimeofday() from interrupt + * handlers. + */ + do { + timer_tick(); + OSSR = OSSR_M0; /* Clear match on timer 0 */ + next_match = (OSMR0 += LATCH); + } while ((signed long)(next_match - OSCR) <= 0); + + return IRQ_HANDLED; } -static struct clock_event_device ckevt_sa1100_osmr0 = { - .name = "osmr0", - .features = CLOCK_EVT_FEAT_ONESHOT, - .shift = 32, - .rating = 200, - .cpumask = CPU_MASK_CPU0, - .set_next_event = sa1100_osmr0_set_next_event, - .set_mode = sa1100_osmr0_set_mode, +static struct irqaction sa1100_timer_irq = { + .name = "SA11xx Timer Tick", + .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, + .handler = sa1100_timer_interrupt, }; static cycle_t sa1100_read_oscr(void) @@ -92,34 +90,62 @@ static struct clocksource cksrc_sa1100_oscr = { .flags = CLOCK_SOURCE_IS_CONTINUOUS, }; -static struct irqaction sa1100_timer_irq = { - .name = "ost0", - .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, - .handler = sa1100_ost0_interrupt, - .dev_id = &ckevt_sa1100_osmr0, -}; - static void __init sa1100_timer_init(void) { + unsigned long flags; + + set_rtc = sa1100_set_rtc; + OIER = 0; /* disable any timer interrupts */ OSSR = 0xf; /* clear status on all timers */ - - ckevt_sa1100_osmr0.mult = - div_sc(3686400, NSEC_PER_SEC, ckevt_sa1100_osmr0.shift); - ckevt_sa1100_osmr0.max_delta_ns = - clockevent_delta2ns(0x7fffffff, &ckevt_sa1100_osmr0); - ckevt_sa1100_osmr0.min_delta_ns = - clockevent_delta2ns(MIN_OSCR_DELTA * 2, &ckevt_sa1100_osmr0) + 1; + setup_irq(IRQ_OST0, &sa1100_timer_irq); + local_irq_save(flags); + OIER = OIER_E0; /* enable match on timer 0 to cause interrupts */ + OSMR0 = OSCR + LATCH; /* set initial match */ + local_irq_restore(flags); cksrc_sa1100_oscr.mult = clocksource_hz2mult(CLOCK_TICK_RATE, cksrc_sa1100_oscr.shift); - setup_irq(IRQ_OST0, &sa1100_timer_irq); - clocksource_register(&cksrc_sa1100_oscr); - clockevents_register_device(&ckevt_sa1100_osmr0); } +#ifdef CONFIG_NO_IDLE_HZ +static int sa1100_dyn_tick_enable_disable(void) +{ + /* nothing to do */ + return 0; +} + +static void sa1100_dyn_tick_reprogram(unsigned long ticks) +{ + if (ticks > 1) { + initial_match = OSMR0; + OSMR0 = initial_match + ticks * LATCH; + match_posponed = 1; + } +} + +static irqreturn_t +sa1100_dyn_tick_handler(int irq, void *dev_id) +{ + if (match_posponed) { + match_posponed = 0; + OSMR0 = initial_match; + if ((signed long)(initial_match - OSCR) <= 0) + return sa1100_timer_interrupt(irq, dev_id); + } + return IRQ_NONE; +} + +static struct dyn_tick_timer sa1100_dyn_tick = { + .enable = sa1100_dyn_tick_enable_disable, + .disable = sa1100_dyn_tick_enable_disable, + .reprogram = sa1100_dyn_tick_reprogram, + .handler = sa1100_dyn_tick_handler, +}; +#endif + #ifdef CONFIG_PM unsigned long osmr[4], oier; @@ -155,4 +181,7 @@ struct sys_timer sa1100_timer = { .init = sa1100_timer_init, .suspend = sa1100_timer_suspend, .resume = sa1100_timer_resume, +#ifdef CONFIG_NO_IDLE_HZ + .dyn_tick = &sa1100_dyn_tick, +#endif }; diff --git a/trunk/include/asm-arm/arch-s3c2410/regs-s3c2412-mem.h b/trunk/include/asm-arm/arch-s3c2410/regs-s3c2412-mem.h new file mode 100644 index 000000000000..c8c793e78936 --- /dev/null +++ b/trunk/include/asm-arm/arch-s3c2410/regs-s3c2412-mem.h @@ -0,0 +1,29 @@ +/* linux/include/asm-arm/arch-s3c2410/regs-s3c2412-mem.h + * + * Copyright (c) 2008 Simtec Electronics + * Ben Dooks + * http://armlinux.simtec.co.uk/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * S3C2412 memory register definitions +*/ + +#ifndef __ASM_ARM_REGS_S3C2412_MEM +#define __ASM_ARM_REGS_S3C2412_MEM + +#ifndef S3C2412_MEMREG +#define S3C2412_MEMREG(x) (S3C24XX_VA_MEMCTRL + (x)) +#endif + +#define S3C2412_BANKCFG S3C2412_MEMREG(0x00) +#define S3C2412_BANKCON1 S3C2412_MEMREG(0x04) +#define S3C2412_BANKCON2 S3C2412_MEMREG(0x08) +#define S3C2412_BANKCON3 S3C2412_MEMREG(0x0C) + +#define S3C2412_REFRESH S3C2412_MEMREG(0x10) +#define S3C2412_TIMEOUT S3C2412_MEMREG(0x14) + +#endif /* __ASM_ARM_REGS_S3C2412_MEM */ diff --git a/trunk/include/asm-arm/arch-sa1100/gpio.h b/trunk/include/asm-arm/arch-sa1100/gpio.h index 93d3395b102d..e7a9d26e22a8 100644 --- a/trunk/include/asm-arm/arch-sa1100/gpio.h +++ b/trunk/include/asm-arm/arch-sa1100/gpio.h @@ -26,28 +26,35 @@ #include #include -#include + +static inline int gpio_request(unsigned gpio, const char *label) +{ + return 0; +} + +static inline void gpio_free(unsigned gpio) +{ + return; +} + +extern int gpio_direction_input(unsigned gpio); +extern int gpio_direction_output(unsigned gpio, int value); + static inline int gpio_get_value(unsigned gpio) { - if (__builtin_constant_p(gpio) && (gpio <= GPIO_MAX)) - return GPLR & GPIO_GPIO(gpio); - else - return __gpio_get_value(gpio); + return GPLR & GPIO_GPIO(gpio); } static inline void gpio_set_value(unsigned gpio, int value) { - if (__builtin_constant_p(gpio) && (gpio <= GPIO_MAX)) - if (value) - GPSR = GPIO_GPIO(gpio); - else - GPCR = GPIO_GPIO(gpio); + if (value) + GPSR = GPIO_GPIO(gpio); else - __gpio_set_value(gpio, value); + GPCR = GPIO_GPIO(gpio); } -#define gpio_cansleep __gpio_cansleep +#include /* cansleep wrappers */ static inline unsigned gpio_to_irq(unsigned gpio) { diff --git a/trunk/include/asm-arm/hardware/scoop.h b/trunk/include/asm-arm/hardware/scoop.h index dfb8330599f9..d37bf7443264 100644 --- a/trunk/include/asm-arm/hardware/scoop.h +++ b/trunk/include/asm-arm/hardware/scoop.h @@ -40,7 +40,6 @@ struct scoop_config { unsigned short io_dir; unsigned short suspend_clr; unsigned short suspend_set; - int gpio_base; }; /* Structure for linking scoop devices to PCMCIA sockets */ @@ -63,7 +62,7 @@ struct scoop_pcmcia_config { extern struct scoop_pcmcia_config *platform_scoop_config; void reset_scoop(struct device *dev); -unsigned short __deprecated set_scoop_gpio(struct device *dev, unsigned short bit); -unsigned short __deprecated reset_scoop_gpio(struct device *dev, unsigned short bit); +unsigned short set_scoop_gpio(struct device *dev, unsigned short bit); +unsigned short reset_scoop_gpio(struct device *dev, unsigned short bit); unsigned short read_scoop_reg(struct device *dev, unsigned short reg); void write_scoop_reg(struct device *dev, unsigned short reg, unsigned short data);