|  | // SPDX-License-Identifier: GPL-2.0 | 
|  | // | 
|  | // Copyright 2010 Ben Dooks <ben-linux@fluff.org> | 
|  | // | 
|  | // Support for wakeup mask interrupts on newer SoCs | 
|  |  | 
|  | #include <linux/kernel.h> | 
|  | #include <linux/spinlock.h> | 
|  | #include <linux/device.h> | 
|  | #include <linux/types.h> | 
|  | #include <linux/irq.h> | 
|  | #include <linux/io.h> | 
|  |  | 
|  | #include "wakeup-mask.h" | 
|  | #include "pm.h" | 
|  |  | 
|  | void samsung_sync_wakemask(void __iomem *reg, | 
|  | const struct samsung_wakeup_mask *mask, int nr_mask) | 
|  | { | 
|  | struct irq_data *data; | 
|  | u32 val; | 
|  |  | 
|  | val = __raw_readl(reg); | 
|  |  | 
|  | for (; nr_mask > 0; nr_mask--, mask++) { | 
|  | if (mask->irq == NO_WAKEUP_IRQ) { | 
|  | val |= mask->bit; | 
|  | continue; | 
|  | } | 
|  |  | 
|  | data = irq_get_irq_data(mask->irq); | 
|  |  | 
|  | /* bit of a liberty to read this directly from irq_data. */ | 
|  | if (irqd_is_wakeup_set(data)) | 
|  | val &= ~mask->bit; | 
|  | else | 
|  | val |= mask->bit; | 
|  | } | 
|  |  | 
|  | printk(KERN_INFO "wakemask %08x => %08x\n", __raw_readl(reg), val); | 
|  | __raw_writel(val, reg); | 
|  | } |