mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-18 18:23:53 +08:00
ASoC: arizona: Add support for directly setting the FLL REFCLK
This patch allows the REFCLK to be set directly allowing much greater flexibility in how the FLLs are configured. Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
parent
de1e6eeddd
commit
ee929a9780
@ -1139,6 +1139,45 @@ static void arizona_disable_fll(struct arizona_fll *fll)
|
||||
pm_runtime_put_autosuspend(arizona->dev);
|
||||
}
|
||||
|
||||
int arizona_set_fll_refclk(struct arizona_fll *fll, int source,
|
||||
unsigned int Fref, unsigned int Fout)
|
||||
{
|
||||
struct arizona_fll_cfg ref, sync;
|
||||
int ret;
|
||||
|
||||
if (source < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (fll->ref_src == source && fll->ref_freq == Fref &&
|
||||
fll->fout == Fout)
|
||||
return 0;
|
||||
|
||||
if (Fout) {
|
||||
ret = arizona_calc_fll(fll, &ref, Fref, Fout);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
if (fll->sync_src >= 0) {
|
||||
ret = arizona_calc_fll(fll, &sync, fll->sync_freq, Fout);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
fll->ref_src = source;
|
||||
fll->ref_freq = Fref;
|
||||
fll->fout = Fout;
|
||||
|
||||
if (Fout) {
|
||||
arizona_enable_fll(fll, &ref, &sync);
|
||||
} else {
|
||||
arizona_disable_fll(fll);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(arizona_set_fll_refclk);
|
||||
|
||||
int arizona_set_fll(struct arizona_fll *fll, int source,
|
||||
unsigned int Fref, unsigned int Fout)
|
||||
{
|
||||
|
@ -211,6 +211,8 @@ struct arizona_fll {
|
||||
|
||||
extern int arizona_init_fll(struct arizona *arizona, int id, int base,
|
||||
int lock_irq, int ok_irq, struct arizona_fll *fll);
|
||||
extern int arizona_set_fll_refclk(struct arizona_fll *fll, int source,
|
||||
unsigned int Fref, unsigned int Fout);
|
||||
extern int arizona_set_fll(struct arizona_fll *fll, int source,
|
||||
unsigned int Fref, unsigned int Fout);
|
||||
|
||||
|
@ -1483,6 +1483,12 @@ static int wm5102_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
|
||||
return arizona_set_fll(&wm5102->fll[0], source, Fref, Fout);
|
||||
case WM5102_FLL2:
|
||||
return arizona_set_fll(&wm5102->fll[1], source, Fref, Fout);
|
||||
case WM5102_FLL1_REFCLK:
|
||||
return arizona_set_fll_refclk(&wm5102->fll[0], source, Fref,
|
||||
Fout);
|
||||
case WM5102_FLL2_REFCLK:
|
||||
return arizona_set_fll_refclk(&wm5102->fll[1], source, Fref,
|
||||
Fout);
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -15,7 +15,9 @@
|
||||
|
||||
#include "arizona.h"
|
||||
|
||||
#define WM5102_FLL1 1
|
||||
#define WM5102_FLL2 2
|
||||
#define WM5102_FLL1 1
|
||||
#define WM5102_FLL2 2
|
||||
#define WM5102_FLL1_REFCLK 3
|
||||
#define WM5102_FLL2_REFCLK 4
|
||||
|
||||
#endif
|
||||
|
@ -880,6 +880,12 @@ static int wm5110_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
|
||||
return arizona_set_fll(&wm5110->fll[0], source, Fref, Fout);
|
||||
case WM5110_FLL2:
|
||||
return arizona_set_fll(&wm5110->fll[1], source, Fref, Fout);
|
||||
case WM5110_FLL1_REFCLK:
|
||||
return arizona_set_fll_refclk(&wm5110->fll[0], source, Fref,
|
||||
Fout);
|
||||
case WM5110_FLL2_REFCLK:
|
||||
return arizona_set_fll_refclk(&wm5110->fll[1], source, Fref,
|
||||
Fout);
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -15,7 +15,9 @@
|
||||
|
||||
#include "arizona.h"
|
||||
|
||||
#define WM5110_FLL1 1
|
||||
#define WM5110_FLL2 2
|
||||
#define WM5110_FLL1 1
|
||||
#define WM5110_FLL2 2
|
||||
#define WM5110_FLL1_REFCLK 3
|
||||
#define WM5110_FLL2_REFCLK 4
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user