diff options
Diffstat (limited to 'drivers/pinctrl/sunxi/pinctrl-sunxi.c')
| -rw-r--r-- | drivers/pinctrl/sunxi/pinctrl-sunxi.c | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.c b/drivers/pinctrl/sunxi/pinctrl-sunxi.c index 5d9184d18c16..0e7fa69e93df 100644 --- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c +++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c | |||
| @@ -698,26 +698,24 @@ static int sunxi_pmx_request(struct pinctrl_dev *pctldev, unsigned offset) | |||
| 698 | { | 698 | { |
| 699 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | 699 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); |
| 700 | unsigned short bank = offset / PINS_PER_BANK; | 700 | unsigned short bank = offset / PINS_PER_BANK; |
| 701 | struct sunxi_pinctrl_regulator *s_reg = &pctl->regulators[bank]; | 701 | unsigned short bank_offset = bank - pctl->desc->pin_base / |
| 702 | struct regulator *reg; | 702 | PINS_PER_BANK; |
| 703 | struct sunxi_pinctrl_regulator *s_reg = &pctl->regulators[bank_offset]; | ||
| 704 | struct regulator *reg = s_reg->regulator; | ||
| 705 | char supply[16]; | ||
| 703 | int ret; | 706 | int ret; |
| 704 | 707 | ||
| 705 | reg = s_reg->regulator; | 708 | if (reg) { |
| 706 | if (!reg) { | ||
| 707 | char supply[16]; | ||
| 708 | |||
| 709 | snprintf(supply, sizeof(supply), "vcc-p%c", 'a' + bank); | ||
| 710 | reg = regulator_get(pctl->dev, supply); | ||
| 711 | if (IS_ERR(reg)) { | ||
| 712 | dev_err(pctl->dev, "Couldn't get bank P%c regulator\n", | ||
| 713 | 'A' + bank); | ||
| 714 | return PTR_ERR(reg); | ||
| 715 | } | ||
| 716 | |||
| 717 | s_reg->regulator = reg; | ||
| 718 | refcount_set(&s_reg->refcount, 1); | ||
| 719 | } else { | ||
| 720 | refcount_inc(&s_reg->refcount); | 709 | refcount_inc(&s_reg->refcount); |
| 710 | return 0; | ||
| 711 | } | ||
| 712 | |||
| 713 | snprintf(supply, sizeof(supply), "vcc-p%c", 'a' + bank); | ||
| 714 | reg = regulator_get(pctl->dev, supply); | ||
| 715 | if (IS_ERR(reg)) { | ||
| 716 | dev_err(pctl->dev, "Couldn't get bank P%c regulator\n", | ||
| 717 | 'A' + bank); | ||
| 718 | return PTR_ERR(reg); | ||
| 721 | } | 719 | } |
| 722 | 720 | ||
| 723 | ret = regulator_enable(reg); | 721 | ret = regulator_enable(reg); |
| @@ -727,13 +725,13 @@ static int sunxi_pmx_request(struct pinctrl_dev *pctldev, unsigned offset) | |||
| 727 | goto out; | 725 | goto out; |
| 728 | } | 726 | } |
| 729 | 727 | ||
| 728 | s_reg->regulator = reg; | ||
| 729 | refcount_set(&s_reg->refcount, 1); | ||
| 730 | |||
| 730 | return 0; | 731 | return 0; |
| 731 | 732 | ||
| 732 | out: | 733 | out: |
| 733 | if (refcount_dec_and_test(&s_reg->refcount)) { | 734 | regulator_put(s_reg->regulator); |
| 734 | regulator_put(s_reg->regulator); | ||
| 735 | s_reg->regulator = NULL; | ||
| 736 | } | ||
| 737 | 735 | ||
| 738 | return ret; | 736 | return ret; |
| 739 | } | 737 | } |
| @@ -742,7 +740,9 @@ static int sunxi_pmx_free(struct pinctrl_dev *pctldev, unsigned offset) | |||
| 742 | { | 740 | { |
| 743 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | 741 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); |
| 744 | unsigned short bank = offset / PINS_PER_BANK; | 742 | unsigned short bank = offset / PINS_PER_BANK; |
| 745 | struct sunxi_pinctrl_regulator *s_reg = &pctl->regulators[bank]; | 743 | unsigned short bank_offset = bank - pctl->desc->pin_base / |
| 744 | PINS_PER_BANK; | ||
| 745 | struct sunxi_pinctrl_regulator *s_reg = &pctl->regulators[bank_offset]; | ||
| 746 | 746 | ||
| 747 | if (!refcount_dec_and_test(&s_reg->refcount)) | 747 | if (!refcount_dec_and_test(&s_reg->refcount)) |
| 748 | return 0; | 748 | return 0; |
