Teach ofw_bus_parse_xref_list_alloc to be able to return the length of the parsed list.
Currently, there is no easy way to know in advance how many entries a list parsed by ofw_bus_parse_xref_list_alloc() in sys/dev/ofw/ofw_bus_subr.c has. This patch: * teaches the existing function about handling idx == -1 and returning how big the set is; then renames it as _internal; * create a new function that asserts idx != -1, so the old API is maintained; * add a new function that returns just the list length. Submitted by: Stanislav Galabov <sgalabov@gmail.com> Differential Revision: https://reviews.freebsd.org/D5043
This commit is contained in:
parent
6f1f5e23c6
commit
93fc03e6d8
@ -629,13 +629,16 @@ ofw_bus_find_child_device_by_phandle(device_t bus, phandle_t node)
|
||||
* node - consumers device node
|
||||
* list_name - name of parsed list - "clocks"
|
||||
* cells_name - name of size property - "#clock-cells"
|
||||
* idx - the index of the requested list entry, or, if -1, an indication
|
||||
* to return the number of entries in the parsed list.
|
||||
* Output arguments:
|
||||
* producer - handle of producer
|
||||
* ncells - number of cells in result
|
||||
* ncells - number of cells in result or the number of items in the list when
|
||||
* idx == -1.
|
||||
* cells - array of decoded cells
|
||||
*/
|
||||
int
|
||||
ofw_bus_parse_xref_list_alloc(phandle_t node, const char *list_name,
|
||||
static int
|
||||
ofw_bus_parse_xref_list_internal(phandle_t node, const char *list_name,
|
||||
const char *cells_name, int idx, phandle_t *producer, int *ncells,
|
||||
pcell_t **cells)
|
||||
{
|
||||
@ -649,7 +652,7 @@ ofw_bus_parse_xref_list_alloc(phandle_t node, const char *list_name,
|
||||
(void **)&elems);
|
||||
if (nelems <= 0)
|
||||
return (ENOENT);
|
||||
rv = ENOENT;
|
||||
rv = (idx == -1) ? 0 : ENOENT;
|
||||
for (i = 0, cnt = 0; i < nelems; i += pcells, cnt++) {
|
||||
pnode = elems[i++];
|
||||
if (OF_getencprop(OF_node_from_xref(pnode),
|
||||
@ -678,9 +681,57 @@ ofw_bus_parse_xref_list_alloc(phandle_t node, const char *list_name,
|
||||
}
|
||||
if (elems != NULL)
|
||||
free(elems, M_OFWPROP);
|
||||
if (idx == -1 && rv == 0)
|
||||
*ncells = cnt;
|
||||
return (rv);
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse property that contain list of xrefs and values
|
||||
* (like standard "clocks" and "resets" properties)
|
||||
* Input arguments:
|
||||
* node - consumers device node
|
||||
* list_name - name of parsed list - "clocks"
|
||||
* cells_name - name of size property - "#clock-cells"
|
||||
* idx - the index of the requested list entry (>= 0)
|
||||
* Output arguments:
|
||||
* producer - handle of producer
|
||||
* ncells - number of cells in result
|
||||
* cells - array of decoded cells
|
||||
*/
|
||||
int
|
||||
ofw_bus_parse_xref_list_alloc(phandle_t node, const char *list_name,
|
||||
const char *cells_name, int idx, phandle_t *producer, int *ncells,
|
||||
pcell_t **cells)
|
||||
{
|
||||
|
||||
KASSERT(idx >= 0,
|
||||
("ofw_bus_parse_xref_list_alloc: negative index supplied"));
|
||||
|
||||
return (ofw_bus_parse_xref_list_internal(node, list_name, cells_name,
|
||||
idx, producer, ncells, cells));
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse property that contain list of xrefs and values
|
||||
* (like standard "clocks" and "resets" properties)
|
||||
* and determine the number of items in the list
|
||||
* Input arguments:
|
||||
* node - consumers device node
|
||||
* list_name - name of parsed list - "clocks"
|
||||
* cells_name - name of size property - "#clock-cells"
|
||||
* Output arguments:
|
||||
* count - number of items in list
|
||||
*/
|
||||
int
|
||||
ofw_bus_parse_xref_list_get_length(phandle_t node, const char *list_name,
|
||||
const char *cells_name, int *count)
|
||||
{
|
||||
|
||||
return (ofw_bus_parse_xref_list_internal(node, list_name, cells_name,
|
||||
-1, NULL, count, NULL));
|
||||
}
|
||||
|
||||
/*
|
||||
* Find index of string in string list property (case sensitive).
|
||||
*/
|
||||
|
@ -118,6 +118,8 @@ device_t ofw_bus_find_child_device_by_phandle(device_t bus, phandle_t node);
|
||||
int ofw_bus_parse_xref_list_alloc(phandle_t node, const char *list_name,
|
||||
const char *cells_name, int idx, phandle_t *producer, int *ncells,
|
||||
pcell_t **cells);
|
||||
int ofw_bus_parse_xref_list_get_length(phandle_t node, const char *list_name,
|
||||
const char *cells_name, int *count);
|
||||
int ofw_bus_find_string_index(phandle_t node, const char *list_name,
|
||||
const char *name, int *idx);
|
||||
int ofw_bus_string_list_to_array(phandle_t node, const char *list_name,
|
||||
|
Loading…
x
Reference in New Issue
Block a user