diff options
Diffstat (limited to 'drivers/bus/ti-sysc.c')
| -rw-r--r-- | drivers/bus/ti-sysc.c | 53 | 
1 files changed, 13 insertions, 40 deletions
diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c index 6afae9897843..6c49de37d5e9 100644 --- a/drivers/bus/ti-sysc.c +++ b/drivers/bus/ti-sysc.c @@ -648,43 +648,20 @@ static int sysc_init_resets(struct sysc *ddata)  static int sysc_parse_and_check_child_range(struct sysc *ddata)  {  	struct device_node *np = ddata->dev->of_node; -	const __be32 *ranges; -	u32 nr_addr, nr_size; -	int len, error; - -	ranges = of_get_property(np, "ranges", &len); -	if (!ranges) { -		dev_err(ddata->dev, "missing ranges for %pOF\n", np); - -		return -ENOENT; -	} - -	len /= sizeof(*ranges); - -	if (len < 3) { -		dev_err(ddata->dev, "incomplete ranges for %pOF\n", np); - -		return -EINVAL; -	} - -	error = of_property_read_u32(np, "#address-cells", &nr_addr); -	if (error) -		return -ENOENT; +	struct of_range_parser parser; +	struct of_range range; +	int error; -	error = of_property_read_u32(np, "#size-cells", &nr_size); +	error = of_range_parser_init(&parser, np);  	if (error) -		return -ENOENT; - -	if (nr_addr != 1 || nr_size != 1) { -		dev_err(ddata->dev, "invalid ranges for %pOF\n", np); +		return error; -		return -EINVAL; +	for_each_of_range(&parser, &range) { +		ddata->module_pa = range.cpu_addr; +		ddata->module_size = range.size; +		break;  	} -	ranges++; -	ddata->module_pa = of_translate_address(np, ranges++); -	ddata->module_size = be32_to_cpup(ranges); -  	return 0;  } @@ -913,7 +890,7 @@ static int sysc_check_registers(struct sysc *ddata)   * within the interconnect target module range. For example, SGX has   * them at offset 0x1fc00 in the 32MB module address space. And cpsw   * has them at offset 0x1200 in the CPSW_WR child. Usually the - * the interconnect target module registers are at the beginning of + * interconnect target module registers are at the beginning of   * the module range though.   */  static int sysc_ioremap(struct sysc *ddata) @@ -964,7 +941,7 @@ static int sysc_map_and_check_registers(struct sysc *ddata)  	sysc_check_children(ddata); -	if (!of_get_property(np, "reg", NULL)) +	if (!of_property_present(np, "reg"))  		return 0;  	error = sysc_parse_registers(ddata); @@ -2530,11 +2507,9 @@ static struct dev_pm_domain sysc_child_pm_domain = {  static void sysc_reinit_modules(struct sysc_soc_info *soc)  {  	struct sysc_module *module; -	struct list_head *pos;  	struct sysc *ddata; -	list_for_each(pos, &sysc_soc->restored_modules) { -		module = list_entry(pos, struct sysc_module, node); +	list_for_each_entry(module, &sysc_soc->restored_modules, node) {  		ddata = module->ddata;  		sysc_reinit_module(ddata, ddata->enabled);  	} @@ -3214,12 +3189,10 @@ static void sysc_cleanup_static_data(void)  static int sysc_check_disabled_devices(struct sysc *ddata)  {  	struct sysc_address *disabled_module; -	struct list_head *pos;  	int error = 0;  	mutex_lock(&sysc_soc->list_lock); -	list_for_each(pos, &sysc_soc->disabled_modules) { -		disabled_module = list_entry(pos, struct sysc_address, node); +	list_for_each_entry(disabled_module, &sysc_soc->disabled_modules, node) {  		if (ddata->module_pa == disabled_module->base) {  			dev_dbg(ddata->dev, "module disabled for this SoC\n");  			error = -ENODEV;  |