10ad6125bSBoris BREZILLON /* 20ad6125bSBoris BREZILLON * Copyright (C) 2013 Boris BREZILLON <b.brezillon@overkiz.com> 30ad6125bSBoris BREZILLON * 40ad6125bSBoris BREZILLON * This program is free software; you can redistribute it and/or modify 50ad6125bSBoris BREZILLON * it under the terms of the GNU General Public License as published by 60ad6125bSBoris BREZILLON * the Free Software Foundation; either version 2 of the License, or 70ad6125bSBoris BREZILLON * (at your option) any later version. 80ad6125bSBoris BREZILLON * 90ad6125bSBoris BREZILLON */ 100ad6125bSBoris BREZILLON 110ad6125bSBoris BREZILLON #include <linux/clk-provider.h> 120ad6125bSBoris BREZILLON #include <linux/clkdev.h> 130ad6125bSBoris BREZILLON #include <linux/clk/at91_pmc.h> 140ad6125bSBoris BREZILLON #include <linux/of.h> 150ad6125bSBoris BREZILLON #include <linux/of_address.h> 160ad6125bSBoris BREZILLON #include <linux/io.h> 170ad6125bSBoris BREZILLON #include <linux/interrupt.h> 180ad6125bSBoris BREZILLON #include <linux/irq.h> 190ad6125bSBoris BREZILLON #include <linux/irqchip/chained_irq.h> 200ad6125bSBoris BREZILLON #include <linux/irqdomain.h> 210ad6125bSBoris BREZILLON #include <linux/of_irq.h> 220ad6125bSBoris BREZILLON 230ad6125bSBoris BREZILLON #include <asm/proc-fns.h> 240ad6125bSBoris BREZILLON 250ad6125bSBoris BREZILLON #include "pmc.h" 260ad6125bSBoris BREZILLON 270ad6125bSBoris BREZILLON void __iomem *at91_pmc_base; 280ad6125bSBoris BREZILLON EXPORT_SYMBOL_GPL(at91_pmc_base); 290ad6125bSBoris BREZILLON 300ad6125bSBoris BREZILLON void at91sam9_idle(void) 310ad6125bSBoris BREZILLON { 320ad6125bSBoris BREZILLON at91_pmc_write(AT91_PMC_SCDR, AT91_PMC_PCK); 330ad6125bSBoris BREZILLON cpu_do_idle(); 340ad6125bSBoris BREZILLON } 350ad6125bSBoris BREZILLON 360ad6125bSBoris BREZILLON int of_at91_get_clk_range(struct device_node *np, const char *propname, 370ad6125bSBoris BREZILLON struct clk_range *range) 380ad6125bSBoris BREZILLON { 390ad6125bSBoris BREZILLON u32 min, max; 400ad6125bSBoris BREZILLON int ret; 410ad6125bSBoris BREZILLON 420ad6125bSBoris BREZILLON ret = of_property_read_u32_index(np, propname, 0, &min); 430ad6125bSBoris BREZILLON if (ret) 440ad6125bSBoris BREZILLON return ret; 450ad6125bSBoris BREZILLON 460ad6125bSBoris BREZILLON ret = of_property_read_u32_index(np, propname, 1, &max); 470ad6125bSBoris BREZILLON if (ret) 480ad6125bSBoris BREZILLON return ret; 490ad6125bSBoris BREZILLON 500ad6125bSBoris BREZILLON if (range) { 510ad6125bSBoris BREZILLON range->min = min; 520ad6125bSBoris BREZILLON range->max = max; 530ad6125bSBoris BREZILLON } 540ad6125bSBoris BREZILLON 550ad6125bSBoris BREZILLON return 0; 560ad6125bSBoris BREZILLON } 570ad6125bSBoris BREZILLON EXPORT_SYMBOL_GPL(of_at91_get_clk_range); 580ad6125bSBoris BREZILLON 590ad6125bSBoris BREZILLON static void pmc_irq_mask(struct irq_data *d) 600ad6125bSBoris BREZILLON { 610ad6125bSBoris BREZILLON struct at91_pmc *pmc = irq_data_get_irq_chip_data(d); 620ad6125bSBoris BREZILLON 630ad6125bSBoris BREZILLON pmc_write(pmc, AT91_PMC_IDR, 1 << d->hwirq); 640ad6125bSBoris BREZILLON } 650ad6125bSBoris BREZILLON 660ad6125bSBoris BREZILLON static void pmc_irq_unmask(struct irq_data *d) 670ad6125bSBoris BREZILLON { 680ad6125bSBoris BREZILLON struct at91_pmc *pmc = irq_data_get_irq_chip_data(d); 690ad6125bSBoris BREZILLON 700ad6125bSBoris BREZILLON pmc_write(pmc, AT91_PMC_IER, 1 << d->hwirq); 710ad6125bSBoris BREZILLON } 720ad6125bSBoris BREZILLON 730ad6125bSBoris BREZILLON static int pmc_irq_set_type(struct irq_data *d, unsigned type) 740ad6125bSBoris BREZILLON { 750ad6125bSBoris BREZILLON if (type != IRQ_TYPE_LEVEL_HIGH) { 760ad6125bSBoris BREZILLON pr_warn("PMC: type not supported (support only IRQ_TYPE_LEVEL_HIGH type)\n"); 770ad6125bSBoris BREZILLON return -EINVAL; 780ad6125bSBoris BREZILLON } 790ad6125bSBoris BREZILLON 800ad6125bSBoris BREZILLON return 0; 810ad6125bSBoris BREZILLON } 820ad6125bSBoris BREZILLON 830ad6125bSBoris BREZILLON static struct irq_chip pmc_irq = { 840ad6125bSBoris BREZILLON .name = "PMC", 850ad6125bSBoris BREZILLON .irq_disable = pmc_irq_mask, 860ad6125bSBoris BREZILLON .irq_mask = pmc_irq_mask, 870ad6125bSBoris BREZILLON .irq_unmask = pmc_irq_unmask, 880ad6125bSBoris BREZILLON .irq_set_type = pmc_irq_set_type, 890ad6125bSBoris BREZILLON }; 900ad6125bSBoris BREZILLON 910ad6125bSBoris BREZILLON static struct lock_class_key pmc_lock_class; 920ad6125bSBoris BREZILLON 930ad6125bSBoris BREZILLON static int pmc_irq_map(struct irq_domain *h, unsigned int virq, 940ad6125bSBoris BREZILLON irq_hw_number_t hw) 950ad6125bSBoris BREZILLON { 960ad6125bSBoris BREZILLON struct at91_pmc *pmc = h->host_data; 970ad6125bSBoris BREZILLON 980ad6125bSBoris BREZILLON irq_set_lockdep_class(virq, &pmc_lock_class); 990ad6125bSBoris BREZILLON 1000ad6125bSBoris BREZILLON irq_set_chip_and_handler(virq, &pmc_irq, 1010ad6125bSBoris BREZILLON handle_level_irq); 1020ad6125bSBoris BREZILLON set_irq_flags(virq, IRQF_VALID); 1030ad6125bSBoris BREZILLON irq_set_chip_data(virq, pmc); 1040ad6125bSBoris BREZILLON 1050ad6125bSBoris BREZILLON return 0; 1060ad6125bSBoris BREZILLON } 1070ad6125bSBoris BREZILLON 1080ad6125bSBoris BREZILLON static int pmc_irq_domain_xlate(struct irq_domain *d, 1090ad6125bSBoris BREZILLON struct device_node *ctrlr, 1100ad6125bSBoris BREZILLON const u32 *intspec, unsigned int intsize, 1110ad6125bSBoris BREZILLON irq_hw_number_t *out_hwirq, 1120ad6125bSBoris BREZILLON unsigned int *out_type) 1130ad6125bSBoris BREZILLON { 1140ad6125bSBoris BREZILLON struct at91_pmc *pmc = d->host_data; 1150ad6125bSBoris BREZILLON const struct at91_pmc_caps *caps = pmc->caps; 1160ad6125bSBoris BREZILLON 1170ad6125bSBoris BREZILLON if (WARN_ON(intsize < 1)) 1180ad6125bSBoris BREZILLON return -EINVAL; 1190ad6125bSBoris BREZILLON 1200ad6125bSBoris BREZILLON *out_hwirq = intspec[0]; 1210ad6125bSBoris BREZILLON 1220ad6125bSBoris BREZILLON if (!(caps->available_irqs & (1 << *out_hwirq))) 1230ad6125bSBoris BREZILLON return -EINVAL; 1240ad6125bSBoris BREZILLON 1250ad6125bSBoris BREZILLON *out_type = IRQ_TYPE_LEVEL_HIGH; 1260ad6125bSBoris BREZILLON 1270ad6125bSBoris BREZILLON return 0; 1280ad6125bSBoris BREZILLON } 1290ad6125bSBoris BREZILLON 1300ad6125bSBoris BREZILLON static struct irq_domain_ops pmc_irq_ops = { 1310ad6125bSBoris BREZILLON .map = pmc_irq_map, 1320ad6125bSBoris BREZILLON .xlate = pmc_irq_domain_xlate, 1330ad6125bSBoris BREZILLON }; 1340ad6125bSBoris BREZILLON 1350ad6125bSBoris BREZILLON static irqreturn_t pmc_irq_handler(int irq, void *data) 1360ad6125bSBoris BREZILLON { 1370ad6125bSBoris BREZILLON struct at91_pmc *pmc = (struct at91_pmc *)data; 1380ad6125bSBoris BREZILLON unsigned long sr; 1390ad6125bSBoris BREZILLON int n; 1400ad6125bSBoris BREZILLON 1410ad6125bSBoris BREZILLON sr = pmc_read(pmc, AT91_PMC_SR) & pmc_read(pmc, AT91_PMC_IMR); 1420ad6125bSBoris BREZILLON if (!sr) 1430ad6125bSBoris BREZILLON return IRQ_NONE; 1440ad6125bSBoris BREZILLON 1450ad6125bSBoris BREZILLON for_each_set_bit(n, &sr, BITS_PER_LONG) 1460ad6125bSBoris BREZILLON generic_handle_irq(irq_find_mapping(pmc->irqdomain, n)); 1470ad6125bSBoris BREZILLON 1480ad6125bSBoris BREZILLON return IRQ_HANDLED; 1490ad6125bSBoris BREZILLON } 1500ad6125bSBoris BREZILLON 1510ad6125bSBoris BREZILLON static const struct at91_pmc_caps at91rm9200_caps = { 1520ad6125bSBoris BREZILLON .available_irqs = AT91_PMC_MOSCS | AT91_PMC_LOCKA | AT91_PMC_LOCKB | 1530ad6125bSBoris BREZILLON AT91_PMC_MCKRDY | AT91_PMC_PCK0RDY | 1540ad6125bSBoris BREZILLON AT91_PMC_PCK1RDY | AT91_PMC_PCK2RDY | 1550ad6125bSBoris BREZILLON AT91_PMC_PCK3RDY, 1560ad6125bSBoris BREZILLON }; 1570ad6125bSBoris BREZILLON 1580ad6125bSBoris BREZILLON static const struct at91_pmc_caps at91sam9260_caps = { 1590ad6125bSBoris BREZILLON .available_irqs = AT91_PMC_MOSCS | AT91_PMC_LOCKA | AT91_PMC_LOCKB | 1600ad6125bSBoris BREZILLON AT91_PMC_MCKRDY | AT91_PMC_PCK0RDY | 1610ad6125bSBoris BREZILLON AT91_PMC_PCK1RDY, 1620ad6125bSBoris BREZILLON }; 1630ad6125bSBoris BREZILLON 1640ad6125bSBoris BREZILLON static const struct at91_pmc_caps at91sam9g45_caps = { 1650ad6125bSBoris BREZILLON .available_irqs = AT91_PMC_MOSCS | AT91_PMC_LOCKA | AT91_PMC_MCKRDY | 1660ad6125bSBoris BREZILLON AT91_PMC_LOCKU | AT91_PMC_PCK0RDY | 1670ad6125bSBoris BREZILLON AT91_PMC_PCK1RDY, 1680ad6125bSBoris BREZILLON }; 1690ad6125bSBoris BREZILLON 1700ad6125bSBoris BREZILLON static const struct at91_pmc_caps at91sam9n12_caps = { 1710ad6125bSBoris BREZILLON .available_irqs = AT91_PMC_MOSCS | AT91_PMC_LOCKA | AT91_PMC_LOCKB | 1720ad6125bSBoris BREZILLON AT91_PMC_MCKRDY | AT91_PMC_PCK0RDY | 1730ad6125bSBoris BREZILLON AT91_PMC_PCK1RDY | AT91_PMC_MOSCSELS | 1740ad6125bSBoris BREZILLON AT91_PMC_MOSCRCS | AT91_PMC_CFDEV, 1750ad6125bSBoris BREZILLON }; 1760ad6125bSBoris BREZILLON 1770ad6125bSBoris BREZILLON static const struct at91_pmc_caps at91sam9x5_caps = { 1780ad6125bSBoris BREZILLON .available_irqs = AT91_PMC_MOSCS | AT91_PMC_LOCKA | AT91_PMC_MCKRDY | 1790ad6125bSBoris BREZILLON AT91_PMC_LOCKU | AT91_PMC_PCK0RDY | 1800ad6125bSBoris BREZILLON AT91_PMC_PCK1RDY | AT91_PMC_MOSCSELS | 1810ad6125bSBoris BREZILLON AT91_PMC_MOSCRCS | AT91_PMC_CFDEV, 1820ad6125bSBoris BREZILLON }; 1830ad6125bSBoris BREZILLON 1840ad6125bSBoris BREZILLON static const struct at91_pmc_caps sama5d3_caps = { 1850ad6125bSBoris BREZILLON .available_irqs = AT91_PMC_MOSCS | AT91_PMC_LOCKA | AT91_PMC_MCKRDY | 1860ad6125bSBoris BREZILLON AT91_PMC_LOCKU | AT91_PMC_PCK0RDY | 1870ad6125bSBoris BREZILLON AT91_PMC_PCK1RDY | AT91_PMC_PCK2RDY | 1880ad6125bSBoris BREZILLON AT91_PMC_MOSCSELS | AT91_PMC_MOSCRCS | 1890ad6125bSBoris BREZILLON AT91_PMC_CFDEV, 1900ad6125bSBoris BREZILLON }; 1910ad6125bSBoris BREZILLON 1920ad6125bSBoris BREZILLON static struct at91_pmc *__init at91_pmc_init(struct device_node *np, 1930ad6125bSBoris BREZILLON void __iomem *regbase, int virq, 1940ad6125bSBoris BREZILLON const struct at91_pmc_caps *caps) 1950ad6125bSBoris BREZILLON { 1960ad6125bSBoris BREZILLON struct at91_pmc *pmc; 1970ad6125bSBoris BREZILLON 1980ad6125bSBoris BREZILLON if (!regbase || !virq || !caps) 1990ad6125bSBoris BREZILLON return NULL; 2000ad6125bSBoris BREZILLON 2010ad6125bSBoris BREZILLON at91_pmc_base = regbase; 2020ad6125bSBoris BREZILLON 2030ad6125bSBoris BREZILLON pmc = kzalloc(sizeof(*pmc), GFP_KERNEL); 2040ad6125bSBoris BREZILLON if (!pmc) 2050ad6125bSBoris BREZILLON return NULL; 2060ad6125bSBoris BREZILLON 2070ad6125bSBoris BREZILLON spin_lock_init(&pmc->lock); 2080ad6125bSBoris BREZILLON pmc->regbase = regbase; 2090ad6125bSBoris BREZILLON pmc->virq = virq; 2100ad6125bSBoris BREZILLON pmc->caps = caps; 2110ad6125bSBoris BREZILLON 2120ad6125bSBoris BREZILLON pmc->irqdomain = irq_domain_add_linear(np, 32, &pmc_irq_ops, pmc); 2130ad6125bSBoris BREZILLON 2140ad6125bSBoris BREZILLON if (!pmc->irqdomain) 2150ad6125bSBoris BREZILLON goto out_free_pmc; 2160ad6125bSBoris BREZILLON 2170ad6125bSBoris BREZILLON pmc_write(pmc, AT91_PMC_IDR, 0xffffffff); 2180ad6125bSBoris BREZILLON if (request_irq(pmc->virq, pmc_irq_handler, IRQF_SHARED, "pmc", pmc)) 2190ad6125bSBoris BREZILLON goto out_remove_irqdomain; 2200ad6125bSBoris BREZILLON 2210ad6125bSBoris BREZILLON return pmc; 2220ad6125bSBoris BREZILLON 2230ad6125bSBoris BREZILLON out_remove_irqdomain: 2240ad6125bSBoris BREZILLON irq_domain_remove(pmc->irqdomain); 2250ad6125bSBoris BREZILLON out_free_pmc: 2260ad6125bSBoris BREZILLON kfree(pmc); 2270ad6125bSBoris BREZILLON 2280ad6125bSBoris BREZILLON return NULL; 2290ad6125bSBoris BREZILLON } 2300ad6125bSBoris BREZILLON 2310ad6125bSBoris BREZILLON static const struct of_device_id pmc_clk_ids[] __initdata = { 23238d34c31SBoris BREZILLON /* Main clock */ 23338d34c31SBoris BREZILLON { 23438d34c31SBoris BREZILLON .compatible = "atmel,at91rm9200-clk-main", 23538d34c31SBoris BREZILLON .data = of_at91rm9200_clk_main_setup, 23638d34c31SBoris BREZILLON }, 2371a748d2bSBoris BREZILLON /* PLL clocks */ 2381a748d2bSBoris BREZILLON { 2391a748d2bSBoris BREZILLON .compatible = "atmel,at91rm9200-clk-pll", 2401a748d2bSBoris BREZILLON .data = of_at91rm9200_clk_pll_setup, 2411a748d2bSBoris BREZILLON }, 2421a748d2bSBoris BREZILLON { 2431a748d2bSBoris BREZILLON .compatible = "atmel,at91sam9g45-clk-pll", 2441a748d2bSBoris BREZILLON .data = of_at91sam9g45_clk_pll_setup, 2451a748d2bSBoris BREZILLON }, 2461a748d2bSBoris BREZILLON { 2471a748d2bSBoris BREZILLON .compatible = "atmel,at91sam9g20-clk-pllb", 2481a748d2bSBoris BREZILLON .data = of_at91sam9g20_clk_pllb_setup, 2491a748d2bSBoris BREZILLON }, 2501a748d2bSBoris BREZILLON { 2511a748d2bSBoris BREZILLON .compatible = "atmel,sama5d3-clk-pll", 2521a748d2bSBoris BREZILLON .data = of_sama5d3_clk_pll_setup, 2531a748d2bSBoris BREZILLON }, 2541a748d2bSBoris BREZILLON { 2551a748d2bSBoris BREZILLON .compatible = "atmel,at91sam9x5-clk-plldiv", 2561a748d2bSBoris BREZILLON .data = of_at91sam9x5_clk_plldiv_setup, 2571a748d2bSBoris BREZILLON }, 258e442d234SBoris BREZILLON /* Master clock */ 259e442d234SBoris BREZILLON { 260e442d234SBoris BREZILLON .compatible = "atmel,at91rm9200-clk-master", 261e442d234SBoris BREZILLON .data = of_at91rm9200_clk_master_setup, 262e442d234SBoris BREZILLON }, 263e442d234SBoris BREZILLON { 264e442d234SBoris BREZILLON .compatible = "atmel,at91sam9x5-clk-master", 265e442d234SBoris BREZILLON .data = of_at91sam9x5_clk_master_setup, 266e442d234SBoris BREZILLON }, 2675fba62eaSBoris BREZILLON /* System clocks */ 2685fba62eaSBoris BREZILLON { 2695fba62eaSBoris BREZILLON .compatible = "atmel,at91rm9200-clk-system", 2705fba62eaSBoris BREZILLON .data = of_at91rm9200_clk_sys_setup, 2715fba62eaSBoris BREZILLON }, 2726114067eSBoris BREZILLON /* Peripheral clocks */ 2736114067eSBoris BREZILLON { 2746114067eSBoris BREZILLON .compatible = "atmel,at91rm9200-clk-peripheral", 2756114067eSBoris BREZILLON .data = of_at91rm9200_clk_periph_setup, 2766114067eSBoris BREZILLON }, 2776114067eSBoris BREZILLON { 2786114067eSBoris BREZILLON .compatible = "atmel,at91sam9x5-clk-peripheral", 2796114067eSBoris BREZILLON .data = of_at91sam9x5_clk_periph_setup, 2806114067eSBoris BREZILLON }, 2811f22f8bbSBoris BREZILLON /* Programmable clocks */ 2821f22f8bbSBoris BREZILLON #if defined(CONFIG_AT91_PROGRAMMABLE_CLOCKS) 2831f22f8bbSBoris BREZILLON { 2841f22f8bbSBoris BREZILLON .compatible = "atmel,at91rm9200-clk-programmable", 2851f22f8bbSBoris BREZILLON .data = of_at91rm9200_clk_prog_setup, 2861f22f8bbSBoris BREZILLON }, 2871f22f8bbSBoris BREZILLON { 2881f22f8bbSBoris BREZILLON .compatible = "atmel,at91sam9g45-clk-programmable", 2891f22f8bbSBoris BREZILLON .data = of_at91sam9g45_clk_prog_setup, 2901f22f8bbSBoris BREZILLON }, 2911f22f8bbSBoris BREZILLON { 2921f22f8bbSBoris BREZILLON .compatible = "atmel,at91sam9x5-clk-programmable", 2931f22f8bbSBoris BREZILLON .data = of_at91sam9x5_clk_prog_setup, 2941f22f8bbSBoris BREZILLON }, 2951f22f8bbSBoris BREZILLON #endif 296f090fb37SBoris BREZILLON /* UTMI clock */ 297f090fb37SBoris BREZILLON #if defined(CONFIG_HAVE_AT91_UTMI) 298f090fb37SBoris BREZILLON { 299f090fb37SBoris BREZILLON .compatible = "atmel,at91sam9x5-clk-utmi", 300f090fb37SBoris BREZILLON .data = of_at91sam9x5_clk_utmi_setup, 301f090fb37SBoris BREZILLON }, 302f090fb37SBoris BREZILLON #endif 3030ad6125bSBoris BREZILLON { /*sentinel*/ } 3040ad6125bSBoris BREZILLON }; 3050ad6125bSBoris BREZILLON 3060ad6125bSBoris BREZILLON static void __init of_at91_pmc_setup(struct device_node *np, 3070ad6125bSBoris BREZILLON const struct at91_pmc_caps *caps) 3080ad6125bSBoris BREZILLON { 3090ad6125bSBoris BREZILLON struct at91_pmc *pmc; 3100ad6125bSBoris BREZILLON struct device_node *childnp; 3110ad6125bSBoris BREZILLON void (*clk_setup)(struct device_node *, struct at91_pmc *); 3120ad6125bSBoris BREZILLON const struct of_device_id *clk_id; 3130ad6125bSBoris BREZILLON void __iomem *regbase = of_iomap(np, 0); 3140ad6125bSBoris BREZILLON int virq; 3150ad6125bSBoris BREZILLON 3160ad6125bSBoris BREZILLON if (!regbase) 3170ad6125bSBoris BREZILLON return; 3180ad6125bSBoris BREZILLON 3190ad6125bSBoris BREZILLON virq = irq_of_parse_and_map(np, 0); 3200ad6125bSBoris BREZILLON if (!virq) 3210ad6125bSBoris BREZILLON return; 3220ad6125bSBoris BREZILLON 3230ad6125bSBoris BREZILLON pmc = at91_pmc_init(np, regbase, virq, caps); 3240ad6125bSBoris BREZILLON if (!pmc) 3250ad6125bSBoris BREZILLON return; 3260ad6125bSBoris BREZILLON for_each_child_of_node(np, childnp) { 3270ad6125bSBoris BREZILLON clk_id = of_match_node(pmc_clk_ids, childnp); 3280ad6125bSBoris BREZILLON if (!clk_id) 3290ad6125bSBoris BREZILLON continue; 3300ad6125bSBoris BREZILLON clk_setup = clk_id->data; 3310ad6125bSBoris BREZILLON clk_setup(childnp, pmc); 3320ad6125bSBoris BREZILLON } 3330ad6125bSBoris BREZILLON } 3340ad6125bSBoris BREZILLON 3350ad6125bSBoris BREZILLON static void __init of_at91rm9200_pmc_setup(struct device_node *np) 3360ad6125bSBoris BREZILLON { 3370ad6125bSBoris BREZILLON of_at91_pmc_setup(np, &at91rm9200_caps); 3380ad6125bSBoris BREZILLON } 3390ad6125bSBoris BREZILLON CLK_OF_DECLARE(at91rm9200_clk_pmc, "atmel,at91rm9200-pmc", 3400ad6125bSBoris BREZILLON of_at91rm9200_pmc_setup); 3410ad6125bSBoris BREZILLON 3420ad6125bSBoris BREZILLON static void __init of_at91sam9260_pmc_setup(struct device_node *np) 3430ad6125bSBoris BREZILLON { 3440ad6125bSBoris BREZILLON of_at91_pmc_setup(np, &at91sam9260_caps); 3450ad6125bSBoris BREZILLON } 3460ad6125bSBoris BREZILLON CLK_OF_DECLARE(at91sam9260_clk_pmc, "atmel,at91sam9260-pmc", 3470ad6125bSBoris BREZILLON of_at91sam9260_pmc_setup); 3480ad6125bSBoris BREZILLON 3490ad6125bSBoris BREZILLON static void __init of_at91sam9g45_pmc_setup(struct device_node *np) 3500ad6125bSBoris BREZILLON { 3510ad6125bSBoris BREZILLON of_at91_pmc_setup(np, &at91sam9g45_caps); 3520ad6125bSBoris BREZILLON } 3530ad6125bSBoris BREZILLON CLK_OF_DECLARE(at91sam9g45_clk_pmc, "atmel,at91sam9g45-pmc", 3540ad6125bSBoris BREZILLON of_at91sam9g45_pmc_setup); 3550ad6125bSBoris BREZILLON 3560ad6125bSBoris BREZILLON static void __init of_at91sam9n12_pmc_setup(struct device_node *np) 3570ad6125bSBoris BREZILLON { 3580ad6125bSBoris BREZILLON of_at91_pmc_setup(np, &at91sam9n12_caps); 3590ad6125bSBoris BREZILLON } 3600ad6125bSBoris BREZILLON CLK_OF_DECLARE(at91sam9n12_clk_pmc, "atmel,at91sam9n12-pmc", 3610ad6125bSBoris BREZILLON of_at91sam9n12_pmc_setup); 3620ad6125bSBoris BREZILLON 3630ad6125bSBoris BREZILLON static void __init of_at91sam9x5_pmc_setup(struct device_node *np) 3640ad6125bSBoris BREZILLON { 3650ad6125bSBoris BREZILLON of_at91_pmc_setup(np, &at91sam9x5_caps); 3660ad6125bSBoris BREZILLON } 3670ad6125bSBoris BREZILLON CLK_OF_DECLARE(at91sam9x5_clk_pmc, "atmel,at91sam9x5-pmc", 3680ad6125bSBoris BREZILLON of_at91sam9x5_pmc_setup); 3690ad6125bSBoris BREZILLON 3700ad6125bSBoris BREZILLON static void __init of_sama5d3_pmc_setup(struct device_node *np) 3710ad6125bSBoris BREZILLON { 3720ad6125bSBoris BREZILLON of_at91_pmc_setup(np, &sama5d3_caps); 3730ad6125bSBoris BREZILLON } 3740ad6125bSBoris BREZILLON CLK_OF_DECLARE(sama5d3_clk_pmc, "atmel,sama5d3-pmc", 3750ad6125bSBoris BREZILLON of_sama5d3_pmc_setup); 376