File tree Expand file tree Collapse file tree 3 files changed +28
-13
lines changed
drivers/video/rockchip/rga3 Expand file tree Collapse file tree 3 files changed +28
-13
lines changed Original file line number Diff line number Diff line change @@ -3124,6 +3124,13 @@ static int rga2_irq(struct rga_scheduler_t *scheduler)
3124
3124
{
3125
3125
struct rga_job * job = scheduler -> running_job ;
3126
3126
3127
+ /*clear INTR */
3128
+ rga_write (rga_read (RGA2_INT , scheduler ) |
3129
+ (m_RGA2_INT_ERROR_CLEAR_MASK |
3130
+ m_RGA2_INT_ALL_CMD_DONE_INT_CLEAR | m_RGA2_INT_NOW_CMD_DONE_INT_CLEAR |
3131
+ m_RGA2_INT_LINE_RD_CLEAR | m_RGA2_INT_LINE_WR_CLEAR ),
3132
+ RGA2_INT , scheduler );
3133
+
3127
3134
/* The hardware interrupt top-half don't need to lock the scheduler. */
3128
3135
if (job == NULL )
3129
3136
return IRQ_HANDLED ;
@@ -3151,13 +3158,6 @@ static int rga2_irq(struct rga_scheduler_t *scheduler)
3151
3158
scheduler -> ops -> soft_reset (scheduler );
3152
3159
}
3153
3160
3154
- /*clear INTR */
3155
- rga_write (rga_read (RGA2_INT , scheduler ) |
3156
- (m_RGA2_INT_ERROR_CLEAR_MASK |
3157
- m_RGA2_INT_ALL_CMD_DONE_INT_CLEAR | m_RGA2_INT_NOW_CMD_DONE_INT_CLEAR |
3158
- m_RGA2_INT_LINE_RD_CLEAR | m_RGA2_INT_LINE_WR_CLEAR ),
3159
- RGA2_INT , scheduler );
3160
-
3161
3161
return IRQ_WAKE_THREAD ;
3162
3162
}
3163
3163
Original file line number Diff line number Diff line change @@ -2155,6 +2155,10 @@ static int rga3_irq(struct rga_scheduler_t *scheduler)
2155
2155
{
2156
2156
struct rga_job * job = scheduler -> running_job ;
2157
2157
2158
+ /*clear INTR */
2159
+ rga_write (m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH | m_RGA3_INT_ERROR_MASK ,
2160
+ RGA3_INT_CLR , scheduler );
2161
+
2158
2162
if (job == NULL )
2159
2163
return IRQ_HANDLED ;
2160
2164
@@ -2179,10 +2183,6 @@ static int rga3_irq(struct rga_scheduler_t *scheduler)
2179
2183
scheduler -> ops -> soft_reset (scheduler );
2180
2184
}
2181
2185
2182
- /*clear INTR */
2183
- rga_write (m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH | m_RGA3_INT_ERROR_MASK ,
2184
- RGA3_INT_CLR , scheduler );
2185
-
2186
2186
return IRQ_WAKE_THREAD ;
2187
2187
}
2188
2188
Original file line number Diff line number Diff line change @@ -1123,11 +1123,26 @@ static irqreturn_t rga_irq_handler(int irq, void *data)
1123
1123
{
1124
1124
irqreturn_t irq_ret = IRQ_NONE ;
1125
1125
struct rga_scheduler_t * scheduler = data ;
1126
+ ktime_t timestamp = ktime_get ();
1126
1127
1127
- scheduler -> running_job -> timestamp . hw_done = ktime_get ( );
1128
+ spin_lock ( & scheduler -> irq_lock );
1128
1129
1129
- if (scheduler -> ops -> irq )
1130
+ if (scheduler -> ops -> irq ) {
1130
1131
irq_ret = scheduler -> ops -> irq (scheduler );
1132
+ if (irq_ret == IRQ_HANDLED ) {
1133
+ spin_unlock (& scheduler -> irq_lock );
1134
+ return irq_ret ;
1135
+ }
1136
+ }
1137
+
1138
+ if (scheduler -> running_job == NULL ) {
1139
+ spin_unlock (& scheduler -> irq_lock );
1140
+ return IRQ_HANDLED ;
1141
+ }
1142
+
1143
+ scheduler -> running_job -> timestamp .hw_done = timestamp ;
1144
+
1145
+ spin_unlock (& scheduler -> irq_lock );
1131
1146
1132
1147
return irq_ret ;
1133
1148
}
You can’t perform that action at this time.
0 commit comments