@@ -25,15 +25,12 @@ static DEFINE_MUTEX(con_mutex);
25
25
static int add_to_rbuf (struct mbox_chan * chan , void * mssg )
26
26
{
27
27
int idx ;
28
- unsigned long flags ;
29
28
30
- spin_lock_irqsave ( & chan -> lock , flags );
29
+ guard ( spinlock_irqsave )( & chan -> lock );
31
30
32
31
/* See if there is any space left */
33
- if (chan -> msg_count == MBOX_TX_QUEUE_LEN ) {
34
- spin_unlock_irqrestore (& chan -> lock , flags );
32
+ if (chan -> msg_count == MBOX_TX_QUEUE_LEN )
35
33
return - ENOBUFS ;
36
- }
37
34
38
35
idx = chan -> msg_free ;
39
36
chan -> msg_data [idx ] = mssg ;
@@ -44,60 +41,53 @@ static int add_to_rbuf(struct mbox_chan *chan, void *mssg)
44
41
else
45
42
chan -> msg_free ++ ;
46
43
47
- spin_unlock_irqrestore (& chan -> lock , flags );
48
-
49
44
return idx ;
50
45
}
51
46
52
47
static void msg_submit (struct mbox_chan * chan )
53
48
{
54
49
unsigned count , idx ;
55
- unsigned long flags ;
56
50
void * data ;
57
51
int err = - EBUSY ;
58
52
59
- spin_lock_irqsave (& chan -> lock , flags );
53
+ scoped_guard (spinlock_irqsave , & chan -> lock ) {
54
+ if (!chan -> msg_count || chan -> active_req )
55
+ break ;
60
56
61
- if (!chan -> msg_count || chan -> active_req )
62
- goto exit ;
63
-
64
- count = chan -> msg_count ;
65
- idx = chan -> msg_free ;
66
- if (idx >= count )
67
- idx -= count ;
68
- else
69
- idx += MBOX_TX_QUEUE_LEN - count ;
57
+ count = chan -> msg_count ;
58
+ idx = chan -> msg_free ;
59
+ if (idx >= count )
60
+ idx -= count ;
61
+ else
62
+ idx += MBOX_TX_QUEUE_LEN - count ;
70
63
71
- data = chan -> msg_data [idx ];
64
+ data = chan -> msg_data [idx ];
72
65
73
- if (chan -> cl -> tx_prepare )
74
- chan -> cl -> tx_prepare (chan -> cl , data );
75
- /* Try to submit a message to the MBOX controller */
76
- err = chan -> mbox -> ops -> send_data (chan , data );
77
- if (!err ) {
78
- chan -> active_req = data ;
79
- chan -> msg_count -- ;
66
+ if (chan -> cl -> tx_prepare )
67
+ chan -> cl -> tx_prepare (chan -> cl , data );
68
+ /* Try to submit a message to the MBOX controller */
69
+ err = chan -> mbox -> ops -> send_data (chan , data );
70
+ if (!err ) {
71
+ chan -> active_req = data ;
72
+ chan -> msg_count -- ;
73
+ }
80
74
}
81
- exit :
82
- spin_unlock_irqrestore (& chan -> lock , flags );
83
75
84
76
if (!err && (chan -> txdone_method & TXDONE_BY_POLL )) {
85
77
/* kick start the timer immediately to avoid delays */
86
- spin_lock_irqsave (& chan -> mbox -> poll_hrt_lock , flags );
87
- hrtimer_start (& chan -> mbox -> poll_hrt , 0 , HRTIMER_MODE_REL );
88
- spin_unlock_irqrestore (& chan -> mbox -> poll_hrt_lock , flags );
78
+ scoped_guard (spinlock_irqsave , & chan -> mbox -> poll_hrt_lock )
79
+ hrtimer_start (& chan -> mbox -> poll_hrt , 0 , HRTIMER_MODE_REL );
89
80
}
90
81
}
91
82
92
83
static void tx_tick (struct mbox_chan * chan , int r )
93
84
{
94
- unsigned long flags ;
95
85
void * mssg ;
96
86
97
- spin_lock_irqsave ( & chan -> lock , flags );
98
- mssg = chan -> active_req ;
99
- chan -> active_req = NULL ;
100
- spin_unlock_irqrestore ( & chan -> lock , flags );
87
+ scoped_guard ( spinlock_irqsave , & chan -> lock ) {
88
+ mssg = chan -> active_req ;
89
+ chan -> active_req = NULL ;
90
+ }
101
91
102
92
/* Submit next message */
103
93
msg_submit (chan );
@@ -119,7 +109,6 @@ static enum hrtimer_restart txdone_hrtimer(struct hrtimer *hrtimer)
119
109
container_of (hrtimer , struct mbox_controller , poll_hrt );
120
110
bool txdone , resched = false;
121
111
int i ;
122
- unsigned long flags ;
123
112
124
113
for (i = 0 ; i < mbox -> num_chans ; i ++ ) {
125
114
struct mbox_chan * chan = & mbox -> chans [i ];
@@ -134,10 +123,10 @@ static enum hrtimer_restart txdone_hrtimer(struct hrtimer *hrtimer)
134
123
}
135
124
136
125
if (resched ) {
137
- spin_lock_irqsave ( & mbox -> poll_hrt_lock , flags );
138
- if (!hrtimer_is_queued (hrtimer ))
139
- hrtimer_forward_now (hrtimer , ms_to_ktime (mbox -> txpoll_period ));
140
- spin_unlock_irqrestore ( & mbox -> poll_hrt_lock , flags );
126
+ scoped_guard ( spinlock_irqsave , & mbox -> poll_hrt_lock ) {
127
+ if (!hrtimer_is_queued (hrtimer ))
128
+ hrtimer_forward_now (hrtimer , ms_to_ktime (mbox -> txpoll_period ));
129
+ }
141
130
142
131
return HRTIMER_RESTART ;
143
132
}
@@ -319,25 +308,23 @@ EXPORT_SYMBOL_GPL(mbox_flush);
319
308
static int __mbox_bind_client (struct mbox_chan * chan , struct mbox_client * cl )
320
309
{
321
310
struct device * dev = cl -> dev ;
322
- unsigned long flags ;
323
311
int ret ;
324
312
325
313
if (chan -> cl || !try_module_get (chan -> mbox -> dev -> driver -> owner )) {
326
314
dev_err (dev , "%s: mailbox not free\n" , __func__ );
327
315
return - EBUSY ;
328
316
}
329
317
330
- spin_lock_irqsave (& chan -> lock , flags );
331
- chan -> msg_free = 0 ;
332
- chan -> msg_count = 0 ;
333
- chan -> active_req = NULL ;
334
- chan -> cl = cl ;
335
- init_completion (& chan -> tx_complete );
336
-
337
- if (chan -> txdone_method == TXDONE_BY_POLL && cl -> knows_txdone )
338
- chan -> txdone_method = TXDONE_BY_ACK ;
318
+ scoped_guard (spinlock_irqsave , & chan -> lock ) {
319
+ chan -> msg_free = 0 ;
320
+ chan -> msg_count = 0 ;
321
+ chan -> active_req = NULL ;
322
+ chan -> cl = cl ;
323
+ init_completion (& chan -> tx_complete );
339
324
340
- spin_unlock_irqrestore (& chan -> lock , flags );
325
+ if (chan -> txdone_method == TXDONE_BY_POLL && cl -> knows_txdone )
326
+ chan -> txdone_method = TXDONE_BY_ACK ;
327
+ }
341
328
342
329
if (chan -> mbox -> ops -> startup ) {
343
330
ret = chan -> mbox -> ops -> startup (chan );
@@ -465,22 +452,20 @@ EXPORT_SYMBOL_GPL(mbox_request_channel_byname);
465
452
*/
466
453
void mbox_free_channel (struct mbox_chan * chan )
467
454
{
468
- unsigned long flags ;
469
-
470
455
if (!chan || !chan -> cl )
471
456
return ;
472
457
473
458
if (chan -> mbox -> ops -> shutdown )
474
459
chan -> mbox -> ops -> shutdown (chan );
475
460
476
461
/* The queued TX requests are simply aborted, no callbacks are made */
477
- spin_lock_irqsave (& chan -> lock , flags );
478
- chan -> cl = NULL ;
479
- chan -> active_req = NULL ;
480
- if (chan -> txdone_method == TXDONE_BY_ACK )
481
- chan -> txdone_method = TXDONE_BY_POLL ;
462
+ scoped_guard (spinlock_irqsave , & chan -> lock ) {
463
+ chan -> cl = NULL ;
464
+ chan -> active_req = NULL ;
465
+ if (chan -> txdone_method == TXDONE_BY_ACK )
466
+ chan -> txdone_method = TXDONE_BY_POLL ;
467
+ }
482
468
483
- spin_unlock_irqrestore (& chan -> lock , flags );
484
469
module_put (chan -> mbox -> dev -> driver -> owner );
485
470
}
486
471
EXPORT_SYMBOL_GPL (mbox_free_channel );
0 commit comments