linux-watchdog.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/9] Drop ROHM BD70528 support
@ 2021-05-25 10:13 Matti Vaittinen
  2021-05-25 10:13 ` [PATCH 1/9] dt-bindings: mfd: regulator: Drop " Matti Vaittinen
                   ` (9 more replies)
  0 siblings, 10 replies; 20+ messages in thread
From: Matti Vaittinen @ 2021-05-25 10:13 UTC (permalink / raw)
  To: Matti Vaittinen, Matti Vaittinen
  Cc: Lee Jones, Rob Herring, Liam Girdwood, Mark Brown,
	Michael Turquette, Stephen Boyd, Matti Vaittinen, Linus Walleij,
	Bartosz Golaszewski, Sebastian Reichel, Alessandro Zummo,
	Alexandre Belloni, Wim Van Sebroeck, Guenter Roeck, devicetree,
	linux-kernel, linux-clk, linux-power, linux-gpio, linux-pm,
	linux-rtc, linux-watchdog

[-- Attachment #1: Type: text/plain, Size: 4148 bytes --]

Drop ROHM BD70528 support

Unfortunately there has not been a big demand for ROHM BD70528
IC. The few users I know control PMIC from separate M4-core,
which is not running Linux. I am not aware of any users of this
Linux driver.

While I did really like this IC and writing the drivers for it,
seems like these drivers are becoming useless burden. So, I see
no point in maintaining them. Let's just drop the drivers if
there is no objections to this series. :(

Few notes:

The GPIO, regulator, power-supply and watchdog drivers should be
only used on BD70528 and depend on the BD70528 MFD Kconfig. I guess
the removal can be independently merged to the respective subsystems.

The BD70528 RTC driver is still used by BD71815 and BD71828 -
but the watchdog-hack can be removed and driver is greatly
simplified. However, it's worth noting that there is dependency
from the BD70528 RTC driver to the header files - thus the
RTC driver changes should be merged before MFD changes. Also the
CLK driver remains in use and needs the BD70528 IC-type.

As a final note - Few improvements/fixes were just applied to the
regulator tree so this series is likely to conflict. Some fixes
were also added to RTC Kconfig - which means also the RTC tree
may have conflicts. Please let me know if you wish me to rebase
this series or those patches.

---

Matti Vaittinen (9):
  dt-bindings: mfd: regulator: Drop BD70528 support
  rtc: bd70528: Drop BD70528 support
  watchdog: bd70528 drop bd70528 support
  regulator: bd70528: Drop BD70528 support
  clk: bd718xx: Drop BD70528 support
  gpio: bd70528 Drop BD70528 support
  power: supply: Drop BD70528 support
  mfd: bd70528: Drop BD70528 support
  MAINTAINERS: bd70528: Drop ROHM BD70528 drivers

 .../bindings/mfd/rohm,bd70528-pmic.txt        | 102 ---
 .../regulator/rohm,bd70528-regulator.txt      |  68 --
 MAINTAINERS                                   |   8 -
 drivers/clk/Kconfig                           |   6 +-
 drivers/clk/clk-bd718x7.c                     |  11 +-
 drivers/gpio/Kconfig                          |  11 -
 drivers/gpio/Makefile                         |   1 -
 drivers/gpio/gpio-bd70528.c                   | 230 ------
 drivers/mfd/Kconfig                           |  17 -
 drivers/mfd/Makefile                          |   1 -
 drivers/mfd/rohm-bd70528.c                    | 314 --------
 drivers/power/supply/Kconfig                  |   9 -
 drivers/power/supply/Makefile                 |   1 -
 drivers/power/supply/bd70528-charger.c        | 710 ------------------
 drivers/regulator/Kconfig                     |  11 -
 drivers/regulator/Makefile                    |   1 -
 drivers/regulator/bd70528-regulator.c         | 283 -------
 drivers/rtc/Kconfig                           |   4 +-
 drivers/rtc/rtc-bd70528.c                     | 316 +-------
 drivers/watchdog/Kconfig                      |  12 -
 drivers/watchdog/Makefile                     |   1 -
 drivers/watchdog/bd70528_wdt.c                | 291 -------
 include/linux/mfd/rohm-bd70528.h              | 391 ----------
 include/linux/mfd/rohm-generic.h              |   1 -
 24 files changed, 18 insertions(+), 2782 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/mfd/rohm,bd70528-pmic.txt
 delete mode 100644 Documentation/devicetree/bindings/regulator/rohm,bd70528-regulator.txt
 delete mode 100644 drivers/gpio/gpio-bd70528.c
 delete mode 100644 drivers/mfd/rohm-bd70528.c
 delete mode 100644 drivers/power/supply/bd70528-charger.c
 delete mode 100644 drivers/regulator/bd70528-regulator.c
 delete mode 100644 drivers/watchdog/bd70528_wdt.c
 delete mode 100644 include/linux/mfd/rohm-bd70528.h


base-commit: c4681547bcce777daf576925a966ffa824edd09d
-- 
2.25.4


-- 
Matti Vaittinen, Linux device drivers
ROHM Semiconductors, Finland SWDC
Kiviharjunlenkki 1E
90220 OULU
FINLAND

~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~
Simon says - in Latin please.
~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~
Thanks to Simon Glass for the translation =] 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 1/9] dt-bindings: mfd: regulator: Drop BD70528 support
  2021-05-25 10:13 [PATCH 0/9] Drop ROHM BD70528 support Matti Vaittinen
@ 2021-05-25 10:13 ` Matti Vaittinen
  2021-05-25 10:14 ` [PATCH 2/9] rtc: bd70528: " Matti Vaittinen
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: Matti Vaittinen @ 2021-05-25 10:13 UTC (permalink / raw)
  To: Matti Vaittinen, Matti Vaittinen
  Cc: Lee Jones, Rob Herring, Liam Girdwood, Mark Brown,
	Michael Turquette, Stephen Boyd, Matti Vaittinen, Linus Walleij,
	Bartosz Golaszewski, Sebastian Reichel, Alessandro Zummo,
	Alexandre Belloni, Wim Van Sebroeck, Guenter Roeck, devicetree,
	linux-kernel, linux-clk, linux-power, linux-gpio, linux-pm,
	linux-rtc, linux-watchdog

[-- Attachment #1: Type: text/plain, Size: 7294 bytes --]

The only known BD70528 use-cases are such that the PMIC is controlled
from separate MCU which is not running Linux. I am not aware of
any Linux driver users. Furthermore, it seems there is no demand for
this IC. Let's ease the maintenance burden and drop the driver. We can
always add it back if there is sudden need for it.

Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>

---
Bah. My heart is bleeding as I personally liked playing with this IC.
Still, It makes no sense to waste the time of you guys by maintaining
something which is not likely to be used. Please let me know if some
of you think the binding is needed.
---
 .../bindings/mfd/rohm,bd70528-pmic.txt        | 102 ------------------
 .../regulator/rohm,bd70528-regulator.txt      |  68 ------------
 2 files changed, 170 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/mfd/rohm,bd70528-pmic.txt
 delete mode 100644 Documentation/devicetree/bindings/regulator/rohm,bd70528-regulator.txt

diff --git a/Documentation/devicetree/bindings/mfd/rohm,bd70528-pmic.txt b/Documentation/devicetree/bindings/mfd/rohm,bd70528-pmic.txt
deleted file mode 100644
index 386eec06cf08..000000000000
--- a/Documentation/devicetree/bindings/mfd/rohm,bd70528-pmic.txt
+++ /dev/null
@@ -1,102 +0,0 @@
-* ROHM BD70528 Power Management Integrated Circuit bindings
-
-BD70528MWV is an ultra-low quiescent current general purpose, single-chip,
-power management IC for battery-powered portable devices. The IC
-integrates 3 ultra-low current consumption buck converters, 3 LDOs and 2
-LED Drivers. Also included are 4 GPIOs, a real-time clock (RTC), a 32kHz
-clock gate, high-accuracy VREF for use with an external ADC, flexible
-dual-input power path, 10 bit SAR ADC for battery temperature monitor and
-1S battery charger with scalable charge currents.
-
-Required properties:
- - compatible		: Should be "rohm,bd70528"
- - reg			: I2C slave address.
- - interrupts		: The interrupt line the device is connected to.
- - interrupt-controller	: To indicate BD70528 acts as an interrupt controller.
- - #interrupt-cells	: Should be 2. Usage is compliant to the 2 cells
-			  variant of ../interrupt-controller/interrupts.txt
- - gpio-controller	: To indicate BD70528 acts as a GPIO controller.
- - #gpio-cells		: Should be 2. The first cell is the pin number and
-			  the second cell is used to specify flags. See
-			  ../gpio/gpio.txt for more information.
- - #clock-cells		: Should be 0.
- - regulators:		: List of child nodes that specify the regulators.
-			  Please see ../regulator/rohm,bd70528-regulator.txt
-
-Optional properties:
- - clock-output-names	: Should contain name for output clock.
-
-Example:
-/* External oscillator */
-osc: oscillator {
-	compatible = "fixed-clock";
-	#clock-cells = <1>;
-	clock-frequency  = <32768>;
-	clock-output-names = "osc";
-};
-
-pmic: pmic@4b {
-	compatible = "rohm,bd70528";
-	reg = <0x4b>;
-	interrupt-parent = <&gpio1>;
-	interrupts = <29 IRQ_TYPE_LEVEL_LOW>;
-	clocks = <&osc 0>;
-	#clock-cells = <0>;
-	clock-output-names = "bd70528-32k-out";
-	#gpio-cells = <2>;
-	gpio-controller;
-	interrupt-controller;
-	#interrupt-cells = <2>;
-
-	regulators {
-		buck1: BUCK1 {
-			regulator-name = "buck1";
-			regulator-min-microvolt = <1200000>;
-			regulator-max-microvolt = <3400000>;
-			regulator-boot-on;
-			regulator-ramp-delay = <125>;
-		};
-		buck2: BUCK2 {
-			regulator-name = "buck2";
-			regulator-min-microvolt = <1200000>;
-			regulator-max-microvolt = <3300000>;
-			regulator-boot-on;
-			regulator-ramp-delay = <125>;
-		};
-		buck3: BUCK3 {
-			regulator-name = "buck3";
-			regulator-min-microvolt = <800000>;
-			regulator-max-microvolt = <1800000>;
-			regulator-boot-on;
-			regulator-ramp-delay = <250>;
-		};
-		ldo1: LDO1 {
-			regulator-name = "ldo1";
-			regulator-min-microvolt = <1650000>;
-			regulator-max-microvolt = <3300000>;
-			regulator-boot-on;
-		};
-		ldo2: LDO2 {
-			regulator-name = "ldo2";
-			regulator-min-microvolt = <1650000>;
-			regulator-max-microvolt = <3300000>;
-			regulator-boot-on;
-		};
-
-		ldo3: LDO3 {
-			regulator-name = "ldo3";
-			regulator-min-microvolt = <1650000>;
-			regulator-max-microvolt = <3300000>;
-		};
-		led_ldo1: LED_LDO1 {
-			regulator-name = "led_ldo1";
-			regulator-min-microvolt = <200000>;
-			regulator-max-microvolt = <300000>;
-		};
-		led_ldo2: LED_LDO2 {
-			regulator-name = "led_ldo2";
-			regulator-min-microvolt = <200000>;
-			regulator-max-microvolt = <300000>;
-		};
-	};
-};
diff --git a/Documentation/devicetree/bindings/regulator/rohm,bd70528-regulator.txt b/Documentation/devicetree/bindings/regulator/rohm,bd70528-regulator.txt
deleted file mode 100644
index 698cfc3bc3dd..000000000000
--- a/Documentation/devicetree/bindings/regulator/rohm,bd70528-regulator.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-ROHM BD70528 Power Management Integrated Circuit regulator bindings
-
-Required properties:
- - regulator-name: should be "buck1", "buck2", "buck3", "ldo1", "ldo2", "ldo3",
-		   "led_ldo1", "led_ldo2"
-
-List of regulators provided by this controller. BD70528 regulators node
-should be sub node of the BD70528 MFD node. See BD70528 MFD bindings at
-Documentation/devicetree/bindings/mfd/rohm,bd70528-pmic.txt
-
-The valid names for BD70528 regulator nodes are:
-BUCK1, BUCK2, BUCK3, LDO1, LDO2, LDO3, LED_LDO1, LED_LDO2
-
-Optional properties:
-- Any optional property defined in bindings/regulator/regulator.txt
-
-Example:
-regulators {
-	buck1: BUCK1 {
-		regulator-name = "buck1";
-		regulator-min-microvolt = <1200000>;
-		regulator-max-microvolt = <3400000>;
-		regulator-boot-on;
-		regulator-ramp-delay = <125>;
-	};
-	buck2: BUCK2 {
-		regulator-name = "buck2";
-		regulator-min-microvolt = <1200000>;
-		regulator-max-microvolt = <3300000>;
-		regulator-boot-on;
-		regulator-ramp-delay = <125>;
-	};
-	buck3: BUCK3 {
-		regulator-name = "buck3";
-		regulator-min-microvolt = <800000>;
-		regulator-max-microvolt = <1800000>;
-		regulator-boot-on;
-		regulator-ramp-delay = <250>;
-	};
-	ldo1: LDO1 {
-		regulator-name = "ldo1";
-		regulator-min-microvolt = <1650000>;
-		regulator-max-microvolt = <3300000>;
-		regulator-boot-on;
-	};
-	ldo2: LDO2 {
-		regulator-name = "ldo2";
-		regulator-min-microvolt = <1650000>;
-		regulator-max-microvolt = <3300000>;
-		regulator-boot-on;
-	};
-
-	ldo3: LDO3 {
-		regulator-name = "ldo3";
-		regulator-min-microvolt = <1650000>;
-		regulator-max-microvolt = <3300000>;
-	};
-	led_ldo1: LED_LDO1 {
-		regulator-name = "led_ldo1";
-		regulator-min-microvolt = <200000>;
-		regulator-max-microvolt = <300000>;
-	};
-	led_ldo2: LED_LDO2 {
-		regulator-name = "led_ldo2";
-		regulator-min-microvolt = <200000>;
-		regulator-max-microvolt = <300000>;
-	};
-};
-- 
2.25.4


-- 
Matti Vaittinen, Linux device drivers
ROHM Semiconductors, Finland SWDC
Kiviharjunlenkki 1E
90220 OULU
FINLAND

~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~
Simon says - in Latin please.
~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~
Thanks to Simon Glass for the translation =] 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 2/9] rtc: bd70528: Drop BD70528 support
  2021-05-25 10:13 [PATCH 0/9] Drop ROHM BD70528 support Matti Vaittinen
  2021-05-25 10:13 ` [PATCH 1/9] dt-bindings: mfd: regulator: Drop " Matti Vaittinen
@ 2021-05-25 10:14 ` Matti Vaittinen
  2021-05-25 11:47   ` Alexandre Belloni
  2021-05-25 10:14 ` [PATCH 3/9] watchdog: bd70528 drop bd70528 support Matti Vaittinen
                   ` (7 subsequent siblings)
  9 siblings, 1 reply; 20+ messages in thread
From: Matti Vaittinen @ 2021-05-25 10:14 UTC (permalink / raw)
  To: Matti Vaittinen, Matti Vaittinen
  Cc: Lee Jones, Rob Herring, Liam Girdwood, Mark Brown,
	Michael Turquette, Stephen Boyd, Matti Vaittinen, Linus Walleij,
	Bartosz Golaszewski, Sebastian Reichel, Alessandro Zummo,
	Alexandre Belloni, Wim Van Sebroeck, Guenter Roeck, devicetree,
	linux-kernel, linux-clk, linux-power, linux-gpio, linux-pm,
	linux-rtc, linux-watchdog

[-- Attachment #1: Type: text/plain, Size: 14142 bytes --]

The only known BD70528 use-cases are such that the PMIC is controlled
from separate MCU which is not running Linux. I am not aware of
any Linux driver users. Furthermore, it seems there is no demand for
this IC. Let's ease the maintenance burden and drop the driver. We can
always add it back if there is sudden need for it.

Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>

---
My heart is a bit less bleeding when I see how much simpler this RTC
driver became..
Please let me know if some of you think the driver is needed.
---
 drivers/rtc/Kconfig       |   4 +-
 drivers/rtc/rtc-bd70528.c | 316 ++------------------------------------
 2 files changed, 13 insertions(+), 307 deletions(-)

diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index d8c13fded164..398899217626 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -502,10 +502,10 @@ config RTC_DRV_M41T80_WDT
 
 config RTC_DRV_BD70528
 	tristate "ROHM BD70528, BD71815 and BD71828 PMIC RTC"
-	depends on MFD_ROHM_BD71828 || MFD_ROHM_BD70528 && (BD70528_WATCHDOG || !BD70528_WATCHDOG)
+	depends on MFD_ROHM_BD71828
 	help
 	  If you say Y here you will get support for the RTC
-	  block on ROHM BD70528, BD71815 and BD71828 Power Management IC.
+	  block on ROHM BD71815 and BD71828 Power Management IC.
 
 	  This driver can also be built as a module. If so, the module
 	  will be called rtc-bd70528.
diff --git a/drivers/rtc/rtc-bd70528.c b/drivers/rtc/rtc-bd70528.c
index 6454afca02a6..59b627fc1ecf 100644
--- a/drivers/rtc/rtc-bd70528.c
+++ b/drivers/rtc/rtc-bd70528.c
@@ -2,10 +2,9 @@
 //
 // Copyright (C) 2018 ROHM Semiconductors
 //
-// RTC driver for ROHM BD70528 PMIC
+// RTC driver for ROHM BD71828 and BD71815 PMIC
 
 #include <linux/bcd.h>
-#include <linux/mfd/rohm-bd70528.h>
 #include <linux/mfd/rohm-bd71815.h>
 #include <linux/mfd/rohm-bd71828.h>
 #include <linux/module.h>
@@ -39,11 +38,6 @@ struct bd70528_rtc_data {
 	u8 year;
 } __packed;
 
-struct bd70528_rtc_wake {
-	struct bd70528_rtc_day time;
-	u8 ctrl;
-} __packed;
-
 struct bd71828_rtc_alm {
 	struct bd70528_rtc_data alm0;
 	struct bd70528_rtc_data alm1;
@@ -51,141 +45,14 @@ struct bd71828_rtc_alm {
 	u8 alm1_mask;
 } __packed;
 
-struct bd70528_rtc_alm {
-	struct bd70528_rtc_data data;
-	u8 alm_mask;
-	u8 alm_repeat;
-} __packed;
-
 struct bd70528_rtc {
 	struct rohm_regmap_dev *parent;
 	struct regmap *regmap;
 	struct device *dev;
 	u8 reg_time_start;
 	u8 bd718xx_alm_block_start;
-	bool has_rtc_timers;
 };
 
-static int bd70528_set_wake(struct rohm_regmap_dev *bd70528,
-			    int enable, int *old_state)
-{
-	int ret;
-	unsigned int ctrl_reg;
-
-	ret = regmap_read(bd70528->regmap, BD70528_REG_WAKE_EN, &ctrl_reg);
-	if (ret)
-		return ret;
-
-	if (old_state) {
-		if (ctrl_reg & BD70528_MASK_WAKE_EN)
-			*old_state |= BD70528_WAKE_STATE_BIT;
-		else
-			*old_state &= ~BD70528_WAKE_STATE_BIT;
-
-		if (!enable == !(*old_state & BD70528_WAKE_STATE_BIT))
-			return 0;
-	}
-
-	if (enable)
-		ctrl_reg |= BD70528_MASK_WAKE_EN;
-	else
-		ctrl_reg &= ~BD70528_MASK_WAKE_EN;
-
-	return regmap_write(bd70528->regmap, BD70528_REG_WAKE_EN,
-			    ctrl_reg);
-}
-
-static int bd70528_set_elapsed_tmr(struct rohm_regmap_dev *bd70528,
-				   int enable, int *old_state)
-{
-	int ret;
-	unsigned int ctrl_reg;
-
-	/*
-	 * TBD
-	 * What is the purpose of elapsed timer ?
-	 * Is the timeout registers counting down, or is the disable - re-enable
-	 * going to restart the elapsed-time counting? If counting is restarted
-	 * the timeout should be decreased by the amount of time that has
-	 * elapsed since starting the timer. Maybe we should store the monotonic
-	 * clock value when timer is started so that if RTC is set while timer
-	 * is armed we could do the compensation. This is a hack if RTC/system
-	 * clk are drifting. OTOH, RTC controlled via I2C is in any case
-	 * inaccurate...
-	 */
-	ret = regmap_read(bd70528->regmap, BD70528_REG_ELAPSED_TIMER_EN,
-			  &ctrl_reg);
-	if (ret)
-		return ret;
-
-	if (old_state) {
-		if (ctrl_reg & BD70528_MASK_ELAPSED_TIMER_EN)
-			*old_state |= BD70528_ELAPSED_STATE_BIT;
-		else
-			*old_state &= ~BD70528_ELAPSED_STATE_BIT;
-
-		if ((!enable) == (!(*old_state & BD70528_ELAPSED_STATE_BIT)))
-			return 0;
-	}
-
-	if (enable)
-		ctrl_reg |= BD70528_MASK_ELAPSED_TIMER_EN;
-	else
-		ctrl_reg &= ~BD70528_MASK_ELAPSED_TIMER_EN;
-
-	return regmap_write(bd70528->regmap, BD70528_REG_ELAPSED_TIMER_EN,
-			    ctrl_reg);
-}
-
-static int bd70528_set_rtc_based_timers(struct bd70528_rtc *r, int new_state,
-					int *old_state)
-{
-	int ret;
-
-	ret = bd70528_wdt_set(r->parent, new_state & BD70528_WDT_STATE_BIT,
-			      old_state);
-	if (ret) {
-		dev_err(r->dev,
-			"Failed to disable WDG for RTC setting (%d)\n", ret);
-		return ret;
-	}
-	ret = bd70528_set_elapsed_tmr(r->parent,
-				      new_state & BD70528_ELAPSED_STATE_BIT,
-				      old_state);
-	if (ret) {
-		dev_err(r->dev,
-			"Failed to disable 'elapsed timer' for RTC setting\n");
-		return ret;
-	}
-	ret = bd70528_set_wake(r->parent, new_state & BD70528_WAKE_STATE_BIT,
-			       old_state);
-	if (ret) {
-		dev_err(r->dev,
-			"Failed to disable 'wake timer' for RTC setting\n");
-		return ret;
-	}
-
-	return ret;
-}
-
-static int bd70528_re_enable_rtc_based_timers(struct bd70528_rtc *r,
-					      int old_state)
-{
-	if (!r->has_rtc_timers)
-		return 0;
-
-	return bd70528_set_rtc_based_timers(r, old_state, NULL);
-}
-
-static int bd70528_disable_rtc_based_timers(struct bd70528_rtc *r,
-					    int *old_state)
-{
-	if (!r->has_rtc_timers)
-		return 0;
-
-	return bd70528_set_rtc_based_timers(r, 0, old_state);
-}
-
 static inline void tmday2rtc(struct rtc_time *t, struct bd70528_rtc_day *d)
 {
 	d->sec &= ~BD70528_MASK_RTC_SEC;
@@ -267,52 +134,6 @@ static int bd71828_set_alarm(struct device *dev, struct rtc_wkalrm *a)
 
 }
 
-static int bd70528_set_alarm(struct device *dev, struct rtc_wkalrm *a)
-{
-	struct bd70528_rtc_wake wake;
-	struct bd70528_rtc_alm alm;
-	int ret;
-	struct bd70528_rtc *r = dev_get_drvdata(dev);
-
-	ret = regmap_bulk_read(r->regmap, BD70528_REG_RTC_WAKE_START, &wake,
-			       sizeof(wake));
-	if (ret) {
-		dev_err(dev, "Failed to read wake regs\n");
-		return ret;
-	}
-
-	ret = regmap_bulk_read(r->regmap, BD70528_REG_RTC_ALM_START, &alm,
-			       sizeof(alm));
-	if (ret) {
-		dev_err(dev, "Failed to read alarm regs\n");
-		return ret;
-	}
-
-	tm2rtc(&a->time, &alm.data);
-	tmday2rtc(&a->time, &wake.time);
-
-	if (a->enabled) {
-		alm.alm_mask &= ~BD70528_MASK_ALM_EN;
-		wake.ctrl |= BD70528_MASK_WAKE_EN;
-	} else {
-		alm.alm_mask |= BD70528_MASK_ALM_EN;
-		wake.ctrl &= ~BD70528_MASK_WAKE_EN;
-	}
-
-	ret = regmap_bulk_write(r->regmap, BD70528_REG_RTC_WAKE_START, &wake,
-				sizeof(wake));
-	if (ret) {
-		dev_err(dev, "Failed to set wake time\n");
-		return ret;
-	}
-	ret = regmap_bulk_write(r->regmap, BD70528_REG_RTC_ALM_START, &alm,
-				sizeof(alm));
-	if (ret)
-		dev_err(dev, "Failed to set alarm time\n");
-
-	return ret;
-}
-
 static int bd71828_read_alarm(struct device *dev, struct rtc_wkalrm *a)
 {
 	int ret;
@@ -336,78 +157,28 @@ static int bd71828_read_alarm(struct device *dev, struct rtc_wkalrm *a)
 	return 0;
 }
 
-static int bd70528_read_alarm(struct device *dev, struct rtc_wkalrm *a)
+static int bd71828_set_time(struct device *dev, struct rtc_time *t)
 {
-	struct bd70528_rtc_alm alm;
 	int ret;
-	struct bd70528_rtc *r = dev_get_drvdata(dev);
-
-	ret = regmap_bulk_read(r->regmap, BD70528_REG_RTC_ALM_START, &alm,
-			       sizeof(alm));
-	if (ret) {
-		dev_err(dev, "Failed to read alarm regs\n");
-		return ret;
-	}
-
-	rtc2tm(&alm.data, &a->time);
-	a->time.tm_mday = -1;
-	a->time.tm_mon = -1;
-	a->time.tm_year = -1;
-	a->enabled = !(alm.alm_mask & BD70528_MASK_ALM_EN);
-	a->pending = 0;
-
-	return 0;
-}
-
-static int bd70528_set_time_locked(struct device *dev, struct rtc_time *t)
-{
-	int ret, tmpret, old_states;
 	struct bd70528_rtc_data rtc_data;
 	struct bd70528_rtc *r = dev_get_drvdata(dev);
 
-	ret = bd70528_disable_rtc_based_timers(r, &old_states);
-	if (ret)
-		return ret;
-
-	tmpret = regmap_bulk_read(r->regmap, r->reg_time_start, &rtc_data,
-				  sizeof(rtc_data));
-	if (tmpret) {
+	ret = regmap_bulk_read(r->regmap, r->reg_time_start, &rtc_data,
+			       sizeof(rtc_data));
+	if (ret) {
 		dev_err(dev, "Failed to read RTC time registers\n");
-		goto renable_out;
+		return ret;
 	}
 	tm2rtc(t, &rtc_data);
 
-	tmpret = regmap_bulk_write(r->regmap, r->reg_time_start, &rtc_data,
-				   sizeof(rtc_data));
-	if (tmpret) {
+	ret = regmap_bulk_write(r->regmap, r->reg_time_start, &rtc_data,
+				sizeof(rtc_data));
+	if (ret)
 		dev_err(dev, "Failed to set RTC time\n");
-		goto renable_out;
-	}
-
-renable_out:
-	ret = bd70528_re_enable_rtc_based_timers(r, old_states);
-	if (tmpret)
-		ret = tmpret;
 
 	return ret;
 }
 
-static int bd71828_set_time(struct device *dev, struct rtc_time *t)
-{
-	return bd70528_set_time_locked(dev, t);
-}
-
-static int bd70528_set_time(struct device *dev, struct rtc_time *t)
-{
-	int ret;
-	struct bd70528_rtc *r = dev_get_drvdata(dev);
-
-	bd70528_wdt_lock(r->parent);
-	ret = bd70528_set_time_locked(dev, t);
-	bd70528_wdt_unlock(r->parent);
-	return ret;
-}
-
 static int bd70528_get_time(struct device *dev, struct rtc_time *t)
 {
 	struct bd70528_rtc *r = dev_get_drvdata(dev);
@@ -427,31 +198,6 @@ static int bd70528_get_time(struct device *dev, struct rtc_time *t)
 	return 0;
 }
 
-static int bd70528_alm_enable(struct device *dev, unsigned int enabled)
-{
-	int ret;
-	unsigned int enableval = BD70528_MASK_ALM_EN;
-	struct bd70528_rtc *r = dev_get_drvdata(dev);
-
-	if (enabled)
-		enableval = 0;
-
-	bd70528_wdt_lock(r->parent);
-	ret = bd70528_set_wake(r->parent, enabled, NULL);
-	if (ret) {
-		dev_err(dev, "Failed to change wake state\n");
-		goto out_unlock;
-	}
-	ret = regmap_update_bits(r->regmap, BD70528_REG_RTC_ALM_MASK,
-				 BD70528_MASK_ALM_EN, enableval);
-	if (ret)
-		dev_err(dev, "Failed to change alarm state\n");
-
-out_unlock:
-	bd70528_wdt_unlock(r->parent);
-	return ret;
-}
-
 static int bd71828_alm_enable(struct device *dev, unsigned int enabled)
 {
 	int ret;
@@ -470,14 +216,6 @@ static int bd71828_alm_enable(struct device *dev, unsigned int enabled)
 	return ret;
 }
 
-static const struct rtc_class_ops bd70528_rtc_ops = {
-	.read_time		= bd70528_get_time,
-	.set_time		= bd70528_set_time,
-	.read_alarm		= bd70528_read_alarm,
-	.set_alarm		= bd70528_set_alarm,
-	.alarm_irq_enable	= bd70528_alm_enable,
-};
-
 static const struct rtc_class_ops bd71828_rtc_ops = {
 	.read_time		= bd70528_get_time,
 	.set_time		= bd71828_set_time,
@@ -503,7 +241,6 @@ static int bd70528_probe(struct platform_device *pdev)
 	struct rtc_device *rtc;
 	int irq;
 	unsigned int hr;
-	bool enable_main_irq = false;
 	u8 hour_reg;
 	enum rohm_chip_type chip = platform_get_device_id(pdev)->driver_data;
 
@@ -518,21 +255,9 @@ static int bd70528_probe(struct platform_device *pdev)
 	}
 
 	bd_rtc->dev = &pdev->dev;
+	rtc_ops = &bd71828_rtc_ops;
 
 	switch (chip) {
-	case ROHM_CHIP_TYPE_BD70528:
-		bd_rtc->parent = dev_get_drvdata(pdev->dev.parent);
-		if (!bd_rtc->parent) {
-			dev_err(&pdev->dev, "No MFD data\n");
-			return -EINVAL;
-		}
-		irq_name = "bd70528-rtc-alm";
-		bd_rtc->has_rtc_timers = true;
-		bd_rtc->reg_time_start = BD70528_REG_RTC_START;
-		hour_reg = BD70528_REG_RTC_HOUR;
-		enable_main_irq = true;
-		rtc_ops = &bd70528_rtc_ops;
-		break;
 	case ROHM_CHIP_TYPE_BD71815:
 		irq_name = "bd71815-rtc-alm-0";
 		bd_rtc->reg_time_start = BD71815_REG_RTC_START;
@@ -549,14 +274,12 @@ static int bd70528_probe(struct platform_device *pdev)
 		 */
 		bd_rtc->bd718xx_alm_block_start = BD71815_REG_RTC_ALM_START;
 		hour_reg = BD71815_REG_HOUR;
-		rtc_ops = &bd71828_rtc_ops;
 		break;
 	case ROHM_CHIP_TYPE_BD71828:
 		irq_name = "bd71828-rtc-alm-0";
 		bd_rtc->reg_time_start = BD71828_REG_RTC_START;
 		bd_rtc->bd718xx_alm_block_start = BD71828_REG_RTC_ALM_START;
 		hour_reg = BD71828_REG_RTC_HOUR;
-		rtc_ops = &bd71828_rtc_ops;
 		break;
 	default:
 		dev_err(&pdev->dev, "Unknown chip\n");
@@ -611,27 +334,10 @@ static int bd70528_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
-	/*
-	 *  BD70528 irq controller is not touching the main mask register.
-	 *  So enable the RTC block interrupts at main level. We can just
-	 *  leave them enabled as irq-controller should disable irqs
-	 *  from sub-registers when IRQ is disabled or freed.
-	 */
-	if (enable_main_irq) {
-		ret = regmap_update_bits(bd_rtc->regmap,
-				 BD70528_REG_INT_MAIN_MASK,
-				 BD70528_INT_RTC_MASK, 0);
-		if (ret) {
-			dev_err(&pdev->dev, "Failed to enable RTC interrupts\n");
-			return ret;
-		}
-	}
-
 	return devm_rtc_register_device(rtc);
 }
 
 static const struct platform_device_id bd718x7_rtc_id[] = {
-	{ "bd70528-rtc", ROHM_CHIP_TYPE_BD70528 },
 	{ "bd71828-rtc", ROHM_CHIP_TYPE_BD71828 },
 	{ "bd71815-rtc", ROHM_CHIP_TYPE_BD71815 },
 	{ },
@@ -649,6 +355,6 @@ static struct platform_driver bd70528_rtc = {
 module_platform_driver(bd70528_rtc);
 
 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
-MODULE_DESCRIPTION("ROHM BD70528 and BD71828 PMIC RTC driver");
+MODULE_DESCRIPTION("ROHM BD71828 and BD71815 PMIC RTC driver");
 MODULE_LICENSE("GPL");
 MODULE_ALIAS("platform:bd70528-rtc");
-- 
2.25.4


-- 
Matti Vaittinen, Linux device drivers
ROHM Semiconductors, Finland SWDC
Kiviharjunlenkki 1E
90220 OULU
FINLAND

~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~
Simon says - in Latin please.
~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~
Thanks to Simon Glass for the translation =] 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 3/9] watchdog: bd70528 drop bd70528 support
  2021-05-25 10:13 [PATCH 0/9] Drop ROHM BD70528 support Matti Vaittinen
  2021-05-25 10:13 ` [PATCH 1/9] dt-bindings: mfd: regulator: Drop " Matti Vaittinen
  2021-05-25 10:14 ` [PATCH 2/9] rtc: bd70528: " Matti Vaittinen
@ 2021-05-25 10:14 ` Matti Vaittinen
  2021-05-25 11:07   ` Guenter Roeck
  2021-05-25 10:14 ` [PATCH 4/9] regulator: bd70528: Drop BD70528 support Matti Vaittinen
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 20+ messages in thread
From: Matti Vaittinen @ 2021-05-25 10:14 UTC (permalink / raw)
  To: Matti Vaittinen, Matti Vaittinen
  Cc: Lee Jones, Rob Herring, Liam Girdwood, Mark Brown,
	Michael Turquette, Stephen Boyd, Matti Vaittinen, Linus Walleij,
	Bartosz Golaszewski, Sebastian Reichel, Alessandro Zummo,
	Alexandre Belloni, Wim Van Sebroeck, Guenter Roeck, devicetree,
	linux-kernel, linux-clk, linux-power, linux-gpio, linux-pm,
	linux-rtc, linux-watchdog

