From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756773AbcLNTtw (ORCPT ); Wed, 14 Dec 2016 14:49:52 -0500 Received: from anholt.net ([50.246.234.109]:52512 "EHLO anholt.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756239AbcLNTrB (ORCPT ); Wed, 14 Dec 2016 14:47:01 -0500 From: Eric Anholt To: Florian Fainelli , Michael Turquette , Stephen Boyd , Rob Herring , Mark Rutland , dri-devel@lists.freedesktop.org, Thierry Reding Cc: linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Stephen Warren , Lee Jones , bcm-kernel-feedback-list@broadcom.com, linux-clk@vger.kernel.org, Eric Anholt Subject: [PATCH 02/11] clk: bcm2835: Register the DSI0/DSI1 pixel clocks. Date: Wed, 14 Dec 2016 11:46:12 -0800 Message-Id: <20161214194621.16499-3-eric@anholt.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20161214194621.16499-1-eric@anholt.net> References: <20161214194621.16499-1-eric@anholt.net> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The DSI pixel clocks are muxed from clocks generated in the analog phy by the DSI driver. In order to set them as parents, we need to do the same name lookup dance on them as we do for our root oscillator. Signed-off-by: Eric Anholt --- .../bindings/clock/brcm,bcm2835-cprman.txt | 15 ++- drivers/clk/bcm/clk-bcm2835.c | 120 ++++++++++++++++++--- include/dt-bindings/clock/bcm2835.h | 2 + 3 files changed, 124 insertions(+), 13 deletions(-) diff --git a/Documentation/devicetree/bindings/clock/brcm,bcm2835-cprman.txt b/Documentation/devicetree/bindings/clock/brcm,bcm2835-cprman.txt index e56a1df3a9d3..dd906db34b32 100644 --- a/Documentation/devicetree/bindings/clock/brcm,bcm2835-cprman.txt +++ b/Documentation/devicetree/bindings/clock/brcm,bcm2835-cprman.txt @@ -16,7 +16,20 @@ Required properties: - #clock-cells: Should be <1>. The permitted clock-specifier values can be found in include/dt-bindings/clock/bcm2835.h - reg: Specifies base physical address and size of the registers -- clocks: The external oscillator clock phandle +- clocks: phandles to the parent clocks used as input to the module, in + the following order: + + - External oscillator + - DSI0 byte clock + - DSI0 DDR2 clock + - DSI0 DDR clock + - DSI1 byte clock + - DSI1 DDR2 clock + - DSI1 DDR clock + + Only external oscillator is required. The DSI clocks may + not be present, in which case their children will be + unusable. Example: diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c index 6641030e8eae..b0a8cd19a30c 100644 --- a/drivers/clk/bcm/clk-bcm2835.c +++ b/drivers/clk/bcm/clk-bcm2835.c @@ -297,11 +297,32 @@ #define LOCK_TIMEOUT_NS 100000000 #define BCM2835_MAX_FB_RATE 1750000000u +/* + * Names of clocks used within the driver that need to be replaced + * with an external parent's name. This array is in the order that + * the clocks node in the DT references external clocks. + */ +static const char *const cprman_parent_names[] = { + "xosc", + "dsi0_byte", + "dsi0_ddr2", + "dsi0_ddr", + "dsi1_byte", + "dsi1_ddr2", + "dsi1_ddr", +}; + struct bcm2835_cprman { struct device *dev; void __iomem *regs; spinlock_t regs_lock; /* spinlock for all clocks */ - const char *osc_name; + + /* + * Real names of cprman clock parents looked up through + * of_clk_get_parent_name(), which will be used in the + * parent_names[] arrays for clock registration. + */ + const char *real_parent_names[ARRAY_SIZE(cprman_parent_names)]; /* Must be last */ struct clk_hw_onecell_data onecell; @@ -905,6 +926,9 @@ static long bcm2835_clock_rate_from_divisor(struct bcm2835_clock *clock, const struct bcm2835_clock_data *data = clock->data; u64 temp; + if (data->int_bits == 0 && data->frac_bits == 0) + return parent_rate; + /* * The divisor is a 12.12 fixed point field, but only some of * the bits are populated in any given clock. @@ -928,7 +952,12 @@ static unsigned long bcm2835_clock_get_rate(struct clk_hw *hw, struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw); struct bcm2835_cprman *cprman = clock->cprman; const struct bcm2835_clock_data *data = clock->data; - u32 div = cprman_read(cprman, data->div_reg); + u32 div; + + if (data->int_bits == 0 && data->frac_bits == 0) + return parent_rate; + + div = cprman_read(cprman, data->div_reg); return bcm2835_clock_rate_from_divisor(clock, parent_rate, div); } @@ -1158,7 +1187,7 @@ static struct clk_hw *bcm2835_register_pll(struct bcm2835_cprman *cprman, memset(&init, 0, sizeof(init)); /* All of the PLLs derive from the external oscillator. */ - init.parent_names = &cprman->osc_name; + init.parent_names = &cprman->real_parent_names[0]; init.num_parents = 1; init.name = data->name; init.ops = &bcm2835_pll_clk_ops; @@ -1244,18 +1273,22 @@ static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman, struct bcm2835_clock *clock; struct clk_init_data init; const char *parents[1 << CM_SRC_BITS]; - size_t i; + size_t i, j; int ret; /* - * Replace our "xosc" references with the oscillator's - * actual name. + * Replace our strings referencing parent clocks with the + * actual clock-output-name of the parent. */ for (i = 0; i < data->num_mux_parents; i++) { - if (strcmp(data->parents[i], "xosc") == 0) - parents[i] = cprman->osc_name; - else - parents[i] = data->parents[i]; + parents[i] = data->parents[i]; + + for (j = 0; j < ARRAY_SIZE(cprman_parent_names); j++) { + if (strcmp(parents[i], cprman_parent_names[j]) == 0) { + parents[i] = cprman->real_parent_names[j]; + break; + } + } } memset(&init, 0, sizeof(init)); @@ -1375,6 +1408,47 @@ static const char *const bcm2835_clock_vpu_parents[] = { __VA_ARGS__) /* + * DSI parent clocks. The DSI byte/DDR/DDR2 clocks come from the DSI + * analog PHY. The _inv variants are generated internally to cprman, + * but we don't use them so they aren't hooked up. + */ +static const char *const bcm2835_clock_dsi0_parents[] = { + "gnd", + "xosc", + "testdebug0", + "testdebug1", + "dsi0_ddr", + "dsi0_ddr_inv", + "dsi0_ddr2", + "dsi0_ddr2_inv", + "dsi0_byte", + "dsi0_byte_inv", +}; + +static const char *const bcm2835_clock_dsi1_parents[] = { + "gnd", + "xosc", + "testdebug0", + "testdebug1", + "dsi1_ddr", + "dsi1_ddr_inv", + "dsi1_ddr2", + "dsi1_ddr2_inv", + "dsi1_byte", + "dsi1_byte_inv", +}; + +#define REGISTER_DSI0_CLK(...) REGISTER_CLK( \ + .num_mux_parents = ARRAY_SIZE(bcm2835_clock_dsi0_parents), \ + .parents = bcm2835_clock_dsi0_parents, \ + __VA_ARGS__) + +#define REGISTER_DSI1_CLK(...) REGISTER_CLK( \ + .num_mux_parents = ARRAY_SIZE(bcm2835_clock_dsi1_parents), \ + .parents = bcm2835_clock_dsi1_parents, \ + __VA_ARGS__) + +/* * the real definition of all the pll, pll_dividers and clocks * these make use of the above REGISTER_* macros */ @@ -1832,6 +1906,18 @@ static const struct bcm2835_clk_desc clk_desc_array[] = { .div_reg = CM_DSI1EDIV, .int_bits = 4, .frac_bits = 8), + [BCM2835_CLOCK_DSI0P] = REGISTER_DSI0_CLK( + .name = "dsi0p", + .ctl_reg = CM_DSI0PCTL, + .div_reg = CM_DSI0PDIV, + .int_bits = 0, + .frac_bits = 0), + [BCM2835_CLOCK_DSI1P] = REGISTER_DSI1_CLK( + .name = "dsi1p", + .ctl_reg = CM_DSI1PCTL, + .div_reg = CM_DSI1PDIV, + .int_bits = 0, + .frac_bits = 0), /* the gates */ @@ -1890,8 +1976,18 @@ static int bcm2835_clk_probe(struct platform_device *pdev) if (IS_ERR(cprman->regs)) return PTR_ERR(cprman->regs); - cprman->osc_name = of_clk_get_parent_name(dev->of_node, 0); - if (!cprman->osc_name) + for (i = 0; i < ARRAY_SIZE(cprman_parent_names); i++) { + cprman->real_parent_names[i] = + of_clk_get_parent_name(dev->of_node, i); + } + /* + * Make sure the external oscillator has been registered. + * + * The other (DSI) clocks are not present on older device + * trees, which we still need to support for backwards + * compatibility. + */ + if (!cprman->real_parent_names[0]) return -ENODEV; platform_set_drvdata(pdev, cprman); diff --git a/include/dt-bindings/clock/bcm2835.h b/include/dt-bindings/clock/bcm2835.h index 360e00cefd35..a0c812b0fa39 100644 --- a/include/dt-bindings/clock/bcm2835.h +++ b/include/dt-bindings/clock/bcm2835.h @@ -64,3 +64,5 @@ #define BCM2835_CLOCK_CAM1 46 #define BCM2835_CLOCK_DSI0E 47 #define BCM2835_CLOCK_DSI1E 48 +#define BCM2835_CLOCK_DSI0P 49 +#define BCM2835_CLOCK_DSI1P 50 -- 2.11.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: eric@anholt.net (Eric Anholt) Date: Wed, 14 Dec 2016 11:46:12 -0800 Subject: [PATCH 02/11] clk: bcm2835: Register the DSI0/DSI1 pixel clocks. In-Reply-To: <20161214194621.16499-1-eric@anholt.net> References: <20161214194621.16499-1-eric@anholt.net> Message-ID: <20161214194621.16499-3-eric@anholt.net> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org The DSI pixel clocks are muxed from clocks generated in the analog phy by the DSI driver. In order to set them as parents, we need to do the same name lookup dance on them as we do for our root oscillator. Signed-off-by: Eric Anholt --- .../bindings/clock/brcm,bcm2835-cprman.txt | 15 ++- drivers/clk/bcm/clk-bcm2835.c | 120 ++++++++++++++++++--- include/dt-bindings/clock/bcm2835.h | 2 + 3 files changed, 124 insertions(+), 13 deletions(-) diff --git a/Documentation/devicetree/bindings/clock/brcm,bcm2835-cprman.txt b/Documentation/devicetree/bindings/clock/brcm,bcm2835-cprman.txt index e56a1df3a9d3..dd906db34b32 100644 --- a/Documentation/devicetree/bindings/clock/brcm,bcm2835-cprman.txt +++ b/Documentation/devicetree/bindings/clock/brcm,bcm2835-cprman.txt @@ -16,7 +16,20 @@ Required properties: - #clock-cells: Should be <1>. The permitted clock-specifier values can be found in include/dt-bindings/clock/bcm2835.h - reg: Specifies base physical address and size of the registers -- clocks: The external oscillator clock phandle +- clocks: phandles to the parent clocks used as input to the module, in + the following order: + + - External oscillator + - DSI0 byte clock + - DSI0 DDR2 clock + - DSI0 DDR clock + - DSI1 byte clock + - DSI1 DDR2 clock + - DSI1 DDR clock + + Only external oscillator is required. The DSI clocks may + not be present, in which case their children will be + unusable. Example: diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c index 6641030e8eae..b0a8cd19a30c 100644 --- a/drivers/clk/bcm/clk-bcm2835.c +++ b/drivers/clk/bcm/clk-bcm2835.c @@ -297,11 +297,32 @@ #define LOCK_TIMEOUT_NS 100000000 #define BCM2835_MAX_FB_RATE 1750000000u +/* + * Names of clocks used within the driver that need to be replaced + * with an external parent's name. This array is in the order that + * the clocks node in the DT references external clocks. + */ +static const char *const cprman_parent_names[] = { + "xosc", + "dsi0_byte", + "dsi0_ddr2", + "dsi0_ddr", + "dsi1_byte", + "dsi1_ddr2", + "dsi1_ddr", +}; + struct bcm2835_cprman { struct device *dev; void __iomem *regs; spinlock_t regs_lock; /* spinlock for all clocks */ - const char *osc_name; + + /* + * Real names of cprman clock parents looked up through + * of_clk_get_parent_name(), which will be used in the + * parent_names[] arrays for clock registration. + */ + const char *real_parent_names[ARRAY_SIZE(cprman_parent_names)]; /* Must be last */ struct clk_hw_onecell_data onecell; @@ -905,6 +926,9 @@ static long bcm2835_clock_rate_from_divisor(struct bcm2835_clock *clock, const struct bcm2835_clock_data *data = clock->data; u64 temp; + if (data->int_bits == 0 && data->frac_bits == 0) + return parent_rate; + /* * The divisor is a 12.12 fixed point field, but only some of * the bits are populated in any given clock. @@ -928,7 +952,12 @@ static unsigned long bcm2835_clock_get_rate(struct clk_hw *hw, struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw); struct bcm2835_cprman *cprman = clock->cprman; const struct bcm2835_clock_data *data = clock->data; - u32 div = cprman_read(cprman, data->div_reg); + u32 div; + + if (data->int_bits == 0 && data->frac_bits == 0) + return parent_rate; + + div = cprman_read(cprman, data->div_reg); return bcm2835_clock_rate_from_divisor(clock, parent_rate, div); } @@ -1158,7 +1187,7 @@ static struct clk_hw *bcm2835_register_pll(struct bcm2835_cprman *cprman, memset(&init, 0, sizeof(init)); /* All of the PLLs derive from the external oscillator. */ - init.parent_names = &cprman->osc_name; + init.parent_names = &cprman->real_parent_names[0]; init.num_parents = 1; init.name = data->name; init.ops = &bcm2835_pll_clk_ops; @@ -1244,18 +1273,22 @@ static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman, struct bcm2835_clock *clock; struct clk_init_data init; const char *parents[1 << CM_SRC_BITS]; - size_t i; + size_t i, j; int ret; /* - * Replace our "xosc" references with the oscillator's - * actual name. + * Replace our strings referencing parent clocks with the + * actual clock-output-name of the parent. */ for (i = 0; i < data->num_mux_parents; i++) { - if (strcmp(data->parents[i], "xosc") == 0) - parents[i] = cprman->osc_name; - else - parents[i] = data->parents[i]; + parents[i] = data->parents[i]; + + for (j = 0; j < ARRAY_SIZE(cprman_parent_names); j++) { + if (strcmp(parents[i], cprman_parent_names[j]) == 0) { + parents[i] = cprman->real_parent_names[j]; + break; + } + } } memset(&init, 0, sizeof(init)); @@ -1375,6 +1408,47 @@ static const char *const bcm2835_clock_vpu_parents[] = { __VA_ARGS__) /* + * DSI parent clocks. The DSI byte/DDR/DDR2 clocks come from the DSI + * analog PHY. The _inv variants are generated internally to cprman, + * but we don't use them so they aren't hooked up. + */ +static const char *const bcm2835_clock_dsi0_parents[] = { + "gnd", + "xosc", + "testdebug0", + "testdebug1", + "dsi0_ddr", + "dsi0_ddr_inv", + "dsi0_ddr2", + "dsi0_ddr2_inv", + "dsi0_byte", + "dsi0_byte_inv", +}; + +static const char *const bcm2835_clock_dsi1_parents[] = { + "gnd", + "xosc", + "testdebug0", + "testdebug1", + "dsi1_ddr", + "dsi1_ddr_inv", + "dsi1_ddr2", + "dsi1_ddr2_inv", + "dsi1_byte", + "dsi1_byte_inv", +}; + +#define REGISTER_DSI0_CLK(...) REGISTER_CLK( \ + .num_mux_parents = ARRAY_SIZE(bcm2835_clock_dsi0_parents), \ + .parents = bcm2835_clock_dsi0_parents, \ + __VA_ARGS__) + +#define REGISTER_DSI1_CLK(...) REGISTER_CLK( \ + .num_mux_parents = ARRAY_SIZE(bcm2835_clock_dsi1_parents), \ + .parents = bcm2835_clock_dsi1_parents, \ + __VA_ARGS__) + +/* * the real definition of all the pll, pll_dividers and clocks * these make use of the above REGISTER_* macros */ @@ -1832,6 +1906,18 @@ static const struct bcm2835_clk_desc clk_desc_array[] = { .div_reg = CM_DSI1EDIV, .int_bits = 4, .frac_bits = 8), + [BCM2835_CLOCK_DSI0P] = REGISTER_DSI0_CLK( + .name = "dsi0p", + .ctl_reg = CM_DSI0PCTL, + .div_reg = CM_DSI0PDIV, + .int_bits = 0, + .frac_bits = 0), + [BCM2835_CLOCK_DSI1P] = REGISTER_DSI1_CLK( + .name = "dsi1p", + .ctl_reg = CM_DSI1PCTL, + .div_reg = CM_DSI1PDIV, + .int_bits = 0, + .frac_bits = 0), /* the gates */ @@ -1890,8 +1976,18 @@ static int bcm2835_clk_probe(struct platform_device *pdev) if (IS_ERR(cprman->regs)) return PTR_ERR(cprman->regs); - cprman->osc_name = of_clk_get_parent_name(dev->of_node, 0); - if (!cprman->osc_name) + for (i = 0; i < ARRAY_SIZE(cprman_parent_names); i++) { + cprman->real_parent_names[i] = + of_clk_get_parent_name(dev->of_node, i); + } + /* + * Make sure the external oscillator has been registered. + * + * The other (DSI) clocks are not present on older device + * trees, which we still need to support for backwards + * compatibility. + */ + if (!cprman->real_parent_names[0]) return -ENODEV; platform_set_drvdata(pdev, cprman); diff --git a/include/dt-bindings/clock/bcm2835.h b/include/dt-bindings/clock/bcm2835.h index 360e00cefd35..a0c812b0fa39 100644 --- a/include/dt-bindings/clock/bcm2835.h +++ b/include/dt-bindings/clock/bcm2835.h @@ -64,3 +64,5 @@ #define BCM2835_CLOCK_CAM1 46 #define BCM2835_CLOCK_DSI0E 47 #define BCM2835_CLOCK_DSI1E 48 +#define BCM2835_CLOCK_DSI0P 49 +#define BCM2835_CLOCK_DSI1P 50 -- 2.11.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Anholt Subject: [PATCH 02/11] clk: bcm2835: Register the DSI0/DSI1 pixel clocks. Date: Wed, 14 Dec 2016 11:46:12 -0800 Message-ID: <20161214194621.16499-3-eric@anholt.net> References: <20161214194621.16499-1-eric@anholt.net> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from anholt.net (anholt.net [50.246.234.109]) by gabe.freedesktop.org (Postfix) with ESMTP id 0779B6E89D for ; Wed, 14 Dec 2016 19:46:33 +0000 (UTC) In-Reply-To: <20161214194621.16499-1-eric@anholt.net> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Florian Fainelli , Michael Turquette , Stephen Boyd , Rob Herring , Mark Rutland , dri-devel@lists.freedesktop.org, Thierry Reding Cc: Stephen Warren , Lee Jones , linux-kernel@vger.kernel.org, bcm-kernel-feedback-list@broadcom.com, linux-rpi-kernel@lists.infradead.org, linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org List-Id: dri-devel@lists.freedesktop.org VGhlIERTSSBwaXhlbCBjbG9ja3MgYXJlIG11eGVkIGZyb20gY2xvY2tzIGdlbmVyYXRlZCBpbiB0 aGUgYW5hbG9nIHBoeQpieSB0aGUgRFNJIGRyaXZlci4gIEluIG9yZGVyIHRvIHNldCB0aGVtIGFz IHBhcmVudHMsIHdlIG5lZWQgdG8gZG8gdGhlCnNhbWUgbmFtZSBsb29rdXAgZGFuY2Ugb24gdGhl bSBhcyB3ZSBkbyBmb3Igb3VyIHJvb3Qgb3NjaWxsYXRvci4KClNpZ25lZC1vZmYtYnk6IEVyaWMg QW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+Ci0tLQogLi4uL2JpbmRpbmdzL2Nsb2NrL2JyY20sYmNt MjgzNS1jcHJtYW4udHh0ICAgICAgICAgfCAgMTUgKystCiBkcml2ZXJzL2Nsay9iY20vY2xrLWJj bTI4MzUuYyAgICAgICAgICAgICAgICAgICAgICB8IDEyMCArKysrKysrKysrKysrKysrKystLS0K IGluY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svYmNtMjgzNS5oICAgICAgICAgICAgICAgIHwgICAy ICsKIDMgZmlsZXMgY2hhbmdlZCwgMTI0IGluc2VydGlvbnMoKyksIDEzIGRlbGV0aW9ucygtKQoK ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9icmNt LGJjbTI4MzUtY3BybWFuLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9j bG9jay9icmNtLGJjbTI4MzUtY3BybWFuLnR4dAppbmRleCBlNTZhMWRmM2E5ZDMuLmRkOTA2ZGIz NGIzMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2Nr L2JyY20sYmNtMjgzNS1jcHJtYW4udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9i aW5kaW5ncy9jbG9jay9icmNtLGJjbTI4MzUtY3BybWFuLnR4dApAQCAtMTYsNyArMTYsMjAgQEAg UmVxdWlyZWQgcHJvcGVydGllczoKIC0gI2Nsb2NrLWNlbGxzOglTaG91bGQgYmUgPDE+LiBUaGUg cGVybWl0dGVkIGNsb2NrLXNwZWNpZmllciB2YWx1ZXMgY2FuIGJlCiAJCSAgZm91bmQgaW4gaW5j bHVkZS9kdC1iaW5kaW5ncy9jbG9jay9iY20yODM1LmgKIC0gcmVnOgkJU3BlY2lmaWVzIGJhc2Ug cGh5c2ljYWwgYWRkcmVzcyBhbmQgc2l6ZSBvZiB0aGUgcmVnaXN0ZXJzCi0tIGNsb2NrczoJVGhl IGV4dGVybmFsIG9zY2lsbGF0b3IgY2xvY2sgcGhhbmRsZQorLSBjbG9ja3M6CXBoYW5kbGVzIHRv IHRoZSBwYXJlbnQgY2xvY2tzIHVzZWQgYXMgaW5wdXQgdG8gdGhlIG1vZHVsZSwgaW4KKwkJICB0 aGUgZm9sbG93aW5nIG9yZGVyOgorCisJCSAgLSBFeHRlcm5hbCBvc2NpbGxhdG9yCisJCSAgLSBE U0kwIGJ5dGUgY2xvY2sKKwkJICAtIERTSTAgRERSMiBjbG9jaworCQkgIC0gRFNJMCBERFIgY2xv Y2sKKwkJICAtIERTSTEgYnl0ZSBjbG9jaworCQkgIC0gRFNJMSBERFIyIGNsb2NrCisJCSAgLSBE U0kxIEREUiBjbG9jaworCisJCSAgT25seSBleHRlcm5hbCBvc2NpbGxhdG9yIGlzIHJlcXVpcmVk LiAgVGhlIERTSSBjbG9ja3MgbWF5CisJCSAgbm90IGJlIHByZXNlbnQsIGluIHdoaWNoIGNhc2Ug dGhlaXIgY2hpbGRyZW4gd2lsbCBiZQorCQkgIHVudXNhYmxlLgogCiBFeGFtcGxlOgogCmRpZmYg LS1naXQgYS9kcml2ZXJzL2Nsay9iY20vY2xrLWJjbTI4MzUuYyBiL2RyaXZlcnMvY2xrL2JjbS9j bGstYmNtMjgzNS5jCmluZGV4IDY2NDEwMzBlOGVhZS4uYjBhOGNkMTlhMzBjIDEwMDY0NAotLS0g YS9kcml2ZXJzL2Nsay9iY20vY2xrLWJjbTI4MzUuYworKysgYi9kcml2ZXJzL2Nsay9iY20vY2xr LWJjbTI4MzUuYwpAQCAtMjk3LDExICsyOTcsMzIgQEAKICNkZWZpbmUgTE9DS19USU1FT1VUX05T CQkxMDAwMDAwMDAKICNkZWZpbmUgQkNNMjgzNV9NQVhfRkJfUkFURQkxNzUwMDAwMDAwdQogCisv KgorICogTmFtZXMgb2YgY2xvY2tzIHVzZWQgd2l0aGluIHRoZSBkcml2ZXIgdGhhdCBuZWVkIHRv IGJlIHJlcGxhY2VkCisgKiB3aXRoIGFuIGV4dGVybmFsIHBhcmVudCdzIG5hbWUuICBUaGlzIGFy cmF5IGlzIGluIHRoZSBvcmRlciB0aGF0CisgKiB0aGUgY2xvY2tzIG5vZGUgaW4gdGhlIERUIHJl ZmVyZW5jZXMgZXh0ZXJuYWwgY2xvY2tzLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qg Y3BybWFuX3BhcmVudF9uYW1lc1tdID0geworCSJ4b3NjIiwKKwkiZHNpMF9ieXRlIiwKKwkiZHNp MF9kZHIyIiwKKwkiZHNpMF9kZHIiLAorCSJkc2kxX2J5dGUiLAorCSJkc2kxX2RkcjIiLAorCSJk c2kxX2RkciIsCit9OworCiBzdHJ1Y3QgYmNtMjgzNV9jcHJtYW4gewogCXN0cnVjdCBkZXZpY2Ug KmRldjsKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CiAJc3BpbmxvY2tfdCByZWdzX2xvY2s7IC8qIHNw aW5sb2NrIGZvciBhbGwgY2xvY2tzICovCi0JY29uc3QgY2hhciAqb3NjX25hbWU7CisKKwkvKgor CSAqIFJlYWwgbmFtZXMgb2YgY3BybWFuIGNsb2NrIHBhcmVudHMgbG9va2VkIHVwIHRocm91Z2gK KwkgKiBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKCksIHdoaWNoIHdpbGwgYmUgdXNlZCBpbiB0aGUK KwkgKiBwYXJlbnRfbmFtZXNbXSBhcnJheXMgZm9yIGNsb2NrIHJlZ2lzdHJhdGlvbi4KKwkgKi8K Kwljb25zdCBjaGFyICpyZWFsX3BhcmVudF9uYW1lc1tBUlJBWV9TSVpFKGNwcm1hbl9wYXJlbnRf bmFtZXMpXTsKIAogCS8qIE11c3QgYmUgbGFzdCAqLwogCXN0cnVjdCBjbGtfaHdfb25lY2VsbF9k YXRhIG9uZWNlbGw7CkBAIC05MDUsNiArOTI2LDkgQEAgc3RhdGljIGxvbmcgYmNtMjgzNV9jbG9j a19yYXRlX2Zyb21fZGl2aXNvcihzdHJ1Y3QgYmNtMjgzNV9jbG9jayAqY2xvY2ssCiAJY29uc3Qg c3RydWN0IGJjbTI4MzVfY2xvY2tfZGF0YSAqZGF0YSA9IGNsb2NrLT5kYXRhOwogCXU2NCB0ZW1w OwogCisJaWYgKGRhdGEtPmludF9iaXRzID09IDAgJiYgZGF0YS0+ZnJhY19iaXRzID09IDApCisJ CXJldHVybiBwYXJlbnRfcmF0ZTsKKwogCS8qCiAJICogVGhlIGRpdmlzb3IgaXMgYSAxMi4xMiBm aXhlZCBwb2ludCBmaWVsZCwgYnV0IG9ubHkgc29tZSBvZgogCSAqIHRoZSBiaXRzIGFyZSBwb3B1 bGF0ZWQgaW4gYW55IGdpdmVuIGNsb2NrLgpAQCAtOTI4LDcgKzk1MiwxMiBAQCBzdGF0aWMgdW5z aWduZWQgbG9uZyBiY20yODM1X2Nsb2NrX2dldF9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAogCXN0 cnVjdCBiY20yODM1X2Nsb2NrICpjbG9jayA9IGJjbTI4MzVfY2xvY2tfZnJvbV9odyhodyk7CiAJ c3RydWN0IGJjbTI4MzVfY3BybWFuICpjcHJtYW4gPSBjbG9jay0+Y3BybWFuOwogCWNvbnN0IHN0 cnVjdCBiY20yODM1X2Nsb2NrX2RhdGEgKmRhdGEgPSBjbG9jay0+ZGF0YTsKLQl1MzIgZGl2ID0g Y3BybWFuX3JlYWQoY3BybWFuLCBkYXRhLT5kaXZfcmVnKTsKKwl1MzIgZGl2OworCisJaWYgKGRh dGEtPmludF9iaXRzID09IDAgJiYgZGF0YS0+ZnJhY19iaXRzID09IDApCisJCXJldHVybiBwYXJl bnRfcmF0ZTsKKworCWRpdiA9IGNwcm1hbl9yZWFkKGNwcm1hbiwgZGF0YS0+ZGl2X3JlZyk7CiAK IAlyZXR1cm4gYmNtMjgzNV9jbG9ja19yYXRlX2Zyb21fZGl2aXNvcihjbG9jaywgcGFyZW50X3Jh dGUsIGRpdik7CiB9CkBAIC0xMTU4LDcgKzExODcsNyBAQCBzdGF0aWMgc3RydWN0IGNsa19odyAq YmNtMjgzNV9yZWdpc3Rlcl9wbGwoc3RydWN0IGJjbTI4MzVfY3BybWFuICpjcHJtYW4sCiAJbWVt c2V0KCZpbml0LCAwLCBzaXplb2YoaW5pdCkpOwogCiAJLyogQWxsIG9mIHRoZSBQTExzIGRlcml2 ZSBmcm9tIHRoZSBleHRlcm5hbCBvc2NpbGxhdG9yLiAqLwotCWluaXQucGFyZW50X25hbWVzID0g JmNwcm1hbi0+b3NjX25hbWU7CisJaW5pdC5wYXJlbnRfbmFtZXMgPSAmY3BybWFuLT5yZWFsX3Bh cmVudF9uYW1lc1swXTsKIAlpbml0Lm51bV9wYXJlbnRzID0gMTsKIAlpbml0Lm5hbWUgPSBkYXRh LT5uYW1lOwogCWluaXQub3BzID0gJmJjbTI4MzVfcGxsX2Nsa19vcHM7CkBAIC0xMjQ0LDE4ICsx MjczLDIyIEBAIHN0YXRpYyBzdHJ1Y3QgY2xrX2h3ICpiY20yODM1X3JlZ2lzdGVyX2Nsb2NrKHN0 cnVjdCBiY20yODM1X2Nwcm1hbiAqY3BybWFuLAogCXN0cnVjdCBiY20yODM1X2Nsb2NrICpjbG9j azsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwogCWNvbnN0IGNoYXIgKnBhcmVudHNbMSA8 PCBDTV9TUkNfQklUU107Ci0Jc2l6ZV90IGk7CisJc2l6ZV90IGksIGo7CiAJaW50IHJldDsKIAog CS8qCi0JICogUmVwbGFjZSBvdXIgInhvc2MiIHJlZmVyZW5jZXMgd2l0aCB0aGUgb3NjaWxsYXRv cidzCi0JICogYWN0dWFsIG5hbWUuCisJICogUmVwbGFjZSBvdXIgc3RyaW5ncyByZWZlcmVuY2lu ZyBwYXJlbnQgY2xvY2tzIHdpdGggdGhlCisJICogYWN0dWFsIGNsb2NrLW91dHB1dC1uYW1lIG9m IHRoZSBwYXJlbnQuCiAJICovCiAJZm9yIChpID0gMDsgaSA8IGRhdGEtPm51bV9tdXhfcGFyZW50 czsgaSsrKSB7Ci0JCWlmIChzdHJjbXAoZGF0YS0+cGFyZW50c1tpXSwgInhvc2MiKSA9PSAwKQot CQkJcGFyZW50c1tpXSA9IGNwcm1hbi0+b3NjX25hbWU7Ci0JCWVsc2UKLQkJCXBhcmVudHNbaV0g PSBkYXRhLT5wYXJlbnRzW2ldOworCQlwYXJlbnRzW2ldID0gZGF0YS0+cGFyZW50c1tpXTsKKwor CQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShjcHJtYW5fcGFyZW50X25hbWVzKTsgaisrKSB7 CisJCQlpZiAoc3RyY21wKHBhcmVudHNbaV0sIGNwcm1hbl9wYXJlbnRfbmFtZXNbal0pID09IDAp IHsKKwkJCQlwYXJlbnRzW2ldID0gY3BybWFuLT5yZWFsX3BhcmVudF9uYW1lc1tqXTsKKwkJCQli cmVhazsKKwkJCX0KKwkJfQogCX0KIAogCW1lbXNldCgmaW5pdCwgMCwgc2l6ZW9mKGluaXQpKTsK QEAgLTEzNzUsNiArMTQwOCw0NyBAQCBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYmNtMjgzNV9j bG9ja192cHVfcGFyZW50c1tdID0gewogCV9fVkFfQVJHU19fKQogCiAvKgorICogRFNJIHBhcmVu dCBjbG9ja3MuICBUaGUgRFNJIGJ5dGUvRERSL0REUjIgY2xvY2tzIGNvbWUgZnJvbSB0aGUgRFNJ CisgKiBhbmFsb2cgUEhZLiAgVGhlIF9pbnYgdmFyaWFudHMgYXJlIGdlbmVyYXRlZCBpbnRlcm5h bGx5IHRvIGNwcm1hbiwKKyAqIGJ1dCB3ZSBkb24ndCB1c2UgdGhlbSBzbyB0aGV5IGFyZW4ndCBo b29rZWQgdXAuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBiY20yODM1X2Nsb2NrX2Rz aTBfcGFyZW50c1tdID0geworCSJnbmQiLAorCSJ4b3NjIiwKKwkidGVzdGRlYnVnMCIsCisJInRl c3RkZWJ1ZzEiLAorCSJkc2kwX2RkciIsCisJImRzaTBfZGRyX2ludiIsCisJImRzaTBfZGRyMiIs CisJImRzaTBfZGRyMl9pbnYiLAorCSJkc2kwX2J5dGUiLAorCSJkc2kwX2J5dGVfaW52IiwKK307 CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBiY20yODM1X2Nsb2NrX2RzaTFfcGFyZW50c1td ID0geworCSJnbmQiLAorCSJ4b3NjIiwKKwkidGVzdGRlYnVnMCIsCisJInRlc3RkZWJ1ZzEiLAor CSJkc2kxX2RkciIsCisJImRzaTFfZGRyX2ludiIsCisJImRzaTFfZGRyMiIsCisJImRzaTFfZGRy Ml9pbnYiLAorCSJkc2kxX2J5dGUiLAorCSJkc2kxX2J5dGVfaW52IiwKK307CisKKyNkZWZpbmUg UkVHSVNURVJfRFNJMF9DTEsoLi4uKQlSRUdJU1RFUl9DTEsoCQkJCVwKKwkubnVtX211eF9wYXJl bnRzID0gQVJSQVlfU0laRShiY20yODM1X2Nsb2NrX2RzaTBfcGFyZW50cyksCVwKKwkucGFyZW50 cyA9IGJjbTI4MzVfY2xvY2tfZHNpMF9wYXJlbnRzLAkJCQlcCisJX19WQV9BUkdTX18pCisKKyNk ZWZpbmUgUkVHSVNURVJfRFNJMV9DTEsoLi4uKQlSRUdJU1RFUl9DTEsoCQkJCVwKKwkubnVtX211 eF9wYXJlbnRzID0gQVJSQVlfU0laRShiY20yODM1X2Nsb2NrX2RzaTFfcGFyZW50cyksCVwKKwku cGFyZW50cyA9IGJjbTI4MzVfY2xvY2tfZHNpMV9wYXJlbnRzLAkJCQlcCisJX19WQV9BUkdTX18p CisKKy8qCiAgKiB0aGUgcmVhbCBkZWZpbml0aW9uIG9mIGFsbCB0aGUgcGxsLCBwbGxfZGl2aWRl cnMgYW5kIGNsb2NrcwogICogdGhlc2UgbWFrZSB1c2Ugb2YgdGhlIGFib3ZlIFJFR0lTVEVSXyog bWFjcm9zCiAgKi8KQEAgLTE4MzIsNiArMTkwNiwxOCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGJj bTI4MzVfY2xrX2Rlc2MgY2xrX2Rlc2NfYXJyYXlbXSA9IHsKIAkJLmRpdl9yZWcgPSBDTV9EU0kx RURJViwKIAkJLmludF9iaXRzID0gNCwKIAkJLmZyYWNfYml0cyA9IDgpLAorCVtCQ00yODM1X0NM T0NLX0RTSTBQXQk9IFJFR0lTVEVSX0RTSTBfQ0xLKAorCQkubmFtZSA9ICJkc2kwcCIsCisJCS5j dGxfcmVnID0gQ01fRFNJMFBDVEwsCisJCS5kaXZfcmVnID0gQ01fRFNJMFBESVYsCisJCS5pbnRf Yml0cyA9IDAsCisJCS5mcmFjX2JpdHMgPSAwKSwKKwlbQkNNMjgzNV9DTE9DS19EU0kxUF0JPSBS RUdJU1RFUl9EU0kxX0NMSygKKwkJLm5hbWUgPSAiZHNpMXAiLAorCQkuY3RsX3JlZyA9IENNX0RT STFQQ1RMLAorCQkuZGl2X3JlZyA9IENNX0RTSTFQRElWLAorCQkuaW50X2JpdHMgPSAwLAorCQku ZnJhY19iaXRzID0gMCksCiAKIAkvKiB0aGUgZ2F0ZXMgKi8KIApAQCAtMTg5MCw4ICsxOTc2LDE4 IEBAIHN0YXRpYyBpbnQgYmNtMjgzNV9jbGtfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldikKIAlpZiAoSVNfRVJSKGNwcm1hbi0+cmVncykpCiAJCXJldHVybiBQVFJfRVJSKGNwcm1h bi0+cmVncyk7CiAKLQljcHJtYW4tPm9zY19uYW1lID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShk ZXYtPm9mX25vZGUsIDApOwotCWlmICghY3BybWFuLT5vc2NfbmFtZSkKKwlmb3IgKGkgPSAwOyBp IDwgQVJSQVlfU0laRShjcHJtYW5fcGFyZW50X25hbWVzKTsgaSsrKSB7CisJCWNwcm1hbi0+cmVh bF9wYXJlbnRfbmFtZXNbaV0gPQorCQkJb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShkZXYtPm9mX25v ZGUsIGkpOworCX0KKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgZXh0ZXJuYWwgb3NjaWxsYXRvciBo YXMgYmVlbiByZWdpc3RlcmVkLgorCSAqCisJICogVGhlIG90aGVyIChEU0kpIGNsb2NrcyBhcmUg bm90IHByZXNlbnQgb24gb2xkZXIgZGV2aWNlCisJICogdHJlZXMsIHdoaWNoIHdlIHN0aWxsIG5l ZWQgdG8gc3VwcG9ydCBmb3IgYmFja3dhcmRzCisJICogY29tcGF0aWJpbGl0eS4KKwkgKi8KKwlp ZiAoIWNwcm1hbi0+cmVhbF9wYXJlbnRfbmFtZXNbMF0pCiAJCXJldHVybiAtRU5PREVWOwogCiAJ cGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY3BybWFuKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUv ZHQtYmluZGluZ3MvY2xvY2svYmNtMjgzNS5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9i Y20yODM1LmgKaW5kZXggMzYwZTAwY2VmZDM1Li5hMGM4MTJiMGZhMzkgMTAwNjQ0Ci0tLSBhL2lu Y2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svYmNtMjgzNS5oCisrKyBiL2luY2x1ZGUvZHQtYmluZGlu Z3MvY2xvY2svYmNtMjgzNS5oCkBAIC02NCwzICs2NCw1IEBACiAjZGVmaW5lIEJDTTI4MzVfQ0xP Q0tfQ0FNMQkJNDYKICNkZWZpbmUgQkNNMjgzNV9DTE9DS19EU0kwRQkJNDcKICNkZWZpbmUgQkNN MjgzNV9DTE9DS19EU0kxRQkJNDgKKyNkZWZpbmUgQkNNMjgzNV9DTE9DS19EU0kwUAkJNDkKKyNk ZWZpbmUgQkNNMjgzNV9DTE9DS19EU0kxUAkJNTAKLS0gCjIuMTEuMAoKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApk cmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Au b3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==