mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 18:35:42 +01:00 
			
		
		
		
	power: Add support for the TPS65218 PMIC
Add a driver for the TPS65218 PMIC which is used by TI AM43xx SoCs and may be used by TI AM335x SoCs. Signed-off-by: Tom Rini <trini@ti.com>
This commit is contained in:
		| @@ -13,4 +13,5 @@ obj-$(CONFIG_POWER_MAX77686) += pmic_max77686.o | ||||
| obj-$(CONFIG_POWER_PFUZE100) += pmic_pfuze100.o | ||||
| obj-$(CONFIG_POWER_TPS65090) += pmic_tps65090.o | ||||
| obj-$(CONFIG_POWER_TPS65217) += pmic_tps65217.o | ||||
| obj-$(CONFIG_POWER_TPS65218) += pmic_tps65218.o | ||||
| obj-$(CONFIG_POWER_TPS65910) += pmic_tps65910.o | ||||
|   | ||||
							
								
								
									
										97
									
								
								drivers/power/pmic/pmic_tps65218.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								drivers/power/pmic/pmic_tps65218.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,97 @@ | ||||
| /* | ||||
|  * (C) Copyright 2011-2013 | ||||
|  * Texas Instruments, <www.ti.com> | ||||
|  * | ||||
|  * SPDX-License-Identifier:	GPL-2.0+ | ||||
|  */ | ||||
|  | ||||
| #include <common.h> | ||||
| #include <i2c.h> | ||||
| #include <power/tps65218.h> | ||||
|  | ||||
| /** | ||||
|  *  tps65218_reg_write() - Generic function that can write a TPS65218 PMIC | ||||
|  *			   register or bit field regardless of protection | ||||
|  *			   level. | ||||
|  * | ||||
|  *  @prot_level:	   Register password protection.  Use | ||||
|  *			   TPS65218_PROT_LEVEL_NONE, | ||||
|  *			   TPS65218_PROT_LEVEL_1 or TPS65218_PROT_LEVEL_2 | ||||
|  *  @dest_reg:		   Register address to write. | ||||
|  *  @dest_val:		   Value to write. | ||||
|  *  @mask:		   Bit mask (8 bits) to be applied.  Function will only | ||||
|  *			   change bits that are set in the bit mask. | ||||
|  * | ||||
|  *  @return:		   0 for success, not 0 on failure, as per the i2c API | ||||
|  */ | ||||
| int tps65218_reg_write(uchar prot_level, uchar dest_reg, uchar dest_val, | ||||
| 		       uchar mask) | ||||
| { | ||||
| 	uchar read_val; | ||||
| 	uchar xor_reg; | ||||
| 	int ret; | ||||
|  | ||||
| 	/* | ||||
| 	 * If we are affecting only a bit field, read dest_reg and apply the | ||||
| 	 * mask | ||||
| 	 */ | ||||
| 	if (mask != TPS65218_MASK_ALL_BITS) { | ||||
| 		ret = i2c_read(TPS65218_CHIP_PM, dest_reg, 1, &read_val, 1); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 		read_val &= (~mask); | ||||
| 		read_val |= (dest_val & mask); | ||||
| 		dest_val = read_val; | ||||
| 	} | ||||
|  | ||||
| 	if (prot_level > 0) { | ||||
| 		xor_reg = dest_reg ^ TPS65218_PASSWORD_UNLOCK; | ||||
| 		ret = i2c_write(TPS65218_CHIP_PM, TPS65218_PASSWORD, 1, | ||||
| 				&xor_reg, 1); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 	} | ||||
|  | ||||
| 	ret = i2c_write(TPS65218_CHIP_PM, dest_reg, 1, &dest_val, 1); | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
|  | ||||
| 	if (prot_level == TPS65218_PROT_LEVEL_2) { | ||||
| 		ret = i2c_write(TPS65218_CHIP_PM, TPS65218_PASSWORD, 1, | ||||
| 				&xor_reg, 1); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
|  | ||||
| 		ret = i2c_write(TPS65218_CHIP_PM, dest_reg, 1, &dest_val, 1); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * tps65218_voltage_update() - Function to change a voltage level, as this | ||||
|  *			       is a multi-step process. | ||||
|  * @dc_cntrl_reg:	       DC voltage control register to change. | ||||
|  * @volt_sel:		       New value for the voltage register | ||||
|  * @return:		       0 for success, not 0 on failure. | ||||
|  */ | ||||
| int tps65218_voltage_update(uchar dc_cntrl_reg, uchar volt_sel) | ||||
| { | ||||
| 	if ((dc_cntrl_reg != TPS65218_DCDC1) && | ||||
| 	    (dc_cntrl_reg != TPS65218_DCDC2)) | ||||
| 		return 1; | ||||
|  | ||||
| 	/* set voltage level */ | ||||
| 	if (tps65218_reg_write(TPS65218_PROT_LEVEL_2, dc_cntrl_reg, volt_sel, | ||||
| 			       TPS65218_MASK_ALL_BITS)) | ||||
| 		return 1; | ||||
|  | ||||
| 	/* set GO bit to initiate voltage transition */ | ||||
| 	if (tps65218_reg_write(TPS65218_PROT_LEVEL_2, TPS65218_SLEW, | ||||
| 			       TPS65218_DCDC_GO, TPS65218_DCDC_GO)) | ||||
| 		return 1; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
							
								
								
									
										63
									
								
								include/power/tps65218.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								include/power/tps65218.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| /* | ||||
|  * (C) Copyright 2014 | ||||
|  * Texas Instruments, <www.ti.com> | ||||
|  * | ||||
|  * SPDX-License-Identifier:	GPL-2.0+ | ||||
|  */ | ||||
|  | ||||
| #ifndef __POWER_TPS65218_H__ | ||||
| #define __POWER_TPS65218_H__ | ||||
|  | ||||
| /* I2C chip address */ | ||||
| #define TPS65218_CHIP_PM			0x24 | ||||
|  | ||||
| /* Registers */ | ||||
| enum { | ||||
| 	TPS65218_CHIPID				= 0x00, | ||||
| 	TPS65218_INT1, | ||||
| 	TPS65218_INT2, | ||||
| 	TPS65218_INT_MASK1, | ||||
| 	TPS65218_INT_MASK2, | ||||
| 	TPS65218_STATUS, | ||||
| 	TPS65218_CONTROL, | ||||
| 	TPS65218_FLAG, | ||||
| 	TPS65218_PASSWORD			= 0x10, | ||||
| 	TPS65218_ENABLE1, | ||||
| 	TPS65218_ENABLE2, | ||||
| 	TPS65218_CONFIG1, | ||||
| 	TPS65218_CONFIG2, | ||||
| 	TPS65218_CONFIG3, | ||||
| 	TPS65218_DCDC1, | ||||
| 	TPS65218_DCDC2, | ||||
| 	TPS65218_DCDC3, | ||||
| 	TPS65218_DCDC4, | ||||
| 	TPS65218_SLEW, | ||||
| 	TPS65218_LDO1, | ||||
| 	TPS65218_SEQ1				= 0x20, | ||||
| 	TPS65218_SEQ2, | ||||
| 	TPS65218_SEQ3, | ||||
| 	TPS65218_SEQ4, | ||||
| 	TPS65218_SEQ5, | ||||
| 	TPS65218_SEQ6, | ||||
| 	TPS65218_SEQ7, | ||||
| 	TPS65218_PMIC_NUM_OF_REGS, | ||||
| }; | ||||
|  | ||||
| #define TPS65218_PROT_LEVEL_NONE		0x00 | ||||
| #define TPS65218_PROT_LEVEL_1			0x01 | ||||
| #define TPS65218_PROT_LEVEL_2			0x02 | ||||
|  | ||||
| #define TPS65218_PASSWORD_LOCK_FOR_WRITE	0x00 | ||||
| #define TPS65218_PASSWORD_UNLOCK		0x7D | ||||
|  | ||||
| #define TPS65218_DCDC_GO			0x80 | ||||
|  | ||||
| #define TPS65218_MASK_ALL_BITS			0xFF | ||||
|  | ||||
| #define TPS65218_DCDC_VOLT_SEL_1100MV		0x19 | ||||
| #define TPS65218_DCDC_VOLT_SEL_1330MV		0x30 | ||||
|  | ||||
| int tps65218_reg_write(uchar prot_level, uchar dest_reg, uchar dest_val, | ||||
| 		       uchar mask); | ||||
| int tps65218_voltage_update(uchar dc_cntrl_reg, uchar volt_sel); | ||||
| #endif	/* __POWER_TPS65218_H__ */ | ||||
		Reference in New Issue
	
	Block a user