Skip to content

Commit

Permalink
ASoC: apple: mca: Move clock shutdown to be shutdown
Browse files Browse the repository at this point in the history
Codecs are set to mute after hw_free, so yanking the clock out from
under them in hw_free leads to breakage. Move the clock shutdown to the
shutdown op, which is late enough.

Signed-off-by: Hector Martin <marcan@marcan.st>
  • Loading branch information
marcan committed Apr 24, 2023
1 parent ea9b9d3 commit a83cba6
Showing 1 changed file with 20 additions and 28 deletions.
48 changes: 20 additions & 28 deletions sound/soc/apple/mca.c
Expand Up @@ -355,33 +355,6 @@ static int mca_be_prepare(struct snd_pcm_substream *substream,
return 0;
}

static int mca_be_hw_free(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct mca_cluster *cl = mca_dai_to_cluster(dai);
struct mca_data *mca = cl->host;
struct mca_cluster *fe_cl;

if (cl->port_driver < 0)
return -EINVAL;

/*
* We are operating on a foreign cluster here, but since we
* belong to the same PCM, accesses should have been
* synchronized at ASoC level.
*/
fe_cl = &mca->clusters[cl->port_driver];
if (!mca_fe_clocks_in_use(fe_cl))
return 0; /* Nothing to do */

cl->clocks_in_use[substream->stream] = false;

if (!mca_fe_clocks_in_use(fe_cl))
mca_fe_disable_clocks(fe_cl);

return 0;
}

static unsigned int mca_crop_mask(unsigned int mask, int nchans)
{
while (hweight32(mask) > nchans)
Expand Down Expand Up @@ -779,6 +752,26 @@ static void mca_be_shutdown(struct snd_pcm_substream *substream,
struct mca_cluster *cl = mca_dai_to_cluster(dai);
struct mca_data *mca = cl->host;

if (cl->clocks_in_use[substream->stream] &&
!WARN_ON(cl->port_driver < 0)) {
struct mca_cluster *fe_cl = &mca->clusters[cl->port_driver];

/*
* Typically the CODECs we are paired with will require clocks
* to be present at time of mute with the 'mute_stream' op.
* We need to disable the clocks here at the earliest (hw_free
* would be too early).
*
* We are operating on a foreign cluster here, but since we
* belong to the same PCM, accesses should have been
* synchronized at ASoC level.
*/
cl->clocks_in_use[substream->stream] = false;

if (!mca_fe_clocks_in_use(fe_cl))
mca_fe_disable_clocks(fe_cl);
}

cl->port_started[substream->stream] = false;

if (!mca_be_started(cl)) {
Expand All @@ -796,7 +789,6 @@ static void mca_be_shutdown(struct snd_pcm_substream *substream,

static const struct snd_soc_dai_ops mca_be_ops = {
.prepare = mca_be_prepare,
.hw_free = mca_be_hw_free,
.startup = mca_be_startup,
.shutdown = mca_be_shutdown,
};
Expand Down

0 comments on commit a83cba6

Please sign in to comment.