}
/**
- * Find string property
+ * Find strings property
*
* @v fdt Device tree
* @v offset Starting node offset
* @v name Property name
+ * @v count String count to fill in
* @ret string String property, or NULL on error
*/
-const char * fdt_string ( struct fdt *fdt, unsigned int offset,
- const char *name ) {
+const char * fdt_strings ( struct fdt *fdt, unsigned int offset,
+ const char *name, unsigned int *count ) {
struct fdt_descriptor desc;
+ const char *data;
+ size_t len;
int rc;
+ /* Return a zero count on error */
+ *count = 0;
+
/* Find property */
if ( ( rc = fdt_property ( fdt, offset, name, &desc ) ) != 0 )
return NULL;
/* Check NUL termination */
- if ( strnlen ( desc.data, desc.len ) == desc.len ) {
+ data = desc.data;
+ if ( desc.len && ( data[ desc.len - 1 ] != '\0' ) ) {
DBGC ( fdt, "FDT unterminated string property \"%s\"\n",
name );
return NULL;
}
- return desc.data;
+ /* Count number of strings */
+ for ( len = desc.len ; len-- ; ) {
+ if ( data[len] == '\0' )
+ (*count)++;
+ }
+
+ return data;
+}
+
+/**
+ * Find string property
+ *
+ * @v fdt Device tree
+ * @v offset Starting node offset
+ * @v name Property name
+ * @ret string String property, or NULL on error
+ */
+const char * fdt_string ( struct fdt *fdt, unsigned int offset,
+ const char *name ) {
+ unsigned int count;
+
+ /* Find strings property */
+ return fdt_strings ( fdt, offset, name, &count );
}
/**
unsigned int *offset );
extern int fdt_alias ( struct fdt *fdt, const char *name,
unsigned int *offset );
+extern const char * fdt_strings ( struct fdt *fdt, unsigned int offset,
+ const char *name, unsigned int *count );
extern const char * fdt_string ( struct fdt *fdt, unsigned int offset,
const char *name );
extern int fdt_u64 ( struct fdt *fdt, unsigned int offset, const char *name,