Added a sysctl control variable "ac97rate" to allow manual tuning of

the link rate - some ich motherboards overclock ac97 out of the box.

Will hopefully replace this with a callibration loop in time for 4.5R
freeze.

Problem reported by Luigi Rizzo and fix derived from his code (put
diff in ich.c rather than ac97.c).

MFC after:	3 days
This commit is contained in:
Orion Hodson 2001-12-17 01:57:42 +00:00
parent 1abb0234c3
commit 2ae4ee833d

View File

@ -79,6 +79,7 @@ struct sc_info {
struct ac97_info *codec;
struct sc_chinfo ch[3];
int ac97rate;
struct ich_desc *dtbl;
};
@ -284,10 +285,16 @@ ichchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
struct sc_chinfo *ch = data;
struct sc_info *sc = ch->parent;
if (ch->spdreg)
return ac97_setrate(sc->codec, ch->spdreg, speed);
else
if (ch->spdreg) {
int r;
if (sc->ac97rate <= 32000 || sc->ac97rate >= 64000)
sc->ac97rate = 48000;
r = speed * 48000 / sc->ac97rate;
return ac97_setrate(sc->codec, ch->spdreg, r) *
sc->ac97rate / 48000;
} else {
return 48000;
}
}
static int
@ -399,6 +406,22 @@ ich_intr(void *p)
}
}
/* ------------------------------------------------------------------------- */
/* Sysctl to control ac97 speed (some boards overclocked ac97). */
static int
ich_initsys(struct sc_info* sc)
{
#ifdef SND_DYNSYSCTL
SYSCTL_ADD_INT(snd_sysctl_tree(sc->dev),
SYSCTL_CHILDREN(snd_sysctl_tree_top(sc->dev)),
OID_AUTO, "ac97rate", CTLFLAG_RW,
&sc->ac97rate, 48000,
"AC97 link rate (default = 48000)");
#endif /* SND_DYNSYSCTL */
return 0;
}
/* -------------------------------------------------------------------- */
/* Probe and attach the card */
@ -549,6 +572,8 @@ ich_pci_attach(device_t dev)
pcm_setstatus(dev, status);
ich_initsys(sc);
return 0;
bad: