staticint cs35l32_component_set_sysclk(struct snd_soc_component *component, int clk_id, int source, unsignedint freq, int dir)
{ unsignedint val;
switch (freq) { case 6000000:
val = CS35L32_MCLK_RATIO; break; case 12000000:
val = CS35L32_MCLK_DIV2_MASK | CS35L32_MCLK_RATIO; break; case 6144000:
val = 0; break; case 12288000:
val = CS35L32_MCLK_DIV2_MASK; break; default: return -EINVAL;
}
if (of_property_read_u32(np, "cirrus,sdout-share", &val) >= 0)
pdata->sdout_share = val;
if (of_property_read_u32(np, "cirrus,boost-manager", &val))
val = -1u;
switch (val) { case CS35L32_BOOST_MGR_AUTO: case CS35L32_BOOST_MGR_AUTO_AUDIO: case CS35L32_BOOST_MGR_BYPASS: case CS35L32_BOOST_MGR_FIXED:
pdata->boost_mng = val; break; case -1u: default:
dev_err(&i2c_client->dev, "Wrong cirrus,boost-manager DT value %d\n", val);
pdata->boost_mng = CS35L32_BOOST_MGR_BYPASS;
}
if (of_property_read_u32(np, "cirrus,sdout-datacfg", &val))
val = -1u; switch (val) { case CS35L32_DATA_CFG_LR_VP: case CS35L32_DATA_CFG_LR_STAT: case CS35L32_DATA_CFG_LR: case CS35L32_DATA_CFG_LR_VPSTAT:
pdata->sdout_datacfg = val; break; case -1u: default:
dev_err(&i2c_client->dev, "Wrong cirrus,sdout-datacfg DT value %d\n", val);
pdata->sdout_datacfg = CS35L32_DATA_CFG_LR;
}
if (of_property_read_u32(np, "cirrus,battery-threshold", &val))
val = -1u; switch (val) { case CS35L32_BATT_THRESH_3_1V: case CS35L32_BATT_THRESH_3_2V: case CS35L32_BATT_THRESH_3_3V: case CS35L32_BATT_THRESH_3_4V:
pdata->batt_thresh = val; break; case -1u: default:
dev_err(&i2c_client->dev, "Wrong cirrus,battery-threshold DT value %d\n", val);
pdata->batt_thresh = CS35L32_BATT_THRESH_3_3V;
}
if (of_property_read_u32(np, "cirrus,battery-recovery", &val))
val = -1u; switch (val) { case CS35L32_BATT_RECOV_3_1V: case CS35L32_BATT_RECOV_3_2V: case CS35L32_BATT_RECOV_3_3V: case CS35L32_BATT_RECOV_3_4V: case CS35L32_BATT_RECOV_3_5V: case CS35L32_BATT_RECOV_3_6V:
pdata->batt_recov = val; break; case -1u: default:
dev_err(&i2c_client->dev, "Wrong cirrus,battery-recovery DT value %d\n", val);
pdata->batt_recov = CS35L32_BATT_RECOV_3_4V;
}
return 0;
}
staticint cs35l32_i2c_probe(struct i2c_client *i2c_client)
{ struct cs35l32_private *cs35l32; struct cs35l32_platform_data *pdata =
dev_get_platdata(&i2c_client->dev); int ret, i, devid; unsignedint reg;
cs35l32 = devm_kzalloc(&i2c_client->dev, sizeof(*cs35l32), GFP_KERNEL); if (!cs35l32) return -ENOMEM;
i2c_set_clientdata(i2c_client, cs35l32);
cs35l32->regmap = devm_regmap_init_i2c(i2c_client, &cs35l32_regmap); if (IS_ERR(cs35l32->regmap)) {
ret = PTR_ERR(cs35l32->regmap);
dev_err(&i2c_client->dev, "regmap_init() failed: %d\n", ret); return ret;
}
if (pdata) {
cs35l32->pdata = *pdata;
} else {
pdata = devm_kzalloc(&i2c_client->dev, sizeof(*pdata),
GFP_KERNEL); if (!pdata) return -ENOMEM;
if (i2c_client->dev.of_node) {
ret = cs35l32_handle_of_data(i2c_client,
&cs35l32->pdata); if (ret != 0) return ret;
}
}
for (i = 0; i < ARRAY_SIZE(cs35l32->supplies); i++)
cs35l32->supplies[i].supply = cs35l32_supply_names[i];
ret = devm_regulator_bulk_get(&i2c_client->dev,
ARRAY_SIZE(cs35l32->supplies),
cs35l32->supplies); if (ret != 0) {
dev_err(&i2c_client->dev, "Failed to request supplies: %d\n", ret); return ret;
}
ret = regulator_bulk_enable(ARRAY_SIZE(cs35l32->supplies),
cs35l32->supplies); if (ret != 0) {
dev_err(&i2c_client->dev, "Failed to enable supplies: %d\n", ret); return ret;
}
/* Reset the Device */
cs35l32->reset_gpio = devm_gpiod_get_optional(&i2c_client->dev, "reset", GPIOD_OUT_LOW); if (IS_ERR(cs35l32->reset_gpio)) {
ret = PTR_ERR(cs35l32->reset_gpio); goto err_supplies;
}
gpiod_set_value_cansleep(cs35l32->reset_gpio, 1);
/* initialize codec */
devid = cirrus_read_device_id(cs35l32->regmap, CS35L32_DEVID_AB); if (devid < 0) {
ret = devid;
dev_err(&i2c_client->dev, "Failed to read device ID: %d\n", ret); goto err_disable;
}
if (devid != CS35L32_CHIP_ID) {
ret = -ENODEV;
dev_err(&i2c_client->dev, "CS35L32 Device ID (%X). Expected %X\n",
devid, CS35L32_CHIP_ID); goto err_disable;
}
ret = regmap_read(cs35l32->regmap, CS35L32_REV_ID, ®); if (ret < 0) {
dev_err(&i2c_client->dev, "Get Revision ID failed\n"); goto err_disable;
}
ret = regmap_register_patch(cs35l32->regmap, cs35l32_monitor_patch,
ARRAY_SIZE(cs35l32_monitor_patch)); if (ret < 0) {
dev_err(&i2c_client->dev, "Failed to apply errata patch\n"); goto err_disable;
}
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.