[PATCH 07/14] mfd: remove unused lp8788 driver
From: Arnd Bergmann
Date: Wed Sep 09 2026 - 10:07:53 EST
From: Arnd Bergmann <arnd@xxxxxxxx>
This driver was apparently never used upstream, and without devicetree
support cannot be used by external board support.
The MAINTAINER entry was already removed in 2021 as the email address
bounced.
Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>
---
drivers/iio/adc/Kconfig | 9 -
drivers/iio/adc/Makefile | 1 -
drivers/iio/adc/lp8788_adc.c | 219 --------
drivers/leds/Kconfig | 7 -
drivers/leds/Makefile | 1 -
drivers/leds/leds-lp8788.c | 171 ------
drivers/mfd/Kconfig | 10 -
drivers/mfd/Makefile | 1 -
drivers/mfd/lp8788-irq.c | 194 -------
drivers/mfd/lp8788.c | 246 ---------
drivers/power/supply/Kconfig | 8 -
drivers/power/supply/Makefile | 1 -
drivers/power/supply/lp8788-charger.c | 730 --------------------------
drivers/regulator/Kconfig | 6 -
drivers/regulator/Makefile | 2 -
drivers/regulator/lp8788-buck.c | 541 -------------------
drivers/regulator/lp8788-ldo.c | 640 ----------------------
drivers/rtc/Kconfig | 6 -
drivers/rtc/rtc-lp8788.c | 322 ------------
drivers/video/backlight/Kconfig | 6 -
drivers/video/backlight/Makefile | 1 -
drivers/video/backlight/lp8788_bl.c | 190 -------
include/linux/mfd/lp8788-isink.h | 48 --
include/linux/mfd/lp8788.h | 289 ----------
24 files changed, 3649 deletions(-)
delete mode 100644 drivers/iio/adc/lp8788_adc.c
delete mode 100644 drivers/leds/leds-lp8788.c
delete mode 100644 drivers/mfd/lp8788-irq.c
delete mode 100644 drivers/mfd/lp8788.c
delete mode 100644 drivers/power/supply/lp8788-charger.c
delete mode 100644 drivers/regulator/lp8788-buck.c
delete mode 100644 drivers/regulator/lp8788-ldo.c
delete mode 100644 drivers/rtc/rtc-lp8788.c
delete mode 100644 drivers/video/backlight/lp8788_bl.c
delete mode 100644 include/linux/mfd/lp8788-isink.h
delete mode 100644 include/linux/mfd/lp8788.h
diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
index 415e519ad4eb..af9651003449 100644
--- a/drivers/iio/adc/Kconfig
+++ b/drivers/iio/adc/Kconfig
@@ -905,15 +905,6 @@ config IMX93_ADC
This driver can also be built as a module. If so, the module will be
called imx93_adc.
-config LP8788_ADC
- tristate "LP8788 ADC driver"
- depends on MFD_LP8788
- help
- Say yes here to build support for TI LP8788 ADC.
-
- To compile this driver as a module, choose M here: the module will be
- called lp8788_adc.
-
config LPC18XX_ADC
tristate "NXP LPC18xx ADC driver"
depends on ARCH_LPC18XX || COMPILE_TEST
diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
index dcec0abb03b7..845ddf628f22 100644
--- a/drivers/iio/adc/Makefile
+++ b/drivers/iio/adc/Makefile
@@ -77,7 +77,6 @@ obj-$(CONFIG_INA2XX_ADC) += ina2xx-adc.o
obj-$(CONFIG_INGENIC_ADC) += ingenic-adc.o
obj-$(CONFIG_INTEL_DC_TI_ADC) += intel_dc_ti_adc.o
obj-$(CONFIG_INTEL_MRFLD_ADC) += intel_mrfld_adc.o
-obj-$(CONFIG_LP8788_ADC) += lp8788_adc.o
obj-$(CONFIG_LPC18XX_ADC) += lpc18xx_adc.o
obj-$(CONFIG_LPC32XX_ADC) += lpc32xx_adc.o
obj-$(CONFIG_LTC2309) += ltc2309.o
diff --git a/drivers/iio/adc/lp8788_adc.c b/drivers/iio/adc/lp8788_adc.c
deleted file mode 100644
index 33bf8aef79e3..000000000000
--- a/drivers/iio/adc/lp8788_adc.c
+++ /dev/null
@@ -1,219 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * TI LP8788 MFD - ADC driver
- *
- * Copyright 2012 Texas Instruments
- *
- * Author: Milo(Woogyom) Kim <milo.kim@xxxxxx>
- */
-
-#include <linux/delay.h>
-#include <linux/iio/iio.h>
-#include <linux/iio/driver.h>
-#include <linux/iio/machine.h>
-#include <linux/mfd/lp8788.h>
-#include <linux/module.h>
-#include <linux/mutex.h>
-#include <linux/platform_device.h>
-#include <linux/slab.h>
-
-/* register address */
-#define LP8788_ADC_CONF 0x60
-#define LP8788_ADC_RAW 0x61
-#define LP8788_ADC_DONE 0x63
-
-#define ADC_CONV_START 1
-
-struct lp8788_adc {
- struct lp8788 *lp;
- const struct iio_map *map;
- struct mutex lock;
-};
-
-static const int lp8788_scale[LPADC_MAX] = {
- [LPADC_VBATT_5P5] = 1343101,
- [LPADC_VIN_CHG] = 3052503,
- [LPADC_IBATT] = 610500,
- [LPADC_IC_TEMP] = 61050,
- [LPADC_VBATT_6P0] = 1465201,
- [LPADC_VBATT_5P0] = 1221001,
- [LPADC_ADC1] = 610500,
- [LPADC_ADC2] = 610500,
- [LPADC_VDD] = 1025641,
- [LPADC_VCOIN] = 757020,
- [LPADC_ADC3] = 610500,
- [LPADC_ADC4] = 610500,
-};
-
-static int lp8788_get_adc_result(struct lp8788_adc *adc, enum lp8788_adc_id id,
- int *val)
-{
- unsigned int msb;
- unsigned int lsb;
- unsigned int result;
- u8 data;
- u8 rawdata[2];
- int size = ARRAY_SIZE(rawdata);
- int retry = 5;
- int ret;
-
- data = (id << 1) | ADC_CONV_START;
- ret = lp8788_write_byte(adc->lp, LP8788_ADC_CONF, data);
- if (ret)
- goto err_io;
-
- /* retry until adc conversion is done */
- data = 0;
- while (retry--) {
- usleep_range(100, 200);
-
- ret = lp8788_read_byte(adc->lp, LP8788_ADC_DONE, &data);
- if (ret)
- goto err_io;
-
- /* conversion done */
- if (data)
- break;
- }
-
- ret = lp8788_read_multi_bytes(adc->lp, LP8788_ADC_RAW, rawdata, size);
- if (ret)
- goto err_io;
-
- msb = (rawdata[0] << 4) & 0x00000ff0;
- lsb = (rawdata[1] >> 4) & 0x0000000f;
- result = msb | lsb;
- *val = result;
-
- return 0;
-
-err_io:
- return ret;
-}
-
-static int lp8788_adc_read_raw(struct iio_dev *indio_dev,
- struct iio_chan_spec const *chan,
- int *val, int *val2, long mask)
-{
- struct lp8788_adc *adc = iio_priv(indio_dev);
- enum lp8788_adc_id id = chan->channel;
- int ret;
-
- mutex_lock(&adc->lock);
-
- switch (mask) {
- case IIO_CHAN_INFO_RAW:
- ret = lp8788_get_adc_result(adc, id, val) ? -EIO : IIO_VAL_INT;
- break;
- case IIO_CHAN_INFO_SCALE:
- *val = lp8788_scale[id] / 1000000;
- *val2 = lp8788_scale[id] % 1000000;
- ret = IIO_VAL_INT_PLUS_MICRO;
- break;
- default:
- ret = -EINVAL;
- break;
- }
-
- mutex_unlock(&adc->lock);
-
- return ret;
-}
-
-static const struct iio_info lp8788_adc_info = {
- .read_raw = &lp8788_adc_read_raw,
-};
-
-#define LP8788_CHAN(_id, _type) { \
- .type = _type, \
- .indexed = 1, \
- .channel = LPADC_##_id, \
- .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
- BIT(IIO_CHAN_INFO_SCALE), \
- .datasheet_name = #_id, \
-}
-
-static const struct iio_chan_spec lp8788_adc_channels[] = {
- [LPADC_VBATT_5P5] = LP8788_CHAN(VBATT_5P5, IIO_VOLTAGE),
- [LPADC_VIN_CHG] = LP8788_CHAN(VIN_CHG, IIO_VOLTAGE),
- [LPADC_IBATT] = LP8788_CHAN(IBATT, IIO_CURRENT),
- [LPADC_IC_TEMP] = LP8788_CHAN(IC_TEMP, IIO_TEMP),
- [LPADC_VBATT_6P0] = LP8788_CHAN(VBATT_6P0, IIO_VOLTAGE),
- [LPADC_VBATT_5P0] = LP8788_CHAN(VBATT_5P0, IIO_VOLTAGE),
- [LPADC_ADC1] = LP8788_CHAN(ADC1, IIO_VOLTAGE),
- [LPADC_ADC2] = LP8788_CHAN(ADC2, IIO_VOLTAGE),
- [LPADC_VDD] = LP8788_CHAN(VDD, IIO_VOLTAGE),
- [LPADC_VCOIN] = LP8788_CHAN(VCOIN, IIO_VOLTAGE),
- [LPADC_ADC3] = LP8788_CHAN(ADC3, IIO_VOLTAGE),
- [LPADC_ADC4] = LP8788_CHAN(ADC4, IIO_VOLTAGE),
-};
-
-/* default maps used by iio consumer (lp8788-charger driver) */
-static const struct iio_map lp8788_default_iio_maps[] = {
- IIO_MAP("VBATT_5P0", "lp8788-charger", "lp8788_vbatt_5p0"),
- IIO_MAP("ADC1", "lp8788-charger", "lp8788_adc1"),
- { }
-};
-
-static int lp8788_iio_map_register(struct device *dev,
- struct iio_dev *indio_dev,
- struct lp8788_platform_data *pdata,
- struct lp8788_adc *adc)
-{
- const struct iio_map *map;
- int ret;
-
- map = (!pdata || !pdata->adc_pdata) ?
- lp8788_default_iio_maps : pdata->adc_pdata;
-
- ret = devm_iio_map_array_register(dev, indio_dev, map);
- if (ret) {
- dev_err(&indio_dev->dev, "iio map err: %d\n", ret);
- return ret;
- }
-
- adc->map = map;
- return 0;
-}
-
-static int lp8788_adc_probe(struct platform_device *pdev)
-{
- struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
- struct iio_dev *indio_dev;
- struct lp8788_adc *adc;
- int ret;
-
- indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*adc));
- if (!indio_dev)
- return -ENOMEM;
-
- adc = iio_priv(indio_dev);
- adc->lp = lp;
-
- ret = lp8788_iio_map_register(&pdev->dev, indio_dev, lp->pdata, adc);
- if (ret)
- return ret;
-
- mutex_init(&adc->lock);
-
- indio_dev->name = pdev->name;
- indio_dev->modes = INDIO_DIRECT_MODE;
- indio_dev->info = &lp8788_adc_info;
- indio_dev->channels = lp8788_adc_channels;
- indio_dev->num_channels = ARRAY_SIZE(lp8788_adc_channels);
-
- return devm_iio_device_register(&pdev->dev, indio_dev);
-}
-
-static struct platform_driver lp8788_adc_driver = {
- .probe = lp8788_adc_probe,
- .driver = {
- .name = LP8788_DEV_ADC,
- },
-};
-module_platform_driver(lp8788_adc_driver);
-
-MODULE_DESCRIPTION("Texas Instruments LP8788 ADC Driver");
-MODULE_AUTHOR("Milo Kim");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:lp8788-adc");
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index 5aab4765d6d7..f0cd10ad6279 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -511,13 +511,6 @@ config LEDS_LP8501
It is similar as LP5523, but output power selection is available.
And register layout and engine program schemes are different.
-config LEDS_LP8788
- tristate "LED support for the TI LP8788 PMIC"
- depends on LEDS_CLASS
- depends on MFD_LP8788
- help
- This option enables support for the Keyboard LEDs on the LP8788 PMIC.
-
config LEDS_LP8860
tristate "LED support for the TI LP8860 4 channel LED driver"
depends on LEDS_CLASS && I2C && OF
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
index 148301cf4865..63dc0b0c5a51 100644
--- a/drivers/leds/Makefile
+++ b/drivers/leds/Makefile
@@ -55,7 +55,6 @@ obj-$(CONFIG_LEDS_LP5562) += leds-lp5562.o
obj-$(CONFIG_LEDS_LP5569) += leds-lp5569.o
obj-$(CONFIG_LEDS_LP55XX_COMMON) += leds-lp55xx-common.o
obj-$(CONFIG_LEDS_LP8501) += leds-lp8501.o
-obj-$(CONFIG_LEDS_LP8788) += leds-lp8788.o
obj-$(CONFIG_LEDS_LP8860) += leds-lp8860.o
obj-$(CONFIG_LEDS_LP8864) += leds-lp8864.o
obj-$(CONFIG_LEDS_LT3593) += leds-lt3593.o
diff --git a/drivers/leds/leds-lp8788.c b/drivers/leds/leds-lp8788.c
deleted file mode 100644
index 9b9525ccca15..000000000000
--- a/drivers/leds/leds-lp8788.c
+++ /dev/null
@@ -1,171 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * TI LP8788 MFD - keyled driver
- *
- * Copyright 2012 Texas Instruments
- *
- * Author: Milo(Woogyom) Kim <milo.kim@xxxxxx>
- */
-
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/err.h>
-#include <linux/platform_device.h>
-#include <linux/leds.h>
-#include <linux/mutex.h>
-#include <linux/mfd/lp8788.h>
-#include <linux/mfd/lp8788-isink.h>
-
-#define MAX_BRIGHTNESS LP8788_ISINK_MAX_PWM
-#define DEFAULT_LED_NAME "keyboard-backlight"
-
-struct lp8788_led {
- struct lp8788 *lp;
- struct mutex lock;
- struct led_classdev led_dev;
- enum lp8788_isink_number isink_num;
- int on;
-};
-
-struct lp8788_led_config {
- enum lp8788_isink_scale scale;
- enum lp8788_isink_number num;
- int iout;
-};
-
-static struct lp8788_led_config default_led_config = {
- .scale = LP8788_ISINK_SCALE_100mA,
- .num = LP8788_ISINK_3,
- .iout = 0,
-};
-
-static int lp8788_led_init_device(struct lp8788_led *led,
- struct lp8788_led_platform_data *pdata)
-{
- struct lp8788_led_config *cfg = &default_led_config;
- u8 addr, mask, val;
- int ret;
-
- if (pdata) {
- cfg->scale = pdata->scale;
- cfg->num = pdata->num;
- cfg->iout = pdata->iout_code;
- }
-
- led->isink_num = cfg->num;
-
- /* scale configuration */
- addr = LP8788_ISINK_CTRL;
- mask = 1 << (cfg->num + LP8788_ISINK_SCALE_OFFSET);
- val = cfg->scale << (cfg->num + LP8788_ISINK_SCALE_OFFSET);
- ret = lp8788_update_bits(led->lp, addr, mask, val);
- if (ret)
- return ret;
-
- /* current configuration */
- addr = lp8788_iout_addr[cfg->num];
- mask = lp8788_iout_mask[cfg->num];
- val = cfg->iout;
-
- return lp8788_update_bits(led->lp, addr, mask, val);
-}
-
-static int lp8788_led_enable(struct lp8788_led *led,
- enum lp8788_isink_number num, int on)
-{
- int ret;
-
- u8 mask = 1 << num;
- u8 val = on << num;
-
- ret = lp8788_update_bits(led->lp, LP8788_ISINK_CTRL, mask, val);
- if (ret == 0)
- led->on = on;
-
- return ret;
-}
-
-static int lp8788_brightness_set(struct led_classdev *led_cdev,
- enum led_brightness val)
-{
- struct lp8788_led *led =
- container_of(led_cdev, struct lp8788_led, led_dev);
-
- enum lp8788_isink_number num = led->isink_num;
- int enable, ret;
-
- mutex_lock(&led->lock);
-
- switch (num) {
- case LP8788_ISINK_1:
- case LP8788_ISINK_2:
- case LP8788_ISINK_3:
- ret = lp8788_write_byte(led->lp, lp8788_pwm_addr[num], val);
- if (ret < 0)
- goto unlock;
- break;
- default:
- mutex_unlock(&led->lock);
- return -EINVAL;
- }
-
- enable = (val > 0) ? 1 : 0;
- if (enable != led->on)
- ret = lp8788_led_enable(led, num, enable);
-unlock:
- mutex_unlock(&led->lock);
- return ret;
-}
-
-static int lp8788_led_probe(struct platform_device *pdev)
-{
- struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
- struct lp8788_led_platform_data *led_pdata;
- struct lp8788_led *led;
- struct device *dev = &pdev->dev;
- int ret;
-
- led = devm_kzalloc(dev, sizeof(struct lp8788_led), GFP_KERNEL);
- if (!led)
- return -ENOMEM;
-
- led->lp = lp;
- led->led_dev.max_brightness = MAX_BRIGHTNESS;
- led->led_dev.brightness_set_blocking = lp8788_brightness_set;
-
- led_pdata = lp->pdata ? lp->pdata->led_pdata : NULL;
-
- if (!led_pdata || !led_pdata->name)
- led->led_dev.name = DEFAULT_LED_NAME;
- else
- led->led_dev.name = led_pdata->name;
-
- mutex_init(&led->lock);
-
- ret = lp8788_led_init_device(led, led_pdata);
- if (ret) {
- dev_err(dev, "led init device err: %d\n", ret);
- return ret;
- }
-
- ret = devm_led_classdev_register(dev, &led->led_dev);
- if (ret) {
- dev_err(dev, "led register err: %d\n", ret);
- return ret;
- }
-
- return 0;
-}
-
-static struct platform_driver lp8788_led_driver = {
- .probe = lp8788_led_probe,
- .driver = {
- .name = LP8788_DEV_KEYLED,
- },
-};
-module_platform_driver(lp8788_led_driver);
-
-MODULE_DESCRIPTION("Texas Instruments LP8788 Keyboard LED Driver");
-MODULE_AUTHOR("Milo Kim");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:lp8788-keyled");
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index fda9d7ad5743..09e400e1f4b0 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1603,16 +1603,6 @@ config MFD_LP3943
With these functionalities, it can be used for LED string control or
general usage such like a GPIO controller and a PWM controller.
-config MFD_LP8788
- bool "TI LP8788 Power Management Unit Driver"
- depends on I2C=y
- select MFD_CORE
- select REGMAP_I2C
- select IRQ_DOMAIN
- help
- TI LP8788 PMU supports regulators, battery charger, RTC,
- ADC, backlight driver and current sinks.
-
config MFD_TI_LMU
tristate "TI Lighting Management Unit driver"
depends on I2C
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 82795e65cbe7..e3fe998c3513 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -150,7 +150,6 @@ obj-$(CONFIG_MFD_AXP20X_I2C) += axp20x-i2c.o
obj-$(CONFIG_MFD_AXP20X_RSB) += axp20x-rsb.o
obj-$(CONFIG_MFD_LP3943) += lp3943.o
-obj-$(CONFIG_MFD_LP8788) += lp8788.o lp8788-irq.o
obj-$(CONFIG_MFD_TI_LMU) += ti-lmu.o
diff --git a/drivers/mfd/lp8788-irq.c b/drivers/mfd/lp8788-irq.c
deleted file mode 100644
index f62fa2d7f010..000000000000
--- a/drivers/mfd/lp8788-irq.c
+++ /dev/null
@@ -1,194 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * TI LP8788 MFD - interrupt handler
- *
- * Copyright 2012 Texas Instruments
- *
- * Author: Milo(Woogyom) Kim <milo.kim@xxxxxx>
- */
-
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/irqdomain.h>
-#include <linux/device.h>
-#include <linux/mfd/lp8788.h>
-#include <linux/module.h>
-#include <linux/slab.h>
-
-/* register address */
-#define LP8788_INT_1 0x00
-#define LP8788_INTEN_1 0x03
-
-#define BASE_INTEN_ADDR LP8788_INTEN_1
-#define SIZE_REG 8
-#define NUM_REGS 3
-
-/*
- * struct lp8788_irq_data
- * @lp : used for accessing to lp8788 registers
- * @irq_lock : mutex for enabling/disabling the interrupt
- * @domain : IRQ domain for handling nested interrupt
- * @enabled : status of enabled interrupt
- */
-struct lp8788_irq_data {
- struct lp8788 *lp;
- struct mutex irq_lock;
- struct irq_domain *domain;
- int enabled[LP8788_INT_MAX];
-};
-
-static inline u8 _irq_to_addr(enum lp8788_int_id id)
-{
- return id / SIZE_REG;
-}
-
-static inline u8 _irq_to_enable_addr(enum lp8788_int_id id)
-{
- return _irq_to_addr(id) + BASE_INTEN_ADDR;
-}
-
-static inline u8 _irq_to_mask(enum lp8788_int_id id)
-{
- return 1 << (id % SIZE_REG);
-}
-
-static inline u8 _irq_to_val(enum lp8788_int_id id, int enable)
-{
- return enable << (id % SIZE_REG);
-}
-
-static void lp8788_irq_enable(struct irq_data *data)
-{
- struct lp8788_irq_data *irqd = irq_data_get_irq_chip_data(data);
-
- irqd->enabled[data->hwirq] = 1;
-}
-
-static void lp8788_irq_disable(struct irq_data *data)
-{
- struct lp8788_irq_data *irqd = irq_data_get_irq_chip_data(data);
-
- irqd->enabled[data->hwirq] = 0;
-}
-
-static void lp8788_irq_bus_lock(struct irq_data *data)
-{
- struct lp8788_irq_data *irqd = irq_data_get_irq_chip_data(data);
-
- mutex_lock(&irqd->irq_lock);
-}
-
-static void lp8788_irq_bus_sync_unlock(struct irq_data *data)
-{
- struct lp8788_irq_data *irqd = irq_data_get_irq_chip_data(data);
- enum lp8788_int_id irq = data->hwirq;
- u8 addr, mask, val;
-
- addr = _irq_to_enable_addr(irq);
- mask = _irq_to_mask(irq);
- val = _irq_to_val(irq, irqd->enabled[irq]);
-
- lp8788_update_bits(irqd->lp, addr, mask, val);
-
- mutex_unlock(&irqd->irq_lock);
-}
-
-static struct irq_chip lp8788_irq_chip = {
- .name = "lp8788",
- .irq_enable = lp8788_irq_enable,
- .irq_disable = lp8788_irq_disable,
- .irq_bus_lock = lp8788_irq_bus_lock,
- .irq_bus_sync_unlock = lp8788_irq_bus_sync_unlock,
-};
-
-static irqreturn_t lp8788_irq_handler(int irq, void *ptr)
-{
- struct lp8788_irq_data *irqd = ptr;
- struct lp8788 *lp = irqd->lp;
- u8 status[NUM_REGS], addr, mask;
- bool handled = false;
- int i;
-
- if (lp8788_read_multi_bytes(lp, LP8788_INT_1, status, NUM_REGS))
- return IRQ_NONE;
-
- for (i = 0 ; i < LP8788_INT_MAX ; i++) {
- addr = _irq_to_addr(i);
- mask = _irq_to_mask(i);
-
- /* reporting only if the irq is enabled */
- if (status[addr] & mask) {
- handle_nested_irq(irq_find_mapping(irqd->domain, i));
- handled = true;
- }
- }
-
- return handled ? IRQ_HANDLED : IRQ_NONE;
-}
-
-static int lp8788_irq_map(struct irq_domain *d, unsigned int virq,
- irq_hw_number_t hwirq)
-{
- struct lp8788_irq_data *irqd = d->host_data;
- struct irq_chip *chip = &lp8788_irq_chip;
-
- irq_set_chip_data(virq, irqd);
- irq_set_chip_and_handler(virq, chip, handle_edge_irq);
- irq_set_nested_thread(virq, 1);
- irq_set_noprobe(virq);
-
- return 0;
-}
-
-static const struct irq_domain_ops lp8788_domain_ops = {
- .map = lp8788_irq_map,
-};
-
-int lp8788_irq_init(struct lp8788 *lp, int irq)
-{
- struct lp8788_irq_data *irqd;
- int ret;
-
- if (irq <= 0) {
- dev_warn(lp->dev, "invalid irq number: %d\n", irq);
- return 0;
- }
-
- irqd = devm_kzalloc(lp->dev, sizeof(*irqd), GFP_KERNEL);
- if (!irqd)
- return -ENOMEM;
-
- irqd->lp = lp;
- irqd->domain = irq_domain_create_linear(dev_fwnode(lp->dev), LP8788_INT_MAX,
- &lp8788_domain_ops, irqd);
- if (!irqd->domain) {
- dev_err(lp->dev, "failed to add irq domain err\n");
- return -EINVAL;
- }
-
- lp->irqdm = irqd->domain;
- mutex_init(&irqd->irq_lock);
-
- ret = request_threaded_irq(irq, NULL, lp8788_irq_handler,
- IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
- "lp8788-irq", irqd);
- if (ret) {
- irq_domain_remove(lp->irqdm);
- dev_err(lp->dev, "failed to create a thread for IRQ_N\n");
- return ret;
- }
-
- lp->irq = irq;
-
- return 0;
-}
-
-void lp8788_irq_exit(struct lp8788 *lp)
-{
- if (lp->irq)
- free_irq(lp->irq, lp->irqdm);
- if (lp->irqdm)
- irq_domain_remove(lp->irqdm);
-}
diff --git a/drivers/mfd/lp8788.c b/drivers/mfd/lp8788.c
deleted file mode 100644
index 32f255378f5a..000000000000
--- a/drivers/mfd/lp8788.c
+++ /dev/null
@@ -1,246 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * TI LP8788 MFD - core interface
- *
- * Copyright 2012 Texas Instruments
- *
- * Author: Milo(Woogyom) Kim <milo.kim@xxxxxx>
- */
-
-#include <linux/err.h>
-#include <linux/i2c.h>
-#include <linux/mfd/core.h>
-#include <linux/mfd/lp8788.h>
-#include <linux/module.h>
-#include <linux/slab.h>
-
-#define MAX_LP8788_REGISTERS 0xA2
-
-#define MFD_DEV_SIMPLE(_name) \
-{ \
- .name = LP8788_DEV_##_name, \
-}
-
-#define MFD_DEV_WITH_ID(_name, _id) \
-{ \
- .name = LP8788_DEV_##_name, \
- .id = _id, \
-}
-
-#define MFD_DEV_WITH_RESOURCE(_name, _resource, num_resource) \
-{ \
- .name = LP8788_DEV_##_name, \
- .resources = _resource, \
- .num_resources = num_resource, \
-}
-
-static const struct resource chg_irqs[] = {
- /* Charger Interrupts */
- {
- .start = LP8788_INT_CHG_INPUT_STATE,
- .end = LP8788_INT_PRECHG_TIMEOUT,
- .name = LP8788_CHG_IRQ,
- .flags = IORESOURCE_IRQ,
- },
- /* Power Routing Switch Interrupts */
- {
- .start = LP8788_INT_ENTER_SYS_SUPPORT,
- .end = LP8788_INT_EXIT_SYS_SUPPORT,
- .name = LP8788_PRSW_IRQ,
- .flags = IORESOURCE_IRQ,
- },
- /* Battery Interrupts */
- {
- .start = LP8788_INT_BATT_LOW,
- .end = LP8788_INT_NO_BATT,
- .name = LP8788_BATT_IRQ,
- .flags = IORESOURCE_IRQ,
- },
-};
-
-static const struct resource rtc_irqs[] = {
- {
- .start = LP8788_INT_RTC_ALARM1,
- .end = LP8788_INT_RTC_ALARM2,
- .name = LP8788_ALM_IRQ,
- .flags = IORESOURCE_IRQ,
- },
-};
-
-static const struct mfd_cell lp8788_devs[] = {
- /* 4 bucks */
- MFD_DEV_WITH_ID(BUCK, 1),
- MFD_DEV_WITH_ID(BUCK, 2),
- MFD_DEV_WITH_ID(BUCK, 3),
- MFD_DEV_WITH_ID(BUCK, 4),
-
- /* 12 digital ldos */
- MFD_DEV_WITH_ID(DLDO, 1),
- MFD_DEV_WITH_ID(DLDO, 2),
- MFD_DEV_WITH_ID(DLDO, 3),
- MFD_DEV_WITH_ID(DLDO, 4),
- MFD_DEV_WITH_ID(DLDO, 5),
- MFD_DEV_WITH_ID(DLDO, 6),
- MFD_DEV_WITH_ID(DLDO, 7),
- MFD_DEV_WITH_ID(DLDO, 8),
- MFD_DEV_WITH_ID(DLDO, 9),
- MFD_DEV_WITH_ID(DLDO, 10),
- MFD_DEV_WITH_ID(DLDO, 11),
- MFD_DEV_WITH_ID(DLDO, 12),
-
- /* 10 analog ldos */
- MFD_DEV_WITH_ID(ALDO, 1),
- MFD_DEV_WITH_ID(ALDO, 2),
- MFD_DEV_WITH_ID(ALDO, 3),
- MFD_DEV_WITH_ID(ALDO, 4),
- MFD_DEV_WITH_ID(ALDO, 5),
- MFD_DEV_WITH_ID(ALDO, 6),
- MFD_DEV_WITH_ID(ALDO, 7),
- MFD_DEV_WITH_ID(ALDO, 8),
- MFD_DEV_WITH_ID(ALDO, 9),
- MFD_DEV_WITH_ID(ALDO, 10),
-
- /* ADC */
- MFD_DEV_SIMPLE(ADC),
-
- /* battery charger */
- MFD_DEV_WITH_RESOURCE(CHARGER, chg_irqs, ARRAY_SIZE(chg_irqs)),
-
- /* rtc */
- MFD_DEV_WITH_RESOURCE(RTC, rtc_irqs, ARRAY_SIZE(rtc_irqs)),
-
- /* backlight */
- MFD_DEV_SIMPLE(BACKLIGHT),
-
- /* current sink for vibrator */
- MFD_DEV_SIMPLE(VIBRATOR),
-
- /* current sink for keypad LED */
- MFD_DEV_SIMPLE(KEYLED),
-};
-
-int lp8788_read_byte(struct lp8788 *lp, u8 reg, u8 *data)
-{
- int ret;
- unsigned int val;
-
- ret = regmap_read(lp->regmap, reg, &val);
- if (ret < 0) {
- dev_err(lp->dev, "failed to read 0x%.2x\n", reg);
- return ret;
- }
-
- *data = (u8)val;
- return 0;
-}
-EXPORT_SYMBOL_GPL(lp8788_read_byte);
-
-int lp8788_read_multi_bytes(struct lp8788 *lp, u8 reg, u8 *data, size_t count)
-{
- return regmap_bulk_read(lp->regmap, reg, data, count);
-}
-EXPORT_SYMBOL_GPL(lp8788_read_multi_bytes);
-
-int lp8788_write_byte(struct lp8788 *lp, u8 reg, u8 data)
-{
- return regmap_write(lp->regmap, reg, data);
-}
-EXPORT_SYMBOL_GPL(lp8788_write_byte);
-
-int lp8788_update_bits(struct lp8788 *lp, u8 reg, u8 mask, u8 data)
-{
- return regmap_update_bits(lp->regmap, reg, mask, data);
-}
-EXPORT_SYMBOL_GPL(lp8788_update_bits);
-
-static int lp8788_platform_init(struct lp8788 *lp)
-{
- struct lp8788_platform_data *pdata = lp->pdata;
-
- return (pdata && pdata->init_func) ? pdata->init_func(lp) : 0;
-}
-
-static const struct regmap_config lp8788_regmap_config = {
- .reg_bits = 8,
- .val_bits = 8,
- .max_register = MAX_LP8788_REGISTERS,
-};
-
-static int lp8788_probe(struct i2c_client *cl)
-{
- struct lp8788 *lp;
- struct lp8788_platform_data *pdata = dev_get_platdata(&cl->dev);
- int ret;
-
- lp = devm_kzalloc(&cl->dev, sizeof(struct lp8788), GFP_KERNEL);
- if (!lp)
- return -ENOMEM;
-
- lp->regmap = devm_regmap_init_i2c(cl, &lp8788_regmap_config);
- if (IS_ERR(lp->regmap)) {
- ret = PTR_ERR(lp->regmap);
- dev_err(&cl->dev, "regmap init i2c err: %d\n", ret);
- return ret;
- }
-
- lp->pdata = pdata;
- lp->dev = &cl->dev;
- i2c_set_clientdata(cl, lp);
-
- ret = lp8788_platform_init(lp);
- if (ret)
- return ret;
-
- ret = lp8788_irq_init(lp, cl->irq);
- if (ret)
- return ret;
-
- ret = mfd_add_devices(lp->dev, -1, lp8788_devs,
- ARRAY_SIZE(lp8788_devs), NULL, 0, NULL);
- if (ret)
- goto err_exit_irq;
-
- return 0;
-
-err_exit_irq:
- lp8788_irq_exit(lp);
- return ret;
-}
-
-static void lp8788_remove(struct i2c_client *cl)
-{
- struct lp8788 *lp = i2c_get_clientdata(cl);
-
- mfd_remove_devices(lp->dev);
- lp8788_irq_exit(lp);
-}
-
-static const struct i2c_device_id lp8788_ids[] = {
- { "lp8788" },
- { }
-};
-MODULE_DEVICE_TABLE(i2c, lp8788_ids);
-
-static struct i2c_driver lp8788_driver = {
- .driver = {
- .name = "lp8788",
- },
- .probe = lp8788_probe,
- .remove = lp8788_remove,
- .id_table = lp8788_ids,
-};
-
-static int __init lp8788_init(void)
-{
- return i2c_add_driver(&lp8788_driver);
-}
-subsys_initcall(lp8788_init);
-
-static void __exit lp8788_exit(void)
-{
- i2c_del_driver(&lp8788_driver);
-}
-module_exit(lp8788_exit);
-
-MODULE_DESCRIPTION("TI LP8788 MFD Driver");
-MODULE_AUTHOR("Milo Kim");
diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
index a492c86e879a..9bb2ac78dca9 100644
--- a/drivers/power/supply/Kconfig
+++ b/drivers/power/supply/Kconfig
@@ -555,14 +555,6 @@ config CHARGER_LP8727
help
Say Y here to enable support for LP8727 Charger Driver.
-config CHARGER_LP8788
- tristate "TI LP8788 charger driver"
- depends on MFD_LP8788
- depends on LP8788_ADC
- depends on IIO
- help
- Say Y to enable support for the LP8788 linear charger.
-
config CHARGER_GPIO
tristate "GPIO charger"
depends on GPIOLIB || COMPILE_TEST
diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile
index 380546080112..76422bece94c 100644
--- a/drivers/power/supply/Makefile
+++ b/drivers/power/supply/Makefile
@@ -76,7 +76,6 @@ obj-$(CONFIG_CHARGER_MAX8903) += max8903_charger.o
obj-$(CONFIG_CHARGER_TWL4030) += twl4030_charger.o
obj-$(CONFIG_CHARGER_TWL6030) += twl6030_charger.o
obj-$(CONFIG_CHARGER_LP8727) += lp8727_charger.o
-obj-$(CONFIG_CHARGER_LP8788) += lp8788-charger.o
obj-$(CONFIG_CHARGER_GPIO) += gpio-charger.o
obj-$(CONFIG_CHARGER_MANAGER) += charger-manager.o
obj-$(CONFIG_CHARGER_LT3651) += lt3651-charger.o
diff --git a/drivers/power/supply/lp8788-charger.c b/drivers/power/supply/lp8788-charger.c
deleted file mode 100644
index b8b74efc9671..000000000000
--- a/drivers/power/supply/lp8788-charger.c
+++ /dev/null
@@ -1,730 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * TI LP8788 MFD - battery charger driver
- *
- * Copyright 2012 Texas Instruments
- *
- * Author: Milo(Woogyom) Kim <milo.kim@xxxxxx>
- */
-
-#include <linux/err.h>
-#include <linux/iio/consumer.h>
-#include <linux/interrupt.h>
-#include <linux/irqdomain.h>
-#include <linux/mfd/lp8788.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/power_supply.h>
-#include <linux/slab.h>
-#include <linux/workqueue.h>
-
-/* register address */
-#define LP8788_CHG_STATUS 0x07
-#define LP8788_CHG_IDCIN 0x13
-#define LP8788_CHG_IBATT 0x14
-#define LP8788_CHG_VTERM 0x15
-#define LP8788_CHG_EOC 0x16
-
-/* mask/shift bits */
-#define LP8788_CHG_INPUT_STATE_M 0x03 /* Addr 07h */
-#define LP8788_CHG_STATE_M 0x3C
-#define LP8788_CHG_STATE_S 2
-#define LP8788_NO_BATT_M BIT(6)
-#define LP8788_BAD_BATT_M BIT(7)
-#define LP8788_CHG_IBATT_M 0x1F /* Addr 14h */
-#define LP8788_CHG_VTERM_M 0x0F /* Addr 15h */
-#define LP8788_CHG_EOC_LEVEL_M 0x30 /* Addr 16h */
-#define LP8788_CHG_EOC_LEVEL_S 4
-#define LP8788_CHG_EOC_TIME_M 0x0E
-#define LP8788_CHG_EOC_TIME_S 1
-#define LP8788_CHG_EOC_MODE_M BIT(0)
-
-#define LP8788_CHARGER_NAME "charger"
-#define LP8788_BATTERY_NAME "main_batt"
-
-#define LP8788_CHG_START 0x11
-#define LP8788_CHG_END 0x1C
-
-#define LP8788_ISEL_MAX 23
-#define LP8788_ISEL_STEP 50
-#define LP8788_VTERM_MIN 4100
-#define LP8788_VTERM_STEP 25
-#define LP8788_MAX_BATT_CAPACITY 100
-#define LP8788_MAX_CHG_IRQS 11
-
-enum lp8788_charging_state {
- LP8788_OFF,
- LP8788_WARM_UP,
- LP8788_LOW_INPUT = 0x3,
- LP8788_PRECHARGE,
- LP8788_CC,
- LP8788_CV,
- LP8788_MAINTENANCE,
- LP8788_BATTERY_FAULT,
- LP8788_SYSTEM_SUPPORT = 0xC,
- LP8788_HIGH_CURRENT = 0xF,
- LP8788_MAX_CHG_STATE,
-};
-
-enum lp8788_charger_adc_sel {
- LP8788_VBATT,
- LP8788_BATT_TEMP,
- LP8788_NUM_CHG_ADC,
-};
-
-enum lp8788_charger_input_state {
- LP8788_SYSTEM_SUPPLY = 1,
- LP8788_FULL_FUNCTION,
-};
-
-/*
- * struct lp8788_chg_irq
- * @which : lp8788 interrupt id
- * @virq : Linux IRQ number from irq_domain
- */
-struct lp8788_chg_irq {
- enum lp8788_int_id which;
- int virq;
-};
-
-/*
- * struct lp8788_charger
- * @lp : used for accessing the registers of mfd lp8788 device
- * @charger : power supply driver for the battery charger
- * @battery : power supply driver for the battery
- * @charger_work : work queue for charger input interrupts
- * @chan : iio channels for getting adc values
- * eg) battery voltage, capacity and temperature
- * @irqs : charger dedicated interrupts
- * @num_irqs : total numbers of charger interrupts
- * @pdata : charger platform specific data
- */
-struct lp8788_charger {
- struct lp8788 *lp;
- struct power_supply *charger;
- struct power_supply *battery;
- struct work_struct charger_work;
- struct iio_channel *chan[LP8788_NUM_CHG_ADC];
- struct lp8788_chg_irq irqs[LP8788_MAX_CHG_IRQS];
- int num_irqs;
- struct lp8788_charger_platform_data *pdata;
-};
-
-static char *battery_supplied_to[] = {
- LP8788_BATTERY_NAME,
-};
-
-static enum power_supply_property lp8788_charger_prop[] = {
- POWER_SUPPLY_PROP_ONLINE,
- POWER_SUPPLY_PROP_CURRENT_MAX,
-};
-
-static enum power_supply_property lp8788_battery_prop[] = {
- POWER_SUPPLY_PROP_STATUS,
- POWER_SUPPLY_PROP_HEALTH,
- POWER_SUPPLY_PROP_PRESENT,
- POWER_SUPPLY_PROP_VOLTAGE_NOW,
- POWER_SUPPLY_PROP_CAPACITY,
- POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
- POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
- POWER_SUPPLY_PROP_TEMP,
-};
-
-static bool lp8788_is_charger_detected(struct lp8788_charger *pchg)
-{
- u8 data;
-
- lp8788_read_byte(pchg->lp, LP8788_CHG_STATUS, &data);
- data &= LP8788_CHG_INPUT_STATE_M;
-
- return data == LP8788_SYSTEM_SUPPLY || data == LP8788_FULL_FUNCTION;
-}
-
-static int lp8788_charger_get_property(struct power_supply *psy,
- enum power_supply_property psp,
- union power_supply_propval *val)
-{
- struct lp8788_charger *pchg = dev_get_drvdata(psy->dev.parent);
- u8 read;
-
- switch (psp) {
- case POWER_SUPPLY_PROP_ONLINE:
- val->intval = lp8788_is_charger_detected(pchg);
- break;
- case POWER_SUPPLY_PROP_CURRENT_MAX:
- lp8788_read_byte(pchg->lp, LP8788_CHG_IDCIN, &read);
- val->intval = LP8788_ISEL_STEP *
- (min_t(int, read, LP8788_ISEL_MAX) + 1);
- break;
- default:
- return -EINVAL;
- }
-
- return 0;
-}
-
-static int lp8788_get_battery_status(struct lp8788_charger *pchg,
- union power_supply_propval *val)
-{
- enum lp8788_charging_state state;
- u8 data;
- int ret;
-
- ret = lp8788_read_byte(pchg->lp, LP8788_CHG_STATUS, &data);
- if (ret)
- return ret;
-
- state = (data & LP8788_CHG_STATE_M) >> LP8788_CHG_STATE_S;
- switch (state) {
- case LP8788_OFF:
- val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
- break;
- case LP8788_PRECHARGE:
- case LP8788_CC:
- case LP8788_CV:
- case LP8788_HIGH_CURRENT:
- val->intval = POWER_SUPPLY_STATUS_CHARGING;
- break;
- case LP8788_MAINTENANCE:
- val->intval = POWER_SUPPLY_STATUS_FULL;
- break;
- default:
- val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
- break;
- }
-
- return 0;
-}
-
-static int lp8788_get_battery_health(struct lp8788_charger *pchg,
- union power_supply_propval *val)
-{
- u8 data;
- int ret;
-
- ret = lp8788_read_byte(pchg->lp, LP8788_CHG_STATUS, &data);
- if (ret)
- return ret;
-
- if (data & LP8788_NO_BATT_M)
- val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
- else if (data & LP8788_BAD_BATT_M)
- val->intval = POWER_SUPPLY_HEALTH_DEAD;
- else
- val->intval = POWER_SUPPLY_HEALTH_GOOD;
-
- return 0;
-}
-
-static int lp8788_get_battery_present(struct lp8788_charger *pchg,
- union power_supply_propval *val)
-{
- u8 data;
- int ret;
-
- ret = lp8788_read_byte(pchg->lp, LP8788_CHG_STATUS, &data);
- if (ret)
- return ret;
-
- val->intval = !(data & LP8788_NO_BATT_M);
- return 0;
-}
-
-static int lp8788_get_vbatt_adc(struct lp8788_charger *pchg, int *result)
-{
- struct iio_channel *channel = pchg->chan[LP8788_VBATT];
-
- if (!channel)
- return -EINVAL;
-
- return iio_read_channel_processed(channel, result);
-}
-
-static int lp8788_get_battery_voltage(struct lp8788_charger *pchg,
- union power_supply_propval *val)
-{
- return lp8788_get_vbatt_adc(pchg, &val->intval);
-}
-
-static int lp8788_get_battery_capacity(struct lp8788_charger *pchg,
- union power_supply_propval *val)
-{
- struct lp8788 *lp = pchg->lp;
- struct lp8788_charger_platform_data *pdata = pchg->pdata;
- unsigned int max_vbatt;
- int vbatt;
- enum lp8788_charging_state state;
- u8 data;
- int ret;
-
- if (!pdata)
- return -EINVAL;
-
- max_vbatt = pdata->max_vbatt_mv;
- if (max_vbatt == 0)
- return -EINVAL;
-
- ret = lp8788_read_byte(lp, LP8788_CHG_STATUS, &data);
- if (ret)
- return ret;
-
- state = (data & LP8788_CHG_STATE_M) >> LP8788_CHG_STATE_S;
-
- if (state == LP8788_MAINTENANCE) {
- val->intval = LP8788_MAX_BATT_CAPACITY;
- } else {
- ret = lp8788_get_vbatt_adc(pchg, &vbatt);
- if (ret)
- return ret;
-
- val->intval = (vbatt * LP8788_MAX_BATT_CAPACITY) / max_vbatt;
- val->intval = min(val->intval, LP8788_MAX_BATT_CAPACITY);
- }
-
- return 0;
-}
-
-static int lp8788_get_battery_temperature(struct lp8788_charger *pchg,
- union power_supply_propval *val)
-{
- struct iio_channel *channel = pchg->chan[LP8788_BATT_TEMP];
- int result;
- int ret;
-
- if (!channel)
- return -EINVAL;
-
- ret = iio_read_channel_processed(channel, &result);
- if (ret < 0)
- return -EINVAL;
-
- /* unit: 0.1 'C */
- val->intval = result * 10;
-
- return 0;
-}
-
-static int lp8788_get_battery_charging_current(struct lp8788_charger *pchg,
- union power_supply_propval *val)
-{
- u8 read;
-
- lp8788_read_byte(pchg->lp, LP8788_CHG_IBATT, &read);
- read &= LP8788_CHG_IBATT_M;
- val->intval = LP8788_ISEL_STEP *
- (min_t(int, read, LP8788_ISEL_MAX) + 1);
-
- return 0;
-}
-
-static int lp8788_get_charging_termination_voltage(struct lp8788_charger *pchg,
- union power_supply_propval *val)
-{
- u8 read;
-
- lp8788_read_byte(pchg->lp, LP8788_CHG_VTERM, &read);
- read &= LP8788_CHG_VTERM_M;
- val->intval = LP8788_VTERM_MIN + LP8788_VTERM_STEP * read;
-
- return 0;
-}
-
-static int lp8788_battery_get_property(struct power_supply *psy,
- enum power_supply_property psp,
- union power_supply_propval *val)
-{
- struct lp8788_charger *pchg = dev_get_drvdata(psy->dev.parent);
-
- switch (psp) {
- case POWER_SUPPLY_PROP_STATUS:
- return lp8788_get_battery_status(pchg, val);
- case POWER_SUPPLY_PROP_HEALTH:
- return lp8788_get_battery_health(pchg, val);
- case POWER_SUPPLY_PROP_PRESENT:
- return lp8788_get_battery_present(pchg, val);
- case POWER_SUPPLY_PROP_VOLTAGE_NOW:
- return lp8788_get_battery_voltage(pchg, val);
- case POWER_SUPPLY_PROP_CAPACITY:
- return lp8788_get_battery_capacity(pchg, val);
- case POWER_SUPPLY_PROP_TEMP:
- return lp8788_get_battery_temperature(pchg, val);
- case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
- return lp8788_get_battery_charging_current(pchg, val);
- case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
- return lp8788_get_charging_termination_voltage(pchg, val);
- default:
- return -EINVAL;
- }
-}
-
-static inline bool lp8788_is_valid_charger_register(u8 addr)
-{
- return addr >= LP8788_CHG_START && addr <= LP8788_CHG_END;
-}
-
-static int lp8788_update_charger_params(struct platform_device *pdev,
- struct lp8788_charger *pchg)
-{
- struct lp8788 *lp = pchg->lp;
- struct lp8788_charger_platform_data *pdata = pchg->pdata;
- struct lp8788_chg_param *param;
- int i;
- int ret;
-
- if (!pdata || !pdata->chg_params) {
- dev_info(&pdev->dev, "skip updating charger parameters\n");
- return 0;
- }
-
- /* setting charging parameters */
- for (i = 0; i < pdata->num_chg_params; i++) {
- param = pdata->chg_params + i;
-
- if (lp8788_is_valid_charger_register(param->addr)) {
- ret = lp8788_write_byte(lp, param->addr, param->val);
- if (ret)
- return ret;
- }
- }
-
- return 0;
-}
-
-static const struct power_supply_desc lp8788_psy_charger_desc = {
- .name = LP8788_CHARGER_NAME,
- .type = POWER_SUPPLY_TYPE_MAINS,
- .properties = lp8788_charger_prop,
- .num_properties = ARRAY_SIZE(lp8788_charger_prop),
- .get_property = lp8788_charger_get_property,
-};
-
-static const struct power_supply_desc lp8788_psy_battery_desc = {
- .name = LP8788_BATTERY_NAME,
- .type = POWER_SUPPLY_TYPE_BATTERY,
- .properties = lp8788_battery_prop,
- .num_properties = ARRAY_SIZE(lp8788_battery_prop),
- .get_property = lp8788_battery_get_property,
-};
-
-static void lp8788_charger_event(struct work_struct *work)
-{
- struct lp8788_charger *pchg =
- container_of(work, struct lp8788_charger, charger_work);
- struct lp8788_charger_platform_data *pdata = pchg->pdata;
- enum lp8788_charger_event event = lp8788_is_charger_detected(pchg);
-
- pdata->charger_event(pchg->lp, event);
-}
-
-static bool lp8788_find_irq_id(struct lp8788_charger *pchg, int virq, int *id)
-{
- bool found = false;
- int i;
-
- for (i = 0; i < pchg->num_irqs; i++) {
- if (pchg->irqs[i].virq == virq) {
- *id = pchg->irqs[i].which;
- found = true;
- break;
- }
- }
-
- return found;
-}
-
-static irqreturn_t lp8788_charger_irq_thread(int virq, void *ptr)
-{
- struct lp8788_charger *pchg = ptr;
- struct lp8788_charger_platform_data *pdata = pchg->pdata;
- int id = -1;
-
- if (!lp8788_find_irq_id(pchg, virq, &id))
- return IRQ_NONE;
-
- switch (id) {
- case LP8788_INT_CHG_INPUT_STATE:
- case LP8788_INT_CHG_STATE:
- case LP8788_INT_EOC:
- case LP8788_INT_BATT_LOW:
- case LP8788_INT_NO_BATT:
- power_supply_changed(pchg->charger);
- power_supply_changed(pchg->battery);
- break;
- default:
- break;
- }
-
- /* report charger dectection event if used */
- if (!pdata)
- goto irq_handled;
-
- if (pdata->charger_event && id == LP8788_INT_CHG_INPUT_STATE)
- schedule_work(&pchg->charger_work);
-
-irq_handled:
- return IRQ_HANDLED;
-}
-
-static int lp8788_set_irqs(struct platform_device *pdev,
- struct lp8788_charger *pchg, const char *name)
-{
- struct resource *r;
- struct irq_domain *irqdm = pchg->lp->irqdm;
- int irq_start;
- int irq_end;
- int virq;
- int nr_irq;
- int i;
- int ret;
-
- /* no error even if no irq resource */
- r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, name);
- if (!r)
- return 0;
-
- irq_start = r->start;
- irq_end = r->end;
-
- for (i = irq_start; i <= irq_end; i++) {
- nr_irq = pchg->num_irqs;
-
- virq = irq_create_mapping(irqdm, i);
- pchg->irqs[nr_irq].virq = virq;
- pchg->irqs[nr_irq].which = i;
- pchg->num_irqs++;
-
- ret = request_threaded_irq(virq, NULL,
- lp8788_charger_irq_thread,
- IRQF_ONESHOT, name, pchg);
- if (ret)
- break;
- }
-
- if (i <= irq_end)
- goto err_free_irq;
-
- return 0;
-
-err_free_irq:
- for (i = 0; i < pchg->num_irqs; i++)
- free_irq(pchg->irqs[i].virq, pchg);
- return ret;
-}
-
-static int lp8788_irq_register(struct platform_device *pdev,
- struct lp8788_charger *pchg)
-{
- static const char * const name[] = {
- LP8788_CHG_IRQ, LP8788_PRSW_IRQ, LP8788_BATT_IRQ
- };
- int i;
- int ret;
-
- INIT_WORK(&pchg->charger_work, lp8788_charger_event);
- pchg->num_irqs = 0;
-
- for (i = 0; i < ARRAY_SIZE(name); i++) {
- ret = lp8788_set_irqs(pdev, pchg, name[i]);
- if (ret) {
- dev_warn(&pdev->dev, "irq setup failed: %s\n", name[i]);
- return ret;
- }
- }
-
- if (pchg->num_irqs > LP8788_MAX_CHG_IRQS) {
- dev_err(&pdev->dev, "invalid total number of irqs: %d\n",
- pchg->num_irqs);
- return -EINVAL;
- }
-
-
- return 0;
-}
-
-static void lp8788_irq_unregister(struct platform_device *pdev,
- struct lp8788_charger *pchg)
-{
- int i;
- int irq;
-
- for (i = 0; i < pchg->num_irqs; i++) {
- irq = pchg->irqs[i].virq;
- if (!irq)
- continue;
-
- free_irq(irq, pchg);
- }
-}
-
-static void lp8788_setup_adc_channel(struct device *dev,
- struct lp8788_charger *pchg)
-{
- struct lp8788_charger_platform_data *pdata = pchg->pdata;
- struct iio_channel *chan;
-
- if (!pdata)
- return;
-
- /* ADC channel for battery voltage */
- chan = devm_iio_channel_get(dev, pdata->adc_vbatt);
- pchg->chan[LP8788_VBATT] = IS_ERR(chan) ? NULL : chan;
-
- /* ADC channel for battery temperature */
- chan = devm_iio_channel_get(dev, pdata->adc_batt_temp);
- pchg->chan[LP8788_BATT_TEMP] = IS_ERR(chan) ? NULL : chan;
-}
-
-static ssize_t lp8788_show_charger_status(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct lp8788_charger *pchg = dev_get_drvdata(dev);
- enum lp8788_charging_state state;
- static const char * const desc[LP8788_MAX_CHG_STATE] = {
- [LP8788_OFF] = "CHARGER OFF",
- [LP8788_WARM_UP] = "WARM UP",
- [LP8788_LOW_INPUT] = "LOW INPUT STATE",
- [LP8788_PRECHARGE] = "CHARGING - PRECHARGE",
- [LP8788_CC] = "CHARGING - CC",
- [LP8788_CV] = "CHARGING - CV",
- [LP8788_MAINTENANCE] = "NO CHARGING - MAINTENANCE",
- [LP8788_BATTERY_FAULT] = "BATTERY FAULT",
- [LP8788_SYSTEM_SUPPORT] = "SYSTEM SUPPORT",
- [LP8788_HIGH_CURRENT] = "HIGH CURRENT",
- };
- u8 data;
-
- lp8788_read_byte(pchg->lp, LP8788_CHG_STATUS, &data);
- state = (data & LP8788_CHG_STATE_M) >> LP8788_CHG_STATE_S;
-
- return sysfs_emit(buf, "%s\n", desc[state]);
-}
-
-static ssize_t lp8788_show_eoc_time(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct lp8788_charger *pchg = dev_get_drvdata(dev);
- static const char * const stime[] = {
- "400ms", "5min", "10min", "15min",
- "20min", "25min", "30min", "No timeout"
- };
- u8 val;
-
- lp8788_read_byte(pchg->lp, LP8788_CHG_EOC, &val);
- val = (val & LP8788_CHG_EOC_TIME_M) >> LP8788_CHG_EOC_TIME_S;
-
- return sysfs_emit(buf, "End Of Charge Time: %s\n", stime[val]);
-}
-
-static ssize_t lp8788_show_eoc_level(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct lp8788_charger *pchg = dev_get_drvdata(dev);
- static const char * const abs_level[] = {
- "25mA", "49mA", "75mA", "98mA"
- };
- static const char * const relative_level[] = {
- "5%", "10%", "15%", "20%"
- };
- const char *level;
- u8 val;
- u8 mode;
-
- lp8788_read_byte(pchg->lp, LP8788_CHG_EOC, &val);
-
- mode = val & LP8788_CHG_EOC_MODE_M;
- val = (val & LP8788_CHG_EOC_LEVEL_M) >> LP8788_CHG_EOC_LEVEL_S;
- level = mode ? abs_level[val] : relative_level[val];
-
- return sysfs_emit(buf, "End Of Charge Level: %s\n", level);
-}
-
-static DEVICE_ATTR(charger_status, S_IRUSR, lp8788_show_charger_status, NULL);
-static DEVICE_ATTR(eoc_time, S_IRUSR, lp8788_show_eoc_time, NULL);
-static DEVICE_ATTR(eoc_level, S_IRUSR, lp8788_show_eoc_level, NULL);
-
-static struct attribute *lp8788_charger_sysfs_attrs[] = {
- &dev_attr_charger_status.attr,
- &dev_attr_eoc_time.attr,
- &dev_attr_eoc_level.attr,
- NULL,
-};
-
-ATTRIBUTE_GROUPS(lp8788_charger_sysfs);
-
-static int lp8788_psy_register(struct platform_device *pdev,
- struct lp8788_charger *pchg)
-{
- struct power_supply_config charger_cfg = {};
-
- charger_cfg.attr_grp = lp8788_charger_sysfs_groups;
- charger_cfg.supplied_to = battery_supplied_to;
- charger_cfg.num_supplicants = ARRAY_SIZE(battery_supplied_to);
-
- pchg->charger = devm_power_supply_register(&pdev->dev,
- &lp8788_psy_charger_desc,
- &charger_cfg);
- if (IS_ERR(pchg->charger))
- return -EPERM;
-
- pchg->battery = devm_power_supply_register(&pdev->dev,
- &lp8788_psy_battery_desc, NULL);
- if (IS_ERR(pchg->battery))
- return -EPERM;
-
- return 0;
-}
-
-static int lp8788_charger_probe(struct platform_device *pdev)
-{
- struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
- struct lp8788_charger *pchg;
- struct device *dev = &pdev->dev;
- int ret;
-
- pchg = devm_kzalloc(dev, sizeof(struct lp8788_charger), GFP_KERNEL);
- if (!pchg)
- return -ENOMEM;
-
- pchg->lp = lp;
- pchg->pdata = lp->pdata ? lp->pdata->chg_pdata : NULL;
- platform_set_drvdata(pdev, pchg);
-
- ret = lp8788_update_charger_params(pdev, pchg);
- if (ret)
- return ret;
-
- lp8788_setup_adc_channel(&pdev->dev, pchg);
-
- ret = lp8788_psy_register(pdev, pchg);
- if (ret)
- return ret;
-
- ret = lp8788_irq_register(pdev, pchg);
- if (ret)
- dev_warn(dev, "failed to register charger irq: %d\n", ret);
-
- return 0;
-}
-
-static void lp8788_charger_remove(struct platform_device *pdev)
-{
- struct lp8788_charger *pchg = platform_get_drvdata(pdev);
-
- lp8788_irq_unregister(pdev, pchg);
- cancel_work_sync(&pchg->charger_work);
-}
-
-static struct platform_driver lp8788_charger_driver = {
- .probe = lp8788_charger_probe,
- .remove = lp8788_charger_remove,
- .driver = {
- .name = LP8788_DEV_CHARGER,
- },
-};
-module_platform_driver(lp8788_charger_driver);
-
-MODULE_DESCRIPTION("TI LP8788 Charger Driver");
-MODULE_AUTHOR("Milo Kim");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:lp8788-charger");
-MODULE_IMPORT_NS("IIO_CONSUMER");
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 7d587ffc0a89..4b90d1cb045c 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -555,12 +555,6 @@ config REGULATOR_LP87565
provides four step-down converters. It supports software based
voltage control for different voltage domains
-config REGULATOR_LP8788
- tristate "TI LP8788 Power Regulators"
- depends on MFD_LP8788
- help
- This driver supports LP8788 voltage regulator chip.
-
config REGULATOR_LTC3589
tristate "LTC3589 8-output voltage regulator"
depends on I2C
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index a1344d3c3fd3..fe0f099c217b 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -65,8 +65,6 @@ obj-$(CONFIG_REGULATOR_LP3972) += lp3972.o
obj-$(CONFIG_REGULATOR_LP872X) += lp872x.o
obj-$(CONFIG_REGULATOR_LP873X) += lp873x-regulator.o
obj-$(CONFIG_REGULATOR_LP87565) += lp87565-regulator.o
-obj-$(CONFIG_REGULATOR_LP8788) += lp8788-buck.o
-obj-$(CONFIG_REGULATOR_LP8788) += lp8788-ldo.o
obj-$(CONFIG_REGULATOR_LP8755) += lp8755.o
obj-$(CONFIG_REGULATOR_LTC3589) += ltc3589.o
obj-$(CONFIG_REGULATOR_LTC3676) += ltc3676.o
diff --git a/drivers/regulator/lp8788-buck.c b/drivers/regulator/lp8788-buck.c
deleted file mode 100644
index 2ade249ab6df..000000000000
--- a/drivers/regulator/lp8788-buck.c
+++ /dev/null
@@ -1,541 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * TI LP8788 MFD - buck regulator driver
- *
- * Copyright 2012 Texas Instruments
- *
- * Author: Milo(Woogyom) Kim <milo.kim@xxxxxx>
- */
-
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/err.h>
-#include <linux/platform_device.h>
-#include <linux/regulator/driver.h>
-#include <linux/mfd/lp8788.h>
-#include <linux/gpio/consumer.h>
-
-/* register address */
-#define LP8788_EN_BUCK 0x0C
-#define LP8788_BUCK_DVS_SEL 0x1D
-#define LP8788_BUCK1_VOUT0 0x1E
-#define LP8788_BUCK1_VOUT1 0x1F
-#define LP8788_BUCK1_VOUT2 0x20
-#define LP8788_BUCK1_VOUT3 0x21
-#define LP8788_BUCK2_VOUT0 0x22
-#define LP8788_BUCK2_VOUT1 0x23
-#define LP8788_BUCK2_VOUT2 0x24
-#define LP8788_BUCK2_VOUT3 0x25
-#define LP8788_BUCK3_VOUT 0x26
-#define LP8788_BUCK4_VOUT 0x27
-#define LP8788_BUCK1_TIMESTEP 0x28
-#define LP8788_BUCK_PWM 0x2D
-
-/* mask/shift bits */
-#define LP8788_EN_BUCK1_M BIT(0) /* Addr 0Ch */
-#define LP8788_EN_BUCK2_M BIT(1)
-#define LP8788_EN_BUCK3_M BIT(2)
-#define LP8788_EN_BUCK4_M BIT(3)
-#define LP8788_BUCK1_DVS_SEL_M 0x04 /* Addr 1Dh */
-#define LP8788_BUCK1_DVS_M 0x03
-#define LP8788_BUCK1_DVS_S 0
-#define LP8788_BUCK2_DVS_SEL_M 0x40
-#define LP8788_BUCK2_DVS_M 0x30
-#define LP8788_BUCK2_DVS_S 4
-#define LP8788_BUCK1_DVS_I2C BIT(2)
-#define LP8788_BUCK2_DVS_I2C BIT(6)
-#define LP8788_BUCK1_DVS_PIN (0 << 2)
-#define LP8788_BUCK2_DVS_PIN (0 << 6)
-#define LP8788_VOUT_M 0x1F /* Addr 1Eh ~ 27h */
-#define LP8788_STARTUP_TIME_M 0xF8 /* Addr 28h ~ 2Bh */
-#define LP8788_STARTUP_TIME_S 3
-#define LP8788_FPWM_BUCK1_M BIT(0) /* Addr 2Dh */
-#define LP8788_FPWM_BUCK1_S 0
-#define LP8788_FPWM_BUCK2_M BIT(1)
-#define LP8788_FPWM_BUCK2_S 1
-#define LP8788_FPWM_BUCK3_M BIT(2)
-#define LP8788_FPWM_BUCK3_S 2
-#define LP8788_FPWM_BUCK4_M BIT(3)
-#define LP8788_FPWM_BUCK4_S 3
-
-#define INVALID_ADDR 0xFF
-#define LP8788_FORCE_PWM 1
-#define LP8788_AUTO_PWM 0
-#define PIN_LOW 0
-#define PIN_HIGH 1
-#define ENABLE_TIME_USEC 32
-
-#define BUCK_FPWM_MASK(x) (1 << (x))
-#define BUCK_FPWM_SHIFT(x) (x)
-
-enum lp8788_dvs_state {
- DVS_LOW = 0,
- DVS_HIGH = 1,
-};
-
-enum lp8788_dvs_mode {
- REGISTER,
- EXTPIN,
-};
-
-enum lp8788_buck_id {
- BUCK1,
- BUCK2,
- BUCK3,
- BUCK4,
-};
-
-struct lp8788_buck {
- struct lp8788 *lp;
- struct regulator_dev *regulator;
- void *dvs;
- struct gpio_desc *gpio1;
- struct gpio_desc *gpio2; /* Only used on BUCK2 */
-};
-
-/* BUCK 1 ~ 4 voltage ranges */
-static const struct linear_range buck_volt_ranges[] = {
- REGULATOR_LINEAR_RANGE(500000, 0, 0, 0),
- REGULATOR_LINEAR_RANGE(800000, 1, 25, 50000),
-};
-
-static void lp8788_buck1_set_dvs(struct lp8788_buck *buck)
-{
- struct lp8788_buck1_dvs *dvs = (struct lp8788_buck1_dvs *)buck->dvs;
- enum lp8788_dvs_state pinstate;
-
- if (!dvs)
- return;
-
- pinstate = dvs->vsel == DVS_SEL_V0 ? DVS_LOW : DVS_HIGH;
- gpiod_set_value(buck->gpio1, pinstate);
-}
-
-static void lp8788_buck2_set_dvs(struct lp8788_buck *buck)
-{
- struct lp8788_buck2_dvs *dvs = (struct lp8788_buck2_dvs *)buck->dvs;
- enum lp8788_dvs_state pin1, pin2;
-
- if (!dvs)
- return;
-
- switch (dvs->vsel) {
- case DVS_SEL_V0:
- pin1 = DVS_LOW;
- pin2 = DVS_LOW;
- break;
- case DVS_SEL_V1:
- pin1 = DVS_HIGH;
- pin2 = DVS_LOW;
- break;
- case DVS_SEL_V2:
- pin1 = DVS_LOW;
- pin2 = DVS_HIGH;
- break;
- case DVS_SEL_V3:
- pin1 = DVS_HIGH;
- pin2 = DVS_HIGH;
- break;
- default:
- return;
- }
-
- gpiod_set_value(buck->gpio1, pin1);
- gpiod_set_value(buck->gpio2, pin2);
-}
-
-static void lp8788_set_dvs(struct lp8788_buck *buck, enum lp8788_buck_id id)
-{
- switch (id) {
- case BUCK1:
- lp8788_buck1_set_dvs(buck);
- break;
- case BUCK2:
- lp8788_buck2_set_dvs(buck);
- break;
- default:
- break;
- }
-}
-
-static enum lp8788_dvs_mode
-lp8788_get_buck_dvs_ctrl_mode(struct lp8788_buck *buck, enum lp8788_buck_id id)
-{
- u8 val, mask;
-
- switch (id) {
- case BUCK1:
- mask = LP8788_BUCK1_DVS_SEL_M;
- break;
- case BUCK2:
- mask = LP8788_BUCK2_DVS_SEL_M;
- break;
- default:
- return REGISTER;
- }
-
- lp8788_read_byte(buck->lp, LP8788_BUCK_DVS_SEL, &val);
-
- return val & mask ? REGISTER : EXTPIN;
-}
-
-static bool lp8788_is_valid_buck_addr(u8 addr)
-{
- switch (addr) {
- case LP8788_BUCK1_VOUT0:
- case LP8788_BUCK1_VOUT1:
- case LP8788_BUCK1_VOUT2:
- case LP8788_BUCK1_VOUT3:
- case LP8788_BUCK2_VOUT0:
- case LP8788_BUCK2_VOUT1:
- case LP8788_BUCK2_VOUT2:
- case LP8788_BUCK2_VOUT3:
- return true;
- default:
- return false;
- }
-}
-
-static u8 lp8788_select_buck_vout_addr(struct lp8788_buck *buck,
- enum lp8788_buck_id id)
-{
- enum lp8788_dvs_mode mode = lp8788_get_buck_dvs_ctrl_mode(buck, id);
- u8 val, idx, addr;
- int pin1, pin2;
-
- switch (id) {
- case BUCK1:
- if (mode == EXTPIN) {
- idx = gpiod_get_value(buck->gpio1);
- } else {
- lp8788_read_byte(buck->lp, LP8788_BUCK_DVS_SEL, &val);
- idx = (val & LP8788_BUCK1_DVS_M) >> LP8788_BUCK1_DVS_S;
- }
- addr = LP8788_BUCK1_VOUT0 + idx;
- break;
- case BUCK2:
- if (mode == EXTPIN) {
- pin1 = gpiod_get_value(buck->gpio1);
- pin2 = gpiod_get_value(buck->gpio2);
-
- if (pin1 == PIN_LOW && pin2 == PIN_LOW)
- idx = 0;
- else if (pin1 == PIN_LOW && pin2 == PIN_HIGH)
- idx = 2;
- else if (pin1 == PIN_HIGH && pin2 == PIN_LOW)
- idx = 1;
- else
- idx = 3;
- } else {
- lp8788_read_byte(buck->lp, LP8788_BUCK_DVS_SEL, &val);
- idx = (val & LP8788_BUCK2_DVS_M) >> LP8788_BUCK2_DVS_S;
- }
- addr = LP8788_BUCK2_VOUT0 + idx;
- break;
- default:
- goto err;
- }
-
- return addr;
-err:
- return INVALID_ADDR;
-}
-
-static int lp8788_buck12_set_voltage_sel(struct regulator_dev *rdev,
- unsigned selector)
-{
- struct lp8788_buck *buck = rdev_get_drvdata(rdev);
- enum lp8788_buck_id id = rdev_get_id(rdev);
- u8 addr;
-
- if (buck->dvs)
- lp8788_set_dvs(buck, id);
-
- addr = lp8788_select_buck_vout_addr(buck, id);
- if (!lp8788_is_valid_buck_addr(addr))
- return -EINVAL;
-
- return lp8788_update_bits(buck->lp, addr, LP8788_VOUT_M, selector);
-}
-
-static int lp8788_buck12_get_voltage_sel(struct regulator_dev *rdev)
-{
- struct lp8788_buck *buck = rdev_get_drvdata(rdev);
- enum lp8788_buck_id id = rdev_get_id(rdev);
- int ret;
- u8 val, addr;
-
- addr = lp8788_select_buck_vout_addr(buck, id);
- if (!lp8788_is_valid_buck_addr(addr))
- return -EINVAL;
-
- ret = lp8788_read_byte(buck->lp, addr, &val);
- if (ret)
- return ret;
-
- return val & LP8788_VOUT_M;
-}
-
-static int lp8788_buck_enable_time(struct regulator_dev *rdev)
-{
- struct lp8788_buck *buck = rdev_get_drvdata(rdev);
- enum lp8788_buck_id id = rdev_get_id(rdev);
- u8 val, addr = LP8788_BUCK1_TIMESTEP + id;
-
- if (lp8788_read_byte(buck->lp, addr, &val))
- return -EINVAL;
-
- val = (val & LP8788_STARTUP_TIME_M) >> LP8788_STARTUP_TIME_S;
-
- return ENABLE_TIME_USEC * val;
-}
-
-static int lp8788_buck_set_mode(struct regulator_dev *rdev, unsigned int mode)
-{
- struct lp8788_buck *buck = rdev_get_drvdata(rdev);
- enum lp8788_buck_id id = rdev_get_id(rdev);
- u8 mask, val;
-
- mask = BUCK_FPWM_MASK(id);
- switch (mode) {
- case REGULATOR_MODE_FAST:
- val = LP8788_FORCE_PWM << BUCK_FPWM_SHIFT(id);
- break;
- case REGULATOR_MODE_NORMAL:
- val = LP8788_AUTO_PWM << BUCK_FPWM_SHIFT(id);
- break;
- default:
- return -EINVAL;
- }
-
- return lp8788_update_bits(buck->lp, LP8788_BUCK_PWM, mask, val);
-}
-
-static unsigned int lp8788_buck_get_mode(struct regulator_dev *rdev)
-{
- struct lp8788_buck *buck = rdev_get_drvdata(rdev);
- enum lp8788_buck_id id = rdev_get_id(rdev);
- u8 val;
- int ret;
-
- ret = lp8788_read_byte(buck->lp, LP8788_BUCK_PWM, &val);
- if (ret)
- return ret;
-
- return val & BUCK_FPWM_MASK(id) ?
- REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL;
-}
-
-static const struct regulator_ops lp8788_buck12_ops = {
- .list_voltage = regulator_list_voltage_linear_range,
- .map_voltage = regulator_map_voltage_linear_range,
- .set_voltage_sel = lp8788_buck12_set_voltage_sel,
- .get_voltage_sel = lp8788_buck12_get_voltage_sel,
- .enable = regulator_enable_regmap,
- .disable = regulator_disable_regmap,
- .is_enabled = regulator_is_enabled_regmap,
- .enable_time = lp8788_buck_enable_time,
- .set_mode = lp8788_buck_set_mode,
- .get_mode = lp8788_buck_get_mode,
-};
-
-static const struct regulator_ops lp8788_buck34_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,
- .enable_time = lp8788_buck_enable_time,
- .set_mode = lp8788_buck_set_mode,
- .get_mode = lp8788_buck_get_mode,
-};
-
-static const struct regulator_desc lp8788_buck_desc[] = {
- {
- .name = "buck1",
- .id = BUCK1,
- .ops = &lp8788_buck12_ops,
- .n_voltages = 26,
- .linear_ranges = buck_volt_ranges,
- .n_linear_ranges = ARRAY_SIZE(buck_volt_ranges),
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .enable_reg = LP8788_EN_BUCK,
- .enable_mask = LP8788_EN_BUCK1_M,
- },
- {
- .name = "buck2",
- .id = BUCK2,
- .ops = &lp8788_buck12_ops,
- .n_voltages = 26,
- .linear_ranges = buck_volt_ranges,
- .n_linear_ranges = ARRAY_SIZE(buck_volt_ranges),
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .enable_reg = LP8788_EN_BUCK,
- .enable_mask = LP8788_EN_BUCK2_M,
- },
- {
- .name = "buck3",
- .id = BUCK3,
- .ops = &lp8788_buck34_ops,
- .n_voltages = 26,
- .linear_ranges = buck_volt_ranges,
- .n_linear_ranges = ARRAY_SIZE(buck_volt_ranges),
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_BUCK3_VOUT,
- .vsel_mask = LP8788_VOUT_M,
- .enable_reg = LP8788_EN_BUCK,
- .enable_mask = LP8788_EN_BUCK3_M,
- },
- {
- .name = "buck4",
- .id = BUCK4,
- .ops = &lp8788_buck34_ops,
- .n_voltages = 26,
- .linear_ranges = buck_volt_ranges,
- .n_linear_ranges = ARRAY_SIZE(buck_volt_ranges),
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_BUCK4_VOUT,
- .vsel_mask = LP8788_VOUT_M,
- .enable_reg = LP8788_EN_BUCK,
- .enable_mask = LP8788_EN_BUCK4_M,
- },
-};
-
-static int lp8788_dvs_gpio_request(struct platform_device *pdev,
- struct lp8788_buck *buck,
- enum lp8788_buck_id id)
-{
- struct lp8788_platform_data *pdata = buck->lp->pdata;
- struct device *dev = &pdev->dev;
-
- switch (id) {
- case BUCK1:
- buck->gpio1 = devm_gpiod_get(dev, "dvs", GPIOD_OUT_LOW);
- if (IS_ERR(buck->gpio1))
- return PTR_ERR(buck->gpio1);
- gpiod_set_consumer_name(buck->gpio1, "LP8788_B1_DVS");
-
- buck->dvs = pdata->buck1_dvs;
- break;
- case BUCK2:
- buck->gpio1 = devm_gpiod_get_index(dev, "dvs", 0, GPIOD_OUT_LOW);
- if (IS_ERR(buck->gpio1))
- return PTR_ERR(buck->gpio1);
- gpiod_set_consumer_name(buck->gpio1, "LP8788_B2_DVS1");
-
- buck->gpio2 = devm_gpiod_get_index(dev, "dvs", 1, GPIOD_OUT_LOW);
- if (IS_ERR(buck->gpio2))
- return PTR_ERR(buck->gpio2);
- gpiod_set_consumer_name(buck->gpio2, "LP8788_B2_DVS2");
-
- buck->dvs = pdata->buck2_dvs;
- break;
- default:
- break;
- }
-
- return 0;
-}
-
-static int lp8788_init_dvs(struct platform_device *pdev,
- struct lp8788_buck *buck, enum lp8788_buck_id id)
-{
- struct lp8788_platform_data *pdata = buck->lp->pdata;
- u8 mask[] = { LP8788_BUCK1_DVS_SEL_M, LP8788_BUCK2_DVS_SEL_M };
- u8 val[] = { LP8788_BUCK1_DVS_PIN, LP8788_BUCK2_DVS_PIN };
- u8 default_dvs_mode[] = { LP8788_BUCK1_DVS_I2C, LP8788_BUCK2_DVS_I2C };
-
- /* no dvs for buck3, 4 */
- if (id > BUCK2)
- return 0;
-
- /* no dvs platform data, then dvs will be selected by I2C registers */
- if (!pdata)
- goto set_default_dvs_mode;
-
- if ((id == BUCK1 && !pdata->buck1_dvs) ||
- (id == BUCK2 && !pdata->buck2_dvs))
- goto set_default_dvs_mode;
-
- if (lp8788_dvs_gpio_request(pdev, buck, id))
- goto set_default_dvs_mode;
-
- return lp8788_update_bits(buck->lp, LP8788_BUCK_DVS_SEL, mask[id],
- val[id]);
-
-set_default_dvs_mode:
- return lp8788_update_bits(buck->lp, LP8788_BUCK_DVS_SEL, mask[id],
- default_dvs_mode[id]);
-}
-
-static int lp8788_buck_probe(struct platform_device *pdev)
-{
- struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
- int id = pdev->id;
- struct lp8788_buck *buck;
- struct regulator_config cfg = { };
- struct regulator_dev *rdev;
- int ret;
-
- if (id >= LP8788_NUM_BUCKS)
- return -EINVAL;
-
- buck = devm_kzalloc(&pdev->dev, sizeof(struct lp8788_buck), GFP_KERNEL);
- if (!buck)
- return -ENOMEM;
-
- buck->lp = lp;
-
- ret = lp8788_init_dvs(pdev, buck, id);
- if (ret)
- return ret;
-
- cfg.dev = pdev->dev.parent;
- cfg.init_data = lp->pdata ? lp->pdata->buck_data[id] : NULL;
- cfg.driver_data = buck;
- cfg.regmap = lp->regmap;
-
- rdev = devm_regulator_register(&pdev->dev, &lp8788_buck_desc[id], &cfg);
- if (IS_ERR(rdev)) {
- ret = PTR_ERR(rdev);
- dev_err(&pdev->dev, "BUCK%d regulator register err = %d\n",
- id + 1, ret);
- return ret;
- }
-
- buck->regulator = rdev;
- platform_set_drvdata(pdev, buck);
-
- return 0;
-}
-
-static struct platform_driver lp8788_buck_driver = {
- .probe = lp8788_buck_probe,
- .driver = {
- .name = LP8788_DEV_BUCK,
- .probe_type = PROBE_PREFER_ASYNCHRONOUS,
- },
-};
-
-static int __init lp8788_buck_init(void)
-{
- return platform_driver_register(&lp8788_buck_driver);
-}
-subsys_initcall(lp8788_buck_init);
-
-static void __exit lp8788_buck_exit(void)
-{
- platform_driver_unregister(&lp8788_buck_driver);
-}
-module_exit(lp8788_buck_exit);
-
-MODULE_DESCRIPTION("TI LP8788 BUCK Driver");
-MODULE_AUTHOR("Milo Kim");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:lp8788-buck");
diff --git a/drivers/regulator/lp8788-ldo.c b/drivers/regulator/lp8788-ldo.c
deleted file mode 100644
index 8e45b7b99556..000000000000
--- a/drivers/regulator/lp8788-ldo.c
+++ /dev/null
@@ -1,640 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * TI LP8788 MFD - ldo regulator driver
- *
- * Copyright 2012 Texas Instruments
- *
- * Author: Milo(Woogyom) Kim <milo.kim@xxxxxx>
- */
-
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/err.h>
-#include <linux/platform_device.h>
-#include <linux/regulator/driver.h>
-#include <linux/gpio/consumer.h>
-#include <linux/mfd/lp8788.h>
-
-/* register address */
-#define LP8788_EN_LDO_A 0x0D /* DLDO 1 ~ 8 */
-#define LP8788_EN_LDO_B 0x0E /* DLDO 9 ~ 12, ALDO 1 ~ 4 */
-#define LP8788_EN_LDO_C 0x0F /* ALDO 5 ~ 10 */
-#define LP8788_EN_SEL 0x10
-#define LP8788_DLDO1_VOUT 0x2E
-#define LP8788_DLDO2_VOUT 0x2F
-#define LP8788_DLDO3_VOUT 0x30
-#define LP8788_DLDO4_VOUT 0x31
-#define LP8788_DLDO5_VOUT 0x32
-#define LP8788_DLDO6_VOUT 0x33
-#define LP8788_DLDO7_VOUT 0x34
-#define LP8788_DLDO8_VOUT 0x35
-#define LP8788_DLDO9_VOUT 0x36
-#define LP8788_DLDO10_VOUT 0x37
-#define LP8788_DLDO11_VOUT 0x38
-#define LP8788_DLDO12_VOUT 0x39
-#define LP8788_ALDO1_VOUT 0x3A
-#define LP8788_ALDO2_VOUT 0x3B
-#define LP8788_ALDO3_VOUT 0x3C
-#define LP8788_ALDO4_VOUT 0x3D
-#define LP8788_ALDO5_VOUT 0x3E
-#define LP8788_ALDO6_VOUT 0x3F
-#define LP8788_ALDO7_VOUT 0x40
-#define LP8788_ALDO8_VOUT 0x41
-#define LP8788_ALDO9_VOUT 0x42
-#define LP8788_ALDO10_VOUT 0x43
-#define LP8788_DLDO1_TIMESTEP 0x44
-
-/* mask/shift bits */
-#define LP8788_EN_DLDO1_M BIT(0) /* Addr 0Dh ~ 0Fh */
-#define LP8788_EN_DLDO2_M BIT(1)
-#define LP8788_EN_DLDO3_M BIT(2)
-#define LP8788_EN_DLDO4_M BIT(3)
-#define LP8788_EN_DLDO5_M BIT(4)
-#define LP8788_EN_DLDO6_M BIT(5)
-#define LP8788_EN_DLDO7_M BIT(6)
-#define LP8788_EN_DLDO8_M BIT(7)
-#define LP8788_EN_DLDO9_M BIT(0)
-#define LP8788_EN_DLDO10_M BIT(1)
-#define LP8788_EN_DLDO11_M BIT(2)
-#define LP8788_EN_DLDO12_M BIT(3)
-#define LP8788_EN_ALDO1_M BIT(4)
-#define LP8788_EN_ALDO2_M BIT(5)
-#define LP8788_EN_ALDO3_M BIT(6)
-#define LP8788_EN_ALDO4_M BIT(7)
-#define LP8788_EN_ALDO5_M BIT(0)
-#define LP8788_EN_ALDO6_M BIT(1)
-#define LP8788_EN_ALDO7_M BIT(2)
-#define LP8788_EN_ALDO8_M BIT(3)
-#define LP8788_EN_ALDO9_M BIT(4)
-#define LP8788_EN_ALDO10_M BIT(5)
-#define LP8788_EN_SEL_DLDO911_M BIT(0) /* Addr 10h */
-#define LP8788_EN_SEL_DLDO7_M BIT(1)
-#define LP8788_EN_SEL_ALDO7_M BIT(2)
-#define LP8788_EN_SEL_ALDO5_M BIT(3)
-#define LP8788_EN_SEL_ALDO234_M BIT(4)
-#define LP8788_EN_SEL_ALDO1_M BIT(5)
-#define LP8788_VOUT_5BIT_M 0x1F /* Addr 2Eh ~ 43h */
-#define LP8788_VOUT_4BIT_M 0x0F
-#define LP8788_VOUT_3BIT_M 0x07
-#define LP8788_VOUT_1BIT_M 0x01
-#define LP8788_STARTUP_TIME_M 0xF8 /* Addr 44h ~ 59h */
-#define LP8788_STARTUP_TIME_S 3
-
-#define ENABLE_TIME_USEC 32
-
-enum lp8788_ldo_id {
- DLDO1,
- DLDO2,
- DLDO3,
- DLDO4,
- DLDO5,
- DLDO6,
- DLDO7,
- DLDO8,
- DLDO9,
- DLDO10,
- DLDO11,
- DLDO12,
- ALDO1,
- ALDO2,
- ALDO3,
- ALDO4,
- ALDO5,
- ALDO6,
- ALDO7,
- ALDO8,
- ALDO9,
- ALDO10,
-};
-
-struct lp8788_ldo {
- struct lp8788 *lp;
- struct regulator_desc *desc;
- struct regulator_dev *regulator;
- struct gpio_desc *ena_gpiod;
-};
-
-/* DLDO 1, 2, 3, 9 voltage table */
-static const int lp8788_dldo1239_vtbl[] = {
- 1800000, 1900000, 2000000, 2100000, 2200000, 2300000, 2400000, 2500000,
- 2600000, 2700000, 2800000, 2900000, 3000000, 2850000, 2850000, 2850000,
- 2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000,
- 2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000,
-};
-
-/* DLDO 4 voltage table */
-static const int lp8788_dldo4_vtbl[] = { 1800000, 3000000 };
-
-/* DLDO 5, 7, 8 and ALDO 6 voltage table */
-static const int lp8788_dldo578_aldo6_vtbl[] = {
- 1800000, 1900000, 2000000, 2100000, 2200000, 2300000, 2400000, 2500000,
- 2600000, 2700000, 2800000, 2900000, 3000000, 3000000, 3000000, 3000000,
-};
-
-/* DLDO 6 voltage table */
-static const int lp8788_dldo6_vtbl[] = {
- 3000000, 3100000, 3200000, 3300000, 3400000, 3500000, 3600000, 3600000,
-};
-
-/* DLDO 10, 11 voltage table */
-static const int lp8788_dldo1011_vtbl[] = {
- 1100000, 1150000, 1200000, 1250000, 1300000, 1350000, 1400000, 1450000,
- 1500000, 1500000, 1500000, 1500000, 1500000, 1500000, 1500000, 1500000,
-};
-
-/* ALDO 1 voltage table */
-static const int lp8788_aldo1_vtbl[] = { 1800000, 2850000 };
-
-/* ALDO 7 voltage table */
-static const int lp8788_aldo7_vtbl[] = {
- 1200000, 1300000, 1400000, 1500000, 1600000, 1700000, 1800000, 1800000,
-};
-
-static int lp8788_ldo_enable_time(struct regulator_dev *rdev)
-{
- struct lp8788_ldo *ldo = rdev_get_drvdata(rdev);
- enum lp8788_ldo_id id = rdev_get_id(rdev);
- u8 val, addr = LP8788_DLDO1_TIMESTEP + id;
-
- if (lp8788_read_byte(ldo->lp, addr, &val))
- return -EINVAL;
-
- val = (val & LP8788_STARTUP_TIME_M) >> LP8788_STARTUP_TIME_S;
-
- return ENABLE_TIME_USEC * val;
-}
-
-static const struct regulator_ops lp8788_ldo_voltage_table_ops = {
- .list_voltage = regulator_list_voltage_table,
- .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,
- .enable_time = lp8788_ldo_enable_time,
-};
-
-static const struct regulator_ops lp8788_ldo_voltage_fixed_ops = {
- .list_voltage = regulator_list_voltage_linear,
- .enable = regulator_enable_regmap,
- .disable = regulator_disable_regmap,
- .is_enabled = regulator_is_enabled_regmap,
- .enable_time = lp8788_ldo_enable_time,
-};
-
-static const struct regulator_desc lp8788_dldo_desc[] = {
- {
- .name = "dldo1",
- .id = DLDO1,
- .ops = &lp8788_ldo_voltage_table_ops,
- .n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
- .volt_table = lp8788_dldo1239_vtbl,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_DLDO1_VOUT,
- .vsel_mask = LP8788_VOUT_5BIT_M,
- .enable_reg = LP8788_EN_LDO_A,
- .enable_mask = LP8788_EN_DLDO1_M,
- },
- {
- .name = "dldo2",
- .id = DLDO2,
- .ops = &lp8788_ldo_voltage_table_ops,
- .n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
- .volt_table = lp8788_dldo1239_vtbl,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_DLDO2_VOUT,
- .vsel_mask = LP8788_VOUT_5BIT_M,
- .enable_reg = LP8788_EN_LDO_A,
- .enable_mask = LP8788_EN_DLDO2_M,
- },
- {
- .name = "dldo3",
- .id = DLDO3,
- .ops = &lp8788_ldo_voltage_table_ops,
- .n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
- .volt_table = lp8788_dldo1239_vtbl,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_DLDO3_VOUT,
- .vsel_mask = LP8788_VOUT_5BIT_M,
- .enable_reg = LP8788_EN_LDO_A,
- .enable_mask = LP8788_EN_DLDO3_M,
- },
- {
- .name = "dldo4",
- .id = DLDO4,
- .ops = &lp8788_ldo_voltage_table_ops,
- .n_voltages = ARRAY_SIZE(lp8788_dldo4_vtbl),
- .volt_table = lp8788_dldo4_vtbl,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_DLDO4_VOUT,
- .vsel_mask = LP8788_VOUT_1BIT_M,
- .enable_reg = LP8788_EN_LDO_A,
- .enable_mask = LP8788_EN_DLDO4_M,
- },
- {
- .name = "dldo5",
- .id = DLDO5,
- .ops = &lp8788_ldo_voltage_table_ops,
- .n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
- .volt_table = lp8788_dldo578_aldo6_vtbl,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_DLDO5_VOUT,
- .vsel_mask = LP8788_VOUT_4BIT_M,
- .enable_reg = LP8788_EN_LDO_A,
- .enable_mask = LP8788_EN_DLDO5_M,
- },
- {
- .name = "dldo6",
- .id = DLDO6,
- .ops = &lp8788_ldo_voltage_table_ops,
- .n_voltages = ARRAY_SIZE(lp8788_dldo6_vtbl),
- .volt_table = lp8788_dldo6_vtbl,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_DLDO6_VOUT,
- .vsel_mask = LP8788_VOUT_3BIT_M,
- .enable_reg = LP8788_EN_LDO_A,
- .enable_mask = LP8788_EN_DLDO6_M,
- },
- {
- .name = "dldo7",
- .id = DLDO7,
- .ops = &lp8788_ldo_voltage_table_ops,
- .n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
- .volt_table = lp8788_dldo578_aldo6_vtbl,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_DLDO7_VOUT,
- .vsel_mask = LP8788_VOUT_4BIT_M,
- .enable_reg = LP8788_EN_LDO_A,
- .enable_mask = LP8788_EN_DLDO7_M,
- },
- {
- .name = "dldo8",
- .id = DLDO8,
- .ops = &lp8788_ldo_voltage_table_ops,
- .n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
- .volt_table = lp8788_dldo578_aldo6_vtbl,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_DLDO8_VOUT,
- .vsel_mask = LP8788_VOUT_4BIT_M,
- .enable_reg = LP8788_EN_LDO_A,
- .enable_mask = LP8788_EN_DLDO8_M,
- },
- {
- .name = "dldo9",
- .id = DLDO9,
- .ops = &lp8788_ldo_voltage_table_ops,
- .n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
- .volt_table = lp8788_dldo1239_vtbl,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_DLDO9_VOUT,
- .vsel_mask = LP8788_VOUT_5BIT_M,
- .enable_reg = LP8788_EN_LDO_B,
- .enable_mask = LP8788_EN_DLDO9_M,
- },
- {
- .name = "dldo10",
- .id = DLDO10,
- .ops = &lp8788_ldo_voltage_table_ops,
- .n_voltages = ARRAY_SIZE(lp8788_dldo1011_vtbl),
- .volt_table = lp8788_dldo1011_vtbl,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_DLDO10_VOUT,
- .vsel_mask = LP8788_VOUT_4BIT_M,
- .enable_reg = LP8788_EN_LDO_B,
- .enable_mask = LP8788_EN_DLDO10_M,
- },
- {
- .name = "dldo11",
- .id = DLDO11,
- .ops = &lp8788_ldo_voltage_table_ops,
- .n_voltages = ARRAY_SIZE(lp8788_dldo1011_vtbl),
- .volt_table = lp8788_dldo1011_vtbl,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_DLDO11_VOUT,
- .vsel_mask = LP8788_VOUT_4BIT_M,
- .enable_reg = LP8788_EN_LDO_B,
- .enable_mask = LP8788_EN_DLDO11_M,
- },
- {
- .name = "dldo12",
- .id = DLDO12,
- .ops = &lp8788_ldo_voltage_fixed_ops,
- .n_voltages = 1,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .enable_reg = LP8788_EN_LDO_B,
- .enable_mask = LP8788_EN_DLDO12_M,
- .min_uV = 2500000,
- },
-};
-
-static const struct regulator_desc lp8788_aldo_desc[] = {
- {
- .name = "aldo1",
- .id = ALDO1,
- .ops = &lp8788_ldo_voltage_table_ops,
- .n_voltages = ARRAY_SIZE(lp8788_aldo1_vtbl),
- .volt_table = lp8788_aldo1_vtbl,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_ALDO1_VOUT,
- .vsel_mask = LP8788_VOUT_1BIT_M,
- .enable_reg = LP8788_EN_LDO_B,
- .enable_mask = LP8788_EN_ALDO1_M,
- },
- {
- .name = "aldo2",
- .id = ALDO2,
- .ops = &lp8788_ldo_voltage_fixed_ops,
- .n_voltages = 1,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .enable_reg = LP8788_EN_LDO_B,
- .enable_mask = LP8788_EN_ALDO2_M,
- .min_uV = 2850000,
- },
- {
- .name = "aldo3",
- .id = ALDO3,
- .ops = &lp8788_ldo_voltage_fixed_ops,
- .n_voltages = 1,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .enable_reg = LP8788_EN_LDO_B,
- .enable_mask = LP8788_EN_ALDO3_M,
- .min_uV = 2850000,
- },
- {
- .name = "aldo4",
- .id = ALDO4,
- .ops = &lp8788_ldo_voltage_fixed_ops,
- .n_voltages = 1,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .enable_reg = LP8788_EN_LDO_B,
- .enable_mask = LP8788_EN_ALDO4_M,
- .min_uV = 2850000,
- },
- {
- .name = "aldo5",
- .id = ALDO5,
- .ops = &lp8788_ldo_voltage_fixed_ops,
- .n_voltages = 1,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .enable_reg = LP8788_EN_LDO_C,
- .enable_mask = LP8788_EN_ALDO5_M,
- .min_uV = 2850000,
- },
- {
- .name = "aldo6",
- .id = ALDO6,
- .ops = &lp8788_ldo_voltage_table_ops,
- .n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
- .volt_table = lp8788_dldo578_aldo6_vtbl,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_ALDO6_VOUT,
- .vsel_mask = LP8788_VOUT_4BIT_M,
- .enable_reg = LP8788_EN_LDO_C,
- .enable_mask = LP8788_EN_ALDO6_M,
- },
- {
- .name = "aldo7",
- .id = ALDO7,
- .ops = &lp8788_ldo_voltage_table_ops,
- .n_voltages = ARRAY_SIZE(lp8788_aldo7_vtbl),
- .volt_table = lp8788_aldo7_vtbl,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .vsel_reg = LP8788_ALDO7_VOUT,
- .vsel_mask = LP8788_VOUT_3BIT_M,
- .enable_reg = LP8788_EN_LDO_C,
- .enable_mask = LP8788_EN_ALDO7_M,
- },
- {
- .name = "aldo8",
- .id = ALDO8,
- .ops = &lp8788_ldo_voltage_fixed_ops,
- .n_voltages = 1,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .enable_reg = LP8788_EN_LDO_C,
- .enable_mask = LP8788_EN_ALDO8_M,
- .min_uV = 2500000,
- },
- {
- .name = "aldo9",
- .id = ALDO9,
- .ops = &lp8788_ldo_voltage_fixed_ops,
- .n_voltages = 1,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .enable_reg = LP8788_EN_LDO_C,
- .enable_mask = LP8788_EN_ALDO9_M,
- .min_uV = 2500000,
- },
- {
- .name = "aldo10",
- .id = ALDO10,
- .ops = &lp8788_ldo_voltage_fixed_ops,
- .n_voltages = 1,
- .type = REGULATOR_VOLTAGE,
- .owner = THIS_MODULE,
- .enable_reg = LP8788_EN_LDO_C,
- .enable_mask = LP8788_EN_ALDO10_M,
- .min_uV = 1100000,
- },
-};
-
-static int lp8788_config_ldo_enable_mode(struct platform_device *pdev,
- struct lp8788_ldo *ldo,
- enum lp8788_ldo_id id)
-{
- struct lp8788 *lp = ldo->lp;
- enum lp8788_ext_ldo_en_id enable_id;
- static const u8 en_mask[] = {
- [EN_ALDO1] = LP8788_EN_SEL_ALDO1_M,
- [EN_ALDO234] = LP8788_EN_SEL_ALDO234_M,
- [EN_ALDO5] = LP8788_EN_SEL_ALDO5_M,
- [EN_ALDO7] = LP8788_EN_SEL_ALDO7_M,
- [EN_DLDO7] = LP8788_EN_SEL_DLDO7_M,
- [EN_DLDO911] = LP8788_EN_SEL_DLDO911_M,
- };
-
- switch (id) {
- case DLDO7:
- enable_id = EN_DLDO7;
- break;
- case DLDO9:
- case DLDO11:
- enable_id = EN_DLDO911;
- break;
- case ALDO1:
- enable_id = EN_ALDO1;
- break;
- case ALDO2 ... ALDO4:
- enable_id = EN_ALDO234;
- break;
- case ALDO5:
- enable_id = EN_ALDO5;
- break;
- case ALDO7:
- enable_id = EN_ALDO7;
- break;
- default:
- return 0;
- }
-
- /*
- * Do not use devm* here: the regulator core takes over the
- * lifecycle management of the GPIO descriptor.
- * FIXME: check default mode for GPIO here: high or low?
- */
- ldo->ena_gpiod = gpiod_get_index_optional(&pdev->dev,
- "enable",
- enable_id,
- GPIOD_OUT_HIGH |
- GPIOD_FLAGS_BIT_NONEXCLUSIVE);
- if (IS_ERR(ldo->ena_gpiod))
- return PTR_ERR(ldo->ena_gpiod);
-
- /* if no GPIO for ldo pin, then set default enable mode */
- if (!ldo->ena_gpiod)
- goto set_default_ldo_enable_mode;
-
- return 0;
-
-set_default_ldo_enable_mode:
- return lp8788_update_bits(lp, LP8788_EN_SEL, en_mask[enable_id], 0);
-}
-
-static int lp8788_dldo_probe(struct platform_device *pdev)
-{
- struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
- int id = pdev->id;
- struct lp8788_ldo *ldo;
- struct regulator_config cfg = { };
- struct regulator_dev *rdev;
- int ret;
-
- ldo = devm_kzalloc(&pdev->dev, sizeof(struct lp8788_ldo), GFP_KERNEL);
- if (!ldo)
- return -ENOMEM;
-
- ldo->lp = lp;
- ret = lp8788_config_ldo_enable_mode(pdev, ldo, id);
- if (ret)
- return ret;
-
- if (ldo->ena_gpiod)
- cfg.ena_gpiod = ldo->ena_gpiod;
-
- cfg.dev = pdev->dev.parent;
- cfg.init_data = lp->pdata ? lp->pdata->dldo_data[id] : NULL;
- cfg.driver_data = ldo;
- cfg.regmap = lp->regmap;
-
- rdev = devm_regulator_register(&pdev->dev, &lp8788_dldo_desc[id], &cfg);
- if (IS_ERR(rdev)) {
- ret = PTR_ERR(rdev);
- dev_err(&pdev->dev, "DLDO%d regulator register err = %d\n",
- id + 1, ret);
- return ret;
- }
-
- ldo->regulator = rdev;
- platform_set_drvdata(pdev, ldo);
-
- return 0;
-}
-
-static struct platform_driver lp8788_dldo_driver = {
- .probe = lp8788_dldo_probe,
- .driver = {
- .name = LP8788_DEV_DLDO,
- .probe_type = PROBE_PREFER_ASYNCHRONOUS,
- },
-};
-
-static int lp8788_aldo_probe(struct platform_device *pdev)
-{
- struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
- int id = pdev->id;
- struct lp8788_ldo *ldo;
- struct regulator_config cfg = { };
- struct regulator_dev *rdev;
- int ret;
-
- ldo = devm_kzalloc(&pdev->dev, sizeof(struct lp8788_ldo), GFP_KERNEL);
- if (!ldo)
- return -ENOMEM;
-
- ldo->lp = lp;
- ret = lp8788_config_ldo_enable_mode(pdev, ldo, id + ALDO1);
- if (ret)
- return ret;
-
- if (ldo->ena_gpiod)
- cfg.ena_gpiod = ldo->ena_gpiod;
-
- cfg.dev = pdev->dev.parent;
- cfg.init_data = lp->pdata ? lp->pdata->aldo_data[id] : NULL;
- cfg.driver_data = ldo;
- cfg.regmap = lp->regmap;
-
- rdev = devm_regulator_register(&pdev->dev, &lp8788_aldo_desc[id], &cfg);
- if (IS_ERR(rdev)) {
- ret = PTR_ERR(rdev);
- dev_err(&pdev->dev, "ALDO%d regulator register err = %d\n",
- id + 1, ret);
- return ret;
- }
-
- ldo->regulator = rdev;
- platform_set_drvdata(pdev, ldo);
-
- return 0;
-}
-
-static struct platform_driver lp8788_aldo_driver = {
- .probe = lp8788_aldo_probe,
- .driver = {
- .name = LP8788_DEV_ALDO,
- .probe_type = PROBE_PREFER_ASYNCHRONOUS,
- },
-};
-
-static struct platform_driver * const drivers[] = {
- &lp8788_dldo_driver,
- &lp8788_aldo_driver,
-};
-
-static int __init lp8788_ldo_init(void)
-{
- return platform_register_drivers(drivers, ARRAY_SIZE(drivers));
-}
-subsys_initcall(lp8788_ldo_init);
-
-static void __exit lp8788_ldo_exit(void)
-{
- platform_unregister_drivers(drivers, ARRAY_SIZE(drivers));
-}
-module_exit(lp8788_ldo_exit);
-
-MODULE_DESCRIPTION("TI LP8788 LDO Driver");
-MODULE_AUTHOR("Milo Kim");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:lp8788-dldo");
-MODULE_ALIAS("platform:lp8788-aldo");
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index 5674211afe91..c201948b4d5b 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -317,12 +317,6 @@ config RTC_DRV_HYM8563
This driver can also be built as a module. If so, the module
will be called rtc-hym8563.
-config RTC_DRV_LP8788
- tristate "TI LP8788 RTC driver"
- depends on MFD_LP8788
- help
- Say Y to enable support for the LP8788 RTC/ALARM driver.
-
config RTC_DRV_MAX6900
tristate "Maxim MAX6900"
help
diff --git a/drivers/rtc/rtc-lp8788.c b/drivers/rtc/rtc-lp8788.c
deleted file mode 100644
index 0793d70507f7..000000000000
--- a/drivers/rtc/rtc-lp8788.c
+++ /dev/null
@@ -1,322 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * TI LP8788 MFD - rtc driver
- *
- * Copyright 2012 Texas Instruments
- *
- * Author: Milo(Woogyom) Kim <milo.kim@xxxxxx>
- */
-
-#include <linux/err.h>
-#include <linux/irqdomain.h>
-#include <linux/mfd/lp8788.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/rtc.h>
-#include <linux/slab.h>
-
-/* register address */
-#define LP8788_INTEN_3 0x05
-#define LP8788_RTC_UNLOCK 0x64
-#define LP8788_RTC_SEC 0x70
-#define LP8788_ALM1_SEC 0x77
-#define LP8788_ALM1_EN 0x7D
-#define LP8788_ALM2_SEC 0x7E
-#define LP8788_ALM2_EN 0x84
-
-/* mask/shift bits */
-#define LP8788_INT_RTC_ALM1_M BIT(1) /* Addr 05h */
-#define LP8788_INT_RTC_ALM1_S 1
-#define LP8788_INT_RTC_ALM2_M BIT(2) /* Addr 05h */
-#define LP8788_INT_RTC_ALM2_S 2
-#define LP8788_ALM_EN_M BIT(7) /* Addr 7Dh or 84h */
-#define LP8788_ALM_EN_S 7
-
-#define DEFAULT_ALARM_SEL LP8788_ALARM_1
-#define LP8788_MONTH_OFFSET 1
-#define LP8788_BASE_YEAR 2000
-#define MAX_WDAY_BITS 7
-#define LP8788_WDAY_SET 1
-#define RTC_UNLOCK 0x1
-#define RTC_LATCH 0x2
-#define ALARM_IRQ_FLAG (RTC_IRQF | RTC_AF)
-
-enum lp8788_time {
- LPTIME_SEC,
- LPTIME_MIN,
- LPTIME_HOUR,
- LPTIME_MDAY,
- LPTIME_MON,
- LPTIME_YEAR,
- LPTIME_WDAY,
- LPTIME_MAX,
-};
-
-struct lp8788_rtc {
- struct lp8788 *lp;
- struct rtc_device *rdev;
- enum lp8788_alarm_sel alarm;
- int irq;
-};
-
-static const u8 addr_alarm_sec[LP8788_ALARM_MAX] = {
- LP8788_ALM1_SEC,
- LP8788_ALM2_SEC,
-};
-
-static const u8 addr_alarm_en[LP8788_ALARM_MAX] = {
- LP8788_ALM1_EN,
- LP8788_ALM2_EN,
-};
-
-static const u8 mask_alarm_en[LP8788_ALARM_MAX] = {
- LP8788_INT_RTC_ALM1_M,
- LP8788_INT_RTC_ALM2_M,
-};
-
-static const u8 shift_alarm_en[LP8788_ALARM_MAX] = {
- LP8788_INT_RTC_ALM1_S,
- LP8788_INT_RTC_ALM2_S,
-};
-
-static int _to_tm_wday(u8 lp8788_wday)
-{
- int i;
-
- if (lp8788_wday == 0)
- return 0;
-
- /* lookup defined weekday from read register value */
- for (i = 0; i < MAX_WDAY_BITS; i++) {
- if ((lp8788_wday >> i) == LP8788_WDAY_SET)
- break;
- }
-
- return i + 1;
-}
-
-static inline int _to_lp8788_wday(int tm_wday)
-{
- return LP8788_WDAY_SET << (tm_wday - 1);
-}
-
-static void lp8788_rtc_unlock(struct lp8788 *lp)
-{
- lp8788_write_byte(lp, LP8788_RTC_UNLOCK, RTC_UNLOCK);
- lp8788_write_byte(lp, LP8788_RTC_UNLOCK, RTC_LATCH);
-}
-
-static int lp8788_rtc_read_time(struct device *dev, struct rtc_time *tm)
-{
- struct lp8788_rtc *rtc = dev_get_drvdata(dev);
- struct lp8788 *lp = rtc->lp;
- u8 data[LPTIME_MAX];
- int ret;
-
- lp8788_rtc_unlock(lp);
-
- ret = lp8788_read_multi_bytes(lp, LP8788_RTC_SEC, data, LPTIME_MAX);
- if (ret)
- return ret;
-
- tm->tm_sec = data[LPTIME_SEC];
- tm->tm_min = data[LPTIME_MIN];
- tm->tm_hour = data[LPTIME_HOUR];
- tm->tm_mday = data[LPTIME_MDAY];
- tm->tm_mon = data[LPTIME_MON] - LP8788_MONTH_OFFSET;
- tm->tm_year = data[LPTIME_YEAR] + LP8788_BASE_YEAR - 1900;
- tm->tm_wday = _to_tm_wday(data[LPTIME_WDAY]);
-
- return 0;
-}
-
-static int lp8788_rtc_set_time(struct device *dev, struct rtc_time *tm)
-{
- struct lp8788_rtc *rtc = dev_get_drvdata(dev);
- struct lp8788 *lp = rtc->lp;
- u8 data[LPTIME_MAX - 1];
- int ret, i, year;
-
- year = tm->tm_year + 1900 - LP8788_BASE_YEAR;
- if (year < 0) {
- dev_err(lp->dev, "invalid year: %d\n", year);
- return -EINVAL;
- }
-
- /* because rtc weekday is a readonly register, do not update */
- data[LPTIME_SEC] = tm->tm_sec;
- data[LPTIME_MIN] = tm->tm_min;
- data[LPTIME_HOUR] = tm->tm_hour;
- data[LPTIME_MDAY] = tm->tm_mday;
- data[LPTIME_MON] = tm->tm_mon + LP8788_MONTH_OFFSET;
- data[LPTIME_YEAR] = year;
-
- for (i = 0; i < ARRAY_SIZE(data); i++) {
- ret = lp8788_write_byte(lp, LP8788_RTC_SEC + i, data[i]);
- if (ret)
- return ret;
- }
-
- return 0;
-}
-
-static int lp8788_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
-{
- struct lp8788_rtc *rtc = dev_get_drvdata(dev);
- struct lp8788 *lp = rtc->lp;
- struct rtc_time *tm = &alarm->time;
- u8 addr, data[LPTIME_MAX];
- int ret;
-
- addr = addr_alarm_sec[rtc->alarm];
- ret = lp8788_read_multi_bytes(lp, addr, data, LPTIME_MAX);
- if (ret)
- return ret;
-
- tm->tm_sec = data[LPTIME_SEC];
- tm->tm_min = data[LPTIME_MIN];
- tm->tm_hour = data[LPTIME_HOUR];
- tm->tm_mday = data[LPTIME_MDAY];
- tm->tm_mon = data[LPTIME_MON] - LP8788_MONTH_OFFSET;
- tm->tm_year = data[LPTIME_YEAR] + LP8788_BASE_YEAR - 1900;
- tm->tm_wday = _to_tm_wday(data[LPTIME_WDAY]);
- alarm->enabled = data[LPTIME_WDAY] & LP8788_ALM_EN_M;
-
- return 0;
-}
-
-static int lp8788_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
-{
- struct lp8788_rtc *rtc = dev_get_drvdata(dev);
- struct lp8788 *lp = rtc->lp;
- struct rtc_time *tm = &alarm->time;
- u8 addr, data[LPTIME_MAX];
- int ret, i, year;
-
- year = tm->tm_year + 1900 - LP8788_BASE_YEAR;
- if (year < 0) {
- dev_err(lp->dev, "invalid year: %d\n", year);
- return -EINVAL;
- }
-
- data[LPTIME_SEC] = tm->tm_sec;
- data[LPTIME_MIN] = tm->tm_min;
- data[LPTIME_HOUR] = tm->tm_hour;
- data[LPTIME_MDAY] = tm->tm_mday;
- data[LPTIME_MON] = tm->tm_mon + LP8788_MONTH_OFFSET;
- data[LPTIME_YEAR] = year;
- data[LPTIME_WDAY] = _to_lp8788_wday(tm->tm_wday);
-
- for (i = 0; i < ARRAY_SIZE(data); i++) {
- addr = addr_alarm_sec[rtc->alarm] + i;
- ret = lp8788_write_byte(lp, addr, data[i]);
- if (ret)
- return ret;
- }
-
- alarm->enabled = 1;
- addr = addr_alarm_en[rtc->alarm];
-
- return lp8788_update_bits(lp, addr, LP8788_ALM_EN_M,
- alarm->enabled << LP8788_ALM_EN_S);
-}
-
-static int lp8788_alarm_irq_enable(struct device *dev, unsigned int enable)
-{
- struct lp8788_rtc *rtc = dev_get_drvdata(dev);
- struct lp8788 *lp = rtc->lp;
- u8 mask, shift;
-
- if (!rtc->irq)
- return -EIO;
-
- mask = mask_alarm_en[rtc->alarm];
- shift = shift_alarm_en[rtc->alarm];
-
- return lp8788_update_bits(lp, LP8788_INTEN_3, mask, enable << shift);
-}
-
-static const struct rtc_class_ops lp8788_rtc_ops = {
- .read_time = lp8788_rtc_read_time,
- .set_time = lp8788_rtc_set_time,
- .read_alarm = lp8788_read_alarm,
- .set_alarm = lp8788_set_alarm,
- .alarm_irq_enable = lp8788_alarm_irq_enable,
-};
-
-static irqreturn_t lp8788_alarm_irq_handler(int irq, void *ptr)
-{
- struct lp8788_rtc *rtc = ptr;
-
- rtc_update_irq(rtc->rdev, 1, ALARM_IRQ_FLAG);
- return IRQ_HANDLED;
-}
-
-static int lp8788_alarm_irq_register(struct platform_device *pdev,
- struct lp8788_rtc *rtc)
-{
- struct resource *r;
- struct lp8788 *lp = rtc->lp;
- struct irq_domain *irqdm = lp->irqdm;
- int irq;
-
- rtc->irq = 0;
-
- /* even the alarm IRQ number is not specified, rtc time should work */
- r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, LP8788_ALM_IRQ);
- if (!r)
- return 0;
-
- if (rtc->alarm == LP8788_ALARM_1)
- irq = r->start;
- else
- irq = r->end;
-
- rtc->irq = irq_create_mapping(irqdm, irq);
-
- return devm_request_threaded_irq(&pdev->dev, rtc->irq, NULL,
- lp8788_alarm_irq_handler,
- 0, LP8788_ALM_IRQ, rtc);
-}
-
-static int lp8788_rtc_probe(struct platform_device *pdev)
-{
- struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
- struct lp8788_rtc *rtc;
- struct device *dev = &pdev->dev;
-
- rtc = devm_kzalloc(dev, sizeof(struct lp8788_rtc), GFP_KERNEL);
- if (!rtc)
- return -ENOMEM;
-
- rtc->lp = lp;
- rtc->alarm = lp->pdata ? lp->pdata->alarm_sel : DEFAULT_ALARM_SEL;
- platform_set_drvdata(pdev, rtc);
-
- device_init_wakeup(dev, true);
-
- rtc->rdev = devm_rtc_device_register(dev, "lp8788_rtc",
- &lp8788_rtc_ops, THIS_MODULE);
- if (IS_ERR(rtc->rdev)) {
- dev_err(dev, "can not register rtc device\n");
- return PTR_ERR(rtc->rdev);
- }
-
- if (lp8788_alarm_irq_register(pdev, rtc))
- dev_warn(lp->dev, "no rtc irq handler\n");
-
- return 0;
-}
-
-static struct platform_driver lp8788_rtc_driver = {
- .probe = lp8788_rtc_probe,
- .driver = {
- .name = LP8788_DEV_RTC,
- },
-};
-module_platform_driver(lp8788_rtc_driver);
-
-MODULE_DESCRIPTION("Texas Instruments LP8788 RTC Driver");
-MODULE_AUTHOR("Milo Kim");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:lp8788-rtc");
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index 413ed6c38b53..2c206d2713e3 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -425,12 +425,6 @@ config BACKLIGHT_LP855X
This supports TI LP8550, LP8551, LP8552, LP8553, LP8555, LP8556 and
LP8557 backlight driver.
-config BACKLIGHT_LP8788
- tristate "Backlight driver for TI LP8788 MFD"
- depends on MFD_LP8788 && PWM
- help
- This supports TI LP8788 backlight driver.
-
config BACKLIGHT_MP3309C
tristate "Backlight Driver for MPS MP3309C"
depends on I2C && PWM
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index 3dc3580d82c7..0497eaa639cd 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -43,7 +43,6 @@ obj-$(CONFIG_BACKLIGHT_LM3630A) += lm3630a_bl.o
obj-$(CONFIG_BACKLIGHT_LM3639) += lm3639_bl.o
obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o
obj-$(CONFIG_BACKLIGHT_LP855X) += lp855x_bl.o
-obj-$(CONFIG_BACKLIGHT_LP8788) += lp8788_bl.o
obj-$(CONFIG_BACKLIGHT_LV5207LP) += lv5207lp.o
obj-$(CONFIG_BACKLIGHT_MAX25014) += max25014.o
obj-$(CONFIG_BACKLIGHT_MAX8925) += max8925_bl.o
diff --git a/drivers/video/backlight/lp8788_bl.c b/drivers/video/backlight/lp8788_bl.c
deleted file mode 100644
index f61a64905a02..000000000000
--- a/drivers/video/backlight/lp8788_bl.c
+++ /dev/null
@@ -1,190 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * TI LP8788 MFD - backlight driver
- *
- * Copyright 2012 Texas Instruments
- *
- * Author: Milo(Woogyom) Kim <milo.kim@xxxxxx>
- */
-
-#include <linux/backlight.h>
-#include <linux/err.h>
-#include <linux/mfd/lp8788.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/slab.h>
-
-/* Register address */
-#define LP8788_BL_CONFIG 0x96
-#define LP8788_BL_EN BIT(0)
-#define LP8788_BL_PWM_INPUT_EN BIT(5)
-#define LP8788_BL_FULLSCALE_SHIFT 2
-#define LP8788_BL_DIM_MODE_SHIFT 1
-#define LP8788_BL_PWM_POLARITY_SHIFT 6
-
-#define LP8788_BL_BRIGHTNESS 0x97
-
-#define LP8788_BL_RAMP 0x98
-#define LP8788_BL_RAMP_RISE_SHIFT 4
-
-#define MAX_BRIGHTNESS 127
-#define DEFAULT_BL_NAME "lcd-backlight"
-
-struct lp8788_bl {
- struct lp8788 *lp;
- struct backlight_device *bl_dev;
-};
-
-static int lp8788_backlight_configure(struct lp8788_bl *bl)
-{
- int ret;
- u8 val;
-
- /* Brightness ramp up/down */
- val = (LP8788_RAMP_8192us << LP8788_BL_RAMP_RISE_SHIFT) | LP8788_RAMP_8192us;
- ret = lp8788_write_byte(bl->lp, LP8788_BL_RAMP, val);
- if (ret)
- return ret;
-
- /* Fullscale current setting */
- val = (LP8788_FULLSCALE_1900uA << LP8788_BL_FULLSCALE_SHIFT) |
- (LP8788_DIM_EXPONENTIAL << LP8788_BL_DIM_MODE_SHIFT);
-
- /* Brightness control mode */
- val |= LP8788_BL_EN;
-
- return lp8788_write_byte(bl->lp, LP8788_BL_CONFIG, val);
-}
-
-static int lp8788_bl_update_status(struct backlight_device *bl_dev)
-{
- struct lp8788_bl *bl = bl_get_data(bl_dev);
-
- if (bl_dev->props.state & BL_CORE_SUSPENDED)
- bl_dev->props.brightness = 0;
-
- lp8788_write_byte(bl->lp, LP8788_BL_BRIGHTNESS, bl_dev->props.brightness);
-
- return 0;
-}
-
-static const struct backlight_ops lp8788_bl_ops = {
- .options = BL_CORE_SUSPENDRESUME,
- .update_status = lp8788_bl_update_status,
-};
-
-static int lp8788_backlight_register(struct lp8788_bl *bl)
-{
- struct backlight_device *bl_dev;
- struct backlight_properties props;
-
- memset(&props, 0, sizeof(struct backlight_properties));
- props.type = BACKLIGHT_PLATFORM;
- props.max_brightness = MAX_BRIGHTNESS;
-
- /* Initial brightness */
- props.brightness = 0;
-
- /* Backlight device name */
- bl_dev = backlight_device_register(DEFAULT_BL_NAME, bl->lp->dev, bl,
- &lp8788_bl_ops, &props);
- if (IS_ERR(bl_dev))
- return PTR_ERR(bl_dev);
-
- bl->bl_dev = bl_dev;
-
- return 0;
-}
-
-static void lp8788_backlight_unregister(struct lp8788_bl *bl)
-{
- struct backlight_device *bl_dev = bl->bl_dev;
-
- backlight_device_unregister(bl_dev);
-}
-
-static ssize_t lp8788_get_bl_ctl_mode(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- const char *strmode = "Register based";
-
- return scnprintf(buf, PAGE_SIZE, "%s\n", strmode);
-}
-
-static DEVICE_ATTR(bl_ctl_mode, S_IRUGO, lp8788_get_bl_ctl_mode, NULL);
-
-static struct attribute *lp8788_attributes[] = {
- &dev_attr_bl_ctl_mode.attr,
- NULL,
-};
-
-static const struct attribute_group lp8788_attr_group = {
- .attrs = lp8788_attributes,
-};
-
-static int lp8788_backlight_probe(struct platform_device *pdev)
-{
- struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
- struct lp8788_bl *bl;
- int ret;
-
- bl = devm_kzalloc(lp->dev, sizeof(struct lp8788_bl), GFP_KERNEL);
- if (!bl)
- return -ENOMEM;
-
- bl->lp = lp;
-
- platform_set_drvdata(pdev, bl);
-
- ret = lp8788_backlight_configure(bl);
- if (ret) {
- dev_err(lp->dev, "backlight config err: %d\n", ret);
- goto err_dev;
- }
-
- ret = lp8788_backlight_register(bl);
- if (ret) {
- dev_err(lp->dev, "register backlight err: %d\n", ret);
- goto err_dev;
- }
-
- ret = sysfs_create_group(&pdev->dev.kobj, &lp8788_attr_group);
- if (ret) {
- dev_err(lp->dev, "register sysfs err: %d\n", ret);
- goto err_sysfs;
- }
-
- backlight_update_status(bl->bl_dev);
-
- return 0;
-
-err_sysfs:
- lp8788_backlight_unregister(bl);
-err_dev:
- return ret;
-}
-
-static void lp8788_backlight_remove(struct platform_device *pdev)
-{
- struct lp8788_bl *bl = platform_get_drvdata(pdev);
- struct backlight_device *bl_dev = bl->bl_dev;
-
- bl_dev->props.brightness = 0;
- backlight_update_status(bl_dev);
- sysfs_remove_group(&pdev->dev.kobj, &lp8788_attr_group);
- lp8788_backlight_unregister(bl);
-}
-
-static struct platform_driver lp8788_bl_driver = {
- .probe = lp8788_backlight_probe,
- .remove = lp8788_backlight_remove,
- .driver = {
- .name = LP8788_DEV_BACKLIGHT,
- },
-};
-module_platform_driver(lp8788_bl_driver);
-
-MODULE_DESCRIPTION("Texas Instruments LP8788 Backlight Driver");
-MODULE_AUTHOR("Milo Kim");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:lp8788-backlight");
diff --git a/include/linux/mfd/lp8788-isink.h b/include/linux/mfd/lp8788-isink.h
deleted file mode 100644
index 464dc4c937e4..000000000000
--- a/include/linux/mfd/lp8788-isink.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * TI LP8788 MFD - common definitions for current sinks
- *
- * Copyright 2012 Texas Instruments
- *
- * Author: Milo(Woogyom) Kim <milo.kim@xxxxxx>
- */
-
-#ifndef __ISINK_LP8788_H__
-#define __ISINK_LP8788_H__
-
-/* register address */
-#define LP8788_ISINK_CTRL 0x99
-#define LP8788_ISINK12_IOUT 0x9A
-#define LP8788_ISINK3_IOUT 0x9B
-#define LP8788_ISINK1_PWM 0x9C
-#define LP8788_ISINK2_PWM 0x9D
-#define LP8788_ISINK3_PWM 0x9E
-
-/* mask bits */
-#define LP8788_ISINK1_IOUT_M 0x0F /* Addr 9Ah */
-#define LP8788_ISINK2_IOUT_M 0xF0
-#define LP8788_ISINK3_IOUT_M 0x0F /* Addr 9Bh */
-
-/* 6 bits used for PWM code : Addr 9C ~ 9Eh */
-#define LP8788_ISINK_MAX_PWM 63
-#define LP8788_ISINK_SCALE_OFFSET 3
-
-static const u8 lp8788_iout_addr[] = {
- LP8788_ISINK12_IOUT,
- LP8788_ISINK12_IOUT,
- LP8788_ISINK3_IOUT,
-};
-
-static const u8 lp8788_iout_mask[] = {
- LP8788_ISINK1_IOUT_M,
- LP8788_ISINK2_IOUT_M,
- LP8788_ISINK3_IOUT_M,
-};
-
-static const u8 lp8788_pwm_addr[] = {
- LP8788_ISINK1_PWM,
- LP8788_ISINK2_PWM,
- LP8788_ISINK3_PWM,
-};
-
-#endif
diff --git a/include/linux/mfd/lp8788.h b/include/linux/mfd/lp8788.h
deleted file mode 100644
index fd17bec2a33e..000000000000
--- a/include/linux/mfd/lp8788.h
+++ /dev/null
@@ -1,289 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * TI LP8788 MFD Device
- *
- * Copyright 2012 Texas Instruments
- *
- * Author: Milo(Woogyom) Kim <milo.kim@xxxxxx>
- */
-
-#ifndef __MFD_LP8788_H__
-#define __MFD_LP8788_H__
-
-#include <linux/irqdomain.h>
-#include <linux/regmap.h>
-
-#define LP8788_DEV_BUCK "lp8788-buck"
-#define LP8788_DEV_DLDO "lp8788-dldo"
-#define LP8788_DEV_ALDO "lp8788-aldo"
-#define LP8788_DEV_CHARGER "lp8788-charger"
-#define LP8788_DEV_RTC "lp8788-rtc"
-#define LP8788_DEV_BACKLIGHT "lp8788-backlight"
-#define LP8788_DEV_VIBRATOR "lp8788-vibrator"
-#define LP8788_DEV_KEYLED "lp8788-keyled"
-#define LP8788_DEV_ADC "lp8788-adc"
-
-#define LP8788_NUM_BUCKS 4
-#define LP8788_NUM_DLDOS 12
-#define LP8788_NUM_ALDOS 10
-#define LP8788_NUM_BUCK2_DVS 2
-
-#define LP8788_CHG_IRQ "CHG_IRQ"
-#define LP8788_PRSW_IRQ "PRSW_IRQ"
-#define LP8788_BATT_IRQ "BATT_IRQ"
-#define LP8788_ALM_IRQ "ALARM_IRQ"
-
-enum lp8788_int_id {
- /* interrup register 1 : Addr 00h */
- LP8788_INT_TSDL,
- LP8788_INT_TSDH,
- LP8788_INT_UVLO,
- LP8788_INT_FLAGMON,
- LP8788_INT_PWRON_TIME,
- LP8788_INT_PWRON,
- LP8788_INT_COMP1,
- LP8788_INT_COMP2,
-
- /* interrupt register 2 : Addr 01h */
- LP8788_INT_CHG_INPUT_STATE,
- LP8788_INT_CHG_STATE,
- LP8788_INT_EOC,
- LP8788_INT_CHG_RESTART,
- LP8788_INT_RESTART_TIMEOUT,
- LP8788_INT_FULLCHG_TIMEOUT,
- LP8788_INT_PRECHG_TIMEOUT,
-
- /* interrupt register 3 : Addr 02h */
- LP8788_INT_RTC_ALARM1 = 17,
- LP8788_INT_RTC_ALARM2,
- LP8788_INT_ENTER_SYS_SUPPORT,
- LP8788_INT_EXIT_SYS_SUPPORT,
- LP8788_INT_BATT_LOW,
- LP8788_INT_NO_BATT,
-
- LP8788_INT_MAX = 24,
-};
-
-enum lp8788_dvs_sel {
- DVS_SEL_V0,
- DVS_SEL_V1,
- DVS_SEL_V2,
- DVS_SEL_V3,
-};
-
-enum lp8788_ext_ldo_en_id {
- EN_ALDO1,
- EN_ALDO234,
- EN_ALDO5,
- EN_ALDO7,
- EN_DLDO7,
- EN_DLDO911,
- EN_LDOS_MAX,
-};
-
-enum lp8788_charger_event {
- NO_CHARGER,
- CHARGER_DETECTED,
-};
-
-enum lp8788_bl_dim_mode {
- LP8788_DIM_EXPONENTIAL,
- LP8788_DIM_LINEAR,
-};
-
-enum lp8788_bl_full_scale_current {
- LP8788_FULLSCALE_5000uA,
- LP8788_FULLSCALE_8500uA,
- LP8788_FULLSCALE_1200uA,
- LP8788_FULLSCALE_1550uA,
- LP8788_FULLSCALE_1900uA,
- LP8788_FULLSCALE_2250uA,
- LP8788_FULLSCALE_2600uA,
- LP8788_FULLSCALE_2950uA,
-};
-
-enum lp8788_bl_ramp_step {
- LP8788_RAMP_8us,
- LP8788_RAMP_1024us,
- LP8788_RAMP_2048us,
- LP8788_RAMP_4096us,
- LP8788_RAMP_8192us,
- LP8788_RAMP_16384us,
- LP8788_RAMP_32768us,
- LP8788_RAMP_65538us,
-};
-
-enum lp8788_isink_scale {
- LP8788_ISINK_SCALE_100mA,
- LP8788_ISINK_SCALE_120mA,
-};
-
-enum lp8788_isink_number {
- LP8788_ISINK_1,
- LP8788_ISINK_2,
- LP8788_ISINK_3,
-};
-
-enum lp8788_alarm_sel {
- LP8788_ALARM_1,
- LP8788_ALARM_2,
- LP8788_ALARM_MAX,
-};
-
-enum lp8788_adc_id {
- LPADC_VBATT_5P5,
- LPADC_VIN_CHG,
- LPADC_IBATT,
- LPADC_IC_TEMP,
- LPADC_VBATT_6P0,
- LPADC_VBATT_5P0,
- LPADC_ADC1,
- LPADC_ADC2,
- LPADC_VDD,
- LPADC_VCOIN,
- LPADC_VDD_LDO,
- LPADC_ADC3,
- LPADC_ADC4,
- LPADC_MAX,
-};
-
-struct lp8788;
-
-/*
- * lp8788_buck1_dvs
- * @vsel : dvs selector for buck v1 register
- */
-struct lp8788_buck1_dvs {
- enum lp8788_dvs_sel vsel;
-};
-
-/*
- * lp8788_buck2_dvs
- * @vsel : dvs selector for buck v2 register
- */
-struct lp8788_buck2_dvs {
- enum lp8788_dvs_sel vsel;
-};
-
-/*
- * struct lp8788_chg_param
- * @addr : charging control register address (range : 0x11 ~ 0x1C)
- * @val : charging parameter value
- */
-struct lp8788_chg_param {
- u8 addr;
- u8 val;
-};
-
-/*
- * struct lp8788_charger_platform_data
- * @adc_vbatt : adc channel name for battery voltage
- * @adc_batt_temp : adc channel name for battery temperature
- * @max_vbatt_mv : used for calculating battery capacity
- * @chg_params : initial charging parameters
- * @num_chg_params : numbers of charging parameters
- * @charger_event : the charger event can be reported to the platform side
- */
-struct lp8788_charger_platform_data {
- const char *adc_vbatt;
- const char *adc_batt_temp;
- unsigned int max_vbatt_mv;
- struct lp8788_chg_param *chg_params;
- int num_chg_params;
- void (*charger_event) (struct lp8788 *lp,
- enum lp8788_charger_event event);
-};
-
-/*
- * struct lp8788_led_platform_data
- * @name : led driver name. (default: "keyboard-backlight")
- * @scale : current scale
- * @num : current sink number
- * @iout_code : current output value (Addr 9Ah ~ 9Bh)
- */
-struct lp8788_led_platform_data {
- char *name;
- enum lp8788_isink_scale scale;
- enum lp8788_isink_number num;
- int iout_code;
-};
-
-/*
- * struct lp8788_vib_platform_data
- * @name : vibrator driver name
- * @scale : current scale
- * @num : current sink number
- * @iout_code : current output value (Addr 9Ah ~ 9Bh)
- * @pwm_code : PWM code value (Addr 9Ch ~ 9Eh)
- */
-struct lp8788_vib_platform_data {
- char *name;
- enum lp8788_isink_scale scale;
- enum lp8788_isink_number num;
- int iout_code;
- int pwm_code;
-};
-
-/*
- * struct lp8788_platform_data
- * @init_func : used for initializing registers
- * before mfd driver is registered
- * @buck_data : regulator initial data for buck
- * @dldo_data : regulator initial data for digital ldo
- * @aldo_data : regulator initial data for analog ldo
- * @buck1_dvs : configurations for buck1 dvs
- * @buck2_dvs : configurations for buck2 dvs
- * @chg_pdata : platform data for charger driver
- * @alarm_sel : rtc alarm selection (1 or 2)
- * @led_pdata : configurable data for led driver
- * @vib_pdata : configurable data for vibrator driver
- * @adc_pdata : iio map data for adc driver
- */
-struct lp8788_platform_data {
- /* general system information */
- int (*init_func) (struct lp8788 *lp);
-
- /* regulators */
- struct regulator_init_data *buck_data[LP8788_NUM_BUCKS];
- struct regulator_init_data *dldo_data[LP8788_NUM_DLDOS];
- struct regulator_init_data *aldo_data[LP8788_NUM_ALDOS];
- struct lp8788_buck1_dvs *buck1_dvs;
- struct lp8788_buck2_dvs *buck2_dvs;
-
- /* charger */
- struct lp8788_charger_platform_data *chg_pdata;
-
- /* rtc alarm */
- enum lp8788_alarm_sel alarm_sel;
-
- /* current sinks */
- struct lp8788_led_platform_data *led_pdata;
- struct lp8788_vib_platform_data *vib_pdata;
-
- /* adc iio map data */
- struct iio_map *adc_pdata;
-};
-
-/*
- * struct lp8788
- * @dev : parent device pointer
- * @regmap : used for i2c communcation on accessing registers
- * @irqdm : interrupt domain for handling nested interrupt
- * @irq : pin number of IRQ_N
- * @pdata : lp8788 platform specific data
- */
-struct lp8788 {
- struct device *dev;
- struct regmap *regmap;
- struct irq_domain *irqdm;
- int irq;
- struct lp8788_platform_data *pdata;
-};
-
-int lp8788_irq_init(struct lp8788 *lp, int chip_irq);
-void lp8788_irq_exit(struct lp8788 *lp);
-int lp8788_read_byte(struct lp8788 *lp, u8 reg, u8 *data);
-int lp8788_read_multi_bytes(struct lp8788 *lp, u8 reg, u8 *data, size_t count);
-int lp8788_write_byte(struct lp8788 *lp, u8 reg, u8 data);
-int lp8788_update_bits(struct lp8788 *lp, u8 reg, u8 mask, u8 data);
-#endif
--
2.53.0