From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932172AbbE1MxF (ORCPT ); Thu, 28 May 2015 08:53:05 -0400 Received: from mail1.bemta3.messagelabs.com ([195.245.230.169]:45328 "EHLO mail1.bemta3.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751588AbbE1Mwy (ORCPT ); Thu, 28 May 2015 08:52:54 -0400 X-Env-Sender: stwiss.opensource@diasemi.com X-Msg-Ref: server-14.tower-38.messagelabs.com!1432817567!124536!1 X-Originating-IP: [94.185.165.51] X-StarScan-Received: X-StarScan-Version: 6.13.16; banners=-,-,- X-VirusChecked: Checked From: "Opensource [Steve Twiss]" To: Lee Jones CC: LINUXKERNEL , Samuel Ortiz , Alessandro Zummo , DEVICETREE , David Dajun Chen , Dmitry Torokhov , Ian Campbell , Kumar Gala , LINUXINPUT , LINUXWATCHDOG , Liam Girdwood , "Mark Brown" , Mark Rutland , Pawel Moll , RTCLINUX , Rob Herring , Support Opensource , Wim Van Sebroeck Subject: RE: [PATCH V3 1/4] mfd: da9062: DA9062 MFD core driver Thread-Topic: [PATCH V3 1/4] mfd: da9062: DA9062 MFD core driver Thread-Index: AQHQkje+BbbztfyjIkOz27ag7HsO6Z2OZ74AgALzVjA= Date: Thu, 28 May 2015 12:52:45 +0000 Message-ID: <6ED8E3B22081A4459DAC7699F3695FB7014B22DEC7@SW-EX-MBX02.diasemi.com> References: <20150526161024.GQ11677@x1> In-Reply-To: <20150526161024.GQ11677@x1> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.20.26.77] Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by nfs id t4SCrAvM026984 Hi Lee, I will refactor a lot of the driver and implement your changes as requested. I think the only major differences with your comments will be as follows: - the interrupt handler da9062_vdd_warn_event() will be erased - I would prefer the register header file to remain [mostly] untouched Please find more detailed comments below. thanks, Steve On 26 May 2015 17:10 Lee Jones wrote > To: Opensource [Steve Twiss] > Cc: LINUXKERNEL; Samuel Ortiz; Alessandro Zummo; DEVICETREE; David > Dajun Chen; Dmitry Torokhov; Ian Campbell; Kumar Gala; LINUXINPUT; > LINUXWATCHDOG; Liam Girdwood; Mark Brown; Mark Rutland; Pawel Moll; > RTCLINUX; Rob Herring; Support Opensource; Wim Van Sebroeck > Subject: Re: [PATCH V3 1/4] mfd: da9062: DA9062 MFD core driver > > On Tue, 19 May 2015, S Twiss wrote: > > > From: S Twiss > > > > Add MFD core driver support for DA9062 > > > > Signed-off-by: Steve Twiss > > [...] > > diff --git a/drivers/mfd/da9062-core.c b/drivers/mfd/da9062-core.c > > new file mode 100644 > > index 0000000..5aea082 > > --- /dev/null > > +++ b/drivers/mfd/da9062-core.c > > @@ -0,0 +1,611 @@ > > +/* > > + * da9062-core.c - CORE device driver for DA9062 > > Remove the filename. They have a habit of becoming incorrect. > > s/CORE/Core/ > > Can you also mention what the DA9062 actually is? > Will remove filename, and add a description "Core, IRQ and I2C driver for DA9062 PMIC" [...] > > +#include > > +#include > > + > > Why the '\n'? > > > +#include > > +#include > > +#include > > +#include > > + > > Same here? > > > +#include > > +#include > > +#include > > +#include > > + > > +#include > > +#include > > +#include > > I'm a bit concerned by the number of includes here, are you sure > they're all required? > > > +/* IRQ device driver for DA9062 */ > > Not sure what this means? Removed unnecessary whitespace throughout the patches. And erased comments throughout that are not required [...] > > +int da9062_irq_init(struct da9062 *chip) > > +{ > > + int ret; > > + > > + if (!chip->chip_irq) { > > Check this once, in probe(), then rid this check. > > > + dev_err(chip->dev, "No IRQ configured\n"); > > + return -EINVAL; > > + } > > + > > + ret = regmap_add_irq_chip(chip->regmap, chip->chip_irq, > > + IRQF_TRIGGER_LOW | IRQF_ONESHOT | > IRQF_SHARED, > > + chip->irq_base, &da9062_irq_chip, > > + &chip->regmap_irq); > > This is just one call. Just place that call into > da9062_device_init() and rid this function. > Will refactor this part. > > + if (ret) { > > + dev_err(chip->dev, "Failed to request IRQ %d: %d\n", > > + chip->chip_irq, ret); > > + return ret; > > + } > > + > > + return 0; > > +} > > + > > +void da9062_irq_exit(struct da9062 *chip) > > +{ > > + regmap_del_irq_chip(chip->chip_irq, chip->regmap_irq); > > Again, this is abstraction for the sake of abstraction. > I will erase all abstractions and ... - Refactor da9062_device_init() and da9062_irq_init() into probe - Add new function get_device_type() for variant and device_id information [...] > > +static struct resource da9062_wdt_resources[] = { > > + { > > + .name = "WDG_WARN", > > + .start = DA9062_IRQ_WDG_WARN, > > + .end = DA9062_IRQ_WDG_WARN, > > + .flags = IORESOURCE_IRQ, > > + }, > > +}; > > Convert all of these to oneliners using DEFINE_RES_* macros. Done. > > + > > +static irqreturn_t da9062_vdd_warn_event(int irq, void *data) > > +{ > > + struct da9062 *hw = data; > > + > > + dev_err(hw->dev, "VDD warning indicator\n"); > > Is it an error? Doesn't look like it. > > > + return IRQ_HANDLED; > > +} See later on (this is to be erased) [...] > > +static int da9062_clear_fault_log(struct da9062 *chip) > > +{ > > + int ret = 0; > > No need to pre-initialise. > > > + int fault_log = 0; > > As above. > > > + ret = regmap_read(chip->regmap, DA9062AA_FAULT_LOG, > &fault_log); > > + if (ret < 0) { > > + dev_err(chip->dev, "Cannot read FAULT_LOG.\n"); > > + ret = -EIO; > > Just return and rid the else. > > > + } else { > > + if (fault_log) { > > + if (fault_log & DA9062AA_TWD_ERROR_MASK) I will refactor da9062_clear_fault_log() to remove inconsistencies > > +int da9062_device_init(struct da9062 *chip, unsigned int irq) > > No need to pass irq, as it's part of chip. > This is going to be erased as part of a later comment (see below) [...] > > + ret = da9062_clear_fault_log(chip); > > + if (ret < 0) > > + dev_err(chip->dev, "Cannot clear fault log\n"); > > If this is an error, you must return. If it's just a warning then use > dev_warn(). Will use dev_warn instead > > > + chip->irq_base = -1; > > Why are you pre-initialising? > > > + chip->chip_irq = irq; > > You already assigned irq to chip_irq. > > > + ret = regmap_read(chip->regmap, DA9062AA_DEVICE_ID, > &device_id); > > + if (ret < 0) { > > + dev_err(chip->dev, "Cannot read chip ID.\n"); > > + return -EIO; > > + } > > + if (device_id != DA9062_PMIC_DEVICE_ID) { > > + dev_err(chip->dev, "Invalid device ID: 0x%02x\n", > device_id); > > + return -ENODEV; > > + } > > + > > + ret = regmap_read(chip->regmap, DA9062AA_VARIANT_ID, > &variant_id); > > + if (ret < 0) { > > + dev_err(chip->dev, "Cannot read chip variant id.\n"); > > + return -EIO; > > + } > > + > > + dev_info(chip->dev, > > + "Device detected (device-ID: 0x%02X, var-ID: 0x%02X)\n", > > + device_id, variant_id); > > Probably best to put this at the end. I have left this part in at this point. The device_id and variant_id are not passed any further than this function for the moment. > > > + variant_mrc = (variant_id & DA9062AA_MRC_MASK) >> > DA9062AA_MRC_SHIFT; > > + > > + if (variant_mrc < DA9062_PMIC_VARIANT_MRC_AA) { > > + dev_err(chip->dev, > > + "Cannot support variant MRC: 0x%02X\n", > variant_mrc); > > + return -ENODEV; > > + } > > I'd put all of the device/variant stuff it its own function, then move > everything else into probe() and remove da9062_device_init(). > I will make a new function get_device_type() for variant and device_id information > > + ret = da9062_irq_init(chip); > > + if (ret) { > > + dev_err(chip->dev, "Cannot initialize interrupts.\n"); > > + return ret; > > + } > > Remove this function and call regmap_add_irq_chip() from here. > Yes. I will do that. > > + chip->irq_base = regmap_irq_chip_get_base(chip->regmap_irq); > > + > > + ret = mfd_add_devices(chip->dev, -1, da9062_devs, > > Use PLATFORM_DEVID_NONE instead. > > > + ARRAY_SIZE(da9062_devs), NULL, chip->irq_base, > > + NULL); > > Usually child devices are probed at the end i.e. the last thing in > probe(). > Ok. I will move that to the end and use the PLATFORM_DEVID_NONE instead of the explicit -1 value. > > + if (ret) { > > + dev_err(chip->dev, "Cannot add MFD cells\n"); > > "Cannot register child devices". > Will replace that. [...] > > + /* VDD WARN event support */ > > + irq_vdd_warn = regmap_irq_get_virq(chip->regmap_irq, > > + DA9062_IRQ_VDD_WARN); > > + if (irq_vdd_warn < 0) { > > + dev_err(chip->dev, "Failed to get IRQ.\n"); > > + return irq_vdd_warn; > > + } > > + chip->irq_vdd_warn = irq_vdd_warn; > > + > > + ret = devm_request_threaded_irq(chip->dev, irq_vdd_warn, > > + NULL, da9062_vdd_warn_event, > > + IRQF_TRIGGER_LOW | IRQF_ONESHOT, > > + "VDD_WARN", chip); > > + if (ret) { > > + dev_warn(chip->dev, > > + "Failed to request VDD_WARN IRQ.\n"); > > + chip->irq_vdd_warn = -ENXIO; > > + } > > This looks like a lot of code, which doesn't really do anything. What > is a VDD warning indicator anyway? > I will remove this. The IRQ handler da9062_vdd_warn_event() -- see earlier above -- does not currently do anything apart from handle the IRQ that was requested here. It prints a statement to say the main PMIC voltage supply dropped below a defined trigger point, but doesn't actually do anything to mitigate this problem. Previously this VDD_WARN was in the regulator driver, however it should be made available even if the regulator driver is not installed -- so I added it to the core instead. In a previous driver submission I had a similar problem, a warning IRQ was just printing to the console to say there was an error -- the handler and IRQ code was put in by me so it could be used if the driver was taken and integrated into a fully working system. I was asked to remove it in the other driver -- and I have done the same here for now. I can always add it back later. > > + return ret; > > +} > > + > > +void da9062_device_exit(struct da9062 *chip) > > +{ > > + mfd_remove_devices(chip->dev); > > + da9062_irq_exit(chip); > > +} > > Another seemingly pointless abstraction. Why don't you do this in > remove()? > Will do that as part of the abstraction clean up [...] > > + > > +static struct regmap_config da9062_regmap_config = { > > + .reg_bits = 8, > > + .val_bits = 8, > > + .ranges = da9062_range_cfg, > > + .num_ranges = ARRAY_SIZE(da9062_range_cfg), > > + .max_register = DA9062AA_CONFIG_ID, > > + .cache_type = REGCACHE_RBTREE, > > +}; > > + > > +static const struct of_device_id da9062_dt_ids[] = { > > + { .compatible = "dlg,da9062", }, > > + { } > > +}; > > +MODULE_DEVICE_TABLE(of, da9062_dt_ids); > > Move this just above where it's to be used i.e. down to the bottom. > Will move that to the end of the file. > > +static int da9062_i2c_probe(struct i2c_client *i2c, > > + const struct i2c_device_id *id) > > +{ > > + struct da9062 *chip; > > + int ret; > > + > > + chip = devm_kzalloc(&i2c->dev, sizeof(struct da9062), GFP_KERNEL); > > sizeof(*chip) > > > + if (chip == NULL) > > if (!chip) Will do that. > > + da9062_regmap_config.rd_table = &da9062_aa_readable_table; > > + da9062_regmap_config.wr_table = &da9062_aa_writeable_table; > > + da9062_regmap_config.volatile_table = &da9062_aa_volatile_table; > > Why are you doing this here instead of inside > 'struct regmap_config da9062_regmap_config' above? > Ok.. I will fix that part into the main structure. > > +static const struct i2c_device_id da9062_i2c_id[] = { > > + {"da9062", 0}, > > White space discipline. > I have put some white-spaces in the code. I think this: { "da9062", 0 }, { }, [...] > > > +MODULE_DESCRIPTION("CORE device driver for Dialog DA9062"); > > s/CORE/Core/ > Yes. > > +MODULE_AUTHOR("S Twiss "); > > Full names please. > Ok. [...] > > diff --git a/include/linux/mfd/da9062/core.h > b/include/linux/mfd/da9062/core.h > > new file mode 100644 > > index 0000000..0b17891 > > --- /dev/null > > +++ b/include/linux/mfd/da9062/core.h > > @@ -0,0 +1,62 @@ > > +/* > > + * core.h - CORE H for DA9062 > > What does this add? > Removed the top line completely [...] > > + > > +struct da9062 { > > + struct device *dev; > > + unsigned char device_id; > > + unsigned char variant_mrc; > > + struct regmap *regmap; > > + int chip_irq; > > + unsigned int irq_base; > > + struct regmap_irq_chip_data *regmap_irq; > > + int irq_vdd_warn; > > +}; > > Are all of these used by child devices? > After I did the refactoring work described above, I can remove quite a few of them. unsigned char device_id; unsigned char variant_mrc; These are not currently used in any child device drivers -- because there is only one device of this type. int chip_irq; unsigned int irq_base; The chip_id is now local to the probe and can replaced with i2c->irq in that function It's only use is during clean-up and i2c->irq can be used there also. irq_base is local to probe() also, so I have made it automatic. > > + int irq_vdd_warn; I have removed the vdd_warn capability in this patch. > > +int da9062_device_init(struct da9062 *, unsigned int); > > +int da9062_irq_init(struct da9062 *); > > + > > +void da9062_device_exit(struct da9062 *); > > +void da9062_irq_exit(struct da9062 *); > > Why are these required? > Gone. [...] > > diff --git a/include/linux/mfd/da9062/registers.h > b/include/linux/mfd/da9062/registers.h > > new file mode 100644 > > index 0000000..d07c2bc > > --- /dev/null > > +++ b/include/linux/mfd/da9062/registers.h [...] > > +/* > > + * Registers > > + */ > > Really? ;) > > > +#define DA9062AA_PAGE_CON 0x000 > > +#define DA9062AA_STATUS_A 0x001 > > +#define DA9062AA_STATUS_B 0x002 [...] > > + > > +/* > > + * Bit fields > > + */ > > + > > +/* DA9062AA_PAGE_CON = 0x000 */ > > +#define DA9062AA_PAGE_SHIFT 0 > > +#define DA9062AA_PAGE_MASK (0x3f << 0) > > +#define DA9062AA_WRITE_MODE_SHIFT 6 > > +#define DA9062AA_WRITE_MODE_MASK (0x01 << 6) > > For 1 << X, you should use BIT(X). > For the two comments above "Registers" and "Bit fields" and the (1< Received: from mail1.bemta3.messagelabs.com (mail1.bemta3.messagelabs.com. [195.245.230.169]) by gmr-mx.google.com with ESMTPS id p12si128043wiv.1.2015.05.28.05.52.48 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 28 May 2015 05:52:49 -0700 (PDT) From: "Opensource [Steve Twiss]" To: Lee Jones CC: LINUXKERNEL , Samuel Ortiz , Alessandro Zummo , DEVICETREE , David Dajun Chen , Dmitry Torokhov , Ian Campbell , Kumar Gala , LINUXINPUT , LINUXWATCHDOG , Liam Girdwood , "Mark Brown" , Mark Rutland , Pawel Moll , RTCLINUX , Rob Herring , Support Opensource , Wim Van Sebroeck Subject: [rtc-linux] RE: [PATCH V3 1/4] mfd: da9062: DA9062 MFD core driver Date: Thu, 28 May 2015 12:52:45 +0000 Message-ID: <6ED8E3B22081A4459DAC7699F3695FB7014B22DEC7@SW-EX-MBX02.diasemi.com> References: <20150526161024.GQ11677@x1> In-Reply-To: <20150526161024.GQ11677@x1> Content-Type: text/plain; charset=UTF-8 MIME-Version: 1.0 Reply-To: rtc-linux@googlegroups.com List-ID: List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , Hi Lee, I will refactor a lot of the driver and implement your changes as requested. I think the only major differences with your comments will be as follows: - the interrupt handler da9062_vdd_warn_event() will be erased - I would prefer the register header file to remain [mostly] untouched Please find more detailed comments below. thanks, Steve On 26 May 2015 17:10 Lee Jones wrote > To: Opensource [Steve Twiss] > Cc: LINUXKERNEL; Samuel Ortiz; Alessandro Zummo; DEVICETREE; David > Dajun Chen; Dmitry Torokhov; Ian Campbell; Kumar Gala; LINUXINPUT; > LINUXWATCHDOG; Liam Girdwood; Mark Brown; Mark Rutland; Pawel Moll; > RTCLINUX; Rob Herring; Support Opensource; Wim Van Sebroeck > Subject: Re: [PATCH V3 1/4] mfd: da9062: DA9062 MFD core driver > > On Tue, 19 May 2015, S Twiss wrote: > > > From: S Twiss > > > > Add MFD core driver support for DA9062 > > > > Signed-off-by: Steve Twiss > > [...] > > diff --git a/drivers/mfd/da9062-core.c b/drivers/mfd/da9062-core.c > > new file mode 100644 > > index 0000000..5aea082 > > --- /dev/null > > +++ b/drivers/mfd/da9062-core.c > > @@ -0,0 +1,611 @@ > > +/* > > + * da9062-core.c - CORE device driver for DA9062 > > Remove the filename. They have a habit of becoming incorrect. > > s/CORE/Core/ > > Can you also mention what the DA9062 actually is? > Will remove filename, and add a description "Core, IRQ and I2C driver for DA9062 PMIC" [...] > > +#include > > +#include > > + > > Why the '\n'? > > > +#include > > +#include > > +#include > > +#include > > + > > Same here? > > > +#include > > +#include > > +#include > > +#include > > + > > +#include > > +#include > > +#include > > I'm a bit concerned by the number of includes here, are you sure > they're all required? > > > +/* IRQ device driver for DA9062 */ > > Not sure what this means? Removed unnecessary whitespace throughout the patches. And erased comments throughout that are not required [...] > > +int da9062_irq_init(struct da9062 *chip) > > +{ > > + int ret; > > + > > + if (!chip->chip_irq) { > > Check this once, in probe(), then rid this check. > > > + dev_err(chip->dev, "No IRQ configured\n"); > > + return -EINVAL; > > + } > > + > > + ret = regmap_add_irq_chip(chip->regmap, chip->chip_irq, > > + IRQF_TRIGGER_LOW | IRQF_ONESHOT | > IRQF_SHARED, > > + chip->irq_base, &da9062_irq_chip, > > + &chip->regmap_irq); > > This is just one call. Just place that call into > da9062_device_init() and rid this function. > Will refactor this part. > > + if (ret) { > > + dev_err(chip->dev, "Failed to request IRQ %d: %d\n", > > + chip->chip_irq, ret); > > + return ret; > > + } > > + > > + return 0; > > +} > > + > > +void da9062_irq_exit(struct da9062 *chip) > > +{ > > + regmap_del_irq_chip(chip->chip_irq, chip->regmap_irq); > > Again, this is abstraction for the sake of abstraction. > I will erase all abstractions and ... - Refactor da9062_device_init() and da9062_irq_init() into probe - Add new function get_device_type() for variant and device_id information [...] > > +static struct resource da9062_wdt_resources[] = { > > + { > > + .name = "WDG_WARN", > > + .start = DA9062_IRQ_WDG_WARN, > > + .end = DA9062_IRQ_WDG_WARN, > > + .flags = IORESOURCE_IRQ, > > + }, > > +}; > > Convert all of these to oneliners using DEFINE_RES_* macros. Done. > > + > > +static irqreturn_t da9062_vdd_warn_event(int irq, void *data) > > +{ > > + struct da9062 *hw = data; > > + > > + dev_err(hw->dev, "VDD warning indicator\n"); > > Is it an error? Doesn't look like it. > > > + return IRQ_HANDLED; > > +} See later on (this is to be erased) [...] > > +static int da9062_clear_fault_log(struct da9062 *chip) > > +{ > > + int ret = 0; > > No need to pre-initialise. > > > + int fault_log = 0; > > As above. > > > + ret = regmap_read(chip->regmap, DA9062AA_FAULT_LOG, > &fault_log); > > + if (ret < 0) { > > + dev_err(chip->dev, "Cannot read FAULT_LOG.\n"); > > + ret = -EIO; > > Just return and rid the else. > > > + } else { > > + if (fault_log) { > > + if (fault_log & DA9062AA_TWD_ERROR_MASK) I will refactor da9062_clear_fault_log() to remove inconsistencies > > +int da9062_device_init(struct da9062 *chip, unsigned int irq) > > No need to pass irq, as it's part of chip. > This is going to be erased as part of a later comment (see below) [...] > > + ret = da9062_clear_fault_log(chip); > > + if (ret < 0) > > + dev_err(chip->dev, "Cannot clear fault log\n"); > > If this is an error, you must return. If it's just a warning then use > dev_warn(). Will use dev_warn instead > > > + chip->irq_base = -1; > > Why are you pre-initialising? > > > + chip->chip_irq = irq; > > You already assigned irq to chip_irq. > > > + ret = regmap_read(chip->regmap, DA9062AA_DEVICE_ID, > &device_id); > > + if (ret < 0) { > > + dev_err(chip->dev, "Cannot read chip ID.\n"); > > + return -EIO; > > + } > > + if (device_id != DA9062_PMIC_DEVICE_ID) { > > + dev_err(chip->dev, "Invalid device ID: 0x%02x\n", > device_id); > > + return -ENODEV; > > + } > > + > > + ret = regmap_read(chip->regmap, DA9062AA_VARIANT_ID, > &variant_id); > > + if (ret < 0) { > > + dev_err(chip->dev, "Cannot read chip variant id.\n"); > > + return -EIO; > > + } > > + > > + dev_info(chip->dev, > > + "Device detected (device-ID: 0x%02X, var-ID: 0x%02X)\n", > > + device_id, variant_id); > > Probably best to put this at the end. I have left this part in at this point. The device_id and variant_id are not passed any further than this function for the moment. > > > + variant_mrc = (variant_id & DA9062AA_MRC_MASK) >> > DA9062AA_MRC_SHIFT; > > + > > + if (variant_mrc < DA9062_PMIC_VARIANT_MRC_AA) { > > + dev_err(chip->dev, > > + "Cannot support variant MRC: 0x%02X\n", > variant_mrc); > > + return -ENODEV; > > + } > > I'd put all of the device/variant stuff it its own function, then move > everything else into probe() and remove da9062_device_init(). > I will make a new function get_device_type() for variant and device_id information > > + ret = da9062_irq_init(chip); > > + if (ret) { > > + dev_err(chip->dev, "Cannot initialize interrupts.\n"); > > + return ret; > > + } > > Remove this function and call regmap_add_irq_chip() from here. > Yes. I will do that. > > + chip->irq_base = regmap_irq_chip_get_base(chip->regmap_irq); > > + > > + ret = mfd_add_devices(chip->dev, -1, da9062_devs, > > Use PLATFORM_DEVID_NONE instead. > > > + ARRAY_SIZE(da9062_devs), NULL, chip->irq_base, > > + NULL); > > Usually child devices are probed at the end i.e. the last thing in > probe(). > Ok. I will move that to the end and use the PLATFORM_DEVID_NONE instead of the explicit -1 value. > > + if (ret) { > > + dev_err(chip->dev, "Cannot add MFD cells\n"); > > "Cannot register child devices". > Will replace that. [...] > > + /* VDD WARN event support */ > > + irq_vdd_warn = regmap_irq_get_virq(chip->regmap_irq, > > + DA9062_IRQ_VDD_WARN); > > + if (irq_vdd_warn < 0) { > > + dev_err(chip->dev, "Failed to get IRQ.\n"); > > + return irq_vdd_warn; > > + } > > + chip->irq_vdd_warn = irq_vdd_warn; > > + > > + ret = devm_request_threaded_irq(chip->dev, irq_vdd_warn, > > + NULL, da9062_vdd_warn_event, > > + IRQF_TRIGGER_LOW | IRQF_ONESHOT, > > + "VDD_WARN", chip); > > + if (ret) { > > + dev_warn(chip->dev, > > + "Failed to request VDD_WARN IRQ.\n"); > > + chip->irq_vdd_warn = -ENXIO; > > + } > > This looks like a lot of code, which doesn't really do anything. What > is a VDD warning indicator anyway? > I will remove this. The IRQ handler da9062_vdd_warn_event() -- see earlier above -- does not currently do anything apart from handle the IRQ that was requested here. It prints a statement to say the main PMIC voltage supply dropped below a defined trigger point, but doesn't actually do anything to mitigate this problem. Previously this VDD_WARN was in the regulator driver, however it should be made available even if the regulator driver is not installed -- so I added it to the core instead. In a previous driver submission I had a similar problem, a warning IRQ was just printing to the console to say there was an error -- the handler and IRQ code was put in by me so it could be used if the driver was taken and integrated into a fully working system. I was asked to remove it in the other driver -- and I have done the same here for now. I can always add it back later. > > + return ret; > > +} > > + > > +void da9062_device_exit(struct da9062 *chip) > > +{ > > + mfd_remove_devices(chip->dev); > > + da9062_irq_exit(chip); > > +} > > Another seemingly pointless abstraction. Why don't you do this in > remove()? > Will do that as part of the abstraction clean up [...] > > + > > +static struct regmap_config da9062_regmap_config = { > > + .reg_bits = 8, > > + .val_bits = 8, > > + .ranges = da9062_range_cfg, > > + .num_ranges = ARRAY_SIZE(da9062_range_cfg), > > + .max_register = DA9062AA_CONFIG_ID, > > + .cache_type = REGCACHE_RBTREE, > > +}; > > + > > +static const struct of_device_id da9062_dt_ids[] = { > > + { .compatible = "dlg,da9062", }, > > + { } > > +}; > > +MODULE_DEVICE_TABLE(of, da9062_dt_ids); > > Move this just above where it's to be used i.e. down to the bottom. > Will move that to the end of the file. > > +static int da9062_i2c_probe(struct i2c_client *i2c, > > + const struct i2c_device_id *id) > > +{ > > + struct da9062 *chip; > > + int ret; > > + > > + chip = devm_kzalloc(&i2c->dev, sizeof(struct da9062), GFP_KERNEL); > > sizeof(*chip) > > > + if (chip == NULL) > > if (!chip) Will do that. > > + da9062_regmap_config.rd_table = &da9062_aa_readable_table; > > + da9062_regmap_config.wr_table = &da9062_aa_writeable_table; > > + da9062_regmap_config.volatile_table = &da9062_aa_volatile_table; > > Why are you doing this here instead of inside > 'struct regmap_config da9062_regmap_config' above? > Ok.. I will fix that part into the main structure. > > +static const struct i2c_device_id da9062_i2c_id[] = { > > + {"da9062", 0}, > > White space discipline. > I have put some white-spaces in the code. I think this: { "da9062", 0 }, { }, [...] > > > +MODULE_DESCRIPTION("CORE device driver for Dialog DA9062"); > > s/CORE/Core/ > Yes. > > +MODULE_AUTHOR("S Twiss "); > > Full names please. > Ok. [...] > > diff --git a/include/linux/mfd/da9062/core.h > b/include/linux/mfd/da9062/core.h > > new file mode 100644 > > index 0000000..0b17891 > > --- /dev/null > > +++ b/include/linux/mfd/da9062/core.h > > @@ -0,0 +1,62 @@ > > +/* > > + * core.h - CORE H for DA9062 > > What does this add? > Removed the top line completely [...] > > + > > +struct da9062 { > > + struct device *dev; > > + unsigned char device_id; > > + unsigned char variant_mrc; > > + struct regmap *regmap; > > + int chip_irq; > > + unsigned int irq_base; > > + struct regmap_irq_chip_data *regmap_irq; > > + int irq_vdd_warn; > > +}; > > Are all of these used by child devices? > After I did the refactoring work described above, I can remove quite a few of them. unsigned char device_id; unsigned char variant_mrc; These are not currently used in any child device drivers -- because there is only one device of this type. int chip_irq; unsigned int irq_base; The chip_id is now local to the probe and can replaced with i2c->irq in that function It's only use is during clean-up and i2c->irq can be used there also. irq_base is local to probe() also, so I have made it automatic. > > + int irq_vdd_warn; I have removed the vdd_warn capability in this patch. > > +int da9062_device_init(struct da9062 *, unsigned int); > > +int da9062_irq_init(struct da9062 *); > > + > > +void da9062_device_exit(struct da9062 *); > > +void da9062_irq_exit(struct da9062 *); > > Why are these required? > Gone. [...] > > diff --git a/include/linux/mfd/da9062/registers.h > b/include/linux/mfd/da9062/registers.h > > new file mode 100644 > > index 0000000..d07c2bc > > --- /dev/null > > +++ b/include/linux/mfd/da9062/registers.h [...] > > +/* > > + * Registers > > + */ > > Really? ;) > > > +#define DA9062AA_PAGE_CON 0x000 > > +#define DA9062AA_STATUS_A 0x001 > > +#define DA9062AA_STATUS_B 0x002 [...] > > + > > +/* > > + * Bit fields > > + */ > > + > > +/* DA9062AA_PAGE_CON = 0x000 */ > > +#define DA9062AA_PAGE_SHIFT 0 > > +#define DA9062AA_PAGE_MASK (0x3f << 0) > > +#define DA9062AA_WRITE_MODE_SHIFT 6 > > +#define DA9062AA_WRITE_MODE_MASK (0x01 << 6) > > For 1 << X, you should use BIT(X). > For the two comments above "Registers" and "Bit fields" and the (1< Subject: RE: [PATCH V3 1/4] mfd: da9062: DA9062 MFD core driver Date: Thu, 28 May 2015 12:52:45 +0000 Message-ID: <6ED8E3B22081A4459DAC7699F3695FB7014B22DEC7@SW-EX-MBX02.diasemi.com> References: <20150526161024.GQ11677@x1> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20150526161024.GQ11677@x1> Content-Language: en-US Sender: linux-watchdog-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: Lee Jones Cc: LINUXKERNEL , Samuel Ortiz , Alessandro Zummo , DEVICETREE , David Dajun Chen , Dmitry Torokhov , Ian Campbell , Kumar Gala , LINUXINPUT , LINUXWATCHDOG , Liam Girdwood , Mark Brown , Mark Rutland , Pawel Moll , RTCLINUX , Rob Herring , Support Opensource , Wim Van Sebroeck List-Id: devicetree@vger.kernel.org SGkgTGVlLCANCg0KSSB3aWxsIHJlZmFjdG9yIGEgbG90IG9mIHRoZSBkcml2ZXIgYW5kIGltcGxl bWVudCB5b3VyIGNoYW5nZXMgYXMgcmVxdWVzdGVkLg0KSSB0aGluayB0aGUgb25seSBtYWpvciBk aWZmZXJlbmNlcyB3aXRoIHlvdXIgY29tbWVudHMgd2lsbCBiZSBhcyBmb2xsb3dzOg0KDQotIHRo ZSBpbnRlcnJ1cHQgaGFuZGxlciBkYTkwNjJfdmRkX3dhcm5fZXZlbnQoKSB3aWxsIGJlIGVyYXNl ZA0KLSBJIHdvdWxkIHByZWZlciB0aGUgcmVnaXN0ZXIgaGVhZGVyIGZpbGUgdG8gcmVtYWluICBb bW9zdGx5XSB1bnRvdWNoZWQgDQoNClBsZWFzZSBmaW5kIG1vcmUgZGV0YWlsZWQgY29tbWVudHMg YmVsb3cuDQoNCnRoYW5rcywNClN0ZXZlDQoNCk9uIDI2IE1heSAyMDE1IDE3OjEwIExlZSBKb25l cyB3cm90ZQ0KDQo+IFRvOiBPcGVuc291cmNlIFtTdGV2ZSBUd2lzc10NCj4gQ2M6IExJTlVYS0VS TkVMOyBTYW11ZWwgT3J0aXo7IEFsZXNzYW5kcm8gWnVtbW87IERFVklDRVRSRUU7IERhdmlkDQo+ IERhanVuIENoZW47IERtaXRyeSBUb3Jva2hvdjsgSWFuIENhbXBiZWxsOyBLdW1hciBHYWxhOyBM SU5VWElOUFVUOw0KPiBMSU5VWFdBVENIRE9HOyBMaWFtIEdpcmR3b29kOyBNYXJrIEJyb3duOyBN YXJrIFJ1dGxhbmQ7IFBhd2VsIE1vbGw7DQo+IFJUQ0xJTlVYOyBSb2IgSGVycmluZzsgU3VwcG9y dCBPcGVuc291cmNlOyBXaW0gVmFuIFNlYnJvZWNrDQo+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggVjMg MS80XSBtZmQ6IGRhOTA2MjogREE5MDYyIE1GRCBjb3JlIGRyaXZlcg0KPiANCj4gT24gVHVlLCAx OSBNYXkgMjAxNSwgUyBUd2lzcyB3cm90ZToNCj4gDQo+ID4gRnJvbTogUyBUd2lzcyA8c3R3aXNz Lm9wZW5zb3VyY2VAZGlhc2VtaS5jb20+DQo+ID4NCj4gPiBBZGQgTUZEIGNvcmUgZHJpdmVyIHN1 cHBvcnQgZm9yIERBOTA2Mg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogU3RldmUgVHdpc3MgPHN0 d2lzcy5vcGVuc291cmNlQGRpYXNlbWkuY29tPg0KPiA+DQoNClsuLi5dDQoNCj4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9tZmQvZGE5MDYyLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2RhOTA2Mi1jb3Jl LmMNCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiA+IGluZGV4IDAwMDAwMDAuLjVhZWEwODIN Cj4gPiAtLS0gL2Rldi9udWxsDQo+ID4gKysrIGIvZHJpdmVycy9tZmQvZGE5MDYyLWNvcmUuYw0K PiA+IEBAIC0wLDAgKzEsNjExIEBADQo+ID4gKy8qDQo+ID4gKyAqIGRhOTA2Mi1jb3JlLmMgLSBD T1JFIGRldmljZSBkcml2ZXIgZm9yIERBOTA2Mg0KPiANCj4gUmVtb3ZlIHRoZSBmaWxlbmFtZS4g IFRoZXkgaGF2ZSBhIGhhYml0IG9mIGJlY29taW5nIGluY29ycmVjdC4NCj4gDQo+IHMvQ09SRS9D b3JlLw0KPiANCj4gQ2FuIHlvdSBhbHNvIG1lbnRpb24gd2hhdCB0aGUgREE5MDYyIGFjdHVhbGx5 IGlzPw0KPiANCg0KV2lsbCByZW1vdmUgZmlsZW5hbWUsIGFuZCBhZGQgYSBkZXNjcmlwdGlvbg0K IkNvcmUsIElSUSBhbmQgSTJDIGRyaXZlciBmb3IgREE5MDYyIFBNSUMiIA0KDQpbLi4uXQ0KDQo+ ID4gKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvcmVnbWFw Lmg+DQo+ID4gKw0KPiANCj4gV2h5IHRoZSAnXG4nPw0KPiANCj4gPiArI2luY2x1ZGUgPGxpbnV4 L2lycS5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4NCj4gPiArI2luY2x1ZGUg PGxpbnV4L2kyYy5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvZXJyLmg+DQo+ID4gKw0KPiANCj4g U2FtZSBoZXJlPw0KPiANCj4gPiArI2luY2x1ZGUgPGxpbnV4L21mZC9kYTkwNjIvY29yZS5oPg0K PiA+ICsjaW5jbHVkZSA8bGludXgvbWZkL2RhOTA2Mi9yZWdpc3RlcnMuaD4NCj4gPiArI2luY2x1 ZGUgPGxpbnV4L29mLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3Ivb2ZfcmVndWxh dG9yLmg+DQo+ID4gKw0KPiA+ICsjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPg0KPiA+ICsjaW5j bHVkZSA8bGludXgva3RocmVhZC5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPg0K PiANCj4gSSdtIGEgYml0IGNvbmNlcm5lZCBieSB0aGUgbnVtYmVyIG9mIGluY2x1ZGVzIGhlcmUs IGFyZSB5b3Ugc3VyZQ0KPiB0aGV5J3JlIGFsbCByZXF1aXJlZD8NCj4gDQo+ID4gKy8qIElSUSBk ZXZpY2UgZHJpdmVyIGZvciBEQTkwNjIgKi8NCj4gDQo+IE5vdCBzdXJlIHdoYXQgdGhpcyBtZWFu cz8NCg0KUmVtb3ZlZCB1bm5lY2Vzc2FyeSB3aGl0ZXNwYWNlIHRocm91Z2hvdXQgdGhlIHBhdGNo ZXMuDQpBbmQgZXJhc2VkIGNvbW1lbnRzIHRocm91Z2hvdXQgIHRoYXQgYXJlIG5vdCByZXF1aXJl ZA0KDQpbLi4uXQ0KDQo+ID4gK2ludCBkYTkwNjJfaXJxX2luaXQoc3RydWN0IGRhOTA2MiAqY2hp cCkNCj4gPiArew0KPiA+ICsJaW50IHJldDsNCj4gPiArDQo+ID4gKwlpZiAoIWNoaXAtPmNoaXBf aXJxKSB7DQo+IA0KPiBDaGVjayB0aGlzIG9uY2UsIGluIHByb2JlKCksIHRoZW4gcmlkIHRoaXMg Y2hlY2suDQo+IA0KPiA+ICsJCWRldl9lcnIoY2hpcC0+ZGV2LCAiTm8gSVJRIGNvbmZpZ3VyZWRc biIpOw0KPiA+ICsJCXJldHVybiAtRUlOVkFMOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldCA9 IHJlZ21hcF9hZGRfaXJxX2NoaXAoY2hpcC0+cmVnbWFwLCBjaGlwLT5jaGlwX2lycSwNCj4gPiAr CQkJSVJRRl9UUklHR0VSX0xPVyB8IElSUUZfT05FU0hPVCB8DQo+IElSUUZfU0hBUkVELA0KPiA+ ICsJCQljaGlwLT5pcnFfYmFzZSwgJmRhOTA2Ml9pcnFfY2hpcCwNCj4gPiArCQkJJmNoaXAtPnJl Z21hcF9pcnEpOw0KPiANCj4gVGhpcyBpcyBqdXN0IG9uZSBjYWxsLiAgSnVzdCBwbGFjZSB0aGF0 IGNhbGwgaW50bw0KPiBkYTkwNjJfZGV2aWNlX2luaXQoKSBhbmQgcmlkIHRoaXMgZnVuY3Rpb24u DQo+IA0KDQpXaWxsIHJlZmFjdG9yIHRoaXMgcGFydC4NCg0KPiA+ICsJaWYgKHJldCkgew0KPiA+ ICsJCWRldl9lcnIoY2hpcC0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgSVJRICVkOiAlZFxuIiwN Cj4gPiArCQkJY2hpcC0+Y2hpcF9pcnEsIHJldCk7DQo+ID4gKwkJcmV0dXJuIHJldDsNCj4gPiAr CX0NCj4gPiArDQo+ID4gKwlyZXR1cm4gMDsNCj4gPiArfQ0KPiA+ICsNCj4gPiArdm9pZCBkYTkw NjJfaXJxX2V4aXQoc3RydWN0IGRhOTA2MiAqY2hpcCkNCj4gPiArew0KPiA+ICsJcmVnbWFwX2Rl bF9pcnFfY2hpcChjaGlwLT5jaGlwX2lycSwgY2hpcC0+cmVnbWFwX2lycSk7DQo+IA0KPiBBZ2Fp biwgdGhpcyBpcyBhYnN0cmFjdGlvbiBmb3IgdGhlIHNha2Ugb2YgYWJzdHJhY3Rpb24uDQo+IA0K DQpJIHdpbGwgZXJhc2UgYWxsIGFic3RyYWN0aW9ucyBhbmQgLi4uDQogIC0gUmVmYWN0b3IgZGE5 MDYyX2RldmljZV9pbml0KCkgYW5kIGRhOTA2Ml9pcnFfaW5pdCgpIGludG8gcHJvYmUNCiAgLSBB ZGQgbmV3IGZ1bmN0aW9uIGdldF9kZXZpY2VfdHlwZSgpIGZvciB2YXJpYW50IGFuZCBkZXZpY2Vf aWQgaW5mb3JtYXRpb24NCg0KWy4uLl0NCg0KPiA+ICtzdGF0aWMgc3RydWN0IHJlc291cmNlIGRh OTA2Ml93ZHRfcmVzb3VyY2VzW10gPSB7DQo+ID4gKwl7DQo+ID4gKwkJLm5hbWUJPSAiV0RHX1dB Uk4iLA0KPiA+ICsJCS5zdGFydAk9IERBOTA2Ml9JUlFfV0RHX1dBUk4sDQo+ID4gKwkJLmVuZAk9 IERBOTA2Ml9JUlFfV0RHX1dBUk4sDQo+ID4gKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsDQo+ ID4gKwl9LA0KPiA+ICt9Ow0KPiANCj4gQ29udmVydCBhbGwgb2YgdGhlc2UgdG8gb25lbGluZXJz IHVzaW5nIERFRklORV9SRVNfKiBtYWNyb3MuDQoNCkRvbmUuDQoNCj4gPiArDQo+ID4gK3N0YXRp YyBpcnFyZXR1cm5fdCBkYTkwNjJfdmRkX3dhcm5fZXZlbnQoaW50IGlycSwgdm9pZCAqZGF0YSkN Cj4gPiArew0KPiA+ICsJc3RydWN0IGRhOTA2MiAqaHcgPSBkYXRhOw0KPiA+ICsNCj4gPiArCWRl dl9lcnIoaHctPmRldiwgIlZERCB3YXJuaW5nIGluZGljYXRvclxuIik7DQo+IA0KPiBJcyBpdCBh biBlcnJvcj8gIERvZXNuJ3QgbG9vayBsaWtlIGl0Lg0KPiANCj4gPiArCXJldHVybiBJUlFfSEFO RExFRDsNCj4gPiArfQ0KDQpTZWUgbGF0ZXIgb24gKHRoaXMgaXMgdG8gYmUgZXJhc2VkKQ0KDQpb Li4uXQ0KDQo+ID4gK3N0YXRpYyBpbnQgZGE5MDYyX2NsZWFyX2ZhdWx0X2xvZyhzdHJ1Y3QgZGE5 MDYyICpjaGlwKQ0KPiA+ICt7DQo+ID4gKwlpbnQgcmV0ID0gMDsNCj4gDQo+IE5vIG5lZWQgdG8g cHJlLWluaXRpYWxpc2UuDQo+IA0KPiA+ICsJaW50IGZhdWx0X2xvZyA9IDA7DQo+IA0KPiBBcyBh Ym92ZS4NCj4gDQo+ID4gKwlyZXQgPSByZWdtYXBfcmVhZChjaGlwLT5yZWdtYXAsIERBOTA2MkFB X0ZBVUxUX0xPRywNCj4gJmZhdWx0X2xvZyk7DQo+ID4gKwlpZiAocmV0IDwgMCkgew0KPiA+ICsJ CWRldl9lcnIoY2hpcC0+ZGV2LCAiQ2Fubm90IHJlYWQgRkFVTFRfTE9HLlxuIik7DQo+ID4gKwkJ cmV0ID0gLUVJTzsNCj4gDQo+IEp1c3QgcmV0dXJuIGFuZCByaWQgdGhlIGVsc2UuDQo+IA0KPiA+ ICsJfSBlbHNlIHsNCj4gPiArCQlpZiAoZmF1bHRfbG9nKSB7DQo+ID4gKwkJCWlmIChmYXVsdF9s b2cgJiBEQTkwNjJBQV9UV0RfRVJST1JfTUFTSykNCg0KSSB3aWxsIHJlZmFjdG9yIGRhOTA2Ml9j bGVhcl9mYXVsdF9sb2coKSB0byByZW1vdmUgaW5jb25zaXN0ZW5jaWVzDQoNCj4gPiAraW50IGRh OTA2Ml9kZXZpY2VfaW5pdChzdHJ1Y3QgZGE5MDYyICpjaGlwLCB1bnNpZ25lZCBpbnQgaXJxKQ0K PiANCj4gTm8gbmVlZCB0byBwYXNzIGlycSwgYXMgaXQncyBwYXJ0IG9mIGNoaXAuDQo+IA0KDQpU aGlzIGlzIGdvaW5nIHRvIGJlIGVyYXNlZCBhcyBwYXJ0IG9mIGEgbGF0ZXIgY29tbWVudCAoc2Vl IGJlbG93KQ0KDQpbLi4uXQ0KDQo+ID4gKwlyZXQgPSBkYTkwNjJfY2xlYXJfZmF1bHRfbG9nKGNo aXApOw0KPiA+ICsJaWYgKHJldCA8IDApDQo+ID4gKwkJZGV2X2VycihjaGlwLT5kZXYsICJDYW5u b3QgY2xlYXIgZmF1bHQgbG9nXG4iKTsNCj4gDQo+IElmIHRoaXMgaXMgYW4gZXJyb3IsIHlvdSBt dXN0IHJldHVybi4gIElmIGl0J3MganVzdCBhIHdhcm5pbmcgdGhlbiB1c2UNCj4gZGV2X3dhcm4o KS4NCg0KV2lsbCB1c2UgZGV2X3dhcm4gaW5zdGVhZA0KDQo+IA0KPiA+ICsJY2hpcC0+aXJxX2Jh c2UgPSAtMTsNCj4gDQo+IFdoeSBhcmUgeW91IHByZS1pbml0aWFsaXNpbmc/DQo+IA0KPiA+ICsJ Y2hpcC0+Y2hpcF9pcnEgPSBpcnE7DQo+IA0KPiBZb3UgYWxyZWFkeSBhc3NpZ25lZCBpcnEgdG8g Y2hpcF9pcnEuDQo+IA0KPiA+ICsJcmV0ID0gcmVnbWFwX3JlYWQoY2hpcC0+cmVnbWFwLCBEQTkw NjJBQV9ERVZJQ0VfSUQsDQo+ICZkZXZpY2VfaWQpOw0KPiA+ICsJaWYgKHJldCA8IDApIHsNCj4g PiArCQlkZXZfZXJyKGNoaXAtPmRldiwgIkNhbm5vdCByZWFkIGNoaXAgSUQuXG4iKTsNCj4gPiAr CQlyZXR1cm4gLUVJTzsNCj4gPiArCX0NCj4gPiArCWlmIChkZXZpY2VfaWQgIT0gREE5MDYyX1BN SUNfREVWSUNFX0lEKSB7DQo+ID4gKwkJZGV2X2VycihjaGlwLT5kZXYsICJJbnZhbGlkIGRldmlj ZSBJRDogMHglMDJ4XG4iLA0KPiBkZXZpY2VfaWQpOw0KPiA+ICsJCXJldHVybiAtRU5PREVWOw0K PiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldCA9IHJlZ21hcF9yZWFkKGNoaXAtPnJlZ21hcCwgREE5 MDYyQUFfVkFSSUFOVF9JRCwNCj4gJnZhcmlhbnRfaWQpOw0KPiA+ICsJaWYgKHJldCA8IDApIHsN Cj4gPiArCQlkZXZfZXJyKGNoaXAtPmRldiwgIkNhbm5vdCByZWFkIGNoaXAgdmFyaWFudCBpZC5c biIpOw0KPiA+ICsJCXJldHVybiAtRUlPOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCWRldl9pbmZv KGNoaXAtPmRldiwNCj4gPiArCQkgIkRldmljZSBkZXRlY3RlZCAoZGV2aWNlLUlEOiAweCUwMlgs IHZhci1JRDogMHglMDJYKVxuIiwNCj4gPiArCQkgZGV2aWNlX2lkLCB2YXJpYW50X2lkKTsNCj4g DQo+IFByb2JhYmx5IGJlc3QgdG8gcHV0IHRoaXMgYXQgdGhlIGVuZC4NCg0KSSBoYXZlIGxlZnQg dGhpcyBwYXJ0IGluIGF0IHRoaXMgcG9pbnQuIFRoZSBkZXZpY2VfaWQgYW5kIHZhcmlhbnRfaWQg YXJlIG5vdA0KcGFzc2VkIGFueSBmdXJ0aGVyIHRoYW4gdGhpcyBmdW5jdGlvbiBmb3IgdGhlIG1v bWVudC4NCg0KPiANCj4gPiArCXZhcmlhbnRfbXJjID0gKHZhcmlhbnRfaWQgJiBEQTkwNjJBQV9N UkNfTUFTSykgPj4NCj4gREE5MDYyQUFfTVJDX1NISUZUOw0KPiA+ICsNCj4gPiArCWlmICh2YXJp YW50X21yYyA8IERBOTA2Ml9QTUlDX1ZBUklBTlRfTVJDX0FBKSB7DQo+ID4gKwkJZGV2X2Vycihj aGlwLT5kZXYsDQo+ID4gKwkJCSJDYW5ub3Qgc3VwcG9ydCB2YXJpYW50IE1SQzogMHglMDJYXG4i LA0KPiB2YXJpYW50X21yYyk7DQo+ID4gKwkJcmV0dXJuIC1FTk9ERVY7DQo+ID4gKwl9DQo+IA0K PiBJJ2QgcHV0IGFsbCBvZiB0aGUgZGV2aWNlL3ZhcmlhbnQgc3R1ZmYgaXQgaXRzIG93biBmdW5j dGlvbiwgdGhlbiBtb3ZlDQo+IGV2ZXJ5dGhpbmcgZWxzZSBpbnRvIHByb2JlKCkgYW5kIHJlbW92 ZSBkYTkwNjJfZGV2aWNlX2luaXQoKS4NCj4gDQoNCkkgd2lsbCBtYWtlIGEgbmV3IGZ1bmN0aW9u IGdldF9kZXZpY2VfdHlwZSgpIGZvciB2YXJpYW50IGFuZCBkZXZpY2VfaWQgaW5mb3JtYXRpb24N Cg0KPiA+ICsJcmV0ID0gZGE5MDYyX2lycV9pbml0KGNoaXApOw0KPiA+ICsJaWYgKHJldCkgew0K PiA+ICsJCWRldl9lcnIoY2hpcC0+ZGV2LCAiQ2Fubm90IGluaXRpYWxpemUgaW50ZXJydXB0cy5c biIpOw0KPiA+ICsJCXJldHVybiByZXQ7DQo+ID4gKwl9DQo+IA0KPiBSZW1vdmUgdGhpcyBmdW5j dGlvbiBhbmQgY2FsbCByZWdtYXBfYWRkX2lycV9jaGlwKCkgZnJvbSBoZXJlLg0KPiANCg0KWWVz LiBJIHdpbGwgZG8gdGhhdC4NCg0KPiA+ICsJY2hpcC0+aXJxX2Jhc2UgPSByZWdtYXBfaXJxX2No aXBfZ2V0X2Jhc2UoY2hpcC0+cmVnbWFwX2lycSk7DQo+ID4gKw0KPiA+ICsJcmV0ID0gbWZkX2Fk ZF9kZXZpY2VzKGNoaXAtPmRldiwgLTEsIGRhOTA2Ml9kZXZzLA0KPiANCj4gVXNlIFBMQVRGT1JN X0RFVklEX05PTkUgaW5zdGVhZC4NCj4gDQo+ID4gKwkJCSAgICAgIEFSUkFZX1NJWkUoZGE5MDYy X2RldnMpLCBOVUxMLCBjaGlwLT5pcnFfYmFzZSwNCj4gPiArCQkJICAgICAgTlVMTCk7DQo+IA0K PiBVc3VhbGx5IGNoaWxkIGRldmljZXMgYXJlIHByb2JlZCBhdCB0aGUgZW5kIGkuZS4gdGhlIGxh c3QgdGhpbmcgaW4NCj4gcHJvYmUoKS4NCj4gDQoNCk9rLiBJIHdpbGwgbW92ZSB0aGF0IHRvIHRo ZSBlbmQgYW5kIHVzZSB0aGUgUExBVEZPUk1fREVWSURfTk9ORSBpbnN0ZWFkDQpvZiB0aGUgZXhw bGljaXQgLTEgdmFsdWUuDQoNCj4gPiArCWlmIChyZXQpIHsNCj4gPiArCQlkZXZfZXJyKGNoaXAt PmRldiwgIkNhbm5vdCBhZGQgTUZEIGNlbGxzXG4iKTsNCj4gDQo+ICJDYW5ub3QgcmVnaXN0ZXIg Y2hpbGQgZGV2aWNlcyIuDQo+IA0KDQpXaWxsIHJlcGxhY2UgdGhhdC4NCg0KWy4uLl0NCg0KPiA+ ICsJLyogVkREIFdBUk4gZXZlbnQgc3VwcG9ydCAqLw0KPiA+ICsJaXJxX3ZkZF93YXJuID0gcmVn bWFwX2lycV9nZXRfdmlycShjaGlwLT5yZWdtYXBfaXJxLA0KPiA+ICsJCQkJCSAgIERBOTA2Ml9J UlFfVkREX1dBUk4pOw0KPiA+ICsJaWYgKGlycV92ZGRfd2FybiA8IDApIHsNCj4gPiArCQlkZXZf ZXJyKGNoaXAtPmRldiwgIkZhaWxlZCB0byBnZXQgSVJRLlxuIik7DQo+ID4gKwkJcmV0dXJuIGly cV92ZGRfd2FybjsNCj4gPiArCX0NCj4gPiArCWNoaXAtPmlycV92ZGRfd2FybiA9IGlycV92ZGRf d2FybjsNCj4gPiArDQo+ID4gKwlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKGNoaXAt PmRldiwgaXJxX3ZkZF93YXJuLA0KPiA+ICsJCQkJCU5VTEwsIGRhOTA2Ml92ZGRfd2Fybl9ldmVu dCwNCj4gPiArCQkJCQlJUlFGX1RSSUdHRVJfTE9XIHwgSVJRRl9PTkVTSE9ULA0KPiA+ICsJCQkJ CSJWRERfV0FSTiIsIGNoaXApOw0KPiA+ICsJaWYgKHJldCkgew0KPiA+ICsJCWRldl93YXJuKGNo aXAtPmRldiwNCj4gPiArCQkJICJGYWlsZWQgdG8gcmVxdWVzdCBWRERfV0FSTiBJUlEuXG4iKTsN Cj4gPiArCQljaGlwLT5pcnFfdmRkX3dhcm4gPSAtRU5YSU87DQo+ID4gKwl9DQo+IA0KPiBUaGlz IGxvb2tzIGxpa2UgYSBsb3Qgb2YgY29kZSwgd2hpY2ggZG9lc24ndCByZWFsbHkgZG8gYW55dGhp bmcuICBXaGF0DQo+IGlzIGEgVkREIHdhcm5pbmcgaW5kaWNhdG9yIGFueXdheT8NCj4gDQoNCkkg d2lsbCByZW1vdmUgdGhpcy4NCg0KVGhlIElSUSBoYW5kbGVyIGRhOTA2Ml92ZGRfd2Fybl9ldmVu dCgpIC0tIHNlZSBlYXJsaWVyIGFib3ZlIC0tIGRvZXMNCm5vdCBjdXJyZW50bHkgZG8gYW55dGhp bmcgYXBhcnQgZnJvbSBoYW5kbGUgdGhlIElSUSB0aGF0IHdhcyByZXF1ZXN0ZWQNCmhlcmUuIEl0 IHByaW50cyBhIHN0YXRlbWVudCB0byBzYXkgdGhlIG1haW4gUE1JQyB2b2x0YWdlIHN1cHBseSBk cm9wcGVkDQpiZWxvdyBhIGRlZmluZWQgdHJpZ2dlciBwb2ludCwgYnV0IGRvZXNuJ3QgYWN0dWFs bHkgZG8gYW55dGhpbmcgdG8gbWl0aWdhdGUNCnRoaXMgcHJvYmxlbS4NCg0KUHJldmlvdXNseSB0 aGlzIFZERF9XQVJOIHdhcyBpbiB0aGUgcmVndWxhdG9yIGRyaXZlciwgaG93ZXZlciBpdCBzaG91 bGQNCmJlIG1hZGUgYXZhaWxhYmxlIGV2ZW4gaWYgdGhlIHJlZ3VsYXRvciBkcml2ZXIgaXMgbm90 IGluc3RhbGxlZCAtLSBzbyBJIGFkZGVkIGl0DQp0byB0aGUgY29yZSBpbnN0ZWFkLg0KDQpJbiBh IHByZXZpb3VzIGRyaXZlciBzdWJtaXNzaW9uIEkgaGFkIGEgc2ltaWxhciBwcm9ibGVtLCBhIHdh cm5pbmcgSVJRIHdhcw0KanVzdCBwcmludGluZyB0byB0aGUgY29uc29sZSB0byBzYXkgdGhlcmUg d2FzIGFuIGVycm9yIC0tIHRoZSBoYW5kbGVyIGFuZA0KSVJRIGNvZGUgd2FzIHB1dCBpbiBieSBt ZSBzbyBpdCBjb3VsZCBiZSB1c2VkIGlmIHRoZSBkcml2ZXIgd2FzIHRha2VuIGFuZA0KaW50ZWdy YXRlZCBpbnRvIGEgZnVsbHkgd29ya2luZyBzeXN0ZW0uDQoNCkkgd2FzIGFza2VkIHRvIHJlbW92 ZSBpdCBpbiB0aGUgb3RoZXIgZHJpdmVyIC0tIGFuZCBJIGhhdmUgZG9uZSB0aGUgc2FtZQ0KaGVy ZSBmb3Igbm93LiBJIGNhbiBhbHdheXMgYWRkIGl0IGJhY2sgbGF0ZXIuDQoNCj4gPiArCXJldHVy biByZXQ7DQo+ID4gK30NCj4gPiArDQo+ID4gK3ZvaWQgZGE5MDYyX2RldmljZV9leGl0KHN0cnVj dCBkYTkwNjIgKmNoaXApDQo+ID4gK3sNCj4gPiArCW1mZF9yZW1vdmVfZGV2aWNlcyhjaGlwLT5k ZXYpOw0KPiA+ICsJZGE5MDYyX2lycV9leGl0KGNoaXApOw0KPiA+ICt9DQo+IA0KPiBBbm90aGVy IHNlZW1pbmdseSBwb2ludGxlc3MgYWJzdHJhY3Rpb24uICBXaHkgZG9uJ3QgeW91IGRvIHRoaXMg aW4NCj4gcmVtb3ZlKCk/DQo+IA0KDQpXaWxsIGRvIHRoYXQgYXMgcGFydCBvZiB0aGUgYWJzdHJh Y3Rpb24gY2xlYW4gdXANCg0KWy4uLl0NCg0KPiA+ICsNCj4gPiArc3RhdGljIHN0cnVjdCByZWdt YXBfY29uZmlnIGRhOTA2Ml9yZWdtYXBfY29uZmlnID0gew0KPiA+ICsJLnJlZ19iaXRzID0gOCwN Cj4gPiArCS52YWxfYml0cyA9IDgsDQo+ID4gKwkucmFuZ2VzID0gZGE5MDYyX3JhbmdlX2NmZywN Cj4gPiArCS5udW1fcmFuZ2VzID0gQVJSQVlfU0laRShkYTkwNjJfcmFuZ2VfY2ZnKSwNCj4gPiAr CS5tYXhfcmVnaXN0ZXIgPSBEQTkwNjJBQV9DT05GSUdfSUQsDQo+ID4gKwkuY2FjaGVfdHlwZSA9 IFJFR0NBQ0hFX1JCVFJFRSwNCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0YXRpYyBjb25zdCBzdHJ1 Y3Qgb2ZfZGV2aWNlX2lkIGRhOTA2Ml9kdF9pZHNbXSA9IHsNCj4gPiArCXsgLmNvbXBhdGlibGUg PSAiZGxnLGRhOTA2MiIsIH0sDQo+ID4gKwl7IH0NCj4gPiArfTsNCj4gPiArTU9EVUxFX0RFVklD RV9UQUJMRShvZiwgZGE5MDYyX2R0X2lkcyk7DQo+IA0KPiBNb3ZlIHRoaXMganVzdCBhYm92ZSB3 aGVyZSBpdCdzIHRvIGJlIHVzZWQgaS5lLiBkb3duIHRvIHRoZSBib3R0b20uDQo+IA0KDQpXaWxs IG1vdmUgdGhhdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLg0KDQo+ID4gK3N0YXRpYyBpbnQgZGE5 MDYyX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLA0KPiA+ICsJY29uc3Qgc3RydWN0 IGkyY19kZXZpY2VfaWQgKmlkKQ0KPiA+ICt7DQo+ID4gKwlzdHJ1Y3QgZGE5MDYyICpjaGlwOw0K PiA+ICsJaW50IHJldDsNCj4gPiArDQo+ID4gKwljaGlwID0gZGV2bV9remFsbG9jKCZpMmMtPmRl diwgc2l6ZW9mKHN0cnVjdCBkYTkwNjIpLCBHRlBfS0VSTkVMKTsNCj4gDQo+IHNpemVvZigqY2hp cCkNCj4gDQo+ID4gKwlpZiAoY2hpcCA9PSBOVUxMKQ0KPiANCj4gaWYgKCFjaGlwKQ0KDQpXaWxs IGRvIHRoYXQuDQoNCj4gPiArCWRhOTA2Ml9yZWdtYXBfY29uZmlnLnJkX3RhYmxlID0gJmRhOTA2 Ml9hYV9yZWFkYWJsZV90YWJsZTsNCj4gPiArCWRhOTA2Ml9yZWdtYXBfY29uZmlnLndyX3RhYmxl ID0gJmRhOTA2Ml9hYV93cml0ZWFibGVfdGFibGU7DQo+ID4gKwlkYTkwNjJfcmVnbWFwX2NvbmZp Zy52b2xhdGlsZV90YWJsZSA9ICZkYTkwNjJfYWFfdm9sYXRpbGVfdGFibGU7DQo+IA0KPiBXaHkg YXJlIHlvdSBkb2luZyB0aGlzIGhlcmUgaW5zdGVhZCBvZiBpbnNpZGUNCj4gJ3N0cnVjdCByZWdt YXBfY29uZmlnIGRhOTA2Ml9yZWdtYXBfY29uZmlnJyBhYm92ZT8NCj4gDQoNCk9rLi4gSSB3aWxs IGZpeCB0aGF0IHBhcnQgaW50byB0aGUgbWFpbiBzdHJ1Y3R1cmUuDQoNCg0KPiA+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgZGE5MDYyX2kyY19pZFtdID0gew0KPiA+ICsJeyJk YTkwNjIiLCAwfSwNCj4gDQo+IFdoaXRlIHNwYWNlIGRpc2NpcGxpbmUuDQo+IA0KDQpJIGhhdmUg cHV0IHNvbWUgd2hpdGUtc3BhY2VzIGluIHRoZSBjb2RlLg0KSSB0aGluayB0aGlzOg0KDQp7ICJk YTkwNjIiLCAwIH0sDQp7IH0sDQoNClsuLi5dDQoNCj4gDQo+ID4gK01PRFVMRV9ERVNDUklQVElP TigiQ09SRSBkZXZpY2UgZHJpdmVyIGZvciBEaWFsb2cgREE5MDYyIik7DQo+IA0KPiBzL0NPUkUv Q29yZS8NCj4gDQoNClllcy4NCg0KPiA+ICtNT0RVTEVfQVVUSE9SKCJTIFR3aXNzIDxzdHdpc3Mu b3BlbnNvdXJjZUBkaWFzZW1pLmNvbT4iKTsNCj4gDQo+IEZ1bGwgbmFtZXMgcGxlYXNlLg0KPiAN Cg0KT2suIA0KDQpbLi4uXQ0KDQo+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2Rh OTA2Mi9jb3JlLmgNCj4gYi9pbmNsdWRlL2xpbnV4L21mZC9kYTkwNjIvY29yZS5oDQo+ID4gbmV3 IGZpbGUgbW9kZSAxMDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwLi4wYjE3ODkxDQo+ID4gLS0tIC9k ZXYvbnVsbA0KPiA+ICsrKyBiL2luY2x1ZGUvbGludXgvbWZkL2RhOTA2Mi9jb3JlLmgNCj4gPiBA QCAtMCwwICsxLDYyIEBADQo+ID4gKy8qDQo+ID4gKyAqIGNvcmUuaCAtIENPUkUgSCBmb3IgREE5 MDYyDQo+IA0KPiBXaGF0IGRvZXMgdGhpcyBhZGQ/DQo+IA0KDQpSZW1vdmVkIHRoZSB0b3AgbGlu ZSBjb21wbGV0ZWx5DQoNClsuLi5dDQoNCj4gPiArDQo+ID4gK3N0cnVjdCBkYTkwNjIgew0KPiA+ ICsJc3RydWN0IGRldmljZSAqZGV2Ow0KPiA+ICsJdW5zaWduZWQgY2hhciBkZXZpY2VfaWQ7DQo+ ID4gKwl1bnNpZ25lZCBjaGFyIHZhcmlhbnRfbXJjOw0KPiA+ICsJc3RydWN0IHJlZ21hcCAqcmVn bWFwOw0KPiA+ICsJaW50IGNoaXBfaXJxOw0KPiA+ICsJdW5zaWduZWQgaW50IGlycV9iYXNlOw0K PiA+ICsJc3RydWN0IHJlZ21hcF9pcnFfY2hpcF9kYXRhICpyZWdtYXBfaXJxOw0KPiA+ICsJaW50 IGlycV92ZGRfd2FybjsNCj4gPiArfTsNCj4gDQo+IEFyZSBhbGwgb2YgdGhlc2UgdXNlZCBieSBj aGlsZCBkZXZpY2VzPw0KPiANCg0KQWZ0ZXIgSSBkaWQgdGhlIHJlZmFjdG9yaW5nIHdvcmsgZGVz Y3JpYmVkIGFib3ZlLCBJIGNhbiByZW1vdmUgcXVpdGUgYSBmZXcgb2YgdGhlbS4NCg0KdW5zaWdu ZWQgY2hhciBkZXZpY2VfaWQ7DQp1bnNpZ25lZCBjaGFyIHZhcmlhbnRfbXJjOw0KDQpUaGVzZSBh cmUgbm90IGN1cnJlbnRseSB1c2VkIGluIGFueSBjaGlsZCBkZXZpY2UgZHJpdmVycyAtLSBiZWNh dXNlIHRoZXJlIGlzIG9ubHkNCm9uZSBkZXZpY2Ugb2YgdGhpcyB0eXBlLg0KDQppbnQgY2hpcF9p cnE7DQp1bnNpZ25lZCBpbnQgaXJxX2Jhc2U7DQoNClRoZSBjaGlwX2lkIGlzIG5vdyBsb2NhbCB0 byB0aGUgcHJvYmUgYW5kIGNhbiByZXBsYWNlZCB3aXRoIGkyYy0+aXJxIGluIHRoYXQgZnVuY3Rp b24NCkl0J3Mgb25seSB1c2UgaXMgZHVyaW5nIGNsZWFuLXVwIGFuZCBpMmMtPmlycSBjYW4gYmUg dXNlZCB0aGVyZSBhbHNvLg0KaXJxX2Jhc2UgaXMgbG9jYWwgdG8gcHJvYmUoKSBhbHNvLCBzbyBJ IGhhdmUgbWFkZSBpdCBhdXRvbWF0aWMuDQoNCj4gPiArCWludCBpcnFfdmRkX3dhcm47DQoNCkkg aGF2ZSByZW1vdmVkIHRoZSB2ZGRfd2FybiBjYXBhYmlsaXR5IGluIHRoaXMgcGF0Y2guDQoNCj4g PiAraW50IGRhOTA2Ml9kZXZpY2VfaW5pdChzdHJ1Y3QgZGE5MDYyICosIHVuc2lnbmVkIGludCk7 DQo+ID4gK2ludCBkYTkwNjJfaXJxX2luaXQoc3RydWN0IGRhOTA2MiAqKTsNCj4gPiArDQo+ID4g K3ZvaWQgZGE5MDYyX2RldmljZV9leGl0KHN0cnVjdCBkYTkwNjIgKik7DQo+ID4gK3ZvaWQgZGE5 MDYyX2lycV9leGl0KHN0cnVjdCBkYTkwNjIgKik7DQo+IA0KPiBXaHkgYXJlIHRoZXNlIHJlcXVp cmVkPw0KPiANCg0KR29uZS4NCg0KWy4uLl0NCg0KPiA+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xp bnV4L21mZC9kYTkwNjIvcmVnaXN0ZXJzLmgNCj4gYi9pbmNsdWRlL2xpbnV4L21mZC9kYTkwNjIv cmVnaXN0ZXJzLmgNCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiA+IGluZGV4IDAwMDAwMDAu LmQwN2MyYmMNCj4gPiAtLS0gL2Rldi9udWxsDQo+ID4gKysrIGIvaW5jbHVkZS9saW51eC9tZmQv ZGE5MDYyL3JlZ2lzdGVycy5oDQoNClsuLi5dDQoNCj4gPiArLyoNCj4gPiArICogUmVnaXN0ZXJz DQo+ID4gKyAqLw0KPiANCj4gUmVhbGx5PyA7KQ0KPiANCj4gPiArI2RlZmluZSBEQTkwNjJBQV9Q QUdFX0NPTgkJMHgwMDANCj4gPiArI2RlZmluZSBEQTkwNjJBQV9TVEFUVVNfQQkJMHgwMDENCj4g PiArI2RlZmluZSBEQTkwNjJBQV9TVEFUVVNfQgkJMHgwMDINCg0KWy4uLl0NCg0KPiA+ICsNCj4g PiArLyoNCj4gPiArICogQml0IGZpZWxkcw0KPiA+ICsgKi8NCj4gPiArDQo+ID4gKy8qIERBOTA2 MkFBX1BBR0VfQ09OID0gMHgwMDAgKi8NCj4gPiArI2RlZmluZSBEQTkwNjJBQV9QQUdFX1NISUZU CQkwDQo+ID4gKyNkZWZpbmUgREE5MDYyQUFfUEFHRV9NQVNLCQkoMHgzZiA8PCAwKQ0KPiA+ICsj ZGVmaW5lIERBOTA2MkFBX1dSSVRFX01PREVfU0hJRlQJNg0KPiA+ICsjZGVmaW5lIERBOTA2MkFB X1dSSVRFX01PREVfTUFTSwkoMHgwMSA8PCA2KQ0KPiANCj4gRm9yIDEgPDwgWCwgeW91IHNob3Vs ZCB1c2UgQklUKFgpLg0KPiANCg0KRm9yIHRoZSB0d28gY29tbWVudHMgYWJvdmUgIlJlZ2lzdGVy cyIgYW5kICJCaXQgZmllbGRzIiBhbmQgdGhlICgxPDx4KQ0KZGVmaW5pdGlvbnMgLi4uDQoNClRo ZSB3aG9sZSBvZiB0aGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgb3VyIGhh cmR3YXJlIGRlc2lnbmVycw0KSSB3b3VsZCBwcmVmZXIgaXQgaWYgdGhlIHJlZ2lzdGVyIGRlZmlu aXRpb25zIGFuZCBiaXQgZmllbGRzIGFyZSBub3QgYWx0ZXJlZCB1c2luZw0KdGhlICNkZWZpbmUg QklUKG5yKSAoMVVMPDwobnIpKSBtYWNybyBhbmQgdGhlIGNvbW1lbnRzIHJlbW92ZWQgYmVjYXVz ZQ0Kd2UgaGF2ZSBzY3JpcHRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhpcyBmaWxlIGF1 dG9tYXRpY2FsbHkuDQoNCkFsc28gaWYgdGhlIHJlZ2lzdGVyIG1hcCBpcyBldmVyIHVwZGF0ZWQs IHRoZW4gaXQgd2lsbCBiZSBlYXNpZXIgZm9yIG1lIHRvIGRpZmYNCnRoZSBuZXcgZGVsaXZlcmVk IHJlZ2lzdGVyIGFuZCBiaXQgZmllbGQgZGVmaW5pdGlvbnMgd2l0aCB0aGUgb2xkIG9uZS4NCg0K TXkgcHJlZmVyZW5jZSB3b3VsZCBiZSBub3QgdG8gY2hhbmdlIHRoaXMgaGVhZGVyIGZpbGUuDQoN ClsuLi5dDQoNCklmIEkgaGF2ZSBsZWZ0IGFueXRoaW5nIG91dCBwbGVhc2UgbGV0IG1lIGtub3cu DQoNCnJlZ2FyZHMsDQpTdGV2ZQ0K -- To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail1.bemta3.messagelabs.com ([195.245.230.169]:45328 "EHLO mail1.bemta3.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751588AbbE1Mwy (ORCPT ); Thu, 28 May 2015 08:52:54 -0400 From: "Opensource [Steve Twiss]" To: Lee Jones CC: LINUXKERNEL , Samuel Ortiz , Alessandro Zummo , DEVICETREE , David Dajun Chen , Dmitry Torokhov , Ian Campbell , Kumar Gala , LINUXINPUT , LINUXWATCHDOG , Liam Girdwood , "Mark Brown" , Mark Rutland , Pawel Moll , RTCLINUX , Rob Herring , Support Opensource , Wim Van Sebroeck Subject: RE: [PATCH V3 1/4] mfd: da9062: DA9062 MFD core driver Date: Thu, 28 May 2015 12:52:45 +0000 Message-ID: <6ED8E3B22081A4459DAC7699F3695FB7014B22DEC7@SW-EX-MBX02.diasemi.com> References: <20150526161024.GQ11677@x1> In-Reply-To: <20150526161024.GQ11677@x1> Content-Language: en-US Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 Sender: linux-watchdog-owner@vger.kernel.org List-Id: linux-watchdog@vger.kernel.org SGkgTGVlLCANCg0KSSB3aWxsIHJlZmFjdG9yIGEgbG90IG9mIHRoZSBkcml2ZXIgYW5kIGltcGxl bWVudCB5b3VyIGNoYW5nZXMgYXMgcmVxdWVzdGVkLg0KSSB0aGluayB0aGUgb25seSBtYWpvciBk aWZmZXJlbmNlcyB3aXRoIHlvdXIgY29tbWVudHMgd2lsbCBiZSBhcyBmb2xsb3dzOg0KDQotIHRo ZSBpbnRlcnJ1cHQgaGFuZGxlciBkYTkwNjJfdmRkX3dhcm5fZXZlbnQoKSB3aWxsIGJlIGVyYXNl ZA0KLSBJIHdvdWxkIHByZWZlciB0aGUgcmVnaXN0ZXIgaGVhZGVyIGZpbGUgdG8gcmVtYWluICBb bW9zdGx5XSB1bnRvdWNoZWQgDQoNClBsZWFzZSBmaW5kIG1vcmUgZGV0YWlsZWQgY29tbWVudHMg YmVsb3cuDQoNCnRoYW5rcywNClN0ZXZlDQoNCk9uIDI2IE1heSAyMDE1IDE3OjEwIExlZSBKb25l cyB3cm90ZQ0KDQo+IFRvOiBPcGVuc291cmNlIFtTdGV2ZSBUd2lzc10NCj4gQ2M6IExJTlVYS0VS TkVMOyBTYW11ZWwgT3J0aXo7IEFsZXNzYW5kcm8gWnVtbW87IERFVklDRVRSRUU7IERhdmlkDQo+ IERhanVuIENoZW47IERtaXRyeSBUb3Jva2hvdjsgSWFuIENhbXBiZWxsOyBLdW1hciBHYWxhOyBM SU5VWElOUFVUOw0KPiBMSU5VWFdBVENIRE9HOyBMaWFtIEdpcmR3b29kOyBNYXJrIEJyb3duOyBN YXJrIFJ1dGxhbmQ7IFBhd2VsIE1vbGw7DQo+IFJUQ0xJTlVYOyBSb2IgSGVycmluZzsgU3VwcG9y dCBPcGVuc291cmNlOyBXaW0gVmFuIFNlYnJvZWNrDQo+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggVjMg MS80XSBtZmQ6IGRhOTA2MjogREE5MDYyIE1GRCBjb3JlIGRyaXZlcg0KPiANCj4gT24gVHVlLCAx OSBNYXkgMjAxNSwgUyBUd2lzcyB3cm90ZToNCj4gDQo+ID4gRnJvbTogUyBUd2lzcyA8c3R3aXNz Lm9wZW5zb3VyY2VAZGlhc2VtaS5jb20+DQo+ID4NCj4gPiBBZGQgTUZEIGNvcmUgZHJpdmVyIHN1 cHBvcnQgZm9yIERBOTA2Mg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogU3RldmUgVHdpc3MgPHN0 d2lzcy5vcGVuc291cmNlQGRpYXNlbWkuY29tPg0KPiA+DQoNClsuLi5dDQoNCj4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9tZmQvZGE5MDYyLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2RhOTA2Mi1jb3Jl LmMNCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiA+IGluZGV4IDAwMDAwMDAuLjVhZWEwODIN Cj4gPiAtLS0gL2Rldi9udWxsDQo+ID4gKysrIGIvZHJpdmVycy9tZmQvZGE5MDYyLWNvcmUuYw0K PiA+IEBAIC0wLDAgKzEsNjExIEBADQo+ID4gKy8qDQo+ID4gKyAqIGRhOTA2Mi1jb3JlLmMgLSBD T1JFIGRldmljZSBkcml2ZXIgZm9yIERBOTA2Mg0KPiANCj4gUmVtb3ZlIHRoZSBmaWxlbmFtZS4g IFRoZXkgaGF2ZSBhIGhhYml0IG9mIGJlY29taW5nIGluY29ycmVjdC4NCj4gDQo+IHMvQ09SRS9D b3JlLw0KPiANCj4gQ2FuIHlvdSBhbHNvIG1lbnRpb24gd2hhdCB0aGUgREE5MDYyIGFjdHVhbGx5 IGlzPw0KPiANCg0KV2lsbCByZW1vdmUgZmlsZW5hbWUsIGFuZCBhZGQgYSBkZXNjcmlwdGlvbg0K IkNvcmUsIElSUSBhbmQgSTJDIGRyaXZlciBmb3IgREE5MDYyIFBNSUMiIA0KDQpbLi4uXQ0KDQo+ ID4gKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvcmVnbWFw Lmg+DQo+ID4gKw0KPiANCj4gV2h5IHRoZSAnXG4nPw0KPiANCj4gPiArI2luY2x1ZGUgPGxpbnV4 L2lycS5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4NCj4gPiArI2luY2x1ZGUg PGxpbnV4L2kyYy5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvZXJyLmg+DQo+ID4gKw0KPiANCj4g U2FtZSBoZXJlPw0KPiANCj4gPiArI2luY2x1ZGUgPGxpbnV4L21mZC9kYTkwNjIvY29yZS5oPg0K PiA+ICsjaW5jbHVkZSA8bGludXgvbWZkL2RhOTA2Mi9yZWdpc3RlcnMuaD4NCj4gPiArI2luY2x1 ZGUgPGxpbnV4L29mLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3Ivb2ZfcmVndWxh dG9yLmg+DQo+ID4gKw0KPiA+ICsjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPg0KPiA+ICsjaW5j bHVkZSA8bGludXgva3RocmVhZC5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPg0K PiANCj4gSSdtIGEgYml0IGNvbmNlcm5lZCBieSB0aGUgbnVtYmVyIG9mIGluY2x1ZGVzIGhlcmUs IGFyZSB5b3Ugc3VyZQ0KPiB0aGV5J3JlIGFsbCByZXF1aXJlZD8NCj4gDQo+ID4gKy8qIElSUSBk ZXZpY2UgZHJpdmVyIGZvciBEQTkwNjIgKi8NCj4gDQo+IE5vdCBzdXJlIHdoYXQgdGhpcyBtZWFu cz8NCg0KUmVtb3ZlZCB1bm5lY2Vzc2FyeSB3aGl0ZXNwYWNlIHRocm91Z2hvdXQgdGhlIHBhdGNo ZXMuDQpBbmQgZXJhc2VkIGNvbW1lbnRzIHRocm91Z2hvdXQgIHRoYXQgYXJlIG5vdCByZXF1aXJl ZA0KDQpbLi4uXQ0KDQo+ID4gK2ludCBkYTkwNjJfaXJxX2luaXQoc3RydWN0IGRhOTA2MiAqY2hp cCkNCj4gPiArew0KPiA+ICsJaW50IHJldDsNCj4gPiArDQo+ID4gKwlpZiAoIWNoaXAtPmNoaXBf aXJxKSB7DQo+IA0KPiBDaGVjayB0aGlzIG9uY2UsIGluIHByb2JlKCksIHRoZW4gcmlkIHRoaXMg Y2hlY2suDQo+IA0KPiA+ICsJCWRldl9lcnIoY2hpcC0+ZGV2LCAiTm8gSVJRIGNvbmZpZ3VyZWRc biIpOw0KPiA+ICsJCXJldHVybiAtRUlOVkFMOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldCA9 IHJlZ21hcF9hZGRfaXJxX2NoaXAoY2hpcC0+cmVnbWFwLCBjaGlwLT5jaGlwX2lycSwNCj4gPiAr CQkJSVJRRl9UUklHR0VSX0xPVyB8IElSUUZfT05FU0hPVCB8DQo+IElSUUZfU0hBUkVELA0KPiA+ ICsJCQljaGlwLT5pcnFfYmFzZSwgJmRhOTA2Ml9pcnFfY2hpcCwNCj4gPiArCQkJJmNoaXAtPnJl Z21hcF9pcnEpOw0KPiANCj4gVGhpcyBpcyBqdXN0IG9uZSBjYWxsLiAgSnVzdCBwbGFjZSB0aGF0 IGNhbGwgaW50bw0KPiBkYTkwNjJfZGV2aWNlX2luaXQoKSBhbmQgcmlkIHRoaXMgZnVuY3Rpb24u DQo+IA0KDQpXaWxsIHJlZmFjdG9yIHRoaXMgcGFydC4NCg0KPiA+ICsJaWYgKHJldCkgew0KPiA+ ICsJCWRldl9lcnIoY2hpcC0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgSVJRICVkOiAlZFxuIiwN Cj4gPiArCQkJY2hpcC0+Y2hpcF9pcnEsIHJldCk7DQo+ID4gKwkJcmV0dXJuIHJldDsNCj4gPiAr CX0NCj4gPiArDQo+ID4gKwlyZXR1cm4gMDsNCj4gPiArfQ0KPiA+ICsNCj4gPiArdm9pZCBkYTkw NjJfaXJxX2V4aXQoc3RydWN0IGRhOTA2MiAqY2hpcCkNCj4gPiArew0KPiA+ICsJcmVnbWFwX2Rl bF9pcnFfY2hpcChjaGlwLT5jaGlwX2lycSwgY2hpcC0+cmVnbWFwX2lycSk7DQo+IA0KPiBBZ2Fp biwgdGhpcyBpcyBhYnN0cmFjdGlvbiBmb3IgdGhlIHNha2Ugb2YgYWJzdHJhY3Rpb24uDQo+IA0K DQpJIHdpbGwgZXJhc2UgYWxsIGFic3RyYWN0aW9ucyBhbmQgLi4uDQogIC0gUmVmYWN0b3IgZGE5 MDYyX2RldmljZV9pbml0KCkgYW5kIGRhOTA2Ml9pcnFfaW5pdCgpIGludG8gcHJvYmUNCiAgLSBB ZGQgbmV3IGZ1bmN0aW9uIGdldF9kZXZpY2VfdHlwZSgpIGZvciB2YXJpYW50IGFuZCBkZXZpY2Vf aWQgaW5mb3JtYXRpb24NCg0KWy4uLl0NCg0KPiA+ICtzdGF0aWMgc3RydWN0IHJlc291cmNlIGRh OTA2Ml93ZHRfcmVzb3VyY2VzW10gPSB7DQo+ID4gKwl7DQo+ID4gKwkJLm5hbWUJPSAiV0RHX1dB Uk4iLA0KPiA+ICsJCS5zdGFydAk9IERBOTA2Ml9JUlFfV0RHX1dBUk4sDQo+ID4gKwkJLmVuZAk9 IERBOTA2Ml9JUlFfV0RHX1dBUk4sDQo+ID4gKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsDQo+ ID4gKwl9LA0KPiA+ICt9Ow0KPiANCj4gQ29udmVydCBhbGwgb2YgdGhlc2UgdG8gb25lbGluZXJz IHVzaW5nIERFRklORV9SRVNfKiBtYWNyb3MuDQoNCkRvbmUuDQoNCj4gPiArDQo+ID4gK3N0YXRp YyBpcnFyZXR1cm5fdCBkYTkwNjJfdmRkX3dhcm5fZXZlbnQoaW50IGlycSwgdm9pZCAqZGF0YSkN Cj4gPiArew0KPiA+ICsJc3RydWN0IGRhOTA2MiAqaHcgPSBkYXRhOw0KPiA+ICsNCj4gPiArCWRl dl9lcnIoaHctPmRldiwgIlZERCB3YXJuaW5nIGluZGljYXRvclxuIik7DQo+IA0KPiBJcyBpdCBh biBlcnJvcj8gIERvZXNuJ3QgbG9vayBsaWtlIGl0Lg0KPiANCj4gPiArCXJldHVybiBJUlFfSEFO RExFRDsNCj4gPiArfQ0KDQpTZWUgbGF0ZXIgb24gKHRoaXMgaXMgdG8gYmUgZXJhc2VkKQ0KDQpb Li4uXQ0KDQo+ID4gK3N0YXRpYyBpbnQgZGE5MDYyX2NsZWFyX2ZhdWx0X2xvZyhzdHJ1Y3QgZGE5 MDYyICpjaGlwKQ0KPiA+ICt7DQo+ID4gKwlpbnQgcmV0ID0gMDsNCj4gDQo+IE5vIG5lZWQgdG8g cHJlLWluaXRpYWxpc2UuDQo+IA0KPiA+ICsJaW50IGZhdWx0X2xvZyA9IDA7DQo+IA0KPiBBcyBh Ym92ZS4NCj4gDQo+ID4gKwlyZXQgPSByZWdtYXBfcmVhZChjaGlwLT5yZWdtYXAsIERBOTA2MkFB X0ZBVUxUX0xPRywNCj4gJmZhdWx0X2xvZyk7DQo+ID4gKwlpZiAocmV0IDwgMCkgew0KPiA+ICsJ CWRldl9lcnIoY2hpcC0+ZGV2LCAiQ2Fubm90IHJlYWQgRkFVTFRfTE9HLlxuIik7DQo+ID4gKwkJ cmV0ID0gLUVJTzsNCj4gDQo+IEp1c3QgcmV0dXJuIGFuZCByaWQgdGhlIGVsc2UuDQo+IA0KPiA+ ICsJfSBlbHNlIHsNCj4gPiArCQlpZiAoZmF1bHRfbG9nKSB7DQo+ID4gKwkJCWlmIChmYXVsdF9s b2cgJiBEQTkwNjJBQV9UV0RfRVJST1JfTUFTSykNCg0KSSB3aWxsIHJlZmFjdG9yIGRhOTA2Ml9j bGVhcl9mYXVsdF9sb2coKSB0byByZW1vdmUgaW5jb25zaXN0ZW5jaWVzDQoNCj4gPiAraW50IGRh OTA2Ml9kZXZpY2VfaW5pdChzdHJ1Y3QgZGE5MDYyICpjaGlwLCB1bnNpZ25lZCBpbnQgaXJxKQ0K PiANCj4gTm8gbmVlZCB0byBwYXNzIGlycSwgYXMgaXQncyBwYXJ0IG9mIGNoaXAuDQo+IA0KDQpU aGlzIGlzIGdvaW5nIHRvIGJlIGVyYXNlZCBhcyBwYXJ0IG9mIGEgbGF0ZXIgY29tbWVudCAoc2Vl IGJlbG93KQ0KDQpbLi4uXQ0KDQo+ID4gKwlyZXQgPSBkYTkwNjJfY2xlYXJfZmF1bHRfbG9nKGNo aXApOw0KPiA+ICsJaWYgKHJldCA8IDApDQo+ID4gKwkJZGV2X2VycihjaGlwLT5kZXYsICJDYW5u b3QgY2xlYXIgZmF1bHQgbG9nXG4iKTsNCj4gDQo+IElmIHRoaXMgaXMgYW4gZXJyb3IsIHlvdSBt dXN0IHJldHVybi4gIElmIGl0J3MganVzdCBhIHdhcm5pbmcgdGhlbiB1c2UNCj4gZGV2X3dhcm4o KS4NCg0KV2lsbCB1c2UgZGV2X3dhcm4gaW5zdGVhZA0KDQo+IA0KPiA+ICsJY2hpcC0+aXJxX2Jh c2UgPSAtMTsNCj4gDQo+IFdoeSBhcmUgeW91IHByZS1pbml0aWFsaXNpbmc/DQo+IA0KPiA+ICsJ Y2hpcC0+Y2hpcF9pcnEgPSBpcnE7DQo+IA0KPiBZb3UgYWxyZWFkeSBhc3NpZ25lZCBpcnEgdG8g Y2hpcF9pcnEuDQo+IA0KPiA+ICsJcmV0ID0gcmVnbWFwX3JlYWQoY2hpcC0+cmVnbWFwLCBEQTkw NjJBQV9ERVZJQ0VfSUQsDQo+ICZkZXZpY2VfaWQpOw0KPiA+ICsJaWYgKHJldCA8IDApIHsNCj4g PiArCQlkZXZfZXJyKGNoaXAtPmRldiwgIkNhbm5vdCByZWFkIGNoaXAgSUQuXG4iKTsNCj4gPiAr CQlyZXR1cm4gLUVJTzsNCj4gPiArCX0NCj4gPiArCWlmIChkZXZpY2VfaWQgIT0gREE5MDYyX1BN SUNfREVWSUNFX0lEKSB7DQo+ID4gKwkJZGV2X2VycihjaGlwLT5kZXYsICJJbnZhbGlkIGRldmlj ZSBJRDogMHglMDJ4XG4iLA0KPiBkZXZpY2VfaWQpOw0KPiA+ICsJCXJldHVybiAtRU5PREVWOw0K PiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldCA9IHJlZ21hcF9yZWFkKGNoaXAtPnJlZ21hcCwgREE5 MDYyQUFfVkFSSUFOVF9JRCwNCj4gJnZhcmlhbnRfaWQpOw0KPiA+ICsJaWYgKHJldCA8IDApIHsN Cj4gPiArCQlkZXZfZXJyKGNoaXAtPmRldiwgIkNhbm5vdCByZWFkIGNoaXAgdmFyaWFudCBpZC5c biIpOw0KPiA+ICsJCXJldHVybiAtRUlPOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCWRldl9pbmZv KGNoaXAtPmRldiwNCj4gPiArCQkgIkRldmljZSBkZXRlY3RlZCAoZGV2aWNlLUlEOiAweCUwMlgs IHZhci1JRDogMHglMDJYKVxuIiwNCj4gPiArCQkgZGV2aWNlX2lkLCB2YXJpYW50X2lkKTsNCj4g DQo+IFByb2JhYmx5IGJlc3QgdG8gcHV0IHRoaXMgYXQgdGhlIGVuZC4NCg0KSSBoYXZlIGxlZnQg dGhpcyBwYXJ0IGluIGF0IHRoaXMgcG9pbnQuIFRoZSBkZXZpY2VfaWQgYW5kIHZhcmlhbnRfaWQg YXJlIG5vdA0KcGFzc2VkIGFueSBmdXJ0aGVyIHRoYW4gdGhpcyBmdW5jdGlvbiBmb3IgdGhlIG1v bWVudC4NCg0KPiANCj4gPiArCXZhcmlhbnRfbXJjID0gKHZhcmlhbnRfaWQgJiBEQTkwNjJBQV9N UkNfTUFTSykgPj4NCj4gREE5MDYyQUFfTVJDX1NISUZUOw0KPiA+ICsNCj4gPiArCWlmICh2YXJp YW50X21yYyA8IERBOTA2Ml9QTUlDX1ZBUklBTlRfTVJDX0FBKSB7DQo+ID4gKwkJZGV2X2Vycihj aGlwLT5kZXYsDQo+ID4gKwkJCSJDYW5ub3Qgc3VwcG9ydCB2YXJpYW50IE1SQzogMHglMDJYXG4i LA0KPiB2YXJpYW50X21yYyk7DQo+ID4gKwkJcmV0dXJuIC1FTk9ERVY7DQo+ID4gKwl9DQo+IA0K PiBJJ2QgcHV0IGFsbCBvZiB0aGUgZGV2aWNlL3ZhcmlhbnQgc3R1ZmYgaXQgaXRzIG93biBmdW5j dGlvbiwgdGhlbiBtb3ZlDQo+IGV2ZXJ5dGhpbmcgZWxzZSBpbnRvIHByb2JlKCkgYW5kIHJlbW92 ZSBkYTkwNjJfZGV2aWNlX2luaXQoKS4NCj4gDQoNCkkgd2lsbCBtYWtlIGEgbmV3IGZ1bmN0aW9u IGdldF9kZXZpY2VfdHlwZSgpIGZvciB2YXJpYW50IGFuZCBkZXZpY2VfaWQgaW5mb3JtYXRpb24N Cg0KPiA+ICsJcmV0ID0gZGE5MDYyX2lycV9pbml0KGNoaXApOw0KPiA+ICsJaWYgKHJldCkgew0K PiA+ICsJCWRldl9lcnIoY2hpcC0+ZGV2LCAiQ2Fubm90IGluaXRpYWxpemUgaW50ZXJydXB0cy5c biIpOw0KPiA+ICsJCXJldHVybiByZXQ7DQo+ID4gKwl9DQo+IA0KPiBSZW1vdmUgdGhpcyBmdW5j dGlvbiBhbmQgY2FsbCByZWdtYXBfYWRkX2lycV9jaGlwKCkgZnJvbSBoZXJlLg0KPiANCg0KWWVz LiBJIHdpbGwgZG8gdGhhdC4NCg0KPiA+ICsJY2hpcC0+aXJxX2Jhc2UgPSByZWdtYXBfaXJxX2No aXBfZ2V0X2Jhc2UoY2hpcC0+cmVnbWFwX2lycSk7DQo+ID4gKw0KPiA+ICsJcmV0ID0gbWZkX2Fk ZF9kZXZpY2VzKGNoaXAtPmRldiwgLTEsIGRhOTA2Ml9kZXZzLA0KPiANCj4gVXNlIFBMQVRGT1JN X0RFVklEX05PTkUgaW5zdGVhZC4NCj4gDQo+ID4gKwkJCSAgICAgIEFSUkFZX1NJWkUoZGE5MDYy X2RldnMpLCBOVUxMLCBjaGlwLT5pcnFfYmFzZSwNCj4gPiArCQkJICAgICAgTlVMTCk7DQo+IA0K PiBVc3VhbGx5IGNoaWxkIGRldmljZXMgYXJlIHByb2JlZCBhdCB0aGUgZW5kIGkuZS4gdGhlIGxh c3QgdGhpbmcgaW4NCj4gcHJvYmUoKS4NCj4gDQoNCk9rLiBJIHdpbGwgbW92ZSB0aGF0IHRvIHRo ZSBlbmQgYW5kIHVzZSB0aGUgUExBVEZPUk1fREVWSURfTk9ORSBpbnN0ZWFkDQpvZiB0aGUgZXhw bGljaXQgLTEgdmFsdWUuDQoNCj4gPiArCWlmIChyZXQpIHsNCj4gPiArCQlkZXZfZXJyKGNoaXAt PmRldiwgIkNhbm5vdCBhZGQgTUZEIGNlbGxzXG4iKTsNCj4gDQo+ICJDYW5ub3QgcmVnaXN0ZXIg Y2hpbGQgZGV2aWNlcyIuDQo+IA0KDQpXaWxsIHJlcGxhY2UgdGhhdC4NCg0KWy4uLl0NCg0KPiA+ ICsJLyogVkREIFdBUk4gZXZlbnQgc3VwcG9ydCAqLw0KPiA+ICsJaXJxX3ZkZF93YXJuID0gcmVn bWFwX2lycV9nZXRfdmlycShjaGlwLT5yZWdtYXBfaXJxLA0KPiA+ICsJCQkJCSAgIERBOTA2Ml9J UlFfVkREX1dBUk4pOw0KPiA+ICsJaWYgKGlycV92ZGRfd2FybiA8IDApIHsNCj4gPiArCQlkZXZf ZXJyKGNoaXAtPmRldiwgIkZhaWxlZCB0byBnZXQgSVJRLlxuIik7DQo+ID4gKwkJcmV0dXJuIGly cV92ZGRfd2FybjsNCj4gPiArCX0NCj4gPiArCWNoaXAtPmlycV92ZGRfd2FybiA9IGlycV92ZGRf d2FybjsNCj4gPiArDQo+ID4gKwlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKGNoaXAt PmRldiwgaXJxX3ZkZF93YXJuLA0KPiA+ICsJCQkJCU5VTEwsIGRhOTA2Ml92ZGRfd2Fybl9ldmVu dCwNCj4gPiArCQkJCQlJUlFGX1RSSUdHRVJfTE9XIHwgSVJRRl9PTkVTSE9ULA0KPiA+ICsJCQkJ CSJWRERfV0FSTiIsIGNoaXApOw0KPiA+ICsJaWYgKHJldCkgew0KPiA+ICsJCWRldl93YXJuKGNo aXAtPmRldiwNCj4gPiArCQkJICJGYWlsZWQgdG8gcmVxdWVzdCBWRERfV0FSTiBJUlEuXG4iKTsN Cj4gPiArCQljaGlwLT5pcnFfdmRkX3dhcm4gPSAtRU5YSU87DQo+ID4gKwl9DQo+IA0KPiBUaGlz IGxvb2tzIGxpa2UgYSBsb3Qgb2YgY29kZSwgd2hpY2ggZG9lc24ndCByZWFsbHkgZG8gYW55dGhp bmcuICBXaGF0DQo+IGlzIGEgVkREIHdhcm5pbmcgaW5kaWNhdG9yIGFueXdheT8NCj4gDQoNCkkg d2lsbCByZW1vdmUgdGhpcy4NCg0KVGhlIElSUSBoYW5kbGVyIGRhOTA2Ml92ZGRfd2Fybl9ldmVu dCgpIC0tIHNlZSBlYXJsaWVyIGFib3ZlIC0tIGRvZXMNCm5vdCBjdXJyZW50bHkgZG8gYW55dGhp bmcgYXBhcnQgZnJvbSBoYW5kbGUgdGhlIElSUSB0aGF0IHdhcyByZXF1ZXN0ZWQNCmhlcmUuIEl0 IHByaW50cyBhIHN0YXRlbWVudCB0byBzYXkgdGhlIG1haW4gUE1JQyB2b2x0YWdlIHN1cHBseSBk cm9wcGVkDQpiZWxvdyBhIGRlZmluZWQgdHJpZ2dlciBwb2ludCwgYnV0IGRvZXNuJ3QgYWN0dWFs bHkgZG8gYW55dGhpbmcgdG8gbWl0aWdhdGUNCnRoaXMgcHJvYmxlbS4NCg0KUHJldmlvdXNseSB0 aGlzIFZERF9XQVJOIHdhcyBpbiB0aGUgcmVndWxhdG9yIGRyaXZlciwgaG93ZXZlciBpdCBzaG91 bGQNCmJlIG1hZGUgYXZhaWxhYmxlIGV2ZW4gaWYgdGhlIHJlZ3VsYXRvciBkcml2ZXIgaXMgbm90 IGluc3RhbGxlZCAtLSBzbyBJIGFkZGVkIGl0DQp0byB0aGUgY29yZSBpbnN0ZWFkLg0KDQpJbiBh IHByZXZpb3VzIGRyaXZlciBzdWJtaXNzaW9uIEkgaGFkIGEgc2ltaWxhciBwcm9ibGVtLCBhIHdh cm5pbmcgSVJRIHdhcw0KanVzdCBwcmludGluZyB0byB0aGUgY29uc29sZSB0byBzYXkgdGhlcmUg d2FzIGFuIGVycm9yIC0tIHRoZSBoYW5kbGVyIGFuZA0KSVJRIGNvZGUgd2FzIHB1dCBpbiBieSBt ZSBzbyBpdCBjb3VsZCBiZSB1c2VkIGlmIHRoZSBkcml2ZXIgd2FzIHRha2VuIGFuZA0KaW50ZWdy YXRlZCBpbnRvIGEgZnVsbHkgd29ya2luZyBzeXN0ZW0uDQoNCkkgd2FzIGFza2VkIHRvIHJlbW92 ZSBpdCBpbiB0aGUgb3RoZXIgZHJpdmVyIC0tIGFuZCBJIGhhdmUgZG9uZSB0aGUgc2FtZQ0KaGVy ZSBmb3Igbm93LiBJIGNhbiBhbHdheXMgYWRkIGl0IGJhY2sgbGF0ZXIuDQoNCj4gPiArCXJldHVy biByZXQ7DQo+ID4gK30NCj4gPiArDQo+ID4gK3ZvaWQgZGE5MDYyX2RldmljZV9leGl0KHN0cnVj dCBkYTkwNjIgKmNoaXApDQo+ID4gK3sNCj4gPiArCW1mZF9yZW1vdmVfZGV2aWNlcyhjaGlwLT5k ZXYpOw0KPiA+ICsJZGE5MDYyX2lycV9leGl0KGNoaXApOw0KPiA+ICt9DQo+IA0KPiBBbm90aGVy IHNlZW1pbmdseSBwb2ludGxlc3MgYWJzdHJhY3Rpb24uICBXaHkgZG9uJ3QgeW91IGRvIHRoaXMg aW4NCj4gcmVtb3ZlKCk/DQo+IA0KDQpXaWxsIGRvIHRoYXQgYXMgcGFydCBvZiB0aGUgYWJzdHJh Y3Rpb24gY2xlYW4gdXANCg0KWy4uLl0NCg0KPiA+ICsNCj4gPiArc3RhdGljIHN0cnVjdCByZWdt YXBfY29uZmlnIGRhOTA2Ml9yZWdtYXBfY29uZmlnID0gew0KPiA+ICsJLnJlZ19iaXRzID0gOCwN Cj4gPiArCS52YWxfYml0cyA9IDgsDQo+ID4gKwkucmFuZ2VzID0gZGE5MDYyX3JhbmdlX2NmZywN Cj4gPiArCS5udW1fcmFuZ2VzID0gQVJSQVlfU0laRShkYTkwNjJfcmFuZ2VfY2ZnKSwNCj4gPiAr CS5tYXhfcmVnaXN0ZXIgPSBEQTkwNjJBQV9DT05GSUdfSUQsDQo+ID4gKwkuY2FjaGVfdHlwZSA9 IFJFR0NBQ0hFX1JCVFJFRSwNCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0YXRpYyBjb25zdCBzdHJ1 Y3Qgb2ZfZGV2aWNlX2lkIGRhOTA2Ml9kdF9pZHNbXSA9IHsNCj4gPiArCXsgLmNvbXBhdGlibGUg PSAiZGxnLGRhOTA2MiIsIH0sDQo+ID4gKwl7IH0NCj4gPiArfTsNCj4gPiArTU9EVUxFX0RFVklD RV9UQUJMRShvZiwgZGE5MDYyX2R0X2lkcyk7DQo+IA0KPiBNb3ZlIHRoaXMganVzdCBhYm92ZSB3 aGVyZSBpdCdzIHRvIGJlIHVzZWQgaS5lLiBkb3duIHRvIHRoZSBib3R0b20uDQo+IA0KDQpXaWxs IG1vdmUgdGhhdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLg0KDQo+ID4gK3N0YXRpYyBpbnQgZGE5 MDYyX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLA0KPiA+ICsJY29uc3Qgc3RydWN0 IGkyY19kZXZpY2VfaWQgKmlkKQ0KPiA+ICt7DQo+ID4gKwlzdHJ1Y3QgZGE5MDYyICpjaGlwOw0K PiA+ICsJaW50IHJldDsNCj4gPiArDQo+ID4gKwljaGlwID0gZGV2bV9remFsbG9jKCZpMmMtPmRl diwgc2l6ZW9mKHN0cnVjdCBkYTkwNjIpLCBHRlBfS0VSTkVMKTsNCj4gDQo+IHNpemVvZigqY2hp cCkNCj4gDQo+ID4gKwlpZiAoY2hpcCA9PSBOVUxMKQ0KPiANCj4gaWYgKCFjaGlwKQ0KDQpXaWxs IGRvIHRoYXQuDQoNCj4gPiArCWRhOTA2Ml9yZWdtYXBfY29uZmlnLnJkX3RhYmxlID0gJmRhOTA2 Ml9hYV9yZWFkYWJsZV90YWJsZTsNCj4gPiArCWRhOTA2Ml9yZWdtYXBfY29uZmlnLndyX3RhYmxl ID0gJmRhOTA2Ml9hYV93cml0ZWFibGVfdGFibGU7DQo+ID4gKwlkYTkwNjJfcmVnbWFwX2NvbmZp Zy52b2xhdGlsZV90YWJsZSA9ICZkYTkwNjJfYWFfdm9sYXRpbGVfdGFibGU7DQo+IA0KPiBXaHkg YXJlIHlvdSBkb2luZyB0aGlzIGhlcmUgaW5zdGVhZCBvZiBpbnNpZGUNCj4gJ3N0cnVjdCByZWdt YXBfY29uZmlnIGRhOTA2Ml9yZWdtYXBfY29uZmlnJyBhYm92ZT8NCj4gDQoNCk9rLi4gSSB3aWxs IGZpeCB0aGF0IHBhcnQgaW50byB0aGUgbWFpbiBzdHJ1Y3R1cmUuDQoNCg0KPiA+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgZGE5MDYyX2kyY19pZFtdID0gew0KPiA+ICsJeyJk YTkwNjIiLCAwfSwNCj4gDQo+IFdoaXRlIHNwYWNlIGRpc2NpcGxpbmUuDQo+IA0KDQpJIGhhdmUg cHV0IHNvbWUgd2hpdGUtc3BhY2VzIGluIHRoZSBjb2RlLg0KSSB0aGluayB0aGlzOg0KDQp7ICJk YTkwNjIiLCAwIH0sDQp7IH0sDQoNClsuLi5dDQoNCj4gDQo+ID4gK01PRFVMRV9ERVNDUklQVElP TigiQ09SRSBkZXZpY2UgZHJpdmVyIGZvciBEaWFsb2cgREE5MDYyIik7DQo+IA0KPiBzL0NPUkUv Q29yZS8NCj4gDQoNClllcy4NCg0KPiA+ICtNT0RVTEVfQVVUSE9SKCJTIFR3aXNzIDxzdHdpc3Mu b3BlbnNvdXJjZUBkaWFzZW1pLmNvbT4iKTsNCj4gDQo+IEZ1bGwgbmFtZXMgcGxlYXNlLg0KPiAN Cg0KT2suIA0KDQpbLi4uXQ0KDQo+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2Rh OTA2Mi9jb3JlLmgNCj4gYi9pbmNsdWRlL2xpbnV4L21mZC9kYTkwNjIvY29yZS5oDQo+ID4gbmV3 IGZpbGUgbW9kZSAxMDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwLi4wYjE3ODkxDQo+ID4gLS0tIC9k ZXYvbnVsbA0KPiA+ICsrKyBiL2luY2x1ZGUvbGludXgvbWZkL2RhOTA2Mi9jb3JlLmgNCj4gPiBA QCAtMCwwICsxLDYyIEBADQo+ID4gKy8qDQo+ID4gKyAqIGNvcmUuaCAtIENPUkUgSCBmb3IgREE5 MDYyDQo+IA0KPiBXaGF0IGRvZXMgdGhpcyBhZGQ/DQo+IA0KDQpSZW1vdmVkIHRoZSB0b3AgbGlu ZSBjb21wbGV0ZWx5DQoNClsuLi5dDQoNCj4gPiArDQo+ID4gK3N0cnVjdCBkYTkwNjIgew0KPiA+ ICsJc3RydWN0IGRldmljZSAqZGV2Ow0KPiA+ICsJdW5zaWduZWQgY2hhciBkZXZpY2VfaWQ7DQo+ ID4gKwl1bnNpZ25lZCBjaGFyIHZhcmlhbnRfbXJjOw0KPiA+ICsJc3RydWN0IHJlZ21hcCAqcmVn bWFwOw0KPiA+ICsJaW50IGNoaXBfaXJxOw0KPiA+ICsJdW5zaWduZWQgaW50IGlycV9iYXNlOw0K PiA+ICsJc3RydWN0IHJlZ21hcF9pcnFfY2hpcF9kYXRhICpyZWdtYXBfaXJxOw0KPiA+ICsJaW50 IGlycV92ZGRfd2FybjsNCj4gPiArfTsNCj4gDQo+IEFyZSBhbGwgb2YgdGhlc2UgdXNlZCBieSBj aGlsZCBkZXZpY2VzPw0KPiANCg0KQWZ0ZXIgSSBkaWQgdGhlIHJlZmFjdG9yaW5nIHdvcmsgZGVz Y3JpYmVkIGFib3ZlLCBJIGNhbiByZW1vdmUgcXVpdGUgYSBmZXcgb2YgdGhlbS4NCg0KdW5zaWdu ZWQgY2hhciBkZXZpY2VfaWQ7DQp1bnNpZ25lZCBjaGFyIHZhcmlhbnRfbXJjOw0KDQpUaGVzZSBh cmUgbm90IGN1cnJlbnRseSB1c2VkIGluIGFueSBjaGlsZCBkZXZpY2UgZHJpdmVycyAtLSBiZWNh dXNlIHRoZXJlIGlzIG9ubHkNCm9uZSBkZXZpY2Ugb2YgdGhpcyB0eXBlLg0KDQppbnQgY2hpcF9p cnE7DQp1bnNpZ25lZCBpbnQgaXJxX2Jhc2U7DQoNClRoZSBjaGlwX2lkIGlzIG5vdyBsb2NhbCB0 byB0aGUgcHJvYmUgYW5kIGNhbiByZXBsYWNlZCB3aXRoIGkyYy0+aXJxIGluIHRoYXQgZnVuY3Rp b24NCkl0J3Mgb25seSB1c2UgaXMgZHVyaW5nIGNsZWFuLXVwIGFuZCBpMmMtPmlycSBjYW4gYmUg dXNlZCB0aGVyZSBhbHNvLg0KaXJxX2Jhc2UgaXMgbG9jYWwgdG8gcHJvYmUoKSBhbHNvLCBzbyBJ IGhhdmUgbWFkZSBpdCBhdXRvbWF0aWMuDQoNCj4gPiArCWludCBpcnFfdmRkX3dhcm47DQoNCkkg aGF2ZSByZW1vdmVkIHRoZSB2ZGRfd2FybiBjYXBhYmlsaXR5IGluIHRoaXMgcGF0Y2guDQoNCj4g PiAraW50IGRhOTA2Ml9kZXZpY2VfaW5pdChzdHJ1Y3QgZGE5MDYyICosIHVuc2lnbmVkIGludCk7 DQo+ID4gK2ludCBkYTkwNjJfaXJxX2luaXQoc3RydWN0IGRhOTA2MiAqKTsNCj4gPiArDQo+ID4g K3ZvaWQgZGE5MDYyX2RldmljZV9leGl0KHN0cnVjdCBkYTkwNjIgKik7DQo+ID4gK3ZvaWQgZGE5 MDYyX2lycV9leGl0KHN0cnVjdCBkYTkwNjIgKik7DQo+IA0KPiBXaHkgYXJlIHRoZXNlIHJlcXVp cmVkPw0KPiANCg0KR29uZS4NCg0KWy4uLl0NCg0KPiA+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xp bnV4L21mZC9kYTkwNjIvcmVnaXN0ZXJzLmgNCj4gYi9pbmNsdWRlL2xpbnV4L21mZC9kYTkwNjIv cmVnaXN0ZXJzLmgNCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiA+IGluZGV4IDAwMDAwMDAu LmQwN2MyYmMNCj4gPiAtLS0gL2Rldi9udWxsDQo+ID4gKysrIGIvaW5jbHVkZS9saW51eC9tZmQv ZGE5MDYyL3JlZ2lzdGVycy5oDQoNClsuLi5dDQoNCj4gPiArLyoNCj4gPiArICogUmVnaXN0ZXJz DQo+ID4gKyAqLw0KPiANCj4gUmVhbGx5PyA7KQ0KPiANCj4gPiArI2RlZmluZSBEQTkwNjJBQV9Q QUdFX0NPTgkJMHgwMDANCj4gPiArI2RlZmluZSBEQTkwNjJBQV9TVEFUVVNfQQkJMHgwMDENCj4g PiArI2RlZmluZSBEQTkwNjJBQV9TVEFUVVNfQgkJMHgwMDINCg0KWy4uLl0NCg0KPiA+ICsNCj4g PiArLyoNCj4gPiArICogQml0IGZpZWxkcw0KPiA+ICsgKi8NCj4gPiArDQo+ID4gKy8qIERBOTA2 MkFBX1BBR0VfQ09OID0gMHgwMDAgKi8NCj4gPiArI2RlZmluZSBEQTkwNjJBQV9QQUdFX1NISUZU CQkwDQo+ID4gKyNkZWZpbmUgREE5MDYyQUFfUEFHRV9NQVNLCQkoMHgzZiA8PCAwKQ0KPiA+ICsj ZGVmaW5lIERBOTA2MkFBX1dSSVRFX01PREVfU0hJRlQJNg0KPiA+ICsjZGVmaW5lIERBOTA2MkFB X1dSSVRFX01PREVfTUFTSwkoMHgwMSA8PCA2KQ0KPiANCj4gRm9yIDEgPDwgWCwgeW91IHNob3Vs ZCB1c2UgQklUKFgpLg0KPiANCg0KRm9yIHRoZSB0d28gY29tbWVudHMgYWJvdmUgIlJlZ2lzdGVy cyIgYW5kICJCaXQgZmllbGRzIiBhbmQgdGhlICgxPDx4KQ0KZGVmaW5pdGlvbnMgLi4uDQoNClRo ZSB3aG9sZSBvZiB0aGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgb3VyIGhh cmR3YXJlIGRlc2lnbmVycw0KSSB3b3VsZCBwcmVmZXIgaXQgaWYgdGhlIHJlZ2lzdGVyIGRlZmlu aXRpb25zIGFuZCBiaXQgZmllbGRzIGFyZSBub3QgYWx0ZXJlZCB1c2luZw0KdGhlICNkZWZpbmUg QklUKG5yKSAoMVVMPDwobnIpKSBtYWNybyBhbmQgdGhlIGNvbW1lbnRzIHJlbW92ZWQgYmVjYXVz ZQ0Kd2UgaGF2ZSBzY3JpcHRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhpcyBmaWxlIGF1 dG9tYXRpY2FsbHkuDQoNCkFsc28gaWYgdGhlIHJlZ2lzdGVyIG1hcCBpcyBldmVyIHVwZGF0ZWQs IHRoZW4gaXQgd2lsbCBiZSBlYXNpZXIgZm9yIG1lIHRvIGRpZmYNCnRoZSBuZXcgZGVsaXZlcmVk IHJlZ2lzdGVyIGFuZCBiaXQgZmllbGQgZGVmaW5pdGlvbnMgd2l0aCB0aGUgb2xkIG9uZS4NCg0K TXkgcHJlZmVyZW5jZSB3b3VsZCBiZSBub3QgdG8gY2hhbmdlIHRoaXMgaGVhZGVyIGZpbGUuDQoN ClsuLi5dDQoNCklmIEkgaGF2ZSBsZWZ0IGFueXRoaW5nIG91dCBwbGVhc2UgbGV0IG1lIGtub3cu DQoNCnJlZ2FyZHMsDQpTdGV2ZQ0K