On Wed, Aug 10, 2022 at 11:08:43AM +0000, jon@elytron.openbsd.amsterdam wrote:
> Hello everyone. The following diff adds support for
> switching the record.source with the macppc onyx
> driver. I'm still unsure how to get mixerctl or 
> sndctl to set the volume, any hints appreciated.
> 
> Drew some inspiration from 
> https://git.sipsolutions.net/snd-aoa.git

Nice! This does fix the built-in mic on my PowerBook G4.

ok anyone?

> 
> Index: arch/macppc/dev/onyx.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/macppc/dev/onyx.c,v
> retrieving revision 1.15
> diff -u -p -u -p -r1.15 onyx.c
> --- arch/macppc/dev/onyx.c    21 Mar 2022 19:22:39 -0000      1.15
> +++ arch/macppc/dev/onyx.c    10 Aug 2022 11:07:14 -0000
> @@ -59,6 +59,7 @@
>  /* PCM3052 registers */
>  #define PCM3052_REG_LEFT_VOLUME              0x41
>  #define PCM3052_REG_RIGHT_VOLUME     0x42
> +#define PCM3052_REG_ADC_CONTROL      0x48
>  
>  /* XXX */
>  #define onyx_softc i2s_softc
> @@ -71,6 +72,7 @@ int onyx_match(struct device *, void *, 
>  void onyx_attach(struct device *, struct device *, void *);
>  void onyx_defer(struct device *);
>  void onyx_set_volume(struct onyx_softc *, int, int);
> +void onyx_set_input(struct onyx_softc *, int);
>  
>  const struct cfattach onyx_ca = {
>       sizeof(struct onyx_softc), onyx_match, onyx_attach
> @@ -143,6 +145,7 @@ onyx_attach(struct device *parent, struc
>       struct onyx_softc *sc = (struct onyx_softc *)self;
>  
>       sc->sc_setvolume = onyx_set_volume;
> +     sc->sc_setinput = onyx_set_input;
>  
>       i2s_attach(parent, sc, aux);
>       config_defer(self, onyx_defer);
> @@ -169,6 +172,7 @@ onyx_defer(struct device *dev)
>  
>       deq_reset(sc);
>       onyx_set_volume(sc, 192, 192);
> +     onyx_set_input(sc, 1);
>  }
>  
>  void
> @@ -186,4 +190,25 @@ onyx_set_volume(struct onyx_softc *sc, i
>       data = 128 + (right >> 1);
>       kiic_write(sc->sc_i2c, PCM3052_I2C_ADDR,
>           PCM3052_REG_RIGHT_VOLUME, &data, 1);
> +}
> +
> +void
> +onyx_set_input(struct onyx_softc *sc, int mask)
> +{
> +     uint8_t data = 0;
> +
> +     sc->sc_record_source = mask;
> +
> +     switch (mask) {
> +     case    1 << 0: /* microphone */
> +             data = 0x20;
> +             break;
> +     case    1 << 1: /* line in */
> +             data = 0;
> +             break;
> +     }
> +     data |= 12; /* bump volume */
> +
> +     kiic_write(sc->sc_i2c, PCM3052_I2C_ADDR,
> +         PCM3052_REG_ADC_CONTROL, &data, 1);
>  }
> 

Reply via email to