static void cs5530_set_dmamode(struct ata_port *ap, struct ata_device *adev) { void __iomem *base = cs5530_port_base(ap); u32 tuning, timing = 0; u8 reg; tuning = ioread32(base + 0x04); switch(adev->dma_mode) { case XFER_UDMA_0: timing = 0x00921250; break; case XFER_UDMA_1: timing = 0x00911140; break; case XFER_UDMA_2: timing = 0x00911030; break; case XFER_MW_DMA_0: timing = 0x00077771; break; case XFER_MW_DMA_1: timing = 0x00012121; break; case XFER_MW_DMA_2: timing = 0x00002020; break; default: BUG(); } timing |= (tuning & 0x80000000UL); if (adev->devno == 0) iowrite32(timing, base + 0x04); else { if (timing & 0x00100000) tuning |= 0x00100000; else tuning &= ~0x00100000; iowrite32(tuning, base + 0x04); iowrite32(timing, base + 0x0C); } reg = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS); reg |= (1 << (5 + adev->devno)); iowrite8(reg, ap->ioaddr.bmdma_addr + ATA_DMA_STATUS); ap->private_data = adev; }
static void cs5530_set_dmamode(struct ata_port *ap, struct ata_device *adev) { void __iomem *base = cs5530_port_base(ap); u32 tuning, timing = 0; u8 reg; /* Find out which table to use */ tuning = ioread32(base + 0x04); switch(adev->dma_mode) { case XFER_UDMA_0: timing = 0x00921250;break; case XFER_UDMA_1: timing = 0x00911140;break; case XFER_UDMA_2: timing = 0x00911030;break; case XFER_MW_DMA_0: timing = 0x00077771;break; case XFER_MW_DMA_1: timing = 0x00012121;break; case XFER_MW_DMA_2: timing = 0x00002020;break; default: BUG(); } /* Merge in the PIO format bit */ timing |= (tuning & 0x80000000UL); if (adev->devno == 0) /* Master */ iowrite32(timing, base + 0x04); else { if (timing & 0x00100000) tuning |= 0x00100000; /* UDMA for both */ else tuning &= ~0x00100000; /* MWDMA for both */ iowrite32(tuning, base + 0x04); iowrite32(timing, base + 0x0C); } /* Set the DMA capable bit in the BMDMA area */ reg = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS); reg |= (1 << (5 + adev->devno)); iowrite8(reg, ap->ioaddr.bmdma_addr + ATA_DMA_STATUS); /* Remember the last DMA setup we did */ ap->private_data = adev; }
static void cs5530_set_piomode(struct ata_port *ap, struct ata_device *adev) { static const unsigned int cs5530_pio_timings[2][5] = { {0x00009172, 0x00012171, 0x00020080, 0x00032010, 0x00040010}, {0xd1329172, 0x71212171, 0x30200080, 0x20102010, 0x00100010} }; void __iomem *base = cs5530_port_base(ap); u32 tuning; int format; /* Find out which table to use */ tuning = ioread32(base + 0x04); format = (tuning & 0x80000000UL) ? 1 : 0; /* Now load the right timing register */ if (adev->devno) base += 0x08; iowrite32(cs5530_pio_timings[format][adev->pio_mode - XFER_PIO_0], base); }