static ssize_t hdmi_reg_read( struct file *file, char __user *buff, size_t count, loff_t *ppos) { int len = 0; uint32 data; int i, j, off, dlen, num; char *bp, *cp; int tot = 0; if (*ppos) return 0; /* the end */ if (hdmi_msm_get_io_base() == 0) return 0; /* nothing to read */ j = 0; num = 0; bp = debug_buf; cp = (char *)(hdmi_msm_get_io_base() + hdmi_offset); dlen = sizeof(debug_buf); while (j++ < 16) { len = snprintf(bp, dlen, "0x%08x: ", (int)cp); tot += len; bp += len; dlen -= len; off = 0; i = 0; while (i++ < 4) { data = readl(cp + off); len = snprintf(bp, dlen, "%08x ", data); tot += len; bp += len; dlen -= len; off += 4; num++; if (num >= hdmi_count) break; } data = readl((u32)cp + off); *bp++ = '\n'; --dlen; tot++; cp += off; if (num >= hdmi_count) break; } *bp = 0; tot++; if (copy_to_user(buff, debug_buf, tot)) return -EFAULT; *ppos += tot; /* increase offset */ return tot; }
static ssize_t hdmi_reg_write( struct file *file, const char __user *buff, size_t count, loff_t *ppos) { uint32 off, data, base; int cnt; if (count >= sizeof(debug_buf)) return -EFAULT; if (copy_from_user(debug_buf, buff, count)) return -EFAULT; base = hdmi_msm_get_io_base(); if (base == 0) return -EFAULT; debug_buf[count] = 0; /* end of string */ cnt = sscanf(debug_buf, "%x %x", &off, &data); outpdw(data, base + off); wmb(); printk(KERN_INFO "%s: addr=%x data=%x\n", __func__, (int)(base+off), (int)data); return count; }