From: Guenter Roeck <linux@roeck-us.net>
To: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>,
Matti Vaittinen <mazziesaccount@gmail.com>
Cc: Lee Jones <lee.jones@linaro.org>,
Rob Herring <robh+dt@kernel.org>,
Liam Girdwood <lgirdwood@gmail.com>,
Mark Brown <broonie@kernel.org>,
Michael Turquette <mturquette@baylibre.com>,
Stephen Boyd <sboyd@kernel.org>,
Linus Walleij <linus.walleij@linaro.org>,
Bartosz Golaszewski <bgolaszewski@baylibre.com>,
Sebastian Reichel <sre@kernel.org>,
Alessandro Zummo <a.zummo@towertech.it>,
Alexandre Belloni <alexandre.belloni@bootlin.com>,
Wim Van Sebroeck <wim@linux-watchdog.org>,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-clk@vger.kernel.org, linux-power@fi.rohmeurope.com,
linux-gpio@vger.kernel.org, linux-pm@vger.kernel.org,
linux-rtc@vger.kernel.org, linux-watchdog@vger.kernel.org
Subject: Re: [PATCH 3/9] watchdog: bd70528 drop bd70528 support
Date: Tue, 25 May 2021 04:07:23 -0700 [thread overview]
Message-ID: <fa9b4b9f-4a2d-d95a-eaa6-89aa153d0cbb@roeck-us.net> (raw)
In-Reply-To: <994d2e374262c3f59f4465c03ef23d3116120778.1621937490.git.matti.vaittinen@fi.rohmeurope.com>
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, ®);
> - 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");
>
next prev parent reply other threads:[~2021-05-25 11:07 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=fa9b4b9f-4a2d-d95a-eaa6-89aa153d0cbb@roeck-us.net \
--to=linux@roeck-us.net \
--cc=a.zummo@towertech.it \
--cc=alexandre.belloni@bootlin.com \
--cc=bgolaszewski@baylibre.com \
--cc=broonie@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=lee.jones@linaro.org \
--cc=lgirdwood@gmail.com \
--cc=linus.walleij@linaro.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-power@fi.rohmeurope.com \
--cc=linux-rtc@vger.kernel.org \
--cc=linux-watchdog@vger.kernel.org \
--cc=matti.vaittinen@fi.rohmeurope.com \
--cc=mazziesaccount@gmail.com \
--cc=mturquette@baylibre.com \
--cc=robh+dt@kernel.org \
--cc=sboyd@kernel.org \
--cc=sre@kernel.org \
--cc=wim@linux-watchdog.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox