PM / devfreq: rockchip_bus: support parse soc-bus-table

Signed-off-by: XiaoDong Huang <derrick.huang@rock-chips.com>
Change-Id: I76ff30103cfa93289b9ecde0d95f42f960284e9b
This commit is contained in:
XiaoDong Huang
2022-11-16 11:41:41 +08:00
committed by Tao Huang
parent 1cde5fb12c
commit 8fedbbb946

View File

@@ -73,7 +73,9 @@ static int rockchip_bus_smc_config(struct rockchip_bus *bus)
struct device_node *np = dev->of_node;
struct device_node *child;
unsigned int enable_msk, bus_id, cfg;
int ret;
char *prp_name = "rockchip,soc-bus-table";
u32 *table = NULL;
int ret = 0, config_cnt, i;
for_each_available_child_of_node(np, child) {
ret = of_property_read_u32_index(child, "bus-id", 0,
@@ -108,7 +110,49 @@ static int rockchip_bus_smc_config(struct rockchip_bus *bus)
}
}
return 0;
config_cnt = of_property_count_u32_elems(np, prp_name);
if (config_cnt <= 0) {
return 0;
} else if (config_cnt % 3) {
dev_err(dev, "Invalid count of %s\n", prp_name);
return -EINVAL;
}
table = kmalloc_array(config_cnt, sizeof(u32), GFP_KERNEL);
if (!table)
return -ENOMEM;
ret = of_property_read_u32_array(np, prp_name, table, config_cnt);
if (ret) {
dev_err(dev, "get %s error\n", prp_name);
goto free_table;
}
/* table[3n]: bus_id
* table[3n + 1]: config
* table[3n + 2]: enable_mask
*/
for (i = 0; i < config_cnt; i += 3) {
bus_id = table[i];
cfg = table[i + 1];
enable_msk = table[i + 2];
if (!cfg) {
dev_info(dev, "cfg-val invalid in %s-%d\n", prp_name, bus_id);
continue;
}
ret = rockchip_sip_bus_smc_config(bus_id, cfg, enable_msk);
if (ret) {
dev_err(dev, "bus smc config error: %x!\n", ret);
goto free_table;
}
}
free_table:
kfree(table);
return ret;
}
static int rockchip_bus_set_freq_table(struct rockchip_bus *bus)