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>
24 #include <linux/mfd/syscon.h>
32 struct syscon { struct
45 static struct syscon *of_syscon_register(struct device_node *np, bool check_res) in of_syscon_register() argument
47 struct clk *clk; in of_syscon_register() local
48 struct syscon *syscon; in of_syscon_register() local
57 syscon = kzalloc(sizeof(*syscon), GFP_KERNEL); in of_syscon_register()
58 if (!syscon) in of_syscon_register()
59 return ERR_PTR(-ENOMEM); in of_syscon_register()
62 ret = -ENOMEM; in of_syscon_register()
68 ret = -ENOMEM; in of_syscon_register()
73 if (of_property_read_bool(np, "big-endian")) in of_syscon_register()
75 else if (of_property_read_bool(np, "little-endian")) in of_syscon_register()
77 else if (of_property_read_bool(np, "native-endian")) in of_syscon_register()
81 * search for reg-io-width property in DT. If it is not provided, in of_syscon_register()
85 ret = of_property_read_u32(np, "reg-io-width", ®_io_width); in of_syscon_register()
96 case -ENOENT: in of_syscon_register()
102 case -EPROBE_DEFER: in of_syscon_register()
109 ret = -ENOMEM; in of_syscon_register()
114 syscon_config.max_register = resource_size(&res) - reg_io_width; in of_syscon_register()
125 clk = of_clk_get(np, 0); in of_syscon_register()
126 if (IS_ERR(clk)) { in of_syscon_register()
127 ret = PTR_ERR(clk); in of_syscon_register()
129 if (ret != -ENOENT) in of_syscon_register()
132 ret = regmap_mmio_attach_clk(regmap, clk); in of_syscon_register()
148 syscon->regmap = regmap; in of_syscon_register()
149 syscon->np = np; in of_syscon_register()
152 list_add_tail(&syscon->list, &syscon_list); in of_syscon_register()
155 return syscon; in of_syscon_register()
160 if (!IS_ERR(clk)) in of_syscon_register()
161 clk_put(clk); in of_syscon_register()
167 kfree(syscon); in of_syscon_register()
174 struct syscon *entry, *syscon = NULL; in device_node_get_regmap() local
179 if (entry->np == np) { in device_node_get_regmap()
180 syscon = entry; in device_node_get_regmap()
186 if (!syscon) in device_node_get_regmap()
187 syscon = of_syscon_register(np, check_res); in device_node_get_regmap()
189 if (IS_ERR(syscon)) in device_node_get_regmap()
190 return ERR_CAST(syscon); in device_node_get_regmap()
192 return syscon->regmap; in device_node_get_regmap()
203 if (!of_device_is_compatible(np, "syscon")) in syscon_node_to_regmap()
204 return ERR_PTR(-EINVAL); in syscon_node_to_regmap()
217 return ERR_PTR(-ENODEV); in syscon_regmap_lookup_by_compatible()
238 return ERR_PTR(-ENODEV); in syscon_regmap_lookup_by_phandle()
267 return ERR_PTR(-ENODEV); in syscon_regmap_lookup_by_phandle_args()
280 * there is no regmap phandle. In this case, instead of returning -ENODEV,
289 if (IS_ERR(regmap) && PTR_ERR(regmap) == -ENODEV) in syscon_regmap_lookup_by_phandle_optional()
298 struct device *dev = &pdev->dev; in syscon_probe()
300 struct syscon *syscon; in syscon_probe() local
305 syscon = devm_kzalloc(dev, sizeof(*syscon), GFP_KERNEL); in syscon_probe()
306 if (!syscon) in syscon_probe()
307 return -ENOMEM; in syscon_probe()
311 return -ENOENT; in syscon_probe()
313 base = devm_ioremap(dev, res->start, resource_size(res)); in syscon_probe()
315 return -ENOMEM; in syscon_probe()
317 syscon_config.max_register = resource_size(res) - 4; in syscon_probe()
319 syscon_config.name = pdata->label; in syscon_probe()
320 syscon->regmap = devm_regmap_init_mmio(dev, base, &syscon_config); in syscon_probe()
321 if (IS_ERR(syscon->regmap)) { in syscon_probe()
323 return PTR_ERR(syscon->regmap); in syscon_probe()
326 platform_set_drvdata(pdev, syscon); in syscon_probe()
334 { "syscon", },
340 .name = "syscon",