Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

libata: introduce sff_set_devctl() method

The set of libata's taskfile access methods is clearly incomplete as
it lacks a method to write to the device control register -- which
forces drivers like 'pata_bf54x' and 'pata_scc' to implement more
"high level" (and more weighty) methods like freeze() and postreset().

So, introduce the optional sff_set_devctl() method which the drivers
only have to implement if the standard iowrite8() can't be used (just
like the existing sff_check_altstatus() method) and make use of it
in the freeze() and postreset() method implementations (I could also
have used it in softreset() method but it also reads other taskfile
registers without using tf_read() making that quite pointless);
this makes freeze() method implementations in the 'pata_bf54x' and
'pata_scc' methods virtually identical to ata_sff_freeze(), so we
can get rid of them completely.

Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>

authored by

Sergei Shtylyov and committed by
Jeff Garzik
41dec29b 55787183

+63 -59
+12
Documentation/DocBook/libata.tmpl
··· 225 225 226 226 </sect2> 227 227 228 + <sect2><title>Write specific ATA shadow register</title> 229 + <programlisting> 230 + void (*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 240 <sect2><title>Select ATA device on bus</title> 229 241 <programlisting> 230 242 void (*sff_dev_select)(struct ata_port *ap, unsigned int device);
+25 -6
drivers/ata/libata-sff.c
··· 446 446 EXPORT_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 + */ 461 + static 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 470 * ata_sff_dev_select - Select device 0/1 on ATA bus 450 471 * @ap: ATA channel to manipulate 451 472 * @device: ATA device (numbered from zero) to select ··· 1916 1895 */ 1917 1896 void ata_sff_freeze(struct ata_port *ap) 1918 1897 { 1919 - struct ata_ioports *ioaddr = &ap->ioaddr; 1920 - 1921 1898 ap->ctl |= ATA_NIEN; 1922 1899 ap->last_ctl = ap->ctl; 1923 1900 1924 - if (ioaddr->ctl_addr) 1925 - iowrite8(ap->ctl, ioaddr->ctl_addr); 1901 + if (ap->ops->sff_set_devctl || ap->ioaddr.ctl_addr) 1902 + ata_sff_set_devctl(ap, ap->ctl); 1926 1903 1927 1904 /* Under certain circumstances, some controllers raise IRQ on 1928 1905 * ATA_NIEN manipulation. Also, many controllers fail to mask ··· 2320 2301 } 2321 2302 2322 2303 /* set up device control */ 2323 - if (ap->ioaddr.ctl_addr) { 2324 - iowrite8(ap->ctl, ap->ioaddr.ctl_addr); 2304 + if (ap->ops->sff_set_devctl || ap->ioaddr.ctl_addr) { 2305 + ata_sff_set_devctl(ap, ap->ctl); 2325 2306 ap->last_ctl = ap->ctl; 2326 2307 } 2327 2308 }
+13 -27
drivers/ata/pata_bf54x.c
··· 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 + 829 + static 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 836 * bfin_bmdma_setup - Set up IDE DMA transaction 825 837 * @qc: Info associated with this ATA transaction. 826 838 * ··· 1252 1240 } 1253 1241 1254 1242 /** 1255 - * bfin_freeze - Freeze DMA controller port 1256 - * @ap: port to freeze 1257 - * 1258 - * Note: Original code is ata_sff_freeze(). 1259 - */ 1260 - 1261 - static void bfin_freeze(struct ata_port *ap) 1262 - { 1263 - void __iomem *base = (void __iomem *)ap->ioaddr.ctl_addr; 1264 - 1265 - dev_dbg(ap->dev, "in atapi dma freeze\n"); 1266 - ap->ctl |= ATA_NIEN; 1267 - ap->last_ctl = ap->ctl; 1268 - 1269 - write_atapi_register(base, ATA_REG_CTRL, ap->ctl); 1270 - 1271 - /* Under certain circumstances, some controllers raise IRQ on 1272 - * ATA_NIEN manipulation. Also, many controllers fail to mask 1273 - * previously pending IRQ on ATA_NIEN assertion. Clear it. 1274 - */ 1275 - ap->ops->sff_check_status(ap); 1276 - 1277 - bfin_irq_clear(ap); 1278 - } 1279 - 1280 - /** 1281 1243 * bfin_thaw - Thaw DMA controller port 1282 1244 * @ap: port to thaw 1283 1245 * ··· 1462 1476 .sff_check_status = bfin_check_status, 1463 1477 .sff_check_altstatus = bfin_check_altstatus, 1464 1478 .sff_dev_select = bfin_dev_select, 1479 + .sff_set_devctl = bfin_set_devctl, 1465 1480 1466 1481 .bmdma_setup = bfin_bmdma_setup, 1467 1482 .bmdma_start = bfin_bmdma_start, ··· 1472 1485 1473 1486 .qc_prep = ata_noop_qc_prep, 1474 1487 1475 - .freeze = bfin_freeze, 1476 1488 .thaw = bfin_thaw, 1477 1489 .softreset = bfin_softreset, 1478 1490 .postreset = bfin_postreset,
+12 -26
drivers/ata/pata_scc.c
··· 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 + 424 + static void scc_set_devctl(struct ata_port *ap, u8 ctl) 425 + { 426 + out_be32(ap->ioaddr.ctl_addr, ctl); 427 + } 428 + 429 + /** 419 430 * scc_bmdma_setup - Set up PCI IDE BMDMA transaction 420 431 * @qc: Info associated with this ATA transaction. 421 432 * ··· 851 840 } 852 841 853 842 /** 854 - * scc_freeze - Freeze BMDMA controller port 855 - * @ap: port to freeze 856 - * 857 - * Note: Original code is ata_sff_freeze(). 858 - */ 859 - 860 - static void scc_freeze (struct ata_port *ap) 861 - { 862 - struct ata_ioports *ioaddr = &ap->ioaddr; 863 - 864 - ap->ctl |= ATA_NIEN; 865 - ap->last_ctl = ap->ctl; 866 - 867 - out_be32(ioaddr->ctl_addr, ap->ctl); 868 - 869 - /* Under certain circumstances, some controllers raise IRQ on 870 - * ATA_NIEN manipulation. Also, many controllers fail to mask 871 - * previously pending IRQ on ATA_NIEN assertion. Clear it. 872 - */ 873 - ap->ops->sff_check_status(ap); 874 - 875 - ap->ops->sff_irq_clear(ap); 876 - } 877 - 878 - /** 879 843 * scc_pata_prereset - prepare for reset 880 844 * @ap: ATA port to be reset 881 845 * @deadline: deadline jiffies for the operation ··· 963 977 .sff_check_status = scc_check_status, 964 978 .sff_check_altstatus = scc_check_altstatus, 965 979 .sff_dev_select = scc_dev_select, 980 + .sff_set_devctl = scc_set_devctl, 966 981 967 982 .bmdma_setup = scc_bmdma_setup, 968 983 .bmdma_start = scc_bmdma_start, ··· 971 984 .bmdma_status = scc_bmdma_status, 972 985 .sff_data_xfer = scc_data_xfer, 973 986 974 - .freeze = scc_freeze, 975 987 .prereset = scc_pata_prereset, 976 988 .softreset = scc_softreset, 977 989 .postreset = scc_postreset,
+1
include/linux/libata.h
··· 850 850 * SFF / taskfile oriented ops 851 851 */ 852 852 void (*sff_dev_select)(struct ata_port *ap, unsigned int device); 853 + void (*sff_set_devctl)(struct ata_port *ap, u8 ctl); 853 854 u8 (*sff_check_status)(struct ata_port *ap); 854 855 u8 (*sff_check_altstatus)(struct ata_port *ap); 855 856 void (*sff_tf_load)(struct ata_port *ap, const struct ata_taskfile *tf);