Skip to content

Commit

Permalink
Merge tag 'regulator-v6.14' of git://git.kernel.org/pub/scm/linux/ker…
Browse files Browse the repository at this point in the history
…nel/git/broonie/regulator

Pull regulator updates from Mark Brown:
 "This was a very quiet release, aside from some smaller improvements we
  have:

   - Support for power budgeting on regulators, initially targeted at
     some still in review support for PSE controllers but generally
     useful

   - Support for error interrupts from ROHM BD96801 devices

   - Support for NXP PCA9452"

* tag 'regulator-v6.14' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator:
  regulator: dt-bindings: Add regulator-power-budget-milliwatt property
  regulator: Add support for power budget
  regulator: core: Resolve supply using of_node from regulator_config
  regulator: of: Implement the unwind path of of_regulator_match()
  regulator: tps65219: Remove debugging helper function
  regulator: tps65219: Remove MODULE_ALIAS
  regulator: tps65219: Update driver name
  regulator: tps65219: Use dev_err_probe() instead of dev_err()
  regulator: dt-bindings: mt6315: Drop regulator-compatible property
  regulator: pca9450: Add PMIC pca9452 support
  regulator: dt-bindings: pca9450: Add pca9452 support
  regulator: pca9450: Use dev_err_probe() to simplify code
  regulator: pca9450: add enable_value for all bucks
  regulator: bd96801: Add ERRB IRQ
  • Loading branch information
Linus Torvalds committed Jan 22, 2025
2 parents 6f10810 + 367a820 commit 7b081a7
Show file tree
Hide file tree
Showing 12 changed files with 373 additions and 113 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,6 @@ properties:
$ref: regulator.yaml#
unevaluatedProperties: false

properties:
regulator-compatible:
pattern: "^vbuck[1-4]$"

additionalProperties: false

