From: Raymond Mao <[email protected]>

Add Spacemit P1 SoC support in SPL. And set the default voltage
for BUCKs and LDOs.

Signed-off-by: Raymond Mao <[email protected]>
---
 arch/riscv/dts/k1-spl.dts | 128 ++++++++++++++++++++++++++++++++++----
 board/spacemit/k1/spl.c   |  83 ++++++++++++++++++++----
 configs/k1_defconfig      |   9 +++
 3 files changed, 198 insertions(+), 22 deletions(-)

diff --git a/arch/riscv/dts/k1-spl.dts b/arch/riscv/dts/k1-spl.dts
index f8b280fa96f..6dedca20f51 100644
--- a/arch/riscv/dts/k1-spl.dts
+++ b/arch/riscv/dts/k1-spl.dts
@@ -110,17 +110,6 @@
                };
        };
 
-       i2c@d401d800 {          /* i2c8 */
-               status = "okay";
-               bootph-pre-ram;
-               pmic@41 {
-                       compatible = "pmic";
-                       reg = <0x41>;
-                       status = "okay";
-                       bootph-pre-ram;
-               };
-       };
-
        reset-controller@d4050000 {
                status = "okay";
                bootph-pre-ram;
@@ -131,3 +120,120 @@
        status = "okay";
        bootph-pre-ram;
 };
+
+&i2c8 {
+       status = "okay";
+       bootph-pre-ram;
+       pmic@41 {
+               compatible = "spacemit,p1";
+               reg = <0x41>;
+               status = "okay";
+               bootph-pre-ram;
+
+               regulators {
+                       buck1 {
+                               regulator-name = "vdd_core";
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3450000>;
+                               regulator-ramp-delay = <5000>;
+                               regulator-always-on;
+                               bootph-pre-ram;
+                       };
+
+                       buck2 {
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3450000>;
+                               regulator-ramp-delay = <5000>;
+                               regulator-always-on;
+                       };
+
+                       buck3_1v8: buck3 {
+                               regulator-name = "vdd_1v8";
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-ramp-delay = <5000>;
+                               regulator-always-on;
+                               bootph-pre-ram;
+                       };
+
+                       buck4 {
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-ramp-delay = <5000>;
+                               regulator-always-on;
+                       };
+
+                       buck5 {
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3450000>;
+                               regulator-ramp-delay = <5000>;
+                               regulator-always-on;
+                       };
+
+                       buck6 {
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3450000>;
+                               regulator-ramp-delay = <5000>;
+                               regulator-always-on;
+                       };
+
+                       aldo1 {
+                               regulator-name = "vdd_1v8_mmc";
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3400000>;
+                               regulator-boot-on;
+                               bootph-pre-ram;
+                       };
+
+                       aldo2 {
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3400000>;
+                       };
+
+                       aldo3 {
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3400000>;
+                       };
+
+                       aldo4 {
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3400000>;
+                       };
+
+                       dldo1 {
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3400000>;
+                       };
+
+                       dldo2 {
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3400000>;
+                       };
+
+                       dldo3 {
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3400000>;
+                       };
+
+                       dldo4 {
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3400000>;
+                       };
+
+                       dldo5 {
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3400000>;
+                       };
+
+                       dldo6 {
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3400000>;
+                       };
+
+                       dldo7 {
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <3400000>;
+                       };
+               };
+       };
+};
diff --git a/board/spacemit/k1/spl.c b/board/spacemit/k1/spl.c
index 54bad9000fe..c08d168fd52 100644
--- a/board/spacemit/k1/spl.c
+++ b/board/spacemit/k1/spl.c
@@ -8,6 +8,7 @@
 #include <clk-uclass.h>
 #include <cpu_func.h>
 #include <configs/k1.h>
+#include <cpu_func.h>
 #include <dm/device.h>
 #include <dm/uclass.h>
 #include <dt-bindings/pinctrl/k1-pinctrl.h>
@@ -15,8 +16,10 @@
 #include <i2c.h>
 #include <linux/delay.h>
 #include <log.h>
+#include <power/regulator.h>
 #include <spl.h>
 #include <tlv_eeprom.h>
+#include "tlv_codes.h"
 
 #define I2C_PIN_CONFIG(x)       ((x) | EDGE_NONE | PULL_UP | PAD_1V8_DS2)
 #define I2C_BUF_SIZE           64
