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
f5ace555
Commit
f5ace555
authored
Jul 04, 2024
by
Lee Jones
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'ib-mfd-input-regulator-6.11' into ibs-for-mfd-merged
parents
2d21e974
f53d3efa
Changes
12
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
820 additions
and
0 deletions
+820
-0
Documentation/devicetree/bindings/mfd/marvell,88pm886-a1.yaml
...mentation/devicetree/bindings/mfd/marvell,88pm886-a1.yaml
+76
-0
MAINTAINERS
MAINTAINERS
+9
-0
drivers/input/misc/88pm886-onkey.c
drivers/input/misc/88pm886-onkey.c
+98
-0
drivers/input/misc/Kconfig
drivers/input/misc/Kconfig
+7
-0
drivers/input/misc/Makefile
drivers/input/misc/Makefile
+1
-0
drivers/mfd/88pm886.c
drivers/mfd/88pm886.c
+148
-0
drivers/mfd/Kconfig
drivers/mfd/Kconfig
+12
-0
drivers/mfd/Makefile
drivers/mfd/Makefile
+1
-0
drivers/regulator/88pm886-regulator.c
drivers/regulator/88pm886-regulator.c
+392
-0
drivers/regulator/Kconfig
drivers/regulator/Kconfig
+6
-0
drivers/regulator/Makefile
drivers/regulator/Makefile
+1
-0
include/linux/mfd/88pm886.h
include/linux/mfd/88pm886.h
+69
-0
No files found.
Documentation/devicetree/bindings/mfd/marvell,88pm886-a1.yaml
0 → 100644
View file @
f5ace555
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML
1.2
---
$id
:
http://devicetree.org/schemas/mfd/marvell,88pm886-a1.yaml#
$schema
:
http://devicetree.org/meta-schemas/core.yaml#
title
:
Marvell 88PM886 PMIC core
maintainers
:
-
Karel Balej <balejk@matfyz.cz>
description
:
Marvell 88PM886 is a PMIC providing several functions such as onkey,
regulators or battery and charger.
properties
:
compatible
:
const
:
marvell,88pm886-a1
reg
:
maxItems
:
1
interrupts
:
maxItems
:
1
wakeup-source
:
true
regulators
:
type
:
object
additionalProperties
:
false
patternProperties
:
"
^(ldo(1[0-6]|[1-9])|buck[1-5])$"
:
type
:
object
$ref
:
/schemas/regulator/regulator.yaml#
description
:
LDO or buck regulator.
unevaluatedProperties
:
false
required
:
-
compatible
-
reg
-
interrupts
additionalProperties
:
false
examples
:
-
|
#include <dt-bindings/interrupt-controller/irq.h>
i2c {
#address-cells = <1>;
#size-cells = <0>;
pmic@30 {
compatible = "marvell,88pm886-a1";
reg = <0x30>;
interrupts = <0 4 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&gic>;
wakeup-source;
regulators {
ldo2: ldo2 {
regulator-min-microvolt = <3100000>;
regulator-max-microvolt = <3300000>;
};
ldo15: ldo15 {
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
};
buck2: buck2 {
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
};
};
};
};
...
MAINTAINERS
View file @
f5ace555
...
@@ -13312,6 +13312,15 @@ F: drivers/net/dsa/mv88e6xxx/
...
@@ -13312,6 +13312,15 @@ F: drivers/net/dsa/mv88e6xxx/
F: include/linux/dsa/mv88e6xxx.h
F: include/linux/dsa/mv88e6xxx.h
F: include/linux/platform_data/mv88e6xxx.h
F: include/linux/platform_data/mv88e6xxx.h
MARVELL 88PM886 PMIC DRIVER
M: Karel Balej <balejk@matfyz.cz>
S: Maintained
F: Documentation/devicetree/bindings/mfd/marvell,88pm886-a1.yaml
F: drivers/input/misc/88pm886-onkey.c
F: drivers/mfd/88pm886.c
F: drivers/regulators/88pm886-regulator.c
F: include/linux/mfd/88pm886.h
MARVELL ARMADA 3700 PHY DRIVERS
MARVELL ARMADA 3700 PHY DRIVERS
M: Miquel Raynal <miquel.raynal@bootlin.com>
M: Miquel Raynal <miquel.raynal@bootlin.com>
S: Maintained
S: Maintained
...
...
drivers/input/misc/88pm886-onkey.c
0 → 100644
View file @
f5ace555
// SPDX-License-Identifier: GPL-2.0-only
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/mfd/88pm886.h>
struct
pm886_onkey
{
struct
input_dev
*
idev
;
struct
pm886_chip
*
chip
;
};
static
irqreturn_t
pm886_onkey_irq_handler
(
int
irq
,
void
*
data
)
{
struct
pm886_onkey
*
onkey
=
data
;
struct
regmap
*
regmap
=
onkey
->
chip
->
regmap
;
struct
input_dev
*
idev
=
onkey
->
idev
;
struct
device
*
parent
=
idev
->
dev
.
parent
;
unsigned
int
val
;
int
err
;
err
=
regmap_read
(
regmap
,
PM886_REG_STATUS1
,
&
val
);
if
(
err
)
{
dev_err
(
parent
,
"Failed to read status: %d
\n
"
,
err
);
return
IRQ_NONE
;
}
val
&=
PM886_ONKEY_STS1
;
input_report_key
(
idev
,
KEY_POWER
,
val
);
input_sync
(
idev
);
return
IRQ_HANDLED
;
}
static
int
pm886_onkey_probe
(
struct
platform_device
*
pdev
)
{
struct
pm886_chip
*
chip
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
struct
device
*
dev
=
&
pdev
->
dev
;
struct
pm886_onkey
*
onkey
;
struct
input_dev
*
idev
;
int
irq
,
err
;
onkey
=
devm_kzalloc
(
dev
,
sizeof
(
*
onkey
),
GFP_KERNEL
);
if
(
!
onkey
)
return
-
ENOMEM
;
onkey
->
chip
=
chip
;
irq
=
platform_get_irq
(
pdev
,
0
);
if
(
irq
<
0
)
return
dev_err_probe
(
dev
,
irq
,
"Failed to get IRQ
\n
"
);
idev
=
devm_input_allocate_device
(
dev
);
if
(
!
idev
)
{
dev_err
(
dev
,
"Failed to allocate input device
\n
"
);
return
-
ENOMEM
;
}
onkey
->
idev
=
idev
;
idev
->
name
=
"88pm886-onkey"
;
idev
->
phys
=
"88pm886-onkey/input0"
;
idev
->
id
.
bustype
=
BUS_I2C
;
input_set_capability
(
idev
,
EV_KEY
,
KEY_POWER
);
err
=
devm_request_threaded_irq
(
dev
,
irq
,
NULL
,
pm886_onkey_irq_handler
,
IRQF_ONESHOT
|
IRQF_NO_SUSPEND
,
"onkey"
,
onkey
);
if
(
err
)
return
dev_err_probe
(
dev
,
err
,
"Failed to request IRQ
\n
"
);
err
=
input_register_device
(
idev
);
if
(
err
)
return
dev_err_probe
(
dev
,
err
,
"Failed to register input device
\n
"
);
return
0
;
}
static
const
struct
platform_device_id
pm886_onkey_id_table
[]
=
{
{
"88pm886-onkey"
,
},
{
}
};
MODULE_DEVICE_TABLE
(
platform
,
pm886_onkey_id_table
);
static
struct
platform_driver
pm886_onkey_driver
=
{
.
driver
=
{
.
name
=
"88pm886-onkey"
,
},
.
probe
=
pm886_onkey_probe
,
.
id_table
=
pm886_onkey_id_table
,
};
module_platform_driver
(
pm886_onkey_driver
);
MODULE_DESCRIPTION
(
"Marvell 88PM886 onkey driver"
);
MODULE_AUTHOR
(
"Karel Balej <balejk@matfyz.cz>"
);
MODULE_LICENSE
(
"GPL"
);
drivers/input/misc/Kconfig
View file @
f5ace555
...
@@ -33,6 +33,13 @@ config INPUT_88PM80X_ONKEY
...
@@ -33,6 +33,13 @@ config INPUT_88PM80X_ONKEY
To compile this driver as a module, choose M here: the module
To compile this driver as a module, choose M here: the module
will be called 88pm80x_onkey.
will be called 88pm80x_onkey.
config INPUT_88PM886_ONKEY
tristate "Marvell 88PM886 onkey support"
depends on MFD_88PM886_PMIC
help
Support the onkey of Marvell 88PM886 PMIC as an input device
reporting power button status.
config INPUT_AB8500_PONKEY
config INPUT_AB8500_PONKEY
tristate "AB8500 Pon (PowerOn) Key"
tristate "AB8500 Pon (PowerOn) Key"
depends on AB8500_CORE
depends on AB8500_CORE
...
...
drivers/input/misc/Makefile
View file @
f5ace555
...
@@ -7,6 +7,7 @@
...
@@ -7,6 +7,7 @@
obj-$(CONFIG_INPUT_88PM860X_ONKEY)
+=
88pm860x_onkey.o
obj-$(CONFIG_INPUT_88PM860X_ONKEY)
+=
88pm860x_onkey.o
obj-$(CONFIG_INPUT_88PM80X_ONKEY)
+=
88pm80x_onkey.o
obj-$(CONFIG_INPUT_88PM80X_ONKEY)
+=
88pm80x_onkey.o
obj-$(CONFIG_INPUT_88PM886_ONKEY)
+=
88pm886-onkey.o
obj-$(CONFIG_INPUT_AB8500_PONKEY)
+=
ab8500-ponkey.o
obj-$(CONFIG_INPUT_AB8500_PONKEY)
+=
ab8500-ponkey.o
obj-$(CONFIG_INPUT_AD714X)
+=
ad714x.o
obj-$(CONFIG_INPUT_AD714X)
+=
ad714x.o
obj-$(CONFIG_INPUT_AD714X_I2C)
+=
ad714x-i2c.o
obj-$(CONFIG_INPUT_AD714X_I2C)
+=
ad714x-i2c.o
...
...
drivers/mfd/88pm886.c
0 → 100644
View file @
f5ace555
// SPDX-License-Identifier: GPL-2.0-only
#include <linux/i2c.h>
#include <linux/mfd/core.h>
#include <linux/module.h>
#include <linux/notifier.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/reboot.h>
#include <linux/regmap.h>
#include <linux/mfd/88pm886.h>
static
const
struct
regmap_config
pm886_regmap_config
=
{
.
reg_bits
=
8
,
.
val_bits
=
8
,
.
max_register
=
PM886_REG_RTC_SPARE6
,
};
static
struct
regmap_irq
pm886_regmap_irqs
[]
=
{
REGMAP_IRQ_REG
(
PM886_IRQ_ONKEY
,
0
,
PM886_INT_ENA1_ONKEY
),
};
static
struct
regmap_irq_chip
pm886_regmap_irq_chip
=
{
.
name
=
"88pm886"
,
.
irqs
=
pm886_regmap_irqs
,
.
num_irqs
=
ARRAY_SIZE
(
pm886_regmap_irqs
),
.
num_regs
=
4
,
.
status_base
=
PM886_REG_INT_STATUS1
,
.
ack_base
=
PM886_REG_INT_STATUS1
,
.
unmask_base
=
PM886_REG_INT_ENA_1
,
};
static
struct
resource
pm886_onkey_resources
[]
=
{
DEFINE_RES_IRQ_NAMED
(
PM886_IRQ_ONKEY
,
"88pm886-onkey"
),
};
static
struct
mfd_cell
pm886_devs
[]
=
{
MFD_CELL_RES
(
"88pm886-onkey"
,
pm886_onkey_resources
),
MFD_CELL_NAME
(
"88pm886-regulator"
),
};
static
int
pm886_power_off_handler
(
struct
sys_off_data
*
sys_off_data
)
{
struct
pm886_chip
*
chip
=
sys_off_data
->
cb_data
;
struct
regmap
*
regmap
=
chip
->
regmap
;
struct
device
*
dev
=
&
chip
->
client
->
dev
;
int
err
;
err
=
regmap_update_bits
(
regmap
,
PM886_REG_MISC_CONFIG1
,
PM886_SW_PDOWN
,
PM886_SW_PDOWN
);
if
(
err
)
{
dev_err
(
dev
,
"Failed to power off the device: %d
\n
"
,
err
);
return
NOTIFY_BAD
;
}
return
NOTIFY_DONE
;
}
static
int
pm886_setup_irq
(
struct
pm886_chip
*
chip
,
struct
regmap_irq_chip_data
**
irq_data
)
{
struct
regmap
*
regmap
=
chip
->
regmap
;
struct
device
*
dev
=
&
chip
->
client
->
dev
;
int
err
;
/* Set interrupt clearing mode to clear on write. */
err
=
regmap_update_bits
(
regmap
,
PM886_REG_MISC_CONFIG2
,
PM886_INT_INV
|
PM886_INT_CLEAR
|
PM886_INT_MASK_MODE
,
PM886_INT_WC
);
if
(
err
)
{
dev_err
(
dev
,
"Failed to set interrupt clearing mode: %d
\n
"
,
err
);
return
err
;
}
err
=
devm_regmap_add_irq_chip
(
dev
,
regmap
,
chip
->
client
->
irq
,
IRQF_ONESHOT
,
0
,
&
pm886_regmap_irq_chip
,
irq_data
);
if
(
err
)
{
dev_err
(
dev
,
"Failed to request IRQ: %d
\n
"
,
err
);
return
err
;
}
return
0
;
}
static
int
pm886_probe
(
struct
i2c_client
*
client
)
{
struct
regmap_irq_chip_data
*
irq_data
;
struct
device
*
dev
=
&
client
->
dev
;
struct
pm886_chip
*
chip
;
struct
regmap
*
regmap
;
unsigned
int
chip_id
;
int
err
;
chip
=
devm_kzalloc
(
dev
,
sizeof
(
*
chip
),
GFP_KERNEL
);
if
(
!
chip
)
return
-
ENOMEM
;
chip
->
client
=
client
;
chip
->
chip_id
=
(
uintptr_t
)
device_get_match_data
(
dev
);
i2c_set_clientdata
(
client
,
chip
);
regmap
=
devm_regmap_init_i2c
(
client
,
&
pm886_regmap_config
);
if
(
IS_ERR
(
regmap
))
return
dev_err_probe
(
dev
,
PTR_ERR
(
regmap
),
"Failed to initialize regmap
\n
"
);
chip
->
regmap
=
regmap
;
err
=
regmap_read
(
regmap
,
PM886_REG_ID
,
&
chip_id
);
if
(
err
)
return
dev_err_probe
(
dev
,
err
,
"Failed to read chip ID
\n
"
);
if
(
chip
->
chip_id
!=
chip_id
)
return
dev_err_probe
(
dev
,
-
EINVAL
,
"Unsupported chip: 0x%x
\n
"
,
chip_id
);
err
=
pm886_setup_irq
(
chip
,
&
irq_data
);
if
(
err
)
return
err
;
err
=
devm_mfd_add_devices
(
dev
,
PLATFORM_DEVID_NONE
,
pm886_devs
,
ARRAY_SIZE
(
pm886_devs
),
NULL
,
0
,
regmap_irq_get_domain
(
irq_data
));
if
(
err
)
return
dev_err_probe
(
dev
,
err
,
"Failed to add devices
\n
"
);
err
=
devm_register_power_off_handler
(
dev
,
pm886_power_off_handler
,
chip
);
if
(
err
)
return
dev_err_probe
(
dev
,
err
,
"Failed to register power off handler
\n
"
);
device_init_wakeup
(
dev
,
device_property_read_bool
(
dev
,
"wakeup-source"
));
return
0
;
}
static
const
struct
of_device_id
pm886_of_match
[]
=
{
{
.
compatible
=
"marvell,88pm886-a1"
,
.
data
=
(
void
*
)
PM886_A1_CHIP_ID
},
{
}
};
MODULE_DEVICE_TABLE
(
of
,
pm886_of_match
);
static
struct
i2c_driver
pm886_i2c_driver
=
{
.
driver
=
{
.
name
=
"88pm886"
,
.
of_match_table
=
pm886_of_match
,
},
.
probe
=
pm886_probe
,
};
module_i2c_driver
(
pm886_i2c_driver
);
MODULE_DESCRIPTION
(
"Marvell 88PM886 PMIC driver"
);
MODULE_AUTHOR
(
"Karel Balej <balejk@matfyz.cz>"
);
MODULE_LICENSE
(
"GPL"
);
drivers/mfd/Kconfig
View file @
f5ace555
...
@@ -794,6 +794,18 @@ config MFD_88PM860X
...
@@ -794,6 +794,18 @@ config MFD_88PM860X
select individual components like voltage regulators, RTC and
select individual components like voltage regulators, RTC and
battery-charger under the corresponding menus.
battery-charger under the corresponding menus.
config MFD_88PM886_PMIC
bool "Marvell 88PM886 PMIC"
depends on I2C=y
depends on OF
select REGMAP_I2C
select REGMAP_IRQ
select MFD_CORE
help
This enables support for Marvell 88PM886 Power Management IC.
This includes the I2C driver and the core APIs _only_, you have to
select individual components like onkey under the corresponding menus.
config MFD_MAX14577
config MFD_MAX14577
tristate "Maxim Semiconductor MAX14577/77836 MUIC + Charger Support"
tristate "Maxim Semiconductor MAX14577/77836 MUIC + Charger Support"
depends on I2C
depends on I2C
...
...
drivers/mfd/Makefile
View file @
f5ace555
...
@@ -7,6 +7,7 @@
...
@@ -7,6 +7,7 @@
obj-$(CONFIG_MFD_88PM860X)
+=
88pm860x.o
obj-$(CONFIG_MFD_88PM860X)
+=
88pm860x.o
obj-$(CONFIG_MFD_88PM800)
+=
88pm800.o 88pm80x.o
obj-$(CONFIG_MFD_88PM800)
+=
88pm800.o 88pm80x.o
obj-$(CONFIG_MFD_88PM805)
+=
88pm805.o 88pm80x.o
obj-$(CONFIG_MFD_88PM805)
+=
88pm805.o 88pm80x.o
obj-$(CONFIG_MFD_88PM886_PMIC)
+=
88pm886.o
obj-$(CONFIG_MFD_ACT8945A)
+=
act8945a.o
obj-$(CONFIG_MFD_ACT8945A)
+=
act8945a.o
obj-$(CONFIG_MFD_SM501)
+=
sm501.o
obj-$(CONFIG_MFD_SM501)
+=
sm501.o
obj-$(CONFIG_ARCH_BCM2835)
+=
bcm2835-pm.o
obj-$(CONFIG_ARCH_BCM2835)
+=
bcm2835-pm.o
...
...
drivers/regulator/88pm886-regulator.c
0 → 100644
View file @
f5ace555
// SPDX-License-Identifier: GPL-2.0-only
#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/regulator/driver.h>
#include <linux/mfd/88pm886.h>
static
const
struct
regmap_config
pm886_regulator_regmap_config
=
{
.
reg_bits
=
8
,
.
val_bits
=
8
,
.
max_register
=
PM886_REG_BUCK5_VOUT
,
};
static
const
struct
regulator_ops
pm886_ldo_ops
=
{
.
list_voltage
=
regulator_list_voltage_table
,
.
map_voltage
=
regulator_map_voltage_iterate
,
.
set_voltage_sel
=
regulator_set_voltage_sel_regmap
,
.
get_voltage_sel
=
regulator_get_voltage_sel_regmap
,
.
enable
=
regulator_enable_regmap
,
.
disable
=
regulator_disable_regmap
,
.
is_enabled
=
regulator_is_enabled_regmap
,
};
static
const
struct
regulator_ops
pm886_buck_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
,
.
enable
=
regulator_enable_regmap
,
.
disable
=
regulator_disable_regmap
,
.
is_enabled
=
regulator_is_enabled_regmap
,
};
static
const
unsigned
int
pm886_ldo_volt_table1
[]
=
{
1700000
,
1800000
,
1900000
,
2500000
,
2800000
,
2900000
,
3100000
,
3300000
,
};
static
const
unsigned
int
pm886_ldo_volt_table2
[]
=
{
1200000
,
1250000
,
1700000
,
1800000
,
1850000
,
1900000
,
2500000
,
2600000
,
2700000
,
2750000
,
2800000
,
2850000
,
2900000
,
3000000
,
3100000
,
3300000
,
};
static
const
unsigned
int
pm886_ldo_volt_table3
[]
=
{
1700000
,
1800000
,
1900000
,
2000000
,
2100000
,
2500000
,
2700000
,
2800000
,
};
static
const
struct
linear_range
pm886_buck_volt_ranges1
[]
=
{
REGULATOR_LINEAR_RANGE
(
600000
,
0
,
79
,
12500
),
REGULATOR_LINEAR_RANGE
(
1600000
,
80
,
84
,
50000
),
};
static
const
struct
linear_range
pm886_buck_volt_ranges2
[]
=
{
REGULATOR_LINEAR_RANGE
(
600000
,
0
,
79
,
12500
),
REGULATOR_LINEAR_RANGE
(
1600000
,
80
,
114
,
50000
),
};
static
struct
regulator_desc
pm886_regulators
[]
=
{
{
.
name
=
"LDO1"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo1"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN1
,
.
enable_mask
=
BIT
(
0
),
.
volt_table
=
pm886_ldo_volt_table1
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table1
),
.
vsel_reg
=
PM886_REG_LDO1_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"LDO2"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo2"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN1
,
.
enable_mask
=
BIT
(
1
),
.
volt_table
=
pm886_ldo_volt_table1
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table1
),
.
vsel_reg
=
PM886_REG_LDO2_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"LDO3"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo3"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN1
,
.
enable_mask
=
BIT
(
2
),
.
volt_table
=
pm886_ldo_volt_table1
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table1
),
.
vsel_reg
=
PM886_REG_LDO3_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"LDO4"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo4"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN1
,
.
enable_mask
=
BIT
(
3
),
.
volt_table
=
pm886_ldo_volt_table2
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table2
),
.
vsel_reg
=
PM886_REG_LDO4_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"LDO5"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo5"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN1
,
.
enable_mask
=
BIT
(
4
),
.
volt_table
=
pm886_ldo_volt_table2
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table2
),
.
vsel_reg
=
PM886_REG_LDO5_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"LDO6"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo6"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN1
,
.
enable_mask
=
BIT
(
5
),
.
volt_table
=
pm886_ldo_volt_table2
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table2
),
.
vsel_reg
=
PM886_REG_LDO6_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"LDO7"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo7"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN1
,
.
enable_mask
=
BIT
(
6
),
.
volt_table
=
pm886_ldo_volt_table2
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table2
),
.
vsel_reg
=
PM886_REG_LDO7_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"LDO8"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo8"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN1
,
.
enable_mask
=
BIT
(
7
),
.
volt_table
=
pm886_ldo_volt_table2
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table2
),
.
vsel_reg
=
PM886_REG_LDO8_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"LDO9"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo9"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN2
,
.
enable_mask
=
BIT
(
0
),
.
volt_table
=
pm886_ldo_volt_table2
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table2
),
.
vsel_reg
=
PM886_REG_LDO9_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"LDO10"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo10"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN2
,
.
enable_mask
=
BIT
(
1
),
.
volt_table
=
pm886_ldo_volt_table2
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table2
),
.
vsel_reg
=
PM886_REG_LDO10_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"LDO11"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo11"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN2
,
.
enable_mask
=
BIT
(
2
),
.
volt_table
=
pm886_ldo_volt_table2
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table2
),
.
vsel_reg
=
PM886_REG_LDO11_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"LDO12"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo12"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN2
,
.
enable_mask
=
BIT
(
3
),
.
volt_table
=
pm886_ldo_volt_table2
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table2
),
.
vsel_reg
=
PM886_REG_LDO12_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"LDO13"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo13"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN2
,
.
enable_mask
=
BIT
(
4
),
.
volt_table
=
pm886_ldo_volt_table2
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table2
),
.
vsel_reg
=
PM886_REG_LDO13_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"LDO14"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo14"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN2
,
.
enable_mask
=
BIT
(
5
),
.
volt_table
=
pm886_ldo_volt_table2
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table2
),
.
vsel_reg
=
PM886_REG_LDO14_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"LDO15"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo15"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN2
,
.
enable_mask
=
BIT
(
6
),
.
volt_table
=
pm886_ldo_volt_table2
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table2
),
.
vsel_reg
=
PM886_REG_LDO15_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"LDO16"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"ldo16"
,
.
ops
=
&
pm886_ldo_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
enable_reg
=
PM886_REG_LDO_EN2
,
.
enable_mask
=
BIT
(
7
),
.
volt_table
=
pm886_ldo_volt_table3
,
.
n_voltages
=
ARRAY_SIZE
(
pm886_ldo_volt_table3
),
.
vsel_reg
=
PM886_REG_LDO16_VOUT
,
.
vsel_mask
=
PM886_LDO_VSEL_MASK
,
},
{
.
name
=
"buck1"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"buck1"
,
.
ops
=
&
pm886_buck_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
n_voltages
=
85
,
.
linear_ranges
=
pm886_buck_volt_ranges1
,
.
n_linear_ranges
=
ARRAY_SIZE
(
pm886_buck_volt_ranges1
),
.
vsel_reg
=
PM886_REG_BUCK1_VOUT
,
.
vsel_mask
=
PM886_BUCK_VSEL_MASK
,
.
enable_reg
=
PM886_REG_BUCK_EN
,
.
enable_mask
=
BIT
(
0
),
},
{
.
name
=
"buck2"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"buck2"
,
.
ops
=
&
pm886_buck_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
n_voltages
=
115
,
.
linear_ranges
=
pm886_buck_volt_ranges2
,
.
n_linear_ranges
=
ARRAY_SIZE
(
pm886_buck_volt_ranges2
),
.
vsel_reg
=
PM886_REG_BUCK2_VOUT
,
.
vsel_mask
=
PM886_BUCK_VSEL_MASK
,
.
enable_reg
=
PM886_REG_BUCK_EN
,
.
enable_mask
=
BIT
(
1
),
},
{
.
name
=
"buck3"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"buck3"
,
.
ops
=
&
pm886_buck_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
n_voltages
=
115
,
.
linear_ranges
=
pm886_buck_volt_ranges2
,
.
n_linear_ranges
=
ARRAY_SIZE
(
pm886_buck_volt_ranges2
),
.
vsel_reg
=
PM886_REG_BUCK3_VOUT
,
.
vsel_mask
=
PM886_BUCK_VSEL_MASK
,
.
enable_reg
=
PM886_REG_BUCK_EN
,
.
enable_mask
=
BIT
(
2
),
},
{
.
name
=
"buck4"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"buck4"
,
.
ops
=
&
pm886_buck_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
n_voltages
=
115
,
.
linear_ranges
=
pm886_buck_volt_ranges2
,
.
n_linear_ranges
=
ARRAY_SIZE
(
pm886_buck_volt_ranges2
),
.
vsel_reg
=
PM886_REG_BUCK4_VOUT
,
.
vsel_mask
=
PM886_BUCK_VSEL_MASK
,
.
enable_reg
=
PM886_REG_BUCK_EN
,
.
enable_mask
=
BIT
(
3
),
},
{
.
name
=
"buck5"
,
.
regulators_node
=
"regulators"
,
.
of_match
=
"buck5"
,
.
ops
=
&
pm886_buck_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
n_voltages
=
115
,
.
linear_ranges
=
pm886_buck_volt_ranges2
,
.
n_linear_ranges
=
ARRAY_SIZE
(
pm886_buck_volt_ranges2
),
.
vsel_reg
=
PM886_REG_BUCK5_VOUT
,
.
vsel_mask
=
PM886_BUCK_VSEL_MASK
,
.
enable_reg
=
PM886_REG_BUCK_EN
,
.
enable_mask
=
BIT
(
4
),
},
};
static
int
pm886_regulator_probe
(
struct
platform_device
*
pdev
)
{
struct
pm886_chip
*
chip
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
struct
regulator_config
rcfg
=
{
};
struct
device
*
dev
=
&
pdev
->
dev
;
struct
regulator_desc
*
rdesc
;
struct
regulator_dev
*
rdev
;
struct
i2c_client
*
page
;
struct
regmap
*
regmap
;
page
=
devm_i2c_new_dummy_device
(
dev
,
chip
->
client
->
adapter
,
chip
->
client
->
addr
+
PM886_PAGE_OFFSET_REGULATORS
);
if
(
IS_ERR
(
page
))
return
dev_err_probe
(
dev
,
PTR_ERR
(
page
),
"Failed to initialize regulators client
\n
"
);
regmap
=
devm_regmap_init_i2c
(
page
,
&
pm886_regulator_regmap_config
);
if
(
IS_ERR
(
regmap
))
return
dev_err_probe
(
dev
,
PTR_ERR
(
regmap
),
"Failed to initialize regulators regmap
\n
"
);
rcfg
.
regmap
=
regmap
;
rcfg
.
dev
=
dev
->
parent
;
for
(
int
i
=
0
;
i
<
ARRAY_SIZE
(
pm886_regulators
);
i
++
)
{
rdesc
=
&
pm886_regulators
[
i
];
rdev
=
devm_regulator_register
(
dev
,
rdesc
,
&
rcfg
);
if
(
IS_ERR
(
rdev
))
return
dev_err_probe
(
dev
,
PTR_ERR
(
rdev
),
"Failed to register %s
\n
"
,
rdesc
->
name
);
}
return
0
;
}
static
const
struct
platform_device_id
pm886_regulator_id_table
[]
=
{
{
"88pm886-regulator"
,
},
{
}
};
MODULE_DEVICE_TABLE
(
platform
,
pm886_regulator_id_table
);
static
struct
platform_driver
pm886_regulator_driver
=
{
.
driver
=
{
.
name
=
"88pm886-regulator"
,
},
.
probe
=
pm886_regulator_probe
,
.
id_table
=
pm886_regulator_id_table
,
};
module_platform_driver
(
pm886_regulator_driver
);
MODULE_DESCRIPTION
(
"Marvell 88PM886 PMIC regulator driver"
);
MODULE_AUTHOR
(
"Karel Balej <balejk@matfyz.cz>"
);
MODULE_LICENSE
(
"GPL"
);
drivers/regulator/Kconfig
View file @
f5ace555
...
@@ -91,6 +91,12 @@ config REGULATOR_88PM8607
...
@@ -91,6 +91,12 @@ config REGULATOR_88PM8607
help
help
This driver supports 88PM8607 voltage regulator chips.
This driver supports 88PM8607 voltage regulator chips.
config REGULATOR_88PM886
tristate "Marvell 88PM886 voltage regulators"
depends on MFD_88PM886_PMIC
help
This driver implements support for Marvell 88PM886 voltage regulators.
config REGULATOR_ACT8865
config REGULATOR_ACT8865
tristate "Active-semi act8865 voltage regulator"
tristate "Active-semi act8865 voltage regulator"
depends on I2C
depends on I2C
...
...
drivers/regulator/Makefile
View file @
f5ace555
...
@@ -14,6 +14,7 @@ obj-$(CONFIG_REGULATOR_USERSPACE_CONSUMER) += userspace-consumer.o
...
@@ -14,6 +14,7 @@ obj-$(CONFIG_REGULATOR_USERSPACE_CONSUMER) += userspace-consumer.o
obj-$(CONFIG_REGULATOR_88PG86X)
+=
88pg86x.o
obj-$(CONFIG_REGULATOR_88PG86X)
+=
88pg86x.o
obj-$(CONFIG_REGULATOR_88PM800)
+=
88pm800-regulator.o
obj-$(CONFIG_REGULATOR_88PM800)
+=
88pm800-regulator.o
obj-$(CONFIG_REGULATOR_88PM8607)
+=
88pm8607.o
obj-$(CONFIG_REGULATOR_88PM8607)
+=
88pm8607.o
obj-$(CONFIG_REGULATOR_88PM886)
+=
88pm886-regulator.o
obj-$(CONFIG_REGULATOR_CROS_EC)
+=
cros-ec-regulator.o
obj-$(CONFIG_REGULATOR_CROS_EC)
+=
cros-ec-regulator.o
obj-$(CONFIG_REGULATOR_CPCAP)
+=
cpcap-regulator.o
obj-$(CONFIG_REGULATOR_CPCAP)
+=
cpcap-regulator.o
obj-$(CONFIG_REGULATOR_AAT2870)
+=
aat2870-regulator.o
obj-$(CONFIG_REGULATOR_AAT2870)
+=
aat2870-regulator.o
...
...
include/linux/mfd/88pm886.h
0 → 100644
View file @
f5ace555
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef __MFD_88PM886_H
#define __MFD_88PM886_H
#include <linux/i2c.h>
#include <linux/regmap.h>
#define PM886_A1_CHIP_ID 0xa1
#define PM886_IRQ_ONKEY 0
#define PM886_PAGE_OFFSET_REGULATORS 1
#define PM886_REG_ID 0x00
#define PM886_REG_STATUS1 0x01
#define PM886_ONKEY_STS1 BIT(0)
#define PM886_REG_INT_STATUS1 0x05
#define PM886_REG_INT_ENA_1 0x0a
#define PM886_INT_ENA1_ONKEY BIT(0)
#define PM886_REG_MISC_CONFIG1 0x14
#define PM886_SW_PDOWN BIT(5)
#define PM886_REG_MISC_CONFIG2 0x15
#define PM886_INT_INV BIT(0)
#define PM886_INT_CLEAR BIT(1)
#define PM886_INT_RC 0x00
#define PM886_INT_WC BIT(1)
#define PM886_INT_MASK_MODE BIT(2)
#define PM886_REG_RTC_SPARE6 0xef
#define PM886_REG_BUCK_EN 0x08
#define PM886_REG_LDO_EN1 0x09
#define PM886_REG_LDO_EN2 0x0a
#define PM886_REG_LDO1_VOUT 0x20
#define PM886_REG_LDO2_VOUT 0x26
#define PM886_REG_LDO3_VOUT 0x2c
#define PM886_REG_LDO4_VOUT 0x32
#define PM886_REG_LDO5_VOUT 0x38
#define PM886_REG_LDO6_VOUT 0x3e
#define PM886_REG_LDO7_VOUT 0x44
#define PM886_REG_LDO8_VOUT 0x4a
#define PM886_REG_LDO9_VOUT 0x50
#define PM886_REG_LDO10_VOUT 0x56
#define PM886_REG_LDO11_VOUT 0x5c
#define PM886_REG_LDO12_VOUT 0x62
#define PM886_REG_LDO13_VOUT 0x68
#define PM886_REG_LDO14_VOUT 0x6e
#define PM886_REG_LDO15_VOUT 0x74
#define PM886_REG_LDO16_VOUT 0x7a
#define PM886_REG_BUCK1_VOUT 0xa5
#define PM886_REG_BUCK2_VOUT 0xb3
#define PM886_REG_BUCK3_VOUT 0xc1
#define PM886_REG_BUCK4_VOUT 0xcf
#define PM886_REG_BUCK5_VOUT 0xdd
#define PM886_LDO_VSEL_MASK 0x0f
#define PM886_BUCK_VSEL_MASK 0x7f
struct
pm886_chip
{
struct
i2c_client
*
client
;
unsigned
int
chip_id
;
struct
regmap
*
regmap
;
};
#endif
/* __MFD_88PM886_H */
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