Some checks failed
Build Kernel / Build all affected Kernels (push) Has been cancelled
Build all core packages / Build all core packages for selected target (push) Has been cancelled
Build and Push prebuilt tools container / Build and Push all prebuilt containers (push) Has been cancelled
Build Toolchains / Build Toolchains for each target (push) Has been cancelled
Build host tools / Build host tools for linux and macos based systems (push) Has been cancelled
Coverity scan build / Coverity x86/64 build (push) Has been cancelled
205 lines
5.8 KiB
Diff
205 lines
5.8 KiB
Diff
From b12213d474966fbf47e7afa36a6655b5b241cf36 Mon Sep 17 00:00:00 2001
|
|
From: "Kevin.xie" <kevin.xie@starfivetech.com>
|
|
Date: Fri, 9 Jun 2023 14:57:13 +0800
|
|
Subject: [PATCH 071/116] regulator: starfive-jh7110: Add regulator support for
|
|
JH7110 A type EVB.
|
|
|
|
Add 7 regulators base on regulator framework for
|
|
JH7110 evb HW design.
|
|
|
|
Signed-off-by: Kevin.xie <kevin.xie@starfivetech.com>
|
|
---
|
|
drivers/regulator/Kconfig | 10 ++
|
|
drivers/regulator/Makefile | 1 +
|
|
drivers/regulator/starfive-jh7110-regulator.c | 126 ++++++++++++++++++
|
|
include/linux/regulator/jh7110.h | 24 ++++
|
|
4 files changed, 161 insertions(+)
|
|
create mode 100644 drivers/regulator/starfive-jh7110-regulator.c
|
|
create mode 100644 include/linux/regulator/jh7110.h
|
|
|
|
--- a/drivers/regulator/Kconfig
|
|
+++ b/drivers/regulator/Kconfig
|
|
@@ -1335,6 +1335,16 @@ config REGULATOR_SM5703
|
|
This driver provides support for voltage regulators of SM5703
|
|
multi-function device.
|
|
|
|
+config REGULATOR_STARFIVE_JH7110
|
|
+ tristate "Starfive JH7110 PMIC"
|
|
+ depends on I2C
|
|
+ select REGMAP_I2C
|
|
+ help
|
|
+ Say y here to select this option to enable the power regulator of
|
|
+ Starfive JH7110 PMIC.
|
|
+ This driver supports the control of different power rails of device
|
|
+ through regulator interface.
|
|
+
|
|
config REGULATOR_STM32_BOOSTER
|
|
tristate "STMicroelectronics STM32 BOOSTER"
|
|
depends on ARCH_STM32 || COMPILE_TEST
|
|
--- a/drivers/regulator/Makefile
|
|
+++ b/drivers/regulator/Makefile
|
|
@@ -156,6 +156,7 @@ obj-$(CONFIG_REGULATOR_SC2731) += sc2731
|
|
obj-$(CONFIG_REGULATOR_SKY81452) += sky81452-regulator.o
|
|
obj-$(CONFIG_REGULATOR_SLG51000) += slg51000-regulator.o
|
|
obj-$(CONFIG_REGULATOR_SM5703) += sm5703-regulator.o
|
|
+obj-$(CONFIG_REGULATOR_STARFIVE_JH7110) += starfive-jh7110-regulator.o
|
|
obj-$(CONFIG_REGULATOR_STM32_BOOSTER) += stm32-booster.o
|
|
obj-$(CONFIG_REGULATOR_STM32_VREFBUF) += stm32-vrefbuf.o
|
|
obj-$(CONFIG_REGULATOR_STM32_PWR) += stm32-pwr.o
|
|
--- /dev/null
|
|
+++ b/drivers/regulator/starfive-jh7110-regulator.c
|
|
@@ -0,0 +1,126 @@
|
|
+// SPDX-License-Identifier: GPL-2.0
|
|
+/*
|
|
+ * Copyright (c) 2022 Starfive Technology Co., Ltd.
|
|
+ * Author: Mason Huo <mason.huo@starfivetech.com>
|
|
+ */
|
|
+
|
|
+#include <linux/err.h>
|
|
+#include <linux/gpio.h>
|
|
+#include <linux/i2c.h>
|
|
+#include <linux/init.h>
|
|
+#include <linux/interrupt.h>
|
|
+#include <linux/module.h>
|
|
+#include <linux/regmap.h>
|
|
+#include <linux/regulator/driver.h>
|
|
+#include <linux/regulator/machine.h>
|
|
+#include <linux/regulator/of_regulator.h>
|
|
+#include <linux/regulator/jh7110.h>
|
|
+#include <linux/slab.h>
|
|
+
|
|
+#define JH7110_PM_POWER_SW_0 0x80
|
|
+#define JH7110_PM_POWER_SW_1 0x81
|
|
+#define ENABLE_MASK(id) BIT(id)
|
|
+
|
|
+
|
|
+static const struct regmap_config jh7110_regmap_config = {
|
|
+ .reg_bits = 8,
|
|
+ .val_bits = 8,
|
|
+ .max_register = JH7110_PM_POWER_SW_1,
|
|
+ .cache_type = REGCACHE_FLAT,
|
|
+};
|
|
+
|
|
+static const struct regulator_ops jh7110_ldo_ops = {
|
|
+ .enable = regulator_enable_regmap,
|
|
+ .disable = regulator_disable_regmap,
|
|
+ .is_enabled = regulator_is_enabled_regmap,
|
|
+};
|
|
+
|
|
+#define JH7110_LDO(_id, _name, en_reg, en_mask) \
|
|
+{\
|
|
+ .name = (_name),\
|
|
+ .ops = &jh7110_ldo_ops,\
|
|
+ .of_match = of_match_ptr(_name),\
|
|
+ .regulators_node = of_match_ptr("regulators"),\
|
|
+ .type = REGULATOR_VOLTAGE,\
|
|
+ .id = JH7110_ID_##_id,\
|
|
+ .owner = THIS_MODULE,\
|
|
+ .enable_reg = JH7110_PM_POWER_SW_##en_reg,\
|
|
+ .enable_mask = ENABLE_MASK(en_mask),\
|
|
+}
|
|
+
|
|
+static const struct regulator_desc jh7110_regulators[] = {
|
|
+ JH7110_LDO(LDO_REG1, "hdmi_1p8", 0, 0),
|
|
+ JH7110_LDO(LDO_REG2, "mipitx_1p8", 0, 1),
|
|
+ JH7110_LDO(LDO_REG3, "mipirx_1p8", 0, 2),
|
|
+ JH7110_LDO(LDO_REG4, "hdmi_0p9", 0, 3),
|
|
+ JH7110_LDO(LDO_REG5, "mipitx_0p9", 0, 4),
|
|
+ JH7110_LDO(LDO_REG6, "mipirx_0p9", 0, 5),
|
|
+ JH7110_LDO(LDO_REG7, "sdio_vdd", 1, 0),
|
|
+};
|
|
+
|
|
+static int jh7110_i2c_probe(struct i2c_client *i2c)
|
|
+{
|
|
+ struct regulator_config config = { };
|
|
+ struct regulator_dev *rdev;
|
|
+ struct regulator_init_data *init_data;
|
|
+ struct regmap *regmap;
|
|
+ int i, ret;
|
|
+
|
|
+ regmap = devm_regmap_init_i2c(i2c, &jh7110_regmap_config);
|
|
+ if (IS_ERR(regmap)) {
|
|
+ ret = PTR_ERR(regmap);
|
|
+ dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
|
|
+ ret);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ init_data = of_get_regulator_init_data(&i2c->dev, i2c->dev.of_node, NULL);
|
|
+ if (!init_data)
|
|
+ return -ENOMEM;
|
|
+ config.init_data = init_data;
|
|
+
|
|
+ for (i = 0; i < JH7110_MAX_REGULATORS; i++) {
|
|
+ config.dev = &i2c->dev;
|
|
+ config.regmap = regmap;
|
|
+
|
|
+ rdev = devm_regulator_register(&i2c->dev,
|
|
+ &jh7110_regulators[i], &config);
|
|
+ if (IS_ERR(rdev)) {
|
|
+ dev_err(&i2c->dev,
|
|
+ "Failed to register JH7110 regulator\n");
|
|
+ return PTR_ERR(rdev);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static const struct i2c_device_id jh7110_i2c_id[] = {
|
|
+ {"jh7110_evb_reg", 0},
|
|
+ {},
|
|
+};
|
|
+MODULE_DEVICE_TABLE(i2c, jh7110_i2c_id);
|
|
+
|
|
+#ifdef CONFIG_OF
|
|
+static const struct of_device_id jh7110_dt_ids[] = {
|
|
+ { .compatible = "starfive,jh7110-evb-regulator",
|
|
+ .data = &jh7110_i2c_id[0] },
|
|
+ {},
|
|
+};
|
|
+MODULE_DEVICE_TABLE(of, jh7110_dt_ids);
|
|
+#endif
|
|
+
|
|
+static struct i2c_driver jh7110_regulator_driver = {
|
|
+ .driver = {
|
|
+ .name = "jh7110-evb-regulator",
|
|
+ .of_match_table = of_match_ptr(jh7110_dt_ids),
|
|
+ },
|
|
+ .probe = jh7110_i2c_probe,
|
|
+ .id_table = jh7110_i2c_id,
|
|
+};
|
|
+
|
|
+module_i2c_driver(jh7110_regulator_driver);
|
|
+
|
|
+MODULE_AUTHOR("Mason Huo <mason.huo@starfivetech.com>");
|
|
+MODULE_DESCRIPTION("Regulator device driver for Starfive JH7110");
|
|
+MODULE_LICENSE("GPL v2");
|
|
--- /dev/null
|
|
+++ b/include/linux/regulator/jh7110.h
|
|
@@ -0,0 +1,24 @@
|
|
+/* SPDX-License-Identifier: GPL-2.0-only */
|
|
+/*
|
|
+ * Copyright (c) 2022 Starfive Technology Co., Ltd.
|
|
+ * Author: Mason Huo <mason.huo@starfivetech.com>
|
|
+ */
|
|
+
|
|
+#ifndef __LINUX_REGULATOR_JH7110_H
|
|
+#define __LINUX_REGULATOR_JH7110_H
|
|
+
|
|
+#define JH7110_MAX_REGULATORS 7
|
|
+
|
|
+
|
|
+enum jh7110_reg_id {
|
|
+ JH7110_ID_LDO_REG1 = 0,
|
|
+ JH7110_ID_LDO_REG2,
|
|
+ JH7110_ID_LDO_REG3,
|
|
+ JH7110_ID_LDO_REG4,
|
|
+ JH7110_ID_LDO_REG5,
|
|
+ JH7110_ID_LDO_REG6,
|
|
+ JH7110_ID_LDO_REG7,
|
|
+};
|
|
+
|
|
+
|
|
+#endif /* __LINUX_REGULATOR_JH7110_H */
|