]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - include/linux/property.h
mm/memory_hotplug: export generic_online_page()
[linux.git] / include / linux / property.h
index 9b3d4ca3a73a9eca0266e16c64c933034d7fb3a3..48335288c2a96db23f6de5888b31282f315d8ec5 100644 (file)
@@ -22,7 +22,6 @@ enum dev_prop_type {
        DEV_PROP_U32,
        DEV_PROP_U64,
        DEV_PROP_STRING,
-       DEV_PROP_MAX,
 };
 
 enum dev_dma_attr {
@@ -80,9 +79,14 @@ struct fwnode_handle *fwnode_find_reference(const struct fwnode_handle *fwnode,
                                            const char *name,
                                            unsigned int index);
 
+const char *fwnode_get_name(const struct fwnode_handle *fwnode);
+const char *fwnode_get_name_prefix(const struct fwnode_handle *fwnode);
 struct fwnode_handle *fwnode_get_parent(const struct fwnode_handle *fwnode);
 struct fwnode_handle *fwnode_get_next_parent(
        struct fwnode_handle *fwnode);
+unsigned int fwnode_count_parents(const struct fwnode_handle *fwn);
+struct fwnode_handle *fwnode_get_nth_parent(struct fwnode_handle *fwn,
+                                           unsigned int depth);
 struct fwnode_handle *fwnode_get_next_child_node(
        const struct fwnode_handle *fwnode, struct fwnode_handle *child);
 struct fwnode_handle *fwnode_get_next_available_child_node(
@@ -234,13 +238,7 @@ struct property_entry {
        bool is_array;
        enum dev_prop_type type;
        union {
-               union {
-                       const u8 *u8_data;
-                       const u16 *u16_data;
-                       const u32 *u32_data;
-                       const u64 *u64_data;
-                       const char * const *str;
-               } pointer;
+               const void *pointer;
                union {
                        u8 u8_data;
                        u16 u16_data;
@@ -252,62 +250,63 @@ struct property_entry {
 };
 
 /*
- * Note: the below four initializers for the anonymous union are carefully
+ * Note: the below initializers for the anonymous union are carefully
  * crafted to avoid gcc-4.4.4's problems with initialization of anon unions
  * and structs.
  */
 
-#define PROPERTY_ENTRY_INTEGER_ARRAY(_name_, _type_, _Type_, _val_)    \
+#define __PROPERTY_ENTRY_ELEMENT_SIZE(_elem_)                          \
+       sizeof(((struct property_entry *)NULL)->value._elem_)
+
+#define __PROPERTY_ENTRY_ARRAY_LEN(_name_, _elem_, _Type_, _val_, _len_)\
 (struct property_entry) {                                              \
        .name = _name_,                                                 \
-       .length = ARRAY_SIZE(_val_) * sizeof(_type_),                   \
+       .length = (_len_) * __PROPERTY_ENTRY_ELEMENT_SIZE(_elem_),      \
        .is_array = true,                                               \
        .type = DEV_PROP_##_Type_,                                      \
-       { .pointer = { ._type_##_data = _val_ } },                      \
+       { .pointer = _val_ },                                           \
 }
 
-#define PROPERTY_ENTRY_U8_ARRAY(_name_, _val_)                 \
-       PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u8, U8, _val_)
-#define PROPERTY_ENTRY_U16_ARRAY(_name_, _val_)                        \
-       PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u16, U16, _val_)
-#define PROPERTY_ENTRY_U32_ARRAY(_name_, _val_)                        \
-       PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u32, U32, _val_)
-#define PROPERTY_ENTRY_U64_ARRAY(_name_, _val_)                        \
-       PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u64, U64, _val_)
-
-#define PROPERTY_ENTRY_STRING_ARRAY(_name_, _val_)             \
-(struct property_entry) {                                      \
-       .name = _name_,                                         \
-       .length = ARRAY_SIZE(_val_) * sizeof(const char *),     \
-       .is_array = true,                                       \
-       .type = DEV_PROP_STRING,                                \
-       { .pointer = { .str = _val_ } },                        \
-}
-
-#define PROPERTY_ENTRY_INTEGER(_name_, _type_, _Type_, _val_)  \
-(struct property_entry) {                                      \
-       .name = _name_,                                         \
-       .length = sizeof(_type_),                               \
-       .type = DEV_PROP_##_Type_,                              \
-       { .value = { ._type_##_data = _val_ } },                \
+#define PROPERTY_ENTRY_U8_ARRAY_LEN(_name_, _val_, _len_)              \
+       __PROPERTY_ENTRY_ARRAY_LEN(_name_, u8_data, U8, _val_, _len_)
+#define PROPERTY_ENTRY_U16_ARRAY_LEN(_name_, _val_, _len_)             \
+       __PROPERTY_ENTRY_ARRAY_LEN(_name_, u16_data, U16, _val_, _len_)
+#define PROPERTY_ENTRY_U32_ARRAY_LEN(_name_, _val_, _len_)             \
+       __PROPERTY_ENTRY_ARRAY_LEN(_name_, u32_data, U32, _val_, _len_)
+#define PROPERTY_ENTRY_U64_ARRAY_LEN(_name_, _val_, _len_)             \
+       __PROPERTY_ENTRY_ARRAY_LEN(_name_, u64_data, U64, _val_, _len_)
+#define PROPERTY_ENTRY_STRING_ARRAY_LEN(_name_, _val_, _len_)          \
+       __PROPERTY_ENTRY_ARRAY_LEN(_name_, str, STRING, _val_, _len_)
+
+#define PROPERTY_ENTRY_U8_ARRAY(_name_, _val_)                         \
+       PROPERTY_ENTRY_U8_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
+#define PROPERTY_ENTRY_U16_ARRAY(_name_, _val_)                                \
+       PROPERTY_ENTRY_U16_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
+#define PROPERTY_ENTRY_U32_ARRAY(_name_, _val_)                                \
+       PROPERTY_ENTRY_U32_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
+#define PROPERTY_ENTRY_U64_ARRAY(_name_, _val_)                                \
+       PROPERTY_ENTRY_U64_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
+#define PROPERTY_ENTRY_STRING_ARRAY(_name_, _val_)                     \
+       PROPERTY_ENTRY_STRING_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
+
+#define __PROPERTY_ENTRY_ELEMENT(_name_, _elem_, _Type_, _val_)                \
+(struct property_entry) {                                              \
+       .name = _name_,                                                 \
+       .length = __PROPERTY_ENTRY_ELEMENT_SIZE(_elem_),                \
+       .type = DEV_PROP_##_Type_,                                      \
+       { .value = { ._elem_ = _val_ } },                               \
 }
 
-#define PROPERTY_ENTRY_U8(_name_, _val_)               \
-       PROPERTY_ENTRY_INTEGER(_name_, u8, U8, _val_)
-#define PROPERTY_ENTRY_U16(_name_, _val_)              \
-       PROPERTY_ENTRY_INTEGER(_name_, u16, U16, _val_)
-#define PROPERTY_ENTRY_U32(_name_, _val_)              \
-       PROPERTY_ENTRY_INTEGER(_name_, u32, U32, _val_)
-#define PROPERTY_ENTRY_U64(_name_, _val_)              \
-       PROPERTY_ENTRY_INTEGER(_name_, u64, U64, _val_)
-
-#define PROPERTY_ENTRY_STRING(_name_, _val_)           \
-(struct property_entry) {                              \
-       .name = _name_,                                 \
-       .length = sizeof(const char *),                 \
-       .type = DEV_PROP_STRING,                        \
-       { .value = { .str = _val_ } },                  \
-}
+#define PROPERTY_ENTRY_U8(_name_, _val_)                               \
+       __PROPERTY_ENTRY_ELEMENT(_name_, u8_data, U8, _val_)
+#define PROPERTY_ENTRY_U16(_name_, _val_)                              \
+       __PROPERTY_ENTRY_ELEMENT(_name_, u16_data, U16, _val_)
+#define PROPERTY_ENTRY_U32(_name_, _val_)                              \
+       __PROPERTY_ENTRY_ELEMENT(_name_, u32_data, U32, _val_)
+#define PROPERTY_ENTRY_U64(_name_, _val_)                              \
+       __PROPERTY_ENTRY_ELEMENT(_name_, u64_data, U64, _val_)
+#define PROPERTY_ENTRY_STRING(_name_, _val_)                           \
+       __PROPERTY_ENTRY_ELEMENT(_name_, str, STRING, _val_)
 
 #define PROPERTY_ENTRY_BOOL(_name_)            \
 (struct property_entry) {                      \
@@ -418,7 +417,8 @@ struct software_node {
 };
 
 bool is_software_node(const struct fwnode_handle *fwnode);
-const struct software_node *to_software_node(struct fwnode_handle *fwnode);
+const struct software_node *
+to_software_node(const struct fwnode_handle *fwnode);
 struct fwnode_handle *software_node_fwnode(const struct software_node *node);
 
 const struct software_node *