diff options
Diffstat (limited to 'include/fdtdec.h')
| -rw-r--r-- | include/fdtdec.h | 112 | 
1 files changed, 112 insertions, 0 deletions
| diff --git a/include/fdtdec.h b/include/fdtdec.h index 64e5cffe8..70d0e979d 100644 --- a/include/fdtdec.h +++ b/include/fdtdec.h @@ -40,10 +40,12 @@  typedef u64 fdt_addr_t;  #define FDT_ADDR_T_NONE (-1ULL)  #define fdt_addr_to_cpu(reg) be64_to_cpu(reg) +#define fdt_size_to_cpu(reg) be64_to_cpu(reg)  #else  typedef u32 fdt_addr_t;  #define FDT_ADDR_T_NONE (-1U)  #define fdt_addr_to_cpu(reg) be32_to_cpu(reg) +#define fdt_size_to_cpu(reg) be32_to_cpu(reg)  #endif  /* Information obtained about memory from the FDT */ @@ -90,6 +92,22 @@ struct fdt_gpio_state {  #define fdt_gpio_isvalid(x) ((x)->gpio != FDT_GPIO_NONE)  /** + * Read the GPIO taking into account the polarity of the pin. + * + * @param gpio		pointer to the decoded gpio + * @return value of the gpio if successful, < 0 if unsuccessful + */ +int fdtdec_get_gpio(struct fdt_gpio_state *gpio); + +/** + * Write the GPIO taking into account the polarity of the pin. + * + * @param gpio		pointer to the decoded gpio + * @return 0 if successful + */ +int fdtdec_set_gpio(struct fdt_gpio_state *gpio, int val); + +/**   * Find the next numbered alias for a peripheral. This is used to enumerate   * all the peripherals of a certain type.   * @@ -110,6 +128,19 @@ int fdtdec_next_alias(const void *blob, const char *name,  		enum fdt_compat_id id, int *upto);  /** + * Find the compatible ID for a given node. + * + * Generally each node has at least one compatible string attached to it. + * This function looks through our list of known compatible strings and + * returns the corresponding ID which matches the compatible string. + * + * @param blob		FDT blob to use + * @param node		Node containing compatible string to find + * @return compatible ID, or COMPAT_UNKNOWN if we cannot find a match + */ +enum fdt_compat_id fdtdec_lookup(const void *blob, int node); + +/**   * Find the next compatible node for a peripheral.   *   * Do the first call with node = 0. This function will return a pointer to @@ -169,6 +200,21 @@ s32 fdtdec_get_int(const void *blob, int node, const char *prop_name,  		s32 default_val);  /** + * Look up a 64-bit integer property in a node and return it. The property + * must have at least 8 bytes of data (2 cells). The first two cells are + * concatenated to form a 8 bytes value, where the first cell is top half and + * the second cell is bottom half. + * + * @param blob	FDT blob + * @param node	node to examine + * @param prop_name	name of property to find + * @param default_val	default value to return if the property is not found + * @return integer value, if found, or default_val if not + */ +uint64_t fdtdec_get_uint64(const void *blob, int node, const char *prop_name, +		uint64_t default_val); + +/**   * Checks whether a node is enabled.   * This looks for a 'status' property. If this exists, then returns 1 if   * the status is 'ok' and 0 otherwise. If there is no status property, @@ -345,6 +391,22 @@ int fdtdec_decode_gpio(const void *blob, int node, const char *prop_name,  		struct fdt_gpio_state *gpio);  /** + * Decode a list of GPIOs from an FDT. This creates a list of GPIOs with no + * terminating item. + * + * @param blob         FDT blob to use + * @param node         Node to look at + * @param prop_name    Node property name + * @param gpio         Array of gpio elements to fill from FDT. This will be + *                     untouched if either 0 or an error is returned + * @param max_count    Maximum number of elements allowed + * @return number of GPIOs read if ok, -FDT_ERR_BADLAYOUT if max_count would + * be exceeded, or -FDT_ERR_NOTFOUND if the property is missing. + */ +int fdtdec_decode_gpios(const void *blob, int node, const char *prop_name, +		struct fdt_gpio_state *gpio, int max_count); + +/**   * Set up a GPIO pin according to the provided gpio information. At present this   * just requests the GPIO.   * @@ -356,6 +418,39 @@ int fdtdec_decode_gpio(const void *blob, int node, const char *prop_name,   */  int fdtdec_setup_gpio(struct fdt_gpio_state *gpio); +/** + * Look in the FDT for a config item with the given name and return its value + * as a 32-bit integer. The property must have at least 4 bytes of data. The + * value of the first cell is returned. + * + * @param blob		FDT blob to use + * @param prop_name	Node property name + * @param default_val	default value to return if the property is not found + * @return integer value, if found, or default_val if not + */ +int fdtdec_get_config_int(const void *blob, const char *prop_name, +		int default_val); + +/** + * Look in the FDT for a config item with the given name + * and return whether it exists. + * + * @param blob		FDT blob + * @param prop_name	property name to look up + * @return 1, if it exists, or 0 if not + */ +int fdtdec_get_config_bool(const void *blob, const char *prop_name); + +/** + * Look in the FDT for a config item with the given name and return its value + * as a string. + * + * @param blob          FDT blob + * @param prop_name     property name to look up + * @returns property string, NULL on error. + */ +char *fdtdec_get_config_string(const void *blob, const char *prop_name); +  /*   * Look up a property in a node and return its contents in a byte   * array of given length. The property must have at least enough data for @@ -387,4 +482,21 @@ int fdtdec_get_byte_array(const void *blob, int node, const char *prop_name,   */  const u8 *fdtdec_locate_byte_array(const void *blob, int node,  			     const char *prop_name, int count); + +/** + * Look up a property in a node which contains a memory region address and + * size. Then return a pointer to this address. + * + * The property must hold one address with a length. This is only tested on + * 32-bit machines. + * + * @param blob		FDT blob + * @param node		node to examine + * @param prop_name	name of property to find + * @param ptrp		returns pointer to region, or NULL if no address + * @param size		returns size of region + * @return 0 if ok, -1 on error (propery not found) + */ +int fdtdec_decode_region(const void *blob, int node, +		const char *prop_name, void **ptrp, size_t *size);  #endif |