commit99c4f70df3upstream. The USB regulator was removed for AB8500 in commit41a06aa738("regulator: ab8500: Remove USB regulator"). It was then added for AB8505 in commit547f384f33("regulator: ab8500: add support for ab8505"). However, there was never an entry added for it in ab8505_regulator_match. This causes all regulators after it to be initialized with the wrong device tree data, eventually leading to an out-of-bounds array read. Given that it is not used anywhere in the kernel, it seems likely that similar arguments against supporting it exist for AB8505 (it is controlled by hardware). Therefore, simply remove it like for AB8500 instead of adding an entry in ab8505_regulator_match. Fixes:547f384f33("regulator: ab8500: add support for ab8505") Cc: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Stephan Gerhold <stephan@gerhold.net> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Link: https://lore.kernel.org/r/20191106173125.14496-1-stephan@gerhold.net Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
169 lines
3.7 KiB
C
169 lines
3.7 KiB
C
/*
|
|
* Copyright (C) ST-Ericsson SA 2010
|
|
*
|
|
* License Terms: GNU General Public License v2
|
|
*
|
|
* Authors: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson
|
|
* Bengt Jonsson <bengt.g.jonsson@stericsson.com> for ST-Ericsson
|
|
* Daniel Willerud <daniel.willerud@stericsson.com> for ST-Ericsson
|
|
*/
|
|
|
|
#ifndef __LINUX_MFD_AB8500_REGULATOR_H
|
|
#define __LINUX_MFD_AB8500_REGULATOR_H
|
|
|
|
#include <linux/platform_device.h>
|
|
|
|
/* AB8500 regulators */
|
|
enum ab8500_regulator_id {
|
|
AB8500_LDO_AUX1,
|
|
AB8500_LDO_AUX2,
|
|
AB8500_LDO_AUX3,
|
|
AB8500_LDO_INTCORE,
|
|
AB8500_LDO_TVOUT,
|
|
AB8500_LDO_AUDIO,
|
|
AB8500_LDO_ANAMIC1,
|
|
AB8500_LDO_ANAMIC2,
|
|
AB8500_LDO_DMIC,
|
|
AB8500_LDO_ANA,
|
|
AB8500_NUM_REGULATORS,
|
|
};
|
|
|
|
/* AB8505 regulators */
|
|
enum ab8505_regulator_id {
|
|
AB8505_LDO_AUX1,
|
|
AB8505_LDO_AUX2,
|
|
AB8505_LDO_AUX3,
|
|
AB8505_LDO_AUX4,
|
|
AB8505_LDO_AUX5,
|
|
AB8505_LDO_AUX6,
|
|
AB8505_LDO_INTCORE,
|
|
AB8505_LDO_ADC,
|
|
AB8505_LDO_AUDIO,
|
|
AB8505_LDO_ANAMIC1,
|
|
AB8505_LDO_ANAMIC2,
|
|
AB8505_LDO_AUX8,
|
|
AB8505_LDO_ANA,
|
|
AB8505_SYSCLKREQ_2,
|
|
AB8505_SYSCLKREQ_4,
|
|
AB8505_NUM_REGULATORS,
|
|
};
|
|
|
|
/* AB8500 and AB8505 register initialization */
|
|
struct ab8500_regulator_reg_init {
|
|
int id;
|
|
u8 mask;
|
|
u8 value;
|
|
};
|
|
|
|
#define INIT_REGULATOR_REGISTER(_id, _mask, _value) \
|
|
{ \
|
|
.id = _id, \
|
|
.mask = _mask, \
|
|
.value = _value, \
|
|
}
|
|
|
|
/* AB8500 registers */
|
|
enum ab8500_regulator_reg {
|
|
AB8500_REGUREQUESTCTRL2,
|
|
AB8500_REGUREQUESTCTRL3,
|
|
AB8500_REGUREQUESTCTRL4,
|
|
AB8500_REGUSYSCLKREQ1HPVALID1,
|
|
AB8500_REGUSYSCLKREQ1HPVALID2,
|
|
AB8500_REGUHWHPREQ1VALID1,
|
|
AB8500_REGUHWHPREQ1VALID2,
|
|
AB8500_REGUHWHPREQ2VALID1,
|
|
AB8500_REGUHWHPREQ2VALID2,
|
|
AB8500_REGUSWHPREQVALID1,
|
|
AB8500_REGUSWHPREQVALID2,
|
|
AB8500_REGUSYSCLKREQVALID1,
|
|
AB8500_REGUSYSCLKREQVALID2,
|
|
AB8500_REGUMISC1,
|
|
AB8500_VAUDIOSUPPLY,
|
|
AB8500_REGUCTRL1VAMIC,
|
|
AB8500_VPLLVANAREGU,
|
|
AB8500_VREFDDR,
|
|
AB8500_EXTSUPPLYREGU,
|
|
AB8500_VAUX12REGU,
|
|
AB8500_VRF1VAUX3REGU,
|
|
AB8500_VAUX1SEL,
|
|
AB8500_VAUX2SEL,
|
|
AB8500_VRF1VAUX3SEL,
|
|
AB8500_REGUCTRL2SPARE,
|
|
AB8500_REGUCTRLDISCH,
|
|
AB8500_REGUCTRLDISCH2,
|
|
AB8500_NUM_REGULATOR_REGISTERS,
|
|
};
|
|
|
|
/* AB8505 registers */
|
|
enum ab8505_regulator_reg {
|
|
AB8505_REGUREQUESTCTRL1,
|
|
AB8505_REGUREQUESTCTRL2,
|
|
AB8505_REGUREQUESTCTRL3,
|
|
AB8505_REGUREQUESTCTRL4,
|
|
AB8505_REGUSYSCLKREQ1HPVALID1,
|
|
AB8505_REGUSYSCLKREQ1HPVALID2,
|
|
AB8505_REGUHWHPREQ1VALID1,
|
|
AB8505_REGUHWHPREQ1VALID2,
|
|
AB8505_REGUHWHPREQ2VALID1,
|
|
AB8505_REGUHWHPREQ2VALID2,
|
|
AB8505_REGUSWHPREQVALID1,
|
|
AB8505_REGUSWHPREQVALID2,
|
|
AB8505_REGUSYSCLKREQVALID1,
|
|
AB8505_REGUSYSCLKREQVALID2,
|
|
AB8505_REGUVAUX4REQVALID,
|
|
AB8505_REGUMISC1,
|
|
AB8505_VAUDIOSUPPLY,
|
|
AB8505_REGUCTRL1VAMIC,
|
|
AB8505_VSMPSAREGU,
|
|
AB8505_VSMPSBREGU,
|
|
AB8505_VSAFEREGU, /* NOTE! PRCMU register */
|
|
AB8505_VPLLVANAREGU,
|
|
AB8505_EXTSUPPLYREGU,
|
|
AB8505_VAUX12REGU,
|
|
AB8505_VRF1VAUX3REGU,
|
|
AB8505_VSMPSASEL1,
|
|
AB8505_VSMPSASEL2,
|
|
AB8505_VSMPSASEL3,
|
|
AB8505_VSMPSBSEL1,
|
|
AB8505_VSMPSBSEL2,
|
|
AB8505_VSMPSBSEL3,
|
|
AB8505_VSAFESEL1, /* NOTE! PRCMU register */
|
|
AB8505_VSAFESEL2, /* NOTE! PRCMU register */
|
|
AB8505_VSAFESEL3, /* NOTE! PRCMU register */
|
|
AB8505_VAUX1SEL,
|
|
AB8505_VAUX2SEL,
|
|
AB8505_VRF1VAUX3SEL,
|
|
AB8505_VAUX4REQCTRL,
|
|
AB8505_VAUX4REGU,
|
|
AB8505_VAUX4SEL,
|
|
AB8505_REGUCTRLDISCH,
|
|
AB8505_REGUCTRLDISCH2,
|
|
AB8505_REGUCTRLDISCH3,
|
|
AB8505_CTRLVAUX5,
|
|
AB8505_CTRLVAUX6,
|
|
AB8505_NUM_REGULATOR_REGISTERS,
|
|
};
|
|
|
|
/* AB8500 external regulators */
|
|
struct ab8500_ext_regulator_cfg {
|
|
bool hwreq; /* requires hw mode or high power mode */
|
|
};
|
|
|
|
enum ab8500_ext_regulator_id {
|
|
AB8500_EXT_SUPPLY1,
|
|
AB8500_EXT_SUPPLY2,
|
|
AB8500_EXT_SUPPLY3,
|
|
AB8500_NUM_EXT_REGULATORS,
|
|
};
|
|
|
|
/* AB8500 regulator platform data */
|
|
struct ab8500_regulator_platform_data {
|
|
int num_reg_init;
|
|
struct ab8500_regulator_reg_init *reg_init;
|
|
int num_regulator;
|
|
struct regulator_init_data *regulator;
|
|
int num_ext_regulator;
|
|
struct regulator_init_data *ext_regulator;
|
|
};
|
|
|
|
#endif
|