[-- Attachment #1: Type: text/plain, Size: 10572 bytes --]

The only known BD70528 use-cases are such that the PMIC is controlled
from separate MCU which is not running Linux. I am not aware of
any Linux driver users. Furthermore, it seems there is no demand for
this IC. Let's ease the maintenance burden and drop the driver. We can
always add it back if there is sudden need for it.

Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>

---
Please let me know if some of you think the driver is needed.
---
 drivers/watchdog/Kconfig       |  12 --
 drivers/watchdog/Makefile      |   1 -
 drivers/watchdog/bd70528_wdt.c | 291 ---------------------------------
 3 files changed, 304 deletions(-)
 delete mode 100644 drivers/watchdog/bd70528_wdt.c

diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index 355100dad60a..26824ac6c5bc 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -160,18 +160,6 @@ config SOFT_WATCHDOG_PRETIMEOUT
 	  watchdog. Be aware that governors might affect the watchdog because it
 	  is purely software, e.g. the panic governor will stall it!
 
-config BD70528_WATCHDOG
-	tristate "ROHM BD70528 PMIC Watchdog"
-	depends on MFD_ROHM_BD70528
-	select WATCHDOG_CORE
-	help
-	  Support for the watchdog in the ROHM BD70528 PMIC. Watchdog trigger
-	  cause system reset.
-
-	  Say Y here to include support for the ROHM BD70528 watchdog.
-	  Alternatively say M to compile the driver as a module,
-	  which will be called bd70528_wdt.
-
 config BD957XMUF_WATCHDOG
 	tristate "ROHM BD9576MUF and BD9573MUF PMIC Watchdog"
 	depends on MFD_ROHM_BD957XMUF
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index a7eade8b4d45..1838df3ed650 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -203,7 +203,6 @@ obj-$(CONFIG_WATCHDOG_SUN4V)		+= sun4v_wdt.o
 obj-$(CONFIG_XEN_WDT) += xen_wdt.o
 
 # Architecture Independent
-obj-$(CONFIG_BD70528_WATCHDOG) += bd70528_wdt.o
 obj-$(CONFIG_BD957XMUF_WATCHDOG) += bd9576_wdt.o
 obj-$(CONFIG_DA9052_WATCHDOG) += da9052_wdt.o
 obj-$(CONFIG_DA9055_WATCHDOG) += da9055_wdt.o
diff --git a/drivers/watchdog/bd70528_wdt.c b/drivers/watchdog/bd70528_wdt.c
deleted file mode 100644
index 0170b37e6674..000000000000
--- a/drivers/watchdog/bd70528_wdt.c
+++ /dev/null
@@ -1,291 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-// Copyright (C) 2018 ROHM Semiconductors
-// ROHM BD70528MWV watchdog driver
-
-#include <linux/bcd.h>
-#include <linux/kernel.h>
-#include <linux/mfd/rohm-bd70528.h>
-#include <linux/module.h>
-#include <linux/of.h>
-#include <linux/platform_device.h>
-#include <linux/regmap.h>
-#include <linux/watchdog.h>
-
-/*
- * Max time we can set is 1 hour, 59 minutes and 59 seconds
- * and Minimum time is 1 second
- */
-#define WDT_MAX_MS	((2 * 60 * 60 - 1) * 1000)
-#define WDT_MIN_MS	1000
-#define DEFAULT_TIMEOUT	60
-
-#define WD_CTRL_MAGIC1 0x55
-#define WD_CTRL_MAGIC2 0xAA
-
-struct wdtbd70528 {
-	struct device *dev;
-	struct regmap *regmap;
-	struct rohm_regmap_dev *mfd;
-	struct watchdog_device wdt;
-};
-
-/**
- * bd70528_wdt_set - arm or disarm watchdog timer
- *
- * @data:	device data for the PMIC instance we want to operate on
- * @enable:	new state of WDT. zero to disable, non zero to enable
- * @old_state:	previous state of WDT will be filled here
- *
- * Arm or disarm WDT on BD70528 PMIC. Expected to be called only by
- * BD70528 RTC and BD70528 WDT drivers. The rtc_timer_lock must be taken
- * by calling bd70528_wdt_lock before calling bd70528_wdt_set.
- */
-int bd70528_wdt_set(struct rohm_regmap_dev *data, int enable, int *old_state)
-{
-	int ret, i;
-	unsigned int tmp;
-	struct bd70528_data *bd70528 = container_of(data, struct bd70528_data,
-						 chip);
-	u8 wd_ctrl_arr[3] = { WD_CTRL_MAGIC1, WD_CTRL_MAGIC2, 0 };
-	u8 *wd_ctrl = &wd_ctrl_arr[2];
-
-	ret = regmap_read(bd70528->chip.regmap, BD70528_REG_WDT_CTRL, &tmp);
-	if (ret)
-		return ret;
-
-	*wd_ctrl = (u8)tmp;
-
-	if (old_state) {
-		if (*wd_ctrl & BD70528_MASK_WDT_EN)
-			*old_state |= BD70528_WDT_STATE_BIT;
-		else
-			*old_state &= ~BD70528_WDT_STATE_BIT;
-		if ((!enable) == (!(*old_state & BD70528_WDT_STATE_BIT)))
-			return 0;
-	}
-
-	if (enable) {
-		if (*wd_ctrl & BD70528_MASK_WDT_EN)
-			return 0;
-		*wd_ctrl |= BD70528_MASK_WDT_EN;
-	} else {
-		if (*wd_ctrl & BD70528_MASK_WDT_EN)
-			*wd_ctrl &= ~BD70528_MASK_WDT_EN;
-		else
-			return 0;
-	}
-
-	for (i = 0; i < 3; i++) {
-		ret = regmap_write(bd70528->chip.regmap, BD70528_REG_WDT_CTRL,
-				   wd_ctrl_arr[i]);
-		if (ret)
-			return ret;
-	}
-
-	ret = regmap_read(bd70528->chip.regmap, BD70528_REG_WDT_CTRL, &tmp);
-	if ((tmp & BD70528_MASK_WDT_EN) != (*wd_ctrl & BD70528_MASK_WDT_EN)) {
-		dev_err(bd70528->chip.dev,
-			"Watchdog ctrl mismatch (hw) 0x%x (set) 0x%x\n",
-			tmp, *wd_ctrl);
-		ret = -EIO;
-	}
-
-	return ret;
-}
-EXPORT_SYMBOL(bd70528_wdt_set);
-
-/**
- * bd70528_wdt_lock - take WDT lock
- *
- * @data:	device data for the PMIC instance we want to operate on
- *
- * Lock WDT for arming/disarming in order to avoid race condition caused
- * by WDT state changes initiated by WDT and RTC drivers.
- */
-void bd70528_wdt_lock(struct rohm_regmap_dev *data)
-{
-	struct bd70528_data *bd70528 = container_of(data, struct bd70528_data,
-						 chip);
-
-	mutex_lock(&bd70528->rtc_timer_lock);
-}
-EXPORT_SYMBOL(bd70528_wdt_lock);
-
-/**
- * bd70528_wdt_unlock - unlock WDT lock
- *
- * @data:	device data for the PMIC instance we want to operate on
- *
- * Unlock WDT lock which has previously been taken by call to
- * bd70528_wdt_lock.
- */
-void bd70528_wdt_unlock(struct rohm_regmap_dev *data)
-{
-	struct bd70528_data *bd70528 = container_of(data, struct bd70528_data,
-						 chip);
-
-	mutex_unlock(&bd70528->rtc_timer_lock);
-}
-EXPORT_SYMBOL(bd70528_wdt_unlock);
-
-static int bd70528_wdt_set_locked(struct wdtbd70528 *w, int enable)
-{
-	return bd70528_wdt_set(w->mfd, enable, NULL);
-}
-
-static int bd70528_wdt_change(struct wdtbd70528 *w, int enable)
-{
-	int ret;
-
-	bd70528_wdt_lock(w->mfd);
-	ret = bd70528_wdt_set_locked(w, enable);
-	bd70528_wdt_unlock(w->mfd);
-
-	return ret;
-}
-
-static int bd70528_wdt_start(struct watchdog_device *wdt)
-{
-	struct wdtbd70528 *w = watchdog_get_drvdata(wdt);
-
-	dev_dbg(w->dev, "WDT ping...\n");
-	return bd70528_wdt_change(w, 1);
-}
-
-static int bd70528_wdt_stop(struct watchdog_device *wdt)
-{
-	struct wdtbd70528 *w = watchdog_get_drvdata(wdt);
-
-	dev_dbg(w->dev, "WDT stopping...\n");
-	return bd70528_wdt_change(w, 0);
-}
-
-static int bd70528_wdt_set_timeout(struct watchdog_device *wdt,
-				   unsigned int timeout)
-{
-	unsigned int hours;
-	unsigned int minutes;
-	unsigned int seconds;
-	int ret;
-	struct wdtbd70528 *w = watchdog_get_drvdata(wdt);
-
-	seconds = timeout;
-	hours = timeout / (60 * 60);
-	/* Maximum timeout is 1h 59m 59s => hours is 1 or 0 */
-	if (hours)
-		seconds -= (60 * 60);
-	minutes = seconds / 60;
-	seconds = seconds % 60;
-
-	bd70528_wdt_lock(w->mfd);
-
-	ret = bd70528_wdt_set_locked(w, 0);
-	if (ret)
-		goto out_unlock;
-
-	ret = regmap_update_bits(w->regmap, BD70528_REG_WDT_HOUR,
-				 BD70528_MASK_WDT_HOUR, hours);
-	if (ret) {
-		dev_err(w->dev, "Failed to set WDT hours\n");
-		goto out_en_unlock;
-	}
-	ret = regmap_update_bits(w->regmap, BD70528_REG_WDT_MINUTE,
-				 BD70528_MASK_WDT_MINUTE, bin2bcd(minutes));
-	if (ret) {
-		dev_err(w->dev, "Failed to set WDT minutes\n");
-		goto out_en_unlock;
-	}
-	ret = regmap_update_bits(w->regmap, BD70528_REG_WDT_SEC,
-				 BD70528_MASK_WDT_SEC, bin2bcd(seconds));
-	if (ret)
-		dev_err(w->dev, "Failed to set WDT seconds\n");
-	else
-		dev_dbg(w->dev, "WDT tmo set to %u\n", timeout);
-
-out_en_unlock:
-	ret = bd70528_wdt_set_locked(w, 1);
-out_unlock:
-	bd70528_wdt_unlock(w->mfd);
-
-	return ret;
-}
-
-static const struct watchdog_info bd70528_wdt_info = {
-	.identity = "bd70528-wdt",
-	.options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE,
-};
-
-static const struct watchdog_ops bd70528_wdt_ops = {
-	.start		= bd70528_wdt_start,
-	.stop		= bd70528_wdt_stop,
-	.set_timeout	= bd70528_wdt_set_timeout,
-};
-
-static int bd70528_wdt_probe(struct platform_device *pdev)
-{
-	struct rohm_regmap_dev *bd70528;
-	struct wdtbd70528 *w;
-	int ret;
-	unsigned int reg;
-
-	bd70528 = dev_get_drvdata(pdev->dev.parent);
-	if (!bd70528) {
-		dev_err(&pdev->dev, "No MFD driver data\n");
-		return -EINVAL;
-	}
-	w = devm_kzalloc(&pdev->dev, sizeof(*w), GFP_KERNEL);
-	if (!w)
-		return -ENOMEM;
-
-	w->regmap = bd70528->regmap;
-	w->mfd = bd70528;
-	w->dev = &pdev->dev;
-
-	w->wdt.info = &bd70528_wdt_info;
-	w->wdt.ops =  &bd70528_wdt_ops;
-	w->wdt.min_hw_heartbeat_ms = WDT_MIN_MS;
-	w->wdt.max_hw_heartbeat_ms = WDT_MAX_MS;
-	w->wdt.parent = pdev->dev.parent;
-	w->wdt.timeout = DEFAULT_TIMEOUT;
-	watchdog_set_drvdata(&w->wdt, w);
-	watchdog_init_timeout(&w->wdt, 0, pdev->dev.parent);
-
-	ret = bd70528_wdt_set_timeout(&w->wdt, w->wdt.timeout);
-	if (ret) {
-		dev_err(&pdev->dev, "Failed to set the watchdog timeout\n");
-		return ret;
-	}
-
-	bd70528_wdt_lock(w->mfd);
-	ret = regmap_read(w->regmap, BD70528_REG_WDT_CTRL, &reg);
-	bd70528_wdt_unlock(w->mfd);
-
-	if (ret) {
-		dev_err(&pdev->dev, "Failed to get the watchdog state\n");
-		return ret;
-	}
-	if (reg & BD70528_MASK_WDT_EN) {
-		dev_dbg(&pdev->dev, "watchdog was running during probe\n");
-		set_bit(WDOG_HW_RUNNING, &w->wdt.status);
-	}
-
-	ret = devm_watchdog_register_device(&pdev->dev, &w->wdt);
-	if (ret < 0)
-		dev_err(&pdev->dev, "watchdog registration failed: %d\n", ret);
-
-	return ret;
-}
-
-static struct platform_driver bd70528_wdt = {
-	.driver = {
-		.name = "bd70528-wdt"
-	},
-	.probe = bd70528_wdt_probe,
-};
-
-module_platform_driver(bd70528_wdt);
-
-MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
-MODULE_DESCRIPTION("BD70528 watchdog driver");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:bd70528-wdt");
-- 
2.25.4


-- 
Matti Vaittinen, Linux device drivers
ROHM Semiconductors, Finland SWDC
Kiviharjunlenkki 1E
90220 OULU
FINLAND

~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~
Simon says - in Latin please.
~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~
Thanks to Simon Glass for the translation =] 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 4/9] regulator: bd70528: Drop BD70528 support
  2021-05-25 10:13 [PATCH 0/9] Drop ROHM BD70528 support Matti Vaittinen
                   ` (2 preceding siblings ...)
  2021-05-25 10:14 ` [PATCH 3/9] watchdog: bd70528 drop bd70528 support Matti Vaittinen
@ 2021-05-25 10:14 ` Matti Vaittinen
  2021-05-25 10:15 ` [PATCH 5/9] clk: bd718xx: " Matti Vaittinen
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: Matti Vaittinen @ 2021-05-25 10:14 UTC (permalink / raw)
  To: Matti Vaittinen, Matti Vaittinen
  Cc: Lee Jones, Rob Herring, Liam Girdwood, Mark Brown,
	Michael Turquette, Stephen Boyd, Matti Vaittinen, Linus Walleij,
	Bartosz Golaszewski, Sebastian Reichel, Alessandro Zummo,
	Alexandre Belloni, Wim Van Sebroeck, Guenter Roeck, devicetree,
	linux-kernel, linux-clk, linux-power, linux-gpio, linux-pm,
	linux-rtc, linux-watchdog

