From 0ec895a5ac192c33017609fbb8e4296c8b868603 Mon Sep 17 00:00:00 2001 From: Jianqun Xu Date: Wed, 11 Nov 2020 10:02:46 +0800 Subject: [PATCH] regulator: fix regulator_summary name show issue Before this patch: vcc_1v8 0 3 0 1800mV 0mA 1800mV 1800mV fdc20000.syscon:io-domains 0mV 0mV fdc20000.syscon:io-domains 0mV 0mV deviceless 0mV 0mV vdda0v9_image 0 1 0 900mV 0mA 900mV 900mV deviceless 0mV 0mV With this patch: vcc_1v8 0 3 0 1800mV 0mA 1800mV 1800mV fdc20000.syscon:io-domains-vccio6 0mV 0mV fdc20000.syscon:io-domains-vccio4 0mV 0mV Change-Id: Iaae22f406bb75027279eeb234b570edee952abc4 Signed-off-by: Jianqun Xu --- drivers/regulator/core.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index f9a9b2ef500b..39ae6a5307fa 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -5087,6 +5087,18 @@ static int regulator_summary_show_children(struct device *dev, void *data) return 0; } +static void strrcpy(char *dst, int dst_len, const char *src) +{ + int src_len = strlen(src); + + if (src_len > dst_len) + src += src_len - dst_len; + + strncpy(dst, src, dst_len); +} + +#define REGULATOR_NAME_LEN (50) + static void regulator_summary_show_subtree(struct seq_file *s, struct regulator_dev *rdev, int level) @@ -5094,13 +5106,17 @@ static void regulator_summary_show_subtree(struct seq_file *s, struct regulation_constraints *c; struct regulator *consumer; struct summary_data summary_data; + char buf[REGULATOR_NAME_LEN]; + const char *devname; if (!rdev) return; + devname = rdev_get_name(rdev); + strrcpy(buf, REGULATOR_NAME_LEN - level * 3, devname); seq_printf(s, "%*s%-*s %3d %4d %6d ", level * 3 + 1, "", - 30 - level * 3, rdev_get_name(rdev), + REGULATOR_NAME_LEN - level * 3, buf, rdev->use_count, rdev->open_count, rdev->bypass_count); seq_printf(s, "%5dmV ", _regulator_get_voltage(rdev) / 1000); @@ -5126,10 +5142,11 @@ static void regulator_summary_show_subtree(struct seq_file *s, if (consumer->dev && consumer->dev->class == ®ulator_class) continue; + devname = consumer->dev ? consumer->supply_name : "deviceless"; + strrcpy(buf, REGULATOR_NAME_LEN - (level + 1) * 3, devname); seq_printf(s, "%*s%-*s ", (level + 1) * 3 + 1, "", - 30 - (level + 1) * 3, - consumer->dev ? dev_name(consumer->dev) : "deviceless"); + REGULATOR_NAME_LEN - (level + 1) * 3, buf); switch (rdev->desc->type) { case REGULATOR_VOLTAGE: @@ -5165,8 +5182,14 @@ static int regulator_summary_show_roots(struct device *dev, void *data) static int regulator_summary_show(struct seq_file *s, void *data) { - seq_puts(s, " regulator use open bypass voltage current min max\n"); - seq_puts(s, "-------------------------------------------------------------------------------\n"); + int i; + + seq_printf(s, "%-*s %3s %4s %6s %7s %7s %7s %7s\n", + REGULATOR_NAME_LEN + 1, " regulator", + "use", "open", "bypass", "voltage", "current", "min", "max"); + for (i = 0; i < REGULATOR_NAME_LEN + 49; i++) + seq_puts(s, "-"); + seq_puts(s, "\n"); class_for_each_device(®ulator_class, NULL, s, regulator_summary_show_roots);