regulator: core: Parse coupled regulators properties

On Odroid XU3/4 and other Exynos5422 based boards there is a case, that
different devices on the board are supplied by different regulators
with non-fixed voltages. If one of these devices temporarily requires
higher voltage, there might occur a situation that the spread between
devices' voltages is so high, that there is a risk of changing
'high' and 'low' states on the interconnection between devices powered
by those regulators.

Add new structure "coupling_desc" to regulator_dev, which contains
pointers to all coupled regulators including the owner of the structure,
number of coupled regulators and counter of currently resolved
regulators.

Add of_functions to parse all data needed in regulator coupling.
Provide method to check DTS data consistency. Check if each coupled
regulator's max_spread is equal and if their lists of regulators match.

Signed-off-by: Maciej Purski <m.purski@samsung.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Maciej Purski
2018-04-23 16:33:39 +02:00
committed by Mark Brown
parent f98618b345
commit a085a31af5
4 changed files with 199 additions and 2 deletions

View File

@@ -15,6 +15,8 @@
#ifndef __LINUX_REGULATOR_DRIVER_H_
#define __LINUX_REGULATOR_DRIVER_H_
#define MAX_COUPLED 4
#include <linux/device.h>
#include <linux/notifier.h>
#include <linux/regulator/consumer.h>
@@ -409,6 +411,20 @@ struct regulator_config {
unsigned int ena_gpio_flags;
};
/*
* struct coupling_desc
*
* Describes coupling of regulators. Each regulator should have
* at least a pointer to itself in coupled_rdevs array.
* When a new coupled regulator is resolved, n_resolved is
* incremented.
*/
struct coupling_desc {
struct regulator_dev *coupled_rdevs[MAX_COUPLED];
int n_resolved;
int n_coupled;
};
/*
* struct regulator_dev
*
@@ -432,6 +448,8 @@ struct regulator_dev {
/* lists we own */
struct list_head consumer_list; /* consumers we supply */
struct coupling_desc coupling_desc;
struct blocking_notifier_head notifier;
struct mutex mutex; /* consumer lock */
struct task_struct *mutex_owner;

View File

@@ -103,6 +103,7 @@ struct regulator_state {
* @ilim_uA: Maximum input current.
* @system_load: Load that isn't captured by any consumer requests.
*
* @max_spread: Max possible spread between coupled regulators
* @valid_modes_mask: Mask of modes which may be configured by consumers.
* @valid_ops_mask: Operations which may be performed by consumers.
*
@@ -154,6 +155,9 @@ struct regulation_constraints {
int system_load;
/* used for coupled regulators */
int max_spread;
/* valid regulator operating modes for this machine */
unsigned int valid_modes_mask;