xref: /openbmc/linux/drivers/clk/at91/pmc.h (revision f090fb37def3eb9ea49b71751dbe43f423f3a152)
10ad6125bSBoris BREZILLON /*
20ad6125bSBoris BREZILLON  * drivers/clk/at91/pmc.h
30ad6125bSBoris BREZILLON  *
40ad6125bSBoris BREZILLON  *  Copyright (C) 2013 Boris BREZILLON <b.brezillon@overkiz.com>
50ad6125bSBoris BREZILLON  *
60ad6125bSBoris BREZILLON  * This program is free software; you can redistribute it and/or modify
70ad6125bSBoris BREZILLON  * it under the terms of the GNU General Public License as published by
80ad6125bSBoris BREZILLON  * the Free Software Foundation; either version 2 of the License, or
90ad6125bSBoris BREZILLON  * (at your option) any later version.
100ad6125bSBoris BREZILLON  */
110ad6125bSBoris BREZILLON 
120ad6125bSBoris BREZILLON #ifndef __PMC_H_
130ad6125bSBoris BREZILLON #define __PMC_H_
140ad6125bSBoris BREZILLON 
150ad6125bSBoris BREZILLON #include <linux/io.h>
160ad6125bSBoris BREZILLON #include <linux/irqdomain.h>
170ad6125bSBoris BREZILLON #include <linux/spinlock.h>
180ad6125bSBoris BREZILLON 
190ad6125bSBoris BREZILLON struct clk_range {
200ad6125bSBoris BREZILLON 	unsigned long min;
210ad6125bSBoris BREZILLON 	unsigned long max;
220ad6125bSBoris BREZILLON };
230ad6125bSBoris BREZILLON 
240ad6125bSBoris BREZILLON #define CLK_RANGE(MIN, MAX) {.min = MIN, .max = MAX,}
250ad6125bSBoris BREZILLON 
260ad6125bSBoris BREZILLON struct at91_pmc_caps {
270ad6125bSBoris BREZILLON 	u32 available_irqs;
280ad6125bSBoris BREZILLON };
290ad6125bSBoris BREZILLON 
300ad6125bSBoris BREZILLON struct at91_pmc {
310ad6125bSBoris BREZILLON 	void __iomem *regbase;
320ad6125bSBoris BREZILLON 	int virq;
330ad6125bSBoris BREZILLON 	spinlock_t lock;
340ad6125bSBoris BREZILLON 	const struct at91_pmc_caps *caps;
350ad6125bSBoris BREZILLON 	struct irq_domain *irqdomain;
360ad6125bSBoris BREZILLON };
370ad6125bSBoris BREZILLON 
380ad6125bSBoris BREZILLON static inline void pmc_lock(struct at91_pmc *pmc)
390ad6125bSBoris BREZILLON {
400ad6125bSBoris BREZILLON 	spin_lock(&pmc->lock);
410ad6125bSBoris BREZILLON }
420ad6125bSBoris BREZILLON 
430ad6125bSBoris BREZILLON static inline void pmc_unlock(struct at91_pmc *pmc)
440ad6125bSBoris BREZILLON {
450ad6125bSBoris BREZILLON 	spin_unlock(&pmc->lock);
460ad6125bSBoris BREZILLON }
470ad6125bSBoris BREZILLON 
480ad6125bSBoris BREZILLON static inline u32 pmc_read(struct at91_pmc *pmc, int offset)
490ad6125bSBoris BREZILLON {
500ad6125bSBoris BREZILLON 	return readl(pmc->regbase + offset);
510ad6125bSBoris BREZILLON }
520ad6125bSBoris BREZILLON 
530ad6125bSBoris BREZILLON static inline void pmc_write(struct at91_pmc *pmc, int offset, u32 value)
540ad6125bSBoris BREZILLON {
550ad6125bSBoris BREZILLON 	writel(value, pmc->regbase + offset);
560ad6125bSBoris BREZILLON }
570ad6125bSBoris BREZILLON 
580ad6125bSBoris BREZILLON int of_at91_get_clk_range(struct device_node *np, const char *propname,
590ad6125bSBoris BREZILLON 			  struct clk_range *range);
600ad6125bSBoris BREZILLON 
6138d34c31SBoris BREZILLON extern void __init of_at91rm9200_clk_main_setup(struct device_node *np,
6238d34c31SBoris BREZILLON 						struct at91_pmc *pmc);
6338d34c31SBoris BREZILLON 
641a748d2bSBoris BREZILLON extern void __init of_at91rm9200_clk_pll_setup(struct device_node *np,
651a748d2bSBoris BREZILLON 					       struct at91_pmc *pmc);
661a748d2bSBoris BREZILLON extern void __init of_at91sam9g45_clk_pll_setup(struct device_node *np,
671a748d2bSBoris BREZILLON 						struct at91_pmc *pmc);
681a748d2bSBoris BREZILLON extern void __init of_at91sam9g20_clk_pllb_setup(struct device_node *np,
691a748d2bSBoris BREZILLON 						 struct at91_pmc *pmc);
701a748d2bSBoris BREZILLON extern void __init of_sama5d3_clk_pll_setup(struct device_node *np,
711a748d2bSBoris BREZILLON 					    struct at91_pmc *pmc);
721a748d2bSBoris BREZILLON extern void __init of_at91sam9x5_clk_plldiv_setup(struct device_node *np,
731a748d2bSBoris BREZILLON 						  struct at91_pmc *pmc);
741a748d2bSBoris BREZILLON 
75e442d234SBoris BREZILLON extern void __init of_at91rm9200_clk_master_setup(struct device_node *np,
76e442d234SBoris BREZILLON 						  struct at91_pmc *pmc);
77e442d234SBoris BREZILLON extern void __init of_at91sam9x5_clk_master_setup(struct device_node *np,
78e442d234SBoris BREZILLON 						  struct at91_pmc *pmc);
79e442d234SBoris BREZILLON 
805fba62eaSBoris BREZILLON extern void __init of_at91rm9200_clk_sys_setup(struct device_node *np,
815fba62eaSBoris BREZILLON 					       struct at91_pmc *pmc);
825fba62eaSBoris BREZILLON 
836114067eSBoris BREZILLON extern void __init of_at91rm9200_clk_periph_setup(struct device_node *np,
846114067eSBoris BREZILLON 						  struct at91_pmc *pmc);
856114067eSBoris BREZILLON extern void __init of_at91sam9x5_clk_periph_setup(struct device_node *np,
866114067eSBoris BREZILLON 						  struct at91_pmc *pmc);
876114067eSBoris BREZILLON 
881f22f8bbSBoris BREZILLON #if defined(CONFIG_AT91_PROGRAMMABLE_CLOCKS)
891f22f8bbSBoris BREZILLON extern void __init of_at91rm9200_clk_prog_setup(struct device_node *np,
901f22f8bbSBoris BREZILLON 						struct at91_pmc *pmc);
911f22f8bbSBoris BREZILLON extern void __init of_at91sam9g45_clk_prog_setup(struct device_node *np,
921f22f8bbSBoris BREZILLON 						 struct at91_pmc *pmc);
931f22f8bbSBoris BREZILLON extern void __init of_at91sam9x5_clk_prog_setup(struct device_node *np,
941f22f8bbSBoris BREZILLON 						struct at91_pmc *pmc);
951f22f8bbSBoris BREZILLON #endif
961f22f8bbSBoris BREZILLON 
97*f090fb37SBoris BREZILLON #if defined(CONFIG_HAVE_AT91_UTMI)
98*f090fb37SBoris BREZILLON extern void __init of_at91sam9x5_clk_utmi_setup(struct device_node *np,
99*f090fb37SBoris BREZILLON 						struct at91_pmc *pmc);
100*f090fb37SBoris BREZILLON #endif
101*f090fb37SBoris BREZILLON 
1020ad6125bSBoris BREZILLON #endif /* __PMC_H_ */
103