required:
Expand All @@ -56,15 +52,13 @@ examples:
regulators {
vbuck1 {
regulator-compatible = "vbuck1";
regulator-min-microvolt = <300000>;
regulator-max-microvolt = <1193750>;
regulator-enable-ramp-delay = <256>;
regulator-allowed-modes = <0 1 2>;
};
vbuck3 {
regulator-compatible = "vbuck3";
regulator-min-microvolt = <300000>;
regulator-max-microvolt = <1193750>;
regulator-enable-ramp-delay = <256>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ properties:
- nxp,pca9450b
- nxp,pca9450c
- nxp,pca9451a
- nxp,pca9452

reg:
maxItems: 1
Expand Down
3 changes: 3 additions & 0 deletions Documentation/devicetree/bindings/regulator/regulator.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ properties:
regulator-input-current-limit-microamp:
description: maximum input current regulator allows

regulator-power-budget-milliwatt:
description: power budget of the regulator

regulator-always-on:
description: boolean, regulator should never be disabled
type: boolean
Expand Down
130 changes: 115 additions & 15 deletions drivers/regulator/bd96801-regulator.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,7 @@
/*
* This version of the "BD86801 scalable PMIC"'s driver supports only very
* basic set of the PMIC features. Most notably, there is no support for
* the ERRB interrupt and the configurations which should be done when the
* PMIC is in STBY mode.
*
* Supporting the ERRB interrupt would require dropping the regmap-IRQ
* usage or working around (or accepting a presense of) a naming conflict
* in debugFS IRQs.
* the configurations which should be done when the PMIC is in STBY mode.
*
* Being able to reliably do the configurations like changing the
* regulator safety limits (like limits for the over/under -voltages, over
Expand All @@ -22,16 +17,14 @@
* be the need to configure these safety limits. Hence it's not simple to
* come up with a generic solution.
*
* Users who require the ERRB handling and STBY state configurations can
* have a look at the original RFC:
* Users who require the STBY state configurations can have a look at the
* original RFC:
* https://lore.kernel.org/all/cover.1712920132.git.mazziesaccount@gmail.com/
* which implements a workaround to debugFS naming conflict and some of
* the safety limit configurations - but leaves the state change handling
* and synchronization to be implemented.
* which implements some of the safety limit configurations - but leaves the
* state change handling and synchronization to be implemented.
*
* It would be great to hear (and receive a patch!) if you implement the
* STBY configuration support or a proper fix to the debugFS naming
* conflict in your downstream driver ;)
* STBY configuration support in your downstream driver ;)
*/

#include <linux/cleanup.h>
Expand Down Expand Up @@ -728,6 +721,95 @@ static int initialize_pmic_data(struct device *dev,
return 0;
}

static int bd96801_map_event_all(int irq, struct regulator_irq_data *rid,
unsigned long *dev_mask)
{
int i;

for (i = 0; i < rid->num_states; i++) {
rid->states[i].notifs = REGULATOR_EVENT_FAIL;
rid->states[i].errors = REGULATOR_ERROR_FAIL;
*dev_mask |= BIT(i);
}

return 0;
}

static int bd96801_rdev_errb_irqs(struct platform_device *pdev,
struct regulator_dev *rdev)
{
int i;
void *retp;
static const char * const single_out_errb_irqs[] = {
"bd96801-%s-pvin-err", "bd96801-%s-ovp-err",
"bd96801-%s-uvp-err", "bd96801-%s-shdn-err",
};

for (i = 0; i < ARRAY_SIZE(single_out_errb_irqs); i++) {
struct regulator_irq_desc id = {
.map_event = bd96801_map_event_all,
.irq_off_ms = 1000,
};
struct regulator_dev *rdev_arr[1];
char tmp[255];
int irq;

snprintf(tmp, 255, single_out_errb_irqs[i], rdev->desc->name);
tmp[254] = 0;
id.name = tmp;

irq = platform_get_irq_byname(pdev, tmp);
if (irq < 0)
continue;

rdev_arr[0] = rdev;
retp = devm_regulator_irq_helper(&pdev->dev, &id, irq, 0,
REGULATOR_ERROR_FAIL, NULL,
rdev_arr, 1);
if (IS_ERR(retp))
return PTR_ERR(retp);

}
return 0;
}

static int bd96801_global_errb_irqs(struct platform_device *pdev,
struct regulator_dev **rdev, int num_rdev)
{
int i, num_irqs;
void *retp;
static const char * const global_errb_irqs[] = {
"bd96801-otp-err", "bd96801-dbist-err", "bd96801-eep-err",
"bd96801-abist-err", "bd96801-prstb-err", "bd96801-drmoserr1",
"bd96801-drmoserr2", "bd96801-slave-err", "bd96801-vref-err",
"bd96801-tsd", "bd96801-uvlo-err", "bd96801-ovlo-err",
"bd96801-osc-err", "bd96801-pon-err", "bd96801-poff-err",
"bd96801-cmd-shdn-err", "bd96801-int-shdn-err"
};

num_irqs = ARRAY_SIZE(global_errb_irqs);
for (i = 0; i < num_irqs; i++) {
int irq;
struct regulator_irq_desc id = {
.name = global_errb_irqs[i],
.map_event = bd96801_map_event_all,
.irq_off_ms = 1000,
};

irq = platform_get_irq_byname(pdev, global_errb_irqs[i]);
if (irq < 0)
continue;

retp = devm_regulator_irq_helper(&pdev->dev, &id, irq, 0,
REGULATOR_ERROR_FAIL, NULL,
rdev, num_rdev);
if (IS_ERR(retp))
return PTR_ERR(retp);
}

return 0;
}

static int bd96801_rdev_intb_irqs(struct platform_device *pdev,
struct bd96801_pmic_data *pdata,
struct bd96801_irqinfo *iinfo,
Expand Down Expand Up @@ -783,18 +865,18 @@ static int bd96801_rdev_intb_irqs(struct platform_device *pdev,
return 0;
}



static int bd96801_probe(struct platform_device *pdev)
{
struct regulator_dev *ldo_errs_rdev_arr[BD96801_NUM_LDOS];
struct regulator_dev *all_rdevs[BD96801_NUM_REGULATORS];
struct bd96801_regulator_data *rdesc;
struct regulator_config config = {};
int ldo_errs_arr[BD96801_NUM_LDOS];
struct bd96801_pmic_data *pdata;
int temp_notif_ldos = 0;
struct device *parent;
int i, ret;
bool use_errb;
void *retp;

parent = pdev->dev.parent;
Expand All @@ -819,6 +901,13 @@ static int bd96801_probe(struct platform_device *pdev)
config.regmap = pdata->regmap;
config.dev = parent;

ret = of_property_match_string(pdev->dev.parent->of_node,
"interrupt-names", "errb");
if (ret < 0)
use_errb = false;
else
use_errb = true;

ret = bd96801_walk_regulator_dt(&pdev->dev, pdata->regmap, rdesc,
BD96801_NUM_REGULATORS);
if (ret)
Expand All @@ -837,6 +926,7 @@ static int bd96801_probe(struct platform_device *pdev)
rdesc[i].desc.name);
return PTR_ERR(rdev);
}
all_rdevs[i] = rdev;
/*
* LDOs don't have own temperature monitoring. If temperature
* notification was requested for this LDO from DT then we will
Expand All @@ -856,6 +946,12 @@ static int bd96801_probe(struct platform_device *pdev)
if (ret)
return ret;
}
/* Register per regulator ERRB notifiers */
if (use_errb) {
ret = bd96801_rdev_errb_irqs(pdev, rdev);
if (ret)
return ret;
}
}
if (temp_notif_ldos) {
int irq;
Expand All @@ -877,6 +973,10 @@ static int bd96801_probe(struct platform_device *pdev)
return PTR_ERR(retp);
}

if (use_errb)
return bd96801_global_errb_irqs(pdev, all_rdevs,
ARRAY_SIZE(all_rdevs));

return 0;
}

Expand Down
Loading

0 comments on commit 7b081a7

Please sign in to comment.