xref: /openbmc/linux/drivers/clk/at91/pmc.h (revision 863a81c3be1d931bdae6426e231add9334311f13)
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>
17*863a81c3SBoris Brezillon #include <linux/regmap.h>
180ad6125bSBoris BREZILLON #include <linux/spinlock.h>
190ad6125bSBoris BREZILLON 
200ad6125bSBoris BREZILLON struct clk_range {
210ad6125bSBoris BREZILLON 	unsigned long min;
220ad6125bSBoris BREZILLON 	unsigned long max;
230ad6125bSBoris BREZILLON };
240ad6125bSBoris BREZILLON 
250ad6125bSBoris BREZILLON #define CLK_RANGE(MIN, MAX) {.min = MIN, .max = MAX,}
260ad6125bSBoris BREZILLON 
270ad6125bSBoris BREZILLON struct at91_pmc_caps {
280ad6125bSBoris BREZILLON 	u32 available_irqs;
290ad6125bSBoris BREZILLON };
300ad6125bSBoris BREZILLON 
310ad6125bSBoris BREZILLON struct at91_pmc {
32*863a81c3SBoris Brezillon 	struct regmap *regmap;
330ad6125bSBoris BREZILLON 	int virq;
340ad6125bSBoris BREZILLON 	spinlock_t lock;
350ad6125bSBoris BREZILLON 	const struct at91_pmc_caps *caps;
360ad6125bSBoris BREZILLON 	struct irq_domain *irqdomain;
37947f5b10SBoris BREZILLON 	u32 imr;
380ad6125bSBoris BREZILLON };
390ad6125bSBoris BREZILLON 
400ad6125bSBoris BREZILLON static inline void pmc_lock(struct at91_pmc *pmc)
410ad6125bSBoris BREZILLON {
420ad6125bSBoris BREZILLON 	spin_lock(&pmc->lock);
430ad6125bSBoris BREZILLON }
440ad6125bSBoris BREZILLON 
450ad6125bSBoris BREZILLON static inline void pmc_unlock(struct at91_pmc *pmc)
460ad6125bSBoris BREZILLON {
470ad6125bSBoris BREZILLON 	spin_unlock(&pmc->lock);
480ad6125bSBoris BREZILLON }
490ad6125bSBoris BREZILLON 
500ad6125bSBoris BREZILLON static inline u32 pmc_read(struct at91_pmc *pmc, int offset)
510ad6125bSBoris BREZILLON {
52*863a81c3SBoris Brezillon 	unsigned int ret = 0;
53*863a81c3SBoris Brezillon 
54*863a81c3SBoris Brezillon 	regmap_read(pmc->regmap, offset, &ret);
55*863a81c3SBoris Brezillon 
56*863a81c3SBoris Brezillon 	return ret;
570ad6125bSBoris BREZILLON }
580ad6125bSBoris BREZILLON 
590ad6125bSBoris BREZILLON static inline void pmc_write(struct at91_pmc *pmc, int offset, u32 value)
600ad6125bSBoris BREZILLON {
61*863a81c3SBoris Brezillon 	regmap_write(pmc->regmap, offset, value);
620ad6125bSBoris BREZILLON }
630ad6125bSBoris BREZILLON 
640ad6125bSBoris BREZILLON int of_at91_get_clk_range(struct device_node *np, const char *propname,
650ad6125bSBoris BREZILLON 			  struct clk_range *range);
660ad6125bSBoris BREZILLON 
67a8a8db47SStephen Boyd void of_at91sam9260_clk_slow_setup(struct device_node *np,
6880eded6cSBoris BREZILLON 				   struct at91_pmc *pmc);
6980eded6cSBoris BREZILLON 
70a8a8db47SStephen Boyd void of_at91rm9200_clk_main_osc_setup(struct device_node *np,
7127cb1c20SBoris BREZILLON 				      struct at91_pmc *pmc);
72a8a8db47SStephen Boyd void of_at91sam9x5_clk_main_rc_osc_setup(struct device_node *np,
7327cb1c20SBoris BREZILLON 					 struct at91_pmc *pmc);
74a8a8db47SStephen Boyd void of_at91rm9200_clk_main_setup(struct device_node *np,
7538d34c31SBoris BREZILLON 				  struct at91_pmc *pmc);
76a8a8db47SStephen Boyd void of_at91sam9x5_clk_main_setup(struct device_node *np,
7727cb1c20SBoris BREZILLON 				  struct at91_pmc *pmc);
7838d34c31SBoris BREZILLON 
79a8a8db47SStephen Boyd void of_at91rm9200_clk_pll_setup(struct device_node *np,
801a748d2bSBoris BREZILLON 				 struct at91_pmc *pmc);
81a8a8db47SStephen Boyd void of_at91sam9g45_clk_pll_setup(struct device_node *np,
821a748d2bSBoris BREZILLON 				  struct at91_pmc *pmc);
83a8a8db47SStephen Boyd void of_at91sam9g20_clk_pllb_setup(struct device_node *np,
841a748d2bSBoris BREZILLON 				   struct at91_pmc *pmc);
85a8a8db47SStephen Boyd void of_sama5d3_clk_pll_setup(struct device_node *np,
861a748d2bSBoris BREZILLON 			      struct at91_pmc *pmc);
87a8a8db47SStephen Boyd void of_at91sam9x5_clk_plldiv_setup(struct device_node *np,
881a748d2bSBoris BREZILLON 				    struct at91_pmc *pmc);
891a748d2bSBoris BREZILLON 
90a8a8db47SStephen Boyd void of_at91rm9200_clk_master_setup(struct device_node *np,
91e442d234SBoris BREZILLON 				    struct at91_pmc *pmc);
92a8a8db47SStephen Boyd void of_at91sam9x5_clk_master_setup(struct device_node *np,
93e442d234SBoris BREZILLON 				    struct at91_pmc *pmc);
94e442d234SBoris BREZILLON 
95a8a8db47SStephen Boyd void of_at91rm9200_clk_sys_setup(struct device_node *np,
965fba62eaSBoris BREZILLON 				 struct at91_pmc *pmc);
975fba62eaSBoris BREZILLON 
98a8a8db47SStephen Boyd void of_at91rm9200_clk_periph_setup(struct device_node *np,
996114067eSBoris BREZILLON 				    struct at91_pmc *pmc);
100a8a8db47SStephen Boyd void of_at91sam9x5_clk_periph_setup(struct device_node *np,
1016114067eSBoris BREZILLON 				    struct at91_pmc *pmc);
1026114067eSBoris BREZILLON 
103a8a8db47SStephen Boyd void of_at91rm9200_clk_prog_setup(struct device_node *np,
1041f22f8bbSBoris BREZILLON 				  struct at91_pmc *pmc);
105a8a8db47SStephen Boyd void of_at91sam9g45_clk_prog_setup(struct device_node *np,
1061f22f8bbSBoris BREZILLON 				   struct at91_pmc *pmc);
107a8a8db47SStephen Boyd void of_at91sam9x5_clk_prog_setup(struct device_node *np,
1081f22f8bbSBoris BREZILLON 				  struct at91_pmc *pmc);
1091f22f8bbSBoris BREZILLON 
110a8a8db47SStephen Boyd void of_at91sam9x5_clk_utmi_setup(struct device_node *np,
111f090fb37SBoris BREZILLON 				  struct at91_pmc *pmc);
112f090fb37SBoris BREZILLON 
113a8a8db47SStephen Boyd void of_at91rm9200_clk_usb_setup(struct device_node *np,
114c84a61d8SBoris BREZILLON 				 struct at91_pmc *pmc);
115a8a8db47SStephen Boyd void of_at91sam9x5_clk_usb_setup(struct device_node *np,
116c84a61d8SBoris BREZILLON 				 struct at91_pmc *pmc);
117a8a8db47SStephen Boyd void of_at91sam9n12_clk_usb_setup(struct device_node *np,
118c84a61d8SBoris BREZILLON 				  struct at91_pmc *pmc);
119c84a61d8SBoris BREZILLON 
120a8a8db47SStephen Boyd void of_at91sam9x5_clk_smd_setup(struct device_node *np,
121a9c0688fSBoris BREZILLON 				 struct at91_pmc *pmc);
122a9c0688fSBoris BREZILLON 
123a8a8db47SStephen Boyd void of_sama5d4_clk_h32mx_setup(struct device_node *np,
124bcc5fd49SAlexandre Belloni 				struct at91_pmc *pmc);
125bcc5fd49SAlexandre Belloni 
126df70aeefSNicolas Ferre void of_sama5d2_clk_generated_setup(struct device_node *np,
127df70aeefSNicolas Ferre 				    struct at91_pmc *pmc);
128df70aeefSNicolas Ferre 
1290ad6125bSBoris BREZILLON #endif /* __PMC_H_ */
130