* [PATCH] power: reset: at91-reset: add sysfs interface to the power on reason @ 2019-10-17 12:40 ` Kamel Bouhara 0 siblings, 0 replies; 14+ messages in thread From: Kamel Bouhara @ 2019-10-17 12:40 UTC (permalink / raw) To: Sebastian Reichel, Nicolas Ferre, Alexandre Belloni, Ludovic Desroches, linux-arm-kernel Cc: linux-kernel, linux-pm, Thomas Petazzoni, Kamel Bouhara This patch export the power on reason through the sysfs interface and introduce some generic reset sources. Update the ABI documentation to list current power on sources. Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> --- .../sysfs-devices-platform-power-on-reason | 14 ++++++ drivers/power/reset/at91-reset.c | 44 +++++++++++++------ include/linux/power/power_on_reason.h | 19 ++++++++ 3 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-devices-platform-power-on-reason create mode 100644 include/linux/power/power_on_reason.h diff --git a/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason new file mode 100644 index 000000000000..83daeb9b1aa2 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason @@ -0,0 +1,14 @@ +What: /sys/devices/platform/.../power_on_reason + +Date: October 2019 +KernelVersion: 5.4 +Contact: Kamel Bouhara <kamel.bouhara@bootlin.com> +Description: This file shows system power on reason. + The possible sources are: + General System Power-ON, RTC wakeup, Watchdog timeout, + Software Reset, User pressed reset button, + CPU Clock failure, 32.768kHz Oscillator Failure, + Low power mode exit, Unknown. + + The file is read only. + diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c index 44ca983a49a1..3cb2df40af37 100644 --- a/drivers/power/reset/at91-reset.c +++ b/drivers/power/reset/at91-reset.c @@ -17,7 +17,7 @@ #include <linux/of_address.h> #include <linux/platform_device.h> #include <linux/reboot.h> - +#include <linux/power/power_on_reason.h> #include <soc/at91/at91sam9_ddrsdr.h> #include <soc/at91/at91sam9_sdramc.h> @@ -146,42 +146,42 @@ static int samx7_restart(struct notifier_block *this, unsigned long mode, return NOTIFY_DONE; } -static void __init at91_reset_status(struct platform_device *pdev) +static const char *at91_reset_reason(struct platform_device *pdev) { const char *reason; u32 reg = readl(at91_rstc_base + AT91_RSTC_SR); switch ((reg & AT91_RSTC_RSTTYP) >> 8) { case RESET_TYPE_GENERAL: - reason = "general reset"; + reason = POWER_ON_REASON_GENERAL; break; case RESET_TYPE_WAKEUP: - reason = "wakeup"; + reason = POWER_ON_REASON_RTC; break; case RESET_TYPE_WATCHDOG: - reason = "watchdog reset"; + reason = POWER_ON_REASON_WATCHDOG; break; case RESET_TYPE_SOFTWARE: - reason = "software reset"; + reason = POWER_ON_REASON_SOFTWARE; break; case RESET_TYPE_USER: - reason = "user reset"; + reason = POWER_ON_REASON_USER; break; case RESET_TYPE_CPU_FAIL: - reason = "CPU clock failure detection"; + reason = POWER_ON_REASON_CPU_FAIL; break; case RESET_TYPE_XTAL_FAIL: - reason = "32.768 kHz crystal failure detection"; + reason = POWER_ON_REASON_XTAL_FAIL; break; case RESET_TYPE_ULP2: - reason = "ULP2 reset"; + reason = POWER_ON_REASON_LOW_POWER; break; default: - reason = "unknown reset"; + reason = POWER_ON_REASON_UNKNOWN; break; } - dev_info(&pdev->dev, "Starting after %s\n", reason); + return reason; } static const struct of_device_id at91_ramc_of_match[] = { @@ -204,6 +204,17 @@ static struct notifier_block at91_restart_nb = { .priority = 192, }; +static ssize_t power_on_reason_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct platform_device *pdev = to_platform_device(dev); + + return sprintf(buf, "%s\n", at91_reset_reason(pdev)); +} + +static DEVICE_ATTR_RO(power_on_reason); + static int __init at91_reset_probe(struct platform_device *pdev) { const struct of_device_id *match; @@ -248,7 +259,14 @@ static int __init at91_reset_probe(struct platform_device *pdev) return ret; } - at91_reset_status(pdev); + ret = device_create_file(&pdev->dev, &dev_attr_power_on_reason); + if (ret) { + dev_err(&pdev->dev, "Could not create sysfs entry\n"); + return ret; + } + + dev_info(&pdev->dev, "Starting after %s reset\n", + at91_reset_reason(pdev)); return 0; } diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h new file mode 100644 index 000000000000..9978cc757427 --- /dev/null +++ b/include/linux/power/power_on_reason.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Author: Kamel Bouhra <kamel.bouhara@bootlin.com> + */ + +#ifndef POWER_ON_REASON_H +#define POWER_ON_REASON_H + +#define POWER_ON_REASON_GENERAL "General" +#define POWER_ON_REASON_RTC "RTC wakeup" +#define POWER_ON_REASON_WATCHDOG "Watchdog timeout" +#define POWER_ON_REASON_SOFTWARE "Software" +#define POWER_ON_REASON_USER "User" +#define POWER_ON_REASON_CPU_FAIL "CPU Clock Failure" +#define POWER_ON_REASON_XTAL_FAIL "32.768k Crystal oscillator Failure" +#define POWER_ON_REASON_LOW_POWER "Low power exit" +#define POWER_ON_REASON_UNKNOWN "Unknown" + +#endif /* POWER_ON_REASON_H */ -- 2.23.0 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH] power: reset: at91-reset: add sysfs interface to the power on reason @ 2019-10-17 12:40 ` Kamel Bouhara 0 siblings, 0 replies; 14+ messages in thread From: Kamel Bouhara @ 2019-10-17 12:40 UTC (permalink / raw) To: Sebastian Reichel, Nicolas Ferre, Alexandre Belloni, Ludovic Desroches, linux-arm-kernel Cc: Kamel Bouhara, linux-kernel, Thomas Petazzoni, linux-pm This patch export the power on reason through the sysfs interface and introduce some generic reset sources. Update the ABI documentation to list current power on sources. Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> --- .../sysfs-devices-platform-power-on-reason | 14 ++++++ drivers/power/reset/at91-reset.c | 44 +++++++++++++------ include/linux/power/power_on_reason.h | 19 ++++++++ 3 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-devices-platform-power-on-reason create mode 100644 include/linux/power/power_on_reason.h diff --git a/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason new file mode 100644 index 000000000000..83daeb9b1aa2 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason @@ -0,0 +1,14 @@ +What: /sys/devices/platform/.../power_on_reason + +Date: October 2019 +KernelVersion: 5.4 +Contact: Kamel Bouhara <kamel.bouhara@bootlin.com> +Description: This file shows system power on reason. + The possible sources are: + General System Power-ON, RTC wakeup, Watchdog timeout, + Software Reset, User pressed reset button, + CPU Clock failure, 32.768kHz Oscillator Failure, + Low power mode exit, Unknown. + + The file is read only. + diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c index 44ca983a49a1..3cb2df40af37 100644 --- a/drivers/power/reset/at91-reset.c +++ b/drivers/power/reset/at91-reset.c @@ -17,7 +17,7 @@ #include <linux/of_address.h> #include <linux/platform_device.h> #include <linux/reboot.h> - +#include <linux/power/power_on_reason.h> #include <soc/at91/at91sam9_ddrsdr.h> #include <soc/at91/at91sam9_sdramc.h> @@ -146,42 +146,42 @@ static int samx7_restart(struct notifier_block *this, unsigned long mode, return NOTIFY_DONE; } -static void __init at91_reset_status(struct platform_device *pdev) +static const char *at91_reset_reason(struct platform_device *pdev) { const char *reason; u32 reg = readl(at91_rstc_base + AT91_RSTC_SR); switch ((reg & AT91_RSTC_RSTTYP) >> 8) { case RESET_TYPE_GENERAL: - reason = "general reset"; + reason = POWER_ON_REASON_GENERAL; break; case RESET_TYPE_WAKEUP: - reason = "wakeup"; + reason = POWER_ON_REASON_RTC; break; case RESET_TYPE_WATCHDOG: - reason = "watchdog reset"; + reason = POWER_ON_REASON_WATCHDOG; break; case RESET_TYPE_SOFTWARE: - reason = "software reset"; + reason = POWER_ON_REASON_SOFTWARE; break; case RESET_TYPE_USER: - reason = "user reset"; + reason = POWER_ON_REASON_USER; break; case RESET_TYPE_CPU_FAIL: - reason = "CPU clock failure detection"; + reason = POWER_ON_REASON_CPU_FAIL; break; case RESET_TYPE_XTAL_FAIL: - reason = "32.768 kHz crystal failure detection"; + reason = POWER_ON_REASON_XTAL_FAIL; break; case RESET_TYPE_ULP2: - reason = "ULP2 reset"; + reason = POWER_ON_REASON_LOW_POWER; break; default: - reason = "unknown reset"; + reason = POWER_ON_REASON_UNKNOWN; break; } - dev_info(&pdev->dev, "Starting after %s\n", reason); + return reason; } static const struct of_device_id at91_ramc_of_match[] = { @@ -204,6 +204,17 @@ static struct notifier_block at91_restart_nb = { .priority = 192, }; +static ssize_t power_on_reason_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct platform_device *pdev = to_platform_device(dev); + + return sprintf(buf, "%s\n", at91_reset_reason(pdev)); +} + +static DEVICE_ATTR_RO(power_on_reason); + static int __init at91_reset_probe(struct platform_device *pdev) { const struct of_device_id *match; @@ -248,7 +259,14 @@ static int __init at91_reset_probe(struct platform_device *pdev) return ret; } - at91_reset_status(pdev); + ret = device_create_file(&pdev->dev, &dev_attr_power_on_reason); + if (ret) { + dev_err(&pdev->dev, "Could not create sysfs entry\n"); + return ret; + } + + dev_info(&pdev->dev, "Starting after %s reset\n", + at91_reset_reason(pdev)); return 0; } diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h new file mode 100644 index 000000000000..9978cc757427 --- /dev/null +++ b/include/linux/power/power_on_reason.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Author: Kamel Bouhra <kamel.bouhara@bootlin.com> + */ + +#ifndef POWER_ON_REASON_H +#define POWER_ON_REASON_H + +#define POWER_ON_REASON_GENERAL "General" +#define POWER_ON_REASON_RTC "RTC wakeup" +#define POWER_ON_REASON_WATCHDOG "Watchdog timeout" +#define POWER_ON_REASON_SOFTWARE "Software" +#define POWER_ON_REASON_USER "User" +#define POWER_ON_REASON_CPU_FAIL "CPU Clock Failure" +#define POWER_ON_REASON_XTAL_FAIL "32.768k Crystal oscillator Failure" +#define POWER_ON_REASON_LOW_POWER "Low power exit" +#define POWER_ON_REASON_UNKNOWN "Unknown" + +#endif /* POWER_ON_REASON_H */ -- 2.23.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH] power: reset: at91-reset: add sysfs interface to the power on reason 2019-10-17 12:40 ` Kamel Bouhara @ 2019-11-28 14:48 ` Nicolas.Ferre -1 siblings, 0 replies; 14+ messages in thread From: Nicolas.Ferre @ 2019-11-28 14:48 UTC (permalink / raw) To: kamel.bouhara, sre, alexandre.belloni, Ludovic.Desroches, linux-arm-kernel Cc: linux-kernel, linux-pm, thomas.petazzoni On 17/10/2019 at 14:40, Kamel Bouhara wrote: > This patch export the power on reason through the sysfs interface and > introduce some generic reset sources. > Update the ABI documentation to list current power on sources. > > Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> I don't know the status of this. Anyway, here is my: Acked-by: Nicolas Ferre <nicolas.ferre@microchip.com> Thanks Kamel. Best regards, Nicolas > --- > .../sysfs-devices-platform-power-on-reason | 14 ++++++ > drivers/power/reset/at91-reset.c | 44 +++++++++++++------ > include/linux/power/power_on_reason.h | 19 ++++++++ > 3 files changed, 64 insertions(+), 13 deletions(-) > create mode 100644 Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > create mode 100644 include/linux/power/power_on_reason.h > > diff --git a/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > new file mode 100644 > index 000000000000..83daeb9b1aa2 > --- /dev/null > +++ b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > @@ -0,0 +1,14 @@ > +What: /sys/devices/platform/.../power_on_reason > + > +Date: October 2019 > +KernelVersion: 5.4 > +Contact: Kamel Bouhara <kamel.bouhara@bootlin.com> > +Description: This file shows system power on reason. > + The possible sources are: > + General System Power-ON, RTC wakeup, Watchdog timeout, > + Software Reset, User pressed reset button, > + CPU Clock failure, 32.768kHz Oscillator Failure, > + Low power mode exit, Unknown. > + > + The file is read only. > + > diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c > index 44ca983a49a1..3cb2df40af37 100644 > --- a/drivers/power/reset/at91-reset.c > +++ b/drivers/power/reset/at91-reset.c > @@ -17,7 +17,7 @@ > #include <linux/of_address.h> > #include <linux/platform_device.h> > #include <linux/reboot.h> > - > +#include <linux/power/power_on_reason.h> > #include <soc/at91/at91sam9_ddrsdr.h> > #include <soc/at91/at91sam9_sdramc.h> > > @@ -146,42 +146,42 @@ static int samx7_restart(struct notifier_block *this, unsigned long mode, > return NOTIFY_DONE; > } > > -static void __init at91_reset_status(struct platform_device *pdev) > +static const char *at91_reset_reason(struct platform_device *pdev) > { > const char *reason; > u32 reg = readl(at91_rstc_base + AT91_RSTC_SR); > > switch ((reg & AT91_RSTC_RSTTYP) >> 8) { > case RESET_TYPE_GENERAL: > - reason = "general reset"; > + reason = POWER_ON_REASON_GENERAL; > break; > case RESET_TYPE_WAKEUP: > - reason = "wakeup"; > + reason = POWER_ON_REASON_RTC; > break; > case RESET_TYPE_WATCHDOG: > - reason = "watchdog reset"; > + reason = POWER_ON_REASON_WATCHDOG; > break; > case RESET_TYPE_SOFTWARE: > - reason = "software reset"; > + reason = POWER_ON_REASON_SOFTWARE; > break; > case RESET_TYPE_USER: > - reason = "user reset"; > + reason = POWER_ON_REASON_USER; > break; > case RESET_TYPE_CPU_FAIL: > - reason = "CPU clock failure detection"; > + reason = POWER_ON_REASON_CPU_FAIL; > break; > case RESET_TYPE_XTAL_FAIL: > - reason = "32.768 kHz crystal failure detection"; > + reason = POWER_ON_REASON_XTAL_FAIL; > break; > case RESET_TYPE_ULP2: > - reason = "ULP2 reset"; > + reason = POWER_ON_REASON_LOW_POWER; > break; > default: > - reason = "unknown reset"; > + reason = POWER_ON_REASON_UNKNOWN; > break; > } > > - dev_info(&pdev->dev, "Starting after %s\n", reason); > + return reason; > } > > static const struct of_device_id at91_ramc_of_match[] = { > @@ -204,6 +204,17 @@ static struct notifier_block at91_restart_nb = { > .priority = 192, > }; > > +static ssize_t power_on_reason_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct platform_device *pdev = to_platform_device(dev); > + > + return sprintf(buf, "%s\n", at91_reset_reason(pdev)); > +} > + > +static DEVICE_ATTR_RO(power_on_reason); > + > static int __init at91_reset_probe(struct platform_device *pdev) > { > const struct of_device_id *match; > @@ -248,7 +259,14 @@ static int __init at91_reset_probe(struct platform_device *pdev) > return ret; > } > > - at91_reset_status(pdev); > + ret = device_create_file(&pdev->dev, &dev_attr_power_on_reason); > + if (ret) { > + dev_err(&pdev->dev, "Could not create sysfs entry\n"); > + return ret; > + } > + > + dev_info(&pdev->dev, "Starting after %s reset\n", > + at91_reset_reason(pdev)); > > return 0; > } > diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h > new file mode 100644 > index 000000000000..9978cc757427 > --- /dev/null > +++ b/include/linux/power/power_on_reason.h > @@ -0,0 +1,19 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * Author: Kamel Bouhra <kamel.bouhara@bootlin.com> > + */ > + > +#ifndef POWER_ON_REASON_H > +#define POWER_ON_REASON_H > + > +#define POWER_ON_REASON_GENERAL "General" > +#define POWER_ON_REASON_RTC "RTC wakeup" > +#define POWER_ON_REASON_WATCHDOG "Watchdog timeout" > +#define POWER_ON_REASON_SOFTWARE "Software" > +#define POWER_ON_REASON_USER "User" > +#define POWER_ON_REASON_CPU_FAIL "CPU Clock Failure" > +#define POWER_ON_REASON_XTAL_FAIL "32.768k Crystal oscillator Failure" > +#define POWER_ON_REASON_LOW_POWER "Low power exit" > +#define POWER_ON_REASON_UNKNOWN "Unknown" > + > +#endif /* POWER_ON_REASON_H */ > -- > 2.23.0 > > > -- Nicolas Ferre ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] power: reset: at91-reset: add sysfs interface to the power on reason @ 2019-11-28 14:48 ` Nicolas.Ferre 0 siblings, 0 replies; 14+ messages in thread From: Nicolas.Ferre @ 2019-11-28 14:48 UTC (permalink / raw) To: kamel.bouhara, sre, alexandre.belloni, Ludovic.Desroches, linux-arm-kernel Cc: linux-kernel, thomas.petazzoni, linux-pm On 17/10/2019 at 14:40, Kamel Bouhara wrote: > This patch export the power on reason through the sysfs interface and > introduce some generic reset sources. > Update the ABI documentation to list current power on sources. > > Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> I don't know the status of this. Anyway, here is my: Acked-by: Nicolas Ferre <nicolas.ferre@microchip.com> Thanks Kamel. Best regards, Nicolas > --- > .../sysfs-devices-platform-power-on-reason | 14 ++++++ > drivers/power/reset/at91-reset.c | 44 +++++++++++++------ > include/linux/power/power_on_reason.h | 19 ++++++++ > 3 files changed, 64 insertions(+), 13 deletions(-) > create mode 100644 Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > create mode 100644 include/linux/power/power_on_reason.h > > diff --git a/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > new file mode 100644 > index 000000000000..83daeb9b1aa2 > --- /dev/null > +++ b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > @@ -0,0 +1,14 @@ > +What: /sys/devices/platform/.../power_on_reason > + > +Date: October 2019 > +KernelVersion: 5.4 > +Contact: Kamel Bouhara <kamel.bouhara@bootlin.com> > +Description: This file shows system power on reason. > + The possible sources are: > + General System Power-ON, RTC wakeup, Watchdog timeout, > + Software Reset, User pressed reset button, > + CPU Clock failure, 32.768kHz Oscillator Failure, > + Low power mode exit, Unknown. > + > + The file is read only. > + > diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c > index 44ca983a49a1..3cb2df40af37 100644 > --- a/drivers/power/reset/at91-reset.c > +++ b/drivers/power/reset/at91-reset.c > @@ -17,7 +17,7 @@ > #include <linux/of_address.h> > #include <linux/platform_device.h> > #include <linux/reboot.h> > - > +#include <linux/power/power_on_reason.h> > #include <soc/at91/at91sam9_ddrsdr.h> > #include <soc/at91/at91sam9_sdramc.h> > > @@ -146,42 +146,42 @@ static int samx7_restart(struct notifier_block *this, unsigned long mode, > return NOTIFY_DONE; > } > > -static void __init at91_reset_status(struct platform_device *pdev) > +static const char *at91_reset_reason(struct platform_device *pdev) > { > const char *reason; > u32 reg = readl(at91_rstc_base + AT91_RSTC_SR); > > switch ((reg & AT91_RSTC_RSTTYP) >> 8) { > case RESET_TYPE_GENERAL: > - reason = "general reset"; > + reason = POWER_ON_REASON_GENERAL; > break; > case RESET_TYPE_WAKEUP: > - reason = "wakeup"; > + reason = POWER_ON_REASON_RTC; > break; > case RESET_TYPE_WATCHDOG: > - reason = "watchdog reset"; > + reason = POWER_ON_REASON_WATCHDOG; > break; > case RESET_TYPE_SOFTWARE: > - reason = "software reset"; > + reason = POWER_ON_REASON_SOFTWARE; > break; > case RESET_TYPE_USER: > - reason = "user reset"; > + reason = POWER_ON_REASON_USER; > break; > case RESET_TYPE_CPU_FAIL: > - reason = "CPU clock failure detection"; > + reason = POWER_ON_REASON_CPU_FAIL; > break; > case RESET_TYPE_XTAL_FAIL: > - reason = "32.768 kHz crystal failure detection"; > + reason = POWER_ON_REASON_XTAL_FAIL; > break; > case RESET_TYPE_ULP2: > - reason = "ULP2 reset"; > + reason = POWER_ON_REASON_LOW_POWER; > break; > default: > - reason = "unknown reset"; > + reason = POWER_ON_REASON_UNKNOWN; > break; > } > > - dev_info(&pdev->dev, "Starting after %s\n", reason); > + return reason; > } > > static const struct of_device_id at91_ramc_of_match[] = { > @@ -204,6 +204,17 @@ static struct notifier_block at91_restart_nb = { > .priority = 192, > }; > > +static ssize_t power_on_reason_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct platform_device *pdev = to_platform_device(dev); > + > + return sprintf(buf, "%s\n", at91_reset_reason(pdev)); > +} > + > +static DEVICE_ATTR_RO(power_on_reason); > + > static int __init at91_reset_probe(struct platform_device *pdev) > { > const struct of_device_id *match; > @@ -248,7 +259,14 @@ static int __init at91_reset_probe(struct platform_device *pdev) > return ret; > } > > - at91_reset_status(pdev); > + ret = device_create_file(&pdev->dev, &dev_attr_power_on_reason); > + if (ret) { > + dev_err(&pdev->dev, "Could not create sysfs entry\n"); > + return ret; > + } > + > + dev_info(&pdev->dev, "Starting after %s reset\n", > + at91_reset_reason(pdev)); > > return 0; > } > diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h > new file mode 100644 > index 000000000000..9978cc757427 > --- /dev/null > +++ b/include/linux/power/power_on_reason.h > @@ -0,0 +1,19 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * Author: Kamel Bouhra <kamel.bouhara@bootlin.com> > + */ > + > +#ifndef POWER_ON_REASON_H > +#define POWER_ON_REASON_H > + > +#define POWER_ON_REASON_GENERAL "General" > +#define POWER_ON_REASON_RTC "RTC wakeup" > +#define POWER_ON_REASON_WATCHDOG "Watchdog timeout" > +#define POWER_ON_REASON_SOFTWARE "Software" > +#define POWER_ON_REASON_USER "User" > +#define POWER_ON_REASON_CPU_FAIL "CPU Clock Failure" > +#define POWER_ON_REASON_XTAL_FAIL "32.768k Crystal oscillator Failure" > +#define POWER_ON_REASON_LOW_POWER "Low power exit" > +#define POWER_ON_REASON_UNKNOWN "Unknown" > + > +#endif /* POWER_ON_REASON_H */ > -- > 2.23.0 > > > -- Nicolas Ferre _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] power: reset: at91-reset: add sysfs interface to the power on reason 2019-10-17 12:40 ` Kamel Bouhara @ 2019-11-29 10:57 ` Claudiu.Beznea -1 siblings, 0 replies; 14+ messages in thread From: Claudiu.Beznea @ 2019-11-29 10:57 UTC (permalink / raw) To: kamel.bouhara, sre, Nicolas.Ferre, alexandre.belloni, Ludovic.Desroches, linux-arm-kernel Cc: linux-kernel, linux-pm, thomas.petazzoni Hi Kamel, On 17.10.2019 15:40, Kamel Bouhara wrote: > This patch export the power on reason through the sysfs interface and > introduce some generic reset sources. > Update the ABI documentation to list current power on sources. > > Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> > --- > .../sysfs-devices-platform-power-on-reason | 14 ++++++ > drivers/power/reset/at91-reset.c | 44 +++++++++++++------ > include/linux/power/power_on_reason.h | 19 ++++++++ > 3 files changed, 64 insertions(+), 13 deletions(-) > create mode 100644 Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > create mode 100644 include/linux/power/power_on_reason.h > > diff --git a/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > new file mode 100644 > index 000000000000..83daeb9b1aa2 > --- /dev/null > +++ b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > @@ -0,0 +1,14 @@ > +What: /sys/devices/platform/.../power_on_reason > + > +Date: October 2019 > +KernelVersion: 5.4 > +Contact: Kamel Bouhara <kamel.bouhara@bootlin.com> > +Description: This file shows system power on reason. > + The possible sources are: > + General System Power-ON, RTC wakeup, Watchdog timeout, > + Software Reset, User pressed reset button, > + CPU Clock failure, 32.768kHz Oscillator Failure, > + Low power mode exit, Unknown. > + > + The file is read only. > + > diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c > index 44ca983a49a1..3cb2df40af37 100644 > --- a/drivers/power/reset/at91-reset.c > +++ b/drivers/power/reset/at91-reset.c > @@ -17,7 +17,7 @@ > #include <linux/of_address.h> > #include <linux/platform_device.h> > #include <linux/reboot.h> > - > +#include <linux/power/power_on_reason.h> > #include <soc/at91/at91sam9_ddrsdr.h> > #include <soc/at91/at91sam9_sdramc.h> > > @@ -146,42 +146,42 @@ static int samx7_restart(struct notifier_block *this, unsigned long mode, > return NOTIFY_DONE; > } > > -static void __init at91_reset_status(struct platform_device *pdev) > +static const char *at91_reset_reason(struct platform_device *pdev) > { > const char *reason; > u32 reg = readl(at91_rstc_base + AT91_RSTC_SR); > > switch ((reg & AT91_RSTC_RSTTYP) >> 8) { > case RESET_TYPE_GENERAL: > - reason = "general reset"; > + reason = POWER_ON_REASON_GENERAL; > break; > case RESET_TYPE_WAKEUP: > - reason = "wakeup"; > + reason = POWER_ON_REASON_RTC; > break; > case RESET_TYPE_WATCHDOG: > - reason = "watchdog reset"; > + reason = POWER_ON_REASON_WATCHDOG; > break; > case RESET_TYPE_SOFTWARE: > - reason = "software reset"; > + reason = POWER_ON_REASON_SOFTWARE; > break; > case RESET_TYPE_USER: > - reason = "user reset"; > + reason = POWER_ON_REASON_USER; > break; > case RESET_TYPE_CPU_FAIL: > - reason = "CPU clock failure detection"; > + reason = POWER_ON_REASON_CPU_FAIL; > break; > case RESET_TYPE_XTAL_FAIL: > - reason = "32.768 kHz crystal failure detection"; > + reason = POWER_ON_REASON_XTAL_FAIL; > break; > case RESET_TYPE_ULP2: > - reason = "ULP2 reset"; > + reason = POWER_ON_REASON_LOW_POWER; > break; > default: > - reason = "unknown reset"; > + reason = POWER_ON_REASON_UNKNOWN; > break; > } > > - dev_info(&pdev->dev, "Starting after %s\n", reason); > + return reason; > } > > static const struct of_device_id at91_ramc_of_match[] = { > @@ -204,6 +204,17 @@ static struct notifier_block at91_restart_nb = { > .priority = 192, > }; > > +static ssize_t power_on_reason_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct platform_device *pdev = to_platform_device(dev); > + > + return sprintf(buf, "%s\n", at91_reset_reason(pdev)); > +} > + > +static DEVICE_ATTR_RO(power_on_reason); > + > static int __init at91_reset_probe(struct platform_device *pdev) > { > const struct of_device_id *match; > @@ -248,7 +259,14 @@ static int __init at91_reset_probe(struct platform_device *pdev) > return ret; > } > > - at91_reset_status(pdev); > + ret = device_create_file(&pdev->dev, &dev_attr_power_on_reason); > + if (ret) { > + dev_err(&pdev->dev, "Could not create sysfs entry\n"); > + return ret; > + } > + > + dev_info(&pdev->dev, "Starting after %s reset\n", > + at91_reset_reason(pdev)); > > return 0; > } > diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h > new file mode 100644 > index 000000000000..9978cc757427 > --- /dev/null > +++ b/include/linux/power/power_on_reason.h > @@ -0,0 +1,19 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * Author: Kamel Bouhra <kamel.bouhara@bootlin.com> > + */ > + > +#ifndef POWER_ON_REASON_H > +#define POWER_ON_REASON_H > + > +#define POWER_ON_REASON_GENERAL "General" > +#define POWER_ON_REASON_RTC "RTC wakeup" > +#define POWER_ON_REASON_WATCHDOG "Watchdog timeout" > +#define POWER_ON_REASON_SOFTWARE "Software" > +#define POWER_ON_REASON_USER "User" > +#define POWER_ON_REASON_CPU_FAIL "CPU Clock Failure" > +#define POWER_ON_REASON_XTAL_FAIL "32.768k Crystal oscillator Failure" > +#define POWER_ON_REASON_LOW_POWER "Low power exit" > +#define POWER_ON_REASON_UNKNOWN "Unknown" > + > +#endif /* POWER_ON_REASON_H */ Is this new header necessary? Thank you, Claudiu Beznea > -- > 2.23.0 > > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] power: reset: at91-reset: add sysfs interface to the power on reason @ 2019-11-29 10:57 ` Claudiu.Beznea 0 siblings, 0 replies; 14+ messages in thread From: Claudiu.Beznea @ 2019-11-29 10:57 UTC (permalink / raw) To: kamel.bouhara, sre, Nicolas.Ferre, alexandre.belloni, Ludovic.Desroches, linux-arm-kernel Cc: linux-kernel, thomas.petazzoni, linux-pm Hi Kamel, On 17.10.2019 15:40, Kamel Bouhara wrote: > This patch export the power on reason through the sysfs interface and > introduce some generic reset sources. > Update the ABI documentation to list current power on sources. > > Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> > --- > .../sysfs-devices-platform-power-on-reason | 14 ++++++ > drivers/power/reset/at91-reset.c | 44 +++++++++++++------ > include/linux/power/power_on_reason.h | 19 ++++++++ > 3 files changed, 64 insertions(+), 13 deletions(-) > create mode 100644 Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > create mode 100644 include/linux/power/power_on_reason.h > > diff --git a/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > new file mode 100644 > index 000000000000..83daeb9b1aa2 > --- /dev/null > +++ b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > @@ -0,0 +1,14 @@ > +What: /sys/devices/platform/.../power_on_reason > + > +Date: October 2019 > +KernelVersion: 5.4 > +Contact: Kamel Bouhara <kamel.bouhara@bootlin.com> > +Description: This file shows system power on reason. > + The possible sources are: > + General System Power-ON, RTC wakeup, Watchdog timeout, > + Software Reset, User pressed reset button, > + CPU Clock failure, 32.768kHz Oscillator Failure, > + Low power mode exit, Unknown. > + > + The file is read only. > + > diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c > index 44ca983a49a1..3cb2df40af37 100644 > --- a/drivers/power/reset/at91-reset.c > +++ b/drivers/power/reset/at91-reset.c > @@ -17,7 +17,7 @@ > #include <linux/of_address.h> > #include <linux/platform_device.h> > #include <linux/reboot.h> > - > +#include <linux/power/power_on_reason.h> > #include <soc/at91/at91sam9_ddrsdr.h> > #include <soc/at91/at91sam9_sdramc.h> > > @@ -146,42 +146,42 @@ static int samx7_restart(struct notifier_block *this, unsigned long mode, > return NOTIFY_DONE; > } > > -static void __init at91_reset_status(struct platform_device *pdev) > +static const char *at91_reset_reason(struct platform_device *pdev) > { > const char *reason; > u32 reg = readl(at91_rstc_base + AT91_RSTC_SR); > > switch ((reg & AT91_RSTC_RSTTYP) >> 8) { > case RESET_TYPE_GENERAL: > - reason = "general reset"; > + reason = POWER_ON_REASON_GENERAL; > break; > case RESET_TYPE_WAKEUP: > - reason = "wakeup"; > + reason = POWER_ON_REASON_RTC; > break; > case RESET_TYPE_WATCHDOG: > - reason = "watchdog reset"; > + reason = POWER_ON_REASON_WATCHDOG; > break; > case RESET_TYPE_SOFTWARE: > - reason = "software reset"; > + reason = POWER_ON_REASON_SOFTWARE; > break; > case RESET_TYPE_USER: > - reason = "user reset"; > + reason = POWER_ON_REASON_USER; > break; > case RESET_TYPE_CPU_FAIL: > - reason = "CPU clock failure detection"; > + reason = POWER_ON_REASON_CPU_FAIL; > break; > case RESET_TYPE_XTAL_FAIL: > - reason = "32.768 kHz crystal failure detection"; > + reason = POWER_ON_REASON_XTAL_FAIL; > break; > case RESET_TYPE_ULP2: > - reason = "ULP2 reset"; > + reason = POWER_ON_REASON_LOW_POWER; > break; > default: > - reason = "unknown reset"; > + reason = POWER_ON_REASON_UNKNOWN; > break; > } > > - dev_info(&pdev->dev, "Starting after %s\n", reason); > + return reason; > } > > static const struct of_device_id at91_ramc_of_match[] = { > @@ -204,6 +204,17 @@ static struct notifier_block at91_restart_nb = { > .priority = 192, > }; > > +static ssize_t power_on_reason_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct platform_device *pdev = to_platform_device(dev); > + > + return sprintf(buf, "%s\n", at91_reset_reason(pdev)); > +} > + > +static DEVICE_ATTR_RO(power_on_reason); > + > static int __init at91_reset_probe(struct platform_device *pdev) > { > const struct of_device_id *match; > @@ -248,7 +259,14 @@ static int __init at91_reset_probe(struct platform_device *pdev) > return ret; > } > > - at91_reset_status(pdev); > + ret = device_create_file(&pdev->dev, &dev_attr_power_on_reason); > + if (ret) { > + dev_err(&pdev->dev, "Could not create sysfs entry\n"); > + return ret; > + } > + > + dev_info(&pdev->dev, "Starting after %s reset\n", > + at91_reset_reason(pdev)); > > return 0; > } > diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h > new file mode 100644 > index 000000000000..9978cc757427 > --- /dev/null > +++ b/include/linux/power/power_on_reason.h > @@ -0,0 +1,19 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * Author: Kamel Bouhra <kamel.bouhara@bootlin.com> > + */ > + > +#ifndef POWER_ON_REASON_H > +#define POWER_ON_REASON_H > + > +#define POWER_ON_REASON_GENERAL "General" > +#define POWER_ON_REASON_RTC "RTC wakeup" > +#define POWER_ON_REASON_WATCHDOG "Watchdog timeout" > +#define POWER_ON_REASON_SOFTWARE "Software" > +#define POWER_ON_REASON_USER "User" > +#define POWER_ON_REASON_CPU_FAIL "CPU Clock Failure" > +#define POWER_ON_REASON_XTAL_FAIL "32.768k Crystal oscillator Failure" > +#define POWER_ON_REASON_LOW_POWER "Low power exit" > +#define POWER_ON_REASON_UNKNOWN "Unknown" > + > +#endif /* POWER_ON_REASON_H */ Is this new header necessary? Thank you, Claudiu Beznea > -- > 2.23.0 > > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] power: reset: at91-reset: add sysfs interface to the power on reason 2019-11-29 10:57 ` Claudiu.Beznea @ 2019-11-29 11:02 ` Alexandre Belloni -1 siblings, 0 replies; 14+ messages in thread From: Alexandre Belloni @ 2019-11-29 11:02 UTC (permalink / raw) To: Claudiu.Beznea Cc: kamel.bouhara, sre, Nicolas.Ferre, Ludovic.Desroches, linux-arm-kernel, linux-kernel, linux-pm, thomas.petazzoni On 29/11/2019 10:57:45+0000, Claudiu.Beznea@microchip.com wrote: > Hi Kamel, > > On 17.10.2019 15:40, Kamel Bouhara wrote: > > This patch export the power on reason through the sysfs interface and > > introduce some generic reset sources. > > Update the ABI documentation to list current power on sources. > > > > Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> > > --- > > .../sysfs-devices-platform-power-on-reason | 14 ++++++ > > drivers/power/reset/at91-reset.c | 44 +++++++++++++------ > > include/linux/power/power_on_reason.h | 19 ++++++++ > > 3 files changed, 64 insertions(+), 13 deletions(-) > > create mode 100644 Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > > create mode 100644 include/linux/power/power_on_reason.h > > > > diff --git a/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > > new file mode 100644 > > index 000000000000..83daeb9b1aa2 > > --- /dev/null > > +++ b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > > @@ -0,0 +1,14 @@ > > +What: /sys/devices/platform/.../power_on_reason > > + > > +Date: October 2019 > > +KernelVersion: 5.4 > > +Contact: Kamel Bouhara <kamel.bouhara@bootlin.com> > > +Description: This file shows system power on reason. > > + The possible sources are: > > + General System Power-ON, RTC wakeup, Watchdog timeout, > > + Software Reset, User pressed reset button, > > + CPU Clock failure, 32.768kHz Oscillator Failure, > > + Low power mode exit, Unknown. > > + > > + The file is read only. > > + > > diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c > > index 44ca983a49a1..3cb2df40af37 100644 > > --- a/drivers/power/reset/at91-reset.c > > +++ b/drivers/power/reset/at91-reset.c > > @@ -17,7 +17,7 @@ > > #include <linux/of_address.h> > > #include <linux/platform_device.h> > > #include <linux/reboot.h> > > - > > +#include <linux/power/power_on_reason.h> > > #include <soc/at91/at91sam9_ddrsdr.h> > > #include <soc/at91/at91sam9_sdramc.h> > > > > @@ -146,42 +146,42 @@ static int samx7_restart(struct notifier_block *this, unsigned long mode, > > return NOTIFY_DONE; > > } > > > > -static void __init at91_reset_status(struct platform_device *pdev) > > +static const char *at91_reset_reason(struct platform_device *pdev) > > { > > const char *reason; > > u32 reg = readl(at91_rstc_base + AT91_RSTC_SR); > > > > switch ((reg & AT91_RSTC_RSTTYP) >> 8) { > > case RESET_TYPE_GENERAL: > > - reason = "general reset"; > > + reason = POWER_ON_REASON_GENERAL; > > break; > > case RESET_TYPE_WAKEUP: > > - reason = "wakeup"; > > + reason = POWER_ON_REASON_RTC; > > break; > > case RESET_TYPE_WATCHDOG: > > - reason = "watchdog reset"; > > + reason = POWER_ON_REASON_WATCHDOG; > > break; > > case RESET_TYPE_SOFTWARE: > > - reason = "software reset"; > > + reason = POWER_ON_REASON_SOFTWARE; > > break; > > case RESET_TYPE_USER: > > - reason = "user reset"; > > + reason = POWER_ON_REASON_USER; > > break; > > case RESET_TYPE_CPU_FAIL: > > - reason = "CPU clock failure detection"; > > + reason = POWER_ON_REASON_CPU_FAIL; > > break; > > case RESET_TYPE_XTAL_FAIL: > > - reason = "32.768 kHz crystal failure detection"; > > + reason = POWER_ON_REASON_XTAL_FAIL; > > break; > > case RESET_TYPE_ULP2: > > - reason = "ULP2 reset"; > > + reason = POWER_ON_REASON_LOW_POWER; > > break; > > default: > > - reason = "unknown reset"; > > + reason = POWER_ON_REASON_UNKNOWN; > > break; > > } > > > > - dev_info(&pdev->dev, "Starting after %s\n", reason); > > + return reason; > > } > > > > static const struct of_device_id at91_ramc_of_match[] = { > > @@ -204,6 +204,17 @@ static struct notifier_block at91_restart_nb = { > > .priority = 192, > > }; > > > > +static ssize_t power_on_reason_show(struct device *dev, > > + struct device_attribute *attr, > > + char *buf) > > +{ > > + struct platform_device *pdev = to_platform_device(dev); > > + > > + return sprintf(buf, "%s\n", at91_reset_reason(pdev)); > > +} > > + > > +static DEVICE_ATTR_RO(power_on_reason); > > + > > static int __init at91_reset_probe(struct platform_device *pdev) > > { > > const struct of_device_id *match; > > @@ -248,7 +259,14 @@ static int __init at91_reset_probe(struct platform_device *pdev) > > return ret; > > } > > > > - at91_reset_status(pdev); > > + ret = device_create_file(&pdev->dev, &dev_attr_power_on_reason); > > + if (ret) { > > + dev_err(&pdev->dev, "Could not create sysfs entry\n"); > > + return ret; > > + } > > + > > + dev_info(&pdev->dev, "Starting after %s reset\n", > > + at91_reset_reason(pdev)); > > > > return 0; > > } > > diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h > > new file mode 100644 > > index 000000000000..9978cc757427 > > --- /dev/null > > +++ b/include/linux/power/power_on_reason.h > > @@ -0,0 +1,19 @@ > > +/* SPDX-License-Identifier: GPL-2.0-only */ > > +/* > > + * Author: Kamel Bouhra <kamel.bouhara@bootlin.com> > > + */ > > + > > +#ifndef POWER_ON_REASON_H > > +#define POWER_ON_REASON_H > > + > > +#define POWER_ON_REASON_GENERAL "General" > > +#define POWER_ON_REASON_RTC "RTC wakeup" > > +#define POWER_ON_REASON_WATCHDOG "Watchdog timeout" > > +#define POWER_ON_REASON_SOFTWARE "Software" > > +#define POWER_ON_REASON_USER "User" > > +#define POWER_ON_REASON_CPU_FAIL "CPU Clock Failure" > > +#define POWER_ON_REASON_XTAL_FAIL "32.768k Crystal oscillator Failure" > > +#define POWER_ON_REASON_LOW_POWER "Low power exit" > > +#define POWER_ON_REASON_UNKNOWN "Unknown" > > + > > +#endif /* POWER_ON_REASON_H */ > > Is this new header necessary? > Yes because we want other drivers to be able to reuse them as-is so the ABI is stable. -- Alexandre Belloni, Bootlin Embedded Linux and Kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] power: reset: at91-reset: add sysfs interface to the power on reason @ 2019-11-29 11:02 ` Alexandre Belloni 0 siblings, 0 replies; 14+ messages in thread From: Alexandre Belloni @ 2019-11-29 11:02 UTC (permalink / raw) To: Claudiu.Beznea Cc: kamel.bouhara, linux-pm, linux-kernel, sre, Ludovic.Desroches, thomas.petazzoni, linux-arm-kernel On 29/11/2019 10:57:45+0000, Claudiu.Beznea@microchip.com wrote: > Hi Kamel, > > On 17.10.2019 15:40, Kamel Bouhara wrote: > > This patch export the power on reason through the sysfs interface and > > introduce some generic reset sources. > > Update the ABI documentation to list current power on sources. > > > > Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> > > --- > > .../sysfs-devices-platform-power-on-reason | 14 ++++++ > > drivers/power/reset/at91-reset.c | 44 +++++++++++++------ > > include/linux/power/power_on_reason.h | 19 ++++++++ > > 3 files changed, 64 insertions(+), 13 deletions(-) > > create mode 100644 Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > > create mode 100644 include/linux/power/power_on_reason.h > > > > diff --git a/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > > new file mode 100644 > > index 000000000000..83daeb9b1aa2 > > --- /dev/null > > +++ b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > > @@ -0,0 +1,14 @@ > > +What: /sys/devices/platform/.../power_on_reason > > + > > +Date: October 2019 > > +KernelVersion: 5.4 > > +Contact: Kamel Bouhara <kamel.bouhara@bootlin.com> > > +Description: This file shows system power on reason. > > + The possible sources are: > > + General System Power-ON, RTC wakeup, Watchdog timeout, > > + Software Reset, User pressed reset button, > > + CPU Clock failure, 32.768kHz Oscillator Failure, > > + Low power mode exit, Unknown. > > + > > + The file is read only. > > + > > diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c > > index 44ca983a49a1..3cb2df40af37 100644 > > --- a/drivers/power/reset/at91-reset.c > > +++ b/drivers/power/reset/at91-reset.c > > @@ -17,7 +17,7 @@ > > #include <linux/of_address.h> > > #include <linux/platform_device.h> > > #include <linux/reboot.h> > > - > > +#include <linux/power/power_on_reason.h> > > #include <soc/at91/at91sam9_ddrsdr.h> > > #include <soc/at91/at91sam9_sdramc.h> > > > > @@ -146,42 +146,42 @@ static int samx7_restart(struct notifier_block *this, unsigned long mode, > > return NOTIFY_DONE; > > } > > > > -static void __init at91_reset_status(struct platform_device *pdev) > > +static const char *at91_reset_reason(struct platform_device *pdev) > > { > > const char *reason; > > u32 reg = readl(at91_rstc_base + AT91_RSTC_SR); > > > > switch ((reg & AT91_RSTC_RSTTYP) >> 8) { > > case RESET_TYPE_GENERAL: > > - reason = "general reset"; > > + reason = POWER_ON_REASON_GENERAL; > > break; > > case RESET_TYPE_WAKEUP: > > - reason = "wakeup"; > > + reason = POWER_ON_REASON_RTC; > > break; > > case RESET_TYPE_WATCHDOG: > > - reason = "watchdog reset"; > > + reason = POWER_ON_REASON_WATCHDOG; > > break; > > case RESET_TYPE_SOFTWARE: > > - reason = "software reset"; > > + reason = POWER_ON_REASON_SOFTWARE; > > break; > > case RESET_TYPE_USER: > > - reason = "user reset"; > > + reason = POWER_ON_REASON_USER; > > break; > > case RESET_TYPE_CPU_FAIL: > > - reason = "CPU clock failure detection"; > > + reason = POWER_ON_REASON_CPU_FAIL; > > break; > > case RESET_TYPE_XTAL_FAIL: > > - reason = "32.768 kHz crystal failure detection"; > > + reason = POWER_ON_REASON_XTAL_FAIL; > > break; > > case RESET_TYPE_ULP2: > > - reason = "ULP2 reset"; > > + reason = POWER_ON_REASON_LOW_POWER; > > break; > > default: > > - reason = "unknown reset"; > > + reason = POWER_ON_REASON_UNKNOWN; > > break; > > } > > > > - dev_info(&pdev->dev, "Starting after %s\n", reason); > > + return reason; > > } > > > > static const struct of_device_id at91_ramc_of_match[] = { > > @@ -204,6 +204,17 @@ static struct notifier_block at91_restart_nb = { > > .priority = 192, > > }; > > > > +static ssize_t power_on_reason_show(struct device *dev, > > + struct device_attribute *attr, > > + char *buf) > > +{ > > + struct platform_device *pdev = to_platform_device(dev); > > + > > + return sprintf(buf, "%s\n", at91_reset_reason(pdev)); > > +} > > + > > +static DEVICE_ATTR_RO(power_on_reason); > > + > > static int __init at91_reset_probe(struct platform_device *pdev) > > { > > const struct of_device_id *match; > > @@ -248,7 +259,14 @@ static int __init at91_reset_probe(struct platform_device *pdev) > > return ret; > > } > > > > - at91_reset_status(pdev); > > + ret = device_create_file(&pdev->dev, &dev_attr_power_on_reason); > > + if (ret) { > > + dev_err(&pdev->dev, "Could not create sysfs entry\n"); > > + return ret; > > + } > > + > > + dev_info(&pdev->dev, "Starting after %s reset\n", > > + at91_reset_reason(pdev)); > > > > return 0; > > } > > diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h > > new file mode 100644 > > index 000000000000..9978cc757427 > > --- /dev/null > > +++ b/include/linux/power/power_on_reason.h > > @@ -0,0 +1,19 @@ > > +/* SPDX-License-Identifier: GPL-2.0-only */ > > +/* > > + * Author: Kamel Bouhra <kamel.bouhara@bootlin.com> > > + */ > > + > > +#ifndef POWER_ON_REASON_H > > +#define POWER_ON_REASON_H > > + > > +#define POWER_ON_REASON_GENERAL "General" > > +#define POWER_ON_REASON_RTC "RTC wakeup" > > +#define POWER_ON_REASON_WATCHDOG "Watchdog timeout" > > +#define POWER_ON_REASON_SOFTWARE "Software" > > +#define POWER_ON_REASON_USER "User" > > +#define POWER_ON_REASON_CPU_FAIL "CPU Clock Failure" > > +#define POWER_ON_REASON_XTAL_FAIL "32.768k Crystal oscillator Failure" > > +#define POWER_ON_REASON_LOW_POWER "Low power exit" > > +#define POWER_ON_REASON_UNKNOWN "Unknown" > > + > > +#endif /* POWER_ON_REASON_H */ > > Is this new header necessary? > Yes because we want other drivers to be able to reuse them as-is so the ABI is stable. -- Alexandre Belloni, Bootlin Embedded Linux and Kernel engineering https://bootlin.com _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] power: reset: at91-reset: add sysfs interface to the power on reason 2019-11-29 11:02 ` Alexandre Belloni @ 2019-11-29 11:15 ` Eugen.Hristev -1 siblings, 0 replies; 14+ messages in thread From: Eugen.Hristev @ 2019-11-29 11:15 UTC (permalink / raw) To: alexandre.belloni, Claudiu.Beznea Cc: kamel.bouhara, linux-pm, linux-kernel, sre, Ludovic.Desroches, thomas.petazzoni, linux-arm-kernel On 29.11.2019 13:02, Alexandre Belloni wrote: > On 29/11/2019 10:57:45+0000, Claudiu.Beznea@microchip.com wrote: >> Hi Kamel, >> >> On 17.10.2019 15:40, Kamel Bouhara wrote: >>> This patch export the power on reason through the sysfs interface and >>> introduce some generic reset sources. >>> Update the ABI documentation to list current power on sources. >>> >>> Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> >>> --- >>> .../sysfs-devices-platform-power-on-reason | 14 ++++++ >>> drivers/power/reset/at91-reset.c | 44 +++++++++++++------ >>> include/linux/power/power_on_reason.h | 19 ++++++++ >>> 3 files changed, 64 insertions(+), 13 deletions(-) >>> create mode 100644 Documentation/ABI/testing/sysfs-devices-platform-power-on-reason >>> create mode 100644 include/linux/power/power_on_reason.h >>> >>> diff --git a/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason >>> new file mode 100644 >>> index 000000000000..83daeb9b1aa2 >>> --- /dev/null >>> +++ b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason >>> @@ -0,0 +1,14 @@ >>> +What: /sys/devices/platform/.../power_on_reason >>> + >>> +Date: October 2019 >>> +KernelVersion: 5.4 >>> +Contact: Kamel Bouhara <kamel.bouhara@bootlin.com> >>> +Description: This file shows system power on reason. >>> + The possible sources are: >>> + General System Power-ON, RTC wakeup, Watchdog timeout, >>> + Software Reset, User pressed reset button, >>> + CPU Clock failure, 32.768kHz Oscillator Failure, >>> + Low power mode exit, Unknown. >>> + >>> + The file is read only. >>> + >>> diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c >>> index 44ca983a49a1..3cb2df40af37 100644 >>> --- a/drivers/power/reset/at91-reset.c >>> +++ b/drivers/power/reset/at91-reset.c >>> @@ -17,7 +17,7 @@ >>> #include <linux/of_address.h> >>> #include <linux/platform_device.h> >>> #include <linux/reboot.h> >>> - >>> +#include <linux/power/power_on_reason.h> >>> #include <soc/at91/at91sam9_ddrsdr.h> >>> #include <soc/at91/at91sam9_sdramc.h> >>> >>> @@ -146,42 +146,42 @@ static int samx7_restart(struct notifier_block *this, unsigned long mode, >>> return NOTIFY_DONE; >>> } >>> >>> -static void __init at91_reset_status(struct platform_device *pdev) >>> +static const char *at91_reset_reason(struct platform_device *pdev) >>> { >>> const char *reason; >>> u32 reg = readl(at91_rstc_base + AT91_RSTC_SR); >>> >>> switch ((reg & AT91_RSTC_RSTTYP) >> 8) { >>> case RESET_TYPE_GENERAL: >>> - reason = "general reset"; >>> + reason = POWER_ON_REASON_GENERAL; >>> break; >>> case RESET_TYPE_WAKEUP: >>> - reason = "wakeup"; >>> + reason = POWER_ON_REASON_RTC; >>> break; >>> case RESET_TYPE_WATCHDOG: >>> - reason = "watchdog reset"; >>> + reason = POWER_ON_REASON_WATCHDOG; >>> break; >>> case RESET_TYPE_SOFTWARE: >>> - reason = "software reset"; >>> + reason = POWER_ON_REASON_SOFTWARE; >>> break; >>> case RESET_TYPE_USER: >>> - reason = "user reset"; >>> + reason = POWER_ON_REASON_USER; >>> break; >>> case RESET_TYPE_CPU_FAIL: >>> - reason = "CPU clock failure detection"; >>> + reason = POWER_ON_REASON_CPU_FAIL; >>> break; >>> case RESET_TYPE_XTAL_FAIL: >>> - reason = "32.768 kHz crystal failure detection"; >>> + reason = POWER_ON_REASON_XTAL_FAIL; >>> break; >>> case RESET_TYPE_ULP2: >>> - reason = "ULP2 reset"; >>> + reason = POWER_ON_REASON_LOW_POWER; >>> break; >>> default: >>> - reason = "unknown reset"; >>> + reason = POWER_ON_REASON_UNKNOWN; >>> break; >>> } >>> >>> - dev_info(&pdev->dev, "Starting after %s\n", reason); >>> + return reason; >>> } >>> >>> static const struct of_device_id at91_ramc_of_match[] = { >>> @@ -204,6 +204,17 @@ static struct notifier_block at91_restart_nb = { >>> .priority = 192, >>> }; >>> >>> +static ssize_t power_on_reason_show(struct device *dev, >>> + struct device_attribute *attr, >>> + char *buf) >>> +{ >>> + struct platform_device *pdev = to_platform_device(dev); >>> + >>> + return sprintf(buf, "%s\n", at91_reset_reason(pdev)); >>> +} >>> + >>> +static DEVICE_ATTR_RO(power_on_reason); >>> + >>> static int __init at91_reset_probe(struct platform_device *pdev) >>> { >>> const struct of_device_id *match; >>> @@ -248,7 +259,14 @@ static int __init at91_reset_probe(struct platform_device *pdev) >>> return ret; >>> } >>> >>> - at91_reset_status(pdev); >>> + ret = device_create_file(&pdev->dev, &dev_attr_power_on_reason); >>> + if (ret) { >>> + dev_err(&pdev->dev, "Could not create sysfs entry\n"); >>> + return ret; >>> + } >>> + >>> + dev_info(&pdev->dev, "Starting after %s reset\n", >>> + at91_reset_reason(pdev)); >>> >>> return 0; >>> } >>> diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h >>> new file mode 100644 >>> index 000000000000..9978cc757427 >>> --- /dev/null >>> +++ b/include/linux/power/power_on_reason.h >>> @@ -0,0 +1,19 @@ >>> +/* SPDX-License-Identifier: GPL-2.0-only */ >>> +/* >>> + * Author: Kamel Bouhra <kamel.bouhara@bootlin.com> >>> + */ >>> + >>> +#ifndef POWER_ON_REASON_H >>> +#define POWER_ON_REASON_H >>> + >>> +#define POWER_ON_REASON_GENERAL "General" >>> +#define POWER_ON_REASON_RTC "RTC wakeup" >>> +#define POWER_ON_REASON_WATCHDOG "Watchdog timeout" >>> +#define POWER_ON_REASON_SOFTWARE "Software" >>> +#define POWER_ON_REASON_USER "User" >>> +#define POWER_ON_REASON_CPU_FAIL "CPU Clock Failure" >>> +#define POWER_ON_REASON_XTAL_FAIL "32.768k Crystal oscillator Failure" Hi, Looks rather odd to have a hardcoded crystal value inside a generic header. Also how is REASON_CPU_FAIL related to CPU Clock ? Eugen >>> +#define POWER_ON_REASON_LOW_POWER "Low power exit" >>> +#define POWER_ON_REASON_UNKNOWN "Unknown" >>> + >>> +#endif /* POWER_ON_REASON_H */ >> >> Is this new header necessary? >> > > Yes because we want other drivers to be able to reuse them as-is so the > ABI is stable. > > -- > Alexandre Belloni, Bootlin > Embedded Linux and Kernel engineering > https://bootlin.com > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] power: reset: at91-reset: add sysfs interface to the power on reason @ 2019-11-29 11:15 ` Eugen.Hristev 0 siblings, 0 replies; 14+ messages in thread From: Eugen.Hristev @ 2019-11-29 11:15 UTC (permalink / raw) To: alexandre.belloni, Claudiu.Beznea Cc: kamel.bouhara, linux-pm, sre, linux-kernel, Ludovic.Desroches, thomas.petazzoni, linux-arm-kernel On 29.11.2019 13:02, Alexandre Belloni wrote: > On 29/11/2019 10:57:45+0000, Claudiu.Beznea@microchip.com wrote: >> Hi Kamel, >> >> On 17.10.2019 15:40, Kamel Bouhara wrote: >>> This patch export the power on reason through the sysfs interface and >>> introduce some generic reset sources. >>> Update the ABI documentation to list current power on sources. >>> >>> Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> >>> --- >>> .../sysfs-devices-platform-power-on-reason | 14 ++++++ >>> drivers/power/reset/at91-reset.c | 44 +++++++++++++------ >>> include/linux/power/power_on_reason.h | 19 ++++++++ >>> 3 files changed, 64 insertions(+), 13 deletions(-) >>> create mode 100644 Documentation/ABI/testing/sysfs-devices-platform-power-on-reason >>> create mode 100644 include/linux/power/power_on_reason.h >>> >>> diff --git a/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason >>> new file mode 100644 >>> index 000000000000..83daeb9b1aa2 >>> --- /dev/null >>> +++ b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason >>> @@ -0,0 +1,14 @@ >>> +What: /sys/devices/platform/.../power_on_reason >>> + >>> +Date: October 2019 >>> +KernelVersion: 5.4 >>> +Contact: Kamel Bouhara <kamel.bouhara@bootlin.com> >>> +Description: This file shows system power on reason. >>> + The possible sources are: >>> + General System Power-ON, RTC wakeup, Watchdog timeout, >>> + Software Reset, User pressed reset button, >>> + CPU Clock failure, 32.768kHz Oscillator Failure, >>> + Low power mode exit, Unknown. >>> + >>> + The file is read only. >>> + >>> diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c >>> index 44ca983a49a1..3cb2df40af37 100644 >>> --- a/drivers/power/reset/at91-reset.c >>> +++ b/drivers/power/reset/at91-reset.c >>> @@ -17,7 +17,7 @@ >>> #include <linux/of_address.h> >>> #include <linux/platform_device.h> >>> #include <linux/reboot.h> >>> - >>> +#include <linux/power/power_on_reason.h> >>> #include <soc/at91/at91sam9_ddrsdr.h> >>> #include <soc/at91/at91sam9_sdramc.h> >>> >>> @@ -146,42 +146,42 @@ static int samx7_restart(struct notifier_block *this, unsigned long mode, >>> return NOTIFY_DONE; >>> } >>> >>> -static void __init at91_reset_status(struct platform_device *pdev) >>> +static const char *at91_reset_reason(struct platform_device *pdev) >>> { >>> const char *reason; >>> u32 reg = readl(at91_rstc_base + AT91_RSTC_SR); >>> >>> switch ((reg & AT91_RSTC_RSTTYP) >> 8) { >>> case RESET_TYPE_GENERAL: >>> - reason = "general reset"; >>> + reason = POWER_ON_REASON_GENERAL; >>> break; >>> case RESET_TYPE_WAKEUP: >>> - reason = "wakeup"; >>> + reason = POWER_ON_REASON_RTC; >>> break; >>> case RESET_TYPE_WATCHDOG: >>> - reason = "watchdog reset"; >>> + reason = POWER_ON_REASON_WATCHDOG; >>> break; >>> case RESET_TYPE_SOFTWARE: >>> - reason = "software reset"; >>> + reason = POWER_ON_REASON_SOFTWARE; >>> break; >>> case RESET_TYPE_USER: >>> - reason = "user reset"; >>> + reason = POWER_ON_REASON_USER; >>> break; >>> case RESET_TYPE_CPU_FAIL: >>> - reason = "CPU clock failure detection"; >>> + reason = POWER_ON_REASON_CPU_FAIL; >>> break; >>> case RESET_TYPE_XTAL_FAIL: >>> - reason = "32.768 kHz crystal failure detection"; >>> + reason = POWER_ON_REASON_XTAL_FAIL; >>> break; >>> case RESET_TYPE_ULP2: >>> - reason = "ULP2 reset"; >>> + reason = POWER_ON_REASON_LOW_POWER; >>> break; >>> default: >>> - reason = "unknown reset"; >>> + reason = POWER_ON_REASON_UNKNOWN; >>> break; >>> } >>> >>> - dev_info(&pdev->dev, "Starting after %s\n", reason); >>> + return reason; >>> } >>> >>> static const struct of_device_id at91_ramc_of_match[] = { >>> @@ -204,6 +204,17 @@ static struct notifier_block at91_restart_nb = { >>> .priority = 192, >>> }; >>> >>> +static ssize_t power_on_reason_show(struct device *dev, >>> + struct device_attribute *attr, >>> + char *buf) >>> +{ >>> + struct platform_device *pdev = to_platform_device(dev); >>> + >>> + return sprintf(buf, "%s\n", at91_reset_reason(pdev)); >>> +} >>> + >>> +static DEVICE_ATTR_RO(power_on_reason); >>> + >>> static int __init at91_reset_probe(struct platform_device *pdev) >>> { >>> const struct of_device_id *match; >>> @@ -248,7 +259,14 @@ static int __init at91_reset_probe(struct platform_device *pdev) >>> return ret; >>> } >>> >>> - at91_reset_status(pdev); >>> + ret = device_create_file(&pdev->dev, &dev_attr_power_on_reason); >>> + if (ret) { >>> + dev_err(&pdev->dev, "Could not create sysfs entry\n"); >>> + return ret; >>> + } >>> + >>> + dev_info(&pdev->dev, "Starting after %s reset\n", >>> + at91_reset_reason(pdev)); >>> >>> return 0; >>> } >>> diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h >>> new file mode 100644 >>> index 000000000000..9978cc757427 >>> --- /dev/null >>> +++ b/include/linux/power/power_on_reason.h >>> @@ -0,0 +1,19 @@ >>> +/* SPDX-License-Identifier: GPL-2.0-only */ >>> +/* >>> + * Author: Kamel Bouhra <kamel.bouhara@bootlin.com> >>> + */ >>> + >>> +#ifndef POWER_ON_REASON_H >>> +#define POWER_ON_REASON_H >>> + >>> +#define POWER_ON_REASON_GENERAL "General" >>> +#define POWER_ON_REASON_RTC "RTC wakeup" >>> +#define POWER_ON_REASON_WATCHDOG "Watchdog timeout" >>> +#define POWER_ON_REASON_SOFTWARE "Software" >>> +#define POWER_ON_REASON_USER "User" >>> +#define POWER_ON_REASON_CPU_FAIL "CPU Clock Failure" >>> +#define POWER_ON_REASON_XTAL_FAIL "32.768k Crystal oscillator Failure" Hi, Looks rather odd to have a hardcoded crystal value inside a generic header. Also how is REASON_CPU_FAIL related to CPU Clock ? Eugen >>> +#define POWER_ON_REASON_LOW_POWER "Low power exit" >>> +#define POWER_ON_REASON_UNKNOWN "Unknown" >>> + >>> +#endif /* POWER_ON_REASON_H */ >> >> Is this new header necessary? >> > > Yes because we want other drivers to be able to reuse them as-is so the > ABI is stable. > > -- > Alexandre Belloni, Bootlin > Embedded Linux and Kernel engineering > https://bootlin.com > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] power: reset: at91-reset: add sysfs interface to the power on reason 2019-11-29 11:15 ` Eugen.Hristev @ 2019-11-29 15:40 ` Alexandre Belloni -1 siblings, 0 replies; 14+ messages in thread From: Alexandre Belloni @ 2019-11-29 15:40 UTC (permalink / raw) To: Eugen.Hristev Cc: Claudiu.Beznea, kamel.bouhara, linux-pm, linux-kernel, sre, Ludovic.Desroches, thomas.petazzoni, linux-arm-kernel On 29/11/2019 11:15:18+0000, Eugen.Hristev@microchip.com wrote: > > > On 29.11.2019 13:02, Alexandre Belloni wrote: > > > On 29/11/2019 10:57:45+0000, Claudiu.Beznea@microchip.com wrote: > >> Hi Kamel, > >> > >> On 17.10.2019 15:40, Kamel Bouhara wrote: > >>> This patch export the power on reason through the sysfs interface and > >>> introduce some generic reset sources. > >>> Update the ABI documentation to list current power on sources. > >>> > >>> Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> > >>> --- > >>> .../sysfs-devices-platform-power-on-reason | 14 ++++++ > >>> drivers/power/reset/at91-reset.c | 44 +++++++++++++------ > >>> include/linux/power/power_on_reason.h | 19 ++++++++ > >>> 3 files changed, 64 insertions(+), 13 deletions(-) > >>> create mode 100644 Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > >>> create mode 100644 include/linux/power/power_on_reason.h > >>> > >>> diff --git a/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > >>> new file mode 100644 > >>> index 000000000000..83daeb9b1aa2 > >>> --- /dev/null > >>> +++ b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > >>> @@ -0,0 +1,14 @@ > >>> +What: /sys/devices/platform/.../power_on_reason > >>> + > >>> +Date: October 2019 > >>> +KernelVersion: 5.4 > >>> +Contact: Kamel Bouhara <kamel.bouhara@bootlin.com> > >>> +Description: This file shows system power on reason. > >>> + The possible sources are: > >>> + General System Power-ON, RTC wakeup, Watchdog timeout, > >>> + Software Reset, User pressed reset button, > >>> + CPU Clock failure, 32.768kHz Oscillator Failure, > >>> + Low power mode exit, Unknown. > >>> + > >>> + The file is read only. > >>> + > >>> diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c > >>> index 44ca983a49a1..3cb2df40af37 100644 > >>> --- a/drivers/power/reset/at91-reset.c > >>> +++ b/drivers/power/reset/at91-reset.c > >>> @@ -17,7 +17,7 @@ > >>> #include <linux/of_address.h> > >>> #include <linux/platform_device.h> > >>> #include <linux/reboot.h> > >>> - > >>> +#include <linux/power/power_on_reason.h> > >>> #include <soc/at91/at91sam9_ddrsdr.h> > >>> #include <soc/at91/at91sam9_sdramc.h> > >>> > >>> @@ -146,42 +146,42 @@ static int samx7_restart(struct notifier_block *this, unsigned long mode, > >>> return NOTIFY_DONE; > >>> } > >>> > >>> -static void __init at91_reset_status(struct platform_device *pdev) > >>> +static const char *at91_reset_reason(struct platform_device *pdev) > >>> { > >>> const char *reason; > >>> u32 reg = readl(at91_rstc_base + AT91_RSTC_SR); > >>> > >>> switch ((reg & AT91_RSTC_RSTTYP) >> 8) { > >>> case RESET_TYPE_GENERAL: > >>> - reason = "general reset"; > >>> + reason = POWER_ON_REASON_GENERAL; > >>> break; > >>> case RESET_TYPE_WAKEUP: > >>> - reason = "wakeup"; > >>> + reason = POWER_ON_REASON_RTC; > >>> break; > >>> case RESET_TYPE_WATCHDOG: > >>> - reason = "watchdog reset"; > >>> + reason = POWER_ON_REASON_WATCHDOG; > >>> break; > >>> case RESET_TYPE_SOFTWARE: > >>> - reason = "software reset"; > >>> + reason = POWER_ON_REASON_SOFTWARE; > >>> break; > >>> case RESET_TYPE_USER: > >>> - reason = "user reset"; > >>> + reason = POWER_ON_REASON_USER; > >>> break; > >>> case RESET_TYPE_CPU_FAIL: > >>> - reason = "CPU clock failure detection"; > >>> + reason = POWER_ON_REASON_CPU_FAIL; > >>> break; > >>> case RESET_TYPE_XTAL_FAIL: > >>> - reason = "32.768 kHz crystal failure detection"; > >>> + reason = POWER_ON_REASON_XTAL_FAIL; > >>> break; > >>> case RESET_TYPE_ULP2: > >>> - reason = "ULP2 reset"; > >>> + reason = POWER_ON_REASON_LOW_POWER; > >>> break; > >>> default: > >>> - reason = "unknown reset"; > >>> + reason = POWER_ON_REASON_UNKNOWN; > >>> break; > >>> } > >>> > >>> - dev_info(&pdev->dev, "Starting after %s\n", reason); > >>> + return reason; > >>> } > >>> > >>> static const struct of_device_id at91_ramc_of_match[] = { > >>> @@ -204,6 +204,17 @@ static struct notifier_block at91_restart_nb = { > >>> .priority = 192, > >>> }; > >>> > >>> +static ssize_t power_on_reason_show(struct device *dev, > >>> + struct device_attribute *attr, > >>> + char *buf) > >>> +{ > >>> + struct platform_device *pdev = to_platform_device(dev); > >>> + > >>> + return sprintf(buf, "%s\n", at91_reset_reason(pdev)); > >>> +} > >>> + > >>> +static DEVICE_ATTR_RO(power_on_reason); > >>> + > >>> static int __init at91_reset_probe(struct platform_device *pdev) > >>> { > >>> const struct of_device_id *match; > >>> @@ -248,7 +259,14 @@ static int __init at91_reset_probe(struct platform_device *pdev) > >>> return ret; > >>> } > >>> > >>> - at91_reset_status(pdev); > >>> + ret = device_create_file(&pdev->dev, &dev_attr_power_on_reason); > >>> + if (ret) { > >>> + dev_err(&pdev->dev, "Could not create sysfs entry\n"); > >>> + return ret; > >>> + } > >>> + > >>> + dev_info(&pdev->dev, "Starting after %s reset\n", > >>> + at91_reset_reason(pdev)); > >>> > >>> return 0; > >>> } > >>> diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h > >>> new file mode 100644 > >>> index 000000000000..9978cc757427 > >>> --- /dev/null > >>> +++ b/include/linux/power/power_on_reason.h > >>> @@ -0,0 +1,19 @@ > >>> +/* SPDX-License-Identifier: GPL-2.0-only */ > >>> +/* > >>> + * Author: Kamel Bouhra <kamel.bouhara@bootlin.com> > >>> + */ > >>> + > >>> +#ifndef POWER_ON_REASON_H > >>> +#define POWER_ON_REASON_H > >>> + > >>> +#define POWER_ON_REASON_GENERAL "General" > >>> +#define POWER_ON_REASON_RTC "RTC wakeup" > >>> +#define POWER_ON_REASON_WATCHDOG "Watchdog timeout" > >>> +#define POWER_ON_REASON_SOFTWARE "Software" > >>> +#define POWER_ON_REASON_USER "User" > >>> +#define POWER_ON_REASON_CPU_FAIL "CPU Clock Failure" > >>> +#define POWER_ON_REASON_XTAL_FAIL "32.768k Crystal oscillator Failure" > > Hi, > > Looks rather odd to have a hardcoded crystal value inside a generic header. > Also how is REASON_CPU_FAIL related to CPU Clock ? > Yes, I also think having the xtal rate is a bit too specific. -- Alexandre Belloni, Bootlin Embedded Linux and Kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] power: reset: at91-reset: add sysfs interface to the power on reason @ 2019-11-29 15:40 ` Alexandre Belloni 0 siblings, 0 replies; 14+ messages in thread From: Alexandre Belloni @ 2019-11-29 15:40 UTC (permalink / raw) To: Eugen.Hristev Cc: kamel.bouhara, linux-pm, sre, linux-kernel, Ludovic.Desroches, thomas.petazzoni, Claudiu.Beznea, linux-arm-kernel On 29/11/2019 11:15:18+0000, Eugen.Hristev@microchip.com wrote: > > > On 29.11.2019 13:02, Alexandre Belloni wrote: > > > On 29/11/2019 10:57:45+0000, Claudiu.Beznea@microchip.com wrote: > >> Hi Kamel, > >> > >> On 17.10.2019 15:40, Kamel Bouhara wrote: > >>> This patch export the power on reason through the sysfs interface and > >>> introduce some generic reset sources. > >>> Update the ABI documentation to list current power on sources. > >>> > >>> Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> > >>> --- > >>> .../sysfs-devices-platform-power-on-reason | 14 ++++++ > >>> drivers/power/reset/at91-reset.c | 44 +++++++++++++------ > >>> include/linux/power/power_on_reason.h | 19 ++++++++ > >>> 3 files changed, 64 insertions(+), 13 deletions(-) > >>> create mode 100644 Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > >>> create mode 100644 include/linux/power/power_on_reason.h > >>> > >>> diff --git a/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > >>> new file mode 100644 > >>> index 000000000000..83daeb9b1aa2 > >>> --- /dev/null > >>> +++ b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > >>> @@ -0,0 +1,14 @@ > >>> +What: /sys/devices/platform/.../power_on_reason > >>> + > >>> +Date: October 2019 > >>> +KernelVersion: 5.4 > >>> +Contact: Kamel Bouhara <kamel.bouhara@bootlin.com> > >>> +Description: This file shows system power on reason. > >>> + The possible sources are: > >>> + General System Power-ON, RTC wakeup, Watchdog timeout, > >>> + Software Reset, User pressed reset button, > >>> + CPU Clock failure, 32.768kHz Oscillator Failure, > >>> + Low power mode exit, Unknown. > >>> + > >>> + The file is read only. > >>> + > >>> diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c > >>> index 44ca983a49a1..3cb2df40af37 100644 > >>> --- a/drivers/power/reset/at91-reset.c > >>> +++ b/drivers/power/reset/at91-reset.c > >>> @@ -17,7 +17,7 @@ > >>> #include <linux/of_address.h> > >>> #include <linux/platform_device.h> > >>> #include <linux/reboot.h> > >>> - > >>> +#include <linux/power/power_on_reason.h> > >>> #include <soc/at91/at91sam9_ddrsdr.h> > >>> #include <soc/at91/at91sam9_sdramc.h> > >>> > >>> @@ -146,42 +146,42 @@ static int samx7_restart(struct notifier_block *this, unsigned long mode, > >>> return NOTIFY_DONE; > >>> } > >>> > >>> -static void __init at91_reset_status(struct platform_device *pdev) > >>> +static const char *at91_reset_reason(struct platform_device *pdev) > >>> { > >>> const char *reason; > >>> u32 reg = readl(at91_rstc_base + AT91_RSTC_SR); > >>> > >>> switch ((reg & AT91_RSTC_RSTTYP) >> 8) { > >>> case RESET_TYPE_GENERAL: > >>> - reason = "general reset"; > >>> + reason = POWER_ON_REASON_GENERAL; > >>> break; > >>> case RESET_TYPE_WAKEUP: > >>> - reason = "wakeup"; > >>> + reason = POWER_ON_REASON_RTC; > >>> break; > >>> case RESET_TYPE_WATCHDOG: > >>> - reason = "watchdog reset"; > >>> + reason = POWER_ON_REASON_WATCHDOG; > >>> break; > >>> case RESET_TYPE_SOFTWARE: > >>> - reason = "software reset"; > >>> + reason = POWER_ON_REASON_SOFTWARE; > >>> break; > >>> case RESET_TYPE_USER: > >>> - reason = "user reset"; > >>> + reason = POWER_ON_REASON_USER; > >>> break; > >>> case RESET_TYPE_CPU_FAIL: > >>> - reason = "CPU clock failure detection"; > >>> + reason = POWER_ON_REASON_CPU_FAIL; > >>> break; > >>> case RESET_TYPE_XTAL_FAIL: > >>> - reason = "32.768 kHz crystal failure detection"; > >>> + reason = POWER_ON_REASON_XTAL_FAIL; > >>> break; > >>> case RESET_TYPE_ULP2: > >>> - reason = "ULP2 reset"; > >>> + reason = POWER_ON_REASON_LOW_POWER; > >>> break; > >>> default: > >>> - reason = "unknown reset"; > >>> + reason = POWER_ON_REASON_UNKNOWN; > >>> break; > >>> } > >>> > >>> - dev_info(&pdev->dev, "Starting after %s\n", reason); > >>> + return reason; > >>> } > >>> > >>> static const struct of_device_id at91_ramc_of_match[] = { > >>> @@ -204,6 +204,17 @@ static struct notifier_block at91_restart_nb = { > >>> .priority = 192, > >>> }; > >>> > >>> +static ssize_t power_on_reason_show(struct device *dev, > >>> + struct device_attribute *attr, > >>> + char *buf) > >>> +{ > >>> + struct platform_device *pdev = to_platform_device(dev); > >>> + > >>> + return sprintf(buf, "%s\n", at91_reset_reason(pdev)); > >>> +} > >>> + > >>> +static DEVICE_ATTR_RO(power_on_reason); > >>> + > >>> static int __init at91_reset_probe(struct platform_device *pdev) > >>> { > >>> const struct of_device_id *match; > >>> @@ -248,7 +259,14 @@ static int __init at91_reset_probe(struct platform_device *pdev) > >>> return ret; > >>> } > >>> > >>> - at91_reset_status(pdev); > >>> + ret = device_create_file(&pdev->dev, &dev_attr_power_on_reason); > >>> + if (ret) { > >>> + dev_err(&pdev->dev, "Could not create sysfs entry\n"); > >>> + return ret; > >>> + } > >>> + > >>> + dev_info(&pdev->dev, "Starting after %s reset\n", > >>> + at91_reset_reason(pdev)); > >>> > >>> return 0; > >>> } > >>> diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h > >>> new file mode 100644 > >>> index 000000000000..9978cc757427 > >>> --- /dev/null > >>> +++ b/include/linux/power/power_on_reason.h > >>> @@ -0,0 +1,19 @@ > >>> +/* SPDX-License-Identifier: GPL-2.0-only */ > >>> +/* > >>> + * Author: Kamel Bouhra <kamel.bouhara@bootlin.com> > >>> + */ > >>> + > >>> +#ifndef POWER_ON_REASON_H > >>> +#define POWER_ON_REASON_H > >>> + > >>> +#define POWER_ON_REASON_GENERAL "General" > >>> +#define POWER_ON_REASON_RTC "RTC wakeup" > >>> +#define POWER_ON_REASON_WATCHDOG "Watchdog timeout" > >>> +#define POWER_ON_REASON_SOFTWARE "Software" > >>> +#define POWER_ON_REASON_USER "User" > >>> +#define POWER_ON_REASON_CPU_FAIL "CPU Clock Failure" > >>> +#define POWER_ON_REASON_XTAL_FAIL "32.768k Crystal oscillator Failure" > > Hi, > > Looks rather odd to have a hardcoded crystal value inside a generic header. > Also how is REASON_CPU_FAIL related to CPU Clock ? > Yes, I also think having the xtal rate is a bit too specific. -- Alexandre Belloni, Bootlin Embedded Linux and Kernel engineering https://bootlin.com _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] power: reset: at91-reset: add sysfs interface to the power on reason 2019-11-29 11:15 ` Eugen.Hristev @ 2019-12-02 11:44 ` Kamel Bouhara -1 siblings, 0 replies; 14+ messages in thread From: Kamel Bouhara @ 2019-12-02 11:44 UTC (permalink / raw) To: Eugen.Hristev Cc: alexandre.belloni, Claudiu.Beznea, linux-pm, linux-kernel, sre, Ludovic.Desroches, thomas.petazzoni, linux-arm-kernel On Fri, Nov 29, 2019 at 11:15:18AM +0000, Eugen.Hristev@microchip.com wrote: > > > On 29.11.2019 13:02, Alexandre Belloni wrote: > > > On 29/11/2019 10:57:45+0000, Claudiu.Beznea@microchip.com wrote: > >> Hi Kamel, > >> > >> On 17.10.2019 15:40, Kamel Bouhara wrote: > >>> This patch export the power on reason through the sysfs interface and > >>> introduce some generic reset sources. > >>> Update the ABI documentation to list current power on sources. > >>> > >>> Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> > >>> --- > >>> .../sysfs-devices-platform-power-on-reason | 14 ++++++ > >>> drivers/power/reset/at91-reset.c | 44 +++++++++++++------ > >>> include/linux/power/power_on_reason.h | 19 ++++++++ > >>> 3 files changed, 64 insertions(+), 13 deletions(-) > >>> create mode 100644 Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > >>> create mode 100644 include/linux/power/power_on_reason.h > >>> > >>> diff --git a/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > >>> new file mode 100644 > >>> index 000000000000..83daeb9b1aa2 > >>> --- /dev/null > >>> +++ b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > >>> @@ -0,0 +1,14 @@ > >>> +What: /sys/devices/platform/.../power_on_reason > >>> + > >>> +Date: October 2019 > >>> +KernelVersion: 5.4 > >>> +Contact: Kamel Bouhara <kamel.bouhara@bootlin.com> > >>> +Description: This file shows system power on reason. > >>> + The possible sources are: > >>> + General System Power-ON, RTC wakeup, Watchdog timeout, > >>> + Software Reset, User pressed reset button, > >>> + CPU Clock failure, 32.768kHz Oscillator Failure, > >>> + Low power mode exit, Unknown. > >>> + > >>> + The file is read only. > >>> + > >>> diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c > >>> index 44ca983a49a1..3cb2df40af37 100644 > >>> --- a/drivers/power/reset/at91-reset.c > >>> +++ b/drivers/power/reset/at91-reset.c > >>> @@ -17,7 +17,7 @@ > >>> #include <linux/of_address.h> > >>> #include <linux/platform_device.h> > >>> #include <linux/reboot.h> > >>> - > >>> +#include <linux/power/power_on_reason.h> > >>> #include <soc/at91/at91sam9_ddrsdr.h> > >>> #include <soc/at91/at91sam9_sdramc.h> > >>> > >>> @@ -146,42 +146,42 @@ static int samx7_restart(struct notifier_block *this, unsigned long mode, > >>> return NOTIFY_DONE; > >>> } > >>> > >>> -static void __init at91_reset_status(struct platform_device *pdev) > >>> +static const char *at91_reset_reason(struct platform_device *pdev) > >>> { > >>> const char *reason; > >>> u32 reg = readl(at91_rstc_base + AT91_RSTC_SR); > >>> > >>> switch ((reg & AT91_RSTC_RSTTYP) >> 8) { > >>> case RESET_TYPE_GENERAL: > >>> - reason = "general reset"; > >>> + reason = POWER_ON_REASON_GENERAL; > >>> break; > >>> case RESET_TYPE_WAKEUP: > >>> - reason = "wakeup"; > >>> + reason = POWER_ON_REASON_RTC; > >>> break; > >>> case RESET_TYPE_WATCHDOG: > >>> - reason = "watchdog reset"; > >>> + reason = POWER_ON_REASON_WATCHDOG; > >>> break; > >>> case RESET_TYPE_SOFTWARE: > >>> - reason = "software reset"; > >>> + reason = POWER_ON_REASON_SOFTWARE; > >>> break; > >>> case RESET_TYPE_USER: > >>> - reason = "user reset"; > >>> + reason = POWER_ON_REASON_USER; > >>> break; > >>> case RESET_TYPE_CPU_FAIL: > >>> - reason = "CPU clock failure detection"; > >>> + reason = POWER_ON_REASON_CPU_FAIL; > >>> break; > >>> case RESET_TYPE_XTAL_FAIL: > >>> - reason = "32.768 kHz crystal failure detection"; > >>> + reason = POWER_ON_REASON_XTAL_FAIL; > >>> break; > >>> case RESET_TYPE_ULP2: > >>> - reason = "ULP2 reset"; > >>> + reason = POWER_ON_REASON_LOW_POWER; > >>> break; > >>> default: > >>> - reason = "unknown reset"; > >>> + reason = POWER_ON_REASON_UNKNOWN; > >>> break; > >>> } > >>> > >>> - dev_info(&pdev->dev, "Starting after %s\n", reason); > >>> + return reason; > >>> } > >>> > >>> static const struct of_device_id at91_ramc_of_match[] = { > >>> @@ -204,6 +204,17 @@ static struct notifier_block at91_restart_nb = { > >>> .priority = 192, > >>> }; > >>> > >>> +static ssize_t power_on_reason_show(struct device *dev, > >>> + struct device_attribute *attr, > >>> + char *buf) > >>> +{ > >>> + struct platform_device *pdev = to_platform_device(dev); > >>> + > >>> + return sprintf(buf, "%s\n", at91_reset_reason(pdev)); > >>> +} > >>> + > >>> +static DEVICE_ATTR_RO(power_on_reason); > >>> + > >>> static int __init at91_reset_probe(struct platform_device *pdev) > >>> { > >>> const struct of_device_id *match; > >>> @@ -248,7 +259,14 @@ static int __init at91_reset_probe(struct platform_device *pdev) > >>> return ret; > >>> } > >>> > >>> - at91_reset_status(pdev); > >>> + ret = device_create_file(&pdev->dev, &dev_attr_power_on_reason); > >>> + if (ret) { > >>> + dev_err(&pdev->dev, "Could not create sysfs entry\n"); > >>> + return ret; > >>> + } > >>> + > >>> + dev_info(&pdev->dev, "Starting after %s reset\n", > >>> + at91_reset_reason(pdev)); > >>> > >>> return 0; > >>> } > >>> diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h > >>> new file mode 100644 > >>> index 000000000000..9978cc757427 > >>> --- /dev/null > >>> +++ b/include/linux/power/power_on_reason.h > >>> @@ -0,0 +1,19 @@ > >>> +/* SPDX-License-Identifier: GPL-2.0-only */ > >>> +/* > >>> + * Author: Kamel Bouhra <kamel.bouhara@bootlin.com> > >>> + */ > >>> + > >>> +#ifndef POWER_ON_REASON_H > >>> +#define POWER_ON_REASON_H > >>> + > >>> +#define POWER_ON_REASON_GENERAL "General" > >>> +#define POWER_ON_REASON_RTC "RTC wakeup" > >>> +#define POWER_ON_REASON_WATCHDOG "Watchdog timeout" > >>> +#define POWER_ON_REASON_SOFTWARE "Software" > >>> +#define POWER_ON_REASON_USER "User" > >>> +#define POWER_ON_REASON_CPU_FAIL "CPU Clock Failure" > >>> +#define POWER_ON_REASON_XTAL_FAIL "32.768k Crystal oscillator Failure" > > Hi, > > Looks rather odd to have a hardcoded crystal value inside a generic header. > Also how is REASON_CPU_FAIL related to CPU Clock ? > Hi, Eugen, I agree we should hide the crystal value. For the reset status, I've just move those from the driver. I guess the REASON_CPU_FAIL is related to some clock overclocking issue. Kamel > Eugen > > >>> +#define POWER_ON_REASON_LOW_POWER "Low power exit" > >>> +#define POWER_ON_REASON_UNKNOWN "Unknown" > >>> + > >>> +#endif /* POWER_ON_REASON_H */ > >> > >> Is this new header necessary? > >> > > > > Yes because we want other drivers to be able to reuse them as-is so the > > ABI is stable. > > > > -- > > Alexandre Belloni, Bootlin > > Embedded Linux and Kernel engineering > > https://bootlin.com > > > > _______________________________________________ > > linux-arm-kernel mailing list > > linux-arm-kernel@lists.infradead.org > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > > -- Kamel Bouhara, Bootlin Embedded Linux and kernel engineering https://bootlin.com ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] power: reset: at91-reset: add sysfs interface to the power on reason @ 2019-12-02 11:44 ` Kamel Bouhara 0 siblings, 0 replies; 14+ messages in thread From: Kamel Bouhara @ 2019-12-02 11:44 UTC (permalink / raw) To: Eugen.Hristev Cc: alexandre.belloni, linux-pm, linux-kernel, sre, Ludovic.Desroches, thomas.petazzoni, Claudiu.Beznea, linux-arm-kernel On Fri, Nov 29, 2019 at 11:15:18AM +0000, Eugen.Hristev@microchip.com wrote: > > > On 29.11.2019 13:02, Alexandre Belloni wrote: > > > On 29/11/2019 10:57:45+0000, Claudiu.Beznea@microchip.com wrote: > >> Hi Kamel, > >> > >> On 17.10.2019 15:40, Kamel Bouhara wrote: > >>> This patch export the power on reason through the sysfs interface and > >>> introduce some generic reset sources. > >>> Update the ABI documentation to list current power on sources. > >>> > >>> Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> > >>> --- > >>> .../sysfs-devices-platform-power-on-reason | 14 ++++++ > >>> drivers/power/reset/at91-reset.c | 44 +++++++++++++------ > >>> include/linux/power/power_on_reason.h | 19 ++++++++ > >>> 3 files changed, 64 insertions(+), 13 deletions(-) > >>> create mode 100644 Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > >>> create mode 100644 include/linux/power/power_on_reason.h > >>> > >>> diff --git a/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > >>> new file mode 100644 > >>> index 000000000000..83daeb9b1aa2 > >>> --- /dev/null > >>> +++ b/Documentation/ABI/testing/sysfs-devices-platform-power-on-reason > >>> @@ -0,0 +1,14 @@ > >>> +What: /sys/devices/platform/.../power_on_reason > >>> + > >>> +Date: October 2019 > >>> +KernelVersion: 5.4 > >>> +Contact: Kamel Bouhara <kamel.bouhara@bootlin.com> > >>> +Description: This file shows system power on reason. > >>> + The possible sources are: > >>> + General System Power-ON, RTC wakeup, Watchdog timeout, > >>> + Software Reset, User pressed reset button, > >>> + CPU Clock failure, 32.768kHz Oscillator Failure, > >>> + Low power mode exit, Unknown. > >>> + > >>> + The file is read only. > >>> + > >>> diff --git a/drivers/power/reset/at91-reset.c b/drivers/power/reset/at91-reset.c > >>> index 44ca983a49a1..3cb2df40af37 100644 > >>> --- a/drivers/power/reset/at91-reset.c > >>> +++ b/drivers/power/reset/at91-reset.c > >>> @@ -17,7 +17,7 @@ > >>> #include <linux/of_address.h> > >>> #include <linux/platform_device.h> > >>> #include <linux/reboot.h> > >>> - > >>> +#include <linux/power/power_on_reason.h> > >>> #include <soc/at91/at91sam9_ddrsdr.h> > >>> #include <soc/at91/at91sam9_sdramc.h> > >>> > >>> @@ -146,42 +146,42 @@ static int samx7_restart(struct notifier_block *this, unsigned long mode, > >>> return NOTIFY_DONE; > >>> } > >>> > >>> -static void __init at91_reset_status(struct platform_device *pdev) > >>> +static const char *at91_reset_reason(struct platform_device *pdev) > >>> { > >>> const char *reason; > >>> u32 reg = readl(at91_rstc_base + AT91_RSTC_SR); > >>> > >>> switch ((reg & AT91_RSTC_RSTTYP) >> 8) { > >>> case RESET_TYPE_GENERAL: > >>> - reason = "general reset"; > >>> + reason = POWER_ON_REASON_GENERAL; > >>> break; > >>> case RESET_TYPE_WAKEUP: > >>> - reason = "wakeup"; > >>> + reason = POWER_ON_REASON_RTC; > >>> break; > >>> case RESET_TYPE_WATCHDOG: > >>> - reason = "watchdog reset"; > >>> + reason = POWER_ON_REASON_WATCHDOG; > >>> break; > >>> case RESET_TYPE_SOFTWARE: > >>> - reason = "software reset"; > >>> + reason = POWER_ON_REASON_SOFTWARE; > >>> break; > >>> case RESET_TYPE_USER: > >>> - reason = "user reset"; > >>> + reason = POWER_ON_REASON_USER; > >>> break; > >>> case RESET_TYPE_CPU_FAIL: > >>> - reason = "CPU clock failure detection"; > >>> + reason = POWER_ON_REASON_CPU_FAIL; > >>> break; > >>> case RESET_TYPE_XTAL_FAIL: > >>> - reason = "32.768 kHz crystal failure detection"; > >>> + reason = POWER_ON_REASON_XTAL_FAIL; > >>> break; > >>> case RESET_TYPE_ULP2: > >>> - reason = "ULP2 reset"; > >>> + reason = POWER_ON_REASON_LOW_POWER; > >>> break; > >>> default: > >>> - reason = "unknown reset"; > >>> + reason = POWER_ON_REASON_UNKNOWN; > >>> break; > >>> } > >>> > >>> - dev_info(&pdev->dev, "Starting after %s\n", reason); > >>> + return reason; > >>> } > >>> > >>> static const struct of_device_id at91_ramc_of_match[] = { > >>> @@ -204,6 +204,17 @@ static struct notifier_block at91_restart_nb = { > >>> .priority = 192, > >>> }; > >>> > >>> +static ssize_t power_on_reason_show(struct device *dev, > >>> + struct device_attribute *attr, > >>> + char *buf) > >>> +{ > >>> + struct platform_device *pdev = to_platform_device(dev); > >>> + > >>> + return sprintf(buf, "%s\n", at91_reset_reason(pdev)); > >>> +} > >>> + > >>> +static DEVICE_ATTR_RO(power_on_reason); > >>> + > >>> static int __init at91_reset_probe(struct platform_device *pdev) > >>> { > >>> const struct of_device_id *match; > >>> @@ -248,7 +259,14 @@ static int __init at91_reset_probe(struct platform_device *pdev) > >>> return ret; > >>> } > >>> > >>> - at91_reset_status(pdev); > >>> + ret = device_create_file(&pdev->dev, &dev_attr_power_on_reason); > >>> + if (ret) { > >>> + dev_err(&pdev->dev, "Could not create sysfs entry\n"); > >>> + return ret; > >>> + } > >>> + > >>> + dev_info(&pdev->dev, "Starting after %s reset\n", > >>> + at91_reset_reason(pdev)); > >>> > >>> return 0; > >>> } > >>> diff --git a/include/linux/power/power_on_reason.h b/include/linux/power/power_on_reason.h > >>> new file mode 100644 > >>> index 000000000000..9978cc757427 > >>> --- /dev/null > >>> +++ b/include/linux/power/power_on_reason.h > >>> @@ -0,0 +1,19 @@ > >>> +/* SPDX-License-Identifier: GPL-2.0-only */ > >>> +/* > >>> + * Author: Kamel Bouhra <kamel.bouhara@bootlin.com> > >>> + */ > >>> + > >>> +#ifndef POWER_ON_REASON_H > >>> +#define POWER_ON_REASON_H > >>> + > >>> +#define POWER_ON_REASON_GENERAL "General" > >>> +#define POWER_ON_REASON_RTC "RTC wakeup" > >>> +#define POWER_ON_REASON_WATCHDOG "Watchdog timeout" > >>> +#define POWER_ON_REASON_SOFTWARE "Software" > >>> +#define POWER_ON_REASON_USER "User" > >>> +#define POWER_ON_REASON_CPU_FAIL "CPU Clock Failure" > >>> +#define POWER_ON_REASON_XTAL_FAIL "32.768k Crystal oscillator Failure" > > Hi, > > Looks rather odd to have a hardcoded crystal value inside a generic header. > Also how is REASON_CPU_FAIL related to CPU Clock ? > Hi, Eugen, I agree we should hide the crystal value. For the reset status, I've just move those from the driver. I guess the REASON_CPU_FAIL is related to some clock overclocking issue. Kamel > Eugen > > >>> +#define POWER_ON_REASON_LOW_POWER "Low power exit" > >>> +#define POWER_ON_REASON_UNKNOWN "Unknown" > >>> + > >>> +#endif /* POWER_ON_REASON_H */ > >> > >> Is this new header necessary? > >> > > > > Yes because we want other drivers to be able to reuse them as-is so the > > ABI is stable. > > > > -- > > Alexandre Belloni, Bootlin > > Embedded Linux and Kernel engineering > > https://bootlin.com > > > > _______________________________________________ > > linux-arm-kernel mailing list > > linux-arm-kernel@lists.infradead.org > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > > -- Kamel Bouhara, Bootlin Embedded Linux and kernel engineering https://bootlin.com _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2019-12-02 11:44 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2019-10-17 12:40 [PATCH] power: reset: at91-reset: add sysfs interface to the power on reason Kamel Bouhara 2019-10-17 12:40 ` Kamel Bouhara 2019-11-28 14:48 ` Nicolas.Ferre 2019-11-28 14:48 ` Nicolas.Ferre 2019-11-29 10:57 ` Claudiu.Beznea 2019-11-29 10:57 ` Claudiu.Beznea 2019-11-29 11:02 ` Alexandre Belloni 2019-11-29 11:02 ` Alexandre Belloni 2019-11-29 11:15 ` Eugen.Hristev 2019-11-29 11:15 ` Eugen.Hristev 2019-11-29 15:40 ` Alexandre Belloni 2019-11-29 15:40 ` Alexandre Belloni 2019-12-02 11:44 ` Kamel Bouhara 2019-12-02 11:44 ` Kamel Bouhara
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.