Commit faa9c2a7 authored by Mark Brown's avatar Mark Brown

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

parents e041e469 72222be3
...@@ -401,13 +401,19 @@ static const __devinitconst struct reg_default wm1811_reva_patch[] = { ...@@ -401,13 +401,19 @@ static const __devinitconst struct reg_default wm1811_reva_patch[] = {
*/ */
static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq) static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq)
{ {
struct wm8994_pdata *pdata = wm8994->dev->platform_data; struct wm8994_pdata *pdata;
struct regmap_config *regmap_config; struct regmap_config *regmap_config;
const struct reg_default *regmap_patch = NULL; const struct reg_default *regmap_patch = NULL;
const char *devname; const char *devname;
int ret, i, patch_regs; int ret, i, patch_regs;
int pulls = 0; int pulls = 0;
if (dev_get_platdata(wm8994->dev)) {
pdata = dev_get_platdata(wm8994->dev);
wm8994->pdata = *pdata;
}
pdata = &wm8994->pdata;
dev_set_drvdata(wm8994->dev, wm8994); dev_set_drvdata(wm8994->dev, wm8994);
/* Add the on-chip regulators first for bootstrapping */ /* Add the on-chip regulators first for bootstrapping */
...@@ -604,24 +610,21 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq) ...@@ -604,24 +610,21 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq)
} }
} }
if (pdata) { wm8994->irq_base = pdata->irq_base;
wm8994->irq_base = pdata->irq_base; wm8994->gpio_base = pdata->gpio_base;
wm8994->gpio_base = pdata->gpio_base;
/* GPIO configuration is only applied if it's non-zero */
/* GPIO configuration is only applied if it's non-zero */ for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) {
for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) { if (pdata->gpio_defaults[i]) {
if (pdata->gpio_defaults[i]) { wm8994_set_bits(wm8994, WM8994_GPIO_1 + i,
wm8994_set_bits(wm8994, WM8994_GPIO_1 + i, 0xffff, pdata->gpio_defaults[i]);
0xffff,
pdata->gpio_defaults[i]);
}
} }
}
wm8994->ldo_ena_always_driven = pdata->ldo_ena_always_driven; wm8994->ldo_ena_always_driven = pdata->ldo_ena_always_driven;
if (pdata->spkmode_pu) if (pdata->spkmode_pu)
pulls |= WM8994_SPKMODE_PU; pulls |= WM8994_SPKMODE_PU;
}
/* Disable unneeded pulls */ /* Disable unneeded pulls */
wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2, wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2,
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/mfd/wm8994/pdata.h>
enum wm8994_type { enum wm8994_type {
WM8994 = 0, WM8994 = 0,
WM8958 = 1, WM8958 = 1,
...@@ -55,6 +57,8 @@ struct regulator_bulk_data; ...@@ -55,6 +57,8 @@ struct regulator_bulk_data;
struct wm8994 { struct wm8994 {
struct mutex irq_lock; struct mutex irq_lock;
struct wm8994_pdata pdata;
enum wm8994_type type; enum wm8994_type type;
int revision; int revision;
int cust_id; int cust_id;
......
...@@ -176,6 +176,11 @@ struct wm8994_pdata { ...@@ -176,6 +176,11 @@ struct wm8994_pdata {
unsigned int lineout1fb:1; unsigned int lineout1fb:1;
unsigned int lineout2fb:1; unsigned int lineout2fb:1;
/* Delay between detecting a jack and starting microphone
* detect (specified in ms)
*/
int micdet_delay;
/* IRQ for microphone detection if brought out directly as a /* IRQ for microphone detection if brought out directly as a
* signal. * signal.
*/ */
......
...@@ -195,7 +195,7 @@ static int wm8958_dsp2_fw(struct snd_soc_codec *codec, const char *name, ...@@ -195,7 +195,7 @@ static int wm8958_dsp2_fw(struct snd_soc_codec *codec, const char *name,
static void wm8958_dsp_start_mbc(struct snd_soc_codec *codec, int path) static void wm8958_dsp_start_mbc(struct snd_soc_codec *codec, int path)
{ {
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
struct wm8994_pdata *pdata = wm8994->pdata; struct wm8994 *control = wm8994->wm8994;
int i; int i;
/* If the DSP is already running then noop */ /* If the DSP is already running then noop */
...@@ -210,9 +210,9 @@ static void wm8958_dsp_start_mbc(struct snd_soc_codec *codec, int path) ...@@ -210,9 +210,9 @@ static void wm8958_dsp_start_mbc(struct snd_soc_codec *codec, int path)
WM8958_DSP2_ENA, WM8958_DSP2_ENA); WM8958_DSP2_ENA, WM8958_DSP2_ENA);
/* If we've got user supplied MBC settings use them */ /* If we've got user supplied MBC settings use them */
if (pdata && pdata->num_mbc_cfgs) { if (control->pdata.num_mbc_cfgs) {
struct wm8958_mbc_cfg *cfg struct wm8958_mbc_cfg *cfg
= &pdata->mbc_cfgs[wm8994->mbc_cfg]; = &control->pdata.mbc_cfgs[wm8994->mbc_cfg];
for (i = 0; i < ARRAY_SIZE(cfg->coeff_regs); i++) for (i = 0; i < ARRAY_SIZE(cfg->coeff_regs); i++)
snd_soc_write(codec, i + WM8958_MBC_BAND_1_K_1, snd_soc_write(codec, i + WM8958_MBC_BAND_1_K_1,
...@@ -239,7 +239,7 @@ static void wm8958_dsp_start_mbc(struct snd_soc_codec *codec, int path) ...@@ -239,7 +239,7 @@ static void wm8958_dsp_start_mbc(struct snd_soc_codec *codec, int path)
static void wm8958_dsp_start_vss(struct snd_soc_codec *codec, int path) static void wm8958_dsp_start_vss(struct snd_soc_codec *codec, int path)
{ {
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
struct wm8994_pdata *pdata = wm8994->pdata; struct wm8994 *control = wm8994->wm8994;
int i, ena; int i, ena;
if (wm8994->mbc_vss) if (wm8994->mbc_vss)
...@@ -249,26 +249,26 @@ static void wm8958_dsp_start_vss(struct snd_soc_codec *codec, int path) ...@@ -249,26 +249,26 @@ static void wm8958_dsp_start_vss(struct snd_soc_codec *codec, int path)
WM8958_DSP2_ENA, WM8958_DSP2_ENA); WM8958_DSP2_ENA, WM8958_DSP2_ENA);
/* If we've got user supplied settings use them */ /* If we've got user supplied settings use them */
if (pdata && pdata->num_mbc_cfgs) { if (control->pdata.num_mbc_cfgs) {
struct wm8958_mbc_cfg *cfg struct wm8958_mbc_cfg *cfg
= &pdata->mbc_cfgs[wm8994->mbc_cfg]; = &control->pdata.mbc_cfgs[wm8994->mbc_cfg];
for (i = 0; i < ARRAY_SIZE(cfg->combined_regs); i++) for (i = 0; i < ARRAY_SIZE(cfg->combined_regs); i++)
snd_soc_write(codec, i + 0x2800, snd_soc_write(codec, i + 0x2800,
cfg->combined_regs[i]); cfg->combined_regs[i]);
} }
if (pdata && pdata->num_vss_cfgs) { if (control->pdata.num_vss_cfgs) {
struct wm8958_vss_cfg *cfg struct wm8958_vss_cfg *cfg
= &pdata->vss_cfgs[wm8994->vss_cfg]; = &control->pdata.vss_cfgs[wm8994->vss_cfg];
for (i = 0; i < ARRAY_SIZE(cfg->regs); i++) for (i = 0; i < ARRAY_SIZE(cfg->regs); i++)
snd_soc_write(codec, i + 0x2600, cfg->regs[i]); snd_soc_write(codec, i + 0x2600, cfg->regs[i]);
} }
if (pdata && pdata->num_vss_hpf_cfgs) { if (control->pdata.num_vss_hpf_cfgs) {
struct wm8958_vss_hpf_cfg *cfg struct wm8958_vss_hpf_cfg *cfg
= &pdata->vss_hpf_cfgs[wm8994->vss_hpf_cfg]; = &control->pdata.vss_hpf_cfgs[wm8994->vss_hpf_cfg];
for (i = 0; i < ARRAY_SIZE(cfg->regs); i++) for (i = 0; i < ARRAY_SIZE(cfg->regs); i++)
snd_soc_write(codec, i + 0x2400, cfg->regs[i]); snd_soc_write(codec, i + 0x2400, cfg->regs[i]);
...@@ -300,7 +300,7 @@ static void wm8958_dsp_start_vss(struct snd_soc_codec *codec, int path) ...@@ -300,7 +300,7 @@ static void wm8958_dsp_start_vss(struct snd_soc_codec *codec, int path)
static void wm8958_dsp_start_enh_eq(struct snd_soc_codec *codec, int path) static void wm8958_dsp_start_enh_eq(struct snd_soc_codec *codec, int path)
{ {
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
struct wm8994_pdata *pdata = wm8994->pdata; struct wm8994 *control = wm8994->wm8994;
int i; int i;
wm8958_dsp2_fw(codec, "ENH_EQ", wm8994->enh_eq, false); wm8958_dsp2_fw(codec, "ENH_EQ", wm8994->enh_eq, false);
...@@ -309,9 +309,9 @@ static void wm8958_dsp_start_enh_eq(struct snd_soc_codec *codec, int path) ...@@ -309,9 +309,9 @@ static void wm8958_dsp_start_enh_eq(struct snd_soc_codec *codec, int path)
WM8958_DSP2_ENA, WM8958_DSP2_ENA); WM8958_DSP2_ENA, WM8958_DSP2_ENA);
/* If we've got user supplied settings use them */ /* If we've got user supplied settings use them */
if (pdata && pdata->num_enh_eq_cfgs) { if (control->pdata.num_enh_eq_cfgs) {
struct wm8958_enh_eq_cfg *cfg struct wm8958_enh_eq_cfg *cfg
= &pdata->enh_eq_cfgs[wm8994->enh_eq_cfg]; = &control->pdata.enh_eq_cfgs[wm8994->enh_eq_cfg];
for (i = 0; i < ARRAY_SIZE(cfg->regs); i++) for (i = 0; i < ARRAY_SIZE(cfg->regs); i++)
snd_soc_write(codec, i + 0x2200, snd_soc_write(codec, i + 0x2200,
...@@ -458,7 +458,7 @@ static int wm8958_put_mbc_enum(struct snd_kcontrol *kcontrol, ...@@ -458,7 +458,7 @@ static int wm8958_put_mbc_enum(struct snd_kcontrol *kcontrol,
{ {
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
struct wm8994_pdata *pdata = wm8994->pdata; struct wm8994 *control = wm8994->wm8994;
int value = ucontrol->value.integer.value[0]; int value = ucontrol->value.integer.value[0];
int reg; int reg;
...@@ -467,7 +467,7 @@ static int wm8958_put_mbc_enum(struct snd_kcontrol *kcontrol, ...@@ -467,7 +467,7 @@ static int wm8958_put_mbc_enum(struct snd_kcontrol *kcontrol,
if (reg < 0 || reg & WM8958_DSP2CLK_ENA) if (reg < 0 || reg & WM8958_DSP2CLK_ENA)
return -EBUSY; return -EBUSY;
if (value >= pdata->num_mbc_cfgs) if (value >= control->pdata.num_mbc_cfgs)
return -EINVAL; return -EINVAL;
wm8994->mbc_cfg = value; wm8994->mbc_cfg = value;
...@@ -548,7 +548,7 @@ static int wm8958_put_vss_enum(struct snd_kcontrol *kcontrol, ...@@ -548,7 +548,7 @@ static int wm8958_put_vss_enum(struct snd_kcontrol *kcontrol,
{ {
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
struct wm8994_pdata *pdata = wm8994->pdata; struct wm8994 *control = wm8994->wm8994;
int value = ucontrol->value.integer.value[0]; int value = ucontrol->value.integer.value[0];
int reg; int reg;
...@@ -557,7 +557,7 @@ static int wm8958_put_vss_enum(struct snd_kcontrol *kcontrol, ...@@ -557,7 +557,7 @@ static int wm8958_put_vss_enum(struct snd_kcontrol *kcontrol,
if (reg < 0 || reg & WM8958_DSP2CLK_ENA) if (reg < 0 || reg & WM8958_DSP2CLK_ENA)
return -EBUSY; return -EBUSY;
if (value >= pdata->num_vss_cfgs) if (value >= control->pdata.num_vss_cfgs)
return -EINVAL; return -EINVAL;
wm8994->vss_cfg = value; wm8994->vss_cfg = value;
...@@ -581,7 +581,7 @@ static int wm8958_put_vss_hpf_enum(struct snd_kcontrol *kcontrol, ...@@ -581,7 +581,7 @@ static int wm8958_put_vss_hpf_enum(struct snd_kcontrol *kcontrol,
{ {
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
struct wm8994_pdata *pdata = wm8994->pdata; struct wm8994 *control = wm8994->wm8994;
int value = ucontrol->value.integer.value[0]; int value = ucontrol->value.integer.value[0];
int reg; int reg;
...@@ -590,7 +590,7 @@ static int wm8958_put_vss_hpf_enum(struct snd_kcontrol *kcontrol, ...@@ -590,7 +590,7 @@ static int wm8958_put_vss_hpf_enum(struct snd_kcontrol *kcontrol,
if (reg < 0 || reg & WM8958_DSP2CLK_ENA) if (reg < 0 || reg & WM8958_DSP2CLK_ENA)
return -EBUSY; return -EBUSY;
if (value >= pdata->num_vss_hpf_cfgs) if (value >= control->pdata.num_vss_hpf_cfgs)
return -EINVAL; return -EINVAL;
wm8994->vss_hpf_cfg = value; wm8994->vss_hpf_cfg = value;
...@@ -748,7 +748,7 @@ static int wm8958_put_enh_eq_enum(struct snd_kcontrol *kcontrol, ...@@ -748,7 +748,7 @@ static int wm8958_put_enh_eq_enum(struct snd_kcontrol *kcontrol,
{ {
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
struct wm8994_pdata *pdata = wm8994->pdata; struct wm8994 *control = wm8994->wm8994;
int value = ucontrol->value.integer.value[0]; int value = ucontrol->value.integer.value[0];
int reg; int reg;
...@@ -757,7 +757,7 @@ static int wm8958_put_enh_eq_enum(struct snd_kcontrol *kcontrol, ...@@ -757,7 +757,7 @@ static int wm8958_put_enh_eq_enum(struct snd_kcontrol *kcontrol,
if (reg < 0 || reg & WM8958_DSP2CLK_ENA) if (reg < 0 || reg & WM8958_DSP2CLK_ENA)
return -EBUSY; return -EBUSY;
if (value >= pdata->num_enh_eq_cfgs) if (value >= control->pdata.num_enh_eq_cfgs)
return -EINVAL; return -EINVAL;
wm8994->enh_eq_cfg = value; wm8994->enh_eq_cfg = value;
...@@ -883,13 +883,6 @@ static void wm8958_mbc_vss_loaded(const struct firmware *fw, void *context) ...@@ -883,13 +883,6 @@ static void wm8958_mbc_vss_loaded(const struct firmware *fw, void *context)
wm8994->mbc_vss = fw; wm8994->mbc_vss = fw;
mutex_unlock(&codec->mutex); mutex_unlock(&codec->mutex);
} }
/* We can't have more than one request outstanding at once so
* we daisy chain.
*/
request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
"wm8958_enh_eq.wfw", codec->dev, GFP_KERNEL,
codec, wm8958_enh_eq_loaded);
} }
static void wm8958_mbc_loaded(const struct firmware *fw, void *context) static void wm8958_mbc_loaded(const struct firmware *fw, void *context)
...@@ -897,25 +890,18 @@ static void wm8958_mbc_loaded(const struct firmware *fw, void *context) ...@@ -897,25 +890,18 @@ static void wm8958_mbc_loaded(const struct firmware *fw, void *context)
struct snd_soc_codec *codec = context; struct snd_soc_codec *codec = context;
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
if (wm8958_dsp2_fw(codec, "MBC", fw, true) != 0) if (fw && (wm8958_dsp2_fw(codec, "MBC", fw, true) == 0)) {
return; mutex_lock(&codec->mutex);
wm8994->mbc = fw;
mutex_lock(&codec->mutex); mutex_unlock(&codec->mutex);
wm8994->mbc = fw; }
mutex_unlock(&codec->mutex);
/* We can't have more than one request outstanding at once so
* we daisy chain.
*/
request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
"wm8958_mbc_vss.wfw", codec->dev, GFP_KERNEL,
codec, wm8958_mbc_vss_loaded);
} }
void wm8958_dsp2_init(struct snd_soc_codec *codec) void wm8958_dsp2_init(struct snd_soc_codec *codec)
{ {
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
struct wm8994_pdata *pdata = wm8994->pdata; struct wm8994 *control = wm8994->wm8994;
struct wm8994_pdata *pdata = &control->pdata;
int ret, i; int ret, i;
wm8994->dsp_active = -1; wm8994->dsp_active = -1;
...@@ -932,9 +918,12 @@ void wm8958_dsp2_init(struct snd_soc_codec *codec) ...@@ -932,9 +918,12 @@ void wm8958_dsp2_init(struct snd_soc_codec *codec)
request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG, request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
"wm8958_mbc.wfw", codec->dev, GFP_KERNEL, "wm8958_mbc.wfw", codec->dev, GFP_KERNEL,
codec, wm8958_mbc_loaded); codec, wm8958_mbc_loaded);
request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
if (!pdata) "wm8958_mbc_vss.wfw", codec->dev, GFP_KERNEL,
return; codec, wm8958_mbc_vss_loaded);
request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
"wm8958_enh_eq.wfw", codec->dev, GFP_KERNEL,
codec, wm8958_enh_eq_loaded);
if (pdata->num_mbc_cfgs) { if (pdata->num_mbc_cfgs) {
struct snd_kcontrol_new control[] = { struct snd_kcontrol_new control[] = {
......
This diff is collapsed.
...@@ -143,7 +143,6 @@ struct wm8994_priv { ...@@ -143,7 +143,6 @@ struct wm8994_priv {
int micdet_irq; int micdet_irq;
int revision; int revision;
struct wm8994_pdata *pdata;
unsigned int aif1clk_enable:1; unsigned int aif1clk_enable:1;
unsigned int aif2clk_enable:1; unsigned int aif2clk_enable:1;
......
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