From nobody Mon Feb 9 13:58:04 2026 Received: from mail-m49226.qiye.163.com (mail-m49226.qiye.163.com [45.254.49.226]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DB2703570D4; Mon, 12 Jan 2026 12:44:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.254.49.226 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768221895; cv=none; b=pQ0/VedfWC2f9MxpBXae8KZ+dMYB0DSPMkXq4V0QNytl4oc23U39VCVk/pbkBoYi9cOtkXh2KJCYUvCCNBFJN/V7fD47Rrw4p52fuboGvpuicdUmn5vg+6dQC4FacNyga5WjBJbaw0DTvleGm6NsZilWBGPDrqbrmFdrVV/1Bqk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768221895; c=relaxed/simple; bh=ccbh5mCPM3y1Y4hw7vWjkO2v+K+Th1G/hj5+XTOPME0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=OKebzHj0NqGDlrm3I3jL39I9v4BiDkbkMooSUBR6Utkrz/hclfUNbHFrnLZAPPGF4NvWxHQZM7Jb69WVh4TJWNCUorvNwCawBEBW+BdOkS1fd8T4gr/FQOOJPiu2WHkVLBY/FFb/xPkE8JZ3kknQ8dStxO2k+o4EMN/UJJYXNqc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com; spf=pass smtp.mailfrom=rock-chips.com; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b=jMTY5XKh; arc=none smtp.client-ip=45.254.49.226 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rock-chips.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=rock-chips.com header.i=@rock-chips.com header.b="jMTY5XKh" Received: from localhost.localdomain (unknown [58.22.7.114]) by smtp.qiye.163.com (Hmail) with ESMTP id 305730496; Mon, 12 Jan 2026 20:44:42 +0800 (GMT+08:00) From: Joseph Chen To: Conor Dooley , Krzysztof Kozlowski , Lee Jones , Liam Girdwood , Mark Brown , Rob Herring Cc: Heiko Stuebner , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, Joseph Chen Subject: [PATCH v3 3/3] regulator: rk808: Add RK801 support Date: Mon, 12 Jan 2026 20:43:51 +0800 Message-Id: <20260112124351.17707-4-chenjh@rock-chips.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20260112124351.17707-1-chenjh@rock-chips.com> References: <20260112124351.17707-1-chenjh@rock-chips.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9bb23cb98409d2kunm3fddfe07a8e6 X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFDSUNOT01LS0k3V1ktWUFJV1kPCRoVCBIfWUFZGh1MT1ZITB4dT0xISUtMSU5WFRQJFh oXVRMBExYaEhckFA4PWVdZGBILWUFZTkNVSUlVTFVKSk9ZV1kWGg8SFR0UWUFZT0tIVUpLSU9PT0 hVSktLVUpCS0tZBg++ DKIM-Signature: a=rsa-sha256; b=jMTY5XKhEoxbSfVS9iqsQARjm3adU1cEjL54vPMR+iBh3c2XS4g13cnieR9DLgw/qW5crnjb6RIAhbawLoen0EwtEcxVx8AhKoiP7ZoNXcxAWyq586T6euZ/ZoXW3O07U4na5llJCFszkTu7QwBHdjcMHpws6UB+odCE0hYCOww=; c=relaxed/relaxed; s=default; d=rock-chips.com; v=1; bh=bDhga68n+rYDE/C594tUPTcK6XVKW0sjey2R7tsZcT0=; h=date:mime-version:subject:message-id:from; Content-Type: text/plain; charset="utf-8" Add support for rk801 to the existing rk808 regulator driver. It provides 4 BUCK, 2 LDO and 1 SWITCH. Signed-off-by: Joseph Chen Reviewed-by: Mark Brown --- drivers/regulator/rk808-regulator.c | 243 ++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-= regulator.c index 1e814247965..e66408f23bb 100644 --- a/drivers/regulator/rk808-regulator.c +++ b/drivers/regulator/rk808-regulator.c @@ -24,6 +24,9 @@ #include =20 /* Field definitions */ +#define RK801_BUCK_VSEL_MASK 0x7f +#define RK801_LDO_VSEL_MASK 0x3f + #define RK808_BUCK_VSEL_MASK 0x3f #define RK808_BUCK4_VSEL_MASK 0xf #define RK808_LDO_VSEL_MASK 0x1f @@ -158,6 +161,11 @@ RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \ _vmask, _ereg, _emask, 0, 0, _etime, &rk808_reg_ops) =20 +#define RK801_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \ + _vmask, _ereg, _emask, _disval, _etime) \ + RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \ + _vmask, _ereg, _emask, _emask, _disval, _etime, &rk801_reg_ops) + #define RK816_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \ _vmask, _ereg, _emask, _disval, _etime) \ RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \ @@ -185,6 +193,11 @@ .ops =3D _ops \ } =20 +#define RK801_DESC_SWITCH(_id, _match, _supply, _ereg, _emask, \ + _disval) \ + RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, \ + _emask, _disval, &rk801_switch_ops) + #define RK817_DESC_SWITCH(_id, _match, _supply, _ereg, _emask, \ _disval) \ RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, \ @@ -802,6 +815,115 @@ static unsigned int rk8xx_regulator_of_map_mode(unsig= ned int mode) } } =20 +static unsigned int rk801_get_mode(struct regulator_dev *rdev) +{ + unsigned int val; + int err; + + err =3D regmap_read(rdev->regmap, RK801_POWER_FPWM_EN_REG, &val); + if (err) + return err; + + if (val & BIT(rdev->desc->id)) + return REGULATOR_MODE_FAST; + else + return REGULATOR_MODE_NORMAL; +} + +static int rk801_set_mode(struct regulator_dev *rdev, unsigned int mode) +{ + unsigned int offset =3D rdev->desc->id; + + switch (mode) { + case REGULATOR_MODE_FAST: + return regmap_update_bits(rdev->regmap, RK801_POWER_FPWM_EN_REG, + BIT(offset), RK801_FPWM_MODE << offset); + case REGULATOR_MODE_NORMAL: + return regmap_update_bits(rdev->regmap, RK801_POWER_FPWM_EN_REG, + BIT(offset), RK801_AUTO_PWM_MODE << offset); + default: + dev_err(&rdev->dev, "do not support this mode\n"); + return -EINVAL; + } + + return 0; +} + +static int rk801_set_suspend_voltage(struct regulator_dev *rdev, int uv) +{ + unsigned int reg; + int sel; + + if (rdev->desc->id < RK801_ID_LDO1) + sel =3D regulator_map_voltage_linear_range(rdev, uv, uv); + else + sel =3D regulator_map_voltage_linear(rdev, uv, uv); + if (sel < 0) + return -EINVAL; + + reg =3D rdev->desc->vsel_reg + RK801_SLP_REG_OFFSET; + + return regmap_update_bits(rdev->regmap, reg, + rdev->desc->vsel_mask, sel); +} + +static int rk801_set_suspend_enable(struct regulator_dev *rdev) +{ + return regmap_update_bits(rdev->regmap, RK801_POWER_SLP_EN_REG, + BIT(rdev->desc->id), BIT(rdev->desc->id)); +} + +static int rk801_set_suspend_disable(struct regulator_dev *rdev) +{ + return regmap_update_bits(rdev->regmap, RK801_POWER_SLP_EN_REG, + BIT(rdev->desc->id), 0); +} + +static int rk801_set_voltage_time_sel(struct regulator_dev *rdev, + unsigned int old_selector, + unsigned int new_selector) +{ + return regulator_set_voltage_time_sel(rdev, old_selector, + new_selector) + RK801_HW_SYNC_US; +} + +static const struct regulator_ops rk801_buck_ops =3D { + .list_voltage =3D regulator_list_voltage_linear_range, + .map_voltage =3D regulator_map_voltage_linear_range, + .get_voltage_sel =3D regulator_get_voltage_sel_regmap, + .set_voltage_sel =3D regulator_set_voltage_sel_regmap, + .set_voltage_time_sel =3D rk801_set_voltage_time_sel, + .enable =3D regulator_enable_regmap, + .disable =3D regulator_disable_regmap, + .is_enabled =3D regulator_is_enabled_regmap, + .set_mode =3D rk801_set_mode, + .get_mode =3D rk801_get_mode, + .set_suspend_voltage =3D rk801_set_suspend_voltage, + .set_suspend_enable =3D rk801_set_suspend_enable, + .set_suspend_disable =3D rk801_set_suspend_disable, +}; + +static const struct regulator_ops rk801_reg_ops =3D { + .list_voltage =3D regulator_list_voltage_linear, + .map_voltage =3D regulator_map_voltage_linear, + .get_voltage_sel =3D regulator_get_voltage_sel_regmap, + .set_voltage_sel =3D regulator_set_voltage_sel_regmap, + .enable =3D regulator_enable_regmap, + .disable =3D regulator_disable_regmap, + .is_enabled =3D regulator_is_enabled_regmap, + .set_suspend_voltage =3D rk801_set_suspend_voltage, + .set_suspend_enable =3D rk801_set_suspend_enable, + .set_suspend_disable =3D rk801_set_suspend_disable, +}; + +static const struct regulator_ops rk801_switch_ops =3D { + .enable =3D regulator_enable_regmap, + .disable =3D regulator_disable_regmap, + .is_enabled =3D regulator_is_enabled_regmap, + .set_suspend_enable =3D rk801_set_suspend_enable, + .set_suspend_disable =3D rk801_set_suspend_disable, +}; + static const struct regulator_ops rk805_reg_ops =3D { .list_voltage =3D regulator_list_voltage_linear, .map_voltage =3D regulator_map_voltage_linear, @@ -1049,6 +1171,123 @@ static const struct regulator_ops rk817_switch_ops = =3D { .set_suspend_disable =3D rk817_set_suspend_disable, }; =20 +static const struct linear_range rk801_buck1_voltage_ranges[] =3D { + REGULATOR_LINEAR_RANGE(500000, 0, 80, 12500), /* 0.5v - 1.5v */ + REGULATOR_LINEAR_RANGE(1800000, 81, 82, 400000),/* 1.8v - 2.2v */ + REGULATOR_LINEAR_RANGE(3300000, 83, 83, 0), /* 3.3v */ + REGULATOR_LINEAR_RANGE(5000000, 84, 84, 0), /* 5.0v */ + REGULATOR_LINEAR_RANGE(5250000, 85, 85, 0), /* 5.25v */ +}; + +static const struct linear_range rk801_buck2_voltage_ranges[] =3D { + REGULATOR_LINEAR_RANGE(800000, 0, 2, 50000), /* 0.8v - 0.9v */ + REGULATOR_LINEAR_RANGE(1800000, 3, 4, 400000), /* 1.8v - 2.2v */ + REGULATOR_LINEAR_RANGE(3300000, 5, 5, 0), /* 3.3v */ + REGULATOR_LINEAR_RANGE(5000000, 6, 6, 0), /* 5.0v */ + REGULATOR_LINEAR_RANGE(5250000, 7, 7, 0), /* 5.25v */ +}; + +static const struct linear_range rk801_buck4_voltage_ranges[] =3D { + REGULATOR_LINEAR_RANGE(500000, 0, 80, 12500), /* 0.5v - 1.5v */ + REGULATOR_LINEAR_RANGE(1800000, 81, 82, 400000),/* 1.8v - 2.2v */ + REGULATOR_LINEAR_RANGE(2500000, 83, 83, 0), /* 2.5v */ + REGULATOR_LINEAR_RANGE(2800000, 84, 84, 0), /* 2.8v */ + REGULATOR_LINEAR_RANGE(3000000, 85, 85, 0), /* 3.0v */ + REGULATOR_LINEAR_RANGE(3300000, 86, 86, 0), /* 3.3v */ +}; + +static const struct regulator_desc rk801_reg[] =3D { + { + .name =3D "dcdc1", + .supply_name =3D "vcc1", + .of_match =3D of_match_ptr("dcdc1"), + .regulators_node =3D of_match_ptr("regulators"), + .id =3D RK801_ID_DCDC1, + .ops =3D &rk801_buck_ops, + .type =3D REGULATOR_VOLTAGE, + .n_voltages =3D 86, + .linear_ranges =3D rk801_buck1_voltage_ranges, + .n_linear_ranges =3D ARRAY_SIZE(rk801_buck1_voltage_ranges), + .vsel_reg =3D RK801_BUCK1_ON_VSEL_REG, + .vsel_mask =3D RK801_BUCK_VSEL_MASK, + .enable_reg =3D RK801_POWER_EN0_REG, + .enable_mask =3D ENABLE_MASK(RK801_ID_DCDC1), + .enable_val =3D ENABLE_MASK(RK801_ID_DCDC1), + .disable_val =3D DISABLE_VAL(RK801_ID_DCDC1), + .ramp_delay =3D 1000, + .of_map_mode =3D rk8xx_regulator_of_map_mode, + .enable_time =3D 400, + .owner =3D THIS_MODULE, + }, { + .name =3D "dcdc2", + .supply_name =3D "vcc2", + .of_match =3D of_match_ptr("dcdc2"), + .regulators_node =3D of_match_ptr("regulators"), + .id =3D RK801_ID_DCDC2, + .ops =3D &rk801_buck_ops, + .type =3D REGULATOR_VOLTAGE, + .n_voltages =3D 8, + .linear_ranges =3D rk801_buck2_voltage_ranges, + .n_linear_ranges =3D ARRAY_SIZE(rk801_buck2_voltage_ranges), + .vsel_reg =3D RK801_BUCK2_ON_VSEL_REG, + .vsel_mask =3D RK801_BUCK_VSEL_MASK, + .enable_reg =3D RK801_POWER_EN0_REG, + .enable_mask =3D ENABLE_MASK(RK801_ID_DCDC2), + .enable_val =3D ENABLE_MASK(RK801_ID_DCDC2), + .disable_val =3D DISABLE_VAL(RK801_ID_DCDC2), + .ramp_delay =3D 1000, + .of_map_mode =3D rk8xx_regulator_of_map_mode, + .enable_time =3D 400, + .owner =3D THIS_MODULE, + }, { + .name =3D "dcdc3", + .supply_name =3D "vcc3", + .of_match =3D of_match_ptr("dcdc3"), + .regulators_node =3D of_match_ptr("regulators"), + .id =3D RK801_ID_DCDC3, + .ops =3D &rk801_switch_ops, + .type =3D REGULATOR_VOLTAGE, + .n_voltages =3D 1, + .enable_reg =3D RK801_POWER_EN0_REG, + .enable_mask =3D ENABLE_MASK(RK801_ID_DCDC3), + .enable_val =3D ENABLE_MASK(RK801_ID_DCDC3), + .disable_val =3D DISABLE_VAL(RK801_ID_DCDC3), + .of_map_mode =3D rk8xx_regulator_of_map_mode, + .enable_time =3D 400, + .owner =3D THIS_MODULE, + }, { + .name =3D "dcdc4", + .supply_name =3D "vcc4", + .of_match =3D of_match_ptr("dcdc4"), + .regulators_node =3D of_match_ptr("regulators"), + .id =3D RK801_ID_DCDC4, + .ops =3D &rk801_buck_ops, + .type =3D REGULATOR_VOLTAGE, + .n_voltages =3D 87, + .linear_ranges =3D rk801_buck4_voltage_ranges, + .n_linear_ranges =3D ARRAY_SIZE(rk801_buck4_voltage_ranges), + .vsel_reg =3D RK801_BUCK4_ON_VSEL_REG, + .vsel_mask =3D RK801_BUCK_VSEL_MASK, + .enable_reg =3D RK801_POWER_EN0_REG, + .enable_mask =3D ENABLE_MASK(RK801_ID_DCDC4), + .enable_val =3D ENABLE_MASK(RK801_ID_DCDC4), + .disable_val =3D DISABLE_VAL(RK801_ID_DCDC4), + .ramp_delay =3D 1000, + .of_map_mode =3D rk8xx_regulator_of_map_mode, + .enable_time =3D 400, + .owner =3D THIS_MODULE, + }, + + RK801_DESC(RK801_ID_LDO1, "ldo1", "vcc5", 500, 3400, 50, + RK801_LDO1_ON_VSEL_REG, RK801_LDO_VSEL_MASK, RK801_POWER_EN1_REG, + ENABLE_MASK(0), DISABLE_VAL(0), 400), + RK801_DESC(RK801_ID_LDO2, "ldo2", "vcc6", 500, 3400, 50, + RK801_LDO2_ON_VSEL_REG, RK801_LDO_VSEL_MASK, RK801_POWER_EN1_REG, + ENABLE_MASK(1), DISABLE_VAL(1), 400), + RK801_DESC_SWITCH(RK801_ID_SWITCH, "switch", "vcc7", RK801_POWER_EN1_REG, + ENABLE_MASK(2), DISABLE_VAL(2)), +}; + static const struct regulator_desc rk805_reg[] =3D { { .name =3D "DCDC_REG1", @@ -1887,6 +2126,10 @@ static int rk808_regulator_probe(struct platform_dev= ice *pdev) return -ENOMEM; =20 switch (rk808->variant) { + case RK801_ID: + regulators =3D rk801_reg; + nregulators =3D RK801_NUM_REGULATORS; + break; case RK805_ID: regulators =3D rk805_reg; nregulators =3D RK805_NUM_REGULATORS; --=20 2.25.1