Linux has supported this format specifier for 10 years now.
So let's add support for it in barebox proper as well.

Signed-off-by: Ahmad Fatoum <a.fat...@barebox.org>
---
v1 -> v2:
  - wrap struct clk * dereference into #ifdef, because definition
    isn't defined globally (Sascha)
---
 arch/arm/mach-at91/clock.c        |  2 +-
 drivers/clk/clk-divider.c         |  4 ++--
 drivers/clk/clk-stm32f4.c         |  2 +-
 drivers/clk/clk.c                 | 14 +++++++-------
 drivers/clk/imx/clk-pll14xx.c     |  4 ++--
 drivers/clk/tegra/clk.c           | 12 ++++++------
 drivers/firmware/arm_scmi/clock.c |  4 ++--
 drivers/net/macb.c                |  2 +-
 drivers/video/imx-ipu-v3/ipu-di.c |  4 ++--
 lib/vsprintf.c                    | 18 +++++++++++++++++-
 10 files changed, 41 insertions(+), 25 deletions(-)

diff --git a/arch/arm/mach-at91/clock.c b/arch/arm/mach-at91/clock.c
index a3071189bb8f..6482aa93c0bf 100644
--- a/arch/arm/mach-at91/clock.c
+++ b/arch/arm/mach-at91/clock.c
@@ -858,7 +858,7 @@ static int at91_clock_reset(void)
                if (clk->mode == pmc_sys_mode)
                        scdr |= clk->pmc_mask;
 
-               pr_debug("Clocks: disable unused %s\n", clk->name);
+               pr_debug("Clocks: disable unused %pC\n", clk);
        }
 
        at91_pmc_write(AT91_PMC_PCDR, pcdr);
diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c
index b0df34e85847..62d63ef39c7e 100644
--- a/drivers/clk/clk-divider.c
+++ b/drivers/clk/clk-divider.c
@@ -90,8 +90,8 @@ unsigned long divider_recalc_rate(struct clk *clk, unsigned 
long parent_rate,
        div = _get_div(table, val, flags, width);
        if (!div) {
                WARN(!(flags & CLK_DIVIDER_ALLOW_ZERO),
-                       "%s: Zero divisor and CLK_DIVIDER_ALLOW_ZERO not set\n",
-                       clk->name);
+                       "%pC: Zero divisor and CLK_DIVIDER_ALLOW_ZERO not 
set\n",
+                       clk);
                return parent_rate;
        }
 
diff --git a/drivers/clk/clk-stm32f4.c b/drivers/clk/clk-stm32f4.c
index 22c47656c411..343ee0e6e9b5 100644
--- a/drivers/clk/clk-stm32f4.c
+++ b/drivers/clk/clk-stm32f4.c
@@ -1879,7 +1879,7 @@ static void __init stm32f4_rcc_init(struct device_node 
*np)
                                &stm32f4_clk_lock);
 
                if (IS_ERR(hw)) {
-                       pr_warn("Unable to register %s clk\n", aux_clk->name);
+                       pr_warn("Unable to register %pC clk\n", aux_clk);
                        continue;
                }
 
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 9b21d0650b6c..ec8c06b61bfb 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -80,7 +80,7 @@ void clk_disable(struct clk *clk)
                return;
 
        if (clk->enable_count == 1 && clk->flags & CLK_IS_CRITICAL) {
-               pr_warn("Disabling critical clock %s\n", clk->name);
+               pr_warn("Disabling critical clock %pC\n", clk);
                return;
        }
 
@@ -446,8 +446,8 @@ static int __bclk_register(struct clk *clk)
 
        list_for_each_entry(c, &clks, list) {
                if (!strcmp(c->name, clk->name)) {
-                       pr_err("%s clk %s is already registered, skipping!\n",
-                               __func__, clk->name);
+                       pr_err("%s clk %pC is already registered, skipping!\n",
+                               __func__, clk);
                        return -EBUSY;
                }
        }
