summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2026-08-21 14:07:20 +0100
committerMark Brown <broonie@kernel.org>2026-08-21 14:07:20 +0100
commitcf8610767e38884b8be533c2e633b2edc03e267a (patch)
tree2d063bdb24ebd9a0dbd9a3900bcadd2875987718 /drivers
parent04e480772ce27c05ffbdcb09b25ef96709b6220d (diff)
parent9d0e4b1ae5b045a2c92b0b9a1c3b268191c219d9 (diff)
downloadlinux-next-cf8610767e38884b8be533c2e633b2edc03e267a.tar.gz
linux-next-cf8610767e38884b8be533c2e633b2edc03e267a.zip
Merge branch 'for-mfd-next' of https://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git
Diffstat (limited to 'drivers')
-rw-r--r--drivers/clk/ux500/clk-prcmu.c20
-rw-r--r--drivers/clk/ux500/u8500_of_clk.c2
-rw-r--r--drivers/cpuidle/cpuidle-ux500.c6
-rw-r--r--drivers/mfd/88pm886.c21
-rw-r--r--drivers/mfd/Kconfig7
-rw-r--r--drivers/mfd/Makefile1
-rw-r--r--drivers/mfd/ab8500-core.c2
-rw-r--r--drivers/mfd/altera-a10sr.c2
-rw-r--r--drivers/mfd/arizona-spi.c12
-rw-r--r--drivers/mfd/axp20x.c2
-rw-r--r--drivers/mfd/cgbc-core.c4
-rw-r--r--drivers/mfd/cros_ec_dev.c18
-rw-r--r--drivers/mfd/cs40l50-spi.c4
-rw-r--r--drivers/mfd/cs42l43-i2c.c2
-rw-r--r--drivers/mfd/cs42l43-sdw.c13
-rw-r--r--drivers/mfd/cs42l43.c30
-rw-r--r--drivers/mfd/da9052-spi.c12
-rw-r--r--drivers/mfd/db8500-prcmu.c6
-rw-r--r--drivers/mfd/intel-m10-bmc-spi.c6
-rw-r--r--drivers/mfd/ipaq-micro.c2
-rw-r--r--drivers/mfd/iqs62x.c2
-rw-r--r--drivers/mfd/macsmc.c8
-rw-r--r--drivers/mfd/madera-spi.c18
-rw-r--r--drivers/mfd/motorola-cpcap.c6
-rw-r--r--drivers/mfd/mt6397-core.c6
-rw-r--r--drivers/mfd/ocelot-spi.c2
-rw-r--r--drivers/mfd/qnap-mcu.c13
-rw-r--r--drivers/mfd/rave-sp.c64
-rw-r--r--drivers/mfd/rk8xx-spi.c2
-rw-r--r--drivers/mfd/rohm-bd71828.c84
-rw-r--r--drivers/mfd/rohm-bd718x7.c84
-rw-r--r--drivers/mfd/rohm-pwrbutton.c112
-rw-r--r--drivers/mfd/rohm-pwrbutton.h12
-rw-r--r--drivers/mfd/rsmu_spi.c12
-rw-r--r--drivers/mfd/si476x-cmd.c1
-rw-r--r--drivers/mfd/si476x-i2c.c47
-rw-r--r--drivers/mfd/sm501.c2
-rw-r--r--drivers/mfd/sprd-sc27xx-spi.c3
-rw-r--r--drivers/mfd/stmpe-spi.c12
-rw-r--r--drivers/mfd/tps65912-spi.c2
-rw-r--r--drivers/mfd/ucb1x00-assabet.c124
-rw-r--r--drivers/mfd/ucb1x00-core.c16
-rw-r--r--drivers/mfd/viperboard.c3
-rw-r--r--drivers/mfd/wm831x-spi.c16
-rw-r--r--drivers/platform/chrome/cros_ec_proto.c30
-rw-r--r--drivers/regulator/db8500-prcmu.c12
-rw-r--r--drivers/thermal/db8500_thermal.c10
-rw-r--r--drivers/watchdog/db8500_wdt.c22
48 files changed, 500 insertions, 397 deletions
diff --git a/drivers/clk/ux500/clk-prcmu.c b/drivers/clk/ux500/clk-prcmu.c
index ddc86551bf57..ac96c46bd1bb 100644
--- a/drivers/clk/ux500/clk-prcmu.c
+++ b/drivers/clk/ux500/clk-prcmu.c
@@ -7,7 +7,7 @@
*/
#include <linux/clk-provider.h>
-#include <linux/mfd/dbx500-prcmu.h>
+#include <linux/mfd/db8500-prcmu.h>
#include <linux/slab.h>
#include <linux/io.h>
#include <linux/err.h>
@@ -35,13 +35,13 @@ static int clk_prcmu_prepare(struct clk_hw *hw)
{
struct clk_prcmu *clk = to_clk_prcmu(hw);
- return prcmu_request_clock(clk->cg_sel, true);
+ return db8500_prcmu_request_clock(clk->cg_sel, true);
}
static void clk_prcmu_unprepare(struct clk_hw *hw)
{
struct clk_prcmu *clk = to_clk_prcmu(hw);
- if (prcmu_request_clock(clk->cg_sel, false))
+ if (db8500_prcmu_request_clock(clk->cg_sel, false))
pr_err("clk_prcmu: %s failed to disable %s.\n", __func__,
clk_hw_get_name(hw));
}
@@ -86,7 +86,7 @@ static int clk_prcmu_opp_prepare(struct clk_hw *hw)
clk->opp_requested = 1;
}
- err = prcmu_request_clock(clk->cg_sel, true);
+ err = db8500_prcmu_request_clock(clk->cg_sel, true);
if (err) {
prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP,
(char *)clk_hw_get_name(hw));
@@ -101,7 +101,7 @@ static void clk_prcmu_opp_unprepare(struct clk_hw *hw)
{
struct clk_prcmu *clk = to_clk_prcmu(hw);
- if (prcmu_request_clock(clk->cg_sel, false)) {
+ if (db8500_prcmu_request_clock(clk->cg_sel, false)) {
pr_err("clk_prcmu: %s failed to disable %s.\n", __func__,
clk_hw_get_name(hw));
return;
@@ -120,7 +120,7 @@ static int clk_prcmu_opp_volt_prepare(struct clk_hw *hw)
struct clk_prcmu *clk = to_clk_prcmu(hw);
if (!clk->opp_requested) {
- err = prcmu_request_ape_opp_100_voltage(true);
+ err = db8500_prcmu_request_ape_opp_100_voltage(true);
if (err) {
pr_err("clk_prcmu: %s fail req APE OPP VOLT for %s.\n",
__func__, clk_hw_get_name(hw));
@@ -129,9 +129,9 @@ static int clk_prcmu_opp_volt_prepare(struct clk_hw *hw)
clk->opp_requested = 1;
}
- err = prcmu_request_clock(clk->cg_sel, true);
+ err = db8500_prcmu_request_clock(clk->cg_sel, true);
if (err) {
- prcmu_request_ape_opp_100_voltage(false);
+ db8500_prcmu_request_ape_opp_100_voltage(false);
clk->opp_requested = 0;
return err;
}
@@ -143,14 +143,14 @@ static void clk_prcmu_opp_volt_unprepare(struct clk_hw *hw)
{
struct clk_prcmu *clk = to_clk_prcmu(hw);
- if (prcmu_request_clock(clk->cg_sel, false)) {
+ if (db8500_prcmu_request_clock(clk->cg_sel, false)) {
pr_err("clk_prcmu: %s failed to disable %s.\n", __func__,
clk_hw_get_name(hw));
return;
}
if (clk->opp_requested) {
- prcmu_request_ape_opp_100_voltage(false);
+ db8500_prcmu_request_ape_opp_100_voltage(false);
clk->opp_requested = 0;
}
}
diff --git a/drivers/clk/ux500/u8500_of_clk.c b/drivers/clk/ux500/u8500_of_clk.c
index 6f78808387b1..d2499815226f 100644
--- a/drivers/clk/ux500/u8500_of_clk.c
+++ b/drivers/clk/ux500/u8500_of_clk.c
@@ -9,7 +9,7 @@
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/clk-provider.h>
-#include <linux/mfd/dbx500-prcmu.h>
+#include <linux/mfd/db8500-prcmu.h>
#include "clk.h"
#include "prcc.h"
diff --git a/drivers/cpuidle/cpuidle-ux500.c b/drivers/cpuidle/cpuidle-ux500.c
index f7d778580e9b..6d6c52c0bcc2 100644
--- a/drivers/cpuidle/cpuidle-ux500.c
+++ b/drivers/cpuidle/cpuidle-ux500.c
@@ -11,7 +11,7 @@
#include <linux/spinlock.h>
#include <linux/atomic.h>
#include <linux/smp.h>
-#include <linux/mfd/dbx500-prcmu.h>
+#include <linux/mfd/db8500-prcmu.h>
#include <linux/platform_data/arm-ux500-pm.h>
#include <linux/platform_device.h>
@@ -66,7 +66,7 @@ static inline int ux500_enter_idle(struct cpuidle_device *dev,
/* Go to the retention state, the prcmu will wait for the
* cpu to go WFI and this is what happens after exiting this
* 'master' critical section */
- if (prcmu_set_power_state(PRCMU_AP_IDLE, true, true))
+ if (db8500_prcmu_set_power_state(PRCMU_AP_IDLE, true, true))
goto out;
/* When we switch to retention, the prcmu is in charge
@@ -109,7 +109,7 @@ static struct cpuidle_driver ux500_idle_driver = {
static int dbx500_cpuidle_probe(struct platform_device *pdev)
{
/* Configure wake up reasons */
- prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) |
+ db8500_prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) |
PRCMU_WAKEUP(ABB));
return cpuidle_register(&ux500_idle_driver, NULL);
diff --git a/drivers/mfd/88pm886.c b/drivers/mfd/88pm886.c
index e411d8dee554..f8401d5e6dbe 100644
--- a/drivers/mfd/88pm886.c
+++ b/drivers/mfd/88pm886.c
@@ -16,6 +16,12 @@ static const struct regmap_config pm886_regmap_config = {
.max_register = PM886_REG_RTC_SPARE6,
};
+static const struct regmap_config pm886_regmap_battery_config = {
+ .reg_bits = 8,
+ .val_bits = 8,
+ .max_register = PM886_REG_CLS_CONFIG1,
+};
+
static const struct regmap_irq pm886_regmap_irqs[] = {
REGMAP_IRQ_REG(PM886_IRQ_ONKEY, 0, PM886_INT_ENA1_ONKEY),
};
@@ -85,10 +91,11 @@ static int pm886_setup_irq(struct pm886_chip *chip,
static int pm886_probe(struct i2c_client *client)
{
+ struct regmap *regmap, *regmap_battery;
struct regmap_irq_chip_data *irq_data;
struct device *dev = &client->dev;
+ struct i2c_client *battery_page;
struct pm886_chip *chip;
- struct regmap *regmap;
unsigned int chip_id;
int err;
@@ -112,6 +119,18 @@ static int pm886_probe(struct i2c_client *client)
if (chip->chip_id != chip_id)
return dev_err_probe(dev, -EINVAL, "Unsupported chip: 0x%x\n", chip_id);
+ battery_page = devm_i2c_new_dummy_device(dev, client->adapter,
+ client->addr + PM886_PAGE_OFFSET_BATTERY);
+ if (IS_ERR(battery_page))
+ return dev_err_probe(dev, PTR_ERR(battery_page),
+ "Failed to initialize battery page\n");
+
+ regmap_battery = devm_regmap_init_i2c(battery_page, &pm886_regmap_battery_config);
+ if (IS_ERR(regmap_battery))
+ return dev_err_probe(dev, PTR_ERR(regmap_battery),
+ "Failed to initialize battery regmap\n");
+ chip->regmap_battery = regmap_battery;
+
err = pm886_setup_irq(chip, &irq_data);
if (err)
return err;
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 763ce6a34782..e4fd4572472f 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1461,7 +1461,6 @@ config MFD_SEC_I2C
config MFD_SI476X_CORE
tristate "Silicon Laboratories 4761/64/68 AM/FM radio."
depends on I2C
- depends on GPIOLIB_LEGACY
select MFD_CORE
select REGMAP_I2C
help
@@ -2208,6 +2207,10 @@ config MFD_STW481X
in various ST Microelectronics and ST-Ericsson embedded
Nomadik series.
+config MFD_ROHM_PWRBUTTON
+ tristate
+ select MFD_CORE
+
config MFD_ROHM_BD718XX
tristate "ROHM BD71837 Power Management IC"
depends on I2C=y
@@ -2215,6 +2218,7 @@ config MFD_ROHM_BD718XX
select REGMAP_I2C
select REGMAP_IRQ
select MFD_CORE
+ select MFD_ROHM_PWRBUTTON
help
Select this option to get support for the ROHM BD71837
Power Management ICs. BD71837 is designed to power processors like
@@ -2228,6 +2232,7 @@ config MFD_ROHM_BD71828
select REGMAP_I2C
select REGMAP_IRQ
select MFD_CORE
+ select MFD_ROHM_PWRBUTTON
help
Select this option to get support for the ROHM BD71815, BD71828,
BD71879, BD72720 and BD73900 Power Management ICs (PMICs). These are
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index dd4bb7e77c33..72d3944b0ad8 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -273,6 +273,7 @@ obj-$(CONFIG_MFD_STM32_TIMERS) += stm32-timers.o
obj-$(CONFIG_MFD_MXS_LRADC) += mxs-lradc.o
obj-$(CONFIG_MFD_SC27XX_PMIC) += sprd-sc27xx-spi.o
obj-$(CONFIG_RAVE_SP_CORE) += rave-sp.o
+obj-$(CONFIG_MFD_ROHM_PWRBUTTON) += rohm-pwrbutton.o
obj-$(CONFIG_MFD_ROHM_BD71828) += rohm-bd71828.o
obj-$(CONFIG_MFD_ROHM_BD718XX) += rohm-bd718x7.o
obj-$(CONFIG_MFD_ROHM_BD957XMUF) += rohm-bd9576.o
diff --git a/drivers/mfd/ab8500-core.c b/drivers/mfd/ab8500-core.c
index f0bc0b5a6f4a..86fa99022cb3 100644
--- a/drivers/mfd/ab8500-core.c
+++ b/drivers/mfd/ab8500-core.c
@@ -19,7 +19,7 @@
#include <linux/mfd/core.h>
#include <linux/mfd/abx500.h>
#include <linux/mfd/abx500/ab8500.h>
-#include <linux/mfd/dbx500-prcmu.h>
+#include <linux/mfd/db8500-prcmu.h>
#include <linux/of.h>
/*
diff --git a/drivers/mfd/altera-a10sr.c b/drivers/mfd/altera-a10sr.c
index d53e433ab5c1..9c0262228655 100644
--- a/drivers/mfd/altera-a10sr.c
+++ b/drivers/mfd/altera-a10sr.c
@@ -155,7 +155,7 @@ MODULE_DEVICE_TABLE(of, altr_a10sr_spi_of_match);
static const struct spi_device_id altr_a10sr_spi_ids[] = {
{ .name = "a10sr" },
- { },
+ { }
};
MODULE_DEVICE_TABLE(spi, altr_a10sr_spi_ids);
diff --git a/drivers/mfd/arizona-spi.c b/drivers/mfd/arizona-spi.c
index eaa2b2bc5dd0..04baf5a1c652 100644
--- a/drivers/mfd/arizona-spi.c
+++ b/drivers/mfd/arizona-spi.c
@@ -255,12 +255,12 @@ static void arizona_spi_remove(struct spi_device *spi)
}
static const struct spi_device_id arizona_spi_ids[] = {
- { "wm5102", WM5102 },
- { "wm5110", WM5110 },
- { "wm8280", WM8280 },
- { "wm1831", WM1831 },
- { "cs47l24", CS47L24 },
- { },
+ { .name = "wm5102", .driver_data = WM5102 },
+ { .name = "wm5110", .driver_data = WM5110 },
+ { .name = "wm8280", .driver_data = WM8280 },
+ { .name = "wm1831", .driver_data = WM1831 },
+ { .name = "cs47l24", .driver_data = CS47L24 },
+ { }
};
MODULE_DEVICE_TABLE(spi, arizona_spi_ids);
diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index 679364189ea5..50df66de24e0 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -1253,7 +1253,7 @@ static int axp20x_power_off(struct sys_off_data *data)
break;
}
- regmap_write(axp20x->regmap, shutdown_reg, AXP20X_OFF);
+ regmap_set_bits(axp20x->regmap, shutdown_reg, AXP20X_OFF);
/* Give capacitors etc. time to drain to avoid kernel panic msg. */
mdelay(500);
diff --git a/drivers/mfd/cgbc-core.c b/drivers/mfd/cgbc-core.c
index 10bb4b414c34..2becaf797646 100644
--- a/drivers/mfd/cgbc-core.c
+++ b/drivers/mfd/cgbc-core.c
@@ -364,9 +364,9 @@ static void cgbc_remove(struct platform_device *pdev)
{
struct cgbc_device_data *cgbc = platform_get_drvdata(pdev);
- cgbc_session_release(cgbc);
-
mfd_remove_devices(&pdev->dev);
+
+ cgbc_session_release(cgbc);
}
static struct platform_driver cgbc_driver = {
diff --git a/drivers/mfd/cros_ec_dev.c b/drivers/mfd/cros_ec_dev.c
index e253c753beb6..529a23b804f7 100644
--- a/drivers/mfd/cros_ec_dev.c
+++ b/drivers/mfd/cros_ec_dev.c
@@ -197,6 +197,17 @@ static int ec_device_probe(struct platform_device *pdev)
ec->features.flags[1] = -1U; /* Not cached yet */
device_initialize(&ec->class_dev);
+ /*
+ * Add the class device
+ */
+ ec->class_dev.class = &cros_class;
+ ec->class_dev.parent = dev;
+ ec->class_dev.release = cros_ec_class_release;
+
+ retval = cros_ec_read_features(ec);
+ if (retval < 0)
+ goto failed;
+
for (i = 0; i < ARRAY_SIZE(cros_mcu_devices); i++) {
/*
* Check whether this is actually a dedicated MCU rather
@@ -214,13 +225,6 @@ static int ec_device_probe(struct platform_device *pdev)
}
}
- /*
- * Add the class device
- */
- ec->class_dev.class = &cros_class;
- ec->class_dev.parent = dev;
- ec->class_dev.release = cros_ec_class_release;
-
retval = dev_set_name(&ec->class_dev, "%s", ec_platform->ec_name);
if (retval) {
dev_err(dev, "dev_set_name failed => %d\n", retval);
diff --git a/drivers/mfd/cs40l50-spi.c b/drivers/mfd/cs40l50-spi.c
index 53526b595a0d..a635951ca6b7 100644
--- a/drivers/mfd/cs40l50-spi.c
+++ b/drivers/mfd/cs40l50-spi.c
@@ -40,8 +40,8 @@ static void cs40l50_spi_remove(struct spi_device *spi)
}
static const struct spi_device_id cs40l50_id_spi[] = {
- { "cs40l50" },
- {}
+ { .name = "cs40l50" },
+ { }
};
MODULE_DEVICE_TABLE(spi, cs40l50_id_spi);
diff --git a/drivers/mfd/cs42l43-i2c.c b/drivers/mfd/cs42l43-i2c.c
index 44ad63129b3f..cbe05c3ea910 100644
--- a/drivers/mfd/cs42l43-i2c.c
+++ b/drivers/mfd/cs42l43-i2c.c
@@ -44,8 +44,6 @@ static int cs42l43_i2c_probe(struct i2c_client *i2c)
cs42l43->dev = &i2c->dev;
cs42l43->irq = i2c->irq;
- /* A device on an I2C is always attached by definition. */
- cs42l43->attached = true;
cs42l43->variant_id = (long)device_get_match_data(cs42l43->dev);
cs42l43->regmap = devm_regmap_init_i2c(i2c, &cs42l43_i2c_regmap);
diff --git a/drivers/mfd/cs42l43-sdw.c b/drivers/mfd/cs42l43-sdw.c
index 1804b942bdb5..0a6999453f32 100644
--- a/drivers/mfd/cs42l43-sdw.c
+++ b/drivers/mfd/cs42l43-sdw.c
@@ -99,17 +99,10 @@ static int cs42l43_sdw_update_status(struct sdw_slave *sdw, enum sdw_slave_statu
sdw_write_no_pm(sdw, CS42L43_GEN_INT_MASK_1,
CS42L43_INT_STAT_GEN1_MASK);
-
- cs42l43->attached = true;
-
- complete(&cs42l43->device_attach);
break;
case SDW_SLAVE_UNATTACHED:
dev_dbg(cs42l43->dev, "Device detach\n");
- cs42l43->attached = false;
-
- reinit_completion(&cs42l43->device_attach);
complete(&cs42l43->device_detach);
break;
default:
@@ -188,9 +181,9 @@ static int cs42l43_sdw_probe(struct sdw_slave *sdw, const struct sdw_device_id *
}
static const struct sdw_device_id cs42l43_sdw_id[] = {
- SDW_SLAVE_ENTRY(0x01FA, 0x4243, (void *) CS42L43_DEVID_VAL),
- SDW_SLAVE_ENTRY(0x01FA, 0x2A3B, (void *) CS42L43B_DEVID_VAL),
- {}
+ SDW_SLAVE_ENTRY(0x01FA, 0x4243, (void *)CS42L43_DEVID_VAL),
+ SDW_SLAVE_ENTRY(0x01FA, 0x2A3B, (void *)CS42L43B_DEVID_VAL),
+ { }
};
MODULE_DEVICE_TABLE(sdw, cs42l43_sdw_id);
diff --git a/drivers/mfd/cs42l43.c b/drivers/mfd/cs42l43.c
index ed6d93893de0..4212ebcca60b 100644
--- a/drivers/mfd/cs42l43.c
+++ b/drivers/mfd/cs42l43.c
@@ -115,14 +115,14 @@ const struct reg_default cs42l43_reg_default[CS42L43_N_DEFAULTS] = {
{ CS42L43_DECIM_HPF_WNF_CTRL2, 0x00000001 },
{ CS42L43_DECIM_HPF_WNF_CTRL3, 0x00000001 },
{ CS42L43_DECIM_HPF_WNF_CTRL4, 0x00000001 },
- { CS42L43B_DECIM_HPF_WNF_CTRL5, 0x00000001 },
- { CS42L43B_DECIM_HPF_WNF_CTRL6, 0x00000001 },
{ CS42L43_DMIC_PDM_CTRL, 0x00000000 },
{ CS42L43_DECIM_VOL_CTRL_CH1_CH2, 0x20122012 },
{ CS42L43_DECIM_VOL_CTRL_CH3_CH4, 0x20122012 },
{ CS42L43B_DECIM_VOL_CTRL_CH1_CH2, 0x20122012 },
{ CS42L43B_DECIM_VOL_CTRL_CH3_CH4, 0x20122012 },
{ CS42L43B_DECIM_VOL_CTRL_CH5_CH6, 0x20122012 },
+ { CS42L43B_DECIM_HPF_WNF_CTRL5, 0x00000001 },
+ { CS42L43B_DECIM_HPF_WNF_CTRL6, 0x00000001 },
{ CS42L43_INTP_VOLUME_CTRL1, 0x00000180 },
{ CS42L43_INTP_VOLUME_CTRL2, 0x00000180 },
{ CS42L43_AMP1_2_VOL_RAMP, 0x00000022 },
@@ -160,10 +160,10 @@ const struct reg_default cs42l43_reg_default[CS42L43_N_DEFAULTS] = {
{ CS42L43_SWIRE_DP2_CH2_INPUT, 0x00000000 },
{ CS42L43_SWIRE_DP3_CH1_INPUT, 0x00000000 },
{ CS42L43_SWIRE_DP3_CH2_INPUT, 0x00000000 },
- { CS42L43B_SWIRE_DP3_CH3_INPUT, 0x00000000 },
- { CS42L43B_SWIRE_DP3_CH4_INPUT, 0x00000000 },
{ CS42L43_SWIRE_DP4_CH1_INPUT, 0x00000000 },
{ CS42L43_SWIRE_DP4_CH2_INPUT, 0x00000000 },
+ { CS42L43B_SWIRE_DP3_CH3_INPUT, 0x00000000 },
+ { CS42L43B_SWIRE_DP3_CH4_INPUT, 0x00000000 },
{ CS42L43B_SWIRE_DP4_CH3_INPUT, 0x00000000 },
{ CS42L43B_SWIRE_DP4_CH4_INPUT, 0x00000000 },
{ CS42L43_ASRC_INT1_INPUT1, 0x00000000 },
@@ -178,14 +178,10 @@ const struct reg_default cs42l43_reg_default[CS42L43_N_DEFAULTS] = {
{ CS42L43_ISRC1INT2_INPUT1, 0x00000000 },
{ CS42L43_ISRC1DEC1_INPUT1, 0x00000000 },
{ CS42L43_ISRC1DEC2_INPUT1, 0x00000000 },
- { CS42L43B_ISRC1DEC3_INPUT1, 0x00000000 },
- { CS42L43B_ISRC1DEC4_INPUT1, 0x00000000 },
{ CS42L43_ISRC2INT1_INPUT1, 0x00000000 },
{ CS42L43_ISRC2INT2_INPUT1, 0x00000000 },
{ CS42L43_ISRC2DEC1_INPUT1, 0x00000000 },
{ CS42L43_ISRC2DEC2_INPUT1, 0x00000000 },
- { CS42L43B_ISRC2DEC3_INPUT1, 0x00000000 },
- { CS42L43B_ISRC2DEC4_INPUT1, 0x00000000 },
{ CS42L43_EQ1MIX_INPUT1, 0x00800000 },
{ CS42L43_EQ1MIX_INPUT2, 0x00800000 },
{ CS42L43_EQ1MIX_INPUT3, 0x00800000 },
@@ -212,6 +208,10 @@ const struct reg_default cs42l43_reg_default[CS42L43_N_DEFAULTS] = {
{ CS42L43_AMP4MIX_INPUT2, 0x00800000 },
{ CS42L43_AMP4MIX_INPUT3, 0x00800000 },
{ CS42L43_AMP4MIX_INPUT4, 0x00800000 },
+ { CS42L43B_ISRC1DEC3_INPUT1, 0x00000000 },
+ { CS42L43B_ISRC1DEC4_INPUT1, 0x00000000 },
+ { CS42L43B_ISRC2DEC3_INPUT1, 0x00000000 },
+ { CS42L43B_ISRC2DEC4_INPUT1, 0x00000000 },
{ CS42L43_ASRC_INT_ENABLES, 0x00000100 },
{ CS42L43_ASRC_DEC_ENABLES, 0x00000100 },
{ CS42L43_PDNCNTL, 0x00000000 },
@@ -586,16 +586,11 @@ static int cs42l43_soft_reset(struct cs42l43 *cs42l43)
*/
static int cs42l43_wait_for_attach(struct cs42l43 *cs42l43)
{
- if (!cs42l43->attached) {
- unsigned long timeout = msecs_to_jiffies(CS42L43_SDW_ATTACH_TIMEOUT_MS);
- unsigned long time;
+ int ret;
- time = wait_for_completion_timeout(&cs42l43->device_attach, timeout);
- if (!time) {
- dev_err(cs42l43->dev, "Timed out waiting for device re-attach\n");
- return -ETIMEDOUT;
- }
- }
+ ret = sdw_slave_wait_for_init(cs42l43->sdw, CS42L43_SDW_ATTACH_TIMEOUT_MS);
+ if (ret)
+ return ret;
regcache_cache_only(cs42l43->regmap, false);
@@ -1120,7 +1115,6 @@ int cs42l43_dev_probe(struct cs42l43 *cs42l43)
dev_set_drvdata(cs42l43->dev, cs42l43);
mutex_init(&cs42l43->pll_lock);
- init_completion(&cs42l43->device_attach);
init_completion(&cs42l43->device_detach);
init_completion(&cs42l43->firmware_download);
INIT_WORK(&cs42l43->boot_work, cs42l43_boot_work);
diff --git a/drivers/mfd/da9052-spi.c b/drivers/mfd/da9052-spi.c
index be5f2b34e18a..29cf2c17fde1 100644
--- a/drivers/mfd/da9052-spi.c
+++ b/drivers/mfd/da9052-spi.c
@@ -63,12 +63,12 @@ static void da9052_spi_remove(struct spi_device *spi)
}
static const struct spi_device_id da9052_spi_id[] = {
- {"da9052", DA9052},
- {"da9053-aa", DA9053_AA},
- {"da9053-ba", DA9053_BA},
- {"da9053-bb", DA9053_BB},
- {"da9053-bc", DA9053_BC},
- {}
+ { .name = "da9052", .driver_data = DA9052 },
+ { .name = "da9053-aa", .driver_data = DA9053_AA },
+ { .name = "da9053-ba", .driver_data = DA9053_BA },
+ { .name = "da9053-bb", .driver_data = DA9053_BB },
+ { .name = "da9053-bc", .driver_data = DA9053_BC },
+ { }
};
static struct spi_driver da9052_spi_driver = {
diff --git a/drivers/mfd/db8500-prcmu.c b/drivers/mfd/db8500-prcmu.c
index 21e68a382b11..6672c55f2ebc 100644
--- a/drivers/mfd/db8500-prcmu.c
+++ b/drivers/mfd/db8500-prcmu.c
@@ -32,7 +32,7 @@
#include <linux/platform_device.h>
#include <linux/uaccess.h>
#include <linux/mfd/core.h>
-#include <linux/mfd/dbx500-prcmu.h>
+#include <linux/mfd/db8500-prcmu.h>
#include <linux/mfd/abx500/ab8500.h>
#include <linux/regulator/db8500-prcmu.h>
#include <linux/regulator/machine.h>
@@ -2285,7 +2285,7 @@ void db8500_prcmu_system_reset(u16 reset_code)
/**
* db8500_prcmu_get_reset_code - Retrieve SW reset reason code
*
- * Retrieves the reset reason code stored by prcmu_system_reset() before
+ * Retrieves the reset reason code stored by db8500_prcmu_system_reset() before
* last restart.
*/
u16 db8500_prcmu_get_reset_code(void)
@@ -3041,7 +3041,7 @@ static int db8500_prcmu_probe(struct platform_device *pdev)
db8500_irq_init(np);
- prcmu_config_esram0_deep_sleep(ESRAM0_DEEP_SLEEP_STATE_RET);
+ db8500_prcmu_config_esram0_deep_sleep(ESRAM0_DEEP_SLEEP_STATE_RET);
err = mfd_add_devices(&pdev->dev, 0, common_prcmu_devs,
ARRAY_SIZE(common_prcmu_devs), NULL, 0, db8500_irq_domain);
diff --git a/drivers/mfd/intel-m10-bmc-spi.c b/drivers/mfd/intel-m10-bmc-spi.c
index cfa620f0c70e..94b9c99bb4f8 100644
--- a/drivers/mfd/intel-m10-bmc-spi.c
+++ b/drivers/mfd/intel-m10-bmc-spi.c
@@ -160,9 +160,9 @@ static const struct intel_m10bmc_platform_info m10bmc_spi_n5010 = {
};
static const struct spi_device_id m10bmc_spi_id[] = {
- { "m10-n3000", (kernel_ulong_t)&m10bmc_spi_n3000 },
- { "m10-d5005", (kernel_ulong_t)&m10bmc_spi_d5005 },
- { "m10-n5010", (kernel_ulong_t)&m10bmc_spi_n5010 },
+ { .name = "m10-n3000", .driver_data = (kernel_ulong_t)&m10bmc_spi_n3000 },
+ { .name = "m10-d5005", .driver_data = (kernel_ulong_t)&m10bmc_spi_d5005 },
+ { .name = "m10-n5010", .driver_data = (kernel_ulong_t)&m10bmc_spi_n5010 },
{ }
};
MODULE_DEVICE_TABLE(spi, m10bmc_spi_id);
diff --git a/drivers/mfd/ipaq-micro.c b/drivers/mfd/ipaq-micro.c
index 4b757d847282..5146a6eb0e5a 100644
--- a/drivers/mfd/ipaq-micro.c
+++ b/drivers/mfd/ipaq-micro.c
@@ -221,7 +221,7 @@ static void ipaq_micro_eeprom_read(struct ipaq_micro *micro,
static char *ipaq_micro_str(u8 *wchar, u8 len)
{
- char retstr[256];
+ char retstr[256] = { 0 };
u8 i;
for (i = 0; i < len / 2; i++)
diff --git a/drivers/mfd/iqs62x.c b/drivers/mfd/iqs62x.c
index ee017617d1d1..412ae7777f72 100644
--- a/drivers/mfd/iqs62x.c
+++ b/drivers/mfd/iqs62x.c
@@ -237,7 +237,7 @@ static int iqs62x_firmware_parse(struct iqs62x_core *iqs62x,
fw_rec = (struct iqs62x_fw_rec *)(fw->data + pos);
pos += sizeof(*fw_rec);
- if (pos + fw_rec->len - 1 > fw->size) {
+ if (!fw_rec->len || fw_rec->len - 1 > fw->size - pos) {
ret = -EINVAL;
break;
}
diff --git a/drivers/mfd/macsmc.c b/drivers/mfd/macsmc.c
index 358feec2d088..514cba7dc897 100644
--- a/drivers/mfd/macsmc.c
+++ b/drivers/mfd/macsmc.c
@@ -410,7 +410,7 @@ static int apple_smc_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct apple_smc *smc;
- u32 count;
+ __be32 count;
int ret;
smc = devm_kzalloc(dev, sizeof(*smc), GFP_KERNEL);
@@ -461,8 +461,10 @@ static int apple_smc_probe(struct platform_device *pdev)
dev_set_drvdata(&pdev->dev, smc);
BLOCKING_INIT_NOTIFIER_HEAD(&smc->event_handlers);
- ret = apple_smc_read_u32(smc, SMC_KEY(#KEY), &count);
- if (ret)
+ ret = apple_smc_read(smc, SMC_KEY(#KEY), &count, sizeof(count));
+ if (ret >= 0 && ret != sizeof(count))
+ ret = -EINVAL;
+ if (ret < 0)
return dev_err_probe(smc->dev, ret, "Failed to get key count");
smc->key_count = be32_to_cpu(count);
diff --git a/drivers/mfd/madera-spi.c b/drivers/mfd/madera-spi.c
index ce9e90322c9c..3fffa21ceadc 100644
--- a/drivers/mfd/madera-spi.c
+++ b/drivers/mfd/madera-spi.c
@@ -112,15 +112,15 @@ static void madera_spi_remove(struct spi_device *spi)
}
static const struct spi_device_id madera_spi_ids[] = {
- { "cs47l15", CS47L15 },
- { "cs47l35", CS47L35 },
- { "cs47l85", CS47L85 },
- { "cs47l90", CS47L90 },
- { "cs47l91", CS47L91 },
- { "cs42l92", CS42L92 },
- { "cs47l92", CS47L92 },
- { "cs47l93", CS47L93 },
- { "wm1840", WM1840 },
+ { .name = "cs47l15", .driver_data = CS47L15 },
+ { .name = "cs47l35", .driver_data = CS47L35 },
+ { .name = "cs47l85", .driver_data = CS47L85 },
+ { .name = "cs47l90", .driver_data = CS47L90 },
+ { .name = "cs47l91", .driver_data = CS47L91 },
+ { .name = "cs42l92", .driver_data = CS42L92 },
+ { .name = "cs47l92", .driver_data = CS47L92 },
+ { .name = "cs47l93", .driver_data = CS47L93 },
+ { .name = "wm1840", .driver_data = WM1840 },
{ }
};
MODULE_DEVICE_TABLE(spi, madera_spi_ids);
diff --git a/drivers/mfd/motorola-cpcap.c b/drivers/mfd/motorola-cpcap.c
index feeccb2c6655..4ed8704c985a 100644
--- a/drivers/mfd/motorola-cpcap.c
+++ b/drivers/mfd/motorola-cpcap.c
@@ -202,9 +202,9 @@ static const struct of_device_id cpcap_of_match[] = {
MODULE_DEVICE_TABLE(of, cpcap_of_match);
static const struct spi_device_id cpcap_spi_ids[] = {
- { .name = "cpcap", },
- { .name = "6556002", },
- {},
+ { .name = "cpcap" },
+ { .name = "6556002" },
+ { }
};
MODULE_DEVICE_TABLE(spi, cpcap_spi_ids);
diff --git a/drivers/mfd/mt6397-core.c b/drivers/mfd/mt6397-core.c
index 1bdacda9a933..9ec951996588 100644
--- a/drivers/mfd/mt6397-core.c
+++ b/drivers/mfd/mt6397-core.c
@@ -125,6 +125,12 @@ static const struct resource mt6323_pwrc_resources[] = {
static const struct mfd_cell mt6323_devs[] = {
{
+ .name = "mt6323-auxadc",
+ .of_compatible = "mediatek,mt6323-auxadc",
+ }, {
+ .name = "mt6323-efuse",
+ .of_compatible = "mediatek,mt6323-efuse",
+ }, {
.name = "mt6323-rtc",
.num_resources = ARRAY_SIZE(mt6323_rtc_resources),
.resources = mt6323_rtc_resources,
diff --git a/drivers/mfd/ocelot-spi.c b/drivers/mfd/ocelot-spi.c
index fc30663824bb..d3ab4868a523 100644
--- a/drivers/mfd/ocelot-spi.c
+++ b/drivers/mfd/ocelot-spi.c
@@ -270,7 +270,7 @@ static int ocelot_spi_probe(struct spi_device *spi)
}
static const struct spi_device_id ocelot_spi_ids[] = {
- { "vsc7512", 0 },
+ { .name = "vsc7512" },
{ }
};
MODULE_DEVICE_TABLE(spi, ocelot_spi_ids);
diff --git a/drivers/mfd/qnap-mcu.c b/drivers/mfd/qnap-mcu.c
index 8de974ddac3e..93a3dd93404d 100644
--- a/drivers/mfd/qnap-mcu.c
+++ b/drivers/mfd/qnap-mcu.c
@@ -56,6 +56,7 @@ struct qnap_mcu_reply {
* @reply: Reply data structure
* @variant: Device variant specific information
* @version: MCU firmware version
+ * @rx: Receive buffer the reply is assembled in
*/
struct qnap_mcu {
struct serdev_device *serdev;
@@ -63,6 +64,7 @@ struct qnap_mcu {
struct qnap_mcu_reply reply;
const struct qnap_mcu_variant *variant;
u8 version[QNAP_MCU_VERSION_LEN];
+ u8 rx[QNAP_MCU_RX_BUFFER_SIZE];
};
/*
@@ -214,19 +216,18 @@ int qnap_mcu_exec(struct qnap_mcu *mcu,
const u8 *cmd_data, size_t cmd_data_size,
u8 *reply_data, size_t reply_data_size)
{
- unsigned char rx[QNAP_MCU_RX_BUFFER_SIZE];
size_t length = reply_data_size + QNAP_MCU_CHECKSUM_SIZE;
struct qnap_mcu_reply *reply = &mcu->reply;
int ret = 0;
- if (length > sizeof(rx)) {
+ if (length > sizeof(mcu->rx)) {
dev_err(&mcu->serdev->dev, "expected data too big for receive buffer");
return -EINVAL;
}
guard(mutex)(&mcu->bus_lock);
- reply->data = rx;
+ reply->data = mcu->rx;
reply->length = length;
reply->received = 0;
reinit_completion(&reply->done);
@@ -242,15 +243,15 @@ int qnap_mcu_exec(struct qnap_mcu *mcu,
return -ETIMEDOUT;
}
- if (!qnap_mcu_verify_checksum(rx, reply->received)) {
+ if (!qnap_mcu_verify_checksum(mcu->rx, reply->received)) {
dev_err(&mcu->serdev->dev, "Invalid Checksum received from controller\n");
return -EPROTO;
}
- if (qnap_mcu_reply_is_any_error(mcu, rx, reply->received))
+ if (qnap_mcu_reply_is_any_error(mcu, mcu->rx, reply->received))
return -EPROTO;
- memcpy(reply_data, rx, reply_data_size);
+ memcpy(reply_data, mcu->rx, reply_data_size);
return 0;
}
diff --git a/drivers/mfd/rave-sp.c b/drivers/mfd/rave-sp.c
index c1b78d127a26..05d26d92df03 100644
--- a/drivers/mfd/rave-sp.c
+++ b/drivers/mfd/rave-sp.c
@@ -63,6 +63,12 @@
#define RAVE_SP_TX_BUFFER_SIZE \
(RAVE_SP_STX_ETX_SIZE + 2 * RAVE_SP_RX_BUFFER_SIZE)
+enum rave_sp_frame_offset {
+ RAVE_SP_FRAME_CODE_OFFSET,
+ RAVE_SP_FRAME_ACK_ID_OFFSET,
+ RAVE_SP_FRAME_DATA_OFFSET,
+};
+
/**
* enum rave_sp_deframer_state - Possible state for de-framer
*
@@ -352,7 +358,7 @@ int rave_sp_exec(struct rave_sp *sp,
int command, ret = 0;
u8 ackid;
- command = sp->variant->cmd.translate(data[0]);
+ command = sp->variant->cmd.translate(data[RAVE_SP_FRAME_CODE_OFFSET]);
if (command < 0)
return command;
@@ -366,8 +372,8 @@ int rave_sp_exec(struct rave_sp *sp,
sp->reply = &reply;
mutex_unlock(&sp->reply_lock);
- data[0] = command;
- data[1] = ackid;
+ data[RAVE_SP_FRAME_CODE_OFFSET] = command;
+ data[RAVE_SP_FRAME_ACK_ID_OFFSET] = ackid;
rave_sp_write(sp, data, data_size);
@@ -388,16 +394,23 @@ EXPORT_SYMBOL_GPL(rave_sp_exec);
static void rave_sp_receive_event(struct rave_sp *sp,
const unsigned char *data, size_t length)
{
- u8 cmd[] = {
- [0] = rave_sp_reply_code(data[0]),
- [1] = data[1],
- };
+ unsigned long action;
+ u8 cmd[RAVE_SP_FRAME_DATA_OFFSET];
+
+ if (length < RAVE_SP_FRAME_DATA_OFFSET + 1) {
+ dev_warn(&sp->serdev->dev, "Dropping short event frame\n");
+ return;
+ }
+
+ cmd[RAVE_SP_FRAME_CODE_OFFSET] =
+ rave_sp_reply_code(data[RAVE_SP_FRAME_CODE_OFFSET]);
+ cmd[RAVE_SP_FRAME_ACK_ID_OFFSET] = data[RAVE_SP_FRAME_ACK_ID_OFFSET];
rave_sp_write(sp, cmd, sizeof(cmd));
- blocking_notifier_call_chain(&sp->event_notifier_list,
- rave_sp_action_pack(data[0], data[2]),
- NULL);
+ action = rave_sp_action_pack(data[RAVE_SP_FRAME_CODE_OFFSET],
+ data[RAVE_SP_FRAME_DATA_OFFSET]);
+ blocking_notifier_call_chain(&sp->event_notifier_list, action, NULL);
}
static void rave_sp_receive_reply(struct rave_sp *sp,
@@ -405,27 +418,35 @@ static void rave_sp_receive_reply(struct rave_sp *sp,
{
struct device *dev = &sp->serdev->dev;
struct rave_sp_reply *reply;
- const size_t payload_length = length - 2;
+ size_t payload_length;
+
+ if (length < RAVE_SP_FRAME_DATA_OFFSET) {
+ dev_warn(dev, "Dropping short reply frame\n");
+ return;
+ }
+ payload_length = length - RAVE_SP_FRAME_DATA_OFFSET;
mutex_lock(&sp->reply_lock);
reply = sp->reply;
if (reply) {
- if (reply->code == data[0] && reply->ackid == data[1] &&
+ if (reply->code == data[RAVE_SP_FRAME_CODE_OFFSET] &&
+ reply->ackid == data[RAVE_SP_FRAME_ACK_ID_OFFSET] &&
payload_length >= reply->length) {
/*
* We are relying on memcpy(dst, src, 0) to be a no-op
* when handling commands that have a no-payload reply
*/
- memcpy(reply->data, &data[2], reply->length);
+ memcpy(reply->data, &data[RAVE_SP_FRAME_DATA_OFFSET],
+ reply->length);
complete(&reply->received);
sp->reply = NULL;
} else {
dev_err(dev, "Ignoring incorrect reply\n");
dev_dbg(dev, "Code: expected = 0x%08x received = 0x%08x\n",
- reply->code, data[0]);
+ reply->code, data[RAVE_SP_FRAME_CODE_OFFSET]);
dev_dbg(dev, "ACK ID: expected = 0x%08x received = 0x%08x\n",
- reply->ackid, data[1]);
+ reply->ackid, data[RAVE_SP_FRAME_ACK_ID_OFFSET]);
dev_dbg(dev, "Length: expected = %zu received = %zu\n",
reply->length, payload_length);
}
@@ -439,10 +460,10 @@ static void rave_sp_receive_frame(struct rave_sp *sp,
size_t length)
{
const size_t checksum_length = sp->variant->checksum->length;
- const size_t payload_length = length - checksum_length;
- const u8 *crc_reported = &data[payload_length];
struct device *dev = &sp->serdev->dev;
u8 crc_calculated[RAVE_SP_CHECKSUM_SIZE];
+ const u8 *crc_reported;
+ size_t payload_length;
if (unlikely(checksum_length > sizeof(crc_calculated))) {
dev_warn(dev, "Checksum too long, dropping\n");
@@ -457,6 +478,9 @@ static void rave_sp_receive_frame(struct rave_sp *sp,
return;
}
+ payload_length = length - checksum_length;
+ crc_reported = &data[payload_length];
+
sp->variant->checksum->subroutine(data, payload_length,
crc_calculated);
@@ -465,10 +489,10 @@ static void rave_sp_receive_frame(struct rave_sp *sp,
return;
}
- if (rave_sp_id_is_event(data[0]))
- rave_sp_receive_event(sp, data, length);
+ if (rave_sp_id_is_event(data[RAVE_SP_FRAME_CODE_OFFSET]))
+ rave_sp_receive_event(sp, data, payload_length);
else
- rave_sp_receive_reply(sp, data, length);
+ rave_sp_receive_reply(sp, data, payload_length);
}
static size_t rave_sp_receive_buf(struct serdev_device *serdev,
diff --git a/drivers/mfd/rk8xx-spi.c b/drivers/mfd/rk8xx-spi.c
index 3405fb82ff9f..bb85fe60518f 100644
--- a/drivers/mfd/rk8xx-spi.c
+++ b/drivers/mfd/rk8xx-spi.c
@@ -104,7 +104,7 @@ static const struct of_device_id rk8xx_spi_of_match[] = {
MODULE_DEVICE_TABLE(of, rk8xx_spi_of_match);
static const struct spi_device_id rk8xx_spi_id_table[] = {
- { "rk806", 0 },
+ { .name = "rk806" },
{ }
};
MODULE_DEVICE_TABLE(spi, rk8xx_spi_id_table);
diff --git a/drivers/mfd/rohm-bd71828.c b/drivers/mfd/rohm-bd71828.c
index 5fb6142cf087..bf4df8e1b34c 100644
--- a/drivers/mfd/rohm-bd71828.c
+++ b/drivers/mfd/rohm-bd71828.c
@@ -5,8 +5,6 @@
* ROHM BD718[15/28/79] and BD72720 PMIC driver
*/
-#include <linux/device/devres.h>
-#include <linux/gfp_types.h>
#include <linux/i2c.h>
#include <linux/input.h>
#include <linux/interrupt.h>
@@ -19,10 +17,11 @@
#include <linux/mfd/rohm-generic.h>
#include <linux/module.h>
#include <linux/of.h>
-#include <linux/property.h>
#include <linux/regmap.h>
#include <linux/types.h>
+#include "rohm-pwrbutton.h"
+
#define BD72720_TYPED_IRQ_REG(_irq, _stat_offset, _mask, _type_offset) \
[_irq] = { \
.reg_offset = (_stat_offset), \
@@ -859,83 +858,7 @@ static int set_clk_mode(struct device *dev, struct regmap *regmap,
OUT32K_MODE_CMOS);
}
-static const struct property_entry bd71828_powerkey_parent_props[] = {
- PROPERTY_ENTRY_STRING("label", "bd71828-pwrkey"),
- { }
-};
-
-static const struct property_entry bd71828_powerkey_props[] = {
- PROPERTY_ENTRY_U32("linux,code", KEY_POWER),
- PROPERTY_ENTRY_BOOL("wakeup-source"),
- { }
-};
-
-#define GPIO_KEYS 0 /* Node corresponding to gpio-keys device itself */
-#define PWRON_KEY 1 /* Node describing power button in gpio-keys */
-
-static int bd71828_i2c_register_swnodes(const struct software_node *nodes)
-{
- const struct software_node * const node_group[] = {
- &nodes[GPIO_KEYS], &nodes[PWRON_KEY], NULL
- };
-
- return software_node_register_node_group(node_group);
-}
-
-static void bd71828_i2c_unregister_swnodes(void *data)
-{
- const struct software_node *nodes = data;
- const struct software_node * const node_group[] = {
- &nodes[GPIO_KEYS], &nodes[PWRON_KEY], NULL
- };
-
- software_node_unregister_node_group(node_group);
-}
-
-static int bd71828_i2c_register_pwrbutton(struct device *dev, int button_irq,
- struct irq_domain *irq_domain)
-{
- const struct resource res[] = {
- DEFINE_RES_IRQ_NAMED(button_irq, "bd71828-pwrkey"),
- };
- struct mfd_cell gpio_keys_cell = {
- .name = "gpio-keys",
- .resources = res,
- .num_resources = ARRAY_SIZE(res),
- };
- struct software_node *nodes;
- int ret;
- nodes = devm_kcalloc(dev, 2, sizeof(*nodes), GFP_KERNEL);
- if (!nodes)
- return -ENOMEM;
-
- nodes[GPIO_KEYS].name = devm_kasprintf(dev, GFP_KERNEL, "%s-power-key", dev_name(dev));
- if (!nodes[GPIO_KEYS].name)
- return -ENOMEM;
-
- nodes[GPIO_KEYS].properties = bd71828_powerkey_parent_props;
-
- nodes[PWRON_KEY].parent = &nodes[GPIO_KEYS];
- nodes[PWRON_KEY].properties = bd71828_powerkey_props;
-
- ret = bd71828_i2c_register_swnodes(nodes);
- if (ret)
- return ret;
-
- ret = devm_add_action_or_reset(dev, bd71828_i2c_unregister_swnodes, nodes);
- if (ret)
- return ret;
-
- gpio_keys_cell.swnode = &nodes[GPIO_KEYS];
-
- ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, &gpio_keys_cell, 1,
- NULL, 0, irq_domain);
- if (ret)
- return dev_err_probe(dev, ret, "Failed to register power-button");
-
- return 0;
-}
static struct i2c_client *bd71828_dev;
static void bd71828_power_off(void)
@@ -1096,7 +1019,8 @@ static int bd71828_i2c_probe(struct i2c_client *i2c)
return dev_err_probe(&i2c->dev, ret, "Failed to create subdevices\n");
if (button_irq) {
- ret = bd71828_i2c_register_pwrbutton(&i2c->dev, button_irq, irq_domain);
+ ret = rohm_register_pwrbutton(&i2c->dev, button_irq,
+ "bd71828-pwrkey", true, irq_domain);
if (ret)
return ret;
}
diff --git a/drivers/mfd/rohm-bd718x7.c b/drivers/mfd/rohm-bd718x7.c
index be2acc429fe3..0b0f8e27e329 100644
--- a/drivers/mfd/rohm-bd718x7.c
+++ b/drivers/mfd/rohm-bd718x7.c
@@ -7,8 +7,6 @@
// Datasheet for BD71837MWV available from
// https://www.rohm.com/datasheet/BD71837MWV/bd71837mwv-e
-#include <linux/device/devres.h>
-#include <linux/gfp_types.h>
#include <linux/i2c.h>
#include <linux/input.h>
#include <linux/interrupt.h>
@@ -16,10 +14,11 @@
#include <linux/mfd/core.h>
#include <linux/module.h>
#include <linux/of.h>
-#include <linux/property.h>
#include <linux/regmap.h>
#include <linux/types.h>
+#include "rohm-pwrbutton.h"
+
static struct mfd_cell bd71837_mfd_cells[] = {
{ .name = "bd71837-clk", },
{ .name = "bd71837-pmic", },
@@ -105,83 +104,7 @@ static int bd718xx_init_press_duration(struct regmap *regmap,
return 0;
}
-static const struct property_entry bd718xx_powerkey_parent_props[] = {
- PROPERTY_ENTRY_STRING("label", "bd718xx-pwrkey"),
- { }
-};
-
-static const struct property_entry bd718xx_powerkey_props[] = {
- PROPERTY_ENTRY_U32("linux,code", KEY_POWER),
- { }
-};
-
-static const struct resource bd718xx_powerkey_resources[] = {
- DEFINE_RES_IRQ_NAMED(BD718XX_INT_PWRBTN_S, "bd718xx-pwrkey"),
-};
-
-#define GPIO_KEYS 0 /* Node corresponding to gpio-keys device itself */
-#define PWRON_KEY 1 /* Node describing power button in gpio-keys */
-
-static int bd718xx_i2c_register_swnodes(const struct software_node *nodes)
-{
- const struct software_node * const node_group[] = {
- &nodes[GPIO_KEYS], &nodes[PWRON_KEY], NULL
- };
-
- return software_node_register_node_group(node_group);
-}
-
-static void bd718xx_i2c_unregister_swnodes(void *data)
-{
- const struct software_node *nodes = data;
- const struct software_node * const node_group[] = {
- &nodes[GPIO_KEYS], &nodes[PWRON_KEY], NULL
- };
-
- software_node_unregister_node_group(node_group);
-}
-static int bd718xx_i2c_register_pwrbutton(struct device *dev,
- struct irq_domain *irq_domain)
-{
- struct mfd_cell gpio_keys_cell = {
- .name = "gpio-keys",
- .resources = bd718xx_powerkey_resources,
- .num_resources = ARRAY_SIZE(bd718xx_powerkey_resources),
- };
- struct software_node *nodes;
- int ret;
-
- nodes = devm_kcalloc(dev, 2, sizeof(*nodes), GFP_KERNEL);
- if (!nodes)
- return -ENOMEM;
-
- nodes[GPIO_KEYS].name = devm_kasprintf(dev, GFP_KERNEL, "%s-power-key", dev_name(dev));
- if (!nodes[GPIO_KEYS].name)
- return -ENOMEM;
-
- nodes[GPIO_KEYS].properties = bd718xx_powerkey_parent_props;
-
- nodes[PWRON_KEY].parent = &nodes[GPIO_KEYS];
- nodes[PWRON_KEY].properties = bd718xx_powerkey_props;
-
- ret = bd718xx_i2c_register_swnodes(nodes);
- if (ret)
- return ret;
-
- ret = devm_add_action_or_reset(dev, bd718xx_i2c_unregister_swnodes, nodes);
- if (ret)
- return ret;
-
- gpio_keys_cell.swnode = &nodes[GPIO_KEYS];
-
- ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, &gpio_keys_cell, 1,
- NULL, 0, irq_domain);
- if (ret)
- return dev_err_probe(dev, ret, "Failed to register power-button");
-
- return 0;
-}
static int bd718xx_i2c_probe(struct i2c_client *i2c)
{
@@ -235,7 +158,8 @@ static int bd718xx_i2c_probe(struct i2c_client *i2c)
if (ret)
return dev_err_probe(&i2c->dev, ret, "Failed to create subdevices\n");
- ret = bd718xx_i2c_register_pwrbutton(&i2c->dev, irq_domain);
+ ret = rohm_register_pwrbutton(&i2c->dev, BD718XX_INT_PWRBTN_S,
+ "bd718xx-pwrkey", false, irq_domain);
if (ret)
return ret;
diff --git a/drivers/mfd/rohm-pwrbutton.c b/drivers/mfd/rohm-pwrbutton.c
new file mode 100644
index 000000000000..96a6d1f01db5
--- /dev/null
+++ b/drivers/mfd/rohm-pwrbutton.c
@@ -0,0 +1,112 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Shared helper for ROHM PMIC power button registration
+ *
+ * Copyright 2018, 2019 ROHM Semiconductors
+ * Copyright 2026 Google LLC
+ */
+
+#include <linux/device/devres.h>
+#include <linux/gfp_types.h>
+#include <linux/input.h>
+#include <linux/mfd/core.h>
+#include <linux/module.h>
+#include <linux/property.h>
+#include <linux/slab.h>
+
+#include "rohm-pwrbutton.h"
+
+#define GPIO_KEYS 0 /* Node corresponding to gpio-keys device itself */
+#define PWRON_KEY 1 /* Node describing power button in gpio-keys */
+
+static int rohm_pwrbutton_register_swnodes(const struct software_node *nodes)
+{
+ const struct software_node * const node_group[] = {
+ &nodes[GPIO_KEYS], &nodes[PWRON_KEY], NULL
+ };
+
+ return software_node_register_node_group(node_group);
+}
+
+static void rohm_pwrbutton_unregister_swnodes(void *data)
+{
+ const struct software_node *nodes = data;
+ const struct software_node * const node_group[] = {
+ &nodes[GPIO_KEYS], &nodes[PWRON_KEY], NULL
+ };
+
+ software_node_unregister_node_group(node_group);
+}
+
+int rohm_register_pwrbutton(struct device *dev, int irq, const char *name,
+ bool wakeup, struct irq_domain *irq_domain)
+{
+ const struct resource res[] = {
+ DEFINE_RES_IRQ_NAMED(irq, name),
+ };
+ struct mfd_cell gpio_keys_cell = {
+ .name = "gpio-keys",
+ .resources = res,
+ .num_resources = ARRAY_SIZE(res),
+ };
+ struct property_entry *parent_props;
+ struct property_entry *child_props;
+ struct software_node *nodes;
+ int n_props;
+ int ret;
+
+ if (irq <= 0)
+ return -EINVAL;
+
+ nodes = devm_kcalloc(dev, 2, sizeof(*nodes), GFP_KERNEL);
+ if (!nodes)
+ return -ENOMEM;
+
+ nodes[GPIO_KEYS].name = devm_kasprintf(dev, GFP_KERNEL, "%s-power-key", dev_name(dev));
+ if (!nodes[GPIO_KEYS].name)
+ return -ENOMEM;
+
+ parent_props = devm_kcalloc(dev, 2, sizeof(*parent_props), GFP_KERNEL);
+ if (!parent_props)
+ return -ENOMEM;
+
+ parent_props[0] = PROPERTY_ENTRY_STRING("label", name);
+ nodes[GPIO_KEYS].properties = parent_props;
+
+ n_props = 2; /* linux,code and terminator */
+ if (wakeup)
+ n_props++;
+
+ child_props = devm_kcalloc(dev, n_props, sizeof(*child_props), GFP_KERNEL);
+ if (!child_props)
+ return -ENOMEM;
+
+ child_props[0] = PROPERTY_ENTRY_U32("linux,code", KEY_POWER);
+ if (wakeup)
+ child_props[1] = PROPERTY_ENTRY_BOOL("wakeup-source");
+
+ nodes[PWRON_KEY].parent = &nodes[GPIO_KEYS];
+ nodes[PWRON_KEY].properties = child_props;
+
+ ret = rohm_pwrbutton_register_swnodes(nodes);
+ if (ret)
+ return ret;
+
+ ret = devm_add_action_or_reset(dev, rohm_pwrbutton_unregister_swnodes, nodes);
+ if (ret)
+ return ret;
+
+ gpio_keys_cell.swnode = &nodes[GPIO_KEYS];
+
+ ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, &gpio_keys_cell, 1,
+ NULL, 0, irq_domain);
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to register power-button");
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(rohm_register_pwrbutton);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Dmitry Torokhov <dmitry.torokhov@gmail.com>");
+MODULE_DESCRIPTION("Shared helper for ROHM PMIC power button registration");
diff --git a/drivers/mfd/rohm-pwrbutton.h b/drivers/mfd/rohm-pwrbutton.h
new file mode 100644
index 000000000000..47ae5c9d1e90
--- /dev/null
+++ b/drivers/mfd/rohm-pwrbutton.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#ifndef __LINUX_MFD_ROHM_PWRBUTTON_H__
+#define __LINUX_MFD_ROHM_PWRBUTTON_H__
+
+struct device;
+struct irq_domain;
+
+int rohm_register_pwrbutton(struct device *dev, int irq, const char *name,
+ bool wakeup, struct irq_domain *irq_domain);
+
+#endif /* __LINUX_MFD_ROHM_PWRBUTTON_H__ */
diff --git a/drivers/mfd/rsmu_spi.c b/drivers/mfd/rsmu_spi.c
index e07f21482439..cdb0f9797ec6 100644
--- a/drivers/mfd/rsmu_spi.c
+++ b/drivers/mfd/rsmu_spi.c
@@ -239,12 +239,12 @@ static void rsmu_spi_remove(struct spi_device *client)
}
static const struct spi_device_id rsmu_spi_id[] = {
- { "8a34000", RSMU_CM },
- { "8a34001", RSMU_CM },
- { "8a34002", RSMU_CM },
- { "82p33810", RSMU_SABRE },
- { "82p33811", RSMU_SABRE },
- {}
+ { .name = "8a34000", .driver_data = RSMU_CM },
+ { .name = "8a34001", .driver_data = RSMU_CM },
+ { .name = "8a34002", .driver_data = RSMU_CM },
+ { .name = "82p33810", .driver_data = RSMU_SABRE },
+ { .name = "82p33811", .driver_data = RSMU_SABRE },
+ { }
};
MODULE_DEVICE_TABLE(spi, rsmu_spi_id);
diff --git a/drivers/mfd/si476x-cmd.c b/drivers/mfd/si476x-cmd.c
index 3bb2decfebd3..58e9bea7e90a 100644
--- a/drivers/mfd/si476x-cmd.c
+++ b/drivers/mfd/si476x-cmd.c
@@ -15,7 +15,6 @@
#include <linux/atomic.h>
#include <linux/i2c.h>
#include <linux/device.h>
-#include <linux/gpio.h>
#include <linux/videodev2.h>
#include <linux/mfd/si476x-core.h>
diff --git a/drivers/mfd/si476x-i2c.c b/drivers/mfd/si476x-i2c.c
index 7ddc97dfc940..9bce720a0a08 100644
--- a/drivers/mfd/si476x-i2c.c
+++ b/drivers/mfd/si476x-i2c.c
@@ -13,7 +13,7 @@
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
#include <linux/regulator/consumer.h>
#include <linux/i2c.h>
#include <linux/err.h>
@@ -130,8 +130,7 @@ int si476x_core_start(struct si476x_core *core, bool soft)
int err;
if (!soft) {
- if (gpio_is_valid(core->gpio_reset))
- gpio_set_value_cansleep(core->gpio_reset, 1);
+ gpiod_set_value_cansleep(core->reset, 0);
if (client->irq)
enable_irq(client->irq);
@@ -197,8 +196,7 @@ disable_irq:
else
cancel_delayed_work_sync(&core->status_monitor);
- if (gpio_is_valid(core->gpio_reset))
- gpio_set_value_cansleep(core->gpio_reset, 0);
+ gpiod_set_value_cansleep(core->reset, 1);
return err;
}
@@ -242,10 +240,9 @@ int si476x_core_stop(struct si476x_core *core, bool soft)
else
cancel_delayed_work_sync(&core->status_monitor);
- if (!soft) {
- if (gpio_is_valid(core->gpio_reset))
- gpio_set_value_cansleep(core->gpio_reset, 0);
- }
+ if (!soft)
+ gpiod_set_value_cansleep(core->reset, 1);
+
return err;
}
EXPORT_SYMBOL_GPL(si476x_core_stop);
@@ -712,24 +709,18 @@ static int si476x_core_probe(struct i2c_client *client)
atomic_set(&core->is_alive, 0);
core->power_state = SI476X_POWER_DOWN;
+ core->reset = devm_gpiod_get_optional(&client->dev, "reset",
+ GPIOD_OUT_HIGH);
+ if (IS_ERR(core->reset))
+ return dev_err_probe(&client->dev, PTR_ERR(core->reset),
+ "error getting reset GPIO\n");
+ gpiod_set_consumer_name(core->reset, "si476x reset");
+
pdata = dev_get_platdata(&client->dev);
if (pdata) {
memcpy(&core->power_up_parameters,
&pdata->power_up_parameters,
sizeof(core->power_up_parameters));
-
- core->gpio_reset = -1;
- if (gpio_is_valid(pdata->gpio_reset)) {
- rval = gpio_request(pdata->gpio_reset, "si476x reset");
- if (rval) {
- dev_err(&client->dev,
- "Failed to request gpio: %d\n", rval);
- return rval;
- }
- core->gpio_reset = pdata->gpio_reset;
- gpio_direction_output(core->gpio_reset, 0);
- }
-
core->diversity_mode = pdata->diversity_mode;
memcpy(&core->pinmux, &pdata->pinmux,
sizeof(struct si476x_pinmux));
@@ -748,7 +739,7 @@ static int si476x_core_probe(struct i2c_client *client)
core->supplies);
if (rval) {
dev_err(&client->dev, "Failed to get all of the regulators\n");
- goto free_gpio;
+ return rval;
}
mutex_init(&core->cmd_lock);
@@ -761,7 +752,7 @@ static int si476x_core_probe(struct i2c_client *client)
GFP_KERNEL);
if (rval) {
dev_err(&client->dev, "Could not allocate the FIFO\n");
- goto free_gpio;
+ return rval;
}
mutex_init(&core->rds_drainer_status_lock);
init_waitqueue_head(&core->rds_read_queue);
@@ -827,11 +818,6 @@ static int si476x_core_probe(struct i2c_client *client)
free_kfifo:
kfifo_free(&core->rds_fifo);
-
-free_gpio:
- if (gpio_is_valid(core->gpio_reset))
- gpio_free(core->gpio_reset);
-
return rval;
}
@@ -848,9 +834,6 @@ static void si476x_core_remove(struct i2c_client *client)
cancel_delayed_work_sync(&core->status_monitor);
kfifo_free(&core->rds_fifo);
-
- if (gpio_is_valid(core->gpio_reset))
- gpio_free(core->gpio_reset);
}
diff --git a/drivers/mfd/sm501.c b/drivers/mfd/sm501.c
index 9d5bb67e8084..009c200c1d5d 100644
--- a/drivers/mfd/sm501.c
+++ b/drivers/mfd/sm501.c
@@ -1627,6 +1627,7 @@ static void sm501_pci_remove(struct pci_dev *dev)
release_mem_region(sm->io_res->start, 0x100);
pci_disable_device(dev);
+ kfree(sm);
}
static void sm501_plat_remove(struct platform_device *dev)
@@ -1637,6 +1638,7 @@ static void sm501_plat_remove(struct platform_device *dev)
iounmap(sm->regs);
release_mem_region(sm->io_res->start, 0x100);
+ kfree(sm);
}
static const struct pci_device_id sm501_pci_tbl[] = {
diff --git a/drivers/mfd/sprd-sc27xx-spi.c b/drivers/mfd/sprd-sc27xx-spi.c
index aa052f646623..9a8e6add8fca 100644
--- a/drivers/mfd/sprd-sc27xx-spi.c
+++ b/drivers/mfd/sprd-sc27xx-spi.c
@@ -61,6 +61,7 @@ static const struct mfd_cell sc2730_devices[] = {
MFD_CELL_OF("sc2730-efuse", NULL, NULL, 0, 0, "sprd,sc2730-efuse"),
MFD_CELL_OF("sc2730-eic", NULL, NULL, 0, 0, "sprd,sc2730-eic"),
MFD_CELL_OF("sc2730-fgu", NULL, NULL, 0, 0, "sprd,sc2730-fgu"),
+ MFD_CELL_NAME("sc2730-regulator"),
MFD_CELL_OF("sc2730-rtc", NULL, NULL, 0, 0, "sprd,sc2730-rtc"),
MFD_CELL_OF("sc2730-vibrator", NULL, NULL, 0, 0, "sprd,sc2730-vibrator"),
};
@@ -294,7 +295,7 @@ MODULE_DEVICE_TABLE(of, sprd_pmic_match);
static const struct spi_device_id sprd_pmic_spi_ids[] = {
{ .name = "sc2730", .driver_data = PMIC_TYPE_SC2730 },
{ .name = "sc2731", .driver_data = PMIC_TYPE_SC2731 },
- {},
+ { }
};
MODULE_DEVICE_TABLE(spi, sprd_pmic_spi_ids);
diff --git a/drivers/mfd/stmpe-spi.c b/drivers/mfd/stmpe-spi.c
index dea31efface6..22a3da062dee 100644
--- a/drivers/mfd/stmpe-spi.c
+++ b/drivers/mfd/stmpe-spi.c
@@ -121,12 +121,12 @@ static const struct of_device_id stmpe_spi_of_match[] = {
MODULE_DEVICE_TABLE(of, stmpe_spi_of_match);
static const struct spi_device_id stmpe_spi_id[] = {
- { "stmpe610", STMPE610 },
- { "stmpe801", STMPE801 },
- { "stmpe811", STMPE811 },
- { "stmpe1601", STMPE1601 },
- { "stmpe2401", STMPE2401 },
- { "stmpe2403", STMPE2403 },
+ { .name = "stmpe610", .driver_data = STMPE610 },
+ { .name = "stmpe801", .driver_data = STMPE801 },
+ { .name = "stmpe811", .driver_data = STMPE811 },
+ { .name = "stmpe1601", .driver_data = STMPE1601 },
+ { .name = "stmpe2401", .driver_data = STMPE2401 },
+ { .name = "stmpe2403", .driver_data = STMPE2403 },
{ }
};
MODULE_DEVICE_TABLE(spi, stmpe_spi_id);
diff --git a/drivers/mfd/tps65912-spi.c b/drivers/mfd/tps65912-spi.c
index 2a77dccd6059..2442a2e67d67 100644
--- a/drivers/mfd/tps65912-spi.c
+++ b/drivers/mfd/tps65912-spi.c
@@ -43,7 +43,7 @@ static int tps65912_spi_probe(struct spi_device *spi)
}
static const struct spi_device_id tps65912_spi_id_table[] = {
- { "tps65912", 0 },
+ { .name = "tps65912" },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(spi, tps65912_spi_id_table);
diff --git a/drivers/mfd/ucb1x00-assabet.c b/drivers/mfd/ucb1x00-assabet.c
index 6a389737c615..ee49ac779d1a 100644
--- a/drivers/mfd/ucb1x00-assabet.c
+++ b/drivers/mfd/ucb1x00-assabet.c
@@ -6,15 +6,18 @@
*
* We handle the machine-specific bits of the UCB1x00 driver here.
*/
-#include <linux/module.h>
-#include <linux/init.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/fs.h>
-#include <linux/gpio_keys.h>
+#include <linux/gpio/machine.h>
+#include <linux/gpio/property.h>
+#include <linux/init.h>
#include <linux/input.h>
+#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/proc_fs.h>
+#include <linux/property.h>
+#include <linux/slab.h>
#include <linux/mfd/ucb1x00.h>
#define UCB1X00_ATTR(name,input)\
@@ -34,50 +37,119 @@ UCB1X00_ATTR(vbatt, UCB_ADC_INP_AD1);
UCB1X00_ATTR(vcharger, UCB_ADC_INP_AD0);
UCB1X00_ATTR(batt_temp, UCB_ADC_INP_AD2);
+static const struct property_entry ucb1x00_gpio_keys_props[] = {
+ PROPERTY_ENTRY_STRING("label", "ucb1x00"),
+ PROPERTY_ENTRY_U32("poll-interval", 50),
+ { }
+};
+
+#define UCB1X00_BTN_PROPS(_idx) \
+struct property_entry ucb1x00_btn##_idx##_props[] = { \
+ PROPERTY_ENTRY_U32("linux,code", BTN_0 + (_idx)), \
+ PROPERTY_ENTRY_GPIO("gpios", &ucb1x00_gpiochip_node, \
+ _idx, GPIO_ACTIVE_HIGH), \
+ PROPERTY_ENTRY_STRING("label", "btn" #_idx), \
+ PROPERTY_ENTRY_BOOL("linux,can-disable"), \
+ { } \
+}
+
+static const UCB1X00_BTN_PROPS(0);
+static const UCB1X00_BTN_PROPS(1);
+static const UCB1X00_BTN_PROPS(2);
+static const UCB1X00_BTN_PROPS(3);
+static const UCB1X00_BTN_PROPS(4);
+static const UCB1X00_BTN_PROPS(5);
+
+static const struct property_entry * const ucb1x00_btn_props[] = {
+ ucb1x00_btn0_props,
+ ucb1x00_btn1_props,
+ ucb1x00_btn2_props,
+ ucb1x00_btn3_props,
+ ucb1x00_btn4_props,
+ ucb1x00_btn5_props,
+};
+
+struct ucb1x00_assabet_priv {
+ struct platform_device *pdev;
+ struct fwnode_handle *keys_node;
+ struct fwnode_handle *button_nodes[ARRAY_SIZE(ucb1x00_btn_props)];
+};
+
+static void ucb1x00_assabet_remove_nodes(struct ucb1x00_assabet_priv *priv, int n)
+{
+ while (--n >= 0)
+ fwnode_remove_software_node(priv->button_nodes[n]);
+
+ fwnode_remove_software_node(priv->keys_node);
+}
+
static int ucb1x00_assabet_add(struct ucb1x00_dev *dev)
{
struct ucb1x00 *ucb = dev->ucb;
- struct platform_device *pdev;
- struct gpio_keys_platform_data keys;
- static struct gpio_keys_button buttons[6];
- unsigned i;
-
- memset(buttons, 0, sizeof(buttons));
- memset(&keys, 0, sizeof(keys));
-
- for (i = 0; i < ARRAY_SIZE(buttons); i++) {
- buttons[i].code = BTN_0 + i;
- buttons[i].gpio = ucb->gpio.base + i;
- buttons[i].type = EV_KEY;
- buttons[i].can_disable = true;
+ struct platform_device_info pdevinfo = {
+ .name = "gpio-keys",
+ .id = PLATFORM_DEVID_NONE,
+ .parent = &ucb->dev,
+ };
+ int ret;
+ int i;
+
+ struct ucb1x00_assabet_priv *priv;
+
+ priv = kzalloc_obj(*priv, GFP_KERNEL);
+ if (!priv)
+ return -ENOMEM;
+
+ priv->keys_node = fwnode_create_software_node(ucb1x00_gpio_keys_props, NULL);
+ if (IS_ERR(priv->keys_node)) {
+ ret = PTR_ERR(priv->keys_node);
+ goto err_free_priv;
}
- keys.buttons = buttons;
- keys.nbuttons = ARRAY_SIZE(buttons);
- keys.poll_interval = 50;
- keys.name = "ucb1x00";
+ for (i = 0; i < ARRAY_SIZE(ucb1x00_btn_props); i++) {
+ priv->button_nodes[i] = fwnode_create_software_node(ucb1x00_btn_props[i],
+ priv->keys_node);
+ if (IS_ERR(priv->button_nodes[i])) {
+ ret = PTR_ERR(priv->button_nodes[i]);
+ goto err_free_buttons;
+ }
+ }
+
+ pdevinfo.fwnode = priv->keys_node;
- pdev = platform_device_register_data(&ucb->dev, "gpio-keys", -1,
- &keys, sizeof(keys));
+ priv->pdev = platform_device_register_full(&pdevinfo);
+ ret = PTR_ERR_OR_ZERO(priv->pdev);
+ if (ret)
+ goto err_free_buttons;
device_create_file(&ucb->dev, &dev_attr_vbatt);
device_create_file(&ucb->dev, &dev_attr_vcharger);
device_create_file(&ucb->dev, &dev_attr_batt_temp);
- dev->priv = pdev;
+ dev->priv = priv;
return 0;
+
+err_free_buttons:
+ ucb1x00_assabet_remove_nodes(priv, i);
+err_free_priv:
+ kfree(priv);
+ return ret;
}
static void ucb1x00_assabet_remove(struct ucb1x00_dev *dev)
{
- struct platform_device *pdev = dev->priv;
+ struct ucb1x00_assabet_priv *priv = dev->priv;
- if (!IS_ERR(pdev))
- platform_device_unregister(pdev);
+ if (!IS_ERR(priv->pdev))
+ platform_device_unregister(priv->pdev);
+
+ ucb1x00_assabet_remove_nodes(priv, ARRAY_SIZE(priv->button_nodes));
device_remove_file(&dev->ucb->dev, &dev_attr_batt_temp);
device_remove_file(&dev->ucb->dev, &dev_attr_vcharger);
device_remove_file(&dev->ucb->dev, &dev_attr_vbatt);
+
+ kfree(priv);
}
static struct ucb1x00_driver ucb1x00_assabet_driver = {
diff --git a/drivers/mfd/ucb1x00-core.c b/drivers/mfd/ucb1x00-core.c
index 16f64e2b2f77..90edf0352d05 100644
--- a/drivers/mfd/ucb1x00-core.c
+++ b/drivers/mfd/ucb1x00-core.c
@@ -25,6 +25,7 @@
#include <linux/mutex.h>
#include <linux/mfd/ucb1x00.h>
#include <linux/pm.h>
+#include <linux/property.h>
#include <linux/gpio/driver.h>
static DEFINE_MUTEX(ucb1x00_mutex);
@@ -492,6 +493,11 @@ static struct class ucb1x00_class = {
.dev_release = ucb1x00_release,
};
+const struct software_node ucb1x00_gpiochip_node = {
+ .name = "ucb1x00-gpio",
+};
+EXPORT_SYMBOL_GPL(ucb1x00_gpiochip_node);
+
static int ucb1x00_probe(struct mcp *mcp)
{
struct ucb1x00_plat_data *pdata = mcp->attached_device.platform_data;
@@ -530,6 +536,10 @@ static int ucb1x00_probe(struct mcp *mcp)
ucb->id = id;
ucb->mcp = mcp;
+ ret = device_add_software_node(&ucb->dev, &ucb1x00_gpiochip_node);
+ if (ret)
+ goto err_swnode_add;
+
ret = device_add(&ucb->dev);
if (ret)
goto err_dev_add;
@@ -604,6 +614,8 @@ static int ucb1x00_probe(struct mcp *mcp)
err_no_irq:
device_del(&ucb->dev);
err_dev_add:
+ device_remove_software_node(&ucb->dev);
+ err_swnode_add:
put_device(&ucb->dev);
out:
if (pdata && pdata->reset)
@@ -630,7 +642,9 @@ static void ucb1x00_remove(struct mcp *mcp)
irq_set_chained_handler(ucb->irq, NULL);
irq_free_descs(ucb->irq_base, 16);
- device_unregister(&ucb->dev);
+ device_del(&ucb->dev);
+ device_remove_software_node(&ucb->dev);
+ put_device(&ucb->dev);
if (pdata && pdata->reset)
pdata->reset(UCB_RST_REMOVE);
diff --git a/drivers/mfd/viperboard.c b/drivers/mfd/viperboard.c
index 888737b8e7be..36be8e69f45c 100644
--- a/drivers/mfd/viperboard.c
+++ b/drivers/mfd/viperboard.c
@@ -96,8 +96,7 @@ static int vprbrd_probe(struct usb_interface *interface,
return 0;
error:
- if (vb)
- kfree(vb);
+ kfree(vb);
return ret;
}
diff --git a/drivers/mfd/wm831x-spi.c b/drivers/mfd/wm831x-spi.c
index 54c87267917b..1e519fd9a9e1 100644
--- a/drivers/mfd/wm831x-spi.c
+++ b/drivers/mfd/wm831x-spi.c
@@ -77,14 +77,14 @@ static const struct dev_pm_ops wm831x_spi_pm = {
};
static const struct spi_device_id wm831x_spi_ids[] = {
- { "wm8310", WM8310 },
- { "wm8311", WM8311 },
- { "wm8312", WM8312 },
- { "wm8320", WM8320 },
- { "wm8321", WM8321 },
- { "wm8325", WM8325 },
- { "wm8326", WM8326 },
- { },
+ { .name = "wm8310", .driver_data = WM8310 },
+ { .name = "wm8311", .driver_data = WM8311 },
+ { .name = "wm8312", .driver_data = WM8312 },
+ { .name = "wm8320", .driver_data = WM8320 },
+ { .name = "wm8321", .driver_data = WM8321 },
+ { .name = "wm8325", .driver_data = WM8325 },
+ { .name = "wm8326", .driver_data = WM8326 },
+ { }
};
static struct spi_driver wm831x_spi_driver = {
diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c
index 1d8d9168ec1a..724d1313f6b2 100644
--- a/drivers/platform/chrome/cros_ec_proto.c
+++ b/drivers/platform/chrome/cros_ec_proto.c
@@ -947,6 +947,27 @@ u32 cros_ec_get_host_event(struct cros_ec_device *ec_dev)
EXPORT_SYMBOL(cros_ec_get_host_event);
/**
+ * cros_ec_read_features() - Read EC features
+ *
+ * @ec: EC device.
+ *
+ * Return: >= 0 on success, negative error number on failure.
+ */
+int cros_ec_read_features(struct cros_ec_dev *ec)
+{
+ int ret = cros_ec_cmd(ec->ec_dev, 0, EC_CMD_GET_FEATURES + ec->cmd_offset,
+ NULL, 0, &ec->features, sizeof(ec->features));
+
+ if (ret < 0) {
+ dev_warn(ec->dev, "cannot get EC features: %d\n", ret);
+ memset(&ec->features, 0, sizeof(ec->features));
+ }
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(cros_ec_read_features);
+
+/**
* cros_ec_check_features() - Test for the presence of EC features
*
* @ec: EC device, does not have to be connected directly to the AP,
@@ -960,17 +981,10 @@ EXPORT_SYMBOL(cros_ec_get_host_event);
bool cros_ec_check_features(struct cros_ec_dev *ec, int feature)
{
struct ec_response_get_features *features = &ec->features;
- int ret;
if (features->flags[0] == -1U && features->flags[1] == -1U) {
/* features bitmap not read yet */
- ret = cros_ec_cmd(ec->ec_dev, 0, EC_CMD_GET_FEATURES + ec->cmd_offset,
- NULL, 0, features, sizeof(*features));
- if (ret < 0) {
- dev_warn(ec->dev, "cannot get EC features: %d\n", ret);
- memset(features, 0, sizeof(*features));
- }
-
+ cros_ec_read_features(ec);
dev_dbg(ec->dev, "EC features %08x %08x\n",
features->flags[0], features->flags[1]);
}
diff --git a/drivers/regulator/db8500-prcmu.c b/drivers/regulator/db8500-prcmu.c
index 1ec2e1348891..751fe36580fa 100644
--- a/drivers/regulator/db8500-prcmu.c
+++ b/drivers/regulator/db8500-prcmu.c
@@ -13,7 +13,7 @@
#include <linux/err.h>
#include <linux/spinlock.h>
#include <linux/platform_device.h>
-#include <linux/mfd/dbx500-prcmu.h>
+#include <linux/mfd/db8500-prcmu.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/db8500-prcmu.h>
@@ -93,13 +93,13 @@ static int enable_epod(u16 epod_id, bool ramret)
if (ramret) {
if (!epod_on[epod_id]) {
- ret = prcmu_set_epod(epod_id, EPOD_STATE_RAMRET);
+ ret = db8500_prcmu_set_epod(epod_id, EPOD_STATE_RAMRET);
if (ret < 0)
return ret;
}
epod_ramret[epod_id] = true;
} else {
- ret = prcmu_set_epod(epod_id, EPOD_STATE_ON);
+ ret = db8500_prcmu_set_epod(epod_id, EPOD_STATE_ON);
if (ret < 0)
return ret;
epod_on[epod_id] = true;
@@ -114,18 +114,18 @@ static int disable_epod(u16 epod_id, bool ramret)
if (ramret) {
if (!epod_on[epod_id]) {
- ret = prcmu_set_epod(epod_id, EPOD_STATE_OFF);
+ ret = db8500_prcmu_set_epod(epod_id, EPOD_STATE_OFF);
if (ret < 0)
return ret;
}
epod_ramret[epod_id] = false;
} else {
if (epod_ramret[epod_id]) {
- ret = prcmu_set_epod(epod_id, EPOD_STATE_RAMRET);
+ ret = db8500_prcmu_set_epod(epod_id, EPOD_STATE_RAMRET);
if (ret < 0)
return ret;
} else {
- ret = prcmu_set_epod(epod_id, EPOD_STATE_OFF);
+ ret = db8500_prcmu_set_epod(epod_id, EPOD_STATE_OFF);
if (ret < 0)
return ret;
}
diff --git a/drivers/thermal/db8500_thermal.c b/drivers/thermal/db8500_thermal.c
index c47aa9974c1e..46005b476722 100644
--- a/drivers/thermal/db8500_thermal.c
+++ b/drivers/thermal/db8500_thermal.c
@@ -10,7 +10,7 @@
#include <linux/cpu_cooling.h>
#include <linux/interrupt.h>
-#include <linux/mfd/dbx500-prcmu.h>
+#include <linux/mfd/db8500-prcmu.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
@@ -82,7 +82,7 @@ static void db8500_thermal_update_config(struct db8500_thermal_zone *th,
unsigned long next_low,
unsigned long next_high)
{
- prcmu_stop_temp_sense();
+ db8500_prcmu_stop_temp_sense();
th->cur_index = idx;
th->interpolated_temp = (next_low + next_high)/2;
@@ -91,8 +91,8 @@ static void db8500_thermal_update_config(struct db8500_thermal_zone *th,
* The PRCMU accept absolute temperatures in celsius so divide
* down the millicelsius with 1000
*/
- prcmu_config_hotmon((u8)(next_low/1000), (u8)(next_high/1000));
- prcmu_start_temp_sense(PRCMU_DEFAULT_MEASURE_TIME);
+ db8500_prcmu_config_hotmon((u8)(next_low / 1000), (u8)(next_high / 1000));
+ db8500_prcmu_start_temp_sense(PRCMU_DEFAULT_MEASURE_TIME);
}
static irqreturn_t prcmu_low_irq_handler(int irq, void *irq_data)
@@ -200,7 +200,7 @@ static int db8500_thermal_probe(struct platform_device *pdev)
static int db8500_thermal_suspend(struct platform_device *pdev,
pm_message_t state)
{
- prcmu_stop_temp_sense();
+ db8500_prcmu_stop_temp_sense();
return 0;
}
diff --git a/drivers/watchdog/db8500_wdt.c b/drivers/watchdog/db8500_wdt.c
index 97148ac0aa54..70ccea13288d 100644
--- a/drivers/watchdog/db8500_wdt.c
+++ b/drivers/watchdog/db8500_wdt.c
@@ -16,7 +16,7 @@
#include <linux/watchdog.h>
#include <linux/platform_device.h>
-#include <linux/mfd/dbx500-prcmu.h>
+#include <linux/mfd/db8500-prcmu.h>
#define WATCHDOG_TIMEOUT 600 /* 10 minutes */
@@ -37,24 +37,24 @@ MODULE_PARM_DESC(nowayout,
static int db8500_wdt_start(struct watchdog_device *wdd)
{
- return prcmu_enable_a9wdog(PRCMU_WDOG_ALL);
+ return db8500_prcmu_enable_a9wdog(PRCMU_WDOG_ALL);
}
static int db8500_wdt_stop(struct watchdog_device *wdd)
{
- return prcmu_disable_a9wdog(PRCMU_WDOG_ALL);
+ return db8500_prcmu_disable_a9wdog(PRCMU_WDOG_ALL);
}
static int db8500_wdt_keepalive(struct watchdog_device *wdd)
{
- return prcmu_kick_a9wdog(PRCMU_WDOG_ALL);
+ return db8500_prcmu_kick_a9wdog(PRCMU_WDOG_ALL);
}
static int db8500_wdt_set_timeout(struct watchdog_device *wdd,
unsigned int timeout)
{
db8500_wdt_stop(wdd);
- prcmu_load_a9wdog(PRCMU_WDOG_ALL, timeout * 1000);
+ db8500_prcmu_load_a9wdog(PRCMU_WDOG_ALL, timeout * 1000);
db8500_wdt_start(wdd);
return 0;
@@ -91,10 +91,10 @@ static int db8500_wdt_probe(struct platform_device *pdev)
watchdog_set_nowayout(&db8500_wdt, nowayout);
/* disable auto off on sleep */
- prcmu_config_a9wdog(PRCMU_WDOG_CPU1, false);
+ db8500_prcmu_config_a9wdog(PRCMU_WDOG_CPU1, false);
/* set HW initial value */
- prcmu_load_a9wdog(PRCMU_WDOG_ALL, timeout * 1000);
+ db8500_prcmu_load_a9wdog(PRCMU_WDOG_ALL, timeout * 1000);
ret = devm_watchdog_register_device(dev, &db8500_wdt);
if (ret)
@@ -110,9 +110,9 @@ static int db8500_wdt_suspend(struct platform_device *pdev,
{
if (watchdog_active(&db8500_wdt)) {
db8500_wdt_stop(&db8500_wdt);
- prcmu_config_a9wdog(PRCMU_WDOG_CPU1, true);
+ db8500_prcmu_config_a9wdog(PRCMU_WDOG_CPU1, true);
- prcmu_load_a9wdog(PRCMU_WDOG_ALL, timeout * 1000);
+ db8500_prcmu_load_a9wdog(PRCMU_WDOG_ALL, timeout * 1000);
db8500_wdt_start(&db8500_wdt);
}
return 0;
@@ -122,9 +122,9 @@ static int db8500_wdt_resume(struct platform_device *pdev)
{
if (watchdog_active(&db8500_wdt)) {
db8500_wdt_stop(&db8500_wdt);
- prcmu_config_a9wdog(PRCMU_WDOG_CPU1, false);
+ db8500_prcmu_config_a9wdog(PRCMU_WDOG_CPU1, false);
- prcmu_load_a9wdog(PRCMU_WDOG_ALL, timeout * 1000);
+ db8500_prcmu_load_a9wdog(PRCMU_WDOG_ALL, timeout * 1000);
db8500_wdt_start(&db8500_wdt);
}
return 0;