--- /dev/null
+#include <mach/rk29_iomap.h>
+#include <mach/board.h>
+#include <mach/sram.h>
+#include <asm/io.h>\r
+#include <mach/iomux.h>\r
+\r
+#define GRF_GPIO0_DIR 0x000\r
+#define GRF_GPIO1_DIR 0x004\r
+#define GRF_GPIO2_DIR 0x008\r
+#define GRF_GPIO3_DIR 0x00c\r
+#define GRF_GPIO4_DIR 0x010\r
+#define GRF_GPIO5_DIR 0x014\r
+\r
+\r
+#define GRF_GPIO0_DO 0x018\r
+#define GRF_GPIO1_DO 0x01c\r
+#define GRF_GPIO2_DO 0x020\r
+#define GRF_GPIO3_DO 0x024\r
+#define GRF_GPIO4_DO 0x028\r
+#define GRF_GPIO5_DO 0x02c\r
+\r
+#define GRF_GPIO0_EN 0x030\r
+#define GRF_GPIO1_EN 0x034\r
+#define GRF_GPIO2_EN 0x038\r
+#define GRF_GPIO3_EN 0x03c\r
+#define GRF_GPIO4_EN 0x040\r
+#define GRF_GPIO5_EN 0x044\r
+\r
+\r
+#define GRF_GPIO0L_IOMUX 0x048\r
+#define GRF_GPIO0H_IOMUX 0x04c\r
+#define GRF_GPIO1L_IOMUX 0x050\r
+#define GRF_GPIO1H_IOMUX 0x054\r
+#define GRF_GPIO2L_IOMUX 0x058\r
+#define GRF_GPIO2H_IOMUX 0x05c\r
+#define GRF_GPIO3L_IOMUX 0x060\r
+#define GRF_GPIO3H_IOMUX 0x064\r
+#define GRF_GPIO4L_IOMUX 0x068\r
+#define GRF_GPIO4H_IOMUX 0x06c\r
+#define GRF_GPIO5L_IOMUX 0x070\r
+#define GRF_GPIO5H_IOMUX 0x074\r
+\r
+#define grf_readl(offset) readl(RK29_GRF_BASE + offset)
+#define grf_writel(v, offset) do { writel(v, RK29_GRF_BASE + offset); readl(RK29_GRF_BASE + offset); } while (0)
+\r
+#if CONFIG_MACH_RK29_A22\r
+\r
+typedef struct GPIO_IOMUX\r
+{
+ unsigned int GPIOL_IOMUX;\r
+ unsigned int GPIOH_IOMUX;\r
+}GPIO_IOMUX_PM;\r
+
+//GRF Registers
+typedef struct REG_FILE_GRF\r
+{
+ unsigned int GRF_GPIO_DIR[6]; \r
+ unsigned int GRF_GPIO_DO[6];\r
+ unsigned int GRF_GPIO_EN[6];\r
+ GPIO_IOMUX_PM GRF_GPIO_IOMUX[6];\r
+ unsigned int GRF_GPIO_PULL[7];\r
+} GRF_REG_SAVE;\r
+\r
+GRF_REG_SAVE __sramdata pm_grf;\r
+\r
+void __sramfunc pm_spi_gpio_prepare(void)\r
+{\r
+ \r
+ pm_grf.GRF_GPIO_IOMUX[1].GPIOL_IOMUX = grf_readl(GRF_GPIO1L_IOMUX);\r
+ pm_grf.GRF_GPIO_IOMUX[2].GPIOH_IOMUX = grf_readl(GRF_GPIO2H_IOMUX);\r
+\r
+\r
+ pm_grf.GRF_GPIO_PULL[1] = grf_readl(GRF_GPIO1_PULL);\r
+ pm_grf.GRF_GPIO_PULL[2] = grf_readl(GRF_GPIO2_PULL);\r
+\r
+ pm_grf.GRF_GPIO_EN[1] = grf_readl(GRF_GPIO1_EN);\r
+ pm_grf.GRF_GPIO_EN[2] = grf_readl(GRF_GPIO2_EN);\r
+\r
+}\r
+\r
+\r
+void __sramfunc pm_spi_gpio_suspend(void)\r
+{\r
+ int io1L_iomux;\r
+ int io2H_iomux;\r
+ int io1_pull,io2_pull;\r
+ int io1_en,io2_en;\r
+ pm_spi_gpio_prepare();\r
+\r
+ io1L_iomux = grf_readl(GRF_GPIO1L_IOMUX);\r
+ io2H_iomux = grf_readl(GRF_GPIO2H_IOMUX);\r
+\r
+ io1L_iomux &= (~((0x03<<6)|(0x03 <<8)));\r
+ io2H_iomux &= 0xffff0000;\r
+ grf_writel(io1L_iomux&(~((0x03<<6)|(0x03 <<8))), GRF_GPIO1L_IOMUX);\r
+ grf_writel(io2H_iomux&0xffff0000, GRF_GPIO2H_IOMUX);\r
+\r
+ io1_pull = grf_readl(GRF_GPIO1_PULL);\r
+ io2_pull = grf_readl(GRF_GPIO2_PULL);\r
+ \r
+ grf_writel(io1_pull|0x18,GRF_GPIO1_PULL);\r
+ grf_writel(io2_pull|0x00ff0000,GRF_GPIO2_PULL);\r
+\r
+ io1_en = grf_readl(GRF_GPIO1_EN);\r
+ io2_en = grf_readl(GRF_GPIO2_EN);\r
+ \r
+ grf_writel(io1_en|0x18,GRF_GPIO1_EN);\r
+ grf_writel(io2_en|0x00ff0000,GRF_GPIO2_EN);\r
+\r
+\r
+\r
+\r
+\r
+}\r
+\r
+void __sramfunc pm_spi_gpio_resume(void)\r
+{\r
+\r
+ grf_writel(pm_grf.GRF_GPIO_EN[1],GRF_GPIO1_EN);\r
+ grf_writel(pm_grf.GRF_GPIO_EN[2],GRF_GPIO2_EN);\r
+ grf_writel(pm_grf.GRF_GPIO_PULL[1],GRF_GPIO1_PULL);\r
+ grf_writel(pm_grf.GRF_GPIO_PULL[2],GRF_GPIO2_PULL);\r
+\r
+ grf_writel(pm_grf.GRF_GPIO_IOMUX[1].GPIOL_IOMUX, GRF_GPIO1L_IOMUX);\r
+ grf_writel(pm_grf.GRF_GPIO_IOMUX[2].GPIOH_IOMUX, GRF_GPIO2H_IOMUX);\r
+\r
+\r
+\r
+\r
+}\r
+\r
+#else\r
+void __sramfunc pm_spi_gpio_prepare(void)\r
+{\r
+\r
+}\r
+\r
+void __sramfunc pm_spi_gpio_suspend(void)\r
+{\r
+\r
+}\r
+void __sramfunc pm_spi_gpio_resume(void)\r
+{\r
+\r
+}\r
+#endif\r