Message ID | 1445014753-15450-3-git-send-email-afd@ti.com |
---|---|
State | New |
Headers | show |
On Fri, 16 Oct 2015, Andrew F. Davis wrote: > Add support for the TPS65912 device. It provides communication > through I2C and contains the following components: > > - Regulators > - Load switches > - GPO controller What's a GPO controller? > Signed-off-by: Andrew F. Davis <afd@ti.com> > --- > drivers/mfd/Kconfig | 13 ++++ > drivers/mfd/Makefile | 1 + > drivers/mfd/tps65086.c | 145 +++++++++++++++++++++++++++++++++++++++++++ > include/linux/mfd/tps65086.h | 120 +++++++++++++++++++++++++++++++++++ > 4 files changed, 279 insertions(+) > create mode 100644 drivers/mfd/tps65086.c > create mode 100644 include/linux/mfd/tps65086.h > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > index 99d6367..ab3b392 100644 > --- a/drivers/mfd/Kconfig > +++ b/drivers/mfd/Kconfig > @@ -1093,6 +1093,19 @@ config TPS6507X > This driver can also be built as a module. If so, the module > will be called tps6507x. > > +config MFD_TPS65086 > + tristate "TI TPS65086x Power Management chips" Use the full name: "TI TPS65086x Power Management Integrated Chips (PMICs)" > + select REGMAP > + select REGMAP_IRQ > + select REGMAP_I2C > + depends on I2C REGMAP_I2C already depends on I2C. > + depends on OF || COMPILE_TEST > + help > + If you say yes here you get support for the TPS65086 series of > + Power Management chips. I'd remove the line break. > + These include voltage regulators, GPO and other features GPIO? > + that are often used in portable devices. This is meant to be a 'help', so instead of staying "and some other stuff", please list them. > config TPS65911_COMPARATOR > tristate > > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile > index a59e3fc..7adb902 100644 > --- a/drivers/mfd/Makefile > +++ b/drivers/mfd/Makefile > @@ -66,6 +66,7 @@ obj-$(CONFIG_MFD_WM8994) += wm8994-core.o wm8994-irq.o wm8994-regmap.o > obj-$(CONFIG_TPS6105X) += tps6105x.o > obj-$(CONFIG_TPS65010) += tps65010.o > obj-$(CONFIG_TPS6507X) += tps6507x.o > +obj-$(CONFIG_MFD_TPS65086) += tps65086.o > obj-$(CONFIG_MFD_TPS65217) += tps65217.o > obj-$(CONFIG_MFD_TPS65218) += tps65218.o > obj-$(CONFIG_MFD_TPS65910) += tps65910.o > diff --git a/drivers/mfd/tps65086.c b/drivers/mfd/tps65086.c > new file mode 100644 > index 0000000..be6d678 > --- /dev/null > +++ b/drivers/mfd/tps65086.c > @@ -0,0 +1,145 @@ > +/* > + * Driver for TI TPS65086x PMICs I'd suggest removing the driver part. We know it's a driver. > + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ > + * > + * Author: Andrew F. Davis <afd@ti.com> > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + * This program is distributed "as is" WITHOUT ANY WARRANTY of any > + * kind, whether expressed or implied; without even the implied warranty > + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License version 2 for more details. > + * > + * Based on the TPS65912 driver > + */ > + > +#include <linux/i2c.h> > +#include <linux/interrupt.h> > +#include <linux/module.h> > +#include <linux/of_device.h> > + > +#include <linux/mfd/tps65086.h> > + > +static const struct regmap_range tps65086_yes_ranges[] = { > + regmap_reg_range(TPS65086_IRQ, TPS65086_IRQ), > + regmap_reg_range(TPS65086_PMICSTAT, TPS65086_SHUTDNSRC), > + regmap_reg_range(TPS65086_GPOCTRL, TPS65086_GPOCTRL), > + regmap_reg_range(TPS65086_PG_STATUS1, TPS65086_OC_STATUS), > +}; > + > +static const struct regmap_access_table tps65086_volatile_table = { > + .yes_ranges = tps65086_yes_ranges, > + .n_yes_ranges = ARRAY_SIZE(tps65086_yes_ranges), > +}; > + > +static const struct regmap_config tps65086_regmap_config = { > + .reg_bits = 8, > + .val_bits = 8, > + .cache_type = REGCACHE_RBTREE, > + .volatile_table = &tps65086_volatile_table, > +}; > + > +static const struct regmap_irq tps65086_irqs[] = { > + REGMAP_IRQ_REG(TPS65086_IRQ_DIETEMP, 0, TPS65086_IRQ_DIETEMP_MASK), > + REGMAP_IRQ_REG(TPS65086_IRQ_SHUTDN, 0, TPS65086_IRQ_SHUTDN_MASK), > + REGMAP_IRQ_REG(TPS65086_IRQ_FAULT, 0, TPS65086_IRQ_FAULT_MASK), > +}; > + > +static struct regmap_irq_chip tps65086_irq_chip = { > + .name = "tps65086", > + .status_base = TPS65086_IRQ, > + .mask_base = TPS65086_IRQ_MASK, > + .ack_base = TPS65086_IRQ, > + .init_ack_masked = true, > + .num_regs = 1, > + .irqs = tps65086_irqs, > + .num_irqs = ARRAY_SIZE(tps65086_irqs), > +}; > + > +static const struct of_device_id tps65086_of_match_table[] = { > + { .compatible = "ti,tps65086", }, > + { /* sentinel */ } > +}; > + > +static int tps65086_probe(struct i2c_client *client, > + const struct i2c_device_id *ids) > +{ > + struct tps65086 *tps; > + unsigned int version; > + int ret; > + > + tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); > + if (!tps) > + return -ENOMEM; > + > + i2c_set_clientdata(client, tps); > + tps->dev = &client->dev; > + tps->irq = client->irq; > + > + tps->regmap = devm_regmap_init_i2c(client, &tps65086_regmap_config); > + if (IS_ERR(tps->regmap)) { > + dev_err(tps->dev, "Failed to initialize register map\n"); > + return PTR_ERR(tps->regmap); > + } > + > + ret = regmap_read(tps->regmap, TPS65086_DEVICEID, &version); > + if (ret < 0) { > + dev_err(tps->dev, "Failed to read revision register\n"); > + return ret; > + } > + > + dev_info(tps->dev, "Device: TPS65086%01lX, OTP: %c, Rev: %ld\n", > + (version & TPS65086_DEVICEID_PART_MASK), > + (char)((version & TPS65086_DEVICEID_OTP_MASK) >> 4) + 'A', > + (version & TPS65086_DEVICEID_REV_MASK) >> 6); > + > + ret = regmap_add_irq_chip(tps->regmap, tps->irq, IRQF_ONESHOT, 0, > + &tps65086_irq_chip, &tps->irq_data); > + if (ret < 0) { if (ret) > + dev_err(tps->dev, "Failed to register IRQ chip\n"); > + return ret; > + } > + > + ret = of_platform_populate(tps->dev->of_node, NULL, NULL, tps->dev); > + if (ret < 0) { if (ret) > + regmap_del_irq_chip(tps->irq, tps->irq_data); > + return ret; > + } > + > + return 0; > +} > + > +static int tps65086_remove(struct i2c_client *client) > +{ > + struct tps65086 *tps = i2c_get_clientdata(client); > + > + regmap_del_irq_chip(tps->irq, tps->irq_data); > + > + return 0; > +} > + > +static const struct i2c_device_id tps65086_id_table[] = { > + { "tps65086", 0 }, > + { /* sentinel */ }, > +}; > +MODULE_DEVICE_TABLE(i2c, tps65086_id_table); > + > +static struct i2c_driver tps65086_driver = { > + .driver = { > + .name = "tps65086", > + .of_match_table = tps65086_of_match_table, > + }, > + .probe = tps65086_probe, > + .remove = tps65086_remove, > + .id_table = tps65086_id_table, > +}; > + > +module_i2c_driver(tps65086_driver); > + > +MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>"); > +MODULE_DESCRIPTION("TPS65086x PMIC Driver"); > +MODULE_LICENSE("GPL v2"); > diff --git a/include/linux/mfd/tps65086.h b/include/linux/mfd/tps65086.h > new file mode 100644 > index 0000000..2a9e9dd > --- /dev/null > +++ b/include/linux/mfd/tps65086.h > @@ -0,0 +1,120 @@ > +/* > + * TI TPS65086x > + * > + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ > + * > + * Author: Andrew F. Davis <afd@ti.com> > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + * This program is distributed "as is" WITHOUT ANY WARRANTY of any > + * kind, whether expressed or implied; without even the implied warranty > + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License version 2 for more details. > + * > + * Based on the TPS65912 driver > + */ > + > +#ifndef __LINUX_MFD_TPS65086_H > +#define __LINUX_MFD_TPS65086_H > + > +#include <linux/device.h> > +#include <linux/regmap.h> > + > +/* List of registers for TPS65086 */ > +#define TPS65086_DEVICEID 0x01 > +#define TPS65086_IRQ 0x02 > +#define TPS65086_IRQ_MASK 0x03 > +#define TPS65086_PMICSTAT 0x04 > +#define TPS65086_SHUTDNSRC 0x05 > +#define TPS65086_BUCK1CTRL 0x20 > +#define TPS65086_BUCK2CTRL 0x21 > +#define TPS65086_BUCK3DECAY 0x22 > +#define TPS65086_BUCK3VID 0x23 > +#define TPS65086_BUCK3SLPCTRL 0x24 > +#define TPS65086_BUCK4CTRL 0x25 > +#define TPS65086_BUCK5CTRL 0x26 > +#define TPS65086_BUCK6CTRL 0x27 > +#define TPS65086_LDOA2CTRL 0x28 > +#define TPS65086_LDOA3CTRL 0x29 > +#define TPS65086_DISCHCTRL1 0x40 > +#define TPS65086_DISCHCTRL2 0x41 > +#define TPS65086_DISCHCTRL3 0x42 > +#define TPS65086_PG_DELAY1 0x43 > +#define TPS65086_FORCESHUTDN 0x91 > +#define TPS65086_BUCK1SLPCTRL 0x92 > +#define TPS65086_BUCK2SLPCTRL 0x93 > +#define TPS65086_BUCK4VID 0x94 > +#define TPS65086_BUCK4SLPVID 0x95 > +#define TPS65086_BUCK5VID 0x96 > +#define TPS65086_BUCK5SLPVID 0x97 > +#define TPS65086_BUCK6VID 0x98 > +#define TPS65086_BUCK6SLPVID 0x99 > +#define TPS65086_LDOA2VID 0x9A > +#define TPS65086_LDOA3VID 0x9B > +#define TPS65086_BUCK123CTRL 0x9C > +#define TPS65086_PG_DELAY2 0x9D > +#define TPS65086_PIN_EN_MASK1 0x9E > +#define TPS65086_PIN_EN_MASK2 0x9F > +#define TPS65086_SWVTT_EN 0x9F > +#define TPS65086_PIN_EN_OVR1 0xA0 > +#define TPS65086_PIN_EN_OVR2 0xA1 > +#define TPS65086_GPOCTRL 0xA1 > +#define TPS65086_PWR_FAULT_MASK1 0xA2 > +#define TPS65086_PWR_FAULT_MASK2 0xA3 > +#define TPS65086_GPO1PG_CTRL1 0xA4 > +#define TPS65086_GPO1PG_CTRL2 0xA5 > +#define TPS65086_GPO4PG_CTRL1 0xA6 > +#define TPS65086_GPO4PG_CTRL2 0xA7 > +#define TPS65086_GPO2PG_CTRL1 0xA8 > +#define TPS65086_GPO2PG_CTRL2 0xA9 > +#define TPS65086_GPO3PG_CTRL1 0xAA > +#define TPS65086_GPO3PG_CTRL2 0xAB > +#define TPS65086_LDOA1CTRL 0xAE > +#define TPS65086_PG_STATUS1 0xB0 > +#define TPS65086_PG_STATUS2 0xB1 > +#define TPS65086_PWR_FAULT_STATUS1 0xB2 > +#define TPS65086_PWR_FAULT_STATUS2 0xB3 > +#define TPS65086_TEMPCRIT 0xB4 > +#define TPS65086_TEMPHOT 0xB5 > +#define TPS65086_OC_STATUS 0xB6 > + > +/* IRQ Register field definitions */ > +#define TPS65086_IRQ_DIETEMP_MASK BIT(0) > +#define TPS65086_IRQ_SHUTDN_MASK BIT(3) > +#define TPS65086_IRQ_FAULT_MASK BIT(7) > + > +/* DEVICEID Register field definitions */ > +#define TPS65086_DEVICEID_PART_MASK GENMASK(3, 0) > +#define TPS65086_DEVICEID_OTP_MASK GENMASK(5, 4) > +#define TPS65086_DEVICEID_REV_MASK GENMASK(7, 6) > + > +/* VID Masks */ > +#define BUCK_VID_MASK GENMASK(7, 1) > +#define VDOA1_VID_MASK GENMASK(4, 1) > +#define VDOA23_VID_MASK GENMASK(3, 0) > + > +/* Define the TPS65086 IRQ numbers */ > +enum tps65086_irqs { > + TPS65086_IRQ_DIETEMP, > + TPS65086_IRQ_SHUTDN, > + TPS65086_IRQ_FAULT, > +}; > + > +/* > + * struct tps65086 - state holder for the tps65086 driver > + * > + * Device data may be used to access the TPS65086 chip > + */ > +struct tps65086 { > + struct device *dev; > + struct regmap *regmap; > + > + /* IRQ Data */ > + int irq; > + struct regmap_irq_chip_data *irq_data; > +}; > + > +#endif /* __LINUX_MFD_TPS65086_H */
On 10/19/2015 04:23 AM, Lee Jones wrote: > On Fri, 16 Oct 2015, Andrew F. Davis wrote: > >> Add support for the TPS65912 device. It provides communication >> through I2C and contains the following components: >> >> - Regulators >> - Load switches >> - GPO controller > > What's a GPO controller? > General Purpose Output, this controller only has output control, it's listed in the data-sheet this way, and other drivers have used this term. >> Signed-off-by: Andrew F. Davis <afd@ti.com> >> --- >> drivers/mfd/Kconfig | 13 ++++ >> drivers/mfd/Makefile | 1 + >> drivers/mfd/tps65086.c | 145 +++++++++++++++++++++++++++++++++++++++++++ >> include/linux/mfd/tps65086.h | 120 +++++++++++++++++++++++++++++++++++ >> 4 files changed, 279 insertions(+) >> create mode 100644 drivers/mfd/tps65086.c >> create mode 100644 include/linux/mfd/tps65086.h >> >> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig >> index 99d6367..ab3b392 100644 >> --- a/drivers/mfd/Kconfig >> +++ b/drivers/mfd/Kconfig >> @@ -1093,6 +1093,19 @@ config TPS6507X >> This driver can also be built as a module. If so, the module >> will be called tps6507x. >> >> +config MFD_TPS65086 >> + tristate "TI TPS65086x Power Management chips" > > Use the full name: > > "TI TPS65086x Power Management Integrated Chips (PMICs)" > >> + select REGMAP >> + select REGMAP_IRQ >> + select REGMAP_I2C >> + depends on I2C > > REGMAP_I2C already depends on I2C. > So if I force REGMAP_I2C to =y without depending on I2C then couldn't REGMAP_I2C get selected without I2C enabled? Selecting doesn't force the selected item's dependencies still right? >> + depends on OF || COMPILE_TEST >> + help >> + If you say yes here you get support for the TPS65086 series of >> + Power Management chips. > > I'd remove the line break. > >> + These include voltage regulators, GPO and other features > > GPIO? > >> + that are often used in portable devices. > > This is meant to be a 'help', so instead of staying "and some other > stuff", please list them. > This seems to be what other devices do, I'll change it to something else then. >> config TPS65911_COMPARATOR >> tristate >> >> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile >> index a59e3fc..7adb902 100644 >> --- a/drivers/mfd/Makefile >> +++ b/drivers/mfd/Makefile >> @@ -66,6 +66,7 @@ obj-$(CONFIG_MFD_WM8994) += wm8994-core.o wm8994-irq.o wm8994-regmap.o >> obj-$(CONFIG_TPS6105X) += tps6105x.o >> obj-$(CONFIG_TPS65010) += tps65010.o >> obj-$(CONFIG_TPS6507X) += tps6507x.o >> +obj-$(CONFIG_MFD_TPS65086) += tps65086.o >> obj-$(CONFIG_MFD_TPS65217) += tps65217.o >> obj-$(CONFIG_MFD_TPS65218) += tps65218.o >> obj-$(CONFIG_MFD_TPS65910) += tps65910.o >> diff --git a/drivers/mfd/tps65086.c b/drivers/mfd/tps65086.c >> new file mode 100644 >> index 0000000..be6d678 >> --- /dev/null >> +++ b/drivers/mfd/tps65086.c >> @@ -0,0 +1,145 @@ >> +/* >> + * Driver for TI TPS65086x PMICs > > I'd suggest removing the driver part. We know it's a driver. > Again this is what almost every other driver does, I'm not sure how else to describe this file without using the word driver. >> + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ >> + * >> + * Author: Andrew F. Davis <afd@ti.com> >> + * >> + * This program is free software; you can redistribute it and/or >> + * modify it under the terms of the GNU General Public License version 2 as >> + * published by the Free Software Foundation. >> + * >> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any >> + * kind, whether expressed or implied; without even the implied warranty >> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + * GNU General Public License version 2 for more details. >> + * >> + * Based on the TPS65912 driver >> + */ >> + >> +#include <linux/i2c.h> >> +#include <linux/interrupt.h> >> +#include <linux/module.h> >> +#include <linux/of_device.h> >> + >> +#include <linux/mfd/tps65086.h> >> + >> +static const struct regmap_range tps65086_yes_ranges[] = { >> + regmap_reg_range(TPS65086_IRQ, TPS65086_IRQ), >> + regmap_reg_range(TPS65086_PMICSTAT, TPS65086_SHUTDNSRC), >> + regmap_reg_range(TPS65086_GPOCTRL, TPS65086_GPOCTRL), >> + regmap_reg_range(TPS65086_PG_STATUS1, TPS65086_OC_STATUS), >> +}; >> + >> +static const struct regmap_access_table tps65086_volatile_table = { >> + .yes_ranges = tps65086_yes_ranges, >> + .n_yes_ranges = ARRAY_SIZE(tps65086_yes_ranges), >> +}; >> + >> +static const struct regmap_config tps65086_regmap_config = { >> + .reg_bits = 8, >> + .val_bits = 8, >> + .cache_type = REGCACHE_RBTREE, >> + .volatile_table = &tps65086_volatile_table, >> +}; >> + >> +static const struct regmap_irq tps65086_irqs[] = { >> + REGMAP_IRQ_REG(TPS65086_IRQ_DIETEMP, 0, TPS65086_IRQ_DIETEMP_MASK), >> + REGMAP_IRQ_REG(TPS65086_IRQ_SHUTDN, 0, TPS65086_IRQ_SHUTDN_MASK), >> + REGMAP_IRQ_REG(TPS65086_IRQ_FAULT, 0, TPS65086_IRQ_FAULT_MASK), >> +}; >> + >> +static struct regmap_irq_chip tps65086_irq_chip = { >> + .name = "tps65086", >> + .status_base = TPS65086_IRQ, >> + .mask_base = TPS65086_IRQ_MASK, >> + .ack_base = TPS65086_IRQ, >> + .init_ack_masked = true, >> + .num_regs = 1, >> + .irqs = tps65086_irqs, >> + .num_irqs = ARRAY_SIZE(tps65086_irqs), >> +}; >> + >> +static const struct of_device_id tps65086_of_match_table[] = { >> + { .compatible = "ti,tps65086", }, >> + { /* sentinel */ } >> +}; >> + >> +static int tps65086_probe(struct i2c_client *client, >> + const struct i2c_device_id *ids) >> +{ >> + struct tps65086 *tps; >> + unsigned int version; >> + int ret; >> + >> + tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); >> + if (!tps) >> + return -ENOMEM; >> + >> + i2c_set_clientdata(client, tps); >> + tps->dev = &client->dev; >> + tps->irq = client->irq; >> + >> + tps->regmap = devm_regmap_init_i2c(client, &tps65086_regmap_config); >> + if (IS_ERR(tps->regmap)) { >> + dev_err(tps->dev, "Failed to initialize register map\n"); >> + return PTR_ERR(tps->regmap); >> + } >> + >> + ret = regmap_read(tps->regmap, TPS65086_DEVICEID, &version); >> + if (ret < 0) { >> + dev_err(tps->dev, "Failed to read revision register\n"); >> + return ret; >> + } >> + >> + dev_info(tps->dev, "Device: TPS65086%01lX, OTP: %c, Rev: %ld\n", >> + (version & TPS65086_DEVICEID_PART_MASK), >> + (char)((version & TPS65086_DEVICEID_OTP_MASK) >> 4) + 'A', >> + (version & TPS65086_DEVICEID_REV_MASK) >> 6); >> + >> + ret = regmap_add_irq_chip(tps->regmap, tps->irq, IRQF_ONESHOT, 0, >> + &tps65086_irq_chip, &tps->irq_data); >> + if (ret < 0) { > > if (ret) > ACK >> + dev_err(tps->dev, "Failed to register IRQ chip\n"); >> + return ret; >> + } >> + >> + ret = of_platform_populate(tps->dev->of_node, NULL, NULL, tps->dev); >> + if (ret < 0) { > > if (ret) > ACK >> + regmap_del_irq_chip(tps->irq, tps->irq_data); >> + return ret; >> + } >> + >> + return 0; >> +} >> + >> +static int tps65086_remove(struct i2c_client *client) >> +{ >> + struct tps65086 *tps = i2c_get_clientdata(client); >> + >> + regmap_del_irq_chip(tps->irq, tps->irq_data); >> + >> + return 0; >> +} >> + >> +static const struct i2c_device_id tps65086_id_table[] = { >> + { "tps65086", 0 }, >> + { /* sentinel */ }, >> +}; >> +MODULE_DEVICE_TABLE(i2c, tps65086_id_table); >> + >> +static struct i2c_driver tps65086_driver = { >> + .driver = { >> + .name = "tps65086", >> + .of_match_table = tps65086_of_match_table, >> + }, >> + .probe = tps65086_probe, >> + .remove = tps65086_remove, >> + .id_table = tps65086_id_table, >> +}; >> + >> +module_i2c_driver(tps65086_driver); >> + >> +MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>"); >> +MODULE_DESCRIPTION("TPS65086x PMIC Driver"); >> +MODULE_LICENSE("GPL v2"); >> diff --git a/include/linux/mfd/tps65086.h b/include/linux/mfd/tps65086.h >> new file mode 100644 >> index 0000000..2a9e9dd >> --- /dev/null >> +++ b/include/linux/mfd/tps65086.h >> @@ -0,0 +1,120 @@ >> +/* >> + * TI TPS65086x >> + * >> + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ >> + * >> + * Author: Andrew F. Davis <afd@ti.com> >> + * >> + * This program is free software; you can redistribute it and/or >> + * modify it under the terms of the GNU General Public License version 2 as >> + * published by the Free Software Foundation. >> + * >> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any >> + * kind, whether expressed or implied; without even the implied warranty >> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + * GNU General Public License version 2 for more details. >> + * >> + * Based on the TPS65912 driver >> + */ >> + >> +#ifndef __LINUX_MFD_TPS65086_H >> +#define __LINUX_MFD_TPS65086_H >> + >> +#include <linux/device.h> >> +#include <linux/regmap.h> >> + >> +/* List of registers for TPS65086 */ >> +#define TPS65086_DEVICEID 0x01 >> +#define TPS65086_IRQ 0x02 >> +#define TPS65086_IRQ_MASK 0x03 >> +#define TPS65086_PMICSTAT 0x04 >> +#define TPS65086_SHUTDNSRC 0x05 >> +#define TPS65086_BUCK1CTRL 0x20 >> +#define TPS65086_BUCK2CTRL 0x21 >> +#define TPS65086_BUCK3DECAY 0x22 >> +#define TPS65086_BUCK3VID 0x23 >> +#define TPS65086_BUCK3SLPCTRL 0x24 >> +#define TPS65086_BUCK4CTRL 0x25 >> +#define TPS65086_BUCK5CTRL 0x26 >> +#define TPS65086_BUCK6CTRL 0x27 >> +#define TPS65086_LDOA2CTRL 0x28 >> +#define TPS65086_LDOA3CTRL 0x29 >> +#define TPS65086_DISCHCTRL1 0x40 >> +#define TPS65086_DISCHCTRL2 0x41 >> +#define TPS65086_DISCHCTRL3 0x42 >> +#define TPS65086_PG_DELAY1 0x43 >> +#define TPS65086_FORCESHUTDN 0x91 >> +#define TPS65086_BUCK1SLPCTRL 0x92 >> +#define TPS65086_BUCK2SLPCTRL 0x93 >> +#define TPS65086_BUCK4VID 0x94 >> +#define TPS65086_BUCK4SLPVID 0x95 >> +#define TPS65086_BUCK5VID 0x96 >> +#define TPS65086_BUCK5SLPVID 0x97 >> +#define TPS65086_BUCK6VID 0x98 >> +#define TPS65086_BUCK6SLPVID 0x99 >> +#define TPS65086_LDOA2VID 0x9A >> +#define TPS65086_LDOA3VID 0x9B >> +#define TPS65086_BUCK123CTRL 0x9C >> +#define TPS65086_PG_DELAY2 0x9D >> +#define TPS65086_PIN_EN_MASK1 0x9E >> +#define TPS65086_PIN_EN_MASK2 0x9F >> +#define TPS65086_SWVTT_EN 0x9F >> +#define TPS65086_PIN_EN_OVR1 0xA0 >> +#define TPS65086_PIN_EN_OVR2 0xA1 >> +#define TPS65086_GPOCTRL 0xA1 >> +#define TPS65086_PWR_FAULT_MASK1 0xA2 >> +#define TPS65086_PWR_FAULT_MASK2 0xA3 >> +#define TPS65086_GPO1PG_CTRL1 0xA4 >> +#define TPS65086_GPO1PG_CTRL2 0xA5 >> +#define TPS65086_GPO4PG_CTRL1 0xA6 >> +#define TPS65086_GPO4PG_CTRL2 0xA7 >> +#define TPS65086_GPO2PG_CTRL1 0xA8 >> +#define TPS65086_GPO2PG_CTRL2 0xA9 >> +#define TPS65086_GPO3PG_CTRL1 0xAA >> +#define TPS65086_GPO3PG_CTRL2 0xAB >> +#define TPS65086_LDOA1CTRL 0xAE >> +#define TPS65086_PG_STATUS1 0xB0 >> +#define TPS65086_PG_STATUS2 0xB1 >> +#define TPS65086_PWR_FAULT_STATUS1 0xB2 >> +#define TPS65086_PWR_FAULT_STATUS2 0xB3 >> +#define TPS65086_TEMPCRIT 0xB4 >> +#define TPS65086_TEMPHOT 0xB5 >> +#define TPS65086_OC_STATUS 0xB6 >> + >> +/* IRQ Register field definitions */ >> +#define TPS65086_IRQ_DIETEMP_MASK BIT(0) >> +#define TPS65086_IRQ_SHUTDN_MASK BIT(3) >> +#define TPS65086_IRQ_FAULT_MASK BIT(7) >> + >> +/* DEVICEID Register field definitions */ >> +#define TPS65086_DEVICEID_PART_MASK GENMASK(3, 0) >> +#define TPS65086_DEVICEID_OTP_MASK GENMASK(5, 4) >> +#define TPS65086_DEVICEID_REV_MASK GENMASK(7, 6) >> + >> +/* VID Masks */ >> +#define BUCK_VID_MASK GENMASK(7, 1) >> +#define VDOA1_VID_MASK GENMASK(4, 1) >> +#define VDOA23_VID_MASK GENMASK(3, 0) >> + >> +/* Define the TPS65086 IRQ numbers */ >> +enum tps65086_irqs { >> + TPS65086_IRQ_DIETEMP, >> + TPS65086_IRQ_SHUTDN, >> + TPS65086_IRQ_FAULT, >> +}; >> + >> +/* >> + * struct tps65086 - state holder for the tps65086 driver >> + * >> + * Device data may be used to access the TPS65086 chip >> + */ >> +struct tps65086 { >> + struct device *dev; >> + struct regmap *regmap; >> + >> + /* IRQ Data */ >> + int irq; >> + struct regmap_irq_chip_data *irq_data; >> +}; >> + >> +#endif /* __LINUX_MFD_TPS65086_H */ >
On Mon, 19 Oct 2015, Andrew F. Davis wrote: > On 10/19/2015 04:23 AM, Lee Jones wrote: > >On Fri, 16 Oct 2015, Andrew F. Davis wrote: > > > >>Add support for the TPS65912 device. It provides communication > >>through I2C and contains the following components: > >> > >> - Regulators > >> - Load switches > >> - GPO controller > > > >What's a GPO controller? > > General Purpose Output, this controller only has output control, it's > listed in the data-sheet this way, and other drivers have used this term. Okay. > >>Signed-off-by: Andrew F. Davis <afd@ti.com> > >>--- > >> drivers/mfd/Kconfig | 13 ++++ > >> drivers/mfd/Makefile | 1 + > >> drivers/mfd/tps65086.c | 145 +++++++++++++++++++++++++++++++++++++++++++ > >> include/linux/mfd/tps65086.h | 120 +++++++++++++++++++++++++++++++++++ > >> 4 files changed, 279 insertions(+) > >> create mode 100644 drivers/mfd/tps65086.c > >> create mode 100644 include/linux/mfd/tps65086.h > >> > >>diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > >>index 99d6367..ab3b392 100644 > >>--- a/drivers/mfd/Kconfig > >>+++ b/drivers/mfd/Kconfig > >>@@ -1093,6 +1093,19 @@ config TPS6507X > >> This driver can also be built as a module. If so, the module > >> will be called tps6507x. > >> > >>+config MFD_TPS65086 > >>+ tristate "TI TPS65086x Power Management chips" > > > >Use the full name: > > > > "TI TPS65086x Power Management Integrated Chips (PMICs)" > > > >>+ select REGMAP > >>+ select REGMAP_IRQ > >>+ select REGMAP_I2C > >>+ depends on I2C > > > >REGMAP_I2C already depends on I2C. > > > > So if I force REGMAP_I2C to =y without depending on I2C then couldn't > REGMAP_I2C get selected without I2C enabled? Selecting doesn't force > the selected item's dependencies still right? Try it out. :) > >>+ depends on OF || COMPILE_TEST > >>+ help > >>+ If you say yes here you get support for the TPS65086 series of > >>+ Power Management chips. > > > >I'd remove the line break. > > > >>+ These include voltage regulators, GPO and other features > > > >GPIO? > > > >>+ that are often used in portable devices. > > > >This is meant to be a 'help', so instead of staying "and some other > >stuff", please list them. > > > > This seems to be what other devices do, I'll change it to something > else then. If you know what the "other features" are, it's best to name them. > >> config TPS65911_COMPARATOR > >> tristate > >> > >>diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile > >>index a59e3fc..7adb902 100644 > >>--- a/drivers/mfd/Makefile > >>+++ b/drivers/mfd/Makefile > >>@@ -66,6 +66,7 @@ obj-$(CONFIG_MFD_WM8994) += wm8994-core.o wm8994-irq.o wm8994-regmap.o > >> obj-$(CONFIG_TPS6105X) += tps6105x.o > >> obj-$(CONFIG_TPS65010) += tps65010.o > >> obj-$(CONFIG_TPS6507X) += tps6507x.o > >>+obj-$(CONFIG_MFD_TPS65086) += tps65086.o > >> obj-$(CONFIG_MFD_TPS65217) += tps65217.o > >> obj-$(CONFIG_MFD_TPS65218) += tps65218.o > >> obj-$(CONFIG_MFD_TPS65910) += tps65910.o > >>diff --git a/drivers/mfd/tps65086.c b/drivers/mfd/tps65086.c > >>new file mode 100644 > >>index 0000000..be6d678 > >>--- /dev/null > >>+++ b/drivers/mfd/tps65086.c > >>@@ -0,0 +1,145 @@ > >>+/* > >>+ * Driver for TI TPS65086x PMICs > > > >I'd suggest removing the driver part. We know it's a driver. > > Again this is what almost every other driver does, Almost every other driver. That's some statement. I count 42%. ;) > I'm not sure how > else to describe this file without using the word driver. Perhaps I'm getting picky in my old age, but I think I'd prefer to see: TI TPS65086x PMIC support [...]
On 10/20/2015 05:02 AM, Lee Jones wrote: > On Mon, 19 Oct 2015, Andrew F. Davis wrote: >> On 10/19/2015 04:23 AM, Lee Jones wrote: >>> On Fri, 16 Oct 2015, Andrew F. Davis wrote: >>> >>>> Add support for the TPS65912 device. It provides communication >>>> through I2C and contains the following components: >>>> >>>> - Regulators >>>> - Load switches >>>> - GPO controller >>> >>> What's a GPO controller? >> >> General Purpose Output, this controller only has output control, it's >> listed in the data-sheet this way, and other drivers have used this term. > > Okay. > >>>> Signed-off-by: Andrew F. Davis <afd@ti.com> >>>> --- >>>> drivers/mfd/Kconfig | 13 ++++ >>>> drivers/mfd/Makefile | 1 + >>>> drivers/mfd/tps65086.c | 145 +++++++++++++++++++++++++++++++++++++++++++ >>>> include/linux/mfd/tps65086.h | 120 +++++++++++++++++++++++++++++++++++ >>>> 4 files changed, 279 insertions(+) >>>> create mode 100644 drivers/mfd/tps65086.c >>>> create mode 100644 include/linux/mfd/tps65086.h >>>> >>>> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig >>>> index 99d6367..ab3b392 100644 >>>> --- a/drivers/mfd/Kconfig >>>> +++ b/drivers/mfd/Kconfig >>>> @@ -1093,6 +1093,19 @@ config TPS6507X >>>> This driver can also be built as a module. If so, the module >>>> will be called tps6507x. >>>> >>>> +config MFD_TPS65086 >>>> + tristate "TI TPS65086x Power Management chips" >>> >>> Use the full name: >>> >>> "TI TPS65086x Power Management Integrated Chips (PMICs)" >>> >>>> + select REGMAP >>>> + select REGMAP_IRQ >>>> + select REGMAP_I2C >>>> + depends on I2C >>> >>> REGMAP_I2C already depends on I2C. >>> >> >> So if I force REGMAP_I2C to =y without depending on I2C then couldn't >> REGMAP_I2C get selected without I2C enabled? Selecting doesn't force >> the selected item's dependencies still right? > > Try it out. :) > OK, I just tried a little test and it did as I expected, I was able to select a symbol and it did not enable its dependency, so this would break build. So, I'm still confused, why does REGMAP_I2C depending on I2C matter? What are you suggesting my Kconfig should look like? >>>> + depends on OF || COMPILE_TEST >>>> + help >>>> + If you say yes here you get support for the TPS65086 series of >>>> + Power Management chips. >>> >>> I'd remove the line break. >>> >>>> + These include voltage regulators, GPO and other features >>> >>> GPIO? >>> >>>> + that are often used in portable devices. >>> >>> This is meant to be a 'help', so instead of staying "and some other >>> stuff", please list them. >>> >> >> This seems to be what other devices do, I'll change it to something >> else then. > > If you know what the "other features" are, it's best to name them. > I was giving a generic description of a PMIC, I didn't really want to list all the features and start marketing the part in the Kconfig, unless you want, I'm sure TI won't mind the advertisement. :) I'm not sure why we write so much about these driver parts at all in the help, people who need them know what they are, it's not like some core kernel config option that people might be undecided on and need explained its function. >>>> config TPS65911_COMPARATOR >>>> tristate >>>> >>>> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile >>>> index a59e3fc..7adb902 100644 >>>> --- a/drivers/mfd/Makefile >>>> +++ b/drivers/mfd/Makefile >>>> @@ -66,6 +66,7 @@ obj-$(CONFIG_MFD_WM8994) += wm8994-core.o wm8994-irq.o wm8994-regmap.o >>>> obj-$(CONFIG_TPS6105X) += tps6105x.o >>>> obj-$(CONFIG_TPS65010) += tps65010.o >>>> obj-$(CONFIG_TPS6507X) += tps6507x.o >>>> +obj-$(CONFIG_MFD_TPS65086) += tps65086.o >>>> obj-$(CONFIG_MFD_TPS65217) += tps65217.o >>>> obj-$(CONFIG_MFD_TPS65218) += tps65218.o >>>> obj-$(CONFIG_MFD_TPS65910) += tps65910.o >>>> diff --git a/drivers/mfd/tps65086.c b/drivers/mfd/tps65086.c >>>> new file mode 100644 >>>> index 0000000..be6d678 >>>> --- /dev/null >>>> +++ b/drivers/mfd/tps65086.c >>>> @@ -0,0 +1,145 @@ >>>> +/* >>>> + * Driver for TI TPS65086x PMICs >>> >>> I'd suggest removing the driver part. We know it's a driver. >> >> Again this is what almost every other driver does, > > Almost every other driver. That's some statement. > > I count 42%. ;) > I'm finding in drivers/mfd ~89% of drivers mention at some point that they are a driver. But I do admit my original statement was based on a quick monte carlo selection of a couple files. :) >> I'm not sure how >> else to describe this file without using the word driver. > > Perhaps I'm getting picky in my old age, but I think I'd prefer to see: > > TI TPS65086x PMIC support > Still not sure this describes the file, maybe we could just drop that line completely from files with an obvious purpose? Doesn't really bother me ether way. > [...] > -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, 20 Oct 2015, Andrew F. Davis wrote: > On 10/20/2015 05:02 AM, Lee Jones wrote: > >On Mon, 19 Oct 2015, Andrew F. Davis wrote: > >>On 10/19/2015 04:23 AM, Lee Jones wrote: > >>>On Fri, 16 Oct 2015, Andrew F. Davis wrote: > >>> > >>>>Add support for the TPS65912 device. It provides communication > >>>>through I2C and contains the following components: > >>>> > >>>> - Regulators > >>>> - Load switches > >>>> - GPO controller > >>> > >>>What's a GPO controller? > >> > >>General Purpose Output, this controller only has output control, it's > >>listed in the data-sheet this way, and other drivers have used this term. > > > >Okay. > > > >>>>Signed-off-by: Andrew F. Davis <afd@ti.com> > >>>>--- > >>>> drivers/mfd/Kconfig | 13 ++++ > >>>> drivers/mfd/Makefile | 1 + > >>>> drivers/mfd/tps65086.c | 145 +++++++++++++++++++++++++++++++++++++++++++ > >>>> include/linux/mfd/tps65086.h | 120 +++++++++++++++++++++++++++++++++++ > >>>> 4 files changed, 279 insertions(+) > >>>> create mode 100644 drivers/mfd/tps65086.c > >>>> create mode 100644 include/linux/mfd/tps65086.h > >>>> > >>>>diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > >>>>index 99d6367..ab3b392 100644 > >>>>--- a/drivers/mfd/Kconfig > >>>>+++ b/drivers/mfd/Kconfig > >>>>@@ -1093,6 +1093,19 @@ config TPS6507X > >>>> This driver can also be built as a module. If so, the module > >>>> will be called tps6507x. > >>>> > >>>>+config MFD_TPS65086 > >>>>+ tristate "TI TPS65086x Power Management chips" > >>> > >>>Use the full name: > >>> > >>> "TI TPS65086x Power Management Integrated Chips (PMICs)" > >>> > >>>>+ select REGMAP > >>>>+ select REGMAP_IRQ > >>>>+ select REGMAP_I2C > >>>>+ depends on I2C > >>> > >>>REGMAP_I2C already depends on I2C. > >>> > >> > >>So if I force REGMAP_I2C to =y without depending on I2C then couldn't > >>REGMAP_I2C get selected without I2C enabled? Selecting doesn't force > >>the selected item's dependencies still right? > > > >Try it out. :) > > > > OK, I just tried a little test and it did as I expected, I was able to > select a symbol and it did not enable its dependency, so this would > break build. So, I'm still confused, why does REGMAP_I2C depending > on I2C matter? What are you suggesting my Kconfig should look like? That's fine, if you've tested it and it's a problem the above will do. I'm still little curious as to why it's necessary to depend on the same symbols your dependencies depend on. How far up the chain is it possible to go? config DEPA config DEPB select DEPA config DEPC select DEPB depends on DEPA config DEPD select DEPC depends on DEPA depends on DEPB config YOU select DEPD depends on DEPA depends on DEPB depends on DEPC Etc. > >>>>+ depends on OF || COMPILE_TEST > >>>>+ help > >>>>+ If you say yes here you get support for the TPS65086 series of > >>>>+ Power Management chips. > >>> > >>>I'd remove the line break. > >>> > >>>>+ These include voltage regulators, GPO and other features > >>> > >>>GPIO? > >>> > >>>>+ that are often used in portable devices. > >>> > >>>This is meant to be a 'help', so instead of staying "and some other > >>>stuff", please list them. > >>> > >> > >>This seems to be what other devices do, I'll change it to something > >>else then. > > > >If you know what the "other features" are, it's best to name them. > > I was giving a generic description of a PMIC, I didn't really want to > list all the features and start marketing the part in the Kconfig, unless > you want, I'm sure TI won't mind the advertisement. :) > > I'm not sure why we write so much about these driver parts at all in the > help, people who need them know what they are, it's not like some core > kernel config option that people might be undecided on and need explained > its function. I'm sure when you've been trying to find answers to questions you've found the help helpful (or maybe it was poorly underwritten and you didn't find it useful at all). Without the help, all these drivers are just a selection of random letters, numbers and code/project names. It's the help which brings them to life, so to speak. Please describe the device and what it provides. No sales pitch required. > >>>> config TPS65911_COMPARATOR > >>>> tristate > >>>> > >>>>diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile > >>>>index a59e3fc..7adb902 100644 > >>>>--- a/drivers/mfd/Makefile > >>>>+++ b/drivers/mfd/Makefile > >>>>@@ -66,6 +66,7 @@ obj-$(CONFIG_MFD_WM8994) += wm8994-core.o wm8994-irq.o wm8994-regmap.o > >>>> obj-$(CONFIG_TPS6105X) += tps6105x.o > >>>> obj-$(CONFIG_TPS65010) += tps65010.o > >>>> obj-$(CONFIG_TPS6507X) += tps6507x.o > >>>>+obj-$(CONFIG_MFD_TPS65086) += tps65086.o > >>>> obj-$(CONFIG_MFD_TPS65217) += tps65217.o > >>>> obj-$(CONFIG_MFD_TPS65218) += tps65218.o > >>>> obj-$(CONFIG_MFD_TPS65910) += tps65910.o > >>>>diff --git a/drivers/mfd/tps65086.c b/drivers/mfd/tps65086.c > >>>>new file mode 100644 > >>>>index 0000000..be6d678 > >>>>--- /dev/null > >>>>+++ b/drivers/mfd/tps65086.c > >>>>@@ -0,0 +1,145 @@ > >>>>+/* > >>>>+ * Driver for TI TPS65086x PMICs > >>> > >>>I'd suggest removing the driver part. We know it's a driver. > >> > >>Again this is what almost every other driver does, > > > >Almost every other driver. That's some statement. > > > >I count 42%. ;) > > > > I'm finding in drivers/mfd ~89% of drivers mention at some point that > they are a driver. But I do admit my original statement was based on a > quick monte carlo selection of a couple files. :) I'm sure many drivers, mention the word driver at one point. However, this is specifically regarding the file title/header. > >>I'm not sure how > >>else to describe this file without using the word driver. > > > >Perhaps I'm getting picky in my old age, but I think I'd prefer to see: > > > > TI TPS65086x PMIC support > > > > Still not sure this describes the file, maybe we could just drop that > line completely from files with an obvious purpose? Doesn't really bother > me ether way. Sure.
On 10/21/2015 03:43 AM, Lee Jones wrote: > On Tue, 20 Oct 2015, Andrew F. Davis wrote: > >> On 10/20/2015 05:02 AM, Lee Jones wrote: >>> On Mon, 19 Oct 2015, Andrew F. Davis wrote: >>>> On 10/19/2015 04:23 AM, Lee Jones wrote: >>>>> On Fri, 16 Oct 2015, Andrew F. Davis wrote: >>>>> >>>>>> Add support for the TPS65912 device. It provides communication >>>>>> through I2C and contains the following components: >>>>>> >>>>>> - Regulators >>>>>> - Load switches >>>>>> - GPO controller >>>>> >>>>> What's a GPO controller? >>>> >>>> General Purpose Output, this controller only has output control, it's >>>> listed in the data-sheet this way, and other drivers have used this term. >>> >>> Okay. >>> >>>>>> Signed-off-by: Andrew F. Davis <afd@ti.com> >>>>>> --- >>>>>> drivers/mfd/Kconfig | 13 ++++ >>>>>> drivers/mfd/Makefile | 1 + >>>>>> drivers/mfd/tps65086.c | 145 +++++++++++++++++++++++++++++++++++++++++++ >>>>>> include/linux/mfd/tps65086.h | 120 +++++++++++++++++++++++++++++++++++ >>>>>> 4 files changed, 279 insertions(+) >>>>>> create mode 100644 drivers/mfd/tps65086.c >>>>>> create mode 100644 include/linux/mfd/tps65086.h >>>>>> >>>>>> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig >>>>>> index 99d6367..ab3b392 100644 >>>>>> --- a/drivers/mfd/Kconfig >>>>>> +++ b/drivers/mfd/Kconfig >>>>>> @@ -1093,6 +1093,19 @@ config TPS6507X >>>>>> This driver can also be built as a module. If so, the module >>>>>> will be called tps6507x. >>>>>> >>>>>> +config MFD_TPS65086 >>>>>> + tristate "TI TPS65086x Power Management chips" >>>>> >>>>> Use the full name: >>>>> >>>>> "TI TPS65086x Power Management Integrated Chips (PMICs)" >>>>> >>>>>> + select REGMAP >>>>>> + select REGMAP_IRQ >>>>>> + select REGMAP_I2C >>>>>> + depends on I2C >>>>> >>>>> REGMAP_I2C already depends on I2C. >>>>> >>>> >>>> So if I force REGMAP_I2C to =y without depending on I2C then couldn't >>>> REGMAP_I2C get selected without I2C enabled? Selecting doesn't force >>>> the selected item's dependencies still right? >>> >>> Try it out. :) >>> >> >> OK, I just tried a little test and it did as I expected, I was able to >> select a symbol and it did not enable its dependency, so this would >> break build. So, I'm still confused, why does REGMAP_I2C depending >> on I2C matter? What are you suggesting my Kconfig should look like? > > That's fine, if you've tested it and it's a problem the above will do. > > I'm still little curious as to why it's necessary to depend on the > same symbols your dependencies depend on. > Because I don't 'depend' on REGMAP_I2C, I 'select' it. So none of its dependencies need be met, so I have to depend on them for REGMAP_I2C. 'Depending' on REGMAP_I2C would also be undesirable as my symbol would only be visible when REGMAP_I2C is =y, this would obscure my symbol as no one would know to turn on REGMAP_I2C to make my driver appear. I only need I2C and then I can go manually enable all my random helper symbols myself if I'm selected. > How far up the chain is it possible to go? > > config DEPA > > config DEPB > select DEPA > > config DEPC > select DEPB > depends on DEPA > > config DEPD > select DEPC > depends on DEPA > depends on DEPB > > config YOU > select DEPD > depends on DEPA > depends on DEPB > depends on DEPC > > Etc. > To me it seems like a fundamental issue with how the Kconfig system was originally designed (a quick check shows it existed in some form 20 years ago...) that leads to this kind of thing, if they knew how it would be used today they probably would have made it more directed-tree like, without the reverse dependencies and all. >>>>>> + depends on OF || COMPILE_TEST >>>>>> + help >>>>>> + If you say yes here you get support for the TPS65086 series of >>>>>> + Power Management chips. >>>>> >>>>> I'd remove the line break. >>>>> >>>>>> + These include voltage regulators, GPO and other features >>>>> >>>>> GPIO? >>>>> >>>>>> + that are often used in portable devices. >>>>> >>>>> This is meant to be a 'help', so instead of staying "and some other >>>>> stuff", please list them. >>>>> >>>> >>>> This seems to be what other devices do, I'll change it to something >>>> else then. >>> >>> If you know what the "other features" are, it's best to name them. >> >> I was giving a generic description of a PMIC, I didn't really want to >> list all the features and start marketing the part in the Kconfig, unless >> you want, I'm sure TI won't mind the advertisement. :) >> >> I'm not sure why we write so much about these driver parts at all in the >> help, people who need them know what they are, it's not like some core >> kernel config option that people might be undecided on and need explained >> its function. > > I'm sure when you've been trying to find answers to questions you've > found the help helpful (or maybe it was poorly underwritten and you > didn't find it useful at all). Without the help, all these drivers > are just a selection of random letters, numbers and code/project > names. It's the help which brings them to life, so to speak. > Well sure, they have been a lot of help for core config where I might not know what CONFIG_PERF_EVENTS means and a long explanation is nice, but I know what a TPS65086 is, if I didn't I wouldn't be trying to enable the driver for it. > Please describe the device and what it provides. No sales pitch > required. > I'll see what I can think up. "These include voltage regulators, GPIO and other features that are often used in portable devices." Really does give the gist of it for uninformed users who might want to know why this is enabled for their computer/board. Honestly I don't think the part actually does anything else, but saying that when other similar parts add the "other features" line is kinda odd and might single out this part as looking less useful. >>>>>> config TPS65911_COMPARATOR >>>>>> tristate >>>>>> >>>>>> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile >>>>>> index a59e3fc..7adb902 100644 >>>>>> --- a/drivers/mfd/Makefile >>>>>> +++ b/drivers/mfd/Makefile >>>>>> @@ -66,6 +66,7 @@ obj-$(CONFIG_MFD_WM8994) += wm8994-core.o wm8994-irq.o wm8994-regmap.o >>>>>> obj-$(CONFIG_TPS6105X) += tps6105x.o >>>>>> obj-$(CONFIG_TPS65010) += tps65010.o >>>>>> obj-$(CONFIG_TPS6507X) += tps6507x.o >>>>>> +obj-$(CONFIG_MFD_TPS65086) += tps65086.o >>>>>> obj-$(CONFIG_MFD_TPS65217) += tps65217.o >>>>>> obj-$(CONFIG_MFD_TPS65218) += tps65218.o >>>>>> obj-$(CONFIG_MFD_TPS65910) += tps65910.o >>>>>> diff --git a/drivers/mfd/tps65086.c b/drivers/mfd/tps65086.c >>>>>> new file mode 100644 >>>>>> index 0000000..be6d678 >>>>>> --- /dev/null >>>>>> +++ b/drivers/mfd/tps65086.c >>>>>> @@ -0,0 +1,145 @@ >>>>>> +/* >>>>>> + * Driver for TI TPS65086x PMICs >>>>> >>>>> I'd suggest removing the driver part. We know it's a driver. >>>> >>>> Again this is what almost every other driver does, >>> >>> Almost every other driver. That's some statement. >>> >>> I count 42%. ;) >>> >> >> I'm finding in drivers/mfd ~89% of drivers mention at some point that >> they are a driver. But I do admit my original statement was based on a >> quick monte carlo selection of a couple files. :) > > I'm sure many drivers, mention the word driver at one point. However, > this is specifically regarding the file title/header. > Got it, just felt like hairsplitting :) >>>> I'm not sure how >>>> else to describe this file without using the word driver. >>> >>> Perhaps I'm getting picky in my old age, but I think I'd prefer to see: >>> >>> TI TPS65086x PMIC support >>> >> >> Still not sure this describes the file, maybe we could just drop that >> line completely from files with an obvious purpose? Doesn't really bother >> me ether way. > > Sure. > ACK
On Wed, 21 Oct 2015, Andrew F. Davis wrote: > On 10/21/2015 03:43 AM, Lee Jones wrote: > >On Tue, 20 Oct 2015, Andrew F. Davis wrote: > > > >>On 10/20/2015 05:02 AM, Lee Jones wrote: > >>>On Mon, 19 Oct 2015, Andrew F. Davis wrote: > >>>>On 10/19/2015 04:23 AM, Lee Jones wrote: > >>>>>On Fri, 16 Oct 2015, Andrew F. Davis wrote: > >>>>> > >>>>>>Add support for the TPS65912 device. It provides communication > >>>>>>through I2C and contains the following components: > >>>>>> > >>>>>> - Regulators > >>>>>> - Load switches > >>>>>> - GPO controller > >>>>> > >>>>>What's a GPO controller? > >>>> > >>>>General Purpose Output, this controller only has output control, it's > >>>>listed in the data-sheet this way, and other drivers have used this term. > >>> > >>>Okay. > >>> > >>>>>>Signed-off-by: Andrew F. Davis <afd@ti.com> > >>>>>>--- > >>>>>> drivers/mfd/Kconfig | 13 ++++ > >>>>>> drivers/mfd/Makefile | 1 + > >>>>>> drivers/mfd/tps65086.c | 145 +++++++++++++++++++++++++++++++++++++++++++ > >>>>>> include/linux/mfd/tps65086.h | 120 +++++++++++++++++++++++++++++++++++ > >>>>>> 4 files changed, 279 insertions(+) > >>>>>> create mode 100644 drivers/mfd/tps65086.c > >>>>>> create mode 100644 include/linux/mfd/tps65086.h > >>>>>> > >>>>>>diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > >>>>>>index 99d6367..ab3b392 100644 > >>>>>>--- a/drivers/mfd/Kconfig > >>>>>>+++ b/drivers/mfd/Kconfig > >>>>>>@@ -1093,6 +1093,19 @@ config TPS6507X > >>>>>> This driver can also be built as a module. If so, the module > >>>>>> will be called tps6507x. > >>>>>> > >>>>>>+config MFD_TPS65086 > >>>>>>+ tristate "TI TPS65086x Power Management chips" > >>>>> > >>>>>Use the full name: > >>>>> > >>>>> "TI TPS65086x Power Management Integrated Chips (PMICs)" > >>>>> > >>>>>>+ select REGMAP > >>>>>>+ select REGMAP_IRQ > >>>>>>+ select REGMAP_I2C > >>>>>>+ depends on I2C > >>>>> > >>>>>REGMAP_I2C already depends on I2C. > >>>>> > >>>> > >>>>So if I force REGMAP_I2C to =y without depending on I2C then couldn't > >>>>REGMAP_I2C get selected without I2C enabled? Selecting doesn't force > >>>>the selected item's dependencies still right? > >>> > >>>Try it out. :) > >>> > >> > >>OK, I just tried a little test and it did as I expected, I was able to > >>select a symbol and it did not enable its dependency, so this would > >>break build. So, I'm still confused, why does REGMAP_I2C depending > >>on I2C matter? What are you suggesting my Kconfig should look like? > > > >That's fine, if you've tested it and it's a problem the above will do. > > > >I'm still little curious as to why it's necessary to depend on the > >same symbols your dependencies depend on. > > > > Because I don't 'depend' on REGMAP_I2C, I 'select' it. So none of its > dependencies need be met, so I have to depend on them for REGMAP_I2C. > > 'Depending' on REGMAP_I2C would also be undesirable as my symbol would > only be visible when REGMAP_I2C is =y, this would obscure my symbol as > no one would know to turn on REGMAP_I2C to make my driver appear. I > only need I2C and then I can go manually enable all my random helper > symbols myself if I'm selected. Right. I understand the fundamentals of how Kconfig works, I guess I just hoped it would be better in cases like this. > >How far up the chain is it possible to go? > > > >config DEPA > > > >config DEPB > > select DEPA > > > >config DEPC > > select DEPB > > depends on DEPA > > > >config DEPD > > select DEPC > > depends on DEPA > > depends on DEPB > > > >config YOU > > select DEPD > > depends on DEPA > > depends on DEPB > > depends on DEPC > > > >Etc. > > > > To me it seems like a fundamental issue with how the Kconfig system > was originally designed (a quick check shows it existed in some form > 20 years ago...) that leads to this kind of thing, if they knew how > it would be used today they probably would have made it more > directed-tree like, without the reverse dependencies and all. Yes, perhaps. > >>>>>>+ depends on OF || COMPILE_TEST > >>>>>>+ help > >>>>>>+ If you say yes here you get support for the TPS65086 series of > >>>>>>+ Power Management chips. > >>>>> > >>>>>I'd remove the line break. > >>>>> > >>>>>>+ These include voltage regulators, GPO and other features > >>>>> > >>>>>GPIO? > >>>>> > >>>>>>+ that are often used in portable devices. > >>>>> > >>>>>This is meant to be a 'help', so instead of staying "and some other > >>>>>stuff", please list them. > >>>>> > >>>> > >>>>This seems to be what other devices do, I'll change it to something > >>>>else then. > >>> > >>>If you know what the "other features" are, it's best to name them. > >> > >>I was giving a generic description of a PMIC, I didn't really want to > >>list all the features and start marketing the part in the Kconfig, unless > >>you want, I'm sure TI won't mind the advertisement. :) > >> > >>I'm not sure why we write so much about these driver parts at all in the > >>help, people who need them know what they are, it's not like some core > >>kernel config option that people might be undecided on and need explained > >>its function. > > > >I'm sure when you've been trying to find answers to questions you've > >found the help helpful (or maybe it was poorly underwritten and you > >didn't find it useful at all). Without the help, all these drivers > >are just a selection of random letters, numbers and code/project > >names. It's the help which brings them to life, so to speak. > > > > Well sure, they have been a lot of help for core config where I might > not know what CONFIG_PERF_EVENTS means and a long explanation is nice, > but I know what a TPS65086 is, if I didn't I wouldn't be trying to > enable the driver for it. That's a very single minded view. The help isn't just for people looking to enable drivers. Think about the maintenance aspect and people who are either just curious or wish to learn more. The help should be useful (helpful), rather than each of them saying "enable this to add support for <enter crappy non-descriptive model number here> and all of it's other features". > >Please describe the device and what it provides. No sales pitch > >required. > > > > I'll see what I can think up. "These include voltage regulators, GPIO > and other features that are often used in portable devices." Really > does give the gist of it for uninformed users who might want to know > why this is enabled for their computer/board. If there really are "other features" and you know what they are, then list them. If there aren't or *might be*, but you don't know what they are just omit the phrase. Saying "and some other stuff" is a cop-out. > Honestly I don't think the part actually does anything else, but saying > that when other similar parts add the "other features" line is kinda > odd and might single out this part as looking less useful. Ah ha! Exactly my point. So if it's fluff just remove it. > >>>>>> config TPS65911_COMPARATOR > >>>>>> tristate > >>>>>> > >>>>>>diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile > >>>>>>index a59e3fc..7adb902 100644 > >>>>>>--- a/drivers/mfd/Makefile > >>>>>>+++ b/drivers/mfd/Makefile > >>>>>>@@ -66,6 +66,7 @@ obj-$(CONFIG_MFD_WM8994) += wm8994-core.o wm8994-irq.o wm8994-regmap.o > >>>>>> obj-$(CONFIG_TPS6105X) += tps6105x.o > >>>>>> obj-$(CONFIG_TPS65010) += tps65010.o > >>>>>> obj-$(CONFIG_TPS6507X) += tps6507x.o > >>>>>>+obj-$(CONFIG_MFD_TPS65086) += tps65086.o > >>>>>> obj-$(CONFIG_MFD_TPS65217) += tps65217.o > >>>>>> obj-$(CONFIG_MFD_TPS65218) += tps65218.o > >>>>>> obj-$(CONFIG_MFD_TPS65910) += tps65910.o > >>>>>>diff --git a/drivers/mfd/tps65086.c b/drivers/mfd/tps65086.c > >>>>>>new file mode 100644 > >>>>>>index 0000000..be6d678 > >>>>>>--- /dev/null > >>>>>>+++ b/drivers/mfd/tps65086.c > >>>>>>@@ -0,0 +1,145 @@ > >>>>>>+/* > >>>>>>+ * Driver for TI TPS65086x PMICs > >>>>> > >>>>>I'd suggest removing the driver part. We know it's a driver. > >>>> > >>>>Again this is what almost every other driver does, > >>> > >>>Almost every other driver. That's some statement. > >>> > >>>I count 42%. ;) > >>> > >> > >>I'm finding in drivers/mfd ~89% of drivers mention at some point that > >>they are a driver. But I do admit my original statement was based on a > >>quick monte carlo selection of a couple files. :) > > > >I'm sure many drivers, mention the word driver at one point. However, > >this is specifically regarding the file title/header. > > > > Got it, just felt like hairsplitting :) > > >>>>I'm not sure how > >>>>else to describe this file without using the word driver. > >>> > >>>Perhaps I'm getting picky in my old age, but I think I'd prefer to see: > >>> > >>> TI TPS65086x PMIC support > >>> > >> > >>Still not sure this describes the file, maybe we could just drop that > >>line completely from files with an obvious purpose? Doesn't really bother > >>me ether way. > > > >Sure. > > > > ACK >
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index 99d6367..ab3b392 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -1093,6 +1093,19 @@ config TPS6507X This driver can also be built as a module. If so, the module will be called tps6507x. +config MFD_TPS65086 + tristate "TI TPS65086x Power Management chips" + select REGMAP + select REGMAP_IRQ + select REGMAP_I2C + depends on I2C + depends on OF || COMPILE_TEST + help + If you say yes here you get support for the TPS65086 series of + Power Management chips. + These include voltage regulators, GPO and other features + that are often used in portable devices. + config TPS65911_COMPARATOR tristate diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index a59e3fc..7adb902 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile @@ -66,6 +66,7 @@ obj-$(CONFIG_MFD_WM8994) += wm8994-core.o wm8994-irq.o wm8994-regmap.o obj-$(CONFIG_TPS6105X) += tps6105x.o obj-$(CONFIG_TPS65010) += tps65010.o obj-$(CONFIG_TPS6507X) += tps6507x.o +obj-$(CONFIG_MFD_TPS65086) += tps65086.o obj-$(CONFIG_MFD_TPS65217) += tps65217.o obj-$(CONFIG_MFD_TPS65218) += tps65218.o obj-$(CONFIG_MFD_TPS65910) += tps65910.o diff --git a/drivers/mfd/tps65086.c b/drivers/mfd/tps65086.c new file mode 100644 index 0000000..be6d678 --- /dev/null +++ b/drivers/mfd/tps65086.c @@ -0,0 +1,145 @@ +/* + * Driver for TI TPS65086x PMICs + * + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ + * + * Author: Andrew F. Davis <afd@ti.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether expressed or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License version 2 for more details. + * + * Based on the TPS65912 driver + */ + +#include <linux/i2c.h> +#include <linux/interrupt.h> +#include <linux/module.h> +#include <linux/of_device.h> + +#include <linux/mfd/tps65086.h> + +static const struct regmap_range tps65086_yes_ranges[] = { + regmap_reg_range(TPS65086_IRQ, TPS65086_IRQ), + regmap_reg_range(TPS65086_PMICSTAT, TPS65086_SHUTDNSRC), + regmap_reg_range(TPS65086_GPOCTRL, TPS65086_GPOCTRL), + regmap_reg_range(TPS65086_PG_STATUS1, TPS65086_OC_STATUS), +}; + +static const struct regmap_access_table tps65086_volatile_table = { + .yes_ranges = tps65086_yes_ranges, + .n_yes_ranges = ARRAY_SIZE(tps65086_yes_ranges), +}; + +static const struct regmap_config tps65086_regmap_config = { + .reg_bits = 8, + .val_bits = 8, + .cache_type = REGCACHE_RBTREE, + .volatile_table = &tps65086_volatile_table, +}; + +static const struct regmap_irq tps65086_irqs[] = { + REGMAP_IRQ_REG(TPS65086_IRQ_DIETEMP, 0, TPS65086_IRQ_DIETEMP_MASK), + REGMAP_IRQ_REG(TPS65086_IRQ_SHUTDN, 0, TPS65086_IRQ_SHUTDN_MASK), + REGMAP_IRQ_REG(TPS65086_IRQ_FAULT, 0, TPS65086_IRQ_FAULT_MASK), +}; + +static struct regmap_irq_chip tps65086_irq_chip = { + .name = "tps65086", + .status_base = TPS65086_IRQ, + .mask_base = TPS65086_IRQ_MASK, + .ack_base = TPS65086_IRQ, + .init_ack_masked = true, + .num_regs = 1, + .irqs = tps65086_irqs, + .num_irqs = ARRAY_SIZE(tps65086_irqs), +}; + +static const struct of_device_id tps65086_of_match_table[] = { + { .compatible = "ti,tps65086", }, + { /* sentinel */ } +}; + +static int tps65086_probe(struct i2c_client *client, + const struct i2c_device_id *ids) +{ + struct tps65086 *tps; + unsigned int version; + int ret; + + tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); + if (!tps) + return -ENOMEM; + + i2c_set_clientdata(client, tps); + tps->dev = &client->dev; + tps->irq = client->irq; + + tps->regmap = devm_regmap_init_i2c(client, &tps65086_regmap_config); + if (IS_ERR(tps->regmap)) { + dev_err(tps->dev, "Failed to initialize register map\n"); + return PTR_ERR(tps->regmap); + } + + ret = regmap_read(tps->regmap, TPS65086_DEVICEID, &version); + if (ret < 0) { + dev_err(tps->dev, "Failed to read revision register\n"); + return ret; + } + + dev_info(tps->dev, "Device: TPS65086%01lX, OTP: %c, Rev: %ld\n", + (version & TPS65086_DEVICEID_PART_MASK), + (char)((version & TPS65086_DEVICEID_OTP_MASK) >> 4) + 'A', + (version & TPS65086_DEVICEID_REV_MASK) >> 6); + + ret = regmap_add_irq_chip(tps->regmap, tps->irq, IRQF_ONESHOT, 0, + &tps65086_irq_chip, &tps->irq_data); + if (ret < 0) { + dev_err(tps->dev, "Failed to register IRQ chip\n"); + return ret; + } + + ret = of_platform_populate(tps->dev->of_node, NULL, NULL, tps->dev); + if (ret < 0) { + regmap_del_irq_chip(tps->irq, tps->irq_data); + return ret; + } + + return 0; +} + +static int tps65086_remove(struct i2c_client *client) +{ + struct tps65086 *tps = i2c_get_clientdata(client); + + regmap_del_irq_chip(tps->irq, tps->irq_data); + + return 0; +} + +static const struct i2c_device_id tps65086_id_table[] = { + { "tps65086", 0 }, + { /* sentinel */ }, +}; +MODULE_DEVICE_TABLE(i2c, tps65086_id_table); + +static struct i2c_driver tps65086_driver = { + .driver = { + .name = "tps65086", + .of_match_table = tps65086_of_match_table, + }, + .probe = tps65086_probe, + .remove = tps65086_remove, + .id_table = tps65086_id_table, +}; + +module_i2c_driver(tps65086_driver); + +MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>"); +MODULE_DESCRIPTION("TPS65086x PMIC Driver"); +MODULE_LICENSE("GPL v2"); diff --git a/include/linux/mfd/tps65086.h b/include/linux/mfd/tps65086.h new file mode 100644 index 0000000..2a9e9dd --- /dev/null +++ b/include/linux/mfd/tps65086.h @@ -0,0 +1,120 @@ +/* + * TI TPS65086x + * + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ + * + * Author: Andrew F. Davis <afd@ti.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether expressed or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License version 2 for more details. + * + * Based on the TPS65912 driver + */ + +#ifndef __LINUX_MFD_TPS65086_H +#define __LINUX_MFD_TPS65086_H + +#include <linux/device.h> +#include <linux/regmap.h> + +/* List of registers for TPS65086 */ +#define TPS65086_DEVICEID 0x01 +#define TPS65086_IRQ 0x02 +#define TPS65086_IRQ_MASK 0x03 +#define TPS65086_PMICSTAT 0x04 +#define TPS65086_SHUTDNSRC 0x05 +#define TPS65086_BUCK1CTRL 0x20 +#define TPS65086_BUCK2CTRL 0x21 +#define TPS65086_BUCK3DECAY 0x22 +#define TPS65086_BUCK3VID 0x23 +#define TPS65086_BUCK3SLPCTRL 0x24 +#define TPS65086_BUCK4CTRL 0x25 +#define TPS65086_BUCK5CTRL 0x26 +#define TPS65086_BUCK6CTRL 0x27 +#define TPS65086_LDOA2CTRL 0x28 +#define TPS65086_LDOA3CTRL 0x29 +#define TPS65086_DISCHCTRL1 0x40 +#define TPS65086_DISCHCTRL2 0x41 +#define TPS65086_DISCHCTRL3 0x42 +#define TPS65086_PG_DELAY1 0x43 +#define TPS65086_FORCESHUTDN 0x91 +#define TPS65086_BUCK1SLPCTRL 0x92 +#define TPS65086_BUCK2SLPCTRL 0x93 +#define TPS65086_BUCK4VID 0x94 +#define TPS65086_BUCK4SLPVID 0x95 +#define TPS65086_BUCK5VID 0x96 +#define TPS65086_BUCK5SLPVID 0x97 +#define TPS65086_BUCK6VID 0x98 +#define TPS65086_BUCK6SLPVID 0x99 +#define TPS65086_LDOA2VID 0x9A +#define TPS65086_LDOA3VID 0x9B +#define TPS65086_BUCK123CTRL 0x9C +#define TPS65086_PG_DELAY2 0x9D +#define TPS65086_PIN_EN_MASK1 0x9E +#define TPS65086_PIN_EN_MASK2 0x9F +#define TPS65086_SWVTT_EN 0x9F +#define TPS65086_PIN_EN_OVR1 0xA0 +#define TPS65086_PIN_EN_OVR2 0xA1 +#define TPS65086_GPOCTRL 0xA1 +#define TPS65086_PWR_FAULT_MASK1 0xA2 +#define TPS65086_PWR_FAULT_MASK2 0xA3 +#define TPS65086_GPO1PG_CTRL1 0xA4 +#define TPS65086_GPO1PG_CTRL2 0xA5 +#define TPS65086_GPO4PG_CTRL1 0xA6 +#define TPS65086_GPO4PG_CTRL2 0xA7 +#define TPS65086_GPO2PG_CTRL1 0xA8 +#define TPS65086_GPO2PG_CTRL2 0xA9 +#define TPS65086_GPO3PG_CTRL1 0xAA +#define TPS65086_GPO3PG_CTRL2 0xAB +#define TPS65086_LDOA1CTRL 0xAE +#define TPS65086_PG_STATUS1 0xB0 +#define TPS65086_PG_STATUS2 0xB1 +#define TPS65086_PWR_FAULT_STATUS1 0xB2 +#define TPS65086_PWR_FAULT_STATUS2 0xB3 +#define TPS65086_TEMPCRIT 0xB4 +#define TPS65086_TEMPHOT 0xB5 +#define TPS65086_OC_STATUS 0xB6 + +/* IRQ Register field definitions */ +#define TPS65086_IRQ_DIETEMP_MASK BIT(0) +#define TPS65086_IRQ_SHUTDN_MASK BIT(3) +#define TPS65086_IRQ_FAULT_MASK BIT(7) + +/* DEVICEID Register field definitions */ +#define TPS65086_DEVICEID_PART_MASK GENMASK(3, 0) +#define TPS65086_DEVICEID_OTP_MASK GENMASK(5, 4) +#define TPS65086_DEVICEID_REV_MASK GENMASK(7, 6) + +/* VID Masks */ +#define BUCK_VID_MASK GENMASK(7, 1) +#define VDOA1_VID_MASK GENMASK(4, 1) +#define VDOA23_VID_MASK GENMASK(3, 0) + +/* Define the TPS65086 IRQ numbers */ +enum tps65086_irqs { + TPS65086_IRQ_DIETEMP, + TPS65086_IRQ_SHUTDN, + TPS65086_IRQ_FAULT, +}; + +/* + * struct tps65086 - state holder for the tps65086 driver + * + * Device data may be used to access the TPS65086 chip + */ +struct tps65086 { + struct device *dev; + struct regmap *regmap; + + /* IRQ Data */ + int irq; + struct regmap_irq_chip_data *irq_data; +}; + +#endif /* __LINUX_MFD_TPS65086_H */
Add support for the TPS65912 device. It provides communication through I2C and contains the following components: - Regulators - Load switches - GPO controller Signed-off-by: Andrew F. Davis <afd@ti.com> --- drivers/mfd/Kconfig | 13 ++++ drivers/mfd/Makefile | 1 + drivers/mfd/tps65086.c | 145 +++++++++++++++++++++++++++++++++++++++++++ include/linux/mfd/tps65086.h | 120 +++++++++++++++++++++++++++++++++++ 4 files changed, 279 insertions(+) create mode 100644 drivers/mfd/tps65086.c create mode 100644 include/linux/mfd/tps65086.h