[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <7d0f139d-014d-b8ca-22f2-d14c44845d39@linux.intel.com>
Date: Tue, 7 Mar 2017 11:10:08 -0600
From: Thor Thayer <thor.thayer@...ux.intel.com>
To: lee.jones@...aro.org
Cc: linux-kernel@...r.kernel.org
Subject: Re: [PATCH] mfd: altr-a10sr: Add Arria10 SR sysfs attributes
Hi Lee,
On 02/14/2017 11:53 AM, thor.thayer@...ux.intel.com wrote:
> From: Thor Thayer <thor.thayer@...ux.intel.com>
>
> Add the Altera Arria10 DevKit sysfs attributes to the
> MFD device. Update copyright and email.
>
> Signed-off-by: Thor Thayer <thor.thayer@...ux.intel.com>
> ---
> 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@...nsource.altera.com>
> + * Author: Thor Thayer <thor.thayer@...ux.intel.com>
> *
> - * 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;
> }
>
Any comments on this patch?
Thanks,
Thor
Powered by blists - more mailing lists