/* only works for channels <=7, always divide by 2, never accumulates */ static inline void __attribute__((always_inline)) setup_lradc(int src) { BF_CLR(LRADC_CTRL0, SFTRST); BF_CLR(LRADC_CTRL0, CLKGATE); /* don't bother changing the source, we are early enough at boot so that * channel x is mapped to source x */ HW_LRADC_CHn_CLR(src) = BM_OR2(LRADC_CHn, NUM_SAMPLES, ACCUMULATE); BF_SETV(LRADC_CTRL2, DIVIDE_BY_TWO, 1 << src); }
static inline void __attribute__((noreturn)) power_down() { #ifdef SANSA_FUZEPLUS /* B0P09: this pin seems to be important to shutdown the hardware properly */ HW_PINCTRL_MUXSELn_SET(0) = 3 << 18; HW_PINCTRL_DOEn(0) = 1 << 9; HW_PINCTRL_DOUTn(0) = 1 << 9; #endif /* power down */ HW_POWER_RESET = BM_OR2(POWER_RESET, UNLOCK, PWD); while(1); }
void imx233_audioout_preinit(void) { /* Enable AUDIOOUT block */ imx233_reset_block(&HW_AUDIOOUT_CTRL); /* Enable digital filter clock */ imx233_clkctrl_enable(CLK_FILT, true); /* Enable DAC */ BF_CLR(AUDIOOUT_ANACLKCTRL, CLKGATE); /* Set capless mode */ #if IMX233_AUDIO_COUPLING_MODE == ACM_CAP BF_SET(AUDIOOUT_PWRDN, CAPLESS); #else BF_CLR(AUDIOOUT_PWRDN, CAPLESS); #endif /* Set word-length to 16-bit */ BF_SET(AUDIOOUT_CTRL, WORD_LENGTH); /* Power up DAC */ BF_CLR(AUDIOOUT_PWRDN, DAC); /* Hold HP to ground to avoid pop, then release and power up HP */ BF_SET(AUDIOOUT_ANACTRL, HP_HOLD_GND); BF_CLR(AUDIOOUT_PWRDN, HEADPHONE); /* Set HP mode to AB */ BF_SET(AUDIOOUT_ANACTRL, HP_CLASSAB); /* change bias to -50% */ BF_WR(AUDIOOUT_TEST, HP_I1_ADJ, 1); BF_WR(AUDIOOUT_REFCTRL, BIAS_CTRL, 1); #if IMX233_SUBTARGET >= 3700 BF_SET(AUDIOOUT_REFCTRL, RAISE_REF); #endif BF_SET(AUDIOOUT_REFCTRL, XTAL_BGR_BIAS); /* Stop holding to ground */ BF_CLR(AUDIOOUT_ANACTRL, HP_HOLD_GND); /* Set dmawait count to 31 (see errata, workaround random stop) */ BF_WR(AUDIOOUT_CTRL, DMAWAIT_COUNT, 31); /* start converting audio */ BF_SET(AUDIOOUT_CTRL, RUN); /* unmute DAC */ HW_AUDIOOUT_DACVOLUME_CLR = BM_OR2(AUDIOOUT_DACVOLUME, MUTE_LEFT, MUTE_RIGHT); /* send a few samples to avoid pop */ HW_AUDIOOUT_DATA = 0; HW_AUDIOOUT_DATA = 0; HW_AUDIOOUT_DATA = 0; HW_AUDIOOUT_DATA = 0; }
void imx233_audioout_close(void) { /* Switch to class A */ BF_CLR(AUDIOOUT_ANACTRL, HP_CLASSAB); /* Hold HP to ground */ BF_SET(AUDIOOUT_ANACTRL, HP_HOLD_GND); /* Mute HP and power down */ BF_SET(AUDIOOUT_HPVOL, MUTE); /* Power down HP */ BF_SET(AUDIOOUT_PWRDN, HEADPHONE); /* Mute DAC */ HW_AUDIOOUT_DACVOLUME_SET = BM_OR2(AUDIOOUT_DACVOLUME, MUTE_LEFT, MUTE_RIGHT); /* Power down DAC */ BF_SET(AUDIOOUT_PWRDN, DAC); /* Gate off DAC */ BF_SET(AUDIOOUT_ANACLKCTRL, CLKGATE); /* Disable digital filter clock */ imx233_clkctrl_enable(CLK_FILT, false); /* will also gate off the module */ BF_CLR(AUDIOOUT_CTRL, RUN); }