Recently I have noticed too many users of struct rtc_time that printing
its content field by field.
In this series I introduce %pt[dt][rv] specifier to make life a bit
easier.
There are still users of detailed output of the struct rtc_time, but we
can introduce an additional extension for them in the future if needed,
otherwise they might be converted to the proposed output format.
Some of the changes slightly modify the output. In those cases we are on
the safe side since they are pure debug. Nevertheless I tried to leave
numbers to be the same or quite close: in some cases year is printed +
1900, though month is left in the range [0,11] instead of [1,12].
I didn't compile everything there, though I did a basic smoke test on
some x86 hardware. So, I rely on kbuild test robot as well :-)
Most of the users currently are RTC drivers, thus the patch series is
assumed to go via RTC tree.
Andy Shevchenko (25):
lib/vsprintf: Remove useless NULL checks
lib/vsprintf: Make decspec global
lib/vsprintf: Make strspec global
lib/vsprintf: Print time and date in human readable format via %pt
ds1302: Switch to use %pt
rtc: Switch to use %pt
rtc: at91rm9200: Switch to use %pt
rtc: at91sam9: Switch to use %pt
rtc: m41t80: Switch to use %pt
rtc: m48t59: Switch to use %pt
rtc: mcp795: Switch to use %pt
rtc: pcf50633: Switch to use %pt
rtc: pic32: Switch to use %pt
rtc: pm8xxx: Switch to use %pt
rtc: puv3: Switch to use %pt
rtc: rk808: Switch to use %pt
rtc: rx6110: Switch to use %pt
rtc: rx8025: Switch to use %pt
rtc: s3c: Switch to use %pt
rtc: s5m: Switch to use %pt
rtc: tegra: Switch to use %pt
mk68/mac: Switch to use %pt
Input: hp_sdc_rtc - Switch to use %pt
kdb: Switch to use %pt
PM: Switch to use %pt
Documentation/printk-formats.txt | 17 ++++
arch/m68k/mac/misc.c | 8 +-
drivers/base/power/trace.c | 4 +-
drivers/char/ds1302.c | 38 +++------
drivers/char/rtc.c | 7 +-
drivers/input/misc/hp_sdc_rtc.c | 8 +-
drivers/rtc/hctosys.c | 8 +-
drivers/rtc/interface.c | 8 +-
drivers/rtc/rtc-at91rm9200.c | 16 +---
drivers/rtc/rtc-at91sam9.c | 16 +---
drivers/rtc/rtc-m41t80.c | 6 +-
drivers/rtc/rtc-m48t59.c | 8 +-
drivers/rtc/rtc-mcp795.c | 18 ++---
drivers/rtc/rtc-pcf50633.c | 8 +-
drivers/rtc/rtc-pic32.c | 18 +----
drivers/rtc/rtc-pm8xxx.c | 16 ++--
drivers/rtc/rtc-proc.c | 36 ++-------
drivers/rtc/rtc-puv3.c | 18 +----
drivers/rtc/rtc-rk808.c | 20 ++---
drivers/rtc/rtc-rx6110.c | 12 +--
drivers/rtc/rtc-rx8025.c | 19 +----
drivers/rtc/rtc-s3c.c | 21 ++---
drivers/rtc/rtc-s5m.c | 27 ++-----
drivers/rtc/rtc-sysfs.c | 12 +--
drivers/rtc/rtc-tegra.c | 30 +------
kernel/debug/kdb/kdb_main.c | 7 +-
lib/vsprintf.c | 167 ++++++++++++++++++++++++++++++++-------
27 files changed, 248 insertions(+), 325 deletions(-)
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Cc: Jason Wessel <[email protected]>
Cc: Ingo Molnar <[email protected]>
Signed-off-by: Andy Shevchenko <[email protected]>
---
kernel/debug/kdb/kdb_main.c | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index c8146d53ca67..2a6f12be79d8 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -2556,12 +2556,7 @@ static int kdb_summary(int argc, const char **argv)
now = __current_kernel_time();
kdb_gmtime(&now, &tm);
- kdb_printf("date %04d-%02d-%02d %02d:%02d:%02d "
- "tz_minuteswest %d\n",
- 1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday,
- tm.tm_hour, tm.tm_min, tm.tm_sec,
- sys_tz.tz_minuteswest);
-
+ kdb_printf("date %pt tz_minuteswest %d\n", &tm, sys_tz.tz_minuteswest);
kdb_sysinfo(&val);
kdb_printf("uptime ");
if (val.uptime > (24*60*60)) {
--
2.11.0
There are users which print time and date represented by content of
struct rtc_time in human readable format.
Instead of open coding that each time introduce %pt[dt][rv] specifier.
Cc: Arnd Bergmann <[email protected]>
Cc: Bartlomiej Zolnierkiewicz <[email protected]>
Cc: Dmitry Torokhov <[email protected]>
Cc: Geert Uytterhoeven <[email protected]>
Cc: Guan Xuetao <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Jason Wessel <[email protected]>
Cc: Jonathan Corbet <[email protected]>
Cc: Jonathan Hunter <[email protected]>
Cc: Krzysztof Kozlowski <[email protected]>
Cc: "Rafael J. Wysocki" <[email protected]>
Cc: Thierry Reding <[email protected]>
Signed-off-by: Andy Shevchenko <[email protected]>
---
Documentation/printk-formats.txt | 17 ++++++
lib/vsprintf.c | 124 +++++++++++++++++++++++++++++++++++++++
2 files changed, 141 insertions(+)
diff --git a/Documentation/printk-formats.txt b/Documentation/printk-formats.txt
index d8c40c30118a..fa5b718a5dcc 100644
--- a/Documentation/printk-formats.txt
+++ b/Documentation/printk-formats.txt
@@ -282,6 +282,23 @@ struct va_format:
Passed by reference.
+struct rtc_time:
+
+ %pt YYYY-mm-dd HH:MM:SS
+ %ptd YYYY-mm-dd
+ %ptt HH:MM:SS
+ %pt[dt][rv]
+
+ For printing date and time as represented by struct rtc_time
+ structure in human readable format.
+
+ By default year will be incremented by 1900 and month by 1. Use
+ 'r' (raw) to suppress this behaviour. On the other hand when
+ 'v' is applied validation mechanism will be in use, i.e. numbers
+ out of range will be replaced by '**' or '****'.
+
+ Passed by reference.
+
struct clk:
%pC pll1
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 001303612b55..653d08b50850 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -30,6 +30,7 @@
#include <linux/ioport.h>
#include <linux/dcache.h>
#include <linux/cred.h>
+#include <linux/rtc.h>
#include <linux/uuid.h>
#include <net/addrconf.h>
#ifdef CONFIG_BLOCK
@@ -701,6 +702,20 @@ static const struct printf_spec default_dec_spec = {
.precision = -1,
};
+static const struct printf_spec default_dec02_spec = {
+ .base = 10,
+ .field_width = 2,
+ .precision = -1,
+ .flags = ZEROPAD,
+};
+
+static const struct printf_spec default_dec04_spec = {
+ .base = 10,
+ .field_width = 4,
+ .precision = -1,
+ .flags = ZEROPAD,
+};
+
static noinline_for_stack
char *resource_string(char *buf, char *end, struct resource *res,
struct printf_spec spec, const char *fmt)
@@ -1382,6 +1397,112 @@ char *address_val(char *buf, char *end, const void *addr, const char *fmt)
}
static noinline_for_stack
+char *date_string(char *buf, char *end, const struct rtc_time *tm, bool v, bool r)
+{
+ int year = tm->tm_year + (r ? 0 : 1900);
+ int mon = tm->tm_mon + (r ? 0 : 1);
+
+ if (unlikely(v && (unsigned int)tm->tm_year > 200))
+ buf = string(buf, end, "****", default_str_spec);
+ else
+ buf = number(buf, end, year, default_dec04_spec);
+
+ if (buf < end)
+ *buf = '-';
+ buf++;
+
+ if (unlikely(v && (unsigned int)tm->tm_mon > 11))
+ buf = string(buf, end, "**", default_str_spec);
+ else
+ buf = number(buf, end, mon, default_dec02_spec);
+
+ if (buf < end)
+ *buf = '-';
+ buf++;
+
+ if (unlikely(v && (unsigned int)tm->tm_mday > 31))
+ buf = string(buf, end, "**", default_str_spec);
+ else
+ buf = number(buf, end, tm->tm_mday, default_dec02_spec);
+
+ return buf;
+}
+
+static noinline_for_stack
+char *time_string(char *buf, char *end, const struct rtc_time *tm, bool v, bool r)
+{
+ if (unlikely(v && (unsigned int)tm->tm_hour > 24))
+ buf = string(buf, end, "**", default_str_spec);
+ else
+ buf = number(buf, end, tm->tm_hour, default_dec02_spec);
+
+ if (buf < end)
+ *buf = ':';
+ buf++;
+
+ if (unlikely(v && (unsigned int)tm->tm_min > 59))
+ buf = string(buf, end, "**", default_str_spec);
+ else
+ buf = number(buf, end, tm->tm_min, default_dec02_spec);
+
+ if (buf < end)
+ *buf = ':';
+ buf++;
+
+ if (unlikely(v && (unsigned int)tm->tm_sec > 59))
+ buf = string(buf, end, "**", default_str_spec);
+ else
+ buf = number(buf, end, tm->tm_sec, default_dec02_spec);
+
+ return buf;
+}
+
+static noinline_for_stack
+char *timeanddate(char *buf, char *end, const struct rtc_time *tm, const char *fmt)
+{
+ bool have_t = true, have_d = true;
+ bool validate = false;
+ bool raw = false;
+ int count = 0;
+ bool found;
+
+ switch (fmt[++count]) {
+ case 'd':
+ have_t = false;
+ break;
+ case 't':
+ have_d = false;
+ break;
+ }
+
+ /* No %pt[dt] supplied */
+ if (have_t && have_d)
+ --count;
+
+ found = true;
+ do {
+ switch (fmt[++count]) {
+ case 'r':
+ raw = true;
+ break;
+ case 'v':
+ validate = true;
+ break;
+ default:
+ found = false;
+ break;
+ }
+ } while (found);
+
+ if (have_d)
+ buf = date_string(buf, end, tm, validate, raw);
+ if (have_t)
+ buf = time_string(buf, end, tm, validate, raw);
+
+ return buf;
+}
+
+static noinline_for_stack
char *clock(char *buf, char *end, struct clk *clk, struct printf_spec spec,
const char *fmt)
{
@@ -1550,6 +1671,7 @@ int kptr_restrict __read_mostly;
* - 'd[234]' For a dentry name (optionally 2-4 last components)
* - 'D[234]' Same as 'd' but for a struct file
* - 'g' For block_device name (gendisk + partition number)
+ * - 't[dt][rv]' For time and date as represented in struct rtc_time
* - 'C' For a clock, it prints the name (Common Clock Framework) or address
* (legacy clock framework) of the clock
* - 'Cn' For a clock, it prints the name (Common Clock Framework) or address
@@ -1702,6 +1824,8 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
return address_val(buf, end, ptr, fmt);
case 'd':
return dentry_name(buf, end, ptr, spec, fmt);
+ case 't':
+ return timeanddate(buf, end, (const struct rtc_time *)ptr, fmt);
case 'C':
return clock(buf, end, ptr, spec, fmt);
case 'D':
--
2.11.0
There are places where default specification to print decimal numbers
is in use.
Make it global and convert existing users.
Signed-off-by: Andy Shevchenko <[email protected]>
---
lib/vsprintf.c | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 031c2cc5c1c0..d43dbf6b862e 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -691,6 +691,11 @@ char *symbol_string(char *buf, char *end, void *ptr,
#endif
}
+static const struct printf_spec default_dec_spec = {
+ .base = 10,
+ .precision = -1,
+};
+
static noinline_for_stack
char *resource_string(char *buf, char *end, struct resource *res,
struct printf_spec spec, const char *fmt)
@@ -720,11 +725,6 @@ char *resource_string(char *buf, char *end, struct resource *res,
.precision = -1,
.flags = SMALL | ZEROPAD,
};
- static const struct printf_spec dec_spec = {
- .base = 10,
- .precision = -1,
- .flags = 0,
- };
static const struct printf_spec str_spec = {
.field_width = -1,
.precision = 10,
@@ -758,10 +758,10 @@ char *resource_string(char *buf, char *end, struct resource *res,
specp = &mem_spec;
} else if (res->flags & IORESOURCE_IRQ) {
p = string(p, pend, "irq ", str_spec);
- specp = &dec_spec;
+ specp = &default_dec_spec;
} else if (res->flags & IORESOURCE_DMA) {
p = string(p, pend, "dma ", str_spec);
- specp = &dec_spec;
+ specp = &default_dec_spec;
} else if (res->flags & IORESOURCE_BUS) {
p = string(p, pend, "bus ", str_spec);
specp = &bus_spec;
@@ -897,9 +897,6 @@ char *bitmap_list_string(char *buf, char *end, unsigned long *bitmap,
int cur, rbot, rtop;
bool first = true;
- /* reused to print numbers */
- spec = (struct printf_spec){ .base = 10 };
-
rbot = cur = find_first_bit(bitmap, nr_bits);
while (cur < nr_bits) {
rtop = cur;
@@ -914,13 +911,13 @@ char *bitmap_list_string(char *buf, char *end, unsigned long *bitmap,
}
first = false;
- buf = number(buf, end, rbot, spec);
+ buf = number(buf, end, rbot, default_dec_spec);
if (rbot < rtop) {
if (buf < end)
*buf = '-';
buf++;
- buf = number(buf, end, rtop, spec);
+ buf = number(buf, end, rtop, default_dec_spec);
}
rbot = cur;
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/rtc/rtc-rx6110.c | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git a/drivers/rtc/rtc-rx6110.c b/drivers/rtc/rtc-rx6110.c
index 7c9c08eab5e5..e4d352889133 100644
--- a/drivers/rtc/rtc-rx6110.c
+++ b/drivers/rtc/rtc-rx6110.c
@@ -114,9 +114,7 @@ struct rx6110_data {
*/
static int rx6110_rtc_tm_to_data(struct rtc_time *tm, u8 *data)
{
- pr_debug("%s: date %ds %dm %dh %dmd %dm %dy\n", __func__,
- tm->tm_sec, tm->tm_min, tm->tm_hour,
- tm->tm_mday, tm->tm_mon, tm->tm_year);
+ pr_debug("%s: date %ptr\n", __func__, tm);
/*
* The year in the RTC is a value between 0 and 99.
@@ -154,9 +152,7 @@ static int rx6110_data_to_rtc_tm(u8 *data, struct rtc_time *tm)
tm->tm_mon = bcd2bin(data[RTC_MONTH] & 0x1f) - 1;
tm->tm_year = bcd2bin(data[RTC_YEAR]) + 100;
- pr_debug("%s: date %ds %dm %dh %dmd %dm %dy\n", __func__,
- tm->tm_sec, tm->tm_min, tm->tm_hour,
- tm->tm_mday, tm->tm_mon, tm->tm_year);
+ pr_debug("%s: date %ptr\n", __func__, tm);
/*
* The year in the RTC is a value between 0 and 99.
@@ -248,9 +244,7 @@ static int rx6110_get_time(struct device *dev, struct rtc_time *tm)
if (ret)
return ret;
- dev_dbg(dev, "%s: date %ds %dm %dh %dmd %dm %dy\n", __func__,
- tm->tm_sec, tm->tm_min, tm->tm_hour,
- tm->tm_mday, tm->tm_mon, tm->tm_year);
+ dev_dbg(dev, "%s: date %ptr\n", __func__, tm);
return rtc_valid_tm(tm);
}
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/rtc/rtc-rk808.c | 20 ++++++--------------
1 file changed, 6 insertions(+), 14 deletions(-)
diff --git a/drivers/rtc/rtc-rk808.c b/drivers/rtc/rtc-rk808.c
index 35c9aada07c8..711dca5707cd 100644
--- a/drivers/rtc/rtc-rk808.c
+++ b/drivers/rtc/rtc-rk808.c
@@ -138,9 +138,7 @@ static int rk808_rtc_readtime(struct device *dev, struct rtc_time *tm)
tm->tm_year = (bcd2bin(rtc_data[5] & YEARS_REG_MSK)) + 100;
tm->tm_wday = bcd2bin(rtc_data[6] & WEEKS_REG_MSK);
rockchip_to_gregorian(tm);
- dev_dbg(dev, "RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
- 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday,
- tm->tm_wday, tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "RTC date/time %ptd(%d) %ptt\n", tm, tm->tm_wday, tm);
return ret;
}
@@ -153,9 +151,7 @@ static int rk808_rtc_set_time(struct device *dev, struct rtc_time *tm)
u8 rtc_data[NUM_TIME_REGS];
int ret;
- dev_dbg(dev, "set RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
- 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday,
- tm->tm_wday, tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "set RTC date/time %ptd(%d) %ptt\n", tm, tm->tm_wday, tm);
gregorian_to_rockchip(tm);
rtc_data[0] = bin2bcd(tm->tm_sec);
rtc_data[1] = bin2bcd(tm->tm_min);
@@ -216,10 +212,8 @@ static int rk808_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
return ret;
}
- dev_dbg(dev, "alrm read RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
- 1900 + alrm->time.tm_year, alrm->time.tm_mon + 1,
- alrm->time.tm_mday, alrm->time.tm_wday, alrm->time.tm_hour,
- alrm->time.tm_min, alrm->time.tm_sec);
+ dev_dbg(dev, "alrm read RTC date/time %ptd(%d) %ptt\n",
+ &alrm->time, alrm->time.tm_wday, &alrm->time);
alrm->enabled = (int_reg & BIT_RTC_INTERRUPTS_REG_IT_ALARM_M) ? 1 : 0;
@@ -261,10 +255,8 @@ static int rk808_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
dev_err(dev, "Failed to stop alarm: %d\n", ret);
return ret;
}
- dev_dbg(dev, "alrm set RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
- 1900 + alrm->time.tm_year, alrm->time.tm_mon + 1,
- alrm->time.tm_mday, alrm->time.tm_wday, alrm->time.tm_hour,
- alrm->time.tm_min, alrm->time.tm_sec);
+ dev_dbg(dev, "alrm set RTC date/time %ptd(%d) %ptt\n",
+ &alrm->time, alrm->time.tm_wday, &alrm->time);
gregorian_to_rockchip(&alrm->time);
alrm_data[0] = bin2bcd(alrm->time.tm_sec);
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/rtc/rtc-pcf50633.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/rtc/rtc-pcf50633.c b/drivers/rtc/rtc-pcf50633.c
index 00c31c91b245..5833068d602a 100644
--- a/drivers/rtc/rtc-pcf50633.c
+++ b/drivers/rtc/rtc-pcf50633.c
@@ -131,9 +131,7 @@ static int pcf50633_rtc_read_time(struct device *dev, struct rtc_time *tm)
pcf2rtc_time(tm, &pcf_tm);
- dev_dbg(dev, "RTC_TIME: %u.%u.%u %u:%u:%u\n",
- tm->tm_mday, tm->tm_mon, tm->tm_year,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "RTC_TIME: %ptr\n", tm);
return rtc_valid_tm(tm);
}
@@ -146,9 +144,7 @@ static int pcf50633_rtc_set_time(struct device *dev, struct rtc_time *tm)
rtc = dev_get_drvdata(dev);
- dev_dbg(dev, "RTC_TIME: %u.%u.%u %u:%u:%u\n",
- tm->tm_mday, tm->tm_mon, tm->tm_year,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "RTC_TIME: %ptr\n", tm);
rtc2pcf_time(&pcf_tm, tm);
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Cc: "Rafael J. Wysocki" <[email protected]>
Cc: [email protected]
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/base/power/trace.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/base/power/trace.c b/drivers/base/power/trace.c
index 1cda505d6a85..5e32a4f28a49 100644
--- a/drivers/base/power/trace.c
+++ b/drivers/base/power/trace.c
@@ -118,9 +118,7 @@ static unsigned int read_magic_time(void)
unsigned int val;
mc146818_get_time(&time);
- pr_info("RTC time: %2d:%02d:%02d, date: %02d/%02d/%02d\n",
- time.tm_hour, time.tm_min, time.tm_sec,
- time.tm_mon + 1, time.tm_mday, time.tm_year % 100);
+ pr_info("RTC time: %ptt, date: %ptd\n", &time, &time);
val = time.tm_year; /* 100 years */
if (val > 100)
val -= 100;
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Cc: Krzysztof Kozlowski <[email protected]>
Cc: Bartlomiej Zolnierkiewicz <[email protected]>
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/rtc/rtc-s5m.c | 27 ++++++---------------------
1 file changed, 6 insertions(+), 21 deletions(-)
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
index 0477678d968f..c750288ef7a4 100644
--- a/drivers/rtc/rtc-s5m.c
+++ b/drivers/rtc/rtc-s5m.c
@@ -403,9 +403,7 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
return -EINVAL;
}
- dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
- 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday);
+ dev_dbg(dev, "%s: %pt(%d)\n", __func__, tm, tm->tm_wday);
return rtc_valid_tm(tm);
}
@@ -433,9 +431,7 @@ static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm)
if (ret < 0)
return ret;
- dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
- 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday);
+ dev_dbg(dev, "%s: %pt(%d)\n", __func__, tm, tm->tm_wday);
ret = regmap_raw_write(info->regmap, info->regs->time, data,
info->regs->regs_count);
@@ -487,11 +483,7 @@ static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
return -EINVAL;
}
- dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
- 1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon,
- alrm->time.tm_mday, alrm->time.tm_hour,
- alrm->time.tm_min, alrm->time.tm_sec,
- alrm->time.tm_wday);
+ dev_dbg(dev, "%s: %pt(%d)\n", __func__, &alrm->time, alrm->time.tm_wday);
ret = s5m_check_peding_alarm_interrupt(info, alrm);
@@ -510,9 +502,7 @@ static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info)
return ret;
s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode);
- dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
- 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday,
- tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday);
+ dev_dbg(info->dev, "%s: %pt(%d)\n", __func__, &tm, tm.tm_wday);
switch (info->device_type) {
case S5M8763X:
@@ -555,9 +545,7 @@ static int s5m_rtc_start_alarm(struct s5m_rtc_info *info)
return ret;
s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode);
- dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
- 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday,
- tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday);
+ dev_dbg(info->dev, "%s: %pt(%d)\n", __func__, &tm, tm.tm_wday);
switch (info->device_type) {
case S5M8763X:
@@ -617,10 +605,7 @@ static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
return -EINVAL;
}
- dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
- 1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon,
- alrm->time.tm_mday, alrm->time.tm_hour, alrm->time.tm_min,
- alrm->time.tm_sec, alrm->time.tm_wday);
+ dev_dbg(dev, "%s: %pt(%d)\n", __func__, &alrm->time, alrm->time.tm_wday);
ret = s5m_rtc_stop_alarm(info);
if (ret < 0)
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Cc: Arnd Bergmann <[email protected]>
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/char/ds1302.c | 38 ++++++++++----------------------------
1 file changed, 10 insertions(+), 28 deletions(-)
diff --git a/drivers/char/ds1302.c b/drivers/char/ds1302.c
index c614a56e68cc..7db23a336636 100644
--- a/drivers/char/ds1302.c
+++ b/drivers/char/ds1302.c
@@ -4,7 +4,7 @@
*!
*! DESCRIPTION: Implements an interface for the DS1302 RTC
*!
-*! Functions exported: ds1302_readreg, ds1302_writereg, ds1302_init, get_rtc_status
+*! Functions exported: ds1302_readreg, ds1302_writereg, ds1302_init
*!
*! ---------------------------------------------------------------------------
*!
@@ -257,31 +257,6 @@ static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
}
}
-int
-get_rtc_status(char *buf)
-{
- char *p;
- struct rtc_time tm;
-
- p = buf;
-
- get_rtc_time(&tm);
-
- /*
- * There is no way to tell if the luser has the RTC set for local
- * time or for Universal Standard Time (GMT). Probably local though.
- */
-
- p += sprintf(p,
- "rtc_time\t: %02d:%02d:%02d\n"
- "rtc_date\t: %04d-%02d-%02d\n",
- tm.tm_hour, tm.tm_min, tm.tm_sec,
- tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
-
- return p - buf;
-}
-
-
/* The various file operations we support. */
static const struct file_operations rtc_fops = {
@@ -298,6 +273,7 @@ static int __init
ds1302_probe(void)
{
int retval, res, baur;
+ struct rtc_time tm;
baur=(boot_cpu_data.bus_clock/(2*1000*1000));
@@ -319,8 +295,14 @@ ds1302_probe(void)
char buf[100];
ds1302_wdisable();
printk("%s: RTC found.\n", ds1302_name);
- get_rtc_status(buf);
- printk(buf);
+ /*
+ * There is no way to tell if the luser has the RTC set
+ * for local time or for Universal Standard Time (GMT).
+ * Probably local though.
+ */
+ get_rtc_time(&tm);
+ printk("rtc_time\t: %ptt\n", &tm);
+ printk("rtc_date\t: %ptd\n", &tm);
retval = 1;
} else {
printk("%s: RTC not found.\n", ds1302_name);
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/rtc/rtc-rx8025.c | 19 ++++---------------
1 file changed, 4 insertions(+), 15 deletions(-)
diff --git a/drivers/rtc/rtc-rx8025.c b/drivers/rtc/rtc-rx8025.c
index 91857d8d2df8..6385b1418c94 100644
--- a/drivers/rtc/rtc-rx8025.c
+++ b/drivers/rtc/rtc-rx8025.c
@@ -193,10 +193,7 @@ static int rx8025_get_time(struct device *dev, struct rtc_time *dt)
if (err)
return err;
- dev_dbg(dev, "%s: read 0x%02x 0x%02x "
- "0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", __func__,
- date[0], date[1], date[2], date[3], date[4],
- date[5], date[6]);
+ dev_dbg(dev, "%s: read %7ph\n", __func__, date);
dt->tm_sec = bcd2bin(date[RX8025_REG_SEC] & 0x7f);
dt->tm_min = bcd2bin(date[RX8025_REG_MIN] & 0x7f);
@@ -210,9 +207,7 @@ static int rx8025_get_time(struct device *dev, struct rtc_time *dt)
dt->tm_mon = bcd2bin(date[RX8025_REG_MONTH] & 0x1f) - 1;
dt->tm_year = bcd2bin(date[RX8025_REG_YEAR]) + 100;
- dev_dbg(dev, "%s: date %ds %dm %dh %dmd %dm %dy\n", __func__,
- dt->tm_sec, dt->tm_min, dt->tm_hour,
- dt->tm_mday, dt->tm_mon, dt->tm_year);
+ dev_dbg(dev, "%s: date %ptr\n", __func__, dt);
return rtc_valid_tm(dt);
}
@@ -243,10 +238,7 @@ static int rx8025_set_time(struct device *dev, struct rtc_time *dt)
date[RX8025_REG_MONTH] = bin2bcd(dt->tm_mon + 1);
date[RX8025_REG_YEAR] = bin2bcd(dt->tm_year - 100);
- dev_dbg(dev,
- "%s: write 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",
- __func__,
- date[0], date[1], date[2], date[3], date[4], date[5], date[6]);
+ dev_dbg(dev, "%s: write %7ph\n", __func__, date);
ret = rx8025_write_regs(rx8025->client, RX8025_REG_SEC, 7, date);
if (ret < 0)
@@ -319,10 +311,7 @@ static int rx8025_read_alarm(struct device *dev, struct rtc_wkalrm *t)
t->time.tm_hour = bcd2bin(ald[1] & 0x1f) % 12
+ (ald[1] & 0x20 ? 12 : 0);
- dev_dbg(dev, "%s: date: %ds %dm %dh %dmd %dm %dy\n",
- __func__,
- t->time.tm_sec, t->time.tm_min, t->time.tm_hour,
- t->time.tm_mday, t->time.tm_mon, t->time.tm_year);
+ dev_dbg(dev, "%s: date: %ptr\n", __func__, t);
t->enabled = !!(rx8025->ctrl1 & RX8025_BIT_CTRL1_DALE);
t->pending = (ctrl2 & RX8025_BIT_CTRL2_DAFG) && t->enabled;
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Cc: Dmitry Torokhov <[email protected]>
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/input/misc/hp_sdc_rtc.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/drivers/input/misc/hp_sdc_rtc.c b/drivers/input/misc/hp_sdc_rtc.c
index 1c8c56efc995..9a6afc3a4775 100644
--- a/drivers/input/misc/hp_sdc_rtc.c
+++ b/drivers/input/misc/hp_sdc_rtc.c
@@ -441,12 +441,10 @@ static int hp_sdc_rtc_proc_show(struct seq_file *m, void *v)
seq_puts(m, "BBRTC\t\t: READ FAILED!\n");
} else {
seq_printf(m,
- "rtc_time\t: %02d:%02d:%02d\n"
- "rtc_date\t: %04d-%02d-%02d\n"
+ "rtc_time\t: %ptt\n"
+ "rtc_date\t: %ptd\n"
"rtc_epoch\t: %04lu\n",
- tm.tm_hour, tm.tm_min, tm.tm_sec,
- tm.tm_year + 1900, tm.tm_mon + 1,
- tm.tm_mday, epoch);
+ &tm, &tm, epoch);
}
if (hp_sdc_rtc_read_rt(&tv)) {
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/rtc/rtc-pm8xxx.c | 16 +++++-----------
1 file changed, 5 insertions(+), 11 deletions(-)
diff --git a/drivers/rtc/rtc-pm8xxx.c b/drivers/rtc/rtc-pm8xxx.c
index fac835530671..370d10d589b8 100644
--- a/drivers/rtc/rtc-pm8xxx.c
+++ b/drivers/rtc/rtc-pm8xxx.c
@@ -196,9 +196,7 @@ static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm)
return rc;
}
- dev_dbg(dev, "secs = %lu, h:m:s == %d:%d:%d, d/m/y = %d/%d/%d\n",
- secs, tm->tm_hour, tm->tm_min, tm->tm_sec,
- tm->tm_mday, tm->tm_mon, tm->tm_year);
+ dev_dbg(dev, "secs = %lu, h:m:s == %ptt, y-m-d = %ptdr\n", secs, tm, tm);
return 0;
}
@@ -243,10 +241,8 @@ static int pm8xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
goto rtc_rw_fail;
}
- dev_dbg(dev, "Alarm Set for h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n",
- alarm->time.tm_hour, alarm->time.tm_min,
- alarm->time.tm_sec, alarm->time.tm_mday,
- alarm->time.tm_mon, alarm->time.tm_year);
+ dev_dbg(dev, "Alarm Set for h:m:s=%ptt, y-m-d=%ptdr\n",
+ &alarm->time, &alarm->time);
rtc_rw_fail:
spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags);
return rc;
@@ -277,10 +273,8 @@ static int pm8xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
return rc;
}
- dev_dbg(dev, "Alarm set for - h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n",
- alarm->time.tm_hour, alarm->time.tm_min,
- alarm->time.tm_sec, alarm->time.tm_mday,
- alarm->time.tm_mon, alarm->time.tm_year);
+ dev_dbg(dev, "Alarm set for - h:m:s=%ptt, y-m-d=%ptdr\n",
+ &alarm->time, &alarm->time);
return 0;
}
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/rtc/rtc-at91rm9200.c | 16 ++++------------
1 file changed, 4 insertions(+), 12 deletions(-)
diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c
index b60fd477778f..6e29c25b34ce 100644
--- a/drivers/rtc/rtc-at91rm9200.c
+++ b/drivers/rtc/rtc-at91rm9200.c
@@ -151,9 +151,7 @@ static int at91_rtc_readtime(struct device *dev, struct rtc_time *tm)
tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year);
tm->tm_year = tm->tm_year - 1900;
- dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__,
- 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "%s(): %pt\n", __func__, tm);
return 0;
}
@@ -165,9 +163,7 @@ static int at91_rtc_settime(struct device *dev, struct rtc_time *tm)
{
unsigned long cr;
- dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__,
- 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "%s(): %pt\n", __func__, tm);
wait_for_completion(&at91_rtc_upd_rdy);
@@ -214,9 +210,7 @@ static int at91_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
alrm->enabled = (at91_rtc_read_imr() & AT91_RTC_ALARM)
? 1 : 0;
- dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__,
- 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "%s(): %pt\n", __func__, tm);
return 0;
}
@@ -254,9 +248,7 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
at91_rtc_write_ier(AT91_RTC_ALARM);
}
- dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__,
- at91_alarm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour,
- tm.tm_min, tm.tm_sec);
+ dev_dbg(dev, "%s(): %pt\n", __func__, &tm);
return 0;
}
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Cc: Thierry Reding <[email protected]>
Cc: Jonathan Hunter <[email protected]>
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/rtc/rtc-tegra.c | 30 +++---------------------------
1 file changed, 3 insertions(+), 27 deletions(-)
diff --git a/drivers/rtc/rtc-tegra.c b/drivers/rtc/rtc-tegra.c
index d30d57b048d3..cd0c60f1e1fb 100644
--- a/drivers/rtc/rtc-tegra.c
+++ b/drivers/rtc/rtc-tegra.c
@@ -124,15 +124,7 @@ static int tegra_rtc_read_time(struct device *dev, struct rtc_time *tm)
rtc_time_to_tm(sec, tm);
- dev_vdbg(dev, "time read as %lu. %d/%d/%d %d:%02u:%02u\n",
- sec,
- tm->tm_mon + 1,
- tm->tm_mday,
- tm->tm_year + 1900,
- tm->tm_hour,
- tm->tm_min,
- tm->tm_sec
- );
+ dev_vdbg(dev, "time read as %lu. %pt\n", sec, tm);
return 0;
}
@@ -150,15 +142,7 @@ static int tegra_rtc_set_time(struct device *dev, struct rtc_time *tm)
rtc_tm_to_time(tm, &sec);
- dev_vdbg(dev, "time set to %lu. %d/%d/%d %d:%02u:%02u\n",
- sec,
- tm->tm_mon+1,
- tm->tm_mday,
- tm->tm_year+1900,
- tm->tm_hour,
- tm->tm_min,
- tm->tm_sec
- );
+ dev_vdbg(dev, "time set to %lu. %pt\n", sec, tm);
/* seconds only written if wait succeeded. */
ret = tegra_rtc_wait_while_busy(dev);
@@ -234,16 +218,8 @@ static int tegra_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
/* if successfully written and alarm is enabled ... */
if (sec) {
+ dev_vdbg(dev, "alarm set as %lu. %pt\n", sec, &alarm->time);
tegra_rtc_alarm_irq_enable(dev, 1);
-
- dev_vdbg(dev, "alarm set as %lu. %d/%d/%d %d:%02u:%02u\n",
- sec,
- alarm->time.tm_mon+1,
- alarm->time.tm_mday,
- alarm->time.tm_year+1900,
- alarm->time.tm_hour,
- alarm->time.tm_min,
- alarm->time.tm_sec);
} else {
/* disable alarm if 0 or write error. */
dev_vdbg(dev, "alarm disabled\n");
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/rtc/rtc-s3c.c | 21 +++++----------------
1 file changed, 5 insertions(+), 16 deletions(-)
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c
index d44fb34df8fe..4fa734f7e184 100644
--- a/drivers/rtc/rtc-s3c.c
+++ b/drivers/rtc/rtc-s3c.c
@@ -197,13 +197,10 @@ static int s3c_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
s3c_rtc_disable_clk(info);
rtc_tm->tm_year += 100;
-
- dev_dbg(dev, "read time %04d.%02d.%02d %02d:%02d:%02d\n",
- 1900 + rtc_tm->tm_year, rtc_tm->tm_mon, rtc_tm->tm_mday,
- rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec);
-
rtc_tm->tm_mon -= 1;
+ dev_dbg(dev, "read time %pt\n", rtc_tm);
+
return rtc_valid_tm(rtc_tm);
}
@@ -212,9 +209,7 @@ static int s3c_rtc_settime(struct device *dev, struct rtc_time *tm)
struct s3c_rtc *info = dev_get_drvdata(dev);
int year = tm->tm_year - 100;
- dev_dbg(dev, "set time %04d.%02d.%02d %02d:%02d:%02d\n",
- 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "set time %pt\n", tm);
/* we get around y2k by simply not supporting it */
@@ -258,10 +253,7 @@ static int s3c_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm)
alrm->enabled = (alm_en & S3C2410_RTCALM_ALMEN) ? 1 : 0;
- dev_dbg(dev, "read alarm %d, %04d.%02d.%02d %02d:%02d:%02d\n",
- alm_en,
- 1900 + alm_tm->tm_year, alm_tm->tm_mon, alm_tm->tm_mday,
- alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec);
+ dev_dbg(dev, "read alarm %d, %pt\n", alm_en, alm_tm);
/* decode the alarm enable field */
if (alm_en & S3C2410_RTCALM_SECEN)
@@ -294,10 +286,7 @@ static int s3c_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
unsigned int alrm_en;
int year = tm->tm_year - 100;
- dev_dbg(dev, "s3c_rtc_setalarm: %d, %04d.%02d.%02d %02d:%02d:%02d\n",
- alrm->enabled,
- 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "s3c_rtc_setalarm: %d, %pt\n", alrm->enabled, tm);
s3c_rtc_enable_clk(info);
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Cc: Geert Uytterhoeven <[email protected]>
Signed-off-by: Andy Shevchenko <[email protected]>
---
arch/m68k/mac/misc.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/arch/m68k/mac/misc.c b/arch/m68k/mac/misc.c
index 8aa8792e3174..beb23a5000a1 100644
--- a/arch/m68k/mac/misc.c
+++ b/arch/m68k/mac/misc.c
@@ -660,13 +660,9 @@ int mac_hwclk(int op, struct rtc_time *t)
unmktime(now, 0,
&t->tm_year, &t->tm_mon, &t->tm_mday,
&t->tm_hour, &t->tm_min, &t->tm_sec);
- pr_debug("%s: read %04d-%02d-%-2d %02d:%02d:%02d\n",
- __func__, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
- t->tm_hour, t->tm_min, t->tm_sec);
+ pr_debug("%s: read %pt\n", __func__, t);
} else { /* write */
- pr_debug("%s: tried to write %04d-%02d-%-2d %02d:%02d:%02d\n",
- __func__, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
- t->tm_hour, t->tm_min, t->tm_sec);
+ pr_debug("%s: tried to write %pt\n", __func__, t);
now = mktime(t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
t->tm_hour, t->tm_min, t->tm_sec);
--
2.11.0
There is at least one new user is coming where default specification to print
strings is in use.
Make it global.
Signed-off-by: Andy Shevchenko <[email protected]>
---
lib/vsprintf.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index d43dbf6b862e..001303612b55 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -691,6 +691,11 @@ char *symbol_string(char *buf, char *end, void *ptr,
#endif
}
+static const struct printf_spec default_str_spec = {
+ .field_width = -1,
+ .precision = -1,
+};
+
static const struct printf_spec default_dec_spec = {
.base = 10,
.precision = -1,
@@ -1399,10 +1404,6 @@ char *format_flags(char *buf, char *end, unsigned long flags,
const struct trace_print_flags *names)
{
unsigned long mask;
- const struct printf_spec strspec = {
- .field_width = -1,
- .precision = -1,
- };
const struct printf_spec numspec = {
.flags = SPECIAL|SMALL,
.field_width = -1,
@@ -1415,7 +1416,7 @@ char *format_flags(char *buf, char *end, unsigned long flags,
if ((flags & mask) != mask)
continue;
- buf = string(buf, end, names->name, strspec);
+ buf = string(buf, end, names->name, default_str_spec);
flags &= ~mask;
if (flags) {
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/rtc/rtc-pic32.c | 18 ++++--------------
1 file changed, 4 insertions(+), 14 deletions(-)
diff --git a/drivers/rtc/rtc-pic32.c b/drivers/rtc/rtc-pic32.c
index 5cfb6df5c430..f82843774aad 100644
--- a/drivers/rtc/rtc-pic32.c
+++ b/drivers/rtc/rtc-pic32.c
@@ -170,9 +170,7 @@ static int pic32_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
rtc_tm->tm_year += 100;
- dev_dbg(dev, "read time %04d.%02d.%02d %02d:%02d:%02d\n",
- 1900 + rtc_tm->tm_year, rtc_tm->tm_mon, rtc_tm->tm_mday,
- rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec);
+ dev_dbg(dev, "read time %pt\n", rtc_tm);
clk_disable(pdata->clk);
return rtc_valid_tm(rtc_tm);
@@ -184,9 +182,7 @@ static int pic32_rtc_settime(struct device *dev, struct rtc_time *tm)
void __iomem *base = pdata->reg_base;
int year = tm->tm_year - 100;
- dev_dbg(dev, "set time %04d.%02d.%02d %02d:%02d:%02d\n",
- 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "set time %pt\n", tm);
if (year < 0 || year >= 100) {
dev_err(dev, "rtc only supports 100 years\n");
@@ -224,10 +220,7 @@ static int pic32_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm)
alrm->enabled = (alm_en & PIC32_RTCALRM_ALRMEN) ? 1 : 0;
- dev_dbg(dev, "getalarm: %d, %04d.%02d.%02d %02d:%02d:%02d\n",
- alm_en,
- 1900 + alm_tm->tm_year, alm_tm->tm_mon, alm_tm->tm_mday,
- alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec);
+ dev_dbg(dev, "getalarm: %d, %pt\n", alm_en, alm_tm);
alm_tm->tm_sec = bcd2bin(alm_tm->tm_sec);
alm_tm->tm_min = bcd2bin(alm_tm->tm_min);
@@ -247,10 +240,7 @@ static int pic32_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
void __iomem *base = pdata->reg_base;
clk_enable(pdata->clk);
- dev_dbg(dev, "setalarm: %d, %04d.%02d.%02d %02d:%02d:%02d\n",
- alrm->enabled,
- 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "setalarm: %d, %pt\n", alrm->enabled, tm);
writel(0x00, base + PIC32_ALRMTIME);
writel(0x00, base + PIC32_ALRMDATE);
--
2.11.0
The pointer can't be NULL since it's first what has been done in the
pointer().
Remove useless checks.
Note when we print clock name or rate it is safe in case !CONFIG_HAVE_CLK.
Signed-off-by: Andy Shevchenko <[email protected]>
---
lib/vsprintf.c | 11 -----------
1 file changed, 11 deletions(-)
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 9f16406288c0..031c2cc5c1c0 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -811,10 +811,6 @@ char *hex_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
/* nothing to print */
return buf;
- if (ZERO_OR_NULL_PTR(addr))
- /* NULL pointer */
- return string(buf, end, NULL, spec);
-
switch (fmt[1]) {
case 'C':
separator = ':';
@@ -1253,10 +1249,6 @@ char *escaped_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
if (spec.field_width == 0)
return buf; /* nothing to print */
- if (ZERO_OR_NULL_PTR(addr))
- return string(buf, end, NULL, spec); /* NULL pointer */
-
-
do {
switch (fmt[count++]) {
case 'a':
@@ -1391,9 +1383,6 @@ static noinline_for_stack
char *clock(char *buf, char *end, struct clk *clk, struct printf_spec spec,
const char *fmt)
{
- if (!IS_ENABLED(CONFIG_HAVE_CLK) || !clk)
- return string(buf, end, NULL, spec);
-
switch (fmt[1]) {
case 'r':
return number(buf, end, clk_get_rate(clk), spec);
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/rtc/rtc-mcp795.c | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)
diff --git a/drivers/rtc/rtc-mcp795.c b/drivers/rtc/rtc-mcp795.c
index 77f21331ae21..a04a3190ac04 100644
--- a/drivers/rtc/rtc-mcp795.c
+++ b/drivers/rtc/rtc-mcp795.c
@@ -233,9 +233,7 @@ static int mcp795_set_time(struct device *dev, struct rtc_time *tim)
if (ret)
return ret;
- dev_dbg(dev, "Set mcp795: %04d-%02d-%02d(%d) %02d:%02d:%02d\n",
- tim->tm_year + 1900, tim->tm_mon, tim->tm_mday,
- tim->tm_wday, tim->tm_hour, tim->tm_min, tim->tm_sec);
+ dev_dbg(dev, "Set mcp795: %pt\n", tim);
return 0;
}
@@ -258,9 +256,7 @@ static int mcp795_read_time(struct device *dev, struct rtc_time *tim)
tim->tm_mon = bcd2bin(data[5] & 0x1F) - 1;
tim->tm_year = bcd2bin(data[6]) + 100; /* Assume we are in 20xx */
- dev_dbg(dev, "Read from mcp795: %04d-%02d-%02d(%d) %02d:%02d:%02d\n",
- tim->tm_year + 1900, tim->tm_mon, tim->tm_mday,
- tim->tm_wday, tim->tm_hour, tim->tm_min, tim->tm_sec);
+ dev_dbg(dev, "Read from mcp795: %pt\n", tim);
return rtc_valid_tm(tim);
}
@@ -319,9 +315,8 @@ static int mcp795_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
return ret;
dev_dbg(dev, "Alarm IRQ armed\n");
}
- dev_dbg(dev, "Set alarm: %02d-%02d(%d) %02d:%02d:%02d\n",
- alm->time.tm_mon, alm->time.tm_mday, alm->time.tm_wday,
- alm->time.tm_hour, alm->time.tm_min, alm->time.tm_sec);
+ dev_dbg(dev, "Set alarm: %ptdr(%d) %ptt\n",
+ &alm->time, alm->time.tm_wday, &alm->time);
return 0;
}
@@ -345,9 +340,8 @@ static int mcp795_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
alm->time.tm_isdst = -1;
alm->time.tm_yday = -1;
- dev_dbg(dev, "Read alarm: %02d-%02d(%d) %02d:%02d:%02d\n",
- alm->time.tm_mon, alm->time.tm_mday, alm->time.tm_wday,
- alm->time.tm_hour, alm->time.tm_min, alm->time.tm_sec);
+ dev_dbg(dev, "Read alarm: %ptdr(%d) %ptt\n",
+ &alm->time, alm->time.tm_wday, &alm->time);
return 0;
}
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Guan Xuetao <[email protected]>
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/rtc/rtc-puv3.c | 18 ++++--------------
1 file changed, 4 insertions(+), 14 deletions(-)
diff --git a/drivers/rtc/rtc-puv3.c b/drivers/rtc/rtc-puv3.c
index c0a6e638c672..2b7bac8892f8 100644
--- a/drivers/rtc/rtc-puv3.c
+++ b/drivers/rtc/rtc-puv3.c
@@ -90,9 +90,7 @@ static int puv3_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
{
rtc_time_to_tm(readl(RTC_RCNR), rtc_tm);
- dev_dbg(dev, "read time %02x.%02x.%02x %02x/%02x/%02x\n",
- rtc_tm->tm_year, rtc_tm->tm_mon, rtc_tm->tm_mday,
- rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec);
+ dev_dbg(dev, "read time %ptr\n", rtc_tm);
return 0;
}
@@ -101,9 +99,7 @@ static int puv3_rtc_settime(struct device *dev, struct rtc_time *tm)
{
unsigned long rtc_count = 0;
- dev_dbg(dev, "set time %02d.%02d.%02d %02d/%02d/%02d\n",
- tm->tm_year, tm->tm_mon, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "set time %ptr\n", tm);
rtc_tm_to_time(tm, &rtc_count);
writel(rtc_count, RTC_RCNR);
@@ -119,10 +115,7 @@ static int puv3_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm)
alrm->enabled = readl(RTC_RTSR) & RTC_RTSR_ALE;
- dev_dbg(dev, "read alarm %02x %02x.%02x.%02x %02x/%02x/%02x\n",
- alrm->enabled,
- alm_tm->tm_year, alm_tm->tm_mon, alm_tm->tm_mday,
- alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec);
+ dev_dbg(dev, "read alarm: %d, %ptr\n", alrm->enabled, alm_tm);
return 0;
}
@@ -132,10 +125,7 @@ static int puv3_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
struct rtc_time *tm = &alrm->time;
unsigned long rtcalarm_count = 0;
- dev_dbg(dev, "puv3_rtc_setalarm: %d, %02x/%02x/%02x %02x.%02x.%02x\n",
- alrm->enabled,
- tm->tm_mday & 0xff, tm->tm_mon & 0xff, tm->tm_year & 0xff,
- tm->tm_hour & 0xff, tm->tm_min & 0xff, tm->tm_sec);
+ dev_dbg(dev, "set alarm: %d, %ptr\n", alrm->enabled, tm);
rtc_tm_to_time(tm, &rtcalarm_count);
writel(rtcalarm_count, RTC_RTAR);
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Arnd Bergmann <[email protected]>
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/char/rtc.c | 7 +++----
drivers/rtc/hctosys.c | 8 ++------
drivers/rtc/interface.c | 8 ++------
drivers/rtc/rtc-proc.c | 36 +++++-------------------------------
drivers/rtc/rtc-sysfs.c | 12 ++++--------
5 files changed, 16 insertions(+), 55 deletions(-)
diff --git a/drivers/char/rtc.c b/drivers/char/rtc.c
index 974d48927b07..a2d664d4d011 100644
--- a/drivers/char/rtc.c
+++ b/drivers/char/rtc.c
@@ -1231,11 +1231,10 @@ static int rtc_proc_show(struct seq_file *seq, void *v)
* time or for Universal Standard Time (GMT). Probably local though.
*/
seq_printf(seq,
- "rtc_time\t: %02d:%02d:%02d\n"
- "rtc_date\t: %04d-%02d-%02d\n"
+ "rtc_time\t: %ptt\n"
+ "rtc_date\t: %ptd\n"
"rtc_epoch\t: %04lu\n",
- tm.tm_hour, tm.tm_min, tm.tm_sec,
- tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, epoch);
+ &tm, &tm, epoch);
get_rtc_alm_time(&tm);
diff --git a/drivers/rtc/hctosys.c b/drivers/rtc/hctosys.c
index e1cfa06810ef..846b2b5e6434 100644
--- a/drivers/rtc/hctosys.c
+++ b/drivers/rtc/hctosys.c
@@ -51,12 +51,8 @@ static int __init rtc_hctosys(void)
err = do_settimeofday64(&tv64);
- dev_info(rtc->dev.parent,
- "setting system clock to "
- "%d-%02d-%02d %02d:%02d:%02d UTC (%lld)\n",
- tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
- tm.tm_hour, tm.tm_min, tm.tm_sec,
- (long long) tv64.tv_sec);
+ dev_info(rtc->dev.parent, "setting system clock to %pt UTC (%lld)\n",
+ &tm, (long long)tv64.tv_sec);
err_read:
rtc_class_close(rtc);
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index 8cec9a02c0b8..5735d4c901ec 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -288,12 +288,8 @@ int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
err = rtc_valid_tm(&alarm->time);
done:
- if (err) {
- dev_warn(&rtc->dev, "invalid alarm value: %d-%d-%d %d:%d:%d\n",
- alarm->time.tm_year + 1900, alarm->time.tm_mon + 1,
- alarm->time.tm_mday, alarm->time.tm_hour, alarm->time.tm_min,
- alarm->time.tm_sec);
- }
+ if (err)
+ dev_warn(&rtc->dev, "invalid alarm value: %pt\n", &alarm->time);
return err;
}
diff --git a/drivers/rtc/rtc-proc.c b/drivers/rtc/rtc-proc.c
index 31e7e23cc5be..a9769e4fb497 100644
--- a/drivers/rtc/rtc-proc.c
+++ b/drivers/rtc/rtc-proc.c
@@ -50,41 +50,15 @@ static int rtc_proc_show(struct seq_file *seq, void *offset)
err = rtc_read_time(rtc, &tm);
if (err == 0) {
seq_printf(seq,
- "rtc_time\t: %02d:%02d:%02d\n"
- "rtc_date\t: %04d-%02d-%02d\n",
- tm.tm_hour, tm.tm_min, tm.tm_sec,
- tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
+ "rtc_time\t: %ptt\n"
+ "rtc_date\t: %ptd\n",
+ &tm, &tm);
}
err = rtc_read_alarm(rtc, &alrm);
if (err == 0) {
- seq_printf(seq, "alrm_time\t: ");
- if ((unsigned int)alrm.time.tm_hour <= 24)
- seq_printf(seq, "%02d:", alrm.time.tm_hour);
- else
- seq_printf(seq, "**:");
- if ((unsigned int)alrm.time.tm_min <= 59)
- seq_printf(seq, "%02d:", alrm.time.tm_min);
- else
- seq_printf(seq, "**:");
- if ((unsigned int)alrm.time.tm_sec <= 59)
- seq_printf(seq, "%02d\n", alrm.time.tm_sec);
- else
- seq_printf(seq, "**\n");
-
- seq_printf(seq, "alrm_date\t: ");
- if ((unsigned int)alrm.time.tm_year <= 200)
- seq_printf(seq, "%04d-", alrm.time.tm_year + 1900);
- else
- seq_printf(seq, "****-");
- if ((unsigned int)alrm.time.tm_mon <= 11)
- seq_printf(seq, "%02d-", alrm.time.tm_mon + 1);
- else
- seq_printf(seq, "**-");
- if (alrm.time.tm_mday && (unsigned int)alrm.time.tm_mday <= 31)
- seq_printf(seq, "%02d\n", alrm.time.tm_mday);
- else
- seq_printf(seq, "**\n");
+ seq_printf(seq, "alrm_time\t: %pttv\n", &alrm.time);
+ seq_printf(seq, "alrm_date\t: %ptdv\n", &alrm.time);
seq_printf(seq, "alarm_IRQ\t: %s\n",
alrm.enabled ? "yes" : "no");
seq_printf(seq, "alrm_pending\t: %s\n",
diff --git a/drivers/rtc/rtc-sysfs.c b/drivers/rtc/rtc-sysfs.c
index e364550eb9a7..145c2c3fa988 100644
--- a/drivers/rtc/rtc-sysfs.c
+++ b/drivers/rtc/rtc-sysfs.c
@@ -39,10 +39,8 @@ date_show(struct device *dev, struct device_attribute *attr, char *buf)
struct rtc_time tm;
retval = rtc_read_time(to_rtc_device(dev), &tm);
- if (retval == 0) {
- retval = sprintf(buf, "%04d-%02d-%02d\n",
- tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
- }
+ if (retval == 0)
+ retval = sprintf(buf, "%ptd\n", &tm);
return retval;
}
@@ -55,10 +53,8 @@ time_show(struct device *dev, struct device_attribute *attr, char *buf)
struct rtc_time tm;
retval = rtc_read_time(to_rtc_device(dev), &tm);
- if (retval == 0) {
- retval = sprintf(buf, "%02d:%02d:%02d\n",
- tm.tm_hour, tm.tm_min, tm.tm_sec);
- }
+ if (retval == 0)
+ retval = sprintf(buf, "%ptt\n", &tm);
return retval;
}
--
2.11.0
On Thu, Jun 08, 2017 at 04:47:52PM +0300, Andy Shevchenko wrote:
> Use %pt instead of open coded variant to print content of
> struct rtc_time in human readable format.
>
> Arnd Bergmann <[email protected]>
Cc: ?
> Signed-off-by: Andy Shevchenko <[email protected]>
Acked-by: Greg Kroah-Hartman <[email protected]>
On Thu, Jun 08, 2017 at 04:47:51PM +0300, Andy Shevchenko wrote:
> Use %pt instead of open coded variant to print content of
> struct rtc_time in human readable format.
>
> Cc: Arnd Bergmann <[email protected]>
> Signed-off-by: Andy Shevchenko <[email protected]>
Acked-by: Greg Kroah-Hartman <[email protected]>
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/rtc/rtc-m41t80.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/drivers/rtc/rtc-m41t80.c b/drivers/rtc/rtc-m41t80.c
index 8940e9e43ea0..155d23a874ff 100644
--- a/drivers/rtc/rtc-m41t80.c
+++ b/drivers/rtc/rtc-m41t80.c
@@ -978,11 +978,7 @@ static int m41t80_probe(struct i2c_client *client,
if (m41t80_data->features & M41T80_FEATURE_HT) {
m41t80_get_datetime(client, &tm);
dev_info(&client->dev, "HT bit was set!\n");
- dev_info(&client->dev,
- "Power Down at %04i-%02i-%02i %02i:%02i:%02i\n",
- tm.tm_year + 1900,
- tm.tm_mon + 1, tm.tm_mday, tm.tm_hour,
- tm.tm_min, tm.tm_sec);
+ dev_info(&client->dev, "Power Down at %pt\n", &tm);
}
rc = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_HOUR,
rc & ~M41T80_ALHOUR_HT);
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/rtc/rtc-at91sam9.c | 16 ++++------------
1 file changed, 4 insertions(+), 12 deletions(-)
diff --git a/drivers/rtc/rtc-at91sam9.c b/drivers/rtc/rtc-at91sam9.c
index 7418a763ce52..d8b6c31942fe 100644
--- a/drivers/rtc/rtc-at91sam9.c
+++ b/drivers/rtc/rtc-at91sam9.c
@@ -124,9 +124,7 @@ static int at91_rtc_readtime(struct device *dev, struct rtc_time *tm)
rtc_time_to_tm(offset + secs, tm);
- dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "readtime",
- 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "%s: %pt\n", __func__, tm);
return 0;
}
@@ -141,9 +139,7 @@ static int at91_rtc_settime(struct device *dev, struct rtc_time *tm)
u32 offset, alarm, mr;
unsigned long secs;
- dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "settime",
- 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "%s: %pt\n", __func__, tm);
err = rtc_tm_to_time(tm, &secs);
if (err != 0)
@@ -199,9 +195,7 @@ static int at91_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
if (alarm != ALARM_DISABLED && offset != 0) {
rtc_time_to_tm(offset + alarm, tm);
- dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "readalarm",
- 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "%s: %pt\n", __func__, tm);
if (rtt_readl(rtc, MR) & AT91_RTT_ALMIEN)
alrm->enabled = 1;
@@ -242,9 +236,7 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
if (alrm->enabled)
rtt_writel(rtc, MR, mr | AT91_RTT_ALMIEN);
- dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "setalarm",
- tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour,
- tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "%s: %pt\n", __func__, tm);
return 0;
}
--
2.11.0
Use %pt instead of open coded variant to print content of
struct rtc_time in human readable format.
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/rtc/rtc-m48t59.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/rtc/rtc-m48t59.c b/drivers/rtc/rtc-m48t59.c
index d99a705bec07..1583584becb8 100644
--- a/drivers/rtc/rtc-m48t59.c
+++ b/drivers/rtc/rtc-m48t59.c
@@ -102,9 +102,7 @@ static int m48t59_rtc_read_time(struct device *dev, struct rtc_time *tm)
M48T59_CLEAR_BITS(M48T59_CNTL_READ, M48T59_CNTL);
spin_unlock_irqrestore(&m48t59->lock, flags);
- dev_dbg(dev, "RTC read time %04d-%02d-%02d %02d/%02d/%02d\n",
- tm->tm_year + 1900, tm->tm_mon, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "RTC read time %pt\n", tm);
return rtc_valid_tm(tm);
}
@@ -193,9 +191,7 @@ static int m48t59_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
M48T59_CLEAR_BITS(M48T59_CNTL_READ, M48T59_CNTL);
spin_unlock_irqrestore(&m48t59->lock, flags);
- dev_dbg(dev, "RTC read alarm time %04d-%02d-%02d %02d/%02d/%02d\n",
- tm->tm_year + 1900, tm->tm_mon, tm->tm_mday,
- tm->tm_hour, tm->tm_min, tm->tm_sec);
+ dev_dbg(dev, "RTC read alarm time %pt\n", tm);
return rtc_valid_tm(tm);
}
--
2.11.0
On Thu, Jun 8, 2017 at 3:47 PM, Andy Shevchenko
<[email protected]> wrote:
> There are users which print time and date represented by content of
> struct rtc_time in human readable format.
>
> Instead of open coding that each time introduce %pt[dt][rv] specifier.
I really like the idea, and the implementation seems fine for this use case, but
before we reserve %pt for rtc_time, could we discuss whether we want
that for printing struct tm, struct timespec64, time64_t or ktime_t instead?
I can see good reasons for pretty-printing any of them, but the namespace for
format strings is rather limited.
struct rtc_time is almost the same as struct tm (the former has one extra
member), so maybe we can actually define them to be the same and
use one format string for both?
Arnd
On Thu, 2017-06-08 at 16:47 +0300, Andy Shevchenko wrote:
> Recently I have noticed too many users of struct rtc_time that printing
> its content field by field.
>
> In this series I introduce %pt[dt][rv] specifier to make life a bit
> easier.
>
> There are still users of detailed output of the struct rtc_time, but we
> can introduce an additional extension for them in the future if needed,
> otherwise they might be converted to the proposed output format.
>
> Some of the changes slightly modify the output. In those cases we are on
> the safe side since they are pure debug. Nevertheless I tried to leave
> numbers to be the same or quite close: in some cases year is printed +
> 1900, though month is left in the range [0,11] instead of [1,12].
>
> I didn't compile everything there, though I did a basic smoke test on
> some x86 hardware. So, I rely on kbuild test robot as well :-)
>
> Most of the users currently are RTC drivers, thus the patch series is
> assumed to go via RTC tree.
What I wonder about this series is how much
larger it makes a typical kernel and how
often multiple rtc clocks are built for a
single kernel?
What is the size impact on an embedded kernel
that uses a single rtc driver?
trivia:
Aren't there also uses of struct tm that are
nearly identical?
e.g.: drivers/usb/host/xhci-tegra.c
On Thu, Jun 8, 2017 at 5:49 PM, Arnd Bergmann <[email protected]> wrote:
> On Thu, Jun 8, 2017 at 3:47 PM, Andy Shevchenko
> <[email protected]> wrote:
>> There are users which print time and date represented by content of
>> struct rtc_time in human readable format.
>>
>> Instead of open coding that each time introduce %pt[dt][rv] specifier.
>
> I really like the idea, and the implementation seems fine for this use case, but
> before we reserve %pt for rtc_time, could we discuss whether we want
> that for printing struct tm, struct timespec64, time64_t or ktime_t instead?
How many users? For struct tm it's somelike 4 (which want to print its content).
> I can see good reasons for pretty-printing any of them, but the namespace for
> format strings is rather limited.
>
> struct rtc_time is almost the same as struct tm (the former has one extra
> member), so maybe we can actually define them to be the same and
> use one format string for both?
The reason I decide to drop struct tm for now due to they are not
compatible and I have got an interesting bugs.
Verify tm_year member carefully.
--
With Best Regards,
Andy Shevchenko
On Thu, Jun 8, 2017 at 5:52 PM, Joe Perches <[email protected]> wrote:
> On Thu, 2017-06-08 at 16:47 +0300, Andy Shevchenko wrote:
>> Recently I have noticed too many users of struct rtc_time that printing
>> its content field by field.
>>
>> In this series I introduce %pt[dt][rv] specifier to make life a bit
>> easier.
>>
>> There are still users of detailed output of the struct rtc_time, but we
>> can introduce an additional extension for them in the future if needed,
>> otherwise they might be converted to the proposed output format.
>>
>> Some of the changes slightly modify the output. In those cases we are on
>> the safe side since they are pure debug. Nevertheless I tried to leave
>> numbers to be the same or quite close: in some cases year is printed +
>> 1900, though month is left in the range [0,11] instead of [1,12].
>>
>> I didn't compile everything there, though I did a basic smoke test on
>> some x86 hardware. So, I rely on kbuild test robot as well :-)
>>
>> Most of the users currently are RTC drivers, thus the patch series is
>> assumed to go via RTC tree.
>
> What I wonder about this series is how much
> larger it makes a typical kernel and how
> often multiple rtc clocks are built for a
> single kernel?
We may hide it under CONFIG_RTC_??? if we want to reduce kernel for
non RTC cases.
> What is the size impact on an embedded kernel
> that uses a single rtc driver?
I would
> trivia:
Actually not. See my answer to Arnd. I have patches for 4 users of
struct tm, but it should be converted first to struct rtc_time first
(otherwise it might uglify the code due to endianess of tm_year
memeber)
>
> Aren't there also uses of struct tm that are
> nearly identical?
>
> e.g.: drivers/usb/host/xhci-tegra.c
--
With Best Regards,
Andy Shevchenko
On 08/06/2017 at 17:55:12 +0300, Andy Shevchenko wrote:
> On Thu, Jun 8, 2017 at 5:49 PM, Arnd Bergmann <[email protected]> wrote:
> > On Thu, Jun 8, 2017 at 3:47 PM, Andy Shevchenko
> > <[email protected]> wrote:
> >> There are users which print time and date represented by content of
> >> struct rtc_time in human readable format.
> >>
> >> Instead of open coding that each time introduce %pt[dt][rv] specifier.
> >
> > I really like the idea, and the implementation seems fine for this use case, but
> > before we reserve %pt for rtc_time, could we discuss whether we want
> > that for printing struct tm, struct timespec64, time64_t or ktime_t instead?
>
> How many users? For struct tm it's somelike 4 (which want to print its content).
>
> > I can see good reasons for pretty-printing any of them, but the namespace for
> > format strings is rather limited.
> >
> > struct rtc_time is almost the same as struct tm (the former has one extra
> > member), so maybe we can actually define them to be the same and
> > use one format string for both?
>
> The reason I decide to drop struct tm for now due to they are not
> compatible and I have got an interesting bugs.
> Verify tm_year member carefully.
>
I understand this may not fit your debugging needs but what about pretty
printing time64_t and using rtc_tm_to_time64?
--
Alexandre Belloni, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
On Thu, Jun 8, 2017 at 4:55 PM, Andy Shevchenko
<[email protected]> wrote:
> On Thu, Jun 8, 2017 at 5:49 PM, Arnd Bergmann <[email protected]> wrote:
>> On Thu, Jun 8, 2017 at 3:47 PM, Andy Shevchenko
>> <[email protected]> wrote:
>>> There are users which print time and date represented by content of
>>> struct rtc_time in human readable format.
>>>
>>> Instead of open coding that each time introduce %pt[dt][rv] specifier.
>>
>> I really like the idea, and the implementation seems fine for this use case, but
>> before we reserve %pt for rtc_time, could we discuss whether we want
>> that for printing struct tm, struct timespec64, time64_t or ktime_t instead?
>
> How many users?
It's hard to predict, I would assume we get more users once there is an
easy way to print the time.
> For struct tm it's somelike 4 (which want to print its content).
Good point. I notice that they all convert from time64_t or time_t into
struct tm immediately before printing it, so we can scratch that one
as long as there is a way to pretty-print a time64_t. We also don't
need to print a time_t as we want to kill that one off anyway.
If we only care about printing time64_t and rtc_time, we can easily
use %pT for one and %pt for the other, but there may still be good
reasons to print a timespec64 or ktime_t.
>> I can see good reasons for pretty-printing any of them, but the namespace for
>> format strings is rather limited.
>>
>> struct rtc_time is almost the same as struct tm (the former has one extra
>> member), so maybe we can actually define them to be the same and
>> use one format string for both?
>
> The reason I decide to drop struct tm for now due to they are not
> compatible and I have got an interesting bugs.
Ok.
Arnd
On Thu, 2017-06-08 at 17:33 +0200, Arnd Bergmann wrote:
> On Thu, Jun 8, 2017 at 4:55 PM, Andy Shevchenko
> <[email protected]> wrote:
> > On Thu, Jun 8, 2017 at 5:49 PM, Arnd Bergmann <[email protected]> wrote:
> > > On Thu, Jun 8, 2017 at 3:47 PM, Andy Shevchenko
> > > <[email protected]> wrote:
> > > > There are users which print time and date represented by content of
> > > > struct rtc_time in human readable format.
> > > >
> > > > Instead of open coding that each time introduce %pt[dt][rv] specifier.
> > >
> > > I really like the idea, and the implementation seems fine for this use case, but
> > > before we reserve %pt for rtc_time, could we discuss whether we want
> > > that for printing struct tm, struct timespec64, time64_t or ktime_t instead?
> >
> > How many users?
>
> It's hard to predict, I would assume we get more users once there is an
> easy way to print the time.
>
> > For struct tm it's somelike 4 (which want to print its content).
>
> Good point. I notice that they all convert from time64_t or time_t into
> struct tm immediately before printing it, so we can scratch that one
> as long as there is a way to pretty-print a time64_t. We also don't
> need to print a time_t as we want to kill that one off anyway.
>
> If we only care about printing time64_t and rtc_time, we can easily
> use %pT for one and %pt for the other, but there may still be good
> reasons to print a timespec64 or ktime_t.
> > > I can see good reasons for pretty-printing any of them, but the namespace for
> > > format strings is rather limited.
The kernel already uses different types for the same leading
letter. For
instance: %pI4 vs %pI6, %pap vs %pad
A single 't' letter could do reasonably well.
On Thu, Jun 08, 2017 at 04:48:06PM +0300, Andy Shevchenko wrote:
> Use %pt instead of open coded variant to print content of
> struct rtc_time in human readable format.
>
> Cc: Krzysztof Kozlowski <[email protected]>
> Cc: Bartlomiej Zolnierkiewicz <[email protected]>
> Signed-off-by: Andy Shevchenko <[email protected]>
> ---
> drivers/rtc/rtc-s5m.c | 27 ++++++---------------------
> 1 file changed, 6 insertions(+), 21 deletions(-)
>
Reviewed-by: Krzysztof Kozlowski <[email protected]>
Best regards,
Krzysztof
On Thu, Jun 8, 2017 at 3:48 PM, Andy Shevchenko
<[email protected]> wrote:
> Use %pt instead of open coded variant to print content of
> struct rtc_time in human readable format.
>
> Cc: "Rafael J. Wysocki" <[email protected]>
> Cc: [email protected]
> Signed-off-by: Andy Shevchenko <[email protected]>
Acked-by: Rafael J. Wysocki <[email protected]>
> ---
> drivers/base/power/trace.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/drivers/base/power/trace.c b/drivers/base/power/trace.c
> index 1cda505d6a85..5e32a4f28a49 100644
> --- a/drivers/base/power/trace.c
> +++ b/drivers/base/power/trace.c
> @@ -118,9 +118,7 @@ static unsigned int read_magic_time(void)
> unsigned int val;
>
> mc146818_get_time(&time);
> - pr_info("RTC time: %2d:%02d:%02d, date: %02d/%02d/%02d\n",
> - time.tm_hour, time.tm_min, time.tm_sec,
> - time.tm_mon + 1, time.tm_mday, time.tm_year % 100);
> + pr_info("RTC time: %ptt, date: %ptd\n", &time, &time);
> val = time.tm_year; /* 100 years */
> if (val > 100)
> val -= 100;
> --
> 2.11.0
>
On Thu, Jun 8, 2017 at 6:05 PM, Alexandre Belloni
<[email protected]> wrote:
> On 08/06/2017 at 17:55:12 +0300, Andy Shevchenko wrote:
>> On Thu, Jun 8, 2017 at 5:49 PM, Arnd Bergmann <[email protected]> wrote:
>> > On Thu, Jun 8, 2017 at 3:47 PM, Andy Shevchenko
>> > <[email protected]> wrote:
>> >> There are users which print time and date represented by content of
>> >> struct rtc_time in human readable format.
>> >>
>> >> Instead of open coding that each time introduce %pt[dt][rv] specifier.
>> >
>> > I really like the idea, and the implementation seems fine for this use case, but
>> > before we reserve %pt for rtc_time, could we discuss whether we want
>> > that for printing struct tm, struct timespec64, time64_t or ktime_t instead?
>>
>> How many users? For struct tm it's somelike 4 (which want to print its content).
>>
>> > I can see good reasons for pretty-printing any of them, but the namespace for
>> > format strings is rather limited.
>> >
>> > struct rtc_time is almost the same as struct tm (the former has one extra
>> > member), so maybe we can actually define them to be the same and
>> > use one format string for both?
>>
>> The reason I decide to drop struct tm for now due to they are not
>> compatible and I have got an interesting bugs.
>> Verify tm_year member carefully.
>>
>
> I understand this may not fit your debugging needs but what about pretty
> printing time64_t and using rtc_tm_to_time64?
There are two downsides as I can see:
1) conversion to and from just for that;
2) if you look closer to the patches rtc-* you may find cases where
wday is also printed so, struct rtc_time still will be in use.
So, I would go not to convert if there is no strong reason to do.
--
With Best Regards,
Andy Shevchenko
On Thu, Jun 8, 2017 at 6:33 PM, Arnd Bergmann <[email protected]> wrote:
> On Thu, Jun 8, 2017 at 4:55 PM, Andy Shevchenko
> <[email protected]> wrote:
>> On Thu, Jun 8, 2017 at 5:49 PM, Arnd Bergmann <[email protected]> wrote:
>>> On Thu, Jun 8, 2017 at 3:47 PM, Andy Shevchenko
>>> <[email protected]> wrote:
>>> I really like the idea, and the implementation seems fine for this use case, but
>>> before we reserve %pt for rtc_time, could we discuss whether we want
>>> that for printing struct tm, struct timespec64, time64_t or ktime_t instead?
>>
>> How many users?
>
> It's hard to predict, I would assume we get more users once there is an
> easy way to print the time.
So, at least for now we can guess using existing users, right?
I don't check yet how to calculate those cases of time64_t,
timespec64, ktime_t and alike if they are about pretty ptintong time
and date.
I'm speculating that there are (almost) none.
>> For struct tm it's somelike 4 (which want to print its content).
>
> Good point. I notice that they all convert from time64_t or time_t into
> struct tm immediately before printing it, so we can scratch that one
> as long as there is a way to pretty-print a time64_t. We also don't
> need to print a time_t as we want to kill that one off anyway.
>
> If we only care about printing time64_t and rtc_time, we can easily
> use %pT for one and %pt for the other, but there may still be good
> reasons to print a timespec64 or ktime_t.
No need, we may still use 3rd/4th letter in the format for that.
%pt(t/d) time/date + whatever modifications, like raw, validate, timespec, etc.
's' for timespec64, for example.
--
With Best Regards,
Andy Shevchenko
On Thu, Jun 8, 2017 at 5:00 PM, Greg Kroah-Hartman
<[email protected]> wrote:
> On Thu, Jun 08, 2017 at 04:47:52PM +0300, Andy Shevchenko wrote:
>> Use %pt instead of open coded variant to print content of
>> struct rtc_time in human readable format.
>>
>> Arnd Bergmann <[email protected]>
>
> Cc: ?
Yep!
Fixed locally, will be in next version of the series.
>
>> Signed-off-by: Andy Shevchenko <[email protected]>
>
> Acked-by: Greg Kroah-Hartman <[email protected]>
Thanks!
--
With Best Regards,
Andy Shevchenko
On 08/06/2017 at 20:57:05 +0300, Andy Shevchenko wrote:
> On Thu, Jun 8, 2017 at 6:05 PM, Alexandre Belloni
> <[email protected]> wrote:
> > On 08/06/2017 at 17:55:12 +0300, Andy Shevchenko wrote:
> >> On Thu, Jun 8, 2017 at 5:49 PM, Arnd Bergmann <[email protected]> wrote:
> >> > On Thu, Jun 8, 2017 at 3:47 PM, Andy Shevchenko
> >> > <[email protected]> wrote:
> >> >> There are users which print time and date represented by content of
> >> >> struct rtc_time in human readable format.
> >> >>
> >> >> Instead of open coding that each time introduce %pt[dt][rv] specifier.
> >> >
> >> > I really like the idea, and the implementation seems fine for this use case, but
> >> > before we reserve %pt for rtc_time, could we discuss whether we want
> >> > that for printing struct tm, struct timespec64, time64_t or ktime_t instead?
> >>
> >> How many users? For struct tm it's somelike 4 (which want to print its content).
> >>
> >> > I can see good reasons for pretty-printing any of them, but the namespace for
> >> > format strings is rather limited.
> >> >
> >> > struct rtc_time is almost the same as struct tm (the former has one extra
> >> > member), so maybe we can actually define them to be the same and
> >> > use one format string for both?
> >>
> >> The reason I decide to drop struct tm for now due to they are not
> >> compatible and I have got an interesting bugs.
> >> Verify tm_year member carefully.
> >>
> >
> > I understand this may not fit your debugging needs but what about pretty
> > printing time64_t and using rtc_tm_to_time64?
>
> There are two downsides as I can see:
> 1) conversion to and from just for that;
Those are almost all debug messages, I would be fine with that.
> 2) if you look closer to the patches rtc-* you may find cases where
> wday is also printed so, struct rtc_time still will be in use.
>
(And you missed two in rtc-mcp795.c). Honestly, nobody cares about wday,
you may as well leave it out.
--
Alexandre Belloni, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
On Thu, Jun 8, 2017 at 9:41 PM, Alexandre Belloni
<[email protected]> wrote:
> On 08/06/2017 at 20:57:05 +0300, Andy Shevchenko wrote:
>> On Thu, Jun 8, 2017 at 6:05 PM, Alexandre Belloni
>> <[email protected]> wrote:
>> > I understand this may not fit your debugging needs but what about pretty
>> > printing time64_t and using rtc_tm_to_time64?
>>
>> There are two downsides as I can see:
>> 1) conversion to and from just for that;
>
> Those are almost all debug messages, I would be fine with that.
Yeah, but the problem is to pass the reference. All dances around will
uglify the code.
(Obviously we can't pass timespec64/time64_t or anything longer than
32 bits as is in %p extension)
>> 2) if you look closer to the patches rtc-* you may find cases where
>> wday is also printed so, struct rtc_time still will be in use.
> (And you missed two in rtc-mcp795.c). Honestly, nobody cares about wday,
> you may as well leave it out.
Oops, thanks, indeed. Okay, I will leave it for now with dropped wday
until someone comes with strong opinion why it should be there.
--
With Best Regards,
Andy Shevchenko
On Thu, Jun 08 2017, Andy Shevchenko <[email protected]> wrote:
> On Thu, Jun 8, 2017 at 9:41 PM, Alexandre Belloni
> <[email protected]> wrote:
>> On 08/06/2017 at 20:57:05 +0300, Andy Shevchenko wrote:
>>> On Thu, Jun 8, 2017 at 6:05 PM, Alexandre Belloni
>>> <[email protected]> wrote:
>
>>> > I understand this may not fit your debugging needs but what about pretty
>>> > printing time64_t and using rtc_tm_to_time64?
>>>
>>> There are two downsides as I can see:
>>> 1) conversion to and from just for that;
>>
>> Those are almost all debug messages, I would be fine with that.
>
> Yeah, but the problem is to pass the reference. All dances around will
> uglify the code.
> (Obviously we can't pass timespec64/time64_t or anything longer than
> 32 bits as is in %p extension)
>
I like that this gets rid of some mm/dd/yy and other more or less random
format and ends up standardizing yyyy-mm-dd HH:MM:SS. However, I do
think %pt should take either ktime_t or timespec64 (obviously by
reference), with fx these options
[ir] ISO (yyyy-mm-dd HH:MM:SS) or raw (seconds since epoch)
[n] append nanoseconds (.%09ld).
Please don't give people the option of eliding either the time or the
date; I've spent too much time dealing with syslog files that don't
include the year in the timestamps.
Getting a timespec64* or ktime_t* from <something else> is not that
bad. There's the compound literal option
#define rtc_tm2timespec64p(tm) \
(&(struct timespec64){ .tv_sec = rtc_tm_to_time64(tm), .tv_nsec = 0 })
printk("%pt", rtc_tm2timespec64p(tm))
or the two-extra-lines per call-site
struct timespec64 ts;
rtc_tm2time64(tm, &ts)
printk("%pt", &ts)
Rasmus
On Thu, Jun 08 2017, Andy Shevchenko <[email protected]> wrote:
> The pointer can't be NULL since it's first what has been done in the
> pointer().
>
> Remove useless checks.
>
> Note when we print clock name or rate it is safe in case !CONFIG_HAVE_CLK.
>
> Signed-off-by: Andy Shevchenko <[email protected]>
> ---
> lib/vsprintf.c | 11 -----------
> 1 file changed, 11 deletions(-)
>
> diff --git a/lib/vsprintf.c b/lib/vsprintf.c
> index 9f16406288c0..031c2cc5c1c0 100644
> --- a/lib/vsprintf.c
> +++ b/lib/vsprintf.c
> @@ -811,10 +811,6 @@ char *hex_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
> /* nothing to print */
> return buf;
>
> - if (ZERO_OR_NULL_PTR(addr))
> - /* NULL pointer */
> - return string(buf, end, NULL, spec);
> -
> switch (fmt[1]) {
> case 'C':
> separator = ':';
> @@ -1253,10 +1249,6 @@ char *escaped_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
> if (spec.field_width == 0)
> return buf; /* nothing to print */
>
> - if (ZERO_OR_NULL_PTR(addr))
> - return string(buf, end, NULL, spec); /* NULL pointer */
> -
> -
Well, ZERO_OR_NULL_PTR checks for a little more than !addr, but I
suppose that if anyone passes the result from kmalloc(0) to %ph, they'd
better also pass 0 as the size, so the .field_width tests should be
sufficient.
> do {
> switch (fmt[count++]) {
> case 'a':
> @@ -1391,9 +1383,6 @@ static noinline_for_stack
> char *clock(char *buf, char *end, struct clk *clk, struct printf_spec spec,
> const char *fmt)
> {
> - if (!IS_ENABLED(CONFIG_HAVE_CLK) || !clk)
> - return string(buf, end, NULL, spec);
> -
Well, it may be safe, but removing the IS_ENABLED(CONFIG_HAVE_CLK) check
means that clock() becomes a much bigger function when
!IS_ENABLED(CONFIG_HAVE_CLK). You're right that the !clk check is
pointless.
On Thu, Jun 8, 2017 at 11:42 PM, Rasmus Villemoes
<[email protected]> wrote:
> On Thu, Jun 08 2017, Andy Shevchenko <[email protected]> wrote:
>> On Thu, Jun 8, 2017 at 9:41 PM, Alexandre Belloni
>> <[email protected]> wrote:
>>> On 08/06/2017 at 20:57:05 +0300, Andy Shevchenko wrote:
>>>> On Thu, Jun 8, 2017 at 6:05 PM, Alexandre Belloni
>>>> <[email protected]> wrote:
>> Yeah, but the problem is to pass the reference. All dances around will
>> uglify the code.
>> (Obviously we can't pass timespec64/time64_t or anything longer than
>> 32 bits as is in %p extension)
> I like that this gets rid of some mm/dd/yy and other more or less random
> format and ends up standardizing yyyy-mm-dd HH:MM:SS. However, I do
> think %pt should take either ktime_t or timespec64 (obviously by
> reference),
I will try to look in this direction.
> with fx these options
>
> [ir] ISO (yyyy-mm-dd HH:MM:SS) or raw (seconds since epoch)
> [n] append nanoseconds (.%09ld).
We still need to be able to print time *and/or* year groups
separately. There are users which provide that via procfs or sysfs
(ABI).
> Please don't give people the option of eliding either the time or the
> date; I've spent too much time dealing with syslog files that don't
> include the year in the timestamps.
I understand that, but see above.
> Getting a timespec64* or ktime_t* from <something else> is not that
> bad. There's the compound literal option
Will look at it later, thanks for it.
>
> #define rtc_tm2timespec64p(tm) \
> (&(struct timespec64){ .tv_sec = rtc_tm_to_time64(tm), .tv_nsec = 0 })
>
> printk("%pt", rtc_tm2timespec64p(tm))
>
> or the two-extra-lines per call-site
>
> struct timespec64 ts;
> rtc_tm2time64(tm, &ts)
> printk("%pt", &ts)
--
With Best Regards,
Andy Shevchenko
On Thu, Jun 8, 2017 at 11:25 PM, Andy Shevchenko
<[email protected]> wrote:
> On Thu, Jun 8, 2017 at 11:42 PM, Rasmus Villemoes
> <[email protected]> wrote:
>> On Thu, Jun 08 2017, Andy Shevchenko <[email protected]> wrote:
>>> On Thu, Jun 8, 2017 at 9:41 PM, Alexandre Belloni
>>> <[email protected]> wrote:
>>>> On 08/06/2017 at 20:57:05 +0300, Andy Shevchenko wrote:
>>>>> On Thu, Jun 8, 2017 at 6:05 PM, Alexandre Belloni
>>>>> <[email protected]> wrote:
>
>>> Yeah, but the problem is to pass the reference. All dances around will
>>> uglify the code.
>>> (Obviously we can't pass timespec64/time64_t or anything longer than
>>> 32 bits as is in %p extension)
>
>> I like that this gets rid of some mm/dd/yy and other more or less random
>> format and ends up standardizing yyyy-mm-dd HH:MM:SS. However, I do
>> think %pt should take either ktime_t or timespec64 (obviously by
>> reference),
>
> I will try to look in this direction.
sounds good.
>> Please don't give people the option of eliding either the time or the
>> date; I've spent too much time dealing with syslog files that don't
>> include the year in the timestamps.
>
> I understand that, but see above.
When we pretty-print a ktime_t, we probably want to leave out the high
fields as well, as this often refers to a time interval, e.g. a few seconds.
Even for absolute values, the start of ktime_t is usually not the 1970
epoch but system boot, so we may not necessarily want the higher
fields. I hoped to find some inspiration in the 'date' man page, which
contains a lot of formatting options, but it's hard to translate that into
a useful format string within the constraints of %p flags in printk.
Arnd
On Thu, 2017-06-08 at 21:02 +0300, Andy Shevchenko wrote:
> On Thu, Jun 8, 2017 at 6:33 PM, Arnd Bergmann <[email protected]> wrote:
> > On Thu, Jun 8, 2017 at 4:55 PM, Andy Shevchenko
> > <[email protected]> wrote:
> > > On Thu, Jun 8, 2017 at 5:49 PM, Arnd Bergmann <[email protected]> wrote:
> > > > On Thu, Jun 8, 2017 at 3:47 PM, Andy Shevchenko
> > > > <[email protected]> wrote:
> > > > I really like the idea, and the implementation seems fine for this use case, but
> > > > before we reserve %pt for rtc_time, could we discuss whether we want
> > > > that for printing struct tm, struct timespec64, time64_t or ktime_t instead?
> > >
> > > How many users?
> >
> > It's hard to predict, I would assume we get more users once there is an
> > easy way to print the time.
>
> So, at least for now we can guess using existing users, right?
>
> I don't check yet how to calculate those cases of time64_t,
> timespec64, ktime_t and alike if they are about pretty ptintong time
> and date.
> I'm speculating that there are (almost) none.
>
> > > For struct tm it's somelike 4 (which want to print its content).
> >
> > Good point. I notice that they all convert from time64_t or time_t into
> > struct tm immediately before printing it, so we can scratch that one
> > as long as there is a way to pretty-print a time64_t. We also don't
> > need to print a time_t as we want to kill that one off anyway.
> >
> > If we only care about printing time64_t and rtc_time, we can easily
> > use %pT for one and %pt for the other, but there may still be good
> > reasons to print a timespec64 or ktime_t.
>
> No need, we may still use 3rd/4th letter in the format for that.
>
> %pt(t/d) time/date + whatever modifications, like raw, validate, timespec, etc.
>
> 's' for timespec64, for example.
My preference would be for %pt[type]<output style>
where <type> is mandatory and could be:
r for struct rtc_time
6 for time64_t
k for ktime_t
T for struct timespec64
etc
and <output style> has an unspecified default of
YYYY-MM-DD:hh:mm:ss
Perhaps use the "date" formats without the leading
% uses for <output style> for additional styles.
On Thu, 2017-06-08 at 18:02 +0300, Andy Shevchenko wrote:
> On Thu, Jun 8, 2017 at 5:52 PM, Joe Perches <[email protected]> wrote:
> > On Thu, 2017-06-08 at 16:47 +0300, Andy Shevchenko wrote:
> > > Recently I have noticed too many users of struct rtc_time that printing
> > > its content field by field.
> > >
> > > In this series I introduce %pt[dt][rv] specifier to make life a bit
> > > easier.
[]
> > > Most of the users currently are RTC drivers, thus the patch series is
> > > assumed to go via RTC tree.
> >
> > What I wonder about this series is how much
> > larger it makes a typical kernel and how
> > often multiple rtc clocks are built for a
> > single kernel?
>
> We may hide it under CONFIG_RTC_??? if we want to reduce kernel for
> non RTC cases.
Depends whether it is for rtc_time only
> > What is the size impact on an embedded kernel
> > that uses a single rtc driver?
>
> I would
You would what?
On 08/06/17 14:48, Andy Shevchenko wrote:
> Use %pt instead of open coded variant to print content of
> struct rtc_time in human readable format.
>
> Cc: Jason Wessel <[email protected]>
> Cc: Ingo Molnar <[email protected]>
> Signed-off-by: Andy Shevchenko <[email protected]>
Reviewed-by: Daniel Thompson <[email protected]>
> ---
> kernel/debug/kdb/kdb_main.c | 7 +------
> 1 file changed, 1 insertion(+), 6 deletions(-)
>
> diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
> index c8146d53ca67..2a6f12be79d8 100644
> --- a/kernel/debug/kdb/kdb_main.c
> +++ b/kernel/debug/kdb/kdb_main.c
> @@ -2556,12 +2556,7 @@ static int kdb_summary(int argc, const char **argv)
>
> now = __current_kernel_time();
> kdb_gmtime(&now, &tm);
> - kdb_printf("date %04d-%02d-%02d %02d:%02d:%02d "
> - "tz_minuteswest %d\n",
> - 1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday,
> - tm.tm_hour, tm.tm_min, tm.tm_sec,
> - sys_tz.tz_minuteswest);
> -
> + kdb_printf("date %pt tz_minuteswest %d\n", &tm, sys_tz.tz_minuteswest);
> kdb_sysinfo(&val);
> kdb_printf("uptime ");
> if (val.uptime > (24*60*60)) {
>
On Thu, 2017-06-08 at 16:47 +0300, Andy Shevchenko wrote:
> Recently I have noticed too many users of struct rtc_time that printing
> its content field by field.
>
> In this series I introduce %pt[dt][rv] specifier to make life a bit
> easier.
Hey Andy.
I just saw a patch with a printk for rtc time from Mark Salyzyn.
https://lkml.org/lkml/2017/7/18/885
Any idea if you want to push this extension?
I like the concept and still think it could be extended a bit more.
from: https://lkml.org/lkml/2017/6/8/1134
My preference would be for %pt[type]<output style>
where <type> is mandatory and could be:
????????r for struct rtc_time
????????6 for time64_t
????????k for ktime_t
????????T for struct timespec64
????????etc
and <output style> has an unspecified default of
YYYY-MM-DD:hh:mm:ss
Perhaps use the "date" formats without the leading
% uses for <output style> for additional styles.
On Tue, 2017-07-18 at 10:50 -0700, Joe Perches wrote:
> On Thu, 2017-06-08 at 16:47 +0300, Andy Shevchenko wrote:
> > Recently I have noticed too many users of struct rtc_time that
> > printing
> > its content field by field.
> >
> > In this series I introduce %pt[dt][rv] specifier to make life a bit
> > easier.
>
> Hey Andy.
>
> I just saw a patch with a printk for rtc time from Mark Salyzyn.
> https://lkml.org/lkml/2017/7/18/885
Same!
> Any idea if you want to push this extension?
Yes, just really lack of time for everything.
I like the idea to make it conditional (config BLABLABLA). It will
address some comments about footprint for no users.
> I like the concept and still think it could be extended a bit more.
>
> from: https://lkml.org/lkml/2017/6/8/1134
>
> My preference would be for %pt[type]<output style>
> where <type> is mandatory and could be:
>
> r for struct rtc_time
> 6 for time64_t
> k for ktime_t
> T for struct timespec64
> etc
I dunno about this.
However, I like this more than do conversion in each case where input
reference has different type.
> and <output style> has an unspecified default of
> YYYY-MM-DD:hh:mm:ss
I'm against this, sorry. Too many variations for almost no use (users).
> Perhaps use the "date" formats without the leading
> % uses for <output style> for additional styles.
--
Andy Shevchenko <[email protected]>
Intel Finland Oy
On Tue, 2017-07-18 at 20:55 +0300, Andy Shevchenko wrote:
> On Tue, 2017-07-18 at 10:50 -0700, Joe Perches wrote:
> > On Thu, 2017-06-08 at 16:47 +0300, Andy Shevchenko wrote:
> > > Recently I have noticed too many users of struct rtc_time that
> > > printing
> > > its content field by field.
> > >
> > > In this series I introduce %pt[dt][rv] specifier to make life a bit
> > > easier.
> >
> > Hey Andy.
> >
> > I just saw a patch with a printk for rtc time from Mark Salyzyn.
> > https://lkml.org/lkml/2017/7/18/885
>
> Same!
>
> > Any idea if you want to push this extension?
>
> Yes, just really lack of time for everything.
>
> I like the idea to make it conditional (config BLABLABLA). It will
> address some comments about footprint for no users.
Only one of the other %p<foo> extensions is conditional
and that
conditional is probably not too useful.
I think the code size is relatively small and not
particularly valuable for the additional complexity.
For instance, all of the code that emits MAC and
IP[46] addresses %pM and %pI variants is 2.5K.
(x86 allnoconfig)
There are lots more code size savings than that
lying about.
And auditing all the code that might emit a MAC
address when CONFIG_NET is not set is probably
not worth the effort for the size reduction.
$ size lib/vsprintf.o*
???text ???data ????bss ????dec ????hex
filename
? 12140 ??????4 ??????0 ??12144 ???2f70
lib/vsprintf.o.allnoconfig.new
? 14785 ??????4 ??????0 ??14789 ???39c5
lib/vsprintf.o.allnoconfig.old
---
lib/vsprintf.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 86c3385b9eb3..de95e78ca5f0 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -933,6 +933,7 @@ char *bitmap_list_string(char *buf, char *end, unsigned long *bitmap,
return buf;
}
+#ifdef CONFIG_NET
static noinline_for_stack
char *mac_address_string(char *buf, char *end, u8 *addr,
struct printf_spec spec, const char *fmt)
@@ -1241,6 +1242,7 @@ char *ip4_addr_string_sa(char *buf, char *end, const struct sockaddr_in *sa,
return string(buf, end, ip4_addr, spec);
}
+#endif
static noinline_for_stack
char *escaped_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
@@ -1741,6 +1743,7 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
default:
return bitmap_string(buf, end, ptr, spec, fmt);
}
+#ifdef CONFIG_NET
case 'M': /* Colon separated: 00:01:02:03:04:05 */
case 'm': /* Contiguous: 000102030405 */
/* [mM]F (FDDI) */
@@ -1777,6 +1780,7 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
}}
}
break;
+#endif
case 'E':
return escaped_string(buf, end, ptr, spec, fmt);
case 'U':
On 07/18/2017 10:50 AM, Joe Perches wrote:
> On Thu, 2017-06-08 at 16:47 +0300, Andy Shevchenko wrote:
>> Recently I have noticed too many users of struct rtc_time that printing
>> its content field by field.
>>
>> In this series I introduce %pt[dt][rv] specifier to make life a bit
>> easier.
> Hey Andy.
>
> I just saw a patch with a printk for rtc time from Mark Salyzyn.
> https://lkml.org/lkml/2017/7/18/885
>
> Any idea if you want to push this extension?
>
> I like the concept and still think it could be extended a bit more.
>
> from: https://lkml.org/lkml/2017/6/8/1134
>
> My preference would be for %pt[type]<output style>
> where <type> is mandatory and could be:
>
> r for struct rtc_time
> 6 for time64_t
> k for ktime_t
> T for struct timespec64
> etc
>
> and <output style> has an unspecified default of
> YYYY-MM-DD:hh:mm:ss
>
> Perhaps use the "date" formats without the leading
> % uses for <output style> for additional styles.
>
YYYY-MM-DD hh:mm:ss.nnnnnnnnn ?
On Thu, 2017-06-08 at 22:59 +0200, Rasmus Villemoes wrote:
> On Thu, Jun 08 2017, Andy Shevchenko <[email protected]
> m> wrote:
> > The pointer can't be NULL since it's first what has been done in the
> > pointer().
> > - if (ZERO_OR_NULL_PTR(addr))
> > - return string(buf, end, NULL, spec); /* NULL
> > pointer */
> > -
> > -
>
> Well, ZERO_OR_NULL_PTR checks for a little more than !addr, but I
> suppose that if anyone passes the result from kmalloc(0) to %ph,
> they'd
> better also pass 0 as the size, so the .field_width tests should be
> sufficient.
If we care about kmalloc(0) check we better to do this in pointer()?
> > - if (!IS_ENABLED(CONFIG_HAVE_CLK) || !clk)
> > - return string(buf, end, NULL, spec);
> > -
>
> Well, it may be safe, but removing the IS_ENABLED(CONFIG_HAVE_CLK)
> check
> means that clock() becomes a much bigger function when
> !IS_ENABLED(CONFIG_HAVE_CLK).
I return back this in v2.
--
Andy Shevchenko <[email protected]>
Intel Finland Oy
On Thu, 2017-06-08 at 23:45 +0200, Arnd Bergmann wrote:
> On Thu, Jun 8, 2017 at 11:25 PM, Andy Shevchenko
> <[email protected]> wrote:
> > On Thu, Jun 8, 2017 at 11:42 PM, Rasmus Villemoes
> > <[email protected]> wrote:
> > > On Thu, Jun 08 2017, Andy Shevchenko <[email protected]>
> > > wrote:
> > > > On Thu, Jun 8, 2017 at 9:41 PM, Alexandre Belloni
> > > > <[email protected]> wrote:
> > > > > On 08/06/2017 at 20:57:05 +0300, Andy Shevchenko wrote:
> > > > > > On Thu, Jun 8, 2017 at 6:05 PM, Alexandre Belloni
> > > > > > <[email protected]> wrote:
> > > > Yeah, but the problem is to pass the reference. All dances
> > > > around will
> > > > uglify the code.
> > > > (Obviously we can't pass timespec64/time64_t or anything longer
> > > > than
> > > > 32 bits as is in %p extension)
> > > I like that this gets rid of some mm/dd/yy and other more or less
> > > random
> > > format and ends up standardizing yyyy-mm-dd HH:MM:SS. However, I
> > > do
> > > think %pt should take either ktime_t or timespec64 (obviously by
> > > reference),
> >
> > I will try to look in this direction.
>
> sounds good.
>
> > > Please don't give people the option of eliding either the time or
> > > the
> > > date; I've spent too much time dealing with syslog files that
> > > don't
> > > include the year in the timestamps.
> >
> > I understand that, but see above.
>
> When we pretty-print a ktime_t, we probably want to leave out the high
> fields as well, as this often refers to a time interval, e.g. a few
> seconds.
> Even for absolute values, the start of ktime_t is usually not the 1970
> epoch but system boot, so we may not necessarily want the higher
> fields. I hoped to find some inspiration in the 'date' man page, which
> contains a lot of formatting options, but it's hard to translate that
> into
> a useful format string within the constraints of %p flags in printk.
Rasmus et al.,
Summarizing this discussion I would go forward with the following
- add one more letter in the format to provide argument type (timespec,
ktime, ...)
- make a config option to enable / disable this facility and select it
by users (and/or make it visible for configuration?)
- still leave possibility to print either date or time or both
- add suffix to print nanoseconds in cases where input has them (and
output is not just plain date)
- address other (technical) comments
--
Andy Shevchenko <[email protected]>
Intel Finland Oy
On Tue, 2017-07-18 at 12:57 -0700, Mark Salyzyn wrote:
> On 07/18/2017 10:50 AM, Joe Perches wrote:
> > On Thu, 2017-06-08 at 16:47 +0300, Andy Shevchenko wrote:
> > > Recently I have noticed too many users of struct rtc_time that
> > > printing
> > > its content field by field.
> > >
> > > In this series I introduce %pt[dt][rv] specifier to make life a
> > > bit
> > > easier.
> >
> > Hey Andy.
> >
> > I just saw a patch with a printk for rtc time from Mark Salyzyn.
> > https://lkml.org/lkml/2017/7/18/885
> >
> > Any idea if you want to push this extension?
> >
> > I like the concept and still think it could be extended a bit more.
> >
> > from: https://lkml.org/lkml/2017/6/8/1134
> >
> > My preference would be for %pt[type]<output style>
> > where <type> is mandatory and could be:
> >
> > r for struct rtc_time
> > 6 for time64_t
> > k for ktime_t
> > T for struct timespec64
> > etc
> >
> > and <output style> has an unspecified default of
> > YYYY-MM-DD:hh:mm:ss
> >
> > Perhaps use the "date" formats without the leading
> > % uses for <output style> for additional styles.
> >
>
> YYYY-MM-DD hh:mm:ss.nnnnnnnnn ?
As a separate modifier, yes.
See my answer to subthread in patch 4.
--
Andy Shevchenko <[email protected]>
Intel Finland Oy
On 07/20/2017 03:33 AM, Andy Shevchenko wrote:
> On Tue, 2017-07-18 at 12:57 -0700, Mark Salyzyn wrote:
>> On 07/18/2017 10:50 AM, Joe Perches wrote:
>>> On Thu, 2017-06-08 at 16:47 +0300, Andy Shevchenko wrote:
>>>> Recently I have noticed too many users of struct rtc_time that
>>>> printing
>>>> its content field by field.
>>>>
>>>> In this series I introduce %pt[dt][rv] specifier to make life a
>>>> bit
>>>> easier.
>>> Hey Andy.
>>>
>>> I just saw a patch with a printk for rtc time from Mark Salyzyn.
>>> https://lkml.org/lkml/2017/7/18/885
>>>
>>> Any idea if you want to push this extension?
>>>
>>> I like the concept and still think it could be extended a bit more.
>>>
>>> from: https://lkml.org/lkml/2017/6/8/1134
>>>
>>> My preference would be for %pt[type]<output style>
>>> where <type> is mandatory and could be:
>>>
>>> r for struct rtc_time
>>> 6 for time64_t
>>> k for ktime_t
>>> T for struct timespec64
>>> etc
>>>
>>> and <output style> has an unspecified default of
>>> YYYY-MM-DD:hh:mm:ss
>>>
>>> Perhaps use the "date" formats without the leading
>>> % uses for <output style> for additional styles.
>>>
>> YYYY-MM-DD hh:mm:ss.nnnnnnnnn ?
> As a separate modifier, yes.
>
> See my answer to subthread in patch 4.
>
It would probably need to take struct timespec64 as an argument. Pass by
structure might be difficult to swallow, so pass by pointer?
As for my need for this in my suspend/resume/hibernate/restore patch
set, we have already been told three times to _not_ report wall clock
time. I could imagine being a consumer of it in the future if we have
difficulty migrating the analysis tools ... so tepid support from me.
-- Mark
On Thu, 2017-07-20 at 10:57 -0700, Mark Salyzyn wrote:
> It would probably need to take struct timespec64 as an argument. Pass by
> structure might be difficult to swallow, so pass by pointer?
Every %p<foo> extension is passed via a pointer.