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/of_device.h>
12 #include <linux/regulator/driver.h>
13 #include <linux/regulator/machine.h>
14 #include <linux/regulator/of_regulator.h>
15 #include <linux/vexpress.h>
17 static int vexpress_regulator_get_voltage(struct regulator_dev
*regdev
)
20 int err
= regmap_read(regdev
->regmap
, 0, &uV
);
22 return err
? err
: uV
;
25 static int vexpress_regulator_set_voltage(struct regulator_dev
*regdev
,
26 int min_uV
, int max_uV
, unsigned *selector
)
28 return regmap_write(regdev
->regmap
, 0, min_uV
);
31 static const struct regulator_ops vexpress_regulator_ops_ro
= {
32 .get_voltage
= vexpress_regulator_get_voltage
,
35 static const struct regulator_ops vexpress_regulator_ops
= {
36 .get_voltage
= vexpress_regulator_get_voltage
,
37 .set_voltage
= vexpress_regulator_set_voltage
,
40 static int vexpress_regulator_probe(struct platform_device
*pdev
)
42 struct regulator_desc
*desc
;
43 struct regulator_init_data
*init_data
;
44 struct regulator_config config
= { };
45 struct regulator_dev
*rdev
;
46 struct regmap
*regmap
;
48 desc
= devm_kzalloc(&pdev
->dev
, sizeof(*desc
), GFP_KERNEL
);
52 regmap
= devm_regmap_init_vexpress_config(&pdev
->dev
);
54 return PTR_ERR(regmap
);
56 desc
->name
= dev_name(&pdev
->dev
);
57 desc
->type
= REGULATOR_VOLTAGE
;
58 desc
->owner
= THIS_MODULE
;
59 desc
->continuous_voltage_range
= true;
61 init_data
= of_get_regulator_init_data(&pdev
->dev
, pdev
->dev
.of_node
,
66 init_data
->constraints
.apply_uV
= 0;
67 if (init_data
->constraints
.min_uV
&& init_data
->constraints
.max_uV
)
68 desc
->ops
= &vexpress_regulator_ops
;
70 desc
->ops
= &vexpress_regulator_ops_ro
;
72 config
.regmap
= regmap
;
73 config
.dev
= &pdev
->dev
;
74 config
.init_data
= init_data
;
75 config
.of_node
= pdev
->dev
.of_node
;
77 rdev
= devm_regulator_register(&pdev
->dev
, desc
, &config
);
84 static const struct of_device_id vexpress_regulator_of_match
[] = {
85 { .compatible
= "arm,vexpress-volt", },
88 MODULE_DEVICE_TABLE(of
, vexpress_regulator_of_match
);
90 static struct platform_driver vexpress_regulator_driver
= {
91 .probe
= vexpress_regulator_probe
,
94 .of_match_table
= vexpress_regulator_of_match
,
98 module_platform_driver(vexpress_regulator_driver
);
100 MODULE_AUTHOR("Pawel Moll <pawel.moll@arm.com>");
101 MODULE_DESCRIPTION("Versatile Express regulator");
102 MODULE_LICENSE("GPL");
103 MODULE_ALIAS("platform:vexpress-regulator");