162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Clock driver for TI Davinci PSC controllers 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2018 David Lechner <david@lechnology.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef __CLK_DAVINCI_PSC_H__ 962306a36Sopenharmony_ci#define __CLK_DAVINCI_PSC_H__ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/clk-provider.h> 1262306a36Sopenharmony_ci#include <linux/types.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* PSC quirk flags */ 1562306a36Sopenharmony_ci#define LPSC_ALWAYS_ENABLED BIT(0) /* never disable this clock */ 1662306a36Sopenharmony_ci#define LPSC_SET_RATE_PARENT BIT(1) /* propagate set_rate to parent clock */ 1762306a36Sopenharmony_ci#define LPSC_FORCE BIT(2) /* requires MDCTL FORCE bit */ 1862306a36Sopenharmony_ci#define LPSC_LOCAL_RESET BIT(3) /* acts as reset provider */ 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistruct davinci_lpsc_clkdev_info { 2162306a36Sopenharmony_ci const char *con_id; 2262306a36Sopenharmony_ci const char *dev_id; 2362306a36Sopenharmony_ci}; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define LPSC_CLKDEV(c, d) { \ 2662306a36Sopenharmony_ci .con_id = (c), \ 2762306a36Sopenharmony_ci .dev_id = (d) \ 2862306a36Sopenharmony_ci} 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#define LPSC_CLKDEV1(n, c, d) \ 3162306a36Sopenharmony_cistatic const struct davinci_lpsc_clkdev_info n[] __initconst = { \ 3262306a36Sopenharmony_ci LPSC_CLKDEV((c), (d)), \ 3362306a36Sopenharmony_ci { } \ 3462306a36Sopenharmony_ci} 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define LPSC_CLKDEV2(n, c1, d1, c2, d2) \ 3762306a36Sopenharmony_cistatic const struct davinci_lpsc_clkdev_info n[] __initconst = { \ 3862306a36Sopenharmony_ci LPSC_CLKDEV((c1), (d1)), \ 3962306a36Sopenharmony_ci LPSC_CLKDEV((c2), (d2)), \ 4062306a36Sopenharmony_ci { } \ 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#define LPSC_CLKDEV3(n, c1, d1, c2, d2, c3, d3) \ 4462306a36Sopenharmony_cistatic const struct davinci_lpsc_clkdev_info n[] __initconst = { \ 4562306a36Sopenharmony_ci LPSC_CLKDEV((c1), (d1)), \ 4662306a36Sopenharmony_ci LPSC_CLKDEV((c2), (d2)), \ 4762306a36Sopenharmony_ci LPSC_CLKDEV((c3), (d3)), \ 4862306a36Sopenharmony_ci { } \ 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci/** 5262306a36Sopenharmony_ci * davinci_lpsc_clk_info - LPSC module-specific clock information 5362306a36Sopenharmony_ci * @name: the clock name 5462306a36Sopenharmony_ci * @parent: the parent clock name 5562306a36Sopenharmony_ci * @cdevs: optional array of clkdev lookup table info 5662306a36Sopenharmony_ci * @md: the local module domain (LPSC id) 5762306a36Sopenharmony_ci * @pd: the power domain id 5862306a36Sopenharmony_ci * @flags: bitmask of LPSC_* flags 5962306a36Sopenharmony_ci */ 6062306a36Sopenharmony_cistruct davinci_lpsc_clk_info { 6162306a36Sopenharmony_ci const char *name; 6262306a36Sopenharmony_ci const char *parent; 6362306a36Sopenharmony_ci const struct davinci_lpsc_clkdev_info *cdevs; 6462306a36Sopenharmony_ci u32 md; 6562306a36Sopenharmony_ci u32 pd; 6662306a36Sopenharmony_ci unsigned long flags; 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#define LPSC(m, d, n, p, c, f) \ 7062306a36Sopenharmony_ci{ \ 7162306a36Sopenharmony_ci .name = #n, \ 7262306a36Sopenharmony_ci .parent = #p, \ 7362306a36Sopenharmony_ci .cdevs = (c), \ 7462306a36Sopenharmony_ci .md = (m), \ 7562306a36Sopenharmony_ci .pd = (d), \ 7662306a36Sopenharmony_ci .flags = (f), \ 7762306a36Sopenharmony_ci} 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ciint davinci_psc_register_clocks(struct device *dev, 8062306a36Sopenharmony_ci const struct davinci_lpsc_clk_info *info, 8162306a36Sopenharmony_ci u8 num_clks, 8262306a36Sopenharmony_ci void __iomem *base); 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ciint of_davinci_psc_clk_init(struct device *dev, 8562306a36Sopenharmony_ci const struct davinci_lpsc_clk_info *info, 8662306a36Sopenharmony_ci u8 num_clks, 8762306a36Sopenharmony_ci void __iomem *base); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci/* Device-specific data */ 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cistruct davinci_psc_init_data { 9262306a36Sopenharmony_ci struct clk_bulk_data *parent_clks; 9362306a36Sopenharmony_ci int num_parent_clks; 9462306a36Sopenharmony_ci int (*psc_init)(struct device *dev, void __iomem *base); 9562306a36Sopenharmony_ci}; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci#ifdef CONFIG_ARCH_DAVINCI_DA830 9862306a36Sopenharmony_ciextern const struct davinci_psc_init_data da830_psc0_init_data; 9962306a36Sopenharmony_ciextern const struct davinci_psc_init_data da830_psc1_init_data; 10062306a36Sopenharmony_ci#endif 10162306a36Sopenharmony_ci#ifdef CONFIG_ARCH_DAVINCI_DA850 10262306a36Sopenharmony_ciextern const struct davinci_psc_init_data da850_psc0_init_data; 10362306a36Sopenharmony_ciextern const struct davinci_psc_init_data da850_psc1_init_data; 10462306a36Sopenharmony_ciextern const struct davinci_psc_init_data of_da850_psc0_init_data; 10562306a36Sopenharmony_ciextern const struct davinci_psc_init_data of_da850_psc1_init_data; 10662306a36Sopenharmony_ci#endif 10762306a36Sopenharmony_ci#endif /* __CLK_DAVINCI_PSC_H__ */ 108