#include <linux/init.h>
#include <linux/delay.h>
#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
#include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/i2c.h>
/* Private data for the CS4349 */
struct cs4349_private {
struct regmap *regmap;
- struct cs4349_platform_data pdata;
struct gpio_desc *reset_gpio;
unsigned int mode;
int rate;
static bool cs4349_readable_register(struct device *dev, unsigned int reg)
{
switch (reg) {
- case CS4349_CHIPID:
- case CS4349_MODE:
- case CS4349_VMI:
- case CS4349_MUTE:
- case CS4349_VOLA:
- case CS4349_VOLB:
- case CS4349_RMPFLT:
- case CS4349_MISC:
+ case CS4349_CHIPID ... CS4349_MISC:
+ return true;
+ default:
+ return false;
+ }
+}
+
+static bool cs4349_writeable_register(struct device *dev, unsigned int reg)
+{
+ switch (reg) {
+ case CS4349_MODE ... CS4349_MISC:
return true;
default:
return false;
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
- struct snd_soc_pcm_runtime *rtd = substream->private_data;
- struct snd_soc_codec *codec = rtd->codec;
+ struct snd_soc_codec *codec = dai->codec;
struct cs4349_private *cs4349 = snd_soc_codec_get_drvdata(codec);
- int mode, fmt, ret;
+ int fmt, ret;
- mode = snd_soc_read(codec, CS4349_MODE);
cs4349->rate = params_rate(params);
switch (cs4349->mode) {
case SND_SOC_DAIFMT_I2S:
- mode |= MODE_FORMAT(DIF_I2S);
+ fmt = DIF_I2S;
break;
case SND_SOC_DAIFMT_LEFT_J:
- mode |= MODE_FORMAT(DIF_LEFT_JST);
+ fmt = DIF_LEFT_JST;
break;
case SND_SOC_DAIFMT_RIGHT_J:
switch (params_width(params)) {
default:
return -EINVAL;
}
- mode |= MODE_FORMAT(fmt);
break;
default:
return -EINVAL;
}
- ret = snd_soc_write(codec, CS4349_MODE, mode);
+ ret = snd_soc_update_bits(codec, CS4349_MODE, DIF_MASK,
+ MODE_FORMAT(fmt));
if (ret < 0)
return ret;
.num_dapm_routes = ARRAY_SIZE(cs4349_routes),
};
-static struct regmap_config cs4349_regmap = {
+static const struct regmap_config cs4349_regmap = {
.reg_bits = 8,
.val_bits = 8,
.reg_defaults = cs4349_reg_defaults,
.num_reg_defaults = ARRAY_SIZE(cs4349_reg_defaults),
.readable_reg = cs4349_readable_register,
+ .writeable_reg = cs4349_writeable_register,
.cache_type = REGCACHE_RBTREE,
};
const struct i2c_device_id *id)
{
struct cs4349_private *cs4349;
- struct cs4349_platform_data *pdata = dev_get_platdata(&client->dev);
- int ret = 0;
+ int ret;
cs4349 = devm_kzalloc(&client->dev, sizeof(*cs4349), GFP_KERNEL);
if (!cs4349)
return ret;
}
- if (pdata)
- cs4349->pdata = *pdata;
-
/* Reset the Device */
cs4349->reset_gpio = devm_gpiod_get_optional(&client->dev,
"reset", GPIOD_OUT_LOW);
if (IS_ERR(cs4349->reset_gpio))
return PTR_ERR(cs4349->reset_gpio);
- if (cs4349->reset_gpio)
- gpiod_set_value_cansleep(cs4349->reset_gpio, 1);
+ gpiod_set_value_cansleep(cs4349->reset_gpio, 1);
i2c_set_clientdata(client, cs4349);
snd_soc_unregister_codec(&client->dev);
/* Hold down reset */
- if (cs4349->reset_gpio)
- gpiod_set_value_cansleep(cs4349->reset_gpio, 0);
+ gpiod_set_value_cansleep(cs4349->reset_gpio, 0);
return 0;
}
static int cs4349_runtime_suspend(struct device *dev)
{
struct cs4349_private *cs4349 = dev_get_drvdata(dev);
- struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
int ret;
- ret = snd_soc_update_bits(rtd->codec, CS4349_MISC, PWR_DWN, 1);
+ ret = regmap_update_bits(cs4349->regmap, CS4349_MISC, PWR_DWN, PWR_DWN);
if (ret < 0)
return ret;
regcache_cache_only(cs4349->regmap, true);
/* Hold down reset */
- if (cs4349->reset_gpio)
- gpiod_set_value_cansleep(cs4349->reset_gpio, 0);
+ gpiod_set_value_cansleep(cs4349->reset_gpio, 0);
return 0;
}
static int cs4349_runtime_resume(struct device *dev)
{
struct cs4349_private *cs4349 = dev_get_drvdata(dev);
- struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
int ret;
- ret = snd_soc_update_bits(rtd->codec, CS4349_MISC, PWR_DWN, 0);
+ ret = regmap_update_bits(cs4349->regmap, CS4349_MISC, PWR_DWN, 0);
if (ret < 0)
return ret;
- if (cs4349->reset_gpio)
- gpiod_set_value_cansleep(cs4349->reset_gpio, 1);
+ gpiod_set_value_cansleep(cs4349->reset_gpio, 1);
regcache_cache_only(cs4349->regmap, false);
regcache_sync(cs4349->regmap);
static struct i2c_driver cs4349_i2c_driver = {
.driver = {
.name = "cs4349",
- .owner = THIS_MODULE,
.of_match_table = cs4349_of_match,
},
.id_table = cs4349_i2c_id,