~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to arch/arm/plat-samsung/irq-vic-timer.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
}
29
29
 
30
30
/* We assume the IRQ_TIMER0..IRQ_TIMER4 range is continuous. */
31
 
 
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
 
{
44
 
        u32 reg = __raw_readl(S3C64XX_TINT_CSTAT);
45
 
        u32 mask = (u32)data->chip_data;
46
 
 
47
 
        reg &= 0x1f;  /* mask out pending interrupts */
48
 
        reg |= mask;
49
 
        __raw_writel(reg, S3C64XX_TINT_CSTAT);
50
 
}
51
 
 
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
 
};
 
31
static void s3c_irq_timer_ack(struct irq_data *d)
 
32
{
 
33
        struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 
34
        u32 mask = (1 << 5) << (d->irq - gc->irq_base);
 
35
 
 
36
        irq_reg_writel(mask | gc->mask_cache, gc->reg_base);
 
37
}
68
38
 
69
39
/**
70
40
 * s3c_init_vic_timer_irq() - initialise timer irq chanined off VIC.\
71
 
 * @parent_irq: The parent IRQ on the VIC for the timer.
72
 
 * @timer_irq: The IRQ to be used for the timer.
 
41
 * @num: Number of timers to initialize
 
42
 * @timer_irq: Base IRQ number to be used for the timers.
73
43
 *
74
44
 * Register the necessary IRQ chaining and support for the timer IRQs
75
45
 * chained of the VIC.
76
46
 */
77
 
void __init s3c_init_vic_timer_irq(unsigned int parent_irq,
78
 
                                   unsigned int timer_irq)
 
47
void __init s3c_init_vic_timer_irq(unsigned int num, unsigned int timer_irq)
79
48
{
80
 
        struct irq_desc *desc = irq_to_desc(parent_irq);
81
 
 
82
 
        set_irq_chained_handler(parent_irq, s3c_irq_demux_vic_timer);
83
 
 
84
 
        set_irq_chip(timer_irq, &s3c_irq_timer);
85
 
        set_irq_chip_data(timer_irq, (void *)(1 << (timer_irq - IRQ_TIMER0)));
86
 
        set_irq_handler(timer_irq, handle_level_irq);
87
 
        set_irq_flags(timer_irq, IRQF_VALID);
88
 
 
89
 
        desc->irq_data.handler_data = (void *)timer_irq;
 
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;
 
54
 
 
55
        s3c_tgc = irq_alloc_generic_chip("s3c-timer", 1, timer_irq,
 
56
                                         S3C64XX_TINT_CSTAT, handle_level_irq);
 
57
 
 
58
        if (!s3c_tgc) {
 
59
                pr_err("%s: irq_alloc_generic_chip for IRQ %d failed\n",
 
60
                       __func__, timer_irq);
 
61
                return;
 
62
        }
 
63
 
 
64
        ct = s3c_tgc->chip_types;
 
65
        ct->chip.irq_mask = irq_gc_mask_clr_bit;
 
66
        ct->chip.irq_unmask = irq_gc_mask_set_bit;
 
67
        ct->chip.irq_ack = s3c_irq_timer_ack;
 
68
        irq_setup_generic_chip(s3c_tgc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE,
 
69
                               IRQ_NOREQUEST | IRQ_NOPROBE, 0);
 
70
        /* Clear the upper bits of the mask_cache*/
 
71
        s3c_tgc->mask_cache &= 0x1f;
 
72
 
 
73
        for (i = 0; i < num; i++, timer_irq++) {
 
74
                irq_set_chained_handler(pirq[i], s3c_irq_demux_vic_timer);
 
75
                irq_set_handler_data(pirq[i], (void *)timer_irq);
 
76
        }
90
77
}