1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2613330a0SSascha Hauer #include <linux/slab.h>
3dfad84aeSGuennadi Liakhovetski #include <linux/string.h>
4613330a0SSascha Hauer #include <linux/platform_device.h>
5613330a0SSascha Hauer #include <linux/regulator/machine.h>
6613330a0SSascha Hauer #include <linux/regulator/fixed.h>
7613330a0SSascha Hauer
8613330a0SSascha Hauer struct fixed_regulator_data {
9613330a0SSascha Hauer struct fixed_voltage_config cfg;
10613330a0SSascha Hauer struct regulator_init_data init_data;
11613330a0SSascha Hauer struct platform_device pdev;
12613330a0SSascha Hauer };
13613330a0SSascha Hauer
regulator_fixed_release(struct device * dev)14613330a0SSascha Hauer static void regulator_fixed_release(struct device *dev)
15613330a0SSascha Hauer {
16613330a0SSascha Hauer struct fixed_regulator_data *data = container_of(dev,
17613330a0SSascha Hauer struct fixed_regulator_data, pdev.dev);
18dfad84aeSGuennadi Liakhovetski kfree(data->cfg.supply_name);
19613330a0SSascha Hauer kfree(data);
20613330a0SSascha Hauer }
21613330a0SSascha Hauer
22613330a0SSascha Hauer /**
23*a508a267SRandy Dunlap * regulator_register_always_on - register an always-on regulator with a fixed name
24613330a0SSascha Hauer * @id: platform device id
25dfad84aeSGuennadi Liakhovetski * @name: name to be used for the regulator
26613330a0SSascha Hauer * @supplies: consumers for this regulator
27613330a0SSascha Hauer * @num_supplies: number of consumers
2815719cccSGuennadi Liakhovetski * @uv: voltage in microvolts
29613330a0SSascha Hauer */
regulator_register_always_on(int id,const char * name,struct regulator_consumer_supply * supplies,int num_supplies,int uv)30dfad84aeSGuennadi Liakhovetski struct platform_device *regulator_register_always_on(int id, const char *name,
3115719cccSGuennadi Liakhovetski struct regulator_consumer_supply *supplies, int num_supplies, int uv)
32613330a0SSascha Hauer {
33613330a0SSascha Hauer struct fixed_regulator_data *data;
34613330a0SSascha Hauer
35613330a0SSascha Hauer data = kzalloc(sizeof(*data), GFP_KERNEL);
36613330a0SSascha Hauer if (!data)
37613330a0SSascha Hauer return NULL;
38613330a0SSascha Hauer
39dfad84aeSGuennadi Liakhovetski data->cfg.supply_name = kstrdup(name, GFP_KERNEL);
40dfad84aeSGuennadi Liakhovetski if (!data->cfg.supply_name) {
41dfad84aeSGuennadi Liakhovetski kfree(data);
42dfad84aeSGuennadi Liakhovetski return NULL;
43dfad84aeSGuennadi Liakhovetski }
44dfad84aeSGuennadi Liakhovetski
4515719cccSGuennadi Liakhovetski data->cfg.microvolts = uv;
46613330a0SSascha Hauer data->cfg.enabled_at_boot = 1;
47613330a0SSascha Hauer data->cfg.init_data = &data->init_data;
48613330a0SSascha Hauer
49613330a0SSascha Hauer data->init_data.constraints.always_on = 1;
50613330a0SSascha Hauer data->init_data.consumer_supplies = supplies;
51613330a0SSascha Hauer data->init_data.num_consumer_supplies = num_supplies;
52613330a0SSascha Hauer
53613330a0SSascha Hauer data->pdev.name = "reg-fixed-voltage";
54613330a0SSascha Hauer data->pdev.id = id;
55613330a0SSascha Hauer data->pdev.dev.platform_data = &data->cfg;
56613330a0SSascha Hauer data->pdev.dev.release = regulator_fixed_release;
57613330a0SSascha Hauer
58613330a0SSascha Hauer platform_device_register(&data->pdev);
59613330a0SSascha Hauer
60613330a0SSascha Hauer return &data->pdev;
61613330a0SSascha Hauer }
62