From: Arnd Bergmann <arnd@kernel.org>
To: Lee Jones <lee@kernel.org>, mfd@lists.linux.dev
Cc: linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
Arnd Bergmann <arnd@arndb.de>,
Daniel Thompson <danielt@kernel.org>,
Jingoo Han <jingoohan1@gmail.com>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Liam Girdwood <lgirdwood@gmail.com>,
Mark Brown <broonie@kernel.org>, Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Guenter Roeck <linux@roeck-us.net>,
Linus Walleij <linusw@kernel.org>,
Bartosz Golaszewski <brgl@kernel.org>,
Jonathan Cameron <jic23@kernel.org>,
Dmitry Torokhov <dmitry.torokhov@gmail.com>,
Pavel Machek <pavel@kernel.org>,
Michael Hennerich <michael.hennerich@analog.com>,
Support Opensource <support.opensource@diasemi.com>,
Sebastian Reichel <sre@kernel.org>,
Alexandre Belloni <alexandre.belloni@bootlin.com>,
Helge Deller <deller@gmx.de>,
dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org,
linux-media@vger.kernel.org, devicetree@vger.kernel.org,
linux-hwmon@vger.kernel.org, patches@opensource.cirrus.com,
linux-watchdog@vger.kernel.org, linux-gpio@vger.kernel.org,
linux-iio@vger.kernel.org, linux-input@vger.kernel.org,
linux-leds@vger.kernel.org, linux-pm@vger.kernel.org,
linux-rtc@vger.kernel.org, linux-fbdev@vger.kernel.org,
linux-sound@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
llvm@lists.linux.dev
Subject: [PATCH 01/14] mfd: remove unused 88pm80x driver
Date: Wed, 9 Sep 2026 15:21:38 +0200 [thread overview]
Message-ID: <20260909132153.1596191-2-arnd@kernel.org> (raw)
In-Reply-To: <20260909132153.1596191-1-arnd@kernel.org>
From: Arnd Bergmann <arnd@arndb.de>
This pair of drivers was originally added as companion chips for pxa/mmp
SoCs, but the corresponding platform code was never merged, so it has
been unused the entire time.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
.../devicetree/bindings/regulator/88pm800.txt | 38 --
drivers/input/misc/88pm80x_onkey.c | 152 -----
drivers/input/misc/Kconfig | 10 -
drivers/input/misc/Makefile | 1 -
drivers/mfd/88pm800.c | 619 ------------------
drivers/mfd/88pm805.c | 275 --------
drivers/mfd/88pm80x.c | 159 -----
drivers/mfd/Kconfig | 24 -
drivers/mfd/Makefile | 2 -
drivers/regulator/88pm800-regulator.c | 287 --------
drivers/regulator/Kconfig | 10 -
drivers/regulator/Makefile | 1 -
drivers/rtc/Kconfig | 10 -
drivers/rtc/Makefile | 1 -
drivers/rtc/rtc-88pm80x.c | 340 ----------
include/linux/mfd/88pm80x.h | 370 -----------
16 files changed, 2299 deletions(-)
delete mode 100644 Documentation/devicetree/bindings/regulator/88pm800.txt
delete mode 100644 drivers/input/misc/88pm80x_onkey.c
delete mode 100644 drivers/mfd/88pm800.c
delete mode 100644 drivers/mfd/88pm805.c
delete mode 100644 drivers/mfd/88pm80x.c
delete mode 100644 drivers/regulator/88pm800-regulator.c
delete mode 100644 drivers/rtc/rtc-88pm80x.c
delete mode 100644 include/linux/mfd/88pm80x.h
diff --git a/Documentation/devicetree/bindings/regulator/88pm800.txt b/Documentation/devicetree/bindings/regulator/88pm800.txt
deleted file mode 100644
index e8a54c2a5821..000000000000
--- a/Documentation/devicetree/bindings/regulator/88pm800.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-Marvell 88PM800 regulator
-
-Required properties:
-- compatible: "marvell,88pm800"
-- reg: I2C slave address
-- regulators: A node that houses a sub-node for each regulator within the
- device. Each sub-node is identified using the node's name (or the deprecated
- regulator-compatible property if present), with valid values listed below.
- The content of each sub-node is defined by the standard binding for
- regulators; see regulator.txt.
-
-The valid names for regulators are:
-
- buck1, buck2, buck3, buck4, buck5, ldo1, ldo2, ldo3, ldo4, ldo5, ldo6, ldo7,
- ldo8, ldo9, ldo10, ldo11, ldo12, ldo13, ldo14, ldo15, ldo16, ldo17, ldo18, ldo19
-
-Example:
-
- pmic: 88pm800@31 {
- compatible = "marvell,88pm800";
- reg = <0x31>;
-
- regulators {
- buck1 {
- regulator-min-microvolt = <600000>;
- regulator-max-microvolt = <3950000>;
- regulator-boot-on;
- regulator-always-on;
- };
- ldo1 {
- regulator-min-microvolt = <600000>;
- regulator-max-microvolt = <15000000>;
- regulator-boot-on;
- regulator-always-on;
- };
-...
- };
- };
diff --git a/drivers/input/misc/88pm80x_onkey.c b/drivers/input/misc/88pm80x_onkey.c
deleted file mode 100644
index fee28e537898..000000000000
--- a/drivers/input/misc/88pm80x_onkey.c
+++ /dev/null
@@ -1,152 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Marvell 88PM80x ONKEY driver
- *
- * Copyright (C) 2012 Marvell International Ltd.
- * Haojian Zhuang <haojian.zhuang@marvell.com>
- * Qiao Zhou <zhouqiao@marvell.com>
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/input.h>
-#include <linux/mfd/88pm80x.h>
-#include <linux/regmap.h>
-#include <linux/slab.h>
-
-#define PM800_LONG_ONKEY_EN (1 << 0)
-#define PM800_LONG_KEY_DELAY (8) /* 1 .. 16 seconds */
-#define PM800_LONKEY_PRESS_TIME ((PM800_LONG_KEY_DELAY-1) << 4)
-#define PM800_LONKEY_PRESS_TIME_MASK (0xF0)
-#define PM800_SW_PDOWN (1 << 5)
-
-struct pm80x_onkey_info {
- struct input_dev *idev;
- struct pm80x_chip *pm80x;
- struct regmap *map;
- int irq;
-};
-
-/* 88PM80x gives us an interrupt when ONKEY is held */
-static irqreturn_t pm80x_onkey_handler(int irq, void *data)
-{
- struct pm80x_onkey_info *info = data;
- int ret = 0;
- unsigned int val;
-
- ret = regmap_read(info->map, PM800_STATUS_1, &val);
- if (ret < 0) {
- dev_err(info->idev->dev.parent, "failed to read status: %d\n", ret);
- return IRQ_NONE;
- }
- val &= PM800_ONKEY_STS1;
-
- input_report_key(info->idev, KEY_POWER, val);
- input_sync(info->idev);
-
- return IRQ_HANDLED;
-}
-
-static SIMPLE_DEV_PM_OPS(pm80x_onkey_pm_ops, pm80x_dev_suspend,
- pm80x_dev_resume);
-
-static int pm80x_onkey_probe(struct platform_device *pdev)
-{
-
- struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent);
- struct pm80x_onkey_info *info;
- int err;
-
- info = kzalloc_obj(*info);
- if (!info)
- return -ENOMEM;
-
- info->pm80x = chip;
-
- info->irq = platform_get_irq(pdev, 0);
- if (info->irq < 0) {
- err = -EINVAL;
- goto out;
- }
-
- info->map = info->pm80x->regmap;
- if (!info->map) {
- dev_err(&pdev->dev, "no regmap!\n");
- err = -EINVAL;
- goto out;
- }
-
- info->idev = input_allocate_device();
- if (!info->idev) {
- dev_err(&pdev->dev, "Failed to allocate input dev\n");
- err = -ENOMEM;
- goto out;
- }
-
- info->idev->name = "88pm80x_on";
- info->idev->phys = "88pm80x_on/input0";
- info->idev->id.bustype = BUS_I2C;
- info->idev->dev.parent = &pdev->dev;
- info->idev->evbit[0] = BIT_MASK(EV_KEY);
- __set_bit(KEY_POWER, info->idev->keybit);
-
- err = pm80x_request_irq(info->pm80x, info->irq, pm80x_onkey_handler,
- IRQF_ONESHOT, "onkey", info);
- if (err < 0) {
- dev_err(&pdev->dev, "Failed to request IRQ: #%d: %d\n",
- info->irq, err);
- goto out_reg;
- }
-
- err = input_register_device(info->idev);
- if (err) {
- dev_err(&pdev->dev, "Can't register input device: %d\n", err);
- goto out_irq;
- }
-
- platform_set_drvdata(pdev, info);
-
- /* Enable long onkey detection */
- regmap_update_bits(info->map, PM800_RTC_MISC4, PM800_LONG_ONKEY_EN,
- PM800_LONG_ONKEY_EN);
- /* Set 8-second interval */
- regmap_update_bits(info->map, PM800_RTC_MISC3,
- PM800_LONKEY_PRESS_TIME_MASK,
- PM800_LONKEY_PRESS_TIME);
-
- device_init_wakeup(&pdev->dev, 1);
- return 0;
-
-out_irq:
- pm80x_free_irq(info->pm80x, info->irq, info);
-out_reg:
- input_free_device(info->idev);
-out:
- kfree(info);
- return err;
-}
-
-static void pm80x_onkey_remove(struct platform_device *pdev)
-{
- struct pm80x_onkey_info *info = platform_get_drvdata(pdev);
-
- pm80x_free_irq(info->pm80x, info->irq, info);
- input_unregister_device(info->idev);
- kfree(info);
-}
-
-static struct platform_driver pm80x_onkey_driver = {
- .driver = {
- .name = "88pm80x-onkey",
- .pm = &pm80x_onkey_pm_ops,
- },
- .probe = pm80x_onkey_probe,
- .remove = pm80x_onkey_remove,
-};
-
-module_platform_driver(pm80x_onkey_driver);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("Marvell 88PM80x ONKEY driver");
-MODULE_AUTHOR("Qiao Zhou <zhouqiao@marvell.com>");
-MODULE_ALIAS("platform:88pm80x-onkey");
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index 169768e3d5bb..013ae22311ee 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -23,16 +23,6 @@ config INPUT_88PM860X_ONKEY
To compile this driver as a module, choose M here: the module
will be called 88pm860x_onkey.
-config INPUT_88PM80X_ONKEY
- tristate "88PM80x ONKEY support"
- depends on MFD_88PM800
- help
- Support the ONKEY of Marvell 88PM80x PMICs as an input device
- reporting power button status.
-
- To compile this driver as a module, choose M here: the module
- will be called 88pm80x_onkey.
-
config INPUT_88PM886_ONKEY
tristate "Marvell 88PM886 onkey support"
depends on MFD_88PM886_PMIC
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index 1339619f0769..b120799b05eb 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -6,7 +6,6 @@
# Each configuration option enables a list of files.
obj-$(CONFIG_INPUT_88PM860X_ONKEY) += 88pm860x_onkey.o
-obj-$(CONFIG_INPUT_88PM80X_ONKEY) += 88pm80x_onkey.o
obj-$(CONFIG_INPUT_88PM886_ONKEY) += 88pm886-onkey.o
obj-$(CONFIG_INPUT_AB8500_PONKEY) += ab8500-ponkey.o
obj-$(CONFIG_INPUT_AD714X) += ad714x.o
diff --git a/drivers/mfd/88pm800.c b/drivers/mfd/88pm800.c
deleted file mode 100644
index e9941da58b18..000000000000
--- a/drivers/mfd/88pm800.c
+++ /dev/null
@@ -1,619 +0,0 @@
-/*
- * Base driver for Marvell 88PM800
- *
- * Copyright (C) 2012 Marvell International Ltd.
- * Haojian Zhuang <haojian.zhuang@marvell.com>
- * Joseph(Yossi) Hanin <yhanin@marvell.com>
- * Qiao Zhou <zhouqiao@marvell.com>
- *
- * This file is subject to the terms and conditions of the GNU General
- * Public License. See the file "COPYING" in the main directory of this
- * archive for more details.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/err.h>
-#include <linux/i2c.h>
-#include <linux/mfd/core.h>
-#include <linux/mfd/88pm80x.h>
-#include <linux/slab.h>
-
-/* Interrupt Registers */
-#define PM800_INT_STATUS1 (0x05)
-#define PM800_ONKEY_INT_STS1 (1 << 0)
-#define PM800_EXTON_INT_STS1 (1 << 1)
-#define PM800_CHG_INT_STS1 (1 << 2)
-#define PM800_BAT_INT_STS1 (1 << 3)
-#define PM800_RTC_INT_STS1 (1 << 4)
-#define PM800_CLASSD_OC_INT_STS1 (1 << 5)
-
-#define PM800_INT_STATUS2 (0x06)
-#define PM800_VBAT_INT_STS2 (1 << 0)
-#define PM800_VSYS_INT_STS2 (1 << 1)
-#define PM800_VCHG_INT_STS2 (1 << 2)
-#define PM800_TINT_INT_STS2 (1 << 3)
-#define PM800_GPADC0_INT_STS2 (1 << 4)
-#define PM800_TBAT_INT_STS2 (1 << 5)
-#define PM800_GPADC2_INT_STS2 (1 << 6)
-#define PM800_GPADC3_INT_STS2 (1 << 7)
-
-#define PM800_INT_STATUS3 (0x07)
-
-#define PM800_INT_STATUS4 (0x08)
-#define PM800_GPIO0_INT_STS4 (1 << 0)
-#define PM800_GPIO1_INT_STS4 (1 << 1)
-#define PM800_GPIO2_INT_STS4 (1 << 2)
-#define PM800_GPIO3_INT_STS4 (1 << 3)
-#define PM800_GPIO4_INT_STS4 (1 << 4)
-
-#define PM800_INT_ENA_1 (0x09)
-#define PM800_ONKEY_INT_ENA1 (1 << 0)
-#define PM800_EXTON_INT_ENA1 (1 << 1)
-#define PM800_CHG_INT_ENA1 (1 << 2)
-#define PM800_BAT_INT_ENA1 (1 << 3)
-#define PM800_RTC_INT_ENA1 (1 << 4)
-#define PM800_CLASSD_OC_INT_ENA1 (1 << 5)
-
-#define PM800_INT_ENA_2 (0x0A)
-#define PM800_VBAT_INT_ENA2 (1 << 0)
-#define PM800_VSYS_INT_ENA2 (1 << 1)
-#define PM800_VCHG_INT_ENA2 (1 << 2)
-#define PM800_TINT_INT_ENA2 (1 << 3)
-
-#define PM800_INT_ENA_3 (0x0B)
-#define PM800_GPADC0_INT_ENA3 (1 << 0)
-#define PM800_GPADC1_INT_ENA3 (1 << 1)
-#define PM800_GPADC2_INT_ENA3 (1 << 2)
-#define PM800_GPADC3_INT_ENA3 (1 << 3)
-#define PM800_GPADC4_INT_ENA3 (1 << 4)
-
-#define PM800_INT_ENA_4 (0x0C)
-#define PM800_GPIO0_INT_ENA4 (1 << 0)
-#define PM800_GPIO1_INT_ENA4 (1 << 1)
-#define PM800_GPIO2_INT_ENA4 (1 << 2)
-#define PM800_GPIO3_INT_ENA4 (1 << 3)
-#define PM800_GPIO4_INT_ENA4 (1 << 4)
-
-/* number of INT_ENA & INT_STATUS regs */
-#define PM800_INT_REG_NUM (4)
-
-/* Interrupt Number in 88PM800 */
-enum {
- PM800_IRQ_ONKEY, /*EN1b0 *//*0 */
- PM800_IRQ_EXTON, /*EN1b1 */
- PM800_IRQ_CHG, /*EN1b2 */
- PM800_IRQ_BAT, /*EN1b3 */
- PM800_IRQ_RTC, /*EN1b4 */
- PM800_IRQ_CLASSD, /*EN1b5 *//*5 */
- PM800_IRQ_VBAT, /*EN2b0 */
- PM800_IRQ_VSYS, /*EN2b1 */
- PM800_IRQ_VCHG, /*EN2b2 */
- PM800_IRQ_TINT, /*EN2b3 */
- PM800_IRQ_GPADC0, /*EN3b0 *//*10 */
- PM800_IRQ_GPADC1, /*EN3b1 */
- PM800_IRQ_GPADC2, /*EN3b2 */
- PM800_IRQ_GPADC3, /*EN3b3 */
- PM800_IRQ_GPADC4, /*EN3b4 */
- PM800_IRQ_GPIO0, /*EN4b0 *//*15 */
- PM800_IRQ_GPIO1, /*EN4b1 */
- PM800_IRQ_GPIO2, /*EN4b2 */
- PM800_IRQ_GPIO3, /*EN4b3 */
- PM800_IRQ_GPIO4, /*EN4b4 *//*19 */
- PM800_MAX_IRQ,
-};
-
-/* PM800: generation identification number */
-#define PM800_CHIP_GEN_ID_NUM 0x3
-
-static const struct i2c_device_id pm80x_id_table[] = {
- { "88PM800" },
- {} /* NULL terminated */
-};
-MODULE_DEVICE_TABLE(i2c, pm80x_id_table);
-
-static const struct resource rtc_resources[] = {
- DEFINE_RES_IRQ_NAMED(PM800_IRQ_RTC, "88pm80x-rtc"),
-};
-
-static struct mfd_cell rtc_devs[] = {
- {
- .name = "88pm80x-rtc",
- .num_resources = ARRAY_SIZE(rtc_resources),
- .resources = &rtc_resources[0],
- .id = -1,
- },
-};
-
-static struct resource onkey_resources[] = {
- DEFINE_RES_IRQ_NAMED(PM800_IRQ_ONKEY, "88pm80x-onkey"),
-};
-
-static const struct mfd_cell onkey_devs[] = {
- {
- .name = "88pm80x-onkey",
- .num_resources = 1,
- .resources = &onkey_resources[0],
- .id = -1,
- },
-};
-
-static const struct mfd_cell regulator_devs[] = {
- {
- .name = "88pm80x-regulator",
- .id = -1,
- },
-};
-
-static const struct regmap_irq pm800_irqs[] = {
- /* INT0 */
- [PM800_IRQ_ONKEY] = {
- .mask = PM800_ONKEY_INT_ENA1,
- },
- [PM800_IRQ_EXTON] = {
- .mask = PM800_EXTON_INT_ENA1,
- },
- [PM800_IRQ_CHG] = {
- .mask = PM800_CHG_INT_ENA1,
- },
- [PM800_IRQ_BAT] = {
- .mask = PM800_BAT_INT_ENA1,
- },
- [PM800_IRQ_RTC] = {
- .mask = PM800_RTC_INT_ENA1,
- },
- [PM800_IRQ_CLASSD] = {
- .mask = PM800_CLASSD_OC_INT_ENA1,
- },
- /* INT1 */
- [PM800_IRQ_VBAT] = {
- .reg_offset = 1,
- .mask = PM800_VBAT_INT_ENA2,
- },
- [PM800_IRQ_VSYS] = {
- .reg_offset = 1,
- .mask = PM800_VSYS_INT_ENA2,
- },
- [PM800_IRQ_VCHG] = {
- .reg_offset = 1,
- .mask = PM800_VCHG_INT_ENA2,
- },
- [PM800_IRQ_TINT] = {
- .reg_offset = 1,
- .mask = PM800_TINT_INT_ENA2,
- },
- /* INT2 */
- [PM800_IRQ_GPADC0] = {
- .reg_offset = 2,
- .mask = PM800_GPADC0_INT_ENA3,
- },
- [PM800_IRQ_GPADC1] = {
- .reg_offset = 2,
- .mask = PM800_GPADC1_INT_ENA3,
- },
- [PM800_IRQ_GPADC2] = {
- .reg_offset = 2,
- .mask = PM800_GPADC2_INT_ENA3,
- },
- [PM800_IRQ_GPADC3] = {
- .reg_offset = 2,
- .mask = PM800_GPADC3_INT_ENA3,
- },
- [PM800_IRQ_GPADC4] = {
- .reg_offset = 2,
- .mask = PM800_GPADC4_INT_ENA3,
- },
- /* INT3 */
- [PM800_IRQ_GPIO0] = {
- .reg_offset = 3,
- .mask = PM800_GPIO0_INT_ENA4,
- },
- [PM800_IRQ_GPIO1] = {
- .reg_offset = 3,
- .mask = PM800_GPIO1_INT_ENA4,
- },
- [PM800_IRQ_GPIO2] = {
- .reg_offset = 3,
- .mask = PM800_GPIO2_INT_ENA4,
- },
- [PM800_IRQ_GPIO3] = {
- .reg_offset = 3,
- .mask = PM800_GPIO3_INT_ENA4,
- },
- [PM800_IRQ_GPIO4] = {
- .reg_offset = 3,
- .mask = PM800_GPIO4_INT_ENA4,
- },
-};
-
-static int device_gpadc_init(struct pm80x_chip *chip,
- struct pm80x_platform_data *pdata)
-{
- struct pm80x_subchip *subchip = chip->subchip;
- struct regmap *map = subchip->regmap_gpadc;
- int data = 0, mask = 0, ret = 0;
-
- if (!map) {
- dev_warn(chip->dev,
- "Warning: gpadc regmap is not available!\n");
- return -EINVAL;
- }
- /*
- * initialize GPADC without activating it turn on GPADC
- * measurments
- */
- ret = regmap_update_bits(map,
- PM800_GPADC_MISC_CONFIG2,
- PM800_GPADC_MISC_GPFSM_EN,
- PM800_GPADC_MISC_GPFSM_EN);
- if (ret < 0)
- goto out;
- /*
- * This function configures the ADC as requires for
- * CP implementation.CP does not "own" the ADC configuration
- * registers and relies on AP.
- * Reason: enable automatic ADC measurements needed
- * for CP to get VBAT and RF temperature readings.
- */
- ret = regmap_update_bits(map, PM800_GPADC_MEAS_EN1,
- PM800_MEAS_EN1_VBAT, PM800_MEAS_EN1_VBAT);
- if (ret < 0)
- goto out;
- ret = regmap_update_bits(map, PM800_GPADC_MEAS_EN2,
- (PM800_MEAS_EN2_RFTMP | PM800_MEAS_GP0_EN),
- (PM800_MEAS_EN2_RFTMP | PM800_MEAS_GP0_EN));
- if (ret < 0)
- goto out;
-
- /*
- * the defult of PM800 is GPADC operates at 100Ks/s rate
- * and Number of GPADC slots with active current bias prior
- * to GPADC sampling = 1 slot for all GPADCs set for
- * Temprature mesurmants
- */
- mask = (PM800_GPADC_GP_BIAS_EN0 | PM800_GPADC_GP_BIAS_EN1 |
- PM800_GPADC_GP_BIAS_EN2 | PM800_GPADC_GP_BIAS_EN3);
-
- if (pdata && (pdata->batt_det == 0))
- data = (PM800_GPADC_GP_BIAS_EN0 | PM800_GPADC_GP_BIAS_EN1 |
- PM800_GPADC_GP_BIAS_EN2 | PM800_GPADC_GP_BIAS_EN3);
- else
- data = (PM800_GPADC_GP_BIAS_EN0 | PM800_GPADC_GP_BIAS_EN2 |
- PM800_GPADC_GP_BIAS_EN3);
-
- ret = regmap_update_bits(map, PM800_GP_BIAS_ENA1, mask, data);
- if (ret < 0)
- goto out;
-
- dev_info(chip->dev, "pm800 device_gpadc_init: Done\n");
- return 0;
-
-out:
- dev_info(chip->dev, "pm800 device_gpadc_init: Failed!\n");
- return ret;
-}
-
-static int device_onkey_init(struct pm80x_chip *chip,
- struct pm80x_platform_data *pdata)
-{
- int ret;
-
- ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0],
- ARRAY_SIZE(onkey_devs), &onkey_resources[0], 0,
- NULL);
- if (ret) {
- dev_err(chip->dev, "Failed to add onkey subdev\n");
- return ret;
- }
-
- return 0;
-}
-
-static int device_rtc_init(struct pm80x_chip *chip,
- struct pm80x_platform_data *pdata)
-{
- int ret;
-
- if (pdata) {
- rtc_devs[0].platform_data = pdata->rtc;
- rtc_devs[0].pdata_size =
- pdata->rtc ? sizeof(struct pm80x_rtc_pdata) : 0;
- }
- ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0],
- ARRAY_SIZE(rtc_devs), NULL, 0, NULL);
- if (ret) {
- dev_err(chip->dev, "Failed to add rtc subdev\n");
- return ret;
- }
-
- return 0;
-}
-
-static int device_regulator_init(struct pm80x_chip *chip,
- struct pm80x_platform_data *pdata)
-{
- int ret;
-
- ret = mfd_add_devices(chip->dev, 0, ®ulator_devs[0],
- ARRAY_SIZE(regulator_devs), NULL, 0, NULL);
- if (ret) {
- dev_err(chip->dev, "Failed to add regulator subdev\n");
- return ret;
- }
-
- return 0;
-}
-
-static int device_irq_init_800(struct pm80x_chip *chip)
-{
- struct regmap *map = chip->regmap;
- unsigned long flags = IRQF_ONESHOT;
- int data, mask, ret = -EINVAL;
-
- if (!map || !chip->irq) {
- dev_err(chip->dev, "incorrect parameters\n");
- return -EINVAL;
- }
-
- /*
- * irq_mode defines the way of clearing interrupt. it's read-clear by
- * default.
- */
- mask =
- PM800_WAKEUP2_INV_INT | PM800_WAKEUP2_INT_CLEAR |
- PM800_WAKEUP2_INT_MASK;
-
- data = PM800_WAKEUP2_INT_CLEAR;
- ret = regmap_update_bits(map, PM800_WAKEUP2, mask, data);
-
- if (ret < 0)
- goto out;
-
- ret =
- regmap_add_irq_chip(chip->regmap, chip->irq, flags, -1,
- chip->regmap_irq_chip, &chip->irq_data);
-
-out:
- return ret;
-}
-
-static void device_irq_exit_800(struct pm80x_chip *chip)
-{
- regmap_del_irq_chip(chip->irq, chip->irq_data);
-}
-
-static const struct regmap_irq_chip pm800_irq_chip = {
- .name = "88pm800",
- .irqs = pm800_irqs,
- .num_irqs = ARRAY_SIZE(pm800_irqs),
-
- .num_regs = 4,
- .status_base = PM800_INT_STATUS1,
- .unmask_base = PM800_INT_ENA_1,
- .ack_base = PM800_INT_STATUS1,
-};
-
-static int pm800_pages_init(struct pm80x_chip *chip)
-{
- struct pm80x_subchip *subchip;
- struct i2c_client *client = chip->client;
-
- int ret = 0;
-
- subchip = chip->subchip;
- if (!subchip || !subchip->power_page_addr || !subchip->gpadc_page_addr)
- return -ENODEV;
-
- /* PM800 block power page */
- subchip->power_page = i2c_new_dummy_device(client->adapter,
- subchip->power_page_addr);
- if (IS_ERR(subchip->power_page)) {
- ret = PTR_ERR(subchip->power_page);
- goto out;
- }
-
- subchip->regmap_power = devm_regmap_init_i2c(subchip->power_page,
- &pm80x_regmap_config);
- if (IS_ERR(subchip->regmap_power)) {
- ret = PTR_ERR(subchip->regmap_power);
- dev_err(chip->dev,
- "Failed to allocate regmap_power: %d\n", ret);
- goto out;
- }
-
- i2c_set_clientdata(subchip->power_page, chip);
-
- /* PM800 block GPADC */
- subchip->gpadc_page = i2c_new_dummy_device(client->adapter,
- subchip->gpadc_page_addr);
- if (IS_ERR(subchip->gpadc_page)) {
- ret = PTR_ERR(subchip->gpadc_page);
- goto out;
- }
-
- subchip->regmap_gpadc = devm_regmap_init_i2c(subchip->gpadc_page,
- &pm80x_regmap_config);
- if (IS_ERR(subchip->regmap_gpadc)) {
- ret = PTR_ERR(subchip->regmap_gpadc);
- dev_err(chip->dev,
- "Failed to allocate regmap_gpadc: %d\n", ret);
- goto out;
- }
- i2c_set_clientdata(subchip->gpadc_page, chip);
-
-out:
- return ret;
-}
-
-static void pm800_pages_exit(struct pm80x_chip *chip)
-{
- struct pm80x_subchip *subchip;
-
- subchip = chip->subchip;
-
- if (subchip && subchip->power_page)
- i2c_unregister_device(subchip->power_page);
-
- if (subchip && subchip->gpadc_page)
- i2c_unregister_device(subchip->gpadc_page);
-}
-
-static int device_800_init(struct pm80x_chip *chip,
- struct pm80x_platform_data *pdata)
-{
- int ret;
- unsigned int val;
-
- /*
- * alarm wake up bit will be clear in device_irq_init(),
- * read before that
- */
- ret = regmap_read(chip->regmap, PM800_RTC_CONTROL, &val);
- if (ret < 0) {
- dev_err(chip->dev, "Failed to read RTC register: %d\n", ret);
- goto out;
- }
- if (val & PM800_ALARM_WAKEUP) {
- if (pdata && pdata->rtc)
- pdata->rtc->rtc_wakeup = 1;
- }
-
- ret = device_gpadc_init(chip, pdata);
- if (ret < 0) {
- dev_err(chip->dev, "[%s]Failed to init gpadc\n", __func__);
- goto out;
- }
-
- chip->regmap_irq_chip = &pm800_irq_chip;
-
- ret = device_irq_init_800(chip);
- if (ret < 0) {
- dev_err(chip->dev, "[%s]Failed to init pm800 irq\n", __func__);
- goto out;
- }
-
- ret = device_onkey_init(chip, pdata);
- if (ret) {
- dev_err(chip->dev, "Failed to add onkey subdev\n");
- goto out_dev;
- }
-
- ret = device_rtc_init(chip, pdata);
- if (ret) {
- dev_err(chip->dev, "Failed to add rtc subdev\n");
- goto out;
- }
-
- ret = device_regulator_init(chip, pdata);
- if (ret) {
- dev_err(chip->dev, "Failed to add regulators subdev\n");
- goto out;
- }
-
- return 0;
-out_dev:
- mfd_remove_devices(chip->dev);
- device_irq_exit_800(chip);
-out:
- return ret;
-}
-
-static int pm800_probe(struct i2c_client *client)
-{
- int ret = 0;
- struct pm80x_chip *chip;
- struct pm80x_platform_data *pdata = dev_get_platdata(&client->dev);
- struct pm80x_subchip *subchip;
-
- ret = pm80x_init(client);
- if (ret) {
- dev_err(&client->dev, "pm800_init fail\n");
- goto out_init;
- }
-
- chip = i2c_get_clientdata(client);
-
- /* init subchip for PM800 */
- subchip =
- devm_kzalloc(&client->dev, sizeof(struct pm80x_subchip),
- GFP_KERNEL);
- if (!subchip) {
- ret = -ENOMEM;
- goto err_subchip_alloc;
- }
-
- /* pm800 has 2 addtional pages to support power and gpadc. */
- subchip->power_page_addr = client->addr + 1;
- subchip->gpadc_page_addr = client->addr + 2;
- chip->subchip = subchip;
-
- ret = pm800_pages_init(chip);
- if (ret) {
- dev_err(&client->dev, "pm800_pages_init failed!\n");
- goto err_device_init;
- }
-
- ret = device_800_init(chip, pdata);
- if (ret) {
- dev_err(chip->dev, "Failed to initialize 88pm800 devices\n");
- goto err_device_init;
- }
-
- if (pdata && pdata->plat_config)
- pdata->plat_config(chip, pdata);
-
- return 0;
-
-err_device_init:
- pm800_pages_exit(chip);
-err_subchip_alloc:
- pm80x_deinit();
-out_init:
- return ret;
-}
-
-static void pm800_remove(struct i2c_client *client)
-{
- struct pm80x_chip *chip = i2c_get_clientdata(client);
-
- mfd_remove_devices(chip->dev);
- device_irq_exit_800(chip);
-
- pm800_pages_exit(chip);
- pm80x_deinit();
-}
-
-static struct i2c_driver pm800_driver = {
- .driver = {
- .name = "88PM800",
- .pm = pm_sleep_ptr(&pm80x_pm_ops),
- },
- .probe = pm800_probe,
- .remove = pm800_remove,
- .id_table = pm80x_id_table,
-};
-
-static int __init pm800_i2c_init(void)
-{
- return i2c_add_driver(&pm800_driver);
-}
-subsys_initcall(pm800_i2c_init);
-
-static void __exit pm800_i2c_exit(void)
-{
- i2c_del_driver(&pm800_driver);
-}
-module_exit(pm800_i2c_exit);
-
-MODULE_DESCRIPTION("PMIC Driver for Marvell 88PM800");
-MODULE_AUTHOR("Qiao Zhou <zhouqiao@marvell.com>");
-MODULE_LICENSE("GPL");
diff --git a/drivers/mfd/88pm805.c b/drivers/mfd/88pm805.c
deleted file mode 100644
index f5d6663172ee..000000000000
--- a/drivers/mfd/88pm805.c
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Base driver for Marvell 88PM805
- *
- * Copyright (C) 2012 Marvell International Ltd.
- * Haojian Zhuang <haojian.zhuang@marvell.com>
- * Joseph(Yossi) Hanin <yhanin@marvell.com>
- * Qiao Zhou <zhouqiao@marvell.com>
- *
- * This file is subject to the terms and conditions of the GNU General
- * Public License. See the file "COPYING" in the main directory of this
- * archive for more details.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/i2c.h>
-#include <linux/irq.h>
-#include <linux/mfd/core.h>
-#include <linux/mfd/88pm80x.h>
-#include <linux/slab.h>
-#include <linux/delay.h>
-
-static const struct i2c_device_id pm80x_id_table[] = {
- { "88PM805" },
- {} /* NULL terminated */
-};
-MODULE_DEVICE_TABLE(i2c, pm80x_id_table);
-
-/* Interrupt Number in 88PM805 */
-enum {
- PM805_IRQ_LDO_OFF, /*0 */
- PM805_IRQ_SRC_DPLL_LOCK, /*1 */
- PM805_IRQ_CLIP_FAULT,
- PM805_IRQ_MIC_CONFLICT,
- PM805_IRQ_HP2_SHRT,
- PM805_IRQ_HP1_SHRT, /*5 */
- PM805_IRQ_FINE_PLL_FAULT,
- PM805_IRQ_RAW_PLL_FAULT,
- PM805_IRQ_VOLP_BTN_DET,
- PM805_IRQ_VOLM_BTN_DET,
- PM805_IRQ_SHRT_BTN_DET, /*10 */
- PM805_IRQ_MIC_DET, /*11 */
-
- PM805_MAX_IRQ,
-};
-
-static struct resource codec_resources[] = {
- /* Headset microphone insertion or removal */
- DEFINE_RES_IRQ_NAMED(PM805_IRQ_MIC_DET, "micin"),
-
- /* Audio short HP1 */
- DEFINE_RES_IRQ_NAMED(PM805_IRQ_HP1_SHRT, "audio-short1"),
-
- /* Audio short HP2 */
- DEFINE_RES_IRQ_NAMED(PM805_IRQ_HP2_SHRT, "audio-short2"),
-};
-
-static const struct mfd_cell codec_devs[] = {
- {
- .name = "88pm80x-codec",
- .num_resources = ARRAY_SIZE(codec_resources),
- .resources = &codec_resources[0],
- .id = -1,
- },
-};
-
-static const struct regmap_irq pm805_irqs[] = {
- /* INT0 */
- [PM805_IRQ_LDO_OFF] = {
- .mask = PM805_INT1_HP1_SHRT,
- },
- [PM805_IRQ_SRC_DPLL_LOCK] = {
- .mask = PM805_INT1_HP2_SHRT,
- },
- [PM805_IRQ_CLIP_FAULT] = {
- .mask = PM805_INT1_MIC_CONFLICT,
- },
- [PM805_IRQ_MIC_CONFLICT] = {
- .mask = PM805_INT1_CLIP_FAULT,
- },
- [PM805_IRQ_HP2_SHRT] = {
- .mask = PM805_INT1_LDO_OFF,
- },
- [PM805_IRQ_HP1_SHRT] = {
- .mask = PM805_INT1_SRC_DPLL_LOCK,
- },
- /* INT1 */
- [PM805_IRQ_FINE_PLL_FAULT] = {
- .reg_offset = 1,
- .mask = PM805_INT2_MIC_DET,
- },
- [PM805_IRQ_RAW_PLL_FAULT] = {
- .reg_offset = 1,
- .mask = PM805_INT2_SHRT_BTN_DET,
- },
- [PM805_IRQ_VOLP_BTN_DET] = {
- .reg_offset = 1,
- .mask = PM805_INT2_VOLM_BTN_DET,
- },
- [PM805_IRQ_VOLM_BTN_DET] = {
- .reg_offset = 1,
- .mask = PM805_INT2_VOLP_BTN_DET,
- },
- [PM805_IRQ_SHRT_BTN_DET] = {
- .reg_offset = 1,
- .mask = PM805_INT2_RAW_PLL_FAULT,
- },
- [PM805_IRQ_MIC_DET] = {
- .reg_offset = 1,
- .mask = PM805_INT2_FINE_PLL_FAULT,
- },
-};
-
-static int device_irq_init_805(struct pm80x_chip *chip)
-{
- struct regmap *map = chip->regmap;
- unsigned long flags = IRQF_ONESHOT;
- int data, mask, ret = -EINVAL;
-
- if (!map || !chip->irq) {
- dev_err(chip->dev, "incorrect parameters\n");
- return -EINVAL;
- }
-
- /*
- * irq_mode defines the way of clearing interrupt. it's read-clear by
- * default.
- */
- mask =
- PM805_STATUS0_INT_CLEAR | PM805_STATUS0_INV_INT |
- PM800_STATUS0_INT_MASK;
-
- data = PM805_STATUS0_INT_CLEAR;
- ret = regmap_update_bits(map, PM805_INT_STATUS0, mask, data);
- /*
- * PM805_INT_STATUS is under 32K clock domain, so need to
- * add proper delay before the next I2C register access.
- */
- usleep_range(1000, 3000);
-
- if (ret < 0)
- goto out;
-
- ret =
- regmap_add_irq_chip(chip->regmap, chip->irq, flags, -1,
- chip->regmap_irq_chip, &chip->irq_data);
-
-out:
- return ret;
-}
-
-static void device_irq_exit_805(struct pm80x_chip *chip)
-{
- regmap_del_irq_chip(chip->irq, chip->irq_data);
-}
-
-static const struct regmap_irq_chip pm805_irq_chip = {
- .name = "88pm805",
- .irqs = pm805_irqs,
- .num_irqs = ARRAY_SIZE(pm805_irqs),
-
- .num_regs = 2,
- .status_base = PM805_INT_STATUS1,
- .mask_base = PM805_INT_MASK1,
- .ack_base = PM805_INT_STATUS1,
-};
-
-static int device_805_init(struct pm80x_chip *chip)
-{
- int ret = 0;
- struct regmap *map = chip->regmap;
-
- if (!map) {
- dev_err(chip->dev, "regmap is invalid\n");
- return -EINVAL;
- }
-
- chip->regmap_irq_chip = &pm805_irq_chip;
-
- ret = device_irq_init_805(chip);
- if (ret < 0) {
- dev_err(chip->dev, "Failed to init pm805 irq!\n");
- goto out_irq_init;
- }
-
- ret = mfd_add_devices(chip->dev, 0, &codec_devs[0],
- ARRAY_SIZE(codec_devs), &codec_resources[0], 0,
- NULL);
- if (ret < 0) {
- dev_err(chip->dev, "Failed to add codec subdev\n");
- goto out_codec;
- } else
- dev_info(chip->dev, "[%s]:Added mfd codec_devs\n", __func__);
-
- return 0;
-
-out_codec:
- device_irq_exit_805(chip);
-out_irq_init:
- return ret;
-}
-
-static int pm805_probe(struct i2c_client *client)
-{
- int ret = 0;
- struct pm80x_chip *chip;
- struct pm80x_platform_data *pdata = dev_get_platdata(&client->dev);
-
- ret = pm80x_init(client);
- if (ret) {
- dev_err(&client->dev, "pm805_init fail!\n");
- goto out_init;
- }
-
- chip = i2c_get_clientdata(client);
-
- ret = device_805_init(chip);
- if (ret) {
- dev_err(chip->dev, "Failed to initialize 88pm805 devices\n");
- goto err_805_init;
- }
-
- if (pdata && pdata->plat_config)
- pdata->plat_config(chip, pdata);
-
-err_805_init:
- pm80x_deinit();
-out_init:
- return ret;
-}
-
-static void pm805_remove(struct i2c_client *client)
-{
- struct pm80x_chip *chip = i2c_get_clientdata(client);
-
- mfd_remove_devices(chip->dev);
- device_irq_exit_805(chip);
-
- pm80x_deinit();
-}
-
-static struct i2c_driver pm805_driver = {
- .driver = {
- .name = "88PM805",
- .pm = pm_sleep_ptr(&pm80x_pm_ops),
- },
- .probe = pm805_probe,
- .remove = pm805_remove,
- .id_table = pm80x_id_table,
-};
-
-static int __init pm805_i2c_init(void)
-{
- return i2c_add_driver(&pm805_driver);
-}
-subsys_initcall(pm805_i2c_init);
-
-static void __exit pm805_i2c_exit(void)
-{
- i2c_del_driver(&pm805_driver);
-}
-module_exit(pm805_i2c_exit);
-
-MODULE_DESCRIPTION("PMIC Driver for Marvell 88PM805");
-MODULE_AUTHOR("Qiao Zhou <zhouqiao@marvell.com>");
-MODULE_LICENSE("GPL");
diff --git a/drivers/mfd/88pm80x.c b/drivers/mfd/88pm80x.c
deleted file mode 100644
index bbc1a87f0c8f..000000000000
--- a/drivers/mfd/88pm80x.c
+++ /dev/null
@@ -1,159 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * I2C driver for Marvell 88PM80x
- *
- * Copyright (C) 2012 Marvell International Ltd.
- * Haojian Zhuang <haojian.zhuang@marvell.com>
- * Joseph(Yossi) Hanin <yhanin@marvell.com>
- * Qiao Zhou <zhouqiao@marvell.com>
- */
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/i2c.h>
-#include <linux/mfd/88pm80x.h>
-#include <linux/slab.h>
-#include <linux/uaccess.h>
-#include <linux/err.h>
-
-/* 88pm80x chips have same definition for chip id register. */
-#define PM80X_CHIP_ID (0x00)
-#define PM80X_CHIP_ID_NUM(x) (((x) >> 5) & 0x7)
-#define PM80X_CHIP_ID_REVISION(x) ((x) & 0x1F)
-
-struct pm80x_chip_mapping {
- unsigned int id;
- int type;
-};
-
-static struct pm80x_chip_mapping chip_mapping[] = {
- /* 88PM800 chip id number */
- {0x3, CHIP_PM800},
- /* 88PM805 chip id number */
- {0x0, CHIP_PM805},
- /* 88PM860 chip id number */
- {0x4, CHIP_PM860},
-};
-
-/*
- * workaround: some registers needed by pm805 are defined in pm800, so
- * need to use this global variable to maintain the relation between
- * pm800 and pm805. would remove it after HW chip fixes the issue.
- */
-static struct pm80x_chip *g_pm80x_chip;
-
-const struct regmap_config pm80x_regmap_config = {
- .reg_bits = 8,
- .val_bits = 8,
-};
-EXPORT_SYMBOL_GPL(pm80x_regmap_config);
-
-
-int pm80x_init(struct i2c_client *client)
-{
- struct pm80x_chip *chip;
- struct regmap *map;
- unsigned int val;
- int i, ret = 0;
-
- chip =
- devm_kzalloc(&client->dev, sizeof(struct pm80x_chip), GFP_KERNEL);
- if (!chip)
- return -ENOMEM;
-
- map = devm_regmap_init_i2c(client, &pm80x_regmap_config);
- if (IS_ERR(map)) {
- ret = PTR_ERR(map);
- dev_err(&client->dev, "Failed to allocate register map: %d\n",
- ret);
- return ret;
- }
-
- chip->client = client;
- chip->regmap = map;
-
- chip->irq = client->irq;
-
- chip->dev = &client->dev;
- i2c_set_clientdata(chip->client, chip);
-
- ret = regmap_read(chip->regmap, PM80X_CHIP_ID, &val);
- if (ret < 0) {
- dev_err(chip->dev, "Failed to read CHIP ID: %d\n", ret);
- return ret;
- }
-
- for (i = 0; i < ARRAY_SIZE(chip_mapping); i++) {
- if (chip_mapping[i].id == PM80X_CHIP_ID_NUM(val)) {
- chip->type = chip_mapping[i].type;
- break;
- }
- }
-
- if (i == ARRAY_SIZE(chip_mapping)) {
- dev_err(chip->dev,
- "Failed to detect Marvell 88PM800:ChipID[0x%x]\n", val);
- return -EINVAL;
- }
-
- device_init_wakeup(&client->dev, 1);
-
- /*
- * workaround: set g_pm80x_chip to the first probed chip. if the
- * second chip is probed, just point to the companion to each
- * other so that pm805 can access those specific register. would
- * remove it after HW chip fixes the issue.
- */
- if (!g_pm80x_chip)
- g_pm80x_chip = chip;
- else {
- chip->companion = g_pm80x_chip->client;
- g_pm80x_chip->companion = chip->client;
- }
-
- return 0;
-}
-EXPORT_SYMBOL_GPL(pm80x_init);
-
-int pm80x_deinit(void)
-{
- /*
- * workaround: clear the dependency between pm800 and pm805.
- * would remove it after HW chip fixes the issue.
- */
- if (g_pm80x_chip->companion)
- g_pm80x_chip->companion = NULL;
- else
- g_pm80x_chip = NULL;
- return 0;
-}
-EXPORT_SYMBOL_GPL(pm80x_deinit);
-
-static int pm80x_suspend(struct device *dev)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct pm80x_chip *chip = i2c_get_clientdata(client);
-
- if (chip && chip->wu_flag)
- if (device_may_wakeup(chip->dev))
- enable_irq_wake(chip->irq);
-
- return 0;
-}
-
-static int pm80x_resume(struct device *dev)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct pm80x_chip *chip = i2c_get_clientdata(client);
-
- if (chip && chip->wu_flag)
- if (device_may_wakeup(chip->dev))
- disable_irq_wake(chip->irq);
-
- return 0;
-}
-
-EXPORT_GPL_SIMPLE_DEV_PM_OPS(pm80x_pm_ops, pm80x_suspend, pm80x_resume);
-
-MODULE_DESCRIPTION("I2C Driver for Marvell 88PM80x");
-MODULE_AUTHOR("Qiao Zhou <zhouqiao@marvell.com>");
-MODULE_LICENSE("GPL");
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index e4fd4572472f..de81d2bb4917 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -858,30 +858,6 @@ config MFD_KEMPLD
This driver can also be built as a module. If so, the module
will be called kempld-core.
-config MFD_88PM800
- tristate "Marvell 88PM800"
- depends on I2C
- select REGMAP_I2C
- select REGMAP_IRQ
- select MFD_CORE
- help
- This supports for Marvell 88PM800 Power Management IC.
- This includes the I2C driver and the core APIs _only_, you have to
- select individual components like voltage regulators, RTC and
- battery-charger under the corresponding menus.
-
-config MFD_88PM805
- tristate "Marvell 88PM805"
- depends on I2C
- select REGMAP_I2C
- select REGMAP_IRQ
- select MFD_CORE
- help
- This supports for Marvell 88PM805 Power Management IC. This includes
- the I2C driver and the core APIs _only_, you have to select individual
- components like codec device, headset/Mic device under the
- corresponding menus.
-
config MFD_88PM860X
bool "Marvell 88PM8606/88PM8607"
depends on I2C=y
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 72d3944b0ad8..fe7156a5187a 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -5,8 +5,6 @@
88pm860x-objs := 88pm860x-core.o 88pm860x-i2c.o
obj-$(CONFIG_MFD_88PM860X) += 88pm860x.o
-obj-$(CONFIG_MFD_88PM800) += 88pm800.o 88pm80x.o
-obj-$(CONFIG_MFD_88PM805) += 88pm805.o 88pm80x.o
obj-$(CONFIG_MFD_88PM886_PMIC) += 88pm886.o
obj-$(CONFIG_MFD_ACT8945A) += act8945a.o
obj-$(CONFIG_MFD_SM501) += sm501.o
diff --git a/drivers/regulator/88pm800-regulator.c b/drivers/regulator/88pm800-regulator.c
deleted file mode 100644
index 83e8860309dc..000000000000
--- a/drivers/regulator/88pm800-regulator.c
+++ /dev/null
@@ -1,287 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Regulators driver for Marvell 88PM800
- *
- * Copyright (C) 2012 Marvell International Ltd.
- * Joseph(Yossi) Hanin <yhanin@marvell.com>
- * Yi Zhang <yizhang@marvell.com>
- */
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/init.h>
-#include <linux/err.h>
-#include <linux/regmap.h>
-#include <linux/regulator/driver.h>
-#include <linux/regulator/machine.h>
-#include <linux/mfd/88pm80x.h>
-#include <linux/delay.h>
-#include <linux/io.h>
-#include <linux/of.h>
-#include <linux/regulator/of_regulator.h>
-
-/* LDO1 with DVC[0..3] */
-#define PM800_LDO1_VOUT (0x08) /* VOUT1 */
-#define PM800_LDO1_VOUT_2 (0x09)
-#define PM800_LDO1_VOUT_3 (0x0A)
-#define PM800_LDO2_VOUT (0x0B)
-#define PM800_LDO3_VOUT (0x0C)
-#define PM800_LDO4_VOUT (0x0D)
-#define PM800_LDO5_VOUT (0x0E)
-#define PM800_LDO6_VOUT (0x0F)
-#define PM800_LDO7_VOUT (0x10)
-#define PM800_LDO8_VOUT (0x11)
-#define PM800_LDO9_VOUT (0x12)
-#define PM800_LDO10_VOUT (0x13)
-#define PM800_LDO11_VOUT (0x14)
-#define PM800_LDO12_VOUT (0x15)
-#define PM800_LDO13_VOUT (0x16)
-#define PM800_LDO14_VOUT (0x17)
-#define PM800_LDO15_VOUT (0x18)
-#define PM800_LDO16_VOUT (0x19)
-#define PM800_LDO17_VOUT (0x1A)
-#define PM800_LDO18_VOUT (0x1B)
-#define PM800_LDO19_VOUT (0x1C)
-
-/* BUCK1 with DVC[0..3] */
-#define PM800_BUCK1 (0x3C)
-#define PM800_BUCK1_1 (0x3D)
-#define PM800_BUCK1_2 (0x3E)
-#define PM800_BUCK1_3 (0x3F)
-#define PM800_BUCK2 (0x40)
-#define PM800_BUCK3 (0x41)
-#define PM800_BUCK4 (0x42)
-#define PM800_BUCK4_1 (0x43)
-#define PM800_BUCK4_2 (0x44)
-#define PM800_BUCK4_3 (0x45)
-#define PM800_BUCK5 (0x46)
-
-#define PM800_BUCK_ENA (0x50)
-#define PM800_LDO_ENA1_1 (0x51)
-#define PM800_LDO_ENA1_2 (0x52)
-#define PM800_LDO_ENA1_3 (0x53)
-
-#define PM800_LDO_ENA2_1 (0x56)
-#define PM800_LDO_ENA2_2 (0x57)
-#define PM800_LDO_ENA2_3 (0x58)
-
-#define PM800_BUCK1_MISC1 (0x78)
-#define PM800_BUCK3_MISC1 (0x7E)
-#define PM800_BUCK4_MISC1 (0x81)
-#define PM800_BUCK5_MISC1 (0x84)
-
-struct pm800_regulator_info {
- struct regulator_desc desc;
- int max_ua;
-};
-
-/*
- * vreg - the buck regs string.
- * ereg - the string for the enable register.
- * ebit - the bit number in the enable register.
- * amax - the current
- * Buck has 2 kinds of voltage steps. It is easy to find voltage by ranges,
- * not the constant voltage table.
- * n_volt - Number of available selectors
- */
-#define PM800_BUCK(match, vreg, ereg, ebit, amax, volt_ranges, n_volt) \
-{ \
- .desc = { \
- .name = #vreg, \
- .of_match = of_match_ptr(#match), \
- .regulators_node = of_match_ptr("regulators"), \
- .ops = &pm800_volt_range_ops, \
- .type = REGULATOR_VOLTAGE, \
- .id = PM800_ID_##vreg, \
- .owner = THIS_MODULE, \
- .n_voltages = n_volt, \
- .linear_ranges = volt_ranges, \
- .n_linear_ranges = ARRAY_SIZE(volt_ranges), \
- .vsel_reg = PM800_##vreg, \
- .vsel_mask = 0x7f, \
- .enable_reg = PM800_##ereg, \
- .enable_mask = 1 << (ebit), \
- }, \
- .max_ua = (amax), \
-}
-
-/*
- * vreg - the LDO regs string
- * ereg - the string for the enable register.
- * ebit - the bit number in the enable register.
- * amax - the current
- * volt_table - the LDO voltage table
- * For all the LDOes, there are too many ranges. Using volt_table will be
- * simpler and faster.
- */
-#define PM800_LDO(match, vreg, ereg, ebit, amax, ldo_volt_table) \
-{ \
- .desc = { \
- .name = #vreg, \
- .of_match = of_match_ptr(#match), \
- .regulators_node = of_match_ptr("regulators"), \
- .ops = &pm800_volt_table_ops, \
- .type = REGULATOR_VOLTAGE, \
- .id = PM800_ID_##vreg, \
- .owner = THIS_MODULE, \
- .n_voltages = ARRAY_SIZE(ldo_volt_table), \
- .vsel_reg = PM800_##vreg##_VOUT, \
- .vsel_mask = 0xf, \
- .enable_reg = PM800_##ereg, \
- .enable_mask = 1 << (ebit), \
- .volt_table = ldo_volt_table, \
- }, \
- .max_ua = (amax), \
-}
-
-/* Ranges are sorted in ascending order. */
-static const struct linear_range buck1_volt_range[] = {
- REGULATOR_LINEAR_RANGE(600000, 0, 0x4f, 12500),
- REGULATOR_LINEAR_RANGE(1600000, 0x50, 0x54, 50000),
-};
-
-/* BUCK 2~5 have same ranges. */
-static const struct linear_range buck2_5_volt_range[] = {
- REGULATOR_LINEAR_RANGE(600000, 0, 0x4f, 12500),
- REGULATOR_LINEAR_RANGE(1600000, 0x50, 0x72, 50000),
-};
-
-static const unsigned int ldo1_volt_table[] = {
- 600000, 650000, 700000, 750000, 800000, 850000, 900000, 950000,
- 1000000, 1050000, 1100000, 1150000, 1200000, 1300000, 1400000, 1500000,
-};
-
-static const unsigned int ldo2_volt_table[] = {
- 1700000, 1800000, 1900000, 2000000, 2100000, 2500000, 2700000, 2800000,
-};
-
-/* LDO 3~17 have same voltage table. */
-static const unsigned int ldo3_17_volt_table[] = {
- 1200000, 1250000, 1700000, 1800000, 1850000, 1900000, 2500000, 2600000,
- 2700000, 2750000, 2800000, 2850000, 2900000, 3000000, 3100000, 3300000,
-};
-
-/* LDO 18~19 have same voltage table. */
-static const unsigned int ldo18_19_volt_table[] = {
- 1700000, 1800000, 1900000, 2500000, 2800000, 2900000, 3100000, 3300000,
-};
-
-static int pm800_get_current_limit(struct regulator_dev *rdev)
-{
- struct pm800_regulator_info *info = rdev_get_drvdata(rdev);
-
- return info->max_ua;
-}
-
-static const struct regulator_ops pm800_volt_range_ops = {
- .list_voltage = regulator_list_voltage_linear_range,
- .map_voltage = regulator_map_voltage_linear_range,
- .set_voltage_sel = regulator_set_voltage_sel_regmap,
- .get_voltage_sel = regulator_get_voltage_sel_regmap,
- .enable = regulator_enable_regmap,
- .disable = regulator_disable_regmap,
- .is_enabled = regulator_is_enabled_regmap,
- .get_current_limit = pm800_get_current_limit,
-};
-
-static const struct regulator_ops pm800_volt_table_ops = {
- .list_voltage = regulator_list_voltage_table,
- .map_voltage = regulator_map_voltage_iterate,
- .set_voltage_sel = regulator_set_voltage_sel_regmap,
- .get_voltage_sel = regulator_get_voltage_sel_regmap,
- .enable = regulator_enable_regmap,
- .disable = regulator_disable_regmap,
- .is_enabled = regulator_is_enabled_regmap,
- .get_current_limit = pm800_get_current_limit,
-};
-
-/* The array is indexed by id(PM800_ID_XXX) */
-static struct pm800_regulator_info pm800_regulator_info[] = {
- PM800_BUCK(buck1, BUCK1, BUCK_ENA, 0, 3000000, buck1_volt_range, 0x55),
- PM800_BUCK(buck2, BUCK2, BUCK_ENA, 1, 1200000, buck2_5_volt_range, 0x73),
- PM800_BUCK(buck3, BUCK3, BUCK_ENA, 2, 1200000, buck2_5_volt_range, 0x73),
- PM800_BUCK(buck4, BUCK4, BUCK_ENA, 3, 1200000, buck2_5_volt_range, 0x73),
- PM800_BUCK(buck5, BUCK5, BUCK_ENA, 4, 1200000, buck2_5_volt_range, 0x73),
-
- PM800_LDO(ldo1, LDO1, LDO_ENA1_1, 0, 200000, ldo1_volt_table),
- PM800_LDO(ldo2, LDO2, LDO_ENA1_1, 1, 10000, ldo2_volt_table),
- PM800_LDO(ldo3, LDO3, LDO_ENA1_1, 2, 300000, ldo3_17_volt_table),
- PM800_LDO(ldo4, LDO4, LDO_ENA1_1, 3, 300000, ldo3_17_volt_table),
- PM800_LDO(ldo5, LDO5, LDO_ENA1_1, 4, 300000, ldo3_17_volt_table),
- PM800_LDO(ldo6, LDO6, LDO_ENA1_1, 5, 300000, ldo3_17_volt_table),
- PM800_LDO(ldo7, LDO7, LDO_ENA1_1, 6, 300000, ldo3_17_volt_table),
- PM800_LDO(ldo8, LDO8, LDO_ENA1_1, 7, 300000, ldo3_17_volt_table),
- PM800_LDO(ldo9, LDO9, LDO_ENA1_2, 0, 300000, ldo3_17_volt_table),
- PM800_LDO(ldo10, LDO10, LDO_ENA1_2, 1, 300000, ldo3_17_volt_table),
- PM800_LDO(ldo11, LDO11, LDO_ENA1_2, 2, 300000, ldo3_17_volt_table),
- PM800_LDO(ldo12, LDO12, LDO_ENA1_2, 3, 300000, ldo3_17_volt_table),
- PM800_LDO(ldo13, LDO13, LDO_ENA1_2, 4, 300000, ldo3_17_volt_table),
- PM800_LDO(ldo14, LDO14, LDO_ENA1_2, 5, 300000, ldo3_17_volt_table),
- PM800_LDO(ldo15, LDO15, LDO_ENA1_2, 6, 300000, ldo3_17_volt_table),
- PM800_LDO(ldo16, LDO16, LDO_ENA1_2, 7, 300000, ldo3_17_volt_table),
- PM800_LDO(ldo17, LDO17, LDO_ENA1_3, 0, 300000, ldo3_17_volt_table),
- PM800_LDO(ldo18, LDO18, LDO_ENA1_3, 1, 200000, ldo18_19_volt_table),
- PM800_LDO(ldo19, LDO19, LDO_ENA1_3, 2, 200000, ldo18_19_volt_table),
-};
-
-static int pm800_regulator_probe(struct platform_device *pdev)
-{
- struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent);
- struct pm80x_platform_data *pdata = dev_get_platdata(pdev->dev.parent);
- struct regulator_config config = { };
- struct regulator_init_data *init_data;
- int i, ret;
-
- if (pdata && pdata->num_regulators) {
- unsigned int count = 0;
-
- /* Check whether num_regulator is valid. */
- for (i = 0; i < ARRAY_SIZE(pdata->regulators); i++) {
- if (pdata->regulators[i])
- count++;
- }
- if (count != pdata->num_regulators)
- return -EINVAL;
- }
-
- config.dev = chip->dev;
- config.regmap = chip->subchip->regmap_power;
- for (i = 0; i < PM800_ID_RG_MAX; i++) {
- struct regulator_dev *regulator;
-
- if (pdata && pdata->num_regulators) {
- init_data = pdata->regulators[i];
- if (!init_data)
- continue;
-
- config.init_data = init_data;
- }
-
- config.driver_data = &pm800_regulator_info[i];
-
- regulator = devm_regulator_register(&pdev->dev,
- &pm800_regulator_info[i].desc, &config);
- if (IS_ERR(regulator)) {
- ret = PTR_ERR(regulator);
- dev_err(&pdev->dev, "Failed to register %s\n",
- pm800_regulator_info[i].desc.name);
- return ret;
- }
- }
-
- return 0;
-}
-
-static struct platform_driver pm800_regulator_driver = {
- .driver = {
- .name = "88pm80x-regulator",
- .probe_type = PROBE_PREFER_ASYNCHRONOUS,
- },
- .probe = pm800_regulator_probe,
-};
-
-module_platform_driver(pm800_regulator_driver);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Joseph(Yossi) Hanin <yhanin@marvell.com>");
-MODULE_DESCRIPTION("Regulator Driver for Marvell 88PM800 PMIC");
-MODULE_ALIAS("platform:88pm800-regulator");
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 89789ac7a786..73b43dc1b3be 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -75,16 +75,6 @@ config REGULATOR_88PG86X
They provide two I2C-controlled DC/DC step-down converters with
sleep mode and separate enable pins.
-config REGULATOR_88PM800
- tristate "Marvell 88PM800 Power regulators"
- depends on MFD_88PM800
- help
- This driver supports Marvell 88PM800 voltage regulator chips.
- It delivers digitally programmable output,
- the voltage is programmed via I2C interface.
- It's suitable to support PXA988 chips to control VCC_MAIN and
- various voltages.
-
config REGULATOR_88PM8607
tristate "Marvell 88PM8607 Power regulators"
depends on MFD_88PM860X=y
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index 5a764cec8df8..972f105567b5 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -12,7 +12,6 @@ obj-$(CONFIG_REGULATOR_VIRTUAL_CONSUMER) += virtual.o
obj-$(CONFIG_REGULATOR_USERSPACE_CONSUMER) += userspace-consumer.o
obj-$(CONFIG_REGULATOR_88PG86X) += 88pg86x.o
-obj-$(CONFIG_REGULATOR_88PM800) += 88pm800-regulator.o
obj-$(CONFIG_REGULATOR_88PM8607) += 88pm8607.o
obj-$(CONFIG_REGULATOR_88PM886) += 88pm886-regulator.o
obj-$(CONFIG_REGULATOR_CROS_EC) += cros-ec-regulator.o
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index 0636b9ead2c2..5674211afe91 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -172,16 +172,6 @@ config RTC_DRV_88PM860X
This driver can also be built as a module. If so, the module
will be called rtc-88pm860x.
-config RTC_DRV_88PM80X
- tristate "Marvell 88PM80x"
- depends on MFD_88PM800
- help
- If you say yes here you get support for RTC function in Marvell
- 88PM80x chips.
-
- This driver can also be built as a module. If so, the module
- will be called rtc-88pm80x.
-
config RTC_DRV_88PM886
tristate "Marvell 88PM886 RTC driver"
depends on MFD_88PM886_PMIC
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
index 0347645b021f..84bb2af5849e 100644
--- a/drivers/rtc/Makefile
+++ b/drivers/rtc/Makefile
@@ -19,7 +19,6 @@ obj-$(CONFIG_RTC_LIB_KUNIT_TEST) += test_rtc_lib.o
# Keep the list ordered.
-obj-$(CONFIG_RTC_DRV_88PM80X) += rtc-88pm80x.o
obj-$(CONFIG_RTC_DRV_88PM860X) += rtc-88pm860x.o
obj-$(CONFIG_RTC_DRV_88PM886) += rtc-88pm886.o
obj-$(CONFIG_RTC_DRV_AB8500) += rtc-ab8500.o
diff --git a/drivers/rtc/rtc-88pm80x.c b/drivers/rtc/rtc-88pm80x.c
deleted file mode 100644
index a3e52a5a708f..000000000000
--- a/drivers/rtc/rtc-88pm80x.c
+++ /dev/null
@@ -1,340 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Real Time Clock driver for Marvell 88PM80x PMIC
- *
- * Copyright (c) 2012 Marvell International Ltd.
- * Wenzeng Chen<wzch@marvell.com>
- * Qiao Zhou <zhouqiao@marvell.com>
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/regmap.h>
-#include <linux/mfd/core.h>
-#include <linux/mfd/88pm80x.h>
-#include <linux/rtc.h>
-
-#define PM800_RTC_COUNTER1 (0xD1)
-#define PM800_RTC_COUNTER2 (0xD2)
-#define PM800_RTC_COUNTER3 (0xD3)
-#define PM800_RTC_COUNTER4 (0xD4)
-#define PM800_RTC_EXPIRE1_1 (0xD5)
-#define PM800_RTC_EXPIRE1_2 (0xD6)
-#define PM800_RTC_EXPIRE1_3 (0xD7)
-#define PM800_RTC_EXPIRE1_4 (0xD8)
-#define PM800_RTC_TRIM1 (0xD9)
-#define PM800_RTC_TRIM2 (0xDA)
-#define PM800_RTC_TRIM3 (0xDB)
-#define PM800_RTC_TRIM4 (0xDC)
-#define PM800_RTC_EXPIRE2_1 (0xDD)
-#define PM800_RTC_EXPIRE2_2 (0xDE)
-#define PM800_RTC_EXPIRE2_3 (0xDF)
-#define PM800_RTC_EXPIRE2_4 (0xE0)
-
-#define PM800_POWER_DOWN_LOG1 (0xE5)
-#define PM800_POWER_DOWN_LOG2 (0xE6)
-
-struct pm80x_rtc_info {
- struct pm80x_chip *chip;
- struct regmap *map;
- struct rtc_device *rtc_dev;
- struct device *dev;
-
- int irq;
-};
-
-static irqreturn_t rtc_update_handler(int irq, void *data)
-{
- struct pm80x_rtc_info *info = (struct pm80x_rtc_info *)data;
- int mask;
-
- mask = PM800_ALARM | PM800_ALARM_WAKEUP;
- regmap_update_bits(info->map, PM800_RTC_CONTROL, mask | PM800_ALARM1_EN,
- mask);
- rtc_update_irq(info->rtc_dev, 1, RTC_AF);
- return IRQ_HANDLED;
-}
-
-static int pm80x_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
-{
- struct pm80x_rtc_info *info = dev_get_drvdata(dev);
-
- if (enabled)
- regmap_update_bits(info->map, PM800_RTC_CONTROL,
- PM800_ALARM1_EN, PM800_ALARM1_EN);
- else
- regmap_update_bits(info->map, PM800_RTC_CONTROL,
- PM800_ALARM1_EN, 0);
- return 0;
-}
-
-/*
- * Calculate the next alarm time given the requested alarm time mask
- * and the current time.
- */
-static void rtc_next_alarm_time(struct rtc_time *next, struct rtc_time *now,
- struct rtc_time *alrm)
-{
- unsigned long next_time;
- unsigned long now_time;
-
- next->tm_year = now->tm_year;
- next->tm_mon = now->tm_mon;
- next->tm_mday = now->tm_mday;
- next->tm_hour = alrm->tm_hour;
- next->tm_min = alrm->tm_min;
- next->tm_sec = alrm->tm_sec;
-
- now_time = rtc_tm_to_time64(now);
- next_time = rtc_tm_to_time64(next);
-
- if (next_time < now_time) {
- /* Advance one day */
- next_time += 60 * 60 * 24;
- rtc_time64_to_tm(next_time, next);
- }
-}
-
-static int pm80x_rtc_read_time(struct device *dev, struct rtc_time *tm)
-{
- struct pm80x_rtc_info *info = dev_get_drvdata(dev);
- unsigned char buf[4];
- unsigned long ticks, base, data;
- regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4);
- base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) |
- (buf[1] << 8) | buf[0];
- dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]);
-
- /* load 32-bit read-only counter */
- regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4);
- data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) |
- (buf[1] << 8) | buf[0];
- ticks = base + data;
- dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n",
- base, data, ticks);
- rtc_time64_to_tm(ticks, tm);
- return 0;
-}
-
-static int pm80x_rtc_set_time(struct device *dev, struct rtc_time *tm)
-{
- struct pm80x_rtc_info *info = dev_get_drvdata(dev);
- unsigned char buf[4];
- unsigned long ticks, base, data;
-
- ticks = rtc_tm_to_time64(tm);
-
- /* load 32-bit read-only counter */
- regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4);
- data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) |
- (buf[1] << 8) | buf[0];
- base = ticks - data;
- dev_dbg(info->dev, "set base:0x%lx, RO count:0x%lx, ticks:0x%lx\n",
- base, data, ticks);
- buf[0] = base & 0xFF;
- buf[1] = (base >> 8) & 0xFF;
- buf[2] = (base >> 16) & 0xFF;
- buf[3] = (base >> 24) & 0xFF;
- regmap_raw_write(info->map, PM800_RTC_EXPIRE2_1, buf, 4);
-
- return 0;
-}
-
-static int pm80x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
-{
- struct pm80x_rtc_info *info = dev_get_drvdata(dev);
- unsigned char buf[4];
- unsigned long ticks, base, data;
- int ret;
-
- regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4);
- base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) |
- (buf[1] << 8) | buf[0];
- dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]);
-
- regmap_raw_read(info->map, PM800_RTC_EXPIRE1_1, buf, 4);
- data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) |
- (buf[1] << 8) | buf[0];
- ticks = base + data;
- dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n",
- base, data, ticks);
-
- rtc_time64_to_tm(ticks, &alrm->time);
- regmap_read(info->map, PM800_RTC_CONTROL, &ret);
- alrm->enabled = (ret & PM800_ALARM1_EN) ? 1 : 0;
- alrm->pending = (ret & (PM800_ALARM | PM800_ALARM_WAKEUP)) ? 1 : 0;
- return 0;
-}
-
-static int pm80x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
-{
- struct pm80x_rtc_info *info = dev_get_drvdata(dev);
- struct rtc_time now_tm, alarm_tm;
- unsigned long ticks, base, data;
- unsigned char buf[4];
- int mask;
-
- regmap_update_bits(info->map, PM800_RTC_CONTROL, PM800_ALARM1_EN, 0);
-
- regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4);
- base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) |
- (buf[1] << 8) | buf[0];
- dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]);
-
- /* load 32-bit read-only counter */
- regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4);
- data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) |
- (buf[1] << 8) | buf[0];
- ticks = base + data;
- dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n",
- base, data, ticks);
-
- rtc_time64_to_tm(ticks, &now_tm);
- dev_dbg(info->dev, "%s, now time : %lu\n", __func__, ticks);
- rtc_next_alarm_time(&alarm_tm, &now_tm, &alrm->time);
- /* get new ticks for alarm in 24 hours */
- ticks = rtc_tm_to_time64(&alarm_tm);
- dev_dbg(info->dev, "%s, alarm time: %lu\n", __func__, ticks);
- data = ticks - base;
-
- buf[0] = data & 0xff;
- buf[1] = (data >> 8) & 0xff;
- buf[2] = (data >> 16) & 0xff;
- buf[3] = (data >> 24) & 0xff;
- regmap_raw_write(info->map, PM800_RTC_EXPIRE1_1, buf, 4);
- if (alrm->enabled) {
- mask = PM800_ALARM | PM800_ALARM_WAKEUP | PM800_ALARM1_EN;
- regmap_update_bits(info->map, PM800_RTC_CONTROL, mask, mask);
- } else {
- mask = PM800_ALARM | PM800_ALARM_WAKEUP | PM800_ALARM1_EN;
- regmap_update_bits(info->map, PM800_RTC_CONTROL, mask,
- PM800_ALARM | PM800_ALARM_WAKEUP);
- }
- return 0;
-}
-
-static const struct rtc_class_ops pm80x_rtc_ops = {
- .read_time = pm80x_rtc_read_time,
- .set_time = pm80x_rtc_set_time,
- .read_alarm = pm80x_rtc_read_alarm,
- .set_alarm = pm80x_rtc_set_alarm,
- .alarm_irq_enable = pm80x_rtc_alarm_irq_enable,
-};
-
-#ifdef CONFIG_PM_SLEEP
-static int pm80x_rtc_suspend(struct device *dev)
-{
- return pm80x_dev_suspend(dev);
-}
-
-static int pm80x_rtc_resume(struct device *dev)
-{
- return pm80x_dev_resume(dev);
-}
-#endif
-
-static SIMPLE_DEV_PM_OPS(pm80x_rtc_pm_ops, pm80x_rtc_suspend, pm80x_rtc_resume);
-
-static int pm80x_rtc_probe(struct platform_device *pdev)
-{
- struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent);
- struct pm80x_rtc_pdata *pdata = dev_get_platdata(&pdev->dev);
- struct pm80x_rtc_info *info;
- struct device_node *node = pdev->dev.of_node;
- int ret;
-
- if (!pdata && !node) {
- dev_err(&pdev->dev,
- "pm80x-rtc requires platform data or of_node\n");
- return -EINVAL;
- }
-
- if (!pdata) {
- pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
- if (!pdata) {
- dev_err(&pdev->dev, "failed to allocate memory\n");
- return -ENOMEM;
- }
- }
-
- info =
- devm_kzalloc(&pdev->dev, sizeof(struct pm80x_rtc_info), GFP_KERNEL);
- if (!info)
- return -ENOMEM;
- info->irq = platform_get_irq(pdev, 0);
- if (info->irq < 0) {
- ret = -EINVAL;
- goto out;
- }
-
- info->chip = chip;
- info->map = chip->regmap;
- if (!info->map) {
- dev_err(&pdev->dev, "no regmap!\n");
- ret = -EINVAL;
- goto out;
- }
-
- info->dev = &pdev->dev;
- dev_set_drvdata(&pdev->dev, info);
-
- info->rtc_dev = devm_rtc_allocate_device(&pdev->dev);
- if (IS_ERR(info->rtc_dev))
- return PTR_ERR(info->rtc_dev);
-
- ret = pm80x_request_irq(chip, info->irq, rtc_update_handler,
- IRQF_ONESHOT, "rtc", info);
- if (ret < 0) {
- dev_err(chip->dev, "Failed to request IRQ: #%d: %d\n",
- info->irq, ret);
- goto out;
- }
-
- info->rtc_dev->ops = &pm80x_rtc_ops;
- info->rtc_dev->range_max = U32_MAX;
-
- ret = devm_rtc_register_device(info->rtc_dev);
- if (ret)
- goto out_rtc;
-
- /*
- * enable internal XO instead of internal 3.25MHz clock since it can
- * free running in PMIC power-down state.
- */
- regmap_update_bits(info->map, PM800_RTC_CONTROL, PM800_RTC1_USE_XO,
- PM800_RTC1_USE_XO);
-
- /* remember whether this power up is caused by PMIC RTC or not */
- info->rtc_dev->dev.platform_data = &pdata->rtc_wakeup;
-
- device_init_wakeup(&pdev->dev, true);
-
- return 0;
-out_rtc:
- pm80x_free_irq(chip, info->irq, info);
-out:
- return ret;
-}
-
-static void pm80x_rtc_remove(struct platform_device *pdev)
-{
- struct pm80x_rtc_info *info = platform_get_drvdata(pdev);
- pm80x_free_irq(info->chip, info->irq, info);
-}
-
-static struct platform_driver pm80x_rtc_driver = {
- .driver = {
- .name = "88pm80x-rtc",
- .pm = &pm80x_rtc_pm_ops,
- },
- .probe = pm80x_rtc_probe,
- .remove = pm80x_rtc_remove,
-};
-
-module_platform_driver(pm80x_rtc_driver);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("Marvell 88PM80x RTC driver");
-MODULE_AUTHOR("Qiao Zhou <zhouqiao@marvell.com>");
-MODULE_ALIAS("platform:88pm80x-rtc");
diff --git a/include/linux/mfd/88pm80x.h b/include/linux/mfd/88pm80x.h
deleted file mode 100644
index 551ef1c367d6..000000000000
--- a/include/linux/mfd/88pm80x.h
+++ /dev/null
@@ -1,370 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Marvell 88PM80x Interface
- *
- * Copyright (C) 2012 Marvell International Ltd.
- * Qiao Zhou <zhouqiao@marvell.com>
- */
-
-#ifndef __LINUX_MFD_88PM80X_H
-#define __LINUX_MFD_88PM80X_H
-
-#include <linux/platform_device.h>
-#include <linux/interrupt.h>
-#include <linux/regmap.h>
-#include <linux/atomic.h>
-
-enum {
- CHIP_INVALID = 0,
- CHIP_PM800,
- CHIP_PM805,
- CHIP_PM860,
- CHIP_MAX,
-};
-
-enum {
- PM800_ID_BUCK1 = 0,
- PM800_ID_BUCK2,
- PM800_ID_BUCK3,
- PM800_ID_BUCK4,
- PM800_ID_BUCK5,
-
- PM800_ID_LDO1,
- PM800_ID_LDO2,
- PM800_ID_LDO3,
- PM800_ID_LDO4,
- PM800_ID_LDO5,
- PM800_ID_LDO6,
- PM800_ID_LDO7,
- PM800_ID_LDO8,
- PM800_ID_LDO9,
- PM800_ID_LDO10,
- PM800_ID_LDO11,
- PM800_ID_LDO12,
- PM800_ID_LDO13,
- PM800_ID_LDO14,
- PM800_ID_LDO15,
- PM800_ID_LDO16,
- PM800_ID_LDO17,
- PM800_ID_LDO18,
- PM800_ID_LDO19,
-
- PM800_ID_RG_MAX,
-};
-#define PM800_MAX_REGULATOR PM800_ID_RG_MAX /* 5 Bucks, 19 LDOs */
-#define PM800_NUM_BUCK (5) /*5 Bucks */
-#define PM800_NUM_LDO (19) /*19 Bucks */
-
-/* page 0 basic: slave adder 0x60 */
-
-#define PM800_STATUS_1 (0x01)
-#define PM800_ONKEY_STS1 BIT(0)
-#define PM800_EXTON_STS1 BIT(1)
-#define PM800_CHG_STS1 BIT(2)
-#define PM800_BAT_STS1 BIT(3)
-#define PM800_VBUS_STS1 BIT(4)
-#define PM800_LDO_PGOOD_STS1 BIT(5)
-#define PM800_BUCK_PGOOD_STS1 BIT(6)
-
-#define PM800_STATUS_2 (0x02)
-#define PM800_RTC_ALARM_STS2 BIT(0)
-
-/* Wakeup Registers */
-#define PM800_WAKEUP1 (0x0D)
-
-#define PM800_WAKEUP2 (0x0E)
-#define PM800_WAKEUP2_INV_INT BIT(0)
-#define PM800_WAKEUP2_INT_CLEAR BIT(1)
-#define PM800_WAKEUP2_INT_MASK BIT(2)
-
-#define PM800_POWER_UP_LOG (0x10)
-
-/* Referance and low power registers */
-#define PM800_LOW_POWER1 (0x20)
-#define PM800_LOW_POWER2 (0x21)
-#define PM800_LOW_POWER_CONFIG3 (0x22)
-#define PM800_LOW_POWER_CONFIG4 (0x23)
-
-/* GPIO register */
-#define PM800_GPIO_0_1_CNTRL (0x30)
-#define PM800_GPIO0_VAL BIT(0)
-#define PM800_GPIO0_GPIO_MODE(x) (x << 1)
-#define PM800_GPIO1_VAL BIT(4)
-#define PM800_GPIO1_GPIO_MODE(x) (x << 5)
-
-#define PM800_GPIO_2_3_CNTRL (0x31)
-#define PM800_GPIO2_VAL BIT(0)
-#define PM800_GPIO2_GPIO_MODE(x) (x << 1)
-#define PM800_GPIO3_VAL BIT(4)
-#define PM800_GPIO3_GPIO_MODE(x) (x << 5)
-#define PM800_GPIO3_MODE_MASK 0x1F
-#define PM800_GPIO3_HEADSET_MODE PM800_GPIO3_GPIO_MODE(6)
-
-#define PM800_GPIO_4_CNTRL (0x32)
-#define PM800_GPIO4_VAL BIT(0)
-#define PM800_GPIO4_GPIO_MODE(x) (x << 1)
-
-#define PM800_HEADSET_CNTRL (0x38)
-#define PM800_HEADSET_DET_EN BIT(7)
-#define PM800_HSDET_SLP BIT(1)
-/* PWM register */
-#define PM800_PWM1 (0x40)
-#define PM800_PWM2 (0x41)
-#define PM800_PWM3 (0x42)
-#define PM800_PWM4 (0x43)
-
-/* RTC Registers */
-#define PM800_RTC_CONTROL (0xD0)
-#define PM800_RTC_MISC1 (0xE1)
-#define PM800_RTC_MISC2 (0xE2)
-#define PM800_RTC_MISC3 (0xE3)
-#define PM800_RTC_MISC4 (0xE4)
-#define PM800_RTC_MISC5 (0xE7)
-/* bit definitions of RTC Register 1 (0xD0) */
-#define PM800_ALARM1_EN BIT(0)
-#define PM800_ALARM_WAKEUP BIT(4)
-#define PM800_ALARM BIT(5)
-#define PM800_RTC1_USE_XO BIT(7)
-
-/* Regulator Control Registers: BUCK1,BUCK5,LDO1 have DVC */
-
-/* buck registers */
-#define PM800_SLEEP_BUCK1 (0x30)
-
-/* BUCK Sleep Mode Register 1: BUCK[1..4] */
-#define PM800_BUCK_SLP1 (0x5A)
-#define PM800_BUCK1_SLP1_SHIFT 0
-#define PM800_BUCK1_SLP1_MASK (0x3 << PM800_BUCK1_SLP1_SHIFT)
-
-/* page 2 GPADC: slave adder 0x02 */
-#define PM800_GPADC_MEAS_EN1 (0x01)
-#define PM800_MEAS_EN1_VBAT BIT(2)
-#define PM800_GPADC_MEAS_EN2 (0x02)
-#define PM800_MEAS_EN2_RFTMP BIT(0)
-#define PM800_MEAS_GP0_EN BIT(2)
-#define PM800_MEAS_GP1_EN BIT(3)
-#define PM800_MEAS_GP2_EN BIT(4)
-#define PM800_MEAS_GP3_EN BIT(5)
-#define PM800_MEAS_GP4_EN BIT(6)
-
-#define PM800_GPADC_MISC_CONFIG1 (0x05)
-#define PM800_GPADC_MISC_CONFIG2 (0x06)
-#define PM800_GPADC_MISC_GPFSM_EN BIT(0)
-#define PM800_GPADC_SLOW_MODE(x) (x << 3)
-
-#define PM800_GPADC_MISC_CONFIG3 (0x09)
-#define PM800_GPADC_MISC_CONFIG4 (0x0A)
-
-#define PM800_GPADC_PREBIAS1 (0x0F)
-#define PM800_GPADC0_GP_PREBIAS_TIME(x) (x << 0)
-#define PM800_GPADC_PREBIAS2 (0x10)
-
-#define PM800_GP_BIAS_ENA1 (0x14)
-#define PM800_GPADC_GP_BIAS_EN0 BIT(0)
-#define PM800_GPADC_GP_BIAS_EN1 BIT(1)
-#define PM800_GPADC_GP_BIAS_EN2 BIT(2)
-#define PM800_GPADC_GP_BIAS_EN3 BIT(3)
-
-#define PM800_GP_BIAS_OUT1 (0x15)
-#define PM800_BIAS_OUT_GP0 BIT(0)
-#define PM800_BIAS_OUT_GP1 BIT(1)
-#define PM800_BIAS_OUT_GP2 BIT(2)
-#define PM800_BIAS_OUT_GP3 BIT(3)
-
-#define PM800_GPADC0_LOW_TH 0x20
-#define PM800_GPADC1_LOW_TH 0x21
-#define PM800_GPADC2_LOW_TH 0x22
-#define PM800_GPADC3_LOW_TH 0x23
-#define PM800_GPADC4_LOW_TH 0x24
-
-#define PM800_GPADC0_UPP_TH 0x30
-#define PM800_GPADC1_UPP_TH 0x31
-#define PM800_GPADC2_UPP_TH 0x32
-#define PM800_GPADC3_UPP_TH 0x33
-#define PM800_GPADC4_UPP_TH 0x34
-
-#define PM800_VBBAT_MEAS1 0x40
-#define PM800_VBBAT_MEAS2 0x41
-#define PM800_VBAT_MEAS1 0x42
-#define PM800_VBAT_MEAS2 0x43
-#define PM800_VSYS_MEAS1 0x44
-#define PM800_VSYS_MEAS2 0x45
-#define PM800_VCHG_MEAS1 0x46
-#define PM800_VCHG_MEAS2 0x47
-#define PM800_TINT_MEAS1 0x50
-#define PM800_TINT_MEAS2 0x51
-#define PM800_PMOD_MEAS1 0x52
-#define PM800_PMOD_MEAS2 0x53
-
-#define PM800_GPADC0_MEAS1 0x54
-#define PM800_GPADC0_MEAS2 0x55
-#define PM800_GPADC1_MEAS1 0x56
-#define PM800_GPADC1_MEAS2 0x57
-#define PM800_GPADC2_MEAS1 0x58
-#define PM800_GPADC2_MEAS2 0x59
-#define PM800_GPADC3_MEAS1 0x5A
-#define PM800_GPADC3_MEAS2 0x5B
-#define PM800_GPADC4_MEAS1 0x5C
-#define PM800_GPADC4_MEAS2 0x5D
-
-#define PM800_GPADC4_AVG1 0xA8
-#define PM800_GPADC4_AVG2 0xA9
-
-/* 88PM805 Registers */
-#define PM805_MAIN_POWERUP (0x01)
-#define PM805_INT_STATUS0 (0x02) /* for ena/dis all interrupts */
-
-#define PM805_STATUS0_INT_CLEAR (1 << 0)
-#define PM805_STATUS0_INV_INT (1 << 1)
-#define PM800_STATUS0_INT_MASK (1 << 2)
-
-#define PM805_INT_STATUS1 (0x03)
-
-#define PM805_INT1_HP1_SHRT BIT(0)
-#define PM805_INT1_HP2_SHRT BIT(1)
-#define PM805_INT1_MIC_CONFLICT BIT(2)
-#define PM805_INT1_CLIP_FAULT BIT(3)
-#define PM805_INT1_LDO_OFF BIT(4)
-#define PM805_INT1_SRC_DPLL_LOCK BIT(5)
-
-#define PM805_INT_STATUS2 (0x04)
-
-#define PM805_INT2_MIC_DET BIT(0)
-#define PM805_INT2_SHRT_BTN_DET BIT(1)
-#define PM805_INT2_VOLM_BTN_DET BIT(2)
-#define PM805_INT2_VOLP_BTN_DET BIT(3)
-#define PM805_INT2_RAW_PLL_FAULT BIT(4)
-#define PM805_INT2_FINE_PLL_FAULT BIT(5)
-
-#define PM805_INT_MASK1 (0x05)
-#define PM805_INT_MASK2 (0x06)
-#define PM805_SHRT_BTN_DET BIT(1)
-
-/* number of status and int reg in a row */
-#define PM805_INT_REG_NUM (2)
-
-#define PM805_MIC_DET1 (0x07)
-#define PM805_MIC_DET_EN_MIC_DET BIT(0)
-#define PM805_MIC_DET2 (0x08)
-#define PM805_MIC_DET_STATUS1 (0x09)
-
-#define PM805_MIC_DET_STATUS3 (0x0A)
-#define PM805_AUTO_SEQ_STATUS1 (0x0B)
-#define PM805_AUTO_SEQ_STATUS2 (0x0C)
-
-#define PM805_ADC_SETTING1 (0x10)
-#define PM805_ADC_SETTING2 (0x11)
-#define PM805_ADC_SETTING3 (0x11)
-#define PM805_ADC_GAIN1 (0x12)
-#define PM805_ADC_GAIN2 (0x13)
-#define PM805_DMIC_SETTING (0x15)
-#define PM805_DWS_SETTING (0x16)
-#define PM805_MIC_CONFLICT_STS (0x17)
-
-#define PM805_PDM_SETTING1 (0x20)
-#define PM805_PDM_SETTING2 (0x21)
-#define PM805_PDM_SETTING3 (0x22)
-#define PM805_PDM_CONTROL1 (0x23)
-#define PM805_PDM_CONTROL2 (0x24)
-#define PM805_PDM_CONTROL3 (0x25)
-
-#define PM805_HEADPHONE_SETTING (0x26)
-#define PM805_HEADPHONE_GAIN_A2A (0x27)
-#define PM805_HEADPHONE_SHORT_STATE (0x28)
-#define PM805_EARPHONE_SETTING (0x29)
-#define PM805_AUTO_SEQ_SETTING (0x2A)
-
-struct pm80x_rtc_pdata {
- int vrtc;
- int rtc_wakeup;
-};
-
-struct pm80x_subchip {
- struct i2c_client *power_page; /* chip client for power page */
- struct i2c_client *gpadc_page; /* chip client for gpadc page */
- struct regmap *regmap_power;
- struct regmap *regmap_gpadc;
- unsigned short power_page_addr; /* power page I2C address */
- unsigned short gpadc_page_addr; /* gpadc page I2C address */
-};
-
-struct pm80x_chip {
- struct pm80x_subchip *subchip;
- struct device *dev;
- struct i2c_client *client;
- struct i2c_client *companion;
- struct regmap *regmap;
- const struct regmap_irq_chip *regmap_irq_chip;
- struct regmap_irq_chip_data *irq_data;
- int type;
- int irq;
- int irq_mode;
- unsigned long wu_flag;
- spinlock_t lock;
-};
-
-struct pm80x_platform_data {
- struct pm80x_rtc_pdata *rtc;
- /*
- * For the regulator not defined, set regulators[not_defined] to be
- * NULL. num_regulators are the number of regulators supposed to be
- * initialized. If all regulators are not defined, set num_regulators
- * to be 0.
- */
- struct regulator_init_data *regulators[PM800_ID_RG_MAX];
- unsigned int num_regulators;
- int irq_mode; /* Clear interrupt by read/write(0/1) */
- int batt_det; /* enable/disable */
- int (*plat_config)(struct pm80x_chip *chip,
- struct pm80x_platform_data *pdata);
-};
-
-extern const struct dev_pm_ops pm80x_pm_ops;
-extern const struct regmap_config pm80x_regmap_config;
-
-static inline int pm80x_request_irq(struct pm80x_chip *pm80x, int irq,
- irq_handler_t handler, unsigned long flags,
- const char *name, void *data)
-{
- if (!pm80x->irq_data)
- return -EINVAL;
- return request_threaded_irq(regmap_irq_get_virq(pm80x->irq_data, irq),
- NULL, handler, flags, name, data);
-}
-
-static inline void pm80x_free_irq(struct pm80x_chip *pm80x, int irq, void *data)
-{
- if (!pm80x->irq_data)
- return;
- free_irq(regmap_irq_get_virq(pm80x->irq_data, irq), data);
-}
-
-#ifdef CONFIG_PM
-static inline int pm80x_dev_suspend(struct device *dev)
-{
- struct platform_device *pdev = to_platform_device(dev);
- struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent);
- int irq = platform_get_irq(pdev, 0);
-
- if (device_may_wakeup(dev))
- set_bit(irq, &chip->wu_flag);
-
- return 0;
-}
-
-static inline int pm80x_dev_resume(struct device *dev)
-{
- struct platform_device *pdev = to_platform_device(dev);
- struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent);
- int irq = platform_get_irq(pdev, 0);
-
- if (device_may_wakeup(dev))
- clear_bit(irq, &chip->wu_flag);
-
- return 0;
-}
-#endif
-
-extern int pm80x_init(struct i2c_client *client);
-extern int pm80x_deinit(void);
-#endif /* __LINUX_MFD_88PM80X_H */
--
2.53.0
next prev parent reply other threads:[~2026-09-09 13:22 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-09 13:21 [PATCH 00/14] mfd: unused driver purge Arnd Bergmann
2026-09-09 13:21 ` Arnd Bergmann [this message]
2026-09-09 13:37 ` [PATCH 01/14] mfd: remove unused 88pm80x driver sashiko-bot
2026-09-09 13:44 ` Alexandre Belloni
2026-09-11 7:24 ` Krzysztof Kozlowski
2026-09-09 13:21 ` [PATCH 02/14] mfd: remove unused rdc321x southbridge support Arnd Bergmann
2026-09-09 13:39 ` sashiko-bot
2026-09-09 20:28 ` Arnd Bergmann
2026-09-09 14:09 ` Guenter Roeck
2026-09-09 13:21 ` [PATCH 03/14] mfd: remove unused si476x driver Arnd Bergmann
2026-09-09 13:38 ` sashiko-bot
2026-09-09 13:21 ` [PATCH 04/14] mfd: remove unused wm8400 driver Arnd Bergmann
2026-09-09 13:27 ` Mark Brown
2026-09-09 13:33 ` sashiko-bot
2026-09-09 14:38 ` Charles Keepax
2026-09-09 13:21 ` [PATCH 05/14] mfd: remove unused adp5520 driver Arnd Bergmann
2026-09-09 13:37 ` sashiko-bot
2026-09-09 20:21 ` Arnd Bergmann
2026-09-09 13:21 ` [PATCH 06/14] mfd: remove unused da903x driver Arnd Bergmann
2026-09-09 13:39 ` sashiko-bot
2026-09-09 20:17 ` Arnd Bergmann
2026-09-09 15:46 ` Sebastian Reichel
2026-09-09 13:21 ` [PATCH 07/14] mfd: remove unused lp8788 driver Arnd Bergmann
2026-09-09 13:39 ` sashiko-bot
2026-09-09 20:14 ` Arnd Bergmann
2026-09-09 13:47 ` Alexandre Belloni
2026-09-09 15:46 ` Sebastian Reichel
2026-09-09 13:21 ` [PATCH 08/14] mfd: remove unused aat2870 driver Arnd Bergmann
2026-09-09 13:30 ` sashiko-bot
2026-09-09 13:21 ` [PATCH 09/14] mfd: remove unused lm3533 driver Arnd Bergmann
2026-09-09 13:35 ` sashiko-bot
2026-09-09 13:44 ` Johan Hovold
2026-09-09 14:47 ` Arnd Bergmann
2026-09-09 13:21 ` [PATCH 10/14] mfd: remove unused rc5t583 driver Arnd Bergmann
2026-09-09 13:39 ` sashiko-bot
2026-09-09 20:49 ` Arnd Bergmann
2026-09-09 13:48 ` Alexandre Belloni
2026-09-09 13:21 ` [PATCH 11/14] mfd: remove unused wm8350 driver Arnd Bergmann
2026-09-09 13:26 ` Mark Brown
2026-09-09 13:41 ` sashiko-bot
2026-09-09 14:12 ` Guenter Roeck
2026-09-09 14:39 ` Charles Keepax
2026-09-09 15:47 ` Sebastian Reichel
2026-09-09 13:21 ` [PATCH 12/14] mfd: remove unused mcp-sa11x0/ucb1x00 driver Arnd Bergmann
2026-09-09 13:48 ` sashiko-bot
2026-09-09 20:53 ` Arnd Bergmann
2026-09-09 13:21 ` [PATCH 13/14] mfd: remove unused menelaus driver Arnd Bergmann
2026-09-09 13:49 ` sashiko-bot
2026-09-09 20:46 ` Arnd Bergmann
2026-09-09 13:51 ` Alexandre Belloni
2026-09-09 13:21 ` [PATCH 14/14] mfd: remove unused iPaq micro driver Arnd Bergmann
2026-09-09 13:43 ` sashiko-bot
2026-09-09 20:58 ` Arnd Bergmann
2026-09-09 14:03 ` [PATCH 00/14] mfd: unused driver purge Bartosz Golaszewski
2026-09-09 17:26 ` Dmitry Torokhov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260909132153.1596191-2-arnd@kernel.org \
--to=arnd@kernel.org \
--cc=alexandre.belloni@bootlin.com \
--cc=arnd@arndb.de \
--cc=brgl@kernel.org \
--cc=broonie@kernel.org \
--cc=conor+dt@kernel.org \
--cc=danielt@kernel.org \
--cc=deller@gmx.de \
--cc=devicetree@vger.kernel.org \
--cc=dmitry.torokhov@gmail.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=jic23@kernel.org \
--cc=jingoohan1@gmail.com \
--cc=krzk+dt@kernel.org \
--cc=lee@kernel.org \
--cc=lgirdwood@gmail.com \
--cc=linusw@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-fbdev@vger.kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-hwmon@vger.kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-leds@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-rtc@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=linux-watchdog@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=llvm@lists.linux.dev \
--cc=mchehab@kernel.org \
--cc=mfd@lists.linux.dev \
--cc=michael.hennerich@analog.com \
--cc=patches@opensource.cirrus.com \
--cc=pavel@kernel.org \
--cc=robh@kernel.org \
--cc=sre@kernel.org \
--cc=support.opensource@diasemi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.