From: David Brownell <[EMAIL PROTECTED]>
Date: Sat, 1 Jul 2006 13:39:55 -0700
Subject: [PATCH] pcmcia: at91_cf update

More correct AT91 CF wakeup logic ... only enable/disable the IRQ wakeup
capability, not the IRQ itself.  That way the we know that the IRQ will be
disabled correctly, in suspend/resume logic instead of ARM IRQ code.

Most of the pin multiplexing setup has moved to the devices.c setup code.

Signed-off-by: David Brownell <[EMAIL PROTECTED]>
Signed-off-by: Andrew Victor <[EMAIL PROTECTED]>
Signed-off-by: Dominik Brodowski <[EMAIL PROTECTED]>
---
 drivers/pcmcia/at91_cf.c |   25 +++++++------------------
 1 files changed, 7 insertions(+), 18 deletions(-)

diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c
index 7f5df9a..f8db6e3 100644
--- a/drivers/pcmcia/at91_cf.c
+++ b/drivers/pcmcia/at91_cf.c
@@ -241,12 +241,6 @@ static int __init at91_cf_probe(struct p
        csa = at91_sys_read(AT91_EBI_CSA);
        at91_sys_write(AT91_EBI_CSA, csa | AT91_EBI_CS4A_SMC_COMPACTFLASH);
 
-       /* force poweron defaults for these pins ... */
-       (void) at91_set_A_periph(AT91_PIN_PC9, 0);      /* A25/CFRNW */
-       (void) at91_set_A_periph(AT91_PIN_PC10, 0);     /* NCS4/CFCS */
-       (void) at91_set_A_periph(AT91_PIN_PC11, 0);     /* NCS5/CFCE1 */
-       (void) at91_set_A_periph(AT91_PIN_PC12, 0);     /* NCS6/CFCE2 */
-
        /* nWAIT is _not_ a default setting */
        (void) at91_set_A_periph(AT91_PIN_PC6, 1);      /*  nWAIT */
 
@@ -322,6 +316,7 @@ fail1:
        if (board->irq_pin)
                free_irq(board->irq_pin, cf);
 fail0a:
+       device_init_wakeup(&pdev->dev, 0);
        free_irq(board->det_pin, cf);
        device_init_wakeup(&pdev->dev, 0);
 fail0:
@@ -360,26 +355,20 @@ static int at91_cf_suspend(struct platfo
        struct at91_cf_data     *board = cf->board;
 
        pcmcia_socket_dev_suspend(&pdev->dev, mesg);
-       if (device_may_wakeup(&pdev->dev))
+       if (device_may_wakeup(&pdev->dev)) {
                enable_irq_wake(board->det_pin);
-       else {
+               if (board->irq_pin)
+                       enable_irq_wake(board->irq_pin);
+       } else {
                disable_irq_wake(board->det_pin);
-               disable_irq(board->det_pin);
+               if (board->irq_pin)
+                       disable_irq_wake(board->irq_pin);
        }
-       if (board->irq_pin)
-               disable_irq(board->irq_pin);
        return 0;
 }
 
 static int at91_cf_resume(struct platform_device *pdev)
 {
-       struct at91_cf_socket   *cf = platform_get_drvdata(pdev);
-       struct at91_cf_data     *board = cf->board;
-
-       if (board->irq_pin)
-               enable_irq(board->irq_pin);
-       if (!device_may_wakeup(&pdev->dev))
-               enable_irq(board->det_pin);
        pcmcia_socket_dev_resume(&pdev->dev);
        return 0;
 }
-- 
1.4.3


_______________________________________________
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia

Reply via email to