diff options
| -rw-r--r-- | drivers/ata/pata_pcmcia.c | 71 |
1 files changed, 70 insertions, 1 deletions
diff --git a/drivers/ata/pata_pcmcia.c b/drivers/ata/pata_pcmcia.c index fd36099428a4..bbd4d70b92de 100644 --- a/drivers/ata/pata_pcmcia.c +++ b/drivers/ata/pata_pcmcia.c | |||
| @@ -86,6 +86,44 @@ static int pcmcia_set_mode(struct ata_link *link, struct ata_device **r_failed_d | |||
| 86 | return ata_do_set_mode(link, r_failed_dev); | 86 | return ata_do_set_mode(link, r_failed_dev); |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | /** | ||
| 90 | * pcmcia_set_mode_8bit - PCMCIA specific mode setup | ||
| 91 | * @link: link | ||
| 92 | * @r_failed_dev: Return pointer for failed device | ||
| 93 | * | ||
| 94 | * For the simple emulated 8bit stuff the less we do the better. | ||
| 95 | */ | ||
| 96 | |||
| 97 | static int pcmcia_set_mode_8bit(struct ata_link *link, | ||
| 98 | struct ata_device **r_failed_dev) | ||
| 99 | { | ||
| 100 | return 0; | ||
| 101 | } | ||
| 102 | |||
| 103 | /** | ||
| 104 | * ata_data_xfer_8bit - Transfer data by 8bit PIO | ||
| 105 | * @adev: device to target | ||
| 106 | * @buf: data buffer | ||
| 107 | * @buflen: buffer length | ||
| 108 | * @write_data: read/write | ||
| 109 | * | ||
| 110 | * Transfer data from/to the device data register by 8 bit PIO. | ||
| 111 | * | ||
| 112 | * LOCKING: | ||
| 113 | * Inherited from caller. | ||
| 114 | */ | ||
| 115 | |||
| 116 | static void ata_data_xfer_8bit(struct ata_device *adev, unsigned char *buf, | ||
| 117 | unsigned int buflen, int write_data) | ||
| 118 | { | ||
| 119 | struct ata_port *ap = adev->link->ap; | ||
| 120 | if (write_data) | ||
| 121 | iowrite8_rep(ap->ioaddr.data_addr, buf, buflen); | ||
| 122 | else | ||
| 123 | ioread8_rep(ap->ioaddr.data_addr, buf, buflen); | ||
| 124 | } | ||
| 125 | |||
| 126 | |||
| 89 | static struct scsi_host_template pcmcia_sht = { | 127 | static struct scsi_host_template pcmcia_sht = { |
| 90 | .module = THIS_MODULE, | 128 | .module = THIS_MODULE, |
| 91 | .name = DRV_NAME, | 129 | .name = DRV_NAME, |
| @@ -129,12 +167,38 @@ static struct ata_port_operations pcmcia_port_ops = { | |||
| 129 | .port_start = ata_sff_port_start, | 167 | .port_start = ata_sff_port_start, |
| 130 | }; | 168 | }; |
| 131 | 169 | ||
| 170 | static struct ata_port_operations pcmcia_8bit_port_ops = { | ||
| 171 | .set_mode = pcmcia_set_mode_8bit, | ||
| 172 | .tf_load = ata_tf_load, | ||
| 173 | .tf_read = ata_tf_read, | ||
| 174 | .check_status = ata_check_status, | ||
| 175 | .exec_command = ata_exec_command, | ||
| 176 | .dev_select = ata_std_dev_select, | ||
| 177 | |||
| 178 | .freeze = ata_bmdma_freeze, | ||
| 179 | .thaw = ata_bmdma_thaw, | ||
| 180 | .error_handler = ata_bmdma_error_handler, | ||
| 181 | .post_internal_cmd = ata_bmdma_post_internal_cmd, | ||
| 182 | .cable_detect = ata_cable_40wire, | ||
| 183 | |||
| 184 | .qc_prep = ata_qc_prep, | ||
| 185 | .qc_issue = ata_qc_issue_prot, | ||
| 186 | |||
| 187 | .data_xfer = ata_data_xfer_8bit, | ||
| 188 | |||
| 189 | .irq_clear = ata_bmdma_irq_clear, | ||
| 190 | .irq_on = ata_irq_on, | ||
| 191 | |||
| 192 | .port_start = ata_sff_port_start, | ||
| 193 | }; | ||
| 194 | |||
| 132 | #define CS_CHECK(fn, ret) \ | 195 | #define CS_CHECK(fn, ret) \ |
| 133 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | 196 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) |
| 134 | 197 | ||
| 135 | /** | 198 | /** |
| 136 | * pcmcia_init_one - attach a PCMCIA interface | 199 | * pcmcia_init_one - attach a PCMCIA interface |
| 137 | * @pdev: pcmcia device | 200 | * @pdev: pcmcia device |
| 201 | * @ops: operations for this device | ||
| 138 | * | 202 | * |
| 139 | * Register a PCMCIA IDE interface. Such interfaces are PIO 0 and | 203 | * Register a PCMCIA IDE interface. Such interfaces are PIO 0 and |
| 140 | * shared IRQ. | 204 | * shared IRQ. |
| @@ -157,6 +221,8 @@ static int pcmcia_init_one(struct pcmcia_device *pdev) | |||
| 157 | unsigned long io_base, ctl_base; | 221 | unsigned long io_base, ctl_base; |
| 158 | void __iomem *io_addr, *ctl_addr; | 222 | void __iomem *io_addr, *ctl_addr; |
| 159 | 223 | ||
| 224 | struct ata_port_operations *ops = &pcmcia_port_ops; | ||
| 225 | |||
| 160 | info = kzalloc(sizeof(*info), GFP_KERNEL); | 226 | info = kzalloc(sizeof(*info), GFP_KERNEL); |
| 161 | if (info == NULL) | 227 | if (info == NULL) |
| 162 | return -ENOMEM; | 228 | return -ENOMEM; |
| @@ -284,6 +350,8 @@ next_entry: | |||
| 284 | if (pdev->io.NumPorts1 >= 0x20) | 350 | if (pdev->io.NumPorts1 >= 0x20) |
| 285 | printk(KERN_WARNING DRV_NAME ": second channel not yet supported.\n"); | 351 | printk(KERN_WARNING DRV_NAME ": second channel not yet supported.\n"); |
| 286 | 352 | ||
| 353 | if (pdev->manf_id == 0x0097 && pdev->card_id == 0x1620) | ||
| 354 | ops = &pcmcia_8bit_port_ops; | ||
| 287 | /* | 355 | /* |
| 288 | * Having done the PCMCIA plumbing the ATA side is relatively | 356 | * Having done the PCMCIA plumbing the ATA side is relatively |
| 289 | * sane. | 357 | * sane. |
| @@ -294,7 +362,7 @@ next_entry: | |||
| 294 | goto failed; | 362 | goto failed; |
| 295 | ap = host->ports[0]; | 363 | ap = host->ports[0]; |
| 296 | 364 | ||
| 297 | ap->ops = &pcmcia_port_ops; | 365 | ap->ops = ops; |
| 298 | ap->pio_mask = 1; /* ISA so PIO 0 cycles */ | 366 | ap->pio_mask = 1; /* ISA so PIO 0 cycles */ |
| 299 | ap->flags |= ATA_FLAG_SLAVE_POSS; | 367 | ap->flags |= ATA_FLAG_SLAVE_POSS; |
| 300 | ap->ioaddr.cmd_addr = io_addr; | 368 | ap->ioaddr.cmd_addr = io_addr; |
| @@ -360,6 +428,7 @@ static struct pcmcia_device_id pcmcia_devices[] = { | |||
| 360 | PCMCIA_DEVICE_MANF_CARD(0x0032, 0x0704), | 428 | PCMCIA_DEVICE_MANF_CARD(0x0032, 0x0704), |
| 361 | PCMCIA_DEVICE_MANF_CARD(0x0032, 0x2904), | 429 | PCMCIA_DEVICE_MANF_CARD(0x0032, 0x2904), |
| 362 | PCMCIA_DEVICE_MANF_CARD(0x0045, 0x0401), /* SanDisk CFA */ | 430 | PCMCIA_DEVICE_MANF_CARD(0x0045, 0x0401), /* SanDisk CFA */ |
| 431 | PCMCIA_DEVICE_MANF_CARD(0x0097, 0x1620), /* TI emulated */ | ||
| 363 | PCMCIA_DEVICE_MANF_CARD(0x0098, 0x0000), /* Toshiba */ | 432 | PCMCIA_DEVICE_MANF_CARD(0x0098, 0x0000), /* Toshiba */ |
| 364 | PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x002d), | 433 | PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x002d), |
| 365 | PCMCIA_DEVICE_MANF_CARD(0x00ce, 0x0000), /* Samsung */ | 434 | PCMCIA_DEVICE_MANF_CARD(0x00ce, 0x0000), /* Samsung */ |
