xref: /openbmc/linux/drivers/clk/at91/pmc.h (revision 0ad6125b1579cac8ccbd0f46ec6d33cf71b79f51)
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