diff options
Diffstat (limited to 'target/linux/rb532/patches-2.6.28/004-fix_pata_rb532_cf.patch')
-rw-r--r-- | target/linux/rb532/patches-2.6.28/004-fix_pata_rb532_cf.patch | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/target/linux/rb532/patches-2.6.28/004-fix_pata_rb532_cf.patch b/target/linux/rb532/patches-2.6.28/004-fix_pata_rb532_cf.patch new file mode 100644 index 000000000..d1d73ac9c --- /dev/null +++ b/target/linux/rb532/patches-2.6.28/004-fix_pata_rb532_cf.patch @@ -0,0 +1,52 @@ +After applying the following changes I could verify functionality by +mounting a filesystem on the cfdisk and reading/writing files in it. + +The set_irq_type() function must be wrong, as there is no set_type() +function defined for the rb532 IRQ chip. But as the used IRQ actually is +being triggered by a GPIO, setting it's interrupt level should be the +right alternative. Also to clear a GPIO triggered IRQ, the source has to +be cleared. This is being done at the end of rb532_pata_irq_handler. + +Signed-off-by: Phil Sutter <n0-1@freewrt.org> +Acked-by: Florian Fainelli <florian@openwrt.org> +--- +diff -urN linux-2.6.28.7/drivers/ata/pata_rb532_cf.c linux-2.6.28.7.new/drivers/ata/pata_rb532_cf.c +--- linux-2.6.28.7/drivers/ata/pata_rb532_cf.c 2009-02-20 23:41:27.000000000 +0100 ++++ linux-2.6.28.7.new/drivers/ata/pata_rb532_cf.c 2009-03-15 13:21:06.000000000 +0100 +@@ -31,6 +31,7 @@ + #include <scsi/scsi_host.h> + + #include <asm/gpio.h> ++#include <asm/mach-rc32434/gpio.h> + + #define DRV_NAME "pata-rb532-cf" + #define DRV_VERSION "0.1.0" +@@ -63,8 +64,8 @@ + ata_sff_sync might be sufficient. */ + ata_sff_dma_pause(ap); + ndelay(RB500_CF_IO_DELAY); +- +- set_irq_type(info->irq, IRQ_TYPE_LEVEL_HIGH); ++ ++ rb532_gpio_set_ilevel(1, info->gpio_line); + } + + static void rb532_pata_exec_command(struct ata_port *ap, +@@ -113,13 +114,15 @@ + struct rb532_cf_info *info = ah->private_data; + + if (gpio_get_value(info->gpio_line)) { +- set_irq_type(info->irq, IRQ_TYPE_LEVEL_LOW); ++ rb532_gpio_set_ilevel(0, info->gpio_line); + if (!info->frozen) + ata_sff_interrupt(info->irq, dev_instance); + } else { +- set_irq_type(info->irq, IRQ_TYPE_LEVEL_HIGH); ++ rb532_gpio_set_ilevel(1, info->gpio_line); + } + ++ rb532_gpio_set_istat(0, info->gpio_line); ++ + return IRQ_HANDLED; + } + |