50dedefbe76d740f1000f21f34c240250a023243
[openwrt/svn-archive/archive.git] / target / linux / rb532 / patches-2.6.27 / 004-fix_pata_rb532_cf.patch
1 After applying the following changes I could verify functionality by
2 mounting a filesystem on the cfdisk and reading/writing files in it.
3
4 The set_irq_type() function must be wrong, as there is no set_type()
5 function defined for the rb532 IRQ chip. But as the used IRQ actually is
6 being triggered by a GPIO, setting it's interrupt level should be the
7 right alternative. Also to clear a GPIO triggered IRQ, the source has to
8 be cleared. This is being done at the end of rb532_pata_irq_handler.
9
10 Signed-off-by: Phil Sutter <n0-1@freewrt.org>
11 Acked-by: Florian Fainelli <florian@openwrt.org>
12 ---
13 drivers/ata/pata_rb532_cf.c | 15 ++++++++++-----
14 1 files changed, 10 insertions(+), 5 deletions(-)
15
16 diff --git a/drivers/ata/pata_rb532_cf.c b/drivers/ata/pata_rb532_cf.c
17 index f8b3ffc..7b11f40 100644
18 --- a/drivers/ata/pata_rb532_cf.c
19 +++ b/drivers/ata/pata_rb532_cf.c
20 @@ -31,6 +31,7 @@
21 #include <scsi/scsi_host.h>
22
23 #include <asm/gpio.h>
24 +#include <asm/mach-rc32434/gpio.h>
25
26 #define DRV_NAME "pata-rb532-cf"
27 #define DRV_VERSION "0.1.0"
28 @@ -39,7 +40,8 @@
29 #define RB500_CF_MAXPORTS 1
30 #define RB500_CF_IO_DELAY 400
31
32 -#define RB500_CF_REG_CMD 0x0800
33 +#define RB500_CF_REG_BASE 0x0800
34 +#define RB500_CF_REG_ERR 0x080D
35 #define RB500_CF_REG_CTRL 0x080E
36 #define RB500_CF_REG_DATA 0x0C00
37
38 @@ -62,7 +64,7 @@ static inline void rb532_pata_finish_io(struct ata_port *ap)
39 ata_sff_dma_pause(ap);
40 ndelay(RB500_CF_IO_DELAY);
41
42 - set_irq_type(info->irq, IRQ_TYPE_LEVEL_HIGH);
43 + rb532_gpio_set_ilevel(1, info->gpio_line);
44 }
45
46 static void rb532_pata_exec_command(struct ata_port *ap,
47 @@ -109,13 +111,15 @@ static irqreturn_t rb532_pata_irq_handler(int irq, void *dev_instance)
48 struct rb532_cf_info *info = ah->private_data;
49
50 if (gpio_get_value(info->gpio_line)) {
51 - set_irq_type(info->irq, IRQ_TYPE_LEVEL_LOW);
52 + rb532_gpio_set_ilevel(0, info->gpio_line);
53 if (!info->frozen)
54 ata_sff_interrupt(info->irq, dev_instance);
55 } else {
56 - set_irq_type(info->irq, IRQ_TYPE_LEVEL_HIGH);
57 + rb532_gpio_set_ilevel(1, info->gpio_line);
58 }
59
60 + rb532_gpio_set_istat(0, info->gpio_line);
61 +
62 return IRQ_HANDLED;
63 }
64
65 @@ -146,13 +150,14 @@ static void rb532_pata_setup_ports(struct ata_host *ah)
66 ap->pio_mask = 0x1f; /* PIO4 */
67 ap->flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO;
68
69 - ap->ioaddr.cmd_addr = info->iobase + RB500_CF_REG_CMD;
70 + ap->ioaddr.cmd_addr = info->iobase + RB500_CF_REG_BASE;
71 ap->ioaddr.ctl_addr = info->iobase + RB500_CF_REG_CTRL;
72 ap->ioaddr.altstatus_addr = info->iobase + RB500_CF_REG_CTRL;
73
74 ata_sff_std_ports(&ap->ioaddr);
75
76 ap->ioaddr.data_addr = info->iobase + RB500_CF_REG_DATA;
77 + ap->ioaddr.error_addr = info->iobase + RB500_CF_REG_ERR;
78 }
79
80 static __devinit int rb532_pata_driver_probe(struct platform_device *pdev)
81 --
82 1.5.6.4
83
84