From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.6 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 36CC3CA9ED0 for ; Fri, 1 Nov 2019 06:28:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id EF89B208E3 for ; Fri, 1 Nov 2019 06:28:08 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="key not found in DNS" (0-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="hkewl1Kb"; dkim=fail reason="key not found in DNS" (0-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="X3VD1isI" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729943AbfKAG2F (ORCPT ); Fri, 1 Nov 2019 02:28:05 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:45998 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729894AbfKAG2E (ORCPT ); Fri, 1 Nov 2019 02:28:04 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 1C51560DD4; Fri, 1 Nov 2019 06:28:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1572589683; bh=WvjYruTJPKhN0T8fCcVqnyZhH8me5YcEVoLHJ5MpJBo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hkewl1Kb5WzAU4T840dq+1bU4q2LwW6G2jTOA5dhABmxus7AnOSw+3FDlIhbK9dDp Og9yBVj5GCJAQJV9Kr2j/WQ5HlqSJqlOrPfSzbc/qB9N+3PE5lkGdOVhTi9KlYkdTN Heuy5o7CO/11ZEClkV2xDBIOrTJHpvTzM4tsSBnU= Received: from kgunda-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: kgunda@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id D70EB60DB2; Fri, 1 Nov 2019 06:27:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1572589677; bh=WvjYruTJPKhN0T8fCcVqnyZhH8me5YcEVoLHJ5MpJBo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=X3VD1isIqvx+1V3125WD8h2YRHNx+AigtKk3wDLmjkx1uWIq6KWDfqsnBYSWLk+Pe 2TkJf1uLNtfC0NavsZHAlIXDKDSbTkjBojdHRqr7t8XiYKApfSm3xCTei8DRb7iIdB s8l9OPx9TrbBOSA+uGvlHw4SVxmNNSu8TtsBETeo= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org D70EB60DB2 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=kgunda@codeaurora.org From: Kiran Gunda To: bjorn.andersson@linaro.org, jingoohan1@gmail.com, lee.jones@linaro.org, b.zolnierkie@samsung.com, dri-devel@lists.freedesktop.org, daniel.thompson@linaro.org, jacek.anaszewski@gmail.com, pavel@ucw.cz, robh+dt@kernel.org, mark.rutland@arm.com, linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Andy Gross , linux-arm-msm@vger.kernel.org, linux-fbdev@vger.kernel.org Cc: Kiran Gunda Subject: [PATCH V10 4/8] backlight: qcom-wled: Rename PM8941* to WLED3 Date: Fri, 1 Nov 2019 11:57:00 +0530 Message-Id: <1572589624-6095-5-git-send-email-kgunda@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1572589624-6095-1-git-send-email-kgunda@codeaurora.org> References: <1572589624-6095-1-git-send-email-kgunda@codeaurora.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org Rename the PM8941* references as WLED3 to make the driver generic and have WLED support for other PMICs. Also rename "i_boost_limit" and "i_limit" variables to "boost_i_limit" and "string_i_limit" respectively to resemble the corresponding register names. Signed-off-by: Kiran Gunda Reviewed-by: Daniel Thompson Reviewed-by: Bjorn Andersson Acked-by: Pavel Machek --- drivers/video/backlight/qcom-wled.c | 248 ++++++++++++++++++------------------ 1 file changed, 125 insertions(+), 123 deletions(-) diff --git a/drivers/video/backlight/qcom-wled.c b/drivers/video/backlight/qcom-wled.c index 82b8572..f191242 100644 --- a/drivers/video/backlight/qcom-wled.c +++ b/drivers/video/backlight/qcom-wled.c @@ -10,77 +10,79 @@ #include /* From DT binding */ -#define PM8941_WLED_DEFAULT_BRIGHTNESS 2048 +#define WLED_DEFAULT_BRIGHTNESS 2048 -#define PM8941_WLED_REG_VAL_BASE 0x40 -#define PM8941_WLED_REG_VAL_MAX 0xFFF +#define WLED3_SINK_REG_BRIGHT_MAX 0xFFF +#define WLED3_CTRL_REG_VAL_BASE 0x40 -#define PM8941_WLED_REG_MOD_EN 0x46 -#define PM8941_WLED_REG_MOD_EN_BIT BIT(7) -#define PM8941_WLED_REG_MOD_EN_MASK BIT(7) +/* WLED3 control registers */ +#define WLED3_CTRL_REG_MOD_EN 0x46 +#define WLED3_CTRL_REG_MOD_EN_BIT BIT(7) +#define WLED3_CTRL_REG_MOD_EN_MASK BIT(7) -#define PM8941_WLED_REG_SYNC 0x47 -#define PM8941_WLED_REG_SYNC_MASK 0x07 -#define PM8941_WLED_REG_SYNC_LED1 BIT(0) -#define PM8941_WLED_REG_SYNC_LED2 BIT(1) -#define PM8941_WLED_REG_SYNC_LED3 BIT(2) -#define PM8941_WLED_REG_SYNC_ALL 0x07 -#define PM8941_WLED_REG_SYNC_CLEAR 0x00 +#define WLED3_CTRL_REG_FREQ 0x4c +#define WLED3_CTRL_REG_FREQ_MASK 0x0f -#define PM8941_WLED_REG_FREQ 0x4c -#define PM8941_WLED_REG_FREQ_MASK 0x0f +#define WLED3_CTRL_REG_OVP 0x4d +#define WLED3_CTRL_REG_OVP_MASK 0x03 -#define PM8941_WLED_REG_OVP 0x4d -#define PM8941_WLED_REG_OVP_MASK 0x03 +#define WLED3_CTRL_REG_ILIMIT 0x4e +#define WLED3_CTRL_REG_ILIMIT_MASK 0x07 -#define PM8941_WLED_REG_BOOST 0x4e -#define PM8941_WLED_REG_BOOST_MASK 0x07 +/* WLED3 sink registers */ +#define WLED3_SINK_REG_SYNC 0x47 +#define WLED3_SINK_REG_SYNC_MASK 0x07 +#define WLED3_SINK_REG_SYNC_LED1 BIT(0) +#define WLED3_SINK_REG_SYNC_LED2 BIT(1) +#define WLED3_SINK_REG_SYNC_LED3 BIT(2) +#define WLED3_SINK_REG_SYNC_ALL 0x07 +#define WLED3_SINK_REG_SYNC_CLEAR 0x00 -#define PM8941_WLED_REG_SINK 0x4f -#define PM8941_WLED_REG_SINK_MASK 0xe0 -#define PM8941_WLED_REG_SINK_SHFT 0x05 +#define WLED3_SINK_REG_CURR_SINK 0x4f +#define WLED3_SINK_REG_CURR_SINK_MASK 0xe0 +#define WLED3_SINK_REG_CURR_SINK_SHFT 0x05 -/* Per-'string' registers below */ -#define PM8941_WLED_REG_STR_OFFSET 0x10 +/* WLED3 per-'string' registers below */ +#define WLED3_SINK_REG_STR_OFFSET 0x10 -#define PM8941_WLED_REG_STR_MOD_EN_BASE 0x60 -#define PM8941_WLED_REG_STR_MOD_MASK BIT(7) -#define PM8941_WLED_REG_STR_MOD_EN BIT(7) +#define WLED3_SINK_REG_STR_MOD_EN_BASE 0x60 +#define WLED3_SINK_REG_STR_MOD_MASK BIT(7) +#define WLED3_SINK_REG_STR_MOD_EN BIT(7) -#define PM8941_WLED_REG_STR_SCALE_BASE 0x62 -#define PM8941_WLED_REG_STR_SCALE_MASK 0x1f +#define WLED3_SINK_REG_STR_FULL_SCALE_CURR 0x62 +#define WLED3_SINK_REG_STR_FULL_SCALE_CURR_MASK 0x1f -#define PM8941_WLED_REG_STR_MOD_SRC_BASE 0x63 -#define PM8941_WLED_REG_STR_MOD_SRC_MASK 0x01 -#define PM8941_WLED_REG_STR_MOD_SRC_INT 0x00 -#define PM8941_WLED_REG_STR_MOD_SRC_EXT 0x01 +#define WLED3_SINK_REG_STR_MOD_SRC_BASE 0x63 +#define WLED3_SINK_REG_STR_MOD_SRC_MASK 0x01 +#define WLED3_SINK_REG_STR_MOD_SRC_INT 0x00 +#define WLED3_SINK_REG_STR_MOD_SRC_EXT 0x01 -#define PM8941_WLED_REG_STR_CABC_BASE 0x66 -#define PM8941_WLED_REG_STR_CABC_MASK BIT(7) -#define PM8941_WLED_REG_STR_CABC_EN BIT(7) +#define WLED3_SINK_REG_STR_CABC_BASE 0x66 +#define WLED3_SINK_REG_STR_CABC_MASK BIT(7) +#define WLED3_SINK_REG_STR_CABC_EN BIT(7) -struct pm8941_wled_config { - u32 i_boost_limit; +struct wled_config { + u32 boost_i_limit; u32 ovp; u32 switch_freq; u32 num_strings; - u32 i_limit; + u32 string_i_limit; bool cs_out_en; bool ext_gen; bool cabc_en; }; -struct pm8941_wled { +struct wled { const char *name; struct regmap *regmap; u16 addr; - struct pm8941_wled_config cfg; + struct wled_config cfg; }; -static int pm8941_wled_update_status(struct backlight_device *bl) +static int wled_update_status(struct backlight_device *bl) { - struct pm8941_wled *wled = bl_get_data(bl); + struct wled *wled = bl_get_data(bl); u16 val = bl->props.brightness; u8 ctrl = 0; int rc; @@ -92,11 +94,11 @@ static int pm8941_wled_update_status(struct backlight_device *bl) val = 0; if (val != 0) - ctrl = PM8941_WLED_REG_MOD_EN_BIT; + ctrl = WLED3_CTRL_REG_MOD_EN_BIT; rc = regmap_update_bits(wled->regmap, - wled->addr + PM8941_WLED_REG_MOD_EN, - PM8941_WLED_REG_MOD_EN_MASK, ctrl); + wled->addr + WLED3_CTRL_REG_MOD_EN, + WLED3_CTRL_REG_MOD_EN_MASK, ctrl); if (rc) return rc; @@ -104,89 +106,89 @@ static int pm8941_wled_update_status(struct backlight_device *bl) u8 v[2] = { val & 0xff, (val >> 8) & 0xf }; rc = regmap_bulk_write(wled->regmap, - wled->addr + PM8941_WLED_REG_VAL_BASE + 2 * i, + wled->addr + WLED3_CTRL_REG_VAL_BASE + 2 * i, v, 2); if (rc) return rc; } rc = regmap_update_bits(wled->regmap, - wled->addr + PM8941_WLED_REG_SYNC, - PM8941_WLED_REG_SYNC_MASK, PM8941_WLED_REG_SYNC_ALL); + wled->addr + WLED3_SINK_REG_SYNC, + WLED3_SINK_REG_SYNC_MASK, WLED3_SINK_REG_SYNC_ALL); if (rc) return rc; rc = regmap_update_bits(wled->regmap, - wled->addr + PM8941_WLED_REG_SYNC, - PM8941_WLED_REG_SYNC_MASK, PM8941_WLED_REG_SYNC_CLEAR); + wled->addr + WLED3_SINK_REG_SYNC, + WLED3_SINK_REG_SYNC_MASK, WLED3_SINK_REG_SYNC_CLEAR); return rc; } -static int pm8941_wled_setup(struct pm8941_wled *wled) +static int wled_setup(struct wled *wled) { int rc; int i; rc = regmap_update_bits(wled->regmap, - wled->addr + PM8941_WLED_REG_OVP, - PM8941_WLED_REG_OVP_MASK, wled->cfg.ovp); + wled->addr + WLED3_CTRL_REG_OVP, + WLED3_CTRL_REG_OVP_MASK, wled->cfg.ovp); if (rc) return rc; rc = regmap_update_bits(wled->regmap, - wled->addr + PM8941_WLED_REG_BOOST, - PM8941_WLED_REG_BOOST_MASK, wled->cfg.i_boost_limit); + wled->addr + WLED3_CTRL_REG_ILIMIT, + WLED3_CTRL_REG_ILIMIT_MASK, wled->cfg.boost_i_limit); if (rc) return rc; rc = regmap_update_bits(wled->regmap, - wled->addr + PM8941_WLED_REG_FREQ, - PM8941_WLED_REG_FREQ_MASK, wled->cfg.switch_freq); + wled->addr + WLED3_CTRL_REG_FREQ, + WLED3_CTRL_REG_FREQ_MASK, wled->cfg.switch_freq); if (rc) return rc; if (wled->cfg.cs_out_en) { u8 all = (BIT(wled->cfg.num_strings) - 1) - << PM8941_WLED_REG_SINK_SHFT; + << WLED3_SINK_REG_CURR_SINK_SHFT; rc = regmap_update_bits(wled->regmap, - wled->addr + PM8941_WLED_REG_SINK, - PM8941_WLED_REG_SINK_MASK, all); + wled->addr + WLED3_SINK_REG_CURR_SINK, + WLED3_SINK_REG_CURR_SINK_MASK, all); if (rc) return rc; } for (i = 0; i < wled->cfg.num_strings; ++i) { - u16 addr = wled->addr + PM8941_WLED_REG_STR_OFFSET * i; + u16 addr = wled->addr + WLED3_SINK_REG_STR_OFFSET * i; rc = regmap_update_bits(wled->regmap, - addr + PM8941_WLED_REG_STR_MOD_EN_BASE, - PM8941_WLED_REG_STR_MOD_MASK, - PM8941_WLED_REG_STR_MOD_EN); + addr + WLED3_SINK_REG_STR_MOD_EN_BASE, + WLED3_SINK_REG_STR_MOD_MASK, + WLED3_SINK_REG_STR_MOD_EN); if (rc) return rc; if (wled->cfg.ext_gen) { rc = regmap_update_bits(wled->regmap, - addr + PM8941_WLED_REG_STR_MOD_SRC_BASE, - PM8941_WLED_REG_STR_MOD_SRC_MASK, - PM8941_WLED_REG_STR_MOD_SRC_EXT); + addr + WLED3_SINK_REG_STR_MOD_SRC_BASE, + WLED3_SINK_REG_STR_MOD_SRC_MASK, + WLED3_SINK_REG_STR_MOD_SRC_EXT); if (rc) return rc; } rc = regmap_update_bits(wled->regmap, - addr + PM8941_WLED_REG_STR_SCALE_BASE, - PM8941_WLED_REG_STR_SCALE_MASK, - wled->cfg.i_limit); + addr + WLED3_SINK_REG_STR_FULL_SCALE_CURR, + WLED3_SINK_REG_STR_FULL_SCALE_CURR_MASK, + wled->cfg.string_i_limit); if (rc) return rc; rc = regmap_update_bits(wled->regmap, - addr + PM8941_WLED_REG_STR_CABC_BASE, - PM8941_WLED_REG_STR_CABC_MASK, + addr + WLED3_SINK_REG_STR_CABC_BASE, + WLED3_SINK_REG_STR_CABC_MASK, wled->cfg.cabc_en ? - PM8941_WLED_REG_STR_CABC_EN : 0); + WLED3_SINK_REG_STR_CABC_EN : 0); if (rc) return rc; } @@ -194,9 +196,9 @@ static int pm8941_wled_setup(struct pm8941_wled *wled) return 0; } -static const struct pm8941_wled_config pm8941_wled_config_defaults = { - .i_boost_limit = 3, - .i_limit = 20, +static const struct wled_config wled3_config_defaults = { + .boost_i_limit = 3, + .string_i_limit = 20, .ovp = 2, .switch_freq = 5, .num_strings = 0, @@ -205,55 +207,55 @@ static int pm8941_wled_setup(struct pm8941_wled *wled) .cabc_en = false, }; -struct pm8941_wled_var_cfg { +struct wled_var_cfg { const u32 *values; u32 (*fn)(u32); int size; }; -static const u32 pm8941_wled_i_boost_limit_values[] = { +static const u32 wled3_boost_i_limit_values[] = { 105, 385, 525, 805, 980, 1260, 1400, 1680, }; -static const struct pm8941_wled_var_cfg pm8941_wled_i_boost_limit_cfg = { - .values = pm8941_wled_i_boost_limit_values, - .size = ARRAY_SIZE(pm8941_wled_i_boost_limit_values), +static const struct wled_var_cfg wled3_boost_i_limit_cfg = { + .values = wled3_boost_i_limit_values, + .size = ARRAY_SIZE(wled3_boost_i_limit_values), }; -static const u32 pm8941_wled_ovp_values[] = { +static const u32 wled3_ovp_values[] = { 35, 32, 29, 27, }; -static const struct pm8941_wled_var_cfg pm8941_wled_ovp_cfg = { - .values = pm8941_wled_ovp_values, - .size = ARRAY_SIZE(pm8941_wled_ovp_values), +static const struct wled_var_cfg wled3_ovp_cfg = { + .values = wled3_ovp_values, + .size = ARRAY_SIZE(wled3_ovp_values), }; -static u32 pm8941_wled_num_strings_values_fn(u32 idx) +static u32 wled3_num_strings_values_fn(u32 idx) { return idx + 1; } -static const struct pm8941_wled_var_cfg pm8941_wled_num_strings_cfg = { - .fn = pm8941_wled_num_strings_values_fn, +static const struct wled_var_cfg wled3_num_strings_cfg = { + .fn = wled3_num_strings_values_fn, .size = 3, }; -static u32 pm8941_wled_switch_freq_values_fn(u32 idx) +static u32 wled3_switch_freq_values_fn(u32 idx) { return 19200 / (2 * (1 + idx)); } -static const struct pm8941_wled_var_cfg pm8941_wled_switch_freq_cfg = { - .fn = pm8941_wled_switch_freq_values_fn, +static const struct wled_var_cfg wled3_switch_freq_cfg = { + .fn = wled3_switch_freq_values_fn, .size = 16, }; -static const struct pm8941_wled_var_cfg pm8941_wled_i_limit_cfg = { +static const struct wled_var_cfg wled3_string_i_limit_cfg = { .size = 26, }; -static u32 pm8941_wled_values(const struct pm8941_wled_var_cfg *cfg, u32 idx) +static u32 wled3_values(const struct wled_var_cfg *cfg, u32 idx) { if (idx >= cfg->size) return UINT_MAX; @@ -264,9 +266,9 @@ static u32 pm8941_wled_values(const struct pm8941_wled_var_cfg *cfg, u32 idx) return idx; } -static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev) +static int wled_configure(struct wled *wled, struct device *dev) { - struct pm8941_wled_config *cfg = &wled->cfg; + struct wled_config *cfg = &wled->cfg; u32 val; int rc; u32 c; @@ -276,32 +278,32 @@ static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev) const struct { const char *name; u32 *val_ptr; - const struct pm8941_wled_var_cfg *cfg; + const struct wled_var_cfg *cfg; } u32_opts[] = { { "qcom,current-boost-limit", - &cfg->i_boost_limit, - .cfg = &pm8941_wled_i_boost_limit_cfg, + &cfg->boost_i_limit, + .cfg = &wled3_boost_i_limit_cfg, }, { "qcom,current-limit", - &cfg->i_limit, - .cfg = &pm8941_wled_i_limit_cfg, + &cfg->string_i_limit, + .cfg = &wled3_string_i_limit_cfg, }, { "qcom,ovp", &cfg->ovp, - .cfg = &pm8941_wled_ovp_cfg, + .cfg = &wled3_ovp_cfg, }, { "qcom,switching-freq", &cfg->switch_freq, - .cfg = &pm8941_wled_switch_freq_cfg, + .cfg = &wled3_switch_freq_cfg, }, { "qcom,num-strings", &cfg->num_strings, - .cfg = &pm8941_wled_num_strings_cfg, + .cfg = &wled3_num_strings_cfg, }, }; const struct { @@ -324,7 +326,7 @@ static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev) if (rc) wled->name = devm_kasprintf(dev, GFP_KERNEL, "%pOFn", dev->of_node); - *cfg = pm8941_wled_config_defaults; + *cfg = wled3_config_defaults; for (i = 0; i < ARRAY_SIZE(u32_opts); ++i) { rc = of_property_read_u32(dev->of_node, u32_opts[i].name, &val); if (rc == -EINVAL) { @@ -336,7 +338,7 @@ static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev) c = UINT_MAX; for (j = 0; c != val; j++) { - c = pm8941_wled_values(u32_opts[i].cfg, j); + c = wled3_values(u32_opts[i].cfg, j); if (c == UINT_MAX) { dev_err(dev, "invalid value for '%s'\n", u32_opts[i].name); @@ -358,15 +360,15 @@ static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev) return 0; } -static const struct backlight_ops pm8941_wled_ops = { - .update_status = pm8941_wled_update_status, +static const struct backlight_ops wled_ops = { + .update_status = wled_update_status, }; -static int pm8941_wled_probe(struct platform_device *pdev) +static int wled_probe(struct platform_device *pdev) { struct backlight_properties props; struct backlight_device *bl; - struct pm8941_wled *wled; + struct wled *wled; struct regmap *regmap; u32 val; int rc; @@ -383,42 +385,42 @@ static int pm8941_wled_probe(struct platform_device *pdev) wled->regmap = regmap; - rc = pm8941_wled_configure(wled, &pdev->dev); + rc = wled_configure(wled, &pdev->dev); if (rc) return rc; - rc = pm8941_wled_setup(wled); + rc = wled_setup(wled); if (rc) return rc; - val = PM8941_WLED_DEFAULT_BRIGHTNESS; + val = WLED_DEFAULT_BRIGHTNESS; of_property_read_u32(pdev->dev.of_node, "default-brightness", &val); memset(&props, 0, sizeof(struct backlight_properties)); props.type = BACKLIGHT_RAW; props.brightness = val; - props.max_brightness = PM8941_WLED_REG_VAL_MAX; + props.max_brightness = WLED3_SINK_REG_BRIGHT_MAX; bl = devm_backlight_device_register(&pdev->dev, wled->name, &pdev->dev, wled, - &pm8941_wled_ops, &props); + &wled_ops, &props); return PTR_ERR_OR_ZERO(bl); }; -static const struct of_device_id pm8941_wled_match_table[] = { +static const struct of_device_id wled_match_table[] = { { .compatible = "qcom,pm8941-wled" }, {} }; -MODULE_DEVICE_TABLE(of, pm8941_wled_match_table); +MODULE_DEVICE_TABLE(of, wled_match_table); -static struct platform_driver pm8941_wled_driver = { - .probe = pm8941_wled_probe, +static struct platform_driver wled_driver = { + .probe = wled_probe, .driver = { - .name = "pm8941-wled", - .of_match_table = pm8941_wled_match_table, + .name = "qcom,wled", + .of_match_table = wled_match_table, }, }; -module_platform_driver(pm8941_wled_driver); +module_platform_driver(wled_driver); -MODULE_DESCRIPTION("pm8941 wled driver"); +MODULE_DESCRIPTION("Qualcomm WLED driver"); MODULE_LICENSE("GPL v2"); -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kiran Gunda Date: Fri, 01 Nov 2019 06:39:00 +0000 Subject: [PATCH V10 4/8] backlight: qcom-wled: Rename PM8941* to WLED3 Message-Id: <1572589624-6095-5-git-send-email-kgunda@codeaurora.org> List-Id: References: <1572589624-6095-1-git-send-email-kgunda@codeaurora.org> In-Reply-To: <1572589624-6095-1-git-send-email-kgunda@codeaurora.org> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: bjorn.andersson@linaro.org, jingoohan1@gmail.com, lee.jones@linaro.org, b.zolnierkie@samsung.com, dri-devel@lists.freedesktop.org, daniel.thompson@linaro.org, jacek.anaszewski@gmail.com, pavel@ucw.cz, robh+dt@kernel.org, mark.rutland@arm.com, linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Andy Gross , linux-arm-msm@vger.kernel.org, linux-fbdev@vger.kernel.org Cc: Kiran Gunda Rename the PM8941* references as WLED3 to make the driver generic and have WLED support for other PMICs. Also rename "i_boost_limit" and "i_limit" variables to "boost_i_limit" and "string_i_limit" respectively to resemble the corresponding register names. Signed-off-by: Kiran Gunda Reviewed-by: Daniel Thompson Reviewed-by: Bjorn Andersson Acked-by: Pavel Machek --- drivers/video/backlight/qcom-wled.c | 248 ++++++++++++++++++------------------ 1 file changed, 125 insertions(+), 123 deletions(-) diff --git a/drivers/video/backlight/qcom-wled.c b/drivers/video/backlight/qcom-wled.c index 82b8572..f191242 100644 --- a/drivers/video/backlight/qcom-wled.c +++ b/drivers/video/backlight/qcom-wled.c @@ -10,77 +10,79 @@ #include /* From DT binding */ -#define PM8941_WLED_DEFAULT_BRIGHTNESS 2048 +#define WLED_DEFAULT_BRIGHTNESS 2048 -#define PM8941_WLED_REG_VAL_BASE 0x40 -#define PM8941_WLED_REG_VAL_MAX 0xFFF +#define WLED3_SINK_REG_BRIGHT_MAX 0xFFF +#define WLED3_CTRL_REG_VAL_BASE 0x40 -#define PM8941_WLED_REG_MOD_EN 0x46 -#define PM8941_WLED_REG_MOD_EN_BIT BIT(7) -#define PM8941_WLED_REG_MOD_EN_MASK BIT(7) +/* WLED3 control registers */ +#define WLED3_CTRL_REG_MOD_EN 0x46 +#define WLED3_CTRL_REG_MOD_EN_BIT BIT(7) +#define WLED3_CTRL_REG_MOD_EN_MASK BIT(7) -#define PM8941_WLED_REG_SYNC 0x47 -#define PM8941_WLED_REG_SYNC_MASK 0x07 -#define PM8941_WLED_REG_SYNC_LED1 BIT(0) -#define PM8941_WLED_REG_SYNC_LED2 BIT(1) -#define PM8941_WLED_REG_SYNC_LED3 BIT(2) -#define PM8941_WLED_REG_SYNC_ALL 0x07 -#define PM8941_WLED_REG_SYNC_CLEAR 0x00 +#define WLED3_CTRL_REG_FREQ 0x4c +#define WLED3_CTRL_REG_FREQ_MASK 0x0f -#define PM8941_WLED_REG_FREQ 0x4c -#define PM8941_WLED_REG_FREQ_MASK 0x0f +#define WLED3_CTRL_REG_OVP 0x4d +#define WLED3_CTRL_REG_OVP_MASK 0x03 -#define PM8941_WLED_REG_OVP 0x4d -#define PM8941_WLED_REG_OVP_MASK 0x03 +#define WLED3_CTRL_REG_ILIMIT 0x4e +#define WLED3_CTRL_REG_ILIMIT_MASK 0x07 -#define PM8941_WLED_REG_BOOST 0x4e -#define PM8941_WLED_REG_BOOST_MASK 0x07 +/* WLED3 sink registers */ +#define WLED3_SINK_REG_SYNC 0x47 +#define WLED3_SINK_REG_SYNC_MASK 0x07 +#define WLED3_SINK_REG_SYNC_LED1 BIT(0) +#define WLED3_SINK_REG_SYNC_LED2 BIT(1) +#define WLED3_SINK_REG_SYNC_LED3 BIT(2) +#define WLED3_SINK_REG_SYNC_ALL 0x07 +#define WLED3_SINK_REG_SYNC_CLEAR 0x00 -#define PM8941_WLED_REG_SINK 0x4f -#define PM8941_WLED_REG_SINK_MASK 0xe0 -#define PM8941_WLED_REG_SINK_SHFT 0x05 +#define WLED3_SINK_REG_CURR_SINK 0x4f +#define WLED3_SINK_REG_CURR_SINK_MASK 0xe0 +#define WLED3_SINK_REG_CURR_SINK_SHFT 0x05 -/* Per-'string' registers below */ -#define PM8941_WLED_REG_STR_OFFSET 0x10 +/* WLED3 per-'string' registers below */ +#define WLED3_SINK_REG_STR_OFFSET 0x10 -#define PM8941_WLED_REG_STR_MOD_EN_BASE 0x60 -#define PM8941_WLED_REG_STR_MOD_MASK BIT(7) -#define PM8941_WLED_REG_STR_MOD_EN BIT(7) +#define WLED3_SINK_REG_STR_MOD_EN_BASE 0x60 +#define WLED3_SINK_REG_STR_MOD_MASK BIT(7) +#define WLED3_SINK_REG_STR_MOD_EN BIT(7) -#define PM8941_WLED_REG_STR_SCALE_BASE 0x62 -#define PM8941_WLED_REG_STR_SCALE_MASK 0x1f +#define WLED3_SINK_REG_STR_FULL_SCALE_CURR 0x62 +#define WLED3_SINK_REG_STR_FULL_SCALE_CURR_MASK 0x1f -#define PM8941_WLED_REG_STR_MOD_SRC_BASE 0x63 -#define PM8941_WLED_REG_STR_MOD_SRC_MASK 0x01 -#define PM8941_WLED_REG_STR_MOD_SRC_INT 0x00 -#define PM8941_WLED_REG_STR_MOD_SRC_EXT 0x01 +#define WLED3_SINK_REG_STR_MOD_SRC_BASE 0x63 +#define WLED3_SINK_REG_STR_MOD_SRC_MASK 0x01 +#define WLED3_SINK_REG_STR_MOD_SRC_INT 0x00 +#define WLED3_SINK_REG_STR_MOD_SRC_EXT 0x01 -#define PM8941_WLED_REG_STR_CABC_BASE 0x66 -#define PM8941_WLED_REG_STR_CABC_MASK BIT(7) -#define PM8941_WLED_REG_STR_CABC_EN BIT(7) +#define WLED3_SINK_REG_STR_CABC_BASE 0x66 +#define WLED3_SINK_REG_STR_CABC_MASK BIT(7) +#define WLED3_SINK_REG_STR_CABC_EN BIT(7) -struct pm8941_wled_config { - u32 i_boost_limit; +struct wled_config { + u32 boost_i_limit; u32 ovp; u32 switch_freq; u32 num_strings; - u32 i_limit; + u32 string_i_limit; bool cs_out_en; bool ext_gen; bool cabc_en; }; -struct pm8941_wled { +struct wled { const char *name; struct regmap *regmap; u16 addr; - struct pm8941_wled_config cfg; + struct wled_config cfg; }; -static int pm8941_wled_update_status(struct backlight_device *bl) +static int wled_update_status(struct backlight_device *bl) { - struct pm8941_wled *wled = bl_get_data(bl); + struct wled *wled = bl_get_data(bl); u16 val = bl->props.brightness; u8 ctrl = 0; int rc; @@ -92,11 +94,11 @@ static int pm8941_wled_update_status(struct backlight_device *bl) val = 0; if (val != 0) - ctrl = PM8941_WLED_REG_MOD_EN_BIT; + ctrl = WLED3_CTRL_REG_MOD_EN_BIT; rc = regmap_update_bits(wled->regmap, - wled->addr + PM8941_WLED_REG_MOD_EN, - PM8941_WLED_REG_MOD_EN_MASK, ctrl); + wled->addr + WLED3_CTRL_REG_MOD_EN, + WLED3_CTRL_REG_MOD_EN_MASK, ctrl); if (rc) return rc; @@ -104,89 +106,89 @@ static int pm8941_wled_update_status(struct backlight_device *bl) u8 v[2] = { val & 0xff, (val >> 8) & 0xf }; rc = regmap_bulk_write(wled->regmap, - wled->addr + PM8941_WLED_REG_VAL_BASE + 2 * i, + wled->addr + WLED3_CTRL_REG_VAL_BASE + 2 * i, v, 2); if (rc) return rc; } rc = regmap_update_bits(wled->regmap, - wled->addr + PM8941_WLED_REG_SYNC, - PM8941_WLED_REG_SYNC_MASK, PM8941_WLED_REG_SYNC_ALL); + wled->addr + WLED3_SINK_REG_SYNC, + WLED3_SINK_REG_SYNC_MASK, WLED3_SINK_REG_SYNC_ALL); if (rc) return rc; rc = regmap_update_bits(wled->regmap, - wled->addr + PM8941_WLED_REG_SYNC, - PM8941_WLED_REG_SYNC_MASK, PM8941_WLED_REG_SYNC_CLEAR); + wled->addr + WLED3_SINK_REG_SYNC, + WLED3_SINK_REG_SYNC_MASK, WLED3_SINK_REG_SYNC_CLEAR); return rc; } -static int pm8941_wled_setup(struct pm8941_wled *wled) +static int wled_setup(struct wled *wled) { int rc; int i; rc = regmap_update_bits(wled->regmap, - wled->addr + PM8941_WLED_REG_OVP, - PM8941_WLED_REG_OVP_MASK, wled->cfg.ovp); + wled->addr + WLED3_CTRL_REG_OVP, + WLED3_CTRL_REG_OVP_MASK, wled->cfg.ovp); if (rc) return rc; rc = regmap_update_bits(wled->regmap, - wled->addr + PM8941_WLED_REG_BOOST, - PM8941_WLED_REG_BOOST_MASK, wled->cfg.i_boost_limit); + wled->addr + WLED3_CTRL_REG_ILIMIT, + WLED3_CTRL_REG_ILIMIT_MASK, wled->cfg.boost_i_limit); if (rc) return rc; rc = regmap_update_bits(wled->regmap, - wled->addr + PM8941_WLED_REG_FREQ, - PM8941_WLED_REG_FREQ_MASK, wled->cfg.switch_freq); + wled->addr + WLED3_CTRL_REG_FREQ, + WLED3_CTRL_REG_FREQ_MASK, wled->cfg.switch_freq); if (rc) return rc; if (wled->cfg.cs_out_en) { u8 all = (BIT(wled->cfg.num_strings) - 1) - << PM8941_WLED_REG_SINK_SHFT; + << WLED3_SINK_REG_CURR_SINK_SHFT; rc = regmap_update_bits(wled->regmap, - wled->addr + PM8941_WLED_REG_SINK, - PM8941_WLED_REG_SINK_MASK, all); + wled->addr + WLED3_SINK_REG_CURR_SINK, + WLED3_SINK_REG_CURR_SINK_MASK, all); if (rc) return rc; } for (i = 0; i < wled->cfg.num_strings; ++i) { - u16 addr = wled->addr + PM8941_WLED_REG_STR_OFFSET * i; + u16 addr = wled->addr + WLED3_SINK_REG_STR_OFFSET * i; rc = regmap_update_bits(wled->regmap, - addr + PM8941_WLED_REG_STR_MOD_EN_BASE, - PM8941_WLED_REG_STR_MOD_MASK, - PM8941_WLED_REG_STR_MOD_EN); + addr + WLED3_SINK_REG_STR_MOD_EN_BASE, + WLED3_SINK_REG_STR_MOD_MASK, + WLED3_SINK_REG_STR_MOD_EN); if (rc) return rc; if (wled->cfg.ext_gen) { rc = regmap_update_bits(wled->regmap, - addr + PM8941_WLED_REG_STR_MOD_SRC_BASE, - PM8941_WLED_REG_STR_MOD_SRC_MASK, - PM8941_WLED_REG_STR_MOD_SRC_EXT); + addr + WLED3_SINK_REG_STR_MOD_SRC_BASE, + WLED3_SINK_REG_STR_MOD_SRC_MASK, + WLED3_SINK_REG_STR_MOD_SRC_EXT); if (rc) return rc; } rc = regmap_update_bits(wled->regmap, - addr + PM8941_WLED_REG_STR_SCALE_BASE, - PM8941_WLED_REG_STR_SCALE_MASK, - wled->cfg.i_limit); + addr + WLED3_SINK_REG_STR_FULL_SCALE_CURR, + WLED3_SINK_REG_STR_FULL_SCALE_CURR_MASK, + wled->cfg.string_i_limit); if (rc) return rc; rc = regmap_update_bits(wled->regmap, - addr + PM8941_WLED_REG_STR_CABC_BASE, - PM8941_WLED_REG_STR_CABC_MASK, + addr + WLED3_SINK_REG_STR_CABC_BASE, + WLED3_SINK_REG_STR_CABC_MASK, wled->cfg.cabc_en ? - PM8941_WLED_REG_STR_CABC_EN : 0); + WLED3_SINK_REG_STR_CABC_EN : 0); if (rc) return rc; } @@ -194,9 +196,9 @@ static int pm8941_wled_setup(struct pm8941_wled *wled) return 0; } -static const struct pm8941_wled_config pm8941_wled_config_defaults = { - .i_boost_limit = 3, - .i_limit = 20, +static const struct wled_config wled3_config_defaults = { + .boost_i_limit = 3, + .string_i_limit = 20, .ovp = 2, .switch_freq = 5, .num_strings = 0, @@ -205,55 +207,55 @@ static int pm8941_wled_setup(struct pm8941_wled *wled) .cabc_en = false, }; -struct pm8941_wled_var_cfg { +struct wled_var_cfg { const u32 *values; u32 (*fn)(u32); int size; }; -static const u32 pm8941_wled_i_boost_limit_values[] = { +static const u32 wled3_boost_i_limit_values[] = { 105, 385, 525, 805, 980, 1260, 1400, 1680, }; -static const struct pm8941_wled_var_cfg pm8941_wled_i_boost_limit_cfg = { - .values = pm8941_wled_i_boost_limit_values, - .size = ARRAY_SIZE(pm8941_wled_i_boost_limit_values), +static const struct wled_var_cfg wled3_boost_i_limit_cfg = { + .values = wled3_boost_i_limit_values, + .size = ARRAY_SIZE(wled3_boost_i_limit_values), }; -static const u32 pm8941_wled_ovp_values[] = { +static const u32 wled3_ovp_values[] = { 35, 32, 29, 27, }; -static const struct pm8941_wled_var_cfg pm8941_wled_ovp_cfg = { - .values = pm8941_wled_ovp_values, - .size = ARRAY_SIZE(pm8941_wled_ovp_values), +static const struct wled_var_cfg wled3_ovp_cfg = { + .values = wled3_ovp_values, + .size = ARRAY_SIZE(wled3_ovp_values), }; -static u32 pm8941_wled_num_strings_values_fn(u32 idx) +static u32 wled3_num_strings_values_fn(u32 idx) { return idx + 1; } -static const struct pm8941_wled_var_cfg pm8941_wled_num_strings_cfg = { - .fn = pm8941_wled_num_strings_values_fn, +static const struct wled_var_cfg wled3_num_strings_cfg = { + .fn = wled3_num_strings_values_fn, .size = 3, }; -static u32 pm8941_wled_switch_freq_values_fn(u32 idx) +static u32 wled3_switch_freq_values_fn(u32 idx) { return 19200 / (2 * (1 + idx)); } -static const struct pm8941_wled_var_cfg pm8941_wled_switch_freq_cfg = { - .fn = pm8941_wled_switch_freq_values_fn, +static const struct wled_var_cfg wled3_switch_freq_cfg = { + .fn = wled3_switch_freq_values_fn, .size = 16, }; -static const struct pm8941_wled_var_cfg pm8941_wled_i_limit_cfg = { +static const struct wled_var_cfg wled3_string_i_limit_cfg = { .size = 26, }; -static u32 pm8941_wled_values(const struct pm8941_wled_var_cfg *cfg, u32 idx) +static u32 wled3_values(const struct wled_var_cfg *cfg, u32 idx) { if (idx >= cfg->size) return UINT_MAX; @@ -264,9 +266,9 @@ static u32 pm8941_wled_values(const struct pm8941_wled_var_cfg *cfg, u32 idx) return idx; } -static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev) +static int wled_configure(struct wled *wled, struct device *dev) { - struct pm8941_wled_config *cfg = &wled->cfg; + struct wled_config *cfg = &wled->cfg; u32 val; int rc; u32 c; @@ -276,32 +278,32 @@ static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev) const struct { const char *name; u32 *val_ptr; - const struct pm8941_wled_var_cfg *cfg; + const struct wled_var_cfg *cfg; } u32_opts[] = { { "qcom,current-boost-limit", - &cfg->i_boost_limit, - .cfg = &pm8941_wled_i_boost_limit_cfg, + &cfg->boost_i_limit, + .cfg = &wled3_boost_i_limit_cfg, }, { "qcom,current-limit", - &cfg->i_limit, - .cfg = &pm8941_wled_i_limit_cfg, + &cfg->string_i_limit, + .cfg = &wled3_string_i_limit_cfg, }, { "qcom,ovp", &cfg->ovp, - .cfg = &pm8941_wled_ovp_cfg, + .cfg = &wled3_ovp_cfg, }, { "qcom,switching-freq", &cfg->switch_freq, - .cfg = &pm8941_wled_switch_freq_cfg, + .cfg = &wled3_switch_freq_cfg, }, { "qcom,num-strings", &cfg->num_strings, - .cfg = &pm8941_wled_num_strings_cfg, + .cfg = &wled3_num_strings_cfg, }, }; const struct { @@ -324,7 +326,7 @@ static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev) if (rc) wled->name = devm_kasprintf(dev, GFP_KERNEL, "%pOFn", dev->of_node); - *cfg = pm8941_wled_config_defaults; + *cfg = wled3_config_defaults; for (i = 0; i < ARRAY_SIZE(u32_opts); ++i) { rc = of_property_read_u32(dev->of_node, u32_opts[i].name, &val); if (rc = -EINVAL) { @@ -336,7 +338,7 @@ static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev) c = UINT_MAX; for (j = 0; c != val; j++) { - c = pm8941_wled_values(u32_opts[i].cfg, j); + c = wled3_values(u32_opts[i].cfg, j); if (c = UINT_MAX) { dev_err(dev, "invalid value for '%s'\n", u32_opts[i].name); @@ -358,15 +360,15 @@ static int pm8941_wled_configure(struct pm8941_wled *wled, struct device *dev) return 0; } -static const struct backlight_ops pm8941_wled_ops = { - .update_status = pm8941_wled_update_status, +static const struct backlight_ops wled_ops = { + .update_status = wled_update_status, }; -static int pm8941_wled_probe(struct platform_device *pdev) +static int wled_probe(struct platform_device *pdev) { struct backlight_properties props; struct backlight_device *bl; - struct pm8941_wled *wled; + struct wled *wled; struct regmap *regmap; u32 val; int rc; @@ -383,42 +385,42 @@ static int pm8941_wled_probe(struct platform_device *pdev) wled->regmap = regmap; - rc = pm8941_wled_configure(wled, &pdev->dev); + rc = wled_configure(wled, &pdev->dev); if (rc) return rc; - rc = pm8941_wled_setup(wled); + rc = wled_setup(wled); if (rc) return rc; - val = PM8941_WLED_DEFAULT_BRIGHTNESS; + val = WLED_DEFAULT_BRIGHTNESS; of_property_read_u32(pdev->dev.of_node, "default-brightness", &val); memset(&props, 0, sizeof(struct backlight_properties)); props.type = BACKLIGHT_RAW; props.brightness = val; - props.max_brightness = PM8941_WLED_REG_VAL_MAX; + props.max_brightness = WLED3_SINK_REG_BRIGHT_MAX; bl = devm_backlight_device_register(&pdev->dev, wled->name, &pdev->dev, wled, - &pm8941_wled_ops, &props); + &wled_ops, &props); return PTR_ERR_OR_ZERO(bl); }; -static const struct of_device_id pm8941_wled_match_table[] = { +static const struct of_device_id wled_match_table[] = { { .compatible = "qcom,pm8941-wled" }, {} }; -MODULE_DEVICE_TABLE(of, pm8941_wled_match_table); +MODULE_DEVICE_TABLE(of, wled_match_table); -static struct platform_driver pm8941_wled_driver = { - .probe = pm8941_wled_probe, +static struct platform_driver wled_driver = { + .probe = wled_probe, .driver = { - .name = "pm8941-wled", - .of_match_table = pm8941_wled_match_table, + .name = "qcom,wled", + .of_match_table = wled_match_table, }, }; -module_platform_driver(pm8941_wled_driver); +module_platform_driver(wled_driver); -MODULE_DESCRIPTION("pm8941 wled driver"); +MODULE_DESCRIPTION("Qualcomm WLED driver"); MODULE_LICENSE("GPL v2"); -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, UNWANTED_LANGUAGE_BODY,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EF09ECA9EC9 for ; Fri, 1 Nov 2019 08:10:08 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C9EE4208E3 for ; Fri, 1 Nov 2019 08:10:08 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C9EE4208E3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A1E566F758; Fri, 1 Nov 2019 08:09:56 +0000 (UTC) Received: from smtp.codeaurora.org (smtp.codeaurora.org [198.145.29.96]) by gabe.freedesktop.org (Postfix) with ESMTPS id 39D8A6E17B for ; Fri, 1 Nov 2019 06:28:02 +0000 (UTC) Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 1FFFB60DB2; Fri, 1 Nov 2019 06:28:01 +0000 (UTC) Received: from kgunda-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: kgunda@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id D70EB60DB2; Fri, 1 Nov 2019 06:27:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org D70EB60DB2 From: Kiran Gunda To: bjorn.andersson@linaro.org, jingoohan1@gmail.com, lee.jones@linaro.org, b.zolnierkie@samsung.com, dri-devel@lists.freedesktop.org, daniel.thompson@linaro.org, jacek.anaszewski@gmail.com, pavel@ucw.cz, robh+dt@kernel.org, mark.rutland@arm.com, linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Andy Gross , linux-arm-msm@vger.kernel.org, linux-fbdev@vger.kernel.org Subject: [PATCH V10 4/8] backlight: qcom-wled: Rename PM8941* to WLED3 Date: Fri, 1 Nov 2019 11:57:00 +0530 Message-Id: <1572589624-6095-5-git-send-email-kgunda@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1572589624-6095-1-git-send-email-kgunda@codeaurora.org> References: <1572589624-6095-1-git-send-email-kgunda@codeaurora.org> X-Mailman-Approved-At: Fri, 01 Nov 2019 08:09:55 +0000 X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1572589682; bh=WvjYruTJPKhN0T8fCcVqnyZhH8me5YcEVoLHJ5MpJBo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=N5cTdOamFpvQespTbbN7zQDsBk5NYtxmPm8unbCV+W2NCS9WWGZNw6/Ze9miobHZd JOM5tgrioOJsJpT6VFF2RilMF3Q+7kEnYQetXoCfp4ZQ3d8LsJwVoUlwLbfq2rixAB EtK7RfI8AmKG/hHp0t6/BMG8F0go+rrQlazO8NwU= X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1572589677; bh=WvjYruTJPKhN0T8fCcVqnyZhH8me5YcEVoLHJ5MpJBo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=X3VD1isIqvx+1V3125WD8h2YRHNx+AigtKk3wDLmjkx1uWIq6KWDfqsnBYSWLk+Pe 2TkJf1uLNtfC0NavsZHAlIXDKDSbTkjBojdHRqr7t8XiYKApfSm3xCTei8DRb7iIdB s8l9OPx9TrbBOSA+uGvlHw4SVxmNNSu8TtsBETeo= X-Mailman-Original-Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org X-Mailman-Original-Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=kgunda@codeaurora.org X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kiran Gunda MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Message-ID: <20191101062700.83iDr9Ypza-bNh0k-REA2pH9VQFohP0L1-eBuSCvAq0@z> UmVuYW1lIHRoZSBQTTg5NDEqIHJlZmVyZW5jZXMgYXMgV0xFRDMgdG8gbWFrZSB0aGUgZHJpdmVy CmdlbmVyaWMgYW5kIGhhdmUgV0xFRCBzdXBwb3J0IGZvciBvdGhlciBQTUlDcy4gQWxzbyByZW5h bWUKImlfYm9vc3RfbGltaXQiIGFuZCAiaV9saW1pdCIgdmFyaWFibGVzIHRvICJib29zdF9pX2xp bWl0IgphbmQgInN0cmluZ19pX2xpbWl0IiByZXNwZWN0aXZlbHkgdG8gcmVzZW1ibGUgdGhlIGNv cnJlc3BvbmRpbmcKcmVnaXN0ZXIgbmFtZXMuCgpTaWduZWQtb2ZmLWJ5OiBLaXJhbiBHdW5kYSA8 a2d1bmRhQGNvZGVhdXJvcmEub3JnPgpSZXZpZXdlZC1ieTogRGFuaWVsIFRob21wc29uIDxkYW5p ZWwudGhvbXBzb25AbGluYXJvLm9yZz4KUmV2aWV3ZWQtYnk6IEJqb3JuIEFuZGVyc3NvbiA8Ympv cm4uYW5kZXJzc29uQGxpbmFyby5vcmc+CkFja2VkLWJ5OiBQYXZlbCBNYWNoZWsgPHBhdmVsQHVj dy5jej4KLS0tCiBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9xY29tLXdsZWQuYyB8IDI0OCArKysr KysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAxMjUgaW5z ZXJ0aW9ucygrKSwgMTIzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8v YmFja2xpZ2h0L3Fjb20td2xlZC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvcWNvbS13bGVk LmMKaW5kZXggODJiODU3Mi4uZjE5MTI0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNr bGlnaHQvcWNvbS13bGVkLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvcWNvbS13bGVk LmMKQEAgLTEwLDc3ICsxMCw3OSBAQAogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogCiAvKiBG cm9tIERUIGJpbmRpbmcgKi8KLSNkZWZpbmUgUE04OTQxX1dMRURfREVGQVVMVF9CUklHSFRORVNT CQkyMDQ4CisjZGVmaW5lIFdMRURfREVGQVVMVF9CUklHSFRORVNTCQkJCTIwNDgKIAotI2RlZmlu ZSBQTTg5NDFfV0xFRF9SRUdfVkFMX0JBU0UJCTB4NDAKLSNkZWZpbmUgIFBNODk0MV9XTEVEX1JF R19WQUxfTUFYCQkweEZGRgorI2RlZmluZSBXTEVEM19TSU5LX1JFR19CUklHSFRfTUFYCQkJMHhG RkYKKyNkZWZpbmUgV0xFRDNfQ1RSTF9SRUdfVkFMX0JBU0UJCQkJMHg0MAogCi0jZGVmaW5lIFBN ODk0MV9XTEVEX1JFR19NT0RfRU4JCQkweDQ2Ci0jZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfTU9E X0VOX0JJVAkJQklUKDcpCi0jZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfTU9EX0VOX01BU0sJCUJJ VCg3KQorLyogV0xFRDMgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgV0xFRDNfQ1RSTF9S RUdfTU9EX0VOCQkJCTB4NDYKKyNkZWZpbmUgIFdMRUQzX0NUUkxfUkVHX01PRF9FTl9CSVQJCQlC SVQoNykKKyNkZWZpbmUgIFdMRUQzX0NUUkxfUkVHX01PRF9FTl9NQVNLCQkJQklUKDcpCiAKLSNk ZWZpbmUgUE04OTQxX1dMRURfUkVHX1NZTkMJCQkweDQ3Ci0jZGVmaW5lICBQTTg5NDFfV0xFRF9S RUdfU1lOQ19NQVNLCQkweDA3Ci0jZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfU1lOQ19MRUQxCQlC SVQoMCkKLSNkZWZpbmUgIFBNODk0MV9XTEVEX1JFR19TWU5DX0xFRDIJCUJJVCgxKQotI2RlZmlu ZSAgUE04OTQxX1dMRURfUkVHX1NZTkNfTEVEMwkJQklUKDIpCi0jZGVmaW5lICBQTTg5NDFfV0xF RF9SRUdfU1lOQ19BTEwJCTB4MDcKLSNkZWZpbmUgIFBNODk0MV9XTEVEX1JFR19TWU5DX0NMRUFS CQkweDAwCisjZGVmaW5lIFdMRUQzX0NUUkxfUkVHX0ZSRVEJCQkJMHg0YworI2RlZmluZSAgV0xF RDNfQ1RSTF9SRUdfRlJFUV9NQVNLCQkJMHgwZgogCi0jZGVmaW5lIFBNODk0MV9XTEVEX1JFR19G UkVRCQkJMHg0YwotI2RlZmluZSAgUE04OTQxX1dMRURfUkVHX0ZSRVFfTUFTSwkJMHgwZgorI2Rl ZmluZSBXTEVEM19DVFJMX1JFR19PVlAJCQkJMHg0ZAorI2RlZmluZSAgV0xFRDNfQ1RSTF9SRUdf T1ZQX01BU0sJCQkweDAzCiAKLSNkZWZpbmUgUE04OTQxX1dMRURfUkVHX09WUAkJCTB4NGQKLSNk ZWZpbmUgIFBNODk0MV9XTEVEX1JFR19PVlBfTUFTSwkJMHgwMworI2RlZmluZSBXTEVEM19DVFJM X1JFR19JTElNSVQJCQkJMHg0ZQorI2RlZmluZSAgV0xFRDNfQ1RSTF9SRUdfSUxJTUlUX01BU0sJ CQkweDA3CiAKLSNkZWZpbmUgUE04OTQxX1dMRURfUkVHX0JPT1NUCQkJMHg0ZQotI2RlZmluZSAg UE04OTQxX1dMRURfUkVHX0JPT1NUX01BU0sJCTB4MDcKKy8qIFdMRUQzIHNpbmsgcmVnaXN0ZXJz ICovCisjZGVmaW5lIFdMRUQzX1NJTktfUkVHX1NZTkMJCQkJMHg0NworI2RlZmluZSAgV0xFRDNf U0lOS19SRUdfU1lOQ19NQVNLCQkJMHgwNworI2RlZmluZSAgV0xFRDNfU0lOS19SRUdfU1lOQ19M RUQxCQkJQklUKDApCisjZGVmaW5lICBXTEVEM19TSU5LX1JFR19TWU5DX0xFRDIJCQlCSVQoMSkK KyNkZWZpbmUgIFdMRUQzX1NJTktfUkVHX1NZTkNfTEVEMwkJCUJJVCgyKQorI2RlZmluZSAgV0xF RDNfU0lOS19SRUdfU1lOQ19BTEwJCQkweDA3CisjZGVmaW5lICBXTEVEM19TSU5LX1JFR19TWU5D X0NMRUFSCQkJMHgwMAogCi0jZGVmaW5lIFBNODk0MV9XTEVEX1JFR19TSU5LCQkJMHg0ZgotI2Rl ZmluZSAgUE04OTQxX1dMRURfUkVHX1NJTktfTUFTSwkJMHhlMAotI2RlZmluZSAgUE04OTQxX1dM RURfUkVHX1NJTktfU0hGVAkJMHgwNQorI2RlZmluZSBXTEVEM19TSU5LX1JFR19DVVJSX1NJTksJ CQkweDRmCisjZGVmaW5lICBXTEVEM19TSU5LX1JFR19DVVJSX1NJTktfTUFTSwkJCTB4ZTAKKyNk ZWZpbmUgIFdMRUQzX1NJTktfUkVHX0NVUlJfU0lOS19TSEZUCQkJMHgwNQogCi0vKiBQZXItJ3N0 cmluZycgcmVnaXN0ZXJzIGJlbG93ICovCi0jZGVmaW5lIFBNODk0MV9XTEVEX1JFR19TVFJfT0ZG U0VUCQkweDEwCisvKiBXTEVEMyBwZXItJ3N0cmluZycgcmVnaXN0ZXJzIGJlbG93ICovCisjZGVm aW5lIFdMRUQzX1NJTktfUkVHX1NUUl9PRkZTRVQJCQkweDEwCiAKLSNkZWZpbmUgUE04OTQxX1dM RURfUkVHX1NUUl9NT0RfRU5fQkFTRQkJMHg2MAotI2RlZmluZSAgUE04OTQxX1dMRURfUkVHX1NU Ul9NT0RfTUFTSwkJQklUKDcpCi0jZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfU1RSX01PRF9FTgkJ QklUKDcpCisjZGVmaW5lIFdMRUQzX1NJTktfUkVHX1NUUl9NT0RfRU5fQkFTRQkJCTB4NjAKKyNk ZWZpbmUgIFdMRUQzX1NJTktfUkVHX1NUUl9NT0RfTUFTSwkJCUJJVCg3KQorI2RlZmluZSAgV0xF RDNfU0lOS19SRUdfU1RSX01PRF9FTgkJCUJJVCg3KQogCi0jZGVmaW5lIFBNODk0MV9XTEVEX1JF R19TVFJfU0NBTEVfQkFTRQkJMHg2MgotI2RlZmluZSAgUE04OTQxX1dMRURfUkVHX1NUUl9TQ0FM RV9NQVNLCQkweDFmCisjZGVmaW5lIFdMRUQzX1NJTktfUkVHX1NUUl9GVUxMX1NDQUxFX0NVUlIJ CTB4NjIKKyNkZWZpbmUgIFdMRUQzX1NJTktfUkVHX1NUUl9GVUxMX1NDQUxFX0NVUlJfTUFTSwkw eDFmCiAKLSNkZWZpbmUgUE04OTQxX1dMRURfUkVHX1NUUl9NT0RfU1JDX0JBU0UJMHg2MwotI2Rl ZmluZSAgUE04OTQxX1dMRURfUkVHX1NUUl9NT0RfU1JDX01BU0sJMHgwMQotI2RlZmluZSAgUE04 OTQxX1dMRURfUkVHX1NUUl9NT0RfU1JDX0lOVAkweDAwCi0jZGVmaW5lICBQTTg5NDFfV0xFRF9S RUdfU1RSX01PRF9TUkNfRVhUCTB4MDEKKyNkZWZpbmUgV0xFRDNfU0lOS19SRUdfU1RSX01PRF9T UkNfQkFTRQkJCTB4NjMKKyNkZWZpbmUgIFdMRUQzX1NJTktfUkVHX1NUUl9NT0RfU1JDX01BU0sJ CTB4MDEKKyNkZWZpbmUgIFdMRUQzX1NJTktfUkVHX1NUUl9NT0RfU1JDX0lOVAkJCTB4MDAKKyNk ZWZpbmUgIFdMRUQzX1NJTktfUkVHX1NUUl9NT0RfU1JDX0VYVAkJCTB4MDEKIAotI2RlZmluZSBQ TTg5NDFfV0xFRF9SRUdfU1RSX0NBQkNfQkFTRQkJMHg2NgotI2RlZmluZSAgUE04OTQxX1dMRURf UkVHX1NUUl9DQUJDX01BU0sJCUJJVCg3KQotI2RlZmluZSAgUE04OTQxX1dMRURfUkVHX1NUUl9D QUJDX0VOCQlCSVQoNykKKyNkZWZpbmUgV0xFRDNfU0lOS19SRUdfU1RSX0NBQkNfQkFTRQkJCTB4 NjYKKyNkZWZpbmUgIFdMRUQzX1NJTktfUkVHX1NUUl9DQUJDX01BU0sJCQlCSVQoNykKKyNkZWZp bmUgIFdMRUQzX1NJTktfUkVHX1NUUl9DQUJDX0VOCQkJQklUKDcpCiAKLXN0cnVjdCBwbTg5NDFf d2xlZF9jb25maWcgewotCXUzMiBpX2Jvb3N0X2xpbWl0Oworc3RydWN0IHdsZWRfY29uZmlnIHsK Kwl1MzIgYm9vc3RfaV9saW1pdDsKIAl1MzIgb3ZwOwogCXUzMiBzd2l0Y2hfZnJlcTsKIAl1MzIg bnVtX3N0cmluZ3M7Ci0JdTMyIGlfbGltaXQ7CisJdTMyIHN0cmluZ19pX2xpbWl0OwogCWJvb2wg Y3Nfb3V0X2VuOwogCWJvb2wgZXh0X2dlbjsKIAlib29sIGNhYmNfZW47CiB9OwogCi1zdHJ1Y3Qg cG04OTQxX3dsZWQgeworc3RydWN0IHdsZWQgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJc3RydWN0 IHJlZ21hcCAqcmVnbWFwOwogCXUxNiBhZGRyOwogCi0Jc3RydWN0IHBtODk0MV93bGVkX2NvbmZp ZyBjZmc7CisJc3RydWN0IHdsZWRfY29uZmlnIGNmZzsKIH07CiAKLXN0YXRpYyBpbnQgcG04OTQx X3dsZWRfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmwpCitzdGF0aWMg aW50IHdsZWRfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmwpCiB7Ci0J c3RydWN0IHBtODk0MV93bGVkICp3bGVkID0gYmxfZ2V0X2RhdGEoYmwpOworCXN0cnVjdCB3bGVk ICp3bGVkID0gYmxfZ2V0X2RhdGEoYmwpOwogCXUxNiB2YWwgPSBibC0+cHJvcHMuYnJpZ2h0bmVz czsKIAl1OCBjdHJsID0gMDsKIAlpbnQgcmM7CkBAIC05MiwxMSArOTQsMTEgQEAgc3RhdGljIGlu dCBwbTg5NDFfd2xlZF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCkK IAkJdmFsID0gMDsKIAogCWlmICh2YWwgIT0gMCkKLQkJY3RybCA9IFBNODk0MV9XTEVEX1JFR19N T0RfRU5fQklUOworCQljdHJsID0gV0xFRDNfQ1RSTF9SRUdfTU9EX0VOX0JJVDsKIAogCXJjID0g cmVnbWFwX3VwZGF0ZV9iaXRzKHdsZWQtPnJlZ21hcCwKLQkJCXdsZWQtPmFkZHIgKyBQTTg5NDFf V0xFRF9SRUdfTU9EX0VOLAotCQkJUE04OTQxX1dMRURfUkVHX01PRF9FTl9NQVNLLCBjdHJsKTsK KwkJCXdsZWQtPmFkZHIgKyBXTEVEM19DVFJMX1JFR19NT0RfRU4sCisJCQlXTEVEM19DVFJMX1JF R19NT0RfRU5fTUFTSywgY3RybCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKQEAgLTEwNCw4 OSArMTA2LDg5IEBAIHN0YXRpYyBpbnQgcG04OTQxX3dsZWRfdXBkYXRlX3N0YXR1cyhzdHJ1Y3Qg YmFja2xpZ2h0X2RldmljZSAqYmwpCiAJCXU4IHZbMl0gPSB7IHZhbCAmIDB4ZmYsICh2YWwgPj4g OCkgJiAweGYgfTsKIAogCQlyYyA9IHJlZ21hcF9idWxrX3dyaXRlKHdsZWQtPnJlZ21hcCwKLQkJ CQl3bGVkLT5hZGRyICsgUE04OTQxX1dMRURfUkVHX1ZBTF9CQVNFICsgMiAqIGksCisJCQkJd2xl ZC0+YWRkciArIFdMRUQzX0NUUkxfUkVHX1ZBTF9CQVNFICsgMiAqIGksCiAJCQkJdiwgMik7CiAJ CWlmIChyYykKIAkJCXJldHVybiByYzsKIAl9CiAKIAlyYyA9IHJlZ21hcF91cGRhdGVfYml0cyh3 bGVkLT5yZWdtYXAsCi0JCQl3bGVkLT5hZGRyICsgUE04OTQxX1dMRURfUkVHX1NZTkMsCi0JCQlQ TTg5NDFfV0xFRF9SRUdfU1lOQ19NQVNLLCBQTTg5NDFfV0xFRF9SRUdfU1lOQ19BTEwpOworCQkJ d2xlZC0+YWRkciArIFdMRUQzX1NJTktfUkVHX1NZTkMsCisJCQlXTEVEM19TSU5LX1JFR19TWU5D X01BU0ssIFdMRUQzX1NJTktfUkVHX1NZTkNfQUxMKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsK IAogCXJjID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHdsZWQtPnJlZ21hcCwKLQkJCXdsZWQtPmFkZHIg KyBQTTg5NDFfV0xFRF9SRUdfU1lOQywKLQkJCVBNODk0MV9XTEVEX1JFR19TWU5DX01BU0ssIFBN ODk0MV9XTEVEX1JFR19TWU5DX0NMRUFSKTsKKwkJCXdsZWQtPmFkZHIgKyBXTEVEM19TSU5LX1JF R19TWU5DLAorCQkJV0xFRDNfU0lOS19SRUdfU1lOQ19NQVNLLCBXTEVEM19TSU5LX1JFR19TWU5D X0NMRUFSKTsKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgcG04OTQxX3dsZWRfc2V0dXAo c3RydWN0IHBtODk0MV93bGVkICp3bGVkKQorc3RhdGljIGludCB3bGVkX3NldHVwKHN0cnVjdCB3 bGVkICp3bGVkKQogewogCWludCByYzsKIAlpbnQgaTsKIAogCXJjID0gcmVnbWFwX3VwZGF0ZV9i aXRzKHdsZWQtPnJlZ21hcCwKLQkJCXdsZWQtPmFkZHIgKyBQTTg5NDFfV0xFRF9SRUdfT1ZQLAot CQkJUE04OTQxX1dMRURfUkVHX09WUF9NQVNLLCB3bGVkLT5jZmcub3ZwKTsKKwkJCXdsZWQtPmFk ZHIgKyBXTEVEM19DVFJMX1JFR19PVlAsCisJCQlXTEVEM19DVFJMX1JFR19PVlBfTUFTSywgd2xl ZC0+Y2ZnLm92cCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKIAlyYyA9IHJlZ21hcF91cGRh dGVfYml0cyh3bGVkLT5yZWdtYXAsCi0JCQl3bGVkLT5hZGRyICsgUE04OTQxX1dMRURfUkVHX0JP T1NULAotCQkJUE04OTQxX1dMRURfUkVHX0JPT1NUX01BU0ssIHdsZWQtPmNmZy5pX2Jvb3N0X2xp bWl0KTsKKwkJCXdsZWQtPmFkZHIgKyBXTEVEM19DVFJMX1JFR19JTElNSVQsCisJCQlXTEVEM19D VFJMX1JFR19JTElNSVRfTUFTSywgd2xlZC0+Y2ZnLmJvb3N0X2lfbGltaXQpOwogCWlmIChyYykK IAkJcmV0dXJuIHJjOwogCiAJcmMgPSByZWdtYXBfdXBkYXRlX2JpdHMod2xlZC0+cmVnbWFwLAot CQkJd2xlZC0+YWRkciArIFBNODk0MV9XTEVEX1JFR19GUkVRLAotCQkJUE04OTQxX1dMRURfUkVH X0ZSRVFfTUFTSywgd2xlZC0+Y2ZnLnN3aXRjaF9mcmVxKTsKKwkJCXdsZWQtPmFkZHIgKyBXTEVE M19DVFJMX1JFR19GUkVRLAorCQkJV0xFRDNfQ1RSTF9SRUdfRlJFUV9NQVNLLCB3bGVkLT5jZmcu c3dpdGNoX2ZyZXEpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCiAJaWYgKHdsZWQtPmNmZy5j c19vdXRfZW4pIHsKIAkJdTggYWxsID0gKEJJVCh3bGVkLT5jZmcubnVtX3N0cmluZ3MpIC0gMSkK LQkJCQk8PCBQTTg5NDFfV0xFRF9SRUdfU0lOS19TSEZUOworCQkJCTw8IFdMRUQzX1NJTktfUkVH X0NVUlJfU0lOS19TSEZUOwogCiAJCXJjID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHdsZWQtPnJlZ21h cCwKLQkJCQl3bGVkLT5hZGRyICsgUE04OTQxX1dMRURfUkVHX1NJTkssCi0JCQkJUE04OTQxX1dM RURfUkVHX1NJTktfTUFTSywgYWxsKTsKKwkJCQl3bGVkLT5hZGRyICsgV0xFRDNfU0lOS19SRUdf Q1VSUl9TSU5LLAorCQkJCVdMRUQzX1NJTktfUkVHX0NVUlJfU0lOS19NQVNLLCBhbGwpOwogCQlp ZiAocmMpCiAJCQlyZXR1cm4gcmM7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHdsZWQtPmNmZy5u dW1fc3RyaW5nczsgKytpKSB7Ci0JCXUxNiBhZGRyID0gd2xlZC0+YWRkciArIFBNODk0MV9XTEVE X1JFR19TVFJfT0ZGU0VUICogaTsKKwkJdTE2IGFkZHIgPSB3bGVkLT5hZGRyICsgV0xFRDNfU0lO S19SRUdfU1RSX09GRlNFVCAqIGk7CiAKIAkJcmMgPSByZWdtYXBfdXBkYXRlX2JpdHMod2xlZC0+ cmVnbWFwLAotCQkJCWFkZHIgKyBQTTg5NDFfV0xFRF9SRUdfU1RSX01PRF9FTl9CQVNFLAotCQkJ CVBNODk0MV9XTEVEX1JFR19TVFJfTU9EX01BU0ssCi0JCQkJUE04OTQxX1dMRURfUkVHX1NUUl9N T0RfRU4pOworCQkJCWFkZHIgKyBXTEVEM19TSU5LX1JFR19TVFJfTU9EX0VOX0JBU0UsCisJCQkJ V0xFRDNfU0lOS19SRUdfU1RSX01PRF9NQVNLLAorCQkJCVdMRUQzX1NJTktfUkVHX1NUUl9NT0Rf RU4pOwogCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CiAKIAkJaWYgKHdsZWQtPmNmZy5leHRfZ2Vu KSB7CiAJCQlyYyA9IHJlZ21hcF91cGRhdGVfYml0cyh3bGVkLT5yZWdtYXAsCi0JCQkJCWFkZHIg KyBQTTg5NDFfV0xFRF9SRUdfU1RSX01PRF9TUkNfQkFTRSwKLQkJCQkJUE04OTQxX1dMRURfUkVH X1NUUl9NT0RfU1JDX01BU0ssCi0JCQkJCVBNODk0MV9XTEVEX1JFR19TVFJfTU9EX1NSQ19FWFQp OworCQkJCQlhZGRyICsgV0xFRDNfU0lOS19SRUdfU1RSX01PRF9TUkNfQkFTRSwKKwkJCQkJV0xF RDNfU0lOS19SRUdfU1RSX01PRF9TUkNfTUFTSywKKwkJCQkJV0xFRDNfU0lOS19SRUdfU1RSX01P RF9TUkNfRVhUKTsKIAkJCWlmIChyYykKIAkJCQlyZXR1cm4gcmM7CiAJCX0KIAogCQlyYyA9IHJl Z21hcF91cGRhdGVfYml0cyh3bGVkLT5yZWdtYXAsCi0JCQkJYWRkciArIFBNODk0MV9XTEVEX1JF R19TVFJfU0NBTEVfQkFTRSwKLQkJCQlQTTg5NDFfV0xFRF9SRUdfU1RSX1NDQUxFX01BU0ssCi0J CQkJd2xlZC0+Y2ZnLmlfbGltaXQpOworCQkJCWFkZHIgKyBXTEVEM19TSU5LX1JFR19TVFJfRlVM TF9TQ0FMRV9DVVJSLAorCQkJCVdMRUQzX1NJTktfUkVHX1NUUl9GVUxMX1NDQUxFX0NVUlJfTUFT SywKKwkJCQl3bGVkLT5jZmcuc3RyaW5nX2lfbGltaXQpOwogCQlpZiAocmMpCiAJCQlyZXR1cm4g cmM7CiAKIAkJcmMgPSByZWdtYXBfdXBkYXRlX2JpdHMod2xlZC0+cmVnbWFwLAotCQkJCWFkZHIg KyBQTTg5NDFfV0xFRF9SRUdfU1RSX0NBQkNfQkFTRSwKLQkJCQlQTTg5NDFfV0xFRF9SRUdfU1RS X0NBQkNfTUFTSywKKwkJCQlhZGRyICsgV0xFRDNfU0lOS19SRUdfU1RSX0NBQkNfQkFTRSwKKwkJ CQlXTEVEM19TSU5LX1JFR19TVFJfQ0FCQ19NQVNLLAogCQkJCXdsZWQtPmNmZy5jYWJjX2VuID8K LQkJCQkJUE04OTQxX1dMRURfUkVHX1NUUl9DQUJDX0VOIDogMCk7CisJCQkJCVdMRUQzX1NJTktf UkVHX1NUUl9DQUJDX0VOIDogMCk7CiAJCWlmIChyYykKIAkJCXJldHVybiByYzsKIAl9CkBAIC0x OTQsOSArMTk2LDkgQEAgc3RhdGljIGludCBwbTg5NDFfd2xlZF9zZXR1cChzdHJ1Y3QgcG04OTQx X3dsZWQgKndsZWQpCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcG04OTQx X3dsZWRfY29uZmlnIHBtODk0MV93bGVkX2NvbmZpZ19kZWZhdWx0cyA9IHsKLQkuaV9ib29zdF9s aW1pdCA9IDMsCi0JLmlfbGltaXQgPSAyMCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2xlZF9jb25m aWcgd2xlZDNfY29uZmlnX2RlZmF1bHRzID0geworCS5ib29zdF9pX2xpbWl0ID0gMywKKwkuc3Ry aW5nX2lfbGltaXQgPSAyMCwKIAkub3ZwID0gMiwKIAkuc3dpdGNoX2ZyZXEgPSA1LAogCS5udW1f c3RyaW5ncyA9IDAsCkBAIC0yMDUsNTUgKzIwNyw1NSBAQCBzdGF0aWMgaW50IHBtODk0MV93bGVk X3NldHVwKHN0cnVjdCBwbTg5NDFfd2xlZCAqd2xlZCkKIAkuY2FiY19lbiA9IGZhbHNlLAogfTsK IAotc3RydWN0IHBtODk0MV93bGVkX3Zhcl9jZmcgeworc3RydWN0IHdsZWRfdmFyX2NmZyB7CiAJ Y29uc3QgdTMyICp2YWx1ZXM7CiAJdTMyICgqZm4pKHUzMik7CiAJaW50IHNpemU7CiB9OwogCi1z dGF0aWMgY29uc3QgdTMyIHBtODk0MV93bGVkX2lfYm9vc3RfbGltaXRfdmFsdWVzW10gPSB7Citz dGF0aWMgY29uc3QgdTMyIHdsZWQzX2Jvb3N0X2lfbGltaXRfdmFsdWVzW10gPSB7CiAJMTA1LCAz ODUsIDUyNSwgODA1LCA5ODAsIDEyNjAsIDE0MDAsIDE2ODAsCiB9OwogCi1zdGF0aWMgY29uc3Qg c3RydWN0IHBtODk0MV93bGVkX3Zhcl9jZmcgcG04OTQxX3dsZWRfaV9ib29zdF9saW1pdF9jZmcg PSB7Ci0JLnZhbHVlcyA9IHBtODk0MV93bGVkX2lfYm9vc3RfbGltaXRfdmFsdWVzLAotCS5zaXpl ID0gQVJSQVlfU0laRShwbTg5NDFfd2xlZF9pX2Jvb3N0X2xpbWl0X3ZhbHVlcyksCitzdGF0aWMg Y29uc3Qgc3RydWN0IHdsZWRfdmFyX2NmZyB3bGVkM19ib29zdF9pX2xpbWl0X2NmZyA9IHsKKwku dmFsdWVzID0gd2xlZDNfYm9vc3RfaV9saW1pdF92YWx1ZXMsCisJLnNpemUgPSBBUlJBWV9TSVpF KHdsZWQzX2Jvb3N0X2lfbGltaXRfdmFsdWVzKSwKIH07CiAKLXN0YXRpYyBjb25zdCB1MzIgcG04 OTQxX3dsZWRfb3ZwX3ZhbHVlc1tdID0geworc3RhdGljIGNvbnN0IHUzMiB3bGVkM19vdnBfdmFs dWVzW10gPSB7CiAJMzUsIDMyLCAyOSwgMjcsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBt ODk0MV93bGVkX3Zhcl9jZmcgcG04OTQxX3dsZWRfb3ZwX2NmZyA9IHsKLQkudmFsdWVzID0gcG04 OTQxX3dsZWRfb3ZwX3ZhbHVlcywKLQkuc2l6ZSA9IEFSUkFZX1NJWkUocG04OTQxX3dsZWRfb3Zw X3ZhbHVlcyksCitzdGF0aWMgY29uc3Qgc3RydWN0IHdsZWRfdmFyX2NmZyB3bGVkM19vdnBfY2Zn ID0geworCS52YWx1ZXMgPSB3bGVkM19vdnBfdmFsdWVzLAorCS5zaXplID0gQVJSQVlfU0laRSh3 bGVkM19vdnBfdmFsdWVzKSwKIH07CiAKLXN0YXRpYyB1MzIgcG04OTQxX3dsZWRfbnVtX3N0cmlu Z3NfdmFsdWVzX2ZuKHUzMiBpZHgpCitzdGF0aWMgdTMyIHdsZWQzX251bV9zdHJpbmdzX3ZhbHVl c19mbih1MzIgaWR4KQogewogCXJldHVybiBpZHggKyAxOwogfQogCi1zdGF0aWMgY29uc3Qgc3Ry dWN0IHBtODk0MV93bGVkX3Zhcl9jZmcgcG04OTQxX3dsZWRfbnVtX3N0cmluZ3NfY2ZnID0gewot CS5mbiA9IHBtODk0MV93bGVkX251bV9zdHJpbmdzX3ZhbHVlc19mbiwKK3N0YXRpYyBjb25zdCBz dHJ1Y3Qgd2xlZF92YXJfY2ZnIHdsZWQzX251bV9zdHJpbmdzX2NmZyA9IHsKKwkuZm4gPSB3bGVk M19udW1fc3RyaW5nc192YWx1ZXNfZm4sCiAJLnNpemUgPSAzLAogfTsKIAotc3RhdGljIHUzMiBw bTg5NDFfd2xlZF9zd2l0Y2hfZnJlcV92YWx1ZXNfZm4odTMyIGlkeCkKK3N0YXRpYyB1MzIgd2xl ZDNfc3dpdGNoX2ZyZXFfdmFsdWVzX2ZuKHUzMiBpZHgpCiB7CiAJcmV0dXJuIDE5MjAwIC8gKDIg KiAoMSArIGlkeCkpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBtODk0MV93bGVkX3Zhcl9j ZmcgcG04OTQxX3dsZWRfc3dpdGNoX2ZyZXFfY2ZnID0gewotCS5mbiA9IHBtODk0MV93bGVkX3N3 aXRjaF9mcmVxX3ZhbHVlc19mbiwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2xlZF92YXJfY2ZnIHds ZWQzX3N3aXRjaF9mcmVxX2NmZyA9IHsKKwkuZm4gPSB3bGVkM19zd2l0Y2hfZnJlcV92YWx1ZXNf Zm4sCiAJLnNpemUgPSAxNiwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcG04OTQxX3dsZWRf dmFyX2NmZyBwbTg5NDFfd2xlZF9pX2xpbWl0X2NmZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg d2xlZF92YXJfY2ZnIHdsZWQzX3N0cmluZ19pX2xpbWl0X2NmZyA9IHsKIAkuc2l6ZSA9IDI2LAog fTsKIAotc3RhdGljIHUzMiBwbTg5NDFfd2xlZF92YWx1ZXMoY29uc3Qgc3RydWN0IHBtODk0MV93 bGVkX3Zhcl9jZmcgKmNmZywgdTMyIGlkeCkKK3N0YXRpYyB1MzIgd2xlZDNfdmFsdWVzKGNvbnN0 IHN0cnVjdCB3bGVkX3Zhcl9jZmcgKmNmZywgdTMyIGlkeCkKIHsKIAlpZiAoaWR4ID49IGNmZy0+ c2l6ZSkKIAkJcmV0dXJuIFVJTlRfTUFYOwpAQCAtMjY0LDkgKzI2Niw5IEBAIHN0YXRpYyB1MzIg cG04OTQxX3dsZWRfdmFsdWVzKGNvbnN0IHN0cnVjdCBwbTg5NDFfd2xlZF92YXJfY2ZnICpjZmcs IHUzMiBpZHgpCiAJcmV0dXJuIGlkeDsKIH0KIAotc3RhdGljIGludCBwbTg5NDFfd2xlZF9jb25m aWd1cmUoc3RydWN0IHBtODk0MV93bGVkICp3bGVkLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0 aWMgaW50IHdsZWRfY29uZmlndXJlKHN0cnVjdCB3bGVkICp3bGVkLCBzdHJ1Y3QgZGV2aWNlICpk ZXYpCiB7Ci0Jc3RydWN0IHBtODk0MV93bGVkX2NvbmZpZyAqY2ZnID0gJndsZWQtPmNmZzsKKwlz dHJ1Y3Qgd2xlZF9jb25maWcgKmNmZyA9ICZ3bGVkLT5jZmc7CiAJdTMyIHZhbDsKIAlpbnQgcmM7 CiAJdTMyIGM7CkBAIC0yNzYsMzIgKzI3OCwzMiBAQCBzdGF0aWMgaW50IHBtODk0MV93bGVkX2Nv bmZpZ3VyZShzdHJ1Y3QgcG04OTQxX3dsZWQgKndsZWQsIHN0cnVjdCBkZXZpY2UgKmRldikKIAlj b25zdCBzdHJ1Y3QgewogCQljb25zdCBjaGFyICpuYW1lOwogCQl1MzIgKnZhbF9wdHI7Ci0JCWNv bnN0IHN0cnVjdCBwbTg5NDFfd2xlZF92YXJfY2ZnICpjZmc7CisJCWNvbnN0IHN0cnVjdCB3bGVk X3Zhcl9jZmcgKmNmZzsKIAl9IHUzMl9vcHRzW10gPSB7CiAJCXsKIAkJCSJxY29tLGN1cnJlbnQt Ym9vc3QtbGltaXQiLAotCQkJJmNmZy0+aV9ib29zdF9saW1pdCwKLQkJCS5jZmcgPSAmcG04OTQx X3dsZWRfaV9ib29zdF9saW1pdF9jZmcsCisJCQkmY2ZnLT5ib29zdF9pX2xpbWl0LAorCQkJLmNm ZyA9ICZ3bGVkM19ib29zdF9pX2xpbWl0X2NmZywKIAkJfSwKIAkJewogCQkJInFjb20sY3VycmVu dC1saW1pdCIsCi0JCQkmY2ZnLT5pX2xpbWl0LAotCQkJLmNmZyA9ICZwbTg5NDFfd2xlZF9pX2xp bWl0X2NmZywKKwkJCSZjZmctPnN0cmluZ19pX2xpbWl0LAorCQkJLmNmZyA9ICZ3bGVkM19zdHJp bmdfaV9saW1pdF9jZmcsCiAJCX0sCiAJCXsKIAkJCSJxY29tLG92cCIsCiAJCQkmY2ZnLT5vdnAs Ci0JCQkuY2ZnID0gJnBtODk0MV93bGVkX292cF9jZmcsCisJCQkuY2ZnID0gJndsZWQzX292cF9j ZmcsCiAJCX0sCiAJCXsKIAkJCSJxY29tLHN3aXRjaGluZy1mcmVxIiwKIAkJCSZjZmctPnN3aXRj aF9mcmVxLAotCQkJLmNmZyA9ICZwbTg5NDFfd2xlZF9zd2l0Y2hfZnJlcV9jZmcsCisJCQkuY2Zn ID0gJndsZWQzX3N3aXRjaF9mcmVxX2NmZywKIAkJfSwKIAkJewogCQkJInFjb20sbnVtLXN0cmlu Z3MiLAogCQkJJmNmZy0+bnVtX3N0cmluZ3MsCi0JCQkuY2ZnID0gJnBtODk0MV93bGVkX251bV9z dHJpbmdzX2NmZywKKwkJCS5jZmcgPSAmd2xlZDNfbnVtX3N0cmluZ3NfY2ZnLAogCQl9LAogCX07 CiAJY29uc3Qgc3RydWN0IHsKQEAgLTMyNCw3ICszMjYsNyBAQCBzdGF0aWMgaW50IHBtODk0MV93 bGVkX2NvbmZpZ3VyZShzdHJ1Y3QgcG04OTQxX3dsZWQgKndsZWQsIHN0cnVjdCBkZXZpY2UgKmRl dikKIAlpZiAocmMpCiAJCXdsZWQtPm5hbWUgPSBkZXZtX2thc3ByaW50ZihkZXYsIEdGUF9LRVJO RUwsICIlcE9GbiIsIGRldi0+b2Zfbm9kZSk7CiAKLQkqY2ZnID0gcG04OTQxX3dsZWRfY29uZmln X2RlZmF1bHRzOworCSpjZmcgPSB3bGVkM19jb25maWdfZGVmYXVsdHM7CiAJZm9yIChpID0gMDsg aSA8IEFSUkFZX1NJWkUodTMyX29wdHMpOyArK2kpIHsKIAkJcmMgPSBvZl9wcm9wZXJ0eV9yZWFk X3UzMihkZXYtPm9mX25vZGUsIHUzMl9vcHRzW2ldLm5hbWUsICZ2YWwpOwogCQlpZiAocmMgPT0g LUVJTlZBTCkgewpAQCAtMzM2LDcgKzMzOCw3IEBAIHN0YXRpYyBpbnQgcG04OTQxX3dsZWRfY29u ZmlndXJlKHN0cnVjdCBwbTg5NDFfd2xlZCAqd2xlZCwgc3RydWN0IGRldmljZSAqZGV2KQogCiAJ CWMgPSBVSU5UX01BWDsKIAkJZm9yIChqID0gMDsgYyAhPSB2YWw7IGorKykgewotCQkJYyA9IHBt ODk0MV93bGVkX3ZhbHVlcyh1MzJfb3B0c1tpXS5jZmcsIGopOworCQkJYyA9IHdsZWQzX3ZhbHVl cyh1MzJfb3B0c1tpXS5jZmcsIGopOwogCQkJaWYgKGMgPT0gVUlOVF9NQVgpIHsKIAkJCQlkZXZf ZXJyKGRldiwgImludmFsaWQgdmFsdWUgZm9yICclcydcbiIsCiAJCQkJCXUzMl9vcHRzW2ldLm5h bWUpOwpAQCAtMzU4LDE1ICszNjAsMTUgQEAgc3RhdGljIGludCBwbTg5NDFfd2xlZF9jb25maWd1 cmUoc3RydWN0IHBtODk0MV93bGVkICp3bGVkLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiAJcmV0dXJu IDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBwbTg5NDFfd2xlZF9v cHMgPSB7Ci0JLnVwZGF0ZV9zdGF0dXMgPSBwbTg5NDFfd2xlZF91cGRhdGVfc3RhdHVzLAorc3Rh dGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIHdsZWRfb3BzID0geworCS51cGRhdGVfc3Rh dHVzID0gd2xlZF91cGRhdGVfc3RhdHVzLAogfTsKIAotc3RhdGljIGludCBwbTg5NDFfd2xlZF9w cm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCB3bGVkX3Byb2Jl KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGJhY2tsaWdodF9wcm9w ZXJ0aWVzIHByb3BzOwogCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibDsKLQlzdHJ1Y3QgcG04 OTQxX3dsZWQgKndsZWQ7CisJc3RydWN0IHdsZWQgKndsZWQ7CiAJc3RydWN0IHJlZ21hcCAqcmVn bWFwOwogCXUzMiB2YWw7CiAJaW50IHJjOwpAQCAtMzgzLDQyICszODUsNDIgQEAgc3RhdGljIGlu dCBwbTg5NDFfd2xlZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogCiAJd2xl ZC0+cmVnbWFwID0gcmVnbWFwOwogCi0JcmMgPSBwbTg5NDFfd2xlZF9jb25maWd1cmUod2xlZCwg JnBkZXYtPmRldik7CisJcmMgPSB3bGVkX2NvbmZpZ3VyZSh3bGVkLCAmcGRldi0+ZGV2KTsKIAlp ZiAocmMpCiAJCXJldHVybiByYzsKIAotCXJjID0gcG04OTQxX3dsZWRfc2V0dXAod2xlZCk7CisJ cmMgPSB3bGVkX3NldHVwKHdsZWQpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JdmFsID0g UE04OTQxX1dMRURfREVGQVVMVF9CUklHSFRORVNTOworCXZhbCA9IFdMRURfREVGQVVMVF9CUklH SFRORVNTOwogCW9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAiZGVmYXVs dC1icmlnaHRuZXNzIiwgJnZhbCk7CiAKIAltZW1zZXQoJnByb3BzLCAwLCBzaXplb2Yoc3RydWN0 IGJhY2tsaWdodF9wcm9wZXJ0aWVzKSk7CiAJcHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9SQVc7CiAJ cHJvcHMuYnJpZ2h0bmVzcyA9IHZhbDsKLQlwcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IFBNODk0MV9X TEVEX1JFR19WQUxfTUFYOworCXByb3BzLm1heF9icmlnaHRuZXNzID0gV0xFRDNfU0lOS19SRUdf QlJJR0hUX01BWDsKIAlibCA9IGRldm1fYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigmcGRldi0+ ZGV2LCB3bGVkLT5uYW1lLAogCQkJCQkgICAgJnBkZXYtPmRldiwgd2xlZCwKLQkJCQkJICAgICZw bTg5NDFfd2xlZF9vcHMsICZwcm9wcyk7CisJCQkJCSAgICAmd2xlZF9vcHMsICZwcm9wcyk7CiAJ cmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhibCk7CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9m X2RldmljZV9pZCBwbTg5NDFfd2xlZF9tYXRjaF90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0 cnVjdCBvZl9kZXZpY2VfaWQgd2xlZF9tYXRjaF90YWJsZVtdID0gewogCXsgLmNvbXBhdGlibGUg PSAicWNvbSxwbTg5NDEtd2xlZCIgfSwKIAl7fQogfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2Ys IHBtODk0MV93bGVkX21hdGNoX3RhYmxlKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHdsZWRf bWF0Y2hfdGFibGUpOwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwbTg5NDFfd2xl ZF9kcml2ZXIgPSB7Ci0JLnByb2JlID0gcG04OTQxX3dsZWRfcHJvYmUsCitzdGF0aWMgc3RydWN0 IHBsYXRmb3JtX2RyaXZlciB3bGVkX2RyaXZlciA9IHsKKwkucHJvYmUgPSB3bGVkX3Byb2JlLAog CS5kcml2ZXIJPSB7Ci0JCS5uYW1lID0gInBtODk0MS13bGVkIiwKLQkJLm9mX21hdGNoX3RhYmxl CT0gcG04OTQxX3dsZWRfbWF0Y2hfdGFibGUsCisJCS5uYW1lID0gInFjb20sd2xlZCIsCisJCS5v Zl9tYXRjaF90YWJsZQk9IHdsZWRfbWF0Y2hfdGFibGUsCiAJfSwKIH07CiAKLW1vZHVsZV9wbGF0 Zm9ybV9kcml2ZXIocG04OTQxX3dsZWRfZHJpdmVyKTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIo d2xlZF9kcml2ZXIpOwogCi1NT0RVTEVfREVTQ1JJUFRJT04oInBtODk0MSB3bGVkIGRyaXZlciIp OworTU9EVUxFX0RFU0NSSVBUSU9OKCJRdWFsY29tbSBXTEVEIGRyaXZlciIpOwogTU9EVUxFX0xJ Q0VOU0UoIkdQTCB2MiIpOwotLSAKVGhlIFF1YWxjb21tIElubm92YXRpb24gQ2VudGVyLCBJbmMu IGlzIGEgbWVtYmVyIG9mIHRoZSBDb2RlIEF1cm9yYSBGb3J1bSwKIGEgTGludXggRm91bmRhdGlv biBDb2xsYWJvcmF0aXZlIFByb2plY3QKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2RyaS1kZXZlbA==