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
Kirill Smelkov
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