diff options
| author | Kristoffer Nyborg Gregertsen <kngregertsen@norway.atmel.com> | 2007-11-29 06:01:51 -0500 |
|---|---|---|
| committer | Jeff Garzik <jeff@garzik.org> | 2007-12-01 17:35:58 -0500 |
| commit | 1c20a493caa30c5d47a394f9dbd86e6282323db9 (patch) | |
| tree | 82c3c053f74f13bb90a71d1162d482ae5352c06a | |
| parent | 2d79ab8fd7a7bf3a45d0e948ae27b3dd95ce95ea (diff) | |
Several fixes for the AVR32 PATA driver
Several fixes for the AVR32 PATA driver:
* Updated to use new AVR32 SMC timing API. This removes the need for "magic"
constants in signal timing.
* Removed the ATA_FLAG_PIO_POLLING, the driver should use interrupts.
* Removed .port_disable and .irq_ack as these are no longer needed.
* Improved some comments.
Signed-off-by: Kristoffer Nyborg Gregertsen <kngregertsen@norway.atmel.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
| -rw-r--r-- | drivers/ata/pata_at32.c | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/drivers/ata/pata_at32.c b/drivers/ata/pata_at32.c index bb250a48e27c..67e574de31e8 100644 --- a/drivers/ata/pata_at32.c +++ b/drivers/ata/pata_at32.c | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | #include <asm/arch/smc.h> | 28 | #include <asm/arch/smc.h> |
| 29 | 29 | ||
| 30 | #define DRV_NAME "pata_at32" | 30 | #define DRV_NAME "pata_at32" |
| 31 | #define DRV_VERSION "0.0.2" | 31 | #define DRV_VERSION "0.0.3" |
| 32 | 32 | ||
| 33 | /* | 33 | /* |
| 34 | * CompactFlash controller memory layout relative to the base address: | 34 | * CompactFlash controller memory layout relative to the base address: |
| @@ -64,6 +64,8 @@ | |||
| 64 | * Mode 2 | 8.3 | 240 ns | 0x07 | 64 | * Mode 2 | 8.3 | 240 ns | 0x07 |
| 65 | * Mode 3 | 11.1 | 180 ns | 0x0f | 65 | * Mode 3 | 11.1 | 180 ns | 0x0f |
| 66 | * Mode 4 | 16.7 | 120 ns | 0x1f | 66 | * Mode 4 | 16.7 | 120 ns | 0x1f |
| 67 | * | ||
| 68 | * Alter PIO_MASK below according to table to set maximal PIO mode. | ||
| 67 | */ | 69 | */ |
| 68 | #define PIO_MASK (0x1f) | 70 | #define PIO_MASK (0x1f) |
| 69 | 71 | ||
| @@ -85,36 +87,40 @@ struct at32_ide_info { | |||
| 85 | */ | 87 | */ |
| 86 | static int pata_at32_setup_timing(struct device *dev, | 88 | static int pata_at32_setup_timing(struct device *dev, |
| 87 | struct at32_ide_info *info, | 89 | struct at32_ide_info *info, |
| 88 | const struct ata_timing *timing) | 90 | const struct ata_timing *ata) |
| 89 | { | 91 | { |
| 90 | /* These two values are found through testing */ | ||
| 91 | const int min_recover = 25; | ||
| 92 | const int ncs_hold = 15; | ||
| 93 | |||
| 94 | struct smc_config *smc = &info->smc; | 92 | struct smc_config *smc = &info->smc; |
| 93 | struct smc_timing timing; | ||
| 95 | 94 | ||
| 96 | int active; | 95 | int active; |
| 97 | int recover; | 96 | int recover; |
| 98 | 97 | ||
| 98 | memset(&timing, 0, sizeof(struct smc_timing)); | ||
| 99 | |||
| 99 | /* Total cycle time */ | 100 | /* Total cycle time */ |
| 100 | smc->read_cycle = timing->cyc8b; | 101 | timing.read_cycle = ata->cyc8b; |
| 101 | 102 | ||
| 102 | /* DIOR <= CFIOR timings */ | 103 | /* DIOR <= CFIOR timings */ |
| 103 | smc->nrd_setup = timing->setup; | 104 | timing.nrd_setup = ata->setup; |
| 104 | smc->nrd_pulse = timing->act8b; | 105 | timing.nrd_pulse = ata->act8b; |
| 106 | timing.nrd_recover = ata->rec8b; | ||
| 107 | |||
| 108 | /* Convert nanosecond timing to clock cycles */ | ||
| 109 | smc_set_timing(smc, &timing); | ||
| 105 | 110 | ||
| 106 | /* Compute recover, extend total cycle if needed */ | 111 | /* Add one extra cycle setup due to signal ring */ |
| 107 | active = smc->nrd_setup + smc->nrd_pulse; | 112 | smc->nrd_setup = smc->nrd_setup + 1; |
| 113 | |||
| 114 | active = smc->nrd_setup + smc->nrd_pulse; | ||
| 108 | recover = smc->read_cycle - active; | 115 | recover = smc->read_cycle - active; |
| 109 | 116 | ||
| 110 | if (recover < min_recover) { | 117 | /* Need at least two cycles recovery */ |
| 111 | smc->read_cycle = active + min_recover; | 118 | if (recover < 2) |
| 112 | recover = min_recover; | 119 | smc->read_cycle = active + 2; |
| 113 | } | ||
| 114 | 120 | ||
| 115 | /* (CS0, CS1, DIR, OE) <= (CFCE1, CFCE2, CFRNW, NCSX) timings */ | 121 | /* (CS0, CS1, DIR, OE) <= (CFCE1, CFCE2, CFRNW, NCSX) timings */ |
| 116 | smc->ncs_read_setup = 0; | 122 | smc->ncs_read_setup = 1; |
| 117 | smc->ncs_read_pulse = active + ncs_hold; | 123 | smc->ncs_read_pulse = smc->read_cycle - 2; |
| 118 | 124 | ||
| 119 | /* Write timings same as read timings */ | 125 | /* Write timings same as read timings */ |
| 120 | smc->write_cycle = smc->read_cycle; | 126 | smc->write_cycle = smc->read_cycle; |
| @@ -123,11 +129,13 @@ static int pata_at32_setup_timing(struct device *dev, | |||
| 123 | smc->ncs_write_setup = smc->ncs_read_setup; | 129 | smc->ncs_write_setup = smc->ncs_read_setup; |
| 124 | smc->ncs_write_pulse = smc->ncs_read_pulse; | 130 | smc->ncs_write_pulse = smc->ncs_read_pulse; |
| 125 | 131 | ||
| 126 | /* Do some debugging output */ | 132 | /* Do some debugging output of ATA and SMC timings */ |
| 127 | dev_dbg(dev, "SMC: C=%d S=%d P=%d R=%d NCSS=%d NCSP=%d NCSR=%d\n", | 133 | dev_dbg(dev, "ATA: C=%d S=%d P=%d R=%d\n", |
| 134 | ata->cyc8b, ata->setup, ata->act8b, ata->rec8b); | ||
| 135 | |||
| 136 | dev_dbg(dev, "SMC: C=%d S=%d P=%d NS=%d NP=%d\n", | ||
| 128 | smc->read_cycle, smc->nrd_setup, smc->nrd_pulse, | 137 | smc->read_cycle, smc->nrd_setup, smc->nrd_pulse, |
| 129 | recover, smc->ncs_read_setup, smc->ncs_read_pulse, | 138 | smc->ncs_read_setup, smc->ncs_read_pulse); |
| 130 | smc->read_cycle - smc->ncs_read_pulse); | ||
| 131 | 139 | ||
| 132 | /* Finally, configure the SMC */ | 140 | /* Finally, configure the SMC */ |
| 133 | return smc_set_configuration(info->cs, smc); | 141 | return smc_set_configuration(info->cs, smc); |
| @@ -182,7 +190,6 @@ static struct scsi_host_template at32_sht = { | |||
| 182 | }; | 190 | }; |
| 183 | 191 | ||
| 184 | static struct ata_port_operations at32_port_ops = { | 192 | static struct ata_port_operations at32_port_ops = { |
| 185 | .port_disable = ata_port_disable, | ||
| 186 | .set_piomode = pata_at32_set_piomode, | 193 | .set_piomode = pata_at32_set_piomode, |
| 187 | .tf_load = ata_tf_load, | 194 | .tf_load = ata_tf_load, |
| 188 | .tf_read = ata_tf_read, | 195 | .tf_read = ata_tf_read, |
| @@ -203,7 +210,6 @@ static struct ata_port_operations at32_port_ops = { | |||
| 203 | 210 | ||
| 204 | .irq_clear = pata_at32_irq_clear, | 211 | .irq_clear = pata_at32_irq_clear, |
| 205 | .irq_on = ata_irq_on, | 212 | .irq_on = ata_irq_on, |
| 206 | .irq_ack = ata_irq_ack, | ||
| 207 | 213 | ||
| 208 | .port_start = ata_sff_port_start, | 214 | .port_start = ata_sff_port_start, |
| 209 | }; | 215 | }; |
| @@ -223,8 +229,7 @@ static int __init pata_at32_init_one(struct device *dev, | |||
| 223 | /* Setup ATA bindings */ | 229 | /* Setup ATA bindings */ |
| 224 | ap->ops = &at32_port_ops; | 230 | ap->ops = &at32_port_ops; |
| 225 | ap->pio_mask = PIO_MASK; | 231 | ap->pio_mask = PIO_MASK; |
| 226 | ap->flags = ATA_FLAG_MMIO | ATA_FLAG_SLAVE_POSS | 232 | ap->flags |= ATA_FLAG_MMIO | ATA_FLAG_SLAVE_POSS; |
| 227 | | ATA_FLAG_PIO_POLLING; | ||
| 228 | 233 | ||
| 229 | /* | 234 | /* |
| 230 | * Since all 8-bit taskfile transfers has to go on the lower | 235 | * Since all 8-bit taskfile transfers has to go on the lower |
| @@ -357,12 +362,12 @@ static int __init pata_at32_probe(struct platform_device *pdev) | |||
| 357 | info->smc.tdf_mode = 0; /* TDF optimization disabled */ | 362 | info->smc.tdf_mode = 0; /* TDF optimization disabled */ |
| 358 | info->smc.tdf_cycles = 0; /* No TDF wait cycles */ | 363 | info->smc.tdf_cycles = 0; /* No TDF wait cycles */ |
| 359 | 364 | ||
| 360 | /* Setup ATA timing */ | 365 | /* Setup SMC to ATA timing */ |
| 361 | ret = pata_at32_setup_timing(dev, info, &initial_timing); | 366 | ret = pata_at32_setup_timing(dev, info, &initial_timing); |
| 362 | if (ret) | 367 | if (ret) |
| 363 | goto err_setup_timing; | 368 | goto err_setup_timing; |
| 364 | 369 | ||
| 365 | /* Setup ATA addresses */ | 370 | /* Map ATA address space */ |
| 366 | ret = -ENOMEM; | 371 | ret = -ENOMEM; |
| 367 | info->ide_addr = devm_ioremap(dev, info->res_ide.start, 16); | 372 | info->ide_addr = devm_ioremap(dev, info->res_ide.start, 16); |
| 368 | info->alt_addr = devm_ioremap(dev, info->res_alt.start, 16); | 373 | info->alt_addr = devm_ioremap(dev, info->res_alt.start, 16); |
| @@ -373,7 +378,7 @@ static int __init pata_at32_probe(struct platform_device *pdev) | |||
| 373 | pata_at32_debug_bus(dev, info); | 378 | pata_at32_debug_bus(dev, info); |
| 374 | #endif | 379 | #endif |
| 375 | 380 | ||
| 376 | /* Register ATA device */ | 381 | /* Setup and register ATA device */ |
| 377 | ret = pata_at32_init_one(dev, info); | 382 | ret = pata_at32_init_one(dev, info); |
| 378 | if (ret) | 383 | if (ret) |
| 379 | goto err_ata_device; | 384 | goto err_ata_device; |
