
Hi Simon,
On Wed, Apr 29, 2015 at 10:25 AM, Simon Glass sjg@chromium.org wrote:
Add a function similar to print_size() that works for frequencies. It can handle from Hz to GHz.
Signed-off-by: Simon Glass sjg@chromium.org
Changes in v2:
- Correct bugs in number output
include/display_options.h | 11 +++++++++++ lib/display_options.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+)
diff --git a/include/display_options.h b/include/display_options.h index 54bd41d..ac44c45 100644 --- a/include/display_options.h +++ b/include/display_options.h @@ -23,6 +23,17 @@ void print_size(uint64_t size, const char *suffix);
/**
- print_freq() - Print a frequency with a suffix
- Print frequencies as "x.xx GHz", "xxx KHz", etc as needed; allow for
- optional trailing string (like "\n")
- @freq: Frequency to print in Hz
- @suffix String to print after the frequency
- */
+void print_freq(uint64_t freq, const char *suffix);
+/**
- print_buffer() - Print data buffer in hex and ascii form
- Data reads are buffered so that each memory address is only read once.
diff --git a/lib/display_options.c b/lib/display_options.c index 3f32bcd..3a70e14 100644 --- a/lib/display_options.c +++ b/lib/display_options.c @@ -7,6 +7,7 @@
#include <config.h> #include <common.h> +#include <div64.h> #include <inttypes.h> #include <version.h> #include <linux/ctype.h> @@ -22,6 +23,43 @@ int display_options (void) return 0; }
+void print_freq(uint64_t freq, const char *s) +{
unsigned long m = 0, n;
uint64_t f;
static const char names[] = {'G', 'M', 'K'};
unsigned long d = 1e9;
char c = 0;
unsigned int i;
for (i = 0; i < ARRAY_SIZE(names); i++, d /= 1000) {
if (freq >= d) {
c = names[i];
break;
}
}
if (!c) {
printf("%" PRIu64 " Hz%s", freq, s);
return;
}
f = do_div(freq, d);
n = freq;
/* If there's a remainder, show the first few digits */
if (f) {
m = f % d;
while (!(m % 10))
m /= 10;
}
This 'first few digits' issue is not fixed. Do you intend to print all numbers after the radix point? If yes, then we need fix the comment to say all numbers will be printed.
printf("%lu", n);
if (m)
printf(".%ld", m);
printf(" %cHz%s", c, s);
+}
void print_size(uint64_t size, const char *s) { unsigned long m = 0, n; --
Regards, Bin