summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mainboard/google/veyron_pinky/Makefile.inc1
-rw-r--r--src/mainboard/google/veyron_pinky/mainboard.c10
-rw-r--r--src/mainboard/google/veyron_pinky/pmic.c85
-rw-r--r--src/soc/rockchip/rk3288/Makefile.inc1
-rw-r--r--src/soc/rockchip/rk3288/rk808.c66
-rw-r--r--src/soc/rockchip/rk3288/rk808.h (renamed from src/mainboard/google/veyron_pinky/pmic.h)4
6 files changed, 79 insertions, 88 deletions
diff --git a/src/mainboard/google/veyron_pinky/Makefile.inc b/src/mainboard/google/veyron_pinky/Makefile.inc
index 3ae8763907..7b49a559b8 100644
--- a/src/mainboard/google/veyron_pinky/Makefile.inc
+++ b/src/mainboard/google/veyron_pinky/Makefile.inc
@@ -24,5 +24,4 @@ romstage-y += sdram_configs.c
ramstage-y += boardid.c
ramstage-y += chromeos.c
ramstage-y += mainboard.c
-ramstage-y += pmic.c
diff --git a/src/mainboard/google/veyron_pinky/mainboard.c b/src/mainboard/google/veyron_pinky/mainboard.c
index 349240faff..d3537bf093 100644
--- a/src/mainboard/google/veyron_pinky/mainboard.c
+++ b/src/mainboard/google/veyron_pinky/mainboard.c
@@ -29,8 +29,8 @@
#include <soc/rockchip/rk3288/soc.h>
#include <soc/rockchip/rk3288/pmu.h>
#include <soc/rockchip/rk3288/clock.h>
+#include <soc/rockchip/rk3288/rk808.h>
#include <soc/rockchip/rk3288/spi.h>
-#include "pmic.h"
#define DRAM_START (CONFIG_SYS_SDRAM_BASE >> 20)
#define DRAM_SIZE CONFIG_DRAM_SIZE_MB
@@ -110,6 +110,14 @@ static void configure_i2s(void)
rkclk_configure_i2s(12288000);
}
+static void pmic_init(unsigned int bus)
+{
+ rk808_configure_ldo(bus, 4, 1800); /* VCC18_LCD */
+ rk808_configure_ldo(bus, 5, 1800); /* VCC18_CODEC */
+ rk808_configure_ldo(bus, 6, 1000); /* VCC10_LCD */
+ rk808_configure_ldo(bus, 8, 3300); /* VCCIO_SD */
+}
+
static void mainboard_init(device_t dev)
{
setup_iomux();
diff --git a/src/mainboard/google/veyron_pinky/pmic.c b/src/mainboard/google/veyron_pinky/pmic.c
deleted file mode 100644
index 2e6f0abca1..0000000000
--- a/src/mainboard/google/veyron_pinky/pmic.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright 2014 Rockchip Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <console/console.h>
-#include <device/i2c.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include "pmic.h"
-
-#define RK808_ADDR 0x1b
-#define LOD1EN (1 << 0)
-#define LOD2EN (1 << 1)
-#define LOD3EN (1 << 2)
-#define LOD4EN (1 << 3)
-#define LOD5EN (1 << 4)
-#define LOD6EN (1 << 5)
-#define LOD7EN (1 << 6)
-#define LOD8EN (1 << 7)
-
-#define LDO_BASE18V 18
-#define LDO_BASE08V 8
-#define LDOVSEL(mV, base) (mV/100 - base)
-
-struct rk808_reg {
- u8 reg;
- u8 val;
-};
-
-enum {
- LDO_EN = 0x24,
- LDO1_ONSEL = 0x3B,
- LDO1_SLPSEL,
- LDO2_ONSEL,
- LDO2_SLPSEL,
- LDO3_ONSEL,
- LDO3_SLPSEL,
- LDO4_ONSEL,
- LDO4_SLPSEL,
- LDO5_ONSEL,
- LDO5_SLPSEL,
- LDO6_ONSEL,
- LDO6_SLPSEL,
- LDO7_ONSEL,
- LDO7_SLPSEL,
- LDO8_ONSEL,
- LDO8_SLPSEL,
-};
-
-static struct rk808_reg ldo_initlist[] = {
- {LDO4_ONSEL, LDOVSEL(1800, LDO_BASE18V)}, /*vcc18_lcd*/
- {LDO5_ONSEL, LDOVSEL(1800, LDO_BASE18V)}, /*vcc18_codec*/
- {LDO6_ONSEL, LDOVSEL(1000, LDO_BASE08V)}, /*vcc10_lcd*/
- {LDO8_ONSEL, LDOVSEL(3300, LDO_BASE18V)}, /*vccio_sd*/
-};
-
-void pmic_init(unsigned int bus)
-{
- uint8_t read_reg;
- int i;
- for (i = 0; i < ARRAY_SIZE(ldo_initlist); i++) {
- struct rk808_reg *reg = &ldo_initlist[i];
- i2c_writeb(bus, RK808_ADDR, reg->reg, reg->val);
- }
-
- /*enable ldo4,ldo5,ldo6,ldo8*/
- i2c_readb(bus, RK808_ADDR, LDO_EN, &read_reg);
- i2c_writeb(bus, RK808_ADDR, LDO_EN, read_reg | LOD8EN | LOD6EN
- | LOD5EN | LOD4EN);
-}
diff --git a/src/soc/rockchip/rk3288/Makefile.inc b/src/soc/rockchip/rk3288/Makefile.inc
index 8453757983..f9aa3775b8 100644
--- a/src/soc/rockchip/rk3288/Makefile.inc
+++ b/src/soc/rockchip/rk3288/Makefile.inc
@@ -50,6 +50,7 @@ ramstage-y += clock.c
ramstage-y += spi.c
ramstage-y += gpio.c
ramstage-y += media.c
+ramstage-y += rk808.c
ramstage-$(CONFIG_DRIVERS_UART) += uart.c
$(objcbfs)/bootblock.raw.elf: $(objcbfs)/bootblock.elf
diff --git a/src/soc/rockchip/rk3288/rk808.c b/src/soc/rockchip/rk3288/rk808.c
new file mode 100644
index 0000000000..0d629ca041
--- /dev/null
+++ b/src/soc/rockchip/rk3288/rk808.c
@@ -0,0 +1,66 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright 2014 Rockchip Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <assert.h>
+#include <console/console.h>
+#include <device/i2c.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include "rk808.h"
+
+#define RK808_ADDR 0x1b
+
+#define LDO_EN 0x24
+#define LDO_ONSEL(i) (0x39 + 2 * i)
+#define LDO_SLPSEL(i) (0x3a + 2 * i)
+
+static void rk808_clrsetbits(uint8_t bus, uint8_t reg, uint8_t clr, uint8_t set)
+{
+ uint8_t value;
+
+ if (i2c_readb(bus, RK808_ADDR, reg, &value) ||
+ i2c_writeb(bus, RK808_ADDR, reg, (value & ~clr) | set))
+ printk(BIOS_ERR, "ERROR: Cannot set Rk808[%#x]!\n", reg);
+}
+
+void rk808_configure_ldo(uint8_t bus, int ldo, int millivolts)
+{
+ uint8_t vsel;
+
+ switch (ldo) {
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ case 8:
+ vsel = millivolts / 100 - 18;
+ break;
+ case 3:
+ case 6:
+ case 7:
+ vsel = millivolts / 100 - 8;
+ break;
+ default:
+ die("Unknown LDO index!");
+ }
+ assert(vsel <= 0x10);
+
+ rk808_clrsetbits(bus, LDO_ONSEL(ldo), 0x1f, vsel);
+ rk808_clrsetbits(bus, LDO_EN, 0, 1 << (ldo - 1));
+}
diff --git a/src/mainboard/google/veyron_pinky/pmic.h b/src/soc/rockchip/rk3288/rk808.h
index dd6ed0b313..a6ba67c538 100644
--- a/src/mainboard/google/veyron_pinky/pmic.h
+++ b/src/soc/rockchip/rk3288/rk808.h
@@ -19,5 +19,7 @@
#ifndef __SOC_ROCKCHIP_RK3288_PMIC_H__
#define __SOC_ROCKCHIP_RK3288_PMIC_H__
-void pmic_init(unsigned int bus);
+
+void rk808_configure_ldo(uint8_t bus, int ldo, int millivolts);
+
#endif