Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

add pmic pca9451a support

Merge series from Joy Zou <joy.zou@nxp.com>:

The patchset supports pmic pca9451a.
For the details, please check the patch commit log.

---
Changes in v5:
- adjust gpio@22 to the front of pmic@25.

Changes in v4:
- modify the comment for uSDHC but not i2c.

Changes in v3:
- modify the dts voltags constraints.
- remove unnecessary changes in driver code.
- modify commit message.
- add tag for dt-bindings.

Changes in v2:
- drop old part support.

Joy Zou (3):
regulator: dt-bindings: pca9450: add pca9451a support
regulator: pca9450: add pca9451a support
arm64: dts: imx93-11x11-evk: add pca9451a support

.../regulator/nxp,pca9450-regulator.yaml | 1 +
.../boot/dts/freescale/imx93-11x11-evk.dts | 111 ++++++++++
drivers/regulator/pca9450-regulator.c | 194 +++++++++++++++++-
include/linux/regulator/pca9450.h | 1 +
4 files changed, 305 insertions(+), 2 deletions(-)

--
2.37.1

+194 -2
+1
Documentation/devicetree/bindings/regulator/nxp,pca9450-regulator.yaml
··· 28 28 - nxp,pca9450a 29 29 - nxp,pca9450b 30 30 - nxp,pca9450c 31 + - nxp,pca9451a 31 32 32 33 reg: 33 34 maxItems: 1
+192 -2
drivers/regulator/pca9450-regulator.c
··· 107 107 }; 108 108 109 109 /* 110 + * BUCK1/3 111 + * 0.65 to 2.2375V (12.5mV step) 112 + */ 113 + static const struct linear_range pca9451a_dvs_buck_volts[] = { 114 + REGULATOR_LINEAR_RANGE(650000, 0x00, 0x7F, 12500), 115 + }; 116 + 117 + /* 110 118 * BUCK4/5/6 111 119 * 0.6V to 3.4V (25mV step) 112 120 */ ··· 670 662 }, 671 663 }; 672 664 665 + static const struct pca9450_regulator_desc pca9451a_regulators[] = { 666 + { 667 + .desc = { 668 + .name = "buck1", 669 + .of_match = of_match_ptr("BUCK1"), 670 + .regulators_node = of_match_ptr("regulators"), 671 + .id = PCA9450_BUCK1, 672 + .ops = &pca9450_dvs_buck_regulator_ops, 673 + .type = REGULATOR_VOLTAGE, 674 + .n_voltages = PCA9450_BUCK1_VOLTAGE_NUM, 675 + .linear_ranges = pca9451a_dvs_buck_volts, 676 + .n_linear_ranges = ARRAY_SIZE(pca9451a_dvs_buck_volts), 677 + .vsel_reg = PCA9450_REG_BUCK1OUT_DVS0, 678 + .vsel_mask = BUCK1OUT_DVS0_MASK, 679 + .enable_reg = PCA9450_REG_BUCK1CTRL, 680 + .enable_mask = BUCK1_ENMODE_MASK, 681 + .enable_val = BUCK_ENMODE_ONREQ, 682 + .ramp_mask = BUCK1_RAMP_MASK, 683 + .ramp_delay_table = pca9450_dvs_buck_ramp_table, 684 + .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table), 685 + .owner = THIS_MODULE, 686 + .of_parse_cb = pca9450_set_dvs_levels, 687 + }, 688 + .dvs = { 689 + .run_reg = PCA9450_REG_BUCK1OUT_DVS0, 690 + .run_mask = BUCK1OUT_DVS0_MASK, 691 + .standby_reg = PCA9450_REG_BUCK1OUT_DVS1, 692 + .standby_mask = BUCK1OUT_DVS1_MASK, 693 + }, 694 + }, 695 + { 696 + .desc = { 697 + .name = "buck2", 698 + .of_match = of_match_ptr("BUCK2"), 699 + .regulators_node = of_match_ptr("regulators"), 700 + .id = PCA9450_BUCK2, 701 + .ops = &pca9450_dvs_buck_regulator_ops, 702 + .type = REGULATOR_VOLTAGE, 703 + .n_voltages = PCA9450_BUCK2_VOLTAGE_NUM, 704 + .linear_ranges = pca9450_dvs_buck_volts, 705 + .n_linear_ranges = ARRAY_SIZE(pca9450_dvs_buck_volts), 706 + .vsel_reg = PCA9450_REG_BUCK2OUT_DVS0, 707 + .vsel_mask = BUCK2OUT_DVS0_MASK, 708 + .enable_reg = PCA9450_REG_BUCK2CTRL, 709 + .enable_mask = BUCK2_ENMODE_MASK, 710 + .enable_val = BUCK_ENMODE_ONREQ_STBYREQ, 711 + .ramp_mask = BUCK2_RAMP_MASK, 712 + .ramp_delay_table = pca9450_dvs_buck_ramp_table, 713 + .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table), 714 + .owner = THIS_MODULE, 715 + .of_parse_cb = pca9450_set_dvs_levels, 716 + }, 717 + .dvs = { 718 + .run_reg = PCA9450_REG_BUCK2OUT_DVS0, 719 + .run_mask = BUCK2OUT_DVS0_MASK, 720 + .standby_reg = PCA9450_REG_BUCK2OUT_DVS1, 721 + .standby_mask = BUCK2OUT_DVS1_MASK, 722 + }, 723 + }, 724 + { 725 + .desc = { 726 + .name = "buck4", 727 + .of_match = of_match_ptr("BUCK4"), 728 + .regulators_node = of_match_ptr("regulators"), 729 + .id = PCA9450_BUCK4, 730 + .ops = &pca9450_buck_regulator_ops, 731 + .type = REGULATOR_VOLTAGE, 732 + .n_voltages = PCA9450_BUCK4_VOLTAGE_NUM, 733 + .linear_ranges = pca9450_buck_volts, 734 + .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts), 735 + .vsel_reg = PCA9450_REG_BUCK4OUT, 736 + .vsel_mask = BUCK4OUT_MASK, 737 + .enable_reg = PCA9450_REG_BUCK4CTRL, 738 + .enable_mask = BUCK4_ENMODE_MASK, 739 + .enable_val = BUCK_ENMODE_ONREQ, 740 + .owner = THIS_MODULE, 741 + }, 742 + }, 743 + { 744 + .desc = { 745 + .name = "buck5", 746 + .of_match = of_match_ptr("BUCK5"), 747 + .regulators_node = of_match_ptr("regulators"), 748 + .id = PCA9450_BUCK5, 749 + .ops = &pca9450_buck_regulator_ops, 750 + .type = REGULATOR_VOLTAGE, 751 + .n_voltages = PCA9450_BUCK5_VOLTAGE_NUM, 752 + .linear_ranges = pca9450_buck_volts, 753 + .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts), 754 + .vsel_reg = PCA9450_REG_BUCK5OUT, 755 + .vsel_mask = BUCK5OUT_MASK, 756 + .enable_reg = PCA9450_REG_BUCK5CTRL, 757 + .enable_mask = BUCK5_ENMODE_MASK, 758 + .enable_val = BUCK_ENMODE_ONREQ, 759 + .owner = THIS_MODULE, 760 + }, 761 + }, 762 + { 763 + .desc = { 764 + .name = "buck6", 765 + .of_match = of_match_ptr("BUCK6"), 766 + .regulators_node = of_match_ptr("regulators"), 767 + .id = PCA9450_BUCK6, 768 + .ops = &pca9450_buck_regulator_ops, 769 + .type = REGULATOR_VOLTAGE, 770 + .n_voltages = PCA9450_BUCK6_VOLTAGE_NUM, 771 + .linear_ranges = pca9450_buck_volts, 772 + .n_linear_ranges = ARRAY_SIZE(pca9450_buck_volts), 773 + .vsel_reg = PCA9450_REG_BUCK6OUT, 774 + .vsel_mask = BUCK6OUT_MASK, 775 + .enable_reg = PCA9450_REG_BUCK6CTRL, 776 + .enable_mask = BUCK6_ENMODE_MASK, 777 + .enable_val = BUCK_ENMODE_ONREQ, 778 + .owner = THIS_MODULE, 779 + }, 780 + }, 781 + { 782 + .desc = { 783 + .name = "ldo1", 784 + .of_match = of_match_ptr("LDO1"), 785 + .regulators_node = of_match_ptr("regulators"), 786 + .id = PCA9450_LDO1, 787 + .ops = &pca9450_ldo_regulator_ops, 788 + .type = REGULATOR_VOLTAGE, 789 + .n_voltages = PCA9450_LDO1_VOLTAGE_NUM, 790 + .linear_ranges = pca9450_ldo1_volts, 791 + .n_linear_ranges = ARRAY_SIZE(pca9450_ldo1_volts), 792 + .vsel_reg = PCA9450_REG_LDO1CTRL, 793 + .vsel_mask = LDO1OUT_MASK, 794 + .enable_reg = PCA9450_REG_LDO1CTRL, 795 + .enable_mask = LDO1_EN_MASK, 796 + .owner = THIS_MODULE, 797 + }, 798 + }, 799 + { 800 + .desc = { 801 + .name = "ldo4", 802 + .of_match = of_match_ptr("LDO4"), 803 + .regulators_node = of_match_ptr("regulators"), 804 + .id = PCA9450_LDO4, 805 + .ops = &pca9450_ldo_regulator_ops, 806 + .type = REGULATOR_VOLTAGE, 807 + .n_voltages = PCA9450_LDO4_VOLTAGE_NUM, 808 + .linear_ranges = pca9450_ldo34_volts, 809 + .n_linear_ranges = ARRAY_SIZE(pca9450_ldo34_volts), 810 + .vsel_reg = PCA9450_REG_LDO4CTRL, 811 + .vsel_mask = LDO4OUT_MASK, 812 + .enable_reg = PCA9450_REG_LDO4CTRL, 813 + .enable_mask = LDO4_EN_MASK, 814 + .owner = THIS_MODULE, 815 + }, 816 + }, 817 + { 818 + .desc = { 819 + .name = "ldo5", 820 + .of_match = of_match_ptr("LDO5"), 821 + .regulators_node = of_match_ptr("regulators"), 822 + .id = PCA9450_LDO5, 823 + .ops = &pca9450_ldo_regulator_ops, 824 + .type = REGULATOR_VOLTAGE, 825 + .n_voltages = PCA9450_LDO5_VOLTAGE_NUM, 826 + .linear_ranges = pca9450_ldo5_volts, 827 + .n_linear_ranges = ARRAY_SIZE(pca9450_ldo5_volts), 828 + .vsel_reg = PCA9450_REG_LDO5CTRL_H, 829 + .vsel_mask = LDO5HOUT_MASK, 830 + .enable_reg = PCA9450_REG_LDO5CTRL_H, 831 + .enable_mask = LDO5H_EN_MASK, 832 + .owner = THIS_MODULE, 833 + }, 834 + }, 835 + }; 836 + 673 837 static irqreturn_t pca9450_irq_handler(int irq, void *data) 674 838 { 675 839 struct pca9450 *pca9450 = data; ··· 909 729 regulator_desc = pca9450bc_regulators; 910 730 pca9450->rcnt = ARRAY_SIZE(pca9450bc_regulators); 911 731 break; 732 + case PCA9450_TYPE_PCA9451A: 733 + regulator_desc = pca9451a_regulators; 734 + pca9450->rcnt = ARRAY_SIZE(pca9451a_regulators); 735 + break; 912 736 default: 913 737 dev_err(&i2c->dev, "Unknown device type"); 914 738 return -EINVAL; ··· 939 755 940 756 /* Check your board and dts for match the right pmic */ 941 757 if (((device_id >> 4) != 0x1 && type == PCA9450_TYPE_PCA9450A) || 942 - ((device_id >> 4) != 0x3 && type == PCA9450_TYPE_PCA9450BC)) { 758 + ((device_id >> 4) != 0x3 && type == PCA9450_TYPE_PCA9450BC) || 759 + ((device_id >> 4) != 0x9 && type == PCA9450_TYPE_PCA9451A)) { 943 760 dev_err(&i2c->dev, "Device id(%x) mismatched\n", 944 761 device_id >> 4); 945 762 return -EINVAL; ··· 1031 846 } 1032 847 1033 848 dev_info(&i2c->dev, "%s probed.\n", 1034 - type == PCA9450_TYPE_PCA9450A ? "pca9450a" : "pca9450bc"); 849 + type == PCA9450_TYPE_PCA9450A ? "pca9450a" : 850 + (type == PCA9450_TYPE_PCA9451A ? "pca9451a" : "pca9450bc")); 1035 851 1036 852 return 0; 1037 853 } ··· 1049 863 { 1050 864 .compatible = "nxp,pca9450c", 1051 865 .data = (void *)PCA9450_TYPE_PCA9450BC, 866 + }, 867 + { 868 + .compatible = "nxp,pca9451a", 869 + .data = (void *)PCA9450_TYPE_PCA9451A, 1052 870 }, 1053 871 { } 1054 872 };
+1
include/linux/regulator/pca9450.h
··· 9 9 enum pca9450_chip_type { 10 10 PCA9450_TYPE_PCA9450A = 0, 11 11 PCA9450_TYPE_PCA9450BC, 12 + PCA9450_TYPE_PCA9451A, 12 13 PCA9450_TYPE_AMOUNT, 13 14 }; 14 15