mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
ASoC: Updates for v4.16
Some final updates for the merge window, this brings in some improvements to the ACPI GPIO handling for Intel and a bunch of fixes. -----BEGIN PGP SIGNATURE----- iQFHBAABCgAxFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAlph4RMTHGJyb29uaWVA a2VybmVsLm9yZwAKCRAk1otyXVSH0MzZB/9wMMti91eAeyTnnZvhf+7USCrhbYha NQr0gktACvGY5y+qhVOdPGASzWBjUObWu0Ne+W32/WRWjJ9Gh54yomH5uAHCP8kl qFugDwxagy1hKqMMn1reKhSbxPFbS1uOEDAZZPC1hWAWk9ZgXpKL9uI+kAZIBZ2z 48CVHBb6XUwD7Pcb5jOcUEhr5CLyCwoeAsiXDztDI5BCzvbrENe3lQoX5snoswij /0qX7SrJmgiH/mMiLZQs4PU9v4nwzwrXpwYXwUWJGZPVPNGTtpnhc5xk0UgmMytW D7pzf5GIkra+khon5BbxvAo0aNaRLpw+lTCnBIRhP3Aa/Tfe9mnOZhbF =bULv -----END PGP SIGNATURE----- Merge tag 'asoc-v4.16-3' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-next ASoC: Updates for v4.16 Some final updates for the merge window, this brings in some improvements to the ACPI GPIO handling for Intel and a bunch of fixes.
This commit is contained in:
commit
c86d95cb6b
283 changed files with 3941 additions and 1099 deletions
|
|
@ -91,8 +91,8 @@ static unsigned short au1xac97c_ac97_read(struct snd_ac97 *ac97,
|
|||
do {
|
||||
mutex_lock(&ctx->lock);
|
||||
|
||||
tmo = 5;
|
||||
while ((RD(ctx, AC97_STATUS) & STAT_CP) && tmo--)
|
||||
tmo = 6;
|
||||
while ((RD(ctx, AC97_STATUS) & STAT_CP) && --tmo)
|
||||
udelay(21); /* wait an ac97 frame time */
|
||||
if (!tmo) {
|
||||
pr_debug("ac97rd timeout #1\n");
|
||||
|
|
@ -105,7 +105,7 @@ static unsigned short au1xac97c_ac97_read(struct snd_ac97 *ac97,
|
|||
* poll, Forrest, poll...
|
||||
*/
|
||||
tmo = 0x10000;
|
||||
while ((RD(ctx, AC97_STATUS) & STAT_CP) && tmo--)
|
||||
while ((RD(ctx, AC97_STATUS) & STAT_CP) && --tmo)
|
||||
asm volatile ("nop");
|
||||
data = RD(ctx, AC97_CMDRESP);
|
||||
|
||||
|
|
|
|||
|
|
@ -130,6 +130,7 @@ struct bcm2835_i2s_dev {
|
|||
struct regmap *i2s_regmap;
|
||||
struct clk *clk;
|
||||
bool clk_prepared;
|
||||
int clk_rate;
|
||||
};
|
||||
|
||||
static void bcm2835_i2s_start_clock(struct bcm2835_i2s_dev *dev)
|
||||
|
|
@ -419,10 +420,19 @@ static int bcm2835_i2s_hw_params(struct snd_pcm_substream *substream,
|
|||
}
|
||||
|
||||
/* Clock should only be set up here if CPU is clock master */
|
||||
if (bit_clock_master) {
|
||||
ret = clk_set_rate(dev->clk, bclk_rate);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (bit_clock_master &&
|
||||
(!dev->clk_prepared || dev->clk_rate != bclk_rate)) {
|
||||
if (dev->clk_prepared)
|
||||
bcm2835_i2s_stop_clock(dev);
|
||||
|
||||
if (dev->clk_rate != bclk_rate) {
|
||||
ret = clk_set_rate(dev->clk, bclk_rate);
|
||||
if (ret)
|
||||
return ret;
|
||||
dev->clk_rate = bclk_rate;
|
||||
}
|
||||
|
||||
bcm2835_i2s_start_clock(dev);
|
||||
}
|
||||
|
||||
/* Setup the frame format */
|
||||
|
|
@ -618,8 +628,6 @@ static int bcm2835_i2s_prepare(struct snd_pcm_substream *substream,
|
|||
struct bcm2835_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
|
||||
uint32_t cs_reg;
|
||||
|
||||
bcm2835_i2s_start_clock(dev);
|
||||
|
||||
/*
|
||||
* Clear both FIFOs if the one that should be started
|
||||
* is not empty at the moment. This should only happen
|
||||
|
|
|
|||
|
|
@ -1355,7 +1355,7 @@ static int cs42l73_i2c_probe(struct i2c_client *i2c_client,
|
|||
ret = regmap_read(cs42l73->regmap, CS42L73_REVID, ®);
|
||||
if (ret < 0) {
|
||||
dev_err(&i2c_client->dev, "Get Revision ID failed\n");
|
||||
return ret;;
|
||||
return ret;
|
||||
}
|
||||
|
||||
dev_info(&i2c_client->dev,
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
struct cx20442_priv {
|
||||
struct tty_struct *tty;
|
||||
struct regulator *por;
|
||||
u8 reg_cache;
|
||||
};
|
||||
|
||||
#define CX20442_PM 0x0
|
||||
|
|
@ -88,6 +89,17 @@ static const struct snd_soc_dapm_route cx20442_audio_map[] = {
|
|||
{"ADC", NULL, "Input Mixer"},
|
||||
};
|
||||
|
||||
static unsigned int cx20442_read_reg_cache(struct snd_soc_codec *codec,
|
||||
unsigned int reg)
|
||||
{
|
||||
struct cx20442_priv *cx20442 = snd_soc_codec_get_drvdata(codec);
|
||||
|
||||
if (reg >= 1)
|
||||
return -EINVAL;
|
||||
|
||||
return cx20442->reg_cache;
|
||||
}
|
||||
|
||||
enum v253_vls {
|
||||
V253_VLS_NONE = 0,
|
||||
V253_VLS_T,
|
||||
|
|
@ -112,8 +124,6 @@ enum v253_vls {
|
|||
V253_VLS_TEST,
|
||||
};
|
||||
|
||||
#if 0
|
||||
/* FIXME : these function will be re-used */
|
||||
static int cx20442_pm_to_v253_vls(u8 value)
|
||||
{
|
||||
switch (value & ~(1 << CX20442_AGC)) {
|
||||
|
|
@ -147,11 +157,10 @@ static int cx20442_write(struct snd_soc_codec *codec, unsigned int reg,
|
|||
unsigned int value)
|
||||
{
|
||||
struct cx20442_priv *cx20442 = snd_soc_codec_get_drvdata(codec);
|
||||
u8 *reg_cache = codec->reg_cache;
|
||||
int vls, vsp, old, len;
|
||||
char buf[18];
|
||||
|
||||
if (reg >= codec->driver->reg_cache_size)
|
||||
if (reg >= 1)
|
||||
return -EINVAL;
|
||||
|
||||
/* tty and write pointers required for talking to the modem
|
||||
|
|
@ -159,8 +168,8 @@ static int cx20442_write(struct snd_soc_codec *codec, unsigned int reg,
|
|||
if (!cx20442->tty || !cx20442->tty->ops->write)
|
||||
return -EIO;
|
||||
|
||||
old = reg_cache[reg];
|
||||
reg_cache[reg] = value;
|
||||
old = cx20442->reg_cache;
|
||||
cx20442->reg_cache = value;
|
||||
|
||||
vls = cx20442_pm_to_v253_vls(value);
|
||||
if (vls < 0)
|
||||
|
|
@ -190,7 +199,6 @@ static int cx20442_write(struct snd_soc_codec *codec, unsigned int reg,
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Line discpline related code
|
||||
|
|
@ -384,12 +392,12 @@ static int cx20442_codec_remove(struct snd_soc_codec *codec)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const u8 cx20442_reg;
|
||||
|
||||
static const struct snd_soc_codec_driver cx20442_codec_dev = {
|
||||
.probe = cx20442_codec_probe,
|
||||
.remove = cx20442_codec_remove,
|
||||
.set_bias_level = cx20442_set_bias_level,
|
||||
.read = cx20442_read_reg_cache,
|
||||
.write = cx20442_write,
|
||||
|
||||
.component_driver = {
|
||||
.dapm_widgets = cx20442_dapm_widgets,
|
||||
|
|
|
|||
|
|
@ -1332,10 +1332,13 @@ static int sgtl5000_i2c_probe(struct i2c_client *client,
|
|||
sgtl5000->mclk = devm_clk_get(&client->dev, NULL);
|
||||
if (IS_ERR(sgtl5000->mclk)) {
|
||||
ret = PTR_ERR(sgtl5000->mclk);
|
||||
dev_err(&client->dev, "Failed to get mclock: %d\n", ret);
|
||||
/* Defer the probe to see if the clk will be provided later */
|
||||
if (ret == -ENOENT)
|
||||
ret = -EPROBE_DEFER;
|
||||
|
||||
if (ret != -EPROBE_DEFER)
|
||||
dev_err(&client->dev, "Failed to get mclock: %d\n",
|
||||
ret);
|
||||
goto disable_regs;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -246,6 +246,19 @@ static int dac33_write(struct snd_soc_codec *codec, unsigned int reg,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int dac33_write_locked(struct snd_soc_codec *codec, unsigned int reg,
|
||||
unsigned int value)
|
||||
{
|
||||
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
|
||||
int ret;
|
||||
|
||||
mutex_lock(&dac33->mutex);
|
||||
ret = dac33_write(codec, reg, value);
|
||||
mutex_unlock(&dac33->mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define DAC33_I2C_ADDR_AUTOINC 0x80
|
||||
static int dac33_write16(struct snd_soc_codec *codec, unsigned int reg,
|
||||
unsigned int value)
|
||||
|
|
@ -1422,6 +1435,8 @@ static int dac33_soc_remove(struct snd_soc_codec *codec)
|
|||
}
|
||||
|
||||
static const struct snd_soc_codec_driver soc_codec_dev_tlv320dac33 = {
|
||||
.read = dac33_read_reg_cache,
|
||||
.write = dac33_write_locked,
|
||||
.set_bias_level = dac33_set_bias_level,
|
||||
.idle_bias_off = true,
|
||||
|
||||
|
|
|
|||
|
|
@ -726,6 +726,8 @@ static int uda1380_probe(struct snd_soc_codec *codec)
|
|||
|
||||
static const struct snd_soc_codec_driver soc_codec_dev_uda1380 = {
|
||||
.probe = uda1380_probe,
|
||||
.read = uda1380_read_reg_cache,
|
||||
.write = uda1380_write,
|
||||
.set_bias_level = uda1380_set_bias_level,
|
||||
.suspend_bias_off = true,
|
||||
|
||||
|
|
|
|||
|
|
@ -77,7 +77,6 @@ config SND_SST_ATOM_HIFI2_PLATFORM_PCI
|
|||
depends on X86 && PCI
|
||||
select SND_SST_IPC_PCI
|
||||
select SND_SOC_COMPRESS
|
||||
select SND_SOC_INTEL_COMMON
|
||||
help
|
||||
If you have a Intel Medfield or Merrifield/Edison platform, then
|
||||
enable this option by saying Y or m. Distros will typically not
|
||||
|
|
|
|||
|
|
@ -139,6 +139,7 @@ config SND_SOC_INTEL_BYT_CHT_DA7213_MACH
|
|||
config SND_SOC_INTEL_BYT_CHT_ES8316_MACH
|
||||
tristate "Baytrail & Cherrytrail with ES8316 codec"
|
||||
depends on X86_INTEL_LPSS && I2C && ACPI
|
||||
select SND_SOC_ACPI
|
||||
select SND_SOC_ES8316
|
||||
help
|
||||
This adds support for ASoC machine driver for Intel(R) Baytrail &
|
||||
|
|
|
|||
|
|
@ -219,7 +219,7 @@ static struct snd_soc_card bytcht_da7213_card = {
|
|||
.num_dapm_routes = ARRAY_SIZE(audio_map),
|
||||
};
|
||||
|
||||
static char codec_name[16]; /* i2c-<HID>:00 with HID being 8 chars */
|
||||
static char codec_name[SND_ACPI_I2C_ID_LEN];
|
||||
|
||||
static int bytcht_da7213_probe(struct platform_device *pdev)
|
||||
{
|
||||
|
|
@ -243,7 +243,7 @@ static int bytcht_da7213_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
/* fixup codec name based on HID */
|
||||
i2c_name = snd_soc_acpi_find_name_from_hid(mach->id);
|
||||
i2c_name = acpi_dev_get_first_match_name(mach->id, NULL, -1);
|
||||
if (i2c_name) {
|
||||
snprintf(codec_name, sizeof(codec_name),
|
||||
"%s%s", "i2c-", i2c_name);
|
||||
|
|
|
|||
|
|
@ -232,15 +232,39 @@ static struct snd_soc_card byt_cht_es8316_card = {
|
|||
.fully_routed = true,
|
||||
};
|
||||
|
||||
static char codec_name[SND_ACPI_I2C_ID_LEN];
|
||||
|
||||
static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret = 0;
|
||||
struct byt_cht_es8316_private *priv;
|
||||
struct snd_soc_acpi_mach *mach;
|
||||
const char *i2c_name = NULL;
|
||||
int dai_index = 0;
|
||||
int i;
|
||||
int ret = 0;
|
||||
|
||||
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_ATOMIC);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
mach = (&pdev->dev)->platform_data;
|
||||
/* fix index of codec dai */
|
||||
for (i = 0; i < ARRAY_SIZE(byt_cht_es8316_dais); i++) {
|
||||
if (!strcmp(byt_cht_es8316_dais[i].codec_name,
|
||||
"i2c-ESSX8316:00")) {
|
||||
dai_index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* fixup codec name based on HID */
|
||||
i2c_name = acpi_dev_get_first_match_name(mach->id, NULL, -1);
|
||||
if (i2c_name) {
|
||||
snprintf(codec_name, sizeof(codec_name),
|
||||
"%s%s", "i2c-", i2c_name);
|
||||
byt_cht_es8316_dais[dai_index].codec_name = codec_name;
|
||||
}
|
||||
|
||||
/* register the soc card */
|
||||
byt_cht_es8316_card.dev = &pdev->dev;
|
||||
snd_soc_card_set_drvdata(&byt_cht_es8316_card, priv);
|
||||
|
|
|
|||
|
|
@ -713,7 +713,7 @@ static struct snd_soc_card byt_rt5640_card = {
|
|||
.fully_routed = true,
|
||||
};
|
||||
|
||||
static char byt_rt5640_codec_name[16]; /* i2c-<HID>:00 with HID being 8 chars */
|
||||
static char byt_rt5640_codec_name[SND_ACPI_I2C_ID_LEN];
|
||||
static char byt_rt5640_codec_aif_name[12]; /* = "rt5640-aif[1|2]" */
|
||||
static char byt_rt5640_cpu_dai_name[10]; /* = "ssp[0|2]-port" */
|
||||
|
||||
|
|
@ -762,7 +762,7 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
/* fixup codec name based on HID */
|
||||
i2c_name = snd_soc_acpi_find_name_from_hid(mach->id);
|
||||
i2c_name = acpi_dev_get_first_match_name(mach->id, NULL, -1);
|
||||
if (i2c_name) {
|
||||
snprintf(byt_rt5640_codec_name, sizeof(byt_rt5640_codec_name),
|
||||
"%s%s", "i2c-", i2c_name);
|
||||
|
|
|
|||
|
|
@ -509,7 +509,7 @@ static struct snd_soc_card byt_rt5651_card = {
|
|||
.fully_routed = true,
|
||||
};
|
||||
|
||||
static char byt_rt5651_codec_name[16]; /* i2c-<HID>:00 with HID being 8 chars */
|
||||
static char byt_rt5651_codec_name[SND_ACPI_I2C_ID_LEN];
|
||||
|
||||
static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
|
||||
{
|
||||
|
|
@ -539,7 +539,7 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
/* fixup codec name based on HID */
|
||||
i2c_name = snd_soc_acpi_find_name_from_hid(mach->id);
|
||||
i2c_name = acpi_dev_get_first_match_name(mach->id, NULL, -1);
|
||||
if (i2c_name) {
|
||||
snprintf(byt_rt5651_codec_name, sizeof(byt_rt5651_codec_name),
|
||||
"%s%s", "i2c-", i2c_name);
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ struct cht_acpi_card {
|
|||
struct cht_mc_private {
|
||||
struct snd_soc_jack jack;
|
||||
struct cht_acpi_card *acpi_card;
|
||||
char codec_name[16];
|
||||
char codec_name[SND_ACPI_I2C_ID_LEN];
|
||||
struct clk *mclk;
|
||||
};
|
||||
|
||||
|
|
@ -506,7 +506,7 @@ static struct cht_acpi_card snd_soc_cards[] = {
|
|||
{"10EC5650", CODEC_TYPE_RT5650, &snd_soc_card_chtrt5650},
|
||||
};
|
||||
|
||||
static char cht_rt5645_codec_name[16]; /* i2c-<HID>:00 with HID being 8 chars */
|
||||
static char cht_rt5645_codec_name[SND_ACPI_I2C_ID_LEN];
|
||||
static char cht_rt5645_codec_aif_name[12]; /* = "rt5645-aif[1|2]" */
|
||||
static char cht_rt5645_cpu_dai_name[10]; /* = "ssp[0|2]-port" */
|
||||
|
||||
|
|
@ -573,7 +573,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
/* fixup codec name based on HID */
|
||||
i2c_name = snd_soc_acpi_find_name_from_hid(mach->id);
|
||||
i2c_name = acpi_dev_get_first_match_name(mach->id, NULL, -1);
|
||||
if (i2c_name) {
|
||||
snprintf(cht_rt5645_codec_name, sizeof(cht_rt5645_codec_name),
|
||||
"%s%s", "i2c-", i2c_name);
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@
|
|||
|
||||
struct cht_mc_private {
|
||||
struct snd_soc_jack headset;
|
||||
char codec_name[16];
|
||||
char codec_name[SND_ACPI_I2C_ID_LEN];
|
||||
struct clk *mclk;
|
||||
};
|
||||
|
||||
|
|
@ -396,7 +396,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
|
|||
|
||||
/* fixup codec name based on HID */
|
||||
if (mach) {
|
||||
i2c_name = snd_soc_acpi_find_name_from_hid(mach->id);
|
||||
i2c_name = acpi_dev_get_first_match_name(mach->id, NULL, -1);
|
||||
if (i2c_name) {
|
||||
snprintf(drv->codec_name, sizeof(drv->codec_name),
|
||||
"i2c-%s", i2c_name);
|
||||
|
|
|
|||
|
|
@ -190,7 +190,6 @@ skl_tplg_free_pipe_mcps(struct skl *skl, struct skl_module_cfg *mconfig)
|
|||
u8 res_idx = mconfig->res_idx;
|
||||
struct skl_module_res *res = &mconfig->module->resources[res_idx];
|
||||
|
||||
res = &mconfig->module->resources[res_idx];
|
||||
skl->resource.mcps -= res->cps;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -93,6 +93,14 @@ static struct snd_soc_dai_link mxs_sgtl5000_dai[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_widget mxs_sgtl5000_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_MIC("Mic Jack", NULL),
|
||||
SND_SOC_DAPM_LINE("Line In Jack", NULL),
|
||||
SND_SOC_DAPM_HP("Headphone Jack", NULL),
|
||||
SND_SOC_DAPM_SPK("Line Out Jack", NULL),
|
||||
SND_SOC_DAPM_SPK("Ext Spk", NULL),
|
||||
};
|
||||
|
||||
static struct snd_soc_card mxs_sgtl5000 = {
|
||||
.name = "mxs_sgtl5000",
|
||||
.owner = THIS_MODULE,
|
||||
|
|
@ -141,10 +149,23 @@ static int mxs_sgtl5000_probe(struct platform_device *pdev)
|
|||
|
||||
card->dev = &pdev->dev;
|
||||
|
||||
if (of_find_property(np, "audio-routing", NULL)) {
|
||||
card->dapm_widgets = mxs_sgtl5000_dapm_widgets;
|
||||
card->num_dapm_widgets = ARRAY_SIZE(mxs_sgtl5000_dapm_widgets);
|
||||
|
||||
ret = snd_soc_of_parse_audio_routing(card, "audio-routing");
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to parse audio-routing (%d)\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
ret = devm_snd_soc_register_card(&pdev->dev, card);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n",
|
||||
ret);
|
||||
if (ret != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16,39 +16,6 @@
|
|||
|
||||
#include <sound/soc-acpi.h>
|
||||
|
||||
static acpi_status snd_soc_acpi_find_name(acpi_handle handle, u32 level,
|
||||
void *context, void **ret)
|
||||
{
|
||||
struct acpi_device *adev;
|
||||
const char *name = NULL;
|
||||
|
||||
if (acpi_bus_get_device(handle, &adev))
|
||||
return AE_OK;
|
||||
|
||||
if (adev->status.present && adev->status.functional) {
|
||||
name = acpi_dev_name(adev);
|
||||
*(const char **)ret = name;
|
||||
return AE_CTRL_TERMINATE;
|
||||
}
|
||||
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
const char *snd_soc_acpi_find_name_from_hid(const u8 hid[ACPI_ID_LEN])
|
||||
{
|
||||
const char *name = NULL;
|
||||
acpi_status status;
|
||||
|
||||
status = acpi_get_devices(hid, snd_soc_acpi_find_name, NULL,
|
||||
(void **)&name);
|
||||
|
||||
if (ACPI_FAILURE(status) || name[0] == '\0')
|
||||
return NULL;
|
||||
|
||||
return name;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_acpi_find_name_from_hid);
|
||||
|
||||
struct snd_soc_acpi_mach *
|
||||
snd_soc_acpi_find_machine(struct snd_soc_acpi_mach *machines)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -349,120 +349,84 @@ static void soc_init_codec_debugfs(struct snd_soc_component *component)
|
|||
"ASoC: Failed to create codec register debugfs file\n");
|
||||
}
|
||||
|
||||
static ssize_t codec_list_read_file(struct file *file, char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
static int codec_list_seq_show(struct seq_file *m, void *v)
|
||||
{
|
||||
char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
|
||||
ssize_t len, ret = 0;
|
||||
struct snd_soc_codec *codec;
|
||||
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_lock(&client_mutex);
|
||||
|
||||
list_for_each_entry(codec, &codec_list, list) {
|
||||
len = snprintf(buf + ret, PAGE_SIZE - ret, "%s\n",
|
||||
codec->component.name);
|
||||
if (len >= 0)
|
||||
ret += len;
|
||||
if (ret > PAGE_SIZE) {
|
||||
ret = PAGE_SIZE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
list_for_each_entry(codec, &codec_list, list)
|
||||
seq_printf(m, "%s\n", codec->component.name);
|
||||
|
||||
mutex_unlock(&client_mutex);
|
||||
|
||||
if (ret >= 0)
|
||||
ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
|
||||
return 0;
|
||||
}
|
||||
|
||||
kfree(buf);
|
||||
|
||||
return ret;
|
||||
static int codec_list_seq_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, codec_list_seq_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations codec_list_fops = {
|
||||
.read = codec_list_read_file,
|
||||
.llseek = default_llseek,/* read accesses f_pos */
|
||||
.open = codec_list_seq_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static ssize_t dai_list_read_file(struct file *file, char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
static int dai_list_seq_show(struct seq_file *m, void *v)
|
||||
{
|
||||
char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
|
||||
ssize_t len, ret = 0;
|
||||
struct snd_soc_component *component;
|
||||
struct snd_soc_dai *dai;
|
||||
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_lock(&client_mutex);
|
||||
|
||||
list_for_each_entry(component, &component_list, list) {
|
||||
list_for_each_entry(dai, &component->dai_list, list) {
|
||||
len = snprintf(buf + ret, PAGE_SIZE - ret, "%s\n",
|
||||
dai->name);
|
||||
if (len >= 0)
|
||||
ret += len;
|
||||
if (ret > PAGE_SIZE) {
|
||||
ret = PAGE_SIZE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
list_for_each_entry(component, &component_list, list)
|
||||
list_for_each_entry(dai, &component->dai_list, list)
|
||||
seq_printf(m, "%s\n", dai->name);
|
||||
|
||||
mutex_unlock(&client_mutex);
|
||||
|
||||
ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
|
||||
return 0;
|
||||
}
|
||||
|
||||
kfree(buf);
|
||||
|
||||
return ret;
|
||||
static int dai_list_seq_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, dai_list_seq_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations dai_list_fops = {
|
||||
.read = dai_list_read_file,
|
||||
.llseek = default_llseek,/* read accesses f_pos */
|
||||
.open = dai_list_seq_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static ssize_t platform_list_read_file(struct file *file,
|
||||
char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
static int platform_list_seq_show(struct seq_file *m, void *v)
|
||||
{
|
||||
char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
|
||||
ssize_t len, ret = 0;
|
||||
struct snd_soc_platform *platform;
|
||||
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_lock(&client_mutex);
|
||||
|
||||
list_for_each_entry(platform, &platform_list, list) {
|
||||
len = snprintf(buf + ret, PAGE_SIZE - ret, "%s\n",
|
||||
platform->component.name);
|
||||
if (len >= 0)
|
||||
ret += len;
|
||||
if (ret > PAGE_SIZE) {
|
||||
ret = PAGE_SIZE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
list_for_each_entry(platform, &platform_list, list)
|
||||
seq_printf(m, "%s\n", platform->component.name);
|
||||
|
||||
mutex_unlock(&client_mutex);
|
||||
|
||||
ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
|
||||
return 0;
|
||||
}
|
||||
|
||||
kfree(buf);
|
||||
|
||||
return ret;
|
||||
static int platform_list_seq_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, platform_list_seq_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations platform_list_fops = {
|
||||
.read = platform_list_read_file,
|
||||
.llseek = default_llseek,/* read accesses f_pos */
|
||||
.open = platform_list_seq_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static void soc_init_card_debugfs(struct snd_soc_card *card)
|
||||
|
|
@ -491,7 +455,6 @@ static void soc_cleanup_card_debugfs(struct snd_soc_card *card)
|
|||
debugfs_remove_recursive(card->debugfs_card_root);
|
||||
}
|
||||
|
||||
|
||||
static void snd_soc_debugfs_init(void)
|
||||
{
|
||||
snd_soc_debugfs_root = debugfs_create_dir("asoc", NULL);
|
||||
|
|
@ -598,6 +561,7 @@ struct snd_soc_component *snd_soc_rtdcom_lookup(struct snd_soc_pcm_runtime *rtd,
|
|||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_rtdcom_lookup);
|
||||
|
||||
struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card,
|
||||
const char *dai_link, int stream)
|
||||
|
|
|
|||
|
|
@ -34,6 +34,10 @@ int snd_soc_component_read(struct snd_soc_component *component,
|
|||
ret = regmap_read(component->regmap, reg, val);
|
||||
else if (component->read)
|
||||
ret = component->read(component, reg, val);
|
||||
else if (component->driver->read) {
|
||||
*val = component->driver->read(component, reg);
|
||||
ret = 0;
|
||||
}
|
||||
else
|
||||
ret = -EIO;
|
||||
|
||||
|
|
@ -70,6 +74,8 @@ int snd_soc_component_write(struct snd_soc_component *component,
|
|||
return regmap_write(component->regmap, reg, val);
|
||||
else if (component->write)
|
||||
return component->write(component, reg, val);
|
||||
else if (component->driver->write)
|
||||
return component->driver->write(component, reg, val);
|
||||
else
|
||||
return -EIO;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue