forked from Minki/linux
2c8a5dcaa4
Imagine a situation where a device tree has a few regulators in an appropriate node: regulators { sw1 { .. }; vvideo { .. }; : vfake { .. }; vtypo { .. }; }; In the above example, the node name "vfake" is an attempt to match a regulator name inside the driver which just so happens to not exist. The node name "vtypo" represents an accidental typographical error in a regulator name which may have been introduced to a device tree. In these cases, the number of regulators the mc13892 driver thinks it has does not match the number of regulators it parsed and registered. Since it will go over this array based on this number, it will actually re-register regulator "0" (which happens to be SW1) over and over again until it reaches the number, resulting in messages on the kernel log such as these: SW1: at 1100 mV VVIDEO: at 2775mV : SW1: at 1100 mV SW1: at 1100 mV .. up to that number of "mismatched" regulators. Nobody using DT can/will consume these regulators, so it should not be possible for it to cause any real regulator problems or driver breakages, but it is an easy thing to miss in a kernel log and is an immediate indication of a problem with the device tree authoring. This patch effectively sanity checks the number of counted children of the regulators node vs. the number that actually matched driver names, and sets the appropriate num_regulators value. It also gives a little warning for device tree authors that they MAY have screwed something up, such that this patch does not hide the device tree authoring problem. Signed-off-by: Matt Sealey <matt@genesi-usa.com> Tested-by: Steev Klimaszewski <steev@genesi-usa.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
114 lines
3.3 KiB
C
114 lines
3.3 KiB
C
/*
|
|
* mc13xxx.h - regulators for the Freescale mc13xxx PMIC
|
|
*
|
|
* Copyright (C) 2010 Yong Shen <yong.shen@linaro.org>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*/
|
|
|
|
#ifndef __LINUX_REGULATOR_MC13XXX_H
|
|
#define __LINUX_REGULATOR_MC13XXX_H
|
|
|
|
#include <linux/regulator/driver.h>
|
|
|
|
struct mc13xxx_regulator {
|
|
struct regulator_desc desc;
|
|
int reg;
|
|
int enable_bit;
|
|
int vsel_reg;
|
|
int vsel_shift;
|
|
int vsel_mask;
|
|
int hi_bit;
|
|
};
|
|
|
|
struct mc13xxx_regulator_priv {
|
|
struct mc13xxx *mc13xxx;
|
|
u32 powermisc_pwgt_state;
|
|
struct mc13xxx_regulator *mc13xxx_regulators;
|
|
int num_regulators;
|
|
struct regulator_dev *regulators[];
|
|
};
|
|
|
|
extern int mc13xxx_fixed_regulator_set_voltage(struct regulator_dev *rdev,
|
|
int min_uV, int max_uV, unsigned *selector);
|
|
|
|
#ifdef CONFIG_OF
|
|
extern int mc13xxx_get_num_regulators_dt(struct platform_device *pdev);
|
|
extern struct mc13xxx_regulator_init_data *mc13xxx_parse_regulators_dt(
|
|
struct platform_device *pdev, struct mc13xxx_regulator *regulators,
|
|
int num_regulators, int *num_parsed);
|
|
#else
|
|
static inline int mc13xxx_get_num_regulators_dt(struct platform_device *pdev)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
static inline struct mc13xxx_regulator_init_data *mc13xxx_parse_regulators_dt(
|
|
struct platform_device *pdev, struct mc13xxx_regulator *regulators,
|
|
int num_regulators, int *num_parsed)
|
|
{
|
|
return NULL;
|
|
}
|
|
#endif
|
|
|
|
extern struct regulator_ops mc13xxx_regulator_ops;
|
|
extern struct regulator_ops mc13xxx_fixed_regulator_ops;
|
|
|
|
#define MC13xxx_DEFINE(prefix, _name, _reg, _vsel_reg, _voltages, _ops) \
|
|
[prefix ## _name] = { \
|
|
.desc = { \
|
|
.name = #_name, \
|
|
.n_voltages = ARRAY_SIZE(_voltages), \
|
|
.volt_table = _voltages, \
|
|
.ops = &_ops, \
|
|
.type = REGULATOR_VOLTAGE, \
|
|
.id = prefix ## _name, \
|
|
.owner = THIS_MODULE, \
|
|
}, \
|
|
.reg = prefix ## _reg, \
|
|
.enable_bit = prefix ## _reg ## _ ## _name ## EN, \
|
|
.vsel_reg = prefix ## _vsel_reg, \
|
|
.vsel_shift = prefix ## _vsel_reg ## _ ## _name ## VSEL,\
|
|
.vsel_mask = prefix ## _vsel_reg ## _ ## _name ## VSEL_M,\
|
|
}
|
|
|
|
#define MC13xxx_FIXED_DEFINE(prefix, _name, _reg, _voltages, _ops) \
|
|
[prefix ## _name] = { \
|
|
.desc = { \
|
|
.name = #_name, \
|
|
.n_voltages = ARRAY_SIZE(_voltages), \
|
|
.volt_table = _voltages, \
|
|
.ops = &_ops, \
|
|
.type = REGULATOR_VOLTAGE, \
|
|
.id = prefix ## _name, \
|
|
.owner = THIS_MODULE, \
|
|
}, \
|
|
.reg = prefix ## _reg, \
|
|
.enable_bit = prefix ## _reg ## _ ## _name ## EN, \
|
|
}
|
|
|
|
#define MC13xxx_GPO_DEFINE(prefix, _name, _reg, _voltages, _ops) \
|
|
[prefix ## _name] = { \
|
|
.desc = { \
|
|
.name = #_name, \
|
|
.n_voltages = ARRAY_SIZE(_voltages), \
|
|
.volt_table = _voltages, \
|
|
.ops = &_ops, \
|
|
.type = REGULATOR_VOLTAGE, \
|
|
.id = prefix ## _name, \
|
|
.owner = THIS_MODULE, \
|
|
}, \
|
|
.reg = prefix ## _reg, \
|
|
.enable_bit = prefix ## _reg ## _ ## _name ## EN, \
|
|
}
|
|
|
|
#define MC13xxx_DEFINE_SW(_name, _reg, _vsel_reg, _voltages, ops) \
|
|
MC13xxx_DEFINE(SW, _name, _reg, _vsel_reg, _voltages, ops)
|
|
#define MC13xxx_DEFINE_REGU(_name, _reg, _vsel_reg, _voltages, ops) \
|
|
MC13xxx_DEFINE(REGU, _name, _reg, _vsel_reg, _voltages, ops)
|
|
|
|
#endif
|