linux/include/linux/property.h
<<
>>
Prefs
   1/*
   2 * property.h - Unified device property interface.
   3 *
   4 * Copyright (C) 2014, Intel Corporation
   5 * Authors: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
   6 *          Mika Westerberg <mika.westerberg@linux.intel.com>
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License version 2 as
  10 * published by the Free Software Foundation.
  11 */
  12
  13#ifndef _LINUX_PROPERTY_H_
  14#define _LINUX_PROPERTY_H_
  15
  16#include <linux/fwnode.h>
  17#include <linux/types.h>
  18
  19struct device;
  20
  21enum dev_prop_type {
  22        DEV_PROP_U8,
  23        DEV_PROP_U16,
  24        DEV_PROP_U32,
  25        DEV_PROP_U64,
  26        DEV_PROP_STRING,
  27        DEV_PROP_MAX,
  28};
  29
  30enum dev_dma_attr {
  31        DEV_DMA_NOT_SUPPORTED,
  32        DEV_DMA_NON_COHERENT,
  33        DEV_DMA_COHERENT,
  34};
  35
  36struct fwnode_handle *dev_fwnode(struct device *dev);
  37
  38bool device_property_present(struct device *dev, const char *propname);
  39int device_property_read_u8_array(struct device *dev, const char *propname,
  40                                  u8 *val, size_t nval);
  41int device_property_read_u16_array(struct device *dev, const char *propname,
  42                                   u16 *val, size_t nval);
  43int device_property_read_u32_array(struct device *dev, const char *propname,
  44                                   u32 *val, size_t nval);
  45int device_property_read_u64_array(struct device *dev, const char *propname,
  46                                   u64 *val, size_t nval);
  47int device_property_read_string_array(struct device *dev, const char *propname,
  48                                      const char **val, size_t nval);
  49int device_property_read_string(struct device *dev, const char *propname,
  50                                const char **val);
  51int device_property_match_string(struct device *dev,
  52                                 const char *propname, const char *string);
  53
  54bool fwnode_device_is_available(struct fwnode_handle *fwnode);
  55bool fwnode_property_present(struct fwnode_handle *fwnode, const char *propname);
  56int fwnode_property_read_u8_array(struct fwnode_handle *fwnode,
  57                                  const char *propname, u8 *val,
  58                                  size_t nval);
  59int fwnode_property_read_u16_array(struct fwnode_handle *fwnode,
  60                                   const char *propname, u16 *val,
  61                                   size_t nval);
  62int fwnode_property_read_u32_array(struct fwnode_handle *fwnode,
  63                                   const char *propname, u32 *val,
  64                                   size_t nval);
  65int fwnode_property_read_u64_array(struct fwnode_handle *fwnode,
  66                                   const char *propname, u64 *val,
  67                                   size_t nval);
  68int fwnode_property_read_string_array(struct fwnode_handle *fwnode,
  69                                      const char *propname, const char **val,
  70                                      size_t nval);
  71int fwnode_property_read_string(struct fwnode_handle *fwnode,
  72                                const char *propname, const char **val);
  73int fwnode_property_match_string(struct fwnode_handle *fwnode,
  74                                 const char *propname, const char *string);
  75
  76struct fwnode_handle *fwnode_get_parent(struct fwnode_handle *fwnode);
  77struct fwnode_handle *fwnode_get_next_parent(struct fwnode_handle *fwnode);
  78struct fwnode_handle *fwnode_get_next_child_node(struct fwnode_handle *fwnode,
  79                                                 struct fwnode_handle *child);
  80
  81#define fwnode_for_each_child_node(fwnode, child)                       \
  82        for (child = fwnode_get_next_child_node(fwnode, NULL); child;   \
  83             child = fwnode_get_next_child_node(fwnode, child))
  84
  85struct fwnode_handle *device_get_next_child_node(struct device *dev,
  86                                                 struct fwnode_handle *child);
  87
  88#define device_for_each_child_node(dev, child)                          \
  89        for (child = device_get_next_child_node(dev, NULL); child;      \
  90             child = device_get_next_child_node(dev, child))
  91
  92struct fwnode_handle *fwnode_get_named_child_node(struct fwnode_handle *fwnode,
  93                                                  const char *childname);
  94struct fwnode_handle *device_get_named_child_node(struct device *dev,
  95                                                  const char *childname);
  96
  97void fwnode_handle_get(struct fwnode_handle *fwnode);
  98void fwnode_handle_put(struct fwnode_handle *fwnode);
  99
 100unsigned int device_get_child_node_count(struct device *dev);
 101
 102static inline bool device_property_read_bool(struct device *dev,
 103                                             const char *propname)
 104{
 105        return device_property_present(dev, propname);
 106}
 107
 108static inline int device_property_read_u8(struct device *dev,
 109                                          const char *propname, u8 *val)
 110{
 111        return device_property_read_u8_array(dev, propname, val, 1);
 112}
 113
 114static inline int device_property_read_u16(struct device *dev,
 115                                           const char *propname, u16 *val)
 116{
 117        return device_property_read_u16_array(dev, propname, val, 1);
 118}
 119
 120static inline int device_property_read_u32(struct device *dev,
 121                                           const char *propname, u32 *val)
 122{
 123        return device_property_read_u32_array(dev, propname, val, 1);
 124}
 125
 126static inline int device_property_read_u64(struct device *dev,
 127                                           const char *propname, u64 *val)
 128{
 129        return device_property_read_u64_array(dev, propname, val, 1);
 130}
 131
 132static inline bool fwnode_property_read_bool(struct fwnode_handle *fwnode,
 133                                             const char *propname)
 134{
 135        return fwnode_property_present(fwnode, propname);
 136}
 137
 138static inline int fwnode_property_read_u8(struct fwnode_handle *fwnode,
 139                                          const char *propname, u8 *val)
 140{
 141        return fwnode_property_read_u8_array(fwnode, propname, val, 1);
 142}
 143
 144static inline int fwnode_property_read_u16(struct fwnode_handle *fwnode,
 145                                           const char *propname, u16 *val)
 146{
 147        return fwnode_property_read_u16_array(fwnode, propname, val, 1);
 148}
 149
 150static inline int fwnode_property_read_u32(struct fwnode_handle *fwnode,
 151                                           const char *propname, u32 *val)
 152{
 153        return fwnode_property_read_u32_array(fwnode, propname, val, 1);
 154}
 155
 156static inline int fwnode_property_read_u64(struct fwnode_handle *fwnode,
 157                                           const char *propname, u64 *val)
 158{
 159        return fwnode_property_read_u64_array(fwnode, propname, val, 1);
 160}
 161
 162/**
 163 * struct property_entry - "Built-in" device property representation.
 164 * @name: Name of the property.
 165 * @length: Length of data making up the value.
 166 * @is_array: True when the property is an array.
 167 * @is_string: True when property is a string.
 168 * @pointer: Pointer to the property (an array of items of the given type).
 169 * @value: Value of the property (when it is a single item of the given type).
 170 */
 171struct property_entry {
 172        const char *name;
 173        size_t length;
 174        bool is_array;
 175        bool is_string;
 176        union {
 177                union {
 178                        const void *raw_data;
 179                        const u8 *u8_data;
 180                        const u16 *u16_data;
 181                        const u32 *u32_data;
 182                        const u64 *u64_data;
 183                        const char * const *str;
 184                } pointer;
 185                union {
 186                        unsigned long long raw_data;
 187                        u8 u8_data;
 188                        u16 u16_data;
 189                        u32 u32_data;
 190                        u64 u64_data;
 191                        const char *str;
 192                } value;
 193        };
 194};
 195
 196/*
 197 * Note: the below four initializers for the anonymous union are carefully
 198 * crafted to avoid gcc-4.4.4's problems with initialization of anon unions
 199 * and structs.
 200 */
 201
 202#define PROPERTY_ENTRY_INTEGER_ARRAY(_name_, _type_, _val_)     \
 203{                                                               \
 204        .name = _name_,                                         \
 205        .length = ARRAY_SIZE(_val_) * sizeof(_type_),           \
 206        .is_array = true,                                       \
 207        .is_string = false,                                     \
 208        { .pointer = { ._type_##_data = _val_ } },              \
 209}
 210
 211#define PROPERTY_ENTRY_U8_ARRAY(_name_, _val_)                  \
 212        PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u8, _val_)
 213#define PROPERTY_ENTRY_U16_ARRAY(_name_, _val_)                 \
 214        PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u16, _val_)
 215#define PROPERTY_ENTRY_U32_ARRAY(_name_, _val_)                 \
 216        PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u32, _val_)
 217#define PROPERTY_ENTRY_U64_ARRAY(_name_, _val_)                 \
 218        PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u64, _val_)
 219
 220#define PROPERTY_ENTRY_STRING_ARRAY(_name_, _val_)              \
 221{                                                               \
 222        .name = _name_,                                         \
 223        .length = ARRAY_SIZE(_val_) * sizeof(const char *),     \
 224        .is_array = true,                                       \
 225        .is_string = true,                                      \
 226        { .pointer = { .str = _val_ } },                        \
 227}
 228
 229#define PROPERTY_ENTRY_INTEGER(_name_, _type_, _val_)   \
 230{                                                       \
 231        .name = _name_,                                 \
 232        .length = sizeof(_type_),                       \
 233        .is_string = false,                             \
 234        { .value = { ._type_##_data = _val_ } },        \
 235}
 236
 237#define PROPERTY_ENTRY_U8(_name_, _val_)                \
 238        PROPERTY_ENTRY_INTEGER(_name_, u8, _val_)
 239#define PROPERTY_ENTRY_U16(_name_, _val_)               \
 240        PROPERTY_ENTRY_INTEGER(_name_, u16, _val_)
 241#define PROPERTY_ENTRY_U32(_name_, _val_)               \
 242        PROPERTY_ENTRY_INTEGER(_name_, u32, _val_)
 243#define PROPERTY_ENTRY_U64(_name_, _val_)               \
 244        PROPERTY_ENTRY_INTEGER(_name_, u64, _val_)
 245
 246#define PROPERTY_ENTRY_STRING(_name_, _val_)            \
 247{                                                       \
 248        .name = _name_,                                 \
 249        .length = sizeof(_val_),                        \
 250        .is_string = true,                              \
 251        { .value = { .str = _val_ } },                  \
 252}
 253
 254#define PROPERTY_ENTRY_BOOL(_name_)             \
 255{                                               \
 256        .name = _name_,                         \
 257}
 258
 259struct property_entry *
 260property_entries_dup(const struct property_entry *properties);
 261
 262void property_entries_free(const struct property_entry *properties);
 263
 264int device_add_properties(struct device *dev,
 265                          const struct property_entry *properties);
 266void device_remove_properties(struct device *dev);
 267
 268bool device_dma_supported(struct device *dev);
 269
 270enum dev_dma_attr device_get_dma_attr(struct device *dev);
 271
 272int device_get_phy_mode(struct device *dev);
 273
 274void *device_get_mac_address(struct device *dev, char *addr, int alen);
 275
 276struct fwnode_handle *fwnode_graph_get_next_endpoint(
 277        struct fwnode_handle *fwnode, struct fwnode_handle *prev);
 278struct fwnode_handle *
 279fwnode_graph_get_port_parent(struct fwnode_handle *fwnode);
 280struct fwnode_handle *fwnode_graph_get_remote_port_parent(
 281        struct fwnode_handle *fwnode);
 282struct fwnode_handle *fwnode_graph_get_remote_port(
 283        struct fwnode_handle *fwnode);
 284struct fwnode_handle *fwnode_graph_get_remote_endpoint(
 285        struct fwnode_handle *fwnode);
 286struct fwnode_handle *fwnode_graph_get_remote_node(struct fwnode_handle *fwnode,
 287                                                   u32 port, u32 endpoint);
 288
 289int fwnode_graph_parse_endpoint(struct fwnode_handle *fwnode,
 290                                struct fwnode_endpoint *endpoint);
 291
 292#endif /* _LINUX_PROPERTY_H_ */
 293