wakeup-mask.c (906B)
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 17void 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}