Received: by 10.192.165.148 with SMTP id m20csp5098892imm; Tue, 8 May 2018 22:18:01 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqIYrfdHIxGg6QBa9NL3xNHZkzyHndsHh1VqDfVYHfiKDfsEl5vbO+3C67Wc80RjcwthH/6 X-Received: by 10.98.137.16 with SMTP id v16mr41962917pfd.13.1525843081870; Tue, 08 May 2018 22:18:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525843081; cv=none; d=google.com; s=arc-20160816; b=wpAvWe3GnGWV+rVINN/jdnaFPFygsEE9J1Bkg1sUYkKfSEXBfy74pK/lK2AV+FYUdF 1ZNzYTtS9zTESYydKvoEGX9pFU60GLyqUap2FTC3cEYPF8TwlUm/R5C/AYs4bU9xwzKa LCQiNHhW5/tfrGKYJxNiMr9Qfyy3shqd++PzciYlccsVDT8Y1OumyWHLvCWbT8b0yiUx 9ZaMVX83K/rz5l2pWSZ10SDekLzF2K2iQiKZbvTomrUbRaY4moXKzaB89NziHnc6n/LG sW7yzDBnFps/XF518ycOg/R3mBWts/It3pglLUbBLvAB8MGSCql0zTCbLvDE6RIhUwDS tZjw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:message-id:references :in-reply-to:subject:cc:to:from:date:content-transfer-encoding :mime-version:dkim-signature:dkim-signature :arc-authentication-results; bh=9hnaRHYzACpTj6WQNwa0FaV4v4rRvuVE0+3q1Lz43Do=; b=EDnbwwfOKGH634eU2AWUNMz6+uHDEKR5+yA9c65MZzwmyL91lulSR8Mi2/o7kT3nww iMBQnNnytMBz28rjZNA2z5TJfnEPGW5NwLig55+5lyuZKcNSOfwbD+zRbJCQzkN36XLp Ycb29nUE03PjwKg5/MlcuPzRYTLcgZTBLEGUYztpVEZbL5qO97Lmuqg8Egbd5DHXJe2H T8dIDSvid8NNyNnNaM0PeGOQd+fIoBl9TUaKx9Eb+R23OiYCGlETB2OGDFu8WzTUTW0S sfg4KOkBwrNtx8mwHa8v/aRQkF75Q95HzhDY+65olPbHJ/9qFEZW4dDGbYR1E25jQPHl BRiQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=Ad1uZU0i; dkim=pass header.i=@codeaurora.org header.s=default header.b=abkbZaSR; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z9-v6si27480121pll.423.2018.05.08.22.17.47; Tue, 08 May 2018 22:18:01 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=Ad1uZU0i; dkim=pass header.i=@codeaurora.org header.s=default header.b=abkbZaSR; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756091AbeEIFRf (ORCPT + 99 others); Wed, 9 May 2018 01:17:35 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:33048 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752802AbeEIFRd (ORCPT ); Wed, 9 May 2018 01:17:33 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id C2DCB60250; Wed, 9 May 2018 05:17:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1525843052; bh=SNlRCACVfUbrhECjP3t+pDLUacr6SE0NwOZTe8TjIxg=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=Ad1uZU0iJZNOD/6CpRro2MpC7PFdQatburJCOpuXkFtB/S8UFFW+tMdbyIbNB3wMK SBtp7qLP8F+ifii3XpE3BXjSSPIzsRiMMXdUQkiB9S+bhbsKe/JOOhii+nP9ETBURt i2EhxPvjjgrDojugkEXlQZ2aY0b66XFV4Eo1KhtE= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from mail.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.codeaurora.org (Postfix) with ESMTP id AC14860250; Wed, 9 May 2018 05:17:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1525843051; bh=SNlRCACVfUbrhECjP3t+pDLUacr6SE0NwOZTe8TjIxg=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=abkbZaSRHKFMjcPq65IUL4Um+wJrDoPlppYJ9nFttJdYJJ4h2WQtySbN5qbaO19k9 soCIbjPI/Brzd9ynuRVc3xX6732pS0XiNpmCk3aRCMmPyUeApQgP1znhtGh0cZjAfZ wvOvktSEy7A8lY0THNDnipdqwnlGWVcc2hKMMuPQ= MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Wed, 09 May 2018 10:47:31 +0530 From: kgunda@codeaurora.org To: Daniel Thompson Cc: bjorn.andersson@linaro.org, Lee Jones , Jingoo Han , Bartlomiej Zolnierkiewicz , dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-leds@vger.kernel.org Subject: Re: [PATCH V2 4/5] backlight: qcom-wled: Add support for OVP interrupt handling In-Reply-To: <20180508103944.qib7ax3sgzhzacmb@holly.lan> References: <1525342352-25072-1-git-send-email-kgunda@codeaurora.org> <1525342352-25072-5-git-send-email-kgunda@codeaurora.org> <20180508103944.qib7ax3sgzhzacmb@holly.lan> Message-ID: X-Sender: kgunda@codeaurora.org User-Agent: Roundcube Webmail/1.2.5 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2018-05-08 16:09, Daniel Thompson wrote: > On Thu, May 03, 2018 at 03:42:31PM +0530, Kiran Gunda wrote: >> WLED peripheral has over voltage protection(OVP) circuitry and the OVP >> fault is notified through an interrupt. Though this fault condition >> rising >> is due to an incorrect hardware configuration is mitigated in the >> hardware, >> it still needs to be detected and handled. Add support for it. > > Why detect and handle it? The interrupt handler doesn't appear to do > anything other than clear the interrupt... and it appears that the > interrupt can be masked. > > Planing to squash this patch with the auto-string-detection patch in the next series, where the OVP is used for the right string detection. >> When WLED module is enabled, keep OVP fault interrupt disabled for 10 >> ms to >> account for soft start delay. >> >> Signed-off-by: Kiran Gunda >> --- >> drivers/video/backlight/qcom-wled.c | 118 >> +++++++++++++++++++++++++++++++++++- >> 1 file changed, 116 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/video/backlight/qcom-wled.c >> b/drivers/video/backlight/qcom-wled.c >> index 2cfba77..80ae084 100644 >> --- a/drivers/video/backlight/qcom-wled.c >> +++ b/drivers/video/backlight/qcom-wled.c >> @@ -23,14 +23,20 @@ >> >> /* From DT binding */ >> #define WLED_DEFAULT_BRIGHTNESS 2048 >> - >> +#define WLED_SOFT_START_DLY_US 10000 >> #define WLED3_SINK_REG_BRIGHT_MAX 0xFFF >> >> /* WLED3 Control registers */ >> #define WLED3_CTRL_REG_FAULT_STATUS 0x08 >> +#define WLED3_CTRL_REG_ILIM_FAULT_BIT BIT(0) >> +#define WLED3_CTRL_REG_OVP_FAULT_BIT BIT(1) >> +#define WLED4_CTRL_REG_SC_FAULT_BIT BIT(2) >> + >> +#define WLED3_CTRL_REG_INT_RT_STS 0x10 >> >> #define WLED3_CTRL_REG_MOD_EN 0x46 >> #define WLED3_CTRL_REG_MOD_EN_MASK BIT(7) >> +#define WLED3_CTRL_REG_MOD_EN_BIT BIT(7) >> >> #define WLED3_CTRL_REG_FREQ 0x4c >> #define WLED3_CTRL_REG_FREQ_MASK GENMASK(3, 0) >> @@ -161,9 +167,12 @@ struct wled { >> u32 short_count; >> const int *version; >> int short_irq; >> + int ovp_irq; >> bool force_mod_disable; >> + bool ovp_irq_disabled; >> >> struct wled_config cfg; >> + struct delayed_work ovp_work; >> int (*wled_set_brightness)(struct wled *wled, u16 brightness); >> int (*wled_sync_toggle)(struct wled *wled); >> }; >> @@ -209,6 +218,32 @@ static int wled4_set_brightness(struct wled >> *wled, u16 brightness) >> return 0; >> } >> >> +static void wled_ovp_work(struct work_struct *work) >> +{ >> + u32 val; >> + int rc; >> + >> + struct wled *wled = container_of(work, >> + struct wled, ovp_work.work); >> + >> + rc = regmap_read(wled->regmap, wled->ctrl_addr + >> WLED3_CTRL_REG_MOD_EN, >> + &val); >> + if (rc < 0) >> + return; >> + >> + if (val & WLED3_CTRL_REG_MOD_EN_BIT) { >> + if (wled->ovp_irq > 0 && wled->ovp_irq_disabled) { >> + enable_irq(wled->ovp_irq); >> + wled->ovp_irq_disabled = false; >> + } >> + } else { >> + if (wled->ovp_irq > 0 && !wled->ovp_irq_disabled) { >> + disable_irq(wled->ovp_irq); >> + wled->ovp_irq_disabled = true; >> + } >> + } >> +} >> + >> static int wled_module_enable(struct wled *wled, int val) >> { >> int rc; >> @@ -220,7 +255,12 @@ static int wled_module_enable(struct wled *wled, >> int val) >> WLED3_CTRL_REG_MOD_EN, >> WLED3_CTRL_REG_MOD_EN_MASK, >> WLED3_CTRL_REG_MOD_EN_MASK); >> - return rc; >> + if (rc < 0) >> + return rc; >> + >> + schedule_delayed_work(&wled->ovp_work, WLED_SOFT_START_DLY_US); >> + >> + return 0; >> } >> >> static int wled3_sync_toggle(struct wled *wled) >> @@ -346,6 +386,36 @@ static irqreturn_t wled_short_irq_handler(int >> irq, void *_wled) >> return IRQ_HANDLED; >> } >> >> +static irqreturn_t wled_ovp_irq_handler(int irq, void *_wled) >> +{ >> + struct wled *wled = _wled; >> + int rc; >> + u32 int_sts, fault_sts; >> + >> + rc = regmap_read(wled->regmap, >> + wled->ctrl_addr + WLED3_CTRL_REG_INT_RT_STS, &int_sts); >> + if (rc < 0) { >> + dev_err(wled->dev, "Error in reading WLED3_INT_RT_STS rc=%d\n", >> + rc); >> + return IRQ_HANDLED; >> + } >> + >> + rc = regmap_read(wled->regmap, wled->ctrl_addr + >> + WLED3_CTRL_REG_FAULT_STATUS, &fault_sts); >> + if (rc < 0) { >> + dev_err(wled->dev, "Error in reading WLED_FAULT_STATUS rc=%d\n", >> + rc); >> + return IRQ_HANDLED; >> + } >> + >> + if (fault_sts & >> + (WLED3_CTRL_REG_OVP_FAULT_BIT | WLED3_CTRL_REG_ILIM_FAULT_BIT)) >> + dev_dbg(wled->dev, "WLED OVP fault detected, int_sts=%x fault_sts= >> %x\n", >> + int_sts, fault_sts); >> + >> + return IRQ_HANDLED; >> +} >> + >> static int wled3_setup(struct wled *wled) >> { >> u16 addr; >> @@ -821,6 +891,44 @@ static int wled_configure_short_irq(struct wled >> *wled, >> return rc; >> } >> >> +static int wled_configure_ovp_irq(struct wled *wled, >> + struct platform_device *pdev) >> +{ >> + int rc = 0; >> + u32 val; >> + >> + if (*wled->version == WLED_PM8941) >> + return 0; >> + >> + wled->ovp_irq = platform_get_irq_byname(pdev, "ovp"); >> + if (wled->ovp_irq < 0) { >> + dev_dbg(&pdev->dev, "ovp irq is not used\n"); >> + return 0; >> + } >> + >> + rc = devm_request_threaded_irq(wled->dev, wled->ovp_irq, NULL, >> + wled_ovp_irq_handler, IRQF_ONESHOT, >> + "wled_ovp_irq", wled); >> + if (rc < 0) { >> + dev_err(wled->dev, "Unable to request ovp_irq (err:%d)\n", >> + rc); >> + return 0; >> + } >> + >> + rc = regmap_read(wled->regmap, wled->ctrl_addr + >> + WLED3_CTRL_REG_MOD_EN, &val); >> + if (rc < 0) >> + return rc; >> + >> + /* Keep OVP irq disabled until module is enabled */ >> + if (!rc && !(val & WLED3_CTRL_REG_MOD_EN_MASK)) { >> + disable_irq(wled->ovp_irq); >> + wled->ovp_irq_disabled = true; >> + } >> + >> + return rc; >> +} >> + >> static const struct backlight_ops wled_ops = { >> .update_status = wled_update_status, >> }; >> @@ -874,10 +982,16 @@ static int wled_probe(struct platform_device >> *pdev) >> } >> } >> >> + INIT_DELAYED_WORK(&wled->ovp_work, wled_ovp_work); >> + >> rc = wled_configure_short_irq(wled, pdev); >> if (rc < 0) >> return rc; >> >> + rc = wled_configure_ovp_irq(wled, pdev); >> + if (rc < 0) >> + return rc; >> + >> val = WLED_DEFAULT_BRIGHTNESS; >> of_property_read_u32(pdev->dev.of_node, "default-brightness", &val); >> >> -- >> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora >> Forum, >> a Linux Foundation Collaborative Project >>