1c7336815SŁukasz Majewski /* 24d9057e8SPrzemyslaw Marczak * Copyright (C) 2014-2015 Samsung Electronics 34d9057e8SPrzemyslaw Marczak * Przemyslaw Marczak <p.marczak@samsung.com> 44d9057e8SPrzemyslaw 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 <i2c.h> 15f415a3ecSPrzemyslaw Marczak #include <linux/list.h> 16bd8479e8SŁukasz Majewski #include <power/power_chrg.h> 17c7336815SŁukasz Majewski 18bd8479e8SŁukasz Majewski enum { PMIC_I2C, PMIC_SPI, PMIC_NONE}; 194d9057e8SPrzemyslaw Marczak 204d9057e8SPrzemyslaw Marczak #ifdef CONFIG_POWER 21c7336815SŁukasz Majewski enum { I2C_PMIC, I2C_NUM, }; 22c7336815SŁukasz Majewski enum { PMIC_READ, PMIC_WRITE, }; 23c7336815SŁukasz Majewski enum { PMIC_SENSOR_BYTE_ORDER_LITTLE, PMIC_SENSOR_BYTE_ORDER_BIG, }; 24c7336815SŁukasz Majewski 2578a36c3eSSimon Glass enum { 2678a36c3eSSimon Glass PMIC_CHARGER_DISABLE, 2778a36c3eSSimon Glass PMIC_CHARGER_ENABLE, 2878a36c3eSSimon Glass }; 2978a36c3eSSimon Glass 30c7336815SŁukasz Majewski struct p_i2c { 31c7336815SŁukasz Majewski unsigned char addr; 32c7336815SŁukasz Majewski unsigned char *buf; 33c7336815SŁukasz Majewski unsigned char tx_num; 34c7336815SŁukasz Majewski }; 35c7336815SŁukasz Majewski 36c7336815SŁukasz Majewski struct p_spi { 37c7336815SŁukasz Majewski unsigned int cs; 38c7336815SŁukasz Majewski unsigned int mode; 39c7336815SŁukasz Majewski unsigned int bitlen; 40c7336815SŁukasz Majewski unsigned int clk; 41c7336815SŁukasz Majewski unsigned int flags; 42c7336815SŁukasz Majewski u32 (*prepare_tx)(u32 reg, u32 *val, u32 write); 43c7336815SŁukasz Majewski }; 44c7336815SŁukasz Majewski 45bd8479e8SŁukasz Majewski struct pmic; 46bd8479e8SŁukasz Majewski struct power_fg { 47bd8479e8SŁukasz Majewski int (*fg_battery_check) (struct pmic *p, struct pmic *bat); 48bd8479e8SŁukasz Majewski int (*fg_battery_update) (struct pmic *p, struct pmic *bat); 49bd8479e8SŁukasz Majewski }; 50bd8479e8SŁukasz Majewski 51bd8479e8SŁukasz Majewski struct power_chrg { 52bd8479e8SŁukasz Majewski int (*chrg_type) (struct pmic *p); 53bd8479e8SŁukasz Majewski int (*chrg_bat_present) (struct pmic *p); 54bd8479e8SŁukasz Majewski int (*chrg_state) (struct pmic *p, int state, int current); 55bd8479e8SŁukasz Majewski }; 56bd8479e8SŁukasz Majewski 57bd8479e8SŁukasz Majewski struct power_battery { 58bd8479e8SŁukasz Majewski struct battery *bat; 59bd8479e8SŁukasz Majewski int (*battery_init) (struct pmic *bat, struct pmic *p1, 60bd8479e8SŁukasz Majewski struct pmic *p2, struct pmic *p3); 61bd8479e8SŁukasz Majewski int (*battery_charge) (struct pmic *bat); 62bd8479e8SŁukasz Majewski /* Keep info about power devices involved with battery operation */ 63bd8479e8SŁukasz Majewski struct pmic *chrg, *fg, *muic; 64bd8479e8SŁukasz Majewski }; 65bd8479e8SŁukasz Majewski 66c7336815SŁukasz Majewski struct pmic { 67c7336815SŁukasz Majewski const char *name; 68c7336815SŁukasz Majewski unsigned char bus; 69c7336815SŁukasz Majewski unsigned char interface; 70c7336815SŁukasz Majewski unsigned char sensor_byte_order; 71c7336815SŁukasz Majewski unsigned int number_of_regs; 72c7336815SŁukasz Majewski union hw { 73c7336815SŁukasz Majewski struct p_i2c i2c; 74c7336815SŁukasz Majewski struct p_spi spi; 75c7336815SŁukasz Majewski } hw; 76c7336815SŁukasz Majewski 77bd8479e8SŁukasz Majewski void (*low_power_mode) (void); 78bd8479e8SŁukasz Majewski struct power_battery *pbat; 79bd8479e8SŁukasz Majewski struct power_chrg *chrg; 80bd8479e8SŁukasz Majewski struct power_fg *fg; 81bd8479e8SŁukasz Majewski 82bd8479e8SŁukasz Majewski struct pmic *parent; 83c7336815SŁukasz Majewski struct list_head list; 84c7336815SŁukasz Majewski }; 854d9057e8SPrzemyslaw Marczak #endif /* CONFIG_POWER */ 86c7336815SŁukasz Majewski 874d9057e8SPrzemyslaw Marczak #ifdef CONFIG_DM_PMIC 884d9057e8SPrzemyslaw Marczak /** 894d9057e8SPrzemyslaw Marczak * U-Boot PMIC Framework 904d9057e8SPrzemyslaw Marczak * ===================== 914d9057e8SPrzemyslaw Marczak * 92f415a3ecSPrzemyslaw Marczak * UCLASS_PMIC - This is designed to provide an I/O interface for PMIC devices. 934d9057e8SPrzemyslaw Marczak * 944d9057e8SPrzemyslaw Marczak * For the multi-function PMIC devices, this can be used as parent I/O device 95f415a3ecSPrzemyslaw Marczak * for each IC's interface. Then, each child uses its parent for read/write. 964d9057e8SPrzemyslaw Marczak * 974d9057e8SPrzemyslaw Marczak * The driver model tree could look like this: 984d9057e8SPrzemyslaw Marczak * 994d9057e8SPrzemyslaw Marczak *_ root device 1004d9057e8SPrzemyslaw Marczak * |_ BUS 0 device (e.g. I2C0) - UCLASS_I2C/SPI/... 1014d9057e8SPrzemyslaw Marczak * | |_ PMIC device (READ/WRITE ops) - UCLASS_PMIC 1024d9057e8SPrzemyslaw Marczak * | |_ REGULATOR device (ldo/buck/... ops) - UCLASS_REGULATOR 1034d9057e8SPrzemyslaw Marczak * | |_ CHARGER device (charger ops) - UCLASS_CHARGER (in the future) 1044d9057e8SPrzemyslaw Marczak * | |_ MUIC device (microUSB connector ops) - UCLASS_MUIC (in the future) 1054d9057e8SPrzemyslaw Marczak * | |_ ... 1064d9057e8SPrzemyslaw Marczak * | 1074d9057e8SPrzemyslaw Marczak * |_ BUS 1 device (e.g. I2C1) - UCLASS_I2C/SPI/... 1084d9057e8SPrzemyslaw Marczak * |_ PMIC device (READ/WRITE ops) - UCLASS_PMIC 1094d9057e8SPrzemyslaw Marczak * |_ RTC device (rtc ops) - UCLASS_RTC (in the future) 1104d9057e8SPrzemyslaw Marczak * 1114d9057e8SPrzemyslaw Marczak * We can find two PMIC cases in boards design: 1124d9057e8SPrzemyslaw Marczak * - single I/O interface 1134d9057e8SPrzemyslaw Marczak * - multiple I/O interfaces 114f415a3ecSPrzemyslaw Marczak * We bind a single PMIC device for each interface, to provide an I/O for 115f415a3ecSPrzemyslaw Marczak * its child devices. And each child usually implements a different function, 1164d9057e8SPrzemyslaw Marczak * controlled by the same interface. 1174d9057e8SPrzemyslaw Marczak * 1184d9057e8SPrzemyslaw Marczak * The binding should be done automatically. If device tree nodes/subnodes are 1194d9057e8SPrzemyslaw Marczak * proper defined, then: 1204d9057e8SPrzemyslaw Marczak * 1214d9057e8SPrzemyslaw Marczak * |_ the ROOT driver will bind the device for I2C/SPI node: 1224d9057e8SPrzemyslaw Marczak * |_ the I2C/SPI driver should bind a device for pmic node: 1234d9057e8SPrzemyslaw Marczak * |_ the PMIC driver should bind devices for its childs: 1244d9057e8SPrzemyslaw Marczak * |_ regulator (child) 1254d9057e8SPrzemyslaw Marczak * |_ charger (child) 1264d9057e8SPrzemyslaw Marczak * |_ other (child) 1274d9057e8SPrzemyslaw Marczak * 1284d9057e8SPrzemyslaw Marczak * The same for other device nodes, for multi-interface PMIC. 1294d9057e8SPrzemyslaw Marczak * 1304d9057e8SPrzemyslaw Marczak * Note: 1314d9057e8SPrzemyslaw Marczak * Each PMIC interface driver should use a different compatible string. 1324d9057e8SPrzemyslaw Marczak * 133f415a3ecSPrzemyslaw Marczak * If a PMIC child device driver needs access the PMIC-specific registers, 1344d9057e8SPrzemyslaw Marczak * it need know only the register address and the access can be done through 1354d9057e8SPrzemyslaw Marczak * the parent pmic driver. Like in the example: 1364d9057e8SPrzemyslaw Marczak * 1374d9057e8SPrzemyslaw Marczak *_ root driver 1384d9057e8SPrzemyslaw Marczak * |_ dev: bus I2C0 - UCLASS_I2C 1394d9057e8SPrzemyslaw Marczak * | |_ dev: my_pmic (read/write) (is parent) - UCLASS_PMIC 1404d9057e8SPrzemyslaw Marczak * | |_ dev: my_regulator (set value/etc..) (is child) - UCLASS_REGULATOR 1414d9057e8SPrzemyslaw Marczak * 1424d9057e8SPrzemyslaw Marczak * To ensure such device relationship, the pmic device driver should also bind 143f415a3ecSPrzemyslaw Marczak * all its child devices, like in the example below. It can be done by calling 144f415a3ecSPrzemyslaw Marczak * the 'pmic_bind_children()' - please refer to the function description, which 145f415a3ecSPrzemyslaw Marczak * can be found in this header file. This function, should be called inside the 146f415a3ecSPrzemyslaw Marczak * driver's bind() method. 1474d9057e8SPrzemyslaw Marczak * 1484d9057e8SPrzemyslaw Marczak * For the example driver, please refer the MAX77686 driver: 1494d9057e8SPrzemyslaw Marczak * - 'drivers/power/pmic/max77686.c' 1504d9057e8SPrzemyslaw Marczak */ 1514d9057e8SPrzemyslaw Marczak 1524d9057e8SPrzemyslaw Marczak /** 1534d9057e8SPrzemyslaw Marczak * struct dm_pmic_ops - PMIC device I/O interface 1544d9057e8SPrzemyslaw Marczak * 1554d9057e8SPrzemyslaw Marczak * Should be implemented by UCLASS_PMIC device drivers. The standard 1564d9057e8SPrzemyslaw Marczak * device operations provides the I/O interface for it's childs. 1574d9057e8SPrzemyslaw Marczak * 158f415a3ecSPrzemyslaw Marczak * @reg_count: device's register count 1594d9057e8SPrzemyslaw Marczak * @read: read 'len' bytes at "reg" and store it into the 'buffer' 1604d9057e8SPrzemyslaw Marczak * @write: write 'len' bytes from the 'buffer' to the register at 'reg' address 1614d9057e8SPrzemyslaw Marczak */ 1624d9057e8SPrzemyslaw Marczak struct dm_pmic_ops { 163f415a3ecSPrzemyslaw Marczak int (*reg_count)(struct udevice *dev); 1644d9057e8SPrzemyslaw Marczak int (*read)(struct udevice *dev, uint reg, uint8_t *buffer, int len); 1654d9057e8SPrzemyslaw Marczak int (*write)(struct udevice *dev, uint reg, const uint8_t *buffer, 1664d9057e8SPrzemyslaw Marczak int len); 1674d9057e8SPrzemyslaw Marczak }; 1684d9057e8SPrzemyslaw Marczak 169f415a3ecSPrzemyslaw Marczak /** 170f415a3ecSPrzemyslaw Marczak * enum pmic_op_type - used for various pmic devices operation calls, 1714d9057e8SPrzemyslaw Marczak * for reduce a number of lines with the same code for read/write or get/set. 1724d9057e8SPrzemyslaw Marczak * 1734d9057e8SPrzemyslaw Marczak * @PMIC_OP_GET - get operation 1744d9057e8SPrzemyslaw Marczak * @PMIC_OP_SET - set operation 1754d9057e8SPrzemyslaw Marczak */ 1764d9057e8SPrzemyslaw Marczak enum pmic_op_type { 1774d9057e8SPrzemyslaw Marczak PMIC_OP_GET, 1784d9057e8SPrzemyslaw Marczak PMIC_OP_SET, 1794d9057e8SPrzemyslaw Marczak }; 1804d9057e8SPrzemyslaw Marczak 1814d9057e8SPrzemyslaw Marczak /** 1824d9057e8SPrzemyslaw Marczak * struct pmic_child_info - basic device's child info for bind child nodes with 1834d9057e8SPrzemyslaw Marczak * the driver by the node name prefix and driver name. This is a helper struct 184f415a3ecSPrzemyslaw Marczak * for function: pmic_bind_children(). 1854d9057e8SPrzemyslaw Marczak * 1864d9057e8SPrzemyslaw Marczak * @prefix - child node name prefix (or its name if is unique or single) 1874d9057e8SPrzemyslaw Marczak * @driver - driver name for the sub-node with prefix 1884d9057e8SPrzemyslaw Marczak */ 1894d9057e8SPrzemyslaw Marczak struct pmic_child_info { 1904d9057e8SPrzemyslaw Marczak const char *prefix; 1914d9057e8SPrzemyslaw Marczak const char *driver; 1924d9057e8SPrzemyslaw Marczak }; 1934d9057e8SPrzemyslaw Marczak 1944d9057e8SPrzemyslaw Marczak /* drivers/power/pmic-uclass.c */ 1954d9057e8SPrzemyslaw Marczak 1964d9057e8SPrzemyslaw Marczak /** 197f415a3ecSPrzemyslaw Marczak * pmic_bind_children() - bind drivers for given parent pmic, using child info 1984d9057e8SPrzemyslaw Marczak * found in 'child_info' array. 1994d9057e8SPrzemyslaw Marczak * 2004d9057e8SPrzemyslaw Marczak * @pmic - pmic device - the parent of found child's 2014d9057e8SPrzemyslaw Marczak * @child_info - N-childs info array 2024d9057e8SPrzemyslaw Marczak * @return a positive number of childs, or 0 if no child found (error) 2034d9057e8SPrzemyslaw Marczak * 2044d9057e8SPrzemyslaw Marczak * Note: For N-childs the child_info array should have N+1 entries and the last 2054d9057e8SPrzemyslaw Marczak * entry prefix should be NULL - the same as for drivers compatible. 2064d9057e8SPrzemyslaw Marczak * 2074d9057e8SPrzemyslaw Marczak * For example, a single prefix info (N=1): 2084d9057e8SPrzemyslaw Marczak * static const struct pmic_child_info bind_info[] = { 2094d9057e8SPrzemyslaw Marczak * { .prefix = "ldo", .driver = "ldo_driver" }, 2104d9057e8SPrzemyslaw Marczak * { }, 2114d9057e8SPrzemyslaw Marczak * }; 2124d9057e8SPrzemyslaw Marczak * 2134d9057e8SPrzemyslaw Marczak * This function is useful for regulator sub-nodes: 2144d9057e8SPrzemyslaw Marczak * my_regulator@0xa { 2154d9057e8SPrzemyslaw Marczak * reg = <0xa>; 2164d9057e8SPrzemyslaw Marczak * (pmic - bind automatically by compatible) 2174d9057e8SPrzemyslaw Marczak * compatible = "my_pmic"; 2184d9057e8SPrzemyslaw Marczak * ... 219f415a3ecSPrzemyslaw Marczak * (pmic's childs - bind by pmic_bind_children()) 2204d9057e8SPrzemyslaw Marczak * (nodes prefix: "ldo", driver: "my_regulator_ldo") 2214d9057e8SPrzemyslaw Marczak * ldo1 { ... }; 2224d9057e8SPrzemyslaw Marczak * ldo2 { ... }; 2234d9057e8SPrzemyslaw Marczak * 2244d9057e8SPrzemyslaw Marczak * (nodes prefix: "buck", driver: "my_regulator_buck") 2254d9057e8SPrzemyslaw Marczak * buck1 { ... }; 2264d9057e8SPrzemyslaw Marczak * buck2 { ... }; 2274d9057e8SPrzemyslaw Marczak * }; 2284d9057e8SPrzemyslaw Marczak */ 229*7a869e6cSSimon Glass int pmic_bind_children(struct udevice *pmic, ofnode parent, 2304d9057e8SPrzemyslaw Marczak const struct pmic_child_info *child_info); 2314d9057e8SPrzemyslaw Marczak 2324d9057e8SPrzemyslaw Marczak /** 2334d9057e8SPrzemyslaw Marczak * pmic_get: get the pmic device using its name 2344d9057e8SPrzemyslaw Marczak * 2354d9057e8SPrzemyslaw Marczak * @name - device name 2364d9057e8SPrzemyslaw Marczak * @devp - returned pointer to the pmic device 2374d9057e8SPrzemyslaw Marczak * @return 0 on success or negative value of errno. 2384d9057e8SPrzemyslaw Marczak * 2394d9057e8SPrzemyslaw Marczak * The returned devp device can be used with pmic_read/write calls 2404d9057e8SPrzemyslaw Marczak */ 2414d9057e8SPrzemyslaw Marczak int pmic_get(const char *name, struct udevice **devp); 2424d9057e8SPrzemyslaw Marczak 2434d9057e8SPrzemyslaw Marczak /** 2444d9057e8SPrzemyslaw Marczak * pmic_reg_count: get the pmic register count 2454d9057e8SPrzemyslaw Marczak * 2464d9057e8SPrzemyslaw Marczak * The required pmic device can be obtained by 'pmic_get()' 2474d9057e8SPrzemyslaw Marczak * 2484d9057e8SPrzemyslaw Marczak * @dev - pointer to the UCLASS_PMIC device 2494d9057e8SPrzemyslaw Marczak * @return register count value on success or negative value of errno. 2504d9057e8SPrzemyslaw Marczak */ 2514d9057e8SPrzemyslaw Marczak int pmic_reg_count(struct udevice *dev); 2524d9057e8SPrzemyslaw Marczak 2534d9057e8SPrzemyslaw Marczak /** 2544d9057e8SPrzemyslaw Marczak * pmic_read/write: read/write to the UCLASS_PMIC device 2554d9057e8SPrzemyslaw Marczak * 2564d9057e8SPrzemyslaw Marczak * The required pmic device can be obtained by 'pmic_get()' 2574d9057e8SPrzemyslaw Marczak * 2584d9057e8SPrzemyslaw Marczak * @pmic - pointer to the UCLASS_PMIC device 2594d9057e8SPrzemyslaw Marczak * @reg - device register offset 2604d9057e8SPrzemyslaw Marczak * @buffer - pointer to read/write buffer 2614d9057e8SPrzemyslaw Marczak * @len - byte count for read/write 2624d9057e8SPrzemyslaw Marczak * @return 0 on success or negative value of errno. 2634d9057e8SPrzemyslaw Marczak */ 2644d9057e8SPrzemyslaw Marczak int pmic_read(struct udevice *dev, uint reg, uint8_t *buffer, int len); 2654d9057e8SPrzemyslaw Marczak int pmic_write(struct udevice *dev, uint reg, const uint8_t *buffer, int len); 2666c69c7fbSSimon Glass 2676c69c7fbSSimon Glass /** 2686c69c7fbSSimon Glass * pmic_reg_read() - read a PMIC register value 2696c69c7fbSSimon Glass * 2706c69c7fbSSimon Glass * @dev: PMIC device to read 2716c69c7fbSSimon Glass * @reg: Register to read 2726c69c7fbSSimon Glass * @return value read on success or negative value of errno. 2736c69c7fbSSimon Glass */ 2746c69c7fbSSimon Glass int pmic_reg_read(struct udevice *dev, uint reg); 2756c69c7fbSSimon Glass 2766c69c7fbSSimon Glass /** 2776c69c7fbSSimon Glass * pmic_reg_write() - write a PMIC register value 2786c69c7fbSSimon Glass * 2796c69c7fbSSimon Glass * @dev: PMIC device to write 2806c69c7fbSSimon Glass * @reg: Register to write 2816c69c7fbSSimon Glass * @value: Value to write 2826c69c7fbSSimon Glass * @return 0 on success or negative value of errno. 2836c69c7fbSSimon Glass */ 2846c69c7fbSSimon Glass int pmic_reg_write(struct udevice *dev, uint reg, uint value); 2856c69c7fbSSimon Glass 2866c69c7fbSSimon Glass /** 2876c69c7fbSSimon Glass * pmic_clrsetbits() - clear and set bits in a PMIC register 2886c69c7fbSSimon Glass * 2896c69c7fbSSimon Glass * This reads a register, optionally clears some bits, optionally sets some 2906c69c7fbSSimon Glass * bits, then writes the register. 2916c69c7fbSSimon Glass * 2926c69c7fbSSimon Glass * @dev: PMIC device to update 2936c69c7fbSSimon Glass * @reg: Register to update 2946c69c7fbSSimon Glass * @clr: Bit mask to clear (set those bits that you want cleared) 2956c69c7fbSSimon Glass * @set: Bit mask to set (set those bits that you want set) 2966c69c7fbSSimon Glass * @return 0 on success or negative value of errno. 2976c69c7fbSSimon Glass */ 2986c69c7fbSSimon Glass int pmic_clrsetbits(struct udevice *dev, uint reg, uint clr, uint set); 2996c69c7fbSSimon Glass 3004d9057e8SPrzemyslaw Marczak #endif /* CONFIG_DM_PMIC */ 3014d9057e8SPrzemyslaw Marczak 3024d9057e8SPrzemyslaw Marczak #ifdef CONFIG_POWER 303c7336815SŁukasz Majewski int pmic_init(unsigned char bus); 3045c44dd6bSTom Rini int power_init_board(void); 305c7336815SŁukasz Majewski int pmic_dialog_init(unsigned char bus); 306c7336815SŁukasz Majewski int check_reg(struct pmic *p, u32 reg); 307c7336815SŁukasz Majewski struct pmic *pmic_alloc(void); 308c7336815SŁukasz Majewski struct pmic *pmic_get(const char *s); 309c7336815SŁukasz Majewski int pmic_probe(struct pmic *p); 310c7336815SŁukasz Majewski int pmic_reg_read(struct pmic *p, u32 reg, u32 *val); 311c7336815SŁukasz Majewski int pmic_reg_write(struct pmic *p, u32 reg, u32 val); 312c7336815SŁukasz Majewski int pmic_set_output(struct pmic *p, u32 reg, int ldo, int on); 3134d9057e8SPrzemyslaw Marczak #endif 314c7336815SŁukasz Majewski 315c7336815SŁukasz Majewski #define pmic_i2c_addr (p->hw.i2c.addr) 316c7336815SŁukasz Majewski #define pmic_i2c_tx_num (p->hw.i2c.tx_num) 317c7336815SŁukasz Majewski 318c7336815SŁukasz Majewski #define pmic_spi_bitlen (p->hw.spi.bitlen) 319c7336815SŁukasz Majewski #define pmic_spi_flags (p->hw.spi.flags) 320c7336815SŁukasz Majewski 321c7336815SŁukasz Majewski #endif /* __CORE_PMIC_H_ */ 322