aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-s3c24xx
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/plat-s3c24xx')
-rw-r--r--arch/arm/plat-s3c24xx/dma.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/arch/arm/plat-s3c24xx/dma.c b/arch/arm/plat-s3c24xx/dma.c
index 10ef3995b114..68ce89db17db 100644
--- a/arch/arm/plat-s3c24xx/dma.c
+++ b/arch/arm/plat-s3c24xx/dma.c
@@ -1173,6 +1173,7 @@ int s3c2410_dma_devconfig(int channel,
1173 1173
1174 chan->source = source; 1174 chan->source = source;
1175 chan->dev_addr = devaddr; 1175 chan->dev_addr = devaddr;
1176 chan->hw_cfg = hwcfg;
1176 1177
1177 switch (source) { 1178 switch (source) {
1178 case S3C2410_DMASRC_HW: 1179 case S3C2410_DMASRC_HW:
@@ -1235,6 +1236,10 @@ int s3c2410_dma_getposition(dmach_t channel, dma_addr_t *src, dma_addr_t *dst)
1235 1236
1236EXPORT_SYMBOL(s3c2410_dma_getposition); 1237EXPORT_SYMBOL(s3c2410_dma_getposition);
1237 1238
1239static struct s3c2410_dma_chan *to_dma_chan(struct sys_device *dev)
1240{
1241 return container_of(dev, struct s3c2410_dma_chan, dev);
1242}
1238 1243
1239/* system device class */ 1244/* system device class */
1240 1245
@@ -1242,7 +1247,7 @@ EXPORT_SYMBOL(s3c2410_dma_getposition);
1242 1247
1243static int s3c2410_dma_suspend(struct sys_device *dev, pm_message_t state) 1248static int s3c2410_dma_suspend(struct sys_device *dev, pm_message_t state)
1244{ 1249{
1245 struct s3c2410_dma_chan *cp = container_of(dev, struct s3c2410_dma_chan, dev); 1250 struct s3c2410_dma_chan *cp = to_dma_chan(dev);
1246 1251
1247 printk(KERN_DEBUG "suspending dma channel %d\n", cp->number); 1252 printk(KERN_DEBUG "suspending dma channel %d\n", cp->number);
1248 1253
@@ -1264,6 +1269,24 @@ static int s3c2410_dma_suspend(struct sys_device *dev, pm_message_t state)
1264 1269
1265static int s3c2410_dma_resume(struct sys_device *dev) 1270static int s3c2410_dma_resume(struct sys_device *dev)
1266{ 1271{
1272 struct s3c2410_dma_chan *cp = to_dma_chan(dev);
1273 unsigned int no = cp->number | DMACH_LOW_LEVEL;
1274
1275 /* restore channel's hardware configuration */
1276
1277 if (!cp->in_use)
1278 return 0;
1279
1280 printk(KERN_INFO "dma%d: restoring configuration\n", cp->number);
1281
1282 s3c2410_dma_config(no, cp->xfer_unit, cp->dcon);
1283 s3c2410_dma_devconfig(no, cp->source, cp->hw_cfg, cp->dev_addr);
1284
1285 /* re-select the dma source for this channel */
1286
1287 if (cp->map != NULL)
1288 dma_sel.select(cp, cp->map);
1289
1267 return 0; 1290 return 0;
1268} 1291}
1269 1292
@@ -1453,6 +1476,7 @@ static struct s3c2410_dma_chan *s3c2410_dma_map_channel(int channel)
1453 1476
1454 found: 1477 found:
1455 dmach = &s3c2410_chans[ch]; 1478 dmach = &s3c2410_chans[ch];
1479 dmach->map = ch_map;
1456 dma_chan_map[channel] = dmach; 1480 dma_chan_map[channel] = dmach;
1457 1481
1458 /* select the channel */ 1482 /* select the channel */