Skip to content

Commit 0995952

Browse files
robherringarndb
authored andcommitted
bus: fsl-mc: Use common ranges functions
Since commit 3d5089c ("of/address: Add support for 3 address cell bus"), the DT address functions can handle translating buses with 3 address cells. Replace the custom code with the for_each_of_range() iterator. The original code had fallbacks to get "#address-cells"/"#size-cells" from the bus parent node if they are missing. This is non-standard behavior, and AFAICT the upstream .dts files never relied on that. Reviewed-by: Laurentiu Tudor <laurentiu.tudor@nxp.com> Tested-by: Laurentiu Tudor <laurentiu.tudor@nxp.com> Signed-off-by: Rob Herring <robh@kernel.org> Link: https://lore.kernel.org/r/20230823190958.2717267-1-robh@kernel.org Signed-off-by: Arnd Bergmann <arnd@arndb.de>
1 parent a9d3965 commit 0995952

File tree

1 file changed

+13
-77
lines changed

1 file changed

+13
-77
lines changed

drivers/bus/fsl-mc/fsl-mc-bus.c

Lines changed: 13 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -994,75 +994,18 @@ struct fsl_mc_device *fsl_mc_get_endpoint(struct fsl_mc_device *mc_dev,
994994
}
995995
EXPORT_SYMBOL_GPL(fsl_mc_get_endpoint);
996996

997-
static int parse_mc_ranges(struct device *dev,
998-
int *paddr_cells,
999-
int *mc_addr_cells,
1000-
int *mc_size_cells,
1001-
const __be32 **ranges_start)
1002-
{
1003-
const __be32 *prop;
1004-
int range_tuple_cell_count;
1005-
int ranges_len;
1006-
int tuple_len;
1007-
struct device_node *mc_node = dev->of_node;
1008-
1009-
*ranges_start = of_get_property(mc_node, "ranges", &ranges_len);
1010-
if (!(*ranges_start) || !ranges_len) {
1011-
dev_warn(dev,
1012-
"missing or empty ranges property for device tree node '%pOFn'\n",
1013-
mc_node);
1014-
return 0;
1015-
}
1016-
1017-
*paddr_cells = of_n_addr_cells(mc_node);
1018-
1019-
prop = of_get_property(mc_node, "#address-cells", NULL);
1020-
if (prop)
1021-
*mc_addr_cells = be32_to_cpup(prop);
1022-
else
1023-
*mc_addr_cells = *paddr_cells;
1024-
1025-
prop = of_get_property(mc_node, "#size-cells", NULL);
1026-
if (prop)
1027-
*mc_size_cells = be32_to_cpup(prop);
1028-
else
1029-
*mc_size_cells = of_n_size_cells(mc_node);
1030-
1031-
range_tuple_cell_count = *paddr_cells + *mc_addr_cells +
1032-
*mc_size_cells;
1033-
1034-
tuple_len = range_tuple_cell_count * sizeof(__be32);
1035-
if (ranges_len % tuple_len != 0) {
1036-
dev_err(dev, "malformed ranges property '%pOFn'\n", mc_node);
1037-
return -EINVAL;
1038-
}
1039-
1040-
return ranges_len / tuple_len;
1041-
}
1042-
1043997
static int get_mc_addr_translation_ranges(struct device *dev,
1044998
struct fsl_mc_addr_translation_range
1045999
**ranges,
10461000
u8 *num_ranges)
10471001
{
1048-
int ret;
1049-
int paddr_cells;
1050-
int mc_addr_cells;
1051-
int mc_size_cells;
1052-
int i;
1053-
const __be32 *ranges_start;
1054-
const __be32 *cell;
1055-
1056-
ret = parse_mc_ranges(dev,
1057-
&paddr_cells,
1058-
&mc_addr_cells,
1059-
&mc_size_cells,
1060-
&ranges_start);
1061-
if (ret < 0)
1062-
return ret;
1002+
struct fsl_mc_addr_translation_range *r;
1003+
struct of_range_parser parser;
1004+
struct of_range range;
10631005

1064-
*num_ranges = ret;
1065-
if (!ret) {
1006+
of_range_parser_init(&parser, dev->of_node);
1007+
*num_ranges = of_range_count(&parser);
1008+
if (!*num_ranges) {
10661009
/*
10671010
* Missing or empty ranges property ("ranges;") for the
10681011
* 'fsl,qoriq-mc' node. In this case, identity mapping
@@ -1078,20 +1021,13 @@ static int get_mc_addr_translation_ranges(struct device *dev,
10781021
if (!(*ranges))
10791022
return -ENOMEM;
10801023

1081-
cell = ranges_start;
1082-
for (i = 0; i < *num_ranges; ++i) {
1083-
struct fsl_mc_addr_translation_range *range = &(*ranges)[i];
1084-
1085-
range->mc_region_type = of_read_number(cell, 1);
1086-
range->start_mc_offset = of_read_number(cell + 1,
1087-
mc_addr_cells - 1);
1088-
cell += mc_addr_cells;
1089-
range->start_phys_addr = of_read_number(cell, paddr_cells);
1090-
cell += paddr_cells;
1091-
range->end_mc_offset = range->start_mc_offset +
1092-
of_read_number(cell, mc_size_cells);
1093-
1094-
cell += mc_size_cells;
1024+
r = *ranges;
1025+
for_each_of_range(&parser, &range) {
1026+
r->mc_region_type = range.flags;
1027+
r->start_mc_offset = range.bus_addr;
1028+
r->end_mc_offset = range.bus_addr + range.size;
1029+
r->start_phys_addr = range.cpu_addr;
1030+
r++;
10951031
}
10961032

10971033
return 0;

0 commit comments

Comments
 (0)