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 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