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

1 // SPDX-License-Identifier: GPL-2.0+
3 * Renesas R-Car SATA driver
6 * Copyright (C) 2013-2015 Cogent Embedded, Inc.
7 * Copyright (C) 2013-2015 Renesas Solutions Corp.
21 /* SH-Navi2G/ATAPI-ATA compatible task registers */
25 /* SH-Navi2G/ATAPI module compatible control registers */
86 /* Serial-ATA HOST control registers */
159 void __iomem *base = priv->base; in sata_rcar_gen1_phy_preinit()
173 void __iomem *base = priv->base; in sata_rcar_gen1_phy_write()
212 void __iomem *base = priv->base; in sata_rcar_gen2_phy_init()
224 struct sata_rcar_priv *priv = ap->host->private_data; in sata_rcar_freeze()
227 iowrite32(priv->sataint_mask, priv->base + SATAINTMASK_REG); in sata_rcar_freeze()
234 struct sata_rcar_priv *priv = ap->host->private_data; in sata_rcar_thaw()
235 void __iomem *base = priv->base; in sata_rcar_thaw()
243 iowrite32(priv->sataint_mask & ~SATA_RCAR_INT_MASK, base + SATAINTMASK_REG); in sata_rcar_thaw()
250 while (count--) { in sata_rcar_ioread16_rep()
261 while (count--) in sata_rcar_iowrite16_rep()
267 return ioread32(ap->ioaddr.status_addr); in sata_rcar_check_status()
272 return ioread32(ap->ioaddr.altstatus_addr); in sata_rcar_check_altstatus()
277 iowrite32(ctl, ap->ioaddr.ctl_addr); in sata_rcar_set_devctl()
282 iowrite32(ATA_DEVICE_OBS, ap->ioaddr.device_addr); in sata_rcar_dev_select()
289 struct ata_ioports *ioaddr = &ap->ioaddr; in sata_rcar_ata_devchk()
294 iowrite32(0x55, ioaddr->nsect_addr); in sata_rcar_ata_devchk()
295 iowrite32(0xaa, ioaddr->lbal_addr); in sata_rcar_ata_devchk()
297 iowrite32(0xaa, ioaddr->nsect_addr); in sata_rcar_ata_devchk()
298 iowrite32(0x55, ioaddr->lbal_addr); in sata_rcar_ata_devchk()
300 iowrite32(0x55, ioaddr->nsect_addr); in sata_rcar_ata_devchk()
301 iowrite32(0xaa, ioaddr->lbal_addr); in sata_rcar_ata_devchk()
303 nsect = ioread32(ioaddr->nsect_addr); in sata_rcar_ata_devchk()
304 lbal = ioread32(ioaddr->lbal_addr); in sata_rcar_ata_devchk()
307 return 1; /* found a device */ in sata_rcar_ata_devchk()
315 struct ata_port *ap = link->ap; in sata_rcar_wait_after_reset()
324 struct ata_ioports *ioaddr = &ap->ioaddr; in sata_rcar_bus_softreset()
326 DPRINTK("ata%u: bus reset via SRST\n", ap->print_id); in sata_rcar_bus_softreset()
329 iowrite32(ap->ctl, ioaddr->ctl_addr); in sata_rcar_bus_softreset()
331 iowrite32(ap->ctl | ATA_SRST, ioaddr->ctl_addr); in sata_rcar_bus_softreset()
333 iowrite32(ap->ctl, ioaddr->ctl_addr); in sata_rcar_bus_softreset()
334 ap->last_ctl = ap->ctl; in sata_rcar_bus_softreset()
337 return sata_rcar_wait_after_reset(&ap->link, deadline); in sata_rcar_bus_softreset()
343 struct ata_port *ap = link->ap; in sata_rcar_softreset()
355 /* if link is occupied, -ENODEV too is an error */ in sata_rcar_softreset()
356 if (rc && (rc != -ENODEV || sata_scr_valid(link))) { in sata_rcar_softreset()
362 classes[0] = ata_sff_dev_classify(&link->device[0], devmask, &err); in sata_rcar_softreset()
369 const struct ata_taskfile *tf) in sata_rcar_tf_load() argument
371 struct ata_ioports *ioaddr = &ap->ioaddr; in sata_rcar_tf_load()
372 unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR; in sata_rcar_tf_load()
374 if (tf->ctl != ap->last_ctl) { in sata_rcar_tf_load()
375 iowrite32(tf->ctl, ioaddr->ctl_addr); in sata_rcar_tf_load()
376 ap->last_ctl = tf->ctl; in sata_rcar_tf_load()
380 if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) { in sata_rcar_tf_load()
381 iowrite32(tf->hob_feature, ioaddr->feature_addr); in sata_rcar_tf_load()
382 iowrite32(tf->hob_nsect, ioaddr->nsect_addr); in sata_rcar_tf_load()
383 iowrite32(tf->hob_lbal, ioaddr->lbal_addr); in sata_rcar_tf_load()
384 iowrite32(tf->hob_lbam, ioaddr->lbam_addr); in sata_rcar_tf_load()
385 iowrite32(tf->hob_lbah, ioaddr->lbah_addr); in sata_rcar_tf_load()
387 tf->hob_feature, in sata_rcar_tf_load()
388 tf->hob_nsect, in sata_rcar_tf_load()
389 tf->hob_lbal, in sata_rcar_tf_load()
390 tf->hob_lbam, in sata_rcar_tf_load()
391 tf->hob_lbah); in sata_rcar_tf_load()
395 iowrite32(tf->feature, ioaddr->feature_addr); in sata_rcar_tf_load()
396 iowrite32(tf->nsect, ioaddr->nsect_addr); in sata_rcar_tf_load()
397 iowrite32(tf->lbal, ioaddr->lbal_addr); in sata_rcar_tf_load()
398 iowrite32(tf->lbam, ioaddr->lbam_addr); in sata_rcar_tf_load()
399 iowrite32(tf->lbah, ioaddr->lbah_addr); in sata_rcar_tf_load()
401 tf->feature, in sata_rcar_tf_load()
402 tf->nsect, in sata_rcar_tf_load()
403 tf->lbal, in sata_rcar_tf_load()
404 tf->lbam, in sata_rcar_tf_load()
405 tf->lbah); in sata_rcar_tf_load()
408 if (tf->flags & ATA_TFLAG_DEVICE) { in sata_rcar_tf_load()
409 iowrite32(tf->device, ioaddr->device_addr); in sata_rcar_tf_load()
410 VPRINTK("device 0x%X\n", tf->device); in sata_rcar_tf_load()
416 static void sata_rcar_tf_read(struct ata_port *ap, struct ata_taskfile *tf) in sata_rcar_tf_read() argument
418 struct ata_ioports *ioaddr = &ap->ioaddr; in sata_rcar_tf_read()
420 tf->command = sata_rcar_check_status(ap); in sata_rcar_tf_read()
421 tf->feature = ioread32(ioaddr->error_addr); in sata_rcar_tf_read()
422 tf->nsect = ioread32(ioaddr->nsect_addr); in sata_rcar_tf_read()
423 tf->lbal = ioread32(ioaddr->lbal_addr); in sata_rcar_tf_read()
424 tf->lbam = ioread32(ioaddr->lbam_addr); in sata_rcar_tf_read()
425 tf->lbah = ioread32(ioaddr->lbah_addr); in sata_rcar_tf_read()
426 tf->device = ioread32(ioaddr->device_addr); in sata_rcar_tf_read()
428 if (tf->flags & ATA_TFLAG_LBA48) { in sata_rcar_tf_read()
429 iowrite32(tf->ctl | ATA_HOB, ioaddr->ctl_addr); in sata_rcar_tf_read()
430 tf->hob_feature = ioread32(ioaddr->error_addr); in sata_rcar_tf_read()
431 tf->hob_nsect = ioread32(ioaddr->nsect_addr); in sata_rcar_tf_read()
432 tf->hob_lbal = ioread32(ioaddr->lbal_addr); in sata_rcar_tf_read()
433 tf->hob_lbam = ioread32(ioaddr->lbam_addr); in sata_rcar_tf_read()
434 tf->hob_lbah = ioread32(ioaddr->lbah_addr); in sata_rcar_tf_read()
435 iowrite32(tf->ctl, ioaddr->ctl_addr); in sata_rcar_tf_read()
436 ap->last_ctl = tf->ctl; in sata_rcar_tf_read()
441 const struct ata_taskfile *tf) in sata_rcar_exec_command() argument
443 DPRINTK("ata%u: cmd 0x%X\n", ap->print_id, tf->command); in sata_rcar_exec_command()
445 iowrite32(tf->command, ap->ioaddr.command_addr); in sata_rcar_exec_command()
453 struct ata_port *ap = qc->dev->link->ap; in sata_rcar_data_xfer()
454 void __iomem *data_addr = ap->ioaddr.data_addr; in sata_rcar_data_xfer()
468 buf += buflen - 1; in sata_rcar_data_xfer()
492 /* We only need to flush incoming data when a command was running */ in sata_rcar_drain_fifo()
493 if (qc == NULL || qc->dma_dir == DMA_TO_DEVICE) in sata_rcar_drain_fifo()
496 ap = qc->ap; in sata_rcar_drain_fifo()
498 for (count = 0; (ap->ops->sff_check_status(ap) & ATA_DRQ) && in sata_rcar_drain_fifo()
500 ioread32(ap->ioaddr.data_addr); in sata_rcar_drain_fifo()
511 return -EINVAL; in sata_rcar_scr_read()
513 *val = ioread32(link->ap->ioaddr.scr_addr + (sc_reg << 2)); in sata_rcar_scr_read()
521 return -EINVAL; in sata_rcar_scr_write()
523 iowrite32(val, link->ap->ioaddr.scr_addr + (sc_reg << 2)); in sata_rcar_scr_write()
529 struct ata_port *ap = qc->ap; in sata_rcar_bmdma_fill_sg()
530 struct ata_bmdma_prd *prd = ap->bmdma_prd; in sata_rcar_bmdma_fill_sg()
534 for_each_sg(qc->sg, sg, qc->n_elem, si) { in sata_rcar_bmdma_fill_sg()
538 * Note: h/w doesn't support 64-bit, so we unconditionally in sata_rcar_bmdma_fill_sg()
549 /* end-of-table flag */ in sata_rcar_bmdma_fill_sg()
550 prd[si - 1].addr |= cpu_to_le32(SATA_RCAR_DTEND); in sata_rcar_bmdma_fill_sg()
555 if (!(qc->flags & ATA_QCFLAG_DMAMAP)) in sata_rcar_qc_prep()
565 struct ata_port *ap = qc->ap; in sata_rcar_bmdma_setup()
566 unsigned int rw = qc->tf.flags & ATA_TFLAG_WRITE; in sata_rcar_bmdma_setup()
567 struct sata_rcar_priv *priv = ap->host->private_data; in sata_rcar_bmdma_setup()
568 void __iomem *base = priv->base; in sata_rcar_bmdma_setup()
573 iowrite32(ap->bmdma_prd_dma, base + ATAPI_DTB_ADR_REG); in sata_rcar_bmdma_setup()
575 /* specify data direction, triple-check start bit is clear */ in sata_rcar_bmdma_setup()
587 ap->ops->sff_exec_command(ap, &qc->tf); in sata_rcar_bmdma_setup()
592 struct ata_port *ap = qc->ap; in sata_rcar_bmdma_start()
593 struct sata_rcar_priv *priv = ap->host->private_data; in sata_rcar_bmdma_start()
594 void __iomem *base = priv->base; in sata_rcar_bmdma_start()
606 struct ata_port *ap = qc->ap; in sata_rcar_bmdma_stop()
607 struct sata_rcar_priv *priv = ap->host->private_data; in sata_rcar_bmdma_stop()
608 void __iomem *base = priv->base; in sata_rcar_bmdma_stop()
619 /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */ in sata_rcar_bmdma_stop()
625 struct sata_rcar_priv *priv = ap->host->private_data; in sata_rcar_bmdma_status()
629 status = ioread32(priv->base + ATAPI_STATUS_REG); in sata_rcar_bmdma_status()
679 struct sata_rcar_priv *priv = ap->host->private_data; in sata_rcar_serr_interrupt()
680 struct ata_eh_info *ehi = &ap->link.eh_info; in sata_rcar_serr_interrupt()
684 serror = ioread32(priv->base + SCRSERR_REG); in sata_rcar_serr_interrupt()
694 /* Setup a soft-reset EH action */ in sata_rcar_serr_interrupt()
713 qc = ata_qc_from_tag(ap, ap->link.active_tag); in sata_rcar_ata_interrupt()
725 struct sata_rcar_priv *priv = host->private_data; in sata_rcar_interrupt()
726 void __iomem *base = priv->base; in sata_rcar_interrupt()
732 spin_lock_irqsave(&host->lock, flags); in sata_rcar_interrupt()
739 iowrite32(~sataintstat & priv->sataint_mask, base + SATAINTSTAT_REG); in sata_rcar_interrupt()
741 ap = host->ports[0]; in sata_rcar_interrupt()
751 spin_unlock_irqrestore(&host->lock, flags); in sata_rcar_interrupt()
758 struct ata_port *ap = host->ports[0]; in sata_rcar_setup_port()
759 struct ata_ioports *ioaddr = &ap->ioaddr; in sata_rcar_setup_port()
760 struct sata_rcar_priv *priv = host->private_data; in sata_rcar_setup_port()
761 void __iomem *base = priv->base; in sata_rcar_setup_port()
763 ap->ops = &sata_rcar_port_ops; in sata_rcar_setup_port()
764 ap->pio_mask = ATA_PIO4; in sata_rcar_setup_port()
765 ap->udma_mask = ATA_UDMA6; in sata_rcar_setup_port()
766 ap->flags |= ATA_FLAG_SATA; in sata_rcar_setup_port()
768 if (priv->type == RCAR_R8A7790_ES1_SATA) in sata_rcar_setup_port()
769 ap->flags |= ATA_FLAG_NO_DIPM; in sata_rcar_setup_port()
771 ioaddr->cmd_addr = base + SDATA_REG; in sata_rcar_setup_port()
772 ioaddr->ctl_addr = base + SSDEVCON_REG; in sata_rcar_setup_port()
773 ioaddr->scr_addr = base + SCRSSTS_REG; in sata_rcar_setup_port()
774 ioaddr->altstatus_addr = ioaddr->ctl_addr; in sata_rcar_setup_port()
776 ioaddr->data_addr = ioaddr->cmd_addr + (ATA_REG_DATA << 2); in sata_rcar_setup_port()
777 ioaddr->error_addr = ioaddr->cmd_addr + (ATA_REG_ERR << 2); in sata_rcar_setup_port()
778 ioaddr->feature_addr = ioaddr->cmd_addr + (ATA_REG_FEATURE << 2); in sata_rcar_setup_port()
779 ioaddr->nsect_addr = ioaddr->cmd_addr + (ATA_REG_NSECT << 2); in sata_rcar_setup_port()
780 ioaddr->lbal_addr = ioaddr->cmd_addr + (ATA_REG_LBAL << 2); in sata_rcar_setup_port()
781 ioaddr->lbam_addr = ioaddr->cmd_addr + (ATA_REG_LBAM << 2); in sata_rcar_setup_port()
782 ioaddr->lbah_addr = ioaddr->cmd_addr + (ATA_REG_LBAH << 2); in sata_rcar_setup_port()
783 ioaddr->device_addr = ioaddr->cmd_addr + (ATA_REG_DEVICE << 2); in sata_rcar_setup_port()
784 ioaddr->status_addr = ioaddr->cmd_addr + (ATA_REG_STATUS << 2); in sata_rcar_setup_port()
785 ioaddr->command_addr = ioaddr->cmd_addr + (ATA_REG_CMD << 2); in sata_rcar_setup_port()
790 void __iomem *base = priv->base; in sata_rcar_init_module()
793 /* SATA-IP reset state */ in sata_rcar_init_module()
805 /* Release the SATA-IP from the reset state */ in sata_rcar_init_module()
812 iowrite32(priv->sataint_mask, base + SATAINTMASK_REG); in sata_rcar_init_module()
820 struct sata_rcar_priv *priv = host->private_data; in sata_rcar_init_controller()
822 priv->sataint_mask = SATAINTMASK_ALL_GEN2; in sata_rcar_init_controller()
825 switch (priv->type) { in sata_rcar_init_controller()
827 priv->sataint_mask = SATAINTMASK_ALL_GEN1; in sata_rcar_init_controller()
837 dev_warn(host->dev, "SATA phy is not initialized\n"); in sata_rcar_init_controller()
846 /* Deprecated by "renesas,sata-r8a7779" */
847 .compatible = "renesas,rcar-sata",
851 .compatible = "renesas,sata-r8a7779",
855 .compatible = "renesas,sata-r8a7790",
859 .compatible = "renesas,sata-r8a7790-es1",
863 .compatible = "renesas,sata-r8a7791",
867 .compatible = "renesas,sata-r8a7793",
871 .compatible = "renesas,sata-r8a7795",
875 .compatible = "renesas,rcar-gen2-sata",
879 .compatible = "renesas,rcar-gen3-sata",
888 struct device *dev = &pdev->dev; in sata_rcar_probe()
899 return -EINVAL; in sata_rcar_probe()
903 return -ENOMEM; in sata_rcar_probe()
905 priv->type = (enum sata_rcar_type)of_device_get_match_data(dev); in sata_rcar_probe()
914 ret = -ENOMEM; in sata_rcar_probe()
918 host->private_data = priv; in sata_rcar_probe()
921 priv->base = devm_ioremap_resource(dev, mem); in sata_rcar_probe()
922 if (IS_ERR(priv->base)) { in sata_rcar_probe()
923 ret = PTR_ERR(priv->base); in sata_rcar_probe()
947 struct sata_rcar_priv *priv = host->private_data; in sata_rcar_remove()
948 void __iomem *base = priv->base; in sata_rcar_remove()
956 iowrite32(priv->sataint_mask, base + SATAINTMASK_REG); in sata_rcar_remove()
958 pm_runtime_put(&pdev->dev); in sata_rcar_remove()
959 pm_runtime_disable(&pdev->dev); in sata_rcar_remove()
968 struct sata_rcar_priv *priv = host->private_data; in sata_rcar_suspend()
969 void __iomem *base = priv->base; in sata_rcar_suspend()
977 iowrite32(priv->sataint_mask, base + SATAINTMASK_REG); in sata_rcar_suspend()
988 struct sata_rcar_priv *priv = host->private_data; in sata_rcar_resume()
989 void __iomem *base = priv->base; in sata_rcar_resume()
998 if (priv->type == RCAR_GEN3_SATA) { in sata_rcar_resume()
1003 iowrite32(priv->sataint_mask, base + SATAINTMASK_REG); in sata_rcar_resume()
1062 MODULE_DESCRIPTION("Renesas R-Car SATA controller low level driver");