Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c91d3376 authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Jesse Barnes
Browse files

vsprintf: add %pR support for IRQ and DMA resources



Print addresses (IO port numbers and memory addresses) in hex, but print
others (IRQs and DMA channels) in decimal.  Only print the end if it's
different from the start.

Signed-off-by: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent 28405372
Loading
Loading
Loading
Loading
+21 −10
Original line number Diff line number Diff line
@@ -604,26 +604,37 @@ static char *resource_string(char *buf, char *end, struct resource *res,
#ifndef MEM_RSRC_PRINTK_SIZE
#define MEM_RSRC_PRINTK_SIZE	10
#endif
	struct printf_spec num_spec = {
	struct printf_spec hex_spec = {
		.base = 16,
		.precision = -1,
		.flags = SPECIAL | SMALL | ZEROPAD,
	};
	/* room for the actual numbers, the two "0x", -, [, ] and the final zero */
	char sym[4*sizeof(resource_size_t) + 8];
	struct printf_spec dec_spec = {
		.base = 10,
		.precision = -1,
		.flags = 0,
	};
	/* room for two actual numbers (decimal or hex), the two "0x", -, [, ]
	 * and the final zero */
	char sym[2*3*sizeof(resource_size_t) + 8];
	char *p = sym, *pend = sym + sizeof(sym);
	int size = -1;
	int size = -1, addr = 0;

	if (res->flags & IORESOURCE_IO)
	if (res->flags & IORESOURCE_IO) {
		size = IO_RSRC_PRINTK_SIZE;
	else if (res->flags & IORESOURCE_MEM)
		addr = 1;
	} else if (res->flags & IORESOURCE_MEM) {
		size = MEM_RSRC_PRINTK_SIZE;
		addr = 1;
	}

	*p++ = '[';
	num_spec.field_width = size;
	p = number(p, pend, res->start, num_spec);
	hex_spec.field_width = size;
	p = number(p, pend, res->start, addr ? hex_spec : dec_spec);
	if (res->start != res->end) {
		*p++ = '-';
	p = number(p, pend, res->end, num_spec);
		p = number(p, pend, res->end, addr ? hex_spec : dec_spec);
	}
	*p++ = ']';
	*p = 0;