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