Lines Matching +full:pin +full:- +full:ctrl +full:- +full:hpm
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>
24 /* Pin control enable input pins. */
32 /* Pin control high power mode input pins. */
57 * struct spmi_regulator_init_data - spmi-regulator initialization data
64 * set, then pin control enable hardware registers
73 * set, then pin control mode hardware registers
365 * struct spmi_voltage_range - regulator set point voltage mapping description
380 * (max_uV - min_uV) % step_uV == 0
381 * (set_point_min_uV - min_uV) % step_uV == 0*
382 * (set_point_max_uV - min_uV) % step_uV == 0*
383 * n_voltages = (set_point_max_uV - set_point_min_uV) / step_uV + 1
478 ((_set_point_max_uV - _set_point_min_uV) / _step_uV) + 1 : \
630 return regmap_bulk_read(vreg->regmap, vreg->base + addr, buf, len); in spmi_vreg_read()
636 return regmap_bulk_write(vreg->regmap, vreg->base + addr, buf, len); in spmi_vreg_write()
642 return regmap_update_bits(vreg->regmap, vreg->base + addr, mask, val); in spmi_vreg_update_bits()
649 if (vreg->ocp_irq) { in spmi_regulator_vs_enable()
650 vreg->ocp_count = 0; in spmi_regulator_vs_enable()
651 vreg->vs_enable_time = ktime_get(); in spmi_regulator_vs_enable()
664 return -EINVAL; in spmi_regulator_vs_ocp()
678 lim_min_uV = vreg->set_points->range[0].set_point_min_uV; in spmi_regulator_select_voltage()
680 vreg->set_points->range[vreg->set_points->count - 1].set_point_max_uV; in spmi_regulator_select_voltage()
686 dev_err(vreg->dev, in spmi_regulator_select_voltage()
689 return -EINVAL; in spmi_regulator_select_voltage()
693 for (i = vreg->set_points->count - 1; i > 0; i--) { in spmi_regulator_select_voltage()
694 range_max_uV = vreg->set_points->range[i - 1].set_point_max_uV; in spmi_regulator_select_voltage()
700 range = &vreg->set_points->range[range_id]; in spmi_regulator_select_voltage()
706 voltage_sel = DIV_ROUND_UP(uV - range->min_uV, range->step_uV); in spmi_regulator_select_voltage()
707 uV = voltage_sel * range->step_uV + range->min_uV; in spmi_regulator_select_voltage()
710 dev_err(vreg->dev, in spmi_regulator_select_voltage()
714 return -EINVAL; in spmi_regulator_select_voltage()
719 selector += vreg->set_points->range[i].n_voltages; in spmi_regulator_select_voltage()
720 selector += (uV - range->set_point_min_uV) / range->step_uV; in spmi_regulator_select_voltage()
732 range = vreg->set_points->range; in spmi_sw_selector_to_hw()
733 end = range + vreg->set_points->count; in spmi_sw_selector_to_hw()
736 if (selector < range->n_voltages) { in spmi_sw_selector_to_hw()
741 offset = range->set_point_min_uV - range->min_uV; in spmi_sw_selector_to_hw()
742 offset /= range->step_uV; in spmi_sw_selector_to_hw()
744 *range_sel = range->range_sel; in spmi_sw_selector_to_hw()
748 selector -= range->n_voltages; in spmi_sw_selector_to_hw()
751 return -EINVAL; in spmi_sw_selector_to_hw()
759 const struct spmi_voltage_range *r = vreg->set_points->range; in spmi_hw_selector_to_sw()
760 const struct spmi_voltage_range *end = r + vreg->set_points->count; in spmi_hw_selector_to_sw()
763 if (r == range && range->n_voltages) { in spmi_hw_selector_to_sw()
770 offset = range->set_point_min_uV - range->min_uV; in spmi_hw_selector_to_sw()
771 offset /= range->step_uV; in spmi_hw_selector_to_sw()
773 return -EINVAL; in spmi_hw_selector_to_sw()
775 max_hw_sel = range->set_point_max_uV - range->min_uV; in spmi_hw_selector_to_sw()
776 max_hw_sel /= range->step_uV; in spmi_hw_selector_to_sw()
778 return -EINVAL; in spmi_hw_selector_to_sw()
780 return sw_sel + hw_sel - offset; in spmi_hw_selector_to_sw()
782 sw_sel += r->n_voltages; in spmi_hw_selector_to_sw()
785 return -EINVAL; in spmi_hw_selector_to_sw()
794 range = vreg->set_points->range; in spmi_regulator_find_range()
795 end = range + vreg->set_points->count; in spmi_regulator_find_range()
800 if (range->range_sel == range_sel) in spmi_regulator_find_range()
817 if (uV < range->min_uV && max_uV >= range->min_uV) in spmi_regulator_select_voltage_same_range()
818 uV = range->min_uV; in spmi_regulator_select_voltage_same_range()
820 if (uV < range->min_uV || uV > range->max_uV) { in spmi_regulator_select_voltage_same_range()
829 uV = DIV_ROUND_UP(uV - range->min_uV, range->step_uV); in spmi_regulator_select_voltage_same_range()
830 uV = uV * range->step_uV + range->min_uV; in spmi_regulator_select_voltage_same_range()
841 for (i = 0; i < vreg->set_points->count; i++) { in spmi_regulator_select_voltage_same_range()
842 if (uV >= vreg->set_points->range[i].set_point_min_uV in spmi_regulator_select_voltage_same_range()
843 && uV <= vreg->set_points->range[i].set_point_max_uV) { in spmi_regulator_select_voltage_same_range()
845 (uV - vreg->set_points->range[i].set_point_min_uV) in spmi_regulator_select_voltage_same_range()
846 / vreg->set_points->range[i].step_uV; in spmi_regulator_select_voltage_same_range()
850 selector += vreg->set_points->range[i].n_voltages; in spmi_regulator_select_voltage_same_range()
853 if (selector >= vreg->set_points->n_voltages) in spmi_regulator_select_voltage_same_range()
914 diff_uV = abs(spmi_regulator_common_list_voltage(rdev, new_selector) - in spmi_regulator_set_voltage_time_sel()
917 return DIV_ROUND_UP(diff_uV, vreg->slew_rate); in spmi_regulator_set_voltage_time_sel()
930 return -EINVAL; in spmi_regulator_common_get_voltage()
945 range = vreg->set_points->range; in spmi_regulator_ftsmps426_get_voltage()
947 return (uV - range->set_point_min_uV) / range->step_uV; in spmi_regulator_ftsmps426_get_voltage()
999 * 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()
1019 return -EINVAL; in spmi_regulator_ult_lo_smps_get_voltage()
1021 if (range->range_sel == 1) in spmi_regulator_ult_lo_smps_get_voltage()
1034 if (selector >= vreg->set_points->n_voltages) in spmi_regulator_common_list_voltage()
1037 for (i = 0; i < vreg->set_points->count; i++) { in spmi_regulator_common_list_voltage()
1038 if (selector < vreg->set_points->range[i].n_voltages) { in spmi_regulator_common_list_voltage()
1039 uV = selector * vreg->set_points->range[i].step_uV in spmi_regulator_common_list_voltage()
1040 + vreg->set_points->range[i].set_point_min_uV; in spmi_regulator_common_list_voltage()
1044 selector -= vreg->set_points->range[i].n_voltages; in spmi_regulator_common_list_voltage()
1169 return -EINVAL; in spmi_regulator_ftsmps426_set_mode()
1190 val = vreg->logical_type == in spmi_regulator_hfsmps_set_mode()
1196 return -EINVAL; in spmi_regulator_hfsmps_set_mode()
1208 if (load_uA >= vreg->hpm_min_load) in spmi_regulator_common_set_load()
1246 enum spmi_regulator_logical_type type = vreg->logical_type; in spmi_regulator_set_ilim()
1259 return -EINVAL; in spmi_regulator_set_ilim()
1261 reg = (ilim_uA - 1) / 500; in spmi_regulator_set_ilim()
1274 vreg->vs_enable_time = ktime_get(); in spmi_regulator_vs_clear_ocp()
1299 vreg->vs_enable_time); in spmi_regulator_vs_ocp_isr()
1307 vreg->ocp_count = 0; in spmi_regulator_vs_ocp_isr()
1312 vreg->ocp_count++; in spmi_regulator_vs_ocp_isr()
1314 if (vreg->ocp_count == 1) { in spmi_regulator_vs_ocp_isr()
1317 } else if (vreg->ocp_count <= vreg->ocp_max_retries) { in spmi_regulator_vs_ocp_isr()
1319 schedule_delayed_work(&vreg->ocp_work, in spmi_regulator_vs_ocp_isr()
1320 msecs_to_jiffies(vreg->ocp_retry_delay_ms) + 1); in spmi_regulator_vs_ocp_isr()
1322 dev_err(vreg->dev, in spmi_regulator_vs_ocp_isr()
1324 vreg->ocp_count); in spmi_regulator_vs_ocp_isr()
1382 avs_ctl |= ((pmic_sts - 4) << 10); in spmi_saw_set_vdd()
1401 dev_dbg(&rdev->dev, "range_sel = %02X voltage_sel = %02X", \ in spmi_regulator_saw_set_voltage()
1403 return -EINVAL; in spmi_regulator_saw_set_voltage()
1682 const struct spmi_voltage_range *range = points->range; in spmi_calculate_num_voltages()
1684 for (; range < points->range + points->count; range++) in spmi_calculate_num_voltages()
1685 points->n_voltages += range->n_voltages; in spmi_calculate_num_voltages()
1693 u8 version[SPMI_COMMON_REG_SUBTYPE - SPMI_COMMON_REG_DIG_MAJOR_REV + 1]; in spmi_regulator_match()
1699 dev_dbg(vreg->dev, "could not read version registers\n"); in spmi_regulator_match()
1703 - SPMI_COMMON_REG_DIG_MAJOR_REV]; in spmi_regulator_match()
1706 type = version[SPMI_COMMON_REG_TYPE - in spmi_regulator_match()
1708 subtype = version[SPMI_COMMON_REG_SUBTYPE - in spmi_regulator_match()
1717 if (mapping->type == type && mapping->subtype == subtype in spmi_regulator_match()
1718 && mapping->revision_min <= dig_major_rev in spmi_regulator_match()
1719 && mapping->revision_max >= dig_major_rev) in spmi_regulator_match()
1723 dev_err(vreg->dev, in spmi_regulator_match()
1725 vreg->desc.name, type, subtype, dig_major_rev); in spmi_regulator_match()
1727 return -ENODEV; in spmi_regulator_match()
1730 vreg->logical_type = mapping->logical_type; in spmi_regulator_match()
1731 vreg->set_points = mapping->set_points; in spmi_regulator_match()
1732 vreg->hpm_min_load = mapping->hpm_min_load; in spmi_regulator_match()
1733 vreg->desc.ops = mapping->ops; in spmi_regulator_match()
1735 if (mapping->set_points) { in spmi_regulator_match()
1736 if (!mapping->set_points->n_voltages) in spmi_regulator_match()
1737 spmi_calculate_num_voltages(mapping->set_points); in spmi_regulator_match()
1738 vreg->desc.n_voltages = mapping->set_points->n_voltages; in spmi_regulator_match()
1753 dev_err(vreg->dev, "spmi read failed, ret=%d\n", ret); in spmi_regulator_init_slew_rate()
1759 return -EINVAL; in spmi_regulator_init_slew_rate()
1761 switch (vreg->logical_type) { in spmi_regulator_init_slew_rate()
1777 slew_rate = SPMI_FTSMPS_CLOCK_RATE * range->step_uV * (1 << step); in spmi_regulator_init_slew_rate()
1783 vreg->slew_rate = max(slew_rate, 1); in spmi_regulator_init_slew_rate()
1794 const struct spmi_voltage_range *range = &vreg->set_points->range[0]; in spmi_regulator_init_slew_rate_ftsmps426()
1798 dev_err(vreg->dev, "spmi read failed, ret=%d\n", ret); in spmi_regulator_init_slew_rate_ftsmps426()
1806 slew_rate = clock_rate * range->step_uV; in spmi_regulator_init_slew_rate_ftsmps426()
1812 vreg->slew_rate = max(slew_rate, 1); in spmi_regulator_init_slew_rate_ftsmps426()
1825 dev_err(vreg->dev, "spmi read failed, ret=%d\n", ret); in spmi_regulator_init_slew_rate_hfsmps()
1832 vreg->slew_rate = SPMI_HFSMPS_SLEW_RATE_38p4 >> delay; in spmi_regulator_init_slew_rate_hfsmps()
1844 type = vreg->logical_type; in spmi_regulator_init_registers()
1850 /* Set up enable pin control. */ in spmi_regulator_init_registers()
1851 if (!(data->pin_ctrl_enable & SPMI_REGULATOR_PIN_CTRL_ENABLE_HW_DEFAULT)) { in spmi_regulator_init_registers()
1859 data->pin_ctrl_enable & SPMI_COMMON_ENABLE_FOLLOW_ALL_MASK; in spmi_regulator_init_registers()
1866 /* Set up mode pin control. */ in spmi_regulator_init_registers()
1867 if (!(data->pin_ctrl_hpm & SPMI_REGULATOR_PIN_CTRL_HPM_HW_DEFAULT)) { in spmi_regulator_init_registers()
1874 data->pin_ctrl_hpm & SPMI_COMMON_MODE_FOLLOW_ALL_MASK; in spmi_regulator_init_registers()
1883 data->pin_ctrl_hpm & SPMI_COMMON_MODE_FOLLOW_AWAKE_MASK; in spmi_regulator_init_registers()
1897 if (data->vs_soft_start_strength in spmi_regulator_init_registers()
1899 reg = data->vs_soft_start_strength in spmi_regulator_init_registers()
1918 data->pin_ctrl_enable = SPMI_REGULATOR_PIN_CTRL_ENABLE_HW_DEFAULT; in spmi_regulator_get_dt_config()
1919 data->pin_ctrl_hpm = SPMI_REGULATOR_PIN_CTRL_HPM_HW_DEFAULT; in spmi_regulator_get_dt_config()
1920 data->vs_soft_start_strength = SPMI_VS_SOFT_START_STR_HW_DEFAULT; in spmi_regulator_get_dt_config()
1923 of_property_read_u32(node, "qcom,ocp-max-retries", in spmi_regulator_get_dt_config()
1924 &vreg->ocp_max_retries); in spmi_regulator_get_dt_config()
1925 of_property_read_u32(node, "qcom,ocp-retry-delay", in spmi_regulator_get_dt_config()
1926 &vreg->ocp_retry_delay_ms); in spmi_regulator_get_dt_config()
1927 of_property_read_u32(node, "qcom,pin-ctrl-enable", in spmi_regulator_get_dt_config()
1928 &data->pin_ctrl_enable); in spmi_regulator_get_dt_config()
1929 of_property_read_u32(node, "qcom,pin-ctrl-hpm", &data->pin_ctrl_hpm); in spmi_regulator_get_dt_config()
1930 of_property_read_u32(node, "qcom,vs-soft-start-strength", in spmi_regulator_get_dt_config()
1931 &data->vs_soft_start_strength); in spmi_regulator_get_dt_config()
1949 struct spmi_regulator *vreg = config->driver_data; in spmi_regulator_of_parse()
1950 struct device *dev = config->dev; in spmi_regulator_of_parse()
1955 if (!vreg->ocp_max_retries) in spmi_regulator_of_parse()
1956 vreg->ocp_max_retries = SPMI_VS_OCP_DEFAULT_MAX_RETRIES; in spmi_regulator_of_parse()
1957 if (!vreg->ocp_retry_delay_ms) in spmi_regulator_of_parse()
1958 vreg->ocp_retry_delay_ms = SPMI_VS_OCP_DEFAULT_RETRY_DELAY_MS; in spmi_regulator_of_parse()
1966 switch (vreg->logical_type) { in spmi_regulator_of_parse()
1997 if (vreg->logical_type != SPMI_REGULATOR_LOGICAL_TYPE_VS) in spmi_regulator_of_parse()
1998 vreg->ocp_irq = 0; in spmi_regulator_of_parse()
2000 if (vreg->ocp_irq) { in spmi_regulator_of_parse()
2001 ret = devm_request_irq(dev, vreg->ocp_irq, in spmi_regulator_of_parse()
2006 vreg->ocp_irq, ret); in spmi_regulator_of_parse()
2010 ret = devm_delayed_work_autocancel(dev, &vreg->ocp_work, in spmi_regulator_of_parse()
2302 { "5vs1", 0x8300, "vin_5vs", "ocp-5vs1", },
2303 { "5vs2", 0x8400, "vin_5vs", "ocp-5vs2", },
2474 { .compatible = "qcom,pm6125-regulators", .data = &pm6125_regulators },
2475 { .compatible = "qcom,pm660-regulators", .data = &pm660_regulators },
2476 { .compatible = "qcom,pm660l-regulators", .data = &pm660l_regulators },
2477 { .compatible = "qcom,pm8004-regulators", .data = &pm8004_regulators },
2478 { .compatible = "qcom,pm8005-regulators", .data = &pm8005_regulators },
2479 { .compatible = "qcom,pm8019-regulators", .data = &pm8019_regulators },
2480 { .compatible = "qcom,pm8226-regulators", .data = &pm8226_regulators },
2481 { .compatible = "qcom,pm8841-regulators", .data = &pm8841_regulators },
2482 { .compatible = "qcom,pm8909-regulators", .data = &pm8909_regulators },
2483 { .compatible = "qcom,pm8916-regulators", .data = &pm8916_regulators },
2484 { .compatible = "qcom,pm8937-regulators", .data = &pm8937_regulators },
2485 { .compatible = "qcom,pm8941-regulators", .data = &pm8941_regulators },
2486 { .compatible = "qcom,pm8950-regulators", .data = &pm8950_regulators },
2487 { .compatible = "qcom,pm8994-regulators", .data = &pm8994_regulators },
2488 { .compatible = "qcom,pma8084-regulators", .data = &pma8084_regulators },
2489 { .compatible = "qcom,pmi8994-regulators", .data = &pmi8994_regulators },
2490 { .compatible = "qcom,pmp8074-regulators", .data = &pmp8074_regulators },
2491 { .compatible = "qcom,pms405-regulators", .data = &pms405_regulators },
2505 struct device *dev = &pdev->dev; in qcom_spmi_regulator_probe()
2506 struct device_node *node = pdev->dev.of_node; in qcom_spmi_regulator_probe()
2514 return -ENOMEM; in qcom_spmi_regulator_probe()
2518 regmap = dev_get_regmap(dev->parent, NULL); in qcom_spmi_regulator_probe()
2520 return -ENODEV; in qcom_spmi_regulator_probe()
2522 reg = device_get_match_data(&pdev->dev); in qcom_spmi_regulator_probe()
2524 return -ENODEV; in qcom_spmi_regulator_probe()
2526 syscon = of_parse_phandle(node, "qcom,saw-reg", 0); in qcom_spmi_regulator_probe()
2534 for (; reg->name; reg++) { in qcom_spmi_regulator_probe()
2537 reg_node = of_get_child_by_name(node, reg->name); in qcom_spmi_regulator_probe()
2538 reg_prop = of_find_property(reg_node, "qcom,saw-slave", in qcom_spmi_regulator_probe()
2547 return -ENOMEM; in qcom_spmi_regulator_probe()
2549 vreg->dev = dev; in qcom_spmi_regulator_probe()
2550 vreg->base = reg->base; in qcom_spmi_regulator_probe()
2551 vreg->regmap = regmap; in qcom_spmi_regulator_probe()
2552 if (reg->ocp) { in qcom_spmi_regulator_probe()
2553 vreg->ocp_irq = platform_get_irq_byname(pdev, reg->ocp); in qcom_spmi_regulator_probe()
2554 if (vreg->ocp_irq < 0) in qcom_spmi_regulator_probe()
2555 return vreg->ocp_irq; in qcom_spmi_regulator_probe()
2557 vreg->desc.id = -1; in qcom_spmi_regulator_probe()
2558 vreg->desc.owner = THIS_MODULE; in qcom_spmi_regulator_probe()
2559 vreg->desc.type = REGULATOR_VOLTAGE; in qcom_spmi_regulator_probe()
2560 vreg->desc.enable_reg = reg->base + SPMI_COMMON_REG_ENABLE; in qcom_spmi_regulator_probe()
2561 vreg->desc.enable_mask = SPMI_COMMON_ENABLE_MASK; in qcom_spmi_regulator_probe()
2562 vreg->desc.enable_val = SPMI_COMMON_ENABLE; in qcom_spmi_regulator_probe()
2563 vreg->desc.name = name = reg->name; in qcom_spmi_regulator_probe()
2564 vreg->desc.supply_name = reg->supply; in qcom_spmi_regulator_probe()
2565 vreg->desc.of_match = reg->name; in qcom_spmi_regulator_probe()
2566 vreg->desc.of_parse_cb = spmi_regulator_of_parse; in qcom_spmi_regulator_probe()
2567 vreg->desc.of_map_mode = spmi_regulator_of_map_mode; in qcom_spmi_regulator_probe()
2569 ret = spmi_regulator_match(vreg, reg->force_type); in qcom_spmi_regulator_probe()
2574 reg_node = of_get_child_by_name(node, reg->name); in qcom_spmi_regulator_probe()
2575 if (of_property_read_bool(reg_node, "qcom,saw-leader")) { in qcom_spmi_regulator_probe()
2576 spmi_saw_ops = *(vreg->desc.ops); in qcom_spmi_regulator_probe()
2579 vreg->desc.ops = &spmi_saw_ops; in qcom_spmi_regulator_probe()
2584 if (vreg->set_points && vreg->set_points->count == 1) { in qcom_spmi_regulator_probe()
2586 range = vreg->set_points->range; in qcom_spmi_regulator_probe()
2587 vreg->desc.uV_step = range->step_uV; in qcom_spmi_regulator_probe()
2593 rdev = devm_regulator_register(dev, &vreg->desc, &config); in qcom_spmi_regulator_probe()
2599 INIT_LIST_HEAD(&vreg->node); in qcom_spmi_regulator_probe()
2600 list_add(&vreg->node, vreg_list); in qcom_spmi_regulator_probe()
2608 .name = "qcom-spmi-regulator",
2618 MODULE_ALIAS("platform:qcom-spmi-regulator");