xpowers/axp209: Add helper to set voltages from devicetree config
Change-Id: I3ffe225b78f88c3c2d3a15292c43009e69413afb Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com> Reviewed-on: http://review.coreboot.org/4638 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
parent
af4bd599ca
commit
abe9b81e83
|
@ -11,6 +11,7 @@
|
||||||
#include "axp209.h"
|
#include "axp209.h"
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
|
||||||
|
#include <console/console.h>
|
||||||
#include <device/device.h>
|
#include <device/device.h>
|
||||||
#include <device/i2c.h>
|
#include <device/i2c.h>
|
||||||
|
|
||||||
|
@ -231,6 +232,77 @@ enum cb_err axp209_set_ldo4_voltage(u8 bus, u16 millivolts)
|
||||||
return CB_SUCCESS;
|
return CB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct {
|
||||||
|
enum cb_err (*set_voltage) (u8 bus, u16 mv);
|
||||||
|
const char *name;
|
||||||
|
} vtable[] = { {
|
||||||
|
.set_voltage = axp209_set_dcdc2_voltage,
|
||||||
|
.name = "DCDC2",
|
||||||
|
}, {
|
||||||
|
.set_voltage = axp209_set_dcdc3_voltage,
|
||||||
|
.name = "DCDC3",
|
||||||
|
}, {
|
||||||
|
.set_voltage = axp209_set_ldo2_voltage,
|
||||||
|
.name = "LDO2",
|
||||||
|
}, {
|
||||||
|
.set_voltage = axp209_set_ldo3_voltage,
|
||||||
|
.name = "LDO3",
|
||||||
|
}, {
|
||||||
|
.set_voltage = axp209_set_ldo4_voltage,
|
||||||
|
.name = "LDO4",
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static enum cb_err set_rail(u8 bus, int idx, u16 mv)
|
||||||
|
{
|
||||||
|
enum cb_err err;
|
||||||
|
const char *name = vtable[idx].name;
|
||||||
|
|
||||||
|
/* If voltage isn't specified, don't touch the rail */
|
||||||
|
if (mv == 0) {
|
||||||
|
printk(BIOS_DEBUG, "[axp209] Skipping %s configuration\n",
|
||||||
|
name);
|
||||||
|
return CB_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((err = vtable[idx].set_voltage(bus, mv) != CB_SUCCESS)) {
|
||||||
|
printk(BIOS_ERR, "[axp209] Failed to set %s to %u mv\n",
|
||||||
|
name, mv);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CB_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Configure all voltage rails
|
||||||
|
*
|
||||||
|
* Configure all converters and regulators from devicetree config. If any of the
|
||||||
|
* voltages are not declared (i.e. are zero), the respective rail will not be
|
||||||
|
* reconfigured, and retain its powerup voltage.
|
||||||
|
*
|
||||||
|
* @param[in] cfg pointer to @ref drivers_xpowers_axp209_config structure
|
||||||
|
* @param[in] bus I²C bus to which the AXP209 is connected
|
||||||
|
* @return CB_SUCCES on success, or an error code otherwise.
|
||||||
|
*/
|
||||||
|
enum cb_err axp209_set_voltages(u8 bus, const struct
|
||||||
|
drivers_xpowers_axp209_config *cfg)
|
||||||
|
{
|
||||||
|
enum cb_err err;
|
||||||
|
|
||||||
|
/* Don't worry about what the error is. Console prints that */
|
||||||
|
err = set_rail(bus, 0, cfg->dcdc2_voltage_mv);
|
||||||
|
err |= set_rail(bus, 1, cfg->dcdc3_voltage_mv);
|
||||||
|
err |= set_rail(bus, 2, cfg->ldo2_voltage_mv);
|
||||||
|
err |= set_rail(bus, 3, cfg->ldo3_voltage_mv);
|
||||||
|
err |= set_rail(bus, 4, cfg->ldo4_voltage_mv);
|
||||||
|
|
||||||
|
if (err != CB_SUCCESS)
|
||||||
|
return CB_ERR;
|
||||||
|
|
||||||
|
return CB_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Usually, the AXP209 is enabled and configured in romstage, so there is no
|
* Usually, the AXP209 is enabled and configured in romstage, so there is no
|
||||||
* need for a full ramstage driver. Hence .enable_dev is NULL.
|
* need for a full ramstage driver. Hence .enable_dev is NULL.
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
|
#include "chip.h"
|
||||||
|
|
||||||
#define AXP209_I2C_ADDR (0x68 >> 1)
|
#define AXP209_I2C_ADDR (0x68 >> 1)
|
||||||
|
|
||||||
|
@ -15,3 +16,5 @@ enum cb_err axp209_set_dcdc3_voltage(u8 bus, u16 millivolts);
|
||||||
enum cb_err axp209_set_ldo2_voltage(u8 bus, u16 millivolts);
|
enum cb_err axp209_set_ldo2_voltage(u8 bus, u16 millivolts);
|
||||||
enum cb_err axp209_set_ldo3_voltage(u8 bus, u16 millivolts);
|
enum cb_err axp209_set_ldo3_voltage(u8 bus, u16 millivolts);
|
||||||
enum cb_err axp209_set_ldo4_voltage(u8 bus, u16 millivolts);
|
enum cb_err axp209_set_ldo4_voltage(u8 bus, u16 millivolts);
|
||||||
|
enum cb_err axp209_set_voltages(u8 bus, const struct
|
||||||
|
drivers_xpowers_axp209_config *cfg);
|
||||||
|
|
Loading…
Reference in New Issue