You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'mfd-for-linus-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd
Pull MFD updates from Lee Jones:
"New Drivers:
- Add new driver for MAXIM MAX77620/MAX20024 PMIC
- Add new driver for Hisilicon HI665X PMIC
New Device Support:
- Add support for AXP809 in axp20x-rsb
- Add support for Power Supply in axp20x
New core features:
- devm_mfd_* managed resources
Fix-ups:
- Remove unused code (da9063-irq, wm8400-core, tps6105x,
smsc-ece1099, twl4030-power)
- Improve clean-up in error path (intel_quark_i2c_gpio)
- Explicitly include headers (syscon.h)
- Allow building as modules (max77693)
- Use IS_ENABLED() instead of rolling your own (dm355evm_msp,
wm8400-core)
- DT adaptions (axp20x, hi655x, arizona, max77620)
- Remove CLK_IS_ROOT flag (intel-lpss, intel_quark)
- Move to gpiochip API (asic3, dm355evm_msp, htc-egpio, htc-i2cpld,
sm501, tc6393xb, tps65010, ucb1x00, vexpress)
- Make use of devm_mfd_* calls (act8945a, as3711, atmel-hlcdc,
bcm590xx, hi6421-pmic-core, lp3943, menf21bmc, mt6397, rdc321x,
rk808, rn5t618, rt5033, sky81452, stw481x, tps6507x, tps65217,
wm8400)
Bug Fixes"
- Fix ACPI child matching (mfd-core)
- Fix start-up ordering issues (mt6397-core, arizona-core)
- Fix forgotten register state on resume (intel-lpss)
- Fix Clock related issues (twl6040)
- Fix scheduling whilst atomic (omap-usb-tll)
- Kconfig changes (vexpress)"
* tag 'mfd-for-linus-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd: (73 commits)
mfd: hi655x: Add MFD driver for hi655x
mfd: ab8500-debugfs: Trivial fix of spelling mistake on "between"
mfd: vexpress: Add !ARCH_USES_GETTIMEOFFSET dependency
mfd: Add device-tree binding doc for PMIC MAX77620/MAX20024
mfd: max77620: Add core driver for MAX77620/MAX20024
mfd: arizona: Add defines for GPSW values that can be used from DT
mfd: omap-usb-tll: Fix scheduling while atomic BUG
mfd: wm5110: ARIZONA_CLOCK_CONTROL should be volatile
mfd: axp20x: Add a cell for the ac power_supply part of the axp20x PMICs
mfd: intel_soc_pmic_core: Terminate panel control GPIO lookup table correctly
mfd: wl1273-core: Use devm_mfd_add_devices() for mfd_device registration
mfd: tps65910: Use devm_mfd_add_devices and devm_regmap_add_irq_chip
mfd: sec: Use devm_mfd_add_devices and devm_regmap_add_irq_chip
mfd: rc5t583: Use devm_mfd_add_devices and devm_request_threaded_irq
mfd: max77686: Use devm_mfd_add_devices and devm_regmap_add_irq_chip
mfd: as3722: Use devm_mfd_add_devices and devm_regmap_add_irq_chip
mfd: twl4030-power: Remove driver path in file comment
MAINTAINERS: Add entry for X-Powers AXP family PMIC drivers
mfd: smsc-ece1099: Remove unnecessarily remove callback
mfd: Use IS_ENABLED(CONFIG_FOO) instead of checking FOO || FOO_MODULE
...
This commit is contained in:
@@ -6,10 +6,11 @@ axp202 (X-Powers)
|
||||
axp209 (X-Powers)
|
||||
axp221 (X-Powers)
|
||||
axp223 (X-Powers)
|
||||
axp809 (X-Powers)
|
||||
|
||||
Required properties:
|
||||
- compatible: "x-powers,axp152", "x-powers,axp202", "x-powers,axp209",
|
||||
"x-powers,axp221", "x-powers,axp223"
|
||||
"x-powers,axp221", "x-powers,axp223", "x-powers,axp809"
|
||||
- reg: The I2C slave address or RSB hardware address for the AXP chip
|
||||
- interrupt-parent: The parent interrupt controller
|
||||
- interrupts: SoC NMI / GPIO interrupt connected to the PMIC's IRQ pin
|
||||
@@ -18,7 +19,9 @@ Required properties:
|
||||
|
||||
Optional properties:
|
||||
- x-powers,dcdc-freq: defines the work frequency of DC-DC in KHz
|
||||
(range: 750-1875). Default: 1.5MHz
|
||||
AXP152/20X: range: 750-1875, Default: 1.5 MHz
|
||||
AXP22X/80X: range: 1800-4050, Default: 3 MHz
|
||||
|
||||
- <input>-supply: a phandle to the regulator supply node. May be omitted if
|
||||
inputs are unregulated, such as using the IPSOUT output
|
||||
from the PMIC.
|
||||
@@ -77,6 +80,30 @@ LDO_IO0 : LDO : ips-supply : GPIO 0
|
||||
LDO_IO1 : LDO : ips-supply : GPIO 1
|
||||
RTC_LDO : LDO : ips-supply : always on
|
||||
|
||||
AXP809 regulators, type, and corresponding input supply names:
|
||||
|
||||
Regulator Type Supply Name Notes
|
||||
--------- ---- ----------- -----
|
||||
DCDC1 : DC-DC buck : vin1-supply
|
||||
DCDC2 : DC-DC buck : vin2-supply
|
||||
DCDC3 : DC-DC buck : vin3-supply
|
||||
DCDC4 : DC-DC buck : vin4-supply
|
||||
DCDC5 : DC-DC buck : vin5-supply
|
||||
DC1SW : On/Off Switch : : DCDC1 secondary output
|
||||
DC5LDO : LDO : : input from DCDC5
|
||||
ALDO1 : LDO : aldoin-supply : shared supply
|
||||
ALDO2 : LDO : aldoin-supply : shared supply
|
||||
ALDO3 : LDO : aldoin-supply : shared supply
|
||||
DLDO1 : LDO : dldoin-supply : shared supply
|
||||
DLDO2 : LDO : dldoin-supply : shared supply
|
||||
ELDO1 : LDO : eldoin-supply : shared supply
|
||||
ELDO2 : LDO : eldoin-supply : shared supply
|
||||
ELDO3 : LDO : eldoin-supply : shared supply
|
||||
LDO_IO0 : LDO : ips-supply : GPIO 0
|
||||
LDO_IO1 : LDO : ips-supply : GPIO 1
|
||||
RTC_LDO : LDO : ips-supply : always on
|
||||
SW : On/Off Switch : swin-supply
|
||||
|
||||
Example:
|
||||
|
||||
axp209: pmic@34 {
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
Hisilicon Hi655x Power Management Integrated Circuit (PMIC)
|
||||
|
||||
The hardware layout for access PMIC Hi655x from AP SoC Hi6220.
|
||||
Between PMIC Hi655x and Hi6220, the physical signal channel is SSI.
|
||||
We can use memory-mapped I/O to communicate.
|
||||
|
||||
+----------------+ +-------------+
|
||||
| | | |
|
||||
| Hi6220 | SSI bus | Hi655x |
|
||||
| |-------------| |
|
||||
| |(REGMAP_MMIO)| |
|
||||
+----------------+ +-------------+
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "hisilicon,hi655x-pmic".
|
||||
- reg: Base address of PMIC on Hi6220 SoC.
|
||||
- interrupt-controller: Hi655x has internal IRQs (has own IRQ domain).
|
||||
- pmic-gpios: The GPIO used by PMIC IRQ.
|
||||
|
||||
Example:
|
||||
pmic: pmic@f8000000 {
|
||||
compatible = "hisilicon,hi655x-pmic";
|
||||
reg = <0x0 0xf8000000 0x0 0x1000>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
MAX77620 Power management IC from Maxim Semiconductor.
|
||||
|
||||
Required properties:
|
||||
-------------------
|
||||
- compatible: Must be one of
|
||||
"maxim,max77620"
|
||||
"maxim,max20024".
|
||||
- reg: I2C device address.
|
||||
|
||||
Optional properties:
|
||||
-------------------
|
||||
- interrupts: The interrupt on the parent the controller is
|
||||
connected to.
|
||||
- interrupt-controller: Marks the device node as an interrupt controller.
|
||||
- #interrupt-cells: is <2> and their usage is compliant to the 2 cells
|
||||
variant of <../interrupt-controller/interrupts.txt>
|
||||
IRQ numbers for different interrupt source of MAX77620
|
||||
are defined at dt-bindings/mfd/max77620.h.
|
||||
|
||||
Optional subnodes and their properties:
|
||||
=======================================
|
||||
|
||||
Flexible power sequence configurations:
|
||||
--------------------------------------
|
||||
The Flexible Power Sequencer (FPS) allows each regulator to power up under
|
||||
hardware or software control. Additionally, each regulator can power on
|
||||
independently or among a group of other regulators with an adjustable power-up
|
||||
and power-down delays (sequencing). GPIO1, GPIO2, and GPIO3 can be programmed
|
||||
to be part of a sequence allowing external regulators to be sequenced along
|
||||
with internal regulators. 32KHz clock can be programmed to be part of a
|
||||
sequence.
|
||||
|
||||
The flexible sequencing structure consists of two hardware enable inputs
|
||||
(EN0, EN1), and 3 master sequencing timers called FPS0, FPS1 and FPS2.
|
||||
Each master sequencing timer is programmable through its configuration
|
||||
register to have a hardware enable source (EN1 or EN2) or a software enable
|
||||
source (SW). When enabled/disabled, the master sequencing timer generates
|
||||
eight sequencing events on different time periods called slots. The time
|
||||
period between each event is programmable within the configuration register.
|
||||
Each regulator, GPIO1, GPIO2, GPIO3, and 32KHz clock has a flexible power
|
||||
sequence slave register which allows its enable source to be specified as
|
||||
a flexible power sequencer timer or a software bit. When a FPS source of
|
||||
regulators, GPIOs and clocks specifies the enable source to be a flexible
|
||||
power sequencer, the power up and power down delays can be specified in
|
||||
the regulators, GPIOs and clocks flexible power sequencer configuration
|
||||
registers.
|
||||
|
||||
When FPS event cleared (set to LOW), regulators, GPIOs and 32KHz
|
||||
clock are set into following state at the sequencing event that
|
||||
corresponds to its flexible sequencer configuration register.
|
||||
Sleep state: In this state, regulators, GPIOs
|
||||
and 32KHz clock get disabled at
|
||||
the sequencing event.
|
||||
Global Low Power Mode (GLPM): In this state, regulators are set in
|
||||
low power mode at the sequencing event.
|
||||
|
||||
The configuration parameters of FPS is provided through sub-node "fps"
|
||||
and their child for FPS specific. The child node name for FPS are "fps0",
|
||||
"fps1", and "fps2" for FPS0, FPS1 and FPS2 respectively.
|
||||
|
||||
The FPS configurations like FPS source, power up and power down slots for
|
||||
regulators, GPIOs and 32kHz clocks are provided in their respective
|
||||
configuration nodes which is explained in respective sub-system DT
|
||||
binding document.
|
||||
|
||||
There is need for different FPS configuration parameters based on system
|
||||
state like when system state changed from active to suspend or active to
|
||||
power off (shutdown).
|
||||
|
||||
Optional properties:
|
||||
-------------------
|
||||
-maxim,fps-event-source: u32, FPS event source like external
|
||||
hardware input to PMIC i.e. EN0, EN1 or
|
||||
software (SW).
|
||||
The macros are defined on
|
||||
dt-bindings/mfd/max77620.h
|
||||
for different control source.
|
||||
- MAX77620_FPS_EVENT_SRC_EN0
|
||||
for hardware input pin EN0.
|
||||
- MAX77620_FPS_EVENT_SRC_EN1
|
||||
for hardware input pin EN1.
|
||||
- MAX77620_FPS_EVENT_SRC_SW
|
||||
for software control.
|
||||
|
||||
-maxim,shutdown-fps-time-period-us: u32, FPS time period in microseconds
|
||||
when system enters in to shutdown
|
||||
state.
|
||||
|
||||
-maxim,suspend-fps-time-period-us: u32, FPS time period in microseconds
|
||||
when system enters in to suspend state.
|
||||
|
||||
-maxim,device-state-on-disabled-event: u32, describe the PMIC state when FPS
|
||||
event cleared (set to LOW) whether it
|
||||
should go to sleep state or low-power
|
||||
state. Following are valid values:
|
||||
- MAX77620_FPS_INACTIVE_STATE_SLEEP
|
||||
to set the PMIC state to sleep.
|
||||
- MAX77620_FPS_INACTIVE_STATE_LOW_POWER
|
||||
to set the PMIC state to low
|
||||
power.
|
||||
Absence of this property or other value
|
||||
will not change device state when FPS
|
||||
event get cleared.
|
||||
|
||||
Here supported time periods by device in microseconds are as follows:
|
||||
MAX77620 supports 40, 80, 160, 320, 640, 1280, 2560 and 5120 microseconds.
|
||||
MAX20024 supports 20, 40, 80, 160, 320, 640, 1280 and 2540 microseconds.
|
||||
|
||||
For DT binding details of different sub modules like GPIO, pincontrol,
|
||||
regulator, power, please refer respective device-tree binding document
|
||||
under their respective sub-system directories.
|
||||
|
||||
Example:
|
||||
--------
|
||||
#include <dt-bindings/mfd/max77620.h>
|
||||
|
||||
max77620@3c {
|
||||
compatible = "maxim,max77620";
|
||||
reg = <0x3c>;
|
||||
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <0 86 IRQ_TYPE_NONE>;
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
|
||||
fps {
|
||||
fps0 {
|
||||
maxim,shutdown-fps-time-period-us = <1280>;
|
||||
maxim,fps-event-source = <MAX77620_FPS_EVENT_SRC_EN1>;
|
||||
};
|
||||
|
||||
fps1 {
|
||||
maxim,shutdown-fps-time-period-us = <1280>;
|
||||
maxim,fps-event-source = <MAX77620_FPS_EVENT_SRC_EN0>;
|
||||
};
|
||||
|
||||
fps2 {
|
||||
maxim,shutdown-fps-time-period-us = <1280>;
|
||||
maxim,fps-event-source = <MAX77620_FPS_EVENT_SRC_SW>;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -320,6 +320,9 @@ MEM
|
||||
devm_kvasprintf()
|
||||
devm_kzalloc()
|
||||
|
||||
MFD
|
||||
devm_mfd_add_devices()
|
||||
|
||||
PCI
|
||||
pcim_enable_device() : after success, all PCI ops become managed
|
||||
pcim_pin_device() : keep PCI device enabled after release
|
||||
|
||||
@@ -12291,6 +12291,12 @@ F: include/linux/workqueue.h
|
||||
F: kernel/workqueue.c
|
||||
F: Documentation/workqueue.txt
|
||||
|
||||
X-POWERS MULTIFUNCTION PMIC DEVICE DRIVERS
|
||||
M: Chen-Yu Tsai <wens@csie.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
N: axp[128]
|
||||
|
||||
X.25 NETWORK LAYER
|
||||
M: Andrew Hendry <andrew.hendry@gmail.com>
|
||||
L: linux-x25@vger.kernel.org
|
||||
|
||||
+29
-4
@@ -134,7 +134,7 @@ config MFD_CROS_EC
|
||||
select MFD_CORE
|
||||
select CHROME_PLATFORMS
|
||||
select CROS_EC_PROTO
|
||||
depends on X86 || ARM || COMPILE_TEST
|
||||
depends on X86 || ARM || ARM64 || COMPILE_TEST
|
||||
help
|
||||
If you say Y here you get support for the ChromeOS Embedded
|
||||
Controller (EC) providing keyboard, battery and power services.
|
||||
@@ -319,6 +319,16 @@ config MFD_HI6421_PMIC
|
||||
menus in order to enable them.
|
||||
We communicate with the Hi6421 via memory-mapped I/O.
|
||||
|
||||
config MFD_HI655X_PMIC
|
||||
tristate "HiSilicon Hi655X series PMU/Codec IC"
|
||||
depends on ARCH_HISI || COMPILE_TEST
|
||||
depends on OF
|
||||
select MFD_CORE
|
||||
select REGMAP_MMIO
|
||||
select REGMAP_IRQ
|
||||
help
|
||||
Select this option to enable Hisilicon hi655x series pmic driver.
|
||||
|
||||
config HTC_EGPIO
|
||||
bool "HTC EGPIO support"
|
||||
depends on GPIOLIB && ARM
|
||||
@@ -527,6 +537,21 @@ config MFD_MAX14577
|
||||
additional drivers must be enabled in order to use the functionality
|
||||
of the device.
|
||||
|
||||
config MFD_MAX77620
|
||||
bool "Maxim Semiconductor MAX77620 and MAX20024 PMIC Support"
|
||||
depends on I2C=y
|
||||
depends on OF
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
select REGMAP_IRQ
|
||||
select IRQ_DOMAIN
|
||||
help
|
||||
Say yes here to add support for Maxim Semiconductor MAX77620 and
|
||||
MAX20024 which are Power Management IC with General purpose pins,
|
||||
RTC, regulators, clock generator, watchdog etc. This driver
|
||||
provides common support for accessing the device; additional drivers
|
||||
must be enabled in order to use the functionality of the device.
|
||||
|
||||
config MFD_MAX77686
|
||||
tristate "Maxim Semiconductor MAX77686/802 PMIC Support"
|
||||
depends on I2C
|
||||
@@ -543,8 +568,8 @@ config MFD_MAX77686
|
||||
of the device.
|
||||
|
||||
config MFD_MAX77693
|
||||
bool "Maxim Semiconductor MAX77693 PMIC Support"
|
||||
depends on I2C=y
|
||||
tristate "Maxim Semiconductor MAX77693 PMIC Support"
|
||||
depends on I2C
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
select REGMAP_IRQ
|
||||
@@ -1568,7 +1593,7 @@ endmenu
|
||||
|
||||
config MFD_VEXPRESS_SYSREG
|
||||
bool "Versatile Express System Registers"
|
||||
depends on VEXPRESS_CONFIG && GPIOLIB
|
||||
depends on VEXPRESS_CONFIG && GPIOLIB && !ARCH_USES_GETTIMEOFFSET
|
||||
default y
|
||||
select CLKSRC_MMIO
|
||||
select GPIO_GENERIC_PLATFORM
|
||||
|
||||
@@ -128,6 +128,7 @@ obj-$(CONFIG_MFD_DA9063) += da9063.o
|
||||
obj-$(CONFIG_MFD_DA9150) += da9150-core.o
|
||||
|
||||
obj-$(CONFIG_MFD_MAX14577) += max14577.o
|
||||
obj-$(CONFIG_MFD_MAX77620) += max77620.o
|
||||
obj-$(CONFIG_MFD_MAX77686) += max77686.o
|
||||
obj-$(CONFIG_MFD_MAX77693) += max77693.o
|
||||
obj-$(CONFIG_MFD_MAX77843) += max77843.o
|
||||
@@ -195,6 +196,7 @@ obj-$(CONFIG_MFD_STW481X) += stw481x.o
|
||||
obj-$(CONFIG_MFD_IPAQ_MICRO) += ipaq-micro.o
|
||||
obj-$(CONFIG_MFD_MENF21BMC) += menf21bmc.o
|
||||
obj-$(CONFIG_MFD_HI6421_PMIC) += hi6421-pmic-core.o
|
||||
obj-$(CONFIG_MFD_HI655X_PMIC) += hi655x-pmic.o
|
||||
obj-$(CONFIG_MFD_DLN2) += dln2.o
|
||||
obj-$(CONFIG_MFD_RT5033) += rt5033.o
|
||||
obj-$(CONFIG_MFD_SKY81452) += sky81452.o
|
||||
|
||||
+3
-10
@@ -46,8 +46,9 @@ static int act8945a_i2c_probe(struct i2c_client *i2c,
|
||||
|
||||
i2c_set_clientdata(i2c, regmap);
|
||||
|
||||
ret = mfd_add_devices(&i2c->dev, PLATFORM_DEVID_NONE, act8945a_devs,
|
||||
ARRAY_SIZE(act8945a_devs), NULL, 0, NULL);
|
||||
ret = devm_mfd_add_devices(&i2c->dev, PLATFORM_DEVID_NONE,
|
||||
act8945a_devs, ARRAY_SIZE(act8945a_devs),
|
||||
NULL, 0, NULL);
|
||||
if (ret) {
|
||||
dev_err(&i2c->dev, "Failed to add sub devices\n");
|
||||
return ret;
|
||||
@@ -56,13 +57,6 @@ static int act8945a_i2c_probe(struct i2c_client *i2c,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int act8945a_i2c_remove(struct i2c_client *i2c)
|
||||
{
|
||||
mfd_remove_devices(&i2c->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id act8945a_i2c_id[] = {
|
||||
{ "act8945a", 0 },
|
||||
{}
|
||||
@@ -81,7 +75,6 @@ static struct i2c_driver act8945a_i2c_driver = {
|
||||
.of_match_table = of_match_ptr(act8945a_of_match),
|
||||
},
|
||||
.probe = act8945a_i2c_probe,
|
||||
.remove = act8945a_i2c_remove,
|
||||
.id_table = act8945a_i2c_id,
|
||||
};
|
||||
|
||||
|
||||
@@ -908,12 +908,12 @@ static const char * const wm5102_supplies[] = {
|
||||
|
||||
static const struct mfd_cell wm5102_devs[] = {
|
||||
{ .name = "arizona-micsupp" },
|
||||
{ .name = "arizona-gpio" },
|
||||
{
|
||||
.name = "arizona-extcon",
|
||||
.parent_supplies = wm5102_supplies,
|
||||
.num_parent_supplies = 1, /* We only need MICVDD */
|
||||
},
|
||||
{ .name = "arizona-gpio" },
|
||||
{ .name = "arizona-haptics" },
|
||||
{ .name = "arizona-pwm" },
|
||||
{
|
||||
@@ -925,12 +925,12 @@ static const struct mfd_cell wm5102_devs[] = {
|
||||
|
||||
static const struct mfd_cell wm5110_devs[] = {
|
||||
{ .name = "arizona-micsupp" },
|
||||
{ .name = "arizona-gpio" },
|
||||
{
|
||||
.name = "arizona-extcon",
|
||||
.parent_supplies = wm5102_supplies,
|
||||
.num_parent_supplies = 1, /* We only need MICVDD */
|
||||
},
|
||||
{ .name = "arizona-gpio" },
|
||||
{ .name = "arizona-haptics" },
|
||||
{ .name = "arizona-pwm" },
|
||||
{
|
||||
@@ -966,12 +966,12 @@ static const char * const wm8997_supplies[] = {
|
||||
|
||||
static const struct mfd_cell wm8997_devs[] = {
|
||||
{ .name = "arizona-micsupp" },
|
||||
{ .name = "arizona-gpio" },
|
||||
{
|
||||
.name = "arizona-extcon",
|
||||
.parent_supplies = wm8997_supplies,
|
||||
.num_parent_supplies = 1, /* We only need MICVDD */
|
||||
},
|
||||
{ .name = "arizona-gpio" },
|
||||
{ .name = "arizona-haptics" },
|
||||
{ .name = "arizona-pwm" },
|
||||
{
|
||||
@@ -982,12 +982,13 @@ static const struct mfd_cell wm8997_devs[] = {
|
||||
};
|
||||
|
||||
static const struct mfd_cell wm8998_devs[] = {
|
||||
{ .name = "arizona-micsupp" },
|
||||
{ .name = "arizona-gpio" },
|
||||
{
|
||||
.name = "arizona-extcon",
|
||||
.parent_supplies = wm5102_supplies,
|
||||
.num_parent_supplies = 1, /* We only need MICVDD */
|
||||
},
|
||||
{ .name = "arizona-gpio" },
|
||||
{ .name = "arizona-haptics" },
|
||||
{ .name = "arizona-pwm" },
|
||||
{
|
||||
@@ -995,7 +996,6 @@ static const struct mfd_cell wm8998_devs[] = {
|
||||
.parent_supplies = wm5102_supplies,
|
||||
.num_parent_supplies = ARRAY_SIZE(wm5102_supplies),
|
||||
},
|
||||
{ .name = "arizona-micsupp" },
|
||||
};
|
||||
|
||||
int arizona_dev_init(struct arizona *arizona)
|
||||
|
||||
@@ -168,12 +168,15 @@ static struct irq_chip arizona_irq_chip = {
|
||||
.irq_set_wake = arizona_irq_set_wake,
|
||||
};
|
||||
|
||||
static struct lock_class_key arizona_irq_lock_class;
|
||||
|
||||
static int arizona_irq_map(struct irq_domain *h, unsigned int virq,
|
||||
irq_hw_number_t hw)
|
||||
{
|
||||
struct arizona *data = h->host_data;
|
||||
|
||||
irq_set_chip_data(virq, data);
|
||||
irq_set_lockdep_class(virq, &arizona_irq_lock_class);
|
||||
irq_set_chip_and_handler(virq, &arizona_irq_chip, handle_simple_irq);
|
||||
irq_set_nested_thread(virq, 1);
|
||||
irq_set_noprobe(virq);
|
||||
|
||||
+1
-10
@@ -189,7 +189,7 @@ static int as3711_i2c_probe(struct i2c_client *client,
|
||||
as3711_subdevs[AS3711_BACKLIGHT].pdata_size = 0;
|
||||
}
|
||||
|
||||
ret = mfd_add_devices(as3711->dev, -1, as3711_subdevs,
|
||||
ret = devm_mfd_add_devices(as3711->dev, -1, as3711_subdevs,
|
||||
ARRAY_SIZE(as3711_subdevs), NULL, 0, NULL);
|
||||
if (ret < 0)
|
||||
dev_err(&client->dev, "add mfd devices failed: %d\n", ret);
|
||||
@@ -197,14 +197,6 @@ static int as3711_i2c_probe(struct i2c_client *client,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int as3711_i2c_remove(struct i2c_client *client)
|
||||
{
|
||||
struct as3711 *as3711 = i2c_get_clientdata(client);
|
||||
|
||||
mfd_remove_devices(as3711->dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id as3711_i2c_id[] = {
|
||||
{.name = "as3711", .driver_data = 0},
|
||||
{}
|
||||
@@ -218,7 +210,6 @@ static struct i2c_driver as3711_i2c_driver = {
|
||||
.of_match_table = of_match_ptr(as3711_of_match),
|
||||
},
|
||||
.probe = as3711_i2c_probe,
|
||||
.remove = as3711_i2c_remove,
|
||||
.id_table = as3711_i2c_id,
|
||||
};
|
||||
|
||||
|
||||
+5
-18
@@ -385,7 +385,8 @@ static int as3722_i2c_probe(struct i2c_client *i2c,
|
||||
return ret;
|
||||
|
||||
irq_flags = as3722->irq_flags | IRQF_ONESHOT;
|
||||
ret = regmap_add_irq_chip(as3722->regmap, as3722->chip_irq,
|
||||
ret = devm_regmap_add_irq_chip(as3722->dev, as3722->regmap,
|
||||
as3722->chip_irq,
|
||||
irq_flags, -1, &as3722_irq_chip,
|
||||
&as3722->irq_data);
|
||||
if (ret < 0) {
|
||||
@@ -395,33 +396,20 @@ static int as3722_i2c_probe(struct i2c_client *i2c,
|
||||
|
||||
ret = as3722_configure_pullups(as3722);
|
||||
if (ret < 0)
|
||||
goto scrub;
|
||||
return ret;
|
||||
|
||||
ret = mfd_add_devices(&i2c->dev, -1, as3722_devs,
|
||||
ret = devm_mfd_add_devices(&i2c->dev, -1, as3722_devs,
|
||||
ARRAY_SIZE(as3722_devs), NULL, 0,
|
||||
regmap_irq_get_domain(as3722->irq_data));
|
||||
if (ret) {
|
||||
dev_err(as3722->dev, "Failed to add MFD devices: %d\n", ret);
|
||||
goto scrub;
|
||||
return ret;
|
||||
}
|
||||
|
||||
device_init_wakeup(as3722->dev, true);
|
||||
|
||||
dev_dbg(as3722->dev, "AS3722 core driver initialized successfully\n");
|
||||
return 0;
|
||||
|
||||
scrub:
|
||||
regmap_del_irq_chip(as3722->chip_irq, as3722->irq_data);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int as3722_i2c_remove(struct i2c_client *i2c)
|
||||
{
|
||||
struct as3722 *as3722 = i2c_get_clientdata(i2c);
|
||||
|
||||
mfd_remove_devices(as3722->dev);
|
||||
regmap_del_irq_chip(as3722->chip_irq, as3722->irq_data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused as3722_i2c_suspend(struct device *dev)
|
||||
@@ -470,7 +458,6 @@ static struct i2c_driver as3722_i2c_driver = {
|
||||
.pm = &as3722_pm_ops,
|
||||
},
|
||||
.probe = as3722_i2c_probe,
|
||||
.remove = as3722_i2c_remove,
|
||||
.id_table = as3722_i2c_id,
|
||||
};
|
||||
|
||||
|
||||
+5
-5
@@ -446,7 +446,7 @@ static int asic3_gpio_direction(struct gpio_chip *chip,
|
||||
unsigned long flags;
|
||||
struct asic3 *asic;
|
||||
|
||||
asic = container_of(chip, struct asic3, gpio);
|
||||
asic = gpiochip_get_data(chip);
|
||||
gpio_base = ASIC3_GPIO_TO_BASE(offset);
|
||||
|
||||
if (gpio_base > ASIC3_GPIO_D_BASE) {
|
||||
@@ -492,7 +492,7 @@ static int asic3_gpio_get(struct gpio_chip *chip,
|
||||
u32 mask = ASIC3_GPIO_TO_MASK(offset);
|
||||
struct asic3 *asic;
|
||||
|
||||
asic = container_of(chip, struct asic3, gpio);
|
||||
asic = gpiochip_get_data(chip);
|
||||
gpio_base = ASIC3_GPIO_TO_BASE(offset);
|
||||
|
||||
if (gpio_base > ASIC3_GPIO_D_BASE) {
|
||||
@@ -513,7 +513,7 @@ static void asic3_gpio_set(struct gpio_chip *chip,
|
||||
unsigned long flags;
|
||||
struct asic3 *asic;
|
||||
|
||||
asic = container_of(chip, struct asic3, gpio);
|
||||
asic = gpiochip_get_data(chip);
|
||||
gpio_base = ASIC3_GPIO_TO_BASE(offset);
|
||||
|
||||
if (gpio_base > ASIC3_GPIO_D_BASE) {
|
||||
@@ -540,7 +540,7 @@ static void asic3_gpio_set(struct gpio_chip *chip,
|
||||
|
||||
static int asic3_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
struct asic3 *asic = container_of(chip, struct asic3, gpio);
|
||||
struct asic3 *asic = gpiochip_get_data(chip);
|
||||
|
||||
return asic->irq_base + offset;
|
||||
}
|
||||
@@ -595,7 +595,7 @@ static __init int asic3_gpio_probe(struct platform_device *pdev,
|
||||
alt_reg[i]);
|
||||
}
|
||||
|
||||
return gpiochip_add(&asic->gpio);
|
||||
return gpiochip_add_data(&asic->gpio, asic);
|
||||
}
|
||||
|
||||
static int asic3_gpio_remove(struct platform_device *pdev)
|
||||
|
||||
@@ -128,18 +128,11 @@ static int atmel_hlcdc_probe(struct platform_device *pdev)
|
||||
|
||||
dev_set_drvdata(dev, hlcdc);
|
||||
|
||||
return mfd_add_devices(dev, -1, atmel_hlcdc_cells,
|
||||
return devm_mfd_add_devices(dev, -1, atmel_hlcdc_cells,
|
||||
ARRAY_SIZE(atmel_hlcdc_cells),
|
||||
NULL, 0, NULL);
|
||||
}
|
||||
|
||||
static int atmel_hlcdc_remove(struct platform_device *pdev)
|
||||
{
|
||||
mfd_remove_devices(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id atmel_hlcdc_match[] = {
|
||||
{ .compatible = "atmel,at91sam9n12-hlcdc" },
|
||||
{ .compatible = "atmel,at91sam9x5-hlcdc" },
|
||||
@@ -152,7 +145,6 @@ MODULE_DEVICE_TABLE(of, atmel_hlcdc_match);
|
||||
|
||||
static struct platform_driver atmel_hlcdc_driver = {
|
||||
.probe = atmel_hlcdc_probe,
|
||||
.remove = atmel_hlcdc_remove,
|
||||
.driver = {
|
||||
.name = "atmel-hlcdc",
|
||||
.of_match_table = atmel_hlcdc_match,
|
||||
|
||||
@@ -61,6 +61,7 @@ static int axp20x_rsb_remove(struct sunxi_rsb_device *rdev)
|
||||
|
||||
static const struct of_device_id axp20x_rsb_of_match[] = {
|
||||
{ .compatible = "x-powers,axp223", .data = (void *)AXP223_ID },
|
||||
{ .compatible = "x-powers,axp809", .data = (void *)AXP809_ID },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, axp20x_rsb_of_match);
|
||||
|
||||
@@ -37,6 +37,7 @@ static const char * const axp20x_model_names[] = {
|
||||
"AXP221",
|
||||
"AXP223",
|
||||
"AXP288",
|
||||
"AXP809",
|
||||
};
|
||||
|
||||
static const struct regmap_range axp152_writeable_ranges[] = {
|
||||
@@ -85,6 +86,7 @@ static const struct regmap_access_table axp20x_volatile_table = {
|
||||
.n_yes_ranges = ARRAY_SIZE(axp20x_volatile_ranges),
|
||||
};
|
||||
|
||||
/* AXP22x ranges are shared with the AXP809, as they cover the same range */
|
||||
static const struct regmap_range axp22x_writeable_ranges[] = {
|
||||
regmap_reg_range(AXP20X_DATACACHE(0), AXP20X_IRQ5_STATE),
|
||||
regmap_reg_range(AXP20X_DCDC_MODE, AXP22X_BATLOW_THRES1),
|
||||
@@ -128,6 +130,12 @@ static struct resource axp152_pek_resources[] = {
|
||||
DEFINE_RES_IRQ_NAMED(AXP152_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
|
||||
};
|
||||
|
||||
static struct resource axp20x_ac_power_supply_resources[] = {
|
||||
DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_PLUGIN, "ACIN_PLUGIN"),
|
||||
DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_REMOVAL, "ACIN_REMOVAL"),
|
||||
DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_OVER_V, "ACIN_OVER_V"),
|
||||
};
|
||||
|
||||
static struct resource axp20x_pek_resources[] = {
|
||||
{
|
||||
.name = "PEK_DBR",
|
||||
@@ -211,6 +219,20 @@ static struct resource axp288_fuel_gauge_resources[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource axp809_pek_resources[] = {
|
||||
{
|
||||
.name = "PEK_DBR",
|
||||
.start = AXP809_IRQ_PEK_RIS_EDGE,
|
||||
.end = AXP809_IRQ_PEK_RIS_EDGE,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
}, {
|
||||
.name = "PEK_DBF",
|
||||
.start = AXP809_IRQ_PEK_FAL_EDGE,
|
||||
.end = AXP809_IRQ_PEK_FAL_EDGE,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct regmap_config axp152_regmap_config = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 8,
|
||||
@@ -378,6 +400,41 @@ static const struct regmap_irq axp288_regmap_irqs[] = {
|
||||
INIT_REGMAP_IRQ(AXP288, BC_USB_CHNG, 5, 1),
|
||||
};
|
||||
|
||||
static const struct regmap_irq axp809_regmap_irqs[] = {
|
||||
INIT_REGMAP_IRQ(AXP809, ACIN_OVER_V, 0, 7),
|
||||
INIT_REGMAP_IRQ(AXP809, ACIN_PLUGIN, 0, 6),
|
||||
INIT_REGMAP_IRQ(AXP809, ACIN_REMOVAL, 0, 5),
|
||||
INIT_REGMAP_IRQ(AXP809, VBUS_OVER_V, 0, 4),
|
||||
INIT_REGMAP_IRQ(AXP809, VBUS_PLUGIN, 0, 3),
|
||||
INIT_REGMAP_IRQ(AXP809, VBUS_REMOVAL, 0, 2),
|
||||
INIT_REGMAP_IRQ(AXP809, VBUS_V_LOW, 0, 1),
|
||||
INIT_REGMAP_IRQ(AXP809, BATT_PLUGIN, 1, 7),
|
||||
INIT_REGMAP_IRQ(AXP809, BATT_REMOVAL, 1, 6),
|
||||
INIT_REGMAP_IRQ(AXP809, BATT_ENT_ACT_MODE, 1, 5),
|
||||
INIT_REGMAP_IRQ(AXP809, BATT_EXIT_ACT_MODE, 1, 4),
|
||||
INIT_REGMAP_IRQ(AXP809, CHARG, 1, 3),
|
||||
INIT_REGMAP_IRQ(AXP809, CHARG_DONE, 1, 2),
|
||||
INIT_REGMAP_IRQ(AXP809, BATT_CHG_TEMP_HIGH, 2, 7),
|
||||
INIT_REGMAP_IRQ(AXP809, BATT_CHG_TEMP_HIGH_END, 2, 6),
|
||||
INIT_REGMAP_IRQ(AXP809, BATT_CHG_TEMP_LOW, 2, 5),
|
||||
INIT_REGMAP_IRQ(AXP809, BATT_CHG_TEMP_LOW_END, 2, 4),
|
||||
INIT_REGMAP_IRQ(AXP809, BATT_ACT_TEMP_HIGH, 2, 3),
|
||||
INIT_REGMAP_IRQ(AXP809, BATT_ACT_TEMP_HIGH_END, 2, 2),
|
||||
INIT_REGMAP_IRQ(AXP809, BATT_ACT_TEMP_LOW, 2, 1),
|
||||
INIT_REGMAP_IRQ(AXP809, BATT_ACT_TEMP_LOW_END, 2, 0),
|
||||
INIT_REGMAP_IRQ(AXP809, DIE_TEMP_HIGH, 3, 7),
|
||||
INIT_REGMAP_IRQ(AXP809, LOW_PWR_LVL1, 3, 1),
|
||||
INIT_REGMAP_IRQ(AXP809, LOW_PWR_LVL2, 3, 0),
|
||||
INIT_REGMAP_IRQ(AXP809, TIMER, 4, 7),
|
||||
INIT_REGMAP_IRQ(AXP809, PEK_RIS_EDGE, 4, 6),
|
||||
INIT_REGMAP_IRQ(AXP809, PEK_FAL_EDGE, 4, 5),
|
||||
INIT_REGMAP_IRQ(AXP809, PEK_SHORT, 4, 4),
|
||||
INIT_REGMAP_IRQ(AXP809, PEK_LONG, 4, 3),
|
||||
INIT_REGMAP_IRQ(AXP809, PEK_OVER_OFF, 4, 2),
|
||||
INIT_REGMAP_IRQ(AXP809, GPIO1_INPUT, 4, 1),
|
||||
INIT_REGMAP_IRQ(AXP809, GPIO0_INPUT, 4, 0),
|
||||
};
|
||||
|
||||
static const struct regmap_irq_chip axp152_regmap_irq_chip = {
|
||||
.name = "axp152_irq_chip",
|
||||
.status_base = AXP152_IRQ1_STATE,
|
||||
@@ -428,6 +485,18 @@ static const struct regmap_irq_chip axp288_regmap_irq_chip = {
|
||||
|
||||
};
|
||||
|
||||
static const struct regmap_irq_chip axp809_regmap_irq_chip = {
|
||||
.name = "axp809",
|
||||
.status_base = AXP20X_IRQ1_STATE,
|
||||
.ack_base = AXP20X_IRQ1_STATE,
|
||||
.mask_base = AXP20X_IRQ1_EN,
|
||||
.mask_invert = true,
|
||||
.init_ack_masked = true,
|
||||
.irqs = axp809_regmap_irqs,
|
||||
.num_irqs = ARRAY_SIZE(axp809_regmap_irqs),
|
||||
.num_regs = 5,
|
||||
};
|
||||
|
||||
static struct mfd_cell axp20x_cells[] = {
|
||||
{
|
||||
.name = "axp20x-pek",
|
||||
@@ -435,6 +504,11 @@ static struct mfd_cell axp20x_cells[] = {
|
||||
.resources = axp20x_pek_resources,
|
||||
}, {
|
||||
.name = "axp20x-regulator",
|
||||
}, {
|
||||
.name = "axp20x-ac-power-supply",
|
||||
.of_compatible = "x-powers,axp202-ac-power-supply",
|
||||
.num_resources = ARRAY_SIZE(axp20x_ac_power_supply_resources),
|
||||
.resources = axp20x_ac_power_supply_resources,
|
||||
}, {
|
||||
.name = "axp20x-usb-power-supply",
|
||||
.of_compatible = "x-powers,axp202-usb-power-supply",
|
||||
@@ -572,6 +646,16 @@ static struct mfd_cell axp288_cells[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct mfd_cell axp809_cells[] = {
|
||||
{
|
||||
.name = "axp20x-pek",
|
||||
.num_resources = ARRAY_SIZE(axp809_pek_resources),
|
||||
.resources = axp809_pek_resources,
|
||||
}, {
|
||||
.name = "axp20x-regulator",
|
||||
},
|
||||
};
|
||||
|
||||
static struct axp20x_dev *axp20x_pm_power_off;
|
||||
static void axp20x_power_off(void)
|
||||
{
|
||||
@@ -631,6 +715,12 @@ int axp20x_match_device(struct axp20x_dev *axp20x)
|
||||
axp20x->regmap_cfg = &axp288_regmap_config;
|
||||
axp20x->regmap_irq_chip = &axp288_regmap_irq_chip;
|
||||
break;
|
||||
case AXP809_ID:
|
||||
axp20x->nr_cells = ARRAY_SIZE(axp809_cells);
|
||||
axp20x->cells = axp809_cells;
|
||||
axp20x->regmap_cfg = &axp22x_regmap_config;
|
||||
axp20x->regmap_irq_chip = &axp809_regmap_irq_chip;
|
||||
break;
|
||||
default:
|
||||
dev_err(dev, "unsupported AXP20X ID %lu\n", axp20x->variant);
|
||||
return -EINVAL;
|
||||
|
||||
@@ -82,7 +82,7 @@ static int bcm590xx_i2c_probe(struct i2c_client *i2c_pri,
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = mfd_add_devices(&i2c_pri->dev, -1, bcm590xx_devs,
|
||||
ret = devm_mfd_add_devices(&i2c_pri->dev, -1, bcm590xx_devs,
|
||||
ARRAY_SIZE(bcm590xx_devs), NULL, 0, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(&i2c_pri->dev, "failed to add sub-devices: %d\n", ret);
|
||||
@@ -96,12 +96,6 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int bcm590xx_i2c_remove(struct i2c_client *i2c)
|
||||
{
|
||||
mfd_remove_devices(&i2c->dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id bcm590xx_of_match[] = {
|
||||
{ .compatible = "brcm,bcm59056" },
|
||||
{ }
|
||||
@@ -120,7 +114,6 @@ static struct i2c_driver bcm590xx_i2c_driver = {
|
||||
.of_match_table = of_match_ptr(bcm590xx_of_match),
|
||||
},
|
||||
.probe = bcm590xx_i2c_probe,
|
||||
.remove = bcm590xx_i2c_remove,
|
||||
.id_table = bcm590xx_i2c_id,
|
||||
};
|
||||
module_i2c_driver(bcm590xx_i2c_driver);
|
||||
|
||||
@@ -25,14 +25,6 @@
|
||||
#define DA9063_REG_EVENT_B_OFFSET 1
|
||||
#define DA9063_REG_EVENT_C_OFFSET 2
|
||||
#define DA9063_REG_EVENT_D_OFFSET 3
|
||||
#define EVENTS_BUF_LEN 4
|
||||
|
||||
static const u8 mask_events_buf[] = { [0 ... (EVENTS_BUF_LEN - 1)] = ~0 };
|
||||
|
||||
struct da9063_irq_data {
|
||||
u16 reg;
|
||||
u8 mask;
|
||||
};
|
||||
|
||||
static const struct regmap_irq da9063_irqs[] = {
|
||||
/* DA9063 event A register */
|
||||
|
||||
@@ -33,25 +33,25 @@
|
||||
* This driver was tested with firmware revision A4.
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_INPUT_DM355EVM) || defined(CONFIG_INPUT_DM355EVM_MODULE)
|
||||
#if IS_ENABLED(CONFIG_INPUT_DM355EVM)
|
||||
#define msp_has_keyboard() true
|
||||
#else
|
||||
#define msp_has_keyboard() false
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
#if IS_ENABLED(CONFIG_LEDS_GPIO)
|
||||
#define msp_has_leds() true
|
||||
#else
|
||||
#define msp_has_leds() false
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTC_DRV_DM355EVM) || defined(CONFIG_RTC_DRV_DM355EVM_MODULE)
|
||||
#if IS_ENABLED(CONFIG_RTC_DRV_DM355EVM)
|
||||
#define msp_has_rtc() true
|
||||
#else
|
||||
#define msp_has_rtc() false
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_VIDEO_TVP514X) || defined(CONFIG_VIDEO_TVP514X_MODULE)
|
||||
#if IS_ENABLED(CONFIG_VIDEO_TVP514X)
|
||||
#define msp_has_tvp() true
|
||||
#else
|
||||
#define msp_has_tvp() false
|
||||
@@ -260,7 +260,7 @@ static int add_children(struct i2c_client *client)
|
||||
|
||||
/* GPIO-ish stuff */
|
||||
dm355evm_msp_gpio.parent = &client->dev;
|
||||
status = gpiochip_add(&dm355evm_msp_gpio);
|
||||
status = gpiochip_add_data(&dm355evm_msp_gpio, NULL);
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ static int hi6421_pmic_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, pmic);
|
||||
|
||||
ret = mfd_add_devices(&pdev->dev, 0, hi6421_devs,
|
||||
ret = devm_mfd_add_devices(&pdev->dev, 0, hi6421_devs,
|
||||
ARRAY_SIZE(hi6421_devs), NULL, 0, NULL);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "add mfd devices failed: %d\n", ret);
|
||||
@@ -86,13 +86,6 @@ static int hi6421_pmic_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hi6421_pmic_remove(struct platform_device *pdev)
|
||||
{
|
||||
mfd_remove_devices(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id of_hi6421_pmic_match_tbl[] = {
|
||||
{ .compatible = "hisilicon,hi6421-pmic", },
|
||||
{ },
|
||||
@@ -105,7 +98,6 @@ static struct platform_driver hi6421_pmic_driver = {
|
||||
.of_match_table = of_hi6421_pmic_match_tbl,
|
||||
},
|
||||
.probe = hi6421_pmic_probe,
|
||||
.remove = hi6421_pmic_remove,
|
||||
};
|
||||
module_platform_driver(hi6421_pmic_driver);
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user