Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
c98cac89
Commit
c98cac89
authored
Apr 28, 2013
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'regulator/topic/ab8500' into v3.9-rc8
parents
9e63d230
5d9de8b1
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
3917 additions
and
294 deletions
+3917
-294
arch/arm/mach-ux500/board-mop500-regulators.c
arch/arm/mach-ux500/board-mop500-regulators.c
+714
-60
arch/arm/mach-ux500/board-mop500-regulators.h
arch/arm/mach-ux500/board-mop500-regulators.h
+4
-3
arch/arm/mach-ux500/board-mop500.c
arch/arm/mach-ux500/board-mop500.c
+1
-4
drivers/regulator/Makefile
drivers/regulator/Makefile
+1
-1
drivers/regulator/ab8500-ext.c
drivers/regulator/ab8500-ext.c
+407
-0
drivers/regulator/ab8500.c
drivers/regulator/ab8500.c
+2579
-207
drivers/regulator/dbx500-prcmu.h
drivers/regulator/dbx500-prcmu.h
+0
-2
include/linux/mfd/abx500/ab8500.h
include/linux/mfd/abx500/ab8500.h
+2
-9
include/linux/regulator/ab8500.h
include/linux/regulator/ab8500.h
+209
-8
No files found.
arch/arm/mach-ux500/board-mop500-regulators.c
View file @
c98cac89
...
...
@@ -5,6 +5,7 @@
*
* Authors: Sundar Iyer <sundar.iyer@stericsson.com>
* Bengt Jonsson <bengt.g.jonsson@stericsson.com>
* Daniel Willerud <daniel.willerud@stericsson.com>
*
* MOP500 board specific initialization for regulators
*/
...
...
@@ -12,6 +13,7 @@
#include <linux/regulator/machine.h>
#include <linux/regulator/ab8500.h>
#include "board-mop500-regulators.h"
#include "id.h"
static
struct
regulator_consumer_supply
gpio_en_3v3_consumers
[]
=
{
REGULATOR_SUPPLY
(
"vdd33a"
,
"smsc911x.0"
),
...
...
@@ -53,21 +55,37 @@ struct regulator_init_data tps61052_regulator = {
};
static
struct
regulator_consumer_supply
ab8500_vaux1_consumers
[]
=
{
/* External displays, connector on board 2v5 power supply */
REGULATOR_SUPPLY
(
"vaux12v5"
,
"mcde.0"
),
/* Main display, u8500 R3 uib */
REGULATOR_SUPPLY
(
"vddi"
,
"mcde_disp_sony_acx424akp.0"
),
/* Main display, u8500 uib and ST uib */
REGULATOR_SUPPLY
(
"vdd1"
,
"samsung_s6d16d0.0"
),
/* Secondary display, ST uib */
REGULATOR_SUPPLY
(
"vdd1"
,
"samsung_s6d16d0.1"
),
/* 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"
),
REGULATOR_SUPPLY
(
"vdd"
,
"2-0018"
),
/* lsm303dlhc accelerometer */
REGULATOR_SUPPLY
(
"vdd"
,
"2-0019"
),
/* lsm303dlh magnetometer */
REGULATOR_SUPPLY
(
"vdd"
,
"
3
-001e"
),
REGULATOR_SUPPLY
(
"vdd"
,
"
2
-001e"
),
/* Rohm BU21013 Touchscreen devices */
REGULATOR_SUPPLY
(
"avdd"
,
"3-005c"
),
REGULATOR_SUPPLY
(
"avdd"
,
"3-005d"
),
/* Synaptics RMI4 Touchscreen device */
REGULATOR_SUPPLY
(
"vdd"
,
"3-004b"
),
/* L3G4200D Gyroscope device */
REGULATOR_SUPPLY
(
"vdd"
,
"2-0068"
),
/* Ambient light sensor device */
REGULATOR_SUPPLY
(
"vdd"
,
"3-0029"
),
/* Pressure sensor device */
REGULATOR_SUPPLY
(
"vdd"
,
"2-005c"
),
/* Cypress TrueTouch Touchscreen device */
REGULATOR_SUPPLY
(
"vcpin"
,
"spi8.0"
),
/* Camera device */
REGULATOR_SUPPLY
(
"vaux12v5"
,
"mmio_camera"
),
};
static
struct
regulator_consumer_supply
ab8500_vaux2_consumers
[]
=
{
...
...
@@ -75,18 +93,50 @@ static struct regulator_consumer_supply ab8500_vaux2_consumers[] = {
REGULATOR_SUPPLY
(
"vmmc"
,
"sdi4"
),
/* AB8500 audio codec */
REGULATOR_SUPPLY
(
"vcc-N2158"
,
"ab8500-codec.0"
),
/* AB8500 accessory detect 1 */
REGULATOR_SUPPLY
(
"vcc-N2158"
,
"ab8500-acc-det.0"
),
/* AB8500 Tv-out device */
REGULATOR_SUPPLY
(
"vcc-N2158"
,
"mcde_tv_ab8500.4"
),
/* AV8100 HDMI device */
REGULATOR_SUPPLY
(
"vcc-N2158"
,
"av8100_hdmi.3"
),
};
static
struct
regulator_consumer_supply
ab8500_vaux3_consumers
[]
=
{
REGULATOR_SUPPLY
(
"v-SD-STM"
,
"stm"
),
/* External MMC slot power */
REGULATOR_SUPPLY
(
"vmmc"
,
"sdi0"
),
};
static
struct
regulator_consumer_supply
ab8505_vaux4_consumers
[]
=
{
};
static
struct
regulator_consumer_supply
ab8505_vaux5_consumers
[]
=
{
};
static
struct
regulator_consumer_supply
ab8505_vaux6_consumers
[]
=
{
};
static
struct
regulator_consumer_supply
ab8505_vaux8_consumers
[]
=
{
/* AB8500 audio codec device */
REGULATOR_SUPPLY
(
"v-aux8"
,
NULL
),
};
static
struct
regulator_consumer_supply
ab8505_vadc_consumers
[]
=
{
/* Internal general-purpose ADC */
REGULATOR_SUPPLY
(
"vddadc"
,
"ab8500-gpadc.0"
),
/* ADC for charger */
REGULATOR_SUPPLY
(
"vddadc"
,
"ab8500-charger.0"
),
};
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"
),
/* ADC for charger */
REGULATOR_SUPPLY
(
"vddadc"
,
"ab8500-charger.0"
),
/* AB8500 Tv-out device */
REGULATOR_SUPPLY
(
"vtvout"
,
"mcde_tv_ab8500.4"
),
};
static
struct
regulator_consumer_supply
ab8500_vaud_consumers
[]
=
{
...
...
@@ -114,77 +164,90 @@ static struct regulator_consumer_supply ab8500_vintcore_consumers[] = {
REGULATOR_SUPPLY
(
"v-intcore"
,
NULL
),
/* USB Transceiver */
REGULATOR_SUPPLY
(
"vddulpivio18"
,
"ab8500-usb.0"
),
/* Handled by abx500 clk driver */
REGULATOR_SUPPLY
(
"v-intcore"
,
"abx500-clk.0"
),
};
static
struct
regulator_consumer_supply
ab8505_usb_consumers
[]
=
{
/* HS USB OTG physical interface */
REGULATOR_SUPPLY
(
"v-ape"
,
NULL
),
};
static
struct
regulator_consumer_supply
ab8500_vana_consumers
[]
=
{
/* External displays, connector on board, 1v8 power supply */
REGULATOR_SUPPLY
(
"vsmps2"
,
"mcde.0"
),
/* DB8500 DSI */
REGULATOR_SUPPLY
(
"vdddsi1v2"
,
"mcde"
),
REGULATOR_SUPPLY
(
"vdddsi1v2"
,
"b2r2_core"
),
REGULATOR_SUPPLY
(
"vdddsi1v2"
,
"b2r2_1_core"
),
REGULATOR_SUPPLY
(
"vdddsi1v2"
,
"dsilink.0"
),
REGULATOR_SUPPLY
(
"vdddsi1v2"
,
"dsilink.1"
),
REGULATOR_SUPPLY
(
"vdddsi1v2"
,
"dsilink.2"
),
/* DB8500 CSI */
REGULATOR_SUPPLY
(
"vddcsi1v2"
,
"mmio_camera"
),
};
/* ab8500 regulator register initialization */
struct
ab8500_regulator_reg_init
ab8500_regulator_reg_init
[
AB8500_NUM_REGULATOR_REGISTERS
]
=
{
static
struct
ab8500_regulator_reg_init
ab8500_reg_init
[]
=
{
/*
* VanaRequestCtrl = HP/LP depending on VxRequest
* VextSupply1RequestCtrl = HP/LP depending on VxRequest
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUREQUESTCTRL2
,
0x00
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUREQUESTCTRL2
,
0xf0
,
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
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUREQUESTCTRL3
,
0xff
,
0x00
),
/*
* Vaux3RequestCtrl = HP/LP depending on VxRequest
* SwHPReq = Control through SWValid disabled
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUREQUESTCTRL4
,
0x00
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUREQUESTCTRL4
,
0x07
,
0x00
),
/*
* VanaSysClkReq1HPValid = disabled
* Vaux1SysClkReq1HPValid = disabled
* Vaux2SysClkReq1HPValid = disabled
* Vaux3SysClkReq1HPValid = disabled
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUSYSCLKREQ1HPVALID1
,
0x00
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUSYSCLKREQ1HPVALID1
,
0x
e8
,
0x
00
),
/*
* VextSupply1SysClkReq1HPValid = disabled
* VextSupply2SysClkReq1HPValid = disabled
* VextSupply3SysClkReq1HPValid = SysClkReq1 controlled
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUSYSCLKREQ1HPVALID2
,
0x40
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUSYSCLKREQ1HPVALID2
,
0x
70
,
0x
40
),
/*
* VanaHwHPReq1Valid = disabled
* Vaux1HwHPreq1Valid = disabled
* Vaux2HwHPReq1Valid = disabled
* Vaux3HwHPReqValid = disabled
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUHWHPREQ1VALID1
,
0x00
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUHWHPREQ1VALID1
,
0xe8
,
0x00
),
/*
* VextSupply1HwHPReq1Valid = disabled
* VextSupply2HwHPReq1Valid = disabled
* VextSupply3HwHPReq1Valid = disabled
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUHWHPREQ1VALID2
,
0x00
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUHWHPREQ1VALID2
,
0x07
,
0x00
),
/*
* VanaHwHPReq2Valid = disabled
* Vaux1HwHPReq2Valid = disabled
* Vaux2HwHPReq2Valid = disabled
* Vaux3HwHPReq2Valid = disabled
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUHWHPREQ2VALID1
,
0x00
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUHWHPREQ2VALID1
,
0xe8
,
0x00
),
/*
* VextSupply1HwHPReq2Valid = disabled
* VextSupply2HwHPReq2Valid = disabled
* VextSupply3HwHPReq2Valid = HWReq2 controlled
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUHWHPREQ2VALID2
,
0x04
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUHWHPREQ2VALID2
,
0x07
,
0x04
),
/*
* VanaSwHPReqValid = disabled
* Vaux1SwHPReqValid = disabled
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUSWHPREQVALID1
,
0x00
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUSWHPREQVALID1
,
0xa0
,
0x00
),
/*
* Vaux2SwHPReqValid = disabled
* Vaux3SwHPReqValid = disabled
...
...
@@ -192,7 +255,7 @@ ab8500_regulator_reg_init[AB8500_NUM_REGULATOR_REGISTERS] = {
* VextSupply2SwHPReqValid = disabled
* VextSupply3SwHPReqValid = disabled
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUSWHPREQVALID2
,
0x00
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUSWHPREQVALID2
,
0x1f
,
0x00
),
/*
* SysClkReq2Valid1 = SysClkReq2 controlled
* SysClkReq3Valid1 = disabled
...
...
@@ -202,7 +265,7 @@ ab8500_regulator_reg_init[AB8500_NUM_REGULATOR_REGISTERS] = {
* SysClkReq7Valid1 = disabled
* SysClkReq8Valid1 = disabled
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUSYSCLKREQVALID1
,
0x2a
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUSYSCLKREQVALID1
,
0xfe
,
0x2a
),
/*
* SysClkReq2Valid2 = disabled
* SysClkReq3Valid2 = disabled
...
...
@@ -212,7 +275,7 @@ ab8500_regulator_reg_init[AB8500_NUM_REGULATOR_REGISTERS] = {
* SysClkReq7Valid2 = disabled
* SysClkReq8Valid2 = disabled
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUSYSCLKREQVALID2
,
0x20
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUSYSCLKREQVALID2
,
0xfe
,
0x20
),
/*
* VTVoutEna = disabled
* Vintcore12Ena = disabled
...
...
@@ -220,66 +283,62 @@ ab8500_regulator_reg_init[AB8500_NUM_REGULATOR_REGISTERS] = {
* Vintcore12LP = inactive (HP)
* VTVoutLP = inactive (HP)
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUMISC1
,
0x10
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUMISC1
,
0xfe
,
0x10
),
/*
* VaudioEna = disabled
* VdmicEna = disabled
* Vamic1Ena = disabled
* Vamic2Ena = disabled
*/
INIT_REGULATOR_REGISTER
(
AB8500_VAUDIOSUPPLY
,
0x00
),
INIT_REGULATOR_REGISTER
(
AB8500_VAUDIOSUPPLY
,
0x1e
,
0x00
),
/*
* Vamic1_dzout = high-Z when Vamic1 is disabled
* Vamic2_dzout = high-Z when Vamic2 is disabled
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUCTRL1VAMIC
,
0x00
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUCTRL1VAMIC
,
0x03
,
0x00
),
/*
* VPll = Hw controlled
* VPll = Hw controlled
(NOTE! PRCMU bits)
* VanaRegu = force off
*/
INIT_REGULATOR_REGISTER
(
AB8500_VPLLVANAREGU
,
0x02
),
INIT_REGULATOR_REGISTER
(
AB8500_VPLLVANAREGU
,
0x0f
,
0x02
),
/*
* VrefDDREna = disabled
* VrefDDRSleepMode = inactive (no pulldown)
*/
INIT_REGULATOR_REGISTER
(
AB8500_VREFDDR
,
0x00
),
INIT_REGULATOR_REGISTER
(
AB8500_VREFDDR
,
0x03
,
0x00
),
/*
* VextSupply1Regu =
HW control
* VextSupply2Regu =
HW control
* VextSupply3Regu =
HW control
* VextSupply1Regu =
force LP
* VextSupply2Regu =
force OFF
* VextSupply3Regu =
force HP (-> STBB2=LP and TPS=LP)
* ExtSupply2Bypass = ExtSupply12LPn ball is 0 when Ena is 0
* ExtSupply3Bypass = ExtSupply3LPn ball is 0 when Ena is 0
*/
INIT_REGULATOR_REGISTER
(
AB8500_EXTSUPPLYREGU
,
0x2a
),
INIT_REGULATOR_REGISTER
(
AB8500_EXTSUPPLYREGU
,
0xff
,
0x13
),
/*
* Vaux1Regu = force HP
* Vaux2Regu = force off
*/
INIT_REGULATOR_REGISTER
(
AB8500_VAUX12REGU
,
0x01
),
INIT_REGULATOR_REGISTER
(
AB8500_VAUX12REGU
,
0x0f
,
0x01
),
/*
* Vaux3
r
egu = force off
* Vaux3
R
egu = force off
*/
INIT_REGULATOR_REGISTER
(
AB8500_VRF1VAUX3REGU
,
0x00
),
INIT_REGULATOR_REGISTER
(
AB8500_VRF1VAUX3REGU
,
0x03
,
0x00
),
/*
* V
smps1 = 1.15
V
* V
aux1Sel = 2.8
V
*/
INIT_REGULATOR_REGISTER
(
AB8500_VSMPS1SEL1
,
0x24
),
/*
* Vaux1Sel = 2.5 V
*/
INIT_REGULATOR_REGISTER
(
AB8500_VAUX1SEL
,
0x08
),
INIT_REGULATOR_REGISTER
(
AB8500_VAUX1SEL
,
0x0f
,
0x0C
),
/*
* Vaux2Sel = 2.9 V
*/
INIT_REGULATOR_REGISTER
(
AB8500_VAUX2SEL
,
0x0d
),
INIT_REGULATOR_REGISTER
(
AB8500_VAUX2SEL
,
0x0f
,
0x0d
),
/*
* Vaux3Sel = 2.91 V
*/
INIT_REGULATOR_REGISTER
(
AB8500_VRF1VAUX3SEL
,
0x07
),
INIT_REGULATOR_REGISTER
(
AB8500_VRF1VAUX3SEL
,
0x07
,
0x07
),
/*
* VextSupply12LP = disabled (no LP)
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUCTRL2SPARE
,
0x00
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUCTRL2SPARE
,
0x01
,
0x00
),
/*
* Vaux1Disch = short discharge time
* Vaux2Disch = short discharge time
...
...
@@ -288,33 +347,26 @@ ab8500_regulator_reg_init[AB8500_NUM_REGULATOR_REGISTERS] = {
* VTVoutDisch = short discharge time
* VaudioDisch = short discharge time
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUCTRLDISCH
,
0x00
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUCTRLDISCH
,
0xfc
,
0x00
),
/*
* VanaDisch = short discharge time
* VdmicPullDownEna = pulldown disabled when Vdmic is disabled
* VdmicDisch = short discharge time
*/
INIT_REGULATOR_REGISTER
(
AB8500_REGUCTRLDISCH2
,
0x00
),
INIT_REGULATOR_REGISTER
(
AB8500_REGUCTRLDISCH2
,
0x16
,
0x00
),
};
/* AB8500 regulators */
struct
regulator_init_data
ab8500_regulators
[
AB8500_NUM_REGULATORS
]
=
{
st
atic
st
ruct
regulator_init_data
ab8500_regulators
[
AB8500_NUM_REGULATORS
]
=
{
/* supplies to the display/camera */
[
AB8500_LDO_AUX1
]
=
{
.
constraints
=
{
.
name
=
"V-DISPLAY"
,
.
min_uV
=
2
5
00000
,
.
max_uV
=
29
00000
,
.
min_uV
=
2
8
00000
,
.
max_uV
=
33
00000
,
.
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
,
...
...
@@ -326,7 +378,10 @@ struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = {
.
min_uV
=
1100000
,
.
max_uV
=
3300000
,
.
valid_ops_mask
=
REGULATOR_CHANGE_VOLTAGE
|
REGULATOR_CHANGE_STATUS
,
REGULATOR_CHANGE_STATUS
|
REGULATOR_CHANGE_MODE
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_IDLE
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8500_vaux2_consumers
),
.
consumer_supplies
=
ab8500_vaux2_consumers
,
...
...
@@ -338,7 +393,10 @@ struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = {
.
min_uV
=
1100000
,
.
max_uV
=
3300000
,
.
valid_ops_mask
=
REGULATOR_CHANGE_VOLTAGE
|
REGULATOR_CHANGE_STATUS
,
REGULATOR_CHANGE_STATUS
|
REGULATOR_CHANGE_MODE
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_IDLE
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8500_vaux3_consumers
),
.
consumer_supplies
=
ab8500_vaux3_consumers
,
...
...
@@ -392,18 +450,614 @@ struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = {
[
AB8500_LDO_INTCORE
]
=
{
.
constraints
=
{
.
name
=
"V-INTCORE"
,
.
valid_ops_mask
=
REGULATOR_CHANGE_STATUS
,
.
min_uV
=
1250000
,
.
max_uV
=
1350000
,
.
input_uV
=
1800000
,
.
valid_ops_mask
=
REGULATOR_CHANGE_VOLTAGE
|
REGULATOR_CHANGE_STATUS
|
REGULATOR_CHANGE_MODE
|
REGULATOR_CHANGE_DRMS
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_IDLE
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8500_vintcore_consumers
),
.
consumer_supplies
=
ab8500_vintcore_consumers
,
},
/* supply for U8500 CSI
/
DSI, VANA LDO */
/* supply for U8500 CSI
-
DSI, VANA LDO */
[
AB8500_LDO_ANA
]
=
{
.
constraints
=
{
.
name
=
"V-CSI
/
DSI"
,
.
name
=
"V-CSI
-
DSI"
,
.
valid_ops_mask
=
REGULATOR_CHANGE_STATUS
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8500_vana_consumers
),
.
consumer_supplies
=
ab8500_vana_consumers
,
},
};
/* supply for VextSupply3 */
static
struct
regulator_consumer_supply
ab8500_ext_supply3_consumers
[]
=
{
/* SIM supply for 3 V SIM cards */
REGULATOR_SUPPLY
(
"vinvsim"
,
"sim-detect.0"
),
};
/* extended configuration for VextSupply2, only used for HREFP_V20 boards */
static
struct
ab8500_ext_regulator_cfg
ab8500_ext_supply2
=
{
.
hwreq
=
true
,
};
/*
* AB8500 external regulators
*/
static
struct
regulator_init_data
ab8500_ext_regulators
[]
=
{
/* fixed Vbat supplies VSMPS1_EXT_1V8 */
[
AB8500_EXT_SUPPLY1
]
=
{
.
constraints
=
{
.
name
=
"ab8500-ext-supply1"
,
.
min_uV
=
1800000
,
.
max_uV
=
1800000
,
.
initial_mode
=
REGULATOR_MODE_IDLE
,
.
boot_on
=
1
,
.
always_on
=
1
,
},
},
/* fixed Vbat supplies VSMPS2_EXT_1V36 and VSMPS5_EXT_1V15 */
[
AB8500_EXT_SUPPLY2
]
=
{
.
constraints
=
{
.
name
=
"ab8500-ext-supply2"
,
.
min_uV
=
1360000
,
.
max_uV
=
1360000
,
},
},
/* fixed Vbat supplies VSMPS3_EXT_3V4 and VSMPS4_EXT_3V4 */
[
AB8500_EXT_SUPPLY3
]
=
{
.
constraints
=
{
.
name
=
"ab8500-ext-supply3"
,
.
min_uV
=
3400000
,
.
max_uV
=
3400000
,
.
valid_ops_mask
=
REGULATOR_CHANGE_STATUS
,
.
boot_on
=
1
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8500_ext_supply3_consumers
),
.
consumer_supplies
=
ab8500_ext_supply3_consumers
,
},
};
/* ab8505 regulator register initialization */
static
struct
ab8500_regulator_reg_init
ab8505_reg_init
[]
=
{
/*
* VarmRequestCtrl
* VsmpsCRequestCtrl
* VsmpsARequestCtrl
* VsmpsBRequestCtrl
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUREQUESTCTRL1
,
0x00
,
0x00
),
/*
* VsafeRequestCtrl
* VpllRequestCtrl
* VanaRequestCtrl = HP/LP depending on VxRequest
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUREQUESTCTRL2
,
0x30
,
0x00
),
/*
* Vaux1RequestCtrl = HP/LP depending on VxRequest
* Vaux2RequestCtrl = HP/LP depending on VxRequest
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUREQUESTCTRL3
,
0xf0
,
0x00
),
/*
* Vaux3RequestCtrl = HP/LP depending on VxRequest
* SwHPReq = Control through SWValid disabled
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUREQUESTCTRL4
,
0x07
,
0x00
),
/*
* VsmpsASysClkReq1HPValid
* VsmpsBSysClkReq1HPValid
* VsafeSysClkReq1HPValid
* VanaSysClkReq1HPValid = disabled
* VpllSysClkReq1HPValid
* Vaux1SysClkReq1HPValid = disabled
* Vaux2SysClkReq1HPValid = disabled
* Vaux3SysClkReq1HPValid = disabled
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUSYSCLKREQ1HPVALID1
,
0xe8
,
0x00
),
/*
* VsmpsCSysClkReq1HPValid
* VarmSysClkReq1HPValid
* VbbSysClkReq1HPValid
* VsmpsMSysClkReq1HPValid
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUSYSCLKREQ1HPVALID2
,
0x00
,
0x00
),
/*
* VsmpsAHwHPReq1Valid
* VsmpsBHwHPReq1Valid
* VsafeHwHPReq1Valid
* VanaHwHPReq1Valid = disabled
* VpllHwHPReq1Valid
* Vaux1HwHPreq1Valid = disabled
* Vaux2HwHPReq1Valid = disabled
* Vaux3HwHPReqValid = disabled
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUHWHPREQ1VALID1
,
0xe8
,
0x00
),
/*
* VsmpsMHwHPReq1Valid
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUHWHPREQ1VALID2
,
0x00
,
0x00
),
/*
* VsmpsAHwHPReq2Valid
* VsmpsBHwHPReq2Valid
* VsafeHwHPReq2Valid
* VanaHwHPReq2Valid = disabled
* VpllHwHPReq2Valid
* Vaux1HwHPReq2Valid = disabled
* Vaux2HwHPReq2Valid = disabled
* Vaux3HwHPReq2Valid = disabled
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUHWHPREQ2VALID1
,
0xe8
,
0x00
),
/*
* VsmpsMHwHPReq2Valid
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUHWHPREQ2VALID2
,
0x00
,
0x00
),
/**
* VsmpsCSwHPReqValid
* VarmSwHPReqValid
* VsmpsASwHPReqValid
* VsmpsBSwHPReqValid
* VsafeSwHPReqValid
* VanaSwHPReqValid
* VanaSwHPReqValid = disabled
* VpllSwHPReqValid
* Vaux1SwHPReqValid = disabled
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUSWHPREQVALID1
,
0xa0
,
0x00
),
/*
* Vaux2SwHPReqValid = disabled
* Vaux3SwHPReqValid = disabled
* VsmpsMSwHPReqValid
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUSWHPREQVALID2
,
0x03
,
0x00
),
/*
* SysClkReq2Valid1 = SysClkReq2 controlled
* SysClkReq3Valid1 = disabled
* SysClkReq4Valid1 = SysClkReq4 controlled
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUSYSCLKREQVALID1
,
0x0e
,
0x0a
),
/*
* SysClkReq2Valid2 = disabled
* SysClkReq3Valid2 = disabled
* SysClkReq4Valid2 = disabled
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUSYSCLKREQVALID2
,
0x0e
,
0x00
),
/*
* Vaux4SwHPReqValid
* Vaux4HwHPReq2Valid
* Vaux4HwHPReq1Valid
* Vaux4SysClkReq1HPValid
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUVAUX4REQVALID
,
0x00
,
0x00
),
/*
* VadcEna = disabled
* VintCore12Ena = disabled
* VintCore12Sel = 1.25 V
* VintCore12LP = inactive (HP)
* VadcLP = inactive (HP)
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUMISC1
,
0xfe
,
0x10
),
/*
* VaudioEna = disabled
* Vaux8Ena = disabled
* Vamic1Ena = disabled
* Vamic2Ena = disabled
*/
INIT_REGULATOR_REGISTER
(
AB8505_VAUDIOSUPPLY
,
0x1e
,
0x00
),
/*
* Vamic1_dzout = high-Z when Vamic1 is disabled
* Vamic2_dzout = high-Z when Vamic2 is disabled
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUCTRL1VAMIC
,
0x03
,
0x00
),
/*
* VsmpsARegu
* VsmpsASelCtrl
* VsmpsAAutoMode
* VsmpsAPWMMode
*/
INIT_REGULATOR_REGISTER
(
AB8505_VSMPSAREGU
,
0x00
,
0x00
),
/*
* VsmpsBRegu
* VsmpsBSelCtrl
* VsmpsBAutoMode
* VsmpsBPWMMode
*/
INIT_REGULATOR_REGISTER
(
AB8505_VSMPSBREGU
,
0x00
,
0x00
),
/*
* VsafeRegu
* VsafeSelCtrl
* VsafeAutoMode
* VsafePWMMode
*/
INIT_REGULATOR_REGISTER
(
AB8505_VSAFEREGU
,
0x00
,
0x00
),
/*
* VPll = Hw controlled (NOTE! PRCMU bits)
* VanaRegu = force off
*/
INIT_REGULATOR_REGISTER
(
AB8505_VPLLVANAREGU
,
0x0f
,
0x02
),
/*
* VextSupply1Regu = force OFF (OTP_ExtSupply12LPnPolarity 1)
* VextSupply2Regu = force OFF (OTP_ExtSupply12LPnPolarity 1)
* VextSupply3Regu = force OFF (OTP_ExtSupply3LPnPolarity 0)
* ExtSupply2Bypass = ExtSupply12LPn ball is 0 when Ena is 0
* ExtSupply3Bypass = ExtSupply3LPn ball is 0 when Ena is 0
*/
INIT_REGULATOR_REGISTER
(
AB8505_EXTSUPPLYREGU
,
0xff
,
0x30
),
/*
* Vaux1Regu = force HP
* Vaux2Regu = force off
*/
INIT_REGULATOR_REGISTER
(
AB8505_VAUX12REGU
,
0x0f
,
0x01
),
/*
* Vaux3Regu = force off
*/
INIT_REGULATOR_REGISTER
(
AB8505_VRF1VAUX3REGU
,
0x03
,
0x00
),
/*
* VsmpsASel1
*/
INIT_REGULATOR_REGISTER
(
AB8505_VSMPSASEL1
,
0x00
,
0x00
),
/*
* VsmpsASel2
*/
INIT_REGULATOR_REGISTER
(
AB8505_VSMPSASEL2
,
0x00
,
0x00
),
/*
* VsmpsASel3
*/
INIT_REGULATOR_REGISTER
(
AB8505_VSMPSASEL3
,
0x00
,
0x00
),
/*
* VsmpsBSel1
*/
INIT_REGULATOR_REGISTER
(
AB8505_VSMPSBSEL1
,
0x00
,
0x00
),
/*
* VsmpsBSel2
*/
INIT_REGULATOR_REGISTER
(
AB8505_VSMPSBSEL2
,
0x00
,
0x00
),
/*
* VsmpsBSel3
*/
INIT_REGULATOR_REGISTER
(
AB8505_VSMPSBSEL3
,
0x00
,
0x00
),
/*
* VsafeSel1
*/
INIT_REGULATOR_REGISTER
(
AB8505_VSAFESEL1
,
0x00
,
0x00
),
/*
* VsafeSel2
*/
INIT_REGULATOR_REGISTER
(
AB8505_VSAFESEL2
,
0x00
,
0x00
),
/*
* VsafeSel3
*/
INIT_REGULATOR_REGISTER
(
AB8505_VSAFESEL3
,
0x00
,
0x00
),
/*
* Vaux1Sel = 2.8 V
*/
INIT_REGULATOR_REGISTER
(
AB8505_VAUX1SEL
,
0x0f
,
0x0C
),
/*
* Vaux2Sel = 2.9 V
*/
INIT_REGULATOR_REGISTER
(
AB8505_VAUX2SEL
,
0x0f
,
0x0d
),
/*
* Vaux3Sel = 2.91 V
*/
INIT_REGULATOR_REGISTER
(
AB8505_VRF1VAUX3SEL
,
0x07
,
0x07
),
/*
* Vaux4RequestCtrl
*/
INIT_REGULATOR_REGISTER
(
AB8505_VAUX4REQCTRL
,
0x00
,
0x00
),
/*
* Vaux4Regu
*/
INIT_REGULATOR_REGISTER
(
AB8505_VAUX4REGU
,
0x00
,
0x00
),
/*
* Vaux4Sel
*/
INIT_REGULATOR_REGISTER
(
AB8505_VAUX4SEL
,
0x00
,
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
(
AB8505_REGUCTRLDISCH
,
0xfc
,
0x00
),
/*
* VanaDisch = short discharge time
* Vaux8PullDownEna = pulldown disabled when Vaux8 is disabled
* Vaux8Disch = short discharge time
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUCTRLDISCH2
,
0x16
,
0x00
),
/*
* Vaux4Disch = short discharge time
*/
INIT_REGULATOR_REGISTER
(
AB8505_REGUCTRLDISCH3
,
0x01
,
0x00
),
/*
* Vaux5Sel
* Vaux5LP
* Vaux5Ena
* Vaux5Disch
* Vaux5DisSfst
* Vaux5DisPulld
*/
INIT_REGULATOR_REGISTER
(
AB8505_CTRLVAUX5
,
0x00
,
0x00
),
/*
* Vaux6Sel
* Vaux6LP
* Vaux6Ena
* Vaux6DisPulld
*/
INIT_REGULATOR_REGISTER
(
AB8505_CTRLVAUX6
,
0x00
,
0x00
),
};
struct
regulator_init_data
ab8505_regulators
[
AB8505_NUM_REGULATORS
]
=
{
/* supplies to the display/camera */
[
AB8505_LDO_AUX1
]
=
{
.
constraints
=
{
.
name
=
"V-DISPLAY"
,
.
min_uV
=
2800000
,
.
max_uV
=
3300000
,
.
valid_ops_mask
=
REGULATOR_CHANGE_VOLTAGE
|
REGULATOR_CHANGE_STATUS
,
.
boot_on
=
1
,
/* display is on at boot */
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8500_vaux1_consumers
),
.
consumer_supplies
=
ab8500_vaux1_consumers
,
},
/* supplies to the on-board eMMC */
[
AB8505_LDO_AUX2
]
=
{
.
constraints
=
{
.
name
=
"V-eMMC1"
,
.
min_uV
=
1100000
,
.
max_uV
=
3300000
,
.
valid_ops_mask
=
REGULATOR_CHANGE_VOLTAGE
|
REGULATOR_CHANGE_STATUS
|
REGULATOR_CHANGE_MODE
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_IDLE
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8500_vaux2_consumers
),
.
consumer_supplies
=
ab8500_vaux2_consumers
,
},
/* supply for VAUX3, supplies to SDcard slots */
[
AB8505_LDO_AUX3
]
=
{
.
constraints
=
{
.
name
=
"V-MMC-SD"
,
.
min_uV
=
1100000
,
.
max_uV
=
3300000
,
.
valid_ops_mask
=
REGULATOR_CHANGE_VOLTAGE
|
REGULATOR_CHANGE_STATUS
|
REGULATOR_CHANGE_MODE
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_IDLE
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8500_vaux3_consumers
),
.
consumer_supplies
=
ab8500_vaux3_consumers
,
},
/* supply for VAUX4, supplies to NFC and standalone secure element */
[
AB8505_LDO_AUX4
]
=
{
.
constraints
=
{
.
name
=
"V-NFC-SE"
,
.
min_uV
=
1100000
,
.
max_uV
=
3300000
,
.
valid_ops_mask
=
REGULATOR_CHANGE_VOLTAGE
|
REGULATOR_CHANGE_STATUS
|
REGULATOR_CHANGE_MODE
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_IDLE
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8505_vaux4_consumers
),
.
consumer_supplies
=
ab8505_vaux4_consumers
,
},
/* supply for VAUX5, supplies to TBD */
[
AB8505_LDO_AUX5
]
=
{
.
constraints
=
{
.
name
=
"V-AUX5"
,
.
min_uV
=
1050000
,
.
max_uV
=
2790000
,
.
valid_ops_mask
=
REGULATOR_CHANGE_VOLTAGE
|
REGULATOR_CHANGE_STATUS
|
REGULATOR_CHANGE_MODE
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_IDLE
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8505_vaux5_consumers
),
.
consumer_supplies
=
ab8505_vaux5_consumers
,
},
/* supply for VAUX6, supplies to TBD */
[
AB8505_LDO_AUX6
]
=
{
.
constraints
=
{
.
name
=
"V-AUX6"
,
.
min_uV
=
1050000
,
.
max_uV
=
2790000
,
.
valid_ops_mask
=
REGULATOR_CHANGE_VOLTAGE
|
REGULATOR_CHANGE_STATUS
|
REGULATOR_CHANGE_MODE
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_IDLE
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8505_vaux6_consumers
),
.
consumer_supplies
=
ab8505_vaux6_consumers
,
},
/* supply for gpadc, ADC LDO */
[
AB8505_LDO_ADC
]
=
{
.
constraints
=
{
.
name
=
"V-ADC"
,
.
valid_ops_mask
=
REGULATOR_CHANGE_STATUS
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8505_vadc_consumers
),
.
consumer_supplies
=
ab8505_vadc_consumers
,
},
/* supply for ab8500-vaudio, VAUDIO LDO */
[
AB8505_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 */
[
AB8505_LDO_ANAMIC1
]
=
{
.
constraints
=
{
.
name
=
"V-AMIC1"
,
.
valid_ops_mask
=
REGULATOR_CHANGE_STATUS
|
REGULATOR_CHANGE_MODE
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_IDLE
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8500_vamic1_consumers
),
.
consumer_supplies
=
ab8500_vamic1_consumers
,
},
/* supply for v-amic2, VAMIC2 LDO, reuse constants for AMIC1 */
[
AB8505_LDO_ANAMIC2
]
=
{
.
constraints
=
{
.
name
=
"V-AMIC2"
,
.
valid_ops_mask
=
REGULATOR_CHANGE_STATUS
|
REGULATOR_CHANGE_MODE
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_IDLE
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8500_vamic2_consumers
),
.
consumer_supplies
=
ab8500_vamic2_consumers
,
},
/* supply for v-aux8, VAUX8 LDO */
[
AB8505_LDO_AUX8
]
=
{
.
constraints
=
{
.
name
=
"V-AUX8"
,
.
valid_ops_mask
=
REGULATOR_CHANGE_STATUS
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8505_vaux8_consumers
),
.
consumer_supplies
=
ab8505_vaux8_consumers
,
},
/* supply for v-intcore12, VINTCORE12 LDO */
[
AB8505_LDO_INTCORE
]
=
{
.
constraints
=
{
.
name
=
"V-INTCORE"
,
.
min_uV
=
1250000
,
.
max_uV
=
1350000
,
.
input_uV
=
1800000
,
.
valid_ops_mask
=
REGULATOR_CHANGE_VOLTAGE
|
REGULATOR_CHANGE_STATUS
|
REGULATOR_CHANGE_MODE
|
REGULATOR_CHANGE_DRMS
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_IDLE
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8500_vintcore_consumers
),
.
consumer_supplies
=
ab8500_vintcore_consumers
,
},
/* supply for LDO USB */
[
AB8505_LDO_USB
]
=
{
.
constraints
=
{
.
name
=
"V-USB"
,
.
valid_ops_mask
=
REGULATOR_CHANGE_STATUS
|
REGULATOR_CHANGE_MODE
,
.
valid_modes_mask
=
REGULATOR_MODE_NORMAL
|
REGULATOR_MODE_IDLE
,
},
.
num_consumer_supplies
=
ARRAY_SIZE
(
ab8505_usb_consumers
),
.
consumer_supplies
=
ab8505_usb_consumers
,
},
/* supply for U8500 CSI-DSI, VANA LDO */
[
AB8505_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
,
},
};
struct
ab8500_regulator_platform_data
ab8500_regulator_plat_data
=
{
.
reg_init
=
ab8500_reg_init
,
.
num_reg_init
=
ARRAY_SIZE
(
ab8500_reg_init
),
.
regulator
=
ab8500_regulators
,
.
num_regulator
=
ARRAY_SIZE
(
ab8500_regulators
),
.
ext_regulator
=
ab8500_ext_regulators
,
.
num_ext_regulator
=
ARRAY_SIZE
(
ab8500_ext_regulators
),
};
/* Use the AB8500 init settings for AB8505 as they are the same right now */
struct
ab8500_regulator_platform_data
ab8505_regulator_plat_data
=
{
.
reg_init
=
ab8505_reg_init
,
.
num_reg_init
=
ARRAY_SIZE
(
ab8505_reg_init
),
.
regulator
=
ab8505_regulators
,
.
num_regulator
=
ARRAY_SIZE
(
ab8505_regulators
),
};
static
void
ab8500_modify_reg_init
(
int
id
,
u8
mask
,
u8
value
)
{
int
i
;
if
(
cpu_is_u8520
())
{
for
(
i
=
ARRAY_SIZE
(
ab8505_reg_init
)
-
1
;
i
>=
0
;
i
--
)
{
if
(
ab8505_reg_init
[
i
].
id
==
id
)
{
u8
initval
=
ab8505_reg_init
[
i
].
value
;
initval
=
(
initval
&
~
mask
)
|
(
value
&
mask
);
ab8505_reg_init
[
i
].
value
=
initval
;
BUG_ON
(
mask
&
~
ab8505_reg_init
[
i
].
mask
);
return
;
}
}
}
else
{
for
(
i
=
ARRAY_SIZE
(
ab8500_reg_init
)
-
1
;
i
>=
0
;
i
--
)
{
if
(
ab8500_reg_init
[
i
].
id
==
id
)
{
u8
initval
=
ab8500_reg_init
[
i
].
value
;
initval
=
(
initval
&
~
mask
)
|
(
value
&
mask
);
ab8500_reg_init
[
i
].
value
=
initval
;
BUG_ON
(
mask
&
~
ab8500_reg_init
[
i
].
mask
);
return
;
}
}
}
BUG_ON
(
1
);
}
void
mop500_regulator_init
(
void
)
{
struct
regulator_init_data
*
regulator
;
/*
* Temporarily turn on Vaux2 on 8520 machine
*/
if
(
cpu_is_u8520
())
{
/* Vaux2 initialized to be on */
ab8500_modify_reg_init
(
AB8505_VAUX12REGU
,
0x0f
,
0x05
);
}
/*
* Handle AB8500_EXT_SUPPLY2 on HREFP_V20_V50 boards (do it for
* all HREFP_V20 boards)
*/
if
(
cpu_is_u8500v20
())
{
/* VextSupply2RequestCtrl = HP/OFF depending on VxRequest */
ab8500_modify_reg_init
(
AB8500_REGUREQUESTCTRL3
,
0x01
,
0x01
);
/* VextSupply2SysClkReq1HPValid = SysClkReq1 controlled */
ab8500_modify_reg_init
(
AB8500_REGUSYSCLKREQ1HPVALID2
,
0x20
,
0x20
);
/* VextSupply2 = force HP at initialization */
ab8500_modify_reg_init
(
AB8500_EXTSUPPLYREGU
,
0x0c
,
0x04
);
/* enable VextSupply2 during platform active */
regulator
=
&
ab8500_ext_regulators
[
AB8500_EXT_SUPPLY2
];
regulator
->
constraints
.
always_on
=
1
;
/* disable VextSupply2 in suspend */
regulator
=
&
ab8500_ext_regulators
[
AB8500_EXT_SUPPLY2
];
regulator
->
constraints
.
state_mem
.
disabled
=
1
;
regulator
->
constraints
.
state_standby
.
disabled
=
1
;
/* enable VextSupply2 HW control (used in suspend) */
regulator
->
driver_data
=
(
void
*
)
&
ab8500_ext_supply2
;
}
}
arch/arm/mach-ux500/board-mop500-regulators.h
View file @
c98cac89
...
...
@@ -14,10 +14,11 @@
#include <linux/regulator/machine.h>
#include <linux/regulator/ab8500.h>
extern
struct
ab8500_regulator_reg_init
ab8500_regulator_reg_init
[
AB8500_NUM_REGULATOR_REGISTERS
];
extern
struct
regulator_init_data
ab8500_regulators
[
AB8500_NUM_REGULATORS
];
extern
struct
ab8500_regulator_platform_data
ab8500_regulator_plat_data
;
extern
struct
ab8500_regulator_platform_data
ab8505_regulator_plat_data
;
extern
struct
regulator_init_data
tps61052_regulator
;
extern
struct
regulator_init_data
gpio_en_3v3_regulator
;
void
mop500_regulator_init
(
void
);
#endif
arch/arm/mach-ux500/board-mop500.c
View file @
c98cac89
...
...
@@ -199,10 +199,7 @@ static struct platform_device snowball_sbnet_dev = {
struct
ab8500_platform_data
ab8500_platdata
=
{
.
irq_base
=
MOP500_AB8500_IRQ_BASE
,
.
regulator_reg_init
=
ab8500_regulator_reg_init
,
.
num_regulator_reg_init
=
ARRAY_SIZE
(
ab8500_regulator_reg_init
),
.
regulator
=
ab8500_regulators
,
.
num_regulator
=
ARRAY_SIZE
(
ab8500_regulators
),
.
regulator
=
&
ab8500_regulator_plat_data
,
.
gpio
=
&
ab8500_gpio_pdata
,
.
codec
=
&
ab8500_codec_pdata
,
};
...
...
drivers/regulator/Makefile
View file @
c98cac89
...
...
@@ -12,7 +12,7 @@ obj-$(CONFIG_REGULATOR_USERSPACE_CONSUMER) += userspace-consumer.o
obj-$(CONFIG_REGULATOR_88PM8607)
+=
88pm8607.o
obj-$(CONFIG_REGULATOR_AAT2870)
+=
aat2870-regulator.o
obj-$(CONFIG_REGULATOR_AB3100)
+=
ab3100.o
obj-$(CONFIG_REGULATOR_AB8500)
+=
ab8500.o
obj-$(CONFIG_REGULATOR_AB8500)
+=
ab8500.o
ab8500-ext.o
obj-$(CONFIG_REGULATOR_AD5398)
+=
ad5398.o
obj-$(CONFIG_REGULATOR_ANATOP)
+=
anatop-regulator.o
obj-$(CONFIG_REGULATOR_ARIZONA)
+=
arizona-micsupp.o arizona-ldo1.o
...
...
drivers/regulator/ab8500-ext.c
0 → 100644
View file @
c98cac89
/*
* Copyright (C) ST-Ericsson SA 2010
*
* License Terms: GNU General Public License v2
*
* Authors: Bengt Jonsson <bengt.g.jonsson@stericsson.com>
*
* This file is based on drivers/regulator/ab8500.c
*
* AB8500 external regulators
*
* ab8500-ext supports the following regulators:
* - VextSupply3
*/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/err.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/machine.h>
#include <linux/mfd/abx500.h>
#include <linux/mfd/abx500/ab8500.h>
#include <linux/regulator/ab8500.h>
/**
* struct ab8500_ext_regulator_info - ab8500 regulator information
* @dev: device pointer
* @desc: regulator description
* @rdev: regulator device
* @cfg: regulator configuration (extension of regulator FW configuration)
* @update_bank: bank to control on/off
* @update_reg: register to control on/off
* @update_mask: mask to enable/disable and set mode of regulator
* @update_val: bits holding the regulator current mode
* @update_val_hp: bits to set EN pin active (LPn pin deactive)
* normally this means high power mode
* @update_val_lp: bits to set EN pin active and LPn pin active
* normally this means low power mode
* @update_val_hw: bits to set regulator pins in HW control
* SysClkReq pins and logic will choose mode
*/
struct
ab8500_ext_regulator_info
{
struct
device
*
dev
;
struct
regulator_desc
desc
;
struct
regulator_dev
*
rdev
;
struct
ab8500_ext_regulator_cfg
*
cfg
;
u8
update_bank
;
u8
update_reg
;
u8
update_mask
;
u8
update_val
;
u8
update_val_hp
;
u8
update_val_lp
;
u8
update_val_hw
;
};
static
int
ab8500_ext_regulator_enable
(
struct
regulator_dev
*
rdev
)
{
int
ret
;
struct
ab8500_ext_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
u8
regval
;
if
(
info
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator info null pointer
\n
"
);
return
-
EINVAL
;
}
/*
* To satisfy both HW high power request and SW request, the regulator
* must be on in high power.
*/
if
(
info
->
cfg
&&
info
->
cfg
->
hwreq
)
regval
=
info
->
update_val_hp
;
else
regval
=
info
->
update_val
;
ret
=
abx500_mask_and_set_register_interruptible
(
info
->
dev
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
regval
);
if
(
ret
<
0
)
{
dev_err
(
rdev_get_dev
(
info
->
rdev
),
"couldn't set enable bits for regulator
\n
"
);
return
ret
;
}
dev_dbg
(
rdev_get_dev
(
rdev
),
"%s-enable (bank, reg, mask, value): 0x%02x, 0x%02x, 0x%02x, 0x%02x
\n
"
,
info
->
desc
.
name
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
regval
);
return
0
;
}
static
int
ab8500_ext_regulator_disable
(
struct
regulator_dev
*
rdev
)
{
int
ret
;
struct
ab8500_ext_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
u8
regval
;
if
(
info
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator info null pointer
\n
"
);
return
-
EINVAL
;
}
/*
* Set the regulator in HW request mode if configured
*/
if
(
info
->
cfg
&&
info
->
cfg
->
hwreq
)
regval
=
info
->
update_val_hw
;
else
regval
=
0
;
ret
=
abx500_mask_and_set_register_interruptible
(
info
->
dev
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
regval
);
if
(
ret
<
0
)
{
dev_err
(
rdev_get_dev
(
info
->
rdev
),
"couldn't set disable bits for regulator
\n
"
);
return
ret
;
}
dev_dbg
(
rdev_get_dev
(
rdev
),
"%s-disable (bank, reg, mask, value):"
" 0x%02x, 0x%02x, 0x%02x, 0x%02x
\n
"
,
info
->
desc
.
name
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
regval
);
return
0
;
}
static
int
ab8500_ext_regulator_is_enabled
(
struct
regulator_dev
*
rdev
)
{
int
ret
;
struct
ab8500_ext_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
u8
regval
;
if
(
info
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator info null pointer
\n
"
);
return
-
EINVAL
;
}
ret
=
abx500_get_register_interruptible
(
info
->
dev
,
info
->
update_bank
,
info
->
update_reg
,
&
regval
);
if
(
ret
<
0
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"couldn't read 0x%x register
\n
"
,
info
->
update_reg
);
return
ret
;
}
dev_dbg
(
rdev_get_dev
(
rdev
),
"%s-is_enabled (bank, reg, mask, value):"
" 0x%02x, 0x%02x, 0x%02x, 0x%02x
\n
"
,
info
->
desc
.
name
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
regval
);
if
(((
regval
&
info
->
update_mask
)
==
info
->
update_val_lp
)
||
((
regval
&
info
->
update_mask
)
==
info
->
update_val_hp
))
return
1
;
else
return
0
;
}
static
int
ab8500_ext_regulator_set_mode
(
struct
regulator_dev
*
rdev
,
unsigned
int
mode
)
{
int
ret
=
0
;
struct
ab8500_ext_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
u8
regval
;
if
(
info
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator info null pointer
\n
"
);
return
-
EINVAL
;
}
switch
(
mode
)
{
case
REGULATOR_MODE_NORMAL
:
regval
=
info
->
update_val_hp
;
break
;
case
REGULATOR_MODE_IDLE
:
regval
=
info
->
update_val_lp
;
break
;
default:
return
-
EINVAL
;
}
/* If regulator is enabled and info->cfg->hwreq is set, the regulator
must be on in high power, so we don't need to write the register with
the same value.
*/
if
(
ab8500_ext_regulator_is_enabled
(
rdev
)
&&
!
(
info
->
cfg
&&
info
->
cfg
->
hwreq
))
{
ret
=
abx500_mask_and_set_register_interruptible
(
info
->
dev
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
regval
);
if
(
ret
<
0
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"Could not set regulator mode.
\n
"
);
return
ret
;
}
dev_dbg
(
rdev_get_dev
(
rdev
),
"%s-set_mode (bank, reg, mask, value): "
"0x%x, 0x%x, 0x%x, 0x%x
\n
"
,
info
->
desc
.
name
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
regval
);
}
info
->
update_val
=
regval
;
return
0
;
}
static
unsigned
int
ab8500_ext_regulator_get_mode
(
struct
regulator_dev
*
rdev
)
{
struct
ab8500_ext_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
int
ret
;
if
(
info
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator info null pointer
\n
"
);
return
-
EINVAL
;
}
if
(
info
->
update_val
==
info
->
update_val_hp
)
ret
=
REGULATOR_MODE_NORMAL
;
else
if
(
info
->
update_val
==
info
->
update_val_lp
)
ret
=
REGULATOR_MODE_IDLE
;
else
ret
=
-
EINVAL
;
return
ret
;
}
static
int
ab8500_ext_list_voltage
(
struct
regulator_dev
*
rdev
,
unsigned
selector
)
{
struct
regulation_constraints
*
regu_constraints
=
rdev
->
constraints
;
if
(
regu_constraints
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator constraints null pointer
\n
"
);
return
-
EINVAL
;
}
/* return the uV for the fixed regulators */
if
(
regu_constraints
->
min_uV
&&
regu_constraints
->
max_uV
)
{
if
(
regu_constraints
->
min_uV
==
regu_constraints
->
max_uV
)
return
regu_constraints
->
min_uV
;
}
return
-
EINVAL
;
}
static
struct
regulator_ops
ab8500_ext_regulator_ops
=
{
.
enable
=
ab8500_ext_regulator_enable
,
.
disable
=
ab8500_ext_regulator_disable
,
.
is_enabled
=
ab8500_ext_regulator_is_enabled
,
.
set_mode
=
ab8500_ext_regulator_set_mode
,
.
get_mode
=
ab8500_ext_regulator_get_mode
,
.
list_voltage
=
ab8500_ext_list_voltage
,
};
static
struct
ab8500_ext_regulator_info
ab8500_ext_regulator_info
[
AB8500_NUM_EXT_REGULATORS
]
=
{
[
AB8500_EXT_SUPPLY1
]
=
{
.
desc
=
{
.
name
=
"VEXTSUPPLY1"
,
.
ops
=
&
ab8500_ext_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_EXT_SUPPLY1
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
},
.
update_bank
=
0x04
,
.
update_reg
=
0x08
,
.
update_mask
=
0x03
,
.
update_val
=
0x01
,
.
update_val_hp
=
0x01
,
.
update_val_lp
=
0x03
,
.
update_val_hw
=
0x02
,
},
[
AB8500_EXT_SUPPLY2
]
=
{
.
desc
=
{
.
name
=
"VEXTSUPPLY2"
,
.
ops
=
&
ab8500_ext_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_EXT_SUPPLY2
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
},
.
update_bank
=
0x04
,
.
update_reg
=
0x08
,
.
update_mask
=
0x0c
,
.
update_val
=
0x04
,
.
update_val_hp
=
0x04
,
.
update_val_lp
=
0x0c
,
.
update_val_hw
=
0x08
,
},
[
AB8500_EXT_SUPPLY3
]
=
{
.
desc
=
{
.
name
=
"VEXTSUPPLY3"
,
.
ops
=
&
ab8500_ext_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_EXT_SUPPLY3
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
},
.
update_bank
=
0x04
,
.
update_reg
=
0x08
,
.
update_mask
=
0x30
,
.
update_val
=
0x10
,
.
update_val_hp
=
0x10
,
.
update_val_lp
=
0x30
,
.
update_val_hw
=
0x20
,
},
};
int
ab8500_ext_regulator_init
(
struct
platform_device
*
pdev
)
{
struct
ab8500
*
ab8500
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
struct
ab8500_platform_data
*
ppdata
;
struct
ab8500_regulator_platform_data
*
pdata
;
struct
regulator_config
config
=
{
};
int
i
,
err
;
if
(
!
ab8500
)
{
dev_err
(
&
pdev
->
dev
,
"null mfd parent
\n
"
);
return
-
EINVAL
;
}
ppdata
=
dev_get_platdata
(
ab8500
->
dev
);
if
(
!
ppdata
)
{
dev_err
(
&
pdev
->
dev
,
"null parent pdata
\n
"
);
return
-
EINVAL
;
}
pdata
=
ppdata
->
regulator
;
if
(
!
pdata
)
{
dev_err
(
&
pdev
->
dev
,
"null pdata
\n
"
);
return
-
EINVAL
;
}
/* make sure the platform data has the correct size */
if
(
pdata
->
num_ext_regulator
!=
ARRAY_SIZE
(
ab8500_ext_regulator_info
))
{
dev_err
(
&
pdev
->
dev
,
"Configuration error: size mismatch.
\n
"
);
return
-
EINVAL
;
}
/* check for AB8500 2.x */
if
(
is_ab8500_2p0_or_earlier
(
ab8500
))
{
struct
ab8500_ext_regulator_info
*
info
;
/* VextSupply3LPn is inverted on AB8500 2.x */
info
=
&
ab8500_ext_regulator_info
[
AB8500_EXT_SUPPLY3
];
info
->
update_val
=
0x30
;
info
->
update_val_hp
=
0x30
;
info
->
update_val_lp
=
0x10
;
}
/* register all regulators */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
ab8500_ext_regulator_info
);
i
++
)
{
struct
ab8500_ext_regulator_info
*
info
=
NULL
;
/* assign per-regulator data */
info
=
&
ab8500_ext_regulator_info
[
i
];
info
->
dev
=
&
pdev
->
dev
;
info
->
cfg
=
(
struct
ab8500_ext_regulator_cfg
*
)
pdata
->
ext_regulator
[
i
].
driver_data
;
config
.
dev
=
&
pdev
->
dev
;
config
.
init_data
=
&
pdata
->
ext_regulator
[
i
];
config
.
driver_data
=
info
;
/* register regulator with framework */
info
->
rdev
=
regulator_register
(
&
info
->
desc
,
&
config
);
if
(
IS_ERR
(
info
->
rdev
))
{
err
=
PTR_ERR
(
info
->
rdev
);
dev_err
(
&
pdev
->
dev
,
"failed to register regulator %s
\n
"
,
info
->
desc
.
name
);
/* when we fail, un-register all earlier regulators */
while
(
--
i
>=
0
)
{
info
=
&
ab8500_ext_regulator_info
[
i
];
regulator_unregister
(
info
->
rdev
);
}
return
err
;
}
dev_dbg
(
rdev_get_dev
(
info
->
rdev
),
"%s-probed
\n
"
,
info
->
desc
.
name
);
}
return
0
;
}
void
ab8500_ext_regulator_exit
(
struct
platform_device
*
pdev
)
{
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
ab8500_ext_regulator_info
);
i
++
)
{
struct
ab8500_ext_regulator_info
*
info
=
NULL
;
info
=
&
ab8500_ext_regulator_info
[
i
];
dev_vdbg
(
rdev_get_dev
(
info
->
rdev
),
"%s-remove
\n
"
,
info
->
desc
.
name
);
regulator_unregister
(
info
->
rdev
);
}
}
MODULE_LICENSE
(
"GPL v2"
);
MODULE_AUTHOR
(
"Bengt Jonsson <bengt.g.jonsson@stericsson.com>"
);
MODULE_DESCRIPTION
(
"AB8500 external regulator driver"
);
MODULE_ALIAS
(
"platform:ab8500-ext-regulator"
);
drivers/regulator/ab8500.c
View file @
c98cac89
...
...
@@ -5,11 +5,15 @@
*
* 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
*
* AB8500 peripheral regulators
*
* AB8500 supports the following regulators:
* VAUX1/2/3, VINTCORE, VTVOUT, VUSB, VAUDIO, VAMIC1/2, VDMIC, VANA
*
* AB8505 supports the following regulators:
* VAUX1/2/3/4/5/6, VINTCORE, VADC, VUSB, VAUDIO, VAMIC1/2, VDMIC, VANA
*/
#include <linux/init.h>
#include <linux/kernel.h>
...
...
@@ -25,34 +29,65 @@
#include <linux/regulator/ab8500.h>
#include <linux/slab.h>
/**
* struct ab8500_shared_mode - is used when mode is shared between
* two regulators.
* @shared_regulator: pointer to the other sharing regulator
* @lp_mode_req: low power mode requested by this regulator
*/
struct
ab8500_shared_mode
{
struct
ab8500_regulator_info
*
shared_regulator
;
bool
lp_mode_req
;
};
/**
* struct ab8500_regulator_info - ab8500 regulator information
* @dev: device pointer
* @desc: regulator description
* @regulator_dev: regulator device
* @shared_mode: used when mode is shared between two regulators
* @load_lp_uA: maximum load in idle (low power) mode
* @update_bank: bank to control on/off
* @update_reg: register to control on/off
* @update_mask: mask to enable/disable regulator
* @update_val_enable: bits to enable the regulator in normal (high power) mode
* @update_mask: mask to enable/disable and set mode of regulator
* @update_val: bits holding the regulator current mode
* @update_val_idle: bits to enable the regulator in idle (low power) mode
* @update_val_normal: bits to enable the regulator in normal (high power) mode
* @mode_bank: bank with location of mode register
* @mode_reg: mode register
* @mode_mask: mask for setting mode
* @mode_val_idle: mode setting for low power
* @mode_val_normal: mode setting for normal power
* @voltage_bank: bank to control regulator voltage
* @voltage_reg: register to control regulator voltage
* @voltage_mask: mask to control regulator voltage
* @voltage_shift: shift to control regulator voltage
* @delay: startup/set voltage delay in us
*/
struct
ab8500_regulator_info
{
struct
device
*
dev
;
struct
regulator_desc
desc
;
struct
regulator_dev
*
regulator
;
struct
ab8500_shared_mode
*
shared_mode
;
int
load_lp_uA
;
u8
update_bank
;
u8
update_reg
;
u8
update_mask
;
u8
update_val_enable
;
u8
update_val
;
u8
update_val_idle
;
u8
update_val_normal
;
u8
mode_bank
;
u8
mode_reg
;
u8
mode_mask
;
u8
mode_val_idle
;
u8
mode_val_normal
;
u8
voltage_bank
;
u8
voltage_reg
;
u8
voltage_mask
;
u8
voltage_shift
;
unsigned
int
delay
;
struct
{
u8
voltage_limit
;
u8
voltage_bank
;
u8
voltage_reg
;
u8
voltage_mask
;
}
expand_register
;
};
/* voltage tables for the vauxn/vintcore supplies */
...
...
@@ -86,6 +121,44 @@ static const unsigned int ldo_vaux3_voltages[] = {
2910000
,
};
static
const
unsigned
int
ldo_vaux56_voltages
[]
=
{
1800000
,
1050000
,
1100000
,
1200000
,
1500000
,
2200000
,
2500000
,
2790000
,
};
static
const
unsigned
int
ldo_vaux3_ab8540_voltages
[]
=
{
1200000
,
1500000
,
1800000
,
2100000
,
2500000
,
2750000
,
2790000
,
2910000
,
3050000
,
};
static
const
unsigned
int
ldo_vaux56_ab8540_voltages
[]
=
{
750000
,
760000
,
770000
,
780000
,
790000
,
800000
,
810000
,
820000
,
830000
,
840000
,
850000
,
860000
,
870000
,
880000
,
890000
,
900000
,
910000
,
920000
,
930000
,
940000
,
950000
,
960000
,
970000
,
980000
,
990000
,
1000000
,
1010000
,
1020000
,
1030000
,
1040000
,
1050000
,
1060000
,
1070000
,
1080000
,
1090000
,
1100000
,
1110000
,
1120000
,
1130000
,
1140000
,
1150000
,
1160000
,
1170000
,
1180000
,
1190000
,
1200000
,
1210000
,
1220000
,
1230000
,
1240000
,
1250000
,
1260000
,
1270000
,
1280000
,
1290000
,
1300000
,
1310000
,
1320000
,
1330000
,
1340000
,
1350000
,
1360000
,
1800000
,
2790000
,
};
static
const
unsigned
int
ldo_vintcore_voltages
[]
=
{
1200000
,
1225000
,
...
...
@@ -96,6 +169,72 @@ static const unsigned int ldo_vintcore_voltages[] = {
1350000
,
};
static
const
unsigned
int
ldo_sdio_voltages
[]
=
{
1160000
,
1050000
,
1100000
,
1500000
,
1800000
,
2200000
,
2910000
,
3050000
,
};
static
const
unsigned
int
fixed_1200000_voltage
[]
=
{
1200000
,
};
static
const
unsigned
int
fixed_1800000_voltage
[]
=
{
1800000
,
};
static
const
unsigned
int
fixed_2000000_voltage
[]
=
{
2000000
,
};
static
const
unsigned
int
fixed_2050000_voltage
[]
=
{
2050000
,
};
static
const
unsigned
int
fixed_3300000_voltage
[]
=
{
3300000
,
};
static
const
unsigned
int
ldo_vana_voltages
[]
=
{
1050000
,
1075000
,
1100000
,
1125000
,
1150000
,
1175000
,
1200000
,
1225000
,
};
static
const
unsigned
int
ldo_vaudio_voltages
[]
=
{
2000000
,
2100000
,
2200000
,
2300000
,
2400000
,
2500000
,
2600000
,
2600000
,
/* Duplicated in Vaudio and IsoUicc Control register. */
};
static
const
unsigned
int
ldo_vdmic_voltages
[]
=
{
1800000
,
1900000
,
2000000
,
2850000
,
};
static
DEFINE_MUTEX
(
shared_mode_mutex
);
static
struct
ab8500_shared_mode
ldo_anamic1_shared
;
static
struct
ab8500_shared_mode
ldo_anamic2_shared
;
static
struct
ab8500_shared_mode
ab8540_ldo_anamic1_shared
;
static
struct
ab8500_shared_mode
ab8540_ldo_anamic2_shared
;
static
int
ab8500_regulator_enable
(
struct
regulator_dev
*
rdev
)
{
int
ret
;
...
...
@@ -108,15 +247,17 @@ static int ab8500_regulator_enable(struct regulator_dev *rdev)
ret
=
abx500_mask_and_set_register_interruptible
(
info
->
dev
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
info
->
update_val
_enable
);
if
(
ret
<
0
)
info
->
update_mask
,
info
->
update_val
);
if
(
ret
<
0
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"couldn't set enable bits for regulator
\n
"
);
return
ret
;
}
dev_vdbg
(
rdev_get_dev
(
rdev
),
"%s-enable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x
\n
"
,
info
->
desc
.
name
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
info
->
update_val
_enable
);
info
->
update_mask
,
info
->
update_val
);
return
ret
;
}
...
...
@@ -134,9 +275,11 @@ static int ab8500_regulator_disable(struct regulator_dev *rdev)
ret
=
abx500_mask_and_set_register_interruptible
(
info
->
dev
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
0x0
);
if
(
ret
<
0
)
if
(
ret
<
0
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"couldn't set disable bits for regulator
\n
"
);
return
ret
;
}
dev_vdbg
(
rdev_get_dev
(
rdev
),
"%s-disable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x
\n
"
,
...
...
@@ -172,14 +315,170 @@ static int ab8500_regulator_is_enabled(struct regulator_dev *rdev)
info
->
update_mask
,
regval
);
if
(
regval
&
info
->
update_mask
)
return
true
;
return
1
;
else
return
0
;
}
static
unsigned
int
ab8500_regulator_get_optimum_mode
(
struct
regulator_dev
*
rdev
,
int
input_uV
,
int
output_uV
,
int
load_uA
)
{
unsigned
int
mode
;
struct
ab8500_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
if
(
info
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator info null pointer
\n
"
);
return
-
EINVAL
;
}
if
(
load_uA
<=
info
->
load_lp_uA
)
mode
=
REGULATOR_MODE_IDLE
;
else
mode
=
REGULATOR_MODE_NORMAL
;
return
mode
;
}
static
int
ab8500_regulator_set_mode
(
struct
regulator_dev
*
rdev
,
unsigned
int
mode
)
{
int
ret
=
0
;
u8
bank
,
reg
,
mask
,
val
;
bool
lp_mode_req
=
false
;
struct
ab8500_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
if
(
info
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator info null pointer
\n
"
);
return
-
EINVAL
;
}
if
(
info
->
mode_mask
)
{
bank
=
info
->
mode_bank
;
reg
=
info
->
mode_reg
;
mask
=
info
->
mode_mask
;
}
else
{
bank
=
info
->
update_bank
;
reg
=
info
->
update_reg
;
mask
=
info
->
update_mask
;
}
if
(
info
->
shared_mode
)
mutex_lock
(
&
shared_mode_mutex
);
switch
(
mode
)
{
case
REGULATOR_MODE_NORMAL
:
if
(
info
->
shared_mode
)
lp_mode_req
=
false
;
if
(
info
->
mode_mask
)
val
=
info
->
mode_val_normal
;
else
val
=
info
->
update_val_normal
;
break
;
case
REGULATOR_MODE_IDLE
:
if
(
info
->
shared_mode
)
{
struct
ab8500_regulator_info
*
shared_regulator
;
shared_regulator
=
info
->
shared_mode
->
shared_regulator
;
if
(
!
shared_regulator
->
shared_mode
->
lp_mode_req
)
{
/* Other regulator prevent LP mode */
info
->
shared_mode
->
lp_mode_req
=
true
;
goto
out_unlock
;
}
lp_mode_req
=
true
;
}
if
(
info
->
mode_mask
)
val
=
info
->
mode_val_idle
;
else
val
=
info
->
update_val_idle
;
break
;
default:
ret
=
-
EINVAL
;
goto
out_unlock
;
}
if
(
info
->
mode_mask
||
ab8500_regulator_is_enabled
(
rdev
))
{
ret
=
abx500_mask_and_set_register_interruptible
(
info
->
dev
,
bank
,
reg
,
mask
,
val
);
if
(
ret
<
0
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"couldn't set regulator mode
\n
"
);
goto
out_unlock
;
}
dev_vdbg
(
rdev_get_dev
(
rdev
),
"%s-set_mode (bank, reg, mask, value): "
"0x%x, 0x%x, 0x%x, 0x%x
\n
"
,
info
->
desc
.
name
,
bank
,
reg
,
mask
,
val
);
}
if
(
!
info
->
mode_mask
)
info
->
update_val
=
val
;
if
(
info
->
shared_mode
)
info
->
shared_mode
->
lp_mode_req
=
lp_mode_req
;
out_unlock:
if
(
info
->
shared_mode
)
mutex_unlock
(
&
shared_mode_mutex
);
return
ret
;
}
static
unsigned
int
ab8500_regulator_get_mode
(
struct
regulator_dev
*
rdev
)
{
struct
ab8500_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
int
ret
;
u8
val
;
u8
val_normal
;
u8
val_idle
;
if
(
info
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator info null pointer
\n
"
);
return
-
EINVAL
;
}
/* Need special handling for shared mode */
if
(
info
->
shared_mode
)
{
if
(
info
->
shared_mode
->
lp_mode_req
)
return
REGULATOR_MODE_IDLE
;
else
return
REGULATOR_MODE_NORMAL
;
}
if
(
info
->
mode_mask
)
{
/* Dedicated register for handling mode */
ret
=
abx500_get_register_interruptible
(
info
->
dev
,
info
->
mode_bank
,
info
->
mode_reg
,
&
val
);
val
=
val
&
info
->
mode_mask
;
val_normal
=
info
->
mode_val_normal
;
val_idle
=
info
->
mode_val_idle
;
}
else
{
/* Mode register same as enable register */
val
=
info
->
update_val
;
val_normal
=
info
->
update_val_normal
;
val_idle
=
info
->
update_val_idle
;
}
if
(
val
==
val_normal
)
ret
=
REGULATOR_MODE_NORMAL
;
else
if
(
val
==
val_idle
)
ret
=
REGULATOR_MODE_IDLE
;
else
return
false
;
ret
=
-
EINVAL
;
return
ret
;
}
static
int
ab8500_regulator_get_voltage_sel
(
struct
regulator_dev
*
rdev
)
{
int
ret
,
v
al
;
int
ret
,
v
oltage_shift
;
struct
ab8500_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
u8
regval
;
...
...
@@ -188,6 +487,8 @@ static int ab8500_regulator_get_voltage_sel(struct regulator_dev *rdev)
return
-
EINVAL
;
}
voltage_shift
=
ffs
(
info
->
voltage_mask
)
-
1
;
ret
=
abx500_get_register_interruptible
(
info
->
dev
,
info
->
voltage_bank
,
info
->
voltage_reg
,
&
regval
);
if
(
ret
<
0
)
{
...
...
@@ -201,16 +502,62 @@ static int ab8500_regulator_get_voltage_sel(struct regulator_dev *rdev)
"0x%x, 0x%x, 0x%x, 0x%x, 0x%x
\n
"
,
info
->
desc
.
name
,
info
->
voltage_bank
,
info
->
voltage_reg
,
info
->
voltage_mask
,
info
->
voltage_shift
,
regval
);
voltage_shift
,
regval
);
return
(
regval
&
info
->
voltage_mask
)
>>
voltage_shift
;
}
static
int
ab8540_aux3_regulator_get_voltage_sel
(
struct
regulator_dev
*
rdev
)
{
int
ret
,
voltage_shift
;
struct
ab8500_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
u8
regval
,
regval_expand
;
if
(
info
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator info null pointer
\n
"
);
return
-
EINVAL
;
}
ret
=
abx500_get_register_interruptible
(
info
->
dev
,
info
->
expand_register
.
voltage_bank
,
info
->
expand_register
.
voltage_reg
,
&
regval_expand
);
if
(
ret
<
0
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"couldn't read voltage expand reg for regulator
\n
"
);
return
ret
;
}
dev_vdbg
(
rdev_get_dev
(
rdev
),
"%s-get_voltage expand (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x
\n
"
,
info
->
desc
.
name
,
info
->
expand_register
.
voltage_bank
,
info
->
expand_register
.
voltage_reg
,
info
->
expand_register
.
voltage_mask
,
regval_expand
);
if
(
regval_expand
&
info
->
expand_register
.
voltage_mask
)
return
info
->
expand_register
.
voltage_limit
;
ret
=
abx500_get_register_interruptible
(
info
->
dev
,
info
->
voltage_bank
,
info
->
voltage_reg
,
&
regval
);
if
(
ret
<
0
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"couldn't read voltage reg for regulator
\n
"
);
return
ret
;
}
dev_vdbg
(
rdev_get_dev
(
rdev
),
"%s-get_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x
\n
"
,
info
->
desc
.
name
,
info
->
voltage_bank
,
info
->
voltage_reg
,
info
->
voltage_mask
,
regval
);
voltage_shift
=
ffs
(
info
->
voltage_mask
)
-
1
;
val
=
regval
&
info
->
voltage_mask
;
return
val
>>
info
->
voltage_shift
;
return
(
regval
&
info
->
voltage_mask
)
>>
voltage_shift
;
}
static
int
ab8500_regulator_set_voltage_sel
(
struct
regulator_dev
*
rdev
,
unsigned
selector
)
{
int
ret
;
int
ret
,
voltage_shift
;
struct
ab8500_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
u8
regval
;
...
...
@@ -219,8 +566,10 @@ static int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev,
return
-
EINVAL
;
}
voltage_shift
=
ffs
(
info
->
voltage_mask
)
-
1
;
/* set the registers for the request */
regval
=
(
u8
)
selector
<<
info
->
voltage_shift
;
regval
=
(
u8
)
selector
<<
voltage_shift
;
ret
=
abx500_mask_and_set_register_interruptible
(
info
->
dev
,
info
->
voltage_bank
,
info
->
voltage_reg
,
info
->
voltage_mask
,
regval
);
...
...
@@ -237,32 +586,121 @@ static int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev,
return
ret
;
}
static
int
ab8500_regulator_set_voltage_time_sel
(
struct
regulator_dev
*
rdev
,
unsigned
int
old_sel
,
unsigned
int
new_sel
)
static
int
ab8540_aux3_regulator_set_voltage_sel
(
struct
regulator_dev
*
rdev
,
unsigned
selector
)
{
int
ret
;
struct
ab8500_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
u8
regval
,
regval_expand
;
if
(
info
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator info null pointer
\n
"
);
return
-
EINVAL
;
}
return
info
->
delay
;
if
(
selector
<
info
->
expand_register
.
voltage_limit
)
{
int
voltage_shift
=
ffs
(
info
->
voltage_mask
)
-
1
;
regval
=
(
u8
)
selector
<<
voltage_shift
;
ret
=
abx500_mask_and_set_register_interruptible
(
info
->
dev
,
info
->
voltage_bank
,
info
->
voltage_reg
,
info
->
voltage_mask
,
regval
);
if
(
ret
<
0
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"couldn't set voltage reg for regulator
\n
"
);
return
ret
;
}
dev_vdbg
(
rdev_get_dev
(
rdev
),
"%s-set_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x
\n
"
,
info
->
desc
.
name
,
info
->
voltage_bank
,
info
->
voltage_reg
,
info
->
voltage_mask
,
regval
);
regval_expand
=
0
;
}
else
{
regval_expand
=
info
->
expand_register
.
voltage_mask
;
}
ret
=
abx500_mask_and_set_register_interruptible
(
info
->
dev
,
info
->
expand_register
.
voltage_bank
,
info
->
expand_register
.
voltage_reg
,
info
->
expand_register
.
voltage_mask
,
regval_expand
);
if
(
ret
<
0
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"couldn't set expand voltage reg for regulator
\n
"
);
return
ret
;
}
dev_vdbg
(
rdev_get_dev
(
rdev
),
"%s-set_voltage expand (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x
\n
"
,
info
->
desc
.
name
,
info
->
expand_register
.
voltage_bank
,
info
->
expand_register
.
voltage_reg
,
info
->
expand_register
.
voltage_mask
,
regval_expand
);
return
0
;
}
static
struct
regulator_ops
ab8500_regulator_ops
=
{
static
struct
regulator_ops
ab8500_regulator_volt_mode_ops
=
{
.
enable
=
ab8500_regulator_enable
,
.
disable
=
ab8500_regulator_disable
,
.
is_enabled
=
ab8500_regulator_is_enabled
,
.
get_optimum_mode
=
ab8500_regulator_get_optimum_mode
,
.
set_mode
=
ab8500_regulator_set_mode
,
.
get_mode
=
ab8500_regulator_get_mode
,
.
get_voltage_sel
=
ab8500_regulator_get_voltage_sel
,
.
set_voltage_sel
=
ab8500_regulator_set_voltage_sel
,
.
list_voltage
=
regulator_list_voltage_table
,
};
static
struct
regulator_ops
ab8540_aux3_regulator_volt_mode_ops
=
{
.
enable
=
ab8500_regulator_enable
,
.
disable
=
ab8500_regulator_disable
,
.
get_optimum_mode
=
ab8500_regulator_get_optimum_mode
,
.
set_mode
=
ab8500_regulator_set_mode
,
.
get_mode
=
ab8500_regulator_get_mode
,
.
is_enabled
=
ab8500_regulator_is_enabled
,
.
get_voltage_sel
=
ab8540_aux3_regulator_get_voltage_sel
,
.
set_voltage_sel
=
ab8540_aux3_regulator_set_voltage_sel
,
.
list_voltage
=
regulator_list_voltage_table
,
};
static
struct
regulator_ops
ab8500_regulator_volt_ops
=
{
.
enable
=
ab8500_regulator_enable
,
.
disable
=
ab8500_regulator_disable
,
.
is_enabled
=
ab8500_regulator_is_enabled
,
.
get_voltage_sel
=
ab8500_regulator_get_voltage_sel
,
.
set_voltage_sel
=
ab8500_regulator_set_voltage_sel
,
.
list_voltage
=
regulator_list_voltage_table
,
.
set_voltage_time_sel
=
ab8500_regulator_set_voltage_time_sel
,
};
static
struct
regulator_ops
ab8500_regulator_fixed_ops
=
{
static
struct
regulator_ops
ab8500_regulator_mode_ops
=
{
.
enable
=
ab8500_regulator_enable
,
.
disable
=
ab8500_regulator_disable
,
.
is_enabled
=
ab8500_regulator_is_enabled
,
.
get_optimum_mode
=
ab8500_regulator_get_optimum_mode
,
.
set_mode
=
ab8500_regulator_set_mode
,
.
get_mode
=
ab8500_regulator_get_mode
,
.
list_voltage
=
regulator_list_voltage_table
,
};
static
struct
regulator_ops
ab8500_regulator_ops
=
{
.
enable
=
ab8500_regulator_enable
,
.
disable
=
ab8500_regulator_disable
,
.
is_enabled
=
ab8500_regulator_is_enabled
,
.
list_voltage
=
regulator_list_voltage_table
,
};
static
struct
regulator_ops
ab8500_regulator_anamic_mode_ops
=
{
.
enable
=
ab8500_regulator_enable
,
.
disable
=
ab8500_regulator_disable
,
.
is_enabled
=
ab8500_regulator_is_enabled
,
.
list_voltage
=
regulator_list_voltage_linear
,
.
set_mode
=
ab8500_regulator_set_mode
,
.
get_mode
=
ab8500_regulator_get_mode
,
.
list_voltage
=
regulator_list_voltage_table
,
};
/* AB8500 regulator information */
static
struct
ab8500_regulator_info
ab8500_regulator_info
[
AB8500_NUM_REGULATORS
]
=
{
/*
...
...
@@ -274,17 +712,21 @@ static struct ab8500_regulator_info
[
AB8500_LDO_AUX1
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX1"
,
.
ops
=
&
ab8500_regulator_ops
,
.
ops
=
&
ab8500_regulator_
volt_mode_
ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_LDO_AUX1
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vauxn_voltages
),
.
volt_table
=
ldo_vauxn_voltages
,
.
enable_time
=
200
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x09
,
.
update_mask
=
0x03
,
.
update_val_enable
=
0x01
,
.
update_val
=
0x01
,
.
update_val_idle
=
0x03
,
.
update_val_normal
=
0x01
,
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x1f
,
.
voltage_mask
=
0x0f
,
...
...
@@ -292,17 +734,21 @@ static struct ab8500_regulator_info
[
AB8500_LDO_AUX2
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX2"
,
.
ops
=
&
ab8500_regulator_ops
,
.
ops
=
&
ab8500_regulator_
volt_mode_
ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_LDO_AUX2
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vauxn_voltages
),
.
volt_table
=
ldo_vauxn_voltages
,
.
enable_time
=
200
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x09
,
.
update_mask
=
0x0c
,
.
update_val_enable
=
0x04
,
.
update_val
=
0x04
,
.
update_val_idle
=
0x0c
,
.
update_val_normal
=
0x04
,
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x20
,
.
voltage_mask
=
0x0f
,
...
...
@@ -310,17 +756,21 @@ static struct ab8500_regulator_info
[
AB8500_LDO_AUX3
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX3"
,
.
ops
=
&
ab8500_regulator_ops
,
.
ops
=
&
ab8500_regulator_
volt_mode_
ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_LDO_AUX3
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vaux3_voltages
),
.
volt_table
=
ldo_vaux3_voltages
,
.
enable_time
=
450
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x0a
,
.
update_mask
=
0x03
,
.
update_val_enable
=
0x01
,
.
update_val
=
0x01
,
.
update_val_idle
=
0x03
,
.
update_val_normal
=
0x01
,
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x21
,
.
voltage_mask
=
0x07
,
...
...
@@ -328,21 +778,24 @@ static struct ab8500_regulator_info
[
AB8500_LDO_INTCORE
]
=
{
.
desc
=
{
.
name
=
"LDO-INTCORE"
,
.
ops
=
&
ab8500_regulator_ops
,
.
ops
=
&
ab8500_regulator_
volt_mode_
ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_LDO_INTCORE
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vintcore_voltages
),
.
volt_table
=
ldo_vintcore_voltages
,
.
enable_time
=
750
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x03
,
.
update_reg
=
0x80
,
.
update_mask
=
0x44
,
.
update_val_enable
=
0x04
,
.
update_val
=
0x44
,
.
update_val_idle
=
0x44
,
.
update_val_normal
=
0x04
,
.
voltage_bank
=
0x03
,
.
voltage_reg
=
0x80
,
.
voltage_mask
=
0x38
,
.
voltage_shift
=
3
,
},
/*
...
...
@@ -353,190 +806,1819 @@ static struct ab8500_regulator_info
[
AB8500_LDO_TVOUT
]
=
{
.
desc
=
{
.
name
=
"LDO-TVOUT"
,
.
ops
=
&
ab8500_regulator_
fixed
_ops
,
.
ops
=
&
ab8500_regulator_
mode
_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_LDO_TVOUT
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
min_uV
=
2000000
,
.
enable_time
=
100
00
,
.
volt_table
=
fixed_2000000_voltage
,
.
enable_time
=
5
00
,
},
.
delay
=
10
000
,
.
load_lp_uA
=
1
000
,
.
update_bank
=
0x03
,
.
update_reg
=
0x80
,
.
update_mask
=
0x82
,
.
update_val_enable
=
0x02
,
},
[
AB8500_LDO_USB
]
=
{
.
desc
=
{
.
name
=
"LDO-USB"
,
.
ops
=
&
ab8500_regulator_fixed_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_LDO_USB
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
min_uV
=
3300000
,
},
.
update_bank
=
0x03
,
.
update_reg
=
0x82
,
.
update_mask
=
0x03
,
.
update_val_enable
=
0x01
,
.
update_val
=
0x02
,
.
update_val_idle
=
0x82
,
.
update_val_normal
=
0x02
,
},
[
AB8500_LDO_AUDIO
]
=
{
.
desc
=
{
.
name
=
"LDO-AUDIO"
,
.
ops
=
&
ab8500_regulator_
fixed_
ops
,
.
ops
=
&
ab8500_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_LDO_AUDIO
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
min_uV
=
2000000
,
.
enable_time
=
140
,
.
volt_table
=
fixed_2000000_voltage
,
},
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x02
,
.
update_val
_enable
=
0x02
,
.
update_val
=
0x02
,
},
[
AB8500_LDO_ANAMIC1
]
=
{
.
desc
=
{
.
name
=
"LDO-ANAMIC1"
,
.
ops
=
&
ab8500_regulator_
fixed_
ops
,
.
ops
=
&
ab8500_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_LDO_ANAMIC1
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
min_uV
=
2050000
,
.
enable_time
=
500
,
.
volt_table
=
fixed_2050000_voltage
,
},
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x08
,
.
update_val
_enable
=
0x08
,
.
update_val
=
0x08
,
},
[
AB8500_LDO_ANAMIC2
]
=
{
.
desc
=
{
.
name
=
"LDO-ANAMIC2"
,
.
ops
=
&
ab8500_regulator_
fixed_
ops
,
.
ops
=
&
ab8500_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_LDO_ANAMIC2
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
min_uV
=
2050000
,
.
enable_time
=
500
,
.
volt_table
=
fixed_2050000_voltage
,
},
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x10
,
.
update_val
_enable
=
0x10
,
.
update_val
=
0x10
,
},
[
AB8500_LDO_DMIC
]
=
{
.
desc
=
{
.
name
=
"LDO-DMIC"
,
.
ops
=
&
ab8500_regulator_
fixed_
ops
,
.
ops
=
&
ab8500_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_LDO_DMIC
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
min_uV
=
1800000
,
.
enable_time
=
420
,
.
volt_table
=
fixed_1800000_voltage
,
},
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x04
,
.
update_val
_enable
=
0x04
,
.
update_val
=
0x04
,
},
/*
* Regulators with fixed voltage and normal/idle modes
*/
[
AB8500_LDO_ANA
]
=
{
.
desc
=
{
.
name
=
"LDO-ANA"
,
.
ops
=
&
ab8500_regulator_
fixed
_ops
,
.
ops
=
&
ab8500_regulator_
mode
_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_LDO_ANA
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
min_uV
=
1200000
,
.
enable_time
=
140
,
.
volt_table
=
fixed_1200000_voltage
,
},
.
load_lp_uA
=
1000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x06
,
.
update_mask
=
0x0c
,
.
update_val_enable
=
0x04
,
.
update_val
=
0x04
,
.
update_val_idle
=
0x0c
,
.
update_val_normal
=
0x04
,
},
};
struct
ab8500_reg_init
{
u8
bank
;
u8
addr
;
u8
mask
;
};
#define REG_INIT(_id, _bank, _addr, _mask) \
[_id] = { \
.bank = _bank, \
.addr = _addr, \
.mask = _mask, \
}
static
struct
ab8500_reg_init
ab8500_reg_init
[]
=
{
/*
* 0x30, VanaRequestCtrl
* 0x0C, VpllRequestCtrl
* 0xc0, VextSupply1RequestCtrl
*/
REG_INIT
(
AB8500_REGUREQUESTCTRL2
,
0x03
,
0x04
,
0xfc
),
/*
* 0x03, VextSupply2RequestCtrl
* 0x0c, VextSupply3RequestCtrl
* 0x30, Vaux1RequestCtrl
* 0xc0, Vaux2RequestCtrl
*/
REG_INIT
(
AB8500_REGUREQUESTCTRL3
,
0x03
,
0x05
,
0xff
),
/*
* 0x03, Vaux3RequestCtrl
* 0x04, SwHPReq
*/
REG_INIT
(
AB8500_REGUREQUESTCTRL4
,
0x03
,
0x06
,
0x07
),
/* AB8505 regulator information */
static
struct
ab8500_regulator_info
ab8505_regulator_info
[
AB8505_NUM_REGULATORS
]
=
{
/*
*
0x08, VanaSysClkReq1HPValid
*
0x20, Vaux1SysClkReq1HPValid
*
0x40, Vaux2SysClkReq1HPValid
*
0x80, Vaux3SysClkReq1HPValid
*
Variable Voltage Regulators
*
name, min mV, max mV,
*
update bank, reg, mask, enable val
*
volt bank, reg, mask
*/
REG_INIT
(
AB8500_REGUSYSCLKREQ1HPVALID1
,
0x03
,
0x07
,
0xe8
),
/*
* 0x10, VextSupply1SysClkReq1HPValid
* 0x20, VextSupply2SysClkReq1HPValid
[
AB8505_LDO_AUX1
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX1"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8505_LDO_AUX1
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vauxn_voltages
),
.
volt_table
=
ldo_vauxn_voltages
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x09
,
.
update_mask
=
0x03
,
.
update_val
=
0x01
,
.
update_val_idle
=
0x03
,
.
update_val_normal
=
0x01
,
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x1f
,
.
voltage_mask
=
0x0f
,
},
[
AB8505_LDO_AUX2
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX2"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8505_LDO_AUX2
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vauxn_voltages
),
.
volt_table
=
ldo_vauxn_voltages
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x09
,
.
update_mask
=
0x0c
,
.
update_val
=
0x04
,
.
update_val_idle
=
0x0c
,
.
update_val_normal
=
0x04
,
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x20
,
.
voltage_mask
=
0x0f
,
},
[
AB8505_LDO_AUX3
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX3"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8505_LDO_AUX3
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vaux3_voltages
),
.
volt_table
=
ldo_vaux3_voltages
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x0a
,
.
update_mask
=
0x03
,
.
update_val
=
0x01
,
.
update_val_idle
=
0x03
,
.
update_val_normal
=
0x01
,
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x21
,
.
voltage_mask
=
0x07
,
},
[
AB8505_LDO_AUX4
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX4"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8505_LDO_AUX4
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vauxn_voltages
),
.
volt_table
=
ldo_vauxn_voltages
,
},
.
load_lp_uA
=
5000
,
/* values for Vaux4Regu register */
.
update_bank
=
0x04
,
.
update_reg
=
0x2e
,
.
update_mask
=
0x03
,
.
update_val
=
0x01
,
.
update_val_idle
=
0x03
,
.
update_val_normal
=
0x01
,
/* values for Vaux4SEL register */
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x2f
,
.
voltage_mask
=
0x0f
,
},
[
AB8505_LDO_AUX5
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX5"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8505_LDO_AUX5
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vaux56_voltages
),
.
volt_table
=
ldo_vaux56_voltages
,
},
.
load_lp_uA
=
2000
,
/* values for CtrlVaux5 register */
.
update_bank
=
0x01
,
.
update_reg
=
0x55
,
.
update_mask
=
0x18
,
.
update_val
=
0x10
,
.
update_val_idle
=
0x18
,
.
update_val_normal
=
0x10
,
.
voltage_bank
=
0x01
,
.
voltage_reg
=
0x55
,
.
voltage_mask
=
0x07
,
},
[
AB8505_LDO_AUX6
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX6"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8505_LDO_AUX6
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vaux56_voltages
),
.
volt_table
=
ldo_vaux56_voltages
,
},
.
load_lp_uA
=
2000
,
/* values for CtrlVaux6 register */
.
update_bank
=
0x01
,
.
update_reg
=
0x56
,
.
update_mask
=
0x18
,
.
update_val
=
0x10
,
.
update_val_idle
=
0x18
,
.
update_val_normal
=
0x10
,
.
voltage_bank
=
0x01
,
.
voltage_reg
=
0x56
,
.
voltage_mask
=
0x07
,
},
[
AB8505_LDO_INTCORE
]
=
{
.
desc
=
{
.
name
=
"LDO-INTCORE"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8505_LDO_INTCORE
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vintcore_voltages
),
.
volt_table
=
ldo_vintcore_voltages
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x03
,
.
update_reg
=
0x80
,
.
update_mask
=
0x44
,
.
update_val
=
0x04
,
.
update_val_idle
=
0x44
,
.
update_val_normal
=
0x04
,
.
voltage_bank
=
0x03
,
.
voltage_reg
=
0x80
,
.
voltage_mask
=
0x38
,
},
/*
* Fixed Voltage Regulators
* name, fixed mV,
* update bank, reg, mask, enable val
*/
[
AB8505_LDO_ADC
]
=
{
.
desc
=
{
.
name
=
"LDO-ADC"
,
.
ops
=
&
ab8500_regulator_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8505_LDO_ADC
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_2000000_voltage
,
.
enable_time
=
10000
,
},
.
load_lp_uA
=
1000
,
.
update_bank
=
0x03
,
.
update_reg
=
0x80
,
.
update_mask
=
0x82
,
.
update_val
=
0x02
,
.
update_val_idle
=
0x82
,
.
update_val_normal
=
0x02
,
},
[
AB8505_LDO_USB
]
=
{
.
desc
=
{
.
name
=
"LDO-USB"
,
.
ops
=
&
ab8500_regulator_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8505_LDO_USB
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_3300000_voltage
,
},
.
update_bank
=
0x03
,
.
update_reg
=
0x82
,
.
update_mask
=
0x03
,
.
update_val
=
0x01
,
.
update_val_idle
=
0x03
,
.
update_val_normal
=
0x01
,
},
[
AB8505_LDO_AUDIO
]
=
{
.
desc
=
{
.
name
=
"LDO-AUDIO"
,
.
ops
=
&
ab8500_regulator_volt_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8505_LDO_AUDIO
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vaudio_voltages
),
.
volt_table
=
ldo_vaudio_voltages
,
},
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x02
,
.
update_val
=
0x02
,
.
voltage_bank
=
0x01
,
.
voltage_reg
=
0x57
,
.
voltage_mask
=
0x70
,
},
[
AB8505_LDO_ANAMIC1
]
=
{
.
desc
=
{
.
name
=
"LDO-ANAMIC1"
,
.
ops
=
&
ab8500_regulator_anamic_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8505_LDO_ANAMIC1
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_2050000_voltage
,
},
.
shared_mode
=
&
ldo_anamic1_shared
,
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x08
,
.
update_val
=
0x08
,
.
mode_bank
=
0x01
,
.
mode_reg
=
0x54
,
.
mode_mask
=
0x04
,
.
mode_val_idle
=
0x04
,
.
mode_val_normal
=
0x00
,
},
[
AB8505_LDO_ANAMIC2
]
=
{
.
desc
=
{
.
name
=
"LDO-ANAMIC2"
,
.
ops
=
&
ab8500_regulator_anamic_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8505_LDO_ANAMIC2
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_2050000_voltage
,
},
.
shared_mode
=
&
ldo_anamic2_shared
,
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x10
,
.
update_val
=
0x10
,
.
mode_bank
=
0x01
,
.
mode_reg
=
0x54
,
.
mode_mask
=
0x04
,
.
mode_val_idle
=
0x04
,
.
mode_val_normal
=
0x00
,
},
[
AB8505_LDO_AUX8
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX8"
,
.
ops
=
&
ab8500_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8505_LDO_AUX8
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_1800000_voltage
,
},
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x04
,
.
update_val
=
0x04
,
},
/*
* Regulators with fixed voltage and normal/idle modes
*/
[
AB8505_LDO_ANA
]
=
{
.
desc
=
{
.
name
=
"LDO-ANA"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8505_LDO_ANA
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vana_voltages
),
.
volt_table
=
ldo_vana_voltages
,
},
.
load_lp_uA
=
1000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x06
,
.
update_mask
=
0x0c
,
.
update_val
=
0x04
,
.
update_val_idle
=
0x0c
,
.
update_val_normal
=
0x04
,
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x29
,
.
voltage_mask
=
0x7
,
},
};
/* AB9540 regulator information */
static
struct
ab8500_regulator_info
ab9540_regulator_info
[
AB9540_NUM_REGULATORS
]
=
{
/*
* Variable Voltage Regulators
* name, min mV, max mV,
* update bank, reg, mask, enable val
* volt bank, reg, mask
*/
[
AB9540_LDO_AUX1
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX1"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB9540_LDO_AUX1
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vauxn_voltages
),
.
volt_table
=
ldo_vauxn_voltages
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x09
,
.
update_mask
=
0x03
,
.
update_val
=
0x01
,
.
update_val_idle
=
0x03
,
.
update_val_normal
=
0x01
,
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x1f
,
.
voltage_mask
=
0x0f
,
},
[
AB9540_LDO_AUX2
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX2"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB9540_LDO_AUX2
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vauxn_voltages
),
.
volt_table
=
ldo_vauxn_voltages
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x09
,
.
update_mask
=
0x0c
,
.
update_val
=
0x04
,
.
update_val_idle
=
0x0c
,
.
update_val_normal
=
0x04
,
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x20
,
.
voltage_mask
=
0x0f
,
},
[
AB9540_LDO_AUX3
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX3"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB9540_LDO_AUX3
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vaux3_voltages
),
.
volt_table
=
ldo_vaux3_voltages
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x0a
,
.
update_mask
=
0x03
,
.
update_val
=
0x01
,
.
update_val_idle
=
0x03
,
.
update_val_normal
=
0x01
,
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x21
,
.
voltage_mask
=
0x07
,
},
[
AB9540_LDO_AUX4
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX4"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB9540_LDO_AUX4
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vauxn_voltages
),
.
volt_table
=
ldo_vauxn_voltages
,
},
.
load_lp_uA
=
5000
,
/* values for Vaux4Regu register */
.
update_bank
=
0x04
,
.
update_reg
=
0x2e
,
.
update_mask
=
0x03
,
.
update_val
=
0x01
,
.
update_val_idle
=
0x03
,
.
update_val_normal
=
0x01
,
/* values for Vaux4SEL register */
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x2f
,
.
voltage_mask
=
0x0f
,
},
[
AB9540_LDO_INTCORE
]
=
{
.
desc
=
{
.
name
=
"LDO-INTCORE"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB9540_LDO_INTCORE
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vintcore_voltages
),
.
volt_table
=
ldo_vintcore_voltages
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x03
,
.
update_reg
=
0x80
,
.
update_mask
=
0x44
,
.
update_val
=
0x44
,
.
update_val_idle
=
0x44
,
.
update_val_normal
=
0x04
,
.
voltage_bank
=
0x03
,
.
voltage_reg
=
0x80
,
.
voltage_mask
=
0x38
,
},
/*
* Fixed Voltage Regulators
* name, fixed mV,
* update bank, reg, mask, enable val
*/
[
AB9540_LDO_TVOUT
]
=
{
.
desc
=
{
.
name
=
"LDO-TVOUT"
,
.
ops
=
&
ab8500_regulator_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB9540_LDO_TVOUT
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_2000000_voltage
,
.
enable_time
=
10000
,
},
.
load_lp_uA
=
1000
,
.
update_bank
=
0x03
,
.
update_reg
=
0x80
,
.
update_mask
=
0x82
,
.
update_val
=
0x02
,
.
update_val_idle
=
0x82
,
.
update_val_normal
=
0x02
,
},
[
AB9540_LDO_USB
]
=
{
.
desc
=
{
.
name
=
"LDO-USB"
,
.
ops
=
&
ab8500_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB9540_LDO_USB
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_3300000_voltage
,
},
.
update_bank
=
0x03
,
.
update_reg
=
0x82
,
.
update_mask
=
0x03
,
.
update_val
=
0x01
,
.
update_val_idle
=
0x03
,
.
update_val_normal
=
0x01
,
},
[
AB9540_LDO_AUDIO
]
=
{
.
desc
=
{
.
name
=
"LDO-AUDIO"
,
.
ops
=
&
ab8500_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB9540_LDO_AUDIO
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_2000000_voltage
,
},
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x02
,
.
update_val
=
0x02
,
},
[
AB9540_LDO_ANAMIC1
]
=
{
.
desc
=
{
.
name
=
"LDO-ANAMIC1"
,
.
ops
=
&
ab8500_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB9540_LDO_ANAMIC1
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_2050000_voltage
,
},
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x08
,
.
update_val
=
0x08
,
},
[
AB9540_LDO_ANAMIC2
]
=
{
.
desc
=
{
.
name
=
"LDO-ANAMIC2"
,
.
ops
=
&
ab8500_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB9540_LDO_ANAMIC2
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_2050000_voltage
,
},
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x10
,
.
update_val
=
0x10
,
},
[
AB9540_LDO_DMIC
]
=
{
.
desc
=
{
.
name
=
"LDO-DMIC"
,
.
ops
=
&
ab8500_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB9540_LDO_DMIC
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_1800000_voltage
,
},
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x04
,
.
update_val
=
0x04
,
},
/*
* Regulators with fixed voltage and normal/idle modes
*/
[
AB9540_LDO_ANA
]
=
{
.
desc
=
{
.
name
=
"LDO-ANA"
,
.
ops
=
&
ab8500_regulator_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB9540_LDO_ANA
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_1200000_voltage
,
},
.
load_lp_uA
=
1000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x06
,
.
update_mask
=
0x0c
,
.
update_val
=
0x08
,
.
update_val_idle
=
0x0c
,
.
update_val_normal
=
0x08
,
},
};
/* AB8540 regulator information */
static
struct
ab8500_regulator_info
ab8540_regulator_info
[
AB8540_NUM_REGULATORS
]
=
{
/*
* Variable Voltage Regulators
* name, min mV, max mV,
* update bank, reg, mask, enable val
* volt bank, reg, mask
*/
[
AB8540_LDO_AUX1
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX1"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8540_LDO_AUX1
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vauxn_voltages
),
.
volt_table
=
ldo_vauxn_voltages
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x09
,
.
update_mask
=
0x03
,
.
update_val
=
0x01
,
.
update_val_idle
=
0x03
,
.
update_val_normal
=
0x01
,
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x1f
,
.
voltage_mask
=
0x0f
,
},
[
AB8540_LDO_AUX2
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX2"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8540_LDO_AUX2
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vauxn_voltages
),
.
volt_table
=
ldo_vauxn_voltages
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x09
,
.
update_mask
=
0x0c
,
.
update_val
=
0x04
,
.
update_val_idle
=
0x0c
,
.
update_val_normal
=
0x04
,
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x20
,
.
voltage_mask
=
0x0f
,
},
[
AB8540_LDO_AUX3
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX3"
,
.
ops
=
&
ab8540_aux3_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8540_LDO_AUX3
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vaux3_ab8540_voltages
),
.
volt_table
=
ldo_vaux3_ab8540_voltages
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x0a
,
.
update_mask
=
0x03
,
.
update_val
=
0x01
,
.
update_val_idle
=
0x03
,
.
update_val_normal
=
0x01
,
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x21
,
.
voltage_mask
=
0x07
,
.
expand_register
=
{
.
voltage_limit
=
8
,
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x01
,
.
voltage_mask
=
0x10
,
}
},
[
AB8540_LDO_AUX4
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX4"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8540_LDO_AUX4
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vauxn_voltages
),
.
volt_table
=
ldo_vauxn_voltages
,
},
.
load_lp_uA
=
5000
,
/* values for Vaux4Regu register */
.
update_bank
=
0x04
,
.
update_reg
=
0x2e
,
.
update_mask
=
0x03
,
.
update_val
=
0x01
,
.
update_val_idle
=
0x03
,
.
update_val_normal
=
0x01
,
/* values for Vaux4SEL register */
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x2f
,
.
voltage_mask
=
0x0f
,
},
[
AB8540_LDO_AUX5
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX5"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8540_LDO_AUX5
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vaux56_ab8540_voltages
),
.
volt_table
=
ldo_vaux56_ab8540_voltages
,
},
.
load_lp_uA
=
20000
,
/* values for Vaux5Regu register */
.
update_bank
=
0x04
,
.
update_reg
=
0x32
,
.
update_mask
=
0x03
,
.
update_val
=
0x01
,
.
update_val_idle
=
0x03
,
.
update_val_normal
=
0x01
,
/* values for Vaux5SEL register */
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x33
,
.
voltage_mask
=
0x3f
,
},
[
AB8540_LDO_AUX6
]
=
{
.
desc
=
{
.
name
=
"LDO-AUX6"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8540_LDO_AUX6
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vaux56_ab8540_voltages
),
.
volt_table
=
ldo_vaux56_ab8540_voltages
,
},
.
load_lp_uA
=
20000
,
/* values for Vaux6Regu register */
.
update_bank
=
0x04
,
.
update_reg
=
0x35
,
.
update_mask
=
0x03
,
.
update_val
=
0x01
,
.
update_val_idle
=
0x03
,
.
update_val_normal
=
0x01
,
/* values for Vaux6SEL register */
.
voltage_bank
=
0x04
,
.
voltage_reg
=
0x36
,
.
voltage_mask
=
0x3f
,
},
[
AB8540_LDO_INTCORE
]
=
{
.
desc
=
{
.
name
=
"LDO-INTCORE"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8540_LDO_INTCORE
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vintcore_voltages
),
.
volt_table
=
ldo_vintcore_voltages
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x03
,
.
update_reg
=
0x80
,
.
update_mask
=
0x44
,
.
update_val
=
0x44
,
.
update_val_idle
=
0x44
,
.
update_val_normal
=
0x04
,
.
voltage_bank
=
0x03
,
.
voltage_reg
=
0x80
,
.
voltage_mask
=
0x38
,
},
/*
* Fixed Voltage Regulators
* name, fixed mV,
* update bank, reg, mask, enable val
*/
[
AB8540_LDO_TVOUT
]
=
{
.
desc
=
{
.
name
=
"LDO-TVOUT"
,
.
ops
=
&
ab8500_regulator_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8540_LDO_TVOUT
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_2000000_voltage
,
.
enable_time
=
10000
,
},
.
load_lp_uA
=
1000
,
.
update_bank
=
0x03
,
.
update_reg
=
0x80
,
.
update_mask
=
0x82
,
.
update_val
=
0x02
,
.
update_val_idle
=
0x82
,
.
update_val_normal
=
0x02
,
},
[
AB8540_LDO_AUDIO
]
=
{
.
desc
=
{
.
name
=
"LDO-AUDIO"
,
.
ops
=
&
ab8500_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8540_LDO_AUDIO
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_2000000_voltage
,
},
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x02
,
.
update_val
=
0x02
,
},
[
AB8540_LDO_ANAMIC1
]
=
{
.
desc
=
{
.
name
=
"LDO-ANAMIC1"
,
.
ops
=
&
ab8500_regulator_anamic_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8540_LDO_ANAMIC1
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_2050000_voltage
,
},
.
shared_mode
=
&
ab8540_ldo_anamic1_shared
,
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x08
,
.
update_val
=
0x08
,
.
mode_bank
=
0x03
,
.
mode_reg
=
0x83
,
.
mode_mask
=
0x20
,
.
mode_val_idle
=
0x20
,
.
mode_val_normal
=
0x00
,
},
[
AB8540_LDO_ANAMIC2
]
=
{
.
desc
=
{
.
name
=
"LDO-ANAMIC2"
,
.
ops
=
&
ab8500_regulator_anamic_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8540_LDO_ANAMIC2
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_2050000_voltage
,
},
.
shared_mode
=
&
ab8540_ldo_anamic2_shared
,
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x10
,
.
update_val
=
0x10
,
.
mode_bank
=
0x03
,
.
mode_reg
=
0x83
,
.
mode_mask
=
0x20
,
.
mode_val_idle
=
0x20
,
.
mode_val_normal
=
0x00
,
},
[
AB8540_LDO_DMIC
]
=
{
.
desc
=
{
.
name
=
"LDO-DMIC"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8540_LDO_DMIC
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_vdmic_voltages
),
.
volt_table
=
ldo_vdmic_voltages
,
},
.
load_lp_uA
=
1000
,
.
update_bank
=
0x03
,
.
update_reg
=
0x83
,
.
update_mask
=
0x04
,
.
update_val
=
0x04
,
.
voltage_bank
=
0x03
,
.
voltage_reg
=
0x83
,
.
voltage_mask
=
0xc0
,
},
/*
* Regulators with fixed voltage and normal/idle modes
*/
[
AB8540_LDO_ANA
]
=
{
.
desc
=
{
.
name
=
"LDO-ANA"
,
.
ops
=
&
ab8500_regulator_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8540_LDO_ANA
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
.
volt_table
=
fixed_1200000_voltage
,
},
.
load_lp_uA
=
1000
,
.
update_bank
=
0x04
,
.
update_reg
=
0x06
,
.
update_mask
=
0x0c
,
.
update_val
=
0x04
,
.
update_val_idle
=
0x0c
,
.
update_val_normal
=
0x04
,
},
[
AB8540_LDO_SDIO
]
=
{
.
desc
=
{
.
name
=
"LDO-SDIO"
,
.
ops
=
&
ab8500_regulator_volt_mode_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8540_LDO_SDIO
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
ARRAY_SIZE
(
ldo_sdio_voltages
),
.
volt_table
=
ldo_sdio_voltages
,
},
.
load_lp_uA
=
5000
,
.
update_bank
=
0x03
,
.
update_reg
=
0x88
,
.
update_mask
=
0x30
,
.
update_val
=
0x10
,
.
update_val_idle
=
0x30
,
.
update_val_normal
=
0x10
,
.
voltage_bank
=
0x03
,
.
voltage_reg
=
0x88
,
.
voltage_mask
=
0x07
,
},
};
static
struct
ab8500_shared_mode
ldo_anamic1_shared
=
{
.
shared_regulator
=
&
ab8505_regulator_info
[
AB8505_LDO_ANAMIC2
],
};
static
struct
ab8500_shared_mode
ldo_anamic2_shared
=
{
.
shared_regulator
=
&
ab8505_regulator_info
[
AB8505_LDO_ANAMIC1
],
};
static
struct
ab8500_shared_mode
ab8540_ldo_anamic1_shared
=
{
.
shared_regulator
=
&
ab8540_regulator_info
[
AB8540_LDO_ANAMIC2
],
};
static
struct
ab8500_shared_mode
ab8540_ldo_anamic2_shared
=
{
.
shared_regulator
=
&
ab8540_regulator_info
[
AB8540_LDO_ANAMIC1
],
};
struct
ab8500_reg_init
{
u8
bank
;
u8
addr
;
u8
mask
;
};
#define REG_INIT(_id, _bank, _addr, _mask) \
[_id] = { \
.bank = _bank, \
.addr = _addr, \
.mask = _mask, \
}
/* AB8500 register init */
static
struct
ab8500_reg_init
ab8500_reg_init
[]
=
{
/*
* 0x30, VanaRequestCtrl
* 0xc0, VextSupply1RequestCtrl
*/
REG_INIT
(
AB8500_REGUREQUESTCTRL2
,
0x03
,
0x04
,
0xf0
),
/*
* 0x03, VextSupply2RequestCtrl
* 0x0c, VextSupply3RequestCtrl
* 0x30, Vaux1RequestCtrl
* 0xc0, Vaux2RequestCtrl
*/
REG_INIT
(
AB8500_REGUREQUESTCTRL3
,
0x03
,
0x05
,
0xff
),
/*
* 0x03, Vaux3RequestCtrl
* 0x04, SwHPReq
*/
REG_INIT
(
AB8500_REGUREQUESTCTRL4
,
0x03
,
0x06
,
0x07
),
/*
* 0x08, VanaSysClkReq1HPValid
* 0x20, Vaux1SysClkReq1HPValid
* 0x40, Vaux2SysClkReq1HPValid
* 0x80, Vaux3SysClkReq1HPValid
*/
REG_INIT
(
AB8500_REGUSYSCLKREQ1HPVALID1
,
0x03
,
0x07
,
0xe8
),
/*
* 0x10, VextSupply1SysClkReq1HPValid
* 0x20, VextSupply2SysClkReq1HPValid
* 0x40, VextSupply3SysClkReq1HPValid
*/
REG_INIT
(
AB8500_REGUSYSCLKREQ1HPVALID2
,
0x03
,
0x08
,
0x70
),
/*
* 0x08, VanaHwHPReq1Valid
* 0x20, Vaux1HwHPReq1Valid
* 0x40, Vaux2HwHPReq1Valid
* 0x80, Vaux3HwHPReq1Valid
*/
REG_INIT
(
AB8500_REGUHWHPREQ1VALID1
,
0x03
,
0x09
,
0xe8
),
/*
* 0x01, VextSupply1HwHPReq1Valid
* 0x02, VextSupply2HwHPReq1Valid
* 0x04, VextSupply3HwHPReq1Valid
*/
REG_INIT
(
AB8500_REGUHWHPREQ1VALID2
,
0x03
,
0x0a
,
0x07
),
/*
* 0x08, VanaHwHPReq2Valid
* 0x20, Vaux1HwHPReq2Valid
* 0x40, Vaux2HwHPReq2Valid
* 0x80, Vaux3HwHPReq2Valid
*/
REG_INIT
(
AB8500_REGUHWHPREQ2VALID1
,
0x03
,
0x0b
,
0xe8
),
/*
* 0x01, VextSupply1HwHPReq2Valid
* 0x02, VextSupply2HwHPReq2Valid
* 0x04, VextSupply3HwHPReq2Valid
*/
REG_INIT
(
AB8500_REGUHWHPREQ2VALID2
,
0x03
,
0x0c
,
0x07
),
/*
* 0x20, VanaSwHPReqValid
* 0x80, Vaux1SwHPReqValid
*/
REG_INIT
(
AB8500_REGUSWHPREQVALID1
,
0x03
,
0x0d
,
0xa0
),
/*
* 0x01, Vaux2SwHPReqValid
* 0x02, Vaux3SwHPReqValid
* 0x04, VextSupply1SwHPReqValid
* 0x08, VextSupply2SwHPReqValid
* 0x10, VextSupply3SwHPReqValid
*/
REG_INIT
(
AB8500_REGUSWHPREQVALID2
,
0x03
,
0x0e
,
0x1f
),
/*
* 0x02, SysClkReq2Valid1
* 0x04, SysClkReq3Valid1
* 0x08, SysClkReq4Valid1
* 0x10, SysClkReq5Valid1
* 0x20, SysClkReq6Valid1
* 0x40, SysClkReq7Valid1
* 0x80, SysClkReq8Valid1
*/
REG_INIT
(
AB8500_REGUSYSCLKREQVALID1
,
0x03
,
0x0f
,
0xfe
),
/*
* 0x02, SysClkReq2Valid2
* 0x04, SysClkReq3Valid2
* 0x08, SysClkReq4Valid2
* 0x10, SysClkReq5Valid2
* 0x20, SysClkReq6Valid2
* 0x40, SysClkReq7Valid2
* 0x80, SysClkReq8Valid2
*/
REG_INIT
(
AB8500_REGUSYSCLKREQVALID2
,
0x03
,
0x10
,
0xfe
),
/*
* 0x02, VTVoutEna
* 0x04, Vintcore12Ena
* 0x38, Vintcore12Sel
* 0x40, Vintcore12LP
* 0x80, VTVoutLP
*/
REG_INIT
(
AB8500_REGUMISC1
,
0x03
,
0x80
,
0xfe
),
/*
* 0x02, VaudioEna
* 0x04, VdmicEna
* 0x08, Vamic1Ena
* 0x10, Vamic2Ena
*/
REG_INIT
(
AB8500_VAUDIOSUPPLY
,
0x03
,
0x83
,
0x1e
),
/*
* 0x01, Vamic1_dzout
* 0x02, Vamic2_dzout
*/
REG_INIT
(
AB8500_REGUCTRL1VAMIC
,
0x03
,
0x84
,
0x03
),
/*
* 0x03, VpllRegu (NOTE! PRCMU register bits)
* 0x0c, VanaRegu
*/
REG_INIT
(
AB8500_VPLLVANAREGU
,
0x04
,
0x06
,
0x0f
),
/*
* 0x01, VrefDDREna
* 0x02, VrefDDRSleepMode
*/
REG_INIT
(
AB8500_VREFDDR
,
0x04
,
0x07
,
0x03
),
/*
* 0x03, VextSupply1Regu
* 0x0c, VextSupply2Regu
* 0x30, VextSupply3Regu
* 0x40, ExtSupply2Bypass
* 0x80, ExtSupply3Bypass
*/
REG_INIT
(
AB8500_EXTSUPPLYREGU
,
0x04
,
0x08
,
0xff
),
/*
* 0x03, Vaux1Regu
* 0x0c, Vaux2Regu
*/
REG_INIT
(
AB8500_VAUX12REGU
,
0x04
,
0x09
,
0x0f
),
/*
* 0x03, Vaux3Regu
*/
REG_INIT
(
AB8500_VRF1VAUX3REGU
,
0x04
,
0x0a
,
0x03
),
/*
* 0x0f, Vaux1Sel
*/
REG_INIT
(
AB8500_VAUX1SEL
,
0x04
,
0x1f
,
0x0f
),
/*
* 0x0f, Vaux2Sel
*/
REG_INIT
(
AB8500_VAUX2SEL
,
0x04
,
0x20
,
0x0f
),
/*
* 0x07, Vaux3Sel
*/
REG_INIT
(
AB8500_VRF1VAUX3SEL
,
0x04
,
0x21
,
0x07
),
/*
* 0x01, VextSupply12LP
*/
REG_INIT
(
AB8500_REGUCTRL2SPARE
,
0x04
,
0x22
,
0x01
),
/*
* 0x04, Vaux1Disch
* 0x08, Vaux2Disch
* 0x10, Vaux3Disch
* 0x20, Vintcore12Disch
* 0x40, VTVoutDisch
* 0x80, VaudioDisch
*/
REG_INIT
(
AB8500_REGUCTRLDISCH
,
0x04
,
0x43
,
0xfc
),
/*
* 0x02, VanaDisch
* 0x04, VdmicPullDownEna
* 0x10, VdmicDisch
*/
REG_INIT
(
AB8500_REGUCTRLDISCH2
,
0x04
,
0x44
,
0x16
),
};
/* AB8505 register init */
static
struct
ab8500_reg_init
ab8505_reg_init
[]
=
{
/*
* 0x03, VarmRequestCtrl
* 0x0c, VsmpsCRequestCtrl
* 0x30, VsmpsARequestCtrl
* 0xc0, VsmpsBRequestCtrl
*/
REG_INIT
(
AB8505_REGUREQUESTCTRL1
,
0x03
,
0x03
,
0xff
),
/*
* 0x03, VsafeRequestCtrl
* 0x0c, VpllRequestCtrl
* 0x30, VanaRequestCtrl
*/
REG_INIT
(
AB8505_REGUREQUESTCTRL2
,
0x03
,
0x04
,
0x3f
),
/*
* 0x30, Vaux1RequestCtrl
* 0xc0, Vaux2RequestCtrl
*/
REG_INIT
(
AB8505_REGUREQUESTCTRL3
,
0x03
,
0x05
,
0xf0
),
/*
* 0x03, Vaux3RequestCtrl
* 0x04, SwHPReq
*/
REG_INIT
(
AB8505_REGUREQUESTCTRL4
,
0x03
,
0x06
,
0x07
),
/*
* 0x01, VsmpsASysClkReq1HPValid
* 0x02, VsmpsBSysClkReq1HPValid
* 0x04, VsafeSysClkReq1HPValid
* 0x08, VanaSysClkReq1HPValid
* 0x10, VpllSysClkReq1HPValid
* 0x20, Vaux1SysClkReq1HPValid
* 0x40, Vaux2SysClkReq1HPValid
* 0x80, Vaux3SysClkReq1HPValid
*/
REG_INIT
(
AB8505_REGUSYSCLKREQ1HPVALID1
,
0x03
,
0x07
,
0xff
),
/*
* 0x01, VsmpsCSysClkReq1HPValid
* 0x02, VarmSysClkReq1HPValid
* 0x04, VbbSysClkReq1HPValid
* 0x08, VsmpsMSysClkReq1HPValid
*/
REG_INIT
(
AB8505_REGUSYSCLKREQ1HPVALID2
,
0x03
,
0x08
,
0x0f
),
/*
* 0x01, VsmpsAHwHPReq1Valid
* 0x02, VsmpsBHwHPReq1Valid
* 0x04, VsafeHwHPReq1Valid
* 0x08, VanaHwHPReq1Valid
* 0x10, VpllHwHPReq1Valid
* 0x20, Vaux1HwHPReq1Valid
* 0x40, Vaux2HwHPReq1Valid
* 0x80, Vaux3HwHPReq1Valid
*/
REG_INIT
(
AB8505_REGUHWHPREQ1VALID1
,
0x03
,
0x09
,
0xff
),
/*
* 0x08, VsmpsMHwHPReq1Valid
*/
REG_INIT
(
AB8505_REGUHWHPREQ1VALID2
,
0x03
,
0x0a
,
0x08
),
/*
* 0x01, VsmpsAHwHPReq2Valid
* 0x02, VsmpsBHwHPReq2Valid
* 0x04, VsafeHwHPReq2Valid
* 0x08, VanaHwHPReq2Valid
* 0x10, VpllHwHPReq2Valid
* 0x20, Vaux1HwHPReq2Valid
* 0x40, Vaux2HwHPReq2Valid
* 0x80, Vaux3HwHPReq2Valid
*/
REG_INIT
(
AB8505_REGUHWHPREQ2VALID1
,
0x03
,
0x0b
,
0xff
),
/*
* 0x08, VsmpsMHwHPReq2Valid
*/
REG_INIT
(
AB8505_REGUHWHPREQ2VALID2
,
0x03
,
0x0c
,
0x08
),
/*
* 0x01, VsmpsCSwHPReqValid
* 0x02, VarmSwHPReqValid
* 0x04, VsmpsASwHPReqValid
* 0x08, VsmpsBSwHPReqValid
* 0x10, VsafeSwHPReqValid
* 0x20, VanaSwHPReqValid
* 0x40, VpllSwHPReqValid
* 0x80, Vaux1SwHPReqValid
*/
REG_INIT
(
AB8505_REGUSWHPREQVALID1
,
0x03
,
0x0d
,
0xff
),
/*
* 0x01, Vaux2SwHPReqValid
* 0x02, Vaux3SwHPReqValid
* 0x20, VsmpsMSwHPReqValid
*/
REG_INIT
(
AB8505_REGUSWHPREQVALID2
,
0x03
,
0x0e
,
0x23
),
/*
* 0x02, SysClkReq2Valid1
* 0x04, SysClkReq3Valid1
* 0x08, SysClkReq4Valid1
*/
REG_INIT
(
AB8505_REGUSYSCLKREQVALID1
,
0x03
,
0x0f
,
0x0e
),
/*
* 0x02, SysClkReq2Valid2
* 0x04, SysClkReq3Valid2
* 0x08, SysClkReq4Valid2
*/
REG_INIT
(
AB8505_REGUSYSCLKREQVALID2
,
0x03
,
0x10
,
0x0e
),
/*
* 0x01, Vaux4SwHPReqValid
* 0x02, Vaux4HwHPReq2Valid
* 0x04, Vaux4HwHPReq1Valid
* 0x08, Vaux4SysClkReq1HPValid
*/
REG_INIT
(
AB8505_REGUVAUX4REQVALID
,
0x03
,
0x11
,
0x0f
),
/*
* 0x02, VadcEna
* 0x04, VintCore12Ena
* 0x38, VintCore12Sel
* 0x40, VintCore12LP
* 0x80, VadcLP
*/
REG_INIT
(
AB8505_REGUMISC1
,
0x03
,
0x80
,
0xfe
),
/*
* 0x02, VaudioEna
* 0x04, VdmicEna
* 0x08, Vamic1Ena
* 0x10, Vamic2Ena
*/
REG_INIT
(
AB8505_VAUDIOSUPPLY
,
0x03
,
0x83
,
0x1e
),
/*
* 0x01, Vamic1_dzout
* 0x02, Vamic2_dzout
*/
REG_INIT
(
AB8505_REGUCTRL1VAMIC
,
0x03
,
0x84
,
0x03
),
/*
* 0x03, VsmpsARegu
* 0x0c, VsmpsASelCtrl
* 0x10, VsmpsAAutoMode
* 0x20, VsmpsAPWMMode
*/
REG_INIT
(
AB8505_VSMPSAREGU
,
0x04
,
0x03
,
0x3f
),
/*
* 0x03, VsmpsBRegu
* 0x0c, VsmpsBSelCtrl
* 0x10, VsmpsBAutoMode
* 0x20, VsmpsBPWMMode
*/
REG_INIT
(
AB8505_VSMPSBREGU
,
0x04
,
0x04
,
0x3f
),
/*
* 0x03, VsafeRegu
* 0x0c, VsafeSelCtrl
* 0x10, VsafeAutoMode
* 0x20, VsafePWMMode
*/
REG_INIT
(
AB8505_VSAFEREGU
,
0x04
,
0x05
,
0x3f
),
/*
* 0x03, VpllRegu (NOTE! PRCMU register bits)
* 0x0c, VanaRegu
*/
REG_INIT
(
AB8505_VPLLVANAREGU
,
0x04
,
0x06
,
0x0f
),
/*
* 0x03, VextSupply1Regu
* 0x0c, VextSupply2Regu
* 0x30, VextSupply3Regu
* 0x40, ExtSupply2Bypass
* 0x80, ExtSupply3Bypass
*/
REG_INIT
(
AB8505_EXTSUPPLYREGU
,
0x04
,
0x08
,
0xff
),
/*
* 0x03, Vaux1Regu
* 0x0c, Vaux2Regu
*/
REG_INIT
(
AB8505_VAUX12REGU
,
0x04
,
0x09
,
0x0f
),
/*
* 0x0f, Vaux3Regu
*/
REG_INIT
(
AB8505_VRF1VAUX3REGU
,
0x04
,
0x0a
,
0x0f
),
/*
* 0x3f, VsmpsASel1
*/
REG_INIT
(
AB8505_VSMPSASEL1
,
0x04
,
0x13
,
0x3f
),
/*
* 0x3f, VsmpsASel2
*/
REG_INIT
(
AB8505_VSMPSASEL2
,
0x04
,
0x14
,
0x3f
),
/*
* 0x3f, VsmpsASel3
*/
REG_INIT
(
AB8505_VSMPSASEL3
,
0x04
,
0x15
,
0x3f
),
/*
* 0x3f, VsmpsBSel1
*/
REG_INIT
(
AB8505_VSMPSBSEL1
,
0x04
,
0x17
,
0x3f
),
/*
* 0x3f, VsmpsBSel2
*/
REG_INIT
(
AB8505_VSMPSBSEL2
,
0x04
,
0x18
,
0x3f
),
/*
* 0x3f, VsmpsBSel3
*/
REG_INIT
(
AB8505_VSMPSBSEL3
,
0x04
,
0x19
,
0x3f
),
/*
* 0x7f, VsafeSel1
*/
REG_INIT
(
AB8505_VSAFESEL1
,
0x04
,
0x1b
,
0x7f
),
/*
* 0x3f, VsafeSel2
*/
REG_INIT
(
AB8505_VSAFESEL2
,
0x04
,
0x1c
,
0x7f
),
/*
* 0x3f, VsafeSel3
*/
REG_INIT
(
AB8505_VSAFESEL3
,
0x04
,
0x1d
,
0x7f
),
/*
* 0x0f, Vaux1Sel
*/
REG_INIT
(
AB8505_VAUX1SEL
,
0x04
,
0x1f
,
0x0f
),
/*
* 0x0f, Vaux2Sel
*/
REG_INIT
(
AB8505_VAUX2SEL
,
0x04
,
0x20
,
0x0f
),
/*
* 0x07, Vaux3Sel
* 0x30, VRF1Sel
*/
REG_INIT
(
AB8505_VRF1VAUX3SEL
,
0x04
,
0x21
,
0x37
),
/*
* 0x03, Vaux4RequestCtrl
*/
REG_INIT
(
AB8505_VAUX4REQCTRL
,
0x04
,
0x2d
,
0x03
),
/*
* 0x03, Vaux4Regu
*/
REG_INIT
(
AB8505_VAUX4REGU
,
0x04
,
0x2e
,
0x03
),
/*
* 0x0f, Vaux4Sel
*/
REG_INIT
(
AB8505_VAUX4SEL
,
0x04
,
0x2f
,
0x0f
),
/*
* 0x04, Vaux1Disch
* 0x08, Vaux2Disch
* 0x10, Vaux3Disch
* 0x20, Vintcore12Disch
* 0x40, VTVoutDisch
* 0x80, VaudioDisch
*/
REG_INIT
(
AB8505_REGUCTRLDISCH
,
0x04
,
0x43
,
0xfc
),
/*
* 0x02, VanaDisch
* 0x04, VdmicPullDownEna
* 0x10, VdmicDisch
*/
REG_INIT
(
AB8505_REGUCTRLDISCH2
,
0x04
,
0x44
,
0x16
),
/*
* 0x01, Vaux4Disch
*/
REG_INIT
(
AB8505_REGUCTRLDISCH3
,
0x04
,
0x48
,
0x01
),
/*
* 0x07, Vaux5Sel
* 0x08, Vaux5LP
* 0x10, Vaux5Ena
* 0x20, Vaux5Disch
* 0x40, Vaux5DisSfst
* 0x80, Vaux5DisPulld
*/
REG_INIT
(
AB8505_CTRLVAUX5
,
0x01
,
0x55
,
0xff
),
/*
* 0x07, Vaux6Sel
* 0x08, Vaux6LP
* 0x10, Vaux6Ena
* 0x80, Vaux6DisPulld
*/
REG_INIT
(
AB8505_CTRLVAUX6
,
0x01
,
0x56
,
0x9f
),
};
/* AB9540 register init */
static
struct
ab8500_reg_init
ab9540_reg_init
[]
=
{
/*
* 0x03, VarmRequestCtrl
* 0x0c, VapeRequestCtrl
* 0x30, Vsmps1RequestCtrl
* 0xc0, Vsmps2RequestCtrl
*/
REG_INIT
(
AB9540_REGUREQUESTCTRL1
,
0x03
,
0x03
,
0xff
),
/*
* 0x03, Vsmps3RequestCtrl
* 0x0c, VpllRequestCtrl
* 0x30, VanaRequestCtrl
* 0xc0, VextSupply1RequestCtrl
*/
REG_INIT
(
AB9540_REGUREQUESTCTRL2
,
0x03
,
0x04
,
0xff
),
/*
* 0x03, VextSupply2RequestCtrl
* 0x0c, VextSupply3RequestCtrl
* 0x30, Vaux1RequestCtrl
* 0xc0, Vaux2RequestCtrl
*/
REG_INIT
(
AB9540_REGUREQUESTCTRL3
,
0x03
,
0x05
,
0xff
),
/*
* 0x03, Vaux3RequestCtrl
* 0x04, SwHPReq
*/
REG_INIT
(
AB9540_REGUREQUESTCTRL4
,
0x03
,
0x06
,
0x07
),
/*
* 0x01, Vsmps1SysClkReq1HPValid
* 0x02, Vsmps2SysClkReq1HPValid
* 0x04, Vsmps3SysClkReq1HPValid
* 0x08, VanaSysClkReq1HPValid
* 0x10, VpllSysClkReq1HPValid
* 0x20, Vaux1SysClkReq1HPValid
* 0x40, Vaux2SysClkReq1HPValid
* 0x80, Vaux3SysClkReq1HPValid
*/
REG_INIT
(
AB9540_REGUSYSCLKREQ1HPVALID1
,
0x03
,
0x07
,
0xff
),
/*
* 0x01, VapeSysClkReq1HPValid
* 0x02, VarmSysClkReq1HPValid
* 0x04, VbbSysClkReq1HPValid
* 0x08, VmodSysClkReq1HPValid
* 0x10, VextSupply1SysClkReq1HPValid
* 0x20, VextSupply2SysClkReq1HPValid
* 0x40, VextSupply3SysClkReq1HPValid
*/
REG_INIT
(
AB9540_REGUSYSCLKREQ1HPVALID2
,
0x03
,
0x08
,
0x7f
),
/*
* 0x01, Vsmps1HwHPReq1Valid
* 0x02, Vsmps2HwHPReq1Valid
* 0x04, Vsmps3HwHPReq1Valid
* 0x08, VanaHwHPReq1Valid
* 0x10, VpllHwHPReq1Valid
* 0x20, Vaux1HwHPReq1Valid
* 0x40, Vaux2HwHPReq1Valid
* 0x80, Vaux3HwHPReq1Valid
*/
REG_INIT
(
AB9540_REGUHWHPREQ1VALID1
,
0x03
,
0x09
,
0xff
),
/*
* 0x01, VextSupply1HwHPReq1Valid
* 0x02, VextSupply2HwHPReq1Valid
* 0x04, VextSupply3HwHPReq1Valid
* 0x08, VmodHwHPReq1Valid
*/
REG_INIT
(
AB9540_REGUHWHPREQ1VALID2
,
0x03
,
0x0a
,
0x0f
),
/*
* 0x01, Vsmps1HwHPReq2Valid
* 0x02, Vsmps2HwHPReq2Valid
* 0x03, Vsmps3HwHPReq2Valid
* 0x08, VanaHwHPReq2Valid
* 0x10, VpllHwHPReq2Valid
* 0x20, Vaux1HwHPReq2Valid
* 0x40, Vaux2HwHPReq2Valid
* 0x80, Vaux3HwHPReq2Valid
*/
REG_INIT
(
AB9540_REGUHWHPREQ2VALID1
,
0x03
,
0x0b
,
0xff
),
/*
* 0x01, VextSupply1HwHPReq2Valid
* 0x02, VextSupply2HwHPReq2Valid
* 0x04, VextSupply3HwHPReq2Valid
* 0x08, VmodHwHPReq2Valid
*/
REG_INIT
(
AB9540_REGUHWHPREQ2VALID2
,
0x03
,
0x0c
,
0x0f
),
/*
* 0x01, VapeSwHPReqValid
* 0x02, VarmSwHPReqValid
* 0x04, Vsmps1SwHPReqValid
* 0x08, Vsmps2SwHPReqValid
* 0x10, Vsmps3SwHPReqValid
* 0x20, VanaSwHPReqValid
* 0x40, VpllSwHPReqValid
* 0x80, Vaux1SwHPReqValid
*/
REG_INIT
(
AB9540_REGUSWHPREQVALID1
,
0x03
,
0x0d
,
0xff
),
/*
* 0x01, Vaux2SwHPReqValid
* 0x02, Vaux3SwHPReqValid
* 0x04, VextSupply1SwHPReqValid
* 0x08, VextSupply2SwHPReqValid
* 0x10, VextSupply3SwHPReqValid
* 0x20, VmodSwHPReqValid
*/
REG_INIT
(
AB9540_REGUSWHPREQVALID2
,
0x03
,
0x0e
,
0x3f
),
/*
* 0x02, SysClkReq2Valid1
* ...
* 0x80, SysClkReq8Valid1
*/
REG_INIT
(
AB9540_REGUSYSCLKREQVALID1
,
0x03
,
0x0f
,
0xfe
),
/*
* 0x02, SysClkReq2Valid2
* ...
* 0x80, SysClkReq8Valid2
*/
REG_INIT
(
AB9540_REGUSYSCLKREQVALID2
,
0x03
,
0x10
,
0xfe
),
/*
* 0x01, Vaux4SwHPReqValid
* 0x02, Vaux4HwHPReq2Valid
* 0x04, Vaux4HwHPReq1Valid
* 0x08, Vaux4SysClkReq1HPValid
*/
REG_INIT
(
AB9540_REGUVAUX4REQVALID
,
0x03
,
0x11
,
0x0f
),
/*
* 0x02, VTVoutEna
* 0x04, Vintcore12Ena
* 0x38, Vintcore12Sel
* 0x40, Vintcore12LP
* 0x80, VTVoutLP
*/
REG_INIT
(
AB9540_REGUMISC1
,
0x03
,
0x80
,
0xfe
),
/*
* 0x02, VaudioEna
* 0x04, VdmicEna
* 0x08, Vamic1Ena
* 0x10, Vamic2Ena
*/
REG_INIT
(
AB9540_VAUDIOSUPPLY
,
0x03
,
0x83
,
0x1e
),
/*
* 0x01, Vamic1_dzout
* 0x02, Vamic2_dzout
*/
REG_INIT
(
AB9540_REGUCTRL1VAMIC
,
0x03
,
0x84
,
0x03
),
/*
* 0x03, Vsmps1Regu
* 0x0c, Vsmps1SelCtrl
* 0x10, Vsmps1AutoMode
* 0x20, Vsmps1PWMMode
*/
REG_INIT
(
AB9540_VSMPS1REGU
,
0x04
,
0x03
,
0x3f
),
/*
* 0x03, Vsmps2Regu
* 0x0c, Vsmps2SelCtrl
* 0x10, Vsmps2AutoMode
* 0x20, Vsmps2PWMMode
*/
REG_INIT
(
AB9540_VSMPS2REGU
,
0x04
,
0x04
,
0x3f
),
/*
* 0x03, Vsmps3Regu
* 0x0c, Vsmps3SelCtrl
* NOTE! PRCMU register
*/
REG_INIT
(
AB9540_VSMPS3REGU
,
0x04
,
0x05
,
0x0f
),
/*
* 0x03, VpllRegu
* 0x0c, VanaRegu
*/
REG_INIT
(
AB9540_VPLLVANAREGU
,
0x04
,
0x06
,
0x0f
),
/*
* 0x03, VextSupply1Regu
* 0x0c, VextSupply2Regu
* 0x30, VextSupply3Regu
* 0x40, ExtSupply2Bypass
* 0x80, ExtSupply3Bypass
*/
REG_INIT
(
AB9540_EXTSUPPLYREGU
,
0x04
,
0x08
,
0xff
),
/*
* 0x03, Vaux1Regu
* 0x0c, Vaux2Regu
*/
REG_INIT
(
AB9540_VAUX12REGU
,
0x04
,
0x09
,
0x0f
),
/*
* 0x0c, Vrf1Regu
* 0x03, Vaux3Regu
*/
REG_INIT
(
AB9540_VRF1VAUX3REGU
,
0x04
,
0x0a
,
0x0f
),
/*
* 0x3f, Vsmps1Sel1
*/
REG_INIT
(
AB9540_VSMPS1SEL1
,
0x04
,
0x13
,
0x3f
),
/*
* 0x3f, Vsmps1Sel2
*/
REG_INIT
(
AB9540_VSMPS1SEL2
,
0x04
,
0x14
,
0x3f
),
/*
* 0x3f, Vsmps1Sel3
*/
REG_INIT
(
AB9540_VSMPS1SEL3
,
0x04
,
0x15
,
0x3f
),
/*
* 0x3f, Vsmps2Sel1
*/
REG_INIT
(
AB9540_VSMPS2SEL1
,
0x04
,
0x17
,
0x3f
),
/*
* 0x3f, Vsmps2Sel2
*/
REG_INIT
(
AB9540_VSMPS2SEL2
,
0x04
,
0x18
,
0x3f
),
/*
* 0x3f, Vsmps2Sel3
*/
REG_INIT
(
AB9540_VSMPS2SEL3
,
0x04
,
0x19
,
0x3f
),
/*
* 0x7f, Vsmps3Sel1
* NOTE! PRCMU register
*/
REG_INIT
(
AB9540_VSMPS3SEL1
,
0x04
,
0x1b
,
0x7f
),
/*
* 0x7f, Vsmps3Sel2
* NOTE! PRCMU register
*/
REG_INIT
(
AB9540_VSMPS3SEL2
,
0x04
,
0x1c
,
0x7f
),
/*
* 0x0f, Vaux1Sel
*/
REG_INIT
(
AB9540_VAUX1SEL
,
0x04
,
0x1f
,
0x0f
),
/*
* 0x0f, Vaux2Sel
*/
REG_INIT
(
AB9540_VAUX2SEL
,
0x04
,
0x20
,
0x0f
),
/*
* 0x07, Vaux3Sel
* 0x30, Vrf1Sel
*/
REG_INIT
(
AB9540_VRF1VAUX3SEL
,
0x04
,
0x21
,
0x37
),
/*
* 0x01, VextSupply12LP
*/
REG_INIT
(
AB9540_REGUCTRL2SPARE
,
0x04
,
0x22
,
0x01
),
/*
* 0x03, Vaux4RequestCtrl
*/
REG_INIT
(
AB9540_VAUX4REQCTRL
,
0x04
,
0x2d
,
0x03
),
/*
* 0x03, Vaux4Regu
*/
REG_INIT
(
AB9540_VAUX4REGU
,
0x04
,
0x2e
,
0x03
),
/*
* 0x08, Vaux4Sel
*/
REG_INIT
(
AB9540_VAUX4SEL
,
0x04
,
0x2f
,
0x0f
),
/*
* 0x01, VpllDisch
* 0x02, Vrf1Disch
* 0x04, Vaux1Disch
* 0x08, Vaux2Disch
* 0x10, Vaux3Disch
* 0x20, Vintcore12Disch
* 0x40, VTVoutDisch
* 0x80, VaudioDisch
*/
REG_INIT
(
AB9540_REGUCTRLDISCH
,
0x04
,
0x43
,
0xff
),
/*
* 0x01, VsimDisch
* 0x02, VanaDisch
* 0x04, VdmicPullDownEna
* 0x08, VpllPullDownEna
* 0x10, VdmicDisch
*/
REG_INIT
(
AB9540_REGUCTRLDISCH2
,
0x04
,
0x44
,
0x1f
),
/*
* 0x01, Vaux4Disch
*/
REG_INIT
(
AB9540_REGUCTRLDISCH3
,
0x04
,
0x48
,
0x01
),
};
/* AB8540 register init */
static
struct
ab8500_reg_init
ab8540_reg_init
[]
=
{
/*
* 0x01, VSimSycClkReq1Valid
* 0x02, VSimSycClkReq2Valid
* 0x04, VSimSycClkReq3Valid
* 0x08, VSimSycClkReq4Valid
* 0x10, VSimSycClkReq5Valid
* 0x20, VSimSycClkReq6Valid
* 0x40, VSimSycClkReq7Valid
* 0x80, VSimSycClkReq8Valid
*/
REG_INIT
(
AB8540_VSIMSYSCLKCTRL
,
0x02
,
0x33
,
0xff
),
/*
* 0x03, VarmRequestCtrl
* 0x0c, VapeRequestCtrl
* 0x30, Vsmps1RequestCtrl
* 0xc0, Vsmps2RequestCtrl
*/
REG_INIT
(
AB8540_REGUREQUESTCTRL1
,
0x03
,
0x03
,
0xff
),
/*
* 0x03, Vsmps3RequestCtrl
* 0x0c, VpllRequestCtrl
* 0x30, VanaRequestCtrl
* 0xc0, VextSupply1RequestCtrl
*/
REG_INIT
(
AB8540_REGUREQUESTCTRL2
,
0x03
,
0x04
,
0xff
),
/*
* 0x03, VextSupply2RequestCtrl
* 0x0c, VextSupply3RequestCtrl
* 0x30, Vaux1RequestCtrl
* 0xc0, Vaux2RequestCtrl
*/
REG_INIT
(
AB8540_REGUREQUESTCTRL3
,
0x03
,
0x05
,
0xff
),
/*
* 0x03, Vaux3RequestCtrl
* 0x04, SwHPReq
*/
REG_INIT
(
AB8540_REGUREQUESTCTRL4
,
0x03
,
0x06
,
0x07
),
/*
* 0x01, Vsmps1SysClkReq1HPValid
* 0x02, Vsmps2SysClkReq1HPValid
* 0x04, Vsmps3SysClkReq1HPValid
* 0x08, VanaSysClkReq1HPValid
* 0x10, VpllSysClkReq1HPValid
* 0x20, Vaux1SysClkReq1HPValid
* 0x40, Vaux2SysClkReq1HPValid
* 0x80, Vaux3SysClkReq1HPValid
*/
REG_INIT
(
AB8540_REGUSYSCLKREQ1HPVALID1
,
0x03
,
0x07
,
0xff
),
/*
* 0x01, VapeSysClkReq1HPValid
* 0x02, VarmSysClkReq1HPValid
* 0x04, VbbSysClkReq1HPValid
* 0x10, VextSupply1SysClkReq1HPValid
* 0x20, VextSupply2SysClkReq1HPValid
* 0x40, VextSupply3SysClkReq1HPValid
*/
REG_INIT
(
AB85
00_REGUSYSCLKREQ1HPVALID2
,
0x03
,
0x08
,
0x70
),
REG_INIT
(
AB85
40_REGUSYSCLKREQ1HPVALID2
,
0x03
,
0x08
,
0x77
),
/*
* 0x01, Vsmps1HwHPReq1Valid
* 0x02, Vsmps2HwHPReq1Valid
* 0x04, Vsmps3HwHPReq1Valid
* 0x08, VanaHwHPReq1Valid
* 0x10, VpllHwHPReq1Valid
* 0x20, Vaux1HwHPReq1Valid
* 0x40, Vaux2HwHPReq1Valid
* 0x80, Vaux3HwHPReq1Valid
*/
REG_INIT
(
AB85
00_REGUHWHPREQ1VALID1
,
0x03
,
0x09
,
0xe8
),
REG_INIT
(
AB85
40_REGUHWHPREQ1VALID1
,
0x03
,
0x09
,
0xff
),
/*
* 0x01, VextSupply1HwHPReq1Valid
* 0x02, VextSupply2HwHPReq1Valid
* 0x04, VextSupply3HwHPReq1Valid
*/
REG_INIT
(
AB85
0
0_REGUHWHPREQ1VALID2
,
0x03
,
0x0a
,
0x07
),
REG_INIT
(
AB85
4
0_REGUHWHPREQ1VALID2
,
0x03
,
0x0a
,
0x07
),
/*
* 0x01, Vsmps1HwHPReq2Valid
* 0x02, Vsmps2HwHPReq2Valid
* 0x03, Vsmps3HwHPReq2Valid
* 0x08, VanaHwHPReq2Valid
* 0x10, VpllHwHPReq2Valid
* 0x20, Vaux1HwHPReq2Valid
* 0x40, Vaux2HwHPReq2Valid
* 0x80, Vaux3HwHPReq2Valid
*/
REG_INIT
(
AB85
00_REGUHWHPREQ2VALID1
,
0x03
,
0x0b
,
0xe8
),
REG_INIT
(
AB85
40_REGUHWHPREQ2VALID1
,
0x03
,
0x0b
,
0xff
),
/*
* 0x01, VextSupply1HwHPReq2Valid
* 0x02, VextSupply2HwHPReq2Valid
* 0x04, VextSupply3HwHPReq2Valid
*/
REG_INIT
(
AB85
0
0_REGUHWHPREQ2VALID2
,
0x03
,
0x0c
,
0x07
),
REG_INIT
(
AB85
4
0_REGUHWHPREQ2VALID2
,
0x03
,
0x0c
,
0x07
),
/*
* 0x01, VapeSwHPReqValid
* 0x02, VarmSwHPReqValid
* 0x04, Vsmps1SwHPReqValid
* 0x08, Vsmps2SwHPReqValid
* 0x10, Vsmps3SwHPReqValid
* 0x20, VanaSwHPReqValid
* 0x40, VpllSwHPReqValid
* 0x80, Vaux1SwHPReqValid
*/
REG_INIT
(
AB85
00_REGUSWHPREQVALID1
,
0x03
,
0x0d
,
0xa0
),
REG_INIT
(
AB85
40_REGUSWHPREQVALID1
,
0x03
,
0x0d
,
0xff
),
/*
* 0x01, Vaux2SwHPReqValid
* 0x02, Vaux3SwHPReqValid
...
...
@@ -544,19 +2626,54 @@ static struct ab8500_reg_init ab8500_reg_init[] = {
* 0x08, VextSupply2SwHPReqValid
* 0x10, VextSupply3SwHPReqValid
*/
REG_INIT
(
AB85
0
0_REGUSWHPREQVALID2
,
0x03
,
0x0e
,
0x1f
),
REG_INIT
(
AB85
4
0_REGUSWHPREQVALID2
,
0x03
,
0x0e
,
0x1f
),
/*
* 0x02, SysClkReq2Valid1
* ...
* 0x80, SysClkReq8Valid1
*/
REG_INIT
(
AB85
00_REGUSYSCLKREQVALID1
,
0x03
,
0x0f
,
0xfe
),
REG_INIT
(
AB85
40_REGUSYSCLKREQVALID1
,
0x03
,
0x0f
,
0xff
),
/*
* 0x02, SysClkReq2Valid2
* ...
* 0x80, SysClkReq8Valid2
*/
REG_INIT
(
AB8500_REGUSYSCLKREQVALID2
,
0x03
,
0x10
,
0xfe
),
REG_INIT
(
AB8540_REGUSYSCLKREQVALID2
,
0x03
,
0x10
,
0xff
),
/*
* 0x01, Vaux4SwHPReqValid
* 0x02, Vaux4HwHPReq2Valid
* 0x04, Vaux4HwHPReq1Valid
* 0x08, Vaux4SysClkReq1HPValid
*/
REG_INIT
(
AB8540_REGUVAUX4REQVALID
,
0x03
,
0x11
,
0x0f
),
/*
* 0x01, Vaux5SwHPReqValid
* 0x02, Vaux5HwHPReq2Valid
* 0x04, Vaux5HwHPReq1Valid
* 0x08, Vaux5SysClkReq1HPValid
*/
REG_INIT
(
AB8540_REGUVAUX5REQVALID
,
0x03
,
0x12
,
0x0f
),
/*
* 0x01, Vaux6SwHPReqValid
* 0x02, Vaux6HwHPReq2Valid
* 0x04, Vaux6HwHPReq1Valid
* 0x08, Vaux6SysClkReq1HPValid
*/
REG_INIT
(
AB8540_REGUVAUX6REQVALID
,
0x03
,
0x13
,
0x0f
),
/*
* 0x01, VclkbSwHPReqValid
* 0x02, VclkbHwHPReq2Valid
* 0x04, VclkbHwHPReq1Valid
* 0x08, VclkbSysClkReq1HPValid
*/
REG_INIT
(
AB8540_REGUVCLKBREQVALID
,
0x03
,
0x14
,
0x0f
),
/*
* 0x01, Vrf1SwHPReqValid
* 0x02, Vrf1HwHPReq2Valid
* 0x04, Vrf1HwHPReq1Valid
* 0x08, Vrf1SysClkReq1HPValid
*/
REG_INIT
(
AB8540_REGUVRF1REQVALID
,
0x03
,
0x15
,
0x0f
),
/*
* 0x02, VTVoutEna
* 0x04, Vintcore12Ena
...
...
@@ -564,29 +2681,62 @@ static struct ab8500_reg_init ab8500_reg_init[] = {
* 0x40, Vintcore12LP
* 0x80, VTVoutLP
*/
REG_INIT
(
AB85
0
0_REGUMISC1
,
0x03
,
0x80
,
0xfe
),
REG_INIT
(
AB85
4
0_REGUMISC1
,
0x03
,
0x80
,
0xfe
),
/*
* 0x02, VaudioEna
* 0x04, VdmicEna
* 0x08, Vamic1Ena
* 0x10, Vamic2Ena
* 0x20, Vamic12LP
* 0xC0, VdmicSel
*/
REG_INIT
(
AB85
00_VAUDIOSUPPLY
,
0x03
,
0x83
,
0x1
e
),
REG_INIT
(
AB85
40_VAUDIOSUPPLY
,
0x03
,
0x83
,
0xf
e
),
/*
* 0x01, Vamic1_dzout
* 0x02, Vamic2_dzout
*/
REG_INIT
(
AB85
0
0_REGUCTRL1VAMIC
,
0x03
,
0x84
,
0x03
),
REG_INIT
(
AB85
4
0_REGUCTRL1VAMIC
,
0x03
,
0x84
,
0x03
),
/*
* 0x0c, VanaRegu
* 0x03, VpllRegu
* 0x07, VHSICSel
* 0x08, VHSICOffState
* 0x10, VHSIEna
* 0x20, VHSICLP
*/
REG_INIT
(
AB85
00_VPLLVANAREGU
,
0x04
,
0x06
,
0x0
f
),
REG_INIT
(
AB85
40_VHSIC
,
0x03
,
0x87
,
0x3
f
),
/*
* 0x01, VrefDDREna
* 0x02, VrefDDRSleepMode
* 0x07, VSDIOSel
* 0x08, VSDIOOffState
* 0x10, VSDIOEna
* 0x20, VSDIOLP
*/
REG_INIT
(
AB8500_VREFDDR
,
0x04
,
0x07
,
0x03
),
REG_INIT
(
AB8540_VSDIO
,
0x03
,
0x88
,
0x3f
),
/*
* 0x03, Vsmps1Regu
* 0x0c, Vsmps1SelCtrl
* 0x10, Vsmps1AutoMode
* 0x20, Vsmps1PWMMode
*/
REG_INIT
(
AB8540_VSMPS1REGU
,
0x04
,
0x03
,
0x3f
),
/*
* 0x03, Vsmps2Regu
* 0x0c, Vsmps2SelCtrl
* 0x10, Vsmps2AutoMode
* 0x20, Vsmps2PWMMode
*/
REG_INIT
(
AB8540_VSMPS2REGU
,
0x04
,
0x04
,
0x3f
),
/*
* 0x03, Vsmps3Regu
* 0x0c, Vsmps3SelCtrl
* 0x10, Vsmps3AutoMode
* 0x20, Vsmps3PWMMode
* NOTE! PRCMU register
*/
REG_INIT
(
AB8540_VSMPS3REGU
,
0x04
,
0x05
,
0x0f
),
/*
* 0x03, VpllRegu
* 0x0c, VanaRegu
*/
REG_INIT
(
AB8540_VPLLVANAREGU
,
0x04
,
0x06
,
0x0f
),
/*
* 0x03, VextSupply1Regu
* 0x0c, VextSupply2Regu
...
...
@@ -594,37 +2744,128 @@ static struct ab8500_reg_init ab8500_reg_init[] = {
* 0x40, ExtSupply2Bypass
* 0x80, ExtSupply3Bypass
*/
REG_INIT
(
AB85
0
0_EXTSUPPLYREGU
,
0x04
,
0x08
,
0xff
),
REG_INIT
(
AB85
4
0_EXTSUPPLYREGU
,
0x04
,
0x08
,
0xff
),
/*
* 0x03, Vaux1Regu
* 0x0c, Vaux2Regu
*/
REG_INIT
(
AB85
0
0_VAUX12REGU
,
0x04
,
0x09
,
0x0f
),
REG_INIT
(
AB85
4
0_VAUX12REGU
,
0x04
,
0x09
,
0x0f
),
/*
* 0x0c, VRF1Regu
* 0x03, Vaux3Regu
*/
REG_INIT
(
AB85
00_VRF1VAUX3REGU
,
0x04
,
0x0a
,
0x03
),
REG_INIT
(
AB85
40_VRF1VAUX3REGU
,
0x04
,
0x0a
,
0x0f
),
/*
* 0x3f, Vsmps1Sel1
*/
REG_INIT
(
AB8500_VSMPS1SEL1
,
0x04
,
0x13
,
0x3f
),
REG_INIT
(
AB8540_VSMPS1SEL1
,
0x04
,
0x13
,
0x3f
),
/*
* 0x3f, Vsmps1Sel2
*/
REG_INIT
(
AB8540_VSMPS1SEL2
,
0x04
,
0x14
,
0x3f
),
/*
* 0x3f, Vsmps1Sel3
*/
REG_INIT
(
AB8540_VSMPS1SEL3
,
0x04
,
0x15
,
0x3f
),
/*
* 0x3f, Vsmps2Sel1
*/
REG_INIT
(
AB8540_VSMPS2SEL1
,
0x04
,
0x17
,
0x3f
),
/*
* 0x3f, Vsmps2Sel2
*/
REG_INIT
(
AB8540_VSMPS2SEL2
,
0x04
,
0x18
,
0x3f
),
/*
* 0x3f, Vsmps2Sel3
*/
REG_INIT
(
AB8540_VSMPS2SEL3
,
0x04
,
0x19
,
0x3f
),
/*
* 0x7f, Vsmps3Sel1
* NOTE! PRCMU register
*/
REG_INIT
(
AB8540_VSMPS3SEL1
,
0x04
,
0x1b
,
0x7f
),
/*
* 0x7f, Vsmps3Sel2
* NOTE! PRCMU register
*/
REG_INIT
(
AB8540_VSMPS3SEL2
,
0x04
,
0x1c
,
0x7f
),
/*
* 0x0f, Vaux1Sel
*/
REG_INIT
(
AB85
0
0_VAUX1SEL
,
0x04
,
0x1f
,
0x0f
),
REG_INIT
(
AB85
4
0_VAUX1SEL
,
0x04
,
0x1f
,
0x0f
),
/*
* 0x0f, Vaux2Sel
*/
REG_INIT
(
AB85
0
0_VAUX2SEL
,
0x04
,
0x20
,
0x0f
),
REG_INIT
(
AB85
4
0_VAUX2SEL
,
0x04
,
0x20
,
0x0f
),
/*
* 0x07, Vaux3Sel
* 0x70, Vrf1Sel
*/
REG_INIT
(
AB85
00_VRF1VAUX3SEL
,
0x04
,
0x21
,
0x0
7
),
REG_INIT
(
AB85
40_VRF1VAUX3SEL
,
0x04
,
0x21
,
0x7
7
),
/*
* 0x01, VextSupply12LP
*/
REG_INIT
(
AB8500_REGUCTRL2SPARE
,
0x04
,
0x22
,
0x01
),
REG_INIT
(
AB8540_REGUCTRL2SPARE
,
0x04
,
0x22
,
0x01
),
/*
* 0x07, Vanasel
* 0x30, Vpllsel
*/
REG_INIT
(
AB8540_VANAVPLLSEL
,
0x04
,
0x29
,
0x37
),
/*
* 0x03, Vaux4RequestCtrl
*/
REG_INIT
(
AB8540_VAUX4REQCTRL
,
0x04
,
0x2d
,
0x03
),
/*
* 0x03, Vaux4Regu
*/
REG_INIT
(
AB8540_VAUX4REGU
,
0x04
,
0x2e
,
0x03
),
/*
* 0x0f, Vaux4Sel
*/
REG_INIT
(
AB8540_VAUX4SEL
,
0x04
,
0x2f
,
0x0f
),
/*
* 0x03, Vaux5RequestCtrl
*/
REG_INIT
(
AB8540_VAUX5REQCTRL
,
0x04
,
0x31
,
0x03
),
/*
* 0x03, Vaux5Regu
*/
REG_INIT
(
AB8540_VAUX5REGU
,
0x04
,
0x32
,
0x03
),
/*
* 0x3f, Vaux5Sel
*/
REG_INIT
(
AB8540_VAUX5SEL
,
0x04
,
0x33
,
0x3f
),
/*
* 0x03, Vaux6RequestCtrl
*/
REG_INIT
(
AB8540_VAUX6REQCTRL
,
0x04
,
0x34
,
0x03
),
/*
* 0x03, Vaux6Regu
*/
REG_INIT
(
AB8540_VAUX6REGU
,
0x04
,
0x35
,
0x03
),
/*
* 0x3f, Vaux6Sel
*/
REG_INIT
(
AB8540_VAUX6SEL
,
0x04
,
0x36
,
0x3f
),
/*
* 0x03, VCLKBRequestCtrl
*/
REG_INIT
(
AB8540_VCLKBREQCTRL
,
0x04
,
0x37
,
0x03
),
/*
* 0x03, VCLKBRegu
*/
REG_INIT
(
AB8540_VCLKBREGU
,
0x04
,
0x38
,
0x03
),
/*
* 0x07, VCLKBSel
*/
REG_INIT
(
AB8540_VCLKBSEL
,
0x04
,
0x39
,
0x07
),
/*
* 0x03, Vrf1RequestCtrl
*/
REG_INIT
(
AB8540_VRF1REQCTRL
,
0x04
,
0x3a
,
0x03
),
/*
* 0x01, VpllDisch
* 0x02, Vrf1Disch
* 0x04, Vaux1Disch
* 0x08, Vaux2Disch
* 0x10, Vaux3Disch
...
...
@@ -632,61 +2873,170 @@ static struct ab8500_reg_init ab8500_reg_init[] = {
* 0x40, VTVoutDisch
* 0x80, VaudioDisch
*/
REG_INIT
(
AB85
00_REGUCTRLDISCH
,
0x04
,
0x43
,
0xfc
),
REG_INIT
(
AB85
40_REGUCTRLDISCH
,
0x04
,
0x43
,
0xff
),
/*
* 0x02, VanaDisch
* 0x04, VdmicPullDownEna
* 0x08, VpllPullDownEna
* 0x10, VdmicDisch
*/
REG_INIT
(
AB8500_REGUCTRLDISCH2
,
0x04
,
0x44
,
0x16
),
REG_INIT
(
AB8540_REGUCTRLDISCH2
,
0x04
,
0x44
,
0x1e
),
/*
* 0x01, Vaux4Disch
*/
REG_INIT
(
AB8540_REGUCTRLDISCH3
,
0x04
,
0x48
,
0x01
),
/*
* 0x01, Vaux5Disch
* 0x02, Vaux6Disch
* 0x04, VCLKBDisch
*/
REG_INIT
(
AB8540_REGUCTRLDISCH4
,
0x04
,
0x49
,
0x07
),
};
static
int
ab8500_regulator_init_registers
(
struct
platform_device
*
pdev
,
int
id
,
int
value
)
static
struct
of_regulator_match
ab8500_regulator_match
[]
=
{
{
.
name
=
"ab8500_ldo_aux1"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_AUX1
,
},
{
.
name
=
"ab8500_ldo_aux2"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_AUX2
,
},
{
.
name
=
"ab8500_ldo_aux3"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_AUX3
,
},
{
.
name
=
"ab8500_ldo_intcore"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_INTCORE
,
},
{
.
name
=
"ab8500_ldo_tvout"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_TVOUT
,
},
{
.
name
=
"ab8500_ldo_audio"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_AUDIO
,
},
{
.
name
=
"ab8500_ldo_anamic1"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_ANAMIC1
,
},
{
.
name
=
"ab8500_ldo_amamic2"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_ANAMIC2
,
},
{
.
name
=
"ab8500_ldo_dmic"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_DMIC
,
},
{
.
name
=
"ab8500_ldo_ana"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_ANA
,
},
};
static
struct
of_regulator_match
ab8505_regulator_match
[]
=
{
{
.
name
=
"ab8500_ldo_aux1"
,
.
driver_data
=
(
void
*
)
AB8505_LDO_AUX1
,
},
{
.
name
=
"ab8500_ldo_aux2"
,
.
driver_data
=
(
void
*
)
AB8505_LDO_AUX2
,
},
{
.
name
=
"ab8500_ldo_aux3"
,
.
driver_data
=
(
void
*
)
AB8505_LDO_AUX3
,
},
{
.
name
=
"ab8500_ldo_aux4"
,
.
driver_data
=
(
void
*
)
AB8505_LDO_AUX4
,
},
{
.
name
=
"ab8500_ldo_aux5"
,
.
driver_data
=
(
void
*
)
AB8505_LDO_AUX5
,
},
{
.
name
=
"ab8500_ldo_aux6"
,
.
driver_data
=
(
void
*
)
AB8505_LDO_AUX6
,
},
{
.
name
=
"ab8500_ldo_intcore"
,
.
driver_data
=
(
void
*
)
AB8505_LDO_INTCORE
,
},
{
.
name
=
"ab8500_ldo_adc"
,
.
driver_data
=
(
void
*
)
AB8505_LDO_ADC
,
},
{
.
name
=
"ab8500_ldo_audio"
,
.
driver_data
=
(
void
*
)
AB8505_LDO_AUDIO
,
},
{
.
name
=
"ab8500_ldo_anamic1"
,
.
driver_data
=
(
void
*
)
AB8505_LDO_ANAMIC1
,
},
{
.
name
=
"ab8500_ldo_amamic2"
,
.
driver_data
=
(
void
*
)
AB8505_LDO_ANAMIC2
,
},
{
.
name
=
"ab8500_ldo_aux8"
,
.
driver_data
=
(
void
*
)
AB8505_LDO_AUX8
,
},
{
.
name
=
"ab8500_ldo_ana"
,
.
driver_data
=
(
void
*
)
AB8505_LDO_ANA
,
},
};
static
struct
of_regulator_match
ab8540_regulator_match
[]
=
{
{
.
name
=
"ab8500_ldo_aux1"
,
.
driver_data
=
(
void
*
)
AB8540_LDO_AUX1
,
},
{
.
name
=
"ab8500_ldo_aux2"
,
.
driver_data
=
(
void
*
)
AB8540_LDO_AUX2
,
},
{
.
name
=
"ab8500_ldo_aux3"
,
.
driver_data
=
(
void
*
)
AB8540_LDO_AUX3
,
},
{
.
name
=
"ab8500_ldo_aux4"
,
.
driver_data
=
(
void
*
)
AB8540_LDO_AUX4
,
},
{
.
name
=
"ab8500_ldo_aux5"
,
.
driver_data
=
(
void
*
)
AB8540_LDO_AUX5
,
},
{
.
name
=
"ab8500_ldo_aux6"
,
.
driver_data
=
(
void
*
)
AB8540_LDO_AUX6
,
},
{
.
name
=
"ab8500_ldo_intcore"
,
.
driver_data
=
(
void
*
)
AB8540_LDO_INTCORE
,
},
{
.
name
=
"ab8500_ldo_tvout"
,
.
driver_data
=
(
void
*
)
AB8540_LDO_TVOUT
,
},
{
.
name
=
"ab8500_ldo_audio"
,
.
driver_data
=
(
void
*
)
AB8540_LDO_AUDIO
,
},
{
.
name
=
"ab8500_ldo_anamic1"
,
.
driver_data
=
(
void
*
)
AB8540_LDO_ANAMIC1
,
},
{
.
name
=
"ab8500_ldo_amamic2"
,
.
driver_data
=
(
void
*
)
AB8540_LDO_ANAMIC2
,
},
{
.
name
=
"ab8500_ldo_dmic"
,
.
driver_data
=
(
void
*
)
AB8540_LDO_DMIC
,
},
{
.
name
=
"ab8500_ldo_ana"
,
.
driver_data
=
(
void
*
)
AB8540_LDO_ANA
,
},
{
.
name
=
"ab8500_ldo_sdio"
,
.
driver_data
=
(
void
*
)
AB8540_LDO_SDIO
,
},
};
static
struct
of_regulator_match
ab9540_regulator_match
[]
=
{
{
.
name
=
"ab8500_ldo_aux1"
,
.
driver_data
=
(
void
*
)
AB9540_LDO_AUX1
,
},
{
.
name
=
"ab8500_ldo_aux2"
,
.
driver_data
=
(
void
*
)
AB9540_LDO_AUX2
,
},
{
.
name
=
"ab8500_ldo_aux3"
,
.
driver_data
=
(
void
*
)
AB9540_LDO_AUX3
,
},
{
.
name
=
"ab8500_ldo_aux4"
,
.
driver_data
=
(
void
*
)
AB9540_LDO_AUX4
,
},
{
.
name
=
"ab8500_ldo_intcore"
,
.
driver_data
=
(
void
*
)
AB9540_LDO_INTCORE
,
},
{
.
name
=
"ab8500_ldo_tvout"
,
.
driver_data
=
(
void
*
)
AB9540_LDO_TVOUT
,
},
{
.
name
=
"ab8500_ldo_audio"
,
.
driver_data
=
(
void
*
)
AB9540_LDO_AUDIO
,
},
{
.
name
=
"ab8500_ldo_anamic1"
,
.
driver_data
=
(
void
*
)
AB9540_LDO_ANAMIC1
,
},
{
.
name
=
"ab8500_ldo_amamic2"
,
.
driver_data
=
(
void
*
)
AB9540_LDO_ANAMIC2
,
},
{
.
name
=
"ab8500_ldo_dmic"
,
.
driver_data
=
(
void
*
)
AB9540_LDO_DMIC
,
},
{
.
name
=
"ab8500_ldo_ana"
,
.
driver_data
=
(
void
*
)
AB9540_LDO_ANA
,
},
};
static
struct
{
struct
ab8500_regulator_info
*
info
;
int
info_size
;
struct
ab8500_reg_init
*
init
;
int
init_size
;
struct
of_regulator_match
*
match
;
int
match_size
;
}
abx500_regulator
;
static
void
abx500_get_regulator_info
(
struct
ab8500
*
ab8500
)
{
if
(
is_ab9540
(
ab8500
))
{
abx500_regulator
.
info
=
ab9540_regulator_info
;
abx500_regulator
.
info_size
=
ARRAY_SIZE
(
ab9540_regulator_info
);
abx500_regulator
.
init
=
ab9540_reg_init
;
abx500_regulator
.
init_size
=
AB9540_NUM_REGULATOR_REGISTERS
;
abx500_regulator
.
match
=
ab9540_regulator_match
;
abx500_regulator
.
match_size
=
ARRAY_SIZE
(
ab9540_regulator_match
);
}
else
if
(
is_ab8505
(
ab8500
))
{
abx500_regulator
.
info
=
ab8505_regulator_info
;
abx500_regulator
.
info_size
=
ARRAY_SIZE
(
ab8505_regulator_info
);
abx500_regulator
.
init
=
ab8505_reg_init
;
abx500_regulator
.
init_size
=
AB8505_NUM_REGULATOR_REGISTERS
;
abx500_regulator
.
match
=
ab8505_regulator_match
;
abx500_regulator
.
match_size
=
ARRAY_SIZE
(
ab8505_regulator_match
);
}
else
if
(
is_ab8540
(
ab8500
))
{
abx500_regulator
.
info
=
ab8540_regulator_info
;
abx500_regulator
.
info_size
=
ARRAY_SIZE
(
ab8540_regulator_info
);
abx500_regulator
.
init
=
ab8540_reg_init
;
abx500_regulator
.
init_size
=
AB8540_NUM_REGULATOR_REGISTERS
;
abx500_regulator
.
match
=
ab8540_regulator_match
;
abx500_regulator
.
match_size
=
ARRAY_SIZE
(
ab8540_regulator_match
);
}
else
{
abx500_regulator
.
info
=
ab8500_regulator_info
;
abx500_regulator
.
info_size
=
ARRAY_SIZE
(
ab8500_regulator_info
);
abx500_regulator
.
init
=
ab8500_reg_init
;
abx500_regulator
.
init_size
=
AB8500_NUM_REGULATOR_REGISTERS
;
abx500_regulator
.
match
=
ab8500_regulator_match
;
abx500_regulator
.
match_size
=
ARRAY_SIZE
(
ab8500_regulator_match
);
}
}
static
int
ab8500_regulator_init_registers
(
struct
platform_device
*
pdev
,
int
id
,
int
mask
,
int
value
)
{
struct
ab8500_reg_init
*
reg_init
=
abx500_regulator
.
init
;
int
err
;
if
(
value
&
~
ab8500_reg_init
[
id
].
mask
)
{
dev_err
(
&
pdev
->
dev
,
"Configuration error: value outside mask.
\n
"
);
return
-
EINVAL
;
}
BUG_ON
(
value
&
~
mask
);
BUG_ON
(
mask
&
~
reg_init
[
id
].
mask
);
/* initialize register */
err
=
abx500_mask_and_set_register_interruptible
(
&
pdev
->
dev
,
ab8500_reg_init
[
id
].
bank
,
ab8500_reg_init
[
id
].
addr
,
ab8500_reg_init
[
id
].
mask
,
value
);
reg_init
[
id
].
bank
,
reg_init
[
id
].
addr
,
mask
,
value
);
if
(
err
<
0
)
{
dev_err
(
&
pdev
->
dev
,
"Failed to initialize 0x%02x, 0x%02x.
\n
"
,
ab8500_
reg_init
[
id
].
bank
,
ab8500_
reg_init
[
id
].
addr
);
reg_init
[
id
].
bank
,
reg_init
[
id
].
addr
);
return
err
;
}
dev_vdbg
(
&
pdev
->
dev
,
"init: 0x%02x, 0x%02x, 0x%02x, 0x%02x
\n
"
,
ab8500_reg_init
[
id
].
bank
,
ab8500_reg_init
[
id
].
addr
,
ab8500_reg_init
[
id
].
mask
,
value
);
" init: 0x%02x, 0x%02x, 0x%02x, 0x%02x
\n
"
,
reg_init
[
id
].
bank
,
reg_init
[
id
].
addr
,
mask
,
value
);
return
0
;
}
static
int
ab8500_regulator_register
(
struct
platform_device
*
pdev
,
struct
regulator_init_data
*
init_data
,
int
id
,
struct
device_node
*
np
)
struct
regulator_init_data
*
init_data
,
int
id
,
struct
device_node
*
np
)
{
struct
ab8500
*
ab8500
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
struct
ab8500_regulator_info
*
info
=
NULL
;
struct
regulator_config
config
=
{
};
int
err
;
/* assign per-regulator data */
info
=
&
ab
8500_regulator_
info
[
id
];
info
=
&
ab
x500_regulator
.
info
[
id
];
info
->
dev
=
&
pdev
->
dev
;
config
.
dev
=
&
pdev
->
dev
;
...
...
@@ -695,7 +3045,7 @@ static int ab8500_regulator_register(struct platform_device *pdev,
config
.
of_node
=
np
;
/* fix for hardware before ab8500v2.0 */
if
(
abx500_get_chip_id
(
info
->
dev
)
<
0x20
)
{
if
(
is_ab8500_1p1_or_earlier
(
ab8500
)
)
{
if
(
info
->
desc
.
id
==
AB8500_LDO_AUX3
)
{
info
->
desc
.
n_voltages
=
ARRAY_SIZE
(
ldo_vauxn_voltages
);
...
...
@@ -712,7 +3062,7 @@ static int ab8500_regulator_register(struct platform_device *pdev,
info
->
desc
.
name
);
/* when we fail, un-register all earlier regulators */
while
(
--
id
>=
0
)
{
info
=
&
ab
8500_regulator_
info
[
id
];
info
=
&
ab
x500_regulator
.
info
[
id
];
regulator_unregister
(
info
->
regulator
);
}
return
err
;
...
...
@@ -721,29 +3071,16 @@ static int ab8500_regulator_register(struct platform_device *pdev,
return
0
;
}
static
struct
of_regulator_match
ab8500_regulator_matches
[]
=
{
{
.
name
=
"ab8500_ldo_aux1"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_AUX1
,
},
{
.
name
=
"ab8500_ldo_aux2"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_AUX2
,
},
{
.
name
=
"ab8500_ldo_aux3"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_AUX3
,
},
{
.
name
=
"ab8500_ldo_intcore"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_INTCORE
,
},
{
.
name
=
"ab8500_ldo_tvout"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_TVOUT
,
},
{
.
name
=
"ab8500_ldo_usb"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_USB
,
},
{
.
name
=
"ab8500_ldo_audio"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_AUDIO
,
},
{
.
name
=
"ab8500_ldo_anamic1"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_ANAMIC1
,
},
{
.
name
=
"ab8500_ldo_amamic2"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_ANAMIC2
,
},
{
.
name
=
"ab8500_ldo_dmic"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_DMIC
,
},
{
.
name
=
"ab8500_ldo_ana"
,
.
driver_data
=
(
void
*
)
AB8500_LDO_ANA
,
},
};
static
int
ab8500_regulator_of_probe
(
struct
platform_device
*
pdev
,
struct
device_node
*
np
)
ab8500_regulator_of_probe
(
struct
platform_device
*
pdev
,
struct
device_node
*
np
)
{
struct
of_regulator_match
*
match
=
abx500_regulator
.
match
;
int
err
,
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
ab8500_regulator_info
)
;
i
++
)
{
for
(
i
=
0
;
i
<
abx500_regulator
.
info_size
;
i
++
)
{
err
=
ab8500_regulator_register
(
pdev
,
ab8500_regulator_matches
[
i
].
init_data
,
i
,
ab8500_regulator_matches
[
i
].
of_node
);
pdev
,
match
[
i
].
init_data
,
i
,
match
[
i
].
of_node
);
if
(
err
)
return
err
;
}
...
...
@@ -754,14 +3091,22 @@ ab8500_regulator_of_probe(struct platform_device *pdev, struct device_node *np)
static
int
ab8500_regulator_probe
(
struct
platform_device
*
pdev
)
{
struct
ab8500
*
ab8500
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
struct
ab8500_platform_data
*
pdata
;
struct
device_node
*
np
=
pdev
->
dev
.
of_node
;
struct
ab8500_platform_data
*
ppdata
;
struct
ab8500_regulator_platform_data
*
pdata
;
int
i
,
err
;
if
(
!
ab8500
)
{
dev_err
(
&
pdev
->
dev
,
"null mfd parent
\n
"
);
return
-
EINVAL
;
}
abx500_get_regulator_info
(
ab8500
);
if
(
np
)
{
err
=
of_regulator_match
(
&
pdev
->
dev
,
np
,
ab8500_regulator_matches
,
ARRAY_SIZE
(
ab8500_regulator_matches
)
);
abx500_regulator
.
match
,
abx500_regulator
.
match_size
);
if
(
err
<
0
)
{
dev_err
(
&
pdev
->
dev
,
"Error parsing regulator init data: %d
\n
"
,
err
);
...
...
@@ -772,46 +3117,61 @@ static int ab8500_regulator_probe(struct platform_device *pdev)
return
err
;
}
if
(
!
ab8500
)
{
dev_err
(
&
pdev
->
dev
,
"null mfd parent
\n
"
);
ppdata
=
dev_get_platdata
(
ab8500
->
dev
);
if
(
!
ppdata
)
{
dev_err
(
&
pdev
->
dev
,
"null parent pdata
\n
"
);
return
-
EINVAL
;
}
pdata
=
dev_get_platdata
(
ab8500
->
dev
);
pdata
=
ppdata
->
regulator
;
if
(
!
pdata
)
{
dev_err
(
&
pdev
->
dev
,
"null pdata
\n
"
);
return
-
EINVAL
;
}
/* make sure the platform data has the correct size */
if
(
pdata
->
num_regulator
!=
ARRAY_SIZE
(
ab8500_regulator_info
)
)
{
if
(
pdata
->
num_regulator
!=
abx500_regulator
.
info_size
)
{
dev_err
(
&
pdev
->
dev
,
"Configuration error: size mismatch.
\n
"
);
return
-
EINVAL
;
}
/* initialize debug (initial state is recorded with this call) */
err
=
ab8500_regulator_debug_init
(
pdev
);
if
(
err
)
return
err
;
/* initialize registers */
for
(
i
=
0
;
i
<
pdata
->
num_reg
ulator_reg
_init
;
i
++
)
{
int
id
,
value
;
for
(
i
=
0
;
i
<
pdata
->
num_reg_init
;
i
++
)
{
int
id
,
mask
,
value
;
id
=
pdata
->
regulator_reg_init
[
i
].
id
;
value
=
pdata
->
regulator_reg_init
[
i
].
value
;
id
=
pdata
->
reg_init
[
i
].
id
;
mask
=
pdata
->
reg_init
[
i
].
mask
;
value
=
pdata
->
reg_init
[
i
].
value
;
/* check for configuration errors */
if
(
id
>=
AB8500_NUM_REGULATOR_REGISTERS
)
{
dev_err
(
&
pdev
->
dev
,
"Configuration error: id outside range.
\n
"
);
return
-
EINVAL
;
}
BUG_ON
(
id
>=
abx500_regulator
.
init_size
);
err
=
ab8500_regulator_init_registers
(
pdev
,
id
,
value
);
err
=
ab8500_regulator_init_registers
(
pdev
,
id
,
mask
,
value
);
if
(
err
<
0
)
return
err
;
}
if
(
!
is_ab8505
(
ab8500
))
{
/* register external regulators (before Vaux1, 2 and 3) */
err
=
ab8500_ext_regulator_init
(
pdev
);
if
(
err
)
return
err
;
}
/* register all regulators */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
ab8500_regulator_info
);
i
++
)
{
err
=
ab8500_regulator_register
(
pdev
,
&
pdata
->
regulator
[
i
],
i
,
NULL
);
if
(
err
<
0
)
for
(
i
=
0
;
i
<
abx500_regulator
.
info_size
;
i
++
)
{
err
=
ab8500_regulator_register
(
pdev
,
&
pdata
->
regulator
[
i
],
i
,
NULL
);
if
(
err
<
0
)
{
if
(
!
is_ab8505
(
ab8500
))
ab8500_ext_regulator_exit
(
pdev
);
return
err
;
}
}
return
0
;
...
...
@@ -819,11 +3179,12 @@ static int ab8500_regulator_probe(struct platform_device *pdev)
static
int
ab8500_regulator_remove
(
struct
platform_device
*
pdev
)
{
int
i
;
int
i
,
err
;
struct
ab8500
*
ab8500
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
ab8500_regulator_info
)
;
i
++
)
{
for
(
i
=
0
;
i
<
abx500_regulator
.
info_size
;
i
++
)
{
struct
ab8500_regulator_info
*
info
=
NULL
;
info
=
&
ab
8500_regulator_
info
[
i
];
info
=
&
ab
x500_regulator
.
info
[
i
];
dev_vdbg
(
rdev_get_dev
(
info
->
regulator
),
"%s-remove
\n
"
,
info
->
desc
.
name
);
...
...
@@ -831,6 +3192,15 @@ static int ab8500_regulator_remove(struct platform_device *pdev)
regulator_unregister
(
info
->
regulator
);
}
/* remove external regulators (after Vaux1, 2 and 3) */
if
(
!
is_ab8505
(
ab8500
))
ab8500_ext_regulator_exit
(
pdev
);
/* remove regulator debug */
err
=
ab8500_regulator_debug_exit
(
pdev
);
if
(
err
)
return
err
;
return
0
;
}
...
...
@@ -863,5 +3233,7 @@ module_exit(ab8500_regulator_exit);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_AUTHOR
(
"Sundar Iyer <sundar.iyer@stericsson.com>"
);
MODULE_AUTHOR
(
"Bengt Jonsson <bengt.g.jonsson@stericsson.com>"
);
MODULE_AUTHOR
(
"Daniel Willerud <daniel.willerud@stericsson.com>"
);
MODULE_DESCRIPTION
(
"Regulator Driver for ST-Ericsson AB8500 Mixed-Sig PMIC"
);
MODULE_ALIAS
(
"platform:ab8500-regulator"
);
drivers/regulator/dbx500-prcmu.h
View file @
c98cac89
...
...
@@ -21,7 +21,6 @@
* @is_enabled: status of the regulator
* @epod_id: id for EPOD (power domain)
* @is_ramret: RAM retention switch for EPOD (power domain)
* @operating_point: operating point (only for vape, to be removed)
*
*/
struct
dbx500_regulator_info
{
...
...
@@ -32,7 +31,6 @@ struct dbx500_regulator_info {
u16
epod_id
;
bool
is_ramret
;
bool
exclude_from_power_state
;
unsigned
int
operating_point
;
};
void
power_state_active_enable
(
void
);
...
...
include/linux/mfd/abx500/ab8500.h
View file @
c98cac89
...
...
@@ -364,8 +364,7 @@ struct ab8500 {
const
int
*
irq_reg_offset
;
};
struct
regulator_reg_init
;
struct
regulator_init_data
;
struct
ab8500_regulator_platform_data
;
struct
ab8500_gpio_platform_data
;
struct
ab8500_codec_platform_data
;
struct
ab8500_sysctrl_platform_data
;
...
...
@@ -375,19 +374,13 @@ struct ab8500_sysctrl_platform_data;
* @irq_base: start of AB8500 IRQs, AB8500_NR_IRQS will be used
* @pm_power_off: Should machine pm power off hook be registered or not
* @init: board-specific initialization after detection of ab8500
* @num_regulator_reg_init: number of regulator init registers
* @regulator_reg_init: regulator init registers
* @num_regulator: number of regulators
* @regulator: machine-specific constraints for regulators
*/
struct
ab8500_platform_data
{
int
irq_base
;
bool
pm_power_off
;
void
(
*
init
)
(
struct
ab8500
*
);
int
num_regulator_reg_init
;
struct
ab8500_regulator_reg_init
*
regulator_reg_init
;
int
num_regulator
;
struct
regulator_init_data
*
regulator
;
struct
ab8500_regulator_platform_data
*
regulator
;
struct
abx500_gpio_platform_data
*
gpio
;
struct
ab8500_codec_platform_data
*
codec
;
struct
ab8500_sysctrl_platform_data
*
sysctrl
;
...
...
include/linux/regulator/ab8500.h
View file @
c98cac89
...
...
@@ -5,11 +5,14 @@
*
* 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
,
...
...
@@ -17,7 +20,6 @@ enum ab8500_regulator_id {
AB8500_LDO_AUX3
,
AB8500_LDO_INTCORE
,
AB8500_LDO_TVOUT
,
AB8500_LDO_USB
,
AB8500_LDO_AUDIO
,
AB8500_LDO_ANAMIC1
,
AB8500_LDO_ANAMIC2
,
...
...
@@ -26,7 +28,28 @@ enum ab8500_regulator_id {
AB8500_NUM_REGULATORS
,
};
/* AB9450 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_USB
,
AB8505_LDO_AUDIO
,
AB8505_LDO_ANAMIC1
,
AB8505_LDO_ANAMIC2
,
AB8505_LDO_AUX8
,
AB8505_LDO_ANA
,
AB8505_SYSCLKREQ_2
,
AB8505_SYSCLKREQ_4
,
AB8505_NUM_REGULATORS
,
};
/* AB9540 regulators */
enum
ab9540_regulator_id
{
AB9540_LDO_AUX1
,
AB9540_LDO_AUX2
,
...
...
@@ -45,16 +68,39 @@ enum ab9540_regulator_id {
AB9540_NUM_REGULATORS
,
};
/* AB8500 and AB9540 register initialization */
/* AB8540 regulators */
enum
ab8540_regulator_id
{
AB8540_LDO_AUX1
,
AB8540_LDO_AUX2
,
AB8540_LDO_AUX3
,
AB8540_LDO_AUX4
,
AB8540_LDO_AUX5
,
AB8540_LDO_AUX6
,
AB8540_LDO_INTCORE
,
AB8540_LDO_TVOUT
,
AB8540_LDO_AUDIO
,
AB8540_LDO_ANAMIC1
,
AB8540_LDO_ANAMIC2
,
AB8540_LDO_DMIC
,
AB8540_LDO_ANA
,
AB8540_LDO_SDIO
,
AB8540_SYSCLKREQ_2
,
AB8540_SYSCLKREQ_4
,
AB8540_NUM_REGULATORS
,
};
/* AB8500, AB8505, and AB9540 register initialization */
struct
ab8500_regulator_reg_init
{
int
id
;
u8
mask
;
u8
value
;
};
#define INIT_REGULATOR_REGISTER(_id, _value) \
{ \
.id = _id, \
.value = _value, \
#define INIT_REGULATOR_REGISTER(_id, _mask, _value) \
{ \
.id = _id, \
.mask = _mask, \
.value = _value, \
}
/* AB8500 registers */
...
...
@@ -86,10 +132,58 @@ enum ab8500_regulator_reg {
AB8500_REGUCTRL2SPARE
,
AB8500_REGUCTRLDISCH
,
AB8500_REGUCTRLDISCH2
,
AB8500_VSMPS1SEL1
,
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
,
};
/* AB9540 registers */
enum
ab9540_regulator_reg
{
...
...
@@ -139,4 +233,111 @@ enum ab9540_regulator_reg {
AB9540_NUM_REGULATOR_REGISTERS
,
};
/* AB8540 registers */
enum
ab8540_regulator_reg
{
AB8540_REGUREQUESTCTRL1
,
AB8540_REGUREQUESTCTRL2
,
AB8540_REGUREQUESTCTRL3
,
AB8540_REGUREQUESTCTRL4
,
AB8540_REGUSYSCLKREQ1HPVALID1
,
AB8540_REGUSYSCLKREQ1HPVALID2
,
AB8540_REGUHWHPREQ1VALID1
,
AB8540_REGUHWHPREQ1VALID2
,
AB8540_REGUHWHPREQ2VALID1
,
AB8540_REGUHWHPREQ2VALID2
,
AB8540_REGUSWHPREQVALID1
,
AB8540_REGUSWHPREQVALID2
,
AB8540_REGUSYSCLKREQVALID1
,
AB8540_REGUSYSCLKREQVALID2
,
AB8540_REGUVAUX4REQVALID
,
AB8540_REGUVAUX5REQVALID
,
AB8540_REGUVAUX6REQVALID
,
AB8540_REGUVCLKBREQVALID
,
AB8540_REGUVRF1REQVALID
,
AB8540_REGUMISC1
,
AB8540_VAUDIOSUPPLY
,
AB8540_REGUCTRL1VAMIC
,
AB8540_VHSIC
,
AB8540_VSDIO
,
AB8540_VSMPS1REGU
,
AB8540_VSMPS2REGU
,
AB8540_VSMPS3REGU
,
AB8540_VPLLVANAREGU
,
AB8540_EXTSUPPLYREGU
,
AB8540_VAUX12REGU
,
AB8540_VRF1VAUX3REGU
,
AB8540_VSMPS1SEL1
,
AB8540_VSMPS1SEL2
,
AB8540_VSMPS1SEL3
,
AB8540_VSMPS2SEL1
,
AB8540_VSMPS2SEL2
,
AB8540_VSMPS2SEL3
,
AB8540_VSMPS3SEL1
,
AB8540_VSMPS3SEL2
,
AB8540_VAUX1SEL
,
AB8540_VAUX2SEL
,
AB8540_VRF1VAUX3SEL
,
AB8540_REGUCTRL2SPARE
,
AB8540_VAUX4REQCTRL
,
AB8540_VAUX4REGU
,
AB8540_VAUX4SEL
,
AB8540_VAUX5REQCTRL
,
AB8540_VAUX5REGU
,
AB8540_VAUX5SEL
,
AB8540_VAUX6REQCTRL
,
AB8540_VAUX6REGU
,
AB8540_VAUX6SEL
,
AB8540_VCLKBREQCTRL
,
AB8540_VCLKBREGU
,
AB8540_VCLKBSEL
,
AB8540_VRF1REQCTRL
,
AB8540_REGUCTRLDISCH
,
AB8540_REGUCTRLDISCH2
,
AB8540_REGUCTRLDISCH3
,
AB8540_REGUCTRLDISCH4
,
AB8540_VSIMSYSCLKCTRL
,
AB8540_VANAVPLLSEL
,
AB8540_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
;
};
#ifdef CONFIG_REGULATOR_AB8500_DEBUG
int
ab8500_regulator_debug_init
(
struct
platform_device
*
pdev
);
int
ab8500_regulator_debug_exit
(
struct
platform_device
*
pdev
);
#else
static
inline
int
ab8500_regulator_debug_init
(
struct
platform_device
*
pdev
)
{
return
0
;
}
static
inline
int
ab8500_regulator_debug_exit
(
struct
platform_device
*
pdev
)
{
return
0
;
}
#endif
/* AB8500 external regulator functions. */
int
ab8500_ext_regulator_init
(
struct
platform_device
*
pdev
);
void
ab8500_ext_regulator_exit
(
struct
platform_device
*
pdev
);
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment