linux/drivers/ide/pci/jmicron.c
<<
>>
Prefs
   1
   2/*
   3 * Copyright (C) 2006           Red Hat <alan@redhat.com>
   4 *
   5 *  May be copied or modified under the terms of the GNU General Public License
   6 */
   7
   8#include <linux/types.h>
   9#include <linux/module.h>
  10#include <linux/pci.h>
  11#include <linux/delay.h>
  12#include <linux/hdreg.h>
  13#include <linux/ide.h>
  14#include <linux/init.h>
  15
  16#include <asm/io.h>
  17
  18typedef enum {
  19        PORT_PATA0 = 0,
  20        PORT_PATA1 = 1,
  21        PORT_SATA = 2,
  22} port_type;
  23
  24/**
  25 *      ata66_jmicron           -       Cable check
  26 *      @hwif: IDE port
  27 *
  28 *      Returns the cable type.
  29 */
  30
  31static u8 __devinit ata66_jmicron(ide_hwif_t *hwif)
  32{
  33        struct pci_dev *pdev = hwif->pci_dev;
  34
  35        u32 control;
  36        u32 control5;
  37
  38        int port = hwif->channel;
  39        port_type port_map[2];
  40
  41        pci_read_config_dword(pdev, 0x40, &control);
  42
  43        /* There are two basic mappings. One has the two SATA ports merged
  44           as master/slave and the secondary as PATA, the other has only the
  45           SATA port mapped */
  46        if (control & (1 << 23)) {
  47                port_map[0] = PORT_SATA;
  48                port_map[1] = PORT_PATA0;
  49        } else {
  50                port_map[0] = PORT_SATA;
  51                port_map[1] = PORT_SATA;
  52        }
  53
  54        /* The 365/366 may have this bit set to map the second PATA port
  55           as the internal primary channel */
  56        pci_read_config_dword(pdev, 0x80, &control5);
  57        if (control5 & (1<<24))
  58                port_map[0] = PORT_PATA1;
  59
  60        /* The two ports may then be logically swapped by the firmware */
  61        if (control & (1 << 22))
  62                port = port ^ 1;
  63
  64        /*
  65         *      Now we know which physical port we are talking about we can
  66         *      actually do our cable checking etc. Thankfully we don't need
  67         *      to do the plumbing for other cases.
  68         */
  69        switch (port_map[port])
  70        {
  71        case PORT_PATA0:
  72                if (control & (1 << 3)) /* 40/80 pin primary */
  73                        return ATA_CBL_PATA40;
  74                return ATA_CBL_PATA80;
  75        case PORT_PATA1:
  76                if (control5 & (1 << 19))       /* 40/80 pin secondary */
  77                        return ATA_CBL_PATA40;
  78                return ATA_CBL_PATA80;
  79        case PORT_SATA:
  80                break;
  81        }
  82        /* Avoid bogus "control reaches end of non-void function" */
  83        return ATA_CBL_PATA80;
  84}
  85
  86static void jmicron_set_pio_mode(ide_drive_t *drive, const u8 pio)
  87{
  88}
  89
  90/**
  91 *      jmicron_set_dma_mode    -       set host controller for DMA mode
  92 *      @drive: drive
  93 *      @mode: DMA mode
  94 *
  95 *      As the JMicron snoops for timings we don't need to do anything here.
  96 */
  97
  98static void jmicron_set_dma_mode(ide_drive_t *drive, const u8 mode)
  99{
 100}
 101
 102/**
 103 *      init_hwif_jmicron       -       set up hwif structs
 104 *      @hwif: interface to set up
 105 *
 106 *      Minimal set up is required for the Jmicron hardware.
 107 */
 108
 109static void __devinit init_hwif_jmicron(ide_hwif_t *hwif)
 110{
 111        hwif->set_pio_mode = &jmicron_set_pio_mode;
 112        hwif->set_dma_mode = &jmicron_set_dma_mode;
 113
 114        if (hwif->dma_base == 0)
 115                return;
 116
 117        if (hwif->cbl != ATA_CBL_PATA40_SHORT)
 118                hwif->cbl = ata66_jmicron(hwif);
 119}
 120
 121static const struct ide_port_info jmicron_chipset __devinitdata = {
 122        .name           = "JMB",
 123        .init_hwif      = init_hwif_jmicron,
 124        .host_flags     = IDE_HFLAG_BOOTABLE,
 125        .enablebits     = { { 0x40, 0x01, 0x01 }, { 0x40, 0x10, 0x10 } },
 126        .pio_mask       = ATA_PIO5,
 127        .mwdma_mask     = ATA_MWDMA2,
 128        .udma_mask      = ATA_UDMA6,
 129};
 130
 131/**
 132 *      jmicron_init_one        -       pci layer discovery entry
 133 *      @dev: PCI device
 134 *      @id: ident table entry
 135 *
 136 *      Called by the PCI code when it finds a Jmicron controller.
 137 *      We then use the IDE PCI generic helper to do most of the work.
 138 */
 139
 140static int __devinit jmicron_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 141{
 142        return ide_setup_pci_device(dev, &jmicron_chipset);
 143}
 144
 145/* All JMB PATA controllers have and will continue to have the same
 146 * interface.  Matching vendor and device class is enough for all
 147 * current and future controllers if the controller is programmed
 148 * properly.
 149 *
 150 * If libata is configured, jmicron PCI quirk programs the controller
 151 * into the correct mode.  If libata isn't configured, match known
 152 * device IDs too to maintain backward compatibility.
 153 */
 154static struct pci_device_id jmicron_pci_tbl[] = {
 155#if !defined(CONFIG_ATA) && !defined(CONFIG_ATA_MODULE)
 156        { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB361) },
 157        { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB363) },
 158        { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB365) },
 159        { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB366) },
 160        { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB368) },
 161#endif
 162        { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
 163          PCI_CLASS_STORAGE_IDE << 8, 0xffff00, 0 },
 164        { 0, },
 165};
 166
 167MODULE_DEVICE_TABLE(pci, jmicron_pci_tbl);
 168
 169static struct pci_driver driver = {
 170        .name           = "JMicron IDE",
 171        .id_table       = jmicron_pci_tbl,
 172        .probe          = jmicron_init_one,
 173};
 174
 175static int __init jmicron_ide_init(void)
 176{
 177        return ide_pci_register_driver(&driver);
 178}
 179
 180module_init(jmicron_ide_init);
 181
 182MODULE_AUTHOR("Alan Cox");
 183MODULE_DESCRIPTION("PCI driver module for the JMicron in legacy modes");
 184MODULE_LICENSE("GPL");
 185
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.