From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-qv1-f51.google.com (mail-qv1-f51.google.com [209.85.219.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A7A2D33FE36 for ; Mon, 8 Jun 2026 21:13:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.51 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780953232; cv=none; b=gUpb5PiON83TQRaCBY1GlsWtW/FhvaCdm6IG/1imUwJLqd4vxbprJg6wsC5BU7xW03eycDCuO9nx4gHBvbR3xxF++qt6js/eOQ4NTyOHBILfdmqMueuGBIlnqUsESFykqmSL1GSlAR2r/JUdgsqh+hRhVEyi12lNRKLKP93Zrd0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780953232; c=relaxed/simple; bh=J67YGwAK8wNwiY4dvsB870olFDdYGhyjc6y3SKves/4=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=c59RV259hic1TqWQB+phSpYTdGWNz22D95fRfgVJl0UZqhEOD5KnJ+RCY8wCfcvDD431vPx/LOLap3V8h6G1skSqhNEgUdvBzcCgYrE0rERjEF41n5fCzocgbzLO/y5AvE+1YAAWgZ9imvTN0/YEQ/i4mDb//RjDA/hzdjzH080= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Q0FHD1zp; arc=none smtp.client-ip=209.85.219.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Q0FHD1zp" Received: by mail-qv1-f51.google.com with SMTP id 6a1803df08f44-8ccf01ba514so40492426d6.0 for ; Mon, 08 Jun 2026 14:13:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780953229; x=1781558029; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=cEF2ayBmzEO4/dop93e1RwK+zC/PoDn/nTSxzR+E0U4=; b=Q0FHD1zpM8VBrnbgPvdf1YdnF1U6XvbjMD909cBXi0mcDUGQrRltzWGeg+TsqLxc8C 6I8RWOIWd5xmVYo68UxVGWKhmRTvdrvWvqu68Iaao9plddf4QoOlB44BrLsHKa46K2+k 534W9aolodE9UqZc5nlY4QA1HU8PWGa9wIL2Knyy4B5Rk8bnu+d7Gl9uK1f1Mhj06raP CcLIXmHmaIJgCsmq+5kBrPYWV2wIWOgzeAovq2cjhFZUu4h5Hn35Wf4anMggGAQ4LTDG z3AX45iR6B2RyL3AKdABqvWbn/p+cMZBlnFQimvDzmqUbWVF+XzMwY4tfmBxBnxZv6Eh wSMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780953229; x=1781558029; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=cEF2ayBmzEO4/dop93e1RwK+zC/PoDn/nTSxzR+E0U4=; b=mHBBUFDilmTm4gtW+2gK/jYtpvtfaXhAS5I2oDAEO7vldGR6Tcyx7KKAv3/6gg3pC6 GER3NY2xxwX4+eF5VMGW6ujYaIjzT0ZX999/TRahbCn7i9xQuIR/ubbGMhaZLzoxyVtn trqwEw/9eVkR6OOiZAX2l+XRZiRCkhRuHimSnOirPk0xNx5NcxEjvXALY0lHJs1F9rzy ifpleZzXYsv9fABBwkP6C8Lc0d4cHCu4AFUrk2ARoHhz6C6eVejapRP0OfpBUBuWHbe5 uoIMp85FJQ/yS+3u3qVsZuM6PWwe6JOGTf5DoCJ1bynJjPZHAPIgwAj55knqJC2izCxf Z0mw== X-Forwarded-Encrypted: i=1; AFNElJ+xG8tnOz0V2Z7Kbo3rIeimiMT2CohvYVPquQOYxxKbqKL6vZss3V765vQ96YZQQzofeKVKh2kEwf89+Nw=@vger.kernel.org X-Gm-Message-State: AOJu0YxWMqa7K4K0Wu/MQsTKe6Y/x6NJZmW0pQIlikzOikedyf63DhJH UWmU/p3xMOJkWAz7t2kkJo0jEwdENNiRLkEyg5YYjj6wwah/m/cwa/3O X-Gm-Gg: Acq92OFHST6cLcw/EanuwzxEjT/laWJuQNcySrwg0rBiQAN/mrqPi4GQigD8ZIt2hRV H51OlrU5/KV94JHAewPCEyo5wZrvjLK9Rc1TgEHtKmkFcnwE4WhV551q9vxPz52qvvOVrNku07Y g2slJtIB+noktmc/w5/tc7PT8nNtgt61SQzI3fTQ0YduztauskCBOgjgD3Lh9KlMZU/d2RZr7cO mQwhwklquUd6Ib4CiHIMRwdqn/C23oBvh16ejRkyDAcJP0yEuD556ll+4hkV1rOgCWg5aLbry0q KZ49USYH9ywQnuoJ1MdQ7P5K7sthSAEYIyorH8KVt3DAL8fK0jzbIKF1gpj1VqsthVqHQVRmzit aJkAkEgBBVDtq9SjZ9jD+U8nA+Mw3sPQ6689Y6zTXrKh2uc/mTo+DoSFYBrrMC0CXIhLWhJZzeV enYkGBtJ3Q9jeTeIytu8jhtzqbUDe5XeRUE4Cx3oe6x6JCBVKbAfI= X-Received: by 2002:a0c:f9d1:0:b0:8ce:a005:3ea6 with SMTP id 6a1803df08f44-8cee6023642mr205113226d6.22.1780953229512; Mon, 08 Jun 2026 14:13:49 -0700 (PDT) Received: from i4-gl-tmk5904.ad.psu.edu ([130.203.156.186]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-8cecd26b3b9sm179547456d6.45.2026.06.08.14.13.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Jun 2026 14:13:48 -0700 (PDT) From: Yuho Choi To: Anitha Chrisanthus , David Airlie , Simona Vetter Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Yuho Choi Subject: [PATCH v1] drm/kmb: Fix device reference leaks in probe Date: Mon, 8 Jun 2026 17:13:41 -0400 Message-ID: <20260608211341.123939-1-dbgh9129@gmail.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit kmb_probe() takes a reference to its own platform device only to keep a local dev pointer, and passes an extra reference to the DSI platform device into kmb_dsi_host_bridge_init(). Neither reference is released. The DSI platform device returned by of_find_device_by_node() also carries a reference that is not put on probe failure or after successful setup. Use borrowed device pointers where no ownership is needed. Keep an owned reference only for the registered DSI host device, and drop it when the host is unregistered. Release the temporary of_find_device_by_node() reference on all probe exits. Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display") Signed-off-by: Yuho Choi --- drivers/gpu/drm/kmb/kmb_drv.c | 32 ++++++++++++++++++++------------ drivers/gpu/drm/kmb/kmb_dsi.c | 31 ++++++++++++++++++++++++++----- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c index 7c2eb1152fc2..f8ef618e3a81 100644 --- a/drivers/gpu/drm/kmb/kmb_drv.c +++ b/drivers/gpu/drm/kmb/kmb_drv.c @@ -479,7 +479,7 @@ static void kmb_remove(struct platform_device *pdev) static int kmb_probe(struct platform_device *pdev) { - struct device *dev = get_device(&pdev->dev); + struct device *dev = &pdev->dev; struct kmb_drm_private *kmb; int ret = 0; struct device_node *dsi_in; @@ -515,20 +515,24 @@ static int kmb_probe(struct platform_device *pdev) of_node_put(dsi_in); of_node_put(dsi_node); - ret = kmb_dsi_host_bridge_init(get_device(&dsi_pdev->dev)); + ret = kmb_dsi_host_bridge_init(&dsi_pdev->dev); - if (ret == -EPROBE_DEFER) { - return -EPROBE_DEFER; - } else if (ret) { - DRM_ERROR("probe failed to initialize DSI host bridge\n"); - return ret; + if (ret) { + if (ret != -EPROBE_DEFER) { + DRM_ERROR("probe failed to initialize DSI host bridge\n"); + kmb_dsi_host_unregister(NULL); + } + goto err_put_dsi_pdev; } /* Create DRM device */ kmb = devm_drm_dev_alloc(dev, &kmb_driver, struct kmb_drm_private, drm); - if (IS_ERR(kmb)) - return PTR_ERR(kmb); + if (IS_ERR(kmb)) { + ret = PTR_ERR(kmb); + kmb_dsi_host_unregister(NULL); + goto err_put_dsi_pdev; + } dev_set_drvdata(dev, &kmb->drm); @@ -537,11 +541,11 @@ static int kmb_probe(struct platform_device *pdev) if (IS_ERR(kmb->kmb_dsi)) { drm_err(&kmb->drm, "failed to initialize DSI\n"); ret = PTR_ERR(kmb->kmb_dsi); - goto err_free1; + dev_set_drvdata(dev, NULL); + kmb_dsi_host_unregister(NULL); + goto err_put_dsi_pdev; } - kmb->kmb_dsi->dev = &dsi_pdev->dev; - kmb->kmb_dsi->pdev = dsi_pdev; ret = kmb_hw_init(&kmb->drm, 0); if (ret) goto err_free1; @@ -565,6 +569,7 @@ static int kmb_probe(struct platform_device *pdev) drm_client_setup(&kmb->drm, NULL); + put_device(&dsi_pdev->dev); return 0; err_register: @@ -578,6 +583,9 @@ static int kmb_probe(struct platform_device *pdev) dev_set_drvdata(dev, NULL); kmb_dsi_host_unregister(kmb->kmb_dsi); + err_put_dsi_pdev: + put_device(&dsi_pdev->dev); + return ret; } diff --git a/drivers/gpu/drm/kmb/kmb_dsi.c b/drivers/gpu/drm/kmb/kmb_dsi.c index aeb2f9f98f23..025384a6fb69 100644 --- a/drivers/gpu/drm/kmb/kmb_dsi.c +++ b/drivers/gpu/drm/kmb/kmb_dsi.c @@ -182,8 +182,19 @@ static void kmb_dsi_clk_disable(struct kmb_dsi *kmb_dsi) void kmb_dsi_host_unregister(struct kmb_dsi *kmb_dsi) { - kmb_dsi_clk_disable(kmb_dsi); - mipi_dsi_host_unregister(kmb_dsi->host); + struct device *dev; + + if (kmb_dsi) + kmb_dsi_clk_disable(kmb_dsi); + + if (!dsi_host || !dsi_host->dev) + return; + + mipi_dsi_host_unregister(dsi_host); + + dev = dsi_host->dev; + dsi_host->dev = NULL; + put_device(dev); } /* @@ -217,6 +228,7 @@ static const struct mipi_dsi_host_ops kmb_dsi_host_ops = { int kmb_dsi_host_bridge_init(struct device *dev) { struct device_node *encoder_node, *dsi_out; + int ret; /* Create and register MIPI DSI host */ if (!dsi_host) { @@ -230,12 +242,20 @@ int kmb_dsi_host_bridge_init(struct device *dev) dsi_device = kzalloc_obj(*dsi_device); if (!dsi_device) { kfree(dsi_host); + dsi_host = NULL; return -ENOMEM; } } + } - dsi_host->dev = dev; - mipi_dsi_host_register(dsi_host); + if (!dsi_host->dev) { + dsi_host->dev = get_device(dev); + ret = mipi_dsi_host_register(dsi_host); + if (ret) { + put_device(dsi_host->dev); + dsi_host->dev = NULL; + return ret; + } } /* Find ADV7535 node and initialize it */ @@ -1410,7 +1430,6 @@ int kmb_dsi_mode_set(struct kmb_dsi *kmb_dsi, struct drm_display_mode *mode, struct kmb_dsi *kmb_dsi_init(struct platform_device *pdev) { struct kmb_dsi *kmb_dsi; - struct device *dev = get_device(&pdev->dev); kmb_dsi = devm_kzalloc(dev, sizeof(*kmb_dsi), GFP_KERNEL); if (!kmb_dsi) { @@ -1420,6 +1439,8 @@ struct kmb_dsi *kmb_dsi_init(struct platform_device *pdev) kmb_dsi->host = dsi_host; kmb_dsi->host->ops = &kmb_dsi_host_ops; + kmb_dsi->dev = &pdev->dev; + kmb_dsi->pdev = pdev; dsi_device->host = kmb_dsi->host; kmb_dsi->device = dsi_device; -- 2.43.0