Fixed dspbridge
[kernel-power] / kernel-power-2.6.28 / debian / patches / dspbridge_omap3.diff
1 diff -urN kernel-power-2.6.28/arch/arm/plat-omap/mailbox.c kernel-power-2.6.28.new/arch/arm/plat-omap/mailbox.c
2 --- kernel-power-2.6.28/arch/arm/plat-omap/mailbox.c    2011-10-03 21:46:25.000000000 +0100
3 +++ kernel-power-2.6.28.new/arch/arm/plat-omap/mailbox.c        2011-10-03 20:15:03.000000000 +0100
4 @@ -34,7 +34,7 @@
5  
6  static struct omap_mbox *mboxes;
7  static DEFINE_RWLOCK(mboxes_lock);
8 -
9 +static bool rq_full;
10  /*
11   * Mailbox sequence bit API
12   */
13 @@ -219,6 +219,10 @@
14         while (1) {
15                 spin_lock_irqsave(q->queue_lock, flags);
16                 rq = elv_next_request(q);
17 +               if (rq_full) {
18 +                       omap_mbox_enable_irq(mbox, IRQ_RX);
19 +                       rq_full = false;
20 +               }
21                 spin_unlock_irqrestore(q->queue_lock, flags);
22                 if (!rq)
23                         break;
24 @@ -227,8 +231,8 @@
25  
26                 if (blk_end_request(rq, 0, 0))
27                         BUG();
28 -
29 -               mbox->rxq->callback((void *)msg);
30 +               if(mbox->rxq->callback)
31 +                   mbox->rxq->callback((void *)msg);
32         }
33  }
34  
35 @@ -260,8 +264,11 @@
36  
37         while (!mbox_fifo_empty(mbox)) {
38                 rq = blk_get_request(q, WRITE, GFP_ATOMIC);
39 -               if (unlikely(!rq))
40 +               if (unlikely(!rq)){
41 +                       omap_mbox_disable_irq(mbox, IRQ_RX);
42 +                       rq_full = true;
43                         goto nomem;
44 +               }
45  
46                 msg = mbox_fifo_read(mbox);
47                 rq->data = (void *)msg;
48 @@ -446,11 +453,12 @@
49  
50  static void omap_mbox_fini(struct omap_mbox *mbox)
51  {
52 +       free_irq(mbox->irq, mbox);
53 +       tasklet_kill(&mbox->txq->tasklet);
54 +       flush_work(&mbox->rxq->work);
55         mbox_queue_free(mbox->txq);
56         mbox_queue_free(mbox->rxq);
57  
58 -       free_irq(mbox->irq, mbox);
59 -
60         if (unlikely(mbox->ops->shutdown))
61                 mbox->ops->shutdown(mbox);
62  }
63 diff -urN kernel-power-2.6.28/drivers/dsp/bridge/rmgr/drv.c kernel-power-2.6.28.new/drivers/dsp/bridge/rmgr/drv.c
64 --- kernel-power-2.6.28/drivers/dsp/bridge/rmgr/drv.c   2011-10-03 21:46:33.000000000 +0100
65 +++ kernel-power-2.6.28.new/drivers/dsp/bridge/rmgr/drv.c       2011-10-03 21:30:40.000000000 +0100
66 @@ -77,7 +77,6 @@
67  /* GPP PROCESS CLEANUP CODE */
68  
69  static DSP_STATUS DRV_ProcFreeNodeRes(HANDLE hPCtxt);
70 -static DSP_STATUS  DRV_ProcFreeSTRMRes(HANDLE hPCtxt);
71  extern enum NODE_STATE NODE_GetState(HANDLE hNode);
72  
73  /* Allocate and add a node resource element
74 @@ -290,7 +289,7 @@
75                 pDMMList = pDMMList->next;
76                 if (pDMMRes->dmmAllocated) {
77                         status = PROC_UnMap(pDMMRes->hProcessor,
78 -                                (void *)pDMMRes->ulDSPResAddr, pCtxt);
79 +                                (void *)pDMMRes->ulDSPAddr, pCtxt);
80                         if (DSP_FAILED(status))
81                                 pr_debug("%s: PROC_UnMap failed! status ="
82                                                 " 0x%xn", __func__, status);
83 @@ -489,60 +488,45 @@
84         return status;
85  }
86  
87 -/* Actual Stream De-Allocation */
88 -static DSP_STATUS  DRV_ProcFreeSTRMRes(HANDLE hPCtxt)
89 -{
90 +/* Release all Stream resources and its context
91 +* This is called from .bridge_release.
92 +*/
93 +DSP_STATUS DRV_RemoveAllSTRMResElements(HANDLE hPCtxt){
94         struct PROCESS_CONTEXT *pCtxt = (struct PROCESS_CONTEXT *)hPCtxt;
95         DSP_STATUS status = DSP_SOK;
96 -       u8 **apBuffer = NULL;
97 -       struct STRM_RES_OBJECT *pSTRMRes = NULL;
98 +       struct STRM_RES_OBJECT *strm_res = NULL;
99 +       struct STRM_RES_OBJECT *strm_tmp = NULL;        
100         struct STRM_INFO strm_info;
101         struct DSP_STREAMINFO user;
102 +       u8 **apBuffer = NULL;
103         u8 *pBufPtr;
104         u32 ulBytes;
105         u32 dwArg;
106         s32 ulBufSize;
107  
108 -       pSTRMRes = pCtxt->pSTRMList;
109 -       while (pSTRMRes) {
110 -               if (pSTRMRes->uNumBufs) {
111 -                       apBuffer = MEM_Alloc(pSTRMRes->uNumBufs *
112 -                                           sizeof(u8 *), MEM_NONPAGED);
113 -                       if (!apBuffer)
114 -                               return DSP_EMEMORY;
115 -                       status = STRM_FreeBuffer(pSTRMRes->hStream, apBuffer,
116 -                                               pSTRMRes->uNumBufs, pCtxt);
117 -                       MEM_Free(apBuffer);
118 +       strm_tmp = pCtxt->pSTRMList;
119 +       while (strm_tmp) {
120 +               strm_res = strm_tmp;
121 +               strm_tmp = strm_tmp->next;
122 +               if (strm_res->uNumBufs) {
123 +                       apBuffer = MEM_Alloc((strm_res->uNumBufs *
124 +                                               sizeof(u8 *)), MEM_NONPAGED);
125 +                       status = STRM_FreeBuffer(strm_res->hStream, apBuffer,
126 +                                               strm_res->uNumBufs, pCtxt);
127 +                       if (apBuffer) {
128 +                               status = STRM_FreeBuffer(strm_res->hStream,
129 +                                       apBuffer, strm_res->uNumBufs, pCtxt);
130 +                               MEM_Free(apBuffer);
131 +                       }
132                 }
133                 strm_info.pUser = &user;
134                 user.uNumberBufsInStream = 0;
135 -               STRM_GetInfo(pSTRMRes->hStream, &strm_info, sizeof(strm_info));
136 -               while (strm_info.pUser->uNumberBufsInStream--)
137 -                       STRM_Reclaim(pSTRMRes->hStream, &pBufPtr, &ulBytes,
138 -                                            (u32 *)&ulBufSize, &dwArg);
139 -
140 -       }
141 -       return status;
142 -}
143 -
144 -/* Release all Stream resources and its context
145 -* This is called from .bridge_release.
146 -*/
147 -DSP_STATUS     DRV_RemoveAllSTRMResElements(HANDLE hPCtxt)
148 -{
149 -       struct PROCESS_CONTEXT *pCtxt = (struct PROCESS_CONTEXT *)hPCtxt;
150 -       DSP_STATUS status = DSP_SOK;
151 -       struct STRM_RES_OBJECT *pTempSTRMRes2 = NULL;
152 -       struct STRM_RES_OBJECT *pTempSTRMRes = NULL;
153 -
154 -       DRV_ProcFreeSTRMRes(pCtxt);
155 -       pTempSTRMRes = pCtxt->pSTRMList;
156 -       while (pTempSTRMRes != NULL) {
157 -               pTempSTRMRes2 = pTempSTRMRes;
158 -               pTempSTRMRes = pTempSTRMRes->next;
159 -               MEM_Free(pTempSTRMRes2);
160 +               STRM_GetInfo(strm_res->hStream, &strm_info, sizeof(strm_info));
161 +               while (user.uNumberBufsInStream--)
162 +                       STRM_Reclaim(strm_res->hStream, &pBufPtr, &ulBytes,
163 +                                           (u32 *)&ulBufSize, &dwArg);
164 +               status = STRM_Close(strm_res->hStream, pCtxt);
165         }
166 -       pCtxt->pSTRMList = NULL;
167         return status;
168  }
169  
170 diff -urN kernel-power-2.6.28/drivers/dsp/bridge/rmgr/node.c kernel-power-2.6.28.new/drivers/dsp/bridge/rmgr/node.c
171 --- kernel-power-2.6.28/drivers/dsp/bridge/rmgr/node.c  2011-10-03 21:46:33.000000000 +0100
172 +++ kernel-power-2.6.28.new/drivers/dsp/bridge/rmgr/node.c      2011-10-03 20:17:41.000000000 +0100
173 @@ -3170,7 +3170,7 @@
174                  pNodeId, pNodeProps);
175  
176         status = PROC_GetDevObject(hProcessor, &hDevObject);
177 -       if (hDevObject != NULL)
178 +       if (hDevObject)
179                 status = DEV_GetNodeManager(hDevObject, &hNodeMgr);
180  
181         if (hNodeMgr == NULL) {
182 diff -urN kernel-power-2.6.28/drivers/dsp/bridge/rmgr/proc.c kernel-power-2.6.28.new/drivers/dsp/bridge/rmgr/proc.c
183 --- kernel-power-2.6.28/drivers/dsp/bridge/rmgr/proc.c  2011-10-03 21:46:33.000000000 +0100
184 +++ kernel-power-2.6.28.new/drivers/dsp/bridge/rmgr/proc.c      2011-10-03 20:21:33.000000000 +0100
185 @@ -351,13 +351,11 @@
186                 status = DEV_GetWMDContext(hDevObject,
187                                         &pProcObject->hWmdContext);
188                 if (DSP_FAILED(status)) {
189 -                       MEM_FreeObject(hProcObject);
190                         GT_0trace(PROC_DebugMask, GT_7CLASS,
191                                  "PROC_AutoStart: Failed "
192                                  "to get WMD Context \n");
193                 }
194         } else {
195 -               MEM_FreeObject(hProcObject);
196                 GT_0trace(PROC_DebugMask, GT_7CLASS,
197                          "PROC_AutoStart: Failed to "
198                          "get IntFxns \n");
199 @@ -408,6 +406,8 @@
200                 GT_0trace(PROC_DebugMask, GT_7CLASS, "PROC_AutoStart: "
201                          "No Exec file found \n");
202         }
203 +       MEM_Free(hProcObject->g_pszLastCoff);
204 +       hProcObject->g_pszLastCoff = NULL;
205  func_cont:
206         MEM_FreeObject(hProcObject);
207  func_end: