uboot/include/power/pmic.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 *  Copyright (C) 2014-2015 Samsung Electronics
   4 *  Przemyslaw Marczak <p.marczak@samsung.com>
   5 *
   6 *  Copyright (C) 2011-2012 Samsung Electronics
   7 *  Lukasz Majewski <l.majewski@samsung.com>
   8 */
   9
  10#ifndef __CORE_PMIC_H_
  11#define __CORE_PMIC_H_
  12
  13#include <dm/ofnode.h>
  14#include <i2c.h>
  15#include <linux/list.h>
  16#include <power/power_chrg.h>
  17
  18enum { PMIC_I2C, PMIC_SPI, PMIC_NONE};
  19
  20#ifdef CONFIG_POWER
  21enum { I2C_PMIC, I2C_NUM, };
  22enum { PMIC_READ, PMIC_WRITE, };
  23enum { PMIC_SENSOR_BYTE_ORDER_LITTLE, PMIC_SENSOR_BYTE_ORDER_BIG, };
  24
  25enum {
  26        PMIC_CHARGER_DISABLE,
  27        PMIC_CHARGER_ENABLE,
  28};
  29
  30struct p_i2c {
  31        unsigned char addr;
  32        unsigned char *buf;
  33        unsigned char tx_num;
  34};
  35
  36struct p_spi {
  37        unsigned int cs;
  38        unsigned int mode;
  39        unsigned int bitlen;
  40        unsigned int clk;
  41        unsigned int flags;
  42        u32 (*prepare_tx)(u32 reg, u32 *val, u32 write);
  43};
  44
  45struct pmic;
  46struct power_fg {
  47        int (*fg_battery_check) (struct pmic *p, struct pmic *bat);
  48        int (*fg_battery_update) (struct pmic *p, struct pmic *bat);
  49};
  50
  51struct power_chrg {
  52        int (*chrg_type) (struct pmic *p);
  53        int (*chrg_bat_present) (struct pmic *p);
  54        int (*chrg_state) (struct pmic *p, int state, int current);
  55};
  56
  57struct power_battery {
  58        struct battery *bat;
  59        int (*battery_init) (struct pmic *bat, struct pmic *p1,
  60                             struct pmic *p2, struct pmic *p3);
  61        int (*battery_charge) (struct pmic *bat);
  62        /* Keep info about power devices involved with battery operation */
  63        struct pmic *chrg, *fg, *muic;
  64};
  65
  66struct pmic {
  67        const char *name;
  68        unsigned char bus;
  69        unsigned char interface;
  70        unsigned char sensor_byte_order;
  71        unsigned int number_of_regs;
  72        union hw {
  73                struct p_i2c i2c;
  74                struct p_spi spi;
  75        } hw;
  76
  77        void (*low_power_mode) (void);
  78        struct power_battery *pbat;
  79        struct power_chrg *chrg;
  80        struct power_fg *fg;
  81
  82        struct pmic *parent;
  83        struct list_head list;
  84};
  85#endif /* CONFIG_POWER */
  86
  87#ifdef CONFIG_DM_PMIC
  88/**
  89 * U-Boot PMIC Framework
  90 * =====================
  91 *
  92 * UCLASS_PMIC - This is designed to provide an I/O interface for PMIC devices.
  93 *
  94 * For the multi-function PMIC devices, this can be used as parent I/O device
  95 * for each IC's interface. Then, each child uses its parent for read/write.
  96 *
  97 * The driver model tree could look like this:
  98 *
  99 *_ root device
 100 * |_ BUS 0 device (e.g. I2C0)                 - UCLASS_I2C/SPI/...
 101 * | |_ PMIC device (READ/WRITE ops)           - UCLASS_PMIC
 102 * |   |_ REGULATOR device (ldo/buck/... ops)  - UCLASS_REGULATOR
 103 * |   |_ CHARGER device (charger ops)         - UCLASS_CHARGER (in the future)
 104 * |   |_ MUIC device (microUSB connector ops) - UCLASS_MUIC    (in the future)
 105 * |   |_ ...
 106 * |
 107 * |_ BUS 1 device (e.g. I2C1)                 - UCLASS_I2C/SPI/...
 108 *   |_ PMIC device (READ/WRITE ops)           - UCLASS_PMIC
 109 *     |_ RTC device (rtc ops)                 - UCLASS_RTC     (in the future)
 110 *
 111 * We can find two PMIC cases in boards design:
 112 * - single I/O interface
 113 * - multiple I/O interfaces
 114 * We bind a single PMIC device for each interface, to provide an I/O for
 115 * its child devices. And each child usually implements a different function,
 116 * controlled by the same interface.
 117 *
 118 * The binding should be done automatically. If device tree nodes/subnodes are
 119 * proper defined, then:
 120 *
 121 * |_ the ROOT driver will bind the device for I2C/SPI node:
 122 *   |_ the I2C/SPI driver should bind a device for pmic node:
 123 *     |_ the PMIC driver should bind devices for its childs:
 124 *       |_ regulator (child)
 125 *       |_ charger   (child)
 126 *       |_ other     (child)
 127 *
 128 * The same for other device nodes, for multi-interface PMIC.
 129 *
 130 * Note:
 131 * Each PMIC interface driver should use a different compatible string.
 132 *
 133 * If a PMIC child device driver needs access the PMIC-specific registers,
 134 * it need know only the register address and the access can be done through
 135 * the parent pmic driver. Like in the example:
 136 *
 137 *_ root driver
 138 * |_ dev: bus I2C0                                         - UCLASS_I2C
 139 * | |_ dev: my_pmic (read/write)              (is parent)  - UCLASS_PMIC
 140 * |   |_ dev: my_regulator (set value/etc..)  (is child)   - UCLASS_REGULATOR
 141 *
 142 * To ensure such device relationship, the pmic device driver should also bind
 143 * all its child devices, like in the example below. It can be done by calling
 144 * the 'pmic_bind_children()' - please refer to the function description, which
 145 * can be found in this header file. This function, should be called inside the
 146 * driver's bind() method.
 147 *
 148 * For the example driver, please refer the MAX77686 driver:
 149 * - 'drivers/power/pmic/max77686.c'
 150 */
 151
 152/**
 153 * struct dm_pmic_ops - PMIC device I/O interface
 154 *
 155 * Should be implemented by UCLASS_PMIC device drivers. The standard
 156 * device operations provides the I/O interface for it's childs.
 157 *
 158 * @reg_count: device's register count
 159 * @read:      read 'len' bytes at "reg" and store it into the 'buffer'
 160 * @write:     write 'len' bytes from the 'buffer' to the register at 'reg' address
 161 */
 162struct dm_pmic_ops {
 163        int (*reg_count)(struct udevice *dev);
 164        int (*read)(struct udevice *dev, uint reg, uint8_t *buffer, int len);
 165        int (*write)(struct udevice *dev, uint reg, const uint8_t *buffer,
 166                     int len);
 167};
 168
 169/**
 170 * enum pmic_op_type - used for various pmic devices operation calls,
 171 * for reduce a number of lines with the same code for read/write or get/set.
 172 *
 173 * @PMIC_OP_GET - get operation
 174 * @PMIC_OP_SET - set operation
 175*/
 176enum pmic_op_type {
 177        PMIC_OP_GET,
 178        PMIC_OP_SET,
 179};
 180
 181/**
 182 * struct pmic_child_info - basic device's child info for bind child nodes with
 183 * the driver by the node name prefix and driver name. This is a helper struct
 184 * for function: pmic_bind_children().
 185 *
 186 * @prefix - child node name prefix (or its name if is unique or single)
 187 * @driver - driver name for the sub-node with prefix
 188 */
 189struct pmic_child_info {
 190        const char *prefix;
 191        const char *driver;
 192};
 193
 194/* drivers/power/pmic-uclass.c */
 195
 196/**
 197 * pmic_bind_children() - bind drivers for given parent pmic, using child info
 198 * found in 'child_info' array.
 199 *
 200 * @pmic       - pmic device - the parent of found child's
 201 * @child_info - N-childs info array
 202 * @return a positive number of childs, or 0 if no child found (error)
 203 *
 204 * Note: For N-childs the child_info array should have N+1 entries and the last
 205 * entry prefix should be NULL - the same as for drivers compatible.
 206 *
 207 * For example, a single prefix info (N=1):
 208 * static const struct pmic_child_info bind_info[] = {
 209 *     { .prefix = "ldo", .driver = "ldo_driver" },
 210 *     { },
 211 * };
 212 *
 213 * This function is useful for regulator sub-nodes:
 214 * my_regulator@0xa {
 215 *     reg = <0xa>;
 216 *     (pmic - bind automatically by compatible)
 217 *     compatible = "my_pmic";
 218 *     ...
 219 *     (pmic's childs - bind by pmic_bind_children())
 220 *     (nodes prefix: "ldo", driver: "my_regulator_ldo")
 221 *     ldo1 { ... };
 222 *     ldo2 { ... };
 223 *
 224 *     (nodes prefix: "buck", driver: "my_regulator_buck")
 225 *     buck1 { ... };
 226 *     buck2 { ... };
 227 * };
 228 */
 229int pmic_bind_children(struct udevice *pmic, ofnode parent,
 230                       const struct pmic_child_info *child_info);
 231
 232/**
 233 * pmic_get: get the pmic device using its name
 234 *
 235 * @name - device name
 236 * @devp - returned pointer to the pmic device
 237 * @return 0 on success or negative value of errno.
 238 *
 239 * The returned devp device can be used with pmic_read/write calls
 240 */
 241int pmic_get(const char *name, struct udevice **devp);
 242
 243/**
 244 * pmic_reg_count: get the pmic register count
 245 *
 246 * The required pmic device can be obtained by 'pmic_get()'
 247 *
 248 * @dev - pointer to the UCLASS_PMIC device
 249 * @return register count value on success or negative value of errno.
 250 */
 251int pmic_reg_count(struct udevice *dev);
 252
 253/**
 254 * pmic_read/write: read/write to the UCLASS_PMIC device
 255 *
 256 * The required pmic device can be obtained by 'pmic_get()'
 257 *
 258 * @pmic   - pointer to the UCLASS_PMIC device
 259 * @reg    - device register offset
 260 * @buffer - pointer to read/write buffer
 261 * @len    - byte count for read/write
 262 * @return 0 on success or negative value of errno.
 263 */
 264int pmic_read(struct udevice *dev, uint reg, uint8_t *buffer, int len);
 265int pmic_write(struct udevice *dev, uint reg, const uint8_t *buffer, int len);
 266
 267/**
 268 * pmic_reg_read() - read a PMIC register value
 269 *
 270 * @dev:        PMIC device to read
 271 * @reg:        Register to read
 272 * @return value read on success or negative value of errno.
 273 */
 274int pmic_reg_read(struct udevice *dev, uint reg);
 275
 276/**
 277 * pmic_reg_write() - write a PMIC register value
 278 *
 279 * @dev:        PMIC device to write
 280 * @reg:        Register to write
 281 * @value:      Value to write
 282 * @return 0 on success or negative value of errno.
 283 */
 284int pmic_reg_write(struct udevice *dev, uint reg, uint value);
 285
 286/**
 287 * pmic_clrsetbits() - clear and set bits in a PMIC register
 288 *
 289 * This reads a register, optionally clears some bits, optionally sets some
 290 * bits, then writes the register.
 291 *
 292 * @dev:        PMIC device to update
 293 * @reg:        Register to update
 294 * @clr:        Bit mask to clear (set those bits that you want cleared)
 295 * @set:        Bit mask to set (set those bits that you want set)
 296 * @return 0 on success or negative value of errno.
 297 */
 298int pmic_clrsetbits(struct udevice *dev, uint reg, uint clr, uint set);
 299
 300/*
 301 * This structure holds the private data for PMIC uclass
 302 * For now we store information about the number of bytes
 303 * being sent at once to the device.
 304 */
 305struct uc_pmic_priv {
 306        uint trans_len;
 307};
 308
 309#endif /* CONFIG_DM_PMIC */
 310
 311#ifdef CONFIG_POWER
 312int pmic_init(unsigned char bus);
 313int power_init_board(void);
 314int pmic_dialog_init(unsigned char bus);
 315int check_reg(struct pmic *p, u32 reg);
 316struct pmic *pmic_alloc(void);
 317struct pmic *pmic_get(const char *s);
 318int pmic_probe(struct pmic *p);
 319int pmic_reg_read(struct pmic *p, u32 reg, u32 *val);
 320int pmic_reg_write(struct pmic *p, u32 reg, u32 val);
 321int pmic_set_output(struct pmic *p, u32 reg, int ldo, int on);
 322#endif
 323
 324#define pmic_i2c_addr (p->hw.i2c.addr)
 325#define pmic_i2c_tx_num (p->hw.i2c.tx_num)
 326
 327#define pmic_spi_bitlen (p->hw.spi.bitlen)
 328#define pmic_spi_flags (p->hw.spi.flags)
 329
 330#endif /* __CORE_PMIC_H_ */
 331