Received: by 2002:a05:6a10:17d3:0:0:0:0 with SMTP id hz19csp2673893pxb; Mon, 19 Apr 2021 10:57:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyBGmQCghUCTQjoV2PRsh9wl9/KaCpcBqOUcRS0G9jGTk4CFS/iGk6GEpqGjYwNJppXnNuH X-Received: by 2002:a17:906:4004:: with SMTP id v4mr7666649ejj.278.1618855058980; Mon, 19 Apr 2021 10:57:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618855058; cv=none; d=google.com; s=arc-20160816; b=QwNWWpU5ZUOd88xXBwkoX3HiZgPwillSg/VkLwl90VFpRfuqluJlFCQQ9McVXZkoq1 aJBMiWjkK7ws+Hum1tqW4jkZrIHhBjWpGbY+zwy2QETmsJmQMCGXkl7gdagF7Xq+GigR ZShaVn5UgCYyYtIe0wNNJU7xejyNqSkS4Jjp5p4DrOKn3KdnEV5M/07aqee0FWXhFowA fLjfH/bhL33fy7EROXkxveJ8FeNo7oKH8nopA7HI6uprZb7z2w1JLU/BGHZPDXMxg0QK Vm63VoybNkmUTQ8TW7Ka/Pnx/FnSSgCGpVabTzaQ7dqrnqjrbDyC42v1swVN6p5PE8p2 5mpA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=gP8vpFNEGxUiLASNxS+ZoEdFcF+ds4cfU76YVmU9AlE=; b=HtQ99GHb9LLJGoeVddN/d1jEYK3eHzWdznKunK3ZPbgKsVWqK++zSJJrKR9ZFHUqx7 J5cBr/8ZqK78U7SFokTsGWVAJFoF76OiAlRz5u4WX6BFZCFyKIa51HD0+tA9vx0um1qy UAeLTF6y8NvM5NatMrTFaV9ZbeD4Y6ZFCDVxNVOMajdKrSkGKZKbCvjwG/JXN1UCDfU6 TE3ZwE5kSYSM0kY2CLXE0PSOGbUQZpkO0o/BqQGDzZQDvbKIY8dIDKcOm64iMLttyVp8 deu8YK2a7PmfutiDIB2dvQipEigs3D3OIwknqgnm+p3ldG5I7tn7tByX2TLNfz6GN5Fd PpOg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="nmVEi/74"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dm17si9924162edb.190.2021.04.19.10.57.14; Mon, 19 Apr 2021 10:57:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="nmVEi/74"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241421AbhDSNbj (ORCPT + 99 others); Mon, 19 Apr 2021 09:31:39 -0400 Received: from mail.kernel.org ([198.145.29.99]:33848 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241588AbhDSNW5 (ORCPT ); Mon, 19 Apr 2021 09:22:57 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id A183861288; Mon, 19 Apr 2021 13:18:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1618838297; bh=JoSR1JmAXLHjSDwAvnHt+5pIu1kPY4eYIQXc4w8Eo1c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nmVEi/74B9HUxv9nwD1B/sFkkUxZzFpVS96HWkM61CwoGvcfJkoJf2BXUyuTPX65+ uDMnGBbjwAqv3EYt+6Rb+eT9N0io9NnZWQ4jSmAdb8xLcnkLL+3csbJg3CgHowcjJ+ rRSWJUmkildiT9Mk2kn1vErWjjndDT4/AUN6P0l8= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Fabian Vogt , Dmitry Torokhov , Sasha Levin Subject: [PATCH 5.4 10/73] Input: nspire-keypad - enable interrupts only when opened Date: Mon, 19 Apr 2021 15:06:01 +0200 Message-Id: <20210419130524.156086799@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210419130523.802169214@linuxfoundation.org> References: <20210419130523.802169214@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Fabian Vogt [ Upstream commit 69d5ff3e9e51e23d5d81bf48480aa5671be67a71 ] The driver registers an interrupt handler in _probe, but didn't configure them until later when the _open function is called. In between, the keypad can fire an IRQ due to touchpad activity, which the handler ignores. This causes the kernel to disable the interrupt, blocking the keypad from working. Fix this by disabling interrupts before registering the handler. Additionally, disable them in _close, so that they're only enabled while open. Fixes: fc4f31461892 ("Input: add TI-Nspire keypad support") Signed-off-by: Fabian Vogt Link: https://lore.kernel.org/r/3383725.iizBOSrK1V@linux-e202.suse.de Signed-off-by: Dmitry Torokhov Signed-off-by: Sasha Levin --- drivers/input/keyboard/nspire-keypad.c | 56 ++++++++++++++------------ 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/drivers/input/keyboard/nspire-keypad.c b/drivers/input/keyboard/nspire-keypad.c index 63d5e488137d..e9fa1423f136 100644 --- a/drivers/input/keyboard/nspire-keypad.c +++ b/drivers/input/keyboard/nspire-keypad.c @@ -93,9 +93,15 @@ static irqreturn_t nspire_keypad_irq(int irq, void *dev_id) return IRQ_HANDLED; } -static int nspire_keypad_chip_init(struct nspire_keypad *keypad) +static int nspire_keypad_open(struct input_dev *input) { + struct nspire_keypad *keypad = input_get_drvdata(input); unsigned long val = 0, cycles_per_us, delay_cycles, row_delay_cycles; + int error; + + error = clk_prepare_enable(keypad->clk); + if (error) + return error; cycles_per_us = (clk_get_rate(keypad->clk) / 1000000); if (cycles_per_us == 0) @@ -121,30 +127,6 @@ static int nspire_keypad_chip_init(struct nspire_keypad *keypad) keypad->int_mask = 1 << 1; writel(keypad->int_mask, keypad->reg_base + KEYPAD_INTMSK); - /* Disable GPIO interrupts to prevent hanging on touchpad */ - /* Possibly used to detect touchpad events */ - writel(0, keypad->reg_base + KEYPAD_UNKNOWN_INT); - /* Acknowledge existing interrupts */ - writel(~0, keypad->reg_base + KEYPAD_UNKNOWN_INT_STS); - - return 0; -} - -static int nspire_keypad_open(struct input_dev *input) -{ - struct nspire_keypad *keypad = input_get_drvdata(input); - int error; - - error = clk_prepare_enable(keypad->clk); - if (error) - return error; - - error = nspire_keypad_chip_init(keypad); - if (error) { - clk_disable_unprepare(keypad->clk); - return error; - } - return 0; } @@ -152,6 +134,11 @@ static void nspire_keypad_close(struct input_dev *input) { struct nspire_keypad *keypad = input_get_drvdata(input); + /* Disable interrupts */ + writel(0, keypad->reg_base + KEYPAD_INTMSK); + /* Acknowledge existing interrupts */ + writel(~0, keypad->reg_base + KEYPAD_INT); + clk_disable_unprepare(keypad->clk); } @@ -210,6 +197,25 @@ static int nspire_keypad_probe(struct platform_device *pdev) return -ENOMEM; } + error = clk_prepare_enable(keypad->clk); + if (error) { + dev_err(&pdev->dev, "failed to enable clock\n"); + return error; + } + + /* Disable interrupts */ + writel(0, keypad->reg_base + KEYPAD_INTMSK); + /* Acknowledge existing interrupts */ + writel(~0, keypad->reg_base + KEYPAD_INT); + + /* Disable GPIO interrupts to prevent hanging on touchpad */ + /* Possibly used to detect touchpad events */ + writel(0, keypad->reg_base + KEYPAD_UNKNOWN_INT); + /* Acknowledge existing GPIO interrupts */ + writel(~0, keypad->reg_base + KEYPAD_UNKNOWN_INT_STS); + + clk_disable_unprepare(keypad->clk); + input_set_drvdata(input, keypad); input->id.bustype = BUS_HOST; -- 2.30.2