Ignore:
Timestamp:
2011-11-17T23:31:27+01:00 (5 years ago)
Author:
mb
Message:

omap24xx: Fix cbus nested IRQ acking

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/omap24xx/patches-3.1/252-cbus-retu-tahvo-ack-fix.patch

    r29233 r29237  
    11Index: linux-3.1.1/drivers/cbus/retu.c 
    22=================================================================== 
    3 --- linux-3.1.1.orig/drivers/cbus/retu.c        2011-11-17 18:47:59.453004678 +0100 
    4 +++ linux-3.1.1/drivers/cbus/retu.c     2011-11-17 18:49:03.180787673 +0100 
    5 @@ -54,8 +54,6 @@ struct retu { 
     3--- linux-3.1.1.orig/drivers/cbus/retu.c        2011-11-17 23:23:53.542699149 +0100 
     4+++ linux-3.1.1/drivers/cbus/retu.c     2011-11-17 23:23:55.830689859 +0100 
     5@@ -53,9 +53,6 @@ struct retu { 
     6  
    67        int                     irq; 
    78  
    8         int                     ack; 
     9-       int                     ack; 
    910-       bool                    ack_pending; 
    1011- 
     
    1213        bool                    mask_pending; 
    1314  
    14 @@ -238,7 +236,6 @@ static void retu_irq_ack(struct irq_data 
    15         int                     irq = data->irq; 
     15@@ -191,9 +188,10 @@ static irqreturn_t retu_irq_handler(int 
     16        mutex_lock(&retu->mutex); 
     17        idr = __retu_read_reg(retu, RETU_REG_IDR); 
     18        imr = __retu_read_reg(retu, RETU_REG_IMR); 
     19+       idr &= ~imr; 
     20+       __retu_write_reg(retu, RETU_REG_IDR, idr); 
     21        mutex_unlock(&retu->mutex); 
    1622  
    17         retu->ack |= (1 << (irq - retu->irq_base)); 
    18 -       retu->ack_pending = true; 
     23-       idr &= ~imr; 
     24        if (!idr) { 
     25                dev_vdbg(retu->dev, "No IRQ, spurious?\n"); 
     26                return IRQ_NONE; 
     27@@ -232,15 +230,6 @@ static void retu_irq_unmask(struct irq_d 
     28  
    1929 } 
    2030  
     31-static void retu_irq_ack(struct irq_data *data) 
     32-{ 
     33-       struct retu             *retu = irq_data_get_irq_chip_data(data); 
     34-       int                     irq = data->irq; 
     35- 
     36-       retu->ack |= (1 << (irq - retu->irq_base)); 
     37-       retu->ack_pending = true; 
     38-} 
     39- 
    2140 static void retu_bus_lock(struct irq_data *data) 
    22 @@ -257,9 +254,9 @@ static void retu_bus_sync_unlock(struct 
     41 { 
     42        struct retu             *retu = irq_data_get_irq_chip_data(data); 
     43@@ -257,11 +246,6 @@ static void retu_bus_sync_unlock(struct 
    2344                retu->mask_pending = false; 
    2445        } 
    2546  
    2647-       if (retu->ack_pending) { 
    27 +       if (retu->ack) { 
    28                 __retu_write_reg(retu, RETU_REG_IDR, retu->ack); 
     48-               __retu_write_reg(retu, RETU_REG_IDR, retu->ack); 
    2949-               retu->ack_pending = false; 
    30 +               retu->ack = 0; 
     50-       } 
     51- 
     52        mutex_unlock(&retu->mutex); 
     53 } 
     54  
     55@@ -271,7 +255,6 @@ static struct irq_chip retu_irq_chip = { 
     56        .irq_bus_sync_unlock    = retu_bus_sync_unlock, 
     57        .irq_mask               = retu_irq_mask, 
     58        .irq_unmask             = retu_irq_unmask, 
     59-       .irq_ack                = retu_irq_ack, 
     60 }; 
     61  
     62 static inline void retu_irq_setup(int irq) 
     63@@ -291,8 +274,7 @@ static void retu_irq_init(struct retu *r 
     64  
     65        for (irq = base; irq < end; irq++) { 
     66                irq_set_chip_data(irq, retu); 
     67-               irq_set_chip_and_handler(irq, &retu_irq_chip, 
     68-                               handle_simple_irq); 
     69+               irq_set_chip(irq, &retu_irq_chip); 
     70                irq_set_nested_thread(irq, 1); 
     71                retu_irq_setup(irq); 
    3172        } 
    32   
    33         mutex_unlock(&retu->mutex); 
    3473Index: linux-3.1.1/drivers/cbus/tahvo.c 
    3574=================================================================== 
    36 --- linux-3.1.1.orig/drivers/cbus/tahvo.c       2011-11-17 18:47:59.437004733 +0100 
    37 +++ linux-3.1.1/drivers/cbus/tahvo.c    2011-11-17 18:51:03.708374259 +0100 
    38 @@ -52,7 +52,6 @@ struct tahvo { 
     75--- linux-3.1.1.orig/drivers/cbus/tahvo.c       2011-11-17 23:23:54.358695836 +0100 
     76+++ linux-3.1.1/drivers/cbus/tahvo.c    2011-11-17 23:23:55.830689859 +0100 
     77@@ -48,11 +48,9 @@ struct tahvo { 
     78        int             irq_end; 
     79        int             irq; 
     80  
     81-       int             ack; 
    3982        int             mask; 
    4083  
     
    4487 }; 
    4588  
    46 @@ -177,9 +176,9 @@ static void tahvo_irq_bus_sync_unlock(st 
     89@@ -138,9 +136,12 @@ static irqreturn_t tahvo_irq_handler(int 
     90        u16                     id; 
     91        u16                     im; 
     92  
     93+       mutex_lock(&tahvo->mutex); 
     94        id = __tahvo_read_reg(tahvo, TAHVO_REG_IDR); 
     95        im = __tahvo_read_reg(tahvo, TAHVO_REG_IMR); 
     96        id &= ~im; 
     97+       __tahvo_write_reg(tahvo, TAHVO_REG_IDR, id); 
     98+       mutex_unlock(&tahvo->mutex); 
     99  
     100        if (!id) { 
     101                dev_vdbg(tahvo->dev, "No IRQ, spurious ?\n"); 
     102@@ -177,11 +178,6 @@ static void tahvo_irq_bus_sync_unlock(st 
    47103                tahvo->mask_pending = false; 
    48104        } 
    49105  
    50106-       if (tahvo->ack_pending) { 
    51 +       if (tahvo->ack) { 
    52                 __tahvo_write_reg(tahvo, TAHVO_REG_IDR, tahvo->ack); 
     107-               __tahvo_write_reg(tahvo, TAHVO_REG_IDR, tahvo->ack); 
    53108-               tahvo->ack_pending = false; 
    54 +               tahvo->ack = 0; 
    55         } 
    56   
     109-       } 
     110- 
    57111        mutex_unlock(&tahvo->mutex); 
    58 @@ -209,7 +208,6 @@ static void tahvo_irq_ack(struct irq_dat 
    59         int                     irq = data->irq; 
    60   
    61         tahvo->ack |= (1 << (irq - tahvo->irq_base)); 
    62 -       tahvo->ack_pending = true; 
    63112 } 
    64113  
     114@@ -203,22 +199,12 @@ static void tahvo_irq_unmask(struct irq_ 
     115        tahvo->mask_pending = true; 
     116 } 
     117  
     118-static void tahvo_irq_ack(struct irq_data *data) 
     119-{ 
     120-       struct tahvo            *tahvo = irq_data_get_irq_chip_data(data); 
     121-       int                     irq = data->irq; 
     122- 
     123-       tahvo->ack |= (1 << (irq - tahvo->irq_base)); 
     124-       tahvo->ack_pending = true; 
     125-} 
     126- 
    65127 static struct irq_chip tahvo_irq_chip = { 
     128        .name                   = "tahvo", 
     129        .irq_bus_lock           = tahvo_irq_bus_lock, 
     130        .irq_bus_sync_unlock    = tahvo_irq_bus_sync_unlock, 
     131        .irq_mask               = tahvo_irq_mask, 
     132        .irq_unmask             = tahvo_irq_unmask, 
     133-       .irq_ack                = tahvo_irq_ack, 
     134 }; 
     135  
     136 static inline void tahvo_irq_setup(int irq) 
     137@@ -238,8 +224,7 @@ static void tahvo_irq_init(struct tahvo 
     138  
     139        for (irq = base; irq < end; irq++) { 
     140                irq_set_chip_data(irq, tahvo); 
     141-               irq_set_chip_and_handler(irq, &tahvo_irq_chip, 
     142-                               handle_simple_irq); 
     143+               irq_set_chip(irq, &tahvo_irq_chip); 
     144                irq_set_nested_thread(irq, 1); 
     145                tahvo_irq_setup(irq); 
     146        } 
Note: See TracChangeset for help on using the changeset viewer.