12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 234abbd68SMark Brown /* 334abbd68SMark Brown * dummy.c 434abbd68SMark Brown * 534abbd68SMark Brown * Copyright 2010 Wolfson Microelectronics PLC. 634abbd68SMark Brown * 734abbd68SMark Brown * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> 834abbd68SMark Brown * 934abbd68SMark Brown * This is useful for systems with mixed controllable and 1034abbd68SMark Brown * non-controllable regulators, as well as for allowing testing on 1134abbd68SMark Brown * systems with no controllable regulators. 1234abbd68SMark Brown */ 1334abbd68SMark Brown 1434abbd68SMark Brown #include <linux/err.h> 1522be053fSPaul Gortmaker #include <linux/export.h> 1634abbd68SMark Brown #include <linux/platform_device.h> 1734abbd68SMark Brown #include <linux/regulator/driver.h> 1834abbd68SMark Brown #include <linux/regulator/machine.h> 1934abbd68SMark Brown 2034abbd68SMark Brown #include "dummy.h" 2134abbd68SMark Brown 2234abbd68SMark Brown struct regulator_dev *dummy_regulator_rdev; 2334abbd68SMark Brown 24087c09c2SRikard Falkeborn static const struct regulator_init_data dummy_initdata = { 258669544aSMarkus Pargmann .constraints = { 268669544aSMarkus Pargmann .always_on = 1, 278669544aSMarkus Pargmann }, 288669544aSMarkus Pargmann }; 2934abbd68SMark Brown 30087c09c2SRikard Falkeborn static const struct regulator_ops dummy_ops; 3134abbd68SMark Brown 32e1326effSKrzysztof Kozlowski static const struct regulator_desc dummy_desc = { 33215b8b05SUwe Kleine-König .name = "regulator-dummy", 3434abbd68SMark Brown .id = -1, 3534abbd68SMark Brown .type = REGULATOR_VOLTAGE, 3634abbd68SMark Brown .owner = THIS_MODULE, 3734abbd68SMark Brown .ops = &dummy_ops, 3834abbd68SMark Brown }; 3934abbd68SMark Brown 40a5023574SBill Pemberton static int dummy_regulator_probe(struct platform_device *pdev) 41c08957a2SMark Brown { 42c172708dSMark Brown struct regulator_config config = { }; 43c08957a2SMark Brown int ret; 44c08957a2SMark Brown 450f82b6cfSMark Brown config.dev = &pdev->dev; 46c172708dSMark Brown config.init_data = &dummy_initdata; 47c172708dSMark Brown 48c172708dSMark Brown dummy_regulator_rdev = regulator_register(&dummy_desc, &config); 49c08957a2SMark Brown if (IS_ERR(dummy_regulator_rdev)) { 50c08957a2SMark Brown ret = PTR_ERR(dummy_regulator_rdev); 51c08957a2SMark Brown pr_err("Failed to register regulator: %d\n", ret); 52c08957a2SMark Brown return ret; 53c08957a2SMark Brown } 54c08957a2SMark Brown 55c08957a2SMark Brown return 0; 56c08957a2SMark Brown } 57c08957a2SMark Brown 58c08957a2SMark Brown static struct platform_driver dummy_regulator_driver = { 59c08957a2SMark Brown .probe = dummy_regulator_probe, 60c08957a2SMark Brown .driver = { 61c08957a2SMark Brown .name = "reg-dummy", 62c08957a2SMark Brown }, 63c08957a2SMark Brown }; 64c08957a2SMark Brown 6534abbd68SMark Brown static struct platform_device *dummy_pdev; 6634abbd68SMark Brown 6734abbd68SMark Brown void __init regulator_dummy_init(void) 6834abbd68SMark Brown { 6934abbd68SMark Brown int ret; 7034abbd68SMark Brown 7134abbd68SMark Brown dummy_pdev = platform_device_alloc("reg-dummy", -1); 7234abbd68SMark Brown if (!dummy_pdev) { 7334abbd68SMark Brown pr_err("Failed to allocate dummy regulator device\n"); 7434abbd68SMark Brown return; 7534abbd68SMark Brown } 7634abbd68SMark Brown 7734abbd68SMark Brown ret = platform_device_add(dummy_pdev); 7834abbd68SMark Brown if (ret != 0) { 7934abbd68SMark Brown pr_err("Failed to register dummy regulator device: %d\n", ret); 8034abbd68SMark Brown platform_device_put(dummy_pdev); 8134abbd68SMark Brown return; 8234abbd68SMark Brown } 8334abbd68SMark Brown 84c08957a2SMark Brown ret = platform_driver_register(&dummy_regulator_driver); 85c08957a2SMark Brown if (ret != 0) { 86c08957a2SMark Brown pr_err("Failed to register dummy regulator driver: %d\n", ret); 8734abbd68SMark Brown platform_device_unregister(dummy_pdev); 8834abbd68SMark Brown } 8934abbd68SMark Brown } 90