Received: by 2002:aa6:da0e:0:b029:115:a171:fe4c with SMTP id z14csp1262981lkb; Wed, 7 Jul 2021 02:53:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwSYtkGpXlX6bss1WCyMNyDsrko0VX9wqUEtWJ3PdvmdmtS74CfQhlch2DARiFChU1f9uMS X-Received: by 2002:aa7:dd0d:: with SMTP id i13mr16684255edv.97.1625651584208; Wed, 07 Jul 2021 02:53:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625651584; cv=none; d=google.com; s=arc-20160816; b=xZNFd2InjcJvfwzSb0O/BDSfoC09YORGhIE8Z05Ub5Y8KGHcOs8YhxZ5AR9TQGvJ2T SOy9UotFfimaK5CUQJSOXDMYjTMSbrslzoV4Rp3ilz8HmKHtJt7pknUHzi0CVSvg/iCV 7ErmGPrXsIC1EYCYNLtvifLlB2xapucwIj4ncCRxpFq2Y/DZSItBHv60nqUvxJUGDx2y oF6puWwCXZIlRGwuWj7FUZjhiM/HoNug0XOg13d43SqYCzNJwa5KO2b397wMxPQ6I6qW yMSUyyHgObVZAZPfhyPNU9RHX54AVkJGiNwG9qnkhozRv112weY4XdEXIc+Hs/EtRAdl fsvg== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:dkim-signature; bh=7mhnXqm0UEC1qbZWHIpz3smAAHrZY0tVEDn1j/F9XOk=; b=E7mDhBc/lpQht7udgqCSOjvBIfcT8qj7mZQxJWlLd01VtWSmhhv8mm5h111jFY52cH lKa7+vejWXbsQHspUeB26I0iiwZhzPJ2/w7oKfesdaHNM8NGr121SPFmi+zcMY2s6y2E GHRY0K3yemeoIMp7LfqtvOpJrZvVDn5KdzFY/nm0jaHr4ysZ4PwxvVxUZEhfr2B5X3WC bkDCp+WVtrB2aN9uObWroKUpPW1vtqbmzoBSq3gkzA7jJ/MNOCh7qWqZOc4/StVMLT/r jxfVGerKpKZvKLAv7JDlpYyxz1KlykjHDSdsNkIwwrvDLF/JoZ0RcJ2ofQw3ol6duZCE Ckmw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cerno.tech header.s=fm3 header.b=uaLcdBgk; dkim=pass header.i=@messagingengine.com header.s=fm3 header.b="rS/k1xO2"; 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=cerno.tech Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id fl21si5911636ejc.315.2021.07.07.02.52.41; Wed, 07 Jul 2021 02:53:04 -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=@cerno.tech header.s=fm3 header.b=uaLcdBgk; dkim=pass header.i=@messagingengine.com header.s=fm3 header.b="rS/k1xO2"; 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=cerno.tech Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231255AbhGGJyE (ORCPT + 99 others); Wed, 7 Jul 2021 05:54:04 -0400 Received: from wnew2-smtp.messagingengine.com ([64.147.123.27]:52365 "EHLO wnew2-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231253AbhGGJyD (ORCPT ); Wed, 7 Jul 2021 05:54:03 -0400 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailnew.west.internal (Postfix) with ESMTP id 55E402B00791; Wed, 7 Jul 2021 05:51:22 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Wed, 07 Jul 2021 05:51:23 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cerno.tech; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm3; bh=7mhnXqm0UEC1q bZWHIpz3smAAHrZY0tVEDn1j/F9XOk=; b=uaLcdBgkZwMWTWaypaPCNtBFqkvqD HKGlqGE9y+iyGC4RvBqMTaAp9RP/X4oLM3WYF1EKJm5s/+Fy6k2iLBy1XorNMq+m +9WyO+MAGZyteUAsPXXUlFP2Ud30SIkcYe2TjQM1adjHf4dwpnhLxSKFbi8Kq2av 4PX3qsbwqzPJ6YuA5X2gnokh8B5QNskHrQuvNwrrJRuUvyWzKt7IMFEd3BIKGUYT BbMZFqSWRCmHAWG0wPBZaxZPElGke1wtw3LHG4TeHD1rZkRuBw1RPq0R3g5EBB9Q 3Fk3AzIvZnHVVI4nlMbXIS19szxKHhYjOn3VFHfK5WFnuv/Ku8FEoIbHw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; bh=7mhnXqm0UEC1qbZWHIpz3smAAHrZY0tVEDn1j/F9XOk=; b=rS/k1xO2 2+03brN03So0+SWzRYS86gVwb9a3bLpjhqZyOUL5TQcY06dpUkt4Zpz2aLxdb8Xj rA5SQW1KpLVYdp16o+Ri9NfrTsTZliaWOft/MNp0tL2i+qwXNrBoTQgV+O7I3gTP dyxjjysdANtwkAmDSZ/+gMTlhOnT8NTvK0zhENQqcJm+U2hecgWyhvdivN4TYcoT bz/7L5bxlGJow05Y5ySMVmxUfG5F/MOf9CKSALl0MyWwBPhPwYCy3WfMUJ2/8+Kb OYx2A7OmI0O0l+BX3vX5fQiM842ikJhcX1ZuK6jYP7HHuvechG5LA5fUuWQpHeEc 0HbqgHJwHdXIrw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvtddrtddvgddvtdcutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhvffufffkofgjfhgggfestdekredtredttdenucfhrhhomhepofgrgihimhgv ucftihhprghrugcuoehmrgigihhmvgestggvrhhnohdrthgvtghhqeenucggtffrrghtth gvrhhnpedvkeelveefffekjefhffeuleetleefudeifeehuddugffghffhffehveevheeh vdenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehmrg igihhmvgestggvrhhnohdrthgvtghh X-ME-Proxy: Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 7 Jul 2021 05:51:20 -0400 (EDT) From: Maxime Ripard To: dri-devel@lists.freedesktop.org, Daniel Vetter , David Airlie , Maarten Lankhorst , Thomas Zimmermann , Maxime Ripard Cc: Emma Anholt , Hans Verkuil , Daniel Vetter , linux-kernel@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, bcm-kernel-feedback-list@broadcom.com, Dave Stevenson , Phil Elwell , Tim Gover , Dom Cobley , Maxime Ripard , Nicolas Saenz Julienne Subject: [PATCH 1/3] drm/vc4: hdmi: Drop devm interrupt handler for CEC interrupts Date: Wed, 7 Jul 2021 11:51:10 +0200 Message-Id: <20210707095112.1469670-2-maxime@cerno.tech> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210707095112.1469670-1-maxime@cerno.tech> References: <20210707095112.1469670-1-maxime@cerno.tech> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The CEC interrupt handlers are registered through the devm_request_threaded_irq function. However, while free_irq is indeed called properly when the device is unbound or bind fails, it's called after unbind or bind is done. In our particular case, it means that on failure it creates a window where our interrupt handler can be called, but we're freeing every resource (CEC adapter, DRM objects, etc.) it might need. In order to address this, let's switch to the non-devm variant to control better when the handler will be unregistered and allow us to make it safe. Fixes: 15b4511a4af6 ("drm/vc4: add HDMI CEC support") Signed-off-by: Maxime Ripard --- drivers/gpu/drm/vc4/vc4_hdmi.c | 49 +++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index cbeec6a5cb90..d966f61966c6 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -1858,38 +1858,46 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) vc4_hdmi_cec_update_clk_div(vc4_hdmi); if (vc4_hdmi->variant->external_irq_controller) { - ret = devm_request_threaded_irq(&pdev->dev, - platform_get_irq_byname(pdev, "cec-rx"), - vc4_cec_irq_handler_rx_bare, - vc4_cec_irq_handler_rx_thread, 0, - "vc4 hdmi cec rx", vc4_hdmi); + ret = request_threaded_irq(platform_get_irq_byname(pdev, "cec-rx"), + vc4_cec_irq_handler_rx_bare, + vc4_cec_irq_handler_rx_thread, 0, + "vc4 hdmi cec rx", vc4_hdmi); if (ret) goto err_delete_cec_adap; - ret = devm_request_threaded_irq(&pdev->dev, - platform_get_irq_byname(pdev, "cec-tx"), - vc4_cec_irq_handler_tx_bare, - vc4_cec_irq_handler_tx_thread, 0, - "vc4 hdmi cec tx", vc4_hdmi); + ret = request_threaded_irq(platform_get_irq_byname(pdev, "cec-tx"), + vc4_cec_irq_handler_tx_bare, + vc4_cec_irq_handler_tx_thread, 0, + "vc4 hdmi cec tx", vc4_hdmi); if (ret) - goto err_delete_cec_adap; + goto err_remove_cec_rx_handler; } else { HDMI_WRITE(HDMI_CEC_CPU_MASK_SET, 0xffffffff); - ret = devm_request_threaded_irq(&pdev->dev, platform_get_irq(pdev, 0), - vc4_cec_irq_handler, - vc4_cec_irq_handler_thread, 0, - "vc4 hdmi cec", vc4_hdmi); + ret = request_threaded_irq(platform_get_irq(pdev, 0), + vc4_cec_irq_handler, + vc4_cec_irq_handler_thread, 0, + "vc4 hdmi cec", vc4_hdmi); if (ret) goto err_delete_cec_adap; } ret = cec_register_adapter(vc4_hdmi->cec_adap, &pdev->dev); if (ret < 0) - goto err_delete_cec_adap; + goto err_remove_handlers; return 0; +err_remove_handlers: + if (vc4_hdmi->variant->external_irq_controller) + free_irq(platform_get_irq_byname(pdev, "cec-tx"), vc4_hdmi); + else + free_irq(platform_get_irq(pdev, 0), vc4_hdmi); + +err_remove_cec_rx_handler: + if (vc4_hdmi->variant->external_irq_controller) + free_irq(platform_get_irq_byname(pdev, "cec-rx"), vc4_hdmi); + err_delete_cec_adap: cec_delete_adapter(vc4_hdmi->cec_adap); @@ -1898,6 +1906,15 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) static void vc4_hdmi_cec_exit(struct vc4_hdmi *vc4_hdmi) { + struct platform_device *pdev = vc4_hdmi->pdev; + + if (vc4_hdmi->variant->external_irq_controller) { + free_irq(platform_get_irq_byname(pdev, "cec-rx"), vc4_hdmi); + free_irq(platform_get_irq_byname(pdev, "cec-tx"), vc4_hdmi); + } else { + free_irq(platform_get_irq(pdev, 0), vc4_hdmi); + } + cec_unregister_adapter(vc4_hdmi->cec_adap); } #else -- 2.31.1