diff options
Diffstat (limited to 'drivers/regulator/max8997.c')
-rw-r--r-- | drivers/regulator/max8997.c | 163 |
1 files changed, 90 insertions, 73 deletions
diff --git a/drivers/regulator/max8997.c b/drivers/regulator/max8997.c index db09244bb3e..b88551be452 100644 --- a/drivers/regulator/max8997.c +++ b/drivers/regulator/max8997.c | |||
@@ -22,7 +22,6 @@ | |||
22 | */ | 22 | */ |
23 | 23 | ||
24 | #include <linux/bug.h> | 24 | #include <linux/bug.h> |
25 | #include <linux/delay.h> | ||
26 | #include <linux/err.h> | 25 | #include <linux/err.h> |
27 | #include <linux/gpio.h> | 26 | #include <linux/gpio.h> |
28 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
@@ -278,9 +277,7 @@ static int max8997_reg_is_enabled(struct regulator_dev *rdev) | |||
278 | u8 val; | 277 | u8 val; |
279 | 278 | ||
280 | ret = max8997_get_enable_register(rdev, ®, &mask, &pattern); | 279 | ret = max8997_get_enable_register(rdev, ®, &mask, &pattern); |
281 | if (ret == -EINVAL) | 280 | if (ret) |
282 | return 1; /* "not controllable" */ | ||
283 | else if (ret) | ||
284 | return ret; | 281 | return ret; |
285 | 282 | ||
286 | ret = max8997_read_reg(i2c, reg, &val); | 283 | ret = max8997_read_reg(i2c, reg, &val); |
@@ -382,7 +379,7 @@ static int max8997_get_voltage_register(struct regulator_dev *rdev, | |||
382 | return 0; | 379 | return 0; |
383 | } | 380 | } |
384 | 381 | ||
385 | static int max8997_get_voltage(struct regulator_dev *rdev) | 382 | static int max8997_get_voltage_sel(struct regulator_dev *rdev) |
386 | { | 383 | { |
387 | struct max8997_data *max8997 = rdev_get_drvdata(rdev); | 384 | struct max8997_data *max8997 = rdev_get_drvdata(rdev); |
388 | struct i2c_client *i2c = max8997->iodev->i2c; | 385 | struct i2c_client *i2c = max8997->iodev->i2c; |
@@ -400,15 +397,7 @@ static int max8997_get_voltage(struct regulator_dev *rdev) | |||
400 | val >>= shift; | 397 | val >>= shift; |
401 | val &= mask; | 398 | val &= mask; |
402 | 399 | ||
403 | if (rdev->desc && rdev->desc->ops && rdev->desc->ops->list_voltage) | 400 | return val; |
404 | return rdev->desc->ops->list_voltage(rdev, val); | ||
405 | |||
406 | /* | ||
407 | * max8997_list_voltage returns value for any rdev with voltage_map, | ||
408 | * which works for "CHARGER" and "CHARGER TOPOFF" that do not have | ||
409 | * list_voltage ops (they are current regulators). | ||
410 | */ | ||
411 | return max8997_list_voltage(rdev, val); | ||
412 | } | 401 | } |
413 | 402 | ||
414 | static inline int max8997_get_voltage_proper_val( | 403 | static inline int max8997_get_voltage_proper_val( |
@@ -497,9 +486,7 @@ static int max8997_set_voltage_ldobuck(struct regulator_dev *rdev, | |||
497 | int min_vol = min_uV / 1000, max_vol = max_uV / 1000; | 486 | int min_vol = min_uV / 1000, max_vol = max_uV / 1000; |
498 | const struct voltage_map_desc *desc; | 487 | const struct voltage_map_desc *desc; |
499 | int rid = rdev_get_id(rdev); | 488 | int rid = rdev_get_id(rdev); |
500 | int reg, shift = 0, mask, ret; | 489 | int i, reg, shift, mask, ret; |
501 | int i; | ||
502 | u8 org; | ||
503 | 490 | ||
504 | switch (rid) { | 491 | switch (rid) { |
505 | case MAX8997_LDO1 ... MAX8997_LDO21: | 492 | case MAX8997_LDO1 ... MAX8997_LDO21: |
@@ -528,21 +515,50 @@ static int max8997_set_voltage_ldobuck(struct regulator_dev *rdev, | |||
528 | if (ret) | 515 | if (ret) |
529 | return ret; | 516 | return ret; |
530 | 517 | ||
531 | max8997_read_reg(i2c, reg, &org); | ||
532 | org = (org & mask) >> shift; | ||
533 | |||
534 | ret = max8997_update_reg(i2c, reg, i << shift, mask << shift); | 518 | ret = max8997_update_reg(i2c, reg, i << shift, mask << shift); |
535 | *selector = i; | 519 | *selector = i; |
536 | 520 | ||
537 | if (rid == MAX8997_BUCK1 || rid == MAX8997_BUCK2 || | 521 | return ret; |
538 | rid == MAX8997_BUCK4 || rid == MAX8997_BUCK5) { | 522 | } |
539 | /* If the voltage is increasing */ | 523 | |
540 | if (org < i) | 524 | static int max8997_set_voltage_ldobuck_time_sel(struct regulator_dev *rdev, |
541 | udelay(DIV_ROUND_UP(desc->step * (i - org), | 525 | unsigned int old_selector, |
542 | max8997->ramp_delay)); | 526 | unsigned int new_selector) |
527 | { | ||
528 | struct max8997_data *max8997 = rdev_get_drvdata(rdev); | ||
529 | int rid = rdev_get_id(rdev); | ||
530 | const struct voltage_map_desc *desc = reg_voltage_map[rid]; | ||
531 | |||
532 | /* Delay is required only if the voltage is increasing */ | ||
533 | if (old_selector >= new_selector) | ||
534 | return 0; | ||
535 | |||
536 | /* No need to delay if gpio_dvs_mode */ | ||
537 | switch (rid) { | ||
538 | case MAX8997_BUCK1: | ||
539 | if (max8997->buck1_gpiodvs) | ||
540 | return 0; | ||
541 | break; | ||
542 | case MAX8997_BUCK2: | ||
543 | if (max8997->buck2_gpiodvs) | ||
544 | return 0; | ||
545 | break; | ||
546 | case MAX8997_BUCK5: | ||
547 | if (max8997->buck5_gpiodvs) | ||
548 | return 0; | ||
549 | break; | ||
543 | } | 550 | } |
544 | 551 | ||
545 | return ret; | 552 | switch (rid) { |
553 | case MAX8997_BUCK1: | ||
554 | case MAX8997_BUCK2: | ||
555 | case MAX8997_BUCK4: | ||
556 | case MAX8997_BUCK5: | ||
557 | return DIV_ROUND_UP(desc->step * (new_selector - old_selector), | ||
558 | max8997->ramp_delay); | ||
559 | } | ||
560 | |||
561 | return 0; | ||
546 | } | 562 | } |
547 | 563 | ||
548 | /* | 564 | /* |
@@ -749,11 +765,6 @@ static int max8997_set_voltage_safeout(struct regulator_dev *rdev, | |||
749 | return ret; | 765 | return ret; |
750 | } | 766 | } |
751 | 767 | ||
752 | static int max8997_reg_enable_suspend(struct regulator_dev *rdev) | ||
753 | { | ||
754 | return 0; | ||
755 | } | ||
756 | |||
757 | static int max8997_reg_disable_suspend(struct regulator_dev *rdev) | 768 | static int max8997_reg_disable_suspend(struct regulator_dev *rdev) |
758 | { | 769 | { |
759 | struct max8997_data *max8997 = rdev_get_drvdata(rdev); | 770 | struct max8997_data *max8997 = rdev_get_drvdata(rdev); |
@@ -786,9 +797,9 @@ static struct regulator_ops max8997_ldo_ops = { | |||
786 | .is_enabled = max8997_reg_is_enabled, | 797 | .is_enabled = max8997_reg_is_enabled, |
787 | .enable = max8997_reg_enable, | 798 | .enable = max8997_reg_enable, |
788 | .disable = max8997_reg_disable, | 799 | .disable = max8997_reg_disable, |
789 | .get_voltage = max8997_get_voltage, | 800 | .get_voltage_sel = max8997_get_voltage_sel, |
790 | .set_voltage = max8997_set_voltage_ldobuck, | 801 | .set_voltage = max8997_set_voltage_ldobuck, |
791 | .set_suspend_enable = max8997_reg_enable_suspend, | 802 | .set_voltage_time_sel = max8997_set_voltage_ldobuck_time_sel, |
792 | .set_suspend_disable = max8997_reg_disable_suspend, | 803 | .set_suspend_disable = max8997_reg_disable_suspend, |
793 | }; | 804 | }; |
794 | 805 | ||
@@ -797,9 +808,9 @@ static struct regulator_ops max8997_buck_ops = { | |||
797 | .is_enabled = max8997_reg_is_enabled, | 808 | .is_enabled = max8997_reg_is_enabled, |
798 | .enable = max8997_reg_enable, | 809 | .enable = max8997_reg_enable, |
799 | .disable = max8997_reg_disable, | 810 | .disable = max8997_reg_disable, |
800 | .get_voltage = max8997_get_voltage, | 811 | .get_voltage_sel = max8997_get_voltage_sel, |
801 | .set_voltage = max8997_set_voltage_buck, | 812 | .set_voltage = max8997_set_voltage_buck, |
802 | .set_suspend_enable = max8997_reg_enable_suspend, | 813 | .set_voltage_time_sel = max8997_set_voltage_ldobuck_time_sel, |
803 | .set_suspend_disable = max8997_reg_disable_suspend, | 814 | .set_suspend_disable = max8997_reg_disable_suspend, |
804 | }; | 815 | }; |
805 | 816 | ||
@@ -808,7 +819,6 @@ static struct regulator_ops max8997_fixedvolt_ops = { | |||
808 | .is_enabled = max8997_reg_is_enabled, | 819 | .is_enabled = max8997_reg_is_enabled, |
809 | .enable = max8997_reg_enable, | 820 | .enable = max8997_reg_enable, |
810 | .disable = max8997_reg_disable, | 821 | .disable = max8997_reg_disable, |
811 | .set_suspend_enable = max8997_reg_enable_suspend, | ||
812 | .set_suspend_disable = max8997_reg_disable_suspend, | 822 | .set_suspend_disable = max8997_reg_disable_suspend, |
813 | }; | 823 | }; |
814 | 824 | ||
@@ -817,39 +827,56 @@ static struct regulator_ops max8997_safeout_ops = { | |||
817 | .is_enabled = max8997_reg_is_enabled, | 827 | .is_enabled = max8997_reg_is_enabled, |
818 | .enable = max8997_reg_enable, | 828 | .enable = max8997_reg_enable, |
819 | .disable = max8997_reg_disable, | 829 | .disable = max8997_reg_disable, |
820 | .get_voltage = max8997_get_voltage, | 830 | .get_voltage_sel = max8997_get_voltage_sel, |
821 | .set_voltage = max8997_set_voltage_safeout, | 831 | .set_voltage = max8997_set_voltage_safeout, |
822 | .set_suspend_enable = max8997_reg_enable_suspend, | ||
823 | .set_suspend_disable = max8997_reg_disable_suspend, | 832 | .set_suspend_disable = max8997_reg_disable_suspend, |
824 | }; | 833 | }; |
825 | 834 | ||
826 | static struct regulator_ops max8997_fixedstate_ops = { | 835 | static struct regulator_ops max8997_fixedstate_ops = { |
827 | .list_voltage = max8997_list_voltage_charger_cv, | 836 | .list_voltage = max8997_list_voltage_charger_cv, |
828 | .get_voltage = max8997_get_voltage, | 837 | .get_voltage_sel = max8997_get_voltage_sel, |
829 | .set_voltage = max8997_set_voltage_charger_cv, | 838 | .set_voltage = max8997_set_voltage_charger_cv, |
830 | }; | 839 | }; |
831 | 840 | ||
832 | static int max8997_set_voltage_ldobuck_wrap(struct regulator_dev *rdev, | 841 | static int max8997_set_current_limit(struct regulator_dev *rdev, |
833 | int min_uV, int max_uV) | 842 | int min_uA, int max_uA) |
834 | { | 843 | { |
835 | unsigned dummy; | 844 | unsigned dummy; |
845 | int rid = rdev_get_id(rdev); | ||
846 | |||
847 | if (rid != MAX8997_CHARGER && rid != MAX8997_CHARGER_TOPOFF) | ||
848 | return -EINVAL; | ||
836 | 849 | ||
837 | return max8997_set_voltage_ldobuck(rdev, min_uV, max_uV, &dummy); | 850 | /* Reuse max8997_set_voltage_ldobuck to set current_limit. */ |
851 | return max8997_set_voltage_ldobuck(rdev, min_uA, max_uA, &dummy); | ||
838 | } | 852 | } |
839 | 853 | ||
854 | static int max8997_get_current_limit(struct regulator_dev *rdev) | ||
855 | { | ||
856 | int sel, rid = rdev_get_id(rdev); | ||
857 | |||
858 | if (rid != MAX8997_CHARGER && rid != MAX8997_CHARGER_TOPOFF) | ||
859 | return -EINVAL; | ||
860 | |||
861 | sel = max8997_get_voltage_sel(rdev); | ||
862 | if (sel < 0) | ||
863 | return sel; | ||
864 | |||
865 | /* Reuse max8997_list_voltage to get current_limit. */ | ||
866 | return max8997_list_voltage(rdev, sel); | ||
867 | } | ||
840 | 868 | ||
841 | static struct regulator_ops max8997_charger_ops = { | 869 | static struct regulator_ops max8997_charger_ops = { |
842 | .is_enabled = max8997_reg_is_enabled, | 870 | .is_enabled = max8997_reg_is_enabled, |
843 | .enable = max8997_reg_enable, | 871 | .enable = max8997_reg_enable, |
844 | .disable = max8997_reg_disable, | 872 | .disable = max8997_reg_disable, |
845 | .get_current_limit = max8997_get_voltage, | 873 | .get_current_limit = max8997_get_current_limit, |
846 | .set_current_limit = max8997_set_voltage_ldobuck_wrap, | 874 | .set_current_limit = max8997_set_current_limit, |
847 | }; | 875 | }; |
848 | 876 | ||
849 | static struct regulator_ops max8997_charger_fixedstate_ops = { | 877 | static struct regulator_ops max8997_charger_fixedstate_ops = { |
850 | .is_enabled = max8997_reg_is_enabled, | 878 | .get_current_limit = max8997_get_current_limit, |
851 | .get_current_limit = max8997_get_voltage, | 879 | .set_current_limit = max8997_set_current_limit, |
852 | .set_current_limit = max8997_set_voltage_ldobuck_wrap, | ||
853 | }; | 880 | }; |
854 | 881 | ||
855 | #define MAX8997_VOLTAGE_REGULATOR(_name, _ops) {\ | 882 | #define MAX8997_VOLTAGE_REGULATOR(_name, _ops) {\ |
@@ -922,16 +949,15 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) | |||
922 | return -ENODEV; | 949 | return -ENODEV; |
923 | } | 950 | } |
924 | 951 | ||
925 | max8997 = kzalloc(sizeof(struct max8997_data), GFP_KERNEL); | 952 | max8997 = devm_kzalloc(&pdev->dev, sizeof(struct max8997_data), |
953 | GFP_KERNEL); | ||
926 | if (!max8997) | 954 | if (!max8997) |
927 | return -ENOMEM; | 955 | return -ENOMEM; |
928 | 956 | ||
929 | size = sizeof(struct regulator_dev *) * pdata->num_regulators; | 957 | size = sizeof(struct regulator_dev *) * pdata->num_regulators; |
930 | max8997->rdev = kzalloc(size, GFP_KERNEL); | 958 | max8997->rdev = devm_kzalloc(&pdev->dev, size, GFP_KERNEL); |
931 | if (!max8997->rdev) { | 959 | if (!max8997->rdev) |
932 | kfree(max8997); | ||
933 | return -ENOMEM; | 960 | return -ENOMEM; |
934 | } | ||
935 | 961 | ||
936 | rdev = max8997->rdev; | 962 | rdev = max8997->rdev; |
937 | max8997->dev = &pdev->dev; | 963 | max8997->dev = &pdev->dev; |
@@ -955,7 +981,7 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) | |||
955 | pdata->buck1_voltage[i] / 1000 + | 981 | pdata->buck1_voltage[i] / 1000 + |
956 | buck1245_voltage_map_desc.step); | 982 | buck1245_voltage_map_desc.step); |
957 | if (ret < 0) | 983 | if (ret < 0) |
958 | goto err_alloc; | 984 | goto err_out; |
959 | 985 | ||
960 | max8997->buck2_vol[i] = ret = | 986 | max8997->buck2_vol[i] = ret = |
961 | max8997_get_voltage_proper_val( | 987 | max8997_get_voltage_proper_val( |
@@ -964,7 +990,7 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) | |||
964 | pdata->buck2_voltage[i] / 1000 + | 990 | pdata->buck2_voltage[i] / 1000 + |
965 | buck1245_voltage_map_desc.step); | 991 | buck1245_voltage_map_desc.step); |
966 | if (ret < 0) | 992 | if (ret < 0) |
967 | goto err_alloc; | 993 | goto err_out; |
968 | 994 | ||
969 | max8997->buck5_vol[i] = ret = | 995 | max8997->buck5_vol[i] = ret = |
970 | max8997_get_voltage_proper_val( | 996 | max8997_get_voltage_proper_val( |
@@ -973,7 +999,7 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) | |||
973 | pdata->buck5_voltage[i] / 1000 + | 999 | pdata->buck5_voltage[i] / 1000 + |
974 | buck1245_voltage_map_desc.step); | 1000 | buck1245_voltage_map_desc.step); |
975 | if (ret < 0) | 1001 | if (ret < 0) |
976 | goto err_alloc; | 1002 | goto err_out; |
977 | 1003 | ||
978 | if (max_buck1 < max8997->buck1_vol[i]) | 1004 | if (max_buck1 < max8997->buck1_vol[i]) |
979 | max_buck1 = max8997->buck1_vol[i]; | 1005 | max_buck1 = max8997->buck1_vol[i]; |
@@ -1006,7 +1032,7 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) | |||
1006 | !gpio_is_valid(pdata->buck125_gpios[2])) { | 1032 | !gpio_is_valid(pdata->buck125_gpios[2])) { |
1007 | dev_err(&pdev->dev, "GPIO NOT VALID\n"); | 1033 | dev_err(&pdev->dev, "GPIO NOT VALID\n"); |
1008 | ret = -EINVAL; | 1034 | ret = -EINVAL; |
1009 | goto err_alloc; | 1035 | goto err_out; |
1010 | } | 1036 | } |
1011 | 1037 | ||
1012 | ret = gpio_request(pdata->buck125_gpios[0], | 1038 | ret = gpio_request(pdata->buck125_gpios[0], |
@@ -1015,7 +1041,7 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) | |||
1015 | dev_warn(&pdev->dev, "Duplicated gpio request" | 1041 | dev_warn(&pdev->dev, "Duplicated gpio request" |
1016 | " on SET1\n"); | 1042 | " on SET1\n"); |
1017 | else if (ret) | 1043 | else if (ret) |
1018 | goto err_alloc; | 1044 | goto err_out; |
1019 | else | 1045 | else |
1020 | gpio1set = true; | 1046 | gpio1set = true; |
1021 | 1047 | ||
@@ -1027,7 +1053,7 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) | |||
1027 | else if (ret) { | 1053 | else if (ret) { |
1028 | if (gpio1set) | 1054 | if (gpio1set) |
1029 | gpio_free(pdata->buck125_gpios[0]); | 1055 | gpio_free(pdata->buck125_gpios[0]); |
1030 | goto err_alloc; | 1056 | goto err_out; |
1031 | } else | 1057 | } else |
1032 | gpio2set = true; | 1058 | gpio2set = true; |
1033 | 1059 | ||
@@ -1041,7 +1067,7 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) | |||
1041 | gpio_free(pdata->buck125_gpios[0]); | 1067 | gpio_free(pdata->buck125_gpios[0]); |
1042 | if (gpio2set) | 1068 | if (gpio2set) |
1043 | gpio_free(pdata->buck125_gpios[1]); | 1069 | gpio_free(pdata->buck125_gpios[1]); |
1044 | goto err_alloc; | 1070 | goto err_out; |
1045 | } | 1071 | } |
1046 | 1072 | ||
1047 | gpio_direction_output(pdata->buck125_gpios[0], | 1073 | gpio_direction_output(pdata->buck125_gpios[0], |
@@ -1110,13 +1136,9 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) | |||
1110 | 1136 | ||
1111 | return 0; | 1137 | return 0; |
1112 | err: | 1138 | err: |
1113 | for (i = 0; i < max8997->num_regulators; i++) | 1139 | while (--i >= 0) |
1114 | if (rdev[i]) | 1140 | regulator_unregister(rdev[i]); |
1115 | regulator_unregister(rdev[i]); | 1141 | err_out: |
1116 | err_alloc: | ||
1117 | kfree(max8997->rdev); | ||
1118 | kfree(max8997); | ||
1119 | |||
1120 | return ret; | 1142 | return ret; |
1121 | } | 1143 | } |
1122 | 1144 | ||
@@ -1127,12 +1149,7 @@ static int __devexit max8997_pmic_remove(struct platform_device *pdev) | |||
1127 | int i; | 1149 | int i; |
1128 | 1150 | ||
1129 | for (i = 0; i < max8997->num_regulators; i++) | 1151 | for (i = 0; i < max8997->num_regulators; i++) |
1130 | if (rdev[i]) | 1152 | regulator_unregister(rdev[i]); |
1131 | regulator_unregister(rdev[i]); | ||
1132 | |||
1133 | kfree(max8997->rdev); | ||
1134 | kfree(max8997); | ||
1135 | |||
1136 | return 0; | 1153 | return 0; |
1137 | } | 1154 | } |
1138 | 1155 | ||