mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-28 23:23:55 +08:00
cd2fa6d603
To prevent lots of unnecessary call-backs into platform code, we're now using the GPIO regulator framework to control the 'enable' (en) and 'voltage select' (vsel) GPIO pins which in turn control the MMCI's secondary regulator settings. This already works with Device Tree, but when booting with ATAGs we need to register it as a platform device. Signed-off-by: Lee Jones <lee.jones@linaro.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
424 lines
13 KiB
C
424 lines
13 KiB
C
/*
|
|
* Copyright (C) ST-Ericsson SA 2010
|
|
*
|
|
* License Terms: GNU General Public License v2
|
|
*
|
|
* Authors: Sundar Iyer <sundar.iyer@stericsson.com>
|
|
* Bengt Jonsson <bengt.g.jonsson@stericsson.com>
|
|
*
|
|
* MOP500 board specific initialization for regulators
|
|
*/
|
|
#include <linux/kernel.h>
|
|
#include <linux/regulator/machine.h>
|
|
#include <linux/regulator/ab8500.h>
|
|
#include "board-mop500-regulators.h"
|
|
|
|
static struct regulator_consumer_supply gpio_en_3v3_consumers[] = {
|
|
REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
|
|
};
|
|
|
|
struct regulator_init_data gpio_en_3v3_regulator = {
|
|
.constraints = {
|
|
.name = "EN-3V3",
|
|
.min_uV = 3300000,
|
|
.max_uV = 3300000,
|
|
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
|
},
|
|
.num_consumer_supplies = ARRAY_SIZE(gpio_en_3v3_consumers),
|
|
.consumer_supplies = gpio_en_3v3_consumers,
|
|
};
|
|
|
|
static struct regulator_consumer_supply sdi0_reg_consumers[] = {
|
|
REGULATOR_SUPPLY("vqmmc", "sdi0"),
|
|
};
|
|
|
|
struct regulator_init_data sdi0_reg_init_data = {
|
|
.constraints = {
|
|
.min_uV = 1800000,
|
|
.max_uV = 2900000,
|
|
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE|REGULATOR_CHANGE_STATUS,
|
|
},
|
|
.num_consumer_supplies = ARRAY_SIZE(sdi0_reg_consumers),
|
|
.consumer_supplies = sdi0_reg_consumers,
|
|
};
|
|
|
|
/*
|
|
* TPS61052 regulator
|
|
*/
|
|
static struct regulator_consumer_supply tps61052_vaudio_consumers[] = {
|
|
/*
|
|
* Boost converter supply to raise voltage on audio speaker, this
|
|
* is actually connected to three pins, VInVhfL (left amplifier)
|
|
* VInVhfR (right amplifier) and VIntDClassInt - all three must
|
|
* be connected to the same voltage.
|
|
*/
|
|
REGULATOR_SUPPLY("vintdclassint", "ab8500-codec.0"),
|
|
};
|
|
|
|
struct regulator_init_data tps61052_regulator = {
|
|
.constraints = {
|
|
.name = "vaudio-hf",
|
|
.min_uV = 4500000,
|
|
.max_uV = 4500000,
|
|
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
|
},
|
|
.num_consumer_supplies = ARRAY_SIZE(tps61052_vaudio_consumers),
|
|
.consumer_supplies = tps61052_vaudio_consumers,
|
|
};
|
|
|
|
static struct regulator_consumer_supply ab8500_vaux1_consumers[] = {
|
|
/* External displays, connector on board 2v5 power supply */
|
|
REGULATOR_SUPPLY("vaux12v5", "mcde.0"),
|
|
/* SFH7741 proximity sensor */
|
|
REGULATOR_SUPPLY("vcc", "gpio-keys.0"),
|
|
/* BH1780GLS ambient light sensor */
|
|
REGULATOR_SUPPLY("vcc", "2-0029"),
|
|
/* lsm303dlh accelerometer */
|
|
REGULATOR_SUPPLY("vdd", "3-0018"),
|
|
/* lsm303dlh magnetometer */
|
|
REGULATOR_SUPPLY("vdd", "3-001e"),
|
|
/* Rohm BU21013 Touchscreen devices */
|
|
REGULATOR_SUPPLY("avdd", "3-005c"),
|
|
REGULATOR_SUPPLY("avdd", "3-005d"),
|
|
/* Synaptics RMI4 Touchscreen device */
|
|
REGULATOR_SUPPLY("vdd", "3-004b"),
|
|
};
|
|
|
|
static struct regulator_consumer_supply ab8500_vaux2_consumers[] = {
|
|
/* On-board eMMC power */
|
|
REGULATOR_SUPPLY("vmmc", "sdi4"),
|
|
/* AB8500 audio codec */
|
|
REGULATOR_SUPPLY("vcc-N2158", "ab8500-codec.0"),
|
|
};
|
|
|
|
static struct regulator_consumer_supply ab8500_vaux3_consumers[] = {
|
|
/* External MMC slot power */
|
|
REGULATOR_SUPPLY("vmmc", "sdi0"),
|
|
};
|
|
|
|
static struct regulator_consumer_supply ab8500_vtvout_consumers[] = {
|
|
/* TV-out DENC supply */
|
|
REGULATOR_SUPPLY("vtvout", "ab8500-denc.0"),
|
|
/* Internal general-purpose ADC */
|
|
REGULATOR_SUPPLY("vddadc", "ab8500-gpadc.0"),
|
|
};
|
|
|
|
static struct regulator_consumer_supply ab8500_vaud_consumers[] = {
|
|
/* AB8500 audio-codec main supply */
|
|
REGULATOR_SUPPLY("vaud", "ab8500-codec.0"),
|
|
};
|
|
|
|
static struct regulator_consumer_supply ab8500_vamic1_consumers[] = {
|
|
/* AB8500 audio-codec Mic1 supply */
|
|
REGULATOR_SUPPLY("vamic1", "ab8500-codec.0"),
|
|
};
|
|
|
|
static struct regulator_consumer_supply ab8500_vamic2_consumers[] = {
|
|
/* AB8500 audio-codec Mic2 supply */
|
|
REGULATOR_SUPPLY("vamic2", "ab8500-codec.0"),
|
|
};
|
|
|
|
static struct regulator_consumer_supply ab8500_vdmic_consumers[] = {
|
|
/* AB8500 audio-codec DMic supply */
|
|
REGULATOR_SUPPLY("vdmic", "ab8500-codec.0"),
|
|
};
|
|
|
|
static struct regulator_consumer_supply ab8500_vintcore_consumers[] = {
|
|
/* SoC core supply, no device */
|
|
REGULATOR_SUPPLY("v-intcore", NULL),
|
|
/* USB Transceiver */
|
|
REGULATOR_SUPPLY("vddulpivio18", "ab8500-usb.0"),
|
|
};
|
|
|
|
static struct regulator_consumer_supply ab8500_vana_consumers[] = {
|
|
/* External displays, connector on board, 1v8 power supply */
|
|
REGULATOR_SUPPLY("vsmps2", "mcde.0"),
|
|
};
|
|
|
|
/* ab8500 regulator register initialization */
|
|
struct ab8500_regulator_reg_init
|
|
ab8500_regulator_reg_init[AB8500_NUM_REGULATOR_REGISTERS] = {
|
|
/*
|
|
* VanaRequestCtrl = HP/LP depending on VxRequest
|
|
* VextSupply1RequestCtrl = HP/LP depending on VxRequest
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL2, 0x00),
|
|
/*
|
|
* VextSupply2RequestCtrl = HP/LP depending on VxRequest
|
|
* VextSupply3RequestCtrl = HP/LP depending on VxRequest
|
|
* Vaux1RequestCtrl = HP/LP depending on VxRequest
|
|
* Vaux2RequestCtrl = HP/LP depending on VxRequest
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL3, 0x00),
|
|
/*
|
|
* Vaux3RequestCtrl = HP/LP depending on VxRequest
|
|
* SwHPReq = Control through SWValid disabled
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL4, 0x00),
|
|
/*
|
|
* VanaSysClkReq1HPValid = disabled
|
|
* Vaux1SysClkReq1HPValid = disabled
|
|
* Vaux2SysClkReq1HPValid = disabled
|
|
* Vaux3SysClkReq1HPValid = disabled
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQ1HPVALID1, 0x00),
|
|
/*
|
|
* VextSupply1SysClkReq1HPValid = disabled
|
|
* VextSupply2SysClkReq1HPValid = disabled
|
|
* VextSupply3SysClkReq1HPValid = SysClkReq1 controlled
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQ1HPVALID2, 0x40),
|
|
/*
|
|
* VanaHwHPReq1Valid = disabled
|
|
* Vaux1HwHPreq1Valid = disabled
|
|
* Vaux2HwHPReq1Valid = disabled
|
|
* Vaux3HwHPReqValid = disabled
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ1VALID1, 0x00),
|
|
/*
|
|
* VextSupply1HwHPReq1Valid = disabled
|
|
* VextSupply2HwHPReq1Valid = disabled
|
|
* VextSupply3HwHPReq1Valid = disabled
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ1VALID2, 0x00),
|
|
/*
|
|
* VanaHwHPReq2Valid = disabled
|
|
* Vaux1HwHPReq2Valid = disabled
|
|
* Vaux2HwHPReq2Valid = disabled
|
|
* Vaux3HwHPReq2Valid = disabled
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ2VALID1, 0x00),
|
|
/*
|
|
* VextSupply1HwHPReq2Valid = disabled
|
|
* VextSupply2HwHPReq2Valid = disabled
|
|
* VextSupply3HwHPReq2Valid = HWReq2 controlled
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ2VALID2, 0x04),
|
|
/*
|
|
* VanaSwHPReqValid = disabled
|
|
* Vaux1SwHPReqValid = disabled
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUSWHPREQVALID1, 0x00),
|
|
/*
|
|
* Vaux2SwHPReqValid = disabled
|
|
* Vaux3SwHPReqValid = disabled
|
|
* VextSupply1SwHPReqValid = disabled
|
|
* VextSupply2SwHPReqValid = disabled
|
|
* VextSupply3SwHPReqValid = disabled
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUSWHPREQVALID2, 0x00),
|
|
/*
|
|
* SysClkReq2Valid1 = SysClkReq2 controlled
|
|
* SysClkReq3Valid1 = disabled
|
|
* SysClkReq4Valid1 = SysClkReq4 controlled
|
|
* SysClkReq5Valid1 = disabled
|
|
* SysClkReq6Valid1 = SysClkReq6 controlled
|
|
* SysClkReq7Valid1 = disabled
|
|
* SysClkReq8Valid1 = disabled
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQVALID1, 0x2a),
|
|
/*
|
|
* SysClkReq2Valid2 = disabled
|
|
* SysClkReq3Valid2 = disabled
|
|
* SysClkReq4Valid2 = disabled
|
|
* SysClkReq5Valid2 = disabled
|
|
* SysClkReq6Valid2 = SysClkReq6 controlled
|
|
* SysClkReq7Valid2 = disabled
|
|
* SysClkReq8Valid2 = disabled
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQVALID2, 0x20),
|
|
/*
|
|
* VTVoutEna = disabled
|
|
* Vintcore12Ena = disabled
|
|
* Vintcore12Sel = 1.25 V
|
|
* Vintcore12LP = inactive (HP)
|
|
* VTVoutLP = inactive (HP)
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUMISC1, 0x10),
|
|
/*
|
|
* VaudioEna = disabled
|
|
* VdmicEna = disabled
|
|
* Vamic1Ena = disabled
|
|
* Vamic2Ena = disabled
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_VAUDIOSUPPLY, 0x00),
|
|
/*
|
|
* Vamic1_dzout = high-Z when Vamic1 is disabled
|
|
* Vamic2_dzout = high-Z when Vamic2 is disabled
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUCTRL1VAMIC, 0x00),
|
|
/*
|
|
* VPll = Hw controlled
|
|
* VanaRegu = force off
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_VPLLVANAREGU, 0x02),
|
|
/*
|
|
* VrefDDREna = disabled
|
|
* VrefDDRSleepMode = inactive (no pulldown)
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_VREFDDR, 0x00),
|
|
/*
|
|
* VextSupply1Regu = HW control
|
|
* VextSupply2Regu = HW control
|
|
* VextSupply3Regu = HW control
|
|
* ExtSupply2Bypass = ExtSupply12LPn ball is 0 when Ena is 0
|
|
* ExtSupply3Bypass = ExtSupply3LPn ball is 0 when Ena is 0
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_EXTSUPPLYREGU, 0x2a),
|
|
/*
|
|
* Vaux1Regu = force HP
|
|
* Vaux2Regu = force off
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_VAUX12REGU, 0x01),
|
|
/*
|
|
* Vaux3regu = force off
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_VRF1VAUX3REGU, 0x00),
|
|
/*
|
|
* Vsmps1 = 1.15V
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_VSMPS1SEL1, 0x24),
|
|
/*
|
|
* Vaux1Sel = 2.5 V
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_VAUX1SEL, 0x08),
|
|
/*
|
|
* Vaux2Sel = 2.9 V
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_VAUX2SEL, 0x0d),
|
|
/*
|
|
* Vaux3Sel = 2.91 V
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_VRF1VAUX3SEL, 0x07),
|
|
/*
|
|
* VextSupply12LP = disabled (no LP)
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUCTRL2SPARE, 0x00),
|
|
/*
|
|
* Vaux1Disch = short discharge time
|
|
* Vaux2Disch = short discharge time
|
|
* Vaux3Disch = short discharge time
|
|
* Vintcore12Disch = short discharge time
|
|
* VTVoutDisch = short discharge time
|
|
* VaudioDisch = short discharge time
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUCTRLDISCH, 0x00),
|
|
/*
|
|
* VanaDisch = short discharge time
|
|
* VdmicPullDownEna = pulldown disabled when Vdmic is disabled
|
|
* VdmicDisch = short discharge time
|
|
*/
|
|
INIT_REGULATOR_REGISTER(AB8500_REGUCTRLDISCH2, 0x00),
|
|
};
|
|
|
|
/* AB8500 regulators */
|
|
struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = {
|
|
/* supplies to the display/camera */
|
|
[AB8500_LDO_AUX1] = {
|
|
.constraints = {
|
|
.name = "V-DISPLAY",
|
|
.min_uV = 2500000,
|
|
.max_uV = 2900000,
|
|
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
|
|
REGULATOR_CHANGE_STATUS,
|
|
.boot_on = 1, /* display is on at boot */
|
|
/*
|
|
* This voltage cannot be disabled right now because
|
|
* it is somehow affecting the external MMC
|
|
* functionality, though that typically will use
|
|
* AUX3.
|
|
*/
|
|
.always_on = 1,
|
|
},
|
|
.num_consumer_supplies = ARRAY_SIZE(ab8500_vaux1_consumers),
|
|
.consumer_supplies = ab8500_vaux1_consumers,
|
|
},
|
|
/* supplies to the on-board eMMC */
|
|
[AB8500_LDO_AUX2] = {
|
|
.constraints = {
|
|
.name = "V-eMMC1",
|
|
.min_uV = 1100000,
|
|
.max_uV = 3300000,
|
|
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
|
|
REGULATOR_CHANGE_STATUS,
|
|
},
|
|
.num_consumer_supplies = ARRAY_SIZE(ab8500_vaux2_consumers),
|
|
.consumer_supplies = ab8500_vaux2_consumers,
|
|
},
|
|
/* supply for VAUX3, supplies to SDcard slots */
|
|
[AB8500_LDO_AUX3] = {
|
|
.constraints = {
|
|
.name = "V-MMC-SD",
|
|
.min_uV = 1100000,
|
|
.max_uV = 3300000,
|
|
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
|
|
REGULATOR_CHANGE_STATUS,
|
|
},
|
|
.num_consumer_supplies = ARRAY_SIZE(ab8500_vaux3_consumers),
|
|
.consumer_supplies = ab8500_vaux3_consumers,
|
|
},
|
|
/* supply for tvout, gpadc, TVOUT LDO */
|
|
[AB8500_LDO_TVOUT] = {
|
|
.constraints = {
|
|
.name = "V-TVOUT",
|
|
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
|
},
|
|
.num_consumer_supplies = ARRAY_SIZE(ab8500_vtvout_consumers),
|
|
.consumer_supplies = ab8500_vtvout_consumers,
|
|
},
|
|
/* supply for ab8500-vaudio, VAUDIO LDO */
|
|
[AB8500_LDO_AUDIO] = {
|
|
.constraints = {
|
|
.name = "V-AUD",
|
|
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
|
},
|
|
.num_consumer_supplies = ARRAY_SIZE(ab8500_vaud_consumers),
|
|
.consumer_supplies = ab8500_vaud_consumers,
|
|
},
|
|
/* supply for v-anamic1 VAMic1-LDO */
|
|
[AB8500_LDO_ANAMIC1] = {
|
|
.constraints = {
|
|
.name = "V-AMIC1",
|
|
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
|
},
|
|
.num_consumer_supplies = ARRAY_SIZE(ab8500_vamic1_consumers),
|
|
.consumer_supplies = ab8500_vamic1_consumers,
|
|
},
|
|
/* supply for v-amic2, VAMIC2 LDO, reuse constants for AMIC1 */
|
|
[AB8500_LDO_ANAMIC2] = {
|
|
.constraints = {
|
|
.name = "V-AMIC2",
|
|
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
|
},
|
|
.num_consumer_supplies = ARRAY_SIZE(ab8500_vamic2_consumers),
|
|
.consumer_supplies = ab8500_vamic2_consumers,
|
|
},
|
|
/* supply for v-dmic, VDMIC LDO */
|
|
[AB8500_LDO_DMIC] = {
|
|
.constraints = {
|
|
.name = "V-DMIC",
|
|
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
|
},
|
|
.num_consumer_supplies = ARRAY_SIZE(ab8500_vdmic_consumers),
|
|
.consumer_supplies = ab8500_vdmic_consumers,
|
|
},
|
|
/* supply for v-intcore12, VINTCORE12 LDO */
|
|
[AB8500_LDO_INTCORE] = {
|
|
.constraints = {
|
|
.name = "V-INTCORE",
|
|
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
|
},
|
|
.num_consumer_supplies = ARRAY_SIZE(ab8500_vintcore_consumers),
|
|
.consumer_supplies = ab8500_vintcore_consumers,
|
|
},
|
|
/* supply for U8500 CSI/DSI, VANA LDO */
|
|
[AB8500_LDO_ANA] = {
|
|
.constraints = {
|
|
.name = "V-CSI/DSI",
|
|
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
|
},
|
|
.num_consumer_supplies = ARRAY_SIZE(ab8500_vana_consumers),
|
|
.consumer_supplies = ab8500_vana_consumers,
|
|
},
|
|
};
|