mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
Merge remote-tracking branch 'asoc/topic/intel' into asoc-next
This commit is contained in:
@@ -16,6 +16,23 @@ Optional properties:
|
||||
- realtek,dmic-en
|
||||
Boolean. true if dmic is used.
|
||||
|
||||
- realtek,jack-detect-source
|
||||
u32. Valid values:
|
||||
1: Use JD1_1 pin for jack-dectect
|
||||
2: Use JD1_2 pin for jack-dectect
|
||||
3: Use JD2 pin for jack-dectect
|
||||
|
||||
- realtek,over-current-threshold-microamp
|
||||
u32, micbias over-current detection threshold in µA, valid values are
|
||||
600, 1500 and 2000µA.
|
||||
|
||||
- realtek,over-current-scale-factor
|
||||
u32, micbias over-current detection scale-factor, valid values are:
|
||||
0: Scale current by 0.5
|
||||
1: Scale current by 0.75
|
||||
2: Scale current by 1.0
|
||||
3: Scale current by 1.5
|
||||
|
||||
Pins on the device (for linking into audio routes) for RT5651:
|
||||
|
||||
* DMIC L1
|
||||
|
||||
@@ -135,6 +135,7 @@ struct sst_platform_info {
|
||||
const struct sst_res_info *res_info;
|
||||
const struct sst_lib_dnld_info *lib_info;
|
||||
const char *platform;
|
||||
bool streams_lost_on_suspend;
|
||||
};
|
||||
int add_sst_platform_device(void);
|
||||
#endif
|
||||
|
||||
@@ -146,6 +146,8 @@ int snd_hdac_codec_write(struct hdac_device *hdac, hda_nid_t nid,
|
||||
int flags, unsigned int verb, unsigned int parm);
|
||||
bool snd_hdac_check_power_state(struct hdac_device *hdac,
|
||||
hda_nid_t nid, unsigned int target_state);
|
||||
unsigned int snd_hdac_sync_power_state(struct hdac_device *hdac,
|
||||
hda_nid_t nid, unsigned int target_state);
|
||||
/**
|
||||
* snd_hdac_read_parm - read a codec parameter
|
||||
* @codec: the codec object
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
#ifndef __LINUX_SND_RT5651_H
|
||||
#define __LINUX_SND_RT5651_H
|
||||
|
||||
/*
|
||||
* Note these MUST match the values from the DT binding:
|
||||
* Documentation/devicetree/bindings/sound/rt5651.txt
|
||||
*/
|
||||
enum rt5651_jd_src {
|
||||
RT5651_JD_NULL,
|
||||
RT5651_JD1_1,
|
||||
@@ -18,12 +22,15 @@ enum rt5651_jd_src {
|
||||
RT5651_JD2,
|
||||
};
|
||||
|
||||
struct rt5651_platform_data {
|
||||
/* IN2 can optionally be differential */
|
||||
bool in2_diff;
|
||||
|
||||
bool dmic_en;
|
||||
enum rt5651_jd_src jd_src;
|
||||
/*
|
||||
* Note these MUST match the values from the DT binding:
|
||||
* Documentation/devicetree/bindings/sound/rt5651.txt
|
||||
*/
|
||||
enum rt5651_ovcd_sf {
|
||||
RT5651_OVCD_SF_0P5,
|
||||
RT5651_OVCD_SF_0P75,
|
||||
RT5651_OVCD_SF_1P0,
|
||||
RT5651_OVCD_SF_1P5,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
@@ -1064,3 +1065,37 @@ bool snd_hdac_check_power_state(struct hdac_device *hdac,
|
||||
return (state == target_state);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_check_power_state);
|
||||
/**
|
||||
* snd_hdac_sync_power_state - wait until actual power state matches
|
||||
* with the target state
|
||||
*
|
||||
* @hdac: the HDAC device
|
||||
* @nid: NID to send the command
|
||||
* @target_state: target state to check for
|
||||
*
|
||||
* Return power state or PS_ERROR if codec rejects GET verb.
|
||||
*/
|
||||
unsigned int snd_hdac_sync_power_state(struct hdac_device *codec,
|
||||
hda_nid_t nid, unsigned int power_state)
|
||||
{
|
||||
unsigned long end_time = jiffies + msecs_to_jiffies(500);
|
||||
unsigned int state, actual_state, count;
|
||||
|
||||
for (count = 0; count < 500; count++) {
|
||||
state = snd_hdac_codec_read(codec, nid, 0,
|
||||
AC_VERB_GET_POWER_STATE, 0);
|
||||
if (state & AC_PWRST_ERROR) {
|
||||
msleep(20);
|
||||
break;
|
||||
}
|
||||
actual_state = (state >> 4) & 0x0f;
|
||||
if (actual_state == power_state)
|
||||
break;
|
||||
if (time_after_eq(jiffies, end_time))
|
||||
break;
|
||||
/* wait until the codec reachs to the target state */
|
||||
msleep(1);
|
||||
}
|
||||
return state;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_sync_power_state);
|
||||
|
||||
@@ -2702,32 +2702,6 @@ void snd_hda_codec_set_power_to_all(struct hda_codec *codec, hda_nid_t fg,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hda_codec_set_power_to_all);
|
||||
|
||||
/*
|
||||
* wait until the state is reached, returns the current state
|
||||
*/
|
||||
static unsigned int hda_sync_power_state(struct hda_codec *codec,
|
||||
hda_nid_t fg,
|
||||
unsigned int power_state)
|
||||
{
|
||||
unsigned long end_time = jiffies + msecs_to_jiffies(500);
|
||||
unsigned int state, actual_state;
|
||||
|
||||
for (;;) {
|
||||
state = snd_hda_codec_read(codec, fg, 0,
|
||||
AC_VERB_GET_POWER_STATE, 0);
|
||||
if (state & AC_PWRST_ERROR)
|
||||
break;
|
||||
actual_state = (state >> 4) & 0x0f;
|
||||
if (actual_state == power_state)
|
||||
break;
|
||||
if (time_after_eq(jiffies, end_time))
|
||||
break;
|
||||
/* wait until the codec reachs to the target state */
|
||||
msleep(1);
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_hda_codec_eapd_power_filter - A power filter callback for EAPD
|
||||
* @codec: the HDA codec
|
||||
@@ -2790,7 +2764,7 @@ static unsigned int hda_set_power_state(struct hda_codec *codec,
|
||||
state);
|
||||
snd_hda_codec_set_power_to_all(codec, fg, power_state);
|
||||
}
|
||||
state = hda_sync_power_state(codec, fg, power_state);
|
||||
state = snd_hda_sync_power_state(codec, fg, power_state);
|
||||
if (!(state & AC_PWRST_ERROR))
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -622,7 +622,11 @@ snd_hda_check_power_state(struct hda_codec *codec, hda_nid_t nid,
|
||||
{
|
||||
return snd_hdac_check_power_state(&codec->core, nid, target_state);
|
||||
}
|
||||
|
||||
static inline bool snd_hda_sync_power_state(struct hda_codec *codec,
|
||||
hda_nid_t nid, unsigned int target_state)
|
||||
{
|
||||
return snd_hdac_sync_power_state(&codec->core, nid, target_state);
|
||||
}
|
||||
unsigned int snd_hda_codec_eapd_power_filter(struct hda_codec *codec,
|
||||
hda_nid_t nid,
|
||||
unsigned int power_state);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -189,7 +189,7 @@ enum da7219_aad_event_regs {
|
||||
|
||||
/* Private data */
|
||||
struct da7219_aad_priv {
|
||||
struct snd_soc_codec *codec;
|
||||
struct snd_soc_component *component;
|
||||
int irq;
|
||||
|
||||
u8 micbias_pulse_lvl;
|
||||
@@ -206,14 +206,14 @@ struct da7219_aad_priv {
|
||||
};
|
||||
|
||||
/* AAD control */
|
||||
void da7219_aad_jack_det(struct snd_soc_codec *codec, struct snd_soc_jack *jack);
|
||||
void da7219_aad_jack_det(struct snd_soc_component *component, struct snd_soc_jack *jack);
|
||||
|
||||
/* Suspend/Resume */
|
||||
void da7219_aad_suspend(struct snd_soc_codec *codec);
|
||||
void da7219_aad_resume(struct snd_soc_codec *codec);
|
||||
void da7219_aad_suspend(struct snd_soc_component *component);
|
||||
void da7219_aad_resume(struct snd_soc_component *component);
|
||||
|
||||
/* Init/Exit */
|
||||
int da7219_aad_init(struct snd_soc_codec *codec);
|
||||
void da7219_aad_exit(struct snd_soc_codec *codec);
|
||||
int da7219_aad_init(struct snd_soc_component *component);
|
||||
void da7219_aad_exit(struct snd_soc_component *component);
|
||||
|
||||
#endif /* __DA7219_AAD_H */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -822,6 +822,6 @@ struct da7219_priv {
|
||||
u8 gain_ramp_ctrl;
|
||||
};
|
||||
|
||||
int da7219_set_pll(struct snd_soc_codec *codec, int source, unsigned int fout);
|
||||
int da7219_set_pll(struct snd_soc_component *component, int source, unsigned int fout);
|
||||
|
||||
#endif /* __DA7219_H */
|
||||
|
||||
@@ -718,10 +718,22 @@ static struct hdac_hdmi_pcm *hdac_hdmi_get_pcm(struct hdac_ext_device *edev,
|
||||
static void hdac_hdmi_set_power_state(struct hdac_ext_device *edev,
|
||||
hda_nid_t nid, unsigned int pwr_state)
|
||||
{
|
||||
int count;
|
||||
unsigned int state;
|
||||
|
||||
if (get_wcaps(&edev->hdev, nid) & AC_WCAP_POWER) {
|
||||
if (!snd_hdac_check_power_state(&edev->hdev, nid, pwr_state))
|
||||
snd_hdac_codec_write(&edev->hdev, nid, 0,
|
||||
AC_VERB_SET_POWER_STATE, pwr_state);
|
||||
if (!snd_hdac_check_power_state(&edev->hdev, nid, pwr_state)) {
|
||||
for (count = 0; count < 10; count++) {
|
||||
snd_hdac_codec_read(&edev->hdev, nid, 0,
|
||||
AC_VERB_SET_POWER_STATE,
|
||||
pwr_state);
|
||||
state = snd_hdac_sync_power_state(&edev->hdev,
|
||||
nid, pwr_state);
|
||||
if (!(state & AC_PWRST_ERROR))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1536,7 +1548,7 @@ static void hdac_hdmi_eld_notify_cb(void *aptr, int port, int pipe)
|
||||
struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(&edev->hdev);
|
||||
struct hdac_hdmi_pin *pin = NULL;
|
||||
struct hdac_hdmi_port *hport = NULL;
|
||||
struct snd_soc_codec *codec = edev->scodec;
|
||||
struct snd_soc_component *component = edev->scodec;
|
||||
int i;
|
||||
|
||||
/* Don't know how this mapping is derived */
|
||||
@@ -1551,7 +1563,7 @@ static void hdac_hdmi_eld_notify_cb(void *aptr, int port, int pipe)
|
||||
* connection states are updated in anyway at the end of the resume,
|
||||
* we can skip it when received during PM process.
|
||||
*/
|
||||
if (snd_power_get_state(codec->component.card->snd_card) !=
|
||||
if (snd_power_get_state(component->card->snd_card) !=
|
||||
SNDRV_CTL_POWER_D0)
|
||||
return;
|
||||
|
||||
@@ -1609,10 +1621,10 @@ static int create_fill_jack_kcontrols(struct snd_soc_card *card,
|
||||
char kc_name[NAME_SIZE], xname[NAME_SIZE];
|
||||
char *name;
|
||||
int i = 0, j;
|
||||
struct snd_soc_codec *codec = edev->scodec;
|
||||
struct snd_soc_component *component = edev->scodec;
|
||||
struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(&edev->hdev);
|
||||
|
||||
kc = devm_kcalloc(codec->dev, hdmi->num_ports,
|
||||
kc = devm_kcalloc(component->dev, hdmi->num_ports,
|
||||
sizeof(*kc), GFP_KERNEL);
|
||||
|
||||
if (!kc)
|
||||
@@ -1622,11 +1634,11 @@ static int create_fill_jack_kcontrols(struct snd_soc_card *card,
|
||||
for (j = 0; j < pin->num_ports; j++) {
|
||||
snprintf(xname, sizeof(xname), "hif%d-%d Jack",
|
||||
pin->nid, pin->ports[j].id);
|
||||
name = devm_kstrdup(codec->dev, xname, GFP_KERNEL);
|
||||
name = devm_kstrdup(component->dev, xname, GFP_KERNEL);
|
||||
if (!name)
|
||||
return -ENOMEM;
|
||||
snprintf(kc_name, sizeof(kc_name), "%s Switch", xname);
|
||||
kc[i].name = devm_kstrdup(codec->dev, kc_name,
|
||||
kc[i].name = devm_kstrdup(component->dev, kc_name,
|
||||
GFP_KERNEL);
|
||||
if (!kc[i].name)
|
||||
return -ENOMEM;
|
||||
@@ -1644,10 +1656,10 @@ static int create_fill_jack_kcontrols(struct snd_soc_card *card,
|
||||
return snd_soc_add_card_controls(card, kc, i);
|
||||
}
|
||||
|
||||
int hdac_hdmi_jack_port_init(struct snd_soc_codec *codec,
|
||||
int hdac_hdmi_jack_port_init(struct snd_soc_component *component,
|
||||
struct snd_soc_dapm_context *dapm)
|
||||
{
|
||||
struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec);
|
||||
struct hdac_ext_device *edev = snd_soc_component_get_drvdata(component);
|
||||
struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(&edev->hdev);
|
||||
struct hdac_hdmi_pin *pin;
|
||||
struct snd_soc_dapm_widget *widgets;
|
||||
@@ -1722,8 +1734,8 @@ EXPORT_SYMBOL_GPL(hdac_hdmi_jack_port_init);
|
||||
int hdac_hdmi_jack_init(struct snd_soc_dai *dai, int device,
|
||||
struct snd_soc_jack *jack)
|
||||
{
|
||||
struct snd_soc_codec *codec = dai->codec;
|
||||
struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec);
|
||||
struct snd_soc_component *component = dai->component;
|
||||
struct hdac_ext_device *edev = snd_soc_component_get_drvdata(component);
|
||||
struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(&edev->hdev);
|
||||
struct hdac_hdmi_pcm *pcm;
|
||||
struct snd_pcm *snd_pcm;
|
||||
@@ -1784,16 +1796,16 @@ static void hdac_hdmi_present_sense_all_pins(struct hdac_ext_device *edev,
|
||||
}
|
||||
}
|
||||
|
||||
static int hdmi_codec_probe(struct snd_soc_codec *codec)
|
||||
static int hdmi_codec_probe(struct snd_soc_component *component)
|
||||
{
|
||||
struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec);
|
||||
struct hdac_ext_device *edev = snd_soc_component_get_drvdata(component);
|
||||
struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(&edev->hdev);
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(&codec->component);
|
||||
snd_soc_component_get_dapm(component);
|
||||
struct hdac_ext_link *hlink = NULL;
|
||||
int ret;
|
||||
|
||||
edev->scodec = codec;
|
||||
edev->scodec = component;
|
||||
|
||||
/*
|
||||
* hold the ref while we probe, also no need to drop the ref on
|
||||
@@ -1834,12 +1846,11 @@ static int hdmi_codec_probe(struct snd_soc_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hdmi_codec_remove(struct snd_soc_codec *codec)
|
||||
static void hdmi_codec_remove(struct snd_soc_component *component)
|
||||
{
|
||||
struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec);
|
||||
struct hdac_ext_device *edev = snd_soc_component_get_drvdata(component);
|
||||
|
||||
pm_runtime_disable(&edev->hdev.dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
@@ -1891,10 +1902,12 @@ static void hdmi_codec_complete(struct device *dev)
|
||||
#define hdmi_codec_complete NULL
|
||||
#endif
|
||||
|
||||
static const struct snd_soc_codec_driver hdmi_hda_codec = {
|
||||
.probe = hdmi_codec_probe,
|
||||
.remove = hdmi_codec_remove,
|
||||
.idle_bias_off = true,
|
||||
static const struct snd_soc_component_driver hdmi_hda_codec = {
|
||||
.probe = hdmi_codec_probe,
|
||||
.remove = hdmi_codec_remove,
|
||||
.use_pmdown_time = 1,
|
||||
.endianness = 1,
|
||||
.non_legacy_dai_naming = 1,
|
||||
};
|
||||
|
||||
static void hdac_hdmi_get_chmap(struct hdac_device *hdev, int pcm_idx,
|
||||
@@ -2042,7 +2055,7 @@ static int hdac_hdmi_dev_probe(struct hdac_ext_device *edev)
|
||||
snd_hdac_refresh_widgets(hdev, true);
|
||||
|
||||
/* ASoC specific initialization */
|
||||
ret = snd_soc_register_codec(&hdev->dev, &hdmi_hda_codec,
|
||||
ret = devm_snd_soc_register_component(&hdev->dev, &hdmi_hda_codec,
|
||||
hdmi_dais, num_dais);
|
||||
|
||||
snd_hdac_ext_bus_link_put(edev->ebus, hlink);
|
||||
@@ -2059,8 +2072,6 @@ static int hdac_hdmi_dev_remove(struct hdac_ext_device *edev)
|
||||
struct hdac_hdmi_port *port, *port_next;
|
||||
int i;
|
||||
|
||||
snd_soc_unregister_codec(&edev->hdev.dev);
|
||||
|
||||
list_for_each_entry_safe(pcm, pcm_next, &hdmi->pcm_list, head) {
|
||||
pcm->cvt = NULL;
|
||||
if (list_empty(&pcm->port_list))
|
||||
|
||||
@@ -5,6 +5,6 @@
|
||||
int hdac_hdmi_jack_init(struct snd_soc_dai *dai, int pcm,
|
||||
struct snd_soc_jack *jack);
|
||||
|
||||
int hdac_hdmi_jack_port_init(struct snd_soc_codec *codec,
|
||||
int hdac_hdmi_jack_port_init(struct snd_soc_component *component,
|
||||
struct snd_soc_dapm_context *dapm);
|
||||
#endif /* __HDAC_HDMI_H__ */
|
||||
|
||||
@@ -914,8 +914,8 @@ static bool nau8825_volatile_reg(struct device *dev, unsigned int reg)
|
||||
static int nau8825_adc_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
||||
struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
@@ -938,8 +938,8 @@ static int nau8825_adc_event(struct snd_soc_dapm_widget *w,
|
||||
static int nau8825_pump_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
||||
struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
@@ -962,8 +962,8 @@ static int nau8825_pump_event(struct snd_soc_dapm_widget *w,
|
||||
static int nau8825_output_dac_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
||||
struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_PRE_PMU:
|
||||
@@ -1244,8 +1244,8 @@ static int nau8825_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params,
|
||||
struct snd_soc_dai *dai)
|
||||
{
|
||||
struct snd_soc_codec *codec = dai->codec;
|
||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||
struct snd_soc_component *component = dai->component;
|
||||
struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component);
|
||||
unsigned int val_len = 0, osr, ctrl_val, bclk_fs, bclk_div;
|
||||
|
||||
nau8825_sema_acquire(nau8825, 3 * HZ);
|
||||
@@ -1329,8 +1329,8 @@ static int nau8825_hw_params(struct snd_pcm_substream *substream,
|
||||
|
||||
static int nau8825_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
|
||||
{
|
||||
struct snd_soc_codec *codec = codec_dai->codec;
|
||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component);
|
||||
unsigned int ctrl1_val = 0, ctrl2_val = 0;
|
||||
|
||||
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
||||
@@ -1427,10 +1427,10 @@ static struct snd_soc_dai_driver nau8825_dai = {
|
||||
* events will be routed to the given jack. Jack can be null to stop
|
||||
* reporting.
|
||||
*/
|
||||
int nau8825_enable_jack_detect(struct snd_soc_codec *codec,
|
||||
int nau8825_enable_jack_detect(struct snd_soc_component *component,
|
||||
struct snd_soc_jack *jack)
|
||||
{
|
||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||
struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component);
|
||||
struct regmap *regmap = nau8825->regmap;
|
||||
|
||||
nau8825->jack = jack;
|
||||
@@ -1952,24 +1952,22 @@ static const struct regmap_config nau8825_regmap_config = {
|
||||
.num_reg_defaults = ARRAY_SIZE(nau8825_reg_defaults),
|
||||
};
|
||||
|
||||
static int nau8825_codec_probe(struct snd_soc_codec *codec)
|
||||
static int nau8825_component_probe(struct snd_soc_component *component)
|
||||
{
|
||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||
struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
|
||||
struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component);
|
||||
struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
|
||||
|
||||
nau8825->dapm = dapm;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nau8825_codec_remove(struct snd_soc_codec *codec)
|
||||
static void nau8825_component_remove(struct snd_soc_component *component)
|
||||
{
|
||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||
struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
/* Cancel and reset cross tak suppresstion detection funciton */
|
||||
nau8825_xtalk_cancel(nau8825);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2084,20 +2082,20 @@ static void nau8825_fll_apply(struct nau8825 *nau8825,
|
||||
}
|
||||
|
||||
/* freq_out must be 256*Fs in order to achieve the best performance */
|
||||
static int nau8825_set_pll(struct snd_soc_codec *codec, int pll_id, int source,
|
||||
static int nau8825_set_pll(struct snd_soc_component *component, int pll_id, int source,
|
||||
unsigned int freq_in, unsigned int freq_out)
|
||||
{
|
||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||
struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component);
|
||||
struct nau8825_fll fll_param;
|
||||
int ret, fs;
|
||||
|
||||
fs = freq_out / 256;
|
||||
ret = nau8825_calc_fll_param(freq_in, fs, &fll_param);
|
||||
if (ret < 0) {
|
||||
dev_err(codec->dev, "Unsupported input clock %d\n", freq_in);
|
||||
dev_err(component->dev, "Unsupported input clock %d\n", freq_in);
|
||||
return ret;
|
||||
}
|
||||
dev_dbg(codec->dev, "mclk_src=%x ratio=%x fll_frac=%x fll_int=%x clk_ref_div=%x\n",
|
||||
dev_dbg(component->dev, "mclk_src=%x ratio=%x fll_frac=%x fll_int=%x clk_ref_div=%x\n",
|
||||
fll_param.mclk_src, fll_param.ratio, fll_param.fll_frac,
|
||||
fll_param.fll_int, fll_param.clk_ref_div);
|
||||
|
||||
@@ -2298,10 +2296,10 @@ static int nau8825_configure_sysclk(struct nau8825 *nau8825, int clk_id,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nau8825_set_sysclk(struct snd_soc_codec *codec, int clk_id,
|
||||
static int nau8825_set_sysclk(struct snd_soc_component *component, int clk_id,
|
||||
int source, unsigned int freq, int dir)
|
||||
{
|
||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||
struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
return nau8825_configure_sysclk(nau8825, clk_id, freq);
|
||||
}
|
||||
@@ -2331,10 +2329,10 @@ static int nau8825_resume_setup(struct nau8825 *nau8825)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nau8825_set_bias_level(struct snd_soc_codec *codec,
|
||||
static int nau8825_set_bias_level(struct snd_soc_component *component,
|
||||
enum snd_soc_bias_level level)
|
||||
{
|
||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||
struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component);
|
||||
int ret;
|
||||
|
||||
switch (level) {
|
||||
@@ -2345,11 +2343,11 @@ static int nau8825_set_bias_level(struct snd_soc_codec *codec,
|
||||
break;
|
||||
|
||||
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) {
|
||||
if (nau8825->mclk_freq) {
|
||||
ret = clk_prepare_enable(nau8825->mclk);
|
||||
if (ret) {
|
||||
dev_err(nau8825->dev, "Unable to prepare codec mclk\n");
|
||||
dev_err(nau8825->dev, "Unable to prepare component mclk\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
@@ -2383,12 +2381,12 @@ static int nau8825_set_bias_level(struct snd_soc_codec *codec,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused nau8825_suspend(struct snd_soc_codec *codec)
|
||||
static int __maybe_unused nau8825_suspend(struct snd_soc_component *component)
|
||||
{
|
||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||
struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
disable_irq(nau8825->irq);
|
||||
snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_OFF);
|
||||
snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF);
|
||||
/* Power down codec power; don't suppoet button wakeup */
|
||||
snd_soc_dapm_disable_pin(nau8825->dapm, "SAR");
|
||||
snd_soc_dapm_disable_pin(nau8825->dapm, "MICBIAS");
|
||||
@@ -2399,9 +2397,9 @@ static int __maybe_unused nau8825_suspend(struct snd_soc_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused nau8825_resume(struct snd_soc_codec *codec)
|
||||
static int __maybe_unused nau8825_resume(struct snd_soc_component *component)
|
||||
{
|
||||
struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
|
||||
struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component);
|
||||
int ret;
|
||||
|
||||
regcache_cache_only(nau8825->regmap, false);
|
||||
@@ -2415,24 +2413,25 @@ static int __maybe_unused nau8825_resume(struct snd_soc_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct snd_soc_codec_driver nau8825_codec_driver = {
|
||||
.probe = nau8825_codec_probe,
|
||||
.remove = nau8825_codec_remove,
|
||||
.set_sysclk = nau8825_set_sysclk,
|
||||
.set_pll = nau8825_set_pll,
|
||||
.set_bias_level = nau8825_set_bias_level,
|
||||
.suspend_bias_off = true,
|
||||
.suspend = nau8825_suspend,
|
||||
.resume = nau8825_resume,
|
||||
|
||||
.component_driver = {
|
||||
.controls = nau8825_controls,
|
||||
.num_controls = ARRAY_SIZE(nau8825_controls),
|
||||
.dapm_widgets = nau8825_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(nau8825_dapm_widgets),
|
||||
.dapm_routes = nau8825_dapm_routes,
|
||||
.num_dapm_routes = ARRAY_SIZE(nau8825_dapm_routes),
|
||||
},
|
||||
static const struct snd_soc_component_driver nau8825_component_driver = {
|
||||
.probe = nau8825_component_probe,
|
||||
.remove = nau8825_component_remove,
|
||||
.set_sysclk = nau8825_set_sysclk,
|
||||
.set_pll = nau8825_set_pll,
|
||||
.set_bias_level = nau8825_set_bias_level,
|
||||
.suspend = nau8825_suspend,
|
||||
.resume = nau8825_resume,
|
||||
.controls = nau8825_controls,
|
||||
.num_controls = ARRAY_SIZE(nau8825_controls),
|
||||
.dapm_widgets = nau8825_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(nau8825_dapm_widgets),
|
||||
.dapm_routes = nau8825_dapm_routes,
|
||||
.num_dapm_routes = ARRAY_SIZE(nau8825_dapm_routes),
|
||||
.suspend_bias_off = 1,
|
||||
.idle_bias_on = 1,
|
||||
.use_pmdown_time = 1,
|
||||
.endianness = 1,
|
||||
.non_legacy_dai_naming = 1,
|
||||
};
|
||||
|
||||
static void nau8825_reset_chip(struct regmap *regmap)
|
||||
@@ -2619,13 +2618,13 @@ static int nau8825_i2c_probe(struct i2c_client *i2c,
|
||||
if (i2c->irq)
|
||||
nau8825_setup_irq(nau8825);
|
||||
|
||||
return snd_soc_register_codec(&i2c->dev, &nau8825_codec_driver,
|
||||
return devm_snd_soc_register_component(&i2c->dev,
|
||||
&nau8825_component_driver,
|
||||
&nau8825_dai, 1);
|
||||
}
|
||||
|
||||
static int nau8825_i2c_remove(struct i2c_client *client)
|
||||
{
|
||||
snd_soc_unregister_codec(&client->dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -480,7 +480,7 @@ struct nau8825 {
|
||||
bool xtalk_baktab_initialized; /* True if initialized. */
|
||||
};
|
||||
|
||||
int nau8825_enable_jack_detect(struct snd_soc_codec *codec,
|
||||
int nau8825_enable_jack_detect(struct snd_soc_component *component,
|
||||
struct snd_soc_jack *jack);
|
||||
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ struct rt286_priv {
|
||||
struct reg_default *index_cache;
|
||||
int index_cache_size;
|
||||
struct regmap *regmap;
|
||||
struct snd_soc_codec *codec;
|
||||
struct snd_soc_component *component;
|
||||
struct rt286_platform_data pdata;
|
||||
struct i2c_client *i2c;
|
||||
struct snd_soc_jack *jack;
|
||||
@@ -187,13 +187,13 @@ static bool rt286_readable_register(struct device *dev, unsigned int reg)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static void rt286_index_sync(struct snd_soc_codec *codec)
|
||||
static void rt286_index_sync(struct snd_soc_component *component)
|
||||
{
|
||||
struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
|
||||
struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < INDEX_CACHE_SIZE; i++) {
|
||||
snd_soc_write(codec, rt286->index_cache[i].reg,
|
||||
snd_soc_component_write(component, rt286->index_cache[i].reg,
|
||||
rt286->index_cache[i].def);
|
||||
}
|
||||
}
|
||||
@@ -220,10 +220,10 @@ static int rt286_jack_detect(struct rt286_priv *rt286, bool *hp, bool *mic)
|
||||
*hp = false;
|
||||
*mic = false;
|
||||
|
||||
if (!rt286->codec)
|
||||
if (!rt286->component)
|
||||
return -EINVAL;
|
||||
|
||||
dapm = snd_soc_codec_get_dapm(rt286->codec);
|
||||
dapm = snd_soc_component_get_dapm(rt286->component);
|
||||
|
||||
if (rt286->pdata.cbj_en) {
|
||||
regmap_read(rt286->regmap, RT286_GET_HP_SENSE, &buf);
|
||||
@@ -305,10 +305,10 @@ static void rt286_jack_detect_work(struct work_struct *work)
|
||||
SND_JACK_MICROPHONE | SND_JACK_HEADPHONE);
|
||||
}
|
||||
|
||||
int rt286_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
|
||||
int rt286_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *jack)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
|
||||
struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
|
||||
struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
|
||||
struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
rt286->jack = jack;
|
||||
|
||||
@@ -334,8 +334,8 @@ EXPORT_SYMBOL_GPL(rt286_mic_detect);
|
||||
static int is_mclk_mode(struct snd_soc_dapm_widget *source,
|
||||
struct snd_soc_dapm_widget *sink)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm);
|
||||
struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
|
||||
struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
|
||||
struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
if (rt286->clk_id == RT286_SCLK_S_MCLK)
|
||||
return 1;
|
||||
@@ -434,15 +434,15 @@ SOC_DAPM_ENUM("SPO source", rt286_spo_enum);
|
||||
static int rt286_spk_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
||||
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
snd_soc_write(codec,
|
||||
snd_soc_component_write(component,
|
||||
RT286_SPK_EAPD, RT286_SET_EAPD_HIGH);
|
||||
break;
|
||||
case SND_SOC_DAPM_PRE_PMD:
|
||||
snd_soc_write(codec,
|
||||
snd_soc_component_write(component,
|
||||
RT286_SPK_EAPD, RT286_SET_EAPD_LOW);
|
||||
break;
|
||||
|
||||
@@ -456,14 +456,14 @@ static int rt286_spk_event(struct snd_soc_dapm_widget *w,
|
||||
static int rt286_set_dmic1_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
||||
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
snd_soc_write(codec, RT286_SET_PIN_DMIC1, 0x20);
|
||||
snd_soc_component_write(component, RT286_SET_PIN_DMIC1, 0x20);
|
||||
break;
|
||||
case SND_SOC_DAPM_PRE_PMD:
|
||||
snd_soc_write(codec, RT286_SET_PIN_DMIC1, 0);
|
||||
snd_soc_component_write(component, RT286_SET_PIN_DMIC1, 0);
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
@@ -475,14 +475,14 @@ static int rt286_set_dmic1_event(struct snd_soc_dapm_widget *w,
|
||||
static int rt286_ldo2_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
||||
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
snd_soc_update_bits(codec, RT286_POWER_CTRL2, 0x38, 0x08);
|
||||
snd_soc_component_update_bits(component, RT286_POWER_CTRL2, 0x38, 0x08);
|
||||
break;
|
||||
case SND_SOC_DAPM_PRE_PMD:
|
||||
snd_soc_update_bits(codec, RT286_POWER_CTRL2, 0x38, 0x30);
|
||||
snd_soc_component_update_bits(component, RT286_POWER_CTRL2, 0x38, 0x30);
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
@@ -494,19 +494,19 @@ static int rt286_ldo2_event(struct snd_soc_dapm_widget *w,
|
||||
static int rt286_mic1_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
||||
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_PRE_PMU:
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_A_BIAS_CTRL3, 0xc000, 0x8000);
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_A_BIAS_CTRL2, 0xc000, 0x8000);
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_A_BIAS_CTRL3, 0xc000, 0x0000);
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_A_BIAS_CTRL2, 0xc000, 0x0000);
|
||||
break;
|
||||
default:
|
||||
@@ -674,8 +674,8 @@ static int rt286_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params,
|
||||
struct snd_soc_dai *dai)
|
||||
{
|
||||
struct snd_soc_codec *codec = dai->codec;
|
||||
struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
|
||||
struct snd_soc_component *component = dai->component;
|
||||
struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component);
|
||||
unsigned int val = 0;
|
||||
int d_len_code;
|
||||
|
||||
@@ -687,7 +687,7 @@ static int rt286_hw_params(struct snd_pcm_substream *substream,
|
||||
case 48000:
|
||||
break;
|
||||
default:
|
||||
dev_err(codec->dev, "Unsupported sample rate %d\n",
|
||||
dev_err(component->dev, "Unsupported sample rate %d\n",
|
||||
params_rate(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -695,7 +695,7 @@ static int rt286_hw_params(struct snd_pcm_substream *substream,
|
||||
case 12288000:
|
||||
case 24576000:
|
||||
if (params_rate(params) != 48000) {
|
||||
dev_err(codec->dev, "Sys_clk is not matched (%d %d)\n",
|
||||
dev_err(component->dev, "Sys_clk is not matched (%d %d)\n",
|
||||
params_rate(params), rt286->sys_clk);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -703,7 +703,7 @@ static int rt286_hw_params(struct snd_pcm_substream *substream,
|
||||
case 11289600:
|
||||
case 22579200:
|
||||
if (params_rate(params) != 44100) {
|
||||
dev_err(codec->dev, "Sys_clk is not matched (%d %d)\n",
|
||||
dev_err(component->dev, "Sys_clk is not matched (%d %d)\n",
|
||||
params_rate(params), rt286->sys_clk);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -714,7 +714,7 @@ static int rt286_hw_params(struct snd_pcm_substream *substream,
|
||||
/* bit 3:0 Number of Channel */
|
||||
val |= (params_channels(params) - 1);
|
||||
} else {
|
||||
dev_err(codec->dev, "Unsupported channels %d\n",
|
||||
dev_err(component->dev, "Unsupported channels %d\n",
|
||||
params_channels(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -745,27 +745,27 @@ static int rt286_hw_params(struct snd_pcm_substream *substream,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_I2S_CTRL1, 0x0018, d_len_code << 3);
|
||||
dev_dbg(codec->dev, "format val = 0x%x\n", val);
|
||||
dev_dbg(component->dev, "format val = 0x%x\n", val);
|
||||
|
||||
snd_soc_update_bits(codec, RT286_DAC_FORMAT, 0x407f, val);
|
||||
snd_soc_update_bits(codec, RT286_ADC_FORMAT, 0x407f, val);
|
||||
snd_soc_component_update_bits(component, RT286_DAC_FORMAT, 0x407f, val);
|
||||
snd_soc_component_update_bits(component, RT286_ADC_FORMAT, 0x407f, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rt286_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
{
|
||||
struct snd_soc_codec *codec = dai->codec;
|
||||
struct snd_soc_component *component = dai->component;
|
||||
|
||||
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
||||
case SND_SOC_DAIFMT_CBM_CFM:
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_I2S_CTRL1, 0x800, 0x800);
|
||||
break;
|
||||
case SND_SOC_DAIFMT_CBS_CFS:
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_I2S_CTRL1, 0x800, 0x0);
|
||||
break;
|
||||
default:
|
||||
@@ -774,27 +774,27 @@ static int rt286_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
|
||||
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
|
||||
case SND_SOC_DAIFMT_I2S:
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_I2S_CTRL1, 0x300, 0x0);
|
||||
break;
|
||||
case SND_SOC_DAIFMT_LEFT_J:
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_I2S_CTRL1, 0x300, 0x1 << 8);
|
||||
break;
|
||||
case SND_SOC_DAIFMT_DSP_A:
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_I2S_CTRL1, 0x300, 0x2 << 8);
|
||||
break;
|
||||
case SND_SOC_DAIFMT_DSP_B:
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_I2S_CTRL1, 0x300, 0x3 << 8);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
/* bit 15 Stream Type 0:PCM 1:Non-PCM */
|
||||
snd_soc_update_bits(codec, RT286_DAC_FORMAT, 0x8000, 0);
|
||||
snd_soc_update_bits(codec, RT286_ADC_FORMAT, 0x8000, 0);
|
||||
snd_soc_component_update_bits(component, RT286_DAC_FORMAT, 0x8000, 0);
|
||||
snd_soc_component_update_bits(component, RT286_ADC_FORMAT, 0x8000, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -802,58 +802,58 @@ static int rt286_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
static int rt286_set_dai_sysclk(struct snd_soc_dai *dai,
|
||||
int clk_id, unsigned int freq, int dir)
|
||||
{
|
||||
struct snd_soc_codec *codec = dai->codec;
|
||||
struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
|
||||
struct snd_soc_component *component = dai->component;
|
||||
struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
dev_dbg(codec->dev, "%s freq=%d\n", __func__, freq);
|
||||
dev_dbg(component->dev, "%s freq=%d\n", __func__, freq);
|
||||
|
||||
if (RT286_SCLK_S_MCLK == clk_id) {
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_I2S_CTRL2, 0x0100, 0x0);
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_PLL_CTRL1, 0x20, 0x20);
|
||||
} else {
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_I2S_CTRL2, 0x0100, 0x0100);
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_PLL_CTRL, 0x4, 0x4);
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_PLL_CTRL1, 0x20, 0x0);
|
||||
}
|
||||
|
||||
switch (freq) {
|
||||
case 19200000:
|
||||
if (RT286_SCLK_S_MCLK == clk_id) {
|
||||
dev_err(codec->dev, "Should not use MCLK\n");
|
||||
dev_err(component->dev, "Should not use MCLK\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_I2S_CTRL2, 0x40, 0x40);
|
||||
break;
|
||||
case 24000000:
|
||||
if (RT286_SCLK_S_MCLK == clk_id) {
|
||||
dev_err(codec->dev, "Should not use MCLK\n");
|
||||
dev_err(component->dev, "Should not use MCLK\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_I2S_CTRL2, 0x40, 0x0);
|
||||
break;
|
||||
case 12288000:
|
||||
case 11289600:
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_I2S_CTRL2, 0x8, 0x0);
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_CLK_DIV, 0xfc1e, 0x0004);
|
||||
break;
|
||||
case 24576000:
|
||||
case 22579200:
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_I2S_CTRL2, 0x8, 0x8);
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_CLK_DIV, 0xfc1e, 0x5406);
|
||||
break;
|
||||
default:
|
||||
dev_err(codec->dev, "Unsupported system clock\n");
|
||||
dev_err(component->dev, "Unsupported system clock\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -865,42 +865,42 @@ static int rt286_set_dai_sysclk(struct snd_soc_dai *dai,
|
||||
|
||||
static int rt286_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
|
||||
{
|
||||
struct snd_soc_codec *codec = dai->codec;
|
||||
struct snd_soc_component *component = dai->component;
|
||||
|
||||
dev_dbg(codec->dev, "%s ratio=%d\n", __func__, ratio);
|
||||
dev_dbg(component->dev, "%s ratio=%d\n", __func__, ratio);
|
||||
if (50 == ratio)
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_I2S_CTRL1, 0x1000, 0x1000);
|
||||
else
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_I2S_CTRL1, 0x1000, 0x0);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rt286_set_bias_level(struct snd_soc_codec *codec,
|
||||
static int rt286_set_bias_level(struct snd_soc_component *component,
|
||||
enum snd_soc_bias_level level)
|
||||
{
|
||||
switch (level) {
|
||||
case SND_SOC_BIAS_PREPARE:
|
||||
if (SND_SOC_BIAS_STANDBY == snd_soc_codec_get_bias_level(codec)) {
|
||||
snd_soc_write(codec,
|
||||
if (SND_SOC_BIAS_STANDBY == snd_soc_component_get_bias_level(component)) {
|
||||
snd_soc_component_write(component,
|
||||
RT286_SET_AUDIO_POWER, AC_PWRST_D0);
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_DC_GAIN, 0x200, 0x200);
|
||||
}
|
||||
break;
|
||||
|
||||
case SND_SOC_BIAS_ON:
|
||||
mdelay(10);
|
||||
snd_soc_update_bits(codec,
|
||||
snd_soc_component_update_bits(component,
|
||||
RT286_DC_GAIN, 0x200, 0x0);
|
||||
|
||||
break;
|
||||
|
||||
case SND_SOC_BIAS_STANDBY:
|
||||
snd_soc_write(codec,
|
||||
snd_soc_component_write(component,
|
||||
RT286_SET_AUDIO_POWER, AC_PWRST_D3);
|
||||
break;
|
||||
|
||||
@@ -937,11 +937,11 @@ static irqreturn_t rt286_irq(int irq, void *data)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int rt286_probe(struct snd_soc_codec *codec)
|
||||
static int rt286_probe(struct snd_soc_component *component)
|
||||
{
|
||||
struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
|
||||
struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
rt286->codec = codec;
|
||||
rt286->component = component;
|
||||
|
||||
if (rt286->i2c->irq) {
|
||||
regmap_update_bits(rt286->regmap,
|
||||
@@ -956,19 +956,17 @@ static int rt286_probe(struct snd_soc_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rt286_remove(struct snd_soc_codec *codec)
|
||||
static void rt286_remove(struct snd_soc_component *component)
|
||||
{
|
||||
struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
|
||||
struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
cancel_delayed_work_sync(&rt286->jack_detect_work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int rt286_suspend(struct snd_soc_codec *codec)
|
||||
static int rt286_suspend(struct snd_soc_component *component)
|
||||
{
|
||||
struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
|
||||
struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
regcache_cache_only(rt286->regmap, true);
|
||||
regcache_mark_dirty(rt286->regmap);
|
||||
@@ -976,12 +974,12 @@ static int rt286_suspend(struct snd_soc_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rt286_resume(struct snd_soc_codec *codec)
|
||||
static int rt286_resume(struct snd_soc_component *component)
|
||||
{
|
||||
struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
|
||||
struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
regcache_cache_only(rt286->regmap, false);
|
||||
rt286_index_sync(codec);
|
||||
rt286_index_sync(component);
|
||||
regcache_sync(rt286->regmap);
|
||||
|
||||
return 0;
|
||||
@@ -1046,21 +1044,21 @@ static struct snd_soc_dai_driver rt286_dai[] = {
|
||||
|
||||
};
|
||||
|
||||
static const struct snd_soc_codec_driver soc_codec_dev_rt286 = {
|
||||
.probe = rt286_probe,
|
||||
.remove = rt286_remove,
|
||||
.suspend = rt286_suspend,
|
||||
.resume = rt286_resume,
|
||||
.set_bias_level = rt286_set_bias_level,
|
||||
.idle_bias_off = true,
|
||||
.component_driver = {
|
||||
.controls = rt286_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(rt286_snd_controls),
|
||||
.dapm_widgets = rt286_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(rt286_dapm_widgets),
|
||||
.dapm_routes = rt286_dapm_routes,
|
||||
.num_dapm_routes = ARRAY_SIZE(rt286_dapm_routes),
|
||||
},
|
||||
static const struct snd_soc_component_driver soc_component_dev_rt286 = {
|
||||
.probe = rt286_probe,
|
||||
.remove = rt286_remove,
|
||||
.suspend = rt286_suspend,
|
||||
.resume = rt286_resume,
|
||||
.set_bias_level = rt286_set_bias_level,
|
||||
.controls = rt286_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(rt286_snd_controls),
|
||||
.dapm_widgets = rt286_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(rt286_dapm_widgets),
|
||||
.dapm_routes = rt286_dapm_routes,
|
||||
.num_dapm_routes = ARRAY_SIZE(rt286_dapm_routes),
|
||||
.use_pmdown_time = 1,
|
||||
.endianness = 1,
|
||||
.non_legacy_dai_naming = 1,
|
||||
};
|
||||
|
||||
static const struct regmap_config rt286_regmap = {
|
||||
@@ -1243,7 +1241,8 @@ static int rt286_i2c_probe(struct i2c_client *i2c,
|
||||
}
|
||||
}
|
||||
|
||||
ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt286,
|
||||
ret = devm_snd_soc_register_component(&i2c->dev,
|
||||
&soc_component_dev_rt286,
|
||||
rt286_dai, ARRAY_SIZE(rt286_dai));
|
||||
|
||||
return ret;
|
||||
@@ -1255,7 +1254,6 @@ static int rt286_i2c_remove(struct i2c_client *i2c)
|
||||
|
||||
if (i2c->irq)
|
||||
free_irq(i2c->irq, rt286);
|
||||
snd_soc_unregister_codec(&i2c->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ enum {
|
||||
RT286_AIFS,
|
||||
};
|
||||
|
||||
int rt286_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack);
|
||||
int rt286_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *jack);
|
||||
|
||||
#endif /* __RT286_H__ */
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -210,7 +210,7 @@ enum {
|
||||
RT298_AIFS,
|
||||
};
|
||||
|
||||
int rt298_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack);
|
||||
int rt298_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *jack);
|
||||
|
||||
#endif /* __RT298_H__ */
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user