[-- Attachment #1: Type: text/plain, Size: 11737 bytes --]

The only known BD70528 use-cases are such that the PMIC is controlled
from separate MCU which is not running Linux. I am not aware of
any Linux driver users. Furthermore, it seems there is no demand for
this IC. Let's ease the maintenance burden and drop the driver. We can
always add it back if there is sudden need for it.

Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>

---
Please let me know if some of you think the driver is needed.
---
 drivers/regulator/Kconfig             |  11 -
 drivers/regulator/Makefile            |   1 -
 drivers/regulator/bd70528-regulator.c | 283 --------------------------
 3 files changed, 295 deletions(-)
 delete mode 100644 drivers/regulator/bd70528-regulator.c

diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 9d84d9245490..ebbd9e6207df 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -193,17 +193,6 @@ config REGULATOR_BCM590XX
 	  BCM590xx PMUs. This will enable support for the software
 	  controllable LDO/Switching regulators.
 
-config REGULATOR_BD70528
-	tristate "ROHM BD70528 Power Regulator"
-	depends on MFD_ROHM_BD70528
-	help
-	  This driver supports voltage regulators on ROHM BD70528 PMIC.
-	  This will enable support for the software controllable buck
-	  and LDO regulators.
-
-	  This driver can also be built as a module. If so, the module
-	  will be called bd70528-regulator.
-
 config REGULATOR_BD71815
 	tristate "ROHM BD71815 Power Regulator"
 	depends on MFD_ROHM_BD71828
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index 580b015296ea..6a5d55e209d3 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -29,7 +29,6 @@ obj-$(CONFIG_REGULATOR_AS3722) += as3722-regulator.o
 obj-$(CONFIG_REGULATOR_ATC260X) += atc260x-regulator.o
 obj-$(CONFIG_REGULATOR_AXP20X) += axp20x-regulator.o
 obj-$(CONFIG_REGULATOR_BCM590XX) += bcm590xx-regulator.o
-obj-$(CONFIG_REGULATOR_BD70528) += bd70528-regulator.o
 obj-$(CONFIG_REGULATOR_BD71815)	+= bd71815-regulator.o
 obj-$(CONFIG_REGULATOR_BD71828) += bd71828-regulator.o
 obj-$(CONFIG_REGULATOR_BD718XX) += bd718x7-regulator.o
diff --git a/drivers/regulator/bd70528-regulator.c b/drivers/regulator/bd70528-regulator.c
deleted file mode 100644
index 1f5f9482b209..000000000000
--- a/drivers/regulator/bd70528-regulator.c
+++ /dev/null
@@ -1,283 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-// Copyright (C) 2018 ROHM Semiconductors
-// bd70528-regulator.c ROHM BD70528MWV regulator driver
-
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/interrupt.h>
-#include <linux/kernel.h>
-#include <linux/mfd/rohm-bd70528.h>
-#include <linux/module.h>
-#include <linux/of.h>
-#include <linux/platform_device.h>
-#include <linux/regmap.h>
-#include <linux/regulator/driver.h>
-#include <linux/regulator/machine.h>
-#include <linux/regulator/of_regulator.h>
-#include <linux/slab.h>
-
-#define BUCK_RAMPRATE_250MV 0
-#define BUCK_RAMPRATE_125MV 1
-#define BUCK_RAMP_MAX 250
-
-static const struct linear_range bd70528_buck1_volts[] = {
-	REGULATOR_LINEAR_RANGE(1200000, 0x00, 0x1, 600000),
-	REGULATOR_LINEAR_RANGE(2750000, 0x2, 0xf, 50000),
-};
-static const struct linear_range bd70528_buck2_volts[] = {
-	REGULATOR_LINEAR_RANGE(1200000, 0x00, 0x1, 300000),
-	REGULATOR_LINEAR_RANGE(1550000, 0x2, 0xd, 50000),
-	REGULATOR_LINEAR_RANGE(3000000, 0xe, 0xf, 300000),
-};
-static const struct linear_range bd70528_buck3_volts[] = {
-	REGULATOR_LINEAR_RANGE(800000, 0x00, 0xd, 50000),
-	REGULATOR_LINEAR_RANGE(1800000, 0xe, 0xf, 0),
-};
-
-/* All LDOs have same voltage ranges */
-static const struct linear_range bd70528_ldo_volts[] = {
-	REGULATOR_LINEAR_RANGE(1650000, 0x0, 0x07, 50000),
-	REGULATOR_LINEAR_RANGE(2100000, 0x8, 0x0f, 100000),
-	REGULATOR_LINEAR_RANGE(2850000, 0x10, 0x19, 50000),
-	REGULATOR_LINEAR_RANGE(3300000, 0x19, 0x1f, 0),
-};
-
-/* Also both LEDs support same voltages */
-static const unsigned int led_volts[] = {
-	20000, 30000
-};
-
-static int bd70528_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
-{
-	if (ramp_delay > 0 && ramp_delay <= BUCK_RAMP_MAX) {
-		unsigned int ramp_value = BUCK_RAMPRATE_250MV;
-
-		if (ramp_delay <= 125)
-			ramp_value = BUCK_RAMPRATE_125MV;
-
-		return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,
-				  BD70528_MASK_BUCK_RAMP,
-				  ramp_value << BD70528_SIFT_BUCK_RAMP);
-	}
-	dev_err(&rdev->dev, "%s: ramp_delay: %d not supported\n",
-		rdev->desc->name, ramp_delay);
-	return -EINVAL;
-}
-
-static int bd70528_led_set_voltage_sel(struct regulator_dev *rdev,
-				       unsigned int sel)
-{
-	int ret;
-
-	ret = regulator_is_enabled_regmap(rdev);
-	if (ret < 0)
-		return ret;
-
-	if (ret == 0)
-		return regulator_set_voltage_sel_regmap(rdev, sel);
-
-	dev_err(&rdev->dev,
-		"LED voltage change not allowed when led is enabled\n");
-
-	return -EBUSY;
-}
-
-static const struct regulator_ops bd70528_buck_ops = {
-	.enable = regulator_enable_regmap,
-	.disable = regulator_disable_regmap,
-	.is_enabled = regulator_is_enabled_regmap,
-	.list_voltage = regulator_list_voltage_linear_range,
-	.set_voltage_sel = regulator_set_voltage_sel_regmap,
-	.get_voltage_sel = regulator_get_voltage_sel_regmap,
-	.set_voltage_time_sel = regulator_set_voltage_time_sel,
-	.set_ramp_delay = bd70528_set_ramp_delay,
-};
-
-static const struct regulator_ops bd70528_ldo_ops = {
-	.enable = regulator_enable_regmap,
-	.disable = regulator_disable_regmap,
-	.is_enabled = regulator_is_enabled_regmap,
-	.list_voltage = regulator_list_voltage_linear_range,
-	.set_voltage_sel = regulator_set_voltage_sel_regmap,
-	.get_voltage_sel = regulator_get_voltage_sel_regmap,
-	.set_voltage_time_sel = regulator_set_voltage_time_sel,
-};
-
-static const struct regulator_ops bd70528_led_ops = {
-	.enable = regulator_enable_regmap,
-	.disable = regulator_disable_regmap,
-	.is_enabled = regulator_is_enabled_regmap,
-	.list_voltage = regulator_list_voltage_table,
-	.set_voltage_sel = bd70528_led_set_voltage_sel,
-	.get_voltage_sel = regulator_get_voltage_sel_regmap,
-};
-
-static const struct regulator_desc bd70528_desc[] = {
-	{
-		.name = "buck1",
-		.of_match = of_match_ptr("BUCK1"),
-		.regulators_node = of_match_ptr("regulators"),
-		.id = BD70528_BUCK1,
-		.ops = &bd70528_buck_ops,
-		.type = REGULATOR_VOLTAGE,
-		.linear_ranges = bd70528_buck1_volts,
-		.n_linear_ranges = ARRAY_SIZE(bd70528_buck1_volts),
-		.n_voltages = BD70528_BUCK_VOLTS,
-		.enable_reg = BD70528_REG_BUCK1_EN,
-		.enable_mask = BD70528_MASK_RUN_EN,
-		.vsel_reg = BD70528_REG_BUCK1_VOLT,
-		.vsel_mask = BD70528_MASK_BUCK_VOLT,
-		.owner = THIS_MODULE,
-	},
-	{
-		.name = "buck2",
-		.of_match = of_match_ptr("BUCK2"),
-		.regulators_node = of_match_ptr("regulators"),
-		.id = BD70528_BUCK2,
-		.ops = &bd70528_buck_ops,
-		.type = REGULATOR_VOLTAGE,
-		.linear_ranges = bd70528_buck2_volts,
-		.n_linear_ranges = ARRAY_SIZE(bd70528_buck2_volts),
-		.n_voltages = BD70528_BUCK_VOLTS,
-		.enable_reg = BD70528_REG_BUCK2_EN,
-		.enable_mask = BD70528_MASK_RUN_EN,
-		.vsel_reg = BD70528_REG_BUCK2_VOLT,
-		.vsel_mask = BD70528_MASK_BUCK_VOLT,
-		.owner = THIS_MODULE,
-	},
-	{
-		.name = "buck3",
-		.of_match = of_match_ptr("BUCK3"),
-		.regulators_node = of_match_ptr("regulators"),
-		.id = BD70528_BUCK3,
-		.ops = &bd70528_buck_ops,
-		.type = REGULATOR_VOLTAGE,
-		.linear_ranges = bd70528_buck3_volts,
-		.n_linear_ranges = ARRAY_SIZE(bd70528_buck3_volts),
-		.n_voltages = BD70528_BUCK_VOLTS,
-		.enable_reg = BD70528_REG_BUCK3_EN,
-		.enable_mask = BD70528_MASK_RUN_EN,
-		.vsel_reg = BD70528_REG_BUCK3_VOLT,
-		.vsel_mask = BD70528_MASK_BUCK_VOLT,
-		.owner = THIS_MODULE,
-	},
-	{
-		.name = "ldo1",
-		.of_match = of_match_ptr("LDO1"),
-		.regulators_node = of_match_ptr("regulators"),
-		.id = BD70528_LDO1,
-		.ops = &bd70528_ldo_ops,
-		.type = REGULATOR_VOLTAGE,
-		.linear_ranges = bd70528_ldo_volts,
-		.n_linear_ranges = ARRAY_SIZE(bd70528_ldo_volts),
-		.n_voltages = BD70528_LDO_VOLTS,
-		.enable_reg = BD70528_REG_LDO1_EN,
-		.enable_mask = BD70528_MASK_RUN_EN,
-		.vsel_reg = BD70528_REG_LDO1_VOLT,
-		.vsel_mask = BD70528_MASK_LDO_VOLT,
-		.owner = THIS_MODULE,
-	},
-	{
-		.name = "ldo2",
-		.of_match = of_match_ptr("LDO2"),
-		.regulators_node = of_match_ptr("regulators"),
-		.id = BD70528_LDO2,
-		.ops = &bd70528_ldo_ops,
-		.type = REGULATOR_VOLTAGE,
-		.linear_ranges = bd70528_ldo_volts,
-		.n_linear_ranges = ARRAY_SIZE(bd70528_ldo_volts),
-		.n_voltages = BD70528_LDO_VOLTS,
-		.enable_reg = BD70528_REG_LDO2_EN,
-		.enable_mask = BD70528_MASK_RUN_EN,
-		.vsel_reg = BD70528_REG_LDO2_VOLT,
-		.vsel_mask = BD70528_MASK_LDO_VOLT,
-		.owner = THIS_MODULE,
-	},
-	{
-		.name = "ldo3",
-		.of_match = of_match_ptr("LDO3"),
-		.regulators_node = of_match_ptr("regulators"),
-		.id = BD70528_LDO3,
-		.ops = &bd70528_ldo_ops,
-		.type = REGULATOR_VOLTAGE,
-		.linear_ranges = bd70528_ldo_volts,
-		.n_linear_ranges = ARRAY_SIZE(bd70528_ldo_volts),
-		.n_voltages = BD70528_LDO_VOLTS,
-		.enable_reg = BD70528_REG_LDO3_EN,
-		.enable_mask = BD70528_MASK_RUN_EN,
-		.vsel_reg = BD70528_REG_LDO3_VOLT,
-		.vsel_mask = BD70528_MASK_LDO_VOLT,
-		.owner = THIS_MODULE,
-	},
-	{
-		.name = "ldo_led1",
-		.of_match = of_match_ptr("LDO_LED1"),
-		.regulators_node = of_match_ptr("regulators"),
-		.id = BD70528_LED1,
-		.ops = &bd70528_led_ops,
-		.type = REGULATOR_VOLTAGE,
-		.volt_table = &led_volts[0],
-		.n_voltages = ARRAY_SIZE(led_volts),
-		.enable_reg = BD70528_REG_LED_EN,
-		.enable_mask = BD70528_MASK_LED1_EN,
-		.vsel_reg = BD70528_REG_LED_VOLT,
-		.vsel_mask = BD70528_MASK_LED1_VOLT,
-		.owner = THIS_MODULE,
-	},
-	{
-		.name = "ldo_led2",
-		.of_match = of_match_ptr("LDO_LED2"),
-		.regulators_node = of_match_ptr("regulators"),
-		.id = BD70528_LED2,
-		.ops = &bd70528_led_ops,
-		.type = REGULATOR_VOLTAGE,
-		.volt_table = &led_volts[0],
-		.n_voltages = ARRAY_SIZE(led_volts),
-		.enable_reg = BD70528_REG_LED_EN,
-		.enable_mask = BD70528_MASK_LED2_EN,
-		.vsel_reg = BD70528_REG_LED_VOLT,
-		.vsel_mask = BD70528_MASK_LED2_VOLT,
-		.owner = THIS_MODULE,
-	},
-
-};
-
-static int bd70528_probe(struct platform_device *pdev)
-{
-	int i;
-	struct regulator_config config = {
-		.dev = pdev->dev.parent,
-	};
-
-	config.regmap = dev_get_regmap(pdev->dev.parent, NULL);
-	if (!config.regmap)
-		return -ENODEV;
-
-	for (i = 0; i < ARRAY_SIZE(bd70528_desc); i++) {
-		struct regulator_dev *rdev;
-
-		rdev = devm_regulator_register(&pdev->dev, &bd70528_desc[i],
-					       &config);
-		if (IS_ERR(rdev)) {
-			dev_err(&pdev->dev,
-				"failed to register %s regulator\n",
-				bd70528_desc[i].name);
-			return PTR_ERR(rdev);
-		}
-	}
-	return 0;
-}
-
-static struct platform_driver bd70528_regulator = {
-	.driver = {
-		.name = "bd70528-pmic"
-	},
-	.probe = bd70528_probe,
-};
-
-module_platform_driver(bd70528_regulator);
-
-MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
-MODULE_DESCRIPTION("BD70528 voltage regulator driver");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:bd70528-pmic");
-- 
2.25.4


-- 
Matti Vaittinen, Linux device drivers
ROHM Semiconductors, Finland SWDC
Kiviharjunlenkki 1E
90220 OULU
FINLAND

~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~
Simon says - in Latin please.
~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~
Thanks to Simon Glass for the translation =] 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 5/9] clk: bd718xx: Drop BD70528 support
  2021-05-25 10:13 [PATCH 0/9] Drop ROHM BD70528 support Matti Vaittinen
                   ` (3 preceding siblings ...)
  2021-05-25 10:14 ` [PATCH 4/9] regulator: bd70528: Drop BD70528 support Matti Vaittinen
@ 2021-05-25 10:15 ` Matti Vaittinen
  2021-06-28  1:43   ` Stephen Boyd
  2021-05-25 10:15 ` [PATCH 6/9] gpio: bd70528 " Matti Vaittinen
                   ` (4 subsequent siblings)
  9 siblings, 1 reply; 20+ messages in thread
From: Matti Vaittinen @ 2021-05-25 10:15 UTC (permalink / raw)
  To: Matti Vaittinen, Matti Vaittinen
  Cc: Lee Jones, Rob Herring, Liam Girdwood, Mark Brown,
	Michael Turquette, Stephen Boyd, Matti Vaittinen, Linus Walleij,
	Bartosz Golaszewski, Sebastian Reichel, Alessandro Zummo,
	Alexandre Belloni, Wim Van Sebroeck, Guenter Roeck, devicetree,
	linux-kernel, linux-clk, linux-power, linux-gpio, linux-pm,
	linux-rtc, linux-watchdog

[-- Attachment #1: Type: text/plain, Size: 3466 bytes --]

The only known BD70528 use-cases are such that the PMIC is controlled
from separate MCU which is not running Linux. I am not aware of
any Linux driver users. Furthermore, it seems there is no demand for
this IC. Let's ease the maintenance burden and drop the driver. We can
always add it back if there is sudden need for it.

Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>

---
Please let me know if some of you think the driver is needed.
---
 drivers/clk/Kconfig       |  6 +++---
 drivers/clk/clk-bd718x7.c | 11 ++---------
 2 files changed, 5 insertions(+), 12 deletions(-)

diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index e80918be8e9c..84983cd6029c 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -358,10 +358,10 @@ config COMMON_CLK_MMP2_AUDIO
 
 config COMMON_CLK_BD718XX
 	tristate "Clock driver for 32K clk gates on ROHM PMICs"
-	depends on MFD_ROHM_BD718XX || MFD_ROHM_BD70528 || MFD_ROHM_BD71828
+	depends on MFD_ROHM_BD718XX || MFD_ROHM_BD71828
 	help
-	  This driver supports ROHM BD71837, ROHM BD71847, ROHM BD71828 and
-	  ROHM BD70528 PMICs clock gates.
+	  This driver supports ROHM BD71837, BD71847, BD71850, BD71815
+	  and BD71828 PMICs clock gates.
 
 config COMMON_CLK_FIXED_MMIO
 	bool "Clock driver for Memory Mapped Fixed values"
diff --git a/drivers/clk/clk-bd718x7.c b/drivers/clk/clk-bd718x7.c
index d9e70e506d18..ac40b669d60b 100644
--- a/drivers/clk/clk-bd718x7.c
+++ b/drivers/clk/clk-bd718x7.c
@@ -15,15 +15,13 @@
 /* clk control registers */
 /* BD71815 */
 #define BD71815_REG_OUT32K	0x1d
-/* BD70528 */
-#define BD70528_REG_OUT32K	0x2c
 /* BD71828 */
 #define BD71828_REG_OUT32K	0x4B
 /* BD71837 and BD71847 */
 #define BD718XX_REG_OUT32K	0x2E
 
 /*
- * BD71837, BD71847, BD70528 and BD71828 all use bit [0] to clk output control
+ * BD71837, BD71847, and BD71828 all use bit [0] to clk output control
  */
 #define CLK_OUT_EN_MASK		BIT(0)
 
@@ -116,10 +114,6 @@ static int bd71837_clk_probe(struct platform_device *pdev)
 		c->reg = BD71828_REG_OUT32K;
 		c->mask = CLK_OUT_EN_MASK;
 		break;
-	case ROHM_CHIP_TYPE_BD70528:
-		c->reg = BD70528_REG_OUT32K;
-		c->mask = CLK_OUT_EN_MASK;
-		break;
 	case ROHM_CHIP_TYPE_BD71815:
 		c->reg = BD71815_REG_OUT32K;
 		c->mask = CLK_OUT_EN_MASK;
@@ -150,7 +144,6 @@ static int bd71837_clk_probe(struct platform_device *pdev)
 static const struct platform_device_id bd718x7_clk_id[] = {
 	{ "bd71837-clk", ROHM_CHIP_TYPE_BD71837 },
 	{ "bd71847-clk", ROHM_CHIP_TYPE_BD71847 },
-	{ "bd70528-clk", ROHM_CHIP_TYPE_BD70528 },
 	{ "bd71828-clk", ROHM_CHIP_TYPE_BD71828 },
 	{ "bd71815-clk", ROHM_CHIP_TYPE_BD71815 },
 	{ },
@@ -168,6 +161,6 @@ static struct platform_driver bd71837_clk = {
 module_platform_driver(bd71837_clk);
 
 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
-MODULE_DESCRIPTION("BD718(15/18/28/37/47/50) and BD70528 chip clk driver");
+MODULE_DESCRIPTION("BD718(15/18/28/37/47/50) and chip clk driver");
 MODULE_LICENSE("GPL");
 MODULE_ALIAS("platform:bd718xx-clk");
-- 
2.25.4


-- 
Matti Vaittinen, Linux device drivers
ROHM Semiconductors, Finland SWDC
Kiviharjunlenkki 1E
90220 OULU
FINLAND

~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~
Simon says - in Latin please.
~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~
Thanks to Simon Glass for the translation =] 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 6/9] gpio: bd70528 Drop BD70528 support
  2021-05-25 10:13 [PATCH 0/9] Drop ROHM BD70528 support Matti Vaittinen
                   ` (4 preceding siblings ...)
  2021-05-25 10:15 ` [PATCH 5/9] clk: bd718xx: " Matti Vaittinen
@ 2021-05-25 10:15 ` Matti Vaittinen
  2021-05-28 14:23   ` Bartosz Golaszewski
  2021-05-25 10:15 ` [PATCH 7/9] power: supply: " Matti Vaittinen
                   ` (3 subsequent siblings)
  9 siblings, 1 reply; 20+ messages in thread
From: Matti Vaittinen @ 2021-05-25 10:15 UTC (permalink / raw)
  To: Matti Vaittinen, Matti Vaittinen
  Cc: Lee Jones, Rob Herring, Liam Girdwood, Mark Brown,
	Michael Turquette, Stephen Boyd, Matti Vaittinen, Linus Walleij,
	Bartosz Golaszewski, Sebastian Reichel, Alessandro Zummo,
	Alexandre Belloni, Wim Van Sebroeck, Guenter Roeck, devicetree,
	linux-kernel, linux-clk, linux-power, linux-gpio, linux-pm,
	linux-rtc, linux-watchdog

[-- Attachment #1: Type: text/plain, Size: 9348 bytes --]

The only known BD70528 use-cases are such that the PMIC is controlled
from separate MCU which is not running Linux. I am not aware of
any Linux driver users. Furthermore, it seems there is no demand for
this IC. Let's ease the maintenance burden and drop the driver. We can
always add it back if there is sudden need for it.

Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>

---
Please let me know if some of you think the driver is needed.
---
 drivers/gpio/Kconfig        |  11 --
 drivers/gpio/Makefile       |   1 -
 drivers/gpio/gpio-bd70528.c | 230 ------------------------------------
 3 files changed, 242 deletions(-)
 delete mode 100644 drivers/gpio/gpio-bd70528.c

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 1dd0ec6727fd..459ec388cc00 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -1106,17 +1106,6 @@ config GPIO_ARIZONA
 	help
 	  Support for GPIOs on Wolfson Arizona class devices.
 
-config GPIO_BD70528
-	tristate "ROHM BD70528 GPIO support"
-	depends on MFD_ROHM_BD70528
-	help
-	  Support for GPIOs on ROHM BD70528 PMIC. There are four GPIOs
-	  available on the ROHM PMIC in total. The GPIOs can also
-	  generate interrupts.
-
-	  This driver can also be built as a module. If so, the module
-	  will be called gpio-bd70528.
-
 config GPIO_BD71815
 	tristate "ROHM BD71815 PMIC GPIO support"
 	depends on MFD_ROHM_BD71828
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index d7c81e1611a4..e9c4423b582a 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -38,7 +38,6 @@ obj-$(CONFIG_GPIO_ASPEED_SGPIO)		+= gpio-aspeed-sgpio.o
 obj-$(CONFIG_GPIO_ATH79)		+= gpio-ath79.o
 obj-$(CONFIG_GPIO_BCM_KONA)		+= gpio-bcm-kona.o
 obj-$(CONFIG_GPIO_BCM_XGS_IPROC)	+= gpio-xgs-iproc.o
-obj-$(CONFIG_GPIO_BD70528)		+= gpio-bd70528.o
 obj-$(CONFIG_GPIO_BD71815)		+= gpio-bd71815.o
 obj-$(CONFIG_GPIO_BD71828)		+= gpio-bd71828.o
 obj-$(CONFIG_GPIO_BD9571MWV)		+= gpio-bd9571mwv.o
diff --git a/drivers/gpio/gpio-bd70528.c b/drivers/gpio/gpio-bd70528.c
deleted file mode 100644
index 397a50d6bc65..000000000000
--- a/drivers/gpio/gpio-bd70528.c
+++ /dev/null
@@ -1,230 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-// Copyright (C) 2018 ROHM Semiconductors
-// gpio-bd70528.c ROHM BD70528MWV gpio driver
-
-#include <linux/gpio/driver.h>
-#include <linux/mfd/rohm-bd70528.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/regmap.h>
-
-#define GPIO_IN_REG(offset) (BD70528_REG_GPIO1_IN + (offset) * 2)
-#define GPIO_OUT_REG(offset) (BD70528_REG_GPIO1_OUT + (offset) * 2)
-
-struct bd70528_gpio {
-	struct regmap *regmap;
-	struct device *dev;
-	struct gpio_chip gpio;
-};
-
-static int bd70528_set_debounce(struct bd70528_gpio *bdgpio,
-				unsigned int offset, unsigned int debounce)
-{
-	u8 val;
-
-	switch (debounce) {
-	case 0:
-		val = BD70528_DEBOUNCE_DISABLE;
-		break;
-	case 1 ... 15000:
-		val = BD70528_DEBOUNCE_15MS;
-		break;
-	case 15001 ... 30000:
-		val = BD70528_DEBOUNCE_30MS;
-		break;
-	case 30001 ... 50000:
-		val = BD70528_DEBOUNCE_50MS;
-		break;
-	default:
-		dev_err(bdgpio->dev,
-			"Invalid debounce value %u\n", debounce);
-		return -EINVAL;
-	}
-	return regmap_update_bits(bdgpio->regmap, GPIO_IN_REG(offset),
-				 BD70528_DEBOUNCE_MASK, val);
-}
-
-static int bd70528_get_direction(struct gpio_chip *chip, unsigned int offset)
-{
-	struct bd70528_gpio *bdgpio = gpiochip_get_data(chip);
-	int val, ret;
-
-	/* Do we need to do something to IRQs here? */
-	ret = regmap_read(bdgpio->regmap, GPIO_OUT_REG(offset), &val);
-	if (ret) {
-		dev_err(bdgpio->dev, "Could not read gpio direction\n");
-		return ret;
-	}
-	if (val & BD70528_GPIO_OUT_EN_MASK)
-		return GPIO_LINE_DIRECTION_OUT;
-
-	return GPIO_LINE_DIRECTION_IN;
-}
-
-static int bd70528_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
-				   unsigned long config)
-{
-	struct bd70528_gpio *bdgpio = gpiochip_get_data(chip);
-
-	switch (pinconf_to_config_param(config)) {
-	case PIN_CONFIG_DRIVE_OPEN_DRAIN:
-		return regmap_update_bits(bdgpio->regmap,
-					  GPIO_OUT_REG(offset),
-					  BD70528_GPIO_DRIVE_MASK,
-					  BD70528_GPIO_OPEN_DRAIN);
-		break;
-	case PIN_CONFIG_DRIVE_PUSH_PULL:
-		return regmap_update_bits(bdgpio->regmap,
-					  GPIO_OUT_REG(offset),
-					  BD70528_GPIO_DRIVE_MASK,
-					  BD70528_GPIO_PUSH_PULL);
-		break;
-	case PIN_CONFIG_INPUT_DEBOUNCE:
-		return bd70528_set_debounce(bdgpio, offset,
-					    pinconf_to_config_argument(config));
-		break;
-	default:
-		break;
-	}
-	return -ENOTSUPP;
-}
-
-static int bd70528_direction_input(struct gpio_chip *chip, unsigned int offset)
-{
-	struct bd70528_gpio *bdgpio = gpiochip_get_data(chip);
-
-	/* Do we need to do something to IRQs here? */
-	return regmap_update_bits(bdgpio->regmap, GPIO_OUT_REG(offset),
-				 BD70528_GPIO_OUT_EN_MASK,
-				 BD70528_GPIO_OUT_DISABLE);
-}
-
-static void bd70528_gpio_set(struct gpio_chip *chip, unsigned int offset,
-			     int value)
-{
-	int ret;
-	struct bd70528_gpio *bdgpio = gpiochip_get_data(chip);
-	u8 val = (value) ? BD70528_GPIO_OUT_HI : BD70528_GPIO_OUT_LO;
-
-	ret = regmap_update_bits(bdgpio->regmap, GPIO_OUT_REG(offset),
-				 BD70528_GPIO_OUT_MASK, val);
-	if (ret)
-		dev_err(bdgpio->dev, "Could not set gpio to %d\n", value);
-}
-
-static int bd70528_direction_output(struct gpio_chip *chip, unsigned int offset,
-				    int value)
-{
-	struct bd70528_gpio *bdgpio = gpiochip_get_data(chip);
-
-	bd70528_gpio_set(chip, offset, value);
-	return regmap_update_bits(bdgpio->regmap, GPIO_OUT_REG(offset),
-				 BD70528_GPIO_OUT_EN_MASK,
-				 BD70528_GPIO_OUT_ENABLE);
-}
-
-#define GPIO_IN_STATE_MASK(offset) (BD70528_GPIO_IN_STATE_BASE << (offset))
-
-static int bd70528_gpio_get_o(struct bd70528_gpio *bdgpio, unsigned int offset)
-{
-	int ret;
-	unsigned int val;
-
-	ret = regmap_read(bdgpio->regmap, GPIO_OUT_REG(offset), &val);
-	if (!ret)
-		ret = !!(val & BD70528_GPIO_OUT_MASK);
-	else
-		dev_err(bdgpio->dev, "GPIO (out) state read failed\n");
-
-	return ret;
-}
-
-static int bd70528_gpio_get_i(struct bd70528_gpio *bdgpio, unsigned int offset)
-{
-	unsigned int val;
-	int ret;
-
-	ret = regmap_read(bdgpio->regmap, BD70528_REG_GPIO_STATE, &val);
-
-	if (!ret)
-		ret = !(val & GPIO_IN_STATE_MASK(offset));
-	else
-		dev_err(bdgpio->dev, "GPIO (in) state read failed\n");
-
-	return ret;
-}
-
-static int bd70528_gpio_get(struct gpio_chip *chip, unsigned int offset)
-{
-	int ret;
-	struct bd70528_gpio *bdgpio = gpiochip_get_data(chip);
-
-	/*
-	 * There is a race condition where someone might be changing the
-	 * GPIO direction after we get it but before we read the value. But
-	 * application design where GPIO direction may be changed just when
-	 * we read GPIO value would be pointless as reader could not know
-	 * whether the returned high/low state is caused by input or output.
-	 * Or then there must be other ways to mitigate the issue. Thus
-	 * locking would make no sense.
-	 */
-	ret = bd70528_get_direction(chip, offset);
-	if (ret == GPIO_LINE_DIRECTION_OUT)
-		ret = bd70528_gpio_get_o(bdgpio, offset);
-	else if (ret == GPIO_LINE_DIRECTION_IN)
-		ret = bd70528_gpio_get_i(bdgpio, offset);
-	else
-		dev_err(bdgpio->dev, "failed to read GPIO direction\n");
-
-	return ret;
-}
-
-static int bd70528_probe(struct platform_device *pdev)
-{
-	struct device *dev = &pdev->dev;
-	struct bd70528_gpio *bdgpio;
-	int ret;
-
-	bdgpio = devm_kzalloc(dev, sizeof(*bdgpio), GFP_KERNEL);
-	if (!bdgpio)
-		return -ENOMEM;
-	bdgpio->dev = dev;
-	bdgpio->gpio.parent = dev->parent;
-	bdgpio->gpio.label = "bd70528-gpio";
-	bdgpio->gpio.owner = THIS_MODULE;
-	bdgpio->gpio.get_direction = bd70528_get_direction;
-	bdgpio->gpio.direction_input = bd70528_direction_input;
-	bdgpio->gpio.direction_output = bd70528_direction_output;
-	bdgpio->gpio.set_config = bd70528_gpio_set_config;
-	bdgpio->gpio.can_sleep = true;
-	bdgpio->gpio.get = bd70528_gpio_get;
-	bdgpio->gpio.set = bd70528_gpio_set;
-	bdgpio->gpio.ngpio = 4;
-	bdgpio->gpio.base = -1;
-#ifdef CONFIG_OF_GPIO
-	bdgpio->gpio.of_node = dev->parent->of_node;
-#endif
-	bdgpio->regmap = dev_get_regmap(dev->parent, NULL);
-	if (!bdgpio->regmap)
-		return -ENODEV;
-
-	ret = devm_gpiochip_add_data(dev, &bdgpio->gpio, bdgpio);
-	if (ret)
-		dev_err(dev, "gpio_init: Failed to add bd70528-gpio\n");
-
-	return ret;
-}
-
-static struct platform_driver bd70528_gpio = {
-	.driver = {
-		.name = "bd70528-gpio"
-	},
-	.probe = bd70528_probe,
-};
-
-module_platform_driver(bd70528_gpio);
-
-MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
-MODULE_DESCRIPTION("BD70528 voltage regulator driver");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:bd70528-gpio");
-- 
2.25.4


-- 
Matti Vaittinen, Linux device drivers
ROHM Semiconductors, Finland SWDC
Kiviharjunlenkki 1E
90220 OULU
FINLAND

~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~
Simon says - in Latin please.
~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~
Thanks to Simon Glass for the translation =] 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 7/9] power: supply: Drop BD70528 support
  2021-05-25 10:13 [PATCH 0/9] Drop ROHM BD70528 support Matti Vaittinen
                   ` (5 preceding siblings ...)
  2021-05-25 10:15 ` [PATCH 6/9] gpio: bd70528 " Matti Vaittinen
@ 2021-05-25 10:15 ` Matti Vaittinen
  2021-06-04 10:10   ` Sebastian Reichel
  2021-05-25 10:16 ` [PATCH 8/9] mfd: bd70528: " Matti Vaittinen
                   ` (2 subsequent siblings)
  9 siblings, 1 reply; 20+ messages in thread
From: Matti Vaittinen @ 2021-05-25 10:15 UTC (permalink / raw)
  To: Matti Vaittinen, Matti Vaittinen
  Cc: Lee Jones, Rob Herring, Liam Girdwood, Mark Brown,
	Michael Turquette, Stephen Boyd, Matti Vaittinen, Linus Walleij,
	Bartosz Golaszewski, Sebastian Reichel, Alessandro Zummo,
	Alexandre Belloni, Wim Van Sebroeck, Guenter Roeck, devicetree,
	linux-kernel, linux-clk, linux-power, linux-gpio, linux-pm,
	linux-rtc, linux-watchdog

[-- Attachment #1: Type: text/plain, Size: 23717 bytes --]

The only known BD70528 use-cases are such that the PMIC is controlled
from separate MCU which is not running Linux. I am not aware of
any Linux driver users. Furthermore, it seems there is no demand for
this IC. Let's ease the maintenance burden and drop the driver. We can
always add it back if there is sudden need for it.

Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>

---
Please let me know if some of you think the driver is needed.
---
 drivers/power/supply/Kconfig           |   9 -
 drivers/power/supply/Makefile          |   1 -
 drivers/power/supply/bd70528-charger.c | 710 -------------------------
 3 files changed, 720 deletions(-)
 delete mode 100644 drivers/power/supply/bd70528-charger.c

diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
index e696364126f1..b99d19f48769 100644
--- a/drivers/power/supply/Kconfig
+++ b/drivers/power/supply/Kconfig
@@ -760,15 +760,6 @@ config CHARGER_UCS1002
 	  Say Y to enable support for Microchip UCS1002 Programmable
 	  USB Port Power Controller with Charger Emulation.
 
-config CHARGER_BD70528
-	tristate "ROHM bd70528 charger driver"
-	depends on MFD_ROHM_BD70528
-	select LINEAR_RANGES
-	help
-	  Say Y here to enable support for getting battery status
-	  information and altering charger configurations from charger
-	  block of the ROHM BD70528 Power Management IC.
-
 config CHARGER_BD99954
 	tristate "ROHM bd99954 charger driver"
 	depends on I2C
diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile
index a7309a3d1a47..7ad7d9a05523 100644
--- a/drivers/power/supply/Makefile
+++ b/drivers/power/supply/Makefile
@@ -96,7 +96,6 @@ obj-$(CONFIG_CHARGER_CROS_USBPD)	+= cros_usbpd-charger.o
 obj-$(CONFIG_CHARGER_SC2731)	+= sc2731_charger.o
 obj-$(CONFIG_FUEL_GAUGE_SC27XX)	+= sc27xx_fuel_gauge.o
 obj-$(CONFIG_CHARGER_UCS1002)	+= ucs1002_power.o
-obj-$(CONFIG_CHARGER_BD70528)	+= bd70528-charger.o
 obj-$(CONFIG_CHARGER_BD99954)	+= bd99954-charger.o
 obj-$(CONFIG_CHARGER_WILCO)	+= wilco-charger.o
 obj-$(CONFIG_RN5T618_POWER)	+= rn5t618_power.o
diff --git a/drivers/power/supply/bd70528-charger.c b/drivers/power/supply/bd70528-charger.c
deleted file mode 100644
index 7c1f0b99c71b..000000000000
--- a/drivers/power/supply/bd70528-charger.c
+++ /dev/null
@@ -1,710 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-//
-// Copyright (C) 2018 ROHM Semiconductors
-//
-// power-supply driver for ROHM BD70528 PMIC
-
-/*
- * BD70528 charger HW state machine.
- *
- * The thermal shutdown state is not drawn. From any other state but
- * battery error and suspend it is possible to go to TSD/TMP states
- * if temperature is out of bounds.
- *
- *  CHG_RST = H
- *  or CHG_EN=L
- *  or (DCIN2_UVLO=L && DCIN1_UVLO=L)
- *  or (DCIN2_OVLO=H & DCIN1_UVKLO=L)
- *
- *  +--------------+         +--------------+
- *  |              |         |              |
- *  |  Any state   +-------> |    Suspend   |
- *  |              |         |              |
- *  +--------------+         +------+-------+
- *                                  |
- *  CHG_EN = H && BAT_DET = H &&    |
- *  No errors (temp, bat_ov, UVLO,  |
- *  OVLO...)                        |
- *                                  |
- *  BAT_OV or             +---------v----------+
- *  (DBAT && TTRI)        |                    |
- *      +-----------------+   Trickle Charge   | <---------------+
- *      |                 |                    |                 |
- *      |                 +-------+------------+                 |
- *      |                         |                              |
- *      |                         |     ^                        |
- *      |        V_BAT > VTRI_TH  |     |  VBAT < VTRI_TH - 50mV |
- *      |                         |     |                        |
- *      |                         v     |                        |
- *      |                               |                        |
- *      |     BAT_OV or      +----------+----+                   |
- *      |     (DBAT && TFST) |               |                   |
- *      |   +----------------+  Fast Charge  |                   |
- *      |   |                |               |                   |
- *      v   v                +----+----------+                   |
- *                                |                              |
- *+----------------+   ILIM_DET=L |    ^ ILIM_DET                |
- *|                |   & CV_DET=H |    | or CV_DET=L             |
- *|  Battery Error |   & VBAT >   |    | or VBAT < VRECHG_TH     |
- *|                |   VRECHG_TH  |    | or IBAT  > IFST/x       |
- *+----------------+   & IBAT <   |    |                         |
- *                     IFST/x     v    |                         |
- *       ^                             |                         |
- *       |                   +---------+-+                       |
- *       |                   |           |                       |
- *       +-------------------+  Top OFF  |                       |
- *  BAT_OV = H or            |           |                       |
- *  (DBAT && TFST)           +-----+-----+                       |
- *                                 |                             |
- *           Stay top-off for 15s  |                             |
- *                                 v                             |
- *                                                               |
- *                            +--------+                         |
- *                            |        |                         |
- *                            |  Done  +-------------------------+
- *                            |        |
- *                            +--------+   VBAT < VRECHG_TH
- */
-
-#include <linux/kernel.h>
-#include <linux/interrupt.h>
-#include <linux/mfd/rohm-bd70528.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/power_supply.h>
-#include <linux/linear_range.h>
-
-#define CHG_STAT_SUSPEND	0x0
-#define CHG_STAT_TRICKLE	0x1
-#define CHG_STAT_FAST		0x3
-#define CHG_STAT_TOPOFF		0xe
-#define CHG_STAT_DONE		0xf
-#define CHG_STAT_OTP_TRICKLE	0x10
-#define CHG_STAT_OTP_FAST	0x11
-#define CHG_STAT_OTP_DONE	0x12
-#define CHG_STAT_TSD_TRICKLE	0x20
-#define CHG_STAT_TSD_FAST	0x21
-#define CHG_STAT_TSD_TOPOFF	0x22
-#define CHG_STAT_BAT_ERR	0x7f
-
-static const char *bd70528_charger_model = "BD70528";
-static const char *bd70528_charger_manufacturer = "ROHM Semiconductors";
-
-#define BD_ERR_IRQ_HND(_name_, _wrn_)					\
-static irqreturn_t bd0528_##_name_##_interrupt(int irq, void *arg)	\
-{									\
-	struct power_supply *psy = (struct power_supply *)arg;		\
-									\
-	power_supply_changed(psy);					\
-	dev_err(&psy->dev, (_wrn_));					\
-									\
-	return IRQ_HANDLED;						\
-}
-
-#define BD_INFO_IRQ_HND(_name_, _wrn_)					\
-static irqreturn_t bd0528_##_name_##_interrupt(int irq, void *arg)	\
-{									\
-	struct power_supply *psy = (struct power_supply *)arg;		\
-									\
-	power_supply_changed(psy);					\
-	dev_dbg(&psy->dev, (_wrn_));					\
-									\
-	return IRQ_HANDLED;						\
-}
-
-#define BD_IRQ_HND(_name_) bd0528_##_name_##_interrupt
-
-struct bd70528_psy {
-	struct regmap *regmap;
-	struct device *dev;
-	struct power_supply *psy;
-};
-
-BD_ERR_IRQ_HND(BAT_OV_DET, "Battery overvoltage detected\n");
-BD_ERR_IRQ_HND(DBAT_DET, "Dead battery detected\n");
-BD_ERR_IRQ_HND(COLD_DET, "Battery cold\n");
-BD_ERR_IRQ_HND(HOT_DET, "Battery hot\n");
-BD_ERR_IRQ_HND(CHG_TSD, "Charger thermal shutdown\n");
-BD_ERR_IRQ_HND(DCIN2_OV_DET, "DCIN2 overvoltage detected\n");
-
-BD_INFO_IRQ_HND(BAT_OV_RES, "Battery voltage back to normal\n");
-BD_INFO_IRQ_HND(COLD_RES, "Battery temperature back to normal\n");
-BD_INFO_IRQ_HND(HOT_RES, "Battery temperature back to normal\n");
-BD_INFO_IRQ_HND(BAT_RMV, "Battery removed\n");
-BD_INFO_IRQ_HND(BAT_DET, "Battery detected\n");
-BD_INFO_IRQ_HND(DCIN2_OV_RES, "DCIN2 voltage back to normal\n");
-BD_INFO_IRQ_HND(DCIN2_RMV, "DCIN2 removed\n");
-BD_INFO_IRQ_HND(DCIN2_DET, "DCIN2 detected\n");
-BD_INFO_IRQ_HND(DCIN1_RMV, "DCIN1 removed\n");
-BD_INFO_IRQ_HND(DCIN1_DET, "DCIN1 detected\n");
-
-struct irq_name_pair {
-	const char *n;
-	irqreturn_t (*h)(int irq, void *arg);
-};
-
-static int bd70528_get_irqs(struct platform_device *pdev,
-			    struct bd70528_psy *bdpsy)
-{
-	int irq, i, ret;
-	unsigned int mask;
-	static const struct irq_name_pair bd70528_chg_irqs[] = {
-		{ .n = "bd70528-bat-ov-res", .h = BD_IRQ_HND(BAT_OV_RES) },
-		{ .n = "bd70528-bat-ov-det", .h = BD_IRQ_HND(BAT_OV_DET) },
-		{ .n = "bd70528-bat-dead", .h = BD_IRQ_HND(DBAT_DET) },
-		{ .n = "bd70528-bat-warmed", .h = BD_IRQ_HND(COLD_RES) },
-		{ .n = "bd70528-bat-cold", .h = BD_IRQ_HND(COLD_DET) },
-		{ .n = "bd70528-bat-cooled", .h = BD_IRQ_HND(HOT_RES) },
-		{ .n = "bd70528-bat-hot", .h = BD_IRQ_HND(HOT_DET) },
-		{ .n = "bd70528-chg-tshd", .h = BD_IRQ_HND(CHG_TSD) },
-		{ .n = "bd70528-bat-removed", .h = BD_IRQ_HND(BAT_RMV) },
-		{ .n = "bd70528-bat-detected", .h = BD_IRQ_HND(BAT_DET) },
-		{ .n = "bd70528-dcin2-ov-res", .h = BD_IRQ_HND(DCIN2_OV_RES) },
-		{ .n = "bd70528-dcin2-ov-det", .h = BD_IRQ_HND(DCIN2_OV_DET) },
-		{ .n = "bd70528-dcin2-removed", .h = BD_IRQ_HND(DCIN2_RMV) },
-		{ .n = "bd70528-dcin2-detected", .h = BD_IRQ_HND(DCIN2_DET) },
-		{ .n = "bd70528-dcin1-removed", .h = BD_IRQ_HND(DCIN1_RMV) },
-		{ .n = "bd70528-dcin1-detected", .h = BD_IRQ_HND(DCIN1_DET) },
-	};
-
-	for (i = 0; i < ARRAY_SIZE(bd70528_chg_irqs); i++) {
-		irq = platform_get_irq_byname(pdev, bd70528_chg_irqs[i].n);
-		if (irq < 0) {
-			dev_err(&pdev->dev, "Bad IRQ information for %s (%d)\n",
-				bd70528_chg_irqs[i].n, irq);
-			return irq;
-		}
-		ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
-						bd70528_chg_irqs[i].h,
-						IRQF_ONESHOT,
-						bd70528_chg_irqs[i].n,
-						bdpsy->psy);
-
-		if (ret)
-			return ret;
-	}
-	/*
-	 * BD70528 irq controller is not touching the main mask register.
-	 * So enable the charger block interrupts at main level. We can just
-	 * leave them enabled as irq-controller should disable irqs
-	 * from sub-registers when IRQ is disabled or freed.
-	 */
-	mask = BD70528_REG_INT_BAT1_MASK | BD70528_REG_INT_BAT2_MASK;
-	ret = regmap_update_bits(bdpsy->regmap,
-				 BD70528_REG_INT_MAIN_MASK, mask, 0);
-	if (ret)
-		dev_err(&pdev->dev, "Failed to enable charger IRQs\n");
-
-	return ret;
-}
-
-static int bd70528_get_charger_status(struct bd70528_psy *bdpsy, int *val)
-{
-	int ret;
-	unsigned int v;
-
-	ret = regmap_read(bdpsy->regmap, BD70528_REG_CHG_CURR_STAT, &v);
-	if (ret) {
-		dev_err(bdpsy->dev, "Charger state read failure %d\n",
-			ret);
-		return ret;
-	}
-
-	switch (v & BD70528_MASK_CHG_STAT) {
-	case CHG_STAT_SUSPEND:
-	/* Maybe we should check the CHG_TTRI_EN? */
-	case CHG_STAT_OTP_TRICKLE:
-	case CHG_STAT_OTP_FAST:
-	case CHG_STAT_OTP_DONE:
-	case CHG_STAT_TSD_TRICKLE:
-	case CHG_STAT_TSD_FAST:
-	case CHG_STAT_TSD_TOPOFF:
-	case CHG_STAT_BAT_ERR:
-		*val = POWER_SUPPLY_STATUS_NOT_CHARGING;
-		break;
-	case CHG_STAT_DONE:
-		*val = POWER_SUPPLY_STATUS_FULL;
-		break;
-	case CHG_STAT_TRICKLE:
-	case CHG_STAT_FAST:
-	case CHG_STAT_TOPOFF:
-		*val = POWER_SUPPLY_STATUS_CHARGING;
-		break;
-	default:
-		*val = POWER_SUPPLY_STATUS_UNKNOWN;
-		break;
-	}
-
-	return 0;
-}
-
-static int bd70528_get_charge_type(struct bd70528_psy *bdpsy, int *val)
-{
-	int ret;
-	unsigned int v;
-
-	ret = regmap_read(bdpsy->regmap, BD70528_REG_CHG_CURR_STAT, &v);
-	if (ret) {
-		dev_err(bdpsy->dev, "Charger state read failure %d\n",
-			ret);
-		return ret;
-	}
-
-	switch (v & BD70528_MASK_CHG_STAT) {
-	case CHG_STAT_TRICKLE:
-		*val = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
-		break;
-	case CHG_STAT_FAST:
-	case CHG_STAT_TOPOFF:
-		*val = POWER_SUPPLY_CHARGE_TYPE_FAST;
-		break;
-	case CHG_STAT_DONE:
-	case CHG_STAT_SUSPEND:
-	/* Maybe we should check the CHG_TTRI_EN? */
-	case CHG_STAT_OTP_TRICKLE:
-	case CHG_STAT_OTP_FAST:
-	case CHG_STAT_OTP_DONE:
-	case CHG_STAT_TSD_TRICKLE:
-	case CHG_STAT_TSD_FAST:
-	case CHG_STAT_TSD_TOPOFF:
-	case CHG_STAT_BAT_ERR:
-		*val = POWER_SUPPLY_CHARGE_TYPE_NONE;
-		break;
-	default:
-		*val = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
-		break;
-	}
-
-	return 0;
-}
-
-static int bd70528_get_battery_health(struct bd70528_psy *bdpsy, int *val)
-{
-	int ret;
-	unsigned int v;
-
-	ret = regmap_read(bdpsy->regmap, BD70528_REG_CHG_BAT_STAT, &v);
-	if (ret) {
-		dev_err(bdpsy->dev, "Battery state read failure %d\n",
-			ret);
-		return ret;
-	}
-	/* No battery? */
-	if (!(v & BD70528_MASK_CHG_BAT_DETECT))
-		*val = POWER_SUPPLY_HEALTH_DEAD;
-	else if (v & BD70528_MASK_CHG_BAT_OVERVOLT)
-		*val = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
-	else if (v & BD70528_MASK_CHG_BAT_TIMER)
-		*val = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
-	else
-		*val = POWER_SUPPLY_HEALTH_GOOD;
-
-	return 0;
-}
-
-static int bd70528_get_online(struct bd70528_psy *bdpsy, int *val)
-{
-	int ret;
-	unsigned int v;
-
-	ret = regmap_read(bdpsy->regmap, BD70528_REG_CHG_IN_STAT, &v);
-	if (ret) {
-		dev_err(bdpsy->dev, "DC1 IN state read failure %d\n",
-			ret);
-		return ret;
-	}
-
-	*val = (v & BD70528_MASK_CHG_DCIN1_UVLO) ? 1 : 0;
-
-	return 0;
-}
-
-static int bd70528_get_present(struct bd70528_psy *bdpsy, int *val)
-{
-	int ret;
-	unsigned int v;
-
-	ret = regmap_read(bdpsy->regmap, BD70528_REG_CHG_BAT_STAT, &v);
-	if (ret) {
-		dev_err(bdpsy->dev, "Battery state read failure %d\n",
-			ret);
-		return ret;
-	}
-
-	*val = (v & BD70528_MASK_CHG_BAT_DETECT) ? 1 : 0;
-
-	return 0;
-}
-
-static const struct linear_range current_limit_ranges[] = {
-	{
-		.min = 5,
-		.step = 1,
-		.min_sel = 0,
-		.max_sel = 0x22,
-	},
-	{
-		.min = 40,
-		.step = 5,
-		.min_sel = 0x23,
-		.max_sel = 0x26,
-	},
-	{
-		.min = 60,
-		.step = 20,
-		.min_sel = 0x27,
-		.max_sel = 0x2d,
-	},
-	{
-		.min = 200,
-		.step = 50,
-		.min_sel = 0x2e,
-		.max_sel = 0x34,
-	},
-	{
-		.min = 500,
-		.step = 0,
-		.min_sel = 0x35,
-		.max_sel = 0x3f,
-	},
-};
-
-/*
- * BD70528 would support setting and getting own charge current/
- * voltage for low temperatures. The driver currently only reads
- * the charge current at room temperature. We do set both though.
- */
-static const struct linear_range warm_charge_curr[] = {
-	{
-		.min = 10,
-		.step = 10,
-		.min_sel = 0,
-		.max_sel = 0x12,
-	},
-	{
-		.min = 200,
-		.step = 25,
-		.min_sel = 0x13,
-		.max_sel = 0x1f,
-	},
-};
-
-/*
- * Cold charge current selectors are identical to warm charge current
- * selectors. The difference is that only smaller currents are available
- * at cold charge range.
- */
-#define MAX_COLD_CHG_CURR_SEL 0x15
-#define MAX_WARM_CHG_CURR_SEL 0x1f
-#define MIN_CHG_CURR_SEL 0x0
-
-static int get_charge_current(struct bd70528_psy *bdpsy, int *ma)
-{
-	unsigned int sel;
-	int ret;
-
-	ret = regmap_read(bdpsy->regmap, BD70528_REG_CHG_CHG_CURR_WARM,
-			  &sel);
-	if (ret) {
-		dev_err(bdpsy->dev,
-			"Charge current reading failed (%d)\n", ret);
-		return ret;
-	}
-
-	sel &= BD70528_MASK_CHG_CHG_CURR;
-
-	ret = linear_range_get_value_array(&warm_charge_curr[0],
-					   ARRAY_SIZE(warm_charge_curr),
-					   sel, ma);
-	if (ret) {
-		dev_err(bdpsy->dev,
-			"Unknown charge current value 0x%x\n",
-			sel);
-	}
-
-	return ret;
-}
-
-static int get_current_limit(struct bd70528_psy *bdpsy, int *ma)
-{
-	unsigned int sel;
-	int ret;
-
-	ret = regmap_read(bdpsy->regmap, BD70528_REG_CHG_DCIN_ILIM,
-			  &sel);
-
-	if (ret) {
-		dev_err(bdpsy->dev,
-			"Input current limit reading failed (%d)\n", ret);
-		return ret;
-	}
-
-	sel &= BD70528_MASK_CHG_DCIN_ILIM;
-
-	ret = linear_range_get_value_array(&current_limit_ranges[0],
-					   ARRAY_SIZE(current_limit_ranges),
-					   sel, ma);
-	if (ret) {
-		/* Unspecified values mean 500 mA */
-		*ma = 500;
-	}
-	return 0;
-}
-
-static enum power_supply_property bd70528_charger_props[] = {
-	POWER_SUPPLY_PROP_STATUS,
-	POWER_SUPPLY_PROP_CHARGE_TYPE,
-	POWER_SUPPLY_PROP_HEALTH,
-	POWER_SUPPLY_PROP_PRESENT,
-	POWER_SUPPLY_PROP_ONLINE,
-	POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
-	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
-	POWER_SUPPLY_PROP_MODEL_NAME,
-	POWER_SUPPLY_PROP_MANUFACTURER,
-};
-
-static int bd70528_charger_get_property(struct power_supply *psy,
-					enum power_supply_property psp,
-					union power_supply_propval *val)
-{
-	struct bd70528_psy *bdpsy = power_supply_get_drvdata(psy);
-	int ret = 0;
-
-	switch (psp) {
-	case POWER_SUPPLY_PROP_STATUS:
-		return bd70528_get_charger_status(bdpsy, &val->intval);
-	case POWER_SUPPLY_PROP_CHARGE_TYPE:
-		return bd70528_get_charge_type(bdpsy, &val->intval);
-	case POWER_SUPPLY_PROP_HEALTH:
-		return bd70528_get_battery_health(bdpsy, &val->intval);
-	case POWER_SUPPLY_PROP_PRESENT:
-		return bd70528_get_present(bdpsy, &val->intval);
-	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
-		ret = get_current_limit(bdpsy, &val->intval);
-		val->intval *= 1000;
-		return ret;
-	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
-		ret = get_charge_current(bdpsy, &val->intval);
-		val->intval *= 1000;
-		return ret;
-	case POWER_SUPPLY_PROP_ONLINE:
-		return bd70528_get_online(bdpsy, &val->intval);
-	case POWER_SUPPLY_PROP_MODEL_NAME:
-		val->strval = bd70528_charger_model;
-		return 0;
-	case POWER_SUPPLY_PROP_MANUFACTURER:
-		val->strval = bd70528_charger_manufacturer;
-		return 0;
-	default:
-		break;
-	}
-
-	return -EINVAL;
-}
-
-static int bd70528_prop_is_writable(struct power_supply *psy,
-				    enum power_supply_property psp)
-{
-	switch (psp) {
-	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
-	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
-		return 1;
-	default:
-		break;
-	}
-	return 0;
-}
-
-static int set_charge_current(struct bd70528_psy *bdpsy, int ma)
-{
-	unsigned int reg;
-	int ret = 0, tmpret;
-	bool found;
-
-	if (ma > 500) {
-		dev_warn(bdpsy->dev,
-			 "Requested charge current %u exceed maximum (500mA)\n",
-			 ma);
-		reg = MAX_WARM_CHG_CURR_SEL;
-		goto set;
-	}
-	if (ma < 10) {
-		dev_err(bdpsy->dev,
-			"Requested charge current %u smaller than min (10mA)\n",
-			 ma);
-		reg = MIN_CHG_CURR_SEL;
-		ret = -EINVAL;
-		goto set;
-	}
-
-/*
- * For BD70528 voltage/current limits we happily accept any value which
- * belongs the range. We could check if value matching the selector is
- * desired by computing the range min + (sel - sel_low) * range step - but
- * I guess it is enough if we use voltage/current which is closest (below)
- * the requested?
- */
-
-	ret = linear_range_get_selector_low_array(warm_charge_curr,
-						  ARRAY_SIZE(warm_charge_curr),
-						  ma, &reg, &found);
-	if (ret) {
-		dev_err(bdpsy->dev,
-			 "Unsupported charge current %u mA\n", ma);
-		reg = MIN_CHG_CURR_SEL;
-		goto set;
-	}
-	if (!found) {
-		/*
-		 * There was a gap in supported values and we hit it.
-		 * Yet a smaller value was found so we use it.
-		 */
-		dev_warn(bdpsy->dev,
-			 "Unsupported charge current %u mA\n", ma);
-	}
-set:
-
-	tmpret = regmap_update_bits(bdpsy->regmap,
-				    BD70528_REG_CHG_CHG_CURR_WARM,
-				    BD70528_MASK_CHG_CHG_CURR, reg);
-	if (tmpret)
-		dev_err(bdpsy->dev,
-			"Charge current write failure (%d)\n", tmpret);
-
-	if (reg > MAX_COLD_CHG_CURR_SEL)
-		reg = MAX_COLD_CHG_CURR_SEL;
-
-	if (!tmpret)
-		tmpret = regmap_update_bits(bdpsy->regmap,
-					    BD70528_REG_CHG_CHG_CURR_COLD,
-					    BD70528_MASK_CHG_CHG_CURR, reg);
-
-	if (!ret)
-		ret = tmpret;
-
-	return ret;
-}
-
-#define MAX_CURR_LIMIT_SEL 0x34
-#define MIN_CURR_LIMIT_SEL 0x0
-
-static int set_current_limit(struct bd70528_psy *bdpsy, int ma)
-{
-	unsigned int reg;
-	int ret = 0, tmpret;
-	bool found;
-
-	if (ma > 500) {
-		dev_warn(bdpsy->dev,
-			 "Requested current limit %u exceed maximum (500mA)\n",
-			 ma);
-		reg = MAX_CURR_LIMIT_SEL;
-		goto set;
-	}
-	if (ma < 5) {
-		dev_err(bdpsy->dev,
-			"Requested current limit %u smaller than min (5mA)\n",
-			ma);
-		reg = MIN_CURR_LIMIT_SEL;
-		ret = -EINVAL;
-		goto set;
-	}
-
-	ret = linear_range_get_selector_low_array(current_limit_ranges,
-					ARRAY_SIZE(current_limit_ranges),
-					ma, &reg, &found);
-	if (ret) {
-		dev_err(bdpsy->dev, "Unsupported current limit %umA\n", ma);
-		reg = MIN_CURR_LIMIT_SEL;
-		goto set;
-	}
-	if (!found) {
-		/*
-		 * There was a gap in supported values and we hit it.
-		 * We found a smaller value from ranges and use it.
-		 * Warn user though.
-		 */
-		dev_warn(bdpsy->dev, "Unsupported current limit %umA\n", ma);
-	}
-
-set:
-	tmpret = regmap_update_bits(bdpsy->regmap,
-				    BD70528_REG_CHG_DCIN_ILIM,
-				    BD70528_MASK_CHG_DCIN_ILIM, reg);
-
-	if (!ret)
-		ret = tmpret;
-
-	return ret;
-}
-
-static int bd70528_charger_set_property(struct power_supply *psy,
-					enum power_supply_property psp,
-					const union power_supply_propval *val)
-{
-	struct bd70528_psy *bdpsy = power_supply_get_drvdata(psy);
-
-	switch (psp) {
-	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
-		return set_current_limit(bdpsy, val->intval / 1000);
-	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
-		return set_charge_current(bdpsy, val->intval / 1000);
-	default:
-		break;
-	}
-	return -EINVAL;
-}
-
-static const struct power_supply_desc bd70528_charger_desc = {
-	.name		= "bd70528-charger",
-	.type		= POWER_SUPPLY_TYPE_MAINS,
-	.properties	= bd70528_charger_props,
-	.num_properties	= ARRAY_SIZE(bd70528_charger_props),
-	.get_property	= bd70528_charger_get_property,
-	.set_property	= bd70528_charger_set_property,
-	.property_is_writeable	= bd70528_prop_is_writable,
-};
-
-static int bd70528_power_probe(struct platform_device *pdev)
-{
-	struct bd70528_psy *bdpsy;
-	struct power_supply_config cfg = {};
-
-	bdpsy = devm_kzalloc(&pdev->dev, sizeof(*bdpsy), GFP_KERNEL);
-	if (!bdpsy)
-		return -ENOMEM;
-
-	bdpsy->regmap = dev_get_regmap(pdev->dev.parent, NULL);
-	if (!bdpsy->regmap) {
-		dev_err(&pdev->dev, "No regmap found for chip\n");
-		return -EINVAL;
-	}
-	bdpsy->dev = &pdev->dev;
-
-	platform_set_drvdata(pdev, bdpsy);
-	cfg.drv_data = bdpsy;
-	cfg.of_node = pdev->dev.parent->of_node;
-
-	bdpsy->psy = devm_power_supply_register(&pdev->dev,
-						&bd70528_charger_desc, &cfg);
-	if (IS_ERR(bdpsy->psy)) {
-		dev_err(&pdev->dev, "failed: power supply register\n");
-		return PTR_ERR(bdpsy->psy);
-	}
-
-	return bd70528_get_irqs(pdev, bdpsy);
-}
-
-static struct platform_driver bd70528_power = {
-	.driver = {
-		.name = "bd70528-power"
-	},
-	.probe = bd70528_power_probe,
-};
-
-module_platform_driver(bd70528_power);
-
-MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
-MODULE_DESCRIPTION("BD70528 power-supply driver");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:bd70528-power");
-- 
2.25.4


-- 
Matti Vaittinen, Linux device drivers
ROHM Semiconductors, Finland SWDC
Kiviharjunlenkki 1E
90220 OULU
FINLAND

~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~
Simon says - in Latin please.
~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~
Thanks to Simon Glass for the translation =] 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 8/9] mfd: bd70528: Drop BD70528 support
  2021-05-25 10:13 [PATCH 0/9] Drop ROHM BD70528 support Matti Vaittinen
                   ` (6 preceding siblings ...)
  2021-05-25 10:15 ` [PATCH 7/9] power: supply: " Matti Vaittinen
@ 2021-05-25 10:16 ` Matti Vaittinen
  2021-06-01 15:48   ` Lee Jones
  2021-05-25 10:16 ` [PATCH 9/9] MAINTAINERS: bd70528: Drop ROHM BD70528 drivers Matti Vaittinen
  2021-05-27 10:35 ` [PATCH 0/9] Drop ROHM BD70528 support Vaittinen, Matti
  9 siblings, 1 reply; 20+ messages in thread
From: Matti Vaittinen @ 2021-05-25 10:16 UTC (permalink / raw)
  To: Matti Vaittinen, Matti Vaittinen
  Cc: Lee Jones, Rob Herring, Liam Girdwood, Mark Brown,
	Michael Turquette, Stephen Boyd, Matti Vaittinen, Linus Walleij,
	Bartosz Golaszewski, Sebastian Reichel, Alessandro Zummo,
	Alexandre Belloni, Wim Van Sebroeck, Guenter Roeck, devicetree,
	linux-kernel, linux-clk, linux-power, linux-gpio, linux-pm,
	linux-rtc, linux-watchdog

[-- Attachment #1: Type: text/plain, Size: 28012 bytes --]

The only known BD70528 use-cases are such that the PMIC is controlled
from separate MCU which is not running Linux. I am not aware of
any Linux driver users. Furthermore, it seems there is no demand for
this IC. Let's ease the maintenance burden and drop the driver. We can
always add it back if there is sudden need for it.

Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>

---
Please let me know if some of you think the driver is needed.
---
 drivers/mfd/Kconfig              |  17 --
 drivers/mfd/Makefile             |   1 -
 drivers/mfd/rohm-bd70528.c       | 314 -------------------------
 include/linux/mfd/rohm-bd70528.h | 391 -------------------------------
 include/linux/mfd/rohm-generic.h |   1 -
 5 files changed, 724 deletions(-)
 delete mode 100644 drivers/mfd/rohm-bd70528.c
 delete mode 100644 include/linux/mfd/rohm-bd70528.h

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 5c7f2b100191..810f2ef9eba9 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1945,23 +1945,6 @@ config MFD_ROHM_BD718XX
 	  NXP i.MX8. It contains 8 BUCK outputs and 7 LDOs, voltage monitoring
 	  and emergency shut down as well as 32,768KHz clock output.
 
-config MFD_ROHM_BD70528
-	tristate "ROHM BD70528 Power Management IC"
-	depends on I2C=y
-	depends on OF
-	select REGMAP_I2C
-	select REGMAP_IRQ
-	select MFD_CORE
-	help
-	  Select this option to get support for the ROHM BD70528 Power
-	  Management IC. BD71837 is general purpose single-chip power
-	  management IC for battery-powered portable devices. It contains
-	  3 ultra-low current consumption buck converters, 3 LDOs and 2 LED
-	  drivers. Also included are 4 GPIOs, a real-time clock (RTC), a 32kHz
-	  crystal oscillator, high-accuracy VREF for use with an external ADC,
-	  10 bits SAR ADC for battery temperature monitor and 1S battery
-	  charger.
-
 config MFD_ROHM_BD71828
 	tristate "ROHM BD71828 and BD71815 Power Management IC"
 	depends on I2C=y
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 4f6d2b8a5f76..2ce5436bb8d4 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -257,7 +257,6 @@ obj-$(CONFIG_MFD_STM32_TIMERS) 	+= stm32-timers.o
 obj-$(CONFIG_MFD_MXS_LRADC)     += mxs-lradc.o
 obj-$(CONFIG_MFD_SC27XX_PMIC)	+= sprd-sc27xx-spi.o
 obj-$(CONFIG_RAVE_SP_CORE)	+= rave-sp.o
-obj-$(CONFIG_MFD_ROHM_BD70528)	+= rohm-bd70528.o
 obj-$(CONFIG_MFD_ROHM_BD71828)	+= rohm-bd71828.o
 obj-$(CONFIG_MFD_ROHM_BD718XX)	+= rohm-bd718x7.o
 obj-$(CONFIG_MFD_ROHM_BD957XMUF)	+= rohm-bd9576.o
diff --git a/drivers/mfd/rohm-bd70528.c b/drivers/mfd/rohm-bd70528.c
deleted file mode 100644
index 5c44d3b77b3e..000000000000
--- a/drivers/mfd/rohm-bd70528.c
+++ /dev/null
@@ -1,314 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-//
-// Copyright (C) 2019 ROHM Semiconductors
-//
-// ROHM BD70528 PMIC driver
-
-#include <linux/i2c.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/irq.h>
-#include <linux/mfd/core.h>
-#include <linux/mfd/rohm-bd70528.h>
-#include <linux/module.h>
-#include <linux/of_device.h>
-#include <linux/regmap.h>
-#include <linux/types.h>
-
-#define BD70528_NUM_OF_GPIOS 4
-
-static const struct resource rtc_irqs[] = {
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_RTC_ALARM, "bd70528-rtc-alm"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_ELPS_TIM, "bd70528-elapsed-timer"),
-};
-
-static const struct resource charger_irqs[] = {
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_BAT_OV_RES, "bd70528-bat-ov-res"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_BAT_OV_DET, "bd70528-bat-ov-det"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_DBAT_DET, "bd70528-bat-dead"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_BATTSD_COLD_RES, "bd70528-bat-warmed"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_BATTSD_COLD_DET, "bd70528-bat-cold"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_BATTSD_HOT_RES, "bd70528-bat-cooled"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_BATTSD_HOT_DET, "bd70528-bat-hot"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_CHG_TSD, "bd70528-chg-tshd"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_BAT_RMV, "bd70528-bat-removed"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_BAT_DET, "bd70528-bat-detected"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_DCIN2_OV_RES, "bd70528-dcin2-ov-res"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_DCIN2_OV_DET, "bd70528-dcin2-ov-det"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_DCIN2_RMV, "bd70528-dcin2-removed"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_DCIN2_DET, "bd70528-dcin2-detected"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_DCIN1_RMV, "bd70528-dcin1-removed"),
-	DEFINE_RES_IRQ_NAMED(BD70528_INT_DCIN1_DET, "bd70528-dcin1-detected"),
-};
-
-static struct mfd_cell bd70528_mfd_cells[] = {
-	{ .name = "bd70528-pmic", },
-	{ .name = "bd70528-gpio", },
-	/*
-	 * We use BD71837 driver to drive the clock block. Only differences to
-	 * BD70528 clock gate are the register address and mask.
-	 */
-	{ .name = "bd70528-clk", },
-	{ .name = "bd70528-wdt", },
-	{
-		.name = "bd70528-power",
-		.resources = charger_irqs,
-		.num_resources = ARRAY_SIZE(charger_irqs),
-	}, {
-		.name = "bd70528-rtc",
-		.resources = rtc_irqs,
-		.num_resources = ARRAY_SIZE(rtc_irqs),
-	},
-};
-
-static const struct regmap_range volatile_ranges[] = {
-	{
-		.range_min = BD70528_REG_INT_MAIN,
-		.range_max = BD70528_REG_INT_OP_FAIL,
-	}, {
-		.range_min = BD70528_REG_RTC_COUNT_H,
-		.range_max = BD70528_REG_RTC_ALM_REPEAT,
-	}, {
-		/*
-		 * WDT control reg is special. Magic values must be written to
-		 * it in order to change the control. Should not be cached.
-		 */
-		.range_min = BD70528_REG_WDT_CTRL,
-		.range_max = BD70528_REG_WDT_CTRL,
-	}, {
-		/*
-		 * BD70528 also contains a few other registers which require
-		 * magic sequences to be written in order to update the value.
-		 * At least SHIPMODE, HWRESET, WARMRESET,and STANDBY
-		 */
-		.range_min = BD70528_REG_SHIPMODE,
-		.range_max = BD70528_REG_STANDBY,
-	},
-};
-
-static const struct regmap_access_table volatile_regs = {
-	.yes_ranges = &volatile_ranges[0],
-	.n_yes_ranges = ARRAY_SIZE(volatile_ranges),
-};
-
-static struct regmap_config bd70528_regmap = {
-	.reg_bits = 8,
-	.val_bits = 8,
-	.volatile_table = &volatile_regs,
-	.max_register = BD70528_MAX_REGISTER,
-	.cache_type = REGCACHE_RBTREE,
-};
-
-/*
- * Mapping of main IRQ register bits to sub-IRQ register offsets so that we can
- * access corect sub-IRQ registers based on bits that are set in main IRQ
- * register.
- */
-
-static unsigned int bit0_offsets[] = {0};	/* Shutdown */
-static unsigned int bit1_offsets[] = {1};	/* Power failure */
-static unsigned int bit2_offsets[] = {2};	/* VR FAULT */
-static unsigned int bit3_offsets[] = {3};	/* PMU interrupts */
-static unsigned int bit4_offsets[] = {4, 5};	/* Charger 1 and Charger 2 */
-static unsigned int bit5_offsets[] = {6};	/* RTC */
-static unsigned int bit6_offsets[] = {7};	/* GPIO */
-static unsigned int bit7_offsets[] = {8};	/* Invalid operation */
-
-static struct regmap_irq_sub_irq_map bd70528_sub_irq_offsets[] = {
-	REGMAP_IRQ_MAIN_REG_OFFSET(bit0_offsets),
-	REGMAP_IRQ_MAIN_REG_OFFSET(bit1_offsets),
-	REGMAP_IRQ_MAIN_REG_OFFSET(bit2_offsets),
-	REGMAP_IRQ_MAIN_REG_OFFSET(bit3_offsets),
-	REGMAP_IRQ_MAIN_REG_OFFSET(bit4_offsets),
-	REGMAP_IRQ_MAIN_REG_OFFSET(bit5_offsets),
-	REGMAP_IRQ_MAIN_REG_OFFSET(bit6_offsets),
-	REGMAP_IRQ_MAIN_REG_OFFSET(bit7_offsets),
-};
-
-static struct regmap_irq bd70528_irqs[] = {
-	REGMAP_IRQ_REG(BD70528_INT_LONGPUSH, 0, BD70528_INT_LONGPUSH_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_WDT, 0, BD70528_INT_WDT_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_HWRESET, 0, BD70528_INT_HWRESET_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_RSTB_FAULT, 0, BD70528_INT_RSTB_FAULT_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_VBAT_UVLO, 0, BD70528_INT_VBAT_UVLO_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_TSD, 0, BD70528_INT_TSD_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_RSTIN, 0, BD70528_INT_RSTIN_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BUCK1_FAULT, 1,
-		       BD70528_INT_BUCK1_FAULT_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BUCK2_FAULT, 1,
-		       BD70528_INT_BUCK2_FAULT_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BUCK3_FAULT, 1,
-		       BD70528_INT_BUCK3_FAULT_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_LDO1_FAULT, 1, BD70528_INT_LDO1_FAULT_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_LDO2_FAULT, 1, BD70528_INT_LDO2_FAULT_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_LDO3_FAULT, 1, BD70528_INT_LDO3_FAULT_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_LED1_FAULT, 1, BD70528_INT_LED1_FAULT_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_LED2_FAULT, 1, BD70528_INT_LED2_FAULT_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BUCK1_OCP, 2, BD70528_INT_BUCK1_OCP_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BUCK2_OCP, 2, BD70528_INT_BUCK2_OCP_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BUCK3_OCP, 2, BD70528_INT_BUCK3_OCP_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_LED1_OCP, 2, BD70528_INT_LED1_OCP_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_LED2_OCP, 2, BD70528_INT_LED2_OCP_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BUCK1_FULLON, 2,
-		       BD70528_INT_BUCK1_FULLON_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BUCK2_FULLON, 2,
-		       BD70528_INT_BUCK2_FULLON_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_SHORTPUSH, 3, BD70528_INT_SHORTPUSH_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_AUTO_WAKEUP, 3,
-		       BD70528_INT_AUTO_WAKEUP_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_STATE_CHANGE, 3,
-		       BD70528_INT_STATE_CHANGE_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BAT_OV_RES, 4, BD70528_INT_BAT_OV_RES_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BAT_OV_DET, 4, BD70528_INT_BAT_OV_DET_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_DBAT_DET, 4, BD70528_INT_DBAT_DET_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BATTSD_COLD_RES, 4,
-		       BD70528_INT_BATTSD_COLD_RES_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BATTSD_COLD_DET, 4,
-		       BD70528_INT_BATTSD_COLD_DET_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BATTSD_HOT_RES, 4,
-		       BD70528_INT_BATTSD_HOT_RES_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BATTSD_HOT_DET, 4,
-		       BD70528_INT_BATTSD_HOT_DET_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_CHG_TSD, 4, BD70528_INT_CHG_TSD_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BAT_RMV, 5, BD70528_INT_BAT_RMV_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BAT_DET, 5, BD70528_INT_BAT_DET_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_DCIN2_OV_RES, 5,
-		       BD70528_INT_DCIN2_OV_RES_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_DCIN2_OV_DET, 5,
-		       BD70528_INT_DCIN2_OV_DET_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_DCIN2_RMV, 5, BD70528_INT_DCIN2_RMV_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_DCIN2_DET, 5, BD70528_INT_DCIN2_DET_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_DCIN1_RMV, 5, BD70528_INT_DCIN1_RMV_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_DCIN1_DET, 5, BD70528_INT_DCIN1_DET_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_RTC_ALARM, 6, BD70528_INT_RTC_ALARM_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_ELPS_TIM, 6, BD70528_INT_ELPS_TIM_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_GPIO0, 7, BD70528_INT_GPIO0_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_GPIO1, 7, BD70528_INT_GPIO1_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_GPIO2, 7, BD70528_INT_GPIO2_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_GPIO3, 7, BD70528_INT_GPIO3_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BUCK1_DVS_OPFAIL, 8,
-		       BD70528_INT_BUCK1_DVS_OPFAIL_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BUCK2_DVS_OPFAIL, 8,
-		       BD70528_INT_BUCK2_DVS_OPFAIL_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_BUCK3_DVS_OPFAIL, 8,
-		       BD70528_INT_BUCK3_DVS_OPFAIL_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_LED1_VOLT_OPFAIL, 8,
-		       BD70528_INT_LED1_VOLT_OPFAIL_MASK),
-	REGMAP_IRQ_REG(BD70528_INT_LED2_VOLT_OPFAIL, 8,
-		       BD70528_INT_LED2_VOLT_OPFAIL_MASK),
-};
-
-static struct regmap_irq_chip bd70528_irq_chip = {
-	.name = "bd70528_irq",
-	.main_status = BD70528_REG_INT_MAIN,
-	.irqs = &bd70528_irqs[0],
-	.num_irqs = ARRAY_SIZE(bd70528_irqs),
-	.status_base = BD70528_REG_INT_SHDN,
-	.mask_base = BD70528_REG_INT_SHDN_MASK,
-	.ack_base = BD70528_REG_INT_SHDN,
-	.type_base = BD70528_REG_GPIO1_IN,
-	.init_ack_masked = true,
-	.num_regs = 9,
-	.num_main_regs = 1,
-	.num_type_reg = 4,
-	.sub_reg_offsets = &bd70528_sub_irq_offsets[0],
-	.num_main_status_bits = 8,
-	.irq_reg_stride = 1,
-};
-
-static int bd70528_i2c_probe(struct i2c_client *i2c,
-			     const struct i2c_device_id *id)
-{
-	struct bd70528_data *bd70528;
-	struct regmap_irq_chip_data *irq_data;
-	int ret, i;
-
-	if (!i2c->irq) {
-		dev_err(&i2c->dev, "No IRQ configured\n");
-		return -EINVAL;
-	}
-
-	bd70528 = devm_kzalloc(&i2c->dev, sizeof(*bd70528), GFP_KERNEL);
-	if (!bd70528)
-		return -ENOMEM;
-
-	mutex_init(&bd70528->rtc_timer_lock);
-
-	dev_set_drvdata(&i2c->dev, &bd70528->chip);
-
-	bd70528->chip.regmap = devm_regmap_init_i2c(i2c, &bd70528_regmap);
-	if (IS_ERR(bd70528->chip.regmap)) {
-		dev_err(&i2c->dev, "Failed to initialize Regmap\n");
-		return PTR_ERR(bd70528->chip.regmap);
-	}
-
-	/*
-	 * Disallow type setting for all IRQs by default as most of them do not
-	 * support setting type.
-	 */
-	for (i = 0; i < ARRAY_SIZE(bd70528_irqs); i++)
-		bd70528_irqs[i].type.types_supported = 0;
-
-	/* Set IRQ typesetting information for GPIO pins 0 - 3 */
-	for (i = 0; i < BD70528_NUM_OF_GPIOS; i++) {
-		struct regmap_irq_type *type;
-
-		type = &bd70528_irqs[BD70528_INT_GPIO0 + i].type;
-		type->type_reg_offset = 2 * i;
-		type->type_rising_val = 0x20;
-		type->type_falling_val = 0x10;
-		type->type_level_high_val = 0x40;
-		type->type_level_low_val = 0x50;
-		type->types_supported = (IRQ_TYPE_EDGE_BOTH |
-				IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW);
-	}
-
-	ret = devm_regmap_add_irq_chip(&i2c->dev, bd70528->chip.regmap,
-				       i2c->irq, IRQF_ONESHOT, 0,
-				       &bd70528_irq_chip, &irq_data);
-	if (ret) {
-		dev_err(&i2c->dev, "Failed to add IRQ chip\n");
-		return ret;
-	}
-	dev_dbg(&i2c->dev, "Registered %d IRQs for chip\n",
-		bd70528_irq_chip.num_irqs);
-
-	/*
-	 * BD70528 IRQ controller is not touching the main mask register.
-	 * So enable the GPIO block interrupts at main level. We can just leave
-	 * them enabled as the IRQ controller should disable IRQs from
-	 * sub-registers when IRQ is disabled or freed.
-	 */
-	ret = regmap_update_bits(bd70528->chip.regmap,
-				 BD70528_REG_INT_MAIN_MASK,
-				 BD70528_INT_GPIO_MASK, 0);
-
-	ret = devm_mfd_add_devices(&i2c->dev, PLATFORM_DEVID_AUTO,
-				   bd70528_mfd_cells,
-				   ARRAY_SIZE(bd70528_mfd_cells), NULL, 0,
-				   regmap_irq_get_domain(irq_data));
-	if (ret)
-		dev_err(&i2c->dev, "Failed to create subdevices\n");
-
-	return ret;
-}
-
-static const struct of_device_id bd70528_of_match[] = {
-	{ .compatible = "rohm,bd70528", },
-	{ },
-};
-MODULE_DEVICE_TABLE(of, bd70528_of_match);
-
-static struct i2c_driver bd70528_drv = {
-	.driver = {
-		.name = "rohm-bd70528",
-		.of_match_table = bd70528_of_match,
-	},
-	.probe = &bd70528_i2c_probe,
-};
-
-module_i2c_driver(bd70528_drv);
-
-MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
-MODULE_DESCRIPTION("ROHM BD70528 Power Management IC driver");
-MODULE_LICENSE("GPL");
diff --git a/include/linux/mfd/rohm-bd70528.h b/include/linux/mfd/rohm-bd70528.h
deleted file mode 100644
index a57af878fd0c..000000000000
--- a/include/linux/mfd/rohm-bd70528.h
+++ /dev/null
@@ -1,391 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-/* Copyright (C) 2018 ROHM Semiconductors */
-
-#ifndef __LINUX_MFD_BD70528_H__
-#define __LINUX_MFD_BD70528_H__
-
-#include <linux/bits.h>
-#include <linux/device.h>
-#include <linux/mfd/rohm-generic.h>
-#include <linux/mfd/rohm-shared.h>
-#include <linux/regmap.h>
-
-enum {
-	BD70528_BUCK1,
-	BD70528_BUCK2,
-	BD70528_BUCK3,
-	BD70528_LDO1,
-	BD70528_LDO2,
-	BD70528_LDO3,
-	BD70528_LED1,
-	BD70528_LED2,
-};
-
-struct bd70528_data {
-	struct rohm_regmap_dev chip;
-	struct mutex rtc_timer_lock;
-};
-
-#define BD70528_BUCK_VOLTS 17
-#define BD70528_BUCK_VOLTS 17
-#define BD70528_BUCK_VOLTS 17
-#define BD70528_LDO_VOLTS 0x20
-
-#define BD70528_REG_BUCK1_EN	0x0F
-#define BD70528_REG_BUCK1_VOLT	0x15
-#define BD70528_REG_BUCK2_EN	0x10
-#define BD70528_REG_BUCK2_VOLT	0x16
-#define BD70528_REG_BUCK3_EN	0x11
-#define BD70528_REG_BUCK3_VOLT	0x17
-#define BD70528_REG_LDO1_EN	0x1b
-#define BD70528_REG_LDO1_VOLT	0x1e
-#define BD70528_REG_LDO2_EN	0x1c
-#define BD70528_REG_LDO2_VOLT	0x1f
-#define BD70528_REG_LDO3_EN	0x1d
-#define BD70528_REG_LDO3_VOLT	0x20
-#define BD70528_REG_LED_CTRL	0x2b
-#define BD70528_REG_LED_VOLT	0x29
-#define BD70528_REG_LED_EN	0x2a
-
-/* main irq registers */
-#define BD70528_REG_INT_MAIN	0x7E
-#define BD70528_REG_INT_MAIN_MASK 0x74
-
-/* 'sub irq' registers */
-#define BD70528_REG_INT_SHDN	0x7F
-#define BD70528_REG_INT_PWR_FLT	0x80
-#define BD70528_REG_INT_VR_FLT	0x81
-#define BD70528_REG_INT_MISC	0x82
-#define BD70528_REG_INT_BAT1	0x83
-#define BD70528_REG_INT_BAT2	0x84
-#define BD70528_REG_INT_RTC	0x85
-#define BD70528_REG_INT_GPIO	0x86
-#define BD70528_REG_INT_OP_FAIL	0x87
-
-#define BD70528_REG_INT_SHDN_MASK	0x75
-#define BD70528_REG_INT_PWR_FLT_MASK	0x76
-#define BD70528_REG_INT_VR_FLT_MASK	0x77
-#define BD70528_REG_INT_MISC_MASK	0x78
-#define BD70528_REG_INT_BAT1_MASK	0x79
-#define BD70528_REG_INT_BAT2_MASK	0x7a
-#define BD70528_REG_INT_RTC_MASK	0x7b
-#define BD70528_REG_INT_GPIO_MASK	0x7c
-#define BD70528_REG_INT_OP_FAIL_MASK	0x7d
-
-/* Reset related 'magic' registers */
-#define BD70528_REG_SHIPMODE	0x03
-#define BD70528_REG_HWRESET	0x04
-#define BD70528_REG_WARMRESET	0x05
-#define BD70528_REG_STANDBY	0x06
-
-/* GPIO registers */
-#define BD70528_REG_GPIO_STATE	0x8F
-
-#define BD70528_REG_GPIO1_IN	0x4d
-#define BD70528_REG_GPIO2_IN	0x4f
-#define BD70528_REG_GPIO3_IN	0x51
-#define BD70528_REG_GPIO4_IN	0x53
-#define BD70528_REG_GPIO1_OUT	0x4e
-#define BD70528_REG_GPIO2_OUT	0x50
-#define BD70528_REG_GPIO3_OUT	0x52
-#define BD70528_REG_GPIO4_OUT	0x54
-
-/* RTC */
-
-#define BD70528_REG_RTC_COUNT_H		0x2d
-#define BD70528_REG_RTC_COUNT_L		0x2e
-#define BD70528_REG_RTC_SEC		0x2f
-#define BD70528_REG_RTC_MINUTE		0x30
-#define BD70528_REG_RTC_HOUR		0x31
-#define BD70528_REG_RTC_WEEK		0x32
-#define BD70528_REG_RTC_DAY		0x33
-#define BD70528_REG_RTC_MONTH		0x34
-#define BD70528_REG_RTC_YEAR		0x35
-
-#define BD70528_REG_RTC_ALM_SEC		0x36
-#define BD70528_REG_RTC_ALM_START	BD70528_REG_RTC_ALM_SEC
-#define BD70528_REG_RTC_ALM_MINUTE	0x37
-#define BD70528_REG_RTC_ALM_HOUR	0x38
-#define BD70528_REG_RTC_ALM_WEEK	0x39
-#define BD70528_REG_RTC_ALM_DAY		0x3a
-#define BD70528_REG_RTC_ALM_MONTH	0x3b
-#define BD70528_REG_RTC_ALM_YEAR	0x3c
-#define BD70528_REG_RTC_ALM_MASK	0x3d
-#define BD70528_REG_RTC_ALM_REPEAT	0x3e
-#define BD70528_REG_RTC_START		BD70528_REG_RTC_SEC
-
-#define BD70528_REG_RTC_WAKE_SEC	0x43
-#define BD70528_REG_RTC_WAKE_START	BD70528_REG_RTC_WAKE_SEC
-#define BD70528_REG_RTC_WAKE_MIN	0x44
-#define BD70528_REG_RTC_WAKE_HOUR	0x45
-#define BD70528_REG_RTC_WAKE_CTRL	0x46
-
-#define BD70528_REG_ELAPSED_TIMER_EN	0x42
-#define BD70528_REG_WAKE_EN		0x46
-
-/* WDT registers */
-#define BD70528_REG_WDT_CTRL		0x4A
-#define BD70528_REG_WDT_HOUR		0x49
-#define BD70528_REG_WDT_MINUTE		0x48
-#define BD70528_REG_WDT_SEC		0x47
-
-/* Charger / Battery */
-#define BD70528_REG_CHG_CURR_STAT	0x59
-#define BD70528_REG_CHG_BAT_STAT	0x57
-#define BD70528_REG_CHG_BAT_TEMP	0x58
-#define BD70528_REG_CHG_IN_STAT		0x56
-#define BD70528_REG_CHG_DCIN_ILIM	0x5d
-#define BD70528_REG_CHG_CHG_CURR_WARM	0x61
-#define BD70528_REG_CHG_CHG_CURR_COLD	0x62
-
-/* Masks for main IRQ register bits */
-enum {
-	BD70528_INT_SHDN,
-#define BD70528_INT_SHDN_MASK BIT(BD70528_INT_SHDN)
-	BD70528_INT_PWR_FLT,
-#define BD70528_INT_PWR_FLT_MASK BIT(BD70528_INT_PWR_FLT)
-	BD70528_INT_VR_FLT,
-#define BD70528_INT_VR_FLT_MASK BIT(BD70528_INT_VR_FLT)
-	BD70528_INT_MISC,
-#define BD70528_INT_MISC_MASK BIT(BD70528_INT_MISC)
-	BD70528_INT_BAT1,
-#define BD70528_INT_BAT1_MASK BIT(BD70528_INT_BAT1)
-	BD70528_INT_RTC,
-#define BD70528_INT_RTC_MASK BIT(BD70528_INT_RTC)
-	BD70528_INT_GPIO,
-#define BD70528_INT_GPIO_MASK BIT(BD70528_INT_GPIO)
-	BD70528_INT_OP_FAIL,
-#define BD70528_INT_OP_FAIL_MASK BIT(BD70528_INT_OP_FAIL)
-};
-
-/* IRQs */
-enum {
-	/* Shutdown register IRQs */
-	BD70528_INT_LONGPUSH,
-	BD70528_INT_WDT,
-	BD70528_INT_HWRESET,
-	BD70528_INT_RSTB_FAULT,
-	BD70528_INT_VBAT_UVLO,
-	BD70528_INT_TSD,
-	BD70528_INT_RSTIN,
-	/* Power failure register IRQs */
-	BD70528_INT_BUCK1_FAULT,
-	BD70528_INT_BUCK2_FAULT,
-	BD70528_INT_BUCK3_FAULT,
-	BD70528_INT_LDO1_FAULT,
-	BD70528_INT_LDO2_FAULT,
-	BD70528_INT_LDO3_FAULT,
-	BD70528_INT_LED1_FAULT,
-	BD70528_INT_LED2_FAULT,
-	/* VR FAULT register IRQs */
-	BD70528_INT_BUCK1_OCP,
-	BD70528_INT_BUCK2_OCP,
-	BD70528_INT_BUCK3_OCP,
-	BD70528_INT_LED1_OCP,
-	BD70528_INT_LED2_OCP,
-	BD70528_INT_BUCK1_FULLON,
-	BD70528_INT_BUCK2_FULLON,
-	/* PMU register interrupts */
-	BD70528_INT_SHORTPUSH,
-	BD70528_INT_AUTO_WAKEUP,
-	BD70528_INT_STATE_CHANGE,
-	/* Charger 1 register IRQs */
-	BD70528_INT_BAT_OV_RES,
-	BD70528_INT_BAT_OV_DET,
-	BD70528_INT_DBAT_DET,
-	BD70528_INT_BATTSD_COLD_RES,
-	BD70528_INT_BATTSD_COLD_DET,
-	BD70528_INT_BATTSD_HOT_RES,
-	BD70528_INT_BATTSD_HOT_DET,
-	BD70528_INT_CHG_TSD,
-	/* Charger 2 register IRQs */
-	BD70528_INT_BAT_RMV,
-	BD70528_INT_BAT_DET,
-	BD70528_INT_DCIN2_OV_RES,
-	BD70528_INT_DCIN2_OV_DET,
-	BD70528_INT_DCIN2_RMV,
-	BD70528_INT_DCIN2_DET,
-	BD70528_INT_DCIN1_RMV,
-	BD70528_INT_DCIN1_DET,
-	/* RTC register IRQs */
-	BD70528_INT_RTC_ALARM,
-	BD70528_INT_ELPS_TIM,
-	/* GPIO register IRQs */
-	BD70528_INT_GPIO0,
-	BD70528_INT_GPIO1,
-	BD70528_INT_GPIO2,
-	BD70528_INT_GPIO3,
-	/* Invalid operation register IRQs */
-	BD70528_INT_BUCK1_DVS_OPFAIL,
-	BD70528_INT_BUCK2_DVS_OPFAIL,
-	BD70528_INT_BUCK3_DVS_OPFAIL,
-	BD70528_INT_LED1_VOLT_OPFAIL,
-	BD70528_INT_LED2_VOLT_OPFAIL,
-};
-
-/* Masks */
-#define BD70528_INT_LONGPUSH_MASK 0x1
-#define BD70528_INT_WDT_MASK 0x2
-#define BD70528_INT_HWRESET_MASK 0x4
-#define BD70528_INT_RSTB_FAULT_MASK 0x8
-#define BD70528_INT_VBAT_UVLO_MASK 0x10
-#define BD70528_INT_TSD_MASK 0x20
-#define BD70528_INT_RSTIN_MASK 0x40
-
-#define BD70528_INT_BUCK1_FAULT_MASK 0x1
-#define BD70528_INT_BUCK2_FAULT_MASK 0x2
-#define BD70528_INT_BUCK3_FAULT_MASK 0x4
-#define BD70528_INT_LDO1_FAULT_MASK 0x8
-#define BD70528_INT_LDO2_FAULT_MASK 0x10
-#define BD70528_INT_LDO3_FAULT_MASK 0x20
-#define BD70528_INT_LED1_FAULT_MASK 0x40
-#define BD70528_INT_LED2_FAULT_MASK 0x80
-
-#define BD70528_INT_BUCK1_OCP_MASK 0x1
-#define BD70528_INT_BUCK2_OCP_MASK 0x2
-#define BD70528_INT_BUCK3_OCP_MASK 0x4
-#define BD70528_INT_LED1_OCP_MASK 0x8
-#define BD70528_INT_LED2_OCP_MASK 0x10
-#define BD70528_INT_BUCK1_FULLON_MASK 0x20
-#define BD70528_INT_BUCK2_FULLON_MASK 0x40
-
-#define BD70528_INT_SHORTPUSH_MASK 0x1
-#define BD70528_INT_AUTO_WAKEUP_MASK 0x2
-#define BD70528_INT_STATE_CHANGE_MASK 0x10
-
-#define BD70528_INT_BAT_OV_RES_MASK 0x1
-#define BD70528_INT_BAT_OV_DET_MASK 0x2
-#define BD70528_INT_DBAT_DET_MASK 0x4
-#define BD70528_INT_BATTSD_COLD_RES_MASK 0x8
-#define BD70528_INT_BATTSD_COLD_DET_MASK 0x10
-#define BD70528_INT_BATTSD_HOT_RES_MASK 0x20
-#define BD70528_INT_BATTSD_HOT_DET_MASK 0x40
-#define BD70528_INT_CHG_TSD_MASK 0x80
-
-#define BD70528_INT_BAT_RMV_MASK 0x1
-#define BD70528_INT_BAT_DET_MASK 0x2
-#define BD70528_INT_DCIN2_OV_RES_MASK 0x4
-#define BD70528_INT_DCIN2_OV_DET_MASK 0x8
-#define BD70528_INT_DCIN2_RMV_MASK 0x10
-#define BD70528_INT_DCIN2_DET_MASK 0x20
-#define BD70528_INT_DCIN1_RMV_MASK 0x40
-#define BD70528_INT_DCIN1_DET_MASK 0x80
-
-#define BD70528_INT_RTC_ALARM_MASK 0x1
-#define BD70528_INT_ELPS_TIM_MASK 0x2
-
-#define BD70528_INT_GPIO0_MASK 0x1
-#define BD70528_INT_GPIO1_MASK 0x2
-#define BD70528_INT_GPIO2_MASK 0x4
-#define BD70528_INT_GPIO3_MASK 0x8
-
-#define BD70528_INT_BUCK1_DVS_OPFAIL_MASK 0x1
-#define BD70528_INT_BUCK2_DVS_OPFAIL_MASK 0x2
-#define BD70528_INT_BUCK3_DVS_OPFAIL_MASK 0x4
-#define BD70528_INT_LED1_VOLT_OPFAIL_MASK 0x10
-#define BD70528_INT_LED2_VOLT_OPFAIL_MASK 0x20
-
-#define BD70528_DEBOUNCE_MASK 0x3
-
-#define BD70528_DEBOUNCE_DISABLE 0
-#define BD70528_DEBOUNCE_15MS 1
-#define BD70528_DEBOUNCE_30MS 2
-#define BD70528_DEBOUNCE_50MS 3
-
-#define BD70528_GPIO_DRIVE_MASK 0x2
-#define BD70528_GPIO_PUSH_PULL 0x0
-#define BD70528_GPIO_OPEN_DRAIN 0x2
-
-#define BD70528_GPIO_OUT_EN_MASK 0x80
-#define BD70528_GPIO_OUT_ENABLE 0x80
-#define BD70528_GPIO_OUT_DISABLE 0x0
-
-#define BD70528_GPIO_OUT_HI 0x1
-#define BD70528_GPIO_OUT_LO 0x0
-#define BD70528_GPIO_OUT_MASK 0x1
-
-#define BD70528_GPIO_IN_STATE_BASE 1
-
-/* RTC masks to mask out reserved bits */
-
-#define BD70528_MASK_ELAPSED_TIMER_EN	0x1
-/* Mask second, min and hour fields
- * HW would support ALM irq for over 24h
- * (by setting day, month and year too)
- * but as we wish to keep this same as for
- * wake-up we limit ALM to 24H and only
- * unmask sec, min and hour
- */
-#define BD70528_MASK_WAKE_EN		0x1
-
-/* WDT masks */
-#define BD70528_MASK_WDT_EN		0x1
-#define BD70528_MASK_WDT_HOUR		0x1
-#define BD70528_MASK_WDT_MINUTE		0x7f
-#define BD70528_MASK_WDT_SEC		0x7f
-
-#define BD70528_WDT_STATE_BIT		0x1
-#define BD70528_ELAPSED_STATE_BIT	0x2
-#define BD70528_WAKE_STATE_BIT		0x4
-
-/* Charger masks */
-#define BD70528_MASK_CHG_STAT		0x7f
-#define BD70528_MASK_CHG_BAT_TIMER	0x20
-#define BD70528_MASK_CHG_BAT_OVERVOLT	0x10
-#define BD70528_MASK_CHG_BAT_DETECT	0x1
-#define BD70528_MASK_CHG_DCIN1_UVLO	0x1
-#define BD70528_MASK_CHG_DCIN_ILIM	0x3f
-#define BD70528_MASK_CHG_CHG_CURR	0x1f
-#define BD70528_MASK_CHG_TRICKLE_CURR	0x10
-
-/*
- * Note, external battery register is the lonely rider at
- * address 0xc5. See how to stuff that in the regmap
- */
-#define BD70528_MAX_REGISTER 0x94
-
-/* Buck control masks */
-#define BD70528_MASK_RUN_EN	0x4
-#define BD70528_MASK_STBY_EN	0x2
-#define BD70528_MASK_IDLE_EN	0x1
-#define BD70528_MASK_LED1_EN	0x1
-#define BD70528_MASK_LED2_EN	0x10
-
-#define BD70528_MASK_BUCK_VOLT	0xf
-#define BD70528_MASK_LDO_VOLT	0x1f
-#define BD70528_MASK_LED1_VOLT	0x1
-#define BD70528_MASK_LED2_VOLT	0x10
-
-/* Misc irq masks */
-#define BD70528_INT_MASK_SHORT_PUSH	1
-#define BD70528_INT_MASK_AUTO_WAKE	2
-#define BD70528_INT_MASK_POWER_STATE	4
-
-#define BD70528_MASK_BUCK_RAMP 0x10
-#define BD70528_SIFT_BUCK_RAMP 4
-
-#if IS_ENABLED(CONFIG_BD70528_WATCHDOG)
-
-int bd70528_wdt_set(struct rohm_regmap_dev *data, int enable, int *old_state);
-void bd70528_wdt_lock(struct rohm_regmap_dev *data);
-void bd70528_wdt_unlock(struct rohm_regmap_dev *data);
-
-#else /* CONFIG_BD70528_WATCHDOG */
-
-static inline int bd70528_wdt_set(struct rohm_regmap_dev *data, int enable,
-				  int *old_state)
-{
-	return 0;
-}
-
-static inline void bd70528_wdt_lock(struct rohm_regmap_dev *data)
-{
-}
-
-static inline void bd70528_wdt_unlock(struct rohm_regmap_dev *data)
-{
-}
-
-#endif /* CONFIG_BD70528_WATCHDOG */
-
-#endif /* __LINUX_MFD_BD70528_H__ */
diff --git a/include/linux/mfd/rohm-generic.h b/include/linux/mfd/rohm-generic.h
index 35b392a0d73a..8fb763a2265a 100644
--- a/include/linux/mfd/rohm-generic.h
+++ b/include/linux/mfd/rohm-generic.h
@@ -12,7 +12,6 @@ enum rohm_chip_type {
 	ROHM_CHIP_TYPE_BD9573,
 	ROHM_CHIP_TYPE_BD9574,
 	ROHM_CHIP_TYPE_BD9576,
-	ROHM_CHIP_TYPE_BD70528,
 	ROHM_CHIP_TYPE_BD71815,
 	ROHM_CHIP_TYPE_BD71828,
 	ROHM_CHIP_TYPE_BD71837,
-- 
2.25.4


-- 
Matti Vaittinen, Linux device drivers
ROHM Semiconductors, Finland SWDC
Kiviharjunlenkki 1E
90220 OULU
FINLAND

~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~
Simon says - in Latin please.
~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~
Thanks to Simon Glass for the translation =] 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 9/9] MAINTAINERS: bd70528: Drop ROHM BD70528 drivers
  2021-05-25 10:13 [PATCH 0/9] Drop ROHM BD70528 support Matti Vaittinen
                   ` (7 preceding siblings ...)
  2021-05-25 10:16 ` [PATCH 8/9] mfd: bd70528: " Matti Vaittinen
