Lines Matching +full:tf +full:- +full:a

1 // SPDX-License-Identifier: GPL-2.0-only
24 #include <linux/platform_data/ata-samsung_cf.h>
59 * struct s3c_ide_info - S3C PATA instance.
85 /* Select true-ide as the internal operating mode */ in pata_s3c_cfg_mode()
93 int t1 = ata->setup; in pata_s3c_setup_timing()
94 int t2 = ata->act8b; in pata_s3c_setup_timing()
95 int t2i = ata->rec8b; in pata_s3c_setup_timing()
105 struct s3c_ide_info *info = ap->host->private_data; in pata_s3c_set_piomode()
108 ulong ata_cfg = readl(info->ide_addr + S3C_ATA_CFG); in pata_s3c_set_piomode()
117 cycle_time = (int)(1000000000UL / clk_get_rate(info->clk)); in pata_s3c_set_piomode()
119 ata_timing_compute(adev, adev->pio_mode, &timing, in pata_s3c_set_piomode()
124 writel(ata_cfg, info->ide_addr + S3C_ATA_CFG); in pata_s3c_set_piomode()
125 writel(piotime, info->ide_addr + S3C_ATA_PIO_TIME); in pata_s3c_set_piomode()
135 void __iomem *fifo_reg = info->ide_addr + info->fifo_status_reg; in wait_for_host_ready()
143 return -EBUSY; in wait_for_host_ready()
151 struct s3c_ide_info *info = host->private_data; in ata_outb()
162 struct s3c_ide_info *info = host->private_data; in ata_inb()
168 temp = readb(info->ide_addr + S3C_ATA_PIO_RDATA); in ata_inb()
173 * pata_s3c_tf_load - send taskfile registers to host controller
176 const struct ata_taskfile *tf) in pata_s3c_tf_load() argument
178 struct ata_ioports *ioaddr = &ap->ioaddr; in pata_s3c_tf_load()
179 unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR; in pata_s3c_tf_load()
181 if (tf->ctl != ap->last_ctl) { in pata_s3c_tf_load()
182 ata_outb(ap->host, tf->ctl, ioaddr->ctl_addr); in pata_s3c_tf_load()
183 ap->last_ctl = tf->ctl; in pata_s3c_tf_load()
187 if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) { in pata_s3c_tf_load()
188 ata_outb(ap->host, tf->hob_feature, ioaddr->feature_addr); in pata_s3c_tf_load()
189 ata_outb(ap->host, tf->hob_nsect, ioaddr->nsect_addr); in pata_s3c_tf_load()
190 ata_outb(ap->host, tf->hob_lbal, ioaddr->lbal_addr); in pata_s3c_tf_load()
191 ata_outb(ap->host, tf->hob_lbam, ioaddr->lbam_addr); in pata_s3c_tf_load()
192 ata_outb(ap->host, tf->hob_lbah, ioaddr->lbah_addr); in pata_s3c_tf_load()
196 ata_outb(ap->host, tf->feature, ioaddr->feature_addr); in pata_s3c_tf_load()
197 ata_outb(ap->host, tf->nsect, ioaddr->nsect_addr); in pata_s3c_tf_load()
198 ata_outb(ap->host, tf->lbal, ioaddr->lbal_addr); in pata_s3c_tf_load()
199 ata_outb(ap->host, tf->lbam, ioaddr->lbam_addr); in pata_s3c_tf_load()
200 ata_outb(ap->host, tf->lbah, ioaddr->lbah_addr); in pata_s3c_tf_load()
203 if (tf->flags & ATA_TFLAG_DEVICE) in pata_s3c_tf_load()
204 ata_outb(ap->host, tf->device, ioaddr->device_addr); in pata_s3c_tf_load()
210 * pata_s3c_tf_read - input device's ATA taskfile shadow registers
212 static void pata_s3c_tf_read(struct ata_port *ap, struct ata_taskfile *tf) in pata_s3c_tf_read() argument
214 struct ata_ioports *ioaddr = &ap->ioaddr; in pata_s3c_tf_read()
216 tf->feature = ata_inb(ap->host, ioaddr->error_addr); in pata_s3c_tf_read()
217 tf->nsect = ata_inb(ap->host, ioaddr->nsect_addr); in pata_s3c_tf_read()
218 tf->lbal = ata_inb(ap->host, ioaddr->lbal_addr); in pata_s3c_tf_read()
219 tf->lbam = ata_inb(ap->host, ioaddr->lbam_addr); in pata_s3c_tf_read()
220 tf->lbah = ata_inb(ap->host, ioaddr->lbah_addr); in pata_s3c_tf_read()
221 tf->device = ata_inb(ap->host, ioaddr->device_addr); in pata_s3c_tf_read()
223 if (tf->flags & ATA_TFLAG_LBA48) { in pata_s3c_tf_read()
224 ata_outb(ap->host, tf->ctl | ATA_HOB, ioaddr->ctl_addr); in pata_s3c_tf_read()
225 tf->hob_feature = ata_inb(ap->host, ioaddr->error_addr); in pata_s3c_tf_read()
226 tf->hob_nsect = ata_inb(ap->host, ioaddr->nsect_addr); in pata_s3c_tf_read()
227 tf->hob_lbal = ata_inb(ap->host, ioaddr->lbal_addr); in pata_s3c_tf_read()
228 tf->hob_lbam = ata_inb(ap->host, ioaddr->lbam_addr); in pata_s3c_tf_read()
229 tf->hob_lbah = ata_inb(ap->host, ioaddr->lbah_addr); in pata_s3c_tf_read()
230 ata_outb(ap->host, tf->ctl, ioaddr->ctl_addr); in pata_s3c_tf_read()
231 ap->last_ctl = tf->ctl; in pata_s3c_tf_read()
236 * pata_s3c_exec_command - issue ATA command to host controller
239 const struct ata_taskfile *tf) in pata_s3c_exec_command() argument
241 ata_outb(ap->host, tf->command, ap->ioaddr.command_addr); in pata_s3c_exec_command()
246 * pata_s3c_check_status - Read device status register
250 return ata_inb(ap->host, ap->ioaddr.status_addr); in pata_s3c_check_status()
254 * pata_s3c_check_altstatus - Read alternate device status register
258 return ata_inb(ap->host, ap->ioaddr.altstatus_addr); in pata_s3c_check_altstatus()
262 * pata_s3c_data_xfer - Transfer data by PIO
267 struct ata_port *ap = qc->dev->link->ap; in pata_s3c_data_xfer()
268 struct s3c_ide_info *info = ap->host->private_data; in pata_s3c_data_xfer()
269 void __iomem *data_addr = ap->ioaddr.data_addr; in pata_s3c_data_xfer()
279 *data_ptr = readw(info->ide_addr in pata_s3c_data_xfer()
289 dev_err(ap->dev, "unexpected trailing data\n"); in pata_s3c_data_xfer()
295 * pata_s3c_dev_select - Select device on ATA bus
304 ata_outb(ap->host, tmp, ap->ioaddr.device_addr); in pata_s3c_dev_select()
309 * pata_s3c_devchk - PATA device presence detection
314 struct ata_ioports *ioaddr = &ap->ioaddr; in pata_s3c_devchk()
319 ata_outb(ap->host, 0x55, ioaddr->nsect_addr); in pata_s3c_devchk()
320 ata_outb(ap->host, 0xaa, ioaddr->lbal_addr); in pata_s3c_devchk()
322 ata_outb(ap->host, 0xaa, ioaddr->nsect_addr); in pata_s3c_devchk()
323 ata_outb(ap->host, 0x55, ioaddr->lbal_addr); in pata_s3c_devchk()
325 ata_outb(ap->host, 0x55, ioaddr->nsect_addr); in pata_s3c_devchk()
326 ata_outb(ap->host, 0xaa, ioaddr->lbal_addr); in pata_s3c_devchk()
328 nsect = ata_inb(ap->host, ioaddr->nsect_addr); in pata_s3c_devchk()
329 lbal = ata_inb(ap->host, ioaddr->lbal_addr); in pata_s3c_devchk()
332 return 1; /* we found a device */ in pata_s3c_devchk()
338 * pata_s3c_wait_after_reset - wait for devices to become ready after reset
345 ata_msleep(link->ap, ATA_WAIT_AFTER_RESET); in pata_s3c_wait_after_reset()
349 /* -ENODEV means the odd clown forgot the D7 pulldown resistor in pata_s3c_wait_after_reset()
350 * and TF status is 0xff, bail out on it too. in pata_s3c_wait_after_reset()
359 * pata_s3c_bus_softreset - PATA device software reset
364 struct ata_ioports *ioaddr = &ap->ioaddr; in pata_s3c_bus_softreset()
367 ata_outb(ap->host, ap->ctl, ioaddr->ctl_addr); in pata_s3c_bus_softreset()
369 ata_outb(ap->host, ap->ctl | ATA_SRST, ioaddr->ctl_addr); in pata_s3c_bus_softreset()
371 ata_outb(ap->host, ap->ctl, ioaddr->ctl_addr); in pata_s3c_bus_softreset()
372 ap->last_ctl = ap->ctl; in pata_s3c_bus_softreset()
374 return pata_s3c_wait_after_reset(&ap->link, deadline); in pata_s3c_bus_softreset()
378 * pata_s3c_softreset - reset host port via ATA SRST
383 struct ata_port *ap = link->ap; in pata_s3c_softreset()
397 /* if link is occupied, -ENODEV too is an error */ in pata_s3c_softreset()
398 if (rc && rc != -ENODEV) { in pata_s3c_softreset()
404 classes[0] = ata_sff_dev_classify(&ap->link.device[0], in pata_s3c_softreset()
411 * pata_s3c_set_devctl - Write device control register
415 ata_outb(ap->host, ctl, ap->ioaddr.ctl_addr); in pata_s3c_set_devctl()
451 struct s3c_ide_info *info = host->private_data; in pata_s3c_irq()
454 reg = readl(info->ide_addr + S3C_ATA_IRQ); in pata_s3c_irq()
455 writel(reg, info->ide_addr + S3C_ATA_IRQ); in pata_s3c_irq()
463 switch (info->cpu_type) { in pata_s3c_hwinit()
466 pata_s3c_cfg_mode(info->sfr_addr); in pata_s3c_hwinit()
467 pata_s3c_set_endian(info->ide_addr, 1); in pata_s3c_hwinit()
468 pata_s3c_enable(info->ide_addr, true); in pata_s3c_hwinit()
472 writel(0x1f, info->ide_addr + S3C_ATA_IRQ); in pata_s3c_hwinit()
473 writel(0x1b, info->ide_addr + S3C_ATA_IRQ_MSK); in pata_s3c_hwinit()
478 pata_s3c_set_endian(info->ide_addr, 0); in pata_s3c_hwinit()
479 pata_s3c_enable(info->ide_addr, true); in pata_s3c_hwinit()
483 writel(0x3f, info->ide_addr + S3C_ATA_IRQ); in pata_s3c_hwinit()
484 writel(0x3f, info->ide_addr + S3C_ATA_IRQ_MSK); in pata_s3c_hwinit()
494 struct s3c_ide_platdata *pdata = dev_get_platdata(&pdev->dev); in pata_s3c_probe()
495 struct device *dev = &pdev->dev; in pata_s3c_probe()
503 cpu_type = platform_get_device_id(pdev)->driver_data; in pata_s3c_probe()
507 return -ENOMEM; in pata_s3c_probe()
509 info->irq = platform_get_irq(pdev, 0); in pata_s3c_probe()
513 info->ide_addr = devm_ioremap_resource(dev, res); in pata_s3c_probe()
514 if (IS_ERR(info->ide_addr)) in pata_s3c_probe()
515 return PTR_ERR(info->ide_addr); in pata_s3c_probe()
517 info->clk = devm_clk_get(&pdev->dev, "cfcon"); in pata_s3c_probe()
518 if (IS_ERR(info->clk)) { in pata_s3c_probe()
520 ret = PTR_ERR(info->clk); in pata_s3c_probe()
521 info->clk = NULL; in pata_s3c_probe()
525 clk_enable(info->clk); in pata_s3c_probe()
531 ret = -ENOMEM; in pata_s3c_probe()
535 ap = host->ports[0]; in pata_s3c_probe()
536 ap->pio_mask = ATA_PIO4; in pata_s3c_probe()
539 ap->ops = &pata_s3c_port_ops; in pata_s3c_probe()
540 info->sfr_addr = info->ide_addr + 0x1800; in pata_s3c_probe()
541 info->ide_addr += 0x1900; in pata_s3c_probe()
542 info->fifo_status_reg = 0x94; in pata_s3c_probe()
544 ap->ops = &pata_s5p_port_ops; in pata_s3c_probe()
545 info->fifo_status_reg = 0x84; in pata_s3c_probe()
548 info->cpu_type = cpu_type; in pata_s3c_probe()
550 if (info->irq <= 0) { in pata_s3c_probe()
551 ap->flags |= ATA_FLAG_PIO_POLLING; in pata_s3c_probe()
552 info->irq = 0; in pata_s3c_probe()
556 ap->ioaddr.cmd_addr = info->ide_addr + S3C_ATA_CMD; in pata_s3c_probe()
557 ap->ioaddr.data_addr = info->ide_addr + S3C_ATA_PIO_DTR; in pata_s3c_probe()
558 ap->ioaddr.error_addr = info->ide_addr + S3C_ATA_PIO_FED; in pata_s3c_probe()
559 ap->ioaddr.feature_addr = info->ide_addr + S3C_ATA_PIO_FED; in pata_s3c_probe()
560 ap->ioaddr.nsect_addr = info->ide_addr + S3C_ATA_PIO_SCR; in pata_s3c_probe()
561 ap->ioaddr.lbal_addr = info->ide_addr + S3C_ATA_PIO_LLR; in pata_s3c_probe()
562 ap->ioaddr.lbam_addr = info->ide_addr + S3C_ATA_PIO_LMR; in pata_s3c_probe()
563 ap->ioaddr.lbah_addr = info->ide_addr + S3C_ATA_PIO_LHR; in pata_s3c_probe()
564 ap->ioaddr.device_addr = info->ide_addr + S3C_ATA_PIO_DVR; in pata_s3c_probe()
565 ap->ioaddr.status_addr = info->ide_addr + S3C_ATA_PIO_CSD; in pata_s3c_probe()
566 ap->ioaddr.command_addr = info->ide_addr + S3C_ATA_PIO_CSD; in pata_s3c_probe()
567 ap->ioaddr.altstatus_addr = info->ide_addr + S3C_ATA_PIO_DAD; in pata_s3c_probe()
568 ap->ioaddr.ctl_addr = info->ide_addr + S3C_ATA_PIO_DAD; in pata_s3c_probe()
571 (unsigned long long)res->start); in pata_s3c_probe()
573 host->private_data = info; in pata_s3c_probe()
575 if (pdata && pdata->setup_gpio) in pata_s3c_probe()
576 pdata->setup_gpio(); in pata_s3c_probe()
581 ret = ata_host_activate(host, info->irq, in pata_s3c_probe()
582 info->irq ? pata_s3c_irq : NULL, in pata_s3c_probe()
590 clk_disable(info->clk); in pata_s3c_probe()
597 struct s3c_ide_info *info = host->private_data; in pata_s3c_remove()
601 clk_disable(info->clk); in pata_s3c_remove()
618 struct s3c_ide_info *info = host->private_data; in pata_s3c_resume()
635 .name = "s3c64xx-pata",
638 .name = "s5pv210-pata",
659 MODULE_AUTHOR("Abhilash Kesavan, <a.kesavan@samsung.com>");
660 MODULE_DESCRIPTION("low-level driver for Samsung PATA controller");