Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Clock driver for TI Davinci PSC controllers
0004  *
0005  * Copyright (C) 2018 David Lechner <david@lechnology.com>
0006  */
0007 
0008 #ifndef __CLK_DAVINCI_PSC_H__
0009 #define __CLK_DAVINCI_PSC_H__
0010 
0011 #include <linux/clk-provider.h>
0012 #include <linux/types.h>
0013 
0014 /* PSC quirk flags */
0015 #define LPSC_ALWAYS_ENABLED BIT(0) /* never disable this clock */
0016 #define LPSC_SET_RATE_PARENT    BIT(1) /* propagate set_rate to parent clock */
0017 #define LPSC_FORCE      BIT(2) /* requires MDCTL FORCE bit */
0018 #define LPSC_LOCAL_RESET    BIT(3) /* acts as reset provider */
0019 
0020 struct davinci_lpsc_clkdev_info {
0021     const char *con_id;
0022     const char *dev_id;
0023 };
0024 
0025 #define LPSC_CLKDEV(c, d) { \
0026     .con_id = (c),      \
0027     .dev_id = (d)       \
0028 }
0029 
0030 #define LPSC_CLKDEV1(n, c, d) \
0031 static const struct davinci_lpsc_clkdev_info n[] __initconst = {    \
0032     LPSC_CLKDEV((c), (d)),                      \
0033     { }                             \
0034 }
0035 
0036 #define LPSC_CLKDEV2(n, c1, d1, c2, d2) \
0037 static const struct davinci_lpsc_clkdev_info n[] __initconst = {    \
0038     LPSC_CLKDEV((c1), (d1)),                    \
0039     LPSC_CLKDEV((c2), (d2)),                    \
0040     { }                             \
0041 }
0042 
0043 #define LPSC_CLKDEV3(n, c1, d1, c2, d2, c3, d3) \
0044 static const struct davinci_lpsc_clkdev_info n[] __initconst = {    \
0045     LPSC_CLKDEV((c1), (d1)),                    \
0046     LPSC_CLKDEV((c2), (d2)),                    \
0047     LPSC_CLKDEV((c3), (d3)),                    \
0048     { }                             \
0049 }
0050 
0051 /**
0052  * davinci_lpsc_clk_info - LPSC module-specific clock information
0053  * @name: the clock name
0054  * @parent: the parent clock name
0055  * @cdevs: optional array of clkdev lookup table info
0056  * @md: the local module domain (LPSC id)
0057  * @pd: the power domain id
0058  * @flags: bitmask of LPSC_* flags
0059  */
0060 struct davinci_lpsc_clk_info {
0061     const char *name;
0062     const char *parent;
0063     const struct davinci_lpsc_clkdev_info *cdevs;
0064     u32 md;
0065     u32 pd;
0066     unsigned long flags;
0067 };
0068 
0069 #define LPSC(m, d, n, p, c, f)  \
0070 {               \
0071     .name   = #n,       \
0072     .parent = #p,       \
0073     .cdevs  = (c),      \
0074     .md = (m),      \
0075     .pd = (d),      \
0076     .flags  = (f),      \
0077 }
0078 
0079 int davinci_psc_register_clocks(struct device *dev,
0080                 const struct davinci_lpsc_clk_info *info,
0081                 u8 num_clks,
0082                 void __iomem *base);
0083 
0084 int of_davinci_psc_clk_init(struct device *dev,
0085                 const struct davinci_lpsc_clk_info *info,
0086                 u8 num_clks,
0087                 void __iomem *base);
0088 
0089 /* Device-specific data */
0090 
0091 struct davinci_psc_init_data {
0092     struct clk_bulk_data *parent_clks;
0093     int num_parent_clks;
0094     int (*psc_init)(struct device *dev, void __iomem *base);
0095 };
0096 
0097 #ifdef CONFIG_ARCH_DAVINCI_DA830
0098 extern const struct davinci_psc_init_data da830_psc0_init_data;
0099 extern const struct davinci_psc_init_data da830_psc1_init_data;
0100 #endif
0101 #ifdef CONFIG_ARCH_DAVINCI_DA850
0102 extern const struct davinci_psc_init_data da850_psc0_init_data;
0103 extern const struct davinci_psc_init_data da850_psc1_init_data;
0104 extern const struct davinci_psc_init_data of_da850_psc0_init_data;
0105 extern const struct davinci_psc_init_data of_da850_psc1_init_data;
0106 #endif
0107 #ifdef CONFIG_ARCH_DAVINCI_DM355
0108 extern const struct davinci_psc_init_data dm355_psc_init_data;
0109 #endif
0110 #ifdef CONFIG_ARCH_DAVINCI_DM365
0111 extern const struct davinci_psc_init_data dm365_psc_init_data;
0112 #endif
0113 #ifdef CONFIG_ARCH_DAVINCI_DM644x
0114 extern const struct davinci_psc_init_data dm644x_psc_init_data;
0115 #endif
0116 #ifdef CONFIG_ARCH_DAVINCI_DM646x
0117 extern const struct davinci_psc_init_data dm646x_psc_init_data;
0118 #endif
0119 
0120 #endif /* __CLK_DAVINCI_PSC_H__ */