static ssize_t sunxi_debugreg_write_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { unsigned long addr, value; int err, len; const char *s = NULL; char addrstr[16]; s = strchr(buf, ':'); if( s == NULL) { printk("Wrong format, no :, please cat write to see readme\n"); return count; } len = s - buf; sunxi_reg_dbg("len: %d\n", len); if( len != 8 && len != 10) { printk("Invalid address length, please cat write to see readme\n"); return count; } strncpy(addrstr, buf, len); addrstr[len] = '\0'; sunxi_reg_dbg("addrstr: %s\n", addrstr); err = strict_strtoul(addrstr, 16, &addr); sunxi_reg_dbg("addr: 0x%lx\n", addr); if(err) { printk("Invalid address, please cat write to see readme\n"); return count; } /* value starts after the : */ len = strlen(s+1); sunxi_reg_dbg("s+1 length: %d\n", len); if( len > 11) { printk("Invalid value length, please cat read to see readme\n"); return count; } err = strict_strtoul(s+1, 16, &value); sunxi_reg_dbg("value: 0x%lx\n", value); if(err) { printk("Invalid value, please cat write to see readme\n"); return count; } if(addr < 0xf0000000) { printk("Please use virtual address!!!\n"); return count; } writel(value, addr); return count; }
static void __exit sunxi_reg_exit(void) { sunxi_reg_dbg("Bye, sunxi_reg exit\n"); misc_deregister(&sunxi_reg_dev); sysfs_remove_group(&sunxi_reg_dev.this_device->kobj, &sunxi_reg_attribute_group); }