From 77762d03e4c8164fcfdd2cade4985a938687c3a2 Mon Sep 17 00:00:00 2001 From: warmcat Date: Wed, 19 Nov 2008 17:09:35 +0000 Subject: debug-glamo-dump-regs.patch From: Andy Green Sigend-off-by: Andy Green --- drivers/mfd/glamo/glamo-core.c | 91 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) (limited to 'drivers/mfd/glamo/glamo-core.c') diff --git a/drivers/mfd/glamo/glamo-core.c b/drivers/mfd/glamo/glamo-core.c index 4d8e47f3e1e..accd933b62e 100644 --- a/drivers/mfd/glamo/glamo-core.c +++ b/drivers/mfd/glamo/glamo-core.c @@ -977,10 +977,92 @@ static int glamo_supported(struct glamo_core *glamo) return 1; } +static ssize_t regs_write(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long reg = simple_strtoul(buf, NULL, 10); + struct glamo_core *glamo = dev_get_drvdata(dev); + + while (*buf && (*buf != ' ')) + buf++; + if (*buf != ' ') + return -EINVAL; + while (*buf && (*buf == ' ')) + buf++; + if (!*buf) + return -EINVAL; + + printk(KERN_INFO"reg 0x%02lX <-- 0x%04lX\n", + reg, simple_strtoul(buf, NULL, 10)); + + __reg_write(glamo, reg, simple_strtoul(buf, NULL, 10)); + + return count; +} + +static ssize_t regs_read(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct glamo_core *glamo = dev_get_drvdata(dev); + int n, n1 = 0, r; + char * end = buf; + struct reg_range { + int start; + int count; + char * name; + }; + struct reg_range reg_range[] = { + { 0x0000, 0x200, "General" }, + { 0x0200, 0x100, "Host Bus" }, + { 0x0300, 0x100, "Memory" }, +/* { 0x0400, 0x100, "Sensor" }, + { 0x0500, 0x300, "ISP" }, + { 0x0800, 0x400, "JPEG" }, + { 0x0c00, 0x500, "MPEG" }, + { 0x1100, 0x400, "LCD" }, + { 0x1500, 0x080, "MPU 0" }, + { 0x1580, 0x080, "MPU 1" }, + { 0x1600, 0x080, "Command Queue" }, + { 0x1680, 0x080, "RISC CPU" }, + { 0x1700, 0x400, "2D Unit" }, + { 0x1b00, 0x900, "3D Unit" }, +*/ + }; + + spin_lock(&glamo->lock); + + for (r = 0; r < ARRAY_SIZE(reg_range); r++) { + n1 = 0; + end += sprintf(end, "\n%s\n\n", reg_range[r].name); + for (n = reg_range[r].start; + n < reg_range[r].start + reg_range[r].count; n += 2) { + if (((n1++) & 7) == 0) + end += sprintf(end, "\n%04X: ", + n + reg_range[r].start); + end += sprintf(end, "%04x ", __reg_read(glamo, n)); + } + end += sprintf(end, "\n"); + } + spin_unlock(&glamo->lock); + + return end - buf; +} + +static DEVICE_ATTR(regs, 0644, regs_read, regs_write); +static struct attribute *glamo_sysfs_entries[] = { + &dev_attr_regs.attr, + NULL +}; +static struct attribute_group glamo_attr_group = { + .name = NULL, + .attrs = glamo_sysfs_entries, +}; + + static int __init glamo_probe(struct platform_device *pdev) { - int rc, irq; + int rc = 0, irq; struct glamo_core *glamo; if (glamo_handle) { @@ -1080,6 +1162,12 @@ static int __init glamo_probe(struct platform_device *pdev) goto out_free; } + rc = sysfs_create_group(&pdev->dev.kobj, &glamo_attr_group); + if (rc < 0) { + dev_err(&pdev->dev, "cannot create sysfs group\n"); + goto out_free; + } + platform_set_drvdata(pdev, glamo); dev_dbg(&glamo->pdev->dev, "running init script\n"); @@ -1103,6 +1191,7 @@ static int __init glamo_probe(struct platform_device *pdev) glamo->irq_works = 1; } else glamo->irq_works = 0; + return 0; out_free: -- cgit v1.2.3