Commit 6dbceb8c8083634ed4f5006deac12f0a45e6a7bc
1 parent
94cd5b62ff
Exists in
master
and in
20 other branches
ide-cris: add ->tf_{load,read} methods
Add ->tf_{load,read} methods so cris_ide_{outb,outw,inb,inw}() can be used directly. There should be no functional changes caused by this patch. Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Showing 1 changed file with 87 additions and 0 deletions Side-by-side Diff
drivers/ide/cris/ide-cris.c
... | ... | @@ -775,6 +775,90 @@ |
775 | 775 | hw->ack_intr = cris_ide_ack_intr; |
776 | 776 | } |
777 | 777 | |
778 | +static void cris_tf_load(ide_drive_t *drive, ide_task_t *task) | |
779 | +{ | |
780 | + struct ide_io_ports *io_ports = &drive->hwif->io_ports; | |
781 | + struct ide_taskfile *tf = &task->tf; | |
782 | + u8 HIHI = (task->tf_flags & IDE_TFLAG_LBA48) ? 0xE0 : 0xEF; | |
783 | + | |
784 | + if (task->tf_flags & IDE_TFLAG_FLAGGED) | |
785 | + HIHI = 0xFF; | |
786 | + | |
787 | + ide_set_irq(drive, 1); | |
788 | + | |
789 | + if (task->tf_flags & IDE_TFLAG_OUT_DATA) | |
790 | + cris_ide_outw((tf->hob_data << 8) | tf->data, | |
791 | + io_ports->data_addr); | |
792 | + | |
793 | + if (task->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) | |
794 | + cris_ide_outb(tf->hob_feature, io_ports->feature_addr); | |
795 | + if (task->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) | |
796 | + cris_ide_outb(tf->hob_nsect, io_ports->nsect_addr); | |
797 | + if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAL) | |
798 | + cris_ide_outb(tf->hob_lbal, io_ports->lbal_addr); | |
799 | + if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAM) | |
800 | + cris_ide_outb(tf->hob_lbam, io_ports->lbam_addr); | |
801 | + if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAH) | |
802 | + cris_ide_outb(tf->hob_lbah, io_ports->lbah_addr); | |
803 | + | |
804 | + if (task->tf_flags & IDE_TFLAG_OUT_FEATURE) | |
805 | + cris_ide_outb(tf->feature, io_ports->feature_addr); | |
806 | + if (task->tf_flags & IDE_TFLAG_OUT_NSECT) | |
807 | + cris_ide_outb(tf->nsect, io_ports->nsect_addr); | |
808 | + if (task->tf_flags & IDE_TFLAG_OUT_LBAL) | |
809 | + cris_ide_outb(tf->lbal, io_ports->lbal_addr); | |
810 | + if (task->tf_flags & IDE_TFLAG_OUT_LBAM) | |
811 | + cris_ide_outb(tf->lbam, io_ports->lbam_addr); | |
812 | + if (task->tf_flags & IDE_TFLAG_OUT_LBAH) | |
813 | + cris_ide_outb(tf->lbah, io_ports->lbah_addr); | |
814 | + | |
815 | + if (task->tf_flags & IDE_TFLAG_OUT_DEVICE) | |
816 | + cris_ide_outb((tf->device & HIHI) | drive->select.all, | |
817 | + io_ports->device_addr); | |
818 | +} | |
819 | + | |
820 | +static void cris_tf_read(ide_drive_t *drive, ide_task_t *task) | |
821 | +{ | |
822 | + struct ide_io_ports *io_ports = &drive->hwif->io_ports; | |
823 | + struct ide_taskfile *tf = &task->tf; | |
824 | + | |
825 | + if (task->tf_flags & IDE_TFLAG_IN_DATA) { | |
826 | + u16 data = cris_ide_inw(io_ports->data_addr); | |
827 | + | |
828 | + tf->data = data & 0xff; | |
829 | + tf->hob_data = (data >> 8) & 0xff; | |
830 | + } | |
831 | + | |
832 | + /* be sure we're looking at the low order bits */ | |
833 | + cris_ide_outb(drive->ctl & ~0x80, io_ports->ctl_addr); | |
834 | + | |
835 | + if (task->tf_flags & IDE_TFLAG_IN_NSECT) | |
836 | + tf->nsect = cris_ide_inb(io_ports->nsect_addr); | |
837 | + if (task->tf_flags & IDE_TFLAG_IN_LBAL) | |
838 | + tf->lbal = cris_ide_inb(io_ports->lbal_addr); | |
839 | + if (task->tf_flags & IDE_TFLAG_IN_LBAM) | |
840 | + tf->lbam = cris_ide_inb(io_ports->lbam_addr); | |
841 | + if (task->tf_flags & IDE_TFLAG_IN_LBAH) | |
842 | + tf->lbah = cris_ide_inb(io_ports->lbah_addr); | |
843 | + if (task->tf_flags & IDE_TFLAG_IN_DEVICE) | |
844 | + tf->device = cris_ide_inb(io_ports->device_addr); | |
845 | + | |
846 | + if (task->tf_flags & IDE_TFLAG_LBA48) { | |
847 | + cris_ide_outb(drive->ctl | 0x80, io_ports->ctl_addr); | |
848 | + | |
849 | + if (task->tf_flags & IDE_TFLAG_IN_HOB_FEATURE) | |
850 | + tf->hob_feature = cris_ide_inb(io_ports->feature_addr); | |
851 | + if (task->tf_flags & IDE_TFLAG_IN_HOB_NSECT) | |
852 | + tf->hob_nsect = cris_ide_inb(io_ports->nsect_addr); | |
853 | + if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAL) | |
854 | + tf->hob_lbal = cris_ide_inb(io_ports->lbal_addr); | |
855 | + if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAM) | |
856 | + tf->hob_lbam = cris_ide_inb(io_ports->lbam_addr); | |
857 | + if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAH) | |
858 | + tf->hob_lbah = cris_ide_inb(io_ports->lbah_addr); | |
859 | + } | |
860 | +} | |
861 | + | |
778 | 862 | static const struct ide_port_ops cris_port_ops = { |
779 | 863 | .set_pio_mode = cris_set_pio_mode, |
780 | 864 | .set_dma_mode = cris_set_dma_mode, |
... | ... | @@ -811,6 +895,9 @@ |
811 | 895 | continue; |
812 | 896 | ide_init_port_data(hwif, hwif->index); |
813 | 897 | ide_init_port_hw(hwif, &hw); |
898 | + | |
899 | + hwif->tf_load = cris_tf_load; | |
900 | + hwif->tf_read = cris_tf_read; | |
814 | 901 | |
815 | 902 | hwif->input_data = cris_input_data; |
816 | 903 | hwif->output_data = cris_output_data; |