1 // SPDX-License-Identifier: GPL-2.0
3 // Copyright (C) 2012 ARM Limited
5 #define DRVNAME "vexpress-regulator"
6 #define pr_fmt(fmt) DRVNAME ": " fmt
8 #include <linux/device.h>
10 #include <linux/module.h>
11 #include <linux/mod_devicetable.h>
12 #include <linux/platform_device.h>
13 #include <linux/regulator/driver.h>
14 #include <linux/regulator/machine.h>
15 #include <linux/regulator/of_regulator.h>
16 #include <linux/vexpress.h>
18 static int vexpress_regulator_get_voltage(struct regulator_dev
*regdev
)
21 int err
= regmap_read(regdev
->regmap
, 0, &uV
);
23 return err
? err
: uV
;
26 static int vexpress_regulator_set_voltage(struct regulator_dev
*regdev
,
27 int min_uV
, int max_uV
, unsigned *selector
)
29 return regmap_write(regdev
->regmap
, 0, min_uV
);
32 static const struct regulator_ops vexpress_regulator_ops_ro
= {
33 .get_voltage
= vexpress_regulator_get_voltage
,
36 static const struct regulator_ops vexpress_regulator_ops
= {
37 .get_voltage
= vexpress_regulator_get_voltage
,
38 .set_voltage
= vexpress_regulator_set_voltage
,
41 static int vexpress_regulator_probe(struct platform_device
*pdev
)
43 struct regulator_desc
*desc
;
44 struct regulator_init_data
*init_data
;
45 struct regulator_config config
= { };
46 struct regulator_dev
*rdev
;
47 struct regmap
*regmap
;
49 desc
= devm_kzalloc(&pdev
->dev
, sizeof(*desc
), GFP_KERNEL
);
53 regmap
= devm_regmap_init_vexpress_config(&pdev
->dev
);
55 return PTR_ERR(regmap
);
57 desc
->name
= dev_name(&pdev
->dev
);
58 desc
->type
= REGULATOR_VOLTAGE
;
59 desc
->owner
= THIS_MODULE
;
60 desc
->continuous_voltage_range
= true;
62 init_data
= of_get_regulator_init_data(&pdev
->dev
, pdev
->dev
.of_node
,
67 init_data
->constraints
.apply_uV
= 0;
68 if (init_data
->constraints
.min_uV
&& init_data
->constraints
.max_uV
)
69 desc
->ops
= &vexpress_regulator_ops
;
71 desc
->ops
= &vexpress_regulator_ops_ro
;
73 config
.regmap
= regmap
;
74 config
.dev
= &pdev
->dev
;
75 config
.init_data
= init_data
;
76 config
.of_node
= pdev
->dev
.of_node
;
78 rdev
= devm_regulator_register(&pdev
->dev
, desc
, &config
);
79 return PTR_ERR_OR_ZERO(rdev
);
82 static const struct of_device_id vexpress_regulator_of_match
[] = {
83 { .compatible
= "arm,vexpress-volt", },
86 MODULE_DEVICE_TABLE(of
, vexpress_regulator_of_match
);
88 static struct platform_driver vexpress_regulator_driver
= {
89 .probe
= vexpress_regulator_probe
,
92 .probe_type
= PROBE_PREFER_ASYNCHRONOUS
,
93 .of_match_table
= vexpress_regulator_of_match
,
97 module_platform_driver(vexpress_regulator_driver
);
99 MODULE_AUTHOR("Pawel Moll <pawel.moll@arm.com>");
100 MODULE_DESCRIPTION("Versatile Express regulator");
101 MODULE_LICENSE("GPL");
102 MODULE_ALIAS("platform:vexpress-regulator");