lkml.org 
[lkml]   [2018]   [Aug]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 197/246] soc: imx: gpcv2: Do not pass static memory as platform data
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Andrey Smirnov <andrew.smirnov@gmail.com>

    [ Upstream commit 050f810e238f268670f14a8f8b793ba2dbf2e92f ]

    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 use
    platform_device_add_data() n 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: Stefan Agner <stefan@agner.ch>
    Cc: Lucas Stach <l.stach@pengutronix.de>
    Cc: linux-arm-kernel@lists.infradead.org
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/soc/imx/gpcv2.c | 22 +++++++++++++++-------
    1 file changed, 15 insertions(+), 7 deletions(-)

    --- a/drivers/soc/imx/gpcv2.c
    +++ b/drivers/soc/imx/gpcv2.c
    @@ -155,7 +155,7 @@ static int imx7_gpc_pu_pgc_sw_pdn_req(st
    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,11 +321,6 @@ static int imx_gpcv2_probe(struct platfo
    continue;
    }

    - domain = &imx7_pgc_domains[domain_index];
    - 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;
    -
    pd_pdev = platform_device_alloc("imx7-pgc-domain",
    domain_index);
    if (!pd_pdev) {
    @@ -334,7 +329,20 @@ static int imx_gpcv2_probe(struct platfo
    return -ENOMEM;
    }

    - pd_pdev->dev.platform_data = domain;
    + ret = platform_device_add_data(pd_pdev,
    + &imx7_pgc_domains[domain_index],
    + sizeof(imx7_pgc_domains[domain_index]));
    + if (ret) {
    + platform_device_put(pd_pdev);
    + of_node_put(np);
    + return ret;
    + }
    +
    + domain = pd_pdev->dev.platform_data;
    + 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;
    +
    pd_pdev->dev.parent = dev;
    pd_pdev->dev.of_node = np;


    \
     
     \ /
      Last update: 2018-08-01 19:49    [W:6.566 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site