18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * dummy.c
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright 2010 Wolfson Microelectronics PLC.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
88c2ecf20Sopenharmony_ci *
98c2ecf20Sopenharmony_ci * This is useful for systems with mixed controllable and
108c2ecf20Sopenharmony_ci * non-controllable regulators, as well as for allowing testing on
118c2ecf20Sopenharmony_ci * systems with no controllable regulators.
128c2ecf20Sopenharmony_ci */
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <linux/err.h>
158c2ecf20Sopenharmony_ci#include <linux/export.h>
168c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
178c2ecf20Sopenharmony_ci#include <linux/regulator/driver.h>
188c2ecf20Sopenharmony_ci#include <linux/regulator/machine.h>
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#include "dummy.h"
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_cistruct regulator_dev *dummy_regulator_rdev;
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_cistatic const struct regulator_init_data dummy_initdata = {
258c2ecf20Sopenharmony_ci	.constraints = {
268c2ecf20Sopenharmony_ci		.always_on = 1,
278c2ecf20Sopenharmony_ci	},
288c2ecf20Sopenharmony_ci};
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistatic const struct regulator_ops dummy_ops;
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cistatic const struct regulator_desc dummy_desc = {
338c2ecf20Sopenharmony_ci	.name = "regulator-dummy",
348c2ecf20Sopenharmony_ci	.id = -1,
358c2ecf20Sopenharmony_ci	.type = REGULATOR_VOLTAGE,
368c2ecf20Sopenharmony_ci	.owner = THIS_MODULE,
378c2ecf20Sopenharmony_ci	.ops = &dummy_ops,
388c2ecf20Sopenharmony_ci};
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_cistatic int dummy_regulator_probe(struct platform_device *pdev)
418c2ecf20Sopenharmony_ci{
428c2ecf20Sopenharmony_ci	struct regulator_config config = { };
438c2ecf20Sopenharmony_ci	int ret;
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	config.dev = &pdev->dev;
468c2ecf20Sopenharmony_ci	config.init_data = &dummy_initdata;
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci	dummy_regulator_rdev = regulator_register(&dummy_desc, &config);
498c2ecf20Sopenharmony_ci	if (IS_ERR(dummy_regulator_rdev)) {
508c2ecf20Sopenharmony_ci		ret = PTR_ERR(dummy_regulator_rdev);
518c2ecf20Sopenharmony_ci		pr_err("Failed to register regulator: %d\n", ret);
528c2ecf20Sopenharmony_ci		return ret;
538c2ecf20Sopenharmony_ci	}
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci	return 0;
568c2ecf20Sopenharmony_ci}
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_cistatic struct platform_driver dummy_regulator_driver = {
598c2ecf20Sopenharmony_ci	.probe		= dummy_regulator_probe,
608c2ecf20Sopenharmony_ci	.driver		= {
618c2ecf20Sopenharmony_ci		.name		= "reg-dummy",
628c2ecf20Sopenharmony_ci	},
638c2ecf20Sopenharmony_ci};
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_cistatic struct platform_device *dummy_pdev;
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_civoid __init regulator_dummy_init(void)
688c2ecf20Sopenharmony_ci{
698c2ecf20Sopenharmony_ci	int ret;
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci	dummy_pdev = platform_device_alloc("reg-dummy", -1);
728c2ecf20Sopenharmony_ci	if (!dummy_pdev) {
738c2ecf20Sopenharmony_ci		pr_err("Failed to allocate dummy regulator device\n");
748c2ecf20Sopenharmony_ci		return;
758c2ecf20Sopenharmony_ci	}
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci	ret = platform_device_add(dummy_pdev);
788c2ecf20Sopenharmony_ci	if (ret != 0) {
798c2ecf20Sopenharmony_ci		pr_err("Failed to register dummy regulator device: %d\n", ret);
808c2ecf20Sopenharmony_ci		platform_device_put(dummy_pdev);
818c2ecf20Sopenharmony_ci		return;
828c2ecf20Sopenharmony_ci	}
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci	ret = platform_driver_register(&dummy_regulator_driver);
858c2ecf20Sopenharmony_ci	if (ret != 0) {
868c2ecf20Sopenharmony_ci		pr_err("Failed to register dummy regulator driver: %d\n", ret);
878c2ecf20Sopenharmony_ci		platform_device_unregister(dummy_pdev);
888c2ecf20Sopenharmony_ci	}
898c2ecf20Sopenharmony_ci}
90