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

regulator: Support MAX8998/LP3974 DVS-GPIO

The previous driver did not support BUCK1-DVS3, BUCK1-DVS4, and
BUCK2-DVS2 modes. This patch adds such modes and an option to block
setting buck1/2 voltages out of the preset values.

Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>

authored by

MyungJoo Ham and committed by
Samuel Ortiz
735a3d9e 337ce5d1

+87 -26
+67 -20
drivers/regulator/max8998.c
··· 424 424 } 425 425 } 426 426 427 + if (pdata->buck_voltage_lock) 428 + return -EINVAL; 429 + 427 430 /* no predefine regulator found */ 428 431 max8998->buck1_idx = (buck1_last_val % 2) + 2; 429 432 dev_dbg(max8998->dev, "max8998->buck1_idx:%d\n", ··· 454 451 "BUCK2, i:%d buck2_vol1:%d, buck2_vol2:%d\n" 455 452 , i, max8998->buck2_vol[0], max8998->buck2_vol[1]); 456 453 if (gpio_is_valid(pdata->buck2_set3)) { 457 - if (max8998->buck2_vol[0] == i) { 458 - max8998->buck1_idx = 0; 459 - buck2_gpio_set(pdata->buck2_set3, 0); 460 - } else { 461 - max8998->buck1_idx = 1; 462 - ret = max8998_get_voltage_register(rdev, &reg, 463 - &shift, 464 - &mask); 465 - ret = max8998_write_reg(i2c, reg, i); 466 - max8998->buck2_vol[1] = i; 467 - buck2_gpio_set(pdata->buck2_set3, 1); 454 + 455 + /* check if requested voltage */ 456 + /* value is already defined */ 457 + for (j = 0; j < ARRAY_SIZE(max8998->buck2_vol); j++) { 458 + if (max8998->buck2_vol[j] == i) { 459 + max8998->buck2_idx = j; 460 + buck2_gpio_set(pdata->buck2_set3, j); 461 + goto buck2_exit; 462 + } 468 463 } 464 + 465 + if (pdata->buck_voltage_lock) 466 + return -EINVAL; 467 + 468 + max8998_get_voltage_register(rdev, 469 + &reg, &shift, &mask); 470 + ret = max8998_write_reg(i2c, reg, i); 471 + max8998->buck2_vol[max8998->buck2_idx] = i; 472 + buck2_gpio_set(pdata->buck2_set3, max8998->buck2_idx); 473 + buck2_exit: 469 474 dev_dbg(max8998->dev, "%s: SET3:%d\n", i2c->name, 470 475 gpio_get_value(pdata->buck2_set3)); 471 476 } else { ··· 718 707 platform_set_drvdata(pdev, max8998); 719 708 i2c = max8998->iodev->i2c; 720 709 710 + max8998->buck1_idx = pdata->buck1_default_idx; 711 + max8998->buck2_idx = pdata->buck2_default_idx; 712 + 721 713 /* NOTE: */ 722 714 /* For unused GPIO NOT marked as -1 (thereof equal to 0) WARN_ON */ 723 715 /* will be displayed */ ··· 753 739 i = 0; 754 740 while (buck12_voltage_map_desc.min + 755 741 buck12_voltage_map_desc.step*i 756 - != (pdata->buck1_max_voltage1 / 1000)) 742 + < (pdata->buck1_voltage1 / 1000)) 757 743 i++; 758 - printk(KERN_ERR "i:%d, buck1_idx:%d\n", i, max8998->buck1_idx); 759 744 max8998->buck1_vol[0] = i; 760 745 ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE1, i); 746 + if (ret) 747 + return ret; 761 748 762 749 /* Set predefined value for BUCK1 register 2 */ 763 750 i = 0; 764 751 while (buck12_voltage_map_desc.min + 765 752 buck12_voltage_map_desc.step*i 766 - != (pdata->buck1_max_voltage2 / 1000)) 753 + < (pdata->buck1_voltage2 / 1000)) 767 754 i++; 768 755 769 756 max8998->buck1_vol[1] = i; 770 - printk(KERN_ERR "i:%d, buck1_idx:%d\n", i, max8998->buck1_idx); 771 - ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE2, i) 772 - + ret; 757 + ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE2, i); 758 + if (ret) 759 + return ret; 760 + 761 + /* Set predefined value for BUCK1 register 3 */ 762 + i = 0; 763 + while (buck12_voltage_map_desc.min + 764 + buck12_voltage_map_desc.step*i 765 + < (pdata->buck1_voltage3 / 1000)) 766 + i++; 767 + 768 + max8998->buck1_vol[2] = i; 769 + ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE3, i); 770 + if (ret) 771 + return ret; 772 + 773 + /* Set predefined value for BUCK1 register 4 */ 774 + i = 0; 775 + while (buck12_voltage_map_desc.min + 776 + buck12_voltage_map_desc.step*i 777 + < (pdata->buck1_voltage4 / 1000)) 778 + i++; 779 + 780 + max8998->buck1_vol[3] = i; 781 + ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE4, i); 773 782 if (ret) 774 783 return ret; 775 784 ··· 809 772 gpio_direction_output(pdata->buck2_set3, 810 773 max8998->buck2_idx & 0x1); 811 774 812 - /* BUCK2 - set preset default voltage value to buck2_vol[0] */ 775 + /* BUCK2 register 1 */ 813 776 i = 0; 814 777 while (buck12_voltage_map_desc.min + 815 778 buck12_voltage_map_desc.step*i 816 - != (pdata->buck2_max_voltage / 1000)) 779 + < (pdata->buck2_voltage1 / 1000)) 817 780 i++; 818 - printk(KERN_ERR "i:%d, buck2_idx:%d\n", i, max8998->buck2_idx); 819 781 max8998->buck2_vol[0] = i; 820 782 ret = max8998_write_reg(i2c, MAX8998_REG_BUCK2_VOLTAGE1, i); 821 783 if (ret) 822 784 return ret; 823 785 786 + /* BUCK2 register 2 */ 787 + i = 0; 788 + while (buck12_voltage_map_desc.min + 789 + buck12_voltage_map_desc.step*i 790 + < (pdata->buck2_voltage2 / 1000)) 791 + i++; 792 + printk(KERN_ERR "i2:%d, buck2_idx:%d\n", i, max8998->buck2_idx); 793 + max8998->buck2_vol[1] = i; 794 + ret = max8998_write_reg(i2c, MAX8998_REG_BUCK2_VOLTAGE2, i); 795 + if (ret) 796 + return ret; 824 797 } 825 798 826 799 for (i = 0; i < pdata->num_regulators; i++) {
+20 -6
include/linux/mfd/max8998.h
··· 70 70 * @num_regulators: number of regultors used 71 71 * @irq_base: base IRQ number for max8998, required for IRQs 72 72 * @ono: power onoff IRQ number for max8998 73 - * @buck1_max_voltage1: BUCK1 maximum alowed voltage register 1 74 - * @buck1_max_voltage2: BUCK1 maximum alowed voltage register 2 75 - * @buck2_max_voltage: BUCK2 maximum alowed voltage 73 + * @buck_voltage_lock: Do NOT change the values of the following six 74 + * registers set by buck?_voltage?. The voltage of BUCK1/2 cannot 75 + * be other than the preset values. 76 + * @buck1_voltage1: BUCK1 DVS mode 1 voltage register 77 + * @buck1_voltage2: BUCK1 DVS mode 2 voltage register 78 + * @buck1_voltage3: BUCK1 DVS mode 3 voltage register 79 + * @buck1_voltage4: BUCK1 DVS mode 4 voltage register 80 + * @buck2_voltage1: BUCK2 DVS mode 1 voltage register 81 + * @buck2_voltage2: BUCK2 DVS mode 2 voltage register 76 82 * @buck1_set1: BUCK1 gpio pin 1 to set output voltage 77 83 * @buck1_set2: BUCK1 gpio pin 2 to set output voltage 84 + * @buck1_default_idx: Default for BUCK1 gpio pin 1, 2 78 85 * @buck2_set3: BUCK2 gpio pin to set output voltage 86 + * @buck2_default_idx: Default for BUCK2 gpio pin. 79 87 * @wakeup: Allow to wake up from suspend 80 88 * @rtc_delay: LP3974 RTC chip bug that requires delay after a register 81 89 * write before reading it. ··· 93 85 int num_regulators; 94 86 int irq_base; 95 87 int ono; 96 - int buck1_max_voltage1; 97 - int buck1_max_voltage2; 98 - int buck2_max_voltage; 88 + bool buck_voltage_lock; 89 + int buck1_voltage1; 90 + int buck1_voltage2; 91 + int buck1_voltage3; 92 + int buck1_voltage4; 93 + int buck2_voltage1; 94 + int buck2_voltage2; 99 95 int buck1_set1; 100 96 int buck1_set2; 97 + int buck1_default_idx; 101 98 int buck2_set3; 99 + int buck2_default_idx; 102 100 bool wakeup; 103 101 bool rtc_delay; 104 102 };