~ubuntu-branches/debian/wheezy/linux-2.6/wheezy

« back to all changes in this revision

Viewing changes to arch/sh/boards/mach-se/7206/irq.c

  • Committer: Bazaar Package Importer
  • Author(s): Ben Hutchings, Ben Hutchings, Aurelien Jarno, Martin Michlmayr
  • Date: 2011-04-06 13:53:30 UTC
  • mfrom: (43.1.5 sid)
  • Revision ID: james.westby@ubuntu.com-20110406135330-wjufxhd0tvn3zx4z
Tags: 2.6.38-3
[ Ben Hutchings ]
* [ppc64] Add to linux-tools package architectures (Closes: #620124)
* [amd64] Save cr4 to mmu_cr4_features at boot time (Closes: #620284)
* appletalk: Fix bugs introduced when removing use of BKL
* ALSA: Fix yet another race in disconnection
* cciss: Fix lost command issue
* ath9k: Fix kernel panic in AR2427
* ses: Avoid kernel panic when lun 0 is not mapped
* PCI/ACPI: Report ASPM support to BIOS if not disabled from command line

[ Aurelien Jarno ]
* rtlwifi: fix build when PCI is not enabled.

[ Martin Michlmayr ]
* rtlwifi: Eliminate udelay calls with too large values (Closes: #620204)

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
#define INTC_IPR01 0xfffe0818
26
26
#define INTC_ICR1  0xfffe0802
27
27
 
28
 
static void disable_se7206_irq(unsigned int irq)
 
28
static void disable_se7206_irq(struct irq_data *data)
29
29
{
 
30
        unsigned int irq = data->irq;
30
31
        unsigned short val;
31
32
        unsigned short mask = 0xffff ^ (0x0f << 4 * (3 - (IRQ0_IRQ - irq)));
32
33
        unsigned short msk0,msk1;
33
34
 
34
35
        /* Set the priority in IPR to 0 */
35
 
        val = ctrl_inw(INTC_IPR01);
 
36
        val = __raw_readw(INTC_IPR01);
36
37
        val &= mask;
37
 
        ctrl_outw(val, INTC_IPR01);
 
38
        __raw_writew(val, INTC_IPR01);
38
39
        /* FPGA mask set */
39
 
        msk0 = ctrl_inw(INTMSK0);
40
 
        msk1 = ctrl_inw(INTMSK1);
 
40
        msk0 = __raw_readw(INTMSK0);
 
41
        msk1 = __raw_readw(INTMSK1);
41
42
 
42
43
        switch (irq) {
43
44
        case IRQ0_IRQ:
51
52
                msk1 |= 0x00ff;
52
53
                break;
53
54
        }
54
 
        ctrl_outw(msk0, INTMSK0);
55
 
        ctrl_outw(msk1, INTMSK1);
 
55
        __raw_writew(msk0, INTMSK0);
 
56
        __raw_writew(msk1, INTMSK1);
56
57
}
57
58
 
58
 
static void enable_se7206_irq(unsigned int irq)
 
59
static void enable_se7206_irq(struct irq_data *data)
59
60
{
 
61
        unsigned int irq = data->irq;
60
62
        unsigned short val;
61
63
        unsigned short value = (0x0001 << 4 * (3 - (IRQ0_IRQ - irq)));
62
64
        unsigned short msk0,msk1;
63
65
 
64
66
        /* Set priority in IPR back to original value */
65
 
        val = ctrl_inw(INTC_IPR01);
 
67
        val = __raw_readw(INTC_IPR01);
66
68
        val |= value;
67
 
        ctrl_outw(val, INTC_IPR01);
 
69
        __raw_writew(val, INTC_IPR01);
68
70
 
69
71
        /* FPGA mask reset */
70
 
        msk0 = ctrl_inw(INTMSK0);
71
 
        msk1 = ctrl_inw(INTMSK1);
 
72
        msk0 = __raw_readw(INTMSK0);
 
73
        msk1 = __raw_readw(INTMSK1);
72
74
 
73
75
        switch (irq) {
74
76
        case IRQ0_IRQ:
82
84
                msk1 &= ~0x00ff;
83
85
                break;
84
86
        }
85
 
        ctrl_outw(msk0, INTMSK0);
86
 
        ctrl_outw(msk1, INTMSK1);
 
87
        __raw_writew(msk0, INTMSK0);
 
88
        __raw_writew(msk1, INTMSK1);
87
89
}
88
90
 
89
 
static void eoi_se7206_irq(unsigned int irq)
 
91
static void eoi_se7206_irq(struct irq_data *data)
90
92
{
91
93
        unsigned short sts0,sts1;
 
94
        unsigned int irq = data->irq;
 
95
        struct irq_desc *desc = irq_to_desc(irq);
92
96
 
93
 
        if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
94
 
                enable_se7206_irq(irq);
 
97
        if (!(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS)))
 
98
                enable_se7206_irq(data);
95
99
        /* FPGA isr clear */
96
 
        sts0 = ctrl_inw(INTSTS0);
97
 
        sts1 = ctrl_inw(INTSTS1);
 
100
        sts0 = __raw_readw(INTSTS0);
 
101
        sts1 = __raw_readw(INTSTS1);
98
102
 
99
103
        switch (irq) {
100
104
        case IRQ0_IRQ:
108
112
                sts1 &= ~0x00ff;
109
113
                break;
110
114
        }
111
 
        ctrl_outw(sts0, INTSTS0);
112
 
        ctrl_outw(sts1, INTSTS1);
 
115
        __raw_writew(sts0, INTSTS0);
 
116
        __raw_writew(sts1, INTSTS1);
113
117
}
114
118
 
115
119
static struct irq_chip se7206_irq_chip __read_mostly = {
116
120
        .name           = "SE7206-FPGA",
117
 
        .mask           = disable_se7206_irq,
118
 
        .unmask         = enable_se7206_irq,
119
 
        .mask_ack       = disable_se7206_irq,
120
 
        .eoi            = eoi_se7206_irq,
 
121
        .irq_mask       = disable_se7206_irq,
 
122
        .irq_unmask     = enable_se7206_irq,
 
123
        .irq_eoi        = eoi_se7206_irq,
121
124
};
122
125
 
123
126
static void make_se7206_irq(unsigned int irq)
125
128
        disable_irq_nosync(irq);
126
129
        set_irq_chip_and_handler_name(irq, &se7206_irq_chip,
127
130
                                      handle_level_irq, "level");
128
 
        disable_se7206_irq(irq);
 
131
        disable_se7206_irq(irq_get_irq_data(irq));
129
132
}
130
133
 
131
134
/*
136
139
        make_se7206_irq(IRQ0_IRQ); /* SMC91C111 */
137
140
        make_se7206_irq(IRQ1_IRQ); /* ATA */
138
141
        make_se7206_irq(IRQ3_IRQ); /* SLOT / PCM */
139
 
        ctrl_outw(inw(INTC_ICR1) | 0x000b ,INTC_ICR1 ) ; /* ICR1 */
 
142
 
 
143
        __raw_writew(__raw_readw(INTC_ICR1) | 0x000b, INTC_ICR1); /* ICR1 */
140
144
 
141
145
        /* FPGA System register setup*/
142
 
        ctrl_outw(0x0000,INTSTS0); /* Clear INTSTS0 */
143
 
        ctrl_outw(0x0000,INTSTS1); /* Clear INTSTS1 */
 
146
        __raw_writew(0x0000,INTSTS0); /* Clear INTSTS0 */
 
147
        __raw_writew(0x0000,INTSTS1); /* Clear INTSTS1 */
 
148
 
144
149
        /* IRQ0=LAN, IRQ1=ATA, IRQ3=SLT,PCM */
145
 
        ctrl_outw(0x0001,INTSEL);
 
150
        __raw_writew(0x0001,INTSEL);
146
151
}