aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2018-11-16 10:49:27 -0500
committerShawn Guo <shawnguo@kernel.org>2018-12-04 19:50:36 -0500
commit685efffe37c921cf1d56dd3c8617dc67bc343a99 (patch)
tree02150a8865adf3940bbc7e2d1d689d5328cb96f8
parente125dcba83f59b87b1db30f5b7075705d95cfcf7 (diff)
soc: imx: gpcv2: add support for i.MX8MQ SoC
The GPCv2 on the Freescale i.MX8MQ SoC works in the same way as the GPCv2 on the i.MX7, but only controls more power domains with a different mapping. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Acked-by: Rob Herring <robh@kernel.org> Signed-off-by: Shawn Guo <shawnguo@kernel.org>
-rw-r--r--Documentation/devicetree/bindings/power/fsl,imx-gpcv2.txt7
-rw-r--r--drivers/soc/imx/Kconfig6
-rw-r--r--drivers/soc/imx/Makefile2
-rw-r--r--drivers/soc/imx/gpcv2.c208
-rw-r--r--include/dt-bindings/power/imx8mq-power.h21
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
7Required properties: 7Required 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:
22Required properties: 24Required 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 @@
1menu "i.MX SoC drivers" 1menu "i.MX SoC drivers"
2 2
3config IMX7_PM_DOMAINS 3config 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 @@
1obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o 1obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o
2obj-$(CONFIG_IMX7_PM_DOMAINS) += gpcv2.o 2obj-$(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
268static 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
391static 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
418static 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
423static 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
224static int imx_pgc_domain_probe(struct platform_device *pdev) 429static 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
377static const struct of_device_id imx_gpcv2_dt_ids[] = { 582static 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