Received: by 2002:a05:6a10:a841:0:0:0:0 with SMTP id d1csp3406784pxy; Mon, 26 Apr 2021 00:36:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyJuMabLmt/fHfgOgZtWOW7Yermz+uF+bwQa9XRDxQgcTnOyJZvKdPRubCK5P1kzgTpsgsj X-Received: by 2002:a17:90b:907:: with SMTP id bo7mr3601433pjb.114.1619422581334; Mon, 26 Apr 2021 00:36:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619422581; cv=none; d=google.com; s=arc-20160816; b=uAYhiZpzGq9r5bRRHPcyGRrYq9M8GO6C9tucSl1hj13QpYDpYsKMEwxa+tZfRZXM2O 6idH1Kd/oxL3h9t8oc0883FcKURnqzPreuVVppBkne5lyLlhcDs72mmuLTw01Qb+UCSk pXbvhuxO6+RbUapaATL3rX91+ez6dFmC/DbciIShwtlEYDe2bZ9F+j/z/kadey4duw1/ uZ1ygikIhsXC0kTPUAQDx29yp1hdRVae44ve2S0t4GHLV9dlnAthgfCgQhEFXV8AG69r 5k6AN2ZGYyowGZn4th+aMtl15quAiU4s7ug0q0Ean37RQLXu78wclM9UoMdrtyFqzkBF OxFg== 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=9vMs0IElrziXzdYHh+6svY2RfQH3k8xwnQC591roqGo=; b=UUdncFutH20b4+6NwI9+f8Y16UV1YfYXJxkzXr+S7F9+a43HqiDvAG5E1UP8NKKpxZ f7E3weZqU8v1sGMjzN+zqG8WA+QhAuOveOKE1BMo4kCPxdLlInMcCHIQN8EBhwCZ1pfe 2tWx+CbEgClJ3uVjj7NryA5m1TXnq4klZ1qzAf9mScH9ng4sw9xgmtTYnP9uHbfKuPqJ 7uWIyt+600XU1WQk24gdj9qRt9BRxDu3dMyhN0JT+Uv0gSQoid8uvXVe1EEolk8xh7IS nySkM/OLG5i8vD/kh3ArrVk3jWGNWmzeN3Dz2gKkNX9BJeOhx3pSNJfym7VkNMTDy/0q Rtdw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="d/IOn5us"; 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 a1si16367471pgt.444.2021.04.26.00.36.08; Mon, 26 Apr 2021 00:36:21 -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="d/IOn5us"; 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 S232589AbhDZHd2 (ORCPT + 99 others); Mon, 26 Apr 2021 03:33:28 -0400 Received: from mail.kernel.org ([198.145.29.99]:44726 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232627AbhDZHdL (ORCPT ); Mon, 26 Apr 2021 03:33:11 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 26EF36105A; Mon, 26 Apr 2021 07:32:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1619422349; bh=LOlADFzhj9u7N+oW6X7MLeJkJfSO1cq7azF0vxb+kMc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=d/IOn5us08ij8Hs3Suv/m35F6gGSavEn6ftxGt9XWXBiOuwBFpX+9i5kJWMxRJF8O 0+G5hYz6Y5Iegu6o9BpNnzCwbCcUG8Lb60z+EyuksUpqSe4l/f1Ipw5LZ6g7ACsZJR sngTYPshNX9Xwt3+vVVXWGDBuAEPLyKCS/ygxR9Y= 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 4.9 02/37] Input: nspire-keypad - enable interrupts only when opened Date: Mon, 26 Apr 2021 09:29:03 +0200 Message-Id: <20210426072817.328747114@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210426072817.245304364@linuxfoundation.org> References: <20210426072817.245304364@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 7abfd34eb87e..bcec72367c1d 100644 --- a/drivers/input/keyboard/nspire-keypad.c +++ b/drivers/input/keyboard/nspire-keypad.c @@ -96,9 +96,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) @@ -124,30 +130,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; } @@ -155,6 +137,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); } @@ -215,6 +202,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