diff options
author | Olof Johansson <olof@lixom.net> | 2018-07-21 18:05:16 -0400 |
---|---|---|
committer | Olof Johansson <olof@lixom.net> | 2018-07-21 18:05:16 -0400 |
commit | 1df88c683ea376a0499e195c2301eb8ce9668b77 (patch) | |
tree | c81ce36eaaedde699d09bb748bf5cb17e30c867c | |
parent | 85a03fe92ce654d32442a59807fde2cd9fe177b0 (diff) | |
parent | 69c04aee3482415cff52061a3ccad4943662e81d (diff) |
Merge tag 'imx-drivers-4.19' of git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux into next/drivers
i.MX drivers update for 4.19:
- Handle i.MX6SL chip errata ERR006287 in the safest possible way by
keeping the DISP domain always-on, because Upon resuming from power
gating, the modules in the display power domain (eLCDIF, EPDC, PXP
and SPDC) might fail to perform register reads correctly.
- Use GENPD_FLAG_ALWAYS_ON flag for i.MX6QP PU ERR009619 handling.
It is functionally identical to the exsiting implementation but
simpler and slightly faster.
* tag 'imx-drivers-4.19' of git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux:
soc: imx6qp: Use GENPD_FLAG_ALWAYS_ON for PU errata
soc: imx: gpc: Disable 6sl display power gating for ERR006287
Signed-off-by: Olof Johansson <olof@lixom.net>
-rw-r--r-- | drivers/soc/imx/gpc.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/soc/imx/gpc.c b/drivers/soc/imx/gpc.c index 32f0748fd067..403f3f2f43bd 100644 --- a/drivers/soc/imx/gpc.c +++ b/drivers/soc/imx/gpc.c | |||
@@ -47,7 +47,6 @@ struct imx_pm_domain { | |||
47 | unsigned int reg_offs; | 47 | unsigned int reg_offs; |
48 | signed char cntr_pdn_bit; | 48 | signed char cntr_pdn_bit; |
49 | unsigned int ipg_rate_mhz; | 49 | unsigned int ipg_rate_mhz; |
50 | unsigned int flags; | ||
51 | }; | 50 | }; |
52 | 51 | ||
53 | static inline struct imx_pm_domain * | 52 | static inline struct imx_pm_domain * |
@@ -62,9 +61,6 @@ static int imx6_pm_domain_power_off(struct generic_pm_domain *genpd) | |||
62 | int iso, iso2sw; | 61 | int iso, iso2sw; |
63 | u32 val; | 62 | u32 val; |
64 | 63 | ||
65 | if (pd->flags & PGC_DOMAIN_FLAG_NO_PD) | ||
66 | return -EBUSY; | ||
67 | |||
68 | /* Read ISO and ISO2SW power down delays */ | 64 | /* Read ISO and ISO2SW power down delays */ |
69 | regmap_read(pd->regmap, pd->reg_offs + GPC_PGC_PUPSCR_OFFS, &val); | 65 | regmap_read(pd->regmap, pd->reg_offs + GPC_PGC_PUPSCR_OFFS, &val); |
70 | iso = val & 0x3f; | 66 | iso = val & 0x3f; |
@@ -288,26 +284,31 @@ static struct imx_pm_domain imx_gpc_domains[] = { | |||
288 | struct imx_gpc_dt_data { | 284 | struct imx_gpc_dt_data { |
289 | int num_domains; | 285 | int num_domains; |
290 | bool err009619_present; | 286 | bool err009619_present; |
287 | bool err006287_present; | ||
291 | }; | 288 | }; |
292 | 289 | ||
293 | static const struct imx_gpc_dt_data imx6q_dt_data = { | 290 | static const struct imx_gpc_dt_data imx6q_dt_data = { |
294 | .num_domains = 2, | 291 | .num_domains = 2, |
295 | .err009619_present = false, | 292 | .err009619_present = false, |
293 | .err006287_present = false, | ||
296 | }; | 294 | }; |
297 | 295 | ||
298 | static const struct imx_gpc_dt_data imx6qp_dt_data = { | 296 | static const struct imx_gpc_dt_data imx6qp_dt_data = { |
299 | .num_domains = 2, | 297 | .num_domains = 2, |
300 | .err009619_present = true, | 298 | .err009619_present = true, |
299 | .err006287_present = false, | ||
301 | }; | 300 | }; |
302 | 301 | ||
303 | static const struct imx_gpc_dt_data imx6sl_dt_data = { | 302 | static const struct imx_gpc_dt_data imx6sl_dt_data = { |
304 | .num_domains = 3, | 303 | .num_domains = 3, |
305 | .err009619_present = false, | 304 | .err009619_present = false, |
305 | .err006287_present = true, | ||
306 | }; | 306 | }; |
307 | 307 | ||
308 | static const struct imx_gpc_dt_data imx6sx_dt_data = { | 308 | static const struct imx_gpc_dt_data imx6sx_dt_data = { |
309 | .num_domains = 4, | 309 | .num_domains = 4, |
310 | .err009619_present = false, | 310 | .err009619_present = false, |
311 | .err006287_present = false, | ||
311 | }; | 312 | }; |
312 | 313 | ||
313 | static const struct of_device_id imx_gpc_dt_ids[] = { | 314 | static const struct of_device_id imx_gpc_dt_ids[] = { |
@@ -413,8 +414,13 @@ static int imx_gpc_probe(struct platform_device *pdev) | |||
413 | 414 | ||
414 | /* Disable PU power down in normal operation if ERR009619 is present */ | 415 | /* Disable PU power down in normal operation if ERR009619 is present */ |
415 | if (of_id_data->err009619_present) | 416 | if (of_id_data->err009619_present) |
416 | imx_gpc_domains[GPC_PGC_DOMAIN_PU].flags |= | 417 | imx_gpc_domains[GPC_PGC_DOMAIN_PU].base.flags |= |
417 | PGC_DOMAIN_FLAG_NO_PD; | 418 | GENPD_FLAG_ALWAYS_ON; |
419 | |||
420 | /* Keep DISP always on if ERR006287 is present */ | ||
421 | if (of_id_data->err006287_present) | ||
422 | imx_gpc_domains[GPC_PGC_DOMAIN_DISPLAY].base.flags |= | ||
423 | GENPD_FLAG_ALWAYS_ON; | ||
418 | 424 | ||
419 | if (!pgc_node) { | 425 | if (!pgc_node) { |
420 | ret = imx_gpc_old_dt_init(&pdev->dev, regmap, | 426 | ret = imx_gpc_old_dt_init(&pdev->dev, regmap, |