~ubuntu-branches/ubuntu/saucy/linux-ti-omap4/saucy-proposed

« back to all changes in this revision

Viewing changes to arch/arm/mach-s3c24xx/irq-s3c2416.c

  • Committer: Package Import Robot
  • Author(s): Paolo Pisati, Paolo Pisati, Stefan Bader, Upstream Kernel Changes
  • Date: 2012-08-15 17:17:43 UTC
  • Revision ID: package-import@ubuntu.com-20120815171743-h5wnuf51xe7pvdid
Tags: 3.5.0-207.13
[ Paolo Pisati ]

* Start new release

[ Stefan Bader ]

* (config) Enable getabis to use local package copies

[ Upstream Kernel Changes ]

* fixup: gargabe collect iva_seq[0|1] init
* [Config] enable all SND_OMAP_SOC_*s
* fixup: cm2xxx_3xxx.o is needed for omap2_cm_read|write_reg
* fixup: add some snd_soc_dai* helper functions
* fixup: s/snd_soc_dpcm_params/snd_soc_dpcm/g
* fixup: typo, no_host_mode and useless SDP4430 init
* fixup: enable again aess hwmod

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
#include <linux/ioport.h>
28
28
#include <linux/device.h>
29
29
#include <linux/io.h>
 
30
#include <linux/syscore_ops.h>
30
31
 
31
32
#include <mach/hardware.h>
32
33
#include <asm/irq.h>
192
193
        .irq_ack        = s3c2416_irq_uart3_ack,
193
194
};
194
195
 
 
196
/* second interrupt register */
 
197
 
 
198
static inline void s3c2416_irq_ack_second(struct irq_data *data)
 
199
{
 
200
        unsigned long bitval = 1UL << (data->irq - IRQ_S3C2416_2D);
 
201
 
 
202
        __raw_writel(bitval, S3C2416_SRCPND2);
 
203
        __raw_writel(bitval, S3C2416_INTPND2);
 
204
}
 
205
 
 
206
static void s3c2416_irq_mask_second(struct irq_data *data)
 
207
{
 
208
        unsigned long bitval = 1UL << (data->irq - IRQ_S3C2416_2D);
 
209
        unsigned long mask;
 
210
 
 
211
        mask = __raw_readl(S3C2416_INTMSK2);
 
212
        mask |= bitval;
 
213
        __raw_writel(mask, S3C2416_INTMSK2);
 
214
}
 
215
 
 
216
static void s3c2416_irq_unmask_second(struct irq_data *data)
 
217
{
 
218
        unsigned long bitval = 1UL << (data->irq - IRQ_S3C2416_2D);
 
219
        unsigned long mask;
 
220
 
 
221
        mask = __raw_readl(S3C2416_INTMSK2);
 
222
        mask &= ~bitval;
 
223
        __raw_writel(mask, S3C2416_INTMSK2);
 
224
}
 
225
 
 
226
struct irq_chip s3c2416_irq_second = {
 
227
        .irq_ack        = s3c2416_irq_ack_second,
 
228
        .irq_mask       = s3c2416_irq_mask_second,
 
229
        .irq_unmask     = s3c2416_irq_unmask_second,
 
230
};
 
231
 
 
232
 
195
233
/* IRQ initialisation code */
196
234
 
197
235
static int __init s3c2416_add_sub(unsigned int base,
213
251
        return 0;
214
252
}
215
253
 
 
254
static void __init s3c2416_irq_add_second(void)
 
255
{
 
256
        unsigned long pend;
 
257
        unsigned long last;
 
258
        int irqno;
 
259
        int i;
 
260
 
 
261
        /* first, clear all interrupts pending... */
 
262
        last = 0;
 
263
        for (i = 0; i < 4; i++) {
 
264
                pend = __raw_readl(S3C2416_INTPND2);
 
265
 
 
266
                if (pend == 0 || pend == last)
 
267
                        break;
 
268
 
 
269
                __raw_writel(pend, S3C2416_SRCPND2);
 
270
                __raw_writel(pend, S3C2416_INTPND2);
 
271
                printk(KERN_INFO "irq: clearing pending status %08x\n",
 
272
                       (int)pend);
 
273
                last = pend;
 
274
        }
 
275
 
 
276
        for (irqno = IRQ_S3C2416_2D; irqno <= IRQ_S3C2416_I2S1; irqno++) {
 
277
                switch (irqno) {
 
278
                case IRQ_S3C2416_RESERVED2:
 
279
                case IRQ_S3C2416_RESERVED3:
 
280
                        /* no IRQ here */
 
281
                        break;
 
282
                default:
 
283
                        irq_set_chip_and_handler(irqno, &s3c2416_irq_second,
 
284
                                                 handle_edge_irq);
 
285
                        set_irq_flags(irqno, IRQF_VALID);
 
286
                }
 
287
        }
 
288
}
 
289
 
216
290
static int __init s3c2416_irq_add(struct device *dev,
217
291
                                  struct subsys_interface *sif)
218
292
{
232
306
                        &s3c2416_irq_wdtac97,
233
307
                        IRQ_S3C2443_WDT, IRQ_S3C2443_AC97);
234
308
 
 
309
        s3c2416_irq_add_second();
 
310
 
235
311
        return 0;
236
312
}
237
313
 
248
324
 
249
325
arch_initcall(s3c2416_irq_init);
250
326
 
 
327
#ifdef CONFIG_PM
 
328
static struct sleep_save irq_save[] = {
 
329
        SAVE_ITEM(S3C2416_INTMSK2),
 
330
};
 
331
 
 
332
int s3c2416_irq_suspend(void)
 
333
{
 
334
        s3c_pm_do_save(irq_save, ARRAY_SIZE(irq_save));
 
335
 
 
336
        return 0;
 
337
}
 
338
 
 
339
void s3c2416_irq_resume(void)
 
340
{
 
341
        s3c_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
 
342
}
 
343
 
 
344
struct syscore_ops s3c2416_irq_syscore_ops = {
 
345
        .suspend        = s3c2416_irq_suspend,
 
346
        .resume         = s3c2416_irq_resume,
 
347
};
 
348
#endif