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