staticbool cs35l34_volatile_register(struct device *dev, unsignedint reg)
{ switch (reg) { case CS35L34_DEVID_AB: case CS35L34_DEVID_CD: case CS35L34_DEVID_E: case CS35L34_FAB_ID: case CS35L34_REV_ID: case CS35L34_INT_STATUS_1: case CS35L34_INT_STATUS_2: case CS35L34_INT_STATUS_3: case CS35L34_INT_STATUS_4: case CS35L34_CLASS_H_STATUS: case CS35L34_VPBR_ATTEN_STATUS: case CS35L34_OTP_TRIM_STATUS: returntrue; default: returnfalse;
}
}
staticbool cs35l34_readable_register(struct device *dev, unsignedint reg)
{ switch (reg) { case CS35L34_DEVID_AB: case CS35L34_DEVID_CD: case CS35L34_DEVID_E: case CS35L34_FAB_ID: case CS35L34_REV_ID: case CS35L34_PWRCTL1: case CS35L34_PWRCTL2: case CS35L34_PWRCTL3: case CS35L34_ADSP_CLK_CTL: case CS35L34_MCLK_CTL: case CS35L34_AMP_INP_DRV_CTL: case CS35L34_AMP_DIG_VOL_CTL: case CS35L34_AMP_DIG_VOL: case CS35L34_AMP_ANLG_GAIN_CTL: case CS35L34_PROTECT_CTL: case CS35L34_AMP_KEEP_ALIVE_CTL: case CS35L34_BST_CVTR_V_CTL: case CS35L34_BST_PEAK_I: case CS35L34_BST_RAMP_CTL: case CS35L34_BST_CONV_COEF_1: case CS35L34_BST_CONV_COEF_2: case CS35L34_BST_CONV_SLOPE_COMP: case CS35L34_BST_CONV_SW_FREQ: case CS35L34_CLASS_H_CTL: case CS35L34_CLASS_H_HEADRM_CTL: case CS35L34_CLASS_H_RELEASE_RATE: case CS35L34_CLASS_H_FET_DRIVE_CTL: case CS35L34_CLASS_H_STATUS: case CS35L34_VPBR_CTL: case CS35L34_VPBR_VOL_CTL: case CS35L34_VPBR_TIMING_CTL: case CS35L34_PRED_MAX_ATTEN_SPK_LOAD: case CS35L34_PRED_BROWNOUT_THRESH: case CS35L34_PRED_BROWNOUT_VOL_CTL: case CS35L34_PRED_BROWNOUT_RATE_CTL: case CS35L34_PRED_WAIT_CTL: case CS35L34_PRED_ZVP_INIT_IMP_CTL: case CS35L34_PRED_MAN_SAFE_VPI_CTL: case CS35L34_VPBR_ATTEN_STATUS: case CS35L34_PRED_BRWNOUT_ATT_STATUS: case CS35L34_SPKR_MON_CTL: case CS35L34_ADSP_I2S_CTL: case CS35L34_ADSP_TDM_CTL: case CS35L34_TDM_TX_CTL_1_VMON: case CS35L34_TDM_TX_CTL_2_IMON: case CS35L34_TDM_TX_CTL_3_VPMON: case CS35L34_TDM_TX_CTL_4_VBSTMON: case CS35L34_TDM_TX_CTL_5_FLAG1: case CS35L34_TDM_TX_CTL_6_FLAG2: case CS35L34_TDM_TX_SLOT_EN_1: case CS35L34_TDM_TX_SLOT_EN_2: case CS35L34_TDM_TX_SLOT_EN_3: case CS35L34_TDM_TX_SLOT_EN_4: case CS35L34_TDM_RX_CTL_1_AUDIN: case CS35L34_TDM_RX_CTL_3_ALIVE: case CS35L34_MULT_DEV_SYNCH1: case CS35L34_MULT_DEV_SYNCH2: case CS35L34_PROT_RELEASE_CTL: case CS35L34_DIAG_MODE_REG_LOCK: case CS35L34_DIAG_MODE_CTL_1: case CS35L34_DIAG_MODE_CTL_2: case CS35L34_INT_MASK_1: case CS35L34_INT_MASK_2: case CS35L34_INT_MASK_3: case CS35L34_INT_MASK_4: case CS35L34_INT_STATUS_1: case CS35L34_INT_STATUS_2: case CS35L34_INT_STATUS_3: case CS35L34_INT_STATUS_4: case CS35L34_OTP_TRIM_STATUS: returntrue; default: returnfalse;
}
}
staticbool cs35l34_precious_register(struct device *dev, unsignedint reg)
{ switch (reg) { case CS35L34_INT_STATUS_1: case CS35L34_INT_STATUS_2: case CS35L34_INT_STATUS_3: case CS35L34_INT_STATUS_4: returntrue; default: returnfalse;
}
}
/* disable vpmon/vbstmon: enable later if set in tx_mask */
snd_soc_component_update_bits(component, CS35L34_TDM_TX_CTL_3_VPMON,
CS35L34_X_STATE | CS35L34_X_LOC,
CS35L34_X_STATE | CS35L34_X_LOC);
snd_soc_component_update_bits(component, CS35L34_TDM_TX_CTL_4_VBSTMON,
CS35L34_X_STATE | CS35L34_X_LOC,
CS35L34_X_STATE | CS35L34_X_LOC);
/* disconnect {vp,vbst}_mon routes: eanble later if set in tx_mask*/ while (slot >= 0) { /* configure VMON_TX_LOC */ if (slot_num == 0)
snd_soc_component_update_bits(component, CS35L34_TDM_TX_CTL_1_VMON,
CS35L34_X_STATE | CS35L34_X_LOC, slot);
switch (event) { case SND_SOC_DAPM_PRE_PMD:
ret = regmap_read(priv->regmap, CS35L34_AMP_DIG_VOL_CTL,
®); if (ret != 0) {
pr_err("%s regmap read failure %d\n", __func__, ret); return ret;
} if (reg & CS35L34_AMP_DIGSFT)
msleep(40); else
usleep_range(2000, 2100);
for (i = 0; i < PDN_DONE_ATTEMPTS; i++) {
ret = regmap_read(priv->regmap, CS35L34_INT_STATUS_2,
®); if (ret != 0) {
pr_err("%s regmap read failure %d\n",
__func__, ret); return ret;
} if (reg & CS35L34_PDN_DONE) break;
usleep_range(5000, 5100);
} if (i == PDN_DONE_ATTEMPTS)
pr_err("%s Device did not power down properly\n",
__func__); break; default:
pr_err("Invalid event = 0x%x\n", event); break;
} return 0;
}
ret = regmap_update_bits(priv->regmap, CS35L34_ADSP_CLK_CTL,
CS35L34_ADSP_RATE, cs35l34_mclk_coeffs[coeff].adsp_rate); if (ret != 0)
dev_err(component->dev, "Failed to set clock state %d\n", ret);
return ret;
}
staticint cs35l34_set_tristate(struct snd_soc_dai *dai, int tristate)
{
staticint cs35l34_probe(struct snd_soc_component *component)
{ int ret = 0; struct cs35l34_private *cs35l34 = snd_soc_component_get_drvdata(component);
pm_runtime_get_sync(component->dev);
/* Set over temperature warning attenuation to 6 dB */
regmap_update_bits(cs35l34->regmap, CS35L34_PROTECT_CTL,
CS35L34_OTW_ATTN_MASK, 0x8);
/* Set Power control registers 2 and 3 to have everything * powered down at initialization
*/
regmap_write(cs35l34->regmap, CS35L34_PWRCTL2, 0xFD);
regmap_write(cs35l34->regmap, CS35L34_PWRCTL3, 0x1F);
/* Set mute bit at startup */
regmap_update_bits(cs35l34->regmap, CS35L34_PROTECT_CTL,
CS35L34_MUTE, CS35L34_MUTE);
/* Set Platform Data */ if (cs35l34->pdata.boost_peak)
regmap_update_bits(cs35l34->regmap, CS35L34_BST_PEAK_I,
CS35L34_BST_PEAK_MASK,
cs35l34->pdata.boost_peak);
if (of_property_read_u32(np, "cirrus,boost-vtge-millivolt",
&val) >= 0) { /* Boost Voltage has a maximum of 8V */ if (val > 8000 || (val < 3300 && val > 0)) {
dev_err(&i2c_client->dev, "Invalid Boost Voltage %d mV\n", val); return -EINVAL;
} if (val == 0)
pdata->boost_vtge = 0; /* Use VP */ else
pdata->boost_vtge = ((val - 3300)/100) + 1;
} else {
dev_warn(&i2c_client->dev, "Boost Voltage not specified. Using VP\n");
}
if (of_property_read_u32(np, "cirrus,boost-ind-nanohenry", &val) >= 0) {
pdata->boost_ind = val;
} else {
dev_err(&i2c_client->dev, "Inductor not specified.\n"); return -EINVAL;
}
if (of_property_read_u32(np, "cirrus,boost-peak-milliamp", &val) >= 0) { if (val > 3840 || val < 1200) {
dev_err(&i2c_client->dev, "Invalid Boost Peak Current %d mA\n", val); return -EINVAL;
}
pdata->boost_peak = ((val - 1200)/80) + 1;
}
staticint cs35l34_i2c_probe(struct i2c_client *i2c_client)
{ struct cs35l34_private *cs35l34; struct cs35l34_platform_data *pdata =
dev_get_platdata(&i2c_client->dev); int i, devid; int ret; unsignedint reg;
cs35l34 = devm_kzalloc(&i2c_client->dev, sizeof(*cs35l34), GFP_KERNEL); if (!cs35l34) return -ENOMEM;
i2c_set_clientdata(i2c_client, cs35l34);
cs35l34->regmap = devm_regmap_init_i2c(i2c_client, &cs35l34_regmap); if (IS_ERR(cs35l34->regmap)) {
ret = PTR_ERR(cs35l34->regmap);
dev_err(&i2c_client->dev, "regmap_init() failed: %d\n", ret); return ret;
}
cs35l34->num_core_supplies = ARRAY_SIZE(cs35l34_core_supplies); for (i = 0; i < ARRAY_SIZE(cs35l34_core_supplies); i++)
cs35l34->core_supplies[i].supply = cs35l34_core_supplies[i];
ret = devm_regulator_bulk_get(&i2c_client->dev,
cs35l34->num_core_supplies,
cs35l34->core_supplies); if (ret != 0) {
dev_err(&i2c_client->dev, "Failed to request core supplies %d\n", ret); return ret;
}
ret = regulator_bulk_enable(cs35l34->num_core_supplies,
cs35l34->core_supplies); if (ret != 0) {
dev_err(&i2c_client->dev, "Failed to enable core supplies: %d\n", ret); return ret;
}
if (pdata) {
cs35l34->pdata = *pdata;
} else {
pdata = devm_kzalloc(&i2c_client->dev, sizeof(*pdata),
GFP_KERNEL); if (!pdata) {
ret = -ENOMEM; goto err_regulator;
}
if (i2c_client->dev.of_node) {
ret = cs35l34_handle_of_data(i2c_client, pdata); if (ret != 0) goto err_regulator;
}
cs35l34->pdata = *pdata;
}
ret = devm_request_threaded_irq(&i2c_client->dev, i2c_client->irq, NULL,
cs35l34_irq_thread, IRQF_ONESHOT | IRQF_TRIGGER_LOW, "cs35l34", cs35l34); if (ret != 0)
dev_err(&i2c_client->dev, "Failed to request IRQ: %d\n", ret);
cs35l34->reset_gpio = devm_gpiod_get_optional(&i2c_client->dev, "reset", GPIOD_OUT_LOW); if (IS_ERR(cs35l34->reset_gpio)) {
ret = PTR_ERR(cs35l34->reset_gpio); goto err_regulator;
}
gpiod_set_value_cansleep(cs35l34->reset_gpio, 1);
msleep(CS35L34_START_DELAY);
devid = cirrus_read_device_id(cs35l34->regmap, CS35L34_DEVID_AB); if (devid < 0) {
ret = devid;
dev_err(&i2c_client->dev, "Failed to read device ID: %d\n", ret); goto err_reset;
}
if (devid != CS35L34_CHIP_ID) {
dev_err(&i2c_client->dev, "CS35l34 Device ID (%X). Expected ID %X\n",
devid, CS35L34_CHIP_ID);
ret = -ENODEV; goto err_reset;
}
ret = regmap_read(cs35l34->regmap, CS35L34_REV_ID, ®); if (ret < 0) {
dev_err(&i2c_client->dev, "Get Revision ID failed\n"); goto err_reset;
}
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.