static void au1xpsc_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short val) { struct au1xpsc_audio_data *pscdata = au1xpsc_ac97_workdata; unsigned int tmo, retry; au_writel(PSC_AC97EVNT_CD, AC97_EVNT(pscdata)); au_sync(); retry = AC97_RW_RETRIES; do { mutex_lock(&pscdata->lock); au_writel(PSC_AC97CDC_INDX(reg) | (val & 0xffff), AC97_CDC(pscdata)); au_sync(); tmo = 2000; while ((!(au_readl(AC97_EVNT(pscdata)) & PSC_AC97EVNT_CD)) && --tmo) udelay(2); au_writel(PSC_AC97EVNT_CD, AC97_EVNT(pscdata)); au_sync(); mutex_unlock(&pscdata->lock); } while (--retry && !tmo); }
static unsigned short au1xpsc_ac97_read(struct snd_ac97 *ac97, unsigned short reg) { struct au1xpsc_audio_data *pscdata = au1xpsc_ac97_workdata; unsigned short data, retry, tmo; au_writel(PSC_AC97EVNT_CD, AC97_EVNT(pscdata)); au_sync(); retry = AC97_RW_RETRIES; do { mutex_lock(&pscdata->lock); au_writel(PSC_AC97CDC_RD | PSC_AC97CDC_INDX(reg), AC97_CDC(pscdata)); au_sync(); tmo = 2000; while ((!(au_readl(AC97_EVNT(pscdata)) & PSC_AC97EVNT_CD)) && --tmo) udelay(2); data = au_readl(AC97_CDC(pscdata)) & 0xffff; au_writel(PSC_AC97EVNT_CD, AC97_EVNT(pscdata)); au_sync(); mutex_unlock(&pscdata->lock); } while (--retry && !tmo); return retry ? data : 0xffff; }
/* AC97 controller writes to codec register */ static void au1xpsc_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short val) { /* FIXME */ struct au1xpsc_audio_data *pscdata = au1xpsc_ac97_workdata; unsigned int tmo; au_writel(PSC_AC97CDC_INDX(reg) | (val & 0xffff), AC97_CDC(pscdata)); au_sync(); tmo = 1000; while ((!(au_readl(AC97_EVNT(pscdata)) & PSC_AC97EVNT_CD)) && --tmo) au_sync(); au_writel(PSC_AC97EVNT_CD, AC97_EVNT(pscdata)); au_sync(); }
/* AC97 controller reads codec register */ static unsigned short au1xpsc_ac97_read(struct snd_ac97 *ac97, unsigned short reg) { /* FIXME */ struct au1xpsc_audio_data *pscdata = au1xpsc_ac97_workdata; unsigned short data, tmo; au_writel(PSC_AC97CDC_RD | PSC_AC97CDC_INDX(reg), AC97_CDC(pscdata)); au_sync(); tmo = 1000; while ((!(au_readl(AC97_EVNT(pscdata)) & PSC_AC97EVNT_CD)) && --tmo) udelay(2); if (!tmo) data = 0xffff; else data = au_readl(AC97_CDC(pscdata)) & 0xffff; au_writel(PSC_AC97EVNT_CD, AC97_EVNT(pscdata)); au_sync(); return data; }