From patchwork Thu Mar 18 05:04:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Evan Benn X-Patchwork-Id: 12147357 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=-17.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,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 93A39C433DB for ; Thu, 18 Mar 2021 05:07:04 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (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 3423064EF2 for ; Thu, 18 Mar 2021 05:07:04 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3423064EF2 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=jjVn6wbTN+PSAY1pNyxDGPXH5U3eO1qN3rCmguYFsNU=; b=Rwj+0OAPaScXLQe/SoHJExXP8 fkkYvoG4ZCqGXa28g7J3k5G3UGIYtfmjde4BUoMjc9MGXl16RP7o/gY8Z8J1iYGkv/i9RZOXBYbza i3Zw/roMqy0Zsid51KHXXhnbgToRn2di62SsRJLxKTzgk9L/ukusJpwWPAVheCc8sqiyp3v76kWA0 jPo2ePXI4S5hSl11+J+wdEDA5Rk2J3B/PA3Iuib9dL7ECV1XIlA4e6yn9nHhtm+tsLL+ejod8sSWC s1AFP6urEOuODDqg/E9L3womriJrgsvTJ+eEEaoEJrVtToeJhscBg7QNovgarBoF5F92Dz/ofZs/Z vw5uiy+CA==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lMkqh-004UQi-E6; Thu, 18 Mar 2021 05:05:31 +0000 Received: from mail-pj1-x1030.google.com ([2607:f8b0:4864:20::1030]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lMkqM-004UMG-0T for linux-arm-kernel@lists.infradead.org; Thu, 18 Mar 2021 05:05:12 +0000 Received: by mail-pj1-x1030.google.com with SMTP id k23-20020a17090a5917b02901043e35ad4aso4343465pji.3 for ; Wed, 17 Mar 2021 22:05:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=7onWsTpSsS7L6q9I9y9OFyM8B5rHSYCwAdPuuzVWDdA=; b=Qo5xIFp0u3RFXcLMywPvucE5stdaYlWfndN3bW9kIk72karyW3dcWY6M+B92+7EbZL S4qI14CpnAiPHmv/EWFcrQPuAeQ8RTV/tp9eD+jDXAyBkLoYZ8Uk1DNPTp6Jr48eMlDq dUeafyf6xDemOZNZWPlJ+4hKIq5egZAAR5b2w= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7onWsTpSsS7L6q9I9y9OFyM8B5rHSYCwAdPuuzVWDdA=; b=tdxxONNq11L4KJrBwsWbPZQZ85QQKWXkfb+evIMexaqs1uwbmj/+IcuZ+2reA6CCCT p0GAzCUiDAra7SKGFB0lNODF+DScOryEnnqDB+BiQIOfOVLoA9L0xMo3NQr128x8HjZE Cm9PuyW7K9pTfJTxw/fvwCE5rmz0co7Zp560C+oIzc8UFXk/CfE9HDopaVbcPDVFQirP E8csZngiMOHjDIotGESOWHzt1HwiHX1jL/kGIIk85IKdkvVp76++qAN/q2GknspCmw8h cheFUfEwWv0YrfxkwIN04epGI3MUi7PXxXtOSuzWEotqDMwK8oBXD4V4vV4bM65yg/mv QTlQ== X-Gm-Message-State: AOAM530NV7OW1k0HguCT9q0WlfjS7vRxFxg0f1woyD6d7sOtaufyoSaV 9Y3YkEz1FJM7jr5VoObOnL4Pjw== X-Google-Smtp-Source: ABdhPJzurdZlUoc6ipkxjFah/4DrB/R5Vj+hTtzkMO+w/3yti/os6EicWmS7hBbyqr3WVdg7KZ35pg== X-Received: by 2002:a17:90b:305:: with SMTP id ay5mr2358668pjb.74.1616043908804; Wed, 17 Mar 2021 22:05:08 -0700 (PDT) Received: from evanbenn1.syd.corp.google.com ([2401:fa00:9:15:d0d6:1466:f005:1b0a]) by smtp.gmail.com with ESMTPSA id e8sm701450pgb.35.2021.03.17.22.05.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Mar 2021 22:05:08 -0700 (PDT) From: Evan Benn To: LKML Cc: Thomas Gleixner , Evan Benn , Yingjoe Chen , Julia Lawall , linux-arm-kernel@lists.infradead.org, Stanley Chu , Daniel Lezcano , Matthias Brugger , Viresh Kumar , Fabien Parent , linux-mediatek@lists.infradead.org, Alexey Klimov Subject: [PATCH 2/2] drivers/clocksource/mediatek: Ack and disable interrupts on shutdown Date: Thu, 18 Mar 2021 16:04:51 +1100 Message-Id: <20210318160414.2.I1d9917047de06715da16e1620759f703fcfdcbcb@changeid> X-Mailer: git-send-email 2.31.0.rc2.261.g7f71774620-goog In-Reply-To: <20210318160414.1.Ia2a09ce93b47eac45308205820db0938d47604df@changeid> References: <20210318160414.1.Ia2a09ce93b47eac45308205820db0938d47604df@changeid> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210318_050510_330705_F40BB237 X-CRM114-Status: GOOD ( 17.64 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org set_state_shutdown is called during system suspend after interrupts have been disabled. If the timer has fired in the meantime, there will be a pending IRQ. So we ack that now and disable the timer. Without this ARM trusted firmware will abort the suspend due to the pending interrupt. Now always disable the IRQ in state transitions, and re-enable in set_periodic and next_event. Signed-off-by: Evan Benn --- drivers/clocksource/timer-mediatek-mt6577.c | 49 +++++++++++++-------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/drivers/clocksource/timer-mediatek-mt6577.c b/drivers/clocksource/timer-mediatek-mt6577.c index 9e5241d1876d..44598121585c 100644 --- a/drivers/clocksource/timer-mediatek-mt6577.c +++ b/drivers/clocksource/timer-mediatek-mt6577.c @@ -54,13 +54,33 @@ static u64 notrace mtk_gpt_read_sched_clock(void) return readl_relaxed(gpt_sched_reg); } +static void mtk_gpt_disable_ack_interrupts(struct timer_of *to, u8 timer) +{ + u32 val; + + /* Disable interrupts */ + val = readl(timer_of_base(to) + GPT_IRQ_EN_REG); + writel(val & ~GPT_IRQ_ENABLE(timer), timer_of_base(to) + + GPT_IRQ_EN_REG); + + /* Ack interrupts */ + writel(GPT_IRQ_ACK(timer), timer_of_base(to) + GPT_IRQ_ACK_REG); +} + static void mtk_gpt_clkevt_time_stop(struct timer_of *to, u8 timer) { u32 val; + /* Disable timer */ val = readl(timer_of_base(to) + GPT_CTRL_REG(timer)); writel(val & ~GPT_CTRL_ENABLE, timer_of_base(to) + GPT_CTRL_REG(timer)); + + /* This may be called with interrupts disabled, + * so we need to ack any interrupt that is pending + * Or for example ATF will prevent a suspend from completing. + */ + mtk_gpt_disable_ack_interrupts(to, timer); } static void mtk_gpt_clkevt_time_setup(struct timer_of *to, @@ -74,8 +94,10 @@ static void mtk_gpt_clkevt_time_start(struct timer_of *to, { u32 val; - /* Acknowledge interrupt */ - writel(GPT_IRQ_ACK(timer), timer_of_base(to) + GPT_IRQ_ACK_REG); + /* Enable interrupts */ + val = readl(timer_of_base(to) + GPT_IRQ_EN_REG); + writel(val | GPT_IRQ_ENABLE(timer), + timer_of_base(to) + GPT_IRQ_EN_REG); val = readl(timer_of_base(to) + GPT_CTRL_REG(timer)); @@ -148,21 +170,6 @@ __init mtk_gpt_setup(struct timer_of *to, u8 timer, u8 option) timer_of_base(to) + GPT_CTRL_REG(timer)); } -static void mtk_gpt_enable_irq(struct timer_of *to, u8 timer) -{ - u32 val; - - /* Disable all interrupts */ - writel(0x0, timer_of_base(to) + GPT_IRQ_EN_REG); - - /* Acknowledge all spurious pending interrupts */ - writel(0x3f, timer_of_base(to) + GPT_IRQ_ACK_REG); - - val = readl(timer_of_base(to) + GPT_IRQ_EN_REG); - writel(val | GPT_IRQ_ENABLE(timer), - timer_of_base(to) + GPT_IRQ_EN_REG); -} - static struct timer_of to = { .flags = TIMER_OF_IRQ | TIMER_OF_BASE | TIMER_OF_CLOCK, @@ -193,6 +200,12 @@ static int __init mtk_gpt_init(struct device_node *node) if (ret) return ret; + /* In case the firmware left the interrupts enabled + * disable and ack those now + */ + mtk_gpt_disable_ack_interrupts(&to, TIMER_CLK_SRC); + mtk_gpt_disable_ack_interrupts(&to, TIMER_CLK_EVT); + /* Configure clock source */ mtk_gpt_setup(&to, TIMER_CLK_SRC, GPT_CTRL_OP_FREERUN); clocksource_mmio_init(timer_of_base(&to) + GPT_CNT_REG(TIMER_CLK_SRC), @@ -206,8 +219,6 @@ static int __init mtk_gpt_init(struct device_node *node) clockevents_config_and_register(&to.clkevt, timer_of_rate(&to), TIMER_SYNC_TICKS, 0xffffffff); - mtk_gpt_enable_irq(&to, TIMER_CLK_EVT); - return 0; } TIMER_OF_DECLARE(mtk_mt6577, "mediatek,mt6577-timer", mtk_gpt_init);