Commit 5bb93a33 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branch 'asoc/topic/pcm186x' into asoc-next

parents 8f7b85a7 c044cfda
...@@ -36,13 +36,6 @@ static int pcm186x_i2c_probe(struct i2c_client *i2c, ...@@ -36,13 +36,6 @@ static int pcm186x_i2c_probe(struct i2c_client *i2c,
return pcm186x_probe(&i2c->dev, type, irq, regmap); return pcm186x_probe(&i2c->dev, type, irq, regmap);
} }
static int pcm186x_i2c_remove(struct i2c_client *i2c)
{
pcm186x_remove(&i2c->dev);
return 0;
}
static const struct i2c_device_id pcm186x_i2c_id[] = { static const struct i2c_device_id pcm186x_i2c_id[] = {
{ "pcm1862", PCM1862 }, { "pcm1862", PCM1862 },
{ "pcm1863", PCM1863 }, { "pcm1863", PCM1863 },
...@@ -54,7 +47,6 @@ MODULE_DEVICE_TABLE(i2c, pcm186x_i2c_id); ...@@ -54,7 +47,6 @@ MODULE_DEVICE_TABLE(i2c, pcm186x_i2c_id);
static struct i2c_driver pcm186x_i2c_driver = { static struct i2c_driver pcm186x_i2c_driver = {
.probe = pcm186x_i2c_probe, .probe = pcm186x_i2c_probe,
.remove = pcm186x_i2c_remove,
.id_table = pcm186x_i2c_id, .id_table = pcm186x_i2c_id,
.driver = { .driver = {
.name = "pcm186x", .name = "pcm186x",
......
...@@ -36,13 +36,6 @@ static int pcm186x_spi_probe(struct spi_device *spi) ...@@ -36,13 +36,6 @@ static int pcm186x_spi_probe(struct spi_device *spi)
return pcm186x_probe(&spi->dev, type, irq, regmap); return pcm186x_probe(&spi->dev, type, irq, regmap);
} }
static int pcm186x_spi_remove(struct spi_device *spi)
{
pcm186x_remove(&spi->dev);
return 0;
}
static const struct spi_device_id pcm186x_spi_id[] = { static const struct spi_device_id pcm186x_spi_id[] = {
{ "pcm1862", PCM1862 }, { "pcm1862", PCM1862 },
{ "pcm1863", PCM1863 }, { "pcm1863", PCM1863 },
...@@ -54,7 +47,6 @@ MODULE_DEVICE_TABLE(spi, pcm186x_spi_id); ...@@ -54,7 +47,6 @@ MODULE_DEVICE_TABLE(spi, pcm186x_spi_id);
static struct spi_driver pcm186x_spi_driver = { static struct spi_driver pcm186x_spi_driver = {
.probe = pcm186x_spi_probe, .probe = pcm186x_spi_probe,
.remove = pcm186x_spi_remove,
.id_table = pcm186x_spi_id, .id_table = pcm186x_spi_id,
.driver = { .driver = {
.name = "pcm186x", .name = "pcm186x",
......
...@@ -262,9 +262,8 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream, ...@@ -262,9 +262,8 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params, struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai) struct snd_soc_dai *dai)
{ {
struct snd_soc_codec *codec = dai->codec; struct snd_soc_component *component = dai->component;
struct pcm186x_priv *priv = snd_soc_component_get_drvdata(component);
struct pcm186x_priv *priv = snd_soc_codec_get_drvdata(codec);
unsigned int rate = params_rate(params); unsigned int rate = params_rate(params);
unsigned int format = params_format(params); unsigned int format = params_format(params);
unsigned int width = params_width(params); unsigned int width = params_width(params);
...@@ -274,7 +273,7 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream, ...@@ -274,7 +273,7 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream,
u8 tdm_tx_sel = 0; u8 tdm_tx_sel = 0;
u8 pcm_cfg = 0; u8 pcm_cfg = 0;
dev_dbg(codec->dev, "%s() rate=%u format=0x%x width=%u channels=%u\n", dev_dbg(component->dev, "%s() rate=%u format=0x%x width=%u channels=%u\n",
__func__, rate, format, width, channels); __func__, rate, format, width, channels);
switch (width) { switch (width) {
...@@ -306,7 +305,7 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream, ...@@ -306,7 +305,7 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream,
return -EINVAL; return -EINVAL;
} }
snd_soc_update_bits(codec, PCM186X_PCM_CFG, snd_soc_component_update_bits(component, PCM186X_PCM_CFG,
PCM186X_PCM_CFG_RX_WLEN_MASK | PCM186X_PCM_CFG_RX_WLEN_MASK |
PCM186X_PCM_CFG_TX_WLEN_MASK, PCM186X_PCM_CFG_TX_WLEN_MASK,
pcm_cfg); pcm_cfg);
...@@ -329,14 +328,14 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream, ...@@ -329,14 +328,14 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream,
return -EINVAL; return -EINVAL;
} }
snd_soc_update_bits(codec, PCM186X_TDM_TX_SEL, snd_soc_component_update_bits(component, PCM186X_TDM_TX_SEL,
PCM186X_TDM_TX_SEL_MASK, tdm_tx_sel); PCM186X_TDM_TX_SEL_MASK, tdm_tx_sel);
/* In DSP/TDM mode, the LRCLK divider must be 256 */ /* In DSP/TDM mode, the LRCLK divider must be 256 */
div_lrck = 256; div_lrck = 256;
/* Configure 1/256 duty cycle for LRCK */ /* Configure 1/256 duty cycle for LRCK */
snd_soc_update_bits(codec, PCM186X_PCM_CFG, snd_soc_component_update_bits(component, PCM186X_PCM_CFG,
PCM186X_PCM_CFG_TDM_LRCK_MODE, PCM186X_PCM_CFG_TDM_LRCK_MODE,
PCM186X_PCM_CFG_TDM_LRCK_MODE); PCM186X_PCM_CFG_TDM_LRCK_MODE);
} }
...@@ -345,12 +344,12 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream, ...@@ -345,12 +344,12 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream,
if (priv->is_master_mode) { if (priv->is_master_mode) {
div_bck = priv->sysclk / (div_lrck * rate); div_bck = priv->sysclk / (div_lrck * rate);
dev_dbg(codec->dev, dev_dbg(component->dev,
"%s() master_clk=%u div_bck=%u div_lrck=%u\n", "%s() master_clk=%u div_bck=%u div_lrck=%u\n",
__func__, priv->sysclk, div_bck, div_lrck); __func__, priv->sysclk, div_bck, div_lrck);
snd_soc_write(codec, PCM186X_BCK_DIV, div_bck - 1); snd_soc_component_write(component, PCM186X_BCK_DIV, div_bck - 1);
snd_soc_write(codec, PCM186X_LRK_DIV, div_lrck - 1); snd_soc_component_write(component, PCM186X_LRK_DIV, div_lrck - 1);
} }
return 0; return 0;
...@@ -358,18 +357,18 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream, ...@@ -358,18 +357,18 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream,
static int pcm186x_set_fmt(struct snd_soc_dai *dai, unsigned int format) static int pcm186x_set_fmt(struct snd_soc_dai *dai, unsigned int format)
{ {
struct snd_soc_codec *codec = dai->codec; struct snd_soc_component *component = dai->component;
struct pcm186x_priv *priv = snd_soc_codec_get_drvdata(codec); struct pcm186x_priv *priv = snd_soc_component_get_drvdata(component);
u8 clk_ctrl = 0; u8 clk_ctrl = 0;
u8 pcm_cfg = 0; u8 pcm_cfg = 0;
dev_dbg(codec->dev, "%s() format=0x%x\n", __func__, format); dev_dbg(component->dev, "%s() format=0x%x\n", __func__, format);
/* set master/slave audio interface */ /* set master/slave audio interface */
switch (format & SND_SOC_DAIFMT_MASTER_MASK) { switch (format & SND_SOC_DAIFMT_MASTER_MASK) {
case SND_SOC_DAIFMT_CBM_CFM: case SND_SOC_DAIFMT_CBM_CFM:
if (!priv->sysclk) { if (!priv->sysclk) {
dev_err(codec->dev, "operating in master mode requires sysclock to be configured\n"); dev_err(component->dev, "operating in master mode requires sysclock to be configured\n");
return -EINVAL; return -EINVAL;
} }
clk_ctrl |= PCM186X_CLK_CTRL_MST_MODE; clk_ctrl |= PCM186X_CLK_CTRL_MST_MODE;
...@@ -379,7 +378,7 @@ static int pcm186x_set_fmt(struct snd_soc_dai *dai, unsigned int format) ...@@ -379,7 +378,7 @@ static int pcm186x_set_fmt(struct snd_soc_dai *dai, unsigned int format)
priv->is_master_mode = false; priv->is_master_mode = false;
break; break;
default: default:
dev_err(codec->dev, "Invalid DAI master/slave interface\n"); dev_err(component->dev, "Invalid DAI master/slave interface\n");
return -EINVAL; return -EINVAL;
} }
...@@ -388,7 +387,7 @@ static int pcm186x_set_fmt(struct snd_soc_dai *dai, unsigned int format) ...@@ -388,7 +387,7 @@ static int pcm186x_set_fmt(struct snd_soc_dai *dai, unsigned int format)
case SND_SOC_DAIFMT_NB_NF: case SND_SOC_DAIFMT_NB_NF:
break; break;
default: default:
dev_err(codec->dev, "Inverted DAI clocks not supported\n"); dev_err(component->dev, "Inverted DAI clocks not supported\n");
return -EINVAL; return -EINVAL;
} }
...@@ -410,16 +409,16 @@ static int pcm186x_set_fmt(struct snd_soc_dai *dai, unsigned int format) ...@@ -410,16 +409,16 @@ static int pcm186x_set_fmt(struct snd_soc_dai *dai, unsigned int format)
pcm_cfg = PCM186X_PCM_CFG_FMT_TDM; pcm_cfg = PCM186X_PCM_CFG_FMT_TDM;
break; break;
default: default:
dev_err(codec->dev, "Invalid DAI format\n"); dev_err(component->dev, "Invalid DAI format\n");
return -EINVAL; return -EINVAL;
} }
snd_soc_update_bits(codec, PCM186X_CLK_CTRL, snd_soc_component_update_bits(component, PCM186X_CLK_CTRL,
PCM186X_CLK_CTRL_MST_MODE, clk_ctrl); PCM186X_CLK_CTRL_MST_MODE, clk_ctrl);
snd_soc_write(codec, PCM186X_TDM_TX_OFFSET, priv->tdm_offset); snd_soc_component_write(component, PCM186X_TDM_TX_OFFSET, priv->tdm_offset);
snd_soc_update_bits(codec, PCM186X_PCM_CFG, snd_soc_component_update_bits(component, PCM186X_PCM_CFG,
PCM186X_PCM_CFG_FMT_MASK, pcm_cfg); PCM186X_PCM_CFG_FMT_MASK, pcm_cfg);
return 0; return 0;
...@@ -428,16 +427,16 @@ static int pcm186x_set_fmt(struct snd_soc_dai *dai, unsigned int format) ...@@ -428,16 +427,16 @@ static int pcm186x_set_fmt(struct snd_soc_dai *dai, unsigned int format)
static int pcm186x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, static int pcm186x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
unsigned int rx_mask, int slots, int slot_width) unsigned int rx_mask, int slots, int slot_width)
{ {
struct snd_soc_codec *codec = dai->codec; struct snd_soc_component *component = dai->component;
struct pcm186x_priv *priv = snd_soc_codec_get_drvdata(codec); struct pcm186x_priv *priv = snd_soc_component_get_drvdata(component);
unsigned int first_slot, last_slot, tdm_offset; unsigned int first_slot, last_slot, tdm_offset;
dev_dbg(codec->dev, dev_dbg(component->dev,
"%s() tx_mask=0x%x rx_mask=0x%x slots=%d slot_width=%d\n", "%s() tx_mask=0x%x rx_mask=0x%x slots=%d slot_width=%d\n",
__func__, tx_mask, rx_mask, slots, slot_width); __func__, tx_mask, rx_mask, slots, slot_width);
if (!tx_mask) { if (!tx_mask) {
dev_err(codec->dev, "tdm tx mask must not be 0\n"); dev_err(component->dev, "tdm tx mask must not be 0\n");
return -EINVAL; return -EINVAL;
} }
...@@ -445,14 +444,14 @@ static int pcm186x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, ...@@ -445,14 +444,14 @@ static int pcm186x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
last_slot = __fls(tx_mask); last_slot = __fls(tx_mask);
if (last_slot - first_slot != hweight32(tx_mask) - 1) { if (last_slot - first_slot != hweight32(tx_mask) - 1) {
dev_err(codec->dev, "tdm tx mask must be contiguous\n"); dev_err(component->dev, "tdm tx mask must be contiguous\n");
return -EINVAL; return -EINVAL;
} }
tdm_offset = first_slot * slot_width; tdm_offset = first_slot * slot_width;
if (tdm_offset > 255) { if (tdm_offset > 255) {
dev_err(codec->dev, "tdm tx slot selection out of bounds\n"); dev_err(component->dev, "tdm tx slot selection out of bounds\n");
return -EINVAL; return -EINVAL;
} }
...@@ -464,10 +463,10 @@ static int pcm186x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, ...@@ -464,10 +463,10 @@ static int pcm186x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
static int pcm186x_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, static int pcm186x_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id,
unsigned int freq, int dir) unsigned int freq, int dir)
{ {
struct snd_soc_codec *codec = dai->codec; struct snd_soc_component *component = dai->component;
struct pcm186x_priv *priv = snd_soc_codec_get_drvdata(codec); struct pcm186x_priv *priv = snd_soc_component_get_drvdata(component);
dev_dbg(codec->dev, "%s() clk_id=%d freq=%u dir=%d\n", dev_dbg(component->dev, "%s() clk_id=%d freq=%u dir=%d\n",
__func__, clk_id, freq, dir); __func__, clk_id, freq, dir);
priv->sysclk = freq; priv->sysclk = freq;
...@@ -506,9 +505,9 @@ static struct snd_soc_dai_driver pcm1865_dai = { ...@@ -506,9 +505,9 @@ static struct snd_soc_dai_driver pcm1865_dai = {
.ops = &pcm186x_dai_ops, .ops = &pcm186x_dai_ops,
}; };
static int pcm186x_power_on(struct snd_soc_codec *codec) static int pcm186x_power_on(struct snd_soc_component *component)
{ {
struct pcm186x_priv *priv = snd_soc_codec_get_drvdata(codec); struct pcm186x_priv *priv = snd_soc_component_get_drvdata(component);
int ret = 0; int ret = 0;
ret = regulator_bulk_enable(ARRAY_SIZE(priv->supplies), ret = regulator_bulk_enable(ARRAY_SIZE(priv->supplies),
...@@ -519,25 +518,25 @@ static int pcm186x_power_on(struct snd_soc_codec *codec) ...@@ -519,25 +518,25 @@ static int pcm186x_power_on(struct snd_soc_codec *codec)
regcache_cache_only(priv->regmap, false); regcache_cache_only(priv->regmap, false);
ret = regcache_sync(priv->regmap); ret = regcache_sync(priv->regmap);
if (ret) { if (ret) {
dev_err(codec->dev, "Failed to restore cache\n"); dev_err(component->dev, "Failed to restore cache\n");
regcache_cache_only(priv->regmap, true); regcache_cache_only(priv->regmap, true);
regulator_bulk_disable(ARRAY_SIZE(priv->supplies), regulator_bulk_disable(ARRAY_SIZE(priv->supplies),
priv->supplies); priv->supplies);
return ret; return ret;
} }
snd_soc_update_bits(codec, PCM186X_POWER_CTRL, snd_soc_component_update_bits(component, PCM186X_POWER_CTRL,
PCM186X_PWR_CTRL_PWRDN, 0); PCM186X_PWR_CTRL_PWRDN, 0);
return 0; return 0;
} }
static int pcm186x_power_off(struct snd_soc_codec *codec) static int pcm186x_power_off(struct snd_soc_component *component)
{ {
struct pcm186x_priv *priv = snd_soc_codec_get_drvdata(codec); struct pcm186x_priv *priv = snd_soc_component_get_drvdata(component);
int ret; int ret;
snd_soc_update_bits(codec, PCM186X_POWER_CTRL, snd_soc_component_update_bits(component, PCM186X_POWER_CTRL,
PCM186X_PWR_CTRL_PWRDN, PCM186X_PWR_CTRL_PWRDN); PCM186X_PWR_CTRL_PWRDN, PCM186X_PWR_CTRL_PWRDN);
regcache_cache_only(priv->regmap, true); regcache_cache_only(priv->regmap, true);
...@@ -550,11 +549,11 @@ static int pcm186x_power_off(struct snd_soc_codec *codec) ...@@ -550,11 +549,11 @@ static int pcm186x_power_off(struct snd_soc_codec *codec)
return 0; return 0;
} }
static int pcm186x_set_bias_level(struct snd_soc_codec *codec, static int pcm186x_set_bias_level(struct snd_soc_component *component,
enum snd_soc_bias_level level) enum snd_soc_bias_level level)
{ {
dev_dbg(codec->dev, "## %s: %d -> %d\n", __func__, dev_dbg(component->dev, "## %s: %d -> %d\n", __func__,
snd_soc_codec_get_bias_level(codec), level); snd_soc_component_get_bias_level(component), level);
switch (level) { switch (level) {
case SND_SOC_BIAS_ON: case SND_SOC_BIAS_ON:
...@@ -562,42 +561,44 @@ static int pcm186x_set_bias_level(struct snd_soc_codec *codec, ...@@ -562,42 +561,44 @@ static int pcm186x_set_bias_level(struct snd_soc_codec *codec,
case SND_SOC_BIAS_PREPARE: case SND_SOC_BIAS_PREPARE:
break; break;
case SND_SOC_BIAS_STANDBY: case SND_SOC_BIAS_STANDBY:
if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF)
pcm186x_power_on(codec); pcm186x_power_on(component);
break; break;
case SND_SOC_BIAS_OFF: case SND_SOC_BIAS_OFF:
pcm186x_power_off(codec); pcm186x_power_off(component);
break; break;
} }
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_pcm1863 = { static struct snd_soc_component_driver soc_codec_dev_pcm1863 = {
.set_bias_level = pcm186x_set_bias_level, .set_bias_level = pcm186x_set_bias_level,
.component_driver = {
.controls = pcm1863_snd_controls, .controls = pcm1863_snd_controls,
.num_controls = ARRAY_SIZE(pcm1863_snd_controls), .num_controls = ARRAY_SIZE(pcm1863_snd_controls),
.dapm_widgets = pcm1863_dapm_widgets, .dapm_widgets = pcm1863_dapm_widgets,
.num_dapm_widgets = ARRAY_SIZE(pcm1863_dapm_widgets), .num_dapm_widgets = ARRAY_SIZE(pcm1863_dapm_widgets),
.dapm_routes = pcm1863_dapm_routes, .dapm_routes = pcm1863_dapm_routes,
.num_dapm_routes = ARRAY_SIZE(pcm1863_dapm_routes), .num_dapm_routes = ARRAY_SIZE(pcm1863_dapm_routes),
}, .idle_bias_on = 1,
.use_pmdown_time = 1,
.endianness = 1,
.non_legacy_dai_naming = 1,
}; };
static struct snd_soc_codec_driver soc_codec_dev_pcm1865 = { static struct snd_soc_component_driver soc_codec_dev_pcm1865 = {
.set_bias_level = pcm186x_set_bias_level, .set_bias_level = pcm186x_set_bias_level,
.suspend_bias_off = true,
.component_driver = {
.controls = pcm1865_snd_controls, .controls = pcm1865_snd_controls,
.num_controls = ARRAY_SIZE(pcm1865_snd_controls), .num_controls = ARRAY_SIZE(pcm1865_snd_controls),
.dapm_widgets = pcm1865_dapm_widgets, .dapm_widgets = pcm1865_dapm_widgets,
.num_dapm_widgets = ARRAY_SIZE(pcm1865_dapm_widgets), .num_dapm_widgets = ARRAY_SIZE(pcm1865_dapm_widgets),
.dapm_routes = pcm1865_dapm_routes, .dapm_routes = pcm1865_dapm_routes,
.num_dapm_routes = ARRAY_SIZE(pcm1865_dapm_routes), .num_dapm_routes = ARRAY_SIZE(pcm1865_dapm_routes),
}, .suspend_bias_off = 1,
.idle_bias_on = 1,
.use_pmdown_time = 1,
.endianness = 1,
.non_legacy_dai_naming = 1,
}; };
static bool pcm186x_volatile(struct device *dev, unsigned int reg) static bool pcm186x_volatile(struct device *dev, unsigned int reg)
...@@ -687,13 +688,13 @@ int pcm186x_probe(struct device *dev, enum pcm186x_type type, int irq, ...@@ -687,13 +688,13 @@ int pcm186x_probe(struct device *dev, enum pcm186x_type type, int irq,
switch (type) { switch (type) {
case PCM1865: case PCM1865:
case PCM1864: case PCM1864:
ret = snd_soc_register_codec(dev, &soc_codec_dev_pcm1865, ret = devm_snd_soc_register_component(dev, &soc_codec_dev_pcm1865,
&pcm1865_dai, 1); &pcm1865_dai, 1);
break; break;
case PCM1863: case PCM1863:
case PCM1862: case PCM1862:
default: default:
ret = snd_soc_register_codec(dev, &soc_codec_dev_pcm1863, ret = devm_snd_soc_register_component(dev, &soc_codec_dev_pcm1863,
&pcm1863_dai, 1); &pcm1863_dai, 1);
} }
if (ret) { if (ret) {
...@@ -705,14 +706,6 @@ int pcm186x_probe(struct device *dev, enum pcm186x_type type, int irq, ...@@ -705,14 +706,6 @@ int pcm186x_probe(struct device *dev, enum pcm186x_type type, int irq,
} }
EXPORT_SYMBOL_GPL(pcm186x_probe); EXPORT_SYMBOL_GPL(pcm186x_probe);
int pcm186x_remove(struct device *dev)
{
snd_soc_unregister_codec(dev);
return 0;
}
EXPORT_SYMBOL_GPL(pcm186x_remove);
MODULE_AUTHOR("Andreas Dannenberg <dannenberg@ti.com>"); MODULE_AUTHOR("Andreas Dannenberg <dannenberg@ti.com>");
MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>"); MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
MODULE_DESCRIPTION("PCM186x Universal Audio ADC driver"); MODULE_DESCRIPTION("PCM186x Universal Audio ADC driver");
......
...@@ -215,6 +215,5 @@ extern const struct regmap_config pcm186x_regmap; ...@@ -215,6 +215,5 @@ extern const struct regmap_config pcm186x_regmap;
int pcm186x_probe(struct device *dev, enum pcm186x_type type, int irq, int pcm186x_probe(struct device *dev, enum pcm186x_type type, int irq,
struct regmap *regmap); struct regmap *regmap);
int pcm186x_remove(struct device *dev);
#endif /* _PCM186X_H_ */ #endif /* _PCM186X_H_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment