Lines Matching +full:syscon +full:- +full:clk
1 // SPDX-License-Identifier: GPL-2.0-or-later
11 #include <linux/clk.h>
20 #include <linux/platform_data/syscon.h>
23 #include <linux/mfd/syscon.h>
31 struct syscon { struct
43 static struct syscon *of_syscon_register(struct device_node *np, bool check_clk) in of_syscon_register() argument
45 struct clk *clk; in of_syscon_register() local
46 struct syscon *syscon; in of_syscon_register() local
54 syscon = kzalloc(sizeof(*syscon), GFP_KERNEL); in of_syscon_register()
55 if (!syscon) in of_syscon_register()
56 return ERR_PTR(-ENOMEM); in of_syscon_register()
59 ret = -ENOMEM; in of_syscon_register()
65 ret = -ENOMEM; in of_syscon_register()
70 if (of_property_read_bool(np, "big-endian")) in of_syscon_register()
72 else if (of_property_read_bool(np, "little-endian")) in of_syscon_register()
74 else if (of_property_read_bool(np, "native-endian")) in of_syscon_register()
78 * search for reg-io-width property in DT. If it is not provided, in of_syscon_register()
82 ret = of_property_read_u32(np, "reg-io-width", ®_io_width); in of_syscon_register()
93 case -ENOENT: in of_syscon_register()
99 case -EPROBE_DEFER: in of_syscon_register()
107 ret = -ENOMEM; in of_syscon_register()
112 syscon_config.max_register = resource_size(&res) - reg_io_width; in of_syscon_register()
123 clk = of_clk_get(np, 0); in of_syscon_register()
124 if (IS_ERR(clk)) { in of_syscon_register()
125 ret = PTR_ERR(clk); in of_syscon_register()
127 if (ret != -ENOENT) in of_syscon_register()
130 ret = regmap_mmio_attach_clk(regmap, clk); in of_syscon_register()
136 syscon->regmap = regmap; in of_syscon_register()
137 syscon->np = np; in of_syscon_register()
140 list_add_tail(&syscon->list, &syscon_list); in of_syscon_register()
143 return syscon; in of_syscon_register()
146 if (!IS_ERR(clk)) in of_syscon_register()
147 clk_put(clk); in of_syscon_register()
153 kfree(syscon); in of_syscon_register()
160 struct syscon *entry, *syscon = NULL; in device_node_get_regmap() local
165 if (entry->np == np) { in device_node_get_regmap()
166 syscon = entry; in device_node_get_regmap()
172 if (!syscon) in device_node_get_regmap()
173 syscon = of_syscon_register(np, check_clk); in device_node_get_regmap()
175 if (IS_ERR(syscon)) in device_node_get_regmap()
176 return ERR_CAST(syscon); in device_node_get_regmap()
178 return syscon->regmap; in device_node_get_regmap()
189 if (!of_device_is_compatible(np, "syscon")) in syscon_node_to_regmap()
190 return ERR_PTR(-EINVAL); in syscon_node_to_regmap()
203 return ERR_PTR(-ENODEV); in syscon_regmap_lookup_by_compatible()
224 return ERR_PTR(-ENODEV); in syscon_regmap_lookup_by_phandle()
251 return ERR_PTR(-ENODEV); in syscon_regmap_lookup_by_phandle_args()
264 struct device *dev = &pdev->dev; in syscon_probe()
266 struct syscon *syscon; in syscon_probe() local
271 syscon = devm_kzalloc(dev, sizeof(*syscon), GFP_KERNEL); in syscon_probe()
272 if (!syscon) in syscon_probe()
273 return -ENOMEM; in syscon_probe()
277 return -ENOENT; in syscon_probe()
279 base = devm_ioremap(dev, res->start, resource_size(res)); in syscon_probe()
281 return -ENOMEM; in syscon_probe()
283 syscon_config.max_register = resource_size(res) - 4; in syscon_probe()
285 syscon_config.name = pdata->label; in syscon_probe()
286 syscon->regmap = devm_regmap_init_mmio(dev, base, &syscon_config); in syscon_probe()
287 if (IS_ERR(syscon->regmap)) { in syscon_probe()
289 return PTR_ERR(syscon->regmap); in syscon_probe()
292 platform_set_drvdata(pdev, syscon); in syscon_probe()
300 { "syscon", },
306 .name = "syscon",