* ASoC: ak4642/fsi: add ak4648 support
@ 2011-11-07 6:03 kuninori.morimoto.gx
2011-11-07 6:04 ` [PATCH 1/5] ASoC: fsi-ak4642: modify specification method of FSI / ak464x Kuninori Morimoto
` (5 more replies)
0 siblings, 6 replies; 30+ messages in thread
From: kuninori.morimoto.gx @ 2011-11-07 6:03 UTC (permalink / raw)
To: Paul Mundt, Mark Brown; +Cc: Linux-ALSA, Kuninori Morimoto, Liam Girdwood
Dear Mark, Liam, Paul
These are ak4648 suport for ak4642 driver,
and fsi update patch set
Kuninori Morimoto (5):
ASoC: fsi-ak4642: modify specification method of FSI / ak464x
ASoC: ak4642: ak4642 was tested
ASoC: ak4642: headphone/stereo-line output control
ASoC: ak4642: add ak4648 support
ASoC: fsi: add valid data position control support
>> Paul
Can you please check #1 patch which modify arch/sh and arch/arm
^ permalink raw reply [flat|nested] 30+ messages in thread* [PATCH 1/5] ASoC: fsi-ak4642: modify specification method of FSI / ak464x 2011-11-07 6:03 ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx @ 2011-11-07 6:04 ` Kuninori Morimoto 2011-11-24 0:55 ` [PATCH 1/5][resend] " Kuninori Morimoto 2011-11-07 6:04 ` [PATCH 2/5] ASoC: ak4642: ak4642 was tested Kuninori Morimoto ` (4 subsequent siblings) 5 siblings, 1 reply; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-07 6:04 UTC (permalink / raw) To: Paul Mundt, Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto Current fsi-ak4642 was using id_entry name in order to specify FSI port and ak464x codec. But it was no sense, no flexibility. Platform can specify FSI/ak464x pair by this patch. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- arch/arm/mach-shmobile/board-ap4evb.c | 15 ++++- arch/arm/mach-shmobile/board-mackerel.c | 14 ++++- arch/sh/boards/mach-se/7724/setup.c | 14 ++++- include/sound/sh_fsi.h | 12 +++ sound/soc/sh/fsi-ak4642.c | 114 +++---------------------------- 5 files changed, 63 insertions(+), 106 deletions(-) diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index 5aa5ddd..5df4e3a 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c @@ -787,9 +787,22 @@ static struct platform_device fsi_device = { }, }; +static struct fsi_ak4642_info fsi2_ak4643_info = { + .name = "AK4643", + .card = "FSI2A-AK4643", + .cpu_dai = "fsia-dai", + .codec = "ak4642-codec.0-0013", + .platform = "sh_fsi2", + .id = FSI_PORT_A, +}; + static struct platform_device fsi_ak4643_device = { - .name = "sh_fsi2_a_ak4643", + .name = "fsi-ak4642-audio", + .dev = { + .platform_data = &fsi_info, + }, }; + static struct sh_mobile_meram_cfg hdmi_meram_cfg = { .icb[0] = { .marker_icb = 30, diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index d41c01f..fbef6c8 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c @@ -984,8 +984,20 @@ static struct platform_device fsi_device = { }, }; +static struct fsi_ak4642_info fsi2_ak4643_info = { + .name = "AK4643", + .card = "FSI2A-AK4643", + .cpu_dai = "fsia-dai", + .codec = "ak4642-codec.0-0013", + .platform = "sh_fsi2", + .id = FSI_PORT_A, +}; + static struct platform_device fsi_ak4643_device = { - .name = "sh_fsi2_a_ak4643", + .name = "fsi-ak4642-audio", + .dev = { + .platform_data = &fsi2_ak4643_info, + }, }; /* diff --git a/arch/sh/boards/mach-se/7724/setup.c b/arch/sh/boards/mach-se/7724/setup.c index d007567..f56ca9a 100644 --- a/arch/sh/boards/mach-se/7724/setup.c +++ b/arch/sh/boards/mach-se/7724/setup.c @@ -315,8 +315,20 @@ static struct platform_device fsi_device = { }, }; +static struct fsi_ak4642_info fsi_ak4642_info = { + .name = "AK4642", + .card = "FSIA-AK4642", + .cpu_dai = "fsia-dai", + .codec = "ak4642-codec.0-0012", + .platform = "sh_fsi.0", + .id = FSI_PORT_A, +}; + static struct platform_device fsi_ak4642_device = { - .name = "sh_fsi_a_ak4642", + .name = "fsi-ak4642-audio", + .dev = { + .platform_data = &fsi_ak4642_info, + }, }; /* KEYSC in SoC (Needs SW33-2 set to ON) */ diff --git a/include/sound/sh_fsi.h b/include/sound/sh_fsi.h index 9a155f9..9b1aaca 100644 --- a/include/sound/sh_fsi.h +++ b/include/sound/sh_fsi.h @@ -78,4 +78,16 @@ struct sh_fsi_platform_info { int (*set_rate)(struct device *dev, int is_porta, int rate, int enable); }; +/* + * for fsi-ak4642 + */ +struct fsi_ak4642_info { + const char *name; + const char *card; + const char *cpu_dai; + const char *codec; + const char *platform; + int id; +}; + #endif /* __SOUND_FSI_H */ diff --git a/sound/soc/sh/fsi-ak4642.c b/sound/soc/sh/fsi-ak4642.c index 770a71a..c7d2f8c 100644 --- a/sound/soc/sh/fsi-ak4642.c +++ b/sound/soc/sh/fsi-ak4642.c @@ -57,27 +57,23 @@ static struct platform_device *fsi_snd_device; static int fsi_ak4642_probe(struct platform_device *pdev) { int ret = -ENOMEM; - const struct platform_device_id *id_entry; - struct fsi_ak4642_data *pdata; + struct fsi_ak4642_info *pinfo = pdev->dev.platform_data; - id_entry = pdev->id_entry; - if (!id_entry) { - dev_err(&pdev->dev, "unknown fsi ak4642\n"); - return -ENODEV; + if (!pinfo) { + dev_err(&pdev->dev, "no info for fsi ak4642\n"); + goto out; } - pdata = (struct fsi_ak4642_data *)id_entry->driver_data; - - fsi_snd_device = platform_device_alloc("soc-audio", pdata->id); + fsi_snd_device = platform_device_alloc("soc-audio", pinfo->id); if (!fsi_snd_device) goto out; - fsi_dai_link.name = pdata->name; - fsi_dai_link.stream_name = pdata->name; - fsi_dai_link.cpu_dai_name = pdata->cpu_dai; - fsi_dai_link.platform_name = pdata->platform; - fsi_dai_link.codec_name = pdata->codec; - fsi_soc_card.name = pdata->card; + fsi_dai_link.name = pinfo->name; + fsi_dai_link.stream_name = pinfo->name; + fsi_dai_link.cpu_dai_name = pinfo->cpu_dai; + fsi_dai_link.platform_name = pinfo->platform; + fsi_dai_link.codec_name = pinfo->codec; + fsi_soc_card.name = pinfo->card; platform_set_drvdata(fsi_snd_device, &fsi_soc_card); ret = platform_device_add(fsi_snd_device); @@ -95,100 +91,12 @@ static int fsi_ak4642_remove(struct platform_device *pdev) return 0; } -static struct fsi_ak4642_data fsi_a_ak4642 = { - .name = "AK4642", - .card = "FSIA-AK4642", - .cpu_dai = "fsia-dai", - .codec = "ak4642-codec.0-0012", - .platform = "sh_fsi.0", - .id = FSI_PORT_A, -}; - -static struct fsi_ak4642_data fsi_b_ak4642 = { - .name = "AK4642", - .card = "FSIB-AK4642", - .cpu_dai = "fsib-dai", - .codec = "ak4642-codec.0-0012", - .platform = "sh_fsi.0", - .id = FSI_PORT_B, -}; - -static struct fsi_ak4642_data fsi_a_ak4643 = { - .name = "AK4643", - .card = "FSIA-AK4643", - .cpu_dai = "fsia-dai", - .codec = "ak4642-codec.0-0013", - .platform = "sh_fsi.0", - .id = FSI_PORT_A, -}; - -static struct fsi_ak4642_data fsi_b_ak4643 = { - .name = "AK4643", - .card = "FSIB-AK4643", - .cpu_dai = "fsib-dai", - .codec = "ak4642-codec.0-0013", - .platform = "sh_fsi.0", - .id = FSI_PORT_B, -}; - -static struct fsi_ak4642_data fsi2_a_ak4642 = { - .name = "AK4642", - .card = "FSI2A-AK4642", - .cpu_dai = "fsia-dai", - .codec = "ak4642-codec.0-0012", - .platform = "sh_fsi2", - .id = FSI_PORT_A, -}; - -static struct fsi_ak4642_data fsi2_b_ak4642 = { - .name = "AK4642", - .card = "FSI2B-AK4642", - .cpu_dai = "fsib-dai", - .codec = "ak4642-codec.0-0012", - .platform = "sh_fsi2", - .id = FSI_PORT_B, -}; - -static struct fsi_ak4642_data fsi2_a_ak4643 = { - .name = "AK4643", - .card = "FSI2A-AK4643", - .cpu_dai = "fsia-dai", - .codec = "ak4642-codec.0-0013", - .platform = "sh_fsi2", - .id = FSI_PORT_A, -}; - -static struct fsi_ak4642_data fsi2_b_ak4643 = { - .name = "AK4643", - .card = "FSI2B-AK4643", - .cpu_dai = "fsib-dai", - .codec = "ak4642-codec.0-0013", - .platform = "sh_fsi2", - .id = FSI_PORT_B, -}; - -static struct platform_device_id fsi_id_table[] = { - /* FSI */ - { "sh_fsi_a_ak4642", (kernel_ulong_t)&fsi_a_ak4642 }, - { "sh_fsi_b_ak4642", (kernel_ulong_t)&fsi_b_ak4642 }, - { "sh_fsi_a_ak4643", (kernel_ulong_t)&fsi_a_ak4643 }, - { "sh_fsi_b_ak4643", (kernel_ulong_t)&fsi_b_ak4643 }, - - /* FSI 2 */ - { "sh_fsi2_a_ak4642", (kernel_ulong_t)&fsi2_a_ak4642 }, - { "sh_fsi2_b_ak4642", (kernel_ulong_t)&fsi2_b_ak4642 }, - { "sh_fsi2_a_ak4643", (kernel_ulong_t)&fsi2_a_ak4643 }, - { "sh_fsi2_b_ak4643", (kernel_ulong_t)&fsi2_b_ak4643 }, - {}, -}; - static struct platform_driver fsi_ak4642 = { .driver = { .name = "fsi-ak4642-audio", }, .probe = fsi_ak4642_probe, .remove = fsi_ak4642_remove, - .id_table = fsi_id_table, }; static int __init fsi_ak4642_init(void) -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 1/5][resend] ASoC: fsi-ak4642: modify specification method of FSI / ak464x 2011-11-07 6:04 ` [PATCH 1/5] ASoC: fsi-ak4642: modify specification method of FSI / ak464x Kuninori Morimoto @ 2011-11-24 0:55 ` Kuninori Morimoto 2011-11-24 10:45 ` Mark Brown 0 siblings, 1 reply; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-24 0:55 UTC (permalink / raw) To: Mark Brown; +Cc: Linux-ALSA, Paul Mundt, Kuninori Morimoto, Liam Girdwood Current fsi-ak4642 was using id_entry name in order to specify FSI port and ak464x codec. But it was no sense, no flexibility. Platform can specify FSI/ak464x pair by this patch. Acked-by: Paul Mundt <lethal@linux-sh.org> Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- - Mark This is resend patch. It had been got ack from Paul. arch/arm/mach-shmobile/board-ap4evb.c | 15 ++++- arch/arm/mach-shmobile/board-mackerel.c | 14 ++++- arch/sh/boards/mach-se/7724/setup.c | 14 ++++- include/sound/sh_fsi.h | 12 +++ sound/soc/sh/fsi-ak4642.c | 114 +++---------------------------- 5 files changed, 63 insertions(+), 106 deletions(-) diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index a3aa0f6..ade98c2 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c @@ -762,9 +762,22 @@ static struct platform_device fsi_device = { }, }; +static struct fsi_ak4642_info fsi2_ak4643_info = { + .name = "AK4643", + .card = "FSI2A-AK4643", + .cpu_dai = "fsia-dai", + .codec = "ak4642-codec.0-0013", + .platform = "sh_fsi2", + .id = FSI_PORT_A, +}; + static struct platform_device fsi_ak4643_device = { - .name = "sh_fsi2_a_ak4643", + .name = "fsi-ak4642-audio", + .dev = { + .platform_data = &fsi_info, + }, }; + static struct sh_mobile_meram_cfg hdmi_meram_cfg = { .icb[0] = { .marker_icb = 30, diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 9c5e598..a2908d4 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c @@ -990,8 +990,20 @@ static struct platform_device fsi_device = { }, }; +static struct fsi_ak4642_info fsi2_ak4643_info = { + .name = "AK4643", + .card = "FSI2A-AK4643", + .cpu_dai = "fsia-dai", + .codec = "ak4642-codec.0-0013", + .platform = "sh_fsi2", + .id = FSI_PORT_A, +}; + static struct platform_device fsi_ak4643_device = { - .name = "sh_fsi2_a_ak4643", + .name = "fsi-ak4642-audio", + .dev = { + .platform_data = &fsi2_ak4643_info, + }, }; /* diff --git a/arch/sh/boards/mach-se/7724/setup.c b/arch/sh/boards/mach-se/7724/setup.c index b747c0a..b49723b 100644 --- a/arch/sh/boards/mach-se/7724/setup.c +++ b/arch/sh/boards/mach-se/7724/setup.c @@ -315,8 +315,20 @@ static struct platform_device fsi_device = { }, }; +static struct fsi_ak4642_info fsi_ak4642_info = { + .name = "AK4642", + .card = "FSIA-AK4642", + .cpu_dai = "fsia-dai", + .codec = "ak4642-codec.0-0012", + .platform = "sh_fsi.0", + .id = FSI_PORT_A, +}; + static struct platform_device fsi_ak4642_device = { - .name = "sh_fsi_a_ak4642", + .name = "fsi-ak4642-audio", + .dev = { + .platform_data = &fsi_ak4642_info, + }, }; /* KEYSC in SoC (Needs SW33-2 set to ON) */ diff --git a/include/sound/sh_fsi.h b/include/sound/sh_fsi.h index 9a155f9..9b1aaca 100644 --- a/include/sound/sh_fsi.h +++ b/include/sound/sh_fsi.h @@ -78,4 +78,16 @@ struct sh_fsi_platform_info { int (*set_rate)(struct device *dev, int is_porta, int rate, int enable); }; +/* + * for fsi-ak4642 + */ +struct fsi_ak4642_info { + const char *name; + const char *card; + const char *cpu_dai; + const char *codec; + const char *platform; + int id; +}; + #endif /* __SOUND_FSI_H */ diff --git a/sound/soc/sh/fsi-ak4642.c b/sound/soc/sh/fsi-ak4642.c index dff64b9..11d2d7f 100644 --- a/sound/soc/sh/fsi-ak4642.c +++ b/sound/soc/sh/fsi-ak4642.c @@ -58,27 +58,23 @@ static struct platform_device *fsi_snd_device; static int fsi_ak4642_probe(struct platform_device *pdev) { int ret = -ENOMEM; - const struct platform_device_id *id_entry; - struct fsi_ak4642_data *pdata; + struct fsi_ak4642_info *pinfo = pdev->dev.platform_data; - id_entry = pdev->id_entry; - if (!id_entry) { - dev_err(&pdev->dev, "unknown fsi ak4642\n"); - return -ENODEV; + if (!pinfo) { + dev_err(&pdev->dev, "no info for fsi ak4642\n"); + goto out; } - pdata = (struct fsi_ak4642_data *)id_entry->driver_data; - - fsi_snd_device = platform_device_alloc("soc-audio", pdata->id); + fsi_snd_device = platform_device_alloc("soc-audio", pinfo->id); if (!fsi_snd_device) goto out; - fsi_dai_link.name = pdata->name; - fsi_dai_link.stream_name = pdata->name; - fsi_dai_link.cpu_dai_name = pdata->cpu_dai; - fsi_dai_link.platform_name = pdata->platform; - fsi_dai_link.codec_name = pdata->codec; - fsi_soc_card.name = pdata->card; + fsi_dai_link.name = pinfo->name; + fsi_dai_link.stream_name = pinfo->name; + fsi_dai_link.cpu_dai_name = pinfo->cpu_dai; + fsi_dai_link.platform_name = pinfo->platform; + fsi_dai_link.codec_name = pinfo->codec; + fsi_soc_card.name = pinfo->card; platform_set_drvdata(fsi_snd_device, &fsi_soc_card); ret = platform_device_add(fsi_snd_device); @@ -96,100 +92,12 @@ static int fsi_ak4642_remove(struct platform_device *pdev) return 0; } -static struct fsi_ak4642_data fsi_a_ak4642 = { - .name = "AK4642", - .card = "FSIA-AK4642", - .cpu_dai = "fsia-dai", - .codec = "ak4642-codec.0-0012", - .platform = "sh_fsi.0", - .id = FSI_PORT_A, -}; - -static struct fsi_ak4642_data fsi_b_ak4642 = { - .name = "AK4642", - .card = "FSIB-AK4642", - .cpu_dai = "fsib-dai", - .codec = "ak4642-codec.0-0012", - .platform = "sh_fsi.0", - .id = FSI_PORT_B, -}; - -static struct fsi_ak4642_data fsi_a_ak4643 = { - .name = "AK4643", - .card = "FSIA-AK4643", - .cpu_dai = "fsia-dai", - .codec = "ak4642-codec.0-0013", - .platform = "sh_fsi.0", - .id = FSI_PORT_A, -}; - -static struct fsi_ak4642_data fsi_b_ak4643 = { - .name = "AK4643", - .card = "FSIB-AK4643", - .cpu_dai = "fsib-dai", - .codec = "ak4642-codec.0-0013", - .platform = "sh_fsi.0", - .id = FSI_PORT_B, -}; - -static struct fsi_ak4642_data fsi2_a_ak4642 = { - .name = "AK4642", - .card = "FSI2A-AK4642", - .cpu_dai = "fsia-dai", - .codec = "ak4642-codec.0-0012", - .platform = "sh_fsi2", - .id = FSI_PORT_A, -}; - -static struct fsi_ak4642_data fsi2_b_ak4642 = { - .name = "AK4642", - .card = "FSI2B-AK4642", - .cpu_dai = "fsib-dai", - .codec = "ak4642-codec.0-0012", - .platform = "sh_fsi2", - .id = FSI_PORT_B, -}; - -static struct fsi_ak4642_data fsi2_a_ak4643 = { - .name = "AK4643", - .card = "FSI2A-AK4643", - .cpu_dai = "fsia-dai", - .codec = "ak4642-codec.0-0013", - .platform = "sh_fsi2", - .id = FSI_PORT_A, -}; - -static struct fsi_ak4642_data fsi2_b_ak4643 = { - .name = "AK4643", - .card = "FSI2B-AK4643", - .cpu_dai = "fsib-dai", - .codec = "ak4642-codec.0-0013", - .platform = "sh_fsi2", - .id = FSI_PORT_B, -}; - -static struct platform_device_id fsi_id_table[] = { - /* FSI */ - { "sh_fsi_a_ak4642", (kernel_ulong_t)&fsi_a_ak4642 }, - { "sh_fsi_b_ak4642", (kernel_ulong_t)&fsi_b_ak4642 }, - { "sh_fsi_a_ak4643", (kernel_ulong_t)&fsi_a_ak4643 }, - { "sh_fsi_b_ak4643", (kernel_ulong_t)&fsi_b_ak4643 }, - - /* FSI 2 */ - { "sh_fsi2_a_ak4642", (kernel_ulong_t)&fsi2_a_ak4642 }, - { "sh_fsi2_b_ak4642", (kernel_ulong_t)&fsi2_b_ak4642 }, - { "sh_fsi2_a_ak4643", (kernel_ulong_t)&fsi2_a_ak4643 }, - { "sh_fsi2_b_ak4643", (kernel_ulong_t)&fsi2_b_ak4643 }, - {}, -}; - static struct platform_driver fsi_ak4642 = { .driver = { .name = "fsi-ak4642-audio", }, .probe = fsi_ak4642_probe, .remove = fsi_ak4642_remove, - .id_table = fsi_id_table, }; static int __init fsi_ak4642_init(void) -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* Re: [PATCH 1/5][resend] ASoC: fsi-ak4642: modify specification method of FSI / ak464x 2011-11-24 0:55 ` [PATCH 1/5][resend] " Kuninori Morimoto @ 2011-11-24 10:45 ` Mark Brown 0 siblings, 0 replies; 30+ messages in thread From: Mark Brown @ 2011-11-24 10:45 UTC (permalink / raw) To: Kuninori Morimoto Cc: Linux-ALSA, Paul Mundt, Kuninori Morimoto, Liam Girdwood On Wed, Nov 23, 2011 at 04:55:34PM -0800, Kuninori Morimoto wrote: > Current fsi-ak4642 was using id_entry name in order to specify > FSI port and ak464x codec. > But it was no sense, no flexibility. > Platform can specify FSI/ak464x pair by this patch. Applied, thanks. ^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 2/5] ASoC: ak4642: ak4642 was tested 2011-11-07 6:03 ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx 2011-11-07 6:04 ` [PATCH 1/5] ASoC: fsi-ak4642: modify specification method of FSI / ak464x Kuninori Morimoto @ 2011-11-07 6:04 ` Kuninori Morimoto 2011-11-08 10:57 ` Mark Brown 2011-11-07 6:05 ` [PATCH 3/5] ASoC: ak4642: headphone/stereo-line output control Kuninori Morimoto ` (3 subsequent siblings) 5 siblings, 1 reply; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-07 6:04 UTC (permalink / raw) To: Paul Mundt, Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto ak4642 was tested by ms7724se board Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- sound/soc/codecs/ak4642.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 79c1b3d..50da176 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -18,7 +18,7 @@ * This is very simple driver. * It can use headphone output / stereo input only * - * AK4642 is not tested. + * AK4642 is tested. * AK4643 is tested. */ -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* Re: [PATCH 2/5] ASoC: ak4642: ak4642 was tested 2011-11-07 6:04 ` [PATCH 2/5] ASoC: ak4642: ak4642 was tested Kuninori Morimoto @ 2011-11-08 10:57 ` Mark Brown 0 siblings, 0 replies; 30+ messages in thread From: Mark Brown @ 2011-11-08 10:57 UTC (permalink / raw) To: Kuninori Morimoto Cc: Linux-ALSA, Paul Mundt, Kuninori Morimoto, Liam Girdwood On Sun, Nov 06, 2011 at 10:04:53PM -0800, Kuninori Morimoto wrote: > ak4642 was tested by ms7724se board Applied, thanks. ^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 3/5] ASoC: ak4642: headphone/stereo-line output control 2011-11-07 6:03 ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx 2011-11-07 6:04 ` [PATCH 1/5] ASoC: fsi-ak4642: modify specification method of FSI / ak464x Kuninori Morimoto 2011-11-07 6:04 ` [PATCH 2/5] ASoC: ak4642: ak4642 was tested Kuninori Morimoto @ 2011-11-07 6:05 ` Kuninori Morimoto 2011-11-08 10:55 ` Mark Brown 2011-11-07 6:05 ` [PATCH 4/5] ASoC: ak4642: add ak4648 support Kuninori Morimoto ` (2 subsequent siblings) 5 siblings, 1 reply; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-07 6:05 UTC (permalink / raw) To: Paul Mundt, Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto This patch modifies ak4642 driver to output both headphone/stereo-line in same time. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- sound/soc/codecs/ak4642.c | 44 +++++++++++++++++++++++++++++++++++--------- 1 files changed, 35 insertions(+), 9 deletions(-) diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 50da176..f30e434 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -75,6 +75,7 @@ /* PW_MGMT1*/ #define PMVCM (1 << 6) /* VCOM Power Management */ #define PMMIN (1 << 5) /* MIN Input Power Management */ +#define PMLO (1 << 3) /* Stereo Line Out Power Management */ #define PMDAC (1 << 2) /* DAC Power Management */ #define PMADL (1 << 0) /* MIC Amp Lch and ADC Lch Power Management */ @@ -98,6 +99,9 @@ #define PMMP (1 << 2) /* MPWR pin Power Management */ #define MGAIN0 (1 << 0) /* MIC amp gain*/ +/* SG_SL2 */ +#define LOPS (1 << 6) /* Stereo Line Output Power-Save Mode */ + /* TIMER */ #define ZTM(param) ((param & 0x3) << 4) /* ALC Zoro Crossing TimeOut */ #define WTM(param) (((param & 0x4) << 4) | ((param & 0x3) << 2)) @@ -130,10 +134,13 @@ #define FS_MASK (FS0 | FS1 | FS2 | FS3) /* MD_CTL3 */ -#define BST1 (1 << 3) +#define DEM0 (1 << 0) /* De-emphasis Frequency Select */ +#define BST1 (1 << 3) /* Bass Boost Function Select */ +#define DVOLC (1 << 4) /* Output Digital Volume Control Mode Select */ /* MD_CTL4 */ -#define DACH (1 << 0) +#define DACH (1 << 0) /* Switch Control from DAC to Headphone-Amp */ +#define IVOLC (1 << 3) /* Input Digital Volume Control Mode Select */ /* * Playback Volume (table 39) @@ -241,21 +248,31 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream, if (is_play) { /* - * start headphone output + * start output + * - headphone + * - stereo line * * PLL, Master Mode * Audio I/F Format :MSB justified (ADC & DAC) - * Bass Boost Level : Middle + * Digital Volume : -8dB + * Bass Boost Level : Middle + * LOVL=MINL bits : 0 * * This operation came from example code of * "ASAHI KASEI AK4642" (japanese) manual p97. + * "ASAHI KASEI AK4642" (japanese) manual p98. + * */ snd_soc_update_bits(codec, MD_CTL4, DACH, DACH); snd_soc_update_bits(codec, MD_CTL3, BST1, BST1); + snd_soc_update_bits(codec, SG_SL1, DACL | MGAIN0, DACL); ak4642_write(codec, L_IVC, 0x91); /* volume */ ak4642_write(codec, R_IVC, 0x91); /* volume */ - snd_soc_update_bits(codec, PW_MGMT1, PMVCM | PMMIN | PMDAC, - PMVCM | PMMIN | PMDAC); + snd_soc_update_bits(codec, SG_SL2, LOPS, LOPS); + snd_soc_update_bits(codec, PW_MGMT1, + PMVCM | PMMIN | PMLO | PMDAC, + PMVCM | PMMIN | PMLO | PMDAC); + snd_soc_update_bits(codec, SG_SL2, LOPS, 0); snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK, PMHP); snd_soc_update_bits(codec, PW_MGMT2, HPMTN, HPMTN); } else { @@ -272,7 +289,9 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream, * This operation came from example code of * "ASAHI KASEI AK4642" (japanese) manual p94. */ - ak4642_write(codec, SG_SL1, PMMP | MGAIN0); + snd_soc_update_bits(codec, SG_SL1, + PMMP | MGAIN0, + PMMP | MGAIN0); ak4642_write(codec, TIMER, ZTM(0x3) | WTM(0x3)); ak4642_write(codec, ALC_CTL1, ALC | LMTH0); snd_soc_update_bits(codec, PW_MGMT1, PMVCM | PMADL, @@ -290,12 +309,19 @@ static void ak4642_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc_codec *codec = dai->codec; if (is_play) { - /* stop headphone output */ + /* + * stop output + * - headphone + * - stereo line + */ + snd_soc_update_bits(codec, SG_SL2, LOPS, LOPS); snd_soc_update_bits(codec, PW_MGMT2, HPMTN, 0); snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK, 0); - snd_soc_update_bits(codec, PW_MGMT1, PMMIN | PMDAC, 0); + snd_soc_update_bits(codec, PW_MGMT1, PMMIN | PMLO | PMDAC, 0); snd_soc_update_bits(codec, MD_CTL3, BST1, 0); snd_soc_update_bits(codec, MD_CTL4, DACH, 0); + snd_soc_update_bits(codec, SG_SL1, DACL, 0); + snd_soc_update_bits(codec, SG_SL2, LOPS, 0); } else { /* stop stereo input */ snd_soc_update_bits(codec, PW_MGMT1, PMADL, 0); -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* Re: [PATCH 3/5] ASoC: ak4642: headphone/stereo-line output control 2011-11-07 6:05 ` [PATCH 3/5] ASoC: ak4642: headphone/stereo-line output control Kuninori Morimoto @ 2011-11-08 10:55 ` Mark Brown 2011-11-08 11:22 ` Kuninori Morimoto 0 siblings, 1 reply; 30+ messages in thread From: Mark Brown @ 2011-11-08 10:55 UTC (permalink / raw) To: Kuninori Morimoto Cc: Linux-ALSA, Paul Mundt, Kuninori Morimoto, Liam Girdwood On Sun, Nov 06, 2011 at 10:05:05PM -0800, Kuninori Morimoto wrote: > This patch modifies ak4642 driver to output both headphone/stereo-line in same time. If you're going to start implementing any sort of routing control you should really be updating the driver to work normally - we shouldn't really have accepted the limited functionality in the first place. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 3/5] ASoC: ak4642: headphone/stereo-line output control 2011-11-08 10:55 ` Mark Brown @ 2011-11-08 11:22 ` Kuninori Morimoto 2011-11-08 11:40 ` Mark Brown 0 siblings, 1 reply; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-08 11:22 UTC (permalink / raw) To: Mark Brown; +Cc: Linux-ALSA, Paul Mundt, Kuninori Morimoto, Liam Girdwood Hi Mark Thank you for checking patch > > This patch modifies ak4642 driver to output both headphone/stereo-line in same time. > > If you're going to start implementing any sort of routing control you > should really be updating the driver to work normally - we shouldn't > really have accepted the limited functionality in the first place. Sorry. what is this "limited functionality" mean ? We used headphone output by ak4642/ak4643 on our (old) board. today, our new board use stereo-line output by ak4648. And ak4642/ak4643/ak4648 can output headphone/stereo-line in same time. I think there is no limited functionality on these chips. but am I misunderstanding ? Best regards --- Kuninori Morimoto ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 3/5] ASoC: ak4642: headphone/stereo-line output control 2011-11-08 11:22 ` Kuninori Morimoto @ 2011-11-08 11:40 ` Mark Brown 0 siblings, 0 replies; 30+ messages in thread From: Mark Brown @ 2011-11-08 11:40 UTC (permalink / raw) To: Kuninori Morimoto Cc: Linux-ALSA, Paul Mundt, Kuninori Morimoto, Liam Girdwood On Tue, Nov 08, 2011 at 03:22:22AM -0800, Kuninori Morimoto wrote: > > If you're going to start implementing any sort of routing control you > > should really be updating the driver to work normally - we shouldn't > > really have accepted the limited functionality in the first place. > Sorry. what is this "limited functionality" mean ? Your driver is using hard coded paths rather than offering the user runtime control of the audio routing. ^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 4/5] ASoC: ak4642: add ak4648 support 2011-11-07 6:03 ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx ` (2 preceding siblings ...) 2011-11-07 6:05 ` [PATCH 3/5] ASoC: ak4642: headphone/stereo-line output control Kuninori Morimoto @ 2011-11-07 6:05 ` Kuninori Morimoto 2011-11-08 11:01 ` Mark Brown 2011-11-07 6:05 ` [PATCH 5/5] ASoC: fsi: add valid data position control support Kuninori Morimoto 2011-11-10 8:20 ` ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx 5 siblings, 1 reply; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-07 6:05 UTC (permalink / raw) To: Paul Mundt, Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto This patch adds ak4648 support. ak4642/ak4643/ak4648 are register compatible, but these have a slightly different register default value. struct ak4642_chip is added in order to absorb this difference. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- sound/soc/codecs/ak4642.c | 74 +++++++++++++++++++++++++++++++++++++++----- 1 files changed, 65 insertions(+), 9 deletions(-) diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index f30e434..1b768ad 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -20,6 +20,7 @@ * * AK4642 is tested. * AK4643 is tested. + * AK4648 is tested. */ #include <linux/delay.h> @@ -70,8 +71,6 @@ #define HP_MS 0x23 #define SPK_MS 0x24 -#define AK4642_CACHEREGNUM 0x25 - /* PW_MGMT1*/ #define PMVCM (1 << 6) /* VCOM Power Management */ #define PMMIN (1 << 5) /* MIN Input Power Management */ @@ -158,28 +157,58 @@ static const struct snd_kcontrol_new ak4642_snd_controls[] = { 0, 0xFF, 1, out_tlv), }; +/* + * ak464x list + */ + +#define AK4642_CACHEREGNUM (0x24 + 1) +#define AK4648_CACHEREGNUM (0x27 + 1) +#define AK464x_CACHEREGNUM_MAX AK4648_CACHEREGNUM /* max size */ /* codec private data */ +struct ak4642_reg_fix { + unsigned int reg; + unsigned int val; +}; + +struct ak4642_chip { + int reg_max; + struct ak4642_reg_fix *reg_fix; + int reg_fix_size; +}; + struct ak4642_priv { unsigned int sysclk; enum snd_soc_control_type control_type; void *control_data; + struct ak4642_chip *chip; }; /* * ak4642 register cache */ -static const u8 ak4642_reg[AK4642_CACHEREGNUM] = { +static const u8 ak4642_reg[AK464x_CACHEREGNUM_MAX] = { 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0xe1, 0xe1, 0x18, 0x00, - 0xe1, 0x18, 0x11, 0x08, + 0xe1, 0x18, 0x11, 0xff, /* 0xF will be fixed */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, + 0x00, 0xff, 0xff, 0xff, /* 0x25 - 0x27 will be fixed */ +}; + +static struct ak4642_reg_fix ak4642_reg_fix[] = { + { 0xF, 0x08 } +}; + +static struct ak4642_reg_fix ak4648_reg_fix[] = { + { 0xF, 0xb8 }, + { 0x25, 0x88 }, + { 0x26, 0x88 }, + { 0x27, 0x08 }, }; /* @@ -496,6 +525,8 @@ static int ak4642_resume(struct snd_soc_codec *codec) static int ak4642_probe(struct snd_soc_codec *codec) { struct ak4642_priv *ak4642 = snd_soc_codec_get_drvdata(codec); + struct ak4642_chip *chip = ak4642->chip; + int i; dev_info(codec->dev, "AK4642 Audio Codec %s", AK4642_VERSION); @@ -505,6 +536,15 @@ static int ak4642_probe(struct snd_soc_codec *codec) snd_soc_add_controls(codec, ak4642_snd_controls, ARRAY_SIZE(ak4642_snd_controls)); + /* + * fixup register cache + * each ak464x have a slightly different value + */ + for (i = 0; i < chip->reg_fix_size; i++) + ak4642_write_reg_cache(codec, + chip->reg_fix[i].reg, + chip->reg_fix[i].val); + return 0; } @@ -530,8 +570,9 @@ static __devinit int ak4642_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, ak4642); - ak4642->control_data = i2c; - ak4642->control_type = SND_SOC_I2C; + ak4642->control_data = i2c; + ak4642->control_type = SND_SOC_I2C; + ak4642->chip = (struct ak4642_chip *)id->driver_data; ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_ak4642, &ak4642_dai, 1); @@ -547,9 +588,24 @@ static __devexit int ak4642_i2c_remove(struct i2c_client *client) return 0; } +/* ak4642 / ak4643 */ +static const struct ak4642_chip ak4642_chip = { + .reg_max = AK4642_CACHEREGNUM, + .reg_fix = ak4642_reg_fix, + .reg_fix_size = ARRAY_SIZE(ak4642_reg_fix), +}; + +/* ak4648 */ +static const struct ak4642_chip ak4648_chip = { + .reg_max = AK4648_CACHEREGNUM, + .reg_fix = ak4648_reg_fix, + .reg_fix_size = ARRAY_SIZE(ak4648_reg_fix), +}; + static const struct i2c_device_id ak4642_i2c_id[] = { - { "ak4642", 0 }, - { "ak4643", 0 }, + { "ak4642", (kernel_ulong_t)&ak4642_chip }, + { "ak4643", (kernel_ulong_t)&ak4642_chip }, /* same as ak4642 */ + { "ak4648", (kernel_ulong_t)&ak4648_chip }, { } }; MODULE_DEVICE_TABLE(i2c, ak4642_i2c_id); -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* Re: [PATCH 4/5] ASoC: ak4642: add ak4648 support 2011-11-07 6:05 ` [PATCH 4/5] ASoC: ak4642: add ak4648 support Kuninori Morimoto @ 2011-11-08 11:01 ` Mark Brown 0 siblings, 0 replies; 30+ messages in thread From: Mark Brown @ 2011-11-08 11:01 UTC (permalink / raw) To: Kuninori Morimoto Cc: Linux-ALSA, Paul Mundt, Kuninori Morimoto, Liam Girdwood On Sun, Nov 06, 2011 at 10:05:15PM -0800, Kuninori Morimoto wrote: > +#define AK4642_CACHEREGNUM (0x24 + 1) > +#define AK4648_CACHEREGNUM (0x27 + 1) > + /* > + * fixup register cache > + * each ak464x have a slightly different value > + */ > + for (i = 0; i < chip->reg_fix_size; i++) > + ak4642_write_reg_cache(codec, > + chip->reg_fix[i].reg, > + chip->reg_fix[i].val); This won't work properly when resyncing the cache as the driver will think that these are non-default values. Given how small the register maps are just have different default tables, it's not worth the effort of doing anything more complex. ^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 5/5] ASoC: fsi: add valid data position control support 2011-11-07 6:03 ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx ` (3 preceding siblings ...) 2011-11-07 6:05 ` [PATCH 4/5] ASoC: ak4642: add ak4648 support Kuninori Morimoto @ 2011-11-07 6:05 ` Kuninori Morimoto 2011-11-08 11:02 ` Mark Brown 2011-11-10 8:20 ` ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx 5 siblings, 1 reply; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-07 6:05 UTC (permalink / raw) To: Paul Mundt, Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto FSI2 can control valid data position, like package in front/back or stream mode (16bit x 2). But current fsi driver is assuming it was in-back. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- sound/soc/sh/fsi.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-) diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index 8e112cc..4bfc372 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c @@ -31,7 +31,9 @@ #define REG_DIDT 0x0020 #define REG_DODT 0x0024 #define REG_MUTE_ST 0x0028 +#define REG_OUT_DMAC 0x002C #define REG_OUT_SEL 0x0030 +#define REG_IN_DMAC 0x0038 /* master register */ #define MST_CLK_RST 0x0210 @@ -885,6 +887,8 @@ static int fsi_hw_startup(struct fsi_priv *fsi, int is_play, struct device *dev) { + struct fsi_master *master = fsi_get_master(fsi); + int fsi_ver = master->core->ver; u32 flags = fsi_get_info_flags(fsi); u32 data = 0; @@ -919,6 +923,17 @@ static int fsi_hw_startup(struct fsi_priv *fsi, fsi_reg_mask_set(fsi, OUT_SEL, DMMD, DMMD); } + /* + * FIXME + * + * FSI driver assumed that data package is in-back. + * FSI2 chip can select it. + */ + if (fsi_ver >= 2) { + fsi_reg_write(fsi, OUT_DMAC, (1 << 4)); + fsi_reg_write(fsi, IN_DMAC, (1 << 4)); + } + /* irq clear */ fsi_irq_disable(fsi, is_play); fsi_irq_clear_status(fsi); -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* Re: [PATCH 5/5] ASoC: fsi: add valid data position control support 2011-11-07 6:05 ` [PATCH 5/5] ASoC: fsi: add valid data position control support Kuninori Morimoto @ 2011-11-08 11:02 ` Mark Brown 0 siblings, 0 replies; 30+ messages in thread From: Mark Brown @ 2011-11-08 11:02 UTC (permalink / raw) To: Kuninori Morimoto Cc: Linux-ALSA, Paul Mundt, Kuninori Morimoto, Liam Girdwood On Sun, Nov 06, 2011 at 10:05:25PM -0800, Kuninori Morimoto wrote: > FSI2 can control valid data position, like > package in front/back or stream mode (16bit x 2). > But current fsi driver is assuming it was in-back. Applied, thanks. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: ASoC: ak4642/fsi: add ak4648 support 2011-11-07 6:03 ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx ` (4 preceding siblings ...) 2011-11-07 6:05 ` [PATCH 5/5] ASoC: fsi: add valid data position control support Kuninori Morimoto @ 2011-11-10 8:20 ` kuninori.morimoto.gx 2011-11-10 8:21 ` [PATCH 1/5] ASoC: ak4642: add ak4642_set_bias_level() Kuninori Morimoto ` (5 more replies) 5 siblings, 6 replies; 30+ messages in thread From: kuninori.morimoto.gx @ 2011-11-10 8:20 UTC (permalink / raw) To: Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto Hi Mark, Liam These are redo of below patches > ASoC: ak4642: headphone/stereo-line output control > ASoC: ak4642: add ak4648 support Kuninori Morimoto (5): ASoC: ak4642: add ak4642_set_bias_level() ASoC: ak4642: add DAPM support for HeadPhone Output ASoC: ak4642: add headphone mute switch control ASoC: ak4642: add Line out support ASoC: ak4642: add ak4648 support This time I tried to use DAPM for "Output". I will try "Input" case in the future ^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 1/5] ASoC: ak4642: add ak4642_set_bias_level() 2011-11-10 8:20 ` ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx @ 2011-11-10 8:21 ` Kuninori Morimoto 2011-11-10 11:27 ` Mark Brown 2011-11-10 8:21 ` [PATCH 2/5] ASoC: ak4642: add DAPM support for HeadPhone Output Kuninori Morimoto ` (4 subsequent siblings) 5 siblings, 1 reply; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-10 8:21 UTC (permalink / raw) To: Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- sound/soc/codecs/ak4642.c | 31 +++++++++++++++++++++++++++---- 1 files changed, 27 insertions(+), 4 deletions(-) diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index b854eb0..eaf064a 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -196,8 +196,8 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream, snd_soc_update_bits(codec, MD_CTL3, BST1, BST1); snd_soc_write(codec, L_IVC, 0x91); /* volume */ snd_soc_write(codec, R_IVC, 0x91); /* volume */ - snd_soc_update_bits(codec, PW_MGMT1, PMVCM | PMMIN | PMDAC, - PMVCM | PMMIN | PMDAC); + snd_soc_update_bits(codec, PW_MGMT1, PMMIN | PMDAC, + PMMIN | PMDAC); snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK, PMHP); snd_soc_update_bits(codec, PW_MGMT2, HPMTN, HPMTN); } else { @@ -217,8 +217,7 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream, snd_soc_write(codec, SG_SL1, PMMP | MGAIN0); snd_soc_write(codec, TIMER, ZTM(0x3) | WTM(0x3)); snd_soc_write(codec, ALC_CTL1, ALC | LMTH0); - snd_soc_update_bits(codec, PW_MGMT1, PMVCM | PMADL, - PMVCM | PMADL); + snd_soc_update_bits(codec, PW_MGMT1, PMADL, PMADL); snd_soc_update_bits(codec, PW_MGMT3, PMADR, PMADR); } @@ -376,6 +375,20 @@ static int ak4642_dai_hw_params(struct snd_pcm_substream *substream, return 0; } +static int ak4642_set_bias_level(struct snd_soc_codec *codec, + enum snd_soc_bias_level level) +{ + switch (level) { + case SND_SOC_BIAS_OFF: + snd_soc_write(codec, PW_MGMT1, 0x00); + break; + default: + snd_soc_update_bits(codec, PW_MGMT1, PMVCM, PMVCM); + } + codec->dapm.bias_level = level; + return 0; +} + static struct snd_soc_dai_ops ak4642_dai_ops = { .startup = ak4642_dai_startup, .shutdown = ak4642_dai_shutdown, @@ -425,12 +438,22 @@ static int ak4642_probe(struct snd_soc_codec *codec) snd_soc_add_controls(codec, ak4642_snd_controls, ARRAY_SIZE(ak4642_snd_controls)); + ak4642_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + + return 0; +} + +static int ak4642_remove(struct snd_soc_codec *codec) +{ + ak4642_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } static struct snd_soc_codec_driver soc_codec_dev_ak4642 = { .probe = ak4642_probe, + .remove = ak4642_remove, .resume = ak4642_resume, + .set_bias_level = ak4642_set_bias_level, .reg_cache_size = ARRAY_SIZE(ak4642_reg), .reg_word_size = sizeof(u8), .reg_cache_default = ak4642_reg, -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* Re: [PATCH 1/5] ASoC: ak4642: add ak4642_set_bias_level() 2011-11-10 8:21 ` [PATCH 1/5] ASoC: ak4642: add ak4642_set_bias_level() Kuninori Morimoto @ 2011-11-10 11:27 ` Mark Brown 0 siblings, 0 replies; 30+ messages in thread From: Mark Brown @ 2011-11-10 11:27 UTC (permalink / raw) To: Kuninori Morimoto; +Cc: Linux-ALSA, Kuninori Morimoto, Liam Girdwood On Thu, Nov 10, 2011 at 12:21:13AM -0800, Kuninori Morimoto wrote: > + switch (level) { > + case SND_SOC_BIAS_OFF: > + snd_soc_write(codec, PW_MGMT1, 0x00); > + break; > + default: > + snd_soc_update_bits(codec, PW_MGMT1, PMVCM, PMVCM); > + } Should have a break; here for coding style. ^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 2/5] ASoC: ak4642: add DAPM support for HeadPhone Output 2011-11-10 8:20 ` ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx 2011-11-10 8:21 ` [PATCH 1/5] ASoC: ak4642: add ak4642_set_bias_level() Kuninori Morimoto @ 2011-11-10 8:21 ` Kuninori Morimoto 2011-11-10 8:21 ` [PATCH 3/5] ASoC: ak4642: add headphone mute switch control Kuninori Morimoto ` (3 subsequent siblings) 5 siblings, 0 replies; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-10 8:21 UTC (permalink / raw) To: Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- sound/soc/codecs/ak4642.c | 44 +++++++++++++++++++++++++++++++++++--------- 1 files changed, 35 insertions(+), 9 deletions(-) diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index eaf064a..8aa9dd1 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -152,6 +152,37 @@ static const struct snd_kcontrol_new ak4642_snd_controls[] = { 0, 0xFF, 1, out_tlv), }; +static const struct snd_kcontrol_new ak4642_hpout_mixer_controls[] = { + SOC_DAPM_SINGLE("DACH", MD_CTL4, 0, 1, 0), +}; + +static const struct snd_soc_dapm_widget ak4642_dapm_widgets[] = { + + /* Outputs */ + SND_SOC_DAPM_OUTPUT("HPOUTL"), + SND_SOC_DAPM_OUTPUT("HPOUTR"), + + SND_SOC_DAPM_MIXER("HPOUTL Mixer", PW_MGMT2, 5, 0, + &ak4642_hpout_mixer_controls[0], + ARRAY_SIZE(ak4642_hpout_mixer_controls)), + + SND_SOC_DAPM_MIXER("HPOUTR Mixer", PW_MGMT2, 4, 0, + &ak4642_hpout_mixer_controls[0], + ARRAY_SIZE(ak4642_hpout_mixer_controls)), + + /* DAC */ + SND_SOC_DAPM_DAC("DAC", "HiFi Playback", PW_MGMT1, 2, 0), +}; + +static const struct snd_soc_dapm_route ak4642_intercon[] = { + + /* Outputs */ + {"HPOUTL", "NULL", "HPOUTL Mixer"}, + {"HPOUTR", "NULL", "HPOUTR Mixer"}, + + {"HPOUTL Mixer", "DACH", "DAC"}, + {"HPOUTR Mixer", "DACH", "DAC"}, +}; /* codec private data */ struct ak4642_priv { @@ -192,13 +223,8 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream, * This operation came from example code of * "ASAHI KASEI AK4642" (japanese) manual p97. */ - snd_soc_update_bits(codec, MD_CTL4, DACH, DACH); - snd_soc_update_bits(codec, MD_CTL3, BST1, BST1); snd_soc_write(codec, L_IVC, 0x91); /* volume */ snd_soc_write(codec, R_IVC, 0x91); /* volume */ - snd_soc_update_bits(codec, PW_MGMT1, PMMIN | PMDAC, - PMMIN | PMDAC); - snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK, PMHP); snd_soc_update_bits(codec, PW_MGMT2, HPMTN, HPMTN); } else { /* @@ -233,10 +259,6 @@ static void ak4642_dai_shutdown(struct snd_pcm_substream *substream, if (is_play) { /* stop headphone output */ snd_soc_update_bits(codec, PW_MGMT2, HPMTN, 0); - snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK, 0); - snd_soc_update_bits(codec, PW_MGMT1, PMMIN | PMDAC, 0); - snd_soc_update_bits(codec, MD_CTL3, BST1, 0); - snd_soc_update_bits(codec, MD_CTL4, DACH, 0); } else { /* stop stereo input */ snd_soc_update_bits(codec, PW_MGMT1, PMADL, 0); @@ -457,6 +479,10 @@ static struct snd_soc_codec_driver soc_codec_dev_ak4642 = { .reg_cache_size = ARRAY_SIZE(ak4642_reg), .reg_word_size = sizeof(u8), .reg_cache_default = ak4642_reg, + .dapm_widgets = ak4642_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ak4642_dapm_widgets), + .dapm_routes = ak4642_intercon, + .num_dapm_routes = ARRAY_SIZE(ak4642_intercon), }; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 3/5] ASoC: ak4642: add headphone mute switch control 2011-11-10 8:20 ` ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx 2011-11-10 8:21 ` [PATCH 1/5] ASoC: ak4642: add ak4642_set_bias_level() Kuninori Morimoto 2011-11-10 8:21 ` [PATCH 2/5] ASoC: ak4642: add DAPM support for HeadPhone Output Kuninori Morimoto @ 2011-11-10 8:21 ` Kuninori Morimoto 2011-11-10 11:30 ` Mark Brown 2011-11-10 8:21 ` [PATCH 4/5] ASoC: ak4642: add Line out support Kuninori Morimoto ` (2 subsequent siblings) 5 siblings, 1 reply; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-10 8:21 UTC (permalink / raw) To: Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- sound/soc/codecs/ak4642.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 8aa9dd1..473202a 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -150,6 +150,8 @@ static const struct snd_kcontrol_new ak4642_snd_controls[] = { SOC_DOUBLE_R_TLV("Digital Playback Volume", L_DVC, R_DVC, 0, 0xFF, 1, out_tlv), + + SOC_SINGLE("Headphone Mute Switch", PW_MGMT2, 6, 1, 0), }; static const struct snd_kcontrol_new ak4642_hpout_mixer_controls[] = { @@ -225,7 +227,6 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream, */ snd_soc_write(codec, L_IVC, 0x91); /* volume */ snd_soc_write(codec, R_IVC, 0x91); /* volume */ - snd_soc_update_bits(codec, PW_MGMT2, HPMTN, HPMTN); } else { /* * start stereo input @@ -257,8 +258,6 @@ static void ak4642_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc_codec *codec = dai->codec; if (is_play) { - /* stop headphone output */ - snd_soc_update_bits(codec, PW_MGMT2, HPMTN, 0); } else { /* stop stereo input */ snd_soc_update_bits(codec, PW_MGMT1, PMADL, 0); -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* Re: [PATCH 3/5] ASoC: ak4642: add headphone mute switch control 2011-11-10 8:21 ` [PATCH 3/5] ASoC: ak4642: add headphone mute switch control Kuninori Morimoto @ 2011-11-10 11:30 ` Mark Brown 0 siblings, 0 replies; 30+ messages in thread From: Mark Brown @ 2011-11-10 11:30 UTC (permalink / raw) To: Kuninori Morimoto; +Cc: Linux-ALSA, Kuninori Morimoto, Liam Girdwood On Thu, Nov 10, 2011 at 12:21:39AM -0800, Kuninori Morimoto wrote: > + > + SOC_SINGLE("Headphone Mute Switch", PW_MGMT2, 6, 1, 0), Just plain "Headphone Switch". ^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 4/5] ASoC: ak4642: add Line out support 2011-11-10 8:20 ` ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx ` (2 preceding siblings ...) 2011-11-10 8:21 ` [PATCH 3/5] ASoC: ak4642: add headphone mute switch control Kuninori Morimoto @ 2011-11-10 8:21 ` Kuninori Morimoto 2011-11-10 8:21 ` [PATCH 5/5] ASoC: ak4642: add ak4648 support Kuninori Morimoto 2011-11-10 11:32 ` ASoC: ak4642/fsi: " Mark Brown 5 siblings, 0 replies; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-10 8:21 UTC (permalink / raw) To: Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- sound/soc/codecs/ak4642.c | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 473202a..8b32f41 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -158,11 +158,16 @@ static const struct snd_kcontrol_new ak4642_hpout_mixer_controls[] = { SOC_DAPM_SINGLE("DACH", MD_CTL4, 0, 1, 0), }; +static const struct snd_kcontrol_new ak4642_lout_mixer_controls[] = { + SOC_DAPM_SINGLE("DACL", SG_SL1, 4, 1, 0), +}; + static const struct snd_soc_dapm_widget ak4642_dapm_widgets[] = { /* Outputs */ SND_SOC_DAPM_OUTPUT("HPOUTL"), SND_SOC_DAPM_OUTPUT("HPOUTR"), + SND_SOC_DAPM_OUTPUT("LINEOUT"), SND_SOC_DAPM_MIXER("HPOUTL Mixer", PW_MGMT2, 5, 0, &ak4642_hpout_mixer_controls[0], @@ -172,6 +177,10 @@ static const struct snd_soc_dapm_widget ak4642_dapm_widgets[] = { &ak4642_hpout_mixer_controls[0], ARRAY_SIZE(ak4642_hpout_mixer_controls)), + SND_SOC_DAPM_MIXER("LINEOUT Mixer", PW_MGMT1, 3, 0, + &ak4642_lout_mixer_controls[0], + ARRAY_SIZE(ak4642_lout_mixer_controls)), + /* DAC */ SND_SOC_DAPM_DAC("DAC", "HiFi Playback", PW_MGMT1, 2, 0), }; @@ -181,9 +190,12 @@ static const struct snd_soc_dapm_route ak4642_intercon[] = { /* Outputs */ {"HPOUTL", "NULL", "HPOUTL Mixer"}, {"HPOUTR", "NULL", "HPOUTR Mixer"}, + {"LINEOUT", "NULL", "LINEOUT Mixer"}, {"HPOUTL Mixer", "DACH", "DAC"}, {"HPOUTR Mixer", "DACH", "DAC"}, + {"LINEOUT Mixer", "DACL", "DAC"}, + }; /* codec private data */ -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 5/5] ASoC: ak4642: add ak4648 support 2011-11-10 8:20 ` ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx ` (3 preceding siblings ...) 2011-11-10 8:21 ` [PATCH 4/5] ASoC: ak4642: add Line out support Kuninori Morimoto @ 2011-11-10 8:21 ` Kuninori Morimoto 2011-11-10 11:32 ` ASoC: ak4642/fsi: " Mark Brown 5 siblings, 0 replies; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-10 8:21 UTC (permalink / raw) To: Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- sound/soc/codecs/ak4642.c | 44 ++++++++++++++++++++++++++++++++++++-------- 1 files changed, 36 insertions(+), 8 deletions(-) diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 8b32f41..b7b650a 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -20,6 +20,7 @@ * * AK4642 is tested. * AK4643 is tested. + * AK4648 is tested. */ #include <linux/delay.h> @@ -71,8 +72,6 @@ #define HP_MS 0x23 #define SPK_MS 0x24 -#define AK4642_CACHEREGNUM 0x25 - /* PW_MGMT1*/ #define PMVCM (1 << 6) /* VCOM Power Management */ #define PMMIN (1 << 5) /* MIN Input Power Management */ @@ -207,7 +206,7 @@ struct ak4642_priv { /* * ak4642 register cache */ -static const u8 ak4642_reg[AK4642_CACHEREGNUM] = { +static const u8 ak4642_reg[] = { 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0xe1, 0xe1, 0x18, 0x00, @@ -220,6 +219,19 @@ static const u8 ak4642_reg[AK4642_CACHEREGNUM] = { 0x00, }; +static const u8 ak4648_reg[] = { + 0x00, 0x00, 0x01, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xe1, 0xe1, 0x18, 0x00, + 0xe1, 0x18, 0x11, 0xb8, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x88, 0x08, +}; + static int ak4642_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { @@ -487,9 +499,23 @@ static struct snd_soc_codec_driver soc_codec_dev_ak4642 = { .remove = ak4642_remove, .resume = ak4642_resume, .set_bias_level = ak4642_set_bias_level, - .reg_cache_size = ARRAY_SIZE(ak4642_reg), + .reg_cache_default = ak4642_reg, /* ak4642 reg */ + .reg_cache_size = ARRAY_SIZE(ak4642_reg), /* ak4642 reg */ + .reg_word_size = sizeof(u8), + .dapm_widgets = ak4642_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ak4642_dapm_widgets), + .dapm_routes = ak4642_intercon, + .num_dapm_routes = ARRAY_SIZE(ak4642_intercon), +}; + +static struct snd_soc_codec_driver soc_codec_dev_ak4648 = { + .probe = ak4642_probe, + .remove = ak4642_remove, + .resume = ak4642_resume, + .set_bias_level = ak4642_set_bias_level, + .reg_cache_default = ak4648_reg, /* ak4648 reg */ + .reg_cache_size = ARRAY_SIZE(ak4648_reg), /* ak4648 reg */ .reg_word_size = sizeof(u8), - .reg_cache_default = ak4642_reg, .dapm_widgets = ak4642_dapm_widgets, .num_dapm_widgets = ARRAY_SIZE(ak4642_dapm_widgets), .dapm_routes = ak4642_intercon, @@ -511,7 +537,8 @@ static __devinit int ak4642_i2c_probe(struct i2c_client *i2c, ak4642->control_type = SND_SOC_I2C; ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_ak4642, &ak4642_dai, 1); + (struct snd_soc_codec_driver *)id->driver_data, + &ak4642_dai, 1); if (ret < 0) kfree(ak4642); return ret; @@ -525,8 +552,9 @@ static __devexit int ak4642_i2c_remove(struct i2c_client *client) } static const struct i2c_device_id ak4642_i2c_id[] = { - { "ak4642", 0 }, - { "ak4643", 0 }, + { "ak4642", (kernel_ulong_t)&soc_codec_dev_ak4642 }, + { "ak4643", (kernel_ulong_t)&soc_codec_dev_ak4642 }, + { "ak4648", (kernel_ulong_t)&soc_codec_dev_ak4648 }, { } }; MODULE_DEVICE_TABLE(i2c, ak4642_i2c_id); -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* Re: ASoC: ak4642/fsi: add ak4648 support 2011-11-10 8:20 ` ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx ` (4 preceding siblings ...) 2011-11-10 8:21 ` [PATCH 5/5] ASoC: ak4642: add ak4648 support Kuninori Morimoto @ 2011-11-10 11:32 ` Mark Brown 2011-11-11 0:20 ` ASoC: ak4642/fsi: add ak4648 support v2 kuninori.morimoto.gx 5 siblings, 1 reply; 30+ messages in thread From: Mark Brown @ 2011-11-10 11:32 UTC (permalink / raw) To: kuninori.morimoto.gx; +Cc: Linux-ALSA, Kuninori Morimoto, Liam Girdwood On Thu, Nov 10, 2011 at 12:20:31AM -0800, kuninori.morimoto.gx@renesas.com wrote: > This time I tried to use DAPM for "Output". > I will try "Input" case in the future This looks mostly good, a couple of minor coments but nothing major. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: ASoC: ak4642/fsi: add ak4648 support v2 2011-11-10 11:32 ` ASoC: ak4642/fsi: " Mark Brown @ 2011-11-11 0:20 ` kuninori.morimoto.gx 2011-11-11 0:21 ` [PATCH 1/5 v2] ASoC: ak4642: add ak4642_set_bias_level() Kuninori Morimoto ` (5 more replies) 0 siblings, 6 replies; 30+ messages in thread From: kuninori.morimoto.gx @ 2011-11-11 0:20 UTC (permalink / raw) To: Mark Brown; +Cc: Linux-ALSA, Kuninori Morimoto, Liam Girdwood Hi Mark, Liam > > This time I tried to use DAPM for "Output". > > I will try "Input" case in the future > > This looks mostly good, a couple of minor coments but nothing major. Thank you. These are v2 patch set Kuninori Morimoto (5): ASoC: ak4642: add ak4642_set_bias_level() ASoC: ak4642: add DAPM support for HeadPhone Output ASoC: ak4642: add headphone mute switch control ASoC: ak4642: add Line out support ASoC: ak4642: add ak4648 support ^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 1/5 v2] ASoC: ak4642: add ak4642_set_bias_level() 2011-11-11 0:20 ` ASoC: ak4642/fsi: add ak4648 support v2 kuninori.morimoto.gx @ 2011-11-11 0:21 ` Kuninori Morimoto 2011-11-11 0:21 ` [PATCH 2/5 v2] ASoC: ak4642: add DAPM support for HeadPhone Output Kuninori Morimoto ` (4 subsequent siblings) 5 siblings, 0 replies; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-11 0:21 UTC (permalink / raw) To: Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- v1 -> v2 - add break; for switch default case sound/soc/codecs/ak4642.c | 33 +++++++++++++++++++++++++++++---- 1 files changed, 29 insertions(+), 4 deletions(-) diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index b854eb0..004a093 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -196,8 +196,8 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream, snd_soc_update_bits(codec, MD_CTL3, BST1, BST1); snd_soc_write(codec, L_IVC, 0x91); /* volume */ snd_soc_write(codec, R_IVC, 0x91); /* volume */ - snd_soc_update_bits(codec, PW_MGMT1, PMVCM | PMMIN | PMDAC, - PMVCM | PMMIN | PMDAC); + snd_soc_update_bits(codec, PW_MGMT1, PMMIN | PMDAC, + PMMIN | PMDAC); snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK, PMHP); snd_soc_update_bits(codec, PW_MGMT2, HPMTN, HPMTN); } else { @@ -217,8 +217,7 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream, snd_soc_write(codec, SG_SL1, PMMP | MGAIN0); snd_soc_write(codec, TIMER, ZTM(0x3) | WTM(0x3)); snd_soc_write(codec, ALC_CTL1, ALC | LMTH0); - snd_soc_update_bits(codec, PW_MGMT1, PMVCM | PMADL, - PMVCM | PMADL); + snd_soc_update_bits(codec, PW_MGMT1, PMADL, PMADL); snd_soc_update_bits(codec, PW_MGMT3, PMADR, PMADR); } @@ -376,6 +375,22 @@ static int ak4642_dai_hw_params(struct snd_pcm_substream *substream, return 0; } +static int ak4642_set_bias_level(struct snd_soc_codec *codec, + enum snd_soc_bias_level level) +{ + switch (level) { + case SND_SOC_BIAS_OFF: + snd_soc_write(codec, PW_MGMT1, 0x00); + break; + default: + snd_soc_update_bits(codec, PW_MGMT1, PMVCM, PMVCM); + break; + } + codec->dapm.bias_level = level; + + return 0; +} + static struct snd_soc_dai_ops ak4642_dai_ops = { .startup = ak4642_dai_startup, .shutdown = ak4642_dai_shutdown, @@ -425,12 +440,22 @@ static int ak4642_probe(struct snd_soc_codec *codec) snd_soc_add_controls(codec, ak4642_snd_controls, ARRAY_SIZE(ak4642_snd_controls)); + ak4642_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + + return 0; +} + +static int ak4642_remove(struct snd_soc_codec *codec) +{ + ak4642_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } static struct snd_soc_codec_driver soc_codec_dev_ak4642 = { .probe = ak4642_probe, + .remove = ak4642_remove, .resume = ak4642_resume, + .set_bias_level = ak4642_set_bias_level, .reg_cache_size = ARRAY_SIZE(ak4642_reg), .reg_word_size = sizeof(u8), .reg_cache_default = ak4642_reg, -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 2/5 v2] ASoC: ak4642: add DAPM support for HeadPhone Output 2011-11-11 0:20 ` ASoC: ak4642/fsi: add ak4648 support v2 kuninori.morimoto.gx 2011-11-11 0:21 ` [PATCH 1/5 v2] ASoC: ak4642: add ak4642_set_bias_level() Kuninori Morimoto @ 2011-11-11 0:21 ` Kuninori Morimoto 2011-11-11 0:21 ` [PATCH 3/5 v2] ASoC: ak4642: add headphone mute switch control Kuninori Morimoto ` (3 subsequent siblings) 5 siblings, 0 replies; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-11 0:21 UTC (permalink / raw) To: Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- v1 -> v2 - same as v1 sound/soc/codecs/ak4642.c | 44 +++++++++++++++++++++++++++++++++++--------- 1 files changed, 35 insertions(+), 9 deletions(-) diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 004a093..da9caf0 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -152,6 +152,37 @@ static const struct snd_kcontrol_new ak4642_snd_controls[] = { 0, 0xFF, 1, out_tlv), }; +static const struct snd_kcontrol_new ak4642_hpout_mixer_controls[] = { + SOC_DAPM_SINGLE("DACH", MD_CTL4, 0, 1, 0), +}; + +static const struct snd_soc_dapm_widget ak4642_dapm_widgets[] = { + + /* Outputs */ + SND_SOC_DAPM_OUTPUT("HPOUTL"), + SND_SOC_DAPM_OUTPUT("HPOUTR"), + + SND_SOC_DAPM_MIXER("HPOUTL Mixer", PW_MGMT2, 5, 0, + &ak4642_hpout_mixer_controls[0], + ARRAY_SIZE(ak4642_hpout_mixer_controls)), + + SND_SOC_DAPM_MIXER("HPOUTR Mixer", PW_MGMT2, 4, 0, + &ak4642_hpout_mixer_controls[0], + ARRAY_SIZE(ak4642_hpout_mixer_controls)), + + /* DAC */ + SND_SOC_DAPM_DAC("DAC", "HiFi Playback", PW_MGMT1, 2, 0), +}; + +static const struct snd_soc_dapm_route ak4642_intercon[] = { + + /* Outputs */ + {"HPOUTL", NULL, "HPOUTL Mixer"}, + {"HPOUTR", NULL, "HPOUTR Mixer"}, + + {"HPOUTL Mixer", "DACH", "DAC"}, + {"HPOUTR Mixer", "DACH", "DAC"}, +}; /* codec private data */ struct ak4642_priv { @@ -192,13 +223,8 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream, * This operation came from example code of * "ASAHI KASEI AK4642" (japanese) manual p97. */ - snd_soc_update_bits(codec, MD_CTL4, DACH, DACH); - snd_soc_update_bits(codec, MD_CTL3, BST1, BST1); snd_soc_write(codec, L_IVC, 0x91); /* volume */ snd_soc_write(codec, R_IVC, 0x91); /* volume */ - snd_soc_update_bits(codec, PW_MGMT1, PMMIN | PMDAC, - PMMIN | PMDAC); - snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK, PMHP); snd_soc_update_bits(codec, PW_MGMT2, HPMTN, HPMTN); } else { /* @@ -233,10 +259,6 @@ static void ak4642_dai_shutdown(struct snd_pcm_substream *substream, if (is_play) { /* stop headphone output */ snd_soc_update_bits(codec, PW_MGMT2, HPMTN, 0); - snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK, 0); - snd_soc_update_bits(codec, PW_MGMT1, PMMIN | PMDAC, 0); - snd_soc_update_bits(codec, MD_CTL3, BST1, 0); - snd_soc_update_bits(codec, MD_CTL4, DACH, 0); } else { /* stop stereo input */ snd_soc_update_bits(codec, PW_MGMT1, PMADL, 0); @@ -459,6 +481,10 @@ static struct snd_soc_codec_driver soc_codec_dev_ak4642 = { .reg_cache_size = ARRAY_SIZE(ak4642_reg), .reg_word_size = sizeof(u8), .reg_cache_default = ak4642_reg, + .dapm_widgets = ak4642_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ak4642_dapm_widgets), + .dapm_routes = ak4642_intercon, + .num_dapm_routes = ARRAY_SIZE(ak4642_intercon), }; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 3/5 v2] ASoC: ak4642: add headphone mute switch control 2011-11-11 0:20 ` ASoC: ak4642/fsi: add ak4648 support v2 kuninori.morimoto.gx 2011-11-11 0:21 ` [PATCH 1/5 v2] ASoC: ak4642: add ak4642_set_bias_level() Kuninori Morimoto 2011-11-11 0:21 ` [PATCH 2/5 v2] ASoC: ak4642: add DAPM support for HeadPhone Output Kuninori Morimoto @ 2011-11-11 0:21 ` Kuninori Morimoto 2011-11-11 0:21 ` [PATCH 4/5 v2] ASoC: ak4642: add Line out support Kuninori Morimoto ` (2 subsequent siblings) 5 siblings, 0 replies; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-11 0:21 UTC (permalink / raw) To: Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- v1 -> v2 - "Headphone Mute Switch" -> "Headphone Switch" sound/soc/codecs/ak4642.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index da9caf0..b2460c2 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -150,6 +150,8 @@ static const struct snd_kcontrol_new ak4642_snd_controls[] = { SOC_DOUBLE_R_TLV("Digital Playback Volume", L_DVC, R_DVC, 0, 0xFF, 1, out_tlv), + + SOC_SINGLE("Headphone Switch", PW_MGMT2, 6, 1, 0), }; static const struct snd_kcontrol_new ak4642_hpout_mixer_controls[] = { @@ -225,7 +227,6 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream, */ snd_soc_write(codec, L_IVC, 0x91); /* volume */ snd_soc_write(codec, R_IVC, 0x91); /* volume */ - snd_soc_update_bits(codec, PW_MGMT2, HPMTN, HPMTN); } else { /* * start stereo input @@ -257,8 +258,6 @@ static void ak4642_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc_codec *codec = dai->codec; if (is_play) { - /* stop headphone output */ - snd_soc_update_bits(codec, PW_MGMT2, HPMTN, 0); } else { /* stop stereo input */ snd_soc_update_bits(codec, PW_MGMT1, PMADL, 0); -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 4/5 v2] ASoC: ak4642: add Line out support 2011-11-11 0:20 ` ASoC: ak4642/fsi: add ak4648 support v2 kuninori.morimoto.gx ` (2 preceding siblings ...) 2011-11-11 0:21 ` [PATCH 3/5 v2] ASoC: ak4642: add headphone mute switch control Kuninori Morimoto @ 2011-11-11 0:21 ` Kuninori Morimoto 2011-11-11 0:22 ` [PATCH 5/5 v2] ASoC: ak4642: add ak4648 support Kuninori Morimoto 2011-11-11 8:43 ` ASoC: ak4642/fsi: add ak4648 support v2 Mark Brown 5 siblings, 0 replies; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-11 0:21 UTC (permalink / raw) To: Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- v1 -> v2 - same as v1 sound/soc/codecs/ak4642.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index b2460c2..daec5f75d 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -158,11 +158,16 @@ static const struct snd_kcontrol_new ak4642_hpout_mixer_controls[] = { SOC_DAPM_SINGLE("DACH", MD_CTL4, 0, 1, 0), }; +static const struct snd_kcontrol_new ak4642_lout_mixer_controls[] = { + SOC_DAPM_SINGLE("DACL", SG_SL1, 4, 1, 0), +}; + static const struct snd_soc_dapm_widget ak4642_dapm_widgets[] = { /* Outputs */ SND_SOC_DAPM_OUTPUT("HPOUTL"), SND_SOC_DAPM_OUTPUT("HPOUTR"), + SND_SOC_DAPM_OUTPUT("LINEOUT"), SND_SOC_DAPM_MIXER("HPOUTL Mixer", PW_MGMT2, 5, 0, &ak4642_hpout_mixer_controls[0], @@ -172,6 +177,10 @@ static const struct snd_soc_dapm_widget ak4642_dapm_widgets[] = { &ak4642_hpout_mixer_controls[0], ARRAY_SIZE(ak4642_hpout_mixer_controls)), + SND_SOC_DAPM_MIXER("LINEOUT Mixer", PW_MGMT1, 3, 0, + &ak4642_lout_mixer_controls[0], + ARRAY_SIZE(ak4642_lout_mixer_controls)), + /* DAC */ SND_SOC_DAPM_DAC("DAC", "HiFi Playback", PW_MGMT1, 2, 0), }; @@ -181,9 +190,11 @@ static const struct snd_soc_dapm_route ak4642_intercon[] = { /* Outputs */ {"HPOUTL", NULL, "HPOUTL Mixer"}, {"HPOUTR", NULL, "HPOUTR Mixer"}, + {"LINEOUT", NULL, "LINEOUT Mixer"}, {"HPOUTL Mixer", "DACH", "DAC"}, {"HPOUTR Mixer", "DACH", "DAC"}, + {"LINEOUT Mixer", "DACL", "DAC"}, }; /* codec private data */ -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 5/5 v2] ASoC: ak4642: add ak4648 support 2011-11-11 0:20 ` ASoC: ak4642/fsi: add ak4648 support v2 kuninori.morimoto.gx ` (3 preceding siblings ...) 2011-11-11 0:21 ` [PATCH 4/5 v2] ASoC: ak4642: add Line out support Kuninori Morimoto @ 2011-11-11 0:22 ` Kuninori Morimoto 2011-11-11 8:43 ` ASoC: ak4642/fsi: add ak4648 support v2 Mark Brown 5 siblings, 0 replies; 30+ messages in thread From: Kuninori Morimoto @ 2011-11-11 0:22 UTC (permalink / raw) To: Mark Brown, Liam Girdwood; +Cc: Linux-ALSA, Kuninori Morimoto Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> --- v1 -> v2 - same as v1 sound/soc/codecs/ak4642.c | 44 ++++++++++++++++++++++++++++++++++++-------- 1 files changed, 36 insertions(+), 8 deletions(-) diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index daec5f75d..859e015 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -20,6 +20,7 @@ * * AK4642 is tested. * AK4643 is tested. + * AK4648 is tested. */ #include <linux/delay.h> @@ -71,8 +72,6 @@ #define HP_MS 0x23 #define SPK_MS 0x24 -#define AK4642_CACHEREGNUM 0x25 - /* PW_MGMT1*/ #define PMVCM (1 << 6) /* VCOM Power Management */ #define PMMIN (1 << 5) /* MIN Input Power Management */ @@ -206,7 +205,7 @@ struct ak4642_priv { /* * ak4642 register cache */ -static const u8 ak4642_reg[AK4642_CACHEREGNUM] = { +static const u8 ak4642_reg[] = { 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0xe1, 0xe1, 0x18, 0x00, @@ -219,6 +218,19 @@ static const u8 ak4642_reg[AK4642_CACHEREGNUM] = { 0x00, }; +static const u8 ak4648_reg[] = { + 0x00, 0x00, 0x01, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xe1, 0xe1, 0x18, 0x00, + 0xe1, 0x18, 0x11, 0xb8, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x88, 0x08, +}; + static int ak4642_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { @@ -488,9 +500,23 @@ static struct snd_soc_codec_driver soc_codec_dev_ak4642 = { .remove = ak4642_remove, .resume = ak4642_resume, .set_bias_level = ak4642_set_bias_level, - .reg_cache_size = ARRAY_SIZE(ak4642_reg), + .reg_cache_default = ak4642_reg, /* ak4642 reg */ + .reg_cache_size = ARRAY_SIZE(ak4642_reg), /* ak4642 reg */ + .reg_word_size = sizeof(u8), + .dapm_widgets = ak4642_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ak4642_dapm_widgets), + .dapm_routes = ak4642_intercon, + .num_dapm_routes = ARRAY_SIZE(ak4642_intercon), +}; + +static struct snd_soc_codec_driver soc_codec_dev_ak4648 = { + .probe = ak4642_probe, + .remove = ak4642_remove, + .resume = ak4642_resume, + .set_bias_level = ak4642_set_bias_level, + .reg_cache_default = ak4648_reg, /* ak4648 reg */ + .reg_cache_size = ARRAY_SIZE(ak4648_reg), /* ak4648 reg */ .reg_word_size = sizeof(u8), - .reg_cache_default = ak4642_reg, .dapm_widgets = ak4642_dapm_widgets, .num_dapm_widgets = ARRAY_SIZE(ak4642_dapm_widgets), .dapm_routes = ak4642_intercon, @@ -512,7 +538,8 @@ static __devinit int ak4642_i2c_probe(struct i2c_client *i2c, ak4642->control_type = SND_SOC_I2C; ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_ak4642, &ak4642_dai, 1); + (struct snd_soc_codec_driver *)id->driver_data, + &ak4642_dai, 1); if (ret < 0) kfree(ak4642); return ret; @@ -526,8 +553,9 @@ static __devexit int ak4642_i2c_remove(struct i2c_client *client) } static const struct i2c_device_id ak4642_i2c_id[] = { - { "ak4642", 0 }, - { "ak4643", 0 }, + { "ak4642", (kernel_ulong_t)&soc_codec_dev_ak4642 }, + { "ak4643", (kernel_ulong_t)&soc_codec_dev_ak4642 }, + { "ak4648", (kernel_ulong_t)&soc_codec_dev_ak4648 }, { } }; MODULE_DEVICE_TABLE(i2c, ak4642_i2c_id); -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 30+ messages in thread
* Re: ASoC: ak4642/fsi: add ak4648 support v2 2011-11-11 0:20 ` ASoC: ak4642/fsi: add ak4648 support v2 kuninori.morimoto.gx ` (4 preceding siblings ...) 2011-11-11 0:22 ` [PATCH 5/5 v2] ASoC: ak4642: add ak4648 support Kuninori Morimoto @ 2011-11-11 8:43 ` Mark Brown 5 siblings, 0 replies; 30+ messages in thread From: Mark Brown @ 2011-11-11 8:43 UTC (permalink / raw) To: kuninori.morimoto.gx; +Cc: Linux-ALSA, Kuninori Morimoto, Liam Girdwood On Thu, Nov 10, 2011 at 04:20:02PM -0800, kuninori.morimoto.gx@renesas.com wrote: > These are v2 patch set Applied all, thanks. ^ permalink raw reply [flat|nested] 30+ messages in thread
end of thread, other threads:[~2011-11-24 10:45 UTC | newest] Thread overview: 30+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-11-07 6:03 ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx 2011-11-07 6:04 ` [PATCH 1/5] ASoC: fsi-ak4642: modify specification method of FSI / ak464x Kuninori Morimoto 2011-11-24 0:55 ` [PATCH 1/5][resend] " Kuninori Morimoto 2011-11-24 10:45 ` Mark Brown 2011-11-07 6:04 ` [PATCH 2/5] ASoC: ak4642: ak4642 was tested Kuninori Morimoto 2011-11-08 10:57 ` Mark Brown 2011-11-07 6:05 ` [PATCH 3/5] ASoC: ak4642: headphone/stereo-line output control Kuninori Morimoto 2011-11-08 10:55 ` Mark Brown 2011-11-08 11:22 ` Kuninori Morimoto 2011-11-08 11:40 ` Mark Brown 2011-11-07 6:05 ` [PATCH 4/5] ASoC: ak4642: add ak4648 support Kuninori Morimoto 2011-11-08 11:01 ` Mark Brown 2011-11-07 6:05 ` [PATCH 5/5] ASoC: fsi: add valid data position control support Kuninori Morimoto 2011-11-08 11:02 ` Mark Brown 2011-11-10 8:20 ` ASoC: ak4642/fsi: add ak4648 support kuninori.morimoto.gx 2011-11-10 8:21 ` [PATCH 1/5] ASoC: ak4642: add ak4642_set_bias_level() Kuninori Morimoto 2011-11-10 11:27 ` Mark Brown 2011-11-10 8:21 ` [PATCH 2/5] ASoC: ak4642: add DAPM support for HeadPhone Output Kuninori Morimoto 2011-11-10 8:21 ` [PATCH 3/5] ASoC: ak4642: add headphone mute switch control Kuninori Morimoto 2011-11-10 11:30 ` Mark Brown 2011-11-10 8:21 ` [PATCH 4/5] ASoC: ak4642: add Line out support Kuninori Morimoto 2011-11-10 8:21 ` [PATCH 5/5] ASoC: ak4642: add ak4648 support Kuninori Morimoto 2011-11-10 11:32 ` ASoC: ak4642/fsi: " Mark Brown 2011-11-11 0:20 ` ASoC: ak4642/fsi: add ak4648 support v2 kuninori.morimoto.gx 2011-11-11 0:21 ` [PATCH 1/5 v2] ASoC: ak4642: add ak4642_set_bias_level() Kuninori Morimoto 2011-11-11 0:21 ` [PATCH 2/5 v2] ASoC: ak4642: add DAPM support for HeadPhone Output Kuninori Morimoto 2011-11-11 0:21 ` [PATCH 3/5 v2] ASoC: ak4642: add headphone mute switch control Kuninori Morimoto 2011-11-11 0:21 ` [PATCH 4/5 v2] ASoC: ak4642: add Line out support Kuninori Morimoto 2011-11-11 0:22 ` [PATCH 5/5 v2] ASoC: ak4642: add ak4648 support Kuninori Morimoto 2011-11-11 8:43 ` ASoC: ak4642/fsi: add ak4648 support v2 Mark Brown
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.