Skip to contentSkip to conversation

regmap: Add support for writing to regmap `registers'

PATCH In review Dimitris Papastamos 2 participants 3 messages Feb 22, 2012

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 2/3 regmap: Add support for writing to regmap `registers'

To enable writing to the regmap `registers' file, users will need to modify the source directly and #define REGMAP_ALLOW_WRITE_DEBUGFS. The reason for this is that it is dangerous to expose this functionality in general where clients could potentially be PMICs.

---
 drivers/base/regmap/regmap-debugfs.c |   39 ++++++++++++++++++++++++++++++++++
 1 files changed, 39 insertions(+), 0 deletions(-)
drivers/base/regmap/regmap-debugfs.c +39 -0
index f4ac8d6..656e81f 100644
@@ -103,9 +103,48 @@ out:
 	return ret;
 }
 
+#undef REGMAP_ALLOW_WRITE_DEBUGFS
+#ifdef REGMAP_ALLOW_WRITE_DEBUGFS
+/* This can be dangerous especially when we have clients such as
+ * PMICs, therefore don't provide any real compile time configuration option
+ * for this feature, people who want to use this will need to modify
+ * the source code directly. */
+static ssize_t regmap_map_write_file(struct file *file, const char __user *user_buf,
+				    size_t count, loff_t *ppos)
+{
+	char buf[32];
+	size_t buf_size;
+	char *start = buf;
+	unsigned long reg, value;
+	struct regmap *map = file->private_data;
+
+	buf_size = min(count, (sizeof(buf)-1));
+	if (copy_from_user(buf, user_buf, buf_size))
+		return -EFAULT;
+	buf[buf_size] = 0;
+
+	while (*start == ' ')
+		start++;
+	reg = simple_strtoul(start, &start, 16);
+	while (*start == ' ')
+		start++;
+	if (strict_strtoul(start, 16, &value))
+		return -EINVAL;
+
+	/* Userspace has been fiddling around behind the kernel's back */
+	add_taint(TAINT_USER);
+
+	regmap_write(map, reg, value);
+	return buf_size;
+}
+#endif
+
 static const struct file_operations regmap_map_fops = {
 	.open = regmap_open_file,
 	.read = regmap_map_read_file,
+#ifdef REGMAP_ALLOW_WRITE_DEBUGFS
+	.write = regmap_map_write_file,
+#endif
 	.llseek = default_llseek,
 };
 
Signature · 1 line
1.7.9.1
#1 lore raw
Quoted 4 lines · Dimitris Papastamos

To enable writing to the regmap `registers' file, users will need to modify the source directly and #define REGMAP_ALLOW_WRITE_DEBUGFS. The reason for this is that it is dangerous to expose this functionality in general where clients could potentially be PMICs.

Applied but...

drivers/base/regmap/regmap-debugfs.c out: · line 113

Quoted 2 lines
drivers/base/regmap/regmap-debugfs.c +2 -0
+static ssize_t regmap_map_write_file(struct file *file, const char __user *user_buf,
+				    size_t count, loff_t *ppos)

...with this wrapped into 80 columns.

drivers/base/regmap/regmap-debugfs.c out: · line 147

Quoted 6 lines

static const struct file_operations regmap_map_fops = {

drivers/base/regmap/regmap-debugfs.c +3 -0
 	.open = regmap_open_file,
 	.read = regmap_map_read_file,
+#ifdef REGMAP_ALLOW_WRITE_DEBUGFS
+	.write = regmap_map_write_file,
+#endif

It's also a bit more idiomatic to have an #else #define function NULL in the main ifdef for stuff like this; I'll fix that up as well.

#2 lore raw
Quoted 6 lines · Mark Brown
Quoted 5 lines · Dimitris Papastamos

To enable writing to the regmap `registers' file, users will need to modify the source directly and #define REGMAP_ALLOW_WRITE_DEBUGFS. The reason for this is that it is dangerous to expose this functionality in general where clients could potentially be PMICs.

Quoted 9 lines

drivers/base/regmap/regmap-debugfs.c out: · line 147

Quoted 6 lines

static const struct file_operations regmap_map_fops = {

drivers/base/regmap/regmap-debugfs.c +3 -0
 	.open = regmap_open_file,
 	.read = regmap_map_read_file,
+#ifdef REGMAP_ALLOW_WRITE_DEBUGFS
+	.write = regmap_map_write_file,
+#endif

It's also a bit more idiomatic to have an #else #define function NULL in the main ifdef for stuff like this; I'll fix that up as well.

Oops yea, that makes sense.

Thanks,
Dimitris