Lines Matching +full:syscon +full:- +full:clk

1 // SPDX-License-Identifier: GPL-2.0-or-later
12 #include <linux/clk.h>
21 #include <linux/mfd/syscon.h>
27 struct syscon { struct
40 static struct syscon *of_syscon_register(struct device_node *np, bool check_res) in of_syscon_register() argument
42 struct clk *clk; in of_syscon_register() local
53 struct syscon *syscon __free(kfree) = kzalloc(sizeof(*syscon), GFP_KERNEL); in of_syscon_register()
54 if (!syscon) in of_syscon_register()
55 return ERR_PTR(-ENOMEM); in of_syscon_register()
58 return ERR_PTR(-ENOMEM); in of_syscon_register()
62 return ERR_PTR(-ENOMEM); in of_syscon_register()
65 if (of_property_read_bool(np, "big-endian")) in of_syscon_register()
67 else if (of_property_read_bool(np, "little-endian")) in of_syscon_register()
69 else if (of_property_read_bool(np, "native-endian")) in of_syscon_register()
73 * search for reg-io-width property in DT. If it is not provided, in of_syscon_register()
77 ret = of_property_read_u32(np, "reg-io-width", &reg_io_width); in of_syscon_register()
88 case -ENOENT: in of_syscon_register()
94 case -EPROBE_DEFER: in of_syscon_register()
101 ret = -ENOMEM; in of_syscon_register()
106 syscon_config.max_register = resource_size(&res) - reg_io_width; in of_syscon_register()
119 clk = of_clk_get(np, 0); in of_syscon_register()
120 if (IS_ERR(clk)) { in of_syscon_register()
121 ret = PTR_ERR(clk); in of_syscon_register()
123 if (ret != -ENOENT) in of_syscon_register()
126 ret = regmap_mmio_attach_clk(regmap, clk); in of_syscon_register()
142 syscon->regmap = regmap; in of_syscon_register()
143 syscon->np = np; in of_syscon_register()
145 list_add_tail(&syscon->list, &syscon_list); in of_syscon_register()
147 return_ptr(syscon); in of_syscon_register()
152 if (!IS_ERR(clk)) in of_syscon_register()
153 clk_put(clk); in of_syscon_register()
165 struct syscon *entry, *syscon = NULL; in device_node_get_regmap() local
170 if (entry->np == np) { in device_node_get_regmap()
171 syscon = entry; in device_node_get_regmap()
175 if (!syscon) { in device_node_get_regmap()
177 syscon = of_syscon_register(np, check_res); in device_node_get_regmap()
179 syscon = ERR_PTR(-EINVAL); in device_node_get_regmap()
183 if (IS_ERR(syscon)) in device_node_get_regmap()
184 return ERR_CAST(syscon); in device_node_get_regmap()
186 return syscon->regmap; in device_node_get_regmap()
190 * of_syscon_register_regmap() - Register regmap for specified device node
194 * Register an externally created regmap object with syscon for the specified
202 struct syscon *entry, *syscon = NULL; in of_syscon_register_regmap() local
206 return -EINVAL; in of_syscon_register_regmap()
208 syscon = kzalloc(sizeof(*syscon), GFP_KERNEL); in of_syscon_register_regmap()
209 if (!syscon) in of_syscon_register_regmap()
210 return -ENOMEM; in of_syscon_register_regmap()
212 /* check if syscon entry already exists */ in of_syscon_register_regmap()
216 if (entry->np == np) { in of_syscon_register_regmap()
217 ret = -EEXIST; in of_syscon_register_regmap()
221 syscon->regmap = regmap; in of_syscon_register_regmap()
222 syscon->np = np; in of_syscon_register_regmap()
224 /* register the regmap in syscon list */ in of_syscon_register_regmap()
225 list_add_tail(&syscon->list, &syscon_list); in of_syscon_register_regmap()
232 kfree(syscon); in of_syscon_register_regmap()
238 * device_node_to_regmap() - Get or create a regmap for specified device node
255 * syscon_node_to_regmap() - Get or create a regmap for specified syscon device node
259 * regmap, then one is instantiated if the node is a generic "syscon". This
260 * function is safe to use for a syscon registered with
267 return device_node_get_regmap(np, of_device_is_compatible(np, "syscon"), true); in syscon_node_to_regmap()
278 return ERR_PTR(-ENODEV); in syscon_regmap_lookup_by_compatible()
299 return ERR_PTR(-ENODEV); in syscon_regmap_lookup_by_phandle()
328 return ERR_PTR(-ENODEV); in syscon_regmap_lookup_by_phandle_args()
341 * there is no regmap phandle. In this case, instead of returning -ENODEV,
350 if (IS_ERR(regmap) && PTR_ERR(regmap) == -ENODEV) in syscon_regmap_lookup_by_phandle_optional()