* [PATCH 0/8] watchdog: Convert drivers to DEFINE_SIMPLE_DEV_PM_OPS()
@ 2026-08-26 6:08 Triet Hoang
2026-08-26 6:08 ` [PATCH 1/8] watchdog: cadence_wdt: Convert " Triet Hoang
` (7 more replies)
0 siblings, 8 replies; 16+ messages in thread
From: Triet Hoang @ 2026-08-26 6:08 UTC (permalink / raw)
To: wim; +Cc: linux, linux-watchdog, linux-kernel, Triet Hoang
This series converts the watchdog drivers to use DEFINE_SIMPLE_DEV_PM_OPS()
and pm_sleep_ptr().
This is a straightforward cleanup with no functional change intended.
Signed-off-by: Triet Hoang <triet.hoang.dev@gmail.com>
Triet Hoang (8):
watchdog: cadence_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
watchdog: da9062: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
watchdog: keembay_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
watchdog: msc313e_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
watchdog: of_xilinx_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
watchdog: pm8916_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
watchdog: sp805_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
watchdog: stmp3xxx_rtc_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
drivers/watchdog/cadence_wdt.c | 8 ++++----
drivers/watchdog/da9062_wdt.c | 8 ++++----
drivers/watchdog/keembay_wdt.c | 8 ++++----
drivers/watchdog/msc313e_wdt.c | 8 ++++----
drivers/watchdog/of_xilinx_wdt.c | 8 ++++----
drivers/watchdog/pm8916_wdt.c | 8 ++++----
drivers/watchdog/sp805_wdt.c | 8 ++++----
drivers/watchdog/stmp3xxx_rtc_wdt.c | 8 ++++----
8 files changed, 32 insertions(+), 32 deletions(-)
--
2.53.0
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 1/8] watchdog: cadence_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
2026-08-26 6:08 [PATCH 0/8] watchdog: Convert drivers to DEFINE_SIMPLE_DEV_PM_OPS() Triet Hoang
@ 2026-08-26 6:08 ` Triet Hoang
2026-08-26 6:08 ` [PATCH 2/8] watchdog: da9062: " Triet Hoang
` (6 subsequent siblings)
7 siblings, 0 replies; 16+ messages in thread
From: Triet Hoang @ 2026-08-26 6:08 UTC (permalink / raw)
To: wim; +Cc: linux, linux-watchdog, linux-kernel, Triet Hoang
Convert deprecated SIMPLE_DEV_PM_OPS() to DEFINE_SIMPLE_DEV_PM_OPS()
and pm_sleep_ptr().
This lets us drop the __maybe_unused annotations from the resume callback.
Signed-off-by: Triet Hoang <triet.hoang.dev@gmail.com>
---
drivers/watchdog/cadence_wdt.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/watchdog/cadence_wdt.c b/drivers/watchdog/cadence_wdt.c
index ad46b33ce5f2..ba2efccef467 100644
--- a/drivers/watchdog/cadence_wdt.c
+++ b/drivers/watchdog/cadence_wdt.c
@@ -359,7 +359,7 @@ static int cdns_wdt_probe(struct platform_device *pdev)
* @dev: handle to the device structure.
* Return: 0 always.
*/
-static int __maybe_unused cdns_wdt_suspend(struct device *dev)
+static int cdns_wdt_suspend(struct device *dev)
{
struct cdns_wdt *wdt = dev_get_drvdata(dev);
@@ -377,7 +377,7 @@ static int __maybe_unused cdns_wdt_suspend(struct device *dev)
* @dev: handle to the device structure.
* Return: 0 on success, errno otherwise.
*/
-static int __maybe_unused cdns_wdt_resume(struct device *dev)
+static int cdns_wdt_resume(struct device *dev)
{
int ret;
struct cdns_wdt *wdt = dev_get_drvdata(dev);
@@ -394,7 +394,7 @@ static int __maybe_unused cdns_wdt_resume(struct device *dev)
return 0;
}
-static SIMPLE_DEV_PM_OPS(cdns_wdt_pm_ops, cdns_wdt_suspend, cdns_wdt_resume);
+static DEFINE_SIMPLE_DEV_PM_OPS(cdns_wdt_pm_ops, cdns_wdt_suspend, cdns_wdt_resume);
static const struct of_device_id cdns_wdt_of_match[] = {
{ .compatible = "cdns,wdt-r1p2", },
@@ -408,7 +408,7 @@ static struct platform_driver cdns_wdt_driver = {
.driver = {
.name = "cdns-wdt",
.of_match_table = cdns_wdt_of_match,
- .pm = &cdns_wdt_pm_ops,
+ .pm = pm_sleep_ptr(&cdns_wdt_pm_ops),
},
};
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 2/8] watchdog: da9062: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
2026-08-26 6:08 [PATCH 0/8] watchdog: Convert drivers to DEFINE_SIMPLE_DEV_PM_OPS() Triet Hoang
2026-08-26 6:08 ` [PATCH 1/8] watchdog: cadence_wdt: Convert " Triet Hoang
@ 2026-08-26 6:08 ` Triet Hoang
2026-08-27 7:42 ` Tzung-Bi Shih
2026-08-26 6:08 ` [PATCH 3/8] watchdog: keembay_wdt: " Triet Hoang
` (5 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Triet Hoang @ 2026-08-26 6:08 UTC (permalink / raw)
To: wim; +Cc: linux, linux-watchdog, linux-kernel, Triet Hoang
Convert deprecated SIMPLE_DEV_PM_OPS() to DEFINE_SIMPLE_DEV_PM_OPS()
and pm_sleep_ptr().
This lets us drop the __maybe_unused annotations from the resume callback.
Signed-off-by: Triet Hoang <triet.hoang.dev@gmail.com>
---
drivers/watchdog/da9062_wdt.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/watchdog/da9062_wdt.c b/drivers/watchdog/da9062_wdt.c
index 426962547df1..2b6946478527 100644
--- a/drivers/watchdog/da9062_wdt.c
+++ b/drivers/watchdog/da9062_wdt.c
@@ -248,7 +248,7 @@ static int da9062_wdt_probe(struct platform_device *pdev)
return devm_watchdog_register_device(dev, &wdt->wdtdev);
}
-static int __maybe_unused da9062_wdt_suspend(struct device *dev)
+static int da9062_wdt_suspend(struct device *dev)
{
struct watchdog_device *wdd = dev_get_drvdata(dev);
struct da9062_watchdog *wdt = watchdog_get_drvdata(wdd);
@@ -262,7 +262,7 @@ static int __maybe_unused da9062_wdt_suspend(struct device *dev)
return 0;
}
-static int __maybe_unused da9062_wdt_resume(struct device *dev)
+static int da9062_wdt_resume(struct device *dev)
{
struct watchdog_device *wdd = dev_get_drvdata(dev);
struct da9062_watchdog *wdt = watchdog_get_drvdata(wdd);
@@ -276,14 +276,14 @@ static int __maybe_unused da9062_wdt_resume(struct device *dev)
return 0;
}
-static SIMPLE_DEV_PM_OPS(da9062_wdt_pm_ops,
+static DEFINE_SIMPLE_DEV_PM_OPS(da9062_wdt_pm_ops,
da9062_wdt_suspend, da9062_wdt_resume);
static struct platform_driver da9062_wdt_driver = {
.probe = da9062_wdt_probe,
.driver = {
.name = "da9062-watchdog",
- .pm = &da9062_wdt_pm_ops,
+ .pm = pm_sleep_ptr(&da9062_wdt_pm_ops),
.of_match_table = da9062_compatible_id_table,
},
};
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 3/8] watchdog: keembay_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
2026-08-26 6:08 [PATCH 0/8] watchdog: Convert drivers to DEFINE_SIMPLE_DEV_PM_OPS() Triet Hoang
2026-08-26 6:08 ` [PATCH 1/8] watchdog: cadence_wdt: Convert " Triet Hoang
2026-08-26 6:08 ` [PATCH 2/8] watchdog: da9062: " Triet Hoang
@ 2026-08-26 6:08 ` Triet Hoang
2026-08-26 6:17 ` sashiko-bot
2026-08-26 6:08 ` [PATCH 4/8] watchdog: msc313e_wdt: " Triet Hoang
` (4 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Triet Hoang @ 2026-08-26 6:08 UTC (permalink / raw)
To: wim; +Cc: linux, linux-watchdog, linux-kernel, Triet Hoang
Convert deprecated SIMPLE_DEV_PM_OPS() to DEFINE_SIMPLE_DEV_PM_OPS()
and pm_sleep_ptr().
This lets us drop the __maybe_unused annotations from the resume callback.
Signed-off-by: Triet Hoang <triet.hoang.dev@gmail.com>
---
drivers/watchdog/keembay_wdt.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/watchdog/keembay_wdt.c b/drivers/watchdog/keembay_wdt.c
index 7c8e53921e40..20b9eb6a2727 100644
--- a/drivers/watchdog/keembay_wdt.c
+++ b/drivers/watchdog/keembay_wdt.c
@@ -250,7 +250,7 @@ static int keembay_wdt_probe(struct platform_device *pdev)
return 0;
}
-static int __maybe_unused keembay_wdt_suspend(struct device *dev)
+static int keembay_wdt_suspend(struct device *dev)
{
struct keembay_wdt *wdt = dev_get_drvdata(dev);
@@ -260,7 +260,7 @@ static int __maybe_unused keembay_wdt_suspend(struct device *dev)
return 0;
}
-static int __maybe_unused keembay_wdt_resume(struct device *dev)
+static int keembay_wdt_resume(struct device *dev)
{
struct keembay_wdt *wdt = dev_get_drvdata(dev);
@@ -270,7 +270,7 @@ static int __maybe_unused keembay_wdt_resume(struct device *dev)
return 0;
}
-static SIMPLE_DEV_PM_OPS(keembay_wdt_pm_ops, keembay_wdt_suspend,
+static DEFINE_SIMPLE_DEV_PM_OPS(keembay_wdt_pm_ops, keembay_wdt_suspend,
keembay_wdt_resume);
static const struct of_device_id keembay_wdt_match[] = {
@@ -284,7 +284,7 @@ static struct platform_driver keembay_wdt_driver = {
.driver = {
.name = "keembay_wdt",
.of_match_table = keembay_wdt_match,
- .pm = &keembay_wdt_pm_ops,
+ .pm = pm_sleep_ptr(&keembay_wdt_pm_ops),
},
};
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 4/8] watchdog: msc313e_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
2026-08-26 6:08 [PATCH 0/8] watchdog: Convert drivers to DEFINE_SIMPLE_DEV_PM_OPS() Triet Hoang
` (2 preceding siblings ...)
2026-08-26 6:08 ` [PATCH 3/8] watchdog: keembay_wdt: " Triet Hoang
@ 2026-08-26 6:08 ` Triet Hoang
2026-08-26 6:20 ` sashiko-bot
2026-08-26 6:08 ` [PATCH 5/8] watchdog: of_xilinx_wdt: " Triet Hoang
` (3 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Triet Hoang @ 2026-08-26 6:08 UTC (permalink / raw)
To: wim; +Cc: linux, linux-watchdog, linux-kernel, Triet Hoang
Convert deprecated SIMPLE_DEV_PM_OPS() to DEFINE_SIMPLE_DEV_PM_OPS()
and pm_sleep_ptr().
This lets us drop the __maybe_unused annotations from the resume callback.
Signed-off-by: Triet Hoang <triet.hoang.dev@gmail.com>
---
drivers/watchdog/msc313e_wdt.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/watchdog/msc313e_wdt.c b/drivers/watchdog/msc313e_wdt.c
index d962589e2c55..10de94205600 100644
--- a/drivers/watchdog/msc313e_wdt.c
+++ b/drivers/watchdog/msc313e_wdt.c
@@ -132,7 +132,7 @@ static int msc313e_wdt_probe(struct platform_device *pdev)
return devm_watchdog_register_device(dev, &priv->wdev);
}
-static int __maybe_unused msc313e_wdt_suspend(struct device *dev)
+static int msc313e_wdt_suspend(struct device *dev)
{
struct msc313e_wdt_priv *priv = dev_get_drvdata(dev);
@@ -142,7 +142,7 @@ static int __maybe_unused msc313e_wdt_suspend(struct device *dev)
return 0;
}
-static int __maybe_unused msc313e_wdt_resume(struct device *dev)
+static int msc313e_wdt_resume(struct device *dev)
{
struct msc313e_wdt_priv *priv = dev_get_drvdata(dev);
@@ -152,13 +152,13 @@ static int __maybe_unused msc313e_wdt_resume(struct device *dev)
return 0;
}
-static SIMPLE_DEV_PM_OPS(msc313e_wdt_pm_ops, msc313e_wdt_suspend, msc313e_wdt_resume);
+static DEFINE_SIMPLE_DEV_PM_OPS(msc313e_wdt_pm_ops, msc313e_wdt_suspend, msc313e_wdt_resume);
static struct platform_driver msc313e_wdt_driver = {
.driver = {
.name = "msc313e-wdt",
.of_match_table = msc313e_wdt_of_match,
- .pm = &msc313e_wdt_pm_ops,
+ .pm = pm_sleep_ptr(&msc313e_wdt_pm_ops),
},
.probe = msc313e_wdt_probe,
};
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 5/8] watchdog: of_xilinx_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
2026-08-26 6:08 [PATCH 0/8] watchdog: Convert drivers to DEFINE_SIMPLE_DEV_PM_OPS() Triet Hoang
` (3 preceding siblings ...)
2026-08-26 6:08 ` [PATCH 4/8] watchdog: msc313e_wdt: " Triet Hoang
@ 2026-08-26 6:08 ` Triet Hoang
2026-08-26 6:08 ` [PATCH 6/8] watchdog: pm8916_wdt: " Triet Hoang
` (2 subsequent siblings)
7 siblings, 0 replies; 16+ messages in thread
From: Triet Hoang @ 2026-08-26 6:08 UTC (permalink / raw)
To: wim; +Cc: linux, linux-watchdog, linux-kernel, Triet Hoang
Convert deprecated SIMPLE_DEV_PM_OPS() to DEFINE_SIMPLE_DEV_PM_OPS()
and pm_sleep_ptr().
This lets us drop the __maybe_unused annotations from the resume callback.
Signed-off-by: Triet Hoang <triet.hoang.dev@gmail.com>
---
drivers/watchdog/of_xilinx_wdt.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/watchdog/of_xilinx_wdt.c b/drivers/watchdog/of_xilinx_wdt.c
index 352853e6fe71..d6b1adfe31d1 100644
--- a/drivers/watchdog/of_xilinx_wdt.c
+++ b/drivers/watchdog/of_xilinx_wdt.c
@@ -251,7 +251,7 @@ static int xwdt_probe(struct platform_device *pdev)
* @dev: handle to the device structure.
* Return: 0 always.
*/
-static int __maybe_unused xwdt_suspend(struct device *dev)
+static int xwdt_suspend(struct device *dev)
{
struct xwdt_device *xdev = dev_get_drvdata(dev);
@@ -267,7 +267,7 @@ static int __maybe_unused xwdt_suspend(struct device *dev)
* @dev: handle to the device structure.
* Return: 0 on success, errno otherwise.
*/
-static int __maybe_unused xwdt_resume(struct device *dev)
+static int xwdt_resume(struct device *dev)
{
struct xwdt_device *xdev = dev_get_drvdata(dev);
int ret = 0;
@@ -278,7 +278,7 @@ static int __maybe_unused xwdt_resume(struct device *dev)
return ret;
}
-static SIMPLE_DEV_PM_OPS(xwdt_pm_ops, xwdt_suspend, xwdt_resume);
+static DEFINE_SIMPLE_DEV_PM_OPS(xwdt_pm_ops, xwdt_suspend, xwdt_resume);
/* Match table for of_platform binding */
static const struct of_device_id xwdt_of_match[] = {
@@ -293,7 +293,7 @@ static struct platform_driver xwdt_driver = {
.driver = {
.name = WATCHDOG_NAME,
.of_match_table = xwdt_of_match,
- .pm = &xwdt_pm_ops,
+ .pm = pm_sleep_ptr(&xwdt_pm_ops),
},
};
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 6/8] watchdog: pm8916_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
2026-08-26 6:08 [PATCH 0/8] watchdog: Convert drivers to DEFINE_SIMPLE_DEV_PM_OPS() Triet Hoang
` (4 preceding siblings ...)
2026-08-26 6:08 ` [PATCH 5/8] watchdog: of_xilinx_wdt: " Triet Hoang
@ 2026-08-26 6:08 ` Triet Hoang
2026-08-26 6:08 ` [PATCH 7/8] watchdog: sp805_wdt: " Triet Hoang
2026-08-26 6:08 ` [PATCH 8/8] watchdog: stmp3xxx_rtc_wdt: " Triet Hoang
7 siblings, 0 replies; 16+ messages in thread
From: Triet Hoang @ 2026-08-26 6:08 UTC (permalink / raw)
To: wim; +Cc: linux, linux-watchdog, linux-kernel, Triet Hoang
Convert deprecated SIMPLE_DEV_PM_OPS() to DEFINE_SIMPLE_DEV_PM_OPS()
and pm_sleep_ptr().
This lets us drop the __maybe_unused annotations from the resume callback.
Signed-off-by: Triet Hoang <triet.hoang.dev@gmail.com>
---
drivers/watchdog/pm8916_wdt.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/watchdog/pm8916_wdt.c b/drivers/watchdog/pm8916_wdt.c
index 007ed139ab96..a7ae57fb2453 100644
--- a/drivers/watchdog/pm8916_wdt.c
+++ b/drivers/watchdog/pm8916_wdt.c
@@ -233,7 +233,7 @@ static int pm8916_wdt_probe(struct platform_device *pdev)
return devm_watchdog_register_device(dev, &wdt->wdev);
}
-static int __maybe_unused pm8916_wdt_suspend(struct device *dev)
+static int pm8916_wdt_suspend(struct device *dev)
{
struct pm8916_wdt *wdt = dev_get_drvdata(dev);
@@ -243,7 +243,7 @@ static int __maybe_unused pm8916_wdt_suspend(struct device *dev)
return 0;
}
-static int __maybe_unused pm8916_wdt_resume(struct device *dev)
+static int pm8916_wdt_resume(struct device *dev)
{
struct pm8916_wdt *wdt = dev_get_drvdata(dev);
@@ -253,7 +253,7 @@ static int __maybe_unused pm8916_wdt_resume(struct device *dev)
return 0;
}
-static SIMPLE_DEV_PM_OPS(pm8916_wdt_pm_ops, pm8916_wdt_suspend,
+static DEFINE_SIMPLE_DEV_PM_OPS(pm8916_wdt_pm_ops, pm8916_wdt_suspend,
pm8916_wdt_resume);
static const struct of_device_id pm8916_wdt_id_table[] = {
@@ -267,7 +267,7 @@ static struct platform_driver pm8916_wdt_driver = {
.driver = {
.name = "pm8916-wdt",
.of_match_table = pm8916_wdt_id_table,
- .pm = &pm8916_wdt_pm_ops,
+ .pm = pm_sleep_ptr(&pm8916_wdt_pm_ops),
},
};
module_platform_driver(pm8916_wdt_driver);
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 7/8] watchdog: sp805_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
2026-08-26 6:08 [PATCH 0/8] watchdog: Convert drivers to DEFINE_SIMPLE_DEV_PM_OPS() Triet Hoang
` (5 preceding siblings ...)
2026-08-26 6:08 ` [PATCH 6/8] watchdog: pm8916_wdt: " Triet Hoang
@ 2026-08-26 6:08 ` Triet Hoang
2026-08-26 6:18 ` sashiko-bot
2026-08-26 6:08 ` [PATCH 8/8] watchdog: stmp3xxx_rtc_wdt: " Triet Hoang
7 siblings, 1 reply; 16+ messages in thread
From: Triet Hoang @ 2026-08-26 6:08 UTC (permalink / raw)
To: wim; +Cc: linux, linux-watchdog, linux-kernel, Triet Hoang
Convert deprecated SIMPLE_DEV_PM_OPS() to DEFINE_SIMPLE_DEV_PM_OPS()
and pm_sleep_ptr().
This lets us drop the __maybe_unused annotations from the resume callback.
Signed-off-by: Triet Hoang <triet.hoang.dev@gmail.com>
---
drivers/watchdog/sp805_wdt.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/watchdog/sp805_wdt.c b/drivers/watchdog/sp805_wdt.c
index c2125f204a13..7b01011a5bc8 100644
--- a/drivers/watchdog/sp805_wdt.c
+++ b/drivers/watchdog/sp805_wdt.c
@@ -321,7 +321,7 @@ static void sp805_wdt_remove(struct amba_device *adev)
watchdog_set_drvdata(&wdt->wdd, NULL);
}
-static int __maybe_unused sp805_wdt_suspend(struct device *dev)
+static int sp805_wdt_suspend(struct device *dev)
{
struct sp805_wdt *wdt = dev_get_drvdata(dev);
@@ -331,7 +331,7 @@ static int __maybe_unused sp805_wdt_suspend(struct device *dev)
return 0;
}
-static int __maybe_unused sp805_wdt_resume(struct device *dev)
+static int sp805_wdt_resume(struct device *dev)
{
struct sp805_wdt *wdt = dev_get_drvdata(dev);
@@ -341,7 +341,7 @@ static int __maybe_unused sp805_wdt_resume(struct device *dev)
return 0;
}
-static SIMPLE_DEV_PM_OPS(sp805_wdt_dev_pm_ops, sp805_wdt_suspend,
+static DEFINE_SIMPLE_DEV_PM_OPS(sp805_wdt_dev_pm_ops, sp805_wdt_suspend,
sp805_wdt_resume);
static const struct amba_id sp805_wdt_ids[] = {
@@ -361,7 +361,7 @@ MODULE_DEVICE_TABLE(amba, sp805_wdt_ids);
static struct amba_driver sp805_wdt_driver = {
.drv = {
.name = MODULE_NAME,
- .pm = &sp805_wdt_dev_pm_ops,
+ .pm = pm_sleep_ptr(&sp805_wdt_dev_pm_ops),
},
.id_table = sp805_wdt_ids,
.probe = sp805_wdt_probe,
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 8/8] watchdog: stmp3xxx_rtc_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
2026-08-26 6:08 [PATCH 0/8] watchdog: Convert drivers to DEFINE_SIMPLE_DEV_PM_OPS() Triet Hoang
` (6 preceding siblings ...)
2026-08-26 6:08 ` [PATCH 7/8] watchdog: sp805_wdt: " Triet Hoang
@ 2026-08-26 6:08 ` Triet Hoang
2026-08-26 6:19 ` sashiko-bot
7 siblings, 1 reply; 16+ messages in thread
From: Triet Hoang @ 2026-08-26 6:08 UTC (permalink / raw)
To: wim; +Cc: linux, linux-watchdog, linux-kernel, Triet Hoang
Convert deprecated SIMPLE_DEV_PM_OPS() to DEFINE_SIMPLE_DEV_PM_OPS()
and pm_sleep_ptr().
This lets us drop the __maybe_unused annotations from the resume callback.
Signed-off-by: Triet Hoang <triet.hoang.dev@gmail.com>
---
drivers/watchdog/stmp3xxx_rtc_wdt.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/watchdog/stmp3xxx_rtc_wdt.c b/drivers/watchdog/stmp3xxx_rtc_wdt.c
index 060447101f48..958e68746f8e 100644
--- a/drivers/watchdog/stmp3xxx_rtc_wdt.c
+++ b/drivers/watchdog/stmp3xxx_rtc_wdt.c
@@ -114,7 +114,7 @@ static void stmp3xxx_wdt_remove(struct platform_device *pdev)
unregister_reboot_notifier(&wdt_notifier);
}
-static int __maybe_unused stmp3xxx_wdt_suspend(struct device *dev)
+static int stmp3xxx_wdt_suspend(struct device *dev)
{
struct watchdog_device *wdd = &stmp3xxx_wdd;
@@ -124,7 +124,7 @@ static int __maybe_unused stmp3xxx_wdt_suspend(struct device *dev)
return 0;
}
-static int __maybe_unused stmp3xxx_wdt_resume(struct device *dev)
+static int stmp3xxx_wdt_resume(struct device *dev)
{
struct watchdog_device *wdd = &stmp3xxx_wdd;
@@ -134,13 +134,13 @@ static int __maybe_unused stmp3xxx_wdt_resume(struct device *dev)
return 0;
}
-static SIMPLE_DEV_PM_OPS(stmp3xxx_wdt_pm_ops,
+static DEFINE_SIMPLE_DEV_PM_OPS(stmp3xxx_wdt_pm_ops,
stmp3xxx_wdt_suspend, stmp3xxx_wdt_resume);
static struct platform_driver stmp3xxx_wdt_driver = {
.driver = {
.name = "stmp3xxx_rtc_wdt",
- .pm = &stmp3xxx_wdt_pm_ops,
+ .pm = pm_sleep_ptr(&stmp3xxx_wdt_pm_ops),
},
.probe = stmp3xxx_wdt_probe,
.remove = stmp3xxx_wdt_remove,
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 3/8] watchdog: keembay_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
2026-08-26 6:08 ` [PATCH 3/8] watchdog: keembay_wdt: " Triet Hoang
@ 2026-08-26 6:17 ` sashiko-bot
2026-08-26 21:38 ` Guenter Roeck
0 siblings, 1 reply; 16+ messages in thread
From: sashiko-bot @ 2026-08-26 6:17 UTC (permalink / raw)
To: Triet Hoang; +Cc: linux-watchdog
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] The driver uses `pm_sleep_ptr()` for the `dev_pm_ops` structure pointer in the platform driver definition, which violates the strict subsystem guidelines mandating `pm_ptr()`.
--
commit a755ace210f3814431fd01a8ffbd96e121f18dda
Author: Triet Hoang <triet.hoang.dev@gmail.com>
watchdog: keembay_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
This commit converts the deprecated SIMPLE_DEV_PM_OPS() to
DEFINE_SIMPLE_DEV_PM_OPS() and wraps the PM operations pointer with
pm_sleep_ptr(). This enables dropping the __maybe_unused annotations from
the suspend and resume callbacks.
> diff --git a/drivers/watchdog/keembay_wdt.c b/drivers/watchdog/keembay_wdt.c
> index 2a39114dbc641..9424ea4155f07 100644
> --- a/drivers/watchdog/keembay_wdt.c
> +++ b/drivers/watchdog/keembay_wdt.c
[ ... ]
> @@ -285,7 +285,7 @@ static struct platform_driver keembay_wdt_driver = {
> .driver = {
> .name = "keembay_wdt",
> .of_match_table = keembay_wdt_match,
> - .pm = &keembay_wdt_pm_ops,
> + .pm = pm_sleep_ptr(&keembay_wdt_pm_ops),
[Severity: Low]
Is it correct to use pm_sleep_ptr() here for the dev_pm_ops structure pointer?
The PM subsystem guidelines require using pm_ptr() for dev_pm_ops structure
pointers, reserving pm_sleep_ptr() for the sleep callbacks themselves.
> },
> };
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260826060839.203297-1-triet.hoang.dev@gmail.com?part=3
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 7/8] watchdog: sp805_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
2026-08-26 6:08 ` [PATCH 7/8] watchdog: sp805_wdt: " Triet Hoang
@ 2026-08-26 6:18 ` sashiko-bot
0 siblings, 0 replies; 16+ messages in thread
From: sashiko-bot @ 2026-08-26 6:18 UTC (permalink / raw)
To: Triet Hoang; +Cc: linux-watchdog
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] Incorrect PM macro used for dev_pm_ops structure pointer
--
commit 9fbd3f6262590348a0368f82478f6de749787ec2
Author: Triet Hoang <triet.hoang.dev@gmail.com>
watchdog: sp805_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
This commit converts the deprecated SIMPLE_DEV_PM_OPS() to
DEFINE_SIMPLE_DEV_PM_OPS() and wraps the struct pointer. This allows the
removal of __maybe_unused annotations from the callbacks.
> diff --git a/drivers/watchdog/sp805_wdt.c b/drivers/watchdog/sp805_wdt.c
> index c2125f204a137..7b01011a5bc86 100644
> --- a/drivers/watchdog/sp805_wdt.c
> +++ b/drivers/watchdog/sp805_wdt.c
[ ... ]
> @@ -361,7 +361,7 @@ MODULE_DEVICE_TABLE(amba, sp805_wdt_ids);
> static struct amba_driver sp805_wdt_driver = {
> .drv = {
> .name = MODULE_NAME,
> - .pm = &sp805_wdt_dev_pm_ops,
> + .pm = pm_sleep_ptr(&sp805_wdt_dev_pm_ops),
[Severity: Low]
Should this use pm_ptr() instead of pm_sleep_ptr() for the structure pointer?
According to the power management guidelines, dev_pm_ops structure pointers
should be wrapped with pm_ptr() rather than pm_sleep_ptr(). Using
pm_sleep_ptr() here drops the entire dev_pm_ops structure when CONFIG_PM_SLEEP
is disabled. If runtime PM callbacks are added to this structure in the future,
they will be incorrectly discarded even when CONFIG_PM is enabled.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260826060839.203297-1-triet.hoang.dev@gmail.com?part=7
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 8/8] watchdog: stmp3xxx_rtc_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
2026-08-26 6:08 ` [PATCH 8/8] watchdog: stmp3xxx_rtc_wdt: " Triet Hoang
@ 2026-08-26 6:19 ` sashiko-bot
0 siblings, 0 replies; 16+ messages in thread
From: sashiko-bot @ 2026-08-26 6:19 UTC (permalink / raw)
To: Triet Hoang; +Cc: linux-watchdog
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] Incorrect wrapper macro used for the dev_pm_ops structure pointer.
--
commit 1f11ea674c46c75875588fac7d892578dd01a7b5
Author: Triet Hoang <triet.hoang.dev@gmail.com>
watchdog: stmp3xxx_rtc_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
This commit converts the deprecated SIMPLE_DEV_PM_OPS macro to
DEFINE_SIMPLE_DEV_PM_OPS and wraps the pm_ops pointer, which allows dropping
the maybe_unused annotations from the suspend and resume callbacks.
> diff --git a/drivers/watchdog/stmp3xxx_rtc_wdt.c b/drivers/watchdog/stmp3xxx_rtc_wdt.c
> --- a/drivers/watchdog/stmp3xxx_rtc_wdt.c
> +++ b/drivers/watchdog/stmp3xxx_rtc_wdt.c
[ ... ]
> -static SIMPLE_DEV_PM_OPS(stmp3xxx_wdt_pm_ops,
> +static DEFINE_SIMPLE_DEV_PM_OPS(stmp3xxx_wdt_pm_ops,
> stmp3xxx_wdt_suspend, stmp3xxx_wdt_resume);
>
> static struct platform_driver stmp3xxx_wdt_driver = {
> .driver = {
> .name = "stmp3xxx_rtc_wdt",
> - .pm = &stmp3xxx_wdt_pm_ops,
> + .pm = pm_sleep_ptr(&stmp3xxx_wdt_pm_ops),
[Severity: Low]
Is it correct to use pm_sleep_ptr() here instead of pm_ptr() for the
dev_pm_ops structure pointer?
According to the power management callback conditional compilation
guidelines, pm_ptr() should be used for dev_pm_ops structure pointers,
while pm_sleep_ptr() is intended for the specific sleep callbacks
(like suspend, resume, freeze, thaw, etc.).
By using pm_sleep_ptr() on the structure pointer itself, it will evaluate
to NULL when CONFIG_PM_SLEEP is disabled. If any runtime PM callbacks were
later added to this dev_pm_ops structure, they would be silently compiled
out even if CONFIG_PM is enabled.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260826060839.203297-1-triet.hoang.dev@gmail.com?part=8
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 4/8] watchdog: msc313e_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
2026-08-26 6:08 ` [PATCH 4/8] watchdog: msc313e_wdt: " Triet Hoang
@ 2026-08-26 6:20 ` sashiko-bot
2026-08-27 4:53 ` Tzung-Bi Shih
0 siblings, 1 reply; 16+ messages in thread
From: sashiko-bot @ 2026-08-26 6:20 UTC (permalink / raw)
To: Triet Hoang; +Cc: linux-watchdog
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
Pre-existing issues:
- [High] Missing platform_set_drvdata() or dev_set_drvdata() in the probe function leads to a guaranteed NULL pointer dereference during suspend/resume operations.
- [High] The driver accesses hardware registers without ensuring the required clock is enabled, which can lead to a synchronous bus fault.
--
commit 906c6a1c7ebc485b90aee7c86e2994040111e762
Author: Triet Hoang <triet.hoang.dev@gmail.com>
watchdog: msc313e_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
Convert deprecated SIMPLE_DEV_PM_OPS() to DEFINE_SIMPLE_DEV_PM_OPS()
and pm_sleep_ptr(). This lets us drop the __maybe_unused annotations
from the resume callback.
> diff --git a/drivers/watchdog/msc313e_wdt.c b/drivers/watchdog/msc313e_wdt.c
> index 90171431fc594..b8edf85f10236 100644
> --- a/drivers/watchdog/msc313e_wdt.c
> +++ b/drivers/watchdog/msc313e_wdt.c
> @@ -133,7 +133,7 @@ static int msc313e_wdt_probe(struct platform_device *pdev)
> return devm_watchdog_register_device(dev, &priv->wdev);
> }
>
> -static int __maybe_unused msc313e_wdt_suspend(struct device *dev)
> +static int msc313e_wdt_suspend(struct device *dev)
> {
> struct msc313e_wdt_priv *priv = dev_get_drvdata(dev);
[Severity: High]
This isn't a bug introduced by this patch, but does this result in a NULL
pointer dereference when the system suspends?
The PM core invokes msc313e_wdt_suspend() and passes the platform device as the
dev parameter. However, msc313e_wdt_probe() never calls platform_set_drvdata()
or dev_set_drvdata() for the platform device:
drivers/watchdog/msc313e_wdt.c:msc313e_wdt_probe() {
...
watchdog_set_drvdata(&priv->wdev, priv);
watchdog_init_timeout(&priv->wdev, timeout, dev);
watchdog_stop_on_reboot(&priv->wdev);
watchdog_stop_on_unregister(&priv->wdev);
return devm_watchdog_register_device(dev, &priv->wdev);
}
Because the driver data is uninitialized, dev_get_drvdata(dev) evaluates to
NULL. The callback then computes an offset into this NULL pointer via
&priv->wdev and passes it to watchdog_active(), which unconditionally
dereferences it via test_bit(WDOG_ACTIVE, &wdd->status), causing a fatal
page fault.
The identical NULL pointer dereference logic also executes on the resume path
in msc313e_wdt_resume().
[Severity: High]
This is also a pre-existing issue, but does this driver access hardware
registers without ensuring the required clock is enabled?
The probe function reads from hardware registers without first calling
clk_prepare_enable(), which can crash if the clock is disabled by the
bootloader:
drivers/watchdog/msc313e_wdt.c:msc313e_wdt_probe() {
...
/* If the period is non-zero the WDT is running */
if (readw(priv->base + REG_WDT_MAX_PRD_L) | (readw(priv->base + REG_WDT_MAX_PRD_H) << 16))
set_bit(WDOG_HW_RUNNING, &priv->wdev.status);
...
}
Additionally, because the clock is never enabled in the probe function, when
the Common Clock Framework's late_initcall executes, it physically disables
the unreferenced clock. If the watchdog is already running at boot time, the
watchdog core will periodically call the background ping callback:
drivers/watchdog/msc313e_wdt.c:msc313e_wdt_ping() {
...
writew(1, priv->base + REG_WDT_CLR);
...
}
Writing to these unclocked watchdog registers will trigger a synchronous
bus fault.
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260826060839.203297-1-triet.hoang.dev@gmail.com?part=4
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 3/8] watchdog: keembay_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
2026-08-26 6:17 ` sashiko-bot
@ 2026-08-26 21:38 ` Guenter Roeck
0 siblings, 0 replies; 16+ messages in thread
From: Guenter Roeck @ 2026-08-26 21:38 UTC (permalink / raw)
To: sashiko-reviews, Triet Hoang; +Cc: linux-watchdog
On 8/25/26 23:17, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Low] The driver uses `pm_sleep_ptr()` for the `dev_pm_ops` structure pointer in the platform driver definition, which violates the strict subsystem guidelines mandating `pm_ptr()`.
> --
>
> commit a755ace210f3814431fd01a8ffbd96e121f18dda
> Author: Triet Hoang <triet.hoang.dev@gmail.com>
>
> watchdog: keembay_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
>
> This commit converts the deprecated SIMPLE_DEV_PM_OPS() to
> DEFINE_SIMPLE_DEV_PM_OPS() and wraps the PM operations pointer with
> pm_sleep_ptr(). This enables dropping the __maybe_unused annotations from
> the suspend and resume callbacks.
>
>> diff --git a/drivers/watchdog/keembay_wdt.c b/drivers/watchdog/keembay_wdt.c
>> index 2a39114dbc641..9424ea4155f07 100644
>> --- a/drivers/watchdog/keembay_wdt.c
>> +++ b/drivers/watchdog/keembay_wdt.c
> [ ... ]
>> @@ -285,7 +285,7 @@ static struct platform_driver keembay_wdt_driver = {
>> .driver = {
>> .name = "keembay_wdt",
>> .of_match_table = keembay_wdt_match,
>> - .pm = &keembay_wdt_pm_ops,
>> + .pm = pm_sleep_ptr(&keembay_wdt_pm_ops),
>
> [Severity: Low]
> Is it correct to use pm_sleep_ptr() here for the dev_pm_ops structure pointer?
> The PM subsystem guidelines require using pm_ptr() for dev_pm_ops structure
> pointers, reserving pm_sleep_ptr() for the sleep callbacks themselves.
>
The use of pm_sleep_ptr() for .pm is widely used in the kernel, but at
least Sashiko's guidance suggests that pm_ptr() should be used instead.
Please do that for .pm pointers.
Thanks,
Guenter
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 4/8] watchdog: msc313e_wdt: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
2026-08-26 6:20 ` sashiko-bot
@ 2026-08-27 4:53 ` Tzung-Bi Shih
0 siblings, 0 replies; 16+ messages in thread
From: Tzung-Bi Shih @ 2026-08-27 4:53 UTC (permalink / raw)
To: sashiko-reviews; +Cc: Triet Hoang, linux-watchdog
On Wed, Aug 26, 2026 at 06:20:35AM +0000, sashiko-bot@kernel.org wrote:
> Pre-existing issues:
> - [High] Missing platform_set_drvdata() or dev_set_drvdata() in the probe function leads to a guaranteed NULL pointer dereference during suspend/resume operations.
> - [High] The driver accesses hardware registers without ensuring the required clock is enabled, which can lead to a synchronous bus fault.
They are real issues. Sent [1] for fixing if they are still relevant.
[1] https://lore.kernel.org/linux-watchdog/20260827044700.554333-1-tzungbi@kernel.org
> > -static int __maybe_unused msc313e_wdt_suspend(struct device *dev)
> > +static int msc313e_wdt_suspend(struct device *dev)
> > {
> > struct msc313e_wdt_priv *priv = dev_get_drvdata(dev);
>
> [Severity: High]
> This isn't a bug introduced by this patch, but does this result in a NULL
> pointer dereference when the system suspends?
>
> The PM core invokes msc313e_wdt_suspend() and passes the platform device as the
> dev parameter. However, msc313e_wdt_probe() never calls platform_set_drvdata()
> or dev_set_drvdata() for the platform device:
>
> drivers/watchdog/msc313e_wdt.c:msc313e_wdt_probe() {
> ...
> watchdog_set_drvdata(&priv->wdev, priv);
>
> watchdog_init_timeout(&priv->wdev, timeout, dev);
> watchdog_stop_on_reboot(&priv->wdev);
> watchdog_stop_on_unregister(&priv->wdev);
>
> return devm_watchdog_register_device(dev, &priv->wdev);
> }
>
> Because the driver data is uninitialized, dev_get_drvdata(dev) evaluates to
> NULL. The callback then computes an offset into this NULL pointer via
> &priv->wdev and passes it to watchdog_active(), which unconditionally
> dereferences it via test_bit(WDOG_ACTIVE, &wdd->status), causing a fatal
> page fault.
>
> The identical NULL pointer dereference logic also executes on the resume path
> in msc313e_wdt_resume().
https://lore.kernel.org/linux-watchdog/20260827044700.554333-2-tzungbi@kernel.org
> [Severity: High]
> This is also a pre-existing issue, but does this driver access hardware
> registers without ensuring the required clock is enabled?
>
> The probe function reads from hardware registers without first calling
> clk_prepare_enable(), which can crash if the clock is disabled by the
> bootloader:
>
> drivers/watchdog/msc313e_wdt.c:msc313e_wdt_probe() {
> ...
> /* If the period is non-zero the WDT is running */
> if (readw(priv->base + REG_WDT_MAX_PRD_L) | (readw(priv->base + REG_WDT_MAX_PRD_H) << 16))
> set_bit(WDOG_HW_RUNNING, &priv->wdev.status);
> ...
> }
>
> Additionally, because the clock is never enabled in the probe function, when
> the Common Clock Framework's late_initcall executes, it physically disables
> the unreferenced clock. If the watchdog is already running at boot time, the
> watchdog core will periodically call the background ping callback:
>
> drivers/watchdog/msc313e_wdt.c:msc313e_wdt_ping() {
> ...
> writew(1, priv->base + REG_WDT_CLR);
> ...
> }
>
> Writing to these unclocked watchdog registers will trigger a synchronous
> bus fault.
https://lore.kernel.org/linux-watchdog/20260827044700.554333-3-tzungbi@kernel.org
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/8] watchdog: da9062: Convert to DEFINE_SIMPLE_DEV_PM_OPS()
2026-08-26 6:08 ` [PATCH 2/8] watchdog: da9062: " Triet Hoang
@ 2026-08-27 7:42 ` Tzung-Bi Shih
0 siblings, 0 replies; 16+ messages in thread
From: Tzung-Bi Shih @ 2026-08-27 7:42 UTC (permalink / raw)
To: Triet Hoang; +Cc: wim, linux, linux-watchdog, linux-kernel
On Wed, Aug 26, 2026 at 01:08:33PM +0700, Triet Hoang wrote:
> diff --git a/drivers/watchdog/da9062_wdt.c b/drivers/watchdog/da9062_wdt.c
...
> -static SIMPLE_DEV_PM_OPS(da9062_wdt_pm_ops,
> +static DEFINE_SIMPLE_DEV_PM_OPS(da9062_wdt_pm_ops,
> da9062_wdt_suspend, da9062_wdt_resume);
To be neat, it'd probably like to align the parameters to '(' or simply
combine them into a single line if it fits within the 100-col limit.
The suggestion applies to all other patches in the series as well.
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2026-08-27 7:42 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-26 6:08 [PATCH 0/8] watchdog: Convert drivers to DEFINE_SIMPLE_DEV_PM_OPS() Triet Hoang
2026-08-26 6:08 ` [PATCH 1/8] watchdog: cadence_wdt: Convert " Triet Hoang
2026-08-26 6:08 ` [PATCH 2/8] watchdog: da9062: " Triet Hoang
2026-08-27 7:42 ` Tzung-Bi Shih
2026-08-26 6:08 ` [PATCH 3/8] watchdog: keembay_wdt: " Triet Hoang
2026-08-26 6:17 ` sashiko-bot
2026-08-26 21:38 ` Guenter Roeck
2026-08-26 6:08 ` [PATCH 4/8] watchdog: msc313e_wdt: " Triet Hoang
2026-08-26 6:20 ` sashiko-bot
2026-08-27 4:53 ` Tzung-Bi Shih
2026-08-26 6:08 ` [PATCH 5/8] watchdog: of_xilinx_wdt: " Triet Hoang
2026-08-26 6:08 ` [PATCH 6/8] watchdog: pm8916_wdt: " Triet Hoang
2026-08-26 6:08 ` [PATCH 7/8] watchdog: sp805_wdt: " Triet Hoang
2026-08-26 6:18 ` sashiko-bot
2026-08-26 6:08 ` [PATCH 8/8] watchdog: stmp3xxx_rtc_wdt: " Triet Hoang
2026-08-26 6:19 ` sashiko-bot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.