diff options
-rw-r--r-- | Documentation/devicetree/bindings/power/fsl,imx-gpcv2.txt | 7 | ||||
-rw-r--r-- | drivers/soc/imx/Kconfig | 6 | ||||
-rw-r--r-- | drivers/soc/imx/Makefile | 2 | ||||
-rw-r--r-- | drivers/soc/imx/gpcv2.c | 208 | ||||
-rw-r--r-- | include/dt-bindings/power/imx8mq-power.h | 21 |
5 files changed, 237 insertions, 7 deletions
diff --git a/Documentation/devicetree/bindings/power/fsl,imx-gpcv2.txt b/Documentation/devicetree/bindings/power/fsl,imx-gpcv2.txt index 9acce75b29ab..7c947a996df1 100644 --- a/Documentation/devicetree/bindings/power/fsl,imx-gpcv2.txt +++ b/Documentation/devicetree/bindings/power/fsl,imx-gpcv2.txt | |||
@@ -6,7 +6,9 @@ Control (PGC) for various power domains. | |||
6 | 6 | ||
7 | Required properties: | 7 | Required properties: |
8 | 8 | ||
9 | - compatible: Should be "fsl,imx7d-gpc" | 9 | - compatible: Should be one of: |
10 | - "fsl,imx7d-gpc" | ||
11 | - "fsl,imx8mq-gpc" | ||
10 | 12 | ||
11 | - reg: should be register base and length as documented in the | 13 | - reg: should be register base and length as documented in the |
12 | datasheet | 14 | datasheet |
@@ -22,7 +24,8 @@ which, in turn, is expected to contain the following: | |||
22 | Required properties: | 24 | Required properties: |
23 | 25 | ||
24 | - reg: Power domain index. Valid values are defined in | 26 | - reg: Power domain index. Valid values are defined in |
25 | include/dt-bindings/power/imx7-power.h | 27 | include/dt-bindings/power/imx7-power.h for fsl,imx7d-gpc and |
28 | include/dt-bindings/power/imx8m-power.h for fsl,imx8mq-gpc | ||
26 | 29 | ||
27 | - #power-domain-cells: Should be 0 | 30 | - #power-domain-cells: Should be 0 |
28 | 31 | ||
diff --git a/drivers/soc/imx/Kconfig b/drivers/soc/imx/Kconfig index a5b86a28f343..2112d18dbb7b 100644 --- a/drivers/soc/imx/Kconfig +++ b/drivers/soc/imx/Kconfig | |||
@@ -1,8 +1,8 @@ | |||
1 | menu "i.MX SoC drivers" | 1 | menu "i.MX SoC drivers" |
2 | 2 | ||
3 | config IMX7_PM_DOMAINS | 3 | config IMX_GPCV2_PM_DOMAINS |
4 | bool "i.MX7 PM domains" | 4 | bool "i.MX GPCv2 PM domains" |
5 | depends on SOC_IMX7D || (COMPILE_TEST && OF) | 5 | depends on SOC_IMX7D || SOC_IMX8MQ || (COMPILE_TEST && OF) |
6 | depends on PM | 6 | depends on PM |
7 | select PM_GENERIC_DOMAINS | 7 | select PM_GENERIC_DOMAINS |
8 | default y if SOC_IMX7D | 8 | default y if SOC_IMX7D |
diff --git a/drivers/soc/imx/Makefile b/drivers/soc/imx/Makefile index aab41a5cc317..506a6f3c2b9b 100644 --- a/drivers/soc/imx/Makefile +++ b/drivers/soc/imx/Makefile | |||
@@ -1,2 +1,2 @@ | |||
1 | obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o | 1 | obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o |
2 | obj-$(CONFIG_IMX7_PM_DOMAINS) += gpcv2.o | 2 | obj-$(CONFIG_IMX_GPCV2_PM_DOMAINS) += gpcv2.o |
diff --git a/drivers/soc/imx/gpcv2.c b/drivers/soc/imx/gpcv2.c index fe2cf6b61b05..8b4f48a2ca57 100644 --- a/drivers/soc/imx/gpcv2.c +++ b/drivers/soc/imx/gpcv2.c | |||
@@ -14,24 +14,55 @@ | |||
14 | #include <linux/regmap.h> | 14 | #include <linux/regmap.h> |
15 | #include <linux/regulator/consumer.h> | 15 | #include <linux/regulator/consumer.h> |
16 | #include <dt-bindings/power/imx7-power.h> | 16 | #include <dt-bindings/power/imx7-power.h> |
17 | #include <dt-bindings/power/imx8mq-power.h> | ||
17 | 18 | ||
18 | #define GPC_LPCR_A_CORE_BSC 0x000 | 19 | #define GPC_LPCR_A_CORE_BSC 0x000 |
19 | 20 | ||
20 | #define GPC_PGC_CPU_MAPPING 0x0ec | 21 | #define GPC_PGC_CPU_MAPPING 0x0ec |
22 | |||
21 | #define IMX7_USB_HSIC_PHY_A_CORE_DOMAIN BIT(6) | 23 | #define IMX7_USB_HSIC_PHY_A_CORE_DOMAIN BIT(6) |
22 | #define IMX7_USB_OTG2_PHY_A_CORE_DOMAIN BIT(5) | 24 | #define IMX7_USB_OTG2_PHY_A_CORE_DOMAIN BIT(5) |
23 | #define IMX7_USB_OTG1_PHY_A_CORE_DOMAIN BIT(4) | 25 | #define IMX7_USB_OTG1_PHY_A_CORE_DOMAIN BIT(4) |
24 | #define IMX7_PCIE_PHY_A_CORE_DOMAIN BIT(3) | 26 | #define IMX7_PCIE_PHY_A_CORE_DOMAIN BIT(3) |
25 | #define IMX7_MIPI_PHY_A_CORE_DOMAIN BIT(2) | 27 | #define IMX7_MIPI_PHY_A_CORE_DOMAIN BIT(2) |
26 | 28 | ||
29 | #define IMX8M_PCIE2_A53_DOMAIN BIT(15) | ||
30 | #define IMX8M_MIPI_CSI2_A53_DOMAIN BIT(14) | ||
31 | #define IMX8M_MIPI_CSI1_A53_DOMAIN BIT(13) | ||
32 | #define IMX8M_DISP_A53_DOMAIN BIT(12) | ||
33 | #define IMX8M_HDMI_A53_DOMAIN BIT(11) | ||
34 | #define IMX8M_VPU_A53_DOMAIN BIT(10) | ||
35 | #define IMX8M_GPU_A53_DOMAIN BIT(9) | ||
36 | #define IMX8M_DDR2_A53_DOMAIN BIT(8) | ||
37 | #define IMX8M_DDR1_A53_DOMAIN BIT(7) | ||
38 | #define IMX8M_OTG2_A53_DOMAIN BIT(5) | ||
39 | #define IMX8M_OTG1_A53_DOMAIN BIT(4) | ||
40 | #define IMX8M_PCIE1_A53_DOMAIN BIT(3) | ||
41 | #define IMX8M_MIPI_A53_DOMAIN BIT(2) | ||
42 | |||
27 | #define GPC_PU_PGC_SW_PUP_REQ 0x0f8 | 43 | #define GPC_PU_PGC_SW_PUP_REQ 0x0f8 |
28 | #define GPC_PU_PGC_SW_PDN_REQ 0x104 | 44 | #define GPC_PU_PGC_SW_PDN_REQ 0x104 |
45 | |||
29 | #define IMX7_USB_HSIC_PHY_SW_Pxx_REQ BIT(4) | 46 | #define IMX7_USB_HSIC_PHY_SW_Pxx_REQ BIT(4) |
30 | #define IMX7_USB_OTG2_PHY_SW_Pxx_REQ BIT(3) | 47 | #define IMX7_USB_OTG2_PHY_SW_Pxx_REQ BIT(3) |
31 | #define IMX7_USB_OTG1_PHY_SW_Pxx_REQ BIT(2) | 48 | #define IMX7_USB_OTG1_PHY_SW_Pxx_REQ BIT(2) |
32 | #define IMX7_PCIE_PHY_SW_Pxx_REQ BIT(1) | 49 | #define IMX7_PCIE_PHY_SW_Pxx_REQ BIT(1) |
33 | #define IMX7_MIPI_PHY_SW_Pxx_REQ BIT(0) | 50 | #define IMX7_MIPI_PHY_SW_Pxx_REQ BIT(0) |
34 | 51 | ||
52 | #define IMX8M_PCIE2_SW_Pxx_REQ BIT(13) | ||
53 | #define IMX8M_MIPI_CSI2_SW_Pxx_REQ BIT(12) | ||
54 | #define IMX8M_MIPI_CSI1_SW_Pxx_REQ BIT(11) | ||
55 | #define IMX8M_DISP_SW_Pxx_REQ BIT(10) | ||
56 | #define IMX8M_HDMI_SW_Pxx_REQ BIT(9) | ||
57 | #define IMX8M_VPU_SW_Pxx_REQ BIT(8) | ||
58 | #define IMX8M_GPU_SW_Pxx_REQ BIT(7) | ||
59 | #define IMX8M_DDR2_SW_Pxx_REQ BIT(6) | ||
60 | #define IMX8M_DDR1_SW_Pxx_REQ BIT(5) | ||
61 | #define IMX8M_OTG2_SW_Pxx_REQ BIT(3) | ||
62 | #define IMX8M_OTG1_SW_Pxx_REQ BIT(2) | ||
63 | #define IMX8M_PCIE1_SW_Pxx_REQ BIT(1) | ||
64 | #define IMX8M_MIPI_SW_Pxx_REQ BIT(0) | ||
65 | |||
35 | #define GPC_M4_PU_PDN_FLG 0x1bc | 66 | #define GPC_M4_PU_PDN_FLG 0x1bc |
36 | 67 | ||
37 | /* | 68 | /* |
@@ -43,6 +74,19 @@ | |||
43 | #define IMX7_PGC_MIPI 16 | 74 | #define IMX7_PGC_MIPI 16 |
44 | #define IMX7_PGC_PCIE 17 | 75 | #define IMX7_PGC_PCIE 17 |
45 | #define IMX7_PGC_USB_HSIC 20 | 76 | #define IMX7_PGC_USB_HSIC 20 |
77 | |||
78 | #define IMX8M_PGC_MIPI 16 | ||
79 | #define IMX8M_PGC_PCIE1 17 | ||
80 | #define IMX8M_PGC_OTG1 18 | ||
81 | #define IMX8M_PGC_OTG2 19 | ||
82 | #define IMX8M_PGC_DDR1 21 | ||
83 | #define IMX8M_PGC_GPU 23 | ||
84 | #define IMX8M_PGC_VPU 24 | ||
85 | #define IMX8M_PGC_DISP 26 | ||
86 | #define IMX8M_PGC_MIPI_CSI1 27 | ||
87 | #define IMX8M_PGC_MIPI_CSI2 28 | ||
88 | #define IMX8M_PGC_PCIE2 29 | ||
89 | |||
46 | #define GPC_PGC_CTRL(n) (0x800 + (n) * 0x40) | 90 | #define GPC_PGC_CTRL(n) (0x800 + (n) * 0x40) |
47 | #define GPC_PGC_SR(n) (GPC_PGC_CTRL(n) + 0xc) | 91 | #define GPC_PGC_SR(n) (GPC_PGC_CTRL(n) + 0xc) |
48 | 92 | ||
@@ -221,6 +265,167 @@ static const struct imx_pgc_domain_data imx7_pgc_domain_data = { | |||
221 | .reg_access_table = &imx7_access_table, | 265 | .reg_access_table = &imx7_access_table, |
222 | }; | 266 | }; |
223 | 267 | ||
268 | static const struct imx_pgc_domain imx8m_pgc_domains[] = { | ||
269 | [IMX8M_POWER_DOMAIN_MIPI] = { | ||
270 | .genpd = { | ||
271 | .name = "mipi", | ||
272 | }, | ||
273 | .bits = { | ||
274 | .pxx = IMX8M_MIPI_SW_Pxx_REQ, | ||
275 | .map = IMX8M_MIPI_A53_DOMAIN, | ||
276 | }, | ||
277 | .pgc = IMX8M_PGC_MIPI, | ||
278 | }, | ||
279 | |||
280 | [IMX8M_POWER_DOMAIN_PCIE1] = { | ||
281 | .genpd = { | ||
282 | .name = "pcie1", | ||
283 | }, | ||
284 | .bits = { | ||
285 | .pxx = IMX8M_PCIE1_SW_Pxx_REQ, | ||
286 | .map = IMX8M_PCIE1_A53_DOMAIN, | ||
287 | }, | ||
288 | .pgc = IMX8M_PGC_PCIE1, | ||
289 | }, | ||
290 | |||
291 | [IMX8M_POWER_DOMAIN_USB_OTG1] = { | ||
292 | .genpd = { | ||
293 | .name = "usb-otg1", | ||
294 | }, | ||
295 | .bits = { | ||
296 | .pxx = IMX8M_OTG1_SW_Pxx_REQ, | ||
297 | .map = IMX8M_OTG1_A53_DOMAIN, | ||
298 | }, | ||
299 | .pgc = IMX8M_PGC_OTG1, | ||
300 | }, | ||
301 | |||
302 | [IMX8M_POWER_DOMAIN_USB_OTG2] = { | ||
303 | .genpd = { | ||
304 | .name = "usb-otg2", | ||
305 | }, | ||
306 | .bits = { | ||
307 | .pxx = IMX8M_OTG2_SW_Pxx_REQ, | ||
308 | .map = IMX8M_OTG2_A53_DOMAIN, | ||
309 | }, | ||
310 | .pgc = IMX8M_PGC_OTG2, | ||
311 | }, | ||
312 | |||
313 | [IMX8M_POWER_DOMAIN_DDR1] = { | ||
314 | .genpd = { | ||
315 | .name = "ddr1", | ||
316 | }, | ||
317 | .bits = { | ||
318 | .pxx = IMX8M_DDR1_SW_Pxx_REQ, | ||
319 | .map = IMX8M_DDR2_A53_DOMAIN, | ||
320 | }, | ||
321 | .pgc = IMX8M_PGC_DDR1, | ||
322 | }, | ||
323 | |||
324 | [IMX8M_POWER_DOMAIN_GPU] = { | ||
325 | .genpd = { | ||
326 | .name = "gpu", | ||
327 | }, | ||
328 | .bits = { | ||
329 | .pxx = IMX8M_GPU_SW_Pxx_REQ, | ||
330 | .map = IMX8M_GPU_A53_DOMAIN, | ||
331 | }, | ||
332 | .pgc = IMX8M_PGC_GPU, | ||
333 | }, | ||
334 | |||
335 | [IMX8M_POWER_DOMAIN_VPU] = { | ||
336 | .genpd = { | ||
337 | .name = "vpu", | ||
338 | }, | ||
339 | .bits = { | ||
340 | .pxx = IMX8M_VPU_SW_Pxx_REQ, | ||
341 | .map = IMX8M_VPU_A53_DOMAIN, | ||
342 | }, | ||
343 | .pgc = IMX8M_PGC_VPU, | ||
344 | }, | ||
345 | |||
346 | [IMX8M_POWER_DOMAIN_DISP] = { | ||
347 | .genpd = { | ||
348 | .name = "disp", | ||
349 | }, | ||
350 | .bits = { | ||
351 | .pxx = IMX8M_DISP_SW_Pxx_REQ, | ||
352 | .map = IMX8M_DISP_A53_DOMAIN, | ||
353 | }, | ||
354 | .pgc = IMX8M_PGC_DISP, | ||
355 | }, | ||
356 | |||
357 | [IMX8M_POWER_DOMAIN_MIPI_CSI1] = { | ||
358 | .genpd = { | ||
359 | .name = "mipi-csi1", | ||
360 | }, | ||
361 | .bits = { | ||
362 | .pxx = IMX8M_MIPI_CSI1_SW_Pxx_REQ, | ||
363 | .map = IMX8M_MIPI_CSI1_A53_DOMAIN, | ||
364 | }, | ||
365 | .pgc = IMX8M_PGC_MIPI_CSI1, | ||
366 | }, | ||
367 | |||
368 | [IMX8M_POWER_DOMAIN_MIPI_CSI2] = { | ||
369 | .genpd = { | ||
370 | .name = "mipi-csi2", | ||
371 | }, | ||
372 | .bits = { | ||
373 | .pxx = IMX8M_MIPI_CSI2_SW_Pxx_REQ, | ||
374 | .map = IMX8M_MIPI_CSI2_A53_DOMAIN, | ||
375 | }, | ||
376 | .pgc = IMX8M_PGC_MIPI_CSI2, | ||
377 | }, | ||
378 | |||
379 | [IMX8M_POWER_DOMAIN_PCIE2] = { | ||
380 | .genpd = { | ||
381 | .name = "pcie2", | ||
382 | }, | ||
383 | .bits = { | ||
384 | .pxx = IMX8M_PCIE2_SW_Pxx_REQ, | ||
385 | .map = IMX8M_PCIE2_A53_DOMAIN, | ||
386 | }, | ||
387 | .pgc = IMX8M_PGC_PCIE2, | ||
388 | }, | ||
389 | }; | ||
390 | |||
391 | static const struct regmap_range imx8m_yes_ranges[] = { | ||
392 | regmap_reg_range(GPC_LPCR_A_CORE_BSC, | ||
393 | GPC_M4_PU_PDN_FLG), | ||
394 | regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_MIPI), | ||
395 | GPC_PGC_SR(IMX8M_PGC_MIPI)), | ||
396 | regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_PCIE1), | ||
397 | GPC_PGC_SR(IMX8M_PGC_PCIE1)), | ||
398 | regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_OTG1), | ||
399 | GPC_PGC_SR(IMX8M_PGC_OTG1)), | ||
400 | regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_OTG2), | ||
401 | GPC_PGC_SR(IMX8M_PGC_OTG2)), | ||
402 | regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_DDR1), | ||
403 | GPC_PGC_SR(IMX8M_PGC_DDR1)), | ||
404 | regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_GPU), | ||
405 | GPC_PGC_SR(IMX8M_PGC_GPU)), | ||
406 | regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_VPU), | ||
407 | GPC_PGC_SR(IMX8M_PGC_VPU)), | ||
408 | regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_DISP), | ||
409 | GPC_PGC_SR(IMX8M_PGC_DISP)), | ||
410 | regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_MIPI_CSI1), | ||
411 | GPC_PGC_SR(IMX8M_PGC_MIPI_CSI1)), | ||
412 | regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_MIPI_CSI2), | ||
413 | GPC_PGC_SR(IMX8M_PGC_MIPI_CSI2)), | ||
414 | regmap_reg_range(GPC_PGC_CTRL(IMX8M_PGC_PCIE2), | ||
415 | GPC_PGC_SR(IMX8M_PGC_PCIE2)), | ||
416 | }; | ||
417 | |||
418 | static const struct regmap_access_table imx8m_access_table = { | ||
419 | .yes_ranges = imx8m_yes_ranges, | ||
420 | .n_yes_ranges = ARRAY_SIZE(imx8m_yes_ranges), | ||
421 | }; | ||
422 | |||
423 | static const struct imx_pgc_domain_data imx8m_pgc_domain_data = { | ||
424 | .domains = imx8m_pgc_domains, | ||
425 | .domains_num = ARRAY_SIZE(imx8m_pgc_domains), | ||
426 | .reg_access_table = &imx8m_access_table, | ||
427 | }; | ||
428 | |||
224 | static int imx_pgc_domain_probe(struct platform_device *pdev) | 429 | static int imx_pgc_domain_probe(struct platform_device *pdev) |
225 | { | 430 | { |
226 | struct imx_pgc_domain *domain = pdev->dev.platform_data; | 431 | struct imx_pgc_domain *domain = pdev->dev.platform_data; |
@@ -235,7 +440,7 @@ static int imx_pgc_domain_probe(struct platform_device *pdev) | |||
235 | dev_err(domain->dev, "Failed to get domain's regulator\n"); | 440 | dev_err(domain->dev, "Failed to get domain's regulator\n"); |
236 | return PTR_ERR(domain->regulator); | 441 | return PTR_ERR(domain->regulator); |
237 | } | 442 | } |
238 | } else { | 443 | } else if (domain->voltage) { |
239 | regulator_set_voltage(domain->regulator, | 444 | regulator_set_voltage(domain->regulator, |
240 | domain->voltage, domain->voltage); | 445 | domain->voltage, domain->voltage); |
241 | } | 446 | } |
@@ -376,6 +581,7 @@ static int imx_gpcv2_probe(struct platform_device *pdev) | |||
376 | 581 | ||
377 | static const struct of_device_id imx_gpcv2_dt_ids[] = { | 582 | static const struct of_device_id imx_gpcv2_dt_ids[] = { |
378 | { .compatible = "fsl,imx7d-gpc", .data = &imx7_pgc_domain_data, }, | 583 | { .compatible = "fsl,imx7d-gpc", .data = &imx7_pgc_domain_data, }, |
584 | { .compatible = "fsl,imx8mq-gpc", .data = &imx8m_pgc_domain_data, }, | ||
379 | { } | 585 | { } |
380 | }; | 586 | }; |
381 | 587 | ||
diff --git a/include/dt-bindings/power/imx8mq-power.h b/include/dt-bindings/power/imx8mq-power.h new file mode 100644 index 000000000000..8a513bd9166e --- /dev/null +++ b/include/dt-bindings/power/imx8mq-power.h | |||
@@ -0,0 +1,21 @@ | |||
1 | /* SPDX-License-Identifier: (GPL-2.0 OR MIT) */ | ||
2 | /* | ||
3 | * Copyright (C) 2018 Pengutronix, Lucas Stach <kernel@pengutronix.de> | ||
4 | */ | ||
5 | |||
6 | #ifndef __DT_BINDINGS_IMX8MQ_POWER_H__ | ||
7 | #define __DT_BINDINGS_IMX8MQ_POWER_H__ | ||
8 | |||
9 | #define IMX8M_POWER_DOMAIN_MIPI 0 | ||
10 | #define IMX8M_POWER_DOMAIN_PCIE1 1 | ||
11 | #define IMX8M_POWER_DOMAIN_USB_OTG1 2 | ||
12 | #define IMX8M_POWER_DOMAIN_USB_OTG2 3 | ||
13 | #define IMX8M_POWER_DOMAIN_DDR1 4 | ||
14 | #define IMX8M_POWER_DOMAIN_GPU 5 | ||
15 | #define IMX8M_POWER_DOMAIN_VPU 6 | ||
16 | #define IMX8M_POWER_DOMAIN_DISP 7 | ||
17 | #define IMX8M_POWER_DOMAIN_MIPI_CSI1 8 | ||
18 | #define IMX8M_POWER_DOMAIN_MIPI_CSI2 9 | ||
19 | #define IMX8M_POWER_DOMAIN_PCIE2 10 | ||
20 | |||
21 | #endif | ||