提交 a5df2eab 编写于 作者: A Alan Cox 提交者: Jeff Garzik

pata_pcmcia: Add support for dumb 8bit IDE emulations

Signed-off-by: NAlan Cox <alan@redhat.com>
Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
上级 0bcc65ad
...@@ -86,6 +86,44 @@ static int pcmcia_set_mode(struct ata_link *link, struct ata_device **r_failed_d ...@@ -86,6 +86,44 @@ static int pcmcia_set_mode(struct ata_link *link, struct ata_device **r_failed_d
return ata_do_set_mode(link, r_failed_dev); return ata_do_set_mode(link, r_failed_dev);
} }
/**
* pcmcia_set_mode_8bit - PCMCIA specific mode setup
* @link: link
* @r_failed_dev: Return pointer for failed device
*
* For the simple emulated 8bit stuff the less we do the better.
*/
static int pcmcia_set_mode_8bit(struct ata_link *link,
struct ata_device **r_failed_dev)
{
return 0;
}
/**
* ata_data_xfer_8bit - Transfer data by 8bit PIO
* @adev: device to target
* @buf: data buffer
* @buflen: buffer length
* @write_data: read/write
*
* Transfer data from/to the device data register by 8 bit PIO.
*
* LOCKING:
* Inherited from caller.
*/
static void ata_data_xfer_8bit(struct ata_device *adev, unsigned char *buf,
unsigned int buflen, int write_data)
{
struct ata_port *ap = adev->link->ap;
if (write_data)
iowrite8_rep(ap->ioaddr.data_addr, buf, buflen);
else
ioread8_rep(ap->ioaddr.data_addr, buf, buflen);
}
static struct scsi_host_template pcmcia_sht = { static struct scsi_host_template pcmcia_sht = {
.module = THIS_MODULE, .module = THIS_MODULE,
.name = DRV_NAME, .name = DRV_NAME,
...@@ -129,12 +167,38 @@ static struct ata_port_operations pcmcia_port_ops = { ...@@ -129,12 +167,38 @@ static struct ata_port_operations pcmcia_port_ops = {
.port_start = ata_sff_port_start, .port_start = ata_sff_port_start,
}; };
static struct ata_port_operations pcmcia_8bit_port_ops = {
.set_mode = pcmcia_set_mode_8bit,
.tf_load = ata_tf_load,
.tf_read = ata_tf_read,
.check_status = ata_check_status,
.exec_command = ata_exec_command,
.dev_select = ata_std_dev_select,
.freeze = ata_bmdma_freeze,
.thaw = ata_bmdma_thaw,
.error_handler = ata_bmdma_error_handler,
.post_internal_cmd = ata_bmdma_post_internal_cmd,
.cable_detect = ata_cable_40wire,
.qc_prep = ata_qc_prep,
.qc_issue = ata_qc_issue_prot,
.data_xfer = ata_data_xfer_8bit,
.irq_clear = ata_bmdma_irq_clear,
.irq_on = ata_irq_on,
.port_start = ata_sff_port_start,
};
#define CS_CHECK(fn, ret) \ #define CS_CHECK(fn, ret) \
do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
/** /**
* pcmcia_init_one - attach a PCMCIA interface * pcmcia_init_one - attach a PCMCIA interface
* @pdev: pcmcia device * @pdev: pcmcia device
* @ops: operations for this device
* *
* Register a PCMCIA IDE interface. Such interfaces are PIO 0 and * Register a PCMCIA IDE interface. Such interfaces are PIO 0 and
* shared IRQ. * shared IRQ.
...@@ -157,6 +221,8 @@ static int pcmcia_init_one(struct pcmcia_device *pdev) ...@@ -157,6 +221,8 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
unsigned long io_base, ctl_base; unsigned long io_base, ctl_base;
void __iomem *io_addr, *ctl_addr; void __iomem *io_addr, *ctl_addr;
struct ata_port_operations *ops = &pcmcia_port_ops;
info = kzalloc(sizeof(*info), GFP_KERNEL); info = kzalloc(sizeof(*info), GFP_KERNEL);
if (info == NULL) if (info == NULL)
return -ENOMEM; return -ENOMEM;
...@@ -284,6 +350,8 @@ static int pcmcia_init_one(struct pcmcia_device *pdev) ...@@ -284,6 +350,8 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
if (pdev->io.NumPorts1 >= 0x20) if (pdev->io.NumPorts1 >= 0x20)
printk(KERN_WARNING DRV_NAME ": second channel not yet supported.\n"); printk(KERN_WARNING DRV_NAME ": second channel not yet supported.\n");
if (pdev->manf_id == 0x0097 && pdev->card_id == 0x1620)
ops = &pcmcia_8bit_port_ops;
/* /*
* Having done the PCMCIA plumbing the ATA side is relatively * Having done the PCMCIA plumbing the ATA side is relatively
* sane. * sane.
...@@ -294,7 +362,7 @@ static int pcmcia_init_one(struct pcmcia_device *pdev) ...@@ -294,7 +362,7 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
goto failed; goto failed;
ap = host->ports[0]; ap = host->ports[0];
ap->ops = &pcmcia_port_ops; ap->ops = ops;
ap->pio_mask = 1; /* ISA so PIO 0 cycles */ ap->pio_mask = 1; /* ISA so PIO 0 cycles */
ap->flags |= ATA_FLAG_SLAVE_POSS; ap->flags |= ATA_FLAG_SLAVE_POSS;
ap->ioaddr.cmd_addr = io_addr; ap->ioaddr.cmd_addr = io_addr;
...@@ -360,6 +428,7 @@ static struct pcmcia_device_id pcmcia_devices[] = { ...@@ -360,6 +428,7 @@ static struct pcmcia_device_id pcmcia_devices[] = {
PCMCIA_DEVICE_MANF_CARD(0x0032, 0x0704), PCMCIA_DEVICE_MANF_CARD(0x0032, 0x0704),
PCMCIA_DEVICE_MANF_CARD(0x0032, 0x2904), PCMCIA_DEVICE_MANF_CARD(0x0032, 0x2904),
PCMCIA_DEVICE_MANF_CARD(0x0045, 0x0401), /* SanDisk CFA */ PCMCIA_DEVICE_MANF_CARD(0x0045, 0x0401), /* SanDisk CFA */
PCMCIA_DEVICE_MANF_CARD(0x0097, 0x1620), /* TI emulated */
PCMCIA_DEVICE_MANF_CARD(0x0098, 0x0000), /* Toshiba */ PCMCIA_DEVICE_MANF_CARD(0x0098, 0x0000), /* Toshiba */
PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x002d), PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x002d),
PCMCIA_DEVICE_MANF_CARD(0x00ce, 0x0000), /* Samsung */ PCMCIA_DEVICE_MANF_CARD(0x00ce, 0x0000), /* Samsung */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册