Message ID | 1468936286-2710-5-git-send-email-narmstrong@baylibre.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 07/19/2016 06:51 AM, Neil Armstrong wrote: > In order to support eh Qualcomm MDM9615 SoC, add support for the s/eh/the/ > PM8018 RPM regulator in the qcom_rpm-regulator driver. > > Acked-by: Mark Brown <broonie@kernel.org> > Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> > > diff --git a/drivers/regulator/qcom_rpm-regulator.c b/drivers/regulator/qcom_rpm-regulator.c > index e254272..0734a5f 100644 > --- a/drivers/regulator/qcom_rpm-regulator.c > +++ b/drivers/regulator/qcom_rpm-regulator.c > @@ -70,6 +70,40 @@ struct qcom_rpm_reg { > bool supports_force_mode_bypass; > }; > > +static struct rpm_reg_parts rpm8018_ldo_parts = { > + .request_len = 2, > + .uV = { 0, 0x007FFFFF, 0}, > + .pd = { 0, 0x00800000, 23}, > + .pc = { 0, 0x0F000000, 24}, > + .pf = { 0, 0xF0000000, 28}, > + .ip = { 1, 0x000003FF, 0}, > + .ia = { 1, 0x000FFC00, 10}, > + .fm = { 1, 0x00700000, 20}, > +}; > + > +static struct rpm_reg_parts rpm8018_smps_parts = { > + .request_len = 2, > + .uV = { 0, 0x007FFFFF, 0}, > + .pd = { 0, 0x00800000, 23}, > + .pc = { 0, 0x0F000000, 24}, > + .pf = { 0, 0xF0000000, 28}, > + .ip = { 1, 0x000003FF, 0}, > + .ia = { 1, 0x000FFC00, 10}, > + .fm = { 1, 0x00700000, 20}, > + .pm = { 1, 0x00800000, 23}, > + .freq = { 1, 0x1F000000, 24}, > + .freq_clk_src = { 1, 0x60000000, 29}, > +}; > + > +static struct rpm_reg_parts rpm8018_switch_parts = { > + .request_len = 1, > + .enable_state = { 0, 0x00000001, 0}, > + .pd = { 0, 0x00000002, 1}, > + .pc = { 0, 0x0000003C, 2}, > + .pf = { 0, 0x000003C0, 6}, > + .hpm = { 0, 0x00000C00, 10}, > +}; > + These are all the same as the rpm8960 ones, so why don't we reuse those structures? > static const struct rpm_reg_parts rpm8660_ldo_parts = { > .request_len = 2, > .mV = { 0, 0x00000FFF, 0 }, > @@ -448,6 +482,44 @@ static struct regulator_ops switch_ops = { > }; > > /* > + * PM8018 regulators > + */ > +static const struct qcom_rpm_reg pm8018_pldo = { > + .desc.linear_ranges = pldo_ranges, > + .desc.n_linear_ranges = ARRAY_SIZE(pldo_ranges), > + .desc.n_voltages = 161, > + .desc.ops = &uV_ops, > + .parts = &rpm8018_ldo_parts, > + .supports_force_mode_auto = false, > + .supports_force_mode_bypass = false, > +}; > + > +static const struct qcom_rpm_reg pm8018_nldo = { > + .desc.linear_ranges = nldo_ranges, > + .desc.n_linear_ranges = ARRAY_SIZE(nldo_ranges), > + .desc.n_voltages = 64, > + .desc.ops = &uV_ops, > + .parts = &rpm8018_ldo_parts, > + .supports_force_mode_auto = false, > + .supports_force_mode_bypass = false, > +}; > + > +static const struct qcom_rpm_reg pm8018_smps = { > + .desc.linear_ranges = smps_ranges, > + .desc.n_linear_ranges = ARRAY_SIZE(smps_ranges), > + .desc.n_voltages = 154, > + .desc.ops = &uV_ops, > + .parts = &rpm8018_smps_parts, > + .supports_force_mode_auto = false, > + .supports_force_mode_bypass = false, > +}; > + > +static const struct qcom_rpm_reg pm8018_switch = { > + .desc.ops = &switch_ops, > + .parts = &rpm8018_switch_parts, > +}; > + These are all the same as the pm8921 ones too? So just use those instead? We should probably rethink this design and have these structures based on PMIC derivatives instead of SoCs because things are quite similar across many PMICs.
Hi Stephen, On 08/05/2016 12:04 AM, Stephen Boyd wrote: > On 07/19/2016 06:51 AM, Neil Armstrong wrote: >> In order to support eh Qualcomm MDM9615 SoC, add support for the > > s/eh/the/ > >> PM8018 RPM regulator in the qcom_rpm-regulator driver. >> >> Acked-by: Mark Brown <broonie@kernel.org> >> Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> >> >> diff --git a/drivers/regulator/qcom_rpm-regulator.c b/drivers/regulator/qcom_rpm-regulator.c >> index e254272..0734a5f 100644 >> --- a/drivers/regulator/qcom_rpm-regulator.c >> +++ b/drivers/regulator/qcom_rpm-regulator.c >> @@ -70,6 +70,40 @@ struct qcom_rpm_reg { >> bool supports_force_mode_bypass; >> }; >> >> +static struct rpm_reg_parts rpm8018_ldo_parts = { >> + .request_len = 2, >> + .uV = { 0, 0x007FFFFF, 0}, >> + .pd = { 0, 0x00800000, 23}, >> + .pc = { 0, 0x0F000000, 24}, >> + .pf = { 0, 0xF0000000, 28}, >> + .ip = { 1, 0x000003FF, 0}, >> + .ia = { 1, 0x000FFC00, 10}, >> + .fm = { 1, 0x00700000, 20}, >> +}; >> + >> +static struct rpm_reg_parts rpm8018_smps_parts = { >> + .request_len = 2, >> + .uV = { 0, 0x007FFFFF, 0}, >> + .pd = { 0, 0x00800000, 23}, >> + .pc = { 0, 0x0F000000, 24}, >> + .pf = { 0, 0xF0000000, 28}, >> + .ip = { 1, 0x000003FF, 0}, >> + .ia = { 1, 0x000FFC00, 10}, >> + .fm = { 1, 0x00700000, 20}, >> + .pm = { 1, 0x00800000, 23}, >> + .freq = { 1, 0x1F000000, 24}, >> + .freq_clk_src = { 1, 0x60000000, 29}, >> +}; >> + >> +static struct rpm_reg_parts rpm8018_switch_parts = { >> + .request_len = 1, >> + .enable_state = { 0, 0x00000001, 0}, >> + .pd = { 0, 0x00000002, 1}, >> + .pc = { 0, 0x0000003C, 2}, >> + .pf = { 0, 0x000003C0, 6}, >> + .hpm = { 0, 0x00000C00, 10}, >> +}; >> + > > These are all the same as the rpm8960 ones, so why don't we reuse those > structures? Indeed, I will reuse them. > >> static const struct rpm_reg_parts rpm8660_ldo_parts = { >> .request_len = 2, >> .mV = { 0, 0x00000FFF, 0 }, >> @@ -448,6 +482,44 @@ static struct regulator_ops switch_ops = { >> }; >> >> /* >> + * PM8018 regulators >> + */ >> +static const struct qcom_rpm_reg pm8018_pldo = { >> + .desc.linear_ranges = pldo_ranges, >> + .desc.n_linear_ranges = ARRAY_SIZE(pldo_ranges), >> + .desc.n_voltages = 161, >> + .desc.ops = &uV_ops, >> + .parts = &rpm8018_ldo_parts, >> + .supports_force_mode_auto = false, >> + .supports_force_mode_bypass = false, >> +}; >> + >> +static const struct qcom_rpm_reg pm8018_nldo = { >> + .desc.linear_ranges = nldo_ranges, >> + .desc.n_linear_ranges = ARRAY_SIZE(nldo_ranges), >> + .desc.n_voltages = 64, >> + .desc.ops = &uV_ops, >> + .parts = &rpm8018_ldo_parts, >> + .supports_force_mode_auto = false, >> + .supports_force_mode_bypass = false, >> +}; >> + >> +static const struct qcom_rpm_reg pm8018_smps = { >> + .desc.linear_ranges = smps_ranges, >> + .desc.n_linear_ranges = ARRAY_SIZE(smps_ranges), >> + .desc.n_voltages = 154, >> + .desc.ops = &uV_ops, >> + .parts = &rpm8018_smps_parts, >> + .supports_force_mode_auto = false, >> + .supports_force_mode_bypass = false, >> +}; >> + >> +static const struct qcom_rpm_reg pm8018_switch = { >> + .desc.ops = &switch_ops, >> + .parts = &rpm8018_switch_parts, >> +}; >> + > > These are all the same as the pm8921 ones too? So just use those instead? They look but the supports_force_mode_bypass is set to "true" for pm8921. These pm8018 structures are still needed. > > We should probably rethink this design and have these structures based > on PMIC derivatives instead of SoCs because things are quite similar > across many PMICs. > This would help to support the huge pmic family ! Neil -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/Documentation/devicetree/bindings/mfd/qcom-rpm.txt b/Documentation/devicetree/bindings/mfd/qcom-rpm.txt index 72d68d4..485bc59 100644 --- a/Documentation/devicetree/bindings/mfd/qcom-rpm.txt +++ b/Documentation/devicetree/bindings/mfd/qcom-rpm.txt @@ -60,6 +60,7 @@ Regulator nodes are identified by their compatible: "qcom,rpm-pm8058-regulators" "qcom,rpm-pm8901-regulators" "qcom,rpm-pm8921-regulators" + "qcom,rpm-pm8018-regulators" - vdd_l0_l1_lvs-supply: - vdd_l2_l11_l12-supply: @@ -138,6 +139,15 @@ Regulator nodes are identified by their compatible: Definition: reference to regulator supplying the input pin, as described in the data sheet +- vin_lvs1-supply: +- vdd_l7-supply: +- vdd_l8-supply: +- vdd_l9_l10_l11_l12-supply: + Usage: optional (pm8018 only) + Value type: <phandle> + Definition: reference to regulator supplying the input pin, as + described in the data sheet + The regulator node houses sub-nodes for each regulator within the device. Each sub-node is identified using the node's name, with valid values listed for each of the pmics below. @@ -157,6 +167,10 @@ pm8921: l29, lvs1, lvs2, lvs3, lvs4, lvs5, lvs6, lvs7, usb-switch, hdmi-switch, ncp +pm8018: + s1, s2, s3, s4, s5, , l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, + l12, l14, lvs1 + The content of each sub-node is defined by the standard binding for regulators - see regulator.txt - with additional custom properties described below: diff --git a/drivers/regulator/qcom_rpm-regulator.c b/drivers/regulator/qcom_rpm-regulator.c index e254272..0734a5f 100644 --- a/drivers/regulator/qcom_rpm-regulator.c +++ b/drivers/regulator/qcom_rpm-regulator.c @@ -70,6 +70,40 @@ struct qcom_rpm_reg { bool supports_force_mode_bypass; }; +static struct rpm_reg_parts rpm8018_ldo_parts = { + .request_len = 2, + .uV = { 0, 0x007FFFFF, 0}, + .pd = { 0, 0x00800000, 23}, + .pc = { 0, 0x0F000000, 24}, + .pf = { 0, 0xF0000000, 28}, + .ip = { 1, 0x000003FF, 0}, + .ia = { 1, 0x000FFC00, 10}, + .fm = { 1, 0x00700000, 20}, +}; + +static struct rpm_reg_parts rpm8018_smps_parts = { + .request_len = 2, + .uV = { 0, 0x007FFFFF, 0}, + .pd = { 0, 0x00800000, 23}, + .pc = { 0, 0x0F000000, 24}, + .pf = { 0, 0xF0000000, 28}, + .ip = { 1, 0x000003FF, 0}, + .ia = { 1, 0x000FFC00, 10}, + .fm = { 1, 0x00700000, 20}, + .pm = { 1, 0x00800000, 23}, + .freq = { 1, 0x1F000000, 24}, + .freq_clk_src = { 1, 0x60000000, 29}, +}; + +static struct rpm_reg_parts rpm8018_switch_parts = { + .request_len = 1, + .enable_state = { 0, 0x00000001, 0}, + .pd = { 0, 0x00000002, 1}, + .pc = { 0, 0x0000003C, 2}, + .pf = { 0, 0x000003C0, 6}, + .hpm = { 0, 0x00000C00, 10}, +}; + static const struct rpm_reg_parts rpm8660_ldo_parts = { .request_len = 2, .mV = { 0, 0x00000FFF, 0 }, @@ -448,6 +482,44 @@ static struct regulator_ops switch_ops = { }; /* + * PM8018 regulators + */ +static const struct qcom_rpm_reg pm8018_pldo = { + .desc.linear_ranges = pldo_ranges, + .desc.n_linear_ranges = ARRAY_SIZE(pldo_ranges), + .desc.n_voltages = 161, + .desc.ops = &uV_ops, + .parts = &rpm8018_ldo_parts, + .supports_force_mode_auto = false, + .supports_force_mode_bypass = false, +}; + +static const struct qcom_rpm_reg pm8018_nldo = { + .desc.linear_ranges = nldo_ranges, + .desc.n_linear_ranges = ARRAY_SIZE(nldo_ranges), + .desc.n_voltages = 64, + .desc.ops = &uV_ops, + .parts = &rpm8018_ldo_parts, + .supports_force_mode_auto = false, + .supports_force_mode_bypass = false, +}; + +static const struct qcom_rpm_reg pm8018_smps = { + .desc.linear_ranges = smps_ranges, + .desc.n_linear_ranges = ARRAY_SIZE(smps_ranges), + .desc.n_voltages = 154, + .desc.ops = &uV_ops, + .parts = &rpm8018_smps_parts, + .supports_force_mode_auto = false, + .supports_force_mode_bypass = false, +}; + +static const struct qcom_rpm_reg pm8018_switch = { + .desc.ops = &switch_ops, + .parts = &rpm8018_switch_parts, +}; + +/* * PM8058 regulators */ static const struct qcom_rpm_reg pm8058_pldo = { @@ -755,6 +827,32 @@ struct rpm_regulator_data { const char *supply; }; +static const struct rpm_regulator_data rpm_pm8018_regulators[] = { + { "s1", QCOM_RPM_PM8018_SMPS1, &pm8018_smps, "vdd_s1" }, + { "s2", QCOM_RPM_PM8018_SMPS2, &pm8018_smps, "vdd_s2" }, + { "s3", QCOM_RPM_PM8018_SMPS3, &pm8018_smps, "vdd_s3" }, + { "s4", QCOM_RPM_PM8018_SMPS4, &pm8018_smps, "vdd_s4" }, + { "s5", QCOM_RPM_PM8018_SMPS5, &pm8018_smps, "vdd_s5" }, + + { "l2", QCOM_RPM_PM8018_LDO2, &pm8018_pldo, "vdd_l2" }, + { "l3", QCOM_RPM_PM8018_LDO3, &pm8018_pldo, "vdd_l3" }, + { "l4", QCOM_RPM_PM8018_LDO4, &pm8018_pldo, "vdd_l4" }, + { "l5", QCOM_RPM_PM8018_LDO5, &pm8018_pldo, "vdd_l5" }, + { "l6", QCOM_RPM_PM8018_LDO6, &pm8018_pldo, "vdd_l7" }, + { "l7", QCOM_RPM_PM8018_LDO7, &pm8018_pldo, "vdd_l7" }, + { "l8", QCOM_RPM_PM8018_LDO8, &pm8018_nldo, "vdd_l8" }, + { "l9", QCOM_RPM_PM8018_LDO9, &pm8921_nldo1200, + "vdd_l9_l10_l11_l12" }, + { "l10", QCOM_RPM_PM8018_LDO10, &pm8018_nldo, "vdd_l9_l10_l11_l12" }, + { "l11", QCOM_RPM_PM8018_LDO11, &pm8018_nldo, "vdd_l9_l10_l11_l12" }, + { "l12", QCOM_RPM_PM8018_LDO12, &pm8018_nldo, "vdd_l9_l10_l11_l12" }, + { "l14", QCOM_RPM_PM8018_LDO14, &pm8018_pldo, "vdd_l14" }, + + { "lvs1", QCOM_RPM_PM8018_LVS1, &pm8018_switch, "lvs1_in" }, + + { } +}; + static const struct rpm_regulator_data rpm_pm8058_regulators[] = { { "l0", QCOM_RPM_PM8058_LDO0, &pm8058_nldo, "vdd_l0_l1_lvs" }, { "l1", QCOM_RPM_PM8058_LDO1, &pm8058_nldo, "vdd_l0_l1_lvs" }, @@ -870,6 +968,8 @@ static const struct rpm_regulator_data rpm_pm8921_regulators[] = { }; static const struct of_device_id rpm_of_match[] = { + { .compatible = "qcom,rpm-pm8018-regulators", + .data = &rpm_pm8018_regulators }, { .compatible = "qcom,rpm-pm8058-regulators", .data = &rpm_pm8058_regulators }, { .compatible = "qcom,rpm-pm8901-regulators", .data = &rpm_pm8901_regulators }, { .compatible = "qcom,rpm-pm8921-regulators", .data = &rpm_pm8921_regulators },