xref: /openbmc/linux/drivers/regulator/fixed-helper.c (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
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