Lines Matching +full:buck +full:- +full:boost
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
8 #include <linux/devm-helpers.h>
57 * struct spmi_regulator_init_data - spmi-regulator initialization data
278 /* Boost regulator current limit control register layout */
329 * struct spmi_voltage_range - regulator set point voltage mapping description
344 * (max_uV - min_uV) % step_uV == 0
345 * (set_point_min_uV - min_uV) % step_uV == 0*
346 * (set_point_max_uV - min_uV) % step_uV == 0*
347 * n_voltages = (set_point_max_uV - set_point_min_uV) / step_uV + 1
556 static DEFINE_SPMI_SET_POINTS(boost);
571 return regmap_bulk_read(vreg->regmap, vreg->base + addr, buf, len); in spmi_vreg_read()
577 return regmap_bulk_write(vreg->regmap, vreg->base + addr, buf, len); in spmi_vreg_write()
583 return regmap_update_bits(vreg->regmap, vreg->base + addr, mask, val); in spmi_vreg_update_bits()
590 if (vreg->ocp_irq) { in spmi_regulator_vs_enable()
591 vreg->ocp_count = 0; in spmi_regulator_vs_enable()
592 vreg->vs_enable_time = ktime_get(); in spmi_regulator_vs_enable()
605 return -EINVAL; in spmi_regulator_vs_ocp()
619 lim_min_uV = vreg->set_points->range[0].set_point_min_uV; in spmi_regulator_select_voltage()
621 vreg->set_points->range[vreg->set_points->count - 1].set_point_max_uV; in spmi_regulator_select_voltage()
627 dev_err(vreg->dev, in spmi_regulator_select_voltage()
630 return -EINVAL; in spmi_regulator_select_voltage()
634 for (i = vreg->set_points->count - 1; i > 0; i--) { in spmi_regulator_select_voltage()
635 range_max_uV = vreg->set_points->range[i - 1].set_point_max_uV; in spmi_regulator_select_voltage()
641 range = &vreg->set_points->range[range_id]; in spmi_regulator_select_voltage()
647 voltage_sel = DIV_ROUND_UP(uV - range->min_uV, range->step_uV); in spmi_regulator_select_voltage()
648 uV = voltage_sel * range->step_uV + range->min_uV; in spmi_regulator_select_voltage()
651 dev_err(vreg->dev, in spmi_regulator_select_voltage()
655 return -EINVAL; in spmi_regulator_select_voltage()
660 selector += vreg->set_points->range[i].n_voltages; in spmi_regulator_select_voltage()
661 selector += (uV - range->set_point_min_uV) / range->step_uV; in spmi_regulator_select_voltage()
673 range = vreg->set_points->range; in spmi_sw_selector_to_hw()
674 end = range + vreg->set_points->count; in spmi_sw_selector_to_hw()
677 if (selector < range->n_voltages) { in spmi_sw_selector_to_hw()
682 offset = range->set_point_min_uV - range->min_uV; in spmi_sw_selector_to_hw()
683 offset /= range->step_uV; in spmi_sw_selector_to_hw()
685 *range_sel = range->range_sel; in spmi_sw_selector_to_hw()
689 selector -= range->n_voltages; in spmi_sw_selector_to_hw()
692 return -EINVAL; in spmi_sw_selector_to_hw()
700 const struct spmi_voltage_range *r = vreg->set_points->range; in spmi_hw_selector_to_sw()
701 const struct spmi_voltage_range *end = r + vreg->set_points->count; in spmi_hw_selector_to_sw()
704 if (r == range && range->n_voltages) { in spmi_hw_selector_to_sw()
711 offset = range->set_point_min_uV - range->min_uV; in spmi_hw_selector_to_sw()
712 offset /= range->step_uV; in spmi_hw_selector_to_sw()
714 return -EINVAL; in spmi_hw_selector_to_sw()
716 max_hw_sel = range->set_point_max_uV - range->min_uV; in spmi_hw_selector_to_sw()
717 max_hw_sel /= range->step_uV; in spmi_hw_selector_to_sw()
719 return -EINVAL; in spmi_hw_selector_to_sw()
721 return sw_sel + hw_sel - offset; in spmi_hw_selector_to_sw()
723 sw_sel += r->n_voltages; in spmi_hw_selector_to_sw()
726 return -EINVAL; in spmi_hw_selector_to_sw()
735 range = vreg->set_points->range; in spmi_regulator_find_range()
736 end = range + vreg->set_points->count; in spmi_regulator_find_range()
741 if (range->range_sel == range_sel) in spmi_regulator_find_range()
758 if (uV < range->min_uV && max_uV >= range->min_uV) in spmi_regulator_select_voltage_same_range()
759 uV = range->min_uV; in spmi_regulator_select_voltage_same_range()
761 if (uV < range->min_uV || uV > range->max_uV) { in spmi_regulator_select_voltage_same_range()
770 uV = DIV_ROUND_UP(uV - range->min_uV, range->step_uV); in spmi_regulator_select_voltage_same_range()
771 uV = uV * range->step_uV + range->min_uV; in spmi_regulator_select_voltage_same_range()
782 for (i = 0; i < vreg->set_points->count; i++) { in spmi_regulator_select_voltage_same_range()
783 if (uV >= vreg->set_points->range[i].set_point_min_uV in spmi_regulator_select_voltage_same_range()
784 && uV <= vreg->set_points->range[i].set_point_max_uV) { in spmi_regulator_select_voltage_same_range()
786 (uV - vreg->set_points->range[i].set_point_min_uV) in spmi_regulator_select_voltage_same_range()
787 / vreg->set_points->range[i].step_uV; in spmi_regulator_select_voltage_same_range()
791 selector += vreg->set_points->range[i].n_voltages; in spmi_regulator_select_voltage_same_range()
794 if (selector >= vreg->set_points->n_voltages) in spmi_regulator_select_voltage_same_range()
855 diff_uV = abs(spmi_regulator_common_list_voltage(rdev, new_selector) - in spmi_regulator_set_voltage_time_sel()
858 return DIV_ROUND_UP(diff_uV, vreg->slew_rate); in spmi_regulator_set_voltage_time_sel()
871 return -EINVAL; in spmi_regulator_common_get_voltage()
886 range = vreg->set_points->range; in spmi_regulator_ftsmps426_get_voltage()
888 return (uV - range->set_point_min_uV) / range->step_uV; in spmi_regulator_ftsmps426_get_voltage()
940 * In case of range 1: voltage_sel is a 5 bit value, bits[7-5] set to in spmi_regulator_ult_lo_smps_set_voltage()
960 return -EINVAL; in spmi_regulator_ult_lo_smps_get_voltage()
962 if (range->range_sel == 1) in spmi_regulator_ult_lo_smps_get_voltage()
975 if (selector >= vreg->set_points->n_voltages) in spmi_regulator_common_list_voltage()
978 for (i = 0; i < vreg->set_points->count; i++) { in spmi_regulator_common_list_voltage()
979 if (selector < vreg->set_points->range[i].n_voltages) { in spmi_regulator_common_list_voltage()
980 uV = selector * vreg->set_points->range[i].step_uV in spmi_regulator_common_list_voltage()
981 + vreg->set_points->range[i].set_point_min_uV; in spmi_regulator_common_list_voltage()
985 selector -= vreg->set_points->range[i].n_voltages; in spmi_regulator_common_list_voltage()
1093 return -EINVAL; in spmi_regulator_ftsmps426_set_mode()
1105 if (load_uA >= vreg->hpm_min_load) in spmi_regulator_common_set_load()
1134 enum spmi_regulator_logical_type type = vreg->logical_type; in spmi_regulator_set_ilim()
1147 return -EINVAL; in spmi_regulator_set_ilim()
1149 reg = (ilim_uA - 1) / 500; in spmi_regulator_set_ilim()
1162 vreg->vs_enable_time = ktime_get(); in spmi_regulator_vs_clear_ocp()
1187 vreg->vs_enable_time); in spmi_regulator_vs_ocp_isr()
1195 vreg->ocp_count = 0; in spmi_regulator_vs_ocp_isr()
1200 vreg->ocp_count++; in spmi_regulator_vs_ocp_isr()
1202 if (vreg->ocp_count == 1) { in spmi_regulator_vs_ocp_isr()
1205 } else if (vreg->ocp_count <= vreg->ocp_max_retries) { in spmi_regulator_vs_ocp_isr()
1207 schedule_delayed_work(&vreg->ocp_work, in spmi_regulator_vs_ocp_isr()
1208 msecs_to_jiffies(vreg->ocp_retry_delay_ms) + 1); in spmi_regulator_vs_ocp_isr()
1210 dev_err(vreg->dev, in spmi_regulator_vs_ocp_isr()
1212 vreg->ocp_count); in spmi_regulator_vs_ocp_isr()
1270 avs_ctl |= ((pmic_sts - 4) << 10); in spmi_saw_set_vdd()
1289 dev_dbg(&rdev->dev, "range_sel = %02X voltage_sel = %02X", \ in spmi_regulator_saw_set_voltage()
1291 return -EINVAL; in spmi_regulator_saw_set_voltage()
1461 SPMI_VREG(BUCK, GP_CTL, 0, INF, SMPS, smps, smps, 100000),
1462 SPMI_VREG(BUCK, HFS430, 0, INF, HFS430, hfs430, hfs430, 10000),
1513 SPMI_VREG(BOOST, 5V_BOOST, 0, INF, BOOST, boost, boost, 0),
1517 SPMI_VREG(BOOST_BYP, BB_2A, 0, INF, BOOST_BYP, boost, boost_byp, 0),
1543 struct spmi_voltage_range *range = points->range; in spmi_calculate_num_voltages()
1545 for (; range < points->range + points->count; range++) { in spmi_calculate_num_voltages()
1547 if (range->set_point_max_uV) { in spmi_calculate_num_voltages()
1548 n = range->set_point_max_uV - range->set_point_min_uV; in spmi_calculate_num_voltages()
1549 n = (n / range->step_uV) + 1; in spmi_calculate_num_voltages()
1551 range->n_voltages = n; in spmi_calculate_num_voltages()
1552 points->n_voltages += n; in spmi_calculate_num_voltages()
1561 u8 version[SPMI_COMMON_REG_SUBTYPE - SPMI_COMMON_REG_DIG_MAJOR_REV + 1]; in spmi_regulator_match()
1567 dev_dbg(vreg->dev, "could not read version registers\n"); in spmi_regulator_match()
1571 - SPMI_COMMON_REG_DIG_MAJOR_REV]; in spmi_regulator_match()
1574 type = version[SPMI_COMMON_REG_TYPE - in spmi_regulator_match()
1576 subtype = version[SPMI_COMMON_REG_SUBTYPE - in spmi_regulator_match()
1585 if (mapping->type == type && mapping->subtype == subtype in spmi_regulator_match()
1586 && mapping->revision_min <= dig_major_rev in spmi_regulator_match()
1587 && mapping->revision_max >= dig_major_rev) in spmi_regulator_match()
1591 dev_err(vreg->dev, in spmi_regulator_match()
1593 vreg->desc.name, type, subtype, dig_major_rev); in spmi_regulator_match()
1595 return -ENODEV; in spmi_regulator_match()
1598 vreg->logical_type = mapping->logical_type; in spmi_regulator_match()
1599 vreg->set_points = mapping->set_points; in spmi_regulator_match()
1600 vreg->hpm_min_load = mapping->hpm_min_load; in spmi_regulator_match()
1601 vreg->desc.ops = mapping->ops; in spmi_regulator_match()
1603 if (mapping->set_points) { in spmi_regulator_match()
1604 if (!mapping->set_points->n_voltages) in spmi_regulator_match()
1605 spmi_calculate_num_voltages(mapping->set_points); in spmi_regulator_match()
1606 vreg->desc.n_voltages = mapping->set_points->n_voltages; in spmi_regulator_match()
1621 dev_err(vreg->dev, "spmi read failed, ret=%d\n", ret); in spmi_regulator_init_slew_rate()
1627 return -EINVAL; in spmi_regulator_init_slew_rate()
1629 switch (vreg->logical_type) { in spmi_regulator_init_slew_rate()
1645 slew_rate = SPMI_FTSMPS_CLOCK_RATE * range->step_uV * (1 << step); in spmi_regulator_init_slew_rate()
1651 vreg->slew_rate = max(slew_rate, 1); in spmi_regulator_init_slew_rate()
1662 const struct spmi_voltage_range *range = &vreg->set_points->range[0]; in spmi_regulator_init_slew_rate_ftsmps426()
1666 dev_err(vreg->dev, "spmi read failed, ret=%d\n", ret); in spmi_regulator_init_slew_rate_ftsmps426()
1674 slew_rate = clock_rate * range->step_uV; in spmi_regulator_init_slew_rate_ftsmps426()
1680 vreg->slew_rate = max(slew_rate, 1); in spmi_regulator_init_slew_rate_ftsmps426()
1692 type = vreg->logical_type; in spmi_regulator_init_registers()
1699 if (!(data->pin_ctrl_enable & SPMI_REGULATOR_PIN_CTRL_ENABLE_HW_DEFAULT)) { in spmi_regulator_init_registers()
1707 data->pin_ctrl_enable & SPMI_COMMON_ENABLE_FOLLOW_ALL_MASK; in spmi_regulator_init_registers()
1715 if (!(data->pin_ctrl_hpm & SPMI_REGULATOR_PIN_CTRL_HPM_HW_DEFAULT)) { in spmi_regulator_init_registers()
1722 data->pin_ctrl_hpm & SPMI_COMMON_MODE_FOLLOW_ALL_MASK; in spmi_regulator_init_registers()
1731 data->pin_ctrl_hpm & SPMI_COMMON_MODE_FOLLOW_AWAKE_MASK; in spmi_regulator_init_registers()
1745 if (data->vs_soft_start_strength in spmi_regulator_init_registers()
1747 reg = data->vs_soft_start_strength in spmi_regulator_init_registers()
1766 data->pin_ctrl_enable = SPMI_REGULATOR_PIN_CTRL_ENABLE_HW_DEFAULT; in spmi_regulator_get_dt_config()
1767 data->pin_ctrl_hpm = SPMI_REGULATOR_PIN_CTRL_HPM_HW_DEFAULT; in spmi_regulator_get_dt_config()
1768 data->vs_soft_start_strength = SPMI_VS_SOFT_START_STR_HW_DEFAULT; in spmi_regulator_get_dt_config()
1771 of_property_read_u32(node, "qcom,ocp-max-retries", in spmi_regulator_get_dt_config()
1772 &vreg->ocp_max_retries); in spmi_regulator_get_dt_config()
1773 of_property_read_u32(node, "qcom,ocp-retry-delay", in spmi_regulator_get_dt_config()
1774 &vreg->ocp_retry_delay_ms); in spmi_regulator_get_dt_config()
1775 of_property_read_u32(node, "qcom,pin-ctrl-enable", in spmi_regulator_get_dt_config()
1776 &data->pin_ctrl_enable); in spmi_regulator_get_dt_config()
1777 of_property_read_u32(node, "qcom,pin-ctrl-hpm", &data->pin_ctrl_hpm); in spmi_regulator_get_dt_config()
1778 of_property_read_u32(node, "qcom,vs-soft-start-strength", in spmi_regulator_get_dt_config()
1779 &data->vs_soft_start_strength); in spmi_regulator_get_dt_config()
1797 struct spmi_regulator *vreg = config->driver_data; in spmi_regulator_of_parse()
1798 struct device *dev = config->dev; in spmi_regulator_of_parse()
1803 if (!vreg->ocp_max_retries) in spmi_regulator_of_parse()
1804 vreg->ocp_max_retries = SPMI_VS_OCP_DEFAULT_MAX_RETRIES; in spmi_regulator_of_parse()
1805 if (!vreg->ocp_retry_delay_ms) in spmi_regulator_of_parse()
1806 vreg->ocp_retry_delay_ms = SPMI_VS_OCP_DEFAULT_RETRY_DELAY_MS; in spmi_regulator_of_parse()
1814 switch (vreg->logical_type) { in spmi_regulator_of_parse()
1839 if (vreg->logical_type != SPMI_REGULATOR_LOGICAL_TYPE_VS) in spmi_regulator_of_parse()
1840 vreg->ocp_irq = 0; in spmi_regulator_of_parse()
1842 if (vreg->ocp_irq) { in spmi_regulator_of_parse()
1843 ret = devm_request_irq(dev, vreg->ocp_irq, in spmi_regulator_of_parse()
1848 vreg->ocp_irq, ret); in spmi_regulator_of_parse()
1852 ret = devm_delayed_work_autocancel(dev, &vreg->ocp_work, in spmi_regulator_of_parse()
1893 { "5vs1", 0x8300, "vin_5vs", "ocp-5vs1", },
1894 { "5vs2", 0x8400, "vin_5vs", "ocp-5vs2", },
2096 { .compatible = "qcom,pm8004-regulators", .data = &pm8004_regulators },
2097 { .compatible = "qcom,pm8005-regulators", .data = &pm8005_regulators },
2098 { .compatible = "qcom,pm8841-regulators", .data = &pm8841_regulators },
2099 { .compatible = "qcom,pm8916-regulators", .data = &pm8916_regulators },
2100 { .compatible = "qcom,pm8941-regulators", .data = &pm8941_regulators },
2101 { .compatible = "qcom,pm8950-regulators", .data = &pm8950_regulators },
2102 { .compatible = "qcom,pm8994-regulators", .data = &pm8994_regulators },
2103 { .compatible = "qcom,pmi8994-regulators", .data = &pmi8994_regulators },
2104 { .compatible = "qcom,pm660-regulators", .data = &pm660_regulators },
2105 { .compatible = "qcom,pm660l-regulators", .data = &pm660l_regulators },
2106 { .compatible = "qcom,pms405-regulators", .data = &pms405_regulators },
2121 struct device *dev = &pdev->dev; in qcom_spmi_regulator_probe()
2122 struct device_node *node = pdev->dev.of_node; in qcom_spmi_regulator_probe()
2130 return -ENOMEM; in qcom_spmi_regulator_probe()
2134 regmap = dev_get_regmap(dev->parent, NULL); in qcom_spmi_regulator_probe()
2136 return -ENODEV; in qcom_spmi_regulator_probe()
2138 match = of_match_device(qcom_spmi_regulator_match, &pdev->dev); in qcom_spmi_regulator_probe()
2140 return -ENODEV; in qcom_spmi_regulator_probe()
2142 if (of_find_property(node, "qcom,saw-reg", &lenp)) { in qcom_spmi_regulator_probe()
2143 syscon = of_parse_phandle(node, "qcom,saw-reg", 0); in qcom_spmi_regulator_probe()
2150 for (reg = match->data; reg->name; reg++) { in qcom_spmi_regulator_probe()
2153 reg_node = of_get_child_by_name(node, reg->name); in qcom_spmi_regulator_probe()
2154 reg_prop = of_find_property(reg_node, "qcom,saw-slave", in qcom_spmi_regulator_probe()
2163 return -ENOMEM; in qcom_spmi_regulator_probe()
2165 vreg->dev = dev; in qcom_spmi_regulator_probe()
2166 vreg->base = reg->base; in qcom_spmi_regulator_probe()
2167 vreg->regmap = regmap; in qcom_spmi_regulator_probe()
2168 if (reg->ocp) { in qcom_spmi_regulator_probe()
2169 vreg->ocp_irq = platform_get_irq_byname(pdev, reg->ocp); in qcom_spmi_regulator_probe()
2170 if (vreg->ocp_irq < 0) in qcom_spmi_regulator_probe()
2171 return vreg->ocp_irq; in qcom_spmi_regulator_probe()
2173 vreg->desc.id = -1; in qcom_spmi_regulator_probe()
2174 vreg->desc.owner = THIS_MODULE; in qcom_spmi_regulator_probe()
2175 vreg->desc.type = REGULATOR_VOLTAGE; in qcom_spmi_regulator_probe()
2176 vreg->desc.enable_reg = reg->base + SPMI_COMMON_REG_ENABLE; in qcom_spmi_regulator_probe()
2177 vreg->desc.enable_mask = SPMI_COMMON_ENABLE_MASK; in qcom_spmi_regulator_probe()
2178 vreg->desc.enable_val = SPMI_COMMON_ENABLE; in qcom_spmi_regulator_probe()
2179 vreg->desc.name = name = reg->name; in qcom_spmi_regulator_probe()
2180 vreg->desc.supply_name = reg->supply; in qcom_spmi_regulator_probe()
2181 vreg->desc.of_match = reg->name; in qcom_spmi_regulator_probe()
2182 vreg->desc.of_parse_cb = spmi_regulator_of_parse; in qcom_spmi_regulator_probe()
2183 vreg->desc.of_map_mode = spmi_regulator_of_map_mode; in qcom_spmi_regulator_probe()
2185 ret = spmi_regulator_match(vreg, reg->force_type); in qcom_spmi_regulator_probe()
2190 reg_node = of_get_child_by_name(node, reg->name); in qcom_spmi_regulator_probe()
2191 reg_prop = of_find_property(reg_node, "qcom,saw-leader", in qcom_spmi_regulator_probe()
2195 spmi_saw_ops = *(vreg->desc.ops); in qcom_spmi_regulator_probe()
2198 vreg->desc.ops = &spmi_saw_ops; in qcom_spmi_regulator_probe()
2202 if (vreg->set_points && vreg->set_points->count == 1) { in qcom_spmi_regulator_probe()
2204 range = vreg->set_points->range; in qcom_spmi_regulator_probe()
2205 vreg->desc.uV_step = range->step_uV; in qcom_spmi_regulator_probe()
2211 rdev = devm_regulator_register(dev, &vreg->desc, &config); in qcom_spmi_regulator_probe()
2217 INIT_LIST_HEAD(&vreg->node); in qcom_spmi_regulator_probe()
2218 list_add(&vreg->node, vreg_list); in qcom_spmi_regulator_probe()
2226 .name = "qcom-spmi-regulator",
2235 MODULE_ALIAS("platform:qcom-spmi-regulator");