xref: /openbmc/linux/arch/arm/mach-s3c/wakeup-mask.c (revision cbecf716ca618fd44feda6bd9a64a8179d031fc5)
1  // SPDX-License-Identifier: GPL-2.0
2  //
3  // Copyright 2010 Ben Dooks <ben-linux@fluff.org>
4  //
5  // Support for wakeup mask interrupts on newer SoCs
6  
7  #include <linux/kernel.h>
8  #include <linux/spinlock.h>
9  #include <linux/device.h>
10  #include <linux/types.h>
11  #include <linux/irq.h>
12  #include <linux/io.h>
13  
14  #include "wakeup-mask.h"
15  #include "pm.h"
16  
samsung_sync_wakemask(void __iomem * reg,const struct samsung_wakeup_mask * mask,int nr_mask)17  void samsung_sync_wakemask(void __iomem *reg,
18  			   const struct samsung_wakeup_mask *mask, int nr_mask)
19  {
20  	struct irq_data *data;
21  	u32 val;
22  
23  	val = __raw_readl(reg);
24  
25  	for (; nr_mask > 0; nr_mask--, mask++) {
26  		if (mask->irq == NO_WAKEUP_IRQ) {
27  			val |= mask->bit;
28  			continue;
29  		}
30  
31  		data = irq_get_irq_data(mask->irq);
32  
33  		/* bit of a liberty to read this directly from irq_data. */
34  		if (irqd_is_wakeup_set(data))
35  			val &= ~mask->bit;
36  		else
37  			val |= mask->bit;
38  	}
39  
40  	printk(KERN_INFO "wakemask %08x => %08x\n", __raw_readl(reg), val);
41  	__raw_writel(val, reg);
42  }
43