Lines Matching +full:dma +full:- +full:33 +full:bits

1 // SPDX-License-Identifier: GPL-2.0-only
3 * pata_optidma.c - Opti DMA PATA for new ATA layer
6 * The Opti DMA controllers are related to the older PIO PCI controllers
11 * This driver should support Viper-N+, FireStar, FireStar Plus.
13 * These devices support virtual DMA for read (aka the CS5520). Later
15 * so you have to get this right. We don't support the virtual DMA
18 * Bits that are worth knowing
20 * 0x1F5 bit 0 tells you if the PCI/VLB clock is 33 or 25Mhz
21 * Virtual DMA registers *move* between rev 0x02 and rev 0x10
45 static int pci_clock; /* 0 = 33 1 = 25 */
48 * optidma_pre_reset - probe begin
57 struct ata_port *ap = link->ap; in optidma_pre_reset()
58 struct pci_dev *pdev = to_pci_dev(ap->host->dev); in optidma_pre_reset()
63 if (ap->port_no && !pci_test_config_bits(pdev, &optidma_enable_bits)) in optidma_pre_reset()
64 return -ENOENT; in optidma_pre_reset()
70 * optidma_unlock - unlock control registers
79 void __iomem *regio = ap->ioaddr.cmd_addr; in optidma_unlock()
88 * optidma_lock - issue temporary relock
91 * Re-lock the configuration register settings.
96 void __iomem *regio = ap->ioaddr.cmd_addr; in optidma_lock()
103 * optidma_mode_setup - set mode data
108 * Called to do the DMA or PIO mode setup. Timing numbers are all
119 int pio = adev->pio_mode - XFER_PIO_0; in optidma_mode_setup()
120 int dma = adev->dma_mode - XFER_MW_DMA_0; in optidma_mode_setup() local
121 void __iomem *regio = ap->ioaddr.cmd_addr; in optidma_mode_setup()
145 * need to look at slowest of PIO/DMA mode of either device in optidma_mode_setup()
159 pair_addr = addr_timing[pci_clock][pair->pio_mode - XFER_PIO_0]; in optidma_mode_setup()
166 iowrite8(adev->devno, regio + MISC_REG); in optidma_mode_setup()
172 iowrite8(dma_data_rec_timing[pci_clock][dma], regio + READ_REG); in optidma_mode_setup()
173 iowrite8(dma_data_rec_timing[pci_clock][dma], regio + WRITE_REG); in optidma_mode_setup()
176 iowrite8(addr | adev->devno, regio + MISC_REG); in optidma_mode_setup()
186 until we've done both sets of PIO/DMA timings */ in optidma_mode_setup()
190 * optiplus_mode_setup - DMA setup for Firestar Plus
195 * The Firestar plus has additional UDMA functionality for UDMA0-2 and
203 struct pci_dev *pdev = to_pci_dev(ap->host->dev); in optiplus_mode_setup()
206 int dev2 = 2 * adev->devno; in optiplus_mode_setup()
207 int unit = 2 * ap->port_no + adev->devno; in optiplus_mode_setup()
208 int udma = mode - XFER_UDMA_0; in optiplus_mode_setup()
213 optidma_mode_setup(ap, adev, adev->dma_mode); in optiplus_mode_setup()
216 if (ap->port_no) { in optiplus_mode_setup()
230 * optidma_set_pio_mode - PIO setup callback
235 * DMA programming. The architecture of the Firestar makes it easier
241 optidma_mode_setup(ap, adev, adev->pio_mode); in optidma_set_pio_mode()
245 * optidma_set_dma_mode - DMA setup callback
250 * DMA programming. The architecture of the Firestar makes it easier
256 optidma_mode_setup(ap, adev, adev->dma_mode); in optidma_set_dma_mode()
260 * optiplus_set_pio_mode - PIO setup callback
265 * DMA programming. The architecture of the Firestar makes it easier
271 optiplus_mode_setup(ap, adev, adev->pio_mode); in optiplus_set_pio_mode()
275 * optiplus_set_dma_mode - DMA setup callback
280 * DMA programming. The architecture of the Firestar makes it easier
286 optiplus_mode_setup(ap, adev, adev->dma_mode); in optiplus_set_dma_mode()
290 * optidma_make_bits43 - PCI setup helper
293 * Turn the ATA device setup into PCI configuration bits
294 * for register 0x43 and return the two bits needed.
305 return adev->dma_mode - XFER_MW_DMA_0; in optidma_make_bits43()
306 return bits43[adev->pio_mode - XFER_PIO_0]; in optidma_make_bits43()
310 * optidma_set_mode - mode setup
315 * configuration by writing the nibble of extra bits of data into
321 struct ata_port *ap = link->ap; in optidma_set_mode()
323 int nybble = 4 * ap->port_no; in optidma_set_mode()
324 struct pci_dev *pdev = to_pci_dev(ap->host->dev); in optidma_set_mode()
330 r |= (optidma_make_bits43(&link->device[0]) + in optidma_set_mode()
331 (optidma_make_bits43(&link->device[0]) << 2)) << nybble; in optidma_set_mode()
357 * optiplus_with_udma - Look for UDMA capable setup
417 ata_print_version_once(&dev->dev, DRV_VERSION); in optidma_init_one()
426 pci_clock = inb(0x1F5) & 1; /* 0 = 33Mhz, 1 = 25Mhz */ in optidma_init_one()
454 MODULE_DESCRIPTION("low-level driver for Opti Firestar/Firestar Plus");