From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751150AbeAVPIa (ORCPT ); Mon, 22 Jan 2018 10:08:30 -0500 Received: from mail-pg0-f68.google.com ([74.125.83.68]:39772 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750955AbeAVPI2 (ORCPT ); Mon, 22 Jan 2018 10:08:28 -0500 X-Google-Smtp-Source: AH8x22772RjW02NJvH3syt1f5nsHBLHrgG/PIAf0+WaiD21oJ+2IYZv1TRBBUQ/SemUidWJhObwLKg== From: Andrey Smirnov To: Shawn Guo Cc: Andrey Smirnov , Stefan Agner , Lucas Stach , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/2] soc: imx: gpcv2: Do not pass static memory as platform data Date: Mon, 22 Jan 2018 07:07:47 -0800 Message-Id: <20180122150748.1742-1-andrew.smirnov@gmail.com> X-Mailer: git-send-email 2.14.3 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Platform device core assumes the ownership of dev.platform_data as well as that it is dynamically allocated and it will try to kfree it as a part of platform_device_release(). Change the code to pass kzalloc'ed chunk of memory instead of a pointer to a static memory to avoid causing a BUG() when calling platform_device_put(). The problem can be reproduced by artificially enabling the error path of platform_device_add() call (around line 357). Note that this change also allows us to constify imx7_pgc_domains, since we no longer need to be able to modify it. Cc: Shawn Guo Cc: Stefan Agner Cc: Lucas Stach Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Andrey Smirnov --- Changes since [v1]: - Replaced devm_kzalloc() with devm_kmalloc() as per suggestion from Stefan [1] lkml.kernel.org/r/20180110161608.13015-1-andrew.smirnov@gmail.com drivers/soc/imx/gpcv2.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/soc/imx/gpcv2.c b/drivers/soc/imx/gpcv2.c index afc7ecc3c187..9947598ec4b5 100644 --- a/drivers/soc/imx/gpcv2.c +++ b/drivers/soc/imx/gpcv2.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #define GPC_LPCR_A7_BSC 0x000 @@ -155,7 +156,7 @@ static int imx7_gpc_pu_pgc_sw_pdn_req(struct generic_pm_domain *genpd) return imx7_gpc_pu_pgc_sw_pxx_req(genpd, false); } -static struct imx7_pgc_domain imx7_pgc_domains[] = { +static const struct imx7_pgc_domain imx7_pgc_domains[] = { [IMX7_POWER_DOMAIN_MIPI_PHY] = { .genpd = { .name = "mipi-phy", @@ -321,7 +322,14 @@ static int imx_gpcv2_probe(struct platform_device *pdev) continue; } - domain = &imx7_pgc_domains[domain_index]; + domain = kmalloc(sizeof(*domain), GFP_KERNEL); + if (!domain) { + of_node_put(np); + return -ENOMEM; + } + memcpy(domain, &imx7_pgc_domains[domain_index], + sizeof(*domain)); + domain->regmap = regmap; domain->genpd.power_on = imx7_gpc_pu_pgc_sw_pup_req; domain->genpd.power_off = imx7_gpc_pu_pgc_sw_pdn_req; @@ -330,6 +338,7 @@ static int imx_gpcv2_probe(struct platform_device *pdev) domain_index); if (!pd_pdev) { dev_err(dev, "Failed to allocate platform device\n"); + kfree(domain); of_node_put(np); return -ENOMEM; } -- 2.14.3