@ 2021-05-25 10:16 ` Matti Vaittinen
  2021-05-27 10:35 ` [PATCH 0/9] Drop ROHM BD70528 support Vaittinen, Matti
  9 siblings, 0 replies; 20+ messages in thread
From: Matti Vaittinen @ 2021-05-25 10:16 UTC (permalink / raw)
  To: Matti Vaittinen, Matti Vaittinen
  Cc: Lee Jones, Rob Herring, Liam Girdwood, Mark Brown,
	Michael Turquette, Stephen Boyd, Matti Vaittinen, Linus Walleij,
	Bartosz Golaszewski, Sebastian Reichel, Alessandro Zummo,
	Alexandre Belloni, Wim Van Sebroeck, Guenter Roeck, devicetree,
	linux-kernel, linux-clk, linux-power, linux-gpio, linux-pm,
	linux-rtc, linux-watchdog

[-- Attachment #1: Type: text/plain, Size: 2003 bytes --]

The only known BD70528 use-cases are such that the PMIC is controlled
from separate MCU which is not running Linux. I am not aware of
any Linux driver users. Furthermore, it seems there is no demand for
this IC.

Ease the maintenance burden and drop the driver.

Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
---
 MAINTAINERS | 8 --------
 1 file changed, 8 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 81e1edeceae4..28d5783214b7 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -15777,27 +15777,19 @@ ROHM POWER MANAGEMENT IC DEVICE DRIVERS
 R:	Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
 L:	linux-power@fi.rohmeurope.com
 S:	Supported
-F:	Documentation/devicetree/bindings/mfd/rohm,bd70528-pmic.txt
-F:	Documentation/devicetree/bindings/regulator/rohm,bd70528-regulator.txt
 F:	drivers/clk/clk-bd718x7.c
-F:	drivers/gpio/gpio-bd70528.c
 F:	drivers/gpio/gpio-bd71815.c
 F:	drivers/gpio/gpio-bd71828.c
-F:	drivers/mfd/rohm-bd70528.c
 F:	drivers/mfd/rohm-bd71828.c
 F:	drivers/mfd/rohm-bd718x7.c
 F:	drivers/mfd/rohm-bd9576.c
-F:	drivers/power/supply/bd70528-charger.c
-F:	drivers/regulator/bd70528-regulator.c
 F:	drivers/regulator/bd71815-regulator.c
 F:	drivers/regulator/bd71828-regulator.c
 F:	drivers/regulator/bd718x7-regulator.c
 F:	drivers/regulator/bd9576-regulator.c
 F:	drivers/regulator/rohm-regulator.c
 F:	drivers/rtc/rtc-bd70528.c
-F:	drivers/watchdog/bd70528_wdt.c
 F:	drivers/watchdog/bd9576_wdt.c
-F:	include/linux/mfd/rohm-bd70528.h
 F:	include/linux/mfd/rohm-bd71815.h
 F:	include/linux/mfd/rohm-bd71828.h
 F:	include/linux/mfd/rohm-bd718x7.h
-- 
2.25.4


-- 
Matti Vaittinen, Linux device drivers
ROHM Semiconductors, Finland SWDC
Kiviharjunlenkki 1E
90220 OULU
FINLAND

~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~
Simon says - in Latin please.
~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~
Thanks to Simon Glass for the translation =] 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/9] watchdog: bd70528 drop bd70528 support
  2021-05-25 10:14 ` [PATCH 3/9] watchdog: bd70528 drop bd70528 support Matti Vaittinen
@ 2021-05-25 11:07   ` Guenter Roeck
  0 siblings, 0 replies; 20+ messages in thread
From: Guenter Roeck @ 2021-05-25 11:07 UTC (permalink / raw)
  To: Matti Vaittinen, Matti Vaittinen
  Cc: Lee Jones, Rob Herring, Liam Girdwood, Mark Brown,
	Michael Turquette, Stephen Boyd, Linus Walleij,
	Bartosz Golaszewski, Sebastian Reichel, Alessandro Zummo,
	Alexandre Belloni, Wim Van Sebroeck, devicetree, linux-kernel,
	linux-clk, linux-power, linux-gpio, linux-pm, linux-rtc,
	linux-watchdog

On 5/25/21 3:14 AM, Matti Vaittinen wrote:
> The only known BD70528 use-cases are such that the PMIC is controlled
> from separate MCU which is not running Linux. I am not aware of
> any Linux driver users. Furthermore, it seems there is no demand for
> this IC. Let's ease the maintenance burden and drop the driver. We can
> always add it back if there is sudden need for it.
> 
> Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
> 

Reviewed-by: Guenter Roeck <linux@roeck-us.net>

