/** * __sunxi_dump_regs_ex - dump a range of registers' value, copy to buf. * @start_reg: address of start reg. * @end_reg: address of end reg. * @buf: store the dump info. * * return bytes written to buf, <=0 indicate err */ ssize_t __sunxi_dump_regs_ex(u32 start_reg, u32 end_reg, char *buf) { int i; ssize_t cnt = 0; u32 first_addr = 0, end_addr = 0; if(!__addr_valid(start_reg) || !__addr_valid(end_reg) || NULL == buf) { printk(KERN_ERR "%s err, invalid para, start 0x%08x, end 0x%08x, buf 0x%08x\n", __func__, start_reg, end_reg, (u32)buf); return -EIO; } /* only one to dump */ if(start_reg == end_reg) //return sprintf(buf, "0x%08x: 0x%08x\n", start_reg, R(start_reg)); return sprintf(buf, "0x%08x\n", R(start_reg)); /* for open("/sys/class/...") app call */ first_addr = start_reg & (~0xf); end_addr = (end_reg & (~0xf)) + 0xf; cnt += sprintf(buf, "0x%08x: ", first_addr); for(i = first_addr; i < end_addr; i += 4) { if(i < start_reg || i > end_reg) cnt += sprintf(buf + cnt, " "); /* "0x12345678 ", 11 space*/ else cnt += sprintf(buf + cnt, "0x%08x ", R(i)); if((i & 0xc) == 0xc) { cnt += sprintf(buf + cnt, "\n"); if(i + 4 < end_addr) /* avoid the last blank line */ cnt += sprintf(buf + cnt, "0x%08x: ", i + 4); } } printk(KERN_INFO "%s, start 0x%08x, end 0x%08x, return %d\n", __func__, start_reg, end_reg, cnt); return cnt; }
static int __parse_str(char *str, u32 *out) { if ((str == NULL) || (out == NULL)) { printk(KERN_ERR "%s err, line %d\n", __func__, __LINE__); return -EINVAL; } if(strict_strtoul(str, 16, (long unsigned int *)out)) { printk(KERN_ERR "%s err, line %d\n", __func__, __LINE__); printk("str:%s\n", str); return -EINVAL; } if(!__addr_valid(*out) ) return -EINVAL; return 0; }