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;
}
Esempio n. 2
0
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);
}