dm: pmic: Add functions to adjust PMIC registers

It is a common requirement to update some PMIC registers. Provide some
simple convenience functions to do this.

Signed-off-by: Simon Glass <sjg@chromium.org>
Tested-by: Przemyslaw Marczak <p.marczak@samsung.com>
Acked-by: Przemyslaw Marczak <p.marczak@samsung.com>
This commit is contained in:
Simon Glass 2015-06-23 15:39:01 -06:00
parent 59c26a9c22
commit 6c69c7fb57
2 changed files with 66 additions and 0 deletions

View file

@ -139,6 +139,38 @@ int pmic_write(struct udevice *dev, uint reg, const uint8_t *buffer, int len)
return ops->write(dev, reg, buffer, len);
}
int pmic_reg_read(struct udevice *dev, uint reg)
{
u8 byte;
int ret;
ret = pmic_read(dev, reg, &byte, 1);
debug("%s: reg=%x, value=%x\n", __func__, reg, byte);
return ret ? ret : byte;
}
int pmic_reg_write(struct udevice *dev, uint reg, uint value)
{
u8 byte = value;
debug("%s: reg=%x, value=%x\n", __func__, reg, value);
return pmic_read(dev, reg, &byte, 1);
}
int pmic_clrsetbits(struct udevice *dev, uint reg, uint clr, uint set)
{
u8 byte;
int ret;
ret = pmic_reg_read(dev, reg);
if (ret < 0)
return ret;
byte = (ret & ~clr) | set;
return pmic_reg_write(dev, reg, byte);
}
UCLASS_DRIVER(pmic) = {
.id = UCLASS_PMIC,
.name = "pmic",

View file

@ -264,6 +264,40 @@ int pmic_reg_count(struct udevice *dev);
*/
int pmic_read(struct udevice *dev, uint reg, uint8_t *buffer, int len);
int pmic_write(struct udevice *dev, uint reg, const uint8_t *buffer, int len);
/**
* pmic_reg_read() - read a PMIC register value
*
* @dev: PMIC device to read
* @reg: Register to read
* @return value read on success or negative value of errno.
*/
int pmic_reg_read(struct udevice *dev, uint reg);
/**
* pmic_reg_write() - write a PMIC register value
*
* @dev: PMIC device to write
* @reg: Register to write
* @value: Value to write
* @return 0 on success or negative value of errno.
*/
int pmic_reg_write(struct udevice *dev, uint reg, uint value);
/**
* pmic_clrsetbits() - clear and set bits in a PMIC register
*
* This reads a register, optionally clears some bits, optionally sets some
* bits, then writes the register.
*
* @dev: PMIC device to update
* @reg: Register to update
* @clr: Bit mask to clear (set those bits that you want cleared)
* @set: Bit mask to set (set those bits that you want set)
* @return 0 on success or negative value of errno.
*/
int pmic_clrsetbits(struct udevice *dev, uint reg, uint clr, uint set);
#endif /* CONFIG_DM_PMIC */
#ifdef CONFIG_POWER