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()
108 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()
132 syscon->regmap = regmap; in of_syscon_register()
133 syscon->np = np; in of_syscon_register()
136 list_add_tail(&syscon->list, &syscon_list); in of_syscon_register()
139 return syscon; in of_syscon_register()
142 if (!IS_ERR(clk)) in of_syscon_register()
143 clk_put(clk); in of_syscon_register()
149 kfree(syscon); in of_syscon_register()
156 struct syscon *entry, *syscon = NULL; in device_node_get_regmap() local
161 if (entry->np == np) { in device_node_get_regmap()
162 syscon = entry; in device_node_get_regmap()
168 if (!syscon) in device_node_get_regmap()
169 syscon = of_syscon_register(np, check_clk); in device_node_get_regmap()
171 if (IS_ERR(syscon)) in device_node_get_regmap()
172 return ERR_CAST(syscon); in device_node_get_regmap()
174 return syscon->regmap; in device_node_get_regmap()
185 if (!of_device_is_compatible(np, "syscon")) in syscon_node_to_regmap()
186 return ERR_PTR(-EINVAL); in syscon_node_to_regmap()
199 return ERR_PTR(-ENODEV); in syscon_regmap_lookup_by_compatible()
220 return ERR_PTR(-ENODEV); in syscon_regmap_lookup_by_phandle()
247 return ERR_PTR(-ENODEV); in syscon_regmap_lookup_by_phandle_args()
260 * there is no regmap phandle. In this case, instead of returning -ENODEV,
269 if (IS_ERR(regmap) && PTR_ERR(regmap) == -ENODEV) in syscon_regmap_lookup_by_phandle_optional()
278 struct device *dev = &pdev->dev; in syscon_probe()
280 struct syscon *syscon; in syscon_probe() local
285 syscon = devm_kzalloc(dev, sizeof(*syscon), GFP_KERNEL); in syscon_probe()
286 if (!syscon) in syscon_probe()
287 return -ENOMEM; in syscon_probe()
291 return -ENOENT; in syscon_probe()
293 base = devm_ioremap(dev, res->start, resource_size(res)); in syscon_probe()
295 return -ENOMEM; in syscon_probe()
297 syscon_config.max_register = resource_size(res) - 4; in syscon_probe()
299 syscon_config.name = pdata->label; in syscon_probe()
300 syscon->regmap = devm_regmap_init_mmio(dev, base, &syscon_config); in syscon_probe()
301 if (IS_ERR(syscon->regmap)) { in syscon_probe()
303 return PTR_ERR(syscon->regmap); in syscon_probe()
306 platform_set_drvdata(pdev, syscon); in syscon_probe()
314 { "syscon", },
320 .name = "syscon",