> ---
> Please let me know if some of you think the driver is needed.
> ---
>   drivers/watchdog/Kconfig       |  12 --
>   drivers/watchdog/Makefile      |   1 -
>   drivers/watchdog/bd70528_wdt.c | 291 ---------------------------------
>   3 files changed, 304 deletions(-)
>   delete mode 100644 drivers/watchdog/bd70528_wdt.c
> 
> diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
> index 355100dad60a..26824ac6c5bc 100644
> --- a/drivers/watchdog/Kconfig
> +++ b/drivers/watchdog/Kconfig
> @@ -160,18 +160,6 @@ config SOFT_WATCHDOG_PRETIMEOUT
>   	  watchdog. Be aware that governors might affect the watchdog because it
>   	  is purely software, e.g. the panic governor will stall it!
>   
> -config BD70528_WATCHDOG
> -	tristate "ROHM BD70528 PMIC Watchdog"
> -	depends on MFD_ROHM_BD70528
> -	select WATCHDOG_CORE
> -	help
> -	  Support for the watchdog in the ROHM BD70528 PMIC. Watchdog trigger
> -	  cause system reset.
> -
> -	  Say Y here to include support for the ROHM BD70528 watchdog.
> -	  Alternatively say M to compile the driver as a module,
> -	  which will be called bd70528_wdt.
> -
>   config BD957XMUF_WATCHDOG
>   	tristate "ROHM BD9576MUF and BD9573MUF PMIC Watchdog"
>   	depends on MFD_ROHM_BD957XMUF
> diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
> index a7eade8b4d45..1838df3ed650 100644
> --- a/drivers/watchdog/Makefile
> +++ b/drivers/watchdog/Makefile
> @@ -203,7 +203,6 @@ obj-$(CONFIG_WATCHDOG_SUN4V)		+= sun4v_wdt.o
>   obj-$(CONFIG_XEN_WDT) += xen_wdt.o
>   
>   # Architecture Independent
> -obj-$(CONFIG_BD70528_WATCHDOG) += bd70528_wdt.o
>   obj-$(CONFIG_BD957XMUF_WATCHDOG) += bd9576_wdt.o
>   obj-$(CONFIG_DA9052_WATCHDOG) += da9052_wdt.o
>   obj-$(CONFIG_DA9055_WATCHDOG) += da9055_wdt.o
> diff --git a/drivers/watchdog/bd70528_wdt.c b/drivers/watchdog/bd70528_wdt.c
> deleted file mode 100644
> index 0170b37e6674..000000000000
> --- a/drivers/watchdog/bd70528_wdt.c
> +++ /dev/null
> @@ -1,291 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -// Copyright (C) 2018 ROHM Semiconductors
> -// ROHM BD70528MWV watchdog driver
> -
> -#include <linux/bcd.h>
> -#include <linux/kernel.h>
> -#include <linux/mfd/rohm-bd70528.h>
> -#include <linux/module.h>
> -#include <linux/of.h>
> -#include <linux/platform_device.h>
> -#include <linux/regmap.h>
> -#include <linux/watchdog.h>
> -
> -/*
> - * Max time we can set is 1 hour, 59 minutes and 59 seconds
> - * and Minimum time is 1 second
> - */
> -#define WDT_MAX_MS	((2 * 60 * 60 - 1) * 1000)
> -#define WDT_MIN_MS	1000
> -#define DEFAULT_TIMEOUT	60
> -
> -#define WD_CTRL_MAGIC1 0x55
> -#define WD_CTRL_MAGIC2 0xAA
> -
> -struct wdtbd70528 {
> -	struct device *dev;
> -	struct regmap *regmap;
> -	struct rohm_regmap_dev *mfd;
> -	struct watchdog_device wdt;
> -};
> -
> -/**
> - * bd70528_wdt_set - arm or disarm watchdog timer
> - *
> - * @data:	device data for the PMIC instance we want to operate on
> - * @enable:	new state of WDT. zero to disable, non zero to enable
> - * @old_state:	previous state of WDT will be filled here
> - *
> - * Arm or disarm WDT on BD70528 PMIC. Expected to be called only by
> - * BD70528 RTC and BD70528 WDT drivers. The rtc_timer_lock must be taken
> - * by calling bd70528_wdt_lock before calling bd70528_wdt_set.
> - */
> -int bd70528_wdt_set(struct rohm_regmap_dev *data, int enable, int *old_state)
> -{
> -	int ret, i;
> -	unsigned int tmp;
> -	struct bd70528_data *bd70528 = container_of(data, struct bd70528_data,
> -						 chip);
> -	u8 wd_ctrl_arr[3] = { WD_CTRL_MAGIC1, WD_CTRL_MAGIC2, 0 };
> -	u8 *wd_ctrl = &wd_ctrl_arr[2];
> -
> -	ret = regmap_read(bd70528->chip.regmap, BD70528_REG_WDT_CTRL, &tmp);
> -	if (ret)
> -		return ret;
> -
> -	*wd_ctrl = (u8)tmp;
> -
> -	if (old_state) {
> -		if (*wd_ctrl & BD70528_MASK_WDT_EN)
> -			*old_state |= BD70528_WDT_STATE_BIT;
> -		else
> -			*old_state &= ~BD70528_WDT_STATE_BIT;
> -		if ((!enable) == (!(*old_state & BD70528_WDT_STATE_BIT)))
> -			return 0;
> -	}
> -
> -	if (enable) {
> -		if (*wd_ctrl & BD70528_MASK_WDT_EN)
> -			return 0;
> -		*wd_ctrl |= BD70528_MASK_WDT_EN;
> -	} else {
> -		if (*wd_ctrl & BD70528_MASK_WDT_EN)
> -			*wd_ctrl &= ~BD70528_MASK_WDT_EN;
> -		else
> -			return 0;
> -	}
> -
> -	for (i = 0; i < 3; i++) {
> -		ret = regmap_write(bd70528->chip.regmap, BD70528_REG_WDT_CTRL,
> -				   wd_ctrl_arr[i]);
> -		if (ret)
> -			return ret;
> -	}
> -
> -	ret = regmap_read(bd70528->chip.regmap, BD70528_REG_WDT_CTRL, &tmp);
> -	if ((tmp & BD70528_MASK_WDT_EN) != (*wd_ctrl & BD70528_MASK_WDT_EN)) {
> -		dev_err(bd70528->chip.dev,
> -			"Watchdog ctrl mismatch (hw) 0x%x (set) 0x%x\n",
> -			tmp, *wd_ctrl);
> -		ret = -EIO;
> -	}
> -
> -	return ret;
> -}
> -EXPORT_SYMBOL(bd70528_wdt_set);
> -
> -/**
> - * bd70528_wdt_lock - take WDT lock
> - *
> - * @data:	device data for the PMIC instance we want to operate on
> - *
> - * Lock WDT for arming/disarming in order to avoid race condition caused
> - * by WDT state changes initiated by WDT and RTC drivers.
> - */
> -void bd70528_wdt_lock(struct rohm_regmap_dev *data)
> -{
> -	struct bd70528_data *bd70528 = container_of(data, struct bd70528_data,
> -						 chip);
> -
> -	mutex_lock(&bd70528->rtc_timer_lock);
> -}
> -EXPORT_SYMBOL(bd70528_wdt_lock);
> -
> -/**
> - * bd70528_wdt_unlock - unlock WDT lock
> - *
> - * @data:	device data for the PMIC instance we want to operate on
> - *
> - * Unlock WDT lock which has previously been taken by call to
> - * bd70528_wdt_lock.
> - */
> -void bd70528_wdt_unlock(struct rohm_regmap_dev *data)
> -{
> -	struct bd70528_data *bd70528 = container_of(data, struct bd70528_data,
> -						 chip);
> -
> -	mutex_unlock(&bd70528->rtc_timer_lock);
> -}
> -EXPORT_SYMBOL(bd70528_wdt_unlock);
> -
> -static int bd70528_wdt_set_locked(struct wdtbd70528 *w, int enable)
> -{
> -	return bd70528_wdt_set(w->mfd, enable, NULL);
> -}
> -
> -static int bd70528_wdt_change(struct wdtbd70528 *w, int enable)
> -{
> -	int ret;
> -
> -	bd70528_wdt_lock(w->mfd);
> -	ret = bd70528_wdt_set_locked(w, enable);
> -	bd70528_wdt_unlock(w->mfd);
> -
> -	return ret;
> -}
> -
> -static int bd70528_wdt_start(struct watchdog_device *wdt)
> -{
> -	struct wdtbd70528 *w = watchdog_get_drvdata(wdt);
> -
> -	dev_dbg(w->dev, "WDT ping...\n");
> -	return bd70528_wdt_change(w, 1);
> -}
> -
> -static int bd70528_wdt_stop(struct watchdog_device *wdt)
> -{
> -	struct wdtbd70528 *w = watchdog_get_drvdata(wdt);
> -
> -	dev_dbg(w->dev, "WDT stopping...\n");
> -	return bd70528_wdt_change(w, 0);
> -}
> -
> -static int bd70528_wdt_set_timeout(struct watchdog_device *wdt,
> -				   unsigned int timeout)
> -{
> -	unsigned int hours;
> -	unsigned int minutes;
> -	unsigned int seconds;
> -	int ret;
> -	struct wdtbd70528 *w = watchdog_get_drvdata(wdt);
> -
> -	seconds = timeout;
> -	hours = timeout / (60 * 60);
> -	/* Maximum timeout is 1h 59m 59s => hours is 1 or 0 */
> -	if (hours)
> -		seconds -= (60 * 60);
> -	minutes = seconds / 60;
> -	seconds = seconds % 60;
> -
> -	bd70528_wdt_lock(w->mfd);
> -
> -	ret = bd70528_wdt_set_locked(w, 0);
> -	if (ret)
> -		goto out_unlock;
> -
> -	ret = regmap_update_bits(w->regmap, BD70528_REG_WDT_HOUR,
> -				 BD70528_MASK_WDT_HOUR, hours);
> -	if (ret) {
> -		dev_err(w->dev, "Failed to set WDT hours\n");
> -		goto out_en_unlock;
> -	}
> -	ret = regmap_update_bits(w->regmap, BD70528_REG_WDT_MINUTE,
> -				 BD70528_MASK_WDT_MINUTE, bin2bcd(minutes));
> -	if (ret) {
> -		dev_err(w->dev, "Failed to set WDT minutes\n");
> -		goto out_en_unlock;
> -	}
> -	ret = regmap_update_bits(w->regmap, BD70528_REG_WDT_SEC,
> -				 BD70528_MASK_WDT_SEC, bin2bcd(seconds));
> -	if (ret)
> -		dev_err(w->dev, "Failed to set WDT seconds\n");
> -	else
> -		dev_dbg(w->dev, "WDT tmo set to %u\n", timeout);
> -
> -out_en_unlock:
> -	ret = bd70528_wdt_set_locked(w, 1);
> -out_unlock:
> -	bd70528_wdt_unlock(w->mfd);
> -
> -	return ret;
> -}
> -
> -static const struct watchdog_info bd70528_wdt_info = {
> -	.identity = "bd70528-wdt",
> -	.options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE,
> -};
> -
> -static const struct watchdog_ops bd70528_wdt_ops = {
> -	.start		= bd70528_wdt_start,
> -	.stop		= bd70528_wdt_stop,
> -	.set_timeout	= bd70528_wdt_set_timeout,
> -};
> -
> -static int bd70528_wdt_probe(struct platform_device *pdev)
> -{
> -	struct rohm_regmap_dev *bd70528;
> -	struct wdtbd70528 *w;
> -	int ret;
> -	unsigned int reg;
> -
> -	bd70528 = dev_get_drvdata(pdev->dev.parent);
> -	if (!bd70528) {
> -		dev_err(&pdev->dev, "No MFD driver data\n");
> -		return -EINVAL;
> -	}
> -	w = devm_kzalloc(&pdev->dev, sizeof(*w), GFP_KERNEL);
> -	if (!w)
> -		return -ENOMEM;
> -
> -	w->regmap = bd70528->regmap;
> -	w->mfd = bd70528;
> -	w->dev = &pdev->dev;
> -
> -	w->wdt.info = &bd70528_wdt_info;
> -	w->wdt.ops =  &bd70528_wdt_ops;
> -	w->wdt.min_hw_heartbeat_ms = WDT_MIN_MS;
> -	w->wdt.max_hw_heartbeat_ms = WDT_MAX_MS;
> -	w->wdt.parent = pdev->dev.parent;
> -	w->wdt.timeout = DEFAULT_TIMEOUT;
> -	watchdog_set_drvdata(&w->wdt, w);
> -	watchdog_init_timeout(&w->wdt, 0, pdev->dev.parent);
> -
> -	ret = bd70528_wdt_set_timeout(&w->wdt, w->wdt.timeout);
> -	if (ret) {
> -		dev_err(&pdev->dev, "Failed to set the watchdog timeout\n");
> -		return ret;
> -	}
> -
> -	bd70528_wdt_lock(w->mfd);
> -	ret = regmap_read(w->regmap, BD70528_REG_WDT_CTRL, &reg);
> -	bd70528_wdt_unlock(w->mfd);
> -
> -	if (ret) {
> -		dev_err(&pdev->dev, "Failed to get the watchdog state\n");
> -		return ret;
> -	}
> -	if (reg & BD70528_MASK_WDT_EN) {
> -		dev_dbg(&pdev->dev, "watchdog was running during probe\n");
> -		set_bit(WDOG_HW_RUNNING, &w->wdt.status);
> -	}
> -
> -	ret = devm_watchdog_register_device(&pdev->dev, &w->wdt);
> -	if (ret < 0)
> -		dev_err(&pdev->dev, "watchdog registration failed: %d\n", ret);
> -
> -	return ret;
> -}
> -
> -static struct platform_driver bd70528_wdt = {
> -	.driver = {
> -		.name = "bd70528-wdt"
> -	},
> -	.probe = bd70528_wdt_probe,
> -};
> -
> -module_platform_driver(bd70528_wdt);
> -
> -MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
> -MODULE_DESCRIPTION("BD70528 watchdog driver");
> -MODULE_LICENSE("GPL");
> -MODULE_ALIAS("platform:bd70528-wdt");
> 


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/9] rtc: bd70528: Drop BD70528 support
  2021-05-25 10:14 ` [PATCH 2/9] rtc: bd70528: " Matti Vaittinen
@ 2021-05-25 11:47   ` Alexandre Belloni
  2021-05-25 11:59     ` Vaittinen, Matti
  0 siblings, 1 reply; 20+ messages in thread
From: Alexandre Belloni @ 2021-05-25 11:47 UTC (permalink / raw)
  To: Matti Vaittinen
  Cc: Matti Vaittinen, Lee Jones, Rob Herring, Liam Girdwood,
	Mark Brown, Michael Turquette, Stephen Boyd, Linus Walleij,
	Bartosz Golaszewski, Sebastian Reichel, Alessandro Zummo,
	Wim Van Sebroeck, Guenter Roeck, devicetree, linux-kernel,
	linux-clk, linux-power, linux-gpio, linux-pm, linux-rtc,
	linux-watchdog

On 25/05/2021 13:14:09+0300, Matti Vaittinen wrote:
> The only known BD70528 use-cases are such that the PMIC is controlled
> from separate MCU which is not running Linux. I am not aware of
> any Linux driver users. Furthermore, it seems there is no demand for
> this IC. Let's ease the maintenance burden and drop the driver. We can
> always add it back if there is sudden need for it.
> 
> Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
> 
> ---
> My heart is a bit less bleeding when I see how much simpler this RTC
> driver became..
> Please let me know if some of you think the driver is needed.
> ---
>  drivers/rtc/Kconfig       |   4 +-
>  drivers/rtc/rtc-bd70528.c | 316 ++------------------------------------
>  2 files changed, 13 insertions(+), 307 deletions(-)
> 
> diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
> index d8c13fded164..398899217626 100644
> --- a/drivers/rtc/Kconfig
> +++ b/drivers/rtc/Kconfig
> @@ -502,10 +502,10 @@ config RTC_DRV_M41T80_WDT
>  
>  config RTC_DRV_BD70528
>  	tristate "ROHM BD70528, BD71815 and BD71828 PMIC RTC"
> -	depends on MFD_ROHM_BD71828 || MFD_ROHM_BD70528 && (BD70528_WATCHDOG || !BD70528_WATCHDOG)
> +	depends on MFD_ROHM_BD71828

This won't apply as I applied b0ddc5b17005 ("rtc: bd70528: fix BD71815
watchdog dependency") yesterday...

-- 
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/9] rtc: bd70528: Drop BD70528 support
  2021-05-25 11:47   ` Alexandre Belloni
@ 2021-05-25 11:59     ` Vaittinen, Matti
  2021-05-25 13:08       ` Alexandre Belloni
  0 siblings, 1 reply; 20+ messages in thread
From: Vaittinen, Matti @ 2021-05-25 11:59 UTC (permalink / raw)
  To: alexandre.belloni
  Cc: wim, sre, linux-rtc, linux-gpio, linux-power, linux-kernel,
	mturquette, lgirdwood, devicetree, linux, a.zummo, linus.walleij,
	robh+dt, bgolaszewski, linux-pm, linux-clk, lee.jones, sboyd,
	broonie, linux-watchdog


On Tue, 2021-05-25 at 13:47 +0200, Alexandre Belloni wrote:
> On 25/05/2021 13:14:09+0300, Matti Vaittinen wrote:
> > The only known BD70528 use-cases are such that the PMIC is
> > controlled
> > from separate MCU which is not running Linux. I am not aware of
> > any Linux driver users. Furthermore, it seems there is no demand
> > for
> > this IC. Let's ease the maintenance burden and drop the driver. We
> > can
> > always add it back if there is sudden need for it.
> > 
> > Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
> > 
> > ---
> > My heart is a bit less bleeding when I see how much simpler this
> > RTC
> > driver became..
> > Please let me know if some of you think the driver is needed.
> > ---
> >  drivers/rtc/Kconfig       |   4 +-
> >  drivers/rtc/rtc-bd70528.c | 316 ++------------------------------
> > ------
> >  2 files changed, 13 insertions(+), 307 deletions(-)
> > 
> > diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
> > index d8c13fded164..398899217626 100644
> > --- a/drivers/rtc/Kconfig
> > +++ b/drivers/rtc/Kconfig
> > @@ -502,10 +502,10 @@ config RTC_DRV_M41T80_WDT
> >  
> >  config RTC_DRV_BD70528
> >  	tristate "ROHM BD70528, BD71815 and BD71828 PMIC RTC"
> > -	depends on MFD_ROHM_BD71828 || MFD_ROHM_BD70528 &&
> > (BD70528_WATCHDOG || !BD70528_WATCHDOG)
> > +	depends on MFD_ROHM_BD71828
> 
> This won't apply as I applied b0ddc5b17005 ("rtc: bd70528: fix
> BD71815
> watchdog dependency") yesterday...
> 

I know Alexandre. Sorry about that. I received confirmation to my
question whether the BD70528 is used only at this morning. Sorry for
all the work.

This is why the cover-letter stated:

"...As a final note - Few improvements/fixes were just applied to the
regulator tree so this series is likely to conflict. Some fixes
were also added to RTC Kconfig - which means also the RTC tree
may have conflicts. Please let me know if you wish me to rebase
this series or those patches."

And in any case applying the MFD and RTC patches should be synced. RTC
parts should be applied before MFD parts because few other PMICs use
this same RTC driver and compilation would fail with missing headers if
MFD was removed before RTC changes are applied.

Suggestions on how to guarantee the order of MFD and RTC - and how to
resolve conflicts?

Best Regards
	Matti Vaittinen

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/9] rtc: bd70528: Drop BD70528 support
  2021-05-25 11:59     ` Vaittinen, Matti
@ 2021-05-25 13:08       ` Alexandre Belloni
  2021-05-25 15:41         ` Vaittinen, Matti
  0 siblings, 1 reply; 20+ messages in thread
From: Alexandre Belloni @ 2021-05-25 13:08 UTC (permalink / raw)
  To: Vaittinen, Matti
  Cc: wim, sre, linux-rtc, linux-gpio, linux-power, linux-kernel,
	mturquette, lgirdwood, devicetree, linux, a.zummo, linus.walleij,
	robh+dt, bgolaszewski, linux-pm, linux-clk, lee.jones, sboyd,
	broonie, linux-watchdog

On 25/05/2021 11:59:58+0000, Vaittinen, Matti wrote:
> And in any case applying the MFD and RTC patches should be synced. RTC
> parts should be applied before MFD parts because few other PMICs use
> this same RTC driver and compilation would fail with missing headers if
> MFD was removed before RTC changes are applied.
> 
> Suggestions on how to guarantee the order of MFD and RTC - and how to
> resolve conflicts?
> 

The easiest is to take the RTC patches in one cycle and the rest in
the next cycle.


-- 
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/9] rtc: bd70528: Drop BD70528 support
  2021-05-25 13:08       ` Alexandre Belloni
@ 2021-05-25 15:41         ` Vaittinen, Matti
  0 siblings, 0 replies; 20+ messages in thread
From: Vaittinen, Matti @ 2021-05-25 15:41 UTC (permalink / raw)
  To: alexandre.belloni
  Cc: wim, sre, linux-rtc, linux-gpio, linux-power, linux-kernel,
	mturquette, lgirdwood, devicetree, linus.walleij, linux, a.zummo,
	robh+dt, bgolaszewski, linux-pm, linux-clk, lee.jones, sboyd,
	broonie, linux-watchdog


On Tue, 2021-05-25 at 15:08 +0200, Alexandre Belloni wrote:
> On 25/05/2021 11:59:58+0000, Vaittinen, Matti wrote:
> > And in any case applying the MFD and RTC patches should be synced.
> > RTC
> > parts should be applied before MFD parts because few other PMICs
> > use
> > this same RTC driver and compilation would fail with missing
> > headers if
> > MFD was removed before RTC changes are applied.
> > 
> > Suggestions on how to guarantee the order of MFD and RTC - and how
> > to
> > resolve conflicts?
> > 
> 
> The easiest is to take the RTC patches in one cycle and the rest in
> the next cycle.
> 
> 
That suits me just fine. Should I resend the series w/o MFD changes and
send the MFD part only at next cycle?

Best Regards
	Matti Vaittinen

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 0/9] Drop ROHM BD70528 support
  2021-05-25 10:13 [PATCH 0/9] Drop ROHM BD70528 support Matti Vaittinen
                   ` (8 preceding siblings ...)
  2021-05-25 10:16 ` [PATCH 9/9] MAINTAINERS: bd70528: Drop ROHM BD70528 drivers Matti Vaittinen
@ 2021-05-27 10:35 ` Vaittinen, Matti
  9 siblings, 0 replies; 20+ messages in thread
From: Vaittinen, Matti @ 2021-05-27 10:35 UTC (permalink / raw)
  To: Vaittinen, Matti
  Cc: wim, sre, linux-rtc, linux-gpio, linux-power, alexandre.belloni,
	linux-kernel, mturquette, lgirdwood, devicetree, linux, a.zummo,
	linus.walleij, robh+dt, bgolaszewski, linux-pm, linux-clk,
	lee.jones, sboyd, broonie, linux-watchdog


On Tue, 2021-05-25 at 13:13 +0300, Matti Vaittinen wrote:
> Drop ROHM BD70528 support
> 
> Unfortunately there has not been a big demand for ROHM BD70528
> IC. The few users I know control PMIC from separate M4-core,
> which is not running Linux. I am not aware of any users of this
> Linux driver.
> 
> While I did really like this IC and writing the drivers for it,
> seems like these drivers are becoming useless burden. So, I see
> no point in maintaining them. Let's just drop the drivers if
> there is no objections to this series. :(
> 
> Few notes:
> 
> The GPIO, regulator, power-supply and watchdog drivers should be
> only used on BD70528 and depend on the BD70528 MFD Kconfig. I guess
> the removal can be independently merged to the respective subsystems.
> 
> The BD70528 RTC driver is still used by BD71815 and BD71828 -
> but the watchdog-hack can be removed and driver is greatly
> simplified. However, it's worth noting that there is dependency
> from the BD70528 RTC driver to the header files - thus the
> RTC driver changes should be merged before MFD changes. Also the
> CLK driver remains in use and needs the BD70528 IC-type.
> 
> As a final note - Few improvements/fixes were just applied to the
> regulator tree so this series is likely to conflict. Some fixes
> were also added to RTC Kconfig - which means also the RTC tree
> may have conflicts. Please let me know if you wish me to rebase
> this series or those patches.

As shortly discussed with Alexandre here:
https://lore.kernel.org/lkml/YKz25PDL2Z6vgqJv@piout.net/

The easiest way to drop the support without breaking the dependencies
and without introducing conflicts is to drop support from sub-devices
in one cycle and the MFD only at next cycle. So Lee, please ignore the
MFD part for now.

I'll rebase the RTC and regulator patches to RTC and regulator trees
and send them as individual patches to Mark and Alexandre. I think the
other sub-device patches and the DT bindings patch should apply cleanly
to the respective trees. Please let me know if this does not work for
you.

I'll re-spin the MFD portion during the next cycle.

Best Regards
	Matti Vaittinen

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 6/9] gpio: bd70528 Drop BD70528 support
  2021-05-25 10:15 ` [PATCH 6/9] gpio: bd70528 " Matti Vaittinen
@ 2021-05-28 14:23   ` Bartosz Golaszewski
  0 siblings, 0 replies; 20+ messages in thread
From: Bartosz Golaszewski @ 2021-05-28 14:23 UTC (permalink / raw)
  To: Matti Vaittinen
  Cc: Matti Vaittinen, Lee Jones, Rob Herring, Liam Girdwood,
	Mark Brown, Michael Turquette, Stephen Boyd, Linus Walleij,
	Sebastian Reichel, Alessandro Zummo, Alexandre Belloni,
	Wim Van Sebroeck, Guenter Roeck, linux-devicetree, LKML,
	linux-clk, linux-power, linux-gpio, linux-pm, linux-rtc,
	LINUXWATCHDOG

On Tue, May 25, 2021 at 12:15 PM Matti Vaittinen
<matti.vaittinen@fi.rohmeurope.com> wrote:
>
> The only known BD70528 use-cases are such that the PMIC is controlled
> from separate MCU which is not running Linux. I am not aware of
> any Linux driver users. Furthermore, it seems there is no demand for
> this IC. Let's ease the maintenance burden and drop the driver. We can
> always add it back if there is sudden need for it.
>
> Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
>
> ---

Acked-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 8/9] mfd: bd70528: Drop BD70528 support
  2021-05-25 10:16 ` [PATCH 8/9] mfd: bd70528: " Matti Vaittinen
@ 2021-06-01 15:48   ` Lee Jones
  0 siblings, 0 replies; 20+ messages in thread
From: Lee Jones @ 2021-06-01 15:48 UTC (permalink / raw)
  To: Matti Vaittinen
  Cc: Matti Vaittinen, Rob Herring, Liam Girdwood, Mark Brown,
	Michael Turquette, Stephen Boyd, Linus Walleij,
	Bartosz Golaszewski, Sebastian Reichel, Alessandro Zummo,
	Alexandre Belloni, Wim Van Sebroeck, Guenter Roeck, devicetree,
	linux-kernel, linux-clk, linux-power, linux-gpio, linux-pm,
	linux-rtc, linux-watchdog

On Tue, 25 May 2021, Matti Vaittinen wrote:

> The only known BD70528 use-cases are such that the PMIC is controlled
> from separate MCU which is not running Linux. I am not aware of
> any Linux driver users. Furthermore, it seems there is no demand for
> this IC. Let's ease the maintenance burden and drop the driver. We can
> always add it back if there is sudden need for it.
> 
> Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
> 
> ---
> Please let me know if some of you think the driver is needed.
> ---
>  drivers/mfd/Kconfig              |  17 --
>  drivers/mfd/Makefile             |   1 -
>  drivers/mfd/rohm-bd70528.c       | 314 -------------------------
>  include/linux/mfd/rohm-bd70528.h | 391 -------------------------------
>  include/linux/mfd/rohm-generic.h |   1 -
>  5 files changed, 724 deletions(-)
>  delete mode 100644 drivers/mfd/rohm-bd70528.c
>  delete mode 100644 include/linux/mfd/rohm-bd70528.h

Acked-by: Lee Jones <lee.jones@linaro.org>

-- 
Lee Jones [李琼斯]
Senior Technical Lead - Developer Services
Linaro.org │ Open source software for Arm SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 7/9] power: supply: Drop BD70528 support
  2021-05-25 10:15 ` [PATCH 7/9] power: supply: " Matti Vaittinen
@ 2021-06-04 10:10   ` Sebastian Reichel
  0 siblings, 0 replies; 20+ messages in thread
From: Sebastian Reichel @ 2021-06-04 10:10 UTC (permalink / raw)
  To: Matti Vaittinen
  Cc: Matti Vaittinen, Lee Jones, Rob Herring, Liam Girdwood,
	Mark Brown, Michael Turquette, Stephen Boyd, Linus Walleij,
	Bartosz Golaszewski, Alessandro Zummo, Alexandre Belloni,
	Wim Van Sebroeck, Guenter Roeck, devicetree, linux-kernel,
	linux-clk, linux-power, linux-gpio, linux-pm, linux-rtc,
	linux-watchdog

