MLK-18387 pmic: Add pmic driver for BD71837
The iMX8MM EVK board uses BD71837MWV pmic. Add its driver to u-boot. Signed-off-by: Ye Li <ye.li@nxp.com>
This commit is contained in:
		
							parent
							
								
									f3d2fba818
								
							
						
					
					
						commit
						e9a3bec2e9
					
				|  | @ -48,6 +48,13 @@ config PMIC_AS3722 | |||
| 	  interface and is designs to cover most of the power managementment | ||||
| 	  required for a tablets or laptop. | ||||
| 
 | ||||
| config DM_PMIC_BD71837 | ||||
|  	bool "Enable Driver Model for PMIC BD71837" | ||||
|  	depends on DM_PMIC | ||||
|  	help | ||||
| 	  This config enables implementation of driver-model pmic uclass features | ||||
| 	  for PMIC BD71837. The driver implements read/write operations. | ||||
| 
 | ||||
| config DM_PMIC_PFUZE100 | ||||
| 	bool "Enable Driver Model for PMIC PFUZE100" | ||||
| 	depends on DM_PMIC | ||||
|  |  | |||
|  | @ -9,6 +9,7 @@ obj-$(CONFIG_$(SPL_)DM_PMIC) += pmic-uclass.o | |||
| obj-$(CONFIG_DM_PMIC_MAX77686) += max77686.o | ||||
| obj-$(CONFIG_DM_PMIC_MAX8998) += max8998.o | ||||
| obj-$(CONFIG_$(SPL_)DM_PMIC_PFUZE100) += pfuze100.o | ||||
| obj-$(CONFIG_$(SPL_)DM_PMIC_BD71837) += bd71837.o | ||||
| obj-$(CONFIG_PMIC_S2MPS11) += s2mps11.o | ||||
| obj-$(CONFIG_DM_PMIC_SANDBOX) += sandbox.o i2c_pmic_emul.o | ||||
| obj-$(CONFIG_PMIC_ACT8846) += act8846.o | ||||
|  | @ -30,6 +31,7 @@ obj-$(CONFIG_POWER_MAX8998) += pmic_max8998.o | |||
| obj-$(CONFIG_POWER_MAX8997) += pmic_max8997.o | ||||
| obj-$(CONFIG_POWER_MUIC_MAX8997) += muic_max8997.o | ||||
| obj-$(CONFIG_POWER_MAX77686) += pmic_max77686.o | ||||
| obj-$(CONFIG_POWER_BD71837) += pmic_bd71837.o | ||||
| obj-$(CONFIG_POWER_PFUZE100) += pmic_pfuze100.o | ||||
| obj-$(CONFIG_POWER_PFUZE3000) += pmic_pfuze3000.o | ||||
| obj-$(CONFIG_POWER_TPS65217) += pmic_tps65217.o | ||||
|  |  | |||
|  | @ -0,0 +1,92 @@ | |||
| /*
 | ||||
|  * Copyright 2018 NXP  * | ||||
|  * SPDX-License-Identifier:      GPL-2.0+ | ||||
|  */ | ||||
| 
 | ||||
| #include <common.h> | ||||
| #include <fdtdec.h> | ||||
| #include <errno.h> | ||||
| #include <dm.h> | ||||
| #include <i2c.h> | ||||
| #include <power/pmic.h> | ||||
| #include <power/regulator.h> | ||||
| #include <power/bd71837.h> | ||||
| 
 | ||||
| DECLARE_GLOBAL_DATA_PTR; | ||||
| 
 | ||||
| static const struct pmic_child_info pmic_children_info[] = { | ||||
| 	/* buck */ | ||||
| 	{ .prefix = "b", .driver = BD71837_REGULATOR_DRIVER}, | ||||
| 	/* ldo */ | ||||
| 	{ .prefix = "l", .driver = BD71837_REGULATOR_DRIVER}, | ||||
| 	{ }, | ||||
| }; | ||||
| 
 | ||||
