machine.h 6.5 KB
Newer Older
1 2 3 4 5
/*
 * machine.h -- SoC Regulator support, machine/board driver API.
 *
 * Copyright (C) 2007, 2008 Wolfson Microelectronics PLC.
 *
6
 * Author: Liam Girdwood <lrg@slimlogic.co.uk>
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * Regulator Machine/Board Interface.
 */

#ifndef __LINUX_REGULATOR_MACHINE_H_
#define __LINUX_REGULATOR_MACHINE_H_

#include <linux/regulator/consumer.h>
#include <linux/suspend.h>

struct regulator;

/*
 * Regulator operation constraint flags. These flags are used to enable
 * certain regulator operations and can be OR'ed together.
 *
 * VOLTAGE:  Regulator output voltage can be changed by software on this
 *           board/machine.
 * CURRENT:  Regulator output current can be changed by software on this
 *           board/machine.
 * MODE:     Regulator operating mode can be changed by software on this
 *           board/machine.
 * STATUS:   Regulator can be enabled and disabled.
 * DRMS:     Dynamic Regulator Mode Switching is enabled for this regulator.
 */

#define REGULATOR_CHANGE_VOLTAGE	0x1
#define REGULATOR_CHANGE_CURRENT	0x2
#define REGULATOR_CHANGE_MODE		0x4
#define REGULATOR_CHANGE_STATUS		0x8
#define REGULATOR_CHANGE_DRMS		0x10

/**
W
Wolfram Sang 已提交
44
 * struct regulator_state - regulator state during low power system states
45
 *
46 47 48
 * This describes a regulators state during a system wide low power
 * state.  One of enabled or disabled must be set for the
 * configuration to be applied.
M
Mark Brown 已提交
49 50 51 52
 *
 * @uV: Operating voltage during suspend.
 * @mode: Operating mode during suspend.
 * @enabled: Enabled during suspend.
53
 * @disabled: Disabled during suspend.
54 55 56 57 58
 */
struct regulator_state {
	int uV;	/* suspend voltage */
	unsigned int mode; /* suspend regulator operating mode */
	int enabled; /* is regulator enabled in this suspend state */
59
	int disabled; /* is the regulator disbled in this suspend state */
60 61 62 63 64 65
};

/**
 * struct regulation_constraints - regulator operating constraints.
 *
 * This struct describes regulator and board/machine specific constraints.
M
Mark Brown 已提交
66 67 68 69 70 71 72 73 74 75 76 77 78 79
 *
 * @name: Descriptive name for the constraints, used for display purposes.
 *
 * @min_uV: Smallest voltage consumers may set.
 * @max_uV: Largest voltage consumers may set.
 *
 * @min_uA: Smallest consumers consumers may set.
 * @max_uA: Largest current consumers may set.
 *
 * @valid_modes_mask: Mask of modes which may be configured by consumers.
 * @valid_ops_mask: Operations which may be performed by consumers.
 *
 * @always_on: Set if the regulator should never be disabled.
 * @boot_on: Set if the regulator is enabled when the system is initially
80 81 82
 *           started.  If the regulator is not enabled by the hardware or
 *           bootloader then it will be enabled when the constraints are
 *           applied.
M
Mark Brown 已提交
83 84 85 86 87 88 89 90 91
 * @apply_uV: Apply the voltage constraint when initialising.
 *
 * @input_uV: Input voltage for regulator when supplied by another regulator.
 *
 * @state_disk: State for regulator when system is suspended in disk mode.
 * @state_mem: State for regulator when system is suspended in mem mode.
 * @state_standby: State for regulator when system is suspended in standby
 *                 mode.
 * @initial_state: Suspend state to set by default.
92
 * @initial_mode: Mode to set at startup.
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
 */
struct regulation_constraints {

	char *name;

	/* voltage output range (inclusive) - for voltage control */
	int min_uV;
	int max_uV;

	/* current output range (inclusive) - for current control */
	int min_uA;
	int max_uA;

	/* valid regulator operating modes for this machine */
	unsigned int valid_modes_mask;

	/* valid operations for regulator on this machine */
	unsigned int valid_ops_mask;

	/* regulator input voltage - only if supply is another regulator */
	int input_uV;

	/* regulator suspend states for global PMIC STANDBY/HIBERNATE */
	struct regulator_state state_disk;
	struct regulator_state state_mem;
	struct regulator_state state_standby;
	suspend_state_t initial_state; /* suspend state to set at init */

121 122 123
	/* mode to set on startup */
	unsigned int initial_mode;

W
Wolfram Sang 已提交
124
	/* constraint flags */
125 126
	unsigned always_on:1;	/* regulator never off when system is on */
	unsigned boot_on:1;	/* bootloader/firmware enabled regulator */
W
Wolfram Sang 已提交
127
	unsigned apply_uV:1;	/* apply uV constraint if min == max */
128 129
};

130 131 132
/**
 * struct regulator_consumer_supply - supply -> device mapping
 *
133 134 135 136
 * This maps a supply name to a device.  Only one of dev or dev_name
 * can be specified.  Use of dev_name allows support for buses which
 * make struct device available late such as I2C and is the preferred
 * form.
M
Mark Brown 已提交
137 138
 *
 * @dev: Device structure for the consumer.
139
 * @dev_name: Result of dev_name() for the consumer.
M
Mark Brown 已提交
140
 * @supply: Name for the supply.
141 142 143
 */
struct regulator_consumer_supply {
	struct device *dev;	/* consumer */
144
	const char *dev_name;   /* dev_name() for consumer */
145 146
	const char *supply;	/* consumer supply - e.g. "vcc" */
};
147

148 149 150 151 152 153 154
/* Initialize struct regulator_consumer_supply */
#define REGULATOR_SUPPLY(_name, _dev_name)			\
{								\
	.supply		= _name,				\
	.dev_name	= _dev_name,				\
}

155 156 157 158
/**
 * struct regulator_init_data - regulator platform initialisation data.
 *
 * Initialisation constraints, our supply and consumers supplies.
M
Mark Brown 已提交
159
 *
160 161 162 163 164
 * @supply_regulator: Parent regulator.  Specified using the regulator name
 *                    as it appears in the name field in sysfs, which can
 *                    be explicitly set using the constraints field 'name'.
 * @supply_regulator_dev: Parent regulator (if any) - DEPRECATED in favour
 *                        of supply_regulator.
M
Mark Brown 已提交
165 166 167 168 169 170 171 172
 *
 * @constraints: Constraints.  These must be specified for the regulator to
 *               be usable.
 * @num_consumer_supplies: Number of consumer device supplies.
 * @consumer_supplies: Consumer device supply configuration.
 *
 * @regulator_init: Callback invoked when the regulator has been registered.
 * @driver_data: Data passed to regulator_init.
173 174
 */
struct regulator_init_data {
175 176
	const char *supply_regulator;        /* or NULL for system supply */
	struct device *supply_regulator_dev; /* or NULL for system supply */
177

178
	struct regulation_constraints constraints;
179

180 181 182 183 184 185 186
	int num_consumer_supplies;
	struct regulator_consumer_supply *consumer_supplies;

	/* optional regulator machine specific init */
	int (*regulator_init)(void *driver_data);
	void *driver_data;	/* core does not touch this */
};
187 188 189

int regulator_suspend_prepare(suspend_state_t state);

190
#ifdef CONFIG_REGULATOR
191
void regulator_has_full_constraints(void);
192 193 194 195 196
#else
static inline void regulator_has_full_constraints(void)
{
}
#endif
197

198
#endif