Loading sound/soc/codecs/cs42xx8-i2c.c +2 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ static int cs42xx8_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { u32 ret = cs42xx8_probe(&i2c->dev, int ret = cs42xx8_probe(&i2c->dev, devm_regmap_init_i2c(i2c, &cs42xx8_regmap_config)); if (ret) return ret; Loading Loading @@ -51,6 +51,7 @@ static struct i2c_driver cs42xx8_i2c_driver = { .name = "cs42xx8", .owner = THIS_MODULE, .pm = &cs42xx8_pm, .of_match_table = cs42xx8_of_match, }, .probe = cs42xx8_i2c_probe, .remove = cs42xx8_i2c_remove, Loading sound/soc/codecs/cs42xx8.c +10 −9 Original line number Diff line number Diff line Loading @@ -425,7 +425,7 @@ const struct cs42xx8_driver_data cs42888_data = { }; EXPORT_SYMBOL_GPL(cs42888_data); static const struct of_device_id cs42xx8_of_match[] = { const struct of_device_id cs42xx8_of_match[] = { { .compatible = "cirrus,cs42448", .data = &cs42448_data, }, { .compatible = "cirrus,cs42888", .data = &cs42888_data, }, { /* sentinel */ } Loading @@ -435,16 +435,24 @@ EXPORT_SYMBOL_GPL(cs42xx8_of_match); int cs42xx8_probe(struct device *dev, struct regmap *regmap) { const struct of_device_id *of_id = of_match_device(cs42xx8_of_match, dev); const struct of_device_id *of_id; struct cs42xx8_priv *cs42xx8; int ret, val, i; if (IS_ERR(regmap)) { ret = PTR_ERR(regmap); dev_err(dev, "failed to allocate regmap: %d\n", ret); return ret; } cs42xx8 = devm_kzalloc(dev, sizeof(*cs42xx8), GFP_KERNEL); if (cs42xx8 == NULL) return -ENOMEM; cs42xx8->regmap = regmap; dev_set_drvdata(dev, cs42xx8); of_id = of_match_device(cs42xx8_of_match, dev); if (of_id) cs42xx8->drvdata = of_id->data; Loading Loading @@ -482,13 +490,6 @@ int cs42xx8_probe(struct device *dev, struct regmap *regmap) /* Make sure hardware reset done */ msleep(5); cs42xx8->regmap = regmap; if (IS_ERR(cs42xx8->regmap)) { ret = PTR_ERR(cs42xx8->regmap); dev_err(dev, "failed to allocate regmap: %d\n", ret); goto err_enable; } /* * We haven't marked the chip revision as volatile due to * sharing a register with the right input volume; explicitly Loading sound/soc/codecs/cs42xx8.h +1 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ extern const struct dev_pm_ops cs42xx8_pm; extern const struct cs42xx8_driver_data cs42448_data; extern const struct cs42xx8_driver_data cs42888_data; extern const struct regmap_config cs42xx8_regmap_config; extern const struct of_device_id cs42xx8_of_match[]; int cs42xx8_probe(struct device *dev, struct regmap *regmap); /* CS42888 register map */ Loading sound/soc/codecs/ts3a227e.c +45 −2 Original line number Diff line number Diff line Loading @@ -23,11 +23,13 @@ #include "ts3a227e.h" struct ts3a227e { struct device *dev; struct regmap *regmap; struct snd_soc_jack *jack; bool plugged; bool mic_present; unsigned int buttons_held; int irq; }; /* Button values to be reported on the jack */ Loading Loading @@ -189,16 +191,28 @@ static irqreturn_t ts3a227e_interrupt(int irq, void *data) struct ts3a227e *ts3a227e = (struct ts3a227e *)data; struct regmap *regmap = ts3a227e->regmap; unsigned int int_reg, kp_int_reg, acc_reg, i; struct device *dev = ts3a227e->dev; int ret; /* Check for plug/unplug. */ regmap_read(regmap, TS3A227E_REG_INTERRUPT, &int_reg); ret = regmap_read(regmap, TS3A227E_REG_INTERRUPT, &int_reg); if (ret) { dev_err(dev, "failed to clear interrupt ret=%d\n", ret); return IRQ_NONE; } if (int_reg & (DETECTION_COMPLETE_EVENT | INS_REM_EVENT)) { regmap_read(regmap, TS3A227E_REG_ACCESSORY_STATUS, &acc_reg); ts3a227e_new_jack_state(ts3a227e, acc_reg); } /* Report any key events. */ regmap_read(regmap, TS3A227E_REG_KP_INTERRUPT, &kp_int_reg); ret = regmap_read(regmap, TS3A227E_REG_KP_INTERRUPT, &kp_int_reg); if (ret) { dev_err(dev, "failed to clear key interrupt ret=%d\n", ret); return IRQ_NONE; } for (i = 0; i < TS3A227E_NUM_BUTTONS; i++) { if (kp_int_reg & PRESS_MASK(i)) ts3a227e->buttons_held |= (1 << i); Loading Loading @@ -283,6 +297,8 @@ static int ts3a227e_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, ts3a227e); ts3a227e->dev = dev; ts3a227e->irq = i2c->irq; ts3a227e->regmap = devm_regmap_init_i2c(i2c, &ts3a227e_regmap_config); if (IS_ERR(ts3a227e->regmap)) Loading Loading @@ -320,6 +336,32 @@ static int ts3a227e_i2c_probe(struct i2c_client *i2c, return 0; } #ifdef CONFIG_PM_SLEEP static int ts3a227e_suspend(struct device *dev) { struct ts3a227e *ts3a227e = dev_get_drvdata(dev); dev_dbg(ts3a227e->dev, "suspend disable irq\n"); disable_irq(ts3a227e->irq); return 0; } static int ts3a227e_resume(struct device *dev) { struct ts3a227e *ts3a227e = dev_get_drvdata(dev); dev_dbg(ts3a227e->dev, "resume enable irq\n"); enable_irq(ts3a227e->irq); return 0; } #endif static const struct dev_pm_ops ts3a227e_pm = { SET_SYSTEM_SLEEP_PM_OPS(ts3a227e_suspend, ts3a227e_resume) }; static const struct i2c_device_id ts3a227e_i2c_ids[] = { { "ts3a227e", 0 }, { } Loading @@ -336,6 +378,7 @@ static struct i2c_driver ts3a227e_driver = { .driver = { .name = "ts3a227e", .owner = THIS_MODULE, .pm = &ts3a227e_pm, .of_match_table = of_match_ptr(ts3a227e_of_match), }, .probe = ts3a227e_i2c_probe, Loading Loading
sound/soc/codecs/cs42xx8-i2c.c +2 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ static int cs42xx8_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { u32 ret = cs42xx8_probe(&i2c->dev, int ret = cs42xx8_probe(&i2c->dev, devm_regmap_init_i2c(i2c, &cs42xx8_regmap_config)); if (ret) return ret; Loading Loading @@ -51,6 +51,7 @@ static struct i2c_driver cs42xx8_i2c_driver = { .name = "cs42xx8", .owner = THIS_MODULE, .pm = &cs42xx8_pm, .of_match_table = cs42xx8_of_match, }, .probe = cs42xx8_i2c_probe, .remove = cs42xx8_i2c_remove, Loading
sound/soc/codecs/cs42xx8.c +10 −9 Original line number Diff line number Diff line Loading @@ -425,7 +425,7 @@ const struct cs42xx8_driver_data cs42888_data = { }; EXPORT_SYMBOL_GPL(cs42888_data); static const struct of_device_id cs42xx8_of_match[] = { const struct of_device_id cs42xx8_of_match[] = { { .compatible = "cirrus,cs42448", .data = &cs42448_data, }, { .compatible = "cirrus,cs42888", .data = &cs42888_data, }, { /* sentinel */ } Loading @@ -435,16 +435,24 @@ EXPORT_SYMBOL_GPL(cs42xx8_of_match); int cs42xx8_probe(struct device *dev, struct regmap *regmap) { const struct of_device_id *of_id = of_match_device(cs42xx8_of_match, dev); const struct of_device_id *of_id; struct cs42xx8_priv *cs42xx8; int ret, val, i; if (IS_ERR(regmap)) { ret = PTR_ERR(regmap); dev_err(dev, "failed to allocate regmap: %d\n", ret); return ret; } cs42xx8 = devm_kzalloc(dev, sizeof(*cs42xx8), GFP_KERNEL); if (cs42xx8 == NULL) return -ENOMEM; cs42xx8->regmap = regmap; dev_set_drvdata(dev, cs42xx8); of_id = of_match_device(cs42xx8_of_match, dev); if (of_id) cs42xx8->drvdata = of_id->data; Loading Loading @@ -482,13 +490,6 @@ int cs42xx8_probe(struct device *dev, struct regmap *regmap) /* Make sure hardware reset done */ msleep(5); cs42xx8->regmap = regmap; if (IS_ERR(cs42xx8->regmap)) { ret = PTR_ERR(cs42xx8->regmap); dev_err(dev, "failed to allocate regmap: %d\n", ret); goto err_enable; } /* * We haven't marked the chip revision as volatile due to * sharing a register with the right input volume; explicitly Loading
sound/soc/codecs/cs42xx8.h +1 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ extern const struct dev_pm_ops cs42xx8_pm; extern const struct cs42xx8_driver_data cs42448_data; extern const struct cs42xx8_driver_data cs42888_data; extern const struct regmap_config cs42xx8_regmap_config; extern const struct of_device_id cs42xx8_of_match[]; int cs42xx8_probe(struct device *dev, struct regmap *regmap); /* CS42888 register map */ Loading
sound/soc/codecs/ts3a227e.c +45 −2 Original line number Diff line number Diff line Loading @@ -23,11 +23,13 @@ #include "ts3a227e.h" struct ts3a227e { struct device *dev; struct regmap *regmap; struct snd_soc_jack *jack; bool plugged; bool mic_present; unsigned int buttons_held; int irq; }; /* Button values to be reported on the jack */ Loading Loading @@ -189,16 +191,28 @@ static irqreturn_t ts3a227e_interrupt(int irq, void *data) struct ts3a227e *ts3a227e = (struct ts3a227e *)data; struct regmap *regmap = ts3a227e->regmap; unsigned int int_reg, kp_int_reg, acc_reg, i; struct device *dev = ts3a227e->dev; int ret; /* Check for plug/unplug. */ regmap_read(regmap, TS3A227E_REG_INTERRUPT, &int_reg); ret = regmap_read(regmap, TS3A227E_REG_INTERRUPT, &int_reg); if (ret) { dev_err(dev, "failed to clear interrupt ret=%d\n", ret); return IRQ_NONE; } if (int_reg & (DETECTION_COMPLETE_EVENT | INS_REM_EVENT)) { regmap_read(regmap, TS3A227E_REG_ACCESSORY_STATUS, &acc_reg); ts3a227e_new_jack_state(ts3a227e, acc_reg); } /* Report any key events. */ regmap_read(regmap, TS3A227E_REG_KP_INTERRUPT, &kp_int_reg); ret = regmap_read(regmap, TS3A227E_REG_KP_INTERRUPT, &kp_int_reg); if (ret) { dev_err(dev, "failed to clear key interrupt ret=%d\n", ret); return IRQ_NONE; } for (i = 0; i < TS3A227E_NUM_BUTTONS; i++) { if (kp_int_reg & PRESS_MASK(i)) ts3a227e->buttons_held |= (1 << i); Loading Loading @@ -283,6 +297,8 @@ static int ts3a227e_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, ts3a227e); ts3a227e->dev = dev; ts3a227e->irq = i2c->irq; ts3a227e->regmap = devm_regmap_init_i2c(i2c, &ts3a227e_regmap_config); if (IS_ERR(ts3a227e->regmap)) Loading Loading @@ -320,6 +336,32 @@ static int ts3a227e_i2c_probe(struct i2c_client *i2c, return 0; } #ifdef CONFIG_PM_SLEEP static int ts3a227e_suspend(struct device *dev) { struct ts3a227e *ts3a227e = dev_get_drvdata(dev); dev_dbg(ts3a227e->dev, "suspend disable irq\n"); disable_irq(ts3a227e->irq); return 0; } static int ts3a227e_resume(struct device *dev) { struct ts3a227e *ts3a227e = dev_get_drvdata(dev); dev_dbg(ts3a227e->dev, "resume enable irq\n"); enable_irq(ts3a227e->irq); return 0; } #endif static const struct dev_pm_ops ts3a227e_pm = { SET_SYSTEM_SLEEP_PM_OPS(ts3a227e_suspend, ts3a227e_resume) }; static const struct i2c_device_id ts3a227e_i2c_ids[] = { { "ts3a227e", 0 }, { } Loading @@ -336,6 +378,7 @@ static struct i2c_driver ts3a227e_driver = { .driver = { .name = "ts3a227e", .owner = THIS_MODULE, .pm = &ts3a227e_pm, .of_match_table = of_match_ptr(ts3a227e_of_match), }, .probe = ts3a227e_i2c_probe, Loading