On Wed, Jul 05, 2017 at 03:32:23PM +0200, Alexandre Ratchov wrote:
> On Wed, Jun 28, 2017 at 04:17:30PM +0200, Manuel Giraud wrote:
> > Hi,
> >
> > This patch removes noises in speaker (or headphone) when rebooting
> > (tested on only one Conexant CX20724 chip)
> >
>
> Thanks. Works for me and seems useful in many cases.
>
> > Index: azalia.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/azalia.c,v
> > retrieving revision 1.235
> > diff -u -p -r1.235 azalia.c
> > --- azalia.c 11 Apr 2017 14:43:49 -0000 1.235
> > +++ azalia.c 28 Jun 2017 13:44:26 -0000
> > @@ -697,12 +697,25 @@ azalia_shutdown(void *v)
> > {
> > azalia_t *az = (azalia_t *)v;
> > uint32_t gctl;
> > + codec_t *codec;
> > + int i;
> >
> > /* disable unsolicited response */
> > gctl = AZ_READ_4(az, GCTL);
> > AZ_WRITE_4(az, GCTL, gctl & ~(HDA_GCTL_UNSOL));
> >
> > timeout_del(&az->unsol_to);
> > +
> > + /* power off all codecs */
> > + for (i = 0; i < az->ncodecs; i++) {
> > + codec = &az->codecs[i];
> > + if (codec->audiofunc < 0)
> > + continue;
> > + azalia_comresp(codec, codec->audiofunc,
> > + CORB_SET_POWER_STATE, CORB_PS_D3, NULL);
>
> small style nit: long parameter lists are wrapped with four spaces.
>
> > + DELAY(100);
>
> the proper delays are already part of azalia_comresp(). Since the
> CORB_SET_POWER_STATE command is acknowledged, there's no reason to
> wait.
>
> > + azalia_codec_delete(codec);
>
> the DVACT_POWERDOWN is not intended to cleanup and/or free
> resources as system is about to go down, so this isn't necessary.
>
Here's a diff that takes these comments into account. I've been running
with this since quite some time and it silences the annoying noises.
Can we get this in?
Index: azalia.c
===================================================================
RCS file: /var/cvs/src/sys/dev/pci/azalia.c,v
retrieving revision 1.235
diff -u -p -r1.235 azalia.c
--- azalia.c 11 Apr 2017 14:43:49 -0000 1.235
+++ azalia.c 10 Aug 2017 13:45:55 -0000
@@ -697,12 +697,23 @@ azalia_shutdown(void *v)
{
azalia_t *az = (azalia_t *)v;
uint32_t gctl;
+ codec_t *codec;
+ int i;
/* disable unsolicited response */
gctl = AZ_READ_4(az, GCTL);
AZ_WRITE_4(az, GCTL, gctl & ~(HDA_GCTL_UNSOL));
timeout_del(&az->unsol_to);
+
+ /* power off all codecs */
+ for (i = 0; i < az->ncodecs; i++) {
+ codec = &az->codecs[i];
+ if (codec->audiofunc < 0)
+ continue;
+ azalia_comresp(codec, codec->audiofunc, CORB_SET_POWER_STATE,
+ CORB_PS_D3, NULL);
+ }
/* halt CORB/RIRB */
azalia_halt_corb(az);