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

regulator: wm8350: Reuse map_voltage() to get selector of a given uV

Reuse map_voltage() to get the selector of a given uV.

Then we can remove wm8350_ldo_mvolts_to_val() and wm8350_dcdc_mvolts_to_val().
Also remove unused wm8350_dcdc_val_to_mvolts() function.

Signed-off-by: Axel Lin <axel.lin@gmail.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>

authored by

Axel Lin and committed by
Mark Brown
c7057422 a967fbfa

+50 -77
+50 -77
drivers/regulator/wm8350-regulator.c
··· 108 108 return -EINVAL; 109 109 } 110 110 111 - static inline unsigned int wm8350_ldo_mvolts_to_val(int mV) 112 - { 113 - if (mV < 1800) 114 - return (mV - 900) / 50; 115 - else 116 - return ((mV - 1800) / 100) + 16; 117 - } 118 - 119 - static inline int wm8350_dcdc_val_to_mvolts(unsigned int val) 120 - { 121 - return (val * 25) + 850; 122 - } 123 - 124 - static inline unsigned int wm8350_dcdc_mvolts_to_val(int mV) 125 - { 126 - return (mV - 850) / 25; 127 - } 128 - 129 111 static int wm8350_isink_set_current(struct regulator_dev *rdev, int min_uA, 130 112 int max_uA) 131 113 { ··· 335 353 static int wm8350_dcdc_set_suspend_voltage(struct regulator_dev *rdev, int uV) 336 354 { 337 355 struct wm8350 *wm8350 = rdev_get_drvdata(rdev); 338 - int volt_reg, mV = uV / 1000, dcdc = rdev_get_id(rdev); 356 + int sel, volt_reg, dcdc = rdev_get_id(rdev); 339 357 u16 val; 340 358 341 - dev_dbg(wm8350->dev, "%s %d mV %d\n", __func__, dcdc, mV); 342 - 343 - if (mV && (mV < 850 || mV > 4025)) { 344 - dev_err(wm8350->dev, 345 - "DCDC%d suspend voltage %d mV out of range\n", 346 - dcdc, mV); 347 - return -EINVAL; 348 - } 349 - if (mV == 0) 350 - mV = 850; 359 + dev_dbg(wm8350->dev, "%s %d mV %d\n", __func__, dcdc, uV / 1000); 351 360 352 361 switch (dcdc) { 353 362 case WM8350_DCDC_1: ··· 359 386 return -EINVAL; 360 387 } 361 388 389 + sel = regulator_map_voltage_linear(rdev, uV, uV); 390 + if (sel < 0) 391 + return -EINVAL; 392 + 362 393 /* all DCDCs have same mV bits */ 363 394 val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_DC1_VSEL_MASK; 364 - wm8350_reg_write(wm8350, volt_reg, 365 - val | wm8350_dcdc_mvolts_to_val(mV)); 395 + wm8350_reg_write(wm8350, volt_reg, val | sel); 366 396 return 0; 367 397 } 368 398 ··· 542 566 return 0; 543 567 } 544 568 569 + static int wm8350_ldo_list_voltage(struct regulator_dev *rdev, 570 + unsigned selector) 571 + { 572 + if (selector > WM8350_LDO1_VSEL_MASK) 573 + return -EINVAL; 574 + 575 + if (selector < 16) 576 + return (selector * 50000) + 900000; 577 + else 578 + return ((selector - 16) * 100000) + 1800000; 579 + } 580 + 581 + static int wm8350_ldo_map_voltage(struct regulator_dev *rdev, int min_uV, 582 + int max_uV) 583 + { 584 + int volt, sel; 585 + int min_mV = min_uV / 1000; 586 + int max_mV = max_uV / 1000; 587 + 588 + if (min_mV < 900 || min_mV > 3300) 589 + return -EINVAL; 590 + if (max_mV < 900 || max_mV > 3300) 591 + return -EINVAL; 592 + 593 + if (min_mV < 1800) /* step size is 50mV < 1800mV */ 594 + sel = DIV_ROUND_UP(min_uV - 900, 50); 595 + else /* step size is 100mV > 1800mV */ 596 + sel = DIV_ROUND_UP(min_uV - 1800, 100) + 16; 597 + 598 + volt = wm8350_ldo_list_voltage(rdev, sel); 599 + if (volt < min_uV || volt > max_uV) 600 + return -EINVAL; 601 + 602 + return sel; 603 + } 604 + 545 605 static int wm8350_ldo_set_suspend_voltage(struct regulator_dev *rdev, int uV) 546 606 { 547 607 struct wm8350 *wm8350 = rdev_get_drvdata(rdev); 548 - int volt_reg, mV = uV / 1000, ldo = rdev_get_id(rdev); 608 + int sel, volt_reg, ldo = rdev_get_id(rdev); 549 609 u16 val; 550 610 551 - dev_dbg(wm8350->dev, "%s %d mV %d\n", __func__, ldo, mV); 552 - 553 - if (mV < 900 || mV > 3300) { 554 - dev_err(wm8350->dev, "LDO%d voltage %d mV out of range\n", 555 - ldo, mV); 556 - return -EINVAL; 557 - } 611 + dev_dbg(wm8350->dev, "%s %d mV %d\n", __func__, ldo, uV / 1000); 558 612 559 613 switch (ldo) { 560 614 case WM8350_LDO_1: ··· 603 597 return -EINVAL; 604 598 } 605 599 600 + sel = wm8350_ldo_map_voltage(rdev, uV, uV); 601 + if (sel < 0) 602 + return -EINVAL; 603 + 606 604 /* all LDOs have same mV bits */ 607 605 val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_LDO1_VSEL_MASK; 608 - wm8350_reg_write(wm8350, volt_reg, 609 - val | wm8350_ldo_mvolts_to_val(mV)); 606 + wm8350_reg_write(wm8350, volt_reg, val | sel); 610 607 return 0; 611 608 } 612 609 ··· 669 660 val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_LDO1_HIB_MODE_MASK; 670 661 wm8350_reg_write(wm8350, volt_reg, val | WM8350_LDO1_HIB_MODE_DIS); 671 662 return 0; 672 - } 673 - 674 - static int wm8350_ldo_list_voltage(struct regulator_dev *rdev, 675 - unsigned selector) 676 - { 677 - if (selector > WM8350_LDO1_VSEL_MASK) 678 - return -EINVAL; 679 - 680 - if (selector < 16) 681 - return (selector * 50000) + 900000; 682 - else 683 - return ((selector - 16) * 100000) + 1800000; 684 - } 685 - 686 - static int wm8350_ldo_map_voltage(struct regulator_dev *rdev, int min_uV, 687 - int max_uV) 688 - { 689 - int volt, sel; 690 - int min_mV = min_uV / 1000; 691 - int max_mV = max_uV / 1000; 692 - 693 - if (min_mV < 900 || min_mV > 3300) 694 - return -EINVAL; 695 - if (max_mV < 900 || max_mV > 3300) 696 - return -EINVAL; 697 - 698 - if (min_mV < 1800) /* step size is 50mV < 1800mV */ 699 - sel = DIV_ROUND_UP(min_uV - 900, 50); 700 - else /* step size is 100mV > 1800mV */ 701 - sel = DIV_ROUND_UP(min_uV - 1800, 100) + 16; 702 - 703 - volt = wm8350_ldo_list_voltage(rdev, sel); 704 - if (volt < min_uV || volt > max_uV) 705 - return -EINVAL; 706 - 707 - return sel; 708 663 } 709 664 710 665 int wm8350_dcdc_set_slot(struct wm8350 *wm8350, int dcdc, u16 start,