|
@@ -154,22 +154,15 @@ static ssize_t soc_codec_reg_show(struct snd_soc_codec *codec, char *buf,
|
|
|
step = codec->driver->reg_cache_step;
|
|
|
|
|
|
for (i = 0; i < codec->driver->reg_cache_size; i += step) {
|
|
|
- if (!snd_soc_codec_readable_register(codec, i))
|
|
|
- continue;
|
|
|
- if (codec->driver->display_register) {
|
|
|
- count += codec->driver->display_register(codec, buf + count,
|
|
|
- PAGE_SIZE - count, i);
|
|
|
- } else {
|
|
|
- /* only support larger than PAGE_SIZE bytes debugfs
|
|
|
- * entries for the default case */
|
|
|
- if (p >= pos) {
|
|
|
- if (total + len >= count - 1)
|
|
|
- break;
|
|
|
- format_register_str(codec, i, buf + total, len);
|
|
|
- total += len;
|
|
|
- }
|
|
|
- p += len;
|
|
|
+ /* only support larger than PAGE_SIZE bytes debugfs
|
|
|
+ * entries for the default case */
|
|
|
+ if (p >= pos) {
|
|
|
+ if (total + len >= count - 1)
|
|
|
+ break;
|
|
|
+ format_register_str(codec, i, buf + total, len);
|
|
|
+ total += len;
|
|
|
}
|
|
|
+ p += len;
|
|
|
}
|
|
|
|
|
|
total = min(total, count - 1);
|
|
@@ -1994,92 +1987,6 @@ static struct platform_driver soc_driver = {
|
|
|
.remove = soc_remove,
|
|
|
};
|
|
|
|
|
|
-/**
|
|
|
- * snd_soc_codec_volatile_register: Report if a register is volatile.
|
|
|
- *
|
|
|
- * @codec: CODEC to query.
|
|
|
- * @reg: Register to query.
|
|
|
- *
|
|
|
- * Boolean function indiciating if a CODEC register is volatile.
|
|
|
- */
|
|
|
-int snd_soc_codec_volatile_register(struct snd_soc_codec *codec,
|
|
|
- unsigned int reg)
|
|
|
-{
|
|
|
- if (codec->volatile_register)
|
|
|
- return codec->volatile_register(codec, reg);
|
|
|
- else
|
|
|
- return 0;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(snd_soc_codec_volatile_register);
|
|
|
-
|
|
|
-/**
|
|
|
- * snd_soc_codec_readable_register: Report if a register is readable.
|
|
|
- *
|
|
|
- * @codec: CODEC to query.
|
|
|
- * @reg: Register to query.
|
|
|
- *
|
|
|
- * Boolean function indicating if a CODEC register is readable.
|
|
|
- */
|
|
|
-int snd_soc_codec_readable_register(struct snd_soc_codec *codec,
|
|
|
- unsigned int reg)
|
|
|
-{
|
|
|
- if (codec->readable_register)
|
|
|
- return codec->readable_register(codec, reg);
|
|
|
- else
|
|
|
- return 1;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(snd_soc_codec_readable_register);
|
|
|
-
|
|
|
-/**
|
|
|
- * snd_soc_codec_writable_register: Report if a register is writable.
|
|
|
- *
|
|
|
- * @codec: CODEC to query.
|
|
|
- * @reg: Register to query.
|
|
|
- *
|
|
|
- * Boolean function indicating if a CODEC register is writable.
|
|
|
- */
|
|
|
-int snd_soc_codec_writable_register(struct snd_soc_codec *codec,
|
|
|
- unsigned int reg)
|
|
|
-{
|
|
|
- if (codec->writable_register)
|
|
|
- return codec->writable_register(codec, reg);
|
|
|
- else
|
|
|
- return 1;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(snd_soc_codec_writable_register);
|
|
|
-
|
|
|
-int snd_soc_platform_read(struct snd_soc_platform *platform,
|
|
|
- unsigned int reg)
|
|
|
-{
|
|
|
- unsigned int ret;
|
|
|
-
|
|
|
- if (!platform->driver->read) {
|
|
|
- dev_err(platform->dev, "ASoC: platform has no read back\n");
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- ret = platform->driver->read(platform, reg);
|
|
|
- dev_dbg(platform->dev, "read %x => %x\n", reg, ret);
|
|
|
- trace_snd_soc_preg_read(platform, reg, ret);
|
|
|
-
|
|
|
- return ret;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(snd_soc_platform_read);
|
|
|
-
|
|
|
-int snd_soc_platform_write(struct snd_soc_platform *platform,
|
|
|
- unsigned int reg, unsigned int val)
|
|
|
-{
|
|
|
- if (!platform->driver->write) {
|
|
|
- dev_err(platform->dev, "ASoC: platform has no write back\n");
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- dev_dbg(platform->dev, "write %x = %x\n", reg, val);
|
|
|
- trace_snd_soc_preg_write(platform, reg, val);
|
|
|
- return platform->driver->write(platform, reg, val);
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(snd_soc_platform_write);
|
|
|
-
|
|
|
/**
|
|
|
* snd_soc_new_ac97_codec - initailise AC97 device
|
|
|
* @codec: audio codec
|
|
@@ -2298,118 +2205,6 @@ void snd_soc_free_ac97_codec(struct snd_soc_codec *codec)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(snd_soc_free_ac97_codec);
|
|
|
|
|
|
-unsigned int snd_soc_read(struct snd_soc_codec *codec, unsigned int reg)
|
|
|
-{
|
|
|
- unsigned int ret;
|
|
|
-
|
|
|
- ret = codec->read(codec, reg);
|
|
|
- dev_dbg(codec->dev, "read %x => %x\n", reg, ret);
|
|
|
- trace_snd_soc_reg_read(codec, reg, ret);
|
|
|
-
|
|
|
- return ret;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(snd_soc_read);
|
|
|
-
|
|
|
-unsigned int snd_soc_write(struct snd_soc_codec *codec,
|
|
|
- unsigned int reg, unsigned int val)
|
|
|
-{
|
|
|
- dev_dbg(codec->dev, "write %x = %x\n", reg, val);
|
|
|
- trace_snd_soc_reg_write(codec, reg, val);
|
|
|
- return codec->write(codec, reg, val);
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(snd_soc_write);
|
|
|
-
|
|
|
-/**
|
|
|
- * snd_soc_update_bits - update codec register bits
|
|
|
- * @codec: audio codec
|
|
|
- * @reg: codec register
|
|
|
- * @mask: register mask
|
|
|
- * @value: new value
|
|
|
- *
|
|
|
- * Writes new register value.
|
|
|
- *
|
|
|
- * Returns 1 for change, 0 for no change, or negative error code.
|
|
|
- */
|
|
|
-int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned int reg,
|
|
|
- unsigned int mask, unsigned int value)
|
|
|
-{
|
|
|
- bool change;
|
|
|
- unsigned int old, new;
|
|
|
- int ret;
|
|
|
-
|
|
|
- if (codec->using_regmap) {
|
|
|
- ret = regmap_update_bits_check(codec->control_data, reg,
|
|
|
- mask, value, &change);
|
|
|
- } else {
|
|
|
- ret = snd_soc_read(codec, reg);
|
|
|
- if (ret < 0)
|
|
|
- return ret;
|
|
|
-
|
|
|
- old = ret;
|
|
|
- new = (old & ~mask) | (value & mask);
|
|
|
- change = old != new;
|
|
|
- if (change)
|
|
|
- ret = snd_soc_write(codec, reg, new);
|
|
|
- }
|
|
|
-
|
|
|
- if (ret < 0)
|
|
|
- return ret;
|
|
|
-
|
|
|
- return change;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(snd_soc_update_bits);
|
|
|
-
|
|
|
-/**
|
|
|
- * snd_soc_update_bits_locked - update codec register bits
|
|
|
- * @codec: audio codec
|
|
|
- * @reg: codec register
|
|
|
- * @mask: register mask
|
|
|
- * @value: new value
|
|
|
- *
|
|
|
- * Writes new register value, and takes the codec mutex.
|
|
|
- *
|
|
|
- * Returns 1 for change else 0.
|
|
|
- */
|
|
|
-int snd_soc_update_bits_locked(struct snd_soc_codec *codec,
|
|
|
- unsigned int reg, unsigned int mask,
|
|
|
- unsigned int value)
|
|
|
-{
|
|
|
- int change;
|
|
|
-
|
|
|
- mutex_lock(&codec->mutex);
|
|
|
- change = snd_soc_update_bits(codec, reg, mask, value);
|
|
|
- mutex_unlock(&codec->mutex);
|
|
|
-
|
|
|
- return change;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(snd_soc_update_bits_locked);
|
|
|
-
|
|
|
-/**
|
|
|
- * snd_soc_test_bits - test register for change
|
|
|
- * @codec: audio codec
|
|
|
- * @reg: codec register
|
|
|
- * @mask: register mask
|
|
|
- * @value: new value
|
|
|
- *
|
|
|
- * Tests a register with a new value and checks if the new value is
|
|
|
- * different from the old value.
|
|
|
- *
|
|
|
- * Returns 1 for change else 0.
|
|
|
- */
|
|
|
-int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned int reg,
|
|
|
- unsigned int mask, unsigned int value)
|
|
|
-{
|
|
|
- int change;
|
|
|
- unsigned int old, new;
|
|
|
-
|
|
|
- old = snd_soc_read(codec, reg);
|
|
|
- new = (old & ~mask) | value;
|
|
|
- change = old != new;
|
|
|
-
|
|
|
- return change;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(snd_soc_test_bits);
|
|
|
-
|
|
|
/**
|
|
|
* snd_soc_cnew - create new control
|
|
|
* @_template: control template
|
|
@@ -3358,7 +3153,7 @@ int snd_soc_get_xr_sx(struct snd_kcontrol *kcontrol,
|
|
|
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
|
|
unsigned int regbase = mc->regbase;
|
|
|
unsigned int regcount = mc->regcount;
|
|
|
- unsigned int regwshift = codec->driver->reg_word_size * BITS_PER_BYTE;
|
|
|
+ unsigned int regwshift = codec->val_bytes * BITS_PER_BYTE;
|
|
|
unsigned int regwmask = (1<<regwshift)-1;
|
|
|
unsigned int invert = mc->invert;
|
|
|
unsigned long mask = (1UL<<mc->nbits)-1;
|
|
@@ -3404,7 +3199,7 @@ int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol,
|
|
|
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
|
|
unsigned int regbase = mc->regbase;
|
|
|
unsigned int regcount = mc->regcount;
|
|
|
- unsigned int regwshift = codec->driver->reg_word_size * BITS_PER_BYTE;
|
|
|
+ unsigned int regwshift = codec->val_bytes * BITS_PER_BYTE;
|
|
|
unsigned int regwmask = (1<<regwshift)-1;
|
|
|
unsigned int invert = mc->invert;
|
|
|
unsigned long mask = (1UL<<mc->nbits)-1;
|
|
@@ -4099,6 +3894,7 @@ int snd_soc_register_component(struct device *dev,
|
|
|
}
|
|
|
|
|
|
cmpnt->ignore_pmdown_time = true;
|
|
|
+ cmpnt->registered_as_component = true;
|
|
|
|
|
|
return __snd_soc_register_component(dev, cmpnt, cmpnt_drv, NULL,
|
|
|
dai_drv, num_dai, true);
|
|
@@ -4114,7 +3910,7 @@ void snd_soc_unregister_component(struct device *dev)
|
|
|
struct snd_soc_component *cmpnt;
|
|
|
|
|
|
list_for_each_entry(cmpnt, &component_list, list) {
|
|
|
- if (dev == cmpnt->dev)
|
|
|
+ if (dev == cmpnt->dev && cmpnt->registered_as_component)
|
|
|
goto found;
|
|
|
}
|
|
|
return;
|
|
@@ -4140,6 +3936,8 @@ EXPORT_SYMBOL_GPL(snd_soc_unregister_component);
|
|
|
int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform,
|
|
|
const struct snd_soc_platform_driver *platform_drv)
|
|
|
{
|
|
|
+ int ret;
|
|
|
+
|
|
|
/* create platform component name */
|
|
|
platform->name = fmt_single_name(dev, &platform->id);
|
|
|
if (platform->name == NULL)
|
|
@@ -4152,6 +3950,16 @@ int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform,
|
|
|
platform->dapm.stream_event = platform_drv->stream_event;
|
|
|
mutex_init(&platform->mutex);
|
|
|
|
|
|
+ /* register component */
|
|
|
+ ret = __snd_soc_register_component(dev, &platform->component,
|
|
|
+ &platform_drv->component_driver,
|
|
|
+ NULL, NULL, 0, false);
|
|
|
+ if (ret < 0) {
|
|
|
+ dev_err(platform->component.dev,
|
|
|
+ "ASoC: Failed to register component: %d\n", ret);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
mutex_lock(&client_mutex);
|
|
|
list_add(&platform->list, &platform_list);
|
|
|
mutex_unlock(&client_mutex);
|
|
@@ -4193,6 +4001,8 @@ EXPORT_SYMBOL_GPL(snd_soc_register_platform);
|
|
|
*/
|
|
|
void snd_soc_remove_platform(struct snd_soc_platform *platform)
|
|
|
{
|
|
|
+ snd_soc_unregister_component(platform->dev);
|
|
|
+
|
|
|
mutex_lock(&client_mutex);
|
|
|
list_del(&platform->list);
|
|
|
mutex_unlock(&client_mutex);
|
|
@@ -4295,9 +4105,6 @@ int snd_soc_register_codec(struct device *dev,
|
|
|
|
|
|
codec->write = codec_drv->write;
|
|
|
codec->read = codec_drv->read;
|
|
|
- codec->volatile_register = codec_drv->volatile_register;
|
|
|
- codec->readable_register = codec_drv->readable_register;
|
|
|
- codec->writable_register = codec_drv->writable_register;
|
|
|
codec->component.ignore_pmdown_time = codec_drv->ignore_pmdown_time;
|
|
|
codec->dapm.bias_level = SND_SOC_BIAS_OFF;
|
|
|
codec->dapm.dev = dev;
|
|
@@ -4307,6 +4114,7 @@ int snd_soc_register_codec(struct device *dev,
|
|
|
codec->dev = dev;
|
|
|
codec->driver = codec_drv;
|
|
|
codec->num_dai = num_dai;
|
|
|
+ codec->val_bytes = codec_drv->reg_word_size;
|
|
|
mutex_init(&codec->mutex);
|
|
|
|
|
|
for (i = 0; i < num_dai; i++) {
|