From b2a6dc92cfb3624939cf271b8052fbac0e026def Mon Sep 17 00:00:00 2001 From: Chenhui Zhao Date: Fri, 14 Mar 2014 17:19:57 +0800 Subject: powerpc/t104x: enable wakeup sources Set the register IPPDEXPCR (IP Powerdown Exception Control Register) to enable IP blocks which work as wakeup source when sleep/deep sleep. Change-Id: Id95cb920cab90e12851995d039bd866e6388f8ae Signed-off-by: Chenhui Zhao Reviewed-on: http://git.am.freescale.net:8181/10711 Tested-by: Review Code-CDREVIEW Reviewed-by: Yang Li Reviewed-by: Jose Rivera diff --git a/arch/powerpc/boot/dts/fsl/t1040si-post.dtsi b/arch/powerpc/boot/dts/fsl/t1040si-post.dtsi index eccb100..696e30b 100644 --- a/arch/powerpc/boot/dts/fsl/t1040si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/t1040si-post.dtsi @@ -531,12 +531,16 @@ fsl,iommu-parent = <&pamu0>; fsl,liodn-reg = <&guts 0x530>; /* eSDHCLIODNR */ sdhci,auto-cmd12; + sleep = <&rcpm 0x00000080>; }; /include/ "qoriq-i2c-0.dtsi" /include/ "qoriq-i2c-1.dtsi" /include/ "qoriq-duart-0.dtsi" /include/ "qoriq-duart-1.dtsi" /include/ "qoriq-gpio-0.dtsi" + gpio@130000 { + sleep = <&rcpm 0x00000040>; + }; /include/ "qoriq-gpio-1.dtsi" /include/ "qoriq-gpio-2.dtsi" /include/ "qoriq-gpio-3.dtsi" @@ -546,6 +550,7 @@ fsl,iommu-parent = <&pamu0>; fsl,liodn-reg = <&guts 0x520>; /* USB1LIODNR */ phy_type = "utmi"; + sleep = <&rcpm 0x00000020>; port0; }; /include/ "qoriq-usb2-dr-0.dtsi" @@ -555,6 +560,7 @@ fsl,liodn-reg = <&guts 0x524>; /* USB2LIODNR */ dr_mode = "host"; phy_type = "utmi"; + sleep = <&rcpm 0x00000010>; }; display:display@180000 { diff --git a/arch/powerpc/boot/dts/t1040rdb.dts b/arch/powerpc/boot/dts/t1040rdb.dts index 04b5005..dcb5a93 100644 --- a/arch/powerpc/boot/dts/t1040rdb.dts +++ b/arch/powerpc/boot/dts/t1040rdb.dts @@ -309,22 +309,27 @@ ethernet@0 { compatible = "fsl,t1040-dpa-ethernet", "fsl,dpa-ethernet"; fsl,fman-mac = <&enet0>; + sleep = <&rcpm 0x80000008>; }; ethernet@1 { compatible = "fsl,t1040-dpa-ethernet", "fsl,dpa-ethernet"; fsl,fman-mac = <&enet1>; + sleep = <&rcpm 0x40000008>; }; ethernet@2 { compatible = "fsl,t1040-dpa-ethernet", "fsl,dpa-ethernet"; fsl,fman-mac = <&enet2>; + sleep = <&rcpm 0x20000008>; }; ethernet@3 { compatible = "fsl,t1040-dpa-ethernet", "fsl,dpa-ethernet"; fsl,fman-mac = <&enet3>; + sleep = <&rcpm 0x10000008>; }; ethernet@4 { compatible = "fsl,t1040-dpa-ethernet", "fsl,dpa-ethernet"; fsl,fman-mac = <&enet4>; + sleep = <&rcpm 0x08000008>; }; }; diff --git a/arch/powerpc/boot/dts/t1042rdb_pi.dts b/arch/powerpc/boot/dts/t1042rdb_pi.dts index f0940f6..f89fee9 100644 --- a/arch/powerpc/boot/dts/t1042rdb_pi.dts +++ b/arch/powerpc/boot/dts/t1042rdb_pi.dts @@ -267,10 +267,12 @@ ethernet@3 { compatible = "fsl,t1042-dpa-ethernet", "fsl,dpa-ethernet"; fsl,fman-mac = <&enet3>; + sleep = <&rcpm 0x10000008>; }; ethernet@4 { compatible = "fsl,t1042-dpa-ethernet", "fsl,dpa-ethernet"; fsl,fman-mac = <&enet4>; + sleep = <&rcpm 0x08000008>; }; }; }; diff --git a/arch/powerpc/boot/dts/t104xqds.dtsi b/arch/powerpc/boot/dts/t104xqds.dtsi index d54f7d6..079a4cd 100644 --- a/arch/powerpc/boot/dts/t104xqds.dtsi +++ b/arch/powerpc/boot/dts/t104xqds.dtsi @@ -335,22 +335,27 @@ ethernet@0 { compatible = "fsl,t1040-dpa-ethernet", "fsl,dpa-ethernet"; fsl,fman-mac = <&enet0>; + sleep = <&rcpm 0x80000008>; }; ethernet@1 { compatible = "fsl,t1040-dpa-ethernet", "fsl,dpa-ethernet"; fsl,fman-mac = <&enet1>; + sleep = <&rcpm 0x40000008>; }; ethernet@2 { compatible = "fsl,t1040-dpa-ethernet", "fsl,dpa-ethernet"; fsl,fman-mac = <&enet2>; + sleep = <&rcpm 0x20000008>; }; ethernet@3 { compatible = "fsl,t1040-dpa-ethernet", "fsl,dpa-ethernet"; fsl,fman-mac = <&enet3>; + sleep = <&rcpm 0x10000008>; }; ethernet@4 { compatible = "fsl,t1040-dpa-ethernet", "fsl,dpa-ethernet"; fsl,fman-mac = <&enet4>; + sleep = <&rcpm 0x08000008>; }; }; diff --git a/arch/powerpc/platforms/85xx/qoriq_pm.c b/arch/powerpc/platforms/85xx/qoriq_pm.c index b6718f0..4578a63 100644 --- a/arch/powerpc/platforms/85xx/qoriq_pm.c +++ b/arch/powerpc/platforms/85xx/qoriq_pm.c @@ -27,6 +27,22 @@ unsigned int sleep_pm_state; /* supported sleep modes by the present platform */ static unsigned int sleep_modes; +void qoriq_enable_wakeup_source(struct device *dev, void *data) +{ + u32 value[2]; + u32 pw_mask; + + if (!device_may_wakeup(dev)) + return; + + if (of_property_read_u32_array(dev->of_node, "sleep", value, 2)) + return; + + /* get the second value, it is a mask */ + pw_mask = value[1]; + qoriq_pm_ops->set_ip_power(1, pw_mask); +} + static int qoriq_suspend_enter(suspend_state_t state) { int ret = 0; @@ -74,6 +90,8 @@ static int qoriq_suspend_valid(suspend_state_t state) static int qoriq_suspend_begin(suspend_state_t state) { + dpm_for_each_dev(NULL, qoriq_enable_wakeup_source); + if (state == PM_SUSPEND_MEM) return fsl_dp_iomap(); -- cgit v0.10.2