diff for duplicates of <00ce01cb2d41$e8a913b0$b9fb3b10$@com> diff --git a/a/1.txt b/N1/1.txt index 33b751a..e23f36d 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -28,7 +28,7 @@ Kyungmin Park <kmpark@infradead.org> wrote: >On Mon, Jul 26, 2010 at 9:42 PM, Kukjin Kim <kgene.kim@samsung.com> wrote: >> From: Changhwan Youn <chaos.youn@samsung.com> >> ->> This patch adds timer support for S5PV310. Until now, all S5P SoCs +>> This patch adds timer support for S5PV310. ?Until now, all S5P SoCs >> use CONFIG_ARCH_USES_GETTIMEOFFSET macro as a default configuration. >> Instead,S5PV310 implements clocksource and clock_event_device to >> support the high resolution timer and tickless system. @@ -40,18 +40,18 @@ Kyungmin Park <kmpark@infradead.org> wrote: >> Changes since v3: >> >> - Changes clock source from PWM2 to PWM4 because PWM4 cannot be used for ->> other purpose such as external output function through GPIO. +>> ?other purpose such as external output function through GPIO. >> ->> arch/arm/mach-s5pv310/include/mach/pwm-clock.h | 70 ++++++ ->> arch/arm/mach-s5pv310/localtimer.c | 25 ++ ->> arch/arm/mach-s5pv310/time.c | 287 +>> ?arch/arm/mach-s5pv310/include/mach/pwm-clock.h | ? 70 ++++++ +>> ?arch/arm/mach-s5pv310/localtimer.c ? ? ? ? ? ? | ? 25 ++ +>> ?arch/arm/mach-s5pv310/time.c ? ? ? ? ? ? ? ? ? | ?287 >++++++++++++++++++++++++ ->> arch/arm/plat-s5p/include/plat/s5pv310.h | 1 + ->> arch/arm/plat-samsung/Makefile | 2 +- ->> 5 files changed, 384 insertions(+), 1 deletions(-) ->> create mode 100644 arch/arm/mach-s5pv310/include/mach/pwm-clock.h ->> create mode 100644 arch/arm/mach-s5pv310/localtimer.c ->> create mode 100644 arch/arm/mach-s5pv310/time.c +>> ?arch/arm/plat-s5p/include/plat/s5pv310.h ? ? ? | ? ?1 + +>> ?arch/arm/plat-samsung/Makefile ? ? ? ? ? ? ? ? | ? ?2 +- +>> ?5 files changed, 384 insertions(+), 1 deletions(-) +>> ?create mode 100644 arch/arm/mach-s5pv310/include/mach/pwm-clock.h +>> ?create mode 100644 arch/arm/mach-s5pv310/localtimer.c +>> ?create mode 100644 arch/arm/mach-s5pv310/time.c >> >> diff --git a/arch/arm/mach-s5pv310/include/mach/pwm-clock.h >b/arch/arm/mach-s5pv310/include/mach/pwm-clock.h @@ -63,12 +63,12 @@ Kyungmin Park <kmpark@infradead.org> wrote: >> +/* linux/arch/arm/mach-s5pv310/include/mach/pwm-clock.h >> + * >> + * Copyright (c) 2010 Samsung Electronics Co., Ltd. ->> + * http://www.samsung.com/ +>> + * ? ? ? ? ? ? http://www.samsung.com/ >> + * >> + * Copyright 2008 Openmoko, Inc. >> + * Copyright 2008 Simtec Electronics ->> + * Ben Dooks <ben@simtec.co.uk> ->> + * http://armlinux.simtec.co.uk/ +>> + * ? ? ?Ben Dooks <ben@simtec.co.uk> +>> + * ? ? ?http://armlinux.simtec.co.uk/ >> + * >> + * Based on arch/arm/mach-s3c64xx/include/mach/pwm-clock.h >> + * @@ -91,7 +91,7 @@ Kyungmin Park <kmpark@infradead.org> wrote: >> + */ >> +static inline int pwm_cfg_src_is_tclk(unsigned long tcfg) >> +{ ->> + return tcfg == S3C64XX_TCFG1_MUX_TCLK; +>> + ? ? ? return tcfg == S3C64XX_TCFG1_MUX_TCLK; >> +} >> + >> +/** @@ -103,7 +103,7 @@ Kyungmin Park <kmpark@infradead.org> wrote: >> + */ >> +static inline unsigned long tcfg_to_divisor(unsigned long tcfg1) >> +{ ->> + return 1 << tcfg1; +>> + ? ? ? return 1 << tcfg1; >> +} >> + >> +/** @@ -113,7 +113,7 @@ Kyungmin Park <kmpark@infradead.org> wrote: >> + */ >> +static inline unsigned int pwm_tdiv_has_div1(void) >> +{ ->> + return 1; +>> + ? ? ? return 1; >> +} >> + >> +/** @@ -124,7 +124,7 @@ Kyungmin Park <kmpark@infradead.org> wrote: >> + */ >> +static inline unsigned long pwm_tdiv_div_bits(unsigned int div) >> +{ ->> + return ilog2(div); +>> + ? ? ? return ilog2(div); >> +} >> + >> +#define S3C_TCFG1_MUX_TCLK S3C64XX_TCFG1_MUX_TCLK @@ -141,8 +141,8 @@ Kyungmin Park <kmpark@infradead.org> wrote: >> + * >> + * Cloned from linux/arch/arm/mach-realview/localtimer.c >> + * ->> + * Copyright (C) 2002 ARM Ltd. ->> + * All Rights Reserved +>> + * ?Copyright (C) 2002 ARM Ltd. +>> + * ?All Rights Reserved >> + * >> + * 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 @@ -159,8 +159,8 @@ Kyungmin Park <kmpark@infradead.org> wrote: >> + */ >> +void __cpuinit local_timer_setup(struct clock_event_device *evt) >> +{ ->> + evt->irq = IRQ_LOCALTIMER; ->> + twd_timer_setup(evt); +>> + ? ? ? evt->irq = IRQ_LOCALTIMER; +>> + ? ? ? twd_timer_setup(evt); >> +} >> diff --git a/arch/arm/mach-s5pv310/time.c b/arch/arm/mach-s5pv310/time.c >> new file mode 100644 @@ -171,7 +171,7 @@ Kyungmin Park <kmpark@infradead.org> wrote: >> +/* linux/arch/arm/mach-s5pv310/time.c >> + * >> + * Copyright (c) 2010 Samsung Electronics Co., Ltd. ->> + * http://www.samsung.com +>> + * ? ? ? ? ? ? http://www.samsung.com >> + * >> + * S5PV310 (and compatible) HRT support >> + * PWM 2/4 is used for this feature @@ -205,297 +205,297 @@ Kyungmin Park <kmpark@infradead.org> wrote: >> + >> +static void s5pv310_pwm_stop(unsigned int pwm_id) >> +{ ->> + unsigned long tcon; ->> + ->> + tcon = __raw_readl(S3C2410_TCON); ->> + ->> + switch (pwm_id) { ->> + case 2: ->> + tcon &= ~S3C2410_TCON_T2START; ->> + break; ->> + case 4: ->> + tcon &= ~S3C2410_TCON_T4START; ->> + break; ->> + default: ->> + break; ->> + } ->> + __raw_writel(tcon, S3C2410_TCON); +>> + ? ? ? unsigned long tcon; +>> + +>> + ? ? ? tcon = __raw_readl(S3C2410_TCON); +>> + +>> + ? ? ? switch (pwm_id) { +>> + ? ? ? case 2: +>> + ? ? ? ? ? ? ? tcon &= ~S3C2410_TCON_T2START; +>> + ? ? ? ? ? ? ? break; +>> + ? ? ? case 4: +>> + ? ? ? ? ? ? ? tcon &= ~S3C2410_TCON_T4START; +>> + ? ? ? ? ? ? ? break; +>> + ? ? ? default: +>> + ? ? ? ? ? ? ? break; +>> + ? ? ? } +>> + ? ? ? __raw_writel(tcon, S3C2410_TCON); >> +} >> + >> +static void s5pv310_pwm_init(unsigned int pwm_id, unsigned long tcnt) >> +{ ->> + unsigned long tcon; +>> + ? ? ? unsigned long tcon; >> + ->> + tcon = __raw_readl(S3C2410_TCON); +>> + ? ? ? tcon = __raw_readl(S3C2410_TCON); >> + ->> + /* timers reload after counting zero, so reduce the count by 1 */ ->> + tcnt--; +>> + ? ? ? /* timers reload after counting zero, so reduce the count by 1 */ +>> + ? ? ? tcnt--; >> + ->> + /* ensure timer is stopped... */ ->> + switch (pwm_id) { ->> + case 2: ->> + tcon &= ~(0xf<<12); ->> + tcon |= S3C2410_TCON_T2MANUALUPD; +>> + ? ? ? /* ensure timer is stopped... */ +>> + ? ? ? switch (pwm_id) { +>> + ? ? ? case 2: +>> + ? ? ? ? ? ? ? tcon &= ~(0xf<<12); +>> + ? ? ? ? ? ? ? tcon |= S3C2410_TCON_T2MANUALUPD; >> + ->> + __raw_writel(tcnt, S3C2410_TCNTB(2)); ->> + __raw_writel(tcnt, S3C2410_TCMPB(2)); ->> + __raw_writel(tcon, S3C2410_TCON); +>> + ? ? ? ? ? ? ? __raw_writel(tcnt, S3C2410_TCNTB(2)); +>> + ? ? ? ? ? ? ? __raw_writel(tcnt, S3C2410_TCMPB(2)); +>> + ? ? ? ? ? ? ? __raw_writel(tcon, S3C2410_TCON); >> + ->> + break; ->> + case 4: ->> + tcon &= ~(7<<20); ->> + tcon |= S3C2410_TCON_T4MANUALUPD; +>> + ? ? ? ? ? ? ? break; +>> + ? ? ? case 4: +>> + ? ? ? ? ? ? ? tcon &= ~(7<<20); +>> + ? ? ? ? ? ? ? tcon |= S3C2410_TCON_T4MANUALUPD; >> + ->> + __raw_writel(tcnt, S3C2410_TCNTB(4)); ->> + __raw_writel(tcnt, S3C2410_TCMPB(4)); ->> + __raw_writel(tcon, S3C2410_TCON); +>> + ? ? ? ? ? ? ? __raw_writel(tcnt, S3C2410_TCNTB(4)); +>> + ? ? ? ? ? ? ? __raw_writel(tcnt, S3C2410_TCMPB(4)); +>> + ? ? ? ? ? ? ? __raw_writel(tcon, S3C2410_TCON); >> + ->> + break; ->> + default: ->> + break; ->> + } +>> + ? ? ? ? ? ? ? break; +>> + ? ? ? default: +>> + ? ? ? ? ? ? ? break; +>> + ? ? ? } >> +} >> + >> +static inline void s5pv310_pwm_start(unsigned int pwm_id, bool periodic) >> +{ ->> + unsigned long tcon; ->> + ->> + tcon = __raw_readl(S3C2410_TCON); ->> + ->> + switch (pwm_id) { ->> + case 2: ->> + tcon |= S3C2410_TCON_T2START; ->> + tcon &= ~S3C2410_TCON_T2MANUALUPD; ->> + ->> + if (periodic) ->> + tcon |= S3C2410_TCON_T2RELOAD; ->> + else ->> + tcon &= ~S3C2410_TCON_T2RELOAD; ->> + break; ->> + case 4: ->> + tcon |= S3C2410_TCON_T4START; ->> + tcon &= ~S3C2410_TCON_T4MANUALUPD; ->> + ->> + if (periodic) ->> + tcon |= S3C2410_TCON_T4RELOAD; ->> + else ->> + tcon &= ~S3C2410_TCON_T4RELOAD; ->> + break; ->> + default: ->> + break; ->> + } ->> + __raw_writel(tcon, S3C2410_TCON); +>> + ? ? ? unsigned long tcon; +>> + +>> + ? ? ? tcon ?= __raw_readl(S3C2410_TCON); +>> + +>> + ? ? ? switch (pwm_id) { +>> + ? ? ? case 2: +>> + ? ? ? ? ? ? ? tcon |= S3C2410_TCON_T2START; +>> + ? ? ? ? ? ? ? tcon &= ~S3C2410_TCON_T2MANUALUPD; +>> + +>> + ? ? ? ? ? ? ? if (periodic) +>> + ? ? ? ? ? ? ? ? ? ? ? tcon |= S3C2410_TCON_T2RELOAD; +>> + ? ? ? ? ? ? ? else +>> + ? ? ? ? ? ? ? ? ? ? ? tcon &= ~S3C2410_TCON_T2RELOAD; +>> + ? ? ? ? ? ? ? break; +>> + ? ? ? case 4: +>> + ? ? ? ? ? ? ? tcon |= S3C2410_TCON_T4START; +>> + ? ? ? ? ? ? ? tcon &= ~S3C2410_TCON_T4MANUALUPD; +>> + +>> + ? ? ? ? ? ? ? if (periodic) +>> + ? ? ? ? ? ? ? ? ? ? ? tcon |= S3C2410_TCON_T4RELOAD; +>> + ? ? ? ? ? ? ? else +>> + ? ? ? ? ? ? ? ? ? ? ? tcon &= ~S3C2410_TCON_T4RELOAD; +>> + ? ? ? ? ? ? ? break; +>> + ? ? ? default: +>> + ? ? ? ? ? ? ? break; +>> + ? ? ? } +>> + ? ? ? __raw_writel(tcon, S3C2410_TCON); >> +} >> + >> +static int s5pv310_pwm_set_next_event(unsigned long cycles, ->> + struct clock_event_device *evt) +>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct clock_event_device *evt) >> +{ ->> + s5pv310_pwm_init(2, cycles); ->> + s5pv310_pwm_start(2, 0); ->> + return 0; +>> + ? ? ? s5pv310_pwm_init(2, cycles); +>> + ? ? ? s5pv310_pwm_start(2, 0); +>> + ? ? ? return 0; >> +} >> + >> +static void s5pv310_pwm_set_mode(enum clock_event_mode mode, ->> + struct clock_event_device *evt) +>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct clock_event_device *evt) >> +{ ->> + s5pv310_pwm_stop(2); ->> + ->> + switch (mode) { ->> + case CLOCK_EVT_MODE_PERIODIC: ->> + s5pv310_pwm_init(2, clock_count_per_tick); ->> + s5pv310_pwm_start(2, 1); ->> + break; ->> + case CLOCK_EVT_MODE_ONESHOT: ->> + break; ->> + case CLOCK_EVT_MODE_UNUSED: ->> + case CLOCK_EVT_MODE_SHUTDOWN: ->> + case CLOCK_EVT_MODE_RESUME: ->> + break; ->> + } +>> + ? ? ? s5pv310_pwm_stop(2); +>> + +>> + ? ? ? switch (mode) { +>> + ? ? ? case CLOCK_EVT_MODE_PERIODIC: +>> + ? ? ? ? ? ? ? s5pv310_pwm_init(2, clock_count_per_tick); +>> + ? ? ? ? ? ? ? s5pv310_pwm_start(2, 1); +>> + ? ? ? ? ? ? ? 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 pwm_event_device = { ->> + .name = "pwm_timer2", ->> + .features = CLOCK_EVT_FEAT_PERIODIC | +>> + ? ? ? .name ? ? ? ? ? = "pwm_timer2", +>> + ? ? ? .features ? ? ? = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, ->> + .rating = 200, ->> + .shift = 32, ->> + .set_next_event = s5pv310_pwm_set_next_event, ->> + .set_mode = s5pv310_pwm_set_mode, +>> + ? ? ? .rating ? ? ? ? = 200, +>> + ? ? ? .shift ? ? ? ? ?= 32, +>> + ? ? ? .set_next_event = s5pv310_pwm_set_next_event, +>> + ? ? ? .set_mode ? ? ? = s5pv310_pwm_set_mode, >> +}; >> + >> +irqreturn_t s5pv310_clock_event_isr(int irq, void *dev_id) >> +{ ->> + struct clock_event_device *evt = &pwm_event_device; +>> + ? ? ? struct clock_event_device *evt = &pwm_event_device; >> + ->> + evt->event_handler(evt); +>> + ? ? ? evt->event_handler(evt); >> + ->> + return IRQ_HANDLED; +>> + ? ? ? return IRQ_HANDLED; >> +} >> + >> +static struct irqaction s5pv310_clock_event_irq = { ->> + .name = "pwm_timer2_irq", ->> + .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, ->> + .handler = s5pv310_clock_event_isr, +>> + ? ? ? .name ? ? ? ? ? = "pwm_timer2_irq", +>> + ? ? ? .flags ? ? ? ? ?= IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, +>> + ? ? ? .handler ? ? ? ?= s5pv310_clock_event_isr, >> +}; >> + >> +static void __init s5pv310_clockevent_init(void) >> +{ ->> + unsigned long pclk; ->> + unsigned long clock_rate; ->> + struct clk *tscaler; +>> + ? ? ? unsigned long pclk; +>> + ? ? ? unsigned long clock_rate; +>> + ? ? ? struct clk *tscaler; >> + ->> + pclk = clk_get_rate(timerclk); +>> + ? ? ? pclk = clk_get_rate(timerclk); >> + ->> + /* configure clock tick */ +>> + ? ? ? /* configure clock tick */ >> + ->> + tscaler = clk_get_parent(tdiv2); +>> + ? ? ? tscaler = clk_get_parent(tdiv2); >> + ->> + clk_set_rate(tscaler, pclk / 2); ->> + clk_set_rate(tdiv2, pclk / 2); ->> + clk_set_parent(tin2, tdiv2); +>> + ? ? ? clk_set_rate(tscaler, pclk / 2); +>> + ? ? ? clk_set_rate(tdiv2, pclk / 2); +>> + ? ? ? clk_set_parent(tin2, tdiv2); >> + ->> + clock_rate = clk_get_rate(tin2); +>> + ? ? ? clock_rate = clk_get_rate(tin2); >> + ->> + clock_count_per_tick = clock_rate / HZ; +>> + ? ? ? clock_count_per_tick = clock_rate / HZ; >> + ->> + pwm_event_device.mult = ->> + div_sc(clock_rate, NSEC_PER_SEC, pwm_event_device.shift); ->> + pwm_event_device.max_delta_ns = ->> + clockevent_delta2ns(-1, &pwm_event_device); ->> + pwm_event_device.min_delta_ns = ->> + clockevent_delta2ns(1, &pwm_event_device); +>> + ? ? ? pwm_event_device.mult = +>> + ? ? ? ? ? ? ? div_sc(clock_rate, NSEC_PER_SEC, pwm_event_device.shift); +>> + ? ? ? pwm_event_device.max_delta_ns = +>> + ? ? ? ? ? ? ? clockevent_delta2ns(-1, &pwm_event_device); +>> + ? ? ? pwm_event_device.min_delta_ns = +>> + ? ? ? ? ? ? ? clockevent_delta2ns(1, &pwm_event_device); >> + ->> + pwm_event_device.cpumask = cpumask_of(0); ->> + clockevents_register_device(&pwm_event_device); +>> + ? ? ? pwm_event_device.cpumask = cpumask_of(0); +>> + ? ? ? clockevents_register_device(&pwm_event_device); >> + ->> + setup_irq(IRQ_TIMER2, &s5pv310_clock_event_irq); +>> + ? ? ? setup_irq(IRQ_TIMER2, &s5pv310_clock_event_irq); >> +} >> + >> +static cycle_t s5pv310_pwm4_read(struct clocksource *cs) >> +{ ->> + return (cycle_t) ~__raw_readl(S3C_TIMERREG(0x40)); +>> + ? ? ? return (cycle_t) ~__raw_readl(S3C_TIMERREG(0x40)); >> +} >> + >> +struct clocksource pwm_clocksource = { ->> + .name = "pwm_timer4", ->> + .rating = 250, ->> + .read = s5pv310_pwm4_read, ->> + .mask = CLOCKSOURCE_MASK(32), ->> + .shift = 20, ->> + .flags = CLOCK_SOURCE_IS_CONTINUOUS , +>> + ? ? ? .name ? ? ? ? ? = "pwm_timer4", +>> + ? ? ? .rating ? ? ? ? = 250, +>> + ? ? ? .read ? ? ? ? ? = s5pv310_pwm4_read, +>> + ? ? ? .mask ? ? ? ? ? = CLOCKSOURCE_MASK(32), +>> + ? ? ? .shift ? ? ? ? ?= 20, +>> + ? ? ? .flags ? ? ? ? ?= CLOCK_SOURCE_IS_CONTINUOUS , >> +}; >> + >> +static void __init s5pv310_clocksource_init(void) >> +{ ->> + unsigned long pclk; ->> + unsigned long clock_rate; +>> + ? ? ? unsigned long pclk; +>> + ? ? ? unsigned long clock_rate; >> + ->> + pclk = clk_get_rate(timerclk); +>> + ? ? ? pclk = clk_get_rate(timerclk); >> + ->> + clk_set_rate(tdiv4, pclk / 2); ->> + clk_set_parent(tin4, tdiv4); +>> + ? ? ? clk_set_rate(tdiv4, pclk / 2); +>> + ? ? ? clk_set_parent(tin4, tdiv4); >> + ->> + clock_rate = clk_get_rate(tin4); +>> + ? ? ? clock_rate = clk_get_rate(tin4); >> + ->> + s5pv310_pwm_init(4, ~0); ->> + s5pv310_pwm_start(4, 1); +>> + ? ? ? s5pv310_pwm_init(4, ~0); +>> + ? ? ? s5pv310_pwm_start(4, 1); >> + ->> + pwm_clocksource.mult = ->> + clocksource_khz2mult(clock_rate/1000, +>> + ? ? ? pwm_clocksource.mult = +>> + ? ? ? ? ? ? ? clocksource_khz2mult(clock_rate/1000, >pwm_clocksource.shift); >> + ->> + if (clocksource_register(&pwm_clocksource)) ->> + panic("%s: can't register clocksource\n", +>> + ? ? ? if (clocksource_register(&pwm_clocksource)) +>> + ? ? ? ? ? ? ? panic("%s: can't register clocksource\n", >pwm_clocksource.name); >> +} >> + >> +static void __init s5pv310_timer_resources(void) >> +{ ->> + struct platform_device tmpdev; +>> + ? ? ? struct platform_device tmpdev; >> + ->> + tmpdev.dev.bus = &platform_bus_type; +>> + ? ? ? tmpdev.dev.bus = &platform_bus_type; >> + ->> + timerclk = clk_get(NULL, "timers"); ->> + if (IS_ERR(timerclk)) ->> + panic("failed to get timers clock for system timer"); +>> + ? ? ? timerclk = clk_get(NULL, "timers"); +>> + ? ? ? if (IS_ERR(timerclk)) +>> + ? ? ? ? ? ? ? panic("failed to get timers clock for system timer"); >> + ->> + clk_enable(timerclk); +>> + ? ? ? clk_enable(timerclk); >> + ->> + tmpdev.id = 2; ->> + tin2 = clk_get(&tmpdev.dev, "pwm-tin"); ->> + if (IS_ERR(tin2)) ->> + panic("failed to get pwm-tin2 clock for system timer"); +>> + ? ? ? tmpdev.id = 2; +>> + ? ? ? tin2 = clk_get(&tmpdev.dev, "pwm-tin"); +>> + ? ? ? if (IS_ERR(tin2)) +>> + ? ? ? ? ? ? ? panic("failed to get pwm-tin2 clock for system timer"); >> + ->> + tdiv2 = clk_get(&tmpdev.dev, "pwm-tdiv"); ->> + if (IS_ERR(tdiv2)) ->> + panic("failed to get pwm-tdiv2 clock for system timer"); ->> + clk_enable(tin2); +>> + ? ? ? tdiv2 = clk_get(&tmpdev.dev, "pwm-tdiv"); +>> + ? ? ? if (IS_ERR(tdiv2)) +>> + ? ? ? ? ? ? ? panic("failed to get pwm-tdiv2 clock for system timer"); +>> + ? ? ? clk_enable(tin2); >> + ->> + tmpdev.id = 4; ->> + tin4 = clk_get(&tmpdev.dev, "pwm-tin"); ->> + if (IS_ERR(tin4)) ->> + panic("failed to get pwm-tin4 clock for system timer"); +>> + ? ? ? tmpdev.id = 4; +>> + ? ? ? tin4 = clk_get(&tmpdev.dev, "pwm-tin"); +>> + ? ? ? if (IS_ERR(tin4)) +>> + ? ? ? ? ? ? ? panic("failed to get pwm-tin4 clock for system timer"); >> + ->> + tdiv4 = clk_get(&tmpdev.dev, "pwm-tdiv"); ->> + if (IS_ERR(tdiv4)) ->> + panic("failed to get pwm-tdiv4 clock for system timer"); +>> + ? ? ? tdiv4 = clk_get(&tmpdev.dev, "pwm-tdiv"); +>> + ? ? ? if (IS_ERR(tdiv4)) +>> + ? ? ? ? ? ? ? panic("failed to get pwm-tdiv4 clock for system timer"); >> + ->> + clk_enable(tin4); +>> + ? ? ? clk_enable(tin4); >> +} >> + >> +static void __init s5pv310_timer_init(void) >> +{ >> +#ifdef CONFIG_LOCAL_TIMERS ->> + twd_base = S5P_VA_TWD; +>> + ? ? ? twd_base = S5P_VA_TWD; >> +#endif >> + ->> + s5pv310_timer_resources(); ->> + s5pv310_clockevent_init(); ->> + s5pv310_clocksource_init(); +>> + ? ? ? s5pv310_timer_resources(); +>> + ? ? ? s5pv310_clockevent_init(); +>> + ? ? ? s5pv310_clocksource_init(); >> +} >> + >> +struct sys_timer s5pv310_timer = { ->> + .init = s5pv310_timer_init, +>> + ? ? ? .init ? ? ? ? ? = s5pv310_timer_init, >> +}; >> diff --git a/arch/arm/plat-s5p/include/plat/s5pv310.h b/arch/arm/plat- >s5p/include/plat/s5pv310.h >> index d2f05e1..769c991 100644 >> --- a/arch/arm/plat-s5p/include/plat/s5pv310.h >> +++ b/arch/arm/plat-s5p/include/plat/s5pv310.h ->> @@ -22,6 +22,7 @@ extern int s5pv310_init(void); ->> extern void s5pv310_init_irq(void); ->> extern void s5pv310_map_io(void); ->> extern void s5pv310_init_clocks(int xtal); +>> @@ -22,6 +22,7 @@ extern ?int s5pv310_init(void); +>> ?extern void s5pv310_init_irq(void); +>> ?extern void s5pv310_map_io(void); +>> ?extern void s5pv310_init_clocks(int xtal); >> +extern struct sys_timer s5pv310_timer; >> ->> #define s5pv310_init_uarts s5pv310_common_init_uarts +>> ?#define s5pv310_init_uarts s5pv310_common_init_uarts >> >> diff --git a/arch/arm/plat-samsung/Makefile b/arch/arm/plat- >samsung/Makefile >> index b1d82cc..0d5bf8a 100644 >> --- a/arch/arm/plat-samsung/Makefile >> +++ b/arch/arm/plat-samsung/Makefile ->> @@ -12,7 +12,7 @@ obj- := ->> # Objects we always build independent of SoC choice +>> @@ -12,7 +12,7 @@ obj- ? ? ? ? ? ? ? ? ? ? ? ? ?:= +>> ?# Objects we always build independent of SoC choice >> ->> obj-y += init.o ->> -obj-y += time.o ->> +obj-$(CONFIG_ARCH_USES_GETTIMEOFFSET) += time.o ->> obj-y += clock.o ->> obj-y += pwm-clock.o ->> obj-y += gpio.o +>> ?obj-y ? ? ? ? ? ? ? ? ? ? ? ? ?+= init.o +>> -obj-y ? ? ? ? ? ? ? ? ? ? ? ? ?+= time.o +>> +obj-$(CONFIG_ARCH_USES_GETTIMEOFFSET) ? += time.o +>> ?obj-y ? ? ? ? ? ? ? ? ? ? ? ? ?+= clock.o +>> ?obj-y ? ? ? ? ? ? ? ? ? ? ? ? ?+= pwm-clock.o +>> ?obj-y ? ? ? ? ? ? ? ? ? ? ? ? ?+= gpio.o >> -- >> 1.6.2.5 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-samsung- >soc" in ->> the body of a message to majordomo@vger.kernel.org ->> More majordomo info at http://vger.kernel.org/majordomo-info.html +>> the body of a message to majordomo at vger.kernel.org +>> More majordomo info at ?http://vger.kernel.org/majordomo-info.html >> > >_______________________________________________ >linux-arm-kernel mailing list ->linux-arm-kernel@lists.infradead.org +>linux-arm-kernel at lists.infradead.org >http://lists.infradead.org/mailman/listinfo/linux-arm-kernel diff --git a/a/content_digest b/N1/content_digest index 9b47d79..69161bb 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -1,15 +1,9 @@ "ref\01280148176-8985-1-git-send-email-kgene.kim@samsung.com\0" "ref\0AANLkTimWqKc24fAE0G06rhupdGTyLJ5HY5rZRh8HOy6r@mail.gmail.com\0" - "From\0Sangbeom Kim <sbkim73@samsung.com>\0" - "Subject\0RE: [PATCH v4 5/8] ARM: S5PV310: Add Timer support\0" + "From\0sbkim73@samsung.com (Sangbeom Kim)\0" + "Subject\0[PATCH v4 5/8] ARM: S5PV310: Add Timer support\0" "Date\0Tue, 27 Jul 2010 13:12:16 +0900\0" - "To\0'Kyungmin Park' <kmpark@infradead.org>" - " 'Kukjin Kim' <kgene.kim@samsung.com>\0" - "Cc\0'Hyuk Lee' <hyuk1.lee@samsung.com>" - linux-samsung-soc@vger.kernel.org - 'Changhwan Youn' <chaos.youn@samsung.com> - ben-linux@fluff.org - " linux-arm-kernel@lists.infradead.org\0" + "To\0linux-arm-kernel@lists.infradead.org\0" "\00:1\0" "b\0" "Hi! Kyungmin,\n" @@ -42,7 +36,7 @@ ">On Mon, Jul 26, 2010 at 9:42 PM, Kukjin Kim <kgene.kim@samsung.com> wrote:\n" ">> From: Changhwan Youn <chaos.youn@samsung.com>\n" ">>\n" - ">> This patch adds timer support for S5PV310. \302\240Until now, all S5P SoCs\n" + ">> This patch adds timer support for S5PV310. ?Until now, all S5P SoCs\n" ">> use CONFIG_ARCH_USES_GETTIMEOFFSET macro as a default configuration.\n" ">> Instead,S5PV310 implements clocksource and clock_event_device to\n" ">> support the high resolution timer and tickless system.\n" @@ -54,18 +48,18 @@ ">> Changes since v3:\n" ">>\n" ">> - Changes clock source from PWM2 to PWM4 because PWM4 cannot be used for\n" - ">> \302\240other purpose such as external output function through GPIO.\n" + ">> ?other purpose such as external output function through GPIO.\n" ">>\n" - ">> \302\240arch/arm/mach-s5pv310/include/mach/pwm-clock.h | \302\240 70 ++++++\n" - ">> \302\240arch/arm/mach-s5pv310/localtimer.c \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 | \302\240 25 ++\n" - ">> \302\240arch/arm/mach-s5pv310/time.c \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 | \302\240287\n" + ">> ?arch/arm/mach-s5pv310/include/mach/pwm-clock.h | ? 70 ++++++\n" + ">> ?arch/arm/mach-s5pv310/localtimer.c ? ? ? ? ? ? | ? 25 ++\n" + ">> ?arch/arm/mach-s5pv310/time.c ? ? ? ? ? ? ? ? ? | ?287\n" ">++++++++++++++++++++++++\n" - ">> \302\240arch/arm/plat-s5p/include/plat/s5pv310.h \302\240 \302\240 \302\240 | \302\240 \302\2401 +\n" - ">> \302\240arch/arm/plat-samsung/Makefile \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 | \302\240 \302\2402 +-\n" - ">> \302\2405 files changed, 384 insertions(+), 1 deletions(-)\n" - ">> \302\240create mode 100644 arch/arm/mach-s5pv310/include/mach/pwm-clock.h\n" - ">> \302\240create mode 100644 arch/arm/mach-s5pv310/localtimer.c\n" - ">> \302\240create mode 100644 arch/arm/mach-s5pv310/time.c\n" + ">> ?arch/arm/plat-s5p/include/plat/s5pv310.h ? ? ? | ? ?1 +\n" + ">> ?arch/arm/plat-samsung/Makefile ? ? ? ? ? ? ? ? | ? ?2 +-\n" + ">> ?5 files changed, 384 insertions(+), 1 deletions(-)\n" + ">> ?create mode 100644 arch/arm/mach-s5pv310/include/mach/pwm-clock.h\n" + ">> ?create mode 100644 arch/arm/mach-s5pv310/localtimer.c\n" + ">> ?create mode 100644 arch/arm/mach-s5pv310/time.c\n" ">>\n" ">> diff --git a/arch/arm/mach-s5pv310/include/mach/pwm-clock.h\n" ">b/arch/arm/mach-s5pv310/include/mach/pwm-clock.h\n" @@ -77,12 +71,12 @@ ">> +/* linux/arch/arm/mach-s5pv310/include/mach/pwm-clock.h\n" ">> + *\n" ">> + * Copyright (c) 2010 Samsung Electronics Co., Ltd.\n" - ">> + * \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 http://www.samsung.com/\n" + ">> + * ? ? ? ? ? ? http://www.samsung.com/\n" ">> + *\n" ">> + * Copyright 2008 Openmoko, Inc.\n" ">> + * Copyright 2008 Simtec Electronics\n" - ">> + * \302\240 \302\240 \302\240Ben Dooks <ben@simtec.co.uk>\n" - ">> + * \302\240 \302\240 \302\240http://armlinux.simtec.co.uk/\n" + ">> + * ? ? ?Ben Dooks <ben@simtec.co.uk>\n" + ">> + * ? ? ?http://armlinux.simtec.co.uk/\n" ">> + *\n" ">> + * Based on arch/arm/mach-s3c64xx/include/mach/pwm-clock.h\n" ">> + *\n" @@ -105,7 +99,7 @@ ">> + */\n" ">> +static inline int pwm_cfg_src_is_tclk(unsigned long tcfg)\n" ">> +{\n" - ">> + \302\240 \302\240 \302\240 return tcfg == S3C64XX_TCFG1_MUX_TCLK;\n" + ">> + ? ? ? return tcfg == S3C64XX_TCFG1_MUX_TCLK;\n" ">> +}\n" ">> +\n" ">> +/**\n" @@ -117,7 +111,7 @@ ">> + */\n" ">> +static inline unsigned long tcfg_to_divisor(unsigned long tcfg1)\n" ">> +{\n" - ">> + \302\240 \302\240 \302\240 return 1 << tcfg1;\n" + ">> + ? ? ? return 1 << tcfg1;\n" ">> +}\n" ">> +\n" ">> +/**\n" @@ -127,7 +121,7 @@ ">> + */\n" ">> +static inline unsigned int pwm_tdiv_has_div1(void)\n" ">> +{\n" - ">> + \302\240 \302\240 \302\240 return 1;\n" + ">> + ? ? ? return 1;\n" ">> +}\n" ">> +\n" ">> +/**\n" @@ -138,7 +132,7 @@ ">> + */\n" ">> +static inline unsigned long pwm_tdiv_div_bits(unsigned int div)\n" ">> +{\n" - ">> + \302\240 \302\240 \302\240 return ilog2(div);\n" + ">> + ? ? ? return ilog2(div);\n" ">> +}\n" ">> +\n" ">> +#define S3C_TCFG1_MUX_TCLK S3C64XX_TCFG1_MUX_TCLK\n" @@ -155,8 +149,8 @@ ">> + *\n" ">> + * Cloned from linux/arch/arm/mach-realview/localtimer.c\n" ">> + *\n" - ">> + * \302\240Copyright (C) 2002 ARM Ltd.\n" - ">> + * \302\240All Rights Reserved\n" + ">> + * ?Copyright (C) 2002 ARM Ltd.\n" + ">> + * ?All Rights Reserved\n" ">> + *\n" ">> + * This program is free software; you can redistribute it and/or modify\n" ">> + * it under the terms of the GNU General Public License version 2 as\n" @@ -173,8 +167,8 @@ ">> + */\n" ">> +void __cpuinit local_timer_setup(struct clock_event_device *evt)\n" ">> +{\n" - ">> + \302\240 \302\240 \302\240 evt->irq = IRQ_LOCALTIMER;\n" - ">> + \302\240 \302\240 \302\240 twd_timer_setup(evt);\n" + ">> + ? ? ? evt->irq = IRQ_LOCALTIMER;\n" + ">> + ? ? ? twd_timer_setup(evt);\n" ">> +}\n" ">> diff --git a/arch/arm/mach-s5pv310/time.c b/arch/arm/mach-s5pv310/time.c\n" ">> new file mode 100644\n" @@ -185,7 +179,7 @@ ">> +/* linux/arch/arm/mach-s5pv310/time.c\n" ">> + *\n" ">> + * Copyright (c) 2010 Samsung Electronics Co., Ltd.\n" - ">> + * \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 http://www.samsung.com\n" + ">> + * ? ? ? ? ? ? http://www.samsung.com\n" ">> + *\n" ">> + * S5PV310 (and compatible) HRT support\n" ">> + * PWM 2/4 is used for this feature\n" @@ -219,299 +213,299 @@ ">> +\n" ">> +static void s5pv310_pwm_stop(unsigned int pwm_id)\n" ">> +{\n" - ">> + \302\240 \302\240 \302\240 unsigned long tcon;\n" - ">> +\n" - ">> + \302\240 \302\240 \302\240 tcon = __raw_readl(S3C2410_TCON);\n" - ">> +\n" - ">> + \302\240 \302\240 \302\240 switch (pwm_id) {\n" - ">> + \302\240 \302\240 \302\240 case 2:\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 tcon &= ~S3C2410_TCON_T2START;\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">> + \302\240 \302\240 \302\240 case 4:\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 tcon &= ~S3C2410_TCON_T4START;\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">> + \302\240 \302\240 \302\240 default:\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">> + \302\240 \302\240 \302\240 }\n" - ">> + \302\240 \302\240 \302\240 __raw_writel(tcon, S3C2410_TCON);\n" + ">> + ? ? ? unsigned long tcon;\n" + ">> +\n" + ">> + ? ? ? tcon = __raw_readl(S3C2410_TCON);\n" + ">> +\n" + ">> + ? ? ? switch (pwm_id) {\n" + ">> + ? ? ? case 2:\n" + ">> + ? ? ? ? ? ? ? tcon &= ~S3C2410_TCON_T2START;\n" + ">> + ? ? ? ? ? ? ? break;\n" + ">> + ? ? ? case 4:\n" + ">> + ? ? ? ? ? ? ? tcon &= ~S3C2410_TCON_T4START;\n" + ">> + ? ? ? ? ? ? ? break;\n" + ">> + ? ? ? default:\n" + ">> + ? ? ? ? ? ? ? break;\n" + ">> + ? ? ? }\n" + ">> + ? ? ? __raw_writel(tcon, S3C2410_TCON);\n" ">> +}\n" ">> +\n" ">> +static void s5pv310_pwm_init(unsigned int pwm_id, unsigned long tcnt)\n" ">> +{\n" - ">> + \302\240 \302\240 \302\240 unsigned long tcon;\n" + ">> + ? ? ? unsigned long tcon;\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 tcon = __raw_readl(S3C2410_TCON);\n" + ">> + ? ? ? tcon = __raw_readl(S3C2410_TCON);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 /* timers reload after counting zero, so reduce the count by 1 */\n" - ">> + \302\240 \302\240 \302\240 tcnt--;\n" + ">> + ? ? ? /* timers reload after counting zero, so reduce the count by 1 */\n" + ">> + ? ? ? tcnt--;\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 /* ensure timer is stopped... */\n" - ">> + \302\240 \302\240 \302\240 switch (pwm_id) {\n" - ">> + \302\240 \302\240 \302\240 case 2:\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 tcon &= ~(0xf<<12);\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 tcon |= S3C2410_TCON_T2MANUALUPD;\n" + ">> + ? ? ? /* ensure timer is stopped... */\n" + ">> + ? ? ? switch (pwm_id) {\n" + ">> + ? ? ? case 2:\n" + ">> + ? ? ? ? ? ? ? tcon &= ~(0xf<<12);\n" + ">> + ? ? ? ? ? ? ? tcon |= S3C2410_TCON_T2MANUALUPD;\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 __raw_writel(tcnt, S3C2410_TCNTB(2));\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 __raw_writel(tcnt, S3C2410_TCMPB(2));\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 __raw_writel(tcon, S3C2410_TCON);\n" + ">> + ? ? ? ? ? ? ? __raw_writel(tcnt, S3C2410_TCNTB(2));\n" + ">> + ? ? ? ? ? ? ? __raw_writel(tcnt, S3C2410_TCMPB(2));\n" + ">> + ? ? ? ? ? ? ? __raw_writel(tcon, S3C2410_TCON);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">> + \302\240 \302\240 \302\240 case 4:\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 tcon &= ~(7<<20);\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 tcon |= S3C2410_TCON_T4MANUALUPD;\n" + ">> + ? ? ? ? ? ? ? break;\n" + ">> + ? ? ? case 4:\n" + ">> + ? ? ? ? ? ? ? tcon &= ~(7<<20);\n" + ">> + ? ? ? ? ? ? ? tcon |= S3C2410_TCON_T4MANUALUPD;\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 __raw_writel(tcnt, S3C2410_TCNTB(4));\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 __raw_writel(tcnt, S3C2410_TCMPB(4));\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 __raw_writel(tcon, S3C2410_TCON);\n" + ">> + ? ? ? ? ? ? ? __raw_writel(tcnt, S3C2410_TCNTB(4));\n" + ">> + ? ? ? ? ? ? ? __raw_writel(tcnt, S3C2410_TCMPB(4));\n" + ">> + ? ? ? ? ? ? ? __raw_writel(tcon, S3C2410_TCON);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">> + \302\240 \302\240 \302\240 default:\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">> + \302\240 \302\240 \302\240 }\n" + ">> + ? ? ? ? ? ? ? break;\n" + ">> + ? ? ? default:\n" + ">> + ? ? ? ? ? ? ? break;\n" + ">> + ? ? ? }\n" ">> +}\n" ">> +\n" ">> +static inline void s5pv310_pwm_start(unsigned int pwm_id, bool periodic)\n" ">> +{\n" - ">> + \302\240 \302\240 \302\240 unsigned long tcon;\n" - ">> +\n" - ">> + \302\240 \302\240 \302\240 tcon \302\240= __raw_readl(S3C2410_TCON);\n" - ">> +\n" - ">> + \302\240 \302\240 \302\240 switch (pwm_id) {\n" - ">> + \302\240 \302\240 \302\240 case 2:\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 tcon |= S3C2410_TCON_T2START;\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 tcon &= ~S3C2410_TCON_T2MANUALUPD;\n" - ">> +\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 if (periodic)\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 tcon |= S3C2410_TCON_T2RELOAD;\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 else\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 tcon &= ~S3C2410_TCON_T2RELOAD;\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">> + \302\240 \302\240 \302\240 case 4:\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 tcon |= S3C2410_TCON_T4START;\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 tcon &= ~S3C2410_TCON_T4MANUALUPD;\n" - ">> +\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 if (periodic)\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 tcon |= S3C2410_TCON_T4RELOAD;\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 else\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 tcon &= ~S3C2410_TCON_T4RELOAD;\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">> + \302\240 \302\240 \302\240 default:\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">> + \302\240 \302\240 \302\240 }\n" - ">> + \302\240 \302\240 \302\240 __raw_writel(tcon, S3C2410_TCON);\n" + ">> + ? ? ? unsigned long tcon;\n" + ">> +\n" + ">> + ? ? ? tcon ?= __raw_readl(S3C2410_TCON);\n" + ">> +\n" + ">> + ? ? ? switch (pwm_id) {\n" + ">> + ? ? ? case 2:\n" + ">> + ? ? ? ? ? ? ? tcon |= S3C2410_TCON_T2START;\n" + ">> + ? ? ? ? ? ? ? tcon &= ~S3C2410_TCON_T2MANUALUPD;\n" + ">> +\n" + ">> + ? ? ? ? ? ? ? if (periodic)\n" + ">> + ? ? ? ? ? ? ? ? ? ? ? tcon |= S3C2410_TCON_T2RELOAD;\n" + ">> + ? ? ? ? ? ? ? else\n" + ">> + ? ? ? ? ? ? ? ? ? ? ? tcon &= ~S3C2410_TCON_T2RELOAD;\n" + ">> + ? ? ? ? ? ? ? break;\n" + ">> + ? ? ? case 4:\n" + ">> + ? ? ? ? ? ? ? tcon |= S3C2410_TCON_T4START;\n" + ">> + ? ? ? ? ? ? ? tcon &= ~S3C2410_TCON_T4MANUALUPD;\n" + ">> +\n" + ">> + ? ? ? ? ? ? ? if (periodic)\n" + ">> + ? ? ? ? ? ? ? ? ? ? ? tcon |= S3C2410_TCON_T4RELOAD;\n" + ">> + ? ? ? ? ? ? ? else\n" + ">> + ? ? ? ? ? ? ? ? ? ? ? tcon &= ~S3C2410_TCON_T4RELOAD;\n" + ">> + ? ? ? ? ? ? ? break;\n" + ">> + ? ? ? default:\n" + ">> + ? ? ? ? ? ? ? break;\n" + ">> + ? ? ? }\n" + ">> + ? ? ? __raw_writel(tcon, S3C2410_TCON);\n" ">> +}\n" ">> +\n" ">> +static int s5pv310_pwm_set_next_event(unsigned long cycles,\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 struct clock_event_device *evt)\n" + ">> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct clock_event_device *evt)\n" ">> +{\n" - ">> + \302\240 \302\240 \302\240 s5pv310_pwm_init(2, cycles);\n" - ">> + \302\240 \302\240 \302\240 s5pv310_pwm_start(2, 0);\n" - ">> + \302\240 \302\240 \302\240 return 0;\n" + ">> + ? ? ? s5pv310_pwm_init(2, cycles);\n" + ">> + ? ? ? s5pv310_pwm_start(2, 0);\n" + ">> + ? ? ? return 0;\n" ">> +}\n" ">> +\n" ">> +static void s5pv310_pwm_set_mode(enum clock_event_mode mode,\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 struct clock_event_device *evt)\n" + ">> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct clock_event_device *evt)\n" ">> +{\n" - ">> + \302\240 \302\240 \302\240 s5pv310_pwm_stop(2);\n" - ">> +\n" - ">> + \302\240 \302\240 \302\240 switch (mode) {\n" - ">> + \302\240 \302\240 \302\240 case CLOCK_EVT_MODE_PERIODIC:\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 s5pv310_pwm_init(2, clock_count_per_tick);\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 s5pv310_pwm_start(2, 1);\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">> + \302\240 \302\240 \302\240 case CLOCK_EVT_MODE_ONESHOT:\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">> + \302\240 \302\240 \302\240 case CLOCK_EVT_MODE_UNUSED:\n" - ">> + \302\240 \302\240 \302\240 case CLOCK_EVT_MODE_SHUTDOWN:\n" - ">> + \302\240 \302\240 \302\240 case CLOCK_EVT_MODE_RESUME:\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">> + \302\240 \302\240 \302\240 }\n" + ">> + ? ? ? s5pv310_pwm_stop(2);\n" + ">> +\n" + ">> + ? ? ? switch (mode) {\n" + ">> + ? ? ? case CLOCK_EVT_MODE_PERIODIC:\n" + ">> + ? ? ? ? ? ? ? s5pv310_pwm_init(2, clock_count_per_tick);\n" + ">> + ? ? ? ? ? ? ? s5pv310_pwm_start(2, 1);\n" + ">> + ? ? ? ? ? ? ? break;\n" + ">> + ? ? ? case CLOCK_EVT_MODE_ONESHOT:\n" + ">> + ? ? ? ? ? ? ? break;\n" + ">> + ? ? ? case CLOCK_EVT_MODE_UNUSED:\n" + ">> + ? ? ? case CLOCK_EVT_MODE_SHUTDOWN:\n" + ">> + ? ? ? case CLOCK_EVT_MODE_RESUME:\n" + ">> + ? ? ? ? ? ? ? break;\n" + ">> + ? ? ? }\n" ">> +}\n" ">> +\n" ">> +static struct clock_event_device pwm_event_device = {\n" - ">> + \302\240 \302\240 \302\240 .name \302\240 \302\240 \302\240 \302\240 \302\240 = \"pwm_timer2\",\n" - ">> + \302\240 \302\240 \302\240 .features \302\240 \302\240 \302\240 = CLOCK_EVT_FEAT_PERIODIC |\n" + ">> + ? ? ? .name ? ? ? ? ? = \"pwm_timer2\",\n" + ">> + ? ? ? .features ? ? ? = CLOCK_EVT_FEAT_PERIODIC |\n" "CLOCK_EVT_FEAT_ONESHOT,\n" - ">> + \302\240 \302\240 \302\240 .rating \302\240 \302\240 \302\240 \302\240 = 200,\n" - ">> + \302\240 \302\240 \302\240 .shift \302\240 \302\240 \302\240 \302\240 \302\240= 32,\n" - ">> + \302\240 \302\240 \302\240 .set_next_event = s5pv310_pwm_set_next_event,\n" - ">> + \302\240 \302\240 \302\240 .set_mode \302\240 \302\240 \302\240 = s5pv310_pwm_set_mode,\n" + ">> + ? ? ? .rating ? ? ? ? = 200,\n" + ">> + ? ? ? .shift ? ? ? ? ?= 32,\n" + ">> + ? ? ? .set_next_event = s5pv310_pwm_set_next_event,\n" + ">> + ? ? ? .set_mode ? ? ? = s5pv310_pwm_set_mode,\n" ">> +};\n" ">> +\n" ">> +irqreturn_t s5pv310_clock_event_isr(int irq, void *dev_id)\n" ">> +{\n" - ">> + \302\240 \302\240 \302\240 struct clock_event_device *evt = &pwm_event_device;\n" + ">> + ? ? ? struct clock_event_device *evt = &pwm_event_device;\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 evt->event_handler(evt);\n" + ">> + ? ? ? evt->event_handler(evt);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 return IRQ_HANDLED;\n" + ">> + ? ? ? return IRQ_HANDLED;\n" ">> +}\n" ">> +\n" ">> +static struct irqaction s5pv310_clock_event_irq = {\n" - ">> + \302\240 \302\240 \302\240 .name \302\240 \302\240 \302\240 \302\240 \302\240 = \"pwm_timer2_irq\",\n" - ">> + \302\240 \302\240 \302\240 .flags \302\240 \302\240 \302\240 \302\240 \302\240= IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,\n" - ">> + \302\240 \302\240 \302\240 .handler \302\240 \302\240 \302\240 \302\240= s5pv310_clock_event_isr,\n" + ">> + ? ? ? .name ? ? ? ? ? = \"pwm_timer2_irq\",\n" + ">> + ? ? ? .flags ? ? ? ? ?= IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,\n" + ">> + ? ? ? .handler ? ? ? ?= s5pv310_clock_event_isr,\n" ">> +};\n" ">> +\n" ">> +static void __init s5pv310_clockevent_init(void)\n" ">> +{\n" - ">> + \302\240 \302\240 \302\240 unsigned long pclk;\n" - ">> + \302\240 \302\240 \302\240 unsigned long clock_rate;\n" - ">> + \302\240 \302\240 \302\240 struct clk *tscaler;\n" + ">> + ? ? ? unsigned long pclk;\n" + ">> + ? ? ? unsigned long clock_rate;\n" + ">> + ? ? ? struct clk *tscaler;\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 pclk = clk_get_rate(timerclk);\n" + ">> + ? ? ? pclk = clk_get_rate(timerclk);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 /* configure clock tick */\n" + ">> + ? ? ? /* configure clock tick */\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 tscaler = clk_get_parent(tdiv2);\n" + ">> + ? ? ? tscaler = clk_get_parent(tdiv2);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 clk_set_rate(tscaler, pclk / 2);\n" - ">> + \302\240 \302\240 \302\240 clk_set_rate(tdiv2, pclk / 2);\n" - ">> + \302\240 \302\240 \302\240 clk_set_parent(tin2, tdiv2);\n" + ">> + ? ? ? clk_set_rate(tscaler, pclk / 2);\n" + ">> + ? ? ? clk_set_rate(tdiv2, pclk / 2);\n" + ">> + ? ? ? clk_set_parent(tin2, tdiv2);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 clock_rate = clk_get_rate(tin2);\n" + ">> + ? ? ? clock_rate = clk_get_rate(tin2);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 clock_count_per_tick = clock_rate / HZ;\n" + ">> + ? ? ? clock_count_per_tick = clock_rate / HZ;\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 pwm_event_device.mult =\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 div_sc(clock_rate, NSEC_PER_SEC, pwm_event_device.shift);\n" - ">> + \302\240 \302\240 \302\240 pwm_event_device.max_delta_ns =\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 clockevent_delta2ns(-1, &pwm_event_device);\n" - ">> + \302\240 \302\240 \302\240 pwm_event_device.min_delta_ns =\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 clockevent_delta2ns(1, &pwm_event_device);\n" + ">> + ? ? ? pwm_event_device.mult =\n" + ">> + ? ? ? ? ? ? ? div_sc(clock_rate, NSEC_PER_SEC, pwm_event_device.shift);\n" + ">> + ? ? ? pwm_event_device.max_delta_ns =\n" + ">> + ? ? ? ? ? ? ? clockevent_delta2ns(-1, &pwm_event_device);\n" + ">> + ? ? ? pwm_event_device.min_delta_ns =\n" + ">> + ? ? ? ? ? ? ? clockevent_delta2ns(1, &pwm_event_device);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 pwm_event_device.cpumask = cpumask_of(0);\n" - ">> + \302\240 \302\240 \302\240 clockevents_register_device(&pwm_event_device);\n" + ">> + ? ? ? pwm_event_device.cpumask = cpumask_of(0);\n" + ">> + ? ? ? clockevents_register_device(&pwm_event_device);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 setup_irq(IRQ_TIMER2, &s5pv310_clock_event_irq);\n" + ">> + ? ? ? setup_irq(IRQ_TIMER2, &s5pv310_clock_event_irq);\n" ">> +}\n" ">> +\n" ">> +static cycle_t s5pv310_pwm4_read(struct clocksource *cs)\n" ">> +{\n" - ">> + \302\240 \302\240 \302\240 return (cycle_t) ~__raw_readl(S3C_TIMERREG(0x40));\n" + ">> + ? ? ? return (cycle_t) ~__raw_readl(S3C_TIMERREG(0x40));\n" ">> +}\n" ">> +\n" ">> +struct clocksource pwm_clocksource = {\n" - ">> + \302\240 \302\240 \302\240 .name \302\240 \302\240 \302\240 \302\240 \302\240 = \"pwm_timer4\",\n" - ">> + \302\240 \302\240 \302\240 .rating \302\240 \302\240 \302\240 \302\240 = 250,\n" - ">> + \302\240 \302\240 \302\240 .read \302\240 \302\240 \302\240 \302\240 \302\240 = s5pv310_pwm4_read,\n" - ">> + \302\240 \302\240 \302\240 .mask \302\240 \302\240 \302\240 \302\240 \302\240 = CLOCKSOURCE_MASK(32),\n" - ">> + \302\240 \302\240 \302\240 .shift \302\240 \302\240 \302\240 \302\240 \302\240= 20,\n" - ">> + \302\240 \302\240 \302\240 .flags \302\240 \302\240 \302\240 \302\240 \302\240= CLOCK_SOURCE_IS_CONTINUOUS ,\n" + ">> + ? ? ? .name ? ? ? ? ? = \"pwm_timer4\",\n" + ">> + ? ? ? .rating ? ? ? ? = 250,\n" + ">> + ? ? ? .read ? ? ? ? ? = s5pv310_pwm4_read,\n" + ">> + ? ? ? .mask ? ? ? ? ? = CLOCKSOURCE_MASK(32),\n" + ">> + ? ? ? .shift ? ? ? ? ?= 20,\n" + ">> + ? ? ? .flags ? ? ? ? ?= CLOCK_SOURCE_IS_CONTINUOUS ,\n" ">> +};\n" ">> +\n" ">> +static void __init s5pv310_clocksource_init(void)\n" ">> +{\n" - ">> + \302\240 \302\240 \302\240 unsigned long pclk;\n" - ">> + \302\240 \302\240 \302\240 unsigned long clock_rate;\n" + ">> + ? ? ? unsigned long pclk;\n" + ">> + ? ? ? unsigned long clock_rate;\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 pclk = clk_get_rate(timerclk);\n" + ">> + ? ? ? pclk = clk_get_rate(timerclk);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 clk_set_rate(tdiv4, pclk / 2);\n" - ">> + \302\240 \302\240 \302\240 clk_set_parent(tin4, tdiv4);\n" + ">> + ? ? ? clk_set_rate(tdiv4, pclk / 2);\n" + ">> + ? ? ? clk_set_parent(tin4, tdiv4);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 clock_rate = clk_get_rate(tin4);\n" + ">> + ? ? ? clock_rate = clk_get_rate(tin4);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 s5pv310_pwm_init(4, ~0);\n" - ">> + \302\240 \302\240 \302\240 s5pv310_pwm_start(4, 1);\n" + ">> + ? ? ? s5pv310_pwm_init(4, ~0);\n" + ">> + ? ? ? s5pv310_pwm_start(4, 1);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 pwm_clocksource.mult =\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 clocksource_khz2mult(clock_rate/1000,\n" + ">> + ? ? ? pwm_clocksource.mult =\n" + ">> + ? ? ? ? ? ? ? clocksource_khz2mult(clock_rate/1000,\n" ">pwm_clocksource.shift);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 if (clocksource_register(&pwm_clocksource))\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 panic(\"%s: can't register clocksource\\n\",\n" + ">> + ? ? ? if (clocksource_register(&pwm_clocksource))\n" + ">> + ? ? ? ? ? ? ? panic(\"%s: can't register clocksource\\n\",\n" ">pwm_clocksource.name);\n" ">> +}\n" ">> +\n" ">> +static void __init s5pv310_timer_resources(void)\n" ">> +{\n" - ">> + \302\240 \302\240 \302\240 struct platform_device tmpdev;\n" + ">> + ? ? ? struct platform_device tmpdev;\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 tmpdev.dev.bus = &platform_bus_type;\n" + ">> + ? ? ? tmpdev.dev.bus = &platform_bus_type;\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 timerclk = clk_get(NULL, \"timers\");\n" - ">> + \302\240 \302\240 \302\240 if (IS_ERR(timerclk))\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 panic(\"failed to get timers clock for system timer\");\n" + ">> + ? ? ? timerclk = clk_get(NULL, \"timers\");\n" + ">> + ? ? ? if (IS_ERR(timerclk))\n" + ">> + ? ? ? ? ? ? ? panic(\"failed to get timers clock for system timer\");\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 clk_enable(timerclk);\n" + ">> + ? ? ? clk_enable(timerclk);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 tmpdev.id = 2;\n" - ">> + \302\240 \302\240 \302\240 tin2 = clk_get(&tmpdev.dev, \"pwm-tin\");\n" - ">> + \302\240 \302\240 \302\240 if (IS_ERR(tin2))\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 panic(\"failed to get pwm-tin2 clock for system timer\");\n" + ">> + ? ? ? tmpdev.id = 2;\n" + ">> + ? ? ? tin2 = clk_get(&tmpdev.dev, \"pwm-tin\");\n" + ">> + ? ? ? if (IS_ERR(tin2))\n" + ">> + ? ? ? ? ? ? ? panic(\"failed to get pwm-tin2 clock for system timer\");\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 tdiv2 = clk_get(&tmpdev.dev, \"pwm-tdiv\");\n" - ">> + \302\240 \302\240 \302\240 if (IS_ERR(tdiv2))\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 panic(\"failed to get pwm-tdiv2 clock for system timer\");\n" - ">> + \302\240 \302\240 \302\240 clk_enable(tin2);\n" + ">> + ? ? ? tdiv2 = clk_get(&tmpdev.dev, \"pwm-tdiv\");\n" + ">> + ? ? ? if (IS_ERR(tdiv2))\n" + ">> + ? ? ? ? ? ? ? panic(\"failed to get pwm-tdiv2 clock for system timer\");\n" + ">> + ? ? ? clk_enable(tin2);\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 tmpdev.id = 4;\n" - ">> + \302\240 \302\240 \302\240 tin4 = clk_get(&tmpdev.dev, \"pwm-tin\");\n" - ">> + \302\240 \302\240 \302\240 if (IS_ERR(tin4))\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 panic(\"failed to get pwm-tin4 clock for system timer\");\n" + ">> + ? ? ? tmpdev.id = 4;\n" + ">> + ? ? ? tin4 = clk_get(&tmpdev.dev, \"pwm-tin\");\n" + ">> + ? ? ? if (IS_ERR(tin4))\n" + ">> + ? ? ? ? ? ? ? panic(\"failed to get pwm-tin4 clock for system timer\");\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 tdiv4 = clk_get(&tmpdev.dev, \"pwm-tdiv\");\n" - ">> + \302\240 \302\240 \302\240 if (IS_ERR(tdiv4))\n" - ">> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 panic(\"failed to get pwm-tdiv4 clock for system timer\");\n" + ">> + ? ? ? tdiv4 = clk_get(&tmpdev.dev, \"pwm-tdiv\");\n" + ">> + ? ? ? if (IS_ERR(tdiv4))\n" + ">> + ? ? ? ? ? ? ? panic(\"failed to get pwm-tdiv4 clock for system timer\");\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 clk_enable(tin4);\n" + ">> + ? ? ? clk_enable(tin4);\n" ">> +}\n" ">> +\n" ">> +static void __init s5pv310_timer_init(void)\n" ">> +{\n" ">> +#ifdef CONFIG_LOCAL_TIMERS\n" - ">> + \302\240 \302\240 \302\240 twd_base = S5P_VA_TWD;\n" + ">> + ? ? ? twd_base = S5P_VA_TWD;\n" ">> +#endif\n" ">> +\n" - ">> + \302\240 \302\240 \302\240 s5pv310_timer_resources();\n" - ">> + \302\240 \302\240 \302\240 s5pv310_clockevent_init();\n" - ">> + \302\240 \302\240 \302\240 s5pv310_clocksource_init();\n" + ">> + ? ? ? s5pv310_timer_resources();\n" + ">> + ? ? ? s5pv310_clockevent_init();\n" + ">> + ? ? ? s5pv310_clocksource_init();\n" ">> +}\n" ">> +\n" ">> +struct sys_timer s5pv310_timer = {\n" - ">> + \302\240 \302\240 \302\240 .init \302\240 \302\240 \302\240 \302\240 \302\240 = s5pv310_timer_init,\n" + ">> + ? ? ? .init ? ? ? ? ? = s5pv310_timer_init,\n" ">> +};\n" ">> diff --git a/arch/arm/plat-s5p/include/plat/s5pv310.h b/arch/arm/plat-\n" ">s5p/include/plat/s5pv310.h\n" ">> index d2f05e1..769c991 100644\n" ">> --- a/arch/arm/plat-s5p/include/plat/s5pv310.h\n" ">> +++ b/arch/arm/plat-s5p/include/plat/s5pv310.h\n" - ">> @@ -22,6 +22,7 @@ extern \302\240int s5pv310_init(void);\n" - ">> \302\240extern void s5pv310_init_irq(void);\n" - ">> \302\240extern void s5pv310_map_io(void);\n" - ">> \302\240extern void s5pv310_init_clocks(int xtal);\n" + ">> @@ -22,6 +22,7 @@ extern ?int s5pv310_init(void);\n" + ">> ?extern void s5pv310_init_irq(void);\n" + ">> ?extern void s5pv310_map_io(void);\n" + ">> ?extern void s5pv310_init_clocks(int xtal);\n" ">> +extern struct sys_timer s5pv310_timer;\n" ">>\n" - ">> \302\240#define s5pv310_init_uarts s5pv310_common_init_uarts\n" + ">> ?#define s5pv310_init_uarts s5pv310_common_init_uarts\n" ">>\n" ">> diff --git a/arch/arm/plat-samsung/Makefile b/arch/arm/plat-\n" ">samsung/Makefile\n" ">> index b1d82cc..0d5bf8a 100644\n" ">> --- a/arch/arm/plat-samsung/Makefile\n" ">> +++ b/arch/arm/plat-samsung/Makefile\n" - ">> @@ -12,7 +12,7 @@ obj- \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240:=\n" - ">> \302\240# Objects we always build independent of SoC choice\n" + ">> @@ -12,7 +12,7 @@ obj- ? ? ? ? ? ? ? ? ? ? ? ? ?:=\n" + ">> ?# Objects we always build independent of SoC choice\n" ">>\n" - ">> \302\240obj-y \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240+= init.o\n" - ">> -obj-y \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240+= time.o\n" - ">> +obj-$(CONFIG_ARCH_USES_GETTIMEOFFSET) \302\240 += time.o\n" - ">> \302\240obj-y \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240+= clock.o\n" - ">> \302\240obj-y \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240+= pwm-clock.o\n" - ">> \302\240obj-y \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240+= gpio.o\n" + ">> ?obj-y ? ? ? ? ? ? ? ? ? ? ? ? ?+= init.o\n" + ">> -obj-y ? ? ? ? ? ? ? ? ? ? ? ? ?+= time.o\n" + ">> +obj-$(CONFIG_ARCH_USES_GETTIMEOFFSET) ? += time.o\n" + ">> ?obj-y ? ? ? ? ? ? ? ? ? ? ? ? ?+= clock.o\n" + ">> ?obj-y ? ? ? ? ? ? ? ? ? ? ? ? ?+= pwm-clock.o\n" + ">> ?obj-y ? ? ? ? ? ? ? ? ? ? ? ? ?+= gpio.o\n" ">> --\n" ">> 1.6.2.5\n" ">>\n" ">> --\n" ">> To unsubscribe from this list: send the line \"unsubscribe linux-samsung-\n" ">soc\" in\n" - ">> the body of a message to majordomo@vger.kernel.org\n" - ">> More majordomo info at \302\240http://vger.kernel.org/majordomo-info.html\n" + ">> the body of a message to majordomo at vger.kernel.org\n" + ">> More majordomo info at ?http://vger.kernel.org/majordomo-info.html\n" ">>\n" ">\n" ">_______________________________________________\n" ">linux-arm-kernel mailing list\n" - ">linux-arm-kernel@lists.infradead.org\n" + ">linux-arm-kernel at lists.infradead.org\n" >http://lists.infradead.org/mailman/listinfo/linux-arm-kernel -3ae4cd584723bd97c74dd10615f14b7a224bfbd7134af41d7c06cccdaa2f13ab +382e8fdf7efccff587e218783ba15444540bf5e59f44c26a8fa8ebb669224781
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.