[-- Attachment #1: Type: text/plain, Size: 25397 bytes --]

Hi Matti,

On Tue, May 25, 2021 at 01:15:47PM +0300, Matti Vaittinen wrote:
> The only known BD70528 use-cases are such that the PMIC is controlled
> from separate MCU which is not running Linux. I am not aware of
> any Linux driver users. Furthermore, it seems there is no demand for
> this IC. Let's ease the maintenance burden and drop the driver. We can
> always add it back if there is sudden need for it.
> 
> Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
> 
> ---
> Please let me know if some of you think the driver is needed.
> ---

Thanks, queued.

-- Sebastian

>  drivers/power/supply/Kconfig           |   9 -
>  drivers/power/supply/Makefile          |   1 -
>  drivers/power/supply/bd70528-charger.c | 710 -------------------------
>  3 files changed, 720 deletions(-)
>  delete mode 100644 drivers/power/supply/bd70528-charger.c
> 
> diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
> index e696364126f1..b99d19f48769 100644
> --- a/drivers/power/supply/Kconfig
> +++ b/drivers/power/supply/Kconfig
> @@ -760,15 +760,6 @@ config CHARGER_UCS1002
>  	  Say Y to enable support for Microchip UCS1002 Programmable
>  	  USB Port Power Controller with Charger Emulation.
>  
> -config CHARGER_BD70528
> -	tristate "ROHM bd70528 charger driver"
> -	depends on MFD_ROHM_BD70528
> -	select LINEAR_RANGES
> -	help
> -	  Say Y here to enable support for getting battery status
> -	  information and altering charger configurations from charger
> -	  block of the ROHM BD70528 Power Management IC.
> -
>  config CHARGER_BD99954
>  	tristate "ROHM bd99954 charger driver"
>  	depends on I2C
> diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile
> index a7309a3d1a47..7ad7d9a05523 100644
> --- a/drivers/power/supply/Makefile
> +++ b/drivers/power/supply/Makefile
> @@ -96,7 +96,6 @@ obj-$(CONFIG_CHARGER_CROS_USBPD)	+= cros_usbpd-charger.o
>  obj-$(CONFIG_CHARGER_SC2731)	+= sc2731_charger.o
>  obj-$(CONFIG_FUEL_GAUGE_SC27XX)	+= sc27xx_fuel_gauge.o
>  obj-$(CONFIG_CHARGER_UCS1002)	+= ucs1002_power.o
> -obj-$(CONFIG_CHARGER_BD70528)	+= bd70528-charger.o
>  obj-$(CONFIG_CHARGER_BD99954)	+= bd99954-charger.o
>  obj-$(CONFIG_CHARGER_WILCO)	+= wilco-charger.o
>  obj-$(CONFIG_RN5T618_POWER)	+= rn5t618_power.o
> diff --git a/drivers/power/supply/bd70528-charger.c b/drivers/power/supply/bd70528-charger.c
> deleted file mode 100644
> index 7c1f0b99c71b..000000000000
> --- a/drivers/power/supply/bd70528-charger.c
> +++ /dev/null
> @@ -1,710 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-or-later
> -//
> -// Copyright (C) 2018 ROHM Semiconductors
> -//
> -// power-supply driver for ROHM BD70528 PMIC
> -
> -/*
> - * BD70528 charger HW state machine.
> - *
> - * The thermal shutdown state is not drawn. From any other state but
> - * battery error and suspend it is possible to go to TSD/TMP states
> - * if temperature is out of bounds.
> - *
> - *  CHG_RST = H
> - *  or CHG_EN=L
> - *  or (DCIN2_UVLO=L && DCIN1_UVLO=L)
> - *  or (DCIN2_OVLO=H & DCIN1_UVKLO=L)
> - *
> - *  +--------------+         +--------------+
> - *  |              |         |              |
> - *  |  Any state   +-------> |    Suspend   |
> - *  |              |         |              |
> - *  +--------------+         +------+-------+
> - *                                  |
> - *  CHG_EN = H && BAT_DET = H &&    |
> - *  No errors (temp, bat_ov, UVLO,  |
> - *  OVLO...)                        |
> - *                                  |
> - *  BAT_OV or             +---------v----------+
> - *  (DBAT && TTRI)        |                    |
> - *      +-----------------+   Trickle Charge   | <---------------+
> - *      |                 |                    |                 |
> - *      |                 +-------+------------+                 |
> - *      |                         |                              |
> - *      |                         |     ^                        |
> - *      |        V_BAT > VTRI_TH  |     |  VBAT < VTRI_TH - 50mV |
> - *      |                         |     |                        |
> - *      |                         v     |                        |
> - *      |                               |                        |
> - *      |     BAT_OV or      +----------+----+                   |
> - *      |     (DBAT && TFST) |               |                   |
> - *      |   +----------------+  Fast Charge  |                   |
> - *      |   |                |               |                   |
> - *      v   v                +----+----------+                   |
> - *                                |                              |
> - *+----------------+   ILIM_DET=L |    ^ ILIM_DET                |
> - *|                |   & CV_DET=H |    | or CV_DET=L             |
> - *|  Battery Error |   & VBAT >   |    | or VBAT < VRECHG_TH     |
> - *|                |   VRECHG_TH  |    | or IBAT  > IFST/x       |
> - *+----------------+   & IBAT <   |    |                         |
> - *                     IFST/x     v    |                         |
> - *       ^                             |                         |
> - *       |                   +---------+-+                       |
> - *       |                   |           |                       |
> - *       +-------------------+  Top OFF  |                       |
> - *  BAT_OV = H or            |           |                       |
> - *  (DBAT && TFST)           +-----+-----+                       |
> - *                                 |                             |
> - *           Stay top-off for 15s  |                             |
> - *                                 v                             |
> - *                                                               |
> - *                            +--------+                         |
> - *                            |        |                         |
> - *                            |  Done  +-------------------------+
> - *                            |        |
> - *                            +--------+   VBAT < VRECHG_TH
> - */
> -
> -#include <linux/kernel.h>
> -#include <linux/interrupt.h>
> -#include <linux/mfd/rohm-bd70528.h>
> -#include <linux/module.h>
> -#include <linux/platform_device.h>
> -#include <linux/power_supply.h>
> -#include <linux/linear_range.h>
> -
> -#define CHG_STAT_SUSPEND	0x0
> -#define CHG_STAT_TRICKLE	0x1
> -#define CHG_STAT_FAST		0x3
> -#define CHG_STAT_TOPOFF		0xe
> -#define CHG_STAT_DONE		0xf
> -#define CHG_STAT_OTP_TRICKLE	0x10
> -#define CHG_STAT_OTP_FAST	0x11
> -#define CHG_STAT_OTP_DONE	0x12
> -#define CHG_STAT_TSD_TRICKLE	0x20
> -#define CHG_STAT_TSD_FAST	0x21
> -#define CHG_STAT_TSD_TOPOFF	0x22
> -#define CHG_STAT_BAT_ERR	0x7f
> -
> -static const char *bd70528_charger_model = "BD70528";
> -static const char *bd70528_charger_manufacturer = "ROHM Semiconductors";
> -
> -#define BD_ERR_IRQ_HND(_name_, _wrn_)					\
> -static irqreturn_t bd0528_##_name_##_interrupt(int irq, void *arg)	\
> -{									\
> -	struct power_supply *psy = (struct power_supply *)arg;		\
> -									\
> -	power_supply_changed(psy);					\
> -	dev_err(&psy->dev, (_wrn_));					\
> -									\
> -	return IRQ_HANDLED;						\
> -}
> -
> -#define BD_INFO_IRQ_HND(_name_, _wrn_)					\
> -static irqreturn_t bd0528_##_name_##_interrupt(int irq, void *arg)	\
> -{									\
> -	struct power_supply *psy = (struct power_supply *)arg;		\
> -									\
> -	power_supply_changed(psy);					\
> -	dev_dbg(&psy->dev, (_wrn_));					\
> -									\
> -	return IRQ_HANDLED;						\
> -}
> -
> -#define BD_IRQ_HND(_name_) bd0528_##_name_##_interrupt
> -
> -struct bd70528_psy {
> -	struct regmap *regmap;
> -	struct device *dev;
> -	struct power_supply *psy;
> -};
> -
> -BD_ERR_IRQ_HND(BAT_OV_DET, "Battery overvoltage detected\n");
> -BD_ERR_IRQ_HND(DBAT_DET, "Dead battery detected\n");
> -BD_ERR_IRQ_HND(COLD_DET, "Battery cold\n");
> -BD_ERR_IRQ_HND(HOT_DET, "Battery hot\n");
> -BD_ERR_IRQ_HND(CHG_TSD, "Charger thermal shutdown\n");
> -BD_ERR_IRQ_HND(DCIN2_OV_DET, "DCIN2 overvoltage detected\n");
> -
> -BD_INFO_IRQ_HND(BAT_OV_RES, "Battery voltage back to normal\n");
> -BD_INFO_IRQ_HND(COLD_RES, "Battery temperature back to normal\n");
> -BD_INFO_IRQ_HND(HOT_RES, "Battery temperature back to normal\n");
> -BD_INFO_IRQ_HND(BAT_RMV, "Battery removed\n");
> -BD_INFO_IRQ_HND(BAT_DET, "Battery detected\n");
> -BD_INFO_IRQ_HND(DCIN2_OV_RES, "DCIN2 voltage back to normal\n");
> -BD_INFO_IRQ_HND(DCIN2_RMV, "DCIN2 removed\n");
> -BD_INFO_IRQ_HND(DCIN2_DET, "DCIN2 detected\n");
> -BD_INFO_IRQ_HND(DCIN1_RMV, "DCIN1 removed\n");
> -BD_INFO_IRQ_HND(DCIN1_DET, "DCIN1 detected\n");
> -
> -struct irq_name_pair {
> -	const char *n;
> -	irqreturn_t (*h)(int irq, void *arg);
> -};
> -
> -static int bd70528_get_irqs(struct platform_device *pdev,
> -			    struct bd70528_psy *bdpsy)
> -{
> -	int irq, i, ret;
> -	unsigned int mask;
> -	static const struct irq_name_pair bd70528_chg_irqs[] = {
> -		{ .n = "bd70528-bat-ov-res", .h = BD_IRQ_HND(BAT_OV_RES) },
> -		{ .n = "bd70528-bat-ov-det", .h = BD_IRQ_HND(BAT_OV_DET) },
> -		{ .n = "bd70528-bat-dead", .h = BD_IRQ_HND(DBAT_DET) },
> -		{ .n = "bd70528-bat-warmed", .h = BD_IRQ_HND(COLD_RES) },
> -		{ .n = "bd70528-bat-cold", .h = BD_IRQ_HND(COLD_DET) },
> -		{ .n = "bd70528-bat-cooled", .h = BD_IRQ_HND(HOT_RES) },
> -		{ .n = "bd70528-bat-hot", .h = BD_IRQ_HND(HOT_DET) },
> -		{ .n = "bd70528-chg-tshd", .h = BD_IRQ_HND(CHG_TSD) },
> -		{ .n = "bd70528-bat-removed", .h = BD_IRQ_HND(BAT_RMV) },
> -		{ .n = "bd70528-bat-detected", .h = BD_IRQ_HND(BAT_DET) },
> -		{ .n = "bd70528-dcin2-ov-res", .h = BD_IRQ_HND(DCIN2_OV_RES) },
> -		{ .n = "bd70528-dcin2-ov-det", .h = BD_IRQ_HND(DCIN2_OV_DET) },
> -		{ .n = "bd70528-dcin2-removed", .h = BD_IRQ_HND(DCIN2_RMV) },
> -		{ .n = "bd70528-dcin2-detected", .h = BD_IRQ_HND(DCIN2_DET) },
> -		{ .n = "bd70528-dcin1-removed", .h = BD_IRQ_HND(DCIN1_RMV) },
> -		{ .n = "bd70528-dcin1-detected", .h = BD_IRQ_HND(DCIN1_DET) },
> -	};
> -
> -	for (i = 0; i < ARRAY_SIZE(bd70528_chg_irqs); i++) {
> -		irq = platform_get_irq_byname(pdev, bd70528_chg_irqs[i].n);
> -		if (irq < 0) {
> -			dev_err(&pdev->dev, "Bad IRQ information for %s (%d)\n",
> -				bd70528_chg_irqs[i].n, irq);
> -			return irq;
> -		}
> -		ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
> -						bd70528_chg_irqs[i].h,
> -						IRQF_ONESHOT,
> -						bd70528_chg_irqs[i].n,
> -						bdpsy->psy);
> -
> -		if (ret)
> -			return ret;
> -	}
> -	/*
> -	 * BD70528 irq controller is not touching the main mask register.
> -	 * So enable the charger block interrupts at main level. We can just
> -	 * leave them enabled as irq-controller should disable irqs
> -	 * from sub-registers when IRQ is disabled or freed.
> -	 */
> -	mask = BD70528_REG_INT_BAT1_MASK | BD70528_REG_INT_BAT2_MASK;
> -	ret = regmap_update_bits(bdpsy->regmap,
> -				 BD70528_REG_INT_MAIN_MASK, mask, 0);
> -	if (ret)
> -		dev_err(&pdev->dev, "Failed to enable charger IRQs\n");
> -
> -	return ret;
> -}
> -
> -static int bd70528_get_charger_status(struct bd70528_psy *bdpsy, int *val)
> -{
> -	int ret;
> -	unsigned int v;
> -
> -	ret = regmap_read(bdpsy->regmap, BD70528_REG_CHG_CURR_STAT, &v);
> -	if (ret) {
> -		dev_err(bdpsy->dev, "Charger state read failure %d\n",
> -			ret);
> -		return ret;
> -	}
> -
> -	switch (v & BD70528_MASK_CHG_STAT) {
> -	case CHG_STAT_SUSPEND:
> -	/* Maybe we should check the CHG_TTRI_EN? */
> -	case CHG_STAT_OTP_TRICKLE:
> -	case CHG_STAT_OTP_FAST:
> -	case CHG_STAT_OTP_DONE:
> -	case CHG_STAT_TSD_TRICKLE:
> -	case CHG_STAT_TSD_FAST:
> -	case CHG_STAT_TSD_TOPOFF:
> -	case CHG_STAT_BAT_ERR:
> -		*val = POWER_SUPPLY_STATUS_NOT_CHARGING;
> -		break;
> -	case CHG_STAT_DONE:
> -		*val = POWER_SUPPLY_STATUS_FULL;
> -		break;
> -	case CHG_STAT_TRICKLE:
> -	case CHG_STAT_FAST:
> -	case CHG_STAT_TOPOFF:
> -		*val = POWER_SUPPLY_STATUS_CHARGING;
> -		break;
> -	default:
> -		*val = POWER_SUPPLY_STATUS_UNKNOWN;
> -		break;
> -	}
> -
> -	return 0;
> -}
> -
> -static int bd70528_get_charge_type(struct bd70528_psy *bdpsy, int *val)
> -{
> -	int ret;
> -	unsigned int v;
> -
> -	ret = regmap_read(bdpsy->regmap, BD70528_REG_CHG_CURR_STAT, &v);
> -	if (ret) {
> -		dev_err(bdpsy->dev, "Charger state read failure %d\n",
> -			ret);
> -		return ret;
> -	}
> -
> -	switch (v & BD70528_MASK_CHG_STAT) {
> -	case CHG_STAT_TRICKLE:
> -		*val = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
> -		break;
> -	case CHG_STAT_FAST:
> -	case CHG_STAT_TOPOFF:
> -		*val = POWER_SUPPLY_CHARGE_TYPE_FAST;
> -		break;
> -	case CHG_STAT_DONE:
> -	case CHG_STAT_SUSPEND:
> -	/* Maybe we should check the CHG_TTRI_EN? */
> -	case CHG_STAT_OTP_TRICKLE:
> -	case CHG_STAT_OTP_FAST:
> -	case CHG_STAT_OTP_DONE:
> -	case CHG_STAT_TSD_TRICKLE:
> -	case CHG_STAT_TSD_FAST:
> -	case CHG_STAT_TSD_TOPOFF:
> -	case CHG_STAT_BAT_ERR:
> -		*val = POWER_SUPPLY_CHARGE_TYPE_NONE;
> -		break;
> -	default:
> -		*val = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
> -		break;
> -	}
> -
> -	return 0;
> -}
> -
> -static int bd70528_get_battery_health(struct bd70528_psy *bdpsy, int *val)
> -{
> -	int ret;
> -	unsigned int v;
> -
> -	ret = regmap_read(bdpsy->regmap, BD70528_REG_CHG_BAT_STAT, &v);
> -	if (ret) {
> -		dev_err(bdpsy->dev, "Battery state read failure %d\n",
> -			ret);
> -		return ret;
> -	}
> -	/* No battery? */
> -	if (!(v & BD70528_MASK_CHG_BAT_DETECT))
> -		*val = POWER_SUPPLY_HEALTH_DEAD;
> -	else if (v & BD70528_MASK_CHG_BAT_OVERVOLT)
> -		*val = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
> -	else if (v & BD70528_MASK_CHG_BAT_TIMER)
> -		*val = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
> -	else
> -		*val = POWER_SUPPLY_HEALTH_GOOD;
> -
> -	return 0;
> -}
> -
> -static int bd70528_get_online(struct bd70528_psy *bdpsy, int *val)
> -{
> -	int ret;
> -	unsigned int v;
> -
> -	ret = regmap_read(bdpsy->regmap, BD70528_REG_CHG_IN_STAT, &v);
> -	if (ret) {
> -		dev_err(bdpsy->dev, "DC1 IN state read failure %d\n",
> -			ret);
> -		return ret;
> -	}
> -
> -	*val = (v & BD70528_MASK_CHG_DCIN1_UVLO) ? 1 : 0;
> -
> -	return 0;
> -}
> -
> -static int bd70528_get_present(struct bd70528_psy *bdpsy, int *val)
> -{
> -	int ret;
> -	unsigned int v;
> -
> -	ret = regmap_read(bdpsy->regmap, BD70528_REG_CHG_BAT_STAT, &v);
> -	if (ret) {
> -		dev_err(bdpsy->dev, "Battery state read failure %d\n",
> -			ret);
> -		return ret;
> -	}
> -
> -	*val = (v & BD70528_MASK_CHG_BAT_DETECT) ? 1 : 0;
> -
> -	return 0;
> -}
> -
> -static const struct linear_range current_limit_ranges[] = {
> -	{
> -		.min = 5,
> -		.step = 1,
> -		.min_sel = 0,
> -		.max_sel = 0x22,
> -	},
> -	{
> -		.min = 40,
> -		.step = 5,
> -		.min_sel = 0x23,
> -		.max_sel = 0x26,
> -	},
> -	{
> -		.min = 60,
> -		.step = 20,
> -		.min_sel = 0x27,
> -		.max_sel = 0x2d,
> -	},
> -	{
> -		.min = 200,
> -		.step = 50,
> -		.min_sel = 0x2e,
> -		.max_sel = 0x34,
> -	},
> -	{
> -		.min = 500,
> -		.step = 0,
> -		.min_sel = 0x35,
> -		.max_sel = 0x3f,
> -	},
> -};
> -
> -/*
> - * BD70528 would support setting and getting own charge current/
> - * voltage for low temperatures. The driver currently only reads
> - * the charge current at room temperature. We do set both though.
> - */
> -static const struct linear_range warm_charge_curr[] = {
> -	{
> -		.min = 10,
> -		.step = 10,
> -		.min_sel = 0,
> -		.max_sel = 0x12,
> -	},
> -	{
> -		.min = 200,
> -		.step = 25,
> -		.min_sel = 0x13,
> -		.max_sel = 0x1f,
> -	},
> -};
> -
> -/*
> - * Cold charge current selectors are identical to warm charge current
> - * selectors. The difference is that only smaller currents are available
> - * at cold charge range.
> - */
> -#define MAX_COLD_CHG_CURR_SEL 0x15
> -#define MAX_WARM_CHG_CURR_SEL 0x1f
> -#define MIN_CHG_CURR_SEL 0x0
> -
> -static int get_charge_current(struct bd70528_psy *bdpsy, int *ma)
> -{
> -	unsigned int sel;
> -	int ret;
> -
> -	ret = regmap_read(bdpsy->regmap, BD70528_REG_CHG_CHG_CURR_WARM,
> -			  &sel);
> -	if (ret) {
> -		dev_err(bdpsy->dev,
> -			"Charge current reading failed (%d)\n", ret);
> -		return ret;
> -	}
> -
> -	sel &= BD70528_MASK_CHG_CHG_CURR;
> -
> -	ret = linear_range_get_value_array(&warm_charge_curr[0],
> -					   ARRAY_SIZE(warm_charge_curr),
> -					   sel, ma);
> -	if (ret) {
> -		dev_err(bdpsy->dev,
> -			"Unknown charge current value 0x%x\n",
> -			sel);
> -	}
> -
> -	return ret;
> -}
> -
> -static int get_current_limit(struct bd70528_psy *bdpsy, int *ma)
> -{
> -	unsigned int sel;
> -	int ret;
> -
> -	ret = regmap_read(bdpsy->regmap, BD70528_REG_CHG_DCIN_ILIM,
> -			  &sel);
> -
> -	if (ret) {
> -		dev_err(bdpsy->dev,
> -			"Input current limit reading failed (%d)\n", ret);
> -		return ret;
> -	}
> -
> -	sel &= BD70528_MASK_CHG_DCIN_ILIM;
> -
> -	ret = linear_range_get_value_array(&current_limit_ranges[0],
> -					   ARRAY_SIZE(current_limit_ranges),
> -					   sel, ma);
> -	if (ret) {
> -		/* Unspecified values mean 500 mA */
> -		*ma = 500;
> -	}
> -	return 0;
> -}
> -
> -static enum power_supply_property bd70528_charger_props[] = {
> -	POWER_SUPPLY_PROP_STATUS,
> -	POWER_SUPPLY_PROP_CHARGE_TYPE,
> -	POWER_SUPPLY_PROP_HEALTH,
> -	POWER_SUPPLY_PROP_PRESENT,
> -	POWER_SUPPLY_PROP_ONLINE,
> -	POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
> -	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
> -	POWER_SUPPLY_PROP_MODEL_NAME,
> -	POWER_SUPPLY_PROP_MANUFACTURER,
> -};
> -
> -static int bd70528_charger_get_property(struct power_supply *psy,
> -					enum power_supply_property psp,
> -					union power_supply_propval *val)
> -{
> -	struct bd70528_psy *bdpsy = power_supply_get_drvdata(psy);
> -	int ret = 0;
> -
> -	switch (psp) {
> -	case POWER_SUPPLY_PROP_STATUS:
> -		return bd70528_get_charger_status(bdpsy, &val->intval);
> -	case POWER_SUPPLY_PROP_CHARGE_TYPE:
> -		return bd70528_get_charge_type(bdpsy, &val->intval);
> -	case POWER_SUPPLY_PROP_HEALTH:
> -		return bd70528_get_battery_health(bdpsy, &val->intval);
> -	case POWER_SUPPLY_PROP_PRESENT:
> -		return bd70528_get_present(bdpsy, &val->intval);
> -	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
> -		ret = get_current_limit(bdpsy, &val->intval);
> -		val->intval *= 1000;
> -		return ret;
> -	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
> -		ret = get_charge_current(bdpsy, &val->intval);
> -		val->intval *= 1000;
> -		return ret;
> -	case POWER_SUPPLY_PROP_ONLINE:
> -		return bd70528_get_online(bdpsy, &val->intval);
> -	case POWER_SUPPLY_PROP_MODEL_NAME:
> -		val->strval = bd70528_charger_model;
> -		return 0;
> -	case POWER_SUPPLY_PROP_MANUFACTURER:
> -		val->strval = bd70528_charger_manufacturer;
> -		return 0;
> -	default:
> -		break;
> -	}
> -
> -	return -EINVAL;
> -}
> -
> -static int bd70528_prop_is_writable(struct power_supply *psy,
> -				    enum power_supply_property psp)
> -{
> -	switch (psp) {
> -	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
> -	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
> -		return 1;
> -	default:
> -		break;
> -	}
> -	return 0;
> -}
> -
> -static int set_charge_current(struct bd70528_psy *bdpsy, int ma)
> -{
> -	unsigned int reg;
> -	int ret = 0, tmpret;
> -	bool found;
> -
> -	if (ma > 500) {
> -		dev_warn(bdpsy->dev,
> -			 "Requested charge current %u exceed maximum (500mA)\n",
> -			 ma);
> -		reg = MAX_WARM_CHG_CURR_SEL;
> -		goto set;
> -	}
> -	if (ma < 10) {
> -		dev_err(bdpsy->dev,
> -			"Requested charge current %u smaller than min (10mA)\n",
> -			 ma);
> -		reg = MIN_CHG_CURR_SEL;
> -		ret = -EINVAL;
> -		goto set;
> -	}
> -
> -/*
> - * For BD70528 voltage/current limits we happily accept any value which
> - * belongs the range. We could check if value matching the selector is
> - * desired by computing the range min + (sel - sel_low) * range step - but
> - * I guess it is enough if we use voltage/current which is closest (below)
> - * the requested?
> - */
> -
> -	ret = linear_range_get_selector_low_array(warm_charge_curr,
> -						  ARRAY_SIZE(warm_charge_curr),
> -						  ma, &reg, &found);
> -	if (ret) {
> -		dev_err(bdpsy->dev,
> -			 "Unsupported charge current %u mA\n", ma);
> -		reg = MIN_CHG_CURR_SEL;
> -		goto set;
> -	}
> -	if (!found) {
> -		/*
> -		 * There was a gap in supported values and we hit it.
> -		 * Yet a smaller value was found so we use it.
> -		 */
> -		dev_warn(bdpsy->dev,
> -			 "Unsupported charge current %u mA\n", ma);
> -	}
> -set:
> -
> -	tmpret = regmap_update_bits(bdpsy->regmap,
> -				    BD70528_REG_CHG_CHG_CURR_WARM,
> -				    BD70528_MASK_CHG_CHG_CURR, reg);
> -	if (tmpret)
> -		dev_err(bdpsy->dev,
> -			"Charge current write failure (%d)\n", tmpret);
> -
> -	if (reg > MAX_COLD_CHG_CURR_SEL)
> -		reg = MAX_COLD_CHG_CURR_SEL;
> -
> -	if (!tmpret)
> -		tmpret = regmap_update_bits(bdpsy->regmap,
> -					    BD70528_REG_CHG_CHG_CURR_COLD,
> -					    BD70528_MASK_CHG_CHG_CURR, reg);
> -
> -	if (!ret)
> -		ret = tmpret;
> -
> -	return ret;
> -}
> -
> -#define MAX_CURR_LIMIT_SEL 0x34
> -#define MIN_CURR_LIMIT_SEL 0x0
> -
> -static int set_current_limit(struct bd70528_psy *bdpsy, int ma)
> -{
> -	unsigned int reg;
> -	int ret = 0, tmpret;
> -	bool found;
> -
> -	if (ma > 500) {
> -		dev_warn(bdpsy->dev,
> -			 "Requested current limit %u exceed maximum (500mA)\n",
> -			 ma);
> -		reg = MAX_CURR_LIMIT_SEL;
> -		goto set;
> -	}
> -	if (ma < 5) {
> -		dev_err(bdpsy->dev,
> -			"Requested current limit %u smaller than min (5mA)\n",
> -			ma);
> -		reg = MIN_CURR_LIMIT_SEL;
> -		ret = -EINVAL;
> -		goto set;
> -	}
> -
> -	ret = linear_range_get_selector_low_array(current_limit_ranges,
> -					ARRAY_SIZE(current_limit_ranges),
> -					ma, &reg, &found);
> -	if (ret) {
> -		dev_err(bdpsy->dev, "Unsupported current limit %umA\n", ma);
> -		reg = MIN_CURR_LIMIT_SEL;
> -		goto set;
> -	}
> -	if (!found) {
> -		/*
> -		 * There was a gap in supported values and we hit it.
> -		 * We found a smaller value from ranges and use it.
> -		 * Warn user though.
> -		 */
> -		dev_warn(bdpsy->dev, "Unsupported current limit %umA\n", ma);
> -	}
> -
> -set:
> -	tmpret = regmap_update_bits(bdpsy->regmap,
> -				    BD70528_REG_CHG_DCIN_ILIM,
> -				    BD70528_MASK_CHG_DCIN_ILIM, reg);
> -
> -	if (!ret)
> -		ret = tmpret;
> -
> -	return ret;
> -}
> -
> -static int bd70528_charger_set_property(struct power_supply *psy,
> -					enum power_supply_property psp,
> -					const union power_supply_propval *val)
> -{
> -	struct bd70528_psy *bdpsy = power_supply_get_drvdata(psy);
> -
> -	switch (psp) {
> -	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
> -		return set_current_limit(bdpsy, val->intval / 1000);
> -	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
> -		return set_charge_current(bdpsy, val->intval / 1000);
> -	default:
> -		break;
> -	}
> -	return -EINVAL;
> -}
> -
> -static const struct power_supply_desc bd70528_charger_desc = {
> -	.name		= "bd70528-charger",
> -	.type		= POWER_SUPPLY_TYPE_MAINS,
> -	.properties	= bd70528_charger_props,
> -	.num_properties	= ARRAY_SIZE(bd70528_charger_props),
> -	.get_property	= bd70528_charger_get_property,
> -	.set_property	= bd70528_charger_set_property,
> -	.property_is_writeable	= bd70528_prop_is_writable,
> -};
> -
> -static int bd70528_power_probe(struct platform_device *pdev)
> -{
> -	struct bd70528_psy *bdpsy;
> -	struct power_supply_config cfg = {};
> -
> -	bdpsy = devm_kzalloc(&pdev->dev, sizeof(*bdpsy), GFP_KERNEL);
> -	if (!bdpsy)
> -		return -ENOMEM;
> -
> -	bdpsy->regmap = dev_get_regmap(pdev->dev.parent, NULL);
> -	if (!bdpsy->regmap) {
> -		dev_err(&pdev->dev, "No regmap found for chip\n");
> -		return -EINVAL;
> -	}
> -	bdpsy->dev = &pdev->dev;
> -
> -	platform_set_drvdata(pdev, bdpsy);
> -	cfg.drv_data = bdpsy;
> -	cfg.of_node = pdev->dev.parent->of_node;
> -
> -	bdpsy->psy = devm_power_supply_register(&pdev->dev,
> -						&bd70528_charger_desc, &cfg);
> -	if (IS_ERR(bdpsy->psy)) {
> -		dev_err(&pdev->dev, "failed: power supply register\n");
> -		return PTR_ERR(bdpsy->psy);
> -	}
> -
> -	return bd70528_get_irqs(pdev, bdpsy);
> -}
> -
> -static struct platform_driver bd70528_power = {
> -	.driver = {
> -		.name = "bd70528-power"
> -	},
> -	.probe = bd70528_power_probe,
> -};
> -
> -module_platform_driver(bd70528_power);
> -
> -MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
> -MODULE_DESCRIPTION("BD70528 power-supply driver");
> -MODULE_LICENSE("GPL");
> -MODULE_ALIAS("platform:bd70528-power");
> -- 
> 2.25.4
> 
> 
> -- 
> Matti Vaittinen, Linux device drivers
> ROHM Semiconductors, Finland SWDC
> Kiviharjunlenkki 1E
> 90220 OULU
> FINLAND
> 
> ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~
> Simon says - in Latin please.
> ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~
> Thanks to Simon Glass for the translation =] 



[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/9] clk: bd718xx: Drop BD70528 support
  2021-05-25 10:15 ` [PATCH 5/9] clk: bd718xx: " Matti Vaittinen
@ 2021-06-28  1:43   ` Stephen Boyd
  0 siblings, 0 replies; 20+ messages in thread
From: Stephen Boyd @ 2021-06-28  1:43 UTC (permalink / raw)
  To: Matti Vaittinen, Matti Vaittinen
  Cc: Lee Jones, Rob Herring, Liam Girdwood, Mark Brown,
	Michael Turquette, Matti Vaittinen, Linus Walleij,
	Bartosz Golaszewski, Sebastian Reichel, Alessandro Zummo,
	Alexandre Belloni, Wim Van Sebroeck, Guenter Roeck, devicetree,
	linux-kernel, linux-clk, linux-power, linux-gpio, linux-pm,
	linux-rtc, linux-watchdog

Quoting Matti Vaittinen (2021-05-25 03:15:10)
> The only known BD70528 use-cases are such that the PMIC is controlled
> from separate MCU which is not running Linux. I am not aware of
> any Linux driver users. Furthermore, it seems there is no demand for
> this IC. Let's ease the maintenance burden and drop the driver. We can
> always add it back if there is sudden need for it.
> 
> Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
> 
> ---

Applied to clk-next

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2021-06-28  1:43 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-25 10:13 [PATCH 0/9] Drop ROHM BD70528 support Matti Vaittinen
2021-05-25 10:13 ` [PATCH 1/9] dt-bindings: mfd: regulator: Drop " Matti Vaittinen
2021-05-25 10:14 ` [PATCH 2/9] rtc: bd70528: " Matti Vaittinen
2021-05-25 11:47   ` Alexandre Belloni
2021-05-25 11:59     ` Vaittinen, Matti
2021-05-25 13:08       ` Alexandre Belloni
2021-05-25 15:41         ` Vaittinen, Matti
2021-05-25 10:14 ` [PATCH 3/9] watchdog: bd70528 drop bd70528 support Matti Vaittinen
2021-05-25 11:07   ` Guenter Roeck
2021-05-25 10:14 ` [PATCH 4/9] regulator: bd70528: Drop BD70528 support Matti Vaittinen
2021-05-25 10:15 ` [PATCH 5/9] clk: bd718xx: " Matti Vaittinen
2021-06-28  1:43   ` Stephen Boyd
2021-05-25 10:15 ` [PATCH 6/9] gpio: bd70528 " Matti Vaittinen
2021-05-28 14:23   ` Bartosz Golaszewski
2021-05-25 10:15 ` [PATCH 7/9] power: supply: " Matti Vaittinen
2021-06-04 10:10   ` Sebastian Reichel
2021-05-25 10:16 ` [PATCH 8/9] mfd: bd70528: " Matti Vaittinen
2021-06-01 15:48   ` Lee Jones
2021-05-25 10:16 ` [PATCH 9/9] MAINTAINERS: bd70528: Drop ROHM BD70528 drivers Matti Vaittinen
2021-05-27 10:35 ` [PATCH 0/9] Drop ROHM BD70528 support Vaittinen, Matti

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).