13d0407baSopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
23d0407baSopenharmony_ci/*
33d0407baSopenharmony_ci * internal.h  --  Voltage/Current Regulator framework internal code
43d0407baSopenharmony_ci *
53d0407baSopenharmony_ci * Copyright 2007, 2008 Wolfson Microelectronics PLC.
63d0407baSopenharmony_ci * Copyright 2008 SlimLogic Ltd.
73d0407baSopenharmony_ci *
83d0407baSopenharmony_ci * Author: Liam Girdwood <lrg@slimlogic.co.uk>
93d0407baSopenharmony_ci */
103d0407baSopenharmony_ci
113d0407baSopenharmony_ci#ifndef __REGULATOR_INTERNAL_H
123d0407baSopenharmony_ci#define __REGULATOR_INTERNAL_H
133d0407baSopenharmony_ci
143d0407baSopenharmony_ci#include <linux/suspend.h>
153d0407baSopenharmony_ci
163d0407baSopenharmony_ci#define REGULATOR_STATES_NUM	(PM_SUSPEND_MAX + 1)
173d0407baSopenharmony_ci
183d0407baSopenharmony_cistruct regulator_voltage {
193d0407baSopenharmony_ci	int min_uV;
203d0407baSopenharmony_ci	int max_uV;
213d0407baSopenharmony_ci};
223d0407baSopenharmony_ci
233d0407baSopenharmony_ci/*
243d0407baSopenharmony_ci * struct regulator
253d0407baSopenharmony_ci *
263d0407baSopenharmony_ci * One for each consumer device.
273d0407baSopenharmony_ci * @voltage - a voltage array for each state of runtime, i.e.:
283d0407baSopenharmony_ci *            PM_SUSPEND_ON
293d0407baSopenharmony_ci *            PM_SUSPEND_TO_IDLE
303d0407baSopenharmony_ci *            PM_SUSPEND_STANDBY
313d0407baSopenharmony_ci *            PM_SUSPEND_MEM
323d0407baSopenharmony_ci *            PM_SUSPEND_MAX
333d0407baSopenharmony_ci */
343d0407baSopenharmony_cistruct regulator {
353d0407baSopenharmony_ci	struct device *dev;
363d0407baSopenharmony_ci	struct list_head list;
373d0407baSopenharmony_ci	unsigned int always_on:1;
383d0407baSopenharmony_ci	unsigned int bypass:1;
393d0407baSopenharmony_ci	unsigned int device_link:1;
403d0407baSopenharmony_ci	int uA_load;
413d0407baSopenharmony_ci	unsigned int enable_count;
423d0407baSopenharmony_ci	unsigned int deferred_disables;
433d0407baSopenharmony_ci	struct regulator_voltage voltage[REGULATOR_STATES_NUM];
443d0407baSopenharmony_ci	const char *supply_name;
453d0407baSopenharmony_ci	struct device_attribute dev_attr;
463d0407baSopenharmony_ci	struct regulator_dev *rdev;
473d0407baSopenharmony_ci	struct dentry *debugfs;
483d0407baSopenharmony_ci};
493d0407baSopenharmony_ci
503d0407baSopenharmony_ciextern struct class regulator_class;
513d0407baSopenharmony_ci
523d0407baSopenharmony_cistatic inline struct regulator_dev *dev_to_rdev(struct device *dev)
533d0407baSopenharmony_ci{
543d0407baSopenharmony_ci	return container_of(dev, struct regulator_dev, dev);
553d0407baSopenharmony_ci}
563d0407baSopenharmony_ci
573d0407baSopenharmony_ci#ifdef CONFIG_OF
583d0407baSopenharmony_cistruct regulator_dev *of_find_regulator_by_node(struct device_node *np);
593d0407baSopenharmony_cistruct regulator_init_data *regulator_of_get_init_data(struct device *dev,
603d0407baSopenharmony_ci			         const struct regulator_desc *desc,
613d0407baSopenharmony_ci				 struct regulator_config *config,
623d0407baSopenharmony_ci				 struct device_node **node);
633d0407baSopenharmony_ci
643d0407baSopenharmony_cistruct regulator_dev *of_parse_coupled_regulator(struct regulator_dev *rdev,
653d0407baSopenharmony_ci						 int index);
663d0407baSopenharmony_ci
673d0407baSopenharmony_ciint of_get_n_coupled(struct regulator_dev *rdev);
683d0407baSopenharmony_ci
693d0407baSopenharmony_cibool of_check_coupling_data(struct regulator_dev *rdev);
703d0407baSopenharmony_ci
713d0407baSopenharmony_ci#else
723d0407baSopenharmony_cistatic inline struct regulator_dev *
733d0407baSopenharmony_ciof_find_regulator_by_node(struct device_node *np)
743d0407baSopenharmony_ci{
753d0407baSopenharmony_ci	return NULL;
763d0407baSopenharmony_ci}
773d0407baSopenharmony_ci
783d0407baSopenharmony_cistatic inline struct regulator_init_data *
793d0407baSopenharmony_ciregulator_of_get_init_data(struct device *dev,
803d0407baSopenharmony_ci			   const struct regulator_desc *desc,
813d0407baSopenharmony_ci			   struct regulator_config *config,
823d0407baSopenharmony_ci			   struct device_node **node)
833d0407baSopenharmony_ci{
843d0407baSopenharmony_ci	return NULL;
853d0407baSopenharmony_ci}
863d0407baSopenharmony_ci
873d0407baSopenharmony_cistatic inline struct regulator_dev *
883d0407baSopenharmony_ciof_parse_coupled_regulator(struct regulator_dev *rdev,
893d0407baSopenharmony_ci			   int index)
903d0407baSopenharmony_ci{
913d0407baSopenharmony_ci	return NULL;
923d0407baSopenharmony_ci}
933d0407baSopenharmony_ci
943d0407baSopenharmony_cistatic inline int of_get_n_coupled(struct regulator_dev *rdev)
953d0407baSopenharmony_ci{
963d0407baSopenharmony_ci	return 0;
973d0407baSopenharmony_ci}
983d0407baSopenharmony_ci
993d0407baSopenharmony_cistatic inline bool of_check_coupling_data(struct regulator_dev *rdev)
1003d0407baSopenharmony_ci{
1013d0407baSopenharmony_ci	return false;
1023d0407baSopenharmony_ci}
1033d0407baSopenharmony_ci
1043d0407baSopenharmony_ci#endif
1053d0407baSopenharmony_cienum regulator_get_type {
1063d0407baSopenharmony_ci	NORMAL_GET,
1073d0407baSopenharmony_ci	EXCLUSIVE_GET,
1083d0407baSopenharmony_ci	OPTIONAL_GET,
1093d0407baSopenharmony_ci	MAX_GET_TYPE
1103d0407baSopenharmony_ci};
1113d0407baSopenharmony_ci
1123d0407baSopenharmony_cistruct regulator *_regulator_get(struct device *dev, const char *id,
1133d0407baSopenharmony_ci				 enum regulator_get_type get_type);
1143d0407baSopenharmony_ci#endif
115