uboot/include/dm/device-internal.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * Copyright (C) 2013 Google, Inc
   4 *
   5 * (C) Copyright 2012
   6 * Pavel Herrmann <morpheus.ibis@gmail.com>
   7 * Marek Vasut <marex@denx.de>
   8 */
   9
  10#ifndef _DM_DEVICE_INTERNAL_H
  11#define _DM_DEVICE_INTERNAL_H
  12
  13#include <dm/ofnode.h>
  14
  15struct device_node;
  16struct udevice;
  17
  18/**
  19 * device_bind() - Create a device and bind it to a driver
  20 *
  21 * Called to set up a new device attached to a driver. The device will either
  22 * have platdata, or a device tree node which can be used to create the
  23 * platdata.
  24 *
  25 * Once bound a device exists but is not yet active until device_probe() is
  26 * called.
  27 *
  28 * @parent: Pointer to device's parent, under which this driver will exist
  29 * @drv: Device's driver
  30 * @name: Name of device (e.g. device tree node name)
  31 * @platdata: Pointer to data for this device - the structure is device-
  32 * specific but may include the device's I/O address, etc.. This is NULL for
  33 * devices which use device tree.
  34 * @of_offset: Offset of device tree node for this device. This is -1 for
  35 * devices which don't use device tree.
  36 * @devp: if non-NULL, returns a pointer to the bound device
  37 * @return 0 if OK, -ve on error
  38 */
  39int device_bind(struct udevice *parent, const struct driver *drv,
  40                const char *name, void *platdata, int of_offset,
  41                struct udevice **devp);
  42
  43int device_bind_ofnode(struct udevice *parent, const struct driver *drv,
  44                       const char *name, void *platdata, ofnode node,
  45                       struct udevice **devp);
  46
  47/**
  48 * device_bind_with_driver_data() - Create a device and bind it to a driver
  49 *
  50 * Called to set up a new device attached to a driver, in the case where the
  51 * driver was matched to the device by means of a match table that provides
  52 * driver_data.
  53 *
  54 * Once bound a device exists but is not yet active until device_probe() is
  55 * called.
  56 *
  57 * @parent: Pointer to device's parent, under which this driver will exist
  58 * @drv: Device's driver
  59 * @name: Name of device (e.g. device tree node name)
  60 * @driver_data: The driver_data field from the driver's match table.
  61 * @node: Device tree node for this device. This is invalid for devices which
  62 * don't use device tree.
  63 * @devp: if non-NULL, returns a pointer to the bound device
  64 * @return 0 if OK, -ve on error
  65 */
  66int device_bind_with_driver_data(struct udevice *parent,
  67                                 const struct driver *drv, const char *name,
  68                                 ulong driver_data, ofnode node,
  69                                 struct udevice **devp);
  70/**
  71 * device_bind_by_name: Create a device and bind it to a driver
  72 *
  73 * This is a helper function used to bind devices which do not use device
  74 * tree.
  75 *
  76 * @parent: Pointer to device's parent
  77 * @pre_reloc_only: If true, bind the driver only if its DM_FLAG_PRE_RELOC flag
  78 * is set. If false bind the driver always.
  79 * @info: Name and platdata for this device
  80 * @devp: if non-NULL, returns a pointer to the bound device
  81 * @return 0 if OK, -ve on error
  82 */
  83int device_bind_by_name(struct udevice *parent, bool pre_reloc_only,
  84                        const struct driver_info *info, struct udevice **devp);
  85
  86/**
  87 * device_ofdata_to_platdata() - Read platform data for a device
  88 *
  89 * Read platform data for a device (typically from the device tree) so that
  90 * the information needed to probe the device is present.
  91 *
  92 * This may cause some others devices to be probed if this one depends on them,
  93 * e.g. a GPIO line will cause a GPIO device to be probed.
  94 *
  95 * All private data associated with the device is allocated.
  96 *
  97 * @dev: Pointer to device to process
  98 * @return 0 if OK, -ve on error
  99 */
 100int device_ofdata_to_platdata(struct udevice *dev);
 101
 102/**
 103 * device_probe() - Probe a device, activating it
 104 *
 105 * Activate a device so that it is ready for use. All its parents are probed
 106 * first.
 107 *
 108 * @dev: Pointer to device to probe
 109 * @return 0 if OK, -ve on error
 110 */
 111int device_probe(struct udevice *dev);
 112
 113/**
 114 * device_remove() - Remove a device, de-activating it
 115 *
 116 * De-activate a device so that it is no longer ready for use. All its
 117 * children are deactivated first.
 118 *
 119 * @dev: Pointer to device to remove
 120 * @flags: Flags for selective device removal (DM_REMOVE_...)
 121 * @return 0 if OK, -ve on error (an error here is normally a very bad thing)
 122 */
 123#if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
 124int device_remove(struct udevice *dev, uint flags);
 125#else
 126static inline int device_remove(struct udevice *dev, uint flags) { return 0; }
 127#endif
 128
 129/**
 130 * device_unbind() - Unbind a device, destroying it
 131 *
 132 * Unbind a device and remove all memory used by it
 133 *
 134 * @dev: Pointer to device to unbind
 135 * @return 0 if OK, -ve on error
 136 */
 137#if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
 138int device_unbind(struct udevice *dev);
 139#else
 140static inline int device_unbind(struct udevice *dev) { return 0; }
 141#endif
 142
 143#if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
 144void device_free(struct udevice *dev);
 145#else
 146static inline void device_free(struct udevice *dev) {}
 147#endif
 148
 149/**
 150 * device_chld_unbind() - Unbind all device's children from the device if bound
 151 *                        to drv
 152 *
 153 * On error, the function continues to unbind all children, and reports the
 154 * first error.
 155 *
 156 * @dev:        The device that is to be stripped of its children
 157 * @drv:        The targeted driver
 158 * @return 0 on success, -ve on error
 159 */
 160#if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
 161int device_chld_unbind(struct udevice *dev, struct driver *drv);
 162#else
 163static inline int device_chld_unbind(struct udevice *dev, struct driver *drv)
 164{
 165        return 0;
 166}
 167#endif
 168
 169/**
 170 * device_chld_remove() - Stop all device's children
 171 * @dev:        The device whose children are to be removed
 172 * @drv:        The targeted driver
 173 * @flags:      Flag, if this functions is called in the pre-OS stage
 174 * @return 0 on success, -ve on error
 175 */
 176#if CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)
 177int device_chld_remove(struct udevice *dev, struct driver *drv,
 178                       uint flags);
 179#else
 180static inline int device_chld_remove(struct udevice *dev, struct driver *drv,
 181                                     uint flags)
 182{
 183        return 0;
 184}
 185#endif
 186
 187/**
 188 * simple_bus_translate() - translate a bus address to a system address
 189 *
 190 * This handles the 'ranges' property in a simple bus. It translates the
 191 * device address @addr to a system address using this property.
 192 *
 193 * @dev:        Simple bus device (parent of target device)
 194 * @addr:       Address to translate
 195 * @return new address
 196 */
 197fdt_addr_t simple_bus_translate(struct udevice *dev, fdt_addr_t addr);
 198
 199/* Cast away any volatile pointer */
 200#define DM_ROOT_NON_CONST               (((gd_t *)gd)->dm_root)
 201#define DM_UCLASS_ROOT_NON_CONST        (((gd_t *)gd)->uclass_root)
 202
 203/* device resource management */
 204#ifdef CONFIG_DEVRES
 205
 206/**
 207 * devres_release_probe - Release managed resources allocated after probing
 208 * @dev: Device to release resources for
 209 *
 210 * Release all resources allocated for @dev when it was probed or later.
 211 * This function is called on driver removal.
 212 */
 213void devres_release_probe(struct udevice *dev);
 214
 215/**
 216 * devres_release_all - Release all managed resources
 217 * @dev: Device to release resources for
 218 *
 219 * Release all resources associated with @dev.  This function is
 220 * called on driver unbinding.
 221 */
 222void devres_release_all(struct udevice *dev);
 223
 224#else /* ! CONFIG_DEVRES */
 225
 226static inline void devres_release_probe(struct udevice *dev)
 227{
 228}
 229
 230static inline void devres_release_all(struct udevice *dev)
 231{
 232}
 233
 234#endif /* ! CONFIG_DEVRES */
 235#endif
 236