summaryrefslogtreecommitdiffstats
path: root/arch/arm/common/scoop.c
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2005-10-12 14:43:32 +1000
committerPaul Mackerras <paulus@samba.org>2005-10-12 14:43:32 +1000
commitb6ec995a21a9428aef620b5adf46d047a18d88b8 (patch)
tree6719121e6605cbca524b687f47336b9bbf3b8d41 /arch/arm/common/scoop.c
parent3a5f8c5f788d68e325d9fe3c26f4df5a5aee838a (diff)
parentda64c6ee6bb71bfb3f09d9bb89ce1aa4b1ee7e89 (diff)
downloadblackbird-op-linux-b6ec995a21a9428aef620b5adf46d047a18d88b8.tar.gz
blackbird-op-linux-b6ec995a21a9428aef620b5adf46d047a18d88b8.zip
Merge from Linus' tree
Diffstat (limited to 'arch/arm/common/scoop.c')
-rw-r--r--arch/arm/common/scoop.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/arch/arm/common/scoop.c b/arch/arm/common/scoop.c
index d3a04c2a2c85..9e5245c702de 100644
--- a/arch/arm/common/scoop.c
+++ b/arch/arm/common/scoop.c
@@ -26,6 +26,8 @@ struct scoop_pcmcia_dev *scoop_devs;
struct scoop_dev {
void *base;
spinlock_t scoop_lock;
+ unsigned short suspend_clr;
+ unsigned short suspend_set;
u32 scoop_gpwr;
};
@@ -90,14 +92,24 @@ EXPORT_SYMBOL(reset_scoop);
EXPORT_SYMBOL(read_scoop_reg);
EXPORT_SYMBOL(write_scoop_reg);
+static void check_scoop_reg(struct scoop_dev *sdev)
+{
+ unsigned short mcr;
+
+ mcr = SCOOP_REG(sdev->base, SCOOP_MCR);
+ if ((mcr & 0x100) == 0)
+ SCOOP_REG(sdev->base, SCOOP_MCR) = 0x0101;
+}
+
#ifdef CONFIG_PM
static int scoop_suspend(struct device *dev, pm_message_t state, uint32_t level)
{
if (level == SUSPEND_POWER_DOWN) {
struct scoop_dev *sdev = dev_get_drvdata(dev);
- sdev->scoop_gpwr = SCOOP_REG(sdev->base,SCOOP_GPWR);
- SCOOP_REG(sdev->base,SCOOP_GPWR) = 0;
+ check_scoop_reg(sdev);
+ sdev->scoop_gpwr = SCOOP_REG(sdev->base, SCOOP_GPWR);
+ SCOOP_REG(sdev->base, SCOOP_GPWR) = (sdev->scoop_gpwr & ~sdev->suspend_clr) | sdev->suspend_set;
}
return 0;
}
@@ -107,6 +119,7 @@ static int scoop_resume(struct device *dev, uint32_t level)
if (level == RESUME_POWER_ON) {
struct scoop_dev *sdev = dev_get_drvdata(dev);
+ check_scoop_reg(sdev);
SCOOP_REG(sdev->base,SCOOP_GPWR) = sdev->scoop_gpwr;
}
return 0;
@@ -151,6 +164,9 @@ int __init scoop_probe(struct device *dev)
SCOOP_REG(devptr->base, SCOOP_GPCR) = inf->io_dir & 0xffff;
SCOOP_REG(devptr->base, SCOOP_GPWR) = inf->io_out & 0xffff;
+ devptr->suspend_clr = inf->suspend_clr;
+ devptr->suspend_set = inf->suspend_set;
+
return 0;
}
OpenPOWER on IntegriCloud