| static int bd71837_reg_count(struct udevice *dev) | ||||
| { | ||||
| 	return BD71837_REG_NUM; | ||||
| } | ||||
| 
 | ||||
| static int bd71837_write(struct udevice *dev, uint reg, const uint8_t *buff, | ||||
| 			  int len) | ||||
| { | ||||
| 	if (dm_i2c_write(dev, reg, buff, len)) { | ||||
| 		error("write error to device: %p register: %#x!", dev, reg); | ||||
| 		return -EIO; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int bd71837_read(struct udevice *dev, uint reg, uint8_t *buff, int len) | ||||
| { | ||||
| 	if (dm_i2c_read(dev, reg, buff, len)) { | ||||
| 		error("read error from device: %p register: %#x!", dev, reg); | ||||
| 		return -EIO; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int bd71837_bind(struct udevice *dev) | ||||
| { | ||||
| 	int children; | ||||
| 	int regulators_node; | ||||
| 	const void *blob = gd->fdt_blob; | ||||
| 
 | ||||
| 	regulators_node = fdt_subnode_offset(blob, dev_of_offset(dev), | ||||
| 					     "regulators"); | ||||
| 	if (regulators_node <= 0) { | ||||
| 		debug("%s: %s regulators subnode not found!", __func__, | ||||
| 		      dev->name); | ||||
| 		return -ENXIO; | ||||
| 	} | ||||
| 
 | ||||
| 	debug("%s: '%s' - found regulators subnode\n", __func__, dev->name); | ||||
| 
 | ||||
| 	children = pmic_bind_children(dev, regulators_node, pmic_children_info); | ||||
| 	if (!children) | ||||
| 		debug("%s: %s - no child found\n", __func__, dev->name); | ||||
| 
 | ||||
| 	/* Always return success for this device */ | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct dm_pmic_ops bd71837_ops = { | ||||
| 	.reg_count = bd71837_reg_count, | ||||
| 	.read = bd71837_read, | ||||
| 	.write = bd71837_write, | ||||
| }; | ||||
| 
 | ||||
| static const struct udevice_id bd71837_ids[] = { | ||||
| 	{ .compatible = "rohm,bd71837", .data = 0x4b, }, | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| U_BOOT_DRIVER(pmic_bd71837) = { | ||||
| 	.name = "bd71837 pmic", | ||||
| 	.id = UCLASS_PMIC, | ||||
| 	.of_match = bd71837_ids, | ||||
| 	.bind = bd71837_bind, | ||||
| 	.ops = &bd71837_ops, | ||||
| }; | ||||
|  | @ -0,0 +1,33 @@ | |||
| /*
 | ||||
|  * Copyright (C) 2014 Gateworks Corporation | ||||
|  * Tim Harvey <tharvey@gateworks.com> | ||||
|  * | ||||
|  * SPDX-License-Identifier:      GPL-2.0+ | ||||
|  */ | ||||
| 
 | ||||
| #include <common.h> | ||||
| #include <errno.h> | ||||
| #include <i2c.h> | ||||
| #include <power/pmic.h> | ||||
| #include <power/bd71837.h> | ||||
| 
 | ||||
| static const char bd71837_name[] = "BD71837"; | ||||
| int power_bd71837_init (unsigned char bus) { | ||||
| 	struct pmic *p = pmic_alloc(); | ||||
| 
 | ||||
| 	if (!p) { | ||||
| 		printf("%s: POWER allocation error!\n", __func__); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
| 
 | ||||
| 	p->name = bd71837_name; | ||||
| 	p->interface = PMIC_I2C; | ||||
| 	p->number_of_regs = BD71837_REG_NUM; | ||||
| 	p->hw.i2c.addr = 0x4b; | ||||
| 	p->hw.i2c.tx_num = 1; | ||||
| 	p->bus = bus; | ||||
| 
 | ||||
| 	printf("power_bd71837_init\n"); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
|  | @ -0,0 +1,62 @@ | |||
| 
 | ||||
| #ifndef BD71837_H_ | ||||
| #define BD71837_H_ | ||||
| 
 | ||||
| #define BD71837_REGULATOR_DRIVER "bd71837_regulator" | ||||
| 
 | ||||
| enum { | ||||
|     BD71837_REV 		= 0x00, | ||||
|     BD71837_SWRESET 		= 0x01, | ||||
|     BD71837_I2C_DEV		= 0x02, | ||||
|     BD71837_PWRCTRL0		= 0x03, | ||||
|     BD71837_PWRCTRL1 		= 0x04, | ||||
|     BD71837_BUCK1_CTRL		= 0x05, | ||||
|     BD71837_BUCK2_CTRL		= 0x06, | ||||
|     BD71837_BUCK3_CTRL		= 0x07, | ||||
|     BD71837_BUCK4_CTRL		= 0x08, | ||||
|     BD71837_BUCK5_CTRL		= 0x09, | ||||
|     BD71837_BUCK6_CTRL		= 0x0A, | ||||
|     BD71837_BUCK7_CTRL		= 0x0B, | ||||
|     BD71837_BUCK8_CTRL		= 0x0C, | ||||
|     BD71837_BUCK1_VOLT_RUN	= 0x0D, | ||||
|     BD71837_BUCK1_VOLT_IDLE	= 0x0E, | ||||
|     BD71837_BUCK1_VOLT_SUSP	= 0x0F, | ||||
|     BD71837_BUCK2_VOLT_RUN	= 0x10, | ||||
|     BD71837_BUCK2_VOLT_IDLE	= 0x11, | ||||
|     BD71837_BUCK3_VOLT_RUN	= 0x12, | ||||
|     BD71837_BUCK4_VOLT_RUN	= 0x13, | ||||
|     BD71837_BUCK5_VOLT		= 0x14, | ||||
|     BD71837_BUCK6_VOLT		= 0x15, | ||||
|     BD71837_BUCK7_VOLT		= 0x16, | ||||
|     BD71837_BUCK8_VOLT		= 0x17, | ||||
|     BD71837_LDO1_VOLT		= 0x18, | ||||
|     BD71837_LDO2_VOLT		= 0x19, | ||||
|     BD71837_LDO3_VOLT		= 0x1A, | ||||
|     BD71837_LDO4_VOLT		= 0x1B, | ||||
|     BD71837_LDO5_VOLT		= 0x1C, | ||||
|     BD71837_LDO6_VOLT		= 0x1D, | ||||
|     BD71837_LDO7_VOLT		= 0x1E, | ||||
|     BD71837_TRANS_COND0		= 0x1F, | ||||
|     BD71837_TRANS_COND1		= 0x20, | ||||
|     BD71837_VRFAULTEN		= 0x21, | ||||
|     BD71837_MVRFLTMASK0		= 0x22, | ||||
|     BD71837_MVRFLTMASK1		= 0x23, | ||||
|     BD71837_MVRFLTMASK2		= 0x24, | ||||
|     BD71837_RCVCFG		= 0x25, | ||||
|     BD71837_RCVNUM		= 0x26, | ||||
|     BD71837_PWRONCONFIG0	= 0x27, | ||||
|     BD71837_PWRONCONFIG1	= 0x28, | ||||
|     BD71837_RESETSRC		= 0x29, | ||||
|     BD71837_MIRQ		= 0x2A, | ||||
|     BD71837_IRQ			= 0x2B, | ||||
|     BD71837_IN_MON		= 0x2C, | ||||
|     BD71837_POW_STATE		= 0x2D, | ||||
|     BD71837_OUT32K		= 0x2E, | ||||
|     BD71837_REGLOCK		= 0x2F, | ||||
|     BD71837_MUXSW_EN		= 0x30, | ||||
|     BD71837_REG_NUM, | ||||
| }; | ||||
| 
 | ||||
| int power_bd71837_init(unsigned char bus); | ||||
| 
 | ||||
| #endif | ||||
		Loading…
	
		Reference in New Issue