diff options
Diffstat (limited to 'arch/powerpc/platforms/52xx/lite5200_pm.c')
| -rw-r--r-- | arch/powerpc/platforms/52xx/lite5200_pm.c | 14 | 
1 files changed, 13 insertions, 1 deletions
diff --git a/arch/powerpc/platforms/52xx/lite5200_pm.c b/arch/powerpc/platforms/52xx/lite5200_pm.c index 41c7fd91e99..fe92e65103e 100644 --- a/arch/powerpc/platforms/52xx/lite5200_pm.c +++ b/arch/powerpc/platforms/52xx/lite5200_pm.c @@ -14,6 +14,7 @@ static struct mpc52xx_sdma __iomem *bes;  static struct mpc52xx_xlb __iomem *xlb;  static struct mpc52xx_gpio __iomem *gps;  static struct mpc52xx_gpio_wkup __iomem *gpw; +static void __iomem *pci;  static void __iomem *sram;  static const int sram_size = 0x4000;	/* 16 kBytes */  static void __iomem *mbar; @@ -50,6 +51,8 @@ static int lite5200_pm_prepare(void)  		{ .type = "builtin", .compatible = "mpc5200", }, /* efika */  		{}  	}; +	u64 regaddr64 = 0; +	const u32 *regaddr_p;  	/* deep sleep? let mpc52xx code handle that */  	if (lite5200_pm_target_state == PM_SUSPEND_STANDBY) @@ -60,8 +63,12 @@ static int lite5200_pm_prepare(void)  	/* map registers */  	np = of_find_matching_node(NULL, immr_ids); -	mbar = of_iomap(np, 0); +	regaddr_p = of_get_address(np, 0, NULL, NULL); +	if (regaddr_p) +		regaddr64 = of_translate_address(np, regaddr_p);  	of_node_put(np); + +	mbar = ioremap((u32) regaddr64, 0xC000);  	if (!mbar) {  		printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__);  		return -ENOSYS; @@ -71,6 +78,7 @@ static int lite5200_pm_prepare(void)  	pic = mbar + 0x500;  	gps = mbar + 0xb00;  	gpw = mbar + 0xc00; +	pci = mbar + 0xd00;  	bes = mbar + 0x1200;  	xlb = mbar + 0x1f00;  	sram = mbar + 0x8000; @@ -85,6 +93,7 @@ static struct mpc52xx_sdma sbes;  static struct mpc52xx_xlb sxlb;  static struct mpc52xx_gpio sgps;  static struct mpc52xx_gpio_wkup sgpw; +static char spci[0x200];  static void lite5200_save_regs(void)  { @@ -94,6 +103,7 @@ static void lite5200_save_regs(void)  	_memcpy_fromio(&sxlb, xlb, sizeof(*xlb));  	_memcpy_fromio(&sgps, gps, sizeof(*gps));  	_memcpy_fromio(&sgpw, gpw, sizeof(*gpw)); +	_memcpy_fromio(spci, pci, 0x200);  	_memcpy_fromio(saved_sram, sram, sram_size);  } @@ -103,6 +113,8 @@ static void lite5200_restore_regs(void)  	int i;  	_memcpy_toio(sram, saved_sram, sram_size); +	/* PCI Configuration */ +	_memcpy_toio(pci, spci, 0x200);  	/*  	 * GPIOs. Interrupt Master Enable has higher address then other  |