diff for duplicates of <20160330115106.GJ3323@x1> diff --git a/a/1.txt b/N1/1.txt index 71355bc..dcce4c2 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,16 +1,17 @@ -On Tue, 29 Mar 2016, tthayer@opensource.altera.com wrote: +On Tue, 29 Mar 2016, ttha...@opensource.altera.com wrote: -> From: Thor Thayer <tthayer@opensource.altera.com> +> From: Thor Thayer <ttha...@opensource.altera.com> > > Add support for the Altera Arria10 Development Kit System Resource > chip which is implemented using a MAX5 as a external gpio extender, > and hardware monitor with the regmap framework over a SPI bus. > -> Signed-off-by: Thor Thayer <tthayer@opensource.altera.com> +> Signed-off-by: Thor Thayer <ttha...@opensource.altera.com> > --- > drivers/mfd/Kconfig | 11 +++ > drivers/mfd/Makefile | 2 + -> drivers/mfd/altera-a10sr.c | 177 ++++++++++++++++++++++++++++++++++++++ +> drivers/mfd/altera-a10sr.c | 177 +> ++++++++++++++++++++++++++++++++++++++ > include/linux/mfd/altera-a10sr.h | 146 +++++++++++++++++++++++++++++++ > 4 files changed, 336 insertions(+) > create mode 100644 drivers/mfd/altera-a10sr.c @@ -21,7 +22,7 @@ On Tue, 29 Mar 2016, tthayer@opensource.altera.com wrote: > --- a/drivers/mfd/Kconfig > +++ b/drivers/mfd/Kconfig > @@ -18,6 +18,17 @@ config MFD_CS5535 -> This is the core driver for CS5535/CS5536 MFD functions. This is +> This is the core driver for CS5535/CS5536 MFD functions. This is > necessary for using the board's GPIO and MFGPT functionality. > > +config MFD_ALTERA_A10SR @@ -39,18 +40,19 @@ Depends on OF ? > + hw monitor. > + > config MFD_ACT8945A -> tristate "Active-semi ACT8945A" -> select MFD_CORE +> tristate "Active-semi ACT8945A" +> select MFD_CORE > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile > index 5eaa6465d..4f1ff91 100644 > --- a/drivers/mfd/Makefile > +++ b/drivers/mfd/Makefile -> @@ -203,3 +203,5 @@ intel-soc-pmic-objs := intel_soc_pmic_core.o intel_soc_pmic_crc.o -> intel-soc-pmic-$(CONFIG_INTEL_PMC_IPC) += intel_soc_pmic_bxtwc.o -> obj-$(CONFIG_INTEL_SOC_PMIC) += intel-soc-pmic.o -> obj-$(CONFIG_MFD_MT6397) += mt6397-core.o +> @@ -203,3 +203,5 @@ intel-soc-pmic-objs := +> intel_soc_pmic_core.o intel_soc_pmic_crc.o +> intel-soc-pmic-$(CONFIG_INTEL_PMC_IPC) += intel_soc_pmic_bxtwc.o +> obj-$(CONFIG_INTEL_SOC_PMIC) += intel-soc-pmic.o +> obj-$(CONFIG_MFD_MT6397) += mt6397-core.o > + -> +obj-$(CONFIG_MFD_ALTERA_A10SR) += altera-a10sr.o +> +obj-$(CONFIG_MFD_ALTERA_A10SR) += altera-a10sr.o > diff --git a/drivers/mfd/altera-a10sr.c b/drivers/mfd/altera-a10sr.c > new file mode 100644 > index 0000000..13665d4 @@ -69,7 +71,8 @@ Depends on OF ? > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > + * more details. > + * -> + * You should have received a copy of the GNU General Public License along with +> + * You should have received a copy of the GNU General Public License along +> with > + * this program. If not, see <http://www.gnu.org/licenses/>. Any chance you can use the shorter copyright header? @@ -78,7 +81,7 @@ Any chance you can use the shorter copyright header? > + * > + * Adapted from DA9052 > + * Copyright(c) 2011 Dialog Semiconductor Ltd. -> + * Author: David Dajun Chen <dchen@diasemi.com> +> + * Author: David Dajun Chen <dc...@diasemi.com> > + */ > + > +#include <linux/device.h> @@ -97,158 +100,158 @@ Eh? What's the point of this? > +static bool altr_a10sr_reg_readable(struct device *dev, unsigned int reg) > +{ -> + switch (reg) { -> + case ALTR_A10SR_VERSION_READ: -> + case ALTR_A10SR_LED_RD_REG: -> + case ALTR_A10SR_PBDSW_RD_REG: -> + case ALTR_A10SR_PBDSW_IRQ_CLR_REG: -> + case ALTR_A10SR_PBDSW_IRQ_RD_REG: -> + case ALTR_A10SR_PWR_GOOD1_RD_REG: -> + case ALTR_A10SR_PWR_GOOD2_RD_REG: -> + case ALTR_A10SR_PWR_GOOD3_RD_REG: -> + case ALTR_A10SR_FMCAB_RD_REG: -> + case ALTR_A10SR_HPS_RST_RD_REG: -> + case ALTR_A10SR_USB_QSPI_RD_REG: -> + case ALTR_A10SR_SFPA_RD_REG: -> + case ALTR_A10SR_SFPB_RD_REG: -> + case ALTR_A10SR_I2C_M_RD_REG: -> + case ALTR_A10SR_WARM_RST_RD_REG: -> + case ALTR_A10SR_WR_KEY_RD_REG: -> + case ALTR_A10SR_PMBUS_RD_REG: -> + return true; -> + default: -> + return false; -> + } +> + switch (reg) { +> + case ALTR_A10SR_VERSION_READ: +> + case ALTR_A10SR_LED_RD_REG: +> + case ALTR_A10SR_PBDSW_RD_REG: +> + case ALTR_A10SR_PBDSW_IRQ_CLR_REG: +> + case ALTR_A10SR_PBDSW_IRQ_RD_REG: +> + case ALTR_A10SR_PWR_GOOD1_RD_REG: +> + case ALTR_A10SR_PWR_GOOD2_RD_REG: +> + case ALTR_A10SR_PWR_GOOD3_RD_REG: +> + case ALTR_A10SR_FMCAB_RD_REG: +> + case ALTR_A10SR_HPS_RST_RD_REG: +> + case ALTR_A10SR_USB_QSPI_RD_REG: +> + case ALTR_A10SR_SFPA_RD_REG: +> + case ALTR_A10SR_SFPB_RD_REG: +> + case ALTR_A10SR_I2C_M_RD_REG: +> + case ALTR_A10SR_WARM_RST_RD_REG: +> + case ALTR_A10SR_WR_KEY_RD_REG: +> + case ALTR_A10SR_PMBUS_RD_REG: +> + return true; +> + default: +> + return false; +> + } > +} > + > +static bool altr_a10sr_reg_writeable(struct device *dev, unsigned int reg) > +{ -> + switch (reg) { -> + case ALTR_A10SR_LED_WR_REG: -> + case ALTR_A10SR_PBDSW_IRQ_CLR_REG: -> + case ALTR_A10SR_FMCAB_WR_REG: -> + case ALTR_A10SR_HPS_RST_WR_REG: -> + case ALTR_A10SR_USB_QSPI_WR_REG: -> + case ALTR_A10SR_SFPA_WR_REG: -> + case ALTR_A10SR_SFPB_WR_REG: -> + case ALTR_A10SR_WARM_RST_WR_REG: -> + case ALTR_A10SR_WR_KEY_WR_REG: -> + case ALTR_A10SR_PMBUS_WR_REG: -> + return true; -> + default: -> + return false; -> + } +> + switch (reg) { +> + case ALTR_A10SR_LED_WR_REG: +> + case ALTR_A10SR_PBDSW_IRQ_CLR_REG: +> + case ALTR_A10SR_FMCAB_WR_REG: +> + case ALTR_A10SR_HPS_RST_WR_REG: +> + case ALTR_A10SR_USB_QSPI_WR_REG: +> + case ALTR_A10SR_SFPA_WR_REG: +> + case ALTR_A10SR_SFPB_WR_REG: +> + case ALTR_A10SR_WARM_RST_WR_REG: +> + case ALTR_A10SR_WR_KEY_WR_REG: +> + case ALTR_A10SR_PMBUS_WR_REG: +> + return true; +> + default: +> + return false; +> + } > +} > + > +static bool altr_a10sr_reg_volatile(struct device *dev, unsigned int reg) > +{ -> + switch (reg) { -> + case ALTR_A10SR_PBDSW_RD_REG: -> + case ALTR_A10SR_PBDSW_IRQ_RD_REG: -> + case ALTR_A10SR_PWR_GOOD1_RD_REG: -> + case ALTR_A10SR_PWR_GOOD2_RD_REG: -> + case ALTR_A10SR_PWR_GOOD3_RD_REG: -> + case ALTR_A10SR_HPS_RST_RD_REG: -> + case ALTR_A10SR_I2C_M_RD_REG: -> + case ALTR_A10SR_WARM_RST_RD_REG: -> + case ALTR_A10SR_WR_KEY_RD_REG: -> + case ALTR_A10SR_PMBUS_RD_REG: -> + return true; -> + default: -> + return false; -> + } +> + switch (reg) { +> + case ALTR_A10SR_PBDSW_RD_REG: +> + case ALTR_A10SR_PBDSW_IRQ_RD_REG: +> + case ALTR_A10SR_PWR_GOOD1_RD_REG: +> + case ALTR_A10SR_PWR_GOOD2_RD_REG: +> + case ALTR_A10SR_PWR_GOOD3_RD_REG: +> + case ALTR_A10SR_HPS_RST_RD_REG: +> + case ALTR_A10SR_I2C_M_RD_REG: +> + case ALTR_A10SR_WARM_RST_RD_REG: +> + case ALTR_A10SR_WR_KEY_RD_REG: +> + case ALTR_A10SR_PMBUS_RD_REG: +> + return true; +> + default: +> + return false; +> + } > +} > + > +const struct regmap_config altr_a10sr_regmap_config = { -> + .reg_bits = 8, -> + .val_bits = 8, +> + .reg_bits = 8, +> + .val_bits = 8, > + -> + .cache_type = REGCACHE_NONE, +> + .cache_type = REGCACHE_NONE, > + -> + .use_single_rw = true, -> + .read_flag_mask = 1, -> + .write_flag_mask = 0, +> + .use_single_rw = true, +> + .read_flag_mask = 1, +> + .write_flag_mask = 0, > + -> + .max_register = ALTR_A10SR_WR_KEY_RD_REG, -> + .readable_reg = altr_a10sr_reg_readable, -> + .writeable_reg = altr_a10sr_reg_writeable, -> + .volatile_reg = altr_a10sr_reg_volatile, +> + .max_register = ALTR_A10SR_WR_KEY_RD_REG, +> + .readable_reg = altr_a10sr_reg_readable, +> + .writeable_reg = altr_a10sr_reg_writeable, +> + .volatile_reg = altr_a10sr_reg_volatile, > + > +}; > + > +static int altr_a10sr_spi_probe(struct spi_device *spi) > +{ -> + int ret; -> + struct altr_a10sr *a10sr; +> + int ret; +> + struct altr_a10sr *a10sr; > + -> + a10sr = devm_kzalloc(&spi->dev, sizeof(*a10sr), -> + GFP_KERNEL); -> + if (!a10sr) -> + return -ENOMEM; +> + a10sr = devm_kzalloc(&spi->dev, sizeof(*a10sr), +> + GFP_KERNEL); +> + if (!a10sr) +> + return -ENOMEM; > + -> + spi->mode = SPI_MODE_3; -> + spi->bits_per_word = 8; -> + spi_setup(spi); +> + spi->mode = SPI_MODE_3; +> + spi->bits_per_word = 8; +> + spi_setup(spi); > + -> + a10sr->dev = &spi->dev; +> + a10sr->dev = &spi->dev; > + -> + spi_set_drvdata(spi, a10sr); +> + spi_set_drvdata(spi, a10sr); > + -> + a10sr->regmap = devm_regmap_init_spi(spi, &altr_a10sr_regmap_config); -> + if (IS_ERR(a10sr->regmap)) { -> + ret = PTR_ERR(a10sr->regmap); -> + dev_err(&spi->dev, "Allocate register map Failed: %d\n", ret); +> + a10sr->regmap = devm_regmap_init_spi(spi, &altr_a10sr_regmap_config); +> + if (IS_ERR(a10sr->regmap)) { +> + ret = PTR_ERR(a10sr->regmap); +> + dev_err(&spi->dev, "Allocate register map Failed: %d\n", ret); Proper English would be better. "Failed to allocate register map" -> + return ret; -> + } +> + return ret; +> + } > + -> + ret = mfd_add_devices(a10sr->dev, PLATFORM_DEVID_AUTO, -> + altr_a10sr_subdev_info, -> + ARRAY_SIZE(altr_a10sr_subdev_info), -> + NULL, 0, NULL); +> + ret = mfd_add_devices(a10sr->dev, PLATFORM_DEVID_AUTO, +> + altr_a10sr_subdev_info, +> + ARRAY_SIZE(altr_a10sr_subdev_info), +> + NULL, 0, NULL); This call does, precisely, nothing. -> + if (ret) -> + dev_err(a10sr->dev, "mfd_add_devices failed: %d\n", ret); +> + if (ret) +> + dev_err(a10sr->dev, "mfd_add_devices failed: %d\n", ret); Users don't care about function names. "Failed to register sub-devices" would be better. -> + return ret; +> + return ret; > +} > + > +static int altr_a10sr_spi_remove(struct spi_device *spi) > +{ -> + mfd_remove_devices(&spi->dev); +> + mfd_remove_devices(&spi->dev); > + -> + return 0; +> + return 0; > +} > + > +static const struct of_device_id altr_a10sr_spi_of_match[] = { -> + { .compatible = "altr,altr-a10sr" }, +> + { .compatible = "altr,altr-a10sr" }, I'm thinking that putting "altr" twice is unnecessary. -> + { }, +> + { }, > +}; > +MODULE_DEVICE_TABLE(of, altr_a10sr_spi_of_match); > + > +static struct spi_driver altr_a10sr_spi_driver = { -> + .probe = altr_a10sr_spi_probe, -> + .remove = altr_a10sr_spi_remove, -> + .driver = { -> + .name = "altr_a10sr", -> + .of_match_table = altr_a10sr_spi_of_match, +> + .probe = altr_a10sr_spi_probe, +> + .remove = altr_a10sr_spi_remove, +> + .driver = { +> + .name = "altr_a10sr", +> + .of_match_table = altr_a10sr_spi_of_match, of_match_ptr()? -> + }, +> + }, > +}; > + > +module_spi_driver(altr_a10sr_spi_driver); @@ -259,7 +262,8 @@ of_match_ptr()? Email. > +MODULE_DESCRIPTION("Altera Arria10 DevKit System Resource MFD Driver"); -> diff --git a/include/linux/mfd/altera-a10sr.h b/include/linux/mfd/altera-a10sr.h +> diff --git a/include/linux/mfd/altera-a10sr.h +> b/include/linux/mfd/altera-a10sr.h > new file mode 100644 > index 0000000..7087afc > --- /dev/null @@ -277,7 +281,8 @@ Email. > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > + * more details. > + * -> + * You should have received a copy of the GNU General Public License along with +> + * You should have received a copy of the GNU General Public License along +> with > + * this program. If not, see <http://www.gnu.org/licenses/>. Shorter Copyright? @@ -286,7 +291,7 @@ Shorter Copyright? > + * > + * Adapted from DA9052 > + * Copyright(c) 2011 Dialog Semiconductor Ltd. -> + * Author: David Dajun Chen <dchen@diasemi.com> +> + * Author: David Dajun Chen <dc...@diasemi.com> > + */ > + > +#ifndef __MFD_ALTERA_A10SR_H @@ -311,7 +316,8 @@ Alphabetical please. > + * the number of GPIO in each register. We then need to multiply > + * by 2 because the reads are at odd addresses. > + */ -> +#define ALTR_A10SR_REG_OFFSET(X) (((X) / ALTR_A10SR_BITS_PER_REGISTER) << 1) +> +#define ALTR_A10SR_REG_OFFSET(X) (((X) / ALTR_A10SR_BITS_PER_REGISTER) +> << 1) > +#define ALTR_A10SR_REG_BIT(X) ((X) % ALTR_A10SR_BITS_PER_REGISTER) > +#define ALTR_A10SR_REG_BIT_CHG(X, Y) ((X) << ALTR_A10SR_REG_BIT(Y)) > +#define ALTR_A10SR_REG_BIT_MASK(X) (1 << ALTR_A10SR_REG_BIT(X)) @@ -346,75 +352,75 @@ Alphabetical please. > +#define ALTR_A10SR_PMBUS_RD_REG 0x1F /* HPS PM Bus */ > + > +struct altr_a10sr { -> + struct device *dev; -> + struct regmap *regmap; +> + struct device *dev; +> + struct regmap *regmap; > +}; > + > +/* Device I/O API */ > +static inline int altr_a10sr_reg_read(struct altr_a10sr *a10sr, -> + unsigned char reg) +> + unsigned char reg) > +{ -> + int val, ret; +> + int val, ret; > + -> + ret = regmap_read(a10sr->regmap, (reg | READ_REG_MASK), &val); -> + if (ret < 0) -> + return ret; +> + ret = regmap_read(a10sr->regmap, (reg | READ_REG_MASK), &val); +> + if (ret < 0) +> + return ret; > + -> + return val; +> + return val; > +} > + > +static inline int altr_a10sr_reg_write(struct altr_a10sr *a10sr, -> + unsigned char reg, unsigned char val) +> + unsigned char reg, unsigned char val) > +{ -> + int ret; +> + int ret; > + -> + ret = regmap_write(a10sr->regmap, (reg & WRITE_REG_MASK), val); -> + if (ret < 0) -> + return ret; +> + ret = regmap_write(a10sr->regmap, (reg & WRITE_REG_MASK), val); +> + if (ret < 0) +> + return ret; > + -> + return ret; +> + return ret; > +} > + > +static inline int altr_a10sr_group_read(struct altr_a10sr *a10sr, -> + unsigned char reg, -> + unsigned int reg_cnt, -> + unsigned char *val) +> + unsigned char reg, +> + unsigned int reg_cnt, +> + unsigned char *val) > +{ -> + return regmap_bulk_read(a10sr->regmap, reg, val, reg_cnt); +> + return regmap_bulk_read(a10sr->regmap, reg, val, reg_cnt); > +} > + > +static inline int altr_a10sr_group_write(struct altr_a10sr *a10sr, -> + unsigned char reg, -> + unsigned int reg_cnt, -> + unsigned char *val) +> + unsigned char reg, +> + unsigned int reg_cnt, +> + unsigned char *val) > +{ -> + return regmap_bulk_write(a10sr->regmap, reg, val, reg_cnt); +> + return regmap_bulk_write(a10sr->regmap, reg, val, reg_cnt); > +} All of the above are completely superfluous. Just use the regmap_* API directly. > +static inline int altr_a10sr_reg_update(struct altr_a10sr *a10sr, -> + unsigned char reg, -> + unsigned char bit_mask, -> + unsigned char reg_val) +> + unsigned char reg, +> + unsigned char bit_mask, +> + unsigned char reg_val) > +{ -> + int rval, ret; +> + int rval, ret; > + -> + /* -> + * We can't use the standard regmap_update_bits function because -> + * the read register has a different address than the write register. -> + * Therefore, just do a read, modify, write operation here. -> + */ -> + ret = regmap_read(a10sr->regmap, (reg | READ_REG_MASK), &rval); -> + if (ret < 0) -> + return ret; +> + /* +> + * We can't use the standard regmap_update_bits function because +> + * the read register has a different address than the write register. +> + * Therefore, just do a read, modify, write operation here. +> + */ +> + ret = regmap_read(a10sr->regmap, (reg | READ_REG_MASK), &rval); +> + if (ret < 0) +> + return ret; > + -> + rval = ((rval & ~bit_mask) | (reg_val & bit_mask)); +> + rval = ((rval & ~bit_mask) | (reg_val & bit_mask)); > + -> + ret = regmap_write(a10sr->regmap, (reg & WRITE_REG_MASK), rval); +> + ret = regmap_write(a10sr->regmap, (reg & WRITE_REG_MASK), rval); > + -> + return ret; +> + return ret; > +} Why can't you use the Regmap update function(s)? @@ -424,9 +430,9 @@ Why can't you use the Regmap update function(s)? -- Lee Jones Linaro STMicroelectronics Landing Team Lead -Linaro.org │ Open source software for ARM SoCs +Linaro.org â Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog -- -To unsubscribe from this list: send the line "unsubscribe linux-gpio" in -the body of a message to majordomo@vger.kernel.org +To unsubscribe from this list: send the line "unsubscribe linux-hwmon" in +the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/a/content_digest b/N1/content_digest index 661ec31..14ab5ff 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -1,36 +1,24 @@ "ref\01459278791-3646-1-git-send-email-tthayer@opensource.altera.com\0" - "ref\01459278791-3646-4-git-send-email-tthayer@opensource.altera.com\0" "From\0Lee Jones <lee.jones@linaro.org>\0" "Subject\0Re: [RFC 3/8] mfd: altr_a10sr: Add Altera Arria10 DevKit System Resource Chip\0" - "Date\0Wed, 30 Mar 2016 12:51:06 +0100\0" - "To\0tthayer@opensource.altera.com\0" - "Cc\0linus.walleij@linaro.org" - gnurou@gmail.com - jdelvare@suse.com - linux@roeck-us.net - robh+dt@kernel.org - pawell.moll@arm.com - mark.rutland@arm.com - ijc+devicetree@hellion.org.uk - dinguyen@opensource.altera.com - linux-gpio@vger.kernel.org - linux-hwmon@vger.kernel.org - " devicetree@vger.kernel.org\0" + "Date\0Wed, 30 Mar 2016 04:51:45 -0700\0" + "To\0linux-hwmon@vger.kernel.org\0" "\00:1\0" "b\0" - "On Tue, 29 Mar 2016, tthayer@opensource.altera.com wrote:\n" + "On Tue, 29 Mar 2016, ttha...@opensource.altera.com wrote:\n" "\n" - "> From: Thor Thayer <tthayer@opensource.altera.com>\n" + "> From: Thor Thayer <ttha...@opensource.altera.com>\n" "> \n" "> Add support for the Altera Arria10 Development Kit System Resource\n" "> chip which is implemented using a MAX5 as a external gpio extender,\n" "> and hardware monitor with the regmap framework over a SPI bus.\n" "> \n" - "> Signed-off-by: Thor Thayer <tthayer@opensource.altera.com>\n" + "> Signed-off-by: Thor Thayer <ttha...@opensource.altera.com>\n" "> ---\n" "> drivers/mfd/Kconfig | 11 +++\n" "> drivers/mfd/Makefile | 2 +\n" - "> drivers/mfd/altera-a10sr.c | 177 ++++++++++++++++++++++++++++++++++++++\n" + "> drivers/mfd/altera-a10sr.c | 177 \n" + "> ++++++++++++++++++++++++++++++++++++++\n" "> include/linux/mfd/altera-a10sr.h | 146 +++++++++++++++++++++++++++++++\n" "> 4 files changed, 336 insertions(+)\n" "> create mode 100644 drivers/mfd/altera-a10sr.c\n" @@ -41,7 +29,7 @@ "> --- a/drivers/mfd/Kconfig\n" "> +++ b/drivers/mfd/Kconfig\n" "> @@ -18,6 +18,17 @@ config MFD_CS5535\n" - "> \t This is the core driver for CS5535/CS5536 MFD functions. This is\n" + "> This is the core driver for CS5535/CS5536 MFD functions. This is\n" "> necessary for using the board's GPIO and MFGPT functionality.\n" "> \n" "> +config MFD_ALTERA_A10SR\n" @@ -59,18 +47,19 @@ "> + hw monitor.\n" "> +\n" "> config MFD_ACT8945A\n" - "> \ttristate \"Active-semi ACT8945A\"\n" - "> \tselect MFD_CORE\n" + "> tristate \"Active-semi ACT8945A\"\n" + "> select MFD_CORE\n" "> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile\n" "> index 5eaa6465d..4f1ff91 100644\n" "> --- a/drivers/mfd/Makefile\n" "> +++ b/drivers/mfd/Makefile\n" - "> @@ -203,3 +203,5 @@ intel-soc-pmic-objs\t\t:= intel_soc_pmic_core.o intel_soc_pmic_crc.o\n" - "> intel-soc-pmic-$(CONFIG_INTEL_PMC_IPC)\t+= intel_soc_pmic_bxtwc.o\n" - "> obj-$(CONFIG_INTEL_SOC_PMIC)\t+= intel-soc-pmic.o\n" - "> obj-$(CONFIG_MFD_MT6397)\t+= mt6397-core.o\n" + "> @@ -203,3 +203,5 @@ intel-soc-pmic-objs := \n" + "> intel_soc_pmic_core.o intel_soc_pmic_crc.o\n" + "> intel-soc-pmic-$(CONFIG_INTEL_PMC_IPC) += intel_soc_pmic_bxtwc.o\n" + "> obj-$(CONFIG_INTEL_SOC_PMIC) += intel-soc-pmic.o\n" + "> obj-$(CONFIG_MFD_MT6397) += mt6397-core.o\n" "> +\n" - "> +obj-$(CONFIG_MFD_ALTERA_A10SR)\t+= altera-a10sr.o\n" + "> +obj-$(CONFIG_MFD_ALTERA_A10SR) += altera-a10sr.o\n" "> diff --git a/drivers/mfd/altera-a10sr.c b/drivers/mfd/altera-a10sr.c\n" "> new file mode 100644\n" "> index 0000000..13665d4\n" @@ -89,7 +78,8 @@ "> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n" "> + * more details.\n" "> + *\n" - "> + * You should have received a copy of the GNU General Public License along with\n" + "> + * You should have received a copy of the GNU General Public License along \n" + "> with\n" "> + * this program. If not, see <http://www.gnu.org/licenses/>.\n" "\n" "Any chance you can use the shorter copyright header?\n" @@ -98,7 +88,7 @@ "> + *\n" "> + * Adapted from DA9052\n" "> + * Copyright(c) 2011 Dialog Semiconductor Ltd.\n" - "> + * Author: David Dajun Chen <dchen@diasemi.com>\n" + "> + * Author: David Dajun Chen <dc...@diasemi.com>\n" "> + */\n" "> +\n" "> +#include <linux/device.h>\n" @@ -117,158 +107,158 @@ "\n" "> +static bool altr_a10sr_reg_readable(struct device *dev, unsigned int reg)\n" "> +{\n" - "> +\tswitch (reg) {\n" - "> +\tcase ALTR_A10SR_VERSION_READ:\n" - "> +\tcase ALTR_A10SR_LED_RD_REG:\n" - "> +\tcase ALTR_A10SR_PBDSW_RD_REG:\n" - "> +\tcase ALTR_A10SR_PBDSW_IRQ_CLR_REG:\n" - "> +\tcase ALTR_A10SR_PBDSW_IRQ_RD_REG:\n" - "> +\tcase ALTR_A10SR_PWR_GOOD1_RD_REG:\n" - "> +\tcase ALTR_A10SR_PWR_GOOD2_RD_REG:\n" - "> +\tcase ALTR_A10SR_PWR_GOOD3_RD_REG:\n" - "> +\tcase ALTR_A10SR_FMCAB_RD_REG:\n" - "> +\tcase ALTR_A10SR_HPS_RST_RD_REG:\n" - "> +\tcase ALTR_A10SR_USB_QSPI_RD_REG:\n" - "> +\tcase ALTR_A10SR_SFPA_RD_REG:\n" - "> +\tcase ALTR_A10SR_SFPB_RD_REG:\n" - "> +\tcase ALTR_A10SR_I2C_M_RD_REG:\n" - "> +\tcase ALTR_A10SR_WARM_RST_RD_REG:\n" - "> +\tcase ALTR_A10SR_WR_KEY_RD_REG:\n" - "> +\tcase ALTR_A10SR_PMBUS_RD_REG:\n" - "> +\t\treturn true;\n" - "> +\tdefault:\n" - "> +\t\treturn false;\n" - "> +\t}\n" + "> + switch (reg) {\n" + "> + case ALTR_A10SR_VERSION_READ:\n" + "> + case ALTR_A10SR_LED_RD_REG:\n" + "> + case ALTR_A10SR_PBDSW_RD_REG:\n" + "> + case ALTR_A10SR_PBDSW_IRQ_CLR_REG:\n" + "> + case ALTR_A10SR_PBDSW_IRQ_RD_REG:\n" + "> + case ALTR_A10SR_PWR_GOOD1_RD_REG:\n" + "> + case ALTR_A10SR_PWR_GOOD2_RD_REG:\n" + "> + case ALTR_A10SR_PWR_GOOD3_RD_REG:\n" + "> + case ALTR_A10SR_FMCAB_RD_REG:\n" + "> + case ALTR_A10SR_HPS_RST_RD_REG:\n" + "> + case ALTR_A10SR_USB_QSPI_RD_REG:\n" + "> + case ALTR_A10SR_SFPA_RD_REG:\n" + "> + case ALTR_A10SR_SFPB_RD_REG:\n" + "> + case ALTR_A10SR_I2C_M_RD_REG:\n" + "> + case ALTR_A10SR_WARM_RST_RD_REG:\n" + "> + case ALTR_A10SR_WR_KEY_RD_REG:\n" + "> + case ALTR_A10SR_PMBUS_RD_REG:\n" + "> + return true;\n" + "> + default:\n" + "> + return false;\n" + "> + }\n" "> +}\n" "> +\n" "> +static bool altr_a10sr_reg_writeable(struct device *dev, unsigned int reg)\n" "> +{\n" - "> +\tswitch (reg) {\n" - "> +\tcase ALTR_A10SR_LED_WR_REG:\n" - "> +\tcase ALTR_A10SR_PBDSW_IRQ_CLR_REG:\n" - "> +\tcase ALTR_A10SR_FMCAB_WR_REG:\n" - "> +\tcase ALTR_A10SR_HPS_RST_WR_REG:\n" - "> +\tcase ALTR_A10SR_USB_QSPI_WR_REG:\n" - "> +\tcase ALTR_A10SR_SFPA_WR_REG:\n" - "> +\tcase ALTR_A10SR_SFPB_WR_REG:\n" - "> +\tcase ALTR_A10SR_WARM_RST_WR_REG:\n" - "> +\tcase ALTR_A10SR_WR_KEY_WR_REG:\n" - "> +\tcase ALTR_A10SR_PMBUS_WR_REG:\n" - "> +\t\treturn true;\n" - "> +\tdefault:\n" - "> +\t\treturn false;\n" - "> +\t}\n" + "> + switch (reg) {\n" + "> + case ALTR_A10SR_LED_WR_REG:\n" + "> + case ALTR_A10SR_PBDSW_IRQ_CLR_REG:\n" + "> + case ALTR_A10SR_FMCAB_WR_REG:\n" + "> + case ALTR_A10SR_HPS_RST_WR_REG:\n" + "> + case ALTR_A10SR_USB_QSPI_WR_REG:\n" + "> + case ALTR_A10SR_SFPA_WR_REG:\n" + "> + case ALTR_A10SR_SFPB_WR_REG:\n" + "> + case ALTR_A10SR_WARM_RST_WR_REG:\n" + "> + case ALTR_A10SR_WR_KEY_WR_REG:\n" + "> + case ALTR_A10SR_PMBUS_WR_REG:\n" + "> + return true;\n" + "> + default:\n" + "> + return false;\n" + "> + }\n" "> +}\n" "> +\n" "> +static bool altr_a10sr_reg_volatile(struct device *dev, unsigned int reg)\n" "> +{\n" - "> +\tswitch (reg) {\n" - "> +\tcase ALTR_A10SR_PBDSW_RD_REG:\n" - "> +\tcase ALTR_A10SR_PBDSW_IRQ_RD_REG:\n" - "> +\tcase ALTR_A10SR_PWR_GOOD1_RD_REG:\n" - "> +\tcase ALTR_A10SR_PWR_GOOD2_RD_REG:\n" - "> +\tcase ALTR_A10SR_PWR_GOOD3_RD_REG:\n" - "> +\tcase ALTR_A10SR_HPS_RST_RD_REG:\n" - "> +\tcase ALTR_A10SR_I2C_M_RD_REG:\n" - "> +\tcase ALTR_A10SR_WARM_RST_RD_REG:\n" - "> +\tcase ALTR_A10SR_WR_KEY_RD_REG:\n" - "> +\tcase ALTR_A10SR_PMBUS_RD_REG:\n" - "> +\t\treturn true;\n" - "> +\tdefault:\n" - "> +\t\treturn false;\n" - "> +\t}\n" + "> + switch (reg) {\n" + "> + case ALTR_A10SR_PBDSW_RD_REG:\n" + "> + case ALTR_A10SR_PBDSW_IRQ_RD_REG:\n" + "> + case ALTR_A10SR_PWR_GOOD1_RD_REG:\n" + "> + case ALTR_A10SR_PWR_GOOD2_RD_REG:\n" + "> + case ALTR_A10SR_PWR_GOOD3_RD_REG:\n" + "> + case ALTR_A10SR_HPS_RST_RD_REG:\n" + "> + case ALTR_A10SR_I2C_M_RD_REG:\n" + "> + case ALTR_A10SR_WARM_RST_RD_REG:\n" + "> + case ALTR_A10SR_WR_KEY_RD_REG:\n" + "> + case ALTR_A10SR_PMBUS_RD_REG:\n" + "> + return true;\n" + "> + default:\n" + "> + return false;\n" + "> + }\n" "> +}\n" "> +\n" "> +const struct regmap_config altr_a10sr_regmap_config = {\n" - "> +\t.reg_bits = 8,\n" - "> +\t.val_bits = 8,\n" + "> + .reg_bits = 8,\n" + "> + .val_bits = 8,\n" "> +\n" - "> +\t.cache_type = REGCACHE_NONE,\n" + "> + .cache_type = REGCACHE_NONE,\n" "> +\n" - "> +\t.use_single_rw = true,\n" - "> +\t.read_flag_mask = 1,\n" - "> +\t.write_flag_mask = 0,\n" + "> + .use_single_rw = true,\n" + "> + .read_flag_mask = 1,\n" + "> + .write_flag_mask = 0,\n" "> +\n" - "> +\t.max_register = ALTR_A10SR_WR_KEY_RD_REG,\n" - "> +\t.readable_reg = altr_a10sr_reg_readable,\n" - "> +\t.writeable_reg = altr_a10sr_reg_writeable,\n" - "> +\t.volatile_reg = altr_a10sr_reg_volatile,\n" + "> + .max_register = ALTR_A10SR_WR_KEY_RD_REG,\n" + "> + .readable_reg = altr_a10sr_reg_readable,\n" + "> + .writeable_reg = altr_a10sr_reg_writeable,\n" + "> + .volatile_reg = altr_a10sr_reg_volatile,\n" "> +\n" "> +};\n" "> +\n" "> +static int altr_a10sr_spi_probe(struct spi_device *spi)\n" "> +{\n" - "> +\tint ret;\n" - "> +\tstruct altr_a10sr *a10sr;\n" + "> + int ret;\n" + "> + struct altr_a10sr *a10sr;\n" "> +\n" - "> +\ta10sr = devm_kzalloc(&spi->dev, sizeof(*a10sr),\n" - "> +\t\t\t GFP_KERNEL);\n" - "> +\tif (!a10sr)\n" - "> +\t\treturn -ENOMEM;\n" + "> + a10sr = devm_kzalloc(&spi->dev, sizeof(*a10sr),\n" + "> + GFP_KERNEL);\n" + "> + if (!a10sr)\n" + "> + return -ENOMEM;\n" "> +\n" - "> +\tspi->mode = SPI_MODE_3;\n" - "> +\tspi->bits_per_word = 8;\n" - "> +\tspi_setup(spi);\n" + "> + spi->mode = SPI_MODE_3;\n" + "> + spi->bits_per_word = 8;\n" + "> + spi_setup(spi);\n" "> +\n" - "> +\ta10sr->dev = &spi->dev;\n" + "> + a10sr->dev = &spi->dev;\n" "> +\n" - "> +\tspi_set_drvdata(spi, a10sr);\n" + "> + spi_set_drvdata(spi, a10sr);\n" "> +\n" - "> +\ta10sr->regmap = devm_regmap_init_spi(spi, &altr_a10sr_regmap_config);\n" - "> +\tif (IS_ERR(a10sr->regmap)) {\n" - "> +\t\tret = PTR_ERR(a10sr->regmap);\n" - "> +\t\tdev_err(&spi->dev, \"Allocate register map Failed: %d\\n\", ret);\n" + "> + a10sr->regmap = devm_regmap_init_spi(spi, &altr_a10sr_regmap_config);\n" + "> + if (IS_ERR(a10sr->regmap)) {\n" + "> + ret = PTR_ERR(a10sr->regmap);\n" + "> + dev_err(&spi->dev, \"Allocate register map Failed: %d\\n\", ret);\n" "\n" "Proper English would be better.\n" "\n" "\"Failed to allocate register map\"\n" "\n" - "> +\t\treturn ret;\n" - "> +\t}\n" + "> + return ret;\n" + "> + }\n" "> +\n" - "> +\tret = mfd_add_devices(a10sr->dev, PLATFORM_DEVID_AUTO,\n" - "> +\t\t\t altr_a10sr_subdev_info,\n" - "> +\t\t\t ARRAY_SIZE(altr_a10sr_subdev_info),\n" - "> +\t\t\t NULL, 0, NULL);\n" + "> + ret = mfd_add_devices(a10sr->dev, PLATFORM_DEVID_AUTO,\n" + "> + altr_a10sr_subdev_info,\n" + "> + ARRAY_SIZE(altr_a10sr_subdev_info),\n" + "> + NULL, 0, NULL);\n" "\n" "This call does, precisely, nothing.\n" "\n" - "> +\tif (ret)\n" - "> +\t\tdev_err(a10sr->dev, \"mfd_add_devices failed: %d\\n\", ret);\n" + "> + if (ret)\n" + "> + dev_err(a10sr->dev, \"mfd_add_devices failed: %d\\n\", ret);\n" "\n" "Users don't care about function names.\n" "\n" "\"Failed to register sub-devices\" would be better.\n" "\n" - "> +\treturn ret;\n" + "> + return ret;\n" "> +}\n" "> +\n" "> +static int altr_a10sr_spi_remove(struct spi_device *spi)\n" "> +{\n" - "> +\tmfd_remove_devices(&spi->dev);\n" + "> + mfd_remove_devices(&spi->dev);\n" "> +\n" - "> +\treturn 0;\n" + "> + return 0;\n" "> +}\n" "> +\n" "> +static const struct of_device_id altr_a10sr_spi_of_match[] = {\n" - "> +\t{ .compatible = \"altr,altr-a10sr\" },\n" + "> + { .compatible = \"altr,altr-a10sr\" },\n" "\n" "I'm thinking that putting \"altr\" twice is unnecessary.\n" "\n" - "> +\t{ },\n" + "> + { },\n" "> +};\n" "> +MODULE_DEVICE_TABLE(of, altr_a10sr_spi_of_match);\n" "> +\n" "> +static struct spi_driver altr_a10sr_spi_driver = {\n" - "> +\t.probe = altr_a10sr_spi_probe,\n" - "> +\t.remove = altr_a10sr_spi_remove,\n" - "> +\t.driver = {\n" - "> +\t\t.name = \"altr_a10sr\",\n" - "> +\t\t.of_match_table = altr_a10sr_spi_of_match,\n" + "> + .probe = altr_a10sr_spi_probe,\n" + "> + .remove = altr_a10sr_spi_remove,\n" + "> + .driver = {\n" + "> + .name = \"altr_a10sr\",\n" + "> + .of_match_table = altr_a10sr_spi_of_match,\n" "\n" "of_match_ptr()?\n" "\n" - "> +\t},\n" + "> + },\n" "> +};\n" "> +\n" "> +module_spi_driver(altr_a10sr_spi_driver);\n" @@ -279,7 +269,8 @@ "Email.\n" "\n" "> +MODULE_DESCRIPTION(\"Altera Arria10 DevKit System Resource MFD Driver\");\n" - "> diff --git a/include/linux/mfd/altera-a10sr.h b/include/linux/mfd/altera-a10sr.h\n" + "> diff --git a/include/linux/mfd/altera-a10sr.h \n" + "> b/include/linux/mfd/altera-a10sr.h\n" "> new file mode 100644\n" "> index 0000000..7087afc\n" "> --- /dev/null\n" @@ -297,7 +288,8 @@ "> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n" "> + * more details.\n" "> + *\n" - "> + * You should have received a copy of the GNU General Public License along with\n" + "> + * You should have received a copy of the GNU General Public License along \n" + "> with\n" "> + * this program. If not, see <http://www.gnu.org/licenses/>.\n" "\n" "Shorter Copyright?\n" @@ -306,7 +298,7 @@ "> + *\n" "> + * Adapted from DA9052\n" "> + * Copyright(c) 2011 Dialog Semiconductor Ltd.\n" - "> + * Author: David Dajun Chen <dchen@diasemi.com>\n" + "> + * Author: David Dajun Chen <dc...@diasemi.com>\n" "> + */\n" "> +\n" "> +#ifndef __MFD_ALTERA_A10SR_H\n" @@ -331,7 +323,8 @@ "> + * the number of GPIO in each register. We then need to multiply\n" "> + * by 2 because the reads are at odd addresses.\n" "> + */\n" - "> +#define ALTR_A10SR_REG_OFFSET(X) (((X) / ALTR_A10SR_BITS_PER_REGISTER) << 1)\n" + "> +#define ALTR_A10SR_REG_OFFSET(X) (((X) / ALTR_A10SR_BITS_PER_REGISTER) \n" + "> << 1)\n" "> +#define ALTR_A10SR_REG_BIT(X) ((X) % ALTR_A10SR_BITS_PER_REGISTER)\n" "> +#define ALTR_A10SR_REG_BIT_CHG(X, Y) ((X) << ALTR_A10SR_REG_BIT(Y))\n" "> +#define ALTR_A10SR_REG_BIT_MASK(X) (1 << ALTR_A10SR_REG_BIT(X))\n" @@ -366,75 +359,75 @@ "> +#define ALTR_A10SR_PMBUS_RD_REG 0x1F /* HPS PM Bus */\n" "> +\n" "> +struct altr_a10sr {\n" - "> +\tstruct device *dev;\n" - "> +\tstruct regmap *regmap;\n" + "> + struct device *dev;\n" + "> + struct regmap *regmap;\n" "> +};\n" "> +\n" "> +/* Device I/O API */\n" "> +static inline int altr_a10sr_reg_read(struct altr_a10sr *a10sr,\n" - "> +\t\t\t\t unsigned char reg)\n" + "> + unsigned char reg)\n" "> +{\n" - "> +\tint val, ret;\n" + "> + int val, ret;\n" "> +\n" - "> +\tret = regmap_read(a10sr->regmap, (reg | READ_REG_MASK), &val);\n" - "> +\tif (ret < 0)\n" - "> +\t\treturn ret;\n" + "> + ret = regmap_read(a10sr->regmap, (reg | READ_REG_MASK), &val);\n" + "> + if (ret < 0)\n" + "> + return ret;\n" "> +\n" - "> +\treturn val;\n" + "> + return val;\n" "> +}\n" "> +\n" "> +static inline int altr_a10sr_reg_write(struct altr_a10sr *a10sr,\n" - "> +\t\t\t\t unsigned char reg, unsigned char val)\n" + "> + unsigned char reg, unsigned char val)\n" "> +{\n" - "> +\tint ret;\n" + "> + int ret;\n" "> +\n" - "> +\tret = regmap_write(a10sr->regmap, (reg & WRITE_REG_MASK), val);\n" - "> +\tif (ret < 0)\n" - "> +\t\treturn ret;\n" + "> + ret = regmap_write(a10sr->regmap, (reg & WRITE_REG_MASK), val);\n" + "> + if (ret < 0)\n" + "> + return ret;\n" "> +\n" - "> +\treturn ret;\n" + "> + return ret;\n" "> +}\n" "> +\n" "> +static inline int altr_a10sr_group_read(struct altr_a10sr *a10sr,\n" - "> +\t\t\t\t\tunsigned char reg,\n" - "> +\t\t\t\t\tunsigned int reg_cnt,\n" - "> +\t\t\t\t\tunsigned char *val)\n" + "> + unsigned char reg,\n" + "> + unsigned int reg_cnt,\n" + "> + unsigned char *val)\n" "> +{\n" - "> +\treturn regmap_bulk_read(a10sr->regmap, reg, val, reg_cnt);\n" + "> + return regmap_bulk_read(a10sr->regmap, reg, val, reg_cnt);\n" "> +}\n" "> +\n" "> +static inline int altr_a10sr_group_write(struct altr_a10sr *a10sr,\n" - "> +\t\t\t\t\t unsigned char reg,\n" - "> +\t\t\t\t\t unsigned int reg_cnt,\n" - "> +\t\t\t\t\t unsigned char *val)\n" + "> + unsigned char reg,\n" + "> + unsigned int reg_cnt,\n" + "> + unsigned char *val)\n" "> +{\n" - "> +\treturn regmap_bulk_write(a10sr->regmap, reg, val, reg_cnt);\n" + "> + return regmap_bulk_write(a10sr->regmap, reg, val, reg_cnt);\n" "> +}\n" "\n" "All of the above are completely superfluous. Just use the regmap_*\n" "API directly.\n" "\n" "> +static inline int altr_a10sr_reg_update(struct altr_a10sr *a10sr,\n" - "> +\t\t\t\t\tunsigned char reg,\n" - "> +\t\t\t\t\tunsigned char bit_mask,\n" - "> +\t\t\t\t\tunsigned char reg_val)\n" + "> + unsigned char reg,\n" + "> + unsigned char bit_mask,\n" + "> + unsigned char reg_val)\n" "> +{\n" - "> +\tint rval, ret;\n" + "> + int rval, ret;\n" "> +\n" - "> +\t/*\n" - "> +\t * We can't use the standard regmap_update_bits function because\n" - "> +\t * the read register has a different address than the write register.\n" - "> +\t * Therefore, just do a read, modify, write operation here.\n" - "> +\t */\n" - "> +\tret = regmap_read(a10sr->regmap, (reg | READ_REG_MASK), &rval);\n" - "> +\tif (ret < 0)\n" - "> +\t\treturn ret;\n" + "> + /*\n" + "> + * We can't use the standard regmap_update_bits function because\n" + "> + * the read register has a different address than the write register.\n" + "> + * Therefore, just do a read, modify, write operation here.\n" + "> + */\n" + "> + ret = regmap_read(a10sr->regmap, (reg | READ_REG_MASK), &rval);\n" + "> + if (ret < 0)\n" + "> + return ret;\n" "> +\n" - "> +\trval = ((rval & ~bit_mask) | (reg_val & bit_mask));\n" + "> + rval = ((rval & ~bit_mask) | (reg_val & bit_mask));\n" "> +\n" - "> +\tret = regmap_write(a10sr->regmap, (reg & WRITE_REG_MASK), rval);\n" + "> + ret = regmap_write(a10sr->regmap, (reg & WRITE_REG_MASK), rval);\n" "> +\n" - "> +\treturn ret;\n" + "> + return ret;\n" "> +}\n" "\n" "Why can't you use the Regmap update function(s)?\n" @@ -444,11 +437,11 @@ "-- \n" "Lee Jones\n" "Linaro STMicroelectronics Landing Team Lead\n" - "Linaro.org \342\224\202 Open source software for ARM SoCs\n" + "Linaro.org \303\242\302\224\302\202 Open source software for ARM SoCs\n" "Follow Linaro: Facebook | Twitter | Blog\n" "--\n" - "To unsubscribe from this list: send the line \"unsubscribe linux-gpio\" in\n" - "the body of a message to majordomo@vger.kernel.org\n" + "To unsubscribe from this list: send the line \"unsubscribe linux-hwmon\" in\n" + "the body of a message to majord...@vger.kernel.org\n" More majordomo info at http://vger.kernel.org/majordomo-info.html -81f3c86017fec25398870dc895d4794770fe3c886a0018dee20f2aeba905c4c8 +8699f7a1964463882c5277faadcba46481e34cb27a0fe51f3d7b4958377aa595
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.