1*0ad6125bSBoris BREZILLON /* 2*0ad6125bSBoris BREZILLON * drivers/clk/at91/pmc.h 3*0ad6125bSBoris BREZILLON * 4*0ad6125bSBoris BREZILLON * Copyright (C) 2013 Boris BREZILLON <b.brezillon@overkiz.com> 5*0ad6125bSBoris BREZILLON * 6*0ad6125bSBoris BREZILLON * This program is free software; you can redistribute it and/or modify 7*0ad6125bSBoris BREZILLON * it under the terms of the GNU General Public License as published by 8*0ad6125bSBoris BREZILLON * the Free Software Foundation; either version 2 of the License, or 9*0ad6125bSBoris BREZILLON * (at your option) any later version. 10*0ad6125bSBoris BREZILLON */ 11*0ad6125bSBoris BREZILLON 12*0ad6125bSBoris BREZILLON #ifndef __PMC_H_ 13*0ad6125bSBoris BREZILLON #define __PMC_H_ 14*0ad6125bSBoris BREZILLON 15*0ad6125bSBoris BREZILLON #include <linux/io.h> 16*0ad6125bSBoris BREZILLON #include <linux/irqdomain.h> 17*0ad6125bSBoris BREZILLON #include <linux/spinlock.h> 18*0ad6125bSBoris BREZILLON 19*0ad6125bSBoris BREZILLON struct clk_range { 20*0ad6125bSBoris BREZILLON unsigned long min; 21*0ad6125bSBoris BREZILLON unsigned long max; 22*0ad6125bSBoris BREZILLON }; 23*0ad6125bSBoris BREZILLON 24*0ad6125bSBoris BREZILLON #define CLK_RANGE(MIN, MAX) {.min = MIN, .max = MAX,} 25*0ad6125bSBoris BREZILLON 26*0ad6125bSBoris BREZILLON struct at91_pmc_caps { 27*0ad6125bSBoris BREZILLON u32 available_irqs; 28*0ad6125bSBoris BREZILLON }; 29*0ad6125bSBoris BREZILLON 30*0ad6125bSBoris BREZILLON struct at91_pmc { 31*0ad6125bSBoris BREZILLON void __iomem *regbase; 32*0ad6125bSBoris BREZILLON int virq; 33*0ad6125bSBoris BREZILLON spinlock_t lock; 34*0ad6125bSBoris BREZILLON const struct at91_pmc_caps *caps; 35*0ad6125bSBoris BREZILLON struct irq_domain *irqdomain; 36*0ad6125bSBoris BREZILLON }; 37*0ad6125bSBoris BREZILLON 38*0ad6125bSBoris BREZILLON static inline void pmc_lock(struct at91_pmc *pmc) 39*0ad6125bSBoris BREZILLON { 40*0ad6125bSBoris BREZILLON spin_lock(&pmc->lock); 41*0ad6125bSBoris BREZILLON } 42*0ad6125bSBoris BREZILLON 43*0ad6125bSBoris BREZILLON static inline void pmc_unlock(struct at91_pmc *pmc) 44*0ad6125bSBoris BREZILLON { 45*0ad6125bSBoris BREZILLON spin_unlock(&pmc->lock); 46*0ad6125bSBoris BREZILLON } 47*0ad6125bSBoris BREZILLON 48*0ad6125bSBoris BREZILLON static inline u32 pmc_read(struct at91_pmc *pmc, int offset) 49*0ad6125bSBoris BREZILLON { 50*0ad6125bSBoris BREZILLON return readl(pmc->regbase + offset); 51*0ad6125bSBoris BREZILLON } 52*0ad6125bSBoris BREZILLON 53*0ad6125bSBoris BREZILLON static inline void pmc_write(struct at91_pmc *pmc, int offset, u32 value) 54*0ad6125bSBoris BREZILLON { 55*0ad6125bSBoris BREZILLON writel(value, pmc->regbase + offset); 56*0ad6125bSBoris BREZILLON } 57*0ad6125bSBoris BREZILLON 58*0ad6125bSBoris BREZILLON int of_at91_get_clk_range(struct device_node *np, const char *propname, 59*0ad6125bSBoris BREZILLON struct clk_range *range); 60*0ad6125bSBoris BREZILLON 61*0ad6125bSBoris BREZILLON #endif /* __PMC_H_ */ 62