Skip to content

Commit 02d0aba

Browse files
committed
ALSA: usb-audio: Use guard() for spin locks
Clean up the code using guard() for spin locks. Merely code refactoring, and no behavior change. Signed-off-by: Takashi Iwai <tiwai@suse.de>
1 parent d532322 commit 02d0aba

1 file changed

Lines changed: 95 additions & 103 deletions

File tree

sound/usb/pcm.c

Lines changed: 95 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -1528,115 +1528,108 @@ static int prepare_playback_urb(struct snd_usb_substream *subs,
15281528
int counts;
15291529
unsigned int transfer_done, frame_limit, avail = 0;
15301530
int i, stride, period_elapsed = 0;
1531-
unsigned long flags;
1532-
int err = 0;
15331531

15341532
stride = ep->stride;
15351533

15361534
frames = 0;
15371535
ctx->queued = 0;
15381536
urb->number_of_packets = 0;
15391537

1540-
spin_lock_irqsave(&subs->lock, flags);
1541-
frame_limit = subs->frame_limit + ep->max_urb_frames;
1542-
transfer_done = subs->transfer_done;
1538+
scoped_guard(spinlock_irqsave, &subs->lock) {
1539+
frame_limit = subs->frame_limit + ep->max_urb_frames;
1540+
transfer_done = subs->transfer_done;
15431541

1544-
if (subs->lowlatency_playback &&
1545-
runtime->state != SNDRV_PCM_STATE_DRAINING) {
1546-
unsigned int hwptr = subs->hwptr_done / stride;
1547-
1548-
/* calculate the byte offset-in-buffer of the appl_ptr */
1549-
avail = (runtime->control->appl_ptr - runtime->hw_ptr_base)
1550-
% runtime->buffer_size;
1551-
if (avail <= hwptr)
1552-
avail += runtime->buffer_size;
1553-
avail -= hwptr;
1554-
}
1542+
if (subs->lowlatency_playback &&
1543+
runtime->state != SNDRV_PCM_STATE_DRAINING) {
1544+
unsigned int hwptr = subs->hwptr_done / stride;
1545+
1546+
/* calculate the byte offset-in-buffer of the appl_ptr */
1547+
avail = (runtime->control->appl_ptr - runtime->hw_ptr_base)
1548+
% runtime->buffer_size;
1549+
if (avail <= hwptr)
1550+
avail += runtime->buffer_size;
1551+
avail -= hwptr;
1552+
}
15551553

1556-
for (i = 0; i < ctx->packets; i++) {
1557-
counts = snd_usb_endpoint_next_packet_size(ep, ctx, i, avail);
1558-
if (counts < 0)
1559-
break;
1560-
/* set up descriptor */
1561-
urb->iso_frame_desc[i].offset = frames * stride;
1562-
urb->iso_frame_desc[i].length = counts * stride;
1563-
frames += counts;
1564-
avail -= counts;
1565-
urb->number_of_packets++;
1566-
transfer_done += counts;
1567-
if (transfer_done >= runtime->period_size) {
1568-
transfer_done -= runtime->period_size;
1569-
frame_limit = 0;
1570-
period_elapsed = 1;
1571-
if (subs->fmt_type == UAC_FORMAT_TYPE_II) {
1572-
if (transfer_done > 0) {
1573-
/* FIXME: fill-max mode is not
1574-
* supported yet */
1575-
frames -= transfer_done;
1576-
counts -= transfer_done;
1577-
urb->iso_frame_desc[i].length =
1578-
counts * stride;
1579-
transfer_done = 0;
1580-
}
1581-
i++;
1582-
if (i < ctx->packets) {
1583-
/* add a transfer delimiter */
1584-
urb->iso_frame_desc[i].offset =
1585-
frames * stride;
1586-
urb->iso_frame_desc[i].length = 0;
1587-
urb->number_of_packets++;
1588-
}
1554+
for (i = 0; i < ctx->packets; i++) {
1555+
counts = snd_usb_endpoint_next_packet_size(ep, ctx, i, avail);
1556+
if (counts < 0)
15891557
break;
1558+
/* set up descriptor */
1559+
urb->iso_frame_desc[i].offset = frames * stride;
1560+
urb->iso_frame_desc[i].length = counts * stride;
1561+
frames += counts;
1562+
avail -= counts;
1563+
urb->number_of_packets++;
1564+
transfer_done += counts;
1565+
if (transfer_done >= runtime->period_size) {
1566+
transfer_done -= runtime->period_size;
1567+
frame_limit = 0;
1568+
period_elapsed = 1;
1569+
if (subs->fmt_type == UAC_FORMAT_TYPE_II) {
1570+
if (transfer_done > 0) {
1571+
/* FIXME: fill-max mode is not
1572+
* supported yet */
1573+
frames -= transfer_done;
1574+
counts -= transfer_done;
1575+
urb->iso_frame_desc[i].length =
1576+
counts * stride;
1577+
transfer_done = 0;
1578+
}
1579+
i++;
1580+
if (i < ctx->packets) {
1581+
/* add a transfer delimiter */
1582+
urb->iso_frame_desc[i].offset =
1583+
frames * stride;
1584+
urb->iso_frame_desc[i].length = 0;
1585+
urb->number_of_packets++;
1586+
}
1587+
break;
1588+
}
15901589
}
1590+
/* finish at the period boundary or after enough frames */
1591+
if ((period_elapsed || transfer_done >= frame_limit) &&
1592+
!snd_usb_endpoint_implicit_feedback_sink(ep))
1593+
break;
15911594
}
1592-
/* finish at the period boundary or after enough frames */
1593-
if ((period_elapsed || transfer_done >= frame_limit) &&
1594-
!snd_usb_endpoint_implicit_feedback_sink(ep))
1595-
break;
1596-
}
15971595

1598-
if (!frames) {
1599-
err = -EAGAIN;
1600-
goto unlock;
1601-
}
1602-
1603-
bytes = frames * stride;
1604-
subs->transfer_done = transfer_done;
1605-
subs->frame_limit = frame_limit;
1606-
if (unlikely(ep->cur_format == SNDRV_PCM_FORMAT_DSD_U16_LE &&
1607-
subs->cur_audiofmt->dsd_dop)) {
1608-
fill_playback_urb_dsd_dop(subs, urb, bytes);
1609-
} else if (unlikely(ep->cur_format == SNDRV_PCM_FORMAT_DSD_U8 &&
1610-
subs->cur_audiofmt->dsd_bitrev)) {
1611-
fill_playback_urb_dsd_bitrev(subs, urb, bytes);
1612-
} else {
1613-
/* usual PCM */
1614-
if (!subs->tx_length_quirk)
1615-
copy_to_urb(subs, urb, 0, stride, bytes);
1616-
else
1617-
bytes = copy_to_urb_quirk(subs, urb, stride, bytes);
1596+
if (!frames)
1597+
return -EAGAIN;
1598+
1599+
bytes = frames * stride;
1600+
subs->transfer_done = transfer_done;
1601+
subs->frame_limit = frame_limit;
1602+
if (unlikely(ep->cur_format == SNDRV_PCM_FORMAT_DSD_U16_LE &&
1603+
subs->cur_audiofmt->dsd_dop)) {
1604+
fill_playback_urb_dsd_dop(subs, urb, bytes);
1605+
} else if (unlikely(ep->cur_format == SNDRV_PCM_FORMAT_DSD_U8 &&
1606+
subs->cur_audiofmt->dsd_bitrev)) {
1607+
fill_playback_urb_dsd_bitrev(subs, urb, bytes);
1608+
} else {
1609+
/* usual PCM */
1610+
if (!subs->tx_length_quirk)
1611+
copy_to_urb(subs, urb, 0, stride, bytes);
1612+
else
1613+
bytes = copy_to_urb_quirk(subs, urb, stride, bytes);
16181614
/* bytes is now amount of outgoing data */
1619-
}
1615+
}
16201616

1621-
subs->last_frame_number = usb_get_current_frame_number(subs->dev);
1617+
subs->last_frame_number = usb_get_current_frame_number(subs->dev);
16221618

1623-
if (subs->trigger_tstamp_pending_update) {
1624-
/* this is the first actual URB submitted,
1625-
* update trigger timestamp to reflect actual start time
1626-
*/
1627-
snd_pcm_gettime(runtime, &runtime->trigger_tstamp);
1628-
subs->trigger_tstamp_pending_update = false;
1629-
}
1619+
if (subs->trigger_tstamp_pending_update) {
1620+
/* this is the first actual URB submitted,
1621+
* update trigger timestamp to reflect actual start time
1622+
*/
1623+
snd_pcm_gettime(runtime, &runtime->trigger_tstamp);
1624+
subs->trigger_tstamp_pending_update = false;
1625+
}
16301626

1631-
if (period_elapsed && !subs->running && subs->lowlatency_playback) {
1632-
subs->period_elapsed_pending = 1;
1633-
period_elapsed = 0;
1627+
if (period_elapsed && !subs->running && subs->lowlatency_playback) {
1628+
subs->period_elapsed_pending = 1;
1629+
period_elapsed = 0;
1630+
}
16341631
}
16351632

1636-
unlock:
1637-
spin_unlock_irqrestore(&subs->lock, flags);
1638-
if (err < 0)
1639-
return err;
16401633
urb->transfer_buffer_length = bytes;
16411634
if (period_elapsed) {
16421635
if (in_stream_lock)
@@ -1654,24 +1647,23 @@ static int prepare_playback_urb(struct snd_usb_substream *subs,
16541647
static void retire_playback_urb(struct snd_usb_substream *subs,
16551648
struct urb *urb)
16561649
{
1657-
unsigned long flags;
16581650
struct snd_urb_ctx *ctx = urb->context;
16591651
bool period_elapsed = false;
16601652

1661-
spin_lock_irqsave(&subs->lock, flags);
1662-
if (ctx->queued) {
1663-
if (subs->inflight_bytes >= ctx->queued)
1664-
subs->inflight_bytes -= ctx->queued;
1665-
else
1666-
subs->inflight_bytes = 0;
1667-
}
1653+
scoped_guard(spinlock_irqsave, &subs->lock) {
1654+
if (ctx->queued) {
1655+
if (subs->inflight_bytes >= ctx->queued)
1656+
subs->inflight_bytes -= ctx->queued;
1657+
else
1658+
subs->inflight_bytes = 0;
1659+
}
16681660

1669-
subs->last_frame_number = usb_get_current_frame_number(subs->dev);
1670-
if (subs->running) {
1671-
period_elapsed = subs->period_elapsed_pending;
1672-
subs->period_elapsed_pending = 0;
1661+
subs->last_frame_number = usb_get_current_frame_number(subs->dev);
1662+
if (subs->running) {
1663+
period_elapsed = subs->period_elapsed_pending;
1664+
subs->period_elapsed_pending = 0;
1665+
}
16731666
}
1674-
spin_unlock_irqrestore(&subs->lock, flags);
16751667
if (period_elapsed)
16761668
snd_pcm_period_elapsed(subs->pcm_substream);
16771669
}

0 commit comments

Comments
 (0)