Received: by 2002:a05:6a10:17d3:0:0:0:0 with SMTP id hz19csp2538838pxb; Mon, 19 Apr 2021 08:01:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy1v1bpsh90l+kUwL1RYVu+Cs0fX/ccwoKGo2AgoReEYK0D21OnFTc2fKF00WPQnB/y9Qqe X-Received: by 2002:a05:600c:19d3:: with SMTP id u19mr9975769wmq.80.1618844511738; Mon, 19 Apr 2021 08:01:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618844511; cv=none; d=google.com; s=arc-20160816; b=WDjKmxxiFroX6N4caWXUmguNH6KbwOcMPl/M00ewqCFzG0Q1r70cQsWv7UreQpvGGq 3BiKOinn6h0KKjJUTKIxg9LZ2xSVZJxrgYS+rsEH7iQ9UJy3JfFbJDkSZbDsOLmXap/V ajsoI8R62UgaXnuKytitTyIZVLYjAlu1KN/ayLx5TfPuXwiQSkYgqqLdEjeD1s3DIzH2 MiCBVUxWU7slxLJfhVw/lXXFvU/4+g/otcJxz4li9PpHGxXGX54lMw+toJ4wD48v0Cfr CHrUOLGJNDKpd1jznVcbN5ZtyKqPEfg8sNGBXyChUfDFHOpFXTpQReLmgeF+DqESTlLB 6mfw== 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=e86fZvxxMjXY3opy90gXodAbrBWRDBUediJ6CVg8S/O/iJq5P3cR1kZAf4k/W3OeRW sRr81nty/Tt+uD5EqQ0SqQ/vV0+lGeZh7JRqagdOQpnrM+F343OJgkZ9yDmvIjZpJzLo QRNoJOgJ0SG40MZ9Q6xyAeKDpLmYHNgLrGS2fPSMyblx8hwelx0nfiHzLnXJfcRJgEXe gRjLr0IojXuvYzFFn9GpuyyPkZQG+xcZfcdmrJOKbuzqHLmBePMnMhqrUtrhR4A79ovc +bmtyED0hYIR7HD4t8Kq7CuPfvuXlYK0e0aNOrYWMw65LPf8WYnZgKer1DlDiL8F1Udm PDPQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=eZlqn51Y; 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 da8si12815809edb.320.2021.04.19.08.01.27; Mon, 19 Apr 2021 08:01:51 -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=eZlqn51Y; 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 S239824AbhDSNLt (ORCPT + 99 others); Mon, 19 Apr 2021 09:11:49 -0400 Received: from mail.kernel.org ([198.145.29.99]:43832 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239468AbhDSNI7 (ORCPT ); Mon, 19 Apr 2021 09:08:59 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 698E26127C; Mon, 19 Apr 2021 13:08:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1618837710; bh=JoSR1JmAXLHjSDwAvnHt+5pIu1kPY4eYIQXc4w8Eo1c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eZlqn51YRjhPiFGCmFY8ZoP2GSCDjcHPV3VEw1MCVnNw2LGny07f7Q86vaSLgertl ykbw3zPmhdQC9/GLkp6hcr0oeGWWz1/x5d1V+ETU9eMV+U9pKx0ay7NcZKn/DTf9A7 N9SUlll7e3SKjxrK8eiq3TQhJM143p5FvNUs3oe4= 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.11 005/122] Input: nspire-keypad - enable interrupts only when opened Date: Mon, 19 Apr 2021 15:04:45 +0200 Message-Id: <20210419130530.356282695@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210419130530.166331793@linuxfoundation.org> References: <20210419130530.166331793@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