Alexandru Gagniuc (mr.nuke.me(a)gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4637
-gerrit
commit 4688df68f90204a6d80ea8abce94db0d99e85ed0
Author: Alexandru Gagniuc <mr.nuke.me(a)gmail.com>
Date: Thu Jan 9 20:07:10 2014 -0600
xpowers/axp209: Allow voltages to be sepecified in devicetree.cb
This allows system voltages to be specified uniformly, rather than
hardcoding them for each board. This will be used by cubieboard in an
upcoming patch.
Change-Id: I9dc2d3281d076c359c3fad13688649f7d36c0001
Signed-off-by: Alexandru Gagniuc <mr.nuke.me(a)gmail.com>
---
src/drivers/xpowers/axp209/axp209.c | 13 +++++++++++++
src/drivers/xpowers/axp209/chip.h | 21 +++++++++++++++++++++
2 files changed, 34 insertions(+)
diff --git a/src/drivers/xpowers/axp209/axp209.c b/src/drivers/xpowers/axp209/axp209.c
index 68ab8a5..9f77cf6 100644
--- a/src/drivers/xpowers/axp209/axp209.c
+++ b/src/drivers/xpowers/axp209/axp209.c
@@ -9,7 +9,9 @@
*/
#include "axp209.h"
+#include "chip.h"
+#include <device/device.h>
#include <device/i2c.h>
/* Hide these definitions from the rest of the source, so keep them here */
@@ -228,3 +230,14 @@ enum cb_err axp209_set_ldo4_voltage(u8 bus, u16 millivolts)
return CB_SUCCESS;
}
+
+/*
+ * Usually, the AXP209 is enabled and configured in romstage, so there is no
+ * need for a full ramstage driver. Hence .enable_dev is NULL.
+ */
+#ifndef __PRE_RAM__
+struct chip_operations drivers_xpowers_axp209_config = {
+ CHIP_NAME("X-Powers AXP 209 Power Management Unit")
+ .enable_dev = NULL,
+};
+#endif /* __PRE_RAM__ */
diff --git a/src/drivers/xpowers/axp209/chip.h b/src/drivers/xpowers/axp209/chip.h
new file mode 100644
index 0000000..c19253d
--- /dev/null
+++ b/src/drivers/xpowers/axp209/chip.h
@@ -0,0 +1,21 @@
+/*
+ * X-Powers AXP 209 devicetree.cb interface
+ *
+ * Copyright (C) 2013 Alexandru Gagniuc <mr.nuke.me(a)gmail.com>
+ * Subject to the GNU GPL v2, or (at your option) any later version.
+ */
+
+#ifndef AXP209_CHIP_H
+#define AXP209_CHIP_H
+
+#include <types.h>
+
+struct drivers_xpowers_axp209_config {
+ u16 dcdc2_voltage_mv; /**< DCDC2 converter voltage output */
+ u16 dcdc3_voltage_mv; /**< DCDC3 converter voltage output */
+ u16 ldo2_voltage_mv; /**< LDO2 regulator voltage output */
+ u16 ldo3_voltage_mv; /**< LDO3 regulator voltage output */
+ u16 ldo4_voltage_mv; /**< LDO4 regulator voltage output */
+};
+
+#endif /* AXP209_CHIP_H */
Alexandru Gagniuc (mr.nuke.me(a)gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4637
-gerrit
commit 7a61556729ad014554e45fcc5fe7adf855225ebc
Author: Alexandru Gagniuc <mr.nuke.me(a)gmail.com>
Date: Thu Jan 9 20:07:10 2014 -0600
xpowers/axp209: Allow voltages to be sepecified in devicetree.cb
This allows system voltages to be specified uniformly, rather than
hardcoding them for each board. This will be used by cubieboard in an
upcoming patch.
Change-Id: I9dc2d3281d076c359c3fad13688649f7d36c0001
Signed-off-by: Alexandru Gagniuc <mr.nuke.me(a)gmail.com>
---
src/drivers/xpowers/axp209/axp209.c | 13 +++++++++++++
src/drivers/xpowers/axp209/chip.h | 21 +++++++++++++++++++++
2 files changed, 34 insertions(+)
diff --git a/src/drivers/xpowers/axp209/axp209.c b/src/drivers/xpowers/axp209/axp209.c
index 68ab8a5..647f10e 100644
--- a/src/drivers/xpowers/axp209/axp209.c
+++ b/src/drivers/xpowers/axp209/axp209.c
@@ -9,7 +9,9 @@
*/
#include "axp209.h"
+#include "chip.h"
+#include <device/device.h>
#include <device/i2c.h>
/* Hide these definitions from the rest of the source, so keep them here */
@@ -228,3 +230,14 @@ enum cb_err axp209_set_ldo4_voltage(u8 bus, u16 millivolts)
return CB_SUCCESS;
}
+
+/*
+ * Usually, the AXP209 is enabled and configured in romstage, so there is no
+ * need for a full ramstage driver. Hence .enable_dev is NULL.
+ */
+#ifndef __PRE_RAM__
+struct chip_operations drivers_xpowers_axp209_config = {
+ CHIP_NAME("X-Powers AXP 209 Power Management Unit")
+ .enable_dev = NULL,
+};
+#endif /* __PRE_RAM__ */
diff --git a/src/drivers/xpowers/axp209/chip.h b/src/drivers/xpowers/axp209/chip.h
new file mode 100644
index 0000000..a9023d8
--- /dev/null
+++ b/src/drivers/xpowers/axp209/chip.h
@@ -0,0 +1,21 @@
+/*
+ * Definitions for X-Powers AXP 209 Power Management Unit
+ *
+ * Copyright (C) 2013 Alexandru Gagniuc <mr.nuke.me(a)gmail.com>
+ * Subject to the GNU GPL v2, or (at your option) any later version.
+ */
+
+#ifndef AXP209_CHIP_H
+#define AXP209_CHIP_H
+
+#include <types.h>
+
+struct drivers_xpowers_axp209_config {
+ u16 dcdc2_voltage_mv; /**< DCDC2 converter voltage output */
+ u16 dcdc3_voltage_mv; /**< DCDC3 converter voltage output */
+ u16 ldo2_voltage_mv; /**< LDO2 regulator voltage output */
+ u16 ldo3_voltage_mv; /**< LDO3 regulator voltage output */
+ u16 ldo4_voltage_mv; /**< LDO4 regulator voltage output */
+};
+
+#endif /* AXP209_CHIP_H */
Alexandru Gagniuc (mr.nuke.me(a)gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4591
-gerrit
commit 4297b8239f46b3654b7a9f3cba28e1b778f025b4
Author: Alexandru Gagniuc <mr.nuke.me(a)gmail.com>
Date: Mon Dec 30 01:21:55 2013 -0500
drivers: Add support for X-Powers AXP209 PMU
Change-Id: I1de0e656a38527b172af1d0b5bcd97acbfc03bf0
Signed-off-by: Alexandru Gagniuc <mr.nuke.me(a)gmail.com>
---
src/drivers/Kconfig | 1 +
src/drivers/Makefile.inc | 1 +
src/drivers/xpowers/Kconfig | 1 +
src/drivers/xpowers/Makefile.inc | 1 +
src/drivers/xpowers/axp209/Kconfig | 15 +++
src/drivers/xpowers/axp209/Makefile.inc | 3 +
src/drivers/xpowers/axp209/axp209.c | 230 ++++++++++++++++++++++++++++++++
src/drivers/xpowers/axp209/axp209.h | 17 +++
8 files changed, 269 insertions(+)
diff --git a/src/drivers/Kconfig b/src/drivers/Kconfig
index b187419..8da7b05 100644
--- a/src/drivers/Kconfig
+++ b/src/drivers/Kconfig
@@ -37,3 +37,4 @@ source src/drivers/sil/Kconfig
source src/drivers/spi/Kconfig
source src/drivers/ti/Kconfig
source src/drivers/trident/Kconfig
+source src/drivers/xpowers/Kconfig
diff --git a/src/drivers/Makefile.inc b/src/drivers/Makefile.inc
index 7b1e4ca..34ae62e 100644
--- a/src/drivers/Makefile.inc
+++ b/src/drivers/Makefile.inc
@@ -34,4 +34,5 @@ subdirs-y += spi
subdirs-y += ti
subdirs-y += ipmi
subdirs-y += elog
+subdirs-y += xpowers
subdirs-$(CONFIG_ARCH_X86) += pc80
diff --git a/src/drivers/xpowers/Kconfig b/src/drivers/xpowers/Kconfig
new file mode 100644
index 0000000..3ac2748
--- /dev/null
+++ b/src/drivers/xpowers/Kconfig
@@ -0,0 +1 @@
+source src/drivers/xpowers/axp209/Kconfig
diff --git a/src/drivers/xpowers/Makefile.inc b/src/drivers/xpowers/Makefile.inc
new file mode 100644
index 0000000..ef6dffc
--- /dev/null
+++ b/src/drivers/xpowers/Makefile.inc
@@ -0,0 +1 @@
+subdirs-$(CONFIG_DRIVER_XPOWERS_AXP209) += axp209
diff --git a/src/drivers/xpowers/axp209/Kconfig b/src/drivers/xpowers/axp209/Kconfig
new file mode 100644
index 0000000..684873c
--- /dev/null
+++ b/src/drivers/xpowers/axp209/Kconfig
@@ -0,0 +1,15 @@
+config DRIVER_XPOWERS_AXP209
+ bool
+ default n
+ help
+ X-Powers AXP902 Power Management Unit
+
+if DRIVER_XPOWERS_AXP209
+
+config DRIVER_XPOWERS_AXP209_BOOTBLOCK
+ bool
+ default n
+ help
+ Make AXP209 functionality available in he bootblock.
+
+endif # DRIVER_XPOWERS_AXP209
diff --git a/src/drivers/xpowers/axp209/Makefile.inc b/src/drivers/xpowers/axp209/Makefile.inc
new file mode 100644
index 0000000..5ac691e
--- /dev/null
+++ b/src/drivers/xpowers/axp209/Makefile.inc
@@ -0,0 +1,3 @@
+bootblock-$(CONFIG_DRIVER_XPOWERS_AXP209_BOOTBLOCK) += axp209.c
+romstage-$(CONFIG_DRIVER_XPOWERS_AXP209) += axp209.c
+ramstage-$(CONFIG_DRIVER_XPOWERS_AXP209) += axp209.c
diff --git a/src/drivers/xpowers/axp209/axp209.c b/src/drivers/xpowers/axp209/axp209.c
new file mode 100644
index 0000000..68ab8a5
--- /dev/null
+++ b/src/drivers/xpowers/axp209/axp209.c
@@ -0,0 +1,230 @@
+/*
+ * Driver for X-Powers AXP 209 Power Management Unit
+ *
+ * Despite axp209_read/write only working on a byte at a time, there is no such
+ * limitation in the AXP209.
+ *
+ * Copyright (C) 2013 Alexandru Gagniuc <mr.nuke.me(a)gmail.com>
+ * Subject to the GNU GPL v2, or (at your option) any later version.
+ */
+
+#include "axp209.h"
+
+#include <device/i2c.h>
+
+/* Hide these definitions from the rest of the source, so keep them here */
+enum registers {
+ REG_POWER_STATUS = 0x00,
+ REG_POWER_MODE = 0x01,
+ REG_OTG_VBUS = 0x02,
+ REG_CHIP_ID = 0x03,
+ REG_CHIP_PWROUT_CTL = 0x12,
+ REG_DCDC2_VOLTAGE = 0x23,
+ REG_DCDC2_LDO3_CTL = 0x25,
+ REG_DCDC3_VOLTAGE = 0x27,
+ REG_LDO24_VOLTAGE = 0x28,
+ REG_LDO3_VOLTAGE = 0x29,
+ REG_VBUS_IPSOUT = 0x30,
+ REG_PWROFF_VOLTAGE = 0x31,
+ REG_SHTDWN_SETTING = 0x32,
+};
+
+/* REG_LDO24_VOLTAGE definitions */
+#define REG_LDO24_VOLTAGE_LDO2_MASK (0xf << 4)
+#define REG_LDO24_VOLTAGE_LDO2_VAL(x) ((x << 4) & REG_LDO24_VOLTAGE_LDO2_MASK)
+#define REG_LDO24_VOLTAGE_LDO4_MASK (0xf << 0)
+#define REG_LDO24_VOLTAGE_LDO4_VAL(x) ((x << 0) & REG_LDO24_VOLTAGE_LDO4_MASK)
+
+/*
+ * Read and write accessors. We only work on one register at a time, but there
+ * is no limitation on the AXP209 as to how many registers we may read or write
+ * in one transaction.
+ * These return the number of bytes read/written, or an error code. In this
+ * case, they return 1 on success, or an error code otherwise.
+ */
+static int axp209_read(u8 bus, u8 reg, u8 *val)
+{
+ return i2c_read(bus, AXP209_I2C_ADDR, reg, 1, val, 1);
+}
+
+static int axp209_write(u8 bus, u8 reg, u8 val)
+{
+ return i2c_write(bus, AXP209_I2C_ADDR, reg, 1, &val, 1);
+}
+
+/**
+ * \brief Identify and initialize an AXP209 on the I²C bus
+ *
+ * @param[in] bus I²C bus to which the AXP209 is connected
+ * @return CB_SUCCES on if an AXP209 is found, or an error code otherwise.
+ */
+enum cb_err axp209_init(u8 bus)
+{
+ u8 id;
+
+ if (axp209_read(bus, REG_CHIP_ID, &id) != 1)
+ return CB_ERR;
+
+ /* From U-Boot code : Low 4 bits is chip version */
+ if ((id & 0x0f) != 0x1)
+ return CB_ERR;
+
+ return CB_SUCCESS;
+}
+
+/**
+ * \brief Configure the output voltage of DC-DC2 converter
+ *
+ * If the requested voltage is not available, the next lowest voltage will
+ * be applied.
+ * Valid values are between 700mV and 2275mV
+ *
+ * @param[in] millivolts voltage in mV units.
+ * @param[in] bus I²C bus to which the AXP209 is connected
+ * @return CB_SUCCES on success,
+ * CB_ERR_ARG if voltage is out of range, or an error code otherwise.
+ */
+enum cb_err axp209_set_dcdc2_voltage(u8 bus, u16 millivolts)
+{
+ u8 val;
+
+ if (millivolts < 700 || millivolts > 2275)
+ return CB_ERR_ARG;
+
+ val = (millivolts - 700) / 25;
+
+ if (axp209_write(bus, REG_DCDC2_VOLTAGE, val) != 1)
+ return CB_ERR;
+
+ return CB_SUCCESS;
+}
+
+/**
+ * \brief Configure the output voltage of DC-DC3 converter
+ *
+ * If the requested voltage is not available, the next lowest voltage will
+ * be applied.
+ * Valid values are between 700mV and 3500mV
+ *
+ * @param[in] millivolts voltage in mV units.
+ * @param[in] bus I²C bus to which the AXP209 is connected
+ * @return CB_SUCCES on success,
+ * CB_ERR_ARG if voltage is out of range, or an error code otherwise.
+ */
+enum cb_err axp209_set_dcdc3_voltage(u8 bus, u16 millivolts)
+{
+ u8 val;
+
+ if (millivolts < 700 || millivolts > 3500)
+ return CB_ERR_ARG;
+
+ val = (millivolts - 700) / 25;
+
+ if (axp209_write(bus, REG_DCDC3_VOLTAGE, val) != 1)
+ return CB_ERR;
+
+ return CB_SUCCESS;
+}
+
+/**
+ * \brief Configure the output voltage of LDO2 regulator
+ *
+ * If the requested voltage is not available, the next lowest voltage will
+ * be applied.
+ * Valid values are between 700mV and 3300mV
+ *
+ * @param[in] millivolts voltage in mV units.
+ * @param[in] bus I²C bus to which the AXP209 is connected
+ * @return CB_SUCCES on success,
+ * CB_ERR_ARG if voltage is out of range, or an error code otherwise.
+ */
+enum cb_err axp209_set_ldo2_voltage(u8 bus, u16 millivolts)
+{
+ u8 reg8, val;
+
+ if (millivolts < 1800 || millivolts > 3300)
+ return CB_ERR_ARG;
+
+ /* Try to read the register first, and stop here on error */
+ if (axp209_read(bus, REG_LDO24_VOLTAGE, ®8) != 1)
+ return CB_ERR;
+
+ val = (millivolts - 1800) / 100;
+ reg8 &= ~REG_LDO24_VOLTAGE_LDO2_MASK;
+ reg8 |= REG_LDO24_VOLTAGE_LDO2_VAL(val);
+
+ if (axp209_write(bus, REG_LDO24_VOLTAGE, reg8) != 1)
+ return CB_ERR;
+
+ return CB_SUCCESS;
+}
+
+/**
+ * \brief Configure the output voltage of LDO4 regulator
+ *
+ * If the requested voltage is not available, the next lowest voltage will
+ * be applied.
+ * Valid values are between 700mV and 3500mV. Datasheet lists maximum voltage at
+ * 2250mV, but hardware samples go as high as 3500mV.
+ *
+ * @param[in] millivolts voltage in mV units.
+ * @param[in] bus I²C bus to which the AXP209 is connected
+ * @return CB_SUCCES on success,
+ * CB_ERR_ARG if voltage is out of range, or an error code otherwise.
+ */
+enum cb_err axp209_set_ldo3_voltage(u8 bus, u16 millivolts)
+{
+ u8 val;
+
+ /* Datasheet lists 2250 max, but PMU will output up to 3500mV */
+ if (millivolts < 700 || millivolts > 3500)
+ return CB_ERR_ARG;
+
+ val = (millivolts - 700) / 25;
+
+ if (axp209_write(bus, REG_LDO3_VOLTAGE, val) != 1)
+ return CB_ERR;
+
+ return CB_SUCCESS;
+}
+
+/**
+ * \brief Configure the output voltage of DC-DC2 converter
+ *
+ * If the requested voltage is not available, the next lowest voltage will
+ * be applied.
+ * Valid values are between 1250V and 3300mV
+ *
+ * @param[in] millivolts voltage in mV units.
+ * @param[in] bus I²C bus to which the AXP209 is connected
+ * @return CB_SUCCES on success,
+ * CB_ERR_ARG if voltage is out of range, or an error code otherwise.
+ */
+enum cb_err axp209_set_ldo4_voltage(u8 bus, u16 millivolts)
+{
+ u8 reg8, val;
+
+ if (millivolts < 1250 || millivolts > 3300)
+ return CB_ERR_ARG;
+
+ /* Try to read the register first, and stop here on error */
+ if (axp209_read(bus, REG_LDO24_VOLTAGE, ®8) != 1)
+ return CB_ERR;
+
+ if (millivolts <= 2000)
+ val = (millivolts - 1200) / 100;
+ else if (millivolts <= 2700)
+ val = 9 + (millivolts - 2500) / 100;
+ else if (millivolts <= 2800)
+ val = 11;
+ else
+ val = 12 + (millivolts - 3000) / 100;
+
+ reg8 &= ~REG_LDO24_VOLTAGE_LDO4_MASK;
+ reg8 |= REG_LDO24_VOLTAGE_LDO4_VAL(val);
+
+ if (axp209_write(bus, REG_LDO24_VOLTAGE, reg8) != 1)
+ return CB_ERR;
+
+ return CB_SUCCESS;
+}
diff --git a/src/drivers/xpowers/axp209/axp209.h b/src/drivers/xpowers/axp209/axp209.h
new file mode 100644
index 0000000..1d369f5
--- /dev/null
+++ b/src/drivers/xpowers/axp209/axp209.h
@@ -0,0 +1,17 @@
+/*
+ * Definitions for X-Powers AXP 209 Power Management Unit
+ *
+ * Copyright (C) 2013 Alexandru Gagniuc <mr.nuke.me(a)gmail.com>
+ * Subject to the GNU GPL v2, or (at your option) any later version.
+ */
+
+#include <types.h>
+
+#define AXP209_I2C_ADDR (0x68 >> 1)
+
+enum cb_err axp209_init(u8 bus);
+enum cb_err axp209_set_dcdc2_voltage(u8 bus, u16 millivolts);
+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_ldo3_voltage(u8 bus, u16 millivolts);
+enum cb_err axp209_set_ldo4_voltage(u8 bus, u16 millivolts);
Vladimir Serbinenko (phcoder(a)gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4603
-gerrit
commit 9e8b491ce30235ba53217930bd901afa59ec9555
Author: Vladimir Serbinenko <phcoder(a)gmail.com>
Date: Thu Jan 2 10:10:14 2014 +0100
nehalem: Simplify acpi.c by using __SIMPLE_DEVICE__
Change-Id: I93351a2716cd58c2006400cecca1390b1704e94b
Signed-off-by: Vladimir Serbinenko <phcoder(a)gmail.com>
---
src/northbridge/intel/nehalem/acpi.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/src/northbridge/intel/nehalem/acpi.c b/src/northbridge/intel/nehalem/acpi.c
index df6cc1a..d7295e6 100644
--- a/src/northbridge/intel/nehalem/acpi.c
+++ b/src/northbridge/intel/nehalem/acpi.c
@@ -21,6 +21,8 @@
* MA 02110-1301 USA
*/
+#define __SIMPLE_DEVICE__
+
#include <types.h>
#include <string.h>
#include <console/console.h>
@@ -38,10 +40,7 @@ unsigned long acpi_fill_mcfg(unsigned long current)
u32 pciexbar_reg;
int max_buses;
- /* Quickpath bus is not in standard coreboot device tree,
- so read register directly. */
- pciexbar_reg = read32(DEFAULT_PCIEXBAR
- | (QUICKPATH_BUS << 20) | 0x1050);
+ pciexbar_reg = pci_read_config32 (PCI_DEV (QUICKPATH_BUS, 0, 1), 0x50);
// MMCFG not supported or not enabled.
if (!(pciexbar_reg & (1 << 0)))
@@ -173,7 +172,7 @@ int init_igd_opregion(igd_opregion_t * opregion)
/* TODO This needs to happen in S3 resume, too.
* Maybe it should move to the finalize handler
*/
- igd = dev_find_slot(0, PCI_DEVFN(0x2, 0));
+ igd = PCI_DEV (0, 0x2, 0);
pci_write_config32(igd, ASLS, (u32) opregion);
reg16 = pci_read_config16(igd, SWSCI);