@@ -1046,8 +1046,8 @@ static void dump_one_summary(struct clk *clk, int flags, 
int indent)
        else
                stat = "enabled";
 
-       printf("%*s%s (rate %lu, enable_count: %d, %s)\n", indent * 4, "",
-              clk->name,
+       printf("%*s%pC (rate %lu, enable_count: %d, %s)\n", indent * 4, "",
+              clk,
               clk_get_rate(clk),
               clk->enable_count,
               hwstat);
@@ -1066,8 +1066,8 @@ static void dump_one_summary(struct clk *clk, int flags, 
int indent)
 
 static void dump_one_json(struct clk *clk, int flags, int indent)
 {
-       printf("\"%s\": { \"rate\": %lu,\"enable_count\": %d",
-              clk->name,
+       printf("\"%pC\": { \"rate\": %lu,\"enable_count\": %d",
+              clk,
               clk_get_rate(clk),
               clk->enable_count);
 }
diff --git a/drivers/clk/imx/clk-pll14xx.c b/drivers/clk/imx/clk-pll14xx.c
index 86286448e9ef..6716a6f55560 100644
--- a/drivers/clk/imx/clk-pll14xx.c
+++ b/drivers/clk/imx/clk-pll14xx.c
@@ -261,8 +261,8 @@ static int clk_pll1443x_set_rate(struct clk_hw *hw, 
unsigned long drate,
 
        rate = imx_get_pll_settings(pll, drate);
        if (!rate) {
-               pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__,
-                       drate, clk->name);
+               pr_err("%s: Invalid rate : %lu for pll clk %pC\n", __func__,
+                       drate, clk);
                return -EINVAL;
        }
 
diff --git a/drivers/clk/tegra/clk.c b/drivers/clk/tegra/clk.c
index ad384d8d4d53..90f66f4daf87 100644
--- a/drivers/clk/tegra/clk.c
+++ b/drivers/clk/tegra/clk.c
@@ -117,23 +117,23 @@ void tegra_init_from_table(struct tegra_clk_init_table 
*tbl,
                if (tbl->parent_id < clk_max) {
                        struct clk *parent = clks[tbl->parent_id];
                        if (clk_set_parent(clk, parent)) {
-                               pr_err("%s: Failed to set parent %s of %s\n",
-                                      __func__, parent->name, clk->name);
+                               pr_err("%s: Failed to set parent %pC of %pC\n",
+                                      __func__, parent, clk);
                                WARN_ON(1);
                        }
                }
 
                if (tbl->rate)
                        if (clk_set_rate(clk, tbl->rate)) {
-                               pr_err("%s: Failed to set rate %lu of %s\n",
-                                      __func__, tbl->rate, clk->name);
+                               pr_err("%s: Failed to set rate %lu of %pC\n",
+                                      __func__, tbl->rate, clk);
                                WARN_ON(1);
                        }
 
                if (tbl->state)
                        if (clk_enable(clk)) {
-                               pr_err("%s: Failed to enable %s\n", __func__,
-                                      clk->name);
+                               pr_err("%s: Failed to enable %pC\n", __func__,
+                                      clk);
                                WARN_ON(1);
                        }
        }
diff --git a/drivers/firmware/arm_scmi/clock.c 
b/drivers/firmware/arm_scmi/clock.c
index 2c902835a0ec..7e1e9f023496 100644
--- a/drivers/firmware/arm_scmi/clock.c
+++ b/drivers/firmware/arm_scmi/clock.c
@@ -197,8 +197,8 @@ iter_clk_describe_update_state(struct scmi_iterator_state 
*st,
        if (!p->clk->rate_discrete &&
            (st->num_returned != 3 || st->num_remaining != 0)) {
                dev_warn(p->dev,
-                        "Out-of-spec CLOCK_DESCRIBE_RATES reply for %s - 
returned:%d remaining:%d rx_len:%zd\n",
-                        p->clk->name, st->num_returned, st->num_remaining,
+                        "Out-of-spec CLOCK_DESCRIBE_RATES reply for %pC - 
returned:%d remaining:%d rx_len:%zd\n",
+                        p->clk, st->num_returned, st->num_remaining,
                         st->rx_len);
 
                /*
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 205e3169f17b..26bc3130bf59 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -772,7 +772,7 @@ static int fu540_c000_txclk_init(struct device *dev, struct 
clk **tx_clk)
                return err;
        }
 
-       dev_info(dev, "Registered clk switch '%s'\n", clk->name);
+       dev_info(dev, "Registered clk switch '%pC'\n", clk);
        return 0;
 }
 #else
diff --git a/drivers/video/imx-ipu-v3/ipu-di.c 
b/drivers/video/imx-ipu-v3/ipu-di.c
index 7653d512969f..80c0276ec96f 100644
--- a/drivers/video/imx-ipu-v3/ipu-di.c
+++ b/drivers/video/imx-ipu-v3/ipu-di.c
@@ -542,8 +542,8 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct 
ipu_di_signal_cfg *sig)
        ret = clk_set_parent(&di->clk_di_pixel, parent);
        if (ret) {
                dev_err(di->ipu->dev,
-                       "setting pixel clock to parent %s failed with %d\n",
-                               parent->name, ret);
+                       "setting pixel clock to parent %pC failed with %d\n",
+                               parent, ret);
                return ret;
        }
 
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index ba87f6c210d2..409a8f02dec9 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -16,6 +16,7 @@
 #include <linux/string.h>
 #include <linux/ctype.h>
 #include <linux/math64.h>
+#include <linux/clk.h>
 #include <malloc.h>
 #include <kallsyms.h>
 #include <wchar.h>
@@ -310,7 +311,7 @@ char *ip4_addr_string(char *buf, const char *end, const u8 
*addr, int field_widt
 }
 
 static
-char *error_string(char *buf, const char *end, const u8 *errptr, int 
field_width,
+char *error_string(char *buf, const char *end, const void *errptr, int 
field_width,
                   int precision, int flags, const char *fmt)
 {
     if (!IS_ERR(errptr))
@@ -477,6 +478,18 @@ char *device_node_string(char *buf, const char *end, const 
struct device_node *n
                      precision, flags);
 }
 
+static noinline_for_stack
+char *clock(char *buf, const char *end, const struct clk *clk,
+           int field_width, int precision, int flags, const char *fmt)
+{
+#ifdef CONFIG_COMMON_CLK
+       if (!IS_ERR_OR_NULL(clk))
+               return string(buf, end, clk->name, field_width, precision, 
flags);
+#endif
+
+       return error_string(buf, end, clk, field_width, precision, flags, fmt);
+}
+
 /*
  * Show a '%p' thing.  A kernel extension is that the '%p' is followed
  * by an extra set of alphanumeric characters that are extended format
@@ -515,6 +528,7 @@ char *device_node_string(char *buf, const char *end, const 
struct device_node *n
  *              N no separator
  * - 'M' For a 6-byte MAC address, it prints the address in the
  *       usual colon-separated hex notation
+ * - 'C' For a clock, it prints the name in the Common Clock Framework
  *
  * Additionally, we support following barebox-specific format specifiers:
  *
@@ -575,6 +589,8 @@ static char *pointer(const char *fmt, char *buf, const char 
*end, const void *pt
                if (IS_ENABLED(CONFIG_EFI_DEVICEPATH))
                        return device_path_string(buf, end, ptr, field_width, 
precision, flags);
                break;
+       case 'C':
+               return clock(buf, end, ptr, field_width, precision, flags, fmt);
        }
 
        return raw_pointer(buf, end, ptr, field_width, precision, flags);
-- 
2.39.5


Reply via email to