On Fri, Apr 14, 2023 at 7:35 PM Mark Brown <broonie@xxxxxxxxxx> wrote: > > On Fri, Apr 14, 2023 at 04:01:59PM +0200, Paweł Anikiel wrote: > > > Apply a workaround for what seems to be a hardware quirk: when using > > an external MCLK signal, powering on Output and DAC for the first time > > produces output distortions unless they're powered together with whole > > chip power. > > This doesn't seem coherent, these are multiple register writes so > clearly can't be done at the same moment as initial power on. Clearly > there's some other constraint here. The "at the same time" part is done by writing multiple bits at once to SSM2602_PWR. But before that, SSM2602_ACTIVE has to be set, and then the chip is reset (SSM2602_RESET) to power everything down again. > > > The workaround powers them on in probe for the first time, as doing it > > later may be impossible (e.g. when starting playback while recording, > > whole chip power will already be on). > > It doesn't do that, it powers them on at component probe. Yes, I meant component probe. > > > Here are some sequences run at the very start before a sw reset (and > > later using one of the NOT OK sequences from above): > > > > ssmset 0x09 0x01 # core > > ssmset 0x06 0x07 # chip, out, dac > > OK > > I can't tell what any of this is trying to say, especially given all the > magic numbers, and obviously no actual use of the driver should be > writing directly to the register map. These are shell commands run from userspace (with no ssm2602 driver present in the kernel). ssmset is a wrapper for the i2cset command: ssmset() { i2cset -y 0 0x1a $(($1*2)) $2 } I definitely should have made that more clear. Do you think these logs are worth adding? If so, I'll improve the explanation what these mean. > > > + /* Workaround for what seems to be a hardware quirk: when using an > > + * external MCLK signal, powering on Output and DAC for the first > > + * time produces output distortions unless they're powered together > > + * with whole chip power. We power them here for the first time, > > + * as doing it later may be impossible (e.g. when starting playback > > + * while recording, whole chip power will already be on) > > + */ > > + regmap_write(ssm2602->regmap, SSM2602_ACTIVE, 0x01); > > + regmap_write(ssm2602->regmap, SSM2602_PWR, 0x07); > > + regmap_write(ssm2602->regmap, SSM2602_RESET, 0x00); > > + > > The rest of the driver uses symbolic names for register values, this > code should too. Ok, I'll correct that. > > This also seems buggy in that it writes non-default values to the > hardware then does a reset, meaning that the cache and hardware values > will be out of sync, and since it only happens on probe there will be an > issue after suspend if power is removed. It looks like this would be > most comfortably implemented as a register patch applied as soon as the > regmap is instantiated. See regmap_register_patch(). I haven't considered that. I will look at regmap_register_patch() and try to use it. Regards, Paweł