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 47200CA9ECF for ; Fri, 1 Nov 2019 06:28:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1B1C220862 for ; Fri, 1 Nov 2019 06:28:26 +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="pEATcC3M"; dkim=fail reason="key not found in DNS" (0-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="V3R79C4I" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730067AbfKAG2Z (ORCPT ); Fri, 1 Nov 2019 02:28:25 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:46580 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726609AbfKAG2Z (ORCPT ); Fri, 1 Nov 2019 02:28:25 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 54BC760F39; Fri, 1 Nov 2019 06:28:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1572589704; bh=wDNMjb0wqoOUV2dlwuv5kKKe9KtTtq+MXT2r8rru0t0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pEATcC3MrmJGBZLd4UCT6BvTkZFT/OeX1C+myOVkX0PkFZxXxXBcWrTM8xZ0AOokQ Q1M1mXyNtHJRjYtRnmGpEMVzw+iuSqtVj2y4JAU3DRVZHbHoJot3wDSJYxqhA5VE/d nF8RvWTpMwEfA1zZ8TfSwZ4pHTyQkCWzMDUIZoGs= 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 601B360F32; Fri, 1 Nov 2019 06:28:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1572589698; bh=wDNMjb0wqoOUV2dlwuv5kKKe9KtTtq+MXT2r8rru0t0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=V3R79C4IJe6yV6KFTZwk1xvXXO4QQPtR7bwQdN4f+bvahJ0v7oMn7wWc5XjFaERXQ DabvGDJii/v0KFl8reDlPQ7MQ8p7Lt+6QWBhjbPYvMC/trebbvfrSF++DmSS3PtPXB ll07T8SwoMH1WoP4PJBwT4YFxvoUNCWsyNnFxAl0= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 601B360F32 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 7/8] backlight: qcom-wled: add support for short circuit handling. Date: Fri, 1 Nov 2019 11:57:03 +0530 Message-Id: <1572589624-6095-8-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 Handle the short circuit interrupt and check if the short circuit interrupt is valid. Re-enable the module to check if it goes away. Disable the module altogether if the short circuit event persists. Signed-off-by: Kiran Gunda Reviewed-by: Bjorn Andersson Reviewed-by: Daniel Thompson --- drivers/video/backlight/qcom-wled.c | 144 +++++++++++++++++++++++++++++++++++- 1 file changed, 140 insertions(+), 4 deletions(-) diff --git a/drivers/video/backlight/qcom-wled.c b/drivers/video/backlight/qcom-wled.c index 5386ca9..658b1e0 100644 --- a/drivers/video/backlight/qcom-wled.c +++ b/drivers/video/backlight/qcom-wled.c @@ -2,6 +2,9 @@ /* Copyright (c) 2015, Sony Mobile Communications, AB. */ +#include +#include +#include #include #include #include @@ -56,6 +59,16 @@ #define WLED3_SINK_REG_STR_CABC(n) (0x66 + (n * 0x10)) #define WLED3_SINK_REG_STR_CABC_MASK BIT(7) +/* WLED4 specific control registers */ +#define WLED4_CTRL_REG_SHORT_PROTECT 0x5e +#define WLED4_CTRL_REG_SHORT_EN_MASK BIT(7) + +#define WLED4_CTRL_REG_SEC_ACCESS 0xd0 +#define WLED4_CTRL_REG_SEC_UNLOCK 0xa5 + +#define WLED4_CTRL_REG_TEST1 0xe2 +#define WLED4_CTRL_REG_TEST1_EXT_FET_DTEST2 0x09 + /* WLED4 specific sink registers */ #define WLED4_SINK_REG_CURR_SINK 0x46 #define WLED4_SINK_REG_CURR_SINK_MASK GENMASK(7, 4) @@ -105,17 +118,24 @@ struct wled_config { bool cs_out_en; bool ext_gen; bool cabc; + bool external_pfet; }; struct wled { const char *name; struct device *dev; struct regmap *regmap; + struct mutex lock; /* Lock to avoid race from thread irq handler */ + ktime_t last_short_event; u16 ctrl_addr; u16 sink_addr; u16 max_string_count; u32 brightness; u32 max_brightness; + u32 short_count; + bool disabled_by_short; + bool has_short_detect; + int short_irq; struct wled_config cfg; int (*wled_set_brightness)(struct wled *wled, u16 brightness); @@ -166,6 +186,9 @@ static int wled_module_enable(struct wled *wled, int val) { int rc; + if (wled->disabled_by_short) + return -ENXIO; + rc = regmap_update_bits(wled->regmap, wled->ctrl_addr + WLED3_CTRL_REG_MOD_EN, WLED3_CTRL_REG_MOD_EN_MASK, @@ -202,18 +225,19 @@ static int wled_update_status(struct backlight_device *bl) bl->props.state & BL_CORE_FBBLANK) brightness = 0; + mutex_lock(&wled->lock); if (brightness) { rc = wled->wled_set_brightness(wled, brightness); if (rc < 0) { dev_err(wled->dev, "wled failed to set brightness rc:%d\n", rc); - return rc; + goto unlock_mutex; } rc = wled_sync_toggle(wled); if (rc < 0) { dev_err(wled->dev, "wled sync failed rc:%d\n", rc); - return rc; + goto unlock_mutex; } } @@ -221,15 +245,61 @@ static int wled_update_status(struct backlight_device *bl) rc = wled_module_enable(wled, !!brightness); if (rc < 0) { dev_err(wled->dev, "wled enable failed rc:%d\n", rc); - return rc; + goto unlock_mutex; } } wled->brightness = brightness; +unlock_mutex: + mutex_unlock(&wled->lock); + return rc; } +#define WLED_SHORT_DLY_MS 20 +#define WLED_SHORT_CNT_MAX 5 +#define WLED_SHORT_RESET_CNT_DLY_US USEC_PER_SEC + +static irqreturn_t wled_short_irq_handler(int irq, void *_wled) +{ + struct wled *wled = _wled; + int rc; + s64 elapsed_time; + + wled->short_count++; + mutex_lock(&wled->lock); + rc = wled_module_enable(wled, false); + if (rc < 0) { + dev_err(wled->dev, "wled disable failed rc:%d\n", rc); + goto unlock_mutex; + } + + elapsed_time = ktime_us_delta(ktime_get(), + wled->last_short_event); + if (elapsed_time > WLED_SHORT_RESET_CNT_DLY_US) + wled->short_count = 1; + + if (wled->short_count > WLED_SHORT_CNT_MAX) { + dev_err(wled->dev, "Short trigged %d times, disabling WLED forever!\n", + wled->short_count); + wled->disabled_by_short = true; + goto unlock_mutex; + } + + wled->last_short_event = ktime_get(); + + msleep(WLED_SHORT_DLY_MS); + rc = wled_module_enable(wled, true); + if (rc < 0) + dev_err(wled->dev, "wled enable failed rc:%d\n", rc); + +unlock_mutex: + mutex_unlock(&wled->lock); + + return IRQ_HANDLED; +} + static int wled3_setup(struct wled *wled) { u16 addr; @@ -318,7 +388,7 @@ static int wled4_setup(struct wled *wled) int rc, temp, i, j; u16 addr; u8 sink_en = 0; - u32 sink_cfg = 0; + u32 sink_cfg; rc = regmap_update_bits(wled->regmap, wled->ctrl_addr + WLED3_CTRL_REG_OVP, @@ -340,6 +410,21 @@ static int wled4_setup(struct wled *wled) if (rc < 0) return rc; + if (wled->cfg.external_pfet) { + /* Unlock the secure register access */ + rc = regmap_write(wled->regmap, wled->ctrl_addr + + WLED4_CTRL_REG_SEC_ACCESS, + WLED4_CTRL_REG_SEC_UNLOCK); + if (rc < 0) + return rc; + + rc = regmap_write(wled->regmap, + wled->ctrl_addr + WLED4_CTRL_REG_TEST1, + WLED4_CTRL_REG_TEST1_EXT_FET_DTEST2); + if (rc < 0) + return rc; + } + rc = regmap_read(wled->regmap, wled->sink_addr + WLED4_SINK_REG_CURR_SINK, &sink_cfg); if (rc < 0) @@ -425,6 +510,7 @@ static int wled4_setup(struct wled *wled) .num_strings = 4, .switch_freq = 11, .cabc = false, + .external_pfet = false, }; static const u32 wled3_boost_i_limit_values[] = { @@ -590,6 +676,7 @@ static int wled_configure(struct wled *wled, int version) { "qcom,cs-out", &cfg->cs_out_en, }, { "qcom,ext-gen", &cfg->ext_gen, }, { "qcom,cabc", &cfg->cabc, }, + { "qcom,external-pfet", &cfg->external_pfet, }, }; prop_addr = of_get_address(dev->of_node, 0, NULL, NULL); @@ -678,6 +765,38 @@ static int wled_configure(struct wled *wled, int version) return 0; } +static int wled_configure_short_irq(struct wled *wled, + struct platform_device *pdev) +{ + int rc; + + if (!wled->has_short_detect) + return 0; + + rc = regmap_update_bits(wled->regmap, wled->ctrl_addr + + WLED4_CTRL_REG_SHORT_PROTECT, + WLED4_CTRL_REG_SHORT_EN_MASK, + WLED4_CTRL_REG_SHORT_EN_MASK); + if (rc < 0) + return rc; + + wled->short_irq = platform_get_irq_byname(pdev, "short"); + if (wled->short_irq < 0) { + dev_dbg(&pdev->dev, "short irq is not used\n"); + return 0; + } + + rc = devm_request_threaded_irq(wled->dev, wled->short_irq, + NULL, wled_short_irq_handler, + IRQF_ONESHOT, + "wled_short_irq", wled); + if (rc < 0) + dev_err(wled->dev, "Unable to request short_irq (err:%d)\n", + rc); + + return rc; +} + static const struct backlight_ops wled_ops = { .update_status = wled_update_status, }; @@ -711,6 +830,7 @@ static int wled_probe(struct platform_device *pdev) return -ENODEV; } + mutex_init(&wled->lock); rc = wled_configure(wled, version); if (rc) return rc; @@ -725,6 +845,7 @@ static int wled_probe(struct platform_device *pdev) break; case 4: + wled->has_short_detect = true; rc = wled4_setup(wled); if (rc) { dev_err(&pdev->dev, "wled4_setup failed\n"); @@ -737,6 +858,10 @@ static int wled_probe(struct platform_device *pdev) break; } + rc = wled_configure_short_irq(wled, pdev); + if (rc < 0) + return rc; + val = WLED_DEFAULT_BRIGHTNESS; of_property_read_u32(pdev->dev.of_node, "default-brightness", &val); @@ -750,6 +875,16 @@ static int wled_probe(struct platform_device *pdev) return PTR_ERR_OR_ZERO(bl); }; +static int wled_remove(struct platform_device *pdev) +{ + struct wled *wled = dev_get_drvdata(&pdev->dev); + + mutex_destroy(&wled->lock); + disable_irq(wled->short_irq); + + return 0; +} + static const struct of_device_id wled_match_table[] = { { .compatible = "qcom,pm8941-wled", .data = (void *)3 }, { .compatible = "qcom,pmi8998-wled", .data = (void *)4 }, @@ -760,6 +895,7 @@ static int wled_probe(struct platform_device *pdev) static struct platform_driver wled_driver = { .probe = wled_probe, + .remove = wled_remove, .driver = { .name = "qcom,wled", .of_match_table = wled_match_table, -- 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:03 +0000 Subject: [PATCH V10 7/8] backlight: qcom-wled: add support for short circuit handling. Message-Id: <1572589624-6095-8-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 Handle the short circuit interrupt and check if the short circuit interrupt is valid. Re-enable the module to check if it goes away. Disable the module altogether if the short circuit event persists. Signed-off-by: Kiran Gunda Reviewed-by: Bjorn Andersson Reviewed-by: Daniel Thompson --- drivers/video/backlight/qcom-wled.c | 144 +++++++++++++++++++++++++++++++++++- 1 file changed, 140 insertions(+), 4 deletions(-) diff --git a/drivers/video/backlight/qcom-wled.c b/drivers/video/backlight/qcom-wled.c index 5386ca9..658b1e0 100644 --- a/drivers/video/backlight/qcom-wled.c +++ b/drivers/video/backlight/qcom-wled.c @@ -2,6 +2,9 @@ /* Copyright (c) 2015, Sony Mobile Communications, AB. */ +#include +#include +#include #include #include #include @@ -56,6 +59,16 @@ #define WLED3_SINK_REG_STR_CABC(n) (0x66 + (n * 0x10)) #define WLED3_SINK_REG_STR_CABC_MASK BIT(7) +/* WLED4 specific control registers */ +#define WLED4_CTRL_REG_SHORT_PROTECT 0x5e +#define WLED4_CTRL_REG_SHORT_EN_MASK BIT(7) + +#define WLED4_CTRL_REG_SEC_ACCESS 0xd0 +#define WLED4_CTRL_REG_SEC_UNLOCK 0xa5 + +#define WLED4_CTRL_REG_TEST1 0xe2 +#define WLED4_CTRL_REG_TEST1_EXT_FET_DTEST2 0x09 + /* WLED4 specific sink registers */ #define WLED4_SINK_REG_CURR_SINK 0x46 #define WLED4_SINK_REG_CURR_SINK_MASK GENMASK(7, 4) @@ -105,17 +118,24 @@ struct wled_config { bool cs_out_en; bool ext_gen; bool cabc; + bool external_pfet; }; struct wled { const char *name; struct device *dev; struct regmap *regmap; + struct mutex lock; /* Lock to avoid race from thread irq handler */ + ktime_t last_short_event; u16 ctrl_addr; u16 sink_addr; u16 max_string_count; u32 brightness; u32 max_brightness; + u32 short_count; + bool disabled_by_short; + bool has_short_detect; + int short_irq; struct wled_config cfg; int (*wled_set_brightness)(struct wled *wled, u16 brightness); @@ -166,6 +186,9 @@ static int wled_module_enable(struct wled *wled, int val) { int rc; + if (wled->disabled_by_short) + return -ENXIO; + rc = regmap_update_bits(wled->regmap, wled->ctrl_addr + WLED3_CTRL_REG_MOD_EN, WLED3_CTRL_REG_MOD_EN_MASK, @@ -202,18 +225,19 @@ static int wled_update_status(struct backlight_device *bl) bl->props.state & BL_CORE_FBBLANK) brightness = 0; + mutex_lock(&wled->lock); if (brightness) { rc = wled->wled_set_brightness(wled, brightness); if (rc < 0) { dev_err(wled->dev, "wled failed to set brightness rc:%d\n", rc); - return rc; + goto unlock_mutex; } rc = wled_sync_toggle(wled); if (rc < 0) { dev_err(wled->dev, "wled sync failed rc:%d\n", rc); - return rc; + goto unlock_mutex; } } @@ -221,15 +245,61 @@ static int wled_update_status(struct backlight_device *bl) rc = wled_module_enable(wled, !!brightness); if (rc < 0) { dev_err(wled->dev, "wled enable failed rc:%d\n", rc); - return rc; + goto unlock_mutex; } } wled->brightness = brightness; +unlock_mutex: + mutex_unlock(&wled->lock); + return rc; } +#define WLED_SHORT_DLY_MS 20 +#define WLED_SHORT_CNT_MAX 5 +#define WLED_SHORT_RESET_CNT_DLY_US USEC_PER_SEC + +static irqreturn_t wled_short_irq_handler(int irq, void *_wled) +{ + struct wled *wled = _wled; + int rc; + s64 elapsed_time; + + wled->short_count++; + mutex_lock(&wled->lock); + rc = wled_module_enable(wled, false); + if (rc < 0) { + dev_err(wled->dev, "wled disable failed rc:%d\n", rc); + goto unlock_mutex; + } + + elapsed_time = ktime_us_delta(ktime_get(), + wled->last_short_event); + if (elapsed_time > WLED_SHORT_RESET_CNT_DLY_US) + wled->short_count = 1; + + if (wled->short_count > WLED_SHORT_CNT_MAX) { + dev_err(wled->dev, "Short trigged %d times, disabling WLED forever!\n", + wled->short_count); + wled->disabled_by_short = true; + goto unlock_mutex; + } + + wled->last_short_event = ktime_get(); + + msleep(WLED_SHORT_DLY_MS); + rc = wled_module_enable(wled, true); + if (rc < 0) + dev_err(wled->dev, "wled enable failed rc:%d\n", rc); + +unlock_mutex: + mutex_unlock(&wled->lock); + + return IRQ_HANDLED; +} + static int wled3_setup(struct wled *wled) { u16 addr; @@ -318,7 +388,7 @@ static int wled4_setup(struct wled *wled) int rc, temp, i, j; u16 addr; u8 sink_en = 0; - u32 sink_cfg = 0; + u32 sink_cfg; rc = regmap_update_bits(wled->regmap, wled->ctrl_addr + WLED3_CTRL_REG_OVP, @@ -340,6 +410,21 @@ static int wled4_setup(struct wled *wled) if (rc < 0) return rc; + if (wled->cfg.external_pfet) { + /* Unlock the secure register access */ + rc = regmap_write(wled->regmap, wled->ctrl_addr + + WLED4_CTRL_REG_SEC_ACCESS, + WLED4_CTRL_REG_SEC_UNLOCK); + if (rc < 0) + return rc; + + rc = regmap_write(wled->regmap, + wled->ctrl_addr + WLED4_CTRL_REG_TEST1, + WLED4_CTRL_REG_TEST1_EXT_FET_DTEST2); + if (rc < 0) + return rc; + } + rc = regmap_read(wled->regmap, wled->sink_addr + WLED4_SINK_REG_CURR_SINK, &sink_cfg); if (rc < 0) @@ -425,6 +510,7 @@ static int wled4_setup(struct wled *wled) .num_strings = 4, .switch_freq = 11, .cabc = false, + .external_pfet = false, }; static const u32 wled3_boost_i_limit_values[] = { @@ -590,6 +676,7 @@ static int wled_configure(struct wled *wled, int version) { "qcom,cs-out", &cfg->cs_out_en, }, { "qcom,ext-gen", &cfg->ext_gen, }, { "qcom,cabc", &cfg->cabc, }, + { "qcom,external-pfet", &cfg->external_pfet, }, }; prop_addr = of_get_address(dev->of_node, 0, NULL, NULL); @@ -678,6 +765,38 @@ static int wled_configure(struct wled *wled, int version) return 0; } +static int wled_configure_short_irq(struct wled *wled, + struct platform_device *pdev) +{ + int rc; + + if (!wled->has_short_detect) + return 0; + + rc = regmap_update_bits(wled->regmap, wled->ctrl_addr + + WLED4_CTRL_REG_SHORT_PROTECT, + WLED4_CTRL_REG_SHORT_EN_MASK, + WLED4_CTRL_REG_SHORT_EN_MASK); + if (rc < 0) + return rc; + + wled->short_irq = platform_get_irq_byname(pdev, "short"); + if (wled->short_irq < 0) { + dev_dbg(&pdev->dev, "short irq is not used\n"); + return 0; + } + + rc = devm_request_threaded_irq(wled->dev, wled->short_irq, + NULL, wled_short_irq_handler, + IRQF_ONESHOT, + "wled_short_irq", wled); + if (rc < 0) + dev_err(wled->dev, "Unable to request short_irq (err:%d)\n", + rc); + + return rc; +} + static const struct backlight_ops wled_ops = { .update_status = wled_update_status, }; @@ -711,6 +830,7 @@ static int wled_probe(struct platform_device *pdev) return -ENODEV; } + mutex_init(&wled->lock); rc = wled_configure(wled, version); if (rc) return rc; @@ -725,6 +845,7 @@ static int wled_probe(struct platform_device *pdev) break; case 4: + wled->has_short_detect = true; rc = wled4_setup(wled); if (rc) { dev_err(&pdev->dev, "wled4_setup failed\n"); @@ -737,6 +858,10 @@ static int wled_probe(struct platform_device *pdev) break; } + rc = wled_configure_short_irq(wled, pdev); + if (rc < 0) + return rc; + val = WLED_DEFAULT_BRIGHTNESS; of_property_read_u32(pdev->dev.of_node, "default-brightness", &val); @@ -750,6 +875,16 @@ static int wled_probe(struct platform_device *pdev) return PTR_ERR_OR_ZERO(bl); }; +static int wled_remove(struct platform_device *pdev) +{ + struct wled *wled = dev_get_drvdata(&pdev->dev); + + mutex_destroy(&wled->lock); + disable_irq(wled->short_irq); + + return 0; +} + static const struct of_device_id wled_match_table[] = { { .compatible = "qcom,pm8941-wled", .data = (void *)3 }, { .compatible = "qcom,pmi8998-wled", .data = (void *)4 }, @@ -760,6 +895,7 @@ static int wled_probe(struct platform_device *pdev) static struct platform_driver wled_driver = { .probe = wled_probe, + .remove = wled_remove, .driver = { .name = "qcom,wled", .of_match_table = wled_match_table, -- 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=-9.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, 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 40A7FCA9EC9 for ; Fri, 1 Nov 2019 08:10:03 +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 1CABE208E3 for ; Fri, 1 Nov 2019 08:10:03 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1CABE208E3 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 E13686F745; Fri, 1 Nov 2019 08:09:55 +0000 (UTC) Received: from smtp.codeaurora.org (smtp.codeaurora.org [198.145.29.96]) by gabe.freedesktop.org (Postfix) with ESMTPS id C1E326F6FF for ; Fri, 1 Nov 2019 06:28:23 +0000 (UTC) Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 9FFE760F81; Fri, 1 Nov 2019 06:28:23 +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 601B360F32; Fri, 1 Nov 2019 06:28:13 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 601B360F32 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 7/8] backlight: qcom-wled: add support for short circuit handling. Date: Fri, 1 Nov 2019 11:57:03 +0530 Message-Id: <1572589624-6095-8-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=1572589703; bh=wDNMjb0wqoOUV2dlwuv5kKKe9KtTtq+MXT2r8rru0t0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TbNEntB1INlm8sDYEnsu1xVIbSTUSIGpNHmRKyVoKflBHar5dxTrhnCiKaAERgRW2 IQ7PWQY+GaH8/HXfqptc3YViE3TS2Okk+n1vEqcTOnLgixnf9iqI44qINytP6T/GkY qkE6ELDZKI5xW8qZ5kjnNOPNHR7eW4rkWUtYDv20= X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1572589698; bh=wDNMjb0wqoOUV2dlwuv5kKKe9KtTtq+MXT2r8rru0t0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=V3R79C4IJe6yV6KFTZwk1xvXXO4QQPtR7bwQdN4f+bvahJ0v7oMn7wWc5XjFaERXQ DabvGDJii/v0KFl8reDlPQ7MQ8p7Lt+6QWBhjbPYvMC/trebbvfrSF++DmSS3PtPXB ll07T8SwoMH1WoP4PJBwT4YFxvoUNCWsyNnFxAl0= 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: <20191101062703.7Jp6qm6Iz5E8ypNEl_lucNJ03HRYD8NQw1L49AXlFNY@z> SGFuZGxlIHRoZSBzaG9ydCBjaXJjdWl0IGludGVycnVwdCBhbmQgY2hlY2sgaWYgdGhlIHNob3J0 IGNpcmN1aXQKaW50ZXJydXB0IGlzIHZhbGlkLiBSZS1lbmFibGUgdGhlIG1vZHVsZSB0byBjaGVj ayBpZiBpdCBnb2VzCmF3YXkuIERpc2FibGUgdGhlIG1vZHVsZSBhbHRvZ2V0aGVyIGlmIHRoZSBz aG9ydCBjaXJjdWl0IGV2ZW50CnBlcnNpc3RzLgoKU2lnbmVkLW9mZi1ieTogS2lyYW4gR3VuZGEg PGtndW5kYUBjb2RlYXVyb3JhLm9yZz4KUmV2aWV3ZWQtYnk6IEJqb3JuIEFuZGVyc3NvbiA8Ympv cm4uYW5kZXJzc29uQGxpbmFyby5vcmc+ClJldmlld2VkLWJ5OiBEYW5pZWwgVGhvbXBzb24gPGRh bmllbC50aG9tcHNvbkBsaW5hcm8ub3JnPgotLS0KIGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3Fj b20td2xlZC5jIHwgMTQ0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQogMSBm aWxlIGNoYW5nZWQsIDE0MCBpbnNlcnRpb25zKCspLCA0IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdp dCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3Fjb20td2xlZC5jIGIvZHJpdmVycy92aWRlby9i YWNrbGlnaHQvcWNvbS13bGVkLmMKaW5kZXggNTM4NmNhOS4uNjU4YjFlMCAxMDA2NDQKLS0tIGEv ZHJpdmVycy92aWRlby9iYWNrbGlnaHQvcWNvbS13bGVkLmMKKysrIGIvZHJpdmVycy92aWRlby9i YWNrbGlnaHQvcWNvbS13bGVkLmMKQEAgLTIsNiArMiw5IEBACiAvKiBDb3B5cmlnaHQgKGMpIDIw MTUsIFNvbnkgTW9iaWxlIENvbW11bmljYXRpb25zLCBBQi4KICAqLwogCisjaW5jbHVkZSA8bGlu dXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51 eC9rdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jh Y2tsaWdodC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNTYsNiArNTksMTYgQEAK ICNkZWZpbmUgV0xFRDNfU0lOS19SRUdfU1RSX0NBQkMobikJCQkoMHg2NiArIChuICogMHgxMCkp CiAjZGVmaW5lICBXTEVEM19TSU5LX1JFR19TVFJfQ0FCQ19NQVNLCQkJQklUKDcpCiAKKy8qIFdM RUQ0IHNwZWNpZmljIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFdMRUQ0X0NUUkxfUkVH X1NIT1JUX1BST1RFQ1QJCQkweDVlCisjZGVmaW5lICBXTEVENF9DVFJMX1JFR19TSE9SVF9FTl9N QVNLCQkJQklUKDcpCisKKyNkZWZpbmUgV0xFRDRfQ1RSTF9SRUdfU0VDX0FDQ0VTUwkJCTB4ZDAK KyNkZWZpbmUgIFdMRUQ0X0NUUkxfUkVHX1NFQ19VTkxPQ0sJCQkweGE1CisKKyNkZWZpbmUgV0xF RDRfQ1RSTF9SRUdfVEVTVDEJCQkJMHhlMgorI2RlZmluZSAgV0xFRDRfQ1RSTF9SRUdfVEVTVDFf RVhUX0ZFVF9EVEVTVDIJCTB4MDkKKwogLyogV0xFRDQgc3BlY2lmaWMgc2luayByZWdpc3RlcnMg Ki8KICNkZWZpbmUgV0xFRDRfU0lOS19SRUdfQ1VSUl9TSU5LCQkJMHg0NgogI2RlZmluZSAgV0xF RDRfU0lOS19SRUdfQ1VSUl9TSU5LX01BU0sJCQlHRU5NQVNLKDcsIDQpCkBAIC0xMDUsMTcgKzEx OCwyNCBAQCBzdHJ1Y3Qgd2xlZF9jb25maWcgewogCWJvb2wgY3Nfb3V0X2VuOwogCWJvb2wgZXh0 X2dlbjsKIAlib29sIGNhYmM7CisJYm9vbCBleHRlcm5hbF9wZmV0OwogfTsKIAogc3RydWN0IHds ZWQgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBy ZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsJLyogTG9jayB0byBhdm9pZCByYWNl IGZyb20gdGhyZWFkIGlycSBoYW5kbGVyICovCisJa3RpbWVfdCBsYXN0X3Nob3J0X2V2ZW50Owog CXUxNiBjdHJsX2FkZHI7CiAJdTE2IHNpbmtfYWRkcjsKIAl1MTYgbWF4X3N0cmluZ19jb3VudDsK IAl1MzIgYnJpZ2h0bmVzczsKIAl1MzIgbWF4X2JyaWdodG5lc3M7CisJdTMyIHNob3J0X2NvdW50 OworCWJvb2wgZGlzYWJsZWRfYnlfc2hvcnQ7CisJYm9vbCBoYXNfc2hvcnRfZGV0ZWN0OworCWlu dCBzaG9ydF9pcnE7CiAKIAlzdHJ1Y3Qgd2xlZF9jb25maWcgY2ZnOwogCWludCAoKndsZWRfc2V0 X2JyaWdodG5lc3MpKHN0cnVjdCB3bGVkICp3bGVkLCB1MTYgYnJpZ2h0bmVzcyk7CkBAIC0xNjYs NiArMTg2LDkgQEAgc3RhdGljIGludCB3bGVkX21vZHVsZV9lbmFibGUoc3RydWN0IHdsZWQgKnds ZWQsIGludCB2YWwpCiB7CiAJaW50IHJjOwogCisJaWYgKHdsZWQtPmRpc2FibGVkX2J5X3Nob3J0 KQorCQlyZXR1cm4gLUVOWElPOworCiAJcmMgPSByZWdtYXBfdXBkYXRlX2JpdHMod2xlZC0+cmVn bWFwLCB3bGVkLT5jdHJsX2FkZHIgKwogCQkJCVdMRUQzX0NUUkxfUkVHX01PRF9FTiwKIAkJCQlX TEVEM19DVFJMX1JFR19NT0RfRU5fTUFTSywKQEAgLTIwMiwxOCArMjI1LDE5IEBAIHN0YXRpYyBp bnQgd2xlZF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCkKIAkgICAg YmwtPnByb3BzLnN0YXRlICYgQkxfQ09SRV9GQkJMQU5LKQogCQlicmlnaHRuZXNzID0gMDsKIAor CW11dGV4X2xvY2soJndsZWQtPmxvY2spOwogCWlmIChicmlnaHRuZXNzKSB7CiAJCXJjID0gd2xl ZC0+d2xlZF9zZXRfYnJpZ2h0bmVzcyh3bGVkLCBicmlnaHRuZXNzKTsKIAkJaWYgKHJjIDwgMCkg ewogCQkJZGV2X2Vycih3bGVkLT5kZXYsICJ3bGVkIGZhaWxlZCB0byBzZXQgYnJpZ2h0bmVzcyBy YzolZFxuIiwKIAkJCQlyYyk7Ci0JCQlyZXR1cm4gcmM7CisJCQlnb3RvIHVubG9ja19tdXRleDsK IAkJfQogCiAJCXJjID0gd2xlZF9zeW5jX3RvZ2dsZSh3bGVkKTsKIAkJaWYgKHJjIDwgMCkgewog CQkJZGV2X2Vycih3bGVkLT5kZXYsICJ3bGVkIHN5bmMgZmFpbGVkIHJjOiVkXG4iLCByYyk7Ci0J CQlyZXR1cm4gcmM7CisJCQlnb3RvIHVubG9ja19tdXRleDsKIAkJfQogCX0KIApAQCAtMjIxLDE1 ICsyNDUsNjEgQEAgc3RhdGljIGludCB3bGVkX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdo dF9kZXZpY2UgKmJsKQogCQlyYyA9IHdsZWRfbW9kdWxlX2VuYWJsZSh3bGVkLCAhIWJyaWdodG5l c3MpOwogCQlpZiAocmMgPCAwKSB7CiAJCQlkZXZfZXJyKHdsZWQtPmRldiwgIndsZWQgZW5hYmxl IGZhaWxlZCByYzolZFxuIiwgcmMpOwotCQkJcmV0dXJuIHJjOworCQkJZ290byB1bmxvY2tfbXV0 ZXg7CiAJCX0KIAl9CiAKIAl3bGVkLT5icmlnaHRuZXNzID0gYnJpZ2h0bmVzczsKIAordW5sb2Nr X211dGV4OgorCW11dGV4X3VubG9jaygmd2xlZC0+bG9jayk7CisKIAlyZXR1cm4gcmM7CiB9CiAK KyNkZWZpbmUgV0xFRF9TSE9SVF9ETFlfTVMJCQkyMAorI2RlZmluZSBXTEVEX1NIT1JUX0NOVF9N QVgJCQk1CisjZGVmaW5lIFdMRURfU0hPUlRfUkVTRVRfQ05UX0RMWV9VUwkJVVNFQ19QRVJfU0VD CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3bGVkX3Nob3J0X2lycV9oYW5kbGVyKGludCBpcnEsIHZv aWQgKl93bGVkKQoreworCXN0cnVjdCB3bGVkICp3bGVkID0gX3dsZWQ7CisJaW50IHJjOworCXM2 NCBlbGFwc2VkX3RpbWU7CisKKwl3bGVkLT5zaG9ydF9jb3VudCsrOworCW11dGV4X2xvY2soJnds ZWQtPmxvY2spOworCXJjID0gd2xlZF9tb2R1bGVfZW5hYmxlKHdsZWQsIGZhbHNlKTsKKwlpZiAo cmMgPCAwKSB7CisJCWRldl9lcnIod2xlZC0+ZGV2LCAid2xlZCBkaXNhYmxlIGZhaWxlZCByYzol ZFxuIiwgcmMpOworCQlnb3RvIHVubG9ja19tdXRleDsKKwl9CisKKwllbGFwc2VkX3RpbWUgPSBr dGltZV91c19kZWx0YShrdGltZV9nZXQoKSwKKwkJCQkgICAgICB3bGVkLT5sYXN0X3Nob3J0X2V2 ZW50KTsKKwlpZiAoZWxhcHNlZF90aW1lID4gV0xFRF9TSE9SVF9SRVNFVF9DTlRfRExZX1VTKQor CQl3bGVkLT5zaG9ydF9jb3VudCA9IDE7CisKKwlpZiAod2xlZC0+c2hvcnRfY291bnQgPiBXTEVE X1NIT1JUX0NOVF9NQVgpIHsKKwkJZGV2X2Vycih3bGVkLT5kZXYsICJTaG9ydCB0cmlnZ2VkICVk IHRpbWVzLCBkaXNhYmxpbmcgV0xFRCBmb3JldmVyIVxuIiwKKwkJCXdsZWQtPnNob3J0X2NvdW50 KTsKKwkJd2xlZC0+ZGlzYWJsZWRfYnlfc2hvcnQgPSB0cnVlOworCQlnb3RvIHVubG9ja19tdXRl eDsKKwl9CisKKwl3bGVkLT5sYXN0X3Nob3J0X2V2ZW50ID0ga3RpbWVfZ2V0KCk7CisKKwltc2xl ZXAoV0xFRF9TSE9SVF9ETFlfTVMpOworCXJjID0gd2xlZF9tb2R1bGVfZW5hYmxlKHdsZWQsIHRy dWUpOworCWlmIChyYyA8IDApCisJCWRldl9lcnIod2xlZC0+ZGV2LCAid2xlZCBlbmFibGUgZmFp bGVkIHJjOiVkXG4iLCByYyk7CisKK3VubG9ja19tdXRleDoKKwltdXRleF91bmxvY2soJndsZWQt PmxvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCiBzdGF0aWMgaW50IHdsZWQzX3Nl dHVwKHN0cnVjdCB3bGVkICp3bGVkKQogewogCXUxNiBhZGRyOwpAQCAtMzE4LDcgKzM4OCw3IEBA IHN0YXRpYyBpbnQgd2xlZDRfc2V0dXAoc3RydWN0IHdsZWQgKndsZWQpCiAJaW50IHJjLCB0ZW1w LCBpLCBqOwogCXUxNiBhZGRyOwogCXU4IHNpbmtfZW4gPSAwOwotCXUzMiBzaW5rX2NmZyA9IDA7 CisJdTMyIHNpbmtfY2ZnOwogCiAJcmMgPSByZWdtYXBfdXBkYXRlX2JpdHMod2xlZC0+cmVnbWFw LAogCQkJCXdsZWQtPmN0cmxfYWRkciArIFdMRUQzX0NUUkxfUkVHX09WUCwKQEAgLTM0MCw2ICs0 MTAsMjEgQEAgc3RhdGljIGludCB3bGVkNF9zZXR1cChzdHJ1Y3Qgd2xlZCAqd2xlZCkKIAlpZiAo cmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKKwlpZiAod2xlZC0+Y2ZnLmV4dGVybmFsX3BmZXQpIHsK KwkJLyogVW5sb2NrIHRoZSBzZWN1cmUgcmVnaXN0ZXIgYWNjZXNzICovCisJCXJjID0gcmVnbWFw X3dyaXRlKHdsZWQtPnJlZ21hcCwgd2xlZC0+Y3RybF9hZGRyICsKKwkJCQkgIFdMRUQ0X0NUUkxf UkVHX1NFQ19BQ0NFU1MsCisJCQkJICBXTEVENF9DVFJMX1JFR19TRUNfVU5MT0NLKTsKKwkJaWYg KHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlyYyA9IHJlZ21hcF93cml0ZSh3bGVkLT5yZWdt YXAsCisJCQkJICB3bGVkLT5jdHJsX2FkZHIgKyBXTEVENF9DVFJMX1JFR19URVNUMSwKKwkJCQkg IFdMRUQ0X0NUUkxfUkVHX1RFU1QxX0VYVF9GRVRfRFRFU1QyKTsKKwkJaWYgKHJjIDwgMCkKKwkJ CXJldHVybiByYzsKKwl9CisKIAlyYyA9IHJlZ21hcF9yZWFkKHdsZWQtPnJlZ21hcCwgd2xlZC0+ c2lua19hZGRyICsKIAkJCSBXTEVENF9TSU5LX1JFR19DVVJSX1NJTkssICZzaW5rX2NmZyk7CiAJ aWYgKHJjIDwgMCkKQEAgLTQyNSw2ICs1MTAsNyBAQCBzdGF0aWMgaW50IHdsZWQ0X3NldHVwKHN0 cnVjdCB3bGVkICp3bGVkKQogCS5udW1fc3RyaW5ncyA9IDQsCiAJLnN3aXRjaF9mcmVxID0gMTEs CiAJLmNhYmMgPSBmYWxzZSwKKwkuZXh0ZXJuYWxfcGZldCA9IGZhbHNlLAogfTsKIAogc3RhdGlj IGNvbnN0IHUzMiB3bGVkM19ib29zdF9pX2xpbWl0X3ZhbHVlc1tdID0gewpAQCAtNTkwLDYgKzY3 Niw3IEBAIHN0YXRpYyBpbnQgd2xlZF9jb25maWd1cmUoc3RydWN0IHdsZWQgKndsZWQsIGludCB2 ZXJzaW9uKQogCQl7ICJxY29tLGNzLW91dCIsICZjZmctPmNzX291dF9lbiwgfSwKIAkJeyAicWNv bSxleHQtZ2VuIiwgJmNmZy0+ZXh0X2dlbiwgfSwKIAkJeyAicWNvbSxjYWJjIiwgJmNmZy0+Y2Fi YywgfSwKKwkJeyAicWNvbSxleHRlcm5hbC1wZmV0IiwgJmNmZy0+ZXh0ZXJuYWxfcGZldCwgfSwK IAl9OwogCiAJcHJvcF9hZGRyID0gb2ZfZ2V0X2FkZHJlc3MoZGV2LT5vZl9ub2RlLCAwLCBOVUxM LCBOVUxMKTsKQEAgLTY3OCw2ICs3NjUsMzggQEAgc3RhdGljIGludCB3bGVkX2NvbmZpZ3VyZShz dHJ1Y3Qgd2xlZCAqd2xlZCwgaW50IHZlcnNpb24pCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBp bnQgd2xlZF9jb25maWd1cmVfc2hvcnRfaXJxKHN0cnVjdCB3bGVkICp3bGVkLAorCQkJCSAgICBz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByYzsKKworCWlmICghd2xlZC0+ aGFzX3Nob3J0X2RldGVjdCkKKwkJcmV0dXJuIDA7CisKKwlyYyA9IHJlZ21hcF91cGRhdGVfYml0 cyh3bGVkLT5yZWdtYXAsIHdsZWQtPmN0cmxfYWRkciArCisJCQkJV0xFRDRfQ1RSTF9SRUdfU0hP UlRfUFJPVEVDVCwKKwkJCQlXTEVENF9DVFJMX1JFR19TSE9SVF9FTl9NQVNLLAorCQkJCVdMRUQ0 X0NUUkxfUkVHX1NIT1JUX0VOX01BU0spOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKwor CXdsZWQtPnNob3J0X2lycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJzaG9ydCIp OworCWlmICh3bGVkLT5zaG9ydF9pcnEgPCAwKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgInNo b3J0IGlycSBpcyBub3QgdXNlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCXJjID0gZGV2bV9y ZXF1ZXN0X3RocmVhZGVkX2lycSh3bGVkLT5kZXYsIHdsZWQtPnNob3J0X2lycSwKKwkJCQkgICAg ICAgTlVMTCwgd2xlZF9zaG9ydF9pcnFfaGFuZGxlciwKKwkJCQkgICAgICAgSVJRRl9PTkVTSE9U LAorCQkJCSAgICAgICAid2xlZF9zaG9ydF9pcnEiLCB3bGVkKTsKKwlpZiAocmMgPCAwKQorCQlk ZXZfZXJyKHdsZWQtPmRldiwgIlVuYWJsZSB0byByZXF1ZXN0IHNob3J0X2lycSAoZXJyOiVkKVxu IiwKKwkJCXJjKTsKKworCXJldHVybiByYzsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNr bGlnaHRfb3BzIHdsZWRfb3BzID0gewogCS51cGRhdGVfc3RhdHVzID0gd2xlZF91cGRhdGVfc3Rh dHVzLAogfTsKQEAgLTcxMSw2ICs4MzAsNyBAQCBzdGF0aWMgaW50IHdsZWRfcHJvYmUoc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJbXV0ZXhf aW5pdCgmd2xlZC0+bG9jayk7CiAJcmMgPSB3bGVkX2NvbmZpZ3VyZSh3bGVkLCB2ZXJzaW9uKTsK IAlpZiAocmMpCiAJCXJldHVybiByYzsKQEAgLTcyNSw2ICs4NDUsNyBAQCBzdGF0aWMgaW50IHds ZWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAkJYnJlYWs7CiAKIAljYXNl IDQ6CisJCXdsZWQtPmhhc19zaG9ydF9kZXRlY3QgPSB0cnVlOwogCQlyYyA9IHdsZWQ0X3NldHVw KHdsZWQpOwogCQlpZiAocmMpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgIndsZWQ0X3NldHVw IGZhaWxlZFxuIik7CkBAIC03MzcsNiArODU4LDEwIEBAIHN0YXRpYyBpbnQgd2xlZF9wcm9iZShz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogCQlicmVhazsKIAl9CiAKKwlyYyA9IHdsZWRf Y29uZmlndXJlX3Nob3J0X2lycSh3bGVkLCBwZGV2KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4g cmM7CisKIAl2YWwgPSBXTEVEX0RFRkFVTFRfQlJJR0hUTkVTUzsKIAlvZl9wcm9wZXJ0eV9yZWFk X3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgImRlZmF1bHQtYnJpZ2h0bmVzcyIsICZ2YWwpOwogCkBA IC03NTAsNiArODc1LDE2IEBAIHN0YXRpYyBpbnQgd2xlZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1f ZGV2aWNlICpwZGV2KQogCXJldHVybiBQVFJfRVJSX09SX1pFUk8oYmwpOwogfTsKIAorc3RhdGlj IGludCB3bGVkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVj dCB3bGVkICp3bGVkID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCisJbXV0ZXhfZGVz dHJveSgmd2xlZC0+bG9jayk7CisJZGlzYWJsZV9pcnEod2xlZC0+c2hvcnRfaXJxKTsKKworCXJl dHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bGVkX21hdGNo X3RhYmxlW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtODk0MS13bGVkIiwgLmRhdGEg PSAodm9pZCAqKTMgfSwKIAl7IC5jb21wYXRpYmxlID0gInFjb20scG1pODk5OC13bGVkIiwgLmRh dGEgPSAodm9pZCAqKTQgfSwKQEAgLTc2MCw2ICs4OTUsNyBAQCBzdGF0aWMgaW50IHdsZWRfcHJv YmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9y bV9kcml2ZXIgd2xlZF9kcml2ZXIgPSB7CiAJLnByb2JlID0gd2xlZF9wcm9iZSwKKwkucmVtb3Zl ID0gd2xlZF9yZW1vdmUsCiAJLmRyaXZlcgk9IHsKIAkJLm5hbWUgPSAicWNvbSx3bGVkIiwKIAkJ Lm9mX21hdGNoX3RhYmxlCT0gd2xlZF9tYXRjaF90YWJsZSwKLS0gClRoZSBRdWFsY29tbSBJbm5v dmF0aW9uIENlbnRlciwgSW5jLiBpcyBhIG1lbWJlciBvZiB0aGUgQ29kZSBBdXJvcmEgRm9ydW0s CiBhIExpbnV4IEZvdW5kYXRpb24gQ29sbGFib3JhdGl2ZSBQcm9qZWN0CgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0 CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3Rv cC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWw=