From: Thor Thayer <thor.thayer@xxxxxxxxxxxxxxx>Any comments on this patch?
Add the Altera Arria10 DevKit sysfs attributes to the
MFD device. Update copyright and email.
Signed-off-by: Thor Thayer <thor.thayer@xxxxxxxxxxxxxxx>
---
drivers/mfd/altera-a10sr.c | 98 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 95 insertions(+), 3 deletions(-)
diff --git a/drivers/mfd/altera-a10sr.c b/drivers/mfd/altera-a10sr.c
index 06e1f7f..8c51818 100644
--- a/drivers/mfd/altera-a10sr.c
+++ b/drivers/mfd/altera-a10sr.c
@@ -1,9 +1,9 @@
/*
* Altera Arria10 DevKit System Resource MFD Driver
*
- * Author: Thor Thayer <tthayer@xxxxxxxxxxxxxxxxxxxxx>
+ * Author: Thor Thayer <thor.thayer@xxxxxxxxxxxxxxx>
*
- * Copyright Intel Corporation (C) 2014-2016. All Rights Reserved
+ * Copyright Intel Corporation (C) 2014-2017. All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
@@ -35,6 +35,89 @@
},
};
+/* Add sysfs interface for MAX5 System Resource Controller */
+static unsigned int a10sr_reg_addr;
+static ssize_t a10sr_reg_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return sprintf(buf, "0x%02x\n", a10sr_reg_addr);
+}
+
+static ssize_t a10sr_reg_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ int ret = kstrtouint(buf, 0, &a10sr_reg_addr);
+
+ if (ret || (a10sr_reg_addr < 0) ||
+ (a10sr_reg_addr > ALTR_A10SR_PMBUS_REG)) {
+ a10sr_reg_addr = 0;
+ dev_err(dev, "Invalid register address\n");
+ return -EINVAL;
+ }
+ return (ssize_t)count;
+}
+
+static ssize_t a10sr_val_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int ret;
+ unsigned int val;
+ struct altr_a10sr *a10sr_regs = dev_get_drvdata(dev);
+
+ ret = regmap_read(a10sr_regs->regmap, a10sr_reg_addr, &val);
+ if (ret < 0) {
+ dev_err(dev, "Failed to read 0x%x\n", a10sr_reg_addr);
+ return -EIO;
+ }
+
+ return sprintf(buf, "0x%02x\n", val);
+}
+
+static ssize_t a10sr_val_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ int ret;
+ unsigned int val;
+ struct altr_a10sr *a10sr_regs = dev_get_drvdata(dev);
+
+ ret = kstrtouint(buf, 0, &val);
+ if (ret)
+ return ret;
+
+ ret = regmap_write(a10sr_regs->regmap, a10sr_reg_addr, val);
+ if (ret) {
+ dev_err(dev, "Failed to write value 0x%02x to address 0x%x",
+ val, a10sr_reg_addr);
+ return -EIO;
+ }
+ return count;
+}
+
+static ssize_t a10sr_version(struct device *dev,
+ struct device_attribute *devattr, char *buf)
+{
+ a10sr_reg_addr = ALTR_A10SR_VERSION_READ;
+ return a10sr_val_show(dev, devattr, buf);
+}
+
+/* Define FS entries */
+static DEVICE_ATTR(max5_version, 0444, a10sr_version, NULL);
+static DEVICE_ATTR(max5_address, 0644, a10sr_reg_show, a10sr_reg_store);
+static DEVICE_ATTR(max5_value, 0644, a10sr_val_show, a10sr_val_store);
+
+static struct attribute *altr_a10sr_attr[] = {
+ &dev_attr_max5_version.attr,
+ &dev_attr_max5_address.attr,
+ &dev_attr_max5_value.attr,
+ NULL
+};
+
+static const struct attribute_group a10sr_attr_group = {
+ .attrs = altr_a10sr_attr,
+};
+
static bool altr_a10sr_reg_readable(struct device *dev, unsigned int reg)
{
switch (reg) {
@@ -141,13 +224,22 @@ static int altr_a10sr_spi_probe(struct spi_device *spi)
return ret;
}
+ /* Add the A10SR Registers to the device's sysfs */
+ ret = sysfs_create_group(&a10sr->dev->kobj, &a10sr_attr_group);
+ if (ret) {
+ dev_err(&spi->dev, "unable to create sysfs attributes\n");
+ return ret;
+ }
+
ret = devm_mfd_add_devices(a10sr->dev, PLATFORM_DEVID_AUTO,
altr_a10sr_subdev_info,
ARRAY_SIZE(altr_a10sr_subdev_info),
NULL, 0, NULL);
- if (ret)
+ if (ret) {
dev_err(a10sr->dev, "Failed to register sub-devices: %d\n",
ret);
+ sysfs_remove_group(&a10sr->dev->kobj, &a10sr_attr_group);
+ }
return ret;
}