1 #include <linux/kernel.h>
2 #include <linux/module.h>
13 #define DRV_NAME "pata_icside"
15 #define ICS_IDENT_OFFSET 0x2280
17 #define ICS_ARCIN_V5_INTRSTAT 0x0000
18 #define ICS_ARCIN_V5_INTROFFSET 0x0004
20 #define ICS_ARCIN_V6_INTROFFSET_1 0x2200
21 #define ICS_ARCIN_V6_INTRSTAT_1 0x2290
22 #define ICS_ARCIN_V6_INTROFFSET_2 0x3200
23 #define ICS_ARCIN_V6_INTRSTAT_2 0x3290
31 static const struct portinfo pata_icside_portinfo_v5 = {
37 static const struct portinfo pata_icside_portinfo_v6_1 = {
43 static const struct portinfo pata_icside_portinfo_v6_2 = {
75 #define ICS_TYPE_A3IN 0
76 #define ICS_TYPE_A3USER 1
78 #define ICS_TYPE_V5 15
79 #define ICS_TYPE_NOTYPE ((unsigned int)-1)
85 static void pata_icside_irqenable_arcin_v5 (
struct expansion_card *ec,
int irqnr)
95 static void pata_icside_irqdisable_arcin_v5 (
struct expansion_card *ec,
int irqnr)
103 .
irqenable = pata_icside_irqenable_arcin_v5,
104 .irqdisable = pata_icside_irqdisable_arcin_v5,
112 static void pata_icside_irqenable_arcin_v6 (
struct expansion_card *ec,
int irqnr)
117 if (!state->
port[0].disabled)
119 if (!state->
port[1].disabled)
126 static void pata_icside_irqdisable_arcin_v6 (
struct expansion_card *ec,
int irqnr)
137 static int pata_icside_irqpending_arcin_v6(
struct expansion_card *ec)
146 .
irqenable = pata_icside_irqenable_arcin_v6,
147 .irqdisable = pata_icside_irqdisable_arcin_v6,
148 .irqpending = pata_icside_irqpending_arcin_v6,
204 if (
t.active <= 50 &&
t.recover <= 375 &&
t.cycle <= 425)
205 iomd_type =
'D', cycle = 187;
206 else if (
t.active <= 125 &&
t.recover <= 375 &&
t.cycle <= 500)
207 iomd_type =
'C', cycle = 250;
208 else if (
t.active <= 200 &&
t.recover <= 550 &&
t.cycle <= 750)
209 iomd_type =
'B', cycle = 437;
211 iomd_type =
'A', cycle = 562;
213 ata_dev_info(adev,
"timings: act %dns rec %dns cyc %dns (%c)\n",
214 t.active,
t.recover,
t.cycle, iomd_type);
241 ap->
ops->sff_exec_command(ap, &qc->
tf);
264 static u8 pata_icside_bmdma_status(
struct ata_port *ap)
282 state->
port[0].speed[
i] = 480;
283 state->
port[1].speed[
i] = 480;
301 static void pata_icside_postreset(
struct ata_link *
link,
unsigned int *classes)
324 .inherits = &ata_bmdma_port_ops,
328 .bmdma_setup = pata_icside_bmdma_setup,
329 .bmdma_start = pata_icside_bmdma_start,
330 .bmdma_stop = pata_icside_bmdma_stop,
331 .bmdma_status = pata_icside_bmdma_status,
334 .set_dmamode = pata_icside_set_dmamode,
335 .postreset = pata_icside_postreset,
345 struct ata_ioports *ioaddr = &ap->ioaddr;
348 ioaddr->cmd_addr =
cmd;
361 ioaddr->altstatus_addr = ioaddr->ctl_addr;
385 info->
irqops = &pata_icside_ops_arcin_v5;
387 info->
port[0] = &pata_icside_portinfo_v5;
398 void __iomem *ioc_base, *easi_base;
399 unsigned int sel = 0;
405 easi_base = ioc_base;
423 state->
port[1].port_sel = sel | 1;
425 info->
base = easi_base;
426 info->
irqops = &pata_icside_ops_arcin_v6;
428 info->
port[0] = &pata_icside_portinfo_v6_1;
429 info->
port[1] = &pata_icside_portinfo_v6_2;
434 return icside_dma_init(info);
462 for (i = 0; i < info->
nr_ports; i++) {
468 ap->
ops = &pata_icside_port_ops;
470 pata_icside_setup_ioaddr(ap, info->
base, info, info->
port[i]);
511 memset(&info, 0,
sizeof(info));
515 switch (state->
type) {
527 ret = pata_icside_register_v5(&info);
531 ret = pata_icside_register_v6(&info);
541 ret = pata_icside_add_ports(&info);
585 pata_icside_shutdown(ec);
597 static const struct ecard_id pata_icside_ids[] = {
604 .probe = pata_icside_probe,
606 .shutdown = pata_icside_shutdown,
607 .id_table = pata_icside_ids,
613 static int __init pata_icside_init(
void)
618 static void __exit pata_icside_exit(
void)