forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-11 04dd17822334871b23ea2862f7798fb0e0007777
kernel/drivers/clk/sprd/common.c
....@@ -17,7 +17,6 @@
1717 .reg_bits = 32,
1818 .reg_stride = 4,
1919 .val_bits = 32,
20
- .max_register = 0xffff,
2120 .fast_io = true,
2221 };
2322
....@@ -40,8 +39,11 @@
4039 const struct sprd_clk_desc *desc)
4140 {
4241 void __iomem *base;
43
- struct device_node *node = pdev->dev.of_node;
42
+ struct device *dev = &pdev->dev;
43
+ struct device_node *node = dev->of_node, *np;
4444 struct regmap *regmap;
45
+ struct resource *res;
46
+ struct regmap_config reg_config = sprdclk_regmap_config;
4547
4648 if (of_find_property(node, "sprd,syscon", NULL)) {
4749 regmap = syscon_regmap_lookup_by_phandle(node, "sprd,syscon");
....@@ -49,11 +51,24 @@
4951 pr_err("%s: failed to get syscon regmap\n", __func__);
5052 return PTR_ERR(regmap);
5153 }
54
+ } else if (of_device_is_compatible(np = of_get_parent(node), "syscon") ||
55
+ (of_node_put(np), 0)) {
56
+ regmap = device_node_to_regmap(np);
57
+ of_node_put(np);
58
+ if (IS_ERR(regmap)) {
59
+ dev_err(dev, "failed to get regmap from its parent.\n");
60
+ return PTR_ERR(regmap);
61
+ }
5262 } else {
53
- base = of_iomap(node, 0);
63
+ base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
64
+ if (IS_ERR(base))
65
+ return PTR_ERR(base);
66
+
67
+ reg_config.max_register = resource_size(res) - reg_config.reg_stride;
68
+
5469 regmap = devm_regmap_init_mmio(&pdev->dev, base,
55
- &sprdclk_regmap_config);
56
- if (IS_ERR_OR_NULL(regmap)) {
70
+ &reg_config);
71
+ if (IS_ERR(regmap)) {
5772 pr_err("failed to init regmap\n");
5873 return PTR_ERR(regmap);
5974 }