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;
}
Exemple #2
0
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;
}
Exemple #3
0
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);
}