diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-05-23 14:28:04 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-05-23 14:28:04 -0400 |
commit | 9a55d9752d8abfc62f1ab05ccc790d22a0c8e7c0 (patch) | |
tree | 894bb6a3fb409c6ac5f0374f5a1f656918bc35cd /arch/arm/plat-samsung | |
parent | ec19628d72cff8f80220b7cedba089074ac6a599 (diff) | |
parent | dc7ad3b3d5f1cd0a0d16c05dd3ad3898979d261e (diff) |
Merge branch 'devel-stable' into for-linus
Conflicts:
arch/arm/Kconfig
arch/arm/mach-ns9xxx/include/mach/uncompress.h
Diffstat (limited to 'arch/arm/plat-samsung')
-rw-r--r-- | arch/arm/plat-samsung/Kconfig | 1 | ||||
-rw-r--r-- | arch/arm/plat-samsung/include/plat/irq-vic-timer.h | 2 | ||||
-rw-r--r-- | arch/arm/plat-samsung/include/plat/uncompress.h | 4 | ||||
-rw-r--r-- | arch/arm/plat-samsung/irq-uart.c | 83 | ||||
-rw-r--r-- | arch/arm/plat-samsung/irq-vic-timer.c | 69 |
5 files changed, 42 insertions, 117 deletions
diff --git a/arch/arm/plat-samsung/Kconfig b/arch/arm/plat-samsung/Kconfig index be72100b81b4..4d79519d19a4 100644 --- a/arch/arm/plat-samsung/Kconfig +++ b/arch/arm/plat-samsung/Kconfig | |||
@@ -8,6 +8,7 @@ config PLAT_SAMSUNG | |||
8 | bool | 8 | bool |
9 | depends on PLAT_S3C24XX || ARCH_S3C64XX || PLAT_S5P | 9 | depends on PLAT_S3C24XX || ARCH_S3C64XX || PLAT_S5P |
10 | select NO_IOPORT | 10 | select NO_IOPORT |
11 | select GENERIC_IRQ_CHIP | ||
11 | default y | 12 | default y |
12 | help | 13 | help |
13 | Base platform code for all Samsung SoC based systems | 14 | Base platform code for all Samsung SoC based systems |
diff --git a/arch/arm/plat-samsung/include/plat/irq-vic-timer.h b/arch/arm/plat-samsung/include/plat/irq-vic-timer.h index a90b53431b5b..5b9c42fd32d7 100644 --- a/arch/arm/plat-samsung/include/plat/irq-vic-timer.h +++ b/arch/arm/plat-samsung/include/plat/irq-vic-timer.h | |||
@@ -10,4 +10,4 @@ | |||
10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | extern void s3c_init_vic_timer_irq(unsigned int vic, unsigned int timer); | 13 | extern void s3c_init_vic_timer_irq(unsigned int num, unsigned int timer_irq); |
diff --git a/arch/arm/plat-samsung/include/plat/uncompress.h b/arch/arm/plat-samsung/include/plat/uncompress.h index 7d6ed7263d57..ee48e12a1e72 100644 --- a/arch/arm/plat-samsung/include/plat/uncompress.h +++ b/arch/arm/plat-samsung/include/plat/uncompress.h | |||
@@ -18,8 +18,8 @@ typedef unsigned int upf_t; /* cannot include linux/serial_core.h */ | |||
18 | 18 | ||
19 | /* uart setup */ | 19 | /* uart setup */ |
20 | 20 | ||
21 | static unsigned int fifo_mask; | 21 | unsigned int fifo_mask; |
22 | static unsigned int fifo_max; | 22 | unsigned int fifo_max; |
23 | 23 | ||
24 | /* forward declerations */ | 24 | /* forward declerations */ |
25 | 25 | ||
diff --git a/arch/arm/plat-samsung/irq-uart.c b/arch/arm/plat-samsung/irq-uart.c index 4d4e571af553..32582c0958e3 100644 --- a/arch/arm/plat-samsung/irq-uart.c +++ b/arch/arm/plat-samsung/irq-uart.c | |||
@@ -27,60 +27,6 @@ | |||
27 | /* Note, we make use of the fact that the parent IRQs, IRQ_UART[0..3] | 27 | /* Note, we make use of the fact that the parent IRQs, IRQ_UART[0..3] |
28 | * are consecutive when looking up the interrupt in the demux routines. | 28 | * are consecutive when looking up the interrupt in the demux routines. |
29 | */ | 29 | */ |
30 | |||
31 | static inline void __iomem *s3c_irq_uart_base(struct irq_data *data) | ||
32 | { | ||
33 | struct s3c_uart_irq *uirq = irq_data_get_irq_chip_data(data); | ||
34 | return uirq->regs; | ||
35 | } | ||
36 | |||
37 | static inline unsigned int s3c_irq_uart_bit(unsigned int irq) | ||
38 | { | ||
39 | return irq & 3; | ||
40 | } | ||
41 | |||
42 | static void s3c_irq_uart_mask(struct irq_data *data) | ||
43 | { | ||
44 | void __iomem *regs = s3c_irq_uart_base(data); | ||
45 | unsigned int bit = s3c_irq_uart_bit(data->irq); | ||
46 | u32 reg; | ||
47 | |||
48 | reg = __raw_readl(regs + S3C64XX_UINTM); | ||
49 | reg |= (1 << bit); | ||
50 | __raw_writel(reg, regs + S3C64XX_UINTM); | ||
51 | } | ||
52 | |||
53 | static void s3c_irq_uart_maskack(struct irq_data *data) | ||
54 | { | ||
55 | void __iomem *regs = s3c_irq_uart_base(data); | ||
56 | unsigned int bit = s3c_irq_uart_bit(data->irq); | ||
57 | u32 reg; | ||
58 | |||
59 | reg = __raw_readl(regs + S3C64XX_UINTM); | ||
60 | reg |= (1 << bit); | ||
61 | __raw_writel(reg, regs + S3C64XX_UINTM); | ||
62 | __raw_writel(1 << bit, regs + S3C64XX_UINTP); | ||
63 | } | ||
64 | |||
65 | static void s3c_irq_uart_unmask(struct irq_data *data) | ||
66 | { | ||
67 | void __iomem *regs = s3c_irq_uart_base(data); | ||
68 | unsigned int bit = s3c_irq_uart_bit(data->irq); | ||
69 | u32 reg; | ||
70 | |||
71 | reg = __raw_readl(regs + S3C64XX_UINTM); | ||
72 | reg &= ~(1 << bit); | ||
73 | __raw_writel(reg, regs + S3C64XX_UINTM); | ||
74 | } | ||
75 | |||
76 | static void s3c_irq_uart_ack(struct irq_data *data) | ||
77 | { | ||
78 | void __iomem *regs = s3c_irq_uart_base(data); | ||
79 | unsigned int bit = s3c_irq_uart_bit(data->irq); | ||
80 | |||
81 | __raw_writel(1 << bit, regs + S3C64XX_UINTP); | ||
82 | } | ||
83 | |||
84 | static void s3c_irq_demux_uart(unsigned int irq, struct irq_desc *desc) | 30 | static void s3c_irq_demux_uart(unsigned int irq, struct irq_desc *desc) |
85 | { | 31 | { |
86 | struct s3c_uart_irq *uirq = desc->irq_data.handler_data; | 32 | struct s3c_uart_irq *uirq = desc->irq_data.handler_data; |
@@ -97,30 +43,25 @@ static void s3c_irq_demux_uart(unsigned int irq, struct irq_desc *desc) | |||
97 | generic_handle_irq(base + 3); | 43 | generic_handle_irq(base + 3); |
98 | } | 44 | } |
99 | 45 | ||
100 | static struct irq_chip s3c_irq_uart = { | ||
101 | .name = "s3c-uart", | ||
102 | .irq_mask = s3c_irq_uart_mask, | ||
103 | .irq_unmask = s3c_irq_uart_unmask, | ||
104 | .irq_mask_ack = s3c_irq_uart_maskack, | ||
105 | .irq_ack = s3c_irq_uart_ack, | ||
106 | }; | ||
107 | |||
108 | static void __init s3c_init_uart_irq(struct s3c_uart_irq *uirq) | 46 | static void __init s3c_init_uart_irq(struct s3c_uart_irq *uirq) |
109 | { | 47 | { |
110 | void __iomem *reg_base = uirq->regs; | 48 | void __iomem *reg_base = uirq->regs; |
111 | unsigned int irq; | 49 | struct irq_chip_generic *gc; |
112 | int offs; | 50 | struct irq_chip_type *ct; |
113 | 51 | ||
114 | /* mask all interrupts at the start. */ | 52 | /* mask all interrupts at the start. */ |
115 | __raw_writel(0xf, reg_base + S3C64XX_UINTM); | 53 | __raw_writel(0xf, reg_base + S3C64XX_UINTM); |
116 | 54 | ||
117 | for (offs = 0; offs < 3; offs++) { | 55 | gc = irq_alloc_generic_chip("s3c-uart", 1, uirq->base_irq, reg_base, |
118 | irq = uirq->base_irq + offs; | 56 | handle_level_irq); |
119 | 57 | ct = gc->chip_types; | |
120 | irq_set_chip_and_handler(irq, &s3c_irq_uart, handle_level_irq); | 58 | ct->chip.irq_ack = irq_gc_ack; |
121 | irq_set_chip_data(irq, uirq); | 59 | ct->chip.irq_mask = irq_gc_mask_set_bit; |
122 | set_irq_flags(irq, IRQF_VALID); | 60 | ct->chip.irq_unmask = irq_gc_mask_clr_bit; |
123 | } | 61 | ct->regs.ack = S3C64XX_UINTP; |
62 | ct->regs.mask = S3C64XX_UINTM; | ||
63 | irq_setup_generic_chip(gc, IRQ_MSK(4), IRQ_GC_INIT_MASK_CACHE, | ||
64 | IRQ_NOREQUEST | IRQ_NOPROBE, 0); | ||
124 | 65 | ||
125 | irq_set_handler_data(uirq->parent_irq, uirq); | 66 | irq_set_handler_data(uirq->parent_irq, uirq); |
126 | irq_set_chained_handler(uirq->parent_irq, s3c_irq_demux_uart); | 67 | irq_set_chained_handler(uirq->parent_irq, s3c_irq_demux_uart); |
diff --git a/arch/arm/plat-samsung/irq-vic-timer.c b/arch/arm/plat-samsung/irq-vic-timer.c index d6ad66ab9290..a607546ddbd0 100644 --- a/arch/arm/plat-samsung/irq-vic-timer.c +++ b/arch/arm/plat-samsung/irq-vic-timer.c | |||
@@ -28,60 +28,43 @@ static void s3c_irq_demux_vic_timer(unsigned int irq, struct irq_desc *desc) | |||
28 | } | 28 | } |
29 | 29 | ||
30 | /* We assume the IRQ_TIMER0..IRQ_TIMER4 range is continuous. */ | 30 | /* We assume the IRQ_TIMER0..IRQ_TIMER4 range is continuous. */ |
31 | 31 | static void s3c_irq_timer_ack(struct irq_data *d) | |
32 | static void s3c_irq_timer_mask(struct irq_data *data) | ||
33 | { | ||
34 | u32 reg = __raw_readl(S3C64XX_TINT_CSTAT); | ||
35 | u32 mask = (u32)data->chip_data; | ||
36 | |||
37 | reg &= 0x1f; /* mask out pending interrupts */ | ||
38 | reg &= ~mask; | ||
39 | __raw_writel(reg, S3C64XX_TINT_CSTAT); | ||
40 | } | ||
41 | |||
42 | static void s3c_irq_timer_unmask(struct irq_data *data) | ||
43 | { | 32 | { |
44 | u32 reg = __raw_readl(S3C64XX_TINT_CSTAT); | 33 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); |
45 | u32 mask = (u32)data->chip_data; | 34 | u32 mask = (1 << 5) << (d->irq - gc->irq_base); |
46 | 35 | ||
47 | reg &= 0x1f; /* mask out pending interrupts */ | 36 | irq_reg_writel(mask | gc->mask_cache, gc->reg_base); |
48 | reg |= mask; | ||
49 | __raw_writel(reg, S3C64XX_TINT_CSTAT); | ||
50 | } | 37 | } |
51 | 38 | ||
52 | static void s3c_irq_timer_ack(struct irq_data *data) | ||
53 | { | ||
54 | u32 reg = __raw_readl(S3C64XX_TINT_CSTAT); | ||
55 | u32 mask = (u32)data->chip_data; | ||
56 | |||
57 | reg &= 0x1f; | ||
58 | reg |= mask << 5; | ||
59 | __raw_writel(reg, S3C64XX_TINT_CSTAT); | ||
60 | } | ||
61 | |||
62 | static struct irq_chip s3c_irq_timer = { | ||
63 | .name = "s3c-timer", | ||
64 | .irq_mask = s3c_irq_timer_mask, | ||
65 | .irq_unmask = s3c_irq_timer_unmask, | ||
66 | .irq_ack = s3c_irq_timer_ack, | ||
67 | }; | ||
68 | |||
69 | /** | 39 | /** |
70 | * s3c_init_vic_timer_irq() - initialise timer irq chanined off VIC.\ | 40 | * s3c_init_vic_timer_irq() - initialise timer irq chanined off VIC.\ |
71 | * @parent_irq: The parent IRQ on the VIC for the timer. | 41 | * @num: Number of timers to initialize |
72 | * @timer_irq: The IRQ to be used for the timer. | 42 | * @timer_irq: Base IRQ number to be used for the timers. |
73 | * | 43 | * |
74 | * Register the necessary IRQ chaining and support for the timer IRQs | 44 | * Register the necessary IRQ chaining and support for the timer IRQs |
75 | * chained of the VIC. | 45 | * chained of the VIC. |
76 | */ | 46 | */ |
77 | void __init s3c_init_vic_timer_irq(unsigned int parent_irq, | 47 | void __init s3c_init_vic_timer_irq(unsigned int num, unsigned int timer_irq) |
78 | unsigned int timer_irq) | ||
79 | { | 48 | { |
49 | unsigned int pirq[5] = { IRQ_TIMER0_VIC, IRQ_TIMER1_VIC, IRQ_TIMER2_VIC, | ||
50 | IRQ_TIMER3_VIC, IRQ_TIMER4_VIC }; | ||
51 | struct irq_chip_generic *s3c_tgc; | ||
52 | struct irq_chip_type *ct; | ||
53 | unsigned int i; | ||
80 | 54 | ||
81 | irq_set_chained_handler(parent_irq, s3c_irq_demux_vic_timer); | 55 | s3c_tgc = irq_alloc_generic_chip("s3c-timer", 1, timer_irq, |
82 | irq_set_handler_data(parent_irq, (void *)timer_irq); | 56 | S3C64XX_TINT_CSTAT, handle_level_irq); |
57 | ct = s3c_tgc->chip_types; | ||
58 | ct->chip.irq_mask = irq_gc_mask_clr_bit; | ||
59 | ct->chip.irq_unmask = irq_gc_mask_set_bit; | ||
60 | ct->chip.irq_ack = s3c_irq_timer_ack; | ||
61 | irq_setup_generic_chip(s3c_tgc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE, | ||
62 | IRQ_NOREQUEST | IRQ_NOPROBE, 0); | ||
63 | /* Clear the upper bits of the mask_cache*/ | ||
64 | s3c_tgc->mask_cache &= 0x1f; | ||
83 | 65 | ||
84 | irq_set_chip_and_handler(timer_irq, &s3c_irq_timer, handle_level_irq); | 66 | for (i = 0; i < num; i++, timer_irq++) { |
85 | irq_set_chip_data(timer_irq, (void *)(1 << (timer_irq - IRQ_TIMER0))); | 67 | irq_set_chained_handler(pirq[i], s3c_irq_demux_vic_timer); |
86 | set_irq_flags(timer_irq, IRQF_VALID); | 68 | irq_set_handler_data(pirq[i], (void *)timer_irq); |
69 | } | ||
87 | } | 70 | } |