aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/DocBook/libata.tmpl12
-rw-r--r--drivers/ata/libata-sff.c31
-rw-r--r--drivers/ata/pata_bf54x.c40
-rw-r--r--drivers/ata/pata_scc.c38
-rw-r--r--include/linux/libata.h1
5 files changed, 63 insertions, 59 deletions
diff --git a/Documentation/DocBook/libata.tmpl b/Documentation/DocBook/libata.tmpl
index 70b811e9f2ca..828748c4e78d 100644
--- a/Documentation/DocBook/libata.tmpl
+++ b/Documentation/DocBook/libata.tmpl
@@ -225,6 +225,18 @@ u8 (*sff_check_altstatus)(struct ata_port *ap);
225 225
226 </sect2> 226 </sect2>
227 227
228 <sect2><title>Write specific ATA shadow register</title>
229 <programlisting>
230void (*sff_set_devctl)(struct ata_port *ap, u8 ctl);
231 </programlisting>
232
233 <para>
234 Write the device control ATA shadow register to the hardware.
235 Most drivers don't need to define this.
236 </para>
237
238 </sect2>
239
228 <sect2><title>Select ATA device on bus</title> 240 <sect2><title>Select ATA device on bus</title>
229 <programlisting> 241 <programlisting>
230void (*sff_dev_select)(struct ata_port *ap, unsigned int device); 242void (*sff_dev_select)(struct ata_port *ap, unsigned int device);
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index b31389605bee..31b495fcd969 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -446,6 +446,27 @@ int ata_sff_wait_ready(struct ata_link *link, unsigned long deadline)
446EXPORT_SYMBOL_GPL(ata_sff_wait_ready); 446EXPORT_SYMBOL_GPL(ata_sff_wait_ready);
447 447
448/** 448/**
449 * ata_sff_set_devctl - Write device control reg
450 * @ap: port where the device is
451 * @ctl: value to write
452 *
453 * Writes ATA taskfile device control register.
454 *
455 * Note: may NOT be used as the sff_set_devctl() entry in
456 * ata_port_operations.
457 *
458 * LOCKING:
459 * Inherited from caller.
460 */
461static void ata_sff_set_devctl(struct ata_port *ap, u8 ctl)
462{
463 if (ap->ops->sff_set_devctl)
464 ap->ops->sff_set_devctl(ap, ctl);
465 else
466 iowrite8(ctl, ap->ioaddr.ctl_addr);
467}
468
469/**
449 * ata_sff_dev_select - Select device 0/1 on ATA bus 470 * ata_sff_dev_select - Select device 0/1 on ATA bus
450 * @ap: ATA channel to manipulate 471 * @ap: ATA channel to manipulate
451 * @device: ATA device (numbered from zero) to select 472 * @device: ATA device (numbered from zero) to select
@@ -1895,13 +1916,11 @@ EXPORT_SYMBOL_GPL(ata_sff_lost_interrupt);
1895 */ 1916 */
1896void ata_sff_freeze(struct ata_port *ap) 1917void ata_sff_freeze(struct ata_port *ap)
1897{ 1918{
1898 struct ata_ioports *ioaddr = &ap->ioaddr;
1899
1900 ap->ctl |= ATA_NIEN; 1919 ap->ctl |= ATA_NIEN;
1901 ap->last_ctl = ap->ctl; 1920 ap->last_ctl = ap->ctl;
1902 1921
1903 if (ioaddr->ctl_addr) 1922 if (ap->ops->sff_set_devctl || ap->ioaddr.ctl_addr)
1904 iowrite8(ap->ctl, ioaddr->ctl_addr); 1923 ata_sff_set_devctl(ap, ap->ctl);
1905 1924
1906 /* Under certain circumstances, some controllers raise IRQ on 1925 /* Under certain circumstances, some controllers raise IRQ on
1907 * ATA_NIEN manipulation. Also, many controllers fail to mask 1926 * ATA_NIEN manipulation. Also, many controllers fail to mask
@@ -2301,8 +2320,8 @@ void ata_sff_postreset(struct ata_link *link, unsigned int *classes)
2301 } 2320 }
2302 2321
2303 /* set up device control */ 2322 /* set up device control */
2304 if (ap->ioaddr.ctl_addr) { 2323 if (ap->ops->sff_set_devctl || ap->ioaddr.ctl_addr) {
2305 iowrite8(ap->ctl, ap->ioaddr.ctl_addr); 2324 ata_sff_set_devctl(ap, ap->ctl);
2306 ap->last_ctl = ap->ctl; 2325 ap->last_ctl = ap->ctl;
2307 } 2326 }
2308} 2327}
diff --git a/drivers/ata/pata_bf54x.c b/drivers/ata/pata_bf54x.c
index 02c81f12c702..198307534d90 100644
--- a/drivers/ata/pata_bf54x.c
+++ b/drivers/ata/pata_bf54x.c
@@ -821,6 +821,18 @@ static void bfin_dev_select(struct ata_port *ap, unsigned int device)
821} 821}
822 822
823/** 823/**
824 * bfin_set_devctl - Write device control reg
825 * @ap: port where the device is
826 * @ctl: value to write
827 */
828
829static u8 bfin_set_devctl(struct ata_port *ap, u8 ctl)
830{
831 void __iomem *base = (void __iomem *)ap->ioaddr.ctl_addr;
832 write_atapi_register(base, ATA_REG_CTRL, ctl);
833}
834
835/**
824 * bfin_bmdma_setup - Set up IDE DMA transaction 836 * bfin_bmdma_setup - Set up IDE DMA transaction
825 * @qc: Info associated with this ATA transaction. 837 * @qc: Info associated with this ATA transaction.
826 * 838 *
@@ -1240,32 +1252,6 @@ static unsigned char bfin_irq_on(struct ata_port *ap)
1240} 1252}
1241 1253
1242/** 1254/**
1243 * bfin_freeze - Freeze DMA controller port
1244 * @ap: port to freeze
1245 *
1246 * Note: Original code is ata_sff_freeze().
1247 */
1248
1249static void bfin_freeze(struct ata_port *ap)
1250{
1251 void __iomem *base = (void __iomem *)ap->ioaddr.ctl_addr;
1252
1253 dev_dbg(ap->dev, "in atapi dma freeze\n");
1254 ap->ctl |= ATA_NIEN;
1255 ap->last_ctl = ap->ctl;
1256
1257 write_atapi_register(base, ATA_REG_CTRL, ap->ctl);
1258
1259 /* Under certain circumstances, some controllers raise IRQ on
1260 * ATA_NIEN manipulation. Also, many controllers fail to mask
1261 * previously pending IRQ on ATA_NIEN assertion. Clear it.
1262 */
1263 ap->ops->sff_check_status(ap);
1264
1265 bfin_irq_clear(ap);
1266}
1267
1268/**
1269 * bfin_thaw - Thaw DMA controller port 1255 * bfin_thaw - Thaw DMA controller port
1270 * @ap: port to thaw 1256 * @ap: port to thaw
1271 * 1257 *
@@ -1476,6 +1462,7 @@ static struct ata_port_operations bfin_pata_ops = {
1476 .sff_check_status = bfin_check_status, 1462 .sff_check_status = bfin_check_status,
1477 .sff_check_altstatus = bfin_check_altstatus, 1463 .sff_check_altstatus = bfin_check_altstatus,
1478 .sff_dev_select = bfin_dev_select, 1464 .sff_dev_select = bfin_dev_select,
1465 .sff_set_devctl = bfin_set_devctl,
1479 1466
1480 .bmdma_setup = bfin_bmdma_setup, 1467 .bmdma_setup = bfin_bmdma_setup,
1481 .bmdma_start = bfin_bmdma_start, 1468 .bmdma_start = bfin_bmdma_start,
@@ -1485,7 +1472,6 @@ static struct ata_port_operations bfin_pata_ops = {
1485 1472
1486 .qc_prep = ata_noop_qc_prep, 1473 .qc_prep = ata_noop_qc_prep,
1487 1474
1488 .freeze = bfin_freeze,
1489 .thaw = bfin_thaw, 1475 .thaw = bfin_thaw,
1490 .softreset = bfin_softreset, 1476 .softreset = bfin_softreset,
1491 .postreset = bfin_postreset, 1477 .postreset = bfin_postreset,
diff --git a/drivers/ata/pata_scc.c b/drivers/ata/pata_scc.c
index 77ff829af176..86b25fef34a9 100644
--- a/drivers/ata/pata_scc.c
+++ b/drivers/ata/pata_scc.c
@@ -416,6 +416,17 @@ static void scc_dev_select (struct ata_port *ap, unsigned int device)
416} 416}
417 417
418/** 418/**
419 * scc_set_devctl - Write device control reg
420 * @ap: port where the device is
421 * @ctl: value to write
422 */
423
424static void scc_set_devctl(struct ata_port *ap, u8 ctl)
425{
426 out_be32(ap->ioaddr.ctl_addr, ctl);
427}
428
429/**
419 * scc_bmdma_setup - Set up PCI IDE BMDMA transaction 430 * scc_bmdma_setup - Set up PCI IDE BMDMA transaction
420 * @qc: Info associated with this ATA transaction. 431 * @qc: Info associated with this ATA transaction.
421 * 432 *
@@ -840,31 +851,6 @@ static u8 scc_irq_on (struct ata_port *ap)
840} 851}
841 852
842/** 853/**
843 * scc_freeze - Freeze BMDMA controller port
844 * @ap: port to freeze
845 *
846 * Note: Original code is ata_sff_freeze().
847 */
848
849static void scc_freeze (struct ata_port *ap)
850{
851 struct ata_ioports *ioaddr = &ap->ioaddr;
852
853 ap->ctl |= ATA_NIEN;
854 ap->last_ctl = ap->ctl;
855
856 out_be32(ioaddr->ctl_addr, ap->ctl);
857
858 /* Under certain circumstances, some controllers raise IRQ on
859 * ATA_NIEN manipulation. Also, many controllers fail to mask
860 * previously pending IRQ on ATA_NIEN assertion. Clear it.
861 */
862 ap->ops->sff_check_status(ap);
863
864 ap->ops->sff_irq_clear(ap);
865}
866
867/**
868 * scc_pata_prereset - prepare for reset 854 * scc_pata_prereset - prepare for reset
869 * @ap: ATA port to be reset 855 * @ap: ATA port to be reset
870 * @deadline: deadline jiffies for the operation 856 * @deadline: deadline jiffies for the operation
@@ -977,6 +963,7 @@ static struct ata_port_operations scc_pata_ops = {
977 .sff_check_status = scc_check_status, 963 .sff_check_status = scc_check_status,
978 .sff_check_altstatus = scc_check_altstatus, 964 .sff_check_altstatus = scc_check_altstatus,
979 .sff_dev_select = scc_dev_select, 965 .sff_dev_select = scc_dev_select,
966 .sff_set_devctl = scc_set_devctl,
980 967
981 .bmdma_setup = scc_bmdma_setup, 968 .bmdma_setup = scc_bmdma_setup,
982 .bmdma_start = scc_bmdma_start, 969 .bmdma_start = scc_bmdma_start,
@@ -984,7 +971,6 @@ static struct ata_port_operations scc_pata_ops = {
984 .bmdma_status = scc_bmdma_status, 971 .bmdma_status = scc_bmdma_status,
985 .sff_data_xfer = scc_data_xfer, 972 .sff_data_xfer = scc_data_xfer,
986 973
987 .freeze = scc_freeze,
988 .prereset = scc_pata_prereset, 974 .prereset = scc_pata_prereset,
989 .softreset = scc_softreset, 975 .softreset = scc_softreset,
990 .postreset = scc_postreset, 976 .postreset = scc_postreset,
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 242eb2646101..6207ec600722 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -850,6 +850,7 @@ struct ata_port_operations {
850 * SFF / taskfile oriented ops 850 * SFF / taskfile oriented ops
851 */ 851 */
852 void (*sff_dev_select)(struct ata_port *ap, unsigned int device); 852 void (*sff_dev_select)(struct ata_port *ap, unsigned int device);
853 void (*sff_set_devctl)(struct ata_port *ap, u8 ctl);
853 u8 (*sff_check_status)(struct ata_port *ap); 854 u8 (*sff_check_status)(struct ata_port *ap);
854 u8 (*sff_check_altstatus)(struct ata_port *ap); 855 u8 (*sff_check_altstatus)(struct ata_port *ap);
855 void (*sff_tf_load)(struct ata_port *ap, const struct ata_taskfile *tf); 856 void (*sff_tf_load)(struct ata_port *ap, const struct ata_taskfile *tf);