Skip to content

Commit 6bb1504

Browse files
committed
bus: mvebu-mbus: Remove open coded "ranges" parsing
"ranges" is a standard property, and we have common helper functions for parsing it, so let's use them. Cc: Andrew Lunn <andrew@lunn.ch> Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> Cc: Gregory Clement <gregory.clement@bootlin.com> Link: https://lore.kernel.org/r/20230216181204.2895676-1-robh@kernel.org Signed-off-by: Rob Herring <robh@kernel.org>
1 parent ff61bac commit 6bb1504

1 file changed

Lines changed: 8 additions & 50 deletions

File tree

drivers/bus/mvebu-mbus.c

Lines changed: 8 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1179,74 +1179,32 @@ static int __init mbus_dt_setup_win(struct mvebu_mbus_state *mbus,
11791179
return 0;
11801180
}
11811181

1182-
static int __init
1183-
mbus_parse_ranges(struct device_node *node,
1184-
int *addr_cells, int *c_addr_cells, int *c_size_cells,
1185-
int *cell_count, const __be32 **ranges_start,
1186-
const __be32 **ranges_end)
1187-
{
1188-
const __be32 *prop;
1189-
int ranges_len, tuple_len;
1190-
1191-
/* Allow a node with no 'ranges' property */
1192-
*ranges_start = of_get_property(node, "ranges", &ranges_len);
1193-
if (*ranges_start == NULL) {
1194-
*addr_cells = *c_addr_cells = *c_size_cells = *cell_count = 0;
1195-
*ranges_start = *ranges_end = NULL;
1196-
return 0;
1197-
}
1198-
*ranges_end = *ranges_start + ranges_len / sizeof(__be32);
1199-
1200-
*addr_cells = of_n_addr_cells(node);
1201-
1202-
prop = of_get_property(node, "#address-cells", NULL);
1203-
*c_addr_cells = be32_to_cpup(prop);
1204-
1205-
prop = of_get_property(node, "#size-cells", NULL);
1206-
*c_size_cells = be32_to_cpup(prop);
1207-
1208-
*cell_count = *addr_cells + *c_addr_cells + *c_size_cells;
1209-
tuple_len = (*cell_count) * sizeof(__be32);
1210-
1211-
if (ranges_len % tuple_len) {
1212-
pr_warn("malformed ranges entry '%pOFn'\n", node);
1213-
return -EINVAL;
1214-
}
1215-
return 0;
1216-
}
1217-
12181182
static int __init mbus_dt_setup(struct mvebu_mbus_state *mbus,
12191183
struct device_node *np)
12201184
{
1221-
int addr_cells, c_addr_cells, c_size_cells;
1222-
int i, ret, cell_count;
1223-
const __be32 *r, *ranges_start, *ranges_end;
1185+
int ret;
1186+
struct of_range_parser parser;
1187+
struct of_range range;
12241188

1225-
ret = mbus_parse_ranges(np, &addr_cells, &c_addr_cells,
1226-
&c_size_cells, &cell_count,
1227-
&ranges_start, &ranges_end);
1189+
ret = of_range_parser_init(&parser, np);
12281190
if (ret < 0)
1229-
return ret;
1191+
return 0;
12301192

1231-
for (i = 0, r = ranges_start; r < ranges_end; r += cell_count, i++) {
1232-
u32 windowid, base, size;
1193+
for_each_of_range(&parser, &range) {
1194+
u32 windowid = upper_32_bits(range.bus_addr);
12331195
u8 target, attr;
12341196

12351197
/*
12361198
* An entry with a non-zero custom field do not
12371199
* correspond to a static window, so skip it.
12381200
*/
1239-
windowid = of_read_number(r, 1);
12401201
if (CUSTOM(windowid))
12411202
continue;
12421203

12431204
target = TARGET(windowid);
12441205
attr = ATTR(windowid);
12451206

1246-
base = of_read_number(r + c_addr_cells, addr_cells);
1247-
size = of_read_number(r + c_addr_cells + addr_cells,
1248-
c_size_cells);
1249-
ret = mbus_dt_setup_win(mbus, base, size, target, attr);
1207+
ret = mbus_dt_setup_win(mbus, range.cpu_addr, range.size, target, attr);
12501208
if (ret < 0)
12511209
return ret;
12521210
}

0 commit comments

Comments
 (0)