Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756004AbdCGSsW (ORCPT ); Tue, 7 Mar 2017 13:48:22 -0500 Received: from mga06.intel.com ([134.134.136.31]:39913 "EHLO mga06.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752144AbdCGSsT (ORCPT ); Tue, 7 Mar 2017 13:48:19 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,258,1486454400"; d="scan'208";a="73843134" Reply-To: thor.thayer@linux.intel.com Subject: Re: [PATCH] mfd: altr-a10sr: Add Arria10 SR sysfs attributes References: <1487094780-13403-1-git-send-email-thor.thayer@linux.intel.com> To: lee.jones@linaro.org Cc: linux-kernel@vger.kernel.org From: Thor Thayer Message-ID: <7d0f139d-014d-b8ca-22f2-d14c44845d39@linux.intel.com> Date: Tue, 7 Mar 2017 11:10:08 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 MIME-Version: 1.0 In-Reply-To: <1487094780-13403-1-git-send-email-thor.thayer@linux.intel.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4380 Lines: 149 Hi Lee, On 02/14/2017 11:53 AM, thor.thayer@linux.intel.com wrote: > From: Thor Thayer > > Add the Altera Arria10 DevKit sysfs attributes to the > MFD device. Update copyright and email. > > Signed-off-by: Thor Thayer > --- > 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 > + * Author: Thor Thayer > * > - * 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