@@ -117,6 +120,73 @@ void serial_early_init(void)
                panic("Serial uclass init failed: %d\n", ret);
 }
 
+static void set_vdd_core(void)
+{
+       struct udevice *dev;
+       int ret;
+
+       ret = regulator_get_by_platname("vdd_core", &dev);
+       if (ret)
+               panic("Fail to detect vdd_core (%d)\n", ret);
+       ret = regulator_set_enable(dev, true);
+       if (ret)
+               log_warning("Fail to enable vdd_core (%d)\n", ret);
+       ret = regulator_get_value(dev);
+       if (ret < 0)
+               log_warning("Fail to read vdd_core (%d)\n", ret);
+       log_info("vdd_core, value:%d\n", ret);
+}
+
+static void set_vdd_1v8(void)
+{
+       struct udevice *dev;
+       int ret;
+
+       ret = regulator_get_by_platname("vdd_1v8", &dev);
+       if (ret)
+               panic("Fail to detect vdd_1v8 (%d)\n", ret);
+       ret = regulator_set_value(dev, 1800000);
+       if (ret)
+               log_warning("Fail to set vdd_1v8 as 1800000 (%d)\n", ret);
+       ret = regulator_set_enable(dev, true);
+       if (ret)
+               log_warning("Fail to enable vdd_1v8 (%d)\n", ret);
+       ret = regulator_get_value(dev);
+       if (ret < 0)
+               log_warning("Fail to read vdd_1v8 (%d)\n", ret);
+       log_info("vdd_1v8, value:%d\n", ret);
+}
+
+static void set_vdd_mmc(void)
+{
+       struct udevice *dev;
+       int ret;
+
+       ret = regulator_get_by_platname("vdd_1v8_mmc", &dev);
+       if (ret)
+               panic("Fail to detect vdd_1v8_mmc (%d)\n", ret);
+       ret = regulator_set_enable(dev, true);
+       if (ret)
+               log_warning("Fail to enable vdd_1v8_mmc (%d)\n", ret);
+       ret = regulator_get_value(dev);
+       if (ret < 0)
+               log_warning("Fail to read vdd_1v8_mmc (%d)\n", ret);
+       log_info("vdd_1v8_mmc, value:%d\n", ret);
+}
+
+void pmic_init(void)
+{
+       struct udevice *pmic_dev;
+       int ret;
+
+       ret = uclass_get_device(UCLASS_PMIC, 0, &pmic_dev);
+       if (ret)
+               panic("Fail to detect PMIC (%d)\n", ret);
+       set_vdd_core();
+       set_vdd_1v8();
+       set_vdd_mmc();
+}
+
 /* Load DDR training firmware */
 int init_ddr_firmware(void)
 {
@@ -167,6 +237,8 @@ void board_init_f(ulong dummy)
                log_info("Fail to detect board:%d\n", ret);
        else
                log_info("Get board name:%s\n", (char *)i2c_buf);
+       pmic_init();
+
        ddr_early_init();
 }
 
@@ -175,17 +247,6 @@ u32 spl_boot_device(void)
        return BOOT_DEVICE_NOR;
 }
 
-void pmic_init(void)
-{
-       struct udevice *pmic_dev = NULL;
-       int ret;
-
-       ret = uclass_get_device(UCLASS_PMIC, 0, &pmic_dev);
-       if (ret)
-               panic("Fail to detect PMIC:%d\n", ret);
-}
-
 void spl_board_init(void)
 {
-       pmic_init();
 }
diff --git a/configs/k1_defconfig b/configs/k1_defconfig
index 0d5c3932797..49a2dbca4f0 100644
--- a/configs/k1_defconfig
+++ b/configs/k1_defconfig
@@ -66,3 +66,12 @@ CONFIG_SPL_I2C_EEPROM=y
 CONFIG_CMD_TLV_EEPROM=y
 CONFIG_SPL_CMD_TLV_EEPROM=y
 CONFIG_LOG=y
+CONFIG_SPL_POWER=y
+CONFIG_DM_PMIC=y
+CONFIG_SPL_DM_PMIC=y
+CONFIG_PMIC_SPACEMIT_P1=y
+CONFIG_SPL_PMIC_SPACEMIT_P1=y
+CONFIG_DM_REGULATOR=y
+CONFIG_SPL_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_SPACEMIT_P1=y
+CONFIG_SPL_DM_REGULATOR_SPACEMIT_P1=y
-- 
2.25.1

Reply via email to