diff options
author | Olof Johansson <olof@lixom.net> | 2018-05-25 16:47:10 -0400 |
---|---|---|
committer | Olof Johansson <olof@lixom.net> | 2018-05-25 16:47:10 -0400 |
commit | d6bde1dbe36c1b7712421c85e161b2c054007e99 (patch) | |
tree | 205811f1927a9237c0dcfdac790241b3e4ba0d3c | |
parent | 6874f9de65314fcea76f7654ba93017616e6c2d9 (diff) | |
parent | f54e714cfc53b9164d1206f9ee49042195532a51 (diff) |
Merge tag 'imx-drivers-4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux into next/drivers
i.MX drivers update for 4.18:
- Use platform_device_add_data() instead of a pointer to a static
memory in gpc/gpcv2 driver for platform data passing, so that we
can avoid a BUG() when calling platform_device_put().
* tag 'imx-drivers-4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux:
soc: imx: gpc: Do not pass static memory as platform data
soc: imx: gpcv2: Do not pass static memory as platform data
Signed-off-by: Olof Johansson <olof@lixom.net>
-rw-r--r-- | drivers/soc/imx/gpc.c | 18 | ||||
-rw-r--r-- | drivers/soc/imx/gpcv2.c | 22 |
2 files changed, 28 insertions, 12 deletions
diff --git a/drivers/soc/imx/gpc.c b/drivers/soc/imx/gpc.c index c4d35f32af8d..32f0748fd067 100644 --- a/drivers/soc/imx/gpc.c +++ b/drivers/soc/imx/gpc.c | |||
@@ -443,17 +443,25 @@ static int imx_gpc_probe(struct platform_device *pdev) | |||
443 | if (domain_index >= of_id_data->num_domains) | 443 | if (domain_index >= of_id_data->num_domains) |
444 | continue; | 444 | continue; |
445 | 445 | ||
446 | domain = &imx_gpc_domains[domain_index]; | ||
447 | domain->regmap = regmap; | ||
448 | domain->ipg_rate_mhz = ipg_rate_mhz; | ||
449 | |||
450 | pd_pdev = platform_device_alloc("imx-pgc-power-domain", | 446 | pd_pdev = platform_device_alloc("imx-pgc-power-domain", |
451 | domain_index); | 447 | domain_index); |
452 | if (!pd_pdev) { | 448 | if (!pd_pdev) { |
453 | of_node_put(np); | 449 | of_node_put(np); |
454 | return -ENOMEM; | 450 | return -ENOMEM; |
455 | } | 451 | } |
456 | pd_pdev->dev.platform_data = domain; | 452 | |
453 | ret = platform_device_add_data(pd_pdev, | ||
454 | &imx_gpc_domains[domain_index], | ||
455 | sizeof(imx_gpc_domains[domain_index])); | ||
456 | if (ret) { | ||
457 | platform_device_put(pd_pdev); | ||
458 | of_node_put(np); | ||
459 | return ret; | ||
460 | } | ||
461 | domain = pd_pdev->dev.platform_data; | ||
462 | domain->regmap = regmap; | ||
463 | domain->ipg_rate_mhz = ipg_rate_mhz; | ||
464 | |||
457 | pd_pdev->dev.parent = &pdev->dev; | 465 | pd_pdev->dev.parent = &pdev->dev; |
458 | pd_pdev->dev.of_node = np; | 466 | pd_pdev->dev.of_node = np; |
459 | 467 | ||
diff --git a/drivers/soc/imx/gpcv2.c b/drivers/soc/imx/gpcv2.c index afc7ecc3c187..f4e3bd40c72e 100644 --- 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(struct generic_pm_domain *genpd) | |||
155 | return imx7_gpc_pu_pgc_sw_pxx_req(genpd, false); | 155 | return imx7_gpc_pu_pgc_sw_pxx_req(genpd, false); |
156 | } | 156 | } |
157 | 157 | ||
158 | static struct imx7_pgc_domain imx7_pgc_domains[] = { | 158 | static const struct imx7_pgc_domain imx7_pgc_domains[] = { |
159 | [IMX7_POWER_DOMAIN_MIPI_PHY] = { | 159 | [IMX7_POWER_DOMAIN_MIPI_PHY] = { |
160 | .genpd = { | 160 | .genpd = { |
161 | .name = "mipi-phy", | 161 | .name = "mipi-phy", |
@@ -321,11 +321,6 @@ static int imx_gpcv2_probe(struct platform_device *pdev) | |||
321 | continue; | 321 | continue; |
322 | } | 322 | } |
323 | 323 | ||
324 | domain = &imx7_pgc_domains[domain_index]; | ||
325 | domain->regmap = regmap; | ||
326 | domain->genpd.power_on = imx7_gpc_pu_pgc_sw_pup_req; | ||
327 | domain->genpd.power_off = imx7_gpc_pu_pgc_sw_pdn_req; | ||
328 | |||
329 | pd_pdev = platform_device_alloc("imx7-pgc-domain", | 324 | pd_pdev = platform_device_alloc("imx7-pgc-domain", |
330 | domain_index); | 325 | domain_index); |
331 | if (!pd_pdev) { | 326 | if (!pd_pdev) { |
@@ -334,7 +329,20 @@ static int imx_gpcv2_probe(struct platform_device *pdev) | |||
334 | return -ENOMEM; | 329 | return -ENOMEM; |
335 | } | 330 | } |
336 | 331 | ||
337 | pd_pdev->dev.platform_data = domain; | 332 | ret = platform_device_add_data(pd_pdev, |
333 | &imx7_pgc_domains[domain_index], | ||
334 | sizeof(imx7_pgc_domains[domain_index])); | ||
335 | if (ret) { | ||
336 | platform_device_put(pd_pdev); | ||
337 | of_node_put(np); | ||
338 | return ret; | ||
339 | } | ||
340 | |||
341 | domain = pd_pdev->dev.platform_data; | ||
342 | domain->regmap = regmap; | ||
343 | domain->genpd.power_on = imx7_gpc_pu_pgc_sw_pup_req; | ||
344 | domain->genpd.power_off = imx7_gpc_pu_pgc_sw_pdn_req; | ||
345 | |||
338 | pd_pdev->dev.parent = dev; | 346 | pd_pdev->dev.parent = dev; |
339 | pd_pdev->dev.of_node = np; | 347 | pd_pdev->dev.of_node = np; |
340 | 348 | ||