void rtattach(struct rt_softc *sc) { sc->sc_freq = MIN_FM_FREQ; sc->sc_mute = 0; sc->sc_vol = 0; sc->sc_rf = LM700X_REF_050; sc->sc_stereo = LM700X_STEREO; sc->lm.wzcl = RT_WREN_ON | RT_CLCK_OFF | RT_DATA_OFF; sc->lm.wzch = RT_WREN_ON | RT_CLCK_ON | RT_DATA_OFF; sc->lm.wocl = RT_WREN_ON | RT_CLCK_OFF | RT_DATA_ON; sc->lm.woch = RT_WREN_ON | RT_CLCK_ON | RT_DATA_ON; switch (sc->sc_ct) { case CARD_RADIOTRACK: sc->lm.initdata = 0; sc->lm.rsetdata = RT_SIGNAL_METER; sc->lm.init = rt_lm700x_init; sc->lm.rset = rt_lm700x_rset; break; case CARD_SF16FMI: sc->lm.initdata = RT_CARD_OFF; sc->lm.rsetdata = RT_CARD_ON; sc->lm.init = sfi_lm700x_init; sc->lm.rset = sfi_lm700x_init; break; } rt_set_freq(sc, sc->sc_freq); rt_set_mute(sc, sc->sc_vol); radio_attach_mi(&rt_hw_if, sc, &sc->sc_dev); }
int rt_set_info(void *v, struct radio_info *ri) { struct rt_softc *sc = v; sc->sc_mute = ri->mute ? 1 : 0; sc->sc_rf = lm700x_encode_ref(ri->rfreq); switch (sc->sc_ct) { case CARD_RADIOTRACK: sc->sc_vol = rt_conv_vol(ri->volume); break; case CARD_SF16FMI: sc->sc_vol = ri->volume ? 1 : 0; break; } /* * Though SF16-FMI does not set stereo/mono * it won't hurt to have this */ sc->sc_stereo = ri->stereo ? LM700X_STEREO : LM700X_MONO; rt_set_freq(sc, ri->freq); rt_set_mute(sc, sc->sc_vol); return (0); }
int rt_set_info(void *v, struct radio_info *ri) { struct rt_softc *sc = v; sc->mute = ri->mute ? 1 : 0; sc->vol = rt_conv_vol(ri->volume); sc->stereo = ri->stereo ? LM700X_STEREO : LM700X_MONO; sc->rf = lm700x_encode_ref(ri->rfreq); rt_set_freq(sc, ri->freq); rt_set_mute(sc, sc->vol); return (0); }
void rt_set_freq(struct rt_softc *sc, u_int32_t nfreq) { u_int32_t reg; if (nfreq > MAX_FM_FREQ) nfreq = MAX_FM_FREQ; if (nfreq < MIN_FM_FREQ) nfreq = MIN_FM_FREQ; sc->sc_freq = nfreq; reg = lm700x_encode_freq(nfreq, sc->sc_rf); reg |= sc->sc_stereo | sc->sc_rf | LM700X_DIVIDER_FM; lm700x_hardware_write(&sc->lm, reg, RT_VOLUME_STEADY); rt_set_mute(sc, sc->sc_vol); }