Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3692138pxv; Mon, 26 Jul 2021 09:30:34 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzkS7Dj9pO3H6AUOVNIlFgQs1j9FP7fMEGZeFfYXrn7/4wpnGe4+rOEmYQ84UHOIkOfcH67 X-Received: by 2002:a92:6503:: with SMTP id z3mr10661370ilb.258.1627317034661; Mon, 26 Jul 2021 09:30:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627317034; cv=none; d=google.com; s=arc-20160816; b=SBdNDFId1iXQNvBGAT8ihlW8J5+AcJ6g7xWR81D4FvFsvc1QRVwMWdJ9dI54tYL6ga AInZOfRtlrkWhWJ5TY4Iytb1feLFXHUNmxzCre8RmvJnOwmW2BVxzicb4wu0zUpshJvB JbvzXQXQ15EVyv8DsmnG6Muo0nudLNYks9DHREd4F7rfXUeN9MKqW1SxCCZ6LL8fm31v if9HWhcocXHF0Ifti8qoQ20U/612Rxwdn9KCbzTXtK6rxdGwv02RlEQuBgADOJ7PZDmU tvh4xR45jk8YZnYq0eJ4wXcQs7Q5Imsl9iyqnXZMVUstkV1bDOwudaly8ID70tAeHZyO 3GcQ== 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=v9NlR15G/Cg3SLhMJ4pwVNVjWljHn0f08t9Cby4H8kE=; b=G9/b1Y/4tt3Hd+/USAGvinYoIKdQmjxMOA1XY16dPdAH4phDotiIhgqVRXbKV6fwzd 3IMt4GE0skdRJx5YyejT21SEocSm9ZFTwEt9u3aEL8z6ES5H3S385vWNwZWgKYl+Guy+ pDq+ABz4FWd2QbXvpF1QrO1WqmJ//xhwXxhKmTsC9VuR1tDC8e9NQiyR8Eq8rcSdmKIe H7l6cP5a1q4a2u8upCgKA1NOMUhX/M3SkY6TckndJt7NSngGgq2vsvD7+lvyj3vq8PNx 9jEMSAAWvROGAVPKJm2rlvYsiCP0cArRtZ9JZmT+EsJ8TKaSMRtrWixjifFSjfqgj9Ik ZCMg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=bjHVYpGW; 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 s22si470520iow.33.2021.07.26.09.30.19; Mon, 26 Jul 2021 09:30:34 -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=bjHVYpGW; 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 S238945AbhGZPsh (ORCPT + 99 others); Mon, 26 Jul 2021 11:48:37 -0400 Received: from mail.kernel.org ([198.145.29.99]:44988 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238116AbhGZP3p (ORCPT ); Mon, 26 Jul 2021 11:29:45 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 9E8F660C40; Mon, 26 Jul 2021 16:10:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1627315814; bh=q5e0xfw4WCM4vPj13P4RMlAVFyKjGNn2WZYQz8k0qxE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bjHVYpGWvdK3u3GDUzF97gjI8bPYfr1bxde04BU0RmEMaEdWixU1p4a4+G+/N+w24 X251Ob3TUqrEZeEYrLMlQEDERFj/C7nJ6wL7oMqUjGl4D7YnJKWWJz2pjy/4+MVVff uEXXxzZpG/nRcGQGomQeom/N5SseTnjs5F1rMpTk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Maxime Ripard , Dave Stevenson , Sasha Levin Subject: [PATCH 5.13 078/223] drm/vc4: hdmi: Drop devm interrupt handler for CEC interrupts Date: Mon, 26 Jul 2021 17:37:50 +0200 Message-Id: <20210726153848.801898635@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210726153846.245305071@linuxfoundation.org> References: <20210726153846.245305071@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: Maxime Ripard [ Upstream commit 32a19de21ae40f0601f48575b610dde4f518ccc6 ] 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 Reviewed-by: Dave Stevenson Link: https://patchwork.freedesktop.org/patch/msgid/20210707095112.1469670-2-maxime@cerno.tech Signed-off-by: Sasha Levin --- 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 188b74c9e9ff..edee565334d8 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -1690,38 +1690,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); @@ -1730,6 +1738,15 @@ err_delete_cec_adap: 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.30.2