Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
cea64d8c
Commit
cea64d8c
authored
Oct 24, 2013
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'regulator/topic/as3722' into regulator-next
parents
f2399df7
5e965704
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
1017 additions
and
0 deletions
+1017
-0
Documentation/devicetree/bindings/regulator/as3722-regulator.txt
...tation/devicetree/bindings/regulator/as3722-regulator.txt
+91
-0
drivers/regulator/Kconfig
drivers/regulator/Kconfig
+8
-0
drivers/regulator/Makefile
drivers/regulator/Makefile
+1
-0
drivers/regulator/as3722-regulator.c
drivers/regulator/as3722-regulator.c
+917
-0
No files found.
Documentation/devicetree/bindings/regulator/as3722-regulator.txt
0 → 100644
View file @
cea64d8c
Regulator of AMS AS3722 PMIC.
Name of the regulator subnode must be "regulators".
Optional properties:
--------------------
The input supply of regulators are the optional properties on the
regulator node. The AS3722 is having 7 DCDC step-down regulators as
sd[0-6], 10 LDOs as ldo[0-7], ldo[9-11]. The input supply of these
regulators are provided through following properties:
vsup-sd2-supply: Input supply for SD2.
vsup-sd3-supply: Input supply for SD3.
vsup-sd4-supply: Input supply for SD4.
vsup-sd5-supply: Input supply for SD5.
vin-ldo0-supply: Input supply for LDO0.
vin-ldo1-6-supply: Input supply for LDO1 and LDO6.
vin-ldo2-5-7-supply: Input supply for LDO2, LDO5 and LDO7.
vin-ldo3-4-supply: Input supply for LDO3 and LDO4.
vin-ldo9-10-supply: Input supply for LDO9 and LDO10.
vin-ldo11-supply: Input supply for LDO11.
Optional nodes:
--------------
- regulators : Must contain a sub-node per regulator from the list below.
Each sub-node should contain the constraints and initialization
information for that regulator. See regulator.txt for a
description of standard properties for these sub-nodes.
Additional custom properties are listed below.
sd[0-6], ldo[0-7], ldo[9-11].
Optional sub-node properties:
----------------------------
ams,ext-control: External control of the rail. The option of
this properties will tell which external input is
controlling this rail. Valid values are 0, 1, 2 ad 3.
0: There is no external control of this rail.
1: Rail is controlled by ENABLE1 input pin.
2: Rail is controlled by ENABLE2 input pin.
3: Rail is controlled by ENABLE3 input pin.
ams,enable-tracking: Enable tracking with SD1, only supported
by LDO3.
Example:
-------
ams3722: ams3722 {
compatible = "ams,as3722";
reg = <0x40>;
...
regulators {
vsup-sd2-supply = <...>;
...
sd0 {
regulator-name = "vdd_cpu";
regulator-min-microvolt = <700000>;
regulator-max-microvolt = <1400000>;
regulator-always-on;
ams,ext-control = <2>;
};
sd1 {
regulator-name = "vdd_core";
regulator-min-microvolt = <700000>;
regulator-max-microvolt = <1400000>;
regulator-always-on;
ams,ext-control = <1>;
};
sd2 {
regulator-name = "vddio_ddr";
regulator-min-microvolt = <1350000>;
regulator-max-microvolt = <1350000>;
regulator-always-on;
};
sd4 {
regulator-name = "avdd-hdmi-pex";
regulator-min-microvolt = <1050000>;
regulator-max-microvolt = <1050000>;
regulator-always-on;
};
sd5 {
regulator-name = "vdd-1v8";
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-always-on;
};
....
};
};
drivers/regulator/Kconfig
View file @
cea64d8c
...
...
@@ -133,6 +133,14 @@ config REGULATOR_AS3711
This driver provides support for the voltage regulators on the
AS3711 PMIC
config REGULATOR_AS3722
tristate "AMS AS3722 PMIC Regulators"
depends on MFD_AS3722
help
This driver provides support for the voltage regulators on the
AS3722 PMIC. This will enable support for all the software
controllable DCDC/LDO regulators.
config REGULATOR_DA903X
tristate "Dialog Semiconductor DA9030/DA9034 regulators"
depends on PMIC_DA903X
...
...
drivers/regulator/Makefile
View file @
cea64d8c
...
...
@@ -18,6 +18,7 @@ obj-$(CONFIG_REGULATOR_AD5398) += ad5398.o
obj-$(CONFIG_REGULATOR_ANATOP)
+=
anatop-regulator.o
obj-$(CONFIG_REGULATOR_ARIZONA)
+=
arizona-micsupp.o arizona-ldo1.o
obj-$(CONFIG_REGULATOR_AS3711)
+=
as3711-regulator.o
obj-$(CONFIG_REGULATOR_AS3722)
+=
as3722-regulator.o
obj-$(CONFIG_REGULATOR_DA903X)
+=
da903x.o
obj-$(CONFIG_REGULATOR_DA9052)
+=
da9052-regulator.o
obj-$(CONFIG_REGULATOR_DA9055)
+=
da9055-regulator.o
...
...
drivers/regulator/as3722-regulator.c
0 → 100644
View file @
cea64d8c
/*
* Voltage regulator support for AMS AS3722 PMIC
*
* Copyright (C) 2013 ams
*
* Author: Florian Lobmaier <florian.lobmaier@ams.com>
* Author: Laxman Dewangan <ldewangan@nvidia.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include <linux/err.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/mfd/as3722.h>
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/of_regulator.h>
#include <linux/slab.h>
/* Regulator IDs */
enum
as3722_regulators_id
{
AS3722_REGULATOR_ID_SD0
,
AS3722_REGULATOR_ID_SD1
,
AS3722_REGULATOR_ID_SD2
,
AS3722_REGULATOR_ID_SD3
,
AS3722_REGULATOR_ID_SD4
,
AS3722_REGULATOR_ID_SD5
,
AS3722_REGULATOR_ID_SD6
,
AS3722_REGULATOR_ID_LDO0
,
AS3722_REGULATOR_ID_LDO1
,
AS3722_REGULATOR_ID_LDO2
,
AS3722_REGULATOR_ID_LDO3
,
AS3722_REGULATOR_ID_LDO4
,
AS3722_REGULATOR_ID_LDO5
,
AS3722_REGULATOR_ID_LDO6
,
AS3722_REGULATOR_ID_LDO7
,
AS3722_REGULATOR_ID_LDO9
,
AS3722_REGULATOR_ID_LDO10
,
AS3722_REGULATOR_ID_LDO11
,
AS3722_REGULATOR_ID_MAX
,
};
struct
as3722_register_mapping
{
u8
regulator_id
;
const
char
*
name
;
const
char
*
sname
;
u8
vsel_reg
;
u8
vsel_mask
;
int
n_voltages
;
u32
enable_reg
;
u8
enable_mask
;
u32
control_reg
;
u8
mode_mask
;
u32
sleep_ctrl_reg
;
u8
sleep_ctrl_mask
;
};
struct
as3722_regulator_config_data
{
struct
regulator_init_data
*
reg_init
;
bool
enable_tracking
;
int
ext_control
;
};
struct
as3722_regulators
{
struct
device
*
dev
;
struct
as3722
*
as3722
;
struct
regulator_dev
*
rdevs
[
AS3722_REGULATOR_ID_MAX
];
struct
regulator_desc
desc
[
AS3722_REGULATOR_ID_MAX
];
struct
as3722_regulator_config_data
reg_config_data
[
AS3722_REGULATOR_ID_MAX
];
};
static
const
struct
as3722_register_mapping
as3722_reg_lookup
[]
=
{
{
.
regulator_id
=
AS3722_REGULATOR_ID_SD0
,
.
name
=
"as3722-sd0"
,
.
vsel_reg
=
AS3722_SD0_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_SD_VSEL_MASK
,
.
enable_reg
=
AS3722_SD_CONTROL_REG
,
.
enable_mask
=
AS3722_SDn_CTRL
(
0
),
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL1_REG
,
.
sleep_ctrl_mask
=
AS3722_SD0_EXT_ENABLE_MASK
,
.
control_reg
=
AS3722_SD0_CONTROL_REG
,
.
mode_mask
=
AS3722_SD0_MODE_FAST
,
.
n_voltages
=
AS3722_SD0_VSEL_MAX
+
1
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_SD1
,
.
name
=
"as3722-sd1"
,
.
vsel_reg
=
AS3722_SD1_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_SD_VSEL_MASK
,
.
enable_reg
=
AS3722_SD_CONTROL_REG
,
.
enable_mask
=
AS3722_SDn_CTRL
(
1
),
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL1_REG
,
.
sleep_ctrl_mask
=
AS3722_SD1_EXT_ENABLE_MASK
,
.
control_reg
=
AS3722_SD1_CONTROL_REG
,
.
mode_mask
=
AS3722_SD1_MODE_FAST
,
.
n_voltages
=
AS3722_SD0_VSEL_MAX
+
1
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_SD2
,
.
name
=
"as3722-sd2"
,
.
sname
=
"vsup-sd2"
,
.
vsel_reg
=
AS3722_SD2_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_SD_VSEL_MASK
,
.
enable_reg
=
AS3722_SD_CONTROL_REG
,
.
enable_mask
=
AS3722_SDn_CTRL
(
2
),
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL1_REG
,
.
sleep_ctrl_mask
=
AS3722_SD2_EXT_ENABLE_MASK
,
.
control_reg
=
AS3722_SD23_CONTROL_REG
,
.
mode_mask
=
AS3722_SD2_MODE_FAST
,
.
n_voltages
=
AS3722_SD2_VSEL_MAX
+
1
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_SD3
,
.
name
=
"as3722-sd3"
,
.
sname
=
"vsup-sd3"
,
.
vsel_reg
=
AS3722_SD3_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_SD_VSEL_MASK
,
.
enable_reg
=
AS3722_SD_CONTROL_REG
,
.
enable_mask
=
AS3722_SDn_CTRL
(
3
),
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL1_REG
,
.
sleep_ctrl_mask
=
AS3722_SD3_EXT_ENABLE_MASK
,
.
control_reg
=
AS3722_SD23_CONTROL_REG
,
.
mode_mask
=
AS3722_SD3_MODE_FAST
,
.
n_voltages
=
AS3722_SD2_VSEL_MAX
+
1
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_SD4
,
.
name
=
"as3722-sd4"
,
.
sname
=
"vsup-sd4"
,
.
vsel_reg
=
AS3722_SD4_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_SD_VSEL_MASK
,
.
enable_reg
=
AS3722_SD_CONTROL_REG
,
.
enable_mask
=
AS3722_SDn_CTRL
(
4
),
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL2_REG
,
.
sleep_ctrl_mask
=
AS3722_SD4_EXT_ENABLE_MASK
,
.
control_reg
=
AS3722_SD4_CONTROL_REG
,
.
mode_mask
=
AS3722_SD4_MODE_FAST
,
.
n_voltages
=
AS3722_SD2_VSEL_MAX
+
1
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_SD5
,
.
name
=
"as3722-sd5"
,
.
sname
=
"vsup-sd5"
,
.
vsel_reg
=
AS3722_SD5_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_SD_VSEL_MASK
,
.
enable_reg
=
AS3722_SD_CONTROL_REG
,
.
enable_mask
=
AS3722_SDn_CTRL
(
5
),
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL2_REG
,
.
sleep_ctrl_mask
=
AS3722_SD5_EXT_ENABLE_MASK
,
.
control_reg
=
AS3722_SD5_CONTROL_REG
,
.
mode_mask
=
AS3722_SD5_MODE_FAST
,
.
n_voltages
=
AS3722_SD2_VSEL_MAX
+
1
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_SD6
,
.
name
=
"as3722-sd6"
,
.
vsel_reg
=
AS3722_SD6_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_SD_VSEL_MASK
,
.
enable_reg
=
AS3722_SD_CONTROL_REG
,
.
enable_mask
=
AS3722_SDn_CTRL
(
6
),
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL2_REG
,
.
sleep_ctrl_mask
=
AS3722_SD6_EXT_ENABLE_MASK
,
.
control_reg
=
AS3722_SD6_CONTROL_REG
,
.
mode_mask
=
AS3722_SD6_MODE_FAST
,
.
n_voltages
=
AS3722_SD0_VSEL_MAX
+
1
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_LDO0
,
.
name
=
"as3722-ldo0"
,
.
sname
=
"vin-ldo0"
,
.
vsel_reg
=
AS3722_LDO0_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_LDO0_VSEL_MASK
,
.
enable_reg
=
AS3722_LDOCONTROL0_REG
,
.
enable_mask
=
AS3722_LDO0_CTRL
,
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL3_REG
,
.
sleep_ctrl_mask
=
AS3722_LDO0_EXT_ENABLE_MASK
,
.
n_voltages
=
AS3722_LDO0_NUM_VOLT
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_LDO1
,
.
name
=
"as3722-ldo1"
,
.
sname
=
"vin-ldo1-6"
,
.
vsel_reg
=
AS3722_LDO1_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_LDO_VSEL_MASK
,
.
enable_reg
=
AS3722_LDOCONTROL0_REG
,
.
enable_mask
=
AS3722_LDO1_CTRL
,
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL3_REG
,
.
sleep_ctrl_mask
=
AS3722_LDO1_EXT_ENABLE_MASK
,
.
n_voltages
=
AS3722_LDO_NUM_VOLT
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_LDO2
,
.
name
=
"as3722-ldo2"
,
.
sname
=
"vin-ldo2-5-7"
,
.
vsel_reg
=
AS3722_LDO2_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_LDO_VSEL_MASK
,
.
enable_reg
=
AS3722_LDOCONTROL0_REG
,
.
enable_mask
=
AS3722_LDO2_CTRL
,
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL3_REG
,
.
sleep_ctrl_mask
=
AS3722_LDO2_EXT_ENABLE_MASK
,
.
n_voltages
=
AS3722_LDO_NUM_VOLT
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_LDO3
,
.
name
=
"as3722-ldo3"
,
.
name
=
"vin-ldo3-4"
,
.
vsel_reg
=
AS3722_LDO3_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_LDO3_VSEL_MASK
,
.
enable_reg
=
AS3722_LDOCONTROL0_REG
,
.
enable_mask
=
AS3722_LDO3_CTRL
,
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL3_REG
,
.
sleep_ctrl_mask
=
AS3722_LDO3_EXT_ENABLE_MASK
,
.
n_voltages
=
AS3722_LDO3_NUM_VOLT
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_LDO4
,
.
name
=
"as3722-ldo4"
,
.
name
=
"vin-ldo3-4"
,
.
vsel_reg
=
AS3722_LDO4_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_LDO_VSEL_MASK
,
.
enable_reg
=
AS3722_LDOCONTROL0_REG
,
.
enable_mask
=
AS3722_LDO4_CTRL
,
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL4_REG
,
.
sleep_ctrl_mask
=
AS3722_LDO4_EXT_ENABLE_MASK
,
.
n_voltages
=
AS3722_LDO_NUM_VOLT
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_LDO5
,
.
name
=
"as3722-ldo5"
,
.
sname
=
"vin-ldo2-5-7"
,
.
vsel_reg
=
AS3722_LDO5_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_LDO_VSEL_MASK
,
.
enable_reg
=
AS3722_LDOCONTROL0_REG
,
.
enable_mask
=
AS3722_LDO5_CTRL
,
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL4_REG
,
.
sleep_ctrl_mask
=
AS3722_LDO5_EXT_ENABLE_MASK
,
.
n_voltages
=
AS3722_LDO_NUM_VOLT
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_LDO6
,
.
name
=
"as3722-ldo6"
,
.
sname
=
"vin-ldo1-6"
,
.
vsel_reg
=
AS3722_LDO6_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_LDO_VSEL_MASK
,
.
enable_reg
=
AS3722_LDOCONTROL0_REG
,
.
enable_mask
=
AS3722_LDO6_CTRL
,
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL4_REG
,
.
sleep_ctrl_mask
=
AS3722_LDO6_EXT_ENABLE_MASK
,
.
n_voltages
=
AS3722_LDO_NUM_VOLT
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_LDO7
,
.
name
=
"as3722-ldo7"
,
.
sname
=
"vin-ldo2-5-7"
,
.
vsel_reg
=
AS3722_LDO7_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_LDO_VSEL_MASK
,
.
enable_reg
=
AS3722_LDOCONTROL0_REG
,
.
enable_mask
=
AS3722_LDO7_CTRL
,
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL4_REG
,
.
sleep_ctrl_mask
=
AS3722_LDO7_EXT_ENABLE_MASK
,
.
n_voltages
=
AS3722_LDO_NUM_VOLT
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_LDO9
,
.
name
=
"as3722-ldo9"
,
.
sname
=
"vin-ldo9-10"
,
.
vsel_reg
=
AS3722_LDO9_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_LDO_VSEL_MASK
,
.
enable_reg
=
AS3722_LDOCONTROL1_REG
,
.
enable_mask
=
AS3722_LDO9_CTRL
,
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL5_REG
,
.
sleep_ctrl_mask
=
AS3722_LDO9_EXT_ENABLE_MASK
,
.
n_voltages
=
AS3722_LDO_NUM_VOLT
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_LDO10
,
.
name
=
"as3722-ldo10"
,
.
sname
=
"vin-ldo9-10"
,
.
vsel_reg
=
AS3722_LDO10_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_LDO_VSEL_MASK
,
.
enable_reg
=
AS3722_LDOCONTROL1_REG
,
.
enable_mask
=
AS3722_LDO10_CTRL
,
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL5_REG
,
.
sleep_ctrl_mask
=
AS3722_LDO10_EXT_ENABLE_MASK
,
.
n_voltages
=
AS3722_LDO_NUM_VOLT
,
},
{
.
regulator_id
=
AS3722_REGULATOR_ID_LDO11
,
.
name
=
"as3722-ldo11"
,
.
sname
=
"vin-ldo11"
,
.
vsel_reg
=
AS3722_LDO11_VOLTAGE_REG
,
.
vsel_mask
=
AS3722_LDO_VSEL_MASK
,
.
enable_reg
=
AS3722_LDOCONTROL1_REG
,
.
enable_mask
=
AS3722_LDO11_CTRL
,
.
sleep_ctrl_reg
=
AS3722_ENABLE_CTRL5_REG
,
.
sleep_ctrl_mask
=
AS3722_LDO11_EXT_ENABLE_MASK
,
.
n_voltages
=
AS3722_LDO_NUM_VOLT
,
},
};
static
const
int
as3722_ldo_current
[]
=
{
150000
,
300000
};
static
const
int
as3722_sd016_current
[]
=
{
2500000
,
3000000
,
3500000
};
static
int
as3722_current_to_index
(
int
min_uA
,
int
max_uA
,
const
int
*
curr_table
,
int
n_currents
)
{
int
i
;
for
(
i
=
n_currents
-
1
;
i
>=
0
;
i
--
)
{
if
((
min_uA
<=
curr_table
[
i
])
&&
(
curr_table
[
i
]
<=
max_uA
))
return
i
;
}
return
-
EINVAL
;
}
static
int
as3722_ldo_get_current_limit
(
struct
regulator_dev
*
rdev
)
{
struct
as3722_regulators
*
as3722_regs
=
rdev_get_drvdata
(
rdev
);
struct
as3722
*
as3722
=
as3722_regs
->
as3722
;
int
id
=
rdev_get_id
(
rdev
);
u32
val
;
int
ret
;
ret
=
as3722_read
(
as3722
,
as3722_reg_lookup
[
id
].
vsel_reg
,
&
val
);
if
(
ret
<
0
)
{
dev_err
(
as3722_regs
->
dev
,
"Reg 0x%02x read failed: %d
\n
"
,
as3722_reg_lookup
[
id
].
vsel_reg
,
ret
);
return
ret
;
}
if
(
val
&
AS3722_LDO_ILIMIT_MASK
)
return
300000
;
return
150000
;
}
static
int
as3722_ldo_set_current_limit
(
struct
regulator_dev
*
rdev
,
int
min_uA
,
int
max_uA
)
{
struct
as3722_regulators
*
as3722_regs
=
rdev_get_drvdata
(
rdev
);
struct
as3722
*
as3722
=
as3722_regs
->
as3722
;
int
id
=
rdev_get_id
(
rdev
);
int
ret
;
u32
reg
=
0
;
ret
=
as3722_current_to_index
(
min_uA
,
max_uA
,
as3722_ldo_current
,
ARRAY_SIZE
(
as3722_ldo_current
));
if
(
ret
<
0
)
{
dev_err
(
as3722_regs
->
dev
,
"Current range min:max = %d:%d does not support
\n
"
,
min_uA
,
max_uA
);
return
ret
;
}
if
(
ret
)
reg
=
AS3722_LDO_ILIMIT_BIT
;
return
as3722_update_bits
(
as3722
,
as3722_reg_lookup
[
id
].
vsel_reg
,
AS3722_LDO_ILIMIT_MASK
,
reg
);
}
static
struct
regulator_ops
as3722_ldo0_ops
=
{
.
is_enabled
=
regulator_is_enabled_regmap
,
.
enable
=
regulator_enable_regmap
,
.
disable
=
regulator_disable_regmap
,
.
list_voltage
=
regulator_list_voltage_linear
,
.
get_voltage_sel
=
regulator_get_voltage_sel_regmap
,
.
set_voltage_sel
=
regulator_set_voltage_sel_regmap
,
.
get_current_limit
=
as3722_ldo_get_current_limit
,
.
set_current_limit
=
as3722_ldo_set_current_limit
,
};
static
struct
regulator_ops
as3722_ldo0_extcntrl_ops
=
{
.
list_voltage
=
regulator_list_voltage_linear
,
.
get_voltage_sel
=
regulator_get_voltage_sel_regmap
,
.
set_voltage_sel
=
regulator_set_voltage_sel_regmap
,
.
get_current_limit
=
as3722_ldo_get_current_limit
,
.
set_current_limit
=
as3722_ldo_set_current_limit
,
};
static
int
as3722_ldo3_set_tracking_mode
(
struct
as3722_regulators
*
as3722_reg
,
int
id
,
u8
mode
)
{
struct
as3722
*
as3722
=
as3722_reg
->
as3722
;
switch
(
mode
)
{
case
AS3722_LDO3_MODE_PMOS
:
case
AS3722_LDO3_MODE_PMOS_TRACKING
:
case
AS3722_LDO3_MODE_NMOS
:
case
AS3722_LDO3_MODE_SWITCH
:
return
as3722_update_bits
(
as3722
,
as3722_reg_lookup
[
id
].
vsel_reg
,
AS3722_LDO3_MODE_MASK
,
mode
);
default:
return
-
EINVAL
;
}
}
static
int
as3722_ldo3_get_current_limit
(
struct
regulator_dev
*
rdev
)
{
return
150000
;
}
static
struct
regulator_ops
as3722_ldo3_ops
=
{
.
is_enabled
=
regulator_is_enabled_regmap
,
.
enable
=
regulator_enable_regmap
,
.
disable
=
regulator_disable_regmap
,
.
list_voltage
=
regulator_list_voltage_linear
,
.
get_voltage_sel
=
regulator_get_voltage_sel_regmap
,
.
set_voltage_sel
=
regulator_set_voltage_sel_regmap
,
.
get_current_limit
=
as3722_ldo3_get_current_limit
,
};
static
struct
regulator_ops
as3722_ldo3_extcntrl_ops
=
{
.
list_voltage
=
regulator_list_voltage_linear
,
.
get_voltage_sel
=
regulator_get_voltage_sel_regmap
,
.
set_voltage_sel
=
regulator_set_voltage_sel_regmap
,
.
get_current_limit
=
as3722_ldo3_get_current_limit
,
};
#define regulator_lin_range(_min_sel, _max_sel, _min_uV, _step_uV) \
{ \
.min_sel = _min_sel, \
.max_sel = _max_sel, \
.uV_step = _step_uV, \
.min_uV = _min_uV, \
.max_uV = _min_uV + (_max_sel - _min_sel) * _step_uV, \
}
static
const
struct
regulator_linear_range
as3722_ldo_ranges
[]
=
{
regulator_lin_range
(
0x01
,
0x24
,
825000
,
25000
),
regulator_lin_range
(
0x40
,
0x7F
,
1725000
,
25000
),
};
static
struct
regulator_ops
as3722_ldo_ops
=
{
.
is_enabled
=
regulator_is_enabled_regmap
,
.
enable
=
regulator_enable_regmap
,
.
disable
=
regulator_disable_regmap
,
.
map_voltage
=
regulator_map_voltage_linear_range
,
.
set_voltage_sel
=
regulator_set_voltage_sel_regmap
,
.
get_voltage_sel
=
regulator_get_voltage_sel_regmap
,
.
list_voltage
=
regulator_list_voltage_linear_range
,
.
get_current_limit
=
as3722_ldo_get_current_limit
,
.
set_current_limit
=
as3722_ldo_set_current_limit
,
};
static
struct
regulator_ops
as3722_ldo_extcntrl_ops
=
{
.
map_voltage
=
regulator_map_voltage_linear_range
,
.
set_voltage_sel
=
regulator_set_voltage_sel_regmap
,
.
get_voltage_sel
=
regulator_get_voltage_sel_regmap
,
.
list_voltage
=
regulator_list_voltage_linear_range
,
.
get_current_limit
=
as3722_ldo_get_current_limit
,
.
set_current_limit
=
as3722_ldo_set_current_limit
,
};
static
unsigned
int
as3722_sd_get_mode
(
struct
regulator_dev
*
rdev
)
{
struct
as3722_regulators
*
as3722_regs
=
rdev_get_drvdata
(
rdev
);
struct
as3722
*
as3722
=
as3722_regs
->
as3722
;
int
id
=
rdev_get_id
(
rdev
);
u32
val
;
int
ret
;
if
(
!
as3722_reg_lookup
[
id
].
control_reg
)
return
-
ENOTSUPP
;
ret
=
as3722_read
(
as3722
,
as3722_reg_lookup
[
id
].
control_reg
,
&
val
);
if
(
ret
<
0
)
{
dev_err
(
as3722_regs
->
dev
,
"Reg 0x%02x read failed: %d
\n
"
,
as3722_reg_lookup
[
id
].
control_reg
,
ret
);
return
ret
;
}
if
(
val
&
as3722_reg_lookup
[
id
].
mode_mask
)
return
REGULATOR_MODE_FAST
;
else
return
REGULATOR_MODE_NORMAL
;
}
static
int
as3722_sd_set_mode
(
struct
regulator_dev
*
rdev
,
unsigned
int
mode
)
{
struct
as3722_regulators
*
as3722_regs
=
rdev_get_drvdata
(
rdev
);
struct
as3722
*
as3722
=
as3722_regs
->
as3722
;
u8
id
=
rdev_get_id
(
rdev
);
u8
val
=
0
;
int
ret
;
if
(
!
as3722_reg_lookup
[
id
].
control_reg
)
return
-
ERANGE
;
switch
(
mode
)
{
case
REGULATOR_MODE_FAST
:
val
=
as3722_reg_lookup
[
id
].
mode_mask
;
case
REGULATOR_MODE_NORMAL
:
/* fall down */
break
;
default:
return
-
EINVAL
;
}
ret
=
as3722_update_bits
(
as3722
,
as3722_reg_lookup
[
id
].
control_reg
,
as3722_reg_lookup
[
id
].
mode_mask
,
val
);
if
(
ret
<
0
)
{
dev_err
(
as3722_regs
->
dev
,
"Reg 0x%02x update failed: %d
\n
"
,
as3722_reg_lookup
[
id
].
control_reg
,
ret
);
return
ret
;
}
return
ret
;
}
static
int
as3722_sd016_get_current_limit
(
struct
regulator_dev
*
rdev
)
{
struct
as3722_regulators
*
as3722_regs
=
rdev_get_drvdata
(
rdev
);
struct
as3722
*
as3722
=
as3722_regs
->
as3722
;
int
id
=
rdev_get_id
(
rdev
);
u32
val
,
reg
;
int
mask
;
int
ret
;
switch
(
id
)
{
case
AS3722_REGULATOR_ID_SD0
:
reg
=
AS3722_OVCURRENT_REG
;
mask
=
AS3722_OVCURRENT_SD0_TRIP_MASK
;
break
;
case
AS3722_REGULATOR_ID_SD1
:
reg
=
AS3722_OVCURRENT_REG
;
mask
=
AS3722_OVCURRENT_SD1_TRIP_MASK
;
break
;
case
AS3722_REGULATOR_ID_SD6
:
reg
=
AS3722_OVCURRENT_DEB_REG
;
mask
=
AS3722_OVCURRENT_SD6_TRIP_MASK
;
break
;
default:
return
-
EINVAL
;
}
ret
=
as3722_read
(
as3722
,
reg
,
&
val
);
if
(
ret
<
0
)
{
dev_err
(
as3722_regs
->
dev
,
"Reg 0x%02x read failed: %d
\n
"
,
reg
,
ret
);
return
ret
;
}
val
&=
mask
;
val
>>=
ffs
(
mask
)
-
1
;
if
(
val
==
3
)
return
-
EINVAL
;
return
as3722_sd016_current
[
val
];
}
static
int
as3722_sd016_set_current_limit
(
struct
regulator_dev
*
rdev
,
int
min_uA
,
int
max_uA
)
{
struct
as3722_regulators
*
as3722_regs
=
rdev_get_drvdata
(
rdev
);
struct
as3722
*
as3722
=
as3722_regs
->
as3722
;
int
id
=
rdev_get_id
(
rdev
);
int
ret
;
int
val
;
int
mask
;
u32
reg
;
ret
=
as3722_current_to_index
(
min_uA
,
max_uA
,
as3722_sd016_current
,
ARRAY_SIZE
(
as3722_sd016_current
));
if
(
ret
<
0
)
{
dev_err
(
as3722_regs
->
dev
,
"Current range min:max = %d:%d does not support
\n
"
,
min_uA
,
max_uA
);
return
ret
;
}
switch
(
id
)
{
case
AS3722_REGULATOR_ID_SD0
:
reg
=
AS3722_OVCURRENT_REG
;
mask
=
AS3722_OVCURRENT_SD0_TRIP_MASK
;
break
;
case
AS3722_REGULATOR_ID_SD1
:
reg
=
AS3722_OVCURRENT_REG
;
mask
=
AS3722_OVCURRENT_SD1_TRIP_MASK
;
break
;
case
AS3722_REGULATOR_ID_SD6
:
reg
=
AS3722_OVCURRENT_DEB_REG
;
mask
=
AS3722_OVCURRENT_SD6_TRIP_MASK
;
break
;
default:
return
-
EINVAL
;
}
val
=
ret
&
mask
;
val
<<=
ffs
(
mask
)
-
1
;
return
as3722_update_bits
(
as3722
,
reg
,
mask
,
val
);
}
static
const
struct
regulator_linear_range
as3722_sd2345_ranges
[]
=
{
regulator_lin_range
(
0x01
,
0x40
,
612500
,
12500
),
regulator_lin_range
(
0x41
,
0x70
,
1425000
,
25000
),
regulator_lin_range
(
0x71
,
0x7F
,
2650000
,
50000
),
};
static
struct
regulator_ops
as3722_sd016_ops
=
{
.
is_enabled
=
regulator_is_enabled_regmap
,
.
enable
=
regulator_enable_regmap
,
.
disable
=
regulator_disable_regmap
,
.
list_voltage
=
regulator_list_voltage_linear
,
.
map_voltage
=
regulator_map_voltage_linear
,
.
get_voltage_sel
=
regulator_get_voltage_sel_regmap
,
.
set_voltage_sel
=
regulator_set_voltage_sel_regmap
,
.
get_current_limit
=
as3722_sd016_get_current_limit
,
.
set_current_limit
=
as3722_sd016_set_current_limit
,
.
get_mode
=
as3722_sd_get_mode
,
.
set_mode
=
as3722_sd_set_mode
,
};
static
struct
regulator_ops
as3722_sd016_extcntrl_ops
=
{
.
list_voltage
=
regulator_list_voltage_linear
,
.
map_voltage
=
regulator_map_voltage_linear
,
.
get_voltage_sel
=
regulator_get_voltage_sel_regmap
,
.
set_voltage_sel
=
regulator_set_voltage_sel_regmap
,
.
get_current_limit
=
as3722_sd016_get_current_limit
,
.
set_current_limit
=
as3722_sd016_set_current_limit
,
.
get_mode
=
as3722_sd_get_mode
,
.
set_mode
=
as3722_sd_set_mode
,
};
static
struct
regulator_ops
as3722_sd2345_ops
=
{
.
is_enabled
=
regulator_is_enabled_regmap
,
.
enable
=
regulator_enable_regmap
,
.
disable
=
regulator_disable_regmap
,
.
list_voltage
=
regulator_list_voltage_linear_range
,
.
map_voltage
=
regulator_map_voltage_linear_range
,
.
set_voltage_sel
=
regulator_set_voltage_sel_regmap
,
.
get_voltage_sel
=
regulator_get_voltage_sel_regmap
,
.
get_mode
=
as3722_sd_get_mode
,
.
set_mode
=
as3722_sd_set_mode
,
};
static
struct
regulator_ops
as3722_sd2345_extcntrl_ops
=
{
.
list_voltage
=
regulator_list_voltage_linear_range
,
.
map_voltage
=
regulator_map_voltage_linear_range
,
.
set_voltage_sel
=
regulator_set_voltage_sel_regmap
,
.
get_voltage_sel
=
regulator_get_voltage_sel_regmap
,
.
get_mode
=
as3722_sd_get_mode
,
.
set_mode
=
as3722_sd_set_mode
,
};
static
int
as3722_extreg_init
(
struct
as3722_regulators
*
as3722_regs
,
int
id
,
int
ext_pwr_ctrl
)
{
int
ret
;
unsigned
int
val
;
if
((
ext_pwr_ctrl
<
AS3722_EXT_CONTROL_ENABLE1
)
||
(
ext_pwr_ctrl
>
AS3722_EXT_CONTROL_ENABLE3
))
return
-
EINVAL
;
val
=
ext_pwr_ctrl
<<
(
ffs
(
as3722_reg_lookup
[
id
].
sleep_ctrl_mask
)
-
1
);
ret
=
as3722_update_bits
(
as3722_regs
->
as3722
,
as3722_reg_lookup
[
id
].
sleep_ctrl_reg
,
as3722_reg_lookup
[
id
].
sleep_ctrl_mask
,
val
);
if
(
ret
<
0
)
dev_err
(
as3722_regs
->
dev
,
"Reg 0x%02x update failed: %d
\n
"
,
as3722_reg_lookup
[
id
].
sleep_ctrl_reg
,
ret
);
return
ret
;
}
static
struct
of_regulator_match
as3722_regulator_matches
[]
=
{
{
.
name
=
"sd0"
,
},
{
.
name
=
"sd1"
,
},
{
.
name
=
"sd2"
,
},
{
.
name
=
"sd3"
,
},
{
.
name
=
"sd4"
,
},
{
.
name
=
"sd5"
,
},
{
.
name
=
"sd6"
,
},
{
.
name
=
"ldo0"
,
},
{
.
name
=
"ldo1"
,
},
{
.
name
=
"ldo2"
,
},
{
.
name
=
"ldo3"
,
},
{
.
name
=
"ldo4"
,
},
{
.
name
=
"ldo5"
,
},
{
.
name
=
"ldo6"
,
},
{
.
name
=
"ldo7"
,
},
{
.
name
=
"ldo9"
,
},
{
.
name
=
"ldo10"
,
},
{
.
name
=
"ldo11"
,
},
};
static
int
as3722_get_regulator_dt_data
(
struct
platform_device
*
pdev
,
struct
as3722_regulators
*
as3722_regs
)
{
struct
device_node
*
np
;
struct
as3722_regulator_config_data
*
reg_config
;
u32
prop
;
int
id
;
int
ret
;
np
=
of_get_child_by_name
(
pdev
->
dev
.
parent
->
of_node
,
"regulators"
);
if
(
!
np
)
{
dev_err
(
&
pdev
->
dev
,
"Device is not having regulators node
\n
"
);
return
-
ENODEV
;
}
pdev
->
dev
.
of_node
=
np
;
ret
=
of_regulator_match
(
&
pdev
->
dev
,
np
,
as3722_regulator_matches
,
ARRAY_SIZE
(
as3722_regulator_matches
));
if
(
ret
<
0
)
{
dev_err
(
&
pdev
->
dev
,
"Parsing of regulator node failed: %d
\n
"
,
ret
);
return
ret
;
}
for
(
id
=
0
;
id
<
ARRAY_SIZE
(
as3722_regulator_matches
);
++
id
)
{
struct
device_node
*
reg_node
;
reg_config
=
&
as3722_regs
->
reg_config_data
[
id
];
reg_config
->
reg_init
=
as3722_regulator_matches
[
id
].
init_data
;
reg_node
=
as3722_regulator_matches
[
id
].
of_node
;
if
(
!
reg_config
->
reg_init
||
!
reg_node
)
continue
;
ret
=
of_property_read_u32
(
reg_node
,
"ams,ext-control"
,
&
prop
);
if
(
!
ret
)
{
if
(
prop
<
3
)
reg_config
->
ext_control
=
prop
;
else
dev_warn
(
&
pdev
->
dev
,
"ext-control have invalid option: %u
\n
"
,
prop
);
}
reg_config
->
enable_tracking
=
of_property_read_bool
(
reg_node
,
"ams,enable-tracking"
);
}
return
0
;
}
static
int
as3722_regulator_probe
(
struct
platform_device
*
pdev
)
{
struct
as3722
*
as3722
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
struct
as3722_regulators
*
as3722_regs
;
struct
as3722_regulator_config_data
*
reg_config
;
struct
regulator_dev
*
rdev
;
struct
regulator_config
config
=
{
};
struct
regulator_ops
*
ops
;
int
id
;
int
ret
;
as3722_regs
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
*
as3722_regs
),
GFP_KERNEL
);
if
(
!
as3722_regs
)
return
-
ENOMEM
;
as3722_regs
->
dev
=
&
pdev
->
dev
;
as3722_regs
->
as3722
=
as3722
;
platform_set_drvdata
(
pdev
,
as3722_regs
);
ret
=
as3722_get_regulator_dt_data
(
pdev
,
as3722_regs
);
if
(
ret
<
0
)
return
ret
;
config
.
dev
=
&
pdev
->
dev
;
config
.
driver_data
=
as3722_regs
;
config
.
regmap
=
as3722
->
regmap
;
for
(
id
=
0
;
id
<
AS3722_REGULATOR_ID_MAX
;
id
++
)
{
reg_config
=
&
as3722_regs
->
reg_config_data
[
id
];
as3722_regs
->
desc
[
id
].
name
=
as3722_reg_lookup
[
id
].
name
;
as3722_regs
->
desc
[
id
].
supply_name
=
as3722_reg_lookup
[
id
].
sname
;
as3722_regs
->
desc
[
id
].
id
=
as3722_reg_lookup
[
id
].
regulator_id
;
as3722_regs
->
desc
[
id
].
n_voltages
=
as3722_reg_lookup
[
id
].
n_voltages
;
as3722_regs
->
desc
[
id
].
type
=
REGULATOR_VOLTAGE
;
as3722_regs
->
desc
[
id
].
owner
=
THIS_MODULE
;
as3722_regs
->
desc
[
id
].
enable_reg
=
as3722_reg_lookup
[
id
].
enable_reg
;
as3722_regs
->
desc
[
id
].
enable_mask
=
as3722_reg_lookup
[
id
].
enable_mask
;
as3722_regs
->
desc
[
id
].
vsel_reg
=
as3722_reg_lookup
[
id
].
vsel_reg
;
as3722_regs
->
desc
[
id
].
vsel_mask
=
as3722_reg_lookup
[
id
].
vsel_mask
;
switch
(
id
)
{
case
AS3722_REGULATOR_ID_LDO0
:
if
(
reg_config
->
ext_control
)
ops
=
&
as3722_ldo0_extcntrl_ops
;
else
ops
=
&
as3722_ldo0_ops
;
as3722_regs
->
desc
[
id
].
min_uV
=
825000
;
as3722_regs
->
desc
[
id
].
uV_step
=
25000
;
as3722_regs
->
desc
[
id
].
linear_min_sel
=
1
;
as3722_regs
->
desc
[
id
].
enable_time
=
500
;
break
;
case
AS3722_REGULATOR_ID_LDO3
:
if
(
reg_config
->
ext_control
)
ops
=
&
as3722_ldo3_extcntrl_ops
;
else
ops
=
&
as3722_ldo3_ops
;
as3722_regs
->
desc
[
id
].
min_uV
=
620000
;
as3722_regs
->
desc
[
id
].
uV_step
=
20000
;
as3722_regs
->
desc
[
id
].
linear_min_sel
=
1
;
as3722_regs
->
desc
[
id
].
enable_time
=
500
;
if
(
reg_config
->
enable_tracking
)
{
ret
=
as3722_ldo3_set_tracking_mode
(
as3722_regs
,
id
,
AS3722_LDO3_MODE_PMOS_TRACKING
);
if
(
ret
<
0
)
{
dev_err
(
&
pdev
->
dev
,
"LDO3 tracking failed: %d
\n
"
,
ret
);
return
ret
;
}
}
break
;
case
AS3722_REGULATOR_ID_SD0
:
case
AS3722_REGULATOR_ID_SD1
:
case
AS3722_REGULATOR_ID_SD6
:
if
(
reg_config
->
ext_control
)
ops
=
&
as3722_sd016_extcntrl_ops
;
else
ops
=
&
as3722_sd016_ops
;
as3722_regs
->
desc
[
id
].
min_uV
=
610000
;
as3722_regs
->
desc
[
id
].
uV_step
=
10000
;
as3722_regs
->
desc
[
id
].
linear_min_sel
=
1
;
break
;
case
AS3722_REGULATOR_ID_SD2
:
case
AS3722_REGULATOR_ID_SD3
:
case
AS3722_REGULATOR_ID_SD4
:
case
AS3722_REGULATOR_ID_SD5
:
if
(
reg_config
->
ext_control
)
ops
=
&
as3722_sd2345_extcntrl_ops
;
else
ops
=
&
as3722_sd2345_ops
;
as3722_regs
->
desc
[
id
].
linear_ranges
=
as3722_sd2345_ranges
;
as3722_regs
->
desc
[
id
].
n_linear_ranges
=
ARRAY_SIZE
(
as3722_sd2345_ranges
);
break
;
default:
if
(
reg_config
->
ext_control
)
ops
=
&
as3722_ldo_extcntrl_ops
;
else
ops
=
&
as3722_ldo_ops
;
as3722_regs
->
desc
[
id
].
min_uV
=
825000
;
as3722_regs
->
desc
[
id
].
uV_step
=
25000
;
as3722_regs
->
desc
[
id
].
linear_min_sel
=
1
;
as3722_regs
->
desc
[
id
].
enable_time
=
500
;
as3722_regs
->
desc
[
id
].
linear_ranges
=
as3722_ldo_ranges
;
as3722_regs
->
desc
[
id
].
n_linear_ranges
=
ARRAY_SIZE
(
as3722_ldo_ranges
);
break
;
}
as3722_regs
->
desc
[
id
].
ops
=
ops
;
config
.
init_data
=
reg_config
->
reg_init
;
config
.
of_node
=
as3722_regulator_matches
[
id
].
of_node
;
rdev
=
devm_regulator_register
(
&
pdev
->
dev
,
&
as3722_regs
->
desc
[
id
],
&
config
);
if
(
IS_ERR
(
rdev
))
{
ret
=
PTR_ERR
(
rdev
);
dev_err
(
&
pdev
->
dev
,
"regulator %d register failed %d
\n
"
,
id
,
ret
);
return
ret
;
}
as3722_regs
->
rdevs
[
id
]
=
rdev
;
if
(
reg_config
->
ext_control
)
{
ret
=
regulator_enable_regmap
(
rdev
);
if
(
ret
<
0
)
{
dev_err
(
&
pdev
->
dev
,
"Regulator %d enable failed: %d
\n
"
,
id
,
ret
);
return
ret
;
}
ret
=
as3722_extreg_init
(
as3722_regs
,
id
,
reg_config
->
ext_control
);
if
(
ret
<
0
)
{
dev_err
(
&
pdev
->
dev
,
"AS3722 ext control failed: %d"
,
ret
);
return
ret
;
}
}
}
return
0
;
}
static
const
struct
of_device_id
of_as3722_regulator_match
[]
=
{
{
.
compatible
=
"ams,as3722-regulator"
,
},
{},
};
MODULE_DEVICE_TABLE
(
of
,
of_as3722_regulator_match
);
static
struct
platform_driver
as3722_regulator_driver
=
{
.
driver
=
{
.
name
=
"as3722-regulator"
,
.
owner
=
THIS_MODULE
,
.
of_match_table
=
of_as3722_regulator_match
,
},
.
probe
=
as3722_regulator_probe
,
};
module_platform_driver
(
as3722_regulator_driver
);
MODULE_ALIAS
(
"platform:as3722-regulator"
);
MODULE_DESCRIPTION
(
"AS3722 regulator driver"
);
MODULE_AUTHOR
(
"Florian Lobmaier <florian.lobmaier@ams.com>"
);
MODULE_AUTHOR
(
"Laxman Dewangan <ldewangan@nvidia.com>"
);
MODULE_LICENSE
(
"GPL"
);
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