[PATCH] mfd: append subdev into 88pm860x driver
From: Haojian Zhuang <hidden>
Date: 2009-11-16 15:44:37
Subsystem:
multifunction devices (mfd), the rest · Maintainers:
Lee Jones, Linus Torvalds
Append backlight, led & touch subdevs into 88pm860x driver. Signed-off-by: Haojian Zhuang <redacted> --- drivers/mfd/88pm860x-core.c | 207 ++++++++++++++++++++++++++++++++++++++= +--- include/linux/mfd/88pm860x.h | 147 +++++++++++++++++++++++++++++- 2 files changed, 339 insertions(+), 15 deletions(-)
diff --git a/drivers/mfd/88pm860x-core.c b/drivers/mfd/88pm860x-core.c
index cc86089..c34492b 100644
--- a/drivers/mfd/88pm860x-core.c
+++ b/drivers/mfd/88pm860x-core.c@@ -17,6 +17,98 @@ #include <linux/mfd/core.h> #include <linux/mfd/88pm860x.h> +char pm860x_backlight_name[][MFD_NAME_SIZE] =3D { + "backlight-0", + "backlight-1", + "backlight-2", +}; + +char pm860x_led_name[][MFD_NAME_SIZE] =3D { + "led0-red", + "led0-green", + "led0-blue", + "led1-red", + "led1-green", + "led1-blue", +}; + +#define PM8606_BACKLIGHT_RESOURCE(_i, _x) \ +{ \ + .name =3D pm860x_backlight_name[_i], \ + .start =3D PM8606_##_x, \ + .end =3D PM8606_##_x, \ + .flags =3D IORESOURCE_IO, \ +} + +static struct resource backlight_resources[] =3D { + PM8606_BACKLIGHT_RESOURCE(PM8606_BACKLIGHT1, WLED1A), + PM8606_BACKLIGHT_RESOURCE(PM8606_BACKLIGHT2, WLED2A), + PM8606_BACKLIGHT_RESOURCE(PM8606_BACKLIGHT3, WLED3A), +}; + +#define PM8606_BACKLIGHT_DEVS(_i) \ +{ \ + .name =3D "88pm860x-backlight", \ + .num_resources =3D 1, \ + .resources =3D &backlight_resources[_i], \ + .id =3D _i, \ +} + +static struct mfd_cell backlight_devs[] =3D { + PM8606_BACKLIGHT_DEVS(PM8606_BACKLIGHT1), + PM8606_BACKLIGHT_DEVS(PM8606_BACKLIGHT2), + PM8606_BACKLIGHT_DEVS(PM8606_BACKLIGHT3), +}; + +#define PM8606_LED_RESOURCE(_i, _x) \ +{ \ + .name =3D pm860x_led_name[_i], \ + .start =3D PM8606_##_x, \ + .end =3D PM8606_##_x, \ + .flags =3D IORESOURCE_IO, \ +} + +static struct resource led_resources[] =3D { + PM8606_LED_RESOURCE(PM8606_LED1_RED, RGB2B), + PM8606_LED_RESOURCE(PM8606_LED1_GREEN, RGB2C), + PM8606_LED_RESOURCE(PM8606_LED1_BLUE, RGB2D), + PM8606_LED_RESOURCE(PM8606_LED2_RED, RGB1B), + PM8606_LED_RESOURCE(PM8606_LED2_GREEN, RGB1C), + PM8606_LED_RESOURCE(PM8606_LED2_BLUE, RGB1D), +}; + +#define PM8606_LED_DEVS(_i) \ +{ \ + .name =3D "88pm860x-led", \ + .num_resources =3D 1, \ + .resources =3D &led_resources[_i], \ + .id =3D _i, \ +} + +static struct mfd_cell led_devs[] =3D { + PM8606_LED_DEVS(PM8606_LED1_RED), + PM8606_LED_DEVS(PM8606_LED1_GREEN), + PM8606_LED_DEVS(PM8606_LED1_BLUE), + PM8606_LED_DEVS(PM8606_LED2_RED), + PM8606_LED_DEVS(PM8606_LED2_GREEN), + PM8606_LED_DEVS(PM8606_LED2_BLUE), +}; + +static struct resource touch_resources[] =3D { + { + .start =3D PM8607_IRQ_PEN, + .end =3D PM8607_IRQ_PEN, + .flags =3D IORESOURCE_IRQ, + }, +}; + +static struct mfd_cell touch_devs[] =3D { + { + .name =3D "88pm860x-touch", + .num_resources =3D 1, + .resources =3D &touch_resources[0], + }, +}; #define PM8607_REG_RESOURCE(_start, _end) \ { \
@@ -25,7 +117,7 @@ .flags =3D IORESOURCE_IO, \ } -static struct resource pm8607_regulator_resources[] =3D { +static struct resource regulator_resources[] =3D { PM8607_REG_RESOURCE(BUCK1, BUCK1), PM8607_REG_RESOURCE(BUCK2, BUCK2), PM8607_REG_RESOURCE(BUCK3, BUCK3),
@@ -47,10 +139,11 @@ static struct resource pm8607_regulator_resources[] ==3D {
{ \
.name =3D "88pm8607-" #_name, \
.num_resources =3D 1, \
- .resources =3D &pm8607_regulator_resources[PM8607_ID_##_id], \
+ .resources =3D ®ulator_resources[PM8607_ID_##_id], \
+ .id =3D PM8607_ID_##_id, \
}
-static struct mfd_cell pm8607_devs[] =3D {
+static struct mfd_cell regulator_devs[] =3D {
PM8607_REG_DEVS(buck1, BUCK1),
PM8607_REG_DEVS(buck2, BUCK2),
PM8607_REG_DEVS(buck3, BUCK3),@@ -275,6 +368,65 @@ static void __devexit __88pm860x_irq_exit(structpm860x_chip *chip)
free_irq(chip->chip_irq, chip);
}
+static int __devinit __88pm8607_gpadc_init(struct pm860x_chip *chip,
+ struct pm860x_plat_data *pdata)
+{
+ int use_gpadc =3D 0, data, ret;
+
+ /* initialize GPADC without turn on */
+
+ if (pdata && pdata->touch) {
+ /* set GPADC MISC1 register */
+ data =3D 0;
+ if (pdata->touch->gpadc_prebias)
+ data |=3D pdata->touch->gpadc_prebias << 1;
+ if (pdata->touch->slot_cycle)
+ data |=3D pdata->touch->slot_cycle << 3;
+ if (pdata->touch->off_scale)
+ data |=3D pdata->touch->off_scale << 5;
+ if (pdata->touch->sw_cal)
+ data |=3D pdata->touch->sw_cal << 7;
+ if (data) {
+ ret =3D pm860x_reg_write(chip->parent, DESC_8607,
+ PM8607_GPADC_MISC1, data);
+ if (ret < 0)
+ goto out;
+ }
+ /* set tsi prebias time */
+ if (pdata->touch->tsi_prebias) {
+ data =3D pdata->touch->tsi_prebias;
+ ret =3D pm860x_reg_write(chip->parent, DESC_8607,
+ PM8607_TSI_PREBIAS, data);
+ if (ret < 0)
+ goto out;
+ }
+ /* set prebias & prechg time of pen detect */
+ data =3D 0;
+ if (pdata->touch->pen_prebias)
+ data |=3D pdata->touch->pen_prebias;
+ if (pdata->touch->pen_prechg)
+ data |=3D pdata->touch->pen_prechg << 5;
+ if (data) {
+ ret =3D pm860x_reg_write(chip->parent, DESC_8607,
+ PM8607_PD_PREBIAS, data);
+ if (ret < 0)
+ goto out;
+ }
+ =09
+ use_gpadc =3D 1;
+ }
+
+ /* turn on GPADC */
+ if (use_gpadc) {
+ ret =3D pm860x_set_bits(chip->parent, DESC_8607,
+ PM8607_GPADC_MISC1,
+ PM8607_GPADC_EN,
+ PM8607_GPADC_EN);
+ }
+out:
+ return ret;
+}
+
static int __devinit __88pm8606_init(struct pm860x_chip *chip, void *pdata=
)
{
chip->parent =3D &mixed_chip;@@ -337,6 +489,10 @@ static int __devinit __88pm8607_init(structpm860x_chip *chip, } } + ret =3D __88pm8607_gpadc_init(chip, pdata); + if (ret < 0) + goto out; + ret =3D __88pm8607_irq_init(chip, pdata); if (ret < 0) goto out;
@@ -344,9 +500,9 @@ out: return ret; } -int __devinit pm860x_device_init(struct pm860x_chip *chip, void *pdata) +int __devinit pm860x_device_init(struct pm860x_chip *chip, + struct pm860x_plat_data *pdata) { - int i, count; int ret =3D -EINVAL; /* Mixed chip isn't initialized yet. */
@@ -354,23 +510,46 @@ int __devinit pm860x_device_init(structpm860x_chip *chip, void *pdata)
mutex_init(&mixed_chip.io_lock);
if (!strcmp(chip->id.name, "88PM8607")) {
- ret =3D __88pm8607_init(chip, (struct pm860x_plat_data *)pdata);
+ ret =3D __88pm8607_init(chip, pdata);
if (ret < 0)
goto out;
- count =3D ARRAY_SIZE(pm8607_devs);
- for (i =3D 0; i < count; i++) {
- ret =3D mfd_add_devices(chip->dev, i, &pm8607_devs[i],
- 1, NULL, 0);
- if (ret !=3D 0) {
- dev_err(chip->dev, "Failed to add subdevs\n");
- goto out;
- }
+ ret =3D mfd_add_devices(chip->dev, 0, ®ulator_devs[0],
+ ARRAY_SIZE(regulator_devs),
+ ®ulator_resources[0], 0);
+ if (ret < 0)
+ dev_err(chip->dev, "Failed to add regulator subdev\n");
+
+ if (pdata && pdata->touch) {
+ ret =3D mfd_add_devices(chip->dev, 0, &touch_devs[0],
+ ARRAY_SIZE(touch_devs),
+ &touch_resources[0], 0);
+ if (ret < 0)
+ dev_err(chip->dev, "Failed to add touch "
+ "subdev\n");
}
} else if (!strcmp(chip->id.name, "88PM8606")) {
ret =3D __88pm8606_init(chip, pdata);
if (ret < 0)
goto out;
+
+ if (pdata && pdata->backlight) {
+ ret =3D mfd_add_devices(chip->dev, 0, &backlight_devs[0],
+ ARRAY_SIZE(backlight_devs),
+ &backlight_resources[0], 0);
+ if (ret < 0)
+ dev_err(chip->dev, "Failed to add backlight "
+ "subdev\n");
+ }
+
+ if (pdata && pdata->led) {
+ ret =3D mfd_add_devices(chip->dev, 0, &led_devs[0],
+ ARRAY_SIZE(led_devs),
+ &led_resources[0], 0);
+ if (ret < 0)
+ dev_err(chip->dev, "Failed to add led "
+ "subdev\n");
+ }
}
out:
return ret;diff --git a/include/linux/mfd/88pm860x.h b/include/linux/mfd/88pm860x.h
index 99a5a7e..b7f9aac 100644
--- a/include/linux/mfd/88pm860x.h
+++ b/include/linux/mfd/88pm860x.h@@ -14,6 +14,8 @@ #include <linux/interrupt.h> +#define MFD_NAME_SIZE (40) + enum { DESC_INVAL =3D 0, DESC_8606,
@@ -22,6 +24,99 @@ enum { }; enum { + PM8606_ID_INVALID, + PM8606_ID_BACKLIGHT, + PM8606_ID_LED, + PM8606_ID_VIBRATOR, + PM8606_ID_TOUCH, + PM8606_ID_SOUND, + PM8606_ID_CHARGER, + PM8606_ID_MAX, +}; + +enum { + PM8606_BACKLIGHT1 =3D 0, + PM8606_BACKLIGHT2, + PM8606_BACKLIGHT3, +}; + +enum { + PM8606_LED1_RED =3D 0, + PM8606_LED1_GREEN, + PM8606_LED1_BLUE, + PM8606_LED2_RED, + PM8606_LED2_GREEN, + PM8606_LED2_BLUE, + PM8607_LED_VIBRATOR, +}; + + +/* 8606 Registers */ +#define PM8606_DCM_BOOST (0x00) +#define PM8606_PWM (0x01) + +/* Backlight Registers */ +#define PM8606_WLED1A (0x02) +#define PM8606_WLED1B (0x03) +#define PM8606_WLED2A (0x04) +#define PM8606_WLED2B (0x05) +#define PM8606_WLED3A (0x06) +#define PM8606_WLED3B (0x07) + +/* LED Registers */ +#define PM8606_RGB2A (0x08) +#define PM8606_RGB2B (0x09) +#define PM8606_RGB2C (0x0A) +#define PM8606_RGB2D (0x0B) +#define PM8606_RGB1A (0x0C) +#define PM8606_RGB1B (0x0D) +#define PM8606_RGB1C (0x0E) +#define PM8606_RGB1D (0x0F) + +#define PM8606_PREREGULATORA (0x10) +#define PM8606_PREREGULATORB (0x11) +#define PM8606_VIBRATORA (0x12) +#define PM8606_VIBRATORB (0x13) +#define PM8606_VCHG (0x14) +#define PM8606_VSYS (0x15) +#define PM8606_MISC (0x16) +#define PM8606_CHIP_ID (0x17) +#define PM8606_STATUS (0x18) +#define PM8606_FLAGS (0x19) +#define PM8606_PROTECTA (0x1A) +#define PM8606_PROTECTB (0x1B) +#define PM8606_PROTECTC (0x1C) + +/* Bit definitions of PM8606 registers */ +#define PM8606_DCM_500MA (0x0) /* current limit */ +#define PM8606_DCM_750MA (0x1) +#define PM8606_DCM_1000MA (0x2) +#define PM8606_DCM_1250MA (0x3) +#define PM8606_DCM_250MV (0x0 << 2) +#define PM8606_DCM_300MV (0x1 << 2) +#define PM8606_DCM_350MV (0x2 << 2) +#define PM8606_DCM_400MV (0x3 << 2) + +#define PM8606_PWM_31200HZ (0x0) +#define PM8606_PWM_15600HZ (0x1) +#define PM8606_PWM_7800HZ (0x2) +#define PM8606_PWM_3900HZ (0x3) +#define PM8606_PWM_1950HZ (0x4) +#define PM8606_PWM_976HZ (0x5) +#define PM8606_PWM_488HZ (0x6) +#define PM8606_PWM_244HZ (0x7) +#define PM8606_PWM_FREQ_MASK (0x7) + +#define PM8606_WLED_ON (1 << 0) +#define PM8606_WLED_CURRENT(x) ((x & 0x1F) << 1) + +#define PM8606_LED_CURRENT(x) ((x >> 2) & 0x07) + +#define PM8606_VSYS_EN (1 << 1) + +#define PM8606_MISC_OSC_EN (1 << 4) + +enum { PM8607_ID_BUCK1 =3D 0, PM8607_ID_BUCK2, PM8607_ID_BUCK3,
@@ -91,6 +186,21 @@ enum { #define PM8607_SUPPLIES_EN21 (0x33) #define PM8607_SUPPLIES_EN22 (0x34) +/* Vibrator Control Registers */ +#define PM8607_VIBRATOR_SET (0x28) +#define PM8607_VIBRATOR_PWM (0x29) + +/* GPADC Registers */ +#define PM8607_GP_BIAS1 (0x4F) +#define PM8607_MEAS_EN1 (0x50) +#define PM8607_MEAS_EN2 (0x51) +#define PM8607_MEAS_EN3 (0x52) +#define PM8607_MEAS_OFF_TIME1 (0x53) +#define PM8607_MEAS_OFF_TIME2 (0x54) +#define PM8607_TSI_PREBIAS (0x55) /* prebias time */ +#define PM8607_PD_PREBIAS (0x56) /* prebias time */ +#define PM8607_GPADC_MISC1 (0x57) + /* RTC Control Registers */ #define PM8607_RTC1 (0xA0) #define PM8607_RTC_COUNTER1 (0xA1)
@@ -140,6 +250,9 @@ enum { #define PM8607_B0_MISC1_PI2C (1 << 3) #define PM8607_B0_MISC1_RESET (1 << 6) +/* bits definitions of GPADC */ +#define PM8607_GPADC_EN (1 << 0) + /* Interrupt Number in 88PM8607 */ enum { PM8607_IRQ_ONKEY =3D 0,
@@ -213,12 +326,43 @@ enum { PI2C_PORT, }; +struct pm860x_backlight_pdata { + int id; + int pwm; + int iset; + unsigned long flags; +}; + +struct pm860x_led_pdata { + int id; + int iset; + unsigned long flags; +}; + +struct pm860x_touch_pdata { + int gpadc_prebias; + int slot_cycle; + int off_scale; + int sw_cal; + int tsi_prebias; /* time, slot */ + int pen_prebias; /* time, slot */ + int pen_prechg; /* time, slot */ + unsigned long flags; +}; + struct pm860x_plat_data { + struct pm860x_backlight_pdata *backlight; + struct pm860x_led_pdata *led; + struct pm860x_touch_pdata *touch; + int i2c_port; /* Controlled by GI2C or PI2C */ int irq_mode; /* Clear interrupt by read/write (1/0) */ struct regulator_init_data *regulator[PM8607_MAX_REGULATOR]; }; +extern char pm860x_backlight_name[][MFD_NAME_SIZE]; +extern char pm860x_led_name[][MFD_NAME_SIZE]; + extern int pm860x_reg_read(struct mixed_88pm860x *, int, int); extern int pm860x_reg_write(struct mixed_88pm860x *, int, int, unsigned ch=
ar); extern int pm860x_bulk_read(struct mixed_88pm860x *, int, int, int,
@@ -234,7 +378,8 @@ extern int pm860x_request_irq(struct pm860x_chip *, int=, irq_handler_t handler, void *); extern int pm860x_free_irq(struct pm860x_chip *, int); -extern int pm860x_device_init(struct pm860x_chip *chip, void *pdata); +extern int pm860x_device_init(struct pm860x_chip *chip, + struct pm860x_plat_data *pdata); extern void pm860x_device_exit(struct pm860x_chip *chip); #endif /* __LINUX_MFD_88PM860X_H */ --=20 1.5.6.5 --0016363b79840d295204788b4783 Content-Type: text/x-patch; charset=US-ASCII; name="0006-mfd-append-subdev-into-88pm860x-driver.patch" Content-Disposition: attachment; filename="0006-mfd-append-subdev-into-88pm860x-driver.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g24r4kl40 RnJvbSA2MjU5NTZkMTJkNzk4MjlmZjdlZGQ0OTRmZTRmYWVlZDVlYWJjMmJjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIYW9qaWFuIFpodWFuZyA8aGFvamlhbi56aHVhbmdAbWFydmVs bC5jb20+CkRhdGU6IE1vbiwgMTYgTm92IDIwMDkgMTA6NDQ6MzcgLTA1MDAKU3ViamVjdDogW1BB VENIXSBtZmQ6IGFwcGVuZCBzdWJkZXYgaW50byA4OHBtODYweCBkcml2ZXIKCkFwcGVuZCBiYWNr bGlnaHQsIGxlZCAmIHRvdWNoIHN1YmRldnMgaW50byA4OHBtODYweCBkcml2ZXIuCgpTaWduZWQt b2ZmLWJ5OiBIYW9qaWFuIFpodWFuZyA8aGFvamlhbi56aHVhbmdAbWFydmVsbC5jb20+Ci0tLQog ZHJpdmVycy9tZmQvODhwbTg2MHgtY29yZS5jICB8ICAyMDcgKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrLS0tCiBpbmNsdWRlL2xpbnV4L21mZC84OHBtODYweC5oIHwgIDE0 NyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KIDIgZmlsZXMgY2hhbmdlZCwgMzM5IGlu c2VydGlvbnMoKyksIDE1IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkLzg4 cG04NjB4LWNvcmUuYyBiL2RyaXZlcnMvbWZkLzg4cG04NjB4LWNvcmUuYwppbmRleCBjYzg2MDg5 Li5jMzQ0OTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC84OHBtODYweC1jb3JlLmMKKysrIGIv ZHJpdmVycy9tZmQvODhwbTg2MHgtY29yZS5jCkBAIC0xNyw2ICsxNyw5OCBAQAogI2luY2x1ZGUg PGxpbnV4L21mZC9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkLzg4cG04NjB4Lmg+CiAKK2No YXIgcG04NjB4X2JhY2tsaWdodF9uYW1lW11bTUZEX05BTUVfU0laRV0gPSB7CisJImJhY2tsaWdo dC0wIiwKKwkiYmFja2xpZ2h0LTEiLAorCSJiYWNrbGlnaHQtMiIsCit9OworCitjaGFyIHBtODYw eF9sZWRfbmFtZVtdW01GRF9OQU1FX1NJWkVdID0geworCSJsZWQwLXJlZCIsCisJImxlZDAtZ3Jl ZW4iLAorCSJsZWQwLWJsdWUiLAorCSJsZWQxLXJlZCIsCisJImxlZDEtZ3JlZW4iLAorCSJsZWQx LWJsdWUiLAorfTsKKworI2RlZmluZSBQTTg2MDZfQkFDS0xJR0hUX1JFU09VUkNFKF9pLCBfeCkJ CVwKK3sJCQkJCQkJXAorCS5uYW1lCT0gcG04NjB4X2JhY2tsaWdodF9uYW1lW19pXSwJCVwKKwku c3RhcnQJPSBQTTg2MDZfIyNfeCwJCQkJXAorCS5lbmQJPSBQTTg2MDZfIyNfeCwJCQkJXAorCS5m bGFncwk9IElPUkVTT1VSQ0VfSU8sCQkJXAorfQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJh Y2tsaWdodF9yZXNvdXJjZXNbXSA9IHsKKwlQTTg2MDZfQkFDS0xJR0hUX1JFU09VUkNFKFBNODYw Nl9CQUNLTElHSFQxLCBXTEVEMUEpLAorCVBNODYwNl9CQUNLTElHSFRfUkVTT1VSQ0UoUE04NjA2 X0JBQ0tMSUdIVDIsIFdMRUQyQSksCisJUE04NjA2X0JBQ0tMSUdIVF9SRVNPVVJDRShQTTg2MDZf QkFDS0xJR0hUMywgV0xFRDNBKSwKK307CisKKyNkZWZpbmUgUE04NjA2X0JBQ0tMSUdIVF9ERVZT KF9pKQkJCVwKK3sJCQkJCQkJXAorCS5uYW1lCQk9ICI4OHBtODYweC1iYWNrbGlnaHQiLAkJXAor CS5udW1fcmVzb3VyY2VzCT0gMSwJCQkJXAorCS5yZXNvdXJjZXMJPSAmYmFja2xpZ2h0X3Jlc291 cmNlc1tfaV0sCVwKKwkuaWQJCT0gX2ksCQkJCVwKK30KKworc3RhdGljIHN0cnVjdCBtZmRfY2Vs bCBiYWNrbGlnaHRfZGV2c1tdID0geworCVBNODYwNl9CQUNLTElHSFRfREVWUyhQTTg2MDZfQkFD S0xJR0hUMSksCisJUE04NjA2X0JBQ0tMSUdIVF9ERVZTKFBNODYwNl9CQUNLTElHSFQyKSwKKwlQ TTg2MDZfQkFDS0xJR0hUX0RFVlMoUE04NjA2X0JBQ0tMSUdIVDMpLAorfTsKKworI2RlZmluZSBQ TTg2MDZfTEVEX1JFU09VUkNFKF9pLCBfeCkJCQlcCit7CQkJCQkJCVwKKwkubmFtZQk9IHBtODYw eF9sZWRfbmFtZVtfaV0sCQkJXAorCS5zdGFydAk9IFBNODYwNl8jI194LAkJCQlcCisJLmVuZAk9 IFBNODYwNl8jI194LAkJCQlcCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywJCQlcCit9CisKK3N0 YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbGVkX3Jlc291cmNlc1tdID0geworCVBNODYwNl9MRURfUkVT T1VSQ0UoUE04NjA2X0xFRDFfUkVELCBSR0IyQiksCisJUE04NjA2X0xFRF9SRVNPVVJDRShQTTg2 MDZfTEVEMV9HUkVFTiwgUkdCMkMpLAorCVBNODYwNl9MRURfUkVTT1VSQ0UoUE04NjA2X0xFRDFf QkxVRSwgUkdCMkQpLAorCVBNODYwNl9MRURfUkVTT1VSQ0UoUE04NjA2X0xFRDJfUkVELCBSR0Ix QiksCisJUE04NjA2X0xFRF9SRVNPVVJDRShQTTg2MDZfTEVEMl9HUkVFTiwgUkdCMUMpLAorCVBN ODYwNl9MRURfUkVTT1VSQ0UoUE04NjA2X0xFRDJfQkxVRSwgUkdCMUQpLAorfTsKKworI2RlZmlu ZSBQTTg2MDZfTEVEX0RFVlMoX2kpCQkJCVwKK3sJCQkJCQkJXAorCS5uYW1lCQk9ICI4OHBtODYw eC1sZWQiLAkJXAorCS5udW1fcmVzb3VyY2VzCT0gMSwJCQkJXAorCS5yZXNvdXJjZXMJPSAmbGVk X3Jlc291cmNlc1tfaV0sCQlcCisJLmlkCQk9IF9pLAkJCQlcCit9CisKK3N0YXRpYyBzdHJ1Y3Qg bWZkX2NlbGwgbGVkX2RldnNbXSA9IHsKKwlQTTg2MDZfTEVEX0RFVlMoUE04NjA2X0xFRDFfUkVE KSwKKwlQTTg2MDZfTEVEX0RFVlMoUE04NjA2X0xFRDFfR1JFRU4pLAorCVBNODYwNl9MRURfREVW UyhQTTg2MDZfTEVEMV9CTFVFKSwKKwlQTTg2MDZfTEVEX0RFVlMoUE04NjA2X0xFRDJfUkVEKSwK KwlQTTg2MDZfTEVEX0RFVlMoUE04NjA2X0xFRDJfR1JFRU4pLAorCVBNODYwNl9MRURfREVWUyhQ TTg2MDZfTEVEMl9CTFVFKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG91Y2hfcmVz b3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBQTTg2MDdfSVJRX1BFTiwKKwkJLmVuZAk9IFBN ODYwN19JUlFfUEVOLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3Rh dGljIHN0cnVjdCBtZmRfY2VsbCB0b3VjaF9kZXZzW10gPSB7CisJeworCQkubmFtZQkJPSAiODhw bTg2MHgtdG91Y2giLAorCQkubnVtX3Jlc291cmNlcwk9IDEsCisJCS5yZXNvdXJjZXMJPSAmdG91 Y2hfcmVzb3VyY2VzWzBdLAorCX0sCit9OwogCiAjZGVmaW5lIFBNODYwN19SRUdfUkVTT1VSQ0Uo X3N0YXJ0LCBfZW5kKQkJXAogewkJCQkJCQlcCkBAIC0yNSw3ICsxMTcsNyBAQAogCS5mbGFncwk9 IElPUkVTT1VSQ0VfSU8sCQkJXAogfQogCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHBtODYwN19y ZWd1bGF0b3JfcmVzb3VyY2VzW10gPSB7CitzdGF0aWMgc3RydWN0IHJlc291cmNlIHJlZ3VsYXRv cl9yZXNvdXJjZXNbXSA9IHsKIAlQTTg2MDdfUkVHX1JFU09VUkNFKEJVQ0sxLCBCVUNLMSksCiAJ UE04NjA3X1JFR19SRVNPVVJDRShCVUNLMiwgQlVDSzIpLAogCVBNODYwN19SRUdfUkVTT1VSQ0Uo QlVDSzMsIEJVQ0szKSwKQEAgLTQ3LDEwICsxMzksMTEgQEAgc3RhdGljIHN0cnVjdCByZXNvdXJj ZSBwbTg2MDdfcmVndWxhdG9yX3Jlc291cmNlc1tdID0gewogewkJCQkJCQkJCVwKIAkubmFtZQkJ PSAiODhwbTg2MDctIiAjX25hbWUsCQkJCVwKIAkubnVtX3Jlc291cmNlcwk9IDEsCQkJCQkJXAot CS5yZXNvdXJjZXMJPSAmcG04NjA3X3JlZ3VsYXRvcl9yZXNvdXJjZXNbUE04NjA3X0lEXyMjX2lk XSwJXAorCS5yZXNvdXJjZXMJPSAmcmVndWxhdG9yX3Jlc291cmNlc1tQTTg2MDdfSURfIyNfaWRd LAlcCisJLmlkCQk9IFBNODYwN19JRF8jI19pZCwJCQkJXAogfQogCi1zdGF0aWMgc3RydWN0IG1m ZF9jZWxsIHBtODYwN19kZXZzW10gPSB7CitzdGF0aWMgc3RydWN0IG1mZF9jZWxsIHJlZ3VsYXRv cl9kZXZzW10gPSB7CiAJUE04NjA3X1JFR19ERVZTKGJ1Y2sxLCBCVUNLMSksCiAJUE04NjA3X1JF R19ERVZTKGJ1Y2syLCBCVUNLMiksCiAJUE04NjA3X1JFR19ERVZTKGJ1Y2szLCBCVUNLMyksCkBA IC0yNzUsNiArMzY4LDY1IEBAIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBfXzg4cG04NjB4X2lycV9l eGl0KHN0cnVjdCBwbTg2MHhfY2hpcCAqY2hpcCkKIAkJZnJlZV9pcnEoY2hpcC0+Y2hpcF9pcnEs IGNoaXApOwogfQogCitzdGF0aWMgaW50IF9fZGV2aW5pdCBfXzg4cG04NjA3X2dwYWRjX2luaXQo c3RydWN0IHBtODYweF9jaGlwICpjaGlwLAorCQkJCQkgICBzdHJ1Y3QgcG04NjB4X3BsYXRfZGF0 YSAqcGRhdGEpCit7CisJaW50IHVzZV9ncGFkYyA9IDAsIGRhdGEsIHJldDsKKworCS8qIGluaXRp YWxpemUgR1BBREMgd2l0aG91dCB0dXJuIG9uICovCisKKwlpZiAocGRhdGEgJiYgcGRhdGEtPnRv dWNoKSB7CisJCS8qIHNldCBHUEFEQyBNSVNDMSByZWdpc3RlciAqLworCQlkYXRhID0gMDsKKwkJ aWYgKHBkYXRhLT50b3VjaC0+Z3BhZGNfcHJlYmlhcykKKwkJCWRhdGEgfD0gcGRhdGEtPnRvdWNo LT5ncGFkY19wcmViaWFzIDw8IDE7CisJCWlmIChwZGF0YS0+dG91Y2gtPnNsb3RfY3ljbGUpCisJ CQlkYXRhIHw9IHBkYXRhLT50b3VjaC0+c2xvdF9jeWNsZSA8PCAzOworCQlpZiAocGRhdGEtPnRv dWNoLT5vZmZfc2NhbGUpCisJCQlkYXRhIHw9IHBkYXRhLT50b3VjaC0+b2ZmX3NjYWxlIDw8IDU7 CisJCWlmIChwZGF0YS0+dG91Y2gtPnN3X2NhbCkKKwkJCWRhdGEgfD0gcGRhdGEtPnRvdWNoLT5z d19jYWwgPDwgNzsKKwkJaWYgKGRhdGEpIHsKKwkJCXJldCA9IHBtODYweF9yZWdfd3JpdGUoY2hp cC0+cGFyZW50LCBERVNDXzg2MDcsCisJCQkJCQlQTTg2MDdfR1BBRENfTUlTQzEsIGRhdGEpOwor CQkJaWYgKHJldCA8IDApCisJCQkJZ290byBvdXQ7CisJCX0KKwkJLyogc2V0IHRzaSBwcmViaWFz IHRpbWUgKi8KKwkJaWYgKHBkYXRhLT50b3VjaC0+dHNpX3ByZWJpYXMpIHsKKwkJCWRhdGEgPSBw ZGF0YS0+dG91Y2gtPnRzaV9wcmViaWFzOworCQkJcmV0ID0gcG04NjB4X3JlZ193cml0ZShjaGlw LT5wYXJlbnQsIERFU0NfODYwNywKKwkJCQkJCVBNODYwN19UU0lfUFJFQklBUywgZGF0YSk7CisJ CQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQkvKiBzZXQgcHJlYmlhcyAmIHBy ZWNoZyB0aW1lIG9mIHBlbiBkZXRlY3QgKi8KKwkJZGF0YSA9IDA7CisJCWlmIChwZGF0YS0+dG91 Y2gtPnBlbl9wcmViaWFzKQorCQkJZGF0YSB8PSBwZGF0YS0+dG91Y2gtPnBlbl9wcmViaWFzOwor CQlpZiAocGRhdGEtPnRvdWNoLT5wZW5fcHJlY2hnKQorCQkJZGF0YSB8PSBwZGF0YS0+dG91Y2gt PnBlbl9wcmVjaGcgPDwgNTsKKwkJaWYgKGRhdGEpIHsKKwkJCXJldCA9IHBtODYweF9yZWdfd3Jp dGUoY2hpcC0+cGFyZW50LCBERVNDXzg2MDcsCisJCQkJCQlQTTg2MDdfUERfUFJFQklBUywgZGF0 YSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQkKKwkJdXNlX2dwYWRj ID0gMTsKKwl9CisKKwkvKiB0dXJuIG9uIEdQQURDICovCisJaWYgKHVzZV9ncGFkYykgeworCQly ZXQgPSBwbTg2MHhfc2V0X2JpdHMoY2hpcC0+cGFyZW50LCBERVNDXzg2MDcsCisJCQkJCVBNODYw N19HUEFEQ19NSVNDMSwKKwkJCQkJUE04NjA3X0dQQURDX0VOLAorCQkJCQlQTTg2MDdfR1BBRENf RU4pOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBf Xzg4cG04NjA2X2luaXQoc3RydWN0IHBtODYweF9jaGlwICpjaGlwLCB2b2lkICpwZGF0YSkKIHsK IAljaGlwLT5wYXJlbnQgPSAmbWl4ZWRfY2hpcDsKQEAgLTMzNyw2ICs0ODksMTAgQEAgc3RhdGlj IGludCBfX2RldmluaXQgX184OHBtODYwN19pbml0KHN0cnVjdCBwbTg2MHhfY2hpcCAqY2hpcCwK IAkJfQogCX0KIAorCXJldCA9IF9fODhwbTg2MDdfZ3BhZGNfaW5pdChjaGlwLCBwZGF0YSk7CisJ aWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCiAJcmV0ID0gX184OHBtODYwN19pcnFfaW5pdChj aGlwLCBwZGF0YSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwpAQCAtMzQ0LDkgKzUwMCw5 IEBAIG91dDoKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgX19kZXZpbml0IHBtODYweF9kZXZpY2Vf aW5pdChzdHJ1Y3QgcG04NjB4X2NoaXAgKmNoaXAsIHZvaWQgKnBkYXRhKQoraW50IF9fZGV2aW5p dCBwbTg2MHhfZGV2aWNlX2luaXQoc3RydWN0IHBtODYweF9jaGlwICpjaGlwLAorCQkJCSBzdHJ1 Y3QgcG04NjB4X3BsYXRfZGF0YSAqcGRhdGEpCiB7Ci0JaW50IGksIGNvdW50OwogCWludCByZXQg PSAtRUlOVkFMOwogCiAJLyogTWl4ZWQgY2hpcCBpc24ndCBpbml0aWFsaXplZCB5ZXQuICovCkBA IC0zNTQsMjMgKzUxMCw0NiBAQCBpbnQgX19kZXZpbml0IHBtODYweF9kZXZpY2VfaW5pdChzdHJ1 Y3QgcG04NjB4X2NoaXAgKmNoaXAsIHZvaWQgKnBkYXRhKQogCQltdXRleF9pbml0KCZtaXhlZF9j aGlwLmlvX2xvY2spOwogCiAJaWYgKCFzdHJjbXAoY2hpcC0+aWQubmFtZSwgIjg4UE04NjA3Iikp IHsKLQkJcmV0ID0gX184OHBtODYwN19pbml0KGNoaXAsIChzdHJ1Y3QgcG04NjB4X3BsYXRfZGF0 YSAqKXBkYXRhKTsKKwkJcmV0ID0gX184OHBtODYwN19pbml0KGNoaXAsIHBkYXRhKTsKIAkJaWYg KHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAotCQljb3VudCA9IEFSUkFZX1NJWkUocG04NjA3X2Rl dnMpOwotCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJcmV0ID0gbWZkX2FkZF9k ZXZpY2VzKGNoaXAtPmRldiwgaSwgJnBtODYwN19kZXZzW2ldLAotCQkJCQkgICAgICAxLCBOVUxM LCAwKTsKLQkJCWlmIChyZXQgIT0gMCkgewotCQkJCWRldl9lcnIoY2hpcC0+ZGV2LCAiRmFpbGVk IHRvIGFkZCBzdWJkZXZzXG4iKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KKwkJcmV0ID0gbWZkX2Fk ZF9kZXZpY2VzKGNoaXAtPmRldiwgMCwgJnJlZ3VsYXRvcl9kZXZzWzBdLAorCQkJCSAgICAgIEFS UkFZX1NJWkUocmVndWxhdG9yX2RldnMpLAorCQkJCSAgICAgICZyZWd1bGF0b3JfcmVzb3VyY2Vz WzBdLCAwKTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfZXJyKGNoaXAtPmRldiwgIkZhaWxlZCB0 byBhZGQgcmVndWxhdG9yIHN1YmRldlxuIik7CisKKwkJaWYgKHBkYXRhICYmIHBkYXRhLT50b3Vj aCkgeworCQkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKGNoaXAtPmRldiwgMCwgJnRvdWNoX2RldnNb MF0sCisJCQkJCUFSUkFZX1NJWkUodG91Y2hfZGV2cyksCisJCQkJCSZ0b3VjaF9yZXNvdXJjZXNb MF0sIDApOworCQkJaWYgKHJldCA8IDApCisJCQkJZGV2X2VycihjaGlwLT5kZXYsICJGYWlsZWQg dG8gYWRkIHRvdWNoICIKKwkJCQkJInN1YmRldlxuIik7CiAJCX0KIAl9IGVsc2UgaWYgKCFzdHJj bXAoY2hpcC0+aWQubmFtZSwgIjg4UE04NjA2IikpIHsKIAkJcmV0ID0gX184OHBtODYwNl9pbml0 KGNoaXAsIHBkYXRhKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKKworCQlpZiAocGRh dGEgJiYgcGRhdGEtPmJhY2tsaWdodCkgeworCQkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKGNoaXAt PmRldiwgMCwgJmJhY2tsaWdodF9kZXZzWzBdLAorCQkJCQlBUlJBWV9TSVpFKGJhY2tsaWdodF9k ZXZzKSwgCisJCQkJCSZiYWNrbGlnaHRfcmVzb3VyY2VzWzBdLCAwKTsKKwkJCWlmIChyZXQgPCAw KQorCQkJCWRldl9lcnIoY2hpcC0+ZGV2LCAiRmFpbGVkIHRvIGFkZCBiYWNrbGlnaHQgIgorCQkJ CQkic3ViZGV2XG4iKTsKKwkJfQorCisJCWlmIChwZGF0YSAmJiBwZGF0YS0+bGVkKSB7CisJCQly ZXQgPSBtZmRfYWRkX2RldmljZXMoY2hpcC0+ZGV2LCAwLCAmbGVkX2RldnNbMF0sCisJCQkJCUFS UkFZX1NJWkUobGVkX2RldnMpLCAKKwkJCQkJJmxlZF9yZXNvdXJjZXNbMF0sIDApOworCQkJaWYg KHJldCA8IDApCisJCQkJZGV2X2VycihjaGlwLT5kZXYsICJGYWlsZWQgdG8gYWRkIGxlZCAiCisJ CQkJCSJzdWJkZXZcbiIpOworCQl9CiAJfQogb3V0OgogCXJldHVybiByZXQ7CmRpZmYgLS1naXQg YS9pbmNsdWRlL2xpbnV4L21mZC84OHBtODYweC5oIGIvaW5jbHVkZS9saW51eC9tZmQvODhwbTg2 MHguaAppbmRleCA5OWE1YTdlLi5iN2Y5YWFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21m ZC84OHBtODYweC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkLzg4cG04NjB4LmgKQEAgLTE0LDYg KzE0LDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCisjZGVmaW5lIE1GRF9O QU1FX1NJWkUJCSg0MCkKKwogZW51bSB7CiAJREVTQ19JTlZBTCA9IDAsCiAJREVTQ184NjA2LApA QCAtMjIsNiArMjQsOTkgQEAgZW51bSB7CiB9OwogCiBlbnVtIHsKKwlQTTg2MDZfSURfSU5WQUxJ RCwKKwlQTTg2MDZfSURfQkFDS0xJR0hULAorCVBNODYwNl9JRF9MRUQsCisJUE04NjA2X0lEX1ZJ QlJBVE9SLAorCVBNODYwNl9JRF9UT1VDSCwKKwlQTTg2MDZfSURfU09VTkQsCisJUE04NjA2X0lE X0NIQVJHRVIsCisJUE04NjA2X0lEX01BWCwKK307CisKK2VudW0geworCVBNODYwNl9CQUNLTElH SFQxID0gMCwKKwlQTTg2MDZfQkFDS0xJR0hUMiwKKwlQTTg2MDZfQkFDS0xJR0hUMywKK307CisK K2VudW0geworCVBNODYwNl9MRUQxX1JFRCA9IDAsCisJUE04NjA2X0xFRDFfR1JFRU4sCisJUE04 NjA2X0xFRDFfQkxVRSwKKwlQTTg2MDZfTEVEMl9SRUQsCisJUE04NjA2X0xFRDJfR1JFRU4sCisJ UE04NjA2X0xFRDJfQkxVRSwKKwlQTTg2MDdfTEVEX1ZJQlJBVE9SLAorfTsKKworCisvKiA4NjA2 IFJlZ2lzdGVycyAqLworI2RlZmluZSBQTTg2MDZfRENNX0JPT1NUCQkoMHgwMCkKKyNkZWZpbmUg UE04NjA2X1BXTQkJCSgweDAxKQorCisvKiBCYWNrbGlnaHQgUmVnaXN0ZXJzICovCisjZGVmaW5l IFBNODYwNl9XTEVEMUEJCQkoMHgwMikKKyNkZWZpbmUgUE04NjA2X1dMRUQxQgkJCSgweDAzKQor I2RlZmluZSBQTTg2MDZfV0xFRDJBCQkJKDB4MDQpCisjZGVmaW5lIFBNODYwNl9XTEVEMkIJCQko MHgwNSkKKyNkZWZpbmUgUE04NjA2X1dMRUQzQQkJCSgweDA2KQorI2RlZmluZSBQTTg2MDZfV0xF RDNCCQkJKDB4MDcpCisKKy8qIExFRCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUE04NjA2X1JHQjJB CQkJKDB4MDgpCisjZGVmaW5lIFBNODYwNl9SR0IyQgkJCSgweDA5KQorI2RlZmluZSBQTTg2MDZf UkdCMkMJCQkoMHgwQSkKKyNkZWZpbmUgUE04NjA2X1JHQjJECQkJKDB4MEIpCisjZGVmaW5lIFBN ODYwNl9SR0IxQQkJCSgweDBDKQorI2RlZmluZSBQTTg2MDZfUkdCMUIJCQkoMHgwRCkKKyNkZWZp bmUgUE04NjA2X1JHQjFDCQkJKDB4MEUpCisjZGVmaW5lIFBNODYwNl9SR0IxRAkJCSgweDBGKQor CisjZGVmaW5lIFBNODYwNl9QUkVSRUdVTEFUT1JBCQkoMHgxMCkKKyNkZWZpbmUgUE04NjA2X1BS RVJFR1VMQVRPUkIJCSgweDExKQorI2RlZmluZSBQTTg2MDZfVklCUkFUT1JBCQkoMHgxMikKKyNk ZWZpbmUgUE04NjA2X1ZJQlJBVE9SQgkJKDB4MTMpCisjZGVmaW5lIFBNODYwNl9WQ0hHCQkJKDB4 MTQpCisjZGVmaW5lIFBNODYwNl9WU1lTCQkJKDB4MTUpCisjZGVmaW5lIFBNODYwNl9NSVNDCQkJ KDB4MTYpCisjZGVmaW5lIFBNODYwNl9DSElQX0lECQkJKDB4MTcpCisjZGVmaW5lIFBNODYwNl9T VEFUVVMJCQkoMHgxOCkKKyNkZWZpbmUgUE04NjA2X0ZMQUdTCQkJKDB4MTkpCisjZGVmaW5lIFBN ODYwNl9QUk9URUNUQQkJCSgweDFBKQorI2RlZmluZSBQTTg2MDZfUFJPVEVDVEIJCQkoMHgxQikK KyNkZWZpbmUgUE04NjA2X1BST1RFQ1RDCQkJKDB4MUMpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBv ZiBQTTg2MDYgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBNODYwNl9EQ01fNTAwTUEJCSgweDApCS8q IGN1cnJlbnQgbGltaXQgKi8KKyNkZWZpbmUgUE04NjA2X0RDTV83NTBNQQkJKDB4MSkKKyNkZWZp bmUgUE04NjA2X0RDTV8xMDAwTUEJCSgweDIpCisjZGVmaW5lIFBNODYwNl9EQ01fMTI1ME1BCQko MHgzKQorI2RlZmluZSBQTTg2MDZfRENNXzI1ME1WCQkoMHgwIDw8IDIpCisjZGVmaW5lIFBNODYw Nl9EQ01fMzAwTVYJCSgweDEgPDwgMikKKyNkZWZpbmUgUE04NjA2X0RDTV8zNTBNVgkJKDB4MiA8 PCAyKQorI2RlZmluZSBQTTg2MDZfRENNXzQwME1WCQkoMHgzIDw8IDIpCisKKyNkZWZpbmUgUE04 NjA2X1BXTV8zMTIwMEhaCQkoMHgwKQorI2RlZmluZSBQTTg2MDZfUFdNXzE1NjAwSFoJCSgweDEp CisjZGVmaW5lIFBNODYwNl9QV01fNzgwMEhaCQkoMHgyKQorI2RlZmluZSBQTTg2MDZfUFdNXzM5 MDBIWgkJKDB4MykKKyNkZWZpbmUgUE04NjA2X1BXTV8xOTUwSFoJCSgweDQpCisjZGVmaW5lIFBN ODYwNl9QV01fOTc2SFoJCSgweDUpCisjZGVmaW5lIFBNODYwNl9QV01fNDg4SFoJCSgweDYpCisj ZGVmaW5lIFBNODYwNl9QV01fMjQ0SFoJCSgweDcpCisjZGVmaW5lIFBNODYwNl9QV01fRlJFUV9N QVNLCQkoMHg3KQorCisjZGVmaW5lIFBNODYwNl9XTEVEX09OCQkJKDEgPDwgMCkKKyNkZWZpbmUg UE04NjA2X1dMRURfQ1VSUkVOVCh4KQkJKCh4ICYgMHgxRikgPDwgMSkKKworI2RlZmluZSBQTTg2 MDZfTEVEX0NVUlJFTlQoeCkJCSgoeCA+PiAyKSAmIDB4MDcpCisKKyNkZWZpbmUgUE04NjA2X1ZT WVNfRU4JCQkoMSA8PCAxKQorCisjZGVmaW5lIFBNODYwNl9NSVNDX09TQ19FTgkJKDEgPDwgNCkK KworZW51bSB7CiAJUE04NjA3X0lEX0JVQ0sxID0gMCwKIAlQTTg2MDdfSURfQlVDSzIsCiAJUE04 NjA3X0lEX0JVQ0szLApAQCAtOTEsNiArMTg2LDIxIEBAIGVudW0gewogI2RlZmluZSBQTTg2MDdf U1VQUExJRVNfRU4yMQkJKDB4MzMpCiAjZGVmaW5lIFBNODYwN19TVVBQTElFU19FTjIyCQkoMHgz NCkKIAorLyogVmlicmF0b3IgQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUE04NjA3X1ZJ QlJBVE9SX1NFVAkJKDB4MjgpCisjZGVmaW5lIFBNODYwN19WSUJSQVRPUl9QV00JCSgweDI5KQor CisvKiBHUEFEQyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUE04NjA3X0dQX0JJQVMxCQkJKDB4NEYp CisjZGVmaW5lIFBNODYwN19NRUFTX0VOMQkJCSgweDUwKQorI2RlZmluZSBQTTg2MDdfTUVBU19F TjIJCQkoMHg1MSkKKyNkZWZpbmUgUE04NjA3X01FQVNfRU4zCQkJKDB4NTIpCisjZGVmaW5lIFBN ODYwN19NRUFTX09GRl9USU1FMQkJKDB4NTMpCisjZGVmaW5lIFBNODYwN19NRUFTX09GRl9USU1F MgkJKDB4NTQpCisjZGVmaW5lIFBNODYwN19UU0lfUFJFQklBUwkJKDB4NTUpCS8qIHByZWJpYXMg dGltZSAqLworI2RlZmluZSBQTTg2MDdfUERfUFJFQklBUwkJKDB4NTYpCS8qIHByZWJpYXMgdGlt ZSAqLworI2RlZmluZSBQTTg2MDdfR1BBRENfTUlTQzEJCSgweDU3KQorCiAvKiBSVEMgQ29udHJv bCBSZWdpc3RlcnMgKi8KICNkZWZpbmUgUE04NjA3X1JUQzEJCQkoMHhBMCkKICNkZWZpbmUgUE04 NjA3X1JUQ19DT1VOVEVSMQkJKDB4QTEpCkBAIC0xNDAsNiArMjUwLDkgQEAgZW51bSB7CiAjZGVm aW5lIFBNODYwN19CMF9NSVNDMV9QSTJDCQkoMSA8PCAzKQogI2RlZmluZSBQTTg2MDdfQjBfTUlT QzFfUkVTRVQJCSgxIDw8IDYpCiAKKy8qIGJpdHMgZGVmaW5pdGlvbnMgb2YgR1BBREMgKi8KKyNk ZWZpbmUgUE04NjA3X0dQQURDX0VOCQkJKDEgPDwgMCkKKwogLyogSW50ZXJydXB0IE51bWJlciBp biA4OFBNODYwNyAqLwogZW51bSB7CiAJUE04NjA3X0lSUV9PTktFWSA9IDAsCkBAIC0yMTMsMTIg KzMyNiw0MyBAQCBlbnVtIHsKIAlQSTJDX1BPUlQsCiB9OwogCitzdHJ1Y3QgcG04NjB4X2JhY2ts aWdodF9wZGF0YSB7CisJaW50CQlpZDsKKwlpbnQJCXB3bTsKKwlpbnQJCWlzZXQ7CisJdW5zaWdu ZWQgbG9uZwlmbGFnczsKK307CisKK3N0cnVjdCBwbTg2MHhfbGVkX3BkYXRhIHsKKwlpbnQJCWlk OworCWludAkJaXNldDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworfTsKKworc3RydWN0IHBtODYw eF90b3VjaF9wZGF0YSB7CisJaW50CQlncGFkY19wcmViaWFzOworCWludAkJc2xvdF9jeWNsZTsK KwlpbnQJCW9mZl9zY2FsZTsKKwlpbnQJCXN3X2NhbDsKKwlpbnQJCXRzaV9wcmViaWFzOwkvKiB0 aW1lLCBzbG90ICovCisJaW50CQlwZW5fcHJlYmlhczsJLyogdGltZSwgc2xvdCAqLworCWludAkJ cGVuX3ByZWNoZzsJLyogdGltZSwgc2xvdCAqLworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Cit9Owor CiBzdHJ1Y3QgcG04NjB4X3BsYXRfZGF0YSB7CisJc3RydWN0IHBtODYweF9iYWNrbGlnaHRfcGRh dGEJKmJhY2tsaWdodDsKKwlzdHJ1Y3QgcG04NjB4X2xlZF9wZGF0YQkJKmxlZDsKKwlzdHJ1Y3Qg cG04NjB4X3RvdWNoX3BkYXRhCSp0b3VjaDsKKwogCWludAlpMmNfcG9ydDsJLyogQ29udHJvbGxl ZCBieSBHSTJDIG9yIFBJMkMgKi8KIAlpbnQJaXJxX21vZGU7CS8qIENsZWFyIGludGVycnVwdCBi eSByZWFkL3dyaXRlICgxLzApICovCiAJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKnJlZ3Vs YXRvcltQTTg2MDdfTUFYX1JFR1VMQVRPUl07CiB9OwogCitleHRlcm4gY2hhciBwbTg2MHhfYmFj a2xpZ2h0X25hbWVbXVtNRkRfTkFNRV9TSVpFXTsKK2V4dGVybiBjaGFyIHBtODYweF9sZWRfbmFt ZVtdW01GRF9OQU1FX1NJWkVdOworCiBleHRlcm4gaW50IHBtODYweF9yZWdfcmVhZChzdHJ1Y3Qg bWl4ZWRfODhwbTg2MHggKiwgaW50LCBpbnQpOwogZXh0ZXJuIGludCBwbTg2MHhfcmVnX3dyaXRl KHN0cnVjdCBtaXhlZF84OHBtODYweCAqLCBpbnQsIGludCwgdW5zaWduZWQgY2hhcik7CiBleHRl cm4gaW50IHBtODYweF9idWxrX3JlYWQoc3RydWN0IG1peGVkXzg4cG04NjB4ICosIGludCwgaW50 LCBpbnQsCkBAIC0yMzQsNyArMzc4LDggQEAgZXh0ZXJuIGludCBwbTg2MHhfcmVxdWVzdF9pcnEo c3RydWN0IHBtODYweF9jaGlwICosIGludCwKIAkJCSAgICAgIGlycV9oYW5kbGVyX3QgaGFuZGxl ciwgdm9pZCAqKTsKIGV4dGVybiBpbnQgcG04NjB4X2ZyZWVfaXJxKHN0cnVjdCBwbTg2MHhfY2hp cCAqLCBpbnQpOwogCi1leHRlcm4gaW50IHBtODYweF9kZXZpY2VfaW5pdChzdHJ1Y3QgcG04NjB4 X2NoaXAgKmNoaXAsIHZvaWQgKnBkYXRhKTsKK2V4dGVybiBpbnQgcG04NjB4X2RldmljZV9pbml0 KHN0cnVjdCBwbTg2MHhfY2hpcCAqY2hpcCwKKwkJCSAgICAgIHN0cnVjdCBwbTg2MHhfcGxhdF9k YXRhICpwZGF0YSk7CiBleHRlcm4gdm9pZCBwbTg2MHhfZGV2aWNlX2V4aXQoc3RydWN0IHBtODYw eF9jaGlwICpjaGlwKTsKIAogI2VuZGlmIC8qIF9fTElOVVhfTUZEXzg4UE04NjBYX0ggKi8KLS0g CjEuNS42LjUKCg== --0016363b79840d295204788b4783--