staticbool rt1015_volatile_register(struct device *dev, unsignedint reg)
{ switch (reg) { case RT1015_RESET: case RT1015_CLK_DET: case RT1015_SIL_DET: case RT1015_VER_ID: case RT1015_VENDOR_ID: case RT1015_DEVICE_ID: case RT1015_PRO_ALT: case RT1015_MAN_I2C: case RT1015_DAC3: case RT1015_VBAT_TEST_OUT1: case RT1015_VBAT_TEST_OUT2: case RT1015_VBAT_PROT_ATT: case RT1015_VBAT_DET_CODE: case RT1015_SMART_BST_CTRL1: case RT1015_SPK_DC_DETECT1: case RT1015_SPK_DC_DETECT4: case RT1015_SPK_DC_DETECT5: case RT1015_DC_CALIB_CLSD1: case RT1015_DC_CALIB_CLSD5: case RT1015_DC_CALIB_CLSD6: case RT1015_DC_CALIB_CLSD7: case RT1015_DC_CALIB_CLSD8: case RT1015_S_BST_TIMING_INTER1: case RT1015_OSCK_STA: case RT1015_MONO_DYNA_CTRL1: case RT1015_MONO_DYNA_CTRL5: returntrue;
default: returnfalse;
}
}
staticbool rt1015_readable_register(struct device *dev, unsignedint reg)
{ switch (reg) { case RT1015_RESET: case RT1015_CLK2: case RT1015_CLK3: case RT1015_PLL1: case RT1015_PLL2: case RT1015_DUM_RW1: case RT1015_DUM_RW2: case RT1015_DUM_RW3: case RT1015_DUM_RW4: case RT1015_DUM_RW5: case RT1015_DUM_RW6: case RT1015_CLK_DET: case RT1015_SIL_DET: case RT1015_CUSTOMER_ID: case RT1015_PCODE_FWVER: case RT1015_VER_ID: case RT1015_VENDOR_ID: case RT1015_DEVICE_ID: case RT1015_PAD_DRV1: case RT1015_PAD_DRV2: case RT1015_GAT_BOOST: case RT1015_PRO_ALT: case RT1015_OSCK_STA: case RT1015_MAN_I2C: case RT1015_DAC1: case RT1015_DAC2: case RT1015_DAC3: case RT1015_ADC1: case RT1015_ADC2: case RT1015_TDM_MASTER: case RT1015_TDM_TCON: case RT1015_TDM1_1: case RT1015_TDM1_2: case RT1015_TDM1_3: case RT1015_TDM1_4: case RT1015_TDM1_5: case RT1015_MIXER1: case RT1015_MIXER2: case RT1015_ANA_PROTECT1: case RT1015_ANA_CTRL_SEQ1: case RT1015_ANA_CTRL_SEQ2: case RT1015_VBAT_DET_DEB: case RT1015_VBAT_VOLT_DET1: case RT1015_VBAT_VOLT_DET2: case RT1015_VBAT_TEST_OUT1: case RT1015_VBAT_TEST_OUT2: case RT1015_VBAT_PROT_ATT: case RT1015_VBAT_DET_CODE: case RT1015_PWR1: case RT1015_PWR4: case RT1015_PWR5: case RT1015_PWR6: case RT1015_PWR7: case RT1015_PWR8: case RT1015_PWR9: case RT1015_CLASSD_SEQ: case RT1015_SMART_BST_CTRL1: case RT1015_SMART_BST_CTRL2: case RT1015_ANA_CTRL1: case RT1015_ANA_CTRL2: case RT1015_PWR_STATE_CTRL: case RT1015_MONO_DYNA_CTRL: case RT1015_MONO_DYNA_CTRL1: case RT1015_MONO_DYNA_CTRL2: case RT1015_MONO_DYNA_CTRL3: case RT1015_MONO_DYNA_CTRL4: case RT1015_MONO_DYNA_CTRL5: case RT1015_SPK_VOL: case RT1015_SHORT_DETTOP1: case RT1015_SHORT_DETTOP2: case RT1015_SPK_DC_DETECT1: case RT1015_SPK_DC_DETECT2: case RT1015_SPK_DC_DETECT3: case RT1015_SPK_DC_DETECT4: case RT1015_SPK_DC_DETECT5: case RT1015_BAT_RPO_STEP1: case RT1015_BAT_RPO_STEP2: case RT1015_BAT_RPO_STEP3: case RT1015_BAT_RPO_STEP4: case RT1015_BAT_RPO_STEP5: case RT1015_BAT_RPO_STEP6: case RT1015_BAT_RPO_STEP7: case RT1015_BAT_RPO_STEP8: case RT1015_BAT_RPO_STEP9: case RT1015_BAT_RPO_STEP10: case RT1015_BAT_RPO_STEP11: case RT1015_BAT_RPO_STEP12: case RT1015_SPREAD_SPEC1: case RT1015_SPREAD_SPEC2: case RT1015_PAD_STATUS: case RT1015_PADS_PULLING_CTRL1: case RT1015_PADS_DRIVING: case RT1015_SYS_RST1: case RT1015_SYS_RST2: case RT1015_SYS_GATING1: case RT1015_TEST_MODE1: case RT1015_TEST_MODE2: case RT1015_TIMING_CTRL1: case RT1015_PLL_INT: case RT1015_TEST_OUT1: case RT1015_DC_CALIB_CLSD1: case RT1015_DC_CALIB_CLSD2: case RT1015_DC_CALIB_CLSD3: case RT1015_DC_CALIB_CLSD4: case RT1015_DC_CALIB_CLSD5: case RT1015_DC_CALIB_CLSD6: case RT1015_DC_CALIB_CLSD7: case RT1015_DC_CALIB_CLSD8: case RT1015_DC_CALIB_CLSD9: case RT1015_DC_CALIB_CLSD10: case RT1015_CLSD_INTERNAL1: case RT1015_CLSD_INTERNAL2: case RT1015_CLSD_INTERNAL3: case RT1015_CLSD_INTERNAL4: case RT1015_CLSD_INTERNAL5: case RT1015_CLSD_INTERNAL6: case RT1015_CLSD_INTERNAL7: case RT1015_CLSD_INTERNAL8: case RT1015_CLSD_INTERNAL9: case RT1015_CLSD_OCP_CTRL: case RT1015_VREF_LV: case RT1015_MBIAS1: case RT1015_MBIAS2: case RT1015_MBIAS3: case RT1015_MBIAS4: case RT1015_VREF_LV1: case RT1015_S_BST_TIMING_INTER1: case RT1015_S_BST_TIMING_INTER2: case RT1015_S_BST_TIMING_INTER3: case RT1015_S_BST_TIMING_INTER4: case RT1015_S_BST_TIMING_INTER5: case RT1015_S_BST_TIMING_INTER6: case RT1015_S_BST_TIMING_INTER7: case RT1015_S_BST_TIMING_INTER8: case RT1015_S_BST_TIMING_INTER9: case RT1015_S_BST_TIMING_INTER10: case RT1015_S_BST_TIMING_INTER11: case RT1015_S_BST_TIMING_INTER12: case RT1015_S_BST_TIMING_INTER13: case RT1015_S_BST_TIMING_INTER14: case RT1015_S_BST_TIMING_INTER15: case RT1015_S_BST_TIMING_INTER16: case RT1015_S_BST_TIMING_INTER17: case RT1015_S_BST_TIMING_INTER18: case RT1015_S_BST_TIMING_INTER19: case RT1015_S_BST_TIMING_INTER20: case RT1015_S_BST_TIMING_INTER21: case RT1015_S_BST_TIMING_INTER22: case RT1015_S_BST_TIMING_INTER23: case RT1015_S_BST_TIMING_INTER24: case RT1015_S_BST_TIMING_INTER25: case RT1015_S_BST_TIMING_INTER26: case RT1015_S_BST_TIMING_INTER27: case RT1015_S_BST_TIMING_INTER28: case RT1015_S_BST_TIMING_INTER29: case RT1015_S_BST_TIMING_INTER30: case RT1015_S_BST_TIMING_INTER31: case RT1015_S_BST_TIMING_INTER32: case RT1015_S_BST_TIMING_INTER33: case RT1015_S_BST_TIMING_INTER34: case RT1015_S_BST_TIMING_INTER35: case RT1015_S_BST_TIMING_INTER36: returntrue;
staticint rt1015_set_tdm_slot(struct snd_soc_dai *dai, unsignedint tx_mask, unsignedint rx_mask, int slots, int slot_width)
{ struct snd_soc_component *component = dai->component; unsignedint val = 0, rx_slotnum, tx_slotnum; int ret = 0, first_bit;
switch (slots) { case 2:
val |= RT1015_I2S_TX_2CH; break; case 4:
val |= RT1015_I2S_TX_4CH; break; case 6:
val |= RT1015_I2S_TX_6CH; break; case 8:
val |= RT1015_I2S_TX_8CH; break; default:
ret = -EINVAL; goto _set_tdm_err_;
}
switch (slot_width) { case 16:
val |= RT1015_I2S_CH_TX_LEN_16B; break; case 20:
val |= RT1015_I2S_CH_TX_LEN_20B; break; case 24:
val |= RT1015_I2S_CH_TX_LEN_24B; break; case 32:
val |= RT1015_I2S_CH_TX_LEN_32B; break; default:
ret = -EINVAL; goto _set_tdm_err_;
}
/* Rx slot configuration */
rx_slotnum = hweight_long(rx_mask); if (rx_slotnum != 1) {
ret = -EINVAL;
dev_err(component->dev, "too many rx slots or zero slot\n"); goto _set_tdm_err_;
}
/* This is an assumption that the system sends stereo audio to the amplifier typically. * And the stereo audio is placed in slot 0/2/4/6 as the starting slot. * The users could select the channel from L/R/L+R by "Mono LR Select" control.
*/
first_bit = __ffs(rx_mask); switch (first_bit) { case 0: case 2: case 4: case 6:
snd_soc_component_update_bits(component,
RT1015_TDM1_4,
RT1015_TDM_I2S_TX_L_DAC1_1_MASK |
RT1015_TDM_I2S_TX_R_DAC1_1_MASK,
(first_bit << RT1015_TDM_I2S_TX_L_DAC1_1_SFT) |
((first_bit+1) << RT1015_TDM_I2S_TX_R_DAC1_1_SFT)); break; case 1: case 3: case 5: case 7:
snd_soc_component_update_bits(component,
RT1015_TDM1_4,
RT1015_TDM_I2S_TX_L_DAC1_1_MASK |
RT1015_TDM_I2S_TX_R_DAC1_1_MASK,
((first_bit-1) << RT1015_TDM_I2S_TX_L_DAC1_1_SFT) |
(first_bit << RT1015_TDM_I2S_TX_R_DAC1_1_SFT)); break; default:
ret = -EINVAL; goto _set_tdm_err_;
}
/* Tx slot configuration */
tx_slotnum = hweight_long(tx_mask); if (tx_slotnum) {
ret = -EINVAL;
dev_err(component->dev, "doesn't need to support tx slots\n"); goto _set_tdm_err_;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.