From b6f4bb383d69cac46f17e2305720f9a3d426c5ed Mon Sep 17 00:00:00 2001 From: "apatard@mandriva.com" Date: Sat, 15 May 2010 17:30:01 +0200 Subject: ASoC: Add SOC_DOUBLE_R_SX_TLV control This patch is adding a new control which has the following capabilities: - tlv - variable data size (for instance, 7 ou 8 bit) - double mixer - data range centered around 0 Signed-off-by: Arnaud Patard Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/soc-core.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) (limited to 'sound') diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index e1043f644730..6220bc1ee427 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -2351,6 +2351,101 @@ int snd_soc_limit_volume(struct snd_soc_codec *codec, } EXPORT_SYMBOL_GPL(snd_soc_limit_volume); +/** + * snd_soc_info_volsw_2r_sx - double with tlv and variable data size + * mixer info callback + * @kcontrol: mixer control + * @uinfo: control element information + * + * Returns 0 for success. + */ +int snd_soc_info_volsw_2r_sx(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + int max = mc->max; + int min = mc->min; + + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; + uinfo->count = 2; + uinfo->value.integer.min = 0; + uinfo->value.integer.max = max-min; + + return 0; +} +EXPORT_SYMBOL_GPL(snd_soc_info_volsw_2r_sx); + +/** + * snd_soc_get_volsw_2r_sx - double with tlv and variable data size + * mixer get callback + * @kcontrol: mixer control + * @uinfo: control element information + * + * Returns 0 for success. + */ +int snd_soc_get_volsw_2r_sx(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + unsigned int mask = (1<shift)-1; + int min = mc->min; + int val = snd_soc_read(codec, mc->reg) & mask; + int valr = snd_soc_read(codec, mc->rreg) & mask; + + ucontrol->value.integer.value[0] = ((val & 0xff)-min); + ucontrol->value.integer.value[1] = ((valr & 0xff)-min); + return 0; +} +EXPORT_SYMBOL_GPL(snd_soc_get_volsw_2r_sx); + +/** + * snd_soc_put_volsw_2r_sx - double with tlv and variable data size + * mixer put callback + * @kcontrol: mixer control + * @uinfo: control element information + * + * Returns 0 for success. + */ +int snd_soc_put_volsw_2r_sx(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + unsigned int mask = (1<shift)-1; + int min = mc->min; + int ret; + unsigned int val, valr, oval, ovalr; + + val = ((ucontrol->value.integer.value[0]+min) & 0xff); + val &= mask; + valr = ((ucontrol->value.integer.value[1]+min) & 0xff); + valr &= mask; + + oval = snd_soc_read(codec, mc->reg) & mask; + ovalr = snd_soc_read(codec, mc->rreg) & mask; + + ret = 0; + if (oval != val) { + ret = snd_soc_write(codec, mc->reg, val); + if (ret < 0) + return 0; + ret = 1; + } + if (ovalr != valr) { + ret = snd_soc_write(codec, mc->rreg, valr); + if (ret < 0) + return 0; + ret = 1; + } + + return 0; +} +EXPORT_SYMBOL_GPL(snd_soc_put_volsw_2r_sx); + /** * snd_soc_dai_set_sysclk - configure DAI system or master clock. * @dai: DAI -- cgit v1.2.3 From 1082e2703a2d91790f9349a6155913a8aa0d0b66 Mon Sep 17 00:00:00 2001 From: Wan ZongShun Date: Tue, 18 May 2010 13:41:46 +0800 Subject: ASoC: NUC900/audio: add nuc900 audio driver support Add support for NUC900 AC97 Signed-off-by: Wan ZongShun Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/Kconfig | 1 + sound/soc/Makefile | 1 + sound/soc/nuc900/Kconfig | 27 +++ sound/soc/nuc900/Makefile | 11 + sound/soc/nuc900/nuc900-ac97.c | 442 ++++++++++++++++++++++++++++++++++++++++ sound/soc/nuc900/nuc900-audio.c | 81 ++++++++ sound/soc/nuc900/nuc900-auido.h | 121 +++++++++++ sound/soc/nuc900/nuc900-pcm.c | 352 ++++++++++++++++++++++++++++++++ 8 files changed, 1036 insertions(+) create mode 100644 sound/soc/nuc900/Kconfig create mode 100644 sound/soc/nuc900/Makefile create mode 100644 sound/soc/nuc900/nuc900-ac97.c create mode 100644 sound/soc/nuc900/nuc900-audio.c create mode 100644 sound/soc/nuc900/nuc900-auido.h create mode 100644 sound/soc/nuc900/nuc900-pcm.c (limited to 'sound') diff --git a/sound/soc/Kconfig b/sound/soc/Kconfig index b1749bc67979..6e04fc2aae4d 100644 --- a/sound/soc/Kconfig +++ b/sound/soc/Kconfig @@ -30,6 +30,7 @@ source "sound/soc/blackfin/Kconfig" source "sound/soc/davinci/Kconfig" source "sound/soc/fsl/Kconfig" source "sound/soc/imx/Kconfig" +source "sound/soc/nuc900/Kconfig" source "sound/soc/omap/Kconfig" source "sound/soc/pxa/Kconfig" source "sound/soc/s3c24xx/Kconfig" diff --git a/sound/soc/Makefile b/sound/soc/Makefile index 1470141d4167..ccec241488a6 100644 --- a/sound/soc/Makefile +++ b/sound/soc/Makefile @@ -8,6 +8,7 @@ obj-$(CONFIG_SND_SOC) += blackfin/ obj-$(CONFIG_SND_SOC) += davinci/ obj-$(CONFIG_SND_SOC) += fsl/ obj-$(CONFIG_SND_SOC) += imx/ +obj-$(CONFIG_SND_SOC) += nuc900/ obj-$(CONFIG_SND_SOC) += omap/ obj-$(CONFIG_SND_SOC) += pxa/ obj-$(CONFIG_SND_SOC) += s3c24xx/ diff --git a/sound/soc/nuc900/Kconfig b/sound/soc/nuc900/Kconfig new file mode 100644 index 000000000000..a0ed1c618f60 --- /dev/null +++ b/sound/soc/nuc900/Kconfig @@ -0,0 +1,27 @@ +## +## NUC900 series AC97 API +## +config SND_SOC_NUC900 + tristate "SoC Audio for NUC900 series" + depends on ARCH_W90X900 + help + This option enables support for AC97 mode on the NUC900 SoC. + +config SND_SOC_NUC900_AC97 + tristate + select AC97_BUS + select SND_AC97_CODEC + select SND_SOC_AC97_BUS + + +## +## Boards +## +config SND_SOC_NUC900EVB + tristate "NUC900 AC97 support for demo board" + depends on SND_SOC_NUC900 + select SND_SOC_NUC900_AC97 + select SND_SOC_AC97_CODEC + help + Select this option to enable audio (AC97) on the + NUC900 demoboard. diff --git a/sound/soc/nuc900/Makefile b/sound/soc/nuc900/Makefile new file mode 100644 index 000000000000..7e46c7150316 --- /dev/null +++ b/sound/soc/nuc900/Makefile @@ -0,0 +1,11 @@ +# NUC900 series audio +snd-soc-nuc900-pcm-objs := nuc900-pcm.o +snd-soc-nuc900-ac97-objs := nuc900-ac97.o + +obj-$(CONFIG_SND_SOC_NUC900) += snd-soc-nuc900-pcm.o +obj-$(CONFIG_SND_SOC_NUC900_AC97) += snd-soc-nuc900-ac97.o + +# Boards +snd-soc-nuc900-audio-objs := nuc900-audio.o + +obj-$(CONFIG_SND_SOC_NUC900EVB) += snd-soc-nuc900-audio.o diff --git a/sound/soc/nuc900/nuc900-ac97.c b/sound/soc/nuc900/nuc900-ac97.c new file mode 100644 index 000000000000..f7b44e081420 --- /dev/null +++ b/sound/soc/nuc900/nuc900-ac97.c @@ -0,0 +1,442 @@ +/* + * Copyright (c) 2009-2010 Nuvoton technology corporation. + * + * Wan ZongShun + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation;version 2 of the License. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "nuc900-auido.h" + +static DEFINE_MUTEX(ac97_mutex); +struct nuc900_audio *nuc900_ac97_data; + +static int nuc900_checkready(void) +{ + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; + + if (!(AUDIO_READ(nuc900_audio->mmio + ACTL_ACIS0) & CODEC_READY)) + return -EPERM; + + return 0; +} + +/* AC97 controller reads codec register */ +static unsigned short nuc900_ac97_read(struct snd_ac97 *ac97, + unsigned short reg) +{ + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; + unsigned long timeout = 0x10000, val; + + mutex_lock(&ac97_mutex); + + val = nuc900_checkready(); + if (!!val) { + dev_err(nuc900_audio->dev, "AC97 codec is not ready\n"); + goto out; + } + + /* set the R_WB bit and write register index */ + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS1, R_WB | reg); + + /* set the valid frame bit and valid slots */ + val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACOS0); + val |= (VALID_FRAME | SLOT1_VALID); + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS0, val); + + udelay(100); + + /* polling the AC_R_FINISH */ + val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); + val &= AC_R_FINISH; + while (!val && timeout--) + mdelay(1); + + if (!timeout) { + dev_err(nuc900_audio->dev, "AC97 read register time out !\n"); + val = -EPERM; + goto out; + } + + val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACOS0) ; + val &= ~SLOT1_VALID; + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS0, val); + + if (AUDIO_READ(nuc900_audio->mmio + ACTL_ACIS1) >> 2 != reg) { + dev_err(nuc900_audio->dev, + "R_INDEX of REG_ACTL_ACIS1 not match!\n"); + } + + udelay(100); + val = (AUDIO_READ(nuc900_audio->mmio + ACTL_ACIS2) & 0xFFFF); + +out: + mutex_unlock(&ac97_mutex); + return val; +} + +/* AC97 controller writes to codec register */ +static void nuc900_ac97_write(struct snd_ac97 *ac97, unsigned short reg, + unsigned short val) +{ + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; + unsigned long tmp, timeout = 0x10000; + + mutex_lock(&ac97_mutex); + + tmp = nuc900_checkready(); + if (!!tmp) + dev_err(nuc900_audio->dev, "AC97 codec is not ready\n"); + + /* clear the R_WB bit and write register index */ + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS1, reg); + + /* write register value */ + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS2, val); + + /* set the valid frame bit and valid slots */ + tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_ACOS0); + tmp |= SLOT1_VALID | SLOT2_VALID | VALID_FRAME; + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS0, tmp); + + udelay(100); + + /* polling the AC_W_FINISH */ + tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); + tmp &= AC_W_FINISH; + while (tmp && timeout--) + mdelay(1); + + if (!timeout) + dev_err(nuc900_audio->dev, "AC97 write register time out !\n"); + + tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_ACOS0); + tmp &= ~(SLOT1_VALID | SLOT2_VALID); + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS0, tmp); + + mutex_unlock(&ac97_mutex); + +} + +static void nuc900_ac97_warm_reset(struct snd_ac97 *ac97) +{ + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; + unsigned long val; + + mutex_lock(&ac97_mutex); + + /* warm reset AC 97 */ + val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); + val |= AC_W_RES; + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACCON, val); + + udelay(1000); + + val = nuc900_checkready(); + if (!!val) + dev_err(nuc900_audio->dev, "AC97 codec is not ready\n"); + + mutex_unlock(&ac97_mutex); +} + +static void nuc900_ac97_cold_reset(struct snd_ac97 *ac97) +{ + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; + unsigned long val; + + mutex_lock(&ac97_mutex); + + /* reset Audio Controller */ + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); + val |= ACTL_RESET_BIT; + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); + + udelay(1000); + + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); + val &= (~ACTL_RESET_BIT); + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); + + udelay(1000); + + /* reset AC-link interface */ + + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); + val |= AC_RESET; + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); + + udelay(1000); + + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); + val &= ~AC_RESET; + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); + + udelay(1000); + + /* cold reset AC 97 */ + val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); + val |= AC_C_RES; + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACCON, val); + + udelay(1000); + + val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); + val &= (~AC_C_RES); + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACCON, val); + + udelay(1000); + + mutex_unlock(&ac97_mutex); + +} + +/* AC97 controller operations */ +struct snd_ac97_bus_ops soc_ac97_ops = { + .read = nuc900_ac97_read, + .write = nuc900_ac97_write, + .reset = nuc900_ac97_cold_reset, + .warm_reset = nuc900_ac97_warm_reset, +} +EXPORT_SYMBOL_GPL(soc_ac97_ops); + +static int nuc900_ac97_trigger(struct snd_pcm_substream *substream, + int cmd, struct snd_soc_dai *dai) +{ + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; + int ret, stype = SUBSTREAM_TYPE(substream); + unsigned long val, tmp; + + ret = 0; + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); + if (PCM_TX == stype) { + tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_ACOS0); + tmp |= (SLOT3_VALID | SLOT4_VALID | VALID_FRAME); + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS0, tmp); + + tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_PSR); + tmp |= (P_DMA_END_IRQ | P_DMA_MIDDLE_IRQ); + AUDIO_WRITE(nuc900_audio->mmio + ACTL_PSR, tmp); + val |= AC_PLAY; + } else { + tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_RSR); + tmp |= (R_DMA_END_IRQ | R_DMA_MIDDLE_IRQ); + + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RSR, tmp); + val |= AC_RECORD; + } + + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); + + break; + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); + if (PCM_TX == stype) { + tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_ACOS0); + tmp &= ~(SLOT3_VALID | SLOT4_VALID); + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS0, tmp); + + AUDIO_WRITE(nuc900_audio->mmio + ACTL_PSR, RESET_PRSR); + val &= ~AC_PLAY; + } else { + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RSR, RESET_PRSR); + val &= ~AC_RECORD; + } + + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); + + break; + default: + ret = -EINVAL; + } + + return ret; +} + +static int nuc900_ac97_probe(struct platform_device *pdev, + struct snd_soc_dai *dai) +{ + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; + unsigned long val; + + mutex_lock(&ac97_mutex); + + /* enable unit clock */ + clk_enable(nuc900_audio->clk); + + /* enable audio controller and AC-link interface */ + val = AUDIO_READ(nuc900_audio->mmio + ACTL_CON); + val |= (IIS_AC_PIN_SEL | ACLINK_EN); + AUDIO_WRITE(nuc900_audio->mmio + ACTL_CON, val); + + mutex_unlock(&ac97_mutex); + + return 0; +} + +static void nuc900_ac97_remove(struct platform_device *pdev, + struct snd_soc_dai *dai) +{ + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; + + clk_disable(nuc900_audio->clk); +} + +static struct snd_soc_dai_ops nuc900_ac97_dai_ops = { + .trigger = nuc900_ac97_trigger, +}; + +struct snd_soc_dai nuc900_ac97_dai = { + .name = "nuc900-ac97", + .probe = nuc900_ac97_probe, + .remove = nuc900_ac97_remove, + .ac97_control = 1, + .playback = { + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = SNDRV_PCM_FMTBIT_S16_LE, + .channels_min = 1, + .channels_max = 2, + }, + .capture = { + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = SNDRV_PCM_FMTBIT_S16_LE, + .channels_min = 1, + .channels_max = 2, + }, + .ops = &nuc900_ac97_dai_ops, +} +EXPORT_SYMBOL_GPL(nuc900_ac97_dai); + +static int __devinit nuc900_ac97_drvprobe(struct platform_device *pdev) +{ + struct nuc900_audio *nuc900_audio; + int ret; + + if (nuc900_ac97_data) + return -EBUSY; + + nuc900_audio = kzalloc(sizeof(struct nuc900_audio), GFP_KERNEL); + if (!nuc900_audio) + return -ENOMEM; + + spin_lock_init(&nuc900_audio->lock); + + nuc900_audio->res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!nuc900_audio->res) { + ret = -ENODEV; + goto out0; + } + + if (!request_mem_region(nuc900_audio->res->start, + resource_size(nuc900_audio->res), pdev->name)) { + ret = -EBUSY; + goto out0; + } + + nuc900_audio->mmio = ioremap(nuc900_audio->res->start, + resource_size(nuc900_audio->res)); + if (!nuc900_audio->mmio) { + ret = -ENOMEM; + goto out1; + } + + nuc900_audio->clk = clk_get(&pdev->dev, NULL); + if (IS_ERR(nuc900_audio->clk)) { + ret = PTR_ERR(nuc900_audio->clk); + goto out2; + } + + nuc900_audio->irq_num = platform_get_irq(pdev, 0); + if (!nuc900_audio->irq_num) { + ret = -EBUSY; + goto out2; + } + + nuc900_ac97_data = nuc900_audio; + + nuc900_audio->dev = nuc900_ac97_dai.dev = &pdev->dev; + + ret = snd_soc_register_dai(&nuc900_ac97_dai); + if (ret) + goto out3; + + mfp_set_groupg(nuc900_audio->dev); /* enbale ac97 multifunction pin*/ + + return 0; + +out3: + clk_put(nuc900_audio->clk); +out2: + iounmap(nuc900_audio->mmio); +out1: + release_mem_region(nuc900_audio->res->start, + resource_size(nuc900_audio->res)); +out0: + kfree(nuc900_audio); + return ret; +} + +static int __devexit nuc900_ac97_drvremove(struct platform_device *pdev) +{ + + snd_soc_unregister_dai(&nuc900_ac97_dai); + + clk_put(nuc900_ac97_data->clk); + iounmap(nuc900_ac97_data->mmio); + release_mem_region(nuc900_ac97_data->res->start, + resource_size(nuc900_ac97_data->res)); + + nuc900_ac97_data = NULL; + + return 0; +} + +static struct platform_driver nuc900_ac97_driver = { + .driver = { + .name = "nuc900-audio", + .owner = THIS_MODULE, + }, + .probe = nuc900_ac97_drvprobe, + .remove = __devexit_p(nuc900_ac97_drvremove), +}; + +static int __init nuc900_ac97_init(void) +{ + return platform_driver_register(&nuc900_ac97_driver); +} + +static void __exit nuc900_ac97_exit(void) +{ + platform_driver_unregister(&nuc900_ac97_driver); +} + +module_init(nuc900_ac97_init); +module_exit(nuc900_ac97_exit); + +MODULE_AUTHOR("Wan ZongShun "); +MODULE_DESCRIPTION("NUC900 AC97 SoC driver!"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:nuc900-ac97"); diff --git a/sound/soc/nuc900/nuc900-audio.c b/sound/soc/nuc900/nuc900-audio.c new file mode 100644 index 000000000000..b33d5b844d71 --- /dev/null +++ b/sound/soc/nuc900/nuc900-audio.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2010 Nuvoton technology corporation. + * + * Wan ZongShun + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation;version 2 of the License. + * + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "../codecs/ac97.h" +#include "nuc900-auido.h" + +static struct snd_soc_dai_link nuc900evb_ac97_dai = { + .name = "AC97", + .stream_name = "AC97 HiFi", + .cpu_dai = &nuc900_ac97_dai, + .codec_dai = &ac97_dai, +}; + +static struct snd_soc_card nuc900evb_audio_machine = { + .name = "NUC900EVB_AC97", + .dai_link = &nuc900evb_ac97_dai, + .num_links = 1, + .platform = &nuc900_soc_platform, +}; + +static struct snd_soc_device nuc900evb_ac97_devdata = { + .card = &nuc900evb_audio_machine, + .codec_dev = &soc_codec_dev_ac97, +}; + +static struct platform_device *nuc900evb_asoc_dev; + +static int __init nuc900evb_audio_init(void) +{ + int ret; + + ret = -ENOMEM; + nuc900evb_asoc_dev = platform_device_alloc("soc-audio", -1); + if (!nuc900evb_asoc_dev) + goto out; + + /* nuc900 board audio device */ + platform_set_drvdata(nuc900evb_asoc_dev, &nuc900evb_ac97_devdata); + + nuc900evb_ac97_devdata.dev = &nuc900evb_asoc_dev->dev; + ret = platform_device_add(nuc900evb_asoc_dev); + + if (ret) { + platform_device_put(nuc900evb_asoc_dev); + nuc900evb_asoc_dev = NULL; + } + +out: + return ret; +} + +static void __exit nuc900evb_audio_exit(void) +{ + platform_device_unregister(nuc900evb_asoc_dev); +} + +module_init(nuc900evb_audio_init); +module_exit(nuc900evb_audio_exit); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("NUC900 Series ASoC audio support"); +MODULE_AUTHOR("Wan ZongShun"); diff --git a/sound/soc/nuc900/nuc900-auido.h b/sound/soc/nuc900/nuc900-auido.h new file mode 100644 index 000000000000..95ac4ef2f353 --- /dev/null +++ b/sound/soc/nuc900/nuc900-auido.h @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2010 Nuvoton technology corporation. + * + * Wan ZongShun + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation;version 2 of the License. + * + */ + +#ifndef _NUC900_AUDIO_H +#define _NUC900_AUDIO_H + +#include + +/* Audio Control Registers */ +#define ACTL_CON 0x00 +#define ACTL_RESET 0x04 +#define ACTL_RDSTB 0x08 +#define ACTL_RDST_LENGTH 0x0C +#define ACTL_RDSTC 0x10 +#define ACTL_RSR 0x14 +#define ACTL_PDSTB 0x18 +#define ACTL_PDST_LENGTH 0x1C +#define ACTL_PDSTC 0x20 +#define ACTL_PSR 0x24 +#define ACTL_IISCON 0x28 +#define ACTL_ACCON 0x2C +#define ACTL_ACOS0 0x30 +#define ACTL_ACOS1 0x34 +#define ACTL_ACOS2 0x38 +#define ACTL_ACIS0 0x3C +#define ACTL_ACIS1 0x40 +#define ACTL_ACIS2 0x44 +#define ACTL_COUNTER 0x48 + +/* bit definition of REG_ACTL_CON register */ +#define R_DMA_IRQ 0x1000 +#define T_DMA_IRQ 0x0800 +#define IIS_AC_PIN_SEL 0x0100 +#define FIFO_TH 0x0080 +#define ADC_EN 0x0010 +#define M80_EN 0x0008 +#define ACLINK_EN 0x0004 +#define IIS_EN 0x0002 + +/* bit definition of REG_ACTL_RESET register */ +#define W5691_PLAY 0x20000 +#define ACTL_RESET_BIT 0x10000 +#define RECORD_RIGHT_CHNNEL 0x08000 +#define RECORD_LEFT_CHNNEL 0x04000 +#define PLAY_RIGHT_CHNNEL 0x02000 +#define PLAY_LEFT_CHNNEL 0x01000 +#define DAC_PLAY 0x00800 +#define ADC_RECORD 0x00400 +#define M80_PLAY 0x00200 +#define AC_RECORD 0x00100 +#define AC_PLAY 0x00080 +#define IIS_RECORD 0x00040 +#define IIS_PLAY 0x00020 +#define DAC_RESET 0x00010 +#define ADC_RESET 0x00008 +#define M80_RESET 0x00004 +#define AC_RESET 0x00002 +#define IIS_RESET 0x00001 + +/* bit definition of REG_ACTL_ACCON register */ +#define AC_BCLK_PU_EN 0x20 +#define AC_R_FINISH 0x10 +#define AC_W_FINISH 0x08 +#define AC_W_RES 0x04 +#define AC_C_RES 0x02 + +/* bit definition of ACTL_RSR register */ +#define R_FIFO_EMPTY 0x04 +#define R_DMA_END_IRQ 0x02 +#define R_DMA_MIDDLE_IRQ 0x01 + +/* bit definition of ACTL_PSR register */ +#define P_FIFO_EMPTY 0x04 +#define P_DMA_END_IRQ 0x02 +#define P_DMA_MIDDLE_IRQ 0x01 + +/* bit definition of ACTL_ACOS0 register */ +#define SLOT1_VALID 0x01 +#define SLOT2_VALID 0x02 +#define SLOT3_VALID 0x04 +#define SLOT4_VALID 0x08 +#define VALID_FRAME 0x10 + +/* bit definition of ACTL_ACOS1 register */ +#define R_WB 0x80 + +#define CODEC_READY 0x10 +#define RESET_PRSR 0x00 +#define AUDIO_WRITE(addr, val) __raw_writel(val, addr) +#define AUDIO_READ(addr) __raw_readl(addr) +#define PCM_TX 0 +#define PCM_RX 1 +#define SUBSTREAM_TYPE(substream) \ + ((substream)->stream == SNDRV_PCM_STREAM_PLAYBACK ? PCM_TX : PCM_RX) + +struct nuc900_audio { + void __iomem *mmio; + spinlock_t lock; + dma_addr_t dma_addr[2]; + unsigned long buffersize[2]; + unsigned long irq_num; + struct snd_pcm_substream *substream; + struct resource *res; + struct clk *clk; + struct device *dev; + +}; + +extern struct nuc900_audio *nuc900_ac97_data; +extern struct snd_soc_dai nuc900_ac97_dai; +extern struct snd_soc_platform nuc900_soc_platform; + +#endif /*end _NUC900_AUDIO_H */ diff --git a/sound/soc/nuc900/nuc900-pcm.c b/sound/soc/nuc900/nuc900-pcm.c new file mode 100644 index 000000000000..32a503c1c4be --- /dev/null +++ b/sound/soc/nuc900/nuc900-pcm.c @@ -0,0 +1,352 @@ +/* + * Copyright (c) 2010 Nuvoton technology corporation. + * + * Wan ZongShun + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation;version 2 of the License. + * + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include "nuc900-auido.h" + +static const struct snd_pcm_hardware nuc900_pcm_hardware = { + .info = SNDRV_PCM_INFO_INTERLEAVED | + SNDRV_PCM_INFO_BLOCK_TRANSFER | + SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_MMAP_VALID | + SNDRV_PCM_INFO_PAUSE | + SNDRV_PCM_INFO_RESUME, + .formats = SNDRV_PCM_FMTBIT_S16_LE, + .channels_min = 1, + .channels_max = 2, + .buffer_bytes_max = 4*1024, + .period_bytes_min = 1*1024, + .period_bytes_max = 4*1024, + .periods_min = 1, + .periods_max = 1024, +}; + +static int nuc900_dma_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct nuc900_audio *nuc900_audio = runtime->private_data; + unsigned long flags, stype = SUBSTREAM_TYPE(substream); + int ret = 0; + + spin_lock_irqsave(&nuc900_audio->lock, flags); + + ret = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(params)); + if (ret < 0) + return ret; + + nuc900_audio->substream = substream; + nuc900_audio->dma_addr[stype] = runtime->dma_addr; + nuc900_audio->buffersize[stype] = params_buffer_bytes(params); + + spin_unlock_irqrestore(&nuc900_audio->lock, flags); + + return ret; +} + +static void nuc900_update_dma_register(struct snd_pcm_substream *substream, + dma_addr_t dma_addr, size_t count) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct nuc900_audio *nuc900_audio = runtime->private_data; + void __iomem *mmio_addr, *mmio_len; + + if (SUBSTREAM_TYPE(substream) == PCM_TX) { + mmio_addr = nuc900_audio->mmio + ACTL_PDSTB; + mmio_len = nuc900_audio->mmio + ACTL_PDST_LENGTH; + } else { + mmio_addr = nuc900_audio->mmio + ACTL_RDSTB; + mmio_len = nuc900_audio->mmio + ACTL_RDST_LENGTH; + } + + AUDIO_WRITE(mmio_addr, dma_addr); + AUDIO_WRITE(mmio_len, count); +} + +static void nuc900_dma_start(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct nuc900_audio *nuc900_audio = runtime->private_data; + unsigned long val; + + val = AUDIO_READ(nuc900_audio->mmio + ACTL_CON); + val |= (T_DMA_IRQ | R_DMA_IRQ); + AUDIO_WRITE(nuc900_audio->mmio + ACTL_CON, val); +} + +static void nuc900_dma_stop(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct nuc900_audio *nuc900_audio = runtime->private_data; + unsigned long val; + + val = AUDIO_READ(nuc900_audio->mmio + ACTL_CON); + val &= ~(T_DMA_IRQ | R_DMA_IRQ); + AUDIO_WRITE(nuc900_audio->mmio + ACTL_CON, val); +} + +static irqreturn_t nuc900_dma_interrupt(int irq, void *dev_id) +{ + struct snd_pcm_substream *substream = dev_id; + struct nuc900_audio *nuc900_audio = substream->runtime->private_data; + unsigned long val; + + spin_lock(&nuc900_audio->lock); + + val = AUDIO_READ(nuc900_audio->mmio + ACTL_CON); + + if (val & R_DMA_IRQ) { + AUDIO_WRITE(nuc900_audio->mmio + ACTL_CON, val | R_DMA_IRQ); + + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RSR); + + if (val & R_DMA_MIDDLE_IRQ) { + val |= R_DMA_MIDDLE_IRQ; + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RSR, val); + } + + if (val & R_DMA_END_IRQ) { + val |= R_DMA_END_IRQ; + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RSR, val); + } + } else if (val & T_DMA_IRQ) { + AUDIO_WRITE(nuc900_audio->mmio + ACTL_CON, val | T_DMA_IRQ); + + val = AUDIO_READ(nuc900_audio->mmio + ACTL_PSR); + + if (val & P_DMA_MIDDLE_IRQ) { + val |= P_DMA_MIDDLE_IRQ; + AUDIO_WRITE(nuc900_audio->mmio + ACTL_PSR, val); + } + + if (val & P_DMA_END_IRQ) { + val |= P_DMA_END_IRQ; + AUDIO_WRITE(nuc900_audio->mmio + ACTL_PSR, val); + } + } else { + dev_err(nuc900_audio->dev, "Wrong DMA interrupt status!\n"); + spin_unlock(&nuc900_audio->lock); + return IRQ_HANDLED; + } + + spin_unlock(&nuc900_audio->lock); + + snd_pcm_period_elapsed(substream); + + return IRQ_HANDLED; +} + +static int nuc900_dma_hw_free(struct snd_pcm_substream *substream) +{ + snd_pcm_lib_free_pages(substream); + return 0; +} + +static int nuc900_dma_prepare(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct nuc900_audio *nuc900_audio = runtime->private_data; + unsigned long flags, val, stype = SUBSTREAM_TYPE(substream);; + + spin_lock_irqsave(&nuc900_audio->lock, flags); + + nuc900_update_dma_register(substream, + nuc900_audio->dma_addr[stype], nuc900_audio->buffersize[stype]); + + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); + + switch (runtime->channels) { + case 1: + if (PCM_TX == stype) { + val &= ~(PLAY_LEFT_CHNNEL | PLAY_RIGHT_CHNNEL); + val |= PLAY_RIGHT_CHNNEL; + } else { + val &= ~(RECORD_LEFT_CHNNEL | RECORD_RIGHT_CHNNEL); + val |= RECORD_RIGHT_CHNNEL; + } + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); + break; + case 2: + if (PCM_TX == stype) + val |= (PLAY_LEFT_CHNNEL | PLAY_RIGHT_CHNNEL); + else + val |= (RECORD_LEFT_CHNNEL | RECORD_RIGHT_CHNNEL); + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); + break; + default: + return -EINVAL; + } + spin_unlock_irqrestore(&nuc900_audio->lock, flags); + return 0; +} + +static int nuc900_dma_trigger(struct snd_pcm_substream *substream, int cmd) +{ + int ret = 0; + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + nuc900_dma_start(substream); + break; + + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + nuc900_dma_stop(substream); + break; + + default: + ret = -EINVAL; + break; + } + + return ret; +} + +int nuc900_dma_getposition(struct snd_pcm_substream *substream, + dma_addr_t *src, dma_addr_t *dst) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct nuc900_audio *nuc900_audio = runtime->private_data; + + if (src != NULL) + *src = AUDIO_READ(nuc900_audio->mmio + ACTL_PDSTC); + + if (dst != NULL) + *dst = AUDIO_READ(nuc900_audio->mmio + ACTL_RDSTC); + + return 0; +} + +static snd_pcm_uframes_t nuc900_dma_pointer(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + dma_addr_t src, dst; + unsigned long res; + + nuc900_dma_getposition(substream, &src, &dst); + + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) + res = dst - runtime->dma_addr; + else + res = src - runtime->dma_addr; + + return bytes_to_frames(substream->runtime, res); +} + +static int nuc900_dma_open(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct nuc900_audio *nuc900_audio; + + snd_soc_set_runtime_hwparams(substream, &nuc900_pcm_hardware); + + nuc900_audio = nuc900_ac97_data; + + if (request_irq(nuc900_audio->irq_num, nuc900_dma_interrupt, + IRQF_DISABLED, "nuc900-dma", substream)) + return -EBUSY; + + runtime->private_data = nuc900_audio; + + return 0; +} + +static int nuc900_dma_close(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct nuc900_audio *nuc900_audio = runtime->private_data; + + free_irq(nuc900_audio->irq_num, substream); + + return 0; +} + +static int nuc900_dma_mmap(struct snd_pcm_substream *substream, + struct vm_area_struct *vma) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + + return dma_mmap_writecombine(substream->pcm->card->dev, vma, + runtime->dma_area, + runtime->dma_addr, + runtime->dma_bytes); +} + +static struct snd_pcm_ops nuc900_dma_ops = { + .open = nuc900_dma_open, + .close = nuc900_dma_close, + .ioctl = snd_pcm_lib_ioctl, + .hw_params = nuc900_dma_hw_params, + .hw_free = nuc900_dma_hw_free, + .prepare = nuc900_dma_prepare, + .trigger = nuc900_dma_trigger, + .pointer = nuc900_dma_pointer, + .mmap = nuc900_dma_mmap, +}; + +static void nuc900_dma_free_dma_buffers(struct snd_pcm *pcm) +{ + snd_pcm_lib_preallocate_free_for_all(pcm); +} + +static u64 nuc900_pcm_dmamask = DMA_BIT_MASK(32); +static int nuc900_dma_new(struct snd_card *card, + struct snd_soc_dai *dai, struct snd_pcm *pcm) +{ + if (!card->dev->dma_mask) + card->dev->dma_mask = &nuc900_pcm_dmamask; + if (!card->dev->coherent_dma_mask) + card->dev->coherent_dma_mask = DMA_BIT_MASK(32); + + snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, + card->dev, 4 * 1024, (4 * 1024) - 1); + + return 0; +} + +struct snd_soc_platform nuc900_soc_platform = { + .name = "nuc900-dma", + .pcm_ops = &nuc900_dma_ops, + .pcm_new = nuc900_dma_new, + .pcm_free = nuc900_dma_free_dma_buffers, +} +EXPORT_SYMBOL_GPL(nuc900_soc_platform); + +static int __init nuc900_soc_platform_init(void) +{ + return snd_soc_register_platform(&nuc900_soc_platform); +} + +static void __exit nuc900_soc_platform_exit(void) +{ + snd_soc_unregister_platform(&nuc900_soc_platform); +} + +module_init(nuc900_soc_platform_init); +module_exit(nuc900_soc_platform_exit); + +MODULE_AUTHOR("Wan ZongShun, "); +MODULE_DESCRIPTION("nuc900 Audio DMA module"); +MODULE_LICENSE("GPL"); -- cgit v1.2.3 From 44ebaa5de1f922965d8aa215a6da729341b3deb2 Mon Sep 17 00:00:00 2001 From: Jorge Eduardo Candelaria Date: Thu, 20 May 2010 17:53:07 -0500 Subject: ASoC: TWL6040: Fix playback with 19.2 Mhz MCLK When using MCLK is configured for 19.2 Mhz, clock slicer should be enabled and HPPLL should be bypassed in clock path. Signed-off-by: Jorge Eduardo Candelaria Signed-off-by: Margarita Olaya Cabrera Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl6040.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/twl6040.c b/sound/soc/codecs/twl6040.c index af36346ff336..85dd4fb4c681 100644 --- a/sound/soc/codecs/twl6040.c +++ b/sound/soc/codecs/twl6040.c @@ -928,7 +928,7 @@ static int twl6040_set_dai_sysclk(struct snd_soc_dai *codec_dai, case 19200000: /* mclk input, pll disabled */ hppllctl |= TWL6040_MCLK_19200KHZ | - TWL6040_HPLLSQRBP | + TWL6040_HPLLSQRENA | TWL6040_HPLLBP; break; case 26000000: -- cgit v1.2.3 From fab90aa4cf2330f15bba5218d5d633c1044bddd3 Mon Sep 17 00:00:00 2001 From: Barry Song <21cnbao@gmail.com> Date: Fri, 21 May 2010 11:57:01 +0800 Subject: ASoC: ad193x: add set_sysclk entry to support different clock input Signed-off-by: Barry Song <21cnbao@gmail.com> Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/ad193x.c | 41 ++++++++++++++++++++++++++++++++++++++++- sound/soc/codecs/ad193x.h | 5 +++++ 2 files changed, 45 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c index c8ca1142b2f4..1def75e4862f 100644 --- a/sound/soc/codecs/ad193x.c +++ b/sound/soc/codecs/ad193x.c @@ -24,6 +24,7 @@ /* codec private data */ struct ad193x_priv { + unsigned int sysclk; struct snd_soc_codec codec; u8 reg_cache[AD193X_NUM_REGS]; }; @@ -251,15 +252,32 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai, return 0; } +static int ad193x_set_dai_sysclk(struct snd_soc_dai *codec_dai, + int clk_id, unsigned int freq, int dir) +{ + struct snd_soc_codec *codec = codec_dai->codec; + struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec); + switch (freq) { + case 12288000: + case 18432000: + case 24576000: + case 36864000: + ad193x->sysclk = freq; + return 0; + } + return -EINVAL; +} + static int ad193x_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - int word_len = 0, reg = 0; + int word_len = 0, reg = 0, master_rate = 0; struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_device *socdev = rtd->socdev; struct snd_soc_codec *codec = socdev->card->codec; + struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec); /* bit size */ switch (params_format(params)) { @@ -275,6 +293,25 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream, break; } + switch (ad193x->sysclk) { + case 12288000: + master_rate = AD193X_PLL_INPUT_256; + break; + case 18432000: + master_rate = AD193X_PLL_INPUT_384; + break; + case 24576000: + master_rate = AD193X_PLL_INPUT_512; + break; + case 36864000: + master_rate = AD193X_PLL_INPUT_768; + break; + } + + reg = snd_soc_read(codec, AD193X_PLL_CLK_CTRL0); + reg = (reg & AD193X_PLL_INPUT_MASK) | master_rate; + snd_soc_write(codec, AD193X_PLL_CLK_CTRL0, reg); + reg = snd_soc_read(codec, AD193X_DAC_CTRL2); reg = (reg & (~AD193X_DAC_WORD_LEN_MASK)) | word_len; snd_soc_write(codec, AD193X_DAC_CTRL2, reg); @@ -348,6 +385,7 @@ static int ad193x_bus_probe(struct device *dev, void *ctrl_data, int bus_type) /* pll input: mclki/xi */ snd_soc_write(codec, AD193X_PLL_CLK_CTRL0, 0x99); /* mclk=24.576Mhz: 0x9D; mclk=12.288Mhz: 0x99 */ snd_soc_write(codec, AD193X_PLL_CLK_CTRL1, 0x04); + ad193x->sysclk = 12288000; ret = snd_soc_register_codec(codec); if (ret != 0) { @@ -383,6 +421,7 @@ static struct snd_soc_dai_ops ad193x_dai_ops = { .hw_params = ad193x_hw_params, .digital_mute = ad193x_mute, .set_tdm_slot = ad193x_set_tdm_slot, + .set_sysclk = ad193x_set_dai_sysclk, .set_fmt = ad193x_set_dai_fmt, }; diff --git a/sound/soc/codecs/ad193x.h b/sound/soc/codecs/ad193x.h index a03c880d52f9..654ba64ae04c 100644 --- a/sound/soc/codecs/ad193x.h +++ b/sound/soc/codecs/ad193x.h @@ -11,6 +11,11 @@ #define AD193X_PLL_CLK_CTRL0 0x800 #define AD193X_PLL_POWERDOWN 0x01 +#define AD193X_PLL_INPUT_MASK (~0x6) +#define AD193X_PLL_INPUT_256 (0 << 1) +#define AD193X_PLL_INPUT_384 (1 << 1) +#define AD193X_PLL_INPUT_512 (2 << 1) +#define AD193X_PLL_INPUT_768 (3 << 1) #define AD193X_PLL_CLK_CTRL1 0x801 #define AD193X_DAC_CTRL0 0x802 #define AD193X_DAC_POWERDOWN 0x01 -- cgit v1.2.3 From bd73fc76f7a232f4add4fb0d7109589987ff7194 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Tue, 25 May 2010 10:49:26 -0700 Subject: ASoC: Remove version display from WM8990 It's not needed and the version number never gets updated anyway. Signed-off-by: Mark Brown --- sound/soc/codecs/wm8990.c | 4 ---- 1 file changed, 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8990.c b/sound/soc/codecs/wm8990.c index 9a9528e9044e..4caa509b853a 100644 --- a/sound/soc/codecs/wm8990.c +++ b/sound/soc/codecs/wm8990.c @@ -29,8 +29,6 @@ #include "wm8990.h" -#define WM8990_VERSION "0.2" - /* codec private data */ struct wm8990_priv { unsigned int sysclk; @@ -1510,8 +1508,6 @@ static int wm8990_probe(struct platform_device *pdev) struct wm8990_priv *wm8990; int ret; - pr_info("WM8990 Audio Codec %s\n", WM8990_VERSION); - setup = socdev->codec_data; codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); if (codec == NULL) -- cgit v1.2.3 From 52e39d22c87b548d632e10a9e30ba3273d916434 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Tue, 25 May 2010 10:46:05 -0700 Subject: ASoC: Fix dB scales for WM835x These should be regular rather than linear scales. Signed-off-by: Mark Brown Cc: stable@kernel.org --- sound/soc/codecs/wm8350.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8350.c b/sound/soc/codecs/wm8350.c index e5a48da65f82..c342c2c9fb49 100644 --- a/sound/soc/codecs/wm8350.c +++ b/sound/soc/codecs/wm8350.c @@ -425,8 +425,8 @@ static const struct soc_enum wm8350_enum[] = { SOC_ENUM_SINGLE(WM8350_INPUT_MIXER_VOLUME, 15, 2, wm8350_lr), }; -static DECLARE_TLV_DB_LINEAR(pre_amp_tlv, -1200, 3525); -static DECLARE_TLV_DB_LINEAR(out_pga_tlv, -5700, 600); +static DECLARE_TLV_DB_SCALE(pre_amp_tlv, -1200, 3525, 0); +static DECLARE_TLV_DB_SCALE(out_pga_tlv, -5700, 600, 0); static DECLARE_TLV_DB_SCALE(dac_pcm_tlv, -7163, 36, 1); static DECLARE_TLV_DB_SCALE(adc_pcm_tlv, -12700, 50, 1); static DECLARE_TLV_DB_SCALE(out_mix_tlv, -1500, 300, 1); -- cgit v1.2.3 From 9cd8bd8a2c29dc36142c03deadafcb806b0c14f5 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Tue, 25 May 2010 10:48:31 -0700 Subject: ASoC: Fix dB scales for WM8400 These scales should be regular, not linear. Signed-off-by: Mark Brown Cc: stable@kernel.org --- sound/soc/codecs/wm8400.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8400.c b/sound/soc/codecs/wm8400.c index a7506ae2b8cc..535db3bff866 100644 --- a/sound/soc/codecs/wm8400.c +++ b/sound/soc/codecs/wm8400.c @@ -106,21 +106,21 @@ static void wm8400_codec_reset(struct snd_soc_codec *codec) wm8400_reset_codec_reg_cache(wm8400->wm8400); } -static const DECLARE_TLV_DB_LINEAR(rec_mix_tlv, -1500, 600); +static const DECLARE_TLV_DB_SCALE(rec_mix_tlv, -1500, 600, 0); -static const DECLARE_TLV_DB_LINEAR(in_pga_tlv, -1650, 3000); +static const DECLARE_TLV_DB_SCALE(in_pga_tlv, -1650, 3000, 0); -static const DECLARE_TLV_DB_LINEAR(out_mix_tlv, -2100, 0); +static const DECLARE_TLV_DB_SCALE(out_mix_tlv, -2100, 0, 0); -static const DECLARE_TLV_DB_LINEAR(out_pga_tlv, -7300, 600); +static const DECLARE_TLV_DB_SCALE(out_pga_tlv, -7300, 600, 0); -static const DECLARE_TLV_DB_LINEAR(out_omix_tlv, -600, 0); +static const DECLARE_TLV_DB_SCALE(out_omix_tlv, -600, 0, 0); -static const DECLARE_TLV_DB_LINEAR(out_dac_tlv, -7163, 0); +static const DECLARE_TLV_DB_SCALE(out_dac_tlv, -7163, 0, 0); -static const DECLARE_TLV_DB_LINEAR(in_adc_tlv, -7163, 1763); +static const DECLARE_TLV_DB_SCALE(in_adc_tlv, -7163, 1763, 0); -static const DECLARE_TLV_DB_LINEAR(out_sidetone_tlv, -3600, 0); +static const DECLARE_TLV_DB_SCALE(out_sidetone_tlv, -3600, 0, 0); static int wm8400_outpga_put_volsw_vu(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) @@ -439,7 +439,7 @@ static int outmixer_event (struct snd_soc_dapm_widget *w, /* INMIX dB values */ static const unsigned int in_mix_tlv[] = { TLV_DB_RANGE_HEAD(1), - 0,7, TLV_DB_LINEAR_ITEM(-1200, 600), + 0,7, TLV_DB_SCALE_ITEM(-1200, 600, 0), }; /* Left In PGA Connections */ -- cgit v1.2.3 From 021f80cc701a31c0962de7f1cc96b16309140b1f Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Tue, 25 May 2010 10:49:00 -0700 Subject: ASoC: Fix dB scales for WM8990 These should be regular, not linear. Signed-off-by: Mark Brown Cc: stable@kernel.org --- sound/soc/codecs/wm8990.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8990.c b/sound/soc/codecs/wm8990.c index 4caa509b853a..731bc0775f44 100644 --- a/sound/soc/codecs/wm8990.c +++ b/sound/soc/codecs/wm8990.c @@ -108,21 +108,21 @@ static const u16 wm8990_reg[] = { #define wm8990_reset(c) snd_soc_write(c, WM8990_RESET, 0) -static const DECLARE_TLV_DB_LINEAR(rec_mix_tlv, -1500, 600); +static const DECLARE_TLV_DB_SCALE(rec_mix_tlv, -1500, 600, 0); -static const DECLARE_TLV_DB_LINEAR(in_pga_tlv, -1650, 3000); +static const DECLARE_TLV_DB_SCALE(in_pga_tlv, -1650, 3000, 0); -static const DECLARE_TLV_DB_LINEAR(out_mix_tlv, 0, -2100); +static const DECLARE_TLV_DB_SCALE(out_mix_tlv, 0, -2100, 0); -static const DECLARE_TLV_DB_LINEAR(out_pga_tlv, -7300, 600); +static const DECLARE_TLV_DB_SCALE(out_pga_tlv, -7300, 600, 0); -static const DECLARE_TLV_DB_LINEAR(out_omix_tlv, -600, 0); +static const DECLARE_TLV_DB_SCALE(out_omix_tlv, -600, 0, 0); -static const DECLARE_TLV_DB_LINEAR(out_dac_tlv, -7163, 0); +static const DECLARE_TLV_DB_SCALE(out_dac_tlv, -7163, 0, 0); -static const DECLARE_TLV_DB_LINEAR(in_adc_tlv, -7163, 1763); +static const DECLARE_TLV_DB_SCALE(in_adc_tlv, -7163, 1763, 0); -static const DECLARE_TLV_DB_LINEAR(out_sidetone_tlv, -3600, 0); +static const DECLARE_TLV_DB_SCALE(out_sidetone_tlv, -3600, 0, 0); static int wm899x_outpga_put_volsw_vu(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) @@ -448,7 +448,7 @@ static int outmixer_event(struct snd_soc_dapm_widget *w, /* INMIX dB values */ static const unsigned int in_mix_tlv[] = { TLV_DB_RANGE_HEAD(1), - 0, 7, TLV_DB_LINEAR_ITEM(-1200, 600), + 0, 7, TLV_DB_SCALE_ITEM(-1200, 600, 0), }; /* Left In PGA Connections */ -- cgit v1.2.3 From 3dedece4a5ebad4db43e72ba9b2236ff01bc4271 Mon Sep 17 00:00:00 2001 From: Jassi Brar Date: Thu, 27 May 2010 12:11:31 +0900 Subject: ASOC: S5PC100: Enable AC97 support The S5PC100 has the AC97 controller same as S3C6410. Simply enable the options to build the drivers for S5PC100 also. Signed-off-by: Jassi Brar Signed-off-by: Mark Brown --- sound/soc/s3c24xx/Kconfig | 4 ++-- sound/soc/s3c24xx/smdk_wm9713.c | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/s3c24xx/Kconfig b/sound/soc/s3c24xx/Kconfig index 2a7cc222d098..aa112d3c2066 100644 --- a/sound/soc/s3c24xx/Kconfig +++ b/sound/soc/s3c24xx/Kconfig @@ -1,6 +1,6 @@ config SND_S3C24XX_SOC tristate "SoC Audio for the Samsung S3CXXXX chips" - depends on ARCH_S3C2410 || ARCH_S3C64XX + depends on ARCH_S3C2410 || ARCH_S3C64XX || ARCH_S5PC100 select S3C64XX_DMA if ARCH_S3C64XX help Say Y or M if you want to add support for codecs attached to @@ -120,7 +120,7 @@ config SND_S3C24XX_SOC_SIMTEC_HERMES config SND_SOC_SMDK_WM9713 tristate "SoC AC97 Audio support for SMDK with WM9713" - depends on SND_S3C24XX_SOC && MACH_SMDK6410 + depends on SND_S3C24XX_SOC && (MACH_SMDK6410 || MACH_SMDKC100) select SND_SOC_WM9713 select SND_S3C_SOC_AC97 help diff --git a/sound/soc/s3c24xx/smdk_wm9713.c b/sound/soc/s3c24xx/smdk_wm9713.c index 24fd39f38ccb..7dd85e5e81a4 100644 --- a/sound/soc/s3c24xx/smdk_wm9713.c +++ b/sound/soc/s3c24xx/smdk_wm9713.c @@ -25,6 +25,7 @@ static struct snd_soc_card smdk; * Default CFG switch settings to use this driver: * * SMDK6410: Set CFG1 1-3 On, CFG2 1-4 Off + * SMDKC100: Set CFG6 1-3 On, CFG7 1 On */ /* -- cgit v1.2.3 From ce1f7d30766f6549db6fa0b9e595e0d26a5b7d9a Mon Sep 17 00:00:00 2001 From: Jassi Brar Date: Thu, 27 May 2010 12:11:44 +0900 Subject: ASOC: S5PV210: Enable AC97 support The S5PV210 and S5PC110 has the AC97 controller same as S3C6410. Simply enable the options to build the drivers for S5PC110 and S5PV210 also. Signed-off-by: Jassi Brar Signed-off-by: Mark Brown --- sound/soc/s3c24xx/Kconfig | 4 ++-- sound/soc/s3c24xx/smdk_wm9713.c | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/s3c24xx/Kconfig b/sound/soc/s3c24xx/Kconfig index aa112d3c2066..292d817c9a94 100644 --- a/sound/soc/s3c24xx/Kconfig +++ b/sound/soc/s3c24xx/Kconfig @@ -1,6 +1,6 @@ config SND_S3C24XX_SOC tristate "SoC Audio for the Samsung S3CXXXX chips" - depends on ARCH_S3C2410 || ARCH_S3C64XX || ARCH_S5PC100 + depends on ARCH_S3C2410 || ARCH_S3C64XX || ARCH_S5PC100 || ARCH_S5PV210 select S3C64XX_DMA if ARCH_S3C64XX help Say Y or M if you want to add support for codecs attached to @@ -120,7 +120,7 @@ config SND_S3C24XX_SOC_SIMTEC_HERMES config SND_SOC_SMDK_WM9713 tristate "SoC AC97 Audio support for SMDK with WM9713" - depends on SND_S3C24XX_SOC && (MACH_SMDK6410 || MACH_SMDKC100) + depends on SND_S3C24XX_SOC && (MACH_SMDK6410 || MACH_SMDKC100 || MACH_SMDKV210 || MACH_SMDKC110) select SND_SOC_WM9713 select SND_S3C_SOC_AC97 help diff --git a/sound/soc/s3c24xx/smdk_wm9713.c b/sound/soc/s3c24xx/smdk_wm9713.c index 7dd85e5e81a4..5527b9e88c98 100644 --- a/sound/soc/s3c24xx/smdk_wm9713.c +++ b/sound/soc/s3c24xx/smdk_wm9713.c @@ -26,6 +26,8 @@ static struct snd_soc_card smdk; * * SMDK6410: Set CFG1 1-3 On, CFG2 1-4 Off * SMDKC100: Set CFG6 1-3 On, CFG7 1 On + * SMDKC110: Set CFGB10 1-2 Off, CFGB12 1-3 On + * SMDKV210: Set CFGB10 1-2 Off, CFGB12 1-3 On */ /* -- cgit v1.2.3 From 15c0cee6c809a137e0fc7f1d2b0867cc03473c0c Mon Sep 17 00:00:00 2001 From: Ben Collins Date: Fri, 28 May 2010 11:43:45 -0400 Subject: ALSA: pcm: Define G723 3-bit and 5-bit formats This defines the 24bps and 40bps (8khz sample rate) G.723 codec formats. They are going to be used once I submit the driver for an mpeg4/g723 compression card. I've updated the signed value to -1 as per Takashi's comments since these are non-linear formats. Signed-off-by: Ben Collins Signed-off-by: Takashi Iwai --- sound/core/pcm_misc.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'sound') diff --git a/sound/core/pcm_misc.c b/sound/core/pcm_misc.c index ea2bf82c9373..434af3c56d52 100644 --- a/sound/core/pcm_misc.c +++ b/sound/core/pcm_misc.c @@ -128,6 +128,14 @@ static struct pcm_format_data pcm_formats[SNDRV_PCM_FORMAT_LAST+1] = { .width = 4, .phys = 4, .le = -1, .signd = -1, .silence = {}, }, + [SNDRV_PCM_FORMAT_G723_24] = { + .width = 3, .phys = 3, .le = -1, .signd = -1, + .silence = {}, + }, + [SNDRV_PCM_FORMAT_G723_40] = { + .width = 5, .phys = 5, .le = -1, .signd = -1, + .silence = {}, + }, /* FIXME: the following three formats are not defined properly yet */ [SNDRV_PCM_FORMAT_MPEG] = { .le = -1, .signd = -1, @@ -186,6 +194,14 @@ static struct pcm_format_data pcm_formats[SNDRV_PCM_FORMAT_LAST+1] = { .width = 18, .phys = 24, .le = 0, .signd = 0, .silence = { 0x02, 0x00, 0x00 }, }, + [SNDRV_PCM_FORMAT_G723_24_1B] = { + .width = 3, .phys = 8, .le = -1, .signd = -1, + .silence = {}, + }, + [SNDRV_PCM_FORMAT_G723_40_1B] = { + .width = 5, .phys = 8, .le = -1, .signd = -1, + .silence = {}, + }, }; -- cgit v1.2.3 From 33f92ed4b3b9bef2080032b2b5d5dfba189eabeb Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 26 May 2010 11:38:14 +0300 Subject: ASoC: TWL4030: Revisit codec defaults Reset most of the codec registers to their chip reset value. Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl4030.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index 6a34f562b563..9a3e999b595c 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -42,7 +42,7 @@ */ static const u8 twl4030_reg[TWL4030_CACHEREGNUM] = { 0x00, /* this register not used */ - 0x91, /* REG_CODEC_MODE (0x1) */ + 0x00, /* REG_CODEC_MODE (0x1) */ 0xc3, /* REG_OPTION (0x2) */ 0x00, /* REG_UNKNOWN (0x3) */ 0x00, /* REG_MICBIAS_CTL (0x4) */ @@ -51,28 +51,28 @@ static const u8 twl4030_reg[TWL4030_CACHEREGNUM] = { 0x00, /* REG_AVADC_CTL (0x7) */ 0x00, /* REG_ADCMICSEL (0x8) */ 0x00, /* REG_DIGMIXING (0x9) */ - 0x0c, /* REG_ATXL1PGA (0xA) */ - 0x0c, /* REG_ATXR1PGA (0xB) */ - 0x00, /* REG_AVTXL2PGA (0xC) */ - 0x00, /* REG_AVTXR2PGA (0xD) */ + 0x0f, /* REG_ATXL1PGA (0xA) */ + 0x0f, /* REG_ATXR1PGA (0xB) */ + 0x0f, /* REG_AVTXL2PGA (0xC) */ + 0x0f, /* REG_AVTXR2PGA (0xD) */ 0x00, /* REG_AUDIO_IF (0xE) */ 0x00, /* REG_VOICE_IF (0xF) */ - 0x00, /* REG_ARXR1PGA (0x10) */ - 0x00, /* REG_ARXL1PGA (0x11) */ - 0x6c, /* REG_ARXR2PGA (0x12) */ - 0x6c, /* REG_ARXL2PGA (0x13) */ - 0x00, /* REG_VRXPGA (0x14) */ + 0x3f, /* REG_ARXR1PGA (0x10) */ + 0x3f, /* REG_ARXL1PGA (0x11) */ + 0x3f, /* REG_ARXR2PGA (0x12) */ + 0x3f, /* REG_ARXL2PGA (0x13) */ + 0x25, /* REG_VRXPGA (0x14) */ 0x00, /* REG_VSTPGA (0x15) */ 0x00, /* REG_VRX2ARXPGA (0x16) */ 0x00, /* REG_AVDAC_CTL (0x17) */ 0x00, /* REG_ARX2VTXPGA (0x18) */ - 0x00, /* REG_ARXL1_APGA_CTL (0x19) */ - 0x00, /* REG_ARXR1_APGA_CTL (0x1A) */ - 0x4a, /* REG_ARXL2_APGA_CTL (0x1B) */ - 0x4a, /* REG_ARXR2_APGA_CTL (0x1C) */ + 0x32, /* REG_ARXL1_APGA_CTL (0x19) */ + 0x32, /* REG_ARXR1_APGA_CTL (0x1A) */ + 0x32, /* REG_ARXL2_APGA_CTL (0x1B) */ + 0x32, /* REG_ARXR2_APGA_CTL (0x1C) */ 0x00, /* REG_ATX2ARXPGA (0x1D) */ 0x00, /* REG_BT_IF (0x1E) */ - 0x00, /* REG_BTPGA (0x1F) */ + 0x55, /* REG_BTPGA (0x1F) */ 0x00, /* REG_BTSTPGA (0x20) */ 0x00, /* REG_EAR_CTL (0x21) */ 0x00, /* REG_HS_SEL (0x22) */ @@ -84,32 +84,32 @@ static const u8 twl4030_reg[TWL4030_CACHEREGNUM] = { 0x00, /* REG_PRECKR_CTL (0x28) */ 0x00, /* REG_HFL_CTL (0x29) */ 0x00, /* REG_HFR_CTL (0x2A) */ - 0x00, /* REG_ALC_CTL (0x2B) */ + 0x05, /* REG_ALC_CTL (0x2B) */ 0x00, /* REG_ALC_SET1 (0x2C) */ 0x00, /* REG_ALC_SET2 (0x2D) */ 0x00, /* REG_BOOST_CTL (0x2E) */ 0x00, /* REG_SOFTVOL_CTL (0x2F) */ - 0x00, /* REG_DTMF_FREQSEL (0x30) */ + 0x13, /* REG_DTMF_FREQSEL (0x30) */ 0x00, /* REG_DTMF_TONEXT1H (0x31) */ 0x00, /* REG_DTMF_TONEXT1L (0x32) */ 0x00, /* REG_DTMF_TONEXT2H (0x33) */ 0x00, /* REG_DTMF_TONEXT2L (0x34) */ - 0x00, /* REG_DTMF_TONOFF (0x35) */ - 0x00, /* REG_DTMF_WANONOFF (0x36) */ + 0x79, /* REG_DTMF_TONOFF (0x35) */ + 0x11, /* REG_DTMF_WANONOFF (0x36) */ 0x00, /* REG_I2S_RX_SCRAMBLE_H (0x37) */ 0x00, /* REG_I2S_RX_SCRAMBLE_M (0x38) */ 0x00, /* REG_I2S_RX_SCRAMBLE_L (0x39) */ 0x06, /* REG_APLL_CTL (0x3A) */ 0x00, /* REG_DTMF_CTL (0x3B) */ - 0x00, /* REG_DTMF_PGA_CTL2 (0x3C) */ - 0x00, /* REG_DTMF_PGA_CTL1 (0x3D) */ + 0x44, /* REG_DTMF_PGA_CTL2 (0x3C) */ + 0x69, /* REG_DTMF_PGA_CTL1 (0x3D) */ 0x00, /* REG_MISC_SET_1 (0x3E) */ 0x00, /* REG_PCMBTMUX (0x3F) */ 0x00, /* not used (0x40) */ 0x00, /* not used (0x41) */ 0x00, /* not used (0x42) */ 0x00, /* REG_RX_PATH_SEL (0x43) */ - 0x00, /* REG_VDL_APGA_CTL (0x44) */ + 0x32, /* REG_VDL_APGA_CTL (0x44) */ 0x00, /* REG_VIBRA_CTL (0x45) */ 0x00, /* REG_VIBRA_SET (0x46) */ 0x00, /* REG_VIBRA_PWM_SET (0x47) */ -- cgit v1.2.3 From cbd2db128f2cbec1a70aa6897cc4cddbbadecbf6 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 26 May 2010 11:38:15 +0300 Subject: ASoC: TWL4030: Remove wrapper for power down There is no need for the power down wrapper. Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl4030.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index 9a3e999b595c..1e0aba5b2c5d 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -319,15 +319,6 @@ static void twl4030_power_up(struct snd_soc_codec *codec) twl4030_codec_enable(codec, 1); } -/* - * Unconditional power down - */ -static void twl4030_power_down(struct snd_soc_codec *codec) -{ - /* power down */ - twl4030_codec_enable(codec, 0); -} - /* Earpiece */ static const struct snd_kcontrol_new twl4030_dapm_earpiece_controls[] = { SOC_DAPM_SINGLE("Voice", TWL4030_REG_EAR_CTL, 0, 1, 0), @@ -1607,7 +1598,7 @@ static int twl4030_set_bias_level(struct snd_soc_codec *codec, twl4030_power_up(codec); break; case SND_SOC_BIAS_OFF: - twl4030_power_down(codec); + twl4030_codec_enable(codec, 0); break; } codec->bias_level = level; @@ -2321,7 +2312,7 @@ static int __devinit twl4030_codec_probe(struct platform_device *pdev) return 0; error_codec: - twl4030_power_down(codec); + twl4030_codec_enable(codec, 0); kfree(codec->reg_cache); error_cache: kfree(twl4030); -- cgit v1.2.3 From 979bb1f4b8b058e9fb23d6166807e30b507a1a6d Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 26 May 2010 11:38:16 +0300 Subject: ASoC: TWL4030: Make offset cancellation path configurable Add means for machine drivers to select the path for offset cancellation. Reset the reg cache value to the chip reset value at the same time. Machine drivers can specify which path need to be used for offset cancellation via the twl4030_setup.offset_cncl_path. For paths use the defines from include/linux/mfd/twl4030-codec.h: TWL4030_OFFSET_CNCL_SEL_* Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl4030.c | 6 +++++- sound/soc/codecs/twl4030.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index 1e0aba5b2c5d..a6cbaf3c51f2 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -46,7 +46,7 @@ static const u8 twl4030_reg[TWL4030_CACHEREGNUM] = { 0xc3, /* REG_OPTION (0x2) */ 0x00, /* REG_UNKNOWN (0x3) */ 0x00, /* REG_MICBIAS_CTL (0x4) */ - 0x20, /* REG_ANAMICL (0x5) */ + 0x00, /* REG_ANAMICL (0x5) */ 0x00, /* REG_ANAMICR (0x6) */ 0x00, /* REG_AVADC_CTL (0x7) */ 0x00, /* REG_ADCMICSEL (0x8) */ @@ -281,6 +281,8 @@ static void twl4030_apll_enable(struct snd_soc_codec *codec, int enable) static void twl4030_power_up(struct snd_soc_codec *codec) { + struct snd_soc_device *socdev = codec->socdev; + struct twl4030_setup_data *setup = socdev->codec_data; struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); u8 anamicl, regmisc1, byte; int i = 0; @@ -293,6 +295,8 @@ static void twl4030_power_up(struct snd_soc_codec *codec) /* initiate offset cancellation */ anamicl = twl4030_read_reg_cache(codec, TWL4030_REG_ANAMICL); + anamicl &= ~TWL4030_OFFSET_CNCL_SEL; + anamicl |= setup->offset_cncl_path; twl4030_write(codec, TWL4030_REG_ANAMICL, anamicl | TWL4030_CNCL_OFFSET_START); diff --git a/sound/soc/codecs/twl4030.h b/sound/soc/codecs/twl4030.h index f206d242ca31..c98e30347e87 100644 --- a/sound/soc/codecs/twl4030.h +++ b/sound/soc/codecs/twl4030.h @@ -42,6 +42,7 @@ extern struct snd_soc_codec_device soc_codec_dev_twl4030; struct twl4030_setup_data { unsigned int ramp_delay_value; unsigned int sysclk; + unsigned int offset_cncl_path; unsigned int hs_extmute:1; void (*set_hs_extmute)(int mute); }; -- cgit v1.2.3 From ee4ccac7cea0e4a4f44bbb109285129e1b293461 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 26 May 2010 11:38:17 +0300 Subject: ASoC: TWL4030: Optimize the power up sequence Since the reg cache now contains the chip default values for all registers (REG_OPTION is reset to it's default within this patch), there is no longer need to rewrite _all_ registers. Initialize only few selected registers. According to the latest information, the offset cancellation need to be done only once, when the codec is powered on, so there is no need for the power up wrapper. Move all chip initialization code under chip_init, and do it when the codec is initialized. Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl4030.c | 133 ++++++++++++++++++++------------------------- 1 file changed, 60 insertions(+), 73 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index a6cbaf3c51f2..08f24de406c2 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -43,7 +43,7 @@ static const u8 twl4030_reg[TWL4030_CACHEREGNUM] = { 0x00, /* this register not used */ 0x00, /* REG_CODEC_MODE (0x1) */ - 0xc3, /* REG_OPTION (0x2) */ + 0x00, /* REG_OPTION (0x2) */ 0x00, /* REG_UNKNOWN (0x3) */ 0x00, /* REG_MICBIAS_CTL (0x4) */ 0x00, /* REG_ANAMICL (0x5) */ @@ -243,62 +243,52 @@ static void twl4030_codec_enable(struct snd_soc_codec *codec, int enable) udelay(10); } -static void twl4030_init_chip(struct snd_soc_codec *codec) -{ - u8 *cache = codec->reg_cache; - int i; - - /* clear CODECPDZ prior to setting register defaults */ - twl4030_codec_enable(codec, 0); - - /* set all audio section registers to reasonable defaults */ - for (i = TWL4030_REG_OPTION; i <= TWL4030_REG_MISC_SET_2; i++) - if (i != TWL4030_REG_APLL_CTL) - twl4030_write(codec, i, cache[i]); - -} - -static void twl4030_apll_enable(struct snd_soc_codec *codec, int enable) +static void twl4030_init_chip(struct platform_device *pdev) { + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + struct twl4030_setup_data *setup = socdev->codec_data; + struct snd_soc_codec *codec = socdev->card->codec; struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); - int status = -1; + u8 reg, byte; + int i = 0; - if (enable) { - twl4030->apll_enabled++; - if (twl4030->apll_enabled == 1) - status = twl4030_codec_enable_resource( - TWL4030_CODEC_RES_APLL); - } else { - twl4030->apll_enabled--; - if (!twl4030->apll_enabled) - status = twl4030_codec_disable_resource( - TWL4030_CODEC_RES_APLL); - } + /* Refresh APLL_CTL register from HW */ + twl4030_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, &byte, + TWL4030_REG_APLL_CTL); + twl4030_write_reg_cache(codec, TWL4030_REG_APLL_CTL, byte); - if (status >= 0) - twl4030_write_reg_cache(codec, TWL4030_REG_APLL_CTL, status); -} + /* anti-pop when changing analog gain */ + reg = twl4030_read_reg_cache(codec, TWL4030_REG_MISC_SET_1); + twl4030_write(codec, TWL4030_REG_MISC_SET_1, + reg | TWL4030_SMOOTH_ANAVOL_EN); -static void twl4030_power_up(struct snd_soc_codec *codec) -{ - struct snd_soc_device *socdev = codec->socdev; - struct twl4030_setup_data *setup = socdev->codec_data; - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); - u8 anamicl, regmisc1, byte; - int i = 0; + twl4030_write(codec, TWL4030_REG_OPTION, + TWL4030_ATXL1_EN | TWL4030_ATXR1_EN | + TWL4030_ARXL2_EN | TWL4030_ARXR2_EN); - if (twl4030->codec_powered) + /* Machine dependent setup */ + if (!setup) return; - /* set CODECPDZ to turn on codec */ - twl4030_codec_enable(codec, 1); + /* Configuration for headset ramp delay from setup data */ + if (setup->sysclk != twl4030->sysclk) + dev_warn(codec->dev, + "Mismatch in APLL mclk: %u (configured: %u)\n", + setup->sysclk, twl4030->sysclk); + + reg = twl4030_read_reg_cache(codec, TWL4030_REG_HS_POPN_SET); + reg &= ~TWL4030_RAMP_DELAY; + reg |= (setup->ramp_delay_value << 2); + twl4030_write_reg_cache(codec, TWL4030_REG_HS_POPN_SET, reg); /* initiate offset cancellation */ - anamicl = twl4030_read_reg_cache(codec, TWL4030_REG_ANAMICL); - anamicl &= ~TWL4030_OFFSET_CNCL_SEL; - anamicl |= setup->offset_cncl_path; + twl4030_codec_enable(codec, 1); + + reg = twl4030_read_reg_cache(codec, TWL4030_REG_ANAMICL); + reg &= ~TWL4030_OFFSET_CNCL_SEL; + reg |= setup->offset_cncl_path; twl4030_write(codec, TWL4030_REG_ANAMICL, - anamicl | TWL4030_CNCL_OFFSET_START); + reg | TWL4030_CNCL_OFFSET_START); /* wait for offset cancellation to complete */ do { @@ -313,14 +303,28 @@ static void twl4030_power_up(struct snd_soc_codec *codec) /* Make sure that the reg_cache has the same value as the HW */ twl4030_write_reg_cache(codec, TWL4030_REG_ANAMICL, byte); - /* anti-pop when changing analog gain */ - regmisc1 = twl4030_read_reg_cache(codec, TWL4030_REG_MISC_SET_1); - twl4030_write(codec, TWL4030_REG_MISC_SET_1, - regmisc1 | TWL4030_SMOOTH_ANAVOL_EN); - - /* toggle CODECPDZ as per TRM */ twl4030_codec_enable(codec, 0); - twl4030_codec_enable(codec, 1); +} + +static void twl4030_apll_enable(struct snd_soc_codec *codec, int enable) +{ + struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + int status = -1; + + if (enable) { + twl4030->apll_enabled++; + if (twl4030->apll_enabled == 1) + status = twl4030_codec_enable_resource( + TWL4030_CODEC_RES_APLL); + } else { + twl4030->apll_enabled--; + if (!twl4030->apll_enabled) + status = twl4030_codec_disable_resource( + TWL4030_CODEC_RES_APLL); + } + + if (status >= 0) + twl4030_write_reg_cache(codec, TWL4030_REG_APLL_CTL, status); } /* Earpiece */ @@ -1599,7 +1603,7 @@ static int twl4030_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: if (codec->bias_level == SND_SOC_BIAS_OFF) - twl4030_power_up(codec); + twl4030_codec_enable(codec, 1); break; case SND_SOC_BIAS_OFF: twl4030_codec_enable(codec, 0); @@ -2196,31 +2200,16 @@ static struct snd_soc_codec *twl4030_codec; static int twl4030_soc_probe(struct platform_device *pdev) { struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct twl4030_setup_data *setup = socdev->codec_data; struct snd_soc_codec *codec; - struct twl4030_priv *twl4030; int ret; BUG_ON(!twl4030_codec); codec = twl4030_codec; - twl4030 = snd_soc_codec_get_drvdata(codec); socdev->card->codec = codec; - /* Configuration for headset ramp delay from setup data */ - if (setup) { - unsigned char hs_pop; - - if (setup->sysclk != twl4030->sysclk) - dev_warn(&pdev->dev, - "Mismatch in APLL mclk: %u (configured: %u)\n", - setup->sysclk, twl4030->sysclk); - - hs_pop = twl4030_read_reg_cache(codec, TWL4030_REG_HS_POPN_SET); - hs_pop &= ~TWL4030_RAMP_DELAY; - hs_pop |= (setup->ramp_delay_value << 2); - twl4030_write_reg_cache(codec, TWL4030_REG_HS_POPN_SET, hs_pop); - } + twl4030_init_chip(pdev); + twl4030_set_bias_level(codec, SND_SOC_BIAS_STANDBY); /* register pcms */ ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); @@ -2296,9 +2285,7 @@ static int __devinit twl4030_codec_probe(struct platform_device *pdev) /* Set the defaults, and power up the codec */ twl4030->sysclk = twl4030_codec_get_mclk() / 1000; - twl4030_init_chip(codec); codec->bias_level = SND_SOC_BIAS_OFF; - twl4030_set_bias_level(codec, SND_SOC_BIAS_STANDBY); ret = snd_soc_register_codec(codec); if (ret != 0) { -- cgit v1.2.3 From 9fdcc0f72af8801d8429a465a159d815774dbf6d Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 26 May 2010 11:38:18 +0300 Subject: ASoC: TWL4030: Helper to check chip default registers Since the twl4030 codec driver supports different version of the PM chip, a helper function can come handy, which can check the driver's default versus the chip values. Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl4030.c | 25 ++++++++++++++++++++++++- sound/soc/codecs/twl4030.h | 1 + 2 files changed, 25 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index 08f24de406c2..30b7bbaf6aed 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -243,6 +243,25 @@ static void twl4030_codec_enable(struct snd_soc_codec *codec, int enable) udelay(10); } +static inline void twl4030_check_defaults(struct snd_soc_codec *codec) +{ + int i, difference = 0; + u8 val; + + dev_dbg(codec->dev, "Checking TWL audio default configuration\n"); + for (i = 1; i <= TWL4030_REG_MISC_SET_2; i++) { + twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, &val, i); + if (val != twl4030_reg[i]) { + difference++; + dev_dbg(codec->dev, + "Reg 0x%02x: chip: 0x%02x driver: 0x%02x\n", + i, val, twl4030_reg[i]); + } + } + dev_dbg(codec->dev, "Found %d non maching registers. %s\n", + difference, difference ? "Not OK" : "OK"); +} + static void twl4030_init_chip(struct platform_device *pdev) { struct snd_soc_device *socdev = platform_get_drvdata(pdev); @@ -252,8 +271,12 @@ static void twl4030_init_chip(struct platform_device *pdev) u8 reg, byte; int i = 0; + /* Check defaults, if instructed before anything else */ + if (setup && setup->check_defaults) + twl4030_check_defaults(codec); + /* Refresh APLL_CTL register from HW */ - twl4030_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, &byte, + twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, &byte, TWL4030_REG_APLL_CTL); twl4030_write_reg_cache(codec, TWL4030_REG_APLL_CTL, byte); diff --git a/sound/soc/codecs/twl4030.h b/sound/soc/codecs/twl4030.h index c98e30347e87..c22542c2690c 100644 --- a/sound/soc/codecs/twl4030.h +++ b/sound/soc/codecs/twl4030.h @@ -43,6 +43,7 @@ struct twl4030_setup_data { unsigned int ramp_delay_value; unsigned int sysclk; unsigned int offset_cncl_path; + unsigned int check_defaults:1; unsigned int hs_extmute:1; void (*set_hs_extmute)(int mute); }; -- cgit v1.2.3 From 3c36cc688e7ad4ab595a0ac59697e4e1d06338c5 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 26 May 2010 11:38:19 +0300 Subject: ASoC: TWL4030: Correct the ARXR2_APGA_CTL chip default It seams at least on twl5031 that the ARXR2_APGA_CTL register does not have the same default value as it is written in the TRM. Since the codec part of the PM chip has not been actually changed according to TI, assuming, that all version has the same problem, so writing there the TRM value. Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl4030.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'sound') diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index 30b7bbaf6aed..c667ca5a8a9e 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -289,6 +289,9 @@ static void twl4030_init_chip(struct platform_device *pdev) TWL4030_ATXL1_EN | TWL4030_ATXR1_EN | TWL4030_ARXL2_EN | TWL4030_ARXR2_EN); + /* REG_ARXR2_APGA_CTL reset according to the TRM: 0dB, DA_EN */ + twl4030_write(codec, TWL4030_REG_ARXR2_APGA_CTL, 0x32); + /* Machine dependent setup */ if (!setup) return; -- cgit v1.2.3 From 2046f175bc7b4d37e33dbce6a867be3bacf685cc Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 26 May 2010 11:38:20 +0300 Subject: ASoC: TWL4030: Use BIAS_OFF instead of BIAS_STANDBY, when not in use Restructure the codec power code in order to be able to hit off when the codec is not in use. Since the audio registers are accessible while the codec is powered down, there is no need for additional safety mechanism. Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl4030.c | 86 +++++++++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 35 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index c667ca5a8a9e..45de2aad283c 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -1818,13 +1818,6 @@ static int twl4030_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - if (mode != old_mode) { - /* change rate and set CODECPDZ */ - twl4030_codec_enable(codec, 0); - twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode); - twl4030_codec_enable(codec, 1); - } - /* sample size */ old_format = twl4030_read_reg_cache(codec, TWL4030_REG_AUDIO_IF); format = old_format; @@ -1842,16 +1835,20 @@ static int twl4030_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - if (format != old_format) { - - /* clear CODECPDZ before changing format (codec requirement) */ - twl4030_codec_enable(codec, 0); - - /* change format */ - twl4030_write(codec, TWL4030_REG_AUDIO_IF, format); - - /* set CODECPDZ afterwards */ - twl4030_codec_enable(codec, 1); + if (format != old_format || mode != old_mode) { + if (twl4030->codec_powered) { + /* + * If the codec is powered, than we need to toggle the + * codec power. + */ + twl4030_codec_enable(codec, 0); + twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode); + twl4030_write(codec, TWL4030_REG_AUDIO_IF, format); + twl4030_codec_enable(codec, 1); + } else { + twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode); + twl4030_write(codec, TWL4030_REG_AUDIO_IF, format); + } } /* Store the important parameters for the DAI configuration and set @@ -1901,6 +1898,7 @@ static int twl4030_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { struct snd_soc_codec *codec = codec_dai->codec; + struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); u8 old_format, format; /* get format */ @@ -1935,15 +1933,17 @@ static int twl4030_set_dai_fmt(struct snd_soc_dai *codec_dai, } if (format != old_format) { - - /* clear CODECPDZ before changing format (codec requirement) */ - twl4030_codec_enable(codec, 0); - - /* change format */ - twl4030_write(codec, TWL4030_REG_AUDIO_IF, format); - - /* set CODECPDZ afterwards */ - twl4030_codec_enable(codec, 1); + if (twl4030->codec_powered) { + /* + * If the codec is powered, than we need to toggle the + * codec power. + */ + twl4030_codec_enable(codec, 0); + twl4030_write(codec, TWL4030_REG_AUDIO_IF, format); + twl4030_codec_enable(codec, 1); + } else { + twl4030_write(codec, TWL4030_REG_AUDIO_IF, format); + } } return 0; @@ -2035,6 +2035,7 @@ static int twl4030_voice_hw_params(struct snd_pcm_substream *substream, struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_device *socdev = rtd->socdev; struct snd_soc_codec *codec = socdev->card->codec; + struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); u8 old_mode, mode; /* Enable voice digital filters */ @@ -2059,10 +2060,17 @@ static int twl4030_voice_hw_params(struct snd_pcm_substream *substream, } if (mode != old_mode) { - /* change rate and set CODECPDZ */ - twl4030_codec_enable(codec, 0); - twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode); - twl4030_codec_enable(codec, 1); + if (twl4030->codec_powered) { + /* + * If the codec is powered, than we need to toggle the + * codec power. + */ + twl4030_codec_enable(codec, 0); + twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode); + twl4030_codec_enable(codec, 1); + } else { + twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode); + } } return 0; @@ -2092,6 +2100,7 @@ static int twl4030_voice_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { struct snd_soc_codec *codec = codec_dai->codec; + struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); u8 old_format, format; /* get format */ @@ -2123,10 +2132,17 @@ static int twl4030_voice_set_dai_fmt(struct snd_soc_dai *codec_dai, } if (format != old_format) { - /* change format and set CODECPDZ */ - twl4030_codec_enable(codec, 0); - twl4030_write(codec, TWL4030_REG_VOICE_IF, format); - twl4030_codec_enable(codec, 1); + if (twl4030->codec_powered) { + /* + * If the codec is powered, than we need to toggle the + * codec power. + */ + twl4030_codec_enable(codec, 0); + twl4030_write(codec, TWL4030_REG_VOICE_IF, format); + twl4030_codec_enable(codec, 1); + } else { + twl4030_write(codec, TWL4030_REG_VOICE_IF, format); + } } return 0; @@ -2235,7 +2251,6 @@ static int twl4030_soc_probe(struct platform_device *pdev) socdev->card->codec = codec; twl4030_init_chip(pdev); - twl4030_set_bias_level(codec, SND_SOC_BIAS_STANDBY); /* register pcms */ ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); @@ -2296,6 +2311,7 @@ static int __devinit twl4030_codec_probe(struct platform_device *pdev) codec->read = twl4030_read_reg_cache; codec->write = twl4030_write; codec->set_bias_level = twl4030_set_bias_level; + codec->idle_bias_off = 1; codec->dai = twl4030_dai; codec->num_dai = ARRAY_SIZE(twl4030_dai); codec->reg_cache_size = sizeof(twl4030_reg); -- cgit v1.2.3 From a3a29b55c70cefaac0d6fda170ccc85bd10e78bf Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 26 May 2010 11:38:21 +0300 Subject: ASoC: TWL4030: Add functionalty to reset the registers Machine driver can instruct the codec driver to reset the chip registers to their default values at probe time. If machine driver does not provide setup data, then the registers are going to be reseted to their defaults, to be safe. If the developer on the platform confirms that the register reset is not needed, than it can be skipped, saving ~20ms time in probe. As safety measure do the register reset at remove time also. Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl4030.c | 17 +++++++++++++++++ sound/soc/codecs/twl4030.h | 1 + 2 files changed, 18 insertions(+) (limited to 'sound') diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index 45de2aad283c..b292c2d8f2a3 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -262,6 +262,17 @@ static inline void twl4030_check_defaults(struct snd_soc_codec *codec) difference, difference ? "Not OK" : "OK"); } +static inline void twl4030_reset_registers(struct snd_soc_codec *codec) +{ + int i; + + /* set all audio section registers to reasonable defaults */ + for (i = TWL4030_REG_OPTION; i <= TWL4030_REG_MISC_SET_2; i++) + if (i != TWL4030_REG_APLL_CTL) + twl4030_write(codec, i, twl4030_reg[i]); + +} + static void twl4030_init_chip(struct platform_device *pdev) { struct snd_soc_device *socdev = platform_get_drvdata(pdev); @@ -275,6 +286,10 @@ static void twl4030_init_chip(struct platform_device *pdev) if (setup && setup->check_defaults) twl4030_check_defaults(codec); + /* Reset registers, if no setup data or if instructed to do so */ + if (!setup || (setup && setup->reset_registers)) + twl4030_reset_registers(codec); + /* Refresh APLL_CTL register from HW */ twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, &byte, TWL4030_REG_APLL_CTL); @@ -2271,6 +2286,8 @@ static int twl4030_soc_remove(struct platform_device *pdev) struct snd_soc_device *socdev = platform_get_drvdata(pdev); struct snd_soc_codec *codec = socdev->card->codec; + /* Reset registers to their chip default before leaving */ + twl4030_reset_registers(codec); twl4030_set_bias_level(codec, SND_SOC_BIAS_OFF); snd_soc_free_pcms(socdev); snd_soc_dapm_free(socdev); diff --git a/sound/soc/codecs/twl4030.h b/sound/soc/codecs/twl4030.h index c22542c2690c..788e3d125099 100644 --- a/sound/soc/codecs/twl4030.h +++ b/sound/soc/codecs/twl4030.h @@ -44,6 +44,7 @@ struct twl4030_setup_data { unsigned int sysclk; unsigned int offset_cncl_path; unsigned int check_defaults:1; + unsigned int reset_registers:1; unsigned int hs_extmute:1; void (*set_hs_extmute)(int mute); }; -- cgit v1.2.3 From 3a642915ada4b7df9440a7bbed35cea94a5ccfe0 Mon Sep 17 00:00:00 2001 From: Seungwhan Youn Date: Thu, 27 May 2010 18:13:48 +0900 Subject: ASoC: spdif: Add codec driver to use spdif stand-alone This patch adds spdif dummy codec driver for using spdif-dit as a stand-alone. Until this, spdif-dit can be used only with other codecs like tlv320aci3x in davinci platform. Signed-off-by: Seungwhan Youn Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/spdif_transciever.c | 93 +++++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/spdif_transciever.c b/sound/soc/codecs/spdif_transciever.c index a63191141052..f0945ab2002e 100644 --- a/sound/soc/codecs/spdif_transciever.c +++ b/sound/soc/codecs/spdif_transciever.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "spdif_transciever.h" @@ -26,6 +27,48 @@ MODULE_LICENSE("GPL"); #define STUB_RATES SNDRV_PCM_RATE_8000_96000 #define STUB_FORMATS SNDRV_PCM_FMTBIT_S16_LE +static struct snd_soc_codec *spdif_dit_codec; + +static int spdif_dit_codec_probe(struct platform_device *pdev) +{ + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + struct snd_soc_codec *codec; + int ret; + + if (spdif_dit_codec == NULL) { + dev_err(&pdev->dev, "Codec device not registered\n"); + return -ENODEV; + } + + socdev->card->codec = spdif_dit_codec; + codec = spdif_dit_codec; + + ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); + if (ret < 0) { + dev_err(codec->dev, "failed to create pcms: %d\n", ret); + goto err_create_pcms; + } + + return 0; + +err_create_pcms: + return ret; +} + +static int spdif_dit_codec_remove(struct platform_device *pdev) +{ + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + + snd_soc_free_pcms(socdev); + + return 0; +} + +struct snd_soc_codec_device soc_codec_dev_spdif_dit = { + .probe = spdif_dit_codec_probe, + .remove = spdif_dit_codec_remove, +}; EXPORT_SYMBOL_GPL(soc_codec_dev_spdif_dit); + struct snd_soc_dai dit_stub_dai = { .name = "DIT", .playback = { @@ -40,13 +83,61 @@ EXPORT_SYMBOL_GPL(dit_stub_dai); static int spdif_dit_probe(struct platform_device *pdev) { + struct snd_soc_codec *codec; + int ret; + + if (spdif_dit_codec) { + dev_err(&pdev->dev, "Another Codec is registered\n"); + ret = -EINVAL; + goto err_reg_codec; + } + + codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); + if (codec == NULL) + return -ENOMEM; + + codec->dev = &pdev->dev; + + mutex_init(&codec->mutex); + + INIT_LIST_HEAD(&codec->dapm_widgets); + INIT_LIST_HEAD(&codec->dapm_paths); + + codec->name = "spdif-dit"; + codec->owner = THIS_MODULE; + codec->dai = &dit_stub_dai; + codec->num_dai = 1; + + spdif_dit_codec = codec; + + ret = snd_soc_register_codec(codec); + if (ret < 0) { + dev_err(codec->dev, "Failed to register codec: %d\n", ret); + goto err_reg_codec; + } + dit_stub_dai.dev = &pdev->dev; - return snd_soc_register_dai(&dit_stub_dai); + ret = snd_soc_register_dai(&dit_stub_dai); + if (ret < 0) { + dev_err(codec->dev, "Failed to register dai: %d\n", ret); + goto err_reg_dai; + } + + return 0; + +err_reg_dai: + snd_soc_unregister_codec(codec); +err_reg_codec: + kfree(spdif_dit_codec); + return ret; } static int spdif_dit_remove(struct platform_device *pdev) { snd_soc_unregister_dai(&dit_stub_dai); + snd_soc_unregister_codec(spdif_dit_codec); + kfree(spdif_dit_codec); + spdif_dit_codec = NULL; return 0; } -- cgit v1.2.3 From 72ed5a8c9b057aeb779d161ac6fab1e98f091697 Mon Sep 17 00:00:00 2001 From: "apatard@mandriva.com" Date: Thu, 27 May 2010 14:57:41 +0200 Subject: ASoC: Add driver for cs42l51 This patch is adding a ASoC driver for the cs42l51 from Cirrus Logic. Master mode and spi mode are not supported. Signed-off-by: Arnaud Patard Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/Kconfig | 4 + sound/soc/codecs/Makefile | 2 + sound/soc/codecs/cs42l51.c | 763 +++++++++++++++++++++++++++++++++++++++++++++ sound/soc/codecs/cs42l51.h | 163 ++++++++++ 4 files changed, 932 insertions(+) create mode 100644 sound/soc/codecs/cs42l51.c create mode 100644 sound/soc/codecs/cs42l51.h (limited to 'sound') diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 31ac5538fe7e..c37c84458b58 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -22,6 +22,7 @@ config SND_SOC_ALL_CODECS select SND_SOC_AK4642 if I2C select SND_SOC_AK4671 if I2C select SND_SOC_CQ0093VC if MFD_DAVINCI_VOICECODEC + select SND_SOC_CS42L51 if I2C select SND_SOC_CS4270 if I2C select SND_SOC_MAX9877 if I2C select SND_SOC_DA7210 if I2C @@ -120,6 +121,9 @@ config SND_SOC_AK4671 config SND_SOC_CQ0093VC tristate +config SND_SOC_CS42L51 + tristate + # Cirrus Logic CS4270 Codec config SND_SOC_CS4270 tristate diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index 91429eab0707..4a9c205caf56 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile @@ -9,6 +9,7 @@ snd-soc-ak4535-objs := ak4535.o snd-soc-ak4642-objs := ak4642.o snd-soc-ak4671-objs := ak4671.o snd-soc-cq93vc-objs := cq93vc.o +snd-soc-cs42l51-objs := cs42l51.o snd-soc-cs4270-objs := cs4270.o snd-soc-cx20442-objs := cx20442.o snd-soc-da7210-objs := da7210.o @@ -74,6 +75,7 @@ obj-$(CONFIG_SND_SOC_AK4535) += snd-soc-ak4535.o obj-$(CONFIG_SND_SOC_AK4642) += snd-soc-ak4642.o obj-$(CONFIG_SND_SOC_AK4671) += snd-soc-ak4671.o obj-$(CONFIG_SND_SOC_CQ0093VC) += snd-soc-cq93vc.o +obj-$(CONFIG_SND_SOC_CS42L51) += snd-soc-cs42l51.o obj-$(CONFIG_SND_SOC_CS4270) += snd-soc-cs4270.o obj-$(CONFIG_SND_SOC_CX20442) += snd-soc-cx20442.o obj-$(CONFIG_SND_SOC_DA7210) += snd-soc-da7210.o diff --git a/sound/soc/codecs/cs42l51.c b/sound/soc/codecs/cs42l51.c new file mode 100644 index 000000000000..dd9b8550c402 --- /dev/null +++ b/sound/soc/codecs/cs42l51.c @@ -0,0 +1,763 @@ +/* + * cs42l51.c + * + * ASoC Driver for Cirrus Logic CS42L51 codecs + * + * Copyright (c) 2010 Arnaud Patard + * + * Based on cs4270.c - Copyright (c) Freescale Semiconductor + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * For now: + * - Only I2C is support. Not SPI + * - master mode *NOT* supported + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cs42l51.h" + +enum master_slave_mode { + MODE_SLAVE, + MODE_SLAVE_AUTO, + MODE_MASTER, +}; + +struct cs42l51_private { + unsigned int mclk; + unsigned int audio_mode; /* The mode (I2S or left-justified) */ + enum master_slave_mode func; + struct snd_soc_codec codec; + u8 reg_cache[CS42L51_NUMREGS]; +}; + +static struct snd_soc_codec *cs42l51_codec; + +#define CS42L51_FORMATS ( \ + SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE | \ + SNDRV_PCM_FMTBIT_S18_3LE | SNDRV_PCM_FMTBIT_S18_3BE | \ + SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S20_3BE | \ + SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_BE) + +static int cs42l51_fill_cache(struct snd_soc_codec *codec) +{ + u8 *cache = codec->reg_cache + 1; + struct i2c_client *i2c_client = codec->control_data; + s32 length; + + length = i2c_smbus_read_i2c_block_data(i2c_client, + CS42L51_FIRSTREG | 0x80, CS42L51_NUMREGS, cache); + if (length != CS42L51_NUMREGS) { + dev_err(&i2c_client->dev, + "I2C read failure, addr=0x%x (ret=%d vs %d)\n", + i2c_client->addr, length, CS42L51_NUMREGS); + return -EIO; + } + + return 0; +} + +static int cs42l51_i2c_probe(struct i2c_client *i2c_client, + const struct i2c_device_id *id) +{ + struct snd_soc_codec *codec; + struct cs42l51_private *cs42l51; + int ret = 0; + int reg; + + if (cs42l51_codec) + return -EBUSY; + + /* Verify that we have a CS42L51 */ + ret = i2c_smbus_read_byte_data(i2c_client, CS42L51_CHIP_REV_ID); + if (ret < 0) { + dev_err(&i2c_client->dev, "failed to read I2C\n"); + goto error; + } + + if ((ret != CS42L51_MK_CHIP_REV(CS42L51_CHIP_ID, CS42L51_CHIP_REV_A)) && + (ret != CS42L51_MK_CHIP_REV(CS42L51_CHIP_ID, CS42L51_CHIP_REV_B))) { + dev_err(&i2c_client->dev, "Invalid chip id\n"); + ret = -ENODEV; + goto error; + } + + dev_info(&i2c_client->dev, "found device cs42l51 rev %d\n", + ret & 7); + + cs42l51 = kzalloc(sizeof(struct cs42l51_private), GFP_KERNEL); + if (!cs42l51) { + dev_err(&i2c_client->dev, "could not allocate codec\n"); + return -ENOMEM; + } + codec = &cs42l51->codec; + + mutex_init(&codec->mutex); + INIT_LIST_HEAD(&codec->dapm_widgets); + INIT_LIST_HEAD(&codec->dapm_paths); + + codec->dev = &i2c_client->dev; + codec->name = "CS42L51"; + codec->owner = THIS_MODULE; + codec->dai = &cs42l51_dai; + codec->num_dai = 1; + snd_soc_codec_set_drvdata(codec, cs42l51); + + codec->control_data = i2c_client; + codec->reg_cache = cs42l51->reg_cache; + codec->reg_cache_size = CS42L51_NUMREGS; + i2c_set_clientdata(i2c_client, codec); + + ret = cs42l51_fill_cache(codec); + if (ret < 0) { + dev_err(&i2c_client->dev, "failed to fill register cache\n"); + goto error_alloc; + } + + ret = snd_soc_codec_set_cache_io(codec, 8, 8, SND_SOC_I2C); + if (ret < 0) { + dev_err(&i2c_client->dev, "Failed to set cache I/O: %d\n", ret); + goto error_alloc; + } + + /* + * DAC configuration + * - Use signal processor + * - auto mute + * - vol changes immediate + * - no de-emphasize + */ + reg = CS42L51_DAC_CTL_DATA_SEL(1) + | CS42L51_DAC_CTL_AMUTE | CS42L51_DAC_CTL_DACSZ(0); + ret = snd_soc_write(codec, CS42L51_DAC_CTL, reg); + if (ret < 0) + goto error_alloc; + + cs42l51_dai.dev = codec->dev; + cs42l51_codec = codec; + + ret = snd_soc_register_codec(codec); + if (ret != 0) { + dev_err(codec->dev, "Failed to register codec: %d\n", ret); + goto error_alloc; + } + + ret = snd_soc_register_dai(&cs42l51_dai); + if (ret < 0) { + dev_err(&i2c_client->dev, "failed to register DAIe\n"); + goto error_reg; + } + + return 0; + +error_reg: + snd_soc_unregister_codec(codec); +error_alloc: + kfree(cs42l51); +error: + return ret; +} + +static int cs42l51_i2c_remove(struct i2c_client *client) +{ + struct cs42l51_private *cs42l51 = i2c_get_clientdata(client); + snd_soc_unregister_dai(&cs42l51_dai); + snd_soc_unregister_codec(cs42l51_codec); + cs42l51_codec = NULL; + kfree(cs42l51); + return 0; +} + + +static const struct i2c_device_id cs42l51_id[] = { + {"cs42l51", 0}, + {} +}; +MODULE_DEVICE_TABLE(i2c, cs42l51_id); + +static struct i2c_driver cs42l51_i2c_driver = { + .driver = { + .name = "CS42L51 I2C", + .owner = THIS_MODULE, + }, + .id_table = cs42l51_id, + .probe = cs42l51_i2c_probe, + .remove = cs42l51_i2c_remove, +}; + +static int cs42l51_get_chan_mix(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + unsigned long value = snd_soc_read(codec, CS42L51_PCM_MIXER)&3; + + switch (value) { + default: + case 0: + ucontrol->value.integer.value[0] = 0; + break; + /* same value : (L+R)/2 and (R+L)/2 */ + case 1: + case 2: + ucontrol->value.integer.value[0] = 1; + break; + case 3: + ucontrol->value.integer.value[0] = 2; + break; + } + + return 0; +} + +#define CHAN_MIX_NORMAL 0x00 +#define CHAN_MIX_BOTH 0x55 +#define CHAN_MIX_SWAP 0xFF + +static int cs42l51_set_chan_mix(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + unsigned char val; + + switch (ucontrol->value.integer.value[0]) { + default: + case 0: + val = CHAN_MIX_NORMAL; + break; + case 1: + val = CHAN_MIX_BOTH; + break; + case 2: + val = CHAN_MIX_SWAP; + break; + } + + snd_soc_write(codec, CS42L51_PCM_MIXER, val); + + return 1; +} + +static const DECLARE_TLV_DB_SCALE(adc_pcm_tlv, -5150, 50, 0); +static const DECLARE_TLV_DB_SCALE(tone_tlv, -1050, 150, 0); +/* This is a lie. after -102 db, it stays at -102 */ +/* maybe a range would be better */ +static const DECLARE_TLV_DB_SCALE(aout_tlv, -11550, 50, 0); + +static const DECLARE_TLV_DB_SCALE(boost_tlv, 1600, 1600, 0); +static const char *chan_mix[] = { + "L R", + "L+R", + "R L", +}; + +static const struct soc_enum cs42l51_chan_mix = + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(chan_mix), chan_mix); + +static const struct snd_kcontrol_new cs42l51_snd_controls[] = { + SOC_DOUBLE_R_SX_TLV("PCM Playback Volume", + CS42L51_PCMA_VOL, CS42L51_PCMB_VOL, + 7, 0xffffff99, 0x18, adc_pcm_tlv), + SOC_DOUBLE_R("PCM Playback Switch", + CS42L51_PCMA_VOL, CS42L51_PCMB_VOL, 7, 1, 1), + SOC_DOUBLE_R_SX_TLV("Analog Playback Volume", + CS42L51_AOUTA_VOL, CS42L51_AOUTB_VOL, + 8, 0xffffff19, 0x18, aout_tlv), + SOC_DOUBLE_R_SX_TLV("ADC Mixer Volume", + CS42L51_ADCA_VOL, CS42L51_ADCB_VOL, + 7, 0xffffff99, 0x18, adc_pcm_tlv), + SOC_DOUBLE_R("ADC Mixer Switch", + CS42L51_ADCA_VOL, CS42L51_ADCB_VOL, 7, 1, 1), + SOC_SINGLE("Playback Deemphasis Switch", CS42L51_DAC_CTL, 3, 1, 0), + SOC_SINGLE("Auto-Mute Switch", CS42L51_DAC_CTL, 2, 1, 0), + SOC_SINGLE("Soft Ramp Switch", CS42L51_DAC_CTL, 1, 1, 0), + SOC_SINGLE("Zero Cross Switch", CS42L51_DAC_CTL, 0, 0, 0), + SOC_DOUBLE_TLV("Mic Boost Volume", + CS42L51_MIC_CTL, 0, 1, 1, 0, boost_tlv), + SOC_SINGLE_TLV("Bass Volume", CS42L51_TONE_CTL, 0, 0xf, 1, tone_tlv), + SOC_SINGLE_TLV("Treble Volume", CS42L51_TONE_CTL, 4, 0xf, 1, tone_tlv), + SOC_ENUM_EXT("PCM channel mixer", + cs42l51_chan_mix, + cs42l51_get_chan_mix, cs42l51_set_chan_mix), +}; + +/* + * to power down, one must: + * 1.) Enable the PDN bit + * 2.) enable power-down for the select channels + * 3.) disable the PDN bit. + */ +static int cs42l51_pdn_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + unsigned long value; + + value = snd_soc_read(w->codec, CS42L51_POWER_CTL1); + value &= ~CS42L51_POWER_CTL1_PDN; + + switch (event) { + case SND_SOC_DAPM_PRE_PMD: + value |= CS42L51_POWER_CTL1_PDN; + break; + default: + case SND_SOC_DAPM_POST_PMD: + break; + } + snd_soc_update_bits(w->codec, CS42L51_POWER_CTL1, + CS42L51_POWER_CTL1_PDN, value); + + return 0; +} + +static const char *cs42l51_dac_names[] = {"Direct PCM", + "DSP PCM", "ADC"}; +static const struct soc_enum cs42l51_dac_mux_enum = + SOC_ENUM_SINGLE(CS42L51_DAC_CTL, 6, 3, cs42l51_dac_names); +static const struct snd_kcontrol_new cs42l51_dac_mux_controls = + SOC_DAPM_ENUM("Route", cs42l51_dac_mux_enum); + +static const char *cs42l51_adcl_names[] = {"AIN1 Left", "AIN2 Left", + "MIC Left", "MIC+preamp Left"}; +static const struct soc_enum cs42l51_adcl_mux_enum = + SOC_ENUM_SINGLE(CS42L51_ADC_INPUT, 4, 4, cs42l51_adcl_names); +static const struct snd_kcontrol_new cs42l51_adcl_mux_controls = + SOC_DAPM_ENUM("Route", cs42l51_adcl_mux_enum); + +static const char *cs42l51_adcr_names[] = {"AIN1 Right", "AIN2 Right", + "MIC Right", "MIC+preamp Right"}; +static const struct soc_enum cs42l51_adcr_mux_enum = + SOC_ENUM_SINGLE(CS42L51_ADC_INPUT, 6, 4, cs42l51_adcr_names); +static const struct snd_kcontrol_new cs42l51_adcr_mux_controls = + SOC_DAPM_ENUM("Route", cs42l51_adcr_mux_enum); + +static const struct snd_soc_dapm_widget cs42l51_dapm_widgets[] = { + SND_SOC_DAPM_MICBIAS("Mic Bias", CS42L51_MIC_POWER_CTL, 1, 1), + SND_SOC_DAPM_PGA_E("Left PGA", CS42L51_POWER_CTL1, 3, 1, NULL, 0, + cs42l51_pdn_event, SND_SOC_DAPM_PRE_POST_PMD), + SND_SOC_DAPM_PGA_E("Right PGA", CS42L51_POWER_CTL1, 4, 1, NULL, 0, + cs42l51_pdn_event, SND_SOC_DAPM_PRE_POST_PMD), + SND_SOC_DAPM_ADC_E("Left ADC", "Left HiFi Capture", + CS42L51_POWER_CTL1, 1, 1, + cs42l51_pdn_event, SND_SOC_DAPM_PRE_POST_PMD), + SND_SOC_DAPM_ADC_E("Right ADC", "Right HiFi Capture", + CS42L51_POWER_CTL1, 2, 1, + cs42l51_pdn_event, SND_SOC_DAPM_PRE_POST_PMD), + SND_SOC_DAPM_DAC_E("Left DAC", "Left HiFi Playback", + CS42L51_POWER_CTL1, 5, 1, + cs42l51_pdn_event, SND_SOC_DAPM_PRE_POST_PMD), + SND_SOC_DAPM_DAC_E("Right DAC", "Right HiFi Playback", + CS42L51_POWER_CTL1, 6, 1, + cs42l51_pdn_event, SND_SOC_DAPM_PRE_POST_PMD), + + /* analog/mic */ + SND_SOC_DAPM_INPUT("AIN1L"), + SND_SOC_DAPM_INPUT("AIN1R"), + SND_SOC_DAPM_INPUT("AIN2L"), + SND_SOC_DAPM_INPUT("AIN2R"), + SND_SOC_DAPM_INPUT("MICL"), + SND_SOC_DAPM_INPUT("MICR"), + + SND_SOC_DAPM_MIXER("Mic Preamp Left", + CS42L51_MIC_POWER_CTL, 2, 1, NULL, 0), + SND_SOC_DAPM_MIXER("Mic Preamp Right", + CS42L51_MIC_POWER_CTL, 3, 1, NULL, 0), + + /* HP */ + SND_SOC_DAPM_OUTPUT("HPL"), + SND_SOC_DAPM_OUTPUT("HPR"), + + /* mux */ + SND_SOC_DAPM_MUX("DAC Mux", SND_SOC_NOPM, 0, 0, + &cs42l51_dac_mux_controls), + SND_SOC_DAPM_MUX("PGA-ADC Mux Left", SND_SOC_NOPM, 0, 0, + &cs42l51_adcl_mux_controls), + SND_SOC_DAPM_MUX("PGA-ADC Mux Right", SND_SOC_NOPM, 0, 0, + &cs42l51_adcr_mux_controls), +}; + +static const struct snd_soc_dapm_route cs42l51_routes[] = { + {"HPL", NULL, "Left DAC"}, + {"HPR", NULL, "Right DAC"}, + + {"Left ADC", NULL, "Left PGA"}, + {"Right ADC", NULL, "Right PGA"}, + + {"Mic Preamp Left", NULL, "MICL"}, + {"Mic Preamp Right", NULL, "MICR"}, + + {"PGA-ADC Mux Left", "AIN1 Left", "AIN1L" }, + {"PGA-ADC Mux Left", "AIN2 Left", "AIN2L" }, + {"PGA-ADC Mux Left", "MIC Left", "MICL" }, + {"PGA-ADC Mux Left", "MIC+preamp Left", "Mic Preamp Left" }, + {"PGA-ADC Mux Right", "AIN1 Right", "AIN1R" }, + {"PGA-ADC Mux Right", "AIN2 Right", "AIN2R" }, + {"PGA-ADC Mux Right", "MIC Right", "MICR" }, + {"PGA-ADC Mux Right", "MIC+preamp Right", "Mic Preamp Right" }, + + {"Left PGA", NULL, "PGA-ADC Mux Left"}, + {"Right PGA", NULL, "PGA-ADC Mux Right"}, +}; + +static int cs42l51_set_dai_fmt(struct snd_soc_dai *codec_dai, + unsigned int format) +{ + struct snd_soc_codec *codec = codec_dai->codec; + struct cs42l51_private *cs42l51 = snd_soc_codec_get_drvdata(codec); + int ret = 0; + + switch (format & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_I2S: + case SND_SOC_DAIFMT_LEFT_J: + case SND_SOC_DAIFMT_RIGHT_J: + cs42l51->audio_mode = format & SND_SOC_DAIFMT_FORMAT_MASK; + break; + default: + dev_err(codec->dev, "invalid DAI format\n"); + ret = -EINVAL; + } + + switch (format & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBM_CFM: + cs42l51->func = MODE_MASTER; + break; + case SND_SOC_DAIFMT_CBS_CFS: + cs42l51->func = MODE_SLAVE_AUTO; + break; + default: + ret = -EINVAL; + break; + } + + return ret; +} + +struct cs42l51_ratios { + unsigned int ratio; + unsigned char speed_mode; + unsigned char mclk; +}; + +static struct cs42l51_ratios slave_ratios[] = { + { 512, CS42L51_QSM_MODE, 0 }, { 768, CS42L51_QSM_MODE, 0 }, + { 1024, CS42L51_QSM_MODE, 0 }, { 1536, CS42L51_QSM_MODE, 0 }, + { 2048, CS42L51_QSM_MODE, 0 }, { 3072, CS42L51_QSM_MODE, 0 }, + { 256, CS42L51_HSM_MODE, 0 }, { 384, CS42L51_HSM_MODE, 0 }, + { 512, CS42L51_HSM_MODE, 0 }, { 768, CS42L51_HSM_MODE, 0 }, + { 1024, CS42L51_HSM_MODE, 0 }, { 1536, CS42L51_HSM_MODE, 0 }, + { 128, CS42L51_SSM_MODE, 0 }, { 192, CS42L51_SSM_MODE, 0 }, + { 256, CS42L51_SSM_MODE, 0 }, { 384, CS42L51_SSM_MODE, 0 }, + { 512, CS42L51_SSM_MODE, 0 }, { 768, CS42L51_SSM_MODE, 0 }, + { 128, CS42L51_DSM_MODE, 0 }, { 192, CS42L51_DSM_MODE, 0 }, + { 256, CS42L51_DSM_MODE, 0 }, { 384, CS42L51_DSM_MODE, 0 }, +}; + +static struct cs42l51_ratios slave_auto_ratios[] = { + { 1024, CS42L51_QSM_MODE, 0 }, { 1536, CS42L51_QSM_MODE, 0 }, + { 2048, CS42L51_QSM_MODE, 1 }, { 3072, CS42L51_QSM_MODE, 1 }, + { 512, CS42L51_HSM_MODE, 0 }, { 768, CS42L51_HSM_MODE, 0 }, + { 1024, CS42L51_HSM_MODE, 1 }, { 1536, CS42L51_HSM_MODE, 1 }, + { 256, CS42L51_SSM_MODE, 0 }, { 384, CS42L51_SSM_MODE, 0 }, + { 512, CS42L51_SSM_MODE, 1 }, { 768, CS42L51_SSM_MODE, 1 }, + { 128, CS42L51_DSM_MODE, 0 }, { 192, CS42L51_DSM_MODE, 0 }, + { 256, CS42L51_DSM_MODE, 1 }, { 384, CS42L51_DSM_MODE, 1 }, +}; + +static int cs42l51_set_dai_sysclk(struct snd_soc_dai *codec_dai, + int clk_id, unsigned int freq, int dir) +{ + struct snd_soc_codec *codec = codec_dai->codec; + struct cs42l51_private *cs42l51 = snd_soc_codec_get_drvdata(codec); + struct cs42l51_ratios *ratios = NULL; + int nr_ratios = 0; + unsigned int rates = 0; + unsigned int rate_min = -1; + unsigned int rate_max = 0; + int i; + + cs42l51->mclk = freq; + + switch (cs42l51->func) { + case MODE_MASTER: + return -EINVAL; + case MODE_SLAVE: + ratios = slave_ratios; + nr_ratios = ARRAY_SIZE(slave_ratios); + break; + case MODE_SLAVE_AUTO: + ratios = slave_auto_ratios; + nr_ratios = ARRAY_SIZE(slave_auto_ratios); + break; + } + + for (i = 0; i < nr_ratios; i++) { + unsigned int rate = freq / ratios[i].ratio; + rates |= snd_pcm_rate_to_rate_bit(rate); + if (rate < rate_min) + rate_min = rate; + if (rate > rate_max) + rate_max = rate; + } + rates &= ~SNDRV_PCM_RATE_KNOT; + + if (!rates) { + dev_err(codec->dev, "could not find a valid sample rate\n"); + return -EINVAL; + } + + codec_dai->playback.rates = rates; + codec_dai->playback.rate_min = rate_min; + codec_dai->playback.rate_max = rate_max; + + codec_dai->capture.rates = rates; + codec_dai->capture.rate_min = rate_min; + codec_dai->capture.rate_max = rate_max; + + return 0; +} + +static int cs42l51_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_device *socdev = rtd->socdev; + struct snd_soc_codec *codec = socdev->card->codec; + struct cs42l51_private *cs42l51 = snd_soc_codec_get_drvdata(codec); + int ret; + unsigned int i; + unsigned int rate; + unsigned int ratio; + struct cs42l51_ratios *ratios = NULL; + int nr_ratios = 0; + int intf_ctl, power_ctl, fmt; + + switch (cs42l51->func) { + case MODE_MASTER: + return -EINVAL; + case MODE_SLAVE: + ratios = slave_ratios; + nr_ratios = ARRAY_SIZE(slave_ratios); + break; + case MODE_SLAVE_AUTO: + ratios = slave_auto_ratios; + nr_ratios = ARRAY_SIZE(slave_auto_ratios); + break; + } + + /* Figure out which MCLK/LRCK ratio to use */ + rate = params_rate(params); /* Sampling rate, in Hz */ + ratio = cs42l51->mclk / rate; /* MCLK/LRCK ratio */ + for (i = 0; i < nr_ratios; i++) { + if (ratios[i].ratio == ratio) + break; + } + + if (i == nr_ratios) { + /* We did not find a matching ratio */ + dev_err(codec->dev, "could not find matching ratio\n"); + return -EINVAL; + } + + intf_ctl = snd_soc_read(codec, CS42L51_INTF_CTL); + power_ctl = snd_soc_read(codec, CS42L51_MIC_POWER_CTL); + + intf_ctl &= ~(CS42L51_INTF_CTL_MASTER | CS42L51_INTF_CTL_ADC_I2S + | CS42L51_INTF_CTL_DAC_FORMAT(7)); + power_ctl &= ~(CS42L51_MIC_POWER_CTL_SPEED(3) + | CS42L51_MIC_POWER_CTL_MCLK_DIV2); + + switch (cs42l51->func) { + case MODE_MASTER: + intf_ctl |= CS42L51_INTF_CTL_MASTER; + power_ctl |= CS42L51_MIC_POWER_CTL_SPEED(ratios[i].speed_mode); + break; + case MODE_SLAVE: + power_ctl |= CS42L51_MIC_POWER_CTL_SPEED(ratios[i].speed_mode); + break; + case MODE_SLAVE_AUTO: + power_ctl |= CS42L51_MIC_POWER_CTL_AUTO; + break; + } + + switch (cs42l51->audio_mode) { + case SND_SOC_DAIFMT_I2S: + intf_ctl |= CS42L51_INTF_CTL_ADC_I2S; + intf_ctl |= CS42L51_INTF_CTL_DAC_FORMAT(CS42L51_DAC_DIF_I2S); + break; + case SND_SOC_DAIFMT_LEFT_J: + intf_ctl |= CS42L51_INTF_CTL_DAC_FORMAT(CS42L51_DAC_DIF_LJ24); + break; + case SND_SOC_DAIFMT_RIGHT_J: + switch (params_format(params)) { + case SNDRV_PCM_FORMAT_S16_LE: + case SNDRV_PCM_FORMAT_S16_BE: + fmt = CS42L51_DAC_DIF_RJ16; + break; + case SNDRV_PCM_FORMAT_S18_3LE: + case SNDRV_PCM_FORMAT_S18_3BE: + fmt = CS42L51_DAC_DIF_RJ18; + break; + case SNDRV_PCM_FORMAT_S20_3LE: + case SNDRV_PCM_FORMAT_S20_3BE: + fmt = CS42L51_DAC_DIF_RJ20; + break; + case SNDRV_PCM_FORMAT_S24_LE: + case SNDRV_PCM_FORMAT_S24_BE: + fmt = CS42L51_DAC_DIF_RJ24; + break; + default: + dev_err(codec->dev, "unknown format\n"); + return -EINVAL; + } + intf_ctl |= CS42L51_INTF_CTL_DAC_FORMAT(fmt); + break; + default: + dev_err(codec->dev, "unknown format\n"); + return -EINVAL; + } + + if (ratios[i].mclk) + power_ctl |= CS42L51_MIC_POWER_CTL_MCLK_DIV2; + + ret = snd_soc_write(codec, CS42L51_INTF_CTL, intf_ctl); + if (ret < 0) + return ret; + + ret = snd_soc_write(codec, CS42L51_MIC_POWER_CTL, power_ctl); + if (ret < 0) + return ret; + + return 0; +} + +static int cs42l51_dai_mute(struct snd_soc_dai *dai, int mute) +{ + struct snd_soc_codec *codec = dai->codec; + int reg; + int mask = CS42L51_DAC_OUT_CTL_DACA_MUTE|CS42L51_DAC_OUT_CTL_DACB_MUTE; + + reg = snd_soc_read(codec, CS42L51_DAC_OUT_CTL); + + if (mute) + reg |= mask; + else + reg &= ~mask; + + return snd_soc_write(codec, CS42L51_DAC_OUT_CTL, reg); +} + +static struct snd_soc_dai_ops cs42l51_dai_ops = { + .hw_params = cs42l51_hw_params, + .set_sysclk = cs42l51_set_dai_sysclk, + .set_fmt = cs42l51_set_dai_fmt, + .digital_mute = cs42l51_dai_mute, +}; + +struct snd_soc_dai cs42l51_dai = { + .name = "CS42L51 HiFi", + .playback = { + .stream_name = "Playback", + .channels_min = 1, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_96000, + .formats = CS42L51_FORMATS, + }, + .capture = { + .stream_name = "Capture", + .channels_min = 1, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_96000, + .formats = CS42L51_FORMATS, + }, + .ops = &cs42l51_dai_ops, +}; +EXPORT_SYMBOL_GPL(cs42l51_dai); + + +static int cs42l51_probe(struct platform_device *pdev) +{ + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + struct snd_soc_codec *codec; + int ret = 0; + + if (!cs42l51_codec) { + dev_err(&pdev->dev, "CS42L51 codec not yet registered\n"); + return -EINVAL; + } + + socdev->card->codec = cs42l51_codec; + codec = socdev->card->codec; + + /* Register PCMs */ + ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); + if (ret < 0) { + dev_err(&pdev->dev, "failed to create PCMs\n"); + return ret; + } + + snd_soc_add_controls(codec, cs42l51_snd_controls, + ARRAY_SIZE(cs42l51_snd_controls)); + snd_soc_dapm_new_controls(codec, cs42l51_dapm_widgets, + ARRAY_SIZE(cs42l51_dapm_widgets)); + snd_soc_dapm_add_routes(codec, cs42l51_routes, + ARRAY_SIZE(cs42l51_routes)); + + return 0; +} + + +static int cs42l51_remove(struct platform_device *pdev) +{ + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + + snd_soc_free_pcms(socdev); + snd_soc_dapm_free(socdev); + + return 0; +} + +struct snd_soc_codec_device soc_codec_device_cs42l51 = { + .probe = cs42l51_probe, + .remove = cs42l51_remove +}; +EXPORT_SYMBOL_GPL(soc_codec_device_cs42l51); + +static int __init cs42l51_init(void) +{ + int ret; + + ret = i2c_add_driver(&cs42l51_i2c_driver); + if (ret != 0) { + printk(KERN_ERR "%s: can't add i2c driver\n", __func__); + return ret; + } + return 0; +} +module_init(cs42l51_init); + +static void __exit cs42l51_exit(void) +{ + i2c_del_driver(&cs42l51_i2c_driver); +} +module_exit(cs42l51_exit); + +MODULE_AUTHOR("Arnaud Patard "); +MODULE_DESCRIPTION("Cirrus Logic CS42L51 ALSA SoC Codec Driver"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/cs42l51.h b/sound/soc/codecs/cs42l51.h new file mode 100644 index 000000000000..8f0bd9786ad2 --- /dev/null +++ b/sound/soc/codecs/cs42l51.h @@ -0,0 +1,163 @@ +/* + * cs42l51.h + * + * ASoC Driver for Cirrus Logic CS42L51 codecs + * + * Copyright (c) 2010 Arnaud Patard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#ifndef _CS42L51_H +#define _CS42L51_H + +#define CS42L51_CHIP_ID 0x1B +#define CS42L51_CHIP_REV_A 0x00 +#define CS42L51_CHIP_REV_B 0x01 + +#define CS42L51_CHIP_REV_ID 0x01 +#define CS42L51_MK_CHIP_REV(a, b) ((a)<<3|(b)) + +#define CS42L51_POWER_CTL1 0x02 +#define CS42L51_POWER_CTL1_PDN_DACB (1<<6) +#define CS42L51_POWER_CTL1_PDN_DACA (1<<5) +#define CS42L51_POWER_CTL1_PDN_PGAB (1<<4) +#define CS42L51_POWER_CTL1_PDN_PGAA (1<<3) +#define CS42L51_POWER_CTL1_PDN_ADCB (1<<2) +#define CS42L51_POWER_CTL1_PDN_ADCA (1<<1) +#define CS42L51_POWER_CTL1_PDN (1<<0) + +#define CS42L51_MIC_POWER_CTL 0x03 +#define CS42L51_MIC_POWER_CTL_AUTO (1<<7) +#define CS42L51_MIC_POWER_CTL_SPEED(x) (((x)&3)<<5) +#define CS42L51_QSM_MODE 3 +#define CS42L51_HSM_MODE 2 +#define CS42L51_SSM_MODE 1 +#define CS42L51_DSM_MODE 0 +#define CS42L51_MIC_POWER_CTL_3ST_SP (1<<4) +#define CS42L51_MIC_POWER_CTL_PDN_MICB (1<<3) +#define CS42L51_MIC_POWER_CTL_PDN_MICA (1<<2) +#define CS42L51_MIC_POWER_CTL_PDN_BIAS (1<<1) +#define CS42L51_MIC_POWER_CTL_MCLK_DIV2 (1<<0) + +#define CS42L51_INTF_CTL 0x04 +#define CS42L51_INTF_CTL_LOOPBACK (1<<7) +#define CS42L51_INTF_CTL_MASTER (1<<6) +#define CS42L51_INTF_CTL_DAC_FORMAT(x) (((x)&7)<<3) +#define CS42L51_DAC_DIF_LJ24 0x00 +#define CS42L51_DAC_DIF_I2S 0x01 +#define CS42L51_DAC_DIF_RJ24 0x02 +#define CS42L51_DAC_DIF_RJ20 0x03 +#define CS42L51_DAC_DIF_RJ18 0x04 +#define CS42L51_DAC_DIF_RJ16 0x05 +#define CS42L51_INTF_CTL_ADC_I2S (1<<2) +#define CS42L51_INTF_CTL_DIGMIX (1<<1) +#define CS42L51_INTF_CTL_MICMIX (1<<0) + +#define CS42L51_MIC_CTL 0x05 +#define CS42L51_MIC_CTL_ADC_SNGVOL (1<<7) +#define CS42L51_MIC_CTL_ADCD_DBOOST (1<<6) +#define CS42L51_MIC_CTL_ADCA_DBOOST (1<<5) +#define CS42L51_MIC_CTL_MICBIAS_SEL (1<<4) +#define CS42L51_MIC_CTL_MICBIAS_LVL(x) (((x)&3)<<2) +#define CS42L51_MIC_CTL_MICB_BOOST (1<<1) +#define CS42L51_MIC_CTL_MICA_BOOST (1<<0) + +#define CS42L51_ADC_CTL 0x06 +#define CS42L51_ADC_CTL_ADCB_HPFEN (1<<7) +#define CS42L51_ADC_CTL_ADCB_HPFRZ (1<<6) +#define CS42L51_ADC_CTL_ADCA_HPFEN (1<<5) +#define CS42L51_ADC_CTL_ADCA_HPFRZ (1<<4) +#define CS42L51_ADC_CTL_SOFTB (1<<3) +#define CS42L51_ADC_CTL_ZCROSSB (1<<2) +#define CS42L51_ADC_CTL_SOFTA (1<<1) +#define CS42L51_ADC_CTL_ZCROSSA (1<<0) + +#define CS42L51_ADC_INPUT 0x07 +#define CS42L51_ADC_INPUT_AINB_MUX(x) (((x)&3)<<6) +#define CS42L51_ADC_INPUT_AINA_MUX(x) (((x)&3)<<4) +#define CS42L51_ADC_INPUT_INV_ADCB (1<<3) +#define CS42L51_ADC_INPUT_INV_ADCA (1<<2) +#define CS42L51_ADC_INPUT_ADCB_MUTE (1<<1) +#define CS42L51_ADC_INPUT_ADCA_MUTE (1<<0) + +#define CS42L51_DAC_OUT_CTL 0x08 +#define CS42L51_DAC_OUT_CTL_HP_GAIN(x) (((x)&7)<<5) +#define CS42L51_DAC_OUT_CTL_DAC_SNGVOL (1<<4) +#define CS42L51_DAC_OUT_CTL_INV_PCMB (1<<3) +#define CS42L51_DAC_OUT_CTL_INV_PCMA (1<<2) +#define CS42L51_DAC_OUT_CTL_DACB_MUTE (1<<1) +#define CS42L51_DAC_OUT_CTL_DACA_MUTE (1<<0) + +#define CS42L51_DAC_CTL 0x09 +#define CS42L51_DAC_CTL_DATA_SEL(x) (((x)&3)<<6) +#define CS42L51_DAC_CTL_FREEZE (1<<5) +#define CS42L51_DAC_CTL_DEEMPH (1<<3) +#define CS42L51_DAC_CTL_AMUTE (1<<2) +#define CS42L51_DAC_CTL_DACSZ(x) (((x)&3)<<0) + +#define CS42L51_ALC_PGA_CTL 0x0A +#define CS42L51_ALC_PGB_CTL 0x0B +#define CS42L51_ALC_PGX_ALCX_SRDIS (1<<7) +#define CS42L51_ALC_PGX_ALCX_ZCDIS (1<<6) +#define CS42L51_ALC_PGX_PGX_VOL(x) (((x)&0x1f)<<0) + +#define CS42L51_ADCA_ATT 0x0C +#define CS42L51_ADCB_ATT 0x0D + +#define CS42L51_ADCA_VOL 0x0E +#define CS42L51_ADCB_VOL 0x0F +#define CS42L51_PCMA_VOL 0x10 +#define CS42L51_PCMB_VOL 0x11 +#define CS42L51_MIX_MUTE_ADCMIX (1<<7) +#define CS42L51_MIX_VOLUME(x) (((x)&0x7f)<<0) + +#define CS42L51_BEEP_FREQ 0x12 +#define CS42L51_BEEP_VOL 0x13 +#define CS42L51_BEEP_CONF 0x14 + +#define CS42L51_TONE_CTL 0x15 +#define CS42L51_TONE_CTL_TREB(x) (((x)&0xf)<<4) +#define CS42L51_TONE_CTL_BASS(x) (((x)&0xf)<<0) + +#define CS42L51_AOUTA_VOL 0x16 +#define CS42L51_AOUTB_VOL 0x17 +#define CS42L51_PCM_MIXER 0x18 +#define CS42L51_LIMIT_THRES_DIS 0x19 +#define CS42L51_LIMIT_REL 0x1A +#define CS42L51_LIMIT_ATT 0x1B +#define CS42L51_ALC_EN 0x1C +#define CS42L51_ALC_REL 0x1D +#define CS42L51_ALC_THRES 0x1E +#define CS42L51_NOISE_CONF 0x1F + +#define CS42L51_STATUS 0x20 +#define CS42L51_STATUS_SP_CLKERR (1<<6) +#define CS42L51_STATUS_SPEA_OVFL (1<<5) +#define CS42L51_STATUS_SPEB_OVFL (1<<4) +#define CS42L51_STATUS_PCMA_OVFL (1<<3) +#define CS42L51_STATUS_PCMB_OVFL (1<<2) +#define CS42L51_STATUS_ADCA_OVFL (1<<1) +#define CS42L51_STATUS_ADCB_OVFL (1<<0) + +#define CS42L51_CHARGE_FREQ 0x21 + +#define CS42L51_FIRSTREG 0x01 +/* + * Hack: with register 0x21, it makes 33 registers. Looks like someone in the + * i2c layer doesn't like i2c smbus block read of 33 regs. Workaround by using + * 32 regs + */ +#define CS42L51_LASTREG 0x20 +#define CS42L51_NUMREGS (CS42L51_LASTREG - CS42L51_FIRSTREG + 1) + +extern struct snd_soc_dai cs42l51_dai; +extern struct snd_soc_codec_device soc_codec_device_cs42l51; +#endif -- cgit v1.2.3 From f9b95980f87f021f8c69646738929189838ad035 Mon Sep 17 00:00:00 2001 From: "apatard@mandriva.com" Date: Mon, 31 May 2010 13:49:14 +0200 Subject: ASoC: kirkwood: Add i2s support This patch enables support for the i2s controller available on kirkwood platforms Signed-off-by: Arnaud Patard Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/Kconfig | 1 + sound/soc/Makefile | 1 + sound/soc/kirkwood/Kconfig | 11 + sound/soc/kirkwood/Makefile | 6 + sound/soc/kirkwood/kirkwood-dma.c | 383 ++++++++++++++++++++++++++++++ sound/soc/kirkwood/kirkwood-dma.h | 17 ++ sound/soc/kirkwood/kirkwood-i2s.c | 485 ++++++++++++++++++++++++++++++++++++++ sound/soc/kirkwood/kirkwood-i2s.h | 17 ++ sound/soc/kirkwood/kirkwood.h | 126 ++++++++++ 9 files changed, 1047 insertions(+) create mode 100644 sound/soc/kirkwood/Kconfig create mode 100644 sound/soc/kirkwood/Makefile create mode 100644 sound/soc/kirkwood/kirkwood-dma.c create mode 100644 sound/soc/kirkwood/kirkwood-dma.h create mode 100644 sound/soc/kirkwood/kirkwood-i2s.c create mode 100644 sound/soc/kirkwood/kirkwood-i2s.h create mode 100644 sound/soc/kirkwood/kirkwood.h (limited to 'sound') diff --git a/sound/soc/Kconfig b/sound/soc/Kconfig index 6e04fc2aae4d..5e68ac880832 100644 --- a/sound/soc/Kconfig +++ b/sound/soc/Kconfig @@ -32,6 +32,7 @@ source "sound/soc/fsl/Kconfig" source "sound/soc/imx/Kconfig" source "sound/soc/nuc900/Kconfig" source "sound/soc/omap/Kconfig" +source "sound/soc/kirkwood/Kconfig" source "sound/soc/pxa/Kconfig" source "sound/soc/s3c24xx/Kconfig" source "sound/soc/s6000/Kconfig" diff --git a/sound/soc/Makefile b/sound/soc/Makefile index ccec241488a6..05d5d340968e 100644 --- a/sound/soc/Makefile +++ b/sound/soc/Makefile @@ -10,6 +10,7 @@ obj-$(CONFIG_SND_SOC) += fsl/ obj-$(CONFIG_SND_SOC) += imx/ obj-$(CONFIG_SND_SOC) += nuc900/ obj-$(CONFIG_SND_SOC) += omap/ +obj-$(CONFIG_SND_SOC) += kirkwood/ obj-$(CONFIG_SND_SOC) += pxa/ obj-$(CONFIG_SND_SOC) += s3c24xx/ obj-$(CONFIG_SND_SOC) += s6000/ diff --git a/sound/soc/kirkwood/Kconfig b/sound/soc/kirkwood/Kconfig new file mode 100644 index 000000000000..5e151544cec1 --- /dev/null +++ b/sound/soc/kirkwood/Kconfig @@ -0,0 +1,11 @@ +config SND_KIRKWOOD_SOC + tristate "SoC Audio for the Marvell Kirkwood chip" + depends on ARCH_KIRKWOOD + help + Say Y or M if you want to add support for codecs attached to + the Kirkwood I2S interface. You will also need to select the + audio interfaces to support below. + +config SND_KIRKWOOD_SOC_I2S + tristate + diff --git a/sound/soc/kirkwood/Makefile b/sound/soc/kirkwood/Makefile new file mode 100644 index 000000000000..89dd3e19e159 --- /dev/null +++ b/sound/soc/kirkwood/Makefile @@ -0,0 +1,6 @@ +snd-soc-kirkwood-objs := kirkwood-dma.o +snd-soc-kirkwood-i2s-objs := kirkwood-i2s.o + +obj-$(CONFIG_SND_KIRKWOOD_SOC) += snd-soc-kirkwood.o +obj-$(CONFIG_SND_KIRKWOOD_SOC_I2S) += snd-soc-kirkwood-i2s.o + diff --git a/sound/soc/kirkwood/kirkwood-dma.c b/sound/soc/kirkwood/kirkwood-dma.c new file mode 100644 index 000000000000..a30205be3e2b --- /dev/null +++ b/sound/soc/kirkwood/kirkwood-dma.c @@ -0,0 +1,383 @@ +/* + * kirkwood-dma.c + * + * (c) 2010 Arnaud Patard + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "kirkwood-dma.h" +#include "kirkwood.h" + +#define KIRKWOOD_RATES \ + (SNDRV_PCM_RATE_44100 | \ + SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000) +#define KIRKWOOD_FORMATS \ + (SNDRV_PCM_FMTBIT_S16_LE | \ + SNDRV_PCM_FMTBIT_S24_LE | \ + SNDRV_PCM_FMTBIT_S32_LE) + +struct kirkwood_dma_priv { + struct snd_pcm_substream *play_stream; + struct snd_pcm_substream *rec_stream; + struct kirkwood_dma_data *data; +}; + +static struct snd_pcm_hardware kirkwood_dma_snd_hw = { + .info = (SNDRV_PCM_INFO_INTERLEAVED | + SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_MMAP_VALID | + SNDRV_PCM_INFO_BLOCK_TRANSFER | + SNDRV_PCM_INFO_PAUSE), + .formats = KIRKWOOD_FORMATS, + .rates = KIRKWOOD_RATES, + .rate_min = 44100, + .rate_max = 96000, + .channels_min = 1, + .channels_max = 2, + .buffer_bytes_max = KIRKWOOD_SND_MAX_PERIOD_BYTES * KIRKWOOD_SND_MAX_PERIODS, + .period_bytes_min = KIRKWOOD_SND_MIN_PERIOD_BYTES, + .period_bytes_max = KIRKWOOD_SND_MAX_PERIOD_BYTES, + .periods_min = KIRKWOOD_SND_MIN_PERIODS, + .periods_max = KIRKWOOD_SND_MAX_PERIODS, + .fifo_size = 0, +}; + +static u64 kirkwood_dma_dmamask = 0xFFFFFFFFUL; + +static irqreturn_t kirkwood_dma_irq(int irq, void *dev_id) +{ + struct kirkwood_dma_priv *prdata = dev_id; + struct kirkwood_dma_data *priv = prdata->data; + unsigned long mask, status, cause; + + mask = readl(priv->io + KIRKWOOD_INT_MASK); + status = readl(priv->io + KIRKWOOD_INT_CAUSE) & mask; + + cause = readl(priv->io + KIRKWOOD_ERR_CAUSE); + if (unlikely(cause)) { + printk(KERN_WARNING "%s: got err interrupt 0x%lx\n", + __func__, cause); + writel(cause, priv->io + KIRKWOOD_ERR_CAUSE); + return IRQ_HANDLED; + } + + /* we've enabled only bytes interrupts ... */ + if (status & ~(KIRKWOOD_INT_CAUSE_PLAY_BYTES | \ + KIRKWOOD_INT_CAUSE_REC_BYTES)) { + printk(KERN_WARNING "%s: unexpected interrupt %lx\n", + __func__, status); + return IRQ_NONE; + } + + /* ack int */ + writel(status, priv->io + KIRKWOOD_INT_CAUSE); + + if (status & KIRKWOOD_INT_CAUSE_PLAY_BYTES) + snd_pcm_period_elapsed(prdata->play_stream); + + if (status & KIRKWOOD_INT_CAUSE_REC_BYTES) + snd_pcm_period_elapsed(prdata->rec_stream); + + return IRQ_HANDLED; +} + +static void kirkwood_dma_conf_mbus_windows(void __iomem *base, int win, + unsigned long dma, + struct mbus_dram_target_info *dram) +{ + int i; + + /* First disable and clear windows */ + writel(0, base + KIRKWOOD_AUDIO_WIN_CTRL_REG(win)); + writel(0, base + KIRKWOOD_AUDIO_WIN_BASE_REG(win)); + + /* try to find matching cs for current dma address */ + for (i = 0; i < dram->num_cs; i++) { + struct mbus_dram_window *cs = dram->cs + i; + if ((cs->base & 0xffff0000) < (dma & 0xffff0000)) { + writel(cs->base & 0xffff0000, + base + KIRKWOOD_AUDIO_WIN_BASE_REG(win)); + writel(((cs->size - 1) & 0xffff0000) | + (cs->mbus_attr << 8) | + (dram->mbus_dram_target_id << 4) | 1, + base + KIRKWOOD_AUDIO_WIN_CTRL_REG(win)); + } + } +} + +static int kirkwood_dma_open(struct snd_pcm_substream *substream) +{ + int err; + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; + struct snd_soc_dai *cpu_dai = soc_runtime->dai->cpu_dai; + struct kirkwood_dma_data *priv; + struct kirkwood_dma_priv *prdata = cpu_dai->private_data; + unsigned long addr; + + priv = snd_soc_dai_get_dma_data(cpu_dai, substream); + snd_soc_set_runtime_hwparams(substream, &kirkwood_dma_snd_hw); + + /* Ensure that all constraints linked to dma burst are fullfilled */ + err = snd_pcm_hw_constraint_minmax(runtime, + SNDRV_PCM_HW_PARAM_BUFFER_BYTES, + priv->burst * 2, + KIRKWOOD_AUDIO_BUF_MAX-1); + if (err < 0) + return err; + + err = snd_pcm_hw_constraint_step(runtime, 0, + SNDRV_PCM_HW_PARAM_BUFFER_BYTES, + priv->burst); + if (err < 0) + return err; + + err = snd_pcm_hw_constraint_step(substream->runtime, 0, + SNDRV_PCM_HW_PARAM_PERIOD_BYTES, + priv->burst); + if (err < 0) + return err; + + if (soc_runtime->dai->cpu_dai->private_data == NULL) { + prdata = kzalloc(sizeof(struct kirkwood_dma_priv), GFP_KERNEL); + if (prdata == NULL) + return -ENOMEM; + + prdata->data = priv; + + err = request_irq(priv->irq, kirkwood_dma_irq, IRQF_SHARED, + "kirkwood-i2s", prdata); + if (err) { + kfree(prdata); + return -EBUSY; + } + + soc_runtime->dai->cpu_dai->private_data = prdata; + + /* + * Enable Error interrupts. We're only ack'ing them but + * it's usefull for diagnostics + */ + writel((unsigned long)-1, priv->io + KIRKWOOD_ERR_MASK); + } + + addr = virt_to_phys(substream->dma_buffer.area); + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + prdata->play_stream = substream; + kirkwood_dma_conf_mbus_windows(priv->io, + KIRKWOOD_PLAYBACK_WIN, addr, priv->dram); + } else { + prdata->rec_stream = substream; + kirkwood_dma_conf_mbus_windows(priv->io, + KIRKWOOD_RECORD_WIN, addr, priv->dram); + } + + return 0; +} + +static int kirkwood_dma_close(struct snd_pcm_substream *substream) +{ + struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; + struct snd_soc_dai *cpu_dai = soc_runtime->dai->cpu_dai; + struct kirkwood_dma_priv *prdata = cpu_dai->private_data; + struct kirkwood_dma_data *priv; + + priv = snd_soc_dai_get_dma_data(cpu_dai, substream); + + if (!prdata || !priv) + return 0; + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + prdata->play_stream = NULL; + else + prdata->rec_stream = NULL; + + if (!prdata->play_stream && !prdata->rec_stream) { + writel(0, priv->io + KIRKWOOD_ERR_MASK); + free_irq(priv->irq, prdata); + kfree(prdata); + soc_runtime->dai->cpu_dai->private_data = NULL; + } + + return 0; +} + +static int kirkwood_dma_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + + snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); + runtime->dma_bytes = params_buffer_bytes(params); + + return 0; +} + +static int kirkwood_dma_hw_free(struct snd_pcm_substream *substream) +{ + snd_pcm_set_runtime_buffer(substream, NULL); + return 0; +} + +static int kirkwood_dma_prepare(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; + struct snd_soc_dai *cpu_dai = soc_runtime->dai->cpu_dai; + struct kirkwood_dma_data *priv; + unsigned long size, count; + + priv = snd_soc_dai_get_dma_data(cpu_dai, substream); + + /* compute buffer size in term of "words" as requested in specs */ + size = frames_to_bytes(runtime, runtime->buffer_size); + size = (size>>2)-1; + count = snd_pcm_lib_period_bytes(substream); + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + writel(count, priv->io + KIRKWOOD_PLAY_BYTE_INT_COUNT); + writel(runtime->dma_addr, priv->io + KIRKWOOD_PLAY_BUF_ADDR); + writel(size, priv->io + KIRKWOOD_PLAY_BUF_SIZE); + } else { + writel(count, priv->io + KIRKWOOD_REC_BYTE_INT_COUNT); + writel(runtime->dma_addr, priv->io + KIRKWOOD_REC_BUF_ADDR); + writel(size, priv->io + KIRKWOOD_REC_BUF_SIZE); + } + + + return 0; +} + +static snd_pcm_uframes_t kirkwood_dma_pointer(struct snd_pcm_substream + *substream) +{ + struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; + struct snd_soc_dai *cpu_dai = soc_runtime->dai->cpu_dai; + struct kirkwood_dma_data *priv; + snd_pcm_uframes_t count; + + priv = snd_soc_dai_get_dma_data(cpu_dai, substream); + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + count = bytes_to_frames(substream->runtime, + readl(priv->io + KIRKWOOD_PLAY_BYTE_COUNT)); + else + count = bytes_to_frames(substream->runtime, + readl(priv->io + KIRKWOOD_REC_BYTE_COUNT)); + + return count; +} + +struct snd_pcm_ops kirkwood_dma_ops = { + .open = kirkwood_dma_open, + .close = kirkwood_dma_close, + .ioctl = snd_pcm_lib_ioctl, + .hw_params = kirkwood_dma_hw_params, + .hw_free = kirkwood_dma_hw_free, + .prepare = kirkwood_dma_prepare, + .pointer = kirkwood_dma_pointer, +}; + +static int kirkwood_dma_preallocate_dma_buffer(struct snd_pcm *pcm, + int stream) +{ + struct snd_pcm_substream *substream = pcm->streams[stream].substream; + struct snd_dma_buffer *buf = &substream->dma_buffer; + size_t size = kirkwood_dma_snd_hw.buffer_bytes_max; + + buf->dev.type = SNDRV_DMA_TYPE_DEV; + buf->dev.dev = pcm->card->dev; + buf->area = dma_alloc_coherent(pcm->card->dev, size, + &buf->addr, GFP_KERNEL); + if (!buf->area) + return -ENOMEM; + buf->bytes = size; + buf->private_data = NULL; + + return 0; +} + +static int kirkwood_dma_new(struct snd_card *card, + struct snd_soc_dai *dai, struct snd_pcm *pcm) +{ + int ret; + + if (!card->dev->dma_mask) + card->dev->dma_mask = &kirkwood_dma_dmamask; + if (!card->dev->coherent_dma_mask) + card->dev->coherent_dma_mask = 0xffffffff; + + if (dai->playback.channels_min) { + ret = kirkwood_dma_preallocate_dma_buffer(pcm, + SNDRV_PCM_STREAM_PLAYBACK); + if (ret) + return ret; + } + + if (dai->capture.channels_min) { + ret = kirkwood_dma_preallocate_dma_buffer(pcm, + SNDRV_PCM_STREAM_CAPTURE); + if (ret) + return ret; + } + + return 0; +} + +static void kirkwood_dma_free_dma_buffers(struct snd_pcm *pcm) +{ + struct snd_pcm_substream *substream; + struct snd_dma_buffer *buf; + int stream; + + for (stream = 0; stream < 2; stream++) { + substream = pcm->streams[stream].substream; + if (!substream) + continue; + buf = &substream->dma_buffer; + if (!buf->area) + continue; + + dma_free_coherent(pcm->card->dev, buf->bytes, + buf->area, buf->addr); + buf->area = NULL; + } +} + +struct snd_soc_platform kirkwood_soc_platform = { + .name = "kirkwood-dma", + .pcm_ops = &kirkwood_dma_ops, + .pcm_new = kirkwood_dma_new, + .pcm_free = kirkwood_dma_free_dma_buffers, +}; +EXPORT_SYMBOL_GPL(kirkwood_soc_platform); + +static int __init kirkwood_soc_platform_init(void) +{ + return snd_soc_register_platform(&kirkwood_soc_platform); +} +module_init(kirkwood_soc_platform_init); + +static void __exit kirkwood_soc_platform_exit(void) +{ + snd_soc_unregister_platform(&kirkwood_soc_platform); +} +module_exit(kirkwood_soc_platform_exit); + +MODULE_AUTHOR("Arnaud Patard "); +MODULE_DESCRIPTION("Marvell Kirkwood Audio DMA module"); +MODULE_LICENSE("GPL"); + diff --git a/sound/soc/kirkwood/kirkwood-dma.h b/sound/soc/kirkwood/kirkwood-dma.h new file mode 100644 index 000000000000..ba4454cd34f1 --- /dev/null +++ b/sound/soc/kirkwood/kirkwood-dma.h @@ -0,0 +1,17 @@ +/* + * kirkwood-dma.h + * + * (c) 2010 Arnaud Patard + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#ifndef _KIRKWOOD_DMA_H +#define _KIRKWOOD_DMA_H + +extern struct snd_soc_platform kirkwood_soc_platform; + +#endif diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c new file mode 100644 index 000000000000..0adc59778d5a --- /dev/null +++ b/sound/soc/kirkwood/kirkwood-i2s.c @@ -0,0 +1,485 @@ +/* + * kirkwood-i2s.c + * + * (c) 2010 Arnaud Patard + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "kirkwood-i2s.h" +#include "kirkwood.h" + +#define DRV_NAME "kirkwood-i2s" + +#define KIRKWOOD_I2S_RATES \ + (SNDRV_PCM_RATE_44100 | \ + SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000) +#define KIRKWOOD_I2S_FORMATS \ + (SNDRV_PCM_FMTBIT_S16_LE | \ + SNDRV_PCM_FMTBIT_S24_LE | \ + SNDRV_PCM_FMTBIT_S32_LE) + + +struct snd_soc_dai kirkwood_i2s_dai; +static struct kirkwood_dma_data *priv; + +static int kirkwood_i2s_set_fmt(struct snd_soc_dai *cpu_dai, + unsigned int fmt) +{ + unsigned long mask; + unsigned long value; + + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_RIGHT_J: + mask = KIRKWOOD_I2S_CTL_RJ; + break; + case SND_SOC_DAIFMT_LEFT_J: + mask = KIRKWOOD_I2S_CTL_LJ; + break; + case SND_SOC_DAIFMT_I2S: + mask = KIRKWOOD_I2S_CTL_I2S; + break; + default: + return -EINVAL; + } + + /* + * Set same format for playback and record + * This avoids some troubles. + */ + value = readl(priv->io+KIRKWOOD_I2S_PLAYCTL); + value &= ~KIRKWOOD_I2S_CTL_JUST_MASK; + value |= mask; + writel(value, priv->io+KIRKWOOD_I2S_PLAYCTL); + + value = readl(priv->io+KIRKWOOD_I2S_RECCTL); + value &= ~KIRKWOOD_I2S_CTL_JUST_MASK; + value |= mask; + writel(value, priv->io+KIRKWOOD_I2S_RECCTL); + + return 0; +} + +static inline void kirkwood_set_dco(void __iomem *io, unsigned long rate) +{ + unsigned long value; + + value = KIRKWOOD_DCO_CTL_OFFSET_0; + switch (rate) { + default: + case 44100: + value |= KIRKWOOD_DCO_CTL_FREQ_11; + break; + case 48000: + value |= KIRKWOOD_DCO_CTL_FREQ_12; + break; + case 96000: + value |= KIRKWOOD_DCO_CTL_FREQ_24; + break; + } + writel(value, io + KIRKWOOD_DCO_CTL); + + /* wait for dco locked */ + do { + cpu_relax(); + value = readl(io + KIRKWOOD_DCO_SPCR_STATUS); + value &= KIRKWOOD_DCO_SPCR_STATUS; + } while (value == 0); +} + +static int kirkwood_i2s_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + unsigned int i2s_reg, reg; + unsigned long i2s_value, value; + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + i2s_reg = KIRKWOOD_I2S_PLAYCTL; + reg = KIRKWOOD_PLAYCTL; + } else { + i2s_reg = KIRKWOOD_I2S_RECCTL; + reg = KIRKWOOD_RECCTL; + } + + /* set dco conf */ + kirkwood_set_dco(priv->io, params_rate(params)); + + i2s_value = readl(priv->io+i2s_reg); + i2s_value &= ~KIRKWOOD_I2S_CTL_SIZE_MASK; + + value = readl(priv->io+reg); + value &= ~KIRKWOOD_PLAYCTL_SIZE_MASK; + + /* + * Size settings in play/rec i2s control regs and play/rec control + * regs must be the same. + */ + switch (params_format(params)) { + case SNDRV_PCM_FORMAT_S16_LE: + i2s_value |= KIRKWOOD_I2S_CTL_SIZE_16; + value |= KIRKWOOD_PLAYCTL_SIZE_16_C; + break; + /* + * doesn't work... S20_3LE != kirkwood 20bit format ? + * + case SNDRV_PCM_FORMAT_S20_3LE: + i2s_value |= KIRKWOOD_I2S_CTL_SIZE_20; + value |= KIRKWOOD_PLAYCTL_SIZE_20; + break; + */ + case SNDRV_PCM_FORMAT_S24_LE: + i2s_value |= KIRKWOOD_I2S_CTL_SIZE_24; + value |= KIRKWOOD_PLAYCTL_SIZE_24; + break; + case SNDRV_PCM_FORMAT_S32_LE: + i2s_value |= KIRKWOOD_I2S_CTL_SIZE_32; + value |= KIRKWOOD_PLAYCTL_SIZE_32; + break; + default: + return -EINVAL; + } + writel(i2s_value, priv->io+i2s_reg); + writel(value, priv->io+reg); + + return 0; +} + +static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream, + int cmd, struct snd_soc_dai *dai) +{ + unsigned long value; + + /* + * specs says KIRKWOOD_PLAYCTL must be read 2 times before + * changing it. So read 1 time here and 1 later. + */ + value = readl(priv->io + KIRKWOOD_PLAYCTL); + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + /* stop audio, enable interrupts */ + value = readl(priv->io + KIRKWOOD_PLAYCTL); + value |= KIRKWOOD_PLAYCTL_PAUSE; + writel(value, priv->io + KIRKWOOD_PLAYCTL); + + value = readl(priv->io + KIRKWOOD_INT_MASK); + value |= KIRKWOOD_INT_CAUSE_PLAY_BYTES; + writel(value, priv->io + KIRKWOOD_INT_MASK); + + /* configure audio & enable i2s playback */ + value = readl(priv->io + KIRKWOOD_PLAYCTL); + value &= ~KIRKWOOD_PLAYCTL_BURST_MASK; + value &= ~(KIRKWOOD_PLAYCTL_PAUSE|KIRKWOOD_PLAYCTL_SPDIF_EN); + + if (priv->burst == 32) + value |= KIRKWOOD_PLAYCTL_BURST_32; + else + value |= KIRKWOOD_PLAYCTL_BURST_128; + value |= KIRKWOOD_PLAYCTL_I2S_EN; + writel(value, priv->io + KIRKWOOD_PLAYCTL); + break; + + case SNDRV_PCM_TRIGGER_STOP: + /* stop audio, disable interrupts */ + value = readl(priv->io + KIRKWOOD_PLAYCTL); + value |= KIRKWOOD_PLAYCTL_PAUSE; + writel(value, priv->io + KIRKWOOD_PLAYCTL); + + value = readl(priv->io + KIRKWOOD_INT_MASK); + value &= ~KIRKWOOD_INT_CAUSE_PLAY_BYTES; + writel(value, priv->io + KIRKWOOD_INT_MASK); + + /* disable all playbacks */ + value = readl(priv->io + KIRKWOOD_PLAYCTL); + value &= ~(KIRKWOOD_PLAYCTL_I2S_EN | KIRKWOOD_PLAYCTL_SPDIF_EN); + writel(value, priv->io + KIRKWOOD_PLAYCTL); + break; + + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + case SNDRV_PCM_TRIGGER_SUSPEND: + value = readl(priv->io + KIRKWOOD_PLAYCTL); + value |= KIRKWOOD_PLAYCTL_PAUSE; + writel(value, priv->io + KIRKWOOD_PLAYCTL); + break; + + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + value = readl(priv->io + KIRKWOOD_PLAYCTL); + value &= ~KIRKWOOD_PLAYCTL_PAUSE; + writel(value, priv->io + KIRKWOOD_PLAYCTL); + break; + + default: + return -EINVAL; + } + + return 0; +} + +static int kirkwood_i2s_rec_trigger(struct snd_pcm_substream *substream, + int cmd, struct snd_soc_dai *dai) +{ + unsigned long value; + + value = readl(priv->io + KIRKWOOD_RECCTL); + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + /* stop audio, enable interrupts */ + value = readl(priv->io + KIRKWOOD_RECCTL); + value |= KIRKWOOD_RECCTL_PAUSE; + writel(value, priv->io + KIRKWOOD_RECCTL); + + value = readl(priv->io + KIRKWOOD_INT_MASK); + value |= KIRKWOOD_INT_CAUSE_REC_BYTES; + writel(value, priv->io + KIRKWOOD_INT_MASK); + + /* configure audio & enable i2s record */ + value = readl(priv->io + KIRKWOOD_RECCTL); + value &= ~KIRKWOOD_RECCTL_BURST_MASK; + value &= ~KIRKWOOD_RECCTL_MONO; + value &= ~(KIRKWOOD_RECCTL_PAUSE | KIRKWOOD_RECCTL_SPDIF_EN); + + if (priv->burst == 32) + value |= KIRKWOOD_RECCTL_BURST_32; + else + value |= KIRKWOOD_RECCTL_BURST_128; + value |= KIRKWOOD_RECCTL_I2S_EN; + + writel(value, priv->io + KIRKWOOD_RECCTL); + break; + + case SNDRV_PCM_TRIGGER_STOP: + /* stop audio, disable interrupts */ + value = readl(priv->io + KIRKWOOD_RECCTL); + value |= KIRKWOOD_RECCTL_PAUSE; + writel(value, priv->io + KIRKWOOD_RECCTL); + + value = readl(priv->io + KIRKWOOD_INT_MASK); + value &= ~KIRKWOOD_INT_CAUSE_REC_BYTES; + writel(value, priv->io + KIRKWOOD_INT_MASK); + + /* disable all records */ + value = readl(priv->io + KIRKWOOD_RECCTL); + value &= ~(KIRKWOOD_RECCTL_I2S_EN | KIRKWOOD_RECCTL_SPDIF_EN); + writel(value, priv->io + KIRKWOOD_RECCTL); + break; + + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + case SNDRV_PCM_TRIGGER_SUSPEND: + value = readl(priv->io + KIRKWOOD_RECCTL); + value |= KIRKWOOD_RECCTL_PAUSE; + writel(value, priv->io + KIRKWOOD_RECCTL); + break; + + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + value = readl(priv->io + KIRKWOOD_RECCTL); + value &= ~KIRKWOOD_RECCTL_PAUSE; + writel(value, priv->io + KIRKWOOD_RECCTL); + break; + + default: + return -EINVAL; + break; + } + + return 0; +} + +static int kirkwood_i2s_trigger(struct snd_pcm_substream *substream, int cmd, + struct snd_soc_dai *dai) +{ + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + return kirkwood_i2s_play_trigger(substream, cmd, dai); + else + return kirkwood_i2s_rec_trigger(substream, cmd, dai); + + return 0; +} + +static int kirkwood_i2s_probe(struct platform_device *pdev, + struct snd_soc_dai *dai) +{ + unsigned long value; + unsigned int reg_data; + + /* put system in a "safe" state : */ + /* disable audio interrupts */ + writel(0xffffffff, priv->io + KIRKWOOD_INT_CAUSE); + writel(0, priv->io + KIRKWOOD_INT_MASK); + + reg_data = readl(priv->io + 0x1200); + reg_data &= (~(0x333FF8)); + reg_data |= 0x111D18; + writel(reg_data, priv->io + 0x1200); + + msleep(500); + + reg_data = readl(priv->io + 0x1200); + reg_data &= (~(0x333FF8)); + reg_data |= 0x111D18; + writel(reg_data, priv->io + 0x1200); + + /* disable playback/record */ + value = readl(priv->io + KIRKWOOD_PLAYCTL); + value &= ~(KIRKWOOD_PLAYCTL_I2S_EN|KIRKWOOD_PLAYCTL_SPDIF_EN); + writel(value, priv->io + KIRKWOOD_PLAYCTL); + + value = readl(priv->io + KIRKWOOD_RECCTL); + value &= ~(KIRKWOOD_RECCTL_I2S_EN | KIRKWOOD_RECCTL_SPDIF_EN); + writel(value, priv->io + KIRKWOOD_RECCTL); + + return 0; + +} + +static void kirkwood_i2s_remove(struct platform_device *pdev, + struct snd_soc_dai *dai) +{ +} + +static struct snd_soc_dai_ops kirkwood_i2s_dai_ops = { + .trigger = kirkwood_i2s_trigger, + .hw_params = kirkwood_i2s_hw_params, + .set_fmt = kirkwood_i2s_set_fmt, +}; + + +struct snd_soc_dai kirkwood_i2s_dai = { + .name = DRV_NAME, + .id = 0, + .probe = kirkwood_i2s_probe, + .remove = kirkwood_i2s_remove, + .playback = { + .channels_min = 1, + .channels_max = 2, + .rates = KIRKWOOD_I2S_RATES, + .formats = KIRKWOOD_I2S_FORMATS,}, + .capture = { + .channels_min = 1, + .channels_max = 2, + .rates = KIRKWOOD_I2S_RATES, + .formats = KIRKWOOD_I2S_FORMATS,}, + .ops = &kirkwood_i2s_dai_ops, +}; +EXPORT_SYMBOL_GPL(kirkwood_i2s_dai); + +static __devinit int kirkwood_i2s_dev_probe(struct platform_device *pdev) +{ + struct resource *mem; + struct kirkwood_asoc_platform_data *data = + pdev->dev.platform_data; + int err; + + priv = kzalloc(sizeof(struct kirkwood_dma_data), GFP_KERNEL); + if (!priv) { + dev_err(&pdev->dev, "allocation failed\n"); + err = -ENOMEM; + goto error; + } + + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!mem) { + dev_err(&pdev->dev, "platform_get_resource failed\n"); + err = -ENXIO; + goto err_alloc; + } + + priv->mem = request_mem_region(mem->start, SZ_16K, DRV_NAME); + if (!priv->mem) { + dev_err(&pdev->dev, "request_mem_region failed\n"); + err = -EBUSY; + goto error; + } + + priv->io = ioremap(priv->mem->start, SZ_16K); + if (!priv->io) { + dev_err(&pdev->dev, "ioremap failed\n"); + err = -ENOMEM; + goto err_iomem; + } + + priv->irq = platform_get_irq(pdev, 0); + if (priv->irq <= 0) { + dev_err(&pdev->dev, "platform_get_irq failed\n"); + err = -ENXIO; + goto err_ioremap; + } + + if (!data || !data->dram) { + dev_err(&pdev->dev, "no platform data ?!\n"); + err = -EINVAL; + goto err_ioremap; + } + + priv->dram = data->dram; + priv->burst = data->burst; + + kirkwood_i2s_dai.capture.dma_data = priv; + kirkwood_i2s_dai.playback.dma_data = priv; + + return snd_soc_register_dai(&kirkwood_i2s_dai); + +err_ioremap: + iounmap(priv->io); +err_iomem: + release_mem_region(priv->mem->start, SZ_16K); +err_alloc: + kfree(priv); +error: + return err; +} + +static __devexit int kirkwood_i2s_dev_remove(struct platform_device *pdev) +{ + if (priv) { + iounmap(priv->io); + release_mem_region(priv->mem->start, SZ_16K); + kfree(priv); + } + snd_soc_unregister_dai(&kirkwood_i2s_dai); + return 0; +} + +static struct platform_driver kirkwood_i2s_driver = { + .probe = kirkwood_i2s_dev_probe, + .remove = kirkwood_i2s_dev_remove, + .driver = { + .name = DRV_NAME, + .owner = THIS_MODULE, + }, +}; + +static int __init kirkwood_i2s_init(void) +{ + return platform_driver_register(&kirkwood_i2s_driver); +} +module_init(kirkwood_i2s_init); + +static void __exit kirkwood_i2s_exit(void) +{ + platform_driver_unregister(&kirkwood_i2s_driver); +} +module_exit(kirkwood_i2s_exit); + +/* Module information */ +MODULE_AUTHOR("Arnaud Patard, "); +MODULE_DESCRIPTION("Kirkwood I2S SoC Interface"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:kirkwood-i2s"); diff --git a/sound/soc/kirkwood/kirkwood-i2s.h b/sound/soc/kirkwood/kirkwood-i2s.h new file mode 100644 index 000000000000..c5595c616d7a --- /dev/null +++ b/sound/soc/kirkwood/kirkwood-i2s.h @@ -0,0 +1,17 @@ +/* + * kirkwood-i2s.h + * + * (c) 2010 Arnaud Patard + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#ifndef _KIRKWOOD_I2S_H +#define _KIRKWOOD_I2S_H + +extern struct snd_soc_dai kirkwood_i2s_dai; + +#endif diff --git a/sound/soc/kirkwood/kirkwood.h b/sound/soc/kirkwood/kirkwood.h new file mode 100644 index 000000000000..b6e4f68d71dd --- /dev/null +++ b/sound/soc/kirkwood/kirkwood.h @@ -0,0 +1,126 @@ +/* + * kirkwood.h + * + * (c) 2010 Arnaud Patard + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#ifndef _KIRKWOOD_AUDIO_H +#define _KIRKWOOD_AUDIO_H + +#define KIRKWOOD_RECORD_WIN 0 +#define KIRKWOOD_PLAYBACK_WIN 1 +#define KIRKWOOD_MAX_AUDIO_WIN 2 + +#define KIRKWOOD_AUDIO_WIN_BASE_REG(win) (0xA00 + ((win)<<3)) +#define KIRKWOOD_AUDIO_WIN_CTRL_REG(win) (0xA04 + ((win)<<3)) + + +#define KIRKWOOD_RECCTL 0x1000 +#define KIRKWOOD_RECCTL_SPDIF_EN (1<<11) +#define KIRKWOOD_RECCTL_I2S_EN (1<<10) +#define KIRKWOOD_RECCTL_PAUSE (1<<9) +#define KIRKWOOD_RECCTL_MUTE (1<<8) +#define KIRKWOOD_RECCTL_BURST_MASK (3<<5) +#define KIRKWOOD_RECCTL_BURST_128 (2<<5) +#define KIRKWOOD_RECCTL_BURST_32 (1<<5) +#define KIRKWOOD_RECCTL_MONO (1<<4) +#define KIRKWOOD_RECCTL_MONO_CHAN_RIGHT (1<<3) +#define KIRKWOOD_RECCTL_MONO_CHAN_LEFT (0<<3) +#define KIRKWOOD_RECCTL_SIZE_MASK (7<<0) +#define KIRKWOOD_RECCTL_SIZE_16 (7<<0) +#define KIRKWOOD_RECCTL_SIZE_16_C (3<<0) +#define KIRKWOOD_RECCTL_SIZE_20 (2<<0) +#define KIRKWOOD_RECCTL_SIZE_24 (1<<0) +#define KIRKWOOD_RECCTL_SIZE_32 (0<<0) + +#define KIRKWOOD_REC_BUF_ADDR 0x1004 +#define KIRKWOOD_REC_BUF_SIZE 0x1008 +#define KIRKWOOD_REC_BYTE_COUNT 0x100C + +#define KIRKWOOD_PLAYCTL 0x1100 +#define KIRKWOOD_PLAYCTL_PLAY_BUSY (1<<16) +#define KIRKWOOD_PLAYCTL_BURST_MASK (3<<11) +#define KIRKWOOD_PLAYCTL_BURST_128 (2<<11) +#define KIRKWOOD_PLAYCTL_BURST_32 (1<<11) +#define KIRKWOOD_PLAYCTL_PAUSE (1<<9) +#define KIRKWOOD_PLAYCTL_SPDIF_MUTE (1<<8) +#define KIRKWOOD_PLAYCTL_I2S_MUTE (1<<7) +#define KIRKWOOD_PLAYCTL_SPDIF_EN (1<<4) +#define KIRKWOOD_PLAYCTL_I2S_EN (1<<3) +#define KIRKWOOD_PLAYCTL_SIZE_MASK (7<<0) +#define KIRKWOOD_PLAYCTL_SIZE_16 (7<<0) +#define KIRKWOOD_PLAYCTL_SIZE_16_C (3<<0) +#define KIRKWOOD_PLAYCTL_SIZE_20 (2<<0) +#define KIRKWOOD_PLAYCTL_SIZE_24 (1<<0) +#define KIRKWOOD_PLAYCTL_SIZE_32 (0<<0) + +#define KIRKWOOD_PLAY_BUF_ADDR 0x1104 +#define KIRKWOOD_PLAY_BUF_SIZE 0x1108 +#define KIRKWOOD_PLAY_BYTE_COUNT 0x110C + +#define KIRKWOOD_DCO_CTL 0x1204 +#define KIRKWOOD_DCO_CTL_OFFSET_MASK (0xFFF<<2) +#define KIRKWOOD_DCO_CTL_OFFSET_0 (0x800<<2) +#define KIRKWOOD_DCO_CTL_FREQ_MASK (3<<0) +#define KIRKWOOD_DCO_CTL_FREQ_11 (0<<0) +#define KIRKWOOD_DCO_CTL_FREQ_12 (1<<0) +#define KIRKWOOD_DCO_CTL_FREQ_24 (2<<0) + +#define KIRKWOOD_DCO_SPCR_STATUS 0x120c +#define KIRKWOOD_DCO_SPCR_STATUS_DCO_LOCK (1<<16) + +#define KIRKWOOD_ERR_CAUSE 0x1300 +#define KIRKWOOD_ERR_MASK 0x1304 + +#define KIRKWOOD_INT_CAUSE 0x1308 +#define KIRKWOOD_INT_MASK 0x130C +#define KIRKWOOD_INT_CAUSE_PLAY_BYTES (1<<14) +#define KIRKWOOD_INT_CAUSE_REC_BYTES (1<<13) +#define KIRKWOOD_INT_CAUSE_DMA_PLAY_END (1<<7) +#define KIRKWOOD_INT_CAUSE_DMA_PLAY_3Q (1<<6) +#define KIRKWOOD_INT_CAUSE_DMA_PLAY_HALF (1<<5) +#define KIRKWOOD_INT_CAUSE_DMA_PLAY_1Q (1<<4) +#define KIRKWOOD_INT_CAUSE_DMA_REC_END (1<<3) +#define KIRKWOOD_INT_CAUSE_DMA_REC_3Q (1<<2) +#define KIRKWOOD_INT_CAUSE_DMA_REC_HALF (1<<1) +#define KIRKWOOD_INT_CAUSE_DMA_REC_1Q (1<<0) + +#define KIRKWOOD_REC_BYTE_INT_COUNT 0x1310 +#define KIRKWOOD_PLAY_BYTE_INT_COUNT 0x1314 +#define KIRKWOOD_BYTE_INT_COUNT_MASK 0xffffff + +#define KIRKWOOD_I2S_PLAYCTL 0x2508 +#define KIRKWOOD_I2S_RECCTL 0x2408 +#define KIRKWOOD_I2S_CTL_JUST_MASK (0xf<<26) +#define KIRKWOOD_I2S_CTL_LJ (0<<26) +#define KIRKWOOD_I2S_CTL_I2S (5<<26) +#define KIRKWOOD_I2S_CTL_RJ (8<<26) +#define KIRKWOOD_I2S_CTL_SIZE_MASK (3<<30) +#define KIRKWOOD_I2S_CTL_SIZE_16 (3<<30) +#define KIRKWOOD_I2S_CTL_SIZE_20 (2<<30) +#define KIRKWOOD_I2S_CTL_SIZE_24 (1<<30) +#define KIRKWOOD_I2S_CTL_SIZE_32 (0<<30) + +#define KIRKWOOD_AUDIO_BUF_MAX (16*1024*1024) + +/* Theses values come from the marvell alsa driver */ +/* need to find where they come from */ +#define KIRKWOOD_SND_MIN_PERIODS 8 +#define KIRKWOOD_SND_MAX_PERIODS 16 +#define KIRKWOOD_SND_MIN_PERIOD_BYTES 0x4000 +#define KIRKWOOD_SND_MAX_PERIOD_BYTES 0x4000 + +struct kirkwood_dma_data { + struct resource *mem; + void __iomem *io; + int irq; + int burst; + struct mbus_dram_target_info *dram; +}; + +#endif -- cgit v1.2.3 From 2e8693ee79ff316add7d78964900af2312158d13 Mon Sep 17 00:00:00 2001 From: "apatard@mandriva.com" Date: Mon, 31 May 2010 13:49:15 +0200 Subject: ASoC: kirkwood: Add audio support to openrd client platforms This patch is adding support for openrd client platforms. It's using the cs42l51 codec and has one mic and one speaker plugs. Signed-off-by: Arnaud Patard Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/kirkwood/Kconfig | 9 +++ sound/soc/kirkwood/Makefile | 3 + sound/soc/kirkwood/kirkwood-openrd.c | 126 +++++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 sound/soc/kirkwood/kirkwood-openrd.c (limited to 'sound') diff --git a/sound/soc/kirkwood/Kconfig b/sound/soc/kirkwood/Kconfig index 5e151544cec1..16ec2a2dba4d 100644 --- a/sound/soc/kirkwood/Kconfig +++ b/sound/soc/kirkwood/Kconfig @@ -9,3 +9,12 @@ config SND_KIRKWOOD_SOC config SND_KIRKWOOD_SOC_I2S tristate +config SND_KIRKWOOD_SOC_OPENRD + tristate "SoC Audio support for Kirkwood Openrd Client" + depends on SND_KIRKWOOD_SOC && MACH_OPENRD_CLIENT + select SND_KIRKWOOD_SOC_I2S + select SND_SOC_CS42L51 + help + Say Y if you want to add support for SoC audio on + Openrd Client. + diff --git a/sound/soc/kirkwood/Makefile b/sound/soc/kirkwood/Makefile index 89dd3e19e159..33a16dcab5b5 100644 --- a/sound/soc/kirkwood/Makefile +++ b/sound/soc/kirkwood/Makefile @@ -4,3 +4,6 @@ snd-soc-kirkwood-i2s-objs := kirkwood-i2s.o obj-$(CONFIG_SND_KIRKWOOD_SOC) += snd-soc-kirkwood.o obj-$(CONFIG_SND_KIRKWOOD_SOC_I2S) += snd-soc-kirkwood-i2s.o +snd-soc-openrd-objs := kirkwood-openrd.o + +obj-$(CONFIG_SND_KIRKWOOD_SOC_OPENRD) += snd-soc-openrd.o diff --git a/sound/soc/kirkwood/kirkwood-openrd.c b/sound/soc/kirkwood/kirkwood-openrd.c new file mode 100644 index 000000000000..0353d06bc41a --- /dev/null +++ b/sound/soc/kirkwood/kirkwood-openrd.c @@ -0,0 +1,126 @@ +/* + * kirkwood-openrd.c + * + * (c) 2010 Arnaud Patard + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "kirkwood-i2s.h" +#include "kirkwood-dma.h" +#include "../codecs/cs42l51.h" + +static int openrd_client_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + int ret; + unsigned int freq, fmt; + + fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS; + ret = snd_soc_dai_set_fmt(cpu_dai, fmt); + if (ret < 0) + return ret; + + ret = snd_soc_dai_set_fmt(codec_dai, fmt); + if (ret < 0) + return ret; + + switch (params_rate(params)) { + default: + case 44100: + freq = 11289600; + break; + case 48000: + freq = 12288000; + break; + case 96000: + freq = 24576000; + break; + } + + return snd_soc_dai_set_sysclk(codec_dai, 0, freq, SND_SOC_CLOCK_IN); + +} + +static struct snd_soc_ops openrd_client_ops = { + .hw_params = openrd_client_hw_params, +}; + + +static struct snd_soc_dai_link openrd_client_dai[] = { +{ + .name = "CS42L51", + .stream_name = "CS42L51 HiFi", + .cpu_dai = &kirkwood_i2s_dai, + .codec_dai = &cs42l51_dai, + .ops = &openrd_client_ops, +}, +}; + + +static struct snd_soc_card openrd_client = { + .name = "OpenRD Client", + .platform = &kirkwood_soc_platform, + .dai_link = openrd_client_dai, + .num_links = ARRAY_SIZE(openrd_client_dai), +}; + +static struct snd_soc_device openrd_client_snd_devdata = { + .card = &openrd_client, + .codec_dev = &soc_codec_device_cs42l51, +}; + +static struct platform_device *openrd_client_snd_device; + +static int __init openrd_client_init(void) +{ + int ret; + + if (!machine_is_openrd_client()) + return 0; + + openrd_client_snd_device = platform_device_alloc("soc-audio", -1); + if (!openrd_client_snd_device) + return -ENOMEM; + + platform_set_drvdata(openrd_client_snd_device, + &openrd_client_snd_devdata); + openrd_client_snd_devdata.dev = &openrd_client_snd_device->dev; + + ret = platform_device_add(openrd_client_snd_device); + if (ret) { + printk(KERN_ERR "%s: platform_device_add failed\n", __func__); + platform_device_put(openrd_client_snd_device); + } + + return ret; +} + +static void __exit openrd_client_exit(void) +{ + platform_device_unregister(openrd_client_snd_device); +} + +module_init(openrd_client_init); +module_exit(openrd_client_exit); + +/* Module information */ +MODULE_AUTHOR("Arnaud Patard "); +MODULE_DESCRIPTION("ALSA SoC OpenRD Client"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:soc-audio"); -- cgit v1.2.3 From 37a5ddf450f21577fd8335d24e23ae1b4ca3d309 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Mon, 31 May 2010 13:47:26 +0100 Subject: ASoC: Fix S/PDIF build Signed-off-by: Mark Brown --- sound/soc/codecs/spdif_transciever.c | 1 + sound/soc/codecs/spdif_transciever.h | 1 + 2 files changed, 2 insertions(+) (limited to 'sound') diff --git a/sound/soc/codecs/spdif_transciever.c b/sound/soc/codecs/spdif_transciever.c index f0945ab2002e..9119836051a4 100644 --- a/sound/soc/codecs/spdif_transciever.c +++ b/sound/soc/codecs/spdif_transciever.c @@ -16,6 +16,7 @@ #include #include +#include #include #include #include diff --git a/sound/soc/codecs/spdif_transciever.h b/sound/soc/codecs/spdif_transciever.h index 296f2eb6c4ef..1e102124f546 100644 --- a/sound/soc/codecs/spdif_transciever.h +++ b/sound/soc/codecs/spdif_transciever.h @@ -12,6 +12,7 @@ #ifndef CODEC_STUBS_H #define CODEC_STUBS_H +extern struct snd_soc_codec_device soc_codec_dev_spdif_dit; extern struct snd_soc_dai dit_stub_dai; #endif /* CODEC_STUBS_H */ -- cgit v1.2.3 From 018334c045c95793ab58948fe1f63282459c4f8d Mon Sep 17 00:00:00 2001 From: Wan ZongShun Date: Wed, 2 Jun 2010 13:54:25 +0800 Subject: ASoC: nuc900: patch for SUBSTREAM_TYPE', 'PCM_TX' and 'PCM_RX' removal This patch is to remove the 'SUBSTREAM_TYPE','PCM_TX' and 'PCM_RX' definition. There is no need to redefine SNDRV_PCM_STREAM_PLAYBACK as PCM_TX, the SUBSTREAM_TYPE(substream) can be deleted too, the playback or record can be judged by 'if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)' directly rather than 'if (PCM_TX == stype)', which makes the codes easy to read. Signed-off-by: Wan ZongShun Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/nuc900/nuc900-ac97.c | 6 +++--- sound/soc/nuc900/nuc900-auido.h | 4 ---- sound/soc/nuc900/nuc900-pcm.c | 18 ++++++++++-------- 3 files changed, 13 insertions(+), 15 deletions(-) (limited to 'sound') diff --git a/sound/soc/nuc900/nuc900-ac97.c b/sound/soc/nuc900/nuc900-ac97.c index f7b44e081420..e1634a2f1701 100644 --- a/sound/soc/nuc900/nuc900-ac97.c +++ b/sound/soc/nuc900/nuc900-ac97.c @@ -222,7 +222,7 @@ static int nuc900_ac97_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct nuc900_audio *nuc900_audio = nuc900_ac97_data; - int ret, stype = SUBSTREAM_TYPE(substream); + int ret; unsigned long val, tmp; ret = 0; @@ -231,7 +231,7 @@ static int nuc900_ac97_trigger(struct snd_pcm_substream *substream, case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); - if (PCM_TX == stype) { + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_ACOS0); tmp |= (SLOT3_VALID | SLOT4_VALID | VALID_FRAME); AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS0, tmp); @@ -254,7 +254,7 @@ static int nuc900_ac97_trigger(struct snd_pcm_substream *substream, case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); - if (PCM_TX == stype) { + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_ACOS0); tmp &= ~(SLOT3_VALID | SLOT4_VALID); AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS0, tmp); diff --git a/sound/soc/nuc900/nuc900-auido.h b/sound/soc/nuc900/nuc900-auido.h index 95ac4ef2f353..3038f519729f 100644 --- a/sound/soc/nuc900/nuc900-auido.h +++ b/sound/soc/nuc900/nuc900-auido.h @@ -96,10 +96,6 @@ #define RESET_PRSR 0x00 #define AUDIO_WRITE(addr, val) __raw_writel(val, addr) #define AUDIO_READ(addr) __raw_readl(addr) -#define PCM_TX 0 -#define PCM_RX 1 -#define SUBSTREAM_TYPE(substream) \ - ((substream)->stream == SNDRV_PCM_STREAM_PLAYBACK ? PCM_TX : PCM_RX) struct nuc900_audio { void __iomem *mmio; diff --git a/sound/soc/nuc900/nuc900-pcm.c b/sound/soc/nuc900/nuc900-pcm.c index 32a503c1c4be..445a18011d8e 100644 --- a/sound/soc/nuc900/nuc900-pcm.c +++ b/sound/soc/nuc900/nuc900-pcm.c @@ -47,7 +47,7 @@ static int nuc900_dma_hw_params(struct snd_pcm_substream *substream, { struct snd_pcm_runtime *runtime = substream->runtime; struct nuc900_audio *nuc900_audio = runtime->private_data; - unsigned long flags, stype = SUBSTREAM_TYPE(substream); + unsigned long flags; int ret = 0; spin_lock_irqsave(&nuc900_audio->lock, flags); @@ -57,8 +57,9 @@ static int nuc900_dma_hw_params(struct snd_pcm_substream *substream, return ret; nuc900_audio->substream = substream; - nuc900_audio->dma_addr[stype] = runtime->dma_addr; - nuc900_audio->buffersize[stype] = params_buffer_bytes(params); + nuc900_audio->dma_addr[substream->stream] = runtime->dma_addr; + nuc900_audio->buffersize[substream->stream] = + params_buffer_bytes(params); spin_unlock_irqrestore(&nuc900_audio->lock, flags); @@ -72,7 +73,7 @@ static void nuc900_update_dma_register(struct snd_pcm_substream *substream, struct nuc900_audio *nuc900_audio = runtime->private_data; void __iomem *mmio_addr, *mmio_len; - if (SUBSTREAM_TYPE(substream) == PCM_TX) { + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { mmio_addr = nuc900_audio->mmio + ACTL_PDSTB; mmio_len = nuc900_audio->mmio + ACTL_PDST_LENGTH; } else { @@ -167,18 +168,19 @@ static int nuc900_dma_prepare(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct nuc900_audio *nuc900_audio = runtime->private_data; - unsigned long flags, val, stype = SUBSTREAM_TYPE(substream);; + unsigned long flags, val; spin_lock_irqsave(&nuc900_audio->lock, flags); nuc900_update_dma_register(substream, - nuc900_audio->dma_addr[stype], nuc900_audio->buffersize[stype]); + nuc900_audio->dma_addr[substream->stream], + nuc900_audio->buffersize[substream->stream]); val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); switch (runtime->channels) { case 1: - if (PCM_TX == stype) { + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { val &= ~(PLAY_LEFT_CHNNEL | PLAY_RIGHT_CHNNEL); val |= PLAY_RIGHT_CHNNEL; } else { @@ -188,7 +190,7 @@ static int nuc900_dma_prepare(struct snd_pcm_substream *substream) AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); break; case 2: - if (PCM_TX == stype) + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) val |= (PLAY_LEFT_CHNNEL | PLAY_RIGHT_CHNNEL); else val |= (RECORD_LEFT_CHNNEL | RECORD_RIGHT_CHNNEL); -- cgit v1.2.3 From 8dfb0c78157e14387f49fa7ab425e65a93b2fee2 Mon Sep 17 00:00:00 2001 From: Wan ZongShun Date: Wed, 2 Jun 2010 14:02:33 +0800 Subject: ASoC: nuc900: fix a wait loop bug The current implement meant ACTL_ACCON was only accessed once when read or write proceeding, which is not right, if so,we have to wait the 'timeout=0x10000' to end every times. We need to polling the bit AC_R_FINISH and AC_W_FINISH of ACTL_ACCON register to identify whether read or write is finished or not,so I make the patch to fix the issue. Signed-off-by: Wan ZongShun Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/nuc900/nuc900-ac97.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'sound') diff --git a/sound/soc/nuc900/nuc900-ac97.c b/sound/soc/nuc900/nuc900-ac97.c index e1634a2f1701..c49a7934a7b2 100644 --- a/sound/soc/nuc900/nuc900-ac97.c +++ b/sound/soc/nuc900/nuc900-ac97.c @@ -66,9 +66,8 @@ static unsigned short nuc900_ac97_read(struct snd_ac97 *ac97, udelay(100); /* polling the AC_R_FINISH */ - val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); - val &= AC_R_FINISH; - while (!val && timeout--) + while (!(AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON) & AC_R_FINISH) + && timeout--) mdelay(1); if (!timeout) { @@ -121,9 +120,8 @@ static void nuc900_ac97_write(struct snd_ac97 *ac97, unsigned short reg, udelay(100); /* polling the AC_W_FINISH */ - tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); - tmp &= AC_W_FINISH; - while (tmp && timeout--) + while ((AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON) & AC_W_FINISH) + && timeout--) mdelay(1); if (!timeout) -- cgit v1.2.3 From 0dc3b44202fe7e7f43d6c687904ca1a04a0afb43 Mon Sep 17 00:00:00 2001 From: Wan ZongShun Date: Wed, 2 Jun 2010 14:05:14 +0800 Subject: ASoC: nuc900: fix a typo and rename the header file Fix a '#include "nuc900-audio.h' typo, I think it should be 'audio'. At the same time, this patch renames the 'nuc900-auido.h' file to 'nuc900-audio.h'. Signed-off-by: Wan ZongShun Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/nuc900/nuc900-ac97.c | 2 +- sound/soc/nuc900/nuc900-audio.h | 117 ++++++++++++++++++++++++++++++++++++++++ sound/soc/nuc900/nuc900-auido.h | 117 ---------------------------------------- 3 files changed, 118 insertions(+), 118 deletions(-) create mode 100644 sound/soc/nuc900/nuc900-audio.h delete mode 100644 sound/soc/nuc900/nuc900-auido.h (limited to 'sound') diff --git a/sound/soc/nuc900/nuc900-ac97.c b/sound/soc/nuc900/nuc900-ac97.c index c49a7934a7b2..b6e42c7eb9a3 100644 --- a/sound/soc/nuc900/nuc900-ac97.c +++ b/sound/soc/nuc900/nuc900-ac97.c @@ -25,7 +25,7 @@ #include -#include "nuc900-auido.h" +#include "nuc900-audio.h" static DEFINE_MUTEX(ac97_mutex); struct nuc900_audio *nuc900_ac97_data; diff --git a/sound/soc/nuc900/nuc900-audio.h b/sound/soc/nuc900/nuc900-audio.h new file mode 100644 index 000000000000..3038f519729f --- /dev/null +++ b/sound/soc/nuc900/nuc900-audio.h @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2010 Nuvoton technology corporation. + * + * Wan ZongShun + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation;version 2 of the License. + * + */ + +#ifndef _NUC900_AUDIO_H +#define _NUC900_AUDIO_H + +#include + +/* Audio Control Registers */ +#define ACTL_CON 0x00 +#define ACTL_RESET 0x04 +#define ACTL_RDSTB 0x08 +#define ACTL_RDST_LENGTH 0x0C +#define ACTL_RDSTC 0x10 +#define ACTL_RSR 0x14 +#define ACTL_PDSTB 0x18 +#define ACTL_PDST_LENGTH 0x1C +#define ACTL_PDSTC 0x20 +#define ACTL_PSR 0x24 +#define ACTL_IISCON 0x28 +#define ACTL_ACCON 0x2C +#define ACTL_ACOS0 0x30 +#define ACTL_ACOS1 0x34 +#define ACTL_ACOS2 0x38 +#define ACTL_ACIS0 0x3C +#define ACTL_ACIS1 0x40 +#define ACTL_ACIS2 0x44 +#define ACTL_COUNTER 0x48 + +/* bit definition of REG_ACTL_CON register */ +#define R_DMA_IRQ 0x1000 +#define T_DMA_IRQ 0x0800 +#define IIS_AC_PIN_SEL 0x0100 +#define FIFO_TH 0x0080 +#define ADC_EN 0x0010 +#define M80_EN 0x0008 +#define ACLINK_EN 0x0004 +#define IIS_EN 0x0002 + +/* bit definition of REG_ACTL_RESET register */ +#define W5691_PLAY 0x20000 +#define ACTL_RESET_BIT 0x10000 +#define RECORD_RIGHT_CHNNEL 0x08000 +#define RECORD_LEFT_CHNNEL 0x04000 +#define PLAY_RIGHT_CHNNEL 0x02000 +#define PLAY_LEFT_CHNNEL 0x01000 +#define DAC_PLAY 0x00800 +#define ADC_RECORD 0x00400 +#define M80_PLAY 0x00200 +#define AC_RECORD 0x00100 +#define AC_PLAY 0x00080 +#define IIS_RECORD 0x00040 +#define IIS_PLAY 0x00020 +#define DAC_RESET 0x00010 +#define ADC_RESET 0x00008 +#define M80_RESET 0x00004 +#define AC_RESET 0x00002 +#define IIS_RESET 0x00001 + +/* bit definition of REG_ACTL_ACCON register */ +#define AC_BCLK_PU_EN 0x20 +#define AC_R_FINISH 0x10 +#define AC_W_FINISH 0x08 +#define AC_W_RES 0x04 +#define AC_C_RES 0x02 + +/* bit definition of ACTL_RSR register */ +#define R_FIFO_EMPTY 0x04 +#define R_DMA_END_IRQ 0x02 +#define R_DMA_MIDDLE_IRQ 0x01 + +/* bit definition of ACTL_PSR register */ +#define P_FIFO_EMPTY 0x04 +#define P_DMA_END_IRQ 0x02 +#define P_DMA_MIDDLE_IRQ 0x01 + +/* bit definition of ACTL_ACOS0 register */ +#define SLOT1_VALID 0x01 +#define SLOT2_VALID 0x02 +#define SLOT3_VALID 0x04 +#define SLOT4_VALID 0x08 +#define VALID_FRAME 0x10 + +/* bit definition of ACTL_ACOS1 register */ +#define R_WB 0x80 + +#define CODEC_READY 0x10 +#define RESET_PRSR 0x00 +#define AUDIO_WRITE(addr, val) __raw_writel(val, addr) +#define AUDIO_READ(addr) __raw_readl(addr) + +struct nuc900_audio { + void __iomem *mmio; + spinlock_t lock; + dma_addr_t dma_addr[2]; + unsigned long buffersize[2]; + unsigned long irq_num; + struct snd_pcm_substream *substream; + struct resource *res; + struct clk *clk; + struct device *dev; + +}; + +extern struct nuc900_audio *nuc900_ac97_data; +extern struct snd_soc_dai nuc900_ac97_dai; +extern struct snd_soc_platform nuc900_soc_platform; + +#endif /*end _NUC900_AUDIO_H */ diff --git a/sound/soc/nuc900/nuc900-auido.h b/sound/soc/nuc900/nuc900-auido.h deleted file mode 100644 index 3038f519729f..000000000000 --- a/sound/soc/nuc900/nuc900-auido.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2010 Nuvoton technology corporation. - * - * Wan ZongShun - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation;version 2 of the License. - * - */ - -#ifndef _NUC900_AUDIO_H -#define _NUC900_AUDIO_H - -#include - -/* Audio Control Registers */ -#define ACTL_CON 0x00 -#define ACTL_RESET 0x04 -#define ACTL_RDSTB 0x08 -#define ACTL_RDST_LENGTH 0x0C -#define ACTL_RDSTC 0x10 -#define ACTL_RSR 0x14 -#define ACTL_PDSTB 0x18 -#define ACTL_PDST_LENGTH 0x1C -#define ACTL_PDSTC 0x20 -#define ACTL_PSR 0x24 -#define ACTL_IISCON 0x28 -#define ACTL_ACCON 0x2C -#define ACTL_ACOS0 0x30 -#define ACTL_ACOS1 0x34 -#define ACTL_ACOS2 0x38 -#define ACTL_ACIS0 0x3C -#define ACTL_ACIS1 0x40 -#define ACTL_ACIS2 0x44 -#define ACTL_COUNTER 0x48 - -/* bit definition of REG_ACTL_CON register */ -#define R_DMA_IRQ 0x1000 -#define T_DMA_IRQ 0x0800 -#define IIS_AC_PIN_SEL 0x0100 -#define FIFO_TH 0x0080 -#define ADC_EN 0x0010 -#define M80_EN 0x0008 -#define ACLINK_EN 0x0004 -#define IIS_EN 0x0002 - -/* bit definition of REG_ACTL_RESET register */ -#define W5691_PLAY 0x20000 -#define ACTL_RESET_BIT 0x10000 -#define RECORD_RIGHT_CHNNEL 0x08000 -#define RECORD_LEFT_CHNNEL 0x04000 -#define PLAY_RIGHT_CHNNEL 0x02000 -#define PLAY_LEFT_CHNNEL 0x01000 -#define DAC_PLAY 0x00800 -#define ADC_RECORD 0x00400 -#define M80_PLAY 0x00200 -#define AC_RECORD 0x00100 -#define AC_PLAY 0x00080 -#define IIS_RECORD 0x00040 -#define IIS_PLAY 0x00020 -#define DAC_RESET 0x00010 -#define ADC_RESET 0x00008 -#define M80_RESET 0x00004 -#define AC_RESET 0x00002 -#define IIS_RESET 0x00001 - -/* bit definition of REG_ACTL_ACCON register */ -#define AC_BCLK_PU_EN 0x20 -#define AC_R_FINISH 0x10 -#define AC_W_FINISH 0x08 -#define AC_W_RES 0x04 -#define AC_C_RES 0x02 - -/* bit definition of ACTL_RSR register */ -#define R_FIFO_EMPTY 0x04 -#define R_DMA_END_IRQ 0x02 -#define R_DMA_MIDDLE_IRQ 0x01 - -/* bit definition of ACTL_PSR register */ -#define P_FIFO_EMPTY 0x04 -#define P_DMA_END_IRQ 0x02 -#define P_DMA_MIDDLE_IRQ 0x01 - -/* bit definition of ACTL_ACOS0 register */ -#define SLOT1_VALID 0x01 -#define SLOT2_VALID 0x02 -#define SLOT3_VALID 0x04 -#define SLOT4_VALID 0x08 -#define VALID_FRAME 0x10 - -/* bit definition of ACTL_ACOS1 register */ -#define R_WB 0x80 - -#define CODEC_READY 0x10 -#define RESET_PRSR 0x00 -#define AUDIO_WRITE(addr, val) __raw_writel(val, addr) -#define AUDIO_READ(addr) __raw_readl(addr) - -struct nuc900_audio { - void __iomem *mmio; - spinlock_t lock; - dma_addr_t dma_addr[2]; - unsigned long buffersize[2]; - unsigned long irq_num; - struct snd_pcm_substream *substream; - struct resource *res; - struct clk *clk; - struct device *dev; - -}; - -extern struct nuc900_audio *nuc900_ac97_data; -extern struct snd_soc_dai nuc900_ac97_dai; -extern struct snd_soc_platform nuc900_soc_platform; - -#endif /*end _NUC900_AUDIO_H */ -- cgit v1.2.3 From 08a0b717578ab03db99367e69bfe6a4a71918e2c Mon Sep 17 00:00:00 2001 From: Wan ZongShun Date: Wed, 2 Jun 2010 13:57:01 +0800 Subject: ASoC: nuc900: patch for modifing the ac97 delays to minimum This patch is to modify the ac97 delays to minimum, all these 1000 micro seconds delays seem over spec for the AC97 interface. I deleted some unnecessary delays here and changed the AC97 cold and warm reset delays from 1000us to 100us. Signed-off-by: Wan ZongShun Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/nuc900/nuc900-ac97.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) (limited to 'sound') diff --git a/sound/soc/nuc900/nuc900-ac97.c b/sound/soc/nuc900/nuc900-ac97.c index b6e42c7eb9a3..caa7c901bc2e 100644 --- a/sound/soc/nuc900/nuc900-ac97.c +++ b/sound/soc/nuc900/nuc900-ac97.c @@ -147,7 +147,7 @@ static void nuc900_ac97_warm_reset(struct snd_ac97 *ac97) val |= AC_W_RES; AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACCON, val); - udelay(1000); + udelay(100); val = nuc900_checkready(); if (!!val) @@ -168,40 +168,30 @@ static void nuc900_ac97_cold_reset(struct snd_ac97 *ac97) val |= ACTL_RESET_BIT; AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); - udelay(1000); - val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); val &= (~ACTL_RESET_BIT); AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); - udelay(1000); - /* reset AC-link interface */ val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); val |= AC_RESET; AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); - udelay(1000); - val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); val &= ~AC_RESET; AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); - udelay(1000); - /* cold reset AC 97 */ val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); val |= AC_C_RES; AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACCON, val); - udelay(1000); - val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); val &= (~AC_C_RES); AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACCON, val); - udelay(1000); + udelay(100); mutex_unlock(&ac97_mutex); -- cgit v1.2.3 From 8fc6d4186e0a60b3755a6b88bf67a3ac3214dcc3 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 2 Jun 2010 13:29:17 +0200 Subject: ALSA: hda-intel - fix wallclk variable update and condition This patch fixes thinko introduced in "last minutes" before commiting of the last wallclk patch. It also fixes the condition checking if the first period after last wallclk update is processed. There is a little rounding error in period_wallclk. Signed-off-by: Jaroslav Kysela --- sound/pci/hda/hda_intel.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index dc79564fea30..af701a894687 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -1913,11 +1913,11 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev) if (WARN_ONCE(!azx_dev->period_bytes, "hda-intel: zero azx_dev->period_bytes")) return -1; /* this shouldn't happen! */ - if (wallclk <= azx_dev->period_wallclk && + if (wallclk < (azx_dev->period_wallclk * 5) / 4 && pos % azx_dev->period_bytes > azx_dev->period_bytes / 2) /* NG - it's below the first next period boundary */ return bdl_pos_adj[chip->dev_index] ? 0 : -1; - azx_dev->start_wallclk = wallclk; + azx_dev->start_wallclk += wallclk; return 1; /* OK, it's fine */ } -- cgit v1.2.3 From 5ef650ae5c94ee4d593169b82b6c306093360765 Mon Sep 17 00:00:00 2001 From: Wan ZongShun Date: Wed, 2 Jun 2010 18:49:53 +0800 Subject: ASoC: s6000: use resource_size for {request/release}_mem_region and ioremap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The size calculation is end - start + 1. But,sometimes, the '1' can be forgotten carelessly, witch will have potential risk, so use resource_size for {request/release}_mem_region and ioremap here should be good habit. Signed-off-by: Wan ZongShun Acked-by: Daniel Glöckner Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/s6000/s6000-i2s.c | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) (limited to 'sound') diff --git a/sound/soc/s6000/s6000-i2s.c b/sound/soc/s6000/s6000-i2s.c index 5b9ac1759bd2..59e3fa7bcb05 100644 --- a/sound/soc/s6000/s6000-i2s.c +++ b/sound/soc/s6000/s6000-i2s.c @@ -451,16 +451,15 @@ static int __devinit s6000_i2s_probe(struct platform_device *pdev) goto err_release_none; } - region = request_mem_region(scbmem->start, - scbmem->end - scbmem->start + 1, - pdev->name); + region = request_mem_region(scbmem->start, resource_size(scbmem), + pdev->name); if (!region) { dev_err(&pdev->dev, "I2S SCB region already claimed\n"); ret = -EBUSY; goto err_release_none; } - mmio = ioremap(scbmem->start, scbmem->end - scbmem->start + 1); + mmio = ioremap(scbmem->start, resource_size(scbmem)); if (!mmio) { dev_err(&pdev->dev, "can't ioremap SCB region\n"); ret = -ENOMEM; @@ -474,9 +473,8 @@ static int __devinit s6000_i2s_probe(struct platform_device *pdev) goto err_release_map; } - region = request_mem_region(sifmem->start, - sifmem->end - sifmem->start + 1, - pdev->name); + region = request_mem_region(sifmem->start, resource_size(sifmem), + pdev->name); if (!region) { dev_err(&pdev->dev, "I2S SIF region already claimed\n"); ret = -EBUSY; @@ -490,8 +488,8 @@ static int __devinit s6000_i2s_probe(struct platform_device *pdev) goto err_release_sif; } - region = request_mem_region(dma1->start, dma1->end - dma1->start + 1, - pdev->name); + region = request_mem_region(dma1->start, resource_size(dma1), + pdev->name); if (!region) { dev_err(&pdev->dev, "I2S DMA region already claimed\n"); ret = -EBUSY; @@ -500,9 +498,8 @@ static int __devinit s6000_i2s_probe(struct platform_device *pdev) dma2 = platform_get_resource(pdev, IORESOURCE_DMA, 1); if (dma2) { - region = request_mem_region(dma2->start, - dma2->end - dma2->start + 1, - pdev->name); + region = request_mem_region(dma2->start, resource_size(dma2), + pdev->name); if (!region) { dev_err(&pdev->dev, "I2S DMA region already claimed\n"); @@ -561,15 +558,15 @@ err_release_dev: kfree(dev); err_release_dma2: if (dma2) - release_mem_region(dma2->start, dma2->end - dma2->start + 1); + release_mem_region(dma2->start, resource_size(dma2)); err_release_dma1: - release_mem_region(dma1->start, dma1->end - dma1->start + 1); + release_mem_region(dma1->start, resource_size(dma1)); err_release_sif: - release_mem_region(sifmem->start, (sifmem->end - sifmem->start) + 1); + release_mem_region(sifmem->start, resource_size(sifmem)); err_release_map: iounmap(mmio); err_release_scb: - release_mem_region(scbmem->start, (scbmem->end - scbmem->start) + 1); + release_mem_region(scbmem->start, resource_size(scbmem)); err_release_none: return ret; } @@ -590,19 +587,18 @@ static void __devexit s6000_i2s_remove(struct platform_device *pdev) kfree(dev); region = platform_get_resource(pdev, IORESOURCE_DMA, 0); - release_mem_region(region->start, region->end - region->start + 1); + release_mem_region(region->start, resource_size(region)); region = platform_get_resource(pdev, IORESOURCE_DMA, 1); if (region) - release_mem_region(region->start, - region->end - region->start + 1); + release_mem_region(region->start, resource_size(region)); region = platform_get_resource(pdev, IORESOURCE_MEM, 0); - release_mem_region(region->start, (region->end - region->start) + 1); + release_mem_region(region->start, resource_size(region)); iounmap(mmio); region = platform_get_resource(pdev, IORESOURCE_IO, 0); - release_mem_region(region->start, (region->end - region->start) + 1); + release_mem_region(region->start, resource_size(region)); } static struct platform_driver s6000_i2s_driver = { -- cgit v1.2.3 From 3f024039e08598521a2c4c3eaedf8de2119797f4 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Thu, 3 Jun 2010 07:39:35 +0300 Subject: ASoC: omap-mcbsp: Save, and use wlen for threshold configuration Save the word length configuration of McBSP, and use that information to calculate, and configure the threshold in McBSP. Previously the calculation was only correct when the stream had 16bit audio. Signed-off-by: Peter Ujfalusi Acked-by: Jarkko Nikula Acked-by: Mark Brown Acked-by: Tony Lindgren Signed-off-by: Liam Girdwood --- sound/soc/omap/omap-mcbsp.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 6f44cb4d30b8..b06d8f1620d7 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c @@ -59,6 +59,7 @@ struct omap_mcbsp_data { int configured; unsigned int in_freq; int clk_div; + int wlen; }; #define to_mcbsp(priv) container_of((priv), struct omap_mcbsp_data, bus_id) @@ -155,19 +156,21 @@ static void omap_mcbsp_set_threshold(struct snd_pcm_substream *substream) struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); int dma_op_mode = omap_mcbsp_get_dma_op_mode(mcbsp_data->bus_id); - int samples; + int words; /* TODO: Currently, MODE_ELEMENT == MODE_FRAME */ if (dma_op_mode == MCBSP_DMA_MODE_THRESHOLD) - samples = snd_pcm_lib_period_bytes(substream) >> 1; + /* The FIFO size depends on the McBSP word configuration */ + words = snd_pcm_lib_period_bytes(substream) / + (mcbsp_data->wlen / 8); else - samples = 1; + words = 1; /* Configure McBSP internal buffer usage */ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - omap_mcbsp_set_tx_threshold(mcbsp_data->bus_id, samples - 1); + omap_mcbsp_set_tx_threshold(mcbsp_data->bus_id, words); else - omap_mcbsp_set_rx_threshold(mcbsp_data->bus_id, samples - 1); + omap_mcbsp_set_rx_threshold(mcbsp_data->bus_id, words); } static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream, @@ -409,6 +412,7 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, } omap_mcbsp_config(bus_id, &mcbsp_data->regs); + mcbsp_data->wlen = wlen; mcbsp_data->configured = 1; return 0; -- cgit v1.2.3 From ddc29b0104d69e3742e6a9f23184fb6184614403 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Thu, 3 Jun 2010 07:39:36 +0300 Subject: ASoC: omap-mcbsp: Place correct constraints for streams OMAP McBSP FIFO is word structured: McBSP2 has 1024 + 256 = 1280 word long buffer, McBSP1,3,4,5 has 128 word long buffer This means, that the size of the FIFO depends on the McBSP word size configuration. For example on McBSP3: 16bit samples: size is 128 * 2 = 256 bytes 32bit samples: size is 128 * 4 = 512 bytes It is simpler to place constraint for buffer and period based on channels. McBSP3 as example again (16 or 32 bit samples): 1 channel (mono): size is 128 frames (128 words) 2 channels (stereo): size is 128 / 2 = 64 frames (2 * 64 words) 4 channels: size is 128 / 4 = 32 frames (4 * 32 words) Use the second method to place hw_rule on buffer size, and in threshold mode to period size. Signed-off-by: Peter Ujfalusi Acked-by: Jarkko Nikula Acked-by: Mark Brown Acked-by: Tony Lindgren Signed-off-by: Liam Girdwood --- sound/soc/omap/omap-mcbsp.c | 98 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 77 insertions(+), 21 deletions(-) (limited to 'sound') diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index b06d8f1620d7..aebd3af2ab79 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c @@ -173,6 +173,50 @@ static void omap_mcbsp_set_threshold(struct snd_pcm_substream *substream) omap_mcbsp_set_rx_threshold(mcbsp_data->bus_id, words); } +static int omap_mcbsp_hwrule_min_buffersize(struct snd_pcm_hw_params *params, + struct snd_pcm_hw_rule *rule) +{ + struct snd_interval *buffer_size = hw_param_interval(params, + SNDRV_PCM_HW_PARAM_BUFFER_SIZE); + struct snd_interval *channels = hw_param_interval(params, + SNDRV_PCM_HW_PARAM_CHANNELS); + struct omap_mcbsp_data *mcbsp_data = rule->private; + struct snd_interval frames; + int size; + + snd_interval_any(&frames); + size = omap_mcbsp_get_fifo_size(mcbsp_data->bus_id); + + frames.min = size / channels->min; + frames.integer = 1; + return snd_interval_refine(buffer_size, &frames); +} + +static int omap_mcbsp_hwrule_max_periodsize(struct snd_pcm_hw_params *params, + struct snd_pcm_hw_rule *rule) +{ + struct snd_interval *period_size = hw_param_interval(params, + SNDRV_PCM_HW_PARAM_PERIOD_SIZE); + struct snd_interval *channels = hw_param_interval(params, + SNDRV_PCM_HW_PARAM_CHANNELS); + struct snd_pcm_substream *substream = rule->private; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); + struct snd_interval frames; + int size; + + snd_interval_any(&frames); + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + size = omap_mcbsp_get_max_tx_threshold(mcbsp_data->bus_id); + else + size = omap_mcbsp_get_max_rx_threshold(mcbsp_data->bus_id); + + frames.max = size / channels->min; + frames.integer = 1; + return snd_interval_refine(period_size, &frames); +} + static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { @@ -185,33 +229,45 @@ static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream, if (!cpu_dai->active) err = omap_mcbsp_request(bus_id); + /* + * OMAP3 McBSP FIFO is word structured. + * McBSP2 has 1024 + 256 = 1280 word long buffer, + * McBSP1,3,4,5 has 128 word long buffer + * This means that the size of the FIFO depends on the sample format. + * For example on McBSP3: + * 16bit samples: size is 128 * 2 = 256 bytes + * 32bit samples: size is 128 * 4 = 512 bytes + * It is simpler to place constraint for buffer and period based on + * channels. + * McBSP3 as example again (16 or 32 bit samples): + * 1 channel (mono): size is 128 frames (128 words) + * 2 channels (stereo): size is 128 / 2 = 64 frames (2 * 64 words) + * 4 channels: size is 128 / 4 = 32 frames (4 * 32 words) + */ if (cpu_is_omap343x()) { int dma_op_mode = omap_mcbsp_get_dma_op_mode(bus_id); - int max_period; /* - * McBSP2 in OMAP3 has 1024 * 32-bit internal audio buffer. - * Set constraint for minimum buffer size to the same than FIFO - * size in order to avoid underruns in playback startup because - * HW is keeping the DMA request active until FIFO is filled. - */ - if (bus_id == 1) - snd_pcm_hw_constraint_minmax(substream->runtime, - SNDRV_PCM_HW_PARAM_BUFFER_BYTES, - 4096, UINT_MAX); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - max_period = omap_mcbsp_get_max_tx_threshold(bus_id); - else - max_period = omap_mcbsp_get_max_rx_threshold(bus_id); - - max_period++; - max_period <<= 1; + * The first rule is for the buffer size, we should not allow + * smaller buffer than the FIFO size to avoid underruns + */ + snd_pcm_hw_rule_add(substream->runtime, 0, + SNDRV_PCM_HW_PARAM_CHANNELS, + omap_mcbsp_hwrule_min_buffersize, + mcbsp_data, + SNDRV_PCM_HW_PARAM_BUFFER_SIZE, -1); + /* + * In case of threshold mode, the rule will ensure, that the + * period size is not bigger than the maximum allowed threshold + * value. + */ if (dma_op_mode == MCBSP_DMA_MODE_THRESHOLD) - snd_pcm_hw_constraint_minmax(substream->runtime, - SNDRV_PCM_HW_PARAM_PERIOD_BYTES, - 32, max_period); + snd_pcm_hw_rule_add(substream->runtime, 0, + SNDRV_PCM_HW_PARAM_CHANNELS, + omap_mcbsp_hwrule_max_periodsize, + substream, + SNDRV_PCM_HW_PARAM_PERIOD_SIZE, -1); } return err; -- cgit v1.2.3 From c0da5500e9962e23ee8bb0bce9cb4307d44c0ae7 Mon Sep 17 00:00:00 2001 From: Wan ZongShun Date: Tue, 1 Jun 2010 15:16:20 +0800 Subject: ASoC: use resource_size for au1x Use the resource_size function instead of manually calculating the resource size.This patch can reduce the chance of introducing off-by-one errors. Signed-off-by: Wan ZongShun Acked-by: Manuel Lauss Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/au1x/psc-ac97.c | 13 +++++-------- sound/soc/au1x/psc-i2s.c | 13 +++++-------- sound/soc/au1x/psc.h | 1 - 3 files changed, 10 insertions(+), 17 deletions(-) (limited to 'sound') diff --git a/sound/soc/au1x/psc-ac97.c b/sound/soc/au1x/psc-ac97.c index a61ccd2d505f..d14a5a91a465 100644 --- a/sound/soc/au1x/psc-ac97.c +++ b/sound/soc/au1x/psc-ac97.c @@ -375,12 +375,10 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) } ret = -EBUSY; - wd->ioarea = request_mem_region(r->start, r->end - r->start + 1, - "au1xpsc_ac97"); - if (!wd->ioarea) + if (!request_mem_region(r->start, resource_size(r), pdev->name)) goto out0; - wd->mmio = ioremap(r->start, 0xffff); + wd->mmio = ioremap(r->start, resource_size(r)); if (!wd->mmio) goto out1; @@ -410,8 +408,7 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) snd_soc_unregister_dai(&au1xpsc_ac97_dai); out1: - release_resource(wd->ioarea); - kfree(wd->ioarea); + release_mem_region(r->start, resource_size(r)); out0: kfree(wd); return ret; @@ -420,6 +417,7 @@ out0: static int __devexit au1xpsc_ac97_drvremove(struct platform_device *pdev) { struct au1xpsc_audio_data *wd = platform_get_drvdata(pdev); + struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (wd->dmapd) au1xpsc_pcm_destroy(wd->dmapd); @@ -433,8 +431,7 @@ static int __devexit au1xpsc_ac97_drvremove(struct platform_device *pdev) au_sync(); iounmap(wd->mmio); - release_resource(wd->ioarea); - kfree(wd->ioarea); + release_mem_region(r->start, resource_size(r)); kfree(wd); au1xpsc_ac97_workdata = NULL; /* MDEV */ diff --git a/sound/soc/au1x/psc-i2s.c b/sound/soc/au1x/psc-i2s.c index 495be6e71931..737b2384f6c5 100644 --- a/sound/soc/au1x/psc-i2s.c +++ b/sound/soc/au1x/psc-i2s.c @@ -321,12 +321,10 @@ static int __init au1xpsc_i2s_drvprobe(struct platform_device *pdev) } ret = -EBUSY; - wd->ioarea = request_mem_region(r->start, r->end - r->start + 1, - "au1xpsc_i2s"); - if (!wd->ioarea) + if (!request_mem_region(r->start, resource_size(r), pdev->name)) goto out0; - wd->mmio = ioremap(r->start, 0xffff); + wd->mmio = ioremap(r->start, resource_size(r)); if (!wd->mmio) goto out1; @@ -362,8 +360,7 @@ static int __init au1xpsc_i2s_drvprobe(struct platform_device *pdev) snd_soc_unregister_dai(&au1xpsc_i2s_dai); out1: - release_resource(wd->ioarea); - kfree(wd->ioarea); + release_mem_region(r->start, resource_size(r)); out0: kfree(wd); return ret; @@ -372,6 +369,7 @@ out0: static int __devexit au1xpsc_i2s_drvremove(struct platform_device *pdev) { struct au1xpsc_audio_data *wd = platform_get_drvdata(pdev); + struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (wd->dmapd) au1xpsc_pcm_destroy(wd->dmapd); @@ -384,8 +382,7 @@ static int __devexit au1xpsc_i2s_drvremove(struct platform_device *pdev) au_sync(); iounmap(wd->mmio); - release_resource(wd->ioarea); - kfree(wd->ioarea); + release_mem_region(r->start, resource_size(r)); kfree(wd); au1xpsc_i2s_workdata = NULL; /* MDEV */ diff --git a/sound/soc/au1x/psc.h b/sound/soc/au1x/psc.h index 32d3807d3f5a..093775d4dc3e 100644 --- a/sound/soc/au1x/psc.h +++ b/sound/soc/au1x/psc.h @@ -32,7 +32,6 @@ struct au1xpsc_audio_data { unsigned long rate; unsigned long pm[2]; - struct resource *ioarea; struct mutex lock; struct platform_device *dmapd; }; -- cgit v1.2.3 From b07adffbbcb258ac607c16c5af9bf4ec8d189d38 Mon Sep 17 00:00:00 2001 From: Wan ZongShun Date: Thu, 3 Jun 2010 00:28:46 +0800 Subject: ASoC: atmel: patch for the unnecessary variable removal The variable 'periods' of structure 'atmel_runtime_data' seems no use in whole atmel alsa driver,so I make a patch to remove the unnecessary variable. Signed-off-by: Wan ZongShun Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/atmel/atmel-pcm.c | 1 - 1 file changed, 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/atmel/atmel-pcm.c b/sound/soc/atmel/atmel-pcm.c index f6b3cc04b34b..dc5249fba85c 100644 --- a/sound/soc/atmel/atmel-pcm.c +++ b/sound/soc/atmel/atmel-pcm.c @@ -77,7 +77,6 @@ struct atmel_runtime_data { size_t period_size; dma_addr_t period_ptr; /* physical address of next period */ - int periods; /* period index of period_ptr */ /* PDC register save */ u32 pdc_xpr_save; -- cgit v1.2.3 From 749266cd91ae5862a986a8ea995f714b87f12b5d Mon Sep 17 00:00:00 2001 From: Wan ZongShun Date: Thu, 3 Jun 2010 00:54:59 +0800 Subject: ASoC: s3c: patch for the unnecessary variable 'state' removal The variable 'state' of structure 's3c_ac97_info' seems no use here, so this patch is to remove the unnecessary variable. Signed-off-by: Wan ZongShun Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/s3c24xx/s3c-ac97.c | 1 - 1 file changed, 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/s3c24xx/s3c-ac97.c b/sound/soc/s3c24xx/s3c-ac97.c index ecf4fd04ae96..31f6d45b6384 100644 --- a/sound/soc/s3c24xx/s3c-ac97.c +++ b/sound/soc/s3c24xx/s3c-ac97.c @@ -31,7 +31,6 @@ #define AC_CMD_DATA(x) (x & 0xffff) struct s3c_ac97_info { - unsigned state; struct clk *ac97_clk; void __iomem *regs; struct mutex lock; -- cgit v1.2.3 From 0e79612012e1da66133e3c8499bc7c020f006c89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eric=20B=C3=A9nard?= Date: Thu, 27 May 2010 10:58:54 +0200 Subject: ASoC: imx-ssi.c: add new choices to platform configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * introduce 3 new flags to allow a more detailed configuration of the SSI link : IMX_SSI_NET : enable Network Mode IMX_SSI_SYN : enable Synchronous Mode IMX_SSI_USE_I2S_SLAVE : enable I2S Slave Mode * new platform can use these settings without breaking actual platforms. Signed-off-by: Eric Bénard Acked-by: Sascha Hauer Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/imx/imx-ssi.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/imx/imx-ssi.c b/sound/soc/imx/imx-ssi.c index 80b4fee2442b..50f51624c535 100644 --- a/sound/soc/imx/imx-ssi.c +++ b/sound/soc/imx/imx-ssi.c @@ -83,8 +83,6 @@ static int imx_ssi_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, /* * SSI DAI format configuration. * Should only be called when port is inactive (i.e. SSIEN = 0). - * Note: We don't use the I2S modes but instead manually configure the - * SSI for I2S because the I2S mode is only a register preset. */ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { @@ -99,6 +97,10 @@ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) /* data on rising edge of bclk, frame low 1clk before data */ strcr |= SSI_STCR_TFSI | SSI_STCR_TEFS | SSI_STCR_TXBIT0; scr |= SSI_SCR_NET; + if (ssi->flags & IMX_SSI_USE_I2S_SLAVE) { + scr &= ~SSI_I2S_MODE_MASK; + scr |= SSI_SCR_I2S_MODE_SLAVE; + } break; case SND_SOC_DAIFMT_LEFT_J: /* data on rising edge of bclk, frame high with data */ @@ -143,6 +145,11 @@ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) strcr |= SSI_STCR_TFEN0; + if (ssi->flags & IMX_SSI_NET) + scr |= SSI_SCR_NET; + if (ssi->flags & IMX_SSI_SYN) + scr |= SSI_SCR_SYN; + writel(strcr, ssi->base + SSI_STCR); writel(strcr, ssi->base + SSI_SRCR); writel(scr, ssi->base + SSI_SCR); -- cgit v1.2.3 From 91157888f28ae94761eaf25533f76a55542b2a3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eric=20B=C3=A9nard?= Date: Thu, 27 May 2010 10:58:55 +0200 Subject: ASoC: imx: add eukrea-tlv320 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add the necessary files to support the TLV320AIC23B wired in I2S on our i.MX platforms. Signed-off-by: Eric Bénard Acked-by: Sascha Hauer Acked-by: Liam Girdwood --- sound/soc/imx/Kconfig | 9 +++ sound/soc/imx/Makefile | 2 + sound/soc/imx/eukrea-tlv320.c | 135 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 sound/soc/imx/eukrea-tlv320.c (limited to 'sound') diff --git a/sound/soc/imx/Kconfig b/sound/soc/imx/Kconfig index 252defea93b5..079b23bb0b03 100644 --- a/sound/soc/imx/Kconfig +++ b/sound/soc/imx/Kconfig @@ -28,3 +28,12 @@ config SND_SOC_PHYCORE_AC97 help Say Y if you want to add support for SoC audio on Phytec phyCORE and phyCARD boards in AC97 mode + +config SND_SOC_EUKREA_TLV320 + bool "Eukrea TLV320" + depends on MACH_EUKREA_MBIMX27_BASEBOARD + select SND_IMX_SOC + select SND_SOC_TLV320AIC23 + help + Enable I2S based access to the TLV320AIC23B codec attached + to the SSI4 interface diff --git a/sound/soc/imx/Makefile b/sound/soc/imx/Makefile index 2d203635ac11..7bc57baf2b0e 100644 --- a/sound/soc/imx/Makefile +++ b/sound/soc/imx/Makefile @@ -8,8 +8,10 @@ endif obj-$(CONFIG_SND_IMX_SOC) += snd-soc-imx.o # i.MX Machine Support +snd-soc-eukrea-tlv320-objs := eukrea-tlv320.o snd-soc-phycore-ac97-objs := phycore-ac97.o snd-soc-wm1133-ev1-objs := wm1133-ev1.o +obj-$(CONFIG_SND_SOC_EUKREA_TLV320) += snd-soc-eukrea-tlv320.o obj-$(CONFIG_SND_SOC_PHYCORE_AC97) += snd-soc-phycore-ac97.o obj-$(CONFIG_SND_MXC_SOC_WM1133_EV1) += snd-soc-wm1133-ev1.o diff --git a/sound/soc/imx/eukrea-tlv320.c b/sound/soc/imx/eukrea-tlv320.c new file mode 100644 index 000000000000..968380a93e89 --- /dev/null +++ b/sound/soc/imx/eukrea-tlv320.c @@ -0,0 +1,135 @@ +/* + * eukrea-tlv320.c -- SoC audio for eukrea_cpuimxXX in I2S mode + * + * Copyright 2010 Eric Bénard, Eukréa Electromatique + * + * based on sound/soc/s3c24xx/s3c24xx_simtec_tlv320aic23.c + * which is Copyright 2009 Simtec Electronics + * and on sound/soc/imx/phycore-ac97.c which is + * Copyright 2009 Sascha Hauer, Pengutronix + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../codecs/tlv320aic23.h" +#include "imx-ssi.h" + +#define CODEC_CLOCK 12000000 + +static int eukrea_tlv320_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + int ret; + + ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBM_CFM); + if (ret) { + pr_err("%s: failed set cpu dai format\n", __func__); + return ret; + } + + ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBM_CFM); + if (ret) { + pr_err("%s: failed set codec dai format\n", __func__); + return ret; + } + + ret = snd_soc_dai_set_sysclk(codec_dai, 0, + CODEC_CLOCK, SND_SOC_CLOCK_OUT); + if (ret) { + pr_err("%s: failed setting codec sysclk\n", __func__); + return ret; + } + + ret = snd_soc_dai_set_sysclk(cpu_dai, IMX_SSP_SYS_CLK, 0, + SND_SOC_CLOCK_IN); + if (ret) { + pr_err("can't set CPU system clock IMX_SSP_SYS_CLK\n"); + return ret; + } + + return 0; +} + +static struct snd_soc_ops eukrea_tlv320_snd_ops = { + .hw_params = eukrea_tlv320_hw_params, +}; + +static struct snd_soc_dai_link eukrea_tlv320_dai = { + .name = "tlv320aic23", + .stream_name = "TLV320AIC23", + .codec_dai = &tlv320aic23_dai, + .ops = &eukrea_tlv320_snd_ops, +}; + +static struct snd_soc_card eukrea_tlv320 = { + .name = "cpuimx-audio", + .platform = &imx_soc_platform, + .dai_link = &eukrea_tlv320_dai, + .num_links = 1, +}; + +static struct snd_soc_device eukrea_tlv320_snd_devdata = { + .card = &eukrea_tlv320, + .codec_dev = &soc_codec_dev_tlv320aic23, +}; + +static struct platform_device *eukrea_tlv320_snd_device; + +static int __init eukrea_tlv320_init(void) +{ + int ret; + + if (!machine_is_eukrea_cpuimx27()) + /* return happy. We might run on a totally different machine */ + return 0; + + eukrea_tlv320_snd_device = platform_device_alloc("soc-audio", -1); + if (!eukrea_tlv320_snd_device) + return -ENOMEM; + + eukrea_tlv320_dai.cpu_dai = &imx_ssi_pcm_dai[0]; + + platform_set_drvdata(eukrea_tlv320_snd_device, &eukrea_tlv320_snd_devdata); + eukrea_tlv320_snd_devdata.dev = &eukrea_tlv320_snd_device->dev; + ret = platform_device_add(eukrea_tlv320_snd_device); + + if (ret) { + printk(KERN_ERR "ASoC: Platform device allocation failed\n"); + platform_device_put(eukrea_tlv320_snd_device); + } + + return ret; +} + +static void __exit eukrea_tlv320_exit(void) +{ + platform_device_unregister(eukrea_tlv320_snd_device); +} + +module_init(eukrea_tlv320_init); +module_exit(eukrea_tlv320_exit); + +MODULE_AUTHOR("Eric Bénard "); +MODULE_DESCRIPTION("CPUIMX ALSA SoC driver"); +MODULE_LICENSE("GPL"); -- cgit v1.2.3 From 9d7db2b2cb507f31ff29e339e9ed2f825edb555d Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Mon, 7 Jun 2010 10:50:39 +0300 Subject: ASoC: tlv320dac33: Add support for changing upper threshold Upper threshold is used in mode7 of DAC33. Instead of hard wired UTHR, add control to change the upper threshold value. Changing upper threshold is not allowed when the playback is already running, since wrongly timed change in the UTHR can cause problems with the codec. With this control the length of the burst in mode7 can be changed. Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/tlv320dac33.c | 57 +++++++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 9 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/tlv320dac33.c b/sound/soc/codecs/tlv320dac33.c index 65adc77eada1..2fa946ce23a2 100644 --- a/sound/soc/codecs/tlv320dac33.c +++ b/sound/soc/codecs/tlv320dac33.c @@ -120,6 +120,8 @@ struct tlv320dac33_priv { * samples */ unsigned int mode7_us_to_lthr; /* Time to reach lthr from uthr */ + unsigned int uthr; + enum dac33_state state; }; @@ -442,6 +444,39 @@ static int dac33_set_nsample(struct snd_kcontrol *kcontrol, return ret; } +static int dac33_get_uthr(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.integer.value[0] = dac33->uthr; + + return 0; +} + +static int dac33_set_uthr(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + int ret = 0; + + if (dac33->substream) + return -EBUSY; + + if (dac33->uthr == ucontrol->value.integer.value[0]) + return 0; + + if (ucontrol->value.integer.value[0] < (MODE7_LTHR + 10) || + ucontrol->value.integer.value[0] > MODE7_UTHR) + ret = -EINVAL; + else + dac33->uthr = ucontrol->value.integer.value[0]; + + return ret; +} + static int dac33_get_fifo_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { @@ -506,6 +541,8 @@ static const struct snd_kcontrol_new dac33_snd_controls[] = { static const struct snd_kcontrol_new dac33_nsample_snd_controls[] = { SOC_SINGLE_EXT("nSample", 0, 0, 5900, 0, dac33_get_nsample, dac33_set_nsample), + SOC_SINGLE_EXT("UTHR", 0, 0, MODE7_UTHR, 0, + dac33_get_uthr, dac33_set_uthr), SOC_ENUM_EXT("FIFO Mode", dac33_fifo_mode_enum, dac33_get_fifo_mode, dac33_set_fifo_mode), }; @@ -985,7 +1022,7 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream) * Configure the threshold levels, and leave 10 sample space * at the bottom, and also at the top of the FIFO */ - dac33_write16(codec, DAC33_UTHR_MSB, DAC33_THRREG(MODE7_UTHR)); + dac33_write16(codec, DAC33_UTHR_MSB, DAC33_THRREG(dac33->uthr)); dac33_write16(codec, DAC33_LTHR_MSB, DAC33_THRREG(MODE7_LTHR)); break; default: @@ -1052,8 +1089,8 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream) break; case DAC33_FIFO_MODE7: dac33->mode7_us_to_lthr = - SAMPLES_TO_US(substream->runtime->rate, - MODE7_UTHR - MODE7_LTHR + 1); + SAMPLES_TO_US(substream->runtime->rate, + dac33->uthr - MODE7_LTHR + 1); dac33->t_stamp1 = 0; break; default: @@ -1104,7 +1141,7 @@ static snd_pcm_sframes_t dac33_dai_delay( struct snd_soc_codec *codec = socdev->card->codec; struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); unsigned long long t0, t1, t_now; - unsigned int time_delta; + unsigned int time_delta, uthr; int samples_out, samples_in, samples; snd_pcm_sframes_t delay = 0; @@ -1182,6 +1219,7 @@ static snd_pcm_sframes_t dac33_dai_delay( case DAC33_FIFO_MODE7: spin_lock(&dac33->lock); t0 = dac33->t_stamp1; + uthr = dac33->uthr; spin_unlock(&dac33->lock); t_now = ktime_to_us(ktime_get()); @@ -1194,7 +1232,7 @@ static snd_pcm_sframes_t dac33_dai_delay( * Either the timestamps are messed or equal. Report * maximum delay */ - delay = MODE7_UTHR; + delay = uthr; goto out; } @@ -1208,8 +1246,8 @@ static snd_pcm_sframes_t dac33_dai_delay( substream->runtime->rate, time_delta); - if (likely(MODE7_UTHR > samples_out)) - delay = MODE7_UTHR - samples_out; + if (likely(uthr > samples_out)) + delay = uthr - samples_out; else delay = 0; } else { @@ -1227,8 +1265,8 @@ static snd_pcm_sframes_t dac33_dai_delay( time_delta); delay = MODE7_LTHR + samples_in - samples_out; - if (unlikely(delay > MODE7_UTHR)) - delay = MODE7_UTHR; + if (unlikely(delay > uthr)) + delay = uthr; } break; default: @@ -1484,6 +1522,7 @@ static int __devinit dac33_i2c_probe(struct i2c_client *client, dac33->irq = client->irq; dac33->nsample = NSAMPLE_MAX; dac33->nsample_max = NSAMPLE_MAX; + dac33->uthr = MODE7_UTHR; /* Disable FIFO use by default */ dac33->fifo_mode = DAC33_FIFO_BYPASS; -- cgit v1.2.3 From db5bf412baf8df4df30eed2bd37af2a5b77f90ac Mon Sep 17 00:00:00 2001 From: Ryan Mallon Date: Fri, 4 Jun 2010 17:11:24 +1200 Subject: ASoC: ep93xx i2s audio driver Add ep93xx i2s audio driver Signed-off-by: Ryan Mallon Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/Kconfig | 1 + sound/soc/Makefile | 1 + sound/soc/ep93xx/Kconfig | 9 + sound/soc/ep93xx/Makefile | 8 + sound/soc/ep93xx/ep93xx-i2s.c | 487 ++++++++++++++++++++++++++++++++++++++++++ sound/soc/ep93xx/ep93xx-i2s.h | 18 ++ sound/soc/ep93xx/ep93xx-pcm.c | 319 +++++++++++++++++++++++++++ sound/soc/ep93xx/ep93xx-pcm.h | 22 ++ 8 files changed, 865 insertions(+) create mode 100644 sound/soc/ep93xx/Kconfig create mode 100644 sound/soc/ep93xx/Makefile create mode 100644 sound/soc/ep93xx/ep93xx-i2s.c create mode 100644 sound/soc/ep93xx/ep93xx-i2s.h create mode 100644 sound/soc/ep93xx/ep93xx-pcm.c create mode 100644 sound/soc/ep93xx/ep93xx-pcm.h (limited to 'sound') diff --git a/sound/soc/Kconfig b/sound/soc/Kconfig index 5e68ac880832..d35f848db6b5 100644 --- a/sound/soc/Kconfig +++ b/sound/soc/Kconfig @@ -28,6 +28,7 @@ source "sound/soc/atmel/Kconfig" source "sound/soc/au1x/Kconfig" source "sound/soc/blackfin/Kconfig" source "sound/soc/davinci/Kconfig" +source "sound/soc/ep93xx/Kconfig" source "sound/soc/fsl/Kconfig" source "sound/soc/imx/Kconfig" source "sound/soc/nuc900/Kconfig" diff --git a/sound/soc/Makefile b/sound/soc/Makefile index 05d5d340968e..97661b747b91 100644 --- a/sound/soc/Makefile +++ b/sound/soc/Makefile @@ -6,6 +6,7 @@ obj-$(CONFIG_SND_SOC) += atmel/ obj-$(CONFIG_SND_SOC) += au1x/ obj-$(CONFIG_SND_SOC) += blackfin/ obj-$(CONFIG_SND_SOC) += davinci/ +obj-$(CONFIG_SND_SOC) += ep93xx/ obj-$(CONFIG_SND_SOC) += fsl/ obj-$(CONFIG_SND_SOC) += imx/ obj-$(CONFIG_SND_SOC) += nuc900/ diff --git a/sound/soc/ep93xx/Kconfig b/sound/soc/ep93xx/Kconfig new file mode 100644 index 000000000000..ba66ac8e1419 --- /dev/null +++ b/sound/soc/ep93xx/Kconfig @@ -0,0 +1,9 @@ +config SND_EP93XX_SOC + tristate "SoC Audio support for the Cirrus Logic EP93xx series" + depends on ARCH_EP93XX && SND_SOC + help + Say Y or M if you want to add support for codecs attached to + the EP93xx I2S interface. + +config SND_EP93XX_SOC_I2S + tristate diff --git a/sound/soc/ep93xx/Makefile b/sound/soc/ep93xx/Makefile new file mode 100644 index 000000000000..0239da36cea3 --- /dev/null +++ b/sound/soc/ep93xx/Makefile @@ -0,0 +1,8 @@ +# EP93xx Platform Support +snd-soc-ep93xx-objs := ep93xx-pcm.o +snd-soc-ep93xx-i2s-objs := ep93xx-i2s.o + +obj-$(CONFIG_SND_EP93XX_SOC) += snd-soc-ep93xx.o +obj-$(CONFIG_SND_EP93XX_SOC_I2S) += snd-soc-ep93xx-i2s.o + +# EP93XX Machine Support diff --git a/sound/soc/ep93xx/ep93xx-i2s.c b/sound/soc/ep93xx/ep93xx-i2s.c new file mode 100644 index 000000000000..00b946632184 --- /dev/null +++ b/sound/soc/ep93xx/ep93xx-i2s.c @@ -0,0 +1,487 @@ +/* + * linux/sound/soc/ep93xx-i2s.c + * EP93xx I2S driver + * + * Copyright (C) 2010 Ryan Mallon + * + * Based on the original driver by: + * Copyright (C) 2007 Chase Douglas + * Copyright (C) 2006 Lennert Buytenhek + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "ep93xx-pcm.h" +#include "ep93xx-i2s.h" + +#define EP93XX_I2S_TXCLKCFG 0x00 +#define EP93XX_I2S_RXCLKCFG 0x04 +#define EP93XX_I2S_GLCTRL 0x0C + +#define EP93XX_I2S_TXLINCTRLDATA 0x28 +#define EP93XX_I2S_TXCTRL 0x2C +#define EP93XX_I2S_TXWRDLEN 0x30 +#define EP93XX_I2S_TX0EN 0x34 + +#define EP93XX_I2S_RXLINCTRLDATA 0x58 +#define EP93XX_I2S_RXCTRL 0x5C +#define EP93XX_I2S_RXWRDLEN 0x60 +#define EP93XX_I2S_RX0EN 0x64 + +#define EP93XX_I2S_WRDLEN_16 (0 << 0) +#define EP93XX_I2S_WRDLEN_24 (1 << 0) +#define EP93XX_I2S_WRDLEN_32 (2 << 0) + +#define EP93XX_I2S_LINCTRLDATA_R_JUST (1 << 2) /* Right justify */ + +#define EP93XX_I2S_CLKCFG_LRS (1 << 0) /* lrclk polarity */ +#define EP93XX_I2S_CLKCFG_CKP (1 << 1) /* Bit clock polarity */ +#define EP93XX_I2S_CLKCFG_REL (1 << 2) /* First bit transition */ +#define EP93XX_I2S_CLKCFG_MASTER (1 << 3) /* Master mode */ +#define EP93XX_I2S_CLKCFG_NBCG (1 << 4) /* Not bit clock gating */ + +struct ep93xx_i2s_info { + struct clk *mclk; + struct clk *sclk; + struct clk *lrclk; + struct ep93xx_pcm_dma_params *dma_params; + struct resource *mem; + void __iomem *regs; +}; + +struct ep93xx_pcm_dma_params ep93xx_i2s_dma_params[] = { + [SNDRV_PCM_STREAM_PLAYBACK] = { + .name = "i2s-pcm-out", + .dma_port = EP93XX_DMA_M2P_PORT_I2S1, + }, + [SNDRV_PCM_STREAM_CAPTURE] = { + .name = "i2s-pcm-in", + .dma_port = EP93XX_DMA_M2P_PORT_I2S1, + }, +}; + +static inline void ep93xx_i2s_write_reg(struct ep93xx_i2s_info *info, + unsigned reg, unsigned val) +{ + __raw_writel(val, info->regs + reg); +} + +static inline unsigned ep93xx_i2s_read_reg(struct ep93xx_i2s_info *info, + unsigned reg) +{ + return __raw_readl(info->regs + reg); +} + +static void ep93xx_i2s_enable(struct ep93xx_i2s_info *info, int stream) +{ + unsigned base_reg; + int i; + + if ((ep93xx_i2s_read_reg(info, EP93XX_I2S_TX0EN) & 0x1) == 0 && + (ep93xx_i2s_read_reg(info, EP93XX_I2S_RX0EN) & 0x1) == 0) { + /* Enable clocks */ + clk_enable(info->mclk); + clk_enable(info->sclk); + clk_enable(info->lrclk); + + /* Enable i2s */ + ep93xx_i2s_write_reg(info, EP93XX_I2S_GLCTRL, 1); + } + + /* Enable fifos */ + if (stream == SNDRV_PCM_STREAM_PLAYBACK) + base_reg = EP93XX_I2S_TX0EN; + else + base_reg = EP93XX_I2S_RX0EN; + for (i = 0; i < 3; i++) + ep93xx_i2s_write_reg(info, base_reg + (i * 4), 1); +} + +static void ep93xx_i2s_disable(struct ep93xx_i2s_info *info, int stream) +{ + unsigned base_reg; + int i; + + /* Disable fifos */ + if (stream == SNDRV_PCM_STREAM_PLAYBACK) + base_reg = EP93XX_I2S_TX0EN; + else + base_reg = EP93XX_I2S_RX0EN; + for (i = 0; i < 3; i++) + ep93xx_i2s_write_reg(info, base_reg + (i * 4), 0); + + if ((ep93xx_i2s_read_reg(info, EP93XX_I2S_TX0EN) & 0x1) == 0 && + (ep93xx_i2s_read_reg(info, EP93XX_I2S_RX0EN) & 0x1) == 0) { + /* Disable i2s */ + ep93xx_i2s_write_reg(info, EP93XX_I2S_GLCTRL, 0); + + /* Disable clocks */ + clk_disable(info->lrclk); + clk_disable(info->sclk); + clk_disable(info->mclk); + } +} + +static int ep93xx_i2s_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct ep93xx_i2s_info *info = rtd->dai->cpu_dai->private_data; + + snd_soc_dai_set_dma_data(cpu_dai, substream, + &info->dma_params[substream->stream]); + return 0; +} + +static void ep93xx_i2s_shutdown(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct ep93xx_i2s_info *info = rtd->dai->cpu_dai->private_data; + + ep93xx_i2s_disable(info, substream->stream); +} + +static int ep93xx_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, + unsigned int fmt) +{ + struct ep93xx_i2s_info *info = cpu_dai->private_data; + unsigned int clk_cfg, lin_ctrl; + + clk_cfg = ep93xx_i2s_read_reg(info, EP93XX_I2S_RXCLKCFG); + lin_ctrl = ep93xx_i2s_read_reg(info, EP93XX_I2S_RXLINCTRLDATA); + + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_I2S: + clk_cfg |= EP93XX_I2S_CLKCFG_REL; + lin_ctrl &= ~EP93XX_I2S_LINCTRLDATA_R_JUST; + break; + + case SND_SOC_DAIFMT_LEFT_J: + clk_cfg &= ~EP93XX_I2S_CLKCFG_REL; + lin_ctrl &= ~EP93XX_I2S_LINCTRLDATA_R_JUST; + break; + + case SND_SOC_DAIFMT_RIGHT_J: + clk_cfg &= ~EP93XX_I2S_CLKCFG_REL; + lin_ctrl |= EP93XX_I2S_LINCTRLDATA_R_JUST; + break; + + default: + return -EINVAL; + } + + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBS_CFS: + /* CPU is master */ + clk_cfg |= EP93XX_I2S_CLKCFG_MASTER; + break; + + case SND_SOC_DAIFMT_CBM_CFM: + /* Codec is master */ + clk_cfg &= ~EP93XX_I2S_CLKCFG_MASTER; + break; + + default: + return -EINVAL; + } + + switch (fmt & SND_SOC_DAIFMT_INV_MASK) { + case SND_SOC_DAIFMT_NB_NF: + /* Negative bit clock, lrclk low on left word */ + clk_cfg &= ~(EP93XX_I2S_CLKCFG_CKP | EP93XX_I2S_CLKCFG_REL); + break; + + case SND_SOC_DAIFMT_NB_IF: + /* Negative bit clock, lrclk low on right word */ + clk_cfg &= ~EP93XX_I2S_CLKCFG_CKP; + clk_cfg |= EP93XX_I2S_CLKCFG_REL; + break; + + case SND_SOC_DAIFMT_IB_NF: + /* Positive bit clock, lrclk low on left word */ + clk_cfg |= EP93XX_I2S_CLKCFG_CKP; + clk_cfg &= ~EP93XX_I2S_CLKCFG_REL; + break; + + case SND_SOC_DAIFMT_IB_IF: + /* Positive bit clock, lrclk low on right word */ + clk_cfg |= EP93XX_I2S_CLKCFG_CKP | EP93XX_I2S_CLKCFG_REL; + break; + } + + /* Write new register values */ + ep93xx_i2s_write_reg(info, EP93XX_I2S_RXCLKCFG, clk_cfg); + ep93xx_i2s_write_reg(info, EP93XX_I2S_TXCLKCFG, clk_cfg); + ep93xx_i2s_write_reg(info, EP93XX_I2S_RXLINCTRLDATA, lin_ctrl); + ep93xx_i2s_write_reg(info, EP93XX_I2S_TXLINCTRLDATA, lin_ctrl); + return 0; +} + +static int ep93xx_i2s_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct ep93xx_i2s_info *info = cpu_dai->private_data; + unsigned word_len, div, sdiv, lrdiv; + int found = 0, err; + + switch (params_format(params)) { + case SNDRV_PCM_FORMAT_S16_LE: + word_len = EP93XX_I2S_WRDLEN_16; + break; + + case SNDRV_PCM_FORMAT_S24_LE: + word_len = EP93XX_I2S_WRDLEN_24; + break; + + case SNDRV_PCM_FORMAT_S32_LE: + word_len = EP93XX_I2S_WRDLEN_32; + break; + + default: + return -EINVAL; + } + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + ep93xx_i2s_write_reg(info, EP93XX_I2S_TXWRDLEN, word_len); + else + ep93xx_i2s_write_reg(info, EP93XX_I2S_RXWRDLEN, word_len); + + /* + * Calculate the sdiv (bit clock) and lrdiv (left/right clock) values. + * If the lrclk is pulse length is larger than the word size, then the + * bit clock will be gated for the unused bits. + */ + div = (clk_get_rate(info->mclk) / params_rate(params)) * + params_channels(params); + for (sdiv = 2; sdiv <= 4; sdiv += 2) + for (lrdiv = 32; lrdiv <= 128; lrdiv <<= 1) + if (sdiv * lrdiv == div) { + found = 1; + goto out; + } +out: + if (!found) + return -EINVAL; + + err = clk_set_rate(info->sclk, clk_get_rate(info->mclk) / sdiv); + if (err) + return err; + + err = clk_set_rate(info->lrclk, clk_get_rate(info->sclk) / lrdiv); + if (err) + return err; + + ep93xx_i2s_enable(info, substream->stream); + return 0; +} + +static int ep93xx_i2s_set_sysclk(struct snd_soc_dai *cpu_dai, int clk_id, + unsigned int freq, int dir) +{ + struct ep93xx_i2s_info *info = cpu_dai->private_data; + + if (dir == SND_SOC_CLOCK_IN || clk_id != 0) + return -EINVAL; + + return clk_set_rate(info->mclk, freq); +} + +#ifdef CONFIG_PM +static int ep93xx_i2s_suspend(struct snd_soc_dai *dai) +{ + struct ep93xx_i2s_info *info = dai->private_data; + + if (!dai->active) + return; + + ep93xx_i2s_disable(info, SNDRV_PCM_STREAM_PLAYBACK); + ep93xx_i2s_disable(info, SNDRV_PCM_STREAM_CAPTURE); +} + +static int ep93xx_i2s_resume(struct snd_soc_dai *dai) +{ + struct ep93xx_i2s_info *info = dai->private_data; + + if (!dai->active) + return; + + ep93xx_i2s_enable(info, SNDRV_PCM_STREAM_PLAYBACK); + ep93xx_i2s_enable(info, SNDRV_PCM_STREAM_CAPTURE); +} +#else +#define ep93xx_i2s_suspend NULL +#define ep93xx_i2s_resume NULL +#endif + +static struct snd_soc_dai_ops ep93xx_i2s_dai_ops = { + .startup = ep93xx_i2s_startup, + .shutdown = ep93xx_i2s_shutdown, + .hw_params = ep93xx_i2s_hw_params, + .set_sysclk = ep93xx_i2s_set_sysclk, + .set_fmt = ep93xx_i2s_set_dai_fmt, +}; + +#define EP93XX_I2S_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ + SNDRV_PCM_FMTBIT_S24_LE | \ + SNDRV_PCM_FMTBIT_S32_LE) + +struct snd_soc_dai ep93xx_i2s_dai = { + .name = "ep93xx-i2s", + .id = 0, + .symmetric_rates= 1, + .suspend = ep93xx_i2s_suspend, + .resume = ep93xx_i2s_resume, + .playback = { + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = EP93XX_I2S_FORMATS, + }, + .capture = { + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = EP93XX_I2S_FORMATS, + }, + .ops = &ep93xx_i2s_dai_ops, +}; +EXPORT_SYMBOL_GPL(ep93xx_i2s_dai); + +static int ep93xx_i2s_probe(struct platform_device *pdev) +{ + struct ep93xx_i2s_info *info; + struct resource *res; + int err; + + info = kzalloc(sizeof(struct ep93xx_i2s_info), GFP_KERNEL); + if (!info) { + err = -ENOMEM; + goto fail; + } + + ep93xx_i2s_dai.dev = &pdev->dev; + ep93xx_i2s_dai.private_data = info; + info->dma_params = ep93xx_i2s_dma_params; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + err = -ENODEV; + goto fail; + } + + info->mem = request_mem_region(res->start, resource_size(res), + pdev->name); + if (!info->mem) { + err = -EBUSY; + goto fail; + } + + info->regs = ioremap(info->mem->start, resource_size(info->mem)); + if (!info->regs) { + err = -ENXIO; + goto fail_release_mem; + } + + info->mclk = clk_get(&pdev->dev, "mclk"); + if (IS_ERR(info->mclk)) { + err = PTR_ERR(info->mclk); + goto fail_unmap_mem; + } + + info->sclk = clk_get(&pdev->dev, "sclk"); + if (IS_ERR(info->sclk)) { + err = PTR_ERR(info->sclk); + goto fail_put_mclk; + } + + info->lrclk = clk_get(&pdev->dev, "lrclk"); + if (IS_ERR(info->lrclk)) { + err = PTR_ERR(info->lrclk); + goto fail_put_sclk; + } + + err = snd_soc_register_dai(&ep93xx_i2s_dai); + if (err) + goto fail_put_lrclk; + + return 0; + +fail_put_lrclk: + clk_put(info->lrclk); +fail_put_sclk: + clk_put(info->sclk); +fail_put_mclk: + clk_put(info->mclk); +fail_unmap_mem: + iounmap(info->regs); +fail_release_mem: + release_mem_region(info->mem->start, resource_size(info->mem)); + kfree(info); +fail: + return err; +} + +static int __devexit ep93xx_i2s_remove(struct platform_device *pdev) +{ + struct ep93xx_i2s_info *info = ep93xx_i2s_dai.private_data; + + snd_soc_unregister_dai(&ep93xx_i2s_dai); + clk_put(info->lrclk); + clk_put(info->sclk); + clk_put(info->mclk); + iounmap(info->regs); + release_mem_region(info->mem->start, resource_size(info->mem)); + kfree(info); + return 0; +} + +static struct platform_driver ep93xx_i2s_driver = { + .probe = ep93xx_i2s_probe, + .remove = __devexit_p(ep93xx_i2s_remove), + .driver = { + .name = "ep93xx-i2s", + .owner = THIS_MODULE, + }, +}; + +static int __init ep93xx_i2s_init(void) +{ + return platform_driver_register(&ep93xx_i2s_driver); +} + +static void __exit ep93xx_i2s_exit(void) +{ + platform_driver_unregister(&ep93xx_i2s_driver); +} + +module_init(ep93xx_i2s_init); +module_exit(ep93xx_i2s_exit); + +MODULE_ALIAS("platform:ep93xx-i2s"); +MODULE_AUTHOR("Ryan Mallon "); +MODULE_DESCRIPTION("EP93XX I2S driver"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/ep93xx/ep93xx-i2s.h b/sound/soc/ep93xx/ep93xx-i2s.h new file mode 100644 index 000000000000..3bd4ebfaa1de --- /dev/null +++ b/sound/soc/ep93xx/ep93xx-i2s.h @@ -0,0 +1,18 @@ +/* + * linux/sound/soc/ep93xx-i2s.h + * EP93xx I2S driver + * + * Copyright (C) 2010 Ryan Mallon + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#ifndef _EP93XX_SND_SOC_I2S_H +#define _EP93XX_SND_SOC_I2S_H + +extern struct snd_soc_dai ep93xx_i2s_dai; + +#endif /* _EP93XX_SND_SOC_I2S_H */ diff --git a/sound/soc/ep93xx/ep93xx-pcm.c b/sound/soc/ep93xx/ep93xx-pcm.c new file mode 100644 index 000000000000..4ba938400791 --- /dev/null +++ b/sound/soc/ep93xx/ep93xx-pcm.c @@ -0,0 +1,319 @@ +/* + * linux/sound/arm/ep93xx-pcm.c - EP93xx ALSA PCM interface + * + * Copyright (C) 2006 Lennert Buytenhek + * Copyright (C) 2006 Applied Data Systems + * + * Rewritten for the SoC audio subsystem (Based on PXA2xx code): + * Copyright (c) 2008 Ryan Mallon + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include "ep93xx-pcm.h" + +static const struct snd_pcm_hardware ep93xx_pcm_hardware = { + .info = (SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_MMAP_VALID | + SNDRV_PCM_INFO_INTERLEAVED | + SNDRV_PCM_INFO_BLOCK_TRANSFER), + + .rates = SNDRV_PCM_RATE_8000_48000, + .rate_min = SNDRV_PCM_RATE_8000, + .rate_max = SNDRV_PCM_RATE_48000, + + .formats = (SNDRV_PCM_FMTBIT_S16_LE | + SNDRV_PCM_FMTBIT_S24_LE | + SNDRV_PCM_FMTBIT_S32_LE), + + .buffer_bytes_max = 131072, + .period_bytes_min = 32, + .period_bytes_max = 32768, + .periods_min = 1, + .periods_max = 32, + .fifo_size = 32, +}; + +struct ep93xx_runtime_data +{ + struct ep93xx_dma_m2p_client cl; + struct ep93xx_pcm_dma_params *params; + int pointer_bytes; + struct tasklet_struct period_tasklet; + int periods; + struct ep93xx_dma_buffer buf[32]; +}; + +static void ep93xx_pcm_period_elapsed(unsigned long data) +{ + struct snd_pcm_substream *substream = (struct snd_pcm_substream *)data; + snd_pcm_period_elapsed(substream); +} + +static void ep93xx_pcm_buffer_started(void *cookie, + struct ep93xx_dma_buffer *buf) +{ +} + +static void ep93xx_pcm_buffer_finished(void *cookie, + struct ep93xx_dma_buffer *buf, + int bytes, int error) +{ + struct snd_pcm_substream *substream = cookie; + struct ep93xx_runtime_data *rtd = substream->runtime->private_data; + + if (buf == rtd->buf + rtd->periods - 1) + rtd->pointer_bytes = 0; + else + rtd->pointer_bytes += buf->size; + + if (!error) { + ep93xx_dma_m2p_submit_recursive(&rtd->cl, buf); + tasklet_schedule(&rtd->period_tasklet); + } else { + snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN); + } +} + +static int ep93xx_pcm_open(struct snd_pcm_substream *substream) +{ + struct snd_soc_pcm_runtime *soc_rtd = substream->private_data; + struct snd_soc_dai *cpu_dai = soc_rtd->dai->cpu_dai; + struct ep93xx_pcm_dma_params *dma_params; + struct ep93xx_runtime_data *rtd; + int ret; + + dma_params = snd_soc_dai_get_dma_data(cpu_dai, substream); + snd_soc_set_runtime_hwparams(substream, &ep93xx_pcm_hardware); + + rtd = kmalloc(sizeof(*rtd), GFP_KERNEL); + if (!rtd) + return -ENOMEM; + + memset(&rtd->period_tasklet, 0, sizeof(rtd->period_tasklet)); + rtd->period_tasklet.func = ep93xx_pcm_period_elapsed; + rtd->period_tasklet.data = (unsigned long)substream; + + rtd->cl.name = dma_params->name; + rtd->cl.flags = dma_params->dma_port | EP93XX_DMA_M2P_IGNORE_ERROR | + ((substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? + EP93XX_DMA_M2P_TX : EP93XX_DMA_M2P_RX); + rtd->cl.cookie = substream; + rtd->cl.buffer_started = ep93xx_pcm_buffer_started; + rtd->cl.buffer_finished = ep93xx_pcm_buffer_finished; + ret = ep93xx_dma_m2p_client_register(&rtd->cl); + if (ret < 0) { + kfree(rtd); + return ret; + } + + substream->runtime->private_data = rtd; + return 0; +} + +static int ep93xx_pcm_close(struct snd_pcm_substream *substream) +{ + struct ep93xx_runtime_data *rtd = substream->runtime->private_data; + + ep93xx_dma_m2p_client_unregister(&rtd->cl); + kfree(rtd); + return 0; +} + +static int ep93xx_pcm_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct ep93xx_runtime_data *rtd = runtime->private_data; + size_t totsize = params_buffer_bytes(params); + size_t period = params_period_bytes(params); + int i; + + snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); + runtime->dma_bytes = totsize; + + rtd->periods = (totsize + period - 1) / period; + for (i = 0; i < rtd->periods; i++) { + rtd->buf[i].bus_addr = runtime->dma_addr + (i * period); + rtd->buf[i].size = period; + if ((i + 1) * period > totsize) + rtd->buf[i].size = totsize - (i * period); + } + + return 0; +} + +static int ep93xx_pcm_hw_free(struct snd_pcm_substream *substream) +{ + snd_pcm_set_runtime_buffer(substream, NULL); + return 0; +} + +static int ep93xx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) +{ + struct ep93xx_runtime_data *rtd = substream->runtime->private_data; + int ret; + int i; + + ret = 0; + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + rtd->pointer_bytes = 0; + for (i = 0; i < rtd->periods; i++) + ep93xx_dma_m2p_submit(&rtd->cl, rtd->buf + i); + break; + + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + ep93xx_dma_m2p_flush(&rtd->cl); + break; + + default: + ret = -EINVAL; + break; + } + + return ret; +} + +static snd_pcm_uframes_t ep93xx_pcm_pointer(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct ep93xx_runtime_data *rtd = substream->runtime->private_data; + + /* FIXME: implement this with sub-period granularity */ + return bytes_to_frames(runtime, rtd->pointer_bytes); +} + +static int ep93xx_pcm_mmap(struct snd_pcm_substream *substream, + struct vm_area_struct *vma) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + + return dma_mmap_writecombine(substream->pcm->card->dev, vma, + runtime->dma_area, + runtime->dma_addr, + runtime->dma_bytes); +} + +static struct snd_pcm_ops ep93xx_pcm_ops = { + .open = ep93xx_pcm_open, + .close = ep93xx_pcm_close, + .ioctl = snd_pcm_lib_ioctl, + .hw_params = ep93xx_pcm_hw_params, + .hw_free = ep93xx_pcm_hw_free, + .trigger = ep93xx_pcm_trigger, + .pointer = ep93xx_pcm_pointer, + .mmap = ep93xx_pcm_mmap, +}; + +static int ep93xx_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream) +{ + struct snd_pcm_substream *substream = pcm->streams[stream].substream; + struct snd_dma_buffer *buf = &substream->dma_buffer; + size_t size = ep93xx_pcm_hardware.buffer_bytes_max; + + buf->dev.type = SNDRV_DMA_TYPE_DEV; + buf->dev.dev = pcm->card->dev; + buf->private_data = NULL; + buf->area = dma_alloc_writecombine(pcm->card->dev, size, + &buf->addr, GFP_KERNEL); + buf->bytes = size; + + return (buf->area == NULL) ? -ENOMEM : 0; +} + +static void ep93xx_pcm_free_dma_buffers(struct snd_pcm *pcm) +{ + struct snd_pcm_substream *substream; + struct snd_dma_buffer *buf; + int stream; + + for (stream = 0; stream < 2; stream++) { + substream = pcm->streams[stream].substream; + if (!substream) + continue; + + buf = &substream->dma_buffer; + if (!buf->area) + continue; + + dma_free_writecombine(pcm->card->dev, buf->bytes, buf->area, + buf->addr); + buf->area = NULL; + } +} + +static u64 ep93xx_pcm_dmamask = 0xffffffff; + +static int ep93xx_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, + struct snd_pcm *pcm) +{ + int ret = 0; + + if (!card->dev->dma_mask) + card->dev->dma_mask = &ep93xx_pcm_dmamask; + if (!card->dev->coherent_dma_mask) + card->dev->coherent_dma_mask = 0xffffffff; + + if (dai->playback.channels_min) { + ret = ep93xx_pcm_preallocate_dma_buffer(pcm, + SNDRV_PCM_STREAM_PLAYBACK); + if (ret) + return ret; + } + + if (dai->capture.channels_min) { + ret = ep93xx_pcm_preallocate_dma_buffer(pcm, + SNDRV_PCM_STREAM_CAPTURE); + if (ret) + return ret; + } + + return 0; +} + +struct snd_soc_platform ep93xx_soc_platform = { + .name = "ep93xx-audio", + .pcm_ops = &ep93xx_pcm_ops, + .pcm_new = &ep93xx_pcm_new, + .pcm_free = &ep93xx_pcm_free_dma_buffers, +}; +EXPORT_SYMBOL_GPL(ep93xx_soc_platform); + +static int __init ep93xx_soc_platform_init(void) +{ + return snd_soc_register_platform(&ep93xx_soc_platform); +} + +static void __exit ep93xx_soc_platform_exit(void) +{ + snd_soc_unregister_platform(&ep93xx_soc_platform); +} + +module_init(ep93xx_soc_platform_init); +module_exit(ep93xx_soc_platform_exit); + +MODULE_AUTHOR("Ryan Mallon "); +MODULE_DESCRIPTION("EP93xx ALSA PCM interface"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/ep93xx/ep93xx-pcm.h b/sound/soc/ep93xx/ep93xx-pcm.h new file mode 100644 index 000000000000..4ffdd3f62fe9 --- /dev/null +++ b/sound/soc/ep93xx/ep93xx-pcm.h @@ -0,0 +1,22 @@ +/* + * sound/soc/ep93xx/ep93xx-pcm.h - EP93xx ALSA PCM interface + * + * Copyright (C) 2006 Lennert Buytenhek + * Copyright (C) 2006 Applied Data Systems + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _EP93XX_SND_SOC_PCM_H +#define _EP93XX_SND_SOC_PCM_H + +struct ep93xx_pcm_dma_params { + char *name; + int dma_port; +}; + +extern struct snd_soc_platform ep93xx_soc_platform; + +#endif /* _EP93XX_SND_SOC_PCM_H */ -- cgit v1.2.3 From 911ff689ff9af626cd072fd0fc95ef33f2f722dc Mon Sep 17 00:00:00 2001 From: Wan ZongShun Date: Mon, 7 Jun 2010 15:03:40 +0200 Subject: ASoC: atmel: trivial code cleanup Remove break after return, it is not needed. Signed-off-by: Wan ZongShun Signed-off-by: Nicolas Ferre Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/atmel/atmel_ssc_dai.c | 1 - 1 file changed, 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c index 0b59806905d1..c85844d4845b 100644 --- a/sound/soc/atmel/atmel_ssc_dai.c +++ b/sound/soc/atmel/atmel_ssc_dai.c @@ -549,7 +549,6 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, printk(KERN_WARNING "atmel_ssc_dai: unsupported DAI format 0x%x\n", ssc_p->daifmt); return -EINVAL; - break; } pr_debug("atmel_ssc_hw_params: " "RCMR=%08x RFMR=%08x TCMR=%08x TFMR=%08x\n", -- cgit v1.2.3 From 04c09a15f5c3a1f468cb8daf570eec3af21940ed Mon Sep 17 00:00:00 2001 From: Wan ZongShun Date: Wed, 2 Jun 2010 16:03:39 +0800 Subject: ASoC: patch for the useless 'break' removal in kirkwood This patch to remove the 'break;', when the 'switch' jumps to the 'default' branch, the 'return -EINVAL' will be return with a error number, so the 'break;' code never be run, it is unuseful and should be removed here. Signed-off-by: Wan ZongShun Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/kirkwood/kirkwood-i2s.c | 1 - 1 file changed, 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c index 0adc59778d5a..0fdc7db7a469 100644 --- a/sound/soc/kirkwood/kirkwood-i2s.c +++ b/sound/soc/kirkwood/kirkwood-i2s.c @@ -296,7 +296,6 @@ static int kirkwood_i2s_rec_trigger(struct snd_pcm_substream *substream, default: return -EINVAL; - break; } return 0; -- cgit v1.2.3 From 315f7da6314e01322cae8bce9a90850060c041ea Mon Sep 17 00:00:00 2001 From: Ryan Mallon Date: Tue, 8 Jun 2010 22:01:12 +1200 Subject: ASoC: EP93xx: Add Snapper CL15 i2s audio support Add support for i2s audio on Bluewater Systems Snapper CL15 module Signed-off-by: Ryan Mallon Acked-by: H Hartley Sweeten Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/ep93xx/Kconfig | 9 +++ sound/soc/ep93xx/Makefile | 3 + sound/soc/ep93xx/snappercl15.c | 150 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 162 insertions(+) create mode 100644 sound/soc/ep93xx/snappercl15.c (limited to 'sound') diff --git a/sound/soc/ep93xx/Kconfig b/sound/soc/ep93xx/Kconfig index ba66ac8e1419..f617f560f46b 100644 --- a/sound/soc/ep93xx/Kconfig +++ b/sound/soc/ep93xx/Kconfig @@ -7,3 +7,12 @@ config SND_EP93XX_SOC config SND_EP93XX_SOC_I2S tristate + +config SND_EP93XX_SOC_SNAPPERCL15 + tristate "SoC Audio support for Bluewater Systems Snapper CL15 module" + depends on SND_EP93XX_SOC && MACH_SNAPPER_CL15 + select SND_EP93XX_SOC_I2S + select SND_SOC_TLV320AIC23 + help + Say Y or M here if you want to add support for I2S audio on the + Bluewater Systems Snapper CL15 module. diff --git a/sound/soc/ep93xx/Makefile b/sound/soc/ep93xx/Makefile index 0239da36cea3..272e60f57b9a 100644 --- a/sound/soc/ep93xx/Makefile +++ b/sound/soc/ep93xx/Makefile @@ -6,3 +6,6 @@ obj-$(CONFIG_SND_EP93XX_SOC) += snd-soc-ep93xx.o obj-$(CONFIG_SND_EP93XX_SOC_I2S) += snd-soc-ep93xx-i2s.o # EP93XX Machine Support +snd-soc-snappercl15-objs := snappercl15.o + +obj-$(CONFIG_SND_EP93XX_SOC_SNAPPERCL15) += snd-soc-snappercl15.o diff --git a/sound/soc/ep93xx/snappercl15.c b/sound/soc/ep93xx/snappercl15.c new file mode 100644 index 000000000000..64955340ff75 --- /dev/null +++ b/sound/soc/ep93xx/snappercl15.c @@ -0,0 +1,150 @@ +/* + * snappercl15.c -- SoC audio for Bluewater Systems Snapper CL15 module + * + * Copyright (C) 2008 Bluewater Systems Ltd + * Author: Ryan Mallon + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include +#include +#include + +#include +#include + +#include "../codecs/tlv320aic23.h" +#include "ep93xx-pcm.h" +#include "ep93xx-i2s.h" + +#define CODEC_CLOCK 5644800 + +static int snappercl15_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + int err; + + err = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_IF | + SND_SOC_DAIFMT_CBS_CFS); + + err = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_IF | + SND_SOC_DAIFMT_CBS_CFS); + if (err) + return err; + + err = snd_soc_dai_set_sysclk(codec_dai, 0, CODEC_CLOCK, + SND_SOC_CLOCK_IN); + if (err) + return err; + + err = snd_soc_dai_set_sysclk(cpu_dai, 0, CODEC_CLOCK, + SND_SOC_CLOCK_OUT); + if (err) + return err; + + return 0; +} + +static struct snd_soc_ops snappercl15_ops = { + .hw_params = snappercl15_hw_params, +}; + +static const struct snd_soc_dapm_widget tlv320aic23_dapm_widgets[] = { + SND_SOC_DAPM_HP("Headphone Jack", NULL), + SND_SOC_DAPM_LINE("Line In", NULL), + SND_SOC_DAPM_MIC("Mic Jack", NULL), +}; + +static const struct snd_soc_dapm_route audio_map[] = { + {"Headphone Jack", NULL, "LHPOUT"}, + {"Headphone Jack", NULL, "RHPOUT"}, + + {"LLINEIN", NULL, "Line In"}, + {"RLINEIN", NULL, "Line In"}, + + {"MICIN", NULL, "Mic Jack"}, +}; + +static int snappercl15_tlv320aic23_init(struct snd_soc_codec *codec) +{ + snd_soc_dapm_new_controls(codec, tlv320aic23_dapm_widgets, + ARRAY_SIZE(tlv320aic23_dapm_widgets)); + + snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map)); + return 0; +} + +static struct snd_soc_dai_link snappercl15_dai = { + .name = "tlv320aic23", + .stream_name = "AIC23", + .cpu_dai = &ep93xx_i2s_dai, + .codec_dai = &tlv320aic23_dai, + .init = snappercl15_tlv320aic23_init, + .ops = &snappercl15_ops, +}; + +static struct snd_soc_card snd_soc_snappercl15 = { + .name = "Snapper CL15", + .platform = &ep93xx_soc_platform, + .dai_link = &snappercl15_dai, + .num_links = 1, +}; + +static struct snd_soc_device snappercl15_snd_devdata = { + .card = &snd_soc_snappercl15, + .codec_dev = &soc_codec_dev_tlv320aic23, +}; + +static struct platform_device *snappercl15_snd_device; + +static int __init snappercl15_init(void) +{ + int ret; + + if (!machine_is_snapper_cl15()) + return -ENODEV; + + ret = ep93xx_i2s_acquire(EP93XX_SYSCON_DEVCFG_I2SONAC97, + EP93XX_SYSCON_I2SCLKDIV_ORIDE | + EP93XX_SYSCON_I2SCLKDIV_SPOL); + if (ret) + return ret; + + snappercl15_snd_device = platform_device_alloc("soc-audio", -1); + if (!snappercl15_snd_device) + return -ENOMEM; + + platform_set_drvdata(snappercl15_snd_device, &snappercl15_snd_devdata); + snappercl15_snd_devdata.dev = &snappercl15_snd_device->dev; + ret = platform_device_add(snappercl15_snd_device); + if (ret) + platform_device_put(snappercl15_snd_device); + + return ret; +} + +static void __exit snappercl15_exit(void) +{ + platform_device_unregister(snappercl15_snd_device); + ep93xx_i2s_release(); +} + +module_init(snappercl15_init); +module_exit(snappercl15_exit); + +MODULE_AUTHOR("Ryan Mallon "); +MODULE_DESCRIPTION("ALSA SoC Snapper CL15"); +MODULE_LICENSE("GPL"); + -- cgit v1.2.3 From 019afb581a61fcd899ae83527744e4f420e89bf1 Mon Sep 17 00:00:00 2001 From: Wan ZongShun Date: Thu, 10 Jun 2010 10:40:40 +0800 Subject: ASoC: NUC900: patch for fix build error This patch is to change 'auido.h' to 'audio.h' for fixing nuc900 alsa driver build error. Signed-off-by: Wan ZongShun Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/nuc900/nuc900-audio.c | 2 +- sound/soc/nuc900/nuc900-pcm.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/nuc900/nuc900-audio.c b/sound/soc/nuc900/nuc900-audio.c index b33d5b844d71..72e6f518f7b2 100644 --- a/sound/soc/nuc900/nuc900-audio.c +++ b/sound/soc/nuc900/nuc900-audio.c @@ -21,7 +21,7 @@ #include #include "../codecs/ac97.h" -#include "nuc900-auido.h" +#include "nuc900-audio.h" static struct snd_soc_dai_link nuc900evb_ac97_dai = { .name = "AC97", diff --git a/sound/soc/nuc900/nuc900-pcm.c b/sound/soc/nuc900/nuc900-pcm.c index 445a18011d8e..e81e803b3a63 100644 --- a/sound/soc/nuc900/nuc900-pcm.c +++ b/sound/soc/nuc900/nuc900-pcm.c @@ -23,7 +23,7 @@ #include -#include "nuc900-auido.h" +#include "nuc900-audio.h" static const struct snd_pcm_hardware nuc900_pcm_hardware = { .info = SNDRV_PCM_INFO_INTERLEAVED | -- cgit v1.2.3 From 4e8680f56b557195d6f73df760d46c02ec3089c9 Mon Sep 17 00:00:00 2001 From: Grant Likely Date: Thu, 10 Jun 2010 17:54:13 -0600 Subject: ASoC: Remove unused header from MPC5200 PSC driver The header contains an extern that isn't used by anything. Remove. Signed-off-by: Grant Likely Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/fsl/mpc5200_psc_i2s.c | 1 - sound/soc/fsl/mpc5200_psc_i2s.h | 12 ------------ 2 files changed, 13 deletions(-) delete mode 100644 sound/soc/fsl/mpc5200_psc_i2s.h (limited to 'sound') diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_psc_i2s.c index 4f455bd6851f..676841cbae98 100644 --- a/sound/soc/fsl/mpc5200_psc_i2s.c +++ b/sound/soc/fsl/mpc5200_psc_i2s.c @@ -16,7 +16,6 @@ #include -#include "mpc5200_psc_i2s.h" #include "mpc5200_dma.h" /** diff --git a/sound/soc/fsl/mpc5200_psc_i2s.h b/sound/soc/fsl/mpc5200_psc_i2s.h deleted file mode 100644 index ce55e070fdf3..000000000000 --- a/sound/soc/fsl/mpc5200_psc_i2s.h +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Freescale MPC5200 PSC in I2S mode - * ALSA SoC Digital Audio Interface (DAI) driver - * - */ - -#ifndef __SOUND_SOC_FSL_MPC52xx_PSC_I2S_H__ -#define __SOUND_SOC_FSL_MPC52xx_PSC_I2S_H__ - -extern struct snd_soc_dai psc_i2s_dai[]; - -#endif /* __SOUND_SOC_FSL_MPC52xx_PSC_I2S_H__ */ -- cgit v1.2.3 From 8600d700c082a10c24188da75bce16726826632b Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Tue, 15 Jun 2010 10:33:01 +0900 Subject: ASoC: header cleanup for FSI Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/sh/fsi.c | 9 --------- 1 file changed, 9 deletions(-) (limited to 'sound') diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index 3396a0db06ba..30765ab512f6 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c @@ -12,21 +12,12 @@ * published by the Free Software Foundation. */ -#include -#include -#include #include -#include #include #include #include -#include -#include -#include #include -#include #include -#include #define DO_FMT 0x0000 #define DOFF_CTL 0x0004 -- cgit v1.2.3 From 6c8abb49870328f242123d702da07c32f8a4d09a Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Tue, 15 Jun 2010 10:33:09 +0900 Subject: ASoC: header cleanup for FSI-AK4642 Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/sh/fsi-ak4642.c | 9 --------- 1 file changed, 9 deletions(-) (limited to 'sound') diff --git a/sound/soc/sh/fsi-ak4642.c b/sound/soc/sh/fsi-ak4642.c index be018542314e..2871a200160c 100644 --- a/sound/soc/sh/fsi-ak4642.c +++ b/sound/soc/sh/fsi-ak4642.c @@ -9,16 +9,7 @@ * for more details. */ -#include -#include #include -#include -#include -#include -#include -#include -#include - #include #include <../sound/soc/codecs/ak4642.h> -- cgit v1.2.3 From c3be0af3d06cb68a8aa3781360c77474fb232ea1 Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Tue, 15 Jun 2010 10:33:14 +0900 Subject: ASoC: header cleanup for FSI-DA7210 Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/sh/fsi-da7210.c | 9 --------- 1 file changed, 9 deletions(-) (limited to 'sound') diff --git a/sound/soc/sh/fsi-da7210.c b/sound/soc/sh/fsi-da7210.c index 33b4d177f466..4d4fd777b45a 100644 --- a/sound/soc/sh/fsi-da7210.c +++ b/sound/soc/sh/fsi-da7210.c @@ -10,16 +10,7 @@ * option) any later version. */ -#include #include -#include -#include -#include -#include -#include -#include -#include - #include #include "../codecs/da7210.h" -- cgit v1.2.3 From 3367e452d9ebaecdaae6b64090ec7726ee876111 Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Tue, 15 Jun 2010 10:33:20 +0900 Subject: ASoC: header cleanup for ak4642 Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/ak4642.c | 8 -------- 1 file changed, 8 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 7528a54102b5..8d56811c7306 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -22,18 +22,10 @@ * AK4643 is tested. */ -#include -#include -#include #include -#include #include #include #include -#include -#include -#include -#include #include #include -- cgit v1.2.3 From 1a01eff1b2294dce56af1ae0b98f7d1be1327a76 Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Tue, 15 Jun 2010 10:33:26 +0900 Subject: ASoC: header cleanup for da7210 Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/da7210.c | 9 --------- 1 file changed, 9 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/da7210.c b/sound/soc/codecs/da7210.c index 75af2d6e0e78..a83aa187a7f2 100644 --- a/sound/soc/codecs/da7210.c +++ b/sound/soc/codecs/da7210.c @@ -15,23 +15,14 @@ * option) any later version. */ -#include -#include -#include -#include #include -#include #include #include #include -#include #include #include -#include #include -#include #include -#include #include "da7210.h" -- cgit v1.2.3 From e71fa370428aa80e3acc3a49f8df1e76e7719347 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Tue, 15 Jun 2010 15:14:00 +0100 Subject: ASoC: Default WM2000 ANC and speaker to enabled The most useful configuration for the WM2000 is to enable the ANC so turn that on by default, and since we're not reflecting chip default state also enable the speaker output by default. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm2000.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'sound') diff --git a/sound/soc/codecs/wm2000.c b/sound/soc/codecs/wm2000.c index 002e289d1255..4bcd168794e1 100644 --- a/sound/soc/codecs/wm2000.c +++ b/sound/soc/codecs/wm2000.c @@ -795,6 +795,8 @@ static int __devinit wm2000_i2c_probe(struct i2c_client *i2c, dev_set_drvdata(&i2c->dev, wm2000); wm2000->anc_eng_ena = 1; + wm2000->anc_active = 1; + wm2000->spk_ena = 1; wm2000->i2c = i2c; wm2000_reset(wm2000); -- cgit v1.2.3 From f1df5aec68946e427eb4884c4d80e3259361478c Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Tue, 15 Jun 2010 15:14:31 +0100 Subject: ASoC: Pay attention to write errors in volsw_2r_sx Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/soc-core.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 254dd1c6914d..26f17323ef19 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -2433,14 +2433,12 @@ int snd_soc_put_volsw_2r_sx(struct snd_kcontrol *kcontrol, if (oval != val) { ret = snd_soc_write(codec, mc->reg, val); if (ret < 0) - return 0; - ret = 1; + return ret; } if (ovalr != valr) { ret = snd_soc_write(codec, mc->rreg, valr); if (ret < 0) - return 0; - ret = 1; + return ret; } return 0; -- cgit v1.2.3 From 66517915e0954ee027b889f452511945f7a9f3ec Mon Sep 17 00:00:00 2001 From: Peter Huewe Date: Tue, 15 Jun 2010 17:38:55 +0200 Subject: ASoC: Fix I2C dependency for SND_FSI_AK4642 and SND_FSI_DA7210 The config option SND_FSI_AK4642 selects SND_SOC_AK4642 which in turn enables the compilation of ak4642.c - however this codec uses I2C to communicate with the HW. Same applies to DA7210. Consequently when I2C is not set, the compilation fails [1] This patch fixes this issues, by adding a depencdency on the related HW- controller. Signed-off-by: Peter Huewe Signed-off-by: Mark Brown --- sound/soc/sh/Kconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/sh/Kconfig b/sound/soc/sh/Kconfig index a1d14bc3c76f..52d7e8ed9c1f 100644 --- a/sound/soc/sh/Kconfig +++ b/sound/soc/sh/Kconfig @@ -48,7 +48,7 @@ config SND_SH7760_AC97 config SND_FSI_AK4642 bool "FSI-AK4642 sound support" - depends on SND_SOC_SH4_FSI + depends on SND_SOC_SH4_FSI && I2C_SH_MOBILE select SND_SOC_AK4642 help This option enables generic sound support for the @@ -56,7 +56,7 @@ config SND_FSI_AK4642 config SND_FSI_DA7210 bool "FSI-DA7210 sound support" - depends on SND_SOC_SH4_FSI + depends on SND_SOC_SH4_FSI && I2C_SH_MOBILE select SND_SOC_DA7210 help This option enables generic sound support for the -- cgit v1.2.3 From 421f91d21ad6f799dc7b489bb33cc560ccc56f98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Fri, 11 Jun 2010 12:17:00 +0200 Subject: fix typos concerning "initiali[zs]e" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Uwe Kleine-König Signed-off-by: Jiri Kosina --- sound/pci/trident/trident_main.c | 2 +- sound/soc/fsl/mpc8610_hpcd.c | 2 +- sound/soc/soc-core.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/pci/trident/trident_main.c b/sound/pci/trident/trident_main.c index 6d943f6f6b70..2870a4fdc130 100644 --- a/sound/pci/trident/trident_main.c +++ b/sound/pci/trident/trident_main.c @@ -1055,7 +1055,7 @@ static int snd_trident_capture_prepare(struct snd_pcm_substream *substream) spin_lock_irq(&trident->reg_lock); - // Initilize the channel and set channel Mode + // Initialize the channel and set channel Mode outb(0, TRID_REG(trident, LEGACY_DMAR15)); // Set DMA channel operation mode register diff --git a/sound/soc/fsl/mpc8610_hpcd.c b/sound/soc/fsl/mpc8610_hpcd.c index 83de1c81c8c4..604a91fa31bc 100644 --- a/sound/soc/fsl/mpc8610_hpcd.c +++ b/sound/soc/fsl/mpc8610_hpcd.c @@ -46,7 +46,7 @@ struct mpc8610_hpcd_data { }; /** - * mpc8610_hpcd_machine_probe: initalize the board + * mpc8610_hpcd_machine_probe: initialize the board * * This function is called when platform_device_add() is called. It is used * to initialize the board-specific hardware. diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 998569d60330..e048e0910099 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -1307,7 +1307,7 @@ cpu_dai_err: } /* - * Attempt to initialise any uninitalised cards. Must be called with + * Attempt to initialise any uninitialised cards. Must be called with * client_mutex. */ static void snd_soc_instantiate_cards(void) -- cgit v1.2.3 From c9ff921abecda352e987a6aae169118a3fc9aa5d Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Tue, 15 Jun 2010 17:26:28 +0300 Subject: ALSA: alsa: riptide: don't use own hex_to_bin() method Signed-off-by: Andy Shevchenko Signed-off-by: Takashi Iwai --- sound/pci/riptide/riptide.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'sound') diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c index ad4462677615..59d79962f236 100644 --- a/sound/pci/riptide/riptide.c +++ b/sound/pci/riptide/riptide.c @@ -97,6 +97,7 @@ #include #include #include +#include #include #include #include @@ -667,13 +668,12 @@ static u32 atoh(const unsigned char *in, unsigned int len) unsigned char c; while (len) { + int value; + c = in[len - 1]; - if ((c >= '0') && (c <= '9')) - sum += mult * (c - '0'); - else if ((c >= 'A') && (c <= 'F')) - sum += mult * (c - ('A' - 10)); - else if ((c >= 'a') && (c <= 'f')) - sum += mult * (c - ('a' - 10)); + value = hex_to_bin(c); + if (value >= 0) + sum += mult * value; mult *= 16; --len; } -- cgit v1.2.3 From f7154de220f14073ef0d76638f85e254ad2e202f Mon Sep 17 00:00:00 2001 From: Herton Ronaldo Krzesinski Date: Thu, 17 Jun 2010 14:15:06 -0300 Subject: ALSA: hda - add ideapad model for Conexant 5051 codec Lenovo IdeaPad Y430 has an additional subwoofer connected at pin 0x1b, which isn't muted when headphone is plugged in. This adds additional support to the extra subwoofer via new ideapad model. Signed-off-by: Herton Ronaldo Krzesinski Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_conexant.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 2bf2cb5da956..54f74191ebca 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -1632,6 +1632,11 @@ static void cxt5051_update_speaker(struct hda_codec *codec) pinctl = (!spec->hp_present && spec->cur_eapd) ? PIN_OUT : 0; snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pinctl); + /* on ideapad there is an aditional speaker (subwoofer) to mute */ + if (spec->ideapad) + snd_hda_codec_write(codec, 0x1b, 0, + AC_VERB_SET_PIN_WIDGET_CONTROL, + pinctl); } /* turn on/off EAPD (+ mute HP) as a master switch */ @@ -1888,6 +1893,13 @@ static void cxt5051_init_mic_port(struct hda_codec *codec, hda_nid_t nid, #endif } +static struct hda_verb cxt5051_ideapad_init_verbs[] = { + /* Subwoofer */ + {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, + {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, + { } /* end */ +}; + /* initialize jack-sensing, too */ static int cxt5051_init(struct hda_codec *codec) { @@ -1917,6 +1929,7 @@ enum { CXT5051_LENOVO_X200, /* Lenovo X200 laptop, also used for Advanced Mini Dock 250410 */ CXT5051_F700, /* HP Compaq Presario F700 */ CXT5051_TOSHIBA, /* Toshiba M300 & co */ + CXT5051_IDEAPAD, /* Lenovo IdeaPad Y430 */ CXT5051_MODELS }; @@ -1927,6 +1940,7 @@ static const char *cxt5051_models[CXT5051_MODELS] = { [CXT5051_LENOVO_X200] = "lenovo-x200", [CXT5051_F700] = "hp-700", [CXT5051_TOSHIBA] = "toshiba", + [CXT5051_IDEAPAD] = "ideapad", }; static struct snd_pci_quirk cxt5051_cfg_tbl[] = { @@ -1938,6 +1952,7 @@ static struct snd_pci_quirk cxt5051_cfg_tbl[] = { CXT5051_LAPTOP), SND_PCI_QUIRK(0x14f1, 0x5051, "HP Spartan 1.1", CXT5051_HP), SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo X200", CXT5051_LENOVO_X200), + SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo IdeaPad", CXT5051_IDEAPAD), {} }; @@ -1999,6 +2014,11 @@ static int patch_cxt5051(struct hda_codec *codec) spec->mixers[0] = cxt5051_toshiba_mixers; spec->auto_mic = AUTO_MIC_PORTB; break; + case CXT5051_IDEAPAD: + spec->init_verbs[spec->num_init_verbs++] = + cxt5051_ideapad_init_verbs; + spec->ideapad = 1; + break; } return 0; -- cgit v1.2.3 From 43793207fdcede490edf26a813a92b11ef434a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eric=20B=C3=A9nard?= Date: Thu, 17 Jun 2010 15:44:01 +0200 Subject: ASoC: eukrea-tlv320: add support for our i.MX25 board MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * tdm slot has to be configured to get sound working on i.MX25 Signed-off-by: Eric Bénard Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/imx/Kconfig | 2 +- sound/soc/imx/eukrea-tlv320.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/imx/Kconfig b/sound/soc/imx/Kconfig index 079b23bb0b03..6ef57e056d6a 100644 --- a/sound/soc/imx/Kconfig +++ b/sound/soc/imx/Kconfig @@ -31,7 +31,7 @@ config SND_SOC_PHYCORE_AC97 config SND_SOC_EUKREA_TLV320 bool "Eukrea TLV320" - depends on MACH_EUKREA_MBIMX27_BASEBOARD + depends on MACH_EUKREA_MBIMX27_BASEBOARD || MACH_EUKREA_MBIMXSD_BASEBOARD select SND_IMX_SOC select SND_SOC_TLV320AIC23 help diff --git a/sound/soc/imx/eukrea-tlv320.c b/sound/soc/imx/eukrea-tlv320.c index 968380a93e89..45f5e4b32cb5 100644 --- a/sound/soc/imx/eukrea-tlv320.c +++ b/sound/soc/imx/eukrea-tlv320.c @@ -60,6 +60,7 @@ static int eukrea_tlv320_hw_params(struct snd_pcm_substream *substream, pr_err("%s: failed setting codec sysclk\n", __func__); return ret; } + snd_soc_dai_set_tdm_slot(cpu_dai, 0xffffffc, 0xffffffc, 2, 0); ret = snd_soc_dai_set_sysclk(cpu_dai, IMX_SSP_SYS_CLK, 0, SND_SOC_CLOCK_IN); @@ -100,7 +101,7 @@ static int __init eukrea_tlv320_init(void) { int ret; - if (!machine_is_eukrea_cpuimx27()) + if (!machine_is_eukrea_cpuimx27() && !machine_is_eukrea_cpuimx25sd()) /* return happy. We might run on a totally different machine */ return 0; -- cgit v1.2.3 From 20630c7f5966419dd6a1f00b669a7771e228510a Mon Sep 17 00:00:00 2001 From: Stuart Longland Date: Fri, 18 Jun 2010 12:56:10 +1000 Subject: ASoC: Fix overflow bug in SOC_DOUBLE_R_SX_TLV When SX_TLV widgets are read, if the gain is set to a value below 0dB, the mixer control is erroniously read as being at maximum volume. The value read out of the CODEC register is never sign-extended, and when the minimum value is subtracted (read; added, since the minimum is negative) the result is a number greater than the maximum allowed value for the control, and hence it saturates. Solution: Mask the result so that it "wraps around", emulating sign-extension. Signed-off-by: Stuart Longland Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/soc-core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 26f17323ef19..8b79d90efdc1 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -2396,8 +2396,8 @@ int snd_soc_get_volsw_2r_sx(struct snd_kcontrol *kcontrol, int val = snd_soc_read(codec, mc->reg) & mask; int valr = snd_soc_read(codec, mc->rreg) & mask; - ucontrol->value.integer.value[0] = ((val & 0xff)-min); - ucontrol->value.integer.value[1] = ((valr & 0xff)-min); + ucontrol->value.integer.value[0] = ((val & 0xff)-min) & mask; + ucontrol->value.integer.value[1] = ((valr & 0xff)-min) & mask; return 0; } EXPORT_SYMBOL_GPL(snd_soc_get_volsw_2r_sx); -- cgit v1.2.3 From b45416656f55d880ab5a976be11bca720eff16c4 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Sun, 20 Jun 2010 14:05:46 +0100 Subject: ASoC: Fix sorting of DA7210 entries in Kconfig Signed-off-by: Mark Brown --- sound/soc/codecs/Kconfig | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index c37c84458b58..af81c28ba6f5 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -24,8 +24,8 @@ config SND_SOC_ALL_CODECS select SND_SOC_CQ0093VC if MFD_DAVINCI_VOICECODEC select SND_SOC_CS42L51 if I2C select SND_SOC_CS4270 if I2C - select SND_SOC_MAX9877 if I2C select SND_SOC_DA7210 if I2C + select SND_SOC_MAX9877 if I2C select SND_SOC_PCM3008 select SND_SOC_SPDIF select SND_SOC_SSM2602 if I2C @@ -128,9 +128,6 @@ config SND_SOC_CS42L51 config SND_SOC_CS4270 tristate -config SND_SOC_DA7210 - tristate - # Cirrus Logic CS4270 Codec VD = 3.3V Errata # Select if you are affected by the errata where the part will not function # if MCLK divide-by-1.5 is selected and VD is set to 3.3V. The driver will @@ -145,6 +142,9 @@ config SND_SOC_CX20442 config SND_SOC_L3 tristate +config SND_SOC_DA7210 + tristate + config SND_SOC_PCM3008 tristate -- cgit v1.2.3 From 4b94dba029887effd8675164e782cb12889668b1 Mon Sep 17 00:00:00 2001 From: Grazvydas Ignotas Date: Thu, 17 Jun 2010 16:45:28 +0300 Subject: ASoC: pandora: fix CLKX polarity After mass production started it was found that several boards exhibit noise problems during sound playback. After some investigation it was determined that CLKX polarity is set incorrectly, and even if most boards can tolerate the wrong setting, there are some that don't. Fix polarity setup in the board file. As the clock settings for input and output now match, merge in and out functions and structures to simplify code. Signed-off-by: Grazvydas Ignotas Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/omap/omap3pandora.c | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) (limited to 'sound') diff --git a/sound/soc/omap/omap3pandora.c b/sound/soc/omap/omap3pandora.c index 87ce842fa2e8..9eecac135bbb 100644 --- a/sound/soc/omap/omap3pandora.c +++ b/sound/soc/omap/omap3pandora.c @@ -43,12 +43,14 @@ static struct regulator *omap3pandora_dac_reg; -static int omap3pandora_cmn_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, unsigned int fmt) +static int omap3pandora_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + int fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBS_CFS; int ret; /* Set codec DAI configuration */ @@ -91,24 +93,6 @@ static int omap3pandora_cmn_hw_params(struct snd_pcm_substream *substream, return 0; } -static int omap3pandora_out_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - return omap3pandora_cmn_hw_params(substream, params, - SND_SOC_DAIFMT_I2S | - SND_SOC_DAIFMT_IB_NF | - SND_SOC_DAIFMT_CBS_CFS); -} - -static int omap3pandora_in_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - return omap3pandora_cmn_hw_params(substream, params, - SND_SOC_DAIFMT_I2S | - SND_SOC_DAIFMT_NB_NF | - SND_SOC_DAIFMT_CBS_CFS); -} - static int omap3pandora_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { @@ -231,12 +215,8 @@ static int omap3pandora_in_init(struct snd_soc_codec *codec) return snd_soc_dapm_sync(codec); } -static struct snd_soc_ops omap3pandora_out_ops = { - .hw_params = omap3pandora_out_hw_params, -}; - -static struct snd_soc_ops omap3pandora_in_ops = { - .hw_params = omap3pandora_in_hw_params, +static struct snd_soc_ops omap3pandora_ops = { + .hw_params = omap3pandora_hw_params, }; /* Digital audio interface glue - connects codec <--> CPU */ @@ -246,14 +226,14 @@ static struct snd_soc_dai_link omap3pandora_dai[] = { .stream_name = "HiFi Out", .cpu_dai = &omap_mcbsp_dai[0], .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI], - .ops = &omap3pandora_out_ops, + .ops = &omap3pandora_ops, .init = omap3pandora_out_init, }, { .name = "TWL4030", .stream_name = "Line/Mic In", .cpu_dai = &omap_mcbsp_dai[1], .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI], - .ops = &omap3pandora_in_ops, + .ops = &omap3pandora_ops, .init = omap3pandora_in_init, } }; -- cgit v1.2.3 From 11bd3dd1b7c299815dbedef0982220f239425ae8 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sat, 19 Jun 2010 16:50:37 +0200 Subject: ASoC: Add JZ4740 ASoC support This patch adds ASoC support for JZ4740 SoCs I2S module. Signed-off-by: Lars-Peter Clausen Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/Kconfig | 1 + sound/soc/Makefile | 1 + sound/soc/jz4740/Kconfig | 14 ++ sound/soc/jz4740/Makefile | 9 + sound/soc/jz4740/jz4740-i2s.c | 540 ++++++++++++++++++++++++++++++++++++++++++ sound/soc/jz4740/jz4740-i2s.h | 18 ++ sound/soc/jz4740/jz4740-pcm.c | 373 +++++++++++++++++++++++++++++ sound/soc/jz4740/jz4740-pcm.h | 22 ++ 8 files changed, 978 insertions(+) create mode 100644 sound/soc/jz4740/Kconfig create mode 100644 sound/soc/jz4740/Makefile create mode 100644 sound/soc/jz4740/jz4740-i2s.c create mode 100644 sound/soc/jz4740/jz4740-i2s.h create mode 100644 sound/soc/jz4740/jz4740-pcm.c create mode 100644 sound/soc/jz4740/jz4740-pcm.h (limited to 'sound') diff --git a/sound/soc/Kconfig b/sound/soc/Kconfig index d35f848db6b5..7137a9a09570 100644 --- a/sound/soc/Kconfig +++ b/sound/soc/Kconfig @@ -39,6 +39,7 @@ source "sound/soc/s3c24xx/Kconfig" source "sound/soc/s6000/Kconfig" source "sound/soc/sh/Kconfig" source "sound/soc/txx9/Kconfig" +source "sound/soc/jz4740/Kconfig" # Supported codecs source "sound/soc/codecs/Kconfig" diff --git a/sound/soc/Makefile b/sound/soc/Makefile index 97661b747b91..d13199978d36 100644 --- a/sound/soc/Makefile +++ b/sound/soc/Makefile @@ -17,3 +17,4 @@ obj-$(CONFIG_SND_SOC) += s3c24xx/ obj-$(CONFIG_SND_SOC) += s6000/ obj-$(CONFIG_SND_SOC) += sh/ obj-$(CONFIG_SND_SOC) += txx9/ +obj-$(CONFIG_SND_SOC) += jz4740/ diff --git a/sound/soc/jz4740/Kconfig b/sound/soc/jz4740/Kconfig new file mode 100644 index 000000000000..27480f204ee0 --- /dev/null +++ b/sound/soc/jz4740/Kconfig @@ -0,0 +1,14 @@ +config SND_JZ4740_SOC + tristate "SoC Audio for Ingenic JZ4740 SoC" + depends on MACH_JZ4740 && SND_SOC + help + Say Y or M if you want to add support for codecs attached to + the JZ4740 I2S interface. You will also need to select the audio + interfaces to support below. + +config SND_JZ4740_SOC_I2S + depends on SND_JZ4740_SOC + tristate "SoC Audio (I2S protocol) for Ingenic JZ4740 SoC" + help + Say Y if you want to use I2S protocol and I2S codec on Ingenic JZ4740 + based boards. diff --git a/sound/soc/jz4740/Makefile b/sound/soc/jz4740/Makefile new file mode 100644 index 000000000000..1be8d192d23f --- /dev/null +++ b/sound/soc/jz4740/Makefile @@ -0,0 +1,9 @@ +# +# Jz4740 Platform Support +# +snd-soc-jz4740-objs := jz4740-pcm.o +snd-soc-jz4740-i2s-objs := jz4740-i2s.o + +obj-$(CONFIG_SND_JZ4740_SOC) += snd-soc-jz4740.o +obj-$(CONFIG_SND_JZ4740_SOC_I2S) += snd-soc-jz4740-i2s.o + diff --git a/sound/soc/jz4740/jz4740-i2s.c b/sound/soc/jz4740/jz4740-i2s.c new file mode 100644 index 000000000000..eb518f0c5e01 --- /dev/null +++ b/sound/soc/jz4740/jz4740-i2s.c @@ -0,0 +1,540 @@ +/* + * Copyright (C) 2010, Lars-Peter Clausen + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include "jz4740-i2s.h" +#include "jz4740-pcm.h" + +#define JZ_REG_AIC_CONF 0x00 +#define JZ_REG_AIC_CTRL 0x04 +#define JZ_REG_AIC_I2S_FMT 0x10 +#define JZ_REG_AIC_FIFO_STATUS 0x14 +#define JZ_REG_AIC_I2S_STATUS 0x1c +#define JZ_REG_AIC_CLK_DIV 0x30 +#define JZ_REG_AIC_FIFO 0x34 + +#define JZ_AIC_CONF_FIFO_RX_THRESHOLD_MASK (0xf << 12) +#define JZ_AIC_CONF_FIFO_TX_THRESHOLD_MASK (0xf << 8) +#define JZ_AIC_CONF_OVERFLOW_PLAY_LAST BIT(6) +#define JZ_AIC_CONF_INTERNAL_CODEC BIT(5) +#define JZ_AIC_CONF_I2S BIT(4) +#define JZ_AIC_CONF_RESET BIT(3) +#define JZ_AIC_CONF_BIT_CLK_MASTER BIT(2) +#define JZ_AIC_CONF_SYNC_CLK_MASTER BIT(1) +#define JZ_AIC_CONF_ENABLE BIT(0) + +#define JZ_AIC_CONF_FIFO_RX_THRESHOLD_OFFSET 12 +#define JZ_AIC_CONF_FIFO_TX_THRESHOLD_OFFSET 8 + +#define JZ_AIC_CTRL_OUTPUT_SAMPLE_SIZE_MASK (0x7 << 19) +#define JZ_AIC_CTRL_INPUT_SAMPLE_SIZE_MASK (0x7 << 16) +#define JZ_AIC_CTRL_ENABLE_RX_DMA BIT(15) +#define JZ_AIC_CTRL_ENABLE_TX_DMA BIT(14) +#define JZ_AIC_CTRL_MONO_TO_STEREO BIT(11) +#define JZ_AIC_CTRL_SWITCH_ENDIANNESS BIT(10) +#define JZ_AIC_CTRL_SIGNED_TO_UNSIGNED BIT(9) +#define JZ_AIC_CTRL_FLUSH BIT(8) +#define JZ_AIC_CTRL_ENABLE_ROR_INT BIT(6) +#define JZ_AIC_CTRL_ENABLE_TUR_INT BIT(5) +#define JZ_AIC_CTRL_ENABLE_RFS_INT BIT(4) +#define JZ_AIC_CTRL_ENABLE_TFS_INT BIT(3) +#define JZ_AIC_CTRL_ENABLE_LOOPBACK BIT(2) +#define JZ_AIC_CTRL_ENABLE_PLAYBACK BIT(1) +#define JZ_AIC_CTRL_ENABLE_CAPTURE BIT(0) + +#define JZ_AIC_CTRL_OUTPUT_SAMPLE_SIZE_OFFSET 19 +#define JZ_AIC_CTRL_INPUT_SAMPLE_SIZE_OFFSET 16 + +#define JZ_AIC_I2S_FMT_DISABLE_BIT_CLK BIT(12) +#define JZ_AIC_I2S_FMT_ENABLE_SYS_CLK BIT(4) +#define JZ_AIC_I2S_FMT_MSB BIT(0) + +#define JZ_AIC_I2S_STATUS_BUSY BIT(2) + +#define JZ_AIC_CLK_DIV_MASK 0xf + +struct jz4740_i2s { + struct resource *mem; + void __iomem *base; + dma_addr_t phys_base; + + struct clk *clk_aic; + struct clk *clk_i2s; + + struct jz4740_pcm_config pcm_config_playback; + struct jz4740_pcm_config pcm_config_capture; +}; + +static inline uint32_t jz4740_i2s_read(const struct jz4740_i2s *i2s, + unsigned int reg) +{ + return readl(i2s->base + reg); +} + +static inline void jz4740_i2s_write(const struct jz4740_i2s *i2s, + unsigned int reg, uint32_t value) +{ + writel(value, i2s->base + reg); +} + +static inline struct jz4740_i2s *jz4740_dai_to_i2s(struct snd_soc_dai *dai) +{ + return dai->private_data; +} + +static int jz4740_i2s_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + uint32_t conf, ctrl; + + if (dai->active) + return 0; + + ctrl = jz4740_i2s_read(i2s, JZ_REG_AIC_CTRL); + ctrl |= JZ_AIC_CTRL_FLUSH; + jz4740_i2s_write(i2s, JZ_REG_AIC_CTRL, ctrl); + + clk_enable(i2s->clk_i2s); + + conf = jz4740_i2s_read(i2s, JZ_REG_AIC_CONF); + conf |= JZ_AIC_CONF_ENABLE; + jz4740_i2s_write(i2s, JZ_REG_AIC_CONF, conf); + + return 0; +} + +static void jz4740_i2s_shutdown(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + uint32_t conf; + + if (!dai->active) + return; + + conf = jz4740_i2s_read(i2s, JZ_REG_AIC_CONF); + conf &= ~JZ_AIC_CONF_ENABLE; + jz4740_i2s_write(i2s, JZ_REG_AIC_CONF, conf); + + clk_disable(i2s->clk_i2s); +} + +static int jz4740_i2s_trigger(struct snd_pcm_substream *substream, int cmd, + struct snd_soc_dai *dai) +{ + struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + + uint32_t ctrl; + uint32_t mask; + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + mask = JZ_AIC_CTRL_ENABLE_PLAYBACK | JZ_AIC_CTRL_ENABLE_TX_DMA; + else + mask = JZ_AIC_CTRL_ENABLE_CAPTURE | JZ_AIC_CTRL_ENABLE_RX_DMA; + + ctrl = jz4740_i2s_read(i2s, JZ_REG_AIC_CTRL); + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + ctrl |= mask; + break; + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + ctrl &= ~mask; + break; + default: + return -EINVAL; + } + + jz4740_i2s_write(i2s, JZ_REG_AIC_CTRL, ctrl); + + return 0; +} + +static int jz4740_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) +{ + struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + + uint32_t format = 0; + uint32_t conf; + + conf = jz4740_i2s_read(i2s, JZ_REG_AIC_CONF); + + conf &= ~(JZ_AIC_CONF_BIT_CLK_MASTER | JZ_AIC_CONF_SYNC_CLK_MASTER); + + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBS_CFS: + conf |= JZ_AIC_CONF_BIT_CLK_MASTER | JZ_AIC_CONF_SYNC_CLK_MASTER; + format |= JZ_AIC_I2S_FMT_ENABLE_SYS_CLK; + break; + case SND_SOC_DAIFMT_CBM_CFS: + conf |= JZ_AIC_CONF_SYNC_CLK_MASTER; + break; + case SND_SOC_DAIFMT_CBS_CFM: + conf |= JZ_AIC_CONF_BIT_CLK_MASTER; + break; + case SND_SOC_DAIFMT_CBM_CFM: + break; + default: + return -EINVAL; + } + + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_MSB: + format |= JZ_AIC_I2S_FMT_MSB; + break; + case SND_SOC_DAIFMT_I2S: + break; + default: + return -EINVAL; + } + + switch (fmt & SND_SOC_DAIFMT_INV_MASK) { + case SND_SOC_DAIFMT_NB_NF: + break; + default: + return -EINVAL; + } + + jz4740_i2s_write(i2s, JZ_REG_AIC_CONF, conf); + jz4740_i2s_write(i2s, JZ_REG_AIC_I2S_FMT, format); + + return 0; +} + +static int jz4740_i2s_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) +{ + struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + enum jz4740_dma_width dma_width; + struct jz4740_pcm_config *pcm_config; + unsigned int sample_size; + uint32_t ctrl; + + ctrl = jz4740_i2s_read(i2s, JZ_REG_AIC_CTRL); + + switch (params_format(params)) { + case SNDRV_PCM_FORMAT_S8: + sample_size = 0; + dma_width = JZ4740_DMA_WIDTH_8BIT; + break; + case SNDRV_PCM_FORMAT_S16: + sample_size = 1; + dma_width = JZ4740_DMA_WIDTH_16BIT; + break; + default: + return -EINVAL; + } + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + ctrl &= ~JZ_AIC_CTRL_OUTPUT_SAMPLE_SIZE_MASK; + ctrl |= sample_size << JZ_AIC_CTRL_OUTPUT_SAMPLE_SIZE_OFFSET; + if (params_channels(params) == 1) + ctrl |= JZ_AIC_CTRL_MONO_TO_STEREO; + else + ctrl &= ~JZ_AIC_CTRL_MONO_TO_STEREO; + + pcm_config = &i2s->pcm_config_playback; + pcm_config->dma_config.dst_width = dma_width; + + } else { + ctrl &= ~JZ_AIC_CTRL_INPUT_SAMPLE_SIZE_MASK; + ctrl |= sample_size << JZ_AIC_CTRL_INPUT_SAMPLE_SIZE_OFFSET; + + pcm_config = &i2s->pcm_config_capture; + pcm_config->dma_config.src_width = dma_width; + } + + jz4740_i2s_write(i2s, JZ_REG_AIC_CTRL, ctrl); + + snd_soc_dai_set_dma_data(dai, substream, pcm_config); + + return 0; +} + +static int jz4740_i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id, + unsigned int freq, int dir) +{ + struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + struct clk *parent; + int ret = 0; + + switch (clk_id) { + case JZ4740_I2S_CLKSRC_EXT: + parent = clk_get(NULL, "ext"); + clk_set_parent(i2s->clk_i2s, parent); + break; + case JZ4740_I2S_CLKSRC_PLL: + parent = clk_get(NULL, "pll half"); + clk_set_parent(i2s->clk_i2s, parent); + ret = clk_set_rate(i2s->clk_i2s, freq); + break; + default: + return -EINVAL; + } + clk_put(parent); + + return ret; +} + +static int jz4740_i2s_suspend(struct snd_soc_dai *dai) +{ + struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + uint32_t conf; + + if (dai->active) { + conf = jz4740_i2s_read(i2s, JZ_REG_AIC_CONF); + conf &= ~JZ_AIC_CONF_ENABLE; + jz4740_i2s_write(i2s, JZ_REG_AIC_CONF, conf); + + clk_disable(i2s->clk_i2s); + } + + clk_disable(i2s->clk_aic); + + return 0; +} + +static int jz4740_i2s_resume(struct snd_soc_dai *dai) +{ + struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + uint32_t conf; + + clk_enable(i2s->clk_aic); + + if (dai->active) { + clk_enable(i2s->clk_i2s); + + conf = jz4740_i2s_read(i2s, JZ_REG_AIC_CONF); + conf |= JZ_AIC_CONF_ENABLE; + jz4740_i2s_write(i2s, JZ_REG_AIC_CONF, conf); + } + + return 0; +} + +static int jz4740_i2s_probe(struct platform_device *pdev, struct snd_soc_dai *dai) +{ + struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + uint32_t conf; + + conf = (7 << JZ_AIC_CONF_FIFO_RX_THRESHOLD_OFFSET) | + (8 << JZ_AIC_CONF_FIFO_TX_THRESHOLD_OFFSET) | + JZ_AIC_CONF_OVERFLOW_PLAY_LAST | + JZ_AIC_CONF_I2S | + JZ_AIC_CONF_INTERNAL_CODEC; + + jz4740_i2s_write(i2s, JZ_REG_AIC_CONF, JZ_AIC_CONF_RESET); + jz4740_i2s_write(i2s, JZ_REG_AIC_CONF, conf); + + return 0; +} + +static struct snd_soc_dai_ops jz4740_i2s_dai_ops = { + .startup = jz4740_i2s_startup, + .shutdown = jz4740_i2s_shutdown, + .trigger = jz4740_i2s_trigger, + .hw_params = jz4740_i2s_hw_params, + .set_fmt = jz4740_i2s_set_fmt, + .set_sysclk = jz4740_i2s_set_sysclk, +}; + +#define JZ4740_I2S_FMTS (SNDRV_PCM_FMTBIT_S8 | \ + SNDRV_PCM_FMTBIT_S16_LE) + +struct snd_soc_dai jz4740_i2s_dai = { + .name = "jz4740-i2s", + .probe = jz4740_i2s_probe, + .playback = { + .channels_min = 1, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = JZ4740_I2S_FMTS, + }, + .capture = { + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = JZ4740_I2S_FMTS, + }, + .symmetric_rates = 1, + .ops = &jz4740_i2s_dai_ops, + .suspend = jz4740_i2s_suspend, + .resume = jz4740_i2s_resume, +}; +EXPORT_SYMBOL_GPL(jz4740_i2s_dai); + +static void __devinit jz4740_i2c_init_pcm_config(struct jz4740_i2s *i2s) +{ + struct jz4740_dma_config *dma_config; + + /* Playback */ + dma_config = &i2s->pcm_config_playback.dma_config; + dma_config->src_width = JZ4740_DMA_WIDTH_32BIT, + dma_config->transfer_size = JZ4740_DMA_TRANSFER_SIZE_16BYTE; + dma_config->request_type = JZ4740_DMA_TYPE_AIC_TRANSMIT; + dma_config->flags = JZ4740_DMA_SRC_AUTOINC; + dma_config->mode = JZ4740_DMA_MODE_SINGLE; + i2s->pcm_config_playback.fifo_addr = i2s->phys_base + JZ_REG_AIC_FIFO; + + /* Capture */ + dma_config = &i2s->pcm_config_capture.dma_config; + dma_config->dst_width = JZ4740_DMA_WIDTH_32BIT, + dma_config->transfer_size = JZ4740_DMA_TRANSFER_SIZE_16BYTE; + dma_config->request_type = JZ4740_DMA_TYPE_AIC_RECEIVE; + dma_config->flags = JZ4740_DMA_DST_AUTOINC; + dma_config->mode = JZ4740_DMA_MODE_SINGLE; + i2s->pcm_config_capture.fifo_addr = i2s->phys_base + JZ_REG_AIC_FIFO; +} + +static int __devinit jz4740_i2s_dev_probe(struct platform_device *pdev) +{ + struct jz4740_i2s *i2s; + int ret; + + i2s = kzalloc(sizeof(*i2s), GFP_KERNEL); + + if (!i2s) + return -ENOMEM; + + i2s->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!i2s->mem) { + ret = -ENOENT; + goto err_free; + } + + i2s->mem = request_mem_region(i2s->mem->start, resource_size(i2s->mem), + pdev->name); + if (!i2s->mem) { + ret = -EBUSY; + goto err_free; + } + + i2s->base = ioremap_nocache(i2s->mem->start, resource_size(i2s->mem)); + if (!i2s->base) { + ret = -EBUSY; + goto err_release_mem_region; + } + + i2s->phys_base = i2s->mem->start; + + i2s->clk_aic = clk_get(&pdev->dev, "aic"); + if (IS_ERR(i2s->clk_aic)) { + ret = PTR_ERR(i2s->clk_aic); + goto err_iounmap; + } + + i2s->clk_i2s = clk_get(&pdev->dev, "i2s"); + if (IS_ERR(i2s->clk_i2s)) { + ret = PTR_ERR(i2s->clk_i2s); + goto err_clk_put_aic; + } + + clk_enable(i2s->clk_aic); + + jz4740_i2c_init_pcm_config(i2s); + + jz4740_i2s_dai.private_data = i2s; + ret = snd_soc_register_dai(&jz4740_i2s_dai); + + if (ret) { + dev_err(&pdev->dev, "Failed to register DAI\n"); + goto err_clk_put_i2s; + } + + platform_set_drvdata(pdev, i2s); + + return 0; + +err_clk_put_i2s: + clk_disable(i2s->clk_aic); + clk_put(i2s->clk_i2s); +err_clk_put_aic: + clk_put(i2s->clk_aic); +err_iounmap: + iounmap(i2s->base); +err_release_mem_region: + release_mem_region(i2s->mem->start, resource_size(i2s->mem)); +err_free: + kfree(i2s); + + return ret; +} + +static int __devexit jz4740_i2s_dev_remove(struct platform_device *pdev) +{ + struct jz4740_i2s *i2s = platform_get_drvdata(pdev); + + snd_soc_unregister_dai(&jz4740_i2s_dai); + + clk_disable(i2s->clk_aic); + clk_put(i2s->clk_i2s); + clk_put(i2s->clk_aic); + + iounmap(i2s->base); + release_mem_region(i2s->mem->start, resource_size(i2s->mem)); + + platform_set_drvdata(pdev, NULL); + kfree(i2s); + + return 0; +} + +static struct platform_driver jz4740_i2s_driver = { + .probe = jz4740_i2s_dev_probe, + .remove = __devexit_p(jz4740_i2s_dev_remove), + .driver = { + .name = "jz4740-i2s", + .owner = THIS_MODULE, + }, +}; + +static int __init jz4740_i2s_init(void) +{ + return platform_driver_register(&jz4740_i2s_driver); +} +module_init(jz4740_i2s_init); + +static void __exit jz4740_i2s_exit(void) +{ + platform_driver_unregister(&jz4740_i2s_driver); +} +module_exit(jz4740_i2s_exit); + +MODULE_AUTHOR("Lars-Peter Clausen, "); +MODULE_DESCRIPTION("Ingenic JZ4740 SoC I2S driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:jz4740-i2s"); diff --git a/sound/soc/jz4740/jz4740-i2s.h b/sound/soc/jz4740/jz4740-i2s.h new file mode 100644 index 000000000000..da22ed88a589 --- /dev/null +++ b/sound/soc/jz4740/jz4740-i2s.h @@ -0,0 +1,18 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _JZ4740_I2S_H +#define _JZ4740_I2S_H + +/* I2S clock source */ +#define JZ4740_I2S_CLKSRC_EXT 0 +#define JZ4740_I2S_CLKSRC_PLL 1 + +#define JZ4740_I2S_BIT_CLK 0 + +extern struct snd_soc_dai jz4740_i2s_dai; + +#endif diff --git a/sound/soc/jz4740/jz4740-pcm.c b/sound/soc/jz4740/jz4740-pcm.c new file mode 100644 index 000000000000..ee68d850c8dd --- /dev/null +++ b/sound/soc/jz4740/jz4740-pcm.c @@ -0,0 +1,373 @@ +/* + * Copyright (C) 2010, Lars-Peter Clausen + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include +#include "jz4740-pcm.h" + +struct jz4740_runtime_data { + unsigned long dma_period; + dma_addr_t dma_start; + dma_addr_t dma_pos; + dma_addr_t dma_end; + + struct jz4740_dma_chan *dma; + + dma_addr_t fifo_addr; +}; + +/* identify hardware playback capabilities */ +static const struct snd_pcm_hardware jz4740_pcm_hardware = { + .info = SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_MMAP_VALID | + SNDRV_PCM_INFO_INTERLEAVED | + SNDRV_PCM_INFO_BLOCK_TRANSFER, + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8, + + .rates = SNDRV_PCM_RATE_8000_48000, + .channels_min = 1, + .channels_max = 2, + .period_bytes_min = 16, + .period_bytes_max = 2 * PAGE_SIZE, + .periods_min = 2, + .periods_max = 128, + .buffer_bytes_max = 128 * 2 * PAGE_SIZE, + .fifo_size = 32, +}; + +static void jz4740_pcm_start_transfer(struct jz4740_runtime_data *prtd, + struct snd_pcm_substream *substream) +{ + unsigned long count; + + if (prtd->dma_pos == prtd->dma_end) + prtd->dma_pos = prtd->dma_start; + + if (prtd->dma_pos + prtd->dma_period > prtd->dma_end) + count = prtd->dma_end - prtd->dma_pos; + else + count = prtd->dma_period; + + jz4740_dma_disable(prtd->dma); + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + jz4740_dma_set_src_addr(prtd->dma, prtd->dma_pos); + jz4740_dma_set_dst_addr(prtd->dma, prtd->fifo_addr); + } else { + jz4740_dma_set_src_addr(prtd->dma, prtd->fifo_addr); + jz4740_dma_set_dst_addr(prtd->dma, prtd->dma_pos); + } + + jz4740_dma_set_transfer_count(prtd->dma, count); + + prtd->dma_pos += count; + + jz4740_dma_enable(prtd->dma); +} + +static void jz4740_pcm_dma_transfer_done(struct jz4740_dma_chan *dma, int err, + void *dev_id) +{ + struct snd_pcm_substream *substream = dev_id; + struct snd_pcm_runtime *runtime = substream->runtime; + struct jz4740_runtime_data *prtd = runtime->private_data; + + snd_pcm_period_elapsed(substream); + + jz4740_pcm_start_transfer(prtd, substream); +} + +static int jz4740_pcm_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct jz4740_runtime_data *prtd = runtime->private_data; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct jz4740_pcm_config *config; + + config = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); + + if (!config) + return 0; + + if (!prtd->dma) { + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) + prtd->dma = jz4740_dma_request(substream, "PCM Capture"); + else + prtd->dma = jz4740_dma_request(substream, "PCM Playback"); + } + + if (!prtd->dma) + return -EBUSY; + + jz4740_dma_configure(prtd->dma, &config->dma_config); + prtd->fifo_addr = config->fifo_addr; + + jz4740_dma_set_complete_cb(prtd->dma, jz4740_pcm_dma_transfer_done); + + snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); + runtime->dma_bytes = params_buffer_bytes(params); + + prtd->dma_period = params_period_bytes(params); + prtd->dma_start = runtime->dma_addr; + prtd->dma_pos = prtd->dma_start; + prtd->dma_end = prtd->dma_start + runtime->dma_bytes; + + return 0; +} + +static int jz4740_pcm_hw_free(struct snd_pcm_substream *substream) +{ + struct jz4740_runtime_data *prtd = substream->runtime->private_data; + + snd_pcm_set_runtime_buffer(substream, NULL); + if (prtd->dma) { + jz4740_dma_free(prtd->dma); + prtd->dma = NULL; + } + + return 0; +} + +static int jz4740_pcm_prepare(struct snd_pcm_substream *substream) +{ + struct jz4740_runtime_data *prtd = substream->runtime->private_data; + + if (!prtd->dma) + return -EBUSY; + + prtd->dma_pos = prtd->dma_start; + + return 0; +} + +static int jz4740_pcm_trigger(struct snd_pcm_substream *substream, int cmd) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct jz4740_runtime_data *prtd = runtime->private_data; + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + jz4740_pcm_start_transfer(prtd, substream); + break; + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + jz4740_dma_disable(prtd->dma); + break; + default: + break; + } + + return 0; +} + +static snd_pcm_uframes_t jz4740_pcm_pointer(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct jz4740_runtime_data *prtd = runtime->private_data; + unsigned long byte_offset; + snd_pcm_uframes_t offset; + struct jz4740_dma_chan *dma = prtd->dma; + + /* prtd->dma_pos points to the end of the current transfer. So by + * subtracting prdt->dma_start we get the offset to the end of the + * current period in bytes. By subtracting the residue of the transfer + * we get the current offset in bytes. */ + byte_offset = prtd->dma_pos - prtd->dma_start; + byte_offset -= jz4740_dma_get_residue(dma); + + offset = bytes_to_frames(runtime, byte_offset); + if (offset >= runtime->buffer_size) + offset = 0; + + return offset; +} + +static int jz4740_pcm_open(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct jz4740_runtime_data *prtd; + + prtd = kzalloc(sizeof(*prtd), GFP_KERNEL); + if (prtd == NULL) + return -ENOMEM; + + snd_soc_set_runtime_hwparams(substream, &jz4740_pcm_hardware); + + runtime->private_data = prtd; + + return 0; +} + +static int jz4740_pcm_close(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct jz4740_runtime_data *prtd = runtime->private_data; + + kfree(prtd); + + return 0; +} + +static int jz4740_pcm_mmap(struct snd_pcm_substream *substream, + struct vm_area_struct *vma) +{ + return remap_pfn_range(vma, vma->vm_start, + substream->dma_buffer.addr >> PAGE_SHIFT, + vma->vm_end - vma->vm_start, vma->vm_page_prot); +} + +static struct snd_pcm_ops jz4740_pcm_ops = { + .open = jz4740_pcm_open, + .close = jz4740_pcm_close, + .ioctl = snd_pcm_lib_ioctl, + .hw_params = jz4740_pcm_hw_params, + .hw_free = jz4740_pcm_hw_free, + .prepare = jz4740_pcm_prepare, + .trigger = jz4740_pcm_trigger, + .pointer = jz4740_pcm_pointer, + .mmap = jz4740_pcm_mmap, +}; + +static int jz4740_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream) +{ + struct snd_pcm_substream *substream = pcm->streams[stream].substream; + struct snd_dma_buffer *buf = &substream->dma_buffer; + size_t size = jz4740_pcm_hardware.buffer_bytes_max; + + buf->dev.type = SNDRV_DMA_TYPE_DEV; + buf->dev.dev = pcm->card->dev; + buf->private_data = NULL; + + buf->area = dma_alloc_noncoherent(pcm->card->dev, size, + &buf->addr, GFP_KERNEL); + if (!buf->area) + return -ENOMEM; + + buf->bytes = size; + + return 0; +} + +static void jz4740_pcm_free(struct snd_pcm *pcm) +{ + struct snd_pcm_substream *substream; + struct snd_dma_buffer *buf; + int stream; + + for (stream = 0; stream < SNDRV_PCM_STREAM_LAST; ++stream) { + substream = pcm->streams[stream].substream; + if (!substream) + continue; + + buf = &substream->dma_buffer; + if (!buf->area) + continue; + + dma_free_noncoherent(pcm->card->dev, buf->bytes, buf->area, + buf->addr); + buf->area = NULL; + } +} + +static u64 jz4740_pcm_dmamask = DMA_BIT_MASK(32); + +int jz4740_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, + struct snd_pcm *pcm) +{ + int ret = 0; + + if (!card->dev->dma_mask) + card->dev->dma_mask = &jz4740_pcm_dmamask; + + if (!card->dev->coherent_dma_mask) + card->dev->coherent_dma_mask = DMA_BIT_MASK(32); + + if (dai->playback.channels_min) { + ret = jz4740_pcm_preallocate_dma_buffer(pcm, + SNDRV_PCM_STREAM_PLAYBACK); + if (ret) + goto err; + } + + if (dai->capture.channels_min) { + ret = jz4740_pcm_preallocate_dma_buffer(pcm, + SNDRV_PCM_STREAM_CAPTURE); + if (ret) + goto err; + } + +err: + return ret; +} + +struct snd_soc_platform jz4740_soc_platform = { + .name = "jz4740-pcm", + .pcm_ops = &jz4740_pcm_ops, + .pcm_new = jz4740_pcm_new, + .pcm_free = jz4740_pcm_free, +}; +EXPORT_SYMBOL_GPL(jz4740_soc_platform); + +static int __devinit jz4740_pcm_probe(struct platform_device *pdev) +{ + return snd_soc_register_platform(&jz4740_soc_platform); +} + +static int __devexit jz4740_pcm_remove(struct platform_device *pdev) +{ + snd_soc_unregister_platform(&jz4740_soc_platform); + return 0; +} + +static struct platform_driver jz4740_pcm_driver = { + .probe = jz4740_pcm_probe, + .remove = __devexit_p(jz4740_pcm_remove), + .driver = { + .name = "jz4740-pcm", + .owner = THIS_MODULE, + }, +}; + +static int __init jz4740_soc_platform_init(void) +{ + return platform_driver_register(&jz4740_pcm_driver); +} +module_init(jz4740_soc_platform_init); + +static void __exit jz4740_soc_platform_exit(void) +{ + return platform_driver_unregister(&jz4740_pcm_driver); +} +module_exit(jz4740_soc_platform_exit); + +MODULE_AUTHOR("Lars-Peter Clausen "); +MODULE_DESCRIPTION("Ingenic SoC JZ4740 PCM driver"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/jz4740/jz4740-pcm.h b/sound/soc/jz4740/jz4740-pcm.h new file mode 100644 index 000000000000..e3f221e2779c --- /dev/null +++ b/sound/soc/jz4740/jz4740-pcm.h @@ -0,0 +1,22 @@ +/* + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _JZ4740_PCM_H +#define _JZ4740_PCM_H + +#include +#include + +/* platform data */ +extern struct snd_soc_platform jz4740_soc_platform; + +struct jz4740_pcm_config { + struct jz4740_dma_config dma_config; + phys_addr_t fifo_addr; +}; + +#endif -- cgit v1.2.3 From 3b097d64eafac6446d3c5d255830e2bbdd17edd3 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Tue, 22 Jun 2010 00:46:31 +0200 Subject: ASoC: Add JZ4740 codec driver This patch adds support for the JZ4740 internal codec. Signed-off-by: Lars-Peter Clausen Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/Kconfig | 4 + sound/soc/codecs/Makefile | 2 + sound/soc/codecs/jz4740.c | 511 ++++++++++++++++++++++++++++++++++++++++++++++ sound/soc/codecs/jz4740.h | 20 ++ 4 files changed, 537 insertions(+) create mode 100644 sound/soc/codecs/jz4740.c create mode 100644 sound/soc/codecs/jz4740.h (limited to 'sound') diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index af81c28ba6f5..ea1f5edde3d6 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -25,6 +25,7 @@ config SND_SOC_ALL_CODECS select SND_SOC_CS42L51 if I2C select SND_SOC_CS4270 if I2C select SND_SOC_DA7210 if I2C + select SND_SOC_JZ4740 if SOC_JZ4740 select SND_SOC_MAX9877 if I2C select SND_SOC_PCM3008 select SND_SOC_SPDIF @@ -139,6 +140,9 @@ config SND_SOC_CS4270_VD33_ERRATA config SND_SOC_CX20442 tristate +config SND_SOC_JZ4740_CODEC + tristate + config SND_SOC_L3 tristate diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index 4a9c205caf56..d8d9eebf78b5 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile @@ -57,6 +57,7 @@ snd-soc-wm9705-objs := wm9705.o snd-soc-wm9712-objs := wm9712.o snd-soc-wm9713-objs := wm9713.o snd-soc-wm-hubs-objs := wm_hubs.o +snd-soc-jz4740-codec-objs := jz4740.o # Amp snd-soc-max9877-objs := max9877.o @@ -80,6 +81,7 @@ obj-$(CONFIG_SND_SOC_CS4270) += snd-soc-cs4270.o obj-$(CONFIG_SND_SOC_CX20442) += snd-soc-cx20442.o obj-$(CONFIG_SND_SOC_DA7210) += snd-soc-da7210.o obj-$(CONFIG_SND_SOC_L3) += snd-soc-l3.o +obj-$(CONFIG_SND_SOC_JZ4740_CODEC) += snd-soc-jz4740-codec.o obj-$(CONFIG_SND_SOC_PCM3008) += snd-soc-pcm3008.o obj-$(CONFIG_SND_SOC_SPDIF) += snd-soc-spdif.o obj-$(CONFIG_SND_SOC_SSM2602) += snd-soc-ssm2602.o diff --git a/sound/soc/codecs/jz4740.c b/sound/soc/codecs/jz4740.c new file mode 100644 index 000000000000..66557de1e4fe --- /dev/null +++ b/sound/soc/codecs/jz4740.c @@ -0,0 +1,511 @@ +/* + * Copyright (C) 2009-2010, Lars-Peter Clausen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#define JZ4740_REG_CODEC_1 0x0 +#define JZ4740_REG_CODEC_2 0x1 + +#define JZ4740_CODEC_1_LINE_ENABLE BIT(29) +#define JZ4740_CODEC_1_MIC_ENABLE BIT(28) +#define JZ4740_CODEC_1_SW1_ENABLE BIT(27) +#define JZ4740_CODEC_1_ADC_ENABLE BIT(26) +#define JZ4740_CODEC_1_SW2_ENABLE BIT(25) +#define JZ4740_CODEC_1_DAC_ENABLE BIT(24) +#define JZ4740_CODEC_1_VREF_DISABLE BIT(20) +#define JZ4740_CODEC_1_VREF_AMP_DISABLE BIT(19) +#define JZ4740_CODEC_1_VREF_PULLDOWN BIT(18) +#define JZ4740_CODEC_1_VREF_LOW_CURRENT BIT(17) +#define JZ4740_CODEC_1_VREF_HIGH_CURRENT BIT(16) +#define JZ4740_CODEC_1_HEADPHONE_DISABLE BIT(14) +#define JZ4740_CODEC_1_HEADPHONE_AMP_CHANGE_ANY BIT(13) +#define JZ4740_CODEC_1_HEADPHONE_CHARGE BIT(12) +#define JZ4740_CODEC_1_HEADPHONE_PULLDOWN (BIT(11) | BIT(10)) +#define JZ4740_CODEC_1_HEADPHONE_POWERDOWN_M BIT(9) +#define JZ4740_CODEC_1_HEADPHONE_POWERDOWN BIT(8) +#define JZ4740_CODEC_1_SUSPEND BIT(1) +#define JZ4740_CODEC_1_RESET BIT(0) + +#define JZ4740_CODEC_1_LINE_ENABLE_OFFSET 29 +#define JZ4740_CODEC_1_MIC_ENABLE_OFFSET 28 +#define JZ4740_CODEC_1_SW1_ENABLE_OFFSET 27 +#define JZ4740_CODEC_1_ADC_ENABLE_OFFSET 26 +#define JZ4740_CODEC_1_SW2_ENABLE_OFFSET 25 +#define JZ4740_CODEC_1_DAC_ENABLE_OFFSET 24 +#define JZ4740_CODEC_1_HEADPHONE_DISABLE_OFFSET 14 +#define JZ4740_CODEC_1_HEADPHONE_POWERDOWN_OFFSET 8 + +#define JZ4740_CODEC_2_INPUT_VOLUME_MASK 0x1f0000 +#define JZ4740_CODEC_2_SAMPLE_RATE_MASK 0x000f00 +#define JZ4740_CODEC_2_MIC_BOOST_GAIN_MASK 0x000030 +#define JZ4740_CODEC_2_HEADPHONE_VOLUME_MASK 0x000003 + +#define JZ4740_CODEC_2_INPUT_VOLUME_OFFSET 16 +#define JZ4740_CODEC_2_SAMPLE_RATE_OFFSET 8 +#define JZ4740_CODEC_2_MIC_BOOST_GAIN_OFFSET 4 +#define JZ4740_CODEC_2_HEADPHONE_VOLUME_OFFSET 0 + +static const uint32_t jz4740_codec_regs[] = { + 0x021b2302, 0x00170803, +}; + +struct jz4740_codec { + void __iomem *base; + struct resource *mem; + + uint32_t reg_cache[2]; + struct snd_soc_codec codec; +}; + +static inline struct jz4740_codec *codec_to_jz4740(struct snd_soc_codec *codec) +{ + return container_of(codec, struct jz4740_codec, codec); +} + +static unsigned int jz4740_codec_read(struct snd_soc_codec *codec, + unsigned int reg) +{ + struct jz4740_codec *jz4740_codec = codec_to_jz4740(codec); + return readl(jz4740_codec->base + (reg << 2)); +} + +static int jz4740_codec_write(struct snd_soc_codec *codec, unsigned int reg, + unsigned int val) +{ + struct jz4740_codec *jz4740_codec = codec_to_jz4740(codec); + + jz4740_codec->reg_cache[reg] = val; + writel(val, jz4740_codec->base + (reg << 2)); + + return 0; +} + +static const struct snd_kcontrol_new jz4740_codec_controls[] = { + SOC_SINGLE("Master Playback Volume", JZ4740_REG_CODEC_2, + JZ4740_CODEC_2_HEADPHONE_VOLUME_OFFSET, 3, 0), + SOC_SINGLE("Master Capture Volume", JZ4740_REG_CODEC_2, + JZ4740_CODEC_2_INPUT_VOLUME_OFFSET, 31, 0), + SOC_SINGLE("Master Playback Switch", JZ4740_REG_CODEC_1, + JZ4740_CODEC_1_HEADPHONE_DISABLE_OFFSET, 1, 1), + SOC_SINGLE("Mic Capture Volume", JZ4740_REG_CODEC_2, + JZ4740_CODEC_2_MIC_BOOST_GAIN_OFFSET, 3, 0), +}; + +static const struct snd_kcontrol_new jz4740_codec_output_controls[] = { + SOC_DAPM_SINGLE("Bypass Switch", JZ4740_REG_CODEC_1, + JZ4740_CODEC_1_SW1_ENABLE_OFFSET, 1, 0), + SOC_DAPM_SINGLE("DAC Switch", JZ4740_REG_CODEC_1, + JZ4740_CODEC_1_SW2_ENABLE_OFFSET, 1, 0), +}; + +static const struct snd_kcontrol_new jz4740_codec_input_controls[] = { + SOC_DAPM_SINGLE("Line Capture Switch", JZ4740_REG_CODEC_1, + JZ4740_CODEC_1_LINE_ENABLE_OFFSET, 1, 0), + SOC_DAPM_SINGLE("Mic Capture Switch", JZ4740_REG_CODEC_1, + JZ4740_CODEC_1_MIC_ENABLE_OFFSET, 1, 0), +}; + +static const struct snd_soc_dapm_widget jz4740_codec_dapm_widgets[] = { + SND_SOC_DAPM_ADC("ADC", "Capture", JZ4740_REG_CODEC_1, + JZ4740_CODEC_1_ADC_ENABLE_OFFSET, 0), + SND_SOC_DAPM_DAC("DAC", "Playback", JZ4740_REG_CODEC_1, + JZ4740_CODEC_1_DAC_ENABLE_OFFSET, 0), + + SND_SOC_DAPM_MIXER("Output Mixer", JZ4740_REG_CODEC_1, + JZ4740_CODEC_1_HEADPHONE_POWERDOWN_OFFSET, 1, + jz4740_codec_output_controls, + ARRAY_SIZE(jz4740_codec_output_controls)), + + SND_SOC_DAPM_MIXER_NAMED_CTL("Input Mixer", SND_SOC_NOPM, 0, 0, + jz4740_codec_input_controls, + ARRAY_SIZE(jz4740_codec_input_controls)), + SND_SOC_DAPM_MIXER("Line Input", SND_SOC_NOPM, 0, 0, NULL, 0), + + SND_SOC_DAPM_OUTPUT("LOUT"), + SND_SOC_DAPM_OUTPUT("ROUT"), + + SND_SOC_DAPM_INPUT("MIC"), + SND_SOC_DAPM_INPUT("LIN"), + SND_SOC_DAPM_INPUT("RIN"), +}; + +static const struct snd_soc_dapm_route jz4740_codec_dapm_routes[] = { + {"Line Input", NULL, "LIN"}, + {"Line Input", NULL, "RIN"}, + + {"Input Mixer", "Line Capture Switch", "Line Input"}, + {"Input Mixer", "Mic Capture Switch", "MIC"}, + + {"ADC", NULL, "Input Mixer"}, + + {"Output Mixer", "Bypass Switch", "Input Mixer"}, + {"Output Mixer", "DAC Switch", "DAC"}, + + {"LOUT", NULL, "Output Mixer"}, + {"ROUT", NULL, "Output Mixer"}, +}; + +static int jz4740_codec_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) +{ + uint32_t val; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_device *socdev = rtd->socdev; + struct snd_soc_codec *codec = socdev->card->codec; + + switch (params_rate(params)) { + case 8000: + val = 0; + break; + case 11025: + val = 1; + break; + case 12000: + val = 2; + break; + case 16000: + val = 3; + break; + case 22050: + val = 4; + break; + case 24000: + val = 5; + break; + case 32000: + val = 6; + break; + case 44100: + val = 7; + break; + case 48000: + val = 8; + break; + default: + return -EINVAL; + } + + val <<= JZ4740_CODEC_2_SAMPLE_RATE_OFFSET; + + snd_soc_update_bits(codec, JZ4740_REG_CODEC_2, + JZ4740_CODEC_2_SAMPLE_RATE_MASK, val); + + return 0; +} + +static struct snd_soc_dai_ops jz4740_codec_dai_ops = { + .hw_params = jz4740_codec_hw_params, +}; + +struct snd_soc_dai jz4740_codec_dai = { + .name = "jz4740", + .playback = { + .stream_name = "Playback", + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8, + }, + .capture = { + .stream_name = "Capture", + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8, + }, + .ops = &jz4740_codec_dai_ops, + .symmetric_rates = 1, +}; +EXPORT_SYMBOL_GPL(jz4740_codec_dai); + +static void jz4740_codec_wakeup(struct snd_soc_codec *codec) +{ + int i; + uint32_t *cache = codec->reg_cache; + + snd_soc_update_bits(codec, JZ4740_REG_CODEC_1, + JZ4740_CODEC_1_RESET, JZ4740_CODEC_1_RESET); + udelay(2); + + snd_soc_update_bits(codec, JZ4740_REG_CODEC_1, + JZ4740_CODEC_1_SUSPEND | JZ4740_CODEC_1_RESET, 0); + + for (i = 0; i < ARRAY_SIZE(jz4740_codec_regs); ++i) + jz4740_codec_write(codec, i, cache[i]); +} + +static int jz4740_codec_set_bias_level(struct snd_soc_codec *codec, + enum snd_soc_bias_level level) +{ + unsigned int mask; + unsigned int value; + + switch (level) { + case SND_SOC_BIAS_ON: + break; + case SND_SOC_BIAS_PREPARE: + mask = JZ4740_CODEC_1_VREF_DISABLE | + JZ4740_CODEC_1_VREF_AMP_DISABLE | + JZ4740_CODEC_1_HEADPHONE_POWERDOWN_M; + value = 0; + + snd_soc_update_bits(codec, JZ4740_REG_CODEC_1, mask, value); + break; + case SND_SOC_BIAS_STANDBY: + /* The only way to clear the suspend flag is to reset the codec */ + if (codec->bias_level == SND_SOC_BIAS_OFF) + jz4740_codec_wakeup(codec); + + mask = JZ4740_CODEC_1_VREF_DISABLE | + JZ4740_CODEC_1_VREF_AMP_DISABLE | + JZ4740_CODEC_1_HEADPHONE_POWERDOWN_M; + value = JZ4740_CODEC_1_VREF_DISABLE | + JZ4740_CODEC_1_VREF_AMP_DISABLE | + JZ4740_CODEC_1_HEADPHONE_POWERDOWN_M; + + snd_soc_update_bits(codec, JZ4740_REG_CODEC_1, mask, value); + break; + case SND_SOC_BIAS_OFF: + mask = JZ4740_CODEC_1_SUSPEND; + value = JZ4740_CODEC_1_SUSPEND; + + snd_soc_update_bits(codec, JZ4740_REG_CODEC_1, mask, value); + break; + default: + break; + } + + codec->bias_level = level; + + return 0; +} + +static struct snd_soc_codec *jz4740_codec_codec; + +static int jz4740_codec_dev_probe(struct platform_device *pdev) +{ + int ret; + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + struct snd_soc_codec *codec = jz4740_codec_codec; + + BUG_ON(!codec); + + socdev->card->codec = codec; + + ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); + if (ret) { + dev_err(&pdev->dev, "Failed to create pcms: %d\n", ret); + return ret; + } + + snd_soc_add_controls(codec, jz4740_codec_controls, + ARRAY_SIZE(jz4740_codec_controls)); + + snd_soc_dapm_new_controls(codec, jz4740_codec_dapm_widgets, + ARRAY_SIZE(jz4740_codec_dapm_widgets)); + + snd_soc_dapm_add_routes(codec, jz4740_codec_dapm_routes, + ARRAY_SIZE(jz4740_codec_dapm_routes)); + + snd_soc_dapm_new_widgets(codec); + + return 0; +} + +static int jz4740_codec_dev_remove(struct platform_device *pdev) +{ + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + + snd_soc_free_pcms(socdev); + snd_soc_dapm_free(socdev); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP + +static int jz4740_codec_suspend(struct platform_device *pdev, pm_message_t state) +{ + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + struct snd_soc_codec *codec = socdev->card->codec; + + return jz4740_codec_set_bias_level(codec, SND_SOC_BIAS_OFF); +} + +static int jz4740_codec_resume(struct platform_device *pdev) +{ + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + struct snd_soc_codec *codec = socdev->card->codec; + + return jz4740_codec_set_bias_level(codec, SND_SOC_BIAS_STANDBY); +} + +#else +#define jz4740_codec_suspend NULL +#define jz4740_codec_resume NULL +#endif + +struct snd_soc_codec_device soc_codec_dev_jz4740_codec = { + .probe = jz4740_codec_dev_probe, + .remove = jz4740_codec_dev_remove, + .suspend = jz4740_codec_suspend, + .resume = jz4740_codec_resume, +}; +EXPORT_SYMBOL_GPL(soc_codec_dev_jz4740_codec); + +static int __devinit jz4740_codec_probe(struct platform_device *pdev) +{ + int ret; + struct jz4740_codec *jz4740_codec; + struct snd_soc_codec *codec; + struct resource *mem; + + jz4740_codec = kzalloc(sizeof(*jz4740_codec), GFP_KERNEL); + if (!jz4740_codec) + return -ENOMEM; + + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!mem) { + dev_err(&pdev->dev, "Failed to get mmio memory resource\n"); + ret = -ENOENT; + goto err_free_codec; + } + + mem = request_mem_region(mem->start, resource_size(mem), pdev->name); + if (!mem) { + dev_err(&pdev->dev, "Failed to request mmio memory region\n"); + ret = -EBUSY; + goto err_free_codec; + } + + jz4740_codec->base = ioremap(mem->start, resource_size(mem)); + if (!jz4740_codec->base) { + dev_err(&pdev->dev, "Failed to ioremap mmio memory\n"); + ret = -EBUSY; + goto err_release_mem_region; + } + jz4740_codec->mem = mem; + + jz4740_codec_dai.dev = &pdev->dev; + + codec = &jz4740_codec->codec; + + codec->dev = &pdev->dev; + codec->name = "jz4740"; + codec->owner = THIS_MODULE; + + codec->read = jz4740_codec_read; + codec->write = jz4740_codec_write; + codec->set_bias_level = jz4740_codec_set_bias_level; + codec->bias_level = SND_SOC_BIAS_OFF; + + codec->dai = &jz4740_codec_dai; + codec->num_dai = 1; + + codec->reg_cache = jz4740_codec->reg_cache; + codec->reg_cache_size = 2; + memcpy(codec->reg_cache, jz4740_codec_regs, sizeof(jz4740_codec_regs)); + + mutex_init(&codec->mutex); + INIT_LIST_HEAD(&codec->dapm_widgets); + INIT_LIST_HEAD(&codec->dapm_paths); + + jz4740_codec_codec = codec; + + snd_soc_update_bits(codec, JZ4740_REG_CODEC_1, + JZ4740_CODEC_1_SW2_ENABLE, JZ4740_CODEC_1_SW2_ENABLE); + + platform_set_drvdata(pdev, jz4740_codec); + + ret = snd_soc_register_codec(codec); + if (ret) { + dev_err(&pdev->dev, "Failed to register codec\n"); + goto err_iounmap; + } + + ret = snd_soc_register_dai(&jz4740_codec_dai); + if (ret) { + dev_err(&pdev->dev, "Failed to register codec dai\n"); + goto err_unregister_codec; + } + + jz4740_codec_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + + return 0; + +err_unregister_codec: + snd_soc_unregister_codec(codec); +err_iounmap: + iounmap(jz4740_codec->base); +err_release_mem_region: + release_mem_region(mem->start, resource_size(mem)); +err_free_codec: + kfree(jz4740_codec); + + return ret; +} + +static int __devexit jz4740_codec_remove(struct platform_device *pdev) +{ + struct jz4740_codec *jz4740_codec = platform_get_drvdata(pdev); + struct resource *mem = jz4740_codec->mem; + + snd_soc_unregister_dai(&jz4740_codec_dai); + snd_soc_unregister_codec(&jz4740_codec->codec); + + iounmap(jz4740_codec->base); + release_mem_region(mem->start, resource_size(mem)); + + platform_set_drvdata(pdev, NULL); + kfree(jz4740_codec); + + return 0; +} + +static struct platform_driver jz4740_codec_driver = { + .probe = jz4740_codec_probe, + .remove = __devexit_p(jz4740_codec_remove), + .driver = { + .name = "jz4740-codec", + .owner = THIS_MODULE, + }, +}; + +static int __init jz4740_codec_init(void) +{ + return platform_driver_register(&jz4740_codec_driver); +} +module_init(jz4740_codec_init); + +static void __exit jz4740_codec_exit(void) +{ + platform_driver_unregister(&jz4740_codec_driver); +} +module_exit(jz4740_codec_exit); + +MODULE_DESCRIPTION("JZ4740 SoC internal codec driver"); +MODULE_AUTHOR("Lars-Peter Clausen "); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:jz4740-codec"); diff --git a/sound/soc/codecs/jz4740.h b/sound/soc/codecs/jz4740.h new file mode 100644 index 000000000000..b5a0691be763 --- /dev/null +++ b/sound/soc/codecs/jz4740.h @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2009, Lars-Peter Clausen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef __SND_SOC_CODECS_JZ4740_CODEC_H__ +#define __SND_SOC_CODECS_JZ4740_CODEC_H__ + +extern struct snd_soc_dai jz4740_codec_dai; +extern struct snd_soc_codec_device soc_codec_dev_jz4740_codec; + +#endif -- cgit v1.2.3 From 5898dd9ebd158d9fd3c197fc640d0c104bef39a5 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sat, 19 Jun 2010 16:52:51 +0200 Subject: ASoC: JZ4740: Add qi_lb60 board driver This patch adds ASoC support for the qi_lb60 board. Signed-off-by: Lars-Peter Clausen Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/jz4740/Kconfig | 9 +++ sound/soc/jz4740/Makefile | 4 ++ sound/soc/jz4740/qi_lb60.c | 166 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 179 insertions(+) create mode 100644 sound/soc/jz4740/qi_lb60.c (limited to 'sound') diff --git a/sound/soc/jz4740/Kconfig b/sound/soc/jz4740/Kconfig index 27480f204ee0..5351cba66c9e 100644 --- a/sound/soc/jz4740/Kconfig +++ b/sound/soc/jz4740/Kconfig @@ -12,3 +12,12 @@ config SND_JZ4740_SOC_I2S help Say Y if you want to use I2S protocol and I2S codec on Ingenic JZ4740 based boards. + +config SND_JZ4740_SOC_QI_LB60 + tristate "SoC Audio support for Qi LB60" + depends on SND_JZ4740_SOC && JZ4740_QI_LB60 + select SND_JZ4740_SOC_I2S + select SND_SOC_JZ4740_CODEC + help + Say Y if you want to add support for ASoC audio on the Qi LB60 board + a.k.a Qi Ben NanoNote. diff --git a/sound/soc/jz4740/Makefile b/sound/soc/jz4740/Makefile index 1be8d192d23f..be873c1b0c20 100644 --- a/sound/soc/jz4740/Makefile +++ b/sound/soc/jz4740/Makefile @@ -7,3 +7,7 @@ snd-soc-jz4740-i2s-objs := jz4740-i2s.o obj-$(CONFIG_SND_JZ4740_SOC) += snd-soc-jz4740.o obj-$(CONFIG_SND_JZ4740_SOC_I2S) += snd-soc-jz4740-i2s.o +# Jz4740 Machine Support +snd-soc-qi-lb60-objs := qi_lb60.o + +obj-$(CONFIG_SND_JZ4740_SOC_QI_LB60) += snd-soc-qi-lb60.o diff --git a/sound/soc/jz4740/qi_lb60.c b/sound/soc/jz4740/qi_lb60.c new file mode 100644 index 000000000000..f15f4918f15f --- /dev/null +++ b/sound/soc/jz4740/qi_lb60.c @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2009, Lars-Peter Clausen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../codecs/jz4740.h" +#include "jz4740-pcm.h" +#include "jz4740-i2s.h" + + +#define QI_LB60_SND_GPIO JZ_GPIO_PORTB(29) +#define QI_LB60_AMP_GPIO JZ_GPIO_PORTD(4) + +static int qi_lb60_spk_event(struct snd_soc_dapm_widget *widget, + struct snd_kcontrol *ctrl, int event) +{ + int on = 0; + if (event & SND_SOC_DAPM_POST_PMU) + on = 1; + else if (event & SND_SOC_DAPM_PRE_PMD) + on = 0; + + gpio_set_value(QI_LB60_SND_GPIO, on); + gpio_set_value(QI_LB60_AMP_GPIO, on); + + return 0; +} + +static const struct snd_soc_dapm_widget qi_lb60_widgets[] = { + SND_SOC_DAPM_SPK("Speaker", qi_lb60_spk_event), + SND_SOC_DAPM_MIC("Mic", NULL), +}; + +static const struct snd_soc_dapm_route qi_lb60_routes[] = { + {"Mic", NULL, "MIC"}, + {"Speaker", NULL, "LOUT"}, + {"Speaker", NULL, "ROUT"}, +}; + +#define QI_LB60_DAIFMT (SND_SOC_DAIFMT_I2S | \ + SND_SOC_DAIFMT_NB_NF | \ + SND_SOC_DAIFMT_CBM_CFM) + +static int qi_lb60_codec_init(struct snd_soc_codec *codec) +{ + int ret; + struct snd_soc_dai *cpu_dai = codec->socdev->card->dai_link->cpu_dai; + + snd_soc_dapm_nc_pin(codec, "LIN"); + snd_soc_dapm_nc_pin(codec, "RIN"); + + ret = snd_soc_dai_set_fmt(cpu_dai, QI_LB60_DAIFMT); + if (ret < 0) { + dev_err(codec->dev, "Failed to set cpu dai format: %d\n", ret); + return ret; + } + + snd_soc_dapm_new_controls(codec, qi_lb60_widgets, ARRAY_SIZE(qi_lb60_widgets)); + snd_soc_dapm_add_routes(codec, qi_lb60_routes, ARRAY_SIZE(qi_lb60_routes)); + snd_soc_dapm_sync(codec); + + return 0; +} + +static struct snd_soc_dai_link qi_lb60_dai = { + .name = "jz4740", + .stream_name = "jz4740", + .cpu_dai = &jz4740_i2s_dai, + .codec_dai = &jz4740_codec_dai, + .init = qi_lb60_codec_init, +}; + +static struct snd_soc_card qi_lb60 = { + .name = "QI LB60", + .dai_link = &qi_lb60_dai, + .num_links = 1, + .platform = &jz4740_soc_platform, +}; + +static struct snd_soc_device qi_lb60_snd_devdata = { + .card = &qi_lb60, + .codec_dev = &soc_codec_dev_jz4740_codec, +}; + +static struct platform_device *qi_lb60_snd_device; + +static int __init qi_lb60_init(void) +{ + int ret; + + qi_lb60_snd_device = platform_device_alloc("soc-audio", -1); + + if (!qi_lb60_snd_device) + return -ENOMEM; + + ret = gpio_request(QI_LB60_SND_GPIO, "SND"); + if (ret) { + pr_err("qi_lb60 snd: Failed to request SND GPIO(%d): %d\n", + QI_LB60_SND_GPIO, ret); + goto err_device_put; + } + + ret = gpio_request(QI_LB60_AMP_GPIO, "AMP"); + if (ret) { + pr_err("qi_lb60 snd: Failed to request AMP GPIO(%d): %d\n", + QI_LB60_AMP_GPIO, ret); + goto err_gpio_free_snd; + } + + gpio_direction_output(QI_LB60_SND_GPIO, 0); + gpio_direction_output(QI_LB60_AMP_GPIO, 0); + + platform_set_drvdata(qi_lb60_snd_device, &qi_lb60_snd_devdata); + qi_lb60_snd_devdata.dev = &qi_lb60_snd_device->dev; + + ret = platform_device_add(qi_lb60_snd_device); + if (ret) { + pr_err("qi_lb60 snd: Failed to add snd soc device: %d\n", ret); + goto err_unset_pdata; + } + + return 0; + +err_unset_pdata: + platform_set_drvdata(qi_lb60_snd_device, NULL); +/*err_gpio_free_amp:*/ + gpio_free(QI_LB60_AMP_GPIO); +err_gpio_free_snd: + gpio_free(QI_LB60_SND_GPIO); +err_device_put: + platform_device_put(qi_lb60_snd_device); + + return ret; +} +module_init(qi_lb60_init); + +static void __exit qi_lb60_exit(void) +{ + gpio_free(QI_LB60_AMP_GPIO); + gpio_free(QI_LB60_SND_GPIO); + platform_device_unregister(qi_lb60_snd_device); +} +module_exit(qi_lb60_exit); + +MODULE_AUTHOR("Lars-Peter Clausen "); +MODULE_DESCRIPTION("ALSA SoC QI LB60 Audio support"); +MODULE_LICENSE("GPL v2"); -- cgit v1.2.3 From 3d5a4516238ff1da81f5c38a7ddd87127487c8ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eric=20B=C3=A9nard?= Date: Sat, 19 Jun 2010 19:33:39 +0200 Subject: codecs/tlv320aic23: fix bias management for suspend/resume MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit in tlv320aic23_set_bias_level, for the case SND_SOC_BIAS_ON, the comment says "vref/mid, osc on, dac unmute" but the code doesn't clear the corresponding bits, thus when resuming, several bits are not cleared preventing the codec from working. in tlv320aic23_suspend, clearing the active register is not needed as it will be done by tlv320aic23_set_bias_level, when setting bias to SND_SOC_BIAS_OFF Signed-off-by: Eric Bénard Cc: broonie@opensource.wolfsonmicro.com Cc: anuj.aggarwal@ti.com Cc: lrg@slimlogic.co.uk Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/tlv320aic23.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/tlv320aic23.c b/sound/soc/codecs/tlv320aic23.c index b0bae3508b29..0a4b0fef3355 100644 --- a/sound/soc/codecs/tlv320aic23.c +++ b/sound/soc/codecs/tlv320aic23.c @@ -560,13 +560,16 @@ static int tlv320aic23_set_bias_level(struct snd_soc_codec *codec, switch (level) { case SND_SOC_BIAS_ON: /* vref/mid, osc on, dac unmute */ + reg &= ~(TLV320AIC23_DEVICE_PWR_OFF | TLV320AIC23_OSC_OFF | \ + TLV320AIC23_DAC_OFF); tlv320aic23_write(codec, TLV320AIC23_PWR, reg); break; case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: /* everything off except vref/vmid, */ - tlv320aic23_write(codec, TLV320AIC23_PWR, reg | 0x0040); + tlv320aic23_write(codec, TLV320AIC23_PWR, reg | \ + TLV320AIC23_CLK_OFF); break; case SND_SOC_BIAS_OFF: /* everything off, dac mute, inactive */ @@ -615,7 +618,6 @@ static int tlv320aic23_suspend(struct platform_device *pdev, struct snd_soc_device *socdev = platform_get_drvdata(pdev); struct snd_soc_codec *codec = socdev->card->codec; - tlv320aic23_write(codec, TLV320AIC23_ACTIVE, 0x0); tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; @@ -632,7 +634,6 @@ static int tlv320aic23_resume(struct platform_device *pdev) u16 val = tlv320aic23_read_reg_cache(codec, reg); tlv320aic23_write(codec, reg, val); } - tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; -- cgit v1.2.3 From 4eb5470326ca09c0eeae4502f52375d657a585c2 Mon Sep 17 00:00:00 2001 From: Jarkko Nikula Date: Mon, 21 Jun 2010 14:14:59 +0300 Subject: ASoC: RX-51: Add Jack Function kcontrol Nokia RX-51/N900 has multifunction 4-pole audio-video jack that can be used as headphone, headset or audio-video connector. This patch implements the control 'Jack Function' which is used to select the desired function. At the moment only TV-out without audio is supported. Signed-off-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/omap/rx51.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'sound') diff --git a/sound/soc/omap/rx51.c b/sound/soc/omap/rx51.c index 47d831ef2dbb..1a2de34eecf5 100644 --- a/sound/soc/omap/rx51.c +++ b/sound/soc/omap/rx51.c @@ -37,14 +37,21 @@ #include "omap-pcm.h" #include "../codecs/tlv320aic3x.h" +#define RX51_TVOUT_SEL_GPIO 40 /* * REVISIT: TWL4030 GPIO base in RX-51. Now statically defined to 192. This * gpio is reserved in arch/arm/mach-omap2/board-rx51-peripherals.c */ #define RX51_SPEAKER_AMP_TWL_GPIO (192 + 7) +enum { + RX51_JACK_DISABLED, + RX51_JACK_TVOUT, /* tv-out */ +}; + static int rx51_spk_func; static int rx51_dmic_func; +static int rx51_jack_func; static void rx51_ext_control(struct snd_soc_codec *codec) { @@ -57,6 +64,9 @@ static void rx51_ext_control(struct snd_soc_codec *codec) else snd_soc_dapm_disable_pin(codec, "DMic"); + gpio_set_value(RX51_TVOUT_SEL_GPIO, + rx51_jack_func == RX51_JACK_TVOUT); + snd_soc_dapm_sync(codec); } @@ -162,6 +172,28 @@ static int rx51_set_input(struct snd_kcontrol *kcontrol, return 1; } +static int rx51_get_jack(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + ucontrol->value.integer.value[0] = rx51_jack_func; + + return 0; +} + +static int rx51_set_jack(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + + if (rx51_jack_func == ucontrol->value.integer.value[0]) + return 0; + + rx51_jack_func = ucontrol->value.integer.value[0]; + rx51_ext_control(codec); + + return 1; +} + static const struct snd_soc_dapm_widget aic34_dapm_widgets[] = { SND_SOC_DAPM_SPK("Ext Spk", rx51_spk_event), SND_SOC_DAPM_MIC("DMic", NULL), @@ -177,10 +209,12 @@ static const struct snd_soc_dapm_route audio_map[] = { static const char *spk_function[] = {"Off", "On"}; static const char *input_function[] = {"ADC", "Digital Mic"}; +static const char *jack_function[] = {"Off", "TV-OUT"}; static const struct soc_enum rx51_enum[] = { SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(spk_function), spk_function), SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(input_function), input_function), + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(jack_function), jack_function), }; static const struct snd_kcontrol_new aic34_rx51_controls[] = { @@ -188,6 +222,8 @@ static const struct snd_kcontrol_new aic34_rx51_controls[] = { rx51_get_spk, rx51_set_spk), SOC_ENUM_EXT("Input Select", rx51_enum[1], rx51_get_input, rx51_set_input), + SOC_ENUM_EXT("Jack Function", rx51_enum[2], + rx51_get_jack, rx51_set_jack), }; static int rx51_aic34_init(struct snd_soc_codec *codec) @@ -259,6 +295,11 @@ static int __init rx51_soc_init(void) if (!machine_is_nokia_rx51()) return -ENODEV; + err = gpio_request(RX51_TVOUT_SEL_GPIO, "tvout_sel"); + if (err) + goto err_gpio_tvout_sel; + gpio_direction_output(RX51_TVOUT_SEL_GPIO, 0); + rx51_snd_device = platform_device_alloc("soc-audio", -1); if (!rx51_snd_device) { err = -ENOMEM; @@ -277,6 +318,8 @@ static int __init rx51_soc_init(void) err2: platform_device_put(rx51_snd_device); err1: + gpio_free(RX51_TVOUT_SEL_GPIO); +err_gpio_tvout_sel: return err; } @@ -284,6 +327,7 @@ err1: static void __exit rx51_soc_exit(void) { platform_device_unregister(rx51_snd_device); + gpio_free(RX51_TVOUT_SEL_GPIO); } module_init(rx51_soc_init); -- cgit v1.2.3 From 8c523115ae170840896ce6593a404ef0ffd3c7da Mon Sep 17 00:00:00 2001 From: Jarkko Nikula Date: Mon, 21 Jun 2010 14:15:00 +0300 Subject: ASoC: RX-51: Add basic jack detection This patch adds GPIO jack detection to Nokia N900/RX-51. At the moment only SND_JACK_VIDEOOUT type is reported. More types could be reported after getting more audio features supported and necessary drivers integrated for implementing automated accessory detection. Signed-off-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/omap/rx51.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/omap/rx51.c b/sound/soc/omap/rx51.c index 1a2de34eecf5..88052d29617f 100644 --- a/sound/soc/omap/rx51.c +++ b/sound/soc/omap/rx51.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -38,6 +39,7 @@ #include "../codecs/tlv320aic3x.h" #define RX51_TVOUT_SEL_GPIO 40 +#define RX51_JACK_DETECT_GPIO 177 /* * REVISIT: TWL4030 GPIO base in RX-51. Now statically defined to 192. This * gpio is reserved in arch/arm/mach-omap2/board-rx51-peripherals.c @@ -194,6 +196,18 @@ static int rx51_set_jack(struct snd_kcontrol *kcontrol, return 1; } +static struct snd_soc_jack rx51_av_jack; + +static struct snd_soc_jack_gpio rx51_av_jack_gpios[] = { + { + .gpio = RX51_JACK_DETECT_GPIO, + .name = "avdet-gpio", + .report = SND_JACK_VIDEOOUT, + .invert = 1, + .debounce_time = 200, + }, +}; + static const struct snd_soc_dapm_widget aic34_dapm_widgets[] = { SND_SOC_DAPM_SPK("Ext Spk", rx51_spk_event), SND_SOC_DAPM_MIC("DMic", NULL), @@ -228,6 +242,7 @@ static const struct snd_kcontrol_new aic34_rx51_controls[] = { static int rx51_aic34_init(struct snd_soc_codec *codec) { + struct snd_soc_card *card = codec->socdev->card; int err; /* Set up NC codec pins */ @@ -250,7 +265,16 @@ static int rx51_aic34_init(struct snd_soc_codec *codec) snd_soc_dapm_sync(codec); - return 0; + /* AV jack detection */ + err = snd_soc_jack_new(card, "AV Jack", + SND_JACK_VIDEOOUT, &rx51_av_jack); + if (err) + return err; + err = snd_soc_jack_add_gpios(&rx51_av_jack, + ARRAY_SIZE(rx51_av_jack_gpios), + rx51_av_jack_gpios); + + return err; } /* Digital audio interface glue - connects codec <--> CPU */ @@ -326,6 +350,9 @@ err_gpio_tvout_sel: static void __exit rx51_soc_exit(void) { + snd_soc_jack_free_gpios(&rx51_av_jack, ARRAY_SIZE(rx51_av_jack_gpios), + rx51_av_jack_gpios); + platform_device_unregister(rx51_snd_device); gpio_free(RX51_TVOUT_SEL_GPIO); } -- cgit v1.2.3 From f22aa94908352f40fce65b9a9180370fb09ecbe9 Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Wed, 16 Jun 2010 17:57:27 +0200 Subject: ALSA: usb-audio: clean up includes in clock.c Signed-off-by: Daniel Mack Signed-off-by: Takashi Iwai --- sound/usb/clock.c | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) (limited to 'sound') diff --git a/sound/usb/clock.c b/sound/usb/clock.c index b5855114667e..386b09c5ce73 100644 --- a/sound/usb/clock.c +++ b/sound/usb/clock.c @@ -19,33 +19,19 @@ #include #include -#include -#include #include #include -#include -#include #include #include #include #include #include -#include -#include #include "usbaudio.h" #include "card.h" -#include "midi.h" -#include "mixer.h" -#include "proc.h" -#include "quirks.h" -#include "endpoint.h" #include "helper.h" -#include "debug.h" -#include "pcm.h" -#include "urb.h" -#include "format.h" +#include "clock.h" static struct uac_clock_source_descriptor * snd_usb_find_clock_source(struct usb_host_interface *ctrl_iface, -- cgit v1.2.3 From 69da9bcb98ccbfb5d5f751bc13418f1307332925 Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Wed, 16 Jun 2010 17:57:28 +0200 Subject: ALSA: usb-audio: unify UAC macros and struct names Get rid of the last occurances of _v1 suffixes, and move the version number right after the "uac" string. Now things are consitent again. Sorry for the forth and back, but it just looks much nicer this way. Signed-off-by: Daniel Mack Signed-off-by: Takashi Iwai --- sound/usb/card.c | 2 +- sound/usb/endpoint.c | 4 ++-- sound/usb/mixer.c | 14 +++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) (limited to 'sound') diff --git a/sound/usb/card.c b/sound/usb/card.c index 7a8ac1d81be7..9feb00c831a0 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c @@ -217,7 +217,7 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif) switch (protocol) { case UAC_VERSION_1: { - struct uac_ac_header_descriptor_v1 *h1 = control_header; + struct uac1_ac_header_descriptor *h1 = control_header; if (!h1->bInCollection) { snd_printk(KERN_INFO "skipping empty audio interface (v1)\n"); diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c index 6f6596cf2b19..2af0f9e3dcdf 100644 --- a/sound/usb/endpoint.c +++ b/sound/usb/endpoint.c @@ -275,7 +275,7 @@ int snd_usb_parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) /* get audio formats */ switch (protocol) { case UAC_VERSION_1: { - struct uac_as_header_descriptor_v1 *as = + struct uac1_as_header_descriptor *as = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, UAC_AS_GENERAL); if (!as) { @@ -297,7 +297,7 @@ int snd_usb_parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) case UAC_VERSION_2: { struct uac2_input_terminal_descriptor *input_term; struct uac2_output_terminal_descriptor *output_term; - struct uac_as_header_descriptor_v2 *as = + struct uac2_as_header_descriptor *as = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, UAC_AS_GENERAL); if (!as) { diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 736d134cc03c..ba54eb6bb0c9 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -582,9 +582,9 @@ static int get_term_name(struct mixer_build *state, struct usb_audio_term *iterm switch (iterm->type >> 16) { case UAC_SELECTOR_UNIT: strcpy(name, "Selector"); return 8; - case UAC_PROCESSING_UNIT_V1: + case UAC1_PROCESSING_UNIT: strcpy(name, "Process Unit"); return 12; - case UAC_EXTENSION_UNIT_V1: + case UAC1_EXTENSION_UNIT: strcpy(name, "Ext Unit"); return 8; case UAC_MIXER_UNIT: strcpy(name, "Mixer"); return 5; @@ -672,8 +672,8 @@ static int check_input_term(struct mixer_build *state, int id, struct usb_audio_ term->name = uac_selector_unit_iSelector(d); return 0; } - case UAC_PROCESSING_UNIT_V1: - case UAC_EXTENSION_UNIT_V1: { + case UAC1_PROCESSING_UNIT: + case UAC1_EXTENSION_UNIT: { struct uac_processing_unit_descriptor *d = p1; if (d->bNrInPins) { id = d->baSourceID[0]; @@ -1855,13 +1855,13 @@ static int parse_audio_unit(struct mixer_build *state, int unitid) return parse_audio_selector_unit(state, unitid, p1); case UAC_FEATURE_UNIT: return parse_audio_feature_unit(state, unitid, p1); - case UAC_PROCESSING_UNIT_V1: + case UAC1_PROCESSING_UNIT: /* UAC2_EFFECT_UNIT has the same value */ if (state->mixer->protocol == UAC_VERSION_1) return parse_audio_processing_unit(state, unitid, p1); else return 0; /* FIXME - effect units not implemented yet */ - case UAC_EXTENSION_UNIT_V1: + case UAC1_EXTENSION_UNIT: /* UAC2_PROCESSING_UNIT_V2 has the same value */ if (state->mixer->protocol == UAC_VERSION_1) return parse_audio_extension_unit(state, unitid, p1); @@ -1925,7 +1925,7 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) p = NULL; while ((p = snd_usb_find_csint_desc(hostif->extra, hostif->extralen, p, UAC_OUTPUT_TERMINAL)) != NULL) { if (mixer->protocol == UAC_VERSION_1) { - struct uac_output_terminal_descriptor_v1 *desc = p; + struct uac1_output_terminal_descriptor *desc = p; if (desc->bLength < sizeof(*desc)) continue; /* invalid descriptor? */ -- cgit v1.2.3 From 21af7d8c0c0a88f6f9fc6993d73001b4caf23b08 Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Wed, 16 Jun 2010 17:57:29 +0200 Subject: ALSA: usb-midi: whitespace fixes Signed-off-by: Daniel Mack Signed-off-by: Takashi Iwai --- sound/usb/midi.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'sound') diff --git a/sound/usb/midi.c b/sound/usb/midi.c index 46785643c66d..b9c2bc65f51a 100644 --- a/sound/usb/midi.c +++ b/sound/usb/midi.c @@ -434,7 +434,7 @@ static void snd_usbmidi_maudio_broken_running_status_input( u8 cin = buffer[i] & 0x0f; struct usbmidi_in_port *port = &ep->ports[cable]; int length; - + length = snd_usbmidi_cin_length[cin]; if (cin == 0xf && buffer[i + 1] >= 0xf8) ; /* realtime msg: no running status change */ @@ -628,13 +628,13 @@ static struct usb_protocol_ops snd_usbmidi_standard_ops = { static struct usb_protocol_ops snd_usbmidi_midiman_ops = { .input = snd_usbmidi_midiman_input, - .output = snd_usbmidi_standard_output, + .output = snd_usbmidi_standard_output, .output_packet = snd_usbmidi_output_midiman_packet, }; static struct usb_protocol_ops snd_usbmidi_maudio_broken_running_status_ops = { .input = snd_usbmidi_maudio_broken_running_status_input, - .output = snd_usbmidi_standard_output, + .output = snd_usbmidi_standard_output, .output_packet = snd_usbmidi_output_standard_packet, }; @@ -1248,7 +1248,7 @@ static void snd_usbmidi_out_endpoint_delete(struct snd_usb_midi_out_endpoint *ep */ static int snd_usbmidi_out_endpoint_create(struct snd_usb_midi* umidi, struct snd_usb_midi_endpoint_info* ep_info, - struct snd_usb_midi_endpoint* rep) + struct snd_usb_midi_endpoint* rep) { struct snd_usb_midi_out_endpoint* ep; unsigned int i; @@ -1398,7 +1398,7 @@ static void snd_usbmidi_rawmidi_free(struct snd_rawmidi *rmidi) } static struct snd_rawmidi_substream *snd_usbmidi_find_substream(struct snd_usb_midi* umidi, - int stream, int number) + int stream, int number) { struct list_head* list; @@ -1811,7 +1811,7 @@ static int snd_usbmidi_detect_endpoints(struct snd_usb_midi* umidi, snd_usbmidi_switch_roland_altsetting(umidi); if (endpoint[0].out_ep || endpoint[0].in_ep) - return 0; + return 0; intf = umidi->iface; if (!intf || intf->num_altsetting < 1) @@ -1849,7 +1849,7 @@ static int snd_usbmidi_detect_per_port_endpoints(struct snd_usb_midi* umidi, struct snd_usb_midi_endpoint_info* endpoints) { int err, i; - + err = snd_usbmidi_detect_endpoints(umidi, endpoints, MIDI_MAX_ENDPOINTS); for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) { if (endpoints[i].out_ep) -- cgit v1.2.3 From 157a57b6fae7d3c6d24b7623dcc6679c6d244621 Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Wed, 16 Jun 2010 17:57:30 +0200 Subject: ALSA: usb-audio: move and add some comments Also add a list of open topics. Signed-off-by: Daniel Mack Signed-off-by: Takashi Iwai --- sound/usb/clock.c | 16 ++++++++++++++-- sound/usb/mixer.c | 24 ++++++++++++++++-------- 2 files changed, 30 insertions(+), 10 deletions(-) (limited to 'sound') diff --git a/sound/usb/clock.c b/sound/usb/clock.c index 386b09c5ce73..7279d6190875 100644 --- a/sound/usb/clock.c +++ b/sound/usb/clock.c @@ -120,8 +120,6 @@ static bool uac_clock_source_is_valid(struct snd_usb_audio *chip, int source_id) return !!data; } -/* Try to find the clock source ID of a given clock entity */ - static int __uac_clock_find_source(struct snd_usb_audio *chip, struct usb_host_interface *host_iface, int entity_id, unsigned long *visited) @@ -154,6 +152,8 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, if (ret < 0) return ret; + /* Selector values are one-based */ + if (ret > selector->bNrInPins || ret < 1) { printk(KERN_ERR "%s(): selector reported illegal value, id %d, ret %d\n", @@ -176,6 +176,17 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, return -EINVAL; } +/* + * For all kinds of sample rate settings and other device queries, + * the clock source (end-leaf) must be used. However, clock selectors, + * clock multipliers and sample rate converters may be specified as + * clock source input to terminal. This functions walks the clock path + * to its end and tries to find the source. + * + * The 'visited' bitfield is used internally to detect recursive loops. + * + * Returns the clock source UnitID (>=0) on success, or an error. + */ int snd_usb_clock_find_source(struct snd_usb_audio *chip, struct usb_host_interface *host_iface, int entity_id) @@ -246,6 +257,7 @@ static int set_sample_rate_v2(struct snd_usb_audio *chip, int iface, return clock; if (!uac_clock_source_is_valid(chip, clock)) { + /* TODO: should we try to find valid clock setups by ourself? */ snd_printk(KERN_ERR "%d:%d:%d: clock source %d is not valid, cannot use\n", dev->devnum, iface, fmt->altsetting, clock); return -ENXIO; diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index ba54eb6bb0c9..1163ec3ca8a0 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -26,6 +26,22 @@ * */ +/* + * TODOs, for both the mixer and the streaming interfaces: + * + * - support for UAC2 effect units + * - support for graphical equalizers + * - RANGE and MEM set commands (UAC2) + * - RANGE and MEM interrupt dispatchers (UAC2) + * - audio channel clustering (UAC2) + * - audio sample rate converter units (UAC2) + * - proper handling of clock multipliers (UAC2) + * - dispatch clock change notifications (UAC2) + * - stop PCM streams which use a clock that became invalid + * - stop PCM streams which use a clock selector that has changed + * - parse available sample rates again when clock sources changed + */ + #include #include #include @@ -1199,14 +1215,6 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void } } else { /* UAC_VERSION_2 */ for (i = 0; i < 30/2; i++) { - /* From the USB Audio spec v2.0: - bmaControls() is a (ch+1)-element array of 4-byte bitmaps, - each containing a set of bit pairs. If a Control is present, - it must be Host readable. If a certain Control is not - present then the bit pair must be set to 0b00. - If a Control is present but read-only, the bit pair must be - set to 0b01. If a Control is also Host programmable, the bit - pair must be set to 0b11. The value 0b10 is not allowed. */ unsigned int ch_bits = 0; unsigned int ch_read_only = 0; -- cgit v1.2.3 From 3d8d4dcfd423b01ef7ea7c3c97720764b7adb6df Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Wed, 16 Jun 2010 17:57:31 +0200 Subject: ALSA: usb-audio: simplify control interface access As the control interface is now carried in struct snd_usb_audio, we can simplify the API a little and also drop the private ctrlif field from struct usb_mixer_interface. Also remove a left-over function prototype in pcm.h. Signed-off-by: Daniel Mack Signed-off-by: Takashi Iwai --- sound/usb/clock.c | 22 +++++++++------------- sound/usb/clock.h | 4 +--- sound/usb/endpoint.c | 1 + sound/usb/format.c | 9 ++++----- sound/usb/mixer.c | 37 ++++++++++++++++++------------------- sound/usb/mixer.h | 1 - sound/usb/pcm.h | 3 --- sound/usb/quirks.c | 1 + 8 files changed, 34 insertions(+), 44 deletions(-) (limited to 'sound') diff --git a/sound/usb/clock.c b/sound/usb/clock.c index 7279d6190875..66bd1574d80b 100644 --- a/sound/usb/clock.c +++ b/sound/usb/clock.c @@ -121,7 +121,6 @@ static bool uac_clock_source_is_valid(struct snd_usb_audio *chip, int source_id) } static int __uac_clock_find_source(struct snd_usb_audio *chip, - struct usb_host_interface *host_iface, int entity_id, unsigned long *visited) { struct uac_clock_source_descriptor *source; @@ -138,11 +137,11 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, } /* first, see if the ID we're looking for is a clock source already */ - source = snd_usb_find_clock_source(host_iface, entity_id); + source = snd_usb_find_clock_source(chip->ctrl_intf, entity_id); if (source) return source->bClockID; - selector = snd_usb_find_clock_selector(host_iface, entity_id); + selector = snd_usb_find_clock_selector(chip->ctrl_intf, entity_id); if (selector) { int ret; @@ -162,16 +161,15 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, return -EINVAL; } - return __uac_clock_find_source(chip, host_iface, - selector->baCSourceID[ret-1], + return __uac_clock_find_source(chip, selector->baCSourceID[ret-1], visited); } /* FIXME: multipliers only act as pass-thru element for now */ - multiplier = snd_usb_find_clock_multiplier(host_iface, entity_id); + multiplier = snd_usb_find_clock_multiplier(chip->ctrl_intf, entity_id); if (multiplier) - return __uac_clock_find_source(chip, host_iface, - multiplier->bCSourceID, visited); + return __uac_clock_find_source(chip, multiplier->bCSourceID, + visited); return -EINVAL; } @@ -187,13 +185,11 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, * * Returns the clock source UnitID (>=0) on success, or an error. */ -int snd_usb_clock_find_source(struct snd_usb_audio *chip, - struct usb_host_interface *host_iface, - int entity_id) +int snd_usb_clock_find_source(struct snd_usb_audio *chip, int entity_id) { DECLARE_BITMAP(visited, 256); memset(visited, 0, sizeof(visited)); - return __uac_clock_find_source(chip, host_iface, entity_id, visited); + return __uac_clock_find_source(chip, entity_id, visited); } static int set_sample_rate_v1(struct snd_usb_audio *chip, int iface, @@ -251,7 +247,7 @@ static int set_sample_rate_v2(struct snd_usb_audio *chip, int iface, struct usb_device *dev = chip->dev; unsigned char data[4]; int err, crate; - int clock = snd_usb_clock_find_source(chip, chip->ctrl_intf, fmt->clock); + int clock = snd_usb_clock_find_source(chip, fmt->clock); if (clock < 0) return clock; diff --git a/sound/usb/clock.h b/sound/usb/clock.h index beb253684e2d..46630936d31f 100644 --- a/sound/usb/clock.h +++ b/sound/usb/clock.h @@ -5,8 +5,6 @@ int snd_usb_init_sample_rate(struct snd_usb_audio *chip, int iface, struct usb_host_interface *alts, struct audioformat *fmt, int rate); -int snd_usb_clock_find_source(struct snd_usb_audio *chip, - struct usb_host_interface *host_iface, - int entity_id); +int snd_usb_clock_find_source(struct snd_usb_audio *chip, int entity_id); #endif /* __USBAUDIO_CLOCK_H */ diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c index 2af0f9e3dcdf..1a701f1e8f50 100644 --- a/sound/usb/endpoint.c +++ b/sound/usb/endpoint.c @@ -33,6 +33,7 @@ #include "pcm.h" #include "helper.h" #include "format.h" +#include "clock.h" /* * free a substream diff --git a/sound/usb/format.c b/sound/usb/format.c index 30364aba79cc..4387f54d73db 100644 --- a/sound/usb/format.c +++ b/sound/usb/format.c @@ -264,13 +264,12 @@ static int parse_uac2_sample_rate_range(struct audioformat *fp, int nr_triplets, * on the audioformat table (audio class v2). */ static int parse_audio_format_rates_v2(struct snd_usb_audio *chip, - struct audioformat *fp, - struct usb_host_interface *iface) + struct audioformat *fp) { struct usb_device *dev = chip->dev; unsigned char tmp[2], *data; int nr_triplets, data_size, ret = 0; - int clock = snd_usb_clock_find_source(chip, chip->ctrl_intf, fp->clock); + int clock = snd_usb_clock_find_source(chip, fp->clock); if (clock < 0) { snd_printk(KERN_ERR "%s(): unable to find clock source (clock %d)\n", @@ -391,7 +390,7 @@ static int parse_audio_format_i(struct snd_usb_audio *chip, break; case UAC_VERSION_2: /* fp->channels is already set in this case */ - ret = parse_audio_format_rates_v2(chip, fp, iface); + ret = parse_audio_format_rates_v2(chip, fp); break; } @@ -450,7 +449,7 @@ static int parse_audio_format_ii(struct snd_usb_audio *chip, framesize = le16_to_cpu(fmt->wSamplesPerFrame); snd_printd(KERN_INFO "found format II with max.bitrate = %d, frame size=%d\n", brate, framesize); fp->frame_size = framesize; - ret = parse_audio_format_rates_v2(chip, fp, iface); + ret = parse_audio_format_rates_v2(chip, fp); break; } } diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 1163ec3ca8a0..035a77bd67a6 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -291,16 +291,15 @@ static int get_abs_value(struct usb_mixer_elem_info *cval, int val) static int get_ctl_value_v1(struct usb_mixer_elem_info *cval, int request, int validx, int *value_ret) { + struct snd_usb_audio *chip = cval->mixer->chip; unsigned char buf[2]; int val_len = cval->val_type >= USB_MIXER_S16 ? 2 : 1; int timeout = 10; while (timeout-- > 0) { - if (snd_usb_ctl_msg(cval->mixer->chip->dev, - usb_rcvctrlpipe(cval->mixer->chip->dev, 0), - request, + if (snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), request, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN, - validx, cval->mixer->ctrlif | (cval->id << 8), + validx, snd_usb_ctrl_intf(chip) | (cval->id << 8), buf, val_len, 100) >= val_len) { *value_ret = convert_signed_value(cval, snd_usb_combine_bytes(buf, val_len)); return 0; @@ -313,6 +312,7 @@ static int get_ctl_value_v1(struct usb_mixer_elem_info *cval, int request, int v static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, int validx, int *value_ret) { + struct snd_usb_audio *chip = cval->mixer->chip; unsigned char buf[2 + 3*sizeof(__u16)]; /* enough space for one range */ unsigned char *val; int ret, size; @@ -328,16 +328,14 @@ static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, int v memset(buf, 0, sizeof(buf)); - ret = snd_usb_ctl_msg(cval->mixer->chip->dev, - usb_rcvctrlpipe(cval->mixer->chip->dev, 0), - bRequest, + ret = snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), bRequest, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN, - validx, cval->mixer->ctrlif | (cval->id << 8), + validx, snd_usb_ctrl_intf(chip) | (cval->id << 8), buf, size, 1000); if (ret < 0) { snd_printk(KERN_ERR "cannot get ctl value: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n", - request, validx, cval->mixer->ctrlif | (cval->id << 8), cval->val_type); + request, validx, snd_usb_ctrl_intf(chip) | (cval->id << 8), cval->val_type); return ret; } @@ -413,6 +411,7 @@ static int get_cur_mix_value(struct usb_mixer_elem_info *cval, int snd_usb_mixer_set_ctl_value(struct usb_mixer_elem_info *cval, int request, int validx, int value_set) { + struct snd_usb_audio *chip = cval->mixer->chip; unsigned char buf[2]; int val_len, timeout = 10; @@ -435,15 +434,14 @@ int snd_usb_mixer_set_ctl_value(struct usb_mixer_elem_info *cval, buf[0] = value_set & 0xff; buf[1] = (value_set >> 8) & 0xff; while (timeout-- > 0) - if (snd_usb_ctl_msg(cval->mixer->chip->dev, - usb_sndctrlpipe(cval->mixer->chip->dev, 0), - request, + if (snd_usb_ctl_msg(chip->dev, + usb_sndctrlpipe(chip->dev, 0), request, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT, - validx, cval->mixer->ctrlif | (cval->id << 8), + validx, snd_usb_ctrl_intf(chip) | (cval->id << 8), buf, val_len, 100) >= 0) return 0; snd_printdd(KERN_ERR "cannot set ctl value: req = %#x, wValue = %#x, wIndex = %#x, type = %d, data = %#x/%#x\n", - request, validx, cval->mixer->ctrlif | (cval->id << 8), cval->val_type, buf[0], buf[1]); + request, validx, snd_usb_ctrl_intf(chip) | (cval->id << 8), cval->val_type, buf[0], buf[1]); return -EINVAL; } @@ -761,6 +759,8 @@ static void usb_mixer_elem_free(struct snd_kcontrol *kctl) */ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min) { + struct snd_usb_audio *chip = cval->mixer->chip; + /* for failsafe */ cval->min = default_min; cval->max = cval->min + 1; @@ -783,7 +783,7 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min) if (get_ctl_value(cval, UAC_GET_MAX, (cval->control << 8) | minchn, &cval->max) < 0 || get_ctl_value(cval, UAC_GET_MIN, (cval->control << 8) | minchn, &cval->min) < 0) { snd_printd(KERN_ERR "%d:%d: cannot get min/max values for control %d (id %d)\n", - cval->id, cval->mixer->ctrlif, cval->control, cval->id); + cval->id, snd_usb_ctrl_intf(chip), cval->control, cval->id); return -EINVAL; } if (get_ctl_value(cval, UAC_GET_RES, (cval->control << 8) | minchn, &cval->res) < 0) { @@ -1913,7 +1913,7 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) struct usb_host_interface *hostif; void *p; - hostif = &usb_ifnum_to_if(mixer->chip->dev, mixer->ctrlif)->altsetting[0]; + hostif = mixer->chip->ctrl_intf; memset(&state, 0, sizeof(state)); state.chip = mixer->chip; state.mixer = mixer; @@ -2005,7 +2005,7 @@ static void snd_usb_mixer_proc_read(struct snd_info_entry *entry, list_for_each_entry(mixer, &chip->mixer_list, list) { snd_iprintf(buffer, "USB Mixer: usb_id=0x%08x, ctrlif=%i, ctlerr=%i\n", - chip->usb_id, mixer->ctrlif, + chip->usb_id, snd_usb_ctrl_intf(chip), mixer->ignore_ctl_error); snd_iprintf(buffer, "Card: %s\n", chip->card->longname); for (unitid = 0; unitid < MAX_ID_ELEMS; unitid++) { @@ -2123,7 +2123,7 @@ static int snd_usb_mixer_status_create(struct usb_mixer_interface *mixer) int buffer_length; unsigned int epnum; - hostif = &usb_ifnum_to_if(mixer->chip->dev, mixer->ctrlif)->altsetting[0]; + hostif = mixer->chip->ctrl_intf; /* we need one interrupt input endpoint */ if (get_iface_desc(hostif)->bNumEndpoints < 1) return 0; @@ -2166,7 +2166,6 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif, if (!mixer) return -ENOMEM; mixer->chip = chip; - mixer->ctrlif = ctrlif; mixer->ignore_ctl_error = ignore_error; mixer->id_elems = kcalloc(MAX_ID_ELEMS, sizeof(*mixer->id_elems), GFP_KERNEL); diff --git a/sound/usb/mixer.h b/sound/usb/mixer.h index a7cf1007fbb0..26c636c5c93a 100644 --- a/sound/usb/mixer.h +++ b/sound/usb/mixer.h @@ -3,7 +3,6 @@ struct usb_mixer_interface { struct snd_usb_audio *chip; - unsigned int ctrlif; struct list_head list; unsigned int ignore_ctl_error; struct urb *urb; diff --git a/sound/usb/pcm.h b/sound/usb/pcm.h index 1c931b68f3b5..ed3e283f618d 100644 --- a/sound/usb/pcm.h +++ b/sound/usb/pcm.h @@ -7,8 +7,5 @@ int snd_usb_init_pitch(struct snd_usb_audio *chip, int iface, struct usb_host_interface *alts, struct audioformat *fmt); -int snd_usb_init_sample_rate(struct snd_usb_audio *chip, int iface, - struct usb_host_interface *alts, - struct audioformat *fmt, int rate); #endif /* __USBAUDIO_PCM_H */ diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index b45e54c09ba2..9a9da09586a5 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -32,6 +32,7 @@ #include "helper.h" #include "endpoint.h" #include "pcm.h" +#include "clock.h" /* * handle the quirks for the contained interfaces -- cgit v1.2.3 From d1eb57f47b7f524c13112c891e87fb1f51029fd1 Mon Sep 17 00:00:00 2001 From: Kailang Yang Date: Wed, 23 Jun 2010 16:25:26 +0200 Subject: ALSA: hda - Support ALC680 codec Signed-off-by: Kailang Yang Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 331 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 330 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index f1ce7d7f5aa3..630e66743e8e 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -18612,7 +18612,7 @@ static int alc662_parse_auto_config(struct hda_codec *codec) add_verb(spec, alc662_init_verbs); if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 || - codec->vendor_id == 0x10ec0665) + codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670) add_verb(spec, alc663_init_verbs); if (codec->vendor_id == 0x10ec0272) @@ -18755,6 +18755,334 @@ static int patch_alc888(struct hda_codec *codec) return patch_alc882(codec); } +/* + * ALC680 support + */ +#define ALC680_DIGOUT_NID ALC880_DIGOUT_NID +#define alc680_modes alc260_modes + +static hda_nid_t alc680_dac_nids[3] = { + /* Lout1, Lout2, hp */ + 0x02, 0x03, 0x04 +}; + +static hda_nid_t alc680_adc_nids[3] = { + /* ADC0-2 */ + /* DMIC, MIC, Line-in*/ + 0x07, 0x08, 0x09 +}; + +static struct snd_kcontrol_new alc680_base_mixer[] = { + /* output mixer control */ + HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), + HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT), + HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), + { } +}; + +static struct snd_kcontrol_new alc680_capture_mixer[] = { + HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT), + HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT), + HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT), + HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT), + HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x09, 0x0, HDA_INPUT), + HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x09, 0x0, HDA_INPUT), + { } /* end */ +}; + +/* + * generic initialization of ADC, input mixers and output mixers + */ +static struct hda_verb alc680_init_verbs[] = { + /* Unmute DAC0-1 and set vol = 0 */ + {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + + {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, + {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, + {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, + {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, + {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, + + {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + { } +}; + +/* create input playback/capture controls for the given pin */ +static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid, + const char *ctlname, int idx) +{ + hda_nid_t dac; + int err; + + switch (nid) { + case 0x14: + dac = 0x02; + break; + case 0x15: + dac = 0x03; + break; + case 0x16: + dac = 0x04; + break; + default: + return 0; + } + if (spec->multiout.dac_nids[0] != dac && + spec->multiout.dac_nids[1] != dac) { + err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname, + HDA_COMPOSE_AMP_VAL(dac, 3, idx, + HDA_OUTPUT)); + if (err < 0) + return err; + + err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname, + HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT)); + + if (err < 0) + return err; + spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac; + } + + return 0; +} + +/* add playback controls from the parsed DAC table */ +static int alc680_auto_create_multi_out_ctls(struct alc_spec *spec, + const struct auto_pin_cfg *cfg) +{ + hda_nid_t nid; + int err; + + spec->multiout.dac_nids = spec->private_dac_nids; + + nid = cfg->line_out_pins[0]; + if (nid) { + const char *name; + if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) + name = "Speaker"; + else + name = "Front"; + err = alc680_new_analog_output(spec, nid, name, 0); + if (err < 0) + return err; + } + + nid = cfg->speaker_pins[0]; + if (nid) { + err = alc680_new_analog_output(spec, nid, "Speaker", 0); + if (err < 0) + return err; + } + nid = cfg->hp_pins[0]; + if (nid) { + err = alc680_new_analog_output(spec, nid, "Headphone", 0); + if (err < 0) + return err; + } + + return 0; +} + +static void alc680_auto_set_output_and_unmute(struct hda_codec *codec, + hda_nid_t nid, int pin_type) +{ + alc_set_pin_output(codec, nid, pin_type); +} + +static void alc680_auto_init_multi_out(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + hda_nid_t nid = spec->autocfg.line_out_pins[0]; + if (nid) { + int pin_type = get_pin_type(spec->autocfg.line_out_type); + alc680_auto_set_output_and_unmute(codec, nid, pin_type); + } +} + +static void alc680_auto_init_hp_out(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + hda_nid_t pin; + + pin = spec->autocfg.hp_pins[0]; + if (pin) + alc680_auto_set_output_and_unmute(codec, pin, PIN_HP); + pin = spec->autocfg.speaker_pins[0]; + if (pin) + alc680_auto_set_output_and_unmute(codec, pin, PIN_OUT); +} + +/* pcm configuration: identical with ALC880 */ +#define alc680_pcm_analog_playback alc880_pcm_analog_playback +#define alc680_pcm_analog_capture alc880_pcm_analog_capture +#define alc680_pcm_analog_alt_capture alc880_pcm_analog_alt_capture +#define alc680_pcm_digital_playback alc880_pcm_digital_playback + +static struct hda_input_mux alc680_capture_source = { + .num_items = 1, + .items = { + { "Mic", 0x0 }, + }, +}; + +/* + * BIOS auto configuration + */ +static int alc680_parse_auto_config(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + int err; + static hda_nid_t alc680_ignore[] = { 0 }; + + err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, + alc680_ignore); + if (err < 0) + return err; + if (!spec->autocfg.line_outs) { + if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) { + spec->multiout.max_channels = 2; + spec->no_analog = 1; + goto dig_only; + } + return 0; /* can't find valid BIOS pin config */ + } + err = alc680_auto_create_multi_out_ctls(spec, &spec->autocfg); + if (err < 0) + return err; + + spec->multiout.max_channels = 2; + + dig_only: + /* digital only support output */ + if (spec->autocfg.dig_outs) { + spec->multiout.dig_out_nid = ALC680_DIGOUT_NID; + spec->dig_out_type = spec->autocfg.dig_out_type[0]; + } + if (spec->kctls.list) + add_mixer(spec, spec->kctls.list); + + add_verb(spec, alc680_init_verbs); + spec->num_mux_defs = 1; + spec->input_mux = &alc680_capture_source; + + err = alc_auto_add_mic_boost(codec); + if (err < 0) + return err; + + return 1; +} + +#define alc680_auto_init_analog_input alc882_auto_init_analog_input + +/* init callback for auto-configuration model -- overriding the default init */ +static void alc680_auto_init(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + alc680_auto_init_multi_out(codec); + alc680_auto_init_hp_out(codec); + alc680_auto_init_analog_input(codec); + if (spec->unsol_event) + alc_inithook(codec); +} + +/* + * configuration and preset + */ +static const char *alc680_models[ALC680_MODEL_LAST] = { + [ALC680_BASE] = "alc680_base", +}; + +static struct snd_pci_quirk alc680_cfg_tbl[] = { + SND_PCI_QUIRK(0x1043, 0x12f3, "ASUS NX90", ALC680_BASE), + {} +}; + +static struct alc_config_preset alc680_presets[] = { + [ALC680_BASE] = { + .mixers = { alc680_base_mixer }, + .cap_mixer = alc680_capture_mixer, + .init_verbs = { alc680_init_verbs }, + .num_dacs = ARRAY_SIZE(alc680_dac_nids), + .dac_nids = alc680_dac_nids, + .num_adc_nids = ARRAY_SIZE(alc680_adc_nids), + .adc_nids = alc680_adc_nids, + .hp_nid = 0x04, + .dig_out_nid = ALC680_DIGOUT_NID, + .num_channel_mode = ARRAY_SIZE(alc680_modes), + .channel_mode = alc680_modes, + .input_mux = &alc680_capture_source, + }, +}; + +static int patch_alc680(struct hda_codec *codec) +{ + struct alc_spec *spec; + int board_config; + int err; + + spec = kzalloc(sizeof(*spec), GFP_KERNEL); + if (spec == NULL) + return -ENOMEM; + + codec->spec = spec; + + board_config = snd_hda_check_board_config(codec, ALC680_MODEL_LAST, + alc680_models, + alc680_cfg_tbl); + + if (board_config < 0 || board_config >= ALC680_MODEL_LAST) { + printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", + codec->chip_name); + board_config = ALC680_AUTO; + } + + if (board_config == ALC680_AUTO) { + /* automatic parse from the BIOS config */ + err = alc680_parse_auto_config(codec); + if (err < 0) { + alc_free(codec); + return err; + } else if (!err) { + printk(KERN_INFO + "hda_codec: Cannot set up configuration " + "from BIOS. Using base mode...\n"); + board_config = ALC680_BASE; + } + } + + if (board_config != ALC680_AUTO) + setup_preset(codec, &alc680_presets[board_config]); + + spec->stream_analog_playback = &alc680_pcm_analog_playback; + spec->stream_analog_capture = &alc680_pcm_analog_capture; + spec->stream_analog_alt_capture = &alc680_pcm_analog_alt_capture; + spec->stream_digital_playback = &alc680_pcm_digital_playback; + + if (!spec->adc_nids) { + spec->adc_nids = alc680_adc_nids; + spec->num_adc_nids = ARRAY_SIZE(alc680_adc_nids); + } + + if (!spec->cap_mixer) + set_capture_mixer(codec); + + spec->vmaster_nid = 0x02; + + codec->patch_ops = alc_patch_ops; + if (board_config == ALC680_AUTO) + spec->init_hook = alc680_auto_init; + + return 0; +} + /* * patch entries */ @@ -18779,6 +19107,7 @@ static struct hda_codec_preset snd_hda_preset_realtek[] = { { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 }, { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 }, { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 }, + { .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 }, { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 }, { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 }, { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 }, -- cgit v1.2.3 From d4a86d81944d3cccb3f4a309230e835823a61252 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Wed, 23 Jun 2010 17:51:26 +0200 Subject: ALSA: hda - Add missing ALC680_* definitions Also update the documentation. Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 630e66743e8e..9b15a46e3ccc 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -256,6 +256,13 @@ enum { ALC882_MODEL_LAST, }; +/* ALC680 models */ +enum { + ALC680_BASE, + ALC680_AUTO, + ALC680_MODEL_LAST, +}; + /* for GPIO Poll */ #define GPIO_MASK 0x03 @@ -18997,7 +19004,8 @@ static void alc680_auto_init(struct hda_codec *codec) * configuration and preset */ static const char *alc680_models[ALC680_MODEL_LAST] = { - [ALC680_BASE] = "alc680_base", + [ALC680_BASE] = "base", + [ALC680_AUTO] = "auto", }; static struct snd_pci_quirk alc680_cfg_tbl[] = { -- cgit v1.2.3 From b415ec7041429bb2cde3419e9556049fe12bf27a Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Thu, 24 Jun 2010 08:07:28 +0200 Subject: ALSA: usb - Fix compile error with CONFIG_SND_DEBUG_VERBOSE=y Replaced the forgotten cval->mixer->ctrlif. Signed-off-by: Takashi Iwai --- sound/usb/mixer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 035a77bd67a6..c166db0057d3 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -306,7 +306,7 @@ static int get_ctl_value_v1(struct usb_mixer_elem_info *cval, int request, int v } } snd_printdd(KERN_ERR "cannot get ctl value: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n", - request, validx, cval->mixer->ctrlif | (cval->id << 8), cval->val_type); + request, validx, snd_usb_ctrl_intf(chip) | (cval->id << 8), cval->val_type); return -EINVAL; } -- cgit v1.2.3 From cc3202f5da3c81a99c5f3a605df527da7a77eed3 Mon Sep 17 00:00:00 2001 From: Vladimir Zapolskiy Date: Thu, 24 Jun 2010 17:38:50 +0400 Subject: ASoC: uda134x: replace a macro with a value in platform struct. This change wipes out a hardcoded macro, which enables codec bias level control. Now is_powered_on_standby value shall be used instead. Signed-off-by: Vladimir Zapolskiy Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/uda134x.c | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/uda134x.c b/sound/soc/codecs/uda134x.c index 28aac53c97bb..30cf2f9d3298 100644 --- a/sound/soc/codecs/uda134x.c +++ b/sound/soc/codecs/uda134x.c @@ -28,19 +28,6 @@ #include "uda134x.h" -#define POWER_OFF_ON_STANDBY 1 -/* - ALSA SOC usually puts the device in standby mode when it's not used - for sometime. If you define POWER_OFF_ON_STANDBY the driver will - turn off the ADC/DAC when this callback is invoked and turn it back - on when needed. Unfortunately this will result in a very light bump - (it can be audible only with good earphones). If this bothers you - just comment this line, you will have slightly higher power - consumption . Please note that sending the L3 command for ADC is - enough to make the bump, so it doesn't make difference if you - completely take off power from the codec. - */ - #define UDA134X_RATES SNDRV_PCM_RATE_8000_48000 #define UDA134X_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE | \ SNDRV_PCM_FMTBIT_S18_3LE | SNDRV_PCM_FMTBIT_S20_3LE) @@ -531,9 +518,11 @@ static int uda134x_soc_probe(struct platform_device *pdev) codec->num_dai = 1; codec->read = uda134x_read_reg_cache; codec->write = uda134x_write; -#ifdef POWER_OFF_ON_STANDBY - codec->set_bias_level = uda134x_set_bias_level; -#endif + + if (!pd->is_powered_on_standby) { + codec->set_bias_level = uda134x_set_bias_level; + } + INIT_LIST_HEAD(&codec->dapm_widgets); INIT_LIST_HEAD(&codec->dapm_paths); -- cgit v1.2.3 From e4295b40ee64da20a3e31921745baba65e10ab36 Mon Sep 17 00:00:00 2001 From: Vladimir Zapolskiy Date: Thu, 24 Jun 2010 17:38:51 +0400 Subject: ASoC: uda134x: fix bias level setup on initialization On initialization ADC/DAC are enabled only for UDA1341, that's why bias_level shall be set to off explicitly, otherwise dapm is misinformed about bias_level on startup. Signed-off-by: Vladimir Zapolskiy Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/uda134x.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/uda134x.c b/sound/soc/codecs/uda134x.c index 30cf2f9d3298..52eada1f17fc 100644 --- a/sound/soc/codecs/uda134x.c +++ b/sound/soc/codecs/uda134x.c @@ -519,10 +519,6 @@ static int uda134x_soc_probe(struct platform_device *pdev) codec->read = uda134x_read_reg_cache; codec->write = uda134x_write; - if (!pd->is_powered_on_standby) { - codec->set_bias_level = uda134x_set_bias_level; - } - INIT_LIST_HEAD(&codec->dapm_widgets); INIT_LIST_HEAD(&codec->dapm_paths); @@ -533,6 +529,14 @@ static int uda134x_soc_probe(struct platform_device *pdev) uda134x_reset(codec); + if (pd->is_powered_on_standby) { + codec->set_bias_level = NULL; + uda134x_set_bias_level(codec, SND_SOC_BIAS_ON); + } else { + codec->set_bias_level = uda134x_set_bias_level; + uda134x_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + } + /* register pcms */ ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); if (ret < 0) { -- cgit v1.2.3 From 9c1be7e8cb1e33d4d7d4bed40466ee358fdf5a34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eric=20B=C3=A9nard?= Date: Sat, 19 Jun 2010 10:47:56 +0200 Subject: ASoC: clean i.MX Kconfig MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Eric Bénard Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/imx/Kconfig | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'sound') diff --git a/sound/soc/imx/Kconfig b/sound/soc/imx/Kconfig index 6ef57e056d6a..2f0d6d3e75dc 100644 --- a/sound/soc/imx/Kconfig +++ b/sound/soc/imx/Kconfig @@ -1,4 +1,4 @@ -config SND_IMX_SOC +menuconfig SND_IMX_SOC tristate "SoC Audio for Freescale i.MX CPUs" depends on ARCH_MXC select SND_PCM @@ -8,14 +8,12 @@ config SND_IMX_SOC Say Y or M if you want to add support for codecs attached to the i.MX SSI interface. -config SND_MXC_SOC_SSI - tristate +if SND_IMX_SOC config SND_MXC_SOC_WM1133_EV1 tristate "Audio on the the i.MX31ADS with WM1133-EV1 fitted" - depends on SND_IMX_SOC && MACH_MX31ADS_WM1133_EV1 && EXPERIMENTAL + depends on MACH_MX31ADS_WM1133_EV1 && EXPERIMENTAL select SND_SOC_WM8350 - select SND_MXC_SOC_SSI help Enable support for audio on the i.MX31ADS with the WM1133-EV1 PMIC board with WM8835x fitted. @@ -23,17 +21,17 @@ config SND_MXC_SOC_WM1133_EV1 config SND_SOC_PHYCORE_AC97 tristate "SoC Audio support for Phytec phyCORE (and phyCARD) boards" depends on MACH_PCM043 || MACH_PCA100 - select SND_MXC_SOC_SSI select SND_SOC_WM9712 help Say Y if you want to add support for SoC audio on Phytec phyCORE and phyCARD boards in AC97 mode config SND_SOC_EUKREA_TLV320 - bool "Eukrea TLV320" + tristate "Eukrea TLV320" depends on MACH_EUKREA_MBIMX27_BASEBOARD || MACH_EUKREA_MBIMXSD_BASEBOARD - select SND_IMX_SOC select SND_SOC_TLV320AIC23 help Enable I2S based access to the TLV320AIC23B codec attached to the SSI4 interface + +endif # SND_IMX_SOC -- cgit v1.2.3 From 5daeba34d2aab669aea07abee13d53cd116578fb Mon Sep 17 00:00:00 2001 From: David Dillow Date: Sun, 27 Jun 2010 00:13:20 +0200 Subject: ALSA: pcm_lib: avoid timing jitter in snd_pcm_read/write() When using poll() to wait for the next period -- or avail_min samples -- one gets a consistent delay for each system call that is usually just a little short of the selected period time. However, When using snd_pcm_read/write(), one gets a jittery delay that alternates between less than a millisecond and approximately two period times. This is caused by snd_pcm_lib_{read,write}1() transferring any available samples to the user's buffer and adjusting the application pointer prior to sleeping to the end of the current period. When the next period interrupt occurs, there is then less than avail_min samples remaining to be transferred in the period, so we end up sleeping until a second period occurs. This is solved by using runtime->twake as the number of samples needed for a wakeup in addition to selecting the proper wait queue to wake in snd_pcm_update_state(). This requires twake to be non-zero when used by snd_pcm_lib_{read,write}1() even if avail_min is zero. Signed-off-by: Dave Dillow Signed-off-by: Jaroslav Kysela --- sound/core/pcm_lib.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'sound') diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index e9d98be190c5..bcf95d3ff5c7 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c @@ -287,8 +287,11 @@ int snd_pcm_update_state(struct snd_pcm_substream *substream, return -EPIPE; } } - if (avail >= runtime->control->avail_min) - wake_up(runtime->twake ? &runtime->tsleep : &runtime->sleep); + if (runtime->twake) { + if (avail >= runtime->twake) + wake_up(&runtime->tsleep); + } else if (avail >= runtime->control->avail_min) + wake_up(&runtime->sleep); return 0; } @@ -1707,7 +1710,7 @@ EXPORT_SYMBOL(snd_pcm_period_elapsed); * The available space is stored on availp. When err = 0 and avail = 0 * on the capture stream, it indicates the stream is in DRAINING state. */ -static int wait_for_avail_min(struct snd_pcm_substream *substream, +static int wait_for_avail(struct snd_pcm_substream *substream, snd_pcm_uframes_t *availp) { struct snd_pcm_runtime *runtime = substream->runtime; @@ -1757,7 +1760,7 @@ static int wait_for_avail_min(struct snd_pcm_substream *substream, avail = snd_pcm_playback_avail(runtime); else avail = snd_pcm_capture_avail(runtime); - if (avail >= runtime->control->avail_min) + if (avail >= runtime->twake) break; } _endloop: @@ -1820,7 +1823,7 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream, goto _end_unlock; } - runtime->twake = 1; + runtime->twake = runtime->control->avail_min ? : 1; while (size > 0) { snd_pcm_uframes_t frames, appl_ptr, appl_ofs; snd_pcm_uframes_t avail; @@ -1833,7 +1836,9 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream, err = -EAGAIN; goto _end_unlock; } - err = wait_for_avail_min(substream, &avail); + runtime->twake = min_t(snd_pcm_uframes_t, size, + runtime->control->avail_min ? : 1); + err = wait_for_avail(substream, &avail); if (err < 0) goto _end_unlock; } @@ -2042,7 +2047,7 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream, goto _end_unlock; } - runtime->twake = 1; + runtime->twake = runtime->control->avail_min ? : 1; while (size > 0) { snd_pcm_uframes_t frames, appl_ptr, appl_ofs; snd_pcm_uframes_t avail; @@ -2060,7 +2065,9 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream, err = -EAGAIN; goto _end_unlock; } - err = wait_for_avail_min(substream, &avail); + runtime->twake = min_t(snd_pcm_uframes_t, size, + runtime->control->avail_min ? : 1); + err = wait_for_avail(substream, &avail); if (err < 0) goto _end_unlock; if (!avail) -- cgit v1.2.3 From 3a3d5fd125f82200019ef406c4d51ba4d9f0a604 Mon Sep 17 00:00:00 2001 From: David Dillow Date: Sun, 27 Jun 2010 00:04:32 +0200 Subject: sis7019: fix capture issues with multiple periods per buffer When using a timing voice to clock out periods during capture, the driver would slowly loose synchronization and never catch up, eventually reaching a point where it no longer generated interrupts. To avoid this situation, the virtual period clocking was changed to shorten the next timing period when our timing voice falls too far behind the capture voice. In addition, the first virtual period for the timing voice was slightly too short, causing the timing voice to initially be ahead of the capture voice. While tracking down this problem, I noticed that the expected sample offset was being incorrectly initialized, causing an overrun to be incorrectly reported when the timing voice happened to be perfectly synchronized. Reported-by: Hans Schou Signed-off-by: Dave Dillow Signed-off-by: Jaroslav Kysela --- sound/pci/sis7019.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/pci/sis7019.c b/sound/pci/sis7019.c index 9cc1b5aa0148..614ff6e514fd 100644 --- a/sound/pci/sis7019.c +++ b/sound/pci/sis7019.c @@ -264,11 +264,13 @@ static void sis_update_voice(struct voice *voice) * if using small periods. * * If we're less than 9 samples behind, we're on target. + * Otherwise, shorten the next vperiod by the amount we've + * been delayed. */ if (sync > -9) voice->vperiod = voice->sync_period_size + 1; else - voice->vperiod = voice->sync_period_size - 4; + voice->vperiod = voice->sync_period_size + sync + 10; if (voice->vperiod < voice->buffer_size) { sis_update_sso(voice, voice->vperiod); @@ -736,7 +738,7 @@ static void sis_prepare_timing_voice(struct voice *voice, period_size = buffer_size; /* Initially, we want to interrupt just a bit behind the end of - * the period we're clocking out. 10 samples seems to give a good + * the period we're clocking out. 12 samples seems to give a good * delay. * * We want to spread our interrupts throughout the virtual period, @@ -747,7 +749,7 @@ static void sis_prepare_timing_voice(struct voice *voice, * * This is all moot if we don't need to use virtual periods. */ - vperiod = runtime->period_size + 10; + vperiod = runtime->period_size + 12; if (vperiod > period_size) { u16 tail = vperiod % period_size; u16 quarter_period = period_size / 4; @@ -776,7 +778,7 @@ static void sis_prepare_timing_voice(struct voice *voice, */ timing->flags |= VOICE_SYNC_TIMING; timing->sync_base = voice->ctrl_base; - timing->sync_cso = runtime->period_size - 1; + timing->sync_cso = runtime->period_size; timing->sync_period_size = runtime->period_size; timing->sync_buffer_size = runtime->buffer_size; timing->period_size = period_size; -- cgit v1.2.3 From 08b450988905505d12f7671bc24b8da73631d327 Mon Sep 17 00:00:00 2001 From: David Dillow Date: Sun, 27 Jun 2010 00:07:57 +0200 Subject: sis7019: increase reset delays A few boards using this controller are reported to need a little extra time during their reset cycle. Reported-by: Michael Goeke Signed-off-by: Dave Dillow Signed-off-by: Jaroslav Kysela --- sound/pci/sis7019.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/pci/sis7019.c b/sound/pci/sis7019.c index 614ff6e514fd..1b8f6742b5fa 100644 --- a/sound/pci/sis7019.c +++ b/sound/pci/sis7019.c @@ -1049,7 +1049,7 @@ static int sis_chip_free(struct sis7019 *sis) /* Reset the chip, and disable all interrputs. */ outl(SIS_GCR_SOFTWARE_RESET, sis->ioport + SIS_GCR); - udelay(10); + udelay(25); outl(0, sis->ioport + SIS_GCR); outl(0, sis->ioport + SIS_GIER); @@ -1085,7 +1085,7 @@ static int sis_chip_init(struct sis7019 *sis) /* Reset the audio controller */ outl(SIS_GCR_SOFTWARE_RESET, io + SIS_GCR); - udelay(10); + udelay(25); outl(0, io + SIS_GCR); /* Get the AC-link semaphore, and reset the codecs @@ -1098,7 +1098,7 @@ static int sis_chip_init(struct sis7019 *sis) return -EIO; outl(SIS_AC97_CMD_CODEC_COLD_RESET, io + SIS_AC97_CMD); - udelay(10); + udelay(250); count = 0xffff; while ((inw(io + SIS_AC97_STATUS) & SIS_AC97_STATUS_BUSY) && --count) -- cgit v1.2.3 From 1636f8ac2b08410df4766449f7c86b912443cd99 Mon Sep 17 00:00:00 2001 From: Grant Likely Date: Fri, 18 Jun 2010 11:09:58 -0600 Subject: sparc/of: Move of_device fields into struct pdev_archdata This patch moves SPARC architecture specific data members out of struct of_device and into the pdev_archdata structure. The reason for this change is to unify the struct of_device definition amongst all the architectures. It also remvoes the .sysdata, .slot, .portid and .clock_freq properties because they aren't actually used by anything. A subsequent patch will replace struct of_device entirely with struct platform_device and the of_platform support code will share common routines with the platform bus (but the bus instances themselves can remain separate). This patch also adds 'struct resources *resource' and num_resources to match the fields defined in struct platform_device. After this change, 'struct platform_device' can be used as a drop-in replacement for 'struct of_platform'. This change is in preparation for merging the of_platform_bus_type with the platform_bus_type. Signed-off-by: Grant Likely Acked-by: David S. Miller Cc: Stephen Rothwell --- sound/sparc/amd7930.c | 2 +- sound/sparc/cs4231.c | 14 +++++++------- sound/sparc/dbri.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) (limited to 'sound') diff --git a/sound/sparc/amd7930.c b/sound/sparc/amd7930.c index 71221fd20944..43c63d441087 100644 --- a/sound/sparc/amd7930.c +++ b/sound/sparc/amd7930.c @@ -1010,7 +1010,7 @@ static int __devinit amd7930_sbus_probe(struct of_device *op, const struct of_de struct snd_amd7930 *amd; int err, irq; - irq = op->irqs[0]; + irq = op->archdata.irqs[0]; if (dev_num >= SNDRV_CARDS) return -ENODEV; diff --git a/sound/sparc/cs4231.c b/sound/sparc/cs4231.c index fb4c6f2f29e5..f7f05c246303 100644 --- a/sound/sparc/cs4231.c +++ b/sound/sparc/cs4231.c @@ -1832,14 +1832,14 @@ static int __devinit snd_cs4231_sbus_create(struct snd_card *card, chip->c_dma.request = sbus_dma_request; chip->c_dma.address = sbus_dma_addr; - if (request_irq(op->irqs[0], snd_cs4231_sbus_interrupt, + if (request_irq(op->archdata.irqs[0], snd_cs4231_sbus_interrupt, IRQF_SHARED, "cs4231", chip)) { snd_printdd("cs4231-%d: Unable to grab SBUS IRQ %d\n", - dev, op->irqs[0]); + dev, op->archdata.irqs[0]); snd_cs4231_sbus_free(chip); return -EBUSY; } - chip->irq[0] = op->irqs[0]; + chip->irq[0] = op->archdata.irqs[0]; if (snd_cs4231_probe(chip) < 0) { snd_cs4231_sbus_free(chip); @@ -1870,7 +1870,7 @@ static int __devinit cs4231_sbus_probe(struct of_device *op, const struct of_dev card->shortname, rp->flags & 0xffL, (unsigned long long)rp->start, - op->irqs[0]); + op->archdata.irqs[0]); err = snd_cs4231_sbus_create(card, op, dev); if (err < 0) { @@ -1979,12 +1979,12 @@ static int __devinit snd_cs4231_ebus_create(struct snd_card *card, chip->c_dma.ebus_info.flags = EBUS_DMA_FLAG_USE_EBDMA_HANDLER; chip->c_dma.ebus_info.callback = snd_cs4231_ebus_capture_callback; chip->c_dma.ebus_info.client_cookie = chip; - chip->c_dma.ebus_info.irq = op->irqs[0]; + chip->c_dma.ebus_info.irq = op->archdata.irqs[0]; strcpy(chip->p_dma.ebus_info.name, "cs4231(play)"); chip->p_dma.ebus_info.flags = EBUS_DMA_FLAG_USE_EBDMA_HANDLER; chip->p_dma.ebus_info.callback = snd_cs4231_ebus_play_callback; chip->p_dma.ebus_info.client_cookie = chip; - chip->p_dma.ebus_info.irq = op->irqs[1]; + chip->p_dma.ebus_info.irq = op->archdata.irqs[1]; chip->p_dma.prepare = _ebus_dma_prepare; chip->p_dma.enable = _ebus_dma_enable; @@ -2060,7 +2060,7 @@ static int __devinit cs4231_ebus_probe(struct of_device *op, const struct of_dev sprintf(card->longname, "%s at 0x%llx, irq %d", card->shortname, op->resource[0].start, - op->irqs[0]); + op->archdata.irqs[0]); err = snd_cs4231_ebus_create(card, op, dev); if (err < 0) { diff --git a/sound/sparc/dbri.c b/sound/sparc/dbri.c index 1557bf132e73..491ce71c84b6 100644 --- a/sound/sparc/dbri.c +++ b/sound/sparc/dbri.c @@ -2608,7 +2608,7 @@ static int __devinit dbri_probe(struct of_device *op, const struct of_device_id return -ENOENT; } - irq = op->irqs[0]; + irq = op->archdata.irqs[0]; if (irq <= 0) { printk(KERN_ERR "DBRI-%d: No IRQ.\n", dev); return -ENODEV; -- cgit v1.2.3 From ed632ad3b812be6ddace1562c56d838ee48e9313 Mon Sep 17 00:00:00 2001 From: Vladimir Zapolskiy Date: Thu, 24 Jun 2010 15:17:07 +0400 Subject: ASoC: uda134x: add DATA011 register found in codecs family In UDA1340, UDA1344 and UDA1345 codecs there is one more functional register in part of DATA0 tranfser. For UDA1341 this register coincides with EA register. Signed-off-by: Vladimir Zapolskiy Signed-off-by: Mark Brown --- sound/soc/codecs/uda134x.c | 3 ++- sound/soc/codecs/uda134x.h | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/uda134x.c b/sound/soc/codecs/uda134x.c index 52eada1f17fc..7552ea2c2fc7 100644 --- a/sound/soc/codecs/uda134x.c +++ b/sound/soc/codecs/uda134x.c @@ -45,7 +45,7 @@ static const char uda134x_reg[UDA134X_REGS_NUM] = { /* Extended address registers */ 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, /* Status, data regs */ - 0x00, 0x83, 0x00, 0x40, 0x80, 0x00, + 0x00, 0x83, 0x00, 0x40, 0x80, 0xC0, 0x00, }; /* @@ -104,6 +104,7 @@ static int uda134x_write(struct snd_soc_codec *codec, unsigned int reg, case UDA134X_DATA000: case UDA134X_DATA001: case UDA134X_DATA010: + case UDA134X_DATA011: addr = UDA134X_DATA0_ADDR; break; case UDA134X_DATA1: diff --git a/sound/soc/codecs/uda134x.h b/sound/soc/codecs/uda134x.h index 94f440490b31..205f03b3eaf8 100644 --- a/sound/soc/codecs/uda134x.h +++ b/sound/soc/codecs/uda134x.h @@ -23,9 +23,10 @@ #define UDA134X_DATA000 10 #define UDA134X_DATA001 11 #define UDA134X_DATA010 12 -#define UDA134X_DATA1 13 +#define UDA134X_DATA011 13 +#define UDA134X_DATA1 14 -#define UDA134X_REGS_NUM 14 +#define UDA134X_REGS_NUM 15 #define STATUS0_DAIFMT_MASK (~(7<<1)) #define STATUS0_SYSCLK_MASK (~(3<<4)) -- cgit v1.2.3 From 338de9d9dac038a76fd6577cf30aa3ada07ae756 Mon Sep 17 00:00:00 2001 From: Vladimir Zapolskiy Date: Thu, 24 Jun 2010 17:19:25 +0400 Subject: ASoC: uda134x: correct bias level setup for codecs family For UDA1341 codec power control is managed in STATUS1 register, and for all other codecs in DATA011 register. Signed-off-by: Vladimir Zapolskiy Signed-off-by: Mark Brown --- sound/soc/codecs/uda134x.c | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/uda134x.c b/sound/soc/codecs/uda134x.c index 7552ea2c2fc7..f3b4c1d6a82d 100644 --- a/sound/soc/codecs/uda134x.c +++ b/sound/soc/codecs/uda134x.c @@ -341,8 +341,22 @@ static int uda134x_set_bias_level(struct snd_soc_codec *codec, switch (level) { case SND_SOC_BIAS_ON: /* ADC, DAC on */ - reg = uda134x_read_reg_cache(codec, UDA134X_STATUS1); - uda134x_write(codec, UDA134X_STATUS1, reg | 0x03); + switch (pd->model) { + case UDA134X_UDA1340: + case UDA134X_UDA1344: + case UDA134X_UDA1345: + reg = uda134x_read_reg_cache(codec, UDA134X_DATA011); + uda134x_write(codec, UDA134X_DATA011, reg | 0x03); + break; + case UDA134X_UDA1341: + reg = uda134x_read_reg_cache(codec, UDA134X_STATUS1); + uda134x_write(codec, UDA134X_STATUS1, reg | 0x03); + break; + default: + printk(KERN_ERR "UDA134X SoC codec: " + "unsupported model %d\n", pd->model); + return -EINVAL; + } break; case SND_SOC_BIAS_PREPARE: /* power on */ @@ -355,8 +369,22 @@ static int uda134x_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: /* ADC, DAC power off */ - reg = uda134x_read_reg_cache(codec, UDA134X_STATUS1); - uda134x_write(codec, UDA134X_STATUS1, reg & ~(0x03)); + switch (pd->model) { + case UDA134X_UDA1340: + case UDA134X_UDA1344: + case UDA134X_UDA1345: + reg = uda134x_read_reg_cache(codec, UDA134X_DATA011); + uda134x_write(codec, UDA134X_DATA011, reg & ~(0x03)); + break; + case UDA134X_UDA1341: + reg = uda134x_read_reg_cache(codec, UDA134X_STATUS1); + uda134x_write(codec, UDA134X_STATUS1, reg & ~(0x03)); + break; + default: + printk(KERN_ERR "UDA134X SoC codec: " + "unsupported model %d\n", pd->model); + return -EINVAL; + } break; case SND_SOC_BIAS_OFF: /* power off */ -- cgit v1.2.3 From a300de3cfffb9ce7d3e87c8c4f24d22f0a081402 Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Thu, 1 Jul 2010 14:23:45 +0900 Subject: ASoC: ak4642: Add Digital Playback Volume control Signed-off-by: Kuninori Morimoto Signed-off-by: Mark Brown --- sound/soc/codecs/ak4642.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 8d56811c7306..60b83b482467 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "ak4642.h" @@ -103,6 +104,23 @@ struct snd_soc_codec_device soc_codec_dev_ak4642; +/* + * Playback Volume (table 39) + * + * max : 0x00 : +12.0 dB + * ( 0.5 dB step ) + * min : 0xFE : -115.0 dB + * mute: 0xFF + */ +static const DECLARE_TLV_DB_SCALE(out_tlv, -11500, 50, 1); + +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), +}; + + /* codec private data */ struct ak4642_priv { struct snd_soc_codec codec; @@ -196,7 +214,6 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream, * * PLL, Master Mode * Audio I/F Format :MSB justified (ADC & DAC) - * Digital Volume: -8dB * Bass Boost Level : Middle * * This operation came from example code of @@ -206,8 +223,6 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream, ak4642_write(codec, 0x0e, 0x19); ak4642_write(codec, 0x09, 0x91); ak4642_write(codec, 0x0c, 0x91); - ak4642_write(codec, 0x0a, 0x28); - ak4642_write(codec, 0x0d, 0x28); ak4642_write(codec, 0x00, 0x64); snd_soc_update_bits(codec, PW_MGMT2, PMHP_MASK, PMHP); snd_soc_update_bits(codec, PW_MGMT2, HPMTN, HPMTN); @@ -540,6 +555,9 @@ static int ak4642_probe(struct platform_device *pdev) goto pcm_err; } + snd_soc_add_controls(ak4642_codec, ak4642_snd_controls, + ARRAY_SIZE(ak4642_snd_controls)); + dev_info(&pdev->dev, "AK4642 Audio Codec %s", AK4642_VERSION); return ret; -- cgit v1.2.3 From 0d9c15e45b362fced933c686c0127e73547bb209 Mon Sep 17 00:00:00 2001 From: Maurus Cuelenaere Date: Sat, 3 Jul 2010 02:46:10 +0200 Subject: ASoC: codec: Add WM8987 device id to WM8750 driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The WM8987 codec is register compatible with the WM8750, so just add it to the SPI and I²C device table. Signed-off-by: Maurus Cuelenaere Signed-off-by: Mark Brown --- sound/soc/codecs/wm8750.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8750.c b/sound/soc/codecs/wm8750.c index 9407e193fcc3..e2c05e3e323a 100644 --- a/sound/soc/codecs/wm8750.c +++ b/sound/soc/codecs/wm8750.c @@ -884,6 +884,7 @@ static int wm8750_i2c_remove(struct i2c_client *client) static const struct i2c_device_id wm8750_i2c_id[] = { { "wm8750", 0 }, + { "wm8987", 0 }, /* WM8987 is register compatible with WM8750 */ { } }; MODULE_DEVICE_TABLE(i2c, wm8750_i2c_id); @@ -925,14 +926,22 @@ static int __devexit wm8750_spi_remove(struct spi_device *spi) return 0; } +static const struct spi_device_id wm8750_spi_id[] = { + { "wm8750", 0 }, + { "wm8987", 0 }, + { } +}; +MODULE_DEVICE_TABLE(spi, wm8750_spi_id); + static struct spi_driver wm8750_spi_driver = { .driver = { - .name = "wm8750", + .name = "WM8750 SPI Codec", .bus = &spi_bus_type, .owner = THIS_MODULE, }, .probe = wm8750_spi_probe, .remove = __devexit_p(wm8750_spi_remove), + .id_table = wm8750_spi_id, }; #endif -- cgit v1.2.3 From ce93a3702832121d517ad348817929f22fcce47c Mon Sep 17 00:00:00 2001 From: Maurus Cuelenaere Date: Sat, 3 Jul 2010 02:46:12 +0200 Subject: ASoC: Add SmartQ sound driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds sound support for the SmartQ board. The hardware consists of a S3C6410 coupled with a WM8987 over I²S. The WM8750 driver is used for driving the WM8987, as they are register compatible. Signed-off-by: Maurus Cuelenaere Signed-off-by: Mark Brown --- sound/soc/s3c24xx/Kconfig | 6 + sound/soc/s3c24xx/Makefile | 2 + sound/soc/s3c24xx/smartq_wm8987.c | 296 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 304 insertions(+) create mode 100644 sound/soc/s3c24xx/smartq_wm8987.c (limited to 'sound') diff --git a/sound/soc/s3c24xx/Kconfig b/sound/soc/s3c24xx/Kconfig index 292d817c9a94..213963ac3c28 100644 --- a/sound/soc/s3c24xx/Kconfig +++ b/sound/soc/s3c24xx/Kconfig @@ -125,3 +125,9 @@ config SND_SOC_SMDK_WM9713 select SND_S3C_SOC_AC97 help Sat Y if you want to add support for SoC audio on the SMDK. + +config SND_S3C64XX_SOC_SMARTQ + tristate "SoC I2S Audio support for SmartQ board" + depends on SND_S3C24XX_SOC && MACH_SMARTQ + select SND_S3C64XX_SOC_I2S + select SND_SOC_WM8750 diff --git a/sound/soc/s3c24xx/Makefile b/sound/soc/s3c24xx/Makefile index 81d8dc503f87..50172c385d90 100644 --- a/sound/soc/s3c24xx/Makefile +++ b/sound/soc/s3c24xx/Makefile @@ -29,6 +29,7 @@ snd-soc-s3c24xx-simtec-hermes-objs := s3c24xx_simtec_hermes.o snd-soc-s3c24xx-simtec-tlv320aic23-objs := s3c24xx_simtec_tlv320aic23.o snd-soc-smdk64xx-wm8580-objs := smdk64xx_wm8580.o snd-soc-smdk-wm9713-objs := smdk_wm9713.o +snd-soc-s3c64xx-smartq-wm8987-objs := smartq_wm8987.o obj-$(CONFIG_SND_S3C24XX_SOC_JIVE_WM8750) += snd-soc-jive-wm8750.o obj-$(CONFIG_SND_S3C24XX_SOC_NEO1973_WM8753) += snd-soc-neo1973-wm8753.o @@ -41,3 +42,4 @@ obj-$(CONFIG_SND_S3C24XX_SOC_SIMTEC_HERMES) += snd-soc-s3c24xx-simtec-hermes.o obj-$(CONFIG_SND_S3C24XX_SOC_SIMTEC_TLV320AIC23) += snd-soc-s3c24xx-simtec-tlv320aic23.o obj-$(CONFIG_SND_S3C64XX_SOC_WM8580) += snd-soc-smdk64xx-wm8580.o obj-$(CONFIG_SND_SOC_SMDK_WM9713) += snd-soc-smdk-wm9713.o +obj-$(CONFIG_SND_S3C64XX_SOC_SMARTQ) += snd-soc-s3c64xx-smartq-wm8987.o diff --git a/sound/soc/s3c24xx/smartq_wm8987.c b/sound/soc/s3c24xx/smartq_wm8987.c new file mode 100644 index 000000000000..c90ef965aaf8 --- /dev/null +++ b/sound/soc/s3c24xx/smartq_wm8987.c @@ -0,0 +1,296 @@ +/* sound/soc/s3c24xx/smartq_wm8987.c + * + * Copyright 2010 Maurus Cuelenaere + * + * Based on smdk6410_wm8987.c + * Copyright 2007 Wolfson Microelectronics PLC. - linux@wolfsonmicro.com + * Graeme Gregory - graeme.gregory@wolfsonmicro.com + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include "s3c-dma.h" +#include "s3c64xx-i2s.h" + +#include "../codecs/wm8750.h" + +/* + * WM8987 is register compatible with WM8750, so using that as base driver. + */ + +static struct snd_soc_card snd_soc_smartq; + +static int smartq_hifi_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct s3c_i2sv2_rate_calc div; + unsigned int clk = 0; + int ret; + + s3c_i2sv2_iis_calc_rate(&div, NULL, params_rate(params), + s3c_i2sv2_get_clock(cpu_dai)); + + switch (params_rate(params)) { + case 8000: + case 16000: + case 32000: + case 48000: + case 96000: + clk = 12288000; + break; + case 11025: + case 22050: + case 44100: + case 88200: + clk = 11289600; + break; + } + + /* set codec DAI configuration */ + ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBS_CFS); + if (ret < 0) + return ret; + + /* set cpu DAI configuration */ + ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBS_CFS); + if (ret < 0) + return ret; + + /* set the codec system clock for DAC and ADC */ + ret = snd_soc_dai_set_sysclk(codec_dai, WM8750_SYSCLK, clk, + SND_SOC_CLOCK_IN); + if (ret < 0) + return ret; + + /* set MCLK division for sample rate */ + ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C_I2SV2_DIV_RCLK, div.fs_div); + if (ret < 0) + return ret; + + /* set prescaler division for sample rate */ + ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C_I2SV2_DIV_PRESCALER, + div.clk_div - 1); + if (ret < 0) + return ret; + + return 0; +} + +/* + * SmartQ WM8987 HiFi DAI operations. + */ +static struct snd_soc_ops smartq_hifi_ops = { + .hw_params = smartq_hifi_hw_params, +}; + +static struct snd_soc_jack smartq_jack; + +static struct snd_soc_jack_pin smartq_jack_pins[] = { + /* Disable speaker when headphone is plugged in */ + { + .pin = "Internal Speaker", + .mask = SND_JACK_HEADPHONE, + .invert = true, + }, +}; + +static struct snd_soc_jack_gpio smartq_jack_gpios[] = { + { + .gpio = S3C64XX_GPL(12), + .name = "headphone detect", + .report = SND_JACK_HEADPHONE, + .debounce_time = 200, + }, +}; + +static const struct snd_kcontrol_new wm8987_smartq_controls[] = { + SOC_DAPM_PIN_SWITCH("Internal Speaker"), + SOC_DAPM_PIN_SWITCH("Headphone Jack"), + SOC_DAPM_PIN_SWITCH("Internal Mic"), +}; + +static int smartq_speaker_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *k, + int event) +{ + gpio_set_value(S3C64XX_GPK(12), SND_SOC_DAPM_EVENT_OFF(event)); + + return 0; +} + +static const struct snd_soc_dapm_widget wm8987_dapm_widgets[] = { + SND_SOC_DAPM_SPK("Internal Speaker", smartq_speaker_event), + SND_SOC_DAPM_HP("Headphone Jack", NULL), + SND_SOC_DAPM_MIC("Internal Mic", NULL), +}; + +static const struct snd_soc_dapm_route audio_map[] = { + {"Headphone Jack", NULL, "LOUT2"}, + {"Headphone Jack", NULL, "ROUT2"}, + + {"Internal Speaker", NULL, "LOUT2"}, + {"Internal Speaker", NULL, "ROUT2"}, + + {"Mic Bias", NULL, "Internal Mic"}, + {"LINPUT2", NULL, "Mic Bias"}, +}; + +static int smartq_wm8987_init(struct snd_soc_codec *codec) +{ + int err = 0; + + /* Add SmartQ specific widgets */ + snd_soc_dapm_new_controls(codec, wm8987_dapm_widgets, + ARRAY_SIZE(wm8987_dapm_widgets)); + + /* add SmartQ specific controls */ + err = snd_soc_add_controls(codec, wm8987_smartq_controls, + ARRAY_SIZE(wm8987_smartq_controls)); + + if (err < 0) + return err; + + /* setup SmartQ specific audio path */ + snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map)); + + /* set endpoints to not connected */ + snd_soc_dapm_nc_pin(codec, "LINPUT1"); + snd_soc_dapm_nc_pin(codec, "RINPUT1"); + snd_soc_dapm_nc_pin(codec, "OUT3"); + snd_soc_dapm_nc_pin(codec, "ROUT1"); + + /* set endpoints to default off mode */ + snd_soc_dapm_enable_pin(codec, "Internal Speaker"); + snd_soc_dapm_enable_pin(codec, "Internal Mic"); + snd_soc_dapm_disable_pin(codec, "Headphone Jack"); + + err = snd_soc_dapm_sync(codec); + if (err) + return err; + + /* Headphone jack detection */ + err = snd_soc_jack_new(&snd_soc_smartq, "Headphone Jack", + SND_JACK_HEADPHONE, &smartq_jack); + if (err) + return err; + + err = snd_soc_jack_add_pins(&smartq_jack, ARRAY_SIZE(smartq_jack_pins), + smartq_jack_pins); + if (err) + return err; + + err = snd_soc_jack_add_gpios(&smartq_jack, + ARRAY_SIZE(smartq_jack_gpios), + smartq_jack_gpios); + + return err; +} + +static struct snd_soc_dai_link smartq_dai[] = { + { + .name = "wm8987", + .stream_name = "SmartQ Hi-Fi", + .cpu_dai = &s3c64xx_i2s_dai[0], + .codec_dai = &wm8750_dai, + .init = smartq_wm8987_init, + .ops = &smartq_hifi_ops, + }, +}; + +static struct snd_soc_card snd_soc_smartq = { + .name = "SmartQ", + .platform = &s3c24xx_soc_platform, + .dai_link = smartq_dai, + .num_links = ARRAY_SIZE(smartq_dai), +}; + +static struct snd_soc_device smartq_snd_devdata = { + .card = &snd_soc_smartq, + .codec_dev = &soc_codec_dev_wm8750, +}; + +static struct platform_device *smartq_snd_device; + +static int __init smartq_init(void) +{ + int ret; + + if (!machine_is_smartq7() && !machine_is_smartq5()) { + pr_info("Only SmartQ is supported by this ASoC driver\n"); + return -ENODEV; + } + + smartq_snd_device = platform_device_alloc("soc-audio", -1); + if (!smartq_snd_device) + return -ENOMEM; + + platform_set_drvdata(smartq_snd_device, &smartq_snd_devdata); + smartq_snd_devdata.dev = &smartq_snd_device->dev; + + ret = platform_device_add(smartq_snd_device); + if (ret) { + platform_device_put(smartq_snd_device); + return ret; + } + + /* Initialise GPIOs used by amplifiers */ + ret = gpio_request(S3C64XX_GPK(12), "amplifiers shutdown"); + if (ret) { + dev_err(&smartq_snd_device->dev, "Failed to register GPK12\n"); + goto err_unregister_device; + } + + /* Disable amplifiers */ + ret = gpio_direction_output(S3C64XX_GPK(12), 1); + if (ret) { + dev_err(&smartq_snd_device->dev, "Failed to configure GPK12\n"); + goto err_free_gpio_amp_shut; + } + + return 0; + +err_free_gpio_amp_shut: + gpio_free(S3C64XX_GPK(12)); +err_unregister_device: + platform_device_unregister(smartq_snd_device); + + return ret; +} + +static void __exit smartq_exit(void) +{ + snd_soc_jack_free_gpios(&smartq_jack, ARRAY_SIZE(smartq_jack_gpios), + smartq_jack_gpios); + + platform_device_unregister(smartq_snd_device); +} + +module_init(smartq_init); +module_exit(smartq_exit); + +/* Module information */ +MODULE_AUTHOR("Maurus Cuelenaere "); +MODULE_DESCRIPTION("ALSA SoC SmartQ WM8987"); +MODULE_LICENSE("GPL"); -- cgit v1.2.3 From 9af8381023e48bfc61a1017c584cb3b8115cb462 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Mon, 5 Jul 2010 12:09:22 +0900 Subject: ASoC: Fix sorting of Makefile and Kconfig Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/Kconfig | 2 +- sound/soc/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/Kconfig b/sound/soc/Kconfig index 7137a9a09570..3e598e756e54 100644 --- a/sound/soc/Kconfig +++ b/sound/soc/Kconfig @@ -31,6 +31,7 @@ source "sound/soc/davinci/Kconfig" source "sound/soc/ep93xx/Kconfig" source "sound/soc/fsl/Kconfig" source "sound/soc/imx/Kconfig" +source "sound/soc/jz4740/Kconfig" source "sound/soc/nuc900/Kconfig" source "sound/soc/omap/Kconfig" source "sound/soc/kirkwood/Kconfig" @@ -39,7 +40,6 @@ source "sound/soc/s3c24xx/Kconfig" source "sound/soc/s6000/Kconfig" source "sound/soc/sh/Kconfig" source "sound/soc/txx9/Kconfig" -source "sound/soc/jz4740/Kconfig" # Supported codecs source "sound/soc/codecs/Kconfig" diff --git a/sound/soc/Makefile b/sound/soc/Makefile index d13199978d36..eb183443eee4 100644 --- a/sound/soc/Makefile +++ b/sound/soc/Makefile @@ -9,6 +9,7 @@ obj-$(CONFIG_SND_SOC) += davinci/ obj-$(CONFIG_SND_SOC) += ep93xx/ obj-$(CONFIG_SND_SOC) += fsl/ obj-$(CONFIG_SND_SOC) += imx/ +obj-$(CONFIG_SND_SOC) += jz4740/ obj-$(CONFIG_SND_SOC) += nuc900/ obj-$(CONFIG_SND_SOC) += omap/ obj-$(CONFIG_SND_SOC) += kirkwood/ @@ -17,4 +18,3 @@ obj-$(CONFIG_SND_SOC) += s3c24xx/ obj-$(CONFIG_SND_SOC) += s6000/ obj-$(CONFIG_SND_SOC) += sh/ obj-$(CONFIG_SND_SOC) += txx9/ -obj-$(CONFIG_SND_SOC) += jz4740/ -- cgit v1.2.3 From 4faaa8d968df08bf2e75a481f99e7c5c1d0142ab Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Mon, 5 Jul 2010 13:54:32 +0900 Subject: ASoC: Remove current WM8960 deemphasis control It will be replaced with automatic deemphasis rate configuration but since we have an enumeration table in this driver this is done in a separate commit to make the renumbering of the enumeration items clear. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8960.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index 7233cc68435a..6be3f4645b71 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c @@ -84,7 +84,6 @@ struct wm8960_priv { #define wm8960_reset(c) snd_soc_write(c, WM8960_RESET, 0) /* enumerated controls */ -static const char *wm8960_deemph[] = {"None", "32Khz", "44.1Khz", "48Khz"}; static const char *wm8960_polarity[] = {"No Inversion", "Left Inverted", "Right Inverted", "Stereo Inversion"}; static const char *wm8960_3d_upper_cutoff[] = {"High", "Low"}; @@ -93,7 +92,6 @@ static const char *wm8960_alcfunc[] = {"Off", "Right", "Left", "Stereo"}; static const char *wm8960_alcmode[] = {"ALC", "Limiter"}; static const struct soc_enum wm8960_enum[] = { - SOC_ENUM_SINGLE(WM8960_DACCTL1, 1, 4, wm8960_deemph), SOC_ENUM_SINGLE(WM8960_DACCTL1, 5, 4, wm8960_polarity), SOC_ENUM_SINGLE(WM8960_DACCTL2, 5, 4, wm8960_polarity), SOC_ENUM_SINGLE(WM8960_3D, 6, 2, wm8960_3d_upper_cutoff), @@ -131,23 +129,22 @@ SOC_SINGLE("Speaker DC Volume", WM8960_CLASSD3, 3, 5, 0), SOC_SINGLE("Speaker AC Volume", WM8960_CLASSD3, 0, 5, 0), SOC_SINGLE("PCM Playback -6dB Switch", WM8960_DACCTL1, 7, 1, 0), -SOC_ENUM("ADC Polarity", wm8960_enum[1]), -SOC_ENUM("Playback De-emphasis", wm8960_enum[0]), +SOC_ENUM("ADC Polarity", wm8960_enum[0]), SOC_SINGLE("ADC High Pass Filter Switch", WM8960_DACCTL1, 0, 1, 0), SOC_ENUM("DAC Polarity", wm8960_enum[2]), -SOC_ENUM("3D Filter Upper Cut-Off", wm8960_enum[3]), -SOC_ENUM("3D Filter Lower Cut-Off", wm8960_enum[4]), +SOC_ENUM("3D Filter Upper Cut-Off", wm8960_enum[2]), +SOC_ENUM("3D Filter Lower Cut-Off", wm8960_enum[3]), SOC_SINGLE("3D Volume", WM8960_3D, 1, 15, 0), SOC_SINGLE("3D Switch", WM8960_3D, 0, 1, 0), -SOC_ENUM("ALC Function", wm8960_enum[5]), +SOC_ENUM("ALC Function", wm8960_enum[4]), SOC_SINGLE("ALC Max Gain", WM8960_ALC1, 4, 7, 0), SOC_SINGLE("ALC Target", WM8960_ALC1, 0, 15, 1), SOC_SINGLE("ALC Min Gain", WM8960_ALC2, 4, 7, 0), SOC_SINGLE("ALC Hold Time", WM8960_ALC2, 0, 15, 0), -SOC_ENUM("ALC Mode", wm8960_enum[6]), +SOC_ENUM("ALC Mode", wm8960_enum[5]), SOC_SINGLE("ALC Decay", WM8960_ALC3, 4, 15, 0), SOC_SINGLE("ALC Attack", WM8960_ALC3, 0, 15, 0), -- cgit v1.2.3 From afd6d36a0ded1691c6710ebddabae06e5bb9583b Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Mon, 5 Jul 2010 13:58:16 +0900 Subject: ASoC: Automatically manage DAC deemphasis rate for WM8960 Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8960.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'sound') diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index 6be3f4645b71..743d9a708a22 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c @@ -79,6 +79,8 @@ struct wm8960_priv { struct snd_soc_dapm_widget *lout1; struct snd_soc_dapm_widget *rout1; struct snd_soc_dapm_widget *out3; + bool deemph; + int playback_fs; }; #define wm8960_reset(c) snd_soc_write(c, WM8960_RESET, 0) @@ -100,6 +102,59 @@ static const struct soc_enum wm8960_enum[] = { SOC_ENUM_SINGLE(WM8960_ALC3, 8, 2, wm8960_alcmode), }; +static const int deemph_settings[] = { 0, 32000, 44100, 48000 }; + +static int wm8960_set_deemph(struct snd_soc_codec *codec) +{ + struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); + int val, i, best; + + /* If we're using deemphasis select the nearest available sample + * rate. + */ + if (wm8960->deemph) { + best = 1; + for (i = 2; i < ARRAY_SIZE(deemph_settings); i++) { + if (abs(deemph_settings[i] - wm8960->playback_fs) < + abs(deemph_settings[best] - wm8960->playback_fs)) + best = i; + } + + val = best << 1; + } else { + val = 0; + } + + dev_dbg(codec->dev, "Set deemphasis %d\n", val); + + return snd_soc_update_bits(codec, WM8960_DACCTL1, + 0x6, val); +} + +static int wm8960_get_deemph(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); + + return wm8960->deemph; +} + +static int wm8960_put_deemph(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); + int deemph = ucontrol->value.enumerated.item[0]; + + if (deemph > 1) + return -EINVAL; + + wm8960->deemph = deemph; + + return wm8960_set_deemph(codec); +} + static const DECLARE_TLV_DB_SCALE(adc_tlv, -9700, 50, 0); static const DECLARE_TLV_DB_SCALE(dac_tlv, -12700, 50, 1); static const DECLARE_TLV_DB_SCALE(bypass_tlv, -2100, 300, 0); @@ -133,6 +188,8 @@ SOC_ENUM("ADC Polarity", wm8960_enum[0]), SOC_SINGLE("ADC High Pass Filter Switch", WM8960_DACCTL1, 0, 1, 0), SOC_ENUM("DAC Polarity", wm8960_enum[2]), +SOC_SINGLE_BOOL_EXT("DAC Deemphasis Switch", 0, + wm8960_get_deemph, wm8960_put_deemph), SOC_ENUM("3D Filter Upper Cut-Off", wm8960_enum[2]), SOC_ENUM("3D Filter Lower Cut-Off", wm8960_enum[3]), @@ -437,6 +494,7 @@ static int wm8960_hw_params(struct snd_pcm_substream *substream, struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_device *socdev = rtd->socdev; struct snd_soc_codec *codec = socdev->card->codec; + struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); u16 iface = snd_soc_read(codec, WM8960_IFACE1) & 0xfff3; /* bit size */ @@ -451,6 +509,12 @@ static int wm8960_hw_params(struct snd_pcm_substream *substream, break; } + /* Update filters for the new rate */ + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + wm8960->playback_fs = params_rate(params); + wm8960_set_deemph(codec); + } + /* set iface */ snd_soc_write(codec, WM8960_IFACE1, iface); return 0; -- cgit v1.2.3 From 171d9f7d786681e76bb289d01d8f897cbc50de57 Mon Sep 17 00:00:00 2001 From: John Kacur Date: Sun, 4 Jul 2010 00:02:31 +0200 Subject: soundcore_open: Reduce the area BKL coverage Most of this function is protected by the sound_loader_lock. We can push down the BKL to this call out err = file->f_op->open(inode,file); In order to build the sound core without the BKL, we will need to push the lock_kernel() call into the ~20 device drivers that register their file operations. Signed-off-by: John Kacur Signed-off-by: Arnd Bergmann Acked-by: Alan Cox Signed-off-by: Takashi Iwai --- sound/sound_core.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/sound_core.c b/sound/sound_core.c index 7c2d677a2df5..c8627fcd4900 100644 --- a/sound/sound_core.c +++ b/sound/sound_core.c @@ -576,8 +576,6 @@ static int soundcore_open(struct inode *inode, struct file *file) struct sound_unit *s; const struct file_operations *new_fops = NULL; - lock_kernel (); - chain=unit&0x0F; if(chain==4 || chain==5) /* dsp/audio/dsp16 */ { @@ -630,18 +628,23 @@ static int soundcore_open(struct inode *inode, struct file *file) const struct file_operations *old_fops = file->f_op; file->f_op = new_fops; spin_unlock(&sound_loader_lock); - if(file->f_op->open) + + if (file->f_op->open) { + /* TODO: push down BKL into indivial open functions */ + lock_kernel(); err = file->f_op->open(inode,file); + unlock_kernel(); + } + if (err) { fops_put(file->f_op); file->f_op = fops_get(old_fops); } + fops_put(old_fops); - unlock_kernel(); return err; } spin_unlock(&sound_loader_lock); - unlock_kernel(); return -ENODEV; } -- cgit v1.2.3 From db059c0f6edec0b1deba665e5853f4ed829003b7 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Mon, 5 Jul 2010 23:54:51 +0900 Subject: ASoC: Automatically manage ALC coefficients for WM8960 Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8960.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'sound') diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index 743d9a708a22..3c6ee61f6c95 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c @@ -487,6 +487,21 @@ static int wm8960_set_dai_fmt(struct snd_soc_dai *codec_dai, return 0; } +static struct { + int rate; + unsigned int val; +} alc_rates[] = { + { 48000, 0 }, + { 44100, 0 }, + { 32000, 1 }, + { 22050, 2 }, + { 24000, 2 }, + { 16000, 3 }, + { 11250, 4 }, + { 12000, 4 }, + { 8000, 5 }, +}; + static int wm8960_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -496,6 +511,7 @@ static int wm8960_hw_params(struct snd_pcm_substream *substream, struct snd_soc_codec *codec = socdev->card->codec; struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); u16 iface = snd_soc_read(codec, WM8960_IFACE1) & 0xfff3; + int i; /* bit size */ switch (params_format(params)) { @@ -513,6 +529,12 @@ static int wm8960_hw_params(struct snd_pcm_substream *substream, if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { wm8960->playback_fs = params_rate(params); wm8960_set_deemph(codec); + } else { + for (i = 0; i < ARRAY_SIZE(alc_rates); i++) + if (alc_rates[i].rate == params_rate(params)) + snd_soc_update_bits(codec, + WM8960_ADDCTL3, 0x7, + alc_rates[i].val); } /* set iface */ -- cgit v1.2.3 From 168f1b07ccc0e8edecb67fab2d0670861853e2fd Mon Sep 17 00:00:00 2001 From: Eliot Blennerhassett Date: Tue, 6 Jul 2010 08:37:06 +1200 Subject: ALSA: asihpi - HPI API updates Remove some deprecated items. Change compander api to one function per parameter. Add a version string define. Signed-off-by: Eliot Blennerhassett Signed-off-by: Takashi Iwai --- sound/pci/asihpi/asihpi.c | 10 +++---- sound/pci/asihpi/hpi.h | 68 ++++++++++++++++++++++++++++++++------------- sound/pci/asihpi/hpidebug.h | 4 +-- 3 files changed, 55 insertions(+), 27 deletions(-) (limited to 'sound') diff --git a/sound/pci/asihpi/asihpi.c b/sound/pci/asihpi/asihpi.c index 1db586af4f9c..91218f77217f 100644 --- a/sound/pci/asihpi/asihpi.c +++ b/sound/pci/asihpi/asihpi.c @@ -1383,7 +1383,7 @@ static char *asihpi_src_names[] = compile_time_assert( (ARRAY_SIZE(asihpi_src_names) == - (HPI_SOURCENODE_LAST_INDEX-HPI_SOURCENODE_BASE+1)), + (HPI_SOURCENODE_LAST_INDEX-HPI_SOURCENODE_NONE+1)), assert_src_names_size); #if ASI_STYLE_NAMES @@ -1414,7 +1414,7 @@ static char *asihpi_dst_names[] = compile_time_assert( (ARRAY_SIZE(asihpi_dst_names) == - (HPI_DESTNODE_LAST_INDEX-HPI_DESTNODE_BASE+1)), + (HPI_DESTNODE_LAST_INDEX-HPI_DESTNODE_NONE+1)), assert_dst_names_size); static inline int ctl_add(struct snd_card *card, struct snd_kcontrol_new *ctl, @@ -2171,7 +2171,7 @@ static int snd_asihpi_mux_info(struct snd_kcontrol *kcontrol, &src_node_type, &src_node_index); sprintf(uinfo->value.enumerated.name, "%s %d", - asihpi_src_names[src_node_type - HPI_SOURCENODE_BASE], + asihpi_src_names[src_node_type - HPI_SOURCENODE_NONE], src_node_index); return 0; } @@ -2603,8 +2603,8 @@ static int __devinit snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi) } - hpi_ctl.src_node_type -= HPI_SOURCENODE_BASE; - hpi_ctl.dst_node_type -= HPI_DESTNODE_BASE; + hpi_ctl.src_node_type -= HPI_SOURCENODE_NONE; + hpi_ctl.dst_node_type -= HPI_DESTNODE_NONE; /* ASI50xx in SSX mode has multiple meters on the same node. Use subindex to create distinct ALSA controls diff --git a/sound/pci/asihpi/hpi.h b/sound/pci/asihpi/hpi.h index 0173bbe62b67..cee4df460f68 100644 --- a/sound/pci/asihpi/hpi.h +++ b/sound/pci/asihpi/hpi.h @@ -50,7 +50,8 @@ i.e 3.05.02 is a development version #define HPI_VER_RELEASE(v) ((int)(v & 0xFF)) /* Use single digits for versions less that 10 to avoid octal. */ -#define HPI_VER HPI_VERSION_CONSTRUCTOR(4L, 3, 25) +#define HPI_VER HPI_VERSION_CONSTRUCTOR(4L, 3, 36) +#define HPI_VER_STRING "4.03.36" /* Library version as documented in hpi-api-versions.txt */ #define HPI_LIB_VER HPI_VERSION_CONSTRUCTOR(9, 0, 0) @@ -203,8 +204,6 @@ enum HPI_SOURCENODES { exists on a destination node can be searched for using a source node value of either 0, or HPI_SOURCENODE_NONE */ HPI_SOURCENODE_NONE = 100, - /** \deprecated Use HPI_SOURCENODE_NONE instead. */ - HPI_SOURCENODE_BASE = 100, /** Out Stream (Play) node. */ HPI_SOURCENODE_OSTREAM = 101, /** Line in node - could be analog, AES/EBU or network. */ @@ -235,8 +234,6 @@ enum HPI_DESTNODES { exists on a source node can be searched for using a destination node value of either 0, or HPI_DESTNODE_NONE */ HPI_DESTNODE_NONE = 200, - /** \deprecated Use HPI_DESTNODE_NONE instead. */ - HPI_DESTNODE_BASE = 200, /** In Stream (Record) node. */ HPI_DESTNODE_ISTREAM = 201, HPI_DESTNODE_LINEOUT = 202, /**< line out node. */ @@ -432,7 +429,18 @@ Property 2 - adapter can do stream grouping (supports SSX2) Property 1 - adapter can do samplerate conversion (MRX) Property 2 - adapter can do timestretch (TSX) */ - HPI_ADAPTER_PROPERTY_CAPS2 = 269 + HPI_ADAPTER_PROPERTY_CAPS2 = 269, + +/** Readonly adapter sync header connection count. +*/ + HPI_ADAPTER_PROPERTY_SYNC_HEADER_CONNECTIONS = 270, +/** Readonly supports SSX2 property. +Indicates the adapter supports SSX2 in some mode setting. The +return value is true (1) or false (0). If the current adapter +mode is MONO SSX2 is disabled, even though this property will +return true. +*/ + HPI_ADAPTER_PROPERTY_SUPPORTS_SSX2 = 271 }; /** Adapter mode commands @@ -813,8 +821,6 @@ enum HPI_SAMPLECLOCK_SOURCES { /** The sampleclock output is derived from its local samplerate generator. The local samplerate may be set using HPI_SampleClock_SetLocalRate(). */ HPI_SAMPLECLOCK_SOURCE_LOCAL = 1, -/** \deprecated Use HPI_SAMPLECLOCK_SOURCE_LOCAL instead */ - HPI_SAMPLECLOCK_SOURCE_ADAPTER = 1, /** The adapter is clocked from a dedicated AES/EBU SampleClock input.*/ HPI_SAMPLECLOCK_SOURCE_AESEBU_SYNC = 2, /** From external wordclock connector */ @@ -825,10 +831,6 @@ enum HPI_SAMPLECLOCK_SOURCES { HPI_SAMPLECLOCK_SOURCE_SMPTE = 5, /** One of the aesebu inputs */ HPI_SAMPLECLOCK_SOURCE_AESEBU_INPUT = 6, -/** \deprecated The first aesebu input with a valid signal -Superseded by separate Auto enable flag -*/ - HPI_SAMPLECLOCK_SOURCE_AESEBU_AUTO = 7, /** From a network interface e.g. Cobranet or Livewire at either 48 or 96kHz */ HPI_SAMPLECLOCK_SOURCE_NETWORK = 8, /** From previous adjacent module (ASI2416 only)*/ @@ -1015,8 +1017,6 @@ enum HPI_ERROR_CODES { HPI_ERROR_CONTROL_DISABLED = 404, /** I2C transaction failed due to a missing ACK. */ HPI_ERROR_CONTROL_I2C_MISSING_ACK = 405, - /** Control attribute is valid, but not supported by this hardware. */ - HPI_ERROR_UNSUPPORTED_CONTROL_ATTRIBUTE = 406, /** Control is busy, or coming out of reset and cannot be accessed at this time. */ HPI_ERROR_CONTROL_NOT_READY = 407, @@ -1827,13 +1827,41 @@ u16 hpi_parametricEQ__get_coeffs(const struct hpi_hsubsys *ph_subsys, Compressor Expander control *******************************/ -u16 hpi_compander_set(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 attack, u16 decay, short ratio100, short threshold0_01dB, - short makeup_gain0_01dB); +u16 hpi_compander_set_enable(const struct hpi_hsubsys *ph_subsys, + u32 h_control, u32 on); + +u16 hpi_compander_get_enable(const struct hpi_hsubsys *ph_subsys, + u32 h_control, u32 *pon); + +u16 hpi_compander_set_makeup_gain(const struct hpi_hsubsys *ph_subsys, + u32 h_control, short makeup_gain0_01dB); + +u16 hpi_compander_get_makeup_gain(const struct hpi_hsubsys *ph_subsys, + u32 h_control, short *pn_makeup_gain0_01dB); + +u16 hpi_compander_set_attack_time_constant(const struct hpi_hsubsys + *ph_subsys, u32 h_control, u32 index, u32 attack); + +u16 hpi_compander_get_attack_time_constant(const struct hpi_hsubsys + *ph_subsys, u32 h_control, u32 index, u32 *pw_attack); + +u16 hpi_compander_set_decay_time_constant(const struct hpi_hsubsys *ph_subsys, + u32 h_control, u32 index, u32 decay); + +u16 hpi_compander_get_decay_time_constant(const struct hpi_hsubsys *ph_subsys, + u32 h_control, u32 index, u32 *pw_decay); + +u16 hpi_compander_set_threshold(const struct hpi_hsubsys *ph_subsys, + u32 h_control, u32 index, short threshold0_01dB); + +u16 hpi_compander_get_threshold(const struct hpi_hsubsys *ph_subsys, + u32 h_control, u32 index, short *pn_threshold0_01dB); + +u16 hpi_compander_set_ratio(const struct hpi_hsubsys *ph_subsys, + u32 h_control, u32 index, u32 ratio100); -u16 hpi_compander_get(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 *pw_attack, u16 *pw_decay, short *pw_ratio100, - short *pn_threshold0_01dB, short *pn_makeup_gain0_01dB); +u16 hpi_compander_get_ratio(const struct hpi_hsubsys *ph_subsys, + u32 h_control, u32 index, u32 *pw_ratio100); /******************************* Cobranet HMI control diff --git a/sound/pci/asihpi/hpidebug.h b/sound/pci/asihpi/hpidebug.h index 44dccadcc25b..a2f0952a99f0 100644 --- a/sound/pci/asihpi/hpidebug.h +++ b/sound/pci/asihpi/hpidebug.h @@ -356,7 +356,7 @@ compile_time_assert((HPI_CONTROL_LAST_INDEX + 1 == 27), "HPI_SOURCENODE_ADAPTER" \ } -compile_time_assert((HPI_SOURCENODE_LAST_INDEX - HPI_SOURCENODE_BASE + 1) == +compile_time_assert((HPI_SOURCENODE_LAST_INDEX - HPI_SOURCENODE_NONE + 1) == (12), sourcenode_strings_match_defs); #define HPI_DESTNODE_STRINGS \ @@ -370,7 +370,7 @@ compile_time_assert((HPI_SOURCENODE_LAST_INDEX - HPI_SOURCENODE_BASE + 1) == "HPI_DESTNODE_COBRANET", \ "HPI_DESTNODE_ANALOG" \ } -compile_time_assert((HPI_DESTNODE_LAST_INDEX - HPI_DESTNODE_BASE + 1) == (8), +compile_time_assert((HPI_DESTNODE_LAST_INDEX - HPI_DESTNODE_NONE + 1) == (8), destnode_strings_match_defs); #define HPI_CONTROL_CHANNEL_MODE_STRINGS \ -- cgit v1.2.3 From 1dd6aaaafc930dd9bfaa6ea1d21bac2b4ec12527 Mon Sep 17 00:00:00 2001 From: Eliot Blennerhassett Date: Tue, 6 Jul 2010 08:37:07 +1200 Subject: ALSA: asihpi - Use version string instead of printf formatting Signed-off-by: Eliot Blennerhassett Signed-off-by: Takashi Iwai --- sound/pci/asihpi/hpioctl.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/pci/asihpi/hpioctl.c b/sound/pci/asihpi/hpioctl.c index 7396ac54e99f..311499992a22 100644 --- a/sound/pci/asihpi/hpioctl.c +++ b/sound/pci/asihpi/hpioctl.c @@ -464,9 +464,7 @@ void __init asihpi_init(void) memset(adapters, 0, sizeof(adapters)); - printk(KERN_INFO "ASIHPI driver %d.%02d.%02d\n", - HPI_VER_MAJOR(HPI_VER), HPI_VER_MINOR(HPI_VER), - HPI_VER_RELEASE(HPI_VER)); + printk(KERN_INFO "ASIHPI driver " HPI_VER_STRING "\n"); hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, HPI_SUBSYS_DRIVER_LOAD); -- cgit v1.2.3 From 38439146355de2c10c369f93136333be6107a16b Mon Sep 17 00:00:00 2001 From: Eliot Blennerhassett Date: Tue, 6 Jul 2010 08:37:08 +1200 Subject: ALSA: asihpi - Add ASI5200 family Signed-off-by: Eliot Blennerhassett Signed-off-by: Takashi Iwai --- sound/pci/asihpi/hpi6000.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'sound') diff --git a/sound/pci/asihpi/hpi6000.c b/sound/pci/asihpi/hpi6000.c index 12dab5e4892c..f7e374ec4414 100644 --- a/sound/pci/asihpi/hpi6000.c +++ b/sound/pci/asihpi/hpi6000.c @@ -687,6 +687,7 @@ static short hpi6000_adapter_boot_load_dsp(struct hpi_adapter_obj *pao, switch (pao->pci.subsys_device_id) { case 0x5100: case 0x5110: /* ASI5100 revB or higher with C6711D */ + case 0x5200: /* ASI5200 PC_ie version of ASI5100 */ case 0x6100: case 0x6200: boot_load_family = HPI_ADAPTER_FAMILY_ASI(0x6200); @@ -1133,6 +1134,12 @@ static short hpi6000_adapter_boot_load_dsp(struct hpi_adapter_obj *pao, subsys_device_id) == HPI_ADAPTER_FAMILY_ASI(0x5100)) mask = 0x00000000L; + /* ASI5200 uses AX6 code, */ + /* but has no PLD r/w register to test */ + if (HPI_ADAPTER_FAMILY_ASI(pao->pci. + subsys_device_id) == + HPI_ADAPTER_FAMILY_ASI(0x5200)) + mask = 0x00000000L; break; case HPI_ADAPTER_FAMILY_ASI(0x8800): /* ASI8800 has 16bit path to FPGA */ -- cgit v1.2.3 From 108ccb3f0fa617a003c6b076b73b74d4f85e4cde Mon Sep 17 00:00:00 2001 From: Eliot Blennerhassett Date: Tue, 6 Jul 2010 08:37:09 +1200 Subject: ALSA: asihpi - Change compander API and tidy Compander API changed to one function per parameter. Factor out some common code for stereo log value reading. Make some more entity functions static. Signed-off-by: Eliot Blennerhassett Signed-off-by: Takashi Iwai --- sound/pci/asihpi/hpi_internal.h | 30 ++-- sound/pci/asihpi/hpifunc.c | 324 ++++++++++++++++++++++++---------------- 2 files changed, 211 insertions(+), 143 deletions(-) (limited to 'sound') diff --git a/sound/pci/asihpi/hpi_internal.h b/sound/pci/asihpi/hpi_internal.h index fdd0ce02aa68..7ae7a1d59853 100644 --- a/sound/pci/asihpi/hpi_internal.h +++ b/sound/pci/asihpi/hpi_internal.h @@ -142,12 +142,15 @@ enum HPI_BUSES { /******************************************* CONTROL ATTRIBUTES ****/ /* (in order of control type ID */ - /* This allows for 255 control types, 256 unique attributes each */ +/* This allows for 255 control types, 256 unique attributes each */ #define HPI_CTL_ATTR(ctl, ai) (HPI_CONTROL_##ctl * 0x100 + ai) /* Get the sub-index of the attribute for a control type */ #define HPI_CTL_ATTR_INDEX(i) (i&0xff) +/* Extract the control from the control attribute */ +#define HPI_CTL_ATTR_CONTROL(i) (i>>8) + /* Generic control attributes. */ /** Enable a control. @@ -311,8 +314,7 @@ Used for HPI_ChannelModeSet/Get() /* Microphone control attributes */ #define HPI_MICROPHONE_PHANTOM_POWER HPI_CTL_ATTR(MICROPHONE, 1) -/** Equalizer control attributes -*/ +/** Equalizer control attributes */ /** Used to get number of filters in an EQ. (Can't set) */ #define HPI_EQUALIZER_NUM_FILTERS HPI_CTL_ATTR(EQUALIZER, 1) /** Set/get the filter by type, freq, Q, gain */ @@ -320,13 +322,15 @@ Used for HPI_ChannelModeSet/Get() /** Get the biquad coefficients */ #define HPI_EQUALIZER_COEFFICIENTS HPI_CTL_ATTR(EQUALIZER, 3) -#define HPI_COMPANDER_PARAMS HPI_CTL_ATTR(COMPANDER, 1) +/* Note compander also uses HPI_GENERIC_ENABLE */ +#define HPI_COMPANDER_PARAMS HPI_CTL_ATTR(COMPANDER, 1) +#define HPI_COMPANDER_MAKEUPGAIN HPI_CTL_ATTR(COMPANDER, 2) +#define HPI_COMPANDER_THRESHOLD HPI_CTL_ATTR(COMPANDER, 3) +#define HPI_COMPANDER_RATIO HPI_CTL_ATTR(COMPANDER, 4) +#define HPI_COMPANDER_ATTACK HPI_CTL_ATTR(COMPANDER, 5) +#define HPI_COMPANDER_DECAY HPI_CTL_ATTR(COMPANDER, 6) -/* Cobranet control attributes. - MUST be distinct from all other control attributes. - This is so that host side processing can easily identify a Cobranet control - and apply additional host side operations (like copying data) as required. -*/ +/* Cobranet control attributes. */ #define HPI_COBRANET_SET HPI_CTL_ATTR(COBRANET, 1) #define HPI_COBRANET_GET HPI_CTL_ATTR(COBRANET, 2) #define HPI_COBRANET_SET_DATA HPI_CTL_ATTR(COBRANET, 3) @@ -1512,11 +1516,11 @@ struct hpi_control_cache_single { struct hpi_control_cache_info i; union { struct { /* volume */ - u16 an_log[2]; + short an_log[2]; } v; struct { /* peak meter */ - u16 an_log_peak[2]; - u16 an_logRMS[2]; + short an_log_peak[2]; + short an_logRMS[2]; } p; struct { /* channel mode */ u16 mode; @@ -1526,7 +1530,7 @@ struct hpi_control_cache_single { u16 source_node_index; } x; struct { /* level/trim */ - u16 an_log[2]; + short an_log[2]; } l; struct { /* tuner - partial caching. some attributes go to the DSP. */ diff --git a/sound/pci/asihpi/hpifunc.c b/sound/pci/asihpi/hpifunc.c index 298eef3e20e9..9c6958ab9284 100644 --- a/sound/pci/asihpi/hpifunc.c +++ b/sound/pci/asihpi/hpifunc.c @@ -96,8 +96,7 @@ void hpi_stream_response_to_legacy(struct hpi_stream_res *pSR) static struct hpi_hsubsys gh_subsys; -struct hpi_hsubsys *hpi_subsys_create(void - ) +struct hpi_hsubsys *hpi_subsys_create(void) { struct hpi_message hm; struct hpi_response hr; @@ -302,6 +301,7 @@ u16 hpi_adapter_set_mode_ex(const struct hpi_hsubsys *ph_subsys, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, HPI_ADAPTER_SET_MODE); hm.adapter_index = adapter_index; @@ -510,7 +510,7 @@ u16 hpi_adapter_debug_read(const struct hpi_hsubsys *ph_subsys, hm.adapter_index = adapter_index; hm.u.ax.debug_read.dsp_address = dsp_address; - if (*count_bytes > sizeof(hr.u.bytes)) + if (*count_bytes > (int)sizeof(hr.u.bytes)) *count_bytes = sizeof(hr.u.bytes); hm.u.ax.debug_read.count_bytes = *count_bytes; @@ -976,6 +976,7 @@ u16 hpi_outstream_ancillary_read(const struct hpi_hsubsys *ph_subsys, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, HPI_OSTREAM_ANC_READ); u32TOINDEXES(h_outstream, &hm.adapter_index, &hm.obj_index); @@ -1581,6 +1582,7 @@ u16 hpi_control_param_set(const struct hpi_hsubsys *ph_subsys, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, HPI_CONTROL_SET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); @@ -1591,6 +1593,22 @@ u16 hpi_control_param_set(const struct hpi_hsubsys *ph_subsys, return hr.error; } +static u16 hpi_control_log_set2(u32 h_control, u16 attrib, short sv0, + short sv1) +{ + struct hpi_message hm; + struct hpi_response hr; + + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, + HPI_CONTROL_SET_STATE); + u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); + hm.u.c.attribute = attrib; + hm.u.c.an_log_value[0] = sv0; + hm.u.c.an_log_value[1] = sv1; + hpi_send_recv(&hm, &hr); + return hr.error; +} + static u16 hpi_control_param_get(const struct hpi_hsubsys *ph_subsys, const u32 h_control, const u16 attrib, u32 param1, u32 param2, @@ -1598,6 +1616,7 @@ u16 hpi_control_param_get(const struct hpi_hsubsys *ph_subsys, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, HPI_CONTROL_GET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); @@ -1605,8 +1624,8 @@ u16 hpi_control_param_get(const struct hpi_hsubsys *ph_subsys, hm.u.c.param1 = param1; hm.u.c.param2 = param2; hpi_send_recv(&hm, &hr); - if (pparam1) - *pparam1 = hr.u.c.param1; + + *pparam1 = hr.u.c.param1; if (pparam2) *pparam2 = hr.u.c.param2; @@ -1617,10 +1636,23 @@ u16 hpi_control_param_get(const struct hpi_hsubsys *ph_subsys, hpi_control_param_get(s, h, a, 0, 0, p1, NULL) #define hpi_control_param2_get(s, h, a, p1, p2) \ hpi_control_param_get(s, h, a, 0, 0, p1, p2) -#define hpi_control_ex_param1_get(s, h, a, p1) \ - hpi_control_ex_param_get(s, h, a, 0, 0, p1, NULL) -#define hpi_control_ex_param2_get(s, h, a, p1, p2) \ - hpi_control_ex_param_get(s, h, a, 0, 0, p1, p2) + +static u16 hpi_control_log_get2(const struct hpi_hsubsys *ph_subsys, + u32 h_control, u16 attrib, short *sv0, short *sv1) +{ + struct hpi_message hm; + struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, + HPI_CONTROL_GET_STATE); + u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); + hm.u.c.attribute = attrib; + + hpi_send_recv(&hm, &hr); + *sv0 = hr.u.c.an_log_value[0]; + if (sv1) + *sv1 = hr.u.c.an_log_value[1]; + return hr.error; +} static u16 hpi_control_query(const struct hpi_hsubsys *ph_subsys, @@ -1629,6 +1661,7 @@ u16 hpi_control_query(const struct hpi_hsubsys *ph_subsys, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, HPI_CONTROL_GET_INFO); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); @@ -1643,9 +1676,8 @@ u16 hpi_control_query(const struct hpi_hsubsys *ph_subsys, return hr.error; } -static u16 hpi_control_get_string(const struct hpi_hsubsys *ph_subsys, - const u32 h_control, const u16 attribute, char *psz_string, - const u32 string_length) +static u16 hpi_control_get_string(const u32 h_control, const u16 attribute, + char *psz_string, const u32 string_length) { unsigned int sub_string_index = 0, j = 0; char c = 0; @@ -1916,6 +1948,7 @@ u16 hpi_cobranet_hmi_write(const struct hpi_hsubsys *ph_subsys, u32 h_control, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROLEX, HPI_CONTROL_SET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); @@ -1941,6 +1974,7 @@ u16 hpi_cobranet_hmi_read(const struct hpi_hsubsys *ph_subsys, u32 h_control, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROLEX, HPI_CONTROL_GET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); @@ -1980,6 +2014,7 @@ u16 hpi_cobranet_hmi_get_status(const struct hpi_hsubsys *ph_subsys, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROLEX, HPI_CONTROL_GET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); @@ -2006,6 +2041,7 @@ u16 hpi_cobranet_getI_paddress(const struct hpi_hsubsys *ph_subsys, u32 byte_count; u32 iP; u16 error; + error = hpi_cobranet_hmi_read(ph_subsys, h_control, HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, &byte_count, (u8 *)&iP); @@ -2082,6 +2118,7 @@ u16 hpi_cobranet_getMA_caddress(const struct hpi_hsubsys *ph_subsys, u32 byte_count; u16 error; u32 mAC; + error = hpi_cobranet_hmi_read(ph_subsys, h_control, HPI_COBRANET_HMI_cobra_if_phy_address, 4, &byte_count, (u8 *)&mAC); @@ -2103,53 +2140,111 @@ u16 hpi_cobranet_getMA_caddress(const struct hpi_hsubsys *ph_subsys, return error; } -u16 hpi_compander_set(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 attack, u16 decay, short ratio100, short threshold0_01dB, - short makeup_gain0_01dB) +u16 hpi_compander_set_enable(const struct hpi_hsubsys *ph_subsys, + u32 h_control, u32 enable) +{ + return hpi_control_param_set(ph_subsys, h_control, HPI_GENERIC_ENABLE, + enable, 0); +} + +u16 hpi_compander_get_enable(const struct hpi_hsubsys *ph_subsys, + u32 h_control, u32 *enable) +{ + return hpi_control_param1_get(ph_subsys, h_control, + HPI_GENERIC_ENABLE, enable); +} + +u16 hpi_compander_set_makeup_gain(const struct hpi_hsubsys *ph_subsys, + u32 h_control, short makeup_gain0_01dB) +{ + return hpi_control_log_set2(h_control, HPI_COMPANDER_MAKEUPGAIN, + makeup_gain0_01dB, 0); +} + +u16 hpi_compander_get_makeup_gain(const struct hpi_hsubsys *ph_subsys, + u32 h_control, short *makeup_gain0_01dB) +{ + return hpi_control_log_get2(ph_subsys, h_control, + HPI_COMPANDER_MAKEUPGAIN, makeup_gain0_01dB, NULL); +} + +u16 hpi_compander_set_attack_time_constant(const struct hpi_hsubsys + *ph_subsys, u32 h_control, unsigned int index, u32 attack) +{ + return hpi_control_param_set(ph_subsys, h_control, + HPI_COMPANDER_ATTACK, attack, index); +} + +u16 hpi_compander_get_attack_time_constant(const struct hpi_hsubsys + *ph_subsys, u32 h_control, unsigned int index, u32 *attack) +{ + return hpi_control_param_get(ph_subsys, h_control, + HPI_COMPANDER_ATTACK, 0, index, attack, &index); +} + +u16 hpi_compander_set_decay_time_constant(const struct hpi_hsubsys *ph_subsys, + u32 h_control, unsigned int index, u32 decay) +{ + return hpi_control_param_set(ph_subsys, h_control, + HPI_COMPANDER_DECAY, decay, index); +} + +u16 hpi_compander_get_decay_time_constant(const struct hpi_hsubsys *ph_subsys, + u32 h_control, unsigned int index, u32 *decay) +{ + return hpi_control_param_get(ph_subsys, h_control, + HPI_COMPANDER_DECAY, 0, index, decay, &index); + +} + +u16 hpi_compander_set_threshold(const struct hpi_hsubsys *ph_subsys, + u32 h_control, unsigned int index, short threshold0_01dB) { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, HPI_CONTROL_SET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - - hm.u.c.param1 = attack + ((u32)ratio100 << 16); - hm.u.c.param2 = (decay & 0xFFFFL); + hm.u.c.attribute = HPI_COMPANDER_THRESHOLD; + hm.u.c.param2 = index; hm.u.c.an_log_value[0] = threshold0_01dB; - hm.u.c.an_log_value[1] = makeup_gain0_01dB; - hm.u.c.attribute = HPI_COMPANDER_PARAMS; hpi_send_recv(&hm, &hr); return hr.error; } -u16 hpi_compander_get(const struct hpi_hsubsys *ph_subsys, u32 h_control, - u16 *pw_attack, u16 *pw_decay, short *pw_ratio100, - short *pn_threshold0_01dB, short *pn_makeup_gain0_01dB) +u16 hpi_compander_get_threshold(const struct hpi_hsubsys *ph_subsys, + u32 h_control, unsigned int index, short *threshold0_01dB) { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, HPI_CONTROL_GET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_COMPANDER_PARAMS; + hm.u.c.attribute = HPI_COMPANDER_THRESHOLD; + hm.u.c.param2 = index; hpi_send_recv(&hm, &hr); + *threshold0_01dB = hr.u.c.an_log_value[0]; - if (pw_attack) - *pw_attack = (short)(hr.u.c.param1 & 0xFFFF); - if (pw_decay) - *pw_decay = (short)(hr.u.c.param2 & 0xFFFF); - if (pw_ratio100) - *pw_ratio100 = (short)(hr.u.c.param1 >> 16); + return hr.error; +} - if (pn_threshold0_01dB) - *pn_threshold0_01dB = hr.u.c.an_log_value[0]; - if (pn_makeup_gain0_01dB) - *pn_makeup_gain0_01dB = hr.u.c.an_log_value[1]; +u16 hpi_compander_set_ratio(const struct hpi_hsubsys *ph_subsys, + u32 h_control, u32 index, u32 ratio100) +{ + return hpi_control_param_set(ph_subsys, h_control, + HPI_COMPANDER_RATIO, ratio100, index); +} - return hr.error; +u16 hpi_compander_get_ratio(const struct hpi_hsubsys *ph_subsys, + u32 h_control, u32 index, u32 *ratio100) +{ + return hpi_control_param_get(ph_subsys, h_control, + HPI_COMPANDER_RATIO, 0, index, ratio100, &index); } u16 hpi_level_query_range(const struct hpi_hsubsys *ph_subsys, u32 h_control, @@ -2157,6 +2252,7 @@ u16 hpi_level_query_range(const struct hpi_hsubsys *ph_subsys, u32 h_control, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, HPI_CONTROL_GET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); @@ -2181,37 +2277,16 @@ u16 hpi_level_set_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS] ) { - struct hpi_message hm; - struct hpi_response hr; - - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_SET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - memcpy(hm.u.c.an_log_value, an_gain0_01dB, - sizeof(short) * HPI_MAX_CHANNELS); - hm.u.c.attribute = HPI_LEVEL_GAIN; - - hpi_send_recv(&hm, &hr); - - return hr.error; + return hpi_control_log_set2(h_control, HPI_LEVEL_GAIN, + an_gain0_01dB[0], an_gain0_01dB[1]); } u16 hpi_level_get_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS] ) { - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_LEVEL_GAIN; - - hpi_send_recv(&hm, &hr); - - memcpy(an_gain0_01dB, hr.u.c.an_log_value, - sizeof(short) * HPI_MAX_CHANNELS); - return hr.error; + return hpi_control_log_get2(ph_subsys, h_control, HPI_LEVEL_GAIN, + &an_gain0_01dB[0], &an_gain0_01dB[1]); } u16 hpi_meter_query_channels(const struct hpi_hsubsys *ph_subsys, @@ -2413,6 +2488,7 @@ u16 hpi_parametricEQ__get_band(const struct hpi_hsubsys *ph_subsys, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, HPI_CONTROL_GET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); @@ -2439,6 +2515,7 @@ u16 hpi_parametricEQ__set_band(const struct hpi_hsubsys *ph_subsys, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, HPI_CONTROL_SET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); @@ -2460,6 +2537,7 @@ u16 hpi_parametricEQ__get_coeffs(const struct hpi_hsubsys *ph_subsys, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, HPI_CONTROL_GET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); @@ -2623,8 +2701,8 @@ u16 hpi_tone_detector_get_frequency(const struct hpi_hsubsys *ph_subsys, u16 hpi_tone_detector_get_state(const struct hpi_hsubsys *ph_subsys, u32 h_control, u32 *state) { - return hpi_control_param_get(ph_subsys, h_control, - HPI_TONEDETECTOR_STATE, 0, 0, (u32 *)state, NULL); + return hpi_control_param1_get(ph_subsys, h_control, + HPI_TONEDETECTOR_STATE, state); } u16 hpi_tone_detector_set_enable(const struct hpi_hsubsys *ph_subsys, @@ -2637,8 +2715,8 @@ u16 hpi_tone_detector_set_enable(const struct hpi_hsubsys *ph_subsys, u16 hpi_tone_detector_get_enable(const struct hpi_hsubsys *ph_subsys, u32 h_control, u32 *enable) { - return hpi_control_param_get(ph_subsys, h_control, HPI_GENERIC_ENABLE, - 0, 0, (u32 *)enable, NULL); + return hpi_control_param1_get(ph_subsys, h_control, + HPI_GENERIC_ENABLE, enable); } u16 hpi_tone_detector_set_event_enable(const struct hpi_hsubsys *ph_subsys, @@ -2651,8 +2729,8 @@ u16 hpi_tone_detector_set_event_enable(const struct hpi_hsubsys *ph_subsys, u16 hpi_tone_detector_get_event_enable(const struct hpi_hsubsys *ph_subsys, u32 h_control, u32 *event_enable) { - return hpi_control_param_get(ph_subsys, h_control, - HPI_GENERIC_EVENT_ENABLE, 0, 0, (u32 *)event_enable, NULL); + return hpi_control_param1_get(ph_subsys, h_control, + HPI_GENERIC_EVENT_ENABLE, event_enable); } u16 hpi_tone_detector_set_threshold(const struct hpi_hsubsys *ph_subsys, @@ -2665,15 +2743,15 @@ u16 hpi_tone_detector_set_threshold(const struct hpi_hsubsys *ph_subsys, u16 hpi_tone_detector_get_threshold(const struct hpi_hsubsys *ph_subsys, u32 h_control, int *threshold) { - return hpi_control_param_get(ph_subsys, h_control, - HPI_TONEDETECTOR_THRESHOLD, 0, 0, (u32 *)threshold, NULL); + return hpi_control_param1_get(ph_subsys, h_control, + HPI_TONEDETECTOR_THRESHOLD, (u32 *)threshold); } u16 hpi_silence_detector_get_state(const struct hpi_hsubsys *ph_subsys, u32 h_control, u32 *state) { - return hpi_control_param_get(ph_subsys, h_control, - HPI_SILENCEDETECTOR_STATE, 0, 0, (u32 *)state, NULL); + return hpi_control_param1_get(ph_subsys, h_control, + HPI_SILENCEDETECTOR_STATE, state); } u16 hpi_silence_detector_set_enable(const struct hpi_hsubsys *ph_subsys, @@ -2686,50 +2764,50 @@ u16 hpi_silence_detector_set_enable(const struct hpi_hsubsys *ph_subsys, u16 hpi_silence_detector_get_enable(const struct hpi_hsubsys *ph_subsys, u32 h_control, u32 *enable) { - return hpi_control_param_get(ph_subsys, h_control, HPI_GENERIC_ENABLE, - 0, 0, (u32 *)enable, NULL); + return hpi_control_param1_get(ph_subsys, h_control, + HPI_GENERIC_ENABLE, enable); } u16 hpi_silence_detector_set_event_enable(const struct hpi_hsubsys *ph_subsys, u32 h_control, u32 event_enable) { return hpi_control_param_set(ph_subsys, h_control, - HPI_GENERIC_EVENT_ENABLE, (u32)event_enable, 0); + HPI_GENERIC_EVENT_ENABLE, event_enable, 0); } u16 hpi_silence_detector_get_event_enable(const struct hpi_hsubsys *ph_subsys, u32 h_control, u32 *event_enable) { - return hpi_control_param_get(ph_subsys, h_control, - HPI_GENERIC_EVENT_ENABLE, 0, 0, (u32 *)event_enable, NULL); + return hpi_control_param1_get(ph_subsys, h_control, + HPI_GENERIC_EVENT_ENABLE, event_enable); } u16 hpi_silence_detector_set_delay(const struct hpi_hsubsys *ph_subsys, u32 h_control, u32 delay) { return hpi_control_param_set(ph_subsys, h_control, - HPI_SILENCEDETECTOR_DELAY, (u32)delay, 0); + HPI_SILENCEDETECTOR_DELAY, delay, 0); } u16 hpi_silence_detector_get_delay(const struct hpi_hsubsys *ph_subsys, u32 h_control, u32 *delay) { - return hpi_control_param_get(ph_subsys, h_control, - HPI_SILENCEDETECTOR_DELAY, 0, 0, (u32 *)delay, NULL); + return hpi_control_param1_get(ph_subsys, h_control, + HPI_SILENCEDETECTOR_DELAY, delay); } u16 hpi_silence_detector_set_threshold(const struct hpi_hsubsys *ph_subsys, u32 h_control, int threshold) { return hpi_control_param_set(ph_subsys, h_control, - HPI_SILENCEDETECTOR_THRESHOLD, (u32)threshold, 0); + HPI_SILENCEDETECTOR_THRESHOLD, threshold, 0); } u16 hpi_silence_detector_get_threshold(const struct hpi_hsubsys *ph_subsys, u32 h_control, int *threshold) { - return hpi_control_param_get(ph_subsys, h_control, - HPI_SILENCEDETECTOR_THRESHOLD, 0, 0, (u32 *)threshold, NULL); + return hpi_control_param1_get(ph_subsys, h_control, + HPI_SILENCEDETECTOR_THRESHOLD, (u32 *)threshold); } u16 hpi_tuner_query_band(const struct hpi_hsubsys *ph_subsys, @@ -2822,6 +2900,7 @@ u16 hpi_tuner_getRF_level(const struct hpi_hsubsys *ph_subsys, u32 h_control, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, HPI_CONTROL_GET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); @@ -2838,6 +2917,7 @@ u16 hpi_tuner_get_rawRF_level(const struct hpi_hsubsys *ph_subsys, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, HPI_CONTROL_GET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); @@ -2894,14 +2974,14 @@ u16 hpi_tuner_get_program(const struct hpi_hsubsys *ph_subsys, u32 h_control, u16 hpi_tuner_get_hd_radio_dsp_version(const struct hpi_hsubsys *ph_subsys, u32 h_control, char *psz_dsp_version, const u32 string_size) { - return hpi_control_get_string(ph_subsys, h_control, + return hpi_control_get_string(h_control, HPI_TUNER_HDRADIO_DSP_VERSION, psz_dsp_version, string_size); } u16 hpi_tuner_get_hd_radio_sdk_version(const struct hpi_hsubsys *ph_subsys, u32 h_control, char *psz_sdk_version, const u32 string_size) { - return hpi_control_get_string(ph_subsys, h_control, + return hpi_control_get_string(h_control, HPI_TUNER_HDRADIO_SDK_VERSION, psz_sdk_version, string_size); } @@ -2942,15 +3022,15 @@ u16 hpi_tuner_get_mode(const struct hpi_hsubsys *ph_subsys, u32 h_control, u16 hpi_tuner_get_hd_radio_signal_quality(const struct hpi_hsubsys *ph_subsys, u32 h_control, u32 *pquality) { - return hpi_control_param_get(ph_subsys, h_control, - HPI_TUNER_HDRADIO_SIGNAL_QUALITY, 0, 0, pquality, NULL); + return hpi_control_param1_get(ph_subsys, h_control, + HPI_TUNER_HDRADIO_SIGNAL_QUALITY, pquality); } u16 hpi_tuner_get_hd_radio_signal_blend(const struct hpi_hsubsys *ph_subsys, u32 h_control, u32 *pblend) { - return hpi_control_param_get(ph_subsys, h_control, - HPI_TUNER_HDRADIO_BLEND, 0, 0, pblend, NULL); + return hpi_control_param1_get(ph_subsys, h_control, + HPI_TUNER_HDRADIO_BLEND, pblend); } u16 hpi_tuner_set_hd_radio_signal_blend(const struct hpi_hsubsys *ph_subsys, @@ -2965,6 +3045,7 @@ u16 hpi_tuner_getRDS(const struct hpi_hsubsys *ph_subsys, u32 h_control, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, HPI_CONTROL_GET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); @@ -2981,43 +3062,43 @@ u16 hpi_tuner_getRDS(const struct hpi_hsubsys *ph_subsys, u32 h_control, u16 HPI_PAD__get_channel_name(const struct hpi_hsubsys *ph_subsys, u32 h_control, char *psz_string, const u32 data_length) { - return hpi_control_get_string(ph_subsys, h_control, - HPI_PAD_CHANNEL_NAME, psz_string, data_length); + return hpi_control_get_string(h_control, HPI_PAD_CHANNEL_NAME, + psz_string, data_length); } u16 HPI_PAD__get_artist(const struct hpi_hsubsys *ph_subsys, u32 h_control, char *psz_string, const u32 data_length) { - return hpi_control_get_string(ph_subsys, h_control, HPI_PAD_ARTIST, - psz_string, data_length); + return hpi_control_get_string(h_control, HPI_PAD_ARTIST, psz_string, + data_length); } u16 HPI_PAD__get_title(const struct hpi_hsubsys *ph_subsys, u32 h_control, char *psz_string, const u32 data_length) { - return hpi_control_get_string(ph_subsys, h_control, HPI_PAD_TITLE, - psz_string, data_length); + return hpi_control_get_string(h_control, HPI_PAD_TITLE, psz_string, + data_length); } u16 HPI_PAD__get_comment(const struct hpi_hsubsys *ph_subsys, u32 h_control, char *psz_string, const u32 data_length) { - return hpi_control_get_string(ph_subsys, h_control, HPI_PAD_COMMENT, - psz_string, data_length); + return hpi_control_get_string(h_control, HPI_PAD_COMMENT, psz_string, + data_length); } u16 HPI_PAD__get_program_type(const struct hpi_hsubsys *ph_subsys, u32 h_control, u32 *ppTY) { - return hpi_control_param_get(ph_subsys, h_control, - HPI_PAD_PROGRAM_TYPE, 0, 0, ppTY, NULL); + return hpi_control_param1_get(ph_subsys, h_control, + HPI_PAD_PROGRAM_TYPE, ppTY); } u16 HPI_PAD__get_rdsPI(const struct hpi_hsubsys *ph_subsys, u32 h_control, u32 *ppI) { - return hpi_control_param_get(ph_subsys, h_control, HPI_PAD_PROGRAM_ID, - 0, 0, ppI, NULL); + return hpi_control_param1_get(ph_subsys, h_control, + HPI_PAD_PROGRAM_ID, ppI); } u16 hpi_volume_query_channels(const struct hpi_hsubsys *ph_subsys, @@ -3031,36 +3112,16 @@ u16 hpi_volume_set_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, short an_log_gain[HPI_MAX_CHANNELS] ) { - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_SET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - memcpy(hm.u.c.an_log_value, an_log_gain, - sizeof(short) * HPI_MAX_CHANNELS); - hm.u.c.attribute = HPI_VOLUME_GAIN; - - hpi_send_recv(&hm, &hr); - - return hr.error; + return hpi_control_log_set2(h_control, HPI_VOLUME_GAIN, + an_log_gain[0], an_log_gain[1]); } u16 hpi_volume_get_gain(const struct hpi_hsubsys *ph_subsys, u32 h_control, short an_log_gain[HPI_MAX_CHANNELS] ) { - struct hpi_message hm; - struct hpi_response hr; - hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, - HPI_CONTROL_GET_STATE); - u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); - hm.u.c.attribute = HPI_VOLUME_GAIN; - - hpi_send_recv(&hm, &hr); - - memcpy(an_log_gain, hr.u.c.an_log_value, - sizeof(short) * HPI_MAX_CHANNELS); - return hr.error; + return hpi_control_log_get2(ph_subsys, h_control, HPI_VOLUME_GAIN, + &an_log_gain[0], &an_log_gain[1]); } u16 hpi_volume_query_range(const struct hpi_hsubsys *ph_subsys, u32 h_control, @@ -3068,6 +3129,7 @@ u16 hpi_volume_query_range(const struct hpi_hsubsys *ph_subsys, u32 h_control, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, HPI_CONTROL_GET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); @@ -3094,6 +3156,7 @@ u16 hpi_volume_auto_fade_profile(const struct hpi_hsubsys *ph_subsys, { struct hpi_message hm; struct hpi_response hr; + hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, HPI_CONTROL_SET_STATE); u32TOINDEXES(h_control, &hm.adapter_index, &hm.obj_index); @@ -3170,43 +3233,43 @@ static size_t entity_type_to_size[LAST_ENTITY_TYPE] = { 6 * sizeof(char), }; -inline size_t hpi_entity_size(struct hpi_entity *entity_ptr) +static inline size_t hpi_entity_size(struct hpi_entity *entity_ptr) { return entity_ptr->header.size; } -inline size_t hpi_entity_header_size(struct hpi_entity *entity_ptr) +static inline size_t hpi_entity_header_size(struct hpi_entity *entity_ptr) { return sizeof(entity_ptr->header); } -inline size_t hpi_entity_value_size(struct hpi_entity *entity_ptr) +static inline size_t hpi_entity_value_size(struct hpi_entity *entity_ptr) { return hpi_entity_size(entity_ptr) - hpi_entity_header_size(entity_ptr); } -inline size_t hpi_entity_item_count(struct hpi_entity *entity_ptr) +static inline size_t hpi_entity_item_count(struct hpi_entity *entity_ptr) { return hpi_entity_value_size(entity_ptr) / entity_type_to_size[entity_ptr->header.type]; } -inline struct hpi_entity *hpi_entity_ptr_to_next(struct hpi_entity +static inline struct hpi_entity *hpi_entity_ptr_to_next(struct hpi_entity *entity_ptr) { return (void *)(((uint8_t *) entity_ptr) + hpi_entity_size(entity_ptr)); } -inline u16 hpi_entity_check_type(const enum e_entity_type t) +static inline u16 hpi_entity_check_type(const enum e_entity_type t) { if (t >= 0 && t < STR_TYPE_FIELD_MAX) return 0; return HPI_ERROR_ENTITY_TYPE_INVALID; } -inline u16 hpi_entity_check_role(const enum e_entity_role r) +static inline u16 hpi_entity_check_role(const enum e_entity_role r) { if (r >= 0 && r < STR_ROLE_FIELD_MAX) return 0; @@ -3624,6 +3687,7 @@ u16 hpi_async_event_wait(const struct hpi_hsubsys *ph_subsys, u32 h_async, u16 maximum_events, struct hpi_async_event *p_events, u16 *pw_number_returned) { + return 0; } -- cgit v1.2.3 From 36ed8bdd867314660b8dca2d1b6d9e92352b319b Mon Sep 17 00:00:00 2001 From: Eliot Blennerhassett Date: Tue, 6 Jul 2010 08:37:10 +1200 Subject: ALSA: asihpi - Minor HPI error handling fixes Handle errors in tuner level caching, Ccorrect error code for aesebu rx status. Signed-off-by: Eliot Blennerhassett Signed-off-by: Takashi Iwai --- sound/pci/asihpi/hpicmn.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/pci/asihpi/hpicmn.c b/sound/pci/asihpi/hpicmn.c index fcd64539d9ef..dda4f1c6f658 100644 --- a/sound/pci/asihpi/hpicmn.c +++ b/sound/pci/asihpi/hpicmn.c @@ -353,7 +353,12 @@ short hpi_check_control_cache(struct hpi_control_cache *p_cache, phr->u.c.param1 = pC->u.t.band; else if ((phm->u.c.attribute == HPI_TUNER_LEVEL) && (phm->u.c.param1 == HPI_TUNER_LEVEL_AVERAGE)) - phr->u.c.param1 = pC->u.t.level; + if (pC->u.t.level == HPI_ERROR_ILLEGAL_CACHE_VALUE) { + phr->u.c.param1 = 0; + phr->error = + HPI_ERROR_INVALID_CONTROL_ATTRIBUTE; + } else + phr->u.c.param1 = pC->u.t.level; else found = 0; break; @@ -397,7 +402,8 @@ short hpi_check_control_cache(struct hpi_control_cache *p_cache, if (pC->u.clk.source_index == HPI_ERROR_ILLEGAL_CACHE_VALUE) { phr->u.c.param1 = 0; - phr->error = HPI_ERROR_INVALID_OPERATION; + phr->error = + HPI_ERROR_INVALID_CONTROL_ATTRIBUTE; } else phr->u.c.param1 = pC->u.clk.source_index; } else if (phm->u.c.attribute == HPI_SAMPLECLOCK_SAMPLERATE) -- cgit v1.2.3 From f978d36da4024ee22957f74276e944624a8c7f6d Mon Sep 17 00:00:00 2001 From: Eliot Blennerhassett Date: Tue, 6 Jul 2010 08:37:11 +1200 Subject: ALSA: asihpi - Remove unneeded ; Signed-off-by: Eliot Blennerhassett Signed-off-by: Takashi Iwai --- sound/pci/asihpi/hpidebug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/asihpi/hpidebug.c b/sound/pci/asihpi/hpidebug.c index 4cd85a401b34..949836ec913a 100644 --- a/sound/pci/asihpi/hpidebug.c +++ b/sound/pci/asihpi/hpidebug.c @@ -111,7 +111,7 @@ make_treenode_from_array(hpi_control_type_strings, HPI_CONTROL_TYPE_STRINGS) &hpi_profile_strings,\ &hpi_control_strings, \ &hpi_asyncevent_strings \ -}; +} make_treenode_from_array(hpi_function_strings, HPI_FUNCTION_STRINGS) compile_time_assert(HPI_OBJ_MAXINDEX == 14, obj_list_doesnt_match); -- cgit v1.2.3 From 088fbab406e264a60fb06d3ea8d32a3e802a00b8 Mon Sep 17 00:00:00 2001 From: Maurus Cuelenaere Date: Sun, 4 Jul 2010 15:12:11 +0200 Subject: ASoC: Invert speaker enabling behaviour in SmartQ sound driver The speaker was enabled when the headphone was plugged in, which isn't the wanted behaviour so correct this. Signed-off-by: Maurus Cuelenaere Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/s3c24xx/smartq_wm8987.c | 1 - 1 file changed, 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/s3c24xx/smartq_wm8987.c b/sound/soc/s3c24xx/smartq_wm8987.c index c90ef965aaf8..b480348140b0 100644 --- a/sound/soc/s3c24xx/smartq_wm8987.c +++ b/sound/soc/s3c24xx/smartq_wm8987.c @@ -112,7 +112,6 @@ static struct snd_soc_jack_pin smartq_jack_pins[] = { { .pin = "Internal Speaker", .mask = SND_JACK_HEADPHONE, - .invert = true, }, }; -- cgit v1.2.3 From a4c8ea2ddaed2f461606c2828b19786524b551ac Mon Sep 17 00:00:00 2001 From: Raffaele Recalcati Date: Tue, 6 Jul 2010 10:39:02 +0200 Subject: ASoC: DaVinci: Added two clocking possibilities to McBSP (I2S) Added two clocking options for dm365 McBSP peripheral when used with I2S timings, that are SND_SOC_DAIFMT_CBS_CFS (the cpu generates clock and frame sync) and SND_SOC_DAIFMT_CBS_CFM (the cpu gets clock from external pin and generates frame sync). A slave clock management can be important when the external codec needs the system clock and the bit clock synchronized (tested with uda1345). This patch has been developed against the: http://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-davinci.git git tree and has been tested on bmx board (similar to dm365 evm, but using uda1345 as external audio codec). Signed-off-by: Raffaele Recalcati Signed-off-by: Davide Bonfanti Acked-by: Liam Girdwood Acked-by: Sudhakar Rajashekhara Signed-off-by: Mark Brown --- sound/soc/davinci/davinci-i2s.c | 110 ++++++++++++++++++++++++++++++++++++---- sound/soc/davinci/davinci-i2s.h | 5 ++ 2 files changed, 106 insertions(+), 9 deletions(-) (limited to 'sound') diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c index adadcd3aa1b1..c8f038cb4c5e 100644 --- a/sound/soc/davinci/davinci-i2s.c +++ b/sound/soc/davinci/davinci-i2s.c @@ -26,6 +26,7 @@ #include #include "davinci-pcm.h" +#include "davinci-i2s.h" /* @@ -68,16 +69,21 @@ #define DAVINCI_MCBSP_RCR_RDATDLY(v) ((v) << 16) #define DAVINCI_MCBSP_RCR_RFIG (1 << 18) #define DAVINCI_MCBSP_RCR_RWDLEN2(v) ((v) << 21) +#define DAVINCI_MCBSP_RCR_RFRLEN2(v) ((v) << 24) +#define DAVINCI_MCBSP_RCR_RPHASE BIT(31) #define DAVINCI_MCBSP_XCR_XWDLEN1(v) ((v) << 5) #define DAVINCI_MCBSP_XCR_XFRLEN1(v) ((v) << 8) #define DAVINCI_MCBSP_XCR_XDATDLY(v) ((v) << 16) #define DAVINCI_MCBSP_XCR_XFIG (1 << 18) #define DAVINCI_MCBSP_XCR_XWDLEN2(v) ((v) << 21) +#define DAVINCI_MCBSP_XCR_XFRLEN2(v) ((v) << 24) +#define DAVINCI_MCBSP_XCR_XPHASE BIT(31) #define DAVINCI_MCBSP_SRGR_FWID(v) ((v) << 8) #define DAVINCI_MCBSP_SRGR_FPER(v) ((v) << 16) #define DAVINCI_MCBSP_SRGR_FSGM (1 << 28) +#define DAVINCI_MCBSP_SRGR_CLKSM BIT(29) #define DAVINCI_MCBSP_PCR_CLKRP (1 << 0) #define DAVINCI_MCBSP_PCR_CLKXP (1 << 1) @@ -144,6 +150,9 @@ struct davinci_mcbsp_dev { * won't end up being swapped because of the underrun. */ unsigned enable_channel_combine:1; + + unsigned int fmt; + int clk_div; }; static inline void davinci_mcbsp_write_reg(struct davinci_mcbsp_dev *dev, @@ -254,10 +263,12 @@ static int davinci_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, struct davinci_mcbsp_dev *dev = cpu_dai->private_data; unsigned int pcr; unsigned int srgr; + /* Attention srgr is updated by hw_params! */ srgr = DAVINCI_MCBSP_SRGR_FSGM | DAVINCI_MCBSP_SRGR_FPER(DEFAULT_BITPERSAMPLE * 2 - 1) | DAVINCI_MCBSP_SRGR_FWID(DEFAULT_BITPERSAMPLE - 1); + dev->fmt = fmt; /* set master/slave audio interface */ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: @@ -372,6 +383,18 @@ static int davinci_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, return 0; } +static int davinci_i2s_dai_set_clkdiv(struct snd_soc_dai *cpu_dai, + int div_id, int div) +{ + struct davinci_mcbsp_dev *dev = cpu_dai->private_data; + + if (div_id != DAVINCI_MCBSP_CLKGDV) + return -ENODEV; + + dev->clk_div = div; + return 0; +} + static int davinci_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -380,8 +403,8 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream, struct davinci_pcm_dma_params *dma_params = &dev->dma_params[substream->stream]; struct snd_interval *i = NULL; - int mcbsp_word_length; - unsigned int rcr, xcr, srgr; + int mcbsp_word_length, master; + unsigned int rcr, xcr, srgr, clk_div, freq, framesize; u32 spcr; snd_pcm_format_t fmt; unsigned element_cnt = 1; @@ -396,12 +419,47 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream, davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr); } - i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS); - srgr = DAVINCI_MCBSP_SRGR_FSGM; - srgr |= DAVINCI_MCBSP_SRGR_FWID(snd_interval_value(i) - 1); + master = dev->fmt & SND_SOC_DAIFMT_MASTER_MASK; + fmt = params_format(params); + mcbsp_word_length = asp_word_length[fmt]; - i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_FRAME_BITS); - srgr |= DAVINCI_MCBSP_SRGR_FPER(snd_interval_value(i) - 1); + switch (master) { + case SND_SOC_DAIFMT_CBS_CFS: + freq = clk_get_rate(dev->clk); + srgr = DAVINCI_MCBSP_SRGR_FSGM | + DAVINCI_MCBSP_SRGR_CLKSM; + srgr |= DAVINCI_MCBSP_SRGR_FWID(mcbsp_word_length * + 8 - 1); + /* symmetric waveforms */ + clk_div = freq / (mcbsp_word_length * 16) / + params->rate_num * params->rate_den; + srgr |= DAVINCI_MCBSP_SRGR_FPER(mcbsp_word_length * + 16 - 1); + clk_div &= 0xFF; + srgr |= clk_div; + break; + case SND_SOC_DAIFMT_CBM_CFS: + srgr = DAVINCI_MCBSP_SRGR_FSGM; + clk_div = dev->clk_div - 1; + srgr |= DAVINCI_MCBSP_SRGR_FWID(mcbsp_word_length * 8 - 1); + srgr |= DAVINCI_MCBSP_SRGR_FPER(mcbsp_word_length * 16 - 1); + clk_div &= 0xFF; + srgr |= clk_div; + break; + case SND_SOC_DAIFMT_CBM_CFM: + /* Clock and frame sync given from external sources */ + i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS); + srgr = DAVINCI_MCBSP_SRGR_FSGM; + srgr |= DAVINCI_MCBSP_SRGR_FWID(snd_interval_value(i) - 1); + pr_debug("%s - %d FWID set: re-read srgr = %X\n", + __func__, __LINE__, snd_interval_value(i) - 1); + + i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_FRAME_BITS); + srgr |= DAVINCI_MCBSP_SRGR_FPER(snd_interval_value(i) - 1); + break; + default: + return -EINVAL; + } davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SRGR_REG, srgr); rcr = DAVINCI_MCBSP_RCR_RFIG; @@ -426,12 +484,41 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream, element_cnt = 1; fmt = double_fmt[fmt]; } + switch (master) { + case SND_SOC_DAIFMT_CBS_CFS: + case SND_SOC_DAIFMT_CBS_CFM: + rcr |= DAVINCI_MCBSP_RCR_RFRLEN2(0); + xcr |= DAVINCI_MCBSP_XCR_XFRLEN2(0); + rcr |= DAVINCI_MCBSP_RCR_RPHASE; + xcr |= DAVINCI_MCBSP_XCR_XPHASE; + break; + case SND_SOC_DAIFMT_CBM_CFM: + case SND_SOC_DAIFMT_CBM_CFS: + rcr |= DAVINCI_MCBSP_RCR_RFRLEN2(element_cnt - 1); + xcr |= DAVINCI_MCBSP_XCR_XFRLEN2(element_cnt - 1); + break; + default: + return -EINVAL; + } } dma_params->acnt = dma_params->data_type = data_type[fmt]; dma_params->fifo_level = 0; mcbsp_word_length = asp_word_length[fmt]; - rcr |= DAVINCI_MCBSP_RCR_RFRLEN1(element_cnt - 1); - xcr |= DAVINCI_MCBSP_XCR_XFRLEN1(element_cnt - 1); + + switch (master) { + case SND_SOC_DAIFMT_CBS_CFS: + case SND_SOC_DAIFMT_CBS_CFM: + rcr |= DAVINCI_MCBSP_RCR_RFRLEN1(0); + xcr |= DAVINCI_MCBSP_XCR_XFRLEN1(0); + break; + case SND_SOC_DAIFMT_CBM_CFM: + case SND_SOC_DAIFMT_CBM_CFS: + rcr |= DAVINCI_MCBSP_RCR_RFRLEN1(element_cnt - 1); + xcr |= DAVINCI_MCBSP_XCR_XFRLEN1(element_cnt - 1); + break; + default: + return -EINVAL; + } rcr |= DAVINCI_MCBSP_RCR_RWDLEN1(mcbsp_word_length) | DAVINCI_MCBSP_RCR_RWDLEN2(mcbsp_word_length); @@ -442,6 +529,10 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream, davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_XCR_REG, xcr); else davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_RCR_REG, rcr); + + pr_debug("%s - %d srgr=%X\n", __func__, __LINE__, srgr); + pr_debug("%s - %d xcr=%X\n", __func__, __LINE__, xcr); + pr_debug("%s - %d rcr=%X\n", __func__, __LINE__, rcr); return 0; } @@ -500,6 +591,7 @@ static struct snd_soc_dai_ops davinci_i2s_dai_ops = { .trigger = davinci_i2s_trigger, .hw_params = davinci_i2s_hw_params, .set_fmt = davinci_i2s_set_dai_fmt, + .set_clkdiv = davinci_i2s_dai_set_clkdiv, }; diff --git a/sound/soc/davinci/davinci-i2s.h b/sound/soc/davinci/davinci-i2s.h index 241648ce8873..0b1e77b8c279 100644 --- a/sound/soc/davinci/davinci-i2s.h +++ b/sound/soc/davinci/davinci-i2s.h @@ -12,6 +12,11 @@ #ifndef _DAVINCI_I2S_H #define _DAVINCI_I2S_H +/* McBSP dividers */ +enum davinci_mcbsp_div { + DAVINCI_MCBSP_CLKGDV, /* Sample rate generator divider */ +}; + extern struct snd_soc_dai davinci_i2s_dai; #endif -- cgit v1.2.3 From ec6375533748806a1a49dad7ce124cc02886854a Mon Sep 17 00:00:00 2001 From: Raffaele Recalcati Date: Tue, 6 Jul 2010 10:39:03 +0200 Subject: ASoC: DaVinci: Added selection of clk input pin for McBSP When McBSP peripheral gets the clock from an external pin, there are three possible chooses, MCBSP_CLKX, MCBSP_CLKR and MCBSP_CLKS. evm-dm365 uses MCBSP_CLKR, instead in bmx board I have a different hardware connection and I use MCBSP_CLKS, so I have added this possibility. This patch has been developed against the: http://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-davinci.git git tree and has been tested on bmx board (similar to dm365 evm) Signed-off-by: Raffaele Recalcati Signed-off-by: Davide Bonfanti Acked-by: Liam Girdwood Acked-by: Sudhakar Rajashekhara Signed-off-by: Mark Brown --- sound/soc/davinci/davinci-i2s.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c index c8f038cb4c5e..ba5644b5fbbf 100644 --- a/sound/soc/davinci/davinci-i2s.c +++ b/sound/soc/davinci/davinci-i2s.c @@ -122,6 +122,7 @@ static const unsigned char double_fmt[SNDRV_PCM_FORMAT_S32_LE + 1] = { }; struct davinci_mcbsp_dev { + struct device *dev; struct davinci_pcm_dma_params dma_params[2]; void __iomem *base; #define MOD_DSP_A 0 @@ -153,6 +154,7 @@ struct davinci_mcbsp_dev { unsigned int fmt; int clk_div; + int clk_input_pin; }; static inline void davinci_mcbsp_write_reg(struct davinci_mcbsp_dev *dev, @@ -279,11 +281,26 @@ static int davinci_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, DAVINCI_MCBSP_PCR_CLKRM; break; case SND_SOC_DAIFMT_CBM_CFS: - /* McBSP CLKR pin is the input for the Sample Rate Generator. - * McBSP FSR and FSX are driven by the Sample Rate Generator. */ - pcr = DAVINCI_MCBSP_PCR_SCLKME | - DAVINCI_MCBSP_PCR_FSXM | - DAVINCI_MCBSP_PCR_FSRM; + pcr = DAVINCI_MCBSP_PCR_FSRM | DAVINCI_MCBSP_PCR_FSXM; + /* + * Selection of the clock input pin that is the + * input for the Sample Rate Generator. + * McBSP FSR and FSX are driven by the Sample Rate + * Generator. + */ + switch (dev->clk_input_pin) { + case MCBSP_CLKS: + pcr |= DAVINCI_MCBSP_PCR_CLKXM | + DAVINCI_MCBSP_PCR_CLKRM; + break; + case MCBSP_CLKR: + pcr |= DAVINCI_MCBSP_PCR_SCLKME; + break; + default: + dev_err(dev->dev, "bad clk_input_pin\n"); + return -EINVAL; + } + break; case SND_SOC_DAIFMT_CBM_CFM: /* codec is master */ @@ -644,6 +661,7 @@ static int davinci_i2s_probe(struct platform_device *pdev) pdata->sram_size_playback; dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].sram_size = pdata->sram_size_capture; + dev->clk_input_pin = pdata->clk_input_pin; } dev->clk = clk_get(&pdev->dev, NULL); if (IS_ERR(dev->clk)) { @@ -676,6 +694,7 @@ static int davinci_i2s_probe(struct platform_device *pdev) goto err_free_mem; } dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start; + dev->dev = &pdev->dev; davinci_i2s_dai.private_data = dev; davinci_i2s_dai.capture.dma_data = dev->dma_params; -- cgit v1.2.3 From d9823ed9fa3126097dfd2bbce6dc33957c1be728 Mon Sep 17 00:00:00 2001 From: Raffaele Recalcati Date: Tue, 6 Jul 2010 10:39:04 +0200 Subject: ASoC: DaVinci: More accurate continuous serial clock for McBSP (I2S) i2s_accurate_sck switch can be used to have a better approximate sampling frequency. The clock is an externally visible bit clock and it is named i2s continuous serial clock (I2S_SCK). The trade off is between more accurate clock (fast clock) and less accurate clock (slow clock). The waveform will be not symmetric. Probably it is possible to get a better algorithm for calculating the divider, trying to keep a slower clock as possible. This patch has been developed against the http://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-davinci.git git tree and has been tested on bmx board (similar to dm365 evm, but using uda1345 as external audio codec). Signed-off-by: Raffaele Recalcati Signed-off-by: Davide Bonfanti Acked-by: Liam Girdwood Acked-by: Sudhakar Rajashekhara Signed-off-by: Mark Brown --- sound/soc/davinci/davinci-i2s.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c index ba5644b5fbbf..b251bc9a9812 100644 --- a/sound/soc/davinci/davinci-i2s.c +++ b/sound/soc/davinci/davinci-i2s.c @@ -155,6 +155,7 @@ struct davinci_mcbsp_dev { unsigned int fmt; int clk_div; int clk_input_pin; + bool i2s_accurate_sck; }; static inline void davinci_mcbsp_write_reg(struct davinci_mcbsp_dev *dev, @@ -447,11 +448,23 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream, DAVINCI_MCBSP_SRGR_CLKSM; srgr |= DAVINCI_MCBSP_SRGR_FWID(mcbsp_word_length * 8 - 1); - /* symmetric waveforms */ - clk_div = freq / (mcbsp_word_length * 16) / - params->rate_num * params->rate_den; - srgr |= DAVINCI_MCBSP_SRGR_FPER(mcbsp_word_length * - 16 - 1); + if (dev->i2s_accurate_sck) { + clk_div = 256; + do { + framesize = (freq / (--clk_div)) / + params->rate_num * + params->rate_den; + } while (((framesize < 33) || (framesize > 4095)) && + (clk_div)); + clk_div--; + srgr |= DAVINCI_MCBSP_SRGR_FPER(framesize - 1); + } else { + /* symmetric waveforms */ + clk_div = freq / (mcbsp_word_length * 16) / + params->rate_num * params->rate_den; + srgr |= DAVINCI_MCBSP_SRGR_FPER(mcbsp_word_length * + 16 - 1); + } clk_div &= 0xFF; srgr |= clk_div; break; @@ -662,6 +675,7 @@ static int davinci_i2s_probe(struct platform_device *pdev) dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].sram_size = pdata->sram_size_capture; dev->clk_input_pin = pdata->clk_input_pin; + dev->i2s_accurate_sck = pdata->i2s_accurate_sck; } dev->clk = clk_get(&pdev->dev, NULL); if (IS_ERR(dev->clk)) { -- cgit v1.2.3 From e88ff1e6db0ae6462e881d9f10776f7bdfd32e64 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 9 Jul 2010 00:12:08 +0900 Subject: ASoC: Include WM8994 GPIO and interrupt registers in codec_reg Very handy for debug. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8994.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'sound') diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index e84a1177f350..ed8be9db2b02 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -1677,6 +1677,26 @@ static struct { static int wm8994_readable(unsigned int reg) { + switch (reg) { + case WM8994_GPIO_1: + case WM8994_GPIO_2: + case WM8994_GPIO_3: + case WM8994_GPIO_4: + case WM8994_GPIO_5: + case WM8994_GPIO_6: + case WM8994_GPIO_7: + case WM8994_GPIO_8: + case WM8994_GPIO_9: + case WM8994_GPIO_10: + case WM8994_GPIO_11: + case WM8994_INTERRUPT_STATUS_1: + case WM8994_INTERRUPT_STATUS_2: + case WM8994_INTERRUPT_RAW_STATUS_2: + return 1; + default: + break; + } + if (reg >= ARRAY_SIZE(access_masks)) return 0; return access_masks[reg].readable != 0; -- cgit v1.2.3 From 66b47fdb851924956b6e4696fb43a3496ae2c462 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Thu, 8 Jul 2010 11:25:43 +0900 Subject: ASoC: Implement WM8994 OPCLK support The WM8994 can output a clock derived from its internal SYSCLK, called OPCLK. The rate can be selected as a sysclk, with a division from the SYSCLK rate specified (multiplied by 10 since a division of 5.5 is supported) and the clock can be disabled by specifying a divisor of zero. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8994.c | 23 +++++++++++++++++++++++ sound/soc/codecs/wm8994.h | 3 +++ 2 files changed, 26 insertions(+) (limited to 'sound') diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index ed8be9db2b02..c41cf47f4009 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -2492,6 +2492,7 @@ static const struct snd_kcontrol_new aif3adc_mux = static const struct snd_soc_dapm_widget wm8994_dapm_widgets[] = { SND_SOC_DAPM_INPUT("DMIC1DAT"), SND_SOC_DAPM_INPUT("DMIC2DAT"), +SND_SOC_DAPM_INPUT("Clock"), SND_SOC_DAPM_SUPPLY("CLK_SYS", SND_SOC_NOPM, 0, 0, clk_sys_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), @@ -2966,11 +2967,14 @@ static int wm8994_set_fll(struct snd_soc_dai *dai, int id, int src, return 0; } +static int opclk_divs[] = { 10, 20, 30, 40, 55, 60, 80, 120, 160 }; + static int wm8994_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { struct snd_soc_codec *codec = dai->codec; struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); + int i; switch (dai->id) { case 1: @@ -3008,6 +3012,25 @@ static int wm8994_set_dai_sysclk(struct snd_soc_dai *dai, dev_dbg(dai->dev, "AIF%d using FLL2\n", dai->id); break; + case WM8994_SYSCLK_OPCLK: + /* Special case - a division (times 10) is given and + * no effect on main clocking. + */ + if (freq) { + for (i = 0; i < ARRAY_SIZE(opclk_divs); i++) + if (opclk_divs[i] == freq) + break; + if (i == ARRAY_SIZE(opclk_divs)) + return -EINVAL; + snd_soc_update_bits(codec, WM8994_CLOCKING_2, + WM8994_OPCLK_DIV_MASK, i); + snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_2, + WM8994_OPCLK_ENA, WM8994_OPCLK_ENA); + } else { + snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_2, + WM8994_OPCLK_ENA, 0); + } + default: return -EINVAL; } diff --git a/sound/soc/codecs/wm8994.h b/sound/soc/codecs/wm8994.h index 7072dc539354..2e0ca67a8df7 100644 --- a/sound/soc/codecs/wm8994.h +++ b/sound/soc/codecs/wm8994.h @@ -20,6 +20,9 @@ extern struct snd_soc_dai wm8994_dai[]; #define WM8994_SYSCLK_FLL1 3 #define WM8994_SYSCLK_FLL2 4 +/* OPCLK is also configured with set_dai_sysclk, specify division*10 as rate. */ +#define WM8994_SYSCLK_OPCLK 5 + #define WM8994_FLL1 1 #define WM8994_FLL2 2 -- cgit v1.2.3 From 3507e2a8f171f4322bf78f9d618a4e435de843ce Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Thu, 8 Jul 2010 18:39:00 +0200 Subject: ALSA: hda - Add beep mixer support to Conexant codecs Added the beep mixer controls to Conexant codecs. They simply control the digital beep generator widget. For cx5047, I couldn't find any beep generator, so it's not implemented there. Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_conexant.c | 55 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 54f74191ebca..3b789ee548b4 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -131,6 +131,8 @@ struct conexant_spec { unsigned int dc_enable; unsigned int dc_input_bias; /* offset into cxt5066_olpc_dc_bias */ unsigned int mic_boost; /* offset into cxt5066_analog_mic_boost */ + + unsigned int beep_amp; }; static int conexant_playback_pcm_open(struct hda_pcm_stream *hinfo, @@ -515,6 +517,15 @@ static struct snd_kcontrol_new cxt_capture_mixers[] = { {} }; +#ifdef CONFIG_SND_HDA_INPUT_BEEP +/* additional beep mixers; the actual parameters are overwritten at build */ +static struct snd_kcontrol_new cxt_beep_mixer[] = { + HDA_CODEC_VOLUME_MONO("Beep Playback Volume", 0, 1, 0, HDA_OUTPUT), + HDA_CODEC_MUTE_BEEP_MONO("Beep Playback Switch", 0, 1, 0, HDA_OUTPUT), + { } /* end */ +}; +#endif + static const char *slave_vols[] = { "Headphone Playback Volume", "Speaker Playback Volume", @@ -580,6 +591,23 @@ static int conexant_build_controls(struct hda_codec *codec) return err; } +#ifdef CONFIG_SND_HDA_INPUT_BEEP + /* create beep controls if needed */ + if (spec->beep_amp) { + struct snd_kcontrol_new *knew; + for (knew = cxt_beep_mixer; knew->name; knew++) { + struct snd_kcontrol *kctl; + kctl = snd_ctl_new1(knew, codec); + if (!kctl) + return -ENOMEM; + kctl->private_value = spec->beep_amp; + err = snd_hda_ctl_add(codec, 0, kctl); + if (err < 0) + return err; + } + } +#endif + return 0; } @@ -590,6 +618,13 @@ static struct hda_codec_ops conexant_patch_ops = { .free = conexant_free, }; +#ifdef CONFIG_SND_HDA_INPUT_BEEP +#define set_beep_amp(spec, nid, idx, dir) \ + ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 1, idx, dir)) +#else +#define set_beep_amp(spec, nid, idx, dir) /* NOP */ +#endif + /* * EAPD control * the private value = nid | (invert << 8) @@ -1130,9 +1165,10 @@ static int patch_cxt5045(struct hda_codec *codec) spec->num_init_verbs = 1; spec->init_verbs[0] = cxt5045_init_verbs; spec->spdif_route = 0; - spec->num_channel_mode = ARRAY_SIZE(cxt5045_modes), - spec->channel_mode = cxt5045_modes, + spec->num_channel_mode = ARRAY_SIZE(cxt5045_modes); + spec->channel_mode = cxt5045_modes; + set_beep_amp(spec, 0x16, 0, 1); codec->patch_ops = conexant_patch_ops; @@ -1211,6 +1247,9 @@ static int patch_cxt5045(struct hda_codec *codec) break; } + if (spec->beep_amp) + snd_hda_attach_beep_device(codec, spec->beep_amp); + return 0; } @@ -1987,6 +2026,8 @@ static int patch_cxt5051(struct hda_codec *codec) spec->cur_adc = 0; spec->cur_adc_idx = 0; + set_beep_amp(spec, 0x13, 0, HDA_OUTPUT); + codec->patch_ops.unsol_event = cxt5051_hp_unsol_event; board_config = snd_hda_check_board_config(codec, CXT5051_MODELS, @@ -2021,6 +2062,9 @@ static int patch_cxt5051(struct hda_codec *codec) break; } + if (spec->beep_amp) + snd_hda_attach_beep_device(codec, spec->beep_amp); + return 0; } @@ -2636,7 +2680,6 @@ static struct snd_kcontrol_new cxt5066_vostro_mixers[] = { .put = cxt5066_mic_boost_mux_enum_put, .private_value = 0x23 | 0x100, }, - HDA_CODEC_VOLUME_MONO("Beep Playback Volume", 0x13, 1, 0x0, HDA_OUTPUT), {} }; @@ -3034,6 +3077,8 @@ static int patch_cxt5066(struct hda_codec *codec) spec->cur_adc = 0; spec->cur_adc_idx = 0; + set_beep_amp(spec, 0x13, 0, HDA_OUTPUT); + board_config = snd_hda_check_board_config(codec, CXT5066_MODELS, cxt5066_models, cxt5066_cfg_tbl); switch (board_config) { @@ -3082,7 +3127,6 @@ static int patch_cxt5066(struct hda_codec *codec) spec->port_d_mode = 0; spec->dell_vostro = 1; spec->mic_boost = 3; /* default 30dB gain */ - snd_hda_attach_beep_device(codec, 0x13); /* no S/PDIF out */ spec->multiout.dig_out_nid = 0; @@ -3124,6 +3168,9 @@ static int patch_cxt5066(struct hda_codec *codec) break; } + if (spec->beep_amp) + snd_hda_attach_beep_device(codec, spec->beep_amp); + return 0; } -- cgit v1.2.3 From afbd9b8448f4b7d15673c6858012f384f18d28b8 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Thu, 8 Jul 2010 18:40:37 +0200 Subject: ALSA: hda - Limit the amp value to write Check the amp max value at put callbacks and set the upper limit so that the driver won't write any invalid value over the defined range. Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_codec.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index a3d638c8c1fd..88a1c6acbcbd 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -1539,6 +1539,17 @@ void snd_hda_codec_resume_amp(struct hda_codec *codec) EXPORT_SYMBOL_HDA(snd_hda_codec_resume_amp); #endif /* SND_HDA_NEEDS_RESUME */ +static u32 get_amp_max_value(struct hda_codec *codec, hda_nid_t nid, int dir, + unsigned int ofs) +{ + u32 caps = query_amp_caps(codec, nid, dir); + /* get num steps */ + caps = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT; + if (ofs < caps) + caps -= ofs; + return caps; +} + /** * snd_hda_mixer_amp_volume_info - Info callback for a standard AMP mixer * @@ -1553,23 +1564,17 @@ int snd_hda_mixer_amp_volume_info(struct snd_kcontrol *kcontrol, u8 chs = get_amp_channels(kcontrol); int dir = get_amp_direction(kcontrol); unsigned int ofs = get_amp_offset(kcontrol); - u32 caps; - caps = query_amp_caps(codec, nid, dir); - /* num steps */ - caps = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT; - if (!caps) { + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; + uinfo->count = chs == 3 ? 2 : 1; + uinfo->value.integer.min = 0; + uinfo->value.integer.max = get_amp_max_value(codec, nid, dir, ofs); + if (!uinfo->value.integer.max) { printk(KERN_WARNING "hda_codec: " "num_steps = 0 for NID=0x%x (ctl = %s)\n", nid, kcontrol->id.name); return -EINVAL; } - if (ofs < caps) - caps -= ofs; - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; - uinfo->count = chs == 3 ? 2 : 1; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = caps; return 0; } EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_volume_info); @@ -1594,8 +1599,13 @@ update_amp_value(struct hda_codec *codec, hda_nid_t nid, int ch, int dir, int idx, unsigned int ofs, unsigned int val) { + unsigned int maxval; + if (val > 0) val += ofs; + maxval = get_amp_max_value(codec, nid, dir, ofs); + if (val > maxval) + val = maxval; return snd_hda_codec_amp_update(codec, nid, ch, dir, idx, HDA_AMP_VOLMASK, val); } -- cgit v1.2.3 From d32d552e665dc07384208108165592d0b524dba2 Mon Sep 17 00:00:00 2001 From: Clemens Ladisch Date: Thu, 8 Jul 2010 16:38:01 +0200 Subject: ALSA: usb-audio: silence a superfluous warning It is not advisable to print a warning when a device does not support setting the sample rate because this is perfectly valid for devices with a single rate or where rates are implicitly changed by selecting another alternate setting. Signed-off-by: Clemens Ladisch Signed-off-by: Takashi Iwai --- sound/usb/clock.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/usb/clock.c b/sound/usb/clock.c index 66bd1574d80b..b853f8df794f 100644 --- a/sound/usb/clock.c +++ b/sound/usb/clock.c @@ -204,11 +204,8 @@ static int set_sample_rate_v1(struct snd_usb_audio *chip, int iface, ep = get_endpoint(alts, 0)->bEndpointAddress; /* if endpoint doesn't have sampling rate control, bail out */ - if (!(fmt->attributes & UAC_EP_CS_ATTR_SAMPLE_RATE)) { - snd_printk(KERN_WARNING "%d:%d:%d: endpoint lacks sample rate attribute bit, cannot set.\n", - dev->devnum, iface, fmt->altsetting); + if (!(fmt->attributes & UAC_EP_CS_ATTR_SAMPLE_RATE)) return 0; - } data[0] = rate; data[1] = rate >> 8; -- cgit v1.2.3 From 395c61d19621e80b763810cc988416dc1b6bfd3e Mon Sep 17 00:00:00 2001 From: Clemens Ladisch Date: Mon, 12 Jul 2010 16:27:24 +0200 Subject: ALSA: via82xx: allow changing the initial DXS volume As per-stream volume controls, the DXS controls are not intended to adjust the overall sound level and so are initialized every time a stream is opened. However, there are special situations where one wants to reduce the overall volume in the digital domain, i.e., before the AC'97 codec's PCM volume control. To allow this, add a module parameter that sets the initial DXS volume. Signed-off-by: Clemens Ladisch Tested-by: Soeren D. Schulze Signed-off-by: Takashi Iwai --- sound/pci/via82xx.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c index 7e494b6a1d0e..8c5f8b5a59f0 100644 --- a/sound/pci/via82xx.c +++ b/sound/pci/via82xx.c @@ -85,6 +85,7 @@ static int joystick; static int ac97_clock = 48000; static char *ac97_quirk; static int dxs_support; +static int dxs_init_volume = 31; static int nodelay; module_param(index, int, 0444); @@ -103,6 +104,8 @@ module_param(ac97_quirk, charp, 0444); MODULE_PARM_DESC(ac97_quirk, "AC'97 workaround for strange hardware."); module_param(dxs_support, int, 0444); MODULE_PARM_DESC(dxs_support, "Support for DXS channels (0 = auto, 1 = enable, 2 = disable, 3 = 48k only, 4 = no VRA, 5 = enable any sample rate)"); +module_param(dxs_init_volume, int, 0644); +MODULE_PARM_DESC(dxs_init_volume, "initial DXS volume (0-31)"); module_param(nodelay, int, 0444); MODULE_PARM_DESC(nodelay, "Disable 500ms init delay"); @@ -1245,8 +1248,10 @@ static int snd_via8233_playback_open(struct snd_pcm_substream *substream) return err; stream = viadev->reg_offset / 0x10; if (chip->dxs_controls[stream]) { - chip->playback_volume[stream][0] = 0; - chip->playback_volume[stream][1] = 0; + chip->playback_volume[stream][0] = + VIA_DXS_MAX_VOLUME - (dxs_init_volume & 31); + chip->playback_volume[stream][1] = + VIA_DXS_MAX_VOLUME - (dxs_init_volume & 31); chip->dxs_controls[stream]->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE | -- cgit v1.2.3 From 32e0191d7909022e5016beb75dda6710a28b3c61 Mon Sep 17 00:00:00 2001 From: Clemens Ladisch Date: Mon, 12 Jul 2010 16:28:50 +0200 Subject: ALSA: HDA: VT1708S: fix Smart5.1 mode Correctly configure bidirectional pins when resuming; do not power down widgets when they are needed for Smart5.1 output; and on 3-jack boards, create the streams and controls needed for six channels. Signed-off-by: Clemens Ladisch Reported-and-tested-by: Viliam Kubis Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_via.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 73453814e098..ae3acb2b42d1 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c @@ -552,24 +552,30 @@ static void via_auto_init_hp_out(struct hda_codec *codec) } } +static int is_smart51_pins(struct via_spec *spec, hda_nid_t pin); + static void via_auto_init_analog_input(struct hda_codec *codec) { struct via_spec *spec = codec->spec; + unsigned int ctl; int i; for (i = 0; i < AUTO_PIN_LAST; i++) { hda_nid_t nid = spec->autocfg.input_pins[i]; + if (!nid) + continue; + if (spec->smart51_enabled && is_smart51_pins(spec, nid)) + ctl = PIN_OUT; + else if (i <= AUTO_PIN_FRONT_MIC) + ctl = PIN_VREF50; + else + ctl = PIN_IN; snd_hda_codec_write(codec, nid, 0, - AC_VERB_SET_PIN_WIDGET_CONTROL, - (i <= AUTO_PIN_FRONT_MIC ? - PIN_VREF50 : PIN_IN)); - + AC_VERB_SET_PIN_WIDGET_CONTROL, ctl); } } -static int is_smart51_pins(struct via_spec *spec, hda_nid_t pin); - static void set_pin_power_state(struct hda_codec *codec, hda_nid_t nid, unsigned int *affected_parm) { @@ -658,6 +664,8 @@ static void set_jack_power_state(struct hda_codec *codec) /* PW0 (19h), SW1 (18h), AOW1 (11h) */ parm = AC_PWRST_D3; set_pin_power_state(codec, 0x19, &parm); + if (spec->smart51_enabled) + parm = AC_PWRST_D0; snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm); snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, @@ -667,6 +675,8 @@ static void set_jack_power_state(struct hda_codec *codec) if (is_8ch) { parm = AC_PWRST_D3; set_pin_power_state(codec, 0x22, &parm); + if (spec->smart51_enabled) + parm = AC_PWRST_D0; snd_hda_codec_write(codec, 0x26, 0, AC_VERB_SET_POWER_STATE, parm); snd_hda_codec_write(codec, 0x24, 0, @@ -3915,6 +3925,13 @@ static int vt1708S_auto_fill_dac_nids(struct via_spec *spec, } } + /* for Smart 5.1, line/mic inputs double as output pins */ + if (cfg->line_outs == 1) { + spec->multiout.num_dacs = 3; + spec->multiout.dac_nids[AUTO_SEQ_SURROUND] = 0x11; + spec->multiout.dac_nids[AUTO_SEQ_CENLFE] = 0x24; + } + return 0; } @@ -3932,7 +3949,8 @@ static int vt1708S_auto_create_multi_out_ctls(struct via_spec *spec, for (i = 0; i <= AUTO_SEQ_SIDE; i++) { nid = cfg->line_out_pins[i]; - if (!nid) + /* for Smart 5.1, there are always at least six channels */ + if (!nid && i > AUTO_SEQ_CENLFE) continue; nid_vol = nid_vols[i]; -- cgit v1.2.3 From 90dc763fef4c869e60b2a7ad92e1a7dab68575ea Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Sun, 11 Jul 2010 12:16:36 +0200 Subject: sound: push BKL into open functions This moves the lock_kernel() call from soundcore_open to the individual OSS device drivers, where we can deal with it one driver at a time if needed, or just kill off the drivers. All core components in ALSA already provide adequate locking in their open()-functions and do not require the big kernel lock, so there is no need to add the BKL there. Signed-off-by: Arnd Bergmann Signed-off-by: Takashi Iwai --- sound/oss/au1550_ac97.c | 26 +++++++++++++++++--------- sound/oss/dmasound/dmasound_core.c | 28 ++++++++++++++++++++++------ sound/oss/msnd_pinnacle.c | 10 +++++++--- sound/oss/sh_dac_audio.c | 9 +++++++-- sound/oss/soundcard.c | 20 +++++++++++--------- sound/oss/swarm_cs4297a.c | 17 ++++++++++++++++- sound/oss/vwsnd.c | 8 ++++++++ sound/sound_core.c | 6 +----- 8 files changed, 89 insertions(+), 35 deletions(-) (limited to 'sound') diff --git a/sound/oss/au1550_ac97.c b/sound/oss/au1550_ac97.c index c1070e33b32f..fb913e568de1 100644 --- a/sound/oss/au1550_ac97.c +++ b/sound/oss/au1550_ac97.c @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -807,7 +808,9 @@ au1550_llseek(struct file *file, loff_t offset, int origin) static int au1550_open_mixdev(struct inode *inode, struct file *file) { + lock_kernel(); file->private_data = &au1550_state; + unlock_kernel(); return 0; } @@ -1797,21 +1800,22 @@ au1550_open(struct inode *inode, struct file *file) #endif file->private_data = s; + lock_kernel(); /* wait for device to become free */ mutex_lock(&s->open_mutex); while (s->open_mode & file->f_mode) { - if (file->f_flags & O_NONBLOCK) { - mutex_unlock(&s->open_mutex); - return -EBUSY; - } + ret = -EBUSY; + if (file->f_flags & O_NONBLOCK) + goto out; add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); mutex_unlock(&s->open_mutex); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); + ret = -ERESTARTSYS; if (signal_pending(current)) - return -ERESTARTSYS; + goto out2; mutex_lock(&s->open_mutex); } @@ -1840,17 +1844,21 @@ au1550_open(struct inode *inode, struct file *file) if (file->f_mode & FMODE_READ) { if ((ret = prog_dmabuf_adc(s))) - return ret; + goto out; } if (file->f_mode & FMODE_WRITE) { if ((ret = prog_dmabuf_dac(s))) - return ret; + goto out; } s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); - mutex_unlock(&s->open_mutex); mutex_init(&s->sem); - return 0; + ret = 0; +out: + mutex_unlock(&s->open_mutex); +out2: + unlock_kernel(); + return ret; } static int diff --git a/sound/oss/dmasound/dmasound_core.c b/sound/oss/dmasound/dmasound_core.c index 3f3c3f71db4b..5a4f38c0f480 100644 --- a/sound/oss/dmasound/dmasound_core.c +++ b/sound/oss/dmasound/dmasound_core.c @@ -323,9 +323,13 @@ static struct { static int mixer_open(struct inode *inode, struct file *file) { - if (!try_module_get(dmasound.mach.owner)) + lock_kernel(); + if (!try_module_get(dmasound.mach.owner)) { + unlock_kernel(); return -ENODEV; + } mixer.busy = 1; + unlock_kernel(); return 0; } @@ -737,8 +741,11 @@ static int sq_open(struct inode *inode, struct file *file) { int rc; - if (!try_module_get(dmasound.mach.owner)) + lock_kernel(); + if (!try_module_get(dmasound.mach.owner)) { + unlock_kernel(); return -ENODEV; + } rc = write_sq_open(file); /* checks the f_mode */ if (rc) @@ -781,10 +788,11 @@ static int sq_open(struct inode *inode, struct file *file) sound_set_format(AFMT_MU_LAW); } #endif - + unlock_kernel(); return 0; out: module_put(dmasound.mach.owner); + unlock_kernel(); return rc; } @@ -1226,12 +1234,17 @@ static int state_open(struct inode *inode, struct file *file) { char *buffer = state.buf; int len = 0; + int ret; + lock_kernel(); + ret = -EBUSY; if (state.busy) - return -EBUSY; + goto out; + ret = -ENODEV; if (!try_module_get(dmasound.mach.owner)) - return -ENODEV; + goto out; + state.ptr = 0; state.busy = 1; @@ -1293,7 +1306,10 @@ printk("dmasound: stat buffer used %d bytes\n", len) ; printk(KERN_ERR "dmasound_core: stat buffer overflowed!\n"); state.len = len; - return 0; + ret = 0; +out: + unlock_kernel(); + return ret; } static int state_release(struct inode *inode, struct file *file) diff --git a/sound/oss/msnd_pinnacle.c b/sound/oss/msnd_pinnacle.c index a1e3f9671bea..153d822bf9a3 100644 --- a/sound/oss/msnd_pinnacle.c +++ b/sound/oss/msnd_pinnacle.c @@ -756,12 +756,15 @@ static int dev_open(struct inode *inode, struct file *file) int minor = iminor(inode); int err = 0; + lock_kernel(); if (minor == dev.dsp_minor) { if ((file->f_mode & FMODE_WRITE && test_bit(F_AUDIO_WRITE_INUSE, &dev.flags)) || (file->f_mode & FMODE_READ && - test_bit(F_AUDIO_READ_INUSE, &dev.flags))) - return -EBUSY; + test_bit(F_AUDIO_READ_INUSE, &dev.flags))) { + err = -EBUSY; + goto out; + } if ((err = dsp_open(file)) >= 0) { dev.nresets = 0; @@ -782,7 +785,8 @@ static int dev_open(struct inode *inode, struct file *file) /* nothing */ } else err = -EINVAL; - +out: + unlock_kernel(); return err; } diff --git a/sound/oss/sh_dac_audio.c b/sound/oss/sh_dac_audio.c index 4153752507e3..8f0be4053a5a 100644 --- a/sound/oss/sh_dac_audio.c +++ b/sound/oss/sh_dac_audio.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -216,13 +217,17 @@ static int dac_audio_open(struct inode *inode, struct file *file) { if (file->f_mode & FMODE_READ) return -ENODEV; - if (in_use) + + lock_kernel(); + if (in_use) { + unlock_kernel(); return -EBUSY; + } in_use = 1; dac_audio_start(); - + unlock_kernel(); return 0; } diff --git a/sound/oss/soundcard.c b/sound/oss/soundcard.c index 2d9c51312622..92aa762ffb7e 100644 --- a/sound/oss/soundcard.c +++ b/sound/oss/soundcard.c @@ -210,42 +210,44 @@ static int sound_open(struct inode *inode, struct file *file) printk(KERN_ERR "Invalid minor device %d\n", dev); return -ENXIO; } + lock_kernel(); switch (dev & 0x0f) { case SND_DEV_CTL: dev >>= 4; if (dev >= 0 && dev < MAX_MIXER_DEV && mixer_devs[dev] == NULL) { request_module("mixer%d", dev); } + retval = -ENXIO; if (dev && (dev >= num_mixers || mixer_devs[dev] == NULL)) - return -ENXIO; + break; if (!try_module_get(mixer_devs[dev]->owner)) - return -ENXIO; + break; + + retval = 0; break; case SND_DEV_SEQ: case SND_DEV_SEQ2: - if ((retval = sequencer_open(dev, file)) < 0) - return retval; + retval = sequencer_open(dev, file); break; case SND_DEV_MIDIN: - if ((retval = MIDIbuf_open(dev, file)) < 0) - return retval; + retval = MIDIbuf_open(dev, file); break; case SND_DEV_DSP: case SND_DEV_DSP16: case SND_DEV_AUDIO: - if ((retval = audio_open(dev, file)) < 0) - return retval; + retval = audio_open(dev, file); break; default: printk(KERN_ERR "Invalid minor device %d\n", dev); - return -ENXIO; + retval = -ENXIO; } + unlock_kernel(); return 0; } diff --git a/sound/oss/swarm_cs4297a.c b/sound/oss/swarm_cs4297a.c index 3136c88eacdf..34b0838793a6 100644 --- a/sound/oss/swarm_cs4297a.c +++ b/sound/oss/swarm_cs4297a.c @@ -68,6 +68,7 @@ #include #include #include +#include #include #include #include @@ -1534,6 +1535,7 @@ static int cs4297a_open_mixdev(struct inode *inode, struct file *file) CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4, printk(KERN_INFO "cs4297a: cs4297a_open_mixdev()+\n")); + lock_kernel(); list_for_each(entry, &cs4297a_devs) { s = list_entry(entry, struct cs4297a_state, list); @@ -1544,6 +1546,8 @@ static int cs4297a_open_mixdev(struct inode *inode, struct file *file) { CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2, printk(KERN_INFO "cs4297a: cs4297a_open_mixdev()- -ENODEV\n")); + + unlock_kernel(); return -ENODEV; } VALIDATE_STATE(s); @@ -1551,6 +1555,7 @@ static int cs4297a_open_mixdev(struct inode *inode, struct file *file) CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4, printk(KERN_INFO "cs4297a: cs4297a_open_mixdev()- 0\n")); + unlock_kernel(); return nonseekable_open(inode, file); } @@ -2369,7 +2374,7 @@ static int cs4297a_release(struct inode *inode, struct file *file) return 0; } -static int cs4297a_open(struct inode *inode, struct file *file) +static int cs4297a_locked_open(struct inode *inode, struct file *file) { int minor = iminor(inode); struct cs4297a_state *s=NULL; @@ -2486,6 +2491,16 @@ static int cs4297a_open(struct inode *inode, struct file *file) return nonseekable_open(inode, file); } +static int cs4297a_open(struct inode *inode, struct file *file) +{ + int ret; + + lock_kernel(); + ret = cs4297a_open(inode, file); + unlock_kernel(); + + return ret; +} // ****************************************************************************************** // Wave (audio) file operations struct. diff --git a/sound/oss/vwsnd.c b/sound/oss/vwsnd.c index 20b3b325aa80..99c94c48558c 100644 --- a/sound/oss/vwsnd.c +++ b/sound/oss/vwsnd.c @@ -2921,6 +2921,7 @@ static int vwsnd_audio_open(struct inode *inode, struct file *file) DBGE("(inode=0x%p, file=0x%p)\n", inode, file); + lock_kernel(); INC_USE_COUNT; for (devc = vwsnd_dev_list; devc; devc = devc->next_dev) if ((devc->audio_minor & ~0x0F) == (minor & ~0x0F)) @@ -2928,6 +2929,7 @@ static int vwsnd_audio_open(struct inode *inode, struct file *file) if (devc == NULL) { DEC_USE_COUNT; + unlock_kernel(); return -ENODEV; } @@ -2936,11 +2938,13 @@ static int vwsnd_audio_open(struct inode *inode, struct file *file) mutex_unlock(&devc->open_mutex); if (file->f_flags & O_NONBLOCK) { DEC_USE_COUNT; + unlock_kernel(); return -EBUSY; } interruptible_sleep_on(&devc->open_wait); if (signal_pending(current)) { DEC_USE_COUNT; + unlock_kernel(); return -ERESTARTSYS; } mutex_lock(&devc->open_mutex); @@ -2993,6 +2997,7 @@ static int vwsnd_audio_open(struct inode *inode, struct file *file) file->private_data = devc; DBGRV(); + unlock_kernel(); return 0; } @@ -3062,15 +3067,18 @@ static int vwsnd_mixer_open(struct inode *inode, struct file *file) DBGEV("(inode=0x%p, file=0x%p)\n", inode, file); INC_USE_COUNT; + lock_kernel(); for (devc = vwsnd_dev_list; devc; devc = devc->next_dev) if (devc->mixer_minor == iminor(inode)) break; if (devc == NULL) { DEC_USE_COUNT; + unlock_kernel(); return -ENODEV; } file->private_data = devc; + unlock_kernel(); return 0; } diff --git a/sound/sound_core.c b/sound/sound_core.c index c8627fcd4900..cb61317df509 100644 --- a/sound/sound_core.c +++ b/sound/sound_core.c @@ -629,12 +629,8 @@ static int soundcore_open(struct inode *inode, struct file *file) file->f_op = new_fops; spin_unlock(&sound_loader_lock); - if (file->f_op->open) { - /* TODO: push down BKL into indivial open functions */ - lock_kernel(); + if (file->f_op->open) err = file->f_op->open(inode,file); - unlock_kernel(); - } if (err) { fops_put(file->f_op); -- cgit v1.2.3 From a7ce2e0d04b1a6ee8056e7fea5ea96566d33a6f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Mon, 12 Jul 2010 17:15:44 +0200 Subject: fix comnment/printk typos concerning "empty" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Uwe Kleine-König Signed-off-by: Jiri Kosina --- sound/usb/pcm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index 456829882f40..3634cedf9306 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -636,7 +636,7 @@ static int hw_rule_period_time(struct snd_pcm_hw_params *params, min_datainterval = min(min_datainterval, fp->datainterval); } if (min_datainterval == 0xff) { - hwc_debug(" --> get emtpy\n"); + hwc_debug(" --> get empty\n"); it->empty = 1; return -EINVAL; } -- cgit v1.2.3 From d209974cdc36aeeef406fa2019e9e1dacecbb979 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Mon, 12 Jul 2010 19:53:18 +0200 Subject: sound/oss: convert to unlocked_ioctl These are the final conversions for the ioctl file operation so we can remove it in the next merge window. Signed-off-by: Arnd Bergmann Signed-off-by: Takashi Iwai --- sound/oss/au1550_ac97.c | 54 ++++++++++++++++++++++++-------------- sound/oss/dmasound/dmasound_core.c | 35 +++++++++++++++++++----- sound/oss/msnd_pinnacle.c | 15 +++++++---- sound/oss/sh_dac_audio.c | 18 ++++++++++--- sound/oss/swarm_cs4297a.c | 24 +++++++++++++---- sound/oss/vwsnd.c | 24 +++++++++-------- 6 files changed, 119 insertions(+), 51 deletions(-) (limited to 'sound') diff --git a/sound/oss/au1550_ac97.c b/sound/oss/au1550_ac97.c index fb913e568de1..0fd256ceea6b 100644 --- a/sound/oss/au1550_ac97.c +++ b/sound/oss/au1550_ac97.c @@ -827,22 +827,26 @@ mixdev_ioctl(struct ac97_codec *codec, unsigned int cmd, return codec->mixer_ioctl(codec, cmd, arg); } -static int -au1550_ioctl_mixdev(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) +static long +au1550_ioctl_mixdev(struct file *file, unsigned int cmd, unsigned long arg) { struct au1550_state *s = (struct au1550_state *)file->private_data; struct ac97_codec *codec = s->codec; + int ret; + + lock_kernel(); + ret = mixdev_ioctl(codec, cmd, arg); + unlock_kernel(); - return mixdev_ioctl(codec, cmd, arg); + return ret; } static /*const */ struct file_operations au1550_mixer_fops = { - owner:THIS_MODULE, - llseek:au1550_llseek, - ioctl:au1550_ioctl_mixdev, - open:au1550_open_mixdev, - release:au1550_release_mixdev, + .owner = THIS_MODULE, + .llseek = au1550_llseek, + .unlocked_ioctl = au1550_ioctl_mixdev, + .open = au1550_open_mixdev, + .release = au1550_release_mixdev, }; static int @@ -1346,8 +1350,7 @@ dma_count_done(struct dmabuf *db) static int -au1550_ioctl(struct inode *inode, struct file *file, unsigned int cmd, - unsigned long arg) +au1550_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct au1550_state *s = (struct au1550_state *)file->private_data; unsigned long flags; @@ -1783,6 +1786,17 @@ au1550_ioctl(struct inode *inode, struct file *file, unsigned int cmd, return mixdev_ioctl(s->codec, cmd, arg); } +static long +au1550_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int ret; + + lock_kernel(); + ret = au1550_ioctl(file, cmd, arg); + unlock_kernel(); + + return ret; +} static int au1550_open(struct inode *inode, struct file *file) @@ -1893,15 +1907,15 @@ au1550_release(struct inode *inode, struct file *file) } static /*const */ struct file_operations au1550_audio_fops = { - owner: THIS_MODULE, - llseek: au1550_llseek, - read: au1550_read, - write: au1550_write, - poll: au1550_poll, - ioctl: au1550_ioctl, - mmap: au1550_mmap, - open: au1550_open, - release: au1550_release, + .owner = THIS_MODULE, + .llseek = au1550_llseek, + .read = au1550_read, + .write = au1550_write, + .poll = au1550_poll, + .unlocked_ioctl = au1550_unlocked_ioctl, + .mmap = au1550_mmap, + .open = au1550_open, + .release = au1550_release, }; MODULE_AUTHOR("Advanced Micro Devices (AMD), dan@embeddededge.com"); diff --git a/sound/oss/dmasound/dmasound_core.c b/sound/oss/dmasound/dmasound_core.c index 5a4f38c0f480..6ecd41abb066 100644 --- a/sound/oss/dmasound/dmasound_core.c +++ b/sound/oss/dmasound/dmasound_core.c @@ -341,8 +341,8 @@ static int mixer_release(struct inode *inode, struct file *file) unlock_kernel(); return 0; } -static int mixer_ioctl(struct inode *inode, struct file *file, u_int cmd, - u_long arg) + +static int mixer_ioctl(struct file *file, u_int cmd, u_long arg) { if (_SIOC_DIR(cmd) & _SIOC_WRITE) mixer.modify_counter++; @@ -366,11 +366,22 @@ static int mixer_ioctl(struct inode *inode, struct file *file, u_int cmd, return -EINVAL; } +static long mixer_unlocked_ioctl(struct file *file, u_int cmd, u_long arg) +{ + int ret; + + lock_kernel(); + ret = mixer_ioctl(file, cmd, arg); + unlock_kernel(); + + return ret; +} + static const struct file_operations mixer_fops = { .owner = THIS_MODULE, .llseek = no_llseek, - .ioctl = mixer_ioctl, + .unlocked_ioctl = mixer_unlocked_ioctl, .open = mixer_open, .release = mixer_release, }; @@ -963,8 +974,7 @@ printk("dmasound_core: tried to set_queue_frags on a locked queue\n") ; return 0 ; } -static int sq_ioctl(struct inode *inode, struct file *file, u_int cmd, - u_long arg) +static int sq_ioctl(struct file *file, u_int cmd, u_long arg) { int val, result; u_long fmt; @@ -1122,18 +1132,29 @@ static int sq_ioctl(struct inode *inode, struct file *file, u_int cmd, return IOCTL_OUT(arg,val); default: - return mixer_ioctl(inode, file, cmd, arg); + return mixer_ioctl(file, cmd, arg); } return -EINVAL; } +static long sq_unlocked_ioctl(struct file *file, u_int cmd, u_long arg) +{ + int ret; + + lock_kernel(); + ret = sq_ioctl(file, cmd, arg); + unlock_kernel(); + + return ret; +} + static const struct file_operations sq_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = sq_write, .poll = sq_poll, - .ioctl = sq_ioctl, + .unlocked_ioctl = sq_unlocked_ioctl, .open = sq_open, .release = sq_release, }; diff --git a/sound/oss/msnd_pinnacle.c b/sound/oss/msnd_pinnacle.c index 153d822bf9a3..9ffd29f32aa5 100644 --- a/sound/oss/msnd_pinnacle.c +++ b/sound/oss/msnd_pinnacle.c @@ -639,21 +639,26 @@ static int mixer_ioctl(unsigned int cmd, unsigned long arg) return -EINVAL; } -static int dev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) +static long dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int minor = iminor(inode); + int ret; if (cmd == OSS_GETVERSION) { int sound_version = SOUND_VERSION; return put_user(sound_version, (int __user *)arg); } + ret = -EINVAL; + + lock_kernel(); if (minor == dev.dsp_minor) - return dsp_ioctl(file, cmd, arg); + ret = dsp_ioctl(file, cmd, arg); else if (minor == dev.mixer_minor) - return mixer_ioctl(cmd, arg); + ret = mixer_ioctl(cmd, arg); + unlock_kernel(); - return -EINVAL; + return ret; } static void dsp_write_flush(void) @@ -1109,7 +1114,7 @@ static const struct file_operations dev_fileops = { .owner = THIS_MODULE, .read = dev_read, .write = dev_write, - .ioctl = dev_ioctl, + .unlocked_ioctl = dev_ioctl, .open = dev_open, .release = dev_release, }; diff --git a/sound/oss/sh_dac_audio.c b/sound/oss/sh_dac_audio.c index 8f0be4053a5a..fdb58eb83d4e 100644 --- a/sound/oss/sh_dac_audio.c +++ b/sound/oss/sh_dac_audio.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -93,7 +94,7 @@ static void dac_audio_set_rate(void) wakeups_per_second = ktime_set(0, 1000000000 / rate); } -static int dac_audio_ioctl(struct inode *inode, struct file *file, +static int dac_audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int val; @@ -159,6 +160,17 @@ static int dac_audio_ioctl(struct inode *inode, struct file *file, return -EINVAL; } +static long dac_audio_unlocked_ioctl(struct file *file, u_int cmd, u_long arg) +{ + int ret; + + lock_kernel(); + ret = dac_audio_ioctl(file, cmd, arg); + unlock_kernel(); + + return ret; +} + static ssize_t dac_audio_write(struct file *file, const char *buf, size_t count, loff_t * ppos) { @@ -242,8 +254,8 @@ static int dac_audio_release(struct inode *inode, struct file *file) const struct file_operations dac_audio_fops = { .read = dac_audio_read, - .write = dac_audio_write, - .ioctl = dac_audio_ioctl, + .write = dac_audio_write, + .unlocked_ioctl = dac_audio_unlocked_ioctl, .open = dac_audio_open, .release = dac_audio_release, }; diff --git a/sound/oss/swarm_cs4297a.c b/sound/oss/swarm_cs4297a.c index 34b0838793a6..b15840ad2527 100644 --- a/sound/oss/swarm_cs4297a.c +++ b/sound/oss/swarm_cs4297a.c @@ -1571,11 +1571,15 @@ static int cs4297a_release_mixdev(struct inode *inode, struct file *file) } -static int cs4297a_ioctl_mixdev(struct inode *inode, struct file *file, +static int cs4297a_ioctl_mixdev(struct file *file, unsigned int cmd, unsigned long arg) { - return mixer_ioctl((struct cs4297a_state *) file->private_data, cmd, + int ret; + lock_kernel(); + ret = mixer_ioctl((struct cs4297a_state *) file->private_data, cmd, arg); + unlock_kernel(); + return ret; } @@ -1585,7 +1589,7 @@ static int cs4297a_ioctl_mixdev(struct inode *inode, struct file *file, static const struct file_operations cs4297a_mixer_fops = { .owner = THIS_MODULE, .llseek = no_llseek, - .ioctl = cs4297a_ioctl_mixdev, + .unlocked_ioctl = cs4297a_ioctl_mixdev, .open = cs4297a_open_mixdev, .release = cs4297a_release_mixdev, }; @@ -1949,7 +1953,7 @@ static int cs4297a_mmap(struct file *file, struct vm_area_struct *vma) } -static int cs4297a_ioctl(struct inode *inode, struct file *file, +static int cs4297a_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct cs4297a_state *s = @@ -2342,6 +2346,16 @@ static int cs4297a_ioctl(struct inode *inode, struct file *file, return mixer_ioctl(s, cmd, arg); } +static long cs4297a_unlocked_ioctl(struct file *file, u_int cmd, u_long arg) +{ + int ret; + + lock_kernel(); + ret = cs4297a_ioctl(file, cmd, arg); + unlock_kernel(); + + return ret; +} static int cs4297a_release(struct inode *inode, struct file *file) { @@ -2511,7 +2525,7 @@ static const struct file_operations cs4297a_audio_fops = { .read = cs4297a_read, .write = cs4297a_write, .poll = cs4297a_poll, - .ioctl = cs4297a_ioctl, + .unlocked_ioctl = cs4297a_unlocked_ioctl, .mmap = cs4297a_mmap, .open = cs4297a_open, .release = cs4297a_release, diff --git a/sound/oss/vwsnd.c b/sound/oss/vwsnd.c index 99c94c48558c..8cd73cdd88af 100644 --- a/sound/oss/vwsnd.c +++ b/sound/oss/vwsnd.c @@ -2429,8 +2429,7 @@ static unsigned int vwsnd_audio_poll(struct file *file, return mask; } -static int vwsnd_audio_do_ioctl(struct inode *inode, - struct file *file, +static int vwsnd_audio_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { @@ -2446,8 +2445,8 @@ static int vwsnd_audio_do_ioctl(struct inode *inode, int ival; - DBGEV("(inode=0x%p, file=0x%p, cmd=0x%x, arg=0x%lx)\n", - inode, file, cmd, arg); + DBGEV("(file=0x%p, cmd=0x%x, arg=0x%lx)\n", + file, cmd, arg); switch (cmd) { case OSS_GETVERSION: /* _SIOR ('M', 118, int) */ DBGX("OSS_GETVERSION\n"); @@ -2885,17 +2884,19 @@ static int vwsnd_audio_do_ioctl(struct inode *inode, return -EINVAL; } -static int vwsnd_audio_ioctl(struct inode *inode, - struct file *file, +static long vwsnd_audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { vwsnd_dev_t *devc = (vwsnd_dev_t *) file->private_data; int ret; + lock_kernel(); mutex_lock(&devc->io_mutex); - ret = vwsnd_audio_do_ioctl(inode, file, cmd, arg); + ret = vwsnd_audio_do_ioctl(file, cmd, arg); mutex_unlock(&devc->io_mutex); + unlock_kernel(); + return ret; } @@ -3049,7 +3050,7 @@ static const struct file_operations vwsnd_audio_fops = { .read = vwsnd_audio_read, .write = vwsnd_audio_write, .poll = vwsnd_audio_poll, - .ioctl = vwsnd_audio_ioctl, + .unlocked_ioctl = vwsnd_audio_ioctl, .mmap = vwsnd_audio_mmap, .open = vwsnd_audio_open, .release = vwsnd_audio_release, @@ -3211,8 +3212,7 @@ static int mixer_write_ioctl(vwsnd_dev_t *devc, unsigned int nr, void __user *ar /* This is the ioctl entry to the mixer driver. */ -static int vwsnd_mixer_ioctl(struct inode *ioctl, - struct file *file, +static long vwsnd_mixer_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { @@ -3223,6 +3223,7 @@ static int vwsnd_mixer_ioctl(struct inode *ioctl, DBGEV("(devc=0x%p, cmd=0x%x, arg=0x%lx)\n", devc, cmd, arg); + lock_kernel(); mutex_lock(&devc->mix_mutex); { if ((cmd & ~nrmask) == MIXER_READ(0)) @@ -3233,13 +3234,14 @@ static int vwsnd_mixer_ioctl(struct inode *ioctl, retval = -EINVAL; } mutex_unlock(&devc->mix_mutex); + unlock_kernel(); return retval; } static const struct file_operations vwsnd_mixer_fops = { .owner = THIS_MODULE, .llseek = no_llseek, - .ioctl = vwsnd_mixer_ioctl, + .unlocked_ioctl = vwsnd_mixer_ioctl, .open = vwsnd_mixer_open, .release = vwsnd_mixer_release, }; -- cgit v1.2.3 From 8b0d31532e2351db920871b8835425bf1e34de38 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Mon, 12 Jul 2010 11:50:06 +0300 Subject: ASoC: TWL4030: Fix for digital loopback gain range When the gain is configured using dB value it was not possible to use -24dB since the loopback got muted instead of -24dB. Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl4030.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index 8d36bfa20552..d7f0048273c1 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -540,10 +540,11 @@ static const struct snd_kcontrol_new twl4030_dapm_abypassl2_control = static const struct snd_kcontrol_new twl4030_dapm_abypassv_control = SOC_DAPM_SINGLE("Switch", TWL4030_REG_VDL_APGA_CTL, 2, 1, 0); -/* Digital bypass gain, 0 mutes the bypass */ +/* Digital bypass gain, mute instead of -30dB */ static const unsigned int twl4030_dapm_dbypass_tlv[] = { - TLV_DB_RANGE_HEAD(2), - 0, 3, TLV_DB_SCALE_ITEM(-2400, 0, 1), + TLV_DB_RANGE_HEAD(3), + 0, 1, TLV_DB_SCALE_ITEM(-3000, 600, 1), + 2, 3, TLV_DB_SCALE_ITEM(-2400, 0, 0), 4, 7, TLV_DB_SCALE_ITEM(-1800, 600, 0), }; -- cgit v1.2.3 From 27eeb1feed5c85877f39ff05f6fde0b538b8b9fc Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Tue, 13 Jul 2010 12:07:44 +0300 Subject: ASoC: TWL4030: DAC power optimization Restructure the DAPM connections in order to enable only the needed DAC (out of four in twl4030 series). I need to keep the 'AIF Enable' supply connected to the L2/R2 digital path, since the digital loopback needs AIF and APLL running. If no valid route available, than none of the DAC will be powered, but the AIF and APLL is going to be enabled. Furthermore, if only one audio path have valid route, than only the corresponding DAC will be powered. Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl4030.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index d7f0048273c1..6fd6d0b10555 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -1460,8 +1460,11 @@ static const struct snd_soc_dapm_route intercon[] = { /* Supply for the digital part (APLL) */ {"Digital Voice Playback Mixer", NULL, "APLL Enable"}, - {"Digital R1 Playback Mixer", NULL, "AIF Enable"}, - {"Digital L1 Playback Mixer", NULL, "AIF Enable"}, + {"DAC Left1", NULL, "AIF Enable"}, + {"DAC Right1", NULL, "AIF Enable"}, + {"DAC Left2", NULL, "AIF Enable"}, + {"DAC Right1", NULL, "AIF Enable"}, + {"Digital R2 Playback Mixer", NULL, "AIF Enable"}, {"Digital L2 Playback Mixer", NULL, "AIF Enable"}, @@ -1532,10 +1535,10 @@ static const struct snd_soc_dapm_route intercon[] = { /* outputs */ /* Must be always connected (for AIF and APLL) */ - {"Virtual HiFi OUT", NULL, "Digital L1 Playback Mixer"}, - {"Virtual HiFi OUT", NULL, "Digital R1 Playback Mixer"}, - {"Virtual HiFi OUT", NULL, "Digital L2 Playback Mixer"}, - {"Virtual HiFi OUT", NULL, "Digital R2 Playback Mixer"}, + {"Virtual HiFi OUT", NULL, "DAC Left1"}, + {"Virtual HiFi OUT", NULL, "DAC Right1"}, + {"Virtual HiFi OUT", NULL, "DAC Left2"}, + {"Virtual HiFi OUT", NULL, "DAC Right2"}, /* Must be always connected (for APLL) */ {"Virtual Voice OUT", NULL, "Digital Voice Playback Mixer"}, /* Physical outputs */ -- cgit v1.2.3 From 8ff23610a6c2ec8abaab6ae14d9ed8f59c1f944c Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Mon, 12 Jul 2010 13:50:26 -0700 Subject: ASoC: Remove unnecessary casts of private_data Signed-off-by: Joe Perches Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/blackfin/bf5xx-ac97.c | 6 ++---- sound/soc/blackfin/bf5xx-tdm.c | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) (limited to 'sound') diff --git a/sound/soc/blackfin/bf5xx-ac97.c b/sound/soc/blackfin/bf5xx-ac97.c index 523b7fc33f4e..c0eba5109980 100644 --- a/sound/soc/blackfin/bf5xx-ac97.c +++ b/sound/soc/blackfin/bf5xx-ac97.c @@ -255,8 +255,7 @@ EXPORT_SYMBOL_GPL(soc_ac97_ops); #ifdef CONFIG_PM static int bf5xx_ac97_suspend(struct snd_soc_dai *dai) { - struct sport_device *sport = - (struct sport_device *)dai->private_data; + struct sport_device *sport = dai->private_data; pr_debug("%s : sport %d\n", __func__, dai->id); if (!dai->active) @@ -271,8 +270,7 @@ static int bf5xx_ac97_suspend(struct snd_soc_dai *dai) static int bf5xx_ac97_resume(struct snd_soc_dai *dai) { int ret; - struct sport_device *sport = - (struct sport_device *)dai->private_data; + struct sport_device *sport = dai->private_data; pr_debug("%s : sport %d\n", __func__, dai->id); if (!dai->active) diff --git a/sound/soc/blackfin/bf5xx-tdm.c b/sound/soc/blackfin/bf5xx-tdm.c index 4b360124083e..24c14269f4bc 100644 --- a/sound/soc/blackfin/bf5xx-tdm.c +++ b/sound/soc/blackfin/bf5xx-tdm.c @@ -210,8 +210,7 @@ static int bf5xx_tdm_set_channel_map(struct snd_soc_dai *dai, #ifdef CONFIG_PM static int bf5xx_tdm_suspend(struct snd_soc_dai *dai) { - struct sport_device *sport = - (struct sport_device *)dai->private_data; + struct sport_device *sport = dai->private_data; if (!dai->active) return 0; @@ -225,8 +224,7 @@ static int bf5xx_tdm_suspend(struct snd_soc_dai *dai) static int bf5xx_tdm_resume(struct snd_soc_dai *dai) { int ret; - struct sport_device *sport = - (struct sport_device *)dai->private_data; + struct sport_device *sport = dai->private_data; if (!dai->active) return 0; -- cgit v1.2.3 From 4726a57b8c1ba398399fe69b56dc97c196ab4f6b Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Mon, 12 Jul 2010 13:50:27 -0700 Subject: ASoC: Remove unnecessary casts of private_data Signed-off-by: Joe Perches Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/davinci/davinci-pcm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/davinci/davinci-pcm.c b/sound/soc/davinci/davinci-pcm.c index 2dc406f42fe7..def454e42fcb 100644 --- a/sound/soc/davinci/davinci-pcm.c +++ b/sound/soc/davinci/davinci-pcm.c @@ -800,7 +800,7 @@ static void davinci_pcm_free(struct snd_pcm *pcm) dma_free_writecombine(pcm->card->dev, buf->bytes, buf->area, buf->addr); buf->area = NULL; - iram_dma = (struct snd_dma_buffer *)buf->private_data; + iram_dma = buf->private_data; if (iram_dma) { sram_free(iram_dma->area, iram_dma->bytes); kfree(iram_dma); -- cgit v1.2.3 From a09370cb8c8144744cef4d8cc993472f6f8edcb7 Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Tue, 13 Jul 2010 12:12:53 +0900 Subject: ASoC: fsi: remove un-used variable on fsi_dai_startup Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/sh/fsi.c | 7 ------- 1 file changed, 7 deletions(-) (limited to 'sound') diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index b1cd859723c0..55a03db6daaf 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c @@ -653,7 +653,6 @@ static int fsi_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct fsi_priv *fsi = fsi_get_priv(substream); - const char *msg; u32 flags = fsi_get_info_flags(fsi); u32 fmt; u32 reg; @@ -691,33 +690,27 @@ static int fsi_dai_startup(struct snd_pcm_substream *substream, fmt = is_play ? SH_FSI_GET_OFMT(flags) : SH_FSI_GET_IFMT(flags); switch (fmt) { case SH_FSI_FMT_MONO: - msg = "MONO"; data = CR_FMT(CR_MONO); fsi->chan = 1; break; case SH_FSI_FMT_MONO_DELAY: - msg = "MONO Delay"; data = CR_FMT(CR_MONO_D); fsi->chan = 1; break; case SH_FSI_FMT_PCM: - msg = "PCM"; data = CR_FMT(CR_PCM); fsi->chan = 2; break; case SH_FSI_FMT_I2S: - msg = "I2S"; data = CR_FMT(CR_I2S); fsi->chan = 2; break; case SH_FSI_FMT_TDM: - msg = "TDM"; fsi->chan = is_play ? SH_FSI_GET_CH_O(flags) : SH_FSI_GET_CH_I(flags); data = CR_FMT(CR_TDM) | (fsi->chan - 1); break; case SH_FSI_FMT_TDM_DELAY: - msg = "TDM Delay"; fsi->chan = is_play ? SH_FSI_GET_CH_O(flags) : SH_FSI_GET_CH_I(flags); data = CR_FMT(CR_TDM_D) | (fsi->chan - 1); -- cgit v1.2.3 From a7ffb52bb31ef5cff1b8bb312d5a3425a983563f Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Tue, 13 Jul 2010 12:13:00 +0900 Subject: ASoC: fsi: remove noisy CR_FMT macro Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/sh/fsi.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) (limited to 'sound') diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index 55a03db6daaf..28aae0d01545 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c @@ -48,13 +48,12 @@ /* DO_FMT */ /* DI_FMT */ -#define CR_FMT(param) ((param) << 4) -# define CR_MONO 0x0 -# define CR_MONO_D 0x1 -# define CR_PCM 0x2 -# define CR_I2S 0x3 -# define CR_TDM 0x4 -# define CR_TDM_D 0x5 +#define CR_MONO (0x0 << 4) +#define CR_MONO_D (0x1 << 4) +#define CR_PCM (0x2 << 4) +#define CR_I2S (0x3 << 4) +#define CR_TDM (0x4 << 4) +#define CR_TDM_D (0x5 << 4) /* DOFF_CTL */ /* DIFF_CTL */ @@ -690,30 +689,30 @@ static int fsi_dai_startup(struct snd_pcm_substream *substream, fmt = is_play ? SH_FSI_GET_OFMT(flags) : SH_FSI_GET_IFMT(flags); switch (fmt) { case SH_FSI_FMT_MONO: - data = CR_FMT(CR_MONO); + data = CR_MONO; fsi->chan = 1; break; case SH_FSI_FMT_MONO_DELAY: - data = CR_FMT(CR_MONO_D); + data = CR_MONO_D; fsi->chan = 1; break; case SH_FSI_FMT_PCM: - data = CR_FMT(CR_PCM); + data = CR_PCM; fsi->chan = 2; break; case SH_FSI_FMT_I2S: - data = CR_FMT(CR_I2S); + data = CR_I2S; fsi->chan = 2; break; case SH_FSI_FMT_TDM: fsi->chan = is_play ? SH_FSI_GET_CH_O(flags) : SH_FSI_GET_CH_I(flags); - data = CR_FMT(CR_TDM) | (fsi->chan - 1); + data = CR_TDM | (fsi->chan - 1); break; case SH_FSI_FMT_TDM_DELAY: fsi->chan = is_play ? SH_FSI_GET_CH_O(flags) : SH_FSI_GET_CH_I(flags); - data = CR_FMT(CR_TDM_D) | (fsi->chan - 1); + data = CR_TDM_D | (fsi->chan - 1); break; default: dev_err(dai->dev, "unknown format.\n"); -- cgit v1.2.3 From 73b92c1fc0196e04a31ec190333ed4056a5812cf Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Tue, 13 Jul 2010 12:13:04 +0900 Subject: ASoC: fsi: Change struct fsi_regs to fsi_core Many registers which were grouped by category were added in FSI2. To make easy to switch FSI/FSI2, fsi_core was added instead of fsi_regs. Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/sh/fsi.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) (limited to 'sound') diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index 28aae0d01545..1693be477f7a 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c @@ -111,7 +111,9 @@ struct fsi_priv { int periods; }; -struct fsi_regs { +struct fsi_core { + int ver; + u32 int_st; u32 iemsk; u32 imsk; @@ -122,7 +124,7 @@ struct fsi_master { int irq; struct fsi_priv fsia; struct fsi_priv fsib; - struct fsi_regs *regs; + struct fsi_core *core; struct sh_fsi_platform_info *info; spinlock_t lock; }; @@ -339,8 +341,8 @@ static void fsi_irq_enable(struct fsi_priv *fsi, int is_play) u32 data = fsi_port_ab_io_bit(fsi, is_play); struct fsi_master *master = fsi_get_master(fsi); - fsi_master_mask_set(master, master->regs->imsk, data, data); - fsi_master_mask_set(master, master->regs->iemsk, data, data); + fsi_master_mask_set(master, master->core->imsk, data, data); + fsi_master_mask_set(master, master->core->iemsk, data, data); } static void fsi_irq_disable(struct fsi_priv *fsi, int is_play) @@ -348,18 +350,18 @@ static void fsi_irq_disable(struct fsi_priv *fsi, int is_play) u32 data = fsi_port_ab_io_bit(fsi, is_play); struct fsi_master *master = fsi_get_master(fsi); - fsi_master_mask_set(master, master->regs->imsk, data, 0); - fsi_master_mask_set(master, master->regs->iemsk, data, 0); + fsi_master_mask_set(master, master->core->imsk, data, 0); + fsi_master_mask_set(master, master->core->iemsk, data, 0); } static u32 fsi_irq_get_status(struct fsi_master *master) { - return fsi_master_read(master, master->regs->int_st); + return fsi_master_read(master, master->core->int_st); } static void fsi_irq_clear_all_status(struct fsi_master *master) { - fsi_master_write(master, master->regs->int_st, 0x0000000); + fsi_master_write(master, master->core->int_st, 0); } static void fsi_irq_clear_status(struct fsi_priv *fsi) @@ -371,7 +373,7 @@ static void fsi_irq_clear_status(struct fsi_priv *fsi) data |= fsi_port_ab_io_bit(fsi, 1); /* clear interrupt factor */ - fsi_master_mask_set(master, master->regs->int_st, data, 0); + fsi_master_mask_set(master, master->core->int_st, data, 0); } /************************************************************************ @@ -987,7 +989,7 @@ static int fsi_probe(struct platform_device *pdev) master->fsia.master = master; master->fsib.base = master->base + 0x40; master->fsib.master = master; - master->regs = (struct fsi_regs *)id_entry->driver_data; + master->core = (struct fsi_core *)id_entry->driver_data; spin_lock_init(&master->lock); pm_runtime_enable(&pdev->dev); @@ -1068,21 +1070,27 @@ static struct dev_pm_ops fsi_pm_ops = { .runtime_resume = fsi_runtime_nop, }; -static struct fsi_regs fsi_regs = { +static struct fsi_core fsi1_core = { + .ver = 1, + + /* Interrupt */ .int_st = INT_ST, .iemsk = IEMSK, .imsk = IMSK, }; -static struct fsi_regs fsi2_regs = { +static struct fsi_core fsi2_core = { + .ver = 2, + + /* Interrupt */ .int_st = CPU_INT_ST, .iemsk = CPU_IEMSK, .imsk = CPU_IMSK, }; static struct platform_device_id fsi_id_table[] = { - { "sh_fsi", (kernel_ulong_t)&fsi_regs }, - { "sh_fsi2", (kernel_ulong_t)&fsi2_regs }, + { "sh_fsi", (kernel_ulong_t)&fsi1_core }, + { "sh_fsi2", (kernel_ulong_t)&fsi2_core }, }; static struct platform_driver fsi_driver = { -- cgit v1.2.3 From d78541473d6c6126616bca2552282660faa41d43 Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Tue, 13 Jul 2010 12:13:09 +0900 Subject: ASoC: fsi: Add pr_err for noticing unsupported access This patch didn't use dev_err, because it is difficult to get struct device here. Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/sh/fsi.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'sound') diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index 1693be477f7a..e551ca45f03e 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c @@ -161,24 +161,30 @@ static void __fsi_reg_mask_set(u32 reg, u32 mask, u32 data) static void fsi_reg_write(struct fsi_priv *fsi, u32 reg, u32 data) { - if (reg > REG_END) + if (reg > REG_END) { + pr_err("fsi: register access err (%s)\n", __func__); return; + } __fsi_reg_write((u32)(fsi->base + reg), data); } static u32 fsi_reg_read(struct fsi_priv *fsi, u32 reg) { - if (reg > REG_END) + if (reg > REG_END) { + pr_err("fsi: register access err (%s)\n", __func__); return 0; + } return __fsi_reg_read((u32)(fsi->base + reg)); } static void fsi_reg_mask_set(struct fsi_priv *fsi, u32 reg, u32 mask, u32 data) { - if (reg > REG_END) + if (reg > REG_END) { + pr_err("fsi: register access err (%s)\n", __func__); return; + } __fsi_reg_mask_set((u32)(fsi->base + reg), mask, data); } @@ -188,8 +194,10 @@ static void fsi_master_write(struct fsi_master *master, u32 reg, u32 data) unsigned long flags; if ((reg < MREG_START) || - (reg > MREG_END)) + (reg > MREG_END)) { + pr_err("fsi: register access err (%s)\n", __func__); return; + } spin_lock_irqsave(&master->lock, flags); __fsi_reg_write((u32)(master->base + reg), data); @@ -202,8 +210,10 @@ static u32 fsi_master_read(struct fsi_master *master, u32 reg) unsigned long flags; if ((reg < MREG_START) || - (reg > MREG_END)) + (reg > MREG_END)) { + pr_err("fsi: register access err (%s)\n", __func__); return 0; + } spin_lock_irqsave(&master->lock, flags); ret = __fsi_reg_read((u32)(master->base + reg)); @@ -218,8 +228,10 @@ static void fsi_master_mask_set(struct fsi_master *master, unsigned long flags; if ((reg < MREG_START) || - (reg > MREG_END)) + (reg > MREG_END)) { + pr_err("fsi: register access err (%s)\n", __func__); return; + } spin_lock_irqsave(&master->lock, flags); __fsi_reg_mask_set((u32)(master->base + reg), mask, data); -- cgit v1.2.3 From ccad7b44ccdc8341c1449bc5b864b42b197f8c2e Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Tue, 13 Jul 2010 12:13:14 +0900 Subject: ASoC: fsi: Fixup for master mode This patch add hw_params to snd_soc_dai_ops, because board specific set_rate is needed when FSI was used as master mode. This patch remove fsi_clk_ctrl from fsi_dai_startup, because clock should be disabled before set_rate. Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/sh/fsi.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 92 insertions(+), 6 deletions(-) (limited to 'sound') diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index e551ca45f03e..a1ce6089177c 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c @@ -65,6 +65,10 @@ #define ERR_UNDER 0x00000001 #define ST_ERR (ERR_OVER | ERR_UNDER) +/* CKG1 */ +#define ACKMD_MASK 0x00007000 +#define BPFMD_MASK 0x00000700 + /* CLK_RST */ #define B_CLK 0x00000010 #define A_CLK 0x00000001 @@ -734,12 +738,6 @@ static int fsi_dai_startup(struct snd_pcm_substream *substream, } fsi_reg_write(fsi, reg, data); - /* - * clear clk reset if master mode - */ - if (is_master) - fsi_clk_ctrl(fsi, 1); - /* irq clear */ fsi_irq_disable(fsi, is_play); fsi_irq_clear_status(fsi); @@ -786,10 +784,98 @@ static int fsi_dai_trigger(struct snd_pcm_substream *substream, int cmd, return ret; } +static int fsi_dai_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct fsi_priv *fsi = fsi_get_priv(substream); + struct fsi_master *master = fsi_get_master(fsi); + int (*set_rate)(int is_porta, int rate) = master->info->set_rate; + int fsi_ver = master->core->ver; + int is_play = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); + int ret; + + /* if slave mode, set_rate is not needed */ + if (!fsi_is_master_mode(fsi, is_play)) + return 0; + + /* it is error if no set_rate */ + if (!set_rate) + return -EIO; + + /* clock stop */ + pm_runtime_put_sync(dai->dev); + fsi_clk_ctrl(fsi, 0); + + ret = set_rate(fsi_is_port_a(fsi), params_rate(params)); + if (ret > 0) { + u32 data = 0; + + switch (ret & SH_FSI_ACKMD_MASK) { + default: + /* FALL THROUGH */ + case SH_FSI_ACKMD_512: + data |= (0x0 << 12); + break; + case SH_FSI_ACKMD_256: + data |= (0x1 << 12); + break; + case SH_FSI_ACKMD_128: + data |= (0x2 << 12); + break; + case SH_FSI_ACKMD_64: + data |= (0x3 << 12); + break; + case SH_FSI_ACKMD_32: + if (fsi_ver < 2) + dev_err(dai->dev, "unsupported ACKMD\n"); + else + data |= (0x4 << 12); + break; + } + + switch (ret & SH_FSI_BPFMD_MASK) { + default: + /* FALL THROUGH */ + case SH_FSI_BPFMD_32: + data |= (0x0 << 8); + break; + case SH_FSI_BPFMD_64: + data |= (0x1 << 8); + break; + case SH_FSI_BPFMD_128: + data |= (0x2 << 8); + break; + case SH_FSI_BPFMD_256: + data |= (0x3 << 8); + break; + case SH_FSI_BPFMD_512: + data |= (0x4 << 8); + break; + case SH_FSI_BPFMD_16: + if (fsi_ver < 2) + dev_err(dai->dev, "unsupported ACKMD\n"); + else + data |= (0x7 << 8); + break; + } + + fsi_reg_mask_set(fsi, CKG1, (ACKMD_MASK | BPFMD_MASK) , data); + udelay(10); + fsi_clk_ctrl(fsi, 1); + ret = 0; + } + pm_runtime_get_sync(dai->dev); + + return ret; + +} + static struct snd_soc_dai_ops fsi_dai_ops = { .startup = fsi_dai_startup, .shutdown = fsi_dai_shutdown, .trigger = fsi_dai_trigger, + .hw_params = fsi_dai_hw_params, }; /************************************************************************ -- cgit v1.2.3 From dfe4c93627c4a1a7fb7e30b15e31f4ccf3ca60f5 Mon Sep 17 00:00:00 2001 From: "arnaud.patard@rtp-net.org" Date: Sun, 11 Jul 2010 23:28:31 +0200 Subject: ASoC: Fix kirkwood i2s mono playback Kirkwood controller needs to be informed if the audio stream is mono or not. Failing to do so will result in playing at the wrong speed. Signed-off-by: Arnaud Patard Signed-off-by: Mark Brown --- sound/soc/kirkwood/kirkwood-i2s.c | 9 +++++++++ sound/soc/kirkwood/kirkwood.h | 3 +++ 2 files changed, 12 insertions(+) (limited to 'sound') diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c index 0fdc7db7a469..d80ea1ff7b0e 100644 --- a/sound/soc/kirkwood/kirkwood-i2s.c +++ b/sound/soc/kirkwood/kirkwood-i2s.c @@ -153,6 +153,15 @@ static int kirkwood_i2s_hw_params(struct snd_pcm_substream *substream, default: return -EINVAL; } + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + value &= ~KIRKWOOD_PLAYCTL_MONO_MASK; + if (params_channels(params) == 1) + value |= KIRKWOOD_PLAYCTL_MONO_BOTH; + else + value |= KIRKWOOD_PLAYCTL_MONO_OFF; + } + writel(i2s_value, priv->io+i2s_reg); writel(value, priv->io+reg); diff --git a/sound/soc/kirkwood/kirkwood.h b/sound/soc/kirkwood/kirkwood.h index b6e4f68d71dd..bb6e6a5648c9 100644 --- a/sound/soc/kirkwood/kirkwood.h +++ b/sound/soc/kirkwood/kirkwood.h @@ -49,6 +49,9 @@ #define KIRKWOOD_PLAYCTL_BURST_32 (1<<11) #define KIRKWOOD_PLAYCTL_PAUSE (1<<9) #define KIRKWOOD_PLAYCTL_SPDIF_MUTE (1<<8) +#define KIRKWOOD_PLAYCTL_MONO_MASK (3<<5) +#define KIRKWOOD_PLAYCTL_MONO_BOTH (3<<5) +#define KIRKWOOD_PLAYCTL_MONO_OFF (0<<5) #define KIRKWOOD_PLAYCTL_I2S_MUTE (1<<7) #define KIRKWOOD_PLAYCTL_SPDIF_EN (1<<4) #define KIRKWOOD_PLAYCTL_I2S_EN (1<<3) -- cgit v1.2.3 From b424ec953344e0ea612a8cc2d8e59742a0273ac1 Mon Sep 17 00:00:00 2001 From: "arnaud.patard@rtp-net.org" Date: Sun, 11 Jul 2010 23:28:32 +0200 Subject: ASoC: kirkwood-i2s: Handle mute/unmute playback/record The controller has mute/unmute capability and some bootloader may mute them at boot. If it's not handled, all things will seem to be working but no sound will come out of the speaker/headphone. Signed-off-by: Arnaud Patard Signed-off-by: Mark Brown --- sound/soc/kirkwood/kirkwood-i2s.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'sound') diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c index d80ea1ff7b0e..981ffc2a13c8 100644 --- a/sound/soc/kirkwood/kirkwood-i2s.c +++ b/sound/soc/kirkwood/kirkwood-i2s.c @@ -193,7 +193,8 @@ static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream, /* configure audio & enable i2s playback */ value = readl(priv->io + KIRKWOOD_PLAYCTL); value &= ~KIRKWOOD_PLAYCTL_BURST_MASK; - value &= ~(KIRKWOOD_PLAYCTL_PAUSE|KIRKWOOD_PLAYCTL_SPDIF_EN); + value &= ~(KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE + | KIRKWOOD_PLAYCTL_SPDIF_EN); if (priv->burst == 32) value |= KIRKWOOD_PLAYCTL_BURST_32; @@ -206,7 +207,7 @@ static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream, case SNDRV_PCM_TRIGGER_STOP: /* stop audio, disable interrupts */ value = readl(priv->io + KIRKWOOD_PLAYCTL); - value |= KIRKWOOD_PLAYCTL_PAUSE; + value |= KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE; writel(value, priv->io + KIRKWOOD_PLAYCTL); value = readl(priv->io + KIRKWOOD_INT_MASK); @@ -222,14 +223,14 @@ static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream, case SNDRV_PCM_TRIGGER_PAUSE_PUSH: case SNDRV_PCM_TRIGGER_SUSPEND: value = readl(priv->io + KIRKWOOD_PLAYCTL); - value |= KIRKWOOD_PLAYCTL_PAUSE; + value |= KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE; writel(value, priv->io + KIRKWOOD_PLAYCTL); break; case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: value = readl(priv->io + KIRKWOOD_PLAYCTL); - value &= ~KIRKWOOD_PLAYCTL_PAUSE; + value &= ~(KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE); writel(value, priv->io + KIRKWOOD_PLAYCTL); break; @@ -262,7 +263,8 @@ static int kirkwood_i2s_rec_trigger(struct snd_pcm_substream *substream, value = readl(priv->io + KIRKWOOD_RECCTL); value &= ~KIRKWOOD_RECCTL_BURST_MASK; value &= ~KIRKWOOD_RECCTL_MONO; - value &= ~(KIRKWOOD_RECCTL_PAUSE | KIRKWOOD_RECCTL_SPDIF_EN); + value &= ~(KIRKWOOD_RECCTL_PAUSE | KIRKWOOD_RECCTL_MUTE + | KIRKWOOD_RECCTL_SPDIF_EN); if (priv->burst == 32) value |= KIRKWOOD_RECCTL_BURST_32; @@ -276,7 +278,7 @@ static int kirkwood_i2s_rec_trigger(struct snd_pcm_substream *substream, case SNDRV_PCM_TRIGGER_STOP: /* stop audio, disable interrupts */ value = readl(priv->io + KIRKWOOD_RECCTL); - value |= KIRKWOOD_RECCTL_PAUSE; + value |= KIRKWOOD_RECCTL_PAUSE | KIRKWOOD_RECCTL_MUTE; writel(value, priv->io + KIRKWOOD_RECCTL); value = readl(priv->io + KIRKWOOD_INT_MASK); @@ -292,14 +294,14 @@ static int kirkwood_i2s_rec_trigger(struct snd_pcm_substream *substream, case SNDRV_PCM_TRIGGER_PAUSE_PUSH: case SNDRV_PCM_TRIGGER_SUSPEND: value = readl(priv->io + KIRKWOOD_RECCTL); - value |= KIRKWOOD_RECCTL_PAUSE; + value |= KIRKWOOD_RECCTL_PAUSE | KIRKWOOD_RECCTL_MUTE; writel(value, priv->io + KIRKWOOD_RECCTL); break; case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: value = readl(priv->io + KIRKWOOD_RECCTL); - value &= ~KIRKWOOD_RECCTL_PAUSE; + value &= ~(KIRKWOOD_RECCTL_PAUSE | KIRKWOOD_RECCTL_MUTE); writel(value, priv->io + KIRKWOOD_RECCTL); break; -- cgit v1.2.3 From 0c74a939d84730818bc9bf1efa5ad7184bb2f248 Mon Sep 17 00:00:00 2001 From: Manuel Lauss Date: Mon, 12 Jul 2010 15:14:59 +0200 Subject: ASoC: au1x: fix section mismatch in psc-i2s.c Annotate platform probe callback with __devinit instead of plain __init. Signed-off-by: Manuel Lauss Signed-off-by: Mark Brown --- sound/soc/au1x/psc-i2s.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/au1x/psc-i2s.c b/sound/soc/au1x/psc-i2s.c index 737b2384f6c5..6083fe7799fa 100644 --- a/sound/soc/au1x/psc-i2s.c +++ b/sound/soc/au1x/psc-i2s.c @@ -300,7 +300,7 @@ struct snd_soc_dai au1xpsc_i2s_dai = { }; EXPORT_SYMBOL(au1xpsc_i2s_dai); -static int __init au1xpsc_i2s_drvprobe(struct platform_device *pdev) +static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev) { struct resource *r; unsigned long sel; -- cgit v1.2.3 From 840b64c08032a86ab39b85ddd342918da0d559c8 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Tue, 13 Jul 2010 22:49:01 +0200 Subject: ALSA: hda - Add support of dual-ADCs for Realtek ALC275 Some VAIO models with ALC275 have dual ADCs for both internal and external mics, and the driver needs to switch one of them appropriately. This patch adds a basic support for this functionality, dynamic switching between two ADCs per jack plug state. Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 178 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 154 insertions(+), 24 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index a7592f5e97d4..ca1a87a4812c 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -333,6 +333,12 @@ struct alc_spec { hda_nid_t *capsrc_nids; hda_nid_t dig_in_nid; /* digital-in NID; optional */ + /* capture setup for dynamic dual-adc switch */ + unsigned int cur_adc_idx; + hda_nid_t cur_adc; + unsigned int cur_adc_stream_tag; + unsigned int cur_adc_format; + /* capture source */ unsigned int num_mux_defs; const struct hda_input_mux *input_mux; @@ -374,6 +380,7 @@ struct alc_spec { /* other flags */ unsigned int no_analog :1; /* digital I/O only */ + unsigned int dual_adc_switch:1; /* switch ADCs (for ALC275) */ int init_amp; /* for virtual master */ @@ -1010,6 +1017,29 @@ static int get_connection_index(struct hda_codec *codec, hda_nid_t mux, return -1; } +/* switch the current ADC according to the jack state */ +static void alc_dual_mic_adc_auto_switch(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + unsigned int present; + hda_nid_t new_adc; + + present = snd_hda_jack_detect(codec, spec->ext_mic.pin); + if (present) + spec->cur_adc_idx = 1; + else + spec->cur_adc_idx = 0; + new_adc = spec->adc_nids[spec->cur_adc_idx]; + if (spec->cur_adc && spec->cur_adc != new_adc) { + /* stream is running, let's swap the current ADC */ + snd_hda_codec_cleanup_stream(codec, spec->cur_adc); + spec->cur_adc = new_adc; + snd_hda_codec_setup_stream(codec, new_adc, + spec->cur_adc_stream_tag, 0, + spec->cur_adc_format); + } +} + static void alc_mic_automute(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; @@ -1024,6 +1054,11 @@ static void alc_mic_automute(struct hda_codec *codec) if (snd_BUG_ON(!spec->adc_nids)) return; + if (spec->dual_adc_switch) { + alc_dual_mic_adc_auto_switch(codec); + return; + } + cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0]; present = snd_hda_jack_detect(codec, spec->ext_mic.pin); @@ -3614,6 +3649,41 @@ static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, return 0; } +/* analog capture with dynamic dual-adc changes */ +static int dualmic_capture_pcm_prepare(struct hda_pcm_stream *hinfo, + struct hda_codec *codec, + unsigned int stream_tag, + unsigned int format, + struct snd_pcm_substream *substream) +{ + struct alc_spec *spec = codec->spec; + spec->cur_adc = spec->adc_nids[spec->cur_adc_idx]; + spec->cur_adc_stream_tag = stream_tag; + spec->cur_adc_format = format; + snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format); + return 0; +} + +static int dualmic_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, + struct hda_codec *codec, + struct snd_pcm_substream *substream) +{ + struct alc_spec *spec = codec->spec; + snd_hda_codec_cleanup_stream(codec, spec->cur_adc); + spec->cur_adc = 0; + return 0; +} + +static struct hda_pcm_stream dualmic_pcm_analog_capture = { + .substreams = 1, + .channels_min = 2, + .channels_max = 2, + .nid = 0, /* fill later */ + .ops = { + .prepare = dualmic_capture_pcm_prepare, + .cleanup = dualmic_capture_pcm_cleanup + }, +}; /* */ @@ -5052,24 +5122,12 @@ static void fixup_automic_adc(struct hda_codec *codec) spec->auto_mic = 0; /* disable auto-mic to be sure */ } -/* choose the ADC/MUX containing the input pin and initialize the setup */ -static void fixup_single_adc(struct hda_codec *codec) +/* set the default connection to that pin */ +static int init_capsrc_for_pin(struct hda_codec *codec, hda_nid_t pin) { struct alc_spec *spec = codec->spec; - hda_nid_t pin = 0; int i; - /* search for the input pin; there must be only one */ - for (i = 0; i < AUTO_PIN_LAST; i++) { - if (spec->autocfg.input_pins[i]) { - pin = spec->autocfg.input_pins[i]; - break; - } - } - if (!pin) - return; - - /* set the default connection to that pin */ for (i = 0; i < spec->num_adc_nids; i++) { hda_nid_t cap = spec->capsrc_nids ? spec->capsrc_nids[i] : spec->adc_nids[i]; @@ -5078,11 +5136,6 @@ static void fixup_single_adc(struct hda_codec *codec) idx = get_connection_index(codec, cap, pin); if (idx < 0) continue; - /* use only this ADC */ - if (spec->capsrc_nids) - spec->capsrc_nids += i; - spec->adc_nids += i; - spec->num_adc_nids = 1; /* select or unmute this route */ if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) { snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx, @@ -5091,10 +5144,45 @@ static void fixup_single_adc(struct hda_codec *codec) snd_hda_codec_write_cache(codec, cap, 0, AC_VERB_SET_CONNECT_SEL, idx); } + return i; /* return the found index */ + } + return -1; /* not found */ +} + +/* choose the ADC/MUX containing the input pin and initialize the setup */ +static void fixup_single_adc(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + hda_nid_t pin = 0; + int i; + + /* search for the input pin; there must be only one */ + for (i = 0; i < AUTO_PIN_LAST; i++) { + if (spec->autocfg.input_pins[i]) { + pin = spec->autocfg.input_pins[i]; + break; + } + } + if (!pin) return; + i = init_capsrc_for_pin(codec, pin); + if (i >= 0) { + /* use only this ADC */ + if (spec->capsrc_nids) + spec->capsrc_nids += i; + spec->adc_nids += i; + spec->num_adc_nids = 1; } } +/* initialize dual adcs */ +static void fixup_dual_adc_switch(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + init_capsrc_for_pin(codec, spec->ext_mic.pin); + init_capsrc_for_pin(codec, spec->int_mic.pin); +} + static void set_capture_mixer(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; @@ -5108,7 +5196,10 @@ static void set_capture_mixer(struct hda_codec *codec) }; if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) { int mux = 0; - if (spec->auto_mic) + int num_adcs = spec->num_adc_nids; + if (spec->dual_adc_switch) + fixup_dual_adc_switch(codec); + else if (spec->auto_mic) fixup_automic_adc(codec); else if (spec->input_mux) { if (spec->input_mux->num_items > 1) @@ -5116,7 +5207,9 @@ static void set_capture_mixer(struct hda_codec *codec) else if (spec->input_mux->num_items == 1) fixup_single_adc(codec); } - spec->cap_mixer = caps[mux][spec->num_adc_nids - 1]; + if (spec->dual_adc_switch) + num_adcs = 1; + spec->cap_mixer = caps[mux][num_adcs - 1]; } } @@ -14141,6 +14234,36 @@ static int alc269_mic2_mute_check_ps(struct hda_codec *codec, hda_nid_t nid) } #endif /* CONFIG_SND_HDA_POWER_SAVE */ +static int alc275_setup_dual_adc(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + + if (codec->vendor_id != 0x10ec0275 || !spec->auto_mic) + return 0; + if ((spec->ext_mic.pin >= 0x18 && spec->int_mic.pin <= 0x13) || + (spec->ext_mic.pin <= 0x12 && spec->int_mic.pin >= 0x18)) { + if (spec->ext_mic.pin <= 0x12) { + spec->private_adc_nids[0] = 0x08; + spec->private_adc_nids[1] = 0x11; + spec->private_capsrc_nids[0] = 0x23; + spec->private_capsrc_nids[1] = 0x22; + } else { + spec->private_adc_nids[0] = 0x11; + spec->private_adc_nids[1] = 0x08; + spec->private_capsrc_nids[0] = 0x22; + spec->private_capsrc_nids[1] = 0x23; + } + spec->adc_nids = spec->private_adc_nids; + spec->capsrc_nids = spec->private_capsrc_nids; + spec->num_adc_nids = 2; + spec->dual_adc_switch = 1; + snd_printdd("realtek: enabling dual ADC switchg (%02x:%02x)\n", + spec->adc_nids[0], spec->adc_nids[1]); + return 1; + } + return 0; +} + /* * BIOS auto configuration */ @@ -14180,11 +14303,14 @@ static int alc269_parse_auto_config(struct hda_codec *codec) spec->num_mux_defs = 1; spec->input_mux = &spec->private_imux[0]; - fillup_priv_adc_nids(codec, alc269_adc_candidates, - sizeof(alc269_adc_candidates)); + + if (!alc275_setup_dual_adc(codec)) + fillup_priv_adc_nids(codec, alc269_adc_candidates, + sizeof(alc269_adc_candidates)); /* set default input source */ - snd_hda_codec_write_cache(codec, spec->capsrc_nids[0], + if (!spec->dual_adc_switch) + snd_hda_codec_write_cache(codec, spec->capsrc_nids[0], 0, AC_VERB_SET_CONNECT_SEL, spec->input_mux->items[0].index); @@ -14480,6 +14606,10 @@ static int patch_alc269(struct hda_codec *codec) */ spec->stream_analog_playback = &alc269_44k_pcm_analog_playback; spec->stream_analog_capture = &alc269_44k_pcm_analog_capture; + } else if (spec->dual_adc_switch) { + spec->stream_analog_playback = &alc269_pcm_analog_playback; + /* switch ADC dynamically */ + spec->stream_analog_capture = &dualmic_pcm_analog_capture; } else { spec->stream_analog_playback = &alc269_pcm_analog_playback; spec->stream_analog_capture = &alc269_pcm_analog_capture; -- cgit v1.2.3 From 992cbf743862916dfbfdd3238fe3fecffbab5dd3 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Wed, 14 Jul 2010 15:11:39 +0200 Subject: sound/oss-msnd-pinnacle: ioctl needs the inode This broke in sound/oss: convert to unlocked_ioctl, when I missed one of the ioctl functions still using the inode pointer. Signed-off-by: Arnd Bergmann Signed-off-by: Takashi Iwai --- sound/oss/msnd_pinnacle.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/oss/msnd_pinnacle.c b/sound/oss/msnd_pinnacle.c index 9ffd29f32aa5..bfaac5fa13d7 100644 --- a/sound/oss/msnd_pinnacle.c +++ b/sound/oss/msnd_pinnacle.c @@ -641,7 +641,7 @@ static int mixer_ioctl(unsigned int cmd, unsigned long arg) static long dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { - int minor = iminor(inode); + int minor = iminor(file->f_path.dentry->d_inode); int ret; if (cmd == OSS_GETVERSION) { -- cgit v1.2.3 From 5164d74d74447895aaa31c094a1b9e666acaa656 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Wed, 14 Jul 2010 16:14:33 +0100 Subject: ASoC: Handle read failures in codec_reg When a device is powered down volatile registers can't be read so attempts to display codec_reg will show error values, and obviously it is also possible for there to be hardware errors too. Check for errors from reads and display them more clearly when formatting codec_reg. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/soc-core.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 8b79d90efdc1..5299932db0b6 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -84,7 +84,7 @@ static int run_delayed_work(struct delayed_work *dwork) /* codec register dump */ static ssize_t soc_codec_reg_show(struct snd_soc_codec *codec, char *buf) { - int i, step = 1, count = 0; + int ret, i, step = 1, count = 0; if (!codec->reg_cache_size) return 0; @@ -101,12 +101,24 @@ static ssize_t soc_codec_reg_show(struct snd_soc_codec *codec, char *buf) if (count >= PAGE_SIZE - 1) break; - if (codec->display_register) + if (codec->display_register) { count += codec->display_register(codec, buf + count, PAGE_SIZE - count, i); - else - count += snprintf(buf + count, PAGE_SIZE - count, - "%4x", codec->read(codec, i)); + } else { + /* If the read fails it's almost certainly due to + * the register being volatile and the device being + * powered off. + */ + ret = codec->read(codec, i); + if (ret >= 0) + count += snprintf(buf + count, + PAGE_SIZE - count, + "%4x", ret); + else + count += snprintf(buf + count, + PAGE_SIZE - count, + "", ret); + } if (count >= PAGE_SIZE - 1) break; -- cgit v1.2.3 From 7a53cd16d4d9968d1962e378b14eec2d99aa43e0 Mon Sep 17 00:00:00 2001 From: Michael Witten Date: Wed, 14 Jul 2010 23:56:56 +0000 Subject: Kconfig: fixo typo in "Xilinx'" Signed-off-by: Michael Witten Signed-off-by: Jiri Kosina --- sound/drivers/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/drivers/Kconfig b/sound/drivers/Kconfig index 84714a65e5c8..c290cee4cee8 100644 --- a/sound/drivers/Kconfig +++ b/sound/drivers/Kconfig @@ -155,7 +155,7 @@ config SND_ML403_AC97CR select SND_AC97_CODEC help Say Y here to include support for the - opb_ac97_controller_ref_v1_00_a ip core found in Xilinx' ML403 + opb_ac97_controller_ref_v1_00_a ip core found in Xilinx's ML403 reference design. To compile this driver as a module, choose M here: the module -- cgit v1.2.3 From 1d8c1100fbf956b9c5994077a4d3c6490c23e087 Mon Sep 17 00:00:00 2001 From: Michael Witten Date: Wed, 14 Jul 2010 23:54:21 +0000 Subject: ALSA: Kconfig: SND_AC97_POWER_SAVE description improvement The description has been expanded to explain the time-out value provided by the power_save module parameter. Signed-off-by: Michael Witten Signed-off-by: Takashi Iwai --- sound/drivers/Kconfig | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/drivers/Kconfig b/sound/drivers/Kconfig index 84714a65e5c8..32646000ab90 100644 --- a/sound/drivers/Kconfig +++ b/sound/drivers/Kconfig @@ -170,9 +170,25 @@ config SND_AC97_POWER_SAVE AC97 codecs. In this mode, the power-mode is dynamically controlled at each open/close. - The mode is activated by passing power_save=1 option to - snd-ac97-codec driver. You can toggle it dynamically over - sysfs, too. + The mode is activated by passing 'power_save=X' to the + snd-ac97-codec driver module, where 'X' is the time-out + value, a nonnegative integer that specifies how many + seconds of idle time the driver must count before it may + put the AC97 into power-save mode; a value of 0 (zero) + disables the use of this power-save mode. + + After the snd-ac97-codec driver module has been loaded, + the 'power_save' parameter can be set via sysfs as follows: + + echo 10 > /sys/module/snd_ac97_codec/parameters/power_save + + In this case, the time-out is set to 10 seconds; setting + the time-out to 1 second (the minimum activation value) + isn't recommended because many applications try to reopen + the device frequently. A value of 10 seconds would be a + good choice for normal operations. + + See Documentation/sound/alsa/powersave.txt for more details. config SND_AC97_POWER_SAVE_DEFAULT int "Default time-out for AC97 power-save mode" @@ -182,4 +198,6 @@ config SND_AC97_POWER_SAVE_DEFAULT The default time-out value in seconds for AC97 automatic power-save mode. 0 means to disable the power-save mode. + See SND_AC97_POWER_SAVE for more details. + endif # SND_DRIVERS -- cgit v1.2.3 From 315e8f7501ad929acacfa94c251283e837f281ed Mon Sep 17 00:00:00 2001 From: Kulikov Vasiliy Date: Thu, 15 Jul 2010 22:48:19 +0400 Subject: ALSA: asihpi: fix sign bug bytes_per_sec is unsigned, so if snd_pcm_format_width() return error we would not see it. Signed-off-by: Kulikov Vasiliy Signed-off-by: Takashi Iwai --- sound/pci/asihpi/asihpi.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/pci/asihpi/asihpi.c b/sound/pci/asihpi/asihpi.c index 91218f77217f..c80b0b863c54 100644 --- a/sound/pci/asihpi/asihpi.c +++ b/sound/pci/asihpi/asihpi.c @@ -460,6 +460,7 @@ static int snd_card_asihpi_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_card_asihpi *card = snd_pcm_substream_chip(substream); int err; u16 format; + int width; unsigned int bytes_per_sec; print_hwparams(params); @@ -512,9 +513,10 @@ static int snd_card_asihpi_pcm_hw_params(struct snd_pcm_substream *substream, dpcm->hpi_buffer_attached); } bytes_per_sec = params_rate(params) * params_channels(params); - bytes_per_sec *= snd_pcm_format_width(params_format(params)); + width = snd_pcm_format_width(params_format(params)); + bytes_per_sec *= width; bytes_per_sec /= 8; - if (bytes_per_sec <= 0) + if (width < 0 || bytes_per_sec == 0) return -EINVAL; dpcm->bytes_per_sec = bytes_per_sec; -- cgit v1.2.3 From 8d4bbee77e63981b91e4af7c569dc6a585ee0eb0 Mon Sep 17 00:00:00 2001 From: Eliot Blennerhassett Date: Fri, 16 Jul 2010 17:50:59 +1200 Subject: ALSA: asihpi - HPI version 4.04.01 Signed-off-by: Eliot Blennerhassett Signed-off-by: Takashi Iwai --- sound/pci/asihpi/hpi.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/pci/asihpi/hpi.h b/sound/pci/asihpi/hpi.h index cee4df460f68..23399d02f666 100644 --- a/sound/pci/asihpi/hpi.h +++ b/sound/pci/asihpi/hpi.h @@ -50,8 +50,8 @@ i.e 3.05.02 is a development version #define HPI_VER_RELEASE(v) ((int)(v & 0xFF)) /* Use single digits for versions less that 10 to avoid octal. */ -#define HPI_VER HPI_VERSION_CONSTRUCTOR(4L, 3, 36) -#define HPI_VER_STRING "4.03.36" +#define HPI_VER HPI_VERSION_CONSTRUCTOR(4L, 4, 1) +#define HPI_VER_STRING "4.04.01" /* Library version as documented in hpi-api-versions.txt */ #define HPI_LIB_VER HPI_VERSION_CONSTRUCTOR(9, 0, 0) -- cgit v1.2.3 From 604a440a9dd08d45570c555d78a17a4602c843d5 Mon Sep 17 00:00:00 2001 From: Eliot Blennerhassett Date: Fri, 16 Jul 2010 17:51:00 +1200 Subject: ALSA: asihpi - Avoid using c99 uintX types. Signed-off-by: Eliot Blennerhassett Signed-off-by: Takashi Iwai --- sound/pci/asihpi/hpi_internal.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/pci/asihpi/hpi_internal.h b/sound/pci/asihpi/hpi_internal.h index 7ae7a1d59853..16f502d459de 100644 --- a/sound/pci/asihpi/hpi_internal.h +++ b/sound/pci/asihpi/hpi_internal.h @@ -104,9 +104,9 @@ typedef void hpi_handler_func(struct hpi_message *, struct hpi_response *); #define STR_ROLE_FIELD_MAX 255U struct hpi_entity_str { - uint16_t size; - uint8_t type; - uint8_t role; + u16 size; + u8 type; + u8 role; }; #if defined(_MSC_VER) @@ -119,11 +119,11 @@ struct hpi_entity { #if ! defined(HPI_OS_DSP_C6000) || (defined(HPI_OS_DSP_C6000) && (__TI_COMPILER_VERSION__ > 6000008)) /* DSP C6000 compiler v6.0.8 and lower do not support flexible array member */ - uint8_t value[]; + u8 value[]; #else /* NOTE! Using sizeof(struct hpi_entity) will give erroneous results */ #define HPI_INTERNAL_WARN_ABOUT_ENTITY_VALUE - uint8_t value[1]; + u8 value[1]; #endif }; -- cgit v1.2.3 From e2768c0c223d86a20ec392528bafd25996ce7585 Mon Sep 17 00:00:00 2001 From: Eliot Blennerhassett Date: Fri, 16 Jul 2010 17:51:01 +1200 Subject: ALSA: asihpi - Avoid useless assignment of returned index values. Signed-off-by: Eliot Blennerhassett Signed-off-by: Takashi Iwai --- sound/pci/asihpi/hpifunc.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/pci/asihpi/hpifunc.c b/sound/pci/asihpi/hpifunc.c index 9c6958ab9284..1e92eb6dd509 100644 --- a/sound/pci/asihpi/hpifunc.c +++ b/sound/pci/asihpi/hpifunc.c @@ -2179,7 +2179,7 @@ u16 hpi_compander_get_attack_time_constant(const struct hpi_hsubsys *ph_subsys, u32 h_control, unsigned int index, u32 *attack) { return hpi_control_param_get(ph_subsys, h_control, - HPI_COMPANDER_ATTACK, 0, index, attack, &index); + HPI_COMPANDER_ATTACK, 0, index, attack, NULL); } u16 hpi_compander_set_decay_time_constant(const struct hpi_hsubsys *ph_subsys, @@ -2193,7 +2193,7 @@ u16 hpi_compander_get_decay_time_constant(const struct hpi_hsubsys *ph_subsys, u32 h_control, unsigned int index, u32 *decay) { return hpi_control_param_get(ph_subsys, h_control, - HPI_COMPANDER_DECAY, 0, index, decay, &index); + HPI_COMPANDER_DECAY, 0, index, decay, NULL); } @@ -2244,7 +2244,7 @@ u16 hpi_compander_get_ratio(const struct hpi_hsubsys *ph_subsys, u32 h_control, u32 index, u32 *ratio100) { return hpi_control_param_get(ph_subsys, h_control, - HPI_COMPANDER_RATIO, 0, index, ratio100, &index); + HPI_COMPANDER_RATIO, 0, index, ratio100, NULL); } u16 hpi_level_query_range(const struct hpi_hsubsys *ph_subsys, u32 h_control, @@ -3258,8 +3258,7 @@ static inline size_t hpi_entity_item_count(struct hpi_entity *entity_ptr) static inline struct hpi_entity *hpi_entity_ptr_to_next(struct hpi_entity *entity_ptr) { - return (void *)(((uint8_t *) entity_ptr) + - hpi_entity_size(entity_ptr)); + return (void *)(((u8 *)entity_ptr) + hpi_entity_size(entity_ptr)); } static inline u16 hpi_entity_check_type(const enum e_entity_type t) -- cgit v1.2.3 From 0fad4ed7b230f593539b2da9cadbb77cb3a3131a Mon Sep 17 00:00:00 2001 From: Jorge Eduardo Candelaria Date: Thu, 15 Jul 2010 11:38:01 -0500 Subject: ASoC: TWL6040: Correct widget handling for drivers In order to reduce pop-noise at powering up/down of the DACs and Drivers, these components have to be handled in a specific sequence. Headset, Handsfree, and Earphone drivers are now registered as PGA components to ensure DACs are enabled first. Also, add a delay to leave time for DACs to settle before continuing power up/down sequence. Signed-off-by: Jorge Eduardo Candelaria Signed-off-by: Margarita Olaya Cabrera Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl6040.c | 56 +++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 28 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/twl6040.c b/sound/soc/codecs/twl6040.c index 85dd4fb4c681..64a807f1a8a1 100644 --- a/sound/soc/codecs/twl6040.c +++ b/sound/soc/codecs/twl6040.c @@ -360,6 +360,13 @@ static int headset_power_mode(struct snd_soc_codec *codec, int high_perf) return 0; } +static int twl6040_hs_dac_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + msleep(1); + return 0; +} + static int twl6040_power_mode_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { @@ -371,6 +378,8 @@ static int twl6040_power_mode_event(struct snd_soc_dapm_widget *w, else priv->non_lp--; + msleep(1); + return 0; } @@ -471,20 +480,6 @@ static const struct snd_kcontrol_new hfdacl_switch_controls = static const struct snd_kcontrol_new hfdacr_switch_controls = SOC_DAPM_SINGLE("Switch", TWL6040_REG_HFRCTL, 2, 1, 0); -/* Headset driver switches */ -static const struct snd_kcontrol_new hsl_driver_switch_controls = - SOC_DAPM_SINGLE("Switch", TWL6040_REG_HSLCTL, 2, 1, 0); - -static const struct snd_kcontrol_new hsr_driver_switch_controls = - SOC_DAPM_SINGLE("Switch", TWL6040_REG_HSRCTL, 2, 1, 0); - -/* Handsfree driver switches */ -static const struct snd_kcontrol_new hfl_driver_switch_controls = - SOC_DAPM_SINGLE("Switch", TWL6040_REG_HFLCTL, 4, 1, 0); - -static const struct snd_kcontrol_new hfr_driver_switch_controls = - SOC_DAPM_SINGLE("Switch", TWL6040_REG_HFRCTL, 4, 1, 0); - static const struct snd_kcontrol_new ep_driver_switch_controls = SOC_DAPM_SINGLE("Switch", TWL6040_REG_EARCTL, 0, 1, 0); @@ -548,10 +543,14 @@ static const struct snd_soc_dapm_widget twl6040_dapm_widgets[] = { TWL6040_REG_DMICBCTL, 4, 0), /* DACs */ - SND_SOC_DAPM_DAC("HSDAC Left", "Headset Playback", - TWL6040_REG_HSLCTL, 0, 0), - SND_SOC_DAPM_DAC("HSDAC Right", "Headset Playback", - TWL6040_REG_HSRCTL, 0, 0), + SND_SOC_DAPM_DAC_E("HSDAC Left", "Headset Playback", + TWL6040_REG_HSLCTL, 0, 0, + twl6040_hs_dac_event, + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), + SND_SOC_DAPM_DAC_E("HSDAC Right", "Headset Playback", + TWL6040_REG_HSRCTL, 0, 0, + twl6040_hs_dac_event, + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_DAC_E("HFDAC Left", "Handsfree Playback", TWL6040_REG_HFLCTL, 0, 0, twl6040_power_mode_event, @@ -571,18 +570,19 @@ static const struct snd_soc_dapm_widget twl6040_dapm_widgets[] = { SND_SOC_DAPM_SWITCH("HFDAC Right Playback", SND_SOC_NOPM, 0, 0, &hfdacr_switch_controls), - SND_SOC_DAPM_SWITCH("Headset Left Driver", - SND_SOC_NOPM, 0, 0, &hsl_driver_switch_controls), - SND_SOC_DAPM_SWITCH("Headset Right Driver", - SND_SOC_NOPM, 0, 0, &hsr_driver_switch_controls), - SND_SOC_DAPM_SWITCH_E("Handsfree Left Driver", - SND_SOC_NOPM, 0, 0, &hfl_driver_switch_controls, + /* Analog playback drivers */ + SND_SOC_DAPM_PGA_E("Handsfree Left Driver", + TWL6040_REG_HFLCTL, 4, 0, NULL, 0, twl6040_power_mode_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SWITCH_E("Handsfree Right Driver", - SND_SOC_NOPM, 0, 0, &hfr_driver_switch_controls, + SND_SOC_DAPM_PGA_E("Handsfree Right Driver", + TWL6040_REG_HFRCTL, 4, 0, NULL, 0, twl6040_power_mode_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), + SND_SOC_DAPM_PGA("Headset Left Driver", + TWL6040_REG_HSLCTL, 2, 0, NULL, 0), + SND_SOC_DAPM_PGA("Headset Right Driver", + TWL6040_REG_HSRCTL, 2, 0, NULL, 0), SND_SOC_DAPM_SWITCH_E("Earphone Driver", SND_SOC_NOPM, 0, 0, &ep_driver_switch_controls, twl6040_power_mode_event, @@ -616,8 +616,8 @@ static const struct snd_soc_dapm_route intercon[] = { {"HSDAC Left Playback", "Switch", "HSDAC Left"}, {"HSDAC Right Playback", "Switch", "HSDAC Right"}, - {"Headset Left Driver", "Switch", "HSDAC Left Playback"}, - {"Headset Right Driver", "Switch", "HSDAC Right Playback"}, + {"Headset Left Driver", NULL, "HSDAC Left Playback"}, + {"Headset Right Driver", NULL, "HSDAC Right Playback"}, {"HSOL", NULL, "Headset Left Driver"}, {"HSOR", NULL, "Headset Right Driver"}, -- cgit v1.2.3 From 3c2ef841c0e27f37923ed15dc5d744cd6ba704ae Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Fri, 16 Jul 2010 19:51:06 +0900 Subject: ASoC: fsi: Add specified ID for soc-audio Specified ID is necessary, when some codecs are used with FSI. Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/sh/fsi-ak4642.c | 4 ++-- sound/soc/sh/fsi-da7210.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/sh/fsi-ak4642.c b/sound/soc/sh/fsi-ak4642.c index 2871a200160c..dad575a22622 100644 --- a/sound/soc/sh/fsi-ak4642.c +++ b/sound/soc/sh/fsi-ak4642.c @@ -29,7 +29,7 @@ static int fsi_ak4642_dai_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link fsi_dai_link = { .name = "AK4642", .stream_name = "AK4642", - .cpu_dai = &fsi_soc_dai[0], /* fsi */ + .cpu_dai = &fsi_soc_dai[FSI_PORT_A], .codec_dai = &ak4642_dai, .init = fsi_ak4642_dai_init, .ops = NULL, @@ -53,7 +53,7 @@ static int __init fsi_ak4642_init(void) { int ret = -ENOMEM; - fsi_snd_device = platform_device_alloc("soc-audio", -1); + fsi_snd_device = platform_device_alloc("soc-audio", FSI_PORT_A); if (!fsi_snd_device) goto out; diff --git a/sound/soc/sh/fsi-da7210.c b/sound/soc/sh/fsi-da7210.c index 4d4fd777b45a..121bbb07bb03 100644 --- a/sound/soc/sh/fsi-da7210.c +++ b/sound/soc/sh/fsi-da7210.c @@ -24,7 +24,7 @@ static int fsi_da7210_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link fsi_da7210_dai = { .name = "DA7210", .stream_name = "DA7210", - .cpu_dai = &fsi_soc_dai[1], /* FSI B */ + .cpu_dai = &fsi_soc_dai[FSI_PORT_B], .codec_dai = &da7210_dai, .init = fsi_da7210_init, }; @@ -47,7 +47,7 @@ static int __init fsi_da7210_sound_init(void) { int ret; - fsi_da7210_snd_device = platform_device_alloc("soc-audio", -1); + fsi_da7210_snd_device = platform_device_alloc("soc-audio", FSI_PORT_B); if (!fsi_da7210_snd_device) return -ENOMEM; -- cgit v1.2.3 From 55938b106ff4028f9e8b23b1bcb16d7cd615bee7 Mon Sep 17 00:00:00 2001 From: Kulikov Vasiliy Date: Fri, 16 Jul 2010 20:16:17 +0400 Subject: ASoC: davinci: check kzalloc() result (typo) The code checks 'davinci_vc' after kzalloc() and do not checks 'davinci_vcif_dev' that kzalloc() result is assigned to. It seems that it is a typo (autocompletion?). Signed-off-by: Kulikov Vasiliy Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/davinci/davinci-vcif.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/davinci/davinci-vcif.c b/sound/soc/davinci/davinci-vcif.c index 9aa980d38231..48678533da7a 100644 --- a/sound/soc/davinci/davinci-vcif.c +++ b/sound/soc/davinci/davinci-vcif.c @@ -203,7 +203,7 @@ static int davinci_vcif_probe(struct platform_device *pdev) int ret; davinci_vcif_dev = kzalloc(sizeof(struct davinci_vcif_dev), GFP_KERNEL); - if (!davinci_vc) { + if (!davinci_vcif_dev) { dev_dbg(&pdev->dev, "could not allocate memory for private data\n"); return -ENOMEM; -- cgit v1.2.3 From 51b6dfb627d785ee92c2bd1e159e2de47cdc29c3 Mon Sep 17 00:00:00 2001 From: Kulikov Vasiliy Date: Fri, 16 Jul 2010 20:16:34 +0400 Subject: ASoC: imx: check kzalloc() result and fix memory leak If kzalloc() fails we must exit with -ENOMEM. Also we must free allocated runtime->private_data on error as it would be lost on next call to snd_imx_open(). Signed-off-by: Kulikov Vasiliy Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/imx/imx-pcm-dma-mx2.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/imx/imx-pcm-dma-mx2.c b/sound/soc/imx/imx-pcm-dma-mx2.c index 05f19c9284f4..0a595da4811d 100644 --- a/sound/soc/imx/imx-pcm-dma-mx2.c +++ b/sound/soc/imx/imx-pcm-dma-mx2.c @@ -292,12 +292,16 @@ static int snd_imx_open(struct snd_pcm_substream *substream) int ret; iprtd = kzalloc(sizeof(*iprtd), GFP_KERNEL); + if (iprtd == NULL) + return -ENOMEM; runtime->private_data = iprtd; ret = snd_pcm_hw_constraint_integer(substream->runtime, SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) + if (ret < 0) { + kfree(iprtd); return ret; + } snd_soc_set_runtime_hwparams(substream, &snd_imx_hardware); return 0; -- cgit v1.2.3 From 50e8ce14698273d3c493b2e66f323f6b18eac099 Mon Sep 17 00:00:00 2001 From: Kulikov Vasiliy Date: Fri, 16 Jul 2010 20:16:54 +0400 Subject: ASoC: imx: check kzalloc() result and fix memory leak If kzalloc() fails we must exit with -ENOMEM. Also we must free allocated runtime->private_data on error as it would be lost on next call to snd_imx_open(). Signed-off-by: Kulikov Vasiliy Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/imx/imx-pcm-fiq.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/imx/imx-pcm-fiq.c b/sound/soc/imx/imx-pcm-fiq.c index 6b518e07eea9..b2bf27282cd2 100644 --- a/sound/soc/imx/imx-pcm-fiq.c +++ b/sound/soc/imx/imx-pcm-fiq.c @@ -192,6 +192,8 @@ static int snd_imx_open(struct snd_pcm_substream *substream) int ret; iprtd = kzalloc(sizeof(*iprtd), GFP_KERNEL); + if (iprtd == NULL) + return -ENOMEM; runtime->private_data = iprtd; iprtd->substream = substream; @@ -202,8 +204,10 @@ static int snd_imx_open(struct snd_pcm_substream *substream) ret = snd_pcm_hw_constraint_integer(substream->runtime, SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) + if (ret < 0) { + kfree(iprtd); return ret; + } snd_soc_set_runtime_hwparams(substream, &snd_imx_hardware); return 0; -- cgit v1.2.3 From 82f682514a5df89ffb3890627eebf0897b7a84ec Mon Sep 17 00:00:00 2001 From: James Bottomley Date: Mon, 5 Jul 2010 22:53:06 +0200 Subject: pm_qos: Get rid of the allocation in pm_qos_add_request() All current users of pm_qos_add_request() have the ability to supply the memory required by the pm_qos routines, so make them do this and eliminate the kmalloc() with pm_qos_add_request(). This has the double benefit of making the call never fail and allowing it to be called from atomic context. Signed-off-by: James Bottomley Signed-off-by: mark gross Signed-off-by: Rafael J. Wysocki --- sound/core/pcm_native.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) (limited to 'sound') diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 303ac04ff6e4..a3b2a6479246 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -451,13 +451,11 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream, snd_pcm_timer_resolution_change(substream); runtime->status->state = SNDRV_PCM_STATE_SETUP; - if (substream->latency_pm_qos_req) { - pm_qos_remove_request(substream->latency_pm_qos_req); - substream->latency_pm_qos_req = NULL; - } + if (pm_qos_request_active(&substream->latency_pm_qos_req)) + pm_qos_remove_request(&substream->latency_pm_qos_req); if ((usecs = period_to_usecs(runtime)) >= 0) - substream->latency_pm_qos_req = pm_qos_add_request( - PM_QOS_CPU_DMA_LATENCY, usecs); + pm_qos_add_request(&substream->latency_pm_qos_req, + PM_QOS_CPU_DMA_LATENCY, usecs); return 0; _error: /* hardware might be unuseable from this time, @@ -512,8 +510,7 @@ static int snd_pcm_hw_free(struct snd_pcm_substream *substream) if (substream->ops->hw_free) result = substream->ops->hw_free(substream); runtime->status->state = SNDRV_PCM_STATE_OPEN; - pm_qos_remove_request(substream->latency_pm_qos_req); - substream->latency_pm_qos_req = NULL; + pm_qos_remove_request(&substream->latency_pm_qos_req); return result; } -- cgit v1.2.3 From 25d1fbfdd98e6547f2ba3e36787f20d251019591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Tue, 13 Jul 2010 11:27:58 +0200 Subject: fix comment typos concerning "challenge" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Uwe Kleine-König Signed-off-by: Jiri Kosina --- sound/soc/imx/imx-ssi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/imx/imx-ssi.c b/sound/soc/imx/imx-ssi.c index 80b4fee2442b..4fd13d0791b8 100644 --- a/sound/soc/imx/imx-ssi.c +++ b/sound/soc/imx/imx-ssi.c @@ -23,7 +23,7 @@ * between pcm data and GPIO status data changes. Our FIQ handler is not * able to handle this, hence this driver only works with 48000Hz sampling * rate. - * Reading and writing AC97 registers is another challange. The core + * Reading and writing AC97 registers is another challenge. The core * provides us status bits when the read register is updated with *another* * value. When we read the same register two times (and the register still * contains the same value) these status bits are not set. We work -- cgit v1.2.3 From 79c944ad136c4d14388d803b51113dcaaa1d179d Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 19 Jul 2010 15:52:39 +0200 Subject: ALSA: hda-intel - do not mix audio and modem function IDs The function IDs are different for audio and modem. Do not mix them. Also, show the unsolicited bit in the function_id register. Signed-off-by: Jaroslav Kysela --- sound/pci/hda/hda_codec.c | 8 +++++--- sound/pci/hda/hda_codec.h | 5 ++++- sound/pci/hda/hda_proc.c | 7 ++++++- 3 files changed, 15 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index a3d638c8c1fd..6e0de65f1f3a 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -730,15 +730,17 @@ static void /*__devinit*/ setup_fg_nodes(struct hda_codec *codec) total_nodes = snd_hda_get_sub_nodes(codec, AC_NODE_ROOT, &nid); for (i = 0; i < total_nodes; i++, nid++) { function_id = snd_hda_param_read(codec, nid, - AC_PAR_FUNCTION_TYPE) & 0xff; + AC_PAR_FUNCTION_TYPE); switch (function_id) { case AC_GRP_AUDIO_FUNCTION: codec->afg = nid; - codec->function_id = function_id; + codec->afg_function_id = function_id & 0xff; + codec->afg_unsol = (function_id >> 8) & 1; break; case AC_GRP_MODEM_FUNCTION: codec->mfg = nid; - codec->function_id = function_id; + codec->mfg_function_id = function_id & 0xff; + codec->mfg_unsol = (function_id >> 8) & 1; break; default: break; diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 49e939e7e5cd..f96e909f549c 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h @@ -760,7 +760,10 @@ struct hda_codec { hda_nid_t mfg; /* MFG node id */ /* ids */ - u32 function_id; + u8 afg_function_id; + u8 mfg_function_id; + u8 afg_unsol; + u8 mfg_unsol; u32 vendor_id; u32 subsystem_id; u32 revision_id; diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c index f97d35de66c4..f025200f2a62 100644 --- a/sound/pci/hda/hda_proc.c +++ b/sound/pci/hda/hda_proc.c @@ -557,7 +557,12 @@ static void print_codec_info(struct snd_info_entry *entry, else snd_iprintf(buffer, "Not Set\n"); snd_iprintf(buffer, "Address: %d\n", codec->addr); - snd_iprintf(buffer, "Function Id: 0x%x\n", codec->function_id); + if (codec->afg) + snd_iprintf(buffer, "AFG Function Id: 0x%x (unsol %u)\n", + codec->afg_function_id, codec->afg_unsol); + if (codec->mfg) + snd_iprintf(buffer, "MFG Function Id: 0x%x (unsol %u)\n", + codec->mfg_function_id, codec->mfg_unsol); snd_iprintf(buffer, "Vendor Id: 0x%08x\n", codec->vendor_id); snd_iprintf(buffer, "Subsystem Id: 0x%08x\n", codec->subsystem_id); snd_iprintf(buffer, "Revision Id: 0x%x\n", codec->revision_id); -- cgit v1.2.3 From 9e216e8a40428cbf689222148c28d0256fbd0186 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 19 Jul 2010 16:37:39 +0200 Subject: ALSA: pcm core - add a safe check to the silence filling function In situation when appl_ptr is far greater then hw_ptr, the hw_avail value can be greater than buffer_size. Check for this. Signed-off-by: Jaroslav Kysela --- sound/core/pcm_lib.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'sound') diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index bcf95d3ff5c7..e23e0e7ab26f 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c @@ -67,6 +67,8 @@ void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_ufram } else { if (new_hw_ptr == ULONG_MAX) { /* initialization */ snd_pcm_sframes_t avail = snd_pcm_playback_hw_avail(runtime); + if (avail > runtime->buffer_size) + avail = runtime->buffer_size; runtime->silence_filled = avail > 0 ? avail : 0; runtime->silence_start = (runtime->status->hw_ptr + runtime->silence_filled) % -- cgit v1.2.3 From 0b6d092c8eeeb43893503afd2f6c1c67ceafc863 Mon Sep 17 00:00:00 2001 From: Kulikov Vasiliy Date: Fri, 16 Jul 2010 20:15:43 +0400 Subject: ALSA: echoaudio: check kmalloc() result If kmalloc() fails exit with -ENOMEM. Signed-off-by: Kulikov Vasiliy Ack-by: Giuliano Pochini Signed-off-by: Takashi Iwai --- sound/pci/echoaudio/echoaudio.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'sound') diff --git a/sound/pci/echoaudio/echoaudio.c b/sound/pci/echoaudio/echoaudio.c index 668a5ec04499..20763dd03fa0 100644 --- a/sound/pci/echoaudio/echoaudio.c +++ b/sound/pci/echoaudio/echoaudio.c @@ -2250,6 +2250,8 @@ static int snd_echo_resume(struct pci_dev *pci) DE_INIT(("resume start\n")); pci_restore_state(pci); commpage_bak = kmalloc(sizeof(struct echoaudio), GFP_KERNEL); + if (commpage_bak == NULL) + return -ENOMEM; commpage = chip->comm_page; memcpy(commpage_bak, commpage, sizeof(struct comm_page)); -- cgit v1.2.3 From 68bf57001f4995a25ca65f3711ff05b6ea25e8b6 Mon Sep 17 00:00:00 2001 From: Kulikov Vasiliy Date: Fri, 16 Jul 2010 20:15:59 +0400 Subject: ALSA: riptide: check kzalloc() result If kzalloc() fails exit with -ENOMEM. Signed-off-by: Kulikov Vasiliy Signed-off-by: Takashi Iwai --- sound/pci/riptide/riptide.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'sound') diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c index 59d79962f236..f64fb7d988cb 100644 --- a/sound/pci/riptide/riptide.c +++ b/sound/pci/riptide/riptide.c @@ -1615,7 +1615,10 @@ static int snd_riptide_playback_open(struct snd_pcm_substream *substream) chip->playback_substream[sub_num] = substream; runtime->hw = snd_riptide_playback; + data = kzalloc(sizeof(struct pcmhw), GFP_KERNEL); + if (data == NULL) + return -ENOMEM; data->paths = lbus_play_paths[sub_num]; data->id = play_ids[sub_num]; data->source = play_sources[sub_num]; @@ -1635,7 +1638,10 @@ static int snd_riptide_capture_open(struct snd_pcm_substream *substream) chip->capture_substream = substream; runtime->hw = snd_riptide_capture; + data = kzalloc(sizeof(struct pcmhw), GFP_KERNEL); + if (data == NULL) + return -ENOMEM; data->paths = lbus_rec_path; data->id = PADC; data->source = ACLNK2PADC; -- cgit v1.2.3 From ab85457f0a46b9dab17aaa01ceefc755b124d48d Mon Sep 17 00:00:00 2001 From: Jerone Young Date: Mon, 19 Jul 2010 08:30:58 -0500 Subject: ALSA: hda - Add conexant quirk for AMD based Lenovo G series machines This is a follow on patch adds support for AMD based Lenovo G series machines, such as the Lenovo G555. Signed-off-by: Jerone Young Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_conexant.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 3b789ee548b4..c99425ab2e70 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -3040,8 +3040,10 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { SND_PCI_QUIRK(0x17aa, 0x21b2, "Thinkpad X100e", CXT5066_IDEAPAD), SND_PCI_QUIRK(0x17aa, 0x21b3, "Thinkpad Edge 13 (197)", CXT5066_IDEAPAD), SND_PCI_QUIRK(0x17aa, 0x21b4, "Thinkpad Edge", CXT5066_IDEAPAD), + SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), + SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G series", CXT5066_IDEAPAD), + SND_PCI_QUIRK(0x17aa, 0x3938, "Lenovo G series (AMD)", CXT5066_IDEAPAD), SND_PCI_QUIRK(0x17aa, 0x3a0d, "ideapad", CXT5066_IDEAPAD), - SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), {} }; -- cgit v1.2.3 From 8a0bbbeb588f2b0cbb2f69699926f32d2cda5138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eric=20B=C3=A9nard?= Date: Mon, 19 Jul 2010 10:40:32 +0200 Subject: ASoC: eukrea-tlv320: add support for cpuimx35sd MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Eric Bénard Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/imx/Kconfig | 2 +- sound/soc/imx/eukrea-tlv320.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/imx/Kconfig b/sound/soc/imx/Kconfig index 2f0d6d3e75dc..52dac5e3874c 100644 --- a/sound/soc/imx/Kconfig +++ b/sound/soc/imx/Kconfig @@ -32,6 +32,6 @@ config SND_SOC_EUKREA_TLV320 select SND_SOC_TLV320AIC23 help Enable I2S based access to the TLV320AIC23B codec attached - to the SSI4 interface + to the SSI interface endif # SND_IMX_SOC diff --git a/sound/soc/imx/eukrea-tlv320.c b/sound/soc/imx/eukrea-tlv320.c index 45f5e4b32cb5..f15dfbdc47ee 100644 --- a/sound/soc/imx/eukrea-tlv320.c +++ b/sound/soc/imx/eukrea-tlv320.c @@ -101,7 +101,8 @@ static int __init eukrea_tlv320_init(void) { int ret; - if (!machine_is_eukrea_cpuimx27() && !machine_is_eukrea_cpuimx25sd()) + if (!machine_is_eukrea_cpuimx27() && !machine_is_eukrea_cpuimx25sd() + && !machine_is_eukrea_cpuimx35sd()) /* return happy. We might run on a totally different machine */ return 0; -- cgit v1.2.3 From 395e4b7362f4776d357856fdf93cdb2302d8555a Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Mon, 10 May 2010 21:06:14 +0100 Subject: ASoC: Explicitly disable DC servo on WM hubs headphone powerdown Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm_hubs.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'sound') diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c index 16f1a57da08a..2cb81538cd91 100644 --- a/sound/soc/codecs/wm_hubs.c +++ b/sound/soc/codecs/wm_hubs.c @@ -410,6 +410,8 @@ static int hp_event(struct snd_soc_dapm_widget *w, WM8993_HPOUT1L_DLY | WM8993_HPOUT1R_DLY, 0); + snd_soc_write(codec, WM8993_DC_SERVO_0, 0); + snd_soc_update_bits(codec, WM8993_POWER_MANAGEMENT_1, WM8993_HPOUT1L_ENA | WM8993_HPOUT1R_ENA, 0); -- cgit v1.2.3 From a3257ba869003ad10f292fea64bf31e2d3e2afff Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Mon, 19 Jul 2010 14:02:34 +0100 Subject: ASoC: Implement WM8994 AIF1ADC2 paths Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8994.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'sound') diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index c41cf47f4009..0ddb6f1ce6fb 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -2361,6 +2361,20 @@ SOC_DAPM_SINGLE("AIF2 Switch", WM8994_AIF1_ADC1_RIGHT_MIXER_ROUTING, 0, 1, 0), }; +static const struct snd_kcontrol_new aif1adc2l_mix[] = { +SOC_DAPM_SINGLE("DMIC Switch", WM8994_AIF1_ADC2_LEFT_MIXER_ROUTING, + 1, 1, 0), +SOC_DAPM_SINGLE("AIF2 Switch", WM8994_AIF1_ADC2_LEFT_MIXER_ROUTING, + 0, 1, 0), +}; + +static const struct snd_kcontrol_new aif1adc2r_mix[] = { +SOC_DAPM_SINGLE("DMIC Switch", WM8994_AIF1_ADC2_RIGHT_MIXER_ROUTING, + 1, 1, 0), +SOC_DAPM_SINGLE("AIF2 Switch", WM8994_AIF1_ADC2_RIGHT_MIXER_ROUTING, + 0, 1, 0), +}; + static const struct snd_kcontrol_new aif2dac2l_mix[] = { SOC_DAPM_SINGLE("Right Sidetone Switch", WM8994_DAC2_LEFT_MIXER_ROUTING, 5, 1, 0), @@ -2527,6 +2541,11 @@ SND_SOC_DAPM_MIXER("AIF1ADC1L Mixer", SND_SOC_NOPM, 0, 0, SND_SOC_DAPM_MIXER("AIF1ADC1R Mixer", SND_SOC_NOPM, 0, 0, aif1adc1r_mix, ARRAY_SIZE(aif1adc1r_mix)), +SND_SOC_DAPM_MIXER("AIF1ADC2L Mixer", SND_SOC_NOPM, 0, 0, + aif1adc2l_mix, ARRAY_SIZE(aif1adc2l_mix)), +SND_SOC_DAPM_MIXER("AIF1ADC2R Mixer", SND_SOC_NOPM, 0, 0, + aif1adc2r_mix, ARRAY_SIZE(aif1adc2r_mix)), + SND_SOC_DAPM_MIXER("AIF2DAC2L Mixer", SND_SOC_NOPM, 0, 0, aif2dac2l_mix, ARRAY_SIZE(aif2dac2l_mix)), SND_SOC_DAPM_MIXER("AIF2DAC2R Mixer", SND_SOC_NOPM, 0, 0, @@ -2689,6 +2708,14 @@ static const struct snd_soc_dapm_route intercon[] = { { "AIF1ADC1R Mixer", "ADC/DMIC Switch", "ADCR Mux" }, { "AIF1ADC1R Mixer", "AIF2 Switch", "AIF2DACR" }, + { "AIF1ADC2L", NULL, "AIF1ADC2L Mixer" }, + { "AIF1ADC2L Mixer", "DMIC Switch", "DMIC2L" }, + { "AIF1ADC2L Mixer", "AIF2 Switch", "AIF2DACL" }, + + { "AIF1ADC2R", NULL, "AIF1ADC2R Mixer" }, + { "AIF1ADC2R Mixer", "DMIC Switch", "DMIC2R" }, + { "AIF1ADC2R Mixer", "AIF2 Switch", "AIF2DACR" }, + /* Pin level routing for AIF3 */ { "AIF1DAC1L", NULL, "AIF1DAC Mux" }, { "AIF1DAC1R", NULL, "AIF1DAC Mux" }, -- cgit v1.2.3 From 5c519767b6ec0e54e5c868c0fceebba968f88374 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Tue, 20 Jul 2010 14:28:30 +0900 Subject: ASoC:Support Samsung SoC(S5P) in I2Sv2 This patch modify I2Sv2 driver to support Samsung SoC(S5PV210). Signed-off-by: Chanwoo Choi Signed-off-by: Joonyoung Shim Signed-off-by: Kyungmin Park Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/s3c24xx/s3c-i2s-v2.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/s3c24xx/s3c-i2s-v2.c b/sound/soc/s3c24xx/s3c-i2s-v2.c index 13311c8cf965..64376b2aac73 100644 --- a/sound/soc/s3c24xx/s3c-i2s-v2.c +++ b/sound/soc/s3c24xx/s3c-i2s-v2.c @@ -32,7 +32,8 @@ #undef S3C_IIS_V2_SUPPORTED -#if defined(CONFIG_CPU_S3C2412) || defined(CONFIG_CPU_S3C2413) +#if defined(CONFIG_CPU_S3C2412) || defined(CONFIG_CPU_S3C2413) \ + || defined(CONFIG_CPU_S5PV210) #define S3C_IIS_V2_SUPPORTED #endif -- cgit v1.2.3 From 48519f0ae03bc7e86b3dc93e56f1334d53803770 Mon Sep 17 00:00:00 2001 From: Sekhar Nori Date: Mon, 19 Jul 2010 12:31:16 +0530 Subject: ASoC: davinci: let platform data define edma queue numbers Currently the EDMA queue to be used by for servicing ASP through internal RAM is fixed to EDMAQ_0 and that to service internal RAM from external RAM is fixed to EDMAQ_1. This may not be the desirable configuration on all platforms. For example, on DM365, queue 0 has large fifo size and is more suitable for video transfers. Having audio and video transfers on the same queue may lead to starvation on audio side. platform data as defined currently passes a queue number to the driver but that remains unused inside the driver. Fix this by defining one queue each for ASP and RAM transfers in the platform data and using it inside the driver. Since EDMAQ_0 maps to 0, thats the queue that will be used if the asp queue number is not initialized. None of the platforms currently utilize ping-pong transfers through internal RAM so that functionality remains unchanged too. This patch has been tested on DM644x and OMAP-L138 EVMs. Signed-off-by: Sekhar Nori Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/davinci/davinci-i2s.c | 10 ++++++++++ sound/soc/davinci/davinci-mcasp.c | 6 ++++-- sound/soc/davinci/davinci-pcm.c | 5 +++-- sound/soc/davinci/davinci-pcm.h | 3 ++- 4 files changed, 19 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c index b251bc9a9812..9e8932abf158 100644 --- a/sound/soc/davinci/davinci-i2s.c +++ b/sound/soc/davinci/davinci-i2s.c @@ -648,6 +648,8 @@ static int davinci_i2s_probe(struct platform_device *pdev) struct snd_platform_data *pdata = pdev->dev.platform_data; struct davinci_mcbsp_dev *dev; struct resource *mem, *ioarea, *res; + enum dma_event_q asp_chan_q = EVENTQ_0; + enum dma_event_q ram_chan_q = EVENTQ_1; int ret; mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -676,7 +678,15 @@ static int davinci_i2s_probe(struct platform_device *pdev) pdata->sram_size_capture; dev->clk_input_pin = pdata->clk_input_pin; dev->i2s_accurate_sck = pdata->i2s_accurate_sck; + asp_chan_q = pdata->asp_chan_q; + ram_chan_q = pdata->ram_chan_q; } + + dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].asp_chan_q = asp_chan_q; + dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].ram_chan_q = ram_chan_q; + dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].asp_chan_q = asp_chan_q; + dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].ram_chan_q = ram_chan_q; + dev->clk = clk_get(&pdev->dev, NULL); if (IS_ERR(dev->clk)) { ret = -ENODEV; diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index d3955096d872..b24720894af6 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c @@ -890,7 +890,8 @@ static int davinci_mcasp_probe(struct platform_device *pdev) dev->rxnumevt = pdata->rxnumevt; dma_data = &dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]; - dma_data->eventq_no = pdata->eventq_no; + dma_data->asp_chan_q = pdata->asp_chan_q; + dma_data->ram_chan_q = pdata->ram_chan_q; dma_data->dma_addr = (dma_addr_t) (pdata->tx_dma_offset + io_v2p(dev->base)); @@ -904,7 +905,8 @@ static int davinci_mcasp_probe(struct platform_device *pdev) dma_data->channel = res->start; dma_data = &dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]; - dma_data->eventq_no = pdata->eventq_no; + dma_data->asp_chan_q = pdata->asp_chan_q; + dma_data->ram_chan_q = pdata->ram_chan_q; dma_data->dma_addr = (dma_addr_t)(pdata->rx_dma_offset + io_v2p(dev->base)); diff --git a/sound/soc/davinci/davinci-pcm.c b/sound/soc/davinci/davinci-pcm.c index def454e42fcb..a7124116d2e0 100644 --- a/sound/soc/davinci/davinci-pcm.c +++ b/sound/soc/davinci/davinci-pcm.c @@ -381,7 +381,7 @@ static int request_ping_pong(struct snd_pcm_substream *substream, /* Request ram master channel */ link = prtd->ram_channel = edma_alloc_channel(EDMA_CHANNEL_ANY, davinci_pcm_dma_irq, substream, - EVENTQ_1); + prtd->params->ram_chan_q); if (link < 0) goto exit1; @@ -477,7 +477,8 @@ static int davinci_pcm_dma_request(struct snd_pcm_substream *substream) /* Request asp master DMA channel */ link = prtd->asp_channel = edma_alloc_channel(params->channel, - davinci_pcm_dma_irq, substream, EVENTQ_0); + davinci_pcm_dma_irq, substream, + prtd->params->asp_chan_q); if (link < 0) goto exit1; diff --git a/sound/soc/davinci/davinci-pcm.h b/sound/soc/davinci/davinci-pcm.h index 0764944cf10f..b799a02333d8 100644 --- a/sound/soc/davinci/davinci-pcm.h +++ b/sound/soc/davinci/davinci-pcm.h @@ -21,7 +21,8 @@ struct davinci_pcm_dma_params { unsigned short acnt; dma_addr_t dma_addr; /* device physical address for DMA */ unsigned sram_size; - enum dma_event_q eventq_no; /* event queue number */ + enum dma_event_q asp_chan_q; /* event queue number for ASP channel */ + enum dma_event_q ram_chan_q; /* event queue number for RAM channel */ unsigned char data_type; /* xfer data type */ unsigned char convert_mono_stereo; unsigned int fifo_level; -- cgit v1.2.3 From d1ce6b200cba6bfd76e17e327b5052aa76a46abf Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Tue, 20 Jul 2010 10:13:14 +0100 Subject: ASoC: Unconditionally enable WM8994 AIF1ADC TDM mode AIF1ADC TDM mode has no effect other than causing the ADCDAT line to be tristated rather than driven low on clock cycles where there is no data to be transmitted. If the clock cycle is idle then there should be no devices using the data so tristating should have no adverse effects. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8994.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'sound') diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 0ddb6f1ce6fb..a87046a96f2a 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -4074,6 +4074,11 @@ static int wm8994_codec_probe(struct platform_device *pdev) 1 << WM8994_AIF2DAC_3D_GAIN_SHIFT, 1 << WM8994_AIF2DAC_3D_GAIN_SHIFT); + /* Unconditionally enable AIF1 ADC TDM mode; it only affects + * behaviour on idle TDM clock cycles. */ + snd_soc_update_bits(codec, WM8994_AIF1_CONTROL_1, + WM8994_AIF1ADC_TDM, WM8994_AIF1ADC_TDM); + wm8994_update_class_w(codec); ret = snd_soc_register_codec(codec); -- cgit v1.2.3 From cd7643bfb772dc7103ed6fc8dda6b233a8e14178 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 20 Jul 2010 12:11:25 +0200 Subject: ALSA: hda-intel - fix function_id rework (add missing bitmask) Signed-off-by: Jaroslav Kysela --- sound/pci/hda/hda_codec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 6e0de65f1f3a..3252945f3743 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -731,7 +731,7 @@ static void /*__devinit*/ setup_fg_nodes(struct hda_codec *codec) for (i = 0; i < total_nodes; i++, nid++) { function_id = snd_hda_param_read(codec, nid, AC_PAR_FUNCTION_TYPE); - switch (function_id) { + switch (function_id & 0xff) { case AC_GRP_AUDIO_FUNCTION: codec->afg = nid; codec->afg_function_id = function_id & 0xff; -- cgit v1.2.3 From 01ea6ba2bce64112623dbf8c45ce487062b65446 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Tue, 20 Jul 2010 15:49:09 +0300 Subject: ASoC: TWL4030: Add configurable delay after digimic enable When digital microphones are connected to twl, delay is needed after enabling the digimic interface of the codec. Add new parameter for the setup data, which can be used to pass the apropriate delay in ms after the digimic interface has been enabled. Without certain delay (in certain HW configuration) the beggining of the recorded sample contains a glitch, which is generated by the digital microphones. Delaying the micbias1, 2 (which is the bias for the digimic0 or 1) does not help, since the glitch is coming after switching the digimic interface. Reversing the micbias and digimic enable order does not work either (in that case the wait need to be added after the micbias enabled). Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl4030.c | 25 +++++++++++++++++++++---- sound/soc/codecs/twl4030.h | 1 + 2 files changed, 22 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index 6fd6d0b10555..bd557c2bcb8c 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -143,6 +143,9 @@ struct twl4030_priv { u8 earpiece_enabled; u8 predrivel_enabled, predriver_enabled; u8 carkitl_enabled, carkitr_enabled; + + /* Delay needed after enabling the digimic interface */ + unsigned int digimic_delay; }; /* @@ -312,6 +315,8 @@ static void twl4030_init_chip(struct platform_device *pdev) if (!setup) return; + twl4030->digimic_delay = setup->digimic_delay; + /* Configuration for headset ramp delay from setup data */ if (setup->sysclk != twl4030->sysclk) dev_warn(codec->dev, @@ -855,6 +860,16 @@ static int headsetrpga_event(struct snd_soc_dapm_widget *w, return 0; } +static int digimic_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(w->codec); + + if (twl4030->digimic_delay) + mdelay(twl4030->digimic_delay); + return 0; +} + /* * Some of the gain controls in TWL (mostly those which are associated with * the outputs) are implemented in an interesting way: @@ -1439,10 +1454,12 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { SND_SOC_DAPM_PGA("ADC Physical Right", TWL4030_REG_AVADC_CTL, 1, 0, NULL, 0), - SND_SOC_DAPM_PGA("Digimic0 Enable", - TWL4030_REG_ADCMICSEL, 1, 0, NULL, 0), - SND_SOC_DAPM_PGA("Digimic1 Enable", - TWL4030_REG_ADCMICSEL, 3, 0, NULL, 0), + SND_SOC_DAPM_PGA_E("Digimic0 Enable", + TWL4030_REG_ADCMICSEL, 1, 0, NULL, 0, + digimic_event, SND_SOC_DAPM_POST_PMU), + SND_SOC_DAPM_PGA_E("Digimic1 Enable", + TWL4030_REG_ADCMICSEL, 3, 0, NULL, 0, + digimic_event, SND_SOC_DAPM_POST_PMU), SND_SOC_DAPM_MICBIAS("Mic Bias 1", TWL4030_REG_MICBIAS_CTL, 0, 0), SND_SOC_DAPM_MICBIAS("Mic Bias 2", TWL4030_REG_MICBIAS_CTL, 1, 0), diff --git a/sound/soc/codecs/twl4030.h b/sound/soc/codecs/twl4030.h index 788e3d125099..6c57430f6e24 100644 --- a/sound/soc/codecs/twl4030.h +++ b/sound/soc/codecs/twl4030.h @@ -41,6 +41,7 @@ extern struct snd_soc_codec_device soc_codec_dev_twl4030; struct twl4030_setup_data { unsigned int ramp_delay_value; + unsigned int digimic_delay; /* in ms */ unsigned int sysclk; unsigned int offset_cncl_path; unsigned int check_defaults:1; -- cgit v1.2.3 From ff388f270d926d95d70e5b3d373c9cb97b38c8b1 Mon Sep 17 00:00:00 2001 From: Christian Dietrich Date: Wed, 21 Jul 2010 14:35:17 +0200 Subject: sound/oss: Remove dead CONFIG_SOFTOSS* CONFIG_SOFTOSS* doesn't exist in Kconfig or somewhere else, therefore removing all references for it from the source code. Signed-off-by: Christian Dietrich Signed-off-by: Takashi Iwai --- sound/oss/vidc.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'sound') diff --git a/sound/oss/vidc.c b/sound/oss/vidc.c index ac39a531df19..f0e0caa53200 100644 --- a/sound/oss/vidc.c +++ b/sound/oss/vidc.c @@ -491,9 +491,6 @@ static void __init attach_vidc(struct address_info *hw_config) vidc_adev = adev; vidc_mixer_set(SOUND_MIXER_VOLUME, (85 | 85 << 8)); -#if defined(CONFIG_SOUND_SOFTOSS) || defined(CONFIG_SOUND_SOFTOSS_MODULE) - softoss_dev = adev; -#endif return; irq_failed: -- cgit v1.2.3 From a7e7cd5bd7d1e0134032b8db5e64ceb9dac8b3ca Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Wed, 21 Jul 2010 14:12:16 +0900 Subject: ASoC: da7210: Add HeadPhone Playback Volume control HeadPhone Playback Volume control register of DA7210 has reserved area. This patch considered it as mute. Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/da7210.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/da7210.c b/sound/soc/codecs/da7210.c index a83aa187a7f2..3e42d1e0e601 100644 --- a/sound/soc/codecs/da7210.c +++ b/sound/soc/codecs/da7210.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "da7210.h" @@ -136,6 +137,29 @@ #define DA7210_VERSION "0.0.1" +/* + * Playback Volume + * + * max : 0x3F (+15.0 dB) + * (1.5 dB step) + * min : 0x11 (-54.0 dB) + * mute : 0x10 + * reserved : 0x00 - 0x0F + * + * ** FIXME ** + * + * Reserved area are considered as "mute". + * -> min = -79.5 dB + */ +static const DECLARE_TLV_DB_SCALE(hp_out_tlv, -7950, 150, 1); + +static const struct snd_kcontrol_new da7210_snd_controls[] = { + + SOC_DOUBLE_R_TLV("HeadPhone Playback Volume", + DA7210_HP_L_VOL, DA7210_HP_R_VOL, + 0, 0x3F, 0, hp_out_tlv), +}; + /* Codec private data */ struct da7210_priv { struct snd_soc_codec codec; @@ -218,10 +242,6 @@ static int da7210_startup(struct snd_pcm_substream *substream, struct snd_soc_codec *codec = dai->codec; if (is_play) { - /* PlayBack Volume 40 */ - snd_soc_update_bits(codec, DA7210_HP_L_VOL, 0x3F, 40); - snd_soc_update_bits(codec, DA7210_HP_R_VOL, 0x3F, 40); - /* Enable Out */ snd_soc_update_bits(codec, DA7210_OUTMIX_L, 0x1F, 0x10); snd_soc_update_bits(codec, DA7210_OUTMIX_R, 0x1F, 0x10); @@ -647,6 +667,9 @@ static int da7210_probe(struct platform_device *pdev) if (ret < 0) goto pcm_err; + snd_soc_add_controls(da7210_codec, da7210_snd_controls, + ARRAY_SIZE(da7210_snd_controls)); + dev_info(&pdev->dev, "DA7210 Audio Codec %s\n", DA7210_VERSION); pcm_err: -- cgit v1.2.3 From 1ab1d63a85cee2545272f63a7644e9f855cb65d0 Mon Sep 17 00:00:00 2001 From: Grant Likely Date: Thu, 24 Jun 2010 15:14:37 -0600 Subject: of/platform: remove all of_bus_type and of_platform_bus_type references Both of_bus_type and of_platform_bus_type are just #define aliases for the platform bus. This patch removes all references to them and switches to the of_register_platform_driver()/of_unregister_platform_driver() API for registering. Subsequent patches will convert each user of of_register_platform_driver() into plain platform_drivers without the of_platform_driver shim. At which point the of_register_platform_driver()/of_unregister_platform_driver() functions can be removed. Signed-off-by: Grant Likely Acked-by: David S. Miller --- sound/sparc/amd7930.c | 4 ++-- sound/sparc/cs4231.c | 4 ++-- sound/sparc/dbri.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) (limited to 'sound') diff --git a/sound/sparc/amd7930.c b/sound/sparc/amd7930.c index 43c63d441087..9eb1a4e0363b 100644 --- a/sound/sparc/amd7930.c +++ b/sound/sparc/amd7930.c @@ -1075,7 +1075,7 @@ static struct of_platform_driver amd7930_sbus_driver = { static int __init amd7930_init(void) { - return of_register_driver(&amd7930_sbus_driver, &of_bus_type); + return of_register_platform_driver(&amd7930_sbus_driver); } static void __exit amd7930_exit(void) @@ -1092,7 +1092,7 @@ static void __exit amd7930_exit(void) amd7930_list = NULL; - of_unregister_driver(&amd7930_sbus_driver); + of_unregister_platform_driver(&amd7930_sbus_driver); } module_init(amd7930_init); diff --git a/sound/sparc/cs4231.c b/sound/sparc/cs4231.c index f7f05c246303..68570ee2c9bb 100644 --- a/sound/sparc/cs4231.c +++ b/sound/sparc/cs4231.c @@ -2120,12 +2120,12 @@ static struct of_platform_driver cs4231_driver = { static int __init cs4231_init(void) { - return of_register_driver(&cs4231_driver, &of_bus_type); + return of_register_platform_driver(&cs4231_driver); } static void __exit cs4231_exit(void) { - of_unregister_driver(&cs4231_driver); + of_unregister_platform_driver(&cs4231_driver); } module_init(cs4231_init); diff --git a/sound/sparc/dbri.c b/sound/sparc/dbri.c index 491ce71c84b6..c421901c48d0 100644 --- a/sound/sparc/dbri.c +++ b/sound/sparc/dbri.c @@ -2699,12 +2699,12 @@ static struct of_platform_driver dbri_sbus_driver = { /* Probe for the dbri chip and then attach the driver. */ static int __init dbri_init(void) { - return of_register_driver(&dbri_sbus_driver, &of_bus_type); + return of_register_platform_driver(&dbri_sbus_driver); } static void __exit dbri_exit(void) { - of_unregister_driver(&dbri_sbus_driver); + of_unregister_platform_driver(&dbri_sbus_driver); } module_init(dbri_init); -- cgit v1.2.3 From 2385b789f1525542396d8f6b0cc37c1eb2493b4c Mon Sep 17 00:00:00 2001 From: David Henningsson Date: Wed, 2 Jun 2010 16:56:41 +0200 Subject: ALSA: hda - Ensure codec patch files are checked for the correct codec ID Signed-off-by: David Henningsson Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_hwdep.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_hwdep.c b/sound/pci/hda/hda_hwdep.c index a1fc83753cc6..bf3ced51e0f8 100644 --- a/sound/pci/hda/hda_hwdep.c +++ b/sound/pci/hda/hda_hwdep.c @@ -649,7 +649,9 @@ static void parse_codec_mode(char *buf, struct hda_bus *bus, *codecp = NULL; if (sscanf(buf, "%i %i %i", &vendorid, &subid, &caddr) == 3) { list_for_each_entry(codec, &bus->codec_list, list) { - if (codec->addr == caddr) { + if (codec->vendor_id == vendorid && + codec->subsystem_id == subid && + codec->addr == caddr) { *codecp = codec; break; } -- cgit v1.2.3 From 2232e238295d8ea707fe4271ffbfd4f32346aa81 Mon Sep 17 00:00:00 2001 From: Kulikov Vasiliy Date: Mon, 26 Jul 2010 12:28:32 +0400 Subject: sound: oss: au1550_ac97: simplify au1550_delay() au1550_delay() uses loop with schedule_timeout() to unconditionally wait for msec. Use schedule_timeout_uninteruptible() instead. Signed-off-by: Kulikov Vasiliy Signed-off-by: Takashi Iwai --- sound/oss/au1550_ac97.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) (limited to 'sound') diff --git a/sound/oss/au1550_ac97.c b/sound/oss/au1550_ac97.c index 0fd256ceea6b..c4a4cdc07ab9 100644 --- a/sound/oss/au1550_ac97.c +++ b/sound/oss/au1550_ac97.c @@ -163,19 +163,10 @@ ld2(unsigned int x) static void au1550_delay(int msec) { - unsigned long tmo; - signed long tmo2; - if (in_interrupt()) return; - tmo = jiffies + (msec * HZ) / 1000; - for (;;) { - tmo2 = tmo - jiffies; - if (tmo2 <= 0) - break; - schedule_timeout(tmo2); - } + schedule_timeout_uninterruptible(msecs_to_jiffies(msec)); } static u16 -- cgit v1.2.3 From e5de3dfc391cceff6a4a3a0bb9c9c349a2e7c275 Mon Sep 17 00:00:00 2001 From: Kulikov Vasiliy Date: Mon, 26 Jul 2010 12:29:22 +0400 Subject: sound: oss: waveartist: simplify waveartist_sleep() waveartist_sleep() uses loop with schedule_timeout() to unconditionally wait for msec. Use schedule_timeout_uninteruptible() instead. Signed-off-by: Kulikov Vasiliy Signed-off-by: Takashi Iwai --- sound/oss/waveartist.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'sound') diff --git a/sound/oss/waveartist.c b/sound/oss/waveartist.c index e688dde6bbde..52468742d9f2 100644 --- a/sound/oss/waveartist.c +++ b/sound/oss/waveartist.c @@ -184,14 +184,8 @@ waveartist_iack(wavnc_info *devc) static inline int waveartist_sleep(int timeout_ms) { - unsigned int timeout = timeout_ms * 10 * HZ / 100; - - do { - set_current_state(TASK_INTERRUPTIBLE); - timeout = schedule_timeout(timeout); - } while (timeout); - - return 0; + unsigned int timeout = msecs_to_jiffies(timeout_ms*100); + return schedule_timeout_interruptible(timeout); } static int -- cgit v1.2.3 From 7ccc3eface57b6e1773fce009dac8a3da081b8b1 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 26 Jul 2010 17:00:15 +0200 Subject: ALSA: hda - Fix max amp cap calculation for IDT/STAC codecs The commit afbd9b8448f4b7d15673c6858012f384f18d28b8 ALSA: hda - Limit the amp value to write introduced a regression for codec setups with amp offsets like IDT/STAC codecs. The limit value should be a raw value without offset calculation. Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_codec.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 501cbc411a83..e5c3484388f0 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -1629,7 +1629,8 @@ update_amp_value(struct hda_codec *codec, hda_nid_t nid, if (val > 0) val += ofs; - maxval = get_amp_max_value(codec, nid, dir, ofs); + /* ofs = 0: raw max value */ + maxval = get_amp_max_value(codec, nid, dir, 0); if (val > maxval) val = maxval; return snd_hda_codec_amp_update(codec, nid, ch, dir, idx, -- cgit v1.2.3 From b93cc9f19bade9e9ddd41958352168dc0d266f48 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Mon, 26 Jul 2010 09:59:15 +0300 Subject: ASoC: TWL4030: Capture route DAPM event fix There is no need to handle POST_PMU, POST_PMD event with the Capture Route widget. It is enough to handle POST_REG event, since that will come when the user changes the routing, and we will switch the needed bits in the registers. Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl4030.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index bd557c2bcb8c..d401c597d38f 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -1432,11 +1432,9 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { TX2 Left/Right: either analog Left/Right or Digimic1 */ SND_SOC_DAPM_MUX_E("TX1 Capture Route", SND_SOC_NOPM, 0, 0, &twl4030_dapm_micpathtx1_control, micpath_event, - SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD| SND_SOC_DAPM_POST_REG), SND_SOC_DAPM_MUX_E("TX2 Capture Route", SND_SOC_NOPM, 0, 0, &twl4030_dapm_micpathtx2_control, micpath_event, - SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD| SND_SOC_DAPM_POST_REG), /* Analog input mixers for the capture amplifiers */ -- cgit v1.2.3 From 63818c448ac6f4dd75aa42997acaa746f86acb6b Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Wed, 28 Jul 2010 16:58:42 +0800 Subject: ALSA: hpimsgx: fix wrong sizeof The correct size should be sizeof(gRESP_HPI_SUBSYS_FIND_ADAPTERS), sizeof(&gRESP_HPI_SUBSYS_FIND_ADAPTERS) is incorrect. Signed-off-by: Axel Lin Signed-off-by: Takashi Iwai --- sound/pci/asihpi/hpimsgx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/asihpi/hpimsgx.c b/sound/pci/asihpi/hpimsgx.c index 2ee90dc3d897..f01ab964f602 100644 --- a/sound/pci/asihpi/hpimsgx.c +++ b/sound/pci/asihpi/hpimsgx.c @@ -741,7 +741,7 @@ static void HPIMSGX__reset(u16 adapter_index) hpi_init_response(&hr, HPI_OBJ_SUBSYSTEM, HPI_SUBSYS_FIND_ADAPTERS, 0); memcpy(&gRESP_HPI_SUBSYS_FIND_ADAPTERS, &hr, - sizeof(&gRESP_HPI_SUBSYS_FIND_ADAPTERS)); + sizeof(gRESP_HPI_SUBSYS_FIND_ADAPTERS)); for (adapter = 0; adapter < HPI_MAX_ADAPTERS; adapter++) { -- cgit v1.2.3 From f430a27f05d42d26d3e438aa262a92565170573f Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 28 Jul 2010 15:26:54 +0300 Subject: ASoC: tlv320dac33: Revisit the FIFO Mode1 handling Replace the hardwired latency definition with platform data parameter, and simplify the nSample parameter calculation. Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/tlv320dac33.c | 71 ++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 37 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/tlv320dac33.c b/sound/soc/codecs/tlv320dac33.c index 2fa946ce23a2..ced6fbbc9d91 100644 --- a/sound/soc/codecs/tlv320dac33.c +++ b/sound/soc/codecs/tlv320dac33.c @@ -49,8 +49,6 @@ #define NSAMPLE_MAX 5700 -#define LATENCY_TIME_MS 20 - #define MODE7_LTHR 10 #define MODE7_UTHR (DAC33_BUFFER_SIZE_SAMPLES - 10) @@ -107,6 +105,8 @@ struct tlv320dac33_priv { * this */ enum dac33_fifo_modes fifo_mode;/* FIFO mode selection */ unsigned int nsample; /* burst read amount from host */ + int mode1_latency; /* latency caused by the i2c writes in + * us */ u8 burst_bclkdiv; /* BCLK divider value in burst mode */ unsigned int burst_rate; /* Interface speed in Burst modes */ @@ -649,7 +649,7 @@ static inline void dac33_prefill_handler(struct tlv320dac33_priv *dac33) switch (dac33->fifo_mode) { case DAC33_FIFO_MODE1: dac33_write16(codec, DAC33_NSAMPLE_MSB, - DAC33_THRREG(dac33->nsample + dac33->alarm_threshold)); + DAC33_THRREG(dac33->nsample)); /* Take the timestamps */ spin_lock_irq(&dac33->lock); @@ -798,6 +798,10 @@ static void dac33_shutdown(struct snd_pcm_substream *substream, struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); dac33->substream = NULL; + + /* Reset the nSample restrictions */ + dac33->nsample_min = 0; + dac33->nsample_max = NSAMPLE_MAX; } static int dac33_hw_params(struct snd_pcm_substream *substream, @@ -1040,48 +1044,38 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream) struct snd_soc_device *socdev = rtd->socdev; struct snd_soc_codec *codec = socdev->card->codec; struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + unsigned int period_size = substream->runtime->period_size; + unsigned int rate = substream->runtime->rate; unsigned int nsample_limit; /* In bypass mode we don't need to calculate */ if (!dac33->fifo_mode) return; - /* Number of samples (16bit, stereo) in one period */ - dac33->nsample_min = snd_pcm_lib_period_bytes(substream) / 4; - - /* Number of samples (16bit, stereo) in ALSA buffer */ - dac33->nsample_max = snd_pcm_lib_buffer_bytes(substream) / 4; - /* Subtract one period from the total */ - dac33->nsample_max -= dac33->nsample_min; - - /* Number of samples for LATENCY_TIME_MS / 2 */ - dac33->alarm_threshold = substream->runtime->rate / - (1000 / (LATENCY_TIME_MS / 2)); - - /* Find and fix up the lowest nsmaple limit */ - nsample_limit = substream->runtime->rate / (1000 / LATENCY_TIME_MS); - - if (dac33->nsample_min < nsample_limit) - dac33->nsample_min = nsample_limit; - - if (dac33->nsample < dac33->nsample_min) - dac33->nsample = dac33->nsample_min; - - /* - * Find and fix up the highest nsmaple limit - * In order to not overflow the DAC33 buffer substract the - * alarm_threshold value from the size of the DAC33 buffer - */ - nsample_limit = DAC33_BUFFER_SIZE_SAMPLES - dac33->alarm_threshold; - - if (dac33->nsample_max > nsample_limit) - dac33->nsample_max = nsample_limit; - - if (dac33->nsample > dac33->nsample_max) - dac33->nsample = dac33->nsample_max; - switch (dac33->fifo_mode) { case DAC33_FIFO_MODE1: + /* Number of samples under i2c latency */ + dac33->alarm_threshold = US_TO_SAMPLES(rate, + dac33->mode1_latency); + /* nSample time shall not be shorter than i2c latency */ + dac33->nsample_min = dac33->alarm_threshold; + /* + * nSample should not be bigger than alsa buffer minus + * size of one period to avoid overruns + */ + dac33->nsample_max = substream->runtime->buffer_size - + period_size; + nsample_limit = DAC33_BUFFER_SIZE_SAMPLES - + dac33->alarm_threshold; + if (dac33->nsample_max > nsample_limit) + dac33->nsample_max = nsample_limit; + + /* Correct the nSample if it is outside of the ranges */ + if (dac33->nsample < dac33->nsample_min) + dac33->nsample = dac33->nsample_min; + if (dac33->nsample > dac33->nsample_max) + dac33->nsample = dac33->nsample_max; + dac33->mode1_us_burst = SAMPLES_TO_US(dac33->burst_rate, dac33->nsample); dac33->t_stamp1 = 0; @@ -1519,6 +1513,9 @@ static int __devinit dac33_i2c_probe(struct i2c_client *client, /* Pre calculate the burst rate */ dac33->burst_rate = BURST_BASEFREQ_HZ / dac33->burst_bclkdiv / 32; dac33->keep_bclk = pdata->keep_bclk; + dac33->mode1_latency = pdata->mode1_latency; + if (!dac33->mode1_latency) + dac33->mode1_latency = 10000; /* 10ms */ dac33->irq = client->irq; dac33->nsample = NSAMPLE_MAX; dac33->nsample_max = NSAMPLE_MAX; -- cgit v1.2.3 From a577b318fc7cb0c46f9f0cdefb5b267490ff8ce5 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Wed, 28 Jul 2010 15:26:55 +0300 Subject: ASoC: tlv320dac33: Add support for automatic FIFO configuration Platform parameter to enable automatic FIFO configuration when the codec is in Mode1 or Mode7 FIFO mode. When this mode is selected, the controls for changing nSample (in Mode1), and UTHR (in Mode7) are not added. The driver configures the FIFO configuration based on the stream's period size in a way, that every burst will read period size of data from the host. In Mode7 we need to use a formula, which gives close enough aproximation for the burst length from the host point of view. Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/tlv320dac33.c | 90 ++++++++++++++++++++++++++++++------------ 1 file changed, 64 insertions(+), 26 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/tlv320dac33.c b/sound/soc/codecs/tlv320dac33.c index ced6fbbc9d91..8651b01ed223 100644 --- a/sound/soc/codecs/tlv320dac33.c +++ b/sound/soc/codecs/tlv320dac33.c @@ -60,6 +60,9 @@ #define US_TO_SAMPLES(rate, us) \ (rate / (1000000 / us)) +#define UTHR_FROM_PERIOD_SIZE(samples, playrate, burstrate) \ + ((samples * 5000) / ((burstrate * 5000) / (burstrate - playrate))) + static void dac33_calculate_times(struct snd_pcm_substream *substream); static int dac33_prepare_chip(struct snd_pcm_substream *substream); @@ -107,6 +110,8 @@ struct tlv320dac33_priv { unsigned int nsample; /* burst read amount from host */ int mode1_latency; /* latency caused by the i2c writes in * us */ + int auto_fifo_config; /* Configure the FIFO based on the + * period size */ u8 burst_bclkdiv; /* BCLK divider value in burst mode */ unsigned int burst_rate; /* Interface speed in Burst modes */ @@ -538,13 +543,16 @@ static const struct snd_kcontrol_new dac33_snd_controls[] = { DAC33_LINEL_TO_LLO_VOL, DAC33_LINER_TO_RLO_VOL, 0, 127, 1), }; -static const struct snd_kcontrol_new dac33_nsample_snd_controls[] = { +static const struct snd_kcontrol_new dac33_mode_snd_controls[] = { + SOC_ENUM_EXT("FIFO Mode", dac33_fifo_mode_enum, + dac33_get_fifo_mode, dac33_set_fifo_mode), +}; + +static const struct snd_kcontrol_new dac33_fifo_snd_controls[] = { SOC_SINGLE_EXT("nSample", 0, 0, 5900, 0, - dac33_get_nsample, dac33_set_nsample), + dac33_get_nsample, dac33_set_nsample), SOC_SINGLE_EXT("UTHR", 0, 0, MODE7_UTHR, 0, dac33_get_uthr, dac33_set_uthr), - SOC_ENUM_EXT("FIFO Mode", dac33_fifo_mode_enum, - dac33_get_fifo_mode, dac33_set_fifo_mode), }; /* Analog bypass */ @@ -1057,24 +1065,38 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream) /* Number of samples under i2c latency */ dac33->alarm_threshold = US_TO_SAMPLES(rate, dac33->mode1_latency); - /* nSample time shall not be shorter than i2c latency */ - dac33->nsample_min = dac33->alarm_threshold; - /* - * nSample should not be bigger than alsa buffer minus - * size of one period to avoid overruns - */ - dac33->nsample_max = substream->runtime->buffer_size - - period_size; - nsample_limit = DAC33_BUFFER_SIZE_SAMPLES - - dac33->alarm_threshold; - if (dac33->nsample_max > nsample_limit) - dac33->nsample_max = nsample_limit; - - /* Correct the nSample if it is outside of the ranges */ - if (dac33->nsample < dac33->nsample_min) - dac33->nsample = dac33->nsample_min; - if (dac33->nsample > dac33->nsample_max) - dac33->nsample = dac33->nsample_max; + if (dac33->auto_fifo_config) { + if (period_size <= dac33->alarm_threshold) + /* + * Configure nSamaple to number of periods, + * which covers the latency requironment. + */ + dac33->nsample = period_size * + ((dac33->alarm_threshold / period_size) + + (dac33->alarm_threshold % period_size ? + 1 : 0)); + else + dac33->nsample = period_size; + } else { + /* nSample time shall not be shorter than i2c latency */ + dac33->nsample_min = dac33->alarm_threshold; + /* + * nSample should not be bigger than alsa buffer minus + * size of one period to avoid overruns + */ + dac33->nsample_max = substream->runtime->buffer_size - + period_size; + nsample_limit = DAC33_BUFFER_SIZE_SAMPLES - + dac33->alarm_threshold; + if (dac33->nsample_max > nsample_limit) + dac33->nsample_max = nsample_limit; + + /* Correct the nSample if it is outside of the ranges */ + if (dac33->nsample < dac33->nsample_min) + dac33->nsample = dac33->nsample_min; + if (dac33->nsample > dac33->nsample_max) + dac33->nsample = dac33->nsample_max; + } dac33->mode1_us_burst = SAMPLES_TO_US(dac33->burst_rate, dac33->nsample); @@ -1082,6 +1104,16 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream) dac33->t_stamp2 = 0; break; case DAC33_FIFO_MODE7: + if (dac33->auto_fifo_config) { + dac33->uthr = UTHR_FROM_PERIOD_SIZE( + period_size, + rate, + dac33->burst_rate) + 9; + if (dac33->uthr > MODE7_UTHR) + dac33->uthr = MODE7_UTHR; + if (dac33->uthr < (MODE7_LTHR + 10)) + dac33->uthr = (MODE7_LTHR + 10); + } dac33->mode7_us_to_lthr = SAMPLES_TO_US(substream->runtime->rate, dac33->uthr - MODE7_LTHR + 1); @@ -1379,10 +1411,15 @@ static int dac33_soc_probe(struct platform_device *pdev) snd_soc_add_controls(codec, dac33_snd_controls, ARRAY_SIZE(dac33_snd_controls)); - /* Only add the nSample controls, if we have valid IRQ number */ - if (dac33->irq >= 0) - snd_soc_add_controls(codec, dac33_nsample_snd_controls, - ARRAY_SIZE(dac33_nsample_snd_controls)); + /* Only add the FIFO controls, if we have valid IRQ number */ + if (dac33->irq >= 0) { + snd_soc_add_controls(codec, dac33_mode_snd_controls, + ARRAY_SIZE(dac33_mode_snd_controls)); + /* FIFO usage controls only, if autoio config is not selected */ + if (!dac33->auto_fifo_config) + snd_soc_add_controls(codec, dac33_fifo_snd_controls, + ARRAY_SIZE(dac33_fifo_snd_controls)); + } dac33_add_widgets(codec); @@ -1513,6 +1550,7 @@ static int __devinit dac33_i2c_probe(struct i2c_client *client, /* Pre calculate the burst rate */ dac33->burst_rate = BURST_BASEFREQ_HZ / dac33->burst_bclkdiv / 32; dac33->keep_bclk = pdata->keep_bclk; + dac33->auto_fifo_config = pdata->auto_fifo_config; dac33->mode1_latency = pdata->mode1_latency; if (!dac33->mode1_latency) dac33->mode1_latency = 10000; /* 10ms */ -- cgit v1.2.3 From 5157cc8113db3de60ab6320965331c63bc77003c Mon Sep 17 00:00:00 2001 From: Kulikov Vasiliy Date: Wed, 28 Jul 2010 20:40:51 +0400 Subject: ALSA: sb: check get_user() return value get_user() may fail, if so return -EFAULT. [Fixed one missing place by tiwai] Signed-off-by: Kulikov Vasiliy Signed-off-by: Takashi Iwai --- sound/isa/sb/emu8000_pcm.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/isa/sb/emu8000_pcm.c b/sound/isa/sb/emu8000_pcm.c index ccedbfed061a..2f85c66f8e38 100644 --- a/sound/isa/sb/emu8000_pcm.c +++ b/sound/isa/sb/emu8000_pcm.c @@ -433,7 +433,8 @@ static int emu8k_transfer_block(struct snd_emu8000 *emu, int offset, unsigned sh while (count > 0) { unsigned short sval; CHECK_SCHEDULER(); - get_user(sval, buf); + if (get_user(sval, buf)) + return -EFAULT; EMU8000_SMLD_WRITE(emu, sval); buf++; count--; @@ -525,12 +526,14 @@ static int emu8k_pcm_copy(struct snd_pcm_substream *subs, while (count-- > 0) { unsigned short sval; CHECK_SCHEDULER(); - get_user(sval, buf); + if (get_user(sval, buf)) + return -EFAULT; EMU8000_SMLD_WRITE(emu, sval); buf++; if (rec->voices > 1) { CHECK_SCHEDULER(); - get_user(sval, buf); + if (get_user(sval, buf)) + return -EFAULT; EMU8000_SMRD_WRITE(emu, sval); buf++; } -- cgit v1.2.3 From b3390ceab95601afc12213c3ec5551d3bc7b638f Mon Sep 17 00:00:00 2001 From: Kulikov Vasiliy Date: Wed, 28 Jul 2010 20:41:17 +0400 Subject: sound: oss: midi_synth: check get_user() return value get_user() may fail, if so return -EFAULT. Signed-off-by: Kulikov Vasiliy Signed-off-by: Takashi Iwai --- sound/oss/midi_synth.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/oss/midi_synth.c b/sound/oss/midi_synth.c index 3bc7104c5379..3c09374ea5bf 100644 --- a/sound/oss/midi_synth.c +++ b/sound/oss/midi_synth.c @@ -523,7 +523,9 @@ midi_synth_load_patch(int dev, int format, const char __user *addr, { unsigned char data; - get_user(*(unsigned char *) &data, (unsigned char __user *) &((addr)[hdr_size + i])); + if (get_user(data, + (unsigned char __user *)(addr + hdr_size + i))) + return -EFAULT; eox_seen = (i > 0 && data & 0x80); /* End of sysex */ -- cgit v1.2.3 From ec9d04b2a8f00b14a3df4714820cb2cda46dc4d6 Mon Sep 17 00:00:00 2001 From: Kulikov Vasiliy Date: Wed, 28 Jul 2010 20:41:56 +0400 Subject: ALSA: asihpi: check return value of get_user() get_user() may fail, if so return -EFAULT. Signed-off-by: Kulikov Vasiliy Signed-off-by: Takashi Iwai --- sound/pci/asihpi/hpioctl.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/pci/asihpi/hpioctl.c b/sound/pci/asihpi/hpioctl.c index 311499992a22..62895a719fcb 100644 --- a/sound/pci/asihpi/hpioctl.c +++ b/sound/pci/asihpi/hpioctl.c @@ -121,11 +121,17 @@ long asihpi_hpi_ioctl(struct file *file, unsigned int cmd, unsigned long arg) phpi_ioctl_data = (struct hpi_ioctl_linux __user *)arg; /* Read the message and response pointers from user space. */ - get_user(puhm, &phpi_ioctl_data->phm); - get_user(puhr, &phpi_ioctl_data->phr); + if (get_user(puhm, &phpi_ioctl_data->phm) || + get_user(puhr, &phpi_ioctl_data->phr)) { + err = -EFAULT; + goto out; + } /* Now read the message size and data from user space. */ - get_user(hm->h.size, (u16 __user *)puhm); + if (get_user(hm->h.size, (u16 __user *)puhm)) { + err = -EFAULT; + goto out; + } if (hm->h.size > sizeof(*hm)) hm->h.size = sizeof(*hm); @@ -138,7 +144,10 @@ long asihpi_hpi_ioctl(struct file *file, unsigned int cmd, unsigned long arg) goto out; } - get_user(res_max_size, (u16 __user *)puhr); + if (get_user(res_max_size, (u16 __user *)puhr)) { + err = -EFAULT; + goto out; + } /* printk(KERN_INFO "user response size %d\n", res_max_size); */ if (res_max_size < sizeof(struct hpi_response_header)) { HPI_DEBUG_LOG(WARNING, "small res size %d\n", res_max_size); -- cgit v1.2.3 From fa95a6471ffaa6f40d71f44fc4d4636ee17280f5 Mon Sep 17 00:00:00 2001 From: Kulikov Vasiliy Date: Thu, 29 Jul 2010 14:45:24 +0400 Subject: ALSA: msnd: check request_region() return value request_region() may fail, if so return -EBUSY. Signed-off-by: Kulikov Vasiliy Signed-off-by: Takashi Iwai --- sound/isa/msnd/msnd_pinnacle.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/isa/msnd/msnd_pinnacle.c b/sound/isa/msnd/msnd_pinnacle.c index 60b6abd71612..5f3e68401f90 100644 --- a/sound/isa/msnd/msnd_pinnacle.c +++ b/sound/isa/msnd/msnd_pinnacle.c @@ -549,7 +549,10 @@ static int __devinit snd_msnd_attach(struct snd_card *card) printk(KERN_ERR LOGNAME ": Couldn't grab IRQ %d\n", chip->irq); return err; } - request_region(chip->io, DSP_NUMIO, card->shortname); + if (request_region(chip->io, DSP_NUMIO, card->shortname) == NULL) { + free_irq(chip->irq, chip); + return -EBUSY; + } if (!request_mem_region(chip->base, BUFFSIZE, card->shortname)) { printk(KERN_ERR LOGNAME -- cgit v1.2.3 From 9c29490246ed80975ab8b87bcd4ebe5b87c1c1d6 Mon Sep 17 00:00:00 2001 From: Kulikov Vasiliy Date: Thu, 29 Jul 2010 14:45:50 +0400 Subject: sound: oss: msnd: check request_region() return value request_region() may fail, if so return -EBUSY. Signed-off-by: Kulikov Vasiliy Signed-off-by: Takashi Iwai --- sound/oss/msnd_pinnacle.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/oss/msnd_pinnacle.c b/sound/oss/msnd_pinnacle.c index bfaac5fa13d7..2e48b17667d0 100644 --- a/sound/oss/msnd_pinnacle.c +++ b/sound/oss/msnd_pinnacle.c @@ -1400,9 +1400,13 @@ static int __init attach_multisound(void) printk(KERN_ERR LOGNAME ": Couldn't grab IRQ %d\n", dev.irq); return err; } - request_region(dev.io, dev.numio, dev.name); + if (request_region(dev.io, dev.numio, dev.name) == NULL) { + free_irq(dev.irq, &dev); + return -EBUSY; + } - if ((err = dsp_full_reset()) < 0) { + err = dsp_full_reset(); + if (err < 0) { release_region(dev.io, dev.numio); free_irq(dev.irq, &dev); return err; -- cgit v1.2.3 From 150b432f448281d5518f5229d240923f9a9c5459 Mon Sep 17 00:00:00 2001 From: David Henningsson Date: Thu, 29 Jul 2010 14:46:42 +0200 Subject: ALSA: hda - Rename iMic to Int Mic on Lenovo NB0763 The non-standard name "iMic" makes PulseAudio ignore the microphone. BugLink: https://launchpad.net/bugs/605101 Signed-off-by: David Henningsson Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 439d6e77040e..14ef38352088 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -7103,7 +7103,7 @@ static struct hda_input_mux alc883_lenovo_nb0763_capture_source = { .num_items = 4, .items = { { "Mic", 0x0 }, - { "iMic", 0x1 }, + { "Int Mic", 0x1 }, { "Line", 0x2 }, { "CD", 0x4 }, }, @@ -8673,8 +8673,8 @@ static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = { HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), - HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT), - HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT), + HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), + HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), { } /* end */ }; -- cgit v1.2.3 From bced8f5a36dde4ec5b255752433789066084bc85 Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Wed, 28 Jul 2010 11:57:36 +0900 Subject: ASoC: fsi: remove unnecessary clock processing Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/sh/fsi.c | 5 ----- 1 file changed, 5 deletions(-) (limited to 'sound') diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index a1ce6089177c..24c378c1e740 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c @@ -803,10 +803,6 @@ static int fsi_dai_hw_params(struct snd_pcm_substream *substream, if (!set_rate) return -EIO; - /* clock stop */ - pm_runtime_put_sync(dai->dev); - fsi_clk_ctrl(fsi, 0); - ret = set_rate(fsi_is_port_a(fsi), params_rate(params)); if (ret > 0) { u32 data = 0; @@ -865,7 +861,6 @@ static int fsi_dai_hw_params(struct snd_pcm_substream *substream, fsi_clk_ctrl(fsi, 1); ret = 0; } - pm_runtime_get_sync(dai->dev); return ret; -- cgit v1.2.3 From 265c770d03e1e3f9958172d6a7cae59e68b86db2 Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Wed, 28 Jul 2010 11:57:45 +0900 Subject: ASoC: fsi: remove device id check Current FSI driver id is not only 0 Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/sh/fsi.c | 5 ----- 1 file changed, 5 deletions(-) (limited to 'sound') diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index 24c378c1e740..4b09b3dfcc00 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c @@ -1043,11 +1043,6 @@ static int fsi_probe(struct platform_device *pdev) unsigned int irq; int ret; - if (0 != pdev->id) { - dev_err(&pdev->dev, "current fsi support id 0 only now\n"); - return -ENODEV; - } - id_entry = pdev->id_entry; if (!id_entry) { dev_err(&pdev->dev, "unknown fsi device\n"); -- cgit v1.2.3 From 3bc280708e7b9a84cc6307c1f9acca57e0fafaac Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Thu, 29 Jul 2010 16:48:32 +0900 Subject: ASoC: fsi: Add new funtion for SPDIF Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/sh/fsi.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index 4b09b3dfcc00..58c6bec642de 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c @@ -30,9 +30,11 @@ #define DIDT 0x0020 #define DODT 0x0024 #define MUTE_ST 0x0028 -#define REG_END MUTE_ST - +#define OUT_SEL 0x0030 +#define REG_END OUT_SEL +#define A_MST_CTLR 0x0180 +#define B_MST_CTLR 0x01A0 #define CPU_INT_ST 0x01F4 #define CPU_IEMSK 0x01F8 #define CPU_IMSK 0x01FC @@ -43,7 +45,7 @@ #define CLK_RST 0x0210 #define SOFT_RST 0x0214 #define FIFO_SZ 0x0218 -#define MREG_START CPU_INT_ST +#define MREG_START A_MST_CTLR #define MREG_END FIFO_SZ /* DO_FMT */ @@ -54,6 +56,7 @@ #define CR_I2S (0x3 << 4) #define CR_TDM (0x4 << 4) #define CR_TDM_D (0x5 << 4) +#define CR_SPDIF 0x00100120 /* DOFF_CTL */ /* DIFF_CTL */ @@ -69,6 +72,10 @@ #define ACKMD_MASK 0x00007000 #define BPFMD_MASK 0x00000700 +/* A/B MST_CTLR */ +#define BP (1 << 4) /* Fix the signal of Biphase output */ +#define SE (1 << 0) /* Fix the master clock */ + /* CLK_RST */ #define B_CLK 0x00000010 #define A_CLK 0x00000001 @@ -113,6 +120,8 @@ struct fsi_priv { int period_len; int buffer_len; int periods; + + u32 mst_ctrl; }; struct fsi_core { @@ -392,6 +401,29 @@ static void fsi_irq_clear_status(struct fsi_priv *fsi) fsi_master_mask_set(master, master->core->int_st, data, 0); } +/************************************************************************ + + + SPDIF master clock function + +These functions are used later FSI2 +************************************************************************/ +static void fsi_spdif_clk_ctrl(struct fsi_priv *fsi, int enable) +{ + struct fsi_master *master = fsi_get_master(fsi); + u32 val = BP | SE; + + if (master->core->ver < 2) { + pr_err("fsi: register access err (%s)\n", __func__); + return; + } + + if (enable) + fsi_master_mask_set(master, fsi->mst_ctrl, val, val); + else + fsi_master_mask_set(master, fsi->mst_ctrl, val, 0); +} + /************************************************************************ @@ -671,6 +703,7 @@ static int fsi_dai_startup(struct snd_pcm_substream *substream, { struct fsi_priv *fsi = fsi_get_priv(substream); u32 flags = fsi_get_info_flags(fsi); + struct fsi_master *master = fsi_get_master(fsi); u32 fmt; u32 reg; u32 data; @@ -732,6 +765,16 @@ static int fsi_dai_startup(struct snd_pcm_substream *substream, SH_FSI_GET_CH_O(flags) : SH_FSI_GET_CH_I(flags); data = CR_TDM_D | (fsi->chan - 1); break; + case SH_FSI_FMT_SPDIF: + if (master->core->ver < 2) { + dev_err(dai->dev, "This FSI can not use SPDIF\n"); + return -EINVAL; + } + data = CR_SPDIF; + fsi->chan = 2; + fsi_spdif_clk_ctrl(fsi, 1); + fsi_reg_mask_set(fsi, OUT_SEL, 0x0010, 0x0010); + break; default: dev_err(dai->dev, "unknown format.\n"); return -EINVAL; @@ -1071,14 +1114,21 @@ static int fsi_probe(struct platform_device *pdev) goto exit_kfree; } + /* master setting */ master->irq = irq; master->info = pdev->dev.platform_data; + master->core = (struct fsi_core *)id_entry->driver_data; + spin_lock_init(&master->lock); + + /* FSI A setting */ master->fsia.base = master->base; master->fsia.master = master; + master->fsia.mst_ctrl = A_MST_CTLR; + + /* FSI B setting */ master->fsib.base = master->base + 0x40; master->fsib.master = master; - master->core = (struct fsi_core *)id_entry->driver_data; - spin_lock_init(&master->lock); + master->fsib.mst_ctrl = B_MST_CTLR; pm_runtime_enable(&pdev->dev); pm_runtime_resume(&pdev->dev); -- cgit v1.2.3 From 5aacc2186cc075880a9eca42e6b7f9bb3096d0ea Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Fri, 30 Jul 2010 10:36:29 +0200 Subject: ALSA: hda - Make error messages more verbose Add a prefix and more information for error messages regarding the connection-list in hda_codec.c. Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_codec.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index e5c3484388f0..d9d1c91dfd1b 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -396,15 +396,18 @@ int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid, } for (n = prev_nid + 1; n <= val; n++) { if (conns >= max_conns) { - snd_printk(KERN_ERR - "Too many connections\n"); + snd_printk(KERN_ERR "hda_codec: " + "Too many connections %d for NID 0x%x\n", + conns, nid); return -EINVAL; } conn_list[conns++] = n; } } else { if (conns >= max_conns) { - snd_printk(KERN_ERR "Too many connections\n"); + snd_printk(KERN_ERR "hda_codec: " + "Too many connections %d for NID 0x%x\n", + conns, nid); return -EINVAL; } conn_list[conns++] = val; -- cgit v1.2.3 From ce503f38bdb59c9175a9076215a3ba579fad4e64 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Fri, 30 Jul 2010 10:37:29 +0200 Subject: ALSA: hda - Increase the connection list size for ALC662 Some ALC662-compatible codecs like ALC892 may have more than 4 connections for the input source. Use HDA_MAX_CONNECTIONS instead of the fixed magic number 4. Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 14ef38352088..cf9f20805173 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -18657,7 +18657,7 @@ static void alc662_auto_set_output_and_unmute(struct hda_codec *codec, hda_nid_t dac) { int i, num; - hda_nid_t srcs[4]; + hda_nid_t srcs[HDA_MAX_CONNECTIONS]; alc_set_pin_output(codec, nid, pin_type); /* need the manual connection? */ -- cgit v1.2.3 From 757899aceebc33d9f86bbc481be7b7bf861e89ac Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Fri, 30 Jul 2010 10:48:14 +0200 Subject: ALSA: hda - Share digital I/O parser in patch_realtek.c Make a helper function to parse the digital I/Os of all Realtek codecs to simplify the code and to ensure the setups. Also, initialize digital I/O pins properly in init callbacks. Some BIOS seem to leave pins uninitialized. Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 140 +++++++++++++++++++++++------------------- 1 file changed, 78 insertions(+), 62 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index cf9f20805173..442adef38c5b 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -1541,6 +1541,63 @@ static int alc_read_coef_idx(struct hda_codec *codec, return val; } +/* set right pin controls for digital I/O */ +static void alc_auto_init_digital(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + int i; + hda_nid_t pin; + + for (i = 0; i < spec->autocfg.dig_outs; i++) { + pin = spec->autocfg.dig_out_pins[i]; + if (pin) { + snd_hda_codec_write(codec, pin, 0, + AC_VERB_SET_PIN_WIDGET_CONTROL, + PIN_OUT); + } + } + pin = spec->autocfg.dig_in_pin; + if (pin) + snd_hda_codec_write(codec, pin, 0, + AC_VERB_SET_PIN_WIDGET_CONTROL, + PIN_IN); +} + +/* parse digital I/Os and set up NIDs in BIOS auto-parse mode */ +static void alc_auto_parse_digital(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + int i, err; + hda_nid_t dig_nid; + + /* support multiple SPDIFs; the secondary is set up as a slave */ + for (i = 0; i < spec->autocfg.dig_outs; i++) { + err = snd_hda_get_connections(codec, + spec->autocfg.dig_out_pins[i], + &dig_nid, 1); + if (err < 0) + continue; + if (!i) { + spec->multiout.dig_out_nid = dig_nid; + spec->dig_out_type = spec->autocfg.dig_out_type[0]; + } else { + spec->multiout.slave_dig_outs = spec->slave_dig_outs; + if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1) + break; + spec->slave_dig_outs[i - 1] = dig_nid; + } + } + + if (spec->autocfg.dig_in_pin) { + hda_nid_t dig_nid; + err = snd_hda_get_connections(codec, + spec->autocfg.dig_in_pin, + &dig_nid, 1); + if (err > 0) + spec->dig_in_nid = dig_nid; + } +} + /* * ALC888 */ @@ -5013,7 +5070,7 @@ static void alc880_auto_init_input_src(struct hda_codec *codec) static int alc880_parse_auto_config(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; - int i, err; + int err; static hda_nid_t alc880_ignore[] = { 0x1d, 0 }; err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, @@ -5044,25 +5101,7 @@ static int alc880_parse_auto_config(struct hda_codec *codec) spec->multiout.max_channels = spec->multiout.num_dacs * 2; - /* check multiple SPDIF-out (for recent codecs) */ - for (i = 0; i < spec->autocfg.dig_outs; i++) { - hda_nid_t dig_nid; - err = snd_hda_get_connections(codec, - spec->autocfg.dig_out_pins[i], - &dig_nid, 1); - if (err < 0) - continue; - if (!i) - spec->multiout.dig_out_nid = dig_nid; - else { - spec->multiout.slave_dig_outs = spec->slave_dig_outs; - if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1) - break; - spec->slave_dig_outs[i - 1] = dig_nid; - } - } - if (spec->autocfg.dig_in_pin) - spec->dig_in_nid = ALC880_DIGIN_NID; + alc_auto_parse_digital(codec); if (spec->kctls.list) add_mixer(spec, spec->kctls.list); @@ -5085,6 +5124,7 @@ static void alc880_auto_init(struct hda_codec *codec) alc880_auto_init_extra_out(codec); alc880_auto_init_analog_input(codec); alc880_auto_init_input_src(codec); + alc_auto_init_digital(codec); if (spec->unsol_event) alc_inithook(codec); } @@ -6724,6 +6764,7 @@ static void alc260_auto_init(struct hda_codec *codec) alc260_auto_init_multi_out(codec); alc260_auto_init_analog_input(codec); alc260_auto_init_input_src(codec); + alc_auto_init_digital(codec); if (spec->unsol_event) alc_inithook(codec); } @@ -10546,7 +10587,7 @@ static int alc882_parse_auto_config(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; static hda_nid_t alc882_ignore[] = { 0x1d, 0 }; - int i, err; + int err; err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, alc882_ignore); @@ -10576,25 +10617,7 @@ static int alc882_parse_auto_config(struct hda_codec *codec) spec->multiout.max_channels = spec->multiout.num_dacs * 2; - /* check multiple SPDIF-out (for recent codecs) */ - for (i = 0; i < spec->autocfg.dig_outs; i++) { - hda_nid_t dig_nid; - err = snd_hda_get_connections(codec, - spec->autocfg.dig_out_pins[i], - &dig_nid, 1); - if (err < 0) - continue; - if (!i) - spec->multiout.dig_out_nid = dig_nid; - else { - spec->multiout.slave_dig_outs = spec->slave_dig_outs; - if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1) - break; - spec->slave_dig_outs[i - 1] = dig_nid; - } - } - if (spec->autocfg.dig_in_pin) - spec->dig_in_nid = ALC880_DIGIN_NID; + alc_auto_parse_digital(codec); if (spec->kctls.list) add_mixer(spec, spec->kctls.list); @@ -10624,6 +10647,7 @@ static void alc882_auto_init(struct hda_codec *codec) alc882_auto_init_hp_out(codec); alc882_auto_init_analog_input(codec); alc882_auto_init_input_src(codec); + alc_auto_init_digital(codec); if (spec->unsol_event) alc_inithook(codec); } @@ -12154,12 +12178,7 @@ static int alc262_parse_auto_config(struct hda_codec *codec) spec->multiout.max_channels = spec->multiout.num_dacs * 2; dig_only: - if (spec->autocfg.dig_outs) { - spec->multiout.dig_out_nid = ALC262_DIGOUT_NID; - spec->dig_out_type = spec->autocfg.dig_out_type[0]; - } - if (spec->autocfg.dig_in_pin) - spec->dig_in_nid = ALC262_DIGIN_NID; + alc_auto_parse_digital(codec); if (spec->kctls.list) add_mixer(spec, spec->kctls.list); @@ -12191,6 +12210,7 @@ static void alc262_auto_init(struct hda_codec *codec) alc262_auto_init_hp_out(codec); alc262_auto_init_analog_input(codec); alc262_auto_init_input_src(codec); + alc_auto_init_digital(codec); if (spec->unsol_event) alc_inithook(codec); } @@ -13327,10 +13347,7 @@ static int alc268_parse_auto_config(struct hda_codec *codec) dig_only: /* digital only support output */ - if (spec->autocfg.dig_outs) { - spec->multiout.dig_out_nid = ALC268_DIGOUT_NID; - spec->dig_out_type = spec->autocfg.dig_out_type[0]; - } + alc_auto_parse_digital(codec); if (spec->kctls.list) add_mixer(spec, spec->kctls.list); @@ -13360,6 +13377,7 @@ static void alc268_auto_init(struct hda_codec *codec) alc268_auto_init_hp_out(codec); alc268_auto_init_mono_speaker_out(codec); alc268_auto_init_analog_input(codec); + alc_auto_init_digital(codec); if (spec->unsol_event) alc_inithook(codec); } @@ -14305,8 +14323,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec) spec->multiout.max_channels = spec->multiout.num_dacs * 2; - if (spec->autocfg.dig_outs) - spec->multiout.dig_out_nid = ALC269_DIGOUT_NID; + alc_auto_parse_digital(codec); if (spec->kctls.list) add_mixer(spec, spec->kctls.list); @@ -14354,6 +14371,7 @@ static void alc269_auto_init(struct hda_codec *codec) alc269_auto_init_multi_out(codec); alc269_auto_init_hp_out(codec); alc269_auto_init_analog_input(codec); + alc_auto_init_digital(codec); if (spec->unsol_event) alc_inithook(codec); } @@ -15515,8 +15533,7 @@ static int alc861_parse_auto_config(struct hda_codec *codec) spec->multiout.max_channels = spec->multiout.num_dacs * 2; - if (spec->autocfg.dig_outs) - spec->multiout.dig_out_nid = ALC861_DIGOUT_NID; + alc_auto_parse_digital(codec); if (spec->kctls.list) add_mixer(spec, spec->kctls.list); @@ -15542,6 +15559,7 @@ static void alc861_auto_init(struct hda_codec *codec) alc861_auto_init_multi_out(codec); alc861_auto_init_hp_out(codec); alc861_auto_init_analog_input(codec); + alc_auto_init_digital(codec); if (spec->unsol_event) alc_inithook(codec); } @@ -16646,8 +16664,7 @@ static int alc861vd_parse_auto_config(struct hda_codec *codec) spec->multiout.max_channels = spec->multiout.num_dacs * 2; - if (spec->autocfg.dig_outs) - spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID; + alc_auto_parse_digital(codec); if (spec->kctls.list) add_mixer(spec, spec->kctls.list); @@ -16674,6 +16691,7 @@ static void alc861vd_auto_init(struct hda_codec *codec) alc861vd_auto_init_hp_out(codec); alc861vd_auto_init_analog_input(codec); alc861vd_auto_init_input_src(codec); + alc_auto_init_digital(codec); if (spec->unsol_event) alc_inithook(codec); } @@ -18761,8 +18779,7 @@ static int alc662_parse_auto_config(struct hda_codec *codec) spec->multiout.max_channels = spec->multiout.num_dacs * 2; - if (spec->autocfg.dig_outs) - spec->multiout.dig_out_nid = ALC880_DIGOUT_NID; + alc_auto_parse_digital(codec); if (spec->kctls.list) add_mixer(spec, spec->kctls.list); @@ -18799,6 +18816,7 @@ static void alc662_auto_init(struct hda_codec *codec) alc662_auto_init_hp_out(codec); alc662_auto_init_analog_input(codec); alc662_auto_init_input_src(codec); + alc_auto_init_digital(codec); if (spec->unsol_event) alc_inithook(codec); } @@ -19124,10 +19142,7 @@ static int alc680_parse_auto_config(struct hda_codec *codec) dig_only: /* digital only support output */ - if (spec->autocfg.dig_outs) { - spec->multiout.dig_out_nid = ALC680_DIGOUT_NID; - spec->dig_out_type = spec->autocfg.dig_out_type[0]; - } + alc_auto_parse_digital(codec); if (spec->kctls.list) add_mixer(spec, spec->kctls.list); @@ -19151,6 +19166,7 @@ static void alc680_auto_init(struct hda_codec *codec) alc680_auto_init_multi_out(codec); alc680_auto_init_hp_out(codec); alc680_auto_init_analog_input(codec); + alc_auto_init_digital(codec); if (spec->unsol_event) alc_inithook(codec); } -- cgit v1.2.3 From 5d4abf93ea3192cc666430225a29a4978c97c57d Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Fri, 30 Jul 2010 10:51:10 +0200 Subject: ALSA: hda - Handle missing NID 0x1b on ALC259 codec Since ALC259/269 use the same parser of ALC268, the pin 0x1b was ignored as an invalid widget. Just add this NID to handle properly. This will add the missing mixer controls for some devices. Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 442adef38c5b..bdea95aee448 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -13144,6 +13144,7 @@ static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid, dac = 0x02; break; case 0x15: + case 0x1b: case 0x21: /* ALC269vb has this pin, too */ dac = 0x03; break; -- cgit v1.2.3 From 954a29c881bd0c61352af0946f2c39d738d43c1b Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Fri, 30 Jul 2010 10:55:44 +0200 Subject: ALSA: hda - Prefer VREF50 if BIOS sets for Realtek codecs If BIOS sets up the input pin as VREF 50, use the value as is instead of overriding forcibly to VREF 80. This fixes the quality of inputs on some devices like Packard-Bell M5210. Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index bdea95aee448..4d3a6f05c703 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -847,9 +847,13 @@ static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid, if (auto_pin_type <= AUTO_PIN_FRONT_MIC) { unsigned int pincap; + unsigned int oldval; + oldval = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_PIN_WIDGET_CONTROL, 0); pincap = snd_hda_query_pin_caps(codec, nid); pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT; - if (pincap & AC_PINCAP_VREF_80) + /* if the default pin setup is vref50, we give it priority */ + if ((pincap & AC_PINCAP_VREF_80) && oldval != PIN_VREF50) val = PIN_VREF80; else if (pincap & AC_PINCAP_VREF_50) val = PIN_VREF50; @@ -10406,7 +10410,8 @@ static struct alc_config_preset alc882_presets[] = { * Pin config fixes */ enum { - PINFIX_ABIT_AW9D_MAX + PINFIX_ABIT_AW9D_MAX, + PINFIX_PB_M5210, }; static struct alc_pincfg alc882_abit_aw9d_pinfix[] = { @@ -10416,13 +10421,22 @@ static struct alc_pincfg alc882_abit_aw9d_pinfix[] = { { } }; +static const struct hda_verb pb_m5210_verbs[] = { + { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, + {} +}; + static const struct alc_fixup alc882_fixups[] = { [PINFIX_ABIT_AW9D_MAX] = { .pins = alc882_abit_aw9d_pinfix }, + [PINFIX_PB_M5210] = { + .verbs = pb_m5210_verbs + }, }; static struct snd_pci_quirk alc882_fixup_tbl[] = { + SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", PINFIX_PB_M5210), SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX), {} }; -- cgit v1.2.3 From 697c373e34613609cb5450f98b91fefb6e910588 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Fri, 30 Jul 2010 11:28:02 +0200 Subject: ALSA: hda - Shut up pins at power-saving mode with Conexnat codecs Call snd_hda_shutup_pins() for power-saving and reboot-notifier in patch_conexant.c as well as other codecs. This will reduce the pop noise in power-save mode. Reference: bnc#624896 https://bugzilla.novell.com/show_bug.cgi?id=624896 Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_conexant.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index c99425ab2e70..d6341f3fef01 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -611,11 +611,23 @@ static int conexant_build_controls(struct hda_codec *codec) return 0; } +#ifdef CONFIG_SND_HDA_POWER_SAVE +static int conexant_suspend(struct hda_codec *codec, pm_message_t state) +{ + snd_hda_shutup_pins(codec); + return 0; +} +#endif + static struct hda_codec_ops conexant_patch_ops = { .build_controls = conexant_build_controls, .build_pcms = conexant_build_pcms, .init = conexant_init, .free = conexant_free, +#ifdef CONFIG_SND_HDA_POWER_SAVE + .suspend = conexant_suspend, +#endif + .reboot_notify = snd_hda_shutup_pins, }; #ifdef CONFIG_SND_HDA_INPUT_BEEP -- cgit v1.2.3 From b08b1637ce1c0196970348bcabf40f04b6b3d58e Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Fri, 30 Jul 2010 14:08:25 +0200 Subject: ALSA: hda - Handle pin NID 0x1a on ALC259/269 The pin NID 0x1a should be handled as well as NID 0x1b. Also added comments. Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 4d3a6f05c703..ce6c3a9c08c0 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -13158,7 +13158,8 @@ static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid, dac = 0x02; break; case 0x15: - case 0x1b: + case 0x1a: /* ALC259/269 only */ + case 0x1b: /* ALC259/269 only */ case 0x21: /* ALC269vb has this pin, too */ dac = 0x03; break; -- cgit v1.2.3 From c7a9434dd6ea74464b0419a274463c914197bc98 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Fri, 30 Jul 2010 14:10:43 +0200 Subject: ALSA: hda - Add a warning for ignored pins with ALC259/268/269 The current ALC259/268/269 parser ignores some pins as unhandled, but user won't notice what goes wrong. So, added a warning message for the ignored pins as a hint. Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index ce6c3a9c08c0..49c04fc8b516 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -13164,6 +13164,8 @@ static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid, dac = 0x03; break; default: + snd_printd(KERN_WARNING "hda_codec: " + "ignoring pin 0x%x as unknown\n", nid); return 0; } if (spec->multiout.dac_nids[0] != dac && -- cgit v1.2.3 From ac8b422838046ffc26be4874a3cbae0d313f4209 Mon Sep 17 00:00:00 2001 From: Dominik Brodowski Date: Wed, 21 Jul 2010 22:38:13 +0200 Subject: pcmcia: remove cs_types.h Remove cs_types.h which is no longer needed: Most definitions aren't used at all, a few can be made away with, and two remaining definitions (typedefs, unfortunatley) may be moved to more specific places. CC: linux-ide@vger.kernel.org CC: linux-usb@vger.kernel.org CC: laforge@gnumonks.org CC: linux-mtd@lists.infradead.org CC: alsa-devel@alsa-project.org CC: linux-serial@vger.kernel.org Acked-by: Marcel Holtmann (for drivers/bluetooth/) Acked-by: David S. Miller Signed-off-by: Dominik Brodowski --- sound/pcmcia/pdaudiocf/pdaudiocf.h | 1 - sound/pcmcia/vx/vxpocket.h | 1 - 2 files changed, 2 deletions(-) (limited to 'sound') diff --git a/sound/pcmcia/pdaudiocf/pdaudiocf.h b/sound/pcmcia/pdaudiocf/pdaudiocf.h index a0a7ec64222a..5cc3e4573074 100644 --- a/sound/pcmcia/pdaudiocf/pdaudiocf.h +++ b/sound/pcmcia/pdaudiocf/pdaudiocf.h @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include diff --git a/sound/pcmcia/vx/vxpocket.h b/sound/pcmcia/vx/vxpocket.h index ea4df16a28ef..d9110669d042 100644 --- a/sound/pcmcia/vx/vxpocket.h +++ b/sound/pcmcia/vx/vxpocket.h @@ -23,7 +23,6 @@ #include -#include #include #include #include -- cgit v1.2.3 From dd2f8c2f811b14f97a572edb0da4cfe776e20052 Mon Sep 17 00:00:00 2001 From: John S Gruber Date: Sun, 1 Aug 2010 09:53:37 -0400 Subject: ALSA: usb - Correct audio problem for Hauppage HVR-850 and others rel. to urb data align Match usb ids in usb/quirks-table.h for some Hauppage HVR-950Q models and for the HVR850 model to those ids at the end of au0828-cards.c Thanks to nhJm449 for pointing out the problem. Signed-off-by: John S Gruber Signed-off-by: Takashi Iwai --- sound/usb/quirks-table.h | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) (limited to 'sound') diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h index f8797f61a24b..2e8003f98fca 100644 --- a/sound/usb/quirks-table.h +++ b/sound/usb/quirks-table.h @@ -2152,7 +2152,21 @@ YAMAHA_DEVICE(0x7010, "UB99"), } }, { - USB_DEVICE_VENDOR_SPEC(0x2040, 0x7201), + USB_DEVICE_VENDOR_SPEC(0x2040, 0x7240), + .match_flags = USB_DEVICE_ID_MATCH_DEVICE | + USB_DEVICE_ID_MATCH_INT_CLASS | + USB_DEVICE_ID_MATCH_INT_SUBCLASS, + .bInterfaceClass = USB_CLASS_AUDIO, + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, + .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { + .vendor_name = "Hauppauge", + .product_name = "HVR-850", + .ifnum = QUIRK_ANY_INTERFACE, + .type = QUIRK_AUDIO_ALIGN_TRANSFER, + } +}, +{ + USB_DEVICE_VENDOR_SPEC(0x2040, 0x7210), .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, @@ -2166,7 +2180,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), } }, { - USB_DEVICE_VENDOR_SPEC(0x2040, 0x7202), + USB_DEVICE_VENDOR_SPEC(0x2040, 0x7217), .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, @@ -2180,7 +2194,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), } }, { - USB_DEVICE_VENDOR_SPEC(0x2040, 0x7203), + USB_DEVICE_VENDOR_SPEC(0x2040, 0x721b), .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, @@ -2194,7 +2208,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), } }, { - USB_DEVICE_VENDOR_SPEC(0x2040, 0x7204), + USB_DEVICE_VENDOR_SPEC(0x2040, 0x721e), .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, @@ -2208,7 +2222,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), } }, { - USB_DEVICE_VENDOR_SPEC(0x2040, 0x7205), + USB_DEVICE_VENDOR_SPEC(0x2040, 0x721f), .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, @@ -2222,7 +2236,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), } }, { - USB_DEVICE_VENDOR_SPEC(0x2040, 0x7250), + USB_DEVICE_VENDOR_SPEC(0x2040, 0x7280), .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, @@ -2236,7 +2250,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), } }, { - USB_DEVICE_VENDOR_SPEC(0x2040, 0x7230), + USB_DEVICE_VENDOR_SPEC(0x0fd9, 0x0008), .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, @@ -2244,7 +2258,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { .vendor_name = "Hauppauge", - .product_name = "HVR-850", + .product_name = "HVR-950Q", .ifnum = QUIRK_ANY_INTERFACE, .type = QUIRK_AUDIO_ALIGN_TRANSFER, } -- cgit v1.2.3 From 81ec027e64f459f06ff20d8871f2867cff4a5e85 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Thu, 29 Jul 2010 09:51:26 +0300 Subject: ASoC: omap-mcbsp: Restructure the code within omap_mcbsp_dai_hw_params In preparation for the extended threshold mode (sDMA packet mode support), the code need to be restructured. Signed-off-by: Peter Ujfalusi Acked-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/omap/omap-mcbsp.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) (limited to 'sound') diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index aebd3af2ab79..88ca71c57c2b 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c @@ -348,11 +348,13 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs; - int dma, bus_id = mcbsp_data->bus_id, id = cpu_dai->id; + struct omap_pcm_dma_data *dma_data; + int dma, bus_id = mcbsp_data->bus_id; int wlen, channels, wpf, sync_mode = OMAP_DMA_SYNC_ELEMENT; unsigned long port; unsigned int format, div, framesize, master; + dma_data = &omap_mcbsp_dai_dma_params[cpu_dai->id][substream->stream]; if (cpu_class_is_omap1()) { dma = omap1_dma_reqs[bus_id][substream->stream]; port = omap1_mcbsp_port[bus_id][substream->stream]; @@ -365,8 +367,7 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, } else if (cpu_is_omap343x()) { dma = omap24xx_dma_reqs[bus_id][substream->stream]; port = omap34xx_mcbsp_port[bus_id][substream->stream]; - omap_mcbsp_dai_dma_params[id][substream->stream].set_threshold = - omap_mcbsp_set_threshold; + dma_data->set_threshold = omap_mcbsp_set_threshold; /* TODO: Currently, MODE_ELEMENT == MODE_FRAME */ if (omap_mcbsp_get_dma_op_mode(bus_id) == MCBSP_DMA_MODE_THRESHOLD) @@ -374,26 +375,22 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, } else { return -ENODEV; } - omap_mcbsp_dai_dma_params[id][substream->stream].name = - substream->stream ? "Audio Capture" : "Audio Playback"; - omap_mcbsp_dai_dma_params[id][substream->stream].dma_req = dma; - omap_mcbsp_dai_dma_params[id][substream->stream].port_addr = port; - omap_mcbsp_dai_dma_params[id][substream->stream].sync_mode = sync_mode; + dma_data->name = substream->stream ? "Audio Capture" : "Audio Playback"; + dma_data->dma_req = dma; + dma_data->port_addr = port; + dma_data->sync_mode = sync_mode; switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: - omap_mcbsp_dai_dma_params[id][substream->stream].data_type = - OMAP_DMA_DATA_TYPE_S16; + dma_data->data_type = OMAP_DMA_DATA_TYPE_S16; break; case SNDRV_PCM_FORMAT_S32_LE: - omap_mcbsp_dai_dma_params[id][substream->stream].data_type = - OMAP_DMA_DATA_TYPE_S32; + dma_data->data_type = OMAP_DMA_DATA_TYPE_S32; break; default: return -EINVAL; } - snd_soc_dai_set_dma_data(cpu_dai, substream, - &omap_mcbsp_dai_dma_params[id][substream->stream]); + snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data); if (mcbsp_data->configured) { /* McBSP already configured by another stream */ -- cgit v1.2.3 From 15d0143007b68079aec02918d890c26ed4eaf3b9 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Thu, 29 Jul 2010 09:51:25 +0300 Subject: ASoC: omap-mcbsp: Code cleanup in omap_mcbsp_dai_hw_params To make the code a bit more readable, change the indexed references to the omap_mcbsp_dai_dma_params elements with pointer. Signed-off-by: Peter Ujfalusi Acked-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/omap/omap-mcbsp.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'sound') diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 88ca71c57c2b..4ac8a08db7b5 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c @@ -367,18 +367,9 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, } else if (cpu_is_omap343x()) { dma = omap24xx_dma_reqs[bus_id][substream->stream]; port = omap34xx_mcbsp_port[bus_id][substream->stream]; - dma_data->set_threshold = omap_mcbsp_set_threshold; - /* TODO: Currently, MODE_ELEMENT == MODE_FRAME */ - if (omap_mcbsp_get_dma_op_mode(bus_id) == - MCBSP_DMA_MODE_THRESHOLD) - sync_mode = OMAP_DMA_SYNC_FRAME; } else { return -ENODEV; } - dma_data->name = substream->stream ? "Audio Capture" : "Audio Playback"; - dma_data->dma_req = dma; - dma_data->port_addr = port; - dma_data->sync_mode = sync_mode; switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: dma_data->data_type = OMAP_DMA_DATA_TYPE_S16; @@ -389,6 +380,18 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, default: return -EINVAL; } + if (cpu_is_omap343x()) { + dma_data->set_threshold = omap_mcbsp_set_threshold; + /* TODO: Currently, MODE_ELEMENT == MODE_FRAME */ + if (omap_mcbsp_get_dma_op_mode(bus_id) == + MCBSP_DMA_MODE_THRESHOLD) + sync_mode = OMAP_DMA_SYNC_FRAME; + } + + dma_data->name = substream->stream ? "Audio Capture" : "Audio Playback"; + dma_data->dma_req = dma; + dma_data->port_addr = port; + dma_data->sync_mode = sync_mode; snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data); -- cgit v1.2.3 From cf80e15860852be5ce38714979db94ec36c5e288 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Thu, 29 Jul 2010 09:51:27 +0300 Subject: ASoC: omap-mcbsp: Support for sDMA packet mode Utilize the sDMA controller's packet syncronization mode, when the McBSP FIFO is in use (by extending the THRESHOLD mode). When the sDMA is configured for packet mode, the sDMA frame size does not need to match with the McBSP threshold configuration. Uppon DMA request the sDMA will transfer packet size number of words, and still trigger interrupt on frame boundary. The patch extends the original THRESHOLD mode by doing the following: if (period_words <= max_threshold) Current THRESHOLD mode configuration Otherwise (period_words > max_threshold) McBSP threshold = sDMA packet size sDMA frame size = period size With the extended THRESHOLD mode we can remove the constraint for the maximum period size, since if the period size is bigger than the maximum allowed threshold, than the driver will switch to packet mode, and picks the best (biggest) threshold value, which can divide evenly the period size. Signed-off-by: Peter Ujfalusi Acked-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/omap/omap-mcbsp.c | 62 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 6 deletions(-) (limited to 'sound') diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 4ac8a08db7b5..9fd00b091814 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c @@ -155,13 +155,23 @@ static void omap_mcbsp_set_threshold(struct snd_pcm_substream *substream) struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); + struct omap_pcm_dma_data *dma_data; int dma_op_mode = omap_mcbsp_get_dma_op_mode(mcbsp_data->bus_id); int words; + dma_data = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); + /* TODO: Currently, MODE_ELEMENT == MODE_FRAME */ if (dma_op_mode == MCBSP_DMA_MODE_THRESHOLD) - /* The FIFO size depends on the McBSP word configuration */ - words = snd_pcm_lib_period_bytes(substream) / + /* + * Configure McBSP threshold based on either: + * packet_size, when the sDMA is in packet mode, or + * based on the period size. + */ + if (dma_data->packet_size) + words = dma_data->packet_size; + else + words = snd_pcm_lib_period_bytes(substream) / (mcbsp_data->wlen / 8); else words = 1; @@ -351,6 +361,7 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, struct omap_pcm_dma_data *dma_data; int dma, bus_id = mcbsp_data->bus_id; int wlen, channels, wpf, sync_mode = OMAP_DMA_SYNC_ELEMENT; + int pkt_size = 0; unsigned long port; unsigned int format, div, framesize, master; @@ -373,9 +384,11 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: dma_data->data_type = OMAP_DMA_DATA_TYPE_S16; + wlen = 16; break; case SNDRV_PCM_FORMAT_S32_LE: dma_data->data_type = OMAP_DMA_DATA_TYPE_S32; + wlen = 32; break; default: return -EINVAL; @@ -384,14 +397,53 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, dma_data->set_threshold = omap_mcbsp_set_threshold; /* TODO: Currently, MODE_ELEMENT == MODE_FRAME */ if (omap_mcbsp_get_dma_op_mode(bus_id) == - MCBSP_DMA_MODE_THRESHOLD) - sync_mode = OMAP_DMA_SYNC_FRAME; + MCBSP_DMA_MODE_THRESHOLD) { + int period_words, max_thrsh; + + period_words = params_period_bytes(params) / (wlen / 8); + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + max_thrsh = omap_mcbsp_get_max_tx_threshold( + mcbsp_data->bus_id); + else + max_thrsh = omap_mcbsp_get_max_rx_threshold( + mcbsp_data->bus_id); + /* + * If the period contains less or equal number of words, + * we are using the original threshold mode setup: + * McBSP threshold = sDMA frame size = period_size + * Otherwise we switch to sDMA packet mode: + * McBSP threshold = sDMA packet size + * sDMA frame size = period size + */ + if (period_words > max_thrsh) { + int divider = 0; + + /* + * Look for the biggest threshold value, which + * divides the period size evenly. + */ + divider = period_words / max_thrsh; + if (period_words % max_thrsh) + divider++; + while (period_words % divider && + divider < period_words) + divider++; + if (divider == period_words) + return -EINVAL; + + pkt_size = period_words / divider; + sync_mode = OMAP_DMA_SYNC_PACKET; + } else { + sync_mode = OMAP_DMA_SYNC_FRAME; + } + } } dma_data->name = substream->stream ? "Audio Capture" : "Audio Playback"; dma_data->dma_req = dma; dma_data->port_addr = port; dma_data->sync_mode = sync_mode; + dma_data->packet_size = pkt_size; snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data); @@ -419,7 +471,6 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: /* Set word lengths */ - wlen = 16; regs->rcr2 |= RWDLEN2(OMAP_MCBSP_WORD_16); regs->rcr1 |= RWDLEN1(OMAP_MCBSP_WORD_16); regs->xcr2 |= XWDLEN2(OMAP_MCBSP_WORD_16); @@ -427,7 +478,6 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, break; case SNDRV_PCM_FORMAT_S32_LE: /* Set word lengths */ - wlen = 32; regs->rcr2 |= RWDLEN2(OMAP_MCBSP_WORD_32); regs->rcr1 |= RWDLEN1(OMAP_MCBSP_WORD_32); regs->xcr2 |= XWDLEN2(OMAP_MCBSP_WORD_32); -- cgit v1.2.3 From 998a8a69f3a40f9c82e83730bfdaceb63954d753 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Thu, 29 Jul 2010 09:51:28 +0300 Subject: ASoC: omap-mcbsp: Remove period size constraint in THRESHOLD mode The use of sDMA packet mode in THRESHOLD mode removes the restriction on the period size. With the extended THRESHOLD mode user space can ask for any period size it wishes, and the driver will configure the sDMA and McBSP FIFO accordingly. Replace the hw_rule for the period size with static constraint, which will make sure that the period size will be always even (to avoid prime period size, which could be possible in mono stream) Signed-off-by: Peter Ujfalusi Acked-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/omap/omap-mcbsp.c | 43 ++++--------------------------------------- 1 file changed, 4 insertions(+), 39 deletions(-) (limited to 'sound') diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 9fd00b091814..86f213905e2c 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c @@ -202,31 +202,6 @@ static int omap_mcbsp_hwrule_min_buffersize(struct snd_pcm_hw_params *params, return snd_interval_refine(buffer_size, &frames); } -static int omap_mcbsp_hwrule_max_periodsize(struct snd_pcm_hw_params *params, - struct snd_pcm_hw_rule *rule) -{ - struct snd_interval *period_size = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_PERIOD_SIZE); - struct snd_interval *channels = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_CHANNELS); - struct snd_pcm_substream *substream = rule->private; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); - struct snd_interval frames; - int size; - - snd_interval_any(&frames); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - size = omap_mcbsp_get_max_tx_threshold(mcbsp_data->bus_id); - else - size = omap_mcbsp_get_max_rx_threshold(mcbsp_data->bus_id); - - frames.max = size / channels->min; - frames.integer = 1; - return snd_interval_refine(period_size, &frames); -} - static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { @@ -255,10 +230,8 @@ static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream, * 4 channels: size is 128 / 4 = 32 frames (4 * 32 words) */ if (cpu_is_omap343x()) { - int dma_op_mode = omap_mcbsp_get_dma_op_mode(bus_id); - /* - * The first rule is for the buffer size, we should not allow + * Rule for the buffer size. We should not allow * smaller buffer than the FIFO size to avoid underruns */ snd_pcm_hw_rule_add(substream->runtime, 0, @@ -267,17 +240,9 @@ static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream, mcbsp_data, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, -1); - /* - * In case of threshold mode, the rule will ensure, that the - * period size is not bigger than the maximum allowed threshold - * value. - */ - if (dma_op_mode == MCBSP_DMA_MODE_THRESHOLD) - snd_pcm_hw_rule_add(substream->runtime, 0, - SNDRV_PCM_HW_PARAM_CHANNELS, - omap_mcbsp_hwrule_max_periodsize, - substream, - SNDRV_PCM_HW_PARAM_PERIOD_SIZE, -1); + /* Make sure, that the period size is always even */ + snd_pcm_hw_constraint_step(substream->runtime, 0, + SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 2); } return err; -- cgit v1.2.3 From 7bfb9c031ec2d220d48bf679553d6177c2e66625 Mon Sep 17 00:00:00 2001 From: David Henningsson Date: Mon, 2 Aug 2010 13:13:25 +0200 Subject: ALSA: hda - Do not try to create speaker NIDs for ALC268 if there aren't any Signed-off-by: David Henningsson Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 49c04fc8b516..cf14b00155d0 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -13216,7 +13216,7 @@ static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec, HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT)); if (err < 0) return err; - } else { + } else if (nid) { err = alc268_new_analog_output(spec, nid, "Speaker", 0); if (err < 0) return err; -- cgit v1.2.3 From 992bee401c06872175056bc5567cb3ebab098cb5 Mon Sep 17 00:00:00 2001 From: Ian Lartey Date: Sat, 31 Jul 2010 00:32:11 +0100 Subject: ASoC: Initial WM8741 CODEC driver The WM8741 is a very high performance stereo DAC designed for audio applications such as professional recording systems, A/V receivers and high specification CD, DVD and home theatre systems. The device supports PCM data input word lengths from 16 to 32-bits and sampling rates up to 192kHz. The WM8741 also supports DSD bit-stream data format, in both direct DSD and PCM-converted DSD modes. TODO: Expand wm8741_set_dai_sysclk and rate_constraint members to allow for all supported sample rate / Master Clock frequency combinations. Fully enable control of supplies. Signed-off-by: Ian Lartey Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/Kconfig | 4 + sound/soc/codecs/Makefile | 2 + sound/soc/codecs/wm8741.c | 579 ++++++++++++++++++++++++++++++++++++++++++++++ sound/soc/codecs/wm8741.h | 214 +++++++++++++++++ 4 files changed, 799 insertions(+) create mode 100644 sound/soc/codecs/wm8741.c create mode 100644 sound/soc/codecs/wm8741.h (limited to 'sound') diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 55bc2beffb3a..83f5c67d3c41 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -50,6 +50,7 @@ config SND_SOC_ALL_CODECS select SND_SOC_WM8727 select SND_SOC_WM8728 if SND_SOC_I2C_AND_SPI select SND_SOC_WM8731 if SND_SOC_I2C_AND_SPI + select SND_SOC_WM8741 if SND_SOC_I2C_AND_SPI select SND_SOC_WM8750 if SND_SOC_I2C_AND_SPI select SND_SOC_WM8753 if SND_SOC_I2C_AND_SPI select SND_SOC_WM8776 if SND_SOC_I2C_AND_SPI @@ -214,6 +215,9 @@ config SND_SOC_WM8728 config SND_SOC_WM8731 tristate +config SND_SOC_WM8741 + tristate + config SND_SOC_WM8750 tristate diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index d8d9eebf78b5..53524095759c 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile @@ -35,6 +35,7 @@ snd-soc-wm8711-objs := wm8711.o snd-soc-wm8727-objs := wm8727.o snd-soc-wm8728-objs := wm8728.o snd-soc-wm8731-objs := wm8731.o +snd-soc-wm8741-objs := wm8741.o snd-soc-wm8750-objs := wm8750.o snd-soc-wm8753-objs := wm8753.o snd-soc-wm8776-objs := wm8776.o @@ -103,6 +104,7 @@ obj-$(CONFIG_SND_SOC_WM8711) += snd-soc-wm8711.o obj-$(CONFIG_SND_SOC_WM8727) += snd-soc-wm8727.o obj-$(CONFIG_SND_SOC_WM8728) += snd-soc-wm8728.o obj-$(CONFIG_SND_SOC_WM8731) += snd-soc-wm8731.o +obj-$(CONFIG_SND_SOC_WM8741) += snd-soc-wm8741.o obj-$(CONFIG_SND_SOC_WM8750) += snd-soc-wm8750.o obj-$(CONFIG_SND_SOC_WM8753) += snd-soc-wm8753.o obj-$(CONFIG_SND_SOC_WM8776) += snd-soc-wm8776.o diff --git a/sound/soc/codecs/wm8741.c b/sound/soc/codecs/wm8741.c new file mode 100644 index 000000000000..b9ea8904ad4b --- /dev/null +++ b/sound/soc/codecs/wm8741.c @@ -0,0 +1,579 @@ +/* + * wm8741.c -- WM8741 ALSA SoC Audio driver + * + * Copyright 2010 Wolfson Microelectronics plc + * + * Author: Ian Lartey + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wm8741.h" + +static struct snd_soc_codec *wm8741_codec; +struct snd_soc_codec_device soc_codec_dev_wm8741; + +#define WM8741_NUM_SUPPLIES 2 +static const char *wm8741_supply_names[WM8741_NUM_SUPPLIES] = { + "AVDD", + "DVDD", +}; + +#define WM8741_NUM_RATES 4 + +/* codec private data */ +struct wm8741_priv { + struct snd_soc_codec codec; + u16 reg_cache[WM8741_REGISTER_COUNT]; + struct regulator_bulk_data supplies[WM8741_NUM_SUPPLIES]; + unsigned int sysclk; + unsigned int rate_constraint_list[WM8741_NUM_RATES]; + struct snd_pcm_hw_constraint_list rate_constraint; +}; + +static const u16 wm8741_reg_defaults[WM8741_REGISTER_COUNT] = { + 0x0000, /* R0 - DACLLSB Attenuation */ + 0x0000, /* R1 - DACLMSB Attenuation */ + 0x0000, /* R2 - DACRLSB Attenuation */ + 0x0000, /* R3 - DACRMSB Attenuation */ + 0x0000, /* R4 - Volume Control */ + 0x000A, /* R5 - Format Control */ + 0x0000, /* R6 - Filter Control */ + 0x0000, /* R7 - Mode Control 1 */ + 0x0002, /* R8 - Mode Control 2 */ + 0x0000, /* R9 - Reset */ + 0x0002, /* R32 - ADDITONAL_CONTROL_1 */ +}; + + +static int wm8741_reset(struct snd_soc_codec *codec) +{ + return snd_soc_write(codec, WM8741_RESET, 0); +} + +static const DECLARE_TLV_DB_SCALE(dac_tlv_fine, -12700, 13, 0); +static const DECLARE_TLV_DB_SCALE(dac_tlv, -12700, 400, 0); + +static const struct snd_kcontrol_new wm8741_snd_controls[] = { +SOC_DOUBLE_R_TLV("Fine Playback Volume", WM8741_DACLLSB_ATTENUATION, + WM8741_DACRLSB_ATTENUATION, 1, 255, 1, dac_tlv_fine), +SOC_DOUBLE_R_TLV("Playback Volume", WM8741_DACLMSB_ATTENUATION, + WM8741_DACRMSB_ATTENUATION, 0, 511, 1, dac_tlv), +}; + +static const struct snd_soc_dapm_widget wm8741_dapm_widgets[] = { +SND_SOC_DAPM_DAC("DACL", "Playback", SND_SOC_NOPM, 0, 0), +SND_SOC_DAPM_DAC("DACR", "Playback", SND_SOC_NOPM, 0, 0), +SND_SOC_DAPM_OUTPUT("VOUTLP"), +SND_SOC_DAPM_OUTPUT("VOUTLN"), +SND_SOC_DAPM_OUTPUT("VOUTRP"), +SND_SOC_DAPM_OUTPUT("VOUTRN"), +}; + +static const struct snd_soc_dapm_route intercon[] = { + { "VOUTLP", NULL, "DACL" }, + { "VOUTLN", NULL, "DACL" }, + { "VOUTRP", NULL, "DACR" }, + { "VOUTRN", NULL, "DACR" }, +}; + +static int wm8741_add_widgets(struct snd_soc_codec *codec) +{ + snd_soc_dapm_new_controls(codec, wm8741_dapm_widgets, + ARRAY_SIZE(wm8741_dapm_widgets)); + + snd_soc_dapm_add_routes(codec, intercon, ARRAY_SIZE(intercon)); + + return 0; +} + +static struct { + int value; + int ratio; +} lrclk_ratios[WM8741_NUM_RATES] = { + { 1, 256 }, + { 2, 384 }, + { 3, 512 }, + { 4, 768 }, +}; + + +static int wm8741_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_codec *codec = dai->codec; + struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec); + + /* The set of sample rates that can be supported depends on the + * MCLK supplied to the CODEC - enforce this. + */ + if (!wm8741->sysclk) { + dev_err(codec->dev, + "No MCLK configured, call set_sysclk() on init\n"); + return -EINVAL; + } + + snd_pcm_hw_constraint_list(substream->runtime, 0, + SNDRV_PCM_HW_PARAM_RATE, + &wm8741->rate_constraint); + + return 0; +} + +static int wm8741_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_device *socdev = rtd->socdev; + struct snd_soc_codec *codec = socdev->card->codec; + struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec); + u16 iface = snd_soc_read(codec, WM8741_FORMAT_CONTROL) & 0x1FC; + int i; + + /* Find a supported LRCLK ratio */ + for (i = 0; i < ARRAY_SIZE(lrclk_ratios); i++) { + if (wm8741->sysclk / params_rate(params) == + lrclk_ratios[i].ratio) + break; + } + + /* Should never happen, should be handled by constraints */ + if (i == ARRAY_SIZE(lrclk_ratios)) { + dev_err(codec->dev, "MCLK/fs ratio %d unsupported\n", + wm8741->sysclk / params_rate(params)); + return -EINVAL; + } + + /* bit size */ + switch (params_format(params)) { + case SNDRV_PCM_FORMAT_S16_LE: + break; + case SNDRV_PCM_FORMAT_S20_3LE: + iface |= 0x0001; + break; + case SNDRV_PCM_FORMAT_S24_LE: + iface |= 0x0002; + break; + case SNDRV_PCM_FORMAT_S32_LE: + iface |= 0x0003; + break; + default: + dev_dbg(codec->dev, "wm8741_hw_params: Unsupported bit size param = %d", + params_format(params)); + return -EINVAL; + } + + dev_dbg(codec->dev, "wm8741_hw_params: bit size param = %d", + params_format(params)); + + snd_soc_write(codec, WM8741_FORMAT_CONTROL, iface); + return 0; +} + +static int wm8741_set_dai_sysclk(struct snd_soc_dai *codec_dai, + int clk_id, unsigned int freq, int dir) +{ + struct snd_soc_codec *codec = codec_dai->codec; + struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec); + unsigned int val; + int i; + + dev_dbg(codec->dev, "wm8741_set_dai_sysclk info: freq=%dHz\n", freq); + + wm8741->sysclk = freq; + + wm8741->rate_constraint.count = 0; + + for (i = 0; i < ARRAY_SIZE(lrclk_ratios); i++) { + dev_dbg(codec->dev, "index = %d, ratio = %d, freq = %d", + i, lrclk_ratios[i].ratio, freq); + + val = freq / lrclk_ratios[i].ratio; + /* Check that it's a standard rate since core can't + * cope with others and having the odd rates confuses + * constraint matching. + */ + switch (val) { + case 32000: + case 44100: + case 48000: + case 64000: + case 88200: + case 96000: + dev_dbg(codec->dev, "Supported sample rate: %dHz\n", + val); + wm8741->rate_constraint_list[i] = val; + wm8741->rate_constraint.count++; + break; + default: + dev_dbg(codec->dev, "Skipping sample rate: %dHz\n", + val); + } + } + + /* Need at least one supported rate... */ + if (wm8741->rate_constraint.count == 0) + return -EINVAL; + + return 0; +} + +static int wm8741_set_dai_fmt(struct snd_soc_dai *codec_dai, + unsigned int fmt) +{ + struct snd_soc_codec *codec = codec_dai->codec; + u16 iface = snd_soc_read(codec, WM8741_FORMAT_CONTROL) & 0x1C3; + + /* check master/slave audio interface */ + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBS_CFS: + break; + default: + return -EINVAL; + } + + /* interface format */ + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_I2S: + iface |= 0x0008; + break; + case SND_SOC_DAIFMT_RIGHT_J: + break; + case SND_SOC_DAIFMT_LEFT_J: + iface |= 0x0004; + break; + case SND_SOC_DAIFMT_DSP_A: + iface |= 0x0003; + break; + case SND_SOC_DAIFMT_DSP_B: + iface |= 0x0013; + break; + default: + return -EINVAL; + } + + /* clock inversion */ + switch (fmt & SND_SOC_DAIFMT_INV_MASK) { + case SND_SOC_DAIFMT_NB_NF: + break; + case SND_SOC_DAIFMT_IB_IF: + iface |= 0x0010; + break; + case SND_SOC_DAIFMT_IB_NF: + iface |= 0x0020; + break; + case SND_SOC_DAIFMT_NB_IF: + iface |= 0x0030; + break; + default: + return -EINVAL; + } + + + dev_dbg(codec->dev, "wm8741_set_dai_fmt: Format=%x, Clock Inv=%x\n", + fmt & SND_SOC_DAIFMT_FORMAT_MASK, + ((fmt & SND_SOC_DAIFMT_INV_MASK))); + + snd_soc_write(codec, WM8741_FORMAT_CONTROL, iface); + return 0; +} + +#define WM8741_RATES (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ + SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | \ + SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | \ + SNDRV_PCM_RATE_192000) + +#define WM8741_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ + SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) + +static struct snd_soc_dai_ops wm8741_dai_ops = { + .startup = wm8741_startup, + .hw_params = wm8741_hw_params, + .set_sysclk = wm8741_set_dai_sysclk, + .set_fmt = wm8741_set_dai_fmt, +}; + +struct snd_soc_dai wm8741_dai = { + .name = "WM8741", + .playback = { + .stream_name = "Playback", + .channels_min = 2, /* Mono modes not yet supported */ + .channels_max = 2, + .rates = WM8741_RATES, + .formats = WM8741_FORMATS, + }, + .ops = &wm8741_dai_ops, +}; +EXPORT_SYMBOL_GPL(wm8741_dai); + +#ifdef CONFIG_PM +static int wm8741_resume(struct platform_device *pdev) +{ + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + struct snd_soc_codec *codec = socdev->card->codec; + u16 *cache = codec->reg_cache; + int i; + + /* RESTORE REG Cache */ + for (i = 0; i < WM8741_REGISTER_COUNT; i++) { + if (cache[i] == wm8741_reg_defaults[i] || WM8741_RESET == i) + continue; + snd_soc_write(codec, i, cache[i]); + } + return 0; +} +#else +#define wm8741_suspend NULL +#define wm8741_resume NULL +#endif + +static int wm8741_probe(struct platform_device *pdev) +{ + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + struct snd_soc_codec *codec; + int ret = 0; + + if (wm8741_codec == NULL) { + dev_err(&pdev->dev, "Codec device not registered\n"); + return -ENODEV; + } + + socdev->card->codec = wm8741_codec; + codec = wm8741_codec; + + /* register pcms */ + ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); + if (ret < 0) { + dev_err(codec->dev, "failed to create pcms: %d\n", ret); + goto pcm_err; + } + + snd_soc_add_controls(codec, wm8741_snd_controls, + ARRAY_SIZE(wm8741_snd_controls)); + wm8741_add_widgets(codec); + + return ret; + +pcm_err: + return ret; +} + +static int wm8741_remove(struct platform_device *pdev) +{ + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + + snd_soc_free_pcms(socdev); + snd_soc_dapm_free(socdev); + + return 0; +} + +struct snd_soc_codec_device soc_codec_dev_wm8741 = { + .probe = wm8741_probe, + .remove = wm8741_remove, + .resume = wm8741_resume, +}; +EXPORT_SYMBOL_GPL(soc_codec_dev_wm8741); + +static int wm8741_register(struct wm8741_priv *wm8741, + enum snd_soc_control_type control) +{ + int ret; + struct snd_soc_codec *codec = &wm8741->codec; + int i; + + if (wm8741_codec) { + dev_err(codec->dev, "Another WM8741 is registered\n"); + return -EINVAL; + } + + mutex_init(&codec->mutex); + INIT_LIST_HEAD(&codec->dapm_widgets); + INIT_LIST_HEAD(&codec->dapm_paths); + + snd_soc_codec_set_drvdata(codec, wm8741); + codec->name = "WM8741"; + codec->owner = THIS_MODULE; + codec->bias_level = SND_SOC_BIAS_OFF; + codec->set_bias_level = NULL; + codec->dai = &wm8741_dai; + codec->num_dai = 1; + codec->reg_cache_size = WM8741_REGISTER_COUNT; + codec->reg_cache = &wm8741->reg_cache; + + wm8741->rate_constraint.list = &wm8741->rate_constraint_list[0]; + wm8741->rate_constraint.count = + ARRAY_SIZE(wm8741->rate_constraint_list); + + memcpy(codec->reg_cache, wm8741_reg_defaults, + sizeof(wm8741->reg_cache)); + + ret = snd_soc_codec_set_cache_io(codec, 7, 9, control); + if (ret != 0) { + dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); + goto err; + } + + for (i = 0; i < ARRAY_SIZE(wm8741->supplies); i++) + wm8741->supplies[i].supply = wm8741_supply_names[i]; + + ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8741->supplies), + wm8741->supplies); + if (ret != 0) { + dev_err(codec->dev, "Failed to request supplies: %d\n", ret); + goto err; + } + + ret = regulator_bulk_enable(ARRAY_SIZE(wm8741->supplies), + wm8741->supplies); + if (ret != 0) { + dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); + goto err_get; + } + + ret = wm8741_reset(codec); + if (ret < 0) { + dev_err(codec->dev, "Failed to issue reset\n"); + goto err_enable; + } + + wm8741_dai.dev = codec->dev; + + /* Change some default settings - latch VU */ + wm8741->reg_cache[WM8741_DACLLSB_ATTENUATION] |= WM8741_UPDATELL; + wm8741->reg_cache[WM8741_DACLMSB_ATTENUATION] |= WM8741_UPDATELM; + wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERL; + wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERM; + + wm8741_codec = codec; + + ret = snd_soc_register_codec(codec); + if (ret != 0) { + dev_err(codec->dev, "Failed to register codec: %d\n", ret); + return ret; + } + + ret = snd_soc_register_dai(&wm8741_dai); + if (ret != 0) { + dev_err(codec->dev, "Failed to register DAI: %d\n", ret); + snd_soc_unregister_codec(codec); + return ret; + } + + dev_dbg(codec->dev, "Successful registration\n"); + return 0; + +err_enable: + regulator_bulk_disable(ARRAY_SIZE(wm8741->supplies), wm8741->supplies); + +err_get: + regulator_bulk_free(ARRAY_SIZE(wm8741->supplies), wm8741->supplies); + +err: + kfree(wm8741); + return ret; +} + +static void wm8741_unregister(struct wm8741_priv *wm8741) +{ + regulator_bulk_free(ARRAY_SIZE(wm8741->supplies), wm8741->supplies); + + snd_soc_unregister_dai(&wm8741_dai); + snd_soc_unregister_codec(&wm8741->codec); + kfree(wm8741); + wm8741_codec = NULL; +} + +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +static __devinit int wm8741_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) +{ + struct wm8741_priv *wm8741; + struct snd_soc_codec *codec; + + wm8741 = kzalloc(sizeof(struct wm8741_priv), GFP_KERNEL); + if (wm8741 == NULL) + return -ENOMEM; + + codec = &wm8741->codec; + codec->hw_write = (hw_write_t)i2c_master_send; + + i2c_set_clientdata(i2c, wm8741); + codec->control_data = i2c; + + codec->dev = &i2c->dev; + + return wm8741_register(wm8741, SND_SOC_I2C); +} + +static __devexit int wm8741_i2c_remove(struct i2c_client *client) +{ + struct wm8741_priv *wm8741 = i2c_get_clientdata(client); + wm8741_unregister(wm8741); + return 0; +} + +static const struct i2c_device_id wm8741_i2c_id[] = { + { "wm8741", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, wm8741_i2c_id); + + +static struct i2c_driver wm8741_i2c_driver = { + .driver = { + .name = "WM8741", + .owner = THIS_MODULE, + }, + .probe = wm8741_i2c_probe, + .remove = __devexit_p(wm8741_i2c_remove), + .id_table = wm8741_i2c_id, +}; +#endif + +static int __init wm8741_modinit(void) +{ + int ret; +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) + ret = i2c_add_driver(&wm8741_i2c_driver); + if (ret != 0) { + printk(KERN_ERR "Failed to register WM8741 I2C driver: %d\n", + ret); + } +#endif + return 0; +} +module_init(wm8741_modinit); + +static void __exit wm8741_exit(void) +{ +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) + i2c_del_driver(&wm8741_i2c_driver); +#endif +} +module_exit(wm8741_exit); + +MODULE_DESCRIPTION("ASoC WM8741 driver"); +MODULE_AUTHOR("Ian Lartey "); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/wm8741.h b/sound/soc/codecs/wm8741.h new file mode 100644 index 000000000000..fdef6ecd1f6f --- /dev/null +++ b/sound/soc/codecs/wm8741.h @@ -0,0 +1,214 @@ +/* + * wm8741.h -- WM8423 ASoC driver + * + * Copyright 2010 Wolfson Microelectronics, plc + * + * Author: Ian Lartey + * + * Based on wm8753.h + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _WM8741_H +#define _WM8741_H + +/* + * Register values. + */ +#define WM8741_DACLLSB_ATTENUATION 0x00 +#define WM8741_DACLMSB_ATTENUATION 0x01 +#define WM8741_DACRLSB_ATTENUATION 0x02 +#define WM8741_DACRMSB_ATTENUATION 0x03 +#define WM8741_VOLUME_CONTROL 0x04 +#define WM8741_FORMAT_CONTROL 0x05 +#define WM8741_FILTER_CONTROL 0x06 +#define WM8741_MODE_CONTROL_1 0x07 +#define WM8741_MODE_CONTROL_2 0x08 +#define WM8741_RESET 0x09 +#define WM8741_ADDITIONAL_CONTROL_1 0x20 + +#define WM8741_REGISTER_COUNT 11 +#define WM8741_MAX_REGISTER 0x20 + +/* + * Field Definitions. + */ + +/* + * R0 (0x00) - DACLLSB_ATTENUATION + */ +#define WM8741_UPDATELL 0x0020 /* UPDATELL */ +#define WM8741_UPDATELL_MASK 0x0020 /* UPDATELL */ +#define WM8741_UPDATELL_SHIFT 5 /* UPDATELL */ +#define WM8741_UPDATELL_WIDTH 1 /* UPDATELL */ +#define WM8741_LAT_4_0_MASK 0x001F /* LAT[4:0] - [4:0] */ +#define WM8741_LAT_4_0_SHIFT 0 /* LAT[4:0] - [4:0] */ +#define WM8741_LAT_4_0_WIDTH 5 /* LAT[4:0] - [4:0] */ + +/* + * R1 (0x01) - DACLMSB_ATTENUATION + */ +#define WM8741_UPDATELM 0x0020 /* UPDATELM */ +#define WM8741_UPDATELM_MASK 0x0020 /* UPDATELM */ +#define WM8741_UPDATELM_SHIFT 5 /* UPDATELM */ +#define WM8741_UPDATELM_WIDTH 1 /* UPDATELM */ +#define WM8741_LAT_9_5_0_MASK 0x001F /* LAT[9:5] - [4:0] */ +#define WM8741_LAT_9_5_0_SHIFT 0 /* LAT[9:5] - [4:0] */ +#define WM8741_LAT_9_5_0_WIDTH 5 /* LAT[9:5] - [4:0] */ + +/* + * R2 (0x02) - DACRLSB_ATTENUATION + */ +#define WM8741_UPDATERL 0x0020 /* UPDATERL */ +#define WM8741_UPDATERL_MASK 0x0020 /* UPDATERL */ +#define WM8741_UPDATERL_SHIFT 5 /* UPDATERL */ +#define WM8741_UPDATERL_WIDTH 1 /* UPDATERL */ +#define WM8741_RAT_4_0_MASK 0x001F /* RAT[4:0] - [4:0] */ +#define WM8741_RAT_4_0_SHIFT 0 /* RAT[4:0] - [4:0] */ +#define WM8741_RAT_4_0_WIDTH 5 /* RAT[4:0] - [4:0] */ + +/* + * R3 (0x03) - DACRMSB_ATTENUATION + */ +#define WM8741_UPDATERM 0x0020 /* UPDATERM */ +#define WM8741_UPDATERM_MASK 0x0020 /* UPDATERM */ +#define WM8741_UPDATERM_SHIFT 5 /* UPDATERM */ +#define WM8741_UPDATERM_WIDTH 1 /* UPDATERM */ +#define WM8741_RAT_9_5_0_MASK 0x001F /* RAT[9:5] - [4:0] */ +#define WM8741_RAT_9_5_0_SHIFT 0 /* RAT[9:5] - [4:0] */ +#define WM8741_RAT_9_5_0_WIDTH 5 /* RAT[9:5] - [4:0] */ + +/* + * R4 (0x04) - VOLUME_CONTROL + */ +#define WM8741_AMUTE 0x0080 /* AMUTE */ +#define WM8741_AMUTE_MASK 0x0080 /* AMUTE */ +#define WM8741_AMUTE_SHIFT 7 /* AMUTE */ +#define WM8741_AMUTE_WIDTH 1 /* AMUTE */ +#define WM8741_ZFLAG_MASK 0x0060 /* ZFLAG - [6:5] */ +#define WM8741_ZFLAG_SHIFT 5 /* ZFLAG - [6:5] */ +#define WM8741_ZFLAG_WIDTH 2 /* ZFLAG - [6:5] */ +#define WM8741_IZD 0x0010 /* IZD */ +#define WM8741_IZD_MASK 0x0010 /* IZD */ +#define WM8741_IZD_SHIFT 4 /* IZD */ +#define WM8741_IZD_WIDTH 1 /* IZD */ +#define WM8741_SOFT 0x0008 /* SOFT MUTE */ +#define WM8741_SOFT_MASK 0x0008 /* SOFT MUTE */ +#define WM8741_SOFT_SHIFT 3 /* SOFT MUTE */ +#define WM8741_SOFT_WIDTH 1 /* SOFT MUTE */ +#define WM8741_ATC 0x0004 /* ATC */ +#define WM8741_ATC_MASK 0x0004 /* ATC */ +#define WM8741_ATC_SHIFT 2 /* ATC */ +#define WM8741_ATC_WIDTH 1 /* ATC */ +#define WM8741_ATT2DB 0x0002 /* ATT2DB */ +#define WM8741_ATT2DB_MASK 0x0002 /* ATT2DB */ +#define WM8741_ATT2DB_SHIFT 1 /* ATT2DB */ +#define WM8741_ATT2DB_WIDTH 1 /* ATT2DB */ +#define WM8741_VOL_RAMP 0x0001 /* VOL_RAMP */ +#define WM8741_VOL_RAMP_MASK 0x0001 /* VOL_RAMP */ +#define WM8741_VOL_RAMP_SHIFT 0 /* VOL_RAMP */ +#define WM8741_VOL_RAMP_WIDTH 1 /* VOL_RAMP */ + +/* + * R5 (0x05) - FORMAT_CONTROL + */ +#define WM8741_PWDN 0x0080 /* PWDN */ +#define WM8741_PWDN_MASK 0x0080 /* PWDN */ +#define WM8741_PWDN_SHIFT 7 /* PWDN */ +#define WM8741_PWDN_WIDTH 1 /* PWDN */ +#define WM8741_REV 0x0040 /* REV */ +#define WM8741_REV_MASK 0x0040 /* REV */ +#define WM8741_REV_SHIFT 6 /* REV */ +#define WM8741_REV_WIDTH 1 /* REV */ +#define WM8741_BCP 0x0020 /* BCP */ +#define WM8741_BCP_MASK 0x0020 /* BCP */ +#define WM8741_BCP_SHIFT 5 /* BCP */ +#define WM8741_BCP_WIDTH 1 /* BCP */ +#define WM8741_LRP 0x0010 /* LRP */ +#define WM8741_LRP_MASK 0x0010 /* LRP */ +#define WM8741_LRP_SHIFT 4 /* LRP */ +#define WM8741_LRP_WIDTH 1 /* LRP */ +#define WM8741_FMT_MASK 0x000C /* FMT - [3:2] */ +#define WM8741_FMT_SHIFT 2 /* FMT - [3:2] */ +#define WM8741_FMT_WIDTH 2 /* FMT - [3:2] */ +#define WM8741_IWL_MASK 0x0003 /* IWL - [1:0] */ +#define WM8741_IWL_SHIFT 0 /* IWL - [1:0] */ +#define WM8741_IWL_WIDTH 2 /* IWL - [1:0] */ + +/* + * R6 (0x06) - FILTER_CONTROL + */ +#define WM8741_ZFLAG_HI 0x0080 /* ZFLAG_HI */ +#define WM8741_ZFLAG_HI_MASK 0x0080 /* ZFLAG_HI */ +#define WM8741_ZFLAG_HI_SHIFT 7 /* ZFLAG_HI */ +#define WM8741_ZFLAG_HI_WIDTH 1 /* ZFLAG_HI */ +#define WM8741_DEEMPH_MASK 0x0060 /* DEEMPH - [6:5] */ +#define WM8741_DEEMPH_SHIFT 5 /* DEEMPH - [6:5] */ +#define WM8741_DEEMPH_WIDTH 2 /* DEEMPH - [6:5] */ +#define WM8741_DSDFILT_MASK 0x0018 /* DSDFILT - [4:3] */ +#define WM8741_DSDFILT_SHIFT 3 /* DSDFILT - [4:3] */ +#define WM8741_DSDFILT_WIDTH 2 /* DSDFILT - [4:3] */ +#define WM8741_FIRSEL_MASK 0x0007 /* FIRSEL - [2:0] */ +#define WM8741_FIRSEL_SHIFT 0 /* FIRSEL - [2:0] */ +#define WM8741_FIRSEL_WIDTH 3 /* FIRSEL - [2:0] */ + +/* + * R7 (0x07) - MODE_CONTROL_1 + */ +#define WM8741_MODE8X 0x0080 /* MODE8X */ +#define WM8741_MODE8X_MASK 0x0080 /* MODE8X */ +#define WM8741_MODE8X_SHIFT 7 /* MODE8X */ +#define WM8741_MODE8X_WIDTH 1 /* MODE8X */ +#define WM8741_OSR_MASK 0x0060 /* OSR - [6:5] */ +#define WM8741_OSR_SHIFT 5 /* OSR - [6:5] */ +#define WM8741_OSR_WIDTH 2 /* OSR - [6:5] */ +#define WM8741_SR_MASK 0x001C /* SR - [4:2] */ +#define WM8741_SR_SHIFT 2 /* SR - [4:2] */ +#define WM8741_SR_WIDTH 3 /* SR - [4:2] */ +#define WM8741_MODESEL_MASK 0x0003 /* MODESEL - [1:0] */ +#define WM8741_MODESEL_SHIFT 0 /* MODESEL - [1:0] */ +#define WM8741_MODESEL_WIDTH 2 /* MODESEL - [1:0] */ + +/* + * R8 (0x08) - MODE_CONTROL_2 + */ +#define WM8741_DSD_GAIN 0x0040 /* DSD_GAIN */ +#define WM8741_DSD_GAIN_MASK 0x0040 /* DSD_GAIN */ +#define WM8741_DSD_GAIN_SHIFT 6 /* DSD_GAIN */ +#define WM8741_DSD_GAIN_WIDTH 1 /* DSD_GAIN */ +#define WM8741_SDOUT 0x0020 /* SDOUT */ +#define WM8741_SDOUT_MASK 0x0020 /* SDOUT */ +#define WM8741_SDOUT_SHIFT 5 /* SDOUT */ +#define WM8741_SDOUT_WIDTH 1 /* SDOUT */ +#define WM8741_DOUT 0x0010 /* DOUT */ +#define WM8741_DOUT_MASK 0x0010 /* DOUT */ +#define WM8741_DOUT_SHIFT 4 /* DOUT */ +#define WM8741_DOUT_WIDTH 1 /* DOUT */ +#define WM8741_DIFF_MASK 0x000C /* DIFF - [3:2] */ +#define WM8741_DIFF_SHIFT 2 /* DIFF - [3:2] */ +#define WM8741_DIFF_WIDTH 2 /* DIFF - [3:2] */ +#define WM8741_DITHER_MASK 0x0003 /* DITHER - [1:0] */ +#define WM8741_DITHER_SHIFT 0 /* DITHER - [1:0] */ +#define WM8741_DITHER_WIDTH 2 /* DITHER - [1:0] */ + +/* + * R32 (0x20) - ADDITONAL_CONTROL_1 + */ +#define WM8741_DSD_LEVEL 0x0002 /* DSD_LEVEL */ +#define WM8741_DSD_LEVEL_MASK 0x0002 /* DSD_LEVEL */ +#define WM8741_DSD_LEVEL_SHIFT 1 /* DSD_LEVEL */ +#define WM8741_DSD_LEVEL_WIDTH 1 /* DSD_LEVEL */ +#define WM8741_DSD_NO_NOTCH 0x0001 /* DSD_NO_NOTCH */ +#define WM8741_DSD_NO_NOTCH_MASK 0x0001 /* DSD_NO_NOTCH */ +#define WM8741_DSD_NO_NOTCH_SHIFT 0 /* DSD_NO_NOTCH */ +#define WM8741_DSD_NO_NOTCH_WIDTH 1 /* DSD_NO_NOTCH */ + +#define WM8741_SYSCLK 0 + +extern struct snd_soc_dai wm8741_dai; +extern struct snd_soc_codec_device soc_codec_dev_wm8741; + +#endif -- cgit v1.2.3 From fd3c8ac9cb653f7e3122bba9bc7beaad6062b7f4 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Fri, 23 Jul 2010 05:53:43 +0000 Subject: ASoC: ad1836: fix a memory leak if another ad1836 is registered ad1836 is allocated in ad1836_spi_probe() but is not freed if ad1836_register() return -EINVAL (if another ad1836 is registered). Signed-off-by: Axel Lin Acked-by: Barry Song <21cnbao@gmail.com> Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/ad1836.c | 1 + 1 file changed, 1 insertion(+) (limited to 'sound') diff --git a/sound/soc/codecs/ad1836.c b/sound/soc/codecs/ad1836.c index 217538423225..a01006c8c606 100644 --- a/sound/soc/codecs/ad1836.c +++ b/sound/soc/codecs/ad1836.c @@ -272,6 +272,7 @@ static int ad1836_register(struct ad1836_priv *ad1836) if (ad1836_codec) { dev_err(codec->dev, "Another ad1836 is registered\n"); + kfree(ad1836); return -EINVAL; } -- cgit v1.2.3 From 7bcaad919bc7aaa084f5884aa15654fe1fa4c77f Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Fri, 23 Jul 2010 05:53:44 +0000 Subject: ASoC: ak4642: fix a memory leak if failed to initialise AK4642 ak4642 should be kfreed if ak4642_init() return error. Signed-off-by: Axel Lin Reviewed-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/ak4642.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 60b83b482467..3d7dc55305ec 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -498,8 +498,10 @@ static int ak4642_i2c_probe(struct i2c_client *i2c, codec->control_data = i2c; ret = ak4642_init(ak4642); - if (ret < 0) + if (ret < 0) { printk(KERN_ERR "failed to initialise AK4642\n"); + kfree(ak4642); + } return ret; } -- cgit v1.2.3 From 085efd28b65582fac459359672421a1c479e7db1 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Fri, 23 Jul 2010 05:53:45 +0000 Subject: ASoC: da7210: fix a memory leak if failed to initialise da7210 audio codec da7210 should be kfreed if da7210_init() return error. This patch also fixes the error handing in the case of snd_soc_register_dai() fail by adding snd_soc_unregister_codec() in error path. Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/da7210.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/da7210.c b/sound/soc/codecs/da7210.c index 3e42d1e0e601..3c51d6a57523 100644 --- a/sound/soc/codecs/da7210.c +++ b/sound/soc/codecs/da7210.c @@ -499,7 +499,7 @@ static int da7210_init(struct da7210_priv *da7210) ret = snd_soc_register_dai(&da7210_dai); if (ret) { dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - goto init_err; + goto codec_err; } /* FIXME @@ -585,6 +585,8 @@ static int da7210_init(struct da7210_priv *da7210) return ret; +codec_err: + snd_soc_unregister_codec(codec); init_err: kfree(codec->reg_cache); codec->reg_cache = NULL; @@ -612,8 +614,10 @@ static int __devinit da7210_i2c_probe(struct i2c_client *i2c, codec->control_data = i2c; ret = da7210_init(da7210); - if (ret < 0) + if (ret < 0) { pr_err("Failed to initialise da7210 audio codec\n"); + kfree(da7210); + } return ret; } -- cgit v1.2.3 From ef99e9b5a10086bcc529e6c0a11c6539caee8cd1 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Fri, 23 Jul 2010 05:53:46 +0000 Subject: ASoC: wm8523: fix resource reclaim in wm8523_register error path This patch includes below fixes: 1. If another WM8523 is registered, need to kfree wm8523 before return -EINVAL. 2. If snd_soc_register_codec failed, goto error path to properly free resources. 3. Instead of using mixed in-line and goto style cleanup, use goto style error handling if snd_soc_register_dai failed. Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/wm8523.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8523.c b/sound/soc/codecs/wm8523.c index 37242a7d3077..0ad039b4adf5 100644 --- a/sound/soc/codecs/wm8523.c +++ b/sound/soc/codecs/wm8523.c @@ -482,7 +482,8 @@ static int wm8523_register(struct wm8523_priv *wm8523, if (wm8523_codec) { dev_err(codec->dev, "Another WM8523 is registered\n"); - return -EINVAL; + ret = -EINVAL; + goto err; } mutex_init(&codec->mutex); @@ -570,18 +571,19 @@ static int wm8523_register(struct wm8523_priv *wm8523, ret = snd_soc_register_codec(codec); if (ret != 0) { dev_err(codec->dev, "Failed to register codec: %d\n", ret); - return ret; + goto err_enable; } ret = snd_soc_register_dai(&wm8523_dai); if (ret != 0) { dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - snd_soc_unregister_codec(codec); - return ret; + goto err_codec; } return 0; +err_codec: + snd_soc_unregister_codec(codec); err_enable: regulator_bulk_disable(ARRAY_SIZE(wm8523->supplies), wm8523->supplies); err_get: -- cgit v1.2.3 From 2c2749de118bd36645b3a4a56f0d8ef6d4fd09cf Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Fri, 23 Jul 2010 05:53:47 +0000 Subject: ASoC: wm8711: fix a memory leak if another WM8711 is registered wm8711 is allocated in either wm8711_spi_probe() or wm8711_i2c_probe() but is not freed if wm8711_register() return -EINVAL(if another ad1836 is registered). Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/wm8711.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8711.c b/sound/soc/codecs/wm8711.c index effb14eee7d4..e2dba07f0260 100644 --- a/sound/soc/codecs/wm8711.c +++ b/sound/soc/codecs/wm8711.c @@ -439,7 +439,8 @@ static int wm8711_register(struct wm8711_priv *wm8711, if (wm8711_codec) { dev_err(codec->dev, "Another WM8711 is registered\n"); - return -EINVAL; + ret = -EINVAL; + goto err; } mutex_init(&codec->mutex); -- cgit v1.2.3 From 62f5ad6733b872e14d671b615850eb5bd1cd7e30 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Fri, 23 Jul 2010 05:53:48 +0000 Subject: ASoC: wm8904: fix resource reclaim in wm8904_register error path This patch includes below fixes: 1. wm8904 need to be kfreed in wm8904_register() error path before return. 2. fix the error path for snd_soc_register_codec() fail and snd_soc_register_dai() fail to properly free resources. Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/wm8904.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c index 87f14f8675fa..f7dcabf6283c 100644 --- a/sound/soc/codecs/wm8904.c +++ b/sound/soc/codecs/wm8904.c @@ -2433,7 +2433,8 @@ static int wm8904_register(struct wm8904_priv *wm8904, if (wm8904_codec) { dev_err(codec->dev, "Another WM8904 is registered\n"); - return -EINVAL; + ret = -EINVAL; + goto err; } mutex_init(&codec->mutex); @@ -2462,7 +2463,8 @@ static int wm8904_register(struct wm8904_priv *wm8904, default: dev_err(codec->dev, "Unknown device type %d\n", wm8904->devtype); - return -EINVAL; + ret = -EINVAL; + goto err; } memcpy(codec->reg_cache, wm8904_reg, sizeof(wm8904_reg)); @@ -2566,18 +2568,19 @@ static int wm8904_register(struct wm8904_priv *wm8904, ret = snd_soc_register_codec(codec); if (ret != 0) { dev_err(codec->dev, "Failed to register codec: %d\n", ret); - return ret; + goto err_enable; } ret = snd_soc_register_dai(&wm8904_dai); if (ret != 0) { dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - snd_soc_unregister_codec(codec); - return ret; + goto err_codec; } return 0; +err_codec: + snd_soc_unregister_codec(codec); err_enable: regulator_bulk_disable(ARRAY_SIZE(wm8904->supplies), wm8904->supplies); err_get: -- cgit v1.2.3 From db1e18de98c8bdf8a2bfc07623ff67621aa4a332 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Fri, 23 Jul 2010 05:53:49 +0000 Subject: ASoC: wm8940: fix a memory leak if wm8940_register return error This patch adds checking for wm8940_register return value, and does kfree(wm8940) if wm8940_register() fail. Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/wm8940.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8940.c b/sound/soc/codecs/wm8940.c index e3c4bbfaae27..f0c11138e610 100644 --- a/sound/soc/codecs/wm8940.c +++ b/sound/soc/codecs/wm8940.c @@ -845,6 +845,7 @@ static void wm8940_unregister(struct wm8940_priv *wm8940) static int wm8940_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { + int ret; struct wm8940_priv *wm8940; struct snd_soc_codec *codec; @@ -858,7 +859,11 @@ static int wm8940_i2c_probe(struct i2c_client *i2c, codec->control_data = i2c; codec->dev = &i2c->dev; - return wm8940_register(wm8940, SND_SOC_I2C); + ret = wm8940_register(wm8940, SND_SOC_I2C); + if (ret < 0) + kfree(wm8940); + + return ret; } static int __devexit wm8940_i2c_remove(struct i2c_client *client) -- cgit v1.2.3 From 8089a49d99bb25bc63237ae8e90a84c72897b66d Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Fri, 23 Jul 2010 05:53:50 +0000 Subject: ASoC: wm8955: fix resource reclaim in wm8955_register error path This patch fixes the error path in wm8955_register to properly free resources. Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/wm8955.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8955.c b/sound/soc/codecs/wm8955.c index fedb76452f1b..5f025593d84d 100644 --- a/sound/soc/codecs/wm8955.c +++ b/sound/soc/codecs/wm8955.c @@ -964,7 +964,8 @@ static int wm8955_register(struct wm8955_priv *wm8955, if (wm8955_codec) { dev_err(codec->dev, "Another WM8955 is registered\n"); - return -EINVAL; + ret = -EINVAL; + goto err; } mutex_init(&codec->mutex); @@ -1047,18 +1048,19 @@ static int wm8955_register(struct wm8955_priv *wm8955, ret = snd_soc_register_codec(codec); if (ret != 0) { dev_err(codec->dev, "Failed to register codec: %d\n", ret); - return ret; + goto err_enable; } ret = snd_soc_register_dai(&wm8955_dai); if (ret != 0) { dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - snd_soc_unregister_codec(codec); - return ret; + goto err_codec; } return 0; +err_codec: + snd_soc_unregister_codec(codec); err_enable: regulator_bulk_disable(ARRAY_SIZE(wm8955->supplies), wm8955->supplies); err_get: -- cgit v1.2.3 From 6b5d071e8ba7d802f3123e7b7a37ea13650a98bf Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Fri, 23 Jul 2010 05:53:51 +0000 Subject: ASoC: wm8961: fix resource reclaim in wm8961_register error path This patch fixes the error path in wm8961_register to properly free resources. Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/wm8961.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8961.c b/sound/soc/codecs/wm8961.c index 5b9a756242f1..2549d3a297ab 100644 --- a/sound/soc/codecs/wm8961.c +++ b/sound/soc/codecs/wm8961.c @@ -1102,7 +1102,7 @@ static int wm8961_register(struct wm8961_priv *wm8961) ret = wm8961_reset(codec); if (ret < 0) { dev_err(codec->dev, "Failed to issue reset\n"); - return ret; + goto err; } /* Enable class W */ @@ -1147,18 +1147,19 @@ static int wm8961_register(struct wm8961_priv *wm8961) ret = snd_soc_register_codec(codec); if (ret != 0) { dev_err(codec->dev, "Failed to register codec: %d\n", ret); - return ret; + goto err; } ret = snd_soc_register_dai(&wm8961_dai); if (ret != 0) { dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - snd_soc_unregister_codec(codec); - return ret; + goto err_codec; } return 0; +err_codec: + snd_soc_unregister_codec(codec); err: kfree(wm8961); return ret; -- cgit v1.2.3 From 4eaac50552395f693b8c428872e8b5311c3dab60 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Fri, 23 Jul 2010 05:53:52 +0000 Subject: ASoC: wm8974: fix a memory leak if another WM8974 is registered wm8974 is allocated in wm8974_i2c_probe() but is not freed if wm8974_register() return -EINVAL (if another WM8974 is registered). Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/wm8974.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8974.c b/sound/soc/codecs/wm8974.c index a2c4b2f37cca..1468fe10cbbe 100644 --- a/sound/soc/codecs/wm8974.c +++ b/sound/soc/codecs/wm8974.c @@ -670,7 +670,8 @@ static __devinit int wm8974_register(struct wm8974_priv *wm8974) if (wm8974_codec) { dev_err(codec->dev, "Another WM8974 is registered\n"); - return -EINVAL; + ret = -EINVAL; + goto err; } mutex_init(&codec->mutex); -- cgit v1.2.3 From d484366beeab0cded9644083172151c5afacc503 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Fri, 23 Jul 2010 05:53:53 +0000 Subject: ASoC: wm8978: fix a memory leak if a wm8978_register fail There is a memory leak found if wm8978_register() fail. This patch moves the buffer allocate and release at the same level to prevent the memory leak. Signed-off-by: Axel Lin Reviewed-by: Guennadi Liakhovetski Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/wm8978.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8978.c b/sound/soc/codecs/wm8978.c index 51d5f433215c..8a1ad778e7e3 100644 --- a/sound/soc/codecs/wm8978.c +++ b/sound/soc/codecs/wm8978.c @@ -1076,7 +1076,6 @@ static __devinit int wm8978_register(struct wm8978_priv *wm8978) err_codec: snd_soc_unregister_codec(codec); err: - kfree(wm8978); return ret; } @@ -1085,13 +1084,13 @@ static __devexit void wm8978_unregister(struct wm8978_priv *wm8978) wm8978_set_bias_level(&wm8978->codec, SND_SOC_BIAS_OFF); snd_soc_unregister_dai(&wm8978_dai); snd_soc_unregister_codec(&wm8978->codec); - kfree(wm8978); wm8978_codec = NULL; } static __devinit int wm8978_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { + int ret; struct wm8978_priv *wm8978; struct snd_soc_codec *codec; @@ -1107,13 +1106,18 @@ static __devinit int wm8978_i2c_probe(struct i2c_client *i2c, codec->dev = &i2c->dev; - return wm8978_register(wm8978); + ret = wm8978_register(wm8978); + if (ret < 0) + kfree(wm8978); + + return ret; } static __devexit int wm8978_i2c_remove(struct i2c_client *client) { struct wm8978_priv *wm8978 = i2c_get_clientdata(client); wm8978_unregister(wm8978); + kfree(wm8978); return 0; } -- cgit v1.2.3 From 116bcd9cf22c00c22402c2a2be6ef8e81289a574 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Fri, 23 Jul 2010 05:53:54 +0000 Subject: ASoC: wm9081: fix resource reclaim in wm9081_register error path This patch fixes the error path in wm9081_register to properly free resources. Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/wm9081.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm9081.c b/sound/soc/codecs/wm9081.c index 13186fb4dcb4..76b37ff6c264 100644 --- a/sound/soc/codecs/wm9081.c +++ b/sound/soc/codecs/wm9081.c @@ -1356,7 +1356,7 @@ static int wm9081_register(struct wm9081_priv *wm9081, ret = snd_soc_codec_set_cache_io(codec, 8, 16, control); if (ret != 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - return ret; + goto err; } reg = snd_soc_read(codec, WM9081_SOFTWARE_RESET); @@ -1369,7 +1369,7 @@ static int wm9081_register(struct wm9081_priv *wm9081, ret = wm9081_reset(codec); if (ret < 0) { dev_err(codec->dev, "Failed to issue reset\n"); - return ret; + goto err; } wm9081_set_bias_level(codec, SND_SOC_BIAS_STANDBY); @@ -1388,18 +1388,19 @@ static int wm9081_register(struct wm9081_priv *wm9081, ret = snd_soc_register_codec(codec); if (ret != 0) { dev_err(codec->dev, "Failed to register codec: %d\n", ret); - return ret; + goto err; } ret = snd_soc_register_dai(&wm9081_dai); if (ret != 0) { dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - snd_soc_unregister_codec(codec); - return ret; + goto err_codec; } return 0; +err_codec: + snd_soc_unregister_codec(codec); err: kfree(wm9081); return ret; -- cgit v1.2.3 From 607bc3e4888443cdd21a795f7312f64c2de26b5c Mon Sep 17 00:00:00 2001 From: Jerone Young Date: Tue, 3 Aug 2010 01:46:42 -0500 Subject: ALSA: hda - FIX to not expose SPDIF on Thinkpad X301, since it does not have the ability to use SPDIF The Lenovo X301 does not have the ability to connect to a docking station to use the SPDIF port. It also does not have the ability to do SPDIF though the headphone jack or Display Port jacks. This patch fixes it so this is not exposed for the X301 and users do think it has the ability to do SPDIF. I tested both headphone & display port jacks and it is not there. I have tested this patch and it works great. Also to add the other Thinkpads have different subsystem codec IDs. Here are examples: X301: http://launchpadlibrarian.net/31561902/Card0.Codecs.codec.0.txt X200: http://launchpadlibrarian.net/49055036/Card0.Codecs.codec.0.txt W500: http://launchpadlibrarian.net/36276057/Card0.Codecs.codec.0.txt Signed-off-by: Jerone Young Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_conexant.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index d6341f3fef01..df8b19b17308 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -2057,6 +2057,10 @@ static int patch_cxt5051(struct hda_codec *codec) break; case CXT5051_LENOVO_X200: spec->init_verbs[0] = cxt5051_lenovo_x200_init_verbs; + /* Thinkpad X301 does not have S/PDIF wired and no ability + to use a docking station. */ + if (codec->subsystem_id == 0x17aa211f) + spec->multiout.dig_out_nid = 0; break; case CXT5051_F700: spec->init_verbs[0] = cxt5051_f700_init_verbs; -- cgit v1.2.3 From 68c18697910fdcacea36bd58d2d3d8febfa199a2 Mon Sep 17 00:00:00 2001 From: Jerone Young Date: Tue, 3 Aug 2010 01:46:44 -0500 Subject: ALSA: hda - Fix Thinkpad X300 so SPDIF is not exposed Just as with the X301. The X300 does not have a way to do SPDIF either. It does not have a dock connector, nor does it have the SPDIF through the headphone jack. This patch fixes it so X300 does not show SPDIF, since it cannot do it. To add all Lenovo Thinkpads had different codec subsytem IDs: X300: http://launchpadlibrarian.net/34862838/Card0.Codecs.codec.0.txt Signed-off-by: Jerone Young Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_analog.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index afbe314a5bf3..b697fd2a6f8b 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c @@ -3662,7 +3662,12 @@ static int patch_ad1984(struct hda_codec *codec) codec->patch_ops.build_pcms = ad1984_build_pcms; break; case AD1984_THINKPAD: - spec->multiout.dig_out_nid = AD1884_SPDIF_OUT; + if (codec->subsystem_id == 0x17aa20fb) { + /* Thinpad X300 does not have the ability to do SPDIF, + or attach to docking station to use SPDIF */ + spec->multiout.dig_out_nid = 0; + } else + spec->multiout.dig_out_nid = AD1884_SPDIF_OUT; spec->input_mux = &ad1984_thinkpad_capture_source; spec->mixers[0] = ad1984_thinkpad_mixers; spec->init_verbs[spec->num_init_verbs++] = ad1984_thinkpad_init_verbs; -- cgit v1.2.3 From 9a017a910346afd88ec2e065989903bf211a7d37 Mon Sep 17 00:00:00 2001 From: Dominik Brodowski Date: Sat, 24 Jul 2010 15:58:54 +0200 Subject: pcmcia: do not use io_req_t after call to pcmcia_request_io() After pcmcia_request_io(), do not make use of the values stored in io_req_t, but instead use those found in struct pcmcia_device->resource[]. CC: netdev@vger.kernel.org CC: linux-wireless@vger.kernel.org CC: linux-ide@vger.kernel.org CC: linux-usb@vger.kernel.org CC: laforge@gnumonks.org CC: linux-mtd@lists.infradead.org CC: alsa-devel@alsa-project.org CC: linux-serial@vger.kernel.org Acked-by: Marcel Holtmann (for drivers/bluetooth/) Signed-off-by: Dominik Brodowski --- sound/pcmcia/pdaudiocf/pdaudiocf.c | 3 ++- sound/pcmcia/vx/vxpocket.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/pcmcia/pdaudiocf/pdaudiocf.c b/sound/pcmcia/pdaudiocf/pdaudiocf.c index df110df52a8b..9f897bca0615 100644 --- a/sound/pcmcia/pdaudiocf/pdaudiocf.c +++ b/sound/pcmcia/pdaudiocf/pdaudiocf.c @@ -231,7 +231,8 @@ static int pdacf_config(struct pcmcia_device *link) if (ret) goto failed; - if (snd_pdacf_assign_resources(pdacf, link->io.BasePort1, link->irq) < 0) + if (snd_pdacf_assign_resources(pdacf, link->resource[0]->start, + link->irq) < 0) goto failed; return 0; diff --git a/sound/pcmcia/vx/vxpocket.c b/sound/pcmcia/vx/vxpocket.c index 624b47a85f0a..f23c235013a4 100644 --- a/sound/pcmcia/vx/vxpocket.c +++ b/sound/pcmcia/vx/vxpocket.c @@ -241,7 +241,8 @@ static int vxpocket_config(struct pcmcia_device *link) chip->dev = &link->dev; snd_card_set_dev(chip->card, chip->dev); - if (snd_vxpocket_assign_resources(chip, link->io.BasePort1, link->irq) < 0) + if (snd_vxpocket_assign_resources(chip, link->resource[0]->start, + link->irq) < 0) goto failed; return 0; -- cgit v1.2.3 From 90abdc3b973229bae98dd96649d9f7106cc177a4 Mon Sep 17 00:00:00 2001 From: Dominik Brodowski Date: Sat, 24 Jul 2010 17:23:51 +0200 Subject: pcmcia: do not use io_req_t when calling pcmcia_request_io() Instead of io_req_t, drivers are now requested to fill out struct pcmcia_device *p_dev->resource[0,1] for up to two ioport ranges. After a call to pcmcia_request_io(), the ports found there are reserved, after calling pcmcia_request_configuration(), they may be used. CC: netdev@vger.kernel.org CC: linux-wireless@vger.kernel.org CC: linux-ide@vger.kernel.org CC: linux-usb@vger.kernel.org CC: laforge@gnumonks.org CC: linux-mtd@lists.infradead.org CC: alsa-devel@alsa-project.org CC: linux-serial@vger.kernel.org CC: Michael Buesch Acked-by: Marcel Holtmann (for drivers/bluetooth/) Signed-off-by: Dominik Brodowski --- sound/pcmcia/pdaudiocf/pdaudiocf.c | 6 +++--- sound/pcmcia/vx/vxpocket.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'sound') diff --git a/sound/pcmcia/pdaudiocf/pdaudiocf.c b/sound/pcmcia/pdaudiocf/pdaudiocf.c index 9f897bca0615..7ab9174a8a84 100644 --- a/sound/pcmcia/pdaudiocf/pdaudiocf.c +++ b/sound/pcmcia/pdaudiocf/pdaudiocf.c @@ -139,8 +139,8 @@ static int snd_pdacf_probe(struct pcmcia_device *link) pdacf->p_dev = link; link->priv = pdacf; - link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; - link->io.NumPorts1 = 16; + link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; + link->resource[0]->end = 16; link->conf.Attributes = CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ; link->conf.IntType = INT_MEMORY_AND_IO; @@ -219,7 +219,7 @@ static int pdacf_config(struct pcmcia_device *link) snd_printdd(KERN_DEBUG "pdacf_config called\n"); link->conf.ConfigIndex = 0x5; - ret = pcmcia_request_io(link, &link->io); + ret = pcmcia_request_io(link); if (ret) goto failed; diff --git a/sound/pcmcia/vx/vxpocket.c b/sound/pcmcia/vx/vxpocket.c index f23c235013a4..a6edfc3be29a 100644 --- a/sound/pcmcia/vx/vxpocket.c +++ b/sound/pcmcia/vx/vxpocket.c @@ -159,8 +159,8 @@ static int snd_vxpocket_new(struct snd_card *card, int ibl, vxp->p_dev = link; link->priv = chip; - link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; - link->io.NumPorts1 = 16; + link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; + link->resource[0]->end = 16; link->conf.Attributes = CONF_ENABLE_IRQ; link->conf.IntType = INT_MEMORY_AND_IO; @@ -226,7 +226,7 @@ static int vxpocket_config(struct pcmcia_device *link) strcpy(chip->card->driver, vxp440_hw.name); } - ret = pcmcia_request_io(link, &link->io); + ret = pcmcia_request_io(link); if (ret) goto failed; -- cgit v1.2.3 From 32c168c892e2c6936c714d1653ba5e19e07d5c26 Mon Sep 17 00:00:00 2001 From: Anssi Hannula Date: Tue, 3 Aug 2010 13:28:57 +0300 Subject: ALSA: hda - Set Stream Type in Stream Format according to AES0 Set bit 15 (Stream Type) of HDA Stream Format to 1 (Non-PCM) when IEC958 channel status bit 1 (AES0 & 0x02) is set to 1 (non-audio). This is a prequisite for HDMI HBR passthrough. Signed-off-by: Anssi Hannula Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_codec.c | 6 +++++- sound/pci/hda/hda_codec.h | 3 ++- sound/pci/hda/hda_intel.c | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index d9d1c91dfd1b..bd8d7a63d7fe 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -3051,7 +3051,8 @@ static struct hda_rate_tbl rate_bits[] = { unsigned int snd_hda_calc_stream_format(unsigned int rate, unsigned int channels, unsigned int format, - unsigned int maxbps) + unsigned int maxbps, + unsigned short spdif_ctls) { int i; unsigned int val = 0; @@ -3095,6 +3096,9 @@ unsigned int snd_hda_calc_stream_format(unsigned int rate, return 0; } + if (spdif_ctls & AC_DIG1_NONAUDIO) + val |= 0x8000; + return val; } EXPORT_SYMBOL_HDA(snd_hda_calc_stream_format); diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 5991d14e1ec0..4797416aa3d9 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h @@ -928,7 +928,8 @@ void snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid); unsigned int snd_hda_calc_stream_format(unsigned int rate, unsigned int channels, unsigned int format, - unsigned int maxbps); + unsigned int maxbps, + unsigned short spdif_ctls); int snd_hda_is_supported_format(struct hda_codec *codec, hda_nid_t nid, unsigned int format); diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 1df25cf5ce38..f8a2f5aa4026 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -1653,7 +1653,8 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) format_val = snd_hda_calc_stream_format(runtime->rate, runtime->channels, runtime->format, - hinfo->maxbps); + hinfo->maxbps, + apcm->codec->spdif_ctls); if (!format_val) { snd_printk(KERN_ERR SFX "invalid format_val, rate=%d, ch=%d, format=%d\n", -- cgit v1.2.3 From ea87d1c493aba9cf3f645eae0d6d9c0fd44d3189 Mon Sep 17 00:00:00 2001 From: Anssi Hannula Date: Tue, 3 Aug 2010 13:28:58 +0300 Subject: ALSA: hda - Add support for HDMI HBR passthrough Passing IEC 61937 encapsulated compressed audio at bitrates over 6.144 Mbps (i.e. more than a single 2-channel 16-bit 192kHz IEC 60958 link) over HDMI requires the use of HBR Audio Stream Packets instead of Audio Sample Packets. Enable HBR mode when the stream has 8 channels and the Non-PCM bit is set. If the audio converter is not connected to any HBR-capable pins, return -EINVAL in prepare(). Signed-off-by: Anssi Hannula Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_codec.h | 3 +++ sound/pci/hda/patch_hdmi.c | 40 +++++++++++++++++++++++++++++++++++++++- sound/pci/hda/patch_intelhdmi.c | 3 +-- sound/pci/hda/patch_nvhdmi.c | 3 +-- 4 files changed, 44 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 4797416aa3d9..48b33671e727 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h @@ -364,6 +364,9 @@ enum { #define AC_DIG2_CC (0x7f<<0) /* Pin widget control - 8bit */ +#define AC_PINCTL_EPT (0x3<<0) +#define AC_PINCTL_EPT_NATIVE 0 +#define AC_PINCTL_EPT_HBR 3 #define AC_PINCTL_VREFEN (0x7<<0) #define AC_PINCTL_VREF_HIZ 0 /* Hi-Z */ #define AC_PINCTL_VREF_50 1 /* 50% */ diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 2fc53961054e..8534792591fc 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c @@ -698,11 +698,48 @@ static void hdmi_unsol_event(struct hda_codec *codec, unsigned int res) * Callbacks */ -static void hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid, +static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid, u32 stream_tag, int format) { + struct hdmi_spec *spec = codec->spec; int tag; int fmt; + int pinctl; + int new_pinctl = 0; + int i; + + for (i = 0; i < spec->num_pins; i++) { + if (spec->pin_cvt[i] != nid) + continue; + if (!(snd_hda_query_pin_caps(codec, spec->pin[i]) & AC_PINCAP_HBR)) + continue; + + pinctl = snd_hda_codec_read(codec, spec->pin[i], 0, + AC_VERB_GET_PIN_WIDGET_CONTROL, 0); + + new_pinctl = pinctl & ~AC_PINCTL_EPT; + /* Non-PCM, 8 channels */ + if ((format & 0x8000) && (format & 0x0f) == 7) + new_pinctl |= AC_PINCTL_EPT_HBR; + else + new_pinctl |= AC_PINCTL_EPT_NATIVE; + + snd_printdd("hdmi_setup_stream: " + "NID=0x%x, %spinctl=0x%x\n", + spec->pin[i], + pinctl == new_pinctl ? "" : "new-", + new_pinctl); + + if (pinctl != new_pinctl) + snd_hda_codec_write(codec, spec->pin[i], 0, + AC_VERB_SET_PIN_WIDGET_CONTROL, + new_pinctl); + } + + if ((format & 0x8000) && (format & 0x0f) == 7 && !new_pinctl) { + snd_printdd("hdmi_setup_stream: HBR is not supported\n"); + return -EINVAL; + } tag = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0) >> 4; fmt = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_STREAM_FORMAT, 0); @@ -722,6 +759,7 @@ static void hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid, if (fmt != format) snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, format); + return 0; } /* diff --git a/sound/pci/hda/patch_intelhdmi.c b/sound/pci/hda/patch_intelhdmi.c index b81d23e42ace..5972d5e7d01f 100644 --- a/sound/pci/hda/patch_intelhdmi.c +++ b/sound/pci/hda/patch_intelhdmi.c @@ -66,8 +66,7 @@ static int intel_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo, hdmi_setup_audio_infoframe(codec, hinfo->nid, substream); - hdmi_setup_stream(codec, hinfo->nid, stream_tag, format); - return 0; + return hdmi_setup_stream(codec, hinfo->nid, stream_tag, format); } static int intel_hdmi_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, diff --git a/sound/pci/hda/patch_nvhdmi.c b/sound/pci/hda/patch_nvhdmi.c index b0652acee9b2..a281836fd472 100644 --- a/sound/pci/hda/patch_nvhdmi.c +++ b/sound/pci/hda/patch_nvhdmi.c @@ -202,8 +202,7 @@ static int nvhdmi_dig_playback_pcm_prepare_8ch_89(struct hda_pcm_stream *hinfo, hdmi_setup_audio_infoframe(codec, hinfo->nid, substream); - hdmi_setup_stream(codec, hinfo->nid, stream_tag, format); - return 0; + return hdmi_setup_stream(codec, hinfo->nid, stream_tag, format); } static int nvhdmi_dig_playback_pcm_prepare_8ch(struct hda_pcm_stream *hinfo, -- cgit v1.2.3 From 1b0e372d7b52c9fc96348779015a6db7df7f286e Mon Sep 17 00:00:00 2001 From: Daniel J Blueman Date: Tue, 3 Aug 2010 11:09:13 +0100 Subject: ALSA: hda - Fix beep frequency on IDT 92HD73xx and 92HD71Bxx codecs Fix HDA beep frequency on IDT 92HD73xx and 92HD71Bxx codecs. These codecs use the standard beep frequency calculation although the datasheet says it's linear frequency. Other IDT/STAC codecs might have the same problem. They should be fixed individually later. Signed-off-by: Daniel J Blueman Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_sigmatel.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index f1e7babd6920..b8d730c47df1 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -202,6 +202,7 @@ struct sigmatel_spec { unsigned int spdif_mute: 1; unsigned int check_volume_offset:1; unsigned int auto_mic:1; + unsigned int linear_tone_beep:1; /* gpio lines */ unsigned int eapd_mask; @@ -3802,7 +3803,7 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out return err; if (codec->beep) { /* IDT/STAC codecs have linear beep tone parameter */ - codec->beep->linear_tone = 1; + codec->beep->linear_tone = spec->linear_tone_beep; /* if no beep switch is available, make its own one */ caps = query_amp_caps(codec, nid, HDA_OUTPUT); if (!(caps & AC_AMPCAP_MUTE)) { @@ -5005,6 +5006,7 @@ static int patch_stac9200(struct hda_codec *codec) codec->no_trigger_sense = 1; codec->spec = spec; + spec->linear_tone_beep = 1; spec->num_pins = ARRAY_SIZE(stac9200_pin_nids); spec->pin_nids = stac9200_pin_nids; spec->board_config = snd_hda_check_board_config(codec, STAC_9200_MODELS, @@ -5068,6 +5070,7 @@ static int patch_stac925x(struct hda_codec *codec) codec->no_trigger_sense = 1; codec->spec = spec; + spec->linear_tone_beep = 1; spec->num_pins = ARRAY_SIZE(stac925x_pin_nids); spec->pin_nids = stac925x_pin_nids; @@ -5153,6 +5156,7 @@ static int patch_stac92hd73xx(struct hda_codec *codec) codec->no_trigger_sense = 1; codec->spec = spec; + spec->linear_tone_beep = 0; codec->slave_dig_outs = stac92hd73xx_slave_dig_outs; spec->num_pins = ARRAY_SIZE(stac92hd73xx_pin_nids); spec->pin_nids = stac92hd73xx_pin_nids; @@ -5300,6 +5304,7 @@ static int patch_stac92hd83xxx(struct hda_codec *codec) codec->no_trigger_sense = 1; codec->spec = spec; + spec->linear_tone_beep = 1; codec->slave_dig_outs = stac92hd83xxx_slave_dig_outs; spec->digbeep_nid = 0x21; spec->mux_nids = stac92hd83xxx_mux_nids; @@ -5522,6 +5527,7 @@ static int patch_stac92hd71bxx(struct hda_codec *codec) codec->no_trigger_sense = 1; codec->spec = spec; + spec->linear_tone_beep = 0; codec->patch_ops = stac92xx_patch_ops; spec->num_pins = STAC92HD71BXX_NUM_PINS; switch (codec->vendor_id) { @@ -5779,6 +5785,7 @@ static int patch_stac922x(struct hda_codec *codec) codec->no_trigger_sense = 1; codec->spec = spec; + spec->linear_tone_beep = 1; spec->num_pins = ARRAY_SIZE(stac922x_pin_nids); spec->pin_nids = stac922x_pin_nids; spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS, @@ -5883,6 +5890,7 @@ static int patch_stac927x(struct hda_codec *codec) codec->no_trigger_sense = 1; codec->spec = spec; + spec->linear_tone_beep = 1; codec->slave_dig_outs = stac927x_slave_dig_outs; spec->num_pins = ARRAY_SIZE(stac927x_pin_nids); spec->pin_nids = stac927x_pin_nids; @@ -6018,6 +6026,7 @@ static int patch_stac9205(struct hda_codec *codec) codec->no_trigger_sense = 1; codec->spec = spec; + spec->linear_tone_beep = 1; spec->num_pins = ARRAY_SIZE(stac9205_pin_nids); spec->pin_nids = stac9205_pin_nids; spec->board_config = snd_hda_check_board_config(codec, STAC_9205_MODELS, @@ -6174,6 +6183,7 @@ static int patch_stac9872(struct hda_codec *codec) return -ENOMEM; codec->no_trigger_sense = 1; codec->spec = spec; + spec->linear_tone_beep = 1; spec->num_pins = ARRAY_SIZE(stac9872_pin_nids); spec->pin_nids = stac9872_pin_nids; -- cgit v1.2.3 From 92f10b3f5d53f9e35da5285eb8ea4bc88082b71e Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Tue, 3 Aug 2010 14:21:00 +0200 Subject: ALSA: hda - Define AC_FMT_* constants Define constants for the HD-audio stream format bits, and replace the magic numbers in codes. Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_codec.c | 41 +++++++++++++++++++++++------------------ sound/pci/hda/hda_codec.h | 21 +++++++++++++++++++++ sound/pci/hda/patch_hdmi.c | 9 ++++++--- 3 files changed, 50 insertions(+), 21 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index bd8d7a63d7fe..05e8995f9aec 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -3013,26 +3013,31 @@ struct hda_rate_tbl { unsigned int hda_fmt; }; +/* rate = base * mult / div */ +#define HDA_RATE(base, mult, div) \ + (AC_FMT_BASE_##base##K | (((mult) - 1) << AC_FMT_MULT_SHIFT) | \ + (((div) - 1) << AC_FMT_DIV_SHIFT)) + static struct hda_rate_tbl rate_bits[] = { /* rate in Hz, ALSA rate bitmask, HDA format value */ /* autodetected value used in snd_hda_query_supported_pcm */ - { 8000, SNDRV_PCM_RATE_8000, 0x0500 }, /* 1/6 x 48 */ - { 11025, SNDRV_PCM_RATE_11025, 0x4300 }, /* 1/4 x 44 */ - { 16000, SNDRV_PCM_RATE_16000, 0x0200 }, /* 1/3 x 48 */ - { 22050, SNDRV_PCM_RATE_22050, 0x4100 }, /* 1/2 x 44 */ - { 32000, SNDRV_PCM_RATE_32000, 0x0a00 }, /* 2/3 x 48 */ - { 44100, SNDRV_PCM_RATE_44100, 0x4000 }, /* 44 */ - { 48000, SNDRV_PCM_RATE_48000, 0x0000 }, /* 48 */ - { 88200, SNDRV_PCM_RATE_88200, 0x4800 }, /* 2 x 44 */ - { 96000, SNDRV_PCM_RATE_96000, 0x0800 }, /* 2 x 48 */ - { 176400, SNDRV_PCM_RATE_176400, 0x5800 },/* 4 x 44 */ - { 192000, SNDRV_PCM_RATE_192000, 0x1800 }, /* 4 x 48 */ + { 8000, SNDRV_PCM_RATE_8000, HDA_RATE(48, 1, 6) }, + { 11025, SNDRV_PCM_RATE_11025, HDA_RATE(44, 1, 4) }, + { 16000, SNDRV_PCM_RATE_16000, HDA_RATE(48, 1, 3) }, + { 22050, SNDRV_PCM_RATE_22050, HDA_RATE(44, 1, 2) }, + { 32000, SNDRV_PCM_RATE_32000, HDA_RATE(48, 2, 3) }, + { 44100, SNDRV_PCM_RATE_44100, HDA_RATE(44, 1, 1) }, + { 48000, SNDRV_PCM_RATE_48000, HDA_RATE(48, 1, 1) }, + { 88200, SNDRV_PCM_RATE_88200, HDA_RATE(44, 2, 1) }, + { 96000, SNDRV_PCM_RATE_96000, HDA_RATE(48, 2, 1) }, + { 176400, SNDRV_PCM_RATE_176400, HDA_RATE(44, 4, 1) }, + { 192000, SNDRV_PCM_RATE_192000, HDA_RATE(48, 4, 1) }, #define AC_PAR_PCM_RATE_BITS 11 /* up to bits 10, 384kHZ isn't supported properly */ /* not autodetected value */ - { 9600, SNDRV_PCM_RATE_KNOT, 0x0400 }, /* 1/5 x 48 */ + { 9600, SNDRV_PCM_RATE_KNOT, HDA_RATE(48, 1, 5) }, { 0 } /* terminator */ }; @@ -3075,20 +3080,20 @@ unsigned int snd_hda_calc_stream_format(unsigned int rate, switch (snd_pcm_format_width(format)) { case 8: - val |= 0x00; + val |= AC_FMT_BITS_8; break; case 16: - val |= 0x10; + val |= AC_FMT_BITS_16; break; case 20: case 24: case 32: if (maxbps >= 32 || format == SNDRV_PCM_FORMAT_FLOAT_LE) - val |= 0x40; + val |= AC_FMT_BITS_32; else if (maxbps >= 24) - val |= 0x30; + val |= AC_FMT_BITS_24; else - val |= 0x20; + val |= AC_FMT_BITS_20; break; default: snd_printdd("invalid format width %d\n", @@ -3097,7 +3102,7 @@ unsigned int snd_hda_calc_stream_format(unsigned int rate, } if (spdif_ctls & AC_DIG1_NONAUDIO) - val |= 0x8000; + val |= AC_FMT_TYPE_NON_PCM; return val; } diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 48b33671e727..46f75bccf0d3 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h @@ -224,6 +224,27 @@ enum { /* Input converter SDI select */ #define AC_SDI_SELECT (0xf<<0) +/* stream format id */ +#define AC_FMT_CHAN_SHIFT 0 +#define AC_FMT_CHAN_MASK (0x0f << 0) +#define AC_FMT_BITS_SHIFT 4 +#define AC_FMT_BITS_MASK (7 << 4) +#define AC_FMT_BITS_8 (0 << 4) +#define AC_FMT_BITS_16 (1 << 4) +#define AC_FMT_BITS_20 (2 << 4) +#define AC_FMT_BITS_24 (3 << 4) +#define AC_FMT_BITS_32 (4 << 4) +#define AC_FMT_DIV_SHIFT 8 +#define AC_FMT_DIV_MASK (7 << 8) +#define AC_FMT_MULT_SHIFT 11 +#define AC_FMT_MULT_MASK (7 << 11) +#define AC_FMT_BASE_SHIFT 14 +#define AC_FMT_BASE_48K (0 << 14) +#define AC_FMT_BASE_44K (1 << 14) +#define AC_FMT_TYPE_SHIFT 15 +#define AC_FMT_TYPE_PCM (0 << 15) +#define AC_FMT_TYPE_NON_PCM (1 << 15) + /* Unsolicited response control */ #define AC_UNSOL_TAG (0x3f<<0) #define AC_UNSOL_ENABLED (1<<7) diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 8534792591fc..522e0748ee99 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c @@ -698,6 +698,10 @@ static void hdmi_unsol_event(struct hda_codec *codec, unsigned int res) * Callbacks */ +/* HBR should be Non-PCM, 8 channels */ +#define is_hbr_format(format) \ + ((format & AC_FMT_TYPE_NON_PCM) && (format & AC_FMT_CHAN_MASK) == 7) + static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid, u32 stream_tag, int format) { @@ -718,8 +722,7 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid, AC_VERB_GET_PIN_WIDGET_CONTROL, 0); new_pinctl = pinctl & ~AC_PINCTL_EPT; - /* Non-PCM, 8 channels */ - if ((format & 0x8000) && (format & 0x0f) == 7) + if (is_hbr_format(format)) new_pinctl |= AC_PINCTL_EPT_HBR; else new_pinctl |= AC_PINCTL_EPT_NATIVE; @@ -736,7 +739,7 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid, new_pinctl); } - if ((format & 0x8000) && (format & 0x0f) == 7 && !new_pinctl) { + if (is_hbr_format(format) && !new_pinctl) { snd_printdd("hdmi_setup_stream: HBR is not supported\n"); return -EINVAL; } -- cgit v1.2.3 From 08af495f22f43eff3b5a347dc10384ebcf356e41 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Tue, 3 Aug 2010 14:39:04 +0200 Subject: ALSA: hda - More relax for pending period handling Since the pending periods are often bogus and take long time until actually processed, it often results in a high CPU usage of the hd-audio workq. Overall it's better to have low CPU consumption by avoiding a too tight loop rather than the wake-up timing accuracy. Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_intel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index f8a2f5aa4026..66d420212d9a 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -1961,7 +1961,7 @@ static void azx_irq_pending_work(struct work_struct *work) spin_unlock_irq(&chip->reg_lock); if (!pending) return; - cond_resched(); + msleep(1); } } -- cgit v1.2.3 From e096c8e6d5ed965f346d94befbbec2275dde3621 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Tue, 3 Aug 2010 17:20:35 +0200 Subject: ALSA: hda - Add PC-beep whitelist for an Intel board An Intel board needs a white-list entry to enable PC-beep. Otherwise the driver misdetects (due to bogus BIOS info) and ignores the PC-beep on 2.6.35. Reported-and-tested-by: Leandro Lucarella Cc: Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index cf14b00155d0..6c588ef26685 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -5327,6 +5327,7 @@ static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids, static struct snd_pci_quirk beep_white_list[] = { SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), + SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1), {} }; -- cgit v1.2.3 From bda7d2a862e6b788bca2d02d38a07966a9c92e48 Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Tue, 3 Aug 2010 12:01:01 +0300 Subject: ASoC: TWL4030: Capture route runtime DAPM ordering fix Fix the ordering problem in DAPM domain, when the user changes between digital and analog sources during active capture (or loopback) scenario. Before this patch, when the user changed from analog source to digital there were a short time, when the codec enabled analog mic bias (2.2 volts) instead of the correct digital mic bias (1.8 volts) to the digital microphones. This behaviour caused by the former implementation of selecting the correct type of bias. This was done at the POST_REG event of the DAPM_MUX_E("TXx Capture Route") widget. By moving the bias type selection as DAPM_SUPPLY and connecting it to the corresponding digimic widget the problematic situation can be avoided. Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl4030.c | 48 ++++++++++++---------------------------------- 1 file changed, 12 insertions(+), 36 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index d401c597d38f..7b618bbff884 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -577,36 +577,6 @@ static const struct snd_kcontrol_new twl4030_dapm_dbypassv_control = TWL4030_REG_VSTPGA, 0, 0x29, 0, twl4030_dapm_dbypassv_tlv); -static int micpath_event(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) -{ - struct soc_enum *e = (struct soc_enum *)w->kcontrols->private_value; - unsigned char adcmicsel, micbias_ctl; - - adcmicsel = twl4030_read_reg_cache(w->codec, TWL4030_REG_ADCMICSEL); - micbias_ctl = twl4030_read_reg_cache(w->codec, TWL4030_REG_MICBIAS_CTL); - /* Prepare the bits for the given TX path: - * shift_l == 0: TX1 microphone path - * shift_l == 2: TX2 microphone path */ - if (e->shift_l) { - /* TX2 microphone path */ - if (adcmicsel & TWL4030_TX2IN_SEL) - micbias_ctl |= TWL4030_MICBIAS2_CTL; /* digimic */ - else - micbias_ctl &= ~TWL4030_MICBIAS2_CTL; - } else { - /* TX1 microphone path */ - if (adcmicsel & TWL4030_TX1IN_SEL) - micbias_ctl |= TWL4030_MICBIAS1_CTL; /* digimic */ - else - micbias_ctl &= ~TWL4030_MICBIAS1_CTL; - } - - twl4030_write(w->codec, TWL4030_REG_MICBIAS_CTL, micbias_ctl); - - return 0; -} - /* * Output PGA builder: * Handle the muting and unmuting of the given output (turning off the @@ -1430,12 +1400,10 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { /* Analog/Digital mic path selection. TX1 Left/Right: either analog Left/Right or Digimic0 TX2 Left/Right: either analog Left/Right or Digimic1 */ - SND_SOC_DAPM_MUX_E("TX1 Capture Route", SND_SOC_NOPM, 0, 0, - &twl4030_dapm_micpathtx1_control, micpath_event, - SND_SOC_DAPM_POST_REG), - SND_SOC_DAPM_MUX_E("TX2 Capture Route", SND_SOC_NOPM, 0, 0, - &twl4030_dapm_micpathtx2_control, micpath_event, - SND_SOC_DAPM_POST_REG), + SND_SOC_DAPM_MUX("TX1 Capture Route", SND_SOC_NOPM, 0, 0, + &twl4030_dapm_micpathtx1_control), + SND_SOC_DAPM_MUX("TX2 Capture Route", SND_SOC_NOPM, 0, 0, + &twl4030_dapm_micpathtx2_control), /* Analog input mixers for the capture amplifiers */ SND_SOC_DAPM_MIXER("Analog Left", @@ -1459,6 +1427,11 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { TWL4030_REG_ADCMICSEL, 3, 0, NULL, 0, digimic_event, SND_SOC_DAPM_POST_PMU), + SND_SOC_DAPM_SUPPLY("micbias1 select", TWL4030_REG_MICBIAS_CTL, 5, 0, + NULL, 0), + SND_SOC_DAPM_SUPPLY("micbias2 select", TWL4030_REG_MICBIAS_CTL, 6, 0, + NULL, 0), + SND_SOC_DAPM_MICBIAS("Mic Bias 1", TWL4030_REG_MICBIAS_CTL, 0, 0), SND_SOC_DAPM_MICBIAS("Mic Bias 2", TWL4030_REG_MICBIAS_CTL, 1, 0), SND_SOC_DAPM_MICBIAS("Headset Mic Bias", TWL4030_REG_MICBIAS_CTL, 2, 0), @@ -1590,6 +1563,9 @@ static const struct snd_soc_dapm_route intercon[] = { {"Digimic0 Enable", NULL, "DIGIMIC0"}, {"Digimic1 Enable", NULL, "DIGIMIC1"}, + {"DIGIMIC0", NULL, "micbias1 select"}, + {"DIGIMIC1", NULL, "micbias2 select"}, + /* TX1 Left capture path */ {"TX1 Capture Route", "Analog", "ADC Physical Left"}, {"TX1 Capture Route", "Digimic0", "Digimic0 Enable"}, -- cgit v1.2.3 From 748cce431eb413e794c8f1d1974b78b47a6174ef Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Wed, 4 Aug 2010 07:37:39 +0200 Subject: ALSA: hda - Fix initial capsrc selection in patch_alc269() In patch_alc269(), we initialize the primary capsrc so that the device works from the beginning. It issues CONNECT_SEL verb no matter which widget is although some widget (e.g. 0x23) has no connection selection but a mixer, which requires unmuting instead. This patch fixes the initialization of capsrc by re-using the code as a helper function. Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 6c588ef26685..c8070620a4d8 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -5166,6 +5166,19 @@ static void fixup_automic_adc(struct hda_codec *codec) spec->auto_mic = 0; /* disable auto-mic to be sure */ } +/* select or unmute the given capsrc route */ +static void select_or_unmute_capsrc(struct hda_codec *codec, hda_nid_t cap, + int idx) +{ + if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) { + snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx, + HDA_AMP_MUTE, 0); + } else { + snd_hda_codec_write_cache(codec, cap, 0, + AC_VERB_SET_CONNECT_SEL, idx); + } +} + /* set the default connection to that pin */ static int init_capsrc_for_pin(struct hda_codec *codec, hda_nid_t pin) { @@ -5180,14 +5193,7 @@ static int init_capsrc_for_pin(struct hda_codec *codec, hda_nid_t pin) idx = get_connection_index(codec, cap, pin); if (idx < 0) continue; - /* select or unmute this route */ - if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) { - snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx, - HDA_AMP_MUTE, 0); - } else { - snd_hda_codec_write_cache(codec, cap, 0, - AC_VERB_SET_CONNECT_SEL, idx); - } + select_or_unmute_capsrc(codec, cap, idx); return i; /* return the found index */ } return -1; /* not found */ @@ -14364,9 +14370,8 @@ static int alc269_parse_auto_config(struct hda_codec *codec) /* set default input source */ if (!spec->dual_adc_switch) - snd_hda_codec_write_cache(codec, spec->capsrc_nids[0], - 0, AC_VERB_SET_CONNECT_SEL, - spec->input_mux->items[0].index); + select_or_unmute_capsrc(codec, spec->capsrc_nids[0], + spec->input_mux->items[0].index); err = alc_auto_add_mic_boost(codec); if (err < 0) -- cgit v1.2.3 From b9619230e1f55a763bc41848c1cd971a394c878c Mon Sep 17 00:00:00 2001 From: Ondrej Zary Date: Tue, 3 Aug 2010 23:57:05 +0200 Subject: ALSA: als4000: enable burst mode Enable burst mode to prevent dropouts during high PCI bus usage. The card is useless in X without this because of dropouts when anything moves on the screen (at least with PCI VGA card). Enabling this is also recommended by the datasheet (page 48). Signed-off-by: Ondrej Zary Signed-off-by: Takashi Iwai --- sound/pci/als4000.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/pci/als4000.c b/sound/pci/als4000.c index 6cf1de8042e8..036a9ba8e1a5 100644 --- a/sound/pci/als4000.c +++ b/sound/pci/als4000.c @@ -763,9 +763,9 @@ static void snd_als4000_configure(struct snd_sb *chip) /* SPECS_PAGE: 39 */ for (i = ALS4K_GCR91_DMA0_ADDR; i <= ALS4K_GCR96_DMA3_MODE_COUNT; ++i) snd_als4k_gcr_write(chip, i, 0); - + /* enable burst mode to prevent dropouts during high PCI bus usage */ snd_als4k_gcr_write(chip, ALS4K_GCR99_DMA_EMULATION_CTRL, - snd_als4k_gcr_read(chip, ALS4K_GCR99_DMA_EMULATION_CTRL)); + snd_als4k_gcr_read(chip, ALS4K_GCR99_DMA_EMULATION_CTRL) | 0x04); spin_unlock_irq(&chip->reg_lock); } -- cgit v1.2.3 From 7b42176a2969bc913cd2949e7edd935466745b11 Mon Sep 17 00:00:00 2001 From: Markus Pietrek Date: Wed, 4 Aug 2010 15:59:50 +0900 Subject: sound/soc/sh/siu: Fixed undefined dma_length of scatter gather list Without this patch, an undefined/random sg->dma_length is used and the sound will be played/captured wrongly. Signed-off-by: Markus Pietrek Signed-off-by: Paul Mundt --- sound/soc/sh/siu_pcm.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'sound') diff --git a/sound/soc/sh/siu_pcm.c b/sound/soc/sh/siu_pcm.c index 36170be15aa7..b0ccd0b862fc 100644 --- a/sound/soc/sh/siu_pcm.c +++ b/sound/soc/sh/siu_pcm.c @@ -127,6 +127,7 @@ static int siu_pcm_wr_set(struct siu_port *port_info, sg_init_table(&sg, 1); sg_set_page(&sg, pfn_to_page(PFN_DOWN(buff)), size, offset_in_page(buff)); + sg_dma_len(&sg) = size; sg_dma_address(&sg) = buff; desc = siu_stream->chan->device->device_prep_slave_sg(siu_stream->chan, @@ -176,6 +177,7 @@ static int siu_pcm_rd_set(struct siu_port *port_info, sg_init_table(&sg, 1); sg_set_page(&sg, pfn_to_page(PFN_DOWN(buff)), size, offset_in_page(buff)); + sg_dma_len(&sg) = size; sg_dma_address(&sg) = buff; desc = siu_stream->chan->device->device_prep_slave_sg(siu_stream->chan, -- cgit v1.2.3 From c4685849b4d725ab80cd29f5e09f5f128b4724b5 Mon Sep 17 00:00:00 2001 From: Ondrej Zary Date: Wed, 4 Aug 2010 21:56:44 +0200 Subject: ALSA: als4000: Fix potentially invalid DMA mode setup My previous patch assumed that the DMA mode (represented by 3 lowest bits of ALS4K_GCR99_DMA_EMULATION_CTRL register) is set to the default value 0. If that's not the case, it might result in invalid mode to be set. This patch fixes this potential problem. Signed-off-by: Ondrej Zary Signed-off-by: Takashi Iwai --- sound/pci/als4000.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/als4000.c b/sound/pci/als4000.c index 036a9ba8e1a5..0e247cb90ecc 100644 --- a/sound/pci/als4000.c +++ b/sound/pci/als4000.c @@ -765,7 +765,7 @@ static void snd_als4000_configure(struct snd_sb *chip) snd_als4k_gcr_write(chip, i, 0); /* enable burst mode to prevent dropouts during high PCI bus usage */ snd_als4k_gcr_write(chip, ALS4K_GCR99_DMA_EMULATION_CTRL, - snd_als4k_gcr_read(chip, ALS4K_GCR99_DMA_EMULATION_CTRL) | 0x04); + (snd_als4k_gcr_read(chip, ALS4K_GCR99_DMA_EMULATION_CTRL) & ~0x07) | 0x04); spin_unlock_irq(&chip->reg_lock); } -- cgit v1.2.3 From fc091769a5aa65c045bfbda149c424ba33d0abbb Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Wed, 4 Aug 2010 23:53:36 +0200 Subject: ALSA: hda - Add pin-fix for HP dc5750 The NID 0x11 on HP dc5750 with ALC260 should be a speaker although BIOS gives it as a line-out. This patch adds a quirk to fix the pin config so that the real line-out is used properly. Reference: bnc#624118 https://bugzilla.novell.com/show_bug.cgi?id=624118 Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index c8070620a4d8..6ac53f7de549 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -6791,6 +6791,29 @@ static struct hda_amp_list alc260_loopbacks[] = { }; #endif +/* + * Pin config fixes + */ +enum { + PINFIX_HP_DC5750, +}; + +static struct alc_pincfg alc260_hp_dc5750_pinfix[] = { + { 0x11, 0x90130110 }, /* speaker */ + { } +}; + +static const struct alc_fixup alc260_fixups[] = { + [PINFIX_HP_DC5750] = { + .pins = alc260_hp_dc5750_pinfix + }, +}; + +static struct snd_pci_quirk alc260_fixup_tbl[] = { + SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", PINFIX_HP_DC5750), + {} +}; + /* * ALC260 configurations */ @@ -6990,6 +7013,9 @@ static int patch_alc260(struct hda_codec *codec) board_config = ALC260_AUTO; } + if (board_config == ALC260_AUTO) + alc_pick_fixup(codec, alc260_fixup_tbl, alc260_fixups, 1); + if (board_config == ALC260_AUTO) { /* automatic parse from the BIOS config */ err = alc260_parse_auto_config(codec); @@ -7035,6 +7061,9 @@ static int patch_alc260(struct hda_codec *codec) set_capture_mixer(codec); set_beep_amp(spec, 0x07, 0x05, HDA_INPUT); + if (board_config == ALC260_AUTO) + alc_pick_fixup(codec, alc260_fixup_tbl, alc260_fixups, 0); + spec->vmaster_nid = 0x08; codec->patch_ops = alc_patch_ops; -- cgit v1.2.3 From 9a76f1ff6e299fbb04149fe15aff061351fd0dab Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Thu, 5 Aug 2010 13:20:59 +0100 Subject: ASoC: Add initial WM8962 CODEC driver The WM8962 is a low power, high performance stereo CODEC designed for portable digital audio applications. This initial driver release supports the key audio paths of the WM8962. Extended functionality, such as microphone detection, digital microphones and the advanced DSP signal enhancements provided by the device are not yet supported. Signed-off-by: Mark Brown --- sound/soc/codecs/Kconfig | 4 + sound/soc/codecs/Makefile | 2 + sound/soc/codecs/wm8962-tables.c | 42299 +++++++++++++++++++++++++++++++++++++ sound/soc/codecs/wm8962.c | 1933 ++ sound/soc/codecs/wm8962.h | 3790 ++++ 5 files changed, 48028 insertions(+) create mode 100644 sound/soc/codecs/wm8962-tables.c create mode 100644 sound/soc/codecs/wm8962.c create mode 100644 sound/soc/codecs/wm8962.h (limited to 'sound') diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 83f5c67d3c41..bfdd92b78fb6 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -61,6 +61,7 @@ config SND_SOC_ALL_CODECS select SND_SOC_WM8955 if I2C select SND_SOC_WM8960 if I2C select SND_SOC_WM8961 if I2C + select SND_SOC_WM8962 if I2C select SND_SOC_WM8971 if I2C select SND_SOC_WM8974 if I2C select SND_SOC_WM8978 if I2C @@ -248,6 +249,9 @@ config SND_SOC_WM8960 config SND_SOC_WM8961 tristate +config SND_SOC_WM8962 + tristate + config SND_SOC_WM8971 tristate diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index 53524095759c..9c3c39fd99ad 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile @@ -46,6 +46,7 @@ snd-soc-wm8940-objs := wm8940.o snd-soc-wm8955-objs := wm8955.o snd-soc-wm8960-objs := wm8960.o snd-soc-wm8961-objs := wm8961.o +snd-soc-wm8962-objs := wm8962.o wm8962-tables.o snd-soc-wm8971-objs := wm8971.o snd-soc-wm8974-objs := wm8974.o snd-soc-wm8978-objs := wm8978.o @@ -115,6 +116,7 @@ obj-$(CONFIG_SND_SOC_WM8940) += snd-soc-wm8940.o obj-$(CONFIG_SND_SOC_WM8955) += snd-soc-wm8955.o obj-$(CONFIG_SND_SOC_WM8960) += snd-soc-wm8960.o obj-$(CONFIG_SND_SOC_WM8961) += snd-soc-wm8961.o +obj-$(CONFIG_SND_SOC_WM8962) += snd-soc-wm8962.o obj-$(CONFIG_SND_SOC_WM8971) += snd-soc-wm8971.o obj-$(CONFIG_SND_SOC_WM8974) += snd-soc-wm8974.o obj-$(CONFIG_SND_SOC_WM8978) += snd-soc-wm8978.o diff --git a/sound/soc/codecs/wm8962-tables.c b/sound/soc/codecs/wm8962-tables.c new file mode 100644 index 000000000000..f21a8c1b9d47 --- /dev/null +++ b/sound/soc/codecs/wm8962-tables.c @@ -0,0 +1,42299 @@ +/* + * wm8962-tables.c -- WM8962 ASoC driver + * + * Copyright 2010 Wolfson Microelectronics, plc + * + * Author: Mark Brown + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "wm8962.h" + +const u16 wm8962_reg[WM8962_MAX_REGISTER + 1] = { + 0x009F, /* R0 - Left Input volume */ + 0x049F, /* R1 - Right Input volume */ + 0x0000, /* R2 - HPOUTL volume */ + 0x0000, /* R3 - HPOUTR volume */ + 0x0020, /* R4 - Clocking1 */ + 0x0018, /* R5 - ADC & DAC Control 1 */ + 0x2008, /* R6 - ADC & DAC Control 2 */ + 0x000A, /* R7 - Audio Interface 0 */ + 0x01E4, /* R8 - Clocking2 */ + 0x0300, /* R9 - Audio Interface 1 */ + 0x00C0, /* R10 - Left DAC volume */ + 0x00C0, /* R11 - Right DAC volume */ + 0x0000, /* R12 */ + 0x0000, /* R13 */ + 0x0040, /* R14 - Audio Interface 2 */ + 0x6243, /* R15 - Software Reset */ + 0x0000, /* R16 */ + 0x007B, /* R17 - ALC1 */ + 0x0000, /* R18 - ALC2 */ + 0x1C32, /* R19 - ALC3 */ + 0x3200, /* R20 - Noise Gate */ + 0x00C0, /* R21 - Left ADC volume */ + 0x00C0, /* R22 - Right ADC volume */ + 0x0160, /* R23 - Additional control(1) */ + 0x0000, /* R24 - Additional control(2) */ + 0x0000, /* R25 - Pwr Mgmt (1) */ + 0x0000, /* R26 - Pwr Mgmt (2) */ + 0x0010, /* R27 - Additional Control (3) */ + 0x0000, /* R28 - Anti-pop */ + 0x0000, /* R29 */ + 0x005E, /* R30 - Clocking 3 */ + 0x0000, /* R31 - Input mixer control (1) */ + 0x0145, /* R32 - Left input mixer volume */ + 0x0145, /* R33 - Right input mixer volume */ + 0x0009, /* R34 - Input mixer control (2) */ + 0x0003, /* R35 - Input bias control */ + 0x0000, /* R36 */ + 0x0008, /* R37 - Left input PGA control */ + 0x0008, /* R38 - Right input PGA control */ + 0x0000, /* R39 */ + 0x0000, /* R40 - SPKOUTL volume */ + 0x0000, /* R41 - SPKOUTR volume */ + 0x0000, /* R42 */ + 0x0000, /* R43 */ + 0x0000, /* R44 */ + 0x0000, /* R45 */ + 0x0000, /* R46 */ + 0x0000, /* R47 - Thermal Shutdown Status */ + 0x8027, /* R48 - Additional Control (4) */ + 0x0010, /* R49 - Class D Control 1 */ + 0x0000, /* R50 */ + 0x0003, /* R51 - Class D Control 2 */ + 0x0000, /* R52 */ + 0x0000, /* R53 */ + 0x0000, /* R54 */ + 0x0000, /* R55 */ + 0x0506, /* R56 - Clocking 4 */ + 0x0000, /* R57 - DAC DSP Mixing (1) */ + 0x0000, /* R58 - DAC DSP Mixing (2) */ + 0x0000, /* R59 */ + 0x0300, /* R60 - DC Servo 0 */ + 0x0300, /* R61 - DC Servo 1 */ + 0x0000, /* R62 */ + 0x0000, /* R63 */ + 0x0810, /* R64 - DC Servo 4 */ + 0x0000, /* R65 */ + 0x0000, /* R66 - DC Servo 6 */ + 0x0000, /* R67 */ + 0x001B, /* R68 - Analogue PGA Bias */ + 0x0000, /* R69 - Analogue HP 0 */ + 0x0000, /* R70 */ + 0x01FB, /* R71 - Analogue HP 2 */ + 0x0000, /* R72 - Charge Pump 1 */ + 0x0000, /* R73 */ + 0x0000, /* R74 */ + 0x0000, /* R75 */ + 0x0000, /* R76 */ + 0x0000, /* R77 */ + 0x0000, /* R78 */ + 0x0000, /* R79 */ + 0x0000, /* R80 */ + 0x0000, /* R81 */ + 0x0004, /* R82 - Charge Pump B */ + 0x0000, /* R83 */ + 0x0000, /* R84 */ + 0x0000, /* R85 */ + 0x0000, /* R86 */ + 0x0000, /* R87 - Write Sequencer Control 1 */ + 0x0000, /* R88 */ + 0x0000, /* R89 */ + 0x0000, /* R90 - Write Sequencer Control 2 */ + 0x0000, /* R91 */ + 0x0000, /* R92 */ + 0x0000, /* R93 - Write Sequencer Control 3 */ + 0x0000, /* R94 - Control Interface */ + 0x0000, /* R95 */ + 0x0000, /* R96 */ + 0x0000, /* R97 */ + 0x0000, /* R98 */ + 0x0000, /* R99 - Mixer Enables */ + 0x0000, /* R100 - Headphone Mixer (1) */ + 0x0000, /* R101 - Headphone Mixer (2) */ + 0x013F, /* R102 - Headphone Mixer (3) */ + 0x013F, /* R103 - Headphone Mixer (4) */ + 0x0000, /* R104 */ + 0x0000, /* R105 - Speaker Mixer (1) */ + 0x0000, /* R106 - Speaker Mixer (2) */ + 0x013F, /* R107 - Speaker Mixer (3) */ + 0x013F, /* R108 - Speaker Mixer (4) */ + 0x0003, /* R109 - Speaker Mixer (5) */ + 0x0002, /* R110 - Beep Generator (1) */ + 0x0000, /* R111 */ + 0x0000, /* R112 */ + 0x0000, /* R113 */ + 0x0000, /* R114 */ + 0x0006, /* R115 - Oscillator Trim (3) */ + 0x0026, /* R116 - Oscillator Trim (4) */ + 0x0000, /* R117 */ + 0x0000, /* R118 */ + 0x0000, /* R119 - Oscillator Trim (7) */ + 0x0000, /* R120 */ + 0x0000, /* R121 */ + 0x0000, /* R122 */ + 0x0000, /* R123 */ + 0x0011, /* R124 - Analogue Clocking1 */ + 0x004B, /* R125 - Analogue Clocking2 */ + 0x000D, /* R126 - Analogue Clocking3 */ + 0x0000, /* R127 - PLL Software Reset */ + 0x0000, /* R128 */ + 0x0000, /* R129 - PLL2 */ + 0x0000, /* R130 */ + 0x0000, /* R131 - PLL 4 */ + 0x0000, /* R132 */ + 0x0000, /* R133 */ + 0x0000, /* R134 */ + 0x0000, /* R135 */ + 0x0067, /* R136 - PLL 9 */ + 0x001C, /* R137 - PLL 10 */ + 0x0071, /* R138 - PLL 11 */ + 0x00C7, /* R139 - PLL 12 */ + 0x0067, /* R140 - PLL 13 */ + 0x0048, /* R141 - PLL 14 */ + 0x0022, /* R142 - PLL 15 */ + 0x0097, /* R143 - PLL 16 */ + 0x0000, /* R144 */ + 0x0000, /* R145 */ + 0x0000, /* R146 */ + 0x0000, /* R147 */ + 0x0000, /* R148 */ + 0x0000, /* R149 */ + 0x0000, /* R150 */ + 0x0000, /* R151 */ + 0x0000, /* R152 */ + 0x0000, /* R153 */ + 0x0000, /* R154 */ + 0x000C, /* R155 - FLL Control (1) */ + 0x0039, /* R156 - FLL Control (2) */ + 0x0180, /* R157 - FLL Control (3) */ + 0x0000, /* R158 */ + 0x0032, /* R159 - FLL Control (5) */ + 0x0018, /* R160 - FLL Control (6) */ + 0x007D, /* R161 - FLL Control (7) */ + 0x0008, /* R162 - FLL Control (8) */ + 0x0000, /* R163 */ + 0x0000, /* R164 */ + 0x0000, /* R165 */ + 0x0000, /* R166 */ + 0x0000, /* R167 */ + 0x0000, /* R168 */ + 0x0000, /* R169 */ + 0x0000, /* R170 */ + 0x0000, /* R171 */ + 0x0000, /* R172 */ + 0x0000, /* R173 */ + 0x0000, /* R174 */ + 0x0000, /* R175 */ + 0x0000, /* R176 */ + 0x0000, /* R177 */ + 0x0000, /* R178 */ + 0x0000, /* R179 */ + 0x0000, /* R180 */ + 0x0000, /* R181 */ + 0x0000, /* R182 */ + 0x0000, /* R183 */ + 0x0000, /* R184 */ + 0x0000, /* R185 */ + 0x0000, /* R186 */ + 0x0000, /* R187 */ + 0x0000, /* R188 */ + 0x0000, /* R189 */ + 0x0000, /* R190 */ + 0x0000, /* R191 */ + 0x0000, /* R192 */ + 0x0000, /* R193 */ + 0x0000, /* R194 */ + 0x0000, /* R195 */ + 0x0000, /* R196 */ + 0x0000, /* R197 */ + 0x0000, /* R198 */ + 0x0000, /* R199 */ + 0x0000, /* R200 */ + 0x0000, /* R201 */ + 0x0000, /* R202 */ + 0x0000, /* R203 */ + 0x0000, /* R204 */ + 0x0000, /* R205 */ + 0x0000, /* R206 */ + 0x0000, /* R207 */ + 0x0000, /* R208 */ + 0x0000, /* R209 */ + 0x0000, /* R210 */ + 0x0000, /* R211 */ + 0x0000, /* R212 */ + 0x0000, /* R213 */ + 0x0000, /* R214 */ + 0x0000, /* R215 */ + 0x0000, /* R216 */ + 0x0000, /* R217 */ + 0x0000, /* R218 */ + 0x0000, /* R219 */ + 0x0000, /* R220 */ + 0x0000, /* R221 */ + 0x0000, /* R222 */ + 0x0000, /* R223 */ + 0x0000, /* R224 */ + 0x0000, /* R225 */ + 0x0000, /* R226 */ + 0x0000, /* R227 */ + 0x0000, /* R228 */ + 0x0000, /* R229 */ + 0x0000, /* R230 */ + 0x0000, /* R231 */ + 0x0000, /* R232 */ + 0x0000, /* R233 */ + 0x0000, /* R234 */ + 0x0000, /* R235 */ + 0x0000, /* R236 */ + 0x0000, /* R237 */ + 0x0000, /* R238 */ + 0x0000, /* R239 */ + 0x0000, /* R240 */ + 0x0000, /* R241 */ + 0x0000, /* R242 */ + 0x0000, /* R243 */ + 0x0000, /* R244 */ + 0x0000, /* R245 */ + 0x0000, /* R246 */ + 0x0000, /* R247 */ + 0x0000, /* R248 */ + 0x0000, /* R249 */ + 0x0000, /* R250 */ + 0x0000, /* R251 */ + 0x0005, /* R252 - General test 1 */ + 0x0000, /* R253 */ + 0x0000, /* R254 */ + 0x0000, /* R255 */ + 0x0000, /* R256 - DF1 */ + 0x0000, /* R257 - DF2 */ + 0x0000, /* R258 - DF3 */ + 0x0000, /* R259 - DF4 */ + 0x0000, /* R260 - DF5 */ + 0x0000, /* R261 - DF6 */ + 0x0000, /* R262 - DF7 */ + 0x0000, /* R263 */ + 0x0000, /* R264 - LHPF1 */ + 0x0000, /* R265 - LHPF2 */ + 0x0000, /* R266 */ + 0x0000, /* R267 */ + 0x0000, /* R268 - THREED1 */ + 0x0000, /* R269 - THREED2 */ + 0x0000, /* R270 - THREED3 */ + 0x0000, /* R271 - THREED4 */ + 0x0000, /* R272 */ + 0x0000, /* R273 */ + 0x0000, /* R274 */ + 0x0000, /* R275 */ + 0x000C, /* R276 - DRC 1 */ + 0x0925, /* R277 - DRC 2 */ + 0x0000, /* R278 - DRC 3 */ + 0x0000, /* R279 - DRC 4 */ + 0x0000, /* R280 - DRC 5 */ + 0x0000, /* R281 */ + 0x0000, /* R282 */ + 0x0000, /* R283 */ + 0x0000, /* R284 */ + 0x0000, /* R285 - Tloopback */ + 0x0000, /* R286 */ + 0x0000, /* R287 */ + 0x0000, /* R288 */ + 0x0000, /* R289 */ + 0x0000, /* R290 */ + 0x0000, /* R291 */ + 0x0000, /* R292 */ + 0x0000, /* R293 */ + 0x0000, /* R294 */ + 0x0000, /* R295 */ + 0x0000, /* R296 */ + 0x0000, /* R297 */ + 0x0000, /* R298 */ + 0x0000, /* R299 */ + 0x0000, /* R300 */ + 0x0000, /* R301 */ + 0x0000, /* R302 */ + 0x0000, /* R303 */ + 0x0000, /* R304 */ + 0x0000, /* R305 */ + 0x0000, /* R306 */ + 0x0000, /* R307 */ + 0x0000, /* R308 */ + 0x0000, /* R309 */ + 0x0000, /* R310 */ + 0x0000, /* R311 */ + 0x0000, /* R312 */ + 0x0000, /* R313 */ + 0x0000, /* R314 */ + 0x0000, /* R315 */ + 0x0000, /* R316 */ + 0x0000, /* R317 */ + 0x0000, /* R318 */ + 0x0000, /* R319 */ + 0x0000, /* R320 */ + 0x0000, /* R321 */ + 0x0000, /* R322 */ + 0x0000, /* R323 */ + 0x0000, /* R324 */ + 0x0000, /* R325 */ + 0x0000, /* R326 */ + 0x0000, /* R327 */ + 0x0000, /* R328 */ + 0x0000, /* R329 */ + 0x0000, /* R330 */ + 0x0000, /* R331 */ + 0x0000, /* R332 */ + 0x0000, /* R333 */ + 0x0000, /* R334 */ + 0x0004, /* R335 - EQ1 */ + 0x6318, /* R336 - EQ2 */ + 0x6300, /* R337 - EQ3 */ + 0x0FCA, /* R338 - EQ4 */ + 0x0400, /* R339 - EQ5 */ + 0x00D8, /* R340 - EQ6 */ + 0x1EB5, /* R341 - EQ7 */ + 0xF145, /* R342 - EQ8 */ + 0x0B75, /* R343 - EQ9 */ + 0x01C5, /* R344 - EQ10 */ + 0x1C58, /* R345 - EQ11 */ + 0xF373, /* R346 - EQ12 */ + 0x0A54, /* R347 - EQ13 */ + 0x0558, /* R348 - EQ14 */ + 0x168E, /* R349 - EQ15 */ + 0xF829, /* R350 - EQ16 */ + 0x07AD, /* R351 - EQ17 */ + 0x1103, /* R352 - EQ18 */ + 0x0564, /* R353 - EQ19 */ + 0x0559, /* R354 - EQ20 */ + 0x4000, /* R355 - EQ21 */ + 0x6318, /* R356 - EQ22 */ + 0x6300, /* R357 - EQ23 */ + 0x0FCA, /* R358 - EQ24 */ + 0x0400, /* R359 - EQ25 */ + 0x00D8, /* R360 - EQ26 */ + 0x1EB5, /* R361 - EQ27 */ + 0xF145, /* R362 - EQ28 */ + 0x0B75, /* R363 - EQ29 */ + 0x01C5, /* R364 - EQ30 */ + 0x1C58, /* R365 - EQ31 */ + 0xF373, /* R366 - EQ32 */ + 0x0A54, /* R367 - EQ33 */ + 0x0558, /* R368 - EQ34 */ + 0x168E, /* R369 - EQ35 */ + 0xF829, /* R370 - EQ36 */ + 0x07AD, /* R371 - EQ37 */ + 0x1103, /* R372 - EQ38 */ + 0x0564, /* R373 - EQ39 */ + 0x0559, /* R374 - EQ40 */ + 0x4000, /* R375 - EQ41 */ + 0x0000, /* R376 */ + 0x0000, /* R377 */ + 0x0000, /* R378 */ + 0x0000, /* R379 */ + 0x0000, /* R380 */ + 0x0000, /* R381 */ + 0x0000, /* R382 */ + 0x0000, /* R383 */ + 0x0000, /* R384 */ + 0x0000, /* R385 */ + 0x0000, /* R386 */ + 0x0000, /* R387 */ + 0x0000, /* R388 */ + 0x0000, /* R389 */ + 0x0000, /* R390 */ + 0x0000, /* R391 */ + 0x0000, /* R392 */ + 0x0000, /* R393 */ + 0x0000, /* R394 */ + 0x0000, /* R395 */ + 0x0000, /* R396 */ + 0x0000, /* R397 */ + 0x0000, /* R398 */ + 0x0000, /* R399 */ + 0x0000, /* R400 */ + 0x0000, /* R401 */ + 0x0000, /* R402 */ + 0x0000, /* R403 */ + 0x0000, /* R404 */ + 0x0000, /* R405 */ + 0x0000, /* R406 */ + 0x0000, /* R407 */ + 0x0000, /* R408 */ + 0x0000, /* R409 */ + 0x0000, /* R410 */ + 0x0000, /* R411 */ + 0x0000, /* R412 */ + 0x0000, /* R413 */ + 0x0000, /* R414 */ + 0x0000, /* R415 */ + 0x0000, /* R416 */ + 0x0000, /* R417 */ + 0x0000, /* R418 */ + 0x0000, /* R419 */ + 0x0000, /* R420 */ + 0x0000, /* R421 */ + 0x0000, /* R422 */ + 0x0000, /* R423 */ + 0x0000, /* R424 */ + 0x0000, /* R425 */ + 0x0000, /* R426 */ + 0x0000, /* R427 */ + 0x0000, /* R428 */ + 0x0000, /* R429 */ + 0x0000, /* R430 */ + 0x0000, /* R431 */ + 0x0000, /* R432 */ + 0x0000, /* R433 */ + 0x0000, /* R434 */ + 0x0000, /* R435 */ + 0x0000, /* R436 */ + 0x0000, /* R437 */ + 0x0000, /* R438 */ + 0x0000, /* R439 */ + 0x0000, /* R440 */ + 0x0000, /* R441 */ + 0x0000, /* R442 */ + 0x0000, /* R443 */ + 0x0000, /* R444 */ + 0x0000, /* R445 */ + 0x0000, /* R446 */ + 0x0000, /* R447 */ + 0x0000, /* R448 */ + 0x0000, /* R449 */ + 0x0000, /* R450 */ + 0x0000, /* R451 */ + 0x0000, /* R452 */ + 0x0000, /* R453 */ + 0x0000, /* R454 */ + 0x0000, /* R455 */ + 0x0000, /* R456 */ + 0x0000, /* R457 */ + 0x0000, /* R458 */ + 0x0000, /* R459 */ + 0x0000, /* R460 */ + 0x0000, /* R461 */ + 0x0000, /* R462 */ + 0x0000, /* R463 */ + 0x0000, /* R464 */ + 0x0000, /* R465 */ + 0x0000, /* R466 */ + 0x0000, /* R467 */ + 0x0000, /* R468 */ + 0x0000, /* R469 */ + 0x0000, /* R470 */ + 0x0000, /* R471 */ + 0x0000, /* R472 */ + 0x0000, /* R473 */ + 0x0000, /* R474 */ + 0x0000, /* R475 */ + 0x0000, /* R476 */ + 0x0000, /* R477 */ + 0x0000, /* R478 */ + 0x0000, /* R479 */ + 0x0000, /* R480 */ + 0x0000, /* R481 */ + 0x0000, /* R482 */ + 0x0000, /* R483 */ + 0x0000, /* R484 */ + 0x0000, /* R485 */ + 0x0000, /* R486 */ + 0x0000, /* R487 */ + 0x0000, /* R488 */ + 0x0000, /* R489 */ + 0x0000, /* R490 */ + 0x0000, /* R491 */ + 0x0000, /* R492 */ + 0x0000, /* R493 */ + 0x0000, /* R494 */ + 0x0000, /* R495 */ + 0x0000, /* R496 */ + 0x0000, /* R497 */ + 0x0000, /* R498 */ + 0x0000, /* R499 */ + 0x0000, /* R500 */ + 0x0000, /* R501 */ + 0x0000, /* R502 */ + 0x0000, /* R503 */ + 0x0000, /* R504 */ + 0x0000, /* R505 */ + 0x0000, /* R506 */ + 0x0000, /* R507 */ + 0x0000, /* R508 */ + 0x0000, /* R509 */ + 0x0000, /* R510 */ + 0x0000, /* R511 */ + 0x0000, /* R512 */ + 0x0000, /* R513 - GPIO 2 */ + 0x0000, /* R514 - GPIO 3 */ + 0x0000, /* R515 */ + 0x8100, /* R516 - GPIO 5 */ + 0x8100, /* R517 - GPIO 6 */ + 0x0000, /* R518 */ + 0x0000, /* R519 */ + 0x0000, /* R520 */ + 0x0000, /* R521 */ + 0x0000, /* R522 */ + 0x0000, /* R523 */ + 0x0000, /* R524 */ + 0x0000, /* R525 */ + 0x0000, /* R526 */ + 0x0000, /* R527 */ + 0x0000, /* R528 */ + 0x0000, /* R529 */ + 0x0000, /* R530 */ + 0x0000, /* R531 */ + 0x0000, /* R532 */ + 0x0000, /* R533 */ + 0x0000, /* R534 */ + 0x0000, /* R535 */ + 0x0000, /* R536 */ + 0x0000, /* R537 */ + 0x0000, /* R538 */ + 0x0000, /* R539 */ + 0x0000, /* R540 */ + 0x0000, /* R541 */ + 0x0000, /* R542 */ + 0x0000, /* R543 */ + 0x0000, /* R544 */ + 0x0000, /* R545 */ + 0x0000, /* R546 */ + 0x0000, /* R547 */ + 0x0000, /* R548 */ + 0x0000, /* R549 */ + 0x0000, /* R550 */ + 0x0000, /* R551 */ + 0x0000, /* R552 */ + 0x0000, /* R553 */ + 0x0000, /* R554 */ + 0x0000, /* R555 */ + 0x0000, /* R556 */ + 0x0000, /* R557 */ + 0x0000, /* R558 */ + 0x0000, /* R559 */ + 0x0000, /* R560 - Interrupt Status 1 */ + 0x0000, /* R561 - Interrupt Status 2 */ + 0x0000, /* R562 */ + 0x0000, /* R563 */ + 0x0000, /* R564 */ + 0x0000, /* R565 */ + 0x0000, /* R566 */ + 0x0000, /* R567 */ + 0x0030, /* R568 - Interrupt Status 1 Mask */ + 0xFFED, /* R569 - Interrupt Status 2 Mask */ + 0x0000, /* R570 */ + 0x0000, /* R571 */ + 0x0000, /* R572 */ + 0x0000, /* R573 */ + 0x0000, /* R574 */ + 0x0000, /* R575 */ + 0x0000, /* R576 - Interrupt Control */ + 0x0000, /* R577 */ + 0x0000, /* R578 */ + 0x0000, /* R579 */ + 0x0000, /* R580 */ + 0x0000, /* R581 */ + 0x0000, /* R582 */ + 0x0000, /* R583 */ + 0x002D, /* R584 - IRQ Debounce */ + 0x0000, /* R585 */ + 0x0000, /* R586 - MICINT Source Pol */ + 0x0000, /* R587 */ + 0x0000, /* R588 */ + 0x0000, /* R589 */ + 0x0000, /* R590 */ + 0x0000, /* R591 */ + 0x0000, /* R592 */ + 0x0000, /* R593 */ + 0x0000, /* R594 */ + 0x0000, /* R595 */ + 0x0000, /* R596 */ + 0x0000, /* R597 */ + 0x0000, /* R598 */ + 0x0000, /* R599 */ + 0x0000, /* R600 */ + 0x0000, /* R601 */ + 0x0000, /* R602 */ + 0x0000, /* R603 */ + 0x0000, /* R604 */ + 0x0000, /* R605 */ + 0x0000, /* R606 */ + 0x0000, /* R607 */ + 0x0000, /* R608 */ + 0x0000, /* R609 */ + 0x0000, /* R610 */ + 0x0000, /* R611 */ + 0x0000, /* R612 */ + 0x0000, /* R613 */ + 0x0000, /* R614 */ + 0x0000, /* R615 */ + 0x0000, /* R616 */ + 0x0000, /* R617 */ + 0x0000, /* R618 */ + 0x0000, /* R619 */ + 0x0000, /* R620 */ + 0x0000, /* R621 */ + 0x0000, /* R622 */ + 0x0000, /* R623 */ + 0x0000, /* R624 */ + 0x0000, /* R625 */ + 0x0000, /* R626 */ + 0x0000, /* R627 */ + 0x0000, /* R628 */ + 0x0000, /* R629 */ + 0x0000, /* R630 */ + 0x0000, /* R631 */ + 0x0000, /* R632 */ + 0x0000, /* R633 */ + 0x0000, /* R634 */ + 0x0000, /* R635 */ + 0x0000, /* R636 */ + 0x0000, /* R637 */ + 0x0000, /* R638 */ + 0x0000, /* R639 */ + 0x0000, /* R640 */ + 0x0000, /* R641 */ + 0x0000, /* R642 */ + 0x0000, /* R643 */ + 0x0000, /* R644 */ + 0x0000, /* R645 */ + 0x0000, /* R646 */ + 0x0000, /* R647 */ + 0x0000, /* R648 */ + 0x0000, /* R649 */ + 0x0000, /* R650 */ + 0x0000, /* R651 */ + 0x0000, /* R652 */ + 0x0000, /* R653 */ + 0x0000, /* R654 */ + 0x0000, /* R655 */ + 0x0000, /* R656 */ + 0x0000, /* R657 */ + 0x0000, /* R658 */ + 0x0000, /* R659 */ + 0x0000, /* R660 */ + 0x0000, /* R661 */ + 0x0000, /* R662 */ + 0x0000, /* R663 */ + 0x0000, /* R664 */ + 0x0000, /* R665 */ + 0x0000, /* R666 */ + 0x0000, /* R667 */ + 0x0000, /* R668 */ + 0x0000, /* R669 */ + 0x0000, /* R670 */ + 0x0000, /* R671 */ + 0x0000, /* R672 */ + 0x0000, /* R673 */ + 0x0000, /* R674 */ + 0x0000, /* R675 */ + 0x0000, /* R676 */ + 0x0000, /* R677 */ + 0x0000, /* R678 */ + 0x0000, /* R679 */ + 0x0000, /* R680 */ + 0x0000, /* R681 */ + 0x0000, /* R682 */ + 0x0000, /* R683 */ + 0x0000, /* R684 */ + 0x0000, /* R685 */ + 0x0000, /* R686 */ + 0x0000, /* R687 */ + 0x0000, /* R688 */ + 0x0000, /* R689 */ + 0x0000, /* R690 */ + 0x0000, /* R691 */ + 0x0000, /* R692 */ + 0x0000, /* R693 */ + 0x0000, /* R694 */ + 0x0000, /* R695 */ + 0x0000, /* R696 */ + 0x0000, /* R697 */ + 0x0000, /* R698 */ + 0x0000, /* R699 */ + 0x0000, /* R700 */ + 0x0000, /* R701 */ + 0x0000, /* R702 */ + 0x0000, /* R703 */ + 0x0000, /* R704 */ + 0x0000, /* R705 */ + 0x0000, /* R706 */ + 0x0000, /* R707 */ + 0x0000, /* R708 */ + 0x0000, /* R709 */ + 0x0000, /* R710 */ + 0x0000, /* R711 */ + 0x0000, /* R712 */ + 0x0000, /* R713 */ + 0x0000, /* R714 */ + 0x0000, /* R715 */ + 0x0000, /* R716 */ + 0x0000, /* R717 */ + 0x0000, /* R718 */ + 0x0000, /* R719 */ + 0x0000, /* R720 */ + 0x0000, /* R721 */ + 0x0000, /* R722 */ + 0x0000, /* R723 */ + 0x0000, /* R724 */ + 0x0000, /* R725 */ + 0x0000, /* R726 */ + 0x0000, /* R727 */ + 0x0000, /* R728 */ + 0x0000, /* R729 */ + 0x0000, /* R730 */ + 0x0000, /* R731 */ + 0x0000, /* R732 */ + 0x0000, /* R733 */ + 0x0000, /* R734 */ + 0x0000, /* R735 */ + 0x0000, /* R736 */ + 0x0000, /* R737 */ + 0x0000, /* R738 */ + 0x0000, /* R739 */ + 0x0000, /* R740 */ + 0x0000, /* R741 */ + 0x0000, /* R742 */ + 0x0000, /* R743 */ + 0x0000, /* R744 */ + 0x0000, /* R745 */ + 0x0000, /* R746 */ + 0x0000, /* R747 */ + 0x0000, /* R748 */ + 0x0000, /* R749 */ + 0x0000, /* R750 */ + 0x0000, /* R751 */ + 0x0000, /* R752 */ + 0x0000, /* R753 */ + 0x0000, /* R754 */ + 0x0000, /* R755 */ + 0x0000, /* R756 */ + 0x0000, /* R757 */ + 0x0000, /* R758 */ + 0x0000, /* R759 */ + 0x0000, /* R760 */ + 0x0000, /* R761 */ + 0x0000, /* R762 */ + 0x0000, /* R763 */ + 0x0000, /* R764 */ + 0x0000, /* R765 */ + 0x0000, /* R766 */ + 0x0000, /* R767 */ + 0x1C00, /* R768 - DSP2 Power Management */ + 0x0000, /* R769 */ + 0x0000, /* R770 */ + 0x0000, /* R771 */ + 0x0000, /* R772 */ + 0x0000, /* R773 */ + 0x0000, /* R774 */ + 0x0000, /* R775 */ + 0x0000, /* R776 */ + 0x0000, /* R777 */ + 0x0000, /* R778 */ + 0x0000, /* R779 */ + 0x0000, /* R780 */ + 0x0000, /* R781 */ + 0x0000, /* R782 */ + 0x0000, /* R783 */ + 0x0000, /* R784 */ + 0x0000, /* R785 */ + 0x0000, /* R786 */ + 0x0000, /* R787 */ + 0x0000, /* R788 */ + 0x0000, /* R789 */ + 0x0000, /* R790 */ + 0x0000, /* R791 */ + 0x0000, /* R792 */ + 0x0000, /* R793 */ + 0x0000, /* R794 */ + 0x0000, /* R795 */ + 0x0000, /* R796 */ + 0x0000, /* R797 */ + 0x0000, /* R798 */ + 0x0000, /* R799 */ + 0x0000, /* R800 */ + 0x0000, /* R801 */ + 0x0000, /* R802 */ + 0x0000, /* R803 */ + 0x0000, /* R804 */ + 0x0000, /* R805 */ + 0x0000, /* R806 */ + 0x0000, /* R807 */ + 0x0000, /* R808 */ + 0x0000, /* R809 */ + 0x0000, /* R810 */ + 0x0000, /* R811 */ + 0x0000, /* R812 */ + 0x0000, /* R813 */ + 0x0000, /* R814 */ + 0x0000, /* R815 */ + 0x0000, /* R816 */ + 0x0000, /* R817 */ + 0x0000, /* R818 */ + 0x0000, /* R819 */ + 0x0000, /* R820 */ + 0x0000, /* R821 */ + 0x0000, /* R822 */ + 0x0000, /* R823 */ + 0x0000, /* R824 */ + 0x0000, /* R825 */ + 0x0000, /* R826 */ + 0x0000, /* R827 */ + 0x0000, /* R828 */ + 0x0000, /* R829 */ + 0x0000, /* R830 */ + 0x0000, /* R831 */ + 0x0000, /* R832 */ + 0x0000, /* R833 */ + 0x0000, /* R834 */ + 0x0000, /* R835 */ + 0x0000, /* R836 */ + 0x0000, /* R837 */ + 0x0000, /* R838 */ + 0x0000, /* R839 */ + 0x0000, /* R840 */ + 0x0000, /* R841 */ + 0x0000, /* R842 */ + 0x0000, /* R843 */ + 0x0000, /* R844 */ + 0x0000, /* R845 */ + 0x0000, /* R846 */ + 0x0000, /* R847 */ + 0x0000, /* R848 */ + 0x0000, /* R849 */ + 0x0000, /* R850 */ + 0x0000, /* R851 */ + 0x0000, /* R852 */ + 0x0000, /* R853 */ + 0x0000, /* R854 */ + 0x0000, /* R855 */ + 0x0000, /* R856 */ + 0x0000, /* R857 */ + 0x0000, /* R858 */ + 0x0000, /* R859 */ + 0x0000, /* R860 */ + 0x0000, /* R861 */ + 0x0000, /* R862 */ + 0x0000, /* R863 */ + 0x0000, /* R864 */ + 0x0000, /* R865 */ + 0x0000, /* R866 */ + 0x0000, /* R867 */ + 0x0000, /* R868 */ + 0x0000, /* R869 */ + 0x0000, /* R870 */ + 0x0000, /* R871 */ + 0x0000, /* R872 */ + 0x0000, /* R873 */ + 0x0000, /* R874 */ + 0x0000, /* R875 */ + 0x0000, /* R876 */ + 0x0000, /* R877 */ + 0x0000, /* R878 */ + 0x0000, /* R879 */ + 0x0000, /* R880 */ + 0x0000, /* R881 */ + 0x0000, /* R882 */ + 0x0000, /* R883 */ + 0x0000, /* R884 */ + 0x0000, /* R885 */ + 0x0000, /* R886 */ + 0x0000, /* R887 */ + 0x0000, /* R888 */ + 0x0000, /* R889 */ + 0x0000, /* R890 */ + 0x0000, /* R891 */ + 0x0000, /* R892 */ + 0x0000, /* R893 */ + 0x0000, /* R894 */ + 0x0000, /* R895 */ + 0x0000, /* R896 */ + 0x0000, /* R897 */ + 0x0000, /* R898 */ + 0x0000, /* R899 */ + 0x0000, /* R900 */ + 0x0000, /* R901 */ + 0x0000, /* R902 */ + 0x0000, /* R903 */ + 0x0000, /* R904 */ + 0x0000, /* R905 */ + 0x0000, /* R906 */ + 0x0000, /* R907 */ + 0x0000, /* R908 */ + 0x0000, /* R909 */ + 0x0000, /* R910 */ + 0x0000, /* R911 */ + 0x0000, /* R912 */ + 0x0000, /* R913 */ + 0x0000, /* R914 */ + 0x0000, /* R915 */ + 0x0000, /* R916 */ + 0x0000, /* R917 */ + 0x0000, /* R918 */ + 0x0000, /* R919 */ + 0x0000, /* R920 */ + 0x0000, /* R921 */ + 0x0000, /* R922 */ + 0x0000, /* R923 */ + 0x0000, /* R924 */ + 0x0000, /* R925 */ + 0x0000, /* R926 */ + 0x0000, /* R927 */ + 0x0000, /* R928 */ + 0x0000, /* R929 */ + 0x0000, /* R930 */ + 0x0000, /* R931 */ + 0x0000, /* R932 */ + 0x0000, /* R933 */ + 0x0000, /* R934 */ + 0x0000, /* R935 */ + 0x0000, /* R936 */ + 0x0000, /* R937 */ + 0x0000, /* R938 */ + 0x0000, /* R939 */ + 0x0000, /* R940 */ + 0x0000, /* R941 */ + 0x0000, /* R942 */ + 0x0000, /* R943 */ + 0x0000, /* R944 */ + 0x0000, /* R945 */ + 0x0000, /* R946 */ + 0x0000, /* R947 */ + 0x0000, /* R948 */ + 0x0000, /* R949 */ + 0x0000, /* R950 */ + 0x0000, /* R951 */ + 0x0000, /* R952 */ + 0x0000, /* R953 */ + 0x0000, /* R954 */ + 0x0000, /* R955 */ + 0x0000, /* R956 */ + 0x0000, /* R957 */ + 0x0000, /* R958 */ + 0x0000, /* R959 */ + 0x0000, /* R960 */ + 0x0000, /* R961 */ + 0x0000, /* R962 */ + 0x0000, /* R963 */ + 0x0000, /* R964 */ + 0x0000, /* R965 */ + 0x0000, /* R966 */ + 0x0000, /* R967 */ + 0x0000, /* R968 */ + 0x0000, /* R969 */ + 0x0000, /* R970 */ + 0x0000, /* R971 */ + 0x0000, /* R972 */ + 0x0000, /* R973 */ + 0x0000, /* R974 */ + 0x0000, /* R975 */ + 0x0000, /* R976 */ + 0x0000, /* R977 */ + 0x0000, /* R978 */ + 0x0000, /* R979 */ + 0x0000, /* R980 */ + 0x0000, /* R981 */ + 0x0000, /* R982 */ + 0x0000, /* R983 */ + 0x0000, /* R984 */ + 0x0000, /* R985 */ + 0x0000, /* R986 */ + 0x0000, /* R987 */ + 0x0000, /* R988 */ + 0x0000, /* R989 */ + 0x0000, /* R990 */ + 0x0000, /* R991 */ + 0x0000, /* R992 */ + 0x0000, /* R993 */ + 0x0000, /* R994 */ + 0x0000, /* R995 */ + 0x0000, /* R996 */ + 0x0000, /* R997 */ + 0x0000, /* R998 */ + 0x0000, /* R999 */ + 0x0000, /* R1000 */ + 0x0000, /* R1001 */ + 0x0000, /* R1002 */ + 0x0000, /* R1003 */ + 0x0000, /* R1004 */ + 0x0000, /* R1005 */ + 0x0000, /* R1006 */ + 0x0000, /* R1007 */ + 0x0000, /* R1008 */ + 0x0000, /* R1009 */ + 0x0000, /* R1010 */ + 0x0000, /* R1011 */ + 0x0000, /* R1012 */ + 0x0000, /* R1013 */ + 0x0000, /* R1014 */ + 0x0000, /* R1015 */ + 0x0000, /* R1016 */ + 0x0000, /* R1017 */ + 0x0000, /* R1018 */ + 0x0000, /* R1019 */ + 0x0000, /* R1020 */ + 0x0000, /* R1021 */ + 0x0000, /* R1022 */ + 0x0000, /* R1023 */ + 0x0000, /* R1024 */ + 0x0000, /* R1025 */ + 0x0000, /* R1026 */ + 0x0000, /* R1027 */ + 0x0000, /* R1028 */ + 0x0000, /* R1029 */ + 0x0000, /* R1030 */ + 0x0000, /* R1031 */ + 0x0000, /* R1032 */ + 0x0000, /* R1033 */ + 0x0000, /* R1034 */ + 0x0000, /* R1035 */ + 0x0000, /* R1036 */ + 0x0000, /* R1037 - DSP2_ExecControl */ + 0x0000, /* R1038 */ + 0x0000, /* R1039 */ + 0x0000, /* R1040 */ + 0x0000, /* R1041 */ + 0x0000, /* R1042 */ + 0x0000, /* R1043 */ + 0x0000, /* R1044 */ + 0x0000, /* R1045 */ + 0x0000, /* R1046 */ + 0x0000, /* R1047 */ + 0x0000, /* R1048 */ + 0x0000, /* R1049 */ + 0x0000, /* R1050 */ + 0x0000, /* R1051 */ + 0x0000, /* R1052 */ + 0x0000, /* R1053 */ + 0x0000, /* R1054 */ + 0x0000, /* R1055 */ + 0x0000, /* R1056 */ + 0x0000, /* R1057 */ + 0x0000, /* R1058 */ + 0x0000, /* R1059 */ + 0x0000, /* R1060 */ + 0x0000, /* R1061 */ + 0x0000, /* R1062 */ + 0x0000, /* R1063 */ + 0x0000, /* R1064 */ + 0x0000, /* R1065 */ + 0x0000, /* R1066 */ + 0x0000, /* R1067 */ + 0x0000, /* R1068 */ + 0x0000, /* R1069 */ + 0x0000, /* R1070 */ + 0x0000, /* R1071 */ + 0x0000, /* R1072 */ + 0x0000, /* R1073 */ + 0x0000, /* R1074 */ + 0x0000, /* R1075 */ + 0x0000, /* R1076 */ + 0x0000, /* R1077 */ + 0x0000, /* R1078 */ + 0x0000, /* R1079 */ + 0x0000, /* R1080 */ + 0x0000, /* R1081 */ + 0x0000, /* R1082 */ + 0x0000, /* R1083 */ + 0x0000, /* R1084 */ + 0x0000, /* R1085 */ + 0x0000, /* R1086 */ + 0x0000, /* R1087 */ + 0x0000, /* R1088 */ + 0x0000, /* R1089 */ + 0x0000, /* R1090 */ + 0x0000, /* R1091 */ + 0x0000, /* R1092 */ + 0x0000, /* R1093 */ + 0x0000, /* R1094 */ + 0x0000, /* R1095 */ + 0x0000, /* R1096 */ + 0x0000, /* R1097 */ + 0x0000, /* R1098 */ + 0x0000, /* R1099 */ + 0x0000, /* R1100 */ + 0x0000, /* R1101 */ + 0x0000, /* R1102 */ + 0x0000, /* R1103 */ + 0x0000, /* R1104 */ + 0x0000, /* R1105 */ + 0x0000, /* R1106 */ + 0x0000, /* R1107 */ + 0x0000, /* R1108 */ + 0x0000, /* R1109 */ + 0x0000, /* R1110 */ + 0x0000, /* R1111 */ + 0x0000, /* R1112 */ + 0x0000, /* R1113 */ + 0x0000, /* R1114 */ + 0x0000, /* R1115 */ + 0x0000, /* R1116 */ + 0x0000, /* R1117 */ + 0x0000, /* R1118 */ + 0x0000, /* R1119 */ + 0x0000, /* R1120 */ + 0x0000, /* R1121 */ + 0x0000, /* R1122 */ + 0x0000, /* R1123 */ + 0x0000, /* R1124 */ + 0x0000, /* R1125 */ + 0x0000, /* R1126 */ + 0x0000, /* R1127 */ + 0x0000, /* R1128 */ + 0x0000, /* R1129 */ + 0x0000, /* R1130 */ + 0x0000, /* R1131 */ + 0x0000, /* R1132 */ + 0x0000, /* R1133 */ + 0x0000, /* R1134 */ + 0x0000, /* R1135 */ + 0x0000, /* R1136 */ + 0x0000, /* R1137 */ + 0x0000, /* R1138 */ + 0x0000, /* R1139 */ + 0x0000, /* R1140 */ + 0x0000, /* R1141 */ + 0x0000, /* R1142 */ + 0x0000, /* R1143 */ + 0x0000, /* R1144 */ + 0x0000, /* R1145 */ + 0x0000, /* R1146 */ + 0x0000, /* R1147 */ + 0x0000, /* R1148 */ + 0x0000, /* R1149 */ + 0x0000, /* R1150 */ + 0x0000, /* R1151 */ + 0x0000, /* R1152 */ + 0x0000, /* R1153 */ + 0x0000, /* R1154 */ + 0x0000, /* R1155 */ + 0x0000, /* R1156 */ + 0x0000, /* R1157 */ + 0x0000, /* R1158 */ + 0x0000, /* R1159 */ + 0x0000, /* R1160 */ + 0x0000, /* R1161 */ + 0x0000, /* R1162 */ + 0x0000, /* R1163 */ + 0x0000, /* R1164 */ + 0x0000, /* R1165 */ + 0x0000, /* R1166 */ + 0x0000, /* R1167 */ + 0x0000, /* R1168 */ + 0x0000, /* R1169 */ + 0x0000, /* R1170 */ + 0x0000, /* R1171 */ + 0x0000, /* R1172 */ + 0x0000, /* R1173 */ + 0x0000, /* R1174 */ + 0x0000, /* R1175 */ + 0x0000, /* R1176 */ + 0x0000, /* R1177 */ + 0x0000, /* R1178 */ + 0x0000, /* R1179 */ + 0x0000, /* R1180 */ + 0x0000, /* R1181 */ + 0x0000, /* R1182 */ + 0x0000, /* R1183 */ + 0x0000, /* R1184 */ + 0x0000, /* R1185 */ + 0x0000, /* R1186 */ + 0x0000, /* R1187 */ + 0x0000, /* R1188 */ + 0x0000, /* R1189 */ + 0x0000, /* R1190 */ + 0x0000, /* R1191 */ + 0x0000, /* R1192 */ + 0x0000, /* R1193 */ + 0x0000, /* R1194 */ + 0x0000, /* R1195 */ + 0x0000, /* R1196 */ + 0x0000, /* R1197 */ + 0x0000, /* R1198 */ + 0x0000, /* R1199 */ + 0x0000, /* R1200 */ + 0x0000, /* R1201 */ + 0x0000, /* R1202 */ + 0x0000, /* R1203 */ + 0x0000, /* R1204 */ + 0x0000, /* R1205 */ + 0x0000, /* R1206 */ + 0x0000, /* R1207 */ + 0x0000, /* R1208 */ + 0x0000, /* R1209 */ + 0x0000, /* R1210 */ + 0x0000, /* R1211 */ + 0x0000, /* R1212 */ + 0x0000, /* R1213 */ + 0x0000, /* R1214 */ + 0x0000, /* R1215 */ + 0x0000, /* R1216 */ + 0x0000, /* R1217 */ + 0x0000, /* R1218 */ + 0x0000, /* R1219 */ + 0x0000, /* R1220 */ + 0x0000, /* R1221 */ + 0x0000, /* R1222 */ + 0x0000, /* R1223 */ + 0x0000, /* R1224 */ + 0x0000, /* R1225 */ + 0x0000, /* R1226 */ + 0x0000, /* R1227 */ + 0x0000, /* R1228 */ + 0x0000, /* R1229 */ + 0x0000, /* R1230 */ + 0x0000, /* R1231 */ + 0x0000, /* R1232 */ + 0x0000, /* R1233 */ + 0x0000, /* R1234 */ + 0x0000, /* R1235 */ + 0x0000, /* R1236 */ + 0x0000, /* R1237 */ + 0x0000, /* R1238 */ + 0x0000, /* R1239 */ + 0x0000, /* R1240 */ + 0x0000, /* R1241 */ + 0x0000, /* R1242 */ + 0x0000, /* R1243 */ + 0x0000, /* R1244 */ + 0x0000, /* R1245 */ + 0x0000, /* R1246 */ + 0x0000, /* R1247 */ + 0x0000, /* R1248 */ + 0x0000, /* R1249 */ + 0x0000, /* R1250 */ + 0x0000, /* R1251 */ + 0x0000, /* R1252 */ + 0x0000, /* R1253 */ + 0x0000, /* R1254 */ + 0x0000, /* R1255 */ + 0x0000, /* R1256 */ + 0x0000, /* R1257 */ + 0x0000, /* R1258 */ + 0x0000, /* R1259 */ + 0x0000, /* R1260 */ + 0x0000, /* R1261 */ + 0x0000, /* R1262 */ + 0x0000, /* R1263 */ + 0x0000, /* R1264 */ + 0x0000, /* R1265 */ + 0x0000, /* R1266 */ + 0x0000, /* R1267 */ + 0x0000, /* R1268 */ + 0x0000, /* R1269 */ + 0x0000, /* R1270 */ + 0x0000, /* R1271 */ + 0x0000, /* R1272 */ + 0x0000, /* R1273 */ + 0x0000, /* R1274 */ + 0x0000, /* R1275 */ + 0x0000, /* R1276 */ + 0x0000, /* R1277 */ + 0x0000, /* R1278 */ + 0x0000, /* R1279 */ + 0x0000, /* R1280 */ + 0x0000, /* R1281 */ + 0x0000, /* R1282 */ + 0x0000, /* R1283 */ + 0x0000, /* R1284 */ + 0x0000, /* R1285 */ + 0x0000, /* R1286 */ + 0x0000, /* R1287 */ + 0x0000, /* R1288 */ + 0x0000, /* R1289 */ + 0x0000, /* R1290 */ + 0x0000, /* R1291 */ + 0x0000, /* R1292 */ + 0x0000, /* R1293 */ + 0x0000, /* R1294 */ + 0x0000, /* R1295 */ + 0x0000, /* R1296 */ + 0x0000, /* R1297 */ + 0x0000, /* R1298 */ + 0x0000, /* R1299 */ + 0x0000, /* R1300 */ + 0x0000, /* R1301 */ + 0x0000, /* R1302 */ + 0x0000, /* R1303 */ + 0x0000, /* R1304 */ + 0x0000, /* R1305 */ + 0x0000, /* R1306 */ + 0x0000, /* R1307 */ + 0x0000, /* R1308 */ + 0x0000, /* R1309 */ + 0x0000, /* R1310 */ + 0x0000, /* R1311 */ + 0x0000, /* R1312 */ + 0x0000, /* R1313 */ + 0x0000, /* R1314 */ + 0x0000, /* R1315 */ + 0x0000, /* R1316 */ + 0x0000, /* R1317 */ + 0x0000, /* R1318 */ + 0x0000, /* R1319 */ + 0x0000, /* R1320 */ + 0x0000, /* R1321 */ + 0x0000, /* R1322 */ + 0x0000, /* R1323 */ + 0x0000, /* R1324 */ + 0x0000, /* R1325 */ + 0x0000, /* R1326 */ + 0x0000, /* R1327 */ + 0x0000, /* R1328 */ + 0x0000, /* R1329 */ + 0x0000, /* R1330 */ + 0x0000, /* R1331 */ + 0x0000, /* R1332 */ + 0x0000, /* R1333 */ + 0x0000, /* R1334 */ + 0x0000, /* R1335 */ + 0x0000, /* R1336 */ + 0x0000, /* R1337 */ + 0x0000, /* R1338 */ + 0x0000, /* R1339 */ + 0x0000, /* R1340 */ + 0x0000, /* R1341 */ + 0x0000, /* R1342 */ + 0x0000, /* R1343 */ + 0x0000, /* R1344 */ + 0x0000, /* R1345 */ + 0x0000, /* R1346 */ + 0x0000, /* R1347 */ + 0x0000, /* R1348 */ + 0x0000, /* R1349 */ + 0x0000, /* R1350 */ + 0x0000, /* R1351 */ + 0x0000, /* R1352 */ + 0x0000, /* R1353 */ + 0x0000, /* R1354 */ + 0x0000, /* R1355 */ + 0x0000, /* R1356 */ + 0x0000, /* R1357 */ + 0x0000, /* R1358 */ + 0x0000, /* R1359 */ + 0x0000, /* R1360 */ + 0x0000, /* R1361 */ + 0x0000, /* R1362 */ + 0x0000, /* R1363 */ + 0x0000, /* R1364 */ + 0x0000, /* R1365 */ + 0x0000, /* R1366 */ + 0x0000, /* R1367 */ + 0x0000, /* R1368 */ + 0x0000, /* R1369 */ + 0x0000, /* R1370 */ + 0x0000, /* R1371 */ + 0x0000, /* R1372 */ + 0x0000, /* R1373 */ + 0x0000, /* R1374 */ + 0x0000, /* R1375 */ + 0x0000, /* R1376 */ + 0x0000, /* R1377 */ + 0x0000, /* R1378 */ + 0x0000, /* R1379 */ + 0x0000, /* R1380 */ + 0x0000, /* R1381 */ + 0x0000, /* R1382 */ + 0x0000, /* R1383 */ + 0x0000, /* R1384 */ + 0x0000, /* R1385 */ + 0x0000, /* R1386 */ + 0x0000, /* R1387 */ + 0x0000, /* R1388 */ + 0x0000, /* R1389 */ + 0x0000, /* R1390 */ + 0x0000, /* R1391 */ + 0x0000, /* R1392 */ + 0x0000, /* R1393 */ + 0x0000, /* R1394 */ + 0x0000, /* R1395 */ + 0x0000, /* R1396 */ + 0x0000, /* R1397 */ + 0x0000, /* R1398 */ + 0x0000, /* R1399 */ + 0x0000, /* R1400 */ + 0x0000, /* R1401 */ + 0x0000, /* R1402 */ + 0x0000, /* R1403 */ + 0x0000, /* R1404 */ + 0x0000, /* R1405 */ + 0x0000, /* R1406 */ + 0x0000, /* R1407 */ + 0x0000, /* R1408 */ + 0x0000, /* R1409 */ + 0x0000, /* R1410 */ + 0x0000, /* R1411 */ + 0x0000, /* R1412 */ + 0x0000, /* R1413 */ + 0x0000, /* R1414 */ + 0x0000, /* R1415 */ + 0x0000, /* R1416 */ + 0x0000, /* R1417 */ + 0x0000, /* R1418 */ + 0x0000, /* R1419 */ + 0x0000, /* R1420 */ + 0x0000, /* R1421 */ + 0x0000, /* R1422 */ + 0x0000, /* R1423 */ + 0x0000, /* R1424 */ + 0x0000, /* R1425 */ + 0x0000, /* R1426 */ + 0x0000, /* R1427 */ + 0x0000, /* R1428 */ + 0x0000, /* R1429 */ + 0x0000, /* R1430 */ + 0x0000, /* R1431 */ + 0x0000, /* R1432 */ + 0x0000, /* R1433 */ + 0x0000, /* R1434 */ + 0x0000, /* R1435 */ + 0x0000, /* R1436 */ + 0x0000, /* R1437 */ + 0x0000, /* R1438 */ + 0x0000, /* R1439 */ + 0x0000, /* R1440 */ + 0x0000, /* R1441 */ + 0x0000, /* R1442 */ + 0x0000, /* R1443 */ + 0x0000, /* R1444 */ + 0x0000, /* R1445 */ + 0x0000, /* R1446 */ + 0x0000, /* R1447 */ + 0x0000, /* R1448 */ + 0x0000, /* R1449 */ + 0x0000, /* R1450 */ + 0x0000, /* R1451 */ + 0x0000, /* R1452 */ + 0x0000, /* R1453 */ + 0x0000, /* R1454 */ + 0x0000, /* R1455 */ + 0x0000, /* R1456 */ + 0x0000, /* R1457 */ + 0x0000, /* R1458 */ + 0x0000, /* R1459 */ + 0x0000, /* R1460 */ + 0x0000, /* R1461 */ + 0x0000, /* R1462 */ + 0x0000, /* R1463 */ + 0x0000, /* R1464 */ + 0x0000, /* R1465 */ + 0x0000, /* R1466 */ + 0x0000, /* R1467 */ + 0x0000, /* R1468 */ + 0x0000, /* R1469 */ + 0x0000, /* R1470 */ + 0x0000, /* R1471 */ + 0x0000, /* R1472 */ + 0x0000, /* R1473 */ + 0x0000, /* R1474 */ + 0x0000, /* R1475 */ + 0x0000, /* R1476 */ + 0x0000, /* R1477 */ + 0x0000, /* R1478 */ + 0x0000, /* R1479 */ + 0x0000, /* R1480 */ + 0x0000, /* R1481 */ + 0x0000, /* R1482 */ + 0x0000, /* R1483 */ + 0x0000, /* R1484 */ + 0x0000, /* R1485 */ + 0x0000, /* R1486 */ + 0x0000, /* R1487 */ + 0x0000, /* R1488 */ + 0x0000, /* R1489 */ + 0x0000, /* R1490 */ + 0x0000, /* R1491 */ + 0x0000, /* R1492 */ + 0x0000, /* R1493 */ + 0x0000, /* R1494 */ + 0x0000, /* R1495 */ + 0x0000, /* R1496 */ + 0x0000, /* R1497 */ + 0x0000, /* R1498 */ + 0x0000, /* R1499 */ + 0x0000, /* R1500 */ + 0x0000, /* R1501 */ + 0x0000, /* R1502 */ + 0x0000, /* R1503 */ + 0x0000, /* R1504 */ + 0x0000, /* R1505 */ + 0x0000, /* R1506 */ + 0x0000, /* R1507 */ + 0x0000, /* R1508 */ + 0x0000, /* R1509 */ + 0x0000, /* R1510 */ + 0x0000, /* R1511 */ + 0x0000, /* R1512 */ + 0x0000, /* R1513 */ + 0x0000, /* R1514 */ + 0x0000, /* R1515 */ + 0x0000, /* R1516 */ + 0x0000, /* R1517 */ + 0x0000, /* R1518 */ + 0x0000, /* R1519 */ + 0x0000, /* R1520 */ + 0x0000, /* R1521 */ + 0x0000, /* R1522 */ + 0x0000, /* R1523 */ + 0x0000, /* R1524 */ + 0x0000, /* R1525 */ + 0x0000, /* R1526 */ + 0x0000, /* R1527 */ + 0x0000, /* R1528 */ + 0x0000, /* R1529 */ + 0x0000, /* R1530 */ + 0x0000, /* R1531 */ + 0x0000, /* R1532 */ + 0x0000, /* R1533 */ + 0x0000, /* R1534 */ + 0x0000, /* R1535 */ + 0x0000, /* R1536 */ + 0x0000, /* R1537 */ + 0x0000, /* R1538 */ + 0x0000, /* R1539 */ + 0x0000, /* R1540 */ + 0x0000, /* R1541 */ + 0x0000, /* R1542 */ + 0x0000, /* R1543 */ + 0x0000, /* R1544 */ + 0x0000, /* R1545 */ + 0x0000, /* R1546 */ + 0x0000, /* R1547 */ + 0x0000, /* R1548 */ + 0x0000, /* R1549 */ + 0x0000, /* R1550 */ + 0x0000, /* R1551 */ + 0x0000, /* R1552 */ + 0x0000, /* R1553 */ + 0x0000, /* R1554 */ + 0x0000, /* R1555 */ + 0x0000, /* R1556 */ + 0x0000, /* R1557 */ + 0x0000, /* R1558 */ + 0x0000, /* R1559 */ + 0x0000, /* R1560 */ + 0x0000, /* R1561 */ + 0x0000, /* R1562 */ + 0x0000, /* R1563 */ + 0x0000, /* R1564 */ + 0x0000, /* R1565 */ + 0x0000, /* R1566 */ + 0x0000, /* R1567 */ + 0x0000, /* R1568 */ + 0x0000, /* R1569 */ + 0x0000, /* R1570 */ + 0x0000, /* R1571 */ + 0x0000, /* R1572 */ + 0x0000, /* R1573 */ + 0x0000, /* R1574 */ + 0x0000, /* R1575 */ + 0x0000, /* R1576 */ + 0x0000, /* R1577 */ + 0x0000, /* R1578 */ + 0x0000, /* R1579 */ + 0x0000, /* R1580 */ + 0x0000, /* R1581 */ + 0x0000, /* R1582 */ + 0x0000, /* R1583 */ + 0x0000, /* R1584 */ + 0x0000, /* R1585 */ + 0x0000, /* R1586 */ + 0x0000, /* R1587 */ + 0x0000, /* R1588 */ + 0x0000, /* R1589 */ + 0x0000, /* R1590 */ + 0x0000, /* R1591 */ + 0x0000, /* R1592 */ + 0x0000, /* R1593 */ + 0x0000, /* R1594 */ + 0x0000, /* R1595 */ + 0x0000, /* R1596 */ + 0x0000, /* R1597 */ + 0x0000, /* R1598 */ + 0x0000, /* R1599 */ + 0x0000, /* R1600 */ + 0x0000, /* R1601 */ + 0x0000, /* R1602 */ + 0x0000, /* R1603 */ + 0x0000, /* R1604 */ + 0x0000, /* R1605 */ + 0x0000, /* R1606 */ + 0x0000, /* R1607 */ + 0x0000, /* R1608 */ + 0x0000, /* R1609 */ + 0x0000, /* R1610 */ + 0x0000, /* R1611 */ + 0x0000, /* R1612 */ + 0x0000, /* R1613 */ + 0x0000, /* R1614 */ + 0x0000, /* R1615 */ + 0x0000, /* R1616 */ + 0x0000, /* R1617 */ + 0x0000, /* R1618 */ + 0x0000, /* R1619 */ + 0x0000, /* R1620 */ + 0x0000, /* R1621 */ + 0x0000, /* R1622 */ + 0x0000, /* R1623 */ + 0x0000, /* R1624 */ + 0x0000, /* R1625 */ + 0x0000, /* R1626 */ + 0x0000, /* R1627 */ + 0x0000, /* R1628 */ + 0x0000, /* R1629 */ + 0x0000, /* R1630 */ + 0x0000, /* R1631 */ + 0x0000, /* R1632 */ + 0x0000, /* R1633 */ + 0x0000, /* R1634 */ + 0x0000, /* R1635 */ + 0x0000, /* R1636 */ + 0x0000, /* R1637 */ + 0x0000, /* R1638 */ + 0x0000, /* R1639 */ + 0x0000, /* R1640 */ + 0x0000, /* R1641 */ + 0x0000, /* R1642 */ + 0x0000, /* R1643 */ + 0x0000, /* R1644 */ + 0x0000, /* R1645 */ + 0x0000, /* R1646 */ + 0x0000, /* R1647 */ + 0x0000, /* R1648 */ + 0x0000, /* R1649 */ + 0x0000, /* R1650 */ + 0x0000, /* R1651 */ + 0x0000, /* R1652 */ + 0x0000, /* R1653 */ + 0x0000, /* R1654 */ + 0x0000, /* R1655 */ + 0x0000, /* R1656 */ + 0x0000, /* R1657 */ + 0x0000, /* R1658 */ + 0x0000, /* R1659 */ + 0x0000, /* R1660 */ + 0x0000, /* R1661 */ + 0x0000, /* R1662 */ + 0x0000, /* R1663 */ + 0x0000, /* R1664 */ + 0x0000, /* R1665 */ + 0x0000, /* R1666 */ + 0x0000, /* R1667 */ + 0x0000, /* R1668 */ + 0x0000, /* R1669 */ + 0x0000, /* R1670 */ + 0x0000, /* R1671 */ + 0x0000, /* R1672 */ + 0x0000, /* R1673 */ + 0x0000, /* R1674 */ + 0x0000, /* R1675 */ + 0x0000, /* R1676 */ + 0x0000, /* R1677 */ + 0x0000, /* R1678 */ + 0x0000, /* R1679 */ + 0x0000, /* R1680 */ + 0x0000, /* R1681 */ + 0x0000, /* R1682 */ + 0x0000, /* R1683 */ + 0x0000, /* R1684 */ + 0x0000, /* R1685 */ + 0x0000, /* R1686 */ + 0x0000, /* R1687 */ + 0x0000, /* R1688 */ + 0x0000, /* R1689 */ + 0x0000, /* R1690 */ + 0x0000, /* R1691 */ + 0x0000, /* R1692 */ + 0x0000, /* R1693 */ + 0x0000, /* R1694 */ + 0x0000, /* R1695 */ + 0x0000, /* R1696 */ + 0x0000, /* R1697 */ + 0x0000, /* R1698 */ + 0x0000, /* R1699 */ + 0x0000, /* R1700 */ + 0x0000, /* R1701 */ + 0x0000, /* R1702 */ + 0x0000, /* R1703 */ + 0x0000, /* R1704 */ + 0x0000, /* R1705 */ + 0x0000, /* R1706 */ + 0x0000, /* R1707 */ + 0x0000, /* R1708 */ + 0x0000, /* R1709 */ + 0x0000, /* R1710 */ + 0x0000, /* R1711 */ + 0x0000, /* R1712 */ + 0x0000, /* R1713 */ + 0x0000, /* R1714 */ + 0x0000, /* R1715 */ + 0x0000, /* R1716 */ + 0x0000, /* R1717 */ + 0x0000, /* R1718 */ + 0x0000, /* R1719 */ + 0x0000, /* R1720 */ + 0x0000, /* R1721 */ + 0x0000, /* R1722 */ + 0x0000, /* R1723 */ + 0x0000, /* R1724 */ + 0x0000, /* R1725 */ + 0x0000, /* R1726 */ + 0x0000, /* R1727 */ + 0x0000, /* R1728 */ + 0x0000, /* R1729 */ + 0x0000, /* R1730 */ + 0x0000, /* R1731 */ + 0x0000, /* R1732 */ + 0x0000, /* R1733 */ + 0x0000, /* R1734 */ + 0x0000, /* R1735 */ + 0x0000, /* R1736 */ + 0x0000, /* R1737 */ + 0x0000, /* R1738 */ + 0x0000, /* R1739 */ + 0x0000, /* R1740 */ + 0x0000, /* R1741 */ + 0x0000, /* R1742 */ + 0x0000, /* R1743 */ + 0x0000, /* R1744 */ + 0x0000, /* R1745 */ + 0x0000, /* R1746 */ + 0x0000, /* R1747 */ + 0x0000, /* R1748 */ + 0x0000, /* R1749 */ + 0x0000, /* R1750 */ + 0x0000, /* R1751 */ + 0x0000, /* R1752 */ + 0x0000, /* R1753 */ + 0x0000, /* R1754 */ + 0x0000, /* R1755 */ + 0x0000, /* R1756 */ + 0x0000, /* R1757 */ + 0x0000, /* R1758 */ + 0x0000, /* R1759 */ + 0x0000, /* R1760 */ + 0x0000, /* R1761 */ + 0x0000, /* R1762 */ + 0x0000, /* R1763 */ + 0x0000, /* R1764 */ + 0x0000, /* R1765 */ + 0x0000, /* R1766 */ + 0x0000, /* R1767 */ + 0x0000, /* R1768 */ + 0x0000, /* R1769 */ + 0x0000, /* R1770 */ + 0x0000, /* R1771 */ + 0x0000, /* R1772 */ + 0x0000, /* R1773 */ + 0x0000, /* R1774 */ + 0x0000, /* R1775 */ + 0x0000, /* R1776 */ + 0x0000, /* R1777 */ + 0x0000, /* R1778 */ + 0x0000, /* R1779 */ + 0x0000, /* R1780 */ + 0x0000, /* R1781 */ + 0x0000, /* R1782 */ + 0x0000, /* R1783 */ + 0x0000, /* R1784 */ + 0x0000, /* R1785 */ + 0x0000, /* R1786 */ + 0x0000, /* R1787 */ + 0x0000, /* R1788 */ + 0x0000, /* R1789 */ + 0x0000, /* R1790 */ + 0x0000, /* R1791 */ + 0x0000, /* R1792 */ + 0x0000, /* R1793 */ + 0x0000, /* R1794 */ + 0x0000, /* R1795 */ + 0x0000, /* R1796 */ + 0x0000, /* R1797 */ + 0x0000, /* R1798 */ + 0x0000, /* R1799 */ + 0x0000, /* R1800 */ + 0x0000, /* R1801 */ + 0x0000, /* R1802 */ + 0x0000, /* R1803 */ + 0x0000, /* R1804 */ + 0x0000, /* R1805 */ + 0x0000, /* R1806 */ + 0x0000, /* R1807 */ + 0x0000, /* R1808 */ + 0x0000, /* R1809 */ + 0x0000, /* R1810 */ + 0x0000, /* R1811 */ + 0x0000, /* R1812 */ + 0x0000, /* R1813 */ + 0x0000, /* R1814 */ + 0x0000, /* R1815 */ + 0x0000, /* R1816 */ + 0x0000, /* R1817 */ + 0x0000, /* R1818 */ + 0x0000, /* R1819 */ + 0x0000, /* R1820 */ + 0x0000, /* R1821 */ + 0x0000, /* R1822 */ + 0x0000, /* R1823 */ + 0x0000, /* R1824 */ + 0x0000, /* R1825 */ + 0x0000, /* R1826 */ + 0x0000, /* R1827 */ + 0x0000, /* R1828 */ + 0x0000, /* R1829 */ + 0x0000, /* R1830 */ + 0x0000, /* R1831 */ + 0x0000, /* R1832 */ + 0x0000, /* R1833 */ + 0x0000, /* R1834 */ + 0x0000, /* R1835 */ + 0x0000, /* R1836 */ + 0x0000, /* R1837 */ + 0x0000, /* R1838 */ + 0x0000, /* R1839 */ + 0x0000, /* R1840 */ + 0x0000, /* R1841 */ + 0x0000, /* R1842 */ + 0x0000, /* R1843 */ + 0x0000, /* R1844 */ + 0x0000, /* R1845 */ + 0x0000, /* R1846 */ + 0x0000, /* R1847 */ + 0x0000, /* R1848 */ + 0x0000, /* R1849 */ + 0x0000, /* R1850 */ + 0x0000, /* R1851 */ + 0x0000, /* R1852 */ + 0x0000, /* R1853 */ + 0x0000, /* R1854 */ + 0x0000, /* R1855 */ + 0x0000, /* R1856 */ + 0x0000, /* R1857 */ + 0x0000, /* R1858 */ + 0x0000, /* R1859 */ + 0x0000, /* R1860 */ + 0x0000, /* R1861 */ + 0x0000, /* R1862 */ + 0x0000, /* R1863 */ + 0x0000, /* R1864 */ + 0x0000, /* R1865 */ + 0x0000, /* R1866 */ + 0x0000, /* R1867 */ + 0x0000, /* R1868 */ + 0x0000, /* R1869 */ + 0x0000, /* R1870 */ + 0x0000, /* R1871 */ + 0x0000, /* R1872 */ + 0x0000, /* R1873 */ + 0x0000, /* R1874 */ + 0x0000, /* R1875 */ + 0x0000, /* R1876 */ + 0x0000, /* R1877 */ + 0x0000, /* R1878 */ + 0x0000, /* R1879 */ + 0x0000, /* R1880 */ + 0x0000, /* R1881 */ + 0x0000, /* R1882 */ + 0x0000, /* R1883 */ + 0x0000, /* R1884 */ + 0x0000, /* R1885 */ + 0x0000, /* R1886 */ + 0x0000, /* R1887 */ + 0x0000, /* R1888 */ + 0x0000, /* R1889 */ + 0x0000, /* R1890 */ + 0x0000, /* R1891 */ + 0x0000, /* R1892 */ + 0x0000, /* R1893 */ + 0x0000, /* R1894 */ + 0x0000, /* R1895 */ + 0x0000, /* R1896 */ + 0x0000, /* R1897 */ + 0x0000, /* R1898 */ + 0x0000, /* R1899 */ + 0x0000, /* R1900 */ + 0x0000, /* R1901 */ + 0x0000, /* R1902 */ + 0x0000, /* R1903 */ + 0x0000, /* R1904 */ + 0x0000, /* R1905 */ + 0x0000, /* R1906 */ + 0x0000, /* R1907 */ + 0x0000, /* R1908 */ + 0x0000, /* R1909 */ + 0x0000, /* R1910 */ + 0x0000, /* R1911 */ + 0x0000, /* R1912 */ + 0x0000, /* R1913 */ + 0x0000, /* R1914 */ + 0x0000, /* R1915 */ + 0x0000, /* R1916 */ + 0x0000, /* R1917 */ + 0x0000, /* R1918 */ + 0x0000, /* R1919 */ + 0x0000, /* R1920 */ + 0x0000, /* R1921 */ + 0x0000, /* R1922 */ + 0x0000, /* R1923 */ + 0x0000, /* R1924 */ + 0x0000, /* R1925 */ + 0x0000, /* R1926 */ + 0x0000, /* R1927 */ + 0x0000, /* R1928 */ + 0x0000, /* R1929 */ + 0x0000, /* R1930 */ + 0x0000, /* R1931 */ + 0x0000, /* R1932 */ + 0x0000, /* R1933 */ + 0x0000, /* R1934 */ + 0x0000, /* R1935 */ + 0x0000, /* R1936 */ + 0x0000, /* R1937 */ + 0x0000, /* R1938 */ + 0x0000, /* R1939 */ + 0x0000, /* R1940 */ + 0x0000, /* R1941 */ + 0x0000, /* R1942 */ + 0x0000, /* R1943 */ + 0x0000, /* R1944 */ + 0x0000, /* R1945 */ + 0x0000, /* R1946 */ + 0x0000, /* R1947 */ + 0x0000, /* R1948 */ + 0x0000, /* R1949 */ + 0x0000, /* R1950 */ + 0x0000, /* R1951 */ + 0x0000, /* R1952 */ + 0x0000, /* R1953 */ + 0x0000, /* R1954 */ + 0x0000, /* R1955 */ + 0x0000, /* R1956 */ + 0x0000, /* R1957 */ + 0x0000, /* R1958 */ + 0x0000, /* R1959 */ + 0x0000, /* R1960 */ + 0x0000, /* R1961 */ + 0x0000, /* R1962 */ + 0x0000, /* R1963 */ + 0x0000, /* R1964 */ + 0x0000, /* R1965 */ + 0x0000, /* R1966 */ + 0x0000, /* R1967 */ + 0x0000, /* R1968 */ + 0x0000, /* R1969 */ + 0x0000, /* R1970 */ + 0x0000, /* R1971 */ + 0x0000, /* R1972 */ + 0x0000, /* R1973 */ + 0x0000, /* R1974 */ + 0x0000, /* R1975 */ + 0x0000, /* R1976 */ + 0x0000, /* R1977 */ + 0x0000, /* R1978 */ + 0x0000, /* R1979 */ + 0x0000, /* R1980 */ + 0x0000, /* R1981 */ + 0x0000, /* R1982 */ + 0x0000, /* R1983 */ + 0x0000, /* R1984 */ + 0x0000, /* R1985 */ + 0x0000, /* R1986 */ + 0x0000, /* R1987 */ + 0x0000, /* R1988 */ + 0x0000, /* R1989 */ + 0x0000, /* R1990 */ + 0x0000, /* R1991 */ + 0x0000, /* R1992 */ + 0x0000, /* R1993 */ + 0x0000, /* R1994 */ + 0x0000, /* R1995 */ + 0x0000, /* R1996 */ + 0x0000, /* R1997 */ + 0x0000, /* R1998 */ + 0x0000, /* R1999 */ + 0x0000, /* R2000 */ + 0x0000, /* R2001 */ + 0x0000, /* R2002 */ + 0x0000, /* R2003 */ + 0x0000, /* R2004 */ + 0x0000, /* R2005 */ + 0x0000, /* R2006 */ + 0x0000, /* R2007 */ + 0x0000, /* R2008 */ + 0x0000, /* R2009 */ + 0x0000, /* R2010 */ + 0x0000, /* R2011 */ + 0x0000, /* R2012 */ + 0x0000, /* R2013 */ + 0x0000, /* R2014 */ + 0x0000, /* R2015 */ + 0x0000, /* R2016 */ + 0x0000, /* R2017 */ + 0x0000, /* R2018 */ + 0x0000, /* R2019 */ + 0x0000, /* R2020 */ + 0x0000, /* R2021 */ + 0x0000, /* R2022 */ + 0x0000, /* R2023 */ + 0x0000, /* R2024 */ + 0x0000, /* R2025 */ + 0x0000, /* R2026 */ + 0x0000, /* R2027 */ + 0x0000, /* R2028 */ + 0x0000, /* R2029 */ + 0x0000, /* R2030 */ + 0x0000, /* R2031 */ + 0x0000, /* R2032 */ + 0x0000, /* R2033 */ + 0x0000, /* R2034 */ + 0x0000, /* R2035 */ + 0x0000, /* R2036 */ + 0x0000, /* R2037 */ + 0x0000, /* R2038 */ + 0x0000, /* R2039 */ + 0x0000, /* R2040 */ + 0x0000, /* R2041 */ + 0x0000, /* R2042 */ + 0x0000, /* R2043 */ + 0x0000, /* R2044 */ + 0x0000, /* R2045 */ + 0x0000, /* R2046 */ + 0x0000, /* R2047 */ + 0x0000, /* R2048 */ + 0x0000, /* R2049 */ + 0x0000, /* R2050 */ + 0x0000, /* R2051 */ + 0x0000, /* R2052 */ + 0x0000, /* R2053 */ + 0x0000, /* R2054 */ + 0x0000, /* R2055 */ + 0x0000, /* R2056 */ + 0x0000, /* R2057 */ + 0x0000, /* R2058 */ + 0x0000, /* R2059 */ + 0x0000, /* R2060 */ + 0x0000, /* R2061 */ + 0x0000, /* R2062 */ + 0x0000, /* R2063 */ + 0x0000, /* R2064 */ + 0x0000, /* R2065 */ + 0x0000, /* R2066 */ + 0x0000, /* R2067 */ + 0x0000, /* R2068 */ + 0x0000, /* R2069 */ + 0x0000, /* R2070 */ + 0x0000, /* R2071 */ + 0x0000, /* R2072 */ + 0x0000, /* R2073 */ + 0x0000, /* R2074 */ + 0x0000, /* R2075 */ + 0x0000, /* R2076 */ + 0x0000, /* R2077 */ + 0x0000, /* R2078 */ + 0x0000, /* R2079 */ + 0x0000, /* R2080 */ + 0x0000, /* R2081 */ + 0x0000, /* R2082 */ + 0x0000, /* R2083 */ + 0x0000, /* R2084 */ + 0x0000, /* R2085 */ + 0x0000, /* R2086 */ + 0x0000, /* R2087 */ + 0x0000, /* R2088 */ + 0x0000, /* R2089 */ + 0x0000, /* R2090 */ + 0x0000, /* R2091 */ + 0x0000, /* R2092 */ + 0x0000, /* R2093 */ + 0x0000, /* R2094 */ + 0x0000, /* R2095 */ + 0x0000, /* R2096 */ + 0x0000, /* R2097 */ + 0x0000, /* R2098 */ + 0x0000, /* R2099 */ + 0x0000, /* R2100 */ + 0x0000, /* R2101 */ + 0x0000, /* R2102 */ + 0x0000, /* R2103 */ + 0x0000, /* R2104 */ + 0x0000, /* R2105 */ + 0x0000, /* R2106 */ + 0x0000, /* R2107 */ + 0x0000, /* R2108 */ + 0x0000, /* R2109 */ + 0x0000, /* R2110 */ + 0x0000, /* R2111 */ + 0x0000, /* R2112 */ + 0x0000, /* R2113 */ + 0x0000, /* R2114 */ + 0x0000, /* R2115 */ + 0x0000, /* R2116 */ + 0x0000, /* R2117 */ + 0x0000, /* R2118 */ + 0x0000, /* R2119 */ + 0x0000, /* R2120 */ + 0x0000, /* R2121 */ + 0x0000, /* R2122 */ + 0x0000, /* R2123 */ + 0x0000, /* R2124 */ + 0x0000, /* R2125 */ + 0x0000, /* R2126 */ + 0x0000, /* R2127 */ + 0x0000, /* R2128 */ + 0x0000, /* R2129 */ + 0x0000, /* R2130 */ + 0x0000, /* R2131 */ + 0x0000, /* R2132 */ + 0x0000, /* R2133 */ + 0x0000, /* R2134 */ + 0x0000, /* R2135 */ + 0x0000, /* R2136 */ + 0x0000, /* R2137 */ + 0x0000, /* R2138 */ + 0x0000, /* R2139 */ + 0x0000, /* R2140 */ + 0x0000, /* R2141 */ + 0x0000, /* R2142 */ + 0x0000, /* R2143 */ + 0x0000, /* R2144 */ + 0x0000, /* R2145 */ + 0x0000, /* R2146 */ + 0x0000, /* R2147 */ + 0x0000, /* R2148 */ + 0x0000, /* R2149 */ + 0x0000, /* R2150 */ + 0x0000, /* R2151 */ + 0x0000, /* R2152 */ + 0x0000, /* R2153 */ + 0x0000, /* R2154 */ + 0x0000, /* R2155 */ + 0x0000, /* R2156 */ + 0x0000, /* R2157 */ + 0x0000, /* R2158 */ + 0x0000, /* R2159 */ + 0x0000, /* R2160 */ + 0x0000, /* R2161 */ + 0x0000, /* R2162 */ + 0x0000, /* R2163 */ + 0x0000, /* R2164 */ + 0x0000, /* R2165 */ + 0x0000, /* R2166 */ + 0x0000, /* R2167 */ + 0x0000, /* R2168 */ + 0x0000, /* R2169 */ + 0x0000, /* R2170 */ + 0x0000, /* R2171 */ + 0x0000, /* R2172 */ + 0x0000, /* R2173 */ + 0x0000, /* R2174 */ + 0x0000, /* R2175 */ + 0x0000, /* R2176 */ + 0x0000, /* R2177 */ + 0x0000, /* R2178 */ + 0x0000, /* R2179 */ + 0x0000, /* R2180 */ + 0x0000, /* R2181 */ + 0x0000, /* R2182 */ + 0x0000, /* R2183 */ + 0x0000, /* R2184 */ + 0x0000, /* R2185 */ + 0x0000, /* R2186 */ + 0x0000, /* R2187 */ + 0x0000, /* R2188 */ + 0x0000, /* R2189 */ + 0x0000, /* R2190 */ + 0x0000, /* R2191 */ + 0x0000, /* R2192 */ + 0x0000, /* R2193 */ + 0x0000, /* R2194 */ + 0x0000, /* R2195 */ + 0x0000, /* R2196 */ + 0x0000, /* R2197 */ + 0x0000, /* R2198 */ + 0x0000, /* R2199 */ + 0x0000, /* R2200 */ + 0x0000, /* R2201 */ + 0x0000, /* R2202 */ + 0x0000, /* R2203 */ + 0x0000, /* R2204 */ + 0x0000, /* R2205 */ + 0x0000, /* R2206 */ + 0x0000, /* R2207 */ + 0x0000, /* R2208 */ + 0x0000, /* R2209 */ + 0x0000, /* R2210 */ + 0x0000, /* R2211 */ + 0x0000, /* R2212 */ + 0x0000, /* R2213 */ + 0x0000, /* R2214 */ + 0x0000, /* R2215 */ + 0x0000, /* R2216 */ + 0x0000, /* R2217 */ + 0x0000, /* R2218 */ + 0x0000, /* R2219 */ + 0x0000, /* R2220 */ + 0x0000, /* R2221 */ + 0x0000, /* R2222 */ + 0x0000, /* R2223 */ + 0x0000, /* R2224 */ + 0x0000, /* R2225 */ + 0x0000, /* R2226 */ + 0x0000, /* R2227 */ + 0x0000, /* R2228 */ + 0x0000, /* R2229 */ + 0x0000, /* R2230 */ + 0x0000, /* R2231 */ + 0x0000, /* R2232 */ + 0x0000, /* R2233 */ + 0x0000, /* R2234 */ + 0x0000, /* R2235 */ + 0x0000, /* R2236 */ + 0x0000, /* R2237 */ + 0x0000, /* R2238 */ + 0x0000, /* R2239 */ + 0x0000, /* R2240 */ + 0x0000, /* R2241 */ + 0x0000, /* R2242 */ + 0x0000, /* R2243 */ + 0x0000, /* R2244 */ + 0x0000, /* R2245 */ + 0x0000, /* R2246 */ + 0x0000, /* R2247 */ + 0x0000, /* R2248 */ + 0x0000, /* R2249 */ + 0x0000, /* R2250 */ + 0x0000, /* R2251 */ + 0x0000, /* R2252 */ + 0x0000, /* R2253 */ + 0x0000, /* R2254 */ + 0x0000, /* R2255 */ + 0x0000, /* R2256 */ + 0x0000, /* R2257 */ + 0x0000, /* R2258 */ + 0x0000, /* R2259 */ + 0x0000, /* R2260 */ + 0x0000, /* R2261 */ + 0x0000, /* R2262 */ + 0x0000, /* R2263 */ + 0x0000, /* R2264 */ + 0x0000, /* R2265 */ + 0x0000, /* R2266 */ + 0x0000, /* R2267 */ + 0x0000, /* R2268 */ + 0x0000, /* R2269 */ + 0x0000, /* R2270 */ + 0x0000, /* R2271 */ + 0x0000, /* R2272 */ + 0x0000, /* R2273 */ + 0x0000, /* R2274 */ + 0x0000, /* R2275 */ + 0x0000, /* R2276 */ + 0x0000, /* R2277 */ + 0x0000, /* R2278 */ + 0x0000, /* R2279 */ + 0x0000, /* R2280 */ + 0x0000, /* R2281 */ + 0x0000, /* R2282 */ + 0x0000, /* R2283 */ + 0x0000, /* R2284 */ + 0x0000, /* R2285 */ + 0x0000, /* R2286 */ + 0x0000, /* R2287 */ + 0x0000, /* R2288 */ + 0x0000, /* R2289 */ + 0x0000, /* R2290 */ + 0x0000, /* R2291 */ + 0x0000, /* R2292 */ + 0x0000, /* R2293 */ + 0x0000, /* R2294 */ + 0x0000, /* R2295 */ + 0x0000, /* R2296 */ + 0x0000, /* R2297 */ + 0x0000, /* R2298 */ + 0x0000, /* R2299 */ + 0x0000, /* R2300 */ + 0x0000, /* R2301 */ + 0x0000, /* R2302 */ + 0x0000, /* R2303 */ + 0x0000, /* R2304 */ + 0x0000, /* R2305 */ + 0x0000, /* R2306 */ + 0x0000, /* R2307 */ + 0x0000, /* R2308 */ + 0x0000, /* R2309 */ + 0x0000, /* R2310 */ + 0x0000, /* R2311 */ + 0x0000, /* R2312 */ + 0x0000, /* R2313 */ + 0x0000, /* R2314 */ + 0x0000, /* R2315 */ + 0x0000, /* R2316 */ + 0x0000, /* R2317 */ + 0x0000, /* R2318 */ + 0x0000, /* R2319 */ + 0x0000, /* R2320 */ + 0x0000, /* R2321 */ + 0x0000, /* R2322 */ + 0x0000, /* R2323 */ + 0x0000, /* R2324 */ + 0x0000, /* R2325 */ + 0x0000, /* R2326 */ + 0x0000, /* R2327 */ + 0x0000, /* R2328 */ + 0x0000, /* R2329 */ + 0x0000, /* R2330 */ + 0x0000, /* R2331 */ + 0x0000, /* R2332 */ + 0x0000, /* R2333 */ + 0x0000, /* R2334 */ + 0x0000, /* R2335 */ + 0x0000, /* R2336 */ + 0x0000, /* R2337 */ + 0x0000, /* R2338 */ + 0x0000, /* R2339 */ + 0x0000, /* R2340 */ + 0x0000, /* R2341 */ + 0x0000, /* R2342 */ + 0x0000, /* R2343 */ + 0x0000, /* R2344 */ + 0x0000, /* R2345 */ + 0x0000, /* R2346 */ + 0x0000, /* R2347 */ + 0x0000, /* R2348 */ + 0x0000, /* R2349 */ + 0x0000, /* R2350 */ + 0x0000, /* R2351 */ + 0x0000, /* R2352 */ + 0x0000, /* R2353 */ + 0x0000, /* R2354 */ + 0x0000, /* R2355 */ + 0x0000, /* R2356 */ + 0x0000, /* R2357 */ + 0x0000, /* R2358 */ + 0x0000, /* R2359 */ + 0x0000, /* R2360 */ + 0x0000, /* R2361 */ + 0x0000, /* R2362 */ + 0x0000, /* R2363 */ + 0x0000, /* R2364 */ + 0x0000, /* R2365 */ + 0x0000, /* R2366 */ + 0x0000, /* R2367 */ + 0x0000, /* R2368 */ + 0x0000, /* R2369 */ + 0x0000, /* R2370 */ + 0x0000, /* R2371 */ + 0x0000, /* R2372 */ + 0x0000, /* R2373 */ + 0x0000, /* R2374 */ + 0x0000, /* R2375 */ + 0x0000, /* R2376 */ + 0x0000, /* R2377 */ + 0x0000, /* R2378 */ + 0x0000, /* R2379 */ + 0x0000, /* R2380 */ + 0x0000, /* R2381 */ + 0x0000, /* R2382 */ + 0x0000, /* R2383 */ + 0x0000, /* R2384 */ + 0x0000, /* R2385 */ + 0x0000, /* R2386 */ + 0x0000, /* R2387 */ + 0x0000, /* R2388 */ + 0x0000, /* R2389 */ + 0x0000, /* R2390 */ + 0x0000, /* R2391 */ + 0x0000, /* R2392 */ + 0x0000, /* R2393 */ + 0x0000, /* R2394 */ + 0x0000, /* R2395 */ + 0x0000, /* R2396 */ + 0x0000, /* R2397 */ + 0x0000, /* R2398 */ + 0x0000, /* R2399 */ + 0x0000, /* R2400 */ + 0x0000, /* R2401 */ + 0x0000, /* R2402 */ + 0x0000, /* R2403 */ + 0x0000, /* R2404 */ + 0x0000, /* R2405 */ + 0x0000, /* R2406 */ + 0x0000, /* R2407 */ + 0x0000, /* R2408 */ + 0x0000, /* R2409 */ + 0x0000, /* R2410 */ + 0x0000, /* R2411 */ + 0x0000, /* R2412 */ + 0x0000, /* R2413 */ + 0x0000, /* R2414 */ + 0x0000, /* R2415 */ + 0x0000, /* R2416 */ + 0x0000, /* R2417 */ + 0x0000, /* R2418 */ + 0x0000, /* R2419 */ + 0x0000, /* R2420 */ + 0x0000, /* R2421 */ + 0x0000, /* R2422 */ + 0x0000, /* R2423 */ + 0x0000, /* R2424 */ + 0x0000, /* R2425 */ + 0x0000, /* R2426 */ + 0x0000, /* R2427 */ + 0x0000, /* R2428 */ + 0x0000, /* R2429 */ + 0x0000, /* R2430 */ + 0x0000, /* R2431 */ + 0x0000, /* R2432 */ + 0x0000, /* R2433 */ + 0x0000, /* R2434 */ + 0x0000, /* R2435 */ + 0x0000, /* R2436 */ + 0x0000, /* R2437 */ + 0x0000, /* R2438 */ + 0x0000, /* R2439 */ + 0x0000, /* R2440 */ + 0x0000, /* R2441 */ + 0x0000, /* R2442 */ + 0x0000, /* R2443 */ + 0x0000, /* R2444 */ + 0x0000, /* R2445 */ + 0x0000, /* R2446 */ + 0x0000, /* R2447 */ + 0x0000, /* R2448 */ + 0x0000, /* R2449 */ + 0x0000, /* R2450 */ + 0x0000, /* R2451 */ + 0x0000, /* R2452 */ + 0x0000, /* R2453 */ + 0x0000, /* R2454 */ + 0x0000, /* R2455 */ + 0x0000, /* R2456 */ + 0x0000, /* R2457 */ + 0x0000, /* R2458 */ + 0x0000, /* R2459 */ + 0x0000, /* R2460 */ + 0x0000, /* R2461 */ + 0x0000, /* R2462 */ + 0x0000, /* R2463 */ + 0x0000, /* R2464 */ + 0x0000, /* R2465 */ + 0x0000, /* R2466 */ + 0x0000, /* R2467 */ + 0x0000, /* R2468 */ + 0x0000, /* R2469 */ + 0x0000, /* R2470 */ + 0x0000, /* R2471 */ + 0x0000, /* R2472 */ + 0x0000, /* R2473 */ + 0x0000, /* R2474 */ + 0x0000, /* R2475 */ + 0x0000, /* R2476 */ + 0x0000, /* R2477 */ + 0x0000, /* R2478 */ + 0x0000, /* R2479 */ + 0x0000, /* R2480 */ + 0x0000, /* R2481 */ + 0x0000, /* R2482 */ + 0x0000, /* R2483 */ + 0x0000, /* R2484 */ + 0x0000, /* R2485 */ + 0x0000, /* R2486 */ + 0x0000, /* R2487 */ + 0x0000, /* R2488 */ + 0x0000, /* R2489 */ + 0x0000, /* R2490 */ + 0x0000, /* R2491 */ + 0x0000, /* R2492 */ + 0x0000, /* R2493 */ + 0x0000, /* R2494 */ + 0x0000, /* R2495 */ + 0x0000, /* R2496 */ + 0x0000, /* R2497 */ + 0x0000, /* R2498 */ + 0x0000, /* R2499 */ + 0x0000, /* R2500 */ + 0x0000, /* R2501 */ + 0x0000, /* R2502 */ + 0x0000, /* R2503 */ + 0x0000, /* R2504 */ + 0x0000, /* R2505 */ + 0x0000, /* R2506 */ + 0x0000, /* R2507 */ + 0x0000, /* R2508 */ + 0x0000, /* R2509 */ + 0x0000, /* R2510 */ + 0x0000, /* R2511 */ + 0x0000, /* R2512 */ + 0x0000, /* R2513 */ + 0x0000, /* R2514 */ + 0x0000, /* R2515 */ + 0x0000, /* R2516 */ + 0x0000, /* R2517 */ + 0x0000, /* R2518 */ + 0x0000, /* R2519 */ + 0x0000, /* R2520 */ + 0x0000, /* R2521 */ + 0x0000, /* R2522 */ + 0x0000, /* R2523 */ + 0x0000, /* R2524 */ + 0x0000, /* R2525 */ + 0x0000, /* R2526 */ + 0x0000, /* R2527 */ + 0x0000, /* R2528 */ + 0x0000, /* R2529 */ + 0x0000, /* R2530 */ + 0x0000, /* R2531 */ + 0x0000, /* R2532 */ + 0x0000, /* R2533 */ + 0x0000, /* R2534 */ + 0x0000, /* R2535 */ + 0x0000, /* R2536 */ + 0x0000, /* R2537 */ + 0x0000, /* R2538 */ + 0x0000, /* R2539 */ + 0x0000, /* R2540 */ + 0x0000, /* R2541 */ + 0x0000, /* R2542 */ + 0x0000, /* R2543 */ + 0x0000, /* R2544 */ + 0x0000, /* R2545 */ + 0x0000, /* R2546 */ + 0x0000, /* R2547 */ + 0x0000, /* R2548 */ + 0x0000, /* R2549 */ + 0x0000, /* R2550 */ + 0x0000, /* R2551 */ + 0x0000, /* R2552 */ + 0x0000, /* R2553 */ + 0x0000, /* R2554 */ + 0x0000, /* R2555 */ + 0x0000, /* R2556 */ + 0x0000, /* R2557 */ + 0x0000, /* R2558 */ + 0x0000, /* R2559 */ + 0x0000, /* R2560 */ + 0x0000, /* R2561 */ + 0x0000, /* R2562 */ + 0x0000, /* R2563 */ + 0x0000, /* R2564 */ + 0x0000, /* R2565 */ + 0x0000, /* R2566 */ + 0x0000, /* R2567 */ + 0x0000, /* R2568 */ + 0x0000, /* R2569 */ + 0x0000, /* R2570 */ + 0x0000, /* R2571 */ + 0x0000, /* R2572 */ + 0x0000, /* R2573 */ + 0x0000, /* R2574 */ + 0x0000, /* R2575 */ + 0x0000, /* R2576 */ + 0x0000, /* R2577 */ + 0x0000, /* R2578 */ + 0x0000, /* R2579 */ + 0x0000, /* R2580 */ + 0x0000, /* R2581 */ + 0x0000, /* R2582 */ + 0x0000, /* R2583 */ + 0x0000, /* R2584 */ + 0x0000, /* R2585 */ + 0x0000, /* R2586 */ + 0x0000, /* R2587 */ + 0x0000, /* R2588 */ + 0x0000, /* R2589 */ + 0x0000, /* R2590 */ + 0x0000, /* R2591 */ + 0x0000, /* R2592 */ + 0x0000, /* R2593 */ + 0x0000, /* R2594 */ + 0x0000, /* R2595 */ + 0x0000, /* R2596 */ + 0x0000, /* R2597 */ + 0x0000, /* R2598 */ + 0x0000, /* R2599 */ + 0x0000, /* R2600 */ + 0x0000, /* R2601 */ + 0x0000, /* R2602 */ + 0x0000, /* R2603 */ + 0x0000, /* R2604 */ + 0x0000, /* R2605 */ + 0x0000, /* R2606 */ + 0x0000, /* R2607 */ + 0x0000, /* R2608 */ + 0x0000, /* R2609 */ + 0x0000, /* R2610 */ + 0x0000, /* R2611 */ + 0x0000, /* R2612 */ + 0x0000, /* R2613 */ + 0x0000, /* R2614 */ + 0x0000, /* R2615 */ + 0x0000, /* R2616 */ + 0x0000, /* R2617 */ + 0x0000, /* R2618 */ + 0x0000, /* R2619 */ + 0x0000, /* R2620 */ + 0x0000, /* R2621 */ + 0x0000, /* R2622 */ + 0x0000, /* R2623 */ + 0x0000, /* R2624 */ + 0x0000, /* R2625 */ + 0x0000, /* R2626 */ + 0x0000, /* R2627 */ + 0x0000, /* R2628 */ + 0x0000, /* R2629 */ + 0x0000, /* R2630 */ + 0x0000, /* R2631 */ + 0x0000, /* R2632 */ + 0x0000, /* R2633 */ + 0x0000, /* R2634 */ + 0x0000, /* R2635 */ + 0x0000, /* R2636 */ + 0x0000, /* R2637 */ + 0x0000, /* R2638 */ + 0x0000, /* R2639 */ + 0x0000, /* R2640 */ + 0x0000, /* R2641 */ + 0x0000, /* R2642 */ + 0x0000, /* R2643 */ + 0x0000, /* R2644 */ + 0x0000, /* R2645 */ + 0x0000, /* R2646 */ + 0x0000, /* R2647 */ + 0x0000, /* R2648 */ + 0x0000, /* R2649 */ + 0x0000, /* R2650 */ + 0x0000, /* R2651 */ + 0x0000, /* R2652 */ + 0x0000, /* R2653 */ + 0x0000, /* R2654 */ + 0x0000, /* R2655 */ + 0x0000, /* R2656 */ + 0x0000, /* R2657 */ + 0x0000, /* R2658 */ + 0x0000, /* R2659 */ + 0x0000, /* R2660 */ + 0x0000, /* R2661 */ + 0x0000, /* R2662 */ + 0x0000, /* R2663 */ + 0x0000, /* R2664 */ + 0x0000, /* R2665 */ + 0x0000, /* R2666 */ + 0x0000, /* R2667 */ + 0x0000, /* R2668 */ + 0x0000, /* R2669 */ + 0x0000, /* R2670 */ + 0x0000, /* R2671 */ + 0x0000, /* R2672 */ + 0x0000, /* R2673 */ + 0x0000, /* R2674 */ + 0x0000, /* R2675 */ + 0x0000, /* R2676 */ + 0x0000, /* R2677 */ + 0x0000, /* R2678 */ + 0x0000, /* R2679 */ + 0x0000, /* R2680 */ + 0x0000, /* R2681 */ + 0x0000, /* R2682 */ + 0x0000, /* R2683 */ + 0x0000, /* R2684 */ + 0x0000, /* R2685 */ + 0x0000, /* R2686 */ + 0x0000, /* R2687 */ + 0x0000, /* R2688 */ + 0x0000, /* R2689 */ + 0x0000, /* R2690 */ + 0x0000, /* R2691 */ + 0x0000, /* R2692 */ + 0x0000, /* R2693 */ + 0x0000, /* R2694 */ + 0x0000, /* R2695 */ + 0x0000, /* R2696 */ + 0x0000, /* R2697 */ + 0x0000, /* R2698 */ + 0x0000, /* R2699 */ + 0x0000, /* R2700 */ + 0x0000, /* R2701 */ + 0x0000, /* R2702 */ + 0x0000, /* R2703 */ + 0x0000, /* R2704 */ + 0x0000, /* R2705 */ + 0x0000, /* R2706 */ + 0x0000, /* R2707 */ + 0x0000, /* R2708 */ + 0x0000, /* R2709 */ + 0x0000, /* R2710 */ + 0x0000, /* R2711 */ + 0x0000, /* R2712 */ + 0x0000, /* R2713 */ + 0x0000, /* R2714 */ + 0x0000, /* R2715 */ + 0x0000, /* R2716 */ + 0x0000, /* R2717 */ + 0x0000, /* R2718 */ + 0x0000, /* R2719 */ + 0x0000, /* R2720 */ + 0x0000, /* R2721 */ + 0x0000, /* R2722 */ + 0x0000, /* R2723 */ + 0x0000, /* R2724 */ + 0x0000, /* R2725 */ + 0x0000, /* R2726 */ + 0x0000, /* R2727 */ + 0x0000, /* R2728 */ + 0x0000, /* R2729 */ + 0x0000, /* R2730 */ + 0x0000, /* R2731 */ + 0x0000, /* R2732 */ + 0x0000, /* R2733 */ + 0x0000, /* R2734 */ + 0x0000, /* R2735 */ + 0x0000, /* R2736 */ + 0x0000, /* R2737 */ + 0x0000, /* R2738 */ + 0x0000, /* R2739 */ + 0x0000, /* R2740 */ + 0x0000, /* R2741 */ + 0x0000, /* R2742 */ + 0x0000, /* R2743 */ + 0x0000, /* R2744 */ + 0x0000, /* R2745 */ + 0x0000, /* R2746 */ + 0x0000, /* R2747 */ + 0x0000, /* R2748 */ + 0x0000, /* R2749 */ + 0x0000, /* R2750 */ + 0x0000, /* R2751 */ + 0x0000, /* R2752 */ + 0x0000, /* R2753 */ + 0x0000, /* R2754 */ + 0x0000, /* R2755 */ + 0x0000, /* R2756 */ + 0x0000, /* R2757 */ + 0x0000, /* R2758 */ + 0x0000, /* R2759 */ + 0x0000, /* R2760 */ + 0x0000, /* R2761 */ + 0x0000, /* R2762 */ + 0x0000, /* R2763 */ + 0x0000, /* R2764 */ + 0x0000, /* R2765 */ + 0x0000, /* R2766 */ + 0x0000, /* R2767 */ + 0x0000, /* R2768 */ + 0x0000, /* R2769 */ + 0x0000, /* R2770 */ + 0x0000, /* R2771 */ + 0x0000, /* R2772 */ + 0x0000, /* R2773 */ + 0x0000, /* R2774 */ + 0x0000, /* R2775 */ + 0x0000, /* R2776 */ + 0x0000, /* R2777 */ + 0x0000, /* R2778 */ + 0x0000, /* R2779 */ + 0x0000, /* R2780 */ + 0x0000, /* R2781 */ + 0x0000, /* R2782 */ + 0x0000, /* R2783 */ + 0x0000, /* R2784 */ + 0x0000, /* R2785 */ + 0x0000, /* R2786 */ + 0x0000, /* R2787 */ + 0x0000, /* R2788 */ + 0x0000, /* R2789 */ + 0x0000, /* R2790 */ + 0x0000, /* R2791 */ + 0x0000, /* R2792 */ + 0x0000, /* R2793 */ + 0x0000, /* R2794 */ + 0x0000, /* R2795 */ + 0x0000, /* R2796 */ + 0x0000, /* R2797 */ + 0x0000, /* R2798 */ + 0x0000, /* R2799 */ + 0x0000, /* R2800 */ + 0x0000, /* R2801 */ + 0x0000, /* R2802 */ + 0x0000, /* R2803 */ + 0x0000, /* R2804 */ + 0x0000, /* R2805 */ + 0x0000, /* R2806 */ + 0x0000, /* R2807 */ + 0x0000, /* R2808 */ + 0x0000, /* R2809 */ + 0x0000, /* R2810 */ + 0x0000, /* R2811 */ + 0x0000, /* R2812 */ + 0x0000, /* R2813 */ + 0x0000, /* R2814 */ + 0x0000, /* R2815 */ + 0x0000, /* R2816 */ + 0x0000, /* R2817 */ + 0x0000, /* R2818 */ + 0x0000, /* R2819 */ + 0x0000, /* R2820 */ + 0x0000, /* R2821 */ + 0x0000, /* R2822 */ + 0x0000, /* R2823 */ + 0x0000, /* R2824 */ + 0x0000, /* R2825 */ + 0x0000, /* R2826 */ + 0x0000, /* R2827 */ + 0x0000, /* R2828 */ + 0x0000, /* R2829 */ + 0x0000, /* R2830 */ + 0x0000, /* R2831 */ + 0x0000, /* R2832 */ + 0x0000, /* R2833 */ + 0x0000, /* R2834 */ + 0x0000, /* R2835 */ + 0x0000, /* R2836 */ + 0x0000, /* R2837 */ + 0x0000, /* R2838 */ + 0x0000, /* R2839 */ + 0x0000, /* R2840 */ + 0x0000, /* R2841 */ + 0x0000, /* R2842 */ + 0x0000, /* R2843 */ + 0x0000, /* R2844 */ + 0x0000, /* R2845 */ + 0x0000, /* R2846 */ + 0x0000, /* R2847 */ + 0x0000, /* R2848 */ + 0x0000, /* R2849 */ + 0x0000, /* R2850 */ + 0x0000, /* R2851 */ + 0x0000, /* R2852 */ + 0x0000, /* R2853 */ + 0x0000, /* R2854 */ + 0x0000, /* R2855 */ + 0x0000, /* R2856 */ + 0x0000, /* R2857 */ + 0x0000, /* R2858 */ + 0x0000, /* R2859 */ + 0x0000, /* R2860 */ + 0x0000, /* R2861 */ + 0x0000, /* R2862 */ + 0x0000, /* R2863 */ + 0x0000, /* R2864 */ + 0x0000, /* R2865 */ + 0x0000, /* R2866 */ + 0x0000, /* R2867 */ + 0x0000, /* R2868 */ + 0x0000, /* R2869 */ + 0x0000, /* R2870 */ + 0x0000, /* R2871 */ + 0x0000, /* R2872 */ + 0x0000, /* R2873 */ + 0x0000, /* R2874 */ + 0x0000, /* R2875 */ + 0x0000, /* R2876 */ + 0x0000, /* R2877 */ + 0x0000, /* R2878 */ + 0x0000, /* R2879 */ + 0x0000, /* R2880 */ + 0x0000, /* R2881 */ + 0x0000, /* R2882 */ + 0x0000, /* R2883 */ + 0x0000, /* R2884 */ + 0x0000, /* R2885 */ + 0x0000, /* R2886 */ + 0x0000, /* R2887 */ + 0x0000, /* R2888 */ + 0x0000, /* R2889 */ + 0x0000, /* R2890 */ + 0x0000, /* R2891 */ + 0x0000, /* R2892 */ + 0x0000, /* R2893 */ + 0x0000, /* R2894 */ + 0x0000, /* R2895 */ + 0x0000, /* R2896 */ + 0x0000, /* R2897 */ + 0x0000, /* R2898 */ + 0x0000, /* R2899 */ + 0x0000, /* R2900 */ + 0x0000, /* R2901 */ + 0x0000, /* R2902 */ + 0x0000, /* R2903 */ + 0x0000, /* R2904 */ + 0x0000, /* R2905 */ + 0x0000, /* R2906 */ + 0x0000, /* R2907 */ + 0x0000, /* R2908 */ + 0x0000, /* R2909 */ + 0x0000, /* R2910 */ + 0x0000, /* R2911 */ + 0x0000, /* R2912 */ + 0x0000, /* R2913 */ + 0x0000, /* R2914 */ + 0x0000, /* R2915 */ + 0x0000, /* R2916 */ + 0x0000, /* R2917 */ + 0x0000, /* R2918 */ + 0x0000, /* R2919 */ + 0x0000, /* R2920 */ + 0x0000, /* R2921 */ + 0x0000, /* R2922 */ + 0x0000, /* R2923 */ + 0x0000, /* R2924 */ + 0x0000, /* R2925 */ + 0x0000, /* R2926 */ + 0x0000, /* R2927 */ + 0x0000, /* R2928 */ + 0x0000, /* R2929 */ + 0x0000, /* R2930 */ + 0x0000, /* R2931 */ + 0x0000, /* R2932 */ + 0x0000, /* R2933 */ + 0x0000, /* R2934 */ + 0x0000, /* R2935 */ + 0x0000, /* R2936 */ + 0x0000, /* R2937 */ + 0x0000, /* R2938 */ + 0x0000, /* R2939 */ + 0x0000, /* R2940 */ + 0x0000, /* R2941 */ + 0x0000, /* R2942 */ + 0x0000, /* R2943 */ + 0x0000, /* R2944 */ + 0x0000, /* R2945 */ + 0x0000, /* R2946 */ + 0x0000, /* R2947 */ + 0x0000, /* R2948 */ + 0x0000, /* R2949 */ + 0x0000, /* R2950 */ + 0x0000, /* R2951 */ + 0x0000, /* R2952 */ + 0x0000, /* R2953 */ + 0x0000, /* R2954 */ + 0x0000, /* R2955 */ + 0x0000, /* R2956 */ + 0x0000, /* R2957 */ + 0x0000, /* R2958 */ + 0x0000, /* R2959 */ + 0x0000, /* R2960 */ + 0x0000, /* R2961 */ + 0x0000, /* R2962 */ + 0x0000, /* R2963 */ + 0x0000, /* R2964 */ + 0x0000, /* R2965 */ + 0x0000, /* R2966 */ + 0x0000, /* R2967 */ + 0x0000, /* R2968 */ + 0x0000, /* R2969 */ + 0x0000, /* R2970 */ + 0x0000, /* R2971 */ + 0x0000, /* R2972 */ + 0x0000, /* R2973 */ + 0x0000, /* R2974 */ + 0x0000, /* R2975 */ + 0x0000, /* R2976 */ + 0x0000, /* R2977 */ + 0x0000, /* R2978 */ + 0x0000, /* R2979 */ + 0x0000, /* R2980 */ + 0x0000, /* R2981 */ + 0x0000, /* R2982 */ + 0x0000, /* R2983 */ + 0x0000, /* R2984 */ + 0x0000, /* R2985 */ + 0x0000, /* R2986 */ + 0x0000, /* R2987 */ + 0x0000, /* R2988 */ + 0x0000, /* R2989 */ + 0x0000, /* R2990 */ + 0x0000, /* R2991 */ + 0x0000, /* R2992 */ + 0x0000, /* R2993 */ + 0x0000, /* R2994 */ + 0x0000, /* R2995 */ + 0x0000, /* R2996 */ + 0x0000, /* R2997 */ + 0x0000, /* R2998 */ + 0x0000, /* R2999 */ + 0x0000, /* R3000 */ + 0x0000, /* R3001 */ + 0x0000, /* R3002 */ + 0x0000, /* R3003 */ + 0x0000, /* R3004 */ + 0x0000, /* R3005 */ + 0x0000, /* R3006 */ + 0x0000, /* R3007 */ + 0x0000, /* R3008 */ + 0x0000, /* R3009 */ + 0x0000, /* R3010 */ + 0x0000, /* R3011 */ + 0x0000, /* R3012 */ + 0x0000, /* R3013 */ + 0x0000, /* R3014 */ + 0x0000, /* R3015 */ + 0x0000, /* R3016 */ + 0x0000, /* R3017 */ + 0x0000, /* R3018 */ + 0x0000, /* R3019 */ + 0x0000, /* R3020 */ + 0x0000, /* R3021 */ + 0x0000, /* R3022 */ + 0x0000, /* R3023 */ + 0x0000, /* R3024 */ + 0x0000, /* R3025 */ + 0x0000, /* R3026 */ + 0x0000, /* R3027 */ + 0x0000, /* R3028 */ + 0x0000, /* R3029 */ + 0x0000, /* R3030 */ + 0x0000, /* R3031 */ + 0x0000, /* R3032 */ + 0x0000, /* R3033 */ + 0x0000, /* R3034 */ + 0x0000, /* R3035 */ + 0x0000, /* R3036 */ + 0x0000, /* R3037 */ + 0x0000, /* R3038 */ + 0x0000, /* R3039 */ + 0x0000, /* R3040 */ + 0x0000, /* R3041 */ + 0x0000, /* R3042 */ + 0x0000, /* R3043 */ + 0x0000, /* R3044 */ + 0x0000, /* R3045 */ + 0x0000, /* R3046 */ + 0x0000, /* R3047 */ + 0x0000, /* R3048 */ + 0x0000, /* R3049 */ + 0x0000, /* R3050 */ + 0x0000, /* R3051 */ + 0x0000, /* R3052 */ + 0x0000, /* R3053 */ + 0x0000, /* R3054 */ + 0x0000, /* R3055 */ + 0x0000, /* R3056 */ + 0x0000, /* R3057 */ + 0x0000, /* R3058 */ + 0x0000, /* R3059 */ + 0x0000, /* R3060 */ + 0x0000, /* R3061 */ + 0x0000, /* R3062 */ + 0x0000, /* R3063 */ + 0x0000, /* R3064 */ + 0x0000, /* R3065 */ + 0x0000, /* R3066 */ + 0x0000, /* R3067 */ + 0x0000, /* R3068 */ + 0x0000, /* R3069 */ + 0x0000, /* R3070 */ + 0x0000, /* R3071 */ + 0x0000, /* R3072 */ + 0x0000, /* R3073 */ + 0x0000, /* R3074 */ + 0x0000, /* R3075 */ + 0x0000, /* R3076 */ + 0x0000, /* R3077 */ + 0x0000, /* R3078 */ + 0x0000, /* R3079 */ + 0x0000, /* R3080 */ + 0x0000, /* R3081 */ + 0x0000, /* R3082 */ + 0x0000, /* R3083 */ + 0x0000, /* R3084 */ + 0x0000, /* R3085 */ + 0x0000, /* R3086 */ + 0x0000, /* R3087 */ + 0x0000, /* R3088 */ + 0x0000, /* R3089 */ + 0x0000, /* R3090 */ + 0x0000, /* R3091 */ + 0x0000, /* R3092 */ + 0x0000, /* R3093 */ + 0x0000, /* R3094 */ + 0x0000, /* R3095 */ + 0x0000, /* R3096 */ + 0x0000, /* R3097 */ + 0x0000, /* R3098 */ + 0x0000, /* R3099 */ + 0x0000, /* R3100 */ + 0x0000, /* R3101 */ + 0x0000, /* R3102 */ + 0x0000, /* R3103 */ + 0x0000, /* R3104 */ + 0x0000, /* R3105 */ + 0x0000, /* R3106 */ + 0x0000, /* R3107 */ + 0x0000, /* R3108 */ + 0x0000, /* R3109 */ + 0x0000, /* R3110 */ + 0x0000, /* R3111 */ + 0x0000, /* R3112 */ + 0x0000, /* R3113 */ + 0x0000, /* R3114 */ + 0x0000, /* R3115 */ + 0x0000, /* R3116 */ + 0x0000, /* R3117 */ + 0x0000, /* R3118 */ + 0x0000, /* R3119 */ + 0x0000, /* R3120 */ + 0x0000, /* R3121 */ + 0x0000, /* R3122 */ + 0x0000, /* R3123 */ + 0x0000, /* R3124 */ + 0x0000, /* R3125 */ + 0x0000, /* R3126 */ + 0x0000, /* R3127 */ + 0x0000, /* R3128 */ + 0x0000, /* R3129 */ + 0x0000, /* R3130 */ + 0x0000, /* R3131 */ + 0x0000, /* R3132 */ + 0x0000, /* R3133 */ + 0x0000, /* R3134 */ + 0x0000, /* R3135 */ + 0x0000, /* R3136 */ + 0x0000, /* R3137 */ + 0x0000, /* R3138 */ + 0x0000, /* R3139 */ + 0x0000, /* R3140 */ + 0x0000, /* R3141 */ + 0x0000, /* R3142 */ + 0x0000, /* R3143 */ + 0x0000, /* R3144 */ + 0x0000, /* R3145 */ + 0x0000, /* R3146 */ + 0x0000, /* R3147 */ + 0x0000, /* R3148 */ + 0x0000, /* R3149 */ + 0x0000, /* R3150 */ + 0x0000, /* R3151 */ + 0x0000, /* R3152 */ + 0x0000, /* R3153 */ + 0x0000, /* R3154 */ + 0x0000, /* R3155 */ + 0x0000, /* R3156 */ + 0x0000, /* R3157 */ + 0x0000, /* R3158 */ + 0x0000, /* R3159 */ + 0x0000, /* R3160 */ + 0x0000, /* R3161 */ + 0x0000, /* R3162 */ + 0x0000, /* R3163 */ + 0x0000, /* R3164 */ + 0x0000, /* R3165 */ + 0x0000, /* R3166 */ + 0x0000, /* R3167 */ + 0x0000, /* R3168 */ + 0x0000, /* R3169 */ + 0x0000, /* R3170 */ + 0x0000, /* R3171 */ + 0x0000, /* R3172 */ + 0x0000, /* R3173 */ + 0x0000, /* R3174 */ + 0x0000, /* R3175 */ + 0x0000, /* R3176 */ + 0x0000, /* R3177 */ + 0x0000, /* R3178 */ + 0x0000, /* R3179 */ + 0x0000, /* R3180 */ + 0x0000, /* R3181 */ + 0x0000, /* R3182 */ + 0x0000, /* R3183 */ + 0x0000, /* R3184 */ + 0x0000, /* R3185 */ + 0x0000, /* R3186 */ + 0x0000, /* R3187 */ + 0x0000, /* R3188 */ + 0x0000, /* R3189 */ + 0x0000, /* R3190 */ + 0x0000, /* R3191 */ + 0x0000, /* R3192 */ + 0x0000, /* R3193 */ + 0x0000, /* R3194 */ + 0x0000, /* R3195 */ + 0x0000, /* R3196 */ + 0x0000, /* R3197 */ + 0x0000, /* R3198 */ + 0x0000, /* R3199 */ + 0x0000, /* R3200 */ + 0x0000, /* R3201 */ + 0x0000, /* R3202 */ + 0x0000, /* R3203 */ + 0x0000, /* R3204 */ + 0x0000, /* R3205 */ + 0x0000, /* R3206 */ + 0x0000, /* R3207 */ + 0x0000, /* R3208 */ + 0x0000, /* R3209 */ + 0x0000, /* R3210 */ + 0x0000, /* R3211 */ + 0x0000, /* R3212 */ + 0x0000, /* R3213 */ + 0x0000, /* R3214 */ + 0x0000, /* R3215 */ + 0x0000, /* R3216 */ + 0x0000, /* R3217 */ + 0x0000, /* R3218 */ + 0x0000, /* R3219 */ + 0x0000, /* R3220 */ + 0x0000, /* R3221 */ + 0x0000, /* R3222 */ + 0x0000, /* R3223 */ + 0x0000, /* R3224 */ + 0x0000, /* R3225 */ + 0x0000, /* R3226 */ + 0x0000, /* R3227 */ + 0x0000, /* R3228 */ + 0x0000, /* R3229 */ + 0x0000, /* R3230 */ + 0x0000, /* R3231 */ + 0x0000, /* R3232 */ + 0x0000, /* R3233 */ + 0x0000, /* R3234 */ + 0x0000, /* R3235 */ + 0x0000, /* R3236 */ + 0x0000, /* R3237 */ + 0x0000, /* R3238 */ + 0x0000, /* R3239 */ + 0x0000, /* R3240 */ + 0x0000, /* R3241 */ + 0x0000, /* R3242 */ + 0x0000, /* R3243 */ + 0x0000, /* R3244 */ + 0x0000, /* R3245 */ + 0x0000, /* R3246 */ + 0x0000, /* R3247 */ + 0x0000, /* R3248 */ + 0x0000, /* R3249 */ + 0x0000, /* R3250 */ + 0x0000, /* R3251 */ + 0x0000, /* R3252 */ + 0x0000, /* R3253 */ + 0x0000, /* R3254 */ + 0x0000, /* R3255 */ + 0x0000, /* R3256 */ + 0x0000, /* R3257 */ + 0x0000, /* R3258 */ + 0x0000, /* R3259 */ + 0x0000, /* R3260 */ + 0x0000, /* R3261 */ + 0x0000, /* R3262 */ + 0x0000, /* R3263 */ + 0x0000, /* R3264 */ + 0x0000, /* R3265 */ + 0x0000, /* R3266 */ + 0x0000, /* R3267 */ + 0x0000, /* R3268 */ + 0x0000, /* R3269 */ + 0x0000, /* R3270 */ + 0x0000, /* R3271 */ + 0x0000, /* R3272 */ + 0x0000, /* R3273 */ + 0x0000, /* R3274 */ + 0x0000, /* R3275 */ + 0x0000, /* R3276 */ + 0x0000, /* R3277 */ + 0x0000, /* R3278 */ + 0x0000, /* R3279 */ + 0x0000, /* R3280 */ + 0x0000, /* R3281 */ + 0x0000, /* R3282 */ + 0x0000, /* R3283 */ + 0x0000, /* R3284 */ + 0x0000, /* R3285 */ + 0x0000, /* R3286 */ + 0x0000, /* R3287 */ + 0x0000, /* R3288 */ + 0x0000, /* R3289 */ + 0x0000, /* R3290 */ + 0x0000, /* R3291 */ + 0x0000, /* R3292 */ + 0x0000, /* R3293 */ + 0x0000, /* R3294 */ + 0x0000, /* R3295 */ + 0x0000, /* R3296 */ + 0x0000, /* R3297 */ + 0x0000, /* R3298 */ + 0x0000, /* R3299 */ + 0x0000, /* R3300 */ + 0x0000, /* R3301 */ + 0x0000, /* R3302 */ + 0x0000, /* R3303 */ + 0x0000, /* R3304 */ + 0x0000, /* R3305 */ + 0x0000, /* R3306 */ + 0x0000, /* R3307 */ + 0x0000, /* R3308 */ + 0x0000, /* R3309 */ + 0x0000, /* R3310 */ + 0x0000, /* R3311 */ + 0x0000, /* R3312 */ + 0x0000, /* R3313 */ + 0x0000, /* R3314 */ + 0x0000, /* R3315 */ + 0x0000, /* R3316 */ + 0x0000, /* R3317 */ + 0x0000, /* R3318 */ + 0x0000, /* R3319 */ + 0x0000, /* R3320 */ + 0x0000, /* R3321 */ + 0x0000, /* R3322 */ + 0x0000, /* R3323 */ + 0x0000, /* R3324 */ + 0x0000, /* R3325 */ + 0x0000, /* R3326 */ + 0x0000, /* R3327 */ + 0x0000, /* R3328 */ + 0x0000, /* R3329 */ + 0x0000, /* R3330 */ + 0x0000, /* R3331 */ + 0x0000, /* R3332 */ + 0x0000, /* R3333 */ + 0x0000, /* R3334 */ + 0x0000, /* R3335 */ + 0x0000, /* R3336 */ + 0x0000, /* R3337 */ + 0x0000, /* R3338 */ + 0x0000, /* R3339 */ + 0x0000, /* R3340 */ + 0x0000, /* R3341 */ + 0x0000, /* R3342 */ + 0x0000, /* R3343 */ + 0x0000, /* R3344 */ + 0x0000, /* R3345 */ + 0x0000, /* R3346 */ + 0x0000, /* R3347 */ + 0x0000, /* R3348 */ + 0x0000, /* R3349 */ + 0x0000, /* R3350 */ + 0x0000, /* R3351 */ + 0x0000, /* R3352 */ + 0x0000, /* R3353 */ + 0x0000, /* R3354 */ + 0x0000, /* R3355 */ + 0x0000, /* R3356 */ + 0x0000, /* R3357 */ + 0x0000, /* R3358 */ + 0x0000, /* R3359 */ + 0x0000, /* R3360 */ + 0x0000, /* R3361 */ + 0x0000, /* R3362 */ + 0x0000, /* R3363 */ + 0x0000, /* R3364 */ + 0x0000, /* R3365 */ + 0x0000, /* R3366 */ + 0x0000, /* R3367 */ + 0x0000, /* R3368 */ + 0x0000, /* R3369 */ + 0x0000, /* R3370 */ + 0x0000, /* R3371 */ + 0x0000, /* R3372 */ + 0x0000, /* R3373 */ + 0x0000, /* R3374 */ + 0x0000, /* R3375 */ + 0x0000, /* R3376 */ + 0x0000, /* R3377 */ + 0x0000, /* R3378 */ + 0x0000, /* R3379 */ + 0x0000, /* R3380 */ + 0x0000, /* R3381 */ + 0x0000, /* R3382 */ + 0x0000, /* R3383 */ + 0x0000, /* R3384 */ + 0x0000, /* R3385 */ + 0x0000, /* R3386 */ + 0x0000, /* R3387 */ + 0x0000, /* R3388 */ + 0x0000, /* R3389 */ + 0x0000, /* R3390 */ + 0x0000, /* R3391 */ + 0x0000, /* R3392 */ + 0x0000, /* R3393 */ + 0x0000, /* R3394 */ + 0x0000, /* R3395 */ + 0x0000, /* R3396 */ + 0x0000, /* R3397 */ + 0x0000, /* R3398 */ + 0x0000, /* R3399 */ + 0x0000, /* R3400 */ + 0x0000, /* R3401 */ + 0x0000, /* R3402 */ + 0x0000, /* R3403 */ + 0x0000, /* R3404 */ + 0x0000, /* R3405 */ + 0x0000, /* R3406 */ + 0x0000, /* R3407 */ + 0x0000, /* R3408 */ + 0x0000, /* R3409 */ + 0x0000, /* R3410 */ + 0x0000, /* R3411 */ + 0x0000, /* R3412 */ + 0x0000, /* R3413 */ + 0x0000, /* R3414 */ + 0x0000, /* R3415 */ + 0x0000, /* R3416 */ + 0x0000, /* R3417 */ + 0x0000, /* R3418 */ + 0x0000, /* R3419 */ + 0x0000, /* R3420 */ + 0x0000, /* R3421 */ + 0x0000, /* R3422 */ + 0x0000, /* R3423 */ + 0x0000, /* R3424 */ + 0x0000, /* R3425 */ + 0x0000, /* R3426 */ + 0x0000, /* R3427 */ + 0x0000, /* R3428 */ + 0x0000, /* R3429 */ + 0x0000, /* R3430 */ + 0x0000, /* R3431 */ + 0x0000, /* R3432 */ + 0x0000, /* R3433 */ + 0x0000, /* R3434 */ + 0x0000, /* R3435 */ + 0x0000, /* R3436 */ + 0x0000, /* R3437 */ + 0x0000, /* R3438 */ + 0x0000, /* R3439 */ + 0x0000, /* R3440 */ + 0x0000, /* R3441 */ + 0x0000, /* R3442 */ + 0x0000, /* R3443 */ + 0x0000, /* R3444 */ + 0x0000, /* R3445 */ + 0x0000, /* R3446 */ + 0x0000, /* R3447 */ + 0x0000, /* R3448 */ + 0x0000, /* R3449 */ + 0x0000, /* R3450 */ + 0x0000, /* R3451 */ + 0x0000, /* R3452 */ + 0x0000, /* R3453 */ + 0x0000, /* R3454 */ + 0x0000, /* R3455 */ + 0x0000, /* R3456 */ + 0x0000, /* R3457 */ + 0x0000, /* R3458 */ + 0x0000, /* R3459 */ + 0x0000, /* R3460 */ + 0x0000, /* R3461 */ + 0x0000, /* R3462 */ + 0x0000, /* R3463 */ + 0x0000, /* R3464 */ + 0x0000, /* R3465 */ + 0x0000, /* R3466 */ + 0x0000, /* R3467 */ + 0x0000, /* R3468 */ + 0x0000, /* R3469 */ + 0x0000, /* R3470 */ + 0x0000, /* R3471 */ + 0x0000, /* R3472 */ + 0x0000, /* R3473 */ + 0x0000, /* R3474 */ + 0x0000, /* R3475 */ + 0x0000, /* R3476 */ + 0x0000, /* R3477 */ + 0x0000, /* R3478 */ + 0x0000, /* R3479 */ + 0x0000, /* R3480 */ + 0x0000, /* R3481 */ + 0x0000, /* R3482 */ + 0x0000, /* R3483 */ + 0x0000, /* R3484 */ + 0x0000, /* R3485 */ + 0x0000, /* R3486 */ + 0x0000, /* R3487 */ + 0x0000, /* R3488 */ + 0x0000, /* R3489 */ + 0x0000, /* R3490 */ + 0x0000, /* R3491 */ + 0x0000, /* R3492 */ + 0x0000, /* R3493 */ + 0x0000, /* R3494 */ + 0x0000, /* R3495 */ + 0x0000, /* R3496 */ + 0x0000, /* R3497 */ + 0x0000, /* R3498 */ + 0x0000, /* R3499 */ + 0x0000, /* R3500 */ + 0x0000, /* R3501 */ + 0x0000, /* R3502 */ + 0x0000, /* R3503 */ + 0x0000, /* R3504 */ + 0x0000, /* R3505 */ + 0x0000, /* R3506 */ + 0x0000, /* R3507 */ + 0x0000, /* R3508 */ + 0x0000, /* R3509 */ + 0x0000, /* R3510 */ + 0x0000, /* R3511 */ + 0x0000, /* R3512 */ + 0x0000, /* R3513 */ + 0x0000, /* R3514 */ + 0x0000, /* R3515 */ + 0x0000, /* R3516 */ + 0x0000, /* R3517 */ + 0x0000, /* R3518 */ + 0x0000, /* R3519 */ + 0x0000, /* R3520 */ + 0x0000, /* R3521 */ + 0x0000, /* R3522 */ + 0x0000, /* R3523 */ + 0x0000, /* R3524 */ + 0x0000, /* R3525 */ + 0x0000, /* R3526 */ + 0x0000, /* R3527 */ + 0x0000, /* R3528 */ + 0x0000, /* R3529 */ + 0x0000, /* R3530 */ + 0x0000, /* R3531 */ + 0x0000, /* R3532 */ + 0x0000, /* R3533 */ + 0x0000, /* R3534 */ + 0x0000, /* R3535 */ + 0x0000, /* R3536 */ + 0x0000, /* R3537 */ + 0x0000, /* R3538 */ + 0x0000, /* R3539 */ + 0x0000, /* R3540 */ + 0x0000, /* R3541 */ + 0x0000, /* R3542 */ + 0x0000, /* R3543 */ + 0x0000, /* R3544 */ + 0x0000, /* R3545 */ + 0x0000, /* R3546 */ + 0x0000, /* R3547 */ + 0x0000, /* R3548 */ + 0x0000, /* R3549 */ + 0x0000, /* R3550 */ + 0x0000, /* R3551 */ + 0x0000, /* R3552 */ + 0x0000, /* R3553 */ + 0x0000, /* R3554 */ + 0x0000, /* R3555 */ + 0x0000, /* R3556 */ + 0x0000, /* R3557 */ + 0x0000, /* R3558 */ + 0x0000, /* R3559 */ + 0x0000, /* R3560 */ + 0x0000, /* R3561 */ + 0x0000, /* R3562 */ + 0x0000, /* R3563 */ + 0x0000, /* R3564 */ + 0x0000, /* R3565 */ + 0x0000, /* R3566 */ + 0x0000, /* R3567 */ + 0x0000, /* R3568 */ + 0x0000, /* R3569 */ + 0x0000, /* R3570 */ + 0x0000, /* R3571 */ + 0x0000, /* R3572 */ + 0x0000, /* R3573 */ + 0x0000, /* R3574 */ + 0x0000, /* R3575 */ + 0x0000, /* R3576 */ + 0x0000, /* R3577 */ + 0x0000, /* R3578 */ + 0x0000, /* R3579 */ + 0x0000, /* R3580 */ + 0x0000, /* R3581 */ + 0x0000, /* R3582 */ + 0x0000, /* R3583 */ + 0x0000, /* R3584 */ + 0x0000, /* R3585 */ + 0x0000, /* R3586 */ + 0x0000, /* R3587 */ + 0x0000, /* R3588 */ + 0x0000, /* R3589 */ + 0x0000, /* R3590 */ + 0x0000, /* R3591 */ + 0x0000, /* R3592 */ + 0x0000, /* R3593 */ + 0x0000, /* R3594 */ + 0x0000, /* R3595 */ + 0x0000, /* R3596 */ + 0x0000, /* R3597 */ + 0x0000, /* R3598 */ + 0x0000, /* R3599 */ + 0x0000, /* R3600 */ + 0x0000, /* R3601 */ + 0x0000, /* R3602 */ + 0x0000, /* R3603 */ + 0x0000, /* R3604 */ + 0x0000, /* R3605 */ + 0x0000, /* R3606 */ + 0x0000, /* R3607 */ + 0x0000, /* R3608 */ + 0x0000, /* R3609 */ + 0x0000, /* R3610 */ + 0x0000, /* R3611 */ + 0x0000, /* R3612 */ + 0x0000, /* R3613 */ + 0x0000, /* R3614 */ + 0x0000, /* R3615 */ + 0x0000, /* R3616 */ + 0x0000, /* R3617 */ + 0x0000, /* R3618 */ + 0x0000, /* R3619 */ + 0x0000, /* R3620 */ + 0x0000, /* R3621 */ + 0x0000, /* R3622 */ + 0x0000, /* R3623 */ + 0x0000, /* R3624 */ + 0x0000, /* R3625 */ + 0x0000, /* R3626 */ + 0x0000, /* R3627 */ + 0x0000, /* R3628 */ + 0x0000, /* R3629 */ + 0x0000, /* R3630 */ + 0x0000, /* R3631 */ + 0x0000, /* R3632 */ + 0x0000, /* R3633 */ + 0x0000, /* R3634 */ + 0x0000, /* R3635 */ + 0x0000, /* R3636 */ + 0x0000, /* R3637 */ + 0x0000, /* R3638 */ + 0x0000, /* R3639 */ + 0x0000, /* R3640 */ + 0x0000, /* R3641 */ + 0x0000, /* R3642 */ + 0x0000, /* R3643 */ + 0x0000, /* R3644 */ + 0x0000, /* R3645 */ + 0x0000, /* R3646 */ + 0x0000, /* R3647 */ + 0x0000, /* R3648 */ + 0x0000, /* R3649 */ + 0x0000, /* R3650 */ + 0x0000, /* R3651 */ + 0x0000, /* R3652 */ + 0x0000, /* R3653 */ + 0x0000, /* R3654 */ + 0x0000, /* R3655 */ + 0x0000, /* R3656 */ + 0x0000, /* R3657 */ + 0x0000, /* R3658 */ + 0x0000, /* R3659 */ + 0x0000, /* R3660 */ + 0x0000, /* R3661 */ + 0x0000, /* R3662 */ + 0x0000, /* R3663 */ + 0x0000, /* R3664 */ + 0x0000, /* R3665 */ + 0x0000, /* R3666 */ + 0x0000, /* R3667 */ + 0x0000, /* R3668 */ + 0x0000, /* R3669 */ + 0x0000, /* R3670 */ + 0x0000, /* R3671 */ + 0x0000, /* R3672 */ + 0x0000, /* R3673 */ + 0x0000, /* R3674 */ + 0x0000, /* R3675 */ + 0x0000, /* R3676 */ + 0x0000, /* R3677 */ + 0x0000, /* R3678 */ + 0x0000, /* R3679 */ + 0x0000, /* R3680 */ + 0x0000, /* R3681 */ + 0x0000, /* R3682 */ + 0x0000, /* R3683 */ + 0x0000, /* R3684 */ + 0x0000, /* R3685 */ + 0x0000, /* R3686 */ + 0x0000, /* R3687 */ + 0x0000, /* R3688 */ + 0x0000, /* R3689 */ + 0x0000, /* R3690 */ + 0x0000, /* R3691 */ + 0x0000, /* R3692 */ + 0x0000, /* R3693 */ + 0x0000, /* R3694 */ + 0x0000, /* R3695 */ + 0x0000, /* R3696 */ + 0x0000, /* R3697 */ + 0x0000, /* R3698 */ + 0x0000, /* R3699 */ + 0x0000, /* R3700 */ + 0x0000, /* R3701 */ + 0x0000, /* R3702 */ + 0x0000, /* R3703 */ + 0x0000, /* R3704 */ + 0x0000, /* R3705 */ + 0x0000, /* R3706 */ + 0x0000, /* R3707 */ + 0x0000, /* R3708 */ + 0x0000, /* R3709 */ + 0x0000, /* R3710 */ + 0x0000, /* R3711 */ + 0x0000, /* R3712 */ + 0x0000, /* R3713 */ + 0x0000, /* R3714 */ + 0x0000, /* R3715 */ + 0x0000, /* R3716 */ + 0x0000, /* R3717 */ + 0x0000, /* R3718 */ + 0x0000, /* R3719 */ + 0x0000, /* R3720 */ + 0x0000, /* R3721 */ + 0x0000, /* R3722 */ + 0x0000, /* R3723 */ + 0x0000, /* R3724 */ + 0x0000, /* R3725 */ + 0x0000, /* R3726 */ + 0x0000, /* R3727 */ + 0x0000, /* R3728 */ + 0x0000, /* R3729 */ + 0x0000, /* R3730 */ + 0x0000, /* R3731 */ + 0x0000, /* R3732 */ + 0x0000, /* R3733 */ + 0x0000, /* R3734 */ + 0x0000, /* R3735 */ + 0x0000, /* R3736 */ + 0x0000, /* R3737 */ + 0x0000, /* R3738 */ + 0x0000, /* R3739 */ + 0x0000, /* R3740 */ + 0x0000, /* R3741 */ + 0x0000, /* R3742 */ + 0x0000, /* R3743 */ + 0x0000, /* R3744 */ + 0x0000, /* R3745 */ + 0x0000, /* R3746 */ + 0x0000, /* R3747 */ + 0x0000, /* R3748 */ + 0x0000, /* R3749 */ + 0x0000, /* R3750 */ + 0x0000, /* R3751 */ + 0x0000, /* R3752 */ + 0x0000, /* R3753 */ + 0x0000, /* R3754 */ + 0x0000, /* R3755 */ + 0x0000, /* R3756 */ + 0x0000, /* R3757 */ + 0x0000, /* R3758 */ + 0x0000, /* R3759 */ + 0x0000, /* R3760 */ + 0x0000, /* R3761 */ + 0x0000, /* R3762 */ + 0x0000, /* R3763 */ + 0x0000, /* R3764 */ + 0x0000, /* R3765 */ + 0x0000, /* R3766 */ + 0x0000, /* R3767 */ + 0x0000, /* R3768 */ + 0x0000, /* R3769 */ + 0x0000, /* R3770 */ + 0x0000, /* R3771 */ + 0x0000, /* R3772 */ + 0x0000, /* R3773 */ + 0x0000, /* R3774 */ + 0x0000, /* R3775 */ + 0x0000, /* R3776 */ + 0x0000, /* R3777 */ + 0x0000, /* R3778 */ + 0x0000, /* R3779 */ + 0x0000, /* R3780 */ + 0x0000, /* R3781 */ + 0x0000, /* R3782 */ + 0x0000, /* R3783 */ + 0x0000, /* R3784 */ + 0x0000, /* R3785 */ + 0x0000, /* R3786 */ + 0x0000, /* R3787 */ + 0x0000, /* R3788 */ + 0x0000, /* R3789 */ + 0x0000, /* R3790 */ + 0x0000, /* R3791 */ + 0x0000, /* R3792 */ + 0x0000, /* R3793 */ + 0x0000, /* R3794 */ + 0x0000, /* R3795 */ + 0x0000, /* R3796 */ + 0x0000, /* R3797 */ + 0x0000, /* R3798 */ + 0x0000, /* R3799 */ + 0x0000, /* R3800 */ + 0x0000, /* R3801 */ + 0x0000, /* R3802 */ + 0x0000, /* R3803 */ + 0x0000, /* R3804 */ + 0x0000, /* R3805 */ + 0x0000, /* R3806 */ + 0x0000, /* R3807 */ + 0x0000, /* R3808 */ + 0x0000, /* R3809 */ + 0x0000, /* R3810 */ + 0x0000, /* R3811 */ + 0x0000, /* R3812 */ + 0x0000, /* R3813 */ + 0x0000, /* R3814 */ + 0x0000, /* R3815 */ + 0x0000, /* R3816 */ + 0x0000, /* R3817 */ + 0x0000, /* R3818 */ + 0x0000, /* R3819 */ + 0x0000, /* R3820 */ + 0x0000, /* R3821 */ + 0x0000, /* R3822 */ + 0x0000, /* R3823 */ + 0x0000, /* R3824 */ + 0x0000, /* R3825 */ + 0x0000, /* R3826 */ + 0x0000, /* R3827 */ + 0x0000, /* R3828 */ + 0x0000, /* R3829 */ + 0x0000, /* R3830 */ + 0x0000, /* R3831 */ + 0x0000, /* R3832 */ + 0x0000, /* R3833 */ + 0x0000, /* R3834 */ + 0x0000, /* R3835 */ + 0x0000, /* R3836 */ + 0x0000, /* R3837 */ + 0x0000, /* R3838 */ + 0x0000, /* R3839 */ + 0x0000, /* R3840 */ + 0x0000, /* R3841 */ + 0x0000, /* R3842 */ + 0x0000, /* R3843 */ + 0x0000, /* R3844 */ + 0x0000, /* R3845 */ + 0x0000, /* R3846 */ + 0x0000, /* R3847 */ + 0x0000, /* R3848 */ + 0x0000, /* R3849 */ + 0x0000, /* R3850 */ + 0x0000, /* R3851 */ + 0x0000, /* R3852 */ + 0x0000, /* R3853 */ + 0x0000, /* R3854 */ + 0x0000, /* R3855 */ + 0x0000, /* R3856 */ + 0x0000, /* R3857 */ + 0x0000, /* R3858 */ + 0x0000, /* R3859 */ + 0x0000, /* R3860 */ + 0x0000, /* R3861 */ + 0x0000, /* R3862 */ + 0x0000, /* R3863 */ + 0x0000, /* R3864 */ + 0x0000, /* R3865 */ + 0x0000, /* R3866 */ + 0x0000, /* R3867 */ + 0x0000, /* R3868 */ + 0x0000, /* R3869 */ + 0x0000, /* R3870 */ + 0x0000, /* R3871 */ + 0x0000, /* R3872 */ + 0x0000, /* R3873 */ + 0x0000, /* R3874 */ + 0x0000, /* R3875 */ + 0x0000, /* R3876 */ + 0x0000, /* R3877 */ + 0x0000, /* R3878 */ + 0x0000, /* R3879 */ + 0x0000, /* R3880 */ + 0x0000, /* R3881 */ + 0x0000, /* R3882 */ + 0x0000, /* R3883 */ + 0x0000, /* R3884 */ + 0x0000, /* R3885 */ + 0x0000, /* R3886 */ + 0x0000, /* R3887 */ + 0x0000, /* R3888 */ + 0x0000, /* R3889 */ + 0x0000, /* R3890 */ + 0x0000, /* R3891 */ + 0x0000, /* R3892 */ + 0x0000, /* R3893 */ + 0x0000, /* R3894 */ + 0x0000, /* R3895 */ + 0x0000, /* R3896 */ + 0x0000, /* R3897 */ + 0x0000, /* R3898 */ + 0x0000, /* R3899 */ + 0x0000, /* R3900 */ + 0x0000, /* R3901 */ + 0x0000, /* R3902 */ + 0x0000, /* R3903 */ + 0x0000, /* R3904 */ + 0x0000, /* R3905 */ + 0x0000, /* R3906 */ + 0x0000, /* R3907 */ + 0x0000, /* R3908 */ + 0x0000, /* R3909 */ + 0x0000, /* R3910 */ + 0x0000, /* R3911 */ + 0x0000, /* R3912 */ + 0x0000, /* R3913 */ + 0x0000, /* R3914 */ + 0x0000, /* R3915 */ + 0x0000, /* R3916 */ + 0x0000, /* R3917 */ + 0x0000, /* R3918 */ + 0x0000, /* R3919 */ + 0x0000, /* R3920 */ + 0x0000, /* R3921 */ + 0x0000, /* R3922 */ + 0x0000, /* R3923 */ + 0x0000, /* R3924 */ + 0x0000, /* R3925 */ + 0x0000, /* R3926 */ + 0x0000, /* R3927 */ + 0x0000, /* R3928 */ + 0x0000, /* R3929 */ + 0x0000, /* R3930 */ + 0x0000, /* R3931 */ + 0x0000, /* R3932 */ + 0x0000, /* R3933 */ + 0x0000, /* R3934 */ + 0x0000, /* R3935 */ + 0x0000, /* R3936 */ + 0x0000, /* R3937 */ + 0x0000, /* R3938 */ + 0x0000, /* R3939 */ + 0x0000, /* R3940 */ + 0x0000, /* R3941 */ + 0x0000, /* R3942 */ + 0x0000, /* R3943 */ + 0x0000, /* R3944 */ + 0x0000, /* R3945 */ + 0x0000, /* R3946 */ + 0x0000, /* R3947 */ + 0x0000, /* R3948 */ + 0x0000, /* R3949 */ + 0x0000, /* R3950 */ + 0x0000, /* R3951 */ + 0x0000, /* R3952 */ + 0x0000, /* R3953 */ + 0x0000, /* R3954 */ + 0x0000, /* R3955 */ + 0x0000, /* R3956 */ + 0x0000, /* R3957 */ + 0x0000, /* R3958 */ + 0x0000, /* R3959 */ + 0x0000, /* R3960 */ + 0x0000, /* R3961 */ + 0x0000, /* R3962 */ + 0x0000, /* R3963 */ + 0x0000, /* R3964 */ + 0x0000, /* R3965 */ + 0x0000, /* R3966 */ + 0x0000, /* R3967 */ + 0x0000, /* R3968 */ + 0x0000, /* R3969 */ + 0x0000, /* R3970 */ + 0x0000, /* R3971 */ + 0x0000, /* R3972 */ + 0x0000, /* R3973 */ + 0x0000, /* R3974 */ + 0x0000, /* R3975 */ + 0x0000, /* R3976 */ + 0x0000, /* R3977 */ + 0x0000, /* R3978 */ + 0x0000, /* R3979 */ + 0x0000, /* R3980 */ + 0x0000, /* R3981 */ + 0x0000, /* R3982 */ + 0x0000, /* R3983 */ + 0x0000, /* R3984 */ + 0x0000, /* R3985 */ + 0x0000, /* R3986 */ + 0x0000, /* R3987 */ + 0x0000, /* R3988 */ + 0x0000, /* R3989 */ + 0x0000, /* R3990 */ + 0x0000, /* R3991 */ + 0x0000, /* R3992 */ + 0x0000, /* R3993 */ + 0x0000, /* R3994 */ + 0x0000, /* R3995 */ + 0x0000, /* R3996 */ + 0x0000, /* R3997 */ + 0x0000, /* R3998 */ + 0x0000, /* R3999 */ + 0x0000, /* R4000 */ + 0x0000, /* R4001 */ + 0x0000, /* R4002 */ + 0x0000, /* R4003 */ + 0x0000, /* R4004 */ + 0x0000, /* R4005 */ + 0x0000, /* R4006 */ + 0x0000, /* R4007 */ + 0x0000, /* R4008 */ + 0x0000, /* R4009 */ + 0x0000, /* R4010 */ + 0x0000, /* R4011 */ + 0x0000, /* R4012 */ + 0x0000, /* R4013 */ + 0x0000, /* R4014 */ + 0x0000, /* R4015 */ + 0x0000, /* R4016 */ + 0x0000, /* R4017 */ + 0x0000, /* R4018 */ + 0x0000, /* R4019 */ + 0x0000, /* R4020 */ + 0x0000, /* R4021 */ + 0x0000, /* R4022 */ + 0x0000, /* R4023 */ + 0x0000, /* R4024 */ + 0x0000, /* R4025 */ + 0x0000, /* R4026 */ + 0x0000, /* R4027 */ + 0x0000, /* R4028 */ + 0x0000, /* R4029 */ + 0x0000, /* R4030 */ + 0x0000, /* R4031 */ + 0x0000, /* R4032 */ + 0x0000, /* R4033 */ + 0x0000, /* R4034 */ + 0x0000, /* R4035 */ + 0x0000, /* R4036 */ + 0x0000, /* R4037 */ + 0x0000, /* R4038 */ + 0x0000, /* R4039 */ + 0x0000, /* R4040 */ + 0x0000, /* R4041 */ + 0x0000, /* R4042 */ + 0x0000, /* R4043 */ + 0x0000, /* R4044 */ + 0x0000, /* R4045 */ + 0x0000, /* R4046 */ + 0x0000, /* R4047 */ + 0x0000, /* R4048 */ + 0x0000, /* R4049 */ + 0x0000, /* R4050 */ + 0x0000, /* R4051 */ + 0x0000, /* R4052 */ + 0x0000, /* R4053 */ + 0x0000, /* R4054 */ + 0x0000, /* R4055 */ + 0x0000, /* R4056 */ + 0x0000, /* R4057 */ + 0x0000, /* R4058 */ + 0x0000, /* R4059 */ + 0x0000, /* R4060 */ + 0x0000, /* R4061 */ + 0x0000, /* R4062 */ + 0x0000, /* R4063 */ + 0x0000, /* R4064 */ + 0x0000, /* R4065 */ + 0x0000, /* R4066 */ + 0x0000, /* R4067 */ + 0x0000, /* R4068 */ + 0x0000, /* R4069 */ + 0x0000, /* R4070 */ + 0x0000, /* R4071 */ + 0x0000, /* R4072 */ + 0x0000, /* R4073 */ + 0x0000, /* R4074 */ + 0x0000, /* R4075 */ + 0x0000, /* R4076 */ + 0x0000, /* R4077 */ + 0x0000, /* R4078 */ + 0x0000, /* R4079 */ + 0x0000, /* R4080 */ + 0x0000, /* R4081 */ + 0x0000, /* R4082 */ + 0x0000, /* R4083 */ + 0x0000, /* R4084 */ + 0x0000, /* R4085 */ + 0x0000, /* R4086 */ + 0x0000, /* R4087 */ + 0x0000, /* R4088 */ + 0x0000, /* R4089 */ + 0x0000, /* R4090 */ + 0x0000, /* R4091 */ + 0x0000, /* R4092 */ + 0x0000, /* R4093 */ + 0x0000, /* R4094 */ + 0x0000, /* R4095 */ + 0x001C, /* R4096 - Write Sequencer 0 */ + 0x0003, /* R4097 - Write Sequencer 1 */ + 0x0103, /* R4098 - Write Sequencer 2 */ + 0x0000, /* R4099 - Write Sequencer 3 */ + 0x0019, /* R4100 - Write Sequencer 4 */ + 0x0007, /* R4101 - Write Sequencer 5 */ + 0x0206, /* R4102 - Write Sequencer 6 */ + 0x0000, /* R4103 - Write Sequencer 7 */ + 0x0048, /* R4104 - Write Sequencer 8 */ + 0x0001, /* R4105 - Write Sequencer 9 */ + 0x0000, /* R4106 - Write Sequencer 10 */ + 0x0006, /* R4107 - Write Sequencer 11 */ + 0x001A, /* R4108 - Write Sequencer 12 */ + 0x000F, /* R4109 - Write Sequencer 13 */ + 0x0305, /* R4110 - Write Sequencer 14 */ + 0x0000, /* R4111 - Write Sequencer 15 */ + 0x0045, /* R4112 - Write Sequencer 16 */ + 0x0011, /* R4113 - Write Sequencer 17 */ + 0x0400, /* R4114 - Write Sequencer 18 */ + 0x0000, /* R4115 - Write Sequencer 19 */ + 0x0045, /* R4116 - Write Sequencer 20 */ + 0x0019, /* R4117 - Write Sequencer 21 */ + 0x0401, /* R4118 - Write Sequencer 22 */ + 0x0000, /* R4119 - Write Sequencer 23 */ + 0x0002, /* R4120 - Write Sequencer 24 */ + 0x0030, /* R4121 - Write Sequencer 25 */ + 0x0600, /* R4122 - Write Sequencer 26 */ + 0x0000, /* R4123 - Write Sequencer 27 */ + 0x0003, /* R4124 - Write Sequencer 28 */ + 0x0030, /* R4125 - Write Sequencer 29 */ + 0x0600, /* R4126 - Write Sequencer 30 */ + 0x0000, /* R4127 - Write Sequencer 31 */ + 0x0003, /* R4128 - Write Sequencer 32 */ + 0x0001, /* R4129 - Write Sequencer 33 */ + 0x0008, /* R4130 - Write Sequencer 34 */ + 0x0000, /* R4131 - Write Sequencer 35 */ + 0x003D, /* R4132 - Write Sequencer 36 */ + 0x0033, /* R4133 - Write Sequencer 37 */ + 0x0502, /* R4134 - Write Sequencer 38 */ + 0x000A, /* R4135 - Write Sequencer 39 */ + 0x00FE, /* R4136 - Write Sequencer 40 */ + 0x0000, /* R4137 - Write Sequencer 41 */ + 0x0000, /* R4138 - Write Sequencer 42 */ + 0x0000, /* R4139 - Write Sequencer 43 */ + 0x0007, /* R4140 - Write Sequencer 44 */ + 0x0000, /* R4141 - Write Sequencer 45 */ + 0x0102, /* R4142 - Write Sequencer 46 */ + 0x0000, /* R4143 - Write Sequencer 47 */ + 0x0045, /* R4144 - Write Sequencer 48 */ + 0x001D, /* R4145 - Write Sequencer 49 */ + 0x0402, /* R4146 - Write Sequencer 50 */ + 0x0000, /* R4147 - Write Sequencer 51 */ + 0x0045, /* R4148 - Write Sequencer 52 */ + 0x001F, /* R4149 - Write Sequencer 53 */ + 0x0403, /* R4150 - Write Sequencer 54 */ + 0x0000, /* R4151 - Write Sequencer 55 */ + 0x00FE, /* R4152 - Write Sequencer 56 */ + 0x0000, /* R4153 - Write Sequencer 57 */ + 0x0000, /* R4154 - Write Sequencer 58 */ + 0x0000, /* R4155 - Write Sequencer 59 */ + 0x0005, /* R4156 - Write Sequencer 60 */ + 0x0000, /* R4157 - Write Sequencer 61 */ + 0x0003, /* R4158 - Write Sequencer 62 */ + 0x0107, /* R4159 - Write Sequencer 63 */ + 0x00FE, /* R4160 - Write Sequencer 64 */ + 0x0000, /* R4161 - Write Sequencer 65 */ + 0x0000, /* R4162 - Write Sequencer 66 */ + 0x0000, /* R4163 - Write Sequencer 67 */ + 0x00FE, /* R4164 - Write Sequencer 68 */ + 0x0000, /* R4165 - Write Sequencer 69 */ + 0x0000, /* R4166 - Write Sequencer 70 */ + 0x0000, /* R4167 - Write Sequencer 71 */ + 0x0020, /* R4168 - Write Sequencer 72 */ + 0x0007, /* R4169 - Write Sequencer 73 */ + 0x0203, /* R4170 - Write Sequencer 74 */ + 0x0000, /* R4171 - Write Sequencer 75 */ + 0x0021, /* R4172 - Write Sequencer 76 */ + 0x0007, /* R4173 - Write Sequencer 77 */ + 0x0203, /* R4174 - Write Sequencer 78 */ + 0x0000, /* R4175 - Write Sequencer 79 */ + 0x0019, /* R4176 - Write Sequencer 80 */ + 0x0019, /* R4177 - Write Sequencer 81 */ + 0x0401, /* R4178 - Write Sequencer 82 */ + 0x0000, /* R4179 - Write Sequencer 83 */ + 0x003C, /* R4180 - Write Sequencer 84 */ + 0x0033, /* R4181 - Write Sequencer 85 */ + 0x0502, /* R4182 - Write Sequencer 86 */ + 0x000A, /* R4183 - Write Sequencer 87 */ + 0x00FE, /* R4184 - Write Sequencer 88 */ + 0x0000, /* R4185 - Write Sequencer 89 */ + 0x0000, /* R4186 - Write Sequencer 90 */ + 0x0000, /* R4187 - Write Sequencer 91 */ + 0x0019, /* R4188 - Write Sequencer 92 */ + 0x0003, /* R4189 - Write Sequencer 93 */ + 0x0102, /* R4190 - Write Sequencer 94 */ + 0x0000, /* R4191 - Write Sequencer 95 */ + 0x0020, /* R4192 - Write Sequencer 96 */ + 0x0000, /* R4193 - Write Sequencer 97 */ + 0x0203, /* R4194 - Write Sequencer 98 */ + 0x0000, /* R4195 - Write Sequencer 99 */ + 0x0021, /* R4196 - Write Sequencer 100 */ + 0x0000, /* R4197 - Write Sequencer 101 */ + 0x0203, /* R4198 - Write Sequencer 102 */ + 0x0100, /* R4199 - Write Sequencer 103 */ + 0x00FE, /* R4200 - Write Sequencer 104 */ + 0x0000, /* R4201 - Write Sequencer 105 */ + 0x0000, /* R4202 - Write Sequencer 106 */ + 0x0000, /* R4203 - Write Sequencer 107 */ + 0x0005, /* R4204 - Write Sequencer 108 */ + 0x0001, /* R4205 - Write Sequencer 109 */ + 0x0003, /* R4206 - Write Sequencer 110 */ + 0x0008, /* R4207 - Write Sequencer 111 */ + 0x0000, /* R4208 - Write Sequencer 112 */ + 0x0001, /* R4209 - Write Sequencer 113 */ + 0x0007, /* R4210 - Write Sequencer 114 */ + 0x0000, /* R4211 - Write Sequencer 115 */ + 0x0001, /* R4212 - Write Sequencer 116 */ + 0x0003, /* R4213 - Write Sequencer 117 */ + 0x0107, /* R4214 - Write Sequencer 118 */ + 0x0000, /* R4215 - Write Sequencer 119 */ + 0x0045, /* R4216 - Write Sequencer 120 */ + 0x000E, /* R4217 - Write Sequencer 121 */ + 0x0403, /* R4218 - Write Sequencer 122 */ + 0x0000, /* R4219 - Write Sequencer 123 */ + 0x0060, /* R4220 - Write Sequencer 124 */ + 0x000E, /* R4221 - Write Sequencer 125 */ + 0x0403, /* R4222 - Write Sequencer 126 */ + 0x0000, /* R4223 - Write Sequencer 127 */ + 0x0002, /* R4224 - Write Sequencer 128 */ + 0x0000, /* R4225 - Write Sequencer 129 */ + 0x0600, /* R4226 - Write Sequencer 130 */ + 0x0000, /* R4227 - Write Sequencer 131 */ + 0x0003, /* R4228 - Write Sequencer 132 */ + 0x0000, /* R4229 - Write Sequencer 133 */ + 0x0600, /* R4230 - Write Sequencer 134 */ + 0x0000, /* R4231 - Write Sequencer 135 */ + 0x0003, /* R4232 - Write Sequencer 136 */ + 0x0001, /* R4233 - Write Sequencer 137 */ + 0x0008, /* R4234 - Write Sequencer 138 */ + 0x0000, /* R4235 - Write Sequencer 139 */ + 0x0028, /* R4236 - Write Sequencer 140 */ + 0x0000, /* R4237 - Write Sequencer 141 */ + 0x0600, /* R4238 - Write Sequencer 142 */ + 0x0000, /* R4239 - Write Sequencer 143 */ + 0x0029, /* R4240 - Write Sequencer 144 */ + 0x0000, /* R4241 - Write Sequencer 145 */ + 0x0600, /* R4242 - Write Sequencer 146 */ + 0x0000, /* R4243 - Write Sequencer 147 */ + 0x0029, /* R4244 - Write Sequencer 148 */ + 0x0001, /* R4245 - Write Sequencer 149 */ + 0x0008, /* R4246 - Write Sequencer 150 */ + 0x0000, /* R4247 - Write Sequencer 151 */ + 0x003C, /* R4248 - Write Sequencer 152 */ + 0x0000, /* R4249 - Write Sequencer 153 */ + 0x0403, /* R4250 - Write Sequencer 154 */ + 0x0000, /* R4251 - Write Sequencer 155 */ + 0x003D, /* R4252 - Write Sequencer 156 */ + 0x0000, /* R4253 - Write Sequencer 157 */ + 0x0403, /* R4254 - Write Sequencer 158 */ + 0x0000, /* R4255 - Write Sequencer 159 */ + 0x003E, /* R4256 - Write Sequencer 160 */ + 0x0000, /* R4257 - Write Sequencer 161 */ + 0x0403, /* R4258 - Write Sequencer 162 */ + 0x0000, /* R4259 - Write Sequencer 163 */ + 0x0045, /* R4260 - Write Sequencer 164 */ + 0x0000, /* R4261 - Write Sequencer 165 */ + 0x0700, /* R4262 - Write Sequencer 166 */ + 0x0000, /* R4263 - Write Sequencer 167 */ + 0x0060, /* R4264 - Write Sequencer 168 */ + 0x0000, /* R4265 - Write Sequencer 169 */ + 0x0700, /* R4266 - Write Sequencer 170 */ + 0x0000, /* R4267 - Write Sequencer 171 */ + 0x0031, /* R4268 - Write Sequencer 172 */ + 0x0000, /* R4269 - Write Sequencer 173 */ + 0x0106, /* R4270 - Write Sequencer 174 */ + 0x0000, /* R4271 - Write Sequencer 175 */ + 0x0063, /* R4272 - Write Sequencer 176 */ + 0x0000, /* R4273 - Write Sequencer 177 */ + 0x0300, /* R4274 - Write Sequencer 178 */ + 0x0000, /* R4275 - Write Sequencer 179 */ + 0x001A, /* R4276 - Write Sequencer 180 */ + 0x0000, /* R4277 - Write Sequencer 181 */ + 0x0503, /* R4278 - Write Sequencer 182 */ + 0x0000, /* R4279 - Write Sequencer 183 */ + 0x0048, /* R4280 - Write Sequencer 184 */ + 0x0000, /* R4281 - Write Sequencer 185 */ + 0x0000, /* R4282 - Write Sequencer 186 */ + 0x0000, /* R4283 - Write Sequencer 187 */ + 0x0019, /* R4284 - Write Sequencer 188 */ + 0x0000, /* R4285 - Write Sequencer 189 */ + 0x0501, /* R4286 - Write Sequencer 190 */ + 0x0000, /* R4287 - Write Sequencer 191 */ + 0x001C, /* R4288 - Write Sequencer 192 */ + 0x0000, /* R4289 - Write Sequencer 193 */ + 0x0103, /* R4290 - Write Sequencer 194 */ + 0x0000, /* R4291 - Write Sequencer 195 */ + 0x0019, /* R4292 - Write Sequencer 196 */ + 0x0000, /* R4293 - Write Sequencer 197 */ + 0x0107, /* R4294 - Write Sequencer 198 */ + 0x0100, /* R4295 - Write Sequencer 199 */ + 0x00FE, /* R4296 - Write Sequencer 200 */ + 0x0000, /* R4297 - Write Sequencer 201 */ + 0x0000, /* R4298 - Write Sequencer 202 */ + 0x0000, /* R4299 - Write Sequencer 203 */ + 0x00FE, /* R4300 - Write Sequencer 204 */ + 0x0000, /* R4301 - Write Sequencer 205 */ + 0x0000, /* R4302 - Write Sequencer 206 */ + 0x0000, /* R4303 - Write Sequencer 207 */ + 0x001C, /* R4304 - Write Sequencer 208 */ + 0x0003, /* R4305 - Write Sequencer 209 */ + 0x0103, /* R4306 - Write Sequencer 210 */ + 0x0000, /* R4307 - Write Sequencer 211 */ + 0x0019, /* R4308 - Write Sequencer 212 */ + 0x0007, /* R4309 - Write Sequencer 213 */ + 0x0206, /* R4310 - Write Sequencer 214 */ + 0x0000, /* R4311 - Write Sequencer 215 */ + 0x0048, /* R4312 - Write Sequencer 216 */ + 0x0001, /* R4313 - Write Sequencer 217 */ + 0x0000, /* R4314 - Write Sequencer 218 */ + 0x0006, /* R4315 - Write Sequencer 219 */ + 0x001A, /* R4316 - Write Sequencer 220 */ + 0x000F, /* R4317 - Write Sequencer 221 */ + 0x0305, /* R4318 - Write Sequencer 222 */ + 0x0000, /* R4319 - Write Sequencer 223 */ + 0x0045, /* R4320 - Write Sequencer 224 */ + 0x0011, /* R4321 - Write Sequencer 225 */ + 0x0400, /* R4322 - Write Sequencer 226 */ + 0x0000, /* R4323 - Write Sequencer 227 */ + 0x0045, /* R4324 - Write Sequencer 228 */ + 0x0019, /* R4325 - Write Sequencer 229 */ + 0x0401, /* R4326 - Write Sequencer 230 */ + 0x0000, /* R4327 - Write Sequencer 231 */ + 0x0060, /* R4328 - Write Sequencer 232 */ + 0x0011, /* R4329 - Write Sequencer 233 */ + 0x0400, /* R4330 - Write Sequencer 234 */ + 0x0000, /* R4331 - Write Sequencer 235 */ + 0x0060, /* R4332 - Write Sequencer 236 */ + 0x0019, /* R4333 - Write Sequencer 237 */ + 0x0401, /* R4334 - Write Sequencer 238 */ + 0x0000, /* R4335 - Write Sequencer 239 */ + 0x0002, /* R4336 - Write Sequencer 240 */ + 0x0030, /* R4337 - Write Sequencer 241 */ + 0x0600, /* R4338 - Write Sequencer 242 */ + 0x0000, /* R4339 - Write Sequencer 243 */ + 0x0003, /* R4340 - Write Sequencer 244 */ + 0x0030, /* R4341 - Write Sequencer 245 */ + 0x0600, /* R4342 - Write Sequencer 246 */ + 0x0000, /* R4343 - Write Sequencer 247 */ + 0x0003, /* R4344 - Write Sequencer 248 */ + 0x0001, /* R4345 - Write Sequencer 249 */ + 0x0008, /* R4346 - Write Sequencer 250 */ + 0x0000, /* R4347 - Write Sequencer 251 */ + 0x003D, /* R4348 - Write Sequencer 252 */ + 0x0033, /* R4349 - Write Sequencer 253 */ + 0x0502, /* R4350 - Write Sequencer 254 */ + 0x000A, /* R4351 - Write Sequencer 255 */ + 0x003E, /* R4352 - Write Sequencer 256 */ + 0x0033, /* R4353 - Write Sequencer 257 */ + 0x0502, /* R4354 - Write Sequencer 258 */ + 0x000A, /* R4355 - Write Sequencer 259 */ + 0x0007, /* R4356 - Write Sequencer 260 */ + 0x0000, /* R4357 - Write Sequencer 261 */ + 0x0102, /* R4358 - Write Sequencer 262 */ + 0x0000, /* R4359 - Write Sequencer 263 */ + 0x0045, /* R4360 - Write Sequencer 264 */ + 0x001D, /* R4361 - Write Sequencer 265 */ + 0x0402, /* R4362 - Write Sequencer 266 */ + 0x0000, /* R4363 - Write Sequencer 267 */ + 0x0045, /* R4364 - Write Sequencer 268 */ + 0x001F, /* R4365 - Write Sequencer 269 */ + 0x0403, /* R4366 - Write Sequencer 270 */ + 0x0000, /* R4367 - Write Sequencer 271 */ + 0x0060, /* R4368 - Write Sequencer 272 */ + 0x001D, /* R4369 - Write Sequencer 273 */ + 0x0402, /* R4370 - Write Sequencer 274 */ + 0x0000, /* R4371 - Write Sequencer 275 */ + 0x0060, /* R4372 - Write Sequencer 276 */ + 0x001F, /* R4373 - Write Sequencer 277 */ + 0x0403, /* R4374 - Write Sequencer 278 */ + 0x0000, /* R4375 - Write Sequencer 279 */ + 0x0005, /* R4376 - Write Sequencer 280 */ + 0x0000, /* R4377 - Write Sequencer 281 */ + 0x0003, /* R4378 - Write Sequencer 282 */ + 0x0108, /* R4379 - Write Sequencer 283 */ + 0x00FE, /* R4380 - Write Sequencer 284 */ + 0x0000, /* R4381 - Write Sequencer 285 */ + 0x0000, /* R4382 - Write Sequencer 286 */ + 0x0000, /* R4383 - Write Sequencer 287 */ + 0x0045, /* R4384 - Write Sequencer 288 */ + 0x000E, /* R4385 - Write Sequencer 289 */ + 0x0403, /* R4386 - Write Sequencer 290 */ + 0x0000, /* R4387 - Write Sequencer 291 */ + 0x001A, /* R4388 - Write Sequencer 292 */ + 0x0003, /* R4389 - Write Sequencer 293 */ + 0x0100, /* R4390 - Write Sequencer 294 */ + 0x0000, /* R4391 - Write Sequencer 295 */ + 0x0002, /* R4392 - Write Sequencer 296 */ + 0x0001, /* R4393 - Write Sequencer 297 */ + 0x0008, /* R4394 - Write Sequencer 298 */ + 0x0000, /* R4395 - Write Sequencer 299 */ + 0x0045, /* R4396 - Write Sequencer 300 */ + 0x0000, /* R4397 - Write Sequencer 301 */ + 0x0700, /* R4398 - Write Sequencer 302 */ + 0x0000, /* R4399 - Write Sequencer 303 */ + 0x0060, /* R4400 - Write Sequencer 304 */ + 0x0011, /* R4401 - Write Sequencer 305 */ + 0x0400, /* R4402 - Write Sequencer 306 */ + 0x0000, /* R4403 - Write Sequencer 307 */ + 0x0060, /* R4404 - Write Sequencer 308 */ + 0x0019, /* R4405 - Write Sequencer 309 */ + 0x0401, /* R4406 - Write Sequencer 310 */ + 0x0000, /* R4407 - Write Sequencer 311 */ + 0x001A, /* R4408 - Write Sequencer 312 */ + 0x0000, /* R4409 - Write Sequencer 313 */ + 0x0100, /* R4410 - Write Sequencer 314 */ + 0x0000, /* R4411 - Write Sequencer 315 */ + 0x0002, /* R4412 - Write Sequencer 316 */ + 0x0001, /* R4413 - Write Sequencer 317 */ + 0x0008, /* R4414 - Write Sequencer 318 */ + 0x0000, /* R4415 - Write Sequencer 319 */ + 0x0060, /* R4416 - Write Sequencer 320 */ + 0x001D, /* R4417 - Write Sequencer 321 */ + 0x0402, /* R4418 - Write Sequencer 322 */ + 0x0000, /* R4419 - Write Sequencer 323 */ + 0x0060, /* R4420 - Write Sequencer 324 */ + 0x001F, /* R4421 - Write Sequencer 325 */ + 0x0403, /* R4422 - Write Sequencer 326 */ + 0x0000, /* R4423 - Write Sequencer 327 */ + 0x0005, /* R4424 - Write Sequencer 328 */ + 0x0000, /* R4425 - Write Sequencer 329 */ + 0x0003, /* R4426 - Write Sequencer 330 */ + 0x0100, /* R4427 - Write Sequencer 331 */ + 0x00FE, /* R4428 - Write Sequencer 332 */ + 0x0000, /* R4429 - Write Sequencer 333 */ + 0x0000, /* R4430 - Write Sequencer 334 */ + 0x0000, /* R4431 - Write Sequencer 335 */ + 0x0060, /* R4432 - Write Sequencer 336 */ + 0x000E, /* R4433 - Write Sequencer 337 */ + 0x0403, /* R4434 - Write Sequencer 338 */ + 0x0000, /* R4435 - Write Sequencer 339 */ + 0x001A, /* R4436 - Write Sequencer 340 */ + 0x0003, /* R4437 - Write Sequencer 341 */ + 0x0100, /* R4438 - Write Sequencer 342 */ + 0x0000, /* R4439 - Write Sequencer 343 */ + 0x0002, /* R4440 - Write Sequencer 344 */ + 0x0001, /* R4441 - Write Sequencer 345 */ + 0x0008, /* R4442 - Write Sequencer 346 */ + 0x0000, /* R4443 - Write Sequencer 347 */ + 0x0060, /* R4444 - Write Sequencer 348 */ + 0x0000, /* R4445 - Write Sequencer 349 */ + 0x0700, /* R4446 - Write Sequencer 350 */ + 0x0000, /* R4447 - Write Sequencer 351 */ + 0x0045, /* R4448 - Write Sequencer 352 */ + 0x0011, /* R4449 - Write Sequencer 353 */ + 0x0400, /* R4450 - Write Sequencer 354 */ + 0x0000, /* R4451 - Write Sequencer 355 */ + 0x0045, /* R4452 - Write Sequencer 356 */ + 0x0019, /* R4453 - Write Sequencer 357 */ + 0x0401, /* R4454 - Write Sequencer 358 */ + 0x0000, /* R4455 - Write Sequencer 359 */ + 0x001A, /* R4456 - Write Sequencer 360 */ + 0x0000, /* R4457 - Write Sequencer 361 */ + 0x0100, /* R4458 - Write Sequencer 362 */ + 0x0000, /* R4459 - Write Sequencer 363 */ + 0x0002, /* R4460 - Write Sequencer 364 */ + 0x0001, /* R4461 - Write Sequencer 365 */ + 0x0008, /* R4462 - Write Sequencer 366 */ + 0x0000, /* R4463 - Write Sequencer 367 */ + 0x0045, /* R4464 - Write Sequencer 368 */ + 0x001D, /* R4465 - Write Sequencer 369 */ + 0x0402, /* R4466 - Write Sequencer 370 */ + 0x0000, /* R4467 - Write Sequencer 371 */ + 0x0045, /* R4468 - Write Sequencer 372 */ + 0x001F, /* R4469 - Write Sequencer 373 */ + 0x0403, /* R4470 - Write Sequencer 374 */ + 0x0000, /* R4471 - Write Sequencer 375 */ + 0x0005, /* R4472 - Write Sequencer 376 */ + 0x0000, /* R4473 - Write Sequencer 377 */ + 0x0003, /* R4474 - Write Sequencer 378 */ + 0x0100, /* R4475 - Write Sequencer 379 */ + 0x00FE, /* R4476 - Write Sequencer 380 */ + 0x0000, /* R4477 - Write Sequencer 381 */ + 0x0000, /* R4478 - Write Sequencer 382 */ + 0x0000, /* R4479 - Write Sequencer 383 */ + 0x00FE, /* R4480 - Write Sequencer 384 */ + 0x0000, /* R4481 - Write Sequencer 385 */ + 0x0000, /* R4482 - Write Sequencer 386 */ + 0x0000, /* R4483 - Write Sequencer 387 */ + 0x00FE, /* R4484 - Write Sequencer 388 */ + 0x0000, /* R4485 - Write Sequencer 389 */ + 0x0000, /* R4486 - Write Sequencer 390 */ + 0x0000, /* R4487 - Write Sequencer 391 */ + 0x00FE, /* R4488 - Write Sequencer 392 */ + 0x0000, /* R4489 - Write Sequencer 393 */ + 0x0000, /* R4490 - Write Sequencer 394 */ + 0x0000, /* R4491 - Write Sequencer 395 */ + 0x00FE, /* R4492 - Write Sequencer 396 */ + 0x0000, /* R4493 - Write Sequencer 397 */ + 0x0000, /* R4494 - Write Sequencer 398 */ + 0x0000, /* R4495 - Write Sequencer 399 */ + 0x0031, /* R4496 - Write Sequencer 400 */ + 0x0001, /* R4497 - Write Sequencer 401 */ + 0x0004, /* R4498 - Write Sequencer 402 */ + 0x0000, /* R4499 - Write Sequencer 403 */ + 0x0031, /* R4500 - Write Sequencer 404 */ + 0x0007, /* R4501 - Write Sequencer 405 */ + 0x0200, /* R4502 - Write Sequencer 406 */ + 0x0000, /* R4503 - Write Sequencer 407 */ + 0x0031, /* R4504 - Write Sequencer 408 */ + 0x0000, /* R4505 - Write Sequencer 409 */ + 0x0106, /* R4506 - Write Sequencer 410 */ + 0x0100, /* R4507 - Write Sequencer 411 */ + 0x00FE, /* R4508 - Write Sequencer 412 */ + 0x0000, /* R4509 - Write Sequencer 413 */ + 0x0000, /* R4510 - Write Sequencer 414 */ + 0x0000, /* R4511 - Write Sequencer 415 */ + 0x0031, /* R4512 - Write Sequencer 416 */ + 0x0003, /* R4513 - Write Sequencer 417 */ + 0x0106, /* R4514 - Write Sequencer 418 */ + 0x0000, /* R4515 - Write Sequencer 419 */ + 0x0031, /* R4516 - Write Sequencer 420 */ + 0x0004, /* R4517 - Write Sequencer 421 */ + 0x0200, /* R4518 - Write Sequencer 422 */ + 0x0000, /* R4519 - Write Sequencer 423 */ + 0x0031, /* R4520 - Write Sequencer 424 */ + 0x0000, /* R4521 - Write Sequencer 425 */ + 0x0004, /* R4522 - Write Sequencer 426 */ + 0x0100, /* R4523 - Write Sequencer 427 */ + 0x0000, /* R4524 - Write Sequencer 428 */ + 0x0000, /* R4525 - Write Sequencer 429 */ + 0x0000, /* R4526 - Write Sequencer 430 */ + 0x0000, /* R4527 - Write Sequencer 431 */ + 0x0000, /* R4528 - Write Sequencer 432 */ + 0x0000, /* R4529 - Write Sequencer 433 */ + 0x0000, /* R4530 - Write Sequencer 434 */ + 0x0000, /* R4531 - Write Sequencer 435 */ + 0x0000, /* R4532 - Write Sequencer 436 */ + 0x0000, /* R4533 - Write Sequencer 437 */ + 0x0000, /* R4534 - Write Sequencer 438 */ + 0x0000, /* R4535 - Write Sequencer 439 */ + 0x0000, /* R4536 - Write Sequencer 440 */ + 0x0000, /* R4537 - Write Sequencer 441 */ + 0x0000, /* R4538 - Write Sequencer 442 */ + 0x0000, /* R4539 - Write Sequencer 443 */ + 0x0000, /* R4540 - Write Sequencer 444 */ + 0x0000, /* R4541 - Write Sequencer 445 */ + 0x0000, /* R4542 - Write Sequencer 446 */ + 0x0000, /* R4543 - Write Sequencer 447 */ + 0x0000, /* R4544 - Write Sequencer 448 */ + 0x0000, /* R4545 - Write Sequencer 449 */ + 0x0000, /* R4546 - Write Sequencer 450 */ + 0x0000, /* R4547 - Write Sequencer 451 */ + 0x0000, /* R4548 - Write Sequencer 452 */ + 0x0000, /* R4549 - Write Sequencer 453 */ + 0x0000, /* R4550 - Write Sequencer 454 */ + 0x0000, /* R4551 - Write Sequencer 455 */ + 0x0000, /* R4552 - Write Sequencer 456 */ + 0x0000, /* R4553 - Write Sequencer 457 */ + 0x0000, /* R4554 - Write Sequencer 458 */ + 0x0000, /* R4555 - Write Sequencer 459 */ + 0x0000, /* R4556 - Write Sequencer 460 */ + 0x0000, /* R4557 - Write Sequencer 461 */ + 0x0000, /* R4558 - Write Sequencer 462 */ + 0x0000, /* R4559 - Write Sequencer 463 */ + 0x0000, /* R4560 - Write Sequencer 464 */ + 0x0000, /* R4561 - Write Sequencer 465 */ + 0x0000, /* R4562 - Write Sequencer 466 */ + 0x0000, /* R4563 - Write Sequencer 467 */ + 0x0000, /* R4564 - Write Sequencer 468 */ + 0x0000, /* R4565 - Write Sequencer 469 */ + 0x0000, /* R4566 - Write Sequencer 470 */ + 0x0000, /* R4567 - Write Sequencer 471 */ + 0x0000, /* R4568 - Write Sequencer 472 */ + 0x0000, /* R4569 - Write Sequencer 473 */ + 0x0000, /* R4570 - Write Sequencer 474 */ + 0x0000, /* R4571 - Write Sequencer 475 */ + 0x0000, /* R4572 - Write Sequencer 476 */ + 0x0000, /* R4573 - Write Sequencer 477 */ + 0x0000, /* R4574 - Write Sequencer 478 */ + 0x0000, /* R4575 - Write Sequencer 479 */ + 0x0000, /* R4576 - Write Sequencer 480 */ + 0x0000, /* R4577 - Write Sequencer 481 */ + 0x0000, /* R4578 - Write Sequencer 482 */ + 0x0000, /* R4579 - Write Sequencer 483 */ + 0x0000, /* R4580 - Write Sequencer 484 */ + 0x0000, /* R4581 - Write Sequencer 485 */ + 0x0000, /* R4582 - Write Sequencer 486 */ + 0x0000, /* R4583 - Write Sequencer 487 */ + 0x0000, /* R4584 - Write Sequencer 488 */ + 0x0000, /* R4585 - Write Sequencer 489 */ + 0x0000, /* R4586 - Write Sequencer 490 */ + 0x0000, /* R4587 - Write Sequencer 491 */ + 0x0000, /* R4588 - Write Sequencer 492 */ + 0x0000, /* R4589 - Write Sequencer 493 */ + 0x0000, /* R4590 - Write Sequencer 494 */ + 0x0000, /* R4591 - Write Sequencer 495 */ + 0x0000, /* R4592 - Write Sequencer 496 */ + 0x0000, /* R4593 - Write Sequencer 497 */ + 0x0000, /* R4594 - Write Sequencer 498 */ + 0x0000, /* R4595 - Write Sequencer 499 */ + 0x0000, /* R4596 - Write Sequencer 500 */ + 0x0000, /* R4597 - Write Sequencer 501 */ + 0x0000, /* R4598 - Write Sequencer 502 */ + 0x0000, /* R4599 - Write Sequencer 503 */ + 0x0000, /* R4600 - Write Sequencer 504 */ + 0x0000, /* R4601 - Write Sequencer 505 */ + 0x0000, /* R4602 - Write Sequencer 506 */ + 0x0000, /* R4603 - Write Sequencer 507 */ + 0x0000, /* R4604 - Write Sequencer 508 */ + 0x0000, /* R4605 - Write Sequencer 509 */ + 0x0000, /* R4606 - Write Sequencer 510 */ + 0x0000, /* R4607 - Write Sequencer 511 */ + 0x0000, /* R4608 */ + 0x0000, /* R4609 */ + 0x0000, /* R4610 */ + 0x0000, /* R4611 */ + 0x0000, /* R4612 */ + 0x0000, /* R4613 */ + 0x0000, /* R4614 */ + 0x0000, /* R4615 */ + 0x0000, /* R4616 */ + 0x0000, /* R4617 */ + 0x0000, /* R4618 */ + 0x0000, /* R4619 */ + 0x0000, /* R4620 */ + 0x0000, /* R4621 */ + 0x0000, /* R4622 */ + 0x0000, /* R4623 */ + 0x0000, /* R4624 */ + 0x0000, /* R4625 */ + 0x0000, /* R4626 */ + 0x0000, /* R4627 */ + 0x0000, /* R4628 */ + 0x0000, /* R4629 */ + 0x0000, /* R4630 */ + 0x0000, /* R4631 */ + 0x0000, /* R4632 */ + 0x0000, /* R4633 */ + 0x0000, /* R4634 */ + 0x0000, /* R4635 */ + 0x0000, /* R4636 */ + 0x0000, /* R4637 */ + 0x0000, /* R4638 */ + 0x0000, /* R4639 */ + 0x0000, /* R4640 */ + 0x0000, /* R4641 */ + 0x0000, /* R4642 */ + 0x0000, /* R4643 */ + 0x0000, /* R4644 */ + 0x0000, /* R4645 */ + 0x0000, /* R4646 */ + 0x0000, /* R4647 */ + 0x0000, /* R4648 */ + 0x0000, /* R4649 */ + 0x0000, /* R4650 */ + 0x0000, /* R4651 */ + 0x0000, /* R4652 */ + 0x0000, /* R4653 */ + 0x0000, /* R4654 */ + 0x0000, /* R4655 */ + 0x0000, /* R4656 */ + 0x0000, /* R4657 */ + 0x0000, /* R4658 */ + 0x0000, /* R4659 */ + 0x0000, /* R4660 */ + 0x0000, /* R4661 */ + 0x0000, /* R4662 */ + 0x0000, /* R4663 */ + 0x0000, /* R4664 */ + 0x0000, /* R4665 */ + 0x0000, /* R4666 */ + 0x0000, /* R4667 */ + 0x0000, /* R4668 */ + 0x0000, /* R4669 */ + 0x0000, /* R4670 */ + 0x0000, /* R4671 */ + 0x0000, /* R4672 */ + 0x0000, /* R4673 */ + 0x0000, /* R4674 */ + 0x0000, /* R4675 */ + 0x0000, /* R4676 */ + 0x0000, /* R4677 */ + 0x0000, /* R4678 */ + 0x0000, /* R4679 */ + 0x0000, /* R4680 */ + 0x0000, /* R4681 */ + 0x0000, /* R4682 */ + 0x0000, /* R4683 */ + 0x0000, /* R4684 */ + 0x0000, /* R4685 */ + 0x0000, /* R4686 */ + 0x0000, /* R4687 */ + 0x0000, /* R4688 */ + 0x0000, /* R4689 */ + 0x0000, /* R4690 */ + 0x0000, /* R4691 */ + 0x0000, /* R4692 */ + 0x0000, /* R4693 */ + 0x0000, /* R4694 */ + 0x0000, /* R4695 */ + 0x0000, /* R4696 */ + 0x0000, /* R4697 */ + 0x0000, /* R4698 */ + 0x0000, /* R4699 */ + 0x0000, /* R4700 */ + 0x0000, /* R4701 */ + 0x0000, /* R4702 */ + 0x0000, /* R4703 */ + 0x0000, /* R4704 */ + 0x0000, /* R4705 */ + 0x0000, /* R4706 */ + 0x0000, /* R4707 */ + 0x0000, /* R4708 */ + 0x0000, /* R4709 */ + 0x0000, /* R4710 */ + 0x0000, /* R4711 */ + 0x0000, /* R4712 */ + 0x0000, /* R4713 */ + 0x0000, /* R4714 */ + 0x0000, /* R4715 */ + 0x0000, /* R4716 */ + 0x0000, /* R4717 */ + 0x0000, /* R4718 */ + 0x0000, /* R4719 */ + 0x0000, /* R4720 */ + 0x0000, /* R4721 */ + 0x0000, /* R4722 */ + 0x0000, /* R4723 */ + 0x0000, /* R4724 */ + 0x0000, /* R4725 */ + 0x0000, /* R4726 */ + 0x0000, /* R4727 */ + 0x0000, /* R4728 */ + 0x0000, /* R4729 */ + 0x0000, /* R4730 */ + 0x0000, /* R4731 */ + 0x0000, /* R4732 */ + 0x0000, /* R4733 */ + 0x0000, /* R4734 */ + 0x0000, /* R4735 */ + 0x0000, /* R4736 */ + 0x0000, /* R4737 */ + 0x0000, /* R4738 */ + 0x0000, /* R4739 */ + 0x0000, /* R4740 */ + 0x0000, /* R4741 */ + 0x0000, /* R4742 */ + 0x0000, /* R4743 */ + 0x0000, /* R4744 */ + 0x0000, /* R4745 */ + 0x0000, /* R4746 */ + 0x0000, /* R4747 */ + 0x0000, /* R4748 */ + 0x0000, /* R4749 */ + 0x0000, /* R4750 */ + 0x0000, /* R4751 */ + 0x0000, /* R4752 */ + 0x0000, /* R4753 */ + 0x0000, /* R4754 */ + 0x0000, /* R4755 */ + 0x0000, /* R4756 */ + 0x0000, /* R4757 */ + 0x0000, /* R4758 */ + 0x0000, /* R4759 */ + 0x0000, /* R4760 */ + 0x0000, /* R4761 */ + 0x0000, /* R4762 */ + 0x0000, /* R4763 */ + 0x0000, /* R4764 */ + 0x0000, /* R4765 */ + 0x0000, /* R4766 */ + 0x0000, /* R4767 */ + 0x0000, /* R4768 */ + 0x0000, /* R4769 */ + 0x0000, /* R4770 */ + 0x0000, /* R4771 */ + 0x0000, /* R4772 */ + 0x0000, /* R4773 */ + 0x0000, /* R4774 */ + 0x0000, /* R4775 */ + 0x0000, /* R4776 */ + 0x0000, /* R4777 */ + 0x0000, /* R4778 */ + 0x0000, /* R4779 */ + 0x0000, /* R4780 */ + 0x0000, /* R4781 */ + 0x0000, /* R4782 */ + 0x0000, /* R4783 */ + 0x0000, /* R4784 */ + 0x0000, /* R4785 */ + 0x0000, /* R4786 */ + 0x0000, /* R4787 */ + 0x0000, /* R4788 */ + 0x0000, /* R4789 */ + 0x0000, /* R4790 */ + 0x0000, /* R4791 */ + 0x0000, /* R4792 */ + 0x0000, /* R4793 */ + 0x0000, /* R4794 */ + 0x0000, /* R4795 */ + 0x0000, /* R4796 */ + 0x0000, /* R4797 */ + 0x0000, /* R4798 */ + 0x0000, /* R4799 */ + 0x0000, /* R4800 */ + 0x0000, /* R4801 */ + 0x0000, /* R4802 */ + 0x0000, /* R4803 */ + 0x0000, /* R4804 */ + 0x0000, /* R4805 */ + 0x0000, /* R4806 */ + 0x0000, /* R4807 */ + 0x0000, /* R4808 */ + 0x0000, /* R4809 */ + 0x0000, /* R4810 */ + 0x0000, /* R4811 */ + 0x0000, /* R4812 */ + 0x0000, /* R4813 */ + 0x0000, /* R4814 */ + 0x0000, /* R4815 */ + 0x0000, /* R4816 */ + 0x0000, /* R4817 */ + 0x0000, /* R4818 */ + 0x0000, /* R4819 */ + 0x0000, /* R4820 */ + 0x0000, /* R4821 */ + 0x0000, /* R4822 */ + 0x0000, /* R4823 */ + 0x0000, /* R4824 */ + 0x0000, /* R4825 */ + 0x0000, /* R4826 */ + 0x0000, /* R4827 */ + 0x0000, /* R4828 */ + 0x0000, /* R4829 */ + 0x0000, /* R4830 */ + 0x0000, /* R4831 */ + 0x0000, /* R4832 */ + 0x0000, /* R4833 */ + 0x0000, /* R4834 */ + 0x0000, /* R4835 */ + 0x0000, /* R4836 */ + 0x0000, /* R4837 */ + 0x0000, /* R4838 */ + 0x0000, /* R4839 */ + 0x0000, /* R4840 */ + 0x0000, /* R4841 */ + 0x0000, /* R4842 */ + 0x0000, /* R4843 */ + 0x0000, /* R4844 */ + 0x0000, /* R4845 */ + 0x0000, /* R4846 */ + 0x0000, /* R4847 */ + 0x0000, /* R4848 */ + 0x0000, /* R4849 */ + 0x0000, /* R4850 */ + 0x0000, /* R4851 */ + 0x0000, /* R4852 */ + 0x0000, /* R4853 */ + 0x0000, /* R4854 */ + 0x0000, /* R4855 */ + 0x0000, /* R4856 */ + 0x0000, /* R4857 */ + 0x0000, /* R4858 */ + 0x0000, /* R4859 */ + 0x0000, /* R4860 */ + 0x0000, /* R4861 */ + 0x0000, /* R4862 */ + 0x0000, /* R4863 */ + 0x0000, /* R4864 */ + 0x0000, /* R4865 */ + 0x0000, /* R4866 */ + 0x0000, /* R4867 */ + 0x0000, /* R4868 */ + 0x0000, /* R4869 */ + 0x0000, /* R4870 */ + 0x0000, /* R4871 */ + 0x0000, /* R4872 */ + 0x0000, /* R4873 */ + 0x0000, /* R4874 */ + 0x0000, /* R4875 */ + 0x0000, /* R4876 */ + 0x0000, /* R4877 */ + 0x0000, /* R4878 */ + 0x0000, /* R4879 */ + 0x0000, /* R4880 */ + 0x0000, /* R4881 */ + 0x0000, /* R4882 */ + 0x0000, /* R4883 */ + 0x0000, /* R4884 */ + 0x0000, /* R4885 */ + 0x0000, /* R4886 */ + 0x0000, /* R4887 */ + 0x0000, /* R4888 */ + 0x0000, /* R4889 */ + 0x0000, /* R4890 */ + 0x0000, /* R4891 */ + 0x0000, /* R4892 */ + 0x0000, /* R4893 */ + 0x0000, /* R4894 */ + 0x0000, /* R4895 */ + 0x0000, /* R4896 */ + 0x0000, /* R4897 */ + 0x0000, /* R4898 */ + 0x0000, /* R4899 */ + 0x0000, /* R4900 */ + 0x0000, /* R4901 */ + 0x0000, /* R4902 */ + 0x0000, /* R4903 */ + 0x0000, /* R4904 */ + 0x0000, /* R4905 */ + 0x0000, /* R4906 */ + 0x0000, /* R4907 */ + 0x0000, /* R4908 */ + 0x0000, /* R4909 */ + 0x0000, /* R4910 */ + 0x0000, /* R4911 */ + 0x0000, /* R4912 */ + 0x0000, /* R4913 */ + 0x0000, /* R4914 */ + 0x0000, /* R4915 */ + 0x0000, /* R4916 */ + 0x0000, /* R4917 */ + 0x0000, /* R4918 */ + 0x0000, /* R4919 */ + 0x0000, /* R4920 */ + 0x0000, /* R4921 */ + 0x0000, /* R4922 */ + 0x0000, /* R4923 */ + 0x0000, /* R4924 */ + 0x0000, /* R4925 */ + 0x0000, /* R4926 */ + 0x0000, /* R4927 */ + 0x0000, /* R4928 */ + 0x0000, /* R4929 */ + 0x0000, /* R4930 */ + 0x0000, /* R4931 */ + 0x0000, /* R4932 */ + 0x0000, /* R4933 */ + 0x0000, /* R4934 */ + 0x0000, /* R4935 */ + 0x0000, /* R4936 */ + 0x0000, /* R4937 */ + 0x0000, /* R4938 */ + 0x0000, /* R4939 */ + 0x0000, /* R4940 */ + 0x0000, /* R4941 */ + 0x0000, /* R4942 */ + 0x0000, /* R4943 */ + 0x0000, /* R4944 */ + 0x0000, /* R4945 */ + 0x0000, /* R4946 */ + 0x0000, /* R4947 */ + 0x0000, /* R4948 */ + 0x0000, /* R4949 */ + 0x0000, /* R4950 */ + 0x0000, /* R4951 */ + 0x0000, /* R4952 */ + 0x0000, /* R4953 */ + 0x0000, /* R4954 */ + 0x0000, /* R4955 */ + 0x0000, /* R4956 */ + 0x0000, /* R4957 */ + 0x0000, /* R4958 */ + 0x0000, /* R4959 */ + 0x0000, /* R4960 */ + 0x0000, /* R4961 */ + 0x0000, /* R4962 */ + 0x0000, /* R4963 */ + 0x0000, /* R4964 */ + 0x0000, /* R4965 */ + 0x0000, /* R4966 */ + 0x0000, /* R4967 */ + 0x0000, /* R4968 */ + 0x0000, /* R4969 */ + 0x0000, /* R4970 */ + 0x0000, /* R4971 */ + 0x0000, /* R4972 */ + 0x0000, /* R4973 */ + 0x0000, /* R4974 */ + 0x0000, /* R4975 */ + 0x0000, /* R4976 */ + 0x0000, /* R4977 */ + 0x0000, /* R4978 */ + 0x0000, /* R4979 */ + 0x0000, /* R4980 */ + 0x0000, /* R4981 */ + 0x0000, /* R4982 */ + 0x0000, /* R4983 */ + 0x0000, /* R4984 */ + 0x0000, /* R4985 */ + 0x0000, /* R4986 */ + 0x0000, /* R4987 */ + 0x0000, /* R4988 */ + 0x0000, /* R4989 */ + 0x0000, /* R4990 */ + 0x0000, /* R4991 */ + 0x0000, /* R4992 */ + 0x0000, /* R4993 */ + 0x0000, /* R4994 */ + 0x0000, /* R4995 */ + 0x0000, /* R4996 */ + 0x0000, /* R4997 */ + 0x0000, /* R4998 */ + 0x0000, /* R4999 */ + 0x0000, /* R5000 */ + 0x0000, /* R5001 */ + 0x0000, /* R5002 */ + 0x0000, /* R5003 */ + 0x0000, /* R5004 */ + 0x0000, /* R5005 */ + 0x0000, /* R5006 */ + 0x0000, /* R5007 */ + 0x0000, /* R5008 */ + 0x0000, /* R5009 */ + 0x0000, /* R5010 */ + 0x0000, /* R5011 */ + 0x0000, /* R5012 */ + 0x0000, /* R5013 */ + 0x0000, /* R5014 */ + 0x0000, /* R5015 */ + 0x0000, /* R5016 */ + 0x0000, /* R5017 */ + 0x0000, /* R5018 */ + 0x0000, /* R5019 */ + 0x0000, /* R5020 */ + 0x0000, /* R5021 */ + 0x0000, /* R5022 */ + 0x0000, /* R5023 */ + 0x0000, /* R5024 */ + 0x0000, /* R5025 */ + 0x0000, /* R5026 */ + 0x0000, /* R5027 */ + 0x0000, /* R5028 */ + 0x0000, /* R5029 */ + 0x0000, /* R5030 */ + 0x0000, /* R5031 */ + 0x0000, /* R5032 */ + 0x0000, /* R5033 */ + 0x0000, /* R5034 */ + 0x0000, /* R5035 */ + 0x0000, /* R5036 */ + 0x0000, /* R5037 */ + 0x0000, /* R5038 */ + 0x0000, /* R5039 */ + 0x0000, /* R5040 */ + 0x0000, /* R5041 */ + 0x0000, /* R5042 */ + 0x0000, /* R5043 */ + 0x0000, /* R5044 */ + 0x0000, /* R5045 */ + 0x0000, /* R5046 */ + 0x0000, /* R5047 */ + 0x0000, /* R5048 */ + 0x0000, /* R5049 */ + 0x0000, /* R5050 */ + 0x0000, /* R5051 */ + 0x0000, /* R5052 */ + 0x0000, /* R5053 */ + 0x0000, /* R5054 */ + 0x0000, /* R5055 */ + 0x0000, /* R5056 */ + 0x0000, /* R5057 */ + 0x0000, /* R5058 */ + 0x0000, /* R5059 */ + 0x0000, /* R5060 */ + 0x0000, /* R5061 */ + 0x0000, /* R5062 */ + 0x0000, /* R5063 */ + 0x0000, /* R5064 */ + 0x0000, /* R5065 */ + 0x0000, /* R5066 */ + 0x0000, /* R5067 */ + 0x0000, /* R5068 */ + 0x0000, /* R5069 */ + 0x0000, /* R5070 */ + 0x0000, /* R5071 */ + 0x0000, /* R5072 */ + 0x0000, /* R5073 */ + 0x0000, /* R5074 */ + 0x0000, /* R5075 */ + 0x0000, /* R5076 */ + 0x0000, /* R5077 */ + 0x0000, /* R5078 */ + 0x0000, /* R5079 */ + 0x0000, /* R5080 */ + 0x0000, /* R5081 */ + 0x0000, /* R5082 */ + 0x0000, /* R5083 */ + 0x0000, /* R5084 */ + 0x0000, /* R5085 */ + 0x0000, /* R5086 */ + 0x0000, /* R5087 */ + 0x0000, /* R5088 */ + 0x0000, /* R5089 */ + 0x0000, /* R5090 */ + 0x0000, /* R5091 */ + 0x0000, /* R5092 */ + 0x0000, /* R5093 */ + 0x0000, /* R5094 */ + 0x0000, /* R5095 */ + 0x0000, /* R5096 */ + 0x0000, /* R5097 */ + 0x0000, /* R5098 */ + 0x0000, /* R5099 */ + 0x0000, /* R5100 */ + 0x0000, /* R5101 */ + 0x0000, /* R5102 */ + 0x0000, /* R5103 */ + 0x0000, /* R5104 */ + 0x0000, /* R5105 */ + 0x0000, /* R5106 */ + 0x0000, /* R5107 */ + 0x0000, /* R5108 */ + 0x0000, /* R5109 */ + 0x0000, /* R5110 */ + 0x0000, /* R5111 */ + 0x0000, /* R5112 */ + 0x0000, /* R5113 */ + 0x0000, /* R5114 */ + 0x0000, /* R5115 */ + 0x0000, /* R5116 */ + 0x0000, /* R5117 */ + 0x0000, /* R5118 */ + 0x0000, /* R5119 */ + 0x0000, /* R5120 */ + 0x0000, /* R5121 */ + 0x0000, /* R5122 */ + 0x0000, /* R5123 */ + 0x0000, /* R5124 */ + 0x0000, /* R5125 */ + 0x0000, /* R5126 */ + 0x0000, /* R5127 */ + 0x0000, /* R5128 */ + 0x0000, /* R5129 */ + 0x0000, /* R5130 */ + 0x0000, /* R5131 */ + 0x0000, /* R5132 */ + 0x0000, /* R5133 */ + 0x0000, /* R5134 */ + 0x0000, /* R5135 */ + 0x0000, /* R5136 */ + 0x0000, /* R5137 */ + 0x0000, /* R5138 */ + 0x0000, /* R5139 */ + 0x0000, /* R5140 */ + 0x0000, /* R5141 */ + 0x0000, /* R5142 */ + 0x0000, /* R5143 */ + 0x0000, /* R5144 */ + 0x0000, /* R5145 */ + 0x0000, /* R5146 */ + 0x0000, /* R5147 */ + 0x0000, /* R5148 */ + 0x0000, /* R5149 */ + 0x0000, /* R5150 */ + 0x0000, /* R5151 */ + 0x0000, /* R5152 */ + 0x0000, /* R5153 */ + 0x0000, /* R5154 */ + 0x0000, /* R5155 */ + 0x0000, /* R5156 */ + 0x0000, /* R5157 */ + 0x0000, /* R5158 */ + 0x0000, /* R5159 */ + 0x0000, /* R5160 */ + 0x0000, /* R5161 */ + 0x0000, /* R5162 */ + 0x0000, /* R5163 */ + 0x0000, /* R5164 */ + 0x0000, /* R5165 */ + 0x0000, /* R5166 */ + 0x0000, /* R5167 */ + 0x0000, /* R5168 */ + 0x0000, /* R5169 */ + 0x0000, /* R5170 */ + 0x0000, /* R5171 */ + 0x0000, /* R5172 */ + 0x0000, /* R5173 */ + 0x0000, /* R5174 */ + 0x0000, /* R5175 */ + 0x0000, /* R5176 */ + 0x0000, /* R5177 */ + 0x0000, /* R5178 */ + 0x0000, /* R5179 */ + 0x0000, /* R5180 */ + 0x0000, /* R5181 */ + 0x0000, /* R5182 */ + 0x0000, /* R5183 */ + 0x0000, /* R5184 */ + 0x0000, /* R5185 */ + 0x0000, /* R5186 */ + 0x0000, /* R5187 */ + 0x0000, /* R5188 */ + 0x0000, /* R5189 */ + 0x0000, /* R5190 */ + 0x0000, /* R5191 */ + 0x0000, /* R5192 */ + 0x0000, /* R5193 */ + 0x0000, /* R5194 */ + 0x0000, /* R5195 */ + 0x0000, /* R5196 */ + 0x0000, /* R5197 */ + 0x0000, /* R5198 */ + 0x0000, /* R5199 */ + 0x0000, /* R5200 */ + 0x0000, /* R5201 */ + 0x0000, /* R5202 */ + 0x0000, /* R5203 */ + 0x0000, /* R5204 */ + 0x0000, /* R5205 */ + 0x0000, /* R5206 */ + 0x0000, /* R5207 */ + 0x0000, /* R5208 */ + 0x0000, /* R5209 */ + 0x0000, /* R5210 */ + 0x0000, /* R5211 */ + 0x0000, /* R5212 */ + 0x0000, /* R5213 */ + 0x0000, /* R5214 */ + 0x0000, /* R5215 */ + 0x0000, /* R5216 */ + 0x0000, /* R5217 */ + 0x0000, /* R5218 */ + 0x0000, /* R5219 */ + 0x0000, /* R5220 */ + 0x0000, /* R5221 */ + 0x0000, /* R5222 */ + 0x0000, /* R5223 */ + 0x0000, /* R5224 */ + 0x0000, /* R5225 */ + 0x0000, /* R5226 */ + 0x0000, /* R5227 */ + 0x0000, /* R5228 */ + 0x0000, /* R5229 */ + 0x0000, /* R5230 */ + 0x0000, /* R5231 */ + 0x0000, /* R5232 */ + 0x0000, /* R5233 */ + 0x0000, /* R5234 */ + 0x0000, /* R5235 */ + 0x0000, /* R5236 */ + 0x0000, /* R5237 */ + 0x0000, /* R5238 */ + 0x0000, /* R5239 */ + 0x0000, /* R5240 */ + 0x0000, /* R5241 */ + 0x0000, /* R5242 */ + 0x0000, /* R5243 */ + 0x0000, /* R5244 */ + 0x0000, /* R5245 */ + 0x0000, /* R5246 */ + 0x0000, /* R5247 */ + 0x0000, /* R5248 */ + 0x0000, /* R5249 */ + 0x0000, /* R5250 */ + 0x0000, /* R5251 */ + 0x0000, /* R5252 */ + 0x0000, /* R5253 */ + 0x0000, /* R5254 */ + 0x0000, /* R5255 */ + 0x0000, /* R5256 */ + 0x0000, /* R5257 */ + 0x0000, /* R5258 */ + 0x0000, /* R5259 */ + 0x0000, /* R5260 */ + 0x0000, /* R5261 */ + 0x0000, /* R5262 */ + 0x0000, /* R5263 */ + 0x0000, /* R5264 */ + 0x0000, /* R5265 */ + 0x0000, /* R5266 */ + 0x0000, /* R5267 */ + 0x0000, /* R5268 */ + 0x0000, /* R5269 */ + 0x0000, /* R5270 */ + 0x0000, /* R5271 */ + 0x0000, /* R5272 */ + 0x0000, /* R5273 */ + 0x0000, /* R5274 */ + 0x0000, /* R5275 */ + 0x0000, /* R5276 */ + 0x0000, /* R5277 */ + 0x0000, /* R5278 */ + 0x0000, /* R5279 */ + 0x0000, /* R5280 */ + 0x0000, /* R5281 */ + 0x0000, /* R5282 */ + 0x0000, /* R5283 */ + 0x0000, /* R5284 */ + 0x0000, /* R5285 */ + 0x0000, /* R5286 */ + 0x0000, /* R5287 */ + 0x0000, /* R5288 */ + 0x0000, /* R5289 */ + 0x0000, /* R5290 */ + 0x0000, /* R5291 */ + 0x0000, /* R5292 */ + 0x0000, /* R5293 */ + 0x0000, /* R5294 */ + 0x0000, /* R5295 */ + 0x0000, /* R5296 */ + 0x0000, /* R5297 */ + 0x0000, /* R5298 */ + 0x0000, /* R5299 */ + 0x0000, /* R5300 */ + 0x0000, /* R5301 */ + 0x0000, /* R5302 */ + 0x0000, /* R5303 */ + 0x0000, /* R5304 */ + 0x0000, /* R5305 */ + 0x0000, /* R5306 */ + 0x0000, /* R5307 */ + 0x0000, /* R5308 */ + 0x0000, /* R5309 */ + 0x0000, /* R5310 */ + 0x0000, /* R5311 */ + 0x0000, /* R5312 */ + 0x0000, /* R5313 */ + 0x0000, /* R5314 */ + 0x0000, /* R5315 */ + 0x0000, /* R5316 */ + 0x0000, /* R5317 */ + 0x0000, /* R5318 */ + 0x0000, /* R5319 */ + 0x0000, /* R5320 */ + 0x0000, /* R5321 */ + 0x0000, /* R5322 */ + 0x0000, /* R5323 */ + 0x0000, /* R5324 */ + 0x0000, /* R5325 */ + 0x0000, /* R5326 */ + 0x0000, /* R5327 */ + 0x0000, /* R5328 */ + 0x0000, /* R5329 */ + 0x0000, /* R5330 */ + 0x0000, /* R5331 */ + 0x0000, /* R5332 */ + 0x0000, /* R5333 */ + 0x0000, /* R5334 */ + 0x0000, /* R5335 */ + 0x0000, /* R5336 */ + 0x0000, /* R5337 */ + 0x0000, /* R5338 */ + 0x0000, /* R5339 */ + 0x0000, /* R5340 */ + 0x0000, /* R5341 */ + 0x0000, /* R5342 */ + 0x0000, /* R5343 */ + 0x0000, /* R5344 */ + 0x0000, /* R5345 */ + 0x0000, /* R5346 */ + 0x0000, /* R5347 */ + 0x0000, /* R5348 */ + 0x0000, /* R5349 */ + 0x0000, /* R5350 */ + 0x0000, /* R5351 */ + 0x0000, /* R5352 */ + 0x0000, /* R5353 */ + 0x0000, /* R5354 */ + 0x0000, /* R5355 */ + 0x0000, /* R5356 */ + 0x0000, /* R5357 */ + 0x0000, /* R5358 */ + 0x0000, /* R5359 */ + 0x0000, /* R5360 */ + 0x0000, /* R5361 */ + 0x0000, /* R5362 */ + 0x0000, /* R5363 */ + 0x0000, /* R5364 */ + 0x0000, /* R5365 */ + 0x0000, /* R5366 */ + 0x0000, /* R5367 */ + 0x0000, /* R5368 */ + 0x0000, /* R5369 */ + 0x0000, /* R5370 */ + 0x0000, /* R5371 */ + 0x0000, /* R5372 */ + 0x0000, /* R5373 */ + 0x0000, /* R5374 */ + 0x0000, /* R5375 */ + 0x0000, /* R5376 */ + 0x0000, /* R5377 */ + 0x0000, /* R5378 */ + 0x0000, /* R5379 */ + 0x0000, /* R5380 */ + 0x0000, /* R5381 */ + 0x0000, /* R5382 */ + 0x0000, /* R5383 */ + 0x0000, /* R5384 */ + 0x0000, /* R5385 */ + 0x0000, /* R5386 */ + 0x0000, /* R5387 */ + 0x0000, /* R5388 */ + 0x0000, /* R5389 */ + 0x0000, /* R5390 */ + 0x0000, /* R5391 */ + 0x0000, /* R5392 */ + 0x0000, /* R5393 */ + 0x0000, /* R5394 */ + 0x0000, /* R5395 */ + 0x0000, /* R5396 */ + 0x0000, /* R5397 */ + 0x0000, /* R5398 */ + 0x0000, /* R5399 */ + 0x0000, /* R5400 */ + 0x0000, /* R5401 */ + 0x0000, /* R5402 */ + 0x0000, /* R5403 */ + 0x0000, /* R5404 */ + 0x0000, /* R5405 */ + 0x0000, /* R5406 */ + 0x0000, /* R5407 */ + 0x0000, /* R5408 */ + 0x0000, /* R5409 */ + 0x0000, /* R5410 */ + 0x0000, /* R5411 */ + 0x0000, /* R5412 */ + 0x0000, /* R5413 */ + 0x0000, /* R5414 */ + 0x0000, /* R5415 */ + 0x0000, /* R5416 */ + 0x0000, /* R5417 */ + 0x0000, /* R5418 */ + 0x0000, /* R5419 */ + 0x0000, /* R5420 */ + 0x0000, /* R5421 */ + 0x0000, /* R5422 */ + 0x0000, /* R5423 */ + 0x0000, /* R5424 */ + 0x0000, /* R5425 */ + 0x0000, /* R5426 */ + 0x0000, /* R5427 */ + 0x0000, /* R5428 */ + 0x0000, /* R5429 */ + 0x0000, /* R5430 */ + 0x0000, /* R5431 */ + 0x0000, /* R5432 */ + 0x0000, /* R5433 */ + 0x0000, /* R5434 */ + 0x0000, /* R5435 */ + 0x0000, /* R5436 */ + 0x0000, /* R5437 */ + 0x0000, /* R5438 */ + 0x0000, /* R5439 */ + 0x0000, /* R5440 */ + 0x0000, /* R5441 */ + 0x0000, /* R5442 */ + 0x0000, /* R5443 */ + 0x0000, /* R5444 */ + 0x0000, /* R5445 */ + 0x0000, /* R5446 */ + 0x0000, /* R5447 */ + 0x0000, /* R5448 */ + 0x0000, /* R5449 */ + 0x0000, /* R5450 */ + 0x0000, /* R5451 */ + 0x0000, /* R5452 */ + 0x0000, /* R5453 */ + 0x0000, /* R5454 */ + 0x0000, /* R5455 */ + 0x0000, /* R5456 */ + 0x0000, /* R5457 */ + 0x0000, /* R5458 */ + 0x0000, /* R5459 */ + 0x0000, /* R5460 */ + 0x0000, /* R5461 */ + 0x0000, /* R5462 */ + 0x0000, /* R5463 */ + 0x0000, /* R5464 */ + 0x0000, /* R5465 */ + 0x0000, /* R5466 */ + 0x0000, /* R5467 */ + 0x0000, /* R5468 */ + 0x0000, /* R5469 */ + 0x0000, /* R5470 */ + 0x0000, /* R5471 */ + 0x0000, /* R5472 */ + 0x0000, /* R5473 */ + 0x0000, /* R5474 */ + 0x0000, /* R5475 */ + 0x0000, /* R5476 */ + 0x0000, /* R5477 */ + 0x0000, /* R5478 */ + 0x0000, /* R5479 */ + 0x0000, /* R5480 */ + 0x0000, /* R5481 */ + 0x0000, /* R5482 */ + 0x0000, /* R5483 */ + 0x0000, /* R5484 */ + 0x0000, /* R5485 */ + 0x0000, /* R5486 */ + 0x0000, /* R5487 */ + 0x0000, /* R5488 */ + 0x0000, /* R5489 */ + 0x0000, /* R5490 */ + 0x0000, /* R5491 */ + 0x0000, /* R5492 */ + 0x0000, /* R5493 */ + 0x0000, /* R5494 */ + 0x0000, /* R5495 */ + 0x0000, /* R5496 */ + 0x0000, /* R5497 */ + 0x0000, /* R5498 */ + 0x0000, /* R5499 */ + 0x0000, /* R5500 */ + 0x0000, /* R5501 */ + 0x0000, /* R5502 */ + 0x0000, /* R5503 */ + 0x0000, /* R5504 */ + 0x0000, /* R5505 */ + 0x0000, /* R5506 */ + 0x0000, /* R5507 */ + 0x0000, /* R5508 */ + 0x0000, /* R5509 */ + 0x0000, /* R5510 */ + 0x0000, /* R5511 */ + 0x0000, /* R5512 */ + 0x0000, /* R5513 */ + 0x0000, /* R5514 */ + 0x0000, /* R5515 */ + 0x0000, /* R5516 */ + 0x0000, /* R5517 */ + 0x0000, /* R5518 */ + 0x0000, /* R5519 */ + 0x0000, /* R5520 */ + 0x0000, /* R5521 */ + 0x0000, /* R5522 */ + 0x0000, /* R5523 */ + 0x0000, /* R5524 */ + 0x0000, /* R5525 */ + 0x0000, /* R5526 */ + 0x0000, /* R5527 */ + 0x0000, /* R5528 */ + 0x0000, /* R5529 */ + 0x0000, /* R5530 */ + 0x0000, /* R5531 */ + 0x0000, /* R5532 */ + 0x0000, /* R5533 */ + 0x0000, /* R5534 */ + 0x0000, /* R5535 */ + 0x0000, /* R5536 */ + 0x0000, /* R5537 */ + 0x0000, /* R5538 */ + 0x0000, /* R5539 */ + 0x0000, /* R5540 */ + 0x0000, /* R5541 */ + 0x0000, /* R5542 */ + 0x0000, /* R5543 */ + 0x0000, /* R5544 */ + 0x0000, /* R5545 */ + 0x0000, /* R5546 */ + 0x0000, /* R5547 */ + 0x0000, /* R5548 */ + 0x0000, /* R5549 */ + 0x0000, /* R5550 */ + 0x0000, /* R5551 */ + 0x0000, /* R5552 */ + 0x0000, /* R5553 */ + 0x0000, /* R5554 */ + 0x0000, /* R5555 */ + 0x0000, /* R5556 */ + 0x0000, /* R5557 */ + 0x0000, /* R5558 */ + 0x0000, /* R5559 */ + 0x0000, /* R5560 */ + 0x0000, /* R5561 */ + 0x0000, /* R5562 */ + 0x0000, /* R5563 */ + 0x0000, /* R5564 */ + 0x0000, /* R5565 */ + 0x0000, /* R5566 */ + 0x0000, /* R5567 */ + 0x0000, /* R5568 */ + 0x0000, /* R5569 */ + 0x0000, /* R5570 */ + 0x0000, /* R5571 */ + 0x0000, /* R5572 */ + 0x0000, /* R5573 */ + 0x0000, /* R5574 */ + 0x0000, /* R5575 */ + 0x0000, /* R5576 */ + 0x0000, /* R5577 */ + 0x0000, /* R5578 */ + 0x0000, /* R5579 */ + 0x0000, /* R5580 */ + 0x0000, /* R5581 */ + 0x0000, /* R5582 */ + 0x0000, /* R5583 */ + 0x0000, /* R5584 */ + 0x0000, /* R5585 */ + 0x0000, /* R5586 */ + 0x0000, /* R5587 */ + 0x0000, /* R5588 */ + 0x0000, /* R5589 */ + 0x0000, /* R5590 */ + 0x0000, /* R5591 */ + 0x0000, /* R5592 */ + 0x0000, /* R5593 */ + 0x0000, /* R5594 */ + 0x0000, /* R5595 */ + 0x0000, /* R5596 */ + 0x0000, /* R5597 */ + 0x0000, /* R5598 */ + 0x0000, /* R5599 */ + 0x0000, /* R5600 */ + 0x0000, /* R5601 */ + 0x0000, /* R5602 */ + 0x0000, /* R5603 */ + 0x0000, /* R5604 */ + 0x0000, /* R5605 */ + 0x0000, /* R5606 */ + 0x0000, /* R5607 */ + 0x0000, /* R5608 */ + 0x0000, /* R5609 */ + 0x0000, /* R5610 */ + 0x0000, /* R5611 */ + 0x0000, /* R5612 */ + 0x0000, /* R5613 */ + 0x0000, /* R5614 */ + 0x0000, /* R5615 */ + 0x0000, /* R5616 */ + 0x0000, /* R5617 */ + 0x0000, /* R5618 */ + 0x0000, /* R5619 */ + 0x0000, /* R5620 */ + 0x0000, /* R5621 */ + 0x0000, /* R5622 */ + 0x0000, /* R5623 */ + 0x0000, /* R5624 */ + 0x0000, /* R5625 */ + 0x0000, /* R5626 */ + 0x0000, /* R5627 */ + 0x0000, /* R5628 */ + 0x0000, /* R5629 */ + 0x0000, /* R5630 */ + 0x0000, /* R5631 */ + 0x0000, /* R5632 */ + 0x0000, /* R5633 */ + 0x0000, /* R5634 */ + 0x0000, /* R5635 */ + 0x0000, /* R5636 */ + 0x0000, /* R5637 */ + 0x0000, /* R5638 */ + 0x0000, /* R5639 */ + 0x0000, /* R5640 */ + 0x0000, /* R5641 */ + 0x0000, /* R5642 */ + 0x0000, /* R5643 */ + 0x0000, /* R5644 */ + 0x0000, /* R5645 */ + 0x0000, /* R5646 */ + 0x0000, /* R5647 */ + 0x0000, /* R5648 */ + 0x0000, /* R5649 */ + 0x0000, /* R5650 */ + 0x0000, /* R5651 */ + 0x0000, /* R5652 */ + 0x0000, /* R5653 */ + 0x0000, /* R5654 */ + 0x0000, /* R5655 */ + 0x0000, /* R5656 */ + 0x0000, /* R5657 */ + 0x0000, /* R5658 */ + 0x0000, /* R5659 */ + 0x0000, /* R5660 */ + 0x0000, /* R5661 */ + 0x0000, /* R5662 */ + 0x0000, /* R5663 */ + 0x0000, /* R5664 */ + 0x0000, /* R5665 */ + 0x0000, /* R5666 */ + 0x0000, /* R5667 */ + 0x0000, /* R5668 */ + 0x0000, /* R5669 */ + 0x0000, /* R5670 */ + 0x0000, /* R5671 */ + 0x0000, /* R5672 */ + 0x0000, /* R5673 */ + 0x0000, /* R5674 */ + 0x0000, /* R5675 */ + 0x0000, /* R5676 */ + 0x0000, /* R5677 */ + 0x0000, /* R5678 */ + 0x0000, /* R5679 */ + 0x0000, /* R5680 */ + 0x0000, /* R5681 */ + 0x0000, /* R5682 */ + 0x0000, /* R5683 */ + 0x0000, /* R5684 */ + 0x0000, /* R5685 */ + 0x0000, /* R5686 */ + 0x0000, /* R5687 */ + 0x0000, /* R5688 */ + 0x0000, /* R5689 */ + 0x0000, /* R5690 */ + 0x0000, /* R5691 */ + 0x0000, /* R5692 */ + 0x0000, /* R5693 */ + 0x0000, /* R5694 */ + 0x0000, /* R5695 */ + 0x0000, /* R5696 */ + 0x0000, /* R5697 */ + 0x0000, /* R5698 */ + 0x0000, /* R5699 */ + 0x0000, /* R5700 */ + 0x0000, /* R5701 */ + 0x0000, /* R5702 */ + 0x0000, /* R5703 */ + 0x0000, /* R5704 */ + 0x0000, /* R5705 */ + 0x0000, /* R5706 */ + 0x0000, /* R5707 */ + 0x0000, /* R5708 */ + 0x0000, /* R5709 */ + 0x0000, /* R5710 */ + 0x0000, /* R5711 */ + 0x0000, /* R5712 */ + 0x0000, /* R5713 */ + 0x0000, /* R5714 */ + 0x0000, /* R5715 */ + 0x0000, /* R5716 */ + 0x0000, /* R5717 */ + 0x0000, /* R5718 */ + 0x0000, /* R5719 */ + 0x0000, /* R5720 */ + 0x0000, /* R5721 */ + 0x0000, /* R5722 */ + 0x0000, /* R5723 */ + 0x0000, /* R5724 */ + 0x0000, /* R5725 */ + 0x0000, /* R5726 */ + 0x0000, /* R5727 */ + 0x0000, /* R5728 */ + 0x0000, /* R5729 */ + 0x0000, /* R5730 */ + 0x0000, /* R5731 */ + 0x0000, /* R5732 */ + 0x0000, /* R5733 */ + 0x0000, /* R5734 */ + 0x0000, /* R5735 */ + 0x0000, /* R5736 */ + 0x0000, /* R5737 */ + 0x0000, /* R5738 */ + 0x0000, /* R5739 */ + 0x0000, /* R5740 */ + 0x0000, /* R5741 */ + 0x0000, /* R5742 */ + 0x0000, /* R5743 */ + 0x0000, /* R5744 */ + 0x0000, /* R5745 */ + 0x0000, /* R5746 */ + 0x0000, /* R5747 */ + 0x0000, /* R5748 */ + 0x0000, /* R5749 */ + 0x0000, /* R5750 */ + 0x0000, /* R5751 */ + 0x0000, /* R5752 */ + 0x0000, /* R5753 */ + 0x0000, /* R5754 */ + 0x0000, /* R5755 */ + 0x0000, /* R5756 */ + 0x0000, /* R5757 */ + 0x0000, /* R5758 */ + 0x0000, /* R5759 */ + 0x0000, /* R5760 */ + 0x0000, /* R5761 */ + 0x0000, /* R5762 */ + 0x0000, /* R5763 */ + 0x0000, /* R5764 */ + 0x0000, /* R5765 */ + 0x0000, /* R5766 */ + 0x0000, /* R5767 */ + 0x0000, /* R5768 */ + 0x0000, /* R5769 */ + 0x0000, /* R5770 */ + 0x0000, /* R5771 */ + 0x0000, /* R5772 */ + 0x0000, /* R5773 */ + 0x0000, /* R5774 */ + 0x0000, /* R5775 */ + 0x0000, /* R5776 */ + 0x0000, /* R5777 */ + 0x0000, /* R5778 */ + 0x0000, /* R5779 */ + 0x0000, /* R5780 */ + 0x0000, /* R5781 */ + 0x0000, /* R5782 */ + 0x0000, /* R5783 */ + 0x0000, /* R5784 */ + 0x0000, /* R5785 */ + 0x0000, /* R5786 */ + 0x0000, /* R5787 */ + 0x0000, /* R5788 */ + 0x0000, /* R5789 */ + 0x0000, /* R5790 */ + 0x0000, /* R5791 */ + 0x0000, /* R5792 */ + 0x0000, /* R5793 */ + 0x0000, /* R5794 */ + 0x0000, /* R5795 */ + 0x0000, /* R5796 */ + 0x0000, /* R5797 */ + 0x0000, /* R5798 */ + 0x0000, /* R5799 */ + 0x0000, /* R5800 */ + 0x0000, /* R5801 */ + 0x0000, /* R5802 */ + 0x0000, /* R5803 */ + 0x0000, /* R5804 */ + 0x0000, /* R5805 */ + 0x0000, /* R5806 */ + 0x0000, /* R5807 */ + 0x0000, /* R5808 */ + 0x0000, /* R5809 */ + 0x0000, /* R5810 */ + 0x0000, /* R5811 */ + 0x0000, /* R5812 */ + 0x0000, /* R5813 */ + 0x0000, /* R5814 */ + 0x0000, /* R5815 */ + 0x0000, /* R5816 */ + 0x0000, /* R5817 */ + 0x0000, /* R5818 */ + 0x0000, /* R5819 */ + 0x0000, /* R5820 */ + 0x0000, /* R5821 */ + 0x0000, /* R5822 */ + 0x0000, /* R5823 */ + 0x0000, /* R5824 */ + 0x0000, /* R5825 */ + 0x0000, /* R5826 */ + 0x0000, /* R5827 */ + 0x0000, /* R5828 */ + 0x0000, /* R5829 */ + 0x0000, /* R5830 */ + 0x0000, /* R5831 */ + 0x0000, /* R5832 */ + 0x0000, /* R5833 */ + 0x0000, /* R5834 */ + 0x0000, /* R5835 */ + 0x0000, /* R5836 */ + 0x0000, /* R5837 */ + 0x0000, /* R5838 */ + 0x0000, /* R5839 */ + 0x0000, /* R5840 */ + 0x0000, /* R5841 */ + 0x0000, /* R5842 */ + 0x0000, /* R5843 */ + 0x0000, /* R5844 */ + 0x0000, /* R5845 */ + 0x0000, /* R5846 */ + 0x0000, /* R5847 */ + 0x0000, /* R5848 */ + 0x0000, /* R5849 */ + 0x0000, /* R5850 */ + 0x0000, /* R5851 */ + 0x0000, /* R5852 */ + 0x0000, /* R5853 */ + 0x0000, /* R5854 */ + 0x0000, /* R5855 */ + 0x0000, /* R5856 */ + 0x0000, /* R5857 */ + 0x0000, /* R5858 */ + 0x0000, /* R5859 */ + 0x0000, /* R5860 */ + 0x0000, /* R5861 */ + 0x0000, /* R5862 */ + 0x0000, /* R5863 */ + 0x0000, /* R5864 */ + 0x0000, /* R5865 */ + 0x0000, /* R5866 */ + 0x0000, /* R5867 */ + 0x0000, /* R5868 */ + 0x0000, /* R5869 */ + 0x0000, /* R5870 */ + 0x0000, /* R5871 */ + 0x0000, /* R5872 */ + 0x0000, /* R5873 */ + 0x0000, /* R5874 */ + 0x0000, /* R5875 */ + 0x0000, /* R5876 */ + 0x0000, /* R5877 */ + 0x0000, /* R5878 */ + 0x0000, /* R5879 */ + 0x0000, /* R5880 */ + 0x0000, /* R5881 */ + 0x0000, /* R5882 */ + 0x0000, /* R5883 */ + 0x0000, /* R5884 */ + 0x0000, /* R5885 */ + 0x0000, /* R5886 */ + 0x0000, /* R5887 */ + 0x0000, /* R5888 */ + 0x0000, /* R5889 */ + 0x0000, /* R5890 */ + 0x0000, /* R5891 */ + 0x0000, /* R5892 */ + 0x0000, /* R5893 */ + 0x0000, /* R5894 */ + 0x0000, /* R5895 */ + 0x0000, /* R5896 */ + 0x0000, /* R5897 */ + 0x0000, /* R5898 */ + 0x0000, /* R5899 */ + 0x0000, /* R5900 */ + 0x0000, /* R5901 */ + 0x0000, /* R5902 */ + 0x0000, /* R5903 */ + 0x0000, /* R5904 */ + 0x0000, /* R5905 */ + 0x0000, /* R5906 */ + 0x0000, /* R5907 */ + 0x0000, /* R5908 */ + 0x0000, /* R5909 */ + 0x0000, /* R5910 */ + 0x0000, /* R5911 */ + 0x0000, /* R5912 */ + 0x0000, /* R5913 */ + 0x0000, /* R5914 */ + 0x0000, /* R5915 */ + 0x0000, /* R5916 */ + 0x0000, /* R5917 */ + 0x0000, /* R5918 */ + 0x0000, /* R5919 */ + 0x0000, /* R5920 */ + 0x0000, /* R5921 */ + 0x0000, /* R5922 */ + 0x0000, /* R5923 */ + 0x0000, /* R5924 */ + 0x0000, /* R5925 */ + 0x0000, /* R5926 */ + 0x0000, /* R5927 */ + 0x0000, /* R5928 */ + 0x0000, /* R5929 */ + 0x0000, /* R5930 */ + 0x0000, /* R5931 */ + 0x0000, /* R5932 */ + 0x0000, /* R5933 */ + 0x0000, /* R5934 */ + 0x0000, /* R5935 */ + 0x0000, /* R5936 */ + 0x0000, /* R5937 */ + 0x0000, /* R5938 */ + 0x0000, /* R5939 */ + 0x0000, /* R5940 */ + 0x0000, /* R5941 */ + 0x0000, /* R5942 */ + 0x0000, /* R5943 */ + 0x0000, /* R5944 */ + 0x0000, /* R5945 */ + 0x0000, /* R5946 */ + 0x0000, /* R5947 */ + 0x0000, /* R5948 */ + 0x0000, /* R5949 */ + 0x0000, /* R5950 */ + 0x0000, /* R5951 */ + 0x0000, /* R5952 */ + 0x0000, /* R5953 */ + 0x0000, /* R5954 */ + 0x0000, /* R5955 */ + 0x0000, /* R5956 */ + 0x0000, /* R5957 */ + 0x0000, /* R5958 */ + 0x0000, /* R5959 */ + 0x0000, /* R5960 */ + 0x0000, /* R5961 */ + 0x0000, /* R5962 */ + 0x0000, /* R5963 */ + 0x0000, /* R5964 */ + 0x0000, /* R5965 */ + 0x0000, /* R5966 */ + 0x0000, /* R5967 */ + 0x0000, /* R5968 */ + 0x0000, /* R5969 */ + 0x0000, /* R5970 */ + 0x0000, /* R5971 */ + 0x0000, /* R5972 */ + 0x0000, /* R5973 */ + 0x0000, /* R5974 */ + 0x0000, /* R5975 */ + 0x0000, /* R5976 */ + 0x0000, /* R5977 */ + 0x0000, /* R5978 */ + 0x0000, /* R5979 */ + 0x0000, /* R5980 */ + 0x0000, /* R5981 */ + 0x0000, /* R5982 */ + 0x0000, /* R5983 */ + 0x0000, /* R5984 */ + 0x0000, /* R5985 */ + 0x0000, /* R5986 */ + 0x0000, /* R5987 */ + 0x0000, /* R5988 */ + 0x0000, /* R5989 */ + 0x0000, /* R5990 */ + 0x0000, /* R5991 */ + 0x0000, /* R5992 */ + 0x0000, /* R5993 */ + 0x0000, /* R5994 */ + 0x0000, /* R5995 */ + 0x0000, /* R5996 */ + 0x0000, /* R5997 */ + 0x0000, /* R5998 */ + 0x0000, /* R5999 */ + 0x0000, /* R6000 */ + 0x0000, /* R6001 */ + 0x0000, /* R6002 */ + 0x0000, /* R6003 */ + 0x0000, /* R6004 */ + 0x0000, /* R6005 */ + 0x0000, /* R6006 */ + 0x0000, /* R6007 */ + 0x0000, /* R6008 */ + 0x0000, /* R6009 */ + 0x0000, /* R6010 */ + 0x0000, /* R6011 */ + 0x0000, /* R6012 */ + 0x0000, /* R6013 */ + 0x0000, /* R6014 */ + 0x0000, /* R6015 */ + 0x0000, /* R6016 */ + 0x0000, /* R6017 */ + 0x0000, /* R6018 */ + 0x0000, /* R6019 */ + 0x0000, /* R6020 */ + 0x0000, /* R6021 */ + 0x0000, /* R6022 */ + 0x0000, /* R6023 */ + 0x0000, /* R6024 */ + 0x0000, /* R6025 */ + 0x0000, /* R6026 */ + 0x0000, /* R6027 */ + 0x0000, /* R6028 */ + 0x0000, /* R6029 */ + 0x0000, /* R6030 */ + 0x0000, /* R6031 */ + 0x0000, /* R6032 */ + 0x0000, /* R6033 */ + 0x0000, /* R6034 */ + 0x0000, /* R6035 */ + 0x0000, /* R6036 */ + 0x0000, /* R6037 */ + 0x0000, /* R6038 */ + 0x0000, /* R6039 */ + 0x0000, /* R6040 */ + 0x0000, /* R6041 */ + 0x0000, /* R6042 */ + 0x0000, /* R6043 */ + 0x0000, /* R6044 */ + 0x0000, /* R6045 */ + 0x0000, /* R6046 */ + 0x0000, /* R6047 */ + 0x0000, /* R6048 */ + 0x0000, /* R6049 */ + 0x0000, /* R6050 */ + 0x0000, /* R6051 */ + 0x0000, /* R6052 */ + 0x0000, /* R6053 */ + 0x0000, /* R6054 */ + 0x0000, /* R6055 */ + 0x0000, /* R6056 */ + 0x0000, /* R6057 */ + 0x0000, /* R6058 */ + 0x0000, /* R6059 */ + 0x0000, /* R6060 */ + 0x0000, /* R6061 */ + 0x0000, /* R6062 */ + 0x0000, /* R6063 */ + 0x0000, /* R6064 */ + 0x0000, /* R6065 */ + 0x0000, /* R6066 */ + 0x0000, /* R6067 */ + 0x0000, /* R6068 */ + 0x0000, /* R6069 */ + 0x0000, /* R6070 */ + 0x0000, /* R6071 */ + 0x0000, /* R6072 */ + 0x0000, /* R6073 */ + 0x0000, /* R6074 */ + 0x0000, /* R6075 */ + 0x0000, /* R6076 */ + 0x0000, /* R6077 */ + 0x0000, /* R6078 */ + 0x0000, /* R6079 */ + 0x0000, /* R6080 */ + 0x0000, /* R6081 */ + 0x0000, /* R6082 */ + 0x0000, /* R6083 */ + 0x0000, /* R6084 */ + 0x0000, /* R6085 */ + 0x0000, /* R6086 */ + 0x0000, /* R6087 */ + 0x0000, /* R6088 */ + 0x0000, /* R6089 */ + 0x0000, /* R6090 */ + 0x0000, /* R6091 */ + 0x0000, /* R6092 */ + 0x0000, /* R6093 */ + 0x0000, /* R6094 */ + 0x0000, /* R6095 */ + 0x0000, /* R6096 */ + 0x0000, /* R6097 */ + 0x0000, /* R6098 */ + 0x0000, /* R6099 */ + 0x0000, /* R6100 */ + 0x0000, /* R6101 */ + 0x0000, /* R6102 */ + 0x0000, /* R6103 */ + 0x0000, /* R6104 */ + 0x0000, /* R6105 */ + 0x0000, /* R6106 */ + 0x0000, /* R6107 */ + 0x0000, /* R6108 */ + 0x0000, /* R6109 */ + 0x0000, /* R6110 */ + 0x0000, /* R6111 */ + 0x0000, /* R6112 */ + 0x0000, /* R6113 */ + 0x0000, /* R6114 */ + 0x0000, /* R6115 */ + 0x0000, /* R6116 */ + 0x0000, /* R6117 */ + 0x0000, /* R6118 */ + 0x0000, /* R6119 */ + 0x0000, /* R6120 */ + 0x0000, /* R6121 */ + 0x0000, /* R6122 */ + 0x0000, /* R6123 */ + 0x0000, /* R6124 */ + 0x0000, /* R6125 */ + 0x0000, /* R6126 */ + 0x0000, /* R6127 */ + 0x0000, /* R6128 */ + 0x0000, /* R6129 */ + 0x0000, /* R6130 */ + 0x0000, /* R6131 */ + 0x0000, /* R6132 */ + 0x0000, /* R6133 */ + 0x0000, /* R6134 */ + 0x0000, /* R6135 */ + 0x0000, /* R6136 */ + 0x0000, /* R6137 */ + 0x0000, /* R6138 */ + 0x0000, /* R6139 */ + 0x0000, /* R6140 */ + 0x0000, /* R6141 */ + 0x0000, /* R6142 */ + 0x0000, /* R6143 */ + 0x0000, /* R6144 */ + 0x0000, /* R6145 */ + 0x0000, /* R6146 */ + 0x0000, /* R6147 */ + 0x0000, /* R6148 */ + 0x0000, /* R6149 */ + 0x0000, /* R6150 */ + 0x0000, /* R6151 */ + 0x0000, /* R6152 */ + 0x0000, /* R6153 */ + 0x0000, /* R6154 */ + 0x0000, /* R6155 */ + 0x0000, /* R6156 */ + 0x0000, /* R6157 */ + 0x0000, /* R6158 */ + 0x0000, /* R6159 */ + 0x0000, /* R6160 */ + 0x0000, /* R6161 */ + 0x0000, /* R6162 */ + 0x0000, /* R6163 */ + 0x0000, /* R6164 */ + 0x0000, /* R6165 */ + 0x0000, /* R6166 */ + 0x0000, /* R6167 */ + 0x0000, /* R6168 */ + 0x0000, /* R6169 */ + 0x0000, /* R6170 */ + 0x0000, /* R6171 */ + 0x0000, /* R6172 */ + 0x0000, /* R6173 */ + 0x0000, /* R6174 */ + 0x0000, /* R6175 */ + 0x0000, /* R6176 */ + 0x0000, /* R6177 */ + 0x0000, /* R6178 */ + 0x0000, /* R6179 */ + 0x0000, /* R6180 */ + 0x0000, /* R6181 */ + 0x0000, /* R6182 */ + 0x0000, /* R6183 */ + 0x0000, /* R6184 */ + 0x0000, /* R6185 */ + 0x0000, /* R6186 */ + 0x0000, /* R6187 */ + 0x0000, /* R6188 */ + 0x0000, /* R6189 */ + 0x0000, /* R6190 */ + 0x0000, /* R6191 */ + 0x0000, /* R6192 */ + 0x0000, /* R6193 */ + 0x0000, /* R6194 */ + 0x0000, /* R6195 */ + 0x0000, /* R6196 */ + 0x0000, /* R6197 */ + 0x0000, /* R6198 */ + 0x0000, /* R6199 */ + 0x0000, /* R6200 */ + 0x0000, /* R6201 */ + 0x0000, /* R6202 */ + 0x0000, /* R6203 */ + 0x0000, /* R6204 */ + 0x0000, /* R6205 */ + 0x0000, /* R6206 */ + 0x0000, /* R6207 */ + 0x0000, /* R6208 */ + 0x0000, /* R6209 */ + 0x0000, /* R6210 */ + 0x0000, /* R6211 */ + 0x0000, /* R6212 */ + 0x0000, /* R6213 */ + 0x0000, /* R6214 */ + 0x0000, /* R6215 */ + 0x0000, /* R6216 */ + 0x0000, /* R6217 */ + 0x0000, /* R6218 */ + 0x0000, /* R6219 */ + 0x0000, /* R6220 */ + 0x0000, /* R6221 */ + 0x0000, /* R6222 */ + 0x0000, /* R6223 */ + 0x0000, /* R6224 */ + 0x0000, /* R6225 */ + 0x0000, /* R6226 */ + 0x0000, /* R6227 */ + 0x0000, /* R6228 */ + 0x0000, /* R6229 */ + 0x0000, /* R6230 */ + 0x0000, /* R6231 */ + 0x0000, /* R6232 */ + 0x0000, /* R6233 */ + 0x0000, /* R6234 */ + 0x0000, /* R6235 */ + 0x0000, /* R6236 */ + 0x0000, /* R6237 */ + 0x0000, /* R6238 */ + 0x0000, /* R6239 */ + 0x0000, /* R6240 */ + 0x0000, /* R6241 */ + 0x0000, /* R6242 */ + 0x0000, /* R6243 */ + 0x0000, /* R6244 */ + 0x0000, /* R6245 */ + 0x0000, /* R6246 */ + 0x0000, /* R6247 */ + 0x0000, /* R6248 */ + 0x0000, /* R6249 */ + 0x0000, /* R6250 */ + 0x0000, /* R6251 */ + 0x0000, /* R6252 */ + 0x0000, /* R6253 */ + 0x0000, /* R6254 */ + 0x0000, /* R6255 */ + 0x0000, /* R6256 */ + 0x0000, /* R6257 */ + 0x0000, /* R6258 */ + 0x0000, /* R6259 */ + 0x0000, /* R6260 */ + 0x0000, /* R6261 */ + 0x0000, /* R6262 */ + 0x0000, /* R6263 */ + 0x0000, /* R6264 */ + 0x0000, /* R6265 */ + 0x0000, /* R6266 */ + 0x0000, /* R6267 */ + 0x0000, /* R6268 */ + 0x0000, /* R6269 */ + 0x0000, /* R6270 */ + 0x0000, /* R6271 */ + 0x0000, /* R6272 */ + 0x0000, /* R6273 */ + 0x0000, /* R6274 */ + 0x0000, /* R6275 */ + 0x0000, /* R6276 */ + 0x0000, /* R6277 */ + 0x0000, /* R6278 */ + 0x0000, /* R6279 */ + 0x0000, /* R6280 */ + 0x0000, /* R6281 */ + 0x0000, /* R6282 */ + 0x0000, /* R6283 */ + 0x0000, /* R6284 */ + 0x0000, /* R6285 */ + 0x0000, /* R6286 */ + 0x0000, /* R6287 */ + 0x0000, /* R6288 */ + 0x0000, /* R6289 */ + 0x0000, /* R6290 */ + 0x0000, /* R6291 */ + 0x0000, /* R6292 */ + 0x0000, /* R6293 */ + 0x0000, /* R6294 */ + 0x0000, /* R6295 */ + 0x0000, /* R6296 */ + 0x0000, /* R6297 */ + 0x0000, /* R6298 */ + 0x0000, /* R6299 */ + 0x0000, /* R6300 */ + 0x0000, /* R6301 */ + 0x0000, /* R6302 */ + 0x0000, /* R6303 */ + 0x0000, /* R6304 */ + 0x0000, /* R6305 */ + 0x0000, /* R6306 */ + 0x0000, /* R6307 */ + 0x0000, /* R6308 */ + 0x0000, /* R6309 */ + 0x0000, /* R6310 */ + 0x0000, /* R6311 */ + 0x0000, /* R6312 */ + 0x0000, /* R6313 */ + 0x0000, /* R6314 */ + 0x0000, /* R6315 */ + 0x0000, /* R6316 */ + 0x0000, /* R6317 */ + 0x0000, /* R6318 */ + 0x0000, /* R6319 */ + 0x0000, /* R6320 */ + 0x0000, /* R6321 */ + 0x0000, /* R6322 */ + 0x0000, /* R6323 */ + 0x0000, /* R6324 */ + 0x0000, /* R6325 */ + 0x0000, /* R6326 */ + 0x0000, /* R6327 */ + 0x0000, /* R6328 */ + 0x0000, /* R6329 */ + 0x0000, /* R6330 */ + 0x0000, /* R6331 */ + 0x0000, /* R6332 */ + 0x0000, /* R6333 */ + 0x0000, /* R6334 */ + 0x0000, /* R6335 */ + 0x0000, /* R6336 */ + 0x0000, /* R6337 */ + 0x0000, /* R6338 */ + 0x0000, /* R6339 */ + 0x0000, /* R6340 */ + 0x0000, /* R6341 */ + 0x0000, /* R6342 */ + 0x0000, /* R6343 */ + 0x0000, /* R6344 */ + 0x0000, /* R6345 */ + 0x0000, /* R6346 */ + 0x0000, /* R6347 */ + 0x0000, /* R6348 */ + 0x0000, /* R6349 */ + 0x0000, /* R6350 */ + 0x0000, /* R6351 */ + 0x0000, /* R6352 */ + 0x0000, /* R6353 */ + 0x0000, /* R6354 */ + 0x0000, /* R6355 */ + 0x0000, /* R6356 */ + 0x0000, /* R6357 */ + 0x0000, /* R6358 */ + 0x0000, /* R6359 */ + 0x0000, /* R6360 */ + 0x0000, /* R6361 */ + 0x0000, /* R6362 */ + 0x0000, /* R6363 */ + 0x0000, /* R6364 */ + 0x0000, /* R6365 */ + 0x0000, /* R6366 */ + 0x0000, /* R6367 */ + 0x0000, /* R6368 */ + 0x0000, /* R6369 */ + 0x0000, /* R6370 */ + 0x0000, /* R6371 */ + 0x0000, /* R6372 */ + 0x0000, /* R6373 */ + 0x0000, /* R6374 */ + 0x0000, /* R6375 */ + 0x0000, /* R6376 */ + 0x0000, /* R6377 */ + 0x0000, /* R6378 */ + 0x0000, /* R6379 */ + 0x0000, /* R6380 */ + 0x0000, /* R6381 */ + 0x0000, /* R6382 */ + 0x0000, /* R6383 */ + 0x0000, /* R6384 */ + 0x0000, /* R6385 */ + 0x0000, /* R6386 */ + 0x0000, /* R6387 */ + 0x0000, /* R6388 */ + 0x0000, /* R6389 */ + 0x0000, /* R6390 */ + 0x0000, /* R6391 */ + 0x0000, /* R6392 */ + 0x0000, /* R6393 */ + 0x0000, /* R6394 */ + 0x0000, /* R6395 */ + 0x0000, /* R6396 */ + 0x0000, /* R6397 */ + 0x0000, /* R6398 */ + 0x0000, /* R6399 */ + 0x0000, /* R6400 */ + 0x0000, /* R6401 */ + 0x0000, /* R6402 */ + 0x0000, /* R6403 */ + 0x0000, /* R6404 */ + 0x0000, /* R6405 */ + 0x0000, /* R6406 */ + 0x0000, /* R6407 */ + 0x0000, /* R6408 */ + 0x0000, /* R6409 */ + 0x0000, /* R6410 */ + 0x0000, /* R6411 */ + 0x0000, /* R6412 */ + 0x0000, /* R6413 */ + 0x0000, /* R6414 */ + 0x0000, /* R6415 */ + 0x0000, /* R6416 */ + 0x0000, /* R6417 */ + 0x0000, /* R6418 */ + 0x0000, /* R6419 */ + 0x0000, /* R6420 */ + 0x0000, /* R6421 */ + 0x0000, /* R6422 */ + 0x0000, /* R6423 */ + 0x0000, /* R6424 */ + 0x0000, /* R6425 */ + 0x0000, /* R6426 */ + 0x0000, /* R6427 */ + 0x0000, /* R6428 */ + 0x0000, /* R6429 */ + 0x0000, /* R6430 */ + 0x0000, /* R6431 */ + 0x0000, /* R6432 */ + 0x0000, /* R6433 */ + 0x0000, /* R6434 */ + 0x0000, /* R6435 */ + 0x0000, /* R6436 */ + 0x0000, /* R6437 */ + 0x0000, /* R6438 */ + 0x0000, /* R6439 */ + 0x0000, /* R6440 */ + 0x0000, /* R6441 */ + 0x0000, /* R6442 */ + 0x0000, /* R6443 */ + 0x0000, /* R6444 */ + 0x0000, /* R6445 */ + 0x0000, /* R6446 */ + 0x0000, /* R6447 */ + 0x0000, /* R6448 */ + 0x0000, /* R6449 */ + 0x0000, /* R6450 */ + 0x0000, /* R6451 */ + 0x0000, /* R6452 */ + 0x0000, /* R6453 */ + 0x0000, /* R6454 */ + 0x0000, /* R6455 */ + 0x0000, /* R6456 */ + 0x0000, /* R6457 */ + 0x0000, /* R6458 */ + 0x0000, /* R6459 */ + 0x0000, /* R6460 */ + 0x0000, /* R6461 */ + 0x0000, /* R6462 */ + 0x0000, /* R6463 */ + 0x0000, /* R6464 */ + 0x0000, /* R6465 */ + 0x0000, /* R6466 */ + 0x0000, /* R6467 */ + 0x0000, /* R6468 */ + 0x0000, /* R6469 */ + 0x0000, /* R6470 */ + 0x0000, /* R6471 */ + 0x0000, /* R6472 */ + 0x0000, /* R6473 */ + 0x0000, /* R6474 */ + 0x0000, /* R6475 */ + 0x0000, /* R6476 */ + 0x0000, /* R6477 */ + 0x0000, /* R6478 */ + 0x0000, /* R6479 */ + 0x0000, /* R6480 */ + 0x0000, /* R6481 */ + 0x0000, /* R6482 */ + 0x0000, /* R6483 */ + 0x0000, /* R6484 */ + 0x0000, /* R6485 */ + 0x0000, /* R6486 */ + 0x0000, /* R6487 */ + 0x0000, /* R6488 */ + 0x0000, /* R6489 */ + 0x0000, /* R6490 */ + 0x0000, /* R6491 */ + 0x0000, /* R6492 */ + 0x0000, /* R6493 */ + 0x0000, /* R6494 */ + 0x0000, /* R6495 */ + 0x0000, /* R6496 */ + 0x0000, /* R6497 */ + 0x0000, /* R6498 */ + 0x0000, /* R6499 */ + 0x0000, /* R6500 */ + 0x0000, /* R6501 */ + 0x0000, /* R6502 */ + 0x0000, /* R6503 */ + 0x0000, /* R6504 */ + 0x0000, /* R6505 */ + 0x0000, /* R6506 */ + 0x0000, /* R6507 */ + 0x0000, /* R6508 */ + 0x0000, /* R6509 */ + 0x0000, /* R6510 */ + 0x0000, /* R6511 */ + 0x0000, /* R6512 */ + 0x0000, /* R6513 */ + 0x0000, /* R6514 */ + 0x0000, /* R6515 */ + 0x0000, /* R6516 */ + 0x0000, /* R6517 */ + 0x0000, /* R6518 */ + 0x0000, /* R6519 */ + 0x0000, /* R6520 */ + 0x0000, /* R6521 */ + 0x0000, /* R6522 */ + 0x0000, /* R6523 */ + 0x0000, /* R6524 */ + 0x0000, /* R6525 */ + 0x0000, /* R6526 */ + 0x0000, /* R6527 */ + 0x0000, /* R6528 */ + 0x0000, /* R6529 */ + 0x0000, /* R6530 */ + 0x0000, /* R6531 */ + 0x0000, /* R6532 */ + 0x0000, /* R6533 */ + 0x0000, /* R6534 */ + 0x0000, /* R6535 */ + 0x0000, /* R6536 */ + 0x0000, /* R6537 */ + 0x0000, /* R6538 */ + 0x0000, /* R6539 */ + 0x0000, /* R6540 */ + 0x0000, /* R6541 */ + 0x0000, /* R6542 */ + 0x0000, /* R6543 */ + 0x0000, /* R6544 */ + 0x0000, /* R6545 */ + 0x0000, /* R6546 */ + 0x0000, /* R6547 */ + 0x0000, /* R6548 */ + 0x0000, /* R6549 */ + 0x0000, /* R6550 */ + 0x0000, /* R6551 */ + 0x0000, /* R6552 */ + 0x0000, /* R6553 */ + 0x0000, /* R6554 */ + 0x0000, /* R6555 */ + 0x0000, /* R6556 */ + 0x0000, /* R6557 */ + 0x0000, /* R6558 */ + 0x0000, /* R6559 */ + 0x0000, /* R6560 */ + 0x0000, /* R6561 */ + 0x0000, /* R6562 */ + 0x0000, /* R6563 */ + 0x0000, /* R6564 */ + 0x0000, /* R6565 */ + 0x0000, /* R6566 */ + 0x0000, /* R6567 */ + 0x0000, /* R6568 */ + 0x0000, /* R6569 */ + 0x0000, /* R6570 */ + 0x0000, /* R6571 */ + 0x0000, /* R6572 */ + 0x0000, /* R6573 */ + 0x0000, /* R6574 */ + 0x0000, /* R6575 */ + 0x0000, /* R6576 */ + 0x0000, /* R6577 */ + 0x0000, /* R6578 */ + 0x0000, /* R6579 */ + 0x0000, /* R6580 */ + 0x0000, /* R6581 */ + 0x0000, /* R6582 */ + 0x0000, /* R6583 */ + 0x0000, /* R6584 */ + 0x0000, /* R6585 */ + 0x0000, /* R6586 */ + 0x0000, /* R6587 */ + 0x0000, /* R6588 */ + 0x0000, /* R6589 */ + 0x0000, /* R6590 */ + 0x0000, /* R6591 */ + 0x0000, /* R6592 */ + 0x0000, /* R6593 */ + 0x0000, /* R6594 */ + 0x0000, /* R6595 */ + 0x0000, /* R6596 */ + 0x0000, /* R6597 */ + 0x0000, /* R6598 */ + 0x0000, /* R6599 */ + 0x0000, /* R6600 */ + 0x0000, /* R6601 */ + 0x0000, /* R6602 */ + 0x0000, /* R6603 */ + 0x0000, /* R6604 */ + 0x0000, /* R6605 */ + 0x0000, /* R6606 */ + 0x0000, /* R6607 */ + 0x0000, /* R6608 */ + 0x0000, /* R6609 */ + 0x0000, /* R6610 */ + 0x0000, /* R6611 */ + 0x0000, /* R6612 */ + 0x0000, /* R6613 */ + 0x0000, /* R6614 */ + 0x0000, /* R6615 */ + 0x0000, /* R6616 */ + 0x0000, /* R6617 */ + 0x0000, /* R6618 */ + 0x0000, /* R6619 */ + 0x0000, /* R6620 */ + 0x0000, /* R6621 */ + 0x0000, /* R6622 */ + 0x0000, /* R6623 */ + 0x0000, /* R6624 */ + 0x0000, /* R6625 */ + 0x0000, /* R6626 */ + 0x0000, /* R6627 */ + 0x0000, /* R6628 */ + 0x0000, /* R6629 */ + 0x0000, /* R6630 */ + 0x0000, /* R6631 */ + 0x0000, /* R6632 */ + 0x0000, /* R6633 */ + 0x0000, /* R6634 */ + 0x0000, /* R6635 */ + 0x0000, /* R6636 */ + 0x0000, /* R6637 */ + 0x0000, /* R6638 */ + 0x0000, /* R6639 */ + 0x0000, /* R6640 */ + 0x0000, /* R6641 */ + 0x0000, /* R6642 */ + 0x0000, /* R6643 */ + 0x0000, /* R6644 */ + 0x0000, /* R6645 */ + 0x0000, /* R6646 */ + 0x0000, /* R6647 */ + 0x0000, /* R6648 */ + 0x0000, /* R6649 */ + 0x0000, /* R6650 */ + 0x0000, /* R6651 */ + 0x0000, /* R6652 */ + 0x0000, /* R6653 */ + 0x0000, /* R6654 */ + 0x0000, /* R6655 */ + 0x0000, /* R6656 */ + 0x0000, /* R6657 */ + 0x0000, /* R6658 */ + 0x0000, /* R6659 */ + 0x0000, /* R6660 */ + 0x0000, /* R6661 */ + 0x0000, /* R6662 */ + 0x0000, /* R6663 */ + 0x0000, /* R6664 */ + 0x0000, /* R6665 */ + 0x0000, /* R6666 */ + 0x0000, /* R6667 */ + 0x0000, /* R6668 */ + 0x0000, /* R6669 */ + 0x0000, /* R6670 */ + 0x0000, /* R6671 */ + 0x0000, /* R6672 */ + 0x0000, /* R6673 */ + 0x0000, /* R6674 */ + 0x0000, /* R6675 */ + 0x0000, /* R6676 */ + 0x0000, /* R6677 */ + 0x0000, /* R6678 */ + 0x0000, /* R6679 */ + 0x0000, /* R6680 */ + 0x0000, /* R6681 */ + 0x0000, /* R6682 */ + 0x0000, /* R6683 */ + 0x0000, /* R6684 */ + 0x0000, /* R6685 */ + 0x0000, /* R6686 */ + 0x0000, /* R6687 */ + 0x0000, /* R6688 */ + 0x0000, /* R6689 */ + 0x0000, /* R6690 */ + 0x0000, /* R6691 */ + 0x0000, /* R6692 */ + 0x0000, /* R6693 */ + 0x0000, /* R6694 */ + 0x0000, /* R6695 */ + 0x0000, /* R6696 */ + 0x0000, /* R6697 */ + 0x0000, /* R6698 */ + 0x0000, /* R6699 */ + 0x0000, /* R6700 */ + 0x0000, /* R6701 */ + 0x0000, /* R6702 */ + 0x0000, /* R6703 */ + 0x0000, /* R6704 */ + 0x0000, /* R6705 */ + 0x0000, /* R6706 */ + 0x0000, /* R6707 */ + 0x0000, /* R6708 */ + 0x0000, /* R6709 */ + 0x0000, /* R6710 */ + 0x0000, /* R6711 */ + 0x0000, /* R6712 */ + 0x0000, /* R6713 */ + 0x0000, /* R6714 */ + 0x0000, /* R6715 */ + 0x0000, /* R6716 */ + 0x0000, /* R6717 */ + 0x0000, /* R6718 */ + 0x0000, /* R6719 */ + 0x0000, /* R6720 */ + 0x0000, /* R6721 */ + 0x0000, /* R6722 */ + 0x0000, /* R6723 */ + 0x0000, /* R6724 */ + 0x0000, /* R6725 */ + 0x0000, /* R6726 */ + 0x0000, /* R6727 */ + 0x0000, /* R6728 */ + 0x0000, /* R6729 */ + 0x0000, /* R6730 */ + 0x0000, /* R6731 */ + 0x0000, /* R6732 */ + 0x0000, /* R6733 */ + 0x0000, /* R6734 */ + 0x0000, /* R6735 */ + 0x0000, /* R6736 */ + 0x0000, /* R6737 */ + 0x0000, /* R6738 */ + 0x0000, /* R6739 */ + 0x0000, /* R6740 */ + 0x0000, /* R6741 */ + 0x0000, /* R6742 */ + 0x0000, /* R6743 */ + 0x0000, /* R6744 */ + 0x0000, /* R6745 */ + 0x0000, /* R6746 */ + 0x0000, /* R6747 */ + 0x0000, /* R6748 */ + 0x0000, /* R6749 */ + 0x0000, /* R6750 */ + 0x0000, /* R6751 */ + 0x0000, /* R6752 */ + 0x0000, /* R6753 */ + 0x0000, /* R6754 */ + 0x0000, /* R6755 */ + 0x0000, /* R6756 */ + 0x0000, /* R6757 */ + 0x0000, /* R6758 */ + 0x0000, /* R6759 */ + 0x0000, /* R6760 */ + 0x0000, /* R6761 */ + 0x0000, /* R6762 */ + 0x0000, /* R6763 */ + 0x0000, /* R6764 */ + 0x0000, /* R6765 */ + 0x0000, /* R6766 */ + 0x0000, /* R6767 */ + 0x0000, /* R6768 */ + 0x0000, /* R6769 */ + 0x0000, /* R6770 */ + 0x0000, /* R6771 */ + 0x0000, /* R6772 */ + 0x0000, /* R6773 */ + 0x0000, /* R6774 */ + 0x0000, /* R6775 */ + 0x0000, /* R6776 */ + 0x0000, /* R6777 */ + 0x0000, /* R6778 */ + 0x0000, /* R6779 */ + 0x0000, /* R6780 */ + 0x0000, /* R6781 */ + 0x0000, /* R6782 */ + 0x0000, /* R6783 */ + 0x0000, /* R6784 */ + 0x0000, /* R6785 */ + 0x0000, /* R6786 */ + 0x0000, /* R6787 */ + 0x0000, /* R6788 */ + 0x0000, /* R6789 */ + 0x0000, /* R6790 */ + 0x0000, /* R6791 */ + 0x0000, /* R6792 */ + 0x0000, /* R6793 */ + 0x0000, /* R6794 */ + 0x0000, /* R6795 */ + 0x0000, /* R6796 */ + 0x0000, /* R6797 */ + 0x0000, /* R6798 */ + 0x0000, /* R6799 */ + 0x0000, /* R6800 */ + 0x0000, /* R6801 */ + 0x0000, /* R6802 */ + 0x0000, /* R6803 */ + 0x0000, /* R6804 */ + 0x0000, /* R6805 */ + 0x0000, /* R6806 */ + 0x0000, /* R6807 */ + 0x0000, /* R6808 */ + 0x0000, /* R6809 */ + 0x0000, /* R6810 */ + 0x0000, /* R6811 */ + 0x0000, /* R6812 */ + 0x0000, /* R6813 */ + 0x0000, /* R6814 */ + 0x0000, /* R6815 */ + 0x0000, /* R6816 */ + 0x0000, /* R6817 */ + 0x0000, /* R6818 */ + 0x0000, /* R6819 */ + 0x0000, /* R6820 */ + 0x0000, /* R6821 */ + 0x0000, /* R6822 */ + 0x0000, /* R6823 */ + 0x0000, /* R6824 */ + 0x0000, /* R6825 */ + 0x0000, /* R6826 */ + 0x0000, /* R6827 */ + 0x0000, /* R6828 */ + 0x0000, /* R6829 */ + 0x0000, /* R6830 */ + 0x0000, /* R6831 */ + 0x0000, /* R6832 */ + 0x0000, /* R6833 */ + 0x0000, /* R6834 */ + 0x0000, /* R6835 */ + 0x0000, /* R6836 */ + 0x0000, /* R6837 */ + 0x0000, /* R6838 */ + 0x0000, /* R6839 */ + 0x0000, /* R6840 */ + 0x0000, /* R6841 */ + 0x0000, /* R6842 */ + 0x0000, /* R6843 */ + 0x0000, /* R6844 */ + 0x0000, /* R6845 */ + 0x0000, /* R6846 */ + 0x0000, /* R6847 */ + 0x0000, /* R6848 */ + 0x0000, /* R6849 */ + 0x0000, /* R6850 */ + 0x0000, /* R6851 */ + 0x0000, /* R6852 */ + 0x0000, /* R6853 */ + 0x0000, /* R6854 */ + 0x0000, /* R6855 */ + 0x0000, /* R6856 */ + 0x0000, /* R6857 */ + 0x0000, /* R6858 */ + 0x0000, /* R6859 */ + 0x0000, /* R6860 */ + 0x0000, /* R6861 */ + 0x0000, /* R6862 */ + 0x0000, /* R6863 */ + 0x0000, /* R6864 */ + 0x0000, /* R6865 */ + 0x0000, /* R6866 */ + 0x0000, /* R6867 */ + 0x0000, /* R6868 */ + 0x0000, /* R6869 */ + 0x0000, /* R6870 */ + 0x0000, /* R6871 */ + 0x0000, /* R6872 */ + 0x0000, /* R6873 */ + 0x0000, /* R6874 */ + 0x0000, /* R6875 */ + 0x0000, /* R6876 */ + 0x0000, /* R6877 */ + 0x0000, /* R6878 */ + 0x0000, /* R6879 */ + 0x0000, /* R6880 */ + 0x0000, /* R6881 */ + 0x0000, /* R6882 */ + 0x0000, /* R6883 */ + 0x0000, /* R6884 */ + 0x0000, /* R6885 */ + 0x0000, /* R6886 */ + 0x0000, /* R6887 */ + 0x0000, /* R6888 */ + 0x0000, /* R6889 */ + 0x0000, /* R6890 */ + 0x0000, /* R6891 */ + 0x0000, /* R6892 */ + 0x0000, /* R6893 */ + 0x0000, /* R6894 */ + 0x0000, /* R6895 */ + 0x0000, /* R6896 */ + 0x0000, /* R6897 */ + 0x0000, /* R6898 */ + 0x0000, /* R6899 */ + 0x0000, /* R6900 */ + 0x0000, /* R6901 */ + 0x0000, /* R6902 */ + 0x0000, /* R6903 */ + 0x0000, /* R6904 */ + 0x0000, /* R6905 */ + 0x0000, /* R6906 */ + 0x0000, /* R6907 */ + 0x0000, /* R6908 */ + 0x0000, /* R6909 */ + 0x0000, /* R6910 */ + 0x0000, /* R6911 */ + 0x0000, /* R6912 */ + 0x0000, /* R6913 */ + 0x0000, /* R6914 */ + 0x0000, /* R6915 */ + 0x0000, /* R6916 */ + 0x0000, /* R6917 */ + 0x0000, /* R6918 */ + 0x0000, /* R6919 */ + 0x0000, /* R6920 */ + 0x0000, /* R6921 */ + 0x0000, /* R6922 */ + 0x0000, /* R6923 */ + 0x0000, /* R6924 */ + 0x0000, /* R6925 */ + 0x0000, /* R6926 */ + 0x0000, /* R6927 */ + 0x0000, /* R6928 */ + 0x0000, /* R6929 */ + 0x0000, /* R6930 */ + 0x0000, /* R6931 */ + 0x0000, /* R6932 */ + 0x0000, /* R6933 */ + 0x0000, /* R6934 */ + 0x0000, /* R6935 */ + 0x0000, /* R6936 */ + 0x0000, /* R6937 */ + 0x0000, /* R6938 */ + 0x0000, /* R6939 */ + 0x0000, /* R6940 */ + 0x0000, /* R6941 */ + 0x0000, /* R6942 */ + 0x0000, /* R6943 */ + 0x0000, /* R6944 */ + 0x0000, /* R6945 */ + 0x0000, /* R6946 */ + 0x0000, /* R6947 */ + 0x0000, /* R6948 */ + 0x0000, /* R6949 */ + 0x0000, /* R6950 */ + 0x0000, /* R6951 */ + 0x0000, /* R6952 */ + 0x0000, /* R6953 */ + 0x0000, /* R6954 */ + 0x0000, /* R6955 */ + 0x0000, /* R6956 */ + 0x0000, /* R6957 */ + 0x0000, /* R6958 */ + 0x0000, /* R6959 */ + 0x0000, /* R6960 */ + 0x0000, /* R6961 */ + 0x0000, /* R6962 */ + 0x0000, /* R6963 */ + 0x0000, /* R6964 */ + 0x0000, /* R6965 */ + 0x0000, /* R6966 */ + 0x0000, /* R6967 */ + 0x0000, /* R6968 */ + 0x0000, /* R6969 */ + 0x0000, /* R6970 */ + 0x0000, /* R6971 */ + 0x0000, /* R6972 */ + 0x0000, /* R6973 */ + 0x0000, /* R6974 */ + 0x0000, /* R6975 */ + 0x0000, /* R6976 */ + 0x0000, /* R6977 */ + 0x0000, /* R6978 */ + 0x0000, /* R6979 */ + 0x0000, /* R6980 */ + 0x0000, /* R6981 */ + 0x0000, /* R6982 */ + 0x0000, /* R6983 */ + 0x0000, /* R6984 */ + 0x0000, /* R6985 */ + 0x0000, /* R6986 */ + 0x0000, /* R6987 */ + 0x0000, /* R6988 */ + 0x0000, /* R6989 */ + 0x0000, /* R6990 */ + 0x0000, /* R6991 */ + 0x0000, /* R6992 */ + 0x0000, /* R6993 */ + 0x0000, /* R6994 */ + 0x0000, /* R6995 */ + 0x0000, /* R6996 */ + 0x0000, /* R6997 */ + 0x0000, /* R6998 */ + 0x0000, /* R6999 */ + 0x0000, /* R7000 */ + 0x0000, /* R7001 */ + 0x0000, /* R7002 */ + 0x0000, /* R7003 */ + 0x0000, /* R7004 */ + 0x0000, /* R7005 */ + 0x0000, /* R7006 */ + 0x0000, /* R7007 */ + 0x0000, /* R7008 */ + 0x0000, /* R7009 */ + 0x0000, /* R7010 */ + 0x0000, /* R7011 */ + 0x0000, /* R7012 */ + 0x0000, /* R7013 */ + 0x0000, /* R7014 */ + 0x0000, /* R7015 */ + 0x0000, /* R7016 */ + 0x0000, /* R7017 */ + 0x0000, /* R7018 */ + 0x0000, /* R7019 */ + 0x0000, /* R7020 */ + 0x0000, /* R7021 */ + 0x0000, /* R7022 */ + 0x0000, /* R7023 */ + 0x0000, /* R7024 */ + 0x0000, /* R7025 */ + 0x0000, /* R7026 */ + 0x0000, /* R7027 */ + 0x0000, /* R7028 */ + 0x0000, /* R7029 */ + 0x0000, /* R7030 */ + 0x0000, /* R7031 */ + 0x0000, /* R7032 */ + 0x0000, /* R7033 */ + 0x0000, /* R7034 */ + 0x0000, /* R7035 */ + 0x0000, /* R7036 */ + 0x0000, /* R7037 */ + 0x0000, /* R7038 */ + 0x0000, /* R7039 */ + 0x0000, /* R7040 */ + 0x0000, /* R7041 */ + 0x0000, /* R7042 */ + 0x0000, /* R7043 */ + 0x0000, /* R7044 */ + 0x0000, /* R7045 */ + 0x0000, /* R7046 */ + 0x0000, /* R7047 */ + 0x0000, /* R7048 */ + 0x0000, /* R7049 */ + 0x0000, /* R7050 */ + 0x0000, /* R7051 */ + 0x0000, /* R7052 */ + 0x0000, /* R7053 */ + 0x0000, /* R7054 */ + 0x0000, /* R7055 */ + 0x0000, /* R7056 */ + 0x0000, /* R7057 */ + 0x0000, /* R7058 */ + 0x0000, /* R7059 */ + 0x0000, /* R7060 */ + 0x0000, /* R7061 */ + 0x0000, /* R7062 */ + 0x0000, /* R7063 */ + 0x0000, /* R7064 */ + 0x0000, /* R7065 */ + 0x0000, /* R7066 */ + 0x0000, /* R7067 */ + 0x0000, /* R7068 */ + 0x0000, /* R7069 */ + 0x0000, /* R7070 */ + 0x0000, /* R7071 */ + 0x0000, /* R7072 */ + 0x0000, /* R7073 */ + 0x0000, /* R7074 */ + 0x0000, /* R7075 */ + 0x0000, /* R7076 */ + 0x0000, /* R7077 */ + 0x0000, /* R7078 */ + 0x0000, /* R7079 */ + 0x0000, /* R7080 */ + 0x0000, /* R7081 */ + 0x0000, /* R7082 */ + 0x0000, /* R7083 */ + 0x0000, /* R7084 */ + 0x0000, /* R7085 */ + 0x0000, /* R7086 */ + 0x0000, /* R7087 */ + 0x0000, /* R7088 */ + 0x0000, /* R7089 */ + 0x0000, /* R7090 */ + 0x0000, /* R7091 */ + 0x0000, /* R7092 */ + 0x0000, /* R7093 */ + 0x0000, /* R7094 */ + 0x0000, /* R7095 */ + 0x0000, /* R7096 */ + 0x0000, /* R7097 */ + 0x0000, /* R7098 */ + 0x0000, /* R7099 */ + 0x0000, /* R7100 */ + 0x0000, /* R7101 */ + 0x0000, /* R7102 */ + 0x0000, /* R7103 */ + 0x0000, /* R7104 */ + 0x0000, /* R7105 */ + 0x0000, /* R7106 */ + 0x0000, /* R7107 */ + 0x0000, /* R7108 */ + 0x0000, /* R7109 */ + 0x0000, /* R7110 */ + 0x0000, /* R7111 */ + 0x0000, /* R7112 */ + 0x0000, /* R7113 */ + 0x0000, /* R7114 */ + 0x0000, /* R7115 */ + 0x0000, /* R7116 */ + 0x0000, /* R7117 */ + 0x0000, /* R7118 */ + 0x0000, /* R7119 */ + 0x0000, /* R7120 */ + 0x0000, /* R7121 */ + 0x0000, /* R7122 */ + 0x0000, /* R7123 */ + 0x0000, /* R7124 */ + 0x0000, /* R7125 */ + 0x0000, /* R7126 */ + 0x0000, /* R7127 */ + 0x0000, /* R7128 */ + 0x0000, /* R7129 */ + 0x0000, /* R7130 */ + 0x0000, /* R7131 */ + 0x0000, /* R7132 */ + 0x0000, /* R7133 */ + 0x0000, /* R7134 */ + 0x0000, /* R7135 */ + 0x0000, /* R7136 */ + 0x0000, /* R7137 */ + 0x0000, /* R7138 */ + 0x0000, /* R7139 */ + 0x0000, /* R7140 */ + 0x0000, /* R7141 */ + 0x0000, /* R7142 */ + 0x0000, /* R7143 */ + 0x0000, /* R7144 */ + 0x0000, /* R7145 */ + 0x0000, /* R7146 */ + 0x0000, /* R7147 */ + 0x0000, /* R7148 */ + 0x0000, /* R7149 */ + 0x0000, /* R7150 */ + 0x0000, /* R7151 */ + 0x0000, /* R7152 */ + 0x0000, /* R7153 */ + 0x0000, /* R7154 */ + 0x0000, /* R7155 */ + 0x0000, /* R7156 */ + 0x0000, /* R7157 */ + 0x0000, /* R7158 */ + 0x0000, /* R7159 */ + 0x0000, /* R7160 */ + 0x0000, /* R7161 */ + 0x0000, /* R7162 */ + 0x0000, /* R7163 */ + 0x0000, /* R7164 */ + 0x0000, /* R7165 */ + 0x0000, /* R7166 */ + 0x0000, /* R7167 */ + 0x0000, /* R7168 */ + 0x0000, /* R7169 */ + 0x0000, /* R7170 */ + 0x0000, /* R7171 */ + 0x0000, /* R7172 */ + 0x0000, /* R7173 */ + 0x0000, /* R7174 */ + 0x0000, /* R7175 */ + 0x0000, /* R7176 */ + 0x0000, /* R7177 */ + 0x0000, /* R7178 */ + 0x0000, /* R7179 */ + 0x0000, /* R7180 */ + 0x0000, /* R7181 */ + 0x0000, /* R7182 */ + 0x0000, /* R7183 */ + 0x0000, /* R7184 */ + 0x0000, /* R7185 */ + 0x0000, /* R7186 */ + 0x0000, /* R7187 */ + 0x0000, /* R7188 */ + 0x0000, /* R7189 */ + 0x0000, /* R7190 */ + 0x0000, /* R7191 */ + 0x0000, /* R7192 */ + 0x0000, /* R7193 */ + 0x0000, /* R7194 */ + 0x0000, /* R7195 */ + 0x0000, /* R7196 */ + 0x0000, /* R7197 */ + 0x0000, /* R7198 */ + 0x0000, /* R7199 */ + 0x0000, /* R7200 */ + 0x0000, /* R7201 */ + 0x0000, /* R7202 */ + 0x0000, /* R7203 */ + 0x0000, /* R7204 */ + 0x0000, /* R7205 */ + 0x0000, /* R7206 */ + 0x0000, /* R7207 */ + 0x0000, /* R7208 */ + 0x0000, /* R7209 */ + 0x0000, /* R7210 */ + 0x0000, /* R7211 */ + 0x0000, /* R7212 */ + 0x0000, /* R7213 */ + 0x0000, /* R7214 */ + 0x0000, /* R7215 */ + 0x0000, /* R7216 */ + 0x0000, /* R7217 */ + 0x0000, /* R7218 */ + 0x0000, /* R7219 */ + 0x0000, /* R7220 */ + 0x0000, /* R7221 */ + 0x0000, /* R7222 */ + 0x0000, /* R7223 */ + 0x0000, /* R7224 */ + 0x0000, /* R7225 */ + 0x0000, /* R7226 */ + 0x0000, /* R7227 */ + 0x0000, /* R7228 */ + 0x0000, /* R7229 */ + 0x0000, /* R7230 */ + 0x0000, /* R7231 */ + 0x0000, /* R7232 */ + 0x0000, /* R7233 */ + 0x0000, /* R7234 */ + 0x0000, /* R7235 */ + 0x0000, /* R7236 */ + 0x0000, /* R7237 */ + 0x0000, /* R7238 */ + 0x0000, /* R7239 */ + 0x0000, /* R7240 */ + 0x0000, /* R7241 */ + 0x0000, /* R7242 */ + 0x0000, /* R7243 */ + 0x0000, /* R7244 */ + 0x0000, /* R7245 */ + 0x0000, /* R7246 */ + 0x0000, /* R7247 */ + 0x0000, /* R7248 */ + 0x0000, /* R7249 */ + 0x0000, /* R7250 */ + 0x0000, /* R7251 */ + 0x0000, /* R7252 */ + 0x0000, /* R7253 */ + 0x0000, /* R7254 */ + 0x0000, /* R7255 */ + 0x0000, /* R7256 */ + 0x0000, /* R7257 */ + 0x0000, /* R7258 */ + 0x0000, /* R7259 */ + 0x0000, /* R7260 */ + 0x0000, /* R7261 */ + 0x0000, /* R7262 */ + 0x0000, /* R7263 */ + 0x0000, /* R7264 */ + 0x0000, /* R7265 */ + 0x0000, /* R7266 */ + 0x0000, /* R7267 */ + 0x0000, /* R7268 */ + 0x0000, /* R7269 */ + 0x0000, /* R7270 */ + 0x0000, /* R7271 */ + 0x0000, /* R7272 */ + 0x0000, /* R7273 */ + 0x0000, /* R7274 */ + 0x0000, /* R7275 */ + 0x0000, /* R7276 */ + 0x0000, /* R7277 */ + 0x0000, /* R7278 */ + 0x0000, /* R7279 */ + 0x0000, /* R7280 */ + 0x0000, /* R7281 */ + 0x0000, /* R7282 */ + 0x0000, /* R7283 */ + 0x0000, /* R7284 */ + 0x0000, /* R7285 */ + 0x0000, /* R7286 */ + 0x0000, /* R7287 */ + 0x0000, /* R7288 */ + 0x0000, /* R7289 */ + 0x0000, /* R7290 */ + 0x0000, /* R7291 */ + 0x0000, /* R7292 */ + 0x0000, /* R7293 */ + 0x0000, /* R7294 */ + 0x0000, /* R7295 */ + 0x0000, /* R7296 */ + 0x0000, /* R7297 */ + 0x0000, /* R7298 */ + 0x0000, /* R7299 */ + 0x0000, /* R7300 */ + 0x0000, /* R7301 */ + 0x0000, /* R7302 */ + 0x0000, /* R7303 */ + 0x0000, /* R7304 */ + 0x0000, /* R7305 */ + 0x0000, /* R7306 */ + 0x0000, /* R7307 */ + 0x0000, /* R7308 */ + 0x0000, /* R7309 */ + 0x0000, /* R7310 */ + 0x0000, /* R7311 */ + 0x0000, /* R7312 */ + 0x0000, /* R7313 */ + 0x0000, /* R7314 */ + 0x0000, /* R7315 */ + 0x0000, /* R7316 */ + 0x0000, /* R7317 */ + 0x0000, /* R7318 */ + 0x0000, /* R7319 */ + 0x0000, /* R7320 */ + 0x0000, /* R7321 */ + 0x0000, /* R7322 */ + 0x0000, /* R7323 */ + 0x0000, /* R7324 */ + 0x0000, /* R7325 */ + 0x0000, /* R7326 */ + 0x0000, /* R7327 */ + 0x0000, /* R7328 */ + 0x0000, /* R7329 */ + 0x0000, /* R7330 */ + 0x0000, /* R7331 */ + 0x0000, /* R7332 */ + 0x0000, /* R7333 */ + 0x0000, /* R7334 */ + 0x0000, /* R7335 */ + 0x0000, /* R7336 */ + 0x0000, /* R7337 */ + 0x0000, /* R7338 */ + 0x0000, /* R7339 */ + 0x0000, /* R7340 */ + 0x0000, /* R7341 */ + 0x0000, /* R7342 */ + 0x0000, /* R7343 */ + 0x0000, /* R7344 */ + 0x0000, /* R7345 */ + 0x0000, /* R7346 */ + 0x0000, /* R7347 */ + 0x0000, /* R7348 */ + 0x0000, /* R7349 */ + 0x0000, /* R7350 */ + 0x0000, /* R7351 */ + 0x0000, /* R7352 */ + 0x0000, /* R7353 */ + 0x0000, /* R7354 */ + 0x0000, /* R7355 */ + 0x0000, /* R7356 */ + 0x0000, /* R7357 */ + 0x0000, /* R7358 */ + 0x0000, /* R7359 */ + 0x0000, /* R7360 */ + 0x0000, /* R7361 */ + 0x0000, /* R7362 */ + 0x0000, /* R7363 */ + 0x0000, /* R7364 */ + 0x0000, /* R7365 */ + 0x0000, /* R7366 */ + 0x0000, /* R7367 */ + 0x0000, /* R7368 */ + 0x0000, /* R7369 */ + 0x0000, /* R7370 */ + 0x0000, /* R7371 */ + 0x0000, /* R7372 */ + 0x0000, /* R7373 */ + 0x0000, /* R7374 */ + 0x0000, /* R7375 */ + 0x0000, /* R7376 */ + 0x0000, /* R7377 */ + 0x0000, /* R7378 */ + 0x0000, /* R7379 */ + 0x0000, /* R7380 */ + 0x0000, /* R7381 */ + 0x0000, /* R7382 */ + 0x0000, /* R7383 */ + 0x0000, /* R7384 */ + 0x0000, /* R7385 */ + 0x0000, /* R7386 */ + 0x0000, /* R7387 */ + 0x0000, /* R7388 */ + 0x0000, /* R7389 */ + 0x0000, /* R7390 */ + 0x0000, /* R7391 */ + 0x0000, /* R7392 */ + 0x0000, /* R7393 */ + 0x0000, /* R7394 */ + 0x0000, /* R7395 */ + 0x0000, /* R7396 */ + 0x0000, /* R7397 */ + 0x0000, /* R7398 */ + 0x0000, /* R7399 */ + 0x0000, /* R7400 */ + 0x0000, /* R7401 */ + 0x0000, /* R7402 */ + 0x0000, /* R7403 */ + 0x0000, /* R7404 */ + 0x0000, /* R7405 */ + 0x0000, /* R7406 */ + 0x0000, /* R7407 */ + 0x0000, /* R7408 */ + 0x0000, /* R7409 */ + 0x0000, /* R7410 */ + 0x0000, /* R7411 */ + 0x0000, /* R7412 */ + 0x0000, /* R7413 */ + 0x0000, /* R7414 */ + 0x0000, /* R7415 */ + 0x0000, /* R7416 */ + 0x0000, /* R7417 */ + 0x0000, /* R7418 */ + 0x0000, /* R7419 */ + 0x0000, /* R7420 */ + 0x0000, /* R7421 */ + 0x0000, /* R7422 */ + 0x0000, /* R7423 */ + 0x0000, /* R7424 */ + 0x0000, /* R7425 */ + 0x0000, /* R7426 */ + 0x0000, /* R7427 */ + 0x0000, /* R7428 */ + 0x0000, /* R7429 */ + 0x0000, /* R7430 */ + 0x0000, /* R7431 */ + 0x0000, /* R7432 */ + 0x0000, /* R7433 */ + 0x0000, /* R7434 */ + 0x0000, /* R7435 */ + 0x0000, /* R7436 */ + 0x0000, /* R7437 */ + 0x0000, /* R7438 */ + 0x0000, /* R7439 */ + 0x0000, /* R7440 */ + 0x0000, /* R7441 */ + 0x0000, /* R7442 */ + 0x0000, /* R7443 */ + 0x0000, /* R7444 */ + 0x0000, /* R7445 */ + 0x0000, /* R7446 */ + 0x0000, /* R7447 */ + 0x0000, /* R7448 */ + 0x0000, /* R7449 */ + 0x0000, /* R7450 */ + 0x0000, /* R7451 */ + 0x0000, /* R7452 */ + 0x0000, /* R7453 */ + 0x0000, /* R7454 */ + 0x0000, /* R7455 */ + 0x0000, /* R7456 */ + 0x0000, /* R7457 */ + 0x0000, /* R7458 */ + 0x0000, /* R7459 */ + 0x0000, /* R7460 */ + 0x0000, /* R7461 */ + 0x0000, /* R7462 */ + 0x0000, /* R7463 */ + 0x0000, /* R7464 */ + 0x0000, /* R7465 */ + 0x0000, /* R7466 */ + 0x0000, /* R7467 */ + 0x0000, /* R7468 */ + 0x0000, /* R7469 */ + 0x0000, /* R7470 */ + 0x0000, /* R7471 */ + 0x0000, /* R7472 */ + 0x0000, /* R7473 */ + 0x0000, /* R7474 */ + 0x0000, /* R7475 */ + 0x0000, /* R7476 */ + 0x0000, /* R7477 */ + 0x0000, /* R7478 */ + 0x0000, /* R7479 */ + 0x0000, /* R7480 */ + 0x0000, /* R7481 */ + 0x0000, /* R7482 */ + 0x0000, /* R7483 */ + 0x0000, /* R7484 */ + 0x0000, /* R7485 */ + 0x0000, /* R7486 */ + 0x0000, /* R7487 */ + 0x0000, /* R7488 */ + 0x0000, /* R7489 */ + 0x0000, /* R7490 */ + 0x0000, /* R7491 */ + 0x0000, /* R7492 */ + 0x0000, /* R7493 */ + 0x0000, /* R7494 */ + 0x0000, /* R7495 */ + 0x0000, /* R7496 */ + 0x0000, /* R7497 */ + 0x0000, /* R7498 */ + 0x0000, /* R7499 */ + 0x0000, /* R7500 */ + 0x0000, /* R7501 */ + 0x0000, /* R7502 */ + 0x0000, /* R7503 */ + 0x0000, /* R7504 */ + 0x0000, /* R7505 */ + 0x0000, /* R7506 */ + 0x0000, /* R7507 */ + 0x0000, /* R7508 */ + 0x0000, /* R7509 */ + 0x0000, /* R7510 */ + 0x0000, /* R7511 */ + 0x0000, /* R7512 */ + 0x0000, /* R7513 */ + 0x0000, /* R7514 */ + 0x0000, /* R7515 */ + 0x0000, /* R7516 */ + 0x0000, /* R7517 */ + 0x0000, /* R7518 */ + 0x0000, /* R7519 */ + 0x0000, /* R7520 */ + 0x0000, /* R7521 */ + 0x0000, /* R7522 */ + 0x0000, /* R7523 */ + 0x0000, /* R7524 */ + 0x0000, /* R7525 */ + 0x0000, /* R7526 */ + 0x0000, /* R7527 */ + 0x0000, /* R7528 */ + 0x0000, /* R7529 */ + 0x0000, /* R7530 */ + 0x0000, /* R7531 */ + 0x0000, /* R7532 */ + 0x0000, /* R7533 */ + 0x0000, /* R7534 */ + 0x0000, /* R7535 */ + 0x0000, /* R7536 */ + 0x0000, /* R7537 */ + 0x0000, /* R7538 */ + 0x0000, /* R7539 */ + 0x0000, /* R7540 */ + 0x0000, /* R7541 */ + 0x0000, /* R7542 */ + 0x0000, /* R7543 */ + 0x0000, /* R7544 */ + 0x0000, /* R7545 */ + 0x0000, /* R7546 */ + 0x0000, /* R7547 */ + 0x0000, /* R7548 */ + 0x0000, /* R7549 */ + 0x0000, /* R7550 */ + 0x0000, /* R7551 */ + 0x0000, /* R7552 */ + 0x0000, /* R7553 */ + 0x0000, /* R7554 */ + 0x0000, /* R7555 */ + 0x0000, /* R7556 */ + 0x0000, /* R7557 */ + 0x0000, /* R7558 */ + 0x0000, /* R7559 */ + 0x0000, /* R7560 */ + 0x0000, /* R7561 */ + 0x0000, /* R7562 */ + 0x0000, /* R7563 */ + 0x0000, /* R7564 */ + 0x0000, /* R7565 */ + 0x0000, /* R7566 */ + 0x0000, /* R7567 */ + 0x0000, /* R7568 */ + 0x0000, /* R7569 */ + 0x0000, /* R7570 */ + 0x0000, /* R7571 */ + 0x0000, /* R7572 */ + 0x0000, /* R7573 */ + 0x0000, /* R7574 */ + 0x0000, /* R7575 */ + 0x0000, /* R7576 */ + 0x0000, /* R7577 */ + 0x0000, /* R7578 */ + 0x0000, /* R7579 */ + 0x0000, /* R7580 */ + 0x0000, /* R7581 */ + 0x0000, /* R7582 */ + 0x0000, /* R7583 */ + 0x0000, /* R7584 */ + 0x0000, /* R7585 */ + 0x0000, /* R7586 */ + 0x0000, /* R7587 */ + 0x0000, /* R7588 */ + 0x0000, /* R7589 */ + 0x0000, /* R7590 */ + 0x0000, /* R7591 */ + 0x0000, /* R7592 */ + 0x0000, /* R7593 */ + 0x0000, /* R7594 */ + 0x0000, /* R7595 */ + 0x0000, /* R7596 */ + 0x0000, /* R7597 */ + 0x0000, /* R7598 */ + 0x0000, /* R7599 */ + 0x0000, /* R7600 */ + 0x0000, /* R7601 */ + 0x0000, /* R7602 */ + 0x0000, /* R7603 */ + 0x0000, /* R7604 */ + 0x0000, /* R7605 */ + 0x0000, /* R7606 */ + 0x0000, /* R7607 */ + 0x0000, /* R7608 */ + 0x0000, /* R7609 */ + 0x0000, /* R7610 */ + 0x0000, /* R7611 */ + 0x0000, /* R7612 */ + 0x0000, /* R7613 */ + 0x0000, /* R7614 */ + 0x0000, /* R7615 */ + 0x0000, /* R7616 */ + 0x0000, /* R7617 */ + 0x0000, /* R7618 */ + 0x0000, /* R7619 */ + 0x0000, /* R7620 */ + 0x0000, /* R7621 */ + 0x0000, /* R7622 */ + 0x0000, /* R7623 */ + 0x0000, /* R7624 */ + 0x0000, /* R7625 */ + 0x0000, /* R7626 */ + 0x0000, /* R7627 */ + 0x0000, /* R7628 */ + 0x0000, /* R7629 */ + 0x0000, /* R7630 */ + 0x0000, /* R7631 */ + 0x0000, /* R7632 */ + 0x0000, /* R7633 */ + 0x0000, /* R7634 */ + 0x0000, /* R7635 */ + 0x0000, /* R7636 */ + 0x0000, /* R7637 */ + 0x0000, /* R7638 */ + 0x0000, /* R7639 */ + 0x0000, /* R7640 */ + 0x0000, /* R7641 */ + 0x0000, /* R7642 */ + 0x0000, /* R7643 */ + 0x0000, /* R7644 */ + 0x0000, /* R7645 */ + 0x0000, /* R7646 */ + 0x0000, /* R7647 */ + 0x0000, /* R7648 */ + 0x0000, /* R7649 */ + 0x0000, /* R7650 */ + 0x0000, /* R7651 */ + 0x0000, /* R7652 */ + 0x0000, /* R7653 */ + 0x0000, /* R7654 */ + 0x0000, /* R7655 */ + 0x0000, /* R7656 */ + 0x0000, /* R7657 */ + 0x0000, /* R7658 */ + 0x0000, /* R7659 */ + 0x0000, /* R7660 */ + 0x0000, /* R7661 */ + 0x0000, /* R7662 */ + 0x0000, /* R7663 */ + 0x0000, /* R7664 */ + 0x0000, /* R7665 */ + 0x0000, /* R7666 */ + 0x0000, /* R7667 */ + 0x0000, /* R7668 */ + 0x0000, /* R7669 */ + 0x0000, /* R7670 */ + 0x0000, /* R7671 */ + 0x0000, /* R7672 */ + 0x0000, /* R7673 */ + 0x0000, /* R7674 */ + 0x0000, /* R7675 */ + 0x0000, /* R7676 */ + 0x0000, /* R7677 */ + 0x0000, /* R7678 */ + 0x0000, /* R7679 */ + 0x0000, /* R7680 */ + 0x0000, /* R7681 */ + 0x0000, /* R7682 */ + 0x0000, /* R7683 */ + 0x0000, /* R7684 */ + 0x0000, /* R7685 */ + 0x0000, /* R7686 */ + 0x0000, /* R7687 */ + 0x0000, /* R7688 */ + 0x0000, /* R7689 */ + 0x0000, /* R7690 */ + 0x0000, /* R7691 */ + 0x0000, /* R7692 */ + 0x0000, /* R7693 */ + 0x0000, /* R7694 */ + 0x0000, /* R7695 */ + 0x0000, /* R7696 */ + 0x0000, /* R7697 */ + 0x0000, /* R7698 */ + 0x0000, /* R7699 */ + 0x0000, /* R7700 */ + 0x0000, /* R7701 */ + 0x0000, /* R7702 */ + 0x0000, /* R7703 */ + 0x0000, /* R7704 */ + 0x0000, /* R7705 */ + 0x0000, /* R7706 */ + 0x0000, /* R7707 */ + 0x0000, /* R7708 */ + 0x0000, /* R7709 */ + 0x0000, /* R7710 */ + 0x0000, /* R7711 */ + 0x0000, /* R7712 */ + 0x0000, /* R7713 */ + 0x0000, /* R7714 */ + 0x0000, /* R7715 */ + 0x0000, /* R7716 */ + 0x0000, /* R7717 */ + 0x0000, /* R7718 */ + 0x0000, /* R7719 */ + 0x0000, /* R7720 */ + 0x0000, /* R7721 */ + 0x0000, /* R7722 */ + 0x0000, /* R7723 */ + 0x0000, /* R7724 */ + 0x0000, /* R7725 */ + 0x0000, /* R7726 */ + 0x0000, /* R7727 */ + 0x0000, /* R7728 */ + 0x0000, /* R7729 */ + 0x0000, /* R7730 */ + 0x0000, /* R7731 */ + 0x0000, /* R7732 */ + 0x0000, /* R7733 */ + 0x0000, /* R7734 */ + 0x0000, /* R7735 */ + 0x0000, /* R7736 */ + 0x0000, /* R7737 */ + 0x0000, /* R7738 */ + 0x0000, /* R7739 */ + 0x0000, /* R7740 */ + 0x0000, /* R7741 */ + 0x0000, /* R7742 */ + 0x0000, /* R7743 */ + 0x0000, /* R7744 */ + 0x0000, /* R7745 */ + 0x0000, /* R7746 */ + 0x0000, /* R7747 */ + 0x0000, /* R7748 */ + 0x0000, /* R7749 */ + 0x0000, /* R7750 */ + 0x0000, /* R7751 */ + 0x0000, /* R7752 */ + 0x0000, /* R7753 */ + 0x0000, /* R7754 */ + 0x0000, /* R7755 */ + 0x0000, /* R7756 */ + 0x0000, /* R7757 */ + 0x0000, /* R7758 */ + 0x0000, /* R7759 */ + 0x0000, /* R7760 */ + 0x0000, /* R7761 */ + 0x0000, /* R7762 */ + 0x0000, /* R7763 */ + 0x0000, /* R7764 */ + 0x0000, /* R7765 */ + 0x0000, /* R7766 */ + 0x0000, /* R7767 */ + 0x0000, /* R7768 */ + 0x0000, /* R7769 */ + 0x0000, /* R7770 */ + 0x0000, /* R7771 */ + 0x0000, /* R7772 */ + 0x0000, /* R7773 */ + 0x0000, /* R7774 */ + 0x0000, /* R7775 */ + 0x0000, /* R7776 */ + 0x0000, /* R7777 */ + 0x0000, /* R7778 */ + 0x0000, /* R7779 */ + 0x0000, /* R7780 */ + 0x0000, /* R7781 */ + 0x0000, /* R7782 */ + 0x0000, /* R7783 */ + 0x0000, /* R7784 */ + 0x0000, /* R7785 */ + 0x0000, /* R7786 */ + 0x0000, /* R7787 */ + 0x0000, /* R7788 */ + 0x0000, /* R7789 */ + 0x0000, /* R7790 */ + 0x0000, /* R7791 */ + 0x0000, /* R7792 */ + 0x0000, /* R7793 */ + 0x0000, /* R7794 */ + 0x0000, /* R7795 */ + 0x0000, /* R7796 */ + 0x0000, /* R7797 */ + 0x0000, /* R7798 */ + 0x0000, /* R7799 */ + 0x0000, /* R7800 */ + 0x0000, /* R7801 */ + 0x0000, /* R7802 */ + 0x0000, /* R7803 */ + 0x0000, /* R7804 */ + 0x0000, /* R7805 */ + 0x0000, /* R7806 */ + 0x0000, /* R7807 */ + 0x0000, /* R7808 */ + 0x0000, /* R7809 */ + 0x0000, /* R7810 */ + 0x0000, /* R7811 */ + 0x0000, /* R7812 */ + 0x0000, /* R7813 */ + 0x0000, /* R7814 */ + 0x0000, /* R7815 */ + 0x0000, /* R7816 */ + 0x0000, /* R7817 */ + 0x0000, /* R7818 */ + 0x0000, /* R7819 */ + 0x0000, /* R7820 */ + 0x0000, /* R7821 */ + 0x0000, /* R7822 */ + 0x0000, /* R7823 */ + 0x0000, /* R7824 */ + 0x0000, /* R7825 */ + 0x0000, /* R7826 */ + 0x0000, /* R7827 */ + 0x0000, /* R7828 */ + 0x0000, /* R7829 */ + 0x0000, /* R7830 */ + 0x0000, /* R7831 */ + 0x0000, /* R7832 */ + 0x0000, /* R7833 */ + 0x0000, /* R7834 */ + 0x0000, /* R7835 */ + 0x0000, /* R7836 */ + 0x0000, /* R7837 */ + 0x0000, /* R7838 */ + 0x0000, /* R7839 */ + 0x0000, /* R7840 */ + 0x0000, /* R7841 */ + 0x0000, /* R7842 */ + 0x0000, /* R7843 */ + 0x0000, /* R7844 */ + 0x0000, /* R7845 */ + 0x0000, /* R7846 */ + 0x0000, /* R7847 */ + 0x0000, /* R7848 */ + 0x0000, /* R7849 */ + 0x0000, /* R7850 */ + 0x0000, /* R7851 */ + 0x0000, /* R7852 */ + 0x0000, /* R7853 */ + 0x0000, /* R7854 */ + 0x0000, /* R7855 */ + 0x0000, /* R7856 */ + 0x0000, /* R7857 */ + 0x0000, /* R7858 */ + 0x0000, /* R7859 */ + 0x0000, /* R7860 */ + 0x0000, /* R7861 */ + 0x0000, /* R7862 */ + 0x0000, /* R7863 */ + 0x0000, /* R7864 */ + 0x0000, /* R7865 */ + 0x0000, /* R7866 */ + 0x0000, /* R7867 */ + 0x0000, /* R7868 */ + 0x0000, /* R7869 */ + 0x0000, /* R7870 */ + 0x0000, /* R7871 */ + 0x0000, /* R7872 */ + 0x0000, /* R7873 */ + 0x0000, /* R7874 */ + 0x0000, /* R7875 */ + 0x0000, /* R7876 */ + 0x0000, /* R7877 */ + 0x0000, /* R7878 */ + 0x0000, /* R7879 */ + 0x0000, /* R7880 */ + 0x0000, /* R7881 */ + 0x0000, /* R7882 */ + 0x0000, /* R7883 */ + 0x0000, /* R7884 */ + 0x0000, /* R7885 */ + 0x0000, /* R7886 */ + 0x0000, /* R7887 */ + 0x0000, /* R7888 */ + 0x0000, /* R7889 */ + 0x0000, /* R7890 */ + 0x0000, /* R7891 */ + 0x0000, /* R7892 */ + 0x0000, /* R7893 */ + 0x0000, /* R7894 */ + 0x0000, /* R7895 */ + 0x0000, /* R7896 */ + 0x0000, /* R7897 */ + 0x0000, /* R7898 */ + 0x0000, /* R7899 */ + 0x0000, /* R7900 */ + 0x0000, /* R7901 */ + 0x0000, /* R7902 */ + 0x0000, /* R7903 */ + 0x0000, /* R7904 */ + 0x0000, /* R7905 */ + 0x0000, /* R7906 */ + 0x0000, /* R7907 */ + 0x0000, /* R7908 */ + 0x0000, /* R7909 */ + 0x0000, /* R7910 */ + 0x0000, /* R7911 */ + 0x0000, /* R7912 */ + 0x0000, /* R7913 */ + 0x0000, /* R7914 */ + 0x0000, /* R7915 */ + 0x0000, /* R7916 */ + 0x0000, /* R7917 */ + 0x0000, /* R7918 */ + 0x0000, /* R7919 */ + 0x0000, /* R7920 */ + 0x0000, /* R7921 */ + 0x0000, /* R7922 */ + 0x0000, /* R7923 */ + 0x0000, /* R7924 */ + 0x0000, /* R7925 */ + 0x0000, /* R7926 */ + 0x0000, /* R7927 */ + 0x0000, /* R7928 */ + 0x0000, /* R7929 */ + 0x0000, /* R7930 */ + 0x0000, /* R7931 */ + 0x0000, /* R7932 */ + 0x0000, /* R7933 */ + 0x0000, /* R7934 */ + 0x0000, /* R7935 */ + 0x0000, /* R7936 */ + 0x0000, /* R7937 */ + 0x0000, /* R7938 */ + 0x0000, /* R7939 */ + 0x0000, /* R7940 */ + 0x0000, /* R7941 */ + 0x0000, /* R7942 */ + 0x0000, /* R7943 */ + 0x0000, /* R7944 */ + 0x0000, /* R7945 */ + 0x0000, /* R7946 */ + 0x0000, /* R7947 */ + 0x0000, /* R7948 */ + 0x0000, /* R7949 */ + 0x0000, /* R7950 */ + 0x0000, /* R7951 */ + 0x0000, /* R7952 */ + 0x0000, /* R7953 */ + 0x0000, /* R7954 */ + 0x0000, /* R7955 */ + 0x0000, /* R7956 */ + 0x0000, /* R7957 */ + 0x0000, /* R7958 */ + 0x0000, /* R7959 */ + 0x0000, /* R7960 */ + 0x0000, /* R7961 */ + 0x0000, /* R7962 */ + 0x0000, /* R7963 */ + 0x0000, /* R7964 */ + 0x0000, /* R7965 */ + 0x0000, /* R7966 */ + 0x0000, /* R7967 */ + 0x0000, /* R7968 */ + 0x0000, /* R7969 */ + 0x0000, /* R7970 */ + 0x0000, /* R7971 */ + 0x0000, /* R7972 */ + 0x0000, /* R7973 */ + 0x0000, /* R7974 */ + 0x0000, /* R7975 */ + 0x0000, /* R7976 */ + 0x0000, /* R7977 */ + 0x0000, /* R7978 */ + 0x0000, /* R7979 */ + 0x0000, /* R7980 */ + 0x0000, /* R7981 */ + 0x0000, /* R7982 */ + 0x0000, /* R7983 */ + 0x0000, /* R7984 */ + 0x0000, /* R7985 */ + 0x0000, /* R7986 */ + 0x0000, /* R7987 */ + 0x0000, /* R7988 */ + 0x0000, /* R7989 */ + 0x0000, /* R7990 */ + 0x0000, /* R7991 */ + 0x0000, /* R7992 */ + 0x0000, /* R7993 */ + 0x0000, /* R7994 */ + 0x0000, /* R7995 */ + 0x0000, /* R7996 */ + 0x0000, /* R7997 */ + 0x0000, /* R7998 */ + 0x0000, /* R7999 */ + 0x0000, /* R8000 */ + 0x0000, /* R8001 */ + 0x0000, /* R8002 */ + 0x0000, /* R8003 */ + 0x0000, /* R8004 */ + 0x0000, /* R8005 */ + 0x0000, /* R8006 */ + 0x0000, /* R8007 */ + 0x0000, /* R8008 */ + 0x0000, /* R8009 */ + 0x0000, /* R8010 */ + 0x0000, /* R8011 */ + 0x0000, /* R8012 */ + 0x0000, /* R8013 */ + 0x0000, /* R8014 */ + 0x0000, /* R8015 */ + 0x0000, /* R8016 */ + 0x0000, /* R8017 */ + 0x0000, /* R8018 */ + 0x0000, /* R8019 */ + 0x0000, /* R8020 */ + 0x0000, /* R8021 */ + 0x0000, /* R8022 */ + 0x0000, /* R8023 */ + 0x0000, /* R8024 */ + 0x0000, /* R8025 */ + 0x0000, /* R8026 */ + 0x0000, /* R8027 */ + 0x0000, /* R8028 */ + 0x0000, /* R8029 */ + 0x0000, /* R8030 */ + 0x0000, /* R8031 */ + 0x0000, /* R8032 */ + 0x0000, /* R8033 */ + 0x0000, /* R8034 */ + 0x0000, /* R8035 */ + 0x0000, /* R8036 */ + 0x0000, /* R8037 */ + 0x0000, /* R8038 */ + 0x0000, /* R8039 */ + 0x0000, /* R8040 */ + 0x0000, /* R8041 */ + 0x0000, /* R8042 */ + 0x0000, /* R8043 */ + 0x0000, /* R8044 */ + 0x0000, /* R8045 */ + 0x0000, /* R8046 */ + 0x0000, /* R8047 */ + 0x0000, /* R8048 */ + 0x0000, /* R8049 */ + 0x0000, /* R8050 */ + 0x0000, /* R8051 */ + 0x0000, /* R8052 */ + 0x0000, /* R8053 */ + 0x0000, /* R8054 */ + 0x0000, /* R8055 */ + 0x0000, /* R8056 */ + 0x0000, /* R8057 */ + 0x0000, /* R8058 */ + 0x0000, /* R8059 */ + 0x0000, /* R8060 */ + 0x0000, /* R8061 */ + 0x0000, /* R8062 */ + 0x0000, /* R8063 */ + 0x0000, /* R8064 */ + 0x0000, /* R8065 */ + 0x0000, /* R8066 */ + 0x0000, /* R8067 */ + 0x0000, /* R8068 */ + 0x0000, /* R8069 */ + 0x0000, /* R8070 */ + 0x0000, /* R8071 */ + 0x0000, /* R8072 */ + 0x0000, /* R8073 */ + 0x0000, /* R8074 */ + 0x0000, /* R8075 */ + 0x0000, /* R8076 */ + 0x0000, /* R8077 */ + 0x0000, /* R8078 */ + 0x0000, /* R8079 */ + 0x0000, /* R8080 */ + 0x0000, /* R8081 */ + 0x0000, /* R8082 */ + 0x0000, /* R8083 */ + 0x0000, /* R8084 */ + 0x0000, /* R8085 */ + 0x0000, /* R8086 */ + 0x0000, /* R8087 */ + 0x0000, /* R8088 */ + 0x0000, /* R8089 */ + 0x0000, /* R8090 */ + 0x0000, /* R8091 */ + 0x0000, /* R8092 */ + 0x0000, /* R8093 */ + 0x0000, /* R8094 */ + 0x0000, /* R8095 */ + 0x0000, /* R8096 */ + 0x0000, /* R8097 */ + 0x0000, /* R8098 */ + 0x0000, /* R8099 */ + 0x0000, /* R8100 */ + 0x0000, /* R8101 */ + 0x0000, /* R8102 */ + 0x0000, /* R8103 */ + 0x0000, /* R8104 */ + 0x0000, /* R8105 */ + 0x0000, /* R8106 */ + 0x0000, /* R8107 */ + 0x0000, /* R8108 */ + 0x0000, /* R8109 */ + 0x0000, /* R8110 */ + 0x0000, /* R8111 */ + 0x0000, /* R8112 */ + 0x0000, /* R8113 */ + 0x0000, /* R8114 */ + 0x0000, /* R8115 */ + 0x0000, /* R8116 */ + 0x0000, /* R8117 */ + 0x0000, /* R8118 */ + 0x0000, /* R8119 */ + 0x0000, /* R8120 */ + 0x0000, /* R8121 */ + 0x0000, /* R8122 */ + 0x0000, /* R8123 */ + 0x0000, /* R8124 */ + 0x0000, /* R8125 */ + 0x0000, /* R8126 */ + 0x0000, /* R8127 */ + 0x0000, /* R8128 */ + 0x0000, /* R8129 */ + 0x0000, /* R8130 */ + 0x0000, /* R8131 */ + 0x0000, /* R8132 */ + 0x0000, /* R8133 */ + 0x0000, /* R8134 */ + 0x0000, /* R8135 */ + 0x0000, /* R8136 */ + 0x0000, /* R8137 */ + 0x0000, /* R8138 */ + 0x0000, /* R8139 */ + 0x0000, /* R8140 */ + 0x0000, /* R8141 */ + 0x0000, /* R8142 */ + 0x0000, /* R8143 */ + 0x0000, /* R8144 */ + 0x0000, /* R8145 */ + 0x0000, /* R8146 */ + 0x0000, /* R8147 */ + 0x0000, /* R8148 */ + 0x0000, /* R8149 */ + 0x0000, /* R8150 */ + 0x0000, /* R8151 */ + 0x0000, /* R8152 */ + 0x0000, /* R8153 */ + 0x0000, /* R8154 */ + 0x0000, /* R8155 */ + 0x0000, /* R8156 */ + 0x0000, /* R8157 */ + 0x0000, /* R8158 */ + 0x0000, /* R8159 */ + 0x0000, /* R8160 */ + 0x0000, /* R8161 */ + 0x0000, /* R8162 */ + 0x0000, /* R8163 */ + 0x0000, /* R8164 */ + 0x0000, /* R8165 */ + 0x0000, /* R8166 */ + 0x0000, /* R8167 */ + 0x0000, /* R8168 */ + 0x0000, /* R8169 */ + 0x0000, /* R8170 */ + 0x0000, /* R8171 */ + 0x0000, /* R8172 */ + 0x0000, /* R8173 */ + 0x0000, /* R8174 */ + 0x0000, /* R8175 */ + 0x0000, /* R8176 */ + 0x0000, /* R8177 */ + 0x0000, /* R8178 */ + 0x0000, /* R8179 */ + 0x0000, /* R8180 */ + 0x0000, /* R8181 */ + 0x0000, /* R8182 */ + 0x0000, /* R8183 */ + 0x0000, /* R8184 */ + 0x0000, /* R8185 */ + 0x0000, /* R8186 */ + 0x0000, /* R8187 */ + 0x0000, /* R8188 */ + 0x0000, /* R8189 */ + 0x0000, /* R8190 */ + 0x0000, /* R8191 */ + 0x0000, /* R8192 - DSP2 Instruction RAM 0 */ + 0x0000, /* R8193 */ + 0x0000, /* R8194 */ + 0x0000, /* R8195 */ + 0x0000, /* R8196 */ + 0x0000, /* R8197 */ + 0x0000, /* R8198 */ + 0x0000, /* R8199 */ + 0x0000, /* R8200 */ + 0x0000, /* R8201 */ + 0x0000, /* R8202 */ + 0x0000, /* R8203 */ + 0x0000, /* R8204 */ + 0x0000, /* R8205 */ + 0x0000, /* R8206 */ + 0x0000, /* R8207 */ + 0x0000, /* R8208 */ + 0x0000, /* R8209 */ + 0x0000, /* R8210 */ + 0x0000, /* R8211 */ + 0x0000, /* R8212 */ + 0x0000, /* R8213 */ + 0x0000, /* R8214 */ + 0x0000, /* R8215 */ + 0x0000, /* R8216 */ + 0x0000, /* R8217 */ + 0x0000, /* R8218 */ + 0x0000, /* R8219 */ + 0x0000, /* R8220 */ + 0x0000, /* R8221 */ + 0x0000, /* R8222 */ + 0x0000, /* R8223 */ + 0x0000, /* R8224 */ + 0x0000, /* R8225 */ + 0x0000, /* R8226 */ + 0x0000, /* R8227 */ + 0x0000, /* R8228 */ + 0x0000, /* R8229 */ + 0x0000, /* R8230 */ + 0x0000, /* R8231 */ + 0x0000, /* R8232 */ + 0x0000, /* R8233 */ + 0x0000, /* R8234 */ + 0x0000, /* R8235 */ + 0x0000, /* R8236 */ + 0x0000, /* R8237 */ + 0x0000, /* R8238 */ + 0x0000, /* R8239 */ + 0x0000, /* R8240 */ + 0x0000, /* R8241 */ + 0x0000, /* R8242 */ + 0x0000, /* R8243 */ + 0x0000, /* R8244 */ + 0x0000, /* R8245 */ + 0x0000, /* R8246 */ + 0x0000, /* R8247 */ + 0x0000, /* R8248 */ + 0x0000, /* R8249 */ + 0x0000, /* R8250 */ + 0x0000, /* R8251 */ + 0x0000, /* R8252 */ + 0x0000, /* R8253 */ + 0x0000, /* R8254 */ + 0x0000, /* R8255 */ + 0x0000, /* R8256 */ + 0x0000, /* R8257 */ + 0x0000, /* R8258 */ + 0x0000, /* R8259 */ + 0x0000, /* R8260 */ + 0x0000, /* R8261 */ + 0x0000, /* R8262 */ + 0x0000, /* R8263 */ + 0x0000, /* R8264 */ + 0x0000, /* R8265 */ + 0x0000, /* R8266 */ + 0x0000, /* R8267 */ + 0x0000, /* R8268 */ + 0x0000, /* R8269 */ + 0x0000, /* R8270 */ + 0x0000, /* R8271 */ + 0x0000, /* R8272 */ + 0x0000, /* R8273 */ + 0x0000, /* R8274 */ + 0x0000, /* R8275 */ + 0x0000, /* R8276 */ + 0x0000, /* R8277 */ + 0x0000, /* R8278 */ + 0x0000, /* R8279 */ + 0x0000, /* R8280 */ + 0x0000, /* R8281 */ + 0x0000, /* R8282 */ + 0x0000, /* R8283 */ + 0x0000, /* R8284 */ + 0x0000, /* R8285 */ + 0x0000, /* R8286 */ + 0x0000, /* R8287 */ + 0x0000, /* R8288 */ + 0x0000, /* R8289 */ + 0x0000, /* R8290 */ + 0x0000, /* R8291 */ + 0x0000, /* R8292 */ + 0x0000, /* R8293 */ + 0x0000, /* R8294 */ + 0x0000, /* R8295 */ + 0x0000, /* R8296 */ + 0x0000, /* R8297 */ + 0x0000, /* R8298 */ + 0x0000, /* R8299 */ + 0x0000, /* R8300 */ + 0x0000, /* R8301 */ + 0x0000, /* R8302 */ + 0x0000, /* R8303 */ + 0x0000, /* R8304 */ + 0x0000, /* R8305 */ + 0x0000, /* R8306 */ + 0x0000, /* R8307 */ + 0x0000, /* R8308 */ + 0x0000, /* R8309 */ + 0x0000, /* R8310 */ + 0x0000, /* R8311 */ + 0x0000, /* R8312 */ + 0x0000, /* R8313 */ + 0x0000, /* R8314 */ + 0x0000, /* R8315 */ + 0x0000, /* R8316 */ + 0x0000, /* R8317 */ + 0x0000, /* R8318 */ + 0x0000, /* R8319 */ + 0x0000, /* R8320 */ + 0x0000, /* R8321 */ + 0x0000, /* R8322 */ + 0x0000, /* R8323 */ + 0x0000, /* R8324 */ + 0x0000, /* R8325 */ + 0x0000, /* R8326 */ + 0x0000, /* R8327 */ + 0x0000, /* R8328 */ + 0x0000, /* R8329 */ + 0x0000, /* R8330 */ + 0x0000, /* R8331 */ + 0x0000, /* R8332 */ + 0x0000, /* R8333 */ + 0x0000, /* R8334 */ + 0x0000, /* R8335 */ + 0x0000, /* R8336 */ + 0x0000, /* R8337 */ + 0x0000, /* R8338 */ + 0x0000, /* R8339 */ + 0x0000, /* R8340 */ + 0x0000, /* R8341 */ + 0x0000, /* R8342 */ + 0x0000, /* R8343 */ + 0x0000, /* R8344 */ + 0x0000, /* R8345 */ + 0x0000, /* R8346 */ + 0x0000, /* R8347 */ + 0x0000, /* R8348 */ + 0x0000, /* R8349 */ + 0x0000, /* R8350 */ + 0x0000, /* R8351 */ + 0x0000, /* R8352 */ + 0x0000, /* R8353 */ + 0x0000, /* R8354 */ + 0x0000, /* R8355 */ + 0x0000, /* R8356 */ + 0x0000, /* R8357 */ + 0x0000, /* R8358 */ + 0x0000, /* R8359 */ + 0x0000, /* R8360 */ + 0x0000, /* R8361 */ + 0x0000, /* R8362 */ + 0x0000, /* R8363 */ + 0x0000, /* R8364 */ + 0x0000, /* R8365 */ + 0x0000, /* R8366 */ + 0x0000, /* R8367 */ + 0x0000, /* R8368 */ + 0x0000, /* R8369 */ + 0x0000, /* R8370 */ + 0x0000, /* R8371 */ + 0x0000, /* R8372 */ + 0x0000, /* R8373 */ + 0x0000, /* R8374 */ + 0x0000, /* R8375 */ + 0x0000, /* R8376 */ + 0x0000, /* R8377 */ + 0x0000, /* R8378 */ + 0x0000, /* R8379 */ + 0x0000, /* R8380 */ + 0x0000, /* R8381 */ + 0x0000, /* R8382 */ + 0x0000, /* R8383 */ + 0x0000, /* R8384 */ + 0x0000, /* R8385 */ + 0x0000, /* R8386 */ + 0x0000, /* R8387 */ + 0x0000, /* R8388 */ + 0x0000, /* R8389 */ + 0x0000, /* R8390 */ + 0x0000, /* R8391 */ + 0x0000, /* R8392 */ + 0x0000, /* R8393 */ + 0x0000, /* R8394 */ + 0x0000, /* R8395 */ + 0x0000, /* R8396 */ + 0x0000, /* R8397 */ + 0x0000, /* R8398 */ + 0x0000, /* R8399 */ + 0x0000, /* R8400 */ + 0x0000, /* R8401 */ + 0x0000, /* R8402 */ + 0x0000, /* R8403 */ + 0x0000, /* R8404 */ + 0x0000, /* R8405 */ + 0x0000, /* R8406 */ + 0x0000, /* R8407 */ + 0x0000, /* R8408 */ + 0x0000, /* R8409 */ + 0x0000, /* R8410 */ + 0x0000, /* R8411 */ + 0x0000, /* R8412 */ + 0x0000, /* R8413 */ + 0x0000, /* R8414 */ + 0x0000, /* R8415 */ + 0x0000, /* R8416 */ + 0x0000, /* R8417 */ + 0x0000, /* R8418 */ + 0x0000, /* R8419 */ + 0x0000, /* R8420 */ + 0x0000, /* R8421 */ + 0x0000, /* R8422 */ + 0x0000, /* R8423 */ + 0x0000, /* R8424 */ + 0x0000, /* R8425 */ + 0x0000, /* R8426 */ + 0x0000, /* R8427 */ + 0x0000, /* R8428 */ + 0x0000, /* R8429 */ + 0x0000, /* R8430 */ + 0x0000, /* R8431 */ + 0x0000, /* R8432 */ + 0x0000, /* R8433 */ + 0x0000, /* R8434 */ + 0x0000, /* R8435 */ + 0x0000, /* R8436 */ + 0x0000, /* R8437 */ + 0x0000, /* R8438 */ + 0x0000, /* R8439 */ + 0x0000, /* R8440 */ + 0x0000, /* R8441 */ + 0x0000, /* R8442 */ + 0x0000, /* R8443 */ + 0x0000, /* R8444 */ + 0x0000, /* R8445 */ + 0x0000, /* R8446 */ + 0x0000, /* R8447 */ + 0x0000, /* R8448 */ + 0x0000, /* R8449 */ + 0x0000, /* R8450 */ + 0x0000, /* R8451 */ + 0x0000, /* R8452 */ + 0x0000, /* R8453 */ + 0x0000, /* R8454 */ + 0x0000, /* R8455 */ + 0x0000, /* R8456 */ + 0x0000, /* R8457 */ + 0x0000, /* R8458 */ + 0x0000, /* R8459 */ + 0x0000, /* R8460 */ + 0x0000, /* R8461 */ + 0x0000, /* R8462 */ + 0x0000, /* R8463 */ + 0x0000, /* R8464 */ + 0x0000, /* R8465 */ + 0x0000, /* R8466 */ + 0x0000, /* R8467 */ + 0x0000, /* R8468 */ + 0x0000, /* R8469 */ + 0x0000, /* R8470 */ + 0x0000, /* R8471 */ + 0x0000, /* R8472 */ + 0x0000, /* R8473 */ + 0x0000, /* R8474 */ + 0x0000, /* R8475 */ + 0x0000, /* R8476 */ + 0x0000, /* R8477 */ + 0x0000, /* R8478 */ + 0x0000, /* R8479 */ + 0x0000, /* R8480 */ + 0x0000, /* R8481 */ + 0x0000, /* R8482 */ + 0x0000, /* R8483 */ + 0x0000, /* R8484 */ + 0x0000, /* R8485 */ + 0x0000, /* R8486 */ + 0x0000, /* R8487 */ + 0x0000, /* R8488 */ + 0x0000, /* R8489 */ + 0x0000, /* R8490 */ + 0x0000, /* R8491 */ + 0x0000, /* R8492 */ + 0x0000, /* R8493 */ + 0x0000, /* R8494 */ + 0x0000, /* R8495 */ + 0x0000, /* R8496 */ + 0x0000, /* R8497 */ + 0x0000, /* R8498 */ + 0x0000, /* R8499 */ + 0x0000, /* R8500 */ + 0x0000, /* R8501 */ + 0x0000, /* R8502 */ + 0x0000, /* R8503 */ + 0x0000, /* R8504 */ + 0x0000, /* R8505 */ + 0x0000, /* R8506 */ + 0x0000, /* R8507 */ + 0x0000, /* R8508 */ + 0x0000, /* R8509 */ + 0x0000, /* R8510 */ + 0x0000, /* R8511 */ + 0x0000, /* R8512 */ + 0x0000, /* R8513 */ + 0x0000, /* R8514 */ + 0x0000, /* R8515 */ + 0x0000, /* R8516 */ + 0x0000, /* R8517 */ + 0x0000, /* R8518 */ + 0x0000, /* R8519 */ + 0x0000, /* R8520 */ + 0x0000, /* R8521 */ + 0x0000, /* R8522 */ + 0x0000, /* R8523 */ + 0x0000, /* R8524 */ + 0x0000, /* R8525 */ + 0x0000, /* R8526 */ + 0x0000, /* R8527 */ + 0x0000, /* R8528 */ + 0x0000, /* R8529 */ + 0x0000, /* R8530 */ + 0x0000, /* R8531 */ + 0x0000, /* R8532 */ + 0x0000, /* R8533 */ + 0x0000, /* R8534 */ + 0x0000, /* R8535 */ + 0x0000, /* R8536 */ + 0x0000, /* R8537 */ + 0x0000, /* R8538 */ + 0x0000, /* R8539 */ + 0x0000, /* R8540 */ + 0x0000, /* R8541 */ + 0x0000, /* R8542 */ + 0x0000, /* R8543 */ + 0x0000, /* R8544 */ + 0x0000, /* R8545 */ + 0x0000, /* R8546 */ + 0x0000, /* R8547 */ + 0x0000, /* R8548 */ + 0x0000, /* R8549 */ + 0x0000, /* R8550 */ + 0x0000, /* R8551 */ + 0x0000, /* R8552 */ + 0x0000, /* R8553 */ + 0x0000, /* R8554 */ + 0x0000, /* R8555 */ + 0x0000, /* R8556 */ + 0x0000, /* R8557 */ + 0x0000, /* R8558 */ + 0x0000, /* R8559 */ + 0x0000, /* R8560 */ + 0x0000, /* R8561 */ + 0x0000, /* R8562 */ + 0x0000, /* R8563 */ + 0x0000, /* R8564 */ + 0x0000, /* R8565 */ + 0x0000, /* R8566 */ + 0x0000, /* R8567 */ + 0x0000, /* R8568 */ + 0x0000, /* R8569 */ + 0x0000, /* R8570 */ + 0x0000, /* R8571 */ + 0x0000, /* R8572 */ + 0x0000, /* R8573 */ + 0x0000, /* R8574 */ + 0x0000, /* R8575 */ + 0x0000, /* R8576 */ + 0x0000, /* R8577 */ + 0x0000, /* R8578 */ + 0x0000, /* R8579 */ + 0x0000, /* R8580 */ + 0x0000, /* R8581 */ + 0x0000, /* R8582 */ + 0x0000, /* R8583 */ + 0x0000, /* R8584 */ + 0x0000, /* R8585 */ + 0x0000, /* R8586 */ + 0x0000, /* R8587 */ + 0x0000, /* R8588 */ + 0x0000, /* R8589 */ + 0x0000, /* R8590 */ + 0x0000, /* R8591 */ + 0x0000, /* R8592 */ + 0x0000, /* R8593 */ + 0x0000, /* R8594 */ + 0x0000, /* R8595 */ + 0x0000, /* R8596 */ + 0x0000, /* R8597 */ + 0x0000, /* R8598 */ + 0x0000, /* R8599 */ + 0x0000, /* R8600 */ + 0x0000, /* R8601 */ + 0x0000, /* R8602 */ + 0x0000, /* R8603 */ + 0x0000, /* R8604 */ + 0x0000, /* R8605 */ + 0x0000, /* R8606 */ + 0x0000, /* R8607 */ + 0x0000, /* R8608 */ + 0x0000, /* R8609 */ + 0x0000, /* R8610 */ + 0x0000, /* R8611 */ + 0x0000, /* R8612 */ + 0x0000, /* R8613 */ + 0x0000, /* R8614 */ + 0x0000, /* R8615 */ + 0x0000, /* R8616 */ + 0x0000, /* R8617 */ + 0x0000, /* R8618 */ + 0x0000, /* R8619 */ + 0x0000, /* R8620 */ + 0x0000, /* R8621 */ + 0x0000, /* R8622 */ + 0x0000, /* R8623 */ + 0x0000, /* R8624 */ + 0x0000, /* R8625 */ + 0x0000, /* R8626 */ + 0x0000, /* R8627 */ + 0x0000, /* R8628 */ + 0x0000, /* R8629 */ + 0x0000, /* R8630 */ + 0x0000, /* R8631 */ + 0x0000, /* R8632 */ + 0x0000, /* R8633 */ + 0x0000, /* R8634 */ + 0x0000, /* R8635 */ + 0x0000, /* R8636 */ + 0x0000, /* R8637 */ + 0x0000, /* R8638 */ + 0x0000, /* R8639 */ + 0x0000, /* R8640 */ + 0x0000, /* R8641 */ + 0x0000, /* R8642 */ + 0x0000, /* R8643 */ + 0x0000, /* R8644 */ + 0x0000, /* R8645 */ + 0x0000, /* R8646 */ + 0x0000, /* R8647 */ + 0x0000, /* R8648 */ + 0x0000, /* R8649 */ + 0x0000, /* R8650 */ + 0x0000, /* R8651 */ + 0x0000, /* R8652 */ + 0x0000, /* R8653 */ + 0x0000, /* R8654 */ + 0x0000, /* R8655 */ + 0x0000, /* R8656 */ + 0x0000, /* R8657 */ + 0x0000, /* R8658 */ + 0x0000, /* R8659 */ + 0x0000, /* R8660 */ + 0x0000, /* R8661 */ + 0x0000, /* R8662 */ + 0x0000, /* R8663 */ + 0x0000, /* R8664 */ + 0x0000, /* R8665 */ + 0x0000, /* R8666 */ + 0x0000, /* R8667 */ + 0x0000, /* R8668 */ + 0x0000, /* R8669 */ + 0x0000, /* R8670 */ + 0x0000, /* R8671 */ + 0x0000, /* R8672 */ + 0x0000, /* R8673 */ + 0x0000, /* R8674 */ + 0x0000, /* R8675 */ + 0x0000, /* R8676 */ + 0x0000, /* R8677 */ + 0x0000, /* R8678 */ + 0x0000, /* R8679 */ + 0x0000, /* R8680 */ + 0x0000, /* R8681 */ + 0x0000, /* R8682 */ + 0x0000, /* R8683 */ + 0x0000, /* R8684 */ + 0x0000, /* R8685 */ + 0x0000, /* R8686 */ + 0x0000, /* R8687 */ + 0x0000, /* R8688 */ + 0x0000, /* R8689 */ + 0x0000, /* R8690 */ + 0x0000, /* R8691 */ + 0x0000, /* R8692 */ + 0x0000, /* R8693 */ + 0x0000, /* R8694 */ + 0x0000, /* R8695 */ + 0x0000, /* R8696 */ + 0x0000, /* R8697 */ + 0x0000, /* R8698 */ + 0x0000, /* R8699 */ + 0x0000, /* R8700 */ + 0x0000, /* R8701 */ + 0x0000, /* R8702 */ + 0x0000, /* R8703 */ + 0x0000, /* R8704 */ + 0x0000, /* R8705 */ + 0x0000, /* R8706 */ + 0x0000, /* R8707 */ + 0x0000, /* R8708 */ + 0x0000, /* R8709 */ + 0x0000, /* R8710 */ + 0x0000, /* R8711 */ + 0x0000, /* R8712 */ + 0x0000, /* R8713 */ + 0x0000, /* R8714 */ + 0x0000, /* R8715 */ + 0x0000, /* R8716 */ + 0x0000, /* R8717 */ + 0x0000, /* R8718 */ + 0x0000, /* R8719 */ + 0x0000, /* R8720 */ + 0x0000, /* R8721 */ + 0x0000, /* R8722 */ + 0x0000, /* R8723 */ + 0x0000, /* R8724 */ + 0x0000, /* R8725 */ + 0x0000, /* R8726 */ + 0x0000, /* R8727 */ + 0x0000, /* R8728 */ + 0x0000, /* R8729 */ + 0x0000, /* R8730 */ + 0x0000, /* R8731 */ + 0x0000, /* R8732 */ + 0x0000, /* R8733 */ + 0x0000, /* R8734 */ + 0x0000, /* R8735 */ + 0x0000, /* R8736 */ + 0x0000, /* R8737 */ + 0x0000, /* R8738 */ + 0x0000, /* R8739 */ + 0x0000, /* R8740 */ + 0x0000, /* R8741 */ + 0x0000, /* R8742 */ + 0x0000, /* R8743 */ + 0x0000, /* R8744 */ + 0x0000, /* R8745 */ + 0x0000, /* R8746 */ + 0x0000, /* R8747 */ + 0x0000, /* R8748 */ + 0x0000, /* R8749 */ + 0x0000, /* R8750 */ + 0x0000, /* R8751 */ + 0x0000, /* R8752 */ + 0x0000, /* R8753 */ + 0x0000, /* R8754 */ + 0x0000, /* R8755 */ + 0x0000, /* R8756 */ + 0x0000, /* R8757 */ + 0x0000, /* R8758 */ + 0x0000, /* R8759 */ + 0x0000, /* R8760 */ + 0x0000, /* R8761 */ + 0x0000, /* R8762 */ + 0x0000, /* R8763 */ + 0x0000, /* R8764 */ + 0x0000, /* R8765 */ + 0x0000, /* R8766 */ + 0x0000, /* R8767 */ + 0x0000, /* R8768 */ + 0x0000, /* R8769 */ + 0x0000, /* R8770 */ + 0x0000, /* R8771 */ + 0x0000, /* R8772 */ + 0x0000, /* R8773 */ + 0x0000, /* R8774 */ + 0x0000, /* R8775 */ + 0x0000, /* R8776 */ + 0x0000, /* R8777 */ + 0x0000, /* R8778 */ + 0x0000, /* R8779 */ + 0x0000, /* R8780 */ + 0x0000, /* R8781 */ + 0x0000, /* R8782 */ + 0x0000, /* R8783 */ + 0x0000, /* R8784 */ + 0x0000, /* R8785 */ + 0x0000, /* R8786 */ + 0x0000, /* R8787 */ + 0x0000, /* R8788 */ + 0x0000, /* R8789 */ + 0x0000, /* R8790 */ + 0x0000, /* R8791 */ + 0x0000, /* R8792 */ + 0x0000, /* R8793 */ + 0x0000, /* R8794 */ + 0x0000, /* R8795 */ + 0x0000, /* R8796 */ + 0x0000, /* R8797 */ + 0x0000, /* R8798 */ + 0x0000, /* R8799 */ + 0x0000, /* R8800 */ + 0x0000, /* R8801 */ + 0x0000, /* R8802 */ + 0x0000, /* R8803 */ + 0x0000, /* R8804 */ + 0x0000, /* R8805 */ + 0x0000, /* R8806 */ + 0x0000, /* R8807 */ + 0x0000, /* R8808 */ + 0x0000, /* R8809 */ + 0x0000, /* R8810 */ + 0x0000, /* R8811 */ + 0x0000, /* R8812 */ + 0x0000, /* R8813 */ + 0x0000, /* R8814 */ + 0x0000, /* R8815 */ + 0x0000, /* R8816 */ + 0x0000, /* R8817 */ + 0x0000, /* R8818 */ + 0x0000, /* R8819 */ + 0x0000, /* R8820 */ + 0x0000, /* R8821 */ + 0x0000, /* R8822 */ + 0x0000, /* R8823 */ + 0x0000, /* R8824 */ + 0x0000, /* R8825 */ + 0x0000, /* R8826 */ + 0x0000, /* R8827 */ + 0x0000, /* R8828 */ + 0x0000, /* R8829 */ + 0x0000, /* R8830 */ + 0x0000, /* R8831 */ + 0x0000, /* R8832 */ + 0x0000, /* R8833 */ + 0x0000, /* R8834 */ + 0x0000, /* R8835 */ + 0x0000, /* R8836 */ + 0x0000, /* R8837 */ + 0x0000, /* R8838 */ + 0x0000, /* R8839 */ + 0x0000, /* R8840 */ + 0x0000, /* R8841 */ + 0x0000, /* R8842 */ + 0x0000, /* R8843 */ + 0x0000, /* R8844 */ + 0x0000, /* R8845 */ + 0x0000, /* R8846 */ + 0x0000, /* R8847 */ + 0x0000, /* R8848 */ + 0x0000, /* R8849 */ + 0x0000, /* R8850 */ + 0x0000, /* R8851 */ + 0x0000, /* R8852 */ + 0x0000, /* R8853 */ + 0x0000, /* R8854 */ + 0x0000, /* R8855 */ + 0x0000, /* R8856 */ + 0x0000, /* R8857 */ + 0x0000, /* R8858 */ + 0x0000, /* R8859 */ + 0x0000, /* R8860 */ + 0x0000, /* R8861 */ + 0x0000, /* R8862 */ + 0x0000, /* R8863 */ + 0x0000, /* R8864 */ + 0x0000, /* R8865 */ + 0x0000, /* R8866 */ + 0x0000, /* R8867 */ + 0x0000, /* R8868 */ + 0x0000, /* R8869 */ + 0x0000, /* R8870 */ + 0x0000, /* R8871 */ + 0x0000, /* R8872 */ + 0x0000, /* R8873 */ + 0x0000, /* R8874 */ + 0x0000, /* R8875 */ + 0x0000, /* R8876 */ + 0x0000, /* R8877 */ + 0x0000, /* R8878 */ + 0x0000, /* R8879 */ + 0x0000, /* R8880 */ + 0x0000, /* R8881 */ + 0x0000, /* R8882 */ + 0x0000, /* R8883 */ + 0x0000, /* R8884 */ + 0x0000, /* R8885 */ + 0x0000, /* R8886 */ + 0x0000, /* R8887 */ + 0x0000, /* R8888 */ + 0x0000, /* R8889 */ + 0x0000, /* R8890 */ + 0x0000, /* R8891 */ + 0x0000, /* R8892 */ + 0x0000, /* R8893 */ + 0x0000, /* R8894 */ + 0x0000, /* R8895 */ + 0x0000, /* R8896 */ + 0x0000, /* R8897 */ + 0x0000, /* R8898 */ + 0x0000, /* R8899 */ + 0x0000, /* R8900 */ + 0x0000, /* R8901 */ + 0x0000, /* R8902 */ + 0x0000, /* R8903 */ + 0x0000, /* R8904 */ + 0x0000, /* R8905 */ + 0x0000, /* R8906 */ + 0x0000, /* R8907 */ + 0x0000, /* R8908 */ + 0x0000, /* R8909 */ + 0x0000, /* R8910 */ + 0x0000, /* R8911 */ + 0x0000, /* R8912 */ + 0x0000, /* R8913 */ + 0x0000, /* R8914 */ + 0x0000, /* R8915 */ + 0x0000, /* R8916 */ + 0x0000, /* R8917 */ + 0x0000, /* R8918 */ + 0x0000, /* R8919 */ + 0x0000, /* R8920 */ + 0x0000, /* R8921 */ + 0x0000, /* R8922 */ + 0x0000, /* R8923 */ + 0x0000, /* R8924 */ + 0x0000, /* R8925 */ + 0x0000, /* R8926 */ + 0x0000, /* R8927 */ + 0x0000, /* R8928 */ + 0x0000, /* R8929 */ + 0x0000, /* R8930 */ + 0x0000, /* R8931 */ + 0x0000, /* R8932 */ + 0x0000, /* R8933 */ + 0x0000, /* R8934 */ + 0x0000, /* R8935 */ + 0x0000, /* R8936 */ + 0x0000, /* R8937 */ + 0x0000, /* R8938 */ + 0x0000, /* R8939 */ + 0x0000, /* R8940 */ + 0x0000, /* R8941 */ + 0x0000, /* R8942 */ + 0x0000, /* R8943 */ + 0x0000, /* R8944 */ + 0x0000, /* R8945 */ + 0x0000, /* R8946 */ + 0x0000, /* R8947 */ + 0x0000, /* R8948 */ + 0x0000, /* R8949 */ + 0x0000, /* R8950 */ + 0x0000, /* R8951 */ + 0x0000, /* R8952 */ + 0x0000, /* R8953 */ + 0x0000, /* R8954 */ + 0x0000, /* R8955 */ + 0x0000, /* R8956 */ + 0x0000, /* R8957 */ + 0x0000, /* R8958 */ + 0x0000, /* R8959 */ + 0x0000, /* R8960 */ + 0x0000, /* R8961 */ + 0x0000, /* R8962 */ + 0x0000, /* R8963 */ + 0x0000, /* R8964 */ + 0x0000, /* R8965 */ + 0x0000, /* R8966 */ + 0x0000, /* R8967 */ + 0x0000, /* R8968 */ + 0x0000, /* R8969 */ + 0x0000, /* R8970 */ + 0x0000, /* R8971 */ + 0x0000, /* R8972 */ + 0x0000, /* R8973 */ + 0x0000, /* R8974 */ + 0x0000, /* R8975 */ + 0x0000, /* R8976 */ + 0x0000, /* R8977 */ + 0x0000, /* R8978 */ + 0x0000, /* R8979 */ + 0x0000, /* R8980 */ + 0x0000, /* R8981 */ + 0x0000, /* R8982 */ + 0x0000, /* R8983 */ + 0x0000, /* R8984 */ + 0x0000, /* R8985 */ + 0x0000, /* R8986 */ + 0x0000, /* R8987 */ + 0x0000, /* R8988 */ + 0x0000, /* R8989 */ + 0x0000, /* R8990 */ + 0x0000, /* R8991 */ + 0x0000, /* R8992 */ + 0x0000, /* R8993 */ + 0x0000, /* R8994 */ + 0x0000, /* R8995 */ + 0x0000, /* R8996 */ + 0x0000, /* R8997 */ + 0x0000, /* R8998 */ + 0x0000, /* R8999 */ + 0x0000, /* R9000 */ + 0x0000, /* R9001 */ + 0x0000, /* R9002 */ + 0x0000, /* R9003 */ + 0x0000, /* R9004 */ + 0x0000, /* R9005 */ + 0x0000, /* R9006 */ + 0x0000, /* R9007 */ + 0x0000, /* R9008 */ + 0x0000, /* R9009 */ + 0x0000, /* R9010 */ + 0x0000, /* R9011 */ + 0x0000, /* R9012 */ + 0x0000, /* R9013 */ + 0x0000, /* R9014 */ + 0x0000, /* R9015 */ + 0x0000, /* R9016 */ + 0x0000, /* R9017 */ + 0x0000, /* R9018 */ + 0x0000, /* R9019 */ + 0x0000, /* R9020 */ + 0x0000, /* R9021 */ + 0x0000, /* R9022 */ + 0x0000, /* R9023 */ + 0x0000, /* R9024 */ + 0x0000, /* R9025 */ + 0x0000, /* R9026 */ + 0x0000, /* R9027 */ + 0x0000, /* R9028 */ + 0x0000, /* R9029 */ + 0x0000, /* R9030 */ + 0x0000, /* R9031 */ + 0x0000, /* R9032 */ + 0x0000, /* R9033 */ + 0x0000, /* R9034 */ + 0x0000, /* R9035 */ + 0x0000, /* R9036 */ + 0x0000, /* R9037 */ + 0x0000, /* R9038 */ + 0x0000, /* R9039 */ + 0x0000, /* R9040 */ + 0x0000, /* R9041 */ + 0x0000, /* R9042 */ + 0x0000, /* R9043 */ + 0x0000, /* R9044 */ + 0x0000, /* R9045 */ + 0x0000, /* R9046 */ + 0x0000, /* R9047 */ + 0x0000, /* R9048 */ + 0x0000, /* R9049 */ + 0x0000, /* R9050 */ + 0x0000, /* R9051 */ + 0x0000, /* R9052 */ + 0x0000, /* R9053 */ + 0x0000, /* R9054 */ + 0x0000, /* R9055 */ + 0x0000, /* R9056 */ + 0x0000, /* R9057 */ + 0x0000, /* R9058 */ + 0x0000, /* R9059 */ + 0x0000, /* R9060 */ + 0x0000, /* R9061 */ + 0x0000, /* R9062 */ + 0x0000, /* R9063 */ + 0x0000, /* R9064 */ + 0x0000, /* R9065 */ + 0x0000, /* R9066 */ + 0x0000, /* R9067 */ + 0x0000, /* R9068 */ + 0x0000, /* R9069 */ + 0x0000, /* R9070 */ + 0x0000, /* R9071 */ + 0x0000, /* R9072 */ + 0x0000, /* R9073 */ + 0x0000, /* R9074 */ + 0x0000, /* R9075 */ + 0x0000, /* R9076 */ + 0x0000, /* R9077 */ + 0x0000, /* R9078 */ + 0x0000, /* R9079 */ + 0x0000, /* R9080 */ + 0x0000, /* R9081 */ + 0x0000, /* R9082 */ + 0x0000, /* R9083 */ + 0x0000, /* R9084 */ + 0x0000, /* R9085 */ + 0x0000, /* R9086 */ + 0x0000, /* R9087 */ + 0x0000, /* R9088 */ + 0x0000, /* R9089 */ + 0x0000, /* R9090 */ + 0x0000, /* R9091 */ + 0x0000, /* R9092 */ + 0x0000, /* R9093 */ + 0x0000, /* R9094 */ + 0x0000, /* R9095 */ + 0x0000, /* R9096 */ + 0x0000, /* R9097 */ + 0x0000, /* R9098 */ + 0x0000, /* R9099 */ + 0x0000, /* R9100 */ + 0x0000, /* R9101 */ + 0x0000, /* R9102 */ + 0x0000, /* R9103 */ + 0x0000, /* R9104 */ + 0x0000, /* R9105 */ + 0x0000, /* R9106 */ + 0x0000, /* R9107 */ + 0x0000, /* R9108 */ + 0x0000, /* R9109 */ + 0x0000, /* R9110 */ + 0x0000, /* R9111 */ + 0x0000, /* R9112 */ + 0x0000, /* R9113 */ + 0x0000, /* R9114 */ + 0x0000, /* R9115 */ + 0x0000, /* R9116 */ + 0x0000, /* R9117 */ + 0x0000, /* R9118 */ + 0x0000, /* R9119 */ + 0x0000, /* R9120 */ + 0x0000, /* R9121 */ + 0x0000, /* R9122 */ + 0x0000, /* R9123 */ + 0x0000, /* R9124 */ + 0x0000, /* R9125 */ + 0x0000, /* R9126 */ + 0x0000, /* R9127 */ + 0x0000, /* R9128 */ + 0x0000, /* R9129 */ + 0x0000, /* R9130 */ + 0x0000, /* R9131 */ + 0x0000, /* R9132 */ + 0x0000, /* R9133 */ + 0x0000, /* R9134 */ + 0x0000, /* R9135 */ + 0x0000, /* R9136 */ + 0x0000, /* R9137 */ + 0x0000, /* R9138 */ + 0x0000, /* R9139 */ + 0x0000, /* R9140 */ + 0x0000, /* R9141 */ + 0x0000, /* R9142 */ + 0x0000, /* R9143 */ + 0x0000, /* R9144 */ + 0x0000, /* R9145 */ + 0x0000, /* R9146 */ + 0x0000, /* R9147 */ + 0x0000, /* R9148 */ + 0x0000, /* R9149 */ + 0x0000, /* R9150 */ + 0x0000, /* R9151 */ + 0x0000, /* R9152 */ + 0x0000, /* R9153 */ + 0x0000, /* R9154 */ + 0x0000, /* R9155 */ + 0x0000, /* R9156 */ + 0x0000, /* R9157 */ + 0x0000, /* R9158 */ + 0x0000, /* R9159 */ + 0x0000, /* R9160 */ + 0x0000, /* R9161 */ + 0x0000, /* R9162 */ + 0x0000, /* R9163 */ + 0x0000, /* R9164 */ + 0x0000, /* R9165 */ + 0x0000, /* R9166 */ + 0x0000, /* R9167 */ + 0x0000, /* R9168 */ + 0x0000, /* R9169 */ + 0x0000, /* R9170 */ + 0x0000, /* R9171 */ + 0x0000, /* R9172 */ + 0x0000, /* R9173 */ + 0x0000, /* R9174 */ + 0x0000, /* R9175 */ + 0x0000, /* R9176 */ + 0x0000, /* R9177 */ + 0x0000, /* R9178 */ + 0x0000, /* R9179 */ + 0x0000, /* R9180 */ + 0x0000, /* R9181 */ + 0x0000, /* R9182 */ + 0x0000, /* R9183 */ + 0x0000, /* R9184 */ + 0x0000, /* R9185 */ + 0x0000, /* R9186 */ + 0x0000, /* R9187 */ + 0x0000, /* R9188 */ + 0x0000, /* R9189 */ + 0x0000, /* R9190 */ + 0x0000, /* R9191 */ + 0x0000, /* R9192 */ + 0x0000, /* R9193 */ + 0x0000, /* R9194 */ + 0x0000, /* R9195 */ + 0x0000, /* R9196 */ + 0x0000, /* R9197 */ + 0x0000, /* R9198 */ + 0x0000, /* R9199 */ + 0x0000, /* R9200 */ + 0x0000, /* R9201 */ + 0x0000, /* R9202 */ + 0x0000, /* R9203 */ + 0x0000, /* R9204 */ + 0x0000, /* R9205 */ + 0x0000, /* R9206 */ + 0x0000, /* R9207 */ + 0x0000, /* R9208 */ + 0x0000, /* R9209 */ + 0x0000, /* R9210 */ + 0x0000, /* R9211 */ + 0x0000, /* R9212 */ + 0x0000, /* R9213 */ + 0x0000, /* R9214 */ + 0x0000, /* R9215 */ + 0x0030, /* R9216 - DSP2 Address RAM 2 */ + 0x0000, /* R9217 - DSP2 Address RAM 1 */ + 0x0000, /* R9218 - DSP2 Address RAM 0 */ + 0x0000, /* R9219 */ + 0x0000, /* R9220 */ + 0x0000, /* R9221 */ + 0x0000, /* R9222 */ + 0x0000, /* R9223 */ + 0x0000, /* R9224 */ + 0x0000, /* R9225 */ + 0x0000, /* R9226 */ + 0x0000, /* R9227 */ + 0x0000, /* R9228 */ + 0x0000, /* R9229 */ + 0x0000, /* R9230 */ + 0x0000, /* R9231 */ + 0x0000, /* R9232 */ + 0x0000, /* R9233 */ + 0x0000, /* R9234 */ + 0x0000, /* R9235 */ + 0x0000, /* R9236 */ + 0x0000, /* R9237 */ + 0x0000, /* R9238 */ + 0x0000, /* R9239 */ + 0x0000, /* R9240 */ + 0x0000, /* R9241 */ + 0x0000, /* R9242 */ + 0x0000, /* R9243 */ + 0x0000, /* R9244 */ + 0x0000, /* R9245 */ + 0x0000, /* R9246 */ + 0x0000, /* R9247 */ + 0x0000, /* R9248 */ + 0x0000, /* R9249 */ + 0x0000, /* R9250 */ + 0x0000, /* R9251 */ + 0x0000, /* R9252 */ + 0x0000, /* R9253 */ + 0x0000, /* R9254 */ + 0x0000, /* R9255 */ + 0x0000, /* R9256 */ + 0x0000, /* R9257 */ + 0x0000, /* R9258 */ + 0x0000, /* R9259 */ + 0x0000, /* R9260 */ + 0x0000, /* R9261 */ + 0x0000, /* R9262 */ + 0x0000, /* R9263 */ + 0x0000, /* R9264 */ + 0x0000, /* R9265 */ + 0x0000, /* R9266 */ + 0x0000, /* R9267 */ + 0x0000, /* R9268 */ + 0x0000, /* R9269 */ + 0x0000, /* R9270 */ + 0x0000, /* R9271 */ + 0x0000, /* R9272 */ + 0x0000, /* R9273 */ + 0x0000, /* R9274 */ + 0x0000, /* R9275 */ + 0x0000, /* R9276 */ + 0x0000, /* R9277 */ + 0x0000, /* R9278 */ + 0x0000, /* R9279 */ + 0x0000, /* R9280 */ + 0x0000, /* R9281 */ + 0x0000, /* R9282 */ + 0x0000, /* R9283 */ + 0x0000, /* R9284 */ + 0x0000, /* R9285 */ + 0x0000, /* R9286 */ + 0x0000, /* R9287 */ + 0x0000, /* R9288 */ + 0x0000, /* R9289 */ + 0x0000, /* R9290 */ + 0x0000, /* R9291 */ + 0x0000, /* R9292 */ + 0x0000, /* R9293 */ + 0x0000, /* R9294 */ + 0x0000, /* R9295 */ + 0x0000, /* R9296 */ + 0x0000, /* R9297 */ + 0x0000, /* R9298 */ + 0x0000, /* R9299 */ + 0x0000, /* R9300 */ + 0x0000, /* R9301 */ + 0x0000, /* R9302 */ + 0x0000, /* R9303 */ + 0x0000, /* R9304 */ + 0x0000, /* R9305 */ + 0x0000, /* R9306 */ + 0x0000, /* R9307 */ + 0x0000, /* R9308 */ + 0x0000, /* R9309 */ + 0x0000, /* R9310 */ + 0x0000, /* R9311 */ + 0x0000, /* R9312 */ + 0x0000, /* R9313 */ + 0x0000, /* R9314 */ + 0x0000, /* R9315 */ + 0x0000, /* R9316 */ + 0x0000, /* R9317 */ + 0x0000, /* R9318 */ + 0x0000, /* R9319 */ + 0x0000, /* R9320 */ + 0x0000, /* R9321 */ + 0x0000, /* R9322 */ + 0x0000, /* R9323 */ + 0x0000, /* R9324 */ + 0x0000, /* R9325 */ + 0x0000, /* R9326 */ + 0x0000, /* R9327 */ + 0x0000, /* R9328 */ + 0x0000, /* R9329 */ + 0x0000, /* R9330 */ + 0x0000, /* R9331 */ + 0x0000, /* R9332 */ + 0x0000, /* R9333 */ + 0x0000, /* R9334 */ + 0x0000, /* R9335 */ + 0x0000, /* R9336 */ + 0x0000, /* R9337 */ + 0x0000, /* R9338 */ + 0x0000, /* R9339 */ + 0x0000, /* R9340 */ + 0x0000, /* R9341 */ + 0x0000, /* R9342 */ + 0x0000, /* R9343 */ + 0x0000, /* R9344 */ + 0x0000, /* R9345 */ + 0x0000, /* R9346 */ + 0x0000, /* R9347 */ + 0x0000, /* R9348 */ + 0x0000, /* R9349 */ + 0x0000, /* R9350 */ + 0x0000, /* R9351 */ + 0x0000, /* R9352 */ + 0x0000, /* R9353 */ + 0x0000, /* R9354 */ + 0x0000, /* R9355 */ + 0x0000, /* R9356 */ + 0x0000, /* R9357 */ + 0x0000, /* R9358 */ + 0x0000, /* R9359 */ + 0x0000, /* R9360 */ + 0x0000, /* R9361 */ + 0x0000, /* R9362 */ + 0x0000, /* R9363 */ + 0x0000, /* R9364 */ + 0x0000, /* R9365 */ + 0x0000, /* R9366 */ + 0x0000, /* R9367 */ + 0x0000, /* R9368 */ + 0x0000, /* R9369 */ + 0x0000, /* R9370 */ + 0x0000, /* R9371 */ + 0x0000, /* R9372 */ + 0x0000, /* R9373 */ + 0x0000, /* R9374 */ + 0x0000, /* R9375 */ + 0x0000, /* R9376 */ + 0x0000, /* R9377 */ + 0x0000, /* R9378 */ + 0x0000, /* R9379 */ + 0x0000, /* R9380 */ + 0x0000, /* R9381 */ + 0x0000, /* R9382 */ + 0x0000, /* R9383 */ + 0x0000, /* R9384 */ + 0x0000, /* R9385 */ + 0x0000, /* R9386 */ + 0x0000, /* R9387 */ + 0x0000, /* R9388 */ + 0x0000, /* R9389 */ + 0x0000, /* R9390 */ + 0x0000, /* R9391 */ + 0x0000, /* R9392 */ + 0x0000, /* R9393 */ + 0x0000, /* R9394 */ + 0x0000, /* R9395 */ + 0x0000, /* R9396 */ + 0x0000, /* R9397 */ + 0x0000, /* R9398 */ + 0x0000, /* R9399 */ + 0x0000, /* R9400 */ + 0x0000, /* R9401 */ + 0x0000, /* R9402 */ + 0x0000, /* R9403 */ + 0x0000, /* R9404 */ + 0x0000, /* R9405 */ + 0x0000, /* R9406 */ + 0x0000, /* R9407 */ + 0x0000, /* R9408 */ + 0x0000, /* R9409 */ + 0x0000, /* R9410 */ + 0x0000, /* R9411 */ + 0x0000, /* R9412 */ + 0x0000, /* R9413 */ + 0x0000, /* R9414 */ + 0x0000, /* R9415 */ + 0x0000, /* R9416 */ + 0x0000, /* R9417 */ + 0x0000, /* R9418 */ + 0x0000, /* R9419 */ + 0x0000, /* R9420 */ + 0x0000, /* R9421 */ + 0x0000, /* R9422 */ + 0x0000, /* R9423 */ + 0x0000, /* R9424 */ + 0x0000, /* R9425 */ + 0x0000, /* R9426 */ + 0x0000, /* R9427 */ + 0x0000, /* R9428 */ + 0x0000, /* R9429 */ + 0x0000, /* R9430 */ + 0x0000, /* R9431 */ + 0x0000, /* R9432 */ + 0x0000, /* R9433 */ + 0x0000, /* R9434 */ + 0x0000, /* R9435 */ + 0x0000, /* R9436 */ + 0x0000, /* R9437 */ + 0x0000, /* R9438 */ + 0x0000, /* R9439 */ + 0x0000, /* R9440 */ + 0x0000, /* R9441 */ + 0x0000, /* R9442 */ + 0x0000, /* R9443 */ + 0x0000, /* R9444 */ + 0x0000, /* R9445 */ + 0x0000, /* R9446 */ + 0x0000, /* R9447 */ + 0x0000, /* R9448 */ + 0x0000, /* R9449 */ + 0x0000, /* R9450 */ + 0x0000, /* R9451 */ + 0x0000, /* R9452 */ + 0x0000, /* R9453 */ + 0x0000, /* R9454 */ + 0x0000, /* R9455 */ + 0x0000, /* R9456 */ + 0x0000, /* R9457 */ + 0x0000, /* R9458 */ + 0x0000, /* R9459 */ + 0x0000, /* R9460 */ + 0x0000, /* R9461 */ + 0x0000, /* R9462 */ + 0x0000, /* R9463 */ + 0x0000, /* R9464 */ + 0x0000, /* R9465 */ + 0x0000, /* R9466 */ + 0x0000, /* R9467 */ + 0x0000, /* R9468 */ + 0x0000, /* R9469 */ + 0x0000, /* R9470 */ + 0x0000, /* R9471 */ + 0x0000, /* R9472 */ + 0x0000, /* R9473 */ + 0x0000, /* R9474 */ + 0x0000, /* R9475 */ + 0x0000, /* R9476 */ + 0x0000, /* R9477 */ + 0x0000, /* R9478 */ + 0x0000, /* R9479 */ + 0x0000, /* R9480 */ + 0x0000, /* R9481 */ + 0x0000, /* R9482 */ + 0x0000, /* R9483 */ + 0x0000, /* R9484 */ + 0x0000, /* R9485 */ + 0x0000, /* R9486 */ + 0x0000, /* R9487 */ + 0x0000, /* R9488 */ + 0x0000, /* R9489 */ + 0x0000, /* R9490 */ + 0x0000, /* R9491 */ + 0x0000, /* R9492 */ + 0x0000, /* R9493 */ + 0x0000, /* R9494 */ + 0x0000, /* R9495 */ + 0x0000, /* R9496 */ + 0x0000, /* R9497 */ + 0x0000, /* R9498 */ + 0x0000, /* R9499 */ + 0x0000, /* R9500 */ + 0x0000, /* R9501 */ + 0x0000, /* R9502 */ + 0x0000, /* R9503 */ + 0x0000, /* R9504 */ + 0x0000, /* R9505 */ + 0x0000, /* R9506 */ + 0x0000, /* R9507 */ + 0x0000, /* R9508 */ + 0x0000, /* R9509 */ + 0x0000, /* R9510 */ + 0x0000, /* R9511 */ + 0x0000, /* R9512 */ + 0x0000, /* R9513 */ + 0x0000, /* R9514 */ + 0x0000, /* R9515 */ + 0x0000, /* R9516 */ + 0x0000, /* R9517 */ + 0x0000, /* R9518 */ + 0x0000, /* R9519 */ + 0x0000, /* R9520 */ + 0x0000, /* R9521 */ + 0x0000, /* R9522 */ + 0x0000, /* R9523 */ + 0x0000, /* R9524 */ + 0x0000, /* R9525 */ + 0x0000, /* R9526 */ + 0x0000, /* R9527 */ + 0x0000, /* R9528 */ + 0x0000, /* R9529 */ + 0x0000, /* R9530 */ + 0x0000, /* R9531 */ + 0x0000, /* R9532 */ + 0x0000, /* R9533 */ + 0x0000, /* R9534 */ + 0x0000, /* R9535 */ + 0x0000, /* R9536 */ + 0x0000, /* R9537 */ + 0x0000, /* R9538 */ + 0x0000, /* R9539 */ + 0x0000, /* R9540 */ + 0x0000, /* R9541 */ + 0x0000, /* R9542 */ + 0x0000, /* R9543 */ + 0x0000, /* R9544 */ + 0x0000, /* R9545 */ + 0x0000, /* R9546 */ + 0x0000, /* R9547 */ + 0x0000, /* R9548 */ + 0x0000, /* R9549 */ + 0x0000, /* R9550 */ + 0x0000, /* R9551 */ + 0x0000, /* R9552 */ + 0x0000, /* R9553 */ + 0x0000, /* R9554 */ + 0x0000, /* R9555 */ + 0x0000, /* R9556 */ + 0x0000, /* R9557 */ + 0x0000, /* R9558 */ + 0x0000, /* R9559 */ + 0x0000, /* R9560 */ + 0x0000, /* R9561 */ + 0x0000, /* R9562 */ + 0x0000, /* R9563 */ + 0x0000, /* R9564 */ + 0x0000, /* R9565 */ + 0x0000, /* R9566 */ + 0x0000, /* R9567 */ + 0x0000, /* R9568 */ + 0x0000, /* R9569 */ + 0x0000, /* R9570 */ + 0x0000, /* R9571 */ + 0x0000, /* R9572 */ + 0x0000, /* R9573 */ + 0x0000, /* R9574 */ + 0x0000, /* R9575 */ + 0x0000, /* R9576 */ + 0x0000, /* R9577 */ + 0x0000, /* R9578 */ + 0x0000, /* R9579 */ + 0x0000, /* R9580 */ + 0x0000, /* R9581 */ + 0x0000, /* R9582 */ + 0x0000, /* R9583 */ + 0x0000, /* R9584 */ + 0x0000, /* R9585 */ + 0x0000, /* R9586 */ + 0x0000, /* R9587 */ + 0x0000, /* R9588 */ + 0x0000, /* R9589 */ + 0x0000, /* R9590 */ + 0x0000, /* R9591 */ + 0x0000, /* R9592 */ + 0x0000, /* R9593 */ + 0x0000, /* R9594 */ + 0x0000, /* R9595 */ + 0x0000, /* R9596 */ + 0x0000, /* R9597 */ + 0x0000, /* R9598 */ + 0x0000, /* R9599 */ + 0x0000, /* R9600 */ + 0x0000, /* R9601 */ + 0x0000, /* R9602 */ + 0x0000, /* R9603 */ + 0x0000, /* R9604 */ + 0x0000, /* R9605 */ + 0x0000, /* R9606 */ + 0x0000, /* R9607 */ + 0x0000, /* R9608 */ + 0x0000, /* R9609 */ + 0x0000, /* R9610 */ + 0x0000, /* R9611 */ + 0x0000, /* R9612 */ + 0x0000, /* R9613 */ + 0x0000, /* R9614 */ + 0x0000, /* R9615 */ + 0x0000, /* R9616 */ + 0x0000, /* R9617 */ + 0x0000, /* R9618 */ + 0x0000, /* R9619 */ + 0x0000, /* R9620 */ + 0x0000, /* R9621 */ + 0x0000, /* R9622 */ + 0x0000, /* R9623 */ + 0x0000, /* R9624 */ + 0x0000, /* R9625 */ + 0x0000, /* R9626 */ + 0x0000, /* R9627 */ + 0x0000, /* R9628 */ + 0x0000, /* R9629 */ + 0x0000, /* R9630 */ + 0x0000, /* R9631 */ + 0x0000, /* R9632 */ + 0x0000, /* R9633 */ + 0x0000, /* R9634 */ + 0x0000, /* R9635 */ + 0x0000, /* R9636 */ + 0x0000, /* R9637 */ + 0x0000, /* R9638 */ + 0x0000, /* R9639 */ + 0x0000, /* R9640 */ + 0x0000, /* R9641 */ + 0x0000, /* R9642 */ + 0x0000, /* R9643 */ + 0x0000, /* R9644 */ + 0x0000, /* R9645 */ + 0x0000, /* R9646 */ + 0x0000, /* R9647 */ + 0x0000, /* R9648 */ + 0x0000, /* R9649 */ + 0x0000, /* R9650 */ + 0x0000, /* R9651 */ + 0x0000, /* R9652 */ + 0x0000, /* R9653 */ + 0x0000, /* R9654 */ + 0x0000, /* R9655 */ + 0x0000, /* R9656 */ + 0x0000, /* R9657 */ + 0x0000, /* R9658 */ + 0x0000, /* R9659 */ + 0x0000, /* R9660 */ + 0x0000, /* R9661 */ + 0x0000, /* R9662 */ + 0x0000, /* R9663 */ + 0x0000, /* R9664 */ + 0x0000, /* R9665 */ + 0x0000, /* R9666 */ + 0x0000, /* R9667 */ + 0x0000, /* R9668 */ + 0x0000, /* R9669 */ + 0x0000, /* R9670 */ + 0x0000, /* R9671 */ + 0x0000, /* R9672 */ + 0x0000, /* R9673 */ + 0x0000, /* R9674 */ + 0x0000, /* R9675 */ + 0x0000, /* R9676 */ + 0x0000, /* R9677 */ + 0x0000, /* R9678 */ + 0x0000, /* R9679 */ + 0x0000, /* R9680 */ + 0x0000, /* R9681 */ + 0x0000, /* R9682 */ + 0x0000, /* R9683 */ + 0x0000, /* R9684 */ + 0x0000, /* R9685 */ + 0x0000, /* R9686 */ + 0x0000, /* R9687 */ + 0x0000, /* R9688 */ + 0x0000, /* R9689 */ + 0x0000, /* R9690 */ + 0x0000, /* R9691 */ + 0x0000, /* R9692 */ + 0x0000, /* R9693 */ + 0x0000, /* R9694 */ + 0x0000, /* R9695 */ + 0x0000, /* R9696 */ + 0x0000, /* R9697 */ + 0x0000, /* R9698 */ + 0x0000, /* R9699 */ + 0x0000, /* R9700 */ + 0x0000, /* R9701 */ + 0x0000, /* R9702 */ + 0x0000, /* R9703 */ + 0x0000, /* R9704 */ + 0x0000, /* R9705 */ + 0x0000, /* R9706 */ + 0x0000, /* R9707 */ + 0x0000, /* R9708 */ + 0x0000, /* R9709 */ + 0x0000, /* R9710 */ + 0x0000, /* R9711 */ + 0x0000, /* R9712 */ + 0x0000, /* R9713 */ + 0x0000, /* R9714 */ + 0x0000, /* R9715 */ + 0x0000, /* R9716 */ + 0x0000, /* R9717 */ + 0x0000, /* R9718 */ + 0x0000, /* R9719 */ + 0x0000, /* R9720 */ + 0x0000, /* R9721 */ + 0x0000, /* R9722 */ + 0x0000, /* R9723 */ + 0x0000, /* R9724 */ + 0x0000, /* R9725 */ + 0x0000, /* R9726 */ + 0x0000, /* R9727 */ + 0x0000, /* R9728 */ + 0x0000, /* R9729 */ + 0x0000, /* R9730 */ + 0x0000, /* R9731 */ + 0x0000, /* R9732 */ + 0x0000, /* R9733 */ + 0x0000, /* R9734 */ + 0x0000, /* R9735 */ + 0x0000, /* R9736 */ + 0x0000, /* R9737 */ + 0x0000, /* R9738 */ + 0x0000, /* R9739 */ + 0x0000, /* R9740 */ + 0x0000, /* R9741 */ + 0x0000, /* R9742 */ + 0x0000, /* R9743 */ + 0x0000, /* R9744 */ + 0x0000, /* R9745 */ + 0x0000, /* R9746 */ + 0x0000, /* R9747 */ + 0x0000, /* R9748 */ + 0x0000, /* R9749 */ + 0x0000, /* R9750 */ + 0x0000, /* R9751 */ + 0x0000, /* R9752 */ + 0x0000, /* R9753 */ + 0x0000, /* R9754 */ + 0x0000, /* R9755 */ + 0x0000, /* R9756 */ + 0x0000, /* R9757 */ + 0x0000, /* R9758 */ + 0x0000, /* R9759 */ + 0x0000, /* R9760 */ + 0x0000, /* R9761 */ + 0x0000, /* R9762 */ + 0x0000, /* R9763 */ + 0x0000, /* R9764 */ + 0x0000, /* R9765 */ + 0x0000, /* R9766 */ + 0x0000, /* R9767 */ + 0x0000, /* R9768 */ + 0x0000, /* R9769 */ + 0x0000, /* R9770 */ + 0x0000, /* R9771 */ + 0x0000, /* R9772 */ + 0x0000, /* R9773 */ + 0x0000, /* R9774 */ + 0x0000, /* R9775 */ + 0x0000, /* R9776 */ + 0x0000, /* R9777 */ + 0x0000, /* R9778 */ + 0x0000, /* R9779 */ + 0x0000, /* R9780 */ + 0x0000, /* R9781 */ + 0x0000, /* R9782 */ + 0x0000, /* R9783 */ + 0x0000, /* R9784 */ + 0x0000, /* R9785 */ + 0x0000, /* R9786 */ + 0x0000, /* R9787 */ + 0x0000, /* R9788 */ + 0x0000, /* R9789 */ + 0x0000, /* R9790 */ + 0x0000, /* R9791 */ + 0x0000, /* R9792 */ + 0x0000, /* R9793 */ + 0x0000, /* R9794 */ + 0x0000, /* R9795 */ + 0x0000, /* R9796 */ + 0x0000, /* R9797 */ + 0x0000, /* R9798 */ + 0x0000, /* R9799 */ + 0x0000, /* R9800 */ + 0x0000, /* R9801 */ + 0x0000, /* R9802 */ + 0x0000, /* R9803 */ + 0x0000, /* R9804 */ + 0x0000, /* R9805 */ + 0x0000, /* R9806 */ + 0x0000, /* R9807 */ + 0x0000, /* R9808 */ + 0x0000, /* R9809 */ + 0x0000, /* R9810 */ + 0x0000, /* R9811 */ + 0x0000, /* R9812 */ + 0x0000, /* R9813 */ + 0x0000, /* R9814 */ + 0x0000, /* R9815 */ + 0x0000, /* R9816 */ + 0x0000, /* R9817 */ + 0x0000, /* R9818 */ + 0x0000, /* R9819 */ + 0x0000, /* R9820 */ + 0x0000, /* R9821 */ + 0x0000, /* R9822 */ + 0x0000, /* R9823 */ + 0x0000, /* R9824 */ + 0x0000, /* R9825 */ + 0x0000, /* R9826 */ + 0x0000, /* R9827 */ + 0x0000, /* R9828 */ + 0x0000, /* R9829 */ + 0x0000, /* R9830 */ + 0x0000, /* R9831 */ + 0x0000, /* R9832 */ + 0x0000, /* R9833 */ + 0x0000, /* R9834 */ + 0x0000, /* R9835 */ + 0x0000, /* R9836 */ + 0x0000, /* R9837 */ + 0x0000, /* R9838 */ + 0x0000, /* R9839 */ + 0x0000, /* R9840 */ + 0x0000, /* R9841 */ + 0x0000, /* R9842 */ + 0x0000, /* R9843 */ + 0x0000, /* R9844 */ + 0x0000, /* R9845 */ + 0x0000, /* R9846 */ + 0x0000, /* R9847 */ + 0x0000, /* R9848 */ + 0x0000, /* R9849 */ + 0x0000, /* R9850 */ + 0x0000, /* R9851 */ + 0x0000, /* R9852 */ + 0x0000, /* R9853 */ + 0x0000, /* R9854 */ + 0x0000, /* R9855 */ + 0x0000, /* R9856 */ + 0x0000, /* R9857 */ + 0x0000, /* R9858 */ + 0x0000, /* R9859 */ + 0x0000, /* R9860 */ + 0x0000, /* R9861 */ + 0x0000, /* R9862 */ + 0x0000, /* R9863 */ + 0x0000, /* R9864 */ + 0x0000, /* R9865 */ + 0x0000, /* R9866 */ + 0x0000, /* R9867 */ + 0x0000, /* R9868 */ + 0x0000, /* R9869 */ + 0x0000, /* R9870 */ + 0x0000, /* R9871 */ + 0x0000, /* R9872 */ + 0x0000, /* R9873 */ + 0x0000, /* R9874 */ + 0x0000, /* R9875 */ + 0x0000, /* R9876 */ + 0x0000, /* R9877 */ + 0x0000, /* R9878 */ + 0x0000, /* R9879 */ + 0x0000, /* R9880 */ + 0x0000, /* R9881 */ + 0x0000, /* R9882 */ + 0x0000, /* R9883 */ + 0x0000, /* R9884 */ + 0x0000, /* R9885 */ + 0x0000, /* R9886 */ + 0x0000, /* R9887 */ + 0x0000, /* R9888 */ + 0x0000, /* R9889 */ + 0x0000, /* R9890 */ + 0x0000, /* R9891 */ + 0x0000, /* R9892 */ + 0x0000, /* R9893 */ + 0x0000, /* R9894 */ + 0x0000, /* R9895 */ + 0x0000, /* R9896 */ + 0x0000, /* R9897 */ + 0x0000, /* R9898 */ + 0x0000, /* R9899 */ + 0x0000, /* R9900 */ + 0x0000, /* R9901 */ + 0x0000, /* R9902 */ + 0x0000, /* R9903 */ + 0x0000, /* R9904 */ + 0x0000, /* R9905 */ + 0x0000, /* R9906 */ + 0x0000, /* R9907 */ + 0x0000, /* R9908 */ + 0x0000, /* R9909 */ + 0x0000, /* R9910 */ + 0x0000, /* R9911 */ + 0x0000, /* R9912 */ + 0x0000, /* R9913 */ + 0x0000, /* R9914 */ + 0x0000, /* R9915 */ + 0x0000, /* R9916 */ + 0x0000, /* R9917 */ + 0x0000, /* R9918 */ + 0x0000, /* R9919 */ + 0x0000, /* R9920 */ + 0x0000, /* R9921 */ + 0x0000, /* R9922 */ + 0x0000, /* R9923 */ + 0x0000, /* R9924 */ + 0x0000, /* R9925 */ + 0x0000, /* R9926 */ + 0x0000, /* R9927 */ + 0x0000, /* R9928 */ + 0x0000, /* R9929 */ + 0x0000, /* R9930 */ + 0x0000, /* R9931 */ + 0x0000, /* R9932 */ + 0x0000, /* R9933 */ + 0x0000, /* R9934 */ + 0x0000, /* R9935 */ + 0x0000, /* R9936 */ + 0x0000, /* R9937 */ + 0x0000, /* R9938 */ + 0x0000, /* R9939 */ + 0x0000, /* R9940 */ + 0x0000, /* R9941 */ + 0x0000, /* R9942 */ + 0x0000, /* R9943 */ + 0x0000, /* R9944 */ + 0x0000, /* R9945 */ + 0x0000, /* R9946 */ + 0x0000, /* R9947 */ + 0x0000, /* R9948 */ + 0x0000, /* R9949 */ + 0x0000, /* R9950 */ + 0x0000, /* R9951 */ + 0x0000, /* R9952 */ + 0x0000, /* R9953 */ + 0x0000, /* R9954 */ + 0x0000, /* R9955 */ + 0x0000, /* R9956 */ + 0x0000, /* R9957 */ + 0x0000, /* R9958 */ + 0x0000, /* R9959 */ + 0x0000, /* R9960 */ + 0x0000, /* R9961 */ + 0x0000, /* R9962 */ + 0x0000, /* R9963 */ + 0x0000, /* R9964 */ + 0x0000, /* R9965 */ + 0x0000, /* R9966 */ + 0x0000, /* R9967 */ + 0x0000, /* R9968 */ + 0x0000, /* R9969 */ + 0x0000, /* R9970 */ + 0x0000, /* R9971 */ + 0x0000, /* R9972 */ + 0x0000, /* R9973 */ + 0x0000, /* R9974 */ + 0x0000, /* R9975 */ + 0x0000, /* R9976 */ + 0x0000, /* R9977 */ + 0x0000, /* R9978 */ + 0x0000, /* R9979 */ + 0x0000, /* R9980 */ + 0x0000, /* R9981 */ + 0x0000, /* R9982 */ + 0x0000, /* R9983 */ + 0x0000, /* R9984 */ + 0x0000, /* R9985 */ + 0x0000, /* R9986 */ + 0x0000, /* R9987 */ + 0x0000, /* R9988 */ + 0x0000, /* R9989 */ + 0x0000, /* R9990 */ + 0x0000, /* R9991 */ + 0x0000, /* R9992 */ + 0x0000, /* R9993 */ + 0x0000, /* R9994 */ + 0x0000, /* R9995 */ + 0x0000, /* R9996 */ + 0x0000, /* R9997 */ + 0x0000, /* R9998 */ + 0x0000, /* R9999 */ + 0x0000, /* R10000 */ + 0x0000, /* R10001 */ + 0x0000, /* R10002 */ + 0x0000, /* R10003 */ + 0x0000, /* R10004 */ + 0x0000, /* R10005 */ + 0x0000, /* R10006 */ + 0x0000, /* R10007 */ + 0x0000, /* R10008 */ + 0x0000, /* R10009 */ + 0x0000, /* R10010 */ + 0x0000, /* R10011 */ + 0x0000, /* R10012 */ + 0x0000, /* R10013 */ + 0x0000, /* R10014 */ + 0x0000, /* R10015 */ + 0x0000, /* R10016 */ + 0x0000, /* R10017 */ + 0x0000, /* R10018 */ + 0x0000, /* R10019 */ + 0x0000, /* R10020 */ + 0x0000, /* R10021 */ + 0x0000, /* R10022 */ + 0x0000, /* R10023 */ + 0x0000, /* R10024 */ + 0x0000, /* R10025 */ + 0x0000, /* R10026 */ + 0x0000, /* R10027 */ + 0x0000, /* R10028 */ + 0x0000, /* R10029 */ + 0x0000, /* R10030 */ + 0x0000, /* R10031 */ + 0x0000, /* R10032 */ + 0x0000, /* R10033 */ + 0x0000, /* R10034 */ + 0x0000, /* R10035 */ + 0x0000, /* R10036 */ + 0x0000, /* R10037 */ + 0x0000, /* R10038 */ + 0x0000, /* R10039 */ + 0x0000, /* R10040 */ + 0x0000, /* R10041 */ + 0x0000, /* R10042 */ + 0x0000, /* R10043 */ + 0x0000, /* R10044 */ + 0x0000, /* R10045 */ + 0x0000, /* R10046 */ + 0x0000, /* R10047 */ + 0x0000, /* R10048 */ + 0x0000, /* R10049 */ + 0x0000, /* R10050 */ + 0x0000, /* R10051 */ + 0x0000, /* R10052 */ + 0x0000, /* R10053 */ + 0x0000, /* R10054 */ + 0x0000, /* R10055 */ + 0x0000, /* R10056 */ + 0x0000, /* R10057 */ + 0x0000, /* R10058 */ + 0x0000, /* R10059 */ + 0x0000, /* R10060 */ + 0x0000, /* R10061 */ + 0x0000, /* R10062 */ + 0x0000, /* R10063 */ + 0x0000, /* R10064 */ + 0x0000, /* R10065 */ + 0x0000, /* R10066 */ + 0x0000, /* R10067 */ + 0x0000, /* R10068 */ + 0x0000, /* R10069 */ + 0x0000, /* R10070 */ + 0x0000, /* R10071 */ + 0x0000, /* R10072 */ + 0x0000, /* R10073 */ + 0x0000, /* R10074 */ + 0x0000, /* R10075 */ + 0x0000, /* R10076 */ + 0x0000, /* R10077 */ + 0x0000, /* R10078 */ + 0x0000, /* R10079 */ + 0x0000, /* R10080 */ + 0x0000, /* R10081 */ + 0x0000, /* R10082 */ + 0x0000, /* R10083 */ + 0x0000, /* R10084 */ + 0x0000, /* R10085 */ + 0x0000, /* R10086 */ + 0x0000, /* R10087 */ + 0x0000, /* R10088 */ + 0x0000, /* R10089 */ + 0x0000, /* R10090 */ + 0x0000, /* R10091 */ + 0x0000, /* R10092 */ + 0x0000, /* R10093 */ + 0x0000, /* R10094 */ + 0x0000, /* R10095 */ + 0x0000, /* R10096 */ + 0x0000, /* R10097 */ + 0x0000, /* R10098 */ + 0x0000, /* R10099 */ + 0x0000, /* R10100 */ + 0x0000, /* R10101 */ + 0x0000, /* R10102 */ + 0x0000, /* R10103 */ + 0x0000, /* R10104 */ + 0x0000, /* R10105 */ + 0x0000, /* R10106 */ + 0x0000, /* R10107 */ + 0x0000, /* R10108 */ + 0x0000, /* R10109 */ + 0x0000, /* R10110 */ + 0x0000, /* R10111 */ + 0x0000, /* R10112 */ + 0x0000, /* R10113 */ + 0x0000, /* R10114 */ + 0x0000, /* R10115 */ + 0x0000, /* R10116 */ + 0x0000, /* R10117 */ + 0x0000, /* R10118 */ + 0x0000, /* R10119 */ + 0x0000, /* R10120 */ + 0x0000, /* R10121 */ + 0x0000, /* R10122 */ + 0x0000, /* R10123 */ + 0x0000, /* R10124 */ + 0x0000, /* R10125 */ + 0x0000, /* R10126 */ + 0x0000, /* R10127 */ + 0x0000, /* R10128 */ + 0x0000, /* R10129 */ + 0x0000, /* R10130 */ + 0x0000, /* R10131 */ + 0x0000, /* R10132 */ + 0x0000, /* R10133 */ + 0x0000, /* R10134 */ + 0x0000, /* R10135 */ + 0x0000, /* R10136 */ + 0x0000, /* R10137 */ + 0x0000, /* R10138 */ + 0x0000, /* R10139 */ + 0x0000, /* R10140 */ + 0x0000, /* R10141 */ + 0x0000, /* R10142 */ + 0x0000, /* R10143 */ + 0x0000, /* R10144 */ + 0x0000, /* R10145 */ + 0x0000, /* R10146 */ + 0x0000, /* R10147 */ + 0x0000, /* R10148 */ + 0x0000, /* R10149 */ + 0x0000, /* R10150 */ + 0x0000, /* R10151 */ + 0x0000, /* R10152 */ + 0x0000, /* R10153 */ + 0x0000, /* R10154 */ + 0x0000, /* R10155 */ + 0x0000, /* R10156 */ + 0x0000, /* R10157 */ + 0x0000, /* R10158 */ + 0x0000, /* R10159 */ + 0x0000, /* R10160 */ + 0x0000, /* R10161 */ + 0x0000, /* R10162 */ + 0x0000, /* R10163 */ + 0x0000, /* R10164 */ + 0x0000, /* R10165 */ + 0x0000, /* R10166 */ + 0x0000, /* R10167 */ + 0x0000, /* R10168 */ + 0x0000, /* R10169 */ + 0x0000, /* R10170 */ + 0x0000, /* R10171 */ + 0x0000, /* R10172 */ + 0x0000, /* R10173 */ + 0x0000, /* R10174 */ + 0x0000, /* R10175 */ + 0x0000, /* R10176 */ + 0x0000, /* R10177 */ + 0x0000, /* R10178 */ + 0x0000, /* R10179 */ + 0x0000, /* R10180 */ + 0x0000, /* R10181 */ + 0x0000, /* R10182 */ + 0x0000, /* R10183 */ + 0x0000, /* R10184 */ + 0x0000, /* R10185 */ + 0x0000, /* R10186 */ + 0x0000, /* R10187 */ + 0x0000, /* R10188 */ + 0x0000, /* R10189 */ + 0x0000, /* R10190 */ + 0x0000, /* R10191 */ + 0x0000, /* R10192 */ + 0x0000, /* R10193 */ + 0x0000, /* R10194 */ + 0x0000, /* R10195 */ + 0x0000, /* R10196 */ + 0x0000, /* R10197 */ + 0x0000, /* R10198 */ + 0x0000, /* R10199 */ + 0x0000, /* R10200 */ + 0x0000, /* R10201 */ + 0x0000, /* R10202 */ + 0x0000, /* R10203 */ + 0x0000, /* R10204 */ + 0x0000, /* R10205 */ + 0x0000, /* R10206 */ + 0x0000, /* R10207 */ + 0x0000, /* R10208 */ + 0x0000, /* R10209 */ + 0x0000, /* R10210 */ + 0x0000, /* R10211 */ + 0x0000, /* R10212 */ + 0x0000, /* R10213 */ + 0x0000, /* R10214 */ + 0x0000, /* R10215 */ + 0x0000, /* R10216 */ + 0x0000, /* R10217 */ + 0x0000, /* R10218 */ + 0x0000, /* R10219 */ + 0x0000, /* R10220 */ + 0x0000, /* R10221 */ + 0x0000, /* R10222 */ + 0x0000, /* R10223 */ + 0x0000, /* R10224 */ + 0x0000, /* R10225 */ + 0x0000, /* R10226 */ + 0x0000, /* R10227 */ + 0x0000, /* R10228 */ + 0x0000, /* R10229 */ + 0x0000, /* R10230 */ + 0x0000, /* R10231 */ + 0x0000, /* R10232 */ + 0x0000, /* R10233 */ + 0x0000, /* R10234 */ + 0x0000, /* R10235 */ + 0x0000, /* R10236 */ + 0x0000, /* R10237 */ + 0x0000, /* R10238 */ + 0x0000, /* R10239 */ + 0x0000, /* R10240 */ + 0x0000, /* R10241 */ + 0x0000, /* R10242 */ + 0x0000, /* R10243 */ + 0x0000, /* R10244 */ + 0x0000, /* R10245 */ + 0x0000, /* R10246 */ + 0x0000, /* R10247 */ + 0x0000, /* R10248 */ + 0x0000, /* R10249 */ + 0x0000, /* R10250 */ + 0x0000, /* R10251 */ + 0x0000, /* R10252 */ + 0x0000, /* R10253 */ + 0x0000, /* R10254 */ + 0x0000, /* R10255 */ + 0x0000, /* R10256 */ + 0x0000, /* R10257 */ + 0x0000, /* R10258 */ + 0x0000, /* R10259 */ + 0x0000, /* R10260 */ + 0x0000, /* R10261 */ + 0x0000, /* R10262 */ + 0x0000, /* R10263 */ + 0x0000, /* R10264 */ + 0x0000, /* R10265 */ + 0x0000, /* R10266 */ + 0x0000, /* R10267 */ + 0x0000, /* R10268 */ + 0x0000, /* R10269 */ + 0x0000, /* R10270 */ + 0x0000, /* R10271 */ + 0x0000, /* R10272 */ + 0x0000, /* R10273 */ + 0x0000, /* R10274 */ + 0x0000, /* R10275 */ + 0x0000, /* R10276 */ + 0x0000, /* R10277 */ + 0x0000, /* R10278 */ + 0x0000, /* R10279 */ + 0x0000, /* R10280 */ + 0x0000, /* R10281 */ + 0x0000, /* R10282 */ + 0x0000, /* R10283 */ + 0x0000, /* R10284 */ + 0x0000, /* R10285 */ + 0x0000, /* R10286 */ + 0x0000, /* R10287 */ + 0x0000, /* R10288 */ + 0x0000, /* R10289 */ + 0x0000, /* R10290 */ + 0x0000, /* R10291 */ + 0x0000, /* R10292 */ + 0x0000, /* R10293 */ + 0x0000, /* R10294 */ + 0x0000, /* R10295 */ + 0x0000, /* R10296 */ + 0x0000, /* R10297 */ + 0x0000, /* R10298 */ + 0x0000, /* R10299 */ + 0x0000, /* R10300 */ + 0x0000, /* R10301 */ + 0x0000, /* R10302 */ + 0x0000, /* R10303 */ + 0x0000, /* R10304 */ + 0x0000, /* R10305 */ + 0x0000, /* R10306 */ + 0x0000, /* R10307 */ + 0x0000, /* R10308 */ + 0x0000, /* R10309 */ + 0x0000, /* R10310 */ + 0x0000, /* R10311 */ + 0x0000, /* R10312 */ + 0x0000, /* R10313 */ + 0x0000, /* R10314 */ + 0x0000, /* R10315 */ + 0x0000, /* R10316 */ + 0x0000, /* R10317 */ + 0x0000, /* R10318 */ + 0x0000, /* R10319 */ + 0x0000, /* R10320 */ + 0x0000, /* R10321 */ + 0x0000, /* R10322 */ + 0x0000, /* R10323 */ + 0x0000, /* R10324 */ + 0x0000, /* R10325 */ + 0x0000, /* R10326 */ + 0x0000, /* R10327 */ + 0x0000, /* R10328 */ + 0x0000, /* R10329 */ + 0x0000, /* R10330 */ + 0x0000, /* R10331 */ + 0x0000, /* R10332 */ + 0x0000, /* R10333 */ + 0x0000, /* R10334 */ + 0x0000, /* R10335 */ + 0x0000, /* R10336 */ + 0x0000, /* R10337 */ + 0x0000, /* R10338 */ + 0x0000, /* R10339 */ + 0x0000, /* R10340 */ + 0x0000, /* R10341 */ + 0x0000, /* R10342 */ + 0x0000, /* R10343 */ + 0x0000, /* R10344 */ + 0x0000, /* R10345 */ + 0x0000, /* R10346 */ + 0x0000, /* R10347 */ + 0x0000, /* R10348 */ + 0x0000, /* R10349 */ + 0x0000, /* R10350 */ + 0x0000, /* R10351 */ + 0x0000, /* R10352 */ + 0x0000, /* R10353 */ + 0x0000, /* R10354 */ + 0x0000, /* R10355 */ + 0x0000, /* R10356 */ + 0x0000, /* R10357 */ + 0x0000, /* R10358 */ + 0x0000, /* R10359 */ + 0x0000, /* R10360 */ + 0x0000, /* R10361 */ + 0x0000, /* R10362 */ + 0x0000, /* R10363 */ + 0x0000, /* R10364 */ + 0x0000, /* R10365 */ + 0x0000, /* R10366 */ + 0x0000, /* R10367 */ + 0x0000, /* R10368 */ + 0x0000, /* R10369 */ + 0x0000, /* R10370 */ + 0x0000, /* R10371 */ + 0x0000, /* R10372 */ + 0x0000, /* R10373 */ + 0x0000, /* R10374 */ + 0x0000, /* R10375 */ + 0x0000, /* R10376 */ + 0x0000, /* R10377 */ + 0x0000, /* R10378 */ + 0x0000, /* R10379 */ + 0x0000, /* R10380 */ + 0x0000, /* R10381 */ + 0x0000, /* R10382 */ + 0x0000, /* R10383 */ + 0x0000, /* R10384 */ + 0x0000, /* R10385 */ + 0x0000, /* R10386 */ + 0x0000, /* R10387 */ + 0x0000, /* R10388 */ + 0x0000, /* R10389 */ + 0x0000, /* R10390 */ + 0x0000, /* R10391 */ + 0x0000, /* R10392 */ + 0x0000, /* R10393 */ + 0x0000, /* R10394 */ + 0x0000, /* R10395 */ + 0x0000, /* R10396 */ + 0x0000, /* R10397 */ + 0x0000, /* R10398 */ + 0x0000, /* R10399 */ + 0x0000, /* R10400 */ + 0x0000, /* R10401 */ + 0x0000, /* R10402 */ + 0x0000, /* R10403 */ + 0x0000, /* R10404 */ + 0x0000, /* R10405 */ + 0x0000, /* R10406 */ + 0x0000, /* R10407 */ + 0x0000, /* R10408 */ + 0x0000, /* R10409 */ + 0x0000, /* R10410 */ + 0x0000, /* R10411 */ + 0x0000, /* R10412 */ + 0x0000, /* R10413 */ + 0x0000, /* R10414 */ + 0x0000, /* R10415 */ + 0x0000, /* R10416 */ + 0x0000, /* R10417 */ + 0x0000, /* R10418 */ + 0x0000, /* R10419 */ + 0x0000, /* R10420 */ + 0x0000, /* R10421 */ + 0x0000, /* R10422 */ + 0x0000, /* R10423 */ + 0x0000, /* R10424 */ + 0x0000, /* R10425 */ + 0x0000, /* R10426 */ + 0x0000, /* R10427 */ + 0x0000, /* R10428 */ + 0x0000, /* R10429 */ + 0x0000, /* R10430 */ + 0x0000, /* R10431 */ + 0x0000, /* R10432 */ + 0x0000, /* R10433 */ + 0x0000, /* R10434 */ + 0x0000, /* R10435 */ + 0x0000, /* R10436 */ + 0x0000, /* R10437 */ + 0x0000, /* R10438 */ + 0x0000, /* R10439 */ + 0x0000, /* R10440 */ + 0x0000, /* R10441 */ + 0x0000, /* R10442 */ + 0x0000, /* R10443 */ + 0x0000, /* R10444 */ + 0x0000, /* R10445 */ + 0x0000, /* R10446 */ + 0x0000, /* R10447 */ + 0x0000, /* R10448 */ + 0x0000, /* R10449 */ + 0x0000, /* R10450 */ + 0x0000, /* R10451 */ + 0x0000, /* R10452 */ + 0x0000, /* R10453 */ + 0x0000, /* R10454 */ + 0x0000, /* R10455 */ + 0x0000, /* R10456 */ + 0x0000, /* R10457 */ + 0x0000, /* R10458 */ + 0x0000, /* R10459 */ + 0x0000, /* R10460 */ + 0x0000, /* R10461 */ + 0x0000, /* R10462 */ + 0x0000, /* R10463 */ + 0x0000, /* R10464 */ + 0x0000, /* R10465 */ + 0x0000, /* R10466 */ + 0x0000, /* R10467 */ + 0x0000, /* R10468 */ + 0x0000, /* R10469 */ + 0x0000, /* R10470 */ + 0x0000, /* R10471 */ + 0x0000, /* R10472 */ + 0x0000, /* R10473 */ + 0x0000, /* R10474 */ + 0x0000, /* R10475 */ + 0x0000, /* R10476 */ + 0x0000, /* R10477 */ + 0x0000, /* R10478 */ + 0x0000, /* R10479 */ + 0x0000, /* R10480 */ + 0x0000, /* R10481 */ + 0x0000, /* R10482 */ + 0x0000, /* R10483 */ + 0x0000, /* R10484 */ + 0x0000, /* R10485 */ + 0x0000, /* R10486 */ + 0x0000, /* R10487 */ + 0x0000, /* R10488 */ + 0x0000, /* R10489 */ + 0x0000, /* R10490 */ + 0x0000, /* R10491 */ + 0x0000, /* R10492 */ + 0x0000, /* R10493 */ + 0x0000, /* R10494 */ + 0x0000, /* R10495 */ + 0x0000, /* R10496 */ + 0x0000, /* R10497 */ + 0x0000, /* R10498 */ + 0x0000, /* R10499 */ + 0x0000, /* R10500 */ + 0x0000, /* R10501 */ + 0x0000, /* R10502 */ + 0x0000, /* R10503 */ + 0x0000, /* R10504 */ + 0x0000, /* R10505 */ + 0x0000, /* R10506 */ + 0x0000, /* R10507 */ + 0x0000, /* R10508 */ + 0x0000, /* R10509 */ + 0x0000, /* R10510 */ + 0x0000, /* R10511 */ + 0x0000, /* R10512 */ + 0x0000, /* R10513 */ + 0x0000, /* R10514 */ + 0x0000, /* R10515 */ + 0x0000, /* R10516 */ + 0x0000, /* R10517 */ + 0x0000, /* R10518 */ + 0x0000, /* R10519 */ + 0x0000, /* R10520 */ + 0x0000, /* R10521 */ + 0x0000, /* R10522 */ + 0x0000, /* R10523 */ + 0x0000, /* R10524 */ + 0x0000, /* R10525 */ + 0x0000, /* R10526 */ + 0x0000, /* R10527 */ + 0x0000, /* R10528 */ + 0x0000, /* R10529 */ + 0x0000, /* R10530 */ + 0x0000, /* R10531 */ + 0x0000, /* R10532 */ + 0x0000, /* R10533 */ + 0x0000, /* R10534 */ + 0x0000, /* R10535 */ + 0x0000, /* R10536 */ + 0x0000, /* R10537 */ + 0x0000, /* R10538 */ + 0x0000, /* R10539 */ + 0x0000, /* R10540 */ + 0x0000, /* R10541 */ + 0x0000, /* R10542 */ + 0x0000, /* R10543 */ + 0x0000, /* R10544 */ + 0x0000, /* R10545 */ + 0x0000, /* R10546 */ + 0x0000, /* R10547 */ + 0x0000, /* R10548 */ + 0x0000, /* R10549 */ + 0x0000, /* R10550 */ + 0x0000, /* R10551 */ + 0x0000, /* R10552 */ + 0x0000, /* R10553 */ + 0x0000, /* R10554 */ + 0x0000, /* R10555 */ + 0x0000, /* R10556 */ + 0x0000, /* R10557 */ + 0x0000, /* R10558 */ + 0x0000, /* R10559 */ + 0x0000, /* R10560 */ + 0x0000, /* R10561 */ + 0x0000, /* R10562 */ + 0x0000, /* R10563 */ + 0x0000, /* R10564 */ + 0x0000, /* R10565 */ + 0x0000, /* R10566 */ + 0x0000, /* R10567 */ + 0x0000, /* R10568 */ + 0x0000, /* R10569 */ + 0x0000, /* R10570 */ + 0x0000, /* R10571 */ + 0x0000, /* R10572 */ + 0x0000, /* R10573 */ + 0x0000, /* R10574 */ + 0x0000, /* R10575 */ + 0x0000, /* R10576 */ + 0x0000, /* R10577 */ + 0x0000, /* R10578 */ + 0x0000, /* R10579 */ + 0x0000, /* R10580 */ + 0x0000, /* R10581 */ + 0x0000, /* R10582 */ + 0x0000, /* R10583 */ + 0x0000, /* R10584 */ + 0x0000, /* R10585 */ + 0x0000, /* R10586 */ + 0x0000, /* R10587 */ + 0x0000, /* R10588 */ + 0x0000, /* R10589 */ + 0x0000, /* R10590 */ + 0x0000, /* R10591 */ + 0x0000, /* R10592 */ + 0x0000, /* R10593 */ + 0x0000, /* R10594 */ + 0x0000, /* R10595 */ + 0x0000, /* R10596 */ + 0x0000, /* R10597 */ + 0x0000, /* R10598 */ + 0x0000, /* R10599 */ + 0x0000, /* R10600 */ + 0x0000, /* R10601 */ + 0x0000, /* R10602 */ + 0x0000, /* R10603 */ + 0x0000, /* R10604 */ + 0x0000, /* R10605 */ + 0x0000, /* R10606 */ + 0x0000, /* R10607 */ + 0x0000, /* R10608 */ + 0x0000, /* R10609 */ + 0x0000, /* R10610 */ + 0x0000, /* R10611 */ + 0x0000, /* R10612 */ + 0x0000, /* R10613 */ + 0x0000, /* R10614 */ + 0x0000, /* R10615 */ + 0x0000, /* R10616 */ + 0x0000, /* R10617 */ + 0x0000, /* R10618 */ + 0x0000, /* R10619 */ + 0x0000, /* R10620 */ + 0x0000, /* R10621 */ + 0x0000, /* R10622 */ + 0x0000, /* R10623 */ + 0x0000, /* R10624 */ + 0x0000, /* R10625 */ + 0x0000, /* R10626 */ + 0x0000, /* R10627 */ + 0x0000, /* R10628 */ + 0x0000, /* R10629 */ + 0x0000, /* R10630 */ + 0x0000, /* R10631 */ + 0x0000, /* R10632 */ + 0x0000, /* R10633 */ + 0x0000, /* R10634 */ + 0x0000, /* R10635 */ + 0x0000, /* R10636 */ + 0x0000, /* R10637 */ + 0x0000, /* R10638 */ + 0x0000, /* R10639 */ + 0x0000, /* R10640 */ + 0x0000, /* R10641 */ + 0x0000, /* R10642 */ + 0x0000, /* R10643 */ + 0x0000, /* R10644 */ + 0x0000, /* R10645 */ + 0x0000, /* R10646 */ + 0x0000, /* R10647 */ + 0x0000, /* R10648 */ + 0x0000, /* R10649 */ + 0x0000, /* R10650 */ + 0x0000, /* R10651 */ + 0x0000, /* R10652 */ + 0x0000, /* R10653 */ + 0x0000, /* R10654 */ + 0x0000, /* R10655 */ + 0x0000, /* R10656 */ + 0x0000, /* R10657 */ + 0x0000, /* R10658 */ + 0x0000, /* R10659 */ + 0x0000, /* R10660 */ + 0x0000, /* R10661 */ + 0x0000, /* R10662 */ + 0x0000, /* R10663 */ + 0x0000, /* R10664 */ + 0x0000, /* R10665 */ + 0x0000, /* R10666 */ + 0x0000, /* R10667 */ + 0x0000, /* R10668 */ + 0x0000, /* R10669 */ + 0x0000, /* R10670 */ + 0x0000, /* R10671 */ + 0x0000, /* R10672 */ + 0x0000, /* R10673 */ + 0x0000, /* R10674 */ + 0x0000, /* R10675 */ + 0x0000, /* R10676 */ + 0x0000, /* R10677 */ + 0x0000, /* R10678 */ + 0x0000, /* R10679 */ + 0x0000, /* R10680 */ + 0x0000, /* R10681 */ + 0x0000, /* R10682 */ + 0x0000, /* R10683 */ + 0x0000, /* R10684 */ + 0x0000, /* R10685 */ + 0x0000, /* R10686 */ + 0x0000, /* R10687 */ + 0x0000, /* R10688 */ + 0x0000, /* R10689 */ + 0x0000, /* R10690 */ + 0x0000, /* R10691 */ + 0x0000, /* R10692 */ + 0x0000, /* R10693 */ + 0x0000, /* R10694 */ + 0x0000, /* R10695 */ + 0x0000, /* R10696 */ + 0x0000, /* R10697 */ + 0x0000, /* R10698 */ + 0x0000, /* R10699 */ + 0x0000, /* R10700 */ + 0x0000, /* R10701 */ + 0x0000, /* R10702 */ + 0x0000, /* R10703 */ + 0x0000, /* R10704 */ + 0x0000, /* R10705 */ + 0x0000, /* R10706 */ + 0x0000, /* R10707 */ + 0x0000, /* R10708 */ + 0x0000, /* R10709 */ + 0x0000, /* R10710 */ + 0x0000, /* R10711 */ + 0x0000, /* R10712 */ + 0x0000, /* R10713 */ + 0x0000, /* R10714 */ + 0x0000, /* R10715 */ + 0x0000, /* R10716 */ + 0x0000, /* R10717 */ + 0x0000, /* R10718 */ + 0x0000, /* R10719 */ + 0x0000, /* R10720 */ + 0x0000, /* R10721 */ + 0x0000, /* R10722 */ + 0x0000, /* R10723 */ + 0x0000, /* R10724 */ + 0x0000, /* R10725 */ + 0x0000, /* R10726 */ + 0x0000, /* R10727 */ + 0x0000, /* R10728 */ + 0x0000, /* R10729 */ + 0x0000, /* R10730 */ + 0x0000, /* R10731 */ + 0x0000, /* R10732 */ + 0x0000, /* R10733 */ + 0x0000, /* R10734 */ + 0x0000, /* R10735 */ + 0x0000, /* R10736 */ + 0x0000, /* R10737 */ + 0x0000, /* R10738 */ + 0x0000, /* R10739 */ + 0x0000, /* R10740 */ + 0x0000, /* R10741 */ + 0x0000, /* R10742 */ + 0x0000, /* R10743 */ + 0x0000, /* R10744 */ + 0x0000, /* R10745 */ + 0x0000, /* R10746 */ + 0x0000, /* R10747 */ + 0x0000, /* R10748 */ + 0x0000, /* R10749 */ + 0x0000, /* R10750 */ + 0x0000, /* R10751 */ + 0x0000, /* R10752 */ + 0x0000, /* R10753 */ + 0x0000, /* R10754 */ + 0x0000, /* R10755 */ + 0x0000, /* R10756 */ + 0x0000, /* R10757 */ + 0x0000, /* R10758 */ + 0x0000, /* R10759 */ + 0x0000, /* R10760 */ + 0x0000, /* R10761 */ + 0x0000, /* R10762 */ + 0x0000, /* R10763 */ + 0x0000, /* R10764 */ + 0x0000, /* R10765 */ + 0x0000, /* R10766 */ + 0x0000, /* R10767 */ + 0x0000, /* R10768 */ + 0x0000, /* R10769 */ + 0x0000, /* R10770 */ + 0x0000, /* R10771 */ + 0x0000, /* R10772 */ + 0x0000, /* R10773 */ + 0x0000, /* R10774 */ + 0x0000, /* R10775 */ + 0x0000, /* R10776 */ + 0x0000, /* R10777 */ + 0x0000, /* R10778 */ + 0x0000, /* R10779 */ + 0x0000, /* R10780 */ + 0x0000, /* R10781 */ + 0x0000, /* R10782 */ + 0x0000, /* R10783 */ + 0x0000, /* R10784 */ + 0x0000, /* R10785 */ + 0x0000, /* R10786 */ + 0x0000, /* R10787 */ + 0x0000, /* R10788 */ + 0x0000, /* R10789 */ + 0x0000, /* R10790 */ + 0x0000, /* R10791 */ + 0x0000, /* R10792 */ + 0x0000, /* R10793 */ + 0x0000, /* R10794 */ + 0x0000, /* R10795 */ + 0x0000, /* R10796 */ + 0x0000, /* R10797 */ + 0x0000, /* R10798 */ + 0x0000, /* R10799 */ + 0x0000, /* R10800 */ + 0x0000, /* R10801 */ + 0x0000, /* R10802 */ + 0x0000, /* R10803 */ + 0x0000, /* R10804 */ + 0x0000, /* R10805 */ + 0x0000, /* R10806 */ + 0x0000, /* R10807 */ + 0x0000, /* R10808 */ + 0x0000, /* R10809 */ + 0x0000, /* R10810 */ + 0x0000, /* R10811 */ + 0x0000, /* R10812 */ + 0x0000, /* R10813 */ + 0x0000, /* R10814 */ + 0x0000, /* R10815 */ + 0x0000, /* R10816 */ + 0x0000, /* R10817 */ + 0x0000, /* R10818 */ + 0x0000, /* R10819 */ + 0x0000, /* R10820 */ + 0x0000, /* R10821 */ + 0x0000, /* R10822 */ + 0x0000, /* R10823 */ + 0x0000, /* R10824 */ + 0x0000, /* R10825 */ + 0x0000, /* R10826 */ + 0x0000, /* R10827 */ + 0x0000, /* R10828 */ + 0x0000, /* R10829 */ + 0x0000, /* R10830 */ + 0x0000, /* R10831 */ + 0x0000, /* R10832 */ + 0x0000, /* R10833 */ + 0x0000, /* R10834 */ + 0x0000, /* R10835 */ + 0x0000, /* R10836 */ + 0x0000, /* R10837 */ + 0x0000, /* R10838 */ + 0x0000, /* R10839 */ + 0x0000, /* R10840 */ + 0x0000, /* R10841 */ + 0x0000, /* R10842 */ + 0x0000, /* R10843 */ + 0x0000, /* R10844 */ + 0x0000, /* R10845 */ + 0x0000, /* R10846 */ + 0x0000, /* R10847 */ + 0x0000, /* R10848 */ + 0x0000, /* R10849 */ + 0x0000, /* R10850 */ + 0x0000, /* R10851 */ + 0x0000, /* R10852 */ + 0x0000, /* R10853 */ + 0x0000, /* R10854 */ + 0x0000, /* R10855 */ + 0x0000, /* R10856 */ + 0x0000, /* R10857 */ + 0x0000, /* R10858 */ + 0x0000, /* R10859 */ + 0x0000, /* R10860 */ + 0x0000, /* R10861 */ + 0x0000, /* R10862 */ + 0x0000, /* R10863 */ + 0x0000, /* R10864 */ + 0x0000, /* R10865 */ + 0x0000, /* R10866 */ + 0x0000, /* R10867 */ + 0x0000, /* R10868 */ + 0x0000, /* R10869 */ + 0x0000, /* R10870 */ + 0x0000, /* R10871 */ + 0x0000, /* R10872 */ + 0x0000, /* R10873 */ + 0x0000, /* R10874 */ + 0x0000, /* R10875 */ + 0x0000, /* R10876 */ + 0x0000, /* R10877 */ + 0x0000, /* R10878 */ + 0x0000, /* R10879 */ + 0x0000, /* R10880 */ + 0x0000, /* R10881 */ + 0x0000, /* R10882 */ + 0x0000, /* R10883 */ + 0x0000, /* R10884 */ + 0x0000, /* R10885 */ + 0x0000, /* R10886 */ + 0x0000, /* R10887 */ + 0x0000, /* R10888 */ + 0x0000, /* R10889 */ + 0x0000, /* R10890 */ + 0x0000, /* R10891 */ + 0x0000, /* R10892 */ + 0x0000, /* R10893 */ + 0x0000, /* R10894 */ + 0x0000, /* R10895 */ + 0x0000, /* R10896 */ + 0x0000, /* R10897 */ + 0x0000, /* R10898 */ + 0x0000, /* R10899 */ + 0x0000, /* R10900 */ + 0x0000, /* R10901 */ + 0x0000, /* R10902 */ + 0x0000, /* R10903 */ + 0x0000, /* R10904 */ + 0x0000, /* R10905 */ + 0x0000, /* R10906 */ + 0x0000, /* R10907 */ + 0x0000, /* R10908 */ + 0x0000, /* R10909 */ + 0x0000, /* R10910 */ + 0x0000, /* R10911 */ + 0x0000, /* R10912 */ + 0x0000, /* R10913 */ + 0x0000, /* R10914 */ + 0x0000, /* R10915 */ + 0x0000, /* R10916 */ + 0x0000, /* R10917 */ + 0x0000, /* R10918 */ + 0x0000, /* R10919 */ + 0x0000, /* R10920 */ + 0x0000, /* R10921 */ + 0x0000, /* R10922 */ + 0x0000, /* R10923 */ + 0x0000, /* R10924 */ + 0x0000, /* R10925 */ + 0x0000, /* R10926 */ + 0x0000, /* R10927 */ + 0x0000, /* R10928 */ + 0x0000, /* R10929 */ + 0x0000, /* R10930 */ + 0x0000, /* R10931 */ + 0x0000, /* R10932 */ + 0x0000, /* R10933 */ + 0x0000, /* R10934 */ + 0x0000, /* R10935 */ + 0x0000, /* R10936 */ + 0x0000, /* R10937 */ + 0x0000, /* R10938 */ + 0x0000, /* R10939 */ + 0x0000, /* R10940 */ + 0x0000, /* R10941 */ + 0x0000, /* R10942 */ + 0x0000, /* R10943 */ + 0x0000, /* R10944 */ + 0x0000, /* R10945 */ + 0x0000, /* R10946 */ + 0x0000, /* R10947 */ + 0x0000, /* R10948 */ + 0x0000, /* R10949 */ + 0x0000, /* R10950 */ + 0x0000, /* R10951 */ + 0x0000, /* R10952 */ + 0x0000, /* R10953 */ + 0x0000, /* R10954 */ + 0x0000, /* R10955 */ + 0x0000, /* R10956 */ + 0x0000, /* R10957 */ + 0x0000, /* R10958 */ + 0x0000, /* R10959 */ + 0x0000, /* R10960 */ + 0x0000, /* R10961 */ + 0x0000, /* R10962 */ + 0x0000, /* R10963 */ + 0x0000, /* R10964 */ + 0x0000, /* R10965 */ + 0x0000, /* R10966 */ + 0x0000, /* R10967 */ + 0x0000, /* R10968 */ + 0x0000, /* R10969 */ + 0x0000, /* R10970 */ + 0x0000, /* R10971 */ + 0x0000, /* R10972 */ + 0x0000, /* R10973 */ + 0x0000, /* R10974 */ + 0x0000, /* R10975 */ + 0x0000, /* R10976 */ + 0x0000, /* R10977 */ + 0x0000, /* R10978 */ + 0x0000, /* R10979 */ + 0x0000, /* R10980 */ + 0x0000, /* R10981 */ + 0x0000, /* R10982 */ + 0x0000, /* R10983 */ + 0x0000, /* R10984 */ + 0x0000, /* R10985 */ + 0x0000, /* R10986 */ + 0x0000, /* R10987 */ + 0x0000, /* R10988 */ + 0x0000, /* R10989 */ + 0x0000, /* R10990 */ + 0x0000, /* R10991 */ + 0x0000, /* R10992 */ + 0x0000, /* R10993 */ + 0x0000, /* R10994 */ + 0x0000, /* R10995 */ + 0x0000, /* R10996 */ + 0x0000, /* R10997 */ + 0x0000, /* R10998 */ + 0x0000, /* R10999 */ + 0x0000, /* R11000 */ + 0x0000, /* R11001 */ + 0x0000, /* R11002 */ + 0x0000, /* R11003 */ + 0x0000, /* R11004 */ + 0x0000, /* R11005 */ + 0x0000, /* R11006 */ + 0x0000, /* R11007 */ + 0x0000, /* R11008 */ + 0x0000, /* R11009 */ + 0x0000, /* R11010 */ + 0x0000, /* R11011 */ + 0x0000, /* R11012 */ + 0x0000, /* R11013 */ + 0x0000, /* R11014 */ + 0x0000, /* R11015 */ + 0x0000, /* R11016 */ + 0x0000, /* R11017 */ + 0x0000, /* R11018 */ + 0x0000, /* R11019 */ + 0x0000, /* R11020 */ + 0x0000, /* R11021 */ + 0x0000, /* R11022 */ + 0x0000, /* R11023 */ + 0x0000, /* R11024 */ + 0x0000, /* R11025 */ + 0x0000, /* R11026 */ + 0x0000, /* R11027 */ + 0x0000, /* R11028 */ + 0x0000, /* R11029 */ + 0x0000, /* R11030 */ + 0x0000, /* R11031 */ + 0x0000, /* R11032 */ + 0x0000, /* R11033 */ + 0x0000, /* R11034 */ + 0x0000, /* R11035 */ + 0x0000, /* R11036 */ + 0x0000, /* R11037 */ + 0x0000, /* R11038 */ + 0x0000, /* R11039 */ + 0x0000, /* R11040 */ + 0x0000, /* R11041 */ + 0x0000, /* R11042 */ + 0x0000, /* R11043 */ + 0x0000, /* R11044 */ + 0x0000, /* R11045 */ + 0x0000, /* R11046 */ + 0x0000, /* R11047 */ + 0x0000, /* R11048 */ + 0x0000, /* R11049 */ + 0x0000, /* R11050 */ + 0x0000, /* R11051 */ + 0x0000, /* R11052 */ + 0x0000, /* R11053 */ + 0x0000, /* R11054 */ + 0x0000, /* R11055 */ + 0x0000, /* R11056 */ + 0x0000, /* R11057 */ + 0x0000, /* R11058 */ + 0x0000, /* R11059 */ + 0x0000, /* R11060 */ + 0x0000, /* R11061 */ + 0x0000, /* R11062 */ + 0x0000, /* R11063 */ + 0x0000, /* R11064 */ + 0x0000, /* R11065 */ + 0x0000, /* R11066 */ + 0x0000, /* R11067 */ + 0x0000, /* R11068 */ + 0x0000, /* R11069 */ + 0x0000, /* R11070 */ + 0x0000, /* R11071 */ + 0x0000, /* R11072 */ + 0x0000, /* R11073 */ + 0x0000, /* R11074 */ + 0x0000, /* R11075 */ + 0x0000, /* R11076 */ + 0x0000, /* R11077 */ + 0x0000, /* R11078 */ + 0x0000, /* R11079 */ + 0x0000, /* R11080 */ + 0x0000, /* R11081 */ + 0x0000, /* R11082 */ + 0x0000, /* R11083 */ + 0x0000, /* R11084 */ + 0x0000, /* R11085 */ + 0x0000, /* R11086 */ + 0x0000, /* R11087 */ + 0x0000, /* R11088 */ + 0x0000, /* R11089 */ + 0x0000, /* R11090 */ + 0x0000, /* R11091 */ + 0x0000, /* R11092 */ + 0x0000, /* R11093 */ + 0x0000, /* R11094 */ + 0x0000, /* R11095 */ + 0x0000, /* R11096 */ + 0x0000, /* R11097 */ + 0x0000, /* R11098 */ + 0x0000, /* R11099 */ + 0x0000, /* R11100 */ + 0x0000, /* R11101 */ + 0x0000, /* R11102 */ + 0x0000, /* R11103 */ + 0x0000, /* R11104 */ + 0x0000, /* R11105 */ + 0x0000, /* R11106 */ + 0x0000, /* R11107 */ + 0x0000, /* R11108 */ + 0x0000, /* R11109 */ + 0x0000, /* R11110 */ + 0x0000, /* R11111 */ + 0x0000, /* R11112 */ + 0x0000, /* R11113 */ + 0x0000, /* R11114 */ + 0x0000, /* R11115 */ + 0x0000, /* R11116 */ + 0x0000, /* R11117 */ + 0x0000, /* R11118 */ + 0x0000, /* R11119 */ + 0x0000, /* R11120 */ + 0x0000, /* R11121 */ + 0x0000, /* R11122 */ + 0x0000, /* R11123 */ + 0x0000, /* R11124 */ + 0x0000, /* R11125 */ + 0x0000, /* R11126 */ + 0x0000, /* R11127 */ + 0x0000, /* R11128 */ + 0x0000, /* R11129 */ + 0x0000, /* R11130 */ + 0x0000, /* R11131 */ + 0x0000, /* R11132 */ + 0x0000, /* R11133 */ + 0x0000, /* R11134 */ + 0x0000, /* R11135 */ + 0x0000, /* R11136 */ + 0x0000, /* R11137 */ + 0x0000, /* R11138 */ + 0x0000, /* R11139 */ + 0x0000, /* R11140 */ + 0x0000, /* R11141 */ + 0x0000, /* R11142 */ + 0x0000, /* R11143 */ + 0x0000, /* R11144 */ + 0x0000, /* R11145 */ + 0x0000, /* R11146 */ + 0x0000, /* R11147 */ + 0x0000, /* R11148 */ + 0x0000, /* R11149 */ + 0x0000, /* R11150 */ + 0x0000, /* R11151 */ + 0x0000, /* R11152 */ + 0x0000, /* R11153 */ + 0x0000, /* R11154 */ + 0x0000, /* R11155 */ + 0x0000, /* R11156 */ + 0x0000, /* R11157 */ + 0x0000, /* R11158 */ + 0x0000, /* R11159 */ + 0x0000, /* R11160 */ + 0x0000, /* R11161 */ + 0x0000, /* R11162 */ + 0x0000, /* R11163 */ + 0x0000, /* R11164 */ + 0x0000, /* R11165 */ + 0x0000, /* R11166 */ + 0x0000, /* R11167 */ + 0x0000, /* R11168 */ + 0x0000, /* R11169 */ + 0x0000, /* R11170 */ + 0x0000, /* R11171 */ + 0x0000, /* R11172 */ + 0x0000, /* R11173 */ + 0x0000, /* R11174 */ + 0x0000, /* R11175 */ + 0x0000, /* R11176 */ + 0x0000, /* R11177 */ + 0x0000, /* R11178 */ + 0x0000, /* R11179 */ + 0x0000, /* R11180 */ + 0x0000, /* R11181 */ + 0x0000, /* R11182 */ + 0x0000, /* R11183 */ + 0x0000, /* R11184 */ + 0x0000, /* R11185 */ + 0x0000, /* R11186 */ + 0x0000, /* R11187 */ + 0x0000, /* R11188 */ + 0x0000, /* R11189 */ + 0x0000, /* R11190 */ + 0x0000, /* R11191 */ + 0x0000, /* R11192 */ + 0x0000, /* R11193 */ + 0x0000, /* R11194 */ + 0x0000, /* R11195 */ + 0x0000, /* R11196 */ + 0x0000, /* R11197 */ + 0x0000, /* R11198 */ + 0x0000, /* R11199 */ + 0x0000, /* R11200 */ + 0x0000, /* R11201 */ + 0x0000, /* R11202 */ + 0x0000, /* R11203 */ + 0x0000, /* R11204 */ + 0x0000, /* R11205 */ + 0x0000, /* R11206 */ + 0x0000, /* R11207 */ + 0x0000, /* R11208 */ + 0x0000, /* R11209 */ + 0x0000, /* R11210 */ + 0x0000, /* R11211 */ + 0x0000, /* R11212 */ + 0x0000, /* R11213 */ + 0x0000, /* R11214 */ + 0x0000, /* R11215 */ + 0x0000, /* R11216 */ + 0x0000, /* R11217 */ + 0x0000, /* R11218 */ + 0x0000, /* R11219 */ + 0x0000, /* R11220 */ + 0x0000, /* R11221 */ + 0x0000, /* R11222 */ + 0x0000, /* R11223 */ + 0x0000, /* R11224 */ + 0x0000, /* R11225 */ + 0x0000, /* R11226 */ + 0x0000, /* R11227 */ + 0x0000, /* R11228 */ + 0x0000, /* R11229 */ + 0x0000, /* R11230 */ + 0x0000, /* R11231 */ + 0x0000, /* R11232 */ + 0x0000, /* R11233 */ + 0x0000, /* R11234 */ + 0x0000, /* R11235 */ + 0x0000, /* R11236 */ + 0x0000, /* R11237 */ + 0x0000, /* R11238 */ + 0x0000, /* R11239 */ + 0x0000, /* R11240 */ + 0x0000, /* R11241 */ + 0x0000, /* R11242 */ + 0x0000, /* R11243 */ + 0x0000, /* R11244 */ + 0x0000, /* R11245 */ + 0x0000, /* R11246 */ + 0x0000, /* R11247 */ + 0x0000, /* R11248 */ + 0x0000, /* R11249 */ + 0x0000, /* R11250 */ + 0x0000, /* R11251 */ + 0x0000, /* R11252 */ + 0x0000, /* R11253 */ + 0x0000, /* R11254 */ + 0x0000, /* R11255 */ + 0x0000, /* R11256 */ + 0x0000, /* R11257 */ + 0x0000, /* R11258 */ + 0x0000, /* R11259 */ + 0x0000, /* R11260 */ + 0x0000, /* R11261 */ + 0x0000, /* R11262 */ + 0x0000, /* R11263 */ + 0x0000, /* R11264 */ + 0x0000, /* R11265 */ + 0x0000, /* R11266 */ + 0x0000, /* R11267 */ + 0x0000, /* R11268 */ + 0x0000, /* R11269 */ + 0x0000, /* R11270 */ + 0x0000, /* R11271 */ + 0x0000, /* R11272 */ + 0x0000, /* R11273 */ + 0x0000, /* R11274 */ + 0x0000, /* R11275 */ + 0x0000, /* R11276 */ + 0x0000, /* R11277 */ + 0x0000, /* R11278 */ + 0x0000, /* R11279 */ + 0x0000, /* R11280 */ + 0x0000, /* R11281 */ + 0x0000, /* R11282 */ + 0x0000, /* R11283 */ + 0x0000, /* R11284 */ + 0x0000, /* R11285 */ + 0x0000, /* R11286 */ + 0x0000, /* R11287 */ + 0x0000, /* R11288 */ + 0x0000, /* R11289 */ + 0x0000, /* R11290 */ + 0x0000, /* R11291 */ + 0x0000, /* R11292 */ + 0x0000, /* R11293 */ + 0x0000, /* R11294 */ + 0x0000, /* R11295 */ + 0x0000, /* R11296 */ + 0x0000, /* R11297 */ + 0x0000, /* R11298 */ + 0x0000, /* R11299 */ + 0x0000, /* R11300 */ + 0x0000, /* R11301 */ + 0x0000, /* R11302 */ + 0x0000, /* R11303 */ + 0x0000, /* R11304 */ + 0x0000, /* R11305 */ + 0x0000, /* R11306 */ + 0x0000, /* R11307 */ + 0x0000, /* R11308 */ + 0x0000, /* R11309 */ + 0x0000, /* R11310 */ + 0x0000, /* R11311 */ + 0x0000, /* R11312 */ + 0x0000, /* R11313 */ + 0x0000, /* R11314 */ + 0x0000, /* R11315 */ + 0x0000, /* R11316 */ + 0x0000, /* R11317 */ + 0x0000, /* R11318 */ + 0x0000, /* R11319 */ + 0x0000, /* R11320 */ + 0x0000, /* R11321 */ + 0x0000, /* R11322 */ + 0x0000, /* R11323 */ + 0x0000, /* R11324 */ + 0x0000, /* R11325 */ + 0x0000, /* R11326 */ + 0x0000, /* R11327 */ + 0x0000, /* R11328 */ + 0x0000, /* R11329 */ + 0x0000, /* R11330 */ + 0x0000, /* R11331 */ + 0x0000, /* R11332 */ + 0x0000, /* R11333 */ + 0x0000, /* R11334 */ + 0x0000, /* R11335 */ + 0x0000, /* R11336 */ + 0x0000, /* R11337 */ + 0x0000, /* R11338 */ + 0x0000, /* R11339 */ + 0x0000, /* R11340 */ + 0x0000, /* R11341 */ + 0x0000, /* R11342 */ + 0x0000, /* R11343 */ + 0x0000, /* R11344 */ + 0x0000, /* R11345 */ + 0x0000, /* R11346 */ + 0x0000, /* R11347 */ + 0x0000, /* R11348 */ + 0x0000, /* R11349 */ + 0x0000, /* R11350 */ + 0x0000, /* R11351 */ + 0x0000, /* R11352 */ + 0x0000, /* R11353 */ + 0x0000, /* R11354 */ + 0x0000, /* R11355 */ + 0x0000, /* R11356 */ + 0x0000, /* R11357 */ + 0x0000, /* R11358 */ + 0x0000, /* R11359 */ + 0x0000, /* R11360 */ + 0x0000, /* R11361 */ + 0x0000, /* R11362 */ + 0x0000, /* R11363 */ + 0x0000, /* R11364 */ + 0x0000, /* R11365 */ + 0x0000, /* R11366 */ + 0x0000, /* R11367 */ + 0x0000, /* R11368 */ + 0x0000, /* R11369 */ + 0x0000, /* R11370 */ + 0x0000, /* R11371 */ + 0x0000, /* R11372 */ + 0x0000, /* R11373 */ + 0x0000, /* R11374 */ + 0x0000, /* R11375 */ + 0x0000, /* R11376 */ + 0x0000, /* R11377 */ + 0x0000, /* R11378 */ + 0x0000, /* R11379 */ + 0x0000, /* R11380 */ + 0x0000, /* R11381 */ + 0x0000, /* R11382 */ + 0x0000, /* R11383 */ + 0x0000, /* R11384 */ + 0x0000, /* R11385 */ + 0x0000, /* R11386 */ + 0x0000, /* R11387 */ + 0x0000, /* R11388 */ + 0x0000, /* R11389 */ + 0x0000, /* R11390 */ + 0x0000, /* R11391 */ + 0x0000, /* R11392 */ + 0x0000, /* R11393 */ + 0x0000, /* R11394 */ + 0x0000, /* R11395 */ + 0x0000, /* R11396 */ + 0x0000, /* R11397 */ + 0x0000, /* R11398 */ + 0x0000, /* R11399 */ + 0x0000, /* R11400 */ + 0x0000, /* R11401 */ + 0x0000, /* R11402 */ + 0x0000, /* R11403 */ + 0x0000, /* R11404 */ + 0x0000, /* R11405 */ + 0x0000, /* R11406 */ + 0x0000, /* R11407 */ + 0x0000, /* R11408 */ + 0x0000, /* R11409 */ + 0x0000, /* R11410 */ + 0x0000, /* R11411 */ + 0x0000, /* R11412 */ + 0x0000, /* R11413 */ + 0x0000, /* R11414 */ + 0x0000, /* R11415 */ + 0x0000, /* R11416 */ + 0x0000, /* R11417 */ + 0x0000, /* R11418 */ + 0x0000, /* R11419 */ + 0x0000, /* R11420 */ + 0x0000, /* R11421 */ + 0x0000, /* R11422 */ + 0x0000, /* R11423 */ + 0x0000, /* R11424 */ + 0x0000, /* R11425 */ + 0x0000, /* R11426 */ + 0x0000, /* R11427 */ + 0x0000, /* R11428 */ + 0x0000, /* R11429 */ + 0x0000, /* R11430 */ + 0x0000, /* R11431 */ + 0x0000, /* R11432 */ + 0x0000, /* R11433 */ + 0x0000, /* R11434 */ + 0x0000, /* R11435 */ + 0x0000, /* R11436 */ + 0x0000, /* R11437 */ + 0x0000, /* R11438 */ + 0x0000, /* R11439 */ + 0x0000, /* R11440 */ + 0x0000, /* R11441 */ + 0x0000, /* R11442 */ + 0x0000, /* R11443 */ + 0x0000, /* R11444 */ + 0x0000, /* R11445 */ + 0x0000, /* R11446 */ + 0x0000, /* R11447 */ + 0x0000, /* R11448 */ + 0x0000, /* R11449 */ + 0x0000, /* R11450 */ + 0x0000, /* R11451 */ + 0x0000, /* R11452 */ + 0x0000, /* R11453 */ + 0x0000, /* R11454 */ + 0x0000, /* R11455 */ + 0x0000, /* R11456 */ + 0x0000, /* R11457 */ + 0x0000, /* R11458 */ + 0x0000, /* R11459 */ + 0x0000, /* R11460 */ + 0x0000, /* R11461 */ + 0x0000, /* R11462 */ + 0x0000, /* R11463 */ + 0x0000, /* R11464 */ + 0x0000, /* R11465 */ + 0x0000, /* R11466 */ + 0x0000, /* R11467 */ + 0x0000, /* R11468 */ + 0x0000, /* R11469 */ + 0x0000, /* R11470 */ + 0x0000, /* R11471 */ + 0x0000, /* R11472 */ + 0x0000, /* R11473 */ + 0x0000, /* R11474 */ + 0x0000, /* R11475 */ + 0x0000, /* R11476 */ + 0x0000, /* R11477 */ + 0x0000, /* R11478 */ + 0x0000, /* R11479 */ + 0x0000, /* R11480 */ + 0x0000, /* R11481 */ + 0x0000, /* R11482 */ + 0x0000, /* R11483 */ + 0x0000, /* R11484 */ + 0x0000, /* R11485 */ + 0x0000, /* R11486 */ + 0x0000, /* R11487 */ + 0x0000, /* R11488 */ + 0x0000, /* R11489 */ + 0x0000, /* R11490 */ + 0x0000, /* R11491 */ + 0x0000, /* R11492 */ + 0x0000, /* R11493 */ + 0x0000, /* R11494 */ + 0x0000, /* R11495 */ + 0x0000, /* R11496 */ + 0x0000, /* R11497 */ + 0x0000, /* R11498 */ + 0x0000, /* R11499 */ + 0x0000, /* R11500 */ + 0x0000, /* R11501 */ + 0x0000, /* R11502 */ + 0x0000, /* R11503 */ + 0x0000, /* R11504 */ + 0x0000, /* R11505 */ + 0x0000, /* R11506 */ + 0x0000, /* R11507 */ + 0x0000, /* R11508 */ + 0x0000, /* R11509 */ + 0x0000, /* R11510 */ + 0x0000, /* R11511 */ + 0x0000, /* R11512 */ + 0x0000, /* R11513 */ + 0x0000, /* R11514 */ + 0x0000, /* R11515 */ + 0x0000, /* R11516 */ + 0x0000, /* R11517 */ + 0x0000, /* R11518 */ + 0x0000, /* R11519 */ + 0x0000, /* R11520 */ + 0x0000, /* R11521 */ + 0x0000, /* R11522 */ + 0x0000, /* R11523 */ + 0x0000, /* R11524 */ + 0x0000, /* R11525 */ + 0x0000, /* R11526 */ + 0x0000, /* R11527 */ + 0x0000, /* R11528 */ + 0x0000, /* R11529 */ + 0x0000, /* R11530 */ + 0x0000, /* R11531 */ + 0x0000, /* R11532 */ + 0x0000, /* R11533 */ + 0x0000, /* R11534 */ + 0x0000, /* R11535 */ + 0x0000, /* R11536 */ + 0x0000, /* R11537 */ + 0x0000, /* R11538 */ + 0x0000, /* R11539 */ + 0x0000, /* R11540 */ + 0x0000, /* R11541 */ + 0x0000, /* R11542 */ + 0x0000, /* R11543 */ + 0x0000, /* R11544 */ + 0x0000, /* R11545 */ + 0x0000, /* R11546 */ + 0x0000, /* R11547 */ + 0x0000, /* R11548 */ + 0x0000, /* R11549 */ + 0x0000, /* R11550 */ + 0x0000, /* R11551 */ + 0x0000, /* R11552 */ + 0x0000, /* R11553 */ + 0x0000, /* R11554 */ + 0x0000, /* R11555 */ + 0x0000, /* R11556 */ + 0x0000, /* R11557 */ + 0x0000, /* R11558 */ + 0x0000, /* R11559 */ + 0x0000, /* R11560 */ + 0x0000, /* R11561 */ + 0x0000, /* R11562 */ + 0x0000, /* R11563 */ + 0x0000, /* R11564 */ + 0x0000, /* R11565 */ + 0x0000, /* R11566 */ + 0x0000, /* R11567 */ + 0x0000, /* R11568 */ + 0x0000, /* R11569 */ + 0x0000, /* R11570 */ + 0x0000, /* R11571 */ + 0x0000, /* R11572 */ + 0x0000, /* R11573 */ + 0x0000, /* R11574 */ + 0x0000, /* R11575 */ + 0x0000, /* R11576 */ + 0x0000, /* R11577 */ + 0x0000, /* R11578 */ + 0x0000, /* R11579 */ + 0x0000, /* R11580 */ + 0x0000, /* R11581 */ + 0x0000, /* R11582 */ + 0x0000, /* R11583 */ + 0x0000, /* R11584 */ + 0x0000, /* R11585 */ + 0x0000, /* R11586 */ + 0x0000, /* R11587 */ + 0x0000, /* R11588 */ + 0x0000, /* R11589 */ + 0x0000, /* R11590 */ + 0x0000, /* R11591 */ + 0x0000, /* R11592 */ + 0x0000, /* R11593 */ + 0x0000, /* R11594 */ + 0x0000, /* R11595 */ + 0x0000, /* R11596 */ + 0x0000, /* R11597 */ + 0x0000, /* R11598 */ + 0x0000, /* R11599 */ + 0x0000, /* R11600 */ + 0x0000, /* R11601 */ + 0x0000, /* R11602 */ + 0x0000, /* R11603 */ + 0x0000, /* R11604 */ + 0x0000, /* R11605 */ + 0x0000, /* R11606 */ + 0x0000, /* R11607 */ + 0x0000, /* R11608 */ + 0x0000, /* R11609 */ + 0x0000, /* R11610 */ + 0x0000, /* R11611 */ + 0x0000, /* R11612 */ + 0x0000, /* R11613 */ + 0x0000, /* R11614 */ + 0x0000, /* R11615 */ + 0x0000, /* R11616 */ + 0x0000, /* R11617 */ + 0x0000, /* R11618 */ + 0x0000, /* R11619 */ + 0x0000, /* R11620 */ + 0x0000, /* R11621 */ + 0x0000, /* R11622 */ + 0x0000, /* R11623 */ + 0x0000, /* R11624 */ + 0x0000, /* R11625 */ + 0x0000, /* R11626 */ + 0x0000, /* R11627 */ + 0x0000, /* R11628 */ + 0x0000, /* R11629 */ + 0x0000, /* R11630 */ + 0x0000, /* R11631 */ + 0x0000, /* R11632 */ + 0x0000, /* R11633 */ + 0x0000, /* R11634 */ + 0x0000, /* R11635 */ + 0x0000, /* R11636 */ + 0x0000, /* R11637 */ + 0x0000, /* R11638 */ + 0x0000, /* R11639 */ + 0x0000, /* R11640 */ + 0x0000, /* R11641 */ + 0x0000, /* R11642 */ + 0x0000, /* R11643 */ + 0x0000, /* R11644 */ + 0x0000, /* R11645 */ + 0x0000, /* R11646 */ + 0x0000, /* R11647 */ + 0x0000, /* R11648 */ + 0x0000, /* R11649 */ + 0x0000, /* R11650 */ + 0x0000, /* R11651 */ + 0x0000, /* R11652 */ + 0x0000, /* R11653 */ + 0x0000, /* R11654 */ + 0x0000, /* R11655 */ + 0x0000, /* R11656 */ + 0x0000, /* R11657 */ + 0x0000, /* R11658 */ + 0x0000, /* R11659 */ + 0x0000, /* R11660 */ + 0x0000, /* R11661 */ + 0x0000, /* R11662 */ + 0x0000, /* R11663 */ + 0x0000, /* R11664 */ + 0x0000, /* R11665 */ + 0x0000, /* R11666 */ + 0x0000, /* R11667 */ + 0x0000, /* R11668 */ + 0x0000, /* R11669 */ + 0x0000, /* R11670 */ + 0x0000, /* R11671 */ + 0x0000, /* R11672 */ + 0x0000, /* R11673 */ + 0x0000, /* R11674 */ + 0x0000, /* R11675 */ + 0x0000, /* R11676 */ + 0x0000, /* R11677 */ + 0x0000, /* R11678 */ + 0x0000, /* R11679 */ + 0x0000, /* R11680 */ + 0x0000, /* R11681 */ + 0x0000, /* R11682 */ + 0x0000, /* R11683 */ + 0x0000, /* R11684 */ + 0x0000, /* R11685 */ + 0x0000, /* R11686 */ + 0x0000, /* R11687 */ + 0x0000, /* R11688 */ + 0x0000, /* R11689 */ + 0x0000, /* R11690 */ + 0x0000, /* R11691 */ + 0x0000, /* R11692 */ + 0x0000, /* R11693 */ + 0x0000, /* R11694 */ + 0x0000, /* R11695 */ + 0x0000, /* R11696 */ + 0x0000, /* R11697 */ + 0x0000, /* R11698 */ + 0x0000, /* R11699 */ + 0x0000, /* R11700 */ + 0x0000, /* R11701 */ + 0x0000, /* R11702 */ + 0x0000, /* R11703 */ + 0x0000, /* R11704 */ + 0x0000, /* R11705 */ + 0x0000, /* R11706 */ + 0x0000, /* R11707 */ + 0x0000, /* R11708 */ + 0x0000, /* R11709 */ + 0x0000, /* R11710 */ + 0x0000, /* R11711 */ + 0x0000, /* R11712 */ + 0x0000, /* R11713 */ + 0x0000, /* R11714 */ + 0x0000, /* R11715 */ + 0x0000, /* R11716 */ + 0x0000, /* R11717 */ + 0x0000, /* R11718 */ + 0x0000, /* R11719 */ + 0x0000, /* R11720 */ + 0x0000, /* R11721 */ + 0x0000, /* R11722 */ + 0x0000, /* R11723 */ + 0x0000, /* R11724 */ + 0x0000, /* R11725 */ + 0x0000, /* R11726 */ + 0x0000, /* R11727 */ + 0x0000, /* R11728 */ + 0x0000, /* R11729 */ + 0x0000, /* R11730 */ + 0x0000, /* R11731 */ + 0x0000, /* R11732 */ + 0x0000, /* R11733 */ + 0x0000, /* R11734 */ + 0x0000, /* R11735 */ + 0x0000, /* R11736 */ + 0x0000, /* R11737 */ + 0x0000, /* R11738 */ + 0x0000, /* R11739 */ + 0x0000, /* R11740 */ + 0x0000, /* R11741 */ + 0x0000, /* R11742 */ + 0x0000, /* R11743 */ + 0x0000, /* R11744 */ + 0x0000, /* R11745 */ + 0x0000, /* R11746 */ + 0x0000, /* R11747 */ + 0x0000, /* R11748 */ + 0x0000, /* R11749 */ + 0x0000, /* R11750 */ + 0x0000, /* R11751 */ + 0x0000, /* R11752 */ + 0x0000, /* R11753 */ + 0x0000, /* R11754 */ + 0x0000, /* R11755 */ + 0x0000, /* R11756 */ + 0x0000, /* R11757 */ + 0x0000, /* R11758 */ + 0x0000, /* R11759 */ + 0x0000, /* R11760 */ + 0x0000, /* R11761 */ + 0x0000, /* R11762 */ + 0x0000, /* R11763 */ + 0x0000, /* R11764 */ + 0x0000, /* R11765 */ + 0x0000, /* R11766 */ + 0x0000, /* R11767 */ + 0x0000, /* R11768 */ + 0x0000, /* R11769 */ + 0x0000, /* R11770 */ + 0x0000, /* R11771 */ + 0x0000, /* R11772 */ + 0x0000, /* R11773 */ + 0x0000, /* R11774 */ + 0x0000, /* R11775 */ + 0x0000, /* R11776 */ + 0x0000, /* R11777 */ + 0x0000, /* R11778 */ + 0x0000, /* R11779 */ + 0x0000, /* R11780 */ + 0x0000, /* R11781 */ + 0x0000, /* R11782 */ + 0x0000, /* R11783 */ + 0x0000, /* R11784 */ + 0x0000, /* R11785 */ + 0x0000, /* R11786 */ + 0x0000, /* R11787 */ + 0x0000, /* R11788 */ + 0x0000, /* R11789 */ + 0x0000, /* R11790 */ + 0x0000, /* R11791 */ + 0x0000, /* R11792 */ + 0x0000, /* R11793 */ + 0x0000, /* R11794 */ + 0x0000, /* R11795 */ + 0x0000, /* R11796 */ + 0x0000, /* R11797 */ + 0x0000, /* R11798 */ + 0x0000, /* R11799 */ + 0x0000, /* R11800 */ + 0x0000, /* R11801 */ + 0x0000, /* R11802 */ + 0x0000, /* R11803 */ + 0x0000, /* R11804 */ + 0x0000, /* R11805 */ + 0x0000, /* R11806 */ + 0x0000, /* R11807 */ + 0x0000, /* R11808 */ + 0x0000, /* R11809 */ + 0x0000, /* R11810 */ + 0x0000, /* R11811 */ + 0x0000, /* R11812 */ + 0x0000, /* R11813 */ + 0x0000, /* R11814 */ + 0x0000, /* R11815 */ + 0x0000, /* R11816 */ + 0x0000, /* R11817 */ + 0x0000, /* R11818 */ + 0x0000, /* R11819 */ + 0x0000, /* R11820 */ + 0x0000, /* R11821 */ + 0x0000, /* R11822 */ + 0x0000, /* R11823 */ + 0x0000, /* R11824 */ + 0x0000, /* R11825 */ + 0x0000, /* R11826 */ + 0x0000, /* R11827 */ + 0x0000, /* R11828 */ + 0x0000, /* R11829 */ + 0x0000, /* R11830 */ + 0x0000, /* R11831 */ + 0x0000, /* R11832 */ + 0x0000, /* R11833 */ + 0x0000, /* R11834 */ + 0x0000, /* R11835 */ + 0x0000, /* R11836 */ + 0x0000, /* R11837 */ + 0x0000, /* R11838 */ + 0x0000, /* R11839 */ + 0x0000, /* R11840 */ + 0x0000, /* R11841 */ + 0x0000, /* R11842 */ + 0x0000, /* R11843 */ + 0x0000, /* R11844 */ + 0x0000, /* R11845 */ + 0x0000, /* R11846 */ + 0x0000, /* R11847 */ + 0x0000, /* R11848 */ + 0x0000, /* R11849 */ + 0x0000, /* R11850 */ + 0x0000, /* R11851 */ + 0x0000, /* R11852 */ + 0x0000, /* R11853 */ + 0x0000, /* R11854 */ + 0x0000, /* R11855 */ + 0x0000, /* R11856 */ + 0x0000, /* R11857 */ + 0x0000, /* R11858 */ + 0x0000, /* R11859 */ + 0x0000, /* R11860 */ + 0x0000, /* R11861 */ + 0x0000, /* R11862 */ + 0x0000, /* R11863 */ + 0x0000, /* R11864 */ + 0x0000, /* R11865 */ + 0x0000, /* R11866 */ + 0x0000, /* R11867 */ + 0x0000, /* R11868 */ + 0x0000, /* R11869 */ + 0x0000, /* R11870 */ + 0x0000, /* R11871 */ + 0x0000, /* R11872 */ + 0x0000, /* R11873 */ + 0x0000, /* R11874 */ + 0x0000, /* R11875 */ + 0x0000, /* R11876 */ + 0x0000, /* R11877 */ + 0x0000, /* R11878 */ + 0x0000, /* R11879 */ + 0x0000, /* R11880 */ + 0x0000, /* R11881 */ + 0x0000, /* R11882 */ + 0x0000, /* R11883 */ + 0x0000, /* R11884 */ + 0x0000, /* R11885 */ + 0x0000, /* R11886 */ + 0x0000, /* R11887 */ + 0x0000, /* R11888 */ + 0x0000, /* R11889 */ + 0x0000, /* R11890 */ + 0x0000, /* R11891 */ + 0x0000, /* R11892 */ + 0x0000, /* R11893 */ + 0x0000, /* R11894 */ + 0x0000, /* R11895 */ + 0x0000, /* R11896 */ + 0x0000, /* R11897 */ + 0x0000, /* R11898 */ + 0x0000, /* R11899 */ + 0x0000, /* R11900 */ + 0x0000, /* R11901 */ + 0x0000, /* R11902 */ + 0x0000, /* R11903 */ + 0x0000, /* R11904 */ + 0x0000, /* R11905 */ + 0x0000, /* R11906 */ + 0x0000, /* R11907 */ + 0x0000, /* R11908 */ + 0x0000, /* R11909 */ + 0x0000, /* R11910 */ + 0x0000, /* R11911 */ + 0x0000, /* R11912 */ + 0x0000, /* R11913 */ + 0x0000, /* R11914 */ + 0x0000, /* R11915 */ + 0x0000, /* R11916 */ + 0x0000, /* R11917 */ + 0x0000, /* R11918 */ + 0x0000, /* R11919 */ + 0x0000, /* R11920 */ + 0x0000, /* R11921 */ + 0x0000, /* R11922 */ + 0x0000, /* R11923 */ + 0x0000, /* R11924 */ + 0x0000, /* R11925 */ + 0x0000, /* R11926 */ + 0x0000, /* R11927 */ + 0x0000, /* R11928 */ + 0x0000, /* R11929 */ + 0x0000, /* R11930 */ + 0x0000, /* R11931 */ + 0x0000, /* R11932 */ + 0x0000, /* R11933 */ + 0x0000, /* R11934 */ + 0x0000, /* R11935 */ + 0x0000, /* R11936 */ + 0x0000, /* R11937 */ + 0x0000, /* R11938 */ + 0x0000, /* R11939 */ + 0x0000, /* R11940 */ + 0x0000, /* R11941 */ + 0x0000, /* R11942 */ + 0x0000, /* R11943 */ + 0x0000, /* R11944 */ + 0x0000, /* R11945 */ + 0x0000, /* R11946 */ + 0x0000, /* R11947 */ + 0x0000, /* R11948 */ + 0x0000, /* R11949 */ + 0x0000, /* R11950 */ + 0x0000, /* R11951 */ + 0x0000, /* R11952 */ + 0x0000, /* R11953 */ + 0x0000, /* R11954 */ + 0x0000, /* R11955 */ + 0x0000, /* R11956 */ + 0x0000, /* R11957 */ + 0x0000, /* R11958 */ + 0x0000, /* R11959 */ + 0x0000, /* R11960 */ + 0x0000, /* R11961 */ + 0x0000, /* R11962 */ + 0x0000, /* R11963 */ + 0x0000, /* R11964 */ + 0x0000, /* R11965 */ + 0x0000, /* R11966 */ + 0x0000, /* R11967 */ + 0x0000, /* R11968 */ + 0x0000, /* R11969 */ + 0x0000, /* R11970 */ + 0x0000, /* R11971 */ + 0x0000, /* R11972 */ + 0x0000, /* R11973 */ + 0x0000, /* R11974 */ + 0x0000, /* R11975 */ + 0x0000, /* R11976 */ + 0x0000, /* R11977 */ + 0x0000, /* R11978 */ + 0x0000, /* R11979 */ + 0x0000, /* R11980 */ + 0x0000, /* R11981 */ + 0x0000, /* R11982 */ + 0x0000, /* R11983 */ + 0x0000, /* R11984 */ + 0x0000, /* R11985 */ + 0x0000, /* R11986 */ + 0x0000, /* R11987 */ + 0x0000, /* R11988 */ + 0x0000, /* R11989 */ + 0x0000, /* R11990 */ + 0x0000, /* R11991 */ + 0x0000, /* R11992 */ + 0x0000, /* R11993 */ + 0x0000, /* R11994 */ + 0x0000, /* R11995 */ + 0x0000, /* R11996 */ + 0x0000, /* R11997 */ + 0x0000, /* R11998 */ + 0x0000, /* R11999 */ + 0x0000, /* R12000 */ + 0x0000, /* R12001 */ + 0x0000, /* R12002 */ + 0x0000, /* R12003 */ + 0x0000, /* R12004 */ + 0x0000, /* R12005 */ + 0x0000, /* R12006 */ + 0x0000, /* R12007 */ + 0x0000, /* R12008 */ + 0x0000, /* R12009 */ + 0x0000, /* R12010 */ + 0x0000, /* R12011 */ + 0x0000, /* R12012 */ + 0x0000, /* R12013 */ + 0x0000, /* R12014 */ + 0x0000, /* R12015 */ + 0x0000, /* R12016 */ + 0x0000, /* R12017 */ + 0x0000, /* R12018 */ + 0x0000, /* R12019 */ + 0x0000, /* R12020 */ + 0x0000, /* R12021 */ + 0x0000, /* R12022 */ + 0x0000, /* R12023 */ + 0x0000, /* R12024 */ + 0x0000, /* R12025 */ + 0x0000, /* R12026 */ + 0x0000, /* R12027 */ + 0x0000, /* R12028 */ + 0x0000, /* R12029 */ + 0x0000, /* R12030 */ + 0x0000, /* R12031 */ + 0x0000, /* R12032 */ + 0x0000, /* R12033 */ + 0x0000, /* R12034 */ + 0x0000, /* R12035 */ + 0x0000, /* R12036 */ + 0x0000, /* R12037 */ + 0x0000, /* R12038 */ + 0x0000, /* R12039 */ + 0x0000, /* R12040 */ + 0x0000, /* R12041 */ + 0x0000, /* R12042 */ + 0x0000, /* R12043 */ + 0x0000, /* R12044 */ + 0x0000, /* R12045 */ + 0x0000, /* R12046 */ + 0x0000, /* R12047 */ + 0x0000, /* R12048 */ + 0x0000, /* R12049 */ + 0x0000, /* R12050 */ + 0x0000, /* R12051 */ + 0x0000, /* R12052 */ + 0x0000, /* R12053 */ + 0x0000, /* R12054 */ + 0x0000, /* R12055 */ + 0x0000, /* R12056 */ + 0x0000, /* R12057 */ + 0x0000, /* R12058 */ + 0x0000, /* R12059 */ + 0x0000, /* R12060 */ + 0x0000, /* R12061 */ + 0x0000, /* R12062 */ + 0x0000, /* R12063 */ + 0x0000, /* R12064 */ + 0x0000, /* R12065 */ + 0x0000, /* R12066 */ + 0x0000, /* R12067 */ + 0x0000, /* R12068 */ + 0x0000, /* R12069 */ + 0x0000, /* R12070 */ + 0x0000, /* R12071 */ + 0x0000, /* R12072 */ + 0x0000, /* R12073 */ + 0x0000, /* R12074 */ + 0x0000, /* R12075 */ + 0x0000, /* R12076 */ + 0x0000, /* R12077 */ + 0x0000, /* R12078 */ + 0x0000, /* R12079 */ + 0x0000, /* R12080 */ + 0x0000, /* R12081 */ + 0x0000, /* R12082 */ + 0x0000, /* R12083 */ + 0x0000, /* R12084 */ + 0x0000, /* R12085 */ + 0x0000, /* R12086 */ + 0x0000, /* R12087 */ + 0x0000, /* R12088 */ + 0x0000, /* R12089 */ + 0x0000, /* R12090 */ + 0x0000, /* R12091 */ + 0x0000, /* R12092 */ + 0x0000, /* R12093 */ + 0x0000, /* R12094 */ + 0x0000, /* R12095 */ + 0x0000, /* R12096 */ + 0x0000, /* R12097 */ + 0x0000, /* R12098 */ + 0x0000, /* R12099 */ + 0x0000, /* R12100 */ + 0x0000, /* R12101 */ + 0x0000, /* R12102 */ + 0x0000, /* R12103 */ + 0x0000, /* R12104 */ + 0x0000, /* R12105 */ + 0x0000, /* R12106 */ + 0x0000, /* R12107 */ + 0x0000, /* R12108 */ + 0x0000, /* R12109 */ + 0x0000, /* R12110 */ + 0x0000, /* R12111 */ + 0x0000, /* R12112 */ + 0x0000, /* R12113 */ + 0x0000, /* R12114 */ + 0x0000, /* R12115 */ + 0x0000, /* R12116 */ + 0x0000, /* R12117 */ + 0x0000, /* R12118 */ + 0x0000, /* R12119 */ + 0x0000, /* R12120 */ + 0x0000, /* R12121 */ + 0x0000, /* R12122 */ + 0x0000, /* R12123 */ + 0x0000, /* R12124 */ + 0x0000, /* R12125 */ + 0x0000, /* R12126 */ + 0x0000, /* R12127 */ + 0x0000, /* R12128 */ + 0x0000, /* R12129 */ + 0x0000, /* R12130 */ + 0x0000, /* R12131 */ + 0x0000, /* R12132 */ + 0x0000, /* R12133 */ + 0x0000, /* R12134 */ + 0x0000, /* R12135 */ + 0x0000, /* R12136 */ + 0x0000, /* R12137 */ + 0x0000, /* R12138 */ + 0x0000, /* R12139 */ + 0x0000, /* R12140 */ + 0x0000, /* R12141 */ + 0x0000, /* R12142 */ + 0x0000, /* R12143 */ + 0x0000, /* R12144 */ + 0x0000, /* R12145 */ + 0x0000, /* R12146 */ + 0x0000, /* R12147 */ + 0x0000, /* R12148 */ + 0x0000, /* R12149 */ + 0x0000, /* R12150 */ + 0x0000, /* R12151 */ + 0x0000, /* R12152 */ + 0x0000, /* R12153 */ + 0x0000, /* R12154 */ + 0x0000, /* R12155 */ + 0x0000, /* R12156 */ + 0x0000, /* R12157 */ + 0x0000, /* R12158 */ + 0x0000, /* R12159 */ + 0x0000, /* R12160 */ + 0x0000, /* R12161 */ + 0x0000, /* R12162 */ + 0x0000, /* R12163 */ + 0x0000, /* R12164 */ + 0x0000, /* R12165 */ + 0x0000, /* R12166 */ + 0x0000, /* R12167 */ + 0x0000, /* R12168 */ + 0x0000, /* R12169 */ + 0x0000, /* R12170 */ + 0x0000, /* R12171 */ + 0x0000, /* R12172 */ + 0x0000, /* R12173 */ + 0x0000, /* R12174 */ + 0x0000, /* R12175 */ + 0x0000, /* R12176 */ + 0x0000, /* R12177 */ + 0x0000, /* R12178 */ + 0x0000, /* R12179 */ + 0x0000, /* R12180 */ + 0x0000, /* R12181 */ + 0x0000, /* R12182 */ + 0x0000, /* R12183 */ + 0x0000, /* R12184 */ + 0x0000, /* R12185 */ + 0x0000, /* R12186 */ + 0x0000, /* R12187 */ + 0x0000, /* R12188 */ + 0x0000, /* R12189 */ + 0x0000, /* R12190 */ + 0x0000, /* R12191 */ + 0x0000, /* R12192 */ + 0x0000, /* R12193 */ + 0x0000, /* R12194 */ + 0x0000, /* R12195 */ + 0x0000, /* R12196 */ + 0x0000, /* R12197 */ + 0x0000, /* R12198 */ + 0x0000, /* R12199 */ + 0x0000, /* R12200 */ + 0x0000, /* R12201 */ + 0x0000, /* R12202 */ + 0x0000, /* R12203 */ + 0x0000, /* R12204 */ + 0x0000, /* R12205 */ + 0x0000, /* R12206 */ + 0x0000, /* R12207 */ + 0x0000, /* R12208 */ + 0x0000, /* R12209 */ + 0x0000, /* R12210 */ + 0x0000, /* R12211 */ + 0x0000, /* R12212 */ + 0x0000, /* R12213 */ + 0x0000, /* R12214 */ + 0x0000, /* R12215 */ + 0x0000, /* R12216 */ + 0x0000, /* R12217 */ + 0x0000, /* R12218 */ + 0x0000, /* R12219 */ + 0x0000, /* R12220 */ + 0x0000, /* R12221 */ + 0x0000, /* R12222 */ + 0x0000, /* R12223 */ + 0x0000, /* R12224 */ + 0x0000, /* R12225 */ + 0x0000, /* R12226 */ + 0x0000, /* R12227 */ + 0x0000, /* R12228 */ + 0x0000, /* R12229 */ + 0x0000, /* R12230 */ + 0x0000, /* R12231 */ + 0x0000, /* R12232 */ + 0x0000, /* R12233 */ + 0x0000, /* R12234 */ + 0x0000, /* R12235 */ + 0x0000, /* R12236 */ + 0x0000, /* R12237 */ + 0x0000, /* R12238 */ + 0x0000, /* R12239 */ + 0x0000, /* R12240 */ + 0x0000, /* R12241 */ + 0x0000, /* R12242 */ + 0x0000, /* R12243 */ + 0x0000, /* R12244 */ + 0x0000, /* R12245 */ + 0x0000, /* R12246 */ + 0x0000, /* R12247 */ + 0x0000, /* R12248 */ + 0x0000, /* R12249 */ + 0x0000, /* R12250 */ + 0x0000, /* R12251 */ + 0x0000, /* R12252 */ + 0x0000, /* R12253 */ + 0x0000, /* R12254 */ + 0x0000, /* R12255 */ + 0x0000, /* R12256 */ + 0x0000, /* R12257 */ + 0x0000, /* R12258 */ + 0x0000, /* R12259 */ + 0x0000, /* R12260 */ + 0x0000, /* R12261 */ + 0x0000, /* R12262 */ + 0x0000, /* R12263 */ + 0x0000, /* R12264 */ + 0x0000, /* R12265 */ + 0x0000, /* R12266 */ + 0x0000, /* R12267 */ + 0x0000, /* R12268 */ + 0x0000, /* R12269 */ + 0x0000, /* R12270 */ + 0x0000, /* R12271 */ + 0x0000, /* R12272 */ + 0x0000, /* R12273 */ + 0x0000, /* R12274 */ + 0x0000, /* R12275 */ + 0x0000, /* R12276 */ + 0x0000, /* R12277 */ + 0x0000, /* R12278 */ + 0x0000, /* R12279 */ + 0x0000, /* R12280 */ + 0x0000, /* R12281 */ + 0x0000, /* R12282 */ + 0x0000, /* R12283 */ + 0x0000, /* R12284 */ + 0x0000, /* R12285 */ + 0x0000, /* R12286 */ + 0x0000, /* R12287 */ + 0x0000, /* R12288 - DSP2 Data1 RAM 1 */ + 0x0000, /* R12289 - DSP2 Data1 RAM 0 */ + 0x0000, /* R12290 */ + 0x0000, /* R12291 */ + 0x0000, /* R12292 */ + 0x0000, /* R12293 */ + 0x0000, /* R12294 */ + 0x0000, /* R12295 */ + 0x0000, /* R12296 */ + 0x0000, /* R12297 */ + 0x0000, /* R12298 */ + 0x0000, /* R12299 */ + 0x0000, /* R12300 */ + 0x0000, /* R12301 */ + 0x0000, /* R12302 */ + 0x0000, /* R12303 */ + 0x0000, /* R12304 */ + 0x0000, /* R12305 */ + 0x0000, /* R12306 */ + 0x0000, /* R12307 */ + 0x0000, /* R12308 */ + 0x0000, /* R12309 */ + 0x0000, /* R12310 */ + 0x0000, /* R12311 */ + 0x0000, /* R12312 */ + 0x0000, /* R12313 */ + 0x0000, /* R12314 */ + 0x0000, /* R12315 */ + 0x0000, /* R12316 */ + 0x0000, /* R12317 */ + 0x0000, /* R12318 */ + 0x0000, /* R12319 */ + 0x0000, /* R12320 */ + 0x0000, /* R12321 */ + 0x0000, /* R12322 */ + 0x0000, /* R12323 */ + 0x0000, /* R12324 */ + 0x0000, /* R12325 */ + 0x0000, /* R12326 */ + 0x0000, /* R12327 */ + 0x0000, /* R12328 */ + 0x0000, /* R12329 */ + 0x0000, /* R12330 */ + 0x0000, /* R12331 */ + 0x0000, /* R12332 */ + 0x0000, /* R12333 */ + 0x0000, /* R12334 */ + 0x0000, /* R12335 */ + 0x0000, /* R12336 */ + 0x0000, /* R12337 */ + 0x0000, /* R12338 */ + 0x0000, /* R12339 */ + 0x0000, /* R12340 */ + 0x0000, /* R12341 */ + 0x0000, /* R12342 */ + 0x0000, /* R12343 */ + 0x0000, /* R12344 */ + 0x0000, /* R12345 */ + 0x0000, /* R12346 */ + 0x0000, /* R12347 */ + 0x0000, /* R12348 */ + 0x0000, /* R12349 */ + 0x0000, /* R12350 */ + 0x0000, /* R12351 */ + 0x0000, /* R12352 */ + 0x0000, /* R12353 */ + 0x0000, /* R12354 */ + 0x0000, /* R12355 */ + 0x0000, /* R12356 */ + 0x0000, /* R12357 */ + 0x0000, /* R12358 */ + 0x0000, /* R12359 */ + 0x0000, /* R12360 */ + 0x0000, /* R12361 */ + 0x0000, /* R12362 */ + 0x0000, /* R12363 */ + 0x0000, /* R12364 */ + 0x0000, /* R12365 */ + 0x0000, /* R12366 */ + 0x0000, /* R12367 */ + 0x0000, /* R12368 */ + 0x0000, /* R12369 */ + 0x0000, /* R12370 */ + 0x0000, /* R12371 */ + 0x0000, /* R12372 */ + 0x0000, /* R12373 */ + 0x0000, /* R12374 */ + 0x0000, /* R12375 */ + 0x0000, /* R12376 */ + 0x0000, /* R12377 */ + 0x0000, /* R12378 */ + 0x0000, /* R12379 */ + 0x0000, /* R12380 */ + 0x0000, /* R12381 */ + 0x0000, /* R12382 */ + 0x0000, /* R12383 */ + 0x0000, /* R12384 */ + 0x0000, /* R12385 */ + 0x0000, /* R12386 */ + 0x0000, /* R12387 */ + 0x0000, /* R12388 */ + 0x0000, /* R12389 */ + 0x0000, /* R12390 */ + 0x0000, /* R12391 */ + 0x0000, /* R12392 */ + 0x0000, /* R12393 */ + 0x0000, /* R12394 */ + 0x0000, /* R12395 */ + 0x0000, /* R12396 */ + 0x0000, /* R12397 */ + 0x0000, /* R12398 */ + 0x0000, /* R12399 */ + 0x0000, /* R12400 */ + 0x0000, /* R12401 */ + 0x0000, /* R12402 */ + 0x0000, /* R12403 */ + 0x0000, /* R12404 */ + 0x0000, /* R12405 */ + 0x0000, /* R12406 */ + 0x0000, /* R12407 */ + 0x0000, /* R12408 */ + 0x0000, /* R12409 */ + 0x0000, /* R12410 */ + 0x0000, /* R12411 */ + 0x0000, /* R12412 */ + 0x0000, /* R12413 */ + 0x0000, /* R12414 */ + 0x0000, /* R12415 */ + 0x0000, /* R12416 */ + 0x0000, /* R12417 */ + 0x0000, /* R12418 */ + 0x0000, /* R12419 */ + 0x0000, /* R12420 */ + 0x0000, /* R12421 */ + 0x0000, /* R12422 */ + 0x0000, /* R12423 */ + 0x0000, /* R12424 */ + 0x0000, /* R12425 */ + 0x0000, /* R12426 */ + 0x0000, /* R12427 */ + 0x0000, /* R12428 */ + 0x0000, /* R12429 */ + 0x0000, /* R12430 */ + 0x0000, /* R12431 */ + 0x0000, /* R12432 */ + 0x0000, /* R12433 */ + 0x0000, /* R12434 */ + 0x0000, /* R12435 */ + 0x0000, /* R12436 */ + 0x0000, /* R12437 */ + 0x0000, /* R12438 */ + 0x0000, /* R12439 */ + 0x0000, /* R12440 */ + 0x0000, /* R12441 */ + 0x0000, /* R12442 */ + 0x0000, /* R12443 */ + 0x0000, /* R12444 */ + 0x0000, /* R12445 */ + 0x0000, /* R12446 */ + 0x0000, /* R12447 */ + 0x0000, /* R12448 */ + 0x0000, /* R12449 */ + 0x0000, /* R12450 */ + 0x0000, /* R12451 */ + 0x0000, /* R12452 */ + 0x0000, /* R12453 */ + 0x0000, /* R12454 */ + 0x0000, /* R12455 */ + 0x0000, /* R12456 */ + 0x0000, /* R12457 */ + 0x0000, /* R12458 */ + 0x0000, /* R12459 */ + 0x0000, /* R12460 */ + 0x0000, /* R12461 */ + 0x0000, /* R12462 */ + 0x0000, /* R12463 */ + 0x0000, /* R12464 */ + 0x0000, /* R12465 */ + 0x0000, /* R12466 */ + 0x0000, /* R12467 */ + 0x0000, /* R12468 */ + 0x0000, /* R12469 */ + 0x0000, /* R12470 */ + 0x0000, /* R12471 */ + 0x0000, /* R12472 */ + 0x0000, /* R12473 */ + 0x0000, /* R12474 */ + 0x0000, /* R12475 */ + 0x0000, /* R12476 */ + 0x0000, /* R12477 */ + 0x0000, /* R12478 */ + 0x0000, /* R12479 */ + 0x0000, /* R12480 */ + 0x0000, /* R12481 */ + 0x0000, /* R12482 */ + 0x0000, /* R12483 */ + 0x0000, /* R12484 */ + 0x0000, /* R12485 */ + 0x0000, /* R12486 */ + 0x0000, /* R12487 */ + 0x0000, /* R12488 */ + 0x0000, /* R12489 */ + 0x0000, /* R12490 */ + 0x0000, /* R12491 */ + 0x0000, /* R12492 */ + 0x0000, /* R12493 */ + 0x0000, /* R12494 */ + 0x0000, /* R12495 */ + 0x0000, /* R12496 */ + 0x0000, /* R12497 */ + 0x0000, /* R12498 */ + 0x0000, /* R12499 */ + 0x0000, /* R12500 */ + 0x0000, /* R12501 */ + 0x0000, /* R12502 */ + 0x0000, /* R12503 */ + 0x0000, /* R12504 */ + 0x0000, /* R12505 */ + 0x0000, /* R12506 */ + 0x0000, /* R12507 */ + 0x0000, /* R12508 */ + 0x0000, /* R12509 */ + 0x0000, /* R12510 */ + 0x0000, /* R12511 */ + 0x0000, /* R12512 */ + 0x0000, /* R12513 */ + 0x0000, /* R12514 */ + 0x0000, /* R12515 */ + 0x0000, /* R12516 */ + 0x0000, /* R12517 */ + 0x0000, /* R12518 */ + 0x0000, /* R12519 */ + 0x0000, /* R12520 */ + 0x0000, /* R12521 */ + 0x0000, /* R12522 */ + 0x0000, /* R12523 */ + 0x0000, /* R12524 */ + 0x0000, /* R12525 */ + 0x0000, /* R12526 */ + 0x0000, /* R12527 */ + 0x0000, /* R12528 */ + 0x0000, /* R12529 */ + 0x0000, /* R12530 */ + 0x0000, /* R12531 */ + 0x0000, /* R12532 */ + 0x0000, /* R12533 */ + 0x0000, /* R12534 */ + 0x0000, /* R12535 */ + 0x0000, /* R12536 */ + 0x0000, /* R12537 */ + 0x0000, /* R12538 */ + 0x0000, /* R12539 */ + 0x0000, /* R12540 */ + 0x0000, /* R12541 */ + 0x0000, /* R12542 */ + 0x0000, /* R12543 */ + 0x0000, /* R12544 */ + 0x0000, /* R12545 */ + 0x0000, /* R12546 */ + 0x0000, /* R12547 */ + 0x0000, /* R12548 */ + 0x0000, /* R12549 */ + 0x0000, /* R12550 */ + 0x0000, /* R12551 */ + 0x0000, /* R12552 */ + 0x0000, /* R12553 */ + 0x0000, /* R12554 */ + 0x0000, /* R12555 */ + 0x0000, /* R12556 */ + 0x0000, /* R12557 */ + 0x0000, /* R12558 */ + 0x0000, /* R12559 */ + 0x0000, /* R12560 */ + 0x0000, /* R12561 */ + 0x0000, /* R12562 */ + 0x0000, /* R12563 */ + 0x0000, /* R12564 */ + 0x0000, /* R12565 */ + 0x0000, /* R12566 */ + 0x0000, /* R12567 */ + 0x0000, /* R12568 */ + 0x0000, /* R12569 */ + 0x0000, /* R12570 */ + 0x0000, /* R12571 */ + 0x0000, /* R12572 */ + 0x0000, /* R12573 */ + 0x0000, /* R12574 */ + 0x0000, /* R12575 */ + 0x0000, /* R12576 */ + 0x0000, /* R12577 */ + 0x0000, /* R12578 */ + 0x0000, /* R12579 */ + 0x0000, /* R12580 */ + 0x0000, /* R12581 */ + 0x0000, /* R12582 */ + 0x0000, /* R12583 */ + 0x0000, /* R12584 */ + 0x0000, /* R12585 */ + 0x0000, /* R12586 */ + 0x0000, /* R12587 */ + 0x0000, /* R12588 */ + 0x0000, /* R12589 */ + 0x0000, /* R12590 */ + 0x0000, /* R12591 */ + 0x0000, /* R12592 */ + 0x0000, /* R12593 */ + 0x0000, /* R12594 */ + 0x0000, /* R12595 */ + 0x0000, /* R12596 */ + 0x0000, /* R12597 */ + 0x0000, /* R12598 */ + 0x0000, /* R12599 */ + 0x0000, /* R12600 */ + 0x0000, /* R12601 */ + 0x0000, /* R12602 */ + 0x0000, /* R12603 */ + 0x0000, /* R12604 */ + 0x0000, /* R12605 */ + 0x0000, /* R12606 */ + 0x0000, /* R12607 */ + 0x0000, /* R12608 */ + 0x0000, /* R12609 */ + 0x0000, /* R12610 */ + 0x0000, /* R12611 */ + 0x0000, /* R12612 */ + 0x0000, /* R12613 */ + 0x0000, /* R12614 */ + 0x0000, /* R12615 */ + 0x0000, /* R12616 */ + 0x0000, /* R12617 */ + 0x0000, /* R12618 */ + 0x0000, /* R12619 */ + 0x0000, /* R12620 */ + 0x0000, /* R12621 */ + 0x0000, /* R12622 */ + 0x0000, /* R12623 */ + 0x0000, /* R12624 */ + 0x0000, /* R12625 */ + 0x0000, /* R12626 */ + 0x0000, /* R12627 */ + 0x0000, /* R12628 */ + 0x0000, /* R12629 */ + 0x0000, /* R12630 */ + 0x0000, /* R12631 */ + 0x0000, /* R12632 */ + 0x0000, /* R12633 */ + 0x0000, /* R12634 */ + 0x0000, /* R12635 */ + 0x0000, /* R12636 */ + 0x0000, /* R12637 */ + 0x0000, /* R12638 */ + 0x0000, /* R12639 */ + 0x0000, /* R12640 */ + 0x0000, /* R12641 */ + 0x0000, /* R12642 */ + 0x0000, /* R12643 */ + 0x0000, /* R12644 */ + 0x0000, /* R12645 */ + 0x0000, /* R12646 */ + 0x0000, /* R12647 */ + 0x0000, /* R12648 */ + 0x0000, /* R12649 */ + 0x0000, /* R12650 */ + 0x0000, /* R12651 */ + 0x0000, /* R12652 */ + 0x0000, /* R12653 */ + 0x0000, /* R12654 */ + 0x0000, /* R12655 */ + 0x0000, /* R12656 */ + 0x0000, /* R12657 */ + 0x0000, /* R12658 */ + 0x0000, /* R12659 */ + 0x0000, /* R12660 */ + 0x0000, /* R12661 */ + 0x0000, /* R12662 */ + 0x0000, /* R12663 */ + 0x0000, /* R12664 */ + 0x0000, /* R12665 */ + 0x0000, /* R12666 */ + 0x0000, /* R12667 */ + 0x0000, /* R12668 */ + 0x0000, /* R12669 */ + 0x0000, /* R12670 */ + 0x0000, /* R12671 */ + 0x0000, /* R12672 */ + 0x0000, /* R12673 */ + 0x0000, /* R12674 */ + 0x0000, /* R12675 */ + 0x0000, /* R12676 */ + 0x0000, /* R12677 */ + 0x0000, /* R12678 */ + 0x0000, /* R12679 */ + 0x0000, /* R12680 */ + 0x0000, /* R12681 */ + 0x0000, /* R12682 */ + 0x0000, /* R12683 */ + 0x0000, /* R12684 */ + 0x0000, /* R12685 */ + 0x0000, /* R12686 */ + 0x0000, /* R12687 */ + 0x0000, /* R12688 */ + 0x0000, /* R12689 */ + 0x0000, /* R12690 */ + 0x0000, /* R12691 */ + 0x0000, /* R12692 */ + 0x0000, /* R12693 */ + 0x0000, /* R12694 */ + 0x0000, /* R12695 */ + 0x0000, /* R12696 */ + 0x0000, /* R12697 */ + 0x0000, /* R12698 */ + 0x0000, /* R12699 */ + 0x0000, /* R12700 */ + 0x0000, /* R12701 */ + 0x0000, /* R12702 */ + 0x0000, /* R12703 */ + 0x0000, /* R12704 */ + 0x0000, /* R12705 */ + 0x0000, /* R12706 */ + 0x0000, /* R12707 */ + 0x0000, /* R12708 */ + 0x0000, /* R12709 */ + 0x0000, /* R12710 */ + 0x0000, /* R12711 */ + 0x0000, /* R12712 */ + 0x0000, /* R12713 */ + 0x0000, /* R12714 */ + 0x0000, /* R12715 */ + 0x0000, /* R12716 */ + 0x0000, /* R12717 */ + 0x0000, /* R12718 */ + 0x0000, /* R12719 */ + 0x0000, /* R12720 */ + 0x0000, /* R12721 */ + 0x0000, /* R12722 */ + 0x0000, /* R12723 */ + 0x0000, /* R12724 */ + 0x0000, /* R12725 */ + 0x0000, /* R12726 */ + 0x0000, /* R12727 */ + 0x0000, /* R12728 */ + 0x0000, /* R12729 */ + 0x0000, /* R12730 */ + 0x0000, /* R12731 */ + 0x0000, /* R12732 */ + 0x0000, /* R12733 */ + 0x0000, /* R12734 */ + 0x0000, /* R12735 */ + 0x0000, /* R12736 */ + 0x0000, /* R12737 */ + 0x0000, /* R12738 */ + 0x0000, /* R12739 */ + 0x0000, /* R12740 */ + 0x0000, /* R12741 */ + 0x0000, /* R12742 */ + 0x0000, /* R12743 */ + 0x0000, /* R12744 */ + 0x0000, /* R12745 */ + 0x0000, /* R12746 */ + 0x0000, /* R12747 */ + 0x0000, /* R12748 */ + 0x0000, /* R12749 */ + 0x0000, /* R12750 */ + 0x0000, /* R12751 */ + 0x0000, /* R12752 */ + 0x0000, /* R12753 */ + 0x0000, /* R12754 */ + 0x0000, /* R12755 */ + 0x0000, /* R12756 */ + 0x0000, /* R12757 */ + 0x0000, /* R12758 */ + 0x0000, /* R12759 */ + 0x0000, /* R12760 */ + 0x0000, /* R12761 */ + 0x0000, /* R12762 */ + 0x0000, /* R12763 */ + 0x0000, /* R12764 */ + 0x0000, /* R12765 */ + 0x0000, /* R12766 */ + 0x0000, /* R12767 */ + 0x0000, /* R12768 */ + 0x0000, /* R12769 */ + 0x0000, /* R12770 */ + 0x0000, /* R12771 */ + 0x0000, /* R12772 */ + 0x0000, /* R12773 */ + 0x0000, /* R12774 */ + 0x0000, /* R12775 */ + 0x0000, /* R12776 */ + 0x0000, /* R12777 */ + 0x0000, /* R12778 */ + 0x0000, /* R12779 */ + 0x0000, /* R12780 */ + 0x0000, /* R12781 */ + 0x0000, /* R12782 */ + 0x0000, /* R12783 */ + 0x0000, /* R12784 */ + 0x0000, /* R12785 */ + 0x0000, /* R12786 */ + 0x0000, /* R12787 */ + 0x0000, /* R12788 */ + 0x0000, /* R12789 */ + 0x0000, /* R12790 */ + 0x0000, /* R12791 */ + 0x0000, /* R12792 */ + 0x0000, /* R12793 */ + 0x0000, /* R12794 */ + 0x0000, /* R12795 */ + 0x0000, /* R12796 */ + 0x0000, /* R12797 */ + 0x0000, /* R12798 */ + 0x0000, /* R12799 */ + 0x0000, /* R12800 */ + 0x0000, /* R12801 */ + 0x0000, /* R12802 */ + 0x0000, /* R12803 */ + 0x0000, /* R12804 */ + 0x0000, /* R12805 */ + 0x0000, /* R12806 */ + 0x0000, /* R12807 */ + 0x0000, /* R12808 */ + 0x0000, /* R12809 */ + 0x0000, /* R12810 */ + 0x0000, /* R12811 */ + 0x0000, /* R12812 */ + 0x0000, /* R12813 */ + 0x0000, /* R12814 */ + 0x0000, /* R12815 */ + 0x0000, /* R12816 */ + 0x0000, /* R12817 */ + 0x0000, /* R12818 */ + 0x0000, /* R12819 */ + 0x0000, /* R12820 */ + 0x0000, /* R12821 */ + 0x0000, /* R12822 */ + 0x0000, /* R12823 */ + 0x0000, /* R12824 */ + 0x0000, /* R12825 */ + 0x0000, /* R12826 */ + 0x0000, /* R12827 */ + 0x0000, /* R12828 */ + 0x0000, /* R12829 */ + 0x0000, /* R12830 */ + 0x0000, /* R12831 */ + 0x0000, /* R12832 */ + 0x0000, /* R12833 */ + 0x0000, /* R12834 */ + 0x0000, /* R12835 */ + 0x0000, /* R12836 */ + 0x0000, /* R12837 */ + 0x0000, /* R12838 */ + 0x0000, /* R12839 */ + 0x0000, /* R12840 */ + 0x0000, /* R12841 */ + 0x0000, /* R12842 */ + 0x0000, /* R12843 */ + 0x0000, /* R12844 */ + 0x0000, /* R12845 */ + 0x0000, /* R12846 */ + 0x0000, /* R12847 */ + 0x0000, /* R12848 */ + 0x0000, /* R12849 */ + 0x0000, /* R12850 */ + 0x0000, /* R12851 */ + 0x0000, /* R12852 */ + 0x0000, /* R12853 */ + 0x0000, /* R12854 */ + 0x0000, /* R12855 */ + 0x0000, /* R12856 */ + 0x0000, /* R12857 */ + 0x0000, /* R12858 */ + 0x0000, /* R12859 */ + 0x0000, /* R12860 */ + 0x0000, /* R12861 */ + 0x0000, /* R12862 */ + 0x0000, /* R12863 */ + 0x0000, /* R12864 */ + 0x0000, /* R12865 */ + 0x0000, /* R12866 */ + 0x0000, /* R12867 */ + 0x0000, /* R12868 */ + 0x0000, /* R12869 */ + 0x0000, /* R12870 */ + 0x0000, /* R12871 */ + 0x0000, /* R12872 */ + 0x0000, /* R12873 */ + 0x0000, /* R12874 */ + 0x0000, /* R12875 */ + 0x0000, /* R12876 */ + 0x0000, /* R12877 */ + 0x0000, /* R12878 */ + 0x0000, /* R12879 */ + 0x0000, /* R12880 */ + 0x0000, /* R12881 */ + 0x0000, /* R12882 */ + 0x0000, /* R12883 */ + 0x0000, /* R12884 */ + 0x0000, /* R12885 */ + 0x0000, /* R12886 */ + 0x0000, /* R12887 */ + 0x0000, /* R12888 */ + 0x0000, /* R12889 */ + 0x0000, /* R12890 */ + 0x0000, /* R12891 */ + 0x0000, /* R12892 */ + 0x0000, /* R12893 */ + 0x0000, /* R12894 */ + 0x0000, /* R12895 */ + 0x0000, /* R12896 */ + 0x0000, /* R12897 */ + 0x0000, /* R12898 */ + 0x0000, /* R12899 */ + 0x0000, /* R12900 */ + 0x0000, /* R12901 */ + 0x0000, /* R12902 */ + 0x0000, /* R12903 */ + 0x0000, /* R12904 */ + 0x0000, /* R12905 */ + 0x0000, /* R12906 */ + 0x0000, /* R12907 */ + 0x0000, /* R12908 */ + 0x0000, /* R12909 */ + 0x0000, /* R12910 */ + 0x0000, /* R12911 */ + 0x0000, /* R12912 */ + 0x0000, /* R12913 */ + 0x0000, /* R12914 */ + 0x0000, /* R12915 */ + 0x0000, /* R12916 */ + 0x0000, /* R12917 */ + 0x0000, /* R12918 */ + 0x0000, /* R12919 */ + 0x0000, /* R12920 */ + 0x0000, /* R12921 */ + 0x0000, /* R12922 */ + 0x0000, /* R12923 */ + 0x0000, /* R12924 */ + 0x0000, /* R12925 */ + 0x0000, /* R12926 */ + 0x0000, /* R12927 */ + 0x0000, /* R12928 */ + 0x0000, /* R12929 */ + 0x0000, /* R12930 */ + 0x0000, /* R12931 */ + 0x0000, /* R12932 */ + 0x0000, /* R12933 */ + 0x0000, /* R12934 */ + 0x0000, /* R12935 */ + 0x0000, /* R12936 */ + 0x0000, /* R12937 */ + 0x0000, /* R12938 */ + 0x0000, /* R12939 */ + 0x0000, /* R12940 */ + 0x0000, /* R12941 */ + 0x0000, /* R12942 */ + 0x0000, /* R12943 */ + 0x0000, /* R12944 */ + 0x0000, /* R12945 */ + 0x0000, /* R12946 */ + 0x0000, /* R12947 */ + 0x0000, /* R12948 */ + 0x0000, /* R12949 */ + 0x0000, /* R12950 */ + 0x0000, /* R12951 */ + 0x0000, /* R12952 */ + 0x0000, /* R12953 */ + 0x0000, /* R12954 */ + 0x0000, /* R12955 */ + 0x0000, /* R12956 */ + 0x0000, /* R12957 */ + 0x0000, /* R12958 */ + 0x0000, /* R12959 */ + 0x0000, /* R12960 */ + 0x0000, /* R12961 */ + 0x0000, /* R12962 */ + 0x0000, /* R12963 */ + 0x0000, /* R12964 */ + 0x0000, /* R12965 */ + 0x0000, /* R12966 */ + 0x0000, /* R12967 */ + 0x0000, /* R12968 */ + 0x0000, /* R12969 */ + 0x0000, /* R12970 */ + 0x0000, /* R12971 */ + 0x0000, /* R12972 */ + 0x0000, /* R12973 */ + 0x0000, /* R12974 */ + 0x0000, /* R12975 */ + 0x0000, /* R12976 */ + 0x0000, /* R12977 */ + 0x0000, /* R12978 */ + 0x0000, /* R12979 */ + 0x0000, /* R12980 */ + 0x0000, /* R12981 */ + 0x0000, /* R12982 */ + 0x0000, /* R12983 */ + 0x0000, /* R12984 */ + 0x0000, /* R12985 */ + 0x0000, /* R12986 */ + 0x0000, /* R12987 */ + 0x0000, /* R12988 */ + 0x0000, /* R12989 */ + 0x0000, /* R12990 */ + 0x0000, /* R12991 */ + 0x0000, /* R12992 */ + 0x0000, /* R12993 */ + 0x0000, /* R12994 */ + 0x0000, /* R12995 */ + 0x0000, /* R12996 */ + 0x0000, /* R12997 */ + 0x0000, /* R12998 */ + 0x0000, /* R12999 */ + 0x0000, /* R13000 */ + 0x0000, /* R13001 */ + 0x0000, /* R13002 */ + 0x0000, /* R13003 */ + 0x0000, /* R13004 */ + 0x0000, /* R13005 */ + 0x0000, /* R13006 */ + 0x0000, /* R13007 */ + 0x0000, /* R13008 */ + 0x0000, /* R13009 */ + 0x0000, /* R13010 */ + 0x0000, /* R13011 */ + 0x0000, /* R13012 */ + 0x0000, /* R13013 */ + 0x0000, /* R13014 */ + 0x0000, /* R13015 */ + 0x0000, /* R13016 */ + 0x0000, /* R13017 */ + 0x0000, /* R13018 */ + 0x0000, /* R13019 */ + 0x0000, /* R13020 */ + 0x0000, /* R13021 */ + 0x0000, /* R13022 */ + 0x0000, /* R13023 */ + 0x0000, /* R13024 */ + 0x0000, /* R13025 */ + 0x0000, /* R13026 */ + 0x0000, /* R13027 */ + 0x0000, /* R13028 */ + 0x0000, /* R13029 */ + 0x0000, /* R13030 */ + 0x0000, /* R13031 */ + 0x0000, /* R13032 */ + 0x0000, /* R13033 */ + 0x0000, /* R13034 */ + 0x0000, /* R13035 */ + 0x0000, /* R13036 */ + 0x0000, /* R13037 */ + 0x0000, /* R13038 */ + 0x0000, /* R13039 */ + 0x0000, /* R13040 */ + 0x0000, /* R13041 */ + 0x0000, /* R13042 */ + 0x0000, /* R13043 */ + 0x0000, /* R13044 */ + 0x0000, /* R13045 */ + 0x0000, /* R13046 */ + 0x0000, /* R13047 */ + 0x0000, /* R13048 */ + 0x0000, /* R13049 */ + 0x0000, /* R13050 */ + 0x0000, /* R13051 */ + 0x0000, /* R13052 */ + 0x0000, /* R13053 */ + 0x0000, /* R13054 */ + 0x0000, /* R13055 */ + 0x0000, /* R13056 */ + 0x0000, /* R13057 */ + 0x0000, /* R13058 */ + 0x0000, /* R13059 */ + 0x0000, /* R13060 */ + 0x0000, /* R13061 */ + 0x0000, /* R13062 */ + 0x0000, /* R13063 */ + 0x0000, /* R13064 */ + 0x0000, /* R13065 */ + 0x0000, /* R13066 */ + 0x0000, /* R13067 */ + 0x0000, /* R13068 */ + 0x0000, /* R13069 */ + 0x0000, /* R13070 */ + 0x0000, /* R13071 */ + 0x0000, /* R13072 */ + 0x0000, /* R13073 */ + 0x0000, /* R13074 */ + 0x0000, /* R13075 */ + 0x0000, /* R13076 */ + 0x0000, /* R13077 */ + 0x0000, /* R13078 */ + 0x0000, /* R13079 */ + 0x0000, /* R13080 */ + 0x0000, /* R13081 */ + 0x0000, /* R13082 */ + 0x0000, /* R13083 */ + 0x0000, /* R13084 */ + 0x0000, /* R13085 */ + 0x0000, /* R13086 */ + 0x0000, /* R13087 */ + 0x0000, /* R13088 */ + 0x0000, /* R13089 */ + 0x0000, /* R13090 */ + 0x0000, /* R13091 */ + 0x0000, /* R13092 */ + 0x0000, /* R13093 */ + 0x0000, /* R13094 */ + 0x0000, /* R13095 */ + 0x0000, /* R13096 */ + 0x0000, /* R13097 */ + 0x0000, /* R13098 */ + 0x0000, /* R13099 */ + 0x0000, /* R13100 */ + 0x0000, /* R13101 */ + 0x0000, /* R13102 */ + 0x0000, /* R13103 */ + 0x0000, /* R13104 */ + 0x0000, /* R13105 */ + 0x0000, /* R13106 */ + 0x0000, /* R13107 */ + 0x0000, /* R13108 */ + 0x0000, /* R13109 */ + 0x0000, /* R13110 */ + 0x0000, /* R13111 */ + 0x0000, /* R13112 */ + 0x0000, /* R13113 */ + 0x0000, /* R13114 */ + 0x0000, /* R13115 */ + 0x0000, /* R13116 */ + 0x0000, /* R13117 */ + 0x0000, /* R13118 */ + 0x0000, /* R13119 */ + 0x0000, /* R13120 */ + 0x0000, /* R13121 */ + 0x0000, /* R13122 */ + 0x0000, /* R13123 */ + 0x0000, /* R13124 */ + 0x0000, /* R13125 */ + 0x0000, /* R13126 */ + 0x0000, /* R13127 */ + 0x0000, /* R13128 */ + 0x0000, /* R13129 */ + 0x0000, /* R13130 */ + 0x0000, /* R13131 */ + 0x0000, /* R13132 */ + 0x0000, /* R13133 */ + 0x0000, /* R13134 */ + 0x0000, /* R13135 */ + 0x0000, /* R13136 */ + 0x0000, /* R13137 */ + 0x0000, /* R13138 */ + 0x0000, /* R13139 */ + 0x0000, /* R13140 */ + 0x0000, /* R13141 */ + 0x0000, /* R13142 */ + 0x0000, /* R13143 */ + 0x0000, /* R13144 */ + 0x0000, /* R13145 */ + 0x0000, /* R13146 */ + 0x0000, /* R13147 */ + 0x0000, /* R13148 */ + 0x0000, /* R13149 */ + 0x0000, /* R13150 */ + 0x0000, /* R13151 */ + 0x0000, /* R13152 */ + 0x0000, /* R13153 */ + 0x0000, /* R13154 */ + 0x0000, /* R13155 */ + 0x0000, /* R13156 */ + 0x0000, /* R13157 */ + 0x0000, /* R13158 */ + 0x0000, /* R13159 */ + 0x0000, /* R13160 */ + 0x0000, /* R13161 */ + 0x0000, /* R13162 */ + 0x0000, /* R13163 */ + 0x0000, /* R13164 */ + 0x0000, /* R13165 */ + 0x0000, /* R13166 */ + 0x0000, /* R13167 */ + 0x0000, /* R13168 */ + 0x0000, /* R13169 */ + 0x0000, /* R13170 */ + 0x0000, /* R13171 */ + 0x0000, /* R13172 */ + 0x0000, /* R13173 */ + 0x0000, /* R13174 */ + 0x0000, /* R13175 */ + 0x0000, /* R13176 */ + 0x0000, /* R13177 */ + 0x0000, /* R13178 */ + 0x0000, /* R13179 */ + 0x0000, /* R13180 */ + 0x0000, /* R13181 */ + 0x0000, /* R13182 */ + 0x0000, /* R13183 */ + 0x0000, /* R13184 */ + 0x0000, /* R13185 */ + 0x0000, /* R13186 */ + 0x0000, /* R13187 */ + 0x0000, /* R13188 */ + 0x0000, /* R13189 */ + 0x0000, /* R13190 */ + 0x0000, /* R13191 */ + 0x0000, /* R13192 */ + 0x0000, /* R13193 */ + 0x0000, /* R13194 */ + 0x0000, /* R13195 */ + 0x0000, /* R13196 */ + 0x0000, /* R13197 */ + 0x0000, /* R13198 */ + 0x0000, /* R13199 */ + 0x0000, /* R13200 */ + 0x0000, /* R13201 */ + 0x0000, /* R13202 */ + 0x0000, /* R13203 */ + 0x0000, /* R13204 */ + 0x0000, /* R13205 */ + 0x0000, /* R13206 */ + 0x0000, /* R13207 */ + 0x0000, /* R13208 */ + 0x0000, /* R13209 */ + 0x0000, /* R13210 */ + 0x0000, /* R13211 */ + 0x0000, /* R13212 */ + 0x0000, /* R13213 */ + 0x0000, /* R13214 */ + 0x0000, /* R13215 */ + 0x0000, /* R13216 */ + 0x0000, /* R13217 */ + 0x0000, /* R13218 */ + 0x0000, /* R13219 */ + 0x0000, /* R13220 */ + 0x0000, /* R13221 */ + 0x0000, /* R13222 */ + 0x0000, /* R13223 */ + 0x0000, /* R13224 */ + 0x0000, /* R13225 */ + 0x0000, /* R13226 */ + 0x0000, /* R13227 */ + 0x0000, /* R13228 */ + 0x0000, /* R13229 */ + 0x0000, /* R13230 */ + 0x0000, /* R13231 */ + 0x0000, /* R13232 */ + 0x0000, /* R13233 */ + 0x0000, /* R13234 */ + 0x0000, /* R13235 */ + 0x0000, /* R13236 */ + 0x0000, /* R13237 */ + 0x0000, /* R13238 */ + 0x0000, /* R13239 */ + 0x0000, /* R13240 */ + 0x0000, /* R13241 */ + 0x0000, /* R13242 */ + 0x0000, /* R13243 */ + 0x0000, /* R13244 */ + 0x0000, /* R13245 */ + 0x0000, /* R13246 */ + 0x0000, /* R13247 */ + 0x0000, /* R13248 */ + 0x0000, /* R13249 */ + 0x0000, /* R13250 */ + 0x0000, /* R13251 */ + 0x0000, /* R13252 */ + 0x0000, /* R13253 */ + 0x0000, /* R13254 */ + 0x0000, /* R13255 */ + 0x0000, /* R13256 */ + 0x0000, /* R13257 */ + 0x0000, /* R13258 */ + 0x0000, /* R13259 */ + 0x0000, /* R13260 */ + 0x0000, /* R13261 */ + 0x0000, /* R13262 */ + 0x0000, /* R13263 */ + 0x0000, /* R13264 */ + 0x0000, /* R13265 */ + 0x0000, /* R13266 */ + 0x0000, /* R13267 */ + 0x0000, /* R13268 */ + 0x0000, /* R13269 */ + 0x0000, /* R13270 */ + 0x0000, /* R13271 */ + 0x0000, /* R13272 */ + 0x0000, /* R13273 */ + 0x0000, /* R13274 */ + 0x0000, /* R13275 */ + 0x0000, /* R13276 */ + 0x0000, /* R13277 */ + 0x0000, /* R13278 */ + 0x0000, /* R13279 */ + 0x0000, /* R13280 */ + 0x0000, /* R13281 */ + 0x0000, /* R13282 */ + 0x0000, /* R13283 */ + 0x0000, /* R13284 */ + 0x0000, /* R13285 */ + 0x0000, /* R13286 */ + 0x0000, /* R13287 */ + 0x0000, /* R13288 */ + 0x0000, /* R13289 */ + 0x0000, /* R13290 */ + 0x0000, /* R13291 */ + 0x0000, /* R13292 */ + 0x0000, /* R13293 */ + 0x0000, /* R13294 */ + 0x0000, /* R13295 */ + 0x0000, /* R13296 */ + 0x0000, /* R13297 */ + 0x0000, /* R13298 */ + 0x0000, /* R13299 */ + 0x0000, /* R13300 */ + 0x0000, /* R13301 */ + 0x0000, /* R13302 */ + 0x0000, /* R13303 */ + 0x0000, /* R13304 */ + 0x0000, /* R13305 */ + 0x0000, /* R13306 */ + 0x0000, /* R13307 */ + 0x0000, /* R13308 */ + 0x0000, /* R13309 */ + 0x0000, /* R13310 */ + 0x0000, /* R13311 */ + 0x0000, /* R13312 - DSP2 Data2 RAM 1 */ + 0x0000, /* R13313 - DSP2 Data2 RAM 0 */ + 0x0000, /* R13314 */ + 0x0000, /* R13315 */ + 0x0000, /* R13316 */ + 0x0000, /* R13317 */ + 0x0000, /* R13318 */ + 0x0000, /* R13319 */ + 0x0000, /* R13320 */ + 0x0000, /* R13321 */ + 0x0000, /* R13322 */ + 0x0000, /* R13323 */ + 0x0000, /* R13324 */ + 0x0000, /* R13325 */ + 0x0000, /* R13326 */ + 0x0000, /* R13327 */ + 0x0000, /* R13328 */ + 0x0000, /* R13329 */ + 0x0000, /* R13330 */ + 0x0000, /* R13331 */ + 0x0000, /* R13332 */ + 0x0000, /* R13333 */ + 0x0000, /* R13334 */ + 0x0000, /* R13335 */ + 0x0000, /* R13336 */ + 0x0000, /* R13337 */ + 0x0000, /* R13338 */ + 0x0000, /* R13339 */ + 0x0000, /* R13340 */ + 0x0000, /* R13341 */ + 0x0000, /* R13342 */ + 0x0000, /* R13343 */ + 0x0000, /* R13344 */ + 0x0000, /* R13345 */ + 0x0000, /* R13346 */ + 0x0000, /* R13347 */ + 0x0000, /* R13348 */ + 0x0000, /* R13349 */ + 0x0000, /* R13350 */ + 0x0000, /* R13351 */ + 0x0000, /* R13352 */ + 0x0000, /* R13353 */ + 0x0000, /* R13354 */ + 0x0000, /* R13355 */ + 0x0000, /* R13356 */ + 0x0000, /* R13357 */ + 0x0000, /* R13358 */ + 0x0000, /* R13359 */ + 0x0000, /* R13360 */ + 0x0000, /* R13361 */ + 0x0000, /* R13362 */ + 0x0000, /* R13363 */ + 0x0000, /* R13364 */ + 0x0000, /* R13365 */ + 0x0000, /* R13366 */ + 0x0000, /* R13367 */ + 0x0000, /* R13368 */ + 0x0000, /* R13369 */ + 0x0000, /* R13370 */ + 0x0000, /* R13371 */ + 0x0000, /* R13372 */ + 0x0000, /* R13373 */ + 0x0000, /* R13374 */ + 0x0000, /* R13375 */ + 0x0000, /* R13376 */ + 0x0000, /* R13377 */ + 0x0000, /* R13378 */ + 0x0000, /* R13379 */ + 0x0000, /* R13380 */ + 0x0000, /* R13381 */ + 0x0000, /* R13382 */ + 0x0000, /* R13383 */ + 0x0000, /* R13384 */ + 0x0000, /* R13385 */ + 0x0000, /* R13386 */ + 0x0000, /* R13387 */ + 0x0000, /* R13388 */ + 0x0000, /* R13389 */ + 0x0000, /* R13390 */ + 0x0000, /* R13391 */ + 0x0000, /* R13392 */ + 0x0000, /* R13393 */ + 0x0000, /* R13394 */ + 0x0000, /* R13395 */ + 0x0000, /* R13396 */ + 0x0000, /* R13397 */ + 0x0000, /* R13398 */ + 0x0000, /* R13399 */ + 0x0000, /* R13400 */ + 0x0000, /* R13401 */ + 0x0000, /* R13402 */ + 0x0000, /* R13403 */ + 0x0000, /* R13404 */ + 0x0000, /* R13405 */ + 0x0000, /* R13406 */ + 0x0000, /* R13407 */ + 0x0000, /* R13408 */ + 0x0000, /* R13409 */ + 0x0000, /* R13410 */ + 0x0000, /* R13411 */ + 0x0000, /* R13412 */ + 0x0000, /* R13413 */ + 0x0000, /* R13414 */ + 0x0000, /* R13415 */ + 0x0000, /* R13416 */ + 0x0000, /* R13417 */ + 0x0000, /* R13418 */ + 0x0000, /* R13419 */ + 0x0000, /* R13420 */ + 0x0000, /* R13421 */ + 0x0000, /* R13422 */ + 0x0000, /* R13423 */ + 0x0000, /* R13424 */ + 0x0000, /* R13425 */ + 0x0000, /* R13426 */ + 0x0000, /* R13427 */ + 0x0000, /* R13428 */ + 0x0000, /* R13429 */ + 0x0000, /* R13430 */ + 0x0000, /* R13431 */ + 0x0000, /* R13432 */ + 0x0000, /* R13433 */ + 0x0000, /* R13434 */ + 0x0000, /* R13435 */ + 0x0000, /* R13436 */ + 0x0000, /* R13437 */ + 0x0000, /* R13438 */ + 0x0000, /* R13439 */ + 0x0000, /* R13440 */ + 0x0000, /* R13441 */ + 0x0000, /* R13442 */ + 0x0000, /* R13443 */ + 0x0000, /* R13444 */ + 0x0000, /* R13445 */ + 0x0000, /* R13446 */ + 0x0000, /* R13447 */ + 0x0000, /* R13448 */ + 0x0000, /* R13449 */ + 0x0000, /* R13450 */ + 0x0000, /* R13451 */ + 0x0000, /* R13452 */ + 0x0000, /* R13453 */ + 0x0000, /* R13454 */ + 0x0000, /* R13455 */ + 0x0000, /* R13456 */ + 0x0000, /* R13457 */ + 0x0000, /* R13458 */ + 0x0000, /* R13459 */ + 0x0000, /* R13460 */ + 0x0000, /* R13461 */ + 0x0000, /* R13462 */ + 0x0000, /* R13463 */ + 0x0000, /* R13464 */ + 0x0000, /* R13465 */ + 0x0000, /* R13466 */ + 0x0000, /* R13467 */ + 0x0000, /* R13468 */ + 0x0000, /* R13469 */ + 0x0000, /* R13470 */ + 0x0000, /* R13471 */ + 0x0000, /* R13472 */ + 0x0000, /* R13473 */ + 0x0000, /* R13474 */ + 0x0000, /* R13475 */ + 0x0000, /* R13476 */ + 0x0000, /* R13477 */ + 0x0000, /* R13478 */ + 0x0000, /* R13479 */ + 0x0000, /* R13480 */ + 0x0000, /* R13481 */ + 0x0000, /* R13482 */ + 0x0000, /* R13483 */ + 0x0000, /* R13484 */ + 0x0000, /* R13485 */ + 0x0000, /* R13486 */ + 0x0000, /* R13487 */ + 0x0000, /* R13488 */ + 0x0000, /* R13489 */ + 0x0000, /* R13490 */ + 0x0000, /* R13491 */ + 0x0000, /* R13492 */ + 0x0000, /* R13493 */ + 0x0000, /* R13494 */ + 0x0000, /* R13495 */ + 0x0000, /* R13496 */ + 0x0000, /* R13497 */ + 0x0000, /* R13498 */ + 0x0000, /* R13499 */ + 0x0000, /* R13500 */ + 0x0000, /* R13501 */ + 0x0000, /* R13502 */ + 0x0000, /* R13503 */ + 0x0000, /* R13504 */ + 0x0000, /* R13505 */ + 0x0000, /* R13506 */ + 0x0000, /* R13507 */ + 0x0000, /* R13508 */ + 0x0000, /* R13509 */ + 0x0000, /* R13510 */ + 0x0000, /* R13511 */ + 0x0000, /* R13512 */ + 0x0000, /* R13513 */ + 0x0000, /* R13514 */ + 0x0000, /* R13515 */ + 0x0000, /* R13516 */ + 0x0000, /* R13517 */ + 0x0000, /* R13518 */ + 0x0000, /* R13519 */ + 0x0000, /* R13520 */ + 0x0000, /* R13521 */ + 0x0000, /* R13522 */ + 0x0000, /* R13523 */ + 0x0000, /* R13524 */ + 0x0000, /* R13525 */ + 0x0000, /* R13526 */ + 0x0000, /* R13527 */ + 0x0000, /* R13528 */ + 0x0000, /* R13529 */ + 0x0000, /* R13530 */ + 0x0000, /* R13531 */ + 0x0000, /* R13532 */ + 0x0000, /* R13533 */ + 0x0000, /* R13534 */ + 0x0000, /* R13535 */ + 0x0000, /* R13536 */ + 0x0000, /* R13537 */ + 0x0000, /* R13538 */ + 0x0000, /* R13539 */ + 0x0000, /* R13540 */ + 0x0000, /* R13541 */ + 0x0000, /* R13542 */ + 0x0000, /* R13543 */ + 0x0000, /* R13544 */ + 0x0000, /* R13545 */ + 0x0000, /* R13546 */ + 0x0000, /* R13547 */ + 0x0000, /* R13548 */ + 0x0000, /* R13549 */ + 0x0000, /* R13550 */ + 0x0000, /* R13551 */ + 0x0000, /* R13552 */ + 0x0000, /* R13553 */ + 0x0000, /* R13554 */ + 0x0000, /* R13555 */ + 0x0000, /* R13556 */ + 0x0000, /* R13557 */ + 0x0000, /* R13558 */ + 0x0000, /* R13559 */ + 0x0000, /* R13560 */ + 0x0000, /* R13561 */ + 0x0000, /* R13562 */ + 0x0000, /* R13563 */ + 0x0000, /* R13564 */ + 0x0000, /* R13565 */ + 0x0000, /* R13566 */ + 0x0000, /* R13567 */ + 0x0000, /* R13568 */ + 0x0000, /* R13569 */ + 0x0000, /* R13570 */ + 0x0000, /* R13571 */ + 0x0000, /* R13572 */ + 0x0000, /* R13573 */ + 0x0000, /* R13574 */ + 0x0000, /* R13575 */ + 0x0000, /* R13576 */ + 0x0000, /* R13577 */ + 0x0000, /* R13578 */ + 0x0000, /* R13579 */ + 0x0000, /* R13580 */ + 0x0000, /* R13581 */ + 0x0000, /* R13582 */ + 0x0000, /* R13583 */ + 0x0000, /* R13584 */ + 0x0000, /* R13585 */ + 0x0000, /* R13586 */ + 0x0000, /* R13587 */ + 0x0000, /* R13588 */ + 0x0000, /* R13589 */ + 0x0000, /* R13590 */ + 0x0000, /* R13591 */ + 0x0000, /* R13592 */ + 0x0000, /* R13593 */ + 0x0000, /* R13594 */ + 0x0000, /* R13595 */ + 0x0000, /* R13596 */ + 0x0000, /* R13597 */ + 0x0000, /* R13598 */ + 0x0000, /* R13599 */ + 0x0000, /* R13600 */ + 0x0000, /* R13601 */ + 0x0000, /* R13602 */ + 0x0000, /* R13603 */ + 0x0000, /* R13604 */ + 0x0000, /* R13605 */ + 0x0000, /* R13606 */ + 0x0000, /* R13607 */ + 0x0000, /* R13608 */ + 0x0000, /* R13609 */ + 0x0000, /* R13610 */ + 0x0000, /* R13611 */ + 0x0000, /* R13612 */ + 0x0000, /* R13613 */ + 0x0000, /* R13614 */ + 0x0000, /* R13615 */ + 0x0000, /* R13616 */ + 0x0000, /* R13617 */ + 0x0000, /* R13618 */ + 0x0000, /* R13619 */ + 0x0000, /* R13620 */ + 0x0000, /* R13621 */ + 0x0000, /* R13622 */ + 0x0000, /* R13623 */ + 0x0000, /* R13624 */ + 0x0000, /* R13625 */ + 0x0000, /* R13626 */ + 0x0000, /* R13627 */ + 0x0000, /* R13628 */ + 0x0000, /* R13629 */ + 0x0000, /* R13630 */ + 0x0000, /* R13631 */ + 0x0000, /* R13632 */ + 0x0000, /* R13633 */ + 0x0000, /* R13634 */ + 0x0000, /* R13635 */ + 0x0000, /* R13636 */ + 0x0000, /* R13637 */ + 0x0000, /* R13638 */ + 0x0000, /* R13639 */ + 0x0000, /* R13640 */ + 0x0000, /* R13641 */ + 0x0000, /* R13642 */ + 0x0000, /* R13643 */ + 0x0000, /* R13644 */ + 0x0000, /* R13645 */ + 0x0000, /* R13646 */ + 0x0000, /* R13647 */ + 0x0000, /* R13648 */ + 0x0000, /* R13649 */ + 0x0000, /* R13650 */ + 0x0000, /* R13651 */ + 0x0000, /* R13652 */ + 0x0000, /* R13653 */ + 0x0000, /* R13654 */ + 0x0000, /* R13655 */ + 0x0000, /* R13656 */ + 0x0000, /* R13657 */ + 0x0000, /* R13658 */ + 0x0000, /* R13659 */ + 0x0000, /* R13660 */ + 0x0000, /* R13661 */ + 0x0000, /* R13662 */ + 0x0000, /* R13663 */ + 0x0000, /* R13664 */ + 0x0000, /* R13665 */ + 0x0000, /* R13666 */ + 0x0000, /* R13667 */ + 0x0000, /* R13668 */ + 0x0000, /* R13669 */ + 0x0000, /* R13670 */ + 0x0000, /* R13671 */ + 0x0000, /* R13672 */ + 0x0000, /* R13673 */ + 0x0000, /* R13674 */ + 0x0000, /* R13675 */ + 0x0000, /* R13676 */ + 0x0000, /* R13677 */ + 0x0000, /* R13678 */ + 0x0000, /* R13679 */ + 0x0000, /* R13680 */ + 0x0000, /* R13681 */ + 0x0000, /* R13682 */ + 0x0000, /* R13683 */ + 0x0000, /* R13684 */ + 0x0000, /* R13685 */ + 0x0000, /* R13686 */ + 0x0000, /* R13687 */ + 0x0000, /* R13688 */ + 0x0000, /* R13689 */ + 0x0000, /* R13690 */ + 0x0000, /* R13691 */ + 0x0000, /* R13692 */ + 0x0000, /* R13693 */ + 0x0000, /* R13694 */ + 0x0000, /* R13695 */ + 0x0000, /* R13696 */ + 0x0000, /* R13697 */ + 0x0000, /* R13698 */ + 0x0000, /* R13699 */ + 0x0000, /* R13700 */ + 0x0000, /* R13701 */ + 0x0000, /* R13702 */ + 0x0000, /* R13703 */ + 0x0000, /* R13704 */ + 0x0000, /* R13705 */ + 0x0000, /* R13706 */ + 0x0000, /* R13707 */ + 0x0000, /* R13708 */ + 0x0000, /* R13709 */ + 0x0000, /* R13710 */ + 0x0000, /* R13711 */ + 0x0000, /* R13712 */ + 0x0000, /* R13713 */ + 0x0000, /* R13714 */ + 0x0000, /* R13715 */ + 0x0000, /* R13716 */ + 0x0000, /* R13717 */ + 0x0000, /* R13718 */ + 0x0000, /* R13719 */ + 0x0000, /* R13720 */ + 0x0000, /* R13721 */ + 0x0000, /* R13722 */ + 0x0000, /* R13723 */ + 0x0000, /* R13724 */ + 0x0000, /* R13725 */ + 0x0000, /* R13726 */ + 0x0000, /* R13727 */ + 0x0000, /* R13728 */ + 0x0000, /* R13729 */ + 0x0000, /* R13730 */ + 0x0000, /* R13731 */ + 0x0000, /* R13732 */ + 0x0000, /* R13733 */ + 0x0000, /* R13734 */ + 0x0000, /* R13735 */ + 0x0000, /* R13736 */ + 0x0000, /* R13737 */ + 0x0000, /* R13738 */ + 0x0000, /* R13739 */ + 0x0000, /* R13740 */ + 0x0000, /* R13741 */ + 0x0000, /* R13742 */ + 0x0000, /* R13743 */ + 0x0000, /* R13744 */ + 0x0000, /* R13745 */ + 0x0000, /* R13746 */ + 0x0000, /* R13747 */ + 0x0000, /* R13748 */ + 0x0000, /* R13749 */ + 0x0000, /* R13750 */ + 0x0000, /* R13751 */ + 0x0000, /* R13752 */ + 0x0000, /* R13753 */ + 0x0000, /* R13754 */ + 0x0000, /* R13755 */ + 0x0000, /* R13756 */ + 0x0000, /* R13757 */ + 0x0000, /* R13758 */ + 0x0000, /* R13759 */ + 0x0000, /* R13760 */ + 0x0000, /* R13761 */ + 0x0000, /* R13762 */ + 0x0000, /* R13763 */ + 0x0000, /* R13764 */ + 0x0000, /* R13765 */ + 0x0000, /* R13766 */ + 0x0000, /* R13767 */ + 0x0000, /* R13768 */ + 0x0000, /* R13769 */ + 0x0000, /* R13770 */ + 0x0000, /* R13771 */ + 0x0000, /* R13772 */ + 0x0000, /* R13773 */ + 0x0000, /* R13774 */ + 0x0000, /* R13775 */ + 0x0000, /* R13776 */ + 0x0000, /* R13777 */ + 0x0000, /* R13778 */ + 0x0000, /* R13779 */ + 0x0000, /* R13780 */ + 0x0000, /* R13781 */ + 0x0000, /* R13782 */ + 0x0000, /* R13783 */ + 0x0000, /* R13784 */ + 0x0000, /* R13785 */ + 0x0000, /* R13786 */ + 0x0000, /* R13787 */ + 0x0000, /* R13788 */ + 0x0000, /* R13789 */ + 0x0000, /* R13790 */ + 0x0000, /* R13791 */ + 0x0000, /* R13792 */ + 0x0000, /* R13793 */ + 0x0000, /* R13794 */ + 0x0000, /* R13795 */ + 0x0000, /* R13796 */ + 0x0000, /* R13797 */ + 0x0000, /* R13798 */ + 0x0000, /* R13799 */ + 0x0000, /* R13800 */ + 0x0000, /* R13801 */ + 0x0000, /* R13802 */ + 0x0000, /* R13803 */ + 0x0000, /* R13804 */ + 0x0000, /* R13805 */ + 0x0000, /* R13806 */ + 0x0000, /* R13807 */ + 0x0000, /* R13808 */ + 0x0000, /* R13809 */ + 0x0000, /* R13810 */ + 0x0000, /* R13811 */ + 0x0000, /* R13812 */ + 0x0000, /* R13813 */ + 0x0000, /* R13814 */ + 0x0000, /* R13815 */ + 0x0000, /* R13816 */ + 0x0000, /* R13817 */ + 0x0000, /* R13818 */ + 0x0000, /* R13819 */ + 0x0000, /* R13820 */ + 0x0000, /* R13821 */ + 0x0000, /* R13822 */ + 0x0000, /* R13823 */ + 0x0000, /* R13824 */ + 0x0000, /* R13825 */ + 0x0000, /* R13826 */ + 0x0000, /* R13827 */ + 0x0000, /* R13828 */ + 0x0000, /* R13829 */ + 0x0000, /* R13830 */ + 0x0000, /* R13831 */ + 0x0000, /* R13832 */ + 0x0000, /* R13833 */ + 0x0000, /* R13834 */ + 0x0000, /* R13835 */ + 0x0000, /* R13836 */ + 0x0000, /* R13837 */ + 0x0000, /* R13838 */ + 0x0000, /* R13839 */ + 0x0000, /* R13840 */ + 0x0000, /* R13841 */ + 0x0000, /* R13842 */ + 0x0000, /* R13843 */ + 0x0000, /* R13844 */ + 0x0000, /* R13845 */ + 0x0000, /* R13846 */ + 0x0000, /* R13847 */ + 0x0000, /* R13848 */ + 0x0000, /* R13849 */ + 0x0000, /* R13850 */ + 0x0000, /* R13851 */ + 0x0000, /* R13852 */ + 0x0000, /* R13853 */ + 0x0000, /* R13854 */ + 0x0000, /* R13855 */ + 0x0000, /* R13856 */ + 0x0000, /* R13857 */ + 0x0000, /* R13858 */ + 0x0000, /* R13859 */ + 0x0000, /* R13860 */ + 0x0000, /* R13861 */ + 0x0000, /* R13862 */ + 0x0000, /* R13863 */ + 0x0000, /* R13864 */ + 0x0000, /* R13865 */ + 0x0000, /* R13866 */ + 0x0000, /* R13867 */ + 0x0000, /* R13868 */ + 0x0000, /* R13869 */ + 0x0000, /* R13870 */ + 0x0000, /* R13871 */ + 0x0000, /* R13872 */ + 0x0000, /* R13873 */ + 0x0000, /* R13874 */ + 0x0000, /* R13875 */ + 0x0000, /* R13876 */ + 0x0000, /* R13877 */ + 0x0000, /* R13878 */ + 0x0000, /* R13879 */ + 0x0000, /* R13880 */ + 0x0000, /* R13881 */ + 0x0000, /* R13882 */ + 0x0000, /* R13883 */ + 0x0000, /* R13884 */ + 0x0000, /* R13885 */ + 0x0000, /* R13886 */ + 0x0000, /* R13887 */ + 0x0000, /* R13888 */ + 0x0000, /* R13889 */ + 0x0000, /* R13890 */ + 0x0000, /* R13891 */ + 0x0000, /* R13892 */ + 0x0000, /* R13893 */ + 0x0000, /* R13894 */ + 0x0000, /* R13895 */ + 0x0000, /* R13896 */ + 0x0000, /* R13897 */ + 0x0000, /* R13898 */ + 0x0000, /* R13899 */ + 0x0000, /* R13900 */ + 0x0000, /* R13901 */ + 0x0000, /* R13902 */ + 0x0000, /* R13903 */ + 0x0000, /* R13904 */ + 0x0000, /* R13905 */ + 0x0000, /* R13906 */ + 0x0000, /* R13907 */ + 0x0000, /* R13908 */ + 0x0000, /* R13909 */ + 0x0000, /* R13910 */ + 0x0000, /* R13911 */ + 0x0000, /* R13912 */ + 0x0000, /* R13913 */ + 0x0000, /* R13914 */ + 0x0000, /* R13915 */ + 0x0000, /* R13916 */ + 0x0000, /* R13917 */ + 0x0000, /* R13918 */ + 0x0000, /* R13919 */ + 0x0000, /* R13920 */ + 0x0000, /* R13921 */ + 0x0000, /* R13922 */ + 0x0000, /* R13923 */ + 0x0000, /* R13924 */ + 0x0000, /* R13925 */ + 0x0000, /* R13926 */ + 0x0000, /* R13927 */ + 0x0000, /* R13928 */ + 0x0000, /* R13929 */ + 0x0000, /* R13930 */ + 0x0000, /* R13931 */ + 0x0000, /* R13932 */ + 0x0000, /* R13933 */ + 0x0000, /* R13934 */ + 0x0000, /* R13935 */ + 0x0000, /* R13936 */ + 0x0000, /* R13937 */ + 0x0000, /* R13938 */ + 0x0000, /* R13939 */ + 0x0000, /* R13940 */ + 0x0000, /* R13941 */ + 0x0000, /* R13942 */ + 0x0000, /* R13943 */ + 0x0000, /* R13944 */ + 0x0000, /* R13945 */ + 0x0000, /* R13946 */ + 0x0000, /* R13947 */ + 0x0000, /* R13948 */ + 0x0000, /* R13949 */ + 0x0000, /* R13950 */ + 0x0000, /* R13951 */ + 0x0000, /* R13952 */ + 0x0000, /* R13953 */ + 0x0000, /* R13954 */ + 0x0000, /* R13955 */ + 0x0000, /* R13956 */ + 0x0000, /* R13957 */ + 0x0000, /* R13958 */ + 0x0000, /* R13959 */ + 0x0000, /* R13960 */ + 0x0000, /* R13961 */ + 0x0000, /* R13962 */ + 0x0000, /* R13963 */ + 0x0000, /* R13964 */ + 0x0000, /* R13965 */ + 0x0000, /* R13966 */ + 0x0000, /* R13967 */ + 0x0000, /* R13968 */ + 0x0000, /* R13969 */ + 0x0000, /* R13970 */ + 0x0000, /* R13971 */ + 0x0000, /* R13972 */ + 0x0000, /* R13973 */ + 0x0000, /* R13974 */ + 0x0000, /* R13975 */ + 0x0000, /* R13976 */ + 0x0000, /* R13977 */ + 0x0000, /* R13978 */ + 0x0000, /* R13979 */ + 0x0000, /* R13980 */ + 0x0000, /* R13981 */ + 0x0000, /* R13982 */ + 0x0000, /* R13983 */ + 0x0000, /* R13984 */ + 0x0000, /* R13985 */ + 0x0000, /* R13986 */ + 0x0000, /* R13987 */ + 0x0000, /* R13988 */ + 0x0000, /* R13989 */ + 0x0000, /* R13990 */ + 0x0000, /* R13991 */ + 0x0000, /* R13992 */ + 0x0000, /* R13993 */ + 0x0000, /* R13994 */ + 0x0000, /* R13995 */ + 0x0000, /* R13996 */ + 0x0000, /* R13997 */ + 0x0000, /* R13998 */ + 0x0000, /* R13999 */ + 0x0000, /* R14000 */ + 0x0000, /* R14001 */ + 0x0000, /* R14002 */ + 0x0000, /* R14003 */ + 0x0000, /* R14004 */ + 0x0000, /* R14005 */ + 0x0000, /* R14006 */ + 0x0000, /* R14007 */ + 0x0000, /* R14008 */ + 0x0000, /* R14009 */ + 0x0000, /* R14010 */ + 0x0000, /* R14011 */ + 0x0000, /* R14012 */ + 0x0000, /* R14013 */ + 0x0000, /* R14014 */ + 0x0000, /* R14015 */ + 0x0000, /* R14016 */ + 0x0000, /* R14017 */ + 0x0000, /* R14018 */ + 0x0000, /* R14019 */ + 0x0000, /* R14020 */ + 0x0000, /* R14021 */ + 0x0000, /* R14022 */ + 0x0000, /* R14023 */ + 0x0000, /* R14024 */ + 0x0000, /* R14025 */ + 0x0000, /* R14026 */ + 0x0000, /* R14027 */ + 0x0000, /* R14028 */ + 0x0000, /* R14029 */ + 0x0000, /* R14030 */ + 0x0000, /* R14031 */ + 0x0000, /* R14032 */ + 0x0000, /* R14033 */ + 0x0000, /* R14034 */ + 0x0000, /* R14035 */ + 0x0000, /* R14036 */ + 0x0000, /* R14037 */ + 0x0000, /* R14038 */ + 0x0000, /* R14039 */ + 0x0000, /* R14040 */ + 0x0000, /* R14041 */ + 0x0000, /* R14042 */ + 0x0000, /* R14043 */ + 0x0000, /* R14044 */ + 0x0000, /* R14045 */ + 0x0000, /* R14046 */ + 0x0000, /* R14047 */ + 0x0000, /* R14048 */ + 0x0000, /* R14049 */ + 0x0000, /* R14050 */ + 0x0000, /* R14051 */ + 0x0000, /* R14052 */ + 0x0000, /* R14053 */ + 0x0000, /* R14054 */ + 0x0000, /* R14055 */ + 0x0000, /* R14056 */ + 0x0000, /* R14057 */ + 0x0000, /* R14058 */ + 0x0000, /* R14059 */ + 0x0000, /* R14060 */ + 0x0000, /* R14061 */ + 0x0000, /* R14062 */ + 0x0000, /* R14063 */ + 0x0000, /* R14064 */ + 0x0000, /* R14065 */ + 0x0000, /* R14066 */ + 0x0000, /* R14067 */ + 0x0000, /* R14068 */ + 0x0000, /* R14069 */ + 0x0000, /* R14070 */ + 0x0000, /* R14071 */ + 0x0000, /* R14072 */ + 0x0000, /* R14073 */ + 0x0000, /* R14074 */ + 0x0000, /* R14075 */ + 0x0000, /* R14076 */ + 0x0000, /* R14077 */ + 0x0000, /* R14078 */ + 0x0000, /* R14079 */ + 0x0000, /* R14080 */ + 0x0000, /* R14081 */ + 0x0000, /* R14082 */ + 0x0000, /* R14083 */ + 0x0000, /* R14084 */ + 0x0000, /* R14085 */ + 0x0000, /* R14086 */ + 0x0000, /* R14087 */ + 0x0000, /* R14088 */ + 0x0000, /* R14089 */ + 0x0000, /* R14090 */ + 0x0000, /* R14091 */ + 0x0000, /* R14092 */ + 0x0000, /* R14093 */ + 0x0000, /* R14094 */ + 0x0000, /* R14095 */ + 0x0000, /* R14096 */ + 0x0000, /* R14097 */ + 0x0000, /* R14098 */ + 0x0000, /* R14099 */ + 0x0000, /* R14100 */ + 0x0000, /* R14101 */ + 0x0000, /* R14102 */ + 0x0000, /* R14103 */ + 0x0000, /* R14104 */ + 0x0000, /* R14105 */ + 0x0000, /* R14106 */ + 0x0000, /* R14107 */ + 0x0000, /* R14108 */ + 0x0000, /* R14109 */ + 0x0000, /* R14110 */ + 0x0000, /* R14111 */ + 0x0000, /* R14112 */ + 0x0000, /* R14113 */ + 0x0000, /* R14114 */ + 0x0000, /* R14115 */ + 0x0000, /* R14116 */ + 0x0000, /* R14117 */ + 0x0000, /* R14118 */ + 0x0000, /* R14119 */ + 0x0000, /* R14120 */ + 0x0000, /* R14121 */ + 0x0000, /* R14122 */ + 0x0000, /* R14123 */ + 0x0000, /* R14124 */ + 0x0000, /* R14125 */ + 0x0000, /* R14126 */ + 0x0000, /* R14127 */ + 0x0000, /* R14128 */ + 0x0000, /* R14129 */ + 0x0000, /* R14130 */ + 0x0000, /* R14131 */ + 0x0000, /* R14132 */ + 0x0000, /* R14133 */ + 0x0000, /* R14134 */ + 0x0000, /* R14135 */ + 0x0000, /* R14136 */ + 0x0000, /* R14137 */ + 0x0000, /* R14138 */ + 0x0000, /* R14139 */ + 0x0000, /* R14140 */ + 0x0000, /* R14141 */ + 0x0000, /* R14142 */ + 0x0000, /* R14143 */ + 0x0000, /* R14144 */ + 0x0000, /* R14145 */ + 0x0000, /* R14146 */ + 0x0000, /* R14147 */ + 0x0000, /* R14148 */ + 0x0000, /* R14149 */ + 0x0000, /* R14150 */ + 0x0000, /* R14151 */ + 0x0000, /* R14152 */ + 0x0000, /* R14153 */ + 0x0000, /* R14154 */ + 0x0000, /* R14155 */ + 0x0000, /* R14156 */ + 0x0000, /* R14157 */ + 0x0000, /* R14158 */ + 0x0000, /* R14159 */ + 0x0000, /* R14160 */ + 0x0000, /* R14161 */ + 0x0000, /* R14162 */ + 0x0000, /* R14163 */ + 0x0000, /* R14164 */ + 0x0000, /* R14165 */ + 0x0000, /* R14166 */ + 0x0000, /* R14167 */ + 0x0000, /* R14168 */ + 0x0000, /* R14169 */ + 0x0000, /* R14170 */ + 0x0000, /* R14171 */ + 0x0000, /* R14172 */ + 0x0000, /* R14173 */ + 0x0000, /* R14174 */ + 0x0000, /* R14175 */ + 0x0000, /* R14176 */ + 0x0000, /* R14177 */ + 0x0000, /* R14178 */ + 0x0000, /* R14179 */ + 0x0000, /* R14180 */ + 0x0000, /* R14181 */ + 0x0000, /* R14182 */ + 0x0000, /* R14183 */ + 0x0000, /* R14184 */ + 0x0000, /* R14185 */ + 0x0000, /* R14186 */ + 0x0000, /* R14187 */ + 0x0000, /* R14188 */ + 0x0000, /* R14189 */ + 0x0000, /* R14190 */ + 0x0000, /* R14191 */ + 0x0000, /* R14192 */ + 0x0000, /* R14193 */ + 0x0000, /* R14194 */ + 0x0000, /* R14195 */ + 0x0000, /* R14196 */ + 0x0000, /* R14197 */ + 0x0000, /* R14198 */ + 0x0000, /* R14199 */ + 0x0000, /* R14200 */ + 0x0000, /* R14201 */ + 0x0000, /* R14202 */ + 0x0000, /* R14203 */ + 0x0000, /* R14204 */ + 0x0000, /* R14205 */ + 0x0000, /* R14206 */ + 0x0000, /* R14207 */ + 0x0000, /* R14208 */ + 0x0000, /* R14209 */ + 0x0000, /* R14210 */ + 0x0000, /* R14211 */ + 0x0000, /* R14212 */ + 0x0000, /* R14213 */ + 0x0000, /* R14214 */ + 0x0000, /* R14215 */ + 0x0000, /* R14216 */ + 0x0000, /* R14217 */ + 0x0000, /* R14218 */ + 0x0000, /* R14219 */ + 0x0000, /* R14220 */ + 0x0000, /* R14221 */ + 0x0000, /* R14222 */ + 0x0000, /* R14223 */ + 0x0000, /* R14224 */ + 0x0000, /* R14225 */ + 0x0000, /* R14226 */ + 0x0000, /* R14227 */ + 0x0000, /* R14228 */ + 0x0000, /* R14229 */ + 0x0000, /* R14230 */ + 0x0000, /* R14231 */ + 0x0000, /* R14232 */ + 0x0000, /* R14233 */ + 0x0000, /* R14234 */ + 0x0000, /* R14235 */ + 0x0000, /* R14236 */ + 0x0000, /* R14237 */ + 0x0000, /* R14238 */ + 0x0000, /* R14239 */ + 0x0000, /* R14240 */ + 0x0000, /* R14241 */ + 0x0000, /* R14242 */ + 0x0000, /* R14243 */ + 0x0000, /* R14244 */ + 0x0000, /* R14245 */ + 0x0000, /* R14246 */ + 0x0000, /* R14247 */ + 0x0000, /* R14248 */ + 0x0000, /* R14249 */ + 0x0000, /* R14250 */ + 0x0000, /* R14251 */ + 0x0000, /* R14252 */ + 0x0000, /* R14253 */ + 0x0000, /* R14254 */ + 0x0000, /* R14255 */ + 0x0000, /* R14256 */ + 0x0000, /* R14257 */ + 0x0000, /* R14258 */ + 0x0000, /* R14259 */ + 0x0000, /* R14260 */ + 0x0000, /* R14261 */ + 0x0000, /* R14262 */ + 0x0000, /* R14263 */ + 0x0000, /* R14264 */ + 0x0000, /* R14265 */ + 0x0000, /* R14266 */ + 0x0000, /* R14267 */ + 0x0000, /* R14268 */ + 0x0000, /* R14269 */ + 0x0000, /* R14270 */ + 0x0000, /* R14271 */ + 0x0000, /* R14272 */ + 0x0000, /* R14273 */ + 0x0000, /* R14274 */ + 0x0000, /* R14275 */ + 0x0000, /* R14276 */ + 0x0000, /* R14277 */ + 0x0000, /* R14278 */ + 0x0000, /* R14279 */ + 0x0000, /* R14280 */ + 0x0000, /* R14281 */ + 0x0000, /* R14282 */ + 0x0000, /* R14283 */ + 0x0000, /* R14284 */ + 0x0000, /* R14285 */ + 0x0000, /* R14286 */ + 0x0000, /* R14287 */ + 0x0000, /* R14288 */ + 0x0000, /* R14289 */ + 0x0000, /* R14290 */ + 0x0000, /* R14291 */ + 0x0000, /* R14292 */ + 0x0000, /* R14293 */ + 0x0000, /* R14294 */ + 0x0000, /* R14295 */ + 0x0000, /* R14296 */ + 0x0000, /* R14297 */ + 0x0000, /* R14298 */ + 0x0000, /* R14299 */ + 0x0000, /* R14300 */ + 0x0000, /* R14301 */ + 0x0000, /* R14302 */ + 0x0000, /* R14303 */ + 0x0000, /* R14304 */ + 0x0000, /* R14305 */ + 0x0000, /* R14306 */ + 0x0000, /* R14307 */ + 0x0000, /* R14308 */ + 0x0000, /* R14309 */ + 0x0000, /* R14310 */ + 0x0000, /* R14311 */ + 0x0000, /* R14312 */ + 0x0000, /* R14313 */ + 0x0000, /* R14314 */ + 0x0000, /* R14315 */ + 0x0000, /* R14316 */ + 0x0000, /* R14317 */ + 0x0000, /* R14318 */ + 0x0000, /* R14319 */ + 0x0000, /* R14320 */ + 0x0000, /* R14321 */ + 0x0000, /* R14322 */ + 0x0000, /* R14323 */ + 0x0000, /* R14324 */ + 0x0000, /* R14325 */ + 0x0000, /* R14326 */ + 0x0000, /* R14327 */ + 0x0000, /* R14328 */ + 0x0000, /* R14329 */ + 0x0000, /* R14330 */ + 0x0000, /* R14331 */ + 0x0000, /* R14332 */ + 0x0000, /* R14333 */ + 0x0000, /* R14334 */ + 0x0000, /* R14335 */ + 0x0000, /* R14336 - DSP2 Data3 RAM 1 */ + 0x0000, /* R14337 - DSP2 Data3 RAM 0 */ + 0x0000, /* R14338 */ + 0x0000, /* R14339 */ + 0x0000, /* R14340 */ + 0x0000, /* R14341 */ + 0x0000, /* R14342 */ + 0x0000, /* R14343 */ + 0x0000, /* R14344 */ + 0x0000, /* R14345 */ + 0x0000, /* R14346 */ + 0x0000, /* R14347 */ + 0x0000, /* R14348 */ + 0x0000, /* R14349 */ + 0x0000, /* R14350 */ + 0x0000, /* R14351 */ + 0x0000, /* R14352 */ + 0x0000, /* R14353 */ + 0x0000, /* R14354 */ + 0x0000, /* R14355 */ + 0x0000, /* R14356 */ + 0x0000, /* R14357 */ + 0x0000, /* R14358 */ + 0x0000, /* R14359 */ + 0x0000, /* R14360 */ + 0x0000, /* R14361 */ + 0x0000, /* R14362 */ + 0x0000, /* R14363 */ + 0x0000, /* R14364 */ + 0x0000, /* R14365 */ + 0x0000, /* R14366 */ + 0x0000, /* R14367 */ + 0x0000, /* R14368 */ + 0x0000, /* R14369 */ + 0x0000, /* R14370 */ + 0x0000, /* R14371 */ + 0x0000, /* R14372 */ + 0x0000, /* R14373 */ + 0x0000, /* R14374 */ + 0x0000, /* R14375 */ + 0x0000, /* R14376 */ + 0x0000, /* R14377 */ + 0x0000, /* R14378 */ + 0x0000, /* R14379 */ + 0x0000, /* R14380 */ + 0x0000, /* R14381 */ + 0x0000, /* R14382 */ + 0x0000, /* R14383 */ + 0x0000, /* R14384 */ + 0x0000, /* R14385 */ + 0x0000, /* R14386 */ + 0x0000, /* R14387 */ + 0x0000, /* R14388 */ + 0x0000, /* R14389 */ + 0x0000, /* R14390 */ + 0x0000, /* R14391 */ + 0x0000, /* R14392 */ + 0x0000, /* R14393 */ + 0x0000, /* R14394 */ + 0x0000, /* R14395 */ + 0x0000, /* R14396 */ + 0x0000, /* R14397 */ + 0x0000, /* R14398 */ + 0x0000, /* R14399 */ + 0x0000, /* R14400 */ + 0x0000, /* R14401 */ + 0x0000, /* R14402 */ + 0x0000, /* R14403 */ + 0x0000, /* R14404 */ + 0x0000, /* R14405 */ + 0x0000, /* R14406 */ + 0x0000, /* R14407 */ + 0x0000, /* R14408 */ + 0x0000, /* R14409 */ + 0x0000, /* R14410 */ + 0x0000, /* R14411 */ + 0x0000, /* R14412 */ + 0x0000, /* R14413 */ + 0x0000, /* R14414 */ + 0x0000, /* R14415 */ + 0x0000, /* R14416 */ + 0x0000, /* R14417 */ + 0x0000, /* R14418 */ + 0x0000, /* R14419 */ + 0x0000, /* R14420 */ + 0x0000, /* R14421 */ + 0x0000, /* R14422 */ + 0x0000, /* R14423 */ + 0x0000, /* R14424 */ + 0x0000, /* R14425 */ + 0x0000, /* R14426 */ + 0x0000, /* R14427 */ + 0x0000, /* R14428 */ + 0x0000, /* R14429 */ + 0x0000, /* R14430 */ + 0x0000, /* R14431 */ + 0x0000, /* R14432 */ + 0x0000, /* R14433 */ + 0x0000, /* R14434 */ + 0x0000, /* R14435 */ + 0x0000, /* R14436 */ + 0x0000, /* R14437 */ + 0x0000, /* R14438 */ + 0x0000, /* R14439 */ + 0x0000, /* R14440 */ + 0x0000, /* R14441 */ + 0x0000, /* R14442 */ + 0x0000, /* R14443 */ + 0x0000, /* R14444 */ + 0x0000, /* R14445 */ + 0x0000, /* R14446 */ + 0x0000, /* R14447 */ + 0x0000, /* R14448 */ + 0x0000, /* R14449 */ + 0x0000, /* R14450 */ + 0x0000, /* R14451 */ + 0x0000, /* R14452 */ + 0x0000, /* R14453 */ + 0x0000, /* R14454 */ + 0x0000, /* R14455 */ + 0x0000, /* R14456 */ + 0x0000, /* R14457 */ + 0x0000, /* R14458 */ + 0x0000, /* R14459 */ + 0x0000, /* R14460 */ + 0x0000, /* R14461 */ + 0x0000, /* R14462 */ + 0x0000, /* R14463 */ + 0x0000, /* R14464 */ + 0x0000, /* R14465 */ + 0x0000, /* R14466 */ + 0x0000, /* R14467 */ + 0x0000, /* R14468 */ + 0x0000, /* R14469 */ + 0x0000, /* R14470 */ + 0x0000, /* R14471 */ + 0x0000, /* R14472 */ + 0x0000, /* R14473 */ + 0x0000, /* R14474 */ + 0x0000, /* R14475 */ + 0x0000, /* R14476 */ + 0x0000, /* R14477 */ + 0x0000, /* R14478 */ + 0x0000, /* R14479 */ + 0x0000, /* R14480 */ + 0x0000, /* R14481 */ + 0x0000, /* R14482 */ + 0x0000, /* R14483 */ + 0x0000, /* R14484 */ + 0x0000, /* R14485 */ + 0x0000, /* R14486 */ + 0x0000, /* R14487 */ + 0x0000, /* R14488 */ + 0x0000, /* R14489 */ + 0x0000, /* R14490 */ + 0x0000, /* R14491 */ + 0x0000, /* R14492 */ + 0x0000, /* R14493 */ + 0x0000, /* R14494 */ + 0x0000, /* R14495 */ + 0x0000, /* R14496 */ + 0x0000, /* R14497 */ + 0x0000, /* R14498 */ + 0x0000, /* R14499 */ + 0x0000, /* R14500 */ + 0x0000, /* R14501 */ + 0x0000, /* R14502 */ + 0x0000, /* R14503 */ + 0x0000, /* R14504 */ + 0x0000, /* R14505 */ + 0x0000, /* R14506 */ + 0x0000, /* R14507 */ + 0x0000, /* R14508 */ + 0x0000, /* R14509 */ + 0x0000, /* R14510 */ + 0x0000, /* R14511 */ + 0x0000, /* R14512 */ + 0x0000, /* R14513 */ + 0x0000, /* R14514 */ + 0x0000, /* R14515 */ + 0x0000, /* R14516 */ + 0x0000, /* R14517 */ + 0x0000, /* R14518 */ + 0x0000, /* R14519 */ + 0x0000, /* R14520 */ + 0x0000, /* R14521 */ + 0x0000, /* R14522 */ + 0x0000, /* R14523 */ + 0x0000, /* R14524 */ + 0x0000, /* R14525 */ + 0x0000, /* R14526 */ + 0x0000, /* R14527 */ + 0x0000, /* R14528 */ + 0x0000, /* R14529 */ + 0x0000, /* R14530 */ + 0x0000, /* R14531 */ + 0x0000, /* R14532 */ + 0x0000, /* R14533 */ + 0x0000, /* R14534 */ + 0x0000, /* R14535 */ + 0x0000, /* R14536 */ + 0x0000, /* R14537 */ + 0x0000, /* R14538 */ + 0x0000, /* R14539 */ + 0x0000, /* R14540 */ + 0x0000, /* R14541 */ + 0x0000, /* R14542 */ + 0x0000, /* R14543 */ + 0x0000, /* R14544 */ + 0x0000, /* R14545 */ + 0x0000, /* R14546 */ + 0x0000, /* R14547 */ + 0x0000, /* R14548 */ + 0x0000, /* R14549 */ + 0x0000, /* R14550 */ + 0x0000, /* R14551 */ + 0x0000, /* R14552 */ + 0x0000, /* R14553 */ + 0x0000, /* R14554 */ + 0x0000, /* R14555 */ + 0x0000, /* R14556 */ + 0x0000, /* R14557 */ + 0x0000, /* R14558 */ + 0x0000, /* R14559 */ + 0x0000, /* R14560 */ + 0x0000, /* R14561 */ + 0x0000, /* R14562 */ + 0x0000, /* R14563 */ + 0x0000, /* R14564 */ + 0x0000, /* R14565 */ + 0x0000, /* R14566 */ + 0x0000, /* R14567 */ + 0x0000, /* R14568 */ + 0x0000, /* R14569 */ + 0x0000, /* R14570 */ + 0x0000, /* R14571 */ + 0x0000, /* R14572 */ + 0x0000, /* R14573 */ + 0x0000, /* R14574 */ + 0x0000, /* R14575 */ + 0x0000, /* R14576 */ + 0x0000, /* R14577 */ + 0x0000, /* R14578 */ + 0x0000, /* R14579 */ + 0x0000, /* R14580 */ + 0x0000, /* R14581 */ + 0x0000, /* R14582 */ + 0x0000, /* R14583 */ + 0x0000, /* R14584 */ + 0x0000, /* R14585 */ + 0x0000, /* R14586 */ + 0x0000, /* R14587 */ + 0x0000, /* R14588 */ + 0x0000, /* R14589 */ + 0x0000, /* R14590 */ + 0x0000, /* R14591 */ + 0x0000, /* R14592 */ + 0x0000, /* R14593 */ + 0x0000, /* R14594 */ + 0x0000, /* R14595 */ + 0x0000, /* R14596 */ + 0x0000, /* R14597 */ + 0x0000, /* R14598 */ + 0x0000, /* R14599 */ + 0x0000, /* R14600 */ + 0x0000, /* R14601 */ + 0x0000, /* R14602 */ + 0x0000, /* R14603 */ + 0x0000, /* R14604 */ + 0x0000, /* R14605 */ + 0x0000, /* R14606 */ + 0x0000, /* R14607 */ + 0x0000, /* R14608 */ + 0x0000, /* R14609 */ + 0x0000, /* R14610 */ + 0x0000, /* R14611 */ + 0x0000, /* R14612 */ + 0x0000, /* R14613 */ + 0x0000, /* R14614 */ + 0x0000, /* R14615 */ + 0x0000, /* R14616 */ + 0x0000, /* R14617 */ + 0x0000, /* R14618 */ + 0x0000, /* R14619 */ + 0x0000, /* R14620 */ + 0x0000, /* R14621 */ + 0x0000, /* R14622 */ + 0x0000, /* R14623 */ + 0x0000, /* R14624 */ + 0x0000, /* R14625 */ + 0x0000, /* R14626 */ + 0x0000, /* R14627 */ + 0x0000, /* R14628 */ + 0x0000, /* R14629 */ + 0x0000, /* R14630 */ + 0x0000, /* R14631 */ + 0x0000, /* R14632 */ + 0x0000, /* R14633 */ + 0x0000, /* R14634 */ + 0x0000, /* R14635 */ + 0x0000, /* R14636 */ + 0x0000, /* R14637 */ + 0x0000, /* R14638 */ + 0x0000, /* R14639 */ + 0x0000, /* R14640 */ + 0x0000, /* R14641 */ + 0x0000, /* R14642 */ + 0x0000, /* R14643 */ + 0x0000, /* R14644 */ + 0x0000, /* R14645 */ + 0x0000, /* R14646 */ + 0x0000, /* R14647 */ + 0x0000, /* R14648 */ + 0x0000, /* R14649 */ + 0x0000, /* R14650 */ + 0x0000, /* R14651 */ + 0x0000, /* R14652 */ + 0x0000, /* R14653 */ + 0x0000, /* R14654 */ + 0x0000, /* R14655 */ + 0x0000, /* R14656 */ + 0x0000, /* R14657 */ + 0x0000, /* R14658 */ + 0x0000, /* R14659 */ + 0x0000, /* R14660 */ + 0x0000, /* R14661 */ + 0x0000, /* R14662 */ + 0x0000, /* R14663 */ + 0x0000, /* R14664 */ + 0x0000, /* R14665 */ + 0x0000, /* R14666 */ + 0x0000, /* R14667 */ + 0x0000, /* R14668 */ + 0x0000, /* R14669 */ + 0x0000, /* R14670 */ + 0x0000, /* R14671 */ + 0x0000, /* R14672 */ + 0x0000, /* R14673 */ + 0x0000, /* R14674 */ + 0x0000, /* R14675 */ + 0x0000, /* R14676 */ + 0x0000, /* R14677 */ + 0x0000, /* R14678 */ + 0x0000, /* R14679 */ + 0x0000, /* R14680 */ + 0x0000, /* R14681 */ + 0x0000, /* R14682 */ + 0x0000, /* R14683 */ + 0x0000, /* R14684 */ + 0x0000, /* R14685 */ + 0x0000, /* R14686 */ + 0x0000, /* R14687 */ + 0x0000, /* R14688 */ + 0x0000, /* R14689 */ + 0x0000, /* R14690 */ + 0x0000, /* R14691 */ + 0x0000, /* R14692 */ + 0x0000, /* R14693 */ + 0x0000, /* R14694 */ + 0x0000, /* R14695 */ + 0x0000, /* R14696 */ + 0x0000, /* R14697 */ + 0x0000, /* R14698 */ + 0x0000, /* R14699 */ + 0x0000, /* R14700 */ + 0x0000, /* R14701 */ + 0x0000, /* R14702 */ + 0x0000, /* R14703 */ + 0x0000, /* R14704 */ + 0x0000, /* R14705 */ + 0x0000, /* R14706 */ + 0x0000, /* R14707 */ + 0x0000, /* R14708 */ + 0x0000, /* R14709 */ + 0x0000, /* R14710 */ + 0x0000, /* R14711 */ + 0x0000, /* R14712 */ + 0x0000, /* R14713 */ + 0x0000, /* R14714 */ + 0x0000, /* R14715 */ + 0x0000, /* R14716 */ + 0x0000, /* R14717 */ + 0x0000, /* R14718 */ + 0x0000, /* R14719 */ + 0x0000, /* R14720 */ + 0x0000, /* R14721 */ + 0x0000, /* R14722 */ + 0x0000, /* R14723 */ + 0x0000, /* R14724 */ + 0x0000, /* R14725 */ + 0x0000, /* R14726 */ + 0x0000, /* R14727 */ + 0x0000, /* R14728 */ + 0x0000, /* R14729 */ + 0x0000, /* R14730 */ + 0x0000, /* R14731 */ + 0x0000, /* R14732 */ + 0x0000, /* R14733 */ + 0x0000, /* R14734 */ + 0x0000, /* R14735 */ + 0x0000, /* R14736 */ + 0x0000, /* R14737 */ + 0x0000, /* R14738 */ + 0x0000, /* R14739 */ + 0x0000, /* R14740 */ + 0x0000, /* R14741 */ + 0x0000, /* R14742 */ + 0x0000, /* R14743 */ + 0x0000, /* R14744 */ + 0x0000, /* R14745 */ + 0x0000, /* R14746 */ + 0x0000, /* R14747 */ + 0x0000, /* R14748 */ + 0x0000, /* R14749 */ + 0x0000, /* R14750 */ + 0x0000, /* R14751 */ + 0x0000, /* R14752 */ + 0x0000, /* R14753 */ + 0x0000, /* R14754 */ + 0x0000, /* R14755 */ + 0x0000, /* R14756 */ + 0x0000, /* R14757 */ + 0x0000, /* R14758 */ + 0x0000, /* R14759 */ + 0x0000, /* R14760 */ + 0x0000, /* R14761 */ + 0x0000, /* R14762 */ + 0x0000, /* R14763 */ + 0x0000, /* R14764 */ + 0x0000, /* R14765 */ + 0x0000, /* R14766 */ + 0x0000, /* R14767 */ + 0x0000, /* R14768 */ + 0x0000, /* R14769 */ + 0x0000, /* R14770 */ + 0x0000, /* R14771 */ + 0x0000, /* R14772 */ + 0x0000, /* R14773 */ + 0x0000, /* R14774 */ + 0x0000, /* R14775 */ + 0x0000, /* R14776 */ + 0x0000, /* R14777 */ + 0x0000, /* R14778 */ + 0x0000, /* R14779 */ + 0x0000, /* R14780 */ + 0x0000, /* R14781 */ + 0x0000, /* R14782 */ + 0x0000, /* R14783 */ + 0x0000, /* R14784 */ + 0x0000, /* R14785 */ + 0x0000, /* R14786 */ + 0x0000, /* R14787 */ + 0x0000, /* R14788 */ + 0x0000, /* R14789 */ + 0x0000, /* R14790 */ + 0x0000, /* R14791 */ + 0x0000, /* R14792 */ + 0x0000, /* R14793 */ + 0x0000, /* R14794 */ + 0x0000, /* R14795 */ + 0x0000, /* R14796 */ + 0x0000, /* R14797 */ + 0x0000, /* R14798 */ + 0x0000, /* R14799 */ + 0x0000, /* R14800 */ + 0x0000, /* R14801 */ + 0x0000, /* R14802 */ + 0x0000, /* R14803 */ + 0x0000, /* R14804 */ + 0x0000, /* R14805 */ + 0x0000, /* R14806 */ + 0x0000, /* R14807 */ + 0x0000, /* R14808 */ + 0x0000, /* R14809 */ + 0x0000, /* R14810 */ + 0x0000, /* R14811 */ + 0x0000, /* R14812 */ + 0x0000, /* R14813 */ + 0x0000, /* R14814 */ + 0x0000, /* R14815 */ + 0x0000, /* R14816 */ + 0x0000, /* R14817 */ + 0x0000, /* R14818 */ + 0x0000, /* R14819 */ + 0x0000, /* R14820 */ + 0x0000, /* R14821 */ + 0x0000, /* R14822 */ + 0x0000, /* R14823 */ + 0x0000, /* R14824 */ + 0x0000, /* R14825 */ + 0x0000, /* R14826 */ + 0x0000, /* R14827 */ + 0x0000, /* R14828 */ + 0x0000, /* R14829 */ + 0x0000, /* R14830 */ + 0x0000, /* R14831 */ + 0x0000, /* R14832 */ + 0x0000, /* R14833 */ + 0x0000, /* R14834 */ + 0x0000, /* R14835 */ + 0x0000, /* R14836 */ + 0x0000, /* R14837 */ + 0x0000, /* R14838 */ + 0x0000, /* R14839 */ + 0x0000, /* R14840 */ + 0x0000, /* R14841 */ + 0x0000, /* R14842 */ + 0x0000, /* R14843 */ + 0x0000, /* R14844 */ + 0x0000, /* R14845 */ + 0x0000, /* R14846 */ + 0x0000, /* R14847 */ + 0x0000, /* R14848 */ + 0x0000, /* R14849 */ + 0x0000, /* R14850 */ + 0x0000, /* R14851 */ + 0x0000, /* R14852 */ + 0x0000, /* R14853 */ + 0x0000, /* R14854 */ + 0x0000, /* R14855 */ + 0x0000, /* R14856 */ + 0x0000, /* R14857 */ + 0x0000, /* R14858 */ + 0x0000, /* R14859 */ + 0x0000, /* R14860 */ + 0x0000, /* R14861 */ + 0x0000, /* R14862 */ + 0x0000, /* R14863 */ + 0x0000, /* R14864 */ + 0x0000, /* R14865 */ + 0x0000, /* R14866 */ + 0x0000, /* R14867 */ + 0x0000, /* R14868 */ + 0x0000, /* R14869 */ + 0x0000, /* R14870 */ + 0x0000, /* R14871 */ + 0x0000, /* R14872 */ + 0x0000, /* R14873 */ + 0x0000, /* R14874 */ + 0x0000, /* R14875 */ + 0x0000, /* R14876 */ + 0x0000, /* R14877 */ + 0x0000, /* R14878 */ + 0x0000, /* R14879 */ + 0x0000, /* R14880 */ + 0x0000, /* R14881 */ + 0x0000, /* R14882 */ + 0x0000, /* R14883 */ + 0x0000, /* R14884 */ + 0x0000, /* R14885 */ + 0x0000, /* R14886 */ + 0x0000, /* R14887 */ + 0x0000, /* R14888 */ + 0x0000, /* R14889 */ + 0x0000, /* R14890 */ + 0x0000, /* R14891 */ + 0x0000, /* R14892 */ + 0x0000, /* R14893 */ + 0x0000, /* R14894 */ + 0x0000, /* R14895 */ + 0x0000, /* R14896 */ + 0x0000, /* R14897 */ + 0x0000, /* R14898 */ + 0x0000, /* R14899 */ + 0x0000, /* R14900 */ + 0x0000, /* R14901 */ + 0x0000, /* R14902 */ + 0x0000, /* R14903 */ + 0x0000, /* R14904 */ + 0x0000, /* R14905 */ + 0x0000, /* R14906 */ + 0x0000, /* R14907 */ + 0x0000, /* R14908 */ + 0x0000, /* R14909 */ + 0x0000, /* R14910 */ + 0x0000, /* R14911 */ + 0x0000, /* R14912 */ + 0x0000, /* R14913 */ + 0x0000, /* R14914 */ + 0x0000, /* R14915 */ + 0x0000, /* R14916 */ + 0x0000, /* R14917 */ + 0x0000, /* R14918 */ + 0x0000, /* R14919 */ + 0x0000, /* R14920 */ + 0x0000, /* R14921 */ + 0x0000, /* R14922 */ + 0x0000, /* R14923 */ + 0x0000, /* R14924 */ + 0x0000, /* R14925 */ + 0x0000, /* R14926 */ + 0x0000, /* R14927 */ + 0x0000, /* R14928 */ + 0x0000, /* R14929 */ + 0x0000, /* R14930 */ + 0x0000, /* R14931 */ + 0x0000, /* R14932 */ + 0x0000, /* R14933 */ + 0x0000, /* R14934 */ + 0x0000, /* R14935 */ + 0x0000, /* R14936 */ + 0x0000, /* R14937 */ + 0x0000, /* R14938 */ + 0x0000, /* R14939 */ + 0x0000, /* R14940 */ + 0x0000, /* R14941 */ + 0x0000, /* R14942 */ + 0x0000, /* R14943 */ + 0x0000, /* R14944 */ + 0x0000, /* R14945 */ + 0x0000, /* R14946 */ + 0x0000, /* R14947 */ + 0x0000, /* R14948 */ + 0x0000, /* R14949 */ + 0x0000, /* R14950 */ + 0x0000, /* R14951 */ + 0x0000, /* R14952 */ + 0x0000, /* R14953 */ + 0x0000, /* R14954 */ + 0x0000, /* R14955 */ + 0x0000, /* R14956 */ + 0x0000, /* R14957 */ + 0x0000, /* R14958 */ + 0x0000, /* R14959 */ + 0x0000, /* R14960 */ + 0x0000, /* R14961 */ + 0x0000, /* R14962 */ + 0x0000, /* R14963 */ + 0x0000, /* R14964 */ + 0x0000, /* R14965 */ + 0x0000, /* R14966 */ + 0x0000, /* R14967 */ + 0x0000, /* R14968 */ + 0x0000, /* R14969 */ + 0x0000, /* R14970 */ + 0x0000, /* R14971 */ + 0x0000, /* R14972 */ + 0x0000, /* R14973 */ + 0x0000, /* R14974 */ + 0x0000, /* R14975 */ + 0x0000, /* R14976 */ + 0x0000, /* R14977 */ + 0x0000, /* R14978 */ + 0x0000, /* R14979 */ + 0x0000, /* R14980 */ + 0x0000, /* R14981 */ + 0x0000, /* R14982 */ + 0x0000, /* R14983 */ + 0x0000, /* R14984 */ + 0x0000, /* R14985 */ + 0x0000, /* R14986 */ + 0x0000, /* R14987 */ + 0x0000, /* R14988 */ + 0x0000, /* R14989 */ + 0x0000, /* R14990 */ + 0x0000, /* R14991 */ + 0x0000, /* R14992 */ + 0x0000, /* R14993 */ + 0x0000, /* R14994 */ + 0x0000, /* R14995 */ + 0x0000, /* R14996 */ + 0x0000, /* R14997 */ + 0x0000, /* R14998 */ + 0x0000, /* R14999 */ + 0x0000, /* R15000 */ + 0x0000, /* R15001 */ + 0x0000, /* R15002 */ + 0x0000, /* R15003 */ + 0x0000, /* R15004 */ + 0x0000, /* R15005 */ + 0x0000, /* R15006 */ + 0x0000, /* R15007 */ + 0x0000, /* R15008 */ + 0x0000, /* R15009 */ + 0x0000, /* R15010 */ + 0x0000, /* R15011 */ + 0x0000, /* R15012 */ + 0x0000, /* R15013 */ + 0x0000, /* R15014 */ + 0x0000, /* R15015 */ + 0x0000, /* R15016 */ + 0x0000, /* R15017 */ + 0x0000, /* R15018 */ + 0x0000, /* R15019 */ + 0x0000, /* R15020 */ + 0x0000, /* R15021 */ + 0x0000, /* R15022 */ + 0x0000, /* R15023 */ + 0x0000, /* R15024 */ + 0x0000, /* R15025 */ + 0x0000, /* R15026 */ + 0x0000, /* R15027 */ + 0x0000, /* R15028 */ + 0x0000, /* R15029 */ + 0x0000, /* R15030 */ + 0x0000, /* R15031 */ + 0x0000, /* R15032 */ + 0x0000, /* R15033 */ + 0x0000, /* R15034 */ + 0x0000, /* R15035 */ + 0x0000, /* R15036 */ + 0x0000, /* R15037 */ + 0x0000, /* R15038 */ + 0x0000, /* R15039 */ + 0x0000, /* R15040 */ + 0x0000, /* R15041 */ + 0x0000, /* R15042 */ + 0x0000, /* R15043 */ + 0x0000, /* R15044 */ + 0x0000, /* R15045 */ + 0x0000, /* R15046 */ + 0x0000, /* R15047 */ + 0x0000, /* R15048 */ + 0x0000, /* R15049 */ + 0x0000, /* R15050 */ + 0x0000, /* R15051 */ + 0x0000, /* R15052 */ + 0x0000, /* R15053 */ + 0x0000, /* R15054 */ + 0x0000, /* R15055 */ + 0x0000, /* R15056 */ + 0x0000, /* R15057 */ + 0x0000, /* R15058 */ + 0x0000, /* R15059 */ + 0x0000, /* R15060 */ + 0x0000, /* R15061 */ + 0x0000, /* R15062 */ + 0x0000, /* R15063 */ + 0x0000, /* R15064 */ + 0x0000, /* R15065 */ + 0x0000, /* R15066 */ + 0x0000, /* R15067 */ + 0x0000, /* R15068 */ + 0x0000, /* R15069 */ + 0x0000, /* R15070 */ + 0x0000, /* R15071 */ + 0x0000, /* R15072 */ + 0x0000, /* R15073 */ + 0x0000, /* R15074 */ + 0x0000, /* R15075 */ + 0x0000, /* R15076 */ + 0x0000, /* R15077 */ + 0x0000, /* R15078 */ + 0x0000, /* R15079 */ + 0x0000, /* R15080 */ + 0x0000, /* R15081 */ + 0x0000, /* R15082 */ + 0x0000, /* R15083 */ + 0x0000, /* R15084 */ + 0x0000, /* R15085 */ + 0x0000, /* R15086 */ + 0x0000, /* R15087 */ + 0x0000, /* R15088 */ + 0x0000, /* R15089 */ + 0x0000, /* R15090 */ + 0x0000, /* R15091 */ + 0x0000, /* R15092 */ + 0x0000, /* R15093 */ + 0x0000, /* R15094 */ + 0x0000, /* R15095 */ + 0x0000, /* R15096 */ + 0x0000, /* R15097 */ + 0x0000, /* R15098 */ + 0x0000, /* R15099 */ + 0x0000, /* R15100 */ + 0x0000, /* R15101 */ + 0x0000, /* R15102 */ + 0x0000, /* R15103 */ + 0x0000, /* R15104 */ + 0x0000, /* R15105 */ + 0x0000, /* R15106 */ + 0x0000, /* R15107 */ + 0x0000, /* R15108 */ + 0x0000, /* R15109 */ + 0x0000, /* R15110 */ + 0x0000, /* R15111 */ + 0x0000, /* R15112 */ + 0x0000, /* R15113 */ + 0x0000, /* R15114 */ + 0x0000, /* R15115 */ + 0x0000, /* R15116 */ + 0x0000, /* R15117 */ + 0x0000, /* R15118 */ + 0x0000, /* R15119 */ + 0x0000, /* R15120 */ + 0x0000, /* R15121 */ + 0x0000, /* R15122 */ + 0x0000, /* R15123 */ + 0x0000, /* R15124 */ + 0x0000, /* R15125 */ + 0x0000, /* R15126 */ + 0x0000, /* R15127 */ + 0x0000, /* R15128 */ + 0x0000, /* R15129 */ + 0x0000, /* R15130 */ + 0x0000, /* R15131 */ + 0x0000, /* R15132 */ + 0x0000, /* R15133 */ + 0x0000, /* R15134 */ + 0x0000, /* R15135 */ + 0x0000, /* R15136 */ + 0x0000, /* R15137 */ + 0x0000, /* R15138 */ + 0x0000, /* R15139 */ + 0x0000, /* R15140 */ + 0x0000, /* R15141 */ + 0x0000, /* R15142 */ + 0x0000, /* R15143 */ + 0x0000, /* R15144 */ + 0x0000, /* R15145 */ + 0x0000, /* R15146 */ + 0x0000, /* R15147 */ + 0x0000, /* R15148 */ + 0x0000, /* R15149 */ + 0x0000, /* R15150 */ + 0x0000, /* R15151 */ + 0x0000, /* R15152 */ + 0x0000, /* R15153 */ + 0x0000, /* R15154 */ + 0x0000, /* R15155 */ + 0x0000, /* R15156 */ + 0x0000, /* R15157 */ + 0x0000, /* R15158 */ + 0x0000, /* R15159 */ + 0x0000, /* R15160 */ + 0x0000, /* R15161 */ + 0x0000, /* R15162 */ + 0x0000, /* R15163 */ + 0x0000, /* R15164 */ + 0x0000, /* R15165 */ + 0x0000, /* R15166 */ + 0x0000, /* R15167 */ + 0x0000, /* R15168 */ + 0x0000, /* R15169 */ + 0x0000, /* R15170 */ + 0x0000, /* R15171 */ + 0x0000, /* R15172 */ + 0x0000, /* R15173 */ + 0x0000, /* R15174 */ + 0x0000, /* R15175 */ + 0x0000, /* R15176 */ + 0x0000, /* R15177 */ + 0x0000, /* R15178 */ + 0x0000, /* R15179 */ + 0x0000, /* R15180 */ + 0x0000, /* R15181 */ + 0x0000, /* R15182 */ + 0x0000, /* R15183 */ + 0x0000, /* R15184 */ + 0x0000, /* R15185 */ + 0x0000, /* R15186 */ + 0x0000, /* R15187 */ + 0x0000, /* R15188 */ + 0x0000, /* R15189 */ + 0x0000, /* R15190 */ + 0x0000, /* R15191 */ + 0x0000, /* R15192 */ + 0x0000, /* R15193 */ + 0x0000, /* R15194 */ + 0x0000, /* R15195 */ + 0x0000, /* R15196 */ + 0x0000, /* R15197 */ + 0x0000, /* R15198 */ + 0x0000, /* R15199 */ + 0x0000, /* R15200 */ + 0x0000, /* R15201 */ + 0x0000, /* R15202 */ + 0x0000, /* R15203 */ + 0x0000, /* R15204 */ + 0x0000, /* R15205 */ + 0x0000, /* R15206 */ + 0x0000, /* R15207 */ + 0x0000, /* R15208 */ + 0x0000, /* R15209 */ + 0x0000, /* R15210 */ + 0x0000, /* R15211 */ + 0x0000, /* R15212 */ + 0x0000, /* R15213 */ + 0x0000, /* R15214 */ + 0x0000, /* R15215 */ + 0x0000, /* R15216 */ + 0x0000, /* R15217 */ + 0x0000, /* R15218 */ + 0x0000, /* R15219 */ + 0x0000, /* R15220 */ + 0x0000, /* R15221 */ + 0x0000, /* R15222 */ + 0x0000, /* R15223 */ + 0x0000, /* R15224 */ + 0x0000, /* R15225 */ + 0x0000, /* R15226 */ + 0x0000, /* R15227 */ + 0x0000, /* R15228 */ + 0x0000, /* R15229 */ + 0x0000, /* R15230 */ + 0x0000, /* R15231 */ + 0x0000, /* R15232 */ + 0x0000, /* R15233 */ + 0x0000, /* R15234 */ + 0x0000, /* R15235 */ + 0x0000, /* R15236 */ + 0x0000, /* R15237 */ + 0x0000, /* R15238 */ + 0x0000, /* R15239 */ + 0x0000, /* R15240 */ + 0x0000, /* R15241 */ + 0x0000, /* R15242 */ + 0x0000, /* R15243 */ + 0x0000, /* R15244 */ + 0x0000, /* R15245 */ + 0x0000, /* R15246 */ + 0x0000, /* R15247 */ + 0x0000, /* R15248 */ + 0x0000, /* R15249 */ + 0x0000, /* R15250 */ + 0x0000, /* R15251 */ + 0x0000, /* R15252 */ + 0x0000, /* R15253 */ + 0x0000, /* R15254 */ + 0x0000, /* R15255 */ + 0x0000, /* R15256 */ + 0x0000, /* R15257 */ + 0x0000, /* R15258 */ + 0x0000, /* R15259 */ + 0x0000, /* R15260 */ + 0x0000, /* R15261 */ + 0x0000, /* R15262 */ + 0x0000, /* R15263 */ + 0x0000, /* R15264 */ + 0x0000, /* R15265 */ + 0x0000, /* R15266 */ + 0x0000, /* R15267 */ + 0x0000, /* R15268 */ + 0x0000, /* R15269 */ + 0x0000, /* R15270 */ + 0x0000, /* R15271 */ + 0x0000, /* R15272 */ + 0x0000, /* R15273 */ + 0x0000, /* R15274 */ + 0x0000, /* R15275 */ + 0x0000, /* R15276 */ + 0x0000, /* R15277 */ + 0x0000, /* R15278 */ + 0x0000, /* R15279 */ + 0x0000, /* R15280 */ + 0x0000, /* R15281 */ + 0x0000, /* R15282 */ + 0x0000, /* R15283 */ + 0x0000, /* R15284 */ + 0x0000, /* R15285 */ + 0x0000, /* R15286 */ + 0x0000, /* R15287 */ + 0x0000, /* R15288 */ + 0x0000, /* R15289 */ + 0x0000, /* R15290 */ + 0x0000, /* R15291 */ + 0x0000, /* R15292 */ + 0x0000, /* R15293 */ + 0x0000, /* R15294 */ + 0x0000, /* R15295 */ + 0x0000, /* R15296 */ + 0x0000, /* R15297 */ + 0x0000, /* R15298 */ + 0x0000, /* R15299 */ + 0x0000, /* R15300 */ + 0x0000, /* R15301 */ + 0x0000, /* R15302 */ + 0x0000, /* R15303 */ + 0x0000, /* R15304 */ + 0x0000, /* R15305 */ + 0x0000, /* R15306 */ + 0x0000, /* R15307 */ + 0x0000, /* R15308 */ + 0x0000, /* R15309 */ + 0x0000, /* R15310 */ + 0x0000, /* R15311 */ + 0x0000, /* R15312 */ + 0x0000, /* R15313 */ + 0x0000, /* R15314 */ + 0x0000, /* R15315 */ + 0x0000, /* R15316 */ + 0x0000, /* R15317 */ + 0x0000, /* R15318 */ + 0x0000, /* R15319 */ + 0x0000, /* R15320 */ + 0x0000, /* R15321 */ + 0x0000, /* R15322 */ + 0x0000, /* R15323 */ + 0x0000, /* R15324 */ + 0x0000, /* R15325 */ + 0x0000, /* R15326 */ + 0x0000, /* R15327 */ + 0x0000, /* R15328 */ + 0x0000, /* R15329 */ + 0x0000, /* R15330 */ + 0x0000, /* R15331 */ + 0x0000, /* R15332 */ + 0x0000, /* R15333 */ + 0x0000, /* R15334 */ + 0x0000, /* R15335 */ + 0x0000, /* R15336 */ + 0x0000, /* R15337 */ + 0x0000, /* R15338 */ + 0x0000, /* R15339 */ + 0x0000, /* R15340 */ + 0x0000, /* R15341 */ + 0x0000, /* R15342 */ + 0x0000, /* R15343 */ + 0x0000, /* R15344 */ + 0x0000, /* R15345 */ + 0x0000, /* R15346 */ + 0x0000, /* R15347 */ + 0x0000, /* R15348 */ + 0x0000, /* R15349 */ + 0x0000, /* R15350 */ + 0x0000, /* R15351 */ + 0x0000, /* R15352 */ + 0x0000, /* R15353 */ + 0x0000, /* R15354 */ + 0x0000, /* R15355 */ + 0x0000, /* R15356 */ + 0x0000, /* R15357 */ + 0x0000, /* R15358 */ + 0x0000, /* R15359 */ + 0x000A, /* R15360 - DSP2 Coeff RAM 0 */ + 0x0000, /* R15361 */ + 0x0000, /* R15362 */ + 0x0000, /* R15363 */ + 0x0000, /* R15364 */ + 0x0000, /* R15365 */ + 0x0000, /* R15366 */ + 0x0000, /* R15367 */ + 0x0000, /* R15368 */ + 0x0000, /* R15369 */ + 0x0000, /* R15370 */ + 0x0000, /* R15371 */ + 0x0000, /* R15372 */ + 0x0000, /* R15373 */ + 0x0000, /* R15374 */ + 0x0000, /* R15375 */ + 0x0000, /* R15376 */ + 0x0000, /* R15377 */ + 0x0000, /* R15378 */ + 0x0000, /* R15379 */ + 0x0000, /* R15380 */ + 0x0000, /* R15381 */ + 0x0000, /* R15382 */ + 0x0000, /* R15383 */ + 0x0000, /* R15384 */ + 0x0000, /* R15385 */ + 0x0000, /* R15386 */ + 0x0000, /* R15387 */ + 0x0000, /* R15388 */ + 0x0000, /* R15389 */ + 0x0000, /* R15390 */ + 0x0000, /* R15391 */ + 0x0000, /* R15392 */ + 0x0000, /* R15393 */ + 0x0000, /* R15394 */ + 0x0000, /* R15395 */ + 0x0000, /* R15396 */ + 0x0000, /* R15397 */ + 0x0000, /* R15398 */ + 0x0000, /* R15399 */ + 0x0000, /* R15400 */ + 0x0000, /* R15401 */ + 0x0000, /* R15402 */ + 0x0000, /* R15403 */ + 0x0000, /* R15404 */ + 0x0000, /* R15405 */ + 0x0000, /* R15406 */ + 0x0000, /* R15407 */ + 0x0000, /* R15408 */ + 0x0000, /* R15409 */ + 0x0000, /* R15410 */ + 0x0000, /* R15411 */ + 0x0000, /* R15412 */ + 0x0000, /* R15413 */ + 0x0000, /* R15414 */ + 0x0000, /* R15415 */ + 0x0000, /* R15416 */ + 0x0000, /* R15417 */ + 0x0000, /* R15418 */ + 0x0000, /* R15419 */ + 0x0000, /* R15420 */ + 0x0000, /* R15421 */ + 0x0000, /* R15422 */ + 0x0000, /* R15423 */ + 0x0000, /* R15424 */ + 0x0000, /* R15425 */ + 0x0000, /* R15426 */ + 0x0000, /* R15427 */ + 0x0000, /* R15428 */ + 0x0000, /* R15429 */ + 0x0000, /* R15430 */ + 0x0000, /* R15431 */ + 0x0000, /* R15432 */ + 0x0000, /* R15433 */ + 0x0000, /* R15434 */ + 0x0000, /* R15435 */ + 0x0000, /* R15436 */ + 0x0000, /* R15437 */ + 0x0000, /* R15438 */ + 0x0000, /* R15439 */ + 0x0000, /* R15440 */ + 0x0000, /* R15441 */ + 0x0000, /* R15442 */ + 0x0000, /* R15443 */ + 0x0000, /* R15444 */ + 0x0000, /* R15445 */ + 0x0000, /* R15446 */ + 0x0000, /* R15447 */ + 0x0000, /* R15448 */ + 0x0000, /* R15449 */ + 0x0000, /* R15450 */ + 0x0000, /* R15451 */ + 0x0000, /* R15452 */ + 0x0000, /* R15453 */ + 0x0000, /* R15454 */ + 0x0000, /* R15455 */ + 0x0000, /* R15456 */ + 0x0000, /* R15457 */ + 0x0000, /* R15458 */ + 0x0000, /* R15459 */ + 0x0000, /* R15460 */ + 0x0000, /* R15461 */ + 0x0000, /* R15462 */ + 0x0000, /* R15463 */ + 0x0000, /* R15464 */ + 0x0000, /* R15465 */ + 0x0000, /* R15466 */ + 0x0000, /* R15467 */ + 0x0000, /* R15468 */ + 0x0000, /* R15469 */ + 0x0000, /* R15470 */ + 0x0000, /* R15471 */ + 0x0000, /* R15472 */ + 0x0000, /* R15473 */ + 0x0000, /* R15474 */ + 0x0000, /* R15475 */ + 0x0000, /* R15476 */ + 0x0000, /* R15477 */ + 0x0000, /* R15478 */ + 0x0000, /* R15479 */ + 0x0000, /* R15480 */ + 0x0000, /* R15481 */ + 0x0000, /* R15482 */ + 0x0000, /* R15483 */ + 0x0000, /* R15484 */ + 0x0000, /* R15485 */ + 0x0000, /* R15486 */ + 0x0000, /* R15487 */ + 0x0000, /* R15488 */ + 0x0000, /* R15489 */ + 0x0000, /* R15490 */ + 0x0000, /* R15491 */ + 0x0000, /* R15492 */ + 0x0000, /* R15493 */ + 0x0000, /* R15494 */ + 0x0000, /* R15495 */ + 0x0000, /* R15496 */ + 0x0000, /* R15497 */ + 0x0000, /* R15498 */ + 0x0000, /* R15499 */ + 0x0000, /* R15500 */ + 0x0000, /* R15501 */ + 0x0000, /* R15502 */ + 0x0000, /* R15503 */ + 0x0000, /* R15504 */ + 0x0000, /* R15505 */ + 0x0000, /* R15506 */ + 0x0000, /* R15507 */ + 0x0000, /* R15508 */ + 0x0000, /* R15509 */ + 0x0000, /* R15510 */ + 0x0000, /* R15511 */ + 0x0000, /* R15512 */ + 0x0000, /* R15513 */ + 0x0000, /* R15514 */ + 0x0000, /* R15515 */ + 0x0000, /* R15516 */ + 0x0000, /* R15517 */ + 0x0000, /* R15518 */ + 0x0000, /* R15519 */ + 0x0000, /* R15520 */ + 0x0000, /* R15521 */ + 0x0000, /* R15522 */ + 0x0000, /* R15523 */ + 0x0000, /* R15524 */ + 0x0000, /* R15525 */ + 0x0000, /* R15526 */ + 0x0000, /* R15527 */ + 0x0000, /* R15528 */ + 0x0000, /* R15529 */ + 0x0000, /* R15530 */ + 0x0000, /* R15531 */ + 0x0000, /* R15532 */ + 0x0000, /* R15533 */ + 0x0000, /* R15534 */ + 0x0000, /* R15535 */ + 0x0000, /* R15536 */ + 0x0000, /* R15537 */ + 0x0000, /* R15538 */ + 0x0000, /* R15539 */ + 0x0000, /* R15540 */ + 0x0000, /* R15541 */ + 0x0000, /* R15542 */ + 0x0000, /* R15543 */ + 0x0000, /* R15544 */ + 0x0000, /* R15545 */ + 0x0000, /* R15546 */ + 0x0000, /* R15547 */ + 0x0000, /* R15548 */ + 0x0000, /* R15549 */ + 0x0000, /* R15550 */ + 0x0000, /* R15551 */ + 0x0000, /* R15552 */ + 0x0000, /* R15553 */ + 0x0000, /* R15554 */ + 0x0000, /* R15555 */ + 0x0000, /* R15556 */ + 0x0000, /* R15557 */ + 0x0000, /* R15558 */ + 0x0000, /* R15559 */ + 0x0000, /* R15560 */ + 0x0000, /* R15561 */ + 0x0000, /* R15562 */ + 0x0000, /* R15563 */ + 0x0000, /* R15564 */ + 0x0000, /* R15565 */ + 0x0000, /* R15566 */ + 0x0000, /* R15567 */ + 0x0000, /* R15568 */ + 0x0000, /* R15569 */ + 0x0000, /* R15570 */ + 0x0000, /* R15571 */ + 0x0000, /* R15572 */ + 0x0000, /* R15573 */ + 0x0000, /* R15574 */ + 0x0000, /* R15575 */ + 0x0000, /* R15576 */ + 0x0000, /* R15577 */ + 0x0000, /* R15578 */ + 0x0000, /* R15579 */ + 0x0000, /* R15580 */ + 0x0000, /* R15581 */ + 0x0000, /* R15582 */ + 0x0000, /* R15583 */ + 0x0000, /* R15584 */ + 0x0000, /* R15585 */ + 0x0000, /* R15586 */ + 0x0000, /* R15587 */ + 0x0000, /* R15588 */ + 0x0000, /* R15589 */ + 0x0000, /* R15590 */ + 0x0000, /* R15591 */ + 0x0000, /* R15592 */ + 0x0000, /* R15593 */ + 0x0000, /* R15594 */ + 0x0000, /* R15595 */ + 0x0000, /* R15596 */ + 0x0000, /* R15597 */ + 0x0000, /* R15598 */ + 0x0000, /* R15599 */ + 0x0000, /* R15600 */ + 0x0000, /* R15601 */ + 0x0000, /* R15602 */ + 0x0000, /* R15603 */ + 0x0000, /* R15604 */ + 0x0000, /* R15605 */ + 0x0000, /* R15606 */ + 0x0000, /* R15607 */ + 0x0000, /* R15608 */ + 0x0000, /* R15609 */ + 0x0000, /* R15610 */ + 0x0000, /* R15611 */ + 0x0000, /* R15612 */ + 0x0000, /* R15613 */ + 0x0000, /* R15614 */ + 0x0000, /* R15615 */ + 0x0000, /* R15616 */ + 0x0000, /* R15617 */ + 0x0000, /* R15618 */ + 0x0000, /* R15619 */ + 0x0000, /* R15620 */ + 0x0000, /* R15621 */ + 0x0000, /* R15622 */ + 0x0000, /* R15623 */ + 0x0000, /* R15624 */ + 0x0000, /* R15625 */ + 0x0000, /* R15626 */ + 0x0000, /* R15627 */ + 0x0000, /* R15628 */ + 0x0000, /* R15629 */ + 0x0000, /* R15630 */ + 0x0000, /* R15631 */ + 0x0000, /* R15632 */ + 0x0000, /* R15633 */ + 0x0000, /* R15634 */ + 0x0000, /* R15635 */ + 0x0000, /* R15636 */ + 0x0000, /* R15637 */ + 0x0000, /* R15638 */ + 0x0000, /* R15639 */ + 0x0000, /* R15640 */ + 0x0000, /* R15641 */ + 0x0000, /* R15642 */ + 0x0000, /* R15643 */ + 0x0000, /* R15644 */ + 0x0000, /* R15645 */ + 0x0000, /* R15646 */ + 0x0000, /* R15647 */ + 0x0000, /* R15648 */ + 0x0000, /* R15649 */ + 0x0000, /* R15650 */ + 0x0000, /* R15651 */ + 0x0000, /* R15652 */ + 0x0000, /* R15653 */ + 0x0000, /* R15654 */ + 0x0000, /* R15655 */ + 0x0000, /* R15656 */ + 0x0000, /* R15657 */ + 0x0000, /* R15658 */ + 0x0000, /* R15659 */ + 0x0000, /* R15660 */ + 0x0000, /* R15661 */ + 0x0000, /* R15662 */ + 0x0000, /* R15663 */ + 0x0000, /* R15664 */ + 0x0000, /* R15665 */ + 0x0000, /* R15666 */ + 0x0000, /* R15667 */ + 0x0000, /* R15668 */ + 0x0000, /* R15669 */ + 0x0000, /* R15670 */ + 0x0000, /* R15671 */ + 0x0000, /* R15672 */ + 0x0000, /* R15673 */ + 0x0000, /* R15674 */ + 0x0000, /* R15675 */ + 0x0000, /* R15676 */ + 0x0000, /* R15677 */ + 0x0000, /* R15678 */ + 0x0000, /* R15679 */ + 0x0000, /* R15680 */ + 0x0000, /* R15681 */ + 0x0000, /* R15682 */ + 0x0000, /* R15683 */ + 0x0000, /* R15684 */ + 0x0000, /* R15685 */ + 0x0000, /* R15686 */ + 0x0000, /* R15687 */ + 0x0000, /* R15688 */ + 0x0000, /* R15689 */ + 0x0000, /* R15690 */ + 0x0000, /* R15691 */ + 0x0000, /* R15692 */ + 0x0000, /* R15693 */ + 0x0000, /* R15694 */ + 0x0000, /* R15695 */ + 0x0000, /* R15696 */ + 0x0000, /* R15697 */ + 0x0000, /* R15698 */ + 0x0000, /* R15699 */ + 0x0000, /* R15700 */ + 0x0000, /* R15701 */ + 0x0000, /* R15702 */ + 0x0000, /* R15703 */ + 0x0000, /* R15704 */ + 0x0000, /* R15705 */ + 0x0000, /* R15706 */ + 0x0000, /* R15707 */ + 0x0000, /* R15708 */ + 0x0000, /* R15709 */ + 0x0000, /* R15710 */ + 0x0000, /* R15711 */ + 0x0000, /* R15712 */ + 0x0000, /* R15713 */ + 0x0000, /* R15714 */ + 0x0000, /* R15715 */ + 0x0000, /* R15716 */ + 0x0000, /* R15717 */ + 0x0000, /* R15718 */ + 0x0000, /* R15719 */ + 0x0000, /* R15720 */ + 0x0000, /* R15721 */ + 0x0000, /* R15722 */ + 0x0000, /* R15723 */ + 0x0000, /* R15724 */ + 0x0000, /* R15725 */ + 0x0000, /* R15726 */ + 0x0000, /* R15727 */ + 0x0000, /* R15728 */ + 0x0000, /* R15729 */ + 0x0000, /* R15730 */ + 0x0000, /* R15731 */ + 0x0000, /* R15732 */ + 0x0000, /* R15733 */ + 0x0000, /* R15734 */ + 0x0000, /* R15735 */ + 0x0000, /* R15736 */ + 0x0000, /* R15737 */ + 0x0000, /* R15738 */ + 0x0000, /* R15739 */ + 0x0000, /* R15740 */ + 0x0000, /* R15741 */ + 0x0000, /* R15742 */ + 0x0000, /* R15743 */ + 0x0000, /* R15744 */ + 0x0000, /* R15745 */ + 0x0000, /* R15746 */ + 0x0000, /* R15747 */ + 0x0000, /* R15748 */ + 0x0000, /* R15749 */ + 0x0000, /* R15750 */ + 0x0000, /* R15751 */ + 0x0000, /* R15752 */ + 0x0000, /* R15753 */ + 0x0000, /* R15754 */ + 0x0000, /* R15755 */ + 0x0000, /* R15756 */ + 0x0000, /* R15757 */ + 0x0000, /* R15758 */ + 0x0000, /* R15759 */ + 0x0000, /* R15760 */ + 0x0000, /* R15761 */ + 0x0000, /* R15762 */ + 0x0000, /* R15763 */ + 0x0000, /* R15764 */ + 0x0000, /* R15765 */ + 0x0000, /* R15766 */ + 0x0000, /* R15767 */ + 0x0000, /* R15768 */ + 0x0000, /* R15769 */ + 0x0000, /* R15770 */ + 0x0000, /* R15771 */ + 0x0000, /* R15772 */ + 0x0000, /* R15773 */ + 0x0000, /* R15774 */ + 0x0000, /* R15775 */ + 0x0000, /* R15776 */ + 0x0000, /* R15777 */ + 0x0000, /* R15778 */ + 0x0000, /* R15779 */ + 0x0000, /* R15780 */ + 0x0000, /* R15781 */ + 0x0000, /* R15782 */ + 0x0000, /* R15783 */ + 0x0000, /* R15784 */ + 0x0000, /* R15785 */ + 0x0000, /* R15786 */ + 0x0000, /* R15787 */ + 0x0000, /* R15788 */ + 0x0000, /* R15789 */ + 0x0000, /* R15790 */ + 0x0000, /* R15791 */ + 0x0000, /* R15792 */ + 0x0000, /* R15793 */ + 0x0000, /* R15794 */ + 0x0000, /* R15795 */ + 0x0000, /* R15796 */ + 0x0000, /* R15797 */ + 0x0000, /* R15798 */ + 0x0000, /* R15799 */ + 0x0000, /* R15800 */ + 0x0000, /* R15801 */ + 0x0000, /* R15802 */ + 0x0000, /* R15803 */ + 0x0000, /* R15804 */ + 0x0000, /* R15805 */ + 0x0000, /* R15806 */ + 0x0000, /* R15807 */ + 0x0000, /* R15808 */ + 0x0000, /* R15809 */ + 0x0000, /* R15810 */ + 0x0000, /* R15811 */ + 0x0000, /* R15812 */ + 0x0000, /* R15813 */ + 0x0000, /* R15814 */ + 0x0000, /* R15815 */ + 0x0000, /* R15816 */ + 0x0000, /* R15817 */ + 0x0000, /* R15818 */ + 0x0000, /* R15819 */ + 0x0000, /* R15820 */ + 0x0000, /* R15821 */ + 0x0000, /* R15822 */ + 0x0000, /* R15823 */ + 0x0000, /* R15824 */ + 0x0000, /* R15825 */ + 0x0000, /* R15826 */ + 0x0000, /* R15827 */ + 0x0000, /* R15828 */ + 0x0000, /* R15829 */ + 0x0000, /* R15830 */ + 0x0000, /* R15831 */ + 0x0000, /* R15832 */ + 0x0000, /* R15833 */ + 0x0000, /* R15834 */ + 0x0000, /* R15835 */ + 0x0000, /* R15836 */ + 0x0000, /* R15837 */ + 0x0000, /* R15838 */ + 0x0000, /* R15839 */ + 0x0000, /* R15840 */ + 0x0000, /* R15841 */ + 0x0000, /* R15842 */ + 0x0000, /* R15843 */ + 0x0000, /* R15844 */ + 0x0000, /* R15845 */ + 0x0000, /* R15846 */ + 0x0000, /* R15847 */ + 0x0000, /* R15848 */ + 0x0000, /* R15849 */ + 0x0000, /* R15850 */ + 0x0000, /* R15851 */ + 0x0000, /* R15852 */ + 0x0000, /* R15853 */ + 0x0000, /* R15854 */ + 0x0000, /* R15855 */ + 0x0000, /* R15856 */ + 0x0000, /* R15857 */ + 0x0000, /* R15858 */ + 0x0000, /* R15859 */ + 0x0000, /* R15860 */ + 0x0000, /* R15861 */ + 0x0000, /* R15862 */ + 0x0000, /* R15863 */ + 0x0000, /* R15864 */ + 0x0000, /* R15865 */ + 0x0000, /* R15866 */ + 0x0000, /* R15867 */ + 0x0000, /* R15868 */ + 0x0000, /* R15869 */ + 0x0000, /* R15870 */ + 0x0000, /* R15871 */ + 0x0000, /* R15872 */ + 0x0000, /* R15873 */ + 0x0000, /* R15874 */ + 0x0000, /* R15875 */ + 0x0000, /* R15876 */ + 0x0000, /* R15877 */ + 0x0000, /* R15878 */ + 0x0000, /* R15879 */ + 0x0000, /* R15880 */ + 0x0000, /* R15881 */ + 0x0000, /* R15882 */ + 0x0000, /* R15883 */ + 0x0000, /* R15884 */ + 0x0000, /* R15885 */ + 0x0000, /* R15886 */ + 0x0000, /* R15887 */ + 0x0000, /* R15888 */ + 0x0000, /* R15889 */ + 0x0000, /* R15890 */ + 0x0000, /* R15891 */ + 0x0000, /* R15892 */ + 0x0000, /* R15893 */ + 0x0000, /* R15894 */ + 0x0000, /* R15895 */ + 0x0000, /* R15896 */ + 0x0000, /* R15897 */ + 0x0000, /* R15898 */ + 0x0000, /* R15899 */ + 0x0000, /* R15900 */ + 0x0000, /* R15901 */ + 0x0000, /* R15902 */ + 0x0000, /* R15903 */ + 0x0000, /* R15904 */ + 0x0000, /* R15905 */ + 0x0000, /* R15906 */ + 0x0000, /* R15907 */ + 0x0000, /* R15908 */ + 0x0000, /* R15909 */ + 0x0000, /* R15910 */ + 0x0000, /* R15911 */ + 0x0000, /* R15912 */ + 0x0000, /* R15913 */ + 0x0000, /* R15914 */ + 0x0000, /* R15915 */ + 0x0000, /* R15916 */ + 0x0000, /* R15917 */ + 0x0000, /* R15918 */ + 0x0000, /* R15919 */ + 0x0000, /* R15920 */ + 0x0000, /* R15921 */ + 0x0000, /* R15922 */ + 0x0000, /* R15923 */ + 0x0000, /* R15924 */ + 0x0000, /* R15925 */ + 0x0000, /* R15926 */ + 0x0000, /* R15927 */ + 0x0000, /* R15928 */ + 0x0000, /* R15929 */ + 0x0000, /* R15930 */ + 0x0000, /* R15931 */ + 0x0000, /* R15932 */ + 0x0000, /* R15933 */ + 0x0000, /* R15934 */ + 0x0000, /* R15935 */ + 0x0000, /* R15936 */ + 0x0000, /* R15937 */ + 0x0000, /* R15938 */ + 0x0000, /* R15939 */ + 0x0000, /* R15940 */ + 0x0000, /* R15941 */ + 0x0000, /* R15942 */ + 0x0000, /* R15943 */ + 0x0000, /* R15944 */ + 0x0000, /* R15945 */ + 0x0000, /* R15946 */ + 0x0000, /* R15947 */ + 0x0000, /* R15948 */ + 0x0000, /* R15949 */ + 0x0000, /* R15950 */ + 0x0000, /* R15951 */ + 0x0000, /* R15952 */ + 0x0000, /* R15953 */ + 0x0000, /* R15954 */ + 0x0000, /* R15955 */ + 0x0000, /* R15956 */ + 0x0000, /* R15957 */ + 0x0000, /* R15958 */ + 0x0000, /* R15959 */ + 0x0000, /* R15960 */ + 0x0000, /* R15961 */ + 0x0000, /* R15962 */ + 0x0000, /* R15963 */ + 0x0000, /* R15964 */ + 0x0000, /* R15965 */ + 0x0000, /* R15966 */ + 0x0000, /* R15967 */ + 0x0000, /* R15968 */ + 0x0000, /* R15969 */ + 0x0000, /* R15970 */ + 0x0000, /* R15971 */ + 0x0000, /* R15972 */ + 0x0000, /* R15973 */ + 0x0000, /* R15974 */ + 0x0000, /* R15975 */ + 0x0000, /* R15976 */ + 0x0000, /* R15977 */ + 0x0000, /* R15978 */ + 0x0000, /* R15979 */ + 0x0000, /* R15980 */ + 0x0000, /* R15981 */ + 0x0000, /* R15982 */ + 0x0000, /* R15983 */ + 0x0000, /* R15984 */ + 0x0000, /* R15985 */ + 0x0000, /* R15986 */ + 0x0000, /* R15987 */ + 0x0000, /* R15988 */ + 0x0000, /* R15989 */ + 0x0000, /* R15990 */ + 0x0000, /* R15991 */ + 0x0000, /* R15992 */ + 0x0000, /* R15993 */ + 0x0000, /* R15994 */ + 0x0000, /* R15995 */ + 0x0000, /* R15996 */ + 0x0000, /* R15997 */ + 0x0000, /* R15998 */ + 0x0000, /* R15999 */ + 0x0000, /* R16000 */ + 0x0000, /* R16001 */ + 0x0000, /* R16002 */ + 0x0000, /* R16003 */ + 0x0000, /* R16004 */ + 0x0000, /* R16005 */ + 0x0000, /* R16006 */ + 0x0000, /* R16007 */ + 0x0000, /* R16008 */ + 0x0000, /* R16009 */ + 0x0000, /* R16010 */ + 0x0000, /* R16011 */ + 0x0000, /* R16012 */ + 0x0000, /* R16013 */ + 0x0000, /* R16014 */ + 0x0000, /* R16015 */ + 0x0000, /* R16016 */ + 0x0000, /* R16017 */ + 0x0000, /* R16018 */ + 0x0000, /* R16019 */ + 0x0000, /* R16020 */ + 0x0000, /* R16021 */ + 0x0000, /* R16022 */ + 0x0000, /* R16023 */ + 0x0000, /* R16024 */ + 0x0000, /* R16025 */ + 0x0000, /* R16026 */ + 0x0000, /* R16027 */ + 0x0000, /* R16028 */ + 0x0000, /* R16029 */ + 0x0000, /* R16030 */ + 0x0000, /* R16031 */ + 0x0000, /* R16032 */ + 0x0000, /* R16033 */ + 0x0000, /* R16034 */ + 0x0000, /* R16035 */ + 0x0000, /* R16036 */ + 0x0000, /* R16037 */ + 0x0000, /* R16038 */ + 0x0000, /* R16039 */ + 0x0000, /* R16040 */ + 0x0000, /* R16041 */ + 0x0000, /* R16042 */ + 0x0000, /* R16043 */ + 0x0000, /* R16044 */ + 0x0000, /* R16045 */ + 0x0000, /* R16046 */ + 0x0000, /* R16047 */ + 0x0000, /* R16048 */ + 0x0000, /* R16049 */ + 0x0000, /* R16050 */ + 0x0000, /* R16051 */ + 0x0000, /* R16052 */ + 0x0000, /* R16053 */ + 0x0000, /* R16054 */ + 0x0000, /* R16055 */ + 0x0000, /* R16056 */ + 0x0000, /* R16057 */ + 0x0000, /* R16058 */ + 0x0000, /* R16059 */ + 0x0000, /* R16060 */ + 0x0000, /* R16061 */ + 0x0000, /* R16062 */ + 0x0000, /* R16063 */ + 0x0000, /* R16064 */ + 0x0000, /* R16065 */ + 0x0000, /* R16066 */ + 0x0000, /* R16067 */ + 0x0000, /* R16068 */ + 0x0000, /* R16069 */ + 0x0000, /* R16070 */ + 0x0000, /* R16071 */ + 0x0000, /* R16072 */ + 0x0000, /* R16073 */ + 0x0000, /* R16074 */ + 0x0000, /* R16075 */ + 0x0000, /* R16076 */ + 0x0000, /* R16077 */ + 0x0000, /* R16078 */ + 0x0000, /* R16079 */ + 0x0000, /* R16080 */ + 0x0000, /* R16081 */ + 0x0000, /* R16082 */ + 0x0000, /* R16083 */ + 0x0000, /* R16084 */ + 0x0000, /* R16085 */ + 0x0000, /* R16086 */ + 0x0000, /* R16087 */ + 0x0000, /* R16088 */ + 0x0000, /* R16089 */ + 0x0000, /* R16090 */ + 0x0000, /* R16091 */ + 0x0000, /* R16092 */ + 0x0000, /* R16093 */ + 0x0000, /* R16094 */ + 0x0000, /* R16095 */ + 0x0000, /* R16096 */ + 0x0000, /* R16097 */ + 0x0000, /* R16098 */ + 0x0000, /* R16099 */ + 0x0000, /* R16100 */ + 0x0000, /* R16101 */ + 0x0000, /* R16102 */ + 0x0000, /* R16103 */ + 0x0000, /* R16104 */ + 0x0000, /* R16105 */ + 0x0000, /* R16106 */ + 0x0000, /* R16107 */ + 0x0000, /* R16108 */ + 0x0000, /* R16109 */ + 0x0000, /* R16110 */ + 0x0000, /* R16111 */ + 0x0000, /* R16112 */ + 0x0000, /* R16113 */ + 0x0000, /* R16114 */ + 0x0000, /* R16115 */ + 0x0000, /* R16116 */ + 0x0000, /* R16117 */ + 0x0000, /* R16118 */ + 0x0000, /* R16119 */ + 0x0000, /* R16120 */ + 0x0000, /* R16121 */ + 0x0000, /* R16122 */ + 0x0000, /* R16123 */ + 0x0000, /* R16124 */ + 0x0000, /* R16125 */ + 0x0000, /* R16126 */ + 0x0000, /* R16127 */ + 0x0000, /* R16128 */ + 0x0000, /* R16129 */ + 0x0000, /* R16130 */ + 0x0000, /* R16131 */ + 0x0000, /* R16132 */ + 0x0000, /* R16133 */ + 0x0000, /* R16134 */ + 0x0000, /* R16135 */ + 0x0000, /* R16136 */ + 0x0000, /* R16137 */ + 0x0000, /* R16138 */ + 0x0000, /* R16139 */ + 0x0000, /* R16140 */ + 0x0000, /* R16141 */ + 0x0000, /* R16142 */ + 0x0000, /* R16143 */ + 0x0000, /* R16144 */ + 0x0000, /* R16145 */ + 0x0000, /* R16146 */ + 0x0000, /* R16147 */ + 0x0000, /* R16148 */ + 0x0000, /* R16149 */ + 0x0000, /* R16150 */ + 0x0000, /* R16151 */ + 0x0000, /* R16152 */ + 0x0000, /* R16153 */ + 0x0000, /* R16154 */ + 0x0000, /* R16155 */ + 0x0000, /* R16156 */ + 0x0000, /* R16157 */ + 0x0000, /* R16158 */ + 0x0000, /* R16159 */ + 0x0000, /* R16160 */ + 0x0000, /* R16161 */ + 0x0000, /* R16162 */ + 0x0000, /* R16163 */ + 0x0000, /* R16164 */ + 0x0000, /* R16165 */ + 0x0000, /* R16166 */ + 0x0000, /* R16167 */ + 0x0000, /* R16168 */ + 0x0000, /* R16169 */ + 0x0000, /* R16170 */ + 0x0000, /* R16171 */ + 0x0000, /* R16172 */ + 0x0000, /* R16173 */ + 0x0000, /* R16174 */ + 0x0000, /* R16175 */ + 0x0000, /* R16176 */ + 0x0000, /* R16177 */ + 0x0000, /* R16178 */ + 0x0000, /* R16179 */ + 0x0000, /* R16180 */ + 0x0000, /* R16181 */ + 0x0000, /* R16182 */ + 0x0000, /* R16183 */ + 0x0000, /* R16184 */ + 0x0000, /* R16185 */ + 0x0000, /* R16186 */ + 0x0000, /* R16187 */ + 0x0000, /* R16188 */ + 0x0000, /* R16189 */ + 0x0000, /* R16190 */ + 0x0000, /* R16191 */ + 0x0000, /* R16192 */ + 0x0000, /* R16193 */ + 0x0000, /* R16194 */ + 0x0000, /* R16195 */ + 0x0000, /* R16196 */ + 0x0000, /* R16197 */ + 0x0000, /* R16198 */ + 0x0000, /* R16199 */ + 0x0000, /* R16200 */ + 0x0000, /* R16201 */ + 0x0000, /* R16202 */ + 0x0000, /* R16203 */ + 0x0000, /* R16204 */ + 0x0000, /* R16205 */ + 0x0000, /* R16206 */ + 0x0000, /* R16207 */ + 0x0000, /* R16208 */ + 0x0000, /* R16209 */ + 0x0000, /* R16210 */ + 0x0000, /* R16211 */ + 0x0000, /* R16212 */ + 0x0000, /* R16213 */ + 0x0000, /* R16214 */ + 0x0000, /* R16215 */ + 0x0000, /* R16216 */ + 0x0000, /* R16217 */ + 0x0000, /* R16218 */ + 0x0000, /* R16219 */ + 0x0000, /* R16220 */ + 0x0000, /* R16221 */ + 0x0000, /* R16222 */ + 0x0000, /* R16223 */ + 0x0000, /* R16224 */ + 0x0000, /* R16225 */ + 0x0000, /* R16226 */ + 0x0000, /* R16227 */ + 0x0000, /* R16228 */ + 0x0000, /* R16229 */ + 0x0000, /* R16230 */ + 0x0000, /* R16231 */ + 0x0000, /* R16232 */ + 0x0000, /* R16233 */ + 0x0000, /* R16234 */ + 0x0000, /* R16235 */ + 0x0000, /* R16236 */ + 0x0000, /* R16237 */ + 0x0000, /* R16238 */ + 0x0000, /* R16239 */ + 0x0000, /* R16240 */ + 0x0000, /* R16241 */ + 0x0000, /* R16242 */ + 0x0000, /* R16243 */ + 0x0000, /* R16244 */ + 0x0000, /* R16245 */ + 0x0000, /* R16246 */ + 0x0000, /* R16247 */ + 0x0000, /* R16248 */ + 0x0000, /* R16249 */ + 0x0000, /* R16250 */ + 0x0000, /* R16251 */ + 0x0000, /* R16252 */ + 0x0000, /* R16253 */ + 0x0000, /* R16254 */ + 0x0000, /* R16255 */ + 0x0000, /* R16256 */ + 0x0000, /* R16257 */ + 0x0000, /* R16258 */ + 0x0000, /* R16259 */ + 0x0000, /* R16260 */ + 0x0000, /* R16261 */ + 0x0000, /* R16262 */ + 0x0000, /* R16263 */ + 0x0000, /* R16264 */ + 0x0000, /* R16265 */ + 0x0000, /* R16266 */ + 0x0000, /* R16267 */ + 0x0000, /* R16268 */ + 0x0000, /* R16269 */ + 0x0000, /* R16270 */ + 0x0000, /* R16271 */ + 0x0000, /* R16272 */ + 0x0000, /* R16273 */ + 0x0000, /* R16274 */ + 0x0000, /* R16275 */ + 0x0000, /* R16276 */ + 0x0000, /* R16277 */ + 0x0000, /* R16278 */ + 0x0000, /* R16279 */ + 0x0000, /* R16280 */ + 0x0000, /* R16281 */ + 0x0000, /* R16282 */ + 0x0000, /* R16283 */ + 0x0000, /* R16284 */ + 0x0000, /* R16285 */ + 0x0000, /* R16286 */ + 0x0000, /* R16287 */ + 0x0000, /* R16288 */ + 0x0000, /* R16289 */ + 0x0000, /* R16290 */ + 0x0000, /* R16291 */ + 0x0000, /* R16292 */ + 0x0000, /* R16293 */ + 0x0000, /* R16294 */ + 0x0000, /* R16295 */ + 0x0000, /* R16296 */ + 0x0000, /* R16297 */ + 0x0000, /* R16298 */ + 0x0000, /* R16299 */ + 0x0000, /* R16300 */ + 0x0000, /* R16301 */ + 0x0000, /* R16302 */ + 0x0000, /* R16303 */ + 0x0000, /* R16304 */ + 0x0000, /* R16305 */ + 0x0000, /* R16306 */ + 0x0000, /* R16307 */ + 0x0000, /* R16308 */ + 0x0000, /* R16309 */ + 0x0000, /* R16310 */ + 0x0000, /* R16311 */ + 0x0000, /* R16312 */ + 0x0000, /* R16313 */ + 0x0000, /* R16314 */ + 0x0000, /* R16315 */ + 0x0000, /* R16316 */ + 0x0000, /* R16317 */ + 0x0000, /* R16318 */ + 0x0000, /* R16319 */ + 0x0000, /* R16320 */ + 0x0000, /* R16321 */ + 0x0000, /* R16322 */ + 0x0000, /* R16323 */ + 0x0000, /* R16324 */ + 0x0000, /* R16325 */ + 0x0000, /* R16326 */ + 0x0000, /* R16327 */ + 0x0000, /* R16328 */ + 0x0000, /* R16329 */ + 0x0000, /* R16330 */ + 0x0000, /* R16331 */ + 0x0000, /* R16332 */ + 0x0000, /* R16333 */ + 0x0000, /* R16334 */ + 0x0000, /* R16335 */ + 0x0000, /* R16336 */ + 0x0000, /* R16337 */ + 0x0000, /* R16338 */ + 0x0000, /* R16339 */ + 0x0000, /* R16340 */ + 0x0000, /* R16341 */ + 0x0000, /* R16342 */ + 0x0000, /* R16343 */ + 0x0000, /* R16344 */ + 0x0000, /* R16345 */ + 0x0000, /* R16346 */ + 0x0000, /* R16347 */ + 0x0000, /* R16348 */ + 0x0000, /* R16349 */ + 0x0000, /* R16350 */ + 0x0000, /* R16351 */ + 0x0000, /* R16352 */ + 0x0000, /* R16353 */ + 0x0000, /* R16354 */ + 0x0000, /* R16355 */ + 0x0000, /* R16356 */ + 0x0000, /* R16357 */ + 0x0000, /* R16358 */ + 0x0000, /* R16359 */ + 0x0000, /* R16360 */ + 0x0000, /* R16361 */ + 0x0000, /* R16362 */ + 0x0000, /* R16363 */ + 0x0000, /* R16364 */ + 0x0000, /* R16365 */ + 0x0000, /* R16366 */ + 0x0000, /* R16367 */ + 0x0000, /* R16368 */ + 0x0000, /* R16369 */ + 0x0000, /* R16370 */ + 0x0000, /* R16371 */ + 0x0000, /* R16372 */ + 0x0000, /* R16373 */ + 0x0000, /* R16374 */ + 0x0000, /* R16375 */ + 0x0000, /* R16376 */ + 0x0000, /* R16377 */ + 0x0000, /* R16378 */ + 0x0000, /* R16379 */ + 0x0000, /* R16380 */ + 0x0000, /* R16381 */ + 0x0000, /* R16382 */ + 0x0000, /* R16383 */ + 0x0000, /* R16384 - RETUNEADC_SHARED_COEFF_1 */ + 0x0000, /* R16385 - RETUNEADC_SHARED_COEFF_0 */ + 0x0000, /* R16386 - RETUNEDAC_SHARED_COEFF_1 */ + 0x0000, /* R16387 - RETUNEDAC_SHARED_COEFF_0 */ + 0x0000, /* R16388 - SOUNDSTAGE_ENABLES_1 */ + 0x0000, /* R16389 - SOUNDSTAGE_ENABLES_0 */ + 0x0000, /* R16390 */ + 0x0000, /* R16391 */ + 0x0000, /* R16392 */ + 0x0000, /* R16393 */ + 0x0000, /* R16394 */ + 0x0000, /* R16395 */ + 0x0000, /* R16396 */ + 0x0000, /* R16397 */ + 0x0000, /* R16398 */ + 0x0000, /* R16399 */ + 0x0000, /* R16400 */ + 0x0000, /* R16401 */ + 0x0000, /* R16402 */ + 0x0000, /* R16403 */ + 0x0000, /* R16404 */ + 0x0000, /* R16405 */ + 0x0000, /* R16406 */ + 0x0000, /* R16407 */ + 0x0000, /* R16408 */ + 0x0000, /* R16409 */ + 0x0000, /* R16410 */ + 0x0000, /* R16411 */ + 0x0000, /* R16412 */ + 0x0000, /* R16413 */ + 0x0000, /* R16414 */ + 0x0000, /* R16415 */ + 0x0000, /* R16416 */ + 0x0000, /* R16417 */ + 0x0000, /* R16418 */ + 0x0000, /* R16419 */ + 0x0000, /* R16420 */ + 0x0000, /* R16421 */ + 0x0000, /* R16422 */ + 0x0000, /* R16423 */ + 0x0000, /* R16424 */ + 0x0000, /* R16425 */ + 0x0000, /* R16426 */ + 0x0000, /* R16427 */ + 0x0000, /* R16428 */ + 0x0000, /* R16429 */ + 0x0000, /* R16430 */ + 0x0000, /* R16431 */ + 0x0000, /* R16432 */ + 0x0000, /* R16433 */ + 0x0000, /* R16434 */ + 0x0000, /* R16435 */ + 0x0000, /* R16436 */ + 0x0000, /* R16437 */ + 0x0000, /* R16438 */ + 0x0000, /* R16439 */ + 0x0000, /* R16440 */ + 0x0000, /* R16441 */ + 0x0000, /* R16442 */ + 0x0000, /* R16443 */ + 0x0000, /* R16444 */ + 0x0000, /* R16445 */ + 0x0000, /* R16446 */ + 0x0000, /* R16447 */ + 0x0000, /* R16448 */ + 0x0000, /* R16449 */ + 0x0000, /* R16450 */ + 0x0000, /* R16451 */ + 0x0000, /* R16452 */ + 0x0000, /* R16453 */ + 0x0000, /* R16454 */ + 0x0000, /* R16455 */ + 0x0000, /* R16456 */ + 0x0000, /* R16457 */ + 0x0000, /* R16458 */ + 0x0000, /* R16459 */ + 0x0000, /* R16460 */ + 0x0000, /* R16461 */ + 0x0000, /* R16462 */ + 0x0000, /* R16463 */ + 0x0000, /* R16464 */ + 0x0000, /* R16465 */ + 0x0000, /* R16466 */ + 0x0000, /* R16467 */ + 0x0000, /* R16468 */ + 0x0000, /* R16469 */ + 0x0000, /* R16470 */ + 0x0000, /* R16471 */ + 0x0000, /* R16472 */ + 0x0000, /* R16473 */ + 0x0000, /* R16474 */ + 0x0000, /* R16475 */ + 0x0000, /* R16476 */ + 0x0000, /* R16477 */ + 0x0000, /* R16478 */ + 0x0000, /* R16479 */ + 0x0000, /* R16480 */ + 0x0000, /* R16481 */ + 0x0000, /* R16482 */ + 0x0000, /* R16483 */ + 0x0000, /* R16484 */ + 0x0000, /* R16485 */ + 0x0000, /* R16486 */ + 0x0000, /* R16487 */ + 0x0000, /* R16488 */ + 0x0000, /* R16489 */ + 0x0000, /* R16490 */ + 0x0000, /* R16491 */ + 0x0000, /* R16492 */ + 0x0000, /* R16493 */ + 0x0000, /* R16494 */ + 0x0000, /* R16495 */ + 0x0000, /* R16496 */ + 0x0000, /* R16497 */ + 0x0000, /* R16498 */ + 0x0000, /* R16499 */ + 0x0000, /* R16500 */ + 0x0000, /* R16501 */ + 0x0000, /* R16502 */ + 0x0000, /* R16503 */ + 0x0000, /* R16504 */ + 0x0000, /* R16505 */ + 0x0000, /* R16506 */ + 0x0000, /* R16507 */ + 0x0000, /* R16508 */ + 0x0000, /* R16509 */ + 0x0000, /* R16510 */ + 0x0000, /* R16511 */ + 0x0000, /* R16512 */ + 0x0000, /* R16513 */ + 0x0000, /* R16514 */ + 0x0000, /* R16515 */ + 0x0000, /* R16516 */ + 0x0000, /* R16517 */ + 0x0000, /* R16518 */ + 0x0000, /* R16519 */ + 0x0000, /* R16520 */ + 0x0000, /* R16521 */ + 0x0000, /* R16522 */ + 0x0000, /* R16523 */ + 0x0000, /* R16524 */ + 0x0000, /* R16525 */ + 0x0000, /* R16526 */ + 0x0000, /* R16527 */ + 0x0000, /* R16528 */ + 0x0000, /* R16529 */ + 0x0000, /* R16530 */ + 0x0000, /* R16531 */ + 0x0000, /* R16532 */ + 0x0000, /* R16533 */ + 0x0000, /* R16534 */ + 0x0000, /* R16535 */ + 0x0000, /* R16536 */ + 0x0000, /* R16537 */ + 0x0000, /* R16538 */ + 0x0000, /* R16539 */ + 0x0000, /* R16540 */ + 0x0000, /* R16541 */ + 0x0000, /* R16542 */ + 0x0000, /* R16543 */ + 0x0000, /* R16544 */ + 0x0000, /* R16545 */ + 0x0000, /* R16546 */ + 0x0000, /* R16547 */ + 0x0000, /* R16548 */ + 0x0000, /* R16549 */ + 0x0000, /* R16550 */ + 0x0000, /* R16551 */ + 0x0000, /* R16552 */ + 0x0000, /* R16553 */ + 0x0000, /* R16554 */ + 0x0000, /* R16555 */ + 0x0000, /* R16556 */ + 0x0000, /* R16557 */ + 0x0000, /* R16558 */ + 0x0000, /* R16559 */ + 0x0000, /* R16560 */ + 0x0000, /* R16561 */ + 0x0000, /* R16562 */ + 0x0000, /* R16563 */ + 0x0000, /* R16564 */ + 0x0000, /* R16565 */ + 0x0000, /* R16566 */ + 0x0000, /* R16567 */ + 0x0000, /* R16568 */ + 0x0000, /* R16569 */ + 0x0000, /* R16570 */ + 0x0000, /* R16571 */ + 0x0000, /* R16572 */ + 0x0000, /* R16573 */ + 0x0000, /* R16574 */ + 0x0000, /* R16575 */ + 0x0000, /* R16576 */ + 0x0000, /* R16577 */ + 0x0000, /* R16578 */ + 0x0000, /* R16579 */ + 0x0000, /* R16580 */ + 0x0000, /* R16581 */ + 0x0000, /* R16582 */ + 0x0000, /* R16583 */ + 0x0000, /* R16584 */ + 0x0000, /* R16585 */ + 0x0000, /* R16586 */ + 0x0000, /* R16587 */ + 0x0000, /* R16588 */ + 0x0000, /* R16589 */ + 0x0000, /* R16590 */ + 0x0000, /* R16591 */ + 0x0000, /* R16592 */ + 0x0000, /* R16593 */ + 0x0000, /* R16594 */ + 0x0000, /* R16595 */ + 0x0000, /* R16596 */ + 0x0000, /* R16597 */ + 0x0000, /* R16598 */ + 0x0000, /* R16599 */ + 0x0000, /* R16600 */ + 0x0000, /* R16601 */ + 0x0000, /* R16602 */ + 0x0000, /* R16603 */ + 0x0000, /* R16604 */ + 0x0000, /* R16605 */ + 0x0000, /* R16606 */ + 0x0000, /* R16607 */ + 0x0000, /* R16608 */ + 0x0000, /* R16609 */ + 0x0000, /* R16610 */ + 0x0000, /* R16611 */ + 0x0000, /* R16612 */ + 0x0000, /* R16613 */ + 0x0000, /* R16614 */ + 0x0000, /* R16615 */ + 0x0000, /* R16616 */ + 0x0000, /* R16617 */ + 0x0000, /* R16618 */ + 0x0000, /* R16619 */ + 0x0000, /* R16620 */ + 0x0000, /* R16621 */ + 0x0000, /* R16622 */ + 0x0000, /* R16623 */ + 0x0000, /* R16624 */ + 0x0000, /* R16625 */ + 0x0000, /* R16626 */ + 0x0000, /* R16627 */ + 0x0000, /* R16628 */ + 0x0000, /* R16629 */ + 0x0000, /* R16630 */ + 0x0000, /* R16631 */ + 0x0000, /* R16632 */ + 0x0000, /* R16633 */ + 0x0000, /* R16634 */ + 0x0000, /* R16635 */ + 0x0000, /* R16636 */ + 0x0000, /* R16637 */ + 0x0000, /* R16638 */ + 0x0000, /* R16639 */ + 0x0000, /* R16640 */ + 0x0000, /* R16641 */ + 0x0000, /* R16642 */ + 0x0000, /* R16643 */ + 0x0000, /* R16644 */ + 0x0000, /* R16645 */ + 0x0000, /* R16646 */ + 0x0000, /* R16647 */ + 0x0000, /* R16648 */ + 0x0000, /* R16649 */ + 0x0000, /* R16650 */ + 0x0000, /* R16651 */ + 0x0000, /* R16652 */ + 0x0000, /* R16653 */ + 0x0000, /* R16654 */ + 0x0000, /* R16655 */ + 0x0000, /* R16656 */ + 0x0000, /* R16657 */ + 0x0000, /* R16658 */ + 0x0000, /* R16659 */ + 0x0000, /* R16660 */ + 0x0000, /* R16661 */ + 0x0000, /* R16662 */ + 0x0000, /* R16663 */ + 0x0000, /* R16664 */ + 0x0000, /* R16665 */ + 0x0000, /* R16666 */ + 0x0000, /* R16667 */ + 0x0000, /* R16668 */ + 0x0000, /* R16669 */ + 0x0000, /* R16670 */ + 0x0000, /* R16671 */ + 0x0000, /* R16672 */ + 0x0000, /* R16673 */ + 0x0000, /* R16674 */ + 0x0000, /* R16675 */ + 0x0000, /* R16676 */ + 0x0000, /* R16677 */ + 0x0000, /* R16678 */ + 0x0000, /* R16679 */ + 0x0000, /* R16680 */ + 0x0000, /* R16681 */ + 0x0000, /* R16682 */ + 0x0000, /* R16683 */ + 0x0000, /* R16684 */ + 0x0000, /* R16685 */ + 0x0000, /* R16686 */ + 0x0000, /* R16687 */ + 0x0000, /* R16688 */ + 0x0000, /* R16689 */ + 0x0000, /* R16690 */ + 0x0000, /* R16691 */ + 0x0000, /* R16692 */ + 0x0000, /* R16693 */ + 0x0000, /* R16694 */ + 0x0000, /* R16695 */ + 0x0000, /* R16696 */ + 0x0000, /* R16697 */ + 0x0000, /* R16698 */ + 0x0000, /* R16699 */ + 0x0000, /* R16700 */ + 0x0000, /* R16701 */ + 0x0000, /* R16702 */ + 0x0000, /* R16703 */ + 0x0000, /* R16704 */ + 0x0000, /* R16705 */ + 0x0000, /* R16706 */ + 0x0000, /* R16707 */ + 0x0000, /* R16708 */ + 0x0000, /* R16709 */ + 0x0000, /* R16710 */ + 0x0000, /* R16711 */ + 0x0000, /* R16712 */ + 0x0000, /* R16713 */ + 0x0000, /* R16714 */ + 0x0000, /* R16715 */ + 0x0000, /* R16716 */ + 0x0000, /* R16717 */ + 0x0000, /* R16718 */ + 0x0000, /* R16719 */ + 0x0000, /* R16720 */ + 0x0000, /* R16721 */ + 0x0000, /* R16722 */ + 0x0000, /* R16723 */ + 0x0000, /* R16724 */ + 0x0000, /* R16725 */ + 0x0000, /* R16726 */ + 0x0000, /* R16727 */ + 0x0000, /* R16728 */ + 0x0000, /* R16729 */ + 0x0000, /* R16730 */ + 0x0000, /* R16731 */ + 0x0000, /* R16732 */ + 0x0000, /* R16733 */ + 0x0000, /* R16734 */ + 0x0000, /* R16735 */ + 0x0000, /* R16736 */ + 0x0000, /* R16737 */ + 0x0000, /* R16738 */ + 0x0000, /* R16739 */ + 0x0000, /* R16740 */ + 0x0000, /* R16741 */ + 0x0000, /* R16742 */ + 0x0000, /* R16743 */ + 0x0000, /* R16744 */ + 0x0000, /* R16745 */ + 0x0000, /* R16746 */ + 0x0000, /* R16747 */ + 0x0000, /* R16748 */ + 0x0000, /* R16749 */ + 0x0000, /* R16750 */ + 0x0000, /* R16751 */ + 0x0000, /* R16752 */ + 0x0000, /* R16753 */ + 0x0000, /* R16754 */ + 0x0000, /* R16755 */ + 0x0000, /* R16756 */ + 0x0000, /* R16757 */ + 0x0000, /* R16758 */ + 0x0000, /* R16759 */ + 0x0000, /* R16760 */ + 0x0000, /* R16761 */ + 0x0000, /* R16762 */ + 0x0000, /* R16763 */ + 0x0000, /* R16764 */ + 0x0000, /* R16765 */ + 0x0000, /* R16766 */ + 0x0000, /* R16767 */ + 0x0000, /* R16768 */ + 0x0000, /* R16769 */ + 0x0000, /* R16770 */ + 0x0000, /* R16771 */ + 0x0000, /* R16772 */ + 0x0000, /* R16773 */ + 0x0000, /* R16774 */ + 0x0000, /* R16775 */ + 0x0000, /* R16776 */ + 0x0000, /* R16777 */ + 0x0000, /* R16778 */ + 0x0000, /* R16779 */ + 0x0000, /* R16780 */ + 0x0000, /* R16781 */ + 0x0000, /* R16782 */ + 0x0000, /* R16783 */ + 0x0000, /* R16784 */ + 0x0000, /* R16785 */ + 0x0000, /* R16786 */ + 0x0000, /* R16787 */ + 0x0000, /* R16788 */ + 0x0000, /* R16789 */ + 0x0000, /* R16790 */ + 0x0000, /* R16791 */ + 0x0000, /* R16792 */ + 0x0000, /* R16793 */ + 0x0000, /* R16794 */ + 0x0000, /* R16795 */ + 0x0000, /* R16796 */ + 0x0000, /* R16797 */ + 0x0000, /* R16798 */ + 0x0000, /* R16799 */ + 0x0000, /* R16800 */ + 0x0000, /* R16801 */ + 0x0000, /* R16802 */ + 0x0000, /* R16803 */ + 0x0000, /* R16804 */ + 0x0000, /* R16805 */ + 0x0000, /* R16806 */ + 0x0000, /* R16807 */ + 0x0000, /* R16808 */ + 0x0000, /* R16809 */ + 0x0000, /* R16810 */ + 0x0000, /* R16811 */ + 0x0000, /* R16812 */ + 0x0000, /* R16813 */ + 0x0000, /* R16814 */ + 0x0000, /* R16815 */ + 0x0000, /* R16816 */ + 0x0000, /* R16817 */ + 0x0000, /* R16818 */ + 0x0000, /* R16819 */ + 0x0000, /* R16820 */ + 0x0000, /* R16821 */ + 0x0000, /* R16822 */ + 0x0000, /* R16823 */ + 0x0000, /* R16824 */ + 0x0000, /* R16825 */ + 0x0000, /* R16826 */ + 0x0000, /* R16827 */ + 0x0000, /* R16828 */ + 0x0000, /* R16829 */ + 0x0000, /* R16830 */ + 0x0000, /* R16831 */ + 0x0000, /* R16832 */ + 0x0000, /* R16833 */ + 0x0000, /* R16834 */ + 0x0000, /* R16835 */ + 0x0000, /* R16836 */ + 0x0000, /* R16837 */ + 0x0000, /* R16838 */ + 0x0000, /* R16839 */ + 0x0000, /* R16840 */ + 0x0000, /* R16841 */ + 0x0000, /* R16842 */ + 0x0000, /* R16843 */ + 0x0000, /* R16844 */ + 0x0000, /* R16845 */ + 0x0000, /* R16846 */ + 0x0000, /* R16847 */ + 0x0000, /* R16848 */ + 0x0000, /* R16849 */ + 0x0000, /* R16850 */ + 0x0000, /* R16851 */ + 0x0000, /* R16852 */ + 0x0000, /* R16853 */ + 0x0000, /* R16854 */ + 0x0000, /* R16855 */ + 0x0000, /* R16856 */ + 0x0000, /* R16857 */ + 0x0000, /* R16858 */ + 0x0000, /* R16859 */ + 0x0000, /* R16860 */ + 0x0000, /* R16861 */ + 0x0000, /* R16862 */ + 0x0000, /* R16863 */ + 0x0000, /* R16864 */ + 0x0000, /* R16865 */ + 0x0000, /* R16866 */ + 0x0000, /* R16867 */ + 0x0000, /* R16868 */ + 0x0000, /* R16869 */ + 0x0000, /* R16870 */ + 0x0000, /* R16871 */ + 0x0000, /* R16872 */ + 0x0000, /* R16873 */ + 0x0000, /* R16874 */ + 0x0000, /* R16875 */ + 0x0000, /* R16876 */ + 0x0000, /* R16877 */ + 0x0000, /* R16878 */ + 0x0000, /* R16879 */ + 0x0000, /* R16880 */ + 0x0000, /* R16881 */ + 0x0000, /* R16882 */ + 0x0000, /* R16883 */ + 0x0000, /* R16884 */ + 0x0000, /* R16885 */ + 0x0000, /* R16886 */ + 0x0000, /* R16887 */ + 0x0000, /* R16888 */ + 0x0000, /* R16889 */ + 0x0000, /* R16890 */ + 0x0000, /* R16891 */ + 0x0000, /* R16892 */ + 0x0000, /* R16893 */ + 0x0000, /* R16894 */ + 0x0000, /* R16895 */ + 0x0002, /* R16896 - HDBASS_AI_1 */ + 0xBD12, /* R16897 - HDBASS_AI_0 */ + 0x007C, /* R16898 - HDBASS_AR_1 */ + 0x586C, /* R16899 - HDBASS_AR_0 */ + 0x0053, /* R16900 - HDBASS_B_1 */ + 0x8121, /* R16901 - HDBASS_B_0 */ + 0x003F, /* R16902 - HDBASS_K_1 */ + 0x8BD8, /* R16903 - HDBASS_K_0 */ + 0x0032, /* R16904 - HDBASS_N1_1 */ + 0xF52D, /* R16905 - HDBASS_N1_0 */ + 0x0065, /* R16906 - HDBASS_N2_1 */ + 0xAC8C, /* R16907 - HDBASS_N2_0 */ + 0x006B, /* R16908 - HDBASS_N3_1 */ + 0xE087, /* R16909 - HDBASS_N3_0 */ + 0x0072, /* R16910 - HDBASS_N4_1 */ + 0x1483, /* R16911 - HDBASS_N4_0 */ + 0x0072, /* R16912 - HDBASS_N5_1 */ + 0x1483, /* R16913 - HDBASS_N5_0 */ + 0x0043, /* R16914 - HDBASS_X1_1 */ + 0x3525, /* R16915 - HDBASS_X1_0 */ + 0x0006, /* R16916 - HDBASS_X2_1 */ + 0x6A4A, /* R16917 - HDBASS_X2_0 */ + 0x0043, /* R16918 - HDBASS_X3_1 */ + 0x6079, /* R16919 - HDBASS_X3_0 */ + 0x0008, /* R16920 - HDBASS_ATK_1 */ + 0x0000, /* R16921 - HDBASS_ATK_0 */ + 0x0001, /* R16922 - HDBASS_DCY_1 */ + 0x0000, /* R16923 - HDBASS_DCY_0 */ + 0x0059, /* R16924 - HDBASS_PG_1 */ + 0x999A, /* R16925 - HDBASS_PG_0 */ + 0x0000, /* R16926 */ + 0x0000, /* R16927 */ + 0x0000, /* R16928 */ + 0x0000, /* R16929 */ + 0x0000, /* R16930 */ + 0x0000, /* R16931 */ + 0x0000, /* R16932 */ + 0x0000, /* R16933 */ + 0x0000, /* R16934 */ + 0x0000, /* R16935 */ + 0x0000, /* R16936 */ + 0x0000, /* R16937 */ + 0x0000, /* R16938 */ + 0x0000, /* R16939 */ + 0x0000, /* R16940 */ + 0x0000, /* R16941 */ + 0x0000, /* R16942 */ + 0x0000, /* R16943 */ + 0x0000, /* R16944 */ + 0x0000, /* R16945 */ + 0x0000, /* R16946 */ + 0x0000, /* R16947 */ + 0x0000, /* R16948 */ + 0x0000, /* R16949 */ + 0x0000, /* R16950 */ + 0x0000, /* R16951 */ + 0x0000, /* R16952 */ + 0x0000, /* R16953 */ + 0x0000, /* R16954 */ + 0x0000, /* R16955 */ + 0x0000, /* R16956 */ + 0x0000, /* R16957 */ + 0x0000, /* R16958 */ + 0x0000, /* R16959 */ + 0x0000, /* R16960 */ + 0x0000, /* R16961 */ + 0x0000, /* R16962 */ + 0x0000, /* R16963 */ + 0x0000, /* R16964 */ + 0x0000, /* R16965 */ + 0x0000, /* R16966 */ + 0x0000, /* R16967 */ + 0x0000, /* R16968 */ + 0x0000, /* R16969 */ + 0x0000, /* R16970 */ + 0x0000, /* R16971 */ + 0x0000, /* R16972 */ + 0x0000, /* R16973 */ + 0x0000, /* R16974 */ + 0x0000, /* R16975 */ + 0x0000, /* R16976 */ + 0x0000, /* R16977 */ + 0x0000, /* R16978 */ + 0x0000, /* R16979 */ + 0x0000, /* R16980 */ + 0x0000, /* R16981 */ + 0x0000, /* R16982 */ + 0x0000, /* R16983 */ + 0x0000, /* R16984 */ + 0x0000, /* R16985 */ + 0x0000, /* R16986 */ + 0x0000, /* R16987 */ + 0x0000, /* R16988 */ + 0x0000, /* R16989 */ + 0x0000, /* R16990 */ + 0x0000, /* R16991 */ + 0x0000, /* R16992 */ + 0x0000, /* R16993 */ + 0x0000, /* R16994 */ + 0x0000, /* R16995 */ + 0x0000, /* R16996 */ + 0x0000, /* R16997 */ + 0x0000, /* R16998 */ + 0x0000, /* R16999 */ + 0x0000, /* R17000 */ + 0x0000, /* R17001 */ + 0x0000, /* R17002 */ + 0x0000, /* R17003 */ + 0x0000, /* R17004 */ + 0x0000, /* R17005 */ + 0x0000, /* R17006 */ + 0x0000, /* R17007 */ + 0x0000, /* R17008 */ + 0x0000, /* R17009 */ + 0x0000, /* R17010 */ + 0x0000, /* R17011 */ + 0x0000, /* R17012 */ + 0x0000, /* R17013 */ + 0x0000, /* R17014 */ + 0x0000, /* R17015 */ + 0x0000, /* R17016 */ + 0x0000, /* R17017 */ + 0x0000, /* R17018 */ + 0x0000, /* R17019 */ + 0x0000, /* R17020 */ + 0x0000, /* R17021 */ + 0x0000, /* R17022 */ + 0x0000, /* R17023 */ + 0x0000, /* R17024 */ + 0x0000, /* R17025 */ + 0x0000, /* R17026 */ + 0x0000, /* R17027 */ + 0x0000, /* R17028 */ + 0x0000, /* R17029 */ + 0x0000, /* R17030 */ + 0x0000, /* R17031 */ + 0x0000, /* R17032 */ + 0x0000, /* R17033 */ + 0x0000, /* R17034 */ + 0x0000, /* R17035 */ + 0x0000, /* R17036 */ + 0x0000, /* R17037 */ + 0x0000, /* R17038 */ + 0x0000, /* R17039 */ + 0x0000, /* R17040 */ + 0x0000, /* R17041 */ + 0x0000, /* R17042 */ + 0x0000, /* R17043 */ + 0x0000, /* R17044 */ + 0x0000, /* R17045 */ + 0x0000, /* R17046 */ + 0x0000, /* R17047 */ + 0x0000, /* R17048 */ + 0x0000, /* R17049 */ + 0x0000, /* R17050 */ + 0x0000, /* R17051 */ + 0x0000, /* R17052 */ + 0x0000, /* R17053 */ + 0x0000, /* R17054 */ + 0x0000, /* R17055 */ + 0x0000, /* R17056 */ + 0x0000, /* R17057 */ + 0x0000, /* R17058 */ + 0x0000, /* R17059 */ + 0x0000, /* R17060 */ + 0x0000, /* R17061 */ + 0x0000, /* R17062 */ + 0x0000, /* R17063 */ + 0x0000, /* R17064 */ + 0x0000, /* R17065 */ + 0x0000, /* R17066 */ + 0x0000, /* R17067 */ + 0x0000, /* R17068 */ + 0x0000, /* R17069 */ + 0x0000, /* R17070 */ + 0x0000, /* R17071 */ + 0x0000, /* R17072 */ + 0x0000, /* R17073 */ + 0x0000, /* R17074 */ + 0x0000, /* R17075 */ + 0x0000, /* R17076 */ + 0x0000, /* R17077 */ + 0x0000, /* R17078 */ + 0x0000, /* R17079 */ + 0x0000, /* R17080 */ + 0x0000, /* R17081 */ + 0x0000, /* R17082 */ + 0x0000, /* R17083 */ + 0x0000, /* R17084 */ + 0x0000, /* R17085 */ + 0x0000, /* R17086 */ + 0x0000, /* R17087 */ + 0x0000, /* R17088 */ + 0x0000, /* R17089 */ + 0x0000, /* R17090 */ + 0x0000, /* R17091 */ + 0x0000, /* R17092 */ + 0x0000, /* R17093 */ + 0x0000, /* R17094 */ + 0x0000, /* R17095 */ + 0x0000, /* R17096 */ + 0x0000, /* R17097 */ + 0x0000, /* R17098 */ + 0x0000, /* R17099 */ + 0x0000, /* R17100 */ + 0x0000, /* R17101 */ + 0x0000, /* R17102 */ + 0x0000, /* R17103 */ + 0x0000, /* R17104 */ + 0x0000, /* R17105 */ + 0x0000, /* R17106 */ + 0x0000, /* R17107 */ + 0x0000, /* R17108 */ + 0x0000, /* R17109 */ + 0x0000, /* R17110 */ + 0x0000, /* R17111 */ + 0x0000, /* R17112 */ + 0x0000, /* R17113 */ + 0x0000, /* R17114 */ + 0x0000, /* R17115 */ + 0x0000, /* R17116 */ + 0x0000, /* R17117 */ + 0x0000, /* R17118 */ + 0x0000, /* R17119 */ + 0x0000, /* R17120 */ + 0x0000, /* R17121 */ + 0x0000, /* R17122 */ + 0x0000, /* R17123 */ + 0x0000, /* R17124 */ + 0x0000, /* R17125 */ + 0x0000, /* R17126 */ + 0x0000, /* R17127 */ + 0x0000, /* R17128 */ + 0x0000, /* R17129 */ + 0x0000, /* R17130 */ + 0x0000, /* R17131 */ + 0x0000, /* R17132 */ + 0x0000, /* R17133 */ + 0x0000, /* R17134 */ + 0x0000, /* R17135 */ + 0x0000, /* R17136 */ + 0x0000, /* R17137 */ + 0x0000, /* R17138 */ + 0x0000, /* R17139 */ + 0x0000, /* R17140 */ + 0x0000, /* R17141 */ + 0x0000, /* R17142 */ + 0x0000, /* R17143 */ + 0x0000, /* R17144 */ + 0x0000, /* R17145 */ + 0x0000, /* R17146 */ + 0x0000, /* R17147 */ + 0x0000, /* R17148 */ + 0x0000, /* R17149 */ + 0x0000, /* R17150 */ + 0x0000, /* R17151 */ + 0x0000, /* R17152 */ + 0x0000, /* R17153 */ + 0x0000, /* R17154 */ + 0x0000, /* R17155 */ + 0x0000, /* R17156 */ + 0x0000, /* R17157 */ + 0x0000, /* R17158 */ + 0x0000, /* R17159 */ + 0x0000, /* R17160 */ + 0x0000, /* R17161 */ + 0x0000, /* R17162 */ + 0x0000, /* R17163 */ + 0x0000, /* R17164 */ + 0x0000, /* R17165 */ + 0x0000, /* R17166 */ + 0x0000, /* R17167 */ + 0x0000, /* R17168 */ + 0x0000, /* R17169 */ + 0x0000, /* R17170 */ + 0x0000, /* R17171 */ + 0x0000, /* R17172 */ + 0x0000, /* R17173 */ + 0x0000, /* R17174 */ + 0x0000, /* R17175 */ + 0x0000, /* R17176 */ + 0x0000, /* R17177 */ + 0x0000, /* R17178 */ + 0x0000, /* R17179 */ + 0x0000, /* R17180 */ + 0x0000, /* R17181 */ + 0x0000, /* R17182 */ + 0x0000, /* R17183 */ + 0x0000, /* R17184 */ + 0x0000, /* R17185 */ + 0x0000, /* R17186 */ + 0x0000, /* R17187 */ + 0x0000, /* R17188 */ + 0x0000, /* R17189 */ + 0x0000, /* R17190 */ + 0x0000, /* R17191 */ + 0x0000, /* R17192 */ + 0x0000, /* R17193 */ + 0x0000, /* R17194 */ + 0x0000, /* R17195 */ + 0x0000, /* R17196 */ + 0x0000, /* R17197 */ + 0x0000, /* R17198 */ + 0x0000, /* R17199 */ + 0x0000, /* R17200 */ + 0x0000, /* R17201 */ + 0x0000, /* R17202 */ + 0x0000, /* R17203 */ + 0x0000, /* R17204 */ + 0x0000, /* R17205 */ + 0x0000, /* R17206 */ + 0x0000, /* R17207 */ + 0x0000, /* R17208 */ + 0x0000, /* R17209 */ + 0x0000, /* R17210 */ + 0x0000, /* R17211 */ + 0x0000, /* R17212 */ + 0x0000, /* R17213 */ + 0x0000, /* R17214 */ + 0x0000, /* R17215 */ + 0x0000, /* R17216 */ + 0x0000, /* R17217 */ + 0x0000, /* R17218 */ + 0x0000, /* R17219 */ + 0x0000, /* R17220 */ + 0x0000, /* R17221 */ + 0x0000, /* R17222 */ + 0x0000, /* R17223 */ + 0x0000, /* R17224 */ + 0x0000, /* R17225 */ + 0x0000, /* R17226 */ + 0x0000, /* R17227 */ + 0x0000, /* R17228 */ + 0x0000, /* R17229 */ + 0x0000, /* R17230 */ + 0x0000, /* R17231 */ + 0x0000, /* R17232 */ + 0x0000, /* R17233 */ + 0x0000, /* R17234 */ + 0x0000, /* R17235 */ + 0x0000, /* R17236 */ + 0x0000, /* R17237 */ + 0x0000, /* R17238 */ + 0x0000, /* R17239 */ + 0x0000, /* R17240 */ + 0x0000, /* R17241 */ + 0x0000, /* R17242 */ + 0x0000, /* R17243 */ + 0x0000, /* R17244 */ + 0x0000, /* R17245 */ + 0x0000, /* R17246 */ + 0x0000, /* R17247 */ + 0x0000, /* R17248 */ + 0x0000, /* R17249 */ + 0x0000, /* R17250 */ + 0x0000, /* R17251 */ + 0x0000, /* R17252 */ + 0x0000, /* R17253 */ + 0x0000, /* R17254 */ + 0x0000, /* R17255 */ + 0x0000, /* R17256 */ + 0x0000, /* R17257 */ + 0x0000, /* R17258 */ + 0x0000, /* R17259 */ + 0x0000, /* R17260 */ + 0x0000, /* R17261 */ + 0x0000, /* R17262 */ + 0x0000, /* R17263 */ + 0x0000, /* R17264 */ + 0x0000, /* R17265 */ + 0x0000, /* R17266 */ + 0x0000, /* R17267 */ + 0x0000, /* R17268 */ + 0x0000, /* R17269 */ + 0x0000, /* R17270 */ + 0x0000, /* R17271 */ + 0x0000, /* R17272 */ + 0x0000, /* R17273 */ + 0x0000, /* R17274 */ + 0x0000, /* R17275 */ + 0x0000, /* R17276 */ + 0x0000, /* R17277 */ + 0x0000, /* R17278 */ + 0x0000, /* R17279 */ + 0x0000, /* R17280 */ + 0x0000, /* R17281 */ + 0x0000, /* R17282 */ + 0x0000, /* R17283 */ + 0x0000, /* R17284 */ + 0x0000, /* R17285 */ + 0x0000, /* R17286 */ + 0x0000, /* R17287 */ + 0x0000, /* R17288 */ + 0x0000, /* R17289 */ + 0x0000, /* R17290 */ + 0x0000, /* R17291 */ + 0x0000, /* R17292 */ + 0x0000, /* R17293 */ + 0x0000, /* R17294 */ + 0x0000, /* R17295 */ + 0x0000, /* R17296 */ + 0x0000, /* R17297 */ + 0x0000, /* R17298 */ + 0x0000, /* R17299 */ + 0x0000, /* R17300 */ + 0x0000, /* R17301 */ + 0x0000, /* R17302 */ + 0x0000, /* R17303 */ + 0x0000, /* R17304 */ + 0x0000, /* R17305 */ + 0x0000, /* R17306 */ + 0x0000, /* R17307 */ + 0x0000, /* R17308 */ + 0x0000, /* R17309 */ + 0x0000, /* R17310 */ + 0x0000, /* R17311 */ + 0x0000, /* R17312 */ + 0x0000, /* R17313 */ + 0x0000, /* R17314 */ + 0x0000, /* R17315 */ + 0x0000, /* R17316 */ + 0x0000, /* R17317 */ + 0x0000, /* R17318 */ + 0x0000, /* R17319 */ + 0x0000, /* R17320 */ + 0x0000, /* R17321 */ + 0x0000, /* R17322 */ + 0x0000, /* R17323 */ + 0x0000, /* R17324 */ + 0x0000, /* R17325 */ + 0x0000, /* R17326 */ + 0x0000, /* R17327 */ + 0x0000, /* R17328 */ + 0x0000, /* R17329 */ + 0x0000, /* R17330 */ + 0x0000, /* R17331 */ + 0x0000, /* R17332 */ + 0x0000, /* R17333 */ + 0x0000, /* R17334 */ + 0x0000, /* R17335 */ + 0x0000, /* R17336 */ + 0x0000, /* R17337 */ + 0x0000, /* R17338 */ + 0x0000, /* R17339 */ + 0x0000, /* R17340 */ + 0x0000, /* R17341 */ + 0x0000, /* R17342 */ + 0x0000, /* R17343 */ + 0x0000, /* R17344 */ + 0x0000, /* R17345 */ + 0x0000, /* R17346 */ + 0x0000, /* R17347 */ + 0x0000, /* R17348 */ + 0x0000, /* R17349 */ + 0x0000, /* R17350 */ + 0x0000, /* R17351 */ + 0x0000, /* R17352 */ + 0x0000, /* R17353 */ + 0x0000, /* R17354 */ + 0x0000, /* R17355 */ + 0x0000, /* R17356 */ + 0x0000, /* R17357 */ + 0x0000, /* R17358 */ + 0x0000, /* R17359 */ + 0x0000, /* R17360 */ + 0x0000, /* R17361 */ + 0x0000, /* R17362 */ + 0x0000, /* R17363 */ + 0x0000, /* R17364 */ + 0x0000, /* R17365 */ + 0x0000, /* R17366 */ + 0x0000, /* R17367 */ + 0x0000, /* R17368 */ + 0x0000, /* R17369 */ + 0x0000, /* R17370 */ + 0x0000, /* R17371 */ + 0x0000, /* R17372 */ + 0x0000, /* R17373 */ + 0x0000, /* R17374 */ + 0x0000, /* R17375 */ + 0x0000, /* R17376 */ + 0x0000, /* R17377 */ + 0x0000, /* R17378 */ + 0x0000, /* R17379 */ + 0x0000, /* R17380 */ + 0x0000, /* R17381 */ + 0x0000, /* R17382 */ + 0x0000, /* R17383 */ + 0x0000, /* R17384 */ + 0x0000, /* R17385 */ + 0x0000, /* R17386 */ + 0x0000, /* R17387 */ + 0x0000, /* R17388 */ + 0x0000, /* R17389 */ + 0x0000, /* R17390 */ + 0x0000, /* R17391 */ + 0x0000, /* R17392 */ + 0x0000, /* R17393 */ + 0x0000, /* R17394 */ + 0x0000, /* R17395 */ + 0x0000, /* R17396 */ + 0x0000, /* R17397 */ + 0x0000, /* R17398 */ + 0x0000, /* R17399 */ + 0x0000, /* R17400 */ + 0x0000, /* R17401 */ + 0x0000, /* R17402 */ + 0x0000, /* R17403 */ + 0x0000, /* R17404 */ + 0x0000, /* R17405 */ + 0x0000, /* R17406 */ + 0x0000, /* R17407 */ + 0x0083, /* R17408 - HPF_C_1 */ + 0x98AD, /* R17409 - HPF_C_0 */ + 0x0000, /* R17410 */ + 0x0000, /* R17411 */ + 0x0000, /* R17412 */ + 0x0000, /* R17413 */ + 0x0000, /* R17414 */ + 0x0000, /* R17415 */ + 0x0000, /* R17416 */ + 0x0000, /* R17417 */ + 0x0000, /* R17418 */ + 0x0000, /* R17419 */ + 0x0000, /* R17420 */ + 0x0000, /* R17421 */ + 0x0000, /* R17422 */ + 0x0000, /* R17423 */ + 0x0000, /* R17424 */ + 0x0000, /* R17425 */ + 0x0000, /* R17426 */ + 0x0000, /* R17427 */ + 0x0000, /* R17428 */ + 0x0000, /* R17429 */ + 0x0000, /* R17430 */ + 0x0000, /* R17431 */ + 0x0000, /* R17432 */ + 0x0000, /* R17433 */ + 0x0000, /* R17434 */ + 0x0000, /* R17435 */ + 0x0000, /* R17436 */ + 0x0000, /* R17437 */ + 0x0000, /* R17438 */ + 0x0000, /* R17439 */ + 0x0000, /* R17440 */ + 0x0000, /* R17441 */ + 0x0000, /* R17442 */ + 0x0000, /* R17443 */ + 0x0000, /* R17444 */ + 0x0000, /* R17445 */ + 0x0000, /* R17446 */ + 0x0000, /* R17447 */ + 0x0000, /* R17448 */ + 0x0000, /* R17449 */ + 0x0000, /* R17450 */ + 0x0000, /* R17451 */ + 0x0000, /* R17452 */ + 0x0000, /* R17453 */ + 0x0000, /* R17454 */ + 0x0000, /* R17455 */ + 0x0000, /* R17456 */ + 0x0000, /* R17457 */ + 0x0000, /* R17458 */ + 0x0000, /* R17459 */ + 0x0000, /* R17460 */ + 0x0000, /* R17461 */ + 0x0000, /* R17462 */ + 0x0000, /* R17463 */ + 0x0000, /* R17464 */ + 0x0000, /* R17465 */ + 0x0000, /* R17466 */ + 0x0000, /* R17467 */ + 0x0000, /* R17468 */ + 0x0000, /* R17469 */ + 0x0000, /* R17470 */ + 0x0000, /* R17471 */ + 0x0000, /* R17472 */ + 0x0000, /* R17473 */ + 0x0000, /* R17474 */ + 0x0000, /* R17475 */ + 0x0000, /* R17476 */ + 0x0000, /* R17477 */ + 0x0000, /* R17478 */ + 0x0000, /* R17479 */ + 0x0000, /* R17480 */ + 0x0000, /* R17481 */ + 0x0000, /* R17482 */ + 0x0000, /* R17483 */ + 0x0000, /* R17484 */ + 0x0000, /* R17485 */ + 0x0000, /* R17486 */ + 0x0000, /* R17487 */ + 0x0000, /* R17488 */ + 0x0000, /* R17489 */ + 0x0000, /* R17490 */ + 0x0000, /* R17491 */ + 0x0000, /* R17492 */ + 0x0000, /* R17493 */ + 0x0000, /* R17494 */ + 0x0000, /* R17495 */ + 0x0000, /* R17496 */ + 0x0000, /* R17497 */ + 0x0000, /* R17498 */ + 0x0000, /* R17499 */ + 0x0000, /* R17500 */ + 0x0000, /* R17501 */ + 0x0000, /* R17502 */ + 0x0000, /* R17503 */ + 0x0000, /* R17504 */ + 0x0000, /* R17505 */ + 0x0000, /* R17506 */ + 0x0000, /* R17507 */ + 0x0000, /* R17508 */ + 0x0000, /* R17509 */ + 0x0000, /* R17510 */ + 0x0000, /* R17511 */ + 0x0000, /* R17512 */ + 0x0000, /* R17513 */ + 0x0000, /* R17514 */ + 0x0000, /* R17515 */ + 0x0000, /* R17516 */ + 0x0000, /* R17517 */ + 0x0000, /* R17518 */ + 0x0000, /* R17519 */ + 0x0000, /* R17520 */ + 0x0000, /* R17521 */ + 0x0000, /* R17522 */ + 0x0000, /* R17523 */ + 0x0000, /* R17524 */ + 0x0000, /* R17525 */ + 0x0000, /* R17526 */ + 0x0000, /* R17527 */ + 0x0000, /* R17528 */ + 0x0000, /* R17529 */ + 0x0000, /* R17530 */ + 0x0000, /* R17531 */ + 0x0000, /* R17532 */ + 0x0000, /* R17533 */ + 0x0000, /* R17534 */ + 0x0000, /* R17535 */ + 0x0000, /* R17536 */ + 0x0000, /* R17537 */ + 0x0000, /* R17538 */ + 0x0000, /* R17539 */ + 0x0000, /* R17540 */ + 0x0000, /* R17541 */ + 0x0000, /* R17542 */ + 0x0000, /* R17543 */ + 0x0000, /* R17544 */ + 0x0000, /* R17545 */ + 0x0000, /* R17546 */ + 0x0000, /* R17547 */ + 0x0000, /* R17548 */ + 0x0000, /* R17549 */ + 0x0000, /* R17550 */ + 0x0000, /* R17551 */ + 0x0000, /* R17552 */ + 0x0000, /* R17553 */ + 0x0000, /* R17554 */ + 0x0000, /* R17555 */ + 0x0000, /* R17556 */ + 0x0000, /* R17557 */ + 0x0000, /* R17558 */ + 0x0000, /* R17559 */ + 0x0000, /* R17560 */ + 0x0000, /* R17561 */ + 0x0000, /* R17562 */ + 0x0000, /* R17563 */ + 0x0000, /* R17564 */ + 0x0000, /* R17565 */ + 0x0000, /* R17566 */ + 0x0000, /* R17567 */ + 0x0000, /* R17568 */ + 0x0000, /* R17569 */ + 0x0000, /* R17570 */ + 0x0000, /* R17571 */ + 0x0000, /* R17572 */ + 0x0000, /* R17573 */ + 0x0000, /* R17574 */ + 0x0000, /* R17575 */ + 0x0000, /* R17576 */ + 0x0000, /* R17577 */ + 0x0000, /* R17578 */ + 0x0000, /* R17579 */ + 0x0000, /* R17580 */ + 0x0000, /* R17581 */ + 0x0000, /* R17582 */ + 0x0000, /* R17583 */ + 0x0000, /* R17584 */ + 0x0000, /* R17585 */ + 0x0000, /* R17586 */ + 0x0000, /* R17587 */ + 0x0000, /* R17588 */ + 0x0000, /* R17589 */ + 0x0000, /* R17590 */ + 0x0000, /* R17591 */ + 0x0000, /* R17592 */ + 0x0000, /* R17593 */ + 0x0000, /* R17594 */ + 0x0000, /* R17595 */ + 0x0000, /* R17596 */ + 0x0000, /* R17597 */ + 0x0000, /* R17598 */ + 0x0000, /* R17599 */ + 0x0000, /* R17600 */ + 0x0000, /* R17601 */ + 0x0000, /* R17602 */ + 0x0000, /* R17603 */ + 0x0000, /* R17604 */ + 0x0000, /* R17605 */ + 0x0000, /* R17606 */ + 0x0000, /* R17607 */ + 0x0000, /* R17608 */ + 0x0000, /* R17609 */ + 0x0000, /* R17610 */ + 0x0000, /* R17611 */ + 0x0000, /* R17612 */ + 0x0000, /* R17613 */ + 0x0000, /* R17614 */ + 0x0000, /* R17615 */ + 0x0000, /* R17616 */ + 0x0000, /* R17617 */ + 0x0000, /* R17618 */ + 0x0000, /* R17619 */ + 0x0000, /* R17620 */ + 0x0000, /* R17621 */ + 0x0000, /* R17622 */ + 0x0000, /* R17623 */ + 0x0000, /* R17624 */ + 0x0000, /* R17625 */ + 0x0000, /* R17626 */ + 0x0000, /* R17627 */ + 0x0000, /* R17628 */ + 0x0000, /* R17629 */ + 0x0000, /* R17630 */ + 0x0000, /* R17631 */ + 0x0000, /* R17632 */ + 0x0000, /* R17633 */ + 0x0000, /* R17634 */ + 0x0000, /* R17635 */ + 0x0000, /* R17636 */ + 0x0000, /* R17637 */ + 0x0000, /* R17638 */ + 0x0000, /* R17639 */ + 0x0000, /* R17640 */ + 0x0000, /* R17641 */ + 0x0000, /* R17642 */ + 0x0000, /* R17643 */ + 0x0000, /* R17644 */ + 0x0000, /* R17645 */ + 0x0000, /* R17646 */ + 0x0000, /* R17647 */ + 0x0000, /* R17648 */ + 0x0000, /* R17649 */ + 0x0000, /* R17650 */ + 0x0000, /* R17651 */ + 0x0000, /* R17652 */ + 0x0000, /* R17653 */ + 0x0000, /* R17654 */ + 0x0000, /* R17655 */ + 0x0000, /* R17656 */ + 0x0000, /* R17657 */ + 0x0000, /* R17658 */ + 0x0000, /* R17659 */ + 0x0000, /* R17660 */ + 0x0000, /* R17661 */ + 0x0000, /* R17662 */ + 0x0000, /* R17663 */ + 0x0000, /* R17664 */ + 0x0000, /* R17665 */ + 0x0000, /* R17666 */ + 0x0000, /* R17667 */ + 0x0000, /* R17668 */ + 0x0000, /* R17669 */ + 0x0000, /* R17670 */ + 0x0000, /* R17671 */ + 0x0000, /* R17672 */ + 0x0000, /* R17673 */ + 0x0000, /* R17674 */ + 0x0000, /* R17675 */ + 0x0000, /* R17676 */ + 0x0000, /* R17677 */ + 0x0000, /* R17678 */ + 0x0000, /* R17679 */ + 0x0000, /* R17680 */ + 0x0000, /* R17681 */ + 0x0000, /* R17682 */ + 0x0000, /* R17683 */ + 0x0000, /* R17684 */ + 0x0000, /* R17685 */ + 0x0000, /* R17686 */ + 0x0000, /* R17687 */ + 0x0000, /* R17688 */ + 0x0000, /* R17689 */ + 0x0000, /* R17690 */ + 0x0000, /* R17691 */ + 0x0000, /* R17692 */ + 0x0000, /* R17693 */ + 0x0000, /* R17694 */ + 0x0000, /* R17695 */ + 0x0000, /* R17696 */ + 0x0000, /* R17697 */ + 0x0000, /* R17698 */ + 0x0000, /* R17699 */ + 0x0000, /* R17700 */ + 0x0000, /* R17701 */ + 0x0000, /* R17702 */ + 0x0000, /* R17703 */ + 0x0000, /* R17704 */ + 0x0000, /* R17705 */ + 0x0000, /* R17706 */ + 0x0000, /* R17707 */ + 0x0000, /* R17708 */ + 0x0000, /* R17709 */ + 0x0000, /* R17710 */ + 0x0000, /* R17711 */ + 0x0000, /* R17712 */ + 0x0000, /* R17713 */ + 0x0000, /* R17714 */ + 0x0000, /* R17715 */ + 0x0000, /* R17716 */ + 0x0000, /* R17717 */ + 0x0000, /* R17718 */ + 0x0000, /* R17719 */ + 0x0000, /* R17720 */ + 0x0000, /* R17721 */ + 0x0000, /* R17722 */ + 0x0000, /* R17723 */ + 0x0000, /* R17724 */ + 0x0000, /* R17725 */ + 0x0000, /* R17726 */ + 0x0000, /* R17727 */ + 0x0000, /* R17728 */ + 0x0000, /* R17729 */ + 0x0000, /* R17730 */ + 0x0000, /* R17731 */ + 0x0000, /* R17732 */ + 0x0000, /* R17733 */ + 0x0000, /* R17734 */ + 0x0000, /* R17735 */ + 0x0000, /* R17736 */ + 0x0000, /* R17737 */ + 0x0000, /* R17738 */ + 0x0000, /* R17739 */ + 0x0000, /* R17740 */ + 0x0000, /* R17741 */ + 0x0000, /* R17742 */ + 0x0000, /* R17743 */ + 0x0000, /* R17744 */ + 0x0000, /* R17745 */ + 0x0000, /* R17746 */ + 0x0000, /* R17747 */ + 0x0000, /* R17748 */ + 0x0000, /* R17749 */ + 0x0000, /* R17750 */ + 0x0000, /* R17751 */ + 0x0000, /* R17752 */ + 0x0000, /* R17753 */ + 0x0000, /* R17754 */ + 0x0000, /* R17755 */ + 0x0000, /* R17756 */ + 0x0000, /* R17757 */ + 0x0000, /* R17758 */ + 0x0000, /* R17759 */ + 0x0000, /* R17760 */ + 0x0000, /* R17761 */ + 0x0000, /* R17762 */ + 0x0000, /* R17763 */ + 0x0000, /* R17764 */ + 0x0000, /* R17765 */ + 0x0000, /* R17766 */ + 0x0000, /* R17767 */ + 0x0000, /* R17768 */ + 0x0000, /* R17769 */ + 0x0000, /* R17770 */ + 0x0000, /* R17771 */ + 0x0000, /* R17772 */ + 0x0000, /* R17773 */ + 0x0000, /* R17774 */ + 0x0000, /* R17775 */ + 0x0000, /* R17776 */ + 0x0000, /* R17777 */ + 0x0000, /* R17778 */ + 0x0000, /* R17779 */ + 0x0000, /* R17780 */ + 0x0000, /* R17781 */ + 0x0000, /* R17782 */ + 0x0000, /* R17783 */ + 0x0000, /* R17784 */ + 0x0000, /* R17785 */ + 0x0000, /* R17786 */ + 0x0000, /* R17787 */ + 0x0000, /* R17788 */ + 0x0000, /* R17789 */ + 0x0000, /* R17790 */ + 0x0000, /* R17791 */ + 0x0000, /* R17792 */ + 0x0000, /* R17793 */ + 0x0000, /* R17794 */ + 0x0000, /* R17795 */ + 0x0000, /* R17796 */ + 0x0000, /* R17797 */ + 0x0000, /* R17798 */ + 0x0000, /* R17799 */ + 0x0000, /* R17800 */ + 0x0000, /* R17801 */ + 0x0000, /* R17802 */ + 0x0000, /* R17803 */ + 0x0000, /* R17804 */ + 0x0000, /* R17805 */ + 0x0000, /* R17806 */ + 0x0000, /* R17807 */ + 0x0000, /* R17808 */ + 0x0000, /* R17809 */ + 0x0000, /* R17810 */ + 0x0000, /* R17811 */ + 0x0000, /* R17812 */ + 0x0000, /* R17813 */ + 0x0000, /* R17814 */ + 0x0000, /* R17815 */ + 0x0000, /* R17816 */ + 0x0000, /* R17817 */ + 0x0000, /* R17818 */ + 0x0000, /* R17819 */ + 0x0000, /* R17820 */ + 0x0000, /* R17821 */ + 0x0000, /* R17822 */ + 0x0000, /* R17823 */ + 0x0000, /* R17824 */ + 0x0000, /* R17825 */ + 0x0000, /* R17826 */ + 0x0000, /* R17827 */ + 0x0000, /* R17828 */ + 0x0000, /* R17829 */ + 0x0000, /* R17830 */ + 0x0000, /* R17831 */ + 0x0000, /* R17832 */ + 0x0000, /* R17833 */ + 0x0000, /* R17834 */ + 0x0000, /* R17835 */ + 0x0000, /* R17836 */ + 0x0000, /* R17837 */ + 0x0000, /* R17838 */ + 0x0000, /* R17839 */ + 0x0000, /* R17840 */ + 0x0000, /* R17841 */ + 0x0000, /* R17842 */ + 0x0000, /* R17843 */ + 0x0000, /* R17844 */ + 0x0000, /* R17845 */ + 0x0000, /* R17846 */ + 0x0000, /* R17847 */ + 0x0000, /* R17848 */ + 0x0000, /* R17849 */ + 0x0000, /* R17850 */ + 0x0000, /* R17851 */ + 0x0000, /* R17852 */ + 0x0000, /* R17853 */ + 0x0000, /* R17854 */ + 0x0000, /* R17855 */ + 0x0000, /* R17856 */ + 0x0000, /* R17857 */ + 0x0000, /* R17858 */ + 0x0000, /* R17859 */ + 0x0000, /* R17860 */ + 0x0000, /* R17861 */ + 0x0000, /* R17862 */ + 0x0000, /* R17863 */ + 0x0000, /* R17864 */ + 0x0000, /* R17865 */ + 0x0000, /* R17866 */ + 0x0000, /* R17867 */ + 0x0000, /* R17868 */ + 0x0000, /* R17869 */ + 0x0000, /* R17870 */ + 0x0000, /* R17871 */ + 0x0000, /* R17872 */ + 0x0000, /* R17873 */ + 0x0000, /* R17874 */ + 0x0000, /* R17875 */ + 0x0000, /* R17876 */ + 0x0000, /* R17877 */ + 0x0000, /* R17878 */ + 0x0000, /* R17879 */ + 0x0000, /* R17880 */ + 0x0000, /* R17881 */ + 0x0000, /* R17882 */ + 0x0000, /* R17883 */ + 0x0000, /* R17884 */ + 0x0000, /* R17885 */ + 0x0000, /* R17886 */ + 0x0000, /* R17887 */ + 0x0000, /* R17888 */ + 0x0000, /* R17889 */ + 0x0000, /* R17890 */ + 0x0000, /* R17891 */ + 0x0000, /* R17892 */ + 0x0000, /* R17893 */ + 0x0000, /* R17894 */ + 0x0000, /* R17895 */ + 0x0000, /* R17896 */ + 0x0000, /* R17897 */ + 0x0000, /* R17898 */ + 0x0000, /* R17899 */ + 0x0000, /* R17900 */ + 0x0000, /* R17901 */ + 0x0000, /* R17902 */ + 0x0000, /* R17903 */ + 0x0000, /* R17904 */ + 0x0000, /* R17905 */ + 0x0000, /* R17906 */ + 0x0000, /* R17907 */ + 0x0000, /* R17908 */ + 0x0000, /* R17909 */ + 0x0000, /* R17910 */ + 0x0000, /* R17911 */ + 0x0000, /* R17912 */ + 0x0000, /* R17913 */ + 0x0000, /* R17914 */ + 0x0000, /* R17915 */ + 0x0000, /* R17916 */ + 0x0000, /* R17917 */ + 0x0000, /* R17918 */ + 0x0000, /* R17919 */ + 0x007F, /* R17920 - ADCL_RETUNE_C1_1 */ + 0xFFFF, /* R17921 - ADCL_RETUNE_C1_0 */ + 0x0000, /* R17922 - ADCL_RETUNE_C2_1 */ + 0x0000, /* R17923 - ADCL_RETUNE_C2_0 */ + 0x0000, /* R17924 - ADCL_RETUNE_C3_1 */ + 0x0000, /* R17925 - ADCL_RETUNE_C3_0 */ + 0x0000, /* R17926 - ADCL_RETUNE_C4_1 */ + 0x0000, /* R17927 - ADCL_RETUNE_C4_0 */ + 0x0000, /* R17928 - ADCL_RETUNE_C5_1 */ + 0x0000, /* R17929 - ADCL_RETUNE_C5_0 */ + 0x0000, /* R17930 - ADCL_RETUNE_C6_1 */ + 0x0000, /* R17931 - ADCL_RETUNE_C6_0 */ + 0x0000, /* R17932 - ADCL_RETUNE_C7_1 */ + 0x0000, /* R17933 - ADCL_RETUNE_C7_0 */ + 0x0000, /* R17934 - ADCL_RETUNE_C8_1 */ + 0x0000, /* R17935 - ADCL_RETUNE_C8_0 */ + 0x0000, /* R17936 - ADCL_RETUNE_C9_1 */ + 0x0000, /* R17937 - ADCL_RETUNE_C9_0 */ + 0x0000, /* R17938 - ADCL_RETUNE_C10_1 */ + 0x0000, /* R17939 - ADCL_RETUNE_C10_0 */ + 0x0000, /* R17940 - ADCL_RETUNE_C11_1 */ + 0x0000, /* R17941 - ADCL_RETUNE_C11_0 */ + 0x0000, /* R17942 - ADCL_RETUNE_C12_1 */ + 0x0000, /* R17943 - ADCL_RETUNE_C12_0 */ + 0x0000, /* R17944 - ADCL_RETUNE_C13_1 */ + 0x0000, /* R17945 - ADCL_RETUNE_C13_0 */ + 0x0000, /* R17946 - ADCL_RETUNE_C14_1 */ + 0x0000, /* R17947 - ADCL_RETUNE_C14_0 */ + 0x0000, /* R17948 - ADCL_RETUNE_C15_1 */ + 0x0000, /* R17949 - ADCL_RETUNE_C15_0 */ + 0x0000, /* R17950 - ADCL_RETUNE_C16_1 */ + 0x0000, /* R17951 - ADCL_RETUNE_C16_0 */ + 0x0000, /* R17952 - ADCL_RETUNE_C17_1 */ + 0x0000, /* R17953 - ADCL_RETUNE_C17_0 */ + 0x0000, /* R17954 - ADCL_RETUNE_C18_1 */ + 0x0000, /* R17955 - ADCL_RETUNE_C18_0 */ + 0x0000, /* R17956 - ADCL_RETUNE_C19_1 */ + 0x0000, /* R17957 - ADCL_RETUNE_C19_0 */ + 0x0000, /* R17958 - ADCL_RETUNE_C20_1 */ + 0x0000, /* R17959 - ADCL_RETUNE_C20_0 */ + 0x0000, /* R17960 - ADCL_RETUNE_C21_1 */ + 0x0000, /* R17961 - ADCL_RETUNE_C21_0 */ + 0x0000, /* R17962 - ADCL_RETUNE_C22_1 */ + 0x0000, /* R17963 - ADCL_RETUNE_C22_0 */ + 0x0000, /* R17964 - ADCL_RETUNE_C23_1 */ + 0x0000, /* R17965 - ADCL_RETUNE_C23_0 */ + 0x0000, /* R17966 - ADCL_RETUNE_C24_1 */ + 0x0000, /* R17967 - ADCL_RETUNE_C24_0 */ + 0x0000, /* R17968 - ADCL_RETUNE_C25_1 */ + 0x0000, /* R17969 - ADCL_RETUNE_C25_0 */ + 0x0000, /* R17970 - ADCL_RETUNE_C26_1 */ + 0x0000, /* R17971 - ADCL_RETUNE_C26_0 */ + 0x0000, /* R17972 - ADCL_RETUNE_C27_1 */ + 0x0000, /* R17973 - ADCL_RETUNE_C27_0 */ + 0x0000, /* R17974 - ADCL_RETUNE_C28_1 */ + 0x0000, /* R17975 - ADCL_RETUNE_C28_0 */ + 0x0000, /* R17976 - ADCL_RETUNE_C29_1 */ + 0x0000, /* R17977 - ADCL_RETUNE_C29_0 */ + 0x0000, /* R17978 - ADCL_RETUNE_C30_1 */ + 0x0000, /* R17979 - ADCL_RETUNE_C30_0 */ + 0x0000, /* R17980 - ADCL_RETUNE_C31_1 */ + 0x0000, /* R17981 - ADCL_RETUNE_C31_0 */ + 0x0000, /* R17982 - ADCL_RETUNE_C32_1 */ + 0x0000, /* R17983 - ADCL_RETUNE_C32_0 */ + 0x0000, /* R17984 */ + 0x0000, /* R17985 */ + 0x0000, /* R17986 */ + 0x0000, /* R17987 */ + 0x0000, /* R17988 */ + 0x0000, /* R17989 */ + 0x0000, /* R17990 */ + 0x0000, /* R17991 */ + 0x0000, /* R17992 */ + 0x0000, /* R17993 */ + 0x0000, /* R17994 */ + 0x0000, /* R17995 */ + 0x0000, /* R17996 */ + 0x0000, /* R17997 */ + 0x0000, /* R17998 */ + 0x0000, /* R17999 */ + 0x0000, /* R18000 */ + 0x0000, /* R18001 */ + 0x0000, /* R18002 */ + 0x0000, /* R18003 */ + 0x0000, /* R18004 */ + 0x0000, /* R18005 */ + 0x0000, /* R18006 */ + 0x0000, /* R18007 */ + 0x0000, /* R18008 */ + 0x0000, /* R18009 */ + 0x0000, /* R18010 */ + 0x0000, /* R18011 */ + 0x0000, /* R18012 */ + 0x0000, /* R18013 */ + 0x0000, /* R18014 */ + 0x0000, /* R18015 */ + 0x0000, /* R18016 */ + 0x0000, /* R18017 */ + 0x0000, /* R18018 */ + 0x0000, /* R18019 */ + 0x0000, /* R18020 */ + 0x0000, /* R18021 */ + 0x0000, /* R18022 */ + 0x0000, /* R18023 */ + 0x0000, /* R18024 */ + 0x0000, /* R18025 */ + 0x0000, /* R18026 */ + 0x0000, /* R18027 */ + 0x0000, /* R18028 */ + 0x0000, /* R18029 */ + 0x0000, /* R18030 */ + 0x0000, /* R18031 */ + 0x0000, /* R18032 */ + 0x0000, /* R18033 */ + 0x0000, /* R18034 */ + 0x0000, /* R18035 */ + 0x0000, /* R18036 */ + 0x0000, /* R18037 */ + 0x0000, /* R18038 */ + 0x0000, /* R18039 */ + 0x0000, /* R18040 */ + 0x0000, /* R18041 */ + 0x0000, /* R18042 */ + 0x0000, /* R18043 */ + 0x0000, /* R18044 */ + 0x0000, /* R18045 */ + 0x0000, /* R18046 */ + 0x0000, /* R18047 */ + 0x0000, /* R18048 */ + 0x0000, /* R18049 */ + 0x0000, /* R18050 */ + 0x0000, /* R18051 */ + 0x0000, /* R18052 */ + 0x0000, /* R18053 */ + 0x0000, /* R18054 */ + 0x0000, /* R18055 */ + 0x0000, /* R18056 */ + 0x0000, /* R18057 */ + 0x0000, /* R18058 */ + 0x0000, /* R18059 */ + 0x0000, /* R18060 */ + 0x0000, /* R18061 */ + 0x0000, /* R18062 */ + 0x0000, /* R18063 */ + 0x0000, /* R18064 */ + 0x0000, /* R18065 */ + 0x0000, /* R18066 */ + 0x0000, /* R18067 */ + 0x0000, /* R18068 */ + 0x0000, /* R18069 */ + 0x0000, /* R18070 */ + 0x0000, /* R18071 */ + 0x0000, /* R18072 */ + 0x0000, /* R18073 */ + 0x0000, /* R18074 */ + 0x0000, /* R18075 */ + 0x0000, /* R18076 */ + 0x0000, /* R18077 */ + 0x0000, /* R18078 */ + 0x0000, /* R18079 */ + 0x0000, /* R18080 */ + 0x0000, /* R18081 */ + 0x0000, /* R18082 */ + 0x0000, /* R18083 */ + 0x0000, /* R18084 */ + 0x0000, /* R18085 */ + 0x0000, /* R18086 */ + 0x0000, /* R18087 */ + 0x0000, /* R18088 */ + 0x0000, /* R18089 */ + 0x0000, /* R18090 */ + 0x0000, /* R18091 */ + 0x0000, /* R18092 */ + 0x0000, /* R18093 */ + 0x0000, /* R18094 */ + 0x0000, /* R18095 */ + 0x0000, /* R18096 */ + 0x0000, /* R18097 */ + 0x0000, /* R18098 */ + 0x0000, /* R18099 */ + 0x0000, /* R18100 */ + 0x0000, /* R18101 */ + 0x0000, /* R18102 */ + 0x0000, /* R18103 */ + 0x0000, /* R18104 */ + 0x0000, /* R18105 */ + 0x0000, /* R18106 */ + 0x0000, /* R18107 */ + 0x0000, /* R18108 */ + 0x0000, /* R18109 */ + 0x0000, /* R18110 */ + 0x0000, /* R18111 */ + 0x0000, /* R18112 */ + 0x0000, /* R18113 */ + 0x0000, /* R18114 */ + 0x0000, /* R18115 */ + 0x0000, /* R18116 */ + 0x0000, /* R18117 */ + 0x0000, /* R18118 */ + 0x0000, /* R18119 */ + 0x0000, /* R18120 */ + 0x0000, /* R18121 */ + 0x0000, /* R18122 */ + 0x0000, /* R18123 */ + 0x0000, /* R18124 */ + 0x0000, /* R18125 */ + 0x0000, /* R18126 */ + 0x0000, /* R18127 */ + 0x0000, /* R18128 */ + 0x0000, /* R18129 */ + 0x0000, /* R18130 */ + 0x0000, /* R18131 */ + 0x0000, /* R18132 */ + 0x0000, /* R18133 */ + 0x0000, /* R18134 */ + 0x0000, /* R18135 */ + 0x0000, /* R18136 */ + 0x0000, /* R18137 */ + 0x0000, /* R18138 */ + 0x0000, /* R18139 */ + 0x0000, /* R18140 */ + 0x0000, /* R18141 */ + 0x0000, /* R18142 */ + 0x0000, /* R18143 */ + 0x0000, /* R18144 */ + 0x0000, /* R18145 */ + 0x0000, /* R18146 */ + 0x0000, /* R18147 */ + 0x0000, /* R18148 */ + 0x0000, /* R18149 */ + 0x0000, /* R18150 */ + 0x0000, /* R18151 */ + 0x0000, /* R18152 */ + 0x0000, /* R18153 */ + 0x0000, /* R18154 */ + 0x0000, /* R18155 */ + 0x0000, /* R18156 */ + 0x0000, /* R18157 */ + 0x0000, /* R18158 */ + 0x0000, /* R18159 */ + 0x0000, /* R18160 */ + 0x0000, /* R18161 */ + 0x0000, /* R18162 */ + 0x0000, /* R18163 */ + 0x0000, /* R18164 */ + 0x0000, /* R18165 */ + 0x0000, /* R18166 */ + 0x0000, /* R18167 */ + 0x0000, /* R18168 */ + 0x0000, /* R18169 */ + 0x0000, /* R18170 */ + 0x0000, /* R18171 */ + 0x0000, /* R18172 */ + 0x0000, /* R18173 */ + 0x0000, /* R18174 */ + 0x0000, /* R18175 */ + 0x0000, /* R18176 */ + 0x0000, /* R18177 */ + 0x0000, /* R18178 */ + 0x0000, /* R18179 */ + 0x0000, /* R18180 */ + 0x0000, /* R18181 */ + 0x0000, /* R18182 */ + 0x0000, /* R18183 */ + 0x0000, /* R18184 */ + 0x0000, /* R18185 */ + 0x0000, /* R18186 */ + 0x0000, /* R18187 */ + 0x0000, /* R18188 */ + 0x0000, /* R18189 */ + 0x0000, /* R18190 */ + 0x0000, /* R18191 */ + 0x0000, /* R18192 */ + 0x0000, /* R18193 */ + 0x0000, /* R18194 */ + 0x0000, /* R18195 */ + 0x0000, /* R18196 */ + 0x0000, /* R18197 */ + 0x0000, /* R18198 */ + 0x0000, /* R18199 */ + 0x0000, /* R18200 */ + 0x0000, /* R18201 */ + 0x0000, /* R18202 */ + 0x0000, /* R18203 */ + 0x0000, /* R18204 */ + 0x0000, /* R18205 */ + 0x0000, /* R18206 */ + 0x0000, /* R18207 */ + 0x0000, /* R18208 */ + 0x0000, /* R18209 */ + 0x0000, /* R18210 */ + 0x0000, /* R18211 */ + 0x0000, /* R18212 */ + 0x0000, /* R18213 */ + 0x0000, /* R18214 */ + 0x0000, /* R18215 */ + 0x0000, /* R18216 */ + 0x0000, /* R18217 */ + 0x0000, /* R18218 */ + 0x0000, /* R18219 */ + 0x0000, /* R18220 */ + 0x0000, /* R18221 */ + 0x0000, /* R18222 */ + 0x0000, /* R18223 */ + 0x0000, /* R18224 */ + 0x0000, /* R18225 */ + 0x0000, /* R18226 */ + 0x0000, /* R18227 */ + 0x0000, /* R18228 */ + 0x0000, /* R18229 */ + 0x0000, /* R18230 */ + 0x0000, /* R18231 */ + 0x0000, /* R18232 */ + 0x0000, /* R18233 */ + 0x0000, /* R18234 */ + 0x0000, /* R18235 */ + 0x0000, /* R18236 */ + 0x0000, /* R18237 */ + 0x0000, /* R18238 */ + 0x0000, /* R18239 */ + 0x0000, /* R18240 */ + 0x0000, /* R18241 */ + 0x0000, /* R18242 */ + 0x0000, /* R18243 */ + 0x0000, /* R18244 */ + 0x0000, /* R18245 */ + 0x0000, /* R18246 */ + 0x0000, /* R18247 */ + 0x0000, /* R18248 */ + 0x0000, /* R18249 */ + 0x0000, /* R18250 */ + 0x0000, /* R18251 */ + 0x0000, /* R18252 */ + 0x0000, /* R18253 */ + 0x0000, /* R18254 */ + 0x0000, /* R18255 */ + 0x0000, /* R18256 */ + 0x0000, /* R18257 */ + 0x0000, /* R18258 */ + 0x0000, /* R18259 */ + 0x0000, /* R18260 */ + 0x0000, /* R18261 */ + 0x0000, /* R18262 */ + 0x0000, /* R18263 */ + 0x0000, /* R18264 */ + 0x0000, /* R18265 */ + 0x0000, /* R18266 */ + 0x0000, /* R18267 */ + 0x0000, /* R18268 */ + 0x0000, /* R18269 */ + 0x0000, /* R18270 */ + 0x0000, /* R18271 */ + 0x0000, /* R18272 */ + 0x0000, /* R18273 */ + 0x0000, /* R18274 */ + 0x0000, /* R18275 */ + 0x0000, /* R18276 */ + 0x0000, /* R18277 */ + 0x0000, /* R18278 */ + 0x0000, /* R18279 */ + 0x0000, /* R18280 */ + 0x0000, /* R18281 */ + 0x0000, /* R18282 */ + 0x0000, /* R18283 */ + 0x0000, /* R18284 */ + 0x0000, /* R18285 */ + 0x0000, /* R18286 */ + 0x0000, /* R18287 */ + 0x0000, /* R18288 */ + 0x0000, /* R18289 */ + 0x0000, /* R18290 */ + 0x0000, /* R18291 */ + 0x0000, /* R18292 */ + 0x0000, /* R18293 */ + 0x0000, /* R18294 */ + 0x0000, /* R18295 */ + 0x0000, /* R18296 */ + 0x0000, /* R18297 */ + 0x0000, /* R18298 */ + 0x0000, /* R18299 */ + 0x0000, /* R18300 */ + 0x0000, /* R18301 */ + 0x0000, /* R18302 */ + 0x0000, /* R18303 */ + 0x0000, /* R18304 */ + 0x0000, /* R18305 */ + 0x0000, /* R18306 */ + 0x0000, /* R18307 */ + 0x0000, /* R18308 */ + 0x0000, /* R18309 */ + 0x0000, /* R18310 */ + 0x0000, /* R18311 */ + 0x0000, /* R18312 */ + 0x0000, /* R18313 */ + 0x0000, /* R18314 */ + 0x0000, /* R18315 */ + 0x0000, /* R18316 */ + 0x0000, /* R18317 */ + 0x0000, /* R18318 */ + 0x0000, /* R18319 */ + 0x0000, /* R18320 */ + 0x0000, /* R18321 */ + 0x0000, /* R18322 */ + 0x0000, /* R18323 */ + 0x0000, /* R18324 */ + 0x0000, /* R18325 */ + 0x0000, /* R18326 */ + 0x0000, /* R18327 */ + 0x0000, /* R18328 */ + 0x0000, /* R18329 */ + 0x0000, /* R18330 */ + 0x0000, /* R18331 */ + 0x0000, /* R18332 */ + 0x0000, /* R18333 */ + 0x0000, /* R18334 */ + 0x0000, /* R18335 */ + 0x0000, /* R18336 */ + 0x0000, /* R18337 */ + 0x0000, /* R18338 */ + 0x0000, /* R18339 */ + 0x0000, /* R18340 */ + 0x0000, /* R18341 */ + 0x0000, /* R18342 */ + 0x0000, /* R18343 */ + 0x0000, /* R18344 */ + 0x0000, /* R18345 */ + 0x0000, /* R18346 */ + 0x0000, /* R18347 */ + 0x0000, /* R18348 */ + 0x0000, /* R18349 */ + 0x0000, /* R18350 */ + 0x0000, /* R18351 */ + 0x0000, /* R18352 */ + 0x0000, /* R18353 */ + 0x0000, /* R18354 */ + 0x0000, /* R18355 */ + 0x0000, /* R18356 */ + 0x0000, /* R18357 */ + 0x0000, /* R18358 */ + 0x0000, /* R18359 */ + 0x0000, /* R18360 */ + 0x0000, /* R18361 */ + 0x0000, /* R18362 */ + 0x0000, /* R18363 */ + 0x0000, /* R18364 */ + 0x0000, /* R18365 */ + 0x0000, /* R18366 */ + 0x0000, /* R18367 */ + 0x0000, /* R18368 */ + 0x0000, /* R18369 */ + 0x0000, /* R18370 */ + 0x0000, /* R18371 */ + 0x0000, /* R18372 */ + 0x0000, /* R18373 */ + 0x0000, /* R18374 */ + 0x0000, /* R18375 */ + 0x0000, /* R18376 */ + 0x0000, /* R18377 */ + 0x0000, /* R18378 */ + 0x0000, /* R18379 */ + 0x0000, /* R18380 */ + 0x0000, /* R18381 */ + 0x0000, /* R18382 */ + 0x0000, /* R18383 */ + 0x0000, /* R18384 */ + 0x0000, /* R18385 */ + 0x0000, /* R18386 */ + 0x0000, /* R18387 */ + 0x0000, /* R18388 */ + 0x0000, /* R18389 */ + 0x0000, /* R18390 */ + 0x0000, /* R18391 */ + 0x0000, /* R18392 */ + 0x0000, /* R18393 */ + 0x0000, /* R18394 */ + 0x0000, /* R18395 */ + 0x0000, /* R18396 */ + 0x0000, /* R18397 */ + 0x0000, /* R18398 */ + 0x0000, /* R18399 */ + 0x0000, /* R18400 */ + 0x0000, /* R18401 */ + 0x0000, /* R18402 */ + 0x0000, /* R18403 */ + 0x0000, /* R18404 */ + 0x0000, /* R18405 */ + 0x0000, /* R18406 */ + 0x0000, /* R18407 */ + 0x0000, /* R18408 */ + 0x0000, /* R18409 */ + 0x0000, /* R18410 */ + 0x0000, /* R18411 */ + 0x0000, /* R18412 */ + 0x0000, /* R18413 */ + 0x0000, /* R18414 */ + 0x0000, /* R18415 */ + 0x0000, /* R18416 */ + 0x0000, /* R18417 */ + 0x0000, /* R18418 */ + 0x0000, /* R18419 */ + 0x0000, /* R18420 */ + 0x0000, /* R18421 */ + 0x0000, /* R18422 */ + 0x0000, /* R18423 */ + 0x0000, /* R18424 */ + 0x0000, /* R18425 */ + 0x0000, /* R18426 */ + 0x0000, /* R18427 */ + 0x0000, /* R18428 */ + 0x0000, /* R18429 */ + 0x0000, /* R18430 */ + 0x0000, /* R18431 */ + 0x0020, /* R18432 - RETUNEADC_PG2_1 */ + 0x0000, /* R18433 - RETUNEADC_PG2_0 */ + 0x0040, /* R18434 - RETUNEADC_PG_1 */ + 0x0000, /* R18435 - RETUNEADC_PG_0 */ + 0x0000, /* R18436 */ + 0x0000, /* R18437 */ + 0x0000, /* R18438 */ + 0x0000, /* R18439 */ + 0x0000, /* R18440 */ + 0x0000, /* R18441 */ + 0x0000, /* R18442 */ + 0x0000, /* R18443 */ + 0x0000, /* R18444 */ + 0x0000, /* R18445 */ + 0x0000, /* R18446 */ + 0x0000, /* R18447 */ + 0x0000, /* R18448 */ + 0x0000, /* R18449 */ + 0x0000, /* R18450 */ + 0x0000, /* R18451 */ + 0x0000, /* R18452 */ + 0x0000, /* R18453 */ + 0x0000, /* R18454 */ + 0x0000, /* R18455 */ + 0x0000, /* R18456 */ + 0x0000, /* R18457 */ + 0x0000, /* R18458 */ + 0x0000, /* R18459 */ + 0x0000, /* R18460 */ + 0x0000, /* R18461 */ + 0x0000, /* R18462 */ + 0x0000, /* R18463 */ + 0x0000, /* R18464 */ + 0x0000, /* R18465 */ + 0x0000, /* R18466 */ + 0x0000, /* R18467 */ + 0x0000, /* R18468 */ + 0x0000, /* R18469 */ + 0x0000, /* R18470 */ + 0x0000, /* R18471 */ + 0x0000, /* R18472 */ + 0x0000, /* R18473 */ + 0x0000, /* R18474 */ + 0x0000, /* R18475 */ + 0x0000, /* R18476 */ + 0x0000, /* R18477 */ + 0x0000, /* R18478 */ + 0x0000, /* R18479 */ + 0x0000, /* R18480 */ + 0x0000, /* R18481 */ + 0x0000, /* R18482 */ + 0x0000, /* R18483 */ + 0x0000, /* R18484 */ + 0x0000, /* R18485 */ + 0x0000, /* R18486 */ + 0x0000, /* R18487 */ + 0x0000, /* R18488 */ + 0x0000, /* R18489 */ + 0x0000, /* R18490 */ + 0x0000, /* R18491 */ + 0x0000, /* R18492 */ + 0x0000, /* R18493 */ + 0x0000, /* R18494 */ + 0x0000, /* R18495 */ + 0x0000, /* R18496 */ + 0x0000, /* R18497 */ + 0x0000, /* R18498 */ + 0x0000, /* R18499 */ + 0x0000, /* R18500 */ + 0x0000, /* R18501 */ + 0x0000, /* R18502 */ + 0x0000, /* R18503 */ + 0x0000, /* R18504 */ + 0x0000, /* R18505 */ + 0x0000, /* R18506 */ + 0x0000, /* R18507 */ + 0x0000, /* R18508 */ + 0x0000, /* R18509 */ + 0x0000, /* R18510 */ + 0x0000, /* R18511 */ + 0x0000, /* R18512 */ + 0x0000, /* R18513 */ + 0x0000, /* R18514 */ + 0x0000, /* R18515 */ + 0x0000, /* R18516 */ + 0x0000, /* R18517 */ + 0x0000, /* R18518 */ + 0x0000, /* R18519 */ + 0x0000, /* R18520 */ + 0x0000, /* R18521 */ + 0x0000, /* R18522 */ + 0x0000, /* R18523 */ + 0x0000, /* R18524 */ + 0x0000, /* R18525 */ + 0x0000, /* R18526 */ + 0x0000, /* R18527 */ + 0x0000, /* R18528 */ + 0x0000, /* R18529 */ + 0x0000, /* R18530 */ + 0x0000, /* R18531 */ + 0x0000, /* R18532 */ + 0x0000, /* R18533 */ + 0x0000, /* R18534 */ + 0x0000, /* R18535 */ + 0x0000, /* R18536 */ + 0x0000, /* R18537 */ + 0x0000, /* R18538 */ + 0x0000, /* R18539 */ + 0x0000, /* R18540 */ + 0x0000, /* R18541 */ + 0x0000, /* R18542 */ + 0x0000, /* R18543 */ + 0x0000, /* R18544 */ + 0x0000, /* R18545 */ + 0x0000, /* R18546 */ + 0x0000, /* R18547 */ + 0x0000, /* R18548 */ + 0x0000, /* R18549 */ + 0x0000, /* R18550 */ + 0x0000, /* R18551 */ + 0x0000, /* R18552 */ + 0x0000, /* R18553 */ + 0x0000, /* R18554 */ + 0x0000, /* R18555 */ + 0x0000, /* R18556 */ + 0x0000, /* R18557 */ + 0x0000, /* R18558 */ + 0x0000, /* R18559 */ + 0x0000, /* R18560 */ + 0x0000, /* R18561 */ + 0x0000, /* R18562 */ + 0x0000, /* R18563 */ + 0x0000, /* R18564 */ + 0x0000, /* R18565 */ + 0x0000, /* R18566 */ + 0x0000, /* R18567 */ + 0x0000, /* R18568 */ + 0x0000, /* R18569 */ + 0x0000, /* R18570 */ + 0x0000, /* R18571 */ + 0x0000, /* R18572 */ + 0x0000, /* R18573 */ + 0x0000, /* R18574 */ + 0x0000, /* R18575 */ + 0x0000, /* R18576 */ + 0x0000, /* R18577 */ + 0x0000, /* R18578 */ + 0x0000, /* R18579 */ + 0x0000, /* R18580 */ + 0x0000, /* R18581 */ + 0x0000, /* R18582 */ + 0x0000, /* R18583 */ + 0x0000, /* R18584 */ + 0x0000, /* R18585 */ + 0x0000, /* R18586 */ + 0x0000, /* R18587 */ + 0x0000, /* R18588 */ + 0x0000, /* R18589 */ + 0x0000, /* R18590 */ + 0x0000, /* R18591 */ + 0x0000, /* R18592 */ + 0x0000, /* R18593 */ + 0x0000, /* R18594 */ + 0x0000, /* R18595 */ + 0x0000, /* R18596 */ + 0x0000, /* R18597 */ + 0x0000, /* R18598 */ + 0x0000, /* R18599 */ + 0x0000, /* R18600 */ + 0x0000, /* R18601 */ + 0x0000, /* R18602 */ + 0x0000, /* R18603 */ + 0x0000, /* R18604 */ + 0x0000, /* R18605 */ + 0x0000, /* R18606 */ + 0x0000, /* R18607 */ + 0x0000, /* R18608 */ + 0x0000, /* R18609 */ + 0x0000, /* R18610 */ + 0x0000, /* R18611 */ + 0x0000, /* R18612 */ + 0x0000, /* R18613 */ + 0x0000, /* R18614 */ + 0x0000, /* R18615 */ + 0x0000, /* R18616 */ + 0x0000, /* R18617 */ + 0x0000, /* R18618 */ + 0x0000, /* R18619 */ + 0x0000, /* R18620 */ + 0x0000, /* R18621 */ + 0x0000, /* R18622 */ + 0x0000, /* R18623 */ + 0x0000, /* R18624 */ + 0x0000, /* R18625 */ + 0x0000, /* R18626 */ + 0x0000, /* R18627 */ + 0x0000, /* R18628 */ + 0x0000, /* R18629 */ + 0x0000, /* R18630 */ + 0x0000, /* R18631 */ + 0x0000, /* R18632 */ + 0x0000, /* R18633 */ + 0x0000, /* R18634 */ + 0x0000, /* R18635 */ + 0x0000, /* R18636 */ + 0x0000, /* R18637 */ + 0x0000, /* R18638 */ + 0x0000, /* R18639 */ + 0x0000, /* R18640 */ + 0x0000, /* R18641 */ + 0x0000, /* R18642 */ + 0x0000, /* R18643 */ + 0x0000, /* R18644 */ + 0x0000, /* R18645 */ + 0x0000, /* R18646 */ + 0x0000, /* R18647 */ + 0x0000, /* R18648 */ + 0x0000, /* R18649 */ + 0x0000, /* R18650 */ + 0x0000, /* R18651 */ + 0x0000, /* R18652 */ + 0x0000, /* R18653 */ + 0x0000, /* R18654 */ + 0x0000, /* R18655 */ + 0x0000, /* R18656 */ + 0x0000, /* R18657 */ + 0x0000, /* R18658 */ + 0x0000, /* R18659 */ + 0x0000, /* R18660 */ + 0x0000, /* R18661 */ + 0x0000, /* R18662 */ + 0x0000, /* R18663 */ + 0x0000, /* R18664 */ + 0x0000, /* R18665 */ + 0x0000, /* R18666 */ + 0x0000, /* R18667 */ + 0x0000, /* R18668 */ + 0x0000, /* R18669 */ + 0x0000, /* R18670 */ + 0x0000, /* R18671 */ + 0x0000, /* R18672 */ + 0x0000, /* R18673 */ + 0x0000, /* R18674 */ + 0x0000, /* R18675 */ + 0x0000, /* R18676 */ + 0x0000, /* R18677 */ + 0x0000, /* R18678 */ + 0x0000, /* R18679 */ + 0x0000, /* R18680 */ + 0x0000, /* R18681 */ + 0x0000, /* R18682 */ + 0x0000, /* R18683 */ + 0x0000, /* R18684 */ + 0x0000, /* R18685 */ + 0x0000, /* R18686 */ + 0x0000, /* R18687 */ + 0x0000, /* R18688 */ + 0x0000, /* R18689 */ + 0x0000, /* R18690 */ + 0x0000, /* R18691 */ + 0x0000, /* R18692 */ + 0x0000, /* R18693 */ + 0x0000, /* R18694 */ + 0x0000, /* R18695 */ + 0x0000, /* R18696 */ + 0x0000, /* R18697 */ + 0x0000, /* R18698 */ + 0x0000, /* R18699 */ + 0x0000, /* R18700 */ + 0x0000, /* R18701 */ + 0x0000, /* R18702 */ + 0x0000, /* R18703 */ + 0x0000, /* R18704 */ + 0x0000, /* R18705 */ + 0x0000, /* R18706 */ + 0x0000, /* R18707 */ + 0x0000, /* R18708 */ + 0x0000, /* R18709 */ + 0x0000, /* R18710 */ + 0x0000, /* R18711 */ + 0x0000, /* R18712 */ + 0x0000, /* R18713 */ + 0x0000, /* R18714 */ + 0x0000, /* R18715 */ + 0x0000, /* R18716 */ + 0x0000, /* R18717 */ + 0x0000, /* R18718 */ + 0x0000, /* R18719 */ + 0x0000, /* R18720 */ + 0x0000, /* R18721 */ + 0x0000, /* R18722 */ + 0x0000, /* R18723 */ + 0x0000, /* R18724 */ + 0x0000, /* R18725 */ + 0x0000, /* R18726 */ + 0x0000, /* R18727 */ + 0x0000, /* R18728 */ + 0x0000, /* R18729 */ + 0x0000, /* R18730 */ + 0x0000, /* R18731 */ + 0x0000, /* R18732 */ + 0x0000, /* R18733 */ + 0x0000, /* R18734 */ + 0x0000, /* R18735 */ + 0x0000, /* R18736 */ + 0x0000, /* R18737 */ + 0x0000, /* R18738 */ + 0x0000, /* R18739 */ + 0x0000, /* R18740 */ + 0x0000, /* R18741 */ + 0x0000, /* R18742 */ + 0x0000, /* R18743 */ + 0x0000, /* R18744 */ + 0x0000, /* R18745 */ + 0x0000, /* R18746 */ + 0x0000, /* R18747 */ + 0x0000, /* R18748 */ + 0x0000, /* R18749 */ + 0x0000, /* R18750 */ + 0x0000, /* R18751 */ + 0x0000, /* R18752 */ + 0x0000, /* R18753 */ + 0x0000, /* R18754 */ + 0x0000, /* R18755 */ + 0x0000, /* R18756 */ + 0x0000, /* R18757 */ + 0x0000, /* R18758 */ + 0x0000, /* R18759 */ + 0x0000, /* R18760 */ + 0x0000, /* R18761 */ + 0x0000, /* R18762 */ + 0x0000, /* R18763 */ + 0x0000, /* R18764 */ + 0x0000, /* R18765 */ + 0x0000, /* R18766 */ + 0x0000, /* R18767 */ + 0x0000, /* R18768 */ + 0x0000, /* R18769 */ + 0x0000, /* R18770 */ + 0x0000, /* R18771 */ + 0x0000, /* R18772 */ + 0x0000, /* R18773 */ + 0x0000, /* R18774 */ + 0x0000, /* R18775 */ + 0x0000, /* R18776 */ + 0x0000, /* R18777 */ + 0x0000, /* R18778 */ + 0x0000, /* R18779 */ + 0x0000, /* R18780 */ + 0x0000, /* R18781 */ + 0x0000, /* R18782 */ + 0x0000, /* R18783 */ + 0x0000, /* R18784 */ + 0x0000, /* R18785 */ + 0x0000, /* R18786 */ + 0x0000, /* R18787 */ + 0x0000, /* R18788 */ + 0x0000, /* R18789 */ + 0x0000, /* R18790 */ + 0x0000, /* R18791 */ + 0x0000, /* R18792 */ + 0x0000, /* R18793 */ + 0x0000, /* R18794 */ + 0x0000, /* R18795 */ + 0x0000, /* R18796 */ + 0x0000, /* R18797 */ + 0x0000, /* R18798 */ + 0x0000, /* R18799 */ + 0x0000, /* R18800 */ + 0x0000, /* R18801 */ + 0x0000, /* R18802 */ + 0x0000, /* R18803 */ + 0x0000, /* R18804 */ + 0x0000, /* R18805 */ + 0x0000, /* R18806 */ + 0x0000, /* R18807 */ + 0x0000, /* R18808 */ + 0x0000, /* R18809 */ + 0x0000, /* R18810 */ + 0x0000, /* R18811 */ + 0x0000, /* R18812 */ + 0x0000, /* R18813 */ + 0x0000, /* R18814 */ + 0x0000, /* R18815 */ + 0x0000, /* R18816 */ + 0x0000, /* R18817 */ + 0x0000, /* R18818 */ + 0x0000, /* R18819 */ + 0x0000, /* R18820 */ + 0x0000, /* R18821 */ + 0x0000, /* R18822 */ + 0x0000, /* R18823 */ + 0x0000, /* R18824 */ + 0x0000, /* R18825 */ + 0x0000, /* R18826 */ + 0x0000, /* R18827 */ + 0x0000, /* R18828 */ + 0x0000, /* R18829 */ + 0x0000, /* R18830 */ + 0x0000, /* R18831 */ + 0x0000, /* R18832 */ + 0x0000, /* R18833 */ + 0x0000, /* R18834 */ + 0x0000, /* R18835 */ + 0x0000, /* R18836 */ + 0x0000, /* R18837 */ + 0x0000, /* R18838 */ + 0x0000, /* R18839 */ + 0x0000, /* R18840 */ + 0x0000, /* R18841 */ + 0x0000, /* R18842 */ + 0x0000, /* R18843 */ + 0x0000, /* R18844 */ + 0x0000, /* R18845 */ + 0x0000, /* R18846 */ + 0x0000, /* R18847 */ + 0x0000, /* R18848 */ + 0x0000, /* R18849 */ + 0x0000, /* R18850 */ + 0x0000, /* R18851 */ + 0x0000, /* R18852 */ + 0x0000, /* R18853 */ + 0x0000, /* R18854 */ + 0x0000, /* R18855 */ + 0x0000, /* R18856 */ + 0x0000, /* R18857 */ + 0x0000, /* R18858 */ + 0x0000, /* R18859 */ + 0x0000, /* R18860 */ + 0x0000, /* R18861 */ + 0x0000, /* R18862 */ + 0x0000, /* R18863 */ + 0x0000, /* R18864 */ + 0x0000, /* R18865 */ + 0x0000, /* R18866 */ + 0x0000, /* R18867 */ + 0x0000, /* R18868 */ + 0x0000, /* R18869 */ + 0x0000, /* R18870 */ + 0x0000, /* R18871 */ + 0x0000, /* R18872 */ + 0x0000, /* R18873 */ + 0x0000, /* R18874 */ + 0x0000, /* R18875 */ + 0x0000, /* R18876 */ + 0x0000, /* R18877 */ + 0x0000, /* R18878 */ + 0x0000, /* R18879 */ + 0x0000, /* R18880 */ + 0x0000, /* R18881 */ + 0x0000, /* R18882 */ + 0x0000, /* R18883 */ + 0x0000, /* R18884 */ + 0x0000, /* R18885 */ + 0x0000, /* R18886 */ + 0x0000, /* R18887 */ + 0x0000, /* R18888 */ + 0x0000, /* R18889 */ + 0x0000, /* R18890 */ + 0x0000, /* R18891 */ + 0x0000, /* R18892 */ + 0x0000, /* R18893 */ + 0x0000, /* R18894 */ + 0x0000, /* R18895 */ + 0x0000, /* R18896 */ + 0x0000, /* R18897 */ + 0x0000, /* R18898 */ + 0x0000, /* R18899 */ + 0x0000, /* R18900 */ + 0x0000, /* R18901 */ + 0x0000, /* R18902 */ + 0x0000, /* R18903 */ + 0x0000, /* R18904 */ + 0x0000, /* R18905 */ + 0x0000, /* R18906 */ + 0x0000, /* R18907 */ + 0x0000, /* R18908 */ + 0x0000, /* R18909 */ + 0x0000, /* R18910 */ + 0x0000, /* R18911 */ + 0x0000, /* R18912 */ + 0x0000, /* R18913 */ + 0x0000, /* R18914 */ + 0x0000, /* R18915 */ + 0x0000, /* R18916 */ + 0x0000, /* R18917 */ + 0x0000, /* R18918 */ + 0x0000, /* R18919 */ + 0x0000, /* R18920 */ + 0x0000, /* R18921 */ + 0x0000, /* R18922 */ + 0x0000, /* R18923 */ + 0x0000, /* R18924 */ + 0x0000, /* R18925 */ + 0x0000, /* R18926 */ + 0x0000, /* R18927 */ + 0x0000, /* R18928 */ + 0x0000, /* R18929 */ + 0x0000, /* R18930 */ + 0x0000, /* R18931 */ + 0x0000, /* R18932 */ + 0x0000, /* R18933 */ + 0x0000, /* R18934 */ + 0x0000, /* R18935 */ + 0x0000, /* R18936 */ + 0x0000, /* R18937 */ + 0x0000, /* R18938 */ + 0x0000, /* R18939 */ + 0x0000, /* R18940 */ + 0x0000, /* R18941 */ + 0x0000, /* R18942 */ + 0x0000, /* R18943 */ + 0x007F, /* R18944 - ADCR_RETUNE_C1_1 */ + 0xFFFF, /* R18945 - ADCR_RETUNE_C1_0 */ + 0x0000, /* R18946 - ADCR_RETUNE_C2_1 */ + 0x0000, /* R18947 - ADCR_RETUNE_C2_0 */ + 0x0000, /* R18948 - ADCR_RETUNE_C3_1 */ + 0x0000, /* R18949 - ADCR_RETUNE_C3_0 */ + 0x0000, /* R18950 - ADCR_RETUNE_C4_1 */ + 0x0000, /* R18951 - ADCR_RETUNE_C4_0 */ + 0x0000, /* R18952 - ADCR_RETUNE_C5_1 */ + 0x0000, /* R18953 - ADCR_RETUNE_C5_0 */ + 0x0000, /* R18954 - ADCR_RETUNE_C6_1 */ + 0x0000, /* R18955 - ADCR_RETUNE_C6_0 */ + 0x0000, /* R18956 - ADCR_RETUNE_C7_1 */ + 0x0000, /* R18957 - ADCR_RETUNE_C7_0 */ + 0x0000, /* R18958 - ADCR_RETUNE_C8_1 */ + 0x0000, /* R18959 - ADCR_RETUNE_C8_0 */ + 0x0000, /* R18960 - ADCR_RETUNE_C9_1 */ + 0x0000, /* R18961 - ADCR_RETUNE_C9_0 */ + 0x0000, /* R18962 - ADCR_RETUNE_C10_1 */ + 0x0000, /* R18963 - ADCR_RETUNE_C10_0 */ + 0x0000, /* R18964 - ADCR_RETUNE_C11_1 */ + 0x0000, /* R18965 - ADCR_RETUNE_C11_0 */ + 0x0000, /* R18966 - ADCR_RETUNE_C12_1 */ + 0x0000, /* R18967 - ADCR_RETUNE_C12_0 */ + 0x0000, /* R18968 - ADCR_RETUNE_C13_1 */ + 0x0000, /* R18969 - ADCR_RETUNE_C13_0 */ + 0x0000, /* R18970 - ADCR_RETUNE_C14_1 */ + 0x0000, /* R18971 - ADCR_RETUNE_C14_0 */ + 0x0000, /* R18972 - ADCR_RETUNE_C15_1 */ + 0x0000, /* R18973 - ADCR_RETUNE_C15_0 */ + 0x0000, /* R18974 - ADCR_RETUNE_C16_1 */ + 0x0000, /* R18975 - ADCR_RETUNE_C16_0 */ + 0x0000, /* R18976 - ADCR_RETUNE_C17_1 */ + 0x0000, /* R18977 - ADCR_RETUNE_C17_0 */ + 0x0000, /* R18978 - ADCR_RETUNE_C18_1 */ + 0x0000, /* R18979 - ADCR_RETUNE_C18_0 */ + 0x0000, /* R18980 - ADCR_RETUNE_C19_1 */ + 0x0000, /* R18981 - ADCR_RETUNE_C19_0 */ + 0x0000, /* R18982 - ADCR_RETUNE_C20_1 */ + 0x0000, /* R18983 - ADCR_RETUNE_C20_0 */ + 0x0000, /* R18984 - ADCR_RETUNE_C21_1 */ + 0x0000, /* R18985 - ADCR_RETUNE_C21_0 */ + 0x0000, /* R18986 - ADCR_RETUNE_C22_1 */ + 0x0000, /* R18987 - ADCR_RETUNE_C22_0 */ + 0x0000, /* R18988 - ADCR_RETUNE_C23_1 */ + 0x0000, /* R18989 - ADCR_RETUNE_C23_0 */ + 0x0000, /* R18990 - ADCR_RETUNE_C24_1 */ + 0x0000, /* R18991 - ADCR_RETUNE_C24_0 */ + 0x0000, /* R18992 - ADCR_RETUNE_C25_1 */ + 0x0000, /* R18993 - ADCR_RETUNE_C25_0 */ + 0x0000, /* R18994 - ADCR_RETUNE_C26_1 */ + 0x0000, /* R18995 - ADCR_RETUNE_C26_0 */ + 0x0000, /* R18996 - ADCR_RETUNE_C27_1 */ + 0x0000, /* R18997 - ADCR_RETUNE_C27_0 */ + 0x0000, /* R18998 - ADCR_RETUNE_C28_1 */ + 0x0000, /* R18999 - ADCR_RETUNE_C28_0 */ + 0x0000, /* R19000 - ADCR_RETUNE_C29_1 */ + 0x0000, /* R19001 - ADCR_RETUNE_C29_0 */ + 0x0000, /* R19002 - ADCR_RETUNE_C30_1 */ + 0x0000, /* R19003 - ADCR_RETUNE_C30_0 */ + 0x0000, /* R19004 - ADCR_RETUNE_C31_1 */ + 0x0000, /* R19005 - ADCR_RETUNE_C31_0 */ + 0x0000, /* R19006 - ADCR_RETUNE_C32_1 */ + 0x0000, /* R19007 - ADCR_RETUNE_C32_0 */ + 0x0000, /* R19008 */ + 0x0000, /* R19009 */ + 0x0000, /* R19010 */ + 0x0000, /* R19011 */ + 0x0000, /* R19012 */ + 0x0000, /* R19013 */ + 0x0000, /* R19014 */ + 0x0000, /* R19015 */ + 0x0000, /* R19016 */ + 0x0000, /* R19017 */ + 0x0000, /* R19018 */ + 0x0000, /* R19019 */ + 0x0000, /* R19020 */ + 0x0000, /* R19021 */ + 0x0000, /* R19022 */ + 0x0000, /* R19023 */ + 0x0000, /* R19024 */ + 0x0000, /* R19025 */ + 0x0000, /* R19026 */ + 0x0000, /* R19027 */ + 0x0000, /* R19028 */ + 0x0000, /* R19029 */ + 0x0000, /* R19030 */ + 0x0000, /* R19031 */ + 0x0000, /* R19032 */ + 0x0000, /* R19033 */ + 0x0000, /* R19034 */ + 0x0000, /* R19035 */ + 0x0000, /* R19036 */ + 0x0000, /* R19037 */ + 0x0000, /* R19038 */ + 0x0000, /* R19039 */ + 0x0000, /* R19040 */ + 0x0000, /* R19041 */ + 0x0000, /* R19042 */ + 0x0000, /* R19043 */ + 0x0000, /* R19044 */ + 0x0000, /* R19045 */ + 0x0000, /* R19046 */ + 0x0000, /* R19047 */ + 0x0000, /* R19048 */ + 0x0000, /* R19049 */ + 0x0000, /* R19050 */ + 0x0000, /* R19051 */ + 0x0000, /* R19052 */ + 0x0000, /* R19053 */ + 0x0000, /* R19054 */ + 0x0000, /* R19055 */ + 0x0000, /* R19056 */ + 0x0000, /* R19057 */ + 0x0000, /* R19058 */ + 0x0000, /* R19059 */ + 0x0000, /* R19060 */ + 0x0000, /* R19061 */ + 0x0000, /* R19062 */ + 0x0000, /* R19063 */ + 0x0000, /* R19064 */ + 0x0000, /* R19065 */ + 0x0000, /* R19066 */ + 0x0000, /* R19067 */ + 0x0000, /* R19068 */ + 0x0000, /* R19069 */ + 0x0000, /* R19070 */ + 0x0000, /* R19071 */ + 0x0000, /* R19072 */ + 0x0000, /* R19073 */ + 0x0000, /* R19074 */ + 0x0000, /* R19075 */ + 0x0000, /* R19076 */ + 0x0000, /* R19077 */ + 0x0000, /* R19078 */ + 0x0000, /* R19079 */ + 0x0000, /* R19080 */ + 0x0000, /* R19081 */ + 0x0000, /* R19082 */ + 0x0000, /* R19083 */ + 0x0000, /* R19084 */ + 0x0000, /* R19085 */ + 0x0000, /* R19086 */ + 0x0000, /* R19087 */ + 0x0000, /* R19088 */ + 0x0000, /* R19089 */ + 0x0000, /* R19090 */ + 0x0000, /* R19091 */ + 0x0000, /* R19092 */ + 0x0000, /* R19093 */ + 0x0000, /* R19094 */ + 0x0000, /* R19095 */ + 0x0000, /* R19096 */ + 0x0000, /* R19097 */ + 0x0000, /* R19098 */ + 0x0000, /* R19099 */ + 0x0000, /* R19100 */ + 0x0000, /* R19101 */ + 0x0000, /* R19102 */ + 0x0000, /* R19103 */ + 0x0000, /* R19104 */ + 0x0000, /* R19105 */ + 0x0000, /* R19106 */ + 0x0000, /* R19107 */ + 0x0000, /* R19108 */ + 0x0000, /* R19109 */ + 0x0000, /* R19110 */ + 0x0000, /* R19111 */ + 0x0000, /* R19112 */ + 0x0000, /* R19113 */ + 0x0000, /* R19114 */ + 0x0000, /* R19115 */ + 0x0000, /* R19116 */ + 0x0000, /* R19117 */ + 0x0000, /* R19118 */ + 0x0000, /* R19119 */ + 0x0000, /* R19120 */ + 0x0000, /* R19121 */ + 0x0000, /* R19122 */ + 0x0000, /* R19123 */ + 0x0000, /* R19124 */ + 0x0000, /* R19125 */ + 0x0000, /* R19126 */ + 0x0000, /* R19127 */ + 0x0000, /* R19128 */ + 0x0000, /* R19129 */ + 0x0000, /* R19130 */ + 0x0000, /* R19131 */ + 0x0000, /* R19132 */ + 0x0000, /* R19133 */ + 0x0000, /* R19134 */ + 0x0000, /* R19135 */ + 0x0000, /* R19136 */ + 0x0000, /* R19137 */ + 0x0000, /* R19138 */ + 0x0000, /* R19139 */ + 0x0000, /* R19140 */ + 0x0000, /* R19141 */ + 0x0000, /* R19142 */ + 0x0000, /* R19143 */ + 0x0000, /* R19144 */ + 0x0000, /* R19145 */ + 0x0000, /* R19146 */ + 0x0000, /* R19147 */ + 0x0000, /* R19148 */ + 0x0000, /* R19149 */ + 0x0000, /* R19150 */ + 0x0000, /* R19151 */ + 0x0000, /* R19152 */ + 0x0000, /* R19153 */ + 0x0000, /* R19154 */ + 0x0000, /* R19155 */ + 0x0000, /* R19156 */ + 0x0000, /* R19157 */ + 0x0000, /* R19158 */ + 0x0000, /* R19159 */ + 0x0000, /* R19160 */ + 0x0000, /* R19161 */ + 0x0000, /* R19162 */ + 0x0000, /* R19163 */ + 0x0000, /* R19164 */ + 0x0000, /* R19165 */ + 0x0000, /* R19166 */ + 0x0000, /* R19167 */ + 0x0000, /* R19168 */ + 0x0000, /* R19169 */ + 0x0000, /* R19170 */ + 0x0000, /* R19171 */ + 0x0000, /* R19172 */ + 0x0000, /* R19173 */ + 0x0000, /* R19174 */ + 0x0000, /* R19175 */ + 0x0000, /* R19176 */ + 0x0000, /* R19177 */ + 0x0000, /* R19178 */ + 0x0000, /* R19179 */ + 0x0000, /* R19180 */ + 0x0000, /* R19181 */ + 0x0000, /* R19182 */ + 0x0000, /* R19183 */ + 0x0000, /* R19184 */ + 0x0000, /* R19185 */ + 0x0000, /* R19186 */ + 0x0000, /* R19187 */ + 0x0000, /* R19188 */ + 0x0000, /* R19189 */ + 0x0000, /* R19190 */ + 0x0000, /* R19191 */ + 0x0000, /* R19192 */ + 0x0000, /* R19193 */ + 0x0000, /* R19194 */ + 0x0000, /* R19195 */ + 0x0000, /* R19196 */ + 0x0000, /* R19197 */ + 0x0000, /* R19198 */ + 0x0000, /* R19199 */ + 0x0000, /* R19200 */ + 0x0000, /* R19201 */ + 0x0000, /* R19202 */ + 0x0000, /* R19203 */ + 0x0000, /* R19204 */ + 0x0000, /* R19205 */ + 0x0000, /* R19206 */ + 0x0000, /* R19207 */ + 0x0000, /* R19208 */ + 0x0000, /* R19209 */ + 0x0000, /* R19210 */ + 0x0000, /* R19211 */ + 0x0000, /* R19212 */ + 0x0000, /* R19213 */ + 0x0000, /* R19214 */ + 0x0000, /* R19215 */ + 0x0000, /* R19216 */ + 0x0000, /* R19217 */ + 0x0000, /* R19218 */ + 0x0000, /* R19219 */ + 0x0000, /* R19220 */ + 0x0000, /* R19221 */ + 0x0000, /* R19222 */ + 0x0000, /* R19223 */ + 0x0000, /* R19224 */ + 0x0000, /* R19225 */ + 0x0000, /* R19226 */ + 0x0000, /* R19227 */ + 0x0000, /* R19228 */ + 0x0000, /* R19229 */ + 0x0000, /* R19230 */ + 0x0000, /* R19231 */ + 0x0000, /* R19232 */ + 0x0000, /* R19233 */ + 0x0000, /* R19234 */ + 0x0000, /* R19235 */ + 0x0000, /* R19236 */ + 0x0000, /* R19237 */ + 0x0000, /* R19238 */ + 0x0000, /* R19239 */ + 0x0000, /* R19240 */ + 0x0000, /* R19241 */ + 0x0000, /* R19242 */ + 0x0000, /* R19243 */ + 0x0000, /* R19244 */ + 0x0000, /* R19245 */ + 0x0000, /* R19246 */ + 0x0000, /* R19247 */ + 0x0000, /* R19248 */ + 0x0000, /* R19249 */ + 0x0000, /* R19250 */ + 0x0000, /* R19251 */ + 0x0000, /* R19252 */ + 0x0000, /* R19253 */ + 0x0000, /* R19254 */ + 0x0000, /* R19255 */ + 0x0000, /* R19256 */ + 0x0000, /* R19257 */ + 0x0000, /* R19258 */ + 0x0000, /* R19259 */ + 0x0000, /* R19260 */ + 0x0000, /* R19261 */ + 0x0000, /* R19262 */ + 0x0000, /* R19263 */ + 0x0000, /* R19264 */ + 0x0000, /* R19265 */ + 0x0000, /* R19266 */ + 0x0000, /* R19267 */ + 0x0000, /* R19268 */ + 0x0000, /* R19269 */ + 0x0000, /* R19270 */ + 0x0000, /* R19271 */ + 0x0000, /* R19272 */ + 0x0000, /* R19273 */ + 0x0000, /* R19274 */ + 0x0000, /* R19275 */ + 0x0000, /* R19276 */ + 0x0000, /* R19277 */ + 0x0000, /* R19278 */ + 0x0000, /* R19279 */ + 0x0000, /* R19280 */ + 0x0000, /* R19281 */ + 0x0000, /* R19282 */ + 0x0000, /* R19283 */ + 0x0000, /* R19284 */ + 0x0000, /* R19285 */ + 0x0000, /* R19286 */ + 0x0000, /* R19287 */ + 0x0000, /* R19288 */ + 0x0000, /* R19289 */ + 0x0000, /* R19290 */ + 0x0000, /* R19291 */ + 0x0000, /* R19292 */ + 0x0000, /* R19293 */ + 0x0000, /* R19294 */ + 0x0000, /* R19295 */ + 0x0000, /* R19296 */ + 0x0000, /* R19297 */ + 0x0000, /* R19298 */ + 0x0000, /* R19299 */ + 0x0000, /* R19300 */ + 0x0000, /* R19301 */ + 0x0000, /* R19302 */ + 0x0000, /* R19303 */ + 0x0000, /* R19304 */ + 0x0000, /* R19305 */ + 0x0000, /* R19306 */ + 0x0000, /* R19307 */ + 0x0000, /* R19308 */ + 0x0000, /* R19309 */ + 0x0000, /* R19310 */ + 0x0000, /* R19311 */ + 0x0000, /* R19312 */ + 0x0000, /* R19313 */ + 0x0000, /* R19314 */ + 0x0000, /* R19315 */ + 0x0000, /* R19316 */ + 0x0000, /* R19317 */ + 0x0000, /* R19318 */ + 0x0000, /* R19319 */ + 0x0000, /* R19320 */ + 0x0000, /* R19321 */ + 0x0000, /* R19322 */ + 0x0000, /* R19323 */ + 0x0000, /* R19324 */ + 0x0000, /* R19325 */ + 0x0000, /* R19326 */ + 0x0000, /* R19327 */ + 0x0000, /* R19328 */ + 0x0000, /* R19329 */ + 0x0000, /* R19330 */ + 0x0000, /* R19331 */ + 0x0000, /* R19332 */ + 0x0000, /* R19333 */ + 0x0000, /* R19334 */ + 0x0000, /* R19335 */ + 0x0000, /* R19336 */ + 0x0000, /* R19337 */ + 0x0000, /* R19338 */ + 0x0000, /* R19339 */ + 0x0000, /* R19340 */ + 0x0000, /* R19341 */ + 0x0000, /* R19342 */ + 0x0000, /* R19343 */ + 0x0000, /* R19344 */ + 0x0000, /* R19345 */ + 0x0000, /* R19346 */ + 0x0000, /* R19347 */ + 0x0000, /* R19348 */ + 0x0000, /* R19349 */ + 0x0000, /* R19350 */ + 0x0000, /* R19351 */ + 0x0000, /* R19352 */ + 0x0000, /* R19353 */ + 0x0000, /* R19354 */ + 0x0000, /* R19355 */ + 0x0000, /* R19356 */ + 0x0000, /* R19357 */ + 0x0000, /* R19358 */ + 0x0000, /* R19359 */ + 0x0000, /* R19360 */ + 0x0000, /* R19361 */ + 0x0000, /* R19362 */ + 0x0000, /* R19363 */ + 0x0000, /* R19364 */ + 0x0000, /* R19365 */ + 0x0000, /* R19366 */ + 0x0000, /* R19367 */ + 0x0000, /* R19368 */ + 0x0000, /* R19369 */ + 0x0000, /* R19370 */ + 0x0000, /* R19371 */ + 0x0000, /* R19372 */ + 0x0000, /* R19373 */ + 0x0000, /* R19374 */ + 0x0000, /* R19375 */ + 0x0000, /* R19376 */ + 0x0000, /* R19377 */ + 0x0000, /* R19378 */ + 0x0000, /* R19379 */ + 0x0000, /* R19380 */ + 0x0000, /* R19381 */ + 0x0000, /* R19382 */ + 0x0000, /* R19383 */ + 0x0000, /* R19384 */ + 0x0000, /* R19385 */ + 0x0000, /* R19386 */ + 0x0000, /* R19387 */ + 0x0000, /* R19388 */ + 0x0000, /* R19389 */ + 0x0000, /* R19390 */ + 0x0000, /* R19391 */ + 0x0000, /* R19392 */ + 0x0000, /* R19393 */ + 0x0000, /* R19394 */ + 0x0000, /* R19395 */ + 0x0000, /* R19396 */ + 0x0000, /* R19397 */ + 0x0000, /* R19398 */ + 0x0000, /* R19399 */ + 0x0000, /* R19400 */ + 0x0000, /* R19401 */ + 0x0000, /* R19402 */ + 0x0000, /* R19403 */ + 0x0000, /* R19404 */ + 0x0000, /* R19405 */ + 0x0000, /* R19406 */ + 0x0000, /* R19407 */ + 0x0000, /* R19408 */ + 0x0000, /* R19409 */ + 0x0000, /* R19410 */ + 0x0000, /* R19411 */ + 0x0000, /* R19412 */ + 0x0000, /* R19413 */ + 0x0000, /* R19414 */ + 0x0000, /* R19415 */ + 0x0000, /* R19416 */ + 0x0000, /* R19417 */ + 0x0000, /* R19418 */ + 0x0000, /* R19419 */ + 0x0000, /* R19420 */ + 0x0000, /* R19421 */ + 0x0000, /* R19422 */ + 0x0000, /* R19423 */ + 0x0000, /* R19424 */ + 0x0000, /* R19425 */ + 0x0000, /* R19426 */ + 0x0000, /* R19427 */ + 0x0000, /* R19428 */ + 0x0000, /* R19429 */ + 0x0000, /* R19430 */ + 0x0000, /* R19431 */ + 0x0000, /* R19432 */ + 0x0000, /* R19433 */ + 0x0000, /* R19434 */ + 0x0000, /* R19435 */ + 0x0000, /* R19436 */ + 0x0000, /* R19437 */ + 0x0000, /* R19438 */ + 0x0000, /* R19439 */ + 0x0000, /* R19440 */ + 0x0000, /* R19441 */ + 0x0000, /* R19442 */ + 0x0000, /* R19443 */ + 0x0000, /* R19444 */ + 0x0000, /* R19445 */ + 0x0000, /* R19446 */ + 0x0000, /* R19447 */ + 0x0000, /* R19448 */ + 0x0000, /* R19449 */ + 0x0000, /* R19450 */ + 0x0000, /* R19451 */ + 0x0000, /* R19452 */ + 0x0000, /* R19453 */ + 0x0000, /* R19454 */ + 0x0000, /* R19455 */ + 0x007F, /* R19456 - DACL_RETUNE_C1_1 */ + 0xFFFF, /* R19457 - DACL_RETUNE_C1_0 */ + 0x0000, /* R19458 - DACL_RETUNE_C2_1 */ + 0x0000, /* R19459 - DACL_RETUNE_C2_0 */ + 0x0000, /* R19460 - DACL_RETUNE_C3_1 */ + 0x0000, /* R19461 - DACL_RETUNE_C3_0 */ + 0x0000, /* R19462 - DACL_RETUNE_C4_1 */ + 0x0000, /* R19463 - DACL_RETUNE_C4_0 */ + 0x0000, /* R19464 - DACL_RETUNE_C5_1 */ + 0x0000, /* R19465 - DACL_RETUNE_C5_0 */ + 0x0000, /* R19466 - DACL_RETUNE_C6_1 */ + 0x0000, /* R19467 - DACL_RETUNE_C6_0 */ + 0x0000, /* R19468 - DACL_RETUNE_C7_1 */ + 0x0000, /* R19469 - DACL_RETUNE_C7_0 */ + 0x0000, /* R19470 - DACL_RETUNE_C8_1 */ + 0x0000, /* R19471 - DACL_RETUNE_C8_0 */ + 0x0000, /* R19472 - DACL_RETUNE_C9_1 */ + 0x0000, /* R19473 - DACL_RETUNE_C9_0 */ + 0x0000, /* R19474 - DACL_RETUNE_C10_1 */ + 0x0000, /* R19475 - DACL_RETUNE_C10_0 */ + 0x0000, /* R19476 - DACL_RETUNE_C11_1 */ + 0x0000, /* R19477 - DACL_RETUNE_C11_0 */ + 0x0000, /* R19478 - DACL_RETUNE_C12_1 */ + 0x0000, /* R19479 - DACL_RETUNE_C12_0 */ + 0x0000, /* R19480 - DACL_RETUNE_C13_1 */ + 0x0000, /* R19481 - DACL_RETUNE_C13_0 */ + 0x0000, /* R19482 - DACL_RETUNE_C14_1 */ + 0x0000, /* R19483 - DACL_RETUNE_C14_0 */ + 0x0000, /* R19484 - DACL_RETUNE_C15_1 */ + 0x0000, /* R19485 - DACL_RETUNE_C15_0 */ + 0x0000, /* R19486 - DACL_RETUNE_C16_1 */ + 0x0000, /* R19487 - DACL_RETUNE_C16_0 */ + 0x0000, /* R19488 - DACL_RETUNE_C17_1 */ + 0x0000, /* R19489 - DACL_RETUNE_C17_0 */ + 0x0000, /* R19490 - DACL_RETUNE_C18_1 */ + 0x0000, /* R19491 - DACL_RETUNE_C18_0 */ + 0x0000, /* R19492 - DACL_RETUNE_C19_1 */ + 0x0000, /* R19493 - DACL_RETUNE_C19_0 */ + 0x0000, /* R19494 - DACL_RETUNE_C20_1 */ + 0x0000, /* R19495 - DACL_RETUNE_C20_0 */ + 0x0000, /* R19496 - DACL_RETUNE_C21_1 */ + 0x0000, /* R19497 - DACL_RETUNE_C21_0 */ + 0x0000, /* R19498 - DACL_RETUNE_C22_1 */ + 0x0000, /* R19499 - DACL_RETUNE_C22_0 */ + 0x0000, /* R19500 - DACL_RETUNE_C23_1 */ + 0x0000, /* R19501 - DACL_RETUNE_C23_0 */ + 0x0000, /* R19502 - DACL_RETUNE_C24_1 */ + 0x0000, /* R19503 - DACL_RETUNE_C24_0 */ + 0x0000, /* R19504 - DACL_RETUNE_C25_1 */ + 0x0000, /* R19505 - DACL_RETUNE_C25_0 */ + 0x0000, /* R19506 - DACL_RETUNE_C26_1 */ + 0x0000, /* R19507 - DACL_RETUNE_C26_0 */ + 0x0000, /* R19508 - DACL_RETUNE_C27_1 */ + 0x0000, /* R19509 - DACL_RETUNE_C27_0 */ + 0x0000, /* R19510 - DACL_RETUNE_C28_1 */ + 0x0000, /* R19511 - DACL_RETUNE_C28_0 */ + 0x0000, /* R19512 - DACL_RETUNE_C29_1 */ + 0x0000, /* R19513 - DACL_RETUNE_C29_0 */ + 0x0000, /* R19514 - DACL_RETUNE_C30_1 */ + 0x0000, /* R19515 - DACL_RETUNE_C30_0 */ + 0x0000, /* R19516 - DACL_RETUNE_C31_1 */ + 0x0000, /* R19517 - DACL_RETUNE_C31_0 */ + 0x0000, /* R19518 - DACL_RETUNE_C32_1 */ + 0x0000, /* R19519 - DACL_RETUNE_C32_0 */ + 0x0000, /* R19520 */ + 0x0000, /* R19521 */ + 0x0000, /* R19522 */ + 0x0000, /* R19523 */ + 0x0000, /* R19524 */ + 0x0000, /* R19525 */ + 0x0000, /* R19526 */ + 0x0000, /* R19527 */ + 0x0000, /* R19528 */ + 0x0000, /* R19529 */ + 0x0000, /* R19530 */ + 0x0000, /* R19531 */ + 0x0000, /* R19532 */ + 0x0000, /* R19533 */ + 0x0000, /* R19534 */ + 0x0000, /* R19535 */ + 0x0000, /* R19536 */ + 0x0000, /* R19537 */ + 0x0000, /* R19538 */ + 0x0000, /* R19539 */ + 0x0000, /* R19540 */ + 0x0000, /* R19541 */ + 0x0000, /* R19542 */ + 0x0000, /* R19543 */ + 0x0000, /* R19544 */ + 0x0000, /* R19545 */ + 0x0000, /* R19546 */ + 0x0000, /* R19547 */ + 0x0000, /* R19548 */ + 0x0000, /* R19549 */ + 0x0000, /* R19550 */ + 0x0000, /* R19551 */ + 0x0000, /* R19552 */ + 0x0000, /* R19553 */ + 0x0000, /* R19554 */ + 0x0000, /* R19555 */ + 0x0000, /* R19556 */ + 0x0000, /* R19557 */ + 0x0000, /* R19558 */ + 0x0000, /* R19559 */ + 0x0000, /* R19560 */ + 0x0000, /* R19561 */ + 0x0000, /* R19562 */ + 0x0000, /* R19563 */ + 0x0000, /* R19564 */ + 0x0000, /* R19565 */ + 0x0000, /* R19566 */ + 0x0000, /* R19567 */ + 0x0000, /* R19568 */ + 0x0000, /* R19569 */ + 0x0000, /* R19570 */ + 0x0000, /* R19571 */ + 0x0000, /* R19572 */ + 0x0000, /* R19573 */ + 0x0000, /* R19574 */ + 0x0000, /* R19575 */ + 0x0000, /* R19576 */ + 0x0000, /* R19577 */ + 0x0000, /* R19578 */ + 0x0000, /* R19579 */ + 0x0000, /* R19580 */ + 0x0000, /* R19581 */ + 0x0000, /* R19582 */ + 0x0000, /* R19583 */ + 0x0000, /* R19584 */ + 0x0000, /* R19585 */ + 0x0000, /* R19586 */ + 0x0000, /* R19587 */ + 0x0000, /* R19588 */ + 0x0000, /* R19589 */ + 0x0000, /* R19590 */ + 0x0000, /* R19591 */ + 0x0000, /* R19592 */ + 0x0000, /* R19593 */ + 0x0000, /* R19594 */ + 0x0000, /* R19595 */ + 0x0000, /* R19596 */ + 0x0000, /* R19597 */ + 0x0000, /* R19598 */ + 0x0000, /* R19599 */ + 0x0000, /* R19600 */ + 0x0000, /* R19601 */ + 0x0000, /* R19602 */ + 0x0000, /* R19603 */ + 0x0000, /* R19604 */ + 0x0000, /* R19605 */ + 0x0000, /* R19606 */ + 0x0000, /* R19607 */ + 0x0000, /* R19608 */ + 0x0000, /* R19609 */ + 0x0000, /* R19610 */ + 0x0000, /* R19611 */ + 0x0000, /* R19612 */ + 0x0000, /* R19613 */ + 0x0000, /* R19614 */ + 0x0000, /* R19615 */ + 0x0000, /* R19616 */ + 0x0000, /* R19617 */ + 0x0000, /* R19618 */ + 0x0000, /* R19619 */ + 0x0000, /* R19620 */ + 0x0000, /* R19621 */ + 0x0000, /* R19622 */ + 0x0000, /* R19623 */ + 0x0000, /* R19624 */ + 0x0000, /* R19625 */ + 0x0000, /* R19626 */ + 0x0000, /* R19627 */ + 0x0000, /* R19628 */ + 0x0000, /* R19629 */ + 0x0000, /* R19630 */ + 0x0000, /* R19631 */ + 0x0000, /* R19632 */ + 0x0000, /* R19633 */ + 0x0000, /* R19634 */ + 0x0000, /* R19635 */ + 0x0000, /* R19636 */ + 0x0000, /* R19637 */ + 0x0000, /* R19638 */ + 0x0000, /* R19639 */ + 0x0000, /* R19640 */ + 0x0000, /* R19641 */ + 0x0000, /* R19642 */ + 0x0000, /* R19643 */ + 0x0000, /* R19644 */ + 0x0000, /* R19645 */ + 0x0000, /* R19646 */ + 0x0000, /* R19647 */ + 0x0000, /* R19648 */ + 0x0000, /* R19649 */ + 0x0000, /* R19650 */ + 0x0000, /* R19651 */ + 0x0000, /* R19652 */ + 0x0000, /* R19653 */ + 0x0000, /* R19654 */ + 0x0000, /* R19655 */ + 0x0000, /* R19656 */ + 0x0000, /* R19657 */ + 0x0000, /* R19658 */ + 0x0000, /* R19659 */ + 0x0000, /* R19660 */ + 0x0000, /* R19661 */ + 0x0000, /* R19662 */ + 0x0000, /* R19663 */ + 0x0000, /* R19664 */ + 0x0000, /* R19665 */ + 0x0000, /* R19666 */ + 0x0000, /* R19667 */ + 0x0000, /* R19668 */ + 0x0000, /* R19669 */ + 0x0000, /* R19670 */ + 0x0000, /* R19671 */ + 0x0000, /* R19672 */ + 0x0000, /* R19673 */ + 0x0000, /* R19674 */ + 0x0000, /* R19675 */ + 0x0000, /* R19676 */ + 0x0000, /* R19677 */ + 0x0000, /* R19678 */ + 0x0000, /* R19679 */ + 0x0000, /* R19680 */ + 0x0000, /* R19681 */ + 0x0000, /* R19682 */ + 0x0000, /* R19683 */ + 0x0000, /* R19684 */ + 0x0000, /* R19685 */ + 0x0000, /* R19686 */ + 0x0000, /* R19687 */ + 0x0000, /* R19688 */ + 0x0000, /* R19689 */ + 0x0000, /* R19690 */ + 0x0000, /* R19691 */ + 0x0000, /* R19692 */ + 0x0000, /* R19693 */ + 0x0000, /* R19694 */ + 0x0000, /* R19695 */ + 0x0000, /* R19696 */ + 0x0000, /* R19697 */ + 0x0000, /* R19698 */ + 0x0000, /* R19699 */ + 0x0000, /* R19700 */ + 0x0000, /* R19701 */ + 0x0000, /* R19702 */ + 0x0000, /* R19703 */ + 0x0000, /* R19704 */ + 0x0000, /* R19705 */ + 0x0000, /* R19706 */ + 0x0000, /* R19707 */ + 0x0000, /* R19708 */ + 0x0000, /* R19709 */ + 0x0000, /* R19710 */ + 0x0000, /* R19711 */ + 0x0000, /* R19712 */ + 0x0000, /* R19713 */ + 0x0000, /* R19714 */ + 0x0000, /* R19715 */ + 0x0000, /* R19716 */ + 0x0000, /* R19717 */ + 0x0000, /* R19718 */ + 0x0000, /* R19719 */ + 0x0000, /* R19720 */ + 0x0000, /* R19721 */ + 0x0000, /* R19722 */ + 0x0000, /* R19723 */ + 0x0000, /* R19724 */ + 0x0000, /* R19725 */ + 0x0000, /* R19726 */ + 0x0000, /* R19727 */ + 0x0000, /* R19728 */ + 0x0000, /* R19729 */ + 0x0000, /* R19730 */ + 0x0000, /* R19731 */ + 0x0000, /* R19732 */ + 0x0000, /* R19733 */ + 0x0000, /* R19734 */ + 0x0000, /* R19735 */ + 0x0000, /* R19736 */ + 0x0000, /* R19737 */ + 0x0000, /* R19738 */ + 0x0000, /* R19739 */ + 0x0000, /* R19740 */ + 0x0000, /* R19741 */ + 0x0000, /* R19742 */ + 0x0000, /* R19743 */ + 0x0000, /* R19744 */ + 0x0000, /* R19745 */ + 0x0000, /* R19746 */ + 0x0000, /* R19747 */ + 0x0000, /* R19748 */ + 0x0000, /* R19749 */ + 0x0000, /* R19750 */ + 0x0000, /* R19751 */ + 0x0000, /* R19752 */ + 0x0000, /* R19753 */ + 0x0000, /* R19754 */ + 0x0000, /* R19755 */ + 0x0000, /* R19756 */ + 0x0000, /* R19757 */ + 0x0000, /* R19758 */ + 0x0000, /* R19759 */ + 0x0000, /* R19760 */ + 0x0000, /* R19761 */ + 0x0000, /* R19762 */ + 0x0000, /* R19763 */ + 0x0000, /* R19764 */ + 0x0000, /* R19765 */ + 0x0000, /* R19766 */ + 0x0000, /* R19767 */ + 0x0000, /* R19768 */ + 0x0000, /* R19769 */ + 0x0000, /* R19770 */ + 0x0000, /* R19771 */ + 0x0000, /* R19772 */ + 0x0000, /* R19773 */ + 0x0000, /* R19774 */ + 0x0000, /* R19775 */ + 0x0000, /* R19776 */ + 0x0000, /* R19777 */ + 0x0000, /* R19778 */ + 0x0000, /* R19779 */ + 0x0000, /* R19780 */ + 0x0000, /* R19781 */ + 0x0000, /* R19782 */ + 0x0000, /* R19783 */ + 0x0000, /* R19784 */ + 0x0000, /* R19785 */ + 0x0000, /* R19786 */ + 0x0000, /* R19787 */ + 0x0000, /* R19788 */ + 0x0000, /* R19789 */ + 0x0000, /* R19790 */ + 0x0000, /* R19791 */ + 0x0000, /* R19792 */ + 0x0000, /* R19793 */ + 0x0000, /* R19794 */ + 0x0000, /* R19795 */ + 0x0000, /* R19796 */ + 0x0000, /* R19797 */ + 0x0000, /* R19798 */ + 0x0000, /* R19799 */ + 0x0000, /* R19800 */ + 0x0000, /* R19801 */ + 0x0000, /* R19802 */ + 0x0000, /* R19803 */ + 0x0000, /* R19804 */ + 0x0000, /* R19805 */ + 0x0000, /* R19806 */ + 0x0000, /* R19807 */ + 0x0000, /* R19808 */ + 0x0000, /* R19809 */ + 0x0000, /* R19810 */ + 0x0000, /* R19811 */ + 0x0000, /* R19812 */ + 0x0000, /* R19813 */ + 0x0000, /* R19814 */ + 0x0000, /* R19815 */ + 0x0000, /* R19816 */ + 0x0000, /* R19817 */ + 0x0000, /* R19818 */ + 0x0000, /* R19819 */ + 0x0000, /* R19820 */ + 0x0000, /* R19821 */ + 0x0000, /* R19822 */ + 0x0000, /* R19823 */ + 0x0000, /* R19824 */ + 0x0000, /* R19825 */ + 0x0000, /* R19826 */ + 0x0000, /* R19827 */ + 0x0000, /* R19828 */ + 0x0000, /* R19829 */ + 0x0000, /* R19830 */ + 0x0000, /* R19831 */ + 0x0000, /* R19832 */ + 0x0000, /* R19833 */ + 0x0000, /* R19834 */ + 0x0000, /* R19835 */ + 0x0000, /* R19836 */ + 0x0000, /* R19837 */ + 0x0000, /* R19838 */ + 0x0000, /* R19839 */ + 0x0000, /* R19840 */ + 0x0000, /* R19841 */ + 0x0000, /* R19842 */ + 0x0000, /* R19843 */ + 0x0000, /* R19844 */ + 0x0000, /* R19845 */ + 0x0000, /* R19846 */ + 0x0000, /* R19847 */ + 0x0000, /* R19848 */ + 0x0000, /* R19849 */ + 0x0000, /* R19850 */ + 0x0000, /* R19851 */ + 0x0000, /* R19852 */ + 0x0000, /* R19853 */ + 0x0000, /* R19854 */ + 0x0000, /* R19855 */ + 0x0000, /* R19856 */ + 0x0000, /* R19857 */ + 0x0000, /* R19858 */ + 0x0000, /* R19859 */ + 0x0000, /* R19860 */ + 0x0000, /* R19861 */ + 0x0000, /* R19862 */ + 0x0000, /* R19863 */ + 0x0000, /* R19864 */ + 0x0000, /* R19865 */ + 0x0000, /* R19866 */ + 0x0000, /* R19867 */ + 0x0000, /* R19868 */ + 0x0000, /* R19869 */ + 0x0000, /* R19870 */ + 0x0000, /* R19871 */ + 0x0000, /* R19872 */ + 0x0000, /* R19873 */ + 0x0000, /* R19874 */ + 0x0000, /* R19875 */ + 0x0000, /* R19876 */ + 0x0000, /* R19877 */ + 0x0000, /* R19878 */ + 0x0000, /* R19879 */ + 0x0000, /* R19880 */ + 0x0000, /* R19881 */ + 0x0000, /* R19882 */ + 0x0000, /* R19883 */ + 0x0000, /* R19884 */ + 0x0000, /* R19885 */ + 0x0000, /* R19886 */ + 0x0000, /* R19887 */ + 0x0000, /* R19888 */ + 0x0000, /* R19889 */ + 0x0000, /* R19890 */ + 0x0000, /* R19891 */ + 0x0000, /* R19892 */ + 0x0000, /* R19893 */ + 0x0000, /* R19894 */ + 0x0000, /* R19895 */ + 0x0000, /* R19896 */ + 0x0000, /* R19897 */ + 0x0000, /* R19898 */ + 0x0000, /* R19899 */ + 0x0000, /* R19900 */ + 0x0000, /* R19901 */ + 0x0000, /* R19902 */ + 0x0000, /* R19903 */ + 0x0000, /* R19904 */ + 0x0000, /* R19905 */ + 0x0000, /* R19906 */ + 0x0000, /* R19907 */ + 0x0000, /* R19908 */ + 0x0000, /* R19909 */ + 0x0000, /* R19910 */ + 0x0000, /* R19911 */ + 0x0000, /* R19912 */ + 0x0000, /* R19913 */ + 0x0000, /* R19914 */ + 0x0000, /* R19915 */ + 0x0000, /* R19916 */ + 0x0000, /* R19917 */ + 0x0000, /* R19918 */ + 0x0000, /* R19919 */ + 0x0000, /* R19920 */ + 0x0000, /* R19921 */ + 0x0000, /* R19922 */ + 0x0000, /* R19923 */ + 0x0000, /* R19924 */ + 0x0000, /* R19925 */ + 0x0000, /* R19926 */ + 0x0000, /* R19927 */ + 0x0000, /* R19928 */ + 0x0000, /* R19929 */ + 0x0000, /* R19930 */ + 0x0000, /* R19931 */ + 0x0000, /* R19932 */ + 0x0000, /* R19933 */ + 0x0000, /* R19934 */ + 0x0000, /* R19935 */ + 0x0000, /* R19936 */ + 0x0000, /* R19937 */ + 0x0000, /* R19938 */ + 0x0000, /* R19939 */ + 0x0000, /* R19940 */ + 0x0000, /* R19941 */ + 0x0000, /* R19942 */ + 0x0000, /* R19943 */ + 0x0000, /* R19944 */ + 0x0000, /* R19945 */ + 0x0000, /* R19946 */ + 0x0000, /* R19947 */ + 0x0000, /* R19948 */ + 0x0000, /* R19949 */ + 0x0000, /* R19950 */ + 0x0000, /* R19951 */ + 0x0000, /* R19952 */ + 0x0000, /* R19953 */ + 0x0000, /* R19954 */ + 0x0000, /* R19955 */ + 0x0000, /* R19956 */ + 0x0000, /* R19957 */ + 0x0000, /* R19958 */ + 0x0000, /* R19959 */ + 0x0000, /* R19960 */ + 0x0000, /* R19961 */ + 0x0000, /* R19962 */ + 0x0000, /* R19963 */ + 0x0000, /* R19964 */ + 0x0000, /* R19965 */ + 0x0000, /* R19966 */ + 0x0000, /* R19967 */ + 0x0020, /* R19968 - RETUNEDAC_PG2_1 */ + 0x0000, /* R19969 - RETUNEDAC_PG2_0 */ + 0x0040, /* R19970 - RETUNEDAC_PG_1 */ + 0x0000, /* R19971 - RETUNEDAC_PG_0 */ + 0x0000, /* R19972 */ + 0x0000, /* R19973 */ + 0x0000, /* R19974 */ + 0x0000, /* R19975 */ + 0x0000, /* R19976 */ + 0x0000, /* R19977 */ + 0x0000, /* R19978 */ + 0x0000, /* R19979 */ + 0x0000, /* R19980 */ + 0x0000, /* R19981 */ + 0x0000, /* R19982 */ + 0x0000, /* R19983 */ + 0x0000, /* R19984 */ + 0x0000, /* R19985 */ + 0x0000, /* R19986 */ + 0x0000, /* R19987 */ + 0x0000, /* R19988 */ + 0x0000, /* R19989 */ + 0x0000, /* R19990 */ + 0x0000, /* R19991 */ + 0x0000, /* R19992 */ + 0x0000, /* R19993 */ + 0x0000, /* R19994 */ + 0x0000, /* R19995 */ + 0x0000, /* R19996 */ + 0x0000, /* R19997 */ + 0x0000, /* R19998 */ + 0x0000, /* R19999 */ + 0x0000, /* R20000 */ + 0x0000, /* R20001 */ + 0x0000, /* R20002 */ + 0x0000, /* R20003 */ + 0x0000, /* R20004 */ + 0x0000, /* R20005 */ + 0x0000, /* R20006 */ + 0x0000, /* R20007 */ + 0x0000, /* R20008 */ + 0x0000, /* R20009 */ + 0x0000, /* R20010 */ + 0x0000, /* R20011 */ + 0x0000, /* R20012 */ + 0x0000, /* R20013 */ + 0x0000, /* R20014 */ + 0x0000, /* R20015 */ + 0x0000, /* R20016 */ + 0x0000, /* R20017 */ + 0x0000, /* R20018 */ + 0x0000, /* R20019 */ + 0x0000, /* R20020 */ + 0x0000, /* R20021 */ + 0x0000, /* R20022 */ + 0x0000, /* R20023 */ + 0x0000, /* R20024 */ + 0x0000, /* R20025 */ + 0x0000, /* R20026 */ + 0x0000, /* R20027 */ + 0x0000, /* R20028 */ + 0x0000, /* R20029 */ + 0x0000, /* R20030 */ + 0x0000, /* R20031 */ + 0x0000, /* R20032 */ + 0x0000, /* R20033 */ + 0x0000, /* R20034 */ + 0x0000, /* R20035 */ + 0x0000, /* R20036 */ + 0x0000, /* R20037 */ + 0x0000, /* R20038 */ + 0x0000, /* R20039 */ + 0x0000, /* R20040 */ + 0x0000, /* R20041 */ + 0x0000, /* R20042 */ + 0x0000, /* R20043 */ + 0x0000, /* R20044 */ + 0x0000, /* R20045 */ + 0x0000, /* R20046 */ + 0x0000, /* R20047 */ + 0x0000, /* R20048 */ + 0x0000, /* R20049 */ + 0x0000, /* R20050 */ + 0x0000, /* R20051 */ + 0x0000, /* R20052 */ + 0x0000, /* R20053 */ + 0x0000, /* R20054 */ + 0x0000, /* R20055 */ + 0x0000, /* R20056 */ + 0x0000, /* R20057 */ + 0x0000, /* R20058 */ + 0x0000, /* R20059 */ + 0x0000, /* R20060 */ + 0x0000, /* R20061 */ + 0x0000, /* R20062 */ + 0x0000, /* R20063 */ + 0x0000, /* R20064 */ + 0x0000, /* R20065 */ + 0x0000, /* R20066 */ + 0x0000, /* R20067 */ + 0x0000, /* R20068 */ + 0x0000, /* R20069 */ + 0x0000, /* R20070 */ + 0x0000, /* R20071 */ + 0x0000, /* R20072 */ + 0x0000, /* R20073 */ + 0x0000, /* R20074 */ + 0x0000, /* R20075 */ + 0x0000, /* R20076 */ + 0x0000, /* R20077 */ + 0x0000, /* R20078 */ + 0x0000, /* R20079 */ + 0x0000, /* R20080 */ + 0x0000, /* R20081 */ + 0x0000, /* R20082 */ + 0x0000, /* R20083 */ + 0x0000, /* R20084 */ + 0x0000, /* R20085 */ + 0x0000, /* R20086 */ + 0x0000, /* R20087 */ + 0x0000, /* R20088 */ + 0x0000, /* R20089 */ + 0x0000, /* R20090 */ + 0x0000, /* R20091 */ + 0x0000, /* R20092 */ + 0x0000, /* R20093 */ + 0x0000, /* R20094 */ + 0x0000, /* R20095 */ + 0x0000, /* R20096 */ + 0x0000, /* R20097 */ + 0x0000, /* R20098 */ + 0x0000, /* R20099 */ + 0x0000, /* R20100 */ + 0x0000, /* R20101 */ + 0x0000, /* R20102 */ + 0x0000, /* R20103 */ + 0x0000, /* R20104 */ + 0x0000, /* R20105 */ + 0x0000, /* R20106 */ + 0x0000, /* R20107 */ + 0x0000, /* R20108 */ + 0x0000, /* R20109 */ + 0x0000, /* R20110 */ + 0x0000, /* R20111 */ + 0x0000, /* R20112 */ + 0x0000, /* R20113 */ + 0x0000, /* R20114 */ + 0x0000, /* R20115 */ + 0x0000, /* R20116 */ + 0x0000, /* R20117 */ + 0x0000, /* R20118 */ + 0x0000, /* R20119 */ + 0x0000, /* R20120 */ + 0x0000, /* R20121 */ + 0x0000, /* R20122 */ + 0x0000, /* R20123 */ + 0x0000, /* R20124 */ + 0x0000, /* R20125 */ + 0x0000, /* R20126 */ + 0x0000, /* R20127 */ + 0x0000, /* R20128 */ + 0x0000, /* R20129 */ + 0x0000, /* R20130 */ + 0x0000, /* R20131 */ + 0x0000, /* R20132 */ + 0x0000, /* R20133 */ + 0x0000, /* R20134 */ + 0x0000, /* R20135 */ + 0x0000, /* R20136 */ + 0x0000, /* R20137 */ + 0x0000, /* R20138 */ + 0x0000, /* R20139 */ + 0x0000, /* R20140 */ + 0x0000, /* R20141 */ + 0x0000, /* R20142 */ + 0x0000, /* R20143 */ + 0x0000, /* R20144 */ + 0x0000, /* R20145 */ + 0x0000, /* R20146 */ + 0x0000, /* R20147 */ + 0x0000, /* R20148 */ + 0x0000, /* R20149 */ + 0x0000, /* R20150 */ + 0x0000, /* R20151 */ + 0x0000, /* R20152 */ + 0x0000, /* R20153 */ + 0x0000, /* R20154 */ + 0x0000, /* R20155 */ + 0x0000, /* R20156 */ + 0x0000, /* R20157 */ + 0x0000, /* R20158 */ + 0x0000, /* R20159 */ + 0x0000, /* R20160 */ + 0x0000, /* R20161 */ + 0x0000, /* R20162 */ + 0x0000, /* R20163 */ + 0x0000, /* R20164 */ + 0x0000, /* R20165 */ + 0x0000, /* R20166 */ + 0x0000, /* R20167 */ + 0x0000, /* R20168 */ + 0x0000, /* R20169 */ + 0x0000, /* R20170 */ + 0x0000, /* R20171 */ + 0x0000, /* R20172 */ + 0x0000, /* R20173 */ + 0x0000, /* R20174 */ + 0x0000, /* R20175 */ + 0x0000, /* R20176 */ + 0x0000, /* R20177 */ + 0x0000, /* R20178 */ + 0x0000, /* R20179 */ + 0x0000, /* R20180 */ + 0x0000, /* R20181 */ + 0x0000, /* R20182 */ + 0x0000, /* R20183 */ + 0x0000, /* R20184 */ + 0x0000, /* R20185 */ + 0x0000, /* R20186 */ + 0x0000, /* R20187 */ + 0x0000, /* R20188 */ + 0x0000, /* R20189 */ + 0x0000, /* R20190 */ + 0x0000, /* R20191 */ + 0x0000, /* R20192 */ + 0x0000, /* R20193 */ + 0x0000, /* R20194 */ + 0x0000, /* R20195 */ + 0x0000, /* R20196 */ + 0x0000, /* R20197 */ + 0x0000, /* R20198 */ + 0x0000, /* R20199 */ + 0x0000, /* R20200 */ + 0x0000, /* R20201 */ + 0x0000, /* R20202 */ + 0x0000, /* R20203 */ + 0x0000, /* R20204 */ + 0x0000, /* R20205 */ + 0x0000, /* R20206 */ + 0x0000, /* R20207 */ + 0x0000, /* R20208 */ + 0x0000, /* R20209 */ + 0x0000, /* R20210 */ + 0x0000, /* R20211 */ + 0x0000, /* R20212 */ + 0x0000, /* R20213 */ + 0x0000, /* R20214 */ + 0x0000, /* R20215 */ + 0x0000, /* R20216 */ + 0x0000, /* R20217 */ + 0x0000, /* R20218 */ + 0x0000, /* R20219 */ + 0x0000, /* R20220 */ + 0x0000, /* R20221 */ + 0x0000, /* R20222 */ + 0x0000, /* R20223 */ + 0x0000, /* R20224 */ + 0x0000, /* R20225 */ + 0x0000, /* R20226 */ + 0x0000, /* R20227 */ + 0x0000, /* R20228 */ + 0x0000, /* R20229 */ + 0x0000, /* R20230 */ + 0x0000, /* R20231 */ + 0x0000, /* R20232 */ + 0x0000, /* R20233 */ + 0x0000, /* R20234 */ + 0x0000, /* R20235 */ + 0x0000, /* R20236 */ + 0x0000, /* R20237 */ + 0x0000, /* R20238 */ + 0x0000, /* R20239 */ + 0x0000, /* R20240 */ + 0x0000, /* R20241 */ + 0x0000, /* R20242 */ + 0x0000, /* R20243 */ + 0x0000, /* R20244 */ + 0x0000, /* R20245 */ + 0x0000, /* R20246 */ + 0x0000, /* R20247 */ + 0x0000, /* R20248 */ + 0x0000, /* R20249 */ + 0x0000, /* R20250 */ + 0x0000, /* R20251 */ + 0x0000, /* R20252 */ + 0x0000, /* R20253 */ + 0x0000, /* R20254 */ + 0x0000, /* R20255 */ + 0x0000, /* R20256 */ + 0x0000, /* R20257 */ + 0x0000, /* R20258 */ + 0x0000, /* R20259 */ + 0x0000, /* R20260 */ + 0x0000, /* R20261 */ + 0x0000, /* R20262 */ + 0x0000, /* R20263 */ + 0x0000, /* R20264 */ + 0x0000, /* R20265 */ + 0x0000, /* R20266 */ + 0x0000, /* R20267 */ + 0x0000, /* R20268 */ + 0x0000, /* R20269 */ + 0x0000, /* R20270 */ + 0x0000, /* R20271 */ + 0x0000, /* R20272 */ + 0x0000, /* R20273 */ + 0x0000, /* R20274 */ + 0x0000, /* R20275 */ + 0x0000, /* R20276 */ + 0x0000, /* R20277 */ + 0x0000, /* R20278 */ + 0x0000, /* R20279 */ + 0x0000, /* R20280 */ + 0x0000, /* R20281 */ + 0x0000, /* R20282 */ + 0x0000, /* R20283 */ + 0x0000, /* R20284 */ + 0x0000, /* R20285 */ + 0x0000, /* R20286 */ + 0x0000, /* R20287 */ + 0x0000, /* R20288 */ + 0x0000, /* R20289 */ + 0x0000, /* R20290 */ + 0x0000, /* R20291 */ + 0x0000, /* R20292 */ + 0x0000, /* R20293 */ + 0x0000, /* R20294 */ + 0x0000, /* R20295 */ + 0x0000, /* R20296 */ + 0x0000, /* R20297 */ + 0x0000, /* R20298 */ + 0x0000, /* R20299 */ + 0x0000, /* R20300 */ + 0x0000, /* R20301 */ + 0x0000, /* R20302 */ + 0x0000, /* R20303 */ + 0x0000, /* R20304 */ + 0x0000, /* R20305 */ + 0x0000, /* R20306 */ + 0x0000, /* R20307 */ + 0x0000, /* R20308 */ + 0x0000, /* R20309 */ + 0x0000, /* R20310 */ + 0x0000, /* R20311 */ + 0x0000, /* R20312 */ + 0x0000, /* R20313 */ + 0x0000, /* R20314 */ + 0x0000, /* R20315 */ + 0x0000, /* R20316 */ + 0x0000, /* R20317 */ + 0x0000, /* R20318 */ + 0x0000, /* R20319 */ + 0x0000, /* R20320 */ + 0x0000, /* R20321 */ + 0x0000, /* R20322 */ + 0x0000, /* R20323 */ + 0x0000, /* R20324 */ + 0x0000, /* R20325 */ + 0x0000, /* R20326 */ + 0x0000, /* R20327 */ + 0x0000, /* R20328 */ + 0x0000, /* R20329 */ + 0x0000, /* R20330 */ + 0x0000, /* R20331 */ + 0x0000, /* R20332 */ + 0x0000, /* R20333 */ + 0x0000, /* R20334 */ + 0x0000, /* R20335 */ + 0x0000, /* R20336 */ + 0x0000, /* R20337 */ + 0x0000, /* R20338 */ + 0x0000, /* R20339 */ + 0x0000, /* R20340 */ + 0x0000, /* R20341 */ + 0x0000, /* R20342 */ + 0x0000, /* R20343 */ + 0x0000, /* R20344 */ + 0x0000, /* R20345 */ + 0x0000, /* R20346 */ + 0x0000, /* R20347 */ + 0x0000, /* R20348 */ + 0x0000, /* R20349 */ + 0x0000, /* R20350 */ + 0x0000, /* R20351 */ + 0x0000, /* R20352 */ + 0x0000, /* R20353 */ + 0x0000, /* R20354 */ + 0x0000, /* R20355 */ + 0x0000, /* R20356 */ + 0x0000, /* R20357 */ + 0x0000, /* R20358 */ + 0x0000, /* R20359 */ + 0x0000, /* R20360 */ + 0x0000, /* R20361 */ + 0x0000, /* R20362 */ + 0x0000, /* R20363 */ + 0x0000, /* R20364 */ + 0x0000, /* R20365 */ + 0x0000, /* R20366 */ + 0x0000, /* R20367 */ + 0x0000, /* R20368 */ + 0x0000, /* R20369 */ + 0x0000, /* R20370 */ + 0x0000, /* R20371 */ + 0x0000, /* R20372 */ + 0x0000, /* R20373 */ + 0x0000, /* R20374 */ + 0x0000, /* R20375 */ + 0x0000, /* R20376 */ + 0x0000, /* R20377 */ + 0x0000, /* R20378 */ + 0x0000, /* R20379 */ + 0x0000, /* R20380 */ + 0x0000, /* R20381 */ + 0x0000, /* R20382 */ + 0x0000, /* R20383 */ + 0x0000, /* R20384 */ + 0x0000, /* R20385 */ + 0x0000, /* R20386 */ + 0x0000, /* R20387 */ + 0x0000, /* R20388 */ + 0x0000, /* R20389 */ + 0x0000, /* R20390 */ + 0x0000, /* R20391 */ + 0x0000, /* R20392 */ + 0x0000, /* R20393 */ + 0x0000, /* R20394 */ + 0x0000, /* R20395 */ + 0x0000, /* R20396 */ + 0x0000, /* R20397 */ + 0x0000, /* R20398 */ + 0x0000, /* R20399 */ + 0x0000, /* R20400 */ + 0x0000, /* R20401 */ + 0x0000, /* R20402 */ + 0x0000, /* R20403 */ + 0x0000, /* R20404 */ + 0x0000, /* R20405 */ + 0x0000, /* R20406 */ + 0x0000, /* R20407 */ + 0x0000, /* R20408 */ + 0x0000, /* R20409 */ + 0x0000, /* R20410 */ + 0x0000, /* R20411 */ + 0x0000, /* R20412 */ + 0x0000, /* R20413 */ + 0x0000, /* R20414 */ + 0x0000, /* R20415 */ + 0x0000, /* R20416 */ + 0x0000, /* R20417 */ + 0x0000, /* R20418 */ + 0x0000, /* R20419 */ + 0x0000, /* R20420 */ + 0x0000, /* R20421 */ + 0x0000, /* R20422 */ + 0x0000, /* R20423 */ + 0x0000, /* R20424 */ + 0x0000, /* R20425 */ + 0x0000, /* R20426 */ + 0x0000, /* R20427 */ + 0x0000, /* R20428 */ + 0x0000, /* R20429 */ + 0x0000, /* R20430 */ + 0x0000, /* R20431 */ + 0x0000, /* R20432 */ + 0x0000, /* R20433 */ + 0x0000, /* R20434 */ + 0x0000, /* R20435 */ + 0x0000, /* R20436 */ + 0x0000, /* R20437 */ + 0x0000, /* R20438 */ + 0x0000, /* R20439 */ + 0x0000, /* R20440 */ + 0x0000, /* R20441 */ + 0x0000, /* R20442 */ + 0x0000, /* R20443 */ + 0x0000, /* R20444 */ + 0x0000, /* R20445 */ + 0x0000, /* R20446 */ + 0x0000, /* R20447 */ + 0x0000, /* R20448 */ + 0x0000, /* R20449 */ + 0x0000, /* R20450 */ + 0x0000, /* R20451 */ + 0x0000, /* R20452 */ + 0x0000, /* R20453 */ + 0x0000, /* R20454 */ + 0x0000, /* R20455 */ + 0x0000, /* R20456 */ + 0x0000, /* R20457 */ + 0x0000, /* R20458 */ + 0x0000, /* R20459 */ + 0x0000, /* R20460 */ + 0x0000, /* R20461 */ + 0x0000, /* R20462 */ + 0x0000, /* R20463 */ + 0x0000, /* R20464 */ + 0x0000, /* R20465 */ + 0x0000, /* R20466 */ + 0x0000, /* R20467 */ + 0x0000, /* R20468 */ + 0x0000, /* R20469 */ + 0x0000, /* R20470 */ + 0x0000, /* R20471 */ + 0x0000, /* R20472 */ + 0x0000, /* R20473 */ + 0x0000, /* R20474 */ + 0x0000, /* R20475 */ + 0x0000, /* R20476 */ + 0x0000, /* R20477 */ + 0x0000, /* R20478 */ + 0x0000, /* R20479 */ + 0x007F, /* R20480 - DACR_RETUNE_C1_1 */ + 0xFFFF, /* R20481 - DACR_RETUNE_C1_0 */ + 0x0000, /* R20482 - DACR_RETUNE_C2_1 */ + 0x0000, /* R20483 - DACR_RETUNE_C2_0 */ + 0x0000, /* R20484 - DACR_RETUNE_C3_1 */ + 0x0000, /* R20485 - DACR_RETUNE_C3_0 */ + 0x0000, /* R20486 - DACR_RETUNE_C4_1 */ + 0x0000, /* R20487 - DACR_RETUNE_C4_0 */ + 0x0000, /* R20488 - DACR_RETUNE_C5_1 */ + 0x0000, /* R20489 - DACR_RETUNE_C5_0 */ + 0x0000, /* R20490 - DACR_RETUNE_C6_1 */ + 0x0000, /* R20491 - DACR_RETUNE_C6_0 */ + 0x0000, /* R20492 - DACR_RETUNE_C7_1 */ + 0x0000, /* R20493 - DACR_RETUNE_C7_0 */ + 0x0000, /* R20494 - DACR_RETUNE_C8_1 */ + 0x0000, /* R20495 - DACR_RETUNE_C8_0 */ + 0x0000, /* R20496 - DACR_RETUNE_C9_1 */ + 0x0000, /* R20497 - DACR_RETUNE_C9_0 */ + 0x0000, /* R20498 - DACR_RETUNE_C10_1 */ + 0x0000, /* R20499 - DACR_RETUNE_C10_0 */ + 0x0000, /* R20500 - DACR_RETUNE_C11_1 */ + 0x0000, /* R20501 - DACR_RETUNE_C11_0 */ + 0x0000, /* R20502 - DACR_RETUNE_C12_1 */ + 0x0000, /* R20503 - DACR_RETUNE_C12_0 */ + 0x0000, /* R20504 - DACR_RETUNE_C13_1 */ + 0x0000, /* R20505 - DACR_RETUNE_C13_0 */ + 0x0000, /* R20506 - DACR_RETUNE_C14_1 */ + 0x0000, /* R20507 - DACR_RETUNE_C14_0 */ + 0x0000, /* R20508 - DACR_RETUNE_C15_1 */ + 0x0000, /* R20509 - DACR_RETUNE_C15_0 */ + 0x0000, /* R20510 - DACR_RETUNE_C16_1 */ + 0x0000, /* R20511 - DACR_RETUNE_C16_0 */ + 0x0000, /* R20512 - DACR_RETUNE_C17_1 */ + 0x0000, /* R20513 - DACR_RETUNE_C17_0 */ + 0x0000, /* R20514 - DACR_RETUNE_C18_1 */ + 0x0000, /* R20515 - DACR_RETUNE_C18_0 */ + 0x0000, /* R20516 - DACR_RETUNE_C19_1 */ + 0x0000, /* R20517 - DACR_RETUNE_C19_0 */ + 0x0000, /* R20518 - DACR_RETUNE_C20_1 */ + 0x0000, /* R20519 - DACR_RETUNE_C20_0 */ + 0x0000, /* R20520 - DACR_RETUNE_C21_1 */ + 0x0000, /* R20521 - DACR_RETUNE_C21_0 */ + 0x0000, /* R20522 - DACR_RETUNE_C22_1 */ + 0x0000, /* R20523 - DACR_RETUNE_C22_0 */ + 0x0000, /* R20524 - DACR_RETUNE_C23_1 */ + 0x0000, /* R20525 - DACR_RETUNE_C23_0 */ + 0x0000, /* R20526 - DACR_RETUNE_C24_1 */ + 0x0000, /* R20527 - DACR_RETUNE_C24_0 */ + 0x0000, /* R20528 - DACR_RETUNE_C25_1 */ + 0x0000, /* R20529 - DACR_RETUNE_C25_0 */ + 0x0000, /* R20530 - DACR_RETUNE_C26_1 */ + 0x0000, /* R20531 - DACR_RETUNE_C26_0 */ + 0x0000, /* R20532 - DACR_RETUNE_C27_1 */ + 0x0000, /* R20533 - DACR_RETUNE_C27_0 */ + 0x0000, /* R20534 - DACR_RETUNE_C28_1 */ + 0x0000, /* R20535 - DACR_RETUNE_C28_0 */ + 0x0000, /* R20536 - DACR_RETUNE_C29_1 */ + 0x0000, /* R20537 - DACR_RETUNE_C29_0 */ + 0x0000, /* R20538 - DACR_RETUNE_C30_1 */ + 0x0000, /* R20539 - DACR_RETUNE_C30_0 */ + 0x0000, /* R20540 - DACR_RETUNE_C31_1 */ + 0x0000, /* R20541 - DACR_RETUNE_C31_0 */ + 0x0000, /* R20542 - DACR_RETUNE_C32_1 */ + 0x0000, /* R20543 - DACR_RETUNE_C32_0 */ + 0x0000, /* R20544 */ + 0x0000, /* R20545 */ + 0x0000, /* R20546 */ + 0x0000, /* R20547 */ + 0x0000, /* R20548 */ + 0x0000, /* R20549 */ + 0x0000, /* R20550 */ + 0x0000, /* R20551 */ + 0x0000, /* R20552 */ + 0x0000, /* R20553 */ + 0x0000, /* R20554 */ + 0x0000, /* R20555 */ + 0x0000, /* R20556 */ + 0x0000, /* R20557 */ + 0x0000, /* R20558 */ + 0x0000, /* R20559 */ + 0x0000, /* R20560 */ + 0x0000, /* R20561 */ + 0x0000, /* R20562 */ + 0x0000, /* R20563 */ + 0x0000, /* R20564 */ + 0x0000, /* R20565 */ + 0x0000, /* R20566 */ + 0x0000, /* R20567 */ + 0x0000, /* R20568 */ + 0x0000, /* R20569 */ + 0x0000, /* R20570 */ + 0x0000, /* R20571 */ + 0x0000, /* R20572 */ + 0x0000, /* R20573 */ + 0x0000, /* R20574 */ + 0x0000, /* R20575 */ + 0x0000, /* R20576 */ + 0x0000, /* R20577 */ + 0x0000, /* R20578 */ + 0x0000, /* R20579 */ + 0x0000, /* R20580 */ + 0x0000, /* R20581 */ + 0x0000, /* R20582 */ + 0x0000, /* R20583 */ + 0x0000, /* R20584 */ + 0x0000, /* R20585 */ + 0x0000, /* R20586 */ + 0x0000, /* R20587 */ + 0x0000, /* R20588 */ + 0x0000, /* R20589 */ + 0x0000, /* R20590 */ + 0x0000, /* R20591 */ + 0x0000, /* R20592 */ + 0x0000, /* R20593 */ + 0x0000, /* R20594 */ + 0x0000, /* R20595 */ + 0x0000, /* R20596 */ + 0x0000, /* R20597 */ + 0x0000, /* R20598 */ + 0x0000, /* R20599 */ + 0x0000, /* R20600 */ + 0x0000, /* R20601 */ + 0x0000, /* R20602 */ + 0x0000, /* R20603 */ + 0x0000, /* R20604 */ + 0x0000, /* R20605 */ + 0x0000, /* R20606 */ + 0x0000, /* R20607 */ + 0x0000, /* R20608 */ + 0x0000, /* R20609 */ + 0x0000, /* R20610 */ + 0x0000, /* R20611 */ + 0x0000, /* R20612 */ + 0x0000, /* R20613 */ + 0x0000, /* R20614 */ + 0x0000, /* R20615 */ + 0x0000, /* R20616 */ + 0x0000, /* R20617 */ + 0x0000, /* R20618 */ + 0x0000, /* R20619 */ + 0x0000, /* R20620 */ + 0x0000, /* R20621 */ + 0x0000, /* R20622 */ + 0x0000, /* R20623 */ + 0x0000, /* R20624 */ + 0x0000, /* R20625 */ + 0x0000, /* R20626 */ + 0x0000, /* R20627 */ + 0x0000, /* R20628 */ + 0x0000, /* R20629 */ + 0x0000, /* R20630 */ + 0x0000, /* R20631 */ + 0x0000, /* R20632 */ + 0x0000, /* R20633 */ + 0x0000, /* R20634 */ + 0x0000, /* R20635 */ + 0x0000, /* R20636 */ + 0x0000, /* R20637 */ + 0x0000, /* R20638 */ + 0x0000, /* R20639 */ + 0x0000, /* R20640 */ + 0x0000, /* R20641 */ + 0x0000, /* R20642 */ + 0x0000, /* R20643 */ + 0x0000, /* R20644 */ + 0x0000, /* R20645 */ + 0x0000, /* R20646 */ + 0x0000, /* R20647 */ + 0x0000, /* R20648 */ + 0x0000, /* R20649 */ + 0x0000, /* R20650 */ + 0x0000, /* R20651 */ + 0x0000, /* R20652 */ + 0x0000, /* R20653 */ + 0x0000, /* R20654 */ + 0x0000, /* R20655 */ + 0x0000, /* R20656 */ + 0x0000, /* R20657 */ + 0x0000, /* R20658 */ + 0x0000, /* R20659 */ + 0x0000, /* R20660 */ + 0x0000, /* R20661 */ + 0x0000, /* R20662 */ + 0x0000, /* R20663 */ + 0x0000, /* R20664 */ + 0x0000, /* R20665 */ + 0x0000, /* R20666 */ + 0x0000, /* R20667 */ + 0x0000, /* R20668 */ + 0x0000, /* R20669 */ + 0x0000, /* R20670 */ + 0x0000, /* R20671 */ + 0x0000, /* R20672 */ + 0x0000, /* R20673 */ + 0x0000, /* R20674 */ + 0x0000, /* R20675 */ + 0x0000, /* R20676 */ + 0x0000, /* R20677 */ + 0x0000, /* R20678 */ + 0x0000, /* R20679 */ + 0x0000, /* R20680 */ + 0x0000, /* R20681 */ + 0x0000, /* R20682 */ + 0x0000, /* R20683 */ + 0x0000, /* R20684 */ + 0x0000, /* R20685 */ + 0x0000, /* R20686 */ + 0x0000, /* R20687 */ + 0x0000, /* R20688 */ + 0x0000, /* R20689 */ + 0x0000, /* R20690 */ + 0x0000, /* R20691 */ + 0x0000, /* R20692 */ + 0x0000, /* R20693 */ + 0x0000, /* R20694 */ + 0x0000, /* R20695 */ + 0x0000, /* R20696 */ + 0x0000, /* R20697 */ + 0x0000, /* R20698 */ + 0x0000, /* R20699 */ + 0x0000, /* R20700 */ + 0x0000, /* R20701 */ + 0x0000, /* R20702 */ + 0x0000, /* R20703 */ + 0x0000, /* R20704 */ + 0x0000, /* R20705 */ + 0x0000, /* R20706 */ + 0x0000, /* R20707 */ + 0x0000, /* R20708 */ + 0x0000, /* R20709 */ + 0x0000, /* R20710 */ + 0x0000, /* R20711 */ + 0x0000, /* R20712 */ + 0x0000, /* R20713 */ + 0x0000, /* R20714 */ + 0x0000, /* R20715 */ + 0x0000, /* R20716 */ + 0x0000, /* R20717 */ + 0x0000, /* R20718 */ + 0x0000, /* R20719 */ + 0x0000, /* R20720 */ + 0x0000, /* R20721 */ + 0x0000, /* R20722 */ + 0x0000, /* R20723 */ + 0x0000, /* R20724 */ + 0x0000, /* R20725 */ + 0x0000, /* R20726 */ + 0x0000, /* R20727 */ + 0x0000, /* R20728 */ + 0x0000, /* R20729 */ + 0x0000, /* R20730 */ + 0x0000, /* R20731 */ + 0x0000, /* R20732 */ + 0x0000, /* R20733 */ + 0x0000, /* R20734 */ + 0x0000, /* R20735 */ + 0x0000, /* R20736 */ + 0x0000, /* R20737 */ + 0x0000, /* R20738 */ + 0x0000, /* R20739 */ + 0x0000, /* R20740 */ + 0x0000, /* R20741 */ + 0x0000, /* R20742 */ + 0x0000, /* R20743 */ + 0x0000, /* R20744 */ + 0x0000, /* R20745 */ + 0x0000, /* R20746 */ + 0x0000, /* R20747 */ + 0x0000, /* R20748 */ + 0x0000, /* R20749 */ + 0x0000, /* R20750 */ + 0x0000, /* R20751 */ + 0x0000, /* R20752 */ + 0x0000, /* R20753 */ + 0x0000, /* R20754 */ + 0x0000, /* R20755 */ + 0x0000, /* R20756 */ + 0x0000, /* R20757 */ + 0x0000, /* R20758 */ + 0x0000, /* R20759 */ + 0x0000, /* R20760 */ + 0x0000, /* R20761 */ + 0x0000, /* R20762 */ + 0x0000, /* R20763 */ + 0x0000, /* R20764 */ + 0x0000, /* R20765 */ + 0x0000, /* R20766 */ + 0x0000, /* R20767 */ + 0x0000, /* R20768 */ + 0x0000, /* R20769 */ + 0x0000, /* R20770 */ + 0x0000, /* R20771 */ + 0x0000, /* R20772 */ + 0x0000, /* R20773 */ + 0x0000, /* R20774 */ + 0x0000, /* R20775 */ + 0x0000, /* R20776 */ + 0x0000, /* R20777 */ + 0x0000, /* R20778 */ + 0x0000, /* R20779 */ + 0x0000, /* R20780 */ + 0x0000, /* R20781 */ + 0x0000, /* R20782 */ + 0x0000, /* R20783 */ + 0x0000, /* R20784 */ + 0x0000, /* R20785 */ + 0x0000, /* R20786 */ + 0x0000, /* R20787 */ + 0x0000, /* R20788 */ + 0x0000, /* R20789 */ + 0x0000, /* R20790 */ + 0x0000, /* R20791 */ + 0x0000, /* R20792 */ + 0x0000, /* R20793 */ + 0x0000, /* R20794 */ + 0x0000, /* R20795 */ + 0x0000, /* R20796 */ + 0x0000, /* R20797 */ + 0x0000, /* R20798 */ + 0x0000, /* R20799 */ + 0x0000, /* R20800 */ + 0x0000, /* R20801 */ + 0x0000, /* R20802 */ + 0x0000, /* R20803 */ + 0x0000, /* R20804 */ + 0x0000, /* R20805 */ + 0x0000, /* R20806 */ + 0x0000, /* R20807 */ + 0x0000, /* R20808 */ + 0x0000, /* R20809 */ + 0x0000, /* R20810 */ + 0x0000, /* R20811 */ + 0x0000, /* R20812 */ + 0x0000, /* R20813 */ + 0x0000, /* R20814 */ + 0x0000, /* R20815 */ + 0x0000, /* R20816 */ + 0x0000, /* R20817 */ + 0x0000, /* R20818 */ + 0x0000, /* R20819 */ + 0x0000, /* R20820 */ + 0x0000, /* R20821 */ + 0x0000, /* R20822 */ + 0x0000, /* R20823 */ + 0x0000, /* R20824 */ + 0x0000, /* R20825 */ + 0x0000, /* R20826 */ + 0x0000, /* R20827 */ + 0x0000, /* R20828 */ + 0x0000, /* R20829 */ + 0x0000, /* R20830 */ + 0x0000, /* R20831 */ + 0x0000, /* R20832 */ + 0x0000, /* R20833 */ + 0x0000, /* R20834 */ + 0x0000, /* R20835 */ + 0x0000, /* R20836 */ + 0x0000, /* R20837 */ + 0x0000, /* R20838 */ + 0x0000, /* R20839 */ + 0x0000, /* R20840 */ + 0x0000, /* R20841 */ + 0x0000, /* R20842 */ + 0x0000, /* R20843 */ + 0x0000, /* R20844 */ + 0x0000, /* R20845 */ + 0x0000, /* R20846 */ + 0x0000, /* R20847 */ + 0x0000, /* R20848 */ + 0x0000, /* R20849 */ + 0x0000, /* R20850 */ + 0x0000, /* R20851 */ + 0x0000, /* R20852 */ + 0x0000, /* R20853 */ + 0x0000, /* R20854 */ + 0x0000, /* R20855 */ + 0x0000, /* R20856 */ + 0x0000, /* R20857 */ + 0x0000, /* R20858 */ + 0x0000, /* R20859 */ + 0x0000, /* R20860 */ + 0x0000, /* R20861 */ + 0x0000, /* R20862 */ + 0x0000, /* R20863 */ + 0x0000, /* R20864 */ + 0x0000, /* R20865 */ + 0x0000, /* R20866 */ + 0x0000, /* R20867 */ + 0x0000, /* R20868 */ + 0x0000, /* R20869 */ + 0x0000, /* R20870 */ + 0x0000, /* R20871 */ + 0x0000, /* R20872 */ + 0x0000, /* R20873 */ + 0x0000, /* R20874 */ + 0x0000, /* R20875 */ + 0x0000, /* R20876 */ + 0x0000, /* R20877 */ + 0x0000, /* R20878 */ + 0x0000, /* R20879 */ + 0x0000, /* R20880 */ + 0x0000, /* R20881 */ + 0x0000, /* R20882 */ + 0x0000, /* R20883 */ + 0x0000, /* R20884 */ + 0x0000, /* R20885 */ + 0x0000, /* R20886 */ + 0x0000, /* R20887 */ + 0x0000, /* R20888 */ + 0x0000, /* R20889 */ + 0x0000, /* R20890 */ + 0x0000, /* R20891 */ + 0x0000, /* R20892 */ + 0x0000, /* R20893 */ + 0x0000, /* R20894 */ + 0x0000, /* R20895 */ + 0x0000, /* R20896 */ + 0x0000, /* R20897 */ + 0x0000, /* R20898 */ + 0x0000, /* R20899 */ + 0x0000, /* R20900 */ + 0x0000, /* R20901 */ + 0x0000, /* R20902 */ + 0x0000, /* R20903 */ + 0x0000, /* R20904 */ + 0x0000, /* R20905 */ + 0x0000, /* R20906 */ + 0x0000, /* R20907 */ + 0x0000, /* R20908 */ + 0x0000, /* R20909 */ + 0x0000, /* R20910 */ + 0x0000, /* R20911 */ + 0x0000, /* R20912 */ + 0x0000, /* R20913 */ + 0x0000, /* R20914 */ + 0x0000, /* R20915 */ + 0x0000, /* R20916 */ + 0x0000, /* R20917 */ + 0x0000, /* R20918 */ + 0x0000, /* R20919 */ + 0x0000, /* R20920 */ + 0x0000, /* R20921 */ + 0x0000, /* R20922 */ + 0x0000, /* R20923 */ + 0x0000, /* R20924 */ + 0x0000, /* R20925 */ + 0x0000, /* R20926 */ + 0x0000, /* R20927 */ + 0x0000, /* R20928 */ + 0x0000, /* R20929 */ + 0x0000, /* R20930 */ + 0x0000, /* R20931 */ + 0x0000, /* R20932 */ + 0x0000, /* R20933 */ + 0x0000, /* R20934 */ + 0x0000, /* R20935 */ + 0x0000, /* R20936 */ + 0x0000, /* R20937 */ + 0x0000, /* R20938 */ + 0x0000, /* R20939 */ + 0x0000, /* R20940 */ + 0x0000, /* R20941 */ + 0x0000, /* R20942 */ + 0x0000, /* R20943 */ + 0x0000, /* R20944 */ + 0x0000, /* R20945 */ + 0x0000, /* R20946 */ + 0x0000, /* R20947 */ + 0x0000, /* R20948 */ + 0x0000, /* R20949 */ + 0x0000, /* R20950 */ + 0x0000, /* R20951 */ + 0x0000, /* R20952 */ + 0x0000, /* R20953 */ + 0x0000, /* R20954 */ + 0x0000, /* R20955 */ + 0x0000, /* R20956 */ + 0x0000, /* R20957 */ + 0x0000, /* R20958 */ + 0x0000, /* R20959 */ + 0x0000, /* R20960 */ + 0x0000, /* R20961 */ + 0x0000, /* R20962 */ + 0x0000, /* R20963 */ + 0x0000, /* R20964 */ + 0x0000, /* R20965 */ + 0x0000, /* R20966 */ + 0x0000, /* R20967 */ + 0x0000, /* R20968 */ + 0x0000, /* R20969 */ + 0x0000, /* R20970 */ + 0x0000, /* R20971 */ + 0x0000, /* R20972 */ + 0x0000, /* R20973 */ + 0x0000, /* R20974 */ + 0x0000, /* R20975 */ + 0x0000, /* R20976 */ + 0x0000, /* R20977 */ + 0x0000, /* R20978 */ + 0x0000, /* R20979 */ + 0x0000, /* R20980 */ + 0x0000, /* R20981 */ + 0x0000, /* R20982 */ + 0x0000, /* R20983 */ + 0x0000, /* R20984 */ + 0x0000, /* R20985 */ + 0x0000, /* R20986 */ + 0x0000, /* R20987 */ + 0x0000, /* R20988 */ + 0x0000, /* R20989 */ + 0x0000, /* R20990 */ + 0x0000, /* R20991 */ + 0x008C, /* R20992 - VSS_XHD2_1 */ + 0x0200, /* R20993 - VSS_XHD2_0 */ + 0x0035, /* R20994 - VSS_XHD3_1 */ + 0x0700, /* R20995 - VSS_XHD3_0 */ + 0x003A, /* R20996 - VSS_XHN1_1 */ + 0x4100, /* R20997 - VSS_XHN1_0 */ + 0x008B, /* R20998 - VSS_XHN2_1 */ + 0x7D00, /* R20999 - VSS_XHN2_0 */ + 0x003A, /* R21000 - VSS_XHN3_1 */ + 0x4100, /* R21001 - VSS_XHN3_0 */ + 0x008C, /* R21002 - VSS_XLA_1 */ + 0xFEE8, /* R21003 - VSS_XLA_0 */ + 0x0078, /* R21004 - VSS_XLB_1 */ + 0x0000, /* R21005 - VSS_XLB_0 */ + 0x003F, /* R21006 - VSS_XLG_1 */ + 0xB260, /* R21007 - VSS_XLG_0 */ + 0x002D, /* R21008 - VSS_PG2_1 */ + 0x1818, /* R21009 - VSS_PG2_0 */ + 0x0020, /* R21010 - VSS_PG_1 */ + 0x0000, /* R21011 - VSS_PG_0 */ + 0x00F1, /* R21012 - VSS_XTD1_1 */ + 0x8340, /* R21013 - VSS_XTD1_0 */ + 0x00FB, /* R21014 - VSS_XTD2_1 */ + 0x8300, /* R21015 - VSS_XTD2_0 */ + 0x00EE, /* R21016 - VSS_XTD3_1 */ + 0xAEC0, /* R21017 - VSS_XTD3_0 */ + 0x00FB, /* R21018 - VSS_XTD4_1 */ + 0xAC40, /* R21019 - VSS_XTD4_0 */ + 0x00F1, /* R21020 - VSS_XTD5_1 */ + 0x7F80, /* R21021 - VSS_XTD5_0 */ + 0x00F4, /* R21022 - VSS_XTD6_1 */ + 0x3B40, /* R21023 - VSS_XTD6_0 */ + 0x00F5, /* R21024 - VSS_XTD7_1 */ + 0xFB00, /* R21025 - VSS_XTD7_0 */ + 0x00EA, /* R21026 - VSS_XTD8_1 */ + 0x10C0, /* R21027 - VSS_XTD8_0 */ + 0x00FC, /* R21028 - VSS_XTD9_1 */ + 0xC580, /* R21029 - VSS_XTD9_0 */ + 0x00E2, /* R21030 - VSS_XTD10_1 */ + 0x75C0, /* R21031 - VSS_XTD10_0 */ + 0x0004, /* R21032 - VSS_XTD11_1 */ + 0xB480, /* R21033 - VSS_XTD11_0 */ + 0x00D4, /* R21034 - VSS_XTD12_1 */ + 0xF980, /* R21035 - VSS_XTD12_0 */ + 0x0004, /* R21036 - VSS_XTD13_1 */ + 0x9140, /* R21037 - VSS_XTD13_0 */ + 0x00D8, /* R21038 - VSS_XTD14_1 */ + 0xA480, /* R21039 - VSS_XTD14_0 */ + 0x0002, /* R21040 - VSS_XTD15_1 */ + 0x3DC0, /* R21041 - VSS_XTD15_0 */ + 0x00CF, /* R21042 - VSS_XTD16_1 */ + 0x7A80, /* R21043 - VSS_XTD16_0 */ + 0x00DC, /* R21044 - VSS_XTD17_1 */ + 0x0600, /* R21045 - VSS_XTD17_0 */ + 0x00F2, /* R21046 - VSS_XTD18_1 */ + 0xDAC0, /* R21047 - VSS_XTD18_0 */ + 0x00BA, /* R21048 - VSS_XTD19_1 */ + 0xF340, /* R21049 - VSS_XTD19_0 */ + 0x000A, /* R21050 - VSS_XTD20_1 */ + 0x7940, /* R21051 - VSS_XTD20_0 */ + 0x001C, /* R21052 - VSS_XTD21_1 */ + 0x0680, /* R21053 - VSS_XTD21_0 */ + 0x00FD, /* R21054 - VSS_XTD22_1 */ + 0x2D00, /* R21055 - VSS_XTD22_0 */ + 0x001C, /* R21056 - VSS_XTD23_1 */ + 0xE840, /* R21057 - VSS_XTD23_0 */ + 0x000D, /* R21058 - VSS_XTD24_1 */ + 0xDC40, /* R21059 - VSS_XTD24_0 */ + 0x00FC, /* R21060 - VSS_XTD25_1 */ + 0x9D00, /* R21061 - VSS_XTD25_0 */ + 0x0009, /* R21062 - VSS_XTD26_1 */ + 0x5580, /* R21063 - VSS_XTD26_0 */ + 0x00FE, /* R21064 - VSS_XTD27_1 */ + 0x7E80, /* R21065 - VSS_XTD27_0 */ + 0x000E, /* R21066 - VSS_XTD28_1 */ + 0xAB40, /* R21067 - VSS_XTD28_0 */ + 0x00F9, /* R21068 - VSS_XTD29_1 */ + 0x9880, /* R21069 - VSS_XTD29_0 */ + 0x0009, /* R21070 - VSS_XTD30_1 */ + 0x87C0, /* R21071 - VSS_XTD30_0 */ + 0x00FD, /* R21072 - VSS_XTD31_1 */ + 0x2C40, /* R21073 - VSS_XTD31_0 */ + 0x0009, /* R21074 - VSS_XTD32_1 */ + 0x4800, /* R21075 - VSS_XTD32_0 */ + 0x0003, /* R21076 - VSS_XTS1_1 */ + 0x5F40, /* R21077 - VSS_XTS1_0 */ + 0x0000, /* R21078 - VSS_XTS2_1 */ + 0x8700, /* R21079 - VSS_XTS2_0 */ + 0x00FA, /* R21080 - VSS_XTS3_1 */ + 0xE4C0, /* R21081 - VSS_XTS3_0 */ + 0x0000, /* R21082 - VSS_XTS4_1 */ + 0x0B40, /* R21083 - VSS_XTS4_0 */ + 0x0004, /* R21084 - VSS_XTS5_1 */ + 0xE180, /* R21085 - VSS_XTS5_0 */ + 0x0001, /* R21086 - VSS_XTS6_1 */ + 0x1F40, /* R21087 - VSS_XTS6_0 */ + 0x00F8, /* R21088 - VSS_XTS7_1 */ + 0xB000, /* R21089 - VSS_XTS7_0 */ + 0x00FB, /* R21090 - VSS_XTS8_1 */ + 0xCBC0, /* R21091 - VSS_XTS8_0 */ + 0x0004, /* R21092 - VSS_XTS9_1 */ + 0xF380, /* R21093 - VSS_XTS9_0 */ + 0x0007, /* R21094 - VSS_XTS10_1 */ + 0xDF40, /* R21095 - VSS_XTS10_0 */ + 0x00FF, /* R21096 - VSS_XTS11_1 */ + 0x0700, /* R21097 - VSS_XTS11_0 */ + 0x00EF, /* R21098 - VSS_XTS12_1 */ + 0xD700, /* R21099 - VSS_XTS12_0 */ + 0x00FB, /* R21100 - VSS_XTS13_1 */ + 0xAF40, /* R21101 - VSS_XTS13_0 */ + 0x0010, /* R21102 - VSS_XTS14_1 */ + 0x8A80, /* R21103 - VSS_XTS14_0 */ + 0x0011, /* R21104 - VSS_XTS15_1 */ + 0x07C0, /* R21105 - VSS_XTS15_0 */ + 0x00E0, /* R21106 - VSS_XTS16_1 */ + 0x0800, /* R21107 - VSS_XTS16_0 */ + 0x00D2, /* R21108 - VSS_XTS17_1 */ + 0x7600, /* R21109 - VSS_XTS17_0 */ + 0x0020, /* R21110 - VSS_XTS18_1 */ + 0xCF40, /* R21111 - VSS_XTS18_0 */ + 0x0030, /* R21112 - VSS_XTS19_1 */ + 0x2340, /* R21113 - VSS_XTS19_0 */ + 0x00FD, /* R21114 - VSS_XTS20_1 */ + 0x69C0, /* R21115 - VSS_XTS20_0 */ + 0x0028, /* R21116 - VSS_XTS21_1 */ + 0x3500, /* R21117 - VSS_XTS21_0 */ + 0x0006, /* R21118 - VSS_XTS22_1 */ + 0x3300, /* R21119 - VSS_XTS22_0 */ + 0x00D9, /* R21120 - VSS_XTS23_1 */ + 0xF6C0, /* R21121 - VSS_XTS23_0 */ + 0x00F3, /* R21122 - VSS_XTS24_1 */ + 0x3340, /* R21123 - VSS_XTS24_0 */ + 0x000F, /* R21124 - VSS_XTS25_1 */ + 0x4200, /* R21125 - VSS_XTS25_0 */ + 0x0004, /* R21126 - VSS_XTS26_1 */ + 0x0C80, /* R21127 - VSS_XTS26_0 */ + 0x00FB, /* R21128 - VSS_XTS27_1 */ + 0x3F80, /* R21129 - VSS_XTS27_0 */ + 0x00F7, /* R21130 - VSS_XTS28_1 */ + 0x57C0, /* R21131 - VSS_XTS28_0 */ + 0x0003, /* R21132 - VSS_XTS29_1 */ + 0x5400, /* R21133 - VSS_XTS29_0 */ + 0x0000, /* R21134 - VSS_XTS30_1 */ + 0xC6C0, /* R21135 - VSS_XTS30_0 */ + 0x0003, /* R21136 - VSS_XTS31_1 */ + 0x12C0, /* R21137 - VSS_XTS31_0 */ + 0x00FD, /* R21138 - VSS_XTS32_1 */ + 0x8580, /* R21139 - VSS_XTS32_0 */ +}; + +const struct wm8962_reg_access wm8962_reg_access[WM8962_MAX_REGISTER + 1] = { + { 0x00FF, 0x01FF, 0x0000 }, /* R0 - Left Input volume */ + { 0xFEFF, 0x01FF, 0xFFFF }, /* R1 - Right Input volume */ + { 0x00FF, 0x01FF, 0x0000 }, /* R2 - HPOUTL volume */ + { 0x00FF, 0x01FF, 0x0000 }, /* R3 - HPOUTR volume */ + { 0x07FE, 0x07FE, 0xFFFF }, /* R4 - Clocking1 */ + { 0x007F, 0x007F, 0x0000 }, /* R5 - ADC & DAC Control 1 */ + { 0x37ED, 0x37ED, 0x0000 }, /* R6 - ADC & DAC Control 2 */ + { 0x1FFF, 0x1FFF, 0x0000 }, /* R7 - Audio Interface 0 */ + { 0x0FEF, 0x0FEF, 0xFFFF }, /* R8 - Clocking2 */ + { 0x0B9F, 0x039F, 0x0000 }, /* R9 - Audio Interface 1 */ + { 0x00FF, 0x01FF, 0x0000 }, /* R10 - Left DAC volume */ + { 0x00FF, 0x01FF, 0x0000 }, /* R11 - Right DAC volume */ + { 0x0000, 0x0000, 0x0000 }, /* R12 */ + { 0x0000, 0x0000, 0x0000 }, /* R13 */ + { 0x07FF, 0x07FF, 0x0000 }, /* R14 - Audio Interface 2 */ + { 0xFFFF, 0xFFFF, 0xFFFF }, /* R15 - Software Reset */ + { 0x0000, 0x0000, 0x0000 }, /* R16 */ + { 0x07FF, 0x07FF, 0x0000 }, /* R17 - ALC1 */ + { 0xF8FF, 0x00FF, 0xFFFF }, /* R18 - ALC2 */ + { 0x1DFF, 0x1DFF, 0x0000 }, /* R19 - ALC3 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20 - Noise Gate */ + { 0x00FF, 0x01FF, 0x0000 }, /* R21 - Left ADC volume */ + { 0x00FF, 0x01FF, 0x0000 }, /* R22 - Right ADC volume */ + { 0x0161, 0x0161, 0x0000 }, /* R23 - Additional control(1) */ + { 0x0008, 0x0008, 0x0000 }, /* R24 - Additional control(2) */ + { 0x07FE, 0x07FE, 0x0000 }, /* R25 - Pwr Mgmt (1) */ + { 0x01FB, 0x01FB, 0x0000 }, /* R26 - Pwr Mgmt (2) */ + { 0x0017, 0x0017, 0x0000 }, /* R27 - Additional Control (3) */ + { 0x001C, 0x001C, 0x0000 }, /* R28 - Anti-pop */ + { 0x0000, 0x0000, 0x0000 }, /* R29 */ + { 0xFFFE, 0xFFFE, 0x0000 }, /* R30 - Clocking 3 */ + { 0x000F, 0x000F, 0x0000 }, /* R31 - Input mixer control (1) */ + { 0x01FF, 0x01FF, 0x0000 }, /* R32 - Left input mixer volume */ + { 0x01FF, 0x01FF, 0x0000 }, /* R33 - Right input mixer volume */ + { 0x003F, 0x003F, 0x0000 }, /* R34 - Input mixer control (2) */ + { 0x003F, 0x003F, 0x0000 }, /* R35 - Input bias control */ + { 0x0000, 0x0000, 0x0000 }, /* R36 */ + { 0x001F, 0x001F, 0x0000 }, /* R37 - Left input PGA control */ + { 0x001F, 0x001F, 0x0000 }, /* R38 - Right input PGA control */ + { 0x0000, 0x0000, 0x0000 }, /* R39 */ + { 0x00FF, 0x01FF, 0x0000 }, /* R40 - SPKOUTL volume */ + { 0x00FF, 0x01FF, 0x0000 }, /* R41 - SPKOUTR volume */ + { 0x0000, 0x0000, 0x0000 }, /* R42 */ + { 0x0000, 0x0000, 0x0000 }, /* R43 */ + { 0x0000, 0x0000, 0x0000 }, /* R44 */ + { 0x0000, 0x0000, 0x0000 }, /* R45 */ + { 0x0000, 0x0000, 0x0000 }, /* R46 */ + { 0x000F, 0x0000, 0x0000 }, /* R47 - Thermal Shutdown Status */ + { 0x7EC7, 0x7E07, 0x0000 }, /* R48 - Additional Control (4) */ + { 0x00D3, 0x00D7, 0xFFFF }, /* R49 - Class D Control 1 */ + { 0x0000, 0x0000, 0x0000 }, /* R50 */ + { 0x0047, 0x0047, 0x0000 }, /* R51 - Class D Control 2 */ + { 0x0000, 0x0000, 0x0000 }, /* R52 */ + { 0x0000, 0x0000, 0x0000 }, /* R53 */ + { 0x0000, 0x0000, 0x0000 }, /* R54 */ + { 0x0000, 0x0000, 0x0000 }, /* R55 */ + { 0x001E, 0x001E, 0x0000 }, /* R56 - Clocking 4 */ + { 0x02FC, 0x02FC, 0x0000 }, /* R57 - DAC DSP Mixing (1) */ + { 0x00FC, 0x00FC, 0x0000 }, /* R58 - DAC DSP Mixing (2) */ + { 0x0000, 0x0000, 0x0000 }, /* R59 */ + { 0x00CC, 0x00CC, 0x0000 }, /* R60 - DC Servo 0 */ + { 0x00DD, 0x00DD, 0x0000 }, /* R61 - DC Servo 1 */ + { 0x0000, 0x0000, 0x0000 }, /* R62 */ + { 0x0000, 0x0000, 0x0000 }, /* R63 */ + { 0x3F80, 0x3F80, 0x0000 }, /* R64 - DC Servo 4 */ + { 0x0000, 0x0000, 0x0000 }, /* R65 */ + { 0x0780, 0x0000, 0xFFFF }, /* R66 - DC Servo 6 */ + { 0x0000, 0x0000, 0x0000 }, /* R67 */ + { 0x0007, 0x0007, 0x0000 }, /* R68 - Analogue PGA Bias */ + { 0x00FF, 0x00FF, 0x0000 }, /* R69 - Analogue HP 0 */ + { 0x0000, 0x0000, 0x0000 }, /* R70 */ + { 0x01FF, 0x01FF, 0x0000 }, /* R71 - Analogue HP 2 */ + { 0x0001, 0x0001, 0x0000 }, /* R72 - Charge Pump 1 */ + { 0x0000, 0x0000, 0x0000 }, /* R73 */ + { 0x0000, 0x0000, 0x0000 }, /* R74 */ + { 0x0000, 0x0000, 0x0000 }, /* R75 */ + { 0x0000, 0x0000, 0x0000 }, /* R76 */ + { 0x0000, 0x0000, 0x0000 }, /* R77 */ + { 0x0000, 0x0000, 0x0000 }, /* R78 */ + { 0x0000, 0x0000, 0x0000 }, /* R79 */ + { 0x0000, 0x0000, 0x0000 }, /* R80 */ + { 0x0000, 0x0000, 0x0000 }, /* R81 */ + { 0x0001, 0x0001, 0x0000 }, /* R82 - Charge Pump B */ + { 0x0000, 0x0000, 0x0000 }, /* R83 */ + { 0x0000, 0x0000, 0x0000 }, /* R84 */ + { 0x0000, 0x0000, 0x0000 }, /* R85 */ + { 0x0000, 0x0000, 0x0000 }, /* R86 */ + { 0x00A0, 0x00A0, 0x0000 }, /* R87 - Write Sequencer Control 1 */ + { 0x0000, 0x0000, 0x0000 }, /* R88 */ + { 0x0000, 0x0000, 0x0000 }, /* R89 */ + { 0x007F, 0x01FF, 0x0000 }, /* R90 - Write Sequencer Control 2 */ + { 0x0000, 0x0000, 0x0000 }, /* R91 */ + { 0x0000, 0x0000, 0x0000 }, /* R92 */ + { 0x03F9, 0x0000, 0x0000 }, /* R93 - Write Sequencer Control 3 */ + { 0x0070, 0x0070, 0x0000 }, /* R94 - Control Interface */ + { 0x0000, 0x0000, 0x0000 }, /* R95 */ + { 0x0000, 0x0000, 0x0000 }, /* R96 */ + { 0x0000, 0x0000, 0x0000 }, /* R97 */ + { 0x0000, 0x0000, 0x0000 }, /* R98 */ + { 0x000F, 0x000F, 0x0000 }, /* R99 - Mixer Enables */ + { 0x00BF, 0x00BF, 0x0000 }, /* R100 - Headphone Mixer (1) */ + { 0x00BF, 0x00BF, 0x0000 }, /* R101 - Headphone Mixer (2) */ + { 0x01FF, 0x01FF, 0x0000 }, /* R102 - Headphone Mixer (3) */ + { 0x01FF, 0x01FF, 0x0000 }, /* R103 - Headphone Mixer (4) */ + { 0x0000, 0x0000, 0x0000 }, /* R104 */ + { 0x00BF, 0x00BF, 0x0000 }, /* R105 - Speaker Mixer (1) */ + { 0x00BF, 0x00BF, 0x0000 }, /* R106 - Speaker Mixer (2) */ + { 0x01FF, 0x01FF, 0x0000 }, /* R107 - Speaker Mixer (3) */ + { 0x01FF, 0x01FF, 0x0000 }, /* R108 - Speaker Mixer (4) */ + { 0x00F0, 0x00F0, 0x0000 }, /* R109 - Speaker Mixer (5) */ + { 0x00F7, 0x00F7, 0x0000 }, /* R110 - Beep Generator (1) */ + { 0x0000, 0x0000, 0x0000 }, /* R111 */ + { 0x0000, 0x0000, 0x0000 }, /* R112 */ + { 0x0000, 0x0000, 0x0000 }, /* R113 */ + { 0x0000, 0x0000, 0x0000 }, /* R114 */ + { 0x001F, 0x001F, 0x0000 }, /* R115 - Oscillator Trim (3) */ + { 0x001F, 0x001F, 0x0000 }, /* R116 - Oscillator Trim (4) */ + { 0x0000, 0x0000, 0x0000 }, /* R117 */ + { 0x0000, 0x0000, 0x0000 }, /* R118 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R119 - Oscillator Trim (7) */ + { 0x0000, 0x0000, 0x0000 }, /* R120 */ + { 0x0000, 0x0000, 0x0000 }, /* R121 */ + { 0x0000, 0x0000, 0x0000 }, /* R122 */ + { 0x0000, 0x0000, 0x0000 }, /* R123 */ + { 0x0079, 0x0079, 0x0000 }, /* R124 - Analogue Clocking1 */ + { 0x00DF, 0x00DF, 0x0000 }, /* R125 - Analogue Clocking2 */ + { 0x000D, 0x000D, 0x0000 }, /* R126 - Analogue Clocking3 */ + { 0x0000, 0xFFFF, 0x0000 }, /* R127 - PLL Software Reset */ + { 0x0000, 0x0000, 0x0000 }, /* R128 */ + { 0x00B0, 0x00B0, 0x0000 }, /* R129 - PLL2 */ + { 0x0000, 0x0000, 0x0000 }, /* R130 */ + { 0x0003, 0x0003, 0x0000 }, /* R131 - PLL 4 */ + { 0x0000, 0x0000, 0x0000 }, /* R132 */ + { 0x0000, 0x0000, 0x0000 }, /* R133 */ + { 0x0000, 0x0000, 0x0000 }, /* R134 */ + { 0x0000, 0x0000, 0x0000 }, /* R135 */ + { 0x005F, 0x005F, 0x0000 }, /* R136 - PLL 9 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R137 - PLL 10 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R138 - PLL 11 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R139 - PLL 12 */ + { 0x005F, 0x005F, 0x0000 }, /* R140 - PLL 13 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R141 - PLL 14 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R142 - PLL 15 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R143 - PLL 16 */ + { 0x0000, 0x0000, 0x0000 }, /* R144 */ + { 0x0000, 0x0000, 0x0000 }, /* R145 */ + { 0x0000, 0x0000, 0x0000 }, /* R146 */ + { 0x0000, 0x0000, 0x0000 }, /* R147 */ + { 0x0000, 0x0000, 0x0000 }, /* R148 */ + { 0x0000, 0x0000, 0x0000 }, /* R149 */ + { 0x0000, 0x0000, 0x0000 }, /* R150 */ + { 0x0000, 0x0000, 0x0000 }, /* R151 */ + { 0x0000, 0x0000, 0x0000 }, /* R152 */ + { 0x0000, 0x0000, 0x0000 }, /* R153 */ + { 0x0000, 0x0000, 0x0000 }, /* R154 */ + { 0x0067, 0x0067, 0x0000 }, /* R155 - FLL Control (1) */ + { 0x01FB, 0x01FB, 0x0000 }, /* R156 - FLL Control (2) */ + { 0x0007, 0x0007, 0x0000 }, /* R157 - FLL Control (3) */ + { 0x0000, 0x0000, 0x0000 }, /* R158 */ + { 0x007F, 0x007F, 0x0000 }, /* R159 - FLL Control (5) */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R160 - FLL Control (6) */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R161 - FLL Control (7) */ + { 0x03FF, 0x03FF, 0x0000 }, /* R162 - FLL Control (8) */ + { 0x0000, 0x0000, 0x0000 }, /* R163 */ + { 0x0000, 0x0000, 0x0000 }, /* R164 */ + { 0x0000, 0x0000, 0x0000 }, /* R165 */ + { 0x0000, 0x0000, 0x0000 }, /* R166 */ + { 0x0000, 0x0000, 0x0000 }, /* R167 */ + { 0x0000, 0x0000, 0x0000 }, /* R168 */ + { 0x0000, 0x0000, 0x0000 }, /* R169 */ + { 0x0000, 0x0000, 0x0000 }, /* R170 */ + { 0x0000, 0x0000, 0x0000 }, /* R171 */ + { 0x0000, 0x0000, 0x0000 }, /* R172 */ + { 0x0000, 0x0000, 0x0000 }, /* R173 */ + { 0x0000, 0x0000, 0x0000 }, /* R174 */ + { 0x0000, 0x0000, 0x0000 }, /* R175 */ + { 0x0000, 0x0000, 0x0000 }, /* R176 */ + { 0x0000, 0x0000, 0x0000 }, /* R177 */ + { 0x0000, 0x0000, 0x0000 }, /* R178 */ + { 0x0000, 0x0000, 0x0000 }, /* R179 */ + { 0x0000, 0x0000, 0x0000 }, /* R180 */ + { 0x0000, 0x0000, 0x0000 }, /* R181 */ + { 0x0000, 0x0000, 0x0000 }, /* R182 */ + { 0x0000, 0x0000, 0x0000 }, /* R183 */ + { 0x0000, 0x0000, 0x0000 }, /* R184 */ + { 0x0000, 0x0000, 0x0000 }, /* R185 */ + { 0x0000, 0x0000, 0x0000 }, /* R186 */ + { 0x0000, 0x0000, 0x0000 }, /* R187 */ + { 0x0000, 0x0000, 0x0000 }, /* R188 */ + { 0x0000, 0x0000, 0x0000 }, /* R189 */ + { 0x0000, 0x0000, 0x0000 }, /* R190 */ + { 0x0000, 0x0000, 0x0000 }, /* R191 */ + { 0x0000, 0x0000, 0x0000 }, /* R192 */ + { 0x0000, 0x0000, 0x0000 }, /* R193 */ + { 0x0000, 0x0000, 0x0000 }, /* R194 */ + { 0x0000, 0x0000, 0x0000 }, /* R195 */ + { 0x0000, 0x0000, 0x0000 }, /* R196 */ + { 0x0000, 0x0000, 0x0000 }, /* R197 */ + { 0x0000, 0x0000, 0x0000 }, /* R198 */ + { 0x0000, 0x0000, 0x0000 }, /* R199 */ + { 0x0000, 0x0000, 0x0000 }, /* R200 */ + { 0x0000, 0x0000, 0x0000 }, /* R201 */ + { 0x0000, 0x0000, 0x0000 }, /* R202 */ + { 0x0000, 0x0000, 0x0000 }, /* R203 */ + { 0x0000, 0x0000, 0x0000 }, /* R204 */ + { 0x0000, 0x0000, 0x0000 }, /* R205 */ + { 0x0000, 0x0000, 0x0000 }, /* R206 */ + { 0x0000, 0x0000, 0x0000 }, /* R207 */ + { 0x0000, 0x0000, 0x0000 }, /* R208 */ + { 0x0000, 0x0000, 0x0000 }, /* R209 */ + { 0x0000, 0x0000, 0x0000 }, /* R210 */ + { 0x0000, 0x0000, 0x0000 }, /* R211 */ + { 0x0000, 0x0000, 0x0000 }, /* R212 */ + { 0x0000, 0x0000, 0x0000 }, /* R213 */ + { 0x0000, 0x0000, 0x0000 }, /* R214 */ + { 0x0000, 0x0000, 0x0000 }, /* R215 */ + { 0x0000, 0x0000, 0x0000 }, /* R216 */ + { 0x0000, 0x0000, 0x0000 }, /* R217 */ + { 0x0000, 0x0000, 0x0000 }, /* R218 */ + { 0x0000, 0x0000, 0x0000 }, /* R219 */ + { 0x0000, 0x0000, 0x0000 }, /* R220 */ + { 0x0000, 0x0000, 0x0000 }, /* R221 */ + { 0x0000, 0x0000, 0x0000 }, /* R222 */ + { 0x0000, 0x0000, 0x0000 }, /* R223 */ + { 0x0000, 0x0000, 0x0000 }, /* R224 */ + { 0x0000, 0x0000, 0x0000 }, /* R225 */ + { 0x0000, 0x0000, 0x0000 }, /* R226 */ + { 0x0000, 0x0000, 0x0000 }, /* R227 */ + { 0x0000, 0x0000, 0x0000 }, /* R228 */ + { 0x0000, 0x0000, 0x0000 }, /* R229 */ + { 0x0000, 0x0000, 0x0000 }, /* R230 */ + { 0x0000, 0x0000, 0x0000 }, /* R231 */ + { 0x0000, 0x0000, 0x0000 }, /* R232 */ + { 0x0000, 0x0000, 0x0000 }, /* R233 */ + { 0x0000, 0x0000, 0x0000 }, /* R234 */ + { 0x0000, 0x0000, 0x0000 }, /* R235 */ + { 0x0000, 0x0000, 0x0000 }, /* R236 */ + { 0x0000, 0x0000, 0x0000 }, /* R237 */ + { 0x0000, 0x0000, 0x0000 }, /* R238 */ + { 0x0000, 0x0000, 0x0000 }, /* R239 */ + { 0x0000, 0x0000, 0x0000 }, /* R240 */ + { 0x0000, 0x0000, 0x0000 }, /* R241 */ + { 0x0000, 0x0000, 0x0000 }, /* R242 */ + { 0x0000, 0x0000, 0x0000 }, /* R243 */ + { 0x0000, 0x0000, 0x0000 }, /* R244 */ + { 0x0000, 0x0000, 0x0000 }, /* R245 */ + { 0x0000, 0x0000, 0x0000 }, /* R246 */ + { 0x0000, 0x0000, 0x0000 }, /* R247 */ + { 0x0000, 0x0000, 0x0000 }, /* R248 */ + { 0x0000, 0x0000, 0x0000 }, /* R249 */ + { 0x0000, 0x0000, 0x0000 }, /* R250 */ + { 0x0000, 0x0000, 0x0000 }, /* R251 */ + { 0x0005, 0x0005, 0x0000 }, /* R252 - General test 1 */ + { 0x0000, 0x0000, 0x0000 }, /* R253 */ + { 0x0000, 0x0000, 0x0000 }, /* R254 */ + { 0x0000, 0x0000, 0x0000 }, /* R255 */ + { 0x000F, 0x000F, 0x0000 }, /* R256 - DF1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R257 - DF2 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R258 - DF3 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R259 - DF4 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R260 - DF5 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R261 - DF6 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R262 - DF7 */ + { 0x0000, 0x0000, 0x0000 }, /* R263 */ + { 0x0003, 0x0003, 0x0000 }, /* R264 - LHPF1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R265 - LHPF2 */ + { 0x0000, 0x0000, 0x0000 }, /* R266 */ + { 0x0000, 0x0000, 0x0000 }, /* R267 */ + { 0x0077, 0x0077, 0x0000 }, /* R268 - THREED1 */ + { 0xFFFC, 0xFFFC, 0x0000 }, /* R269 - THREED2 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R270 - THREED3 */ + { 0xFFFC, 0xFFFC, 0x0000 }, /* R271 - THREED4 */ + { 0x0000, 0x0000, 0x0000 }, /* R272 */ + { 0x0000, 0x0000, 0x0000 }, /* R273 */ + { 0x0000, 0x0000, 0x0000 }, /* R274 */ + { 0x0000, 0x0000, 0x0000 }, /* R275 */ + { 0x7FFF, 0x7FFF, 0x0000 }, /* R276 - DRC 1 */ + { 0x1FFF, 0x1FFF, 0x0000 }, /* R277 - DRC 2 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R278 - DRC 3 */ + { 0x07FF, 0x07FF, 0x0000 }, /* R279 - DRC 4 */ + { 0x03FF, 0x03FF, 0x0000 }, /* R280 - DRC 5 */ + { 0x0000, 0x0000, 0x0000 }, /* R281 */ + { 0x0000, 0x0000, 0x0000 }, /* R282 */ + { 0x0000, 0x0000, 0x0000 }, /* R283 */ + { 0x0000, 0x0000, 0x0000 }, /* R284 */ + { 0x0003, 0x0003, 0x0000 }, /* R285 - Tloopback */ + { 0x0000, 0x0000, 0x0000 }, /* R286 */ + { 0x0000, 0x0000, 0x0000 }, /* R287 */ + { 0x0000, 0x0000, 0x0000 }, /* R288 */ + { 0x0000, 0x0000, 0x0000 }, /* R289 */ + { 0x0000, 0x0000, 0x0000 }, /* R290 */ + { 0x0000, 0x0000, 0x0000 }, /* R291 */ + { 0x0000, 0x0000, 0x0000 }, /* R292 */ + { 0x0000, 0x0000, 0x0000 }, /* R293 */ + { 0x0000, 0x0000, 0x0000 }, /* R294 */ + { 0x0000, 0x0000, 0x0000 }, /* R295 */ + { 0x0000, 0x0000, 0x0000 }, /* R296 */ + { 0x0000, 0x0000, 0x0000 }, /* R297 */ + { 0x0000, 0x0000, 0x0000 }, /* R298 */ + { 0x0000, 0x0000, 0x0000 }, /* R299 */ + { 0x0000, 0x0000, 0x0000 }, /* R300 */ + { 0x0000, 0x0000, 0x0000 }, /* R301 */ + { 0x0000, 0x0000, 0x0000 }, /* R302 */ + { 0x0000, 0x0000, 0x0000 }, /* R303 */ + { 0x0000, 0x0000, 0x0000 }, /* R304 */ + { 0x0000, 0x0000, 0x0000 }, /* R305 */ + { 0x0000, 0x0000, 0x0000 }, /* R306 */ + { 0x0000, 0x0000, 0x0000 }, /* R307 */ + { 0x0000, 0x0000, 0x0000 }, /* R308 */ + { 0x0000, 0x0000, 0x0000 }, /* R309 */ + { 0x0000, 0x0000, 0x0000 }, /* R310 */ + { 0x0000, 0x0000, 0x0000 }, /* R311 */ + { 0x0000, 0x0000, 0x0000 }, /* R312 */ + { 0x0000, 0x0000, 0x0000 }, /* R313 */ + { 0x0000, 0x0000, 0x0000 }, /* R314 */ + { 0x0000, 0x0000, 0x0000 }, /* R315 */ + { 0x0000, 0x0000, 0x0000 }, /* R316 */ + { 0x0000, 0x0000, 0x0000 }, /* R317 */ + { 0x0000, 0x0000, 0x0000 }, /* R318 */ + { 0x0000, 0x0000, 0x0000 }, /* R319 */ + { 0x0000, 0x0000, 0x0000 }, /* R320 */ + { 0x0000, 0x0000, 0x0000 }, /* R321 */ + { 0x0000, 0x0000, 0x0000 }, /* R322 */ + { 0x0000, 0x0000, 0x0000 }, /* R323 */ + { 0x0000, 0x0000, 0x0000 }, /* R324 */ + { 0x0000, 0x0000, 0x0000 }, /* R325 */ + { 0x0000, 0x0000, 0x0000 }, /* R326 */ + { 0x0000, 0x0000, 0x0000 }, /* R327 */ + { 0x0000, 0x0000, 0x0000 }, /* R328 */ + { 0x0000, 0x0000, 0x0000 }, /* R329 */ + { 0x0000, 0x0000, 0x0000 }, /* R330 */ + { 0x0000, 0x0000, 0x0000 }, /* R331 */ + { 0x0000, 0x0000, 0x0000 }, /* R332 */ + { 0x0000, 0x0000, 0x0000 }, /* R333 */ + { 0x0000, 0x0000, 0x0000 }, /* R334 */ + { 0x0007, 0x0007, 0x0000 }, /* R335 - EQ1 */ + { 0xFFFE, 0xFFFE, 0x0000 }, /* R336 - EQ2 */ + { 0xFFC0, 0xFFC0, 0x0000 }, /* R337 - EQ3 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R338 - EQ4 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R339 - EQ5 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R340 - EQ6 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R341 - EQ7 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R342 - EQ8 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R343 - EQ9 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R344 - EQ10 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R345 - EQ11 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R346 - EQ12 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R347 - EQ13 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R348 - EQ14 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R349 - EQ15 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R350 - EQ16 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R351 - EQ17 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R352 - EQ18 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R353 - EQ19 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R354 - EQ20 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R355 - EQ21 */ + { 0xFFFE, 0xFFFE, 0x0000 }, /* R356 - EQ22 */ + { 0xFFC0, 0xFFC0, 0x0000 }, /* R357 - EQ23 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R358 - EQ24 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R359 - EQ25 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R360 - EQ26 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R361 - EQ27 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R362 - EQ28 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R363 - EQ29 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R364 - EQ30 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R365 - EQ31 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R366 - EQ32 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R367 - EQ33 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R368 - EQ34 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R369 - EQ35 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R370 - EQ36 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R371 - EQ37 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R372 - EQ38 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R373 - EQ39 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R374 - EQ40 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R375 - EQ41 */ + { 0x0000, 0x0000, 0x0000 }, /* R376 */ + { 0x0000, 0x0000, 0x0000 }, /* R377 */ + { 0x0000, 0x0000, 0x0000 }, /* R378 */ + { 0x0000, 0x0000, 0x0000 }, /* R379 */ + { 0x0000, 0x0000, 0x0000 }, /* R380 */ + { 0x0000, 0x0000, 0x0000 }, /* R381 */ + { 0x0000, 0x0000, 0x0000 }, /* R382 */ + { 0x0000, 0x0000, 0x0000 }, /* R383 */ + { 0x0000, 0x0000, 0x0000 }, /* R384 */ + { 0x0000, 0x0000, 0x0000 }, /* R385 */ + { 0x0000, 0x0000, 0x0000 }, /* R386 */ + { 0x0000, 0x0000, 0x0000 }, /* R387 */ + { 0x0000, 0x0000, 0x0000 }, /* R388 */ + { 0x0000, 0x0000, 0x0000 }, /* R389 */ + { 0x0000, 0x0000, 0x0000 }, /* R390 */ + { 0x0000, 0x0000, 0x0000 }, /* R391 */ + { 0x0000, 0x0000, 0x0000 }, /* R392 */ + { 0x0000, 0x0000, 0x0000 }, /* R393 */ + { 0x0000, 0x0000, 0x0000 }, /* R394 */ + { 0x0000, 0x0000, 0x0000 }, /* R395 */ + { 0x0000, 0x0000, 0x0000 }, /* R396 */ + { 0x0000, 0x0000, 0x0000 }, /* R397 */ + { 0x0000, 0x0000, 0x0000 }, /* R398 */ + { 0x0000, 0x0000, 0x0000 }, /* R399 */ + { 0x0000, 0x0000, 0x0000 }, /* R400 */ + { 0x0000, 0x0000, 0x0000 }, /* R401 */ + { 0x0000, 0x0000, 0x0000 }, /* R402 */ + { 0x0000, 0x0000, 0x0000 }, /* R403 */ + { 0x0000, 0x0000, 0x0000 }, /* R404 */ + { 0x0000, 0x0000, 0x0000 }, /* R405 */ + { 0x0000, 0x0000, 0x0000 }, /* R406 */ + { 0x0000, 0x0000, 0x0000 }, /* R407 */ + { 0x0000, 0x0000, 0x0000 }, /* R408 */ + { 0x0000, 0x0000, 0x0000 }, /* R409 */ + { 0x0000, 0x0000, 0x0000 }, /* R410 */ + { 0x0000, 0x0000, 0x0000 }, /* R411 */ + { 0x0000, 0x0000, 0x0000 }, /* R412 */ + { 0x0000, 0x0000, 0x0000 }, /* R413 */ + { 0x0000, 0x0000, 0x0000 }, /* R414 */ + { 0x0000, 0x0000, 0x0000 }, /* R415 */ + { 0x0000, 0x0000, 0x0000 }, /* R416 */ + { 0x0000, 0x0000, 0x0000 }, /* R417 */ + { 0x0000, 0x0000, 0x0000 }, /* R418 */ + { 0x0000, 0x0000, 0x0000 }, /* R419 */ + { 0x0000, 0x0000, 0x0000 }, /* R420 */ + { 0x0000, 0x0000, 0x0000 }, /* R421 */ + { 0x0000, 0x0000, 0x0000 }, /* R422 */ + { 0x0000, 0x0000, 0x0000 }, /* R423 */ + { 0x0000, 0x0000, 0x0000 }, /* R424 */ + { 0x0000, 0x0000, 0x0000 }, /* R425 */ + { 0x0000, 0x0000, 0x0000 }, /* R426 */ + { 0x0000, 0x0000, 0x0000 }, /* R427 */ + { 0x0000, 0x0000, 0x0000 }, /* R428 */ + { 0x0000, 0x0000, 0x0000 }, /* R429 */ + { 0x0000, 0x0000, 0x0000 }, /* R430 */ + { 0x0000, 0x0000, 0x0000 }, /* R431 */ + { 0x0000, 0x0000, 0x0000 }, /* R432 */ + { 0x0000, 0x0000, 0x0000 }, /* R433 */ + { 0x0000, 0x0000, 0x0000 }, /* R434 */ + { 0x0000, 0x0000, 0x0000 }, /* R435 */ + { 0x0000, 0x0000, 0x0000 }, /* R436 */ + { 0x0000, 0x0000, 0x0000 }, /* R437 */ + { 0x0000, 0x0000, 0x0000 }, /* R438 */ + { 0x0000, 0x0000, 0x0000 }, /* R439 */ + { 0x0000, 0x0000, 0x0000 }, /* R440 */ + { 0x0000, 0x0000, 0x0000 }, /* R441 */ + { 0x0000, 0x0000, 0x0000 }, /* R442 */ + { 0x0000, 0x0000, 0x0000 }, /* R443 */ + { 0x0000, 0x0000, 0x0000 }, /* R444 */ + { 0x0000, 0x0000, 0x0000 }, /* R445 */ + { 0x0000, 0x0000, 0x0000 }, /* R446 */ + { 0x0000, 0x0000, 0x0000 }, /* R447 */ + { 0x0000, 0x0000, 0x0000 }, /* R448 */ + { 0x0000, 0x0000, 0x0000 }, /* R449 */ + { 0x0000, 0x0000, 0x0000 }, /* R450 */ + { 0x0000, 0x0000, 0x0000 }, /* R451 */ + { 0x0000, 0x0000, 0x0000 }, /* R452 */ + { 0x0000, 0x0000, 0x0000 }, /* R453 */ + { 0x0000, 0x0000, 0x0000 }, /* R454 */ + { 0x0000, 0x0000, 0x0000 }, /* R455 */ + { 0x0000, 0x0000, 0x0000 }, /* R456 */ + { 0x0000, 0x0000, 0x0000 }, /* R457 */ + { 0x0000, 0x0000, 0x0000 }, /* R458 */ + { 0x0000, 0x0000, 0x0000 }, /* R459 */ + { 0x0000, 0x0000, 0x0000 }, /* R460 */ + { 0x0000, 0x0000, 0x0000 }, /* R461 */ + { 0x0000, 0x0000, 0x0000 }, /* R462 */ + { 0x0000, 0x0000, 0x0000 }, /* R463 */ + { 0x0000, 0x0000, 0x0000 }, /* R464 */ + { 0x0000, 0x0000, 0x0000 }, /* R465 */ + { 0x0000, 0x0000, 0x0000 }, /* R466 */ + { 0x0000, 0x0000, 0x0000 }, /* R467 */ + { 0x0000, 0x0000, 0x0000 }, /* R468 */ + { 0x0000, 0x0000, 0x0000 }, /* R469 */ + { 0x0000, 0x0000, 0x0000 }, /* R470 */ + { 0x0000, 0x0000, 0x0000 }, /* R471 */ + { 0x0000, 0x0000, 0x0000 }, /* R472 */ + { 0x0000, 0x0000, 0x0000 }, /* R473 */ + { 0x0000, 0x0000, 0x0000 }, /* R474 */ + { 0x0000, 0x0000, 0x0000 }, /* R475 */ + { 0x0000, 0x0000, 0x0000 }, /* R476 */ + { 0x0000, 0x0000, 0x0000 }, /* R477 */ + { 0x0000, 0x0000, 0x0000 }, /* R478 */ + { 0x0000, 0x0000, 0x0000 }, /* R479 */ + { 0x0000, 0x0000, 0x0000 }, /* R480 */ + { 0x0000, 0x0000, 0x0000 }, /* R481 */ + { 0x0000, 0x0000, 0x0000 }, /* R482 */ + { 0x0000, 0x0000, 0x0000 }, /* R483 */ + { 0x0000, 0x0000, 0x0000 }, /* R484 */ + { 0x0000, 0x0000, 0x0000 }, /* R485 */ + { 0x0000, 0x0000, 0x0000 }, /* R486 */ + { 0x0000, 0x0000, 0x0000 }, /* R487 */ + { 0x0000, 0x0000, 0x0000 }, /* R488 */ + { 0x0000, 0x0000, 0x0000 }, /* R489 */ + { 0x0000, 0x0000, 0x0000 }, /* R490 */ + { 0x0000, 0x0000, 0x0000 }, /* R491 */ + { 0x0000, 0x0000, 0x0000 }, /* R492 */ + { 0x0000, 0x0000, 0x0000 }, /* R493 */ + { 0x0000, 0x0000, 0x0000 }, /* R494 */ + { 0x0000, 0x0000, 0x0000 }, /* R495 */ + { 0x0000, 0x0000, 0x0000 }, /* R496 */ + { 0x0000, 0x0000, 0x0000 }, /* R497 */ + { 0x0000, 0x0000, 0x0000 }, /* R498 */ + { 0x0000, 0x0000, 0x0000 }, /* R499 */ + { 0x0000, 0x0000, 0x0000 }, /* R500 */ + { 0x0000, 0x0000, 0x0000 }, /* R501 */ + { 0x0000, 0x0000, 0x0000 }, /* R502 */ + { 0x0000, 0x0000, 0x0000 }, /* R503 */ + { 0x0000, 0x0000, 0x0000 }, /* R504 */ + { 0x0000, 0x0000, 0x0000 }, /* R505 */ + { 0x0000, 0x0000, 0x0000 }, /* R506 */ + { 0x0000, 0x0000, 0x0000 }, /* R507 */ + { 0x0000, 0x0000, 0x0000 }, /* R508 */ + { 0x0000, 0x0000, 0x0000 }, /* R509 */ + { 0x0000, 0x0000, 0x0000 }, /* R510 */ + { 0x0000, 0x0000, 0x0000 }, /* R511 */ + { 0x0000, 0x0000, 0x0000 }, /* R512 */ + { 0x045F, 0x045F, 0x0000 }, /* R513 - GPIO 2 */ + { 0x045F, 0x045F, 0x0000 }, /* R514 - GPIO 3 */ + { 0x0000, 0x0000, 0x0000 }, /* R515 */ + { 0xE75F, 0xE75F, 0x0000 }, /* R516 - GPIO 5 */ + { 0xE75F, 0xE75F, 0x0000 }, /* R517 - GPIO 6 */ + { 0x0000, 0x0000, 0x0000 }, /* R518 */ + { 0x0000, 0x0000, 0x0000 }, /* R519 */ + { 0x0000, 0x0000, 0x0000 }, /* R520 */ + { 0x0000, 0x0000, 0x0000 }, /* R521 */ + { 0x0000, 0x0000, 0x0000 }, /* R522 */ + { 0x0000, 0x0000, 0x0000 }, /* R523 */ + { 0x0000, 0x0000, 0x0000 }, /* R524 */ + { 0x0000, 0x0000, 0x0000 }, /* R525 */ + { 0x0000, 0x0000, 0x0000 }, /* R526 */ + { 0x0000, 0x0000, 0x0000 }, /* R527 */ + { 0x0000, 0x0000, 0x0000 }, /* R528 */ + { 0x0000, 0x0000, 0x0000 }, /* R529 */ + { 0x0000, 0x0000, 0x0000 }, /* R530 */ + { 0x0000, 0x0000, 0x0000 }, /* R531 */ + { 0x0000, 0x0000, 0x0000 }, /* R532 */ + { 0x0000, 0x0000, 0x0000 }, /* R533 */ + { 0x0000, 0x0000, 0x0000 }, /* R534 */ + { 0x0000, 0x0000, 0x0000 }, /* R535 */ + { 0x0000, 0x0000, 0x0000 }, /* R536 */ + { 0x0000, 0x0000, 0x0000 }, /* R537 */ + { 0x0000, 0x0000, 0x0000 }, /* R538 */ + { 0x0000, 0x0000, 0x0000 }, /* R539 */ + { 0x0000, 0x0000, 0x0000 }, /* R540 */ + { 0x0000, 0x0000, 0x0000 }, /* R541 */ + { 0x0000, 0x0000, 0x0000 }, /* R542 */ + { 0x0000, 0x0000, 0x0000 }, /* R543 */ + { 0x0000, 0x0000, 0x0000 }, /* R544 */ + { 0x0000, 0x0000, 0x0000 }, /* R545 */ + { 0x0000, 0x0000, 0x0000 }, /* R546 */ + { 0x0000, 0x0000, 0x0000 }, /* R547 */ + { 0x0000, 0x0000, 0x0000 }, /* R548 */ + { 0x0000, 0x0000, 0x0000 }, /* R549 */ + { 0x0000, 0x0000, 0x0000 }, /* R550 */ + { 0x0000, 0x0000, 0x0000 }, /* R551 */ + { 0x0000, 0x0000, 0x0000 }, /* R552 */ + { 0x0000, 0x0000, 0x0000 }, /* R553 */ + { 0x0000, 0x0000, 0x0000 }, /* R554 */ + { 0x0000, 0x0000, 0x0000 }, /* R555 */ + { 0x0000, 0x0000, 0x0000 }, /* R556 */ + { 0x0000, 0x0000, 0x0000 }, /* R557 */ + { 0x0000, 0x0000, 0x0000 }, /* R558 */ + { 0x0000, 0x0000, 0x0000 }, /* R559 */ + { 0x0030, 0x0030, 0xFFFF }, /* R560 - Interrupt Status 1 */ + { 0xFFED, 0xFFED, 0xFFFF }, /* R561 - Interrupt Status 2 */ + { 0x0000, 0x0000, 0x0000 }, /* R562 */ + { 0x0000, 0x0000, 0x0000 }, /* R563 */ + { 0x0000, 0x0000, 0x0000 }, /* R564 */ + { 0x0000, 0x0000, 0x0000 }, /* R565 */ + { 0x0000, 0x0000, 0x0000 }, /* R566 */ + { 0x0000, 0x0000, 0x0000 }, /* R567 */ + { 0x0030, 0x0030, 0x0000 }, /* R568 - Interrupt Status 1 Mask */ + { 0xFFED, 0xFFED, 0x0000 }, /* R569 - Interrupt Status 2 Mask */ + { 0x0000, 0x0000, 0x0000 }, /* R570 */ + { 0x0000, 0x0000, 0x0000 }, /* R571 */ + { 0x0000, 0x0000, 0x0000 }, /* R572 */ + { 0x0000, 0x0000, 0x0000 }, /* R573 */ + { 0x0000, 0x0000, 0x0000 }, /* R574 */ + { 0x0000, 0x0000, 0x0000 }, /* R575 */ + { 0x0001, 0x0001, 0x0000 }, /* R576 - Interrupt Control */ + { 0x0000, 0x0000, 0x0000 }, /* R577 */ + { 0x0000, 0x0000, 0x0000 }, /* R578 */ + { 0x0000, 0x0000, 0x0000 }, /* R579 */ + { 0x0000, 0x0000, 0x0000 }, /* R580 */ + { 0x0000, 0x0000, 0x0000 }, /* R581 */ + { 0x0000, 0x0000, 0x0000 }, /* R582 */ + { 0x0000, 0x0000, 0x0000 }, /* R583 */ + { 0x002D, 0x002D, 0x0000 }, /* R584 - IRQ Debounce */ + { 0x0000, 0x0000, 0x0000 }, /* R585 */ + { 0xC000, 0xC000, 0x0000 }, /* R586 - MICINT Source Pol */ + { 0x0000, 0x0000, 0x0000 }, /* R587 */ + { 0x0000, 0x0000, 0x0000 }, /* R588 */ + { 0x0000, 0x0000, 0x0000 }, /* R589 */ + { 0x0000, 0x0000, 0x0000 }, /* R590 */ + { 0x0000, 0x0000, 0x0000 }, /* R591 */ + { 0x0000, 0x0000, 0x0000 }, /* R592 */ + { 0x0000, 0x0000, 0x0000 }, /* R593 */ + { 0x0000, 0x0000, 0x0000 }, /* R594 */ + { 0x0000, 0x0000, 0x0000 }, /* R595 */ + { 0x0000, 0x0000, 0x0000 }, /* R596 */ + { 0x0000, 0x0000, 0x0000 }, /* R597 */ + { 0x0000, 0x0000, 0x0000 }, /* R598 */ + { 0x0000, 0x0000, 0x0000 }, /* R599 */ + { 0x0000, 0x0000, 0x0000 }, /* R600 */ + { 0x0000, 0x0000, 0x0000 }, /* R601 */ + { 0x0000, 0x0000, 0x0000 }, /* R602 */ + { 0x0000, 0x0000, 0x0000 }, /* R603 */ + { 0x0000, 0x0000, 0x0000 }, /* R604 */ + { 0x0000, 0x0000, 0x0000 }, /* R605 */ + { 0x0000, 0x0000, 0x0000 }, /* R606 */ + { 0x0000, 0x0000, 0x0000 }, /* R607 */ + { 0x0000, 0x0000, 0x0000 }, /* R608 */ + { 0x0000, 0x0000, 0x0000 }, /* R609 */ + { 0x0000, 0x0000, 0x0000 }, /* R610 */ + { 0x0000, 0x0000, 0x0000 }, /* R611 */ + { 0x0000, 0x0000, 0x0000 }, /* R612 */ + { 0x0000, 0x0000, 0x0000 }, /* R613 */ + { 0x0000, 0x0000, 0x0000 }, /* R614 */ + { 0x0000, 0x0000, 0x0000 }, /* R615 */ + { 0x0000, 0x0000, 0x0000 }, /* R616 */ + { 0x0000, 0x0000, 0x0000 }, /* R617 */ + { 0x0000, 0x0000, 0x0000 }, /* R618 */ + { 0x0000, 0x0000, 0x0000 }, /* R619 */ + { 0x0000, 0x0000, 0x0000 }, /* R620 */ + { 0x0000, 0x0000, 0x0000 }, /* R621 */ + { 0x0000, 0x0000, 0x0000 }, /* R622 */ + { 0x0000, 0x0000, 0x0000 }, /* R623 */ + { 0x0000, 0x0000, 0x0000 }, /* R624 */ + { 0x0000, 0x0000, 0x0000 }, /* R625 */ + { 0x0000, 0x0000, 0x0000 }, /* R626 */ + { 0x0000, 0x0000, 0x0000 }, /* R627 */ + { 0x0000, 0x0000, 0x0000 }, /* R628 */ + { 0x0000, 0x0000, 0x0000 }, /* R629 */ + { 0x0000, 0x0000, 0x0000 }, /* R630 */ + { 0x0000, 0x0000, 0x0000 }, /* R631 */ + { 0x0000, 0x0000, 0x0000 }, /* R632 */ + { 0x0000, 0x0000, 0x0000 }, /* R633 */ + { 0x0000, 0x0000, 0x0000 }, /* R634 */ + { 0x0000, 0x0000, 0x0000 }, /* R635 */ + { 0x0000, 0x0000, 0x0000 }, /* R636 */ + { 0x0000, 0x0000, 0x0000 }, /* R637 */ + { 0x0000, 0x0000, 0x0000 }, /* R638 */ + { 0x0000, 0x0000, 0x0000 }, /* R639 */ + { 0x0000, 0x0000, 0x0000 }, /* R640 */ + { 0x0000, 0x0000, 0x0000 }, /* R641 */ + { 0x0000, 0x0000, 0x0000 }, /* R642 */ + { 0x0000, 0x0000, 0x0000 }, /* R643 */ + { 0x0000, 0x0000, 0x0000 }, /* R644 */ + { 0x0000, 0x0000, 0x0000 }, /* R645 */ + { 0x0000, 0x0000, 0x0000 }, /* R646 */ + { 0x0000, 0x0000, 0x0000 }, /* R647 */ + { 0x0000, 0x0000, 0x0000 }, /* R648 */ + { 0x0000, 0x0000, 0x0000 }, /* R649 */ + { 0x0000, 0x0000, 0x0000 }, /* R650 */ + { 0x0000, 0x0000, 0x0000 }, /* R651 */ + { 0x0000, 0x0000, 0x0000 }, /* R652 */ + { 0x0000, 0x0000, 0x0000 }, /* R653 */ + { 0x0000, 0x0000, 0x0000 }, /* R654 */ + { 0x0000, 0x0000, 0x0000 }, /* R655 */ + { 0x0000, 0x0000, 0x0000 }, /* R656 */ + { 0x0000, 0x0000, 0x0000 }, /* R657 */ + { 0x0000, 0x0000, 0x0000 }, /* R658 */ + { 0x0000, 0x0000, 0x0000 }, /* R659 */ + { 0x0000, 0x0000, 0x0000 }, /* R660 */ + { 0x0000, 0x0000, 0x0000 }, /* R661 */ + { 0x0000, 0x0000, 0x0000 }, /* R662 */ + { 0x0000, 0x0000, 0x0000 }, /* R663 */ + { 0x0000, 0x0000, 0x0000 }, /* R664 */ + { 0x0000, 0x0000, 0x0000 }, /* R665 */ + { 0x0000, 0x0000, 0x0000 }, /* R666 */ + { 0x0000, 0x0000, 0x0000 }, /* R667 */ + { 0x0000, 0x0000, 0x0000 }, /* R668 */ + { 0x0000, 0x0000, 0x0000 }, /* R669 */ + { 0x0000, 0x0000, 0x0000 }, /* R670 */ + { 0x0000, 0x0000, 0x0000 }, /* R671 */ + { 0x0000, 0x0000, 0x0000 }, /* R672 */ + { 0x0000, 0x0000, 0x0000 }, /* R673 */ + { 0x0000, 0x0000, 0x0000 }, /* R674 */ + { 0x0000, 0x0000, 0x0000 }, /* R675 */ + { 0x0000, 0x0000, 0x0000 }, /* R676 */ + { 0x0000, 0x0000, 0x0000 }, /* R677 */ + { 0x0000, 0x0000, 0x0000 }, /* R678 */ + { 0x0000, 0x0000, 0x0000 }, /* R679 */ + { 0x0000, 0x0000, 0x0000 }, /* R680 */ + { 0x0000, 0x0000, 0x0000 }, /* R681 */ + { 0x0000, 0x0000, 0x0000 }, /* R682 */ + { 0x0000, 0x0000, 0x0000 }, /* R683 */ + { 0x0000, 0x0000, 0x0000 }, /* R684 */ + { 0x0000, 0x0000, 0x0000 }, /* R685 */ + { 0x0000, 0x0000, 0x0000 }, /* R686 */ + { 0x0000, 0x0000, 0x0000 }, /* R687 */ + { 0x0000, 0x0000, 0x0000 }, /* R688 */ + { 0x0000, 0x0000, 0x0000 }, /* R689 */ + { 0x0000, 0x0000, 0x0000 }, /* R690 */ + { 0x0000, 0x0000, 0x0000 }, /* R691 */ + { 0x0000, 0x0000, 0x0000 }, /* R692 */ + { 0x0000, 0x0000, 0x0000 }, /* R693 */ + { 0x0000, 0x0000, 0x0000 }, /* R694 */ + { 0x0000, 0x0000, 0x0000 }, /* R695 */ + { 0x0000, 0x0000, 0x0000 }, /* R696 */ + { 0x0000, 0x0000, 0x0000 }, /* R697 */ + { 0x0000, 0x0000, 0x0000 }, /* R698 */ + { 0x0000, 0x0000, 0x0000 }, /* R699 */ + { 0x0000, 0x0000, 0x0000 }, /* R700 */ + { 0x0000, 0x0000, 0x0000 }, /* R701 */ + { 0x0000, 0x0000, 0x0000 }, /* R702 */ + { 0x0000, 0x0000, 0x0000 }, /* R703 */ + { 0x0000, 0x0000, 0x0000 }, /* R704 */ + { 0x0000, 0x0000, 0x0000 }, /* R705 */ + { 0x0000, 0x0000, 0x0000 }, /* R706 */ + { 0x0000, 0x0000, 0x0000 }, /* R707 */ + { 0x0000, 0x0000, 0x0000 }, /* R708 */ + { 0x0000, 0x0000, 0x0000 }, /* R709 */ + { 0x0000, 0x0000, 0x0000 }, /* R710 */ + { 0x0000, 0x0000, 0x0000 }, /* R711 */ + { 0x0000, 0x0000, 0x0000 }, /* R712 */ + { 0x0000, 0x0000, 0x0000 }, /* R713 */ + { 0x0000, 0x0000, 0x0000 }, /* R714 */ + { 0x0000, 0x0000, 0x0000 }, /* R715 */ + { 0x0000, 0x0000, 0x0000 }, /* R716 */ + { 0x0000, 0x0000, 0x0000 }, /* R717 */ + { 0x0000, 0x0000, 0x0000 }, /* R718 */ + { 0x0000, 0x0000, 0x0000 }, /* R719 */ + { 0x0000, 0x0000, 0x0000 }, /* R720 */ + { 0x0000, 0x0000, 0x0000 }, /* R721 */ + { 0x0000, 0x0000, 0x0000 }, /* R722 */ + { 0x0000, 0x0000, 0x0000 }, /* R723 */ + { 0x0000, 0x0000, 0x0000 }, /* R724 */ + { 0x0000, 0x0000, 0x0000 }, /* R725 */ + { 0x0000, 0x0000, 0x0000 }, /* R726 */ + { 0x0000, 0x0000, 0x0000 }, /* R727 */ + { 0x0000, 0x0000, 0x0000 }, /* R728 */ + { 0x0000, 0x0000, 0x0000 }, /* R729 */ + { 0x0000, 0x0000, 0x0000 }, /* R730 */ + { 0x0000, 0x0000, 0x0000 }, /* R731 */ + { 0x0000, 0x0000, 0x0000 }, /* R732 */ + { 0x0000, 0x0000, 0x0000 }, /* R733 */ + { 0x0000, 0x0000, 0x0000 }, /* R734 */ + { 0x0000, 0x0000, 0x0000 }, /* R735 */ + { 0x0000, 0x0000, 0x0000 }, /* R736 */ + { 0x0000, 0x0000, 0x0000 }, /* R737 */ + { 0x0000, 0x0000, 0x0000 }, /* R738 */ + { 0x0000, 0x0000, 0x0000 }, /* R739 */ + { 0x0000, 0x0000, 0x0000 }, /* R740 */ + { 0x0000, 0x0000, 0x0000 }, /* R741 */ + { 0x0000, 0x0000, 0x0000 }, /* R742 */ + { 0x0000, 0x0000, 0x0000 }, /* R743 */ + { 0x0000, 0x0000, 0x0000 }, /* R744 */ + { 0x0000, 0x0000, 0x0000 }, /* R745 */ + { 0x0000, 0x0000, 0x0000 }, /* R746 */ + { 0x0000, 0x0000, 0x0000 }, /* R747 */ + { 0x0000, 0x0000, 0x0000 }, /* R748 */ + { 0x0000, 0x0000, 0x0000 }, /* R749 */ + { 0x0000, 0x0000, 0x0000 }, /* R750 */ + { 0x0000, 0x0000, 0x0000 }, /* R751 */ + { 0x0000, 0x0000, 0x0000 }, /* R752 */ + { 0x0000, 0x0000, 0x0000 }, /* R753 */ + { 0x0000, 0x0000, 0x0000 }, /* R754 */ + { 0x0000, 0x0000, 0x0000 }, /* R755 */ + { 0x0000, 0x0000, 0x0000 }, /* R756 */ + { 0x0000, 0x0000, 0x0000 }, /* R757 */ + { 0x0000, 0x0000, 0x0000 }, /* R758 */ + { 0x0000, 0x0000, 0x0000 }, /* R759 */ + { 0x0000, 0x0000, 0x0000 }, /* R760 */ + { 0x0000, 0x0000, 0x0000 }, /* R761 */ + { 0x0000, 0x0000, 0x0000 }, /* R762 */ + { 0x0000, 0x0000, 0x0000 }, /* R763 */ + { 0x0000, 0x0000, 0x0000 }, /* R764 */ + { 0x0000, 0x0000, 0x0000 }, /* R765 */ + { 0x0000, 0x0000, 0x0000 }, /* R766 */ + { 0x0000, 0x0000, 0x0000 }, /* R767 */ + { 0x0001, 0x0001, 0x0000 }, /* R768 - DSP2 Power Management */ + { 0x0000, 0x0000, 0x0000 }, /* R769 */ + { 0x0000, 0x0000, 0x0000 }, /* R770 */ + { 0x0000, 0x0000, 0x0000 }, /* R771 */ + { 0x0000, 0x0000, 0x0000 }, /* R772 */ + { 0x0000, 0x0000, 0x0000 }, /* R773 */ + { 0x0000, 0x0000, 0x0000 }, /* R774 */ + { 0x0000, 0x0000, 0x0000 }, /* R775 */ + { 0x0000, 0x0000, 0x0000 }, /* R776 */ + { 0x0000, 0x0000, 0x0000 }, /* R777 */ + { 0x0000, 0x0000, 0x0000 }, /* R778 */ + { 0x0000, 0x0000, 0x0000 }, /* R779 */ + { 0x0000, 0x0000, 0x0000 }, /* R780 */ + { 0x0000, 0x0000, 0x0000 }, /* R781 */ + { 0x0000, 0x0000, 0x0000 }, /* R782 */ + { 0x0000, 0x0000, 0x0000 }, /* R783 */ + { 0x0000, 0x0000, 0x0000 }, /* R784 */ + { 0x0000, 0x0000, 0x0000 }, /* R785 */ + { 0x0000, 0x0000, 0x0000 }, /* R786 */ + { 0x0000, 0x0000, 0x0000 }, /* R787 */ + { 0x0000, 0x0000, 0x0000 }, /* R788 */ + { 0x0000, 0x0000, 0x0000 }, /* R789 */ + { 0x0000, 0x0000, 0x0000 }, /* R790 */ + { 0x0000, 0x0000, 0x0000 }, /* R791 */ + { 0x0000, 0x0000, 0x0000 }, /* R792 */ + { 0x0000, 0x0000, 0x0000 }, /* R793 */ + { 0x0000, 0x0000, 0x0000 }, /* R794 */ + { 0x0000, 0x0000, 0x0000 }, /* R795 */ + { 0x0000, 0x0000, 0x0000 }, /* R796 */ + { 0x0000, 0x0000, 0x0000 }, /* R797 */ + { 0x0000, 0x0000, 0x0000 }, /* R798 */ + { 0x0000, 0x0000, 0x0000 }, /* R799 */ + { 0x0000, 0x0000, 0x0000 }, /* R800 */ + { 0x0000, 0x0000, 0x0000 }, /* R801 */ + { 0x0000, 0x0000, 0x0000 }, /* R802 */ + { 0x0000, 0x0000, 0x0000 }, /* R803 */ + { 0x0000, 0x0000, 0x0000 }, /* R804 */ + { 0x0000, 0x0000, 0x0000 }, /* R805 */ + { 0x0000, 0x0000, 0x0000 }, /* R806 */ + { 0x0000, 0x0000, 0x0000 }, /* R807 */ + { 0x0000, 0x0000, 0x0000 }, /* R808 */ + { 0x0000, 0x0000, 0x0000 }, /* R809 */ + { 0x0000, 0x0000, 0x0000 }, /* R810 */ + { 0x0000, 0x0000, 0x0000 }, /* R811 */ + { 0x0000, 0x0000, 0x0000 }, /* R812 */ + { 0x0000, 0x0000, 0x0000 }, /* R813 */ + { 0x0000, 0x0000, 0x0000 }, /* R814 */ + { 0x0000, 0x0000, 0x0000 }, /* R815 */ + { 0x0000, 0x0000, 0x0000 }, /* R816 */ + { 0x0000, 0x0000, 0x0000 }, /* R817 */ + { 0x0000, 0x0000, 0x0000 }, /* R818 */ + { 0x0000, 0x0000, 0x0000 }, /* R819 */ + { 0x0000, 0x0000, 0x0000 }, /* R820 */ + { 0x0000, 0x0000, 0x0000 }, /* R821 */ + { 0x0000, 0x0000, 0x0000 }, /* R822 */ + { 0x0000, 0x0000, 0x0000 }, /* R823 */ + { 0x0000, 0x0000, 0x0000 }, /* R824 */ + { 0x0000, 0x0000, 0x0000 }, /* R825 */ + { 0x0000, 0x0000, 0x0000 }, /* R826 */ + { 0x0000, 0x0000, 0x0000 }, /* R827 */ + { 0x0000, 0x0000, 0x0000 }, /* R828 */ + { 0x0000, 0x0000, 0x0000 }, /* R829 */ + { 0x0000, 0x0000, 0x0000 }, /* R830 */ + { 0x0000, 0x0000, 0x0000 }, /* R831 */ + { 0x0000, 0x0000, 0x0000 }, /* R832 */ + { 0x0000, 0x0000, 0x0000 }, /* R833 */ + { 0x0000, 0x0000, 0x0000 }, /* R834 */ + { 0x0000, 0x0000, 0x0000 }, /* R835 */ + { 0x0000, 0x0000, 0x0000 }, /* R836 */ + { 0x0000, 0x0000, 0x0000 }, /* R837 */ + { 0x0000, 0x0000, 0x0000 }, /* R838 */ + { 0x0000, 0x0000, 0x0000 }, /* R839 */ + { 0x0000, 0x0000, 0x0000 }, /* R840 */ + { 0x0000, 0x0000, 0x0000 }, /* R841 */ + { 0x0000, 0x0000, 0x0000 }, /* R842 */ + { 0x0000, 0x0000, 0x0000 }, /* R843 */ + { 0x0000, 0x0000, 0x0000 }, /* R844 */ + { 0x0000, 0x0000, 0x0000 }, /* R845 */ + { 0x0000, 0x0000, 0x0000 }, /* R846 */ + { 0x0000, 0x0000, 0x0000 }, /* R847 */ + { 0x0000, 0x0000, 0x0000 }, /* R848 */ + { 0x0000, 0x0000, 0x0000 }, /* R849 */ + { 0x0000, 0x0000, 0x0000 }, /* R850 */ + { 0x0000, 0x0000, 0x0000 }, /* R851 */ + { 0x0000, 0x0000, 0x0000 }, /* R852 */ + { 0x0000, 0x0000, 0x0000 }, /* R853 */ + { 0x0000, 0x0000, 0x0000 }, /* R854 */ + { 0x0000, 0x0000, 0x0000 }, /* R855 */ + { 0x0000, 0x0000, 0x0000 }, /* R856 */ + { 0x0000, 0x0000, 0x0000 }, /* R857 */ + { 0x0000, 0x0000, 0x0000 }, /* R858 */ + { 0x0000, 0x0000, 0x0000 }, /* R859 */ + { 0x0000, 0x0000, 0x0000 }, /* R860 */ + { 0x0000, 0x0000, 0x0000 }, /* R861 */ + { 0x0000, 0x0000, 0x0000 }, /* R862 */ + { 0x0000, 0x0000, 0x0000 }, /* R863 */ + { 0x0000, 0x0000, 0x0000 }, /* R864 */ + { 0x0000, 0x0000, 0x0000 }, /* R865 */ + { 0x0000, 0x0000, 0x0000 }, /* R866 */ + { 0x0000, 0x0000, 0x0000 }, /* R867 */ + { 0x0000, 0x0000, 0x0000 }, /* R868 */ + { 0x0000, 0x0000, 0x0000 }, /* R869 */ + { 0x0000, 0x0000, 0x0000 }, /* R870 */ + { 0x0000, 0x0000, 0x0000 }, /* R871 */ + { 0x0000, 0x0000, 0x0000 }, /* R872 */ + { 0x0000, 0x0000, 0x0000 }, /* R873 */ + { 0x0000, 0x0000, 0x0000 }, /* R874 */ + { 0x0000, 0x0000, 0x0000 }, /* R875 */ + { 0x0000, 0x0000, 0x0000 }, /* R876 */ + { 0x0000, 0x0000, 0x0000 }, /* R877 */ + { 0x0000, 0x0000, 0x0000 }, /* R878 */ + { 0x0000, 0x0000, 0x0000 }, /* R879 */ + { 0x0000, 0x0000, 0x0000 }, /* R880 */ + { 0x0000, 0x0000, 0x0000 }, /* R881 */ + { 0x0000, 0x0000, 0x0000 }, /* R882 */ + { 0x0000, 0x0000, 0x0000 }, /* R883 */ + { 0x0000, 0x0000, 0x0000 }, /* R884 */ + { 0x0000, 0x0000, 0x0000 }, /* R885 */ + { 0x0000, 0x0000, 0x0000 }, /* R886 */ + { 0x0000, 0x0000, 0x0000 }, /* R887 */ + { 0x0000, 0x0000, 0x0000 }, /* R888 */ + { 0x0000, 0x0000, 0x0000 }, /* R889 */ + { 0x0000, 0x0000, 0x0000 }, /* R890 */ + { 0x0000, 0x0000, 0x0000 }, /* R891 */ + { 0x0000, 0x0000, 0x0000 }, /* R892 */ + { 0x0000, 0x0000, 0x0000 }, /* R893 */ + { 0x0000, 0x0000, 0x0000 }, /* R894 */ + { 0x0000, 0x0000, 0x0000 }, /* R895 */ + { 0x0000, 0x0000, 0x0000 }, /* R896 */ + { 0x0000, 0x0000, 0x0000 }, /* R897 */ + { 0x0000, 0x0000, 0x0000 }, /* R898 */ + { 0x0000, 0x0000, 0x0000 }, /* R899 */ + { 0x0000, 0x0000, 0x0000 }, /* R900 */ + { 0x0000, 0x0000, 0x0000 }, /* R901 */ + { 0x0000, 0x0000, 0x0000 }, /* R902 */ + { 0x0000, 0x0000, 0x0000 }, /* R903 */ + { 0x0000, 0x0000, 0x0000 }, /* R904 */ + { 0x0000, 0x0000, 0x0000 }, /* R905 */ + { 0x0000, 0x0000, 0x0000 }, /* R906 */ + { 0x0000, 0x0000, 0x0000 }, /* R907 */ + { 0x0000, 0x0000, 0x0000 }, /* R908 */ + { 0x0000, 0x0000, 0x0000 }, /* R909 */ + { 0x0000, 0x0000, 0x0000 }, /* R910 */ + { 0x0000, 0x0000, 0x0000 }, /* R911 */ + { 0x0000, 0x0000, 0x0000 }, /* R912 */ + { 0x0000, 0x0000, 0x0000 }, /* R913 */ + { 0x0000, 0x0000, 0x0000 }, /* R914 */ + { 0x0000, 0x0000, 0x0000 }, /* R915 */ + { 0x0000, 0x0000, 0x0000 }, /* R916 */ + { 0x0000, 0x0000, 0x0000 }, /* R917 */ + { 0x0000, 0x0000, 0x0000 }, /* R918 */ + { 0x0000, 0x0000, 0x0000 }, /* R919 */ + { 0x0000, 0x0000, 0x0000 }, /* R920 */ + { 0x0000, 0x0000, 0x0000 }, /* R921 */ + { 0x0000, 0x0000, 0x0000 }, /* R922 */ + { 0x0000, 0x0000, 0x0000 }, /* R923 */ + { 0x0000, 0x0000, 0x0000 }, /* R924 */ + { 0x0000, 0x0000, 0x0000 }, /* R925 */ + { 0x0000, 0x0000, 0x0000 }, /* R926 */ + { 0x0000, 0x0000, 0x0000 }, /* R927 */ + { 0x0000, 0x0000, 0x0000 }, /* R928 */ + { 0x0000, 0x0000, 0x0000 }, /* R929 */ + { 0x0000, 0x0000, 0x0000 }, /* R930 */ + { 0x0000, 0x0000, 0x0000 }, /* R931 */ + { 0x0000, 0x0000, 0x0000 }, /* R932 */ + { 0x0000, 0x0000, 0x0000 }, /* R933 */ + { 0x0000, 0x0000, 0x0000 }, /* R934 */ + { 0x0000, 0x0000, 0x0000 }, /* R935 */ + { 0x0000, 0x0000, 0x0000 }, /* R936 */ + { 0x0000, 0x0000, 0x0000 }, /* R937 */ + { 0x0000, 0x0000, 0x0000 }, /* R938 */ + { 0x0000, 0x0000, 0x0000 }, /* R939 */ + { 0x0000, 0x0000, 0x0000 }, /* R940 */ + { 0x0000, 0x0000, 0x0000 }, /* R941 */ + { 0x0000, 0x0000, 0x0000 }, /* R942 */ + { 0x0000, 0x0000, 0x0000 }, /* R943 */ + { 0x0000, 0x0000, 0x0000 }, /* R944 */ + { 0x0000, 0x0000, 0x0000 }, /* R945 */ + { 0x0000, 0x0000, 0x0000 }, /* R946 */ + { 0x0000, 0x0000, 0x0000 }, /* R947 */ + { 0x0000, 0x0000, 0x0000 }, /* R948 */ + { 0x0000, 0x0000, 0x0000 }, /* R949 */ + { 0x0000, 0x0000, 0x0000 }, /* R950 */ + { 0x0000, 0x0000, 0x0000 }, /* R951 */ + { 0x0000, 0x0000, 0x0000 }, /* R952 */ + { 0x0000, 0x0000, 0x0000 }, /* R953 */ + { 0x0000, 0x0000, 0x0000 }, /* R954 */ + { 0x0000, 0x0000, 0x0000 }, /* R955 */ + { 0x0000, 0x0000, 0x0000 }, /* R956 */ + { 0x0000, 0x0000, 0x0000 }, /* R957 */ + { 0x0000, 0x0000, 0x0000 }, /* R958 */ + { 0x0000, 0x0000, 0x0000 }, /* R959 */ + { 0x0000, 0x0000, 0x0000 }, /* R960 */ + { 0x0000, 0x0000, 0x0000 }, /* R961 */ + { 0x0000, 0x0000, 0x0000 }, /* R962 */ + { 0x0000, 0x0000, 0x0000 }, /* R963 */ + { 0x0000, 0x0000, 0x0000 }, /* R964 */ + { 0x0000, 0x0000, 0x0000 }, /* R965 */ + { 0x0000, 0x0000, 0x0000 }, /* R966 */ + { 0x0000, 0x0000, 0x0000 }, /* R967 */ + { 0x0000, 0x0000, 0x0000 }, /* R968 */ + { 0x0000, 0x0000, 0x0000 }, /* R969 */ + { 0x0000, 0x0000, 0x0000 }, /* R970 */ + { 0x0000, 0x0000, 0x0000 }, /* R971 */ + { 0x0000, 0x0000, 0x0000 }, /* R972 */ + { 0x0000, 0x0000, 0x0000 }, /* R973 */ + { 0x0000, 0x0000, 0x0000 }, /* R974 */ + { 0x0000, 0x0000, 0x0000 }, /* R975 */ + { 0x0000, 0x0000, 0x0000 }, /* R976 */ + { 0x0000, 0x0000, 0x0000 }, /* R977 */ + { 0x0000, 0x0000, 0x0000 }, /* R978 */ + { 0x0000, 0x0000, 0x0000 }, /* R979 */ + { 0x0000, 0x0000, 0x0000 }, /* R980 */ + { 0x0000, 0x0000, 0x0000 }, /* R981 */ + { 0x0000, 0x0000, 0x0000 }, /* R982 */ + { 0x0000, 0x0000, 0x0000 }, /* R983 */ + { 0x0000, 0x0000, 0x0000 }, /* R984 */ + { 0x0000, 0x0000, 0x0000 }, /* R985 */ + { 0x0000, 0x0000, 0x0000 }, /* R986 */ + { 0x0000, 0x0000, 0x0000 }, /* R987 */ + { 0x0000, 0x0000, 0x0000 }, /* R988 */ + { 0x0000, 0x0000, 0x0000 }, /* R989 */ + { 0x0000, 0x0000, 0x0000 }, /* R990 */ + { 0x0000, 0x0000, 0x0000 }, /* R991 */ + { 0x0000, 0x0000, 0x0000 }, /* R992 */ + { 0x0000, 0x0000, 0x0000 }, /* R993 */ + { 0x0000, 0x0000, 0x0000 }, /* R994 */ + { 0x0000, 0x0000, 0x0000 }, /* R995 */ + { 0x0000, 0x0000, 0x0000 }, /* R996 */ + { 0x0000, 0x0000, 0x0000 }, /* R997 */ + { 0x0000, 0x0000, 0x0000 }, /* R998 */ + { 0x0000, 0x0000, 0x0000 }, /* R999 */ + { 0x0000, 0x0000, 0x0000 }, /* R1000 */ + { 0x0000, 0x0000, 0x0000 }, /* R1001 */ + { 0x0000, 0x0000, 0x0000 }, /* R1002 */ + { 0x0000, 0x0000, 0x0000 }, /* R1003 */ + { 0x0000, 0x0000, 0x0000 }, /* R1004 */ + { 0x0000, 0x0000, 0x0000 }, /* R1005 */ + { 0x0000, 0x0000, 0x0000 }, /* R1006 */ + { 0x0000, 0x0000, 0x0000 }, /* R1007 */ + { 0x0000, 0x0000, 0x0000 }, /* R1008 */ + { 0x0000, 0x0000, 0x0000 }, /* R1009 */ + { 0x0000, 0x0000, 0x0000 }, /* R1010 */ + { 0x0000, 0x0000, 0x0000 }, /* R1011 */ + { 0x0000, 0x0000, 0x0000 }, /* R1012 */ + { 0x0000, 0x0000, 0x0000 }, /* R1013 */ + { 0x0000, 0x0000, 0x0000 }, /* R1014 */ + { 0x0000, 0x0000, 0x0000 }, /* R1015 */ + { 0x0000, 0x0000, 0x0000 }, /* R1016 */ + { 0x0000, 0x0000, 0x0000 }, /* R1017 */ + { 0x0000, 0x0000, 0x0000 }, /* R1018 */ + { 0x0000, 0x0000, 0x0000 }, /* R1019 */ + { 0x0000, 0x0000, 0x0000 }, /* R1020 */ + { 0x0000, 0x0000, 0x0000 }, /* R1021 */ + { 0x0000, 0x0000, 0x0000 }, /* R1022 */ + { 0x0000, 0x0000, 0x0000 }, /* R1023 */ + { 0x0000, 0x0000, 0x0000 }, /* R1024 */ + { 0x0000, 0x0000, 0x0000 }, /* R1025 */ + { 0x0000, 0x0000, 0x0000 }, /* R1026 */ + { 0x0000, 0x0000, 0x0000 }, /* R1027 */ + { 0x0000, 0x0000, 0x0000 }, /* R1028 */ + { 0x0000, 0x0000, 0x0000 }, /* R1029 */ + { 0x0000, 0x0000, 0x0000 }, /* R1030 */ + { 0x0000, 0x0000, 0x0000 }, /* R1031 */ + { 0x0000, 0x0000, 0x0000 }, /* R1032 */ + { 0x0000, 0x0000, 0x0000 }, /* R1033 */ + { 0x0000, 0x0000, 0x0000 }, /* R1034 */ + { 0x0000, 0x0000, 0x0000 }, /* R1035 */ + { 0x0000, 0x0000, 0x0000 }, /* R1036 */ + { 0x0000, 0x003F, 0x0000 }, /* R1037 - DSP2_ExecControl */ + { 0x0000, 0x0000, 0x0000 }, /* R1038 */ + { 0x0000, 0x0000, 0x0000 }, /* R1039 */ + { 0x0000, 0x0000, 0x0000 }, /* R1040 */ + { 0x0000, 0x0000, 0x0000 }, /* R1041 */ + { 0x0000, 0x0000, 0x0000 }, /* R1042 */ + { 0x0000, 0x0000, 0x0000 }, /* R1043 */ + { 0x0000, 0x0000, 0x0000 }, /* R1044 */ + { 0x0000, 0x0000, 0x0000 }, /* R1045 */ + { 0x0000, 0x0000, 0x0000 }, /* R1046 */ + { 0x0000, 0x0000, 0x0000 }, /* R1047 */ + { 0x0000, 0x0000, 0x0000 }, /* R1048 */ + { 0x0000, 0x0000, 0x0000 }, /* R1049 */ + { 0x0000, 0x0000, 0x0000 }, /* R1050 */ + { 0x0000, 0x0000, 0x0000 }, /* R1051 */ + { 0x0000, 0x0000, 0x0000 }, /* R1052 */ + { 0x0000, 0x0000, 0x0000 }, /* R1053 */ + { 0x0000, 0x0000, 0x0000 }, /* R1054 */ + { 0x0000, 0x0000, 0x0000 }, /* R1055 */ + { 0x0000, 0x0000, 0x0000 }, /* R1056 */ + { 0x0000, 0x0000, 0x0000 }, /* R1057 */ + { 0x0000, 0x0000, 0x0000 }, /* R1058 */ + { 0x0000, 0x0000, 0x0000 }, /* R1059 */ + { 0x0000, 0x0000, 0x0000 }, /* R1060 */ + { 0x0000, 0x0000, 0x0000 }, /* R1061 */ + { 0x0000, 0x0000, 0x0000 }, /* R1062 */ + { 0x0000, 0x0000, 0x0000 }, /* R1063 */ + { 0x0000, 0x0000, 0x0000 }, /* R1064 */ + { 0x0000, 0x0000, 0x0000 }, /* R1065 */ + { 0x0000, 0x0000, 0x0000 }, /* R1066 */ + { 0x0000, 0x0000, 0x0000 }, /* R1067 */ + { 0x0000, 0x0000, 0x0000 }, /* R1068 */ + { 0x0000, 0x0000, 0x0000 }, /* R1069 */ + { 0x0000, 0x0000, 0x0000 }, /* R1070 */ + { 0x0000, 0x0000, 0x0000 }, /* R1071 */ + { 0x0000, 0x0000, 0x0000 }, /* R1072 */ + { 0x0000, 0x0000, 0x0000 }, /* R1073 */ + { 0x0000, 0x0000, 0x0000 }, /* R1074 */ + { 0x0000, 0x0000, 0x0000 }, /* R1075 */ + { 0x0000, 0x0000, 0x0000 }, /* R1076 */ + { 0x0000, 0x0000, 0x0000 }, /* R1077 */ + { 0x0000, 0x0000, 0x0000 }, /* R1078 */ + { 0x0000, 0x0000, 0x0000 }, /* R1079 */ + { 0x0000, 0x0000, 0x0000 }, /* R1080 */ + { 0x0000, 0x0000, 0x0000 }, /* R1081 */ + { 0x0000, 0x0000, 0x0000 }, /* R1082 */ + { 0x0000, 0x0000, 0x0000 }, /* R1083 */ + { 0x0000, 0x0000, 0x0000 }, /* R1084 */ + { 0x0000, 0x0000, 0x0000 }, /* R1085 */ + { 0x0000, 0x0000, 0x0000 }, /* R1086 */ + { 0x0000, 0x0000, 0x0000 }, /* R1087 */ + { 0x0000, 0x0000, 0x0000 }, /* R1088 */ + { 0x0000, 0x0000, 0x0000 }, /* R1089 */ + { 0x0000, 0x0000, 0x0000 }, /* R1090 */ + { 0x0000, 0x0000, 0x0000 }, /* R1091 */ + { 0x0000, 0x0000, 0x0000 }, /* R1092 */ + { 0x0000, 0x0000, 0x0000 }, /* R1093 */ + { 0x0000, 0x0000, 0x0000 }, /* R1094 */ + { 0x0000, 0x0000, 0x0000 }, /* R1095 */ + { 0x0000, 0x0000, 0x0000 }, /* R1096 */ + { 0x0000, 0x0000, 0x0000 }, /* R1097 */ + { 0x0000, 0x0000, 0x0000 }, /* R1098 */ + { 0x0000, 0x0000, 0x0000 }, /* R1099 */ + { 0x0000, 0x0000, 0x0000 }, /* R1100 */ + { 0x0000, 0x0000, 0x0000 }, /* R1101 */ + { 0x0000, 0x0000, 0x0000 }, /* R1102 */ + { 0x0000, 0x0000, 0x0000 }, /* R1103 */ + { 0x0000, 0x0000, 0x0000 }, /* R1104 */ + { 0x0000, 0x0000, 0x0000 }, /* R1105 */ + { 0x0000, 0x0000, 0x0000 }, /* R1106 */ + { 0x0000, 0x0000, 0x0000 }, /* R1107 */ + { 0x0000, 0x0000, 0x0000 }, /* R1108 */ + { 0x0000, 0x0000, 0x0000 }, /* R1109 */ + { 0x0000, 0x0000, 0x0000 }, /* R1110 */ + { 0x0000, 0x0000, 0x0000 }, /* R1111 */ + { 0x0000, 0x0000, 0x0000 }, /* R1112 */ + { 0x0000, 0x0000, 0x0000 }, /* R1113 */ + { 0x0000, 0x0000, 0x0000 }, /* R1114 */ + { 0x0000, 0x0000, 0x0000 }, /* R1115 */ + { 0x0000, 0x0000, 0x0000 }, /* R1116 */ + { 0x0000, 0x0000, 0x0000 }, /* R1117 */ + { 0x0000, 0x0000, 0x0000 }, /* R1118 */ + { 0x0000, 0x0000, 0x0000 }, /* R1119 */ + { 0x0000, 0x0000, 0x0000 }, /* R1120 */ + { 0x0000, 0x0000, 0x0000 }, /* R1121 */ + { 0x0000, 0x0000, 0x0000 }, /* R1122 */ + { 0x0000, 0x0000, 0x0000 }, /* R1123 */ + { 0x0000, 0x0000, 0x0000 }, /* R1124 */ + { 0x0000, 0x0000, 0x0000 }, /* R1125 */ + { 0x0000, 0x0000, 0x0000 }, /* R1126 */ + { 0x0000, 0x0000, 0x0000 }, /* R1127 */ + { 0x0000, 0x0000, 0x0000 }, /* R1128 */ + { 0x0000, 0x0000, 0x0000 }, /* R1129 */ + { 0x0000, 0x0000, 0x0000 }, /* R1130 */ + { 0x0000, 0x0000, 0x0000 }, /* R1131 */ + { 0x0000, 0x0000, 0x0000 }, /* R1132 */ + { 0x0000, 0x0000, 0x0000 }, /* R1133 */ + { 0x0000, 0x0000, 0x0000 }, /* R1134 */ + { 0x0000, 0x0000, 0x0000 }, /* R1135 */ + { 0x0000, 0x0000, 0x0000 }, /* R1136 */ + { 0x0000, 0x0000, 0x0000 }, /* R1137 */ + { 0x0000, 0x0000, 0x0000 }, /* R1138 */ + { 0x0000, 0x0000, 0x0000 }, /* R1139 */ + { 0x0000, 0x0000, 0x0000 }, /* R1140 */ + { 0x0000, 0x0000, 0x0000 }, /* R1141 */ + { 0x0000, 0x0000, 0x0000 }, /* R1142 */ + { 0x0000, 0x0000, 0x0000 }, /* R1143 */ + { 0x0000, 0x0000, 0x0000 }, /* R1144 */ + { 0x0000, 0x0000, 0x0000 }, /* R1145 */ + { 0x0000, 0x0000, 0x0000 }, /* R1146 */ + { 0x0000, 0x0000, 0x0000 }, /* R1147 */ + { 0x0000, 0x0000, 0x0000 }, /* R1148 */ + { 0x0000, 0x0000, 0x0000 }, /* R1149 */ + { 0x0000, 0x0000, 0x0000 }, /* R1150 */ + { 0x0000, 0x0000, 0x0000 }, /* R1151 */ + { 0x0000, 0x0000, 0x0000 }, /* R1152 */ + { 0x0000, 0x0000, 0x0000 }, /* R1153 */ + { 0x0000, 0x0000, 0x0000 }, /* R1154 */ + { 0x0000, 0x0000, 0x0000 }, /* R1155 */ + { 0x0000, 0x0000, 0x0000 }, /* R1156 */ + { 0x0000, 0x0000, 0x0000 }, /* R1157 */ + { 0x0000, 0x0000, 0x0000 }, /* R1158 */ + { 0x0000, 0x0000, 0x0000 }, /* R1159 */ + { 0x0000, 0x0000, 0x0000 }, /* R1160 */ + { 0x0000, 0x0000, 0x0000 }, /* R1161 */ + { 0x0000, 0x0000, 0x0000 }, /* R1162 */ + { 0x0000, 0x0000, 0x0000 }, /* R1163 */ + { 0x0000, 0x0000, 0x0000 }, /* R1164 */ + { 0x0000, 0x0000, 0x0000 }, /* R1165 */ + { 0x0000, 0x0000, 0x0000 }, /* R1166 */ + { 0x0000, 0x0000, 0x0000 }, /* R1167 */ + { 0x0000, 0x0000, 0x0000 }, /* R1168 */ + { 0x0000, 0x0000, 0x0000 }, /* R1169 */ + { 0x0000, 0x0000, 0x0000 }, /* R1170 */ + { 0x0000, 0x0000, 0x0000 }, /* R1171 */ + { 0x0000, 0x0000, 0x0000 }, /* R1172 */ + { 0x0000, 0x0000, 0x0000 }, /* R1173 */ + { 0x0000, 0x0000, 0x0000 }, /* R1174 */ + { 0x0000, 0x0000, 0x0000 }, /* R1175 */ + { 0x0000, 0x0000, 0x0000 }, /* R1176 */ + { 0x0000, 0x0000, 0x0000 }, /* R1177 */ + { 0x0000, 0x0000, 0x0000 }, /* R1178 */ + { 0x0000, 0x0000, 0x0000 }, /* R1179 */ + { 0x0000, 0x0000, 0x0000 }, /* R1180 */ + { 0x0000, 0x0000, 0x0000 }, /* R1181 */ + { 0x0000, 0x0000, 0x0000 }, /* R1182 */ + { 0x0000, 0x0000, 0x0000 }, /* R1183 */ + { 0x0000, 0x0000, 0x0000 }, /* R1184 */ + { 0x0000, 0x0000, 0x0000 }, /* R1185 */ + { 0x0000, 0x0000, 0x0000 }, /* R1186 */ + { 0x0000, 0x0000, 0x0000 }, /* R1187 */ + { 0x0000, 0x0000, 0x0000 }, /* R1188 */ + { 0x0000, 0x0000, 0x0000 }, /* R1189 */ + { 0x0000, 0x0000, 0x0000 }, /* R1190 */ + { 0x0000, 0x0000, 0x0000 }, /* R1191 */ + { 0x0000, 0x0000, 0x0000 }, /* R1192 */ + { 0x0000, 0x0000, 0x0000 }, /* R1193 */ + { 0x0000, 0x0000, 0x0000 }, /* R1194 */ + { 0x0000, 0x0000, 0x0000 }, /* R1195 */ + { 0x0000, 0x0000, 0x0000 }, /* R1196 */ + { 0x0000, 0x0000, 0x0000 }, /* R1197 */ + { 0x0000, 0x0000, 0x0000 }, /* R1198 */ + { 0x0000, 0x0000, 0x0000 }, /* R1199 */ + { 0x0000, 0x0000, 0x0000 }, /* R1200 */ + { 0x0000, 0x0000, 0x0000 }, /* R1201 */ + { 0x0000, 0x0000, 0x0000 }, /* R1202 */ + { 0x0000, 0x0000, 0x0000 }, /* R1203 */ + { 0x0000, 0x0000, 0x0000 }, /* R1204 */ + { 0x0000, 0x0000, 0x0000 }, /* R1205 */ + { 0x0000, 0x0000, 0x0000 }, /* R1206 */ + { 0x0000, 0x0000, 0x0000 }, /* R1207 */ + { 0x0000, 0x0000, 0x0000 }, /* R1208 */ + { 0x0000, 0x0000, 0x0000 }, /* R1209 */ + { 0x0000, 0x0000, 0x0000 }, /* R1210 */ + { 0x0000, 0x0000, 0x0000 }, /* R1211 */ + { 0x0000, 0x0000, 0x0000 }, /* R1212 */ + { 0x0000, 0x0000, 0x0000 }, /* R1213 */ + { 0x0000, 0x0000, 0x0000 }, /* R1214 */ + { 0x0000, 0x0000, 0x0000 }, /* R1215 */ + { 0x0000, 0x0000, 0x0000 }, /* R1216 */ + { 0x0000, 0x0000, 0x0000 }, /* R1217 */ + { 0x0000, 0x0000, 0x0000 }, /* R1218 */ + { 0x0000, 0x0000, 0x0000 }, /* R1219 */ + { 0x0000, 0x0000, 0x0000 }, /* R1220 */ + { 0x0000, 0x0000, 0x0000 }, /* R1221 */ + { 0x0000, 0x0000, 0x0000 }, /* R1222 */ + { 0x0000, 0x0000, 0x0000 }, /* R1223 */ + { 0x0000, 0x0000, 0x0000 }, /* R1224 */ + { 0x0000, 0x0000, 0x0000 }, /* R1225 */ + { 0x0000, 0x0000, 0x0000 }, /* R1226 */ + { 0x0000, 0x0000, 0x0000 }, /* R1227 */ + { 0x0000, 0x0000, 0x0000 }, /* R1228 */ + { 0x0000, 0x0000, 0x0000 }, /* R1229 */ + { 0x0000, 0x0000, 0x0000 }, /* R1230 */ + { 0x0000, 0x0000, 0x0000 }, /* R1231 */ + { 0x0000, 0x0000, 0x0000 }, /* R1232 */ + { 0x0000, 0x0000, 0x0000 }, /* R1233 */ + { 0x0000, 0x0000, 0x0000 }, /* R1234 */ + { 0x0000, 0x0000, 0x0000 }, /* R1235 */ + { 0x0000, 0x0000, 0x0000 }, /* R1236 */ + { 0x0000, 0x0000, 0x0000 }, /* R1237 */ + { 0x0000, 0x0000, 0x0000 }, /* R1238 */ + { 0x0000, 0x0000, 0x0000 }, /* R1239 */ + { 0x0000, 0x0000, 0x0000 }, /* R1240 */ + { 0x0000, 0x0000, 0x0000 }, /* R1241 */ + { 0x0000, 0x0000, 0x0000 }, /* R1242 */ + { 0x0000, 0x0000, 0x0000 }, /* R1243 */ + { 0x0000, 0x0000, 0x0000 }, /* R1244 */ + { 0x0000, 0x0000, 0x0000 }, /* R1245 */ + { 0x0000, 0x0000, 0x0000 }, /* R1246 */ + { 0x0000, 0x0000, 0x0000 }, /* R1247 */ + { 0x0000, 0x0000, 0x0000 }, /* R1248 */ + { 0x0000, 0x0000, 0x0000 }, /* R1249 */ + { 0x0000, 0x0000, 0x0000 }, /* R1250 */ + { 0x0000, 0x0000, 0x0000 }, /* R1251 */ + { 0x0000, 0x0000, 0x0000 }, /* R1252 */ + { 0x0000, 0x0000, 0x0000 }, /* R1253 */ + { 0x0000, 0x0000, 0x0000 }, /* R1254 */ + { 0x0000, 0x0000, 0x0000 }, /* R1255 */ + { 0x0000, 0x0000, 0x0000 }, /* R1256 */ + { 0x0000, 0x0000, 0x0000 }, /* R1257 */ + { 0x0000, 0x0000, 0x0000 }, /* R1258 */ + { 0x0000, 0x0000, 0x0000 }, /* R1259 */ + { 0x0000, 0x0000, 0x0000 }, /* R1260 */ + { 0x0000, 0x0000, 0x0000 }, /* R1261 */ + { 0x0000, 0x0000, 0x0000 }, /* R1262 */ + { 0x0000, 0x0000, 0x0000 }, /* R1263 */ + { 0x0000, 0x0000, 0x0000 }, /* R1264 */ + { 0x0000, 0x0000, 0x0000 }, /* R1265 */ + { 0x0000, 0x0000, 0x0000 }, /* R1266 */ + { 0x0000, 0x0000, 0x0000 }, /* R1267 */ + { 0x0000, 0x0000, 0x0000 }, /* R1268 */ + { 0x0000, 0x0000, 0x0000 }, /* R1269 */ + { 0x0000, 0x0000, 0x0000 }, /* R1270 */ + { 0x0000, 0x0000, 0x0000 }, /* R1271 */ + { 0x0000, 0x0000, 0x0000 }, /* R1272 */ + { 0x0000, 0x0000, 0x0000 }, /* R1273 */ + { 0x0000, 0x0000, 0x0000 }, /* R1274 */ + { 0x0000, 0x0000, 0x0000 }, /* R1275 */ + { 0x0000, 0x0000, 0x0000 }, /* R1276 */ + { 0x0000, 0x0000, 0x0000 }, /* R1277 */ + { 0x0000, 0x0000, 0x0000 }, /* R1278 */ + { 0x0000, 0x0000, 0x0000 }, /* R1279 */ + { 0x0000, 0x0000, 0x0000 }, /* R1280 */ + { 0x0000, 0x0000, 0x0000 }, /* R1281 */ + { 0x0000, 0x0000, 0x0000 }, /* R1282 */ + { 0x0000, 0x0000, 0x0000 }, /* R1283 */ + { 0x0000, 0x0000, 0x0000 }, /* R1284 */ + { 0x0000, 0x0000, 0x0000 }, /* R1285 */ + { 0x0000, 0x0000, 0x0000 }, /* R1286 */ + { 0x0000, 0x0000, 0x0000 }, /* R1287 */ + { 0x0000, 0x0000, 0x0000 }, /* R1288 */ + { 0x0000, 0x0000, 0x0000 }, /* R1289 */ + { 0x0000, 0x0000, 0x0000 }, /* R1290 */ + { 0x0000, 0x0000, 0x0000 }, /* R1291 */ + { 0x0000, 0x0000, 0x0000 }, /* R1292 */ + { 0x0000, 0x0000, 0x0000 }, /* R1293 */ + { 0x0000, 0x0000, 0x0000 }, /* R1294 */ + { 0x0000, 0x0000, 0x0000 }, /* R1295 */ + { 0x0000, 0x0000, 0x0000 }, /* R1296 */ + { 0x0000, 0x0000, 0x0000 }, /* R1297 */ + { 0x0000, 0x0000, 0x0000 }, /* R1298 */ + { 0x0000, 0x0000, 0x0000 }, /* R1299 */ + { 0x0000, 0x0000, 0x0000 }, /* R1300 */ + { 0x0000, 0x0000, 0x0000 }, /* R1301 */ + { 0x0000, 0x0000, 0x0000 }, /* R1302 */ + { 0x0000, 0x0000, 0x0000 }, /* R1303 */ + { 0x0000, 0x0000, 0x0000 }, /* R1304 */ + { 0x0000, 0x0000, 0x0000 }, /* R1305 */ + { 0x0000, 0x0000, 0x0000 }, /* R1306 */ + { 0x0000, 0x0000, 0x0000 }, /* R1307 */ + { 0x0000, 0x0000, 0x0000 }, /* R1308 */ + { 0x0000, 0x0000, 0x0000 }, /* R1309 */ + { 0x0000, 0x0000, 0x0000 }, /* R1310 */ + { 0x0000, 0x0000, 0x0000 }, /* R1311 */ + { 0x0000, 0x0000, 0x0000 }, /* R1312 */ + { 0x0000, 0x0000, 0x0000 }, /* R1313 */ + { 0x0000, 0x0000, 0x0000 }, /* R1314 */ + { 0x0000, 0x0000, 0x0000 }, /* R1315 */ + { 0x0000, 0x0000, 0x0000 }, /* R1316 */ + { 0x0000, 0x0000, 0x0000 }, /* R1317 */ + { 0x0000, 0x0000, 0x0000 }, /* R1318 */ + { 0x0000, 0x0000, 0x0000 }, /* R1319 */ + { 0x0000, 0x0000, 0x0000 }, /* R1320 */ + { 0x0000, 0x0000, 0x0000 }, /* R1321 */ + { 0x0000, 0x0000, 0x0000 }, /* R1322 */ + { 0x0000, 0x0000, 0x0000 }, /* R1323 */ + { 0x0000, 0x0000, 0x0000 }, /* R1324 */ + { 0x0000, 0x0000, 0x0000 }, /* R1325 */ + { 0x0000, 0x0000, 0x0000 }, /* R1326 */ + { 0x0000, 0x0000, 0x0000 }, /* R1327 */ + { 0x0000, 0x0000, 0x0000 }, /* R1328 */ + { 0x0000, 0x0000, 0x0000 }, /* R1329 */ + { 0x0000, 0x0000, 0x0000 }, /* R1330 */ + { 0x0000, 0x0000, 0x0000 }, /* R1331 */ + { 0x0000, 0x0000, 0x0000 }, /* R1332 */ + { 0x0000, 0x0000, 0x0000 }, /* R1333 */ + { 0x0000, 0x0000, 0x0000 }, /* R1334 */ + { 0x0000, 0x0000, 0x0000 }, /* R1335 */ + { 0x0000, 0x0000, 0x0000 }, /* R1336 */ + { 0x0000, 0x0000, 0x0000 }, /* R1337 */ + { 0x0000, 0x0000, 0x0000 }, /* R1338 */ + { 0x0000, 0x0000, 0x0000 }, /* R1339 */ + { 0x0000, 0x0000, 0x0000 }, /* R1340 */ + { 0x0000, 0x0000, 0x0000 }, /* R1341 */ + { 0x0000, 0x0000, 0x0000 }, /* R1342 */ + { 0x0000, 0x0000, 0x0000 }, /* R1343 */ + { 0x0000, 0x0000, 0x0000 }, /* R1344 */ + { 0x0000, 0x0000, 0x0000 }, /* R1345 */ + { 0x0000, 0x0000, 0x0000 }, /* R1346 */ + { 0x0000, 0x0000, 0x0000 }, /* R1347 */ + { 0x0000, 0x0000, 0x0000 }, /* R1348 */ + { 0x0000, 0x0000, 0x0000 }, /* R1349 */ + { 0x0000, 0x0000, 0x0000 }, /* R1350 */ + { 0x0000, 0x0000, 0x0000 }, /* R1351 */ + { 0x0000, 0x0000, 0x0000 }, /* R1352 */ + { 0x0000, 0x0000, 0x0000 }, /* R1353 */ + { 0x0000, 0x0000, 0x0000 }, /* R1354 */ + { 0x0000, 0x0000, 0x0000 }, /* R1355 */ + { 0x0000, 0x0000, 0x0000 }, /* R1356 */ + { 0x0000, 0x0000, 0x0000 }, /* R1357 */ + { 0x0000, 0x0000, 0x0000 }, /* R1358 */ + { 0x0000, 0x0000, 0x0000 }, /* R1359 */ + { 0x0000, 0x0000, 0x0000 }, /* R1360 */ + { 0x0000, 0x0000, 0x0000 }, /* R1361 */ + { 0x0000, 0x0000, 0x0000 }, /* R1362 */ + { 0x0000, 0x0000, 0x0000 }, /* R1363 */ + { 0x0000, 0x0000, 0x0000 }, /* R1364 */ + { 0x0000, 0x0000, 0x0000 }, /* R1365 */ + { 0x0000, 0x0000, 0x0000 }, /* R1366 */ + { 0x0000, 0x0000, 0x0000 }, /* R1367 */ + { 0x0000, 0x0000, 0x0000 }, /* R1368 */ + { 0x0000, 0x0000, 0x0000 }, /* R1369 */ + { 0x0000, 0x0000, 0x0000 }, /* R1370 */ + { 0x0000, 0x0000, 0x0000 }, /* R1371 */ + { 0x0000, 0x0000, 0x0000 }, /* R1372 */ + { 0x0000, 0x0000, 0x0000 }, /* R1373 */ + { 0x0000, 0x0000, 0x0000 }, /* R1374 */ + { 0x0000, 0x0000, 0x0000 }, /* R1375 */ + { 0x0000, 0x0000, 0x0000 }, /* R1376 */ + { 0x0000, 0x0000, 0x0000 }, /* R1377 */ + { 0x0000, 0x0000, 0x0000 }, /* R1378 */ + { 0x0000, 0x0000, 0x0000 }, /* R1379 */ + { 0x0000, 0x0000, 0x0000 }, /* R1380 */ + { 0x0000, 0x0000, 0x0000 }, /* R1381 */ + { 0x0000, 0x0000, 0x0000 }, /* R1382 */ + { 0x0000, 0x0000, 0x0000 }, /* R1383 */ + { 0x0000, 0x0000, 0x0000 }, /* R1384 */ + { 0x0000, 0x0000, 0x0000 }, /* R1385 */ + { 0x0000, 0x0000, 0x0000 }, /* R1386 */ + { 0x0000, 0x0000, 0x0000 }, /* R1387 */ + { 0x0000, 0x0000, 0x0000 }, /* R1388 */ + { 0x0000, 0x0000, 0x0000 }, /* R1389 */ + { 0x0000, 0x0000, 0x0000 }, /* R1390 */ + { 0x0000, 0x0000, 0x0000 }, /* R1391 */ + { 0x0000, 0x0000, 0x0000 }, /* R1392 */ + { 0x0000, 0x0000, 0x0000 }, /* R1393 */ + { 0x0000, 0x0000, 0x0000 }, /* R1394 */ + { 0x0000, 0x0000, 0x0000 }, /* R1395 */ + { 0x0000, 0x0000, 0x0000 }, /* R1396 */ + { 0x0000, 0x0000, 0x0000 }, /* R1397 */ + { 0x0000, 0x0000, 0x0000 }, /* R1398 */ + { 0x0000, 0x0000, 0x0000 }, /* R1399 */ + { 0x0000, 0x0000, 0x0000 }, /* R1400 */ + { 0x0000, 0x0000, 0x0000 }, /* R1401 */ + { 0x0000, 0x0000, 0x0000 }, /* R1402 */ + { 0x0000, 0x0000, 0x0000 }, /* R1403 */ + { 0x0000, 0x0000, 0x0000 }, /* R1404 */ + { 0x0000, 0x0000, 0x0000 }, /* R1405 */ + { 0x0000, 0x0000, 0x0000 }, /* R1406 */ + { 0x0000, 0x0000, 0x0000 }, /* R1407 */ + { 0x0000, 0x0000, 0x0000 }, /* R1408 */ + { 0x0000, 0x0000, 0x0000 }, /* R1409 */ + { 0x0000, 0x0000, 0x0000 }, /* R1410 */ + { 0x0000, 0x0000, 0x0000 }, /* R1411 */ + { 0x0000, 0x0000, 0x0000 }, /* R1412 */ + { 0x0000, 0x0000, 0x0000 }, /* R1413 */ + { 0x0000, 0x0000, 0x0000 }, /* R1414 */ + { 0x0000, 0x0000, 0x0000 }, /* R1415 */ + { 0x0000, 0x0000, 0x0000 }, /* R1416 */ + { 0x0000, 0x0000, 0x0000 }, /* R1417 */ + { 0x0000, 0x0000, 0x0000 }, /* R1418 */ + { 0x0000, 0x0000, 0x0000 }, /* R1419 */ + { 0x0000, 0x0000, 0x0000 }, /* R1420 */ + { 0x0000, 0x0000, 0x0000 }, /* R1421 */ + { 0x0000, 0x0000, 0x0000 }, /* R1422 */ + { 0x0000, 0x0000, 0x0000 }, /* R1423 */ + { 0x0000, 0x0000, 0x0000 }, /* R1424 */ + { 0x0000, 0x0000, 0x0000 }, /* R1425 */ + { 0x0000, 0x0000, 0x0000 }, /* R1426 */ + { 0x0000, 0x0000, 0x0000 }, /* R1427 */ + { 0x0000, 0x0000, 0x0000 }, /* R1428 */ + { 0x0000, 0x0000, 0x0000 }, /* R1429 */ + { 0x0000, 0x0000, 0x0000 }, /* R1430 */ + { 0x0000, 0x0000, 0x0000 }, /* R1431 */ + { 0x0000, 0x0000, 0x0000 }, /* R1432 */ + { 0x0000, 0x0000, 0x0000 }, /* R1433 */ + { 0x0000, 0x0000, 0x0000 }, /* R1434 */ + { 0x0000, 0x0000, 0x0000 }, /* R1435 */ + { 0x0000, 0x0000, 0x0000 }, /* R1436 */ + { 0x0000, 0x0000, 0x0000 }, /* R1437 */ + { 0x0000, 0x0000, 0x0000 }, /* R1438 */ + { 0x0000, 0x0000, 0x0000 }, /* R1439 */ + { 0x0000, 0x0000, 0x0000 }, /* R1440 */ + { 0x0000, 0x0000, 0x0000 }, /* R1441 */ + { 0x0000, 0x0000, 0x0000 }, /* R1442 */ + { 0x0000, 0x0000, 0x0000 }, /* R1443 */ + { 0x0000, 0x0000, 0x0000 }, /* R1444 */ + { 0x0000, 0x0000, 0x0000 }, /* R1445 */ + { 0x0000, 0x0000, 0x0000 }, /* R1446 */ + { 0x0000, 0x0000, 0x0000 }, /* R1447 */ + { 0x0000, 0x0000, 0x0000 }, /* R1448 */ + { 0x0000, 0x0000, 0x0000 }, /* R1449 */ + { 0x0000, 0x0000, 0x0000 }, /* R1450 */ + { 0x0000, 0x0000, 0x0000 }, /* R1451 */ + { 0x0000, 0x0000, 0x0000 }, /* R1452 */ + { 0x0000, 0x0000, 0x0000 }, /* R1453 */ + { 0x0000, 0x0000, 0x0000 }, /* R1454 */ + { 0x0000, 0x0000, 0x0000 }, /* R1455 */ + { 0x0000, 0x0000, 0x0000 }, /* R1456 */ + { 0x0000, 0x0000, 0x0000 }, /* R1457 */ + { 0x0000, 0x0000, 0x0000 }, /* R1458 */ + { 0x0000, 0x0000, 0x0000 }, /* R1459 */ + { 0x0000, 0x0000, 0x0000 }, /* R1460 */ + { 0x0000, 0x0000, 0x0000 }, /* R1461 */ + { 0x0000, 0x0000, 0x0000 }, /* R1462 */ + { 0x0000, 0x0000, 0x0000 }, /* R1463 */ + { 0x0000, 0x0000, 0x0000 }, /* R1464 */ + { 0x0000, 0x0000, 0x0000 }, /* R1465 */ + { 0x0000, 0x0000, 0x0000 }, /* R1466 */ + { 0x0000, 0x0000, 0x0000 }, /* R1467 */ + { 0x0000, 0x0000, 0x0000 }, /* R1468 */ + { 0x0000, 0x0000, 0x0000 }, /* R1469 */ + { 0x0000, 0x0000, 0x0000 }, /* R1470 */ + { 0x0000, 0x0000, 0x0000 }, /* R1471 */ + { 0x0000, 0x0000, 0x0000 }, /* R1472 */ + { 0x0000, 0x0000, 0x0000 }, /* R1473 */ + { 0x0000, 0x0000, 0x0000 }, /* R1474 */ + { 0x0000, 0x0000, 0x0000 }, /* R1475 */ + { 0x0000, 0x0000, 0x0000 }, /* R1476 */ + { 0x0000, 0x0000, 0x0000 }, /* R1477 */ + { 0x0000, 0x0000, 0x0000 }, /* R1478 */ + { 0x0000, 0x0000, 0x0000 }, /* R1479 */ + { 0x0000, 0x0000, 0x0000 }, /* R1480 */ + { 0x0000, 0x0000, 0x0000 }, /* R1481 */ + { 0x0000, 0x0000, 0x0000 }, /* R1482 */ + { 0x0000, 0x0000, 0x0000 }, /* R1483 */ + { 0x0000, 0x0000, 0x0000 }, /* R1484 */ + { 0x0000, 0x0000, 0x0000 }, /* R1485 */ + { 0x0000, 0x0000, 0x0000 }, /* R1486 */ + { 0x0000, 0x0000, 0x0000 }, /* R1487 */ + { 0x0000, 0x0000, 0x0000 }, /* R1488 */ + { 0x0000, 0x0000, 0x0000 }, /* R1489 */ + { 0x0000, 0x0000, 0x0000 }, /* R1490 */ + { 0x0000, 0x0000, 0x0000 }, /* R1491 */ + { 0x0000, 0x0000, 0x0000 }, /* R1492 */ + { 0x0000, 0x0000, 0x0000 }, /* R1493 */ + { 0x0000, 0x0000, 0x0000 }, /* R1494 */ + { 0x0000, 0x0000, 0x0000 }, /* R1495 */ + { 0x0000, 0x0000, 0x0000 }, /* R1496 */ + { 0x0000, 0x0000, 0x0000 }, /* R1497 */ + { 0x0000, 0x0000, 0x0000 }, /* R1498 */ + { 0x0000, 0x0000, 0x0000 }, /* R1499 */ + { 0x0000, 0x0000, 0x0000 }, /* R1500 */ + { 0x0000, 0x0000, 0x0000 }, /* R1501 */ + { 0x0000, 0x0000, 0x0000 }, /* R1502 */ + { 0x0000, 0x0000, 0x0000 }, /* R1503 */ + { 0x0000, 0x0000, 0x0000 }, /* R1504 */ + { 0x0000, 0x0000, 0x0000 }, /* R1505 */ + { 0x0000, 0x0000, 0x0000 }, /* R1506 */ + { 0x0000, 0x0000, 0x0000 }, /* R1507 */ + { 0x0000, 0x0000, 0x0000 }, /* R1508 */ + { 0x0000, 0x0000, 0x0000 }, /* R1509 */ + { 0x0000, 0x0000, 0x0000 }, /* R1510 */ + { 0x0000, 0x0000, 0x0000 }, /* R1511 */ + { 0x0000, 0x0000, 0x0000 }, /* R1512 */ + { 0x0000, 0x0000, 0x0000 }, /* R1513 */ + { 0x0000, 0x0000, 0x0000 }, /* R1514 */ + { 0x0000, 0x0000, 0x0000 }, /* R1515 */ + { 0x0000, 0x0000, 0x0000 }, /* R1516 */ + { 0x0000, 0x0000, 0x0000 }, /* R1517 */ + { 0x0000, 0x0000, 0x0000 }, /* R1518 */ + { 0x0000, 0x0000, 0x0000 }, /* R1519 */ + { 0x0000, 0x0000, 0x0000 }, /* R1520 */ + { 0x0000, 0x0000, 0x0000 }, /* R1521 */ + { 0x0000, 0x0000, 0x0000 }, /* R1522 */ + { 0x0000, 0x0000, 0x0000 }, /* R1523 */ + { 0x0000, 0x0000, 0x0000 }, /* R1524 */ + { 0x0000, 0x0000, 0x0000 }, /* R1525 */ + { 0x0000, 0x0000, 0x0000 }, /* R1526 */ + { 0x0000, 0x0000, 0x0000 }, /* R1527 */ + { 0x0000, 0x0000, 0x0000 }, /* R1528 */ + { 0x0000, 0x0000, 0x0000 }, /* R1529 */ + { 0x0000, 0x0000, 0x0000 }, /* R1530 */ + { 0x0000, 0x0000, 0x0000 }, /* R1531 */ + { 0x0000, 0x0000, 0x0000 }, /* R1532 */ + { 0x0000, 0x0000, 0x0000 }, /* R1533 */ + { 0x0000, 0x0000, 0x0000 }, /* R1534 */ + { 0x0000, 0x0000, 0x0000 }, /* R1535 */ + { 0x0000, 0x0000, 0x0000 }, /* R1536 */ + { 0x0000, 0x0000, 0x0000 }, /* R1537 */ + { 0x0000, 0x0000, 0x0000 }, /* R1538 */ + { 0x0000, 0x0000, 0x0000 }, /* R1539 */ + { 0x0000, 0x0000, 0x0000 }, /* R1540 */ + { 0x0000, 0x0000, 0x0000 }, /* R1541 */ + { 0x0000, 0x0000, 0x0000 }, /* R1542 */ + { 0x0000, 0x0000, 0x0000 }, /* R1543 */ + { 0x0000, 0x0000, 0x0000 }, /* R1544 */ + { 0x0000, 0x0000, 0x0000 }, /* R1545 */ + { 0x0000, 0x0000, 0x0000 }, /* R1546 */ + { 0x0000, 0x0000, 0x0000 }, /* R1547 */ + { 0x0000, 0x0000, 0x0000 }, /* R1548 */ + { 0x0000, 0x0000, 0x0000 }, /* R1549 */ + { 0x0000, 0x0000, 0x0000 }, /* R1550 */ + { 0x0000, 0x0000, 0x0000 }, /* R1551 */ + { 0x0000, 0x0000, 0x0000 }, /* R1552 */ + { 0x0000, 0x0000, 0x0000 }, /* R1553 */ + { 0x0000, 0x0000, 0x0000 }, /* R1554 */ + { 0x0000, 0x0000, 0x0000 }, /* R1555 */ + { 0x0000, 0x0000, 0x0000 }, /* R1556 */ + { 0x0000, 0x0000, 0x0000 }, /* R1557 */ + { 0x0000, 0x0000, 0x0000 }, /* R1558 */ + { 0x0000, 0x0000, 0x0000 }, /* R1559 */ + { 0x0000, 0x0000, 0x0000 }, /* R1560 */ + { 0x0000, 0x0000, 0x0000 }, /* R1561 */ + { 0x0000, 0x0000, 0x0000 }, /* R1562 */ + { 0x0000, 0x0000, 0x0000 }, /* R1563 */ + { 0x0000, 0x0000, 0x0000 }, /* R1564 */ + { 0x0000, 0x0000, 0x0000 }, /* R1565 */ + { 0x0000, 0x0000, 0x0000 }, /* R1566 */ + { 0x0000, 0x0000, 0x0000 }, /* R1567 */ + { 0x0000, 0x0000, 0x0000 }, /* R1568 */ + { 0x0000, 0x0000, 0x0000 }, /* R1569 */ + { 0x0000, 0x0000, 0x0000 }, /* R1570 */ + { 0x0000, 0x0000, 0x0000 }, /* R1571 */ + { 0x0000, 0x0000, 0x0000 }, /* R1572 */ + { 0x0000, 0x0000, 0x0000 }, /* R1573 */ + { 0x0000, 0x0000, 0x0000 }, /* R1574 */ + { 0x0000, 0x0000, 0x0000 }, /* R1575 */ + { 0x0000, 0x0000, 0x0000 }, /* R1576 */ + { 0x0000, 0x0000, 0x0000 }, /* R1577 */ + { 0x0000, 0x0000, 0x0000 }, /* R1578 */ + { 0x0000, 0x0000, 0x0000 }, /* R1579 */ + { 0x0000, 0x0000, 0x0000 }, /* R1580 */ + { 0x0000, 0x0000, 0x0000 }, /* R1581 */ + { 0x0000, 0x0000, 0x0000 }, /* R1582 */ + { 0x0000, 0x0000, 0x0000 }, /* R1583 */ + { 0x0000, 0x0000, 0x0000 }, /* R1584 */ + { 0x0000, 0x0000, 0x0000 }, /* R1585 */ + { 0x0000, 0x0000, 0x0000 }, /* R1586 */ + { 0x0000, 0x0000, 0x0000 }, /* R1587 */ + { 0x0000, 0x0000, 0x0000 }, /* R1588 */ + { 0x0000, 0x0000, 0x0000 }, /* R1589 */ + { 0x0000, 0x0000, 0x0000 }, /* R1590 */ + { 0x0000, 0x0000, 0x0000 }, /* R1591 */ + { 0x0000, 0x0000, 0x0000 }, /* R1592 */ + { 0x0000, 0x0000, 0x0000 }, /* R1593 */ + { 0x0000, 0x0000, 0x0000 }, /* R1594 */ + { 0x0000, 0x0000, 0x0000 }, /* R1595 */ + { 0x0000, 0x0000, 0x0000 }, /* R1596 */ + { 0x0000, 0x0000, 0x0000 }, /* R1597 */ + { 0x0000, 0x0000, 0x0000 }, /* R1598 */ + { 0x0000, 0x0000, 0x0000 }, /* R1599 */ + { 0x0000, 0x0000, 0x0000 }, /* R1600 */ + { 0x0000, 0x0000, 0x0000 }, /* R1601 */ + { 0x0000, 0x0000, 0x0000 }, /* R1602 */ + { 0x0000, 0x0000, 0x0000 }, /* R1603 */ + { 0x0000, 0x0000, 0x0000 }, /* R1604 */ + { 0x0000, 0x0000, 0x0000 }, /* R1605 */ + { 0x0000, 0x0000, 0x0000 }, /* R1606 */ + { 0x0000, 0x0000, 0x0000 }, /* R1607 */ + { 0x0000, 0x0000, 0x0000 }, /* R1608 */ + { 0x0000, 0x0000, 0x0000 }, /* R1609 */ + { 0x0000, 0x0000, 0x0000 }, /* R1610 */ + { 0x0000, 0x0000, 0x0000 }, /* R1611 */ + { 0x0000, 0x0000, 0x0000 }, /* R1612 */ + { 0x0000, 0x0000, 0x0000 }, /* R1613 */ + { 0x0000, 0x0000, 0x0000 }, /* R1614 */ + { 0x0000, 0x0000, 0x0000 }, /* R1615 */ + { 0x0000, 0x0000, 0x0000 }, /* R1616 */ + { 0x0000, 0x0000, 0x0000 }, /* R1617 */ + { 0x0000, 0x0000, 0x0000 }, /* R1618 */ + { 0x0000, 0x0000, 0x0000 }, /* R1619 */ + { 0x0000, 0x0000, 0x0000 }, /* R1620 */ + { 0x0000, 0x0000, 0x0000 }, /* R1621 */ + { 0x0000, 0x0000, 0x0000 }, /* R1622 */ + { 0x0000, 0x0000, 0x0000 }, /* R1623 */ + { 0x0000, 0x0000, 0x0000 }, /* R1624 */ + { 0x0000, 0x0000, 0x0000 }, /* R1625 */ + { 0x0000, 0x0000, 0x0000 }, /* R1626 */ + { 0x0000, 0x0000, 0x0000 }, /* R1627 */ + { 0x0000, 0x0000, 0x0000 }, /* R1628 */ + { 0x0000, 0x0000, 0x0000 }, /* R1629 */ + { 0x0000, 0x0000, 0x0000 }, /* R1630 */ + { 0x0000, 0x0000, 0x0000 }, /* R1631 */ + { 0x0000, 0x0000, 0x0000 }, /* R1632 */ + { 0x0000, 0x0000, 0x0000 }, /* R1633 */ + { 0x0000, 0x0000, 0x0000 }, /* R1634 */ + { 0x0000, 0x0000, 0x0000 }, /* R1635 */ + { 0x0000, 0x0000, 0x0000 }, /* R1636 */ + { 0x0000, 0x0000, 0x0000 }, /* R1637 */ + { 0x0000, 0x0000, 0x0000 }, /* R1638 */ + { 0x0000, 0x0000, 0x0000 }, /* R1639 */ + { 0x0000, 0x0000, 0x0000 }, /* R1640 */ + { 0x0000, 0x0000, 0x0000 }, /* R1641 */ + { 0x0000, 0x0000, 0x0000 }, /* R1642 */ + { 0x0000, 0x0000, 0x0000 }, /* R1643 */ + { 0x0000, 0x0000, 0x0000 }, /* R1644 */ + { 0x0000, 0x0000, 0x0000 }, /* R1645 */ + { 0x0000, 0x0000, 0x0000 }, /* R1646 */ + { 0x0000, 0x0000, 0x0000 }, /* R1647 */ + { 0x0000, 0x0000, 0x0000 }, /* R1648 */ + { 0x0000, 0x0000, 0x0000 }, /* R1649 */ + { 0x0000, 0x0000, 0x0000 }, /* R1650 */ + { 0x0000, 0x0000, 0x0000 }, /* R1651 */ + { 0x0000, 0x0000, 0x0000 }, /* R1652 */ + { 0x0000, 0x0000, 0x0000 }, /* R1653 */ + { 0x0000, 0x0000, 0x0000 }, /* R1654 */ + { 0x0000, 0x0000, 0x0000 }, /* R1655 */ + { 0x0000, 0x0000, 0x0000 }, /* R1656 */ + { 0x0000, 0x0000, 0x0000 }, /* R1657 */ + { 0x0000, 0x0000, 0x0000 }, /* R1658 */ + { 0x0000, 0x0000, 0x0000 }, /* R1659 */ + { 0x0000, 0x0000, 0x0000 }, /* R1660 */ + { 0x0000, 0x0000, 0x0000 }, /* R1661 */ + { 0x0000, 0x0000, 0x0000 }, /* R1662 */ + { 0x0000, 0x0000, 0x0000 }, /* R1663 */ + { 0x0000, 0x0000, 0x0000 }, /* R1664 */ + { 0x0000, 0x0000, 0x0000 }, /* R1665 */ + { 0x0000, 0x0000, 0x0000 }, /* R1666 */ + { 0x0000, 0x0000, 0x0000 }, /* R1667 */ + { 0x0000, 0x0000, 0x0000 }, /* R1668 */ + { 0x0000, 0x0000, 0x0000 }, /* R1669 */ + { 0x0000, 0x0000, 0x0000 }, /* R1670 */ + { 0x0000, 0x0000, 0x0000 }, /* R1671 */ + { 0x0000, 0x0000, 0x0000 }, /* R1672 */ + { 0x0000, 0x0000, 0x0000 }, /* R1673 */ + { 0x0000, 0x0000, 0x0000 }, /* R1674 */ + { 0x0000, 0x0000, 0x0000 }, /* R1675 */ + { 0x0000, 0x0000, 0x0000 }, /* R1676 */ + { 0x0000, 0x0000, 0x0000 }, /* R1677 */ + { 0x0000, 0x0000, 0x0000 }, /* R1678 */ + { 0x0000, 0x0000, 0x0000 }, /* R1679 */ + { 0x0000, 0x0000, 0x0000 }, /* R1680 */ + { 0x0000, 0x0000, 0x0000 }, /* R1681 */ + { 0x0000, 0x0000, 0x0000 }, /* R1682 */ + { 0x0000, 0x0000, 0x0000 }, /* R1683 */ + { 0x0000, 0x0000, 0x0000 }, /* R1684 */ + { 0x0000, 0x0000, 0x0000 }, /* R1685 */ + { 0x0000, 0x0000, 0x0000 }, /* R1686 */ + { 0x0000, 0x0000, 0x0000 }, /* R1687 */ + { 0x0000, 0x0000, 0x0000 }, /* R1688 */ + { 0x0000, 0x0000, 0x0000 }, /* R1689 */ + { 0x0000, 0x0000, 0x0000 }, /* R1690 */ + { 0x0000, 0x0000, 0x0000 }, /* R1691 */ + { 0x0000, 0x0000, 0x0000 }, /* R1692 */ + { 0x0000, 0x0000, 0x0000 }, /* R1693 */ + { 0x0000, 0x0000, 0x0000 }, /* R1694 */ + { 0x0000, 0x0000, 0x0000 }, /* R1695 */ + { 0x0000, 0x0000, 0x0000 }, /* R1696 */ + { 0x0000, 0x0000, 0x0000 }, /* R1697 */ + { 0x0000, 0x0000, 0x0000 }, /* R1698 */ + { 0x0000, 0x0000, 0x0000 }, /* R1699 */ + { 0x0000, 0x0000, 0x0000 }, /* R1700 */ + { 0x0000, 0x0000, 0x0000 }, /* R1701 */ + { 0x0000, 0x0000, 0x0000 }, /* R1702 */ + { 0x0000, 0x0000, 0x0000 }, /* R1703 */ + { 0x0000, 0x0000, 0x0000 }, /* R1704 */ + { 0x0000, 0x0000, 0x0000 }, /* R1705 */ + { 0x0000, 0x0000, 0x0000 }, /* R1706 */ + { 0x0000, 0x0000, 0x0000 }, /* R1707 */ + { 0x0000, 0x0000, 0x0000 }, /* R1708 */ + { 0x0000, 0x0000, 0x0000 }, /* R1709 */ + { 0x0000, 0x0000, 0x0000 }, /* R1710 */ + { 0x0000, 0x0000, 0x0000 }, /* R1711 */ + { 0x0000, 0x0000, 0x0000 }, /* R1712 */ + { 0x0000, 0x0000, 0x0000 }, /* R1713 */ + { 0x0000, 0x0000, 0x0000 }, /* R1714 */ + { 0x0000, 0x0000, 0x0000 }, /* R1715 */ + { 0x0000, 0x0000, 0x0000 }, /* R1716 */ + { 0x0000, 0x0000, 0x0000 }, /* R1717 */ + { 0x0000, 0x0000, 0x0000 }, /* R1718 */ + { 0x0000, 0x0000, 0x0000 }, /* R1719 */ + { 0x0000, 0x0000, 0x0000 }, /* R1720 */ + { 0x0000, 0x0000, 0x0000 }, /* R1721 */ + { 0x0000, 0x0000, 0x0000 }, /* R1722 */ + { 0x0000, 0x0000, 0x0000 }, /* R1723 */ + { 0x0000, 0x0000, 0x0000 }, /* R1724 */ + { 0x0000, 0x0000, 0x0000 }, /* R1725 */ + { 0x0000, 0x0000, 0x0000 }, /* R1726 */ + { 0x0000, 0x0000, 0x0000 }, /* R1727 */ + { 0x0000, 0x0000, 0x0000 }, /* R1728 */ + { 0x0000, 0x0000, 0x0000 }, /* R1729 */ + { 0x0000, 0x0000, 0x0000 }, /* R1730 */ + { 0x0000, 0x0000, 0x0000 }, /* R1731 */ + { 0x0000, 0x0000, 0x0000 }, /* R1732 */ + { 0x0000, 0x0000, 0x0000 }, /* R1733 */ + { 0x0000, 0x0000, 0x0000 }, /* R1734 */ + { 0x0000, 0x0000, 0x0000 }, /* R1735 */ + { 0x0000, 0x0000, 0x0000 }, /* R1736 */ + { 0x0000, 0x0000, 0x0000 }, /* R1737 */ + { 0x0000, 0x0000, 0x0000 }, /* R1738 */ + { 0x0000, 0x0000, 0x0000 }, /* R1739 */ + { 0x0000, 0x0000, 0x0000 }, /* R1740 */ + { 0x0000, 0x0000, 0x0000 }, /* R1741 */ + { 0x0000, 0x0000, 0x0000 }, /* R1742 */ + { 0x0000, 0x0000, 0x0000 }, /* R1743 */ + { 0x0000, 0x0000, 0x0000 }, /* R1744 */ + { 0x0000, 0x0000, 0x0000 }, /* R1745 */ + { 0x0000, 0x0000, 0x0000 }, /* R1746 */ + { 0x0000, 0x0000, 0x0000 }, /* R1747 */ + { 0x0000, 0x0000, 0x0000 }, /* R1748 */ + { 0x0000, 0x0000, 0x0000 }, /* R1749 */ + { 0x0000, 0x0000, 0x0000 }, /* R1750 */ + { 0x0000, 0x0000, 0x0000 }, /* R1751 */ + { 0x0000, 0x0000, 0x0000 }, /* R1752 */ + { 0x0000, 0x0000, 0x0000 }, /* R1753 */ + { 0x0000, 0x0000, 0x0000 }, /* R1754 */ + { 0x0000, 0x0000, 0x0000 }, /* R1755 */ + { 0x0000, 0x0000, 0x0000 }, /* R1756 */ + { 0x0000, 0x0000, 0x0000 }, /* R1757 */ + { 0x0000, 0x0000, 0x0000 }, /* R1758 */ + { 0x0000, 0x0000, 0x0000 }, /* R1759 */ + { 0x0000, 0x0000, 0x0000 }, /* R1760 */ + { 0x0000, 0x0000, 0x0000 }, /* R1761 */ + { 0x0000, 0x0000, 0x0000 }, /* R1762 */ + { 0x0000, 0x0000, 0x0000 }, /* R1763 */ + { 0x0000, 0x0000, 0x0000 }, /* R1764 */ + { 0x0000, 0x0000, 0x0000 }, /* R1765 */ + { 0x0000, 0x0000, 0x0000 }, /* R1766 */ + { 0x0000, 0x0000, 0x0000 }, /* R1767 */ + { 0x0000, 0x0000, 0x0000 }, /* R1768 */ + { 0x0000, 0x0000, 0x0000 }, /* R1769 */ + { 0x0000, 0x0000, 0x0000 }, /* R1770 */ + { 0x0000, 0x0000, 0x0000 }, /* R1771 */ + { 0x0000, 0x0000, 0x0000 }, /* R1772 */ + { 0x0000, 0x0000, 0x0000 }, /* R1773 */ + { 0x0000, 0x0000, 0x0000 }, /* R1774 */ + { 0x0000, 0x0000, 0x0000 }, /* R1775 */ + { 0x0000, 0x0000, 0x0000 }, /* R1776 */ + { 0x0000, 0x0000, 0x0000 }, /* R1777 */ + { 0x0000, 0x0000, 0x0000 }, /* R1778 */ + { 0x0000, 0x0000, 0x0000 }, /* R1779 */ + { 0x0000, 0x0000, 0x0000 }, /* R1780 */ + { 0x0000, 0x0000, 0x0000 }, /* R1781 */ + { 0x0000, 0x0000, 0x0000 }, /* R1782 */ + { 0x0000, 0x0000, 0x0000 }, /* R1783 */ + { 0x0000, 0x0000, 0x0000 }, /* R1784 */ + { 0x0000, 0x0000, 0x0000 }, /* R1785 */ + { 0x0000, 0x0000, 0x0000 }, /* R1786 */ + { 0x0000, 0x0000, 0x0000 }, /* R1787 */ + { 0x0000, 0x0000, 0x0000 }, /* R1788 */ + { 0x0000, 0x0000, 0x0000 }, /* R1789 */ + { 0x0000, 0x0000, 0x0000 }, /* R1790 */ + { 0x0000, 0x0000, 0x0000 }, /* R1791 */ + { 0x0000, 0x0000, 0x0000 }, /* R1792 */ + { 0x0000, 0x0000, 0x0000 }, /* R1793 */ + { 0x0000, 0x0000, 0x0000 }, /* R1794 */ + { 0x0000, 0x0000, 0x0000 }, /* R1795 */ + { 0x0000, 0x0000, 0x0000 }, /* R1796 */ + { 0x0000, 0x0000, 0x0000 }, /* R1797 */ + { 0x0000, 0x0000, 0x0000 }, /* R1798 */ + { 0x0000, 0x0000, 0x0000 }, /* R1799 */ + { 0x0000, 0x0000, 0x0000 }, /* R1800 */ + { 0x0000, 0x0000, 0x0000 }, /* R1801 */ + { 0x0000, 0x0000, 0x0000 }, /* R1802 */ + { 0x0000, 0x0000, 0x0000 }, /* R1803 */ + { 0x0000, 0x0000, 0x0000 }, /* R1804 */ + { 0x0000, 0x0000, 0x0000 }, /* R1805 */ + { 0x0000, 0x0000, 0x0000 }, /* R1806 */ + { 0x0000, 0x0000, 0x0000 }, /* R1807 */ + { 0x0000, 0x0000, 0x0000 }, /* R1808 */ + { 0x0000, 0x0000, 0x0000 }, /* R1809 */ + { 0x0000, 0x0000, 0x0000 }, /* R1810 */ + { 0x0000, 0x0000, 0x0000 }, /* R1811 */ + { 0x0000, 0x0000, 0x0000 }, /* R1812 */ + { 0x0000, 0x0000, 0x0000 }, /* R1813 */ + { 0x0000, 0x0000, 0x0000 }, /* R1814 */ + { 0x0000, 0x0000, 0x0000 }, /* R1815 */ + { 0x0000, 0x0000, 0x0000 }, /* R1816 */ + { 0x0000, 0x0000, 0x0000 }, /* R1817 */ + { 0x0000, 0x0000, 0x0000 }, /* R1818 */ + { 0x0000, 0x0000, 0x0000 }, /* R1819 */ + { 0x0000, 0x0000, 0x0000 }, /* R1820 */ + { 0x0000, 0x0000, 0x0000 }, /* R1821 */ + { 0x0000, 0x0000, 0x0000 }, /* R1822 */ + { 0x0000, 0x0000, 0x0000 }, /* R1823 */ + { 0x0000, 0x0000, 0x0000 }, /* R1824 */ + { 0x0000, 0x0000, 0x0000 }, /* R1825 */ + { 0x0000, 0x0000, 0x0000 }, /* R1826 */ + { 0x0000, 0x0000, 0x0000 }, /* R1827 */ + { 0x0000, 0x0000, 0x0000 }, /* R1828 */ + { 0x0000, 0x0000, 0x0000 }, /* R1829 */ + { 0x0000, 0x0000, 0x0000 }, /* R1830 */ + { 0x0000, 0x0000, 0x0000 }, /* R1831 */ + { 0x0000, 0x0000, 0x0000 }, /* R1832 */ + { 0x0000, 0x0000, 0x0000 }, /* R1833 */ + { 0x0000, 0x0000, 0x0000 }, /* R1834 */ + { 0x0000, 0x0000, 0x0000 }, /* R1835 */ + { 0x0000, 0x0000, 0x0000 }, /* R1836 */ + { 0x0000, 0x0000, 0x0000 }, /* R1837 */ + { 0x0000, 0x0000, 0x0000 }, /* R1838 */ + { 0x0000, 0x0000, 0x0000 }, /* R1839 */ + { 0x0000, 0x0000, 0x0000 }, /* R1840 */ + { 0x0000, 0x0000, 0x0000 }, /* R1841 */ + { 0x0000, 0x0000, 0x0000 }, /* R1842 */ + { 0x0000, 0x0000, 0x0000 }, /* R1843 */ + { 0x0000, 0x0000, 0x0000 }, /* R1844 */ + { 0x0000, 0x0000, 0x0000 }, /* R1845 */ + { 0x0000, 0x0000, 0x0000 }, /* R1846 */ + { 0x0000, 0x0000, 0x0000 }, /* R1847 */ + { 0x0000, 0x0000, 0x0000 }, /* R1848 */ + { 0x0000, 0x0000, 0x0000 }, /* R1849 */ + { 0x0000, 0x0000, 0x0000 }, /* R1850 */ + { 0x0000, 0x0000, 0x0000 }, /* R1851 */ + { 0x0000, 0x0000, 0x0000 }, /* R1852 */ + { 0x0000, 0x0000, 0x0000 }, /* R1853 */ + { 0x0000, 0x0000, 0x0000 }, /* R1854 */ + { 0x0000, 0x0000, 0x0000 }, /* R1855 */ + { 0x0000, 0x0000, 0x0000 }, /* R1856 */ + { 0x0000, 0x0000, 0x0000 }, /* R1857 */ + { 0x0000, 0x0000, 0x0000 }, /* R1858 */ + { 0x0000, 0x0000, 0x0000 }, /* R1859 */ + { 0x0000, 0x0000, 0x0000 }, /* R1860 */ + { 0x0000, 0x0000, 0x0000 }, /* R1861 */ + { 0x0000, 0x0000, 0x0000 }, /* R1862 */ + { 0x0000, 0x0000, 0x0000 }, /* R1863 */ + { 0x0000, 0x0000, 0x0000 }, /* R1864 */ + { 0x0000, 0x0000, 0x0000 }, /* R1865 */ + { 0x0000, 0x0000, 0x0000 }, /* R1866 */ + { 0x0000, 0x0000, 0x0000 }, /* R1867 */ + { 0x0000, 0x0000, 0x0000 }, /* R1868 */ + { 0x0000, 0x0000, 0x0000 }, /* R1869 */ + { 0x0000, 0x0000, 0x0000 }, /* R1870 */ + { 0x0000, 0x0000, 0x0000 }, /* R1871 */ + { 0x0000, 0x0000, 0x0000 }, /* R1872 */ + { 0x0000, 0x0000, 0x0000 }, /* R1873 */ + { 0x0000, 0x0000, 0x0000 }, /* R1874 */ + { 0x0000, 0x0000, 0x0000 }, /* R1875 */ + { 0x0000, 0x0000, 0x0000 }, /* R1876 */ + { 0x0000, 0x0000, 0x0000 }, /* R1877 */ + { 0x0000, 0x0000, 0x0000 }, /* R1878 */ + { 0x0000, 0x0000, 0x0000 }, /* R1879 */ + { 0x0000, 0x0000, 0x0000 }, /* R1880 */ + { 0x0000, 0x0000, 0x0000 }, /* R1881 */ + { 0x0000, 0x0000, 0x0000 }, /* R1882 */ + { 0x0000, 0x0000, 0x0000 }, /* R1883 */ + { 0x0000, 0x0000, 0x0000 }, /* R1884 */ + { 0x0000, 0x0000, 0x0000 }, /* R1885 */ + { 0x0000, 0x0000, 0x0000 }, /* R1886 */ + { 0x0000, 0x0000, 0x0000 }, /* R1887 */ + { 0x0000, 0x0000, 0x0000 }, /* R1888 */ + { 0x0000, 0x0000, 0x0000 }, /* R1889 */ + { 0x0000, 0x0000, 0x0000 }, /* R1890 */ + { 0x0000, 0x0000, 0x0000 }, /* R1891 */ + { 0x0000, 0x0000, 0x0000 }, /* R1892 */ + { 0x0000, 0x0000, 0x0000 }, /* R1893 */ + { 0x0000, 0x0000, 0x0000 }, /* R1894 */ + { 0x0000, 0x0000, 0x0000 }, /* R1895 */ + { 0x0000, 0x0000, 0x0000 }, /* R1896 */ + { 0x0000, 0x0000, 0x0000 }, /* R1897 */ + { 0x0000, 0x0000, 0x0000 }, /* R1898 */ + { 0x0000, 0x0000, 0x0000 }, /* R1899 */ + { 0x0000, 0x0000, 0x0000 }, /* R1900 */ + { 0x0000, 0x0000, 0x0000 }, /* R1901 */ + { 0x0000, 0x0000, 0x0000 }, /* R1902 */ + { 0x0000, 0x0000, 0x0000 }, /* R1903 */ + { 0x0000, 0x0000, 0x0000 }, /* R1904 */ + { 0x0000, 0x0000, 0x0000 }, /* R1905 */ + { 0x0000, 0x0000, 0x0000 }, /* R1906 */ + { 0x0000, 0x0000, 0x0000 }, /* R1907 */ + { 0x0000, 0x0000, 0x0000 }, /* R1908 */ + { 0x0000, 0x0000, 0x0000 }, /* R1909 */ + { 0x0000, 0x0000, 0x0000 }, /* R1910 */ + { 0x0000, 0x0000, 0x0000 }, /* R1911 */ + { 0x0000, 0x0000, 0x0000 }, /* R1912 */ + { 0x0000, 0x0000, 0x0000 }, /* R1913 */ + { 0x0000, 0x0000, 0x0000 }, /* R1914 */ + { 0x0000, 0x0000, 0x0000 }, /* R1915 */ + { 0x0000, 0x0000, 0x0000 }, /* R1916 */ + { 0x0000, 0x0000, 0x0000 }, /* R1917 */ + { 0x0000, 0x0000, 0x0000 }, /* R1918 */ + { 0x0000, 0x0000, 0x0000 }, /* R1919 */ + { 0x0000, 0x0000, 0x0000 }, /* R1920 */ + { 0x0000, 0x0000, 0x0000 }, /* R1921 */ + { 0x0000, 0x0000, 0x0000 }, /* R1922 */ + { 0x0000, 0x0000, 0x0000 }, /* R1923 */ + { 0x0000, 0x0000, 0x0000 }, /* R1924 */ + { 0x0000, 0x0000, 0x0000 }, /* R1925 */ + { 0x0000, 0x0000, 0x0000 }, /* R1926 */ + { 0x0000, 0x0000, 0x0000 }, /* R1927 */ + { 0x0000, 0x0000, 0x0000 }, /* R1928 */ + { 0x0000, 0x0000, 0x0000 }, /* R1929 */ + { 0x0000, 0x0000, 0x0000 }, /* R1930 */ + { 0x0000, 0x0000, 0x0000 }, /* R1931 */ + { 0x0000, 0x0000, 0x0000 }, /* R1932 */ + { 0x0000, 0x0000, 0x0000 }, /* R1933 */ + { 0x0000, 0x0000, 0x0000 }, /* R1934 */ + { 0x0000, 0x0000, 0x0000 }, /* R1935 */ + { 0x0000, 0x0000, 0x0000 }, /* R1936 */ + { 0x0000, 0x0000, 0x0000 }, /* R1937 */ + { 0x0000, 0x0000, 0x0000 }, /* R1938 */ + { 0x0000, 0x0000, 0x0000 }, /* R1939 */ + { 0x0000, 0x0000, 0x0000 }, /* R1940 */ + { 0x0000, 0x0000, 0x0000 }, /* R1941 */ + { 0x0000, 0x0000, 0x0000 }, /* R1942 */ + { 0x0000, 0x0000, 0x0000 }, /* R1943 */ + { 0x0000, 0x0000, 0x0000 }, /* R1944 */ + { 0x0000, 0x0000, 0x0000 }, /* R1945 */ + { 0x0000, 0x0000, 0x0000 }, /* R1946 */ + { 0x0000, 0x0000, 0x0000 }, /* R1947 */ + { 0x0000, 0x0000, 0x0000 }, /* R1948 */ + { 0x0000, 0x0000, 0x0000 }, /* R1949 */ + { 0x0000, 0x0000, 0x0000 }, /* R1950 */ + { 0x0000, 0x0000, 0x0000 }, /* R1951 */ + { 0x0000, 0x0000, 0x0000 }, /* R1952 */ + { 0x0000, 0x0000, 0x0000 }, /* R1953 */ + { 0x0000, 0x0000, 0x0000 }, /* R1954 */ + { 0x0000, 0x0000, 0x0000 }, /* R1955 */ + { 0x0000, 0x0000, 0x0000 }, /* R1956 */ + { 0x0000, 0x0000, 0x0000 }, /* R1957 */ + { 0x0000, 0x0000, 0x0000 }, /* R1958 */ + { 0x0000, 0x0000, 0x0000 }, /* R1959 */ + { 0x0000, 0x0000, 0x0000 }, /* R1960 */ + { 0x0000, 0x0000, 0x0000 }, /* R1961 */ + { 0x0000, 0x0000, 0x0000 }, /* R1962 */ + { 0x0000, 0x0000, 0x0000 }, /* R1963 */ + { 0x0000, 0x0000, 0x0000 }, /* R1964 */ + { 0x0000, 0x0000, 0x0000 }, /* R1965 */ + { 0x0000, 0x0000, 0x0000 }, /* R1966 */ + { 0x0000, 0x0000, 0x0000 }, /* R1967 */ + { 0x0000, 0x0000, 0x0000 }, /* R1968 */ + { 0x0000, 0x0000, 0x0000 }, /* R1969 */ + { 0x0000, 0x0000, 0x0000 }, /* R1970 */ + { 0x0000, 0x0000, 0x0000 }, /* R1971 */ + { 0x0000, 0x0000, 0x0000 }, /* R1972 */ + { 0x0000, 0x0000, 0x0000 }, /* R1973 */ + { 0x0000, 0x0000, 0x0000 }, /* R1974 */ + { 0x0000, 0x0000, 0x0000 }, /* R1975 */ + { 0x0000, 0x0000, 0x0000 }, /* R1976 */ + { 0x0000, 0x0000, 0x0000 }, /* R1977 */ + { 0x0000, 0x0000, 0x0000 }, /* R1978 */ + { 0x0000, 0x0000, 0x0000 }, /* R1979 */ + { 0x0000, 0x0000, 0x0000 }, /* R1980 */ + { 0x0000, 0x0000, 0x0000 }, /* R1981 */ + { 0x0000, 0x0000, 0x0000 }, /* R1982 */ + { 0x0000, 0x0000, 0x0000 }, /* R1983 */ + { 0x0000, 0x0000, 0x0000 }, /* R1984 */ + { 0x0000, 0x0000, 0x0000 }, /* R1985 */ + { 0x0000, 0x0000, 0x0000 }, /* R1986 */ + { 0x0000, 0x0000, 0x0000 }, /* R1987 */ + { 0x0000, 0x0000, 0x0000 }, /* R1988 */ + { 0x0000, 0x0000, 0x0000 }, /* R1989 */ + { 0x0000, 0x0000, 0x0000 }, /* R1990 */ + { 0x0000, 0x0000, 0x0000 }, /* R1991 */ + { 0x0000, 0x0000, 0x0000 }, /* R1992 */ + { 0x0000, 0x0000, 0x0000 }, /* R1993 */ + { 0x0000, 0x0000, 0x0000 }, /* R1994 */ + { 0x0000, 0x0000, 0x0000 }, /* R1995 */ + { 0x0000, 0x0000, 0x0000 }, /* R1996 */ + { 0x0000, 0x0000, 0x0000 }, /* R1997 */ + { 0x0000, 0x0000, 0x0000 }, /* R1998 */ + { 0x0000, 0x0000, 0x0000 }, /* R1999 */ + { 0x0000, 0x0000, 0x0000 }, /* R2000 */ + { 0x0000, 0x0000, 0x0000 }, /* R2001 */ + { 0x0000, 0x0000, 0x0000 }, /* R2002 */ + { 0x0000, 0x0000, 0x0000 }, /* R2003 */ + { 0x0000, 0x0000, 0x0000 }, /* R2004 */ + { 0x0000, 0x0000, 0x0000 }, /* R2005 */ + { 0x0000, 0x0000, 0x0000 }, /* R2006 */ + { 0x0000, 0x0000, 0x0000 }, /* R2007 */ + { 0x0000, 0x0000, 0x0000 }, /* R2008 */ + { 0x0000, 0x0000, 0x0000 }, /* R2009 */ + { 0x0000, 0x0000, 0x0000 }, /* R2010 */ + { 0x0000, 0x0000, 0x0000 }, /* R2011 */ + { 0x0000, 0x0000, 0x0000 }, /* R2012 */ + { 0x0000, 0x0000, 0x0000 }, /* R2013 */ + { 0x0000, 0x0000, 0x0000 }, /* R2014 */ + { 0x0000, 0x0000, 0x0000 }, /* R2015 */ + { 0x0000, 0x0000, 0x0000 }, /* R2016 */ + { 0x0000, 0x0000, 0x0000 }, /* R2017 */ + { 0x0000, 0x0000, 0x0000 }, /* R2018 */ + { 0x0000, 0x0000, 0x0000 }, /* R2019 */ + { 0x0000, 0x0000, 0x0000 }, /* R2020 */ + { 0x0000, 0x0000, 0x0000 }, /* R2021 */ + { 0x0000, 0x0000, 0x0000 }, /* R2022 */ + { 0x0000, 0x0000, 0x0000 }, /* R2023 */ + { 0x0000, 0x0000, 0x0000 }, /* R2024 */ + { 0x0000, 0x0000, 0x0000 }, /* R2025 */ + { 0x0000, 0x0000, 0x0000 }, /* R2026 */ + { 0x0000, 0x0000, 0x0000 }, /* R2027 */ + { 0x0000, 0x0000, 0x0000 }, /* R2028 */ + { 0x0000, 0x0000, 0x0000 }, /* R2029 */ + { 0x0000, 0x0000, 0x0000 }, /* R2030 */ + { 0x0000, 0x0000, 0x0000 }, /* R2031 */ + { 0x0000, 0x0000, 0x0000 }, /* R2032 */ + { 0x0000, 0x0000, 0x0000 }, /* R2033 */ + { 0x0000, 0x0000, 0x0000 }, /* R2034 */ + { 0x0000, 0x0000, 0x0000 }, /* R2035 */ + { 0x0000, 0x0000, 0x0000 }, /* R2036 */ + { 0x0000, 0x0000, 0x0000 }, /* R2037 */ + { 0x0000, 0x0000, 0x0000 }, /* R2038 */ + { 0x0000, 0x0000, 0x0000 }, /* R2039 */ + { 0x0000, 0x0000, 0x0000 }, /* R2040 */ + { 0x0000, 0x0000, 0x0000 }, /* R2041 */ + { 0x0000, 0x0000, 0x0000 }, /* R2042 */ + { 0x0000, 0x0000, 0x0000 }, /* R2043 */ + { 0x0000, 0x0000, 0x0000 }, /* R2044 */ + { 0x0000, 0x0000, 0x0000 }, /* R2045 */ + { 0x0000, 0x0000, 0x0000 }, /* R2046 */ + { 0x0000, 0x0000, 0x0000 }, /* R2047 */ + { 0x0000, 0x0000, 0x0000 }, /* R2048 */ + { 0x0000, 0x0000, 0x0000 }, /* R2049 */ + { 0x0000, 0x0000, 0x0000 }, /* R2050 */ + { 0x0000, 0x0000, 0x0000 }, /* R2051 */ + { 0x0000, 0x0000, 0x0000 }, /* R2052 */ + { 0x0000, 0x0000, 0x0000 }, /* R2053 */ + { 0x0000, 0x0000, 0x0000 }, /* R2054 */ + { 0x0000, 0x0000, 0x0000 }, /* R2055 */ + { 0x0000, 0x0000, 0x0000 }, /* R2056 */ + { 0x0000, 0x0000, 0x0000 }, /* R2057 */ + { 0x0000, 0x0000, 0x0000 }, /* R2058 */ + { 0x0000, 0x0000, 0x0000 }, /* R2059 */ + { 0x0000, 0x0000, 0x0000 }, /* R2060 */ + { 0x0000, 0x0000, 0x0000 }, /* R2061 */ + { 0x0000, 0x0000, 0x0000 }, /* R2062 */ + { 0x0000, 0x0000, 0x0000 }, /* R2063 */ + { 0x0000, 0x0000, 0x0000 }, /* R2064 */ + { 0x0000, 0x0000, 0x0000 }, /* R2065 */ + { 0x0000, 0x0000, 0x0000 }, /* R2066 */ + { 0x0000, 0x0000, 0x0000 }, /* R2067 */ + { 0x0000, 0x0000, 0x0000 }, /* R2068 */ + { 0x0000, 0x0000, 0x0000 }, /* R2069 */ + { 0x0000, 0x0000, 0x0000 }, /* R2070 */ + { 0x0000, 0x0000, 0x0000 }, /* R2071 */ + { 0x0000, 0x0000, 0x0000 }, /* R2072 */ + { 0x0000, 0x0000, 0x0000 }, /* R2073 */ + { 0x0000, 0x0000, 0x0000 }, /* R2074 */ + { 0x0000, 0x0000, 0x0000 }, /* R2075 */ + { 0x0000, 0x0000, 0x0000 }, /* R2076 */ + { 0x0000, 0x0000, 0x0000 }, /* R2077 */ + { 0x0000, 0x0000, 0x0000 }, /* R2078 */ + { 0x0000, 0x0000, 0x0000 }, /* R2079 */ + { 0x0000, 0x0000, 0x0000 }, /* R2080 */ + { 0x0000, 0x0000, 0x0000 }, /* R2081 */ + { 0x0000, 0x0000, 0x0000 }, /* R2082 */ + { 0x0000, 0x0000, 0x0000 }, /* R2083 */ + { 0x0000, 0x0000, 0x0000 }, /* R2084 */ + { 0x0000, 0x0000, 0x0000 }, /* R2085 */ + { 0x0000, 0x0000, 0x0000 }, /* R2086 */ + { 0x0000, 0x0000, 0x0000 }, /* R2087 */ + { 0x0000, 0x0000, 0x0000 }, /* R2088 */ + { 0x0000, 0x0000, 0x0000 }, /* R2089 */ + { 0x0000, 0x0000, 0x0000 }, /* R2090 */ + { 0x0000, 0x0000, 0x0000 }, /* R2091 */ + { 0x0000, 0x0000, 0x0000 }, /* R2092 */ + { 0x0000, 0x0000, 0x0000 }, /* R2093 */ + { 0x0000, 0x0000, 0x0000 }, /* R2094 */ + { 0x0000, 0x0000, 0x0000 }, /* R2095 */ + { 0x0000, 0x0000, 0x0000 }, /* R2096 */ + { 0x0000, 0x0000, 0x0000 }, /* R2097 */ + { 0x0000, 0x0000, 0x0000 }, /* R2098 */ + { 0x0000, 0x0000, 0x0000 }, /* R2099 */ + { 0x0000, 0x0000, 0x0000 }, /* R2100 */ + { 0x0000, 0x0000, 0x0000 }, /* R2101 */ + { 0x0000, 0x0000, 0x0000 }, /* R2102 */ + { 0x0000, 0x0000, 0x0000 }, /* R2103 */ + { 0x0000, 0x0000, 0x0000 }, /* R2104 */ + { 0x0000, 0x0000, 0x0000 }, /* R2105 */ + { 0x0000, 0x0000, 0x0000 }, /* R2106 */ + { 0x0000, 0x0000, 0x0000 }, /* R2107 */ + { 0x0000, 0x0000, 0x0000 }, /* R2108 */ + { 0x0000, 0x0000, 0x0000 }, /* R2109 */ + { 0x0000, 0x0000, 0x0000 }, /* R2110 */ + { 0x0000, 0x0000, 0x0000 }, /* R2111 */ + { 0x0000, 0x0000, 0x0000 }, /* R2112 */ + { 0x0000, 0x0000, 0x0000 }, /* R2113 */ + { 0x0000, 0x0000, 0x0000 }, /* R2114 */ + { 0x0000, 0x0000, 0x0000 }, /* R2115 */ + { 0x0000, 0x0000, 0x0000 }, /* R2116 */ + { 0x0000, 0x0000, 0x0000 }, /* R2117 */ + { 0x0000, 0x0000, 0x0000 }, /* R2118 */ + { 0x0000, 0x0000, 0x0000 }, /* R2119 */ + { 0x0000, 0x0000, 0x0000 }, /* R2120 */ + { 0x0000, 0x0000, 0x0000 }, /* R2121 */ + { 0x0000, 0x0000, 0x0000 }, /* R2122 */ + { 0x0000, 0x0000, 0x0000 }, /* R2123 */ + { 0x0000, 0x0000, 0x0000 }, /* R2124 */ + { 0x0000, 0x0000, 0x0000 }, /* R2125 */ + { 0x0000, 0x0000, 0x0000 }, /* R2126 */ + { 0x0000, 0x0000, 0x0000 }, /* R2127 */ + { 0x0000, 0x0000, 0x0000 }, /* R2128 */ + { 0x0000, 0x0000, 0x0000 }, /* R2129 */ + { 0x0000, 0x0000, 0x0000 }, /* R2130 */ + { 0x0000, 0x0000, 0x0000 }, /* R2131 */ + { 0x0000, 0x0000, 0x0000 }, /* R2132 */ + { 0x0000, 0x0000, 0x0000 }, /* R2133 */ + { 0x0000, 0x0000, 0x0000 }, /* R2134 */ + { 0x0000, 0x0000, 0x0000 }, /* R2135 */ + { 0x0000, 0x0000, 0x0000 }, /* R2136 */ + { 0x0000, 0x0000, 0x0000 }, /* R2137 */ + { 0x0000, 0x0000, 0x0000 }, /* R2138 */ + { 0x0000, 0x0000, 0x0000 }, /* R2139 */ + { 0x0000, 0x0000, 0x0000 }, /* R2140 */ + { 0x0000, 0x0000, 0x0000 }, /* R2141 */ + { 0x0000, 0x0000, 0x0000 }, /* R2142 */ + { 0x0000, 0x0000, 0x0000 }, /* R2143 */ + { 0x0000, 0x0000, 0x0000 }, /* R2144 */ + { 0x0000, 0x0000, 0x0000 }, /* R2145 */ + { 0x0000, 0x0000, 0x0000 }, /* R2146 */ + { 0x0000, 0x0000, 0x0000 }, /* R2147 */ + { 0x0000, 0x0000, 0x0000 }, /* R2148 */ + { 0x0000, 0x0000, 0x0000 }, /* R2149 */ + { 0x0000, 0x0000, 0x0000 }, /* R2150 */ + { 0x0000, 0x0000, 0x0000 }, /* R2151 */ + { 0x0000, 0x0000, 0x0000 }, /* R2152 */ + { 0x0000, 0x0000, 0x0000 }, /* R2153 */ + { 0x0000, 0x0000, 0x0000 }, /* R2154 */ + { 0x0000, 0x0000, 0x0000 }, /* R2155 */ + { 0x0000, 0x0000, 0x0000 }, /* R2156 */ + { 0x0000, 0x0000, 0x0000 }, /* R2157 */ + { 0x0000, 0x0000, 0x0000 }, /* R2158 */ + { 0x0000, 0x0000, 0x0000 }, /* R2159 */ + { 0x0000, 0x0000, 0x0000 }, /* R2160 */ + { 0x0000, 0x0000, 0x0000 }, /* R2161 */ + { 0x0000, 0x0000, 0x0000 }, /* R2162 */ + { 0x0000, 0x0000, 0x0000 }, /* R2163 */ + { 0x0000, 0x0000, 0x0000 }, /* R2164 */ + { 0x0000, 0x0000, 0x0000 }, /* R2165 */ + { 0x0000, 0x0000, 0x0000 }, /* R2166 */ + { 0x0000, 0x0000, 0x0000 }, /* R2167 */ + { 0x0000, 0x0000, 0x0000 }, /* R2168 */ + { 0x0000, 0x0000, 0x0000 }, /* R2169 */ + { 0x0000, 0x0000, 0x0000 }, /* R2170 */ + { 0x0000, 0x0000, 0x0000 }, /* R2171 */ + { 0x0000, 0x0000, 0x0000 }, /* R2172 */ + { 0x0000, 0x0000, 0x0000 }, /* R2173 */ + { 0x0000, 0x0000, 0x0000 }, /* R2174 */ + { 0x0000, 0x0000, 0x0000 }, /* R2175 */ + { 0x0000, 0x0000, 0x0000 }, /* R2176 */ + { 0x0000, 0x0000, 0x0000 }, /* R2177 */ + { 0x0000, 0x0000, 0x0000 }, /* R2178 */ + { 0x0000, 0x0000, 0x0000 }, /* R2179 */ + { 0x0000, 0x0000, 0x0000 }, /* R2180 */ + { 0x0000, 0x0000, 0x0000 }, /* R2181 */ + { 0x0000, 0x0000, 0x0000 }, /* R2182 */ + { 0x0000, 0x0000, 0x0000 }, /* R2183 */ + { 0x0000, 0x0000, 0x0000 }, /* R2184 */ + { 0x0000, 0x0000, 0x0000 }, /* R2185 */ + { 0x0000, 0x0000, 0x0000 }, /* R2186 */ + { 0x0000, 0x0000, 0x0000 }, /* R2187 */ + { 0x0000, 0x0000, 0x0000 }, /* R2188 */ + { 0x0000, 0x0000, 0x0000 }, /* R2189 */ + { 0x0000, 0x0000, 0x0000 }, /* R2190 */ + { 0x0000, 0x0000, 0x0000 }, /* R2191 */ + { 0x0000, 0x0000, 0x0000 }, /* R2192 */ + { 0x0000, 0x0000, 0x0000 }, /* R2193 */ + { 0x0000, 0x0000, 0x0000 }, /* R2194 */ + { 0x0000, 0x0000, 0x0000 }, /* R2195 */ + { 0x0000, 0x0000, 0x0000 }, /* R2196 */ + { 0x0000, 0x0000, 0x0000 }, /* R2197 */ + { 0x0000, 0x0000, 0x0000 }, /* R2198 */ + { 0x0000, 0x0000, 0x0000 }, /* R2199 */ + { 0x0000, 0x0000, 0x0000 }, /* R2200 */ + { 0x0000, 0x0000, 0x0000 }, /* R2201 */ + { 0x0000, 0x0000, 0x0000 }, /* R2202 */ + { 0x0000, 0x0000, 0x0000 }, /* R2203 */ + { 0x0000, 0x0000, 0x0000 }, /* R2204 */ + { 0x0000, 0x0000, 0x0000 }, /* R2205 */ + { 0x0000, 0x0000, 0x0000 }, /* R2206 */ + { 0x0000, 0x0000, 0x0000 }, /* R2207 */ + { 0x0000, 0x0000, 0x0000 }, /* R2208 */ + { 0x0000, 0x0000, 0x0000 }, /* R2209 */ + { 0x0000, 0x0000, 0x0000 }, /* R2210 */ + { 0x0000, 0x0000, 0x0000 }, /* R2211 */ + { 0x0000, 0x0000, 0x0000 }, /* R2212 */ + { 0x0000, 0x0000, 0x0000 }, /* R2213 */ + { 0x0000, 0x0000, 0x0000 }, /* R2214 */ + { 0x0000, 0x0000, 0x0000 }, /* R2215 */ + { 0x0000, 0x0000, 0x0000 }, /* R2216 */ + { 0x0000, 0x0000, 0x0000 }, /* R2217 */ + { 0x0000, 0x0000, 0x0000 }, /* R2218 */ + { 0x0000, 0x0000, 0x0000 }, /* R2219 */ + { 0x0000, 0x0000, 0x0000 }, /* R2220 */ + { 0x0000, 0x0000, 0x0000 }, /* R2221 */ + { 0x0000, 0x0000, 0x0000 }, /* R2222 */ + { 0x0000, 0x0000, 0x0000 }, /* R2223 */ + { 0x0000, 0x0000, 0x0000 }, /* R2224 */ + { 0x0000, 0x0000, 0x0000 }, /* R2225 */ + { 0x0000, 0x0000, 0x0000 }, /* R2226 */ + { 0x0000, 0x0000, 0x0000 }, /* R2227 */ + { 0x0000, 0x0000, 0x0000 }, /* R2228 */ + { 0x0000, 0x0000, 0x0000 }, /* R2229 */ + { 0x0000, 0x0000, 0x0000 }, /* R2230 */ + { 0x0000, 0x0000, 0x0000 }, /* R2231 */ + { 0x0000, 0x0000, 0x0000 }, /* R2232 */ + { 0x0000, 0x0000, 0x0000 }, /* R2233 */ + { 0x0000, 0x0000, 0x0000 }, /* R2234 */ + { 0x0000, 0x0000, 0x0000 }, /* R2235 */ + { 0x0000, 0x0000, 0x0000 }, /* R2236 */ + { 0x0000, 0x0000, 0x0000 }, /* R2237 */ + { 0x0000, 0x0000, 0x0000 }, /* R2238 */ + { 0x0000, 0x0000, 0x0000 }, /* R2239 */ + { 0x0000, 0x0000, 0x0000 }, /* R2240 */ + { 0x0000, 0x0000, 0x0000 }, /* R2241 */ + { 0x0000, 0x0000, 0x0000 }, /* R2242 */ + { 0x0000, 0x0000, 0x0000 }, /* R2243 */ + { 0x0000, 0x0000, 0x0000 }, /* R2244 */ + { 0x0000, 0x0000, 0x0000 }, /* R2245 */ + { 0x0000, 0x0000, 0x0000 }, /* R2246 */ + { 0x0000, 0x0000, 0x0000 }, /* R2247 */ + { 0x0000, 0x0000, 0x0000 }, /* R2248 */ + { 0x0000, 0x0000, 0x0000 }, /* R2249 */ + { 0x0000, 0x0000, 0x0000 }, /* R2250 */ + { 0x0000, 0x0000, 0x0000 }, /* R2251 */ + { 0x0000, 0x0000, 0x0000 }, /* R2252 */ + { 0x0000, 0x0000, 0x0000 }, /* R2253 */ + { 0x0000, 0x0000, 0x0000 }, /* R2254 */ + { 0x0000, 0x0000, 0x0000 }, /* R2255 */ + { 0x0000, 0x0000, 0x0000 }, /* R2256 */ + { 0x0000, 0x0000, 0x0000 }, /* R2257 */ + { 0x0000, 0x0000, 0x0000 }, /* R2258 */ + { 0x0000, 0x0000, 0x0000 }, /* R2259 */ + { 0x0000, 0x0000, 0x0000 }, /* R2260 */ + { 0x0000, 0x0000, 0x0000 }, /* R2261 */ + { 0x0000, 0x0000, 0x0000 }, /* R2262 */ + { 0x0000, 0x0000, 0x0000 }, /* R2263 */ + { 0x0000, 0x0000, 0x0000 }, /* R2264 */ + { 0x0000, 0x0000, 0x0000 }, /* R2265 */ + { 0x0000, 0x0000, 0x0000 }, /* R2266 */ + { 0x0000, 0x0000, 0x0000 }, /* R2267 */ + { 0x0000, 0x0000, 0x0000 }, /* R2268 */ + { 0x0000, 0x0000, 0x0000 }, /* R2269 */ + { 0x0000, 0x0000, 0x0000 }, /* R2270 */ + { 0x0000, 0x0000, 0x0000 }, /* R2271 */ + { 0x0000, 0x0000, 0x0000 }, /* R2272 */ + { 0x0000, 0x0000, 0x0000 }, /* R2273 */ + { 0x0000, 0x0000, 0x0000 }, /* R2274 */ + { 0x0000, 0x0000, 0x0000 }, /* R2275 */ + { 0x0000, 0x0000, 0x0000 }, /* R2276 */ + { 0x0000, 0x0000, 0x0000 }, /* R2277 */ + { 0x0000, 0x0000, 0x0000 }, /* R2278 */ + { 0x0000, 0x0000, 0x0000 }, /* R2279 */ + { 0x0000, 0x0000, 0x0000 }, /* R2280 */ + { 0x0000, 0x0000, 0x0000 }, /* R2281 */ + { 0x0000, 0x0000, 0x0000 }, /* R2282 */ + { 0x0000, 0x0000, 0x0000 }, /* R2283 */ + { 0x0000, 0x0000, 0x0000 }, /* R2284 */ + { 0x0000, 0x0000, 0x0000 }, /* R2285 */ + { 0x0000, 0x0000, 0x0000 }, /* R2286 */ + { 0x0000, 0x0000, 0x0000 }, /* R2287 */ + { 0x0000, 0x0000, 0x0000 }, /* R2288 */ + { 0x0000, 0x0000, 0x0000 }, /* R2289 */ + { 0x0000, 0x0000, 0x0000 }, /* R2290 */ + { 0x0000, 0x0000, 0x0000 }, /* R2291 */ + { 0x0000, 0x0000, 0x0000 }, /* R2292 */ + { 0x0000, 0x0000, 0x0000 }, /* R2293 */ + { 0x0000, 0x0000, 0x0000 }, /* R2294 */ + { 0x0000, 0x0000, 0x0000 }, /* R2295 */ + { 0x0000, 0x0000, 0x0000 }, /* R2296 */ + { 0x0000, 0x0000, 0x0000 }, /* R2297 */ + { 0x0000, 0x0000, 0x0000 }, /* R2298 */ + { 0x0000, 0x0000, 0x0000 }, /* R2299 */ + { 0x0000, 0x0000, 0x0000 }, /* R2300 */ + { 0x0000, 0x0000, 0x0000 }, /* R2301 */ + { 0x0000, 0x0000, 0x0000 }, /* R2302 */ + { 0x0000, 0x0000, 0x0000 }, /* R2303 */ + { 0x0000, 0x0000, 0x0000 }, /* R2304 */ + { 0x0000, 0x0000, 0x0000 }, /* R2305 */ + { 0x0000, 0x0000, 0x0000 }, /* R2306 */ + { 0x0000, 0x0000, 0x0000 }, /* R2307 */ + { 0x0000, 0x0000, 0x0000 }, /* R2308 */ + { 0x0000, 0x0000, 0x0000 }, /* R2309 */ + { 0x0000, 0x0000, 0x0000 }, /* R2310 */ + { 0x0000, 0x0000, 0x0000 }, /* R2311 */ + { 0x0000, 0x0000, 0x0000 }, /* R2312 */ + { 0x0000, 0x0000, 0x0000 }, /* R2313 */ + { 0x0000, 0x0000, 0x0000 }, /* R2314 */ + { 0x0000, 0x0000, 0x0000 }, /* R2315 */ + { 0x0000, 0x0000, 0x0000 }, /* R2316 */ + { 0x0000, 0x0000, 0x0000 }, /* R2317 */ + { 0x0000, 0x0000, 0x0000 }, /* R2318 */ + { 0x0000, 0x0000, 0x0000 }, /* R2319 */ + { 0x0000, 0x0000, 0x0000 }, /* R2320 */ + { 0x0000, 0x0000, 0x0000 }, /* R2321 */ + { 0x0000, 0x0000, 0x0000 }, /* R2322 */ + { 0x0000, 0x0000, 0x0000 }, /* R2323 */ + { 0x0000, 0x0000, 0x0000 }, /* R2324 */ + { 0x0000, 0x0000, 0x0000 }, /* R2325 */ + { 0x0000, 0x0000, 0x0000 }, /* R2326 */ + { 0x0000, 0x0000, 0x0000 }, /* R2327 */ + { 0x0000, 0x0000, 0x0000 }, /* R2328 */ + { 0x0000, 0x0000, 0x0000 }, /* R2329 */ + { 0x0000, 0x0000, 0x0000 }, /* R2330 */ + { 0x0000, 0x0000, 0x0000 }, /* R2331 */ + { 0x0000, 0x0000, 0x0000 }, /* R2332 */ + { 0x0000, 0x0000, 0x0000 }, /* R2333 */ + { 0x0000, 0x0000, 0x0000 }, /* R2334 */ + { 0x0000, 0x0000, 0x0000 }, /* R2335 */ + { 0x0000, 0x0000, 0x0000 }, /* R2336 */ + { 0x0000, 0x0000, 0x0000 }, /* R2337 */ + { 0x0000, 0x0000, 0x0000 }, /* R2338 */ + { 0x0000, 0x0000, 0x0000 }, /* R2339 */ + { 0x0000, 0x0000, 0x0000 }, /* R2340 */ + { 0x0000, 0x0000, 0x0000 }, /* R2341 */ + { 0x0000, 0x0000, 0x0000 }, /* R2342 */ + { 0x0000, 0x0000, 0x0000 }, /* R2343 */ + { 0x0000, 0x0000, 0x0000 }, /* R2344 */ + { 0x0000, 0x0000, 0x0000 }, /* R2345 */ + { 0x0000, 0x0000, 0x0000 }, /* R2346 */ + { 0x0000, 0x0000, 0x0000 }, /* R2347 */ + { 0x0000, 0x0000, 0x0000 }, /* R2348 */ + { 0x0000, 0x0000, 0x0000 }, /* R2349 */ + { 0x0000, 0x0000, 0x0000 }, /* R2350 */ + { 0x0000, 0x0000, 0x0000 }, /* R2351 */ + { 0x0000, 0x0000, 0x0000 }, /* R2352 */ + { 0x0000, 0x0000, 0x0000 }, /* R2353 */ + { 0x0000, 0x0000, 0x0000 }, /* R2354 */ + { 0x0000, 0x0000, 0x0000 }, /* R2355 */ + { 0x0000, 0x0000, 0x0000 }, /* R2356 */ + { 0x0000, 0x0000, 0x0000 }, /* R2357 */ + { 0x0000, 0x0000, 0x0000 }, /* R2358 */ + { 0x0000, 0x0000, 0x0000 }, /* R2359 */ + { 0x0000, 0x0000, 0x0000 }, /* R2360 */ + { 0x0000, 0x0000, 0x0000 }, /* R2361 */ + { 0x0000, 0x0000, 0x0000 }, /* R2362 */ + { 0x0000, 0x0000, 0x0000 }, /* R2363 */ + { 0x0000, 0x0000, 0x0000 }, /* R2364 */ + { 0x0000, 0x0000, 0x0000 }, /* R2365 */ + { 0x0000, 0x0000, 0x0000 }, /* R2366 */ + { 0x0000, 0x0000, 0x0000 }, /* R2367 */ + { 0x0000, 0x0000, 0x0000 }, /* R2368 */ + { 0x0000, 0x0000, 0x0000 }, /* R2369 */ + { 0x0000, 0x0000, 0x0000 }, /* R2370 */ + { 0x0000, 0x0000, 0x0000 }, /* R2371 */ + { 0x0000, 0x0000, 0x0000 }, /* R2372 */ + { 0x0000, 0x0000, 0x0000 }, /* R2373 */ + { 0x0000, 0x0000, 0x0000 }, /* R2374 */ + { 0x0000, 0x0000, 0x0000 }, /* R2375 */ + { 0x0000, 0x0000, 0x0000 }, /* R2376 */ + { 0x0000, 0x0000, 0x0000 }, /* R2377 */ + { 0x0000, 0x0000, 0x0000 }, /* R2378 */ + { 0x0000, 0x0000, 0x0000 }, /* R2379 */ + { 0x0000, 0x0000, 0x0000 }, /* R2380 */ + { 0x0000, 0x0000, 0x0000 }, /* R2381 */ + { 0x0000, 0x0000, 0x0000 }, /* R2382 */ + { 0x0000, 0x0000, 0x0000 }, /* R2383 */ + { 0x0000, 0x0000, 0x0000 }, /* R2384 */ + { 0x0000, 0x0000, 0x0000 }, /* R2385 */ + { 0x0000, 0x0000, 0x0000 }, /* R2386 */ + { 0x0000, 0x0000, 0x0000 }, /* R2387 */ + { 0x0000, 0x0000, 0x0000 }, /* R2388 */ + { 0x0000, 0x0000, 0x0000 }, /* R2389 */ + { 0x0000, 0x0000, 0x0000 }, /* R2390 */ + { 0x0000, 0x0000, 0x0000 }, /* R2391 */ + { 0x0000, 0x0000, 0x0000 }, /* R2392 */ + { 0x0000, 0x0000, 0x0000 }, /* R2393 */ + { 0x0000, 0x0000, 0x0000 }, /* R2394 */ + { 0x0000, 0x0000, 0x0000 }, /* R2395 */ + { 0x0000, 0x0000, 0x0000 }, /* R2396 */ + { 0x0000, 0x0000, 0x0000 }, /* R2397 */ + { 0x0000, 0x0000, 0x0000 }, /* R2398 */ + { 0x0000, 0x0000, 0x0000 }, /* R2399 */ + { 0x0000, 0x0000, 0x0000 }, /* R2400 */ + { 0x0000, 0x0000, 0x0000 }, /* R2401 */ + { 0x0000, 0x0000, 0x0000 }, /* R2402 */ + { 0x0000, 0x0000, 0x0000 }, /* R2403 */ + { 0x0000, 0x0000, 0x0000 }, /* R2404 */ + { 0x0000, 0x0000, 0x0000 }, /* R2405 */ + { 0x0000, 0x0000, 0x0000 }, /* R2406 */ + { 0x0000, 0x0000, 0x0000 }, /* R2407 */ + { 0x0000, 0x0000, 0x0000 }, /* R2408 */ + { 0x0000, 0x0000, 0x0000 }, /* R2409 */ + { 0x0000, 0x0000, 0x0000 }, /* R2410 */ + { 0x0000, 0x0000, 0x0000 }, /* R2411 */ + { 0x0000, 0x0000, 0x0000 }, /* R2412 */ + { 0x0000, 0x0000, 0x0000 }, /* R2413 */ + { 0x0000, 0x0000, 0x0000 }, /* R2414 */ + { 0x0000, 0x0000, 0x0000 }, /* R2415 */ + { 0x0000, 0x0000, 0x0000 }, /* R2416 */ + { 0x0000, 0x0000, 0x0000 }, /* R2417 */ + { 0x0000, 0x0000, 0x0000 }, /* R2418 */ + { 0x0000, 0x0000, 0x0000 }, /* R2419 */ + { 0x0000, 0x0000, 0x0000 }, /* R2420 */ + { 0x0000, 0x0000, 0x0000 }, /* R2421 */ + { 0x0000, 0x0000, 0x0000 }, /* R2422 */ + { 0x0000, 0x0000, 0x0000 }, /* R2423 */ + { 0x0000, 0x0000, 0x0000 }, /* R2424 */ + { 0x0000, 0x0000, 0x0000 }, /* R2425 */ + { 0x0000, 0x0000, 0x0000 }, /* R2426 */ + { 0x0000, 0x0000, 0x0000 }, /* R2427 */ + { 0x0000, 0x0000, 0x0000 }, /* R2428 */ + { 0x0000, 0x0000, 0x0000 }, /* R2429 */ + { 0x0000, 0x0000, 0x0000 }, /* R2430 */ + { 0x0000, 0x0000, 0x0000 }, /* R2431 */ + { 0x0000, 0x0000, 0x0000 }, /* R2432 */ + { 0x0000, 0x0000, 0x0000 }, /* R2433 */ + { 0x0000, 0x0000, 0x0000 }, /* R2434 */ + { 0x0000, 0x0000, 0x0000 }, /* R2435 */ + { 0x0000, 0x0000, 0x0000 }, /* R2436 */ + { 0x0000, 0x0000, 0x0000 }, /* R2437 */ + { 0x0000, 0x0000, 0x0000 }, /* R2438 */ + { 0x0000, 0x0000, 0x0000 }, /* R2439 */ + { 0x0000, 0x0000, 0x0000 }, /* R2440 */ + { 0x0000, 0x0000, 0x0000 }, /* R2441 */ + { 0x0000, 0x0000, 0x0000 }, /* R2442 */ + { 0x0000, 0x0000, 0x0000 }, /* R2443 */ + { 0x0000, 0x0000, 0x0000 }, /* R2444 */ + { 0x0000, 0x0000, 0x0000 }, /* R2445 */ + { 0x0000, 0x0000, 0x0000 }, /* R2446 */ + { 0x0000, 0x0000, 0x0000 }, /* R2447 */ + { 0x0000, 0x0000, 0x0000 }, /* R2448 */ + { 0x0000, 0x0000, 0x0000 }, /* R2449 */ + { 0x0000, 0x0000, 0x0000 }, /* R2450 */ + { 0x0000, 0x0000, 0x0000 }, /* R2451 */ + { 0x0000, 0x0000, 0x0000 }, /* R2452 */ + { 0x0000, 0x0000, 0x0000 }, /* R2453 */ + { 0x0000, 0x0000, 0x0000 }, /* R2454 */ + { 0x0000, 0x0000, 0x0000 }, /* R2455 */ + { 0x0000, 0x0000, 0x0000 }, /* R2456 */ + { 0x0000, 0x0000, 0x0000 }, /* R2457 */ + { 0x0000, 0x0000, 0x0000 }, /* R2458 */ + { 0x0000, 0x0000, 0x0000 }, /* R2459 */ + { 0x0000, 0x0000, 0x0000 }, /* R2460 */ + { 0x0000, 0x0000, 0x0000 }, /* R2461 */ + { 0x0000, 0x0000, 0x0000 }, /* R2462 */ + { 0x0000, 0x0000, 0x0000 }, /* R2463 */ + { 0x0000, 0x0000, 0x0000 }, /* R2464 */ + { 0x0000, 0x0000, 0x0000 }, /* R2465 */ + { 0x0000, 0x0000, 0x0000 }, /* R2466 */ + { 0x0000, 0x0000, 0x0000 }, /* R2467 */ + { 0x0000, 0x0000, 0x0000 }, /* R2468 */ + { 0x0000, 0x0000, 0x0000 }, /* R2469 */ + { 0x0000, 0x0000, 0x0000 }, /* R2470 */ + { 0x0000, 0x0000, 0x0000 }, /* R2471 */ + { 0x0000, 0x0000, 0x0000 }, /* R2472 */ + { 0x0000, 0x0000, 0x0000 }, /* R2473 */ + { 0x0000, 0x0000, 0x0000 }, /* R2474 */ + { 0x0000, 0x0000, 0x0000 }, /* R2475 */ + { 0x0000, 0x0000, 0x0000 }, /* R2476 */ + { 0x0000, 0x0000, 0x0000 }, /* R2477 */ + { 0x0000, 0x0000, 0x0000 }, /* R2478 */ + { 0x0000, 0x0000, 0x0000 }, /* R2479 */ + { 0x0000, 0x0000, 0x0000 }, /* R2480 */ + { 0x0000, 0x0000, 0x0000 }, /* R2481 */ + { 0x0000, 0x0000, 0x0000 }, /* R2482 */ + { 0x0000, 0x0000, 0x0000 }, /* R2483 */ + { 0x0000, 0x0000, 0x0000 }, /* R2484 */ + { 0x0000, 0x0000, 0x0000 }, /* R2485 */ + { 0x0000, 0x0000, 0x0000 }, /* R2486 */ + { 0x0000, 0x0000, 0x0000 }, /* R2487 */ + { 0x0000, 0x0000, 0x0000 }, /* R2488 */ + { 0x0000, 0x0000, 0x0000 }, /* R2489 */ + { 0x0000, 0x0000, 0x0000 }, /* R2490 */ + { 0x0000, 0x0000, 0x0000 }, /* R2491 */ + { 0x0000, 0x0000, 0x0000 }, /* R2492 */ + { 0x0000, 0x0000, 0x0000 }, /* R2493 */ + { 0x0000, 0x0000, 0x0000 }, /* R2494 */ + { 0x0000, 0x0000, 0x0000 }, /* R2495 */ + { 0x0000, 0x0000, 0x0000 }, /* R2496 */ + { 0x0000, 0x0000, 0x0000 }, /* R2497 */ + { 0x0000, 0x0000, 0x0000 }, /* R2498 */ + { 0x0000, 0x0000, 0x0000 }, /* R2499 */ + { 0x0000, 0x0000, 0x0000 }, /* R2500 */ + { 0x0000, 0x0000, 0x0000 }, /* R2501 */ + { 0x0000, 0x0000, 0x0000 }, /* R2502 */ + { 0x0000, 0x0000, 0x0000 }, /* R2503 */ + { 0x0000, 0x0000, 0x0000 }, /* R2504 */ + { 0x0000, 0x0000, 0x0000 }, /* R2505 */ + { 0x0000, 0x0000, 0x0000 }, /* R2506 */ + { 0x0000, 0x0000, 0x0000 }, /* R2507 */ + { 0x0000, 0x0000, 0x0000 }, /* R2508 */ + { 0x0000, 0x0000, 0x0000 }, /* R2509 */ + { 0x0000, 0x0000, 0x0000 }, /* R2510 */ + { 0x0000, 0x0000, 0x0000 }, /* R2511 */ + { 0x0000, 0x0000, 0x0000 }, /* R2512 */ + { 0x0000, 0x0000, 0x0000 }, /* R2513 */ + { 0x0000, 0x0000, 0x0000 }, /* R2514 */ + { 0x0000, 0x0000, 0x0000 }, /* R2515 */ + { 0x0000, 0x0000, 0x0000 }, /* R2516 */ + { 0x0000, 0x0000, 0x0000 }, /* R2517 */ + { 0x0000, 0x0000, 0x0000 }, /* R2518 */ + { 0x0000, 0x0000, 0x0000 }, /* R2519 */ + { 0x0000, 0x0000, 0x0000 }, /* R2520 */ + { 0x0000, 0x0000, 0x0000 }, /* R2521 */ + { 0x0000, 0x0000, 0x0000 }, /* R2522 */ + { 0x0000, 0x0000, 0x0000 }, /* R2523 */ + { 0x0000, 0x0000, 0x0000 }, /* R2524 */ + { 0x0000, 0x0000, 0x0000 }, /* R2525 */ + { 0x0000, 0x0000, 0x0000 }, /* R2526 */ + { 0x0000, 0x0000, 0x0000 }, /* R2527 */ + { 0x0000, 0x0000, 0x0000 }, /* R2528 */ + { 0x0000, 0x0000, 0x0000 }, /* R2529 */ + { 0x0000, 0x0000, 0x0000 }, /* R2530 */ + { 0x0000, 0x0000, 0x0000 }, /* R2531 */ + { 0x0000, 0x0000, 0x0000 }, /* R2532 */ + { 0x0000, 0x0000, 0x0000 }, /* R2533 */ + { 0x0000, 0x0000, 0x0000 }, /* R2534 */ + { 0x0000, 0x0000, 0x0000 }, /* R2535 */ + { 0x0000, 0x0000, 0x0000 }, /* R2536 */ + { 0x0000, 0x0000, 0x0000 }, /* R2537 */ + { 0x0000, 0x0000, 0x0000 }, /* R2538 */ + { 0x0000, 0x0000, 0x0000 }, /* R2539 */ + { 0x0000, 0x0000, 0x0000 }, /* R2540 */ + { 0x0000, 0x0000, 0x0000 }, /* R2541 */ + { 0x0000, 0x0000, 0x0000 }, /* R2542 */ + { 0x0000, 0x0000, 0x0000 }, /* R2543 */ + { 0x0000, 0x0000, 0x0000 }, /* R2544 */ + { 0x0000, 0x0000, 0x0000 }, /* R2545 */ + { 0x0000, 0x0000, 0x0000 }, /* R2546 */ + { 0x0000, 0x0000, 0x0000 }, /* R2547 */ + { 0x0000, 0x0000, 0x0000 }, /* R2548 */ + { 0x0000, 0x0000, 0x0000 }, /* R2549 */ + { 0x0000, 0x0000, 0x0000 }, /* R2550 */ + { 0x0000, 0x0000, 0x0000 }, /* R2551 */ + { 0x0000, 0x0000, 0x0000 }, /* R2552 */ + { 0x0000, 0x0000, 0x0000 }, /* R2553 */ + { 0x0000, 0x0000, 0x0000 }, /* R2554 */ + { 0x0000, 0x0000, 0x0000 }, /* R2555 */ + { 0x0000, 0x0000, 0x0000 }, /* R2556 */ + { 0x0000, 0x0000, 0x0000 }, /* R2557 */ + { 0x0000, 0x0000, 0x0000 }, /* R2558 */ + { 0x0000, 0x0000, 0x0000 }, /* R2559 */ + { 0x0000, 0x0000, 0x0000 }, /* R2560 */ + { 0x0000, 0x0000, 0x0000 }, /* R2561 */ + { 0x0000, 0x0000, 0x0000 }, /* R2562 */ + { 0x0000, 0x0000, 0x0000 }, /* R2563 */ + { 0x0000, 0x0000, 0x0000 }, /* R2564 */ + { 0x0000, 0x0000, 0x0000 }, /* R2565 */ + { 0x0000, 0x0000, 0x0000 }, /* R2566 */ + { 0x0000, 0x0000, 0x0000 }, /* R2567 */ + { 0x0000, 0x0000, 0x0000 }, /* R2568 */ + { 0x0000, 0x0000, 0x0000 }, /* R2569 */ + { 0x0000, 0x0000, 0x0000 }, /* R2570 */ + { 0x0000, 0x0000, 0x0000 }, /* R2571 */ + { 0x0000, 0x0000, 0x0000 }, /* R2572 */ + { 0x0000, 0x0000, 0x0000 }, /* R2573 */ + { 0x0000, 0x0000, 0x0000 }, /* R2574 */ + { 0x0000, 0x0000, 0x0000 }, /* R2575 */ + { 0x0000, 0x0000, 0x0000 }, /* R2576 */ + { 0x0000, 0x0000, 0x0000 }, /* R2577 */ + { 0x0000, 0x0000, 0x0000 }, /* R2578 */ + { 0x0000, 0x0000, 0x0000 }, /* R2579 */ + { 0x0000, 0x0000, 0x0000 }, /* R2580 */ + { 0x0000, 0x0000, 0x0000 }, /* R2581 */ + { 0x0000, 0x0000, 0x0000 }, /* R2582 */ + { 0x0000, 0x0000, 0x0000 }, /* R2583 */ + { 0x0000, 0x0000, 0x0000 }, /* R2584 */ + { 0x0000, 0x0000, 0x0000 }, /* R2585 */ + { 0x0000, 0x0000, 0x0000 }, /* R2586 */ + { 0x0000, 0x0000, 0x0000 }, /* R2587 */ + { 0x0000, 0x0000, 0x0000 }, /* R2588 */ + { 0x0000, 0x0000, 0x0000 }, /* R2589 */ + { 0x0000, 0x0000, 0x0000 }, /* R2590 */ + { 0x0000, 0x0000, 0x0000 }, /* R2591 */ + { 0x0000, 0x0000, 0x0000 }, /* R2592 */ + { 0x0000, 0x0000, 0x0000 }, /* R2593 */ + { 0x0000, 0x0000, 0x0000 }, /* R2594 */ + { 0x0000, 0x0000, 0x0000 }, /* R2595 */ + { 0x0000, 0x0000, 0x0000 }, /* R2596 */ + { 0x0000, 0x0000, 0x0000 }, /* R2597 */ + { 0x0000, 0x0000, 0x0000 }, /* R2598 */ + { 0x0000, 0x0000, 0x0000 }, /* R2599 */ + { 0x0000, 0x0000, 0x0000 }, /* R2600 */ + { 0x0000, 0x0000, 0x0000 }, /* R2601 */ + { 0x0000, 0x0000, 0x0000 }, /* R2602 */ + { 0x0000, 0x0000, 0x0000 }, /* R2603 */ + { 0x0000, 0x0000, 0x0000 }, /* R2604 */ + { 0x0000, 0x0000, 0x0000 }, /* R2605 */ + { 0x0000, 0x0000, 0x0000 }, /* R2606 */ + { 0x0000, 0x0000, 0x0000 }, /* R2607 */ + { 0x0000, 0x0000, 0x0000 }, /* R2608 */ + { 0x0000, 0x0000, 0x0000 }, /* R2609 */ + { 0x0000, 0x0000, 0x0000 }, /* R2610 */ + { 0x0000, 0x0000, 0x0000 }, /* R2611 */ + { 0x0000, 0x0000, 0x0000 }, /* R2612 */ + { 0x0000, 0x0000, 0x0000 }, /* R2613 */ + { 0x0000, 0x0000, 0x0000 }, /* R2614 */ + { 0x0000, 0x0000, 0x0000 }, /* R2615 */ + { 0x0000, 0x0000, 0x0000 }, /* R2616 */ + { 0x0000, 0x0000, 0x0000 }, /* R2617 */ + { 0x0000, 0x0000, 0x0000 }, /* R2618 */ + { 0x0000, 0x0000, 0x0000 }, /* R2619 */ + { 0x0000, 0x0000, 0x0000 }, /* R2620 */ + { 0x0000, 0x0000, 0x0000 }, /* R2621 */ + { 0x0000, 0x0000, 0x0000 }, /* R2622 */ + { 0x0000, 0x0000, 0x0000 }, /* R2623 */ + { 0x0000, 0x0000, 0x0000 }, /* R2624 */ + { 0x0000, 0x0000, 0x0000 }, /* R2625 */ + { 0x0000, 0x0000, 0x0000 }, /* R2626 */ + { 0x0000, 0x0000, 0x0000 }, /* R2627 */ + { 0x0000, 0x0000, 0x0000 }, /* R2628 */ + { 0x0000, 0x0000, 0x0000 }, /* R2629 */ + { 0x0000, 0x0000, 0x0000 }, /* R2630 */ + { 0x0000, 0x0000, 0x0000 }, /* R2631 */ + { 0x0000, 0x0000, 0x0000 }, /* R2632 */ + { 0x0000, 0x0000, 0x0000 }, /* R2633 */ + { 0x0000, 0x0000, 0x0000 }, /* R2634 */ + { 0x0000, 0x0000, 0x0000 }, /* R2635 */ + { 0x0000, 0x0000, 0x0000 }, /* R2636 */ + { 0x0000, 0x0000, 0x0000 }, /* R2637 */ + { 0x0000, 0x0000, 0x0000 }, /* R2638 */ + { 0x0000, 0x0000, 0x0000 }, /* R2639 */ + { 0x0000, 0x0000, 0x0000 }, /* R2640 */ + { 0x0000, 0x0000, 0x0000 }, /* R2641 */ + { 0x0000, 0x0000, 0x0000 }, /* R2642 */ + { 0x0000, 0x0000, 0x0000 }, /* R2643 */ + { 0x0000, 0x0000, 0x0000 }, /* R2644 */ + { 0x0000, 0x0000, 0x0000 }, /* R2645 */ + { 0x0000, 0x0000, 0x0000 }, /* R2646 */ + { 0x0000, 0x0000, 0x0000 }, /* R2647 */ + { 0x0000, 0x0000, 0x0000 }, /* R2648 */ + { 0x0000, 0x0000, 0x0000 }, /* R2649 */ + { 0x0000, 0x0000, 0x0000 }, /* R2650 */ + { 0x0000, 0x0000, 0x0000 }, /* R2651 */ + { 0x0000, 0x0000, 0x0000 }, /* R2652 */ + { 0x0000, 0x0000, 0x0000 }, /* R2653 */ + { 0x0000, 0x0000, 0x0000 }, /* R2654 */ + { 0x0000, 0x0000, 0x0000 }, /* R2655 */ + { 0x0000, 0x0000, 0x0000 }, /* R2656 */ + { 0x0000, 0x0000, 0x0000 }, /* R2657 */ + { 0x0000, 0x0000, 0x0000 }, /* R2658 */ + { 0x0000, 0x0000, 0x0000 }, /* R2659 */ + { 0x0000, 0x0000, 0x0000 }, /* R2660 */ + { 0x0000, 0x0000, 0x0000 }, /* R2661 */ + { 0x0000, 0x0000, 0x0000 }, /* R2662 */ + { 0x0000, 0x0000, 0x0000 }, /* R2663 */ + { 0x0000, 0x0000, 0x0000 }, /* R2664 */ + { 0x0000, 0x0000, 0x0000 }, /* R2665 */ + { 0x0000, 0x0000, 0x0000 }, /* R2666 */ + { 0x0000, 0x0000, 0x0000 }, /* R2667 */ + { 0x0000, 0x0000, 0x0000 }, /* R2668 */ + { 0x0000, 0x0000, 0x0000 }, /* R2669 */ + { 0x0000, 0x0000, 0x0000 }, /* R2670 */ + { 0x0000, 0x0000, 0x0000 }, /* R2671 */ + { 0x0000, 0x0000, 0x0000 }, /* R2672 */ + { 0x0000, 0x0000, 0x0000 }, /* R2673 */ + { 0x0000, 0x0000, 0x0000 }, /* R2674 */ + { 0x0000, 0x0000, 0x0000 }, /* R2675 */ + { 0x0000, 0x0000, 0x0000 }, /* R2676 */ + { 0x0000, 0x0000, 0x0000 }, /* R2677 */ + { 0x0000, 0x0000, 0x0000 }, /* R2678 */ + { 0x0000, 0x0000, 0x0000 }, /* R2679 */ + { 0x0000, 0x0000, 0x0000 }, /* R2680 */ + { 0x0000, 0x0000, 0x0000 }, /* R2681 */ + { 0x0000, 0x0000, 0x0000 }, /* R2682 */ + { 0x0000, 0x0000, 0x0000 }, /* R2683 */ + { 0x0000, 0x0000, 0x0000 }, /* R2684 */ + { 0x0000, 0x0000, 0x0000 }, /* R2685 */ + { 0x0000, 0x0000, 0x0000 }, /* R2686 */ + { 0x0000, 0x0000, 0x0000 }, /* R2687 */ + { 0x0000, 0x0000, 0x0000 }, /* R2688 */ + { 0x0000, 0x0000, 0x0000 }, /* R2689 */ + { 0x0000, 0x0000, 0x0000 }, /* R2690 */ + { 0x0000, 0x0000, 0x0000 }, /* R2691 */ + { 0x0000, 0x0000, 0x0000 }, /* R2692 */ + { 0x0000, 0x0000, 0x0000 }, /* R2693 */ + { 0x0000, 0x0000, 0x0000 }, /* R2694 */ + { 0x0000, 0x0000, 0x0000 }, /* R2695 */ + { 0x0000, 0x0000, 0x0000 }, /* R2696 */ + { 0x0000, 0x0000, 0x0000 }, /* R2697 */ + { 0x0000, 0x0000, 0x0000 }, /* R2698 */ + { 0x0000, 0x0000, 0x0000 }, /* R2699 */ + { 0x0000, 0x0000, 0x0000 }, /* R2700 */ + { 0x0000, 0x0000, 0x0000 }, /* R2701 */ + { 0x0000, 0x0000, 0x0000 }, /* R2702 */ + { 0x0000, 0x0000, 0x0000 }, /* R2703 */ + { 0x0000, 0x0000, 0x0000 }, /* R2704 */ + { 0x0000, 0x0000, 0x0000 }, /* R2705 */ + { 0x0000, 0x0000, 0x0000 }, /* R2706 */ + { 0x0000, 0x0000, 0x0000 }, /* R2707 */ + { 0x0000, 0x0000, 0x0000 }, /* R2708 */ + { 0x0000, 0x0000, 0x0000 }, /* R2709 */ + { 0x0000, 0x0000, 0x0000 }, /* R2710 */ + { 0x0000, 0x0000, 0x0000 }, /* R2711 */ + { 0x0000, 0x0000, 0x0000 }, /* R2712 */ + { 0x0000, 0x0000, 0x0000 }, /* R2713 */ + { 0x0000, 0x0000, 0x0000 }, /* R2714 */ + { 0x0000, 0x0000, 0x0000 }, /* R2715 */ + { 0x0000, 0x0000, 0x0000 }, /* R2716 */ + { 0x0000, 0x0000, 0x0000 }, /* R2717 */ + { 0x0000, 0x0000, 0x0000 }, /* R2718 */ + { 0x0000, 0x0000, 0x0000 }, /* R2719 */ + { 0x0000, 0x0000, 0x0000 }, /* R2720 */ + { 0x0000, 0x0000, 0x0000 }, /* R2721 */ + { 0x0000, 0x0000, 0x0000 }, /* R2722 */ + { 0x0000, 0x0000, 0x0000 }, /* R2723 */ + { 0x0000, 0x0000, 0x0000 }, /* R2724 */ + { 0x0000, 0x0000, 0x0000 }, /* R2725 */ + { 0x0000, 0x0000, 0x0000 }, /* R2726 */ + { 0x0000, 0x0000, 0x0000 }, /* R2727 */ + { 0x0000, 0x0000, 0x0000 }, /* R2728 */ + { 0x0000, 0x0000, 0x0000 }, /* R2729 */ + { 0x0000, 0x0000, 0x0000 }, /* R2730 */ + { 0x0000, 0x0000, 0x0000 }, /* R2731 */ + { 0x0000, 0x0000, 0x0000 }, /* R2732 */ + { 0x0000, 0x0000, 0x0000 }, /* R2733 */ + { 0x0000, 0x0000, 0x0000 }, /* R2734 */ + { 0x0000, 0x0000, 0x0000 }, /* R2735 */ + { 0x0000, 0x0000, 0x0000 }, /* R2736 */ + { 0x0000, 0x0000, 0x0000 }, /* R2737 */ + { 0x0000, 0x0000, 0x0000 }, /* R2738 */ + { 0x0000, 0x0000, 0x0000 }, /* R2739 */ + { 0x0000, 0x0000, 0x0000 }, /* R2740 */ + { 0x0000, 0x0000, 0x0000 }, /* R2741 */ + { 0x0000, 0x0000, 0x0000 }, /* R2742 */ + { 0x0000, 0x0000, 0x0000 }, /* R2743 */ + { 0x0000, 0x0000, 0x0000 }, /* R2744 */ + { 0x0000, 0x0000, 0x0000 }, /* R2745 */ + { 0x0000, 0x0000, 0x0000 }, /* R2746 */ + { 0x0000, 0x0000, 0x0000 }, /* R2747 */ + { 0x0000, 0x0000, 0x0000 }, /* R2748 */ + { 0x0000, 0x0000, 0x0000 }, /* R2749 */ + { 0x0000, 0x0000, 0x0000 }, /* R2750 */ + { 0x0000, 0x0000, 0x0000 }, /* R2751 */ + { 0x0000, 0x0000, 0x0000 }, /* R2752 */ + { 0x0000, 0x0000, 0x0000 }, /* R2753 */ + { 0x0000, 0x0000, 0x0000 }, /* R2754 */ + { 0x0000, 0x0000, 0x0000 }, /* R2755 */ + { 0x0000, 0x0000, 0x0000 }, /* R2756 */ + { 0x0000, 0x0000, 0x0000 }, /* R2757 */ + { 0x0000, 0x0000, 0x0000 }, /* R2758 */ + { 0x0000, 0x0000, 0x0000 }, /* R2759 */ + { 0x0000, 0x0000, 0x0000 }, /* R2760 */ + { 0x0000, 0x0000, 0x0000 }, /* R2761 */ + { 0x0000, 0x0000, 0x0000 }, /* R2762 */ + { 0x0000, 0x0000, 0x0000 }, /* R2763 */ + { 0x0000, 0x0000, 0x0000 }, /* R2764 */ + { 0x0000, 0x0000, 0x0000 }, /* R2765 */ + { 0x0000, 0x0000, 0x0000 }, /* R2766 */ + { 0x0000, 0x0000, 0x0000 }, /* R2767 */ + { 0x0000, 0x0000, 0x0000 }, /* R2768 */ + { 0x0000, 0x0000, 0x0000 }, /* R2769 */ + { 0x0000, 0x0000, 0x0000 }, /* R2770 */ + { 0x0000, 0x0000, 0x0000 }, /* R2771 */ + { 0x0000, 0x0000, 0x0000 }, /* R2772 */ + { 0x0000, 0x0000, 0x0000 }, /* R2773 */ + { 0x0000, 0x0000, 0x0000 }, /* R2774 */ + { 0x0000, 0x0000, 0x0000 }, /* R2775 */ + { 0x0000, 0x0000, 0x0000 }, /* R2776 */ + { 0x0000, 0x0000, 0x0000 }, /* R2777 */ + { 0x0000, 0x0000, 0x0000 }, /* R2778 */ + { 0x0000, 0x0000, 0x0000 }, /* R2779 */ + { 0x0000, 0x0000, 0x0000 }, /* R2780 */ + { 0x0000, 0x0000, 0x0000 }, /* R2781 */ + { 0x0000, 0x0000, 0x0000 }, /* R2782 */ + { 0x0000, 0x0000, 0x0000 }, /* R2783 */ + { 0x0000, 0x0000, 0x0000 }, /* R2784 */ + { 0x0000, 0x0000, 0x0000 }, /* R2785 */ + { 0x0000, 0x0000, 0x0000 }, /* R2786 */ + { 0x0000, 0x0000, 0x0000 }, /* R2787 */ + { 0x0000, 0x0000, 0x0000 }, /* R2788 */ + { 0x0000, 0x0000, 0x0000 }, /* R2789 */ + { 0x0000, 0x0000, 0x0000 }, /* R2790 */ + { 0x0000, 0x0000, 0x0000 }, /* R2791 */ + { 0x0000, 0x0000, 0x0000 }, /* R2792 */ + { 0x0000, 0x0000, 0x0000 }, /* R2793 */ + { 0x0000, 0x0000, 0x0000 }, /* R2794 */ + { 0x0000, 0x0000, 0x0000 }, /* R2795 */ + { 0x0000, 0x0000, 0x0000 }, /* R2796 */ + { 0x0000, 0x0000, 0x0000 }, /* R2797 */ + { 0x0000, 0x0000, 0x0000 }, /* R2798 */ + { 0x0000, 0x0000, 0x0000 }, /* R2799 */ + { 0x0000, 0x0000, 0x0000 }, /* R2800 */ + { 0x0000, 0x0000, 0x0000 }, /* R2801 */ + { 0x0000, 0x0000, 0x0000 }, /* R2802 */ + { 0x0000, 0x0000, 0x0000 }, /* R2803 */ + { 0x0000, 0x0000, 0x0000 }, /* R2804 */ + { 0x0000, 0x0000, 0x0000 }, /* R2805 */ + { 0x0000, 0x0000, 0x0000 }, /* R2806 */ + { 0x0000, 0x0000, 0x0000 }, /* R2807 */ + { 0x0000, 0x0000, 0x0000 }, /* R2808 */ + { 0x0000, 0x0000, 0x0000 }, /* R2809 */ + { 0x0000, 0x0000, 0x0000 }, /* R2810 */ + { 0x0000, 0x0000, 0x0000 }, /* R2811 */ + { 0x0000, 0x0000, 0x0000 }, /* R2812 */ + { 0x0000, 0x0000, 0x0000 }, /* R2813 */ + { 0x0000, 0x0000, 0x0000 }, /* R2814 */ + { 0x0000, 0x0000, 0x0000 }, /* R2815 */ + { 0x0000, 0x0000, 0x0000 }, /* R2816 */ + { 0x0000, 0x0000, 0x0000 }, /* R2817 */ + { 0x0000, 0x0000, 0x0000 }, /* R2818 */ + { 0x0000, 0x0000, 0x0000 }, /* R2819 */ + { 0x0000, 0x0000, 0x0000 }, /* R2820 */ + { 0x0000, 0x0000, 0x0000 }, /* R2821 */ + { 0x0000, 0x0000, 0x0000 }, /* R2822 */ + { 0x0000, 0x0000, 0x0000 }, /* R2823 */ + { 0x0000, 0x0000, 0x0000 }, /* R2824 */ + { 0x0000, 0x0000, 0x0000 }, /* R2825 */ + { 0x0000, 0x0000, 0x0000 }, /* R2826 */ + { 0x0000, 0x0000, 0x0000 }, /* R2827 */ + { 0x0000, 0x0000, 0x0000 }, /* R2828 */ + { 0x0000, 0x0000, 0x0000 }, /* R2829 */ + { 0x0000, 0x0000, 0x0000 }, /* R2830 */ + { 0x0000, 0x0000, 0x0000 }, /* R2831 */ + { 0x0000, 0x0000, 0x0000 }, /* R2832 */ + { 0x0000, 0x0000, 0x0000 }, /* R2833 */ + { 0x0000, 0x0000, 0x0000 }, /* R2834 */ + { 0x0000, 0x0000, 0x0000 }, /* R2835 */ + { 0x0000, 0x0000, 0x0000 }, /* R2836 */ + { 0x0000, 0x0000, 0x0000 }, /* R2837 */ + { 0x0000, 0x0000, 0x0000 }, /* R2838 */ + { 0x0000, 0x0000, 0x0000 }, /* R2839 */ + { 0x0000, 0x0000, 0x0000 }, /* R2840 */ + { 0x0000, 0x0000, 0x0000 }, /* R2841 */ + { 0x0000, 0x0000, 0x0000 }, /* R2842 */ + { 0x0000, 0x0000, 0x0000 }, /* R2843 */ + { 0x0000, 0x0000, 0x0000 }, /* R2844 */ + { 0x0000, 0x0000, 0x0000 }, /* R2845 */ + { 0x0000, 0x0000, 0x0000 }, /* R2846 */ + { 0x0000, 0x0000, 0x0000 }, /* R2847 */ + { 0x0000, 0x0000, 0x0000 }, /* R2848 */ + { 0x0000, 0x0000, 0x0000 }, /* R2849 */ + { 0x0000, 0x0000, 0x0000 }, /* R2850 */ + { 0x0000, 0x0000, 0x0000 }, /* R2851 */ + { 0x0000, 0x0000, 0x0000 }, /* R2852 */ + { 0x0000, 0x0000, 0x0000 }, /* R2853 */ + { 0x0000, 0x0000, 0x0000 }, /* R2854 */ + { 0x0000, 0x0000, 0x0000 }, /* R2855 */ + { 0x0000, 0x0000, 0x0000 }, /* R2856 */ + { 0x0000, 0x0000, 0x0000 }, /* R2857 */ + { 0x0000, 0x0000, 0x0000 }, /* R2858 */ + { 0x0000, 0x0000, 0x0000 }, /* R2859 */ + { 0x0000, 0x0000, 0x0000 }, /* R2860 */ + { 0x0000, 0x0000, 0x0000 }, /* R2861 */ + { 0x0000, 0x0000, 0x0000 }, /* R2862 */ + { 0x0000, 0x0000, 0x0000 }, /* R2863 */ + { 0x0000, 0x0000, 0x0000 }, /* R2864 */ + { 0x0000, 0x0000, 0x0000 }, /* R2865 */ + { 0x0000, 0x0000, 0x0000 }, /* R2866 */ + { 0x0000, 0x0000, 0x0000 }, /* R2867 */ + { 0x0000, 0x0000, 0x0000 }, /* R2868 */ + { 0x0000, 0x0000, 0x0000 }, /* R2869 */ + { 0x0000, 0x0000, 0x0000 }, /* R2870 */ + { 0x0000, 0x0000, 0x0000 }, /* R2871 */ + { 0x0000, 0x0000, 0x0000 }, /* R2872 */ + { 0x0000, 0x0000, 0x0000 }, /* R2873 */ + { 0x0000, 0x0000, 0x0000 }, /* R2874 */ + { 0x0000, 0x0000, 0x0000 }, /* R2875 */ + { 0x0000, 0x0000, 0x0000 }, /* R2876 */ + { 0x0000, 0x0000, 0x0000 }, /* R2877 */ + { 0x0000, 0x0000, 0x0000 }, /* R2878 */ + { 0x0000, 0x0000, 0x0000 }, /* R2879 */ + { 0x0000, 0x0000, 0x0000 }, /* R2880 */ + { 0x0000, 0x0000, 0x0000 }, /* R2881 */ + { 0x0000, 0x0000, 0x0000 }, /* R2882 */ + { 0x0000, 0x0000, 0x0000 }, /* R2883 */ + { 0x0000, 0x0000, 0x0000 }, /* R2884 */ + { 0x0000, 0x0000, 0x0000 }, /* R2885 */ + { 0x0000, 0x0000, 0x0000 }, /* R2886 */ + { 0x0000, 0x0000, 0x0000 }, /* R2887 */ + { 0x0000, 0x0000, 0x0000 }, /* R2888 */ + { 0x0000, 0x0000, 0x0000 }, /* R2889 */ + { 0x0000, 0x0000, 0x0000 }, /* R2890 */ + { 0x0000, 0x0000, 0x0000 }, /* R2891 */ + { 0x0000, 0x0000, 0x0000 }, /* R2892 */ + { 0x0000, 0x0000, 0x0000 }, /* R2893 */ + { 0x0000, 0x0000, 0x0000 }, /* R2894 */ + { 0x0000, 0x0000, 0x0000 }, /* R2895 */ + { 0x0000, 0x0000, 0x0000 }, /* R2896 */ + { 0x0000, 0x0000, 0x0000 }, /* R2897 */ + { 0x0000, 0x0000, 0x0000 }, /* R2898 */ + { 0x0000, 0x0000, 0x0000 }, /* R2899 */ + { 0x0000, 0x0000, 0x0000 }, /* R2900 */ + { 0x0000, 0x0000, 0x0000 }, /* R2901 */ + { 0x0000, 0x0000, 0x0000 }, /* R2902 */ + { 0x0000, 0x0000, 0x0000 }, /* R2903 */ + { 0x0000, 0x0000, 0x0000 }, /* R2904 */ + { 0x0000, 0x0000, 0x0000 }, /* R2905 */ + { 0x0000, 0x0000, 0x0000 }, /* R2906 */ + { 0x0000, 0x0000, 0x0000 }, /* R2907 */ + { 0x0000, 0x0000, 0x0000 }, /* R2908 */ + { 0x0000, 0x0000, 0x0000 }, /* R2909 */ + { 0x0000, 0x0000, 0x0000 }, /* R2910 */ + { 0x0000, 0x0000, 0x0000 }, /* R2911 */ + { 0x0000, 0x0000, 0x0000 }, /* R2912 */ + { 0x0000, 0x0000, 0x0000 }, /* R2913 */ + { 0x0000, 0x0000, 0x0000 }, /* R2914 */ + { 0x0000, 0x0000, 0x0000 }, /* R2915 */ + { 0x0000, 0x0000, 0x0000 }, /* R2916 */ + { 0x0000, 0x0000, 0x0000 }, /* R2917 */ + { 0x0000, 0x0000, 0x0000 }, /* R2918 */ + { 0x0000, 0x0000, 0x0000 }, /* R2919 */ + { 0x0000, 0x0000, 0x0000 }, /* R2920 */ + { 0x0000, 0x0000, 0x0000 }, /* R2921 */ + { 0x0000, 0x0000, 0x0000 }, /* R2922 */ + { 0x0000, 0x0000, 0x0000 }, /* R2923 */ + { 0x0000, 0x0000, 0x0000 }, /* R2924 */ + { 0x0000, 0x0000, 0x0000 }, /* R2925 */ + { 0x0000, 0x0000, 0x0000 }, /* R2926 */ + { 0x0000, 0x0000, 0x0000 }, /* R2927 */ + { 0x0000, 0x0000, 0x0000 }, /* R2928 */ + { 0x0000, 0x0000, 0x0000 }, /* R2929 */ + { 0x0000, 0x0000, 0x0000 }, /* R2930 */ + { 0x0000, 0x0000, 0x0000 }, /* R2931 */ + { 0x0000, 0x0000, 0x0000 }, /* R2932 */ + { 0x0000, 0x0000, 0x0000 }, /* R2933 */ + { 0x0000, 0x0000, 0x0000 }, /* R2934 */ + { 0x0000, 0x0000, 0x0000 }, /* R2935 */ + { 0x0000, 0x0000, 0x0000 }, /* R2936 */ + { 0x0000, 0x0000, 0x0000 }, /* R2937 */ + { 0x0000, 0x0000, 0x0000 }, /* R2938 */ + { 0x0000, 0x0000, 0x0000 }, /* R2939 */ + { 0x0000, 0x0000, 0x0000 }, /* R2940 */ + { 0x0000, 0x0000, 0x0000 }, /* R2941 */ + { 0x0000, 0x0000, 0x0000 }, /* R2942 */ + { 0x0000, 0x0000, 0x0000 }, /* R2943 */ + { 0x0000, 0x0000, 0x0000 }, /* R2944 */ + { 0x0000, 0x0000, 0x0000 }, /* R2945 */ + { 0x0000, 0x0000, 0x0000 }, /* R2946 */ + { 0x0000, 0x0000, 0x0000 }, /* R2947 */ + { 0x0000, 0x0000, 0x0000 }, /* R2948 */ + { 0x0000, 0x0000, 0x0000 }, /* R2949 */ + { 0x0000, 0x0000, 0x0000 }, /* R2950 */ + { 0x0000, 0x0000, 0x0000 }, /* R2951 */ + { 0x0000, 0x0000, 0x0000 }, /* R2952 */ + { 0x0000, 0x0000, 0x0000 }, /* R2953 */ + { 0x0000, 0x0000, 0x0000 }, /* R2954 */ + { 0x0000, 0x0000, 0x0000 }, /* R2955 */ + { 0x0000, 0x0000, 0x0000 }, /* R2956 */ + { 0x0000, 0x0000, 0x0000 }, /* R2957 */ + { 0x0000, 0x0000, 0x0000 }, /* R2958 */ + { 0x0000, 0x0000, 0x0000 }, /* R2959 */ + { 0x0000, 0x0000, 0x0000 }, /* R2960 */ + { 0x0000, 0x0000, 0x0000 }, /* R2961 */ + { 0x0000, 0x0000, 0x0000 }, /* R2962 */ + { 0x0000, 0x0000, 0x0000 }, /* R2963 */ + { 0x0000, 0x0000, 0x0000 }, /* R2964 */ + { 0x0000, 0x0000, 0x0000 }, /* R2965 */ + { 0x0000, 0x0000, 0x0000 }, /* R2966 */ + { 0x0000, 0x0000, 0x0000 }, /* R2967 */ + { 0x0000, 0x0000, 0x0000 }, /* R2968 */ + { 0x0000, 0x0000, 0x0000 }, /* R2969 */ + { 0x0000, 0x0000, 0x0000 }, /* R2970 */ + { 0x0000, 0x0000, 0x0000 }, /* R2971 */ + { 0x0000, 0x0000, 0x0000 }, /* R2972 */ + { 0x0000, 0x0000, 0x0000 }, /* R2973 */ + { 0x0000, 0x0000, 0x0000 }, /* R2974 */ + { 0x0000, 0x0000, 0x0000 }, /* R2975 */ + { 0x0000, 0x0000, 0x0000 }, /* R2976 */ + { 0x0000, 0x0000, 0x0000 }, /* R2977 */ + { 0x0000, 0x0000, 0x0000 }, /* R2978 */ + { 0x0000, 0x0000, 0x0000 }, /* R2979 */ + { 0x0000, 0x0000, 0x0000 }, /* R2980 */ + { 0x0000, 0x0000, 0x0000 }, /* R2981 */ + { 0x0000, 0x0000, 0x0000 }, /* R2982 */ + { 0x0000, 0x0000, 0x0000 }, /* R2983 */ + { 0x0000, 0x0000, 0x0000 }, /* R2984 */ + { 0x0000, 0x0000, 0x0000 }, /* R2985 */ + { 0x0000, 0x0000, 0x0000 }, /* R2986 */ + { 0x0000, 0x0000, 0x0000 }, /* R2987 */ + { 0x0000, 0x0000, 0x0000 }, /* R2988 */ + { 0x0000, 0x0000, 0x0000 }, /* R2989 */ + { 0x0000, 0x0000, 0x0000 }, /* R2990 */ + { 0x0000, 0x0000, 0x0000 }, /* R2991 */ + { 0x0000, 0x0000, 0x0000 }, /* R2992 */ + { 0x0000, 0x0000, 0x0000 }, /* R2993 */ + { 0x0000, 0x0000, 0x0000 }, /* R2994 */ + { 0x0000, 0x0000, 0x0000 }, /* R2995 */ + { 0x0000, 0x0000, 0x0000 }, /* R2996 */ + { 0x0000, 0x0000, 0x0000 }, /* R2997 */ + { 0x0000, 0x0000, 0x0000 }, /* R2998 */ + { 0x0000, 0x0000, 0x0000 }, /* R2999 */ + { 0x0000, 0x0000, 0x0000 }, /* R3000 */ + { 0x0000, 0x0000, 0x0000 }, /* R3001 */ + { 0x0000, 0x0000, 0x0000 }, /* R3002 */ + { 0x0000, 0x0000, 0x0000 }, /* R3003 */ + { 0x0000, 0x0000, 0x0000 }, /* R3004 */ + { 0x0000, 0x0000, 0x0000 }, /* R3005 */ + { 0x0000, 0x0000, 0x0000 }, /* R3006 */ + { 0x0000, 0x0000, 0x0000 }, /* R3007 */ + { 0x0000, 0x0000, 0x0000 }, /* R3008 */ + { 0x0000, 0x0000, 0x0000 }, /* R3009 */ + { 0x0000, 0x0000, 0x0000 }, /* R3010 */ + { 0x0000, 0x0000, 0x0000 }, /* R3011 */ + { 0x0000, 0x0000, 0x0000 }, /* R3012 */ + { 0x0000, 0x0000, 0x0000 }, /* R3013 */ + { 0x0000, 0x0000, 0x0000 }, /* R3014 */ + { 0x0000, 0x0000, 0x0000 }, /* R3015 */ + { 0x0000, 0x0000, 0x0000 }, /* R3016 */ + { 0x0000, 0x0000, 0x0000 }, /* R3017 */ + { 0x0000, 0x0000, 0x0000 }, /* R3018 */ + { 0x0000, 0x0000, 0x0000 }, /* R3019 */ + { 0x0000, 0x0000, 0x0000 }, /* R3020 */ + { 0x0000, 0x0000, 0x0000 }, /* R3021 */ + { 0x0000, 0x0000, 0x0000 }, /* R3022 */ + { 0x0000, 0x0000, 0x0000 }, /* R3023 */ + { 0x0000, 0x0000, 0x0000 }, /* R3024 */ + { 0x0000, 0x0000, 0x0000 }, /* R3025 */ + { 0x0000, 0x0000, 0x0000 }, /* R3026 */ + { 0x0000, 0x0000, 0x0000 }, /* R3027 */ + { 0x0000, 0x0000, 0x0000 }, /* R3028 */ + { 0x0000, 0x0000, 0x0000 }, /* R3029 */ + { 0x0000, 0x0000, 0x0000 }, /* R3030 */ + { 0x0000, 0x0000, 0x0000 }, /* R3031 */ + { 0x0000, 0x0000, 0x0000 }, /* R3032 */ + { 0x0000, 0x0000, 0x0000 }, /* R3033 */ + { 0x0000, 0x0000, 0x0000 }, /* R3034 */ + { 0x0000, 0x0000, 0x0000 }, /* R3035 */ + { 0x0000, 0x0000, 0x0000 }, /* R3036 */ + { 0x0000, 0x0000, 0x0000 }, /* R3037 */ + { 0x0000, 0x0000, 0x0000 }, /* R3038 */ + { 0x0000, 0x0000, 0x0000 }, /* R3039 */ + { 0x0000, 0x0000, 0x0000 }, /* R3040 */ + { 0x0000, 0x0000, 0x0000 }, /* R3041 */ + { 0x0000, 0x0000, 0x0000 }, /* R3042 */ + { 0x0000, 0x0000, 0x0000 }, /* R3043 */ + { 0x0000, 0x0000, 0x0000 }, /* R3044 */ + { 0x0000, 0x0000, 0x0000 }, /* R3045 */ + { 0x0000, 0x0000, 0x0000 }, /* R3046 */ + { 0x0000, 0x0000, 0x0000 }, /* R3047 */ + { 0x0000, 0x0000, 0x0000 }, /* R3048 */ + { 0x0000, 0x0000, 0x0000 }, /* R3049 */ + { 0x0000, 0x0000, 0x0000 }, /* R3050 */ + { 0x0000, 0x0000, 0x0000 }, /* R3051 */ + { 0x0000, 0x0000, 0x0000 }, /* R3052 */ + { 0x0000, 0x0000, 0x0000 }, /* R3053 */ + { 0x0000, 0x0000, 0x0000 }, /* R3054 */ + { 0x0000, 0x0000, 0x0000 }, /* R3055 */ + { 0x0000, 0x0000, 0x0000 }, /* R3056 */ + { 0x0000, 0x0000, 0x0000 }, /* R3057 */ + { 0x0000, 0x0000, 0x0000 }, /* R3058 */ + { 0x0000, 0x0000, 0x0000 }, /* R3059 */ + { 0x0000, 0x0000, 0x0000 }, /* R3060 */ + { 0x0000, 0x0000, 0x0000 }, /* R3061 */ + { 0x0000, 0x0000, 0x0000 }, /* R3062 */ + { 0x0000, 0x0000, 0x0000 }, /* R3063 */ + { 0x0000, 0x0000, 0x0000 }, /* R3064 */ + { 0x0000, 0x0000, 0x0000 }, /* R3065 */ + { 0x0000, 0x0000, 0x0000 }, /* R3066 */ + { 0x0000, 0x0000, 0x0000 }, /* R3067 */ + { 0x0000, 0x0000, 0x0000 }, /* R3068 */ + { 0x0000, 0x0000, 0x0000 }, /* R3069 */ + { 0x0000, 0x0000, 0x0000 }, /* R3070 */ + { 0x0000, 0x0000, 0x0000 }, /* R3071 */ + { 0x0000, 0x0000, 0x0000 }, /* R3072 */ + { 0x0000, 0x0000, 0x0000 }, /* R3073 */ + { 0x0000, 0x0000, 0x0000 }, /* R3074 */ + { 0x0000, 0x0000, 0x0000 }, /* R3075 */ + { 0x0000, 0x0000, 0x0000 }, /* R3076 */ + { 0x0000, 0x0000, 0x0000 }, /* R3077 */ + { 0x0000, 0x0000, 0x0000 }, /* R3078 */ + { 0x0000, 0x0000, 0x0000 }, /* R3079 */ + { 0x0000, 0x0000, 0x0000 }, /* R3080 */ + { 0x0000, 0x0000, 0x0000 }, /* R3081 */ + { 0x0000, 0x0000, 0x0000 }, /* R3082 */ + { 0x0000, 0x0000, 0x0000 }, /* R3083 */ + { 0x0000, 0x0000, 0x0000 }, /* R3084 */ + { 0x0000, 0x0000, 0x0000 }, /* R3085 */ + { 0x0000, 0x0000, 0x0000 }, /* R3086 */ + { 0x0000, 0x0000, 0x0000 }, /* R3087 */ + { 0x0000, 0x0000, 0x0000 }, /* R3088 */ + { 0x0000, 0x0000, 0x0000 }, /* R3089 */ + { 0x0000, 0x0000, 0x0000 }, /* R3090 */ + { 0x0000, 0x0000, 0x0000 }, /* R3091 */ + { 0x0000, 0x0000, 0x0000 }, /* R3092 */ + { 0x0000, 0x0000, 0x0000 }, /* R3093 */ + { 0x0000, 0x0000, 0x0000 }, /* R3094 */ + { 0x0000, 0x0000, 0x0000 }, /* R3095 */ + { 0x0000, 0x0000, 0x0000 }, /* R3096 */ + { 0x0000, 0x0000, 0x0000 }, /* R3097 */ + { 0x0000, 0x0000, 0x0000 }, /* R3098 */ + { 0x0000, 0x0000, 0x0000 }, /* R3099 */ + { 0x0000, 0x0000, 0x0000 }, /* R3100 */ + { 0x0000, 0x0000, 0x0000 }, /* R3101 */ + { 0x0000, 0x0000, 0x0000 }, /* R3102 */ + { 0x0000, 0x0000, 0x0000 }, /* R3103 */ + { 0x0000, 0x0000, 0x0000 }, /* R3104 */ + { 0x0000, 0x0000, 0x0000 }, /* R3105 */ + { 0x0000, 0x0000, 0x0000 }, /* R3106 */ + { 0x0000, 0x0000, 0x0000 }, /* R3107 */ + { 0x0000, 0x0000, 0x0000 }, /* R3108 */ + { 0x0000, 0x0000, 0x0000 }, /* R3109 */ + { 0x0000, 0x0000, 0x0000 }, /* R3110 */ + { 0x0000, 0x0000, 0x0000 }, /* R3111 */ + { 0x0000, 0x0000, 0x0000 }, /* R3112 */ + { 0x0000, 0x0000, 0x0000 }, /* R3113 */ + { 0x0000, 0x0000, 0x0000 }, /* R3114 */ + { 0x0000, 0x0000, 0x0000 }, /* R3115 */ + { 0x0000, 0x0000, 0x0000 }, /* R3116 */ + { 0x0000, 0x0000, 0x0000 }, /* R3117 */ + { 0x0000, 0x0000, 0x0000 }, /* R3118 */ + { 0x0000, 0x0000, 0x0000 }, /* R3119 */ + { 0x0000, 0x0000, 0x0000 }, /* R3120 */ + { 0x0000, 0x0000, 0x0000 }, /* R3121 */ + { 0x0000, 0x0000, 0x0000 }, /* R3122 */ + { 0x0000, 0x0000, 0x0000 }, /* R3123 */ + { 0x0000, 0x0000, 0x0000 }, /* R3124 */ + { 0x0000, 0x0000, 0x0000 }, /* R3125 */ + { 0x0000, 0x0000, 0x0000 }, /* R3126 */ + { 0x0000, 0x0000, 0x0000 }, /* R3127 */ + { 0x0000, 0x0000, 0x0000 }, /* R3128 */ + { 0x0000, 0x0000, 0x0000 }, /* R3129 */ + { 0x0000, 0x0000, 0x0000 }, /* R3130 */ + { 0x0000, 0x0000, 0x0000 }, /* R3131 */ + { 0x0000, 0x0000, 0x0000 }, /* R3132 */ + { 0x0000, 0x0000, 0x0000 }, /* R3133 */ + { 0x0000, 0x0000, 0x0000 }, /* R3134 */ + { 0x0000, 0x0000, 0x0000 }, /* R3135 */ + { 0x0000, 0x0000, 0x0000 }, /* R3136 */ + { 0x0000, 0x0000, 0x0000 }, /* R3137 */ + { 0x0000, 0x0000, 0x0000 }, /* R3138 */ + { 0x0000, 0x0000, 0x0000 }, /* R3139 */ + { 0x0000, 0x0000, 0x0000 }, /* R3140 */ + { 0x0000, 0x0000, 0x0000 }, /* R3141 */ + { 0x0000, 0x0000, 0x0000 }, /* R3142 */ + { 0x0000, 0x0000, 0x0000 }, /* R3143 */ + { 0x0000, 0x0000, 0x0000 }, /* R3144 */ + { 0x0000, 0x0000, 0x0000 }, /* R3145 */ + { 0x0000, 0x0000, 0x0000 }, /* R3146 */ + { 0x0000, 0x0000, 0x0000 }, /* R3147 */ + { 0x0000, 0x0000, 0x0000 }, /* R3148 */ + { 0x0000, 0x0000, 0x0000 }, /* R3149 */ + { 0x0000, 0x0000, 0x0000 }, /* R3150 */ + { 0x0000, 0x0000, 0x0000 }, /* R3151 */ + { 0x0000, 0x0000, 0x0000 }, /* R3152 */ + { 0x0000, 0x0000, 0x0000 }, /* R3153 */ + { 0x0000, 0x0000, 0x0000 }, /* R3154 */ + { 0x0000, 0x0000, 0x0000 }, /* R3155 */ + { 0x0000, 0x0000, 0x0000 }, /* R3156 */ + { 0x0000, 0x0000, 0x0000 }, /* R3157 */ + { 0x0000, 0x0000, 0x0000 }, /* R3158 */ + { 0x0000, 0x0000, 0x0000 }, /* R3159 */ + { 0x0000, 0x0000, 0x0000 }, /* R3160 */ + { 0x0000, 0x0000, 0x0000 }, /* R3161 */ + { 0x0000, 0x0000, 0x0000 }, /* R3162 */ + { 0x0000, 0x0000, 0x0000 }, /* R3163 */ + { 0x0000, 0x0000, 0x0000 }, /* R3164 */ + { 0x0000, 0x0000, 0x0000 }, /* R3165 */ + { 0x0000, 0x0000, 0x0000 }, /* R3166 */ + { 0x0000, 0x0000, 0x0000 }, /* R3167 */ + { 0x0000, 0x0000, 0x0000 }, /* R3168 */ + { 0x0000, 0x0000, 0x0000 }, /* R3169 */ + { 0x0000, 0x0000, 0x0000 }, /* R3170 */ + { 0x0000, 0x0000, 0x0000 }, /* R3171 */ + { 0x0000, 0x0000, 0x0000 }, /* R3172 */ + { 0x0000, 0x0000, 0x0000 }, /* R3173 */ + { 0x0000, 0x0000, 0x0000 }, /* R3174 */ + { 0x0000, 0x0000, 0x0000 }, /* R3175 */ + { 0x0000, 0x0000, 0x0000 }, /* R3176 */ + { 0x0000, 0x0000, 0x0000 }, /* R3177 */ + { 0x0000, 0x0000, 0x0000 }, /* R3178 */ + { 0x0000, 0x0000, 0x0000 }, /* R3179 */ + { 0x0000, 0x0000, 0x0000 }, /* R3180 */ + { 0x0000, 0x0000, 0x0000 }, /* R3181 */ + { 0x0000, 0x0000, 0x0000 }, /* R3182 */ + { 0x0000, 0x0000, 0x0000 }, /* R3183 */ + { 0x0000, 0x0000, 0x0000 }, /* R3184 */ + { 0x0000, 0x0000, 0x0000 }, /* R3185 */ + { 0x0000, 0x0000, 0x0000 }, /* R3186 */ + { 0x0000, 0x0000, 0x0000 }, /* R3187 */ + { 0x0000, 0x0000, 0x0000 }, /* R3188 */ + { 0x0000, 0x0000, 0x0000 }, /* R3189 */ + { 0x0000, 0x0000, 0x0000 }, /* R3190 */ + { 0x0000, 0x0000, 0x0000 }, /* R3191 */ + { 0x0000, 0x0000, 0x0000 }, /* R3192 */ + { 0x0000, 0x0000, 0x0000 }, /* R3193 */ + { 0x0000, 0x0000, 0x0000 }, /* R3194 */ + { 0x0000, 0x0000, 0x0000 }, /* R3195 */ + { 0x0000, 0x0000, 0x0000 }, /* R3196 */ + { 0x0000, 0x0000, 0x0000 }, /* R3197 */ + { 0x0000, 0x0000, 0x0000 }, /* R3198 */ + { 0x0000, 0x0000, 0x0000 }, /* R3199 */ + { 0x0000, 0x0000, 0x0000 }, /* R3200 */ + { 0x0000, 0x0000, 0x0000 }, /* R3201 */ + { 0x0000, 0x0000, 0x0000 }, /* R3202 */ + { 0x0000, 0x0000, 0x0000 }, /* R3203 */ + { 0x0000, 0x0000, 0x0000 }, /* R3204 */ + { 0x0000, 0x0000, 0x0000 }, /* R3205 */ + { 0x0000, 0x0000, 0x0000 }, /* R3206 */ + { 0x0000, 0x0000, 0x0000 }, /* R3207 */ + { 0x0000, 0x0000, 0x0000 }, /* R3208 */ + { 0x0000, 0x0000, 0x0000 }, /* R3209 */ + { 0x0000, 0x0000, 0x0000 }, /* R3210 */ + { 0x0000, 0x0000, 0x0000 }, /* R3211 */ + { 0x0000, 0x0000, 0x0000 }, /* R3212 */ + { 0x0000, 0x0000, 0x0000 }, /* R3213 */ + { 0x0000, 0x0000, 0x0000 }, /* R3214 */ + { 0x0000, 0x0000, 0x0000 }, /* R3215 */ + { 0x0000, 0x0000, 0x0000 }, /* R3216 */ + { 0x0000, 0x0000, 0x0000 }, /* R3217 */ + { 0x0000, 0x0000, 0x0000 }, /* R3218 */ + { 0x0000, 0x0000, 0x0000 }, /* R3219 */ + { 0x0000, 0x0000, 0x0000 }, /* R3220 */ + { 0x0000, 0x0000, 0x0000 }, /* R3221 */ + { 0x0000, 0x0000, 0x0000 }, /* R3222 */ + { 0x0000, 0x0000, 0x0000 }, /* R3223 */ + { 0x0000, 0x0000, 0x0000 }, /* R3224 */ + { 0x0000, 0x0000, 0x0000 }, /* R3225 */ + { 0x0000, 0x0000, 0x0000 }, /* R3226 */ + { 0x0000, 0x0000, 0x0000 }, /* R3227 */ + { 0x0000, 0x0000, 0x0000 }, /* R3228 */ + { 0x0000, 0x0000, 0x0000 }, /* R3229 */ + { 0x0000, 0x0000, 0x0000 }, /* R3230 */ + { 0x0000, 0x0000, 0x0000 }, /* R3231 */ + { 0x0000, 0x0000, 0x0000 }, /* R3232 */ + { 0x0000, 0x0000, 0x0000 }, /* R3233 */ + { 0x0000, 0x0000, 0x0000 }, /* R3234 */ + { 0x0000, 0x0000, 0x0000 }, /* R3235 */ + { 0x0000, 0x0000, 0x0000 }, /* R3236 */ + { 0x0000, 0x0000, 0x0000 }, /* R3237 */ + { 0x0000, 0x0000, 0x0000 }, /* R3238 */ + { 0x0000, 0x0000, 0x0000 }, /* R3239 */ + { 0x0000, 0x0000, 0x0000 }, /* R3240 */ + { 0x0000, 0x0000, 0x0000 }, /* R3241 */ + { 0x0000, 0x0000, 0x0000 }, /* R3242 */ + { 0x0000, 0x0000, 0x0000 }, /* R3243 */ + { 0x0000, 0x0000, 0x0000 }, /* R3244 */ + { 0x0000, 0x0000, 0x0000 }, /* R3245 */ + { 0x0000, 0x0000, 0x0000 }, /* R3246 */ + { 0x0000, 0x0000, 0x0000 }, /* R3247 */ + { 0x0000, 0x0000, 0x0000 }, /* R3248 */ + { 0x0000, 0x0000, 0x0000 }, /* R3249 */ + { 0x0000, 0x0000, 0x0000 }, /* R3250 */ + { 0x0000, 0x0000, 0x0000 }, /* R3251 */ + { 0x0000, 0x0000, 0x0000 }, /* R3252 */ + { 0x0000, 0x0000, 0x0000 }, /* R3253 */ + { 0x0000, 0x0000, 0x0000 }, /* R3254 */ + { 0x0000, 0x0000, 0x0000 }, /* R3255 */ + { 0x0000, 0x0000, 0x0000 }, /* R3256 */ + { 0x0000, 0x0000, 0x0000 }, /* R3257 */ + { 0x0000, 0x0000, 0x0000 }, /* R3258 */ + { 0x0000, 0x0000, 0x0000 }, /* R3259 */ + { 0x0000, 0x0000, 0x0000 }, /* R3260 */ + { 0x0000, 0x0000, 0x0000 }, /* R3261 */ + { 0x0000, 0x0000, 0x0000 }, /* R3262 */ + { 0x0000, 0x0000, 0x0000 }, /* R3263 */ + { 0x0000, 0x0000, 0x0000 }, /* R3264 */ + { 0x0000, 0x0000, 0x0000 }, /* R3265 */ + { 0x0000, 0x0000, 0x0000 }, /* R3266 */ + { 0x0000, 0x0000, 0x0000 }, /* R3267 */ + { 0x0000, 0x0000, 0x0000 }, /* R3268 */ + { 0x0000, 0x0000, 0x0000 }, /* R3269 */ + { 0x0000, 0x0000, 0x0000 }, /* R3270 */ + { 0x0000, 0x0000, 0x0000 }, /* R3271 */ + { 0x0000, 0x0000, 0x0000 }, /* R3272 */ + { 0x0000, 0x0000, 0x0000 }, /* R3273 */ + { 0x0000, 0x0000, 0x0000 }, /* R3274 */ + { 0x0000, 0x0000, 0x0000 }, /* R3275 */ + { 0x0000, 0x0000, 0x0000 }, /* R3276 */ + { 0x0000, 0x0000, 0x0000 }, /* R3277 */ + { 0x0000, 0x0000, 0x0000 }, /* R3278 */ + { 0x0000, 0x0000, 0x0000 }, /* R3279 */ + { 0x0000, 0x0000, 0x0000 }, /* R3280 */ + { 0x0000, 0x0000, 0x0000 }, /* R3281 */ + { 0x0000, 0x0000, 0x0000 }, /* R3282 */ + { 0x0000, 0x0000, 0x0000 }, /* R3283 */ + { 0x0000, 0x0000, 0x0000 }, /* R3284 */ + { 0x0000, 0x0000, 0x0000 }, /* R3285 */ + { 0x0000, 0x0000, 0x0000 }, /* R3286 */ + { 0x0000, 0x0000, 0x0000 }, /* R3287 */ + { 0x0000, 0x0000, 0x0000 }, /* R3288 */ + { 0x0000, 0x0000, 0x0000 }, /* R3289 */ + { 0x0000, 0x0000, 0x0000 }, /* R3290 */ + { 0x0000, 0x0000, 0x0000 }, /* R3291 */ + { 0x0000, 0x0000, 0x0000 }, /* R3292 */ + { 0x0000, 0x0000, 0x0000 }, /* R3293 */ + { 0x0000, 0x0000, 0x0000 }, /* R3294 */ + { 0x0000, 0x0000, 0x0000 }, /* R3295 */ + { 0x0000, 0x0000, 0x0000 }, /* R3296 */ + { 0x0000, 0x0000, 0x0000 }, /* R3297 */ + { 0x0000, 0x0000, 0x0000 }, /* R3298 */ + { 0x0000, 0x0000, 0x0000 }, /* R3299 */ + { 0x0000, 0x0000, 0x0000 }, /* R3300 */ + { 0x0000, 0x0000, 0x0000 }, /* R3301 */ + { 0x0000, 0x0000, 0x0000 }, /* R3302 */ + { 0x0000, 0x0000, 0x0000 }, /* R3303 */ + { 0x0000, 0x0000, 0x0000 }, /* R3304 */ + { 0x0000, 0x0000, 0x0000 }, /* R3305 */ + { 0x0000, 0x0000, 0x0000 }, /* R3306 */ + { 0x0000, 0x0000, 0x0000 }, /* R3307 */ + { 0x0000, 0x0000, 0x0000 }, /* R3308 */ + { 0x0000, 0x0000, 0x0000 }, /* R3309 */ + { 0x0000, 0x0000, 0x0000 }, /* R3310 */ + { 0x0000, 0x0000, 0x0000 }, /* R3311 */ + { 0x0000, 0x0000, 0x0000 }, /* R3312 */ + { 0x0000, 0x0000, 0x0000 }, /* R3313 */ + { 0x0000, 0x0000, 0x0000 }, /* R3314 */ + { 0x0000, 0x0000, 0x0000 }, /* R3315 */ + { 0x0000, 0x0000, 0x0000 }, /* R3316 */ + { 0x0000, 0x0000, 0x0000 }, /* R3317 */ + { 0x0000, 0x0000, 0x0000 }, /* R3318 */ + { 0x0000, 0x0000, 0x0000 }, /* R3319 */ + { 0x0000, 0x0000, 0x0000 }, /* R3320 */ + { 0x0000, 0x0000, 0x0000 }, /* R3321 */ + { 0x0000, 0x0000, 0x0000 }, /* R3322 */ + { 0x0000, 0x0000, 0x0000 }, /* R3323 */ + { 0x0000, 0x0000, 0x0000 }, /* R3324 */ + { 0x0000, 0x0000, 0x0000 }, /* R3325 */ + { 0x0000, 0x0000, 0x0000 }, /* R3326 */ + { 0x0000, 0x0000, 0x0000 }, /* R3327 */ + { 0x0000, 0x0000, 0x0000 }, /* R3328 */ + { 0x0000, 0x0000, 0x0000 }, /* R3329 */ + { 0x0000, 0x0000, 0x0000 }, /* R3330 */ + { 0x0000, 0x0000, 0x0000 }, /* R3331 */ + { 0x0000, 0x0000, 0x0000 }, /* R3332 */ + { 0x0000, 0x0000, 0x0000 }, /* R3333 */ + { 0x0000, 0x0000, 0x0000 }, /* R3334 */ + { 0x0000, 0x0000, 0x0000 }, /* R3335 */ + { 0x0000, 0x0000, 0x0000 }, /* R3336 */ + { 0x0000, 0x0000, 0x0000 }, /* R3337 */ + { 0x0000, 0x0000, 0x0000 }, /* R3338 */ + { 0x0000, 0x0000, 0x0000 }, /* R3339 */ + { 0x0000, 0x0000, 0x0000 }, /* R3340 */ + { 0x0000, 0x0000, 0x0000 }, /* R3341 */ + { 0x0000, 0x0000, 0x0000 }, /* R3342 */ + { 0x0000, 0x0000, 0x0000 }, /* R3343 */ + { 0x0000, 0x0000, 0x0000 }, /* R3344 */ + { 0x0000, 0x0000, 0x0000 }, /* R3345 */ + { 0x0000, 0x0000, 0x0000 }, /* R3346 */ + { 0x0000, 0x0000, 0x0000 }, /* R3347 */ + { 0x0000, 0x0000, 0x0000 }, /* R3348 */ + { 0x0000, 0x0000, 0x0000 }, /* R3349 */ + { 0x0000, 0x0000, 0x0000 }, /* R3350 */ + { 0x0000, 0x0000, 0x0000 }, /* R3351 */ + { 0x0000, 0x0000, 0x0000 }, /* R3352 */ + { 0x0000, 0x0000, 0x0000 }, /* R3353 */ + { 0x0000, 0x0000, 0x0000 }, /* R3354 */ + { 0x0000, 0x0000, 0x0000 }, /* R3355 */ + { 0x0000, 0x0000, 0x0000 }, /* R3356 */ + { 0x0000, 0x0000, 0x0000 }, /* R3357 */ + { 0x0000, 0x0000, 0x0000 }, /* R3358 */ + { 0x0000, 0x0000, 0x0000 }, /* R3359 */ + { 0x0000, 0x0000, 0x0000 }, /* R3360 */ + { 0x0000, 0x0000, 0x0000 }, /* R3361 */ + { 0x0000, 0x0000, 0x0000 }, /* R3362 */ + { 0x0000, 0x0000, 0x0000 }, /* R3363 */ + { 0x0000, 0x0000, 0x0000 }, /* R3364 */ + { 0x0000, 0x0000, 0x0000 }, /* R3365 */ + { 0x0000, 0x0000, 0x0000 }, /* R3366 */ + { 0x0000, 0x0000, 0x0000 }, /* R3367 */ + { 0x0000, 0x0000, 0x0000 }, /* R3368 */ + { 0x0000, 0x0000, 0x0000 }, /* R3369 */ + { 0x0000, 0x0000, 0x0000 }, /* R3370 */ + { 0x0000, 0x0000, 0x0000 }, /* R3371 */ + { 0x0000, 0x0000, 0x0000 }, /* R3372 */ + { 0x0000, 0x0000, 0x0000 }, /* R3373 */ + { 0x0000, 0x0000, 0x0000 }, /* R3374 */ + { 0x0000, 0x0000, 0x0000 }, /* R3375 */ + { 0x0000, 0x0000, 0x0000 }, /* R3376 */ + { 0x0000, 0x0000, 0x0000 }, /* R3377 */ + { 0x0000, 0x0000, 0x0000 }, /* R3378 */ + { 0x0000, 0x0000, 0x0000 }, /* R3379 */ + { 0x0000, 0x0000, 0x0000 }, /* R3380 */ + { 0x0000, 0x0000, 0x0000 }, /* R3381 */ + { 0x0000, 0x0000, 0x0000 }, /* R3382 */ + { 0x0000, 0x0000, 0x0000 }, /* R3383 */ + { 0x0000, 0x0000, 0x0000 }, /* R3384 */ + { 0x0000, 0x0000, 0x0000 }, /* R3385 */ + { 0x0000, 0x0000, 0x0000 }, /* R3386 */ + { 0x0000, 0x0000, 0x0000 }, /* R3387 */ + { 0x0000, 0x0000, 0x0000 }, /* R3388 */ + { 0x0000, 0x0000, 0x0000 }, /* R3389 */ + { 0x0000, 0x0000, 0x0000 }, /* R3390 */ + { 0x0000, 0x0000, 0x0000 }, /* R3391 */ + { 0x0000, 0x0000, 0x0000 }, /* R3392 */ + { 0x0000, 0x0000, 0x0000 }, /* R3393 */ + { 0x0000, 0x0000, 0x0000 }, /* R3394 */ + { 0x0000, 0x0000, 0x0000 }, /* R3395 */ + { 0x0000, 0x0000, 0x0000 }, /* R3396 */ + { 0x0000, 0x0000, 0x0000 }, /* R3397 */ + { 0x0000, 0x0000, 0x0000 }, /* R3398 */ + { 0x0000, 0x0000, 0x0000 }, /* R3399 */ + { 0x0000, 0x0000, 0x0000 }, /* R3400 */ + { 0x0000, 0x0000, 0x0000 }, /* R3401 */ + { 0x0000, 0x0000, 0x0000 }, /* R3402 */ + { 0x0000, 0x0000, 0x0000 }, /* R3403 */ + { 0x0000, 0x0000, 0x0000 }, /* R3404 */ + { 0x0000, 0x0000, 0x0000 }, /* R3405 */ + { 0x0000, 0x0000, 0x0000 }, /* R3406 */ + { 0x0000, 0x0000, 0x0000 }, /* R3407 */ + { 0x0000, 0x0000, 0x0000 }, /* R3408 */ + { 0x0000, 0x0000, 0x0000 }, /* R3409 */ + { 0x0000, 0x0000, 0x0000 }, /* R3410 */ + { 0x0000, 0x0000, 0x0000 }, /* R3411 */ + { 0x0000, 0x0000, 0x0000 }, /* R3412 */ + { 0x0000, 0x0000, 0x0000 }, /* R3413 */ + { 0x0000, 0x0000, 0x0000 }, /* R3414 */ + { 0x0000, 0x0000, 0x0000 }, /* R3415 */ + { 0x0000, 0x0000, 0x0000 }, /* R3416 */ + { 0x0000, 0x0000, 0x0000 }, /* R3417 */ + { 0x0000, 0x0000, 0x0000 }, /* R3418 */ + { 0x0000, 0x0000, 0x0000 }, /* R3419 */ + { 0x0000, 0x0000, 0x0000 }, /* R3420 */ + { 0x0000, 0x0000, 0x0000 }, /* R3421 */ + { 0x0000, 0x0000, 0x0000 }, /* R3422 */ + { 0x0000, 0x0000, 0x0000 }, /* R3423 */ + { 0x0000, 0x0000, 0x0000 }, /* R3424 */ + { 0x0000, 0x0000, 0x0000 }, /* R3425 */ + { 0x0000, 0x0000, 0x0000 }, /* R3426 */ + { 0x0000, 0x0000, 0x0000 }, /* R3427 */ + { 0x0000, 0x0000, 0x0000 }, /* R3428 */ + { 0x0000, 0x0000, 0x0000 }, /* R3429 */ + { 0x0000, 0x0000, 0x0000 }, /* R3430 */ + { 0x0000, 0x0000, 0x0000 }, /* R3431 */ + { 0x0000, 0x0000, 0x0000 }, /* R3432 */ + { 0x0000, 0x0000, 0x0000 }, /* R3433 */ + { 0x0000, 0x0000, 0x0000 }, /* R3434 */ + { 0x0000, 0x0000, 0x0000 }, /* R3435 */ + { 0x0000, 0x0000, 0x0000 }, /* R3436 */ + { 0x0000, 0x0000, 0x0000 }, /* R3437 */ + { 0x0000, 0x0000, 0x0000 }, /* R3438 */ + { 0x0000, 0x0000, 0x0000 }, /* R3439 */ + { 0x0000, 0x0000, 0x0000 }, /* R3440 */ + { 0x0000, 0x0000, 0x0000 }, /* R3441 */ + { 0x0000, 0x0000, 0x0000 }, /* R3442 */ + { 0x0000, 0x0000, 0x0000 }, /* R3443 */ + { 0x0000, 0x0000, 0x0000 }, /* R3444 */ + { 0x0000, 0x0000, 0x0000 }, /* R3445 */ + { 0x0000, 0x0000, 0x0000 }, /* R3446 */ + { 0x0000, 0x0000, 0x0000 }, /* R3447 */ + { 0x0000, 0x0000, 0x0000 }, /* R3448 */ + { 0x0000, 0x0000, 0x0000 }, /* R3449 */ + { 0x0000, 0x0000, 0x0000 }, /* R3450 */ + { 0x0000, 0x0000, 0x0000 }, /* R3451 */ + { 0x0000, 0x0000, 0x0000 }, /* R3452 */ + { 0x0000, 0x0000, 0x0000 }, /* R3453 */ + { 0x0000, 0x0000, 0x0000 }, /* R3454 */ + { 0x0000, 0x0000, 0x0000 }, /* R3455 */ + { 0x0000, 0x0000, 0x0000 }, /* R3456 */ + { 0x0000, 0x0000, 0x0000 }, /* R3457 */ + { 0x0000, 0x0000, 0x0000 }, /* R3458 */ + { 0x0000, 0x0000, 0x0000 }, /* R3459 */ + { 0x0000, 0x0000, 0x0000 }, /* R3460 */ + { 0x0000, 0x0000, 0x0000 }, /* R3461 */ + { 0x0000, 0x0000, 0x0000 }, /* R3462 */ + { 0x0000, 0x0000, 0x0000 }, /* R3463 */ + { 0x0000, 0x0000, 0x0000 }, /* R3464 */ + { 0x0000, 0x0000, 0x0000 }, /* R3465 */ + { 0x0000, 0x0000, 0x0000 }, /* R3466 */ + { 0x0000, 0x0000, 0x0000 }, /* R3467 */ + { 0x0000, 0x0000, 0x0000 }, /* R3468 */ + { 0x0000, 0x0000, 0x0000 }, /* R3469 */ + { 0x0000, 0x0000, 0x0000 }, /* R3470 */ + { 0x0000, 0x0000, 0x0000 }, /* R3471 */ + { 0x0000, 0x0000, 0x0000 }, /* R3472 */ + { 0x0000, 0x0000, 0x0000 }, /* R3473 */ + { 0x0000, 0x0000, 0x0000 }, /* R3474 */ + { 0x0000, 0x0000, 0x0000 }, /* R3475 */ + { 0x0000, 0x0000, 0x0000 }, /* R3476 */ + { 0x0000, 0x0000, 0x0000 }, /* R3477 */ + { 0x0000, 0x0000, 0x0000 }, /* R3478 */ + { 0x0000, 0x0000, 0x0000 }, /* R3479 */ + { 0x0000, 0x0000, 0x0000 }, /* R3480 */ + { 0x0000, 0x0000, 0x0000 }, /* R3481 */ + { 0x0000, 0x0000, 0x0000 }, /* R3482 */ + { 0x0000, 0x0000, 0x0000 }, /* R3483 */ + { 0x0000, 0x0000, 0x0000 }, /* R3484 */ + { 0x0000, 0x0000, 0x0000 }, /* R3485 */ + { 0x0000, 0x0000, 0x0000 }, /* R3486 */ + { 0x0000, 0x0000, 0x0000 }, /* R3487 */ + { 0x0000, 0x0000, 0x0000 }, /* R3488 */ + { 0x0000, 0x0000, 0x0000 }, /* R3489 */ + { 0x0000, 0x0000, 0x0000 }, /* R3490 */ + { 0x0000, 0x0000, 0x0000 }, /* R3491 */ + { 0x0000, 0x0000, 0x0000 }, /* R3492 */ + { 0x0000, 0x0000, 0x0000 }, /* R3493 */ + { 0x0000, 0x0000, 0x0000 }, /* R3494 */ + { 0x0000, 0x0000, 0x0000 }, /* R3495 */ + { 0x0000, 0x0000, 0x0000 }, /* R3496 */ + { 0x0000, 0x0000, 0x0000 }, /* R3497 */ + { 0x0000, 0x0000, 0x0000 }, /* R3498 */ + { 0x0000, 0x0000, 0x0000 }, /* R3499 */ + { 0x0000, 0x0000, 0x0000 }, /* R3500 */ + { 0x0000, 0x0000, 0x0000 }, /* R3501 */ + { 0x0000, 0x0000, 0x0000 }, /* R3502 */ + { 0x0000, 0x0000, 0x0000 }, /* R3503 */ + { 0x0000, 0x0000, 0x0000 }, /* R3504 */ + { 0x0000, 0x0000, 0x0000 }, /* R3505 */ + { 0x0000, 0x0000, 0x0000 }, /* R3506 */ + { 0x0000, 0x0000, 0x0000 }, /* R3507 */ + { 0x0000, 0x0000, 0x0000 }, /* R3508 */ + { 0x0000, 0x0000, 0x0000 }, /* R3509 */ + { 0x0000, 0x0000, 0x0000 }, /* R3510 */ + { 0x0000, 0x0000, 0x0000 }, /* R3511 */ + { 0x0000, 0x0000, 0x0000 }, /* R3512 */ + { 0x0000, 0x0000, 0x0000 }, /* R3513 */ + { 0x0000, 0x0000, 0x0000 }, /* R3514 */ + { 0x0000, 0x0000, 0x0000 }, /* R3515 */ + { 0x0000, 0x0000, 0x0000 }, /* R3516 */ + { 0x0000, 0x0000, 0x0000 }, /* R3517 */ + { 0x0000, 0x0000, 0x0000 }, /* R3518 */ + { 0x0000, 0x0000, 0x0000 }, /* R3519 */ + { 0x0000, 0x0000, 0x0000 }, /* R3520 */ + { 0x0000, 0x0000, 0x0000 }, /* R3521 */ + { 0x0000, 0x0000, 0x0000 }, /* R3522 */ + { 0x0000, 0x0000, 0x0000 }, /* R3523 */ + { 0x0000, 0x0000, 0x0000 }, /* R3524 */ + { 0x0000, 0x0000, 0x0000 }, /* R3525 */ + { 0x0000, 0x0000, 0x0000 }, /* R3526 */ + { 0x0000, 0x0000, 0x0000 }, /* R3527 */ + { 0x0000, 0x0000, 0x0000 }, /* R3528 */ + { 0x0000, 0x0000, 0x0000 }, /* R3529 */ + { 0x0000, 0x0000, 0x0000 }, /* R3530 */ + { 0x0000, 0x0000, 0x0000 }, /* R3531 */ + { 0x0000, 0x0000, 0x0000 }, /* R3532 */ + { 0x0000, 0x0000, 0x0000 }, /* R3533 */ + { 0x0000, 0x0000, 0x0000 }, /* R3534 */ + { 0x0000, 0x0000, 0x0000 }, /* R3535 */ + { 0x0000, 0x0000, 0x0000 }, /* R3536 */ + { 0x0000, 0x0000, 0x0000 }, /* R3537 */ + { 0x0000, 0x0000, 0x0000 }, /* R3538 */ + { 0x0000, 0x0000, 0x0000 }, /* R3539 */ + { 0x0000, 0x0000, 0x0000 }, /* R3540 */ + { 0x0000, 0x0000, 0x0000 }, /* R3541 */ + { 0x0000, 0x0000, 0x0000 }, /* R3542 */ + { 0x0000, 0x0000, 0x0000 }, /* R3543 */ + { 0x0000, 0x0000, 0x0000 }, /* R3544 */ + { 0x0000, 0x0000, 0x0000 }, /* R3545 */ + { 0x0000, 0x0000, 0x0000 }, /* R3546 */ + { 0x0000, 0x0000, 0x0000 }, /* R3547 */ + { 0x0000, 0x0000, 0x0000 }, /* R3548 */ + { 0x0000, 0x0000, 0x0000 }, /* R3549 */ + { 0x0000, 0x0000, 0x0000 }, /* R3550 */ + { 0x0000, 0x0000, 0x0000 }, /* R3551 */ + { 0x0000, 0x0000, 0x0000 }, /* R3552 */ + { 0x0000, 0x0000, 0x0000 }, /* R3553 */ + { 0x0000, 0x0000, 0x0000 }, /* R3554 */ + { 0x0000, 0x0000, 0x0000 }, /* R3555 */ + { 0x0000, 0x0000, 0x0000 }, /* R3556 */ + { 0x0000, 0x0000, 0x0000 }, /* R3557 */ + { 0x0000, 0x0000, 0x0000 }, /* R3558 */ + { 0x0000, 0x0000, 0x0000 }, /* R3559 */ + { 0x0000, 0x0000, 0x0000 }, /* R3560 */ + { 0x0000, 0x0000, 0x0000 }, /* R3561 */ + { 0x0000, 0x0000, 0x0000 }, /* R3562 */ + { 0x0000, 0x0000, 0x0000 }, /* R3563 */ + { 0x0000, 0x0000, 0x0000 }, /* R3564 */ + { 0x0000, 0x0000, 0x0000 }, /* R3565 */ + { 0x0000, 0x0000, 0x0000 }, /* R3566 */ + { 0x0000, 0x0000, 0x0000 }, /* R3567 */ + { 0x0000, 0x0000, 0x0000 }, /* R3568 */ + { 0x0000, 0x0000, 0x0000 }, /* R3569 */ + { 0x0000, 0x0000, 0x0000 }, /* R3570 */ + { 0x0000, 0x0000, 0x0000 }, /* R3571 */ + { 0x0000, 0x0000, 0x0000 }, /* R3572 */ + { 0x0000, 0x0000, 0x0000 }, /* R3573 */ + { 0x0000, 0x0000, 0x0000 }, /* R3574 */ + { 0x0000, 0x0000, 0x0000 }, /* R3575 */ + { 0x0000, 0x0000, 0x0000 }, /* R3576 */ + { 0x0000, 0x0000, 0x0000 }, /* R3577 */ + { 0x0000, 0x0000, 0x0000 }, /* R3578 */ + { 0x0000, 0x0000, 0x0000 }, /* R3579 */ + { 0x0000, 0x0000, 0x0000 }, /* R3580 */ + { 0x0000, 0x0000, 0x0000 }, /* R3581 */ + { 0x0000, 0x0000, 0x0000 }, /* R3582 */ + { 0x0000, 0x0000, 0x0000 }, /* R3583 */ + { 0x0000, 0x0000, 0x0000 }, /* R3584 */ + { 0x0000, 0x0000, 0x0000 }, /* R3585 */ + { 0x0000, 0x0000, 0x0000 }, /* R3586 */ + { 0x0000, 0x0000, 0x0000 }, /* R3587 */ + { 0x0000, 0x0000, 0x0000 }, /* R3588 */ + { 0x0000, 0x0000, 0x0000 }, /* R3589 */ + { 0x0000, 0x0000, 0x0000 }, /* R3590 */ + { 0x0000, 0x0000, 0x0000 }, /* R3591 */ + { 0x0000, 0x0000, 0x0000 }, /* R3592 */ + { 0x0000, 0x0000, 0x0000 }, /* R3593 */ + { 0x0000, 0x0000, 0x0000 }, /* R3594 */ + { 0x0000, 0x0000, 0x0000 }, /* R3595 */ + { 0x0000, 0x0000, 0x0000 }, /* R3596 */ + { 0x0000, 0x0000, 0x0000 }, /* R3597 */ + { 0x0000, 0x0000, 0x0000 }, /* R3598 */ + { 0x0000, 0x0000, 0x0000 }, /* R3599 */ + { 0x0000, 0x0000, 0x0000 }, /* R3600 */ + { 0x0000, 0x0000, 0x0000 }, /* R3601 */ + { 0x0000, 0x0000, 0x0000 }, /* R3602 */ + { 0x0000, 0x0000, 0x0000 }, /* R3603 */ + { 0x0000, 0x0000, 0x0000 }, /* R3604 */ + { 0x0000, 0x0000, 0x0000 }, /* R3605 */ + { 0x0000, 0x0000, 0x0000 }, /* R3606 */ + { 0x0000, 0x0000, 0x0000 }, /* R3607 */ + { 0x0000, 0x0000, 0x0000 }, /* R3608 */ + { 0x0000, 0x0000, 0x0000 }, /* R3609 */ + { 0x0000, 0x0000, 0x0000 }, /* R3610 */ + { 0x0000, 0x0000, 0x0000 }, /* R3611 */ + { 0x0000, 0x0000, 0x0000 }, /* R3612 */ + { 0x0000, 0x0000, 0x0000 }, /* R3613 */ + { 0x0000, 0x0000, 0x0000 }, /* R3614 */ + { 0x0000, 0x0000, 0x0000 }, /* R3615 */ + { 0x0000, 0x0000, 0x0000 }, /* R3616 */ + { 0x0000, 0x0000, 0x0000 }, /* R3617 */ + { 0x0000, 0x0000, 0x0000 }, /* R3618 */ + { 0x0000, 0x0000, 0x0000 }, /* R3619 */ + { 0x0000, 0x0000, 0x0000 }, /* R3620 */ + { 0x0000, 0x0000, 0x0000 }, /* R3621 */ + { 0x0000, 0x0000, 0x0000 }, /* R3622 */ + { 0x0000, 0x0000, 0x0000 }, /* R3623 */ + { 0x0000, 0x0000, 0x0000 }, /* R3624 */ + { 0x0000, 0x0000, 0x0000 }, /* R3625 */ + { 0x0000, 0x0000, 0x0000 }, /* R3626 */ + { 0x0000, 0x0000, 0x0000 }, /* R3627 */ + { 0x0000, 0x0000, 0x0000 }, /* R3628 */ + { 0x0000, 0x0000, 0x0000 }, /* R3629 */ + { 0x0000, 0x0000, 0x0000 }, /* R3630 */ + { 0x0000, 0x0000, 0x0000 }, /* R3631 */ + { 0x0000, 0x0000, 0x0000 }, /* R3632 */ + { 0x0000, 0x0000, 0x0000 }, /* R3633 */ + { 0x0000, 0x0000, 0x0000 }, /* R3634 */ + { 0x0000, 0x0000, 0x0000 }, /* R3635 */ + { 0x0000, 0x0000, 0x0000 }, /* R3636 */ + { 0x0000, 0x0000, 0x0000 }, /* R3637 */ + { 0x0000, 0x0000, 0x0000 }, /* R3638 */ + { 0x0000, 0x0000, 0x0000 }, /* R3639 */ + { 0x0000, 0x0000, 0x0000 }, /* R3640 */ + { 0x0000, 0x0000, 0x0000 }, /* R3641 */ + { 0x0000, 0x0000, 0x0000 }, /* R3642 */ + { 0x0000, 0x0000, 0x0000 }, /* R3643 */ + { 0x0000, 0x0000, 0x0000 }, /* R3644 */ + { 0x0000, 0x0000, 0x0000 }, /* R3645 */ + { 0x0000, 0x0000, 0x0000 }, /* R3646 */ + { 0x0000, 0x0000, 0x0000 }, /* R3647 */ + { 0x0000, 0x0000, 0x0000 }, /* R3648 */ + { 0x0000, 0x0000, 0x0000 }, /* R3649 */ + { 0x0000, 0x0000, 0x0000 }, /* R3650 */ + { 0x0000, 0x0000, 0x0000 }, /* R3651 */ + { 0x0000, 0x0000, 0x0000 }, /* R3652 */ + { 0x0000, 0x0000, 0x0000 }, /* R3653 */ + { 0x0000, 0x0000, 0x0000 }, /* R3654 */ + { 0x0000, 0x0000, 0x0000 }, /* R3655 */ + { 0x0000, 0x0000, 0x0000 }, /* R3656 */ + { 0x0000, 0x0000, 0x0000 }, /* R3657 */ + { 0x0000, 0x0000, 0x0000 }, /* R3658 */ + { 0x0000, 0x0000, 0x0000 }, /* R3659 */ + { 0x0000, 0x0000, 0x0000 }, /* R3660 */ + { 0x0000, 0x0000, 0x0000 }, /* R3661 */ + { 0x0000, 0x0000, 0x0000 }, /* R3662 */ + { 0x0000, 0x0000, 0x0000 }, /* R3663 */ + { 0x0000, 0x0000, 0x0000 }, /* R3664 */ + { 0x0000, 0x0000, 0x0000 }, /* R3665 */ + { 0x0000, 0x0000, 0x0000 }, /* R3666 */ + { 0x0000, 0x0000, 0x0000 }, /* R3667 */ + { 0x0000, 0x0000, 0x0000 }, /* R3668 */ + { 0x0000, 0x0000, 0x0000 }, /* R3669 */ + { 0x0000, 0x0000, 0x0000 }, /* R3670 */ + { 0x0000, 0x0000, 0x0000 }, /* R3671 */ + { 0x0000, 0x0000, 0x0000 }, /* R3672 */ + { 0x0000, 0x0000, 0x0000 }, /* R3673 */ + { 0x0000, 0x0000, 0x0000 }, /* R3674 */ + { 0x0000, 0x0000, 0x0000 }, /* R3675 */ + { 0x0000, 0x0000, 0x0000 }, /* R3676 */ + { 0x0000, 0x0000, 0x0000 }, /* R3677 */ + { 0x0000, 0x0000, 0x0000 }, /* R3678 */ + { 0x0000, 0x0000, 0x0000 }, /* R3679 */ + { 0x0000, 0x0000, 0x0000 }, /* R3680 */ + { 0x0000, 0x0000, 0x0000 }, /* R3681 */ + { 0x0000, 0x0000, 0x0000 }, /* R3682 */ + { 0x0000, 0x0000, 0x0000 }, /* R3683 */ + { 0x0000, 0x0000, 0x0000 }, /* R3684 */ + { 0x0000, 0x0000, 0x0000 }, /* R3685 */ + { 0x0000, 0x0000, 0x0000 }, /* R3686 */ + { 0x0000, 0x0000, 0x0000 }, /* R3687 */ + { 0x0000, 0x0000, 0x0000 }, /* R3688 */ + { 0x0000, 0x0000, 0x0000 }, /* R3689 */ + { 0x0000, 0x0000, 0x0000 }, /* R3690 */ + { 0x0000, 0x0000, 0x0000 }, /* R3691 */ + { 0x0000, 0x0000, 0x0000 }, /* R3692 */ + { 0x0000, 0x0000, 0x0000 }, /* R3693 */ + { 0x0000, 0x0000, 0x0000 }, /* R3694 */ + { 0x0000, 0x0000, 0x0000 }, /* R3695 */ + { 0x0000, 0x0000, 0x0000 }, /* R3696 */ + { 0x0000, 0x0000, 0x0000 }, /* R3697 */ + { 0x0000, 0x0000, 0x0000 }, /* R3698 */ + { 0x0000, 0x0000, 0x0000 }, /* R3699 */ + { 0x0000, 0x0000, 0x0000 }, /* R3700 */ + { 0x0000, 0x0000, 0x0000 }, /* R3701 */ + { 0x0000, 0x0000, 0x0000 }, /* R3702 */ + { 0x0000, 0x0000, 0x0000 }, /* R3703 */ + { 0x0000, 0x0000, 0x0000 }, /* R3704 */ + { 0x0000, 0x0000, 0x0000 }, /* R3705 */ + { 0x0000, 0x0000, 0x0000 }, /* R3706 */ + { 0x0000, 0x0000, 0x0000 }, /* R3707 */ + { 0x0000, 0x0000, 0x0000 }, /* R3708 */ + { 0x0000, 0x0000, 0x0000 }, /* R3709 */ + { 0x0000, 0x0000, 0x0000 }, /* R3710 */ + { 0x0000, 0x0000, 0x0000 }, /* R3711 */ + { 0x0000, 0x0000, 0x0000 }, /* R3712 */ + { 0x0000, 0x0000, 0x0000 }, /* R3713 */ + { 0x0000, 0x0000, 0x0000 }, /* R3714 */ + { 0x0000, 0x0000, 0x0000 }, /* R3715 */ + { 0x0000, 0x0000, 0x0000 }, /* R3716 */ + { 0x0000, 0x0000, 0x0000 }, /* R3717 */ + { 0x0000, 0x0000, 0x0000 }, /* R3718 */ + { 0x0000, 0x0000, 0x0000 }, /* R3719 */ + { 0x0000, 0x0000, 0x0000 }, /* R3720 */ + { 0x0000, 0x0000, 0x0000 }, /* R3721 */ + { 0x0000, 0x0000, 0x0000 }, /* R3722 */ + { 0x0000, 0x0000, 0x0000 }, /* R3723 */ + { 0x0000, 0x0000, 0x0000 }, /* R3724 */ + { 0x0000, 0x0000, 0x0000 }, /* R3725 */ + { 0x0000, 0x0000, 0x0000 }, /* R3726 */ + { 0x0000, 0x0000, 0x0000 }, /* R3727 */ + { 0x0000, 0x0000, 0x0000 }, /* R3728 */ + { 0x0000, 0x0000, 0x0000 }, /* R3729 */ + { 0x0000, 0x0000, 0x0000 }, /* R3730 */ + { 0x0000, 0x0000, 0x0000 }, /* R3731 */ + { 0x0000, 0x0000, 0x0000 }, /* R3732 */ + { 0x0000, 0x0000, 0x0000 }, /* R3733 */ + { 0x0000, 0x0000, 0x0000 }, /* R3734 */ + { 0x0000, 0x0000, 0x0000 }, /* R3735 */ + { 0x0000, 0x0000, 0x0000 }, /* R3736 */ + { 0x0000, 0x0000, 0x0000 }, /* R3737 */ + { 0x0000, 0x0000, 0x0000 }, /* R3738 */ + { 0x0000, 0x0000, 0x0000 }, /* R3739 */ + { 0x0000, 0x0000, 0x0000 }, /* R3740 */ + { 0x0000, 0x0000, 0x0000 }, /* R3741 */ + { 0x0000, 0x0000, 0x0000 }, /* R3742 */ + { 0x0000, 0x0000, 0x0000 }, /* R3743 */ + { 0x0000, 0x0000, 0x0000 }, /* R3744 */ + { 0x0000, 0x0000, 0x0000 }, /* R3745 */ + { 0x0000, 0x0000, 0x0000 }, /* R3746 */ + { 0x0000, 0x0000, 0x0000 }, /* R3747 */ + { 0x0000, 0x0000, 0x0000 }, /* R3748 */ + { 0x0000, 0x0000, 0x0000 }, /* R3749 */ + { 0x0000, 0x0000, 0x0000 }, /* R3750 */ + { 0x0000, 0x0000, 0x0000 }, /* R3751 */ + { 0x0000, 0x0000, 0x0000 }, /* R3752 */ + { 0x0000, 0x0000, 0x0000 }, /* R3753 */ + { 0x0000, 0x0000, 0x0000 }, /* R3754 */ + { 0x0000, 0x0000, 0x0000 }, /* R3755 */ + { 0x0000, 0x0000, 0x0000 }, /* R3756 */ + { 0x0000, 0x0000, 0x0000 }, /* R3757 */ + { 0x0000, 0x0000, 0x0000 }, /* R3758 */ + { 0x0000, 0x0000, 0x0000 }, /* R3759 */ + { 0x0000, 0x0000, 0x0000 }, /* R3760 */ + { 0x0000, 0x0000, 0x0000 }, /* R3761 */ + { 0x0000, 0x0000, 0x0000 }, /* R3762 */ + { 0x0000, 0x0000, 0x0000 }, /* R3763 */ + { 0x0000, 0x0000, 0x0000 }, /* R3764 */ + { 0x0000, 0x0000, 0x0000 }, /* R3765 */ + { 0x0000, 0x0000, 0x0000 }, /* R3766 */ + { 0x0000, 0x0000, 0x0000 }, /* R3767 */ + { 0x0000, 0x0000, 0x0000 }, /* R3768 */ + { 0x0000, 0x0000, 0x0000 }, /* R3769 */ + { 0x0000, 0x0000, 0x0000 }, /* R3770 */ + { 0x0000, 0x0000, 0x0000 }, /* R3771 */ + { 0x0000, 0x0000, 0x0000 }, /* R3772 */ + { 0x0000, 0x0000, 0x0000 }, /* R3773 */ + { 0x0000, 0x0000, 0x0000 }, /* R3774 */ + { 0x0000, 0x0000, 0x0000 }, /* R3775 */ + { 0x0000, 0x0000, 0x0000 }, /* R3776 */ + { 0x0000, 0x0000, 0x0000 }, /* R3777 */ + { 0x0000, 0x0000, 0x0000 }, /* R3778 */ + { 0x0000, 0x0000, 0x0000 }, /* R3779 */ + { 0x0000, 0x0000, 0x0000 }, /* R3780 */ + { 0x0000, 0x0000, 0x0000 }, /* R3781 */ + { 0x0000, 0x0000, 0x0000 }, /* R3782 */ + { 0x0000, 0x0000, 0x0000 }, /* R3783 */ + { 0x0000, 0x0000, 0x0000 }, /* R3784 */ + { 0x0000, 0x0000, 0x0000 }, /* R3785 */ + { 0x0000, 0x0000, 0x0000 }, /* R3786 */ + { 0x0000, 0x0000, 0x0000 }, /* R3787 */ + { 0x0000, 0x0000, 0x0000 }, /* R3788 */ + { 0x0000, 0x0000, 0x0000 }, /* R3789 */ + { 0x0000, 0x0000, 0x0000 }, /* R3790 */ + { 0x0000, 0x0000, 0x0000 }, /* R3791 */ + { 0x0000, 0x0000, 0x0000 }, /* R3792 */ + { 0x0000, 0x0000, 0x0000 }, /* R3793 */ + { 0x0000, 0x0000, 0x0000 }, /* R3794 */ + { 0x0000, 0x0000, 0x0000 }, /* R3795 */ + { 0x0000, 0x0000, 0x0000 }, /* R3796 */ + { 0x0000, 0x0000, 0x0000 }, /* R3797 */ + { 0x0000, 0x0000, 0x0000 }, /* R3798 */ + { 0x0000, 0x0000, 0x0000 }, /* R3799 */ + { 0x0000, 0x0000, 0x0000 }, /* R3800 */ + { 0x0000, 0x0000, 0x0000 }, /* R3801 */ + { 0x0000, 0x0000, 0x0000 }, /* R3802 */ + { 0x0000, 0x0000, 0x0000 }, /* R3803 */ + { 0x0000, 0x0000, 0x0000 }, /* R3804 */ + { 0x0000, 0x0000, 0x0000 }, /* R3805 */ + { 0x0000, 0x0000, 0x0000 }, /* R3806 */ + { 0x0000, 0x0000, 0x0000 }, /* R3807 */ + { 0x0000, 0x0000, 0x0000 }, /* R3808 */ + { 0x0000, 0x0000, 0x0000 }, /* R3809 */ + { 0x0000, 0x0000, 0x0000 }, /* R3810 */ + { 0x0000, 0x0000, 0x0000 }, /* R3811 */ + { 0x0000, 0x0000, 0x0000 }, /* R3812 */ + { 0x0000, 0x0000, 0x0000 }, /* R3813 */ + { 0x0000, 0x0000, 0x0000 }, /* R3814 */ + { 0x0000, 0x0000, 0x0000 }, /* R3815 */ + { 0x0000, 0x0000, 0x0000 }, /* R3816 */ + { 0x0000, 0x0000, 0x0000 }, /* R3817 */ + { 0x0000, 0x0000, 0x0000 }, /* R3818 */ + { 0x0000, 0x0000, 0x0000 }, /* R3819 */ + { 0x0000, 0x0000, 0x0000 }, /* R3820 */ + { 0x0000, 0x0000, 0x0000 }, /* R3821 */ + { 0x0000, 0x0000, 0x0000 }, /* R3822 */ + { 0x0000, 0x0000, 0x0000 }, /* R3823 */ + { 0x0000, 0x0000, 0x0000 }, /* R3824 */ + { 0x0000, 0x0000, 0x0000 }, /* R3825 */ + { 0x0000, 0x0000, 0x0000 }, /* R3826 */ + { 0x0000, 0x0000, 0x0000 }, /* R3827 */ + { 0x0000, 0x0000, 0x0000 }, /* R3828 */ + { 0x0000, 0x0000, 0x0000 }, /* R3829 */ + { 0x0000, 0x0000, 0x0000 }, /* R3830 */ + { 0x0000, 0x0000, 0x0000 }, /* R3831 */ + { 0x0000, 0x0000, 0x0000 }, /* R3832 */ + { 0x0000, 0x0000, 0x0000 }, /* R3833 */ + { 0x0000, 0x0000, 0x0000 }, /* R3834 */ + { 0x0000, 0x0000, 0x0000 }, /* R3835 */ + { 0x0000, 0x0000, 0x0000 }, /* R3836 */ + { 0x0000, 0x0000, 0x0000 }, /* R3837 */ + { 0x0000, 0x0000, 0x0000 }, /* R3838 */ + { 0x0000, 0x0000, 0x0000 }, /* R3839 */ + { 0x0000, 0x0000, 0x0000 }, /* R3840 */ + { 0x0000, 0x0000, 0x0000 }, /* R3841 */ + { 0x0000, 0x0000, 0x0000 }, /* R3842 */ + { 0x0000, 0x0000, 0x0000 }, /* R3843 */ + { 0x0000, 0x0000, 0x0000 }, /* R3844 */ + { 0x0000, 0x0000, 0x0000 }, /* R3845 */ + { 0x0000, 0x0000, 0x0000 }, /* R3846 */ + { 0x0000, 0x0000, 0x0000 }, /* R3847 */ + { 0x0000, 0x0000, 0x0000 }, /* R3848 */ + { 0x0000, 0x0000, 0x0000 }, /* R3849 */ + { 0x0000, 0x0000, 0x0000 }, /* R3850 */ + { 0x0000, 0x0000, 0x0000 }, /* R3851 */ + { 0x0000, 0x0000, 0x0000 }, /* R3852 */ + { 0x0000, 0x0000, 0x0000 }, /* R3853 */ + { 0x0000, 0x0000, 0x0000 }, /* R3854 */ + { 0x0000, 0x0000, 0x0000 }, /* R3855 */ + { 0x0000, 0x0000, 0x0000 }, /* R3856 */ + { 0x0000, 0x0000, 0x0000 }, /* R3857 */ + { 0x0000, 0x0000, 0x0000 }, /* R3858 */ + { 0x0000, 0x0000, 0x0000 }, /* R3859 */ + { 0x0000, 0x0000, 0x0000 }, /* R3860 */ + { 0x0000, 0x0000, 0x0000 }, /* R3861 */ + { 0x0000, 0x0000, 0x0000 }, /* R3862 */ + { 0x0000, 0x0000, 0x0000 }, /* R3863 */ + { 0x0000, 0x0000, 0x0000 }, /* R3864 */ + { 0x0000, 0x0000, 0x0000 }, /* R3865 */ + { 0x0000, 0x0000, 0x0000 }, /* R3866 */ + { 0x0000, 0x0000, 0x0000 }, /* R3867 */ + { 0x0000, 0x0000, 0x0000 }, /* R3868 */ + { 0x0000, 0x0000, 0x0000 }, /* R3869 */ + { 0x0000, 0x0000, 0x0000 }, /* R3870 */ + { 0x0000, 0x0000, 0x0000 }, /* R3871 */ + { 0x0000, 0x0000, 0x0000 }, /* R3872 */ + { 0x0000, 0x0000, 0x0000 }, /* R3873 */ + { 0x0000, 0x0000, 0x0000 }, /* R3874 */ + { 0x0000, 0x0000, 0x0000 }, /* R3875 */ + { 0x0000, 0x0000, 0x0000 }, /* R3876 */ + { 0x0000, 0x0000, 0x0000 }, /* R3877 */ + { 0x0000, 0x0000, 0x0000 }, /* R3878 */ + { 0x0000, 0x0000, 0x0000 }, /* R3879 */ + { 0x0000, 0x0000, 0x0000 }, /* R3880 */ + { 0x0000, 0x0000, 0x0000 }, /* R3881 */ + { 0x0000, 0x0000, 0x0000 }, /* R3882 */ + { 0x0000, 0x0000, 0x0000 }, /* R3883 */ + { 0x0000, 0x0000, 0x0000 }, /* R3884 */ + { 0x0000, 0x0000, 0x0000 }, /* R3885 */ + { 0x0000, 0x0000, 0x0000 }, /* R3886 */ + { 0x0000, 0x0000, 0x0000 }, /* R3887 */ + { 0x0000, 0x0000, 0x0000 }, /* R3888 */ + { 0x0000, 0x0000, 0x0000 }, /* R3889 */ + { 0x0000, 0x0000, 0x0000 }, /* R3890 */ + { 0x0000, 0x0000, 0x0000 }, /* R3891 */ + { 0x0000, 0x0000, 0x0000 }, /* R3892 */ + { 0x0000, 0x0000, 0x0000 }, /* R3893 */ + { 0x0000, 0x0000, 0x0000 }, /* R3894 */ + { 0x0000, 0x0000, 0x0000 }, /* R3895 */ + { 0x0000, 0x0000, 0x0000 }, /* R3896 */ + { 0x0000, 0x0000, 0x0000 }, /* R3897 */ + { 0x0000, 0x0000, 0x0000 }, /* R3898 */ + { 0x0000, 0x0000, 0x0000 }, /* R3899 */ + { 0x0000, 0x0000, 0x0000 }, /* R3900 */ + { 0x0000, 0x0000, 0x0000 }, /* R3901 */ + { 0x0000, 0x0000, 0x0000 }, /* R3902 */ + { 0x0000, 0x0000, 0x0000 }, /* R3903 */ + { 0x0000, 0x0000, 0x0000 }, /* R3904 */ + { 0x0000, 0x0000, 0x0000 }, /* R3905 */ + { 0x0000, 0x0000, 0x0000 }, /* R3906 */ + { 0x0000, 0x0000, 0x0000 }, /* R3907 */ + { 0x0000, 0x0000, 0x0000 }, /* R3908 */ + { 0x0000, 0x0000, 0x0000 }, /* R3909 */ + { 0x0000, 0x0000, 0x0000 }, /* R3910 */ + { 0x0000, 0x0000, 0x0000 }, /* R3911 */ + { 0x0000, 0x0000, 0x0000 }, /* R3912 */ + { 0x0000, 0x0000, 0x0000 }, /* R3913 */ + { 0x0000, 0x0000, 0x0000 }, /* R3914 */ + { 0x0000, 0x0000, 0x0000 }, /* R3915 */ + { 0x0000, 0x0000, 0x0000 }, /* R3916 */ + { 0x0000, 0x0000, 0x0000 }, /* R3917 */ + { 0x0000, 0x0000, 0x0000 }, /* R3918 */ + { 0x0000, 0x0000, 0x0000 }, /* R3919 */ + { 0x0000, 0x0000, 0x0000 }, /* R3920 */ + { 0x0000, 0x0000, 0x0000 }, /* R3921 */ + { 0x0000, 0x0000, 0x0000 }, /* R3922 */ + { 0x0000, 0x0000, 0x0000 }, /* R3923 */ + { 0x0000, 0x0000, 0x0000 }, /* R3924 */ + { 0x0000, 0x0000, 0x0000 }, /* R3925 */ + { 0x0000, 0x0000, 0x0000 }, /* R3926 */ + { 0x0000, 0x0000, 0x0000 }, /* R3927 */ + { 0x0000, 0x0000, 0x0000 }, /* R3928 */ + { 0x0000, 0x0000, 0x0000 }, /* R3929 */ + { 0x0000, 0x0000, 0x0000 }, /* R3930 */ + { 0x0000, 0x0000, 0x0000 }, /* R3931 */ + { 0x0000, 0x0000, 0x0000 }, /* R3932 */ + { 0x0000, 0x0000, 0x0000 }, /* R3933 */ + { 0x0000, 0x0000, 0x0000 }, /* R3934 */ + { 0x0000, 0x0000, 0x0000 }, /* R3935 */ + { 0x0000, 0x0000, 0x0000 }, /* R3936 */ + { 0x0000, 0x0000, 0x0000 }, /* R3937 */ + { 0x0000, 0x0000, 0x0000 }, /* R3938 */ + { 0x0000, 0x0000, 0x0000 }, /* R3939 */ + { 0x0000, 0x0000, 0x0000 }, /* R3940 */ + { 0x0000, 0x0000, 0x0000 }, /* R3941 */ + { 0x0000, 0x0000, 0x0000 }, /* R3942 */ + { 0x0000, 0x0000, 0x0000 }, /* R3943 */ + { 0x0000, 0x0000, 0x0000 }, /* R3944 */ + { 0x0000, 0x0000, 0x0000 }, /* R3945 */ + { 0x0000, 0x0000, 0x0000 }, /* R3946 */ + { 0x0000, 0x0000, 0x0000 }, /* R3947 */ + { 0x0000, 0x0000, 0x0000 }, /* R3948 */ + { 0x0000, 0x0000, 0x0000 }, /* R3949 */ + { 0x0000, 0x0000, 0x0000 }, /* R3950 */ + { 0x0000, 0x0000, 0x0000 }, /* R3951 */ + { 0x0000, 0x0000, 0x0000 }, /* R3952 */ + { 0x0000, 0x0000, 0x0000 }, /* R3953 */ + { 0x0000, 0x0000, 0x0000 }, /* R3954 */ + { 0x0000, 0x0000, 0x0000 }, /* R3955 */ + { 0x0000, 0x0000, 0x0000 }, /* R3956 */ + { 0x0000, 0x0000, 0x0000 }, /* R3957 */ + { 0x0000, 0x0000, 0x0000 }, /* R3958 */ + { 0x0000, 0x0000, 0x0000 }, /* R3959 */ + { 0x0000, 0x0000, 0x0000 }, /* R3960 */ + { 0x0000, 0x0000, 0x0000 }, /* R3961 */ + { 0x0000, 0x0000, 0x0000 }, /* R3962 */ + { 0x0000, 0x0000, 0x0000 }, /* R3963 */ + { 0x0000, 0x0000, 0x0000 }, /* R3964 */ + { 0x0000, 0x0000, 0x0000 }, /* R3965 */ + { 0x0000, 0x0000, 0x0000 }, /* R3966 */ + { 0x0000, 0x0000, 0x0000 }, /* R3967 */ + { 0x0000, 0x0000, 0x0000 }, /* R3968 */ + { 0x0000, 0x0000, 0x0000 }, /* R3969 */ + { 0x0000, 0x0000, 0x0000 }, /* R3970 */ + { 0x0000, 0x0000, 0x0000 }, /* R3971 */ + { 0x0000, 0x0000, 0x0000 }, /* R3972 */ + { 0x0000, 0x0000, 0x0000 }, /* R3973 */ + { 0x0000, 0x0000, 0x0000 }, /* R3974 */ + { 0x0000, 0x0000, 0x0000 }, /* R3975 */ + { 0x0000, 0x0000, 0x0000 }, /* R3976 */ + { 0x0000, 0x0000, 0x0000 }, /* R3977 */ + { 0x0000, 0x0000, 0x0000 }, /* R3978 */ + { 0x0000, 0x0000, 0x0000 }, /* R3979 */ + { 0x0000, 0x0000, 0x0000 }, /* R3980 */ + { 0x0000, 0x0000, 0x0000 }, /* R3981 */ + { 0x0000, 0x0000, 0x0000 }, /* R3982 */ + { 0x0000, 0x0000, 0x0000 }, /* R3983 */ + { 0x0000, 0x0000, 0x0000 }, /* R3984 */ + { 0x0000, 0x0000, 0x0000 }, /* R3985 */ + { 0x0000, 0x0000, 0x0000 }, /* R3986 */ + { 0x0000, 0x0000, 0x0000 }, /* R3987 */ + { 0x0000, 0x0000, 0x0000 }, /* R3988 */ + { 0x0000, 0x0000, 0x0000 }, /* R3989 */ + { 0x0000, 0x0000, 0x0000 }, /* R3990 */ + { 0x0000, 0x0000, 0x0000 }, /* R3991 */ + { 0x0000, 0x0000, 0x0000 }, /* R3992 */ + { 0x0000, 0x0000, 0x0000 }, /* R3993 */ + { 0x0000, 0x0000, 0x0000 }, /* R3994 */ + { 0x0000, 0x0000, 0x0000 }, /* R3995 */ + { 0x0000, 0x0000, 0x0000 }, /* R3996 */ + { 0x0000, 0x0000, 0x0000 }, /* R3997 */ + { 0x0000, 0x0000, 0x0000 }, /* R3998 */ + { 0x0000, 0x0000, 0x0000 }, /* R3999 */ + { 0x0000, 0x0000, 0x0000 }, /* R4000 */ + { 0x0000, 0x0000, 0x0000 }, /* R4001 */ + { 0x0000, 0x0000, 0x0000 }, /* R4002 */ + { 0x0000, 0x0000, 0x0000 }, /* R4003 */ + { 0x0000, 0x0000, 0x0000 }, /* R4004 */ + { 0x0000, 0x0000, 0x0000 }, /* R4005 */ + { 0x0000, 0x0000, 0x0000 }, /* R4006 */ + { 0x0000, 0x0000, 0x0000 }, /* R4007 */ + { 0x0000, 0x0000, 0x0000 }, /* R4008 */ + { 0x0000, 0x0000, 0x0000 }, /* R4009 */ + { 0x0000, 0x0000, 0x0000 }, /* R4010 */ + { 0x0000, 0x0000, 0x0000 }, /* R4011 */ + { 0x0000, 0x0000, 0x0000 }, /* R4012 */ + { 0x0000, 0x0000, 0x0000 }, /* R4013 */ + { 0x0000, 0x0000, 0x0000 }, /* R4014 */ + { 0x0000, 0x0000, 0x0000 }, /* R4015 */ + { 0x0000, 0x0000, 0x0000 }, /* R4016 */ + { 0x0000, 0x0000, 0x0000 }, /* R4017 */ + { 0x0000, 0x0000, 0x0000 }, /* R4018 */ + { 0x0000, 0x0000, 0x0000 }, /* R4019 */ + { 0x0000, 0x0000, 0x0000 }, /* R4020 */ + { 0x0000, 0x0000, 0x0000 }, /* R4021 */ + { 0x0000, 0x0000, 0x0000 }, /* R4022 */ + { 0x0000, 0x0000, 0x0000 }, /* R4023 */ + { 0x0000, 0x0000, 0x0000 }, /* R4024 */ + { 0x0000, 0x0000, 0x0000 }, /* R4025 */ + { 0x0000, 0x0000, 0x0000 }, /* R4026 */ + { 0x0000, 0x0000, 0x0000 }, /* R4027 */ + { 0x0000, 0x0000, 0x0000 }, /* R4028 */ + { 0x0000, 0x0000, 0x0000 }, /* R4029 */ + { 0x0000, 0x0000, 0x0000 }, /* R4030 */ + { 0x0000, 0x0000, 0x0000 }, /* R4031 */ + { 0x0000, 0x0000, 0x0000 }, /* R4032 */ + { 0x0000, 0x0000, 0x0000 }, /* R4033 */ + { 0x0000, 0x0000, 0x0000 }, /* R4034 */ + { 0x0000, 0x0000, 0x0000 }, /* R4035 */ + { 0x0000, 0x0000, 0x0000 }, /* R4036 */ + { 0x0000, 0x0000, 0x0000 }, /* R4037 */ + { 0x0000, 0x0000, 0x0000 }, /* R4038 */ + { 0x0000, 0x0000, 0x0000 }, /* R4039 */ + { 0x0000, 0x0000, 0x0000 }, /* R4040 */ + { 0x0000, 0x0000, 0x0000 }, /* R4041 */ + { 0x0000, 0x0000, 0x0000 }, /* R4042 */ + { 0x0000, 0x0000, 0x0000 }, /* R4043 */ + { 0x0000, 0x0000, 0x0000 }, /* R4044 */ + { 0x0000, 0x0000, 0x0000 }, /* R4045 */ + { 0x0000, 0x0000, 0x0000 }, /* R4046 */ + { 0x0000, 0x0000, 0x0000 }, /* R4047 */ + { 0x0000, 0x0000, 0x0000 }, /* R4048 */ + { 0x0000, 0x0000, 0x0000 }, /* R4049 */ + { 0x0000, 0x0000, 0x0000 }, /* R4050 */ + { 0x0000, 0x0000, 0x0000 }, /* R4051 */ + { 0x0000, 0x0000, 0x0000 }, /* R4052 */ + { 0x0000, 0x0000, 0x0000 }, /* R4053 */ + { 0x0000, 0x0000, 0x0000 }, /* R4054 */ + { 0x0000, 0x0000, 0x0000 }, /* R4055 */ + { 0x0000, 0x0000, 0x0000 }, /* R4056 */ + { 0x0000, 0x0000, 0x0000 }, /* R4057 */ + { 0x0000, 0x0000, 0x0000 }, /* R4058 */ + { 0x0000, 0x0000, 0x0000 }, /* R4059 */ + { 0x0000, 0x0000, 0x0000 }, /* R4060 */ + { 0x0000, 0x0000, 0x0000 }, /* R4061 */ + { 0x0000, 0x0000, 0x0000 }, /* R4062 */ + { 0x0000, 0x0000, 0x0000 }, /* R4063 */ + { 0x0000, 0x0000, 0x0000 }, /* R4064 */ + { 0x0000, 0x0000, 0x0000 }, /* R4065 */ + { 0x0000, 0x0000, 0x0000 }, /* R4066 */ + { 0x0000, 0x0000, 0x0000 }, /* R4067 */ + { 0x0000, 0x0000, 0x0000 }, /* R4068 */ + { 0x0000, 0x0000, 0x0000 }, /* R4069 */ + { 0x0000, 0x0000, 0x0000 }, /* R4070 */ + { 0x0000, 0x0000, 0x0000 }, /* R4071 */ + { 0x0000, 0x0000, 0x0000 }, /* R4072 */ + { 0x0000, 0x0000, 0x0000 }, /* R4073 */ + { 0x0000, 0x0000, 0x0000 }, /* R4074 */ + { 0x0000, 0x0000, 0x0000 }, /* R4075 */ + { 0x0000, 0x0000, 0x0000 }, /* R4076 */ + { 0x0000, 0x0000, 0x0000 }, /* R4077 */ + { 0x0000, 0x0000, 0x0000 }, /* R4078 */ + { 0x0000, 0x0000, 0x0000 }, /* R4079 */ + { 0x0000, 0x0000, 0x0000 }, /* R4080 */ + { 0x0000, 0x0000, 0x0000 }, /* R4081 */ + { 0x0000, 0x0000, 0x0000 }, /* R4082 */ + { 0x0000, 0x0000, 0x0000 }, /* R4083 */ + { 0x0000, 0x0000, 0x0000 }, /* R4084 */ + { 0x0000, 0x0000, 0x0000 }, /* R4085 */ + { 0x0000, 0x0000, 0x0000 }, /* R4086 */ + { 0x0000, 0x0000, 0x0000 }, /* R4087 */ + { 0x0000, 0x0000, 0x0000 }, /* R4088 */ + { 0x0000, 0x0000, 0x0000 }, /* R4089 */ + { 0x0000, 0x0000, 0x0000 }, /* R4090 */ + { 0x0000, 0x0000, 0x0000 }, /* R4091 */ + { 0x0000, 0x0000, 0x0000 }, /* R4092 */ + { 0x0000, 0x0000, 0x0000 }, /* R4093 */ + { 0x0000, 0x0000, 0x0000 }, /* R4094 */ + { 0x0000, 0x0000, 0x0000 }, /* R4095 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4096 - Write Sequencer 0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4097 - Write Sequencer 1 */ + { 0x070F, 0x070F, 0x0000 }, /* R4098 - Write Sequencer 2 */ + { 0x010F, 0x010F, 0x0000 }, /* R4099 - Write Sequencer 3 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4100 - Write Sequencer 4 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4101 - Write Sequencer 5 */ + { 0x070F, 0x070F, 0x0000 }, /* R4102 - Write Sequencer 6 */ + { 0x010F, 0x010F, 0x0000 }, /* R4103 - Write Sequencer 7 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4104 - Write Sequencer 8 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4105 - Write Sequencer 9 */ + { 0x070F, 0x070F, 0x0000 }, /* R4106 - Write Sequencer 10 */ + { 0x010F, 0x010F, 0x0000 }, /* R4107 - Write Sequencer 11 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4108 - Write Sequencer 12 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4109 - Write Sequencer 13 */ + { 0x070F, 0x070F, 0x0000 }, /* R4110 - Write Sequencer 14 */ + { 0x010F, 0x010F, 0x0000 }, /* R4111 - Write Sequencer 15 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4112 - Write Sequencer 16 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4113 - Write Sequencer 17 */ + { 0x070F, 0x070F, 0x0000 }, /* R4114 - Write Sequencer 18 */ + { 0x010F, 0x010F, 0x0000 }, /* R4115 - Write Sequencer 19 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4116 - Write Sequencer 20 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4117 - Write Sequencer 21 */ + { 0x070F, 0x070F, 0x0000 }, /* R4118 - Write Sequencer 22 */ + { 0x010F, 0x010F, 0x0000 }, /* R4119 - Write Sequencer 23 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4120 - Write Sequencer 24 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4121 - Write Sequencer 25 */ + { 0x070F, 0x070F, 0x0000 }, /* R4122 - Write Sequencer 26 */ + { 0x010F, 0x010F, 0x0000 }, /* R4123 - Write Sequencer 27 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4124 - Write Sequencer 28 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4125 - Write Sequencer 29 */ + { 0x070F, 0x070F, 0x0000 }, /* R4126 - Write Sequencer 30 */ + { 0x010F, 0x010F, 0x0000 }, /* R4127 - Write Sequencer 31 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4128 - Write Sequencer 32 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4129 - Write Sequencer 33 */ + { 0x070F, 0x070F, 0x0000 }, /* R4130 - Write Sequencer 34 */ + { 0x010F, 0x010F, 0x0000 }, /* R4131 - Write Sequencer 35 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4132 - Write Sequencer 36 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4133 - Write Sequencer 37 */ + { 0x070F, 0x070F, 0x0000 }, /* R4134 - Write Sequencer 38 */ + { 0x010F, 0x010F, 0x0000 }, /* R4135 - Write Sequencer 39 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4136 - Write Sequencer 40 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4137 - Write Sequencer 41 */ + { 0x070F, 0x070F, 0x0000 }, /* R4138 - Write Sequencer 42 */ + { 0x010F, 0x010F, 0x0000 }, /* R4139 - Write Sequencer 43 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4140 - Write Sequencer 44 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4141 - Write Sequencer 45 */ + { 0x070F, 0x070F, 0x0000 }, /* R4142 - Write Sequencer 46 */ + { 0x010F, 0x010F, 0x0000 }, /* R4143 - Write Sequencer 47 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4144 - Write Sequencer 48 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4145 - Write Sequencer 49 */ + { 0x070F, 0x070F, 0x0000 }, /* R4146 - Write Sequencer 50 */ + { 0x010F, 0x010F, 0x0000 }, /* R4147 - Write Sequencer 51 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4148 - Write Sequencer 52 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4149 - Write Sequencer 53 */ + { 0x070F, 0x070F, 0x0000 }, /* R4150 - Write Sequencer 54 */ + { 0x010F, 0x010F, 0x0000 }, /* R4151 - Write Sequencer 55 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4152 - Write Sequencer 56 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4153 - Write Sequencer 57 */ + { 0x070F, 0x070F, 0x0000 }, /* R4154 - Write Sequencer 58 */ + { 0x010F, 0x010F, 0x0000 }, /* R4155 - Write Sequencer 59 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4156 - Write Sequencer 60 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4157 - Write Sequencer 61 */ + { 0x070F, 0x070F, 0x0000 }, /* R4158 - Write Sequencer 62 */ + { 0x010F, 0x010F, 0x0000 }, /* R4159 - Write Sequencer 63 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4160 - Write Sequencer 64 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4161 - Write Sequencer 65 */ + { 0x070F, 0x070F, 0x0000 }, /* R4162 - Write Sequencer 66 */ + { 0x010F, 0x010F, 0x0000 }, /* R4163 - Write Sequencer 67 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4164 - Write Sequencer 68 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4165 - Write Sequencer 69 */ + { 0x070F, 0x070F, 0x0000 }, /* R4166 - Write Sequencer 70 */ + { 0x010F, 0x010F, 0x0000 }, /* R4167 - Write Sequencer 71 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4168 - Write Sequencer 72 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4169 - Write Sequencer 73 */ + { 0x070F, 0x070F, 0x0000 }, /* R4170 - Write Sequencer 74 */ + { 0x010F, 0x010F, 0x0000 }, /* R4171 - Write Sequencer 75 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4172 - Write Sequencer 76 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4173 - Write Sequencer 77 */ + { 0x070F, 0x070F, 0x0000 }, /* R4174 - Write Sequencer 78 */ + { 0x010F, 0x010F, 0x0000 }, /* R4175 - Write Sequencer 79 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4176 - Write Sequencer 80 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4177 - Write Sequencer 81 */ + { 0x070F, 0x070F, 0x0000 }, /* R4178 - Write Sequencer 82 */ + { 0x010F, 0x010F, 0x0000 }, /* R4179 - Write Sequencer 83 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4180 - Write Sequencer 84 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4181 - Write Sequencer 85 */ + { 0x070F, 0x070F, 0x0000 }, /* R4182 - Write Sequencer 86 */ + { 0x010F, 0x010F, 0x0000 }, /* R4183 - Write Sequencer 87 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4184 - Write Sequencer 88 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4185 - Write Sequencer 89 */ + { 0x070F, 0x070F, 0x0000 }, /* R4186 - Write Sequencer 90 */ + { 0x010F, 0x010F, 0x0000 }, /* R4187 - Write Sequencer 91 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4188 - Write Sequencer 92 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4189 - Write Sequencer 93 */ + { 0x070F, 0x070F, 0x0000 }, /* R4190 - Write Sequencer 94 */ + { 0x010F, 0x010F, 0x0000 }, /* R4191 - Write Sequencer 95 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4192 - Write Sequencer 96 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4193 - Write Sequencer 97 */ + { 0x070F, 0x070F, 0x0000 }, /* R4194 - Write Sequencer 98 */ + { 0x010F, 0x010F, 0x0000 }, /* R4195 - Write Sequencer 99 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4196 - Write Sequencer 100 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4197 - Write Sequencer 101 */ + { 0x070F, 0x070F, 0x0000 }, /* R4198 - Write Sequencer 102 */ + { 0x010F, 0x010F, 0x0000 }, /* R4199 - Write Sequencer 103 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4200 - Write Sequencer 104 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4201 - Write Sequencer 105 */ + { 0x070F, 0x070F, 0x0000 }, /* R4202 - Write Sequencer 106 */ + { 0x010F, 0x010F, 0x0000 }, /* R4203 - Write Sequencer 107 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4204 - Write Sequencer 108 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4205 - Write Sequencer 109 */ + { 0x070F, 0x070F, 0x0000 }, /* R4206 - Write Sequencer 110 */ + { 0x010F, 0x010F, 0x0000 }, /* R4207 - Write Sequencer 111 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4208 - Write Sequencer 112 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4209 - Write Sequencer 113 */ + { 0x070F, 0x070F, 0x0000 }, /* R4210 - Write Sequencer 114 */ + { 0x010F, 0x010F, 0x0000 }, /* R4211 - Write Sequencer 115 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4212 - Write Sequencer 116 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4213 - Write Sequencer 117 */ + { 0x070F, 0x070F, 0x0000 }, /* R4214 - Write Sequencer 118 */ + { 0x010F, 0x010F, 0x0000 }, /* R4215 - Write Sequencer 119 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4216 - Write Sequencer 120 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4217 - Write Sequencer 121 */ + { 0x070F, 0x070F, 0x0000 }, /* R4218 - Write Sequencer 122 */ + { 0x010F, 0x010F, 0x0000 }, /* R4219 - Write Sequencer 123 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4220 - Write Sequencer 124 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4221 - Write Sequencer 125 */ + { 0x070F, 0x070F, 0x0000 }, /* R4222 - Write Sequencer 126 */ + { 0x010F, 0x010F, 0x0000 }, /* R4223 - Write Sequencer 127 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4224 - Write Sequencer 128 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4225 - Write Sequencer 129 */ + { 0x070F, 0x070F, 0x0000 }, /* R4226 - Write Sequencer 130 */ + { 0x010F, 0x010F, 0x0000 }, /* R4227 - Write Sequencer 131 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4228 - Write Sequencer 132 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4229 - Write Sequencer 133 */ + { 0x070F, 0x070F, 0x0000 }, /* R4230 - Write Sequencer 134 */ + { 0x010F, 0x010F, 0x0000 }, /* R4231 - Write Sequencer 135 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4232 - Write Sequencer 136 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4233 - Write Sequencer 137 */ + { 0x070F, 0x070F, 0x0000 }, /* R4234 - Write Sequencer 138 */ + { 0x010F, 0x010F, 0x0000 }, /* R4235 - Write Sequencer 139 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4236 - Write Sequencer 140 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4237 - Write Sequencer 141 */ + { 0x070F, 0x070F, 0x0000 }, /* R4238 - Write Sequencer 142 */ + { 0x010F, 0x010F, 0x0000 }, /* R4239 - Write Sequencer 143 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4240 - Write Sequencer 144 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4241 - Write Sequencer 145 */ + { 0x070F, 0x070F, 0x0000 }, /* R4242 - Write Sequencer 146 */ + { 0x010F, 0x010F, 0x0000 }, /* R4243 - Write Sequencer 147 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4244 - Write Sequencer 148 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4245 - Write Sequencer 149 */ + { 0x070F, 0x070F, 0x0000 }, /* R4246 - Write Sequencer 150 */ + { 0x010F, 0x010F, 0x0000 }, /* R4247 - Write Sequencer 151 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4248 - Write Sequencer 152 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4249 - Write Sequencer 153 */ + { 0x070F, 0x070F, 0x0000 }, /* R4250 - Write Sequencer 154 */ + { 0x010F, 0x010F, 0x0000 }, /* R4251 - Write Sequencer 155 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4252 - Write Sequencer 156 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4253 - Write Sequencer 157 */ + { 0x070F, 0x070F, 0x0000 }, /* R4254 - Write Sequencer 158 */ + { 0x010F, 0x010F, 0x0000 }, /* R4255 - Write Sequencer 159 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4256 - Write Sequencer 160 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4257 - Write Sequencer 161 */ + { 0x070F, 0x070F, 0x0000 }, /* R4258 - Write Sequencer 162 */ + { 0x010F, 0x010F, 0x0000 }, /* R4259 - Write Sequencer 163 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4260 - Write Sequencer 164 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4261 - Write Sequencer 165 */ + { 0x070F, 0x070F, 0x0000 }, /* R4262 - Write Sequencer 166 */ + { 0x010F, 0x010F, 0x0000 }, /* R4263 - Write Sequencer 167 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4264 - Write Sequencer 168 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4265 - Write Sequencer 169 */ + { 0x070F, 0x070F, 0x0000 }, /* R4266 - Write Sequencer 170 */ + { 0x010F, 0x010F, 0x0000 }, /* R4267 - Write Sequencer 171 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4268 - Write Sequencer 172 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4269 - Write Sequencer 173 */ + { 0x070F, 0x070F, 0x0000 }, /* R4270 - Write Sequencer 174 */ + { 0x010F, 0x010F, 0x0000 }, /* R4271 - Write Sequencer 175 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4272 - Write Sequencer 176 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4273 - Write Sequencer 177 */ + { 0x070F, 0x070F, 0x0000 }, /* R4274 - Write Sequencer 178 */ + { 0x010F, 0x010F, 0x0000 }, /* R4275 - Write Sequencer 179 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4276 - Write Sequencer 180 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4277 - Write Sequencer 181 */ + { 0x070F, 0x070F, 0x0000 }, /* R4278 - Write Sequencer 182 */ + { 0x010F, 0x010F, 0x0000 }, /* R4279 - Write Sequencer 183 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4280 - Write Sequencer 184 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4281 - Write Sequencer 185 */ + { 0x070F, 0x070F, 0x0000 }, /* R4282 - Write Sequencer 186 */ + { 0x010F, 0x010F, 0x0000 }, /* R4283 - Write Sequencer 187 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4284 - Write Sequencer 188 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4285 - Write Sequencer 189 */ + { 0x070F, 0x070F, 0x0000 }, /* R4286 - Write Sequencer 190 */ + { 0x010F, 0x010F, 0x0000 }, /* R4287 - Write Sequencer 191 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4288 - Write Sequencer 192 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4289 - Write Sequencer 193 */ + { 0x070F, 0x070F, 0x0000 }, /* R4290 - Write Sequencer 194 */ + { 0x010F, 0x010F, 0x0000 }, /* R4291 - Write Sequencer 195 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4292 - Write Sequencer 196 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4293 - Write Sequencer 197 */ + { 0x070F, 0x070F, 0x0000 }, /* R4294 - Write Sequencer 198 */ + { 0x010F, 0x010F, 0x0000 }, /* R4295 - Write Sequencer 199 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4296 - Write Sequencer 200 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4297 - Write Sequencer 201 */ + { 0x070F, 0x070F, 0x0000 }, /* R4298 - Write Sequencer 202 */ + { 0x010F, 0x010F, 0x0000 }, /* R4299 - Write Sequencer 203 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4300 - Write Sequencer 204 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4301 - Write Sequencer 205 */ + { 0x070F, 0x070F, 0x0000 }, /* R4302 - Write Sequencer 206 */ + { 0x010F, 0x010F, 0x0000 }, /* R4303 - Write Sequencer 207 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4304 - Write Sequencer 208 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4305 - Write Sequencer 209 */ + { 0x070F, 0x070F, 0x0000 }, /* R4306 - Write Sequencer 210 */ + { 0x010F, 0x010F, 0x0000 }, /* R4307 - Write Sequencer 211 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4308 - Write Sequencer 212 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4309 - Write Sequencer 213 */ + { 0x070F, 0x070F, 0x0000 }, /* R4310 - Write Sequencer 214 */ + { 0x010F, 0x010F, 0x0000 }, /* R4311 - Write Sequencer 215 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4312 - Write Sequencer 216 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4313 - Write Sequencer 217 */ + { 0x070F, 0x070F, 0x0000 }, /* R4314 - Write Sequencer 218 */ + { 0x010F, 0x010F, 0x0000 }, /* R4315 - Write Sequencer 219 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4316 - Write Sequencer 220 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4317 - Write Sequencer 221 */ + { 0x070F, 0x070F, 0x0000 }, /* R4318 - Write Sequencer 222 */ + { 0x010F, 0x010F, 0x0000 }, /* R4319 - Write Sequencer 223 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4320 - Write Sequencer 224 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4321 - Write Sequencer 225 */ + { 0x070F, 0x070F, 0x0000 }, /* R4322 - Write Sequencer 226 */ + { 0x010F, 0x010F, 0x0000 }, /* R4323 - Write Sequencer 227 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4324 - Write Sequencer 228 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4325 - Write Sequencer 229 */ + { 0x070F, 0x070F, 0x0000 }, /* R4326 - Write Sequencer 230 */ + { 0x010F, 0x010F, 0x0000 }, /* R4327 - Write Sequencer 231 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4328 - Write Sequencer 232 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4329 - Write Sequencer 233 */ + { 0x070F, 0x070F, 0x0000 }, /* R4330 - Write Sequencer 234 */ + { 0x010F, 0x010F, 0x0000 }, /* R4331 - Write Sequencer 235 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4332 - Write Sequencer 236 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4333 - Write Sequencer 237 */ + { 0x070F, 0x070F, 0x0000 }, /* R4334 - Write Sequencer 238 */ + { 0x010F, 0x010F, 0x0000 }, /* R4335 - Write Sequencer 239 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4336 - Write Sequencer 240 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4337 - Write Sequencer 241 */ + { 0x070F, 0x070F, 0x0000 }, /* R4338 - Write Sequencer 242 */ + { 0x010F, 0x010F, 0x0000 }, /* R4339 - Write Sequencer 243 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4340 - Write Sequencer 244 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4341 - Write Sequencer 245 */ + { 0x070F, 0x070F, 0x0000 }, /* R4342 - Write Sequencer 246 */ + { 0x010F, 0x010F, 0x0000 }, /* R4343 - Write Sequencer 247 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4344 - Write Sequencer 248 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4345 - Write Sequencer 249 */ + { 0x070F, 0x070F, 0x0000 }, /* R4346 - Write Sequencer 250 */ + { 0x010F, 0x010F, 0x0000 }, /* R4347 - Write Sequencer 251 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4348 - Write Sequencer 252 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4349 - Write Sequencer 253 */ + { 0x070F, 0x070F, 0x0000 }, /* R4350 - Write Sequencer 254 */ + { 0x010F, 0x010F, 0x0000 }, /* R4351 - Write Sequencer 255 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4352 - Write Sequencer 256 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4353 - Write Sequencer 257 */ + { 0x070F, 0x070F, 0x0000 }, /* R4354 - Write Sequencer 258 */ + { 0x010F, 0x010F, 0x0000 }, /* R4355 - Write Sequencer 259 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4356 - Write Sequencer 260 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4357 - Write Sequencer 261 */ + { 0x070F, 0x070F, 0x0000 }, /* R4358 - Write Sequencer 262 */ + { 0x010F, 0x010F, 0x0000 }, /* R4359 - Write Sequencer 263 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4360 - Write Sequencer 264 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4361 - Write Sequencer 265 */ + { 0x070F, 0x070F, 0x0000 }, /* R4362 - Write Sequencer 266 */ + { 0x010F, 0x010F, 0x0000 }, /* R4363 - Write Sequencer 267 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4364 - Write Sequencer 268 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4365 - Write Sequencer 269 */ + { 0x070F, 0x070F, 0x0000 }, /* R4366 - Write Sequencer 270 */ + { 0x010F, 0x010F, 0x0000 }, /* R4367 - Write Sequencer 271 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4368 - Write Sequencer 272 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4369 - Write Sequencer 273 */ + { 0x070F, 0x070F, 0x0000 }, /* R4370 - Write Sequencer 274 */ + { 0x010F, 0x010F, 0x0000 }, /* R4371 - Write Sequencer 275 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4372 - Write Sequencer 276 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4373 - Write Sequencer 277 */ + { 0x070F, 0x070F, 0x0000 }, /* R4374 - Write Sequencer 278 */ + { 0x010F, 0x010F, 0x0000 }, /* R4375 - Write Sequencer 279 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4376 - Write Sequencer 280 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4377 - Write Sequencer 281 */ + { 0x070F, 0x070F, 0x0000 }, /* R4378 - Write Sequencer 282 */ + { 0x010F, 0x010F, 0x0000 }, /* R4379 - Write Sequencer 283 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4380 - Write Sequencer 284 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4381 - Write Sequencer 285 */ + { 0x070F, 0x070F, 0x0000 }, /* R4382 - Write Sequencer 286 */ + { 0x010F, 0x010F, 0x0000 }, /* R4383 - Write Sequencer 287 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4384 - Write Sequencer 288 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4385 - Write Sequencer 289 */ + { 0x070F, 0x070F, 0x0000 }, /* R4386 - Write Sequencer 290 */ + { 0x010F, 0x010F, 0x0000 }, /* R4387 - Write Sequencer 291 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4388 - Write Sequencer 292 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4389 - Write Sequencer 293 */ + { 0x070F, 0x070F, 0x0000 }, /* R4390 - Write Sequencer 294 */ + { 0x010F, 0x010F, 0x0000 }, /* R4391 - Write Sequencer 295 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4392 - Write Sequencer 296 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4393 - Write Sequencer 297 */ + { 0x070F, 0x070F, 0x0000 }, /* R4394 - Write Sequencer 298 */ + { 0x010F, 0x010F, 0x0000 }, /* R4395 - Write Sequencer 299 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4396 - Write Sequencer 300 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4397 - Write Sequencer 301 */ + { 0x070F, 0x070F, 0x0000 }, /* R4398 - Write Sequencer 302 */ + { 0x010F, 0x010F, 0x0000 }, /* R4399 - Write Sequencer 303 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4400 - Write Sequencer 304 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4401 - Write Sequencer 305 */ + { 0x070F, 0x070F, 0x0000 }, /* R4402 - Write Sequencer 306 */ + { 0x010F, 0x010F, 0x0000 }, /* R4403 - Write Sequencer 307 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4404 - Write Sequencer 308 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4405 - Write Sequencer 309 */ + { 0x070F, 0x070F, 0x0000 }, /* R4406 - Write Sequencer 310 */ + { 0x010F, 0x010F, 0x0000 }, /* R4407 - Write Sequencer 311 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4408 - Write Sequencer 312 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4409 - Write Sequencer 313 */ + { 0x070F, 0x070F, 0x0000 }, /* R4410 - Write Sequencer 314 */ + { 0x010F, 0x010F, 0x0000 }, /* R4411 - Write Sequencer 315 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4412 - Write Sequencer 316 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4413 - Write Sequencer 317 */ + { 0x070F, 0x070F, 0x0000 }, /* R4414 - Write Sequencer 318 */ + { 0x010F, 0x010F, 0x0000 }, /* R4415 - Write Sequencer 319 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4416 - Write Sequencer 320 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4417 - Write Sequencer 321 */ + { 0x070F, 0x070F, 0x0000 }, /* R4418 - Write Sequencer 322 */ + { 0x010F, 0x010F, 0x0000 }, /* R4419 - Write Sequencer 323 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4420 - Write Sequencer 324 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4421 - Write Sequencer 325 */ + { 0x070F, 0x070F, 0x0000 }, /* R4422 - Write Sequencer 326 */ + { 0x010F, 0x010F, 0x0000 }, /* R4423 - Write Sequencer 327 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4424 - Write Sequencer 328 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4425 - Write Sequencer 329 */ + { 0x070F, 0x070F, 0x0000 }, /* R4426 - Write Sequencer 330 */ + { 0x010F, 0x010F, 0x0000 }, /* R4427 - Write Sequencer 331 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4428 - Write Sequencer 332 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4429 - Write Sequencer 333 */ + { 0x070F, 0x070F, 0x0000 }, /* R4430 - Write Sequencer 334 */ + { 0x010F, 0x010F, 0x0000 }, /* R4431 - Write Sequencer 335 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4432 - Write Sequencer 336 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4433 - Write Sequencer 337 */ + { 0x070F, 0x070F, 0x0000 }, /* R4434 - Write Sequencer 338 */ + { 0x010F, 0x010F, 0x0000 }, /* R4435 - Write Sequencer 339 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4436 - Write Sequencer 340 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4437 - Write Sequencer 341 */ + { 0x070F, 0x070F, 0x0000 }, /* R4438 - Write Sequencer 342 */ + { 0x010F, 0x010F, 0x0000 }, /* R4439 - Write Sequencer 343 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4440 - Write Sequencer 344 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4441 - Write Sequencer 345 */ + { 0x070F, 0x070F, 0x0000 }, /* R4442 - Write Sequencer 346 */ + { 0x010F, 0x010F, 0x0000 }, /* R4443 - Write Sequencer 347 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4444 - Write Sequencer 348 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4445 - Write Sequencer 349 */ + { 0x070F, 0x070F, 0x0000 }, /* R4446 - Write Sequencer 350 */ + { 0x010F, 0x010F, 0x0000 }, /* R4447 - Write Sequencer 351 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4448 - Write Sequencer 352 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4449 - Write Sequencer 353 */ + { 0x070F, 0x070F, 0x0000 }, /* R4450 - Write Sequencer 354 */ + { 0x010F, 0x010F, 0x0000 }, /* R4451 - Write Sequencer 355 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4452 - Write Sequencer 356 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4453 - Write Sequencer 357 */ + { 0x070F, 0x070F, 0x0000 }, /* R4454 - Write Sequencer 358 */ + { 0x010F, 0x010F, 0x0000 }, /* R4455 - Write Sequencer 359 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4456 - Write Sequencer 360 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4457 - Write Sequencer 361 */ + { 0x070F, 0x070F, 0x0000 }, /* R4458 - Write Sequencer 362 */ + { 0x010F, 0x010F, 0x0000 }, /* R4459 - Write Sequencer 363 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4460 - Write Sequencer 364 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4461 - Write Sequencer 365 */ + { 0x070F, 0x070F, 0x0000 }, /* R4462 - Write Sequencer 366 */ + { 0x010F, 0x010F, 0x0000 }, /* R4463 - Write Sequencer 367 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4464 - Write Sequencer 368 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4465 - Write Sequencer 369 */ + { 0x070F, 0x070F, 0x0000 }, /* R4466 - Write Sequencer 370 */ + { 0x010F, 0x010F, 0x0000 }, /* R4467 - Write Sequencer 371 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4468 - Write Sequencer 372 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4469 - Write Sequencer 373 */ + { 0x070F, 0x070F, 0x0000 }, /* R4470 - Write Sequencer 374 */ + { 0x010F, 0x010F, 0x0000 }, /* R4471 - Write Sequencer 375 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4472 - Write Sequencer 376 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4473 - Write Sequencer 377 */ + { 0x070F, 0x070F, 0x0000 }, /* R4474 - Write Sequencer 378 */ + { 0x010F, 0x010F, 0x0000 }, /* R4475 - Write Sequencer 379 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4476 - Write Sequencer 380 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4477 - Write Sequencer 381 */ + { 0x070F, 0x070F, 0x0000 }, /* R4478 - Write Sequencer 382 */ + { 0x010F, 0x010F, 0x0000 }, /* R4479 - Write Sequencer 383 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4480 - Write Sequencer 384 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4481 - Write Sequencer 385 */ + { 0x070F, 0x070F, 0x0000 }, /* R4482 - Write Sequencer 386 */ + { 0x010F, 0x010F, 0x0000 }, /* R4483 - Write Sequencer 387 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4484 - Write Sequencer 388 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4485 - Write Sequencer 389 */ + { 0x070F, 0x070F, 0x0000 }, /* R4486 - Write Sequencer 390 */ + { 0x010F, 0x010F, 0x0000 }, /* R4487 - Write Sequencer 391 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4488 - Write Sequencer 392 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4489 - Write Sequencer 393 */ + { 0x070F, 0x070F, 0x0000 }, /* R4490 - Write Sequencer 394 */ + { 0x010F, 0x010F, 0x0000 }, /* R4491 - Write Sequencer 395 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4492 - Write Sequencer 396 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4493 - Write Sequencer 397 */ + { 0x070F, 0x070F, 0x0000 }, /* R4494 - Write Sequencer 398 */ + { 0x010F, 0x010F, 0x0000 }, /* R4495 - Write Sequencer 399 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4496 - Write Sequencer 400 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4497 - Write Sequencer 401 */ + { 0x070F, 0x070F, 0x0000 }, /* R4498 - Write Sequencer 402 */ + { 0x010F, 0x010F, 0x0000 }, /* R4499 - Write Sequencer 403 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4500 - Write Sequencer 404 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4501 - Write Sequencer 405 */ + { 0x070F, 0x070F, 0x0000 }, /* R4502 - Write Sequencer 406 */ + { 0x010F, 0x010F, 0x0000 }, /* R4503 - Write Sequencer 407 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4504 - Write Sequencer 408 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4505 - Write Sequencer 409 */ + { 0x070F, 0x070F, 0x0000 }, /* R4506 - Write Sequencer 410 */ + { 0x010F, 0x010F, 0x0000 }, /* R4507 - Write Sequencer 411 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4508 - Write Sequencer 412 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4509 - Write Sequencer 413 */ + { 0x070F, 0x070F, 0x0000 }, /* R4510 - Write Sequencer 414 */ + { 0x010F, 0x010F, 0x0000 }, /* R4511 - Write Sequencer 415 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4512 - Write Sequencer 416 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4513 - Write Sequencer 417 */ + { 0x070F, 0x070F, 0x0000 }, /* R4514 - Write Sequencer 418 */ + { 0x010F, 0x010F, 0x0000 }, /* R4515 - Write Sequencer 419 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4516 - Write Sequencer 420 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4517 - Write Sequencer 421 */ + { 0x070F, 0x070F, 0x0000 }, /* R4518 - Write Sequencer 422 */ + { 0x010F, 0x010F, 0x0000 }, /* R4519 - Write Sequencer 423 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4520 - Write Sequencer 424 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4521 - Write Sequencer 425 */ + { 0x070F, 0x070F, 0x0000 }, /* R4522 - Write Sequencer 426 */ + { 0x010F, 0x010F, 0x0000 }, /* R4523 - Write Sequencer 427 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4524 - Write Sequencer 428 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4525 - Write Sequencer 429 */ + { 0x070F, 0x070F, 0x0000 }, /* R4526 - Write Sequencer 430 */ + { 0x010F, 0x010F, 0x0000 }, /* R4527 - Write Sequencer 431 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4528 - Write Sequencer 432 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4529 - Write Sequencer 433 */ + { 0x070F, 0x070F, 0x0000 }, /* R4530 - Write Sequencer 434 */ + { 0x010F, 0x010F, 0x0000 }, /* R4531 - Write Sequencer 435 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4532 - Write Sequencer 436 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4533 - Write Sequencer 437 */ + { 0x070F, 0x070F, 0x0000 }, /* R4534 - Write Sequencer 438 */ + { 0x010F, 0x010F, 0x0000 }, /* R4535 - Write Sequencer 439 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4536 - Write Sequencer 440 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4537 - Write Sequencer 441 */ + { 0x070F, 0x070F, 0x0000 }, /* R4538 - Write Sequencer 442 */ + { 0x010F, 0x010F, 0x0000 }, /* R4539 - Write Sequencer 443 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4540 - Write Sequencer 444 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4541 - Write Sequencer 445 */ + { 0x070F, 0x070F, 0x0000 }, /* R4542 - Write Sequencer 446 */ + { 0x010F, 0x010F, 0x0000 }, /* R4543 - Write Sequencer 447 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4544 - Write Sequencer 448 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4545 - Write Sequencer 449 */ + { 0x070F, 0x070F, 0x0000 }, /* R4546 - Write Sequencer 450 */ + { 0x010F, 0x010F, 0x0000 }, /* R4547 - Write Sequencer 451 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4548 - Write Sequencer 452 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4549 - Write Sequencer 453 */ + { 0x070F, 0x070F, 0x0000 }, /* R4550 - Write Sequencer 454 */ + { 0x010F, 0x010F, 0x0000 }, /* R4551 - Write Sequencer 455 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4552 - Write Sequencer 456 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4553 - Write Sequencer 457 */ + { 0x070F, 0x070F, 0x0000 }, /* R4554 - Write Sequencer 458 */ + { 0x010F, 0x010F, 0x0000 }, /* R4555 - Write Sequencer 459 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4556 - Write Sequencer 460 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4557 - Write Sequencer 461 */ + { 0x070F, 0x070F, 0x0000 }, /* R4558 - Write Sequencer 462 */ + { 0x010F, 0x010F, 0x0000 }, /* R4559 - Write Sequencer 463 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4560 - Write Sequencer 464 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4561 - Write Sequencer 465 */ + { 0x070F, 0x070F, 0x0000 }, /* R4562 - Write Sequencer 466 */ + { 0x010F, 0x010F, 0x0000 }, /* R4563 - Write Sequencer 467 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4564 - Write Sequencer 468 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4565 - Write Sequencer 469 */ + { 0x070F, 0x070F, 0x0000 }, /* R4566 - Write Sequencer 470 */ + { 0x010F, 0x010F, 0x0000 }, /* R4567 - Write Sequencer 471 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4568 - Write Sequencer 472 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4569 - Write Sequencer 473 */ + { 0x070F, 0x070F, 0x0000 }, /* R4570 - Write Sequencer 474 */ + { 0x010F, 0x010F, 0x0000 }, /* R4571 - Write Sequencer 475 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4572 - Write Sequencer 476 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4573 - Write Sequencer 477 */ + { 0x070F, 0x070F, 0x0000 }, /* R4574 - Write Sequencer 478 */ + { 0x010F, 0x010F, 0x0000 }, /* R4575 - Write Sequencer 479 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4576 - Write Sequencer 480 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4577 - Write Sequencer 481 */ + { 0x070F, 0x070F, 0x0000 }, /* R4578 - Write Sequencer 482 */ + { 0x010F, 0x010F, 0x0000 }, /* R4579 - Write Sequencer 483 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4580 - Write Sequencer 484 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4581 - Write Sequencer 485 */ + { 0x070F, 0x070F, 0x0000 }, /* R4582 - Write Sequencer 486 */ + { 0x010F, 0x010F, 0x0000 }, /* R4583 - Write Sequencer 487 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4584 - Write Sequencer 488 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4585 - Write Sequencer 489 */ + { 0x070F, 0x070F, 0x0000 }, /* R4586 - Write Sequencer 490 */ + { 0x010F, 0x010F, 0x0000 }, /* R4587 - Write Sequencer 491 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4588 - Write Sequencer 492 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4589 - Write Sequencer 493 */ + { 0x070F, 0x070F, 0x0000 }, /* R4590 - Write Sequencer 494 */ + { 0x010F, 0x010F, 0x0000 }, /* R4591 - Write Sequencer 495 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4592 - Write Sequencer 496 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4593 - Write Sequencer 497 */ + { 0x070F, 0x070F, 0x0000 }, /* R4594 - Write Sequencer 498 */ + { 0x010F, 0x010F, 0x0000 }, /* R4595 - Write Sequencer 499 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4596 - Write Sequencer 500 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4597 - Write Sequencer 501 */ + { 0x070F, 0x070F, 0x0000 }, /* R4598 - Write Sequencer 502 */ + { 0x010F, 0x010F, 0x0000 }, /* R4599 - Write Sequencer 503 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4600 - Write Sequencer 504 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4601 - Write Sequencer 505 */ + { 0x070F, 0x070F, 0x0000 }, /* R4602 - Write Sequencer 506 */ + { 0x010F, 0x010F, 0x0000 }, /* R4603 - Write Sequencer 507 */ + { 0x3FFF, 0x3FFF, 0x0000 }, /* R4604 - Write Sequencer 508 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R4605 - Write Sequencer 509 */ + { 0x070F, 0x070F, 0x0000 }, /* R4606 - Write Sequencer 510 */ + { 0x010F, 0x010F, 0x0000 }, /* R4607 - Write Sequencer 511 */ + { 0x0000, 0x0000, 0x0000 }, /* R4608 */ + { 0x0000, 0x0000, 0x0000 }, /* R4609 */ + { 0x0000, 0x0000, 0x0000 }, /* R4610 */ + { 0x0000, 0x0000, 0x0000 }, /* R4611 */ + { 0x0000, 0x0000, 0x0000 }, /* R4612 */ + { 0x0000, 0x0000, 0x0000 }, /* R4613 */ + { 0x0000, 0x0000, 0x0000 }, /* R4614 */ + { 0x0000, 0x0000, 0x0000 }, /* R4615 */ + { 0x0000, 0x0000, 0x0000 }, /* R4616 */ + { 0x0000, 0x0000, 0x0000 }, /* R4617 */ + { 0x0000, 0x0000, 0x0000 }, /* R4618 */ + { 0x0000, 0x0000, 0x0000 }, /* R4619 */ + { 0x0000, 0x0000, 0x0000 }, /* R4620 */ + { 0x0000, 0x0000, 0x0000 }, /* R4621 */ + { 0x0000, 0x0000, 0x0000 }, /* R4622 */ + { 0x0000, 0x0000, 0x0000 }, /* R4623 */ + { 0x0000, 0x0000, 0x0000 }, /* R4624 */ + { 0x0000, 0x0000, 0x0000 }, /* R4625 */ + { 0x0000, 0x0000, 0x0000 }, /* R4626 */ + { 0x0000, 0x0000, 0x0000 }, /* R4627 */ + { 0x0000, 0x0000, 0x0000 }, /* R4628 */ + { 0x0000, 0x0000, 0x0000 }, /* R4629 */ + { 0x0000, 0x0000, 0x0000 }, /* R4630 */ + { 0x0000, 0x0000, 0x0000 }, /* R4631 */ + { 0x0000, 0x0000, 0x0000 }, /* R4632 */ + { 0x0000, 0x0000, 0x0000 }, /* R4633 */ + { 0x0000, 0x0000, 0x0000 }, /* R4634 */ + { 0x0000, 0x0000, 0x0000 }, /* R4635 */ + { 0x0000, 0x0000, 0x0000 }, /* R4636 */ + { 0x0000, 0x0000, 0x0000 }, /* R4637 */ + { 0x0000, 0x0000, 0x0000 }, /* R4638 */ + { 0x0000, 0x0000, 0x0000 }, /* R4639 */ + { 0x0000, 0x0000, 0x0000 }, /* R4640 */ + { 0x0000, 0x0000, 0x0000 }, /* R4641 */ + { 0x0000, 0x0000, 0x0000 }, /* R4642 */ + { 0x0000, 0x0000, 0x0000 }, /* R4643 */ + { 0x0000, 0x0000, 0x0000 }, /* R4644 */ + { 0x0000, 0x0000, 0x0000 }, /* R4645 */ + { 0x0000, 0x0000, 0x0000 }, /* R4646 */ + { 0x0000, 0x0000, 0x0000 }, /* R4647 */ + { 0x0000, 0x0000, 0x0000 }, /* R4648 */ + { 0x0000, 0x0000, 0x0000 }, /* R4649 */ + { 0x0000, 0x0000, 0x0000 }, /* R4650 */ + { 0x0000, 0x0000, 0x0000 }, /* R4651 */ + { 0x0000, 0x0000, 0x0000 }, /* R4652 */ + { 0x0000, 0x0000, 0x0000 }, /* R4653 */ + { 0x0000, 0x0000, 0x0000 }, /* R4654 */ + { 0x0000, 0x0000, 0x0000 }, /* R4655 */ + { 0x0000, 0x0000, 0x0000 }, /* R4656 */ + { 0x0000, 0x0000, 0x0000 }, /* R4657 */ + { 0x0000, 0x0000, 0x0000 }, /* R4658 */ + { 0x0000, 0x0000, 0x0000 }, /* R4659 */ + { 0x0000, 0x0000, 0x0000 }, /* R4660 */ + { 0x0000, 0x0000, 0x0000 }, /* R4661 */ + { 0x0000, 0x0000, 0x0000 }, /* R4662 */ + { 0x0000, 0x0000, 0x0000 }, /* R4663 */ + { 0x0000, 0x0000, 0x0000 }, /* R4664 */ + { 0x0000, 0x0000, 0x0000 }, /* R4665 */ + { 0x0000, 0x0000, 0x0000 }, /* R4666 */ + { 0x0000, 0x0000, 0x0000 }, /* R4667 */ + { 0x0000, 0x0000, 0x0000 }, /* R4668 */ + { 0x0000, 0x0000, 0x0000 }, /* R4669 */ + { 0x0000, 0x0000, 0x0000 }, /* R4670 */ + { 0x0000, 0x0000, 0x0000 }, /* R4671 */ + { 0x0000, 0x0000, 0x0000 }, /* R4672 */ + { 0x0000, 0x0000, 0x0000 }, /* R4673 */ + { 0x0000, 0x0000, 0x0000 }, /* R4674 */ + { 0x0000, 0x0000, 0x0000 }, /* R4675 */ + { 0x0000, 0x0000, 0x0000 }, /* R4676 */ + { 0x0000, 0x0000, 0x0000 }, /* R4677 */ + { 0x0000, 0x0000, 0x0000 }, /* R4678 */ + { 0x0000, 0x0000, 0x0000 }, /* R4679 */ + { 0x0000, 0x0000, 0x0000 }, /* R4680 */ + { 0x0000, 0x0000, 0x0000 }, /* R4681 */ + { 0x0000, 0x0000, 0x0000 }, /* R4682 */ + { 0x0000, 0x0000, 0x0000 }, /* R4683 */ + { 0x0000, 0x0000, 0x0000 }, /* R4684 */ + { 0x0000, 0x0000, 0x0000 }, /* R4685 */ + { 0x0000, 0x0000, 0x0000 }, /* R4686 */ + { 0x0000, 0x0000, 0x0000 }, /* R4687 */ + { 0x0000, 0x0000, 0x0000 }, /* R4688 */ + { 0x0000, 0x0000, 0x0000 }, /* R4689 */ + { 0x0000, 0x0000, 0x0000 }, /* R4690 */ + { 0x0000, 0x0000, 0x0000 }, /* R4691 */ + { 0x0000, 0x0000, 0x0000 }, /* R4692 */ + { 0x0000, 0x0000, 0x0000 }, /* R4693 */ + { 0x0000, 0x0000, 0x0000 }, /* R4694 */ + { 0x0000, 0x0000, 0x0000 }, /* R4695 */ + { 0x0000, 0x0000, 0x0000 }, /* R4696 */ + { 0x0000, 0x0000, 0x0000 }, /* R4697 */ + { 0x0000, 0x0000, 0x0000 }, /* R4698 */ + { 0x0000, 0x0000, 0x0000 }, /* R4699 */ + { 0x0000, 0x0000, 0x0000 }, /* R4700 */ + { 0x0000, 0x0000, 0x0000 }, /* R4701 */ + { 0x0000, 0x0000, 0x0000 }, /* R4702 */ + { 0x0000, 0x0000, 0x0000 }, /* R4703 */ + { 0x0000, 0x0000, 0x0000 }, /* R4704 */ + { 0x0000, 0x0000, 0x0000 }, /* R4705 */ + { 0x0000, 0x0000, 0x0000 }, /* R4706 */ + { 0x0000, 0x0000, 0x0000 }, /* R4707 */ + { 0x0000, 0x0000, 0x0000 }, /* R4708 */ + { 0x0000, 0x0000, 0x0000 }, /* R4709 */ + { 0x0000, 0x0000, 0x0000 }, /* R4710 */ + { 0x0000, 0x0000, 0x0000 }, /* R4711 */ + { 0x0000, 0x0000, 0x0000 }, /* R4712 */ + { 0x0000, 0x0000, 0x0000 }, /* R4713 */ + { 0x0000, 0x0000, 0x0000 }, /* R4714 */ + { 0x0000, 0x0000, 0x0000 }, /* R4715 */ + { 0x0000, 0x0000, 0x0000 }, /* R4716 */ + { 0x0000, 0x0000, 0x0000 }, /* R4717 */ + { 0x0000, 0x0000, 0x0000 }, /* R4718 */ + { 0x0000, 0x0000, 0x0000 }, /* R4719 */ + { 0x0000, 0x0000, 0x0000 }, /* R4720 */ + { 0x0000, 0x0000, 0x0000 }, /* R4721 */ + { 0x0000, 0x0000, 0x0000 }, /* R4722 */ + { 0x0000, 0x0000, 0x0000 }, /* R4723 */ + { 0x0000, 0x0000, 0x0000 }, /* R4724 */ + { 0x0000, 0x0000, 0x0000 }, /* R4725 */ + { 0x0000, 0x0000, 0x0000 }, /* R4726 */ + { 0x0000, 0x0000, 0x0000 }, /* R4727 */ + { 0x0000, 0x0000, 0x0000 }, /* R4728 */ + { 0x0000, 0x0000, 0x0000 }, /* R4729 */ + { 0x0000, 0x0000, 0x0000 }, /* R4730 */ + { 0x0000, 0x0000, 0x0000 }, /* R4731 */ + { 0x0000, 0x0000, 0x0000 }, /* R4732 */ + { 0x0000, 0x0000, 0x0000 }, /* R4733 */ + { 0x0000, 0x0000, 0x0000 }, /* R4734 */ + { 0x0000, 0x0000, 0x0000 }, /* R4735 */ + { 0x0000, 0x0000, 0x0000 }, /* R4736 */ + { 0x0000, 0x0000, 0x0000 }, /* R4737 */ + { 0x0000, 0x0000, 0x0000 }, /* R4738 */ + { 0x0000, 0x0000, 0x0000 }, /* R4739 */ + { 0x0000, 0x0000, 0x0000 }, /* R4740 */ + { 0x0000, 0x0000, 0x0000 }, /* R4741 */ + { 0x0000, 0x0000, 0x0000 }, /* R4742 */ + { 0x0000, 0x0000, 0x0000 }, /* R4743 */ + { 0x0000, 0x0000, 0x0000 }, /* R4744 */ + { 0x0000, 0x0000, 0x0000 }, /* R4745 */ + { 0x0000, 0x0000, 0x0000 }, /* R4746 */ + { 0x0000, 0x0000, 0x0000 }, /* R4747 */ + { 0x0000, 0x0000, 0x0000 }, /* R4748 */ + { 0x0000, 0x0000, 0x0000 }, /* R4749 */ + { 0x0000, 0x0000, 0x0000 }, /* R4750 */ + { 0x0000, 0x0000, 0x0000 }, /* R4751 */ + { 0x0000, 0x0000, 0x0000 }, /* R4752 */ + { 0x0000, 0x0000, 0x0000 }, /* R4753 */ + { 0x0000, 0x0000, 0x0000 }, /* R4754 */ + { 0x0000, 0x0000, 0x0000 }, /* R4755 */ + { 0x0000, 0x0000, 0x0000 }, /* R4756 */ + { 0x0000, 0x0000, 0x0000 }, /* R4757 */ + { 0x0000, 0x0000, 0x0000 }, /* R4758 */ + { 0x0000, 0x0000, 0x0000 }, /* R4759 */ + { 0x0000, 0x0000, 0x0000 }, /* R4760 */ + { 0x0000, 0x0000, 0x0000 }, /* R4761 */ + { 0x0000, 0x0000, 0x0000 }, /* R4762 */ + { 0x0000, 0x0000, 0x0000 }, /* R4763 */ + { 0x0000, 0x0000, 0x0000 }, /* R4764 */ + { 0x0000, 0x0000, 0x0000 }, /* R4765 */ + { 0x0000, 0x0000, 0x0000 }, /* R4766 */ + { 0x0000, 0x0000, 0x0000 }, /* R4767 */ + { 0x0000, 0x0000, 0x0000 }, /* R4768 */ + { 0x0000, 0x0000, 0x0000 }, /* R4769 */ + { 0x0000, 0x0000, 0x0000 }, /* R4770 */ + { 0x0000, 0x0000, 0x0000 }, /* R4771 */ + { 0x0000, 0x0000, 0x0000 }, /* R4772 */ + { 0x0000, 0x0000, 0x0000 }, /* R4773 */ + { 0x0000, 0x0000, 0x0000 }, /* R4774 */ + { 0x0000, 0x0000, 0x0000 }, /* R4775 */ + { 0x0000, 0x0000, 0x0000 }, /* R4776 */ + { 0x0000, 0x0000, 0x0000 }, /* R4777 */ + { 0x0000, 0x0000, 0x0000 }, /* R4778 */ + { 0x0000, 0x0000, 0x0000 }, /* R4779 */ + { 0x0000, 0x0000, 0x0000 }, /* R4780 */ + { 0x0000, 0x0000, 0x0000 }, /* R4781 */ + { 0x0000, 0x0000, 0x0000 }, /* R4782 */ + { 0x0000, 0x0000, 0x0000 }, /* R4783 */ + { 0x0000, 0x0000, 0x0000 }, /* R4784 */ + { 0x0000, 0x0000, 0x0000 }, /* R4785 */ + { 0x0000, 0x0000, 0x0000 }, /* R4786 */ + { 0x0000, 0x0000, 0x0000 }, /* R4787 */ + { 0x0000, 0x0000, 0x0000 }, /* R4788 */ + { 0x0000, 0x0000, 0x0000 }, /* R4789 */ + { 0x0000, 0x0000, 0x0000 }, /* R4790 */ + { 0x0000, 0x0000, 0x0000 }, /* R4791 */ + { 0x0000, 0x0000, 0x0000 }, /* R4792 */ + { 0x0000, 0x0000, 0x0000 }, /* R4793 */ + { 0x0000, 0x0000, 0x0000 }, /* R4794 */ + { 0x0000, 0x0000, 0x0000 }, /* R4795 */ + { 0x0000, 0x0000, 0x0000 }, /* R4796 */ + { 0x0000, 0x0000, 0x0000 }, /* R4797 */ + { 0x0000, 0x0000, 0x0000 }, /* R4798 */ + { 0x0000, 0x0000, 0x0000 }, /* R4799 */ + { 0x0000, 0x0000, 0x0000 }, /* R4800 */ + { 0x0000, 0x0000, 0x0000 }, /* R4801 */ + { 0x0000, 0x0000, 0x0000 }, /* R4802 */ + { 0x0000, 0x0000, 0x0000 }, /* R4803 */ + { 0x0000, 0x0000, 0x0000 }, /* R4804 */ + { 0x0000, 0x0000, 0x0000 }, /* R4805 */ + { 0x0000, 0x0000, 0x0000 }, /* R4806 */ + { 0x0000, 0x0000, 0x0000 }, /* R4807 */ + { 0x0000, 0x0000, 0x0000 }, /* R4808 */ + { 0x0000, 0x0000, 0x0000 }, /* R4809 */ + { 0x0000, 0x0000, 0x0000 }, /* R4810 */ + { 0x0000, 0x0000, 0x0000 }, /* R4811 */ + { 0x0000, 0x0000, 0x0000 }, /* R4812 */ + { 0x0000, 0x0000, 0x0000 }, /* R4813 */ + { 0x0000, 0x0000, 0x0000 }, /* R4814 */ + { 0x0000, 0x0000, 0x0000 }, /* R4815 */ + { 0x0000, 0x0000, 0x0000 }, /* R4816 */ + { 0x0000, 0x0000, 0x0000 }, /* R4817 */ + { 0x0000, 0x0000, 0x0000 }, /* R4818 */ + { 0x0000, 0x0000, 0x0000 }, /* R4819 */ + { 0x0000, 0x0000, 0x0000 }, /* R4820 */ + { 0x0000, 0x0000, 0x0000 }, /* R4821 */ + { 0x0000, 0x0000, 0x0000 }, /* R4822 */ + { 0x0000, 0x0000, 0x0000 }, /* R4823 */ + { 0x0000, 0x0000, 0x0000 }, /* R4824 */ + { 0x0000, 0x0000, 0x0000 }, /* R4825 */ + { 0x0000, 0x0000, 0x0000 }, /* R4826 */ + { 0x0000, 0x0000, 0x0000 }, /* R4827 */ + { 0x0000, 0x0000, 0x0000 }, /* R4828 */ + { 0x0000, 0x0000, 0x0000 }, /* R4829 */ + { 0x0000, 0x0000, 0x0000 }, /* R4830 */ + { 0x0000, 0x0000, 0x0000 }, /* R4831 */ + { 0x0000, 0x0000, 0x0000 }, /* R4832 */ + { 0x0000, 0x0000, 0x0000 }, /* R4833 */ + { 0x0000, 0x0000, 0x0000 }, /* R4834 */ + { 0x0000, 0x0000, 0x0000 }, /* R4835 */ + { 0x0000, 0x0000, 0x0000 }, /* R4836 */ + { 0x0000, 0x0000, 0x0000 }, /* R4837 */ + { 0x0000, 0x0000, 0x0000 }, /* R4838 */ + { 0x0000, 0x0000, 0x0000 }, /* R4839 */ + { 0x0000, 0x0000, 0x0000 }, /* R4840 */ + { 0x0000, 0x0000, 0x0000 }, /* R4841 */ + { 0x0000, 0x0000, 0x0000 }, /* R4842 */ + { 0x0000, 0x0000, 0x0000 }, /* R4843 */ + { 0x0000, 0x0000, 0x0000 }, /* R4844 */ + { 0x0000, 0x0000, 0x0000 }, /* R4845 */ + { 0x0000, 0x0000, 0x0000 }, /* R4846 */ + { 0x0000, 0x0000, 0x0000 }, /* R4847 */ + { 0x0000, 0x0000, 0x0000 }, /* R4848 */ + { 0x0000, 0x0000, 0x0000 }, /* R4849 */ + { 0x0000, 0x0000, 0x0000 }, /* R4850 */ + { 0x0000, 0x0000, 0x0000 }, /* R4851 */ + { 0x0000, 0x0000, 0x0000 }, /* R4852 */ + { 0x0000, 0x0000, 0x0000 }, /* R4853 */ + { 0x0000, 0x0000, 0x0000 }, /* R4854 */ + { 0x0000, 0x0000, 0x0000 }, /* R4855 */ + { 0x0000, 0x0000, 0x0000 }, /* R4856 */ + { 0x0000, 0x0000, 0x0000 }, /* R4857 */ + { 0x0000, 0x0000, 0x0000 }, /* R4858 */ + { 0x0000, 0x0000, 0x0000 }, /* R4859 */ + { 0x0000, 0x0000, 0x0000 }, /* R4860 */ + { 0x0000, 0x0000, 0x0000 }, /* R4861 */ + { 0x0000, 0x0000, 0x0000 }, /* R4862 */ + { 0x0000, 0x0000, 0x0000 }, /* R4863 */ + { 0x0000, 0x0000, 0x0000 }, /* R4864 */ + { 0x0000, 0x0000, 0x0000 }, /* R4865 */ + { 0x0000, 0x0000, 0x0000 }, /* R4866 */ + { 0x0000, 0x0000, 0x0000 }, /* R4867 */ + { 0x0000, 0x0000, 0x0000 }, /* R4868 */ + { 0x0000, 0x0000, 0x0000 }, /* R4869 */ + { 0x0000, 0x0000, 0x0000 }, /* R4870 */ + { 0x0000, 0x0000, 0x0000 }, /* R4871 */ + { 0x0000, 0x0000, 0x0000 }, /* R4872 */ + { 0x0000, 0x0000, 0x0000 }, /* R4873 */ + { 0x0000, 0x0000, 0x0000 }, /* R4874 */ + { 0x0000, 0x0000, 0x0000 }, /* R4875 */ + { 0x0000, 0x0000, 0x0000 }, /* R4876 */ + { 0x0000, 0x0000, 0x0000 }, /* R4877 */ + { 0x0000, 0x0000, 0x0000 }, /* R4878 */ + { 0x0000, 0x0000, 0x0000 }, /* R4879 */ + { 0x0000, 0x0000, 0x0000 }, /* R4880 */ + { 0x0000, 0x0000, 0x0000 }, /* R4881 */ + { 0x0000, 0x0000, 0x0000 }, /* R4882 */ + { 0x0000, 0x0000, 0x0000 }, /* R4883 */ + { 0x0000, 0x0000, 0x0000 }, /* R4884 */ + { 0x0000, 0x0000, 0x0000 }, /* R4885 */ + { 0x0000, 0x0000, 0x0000 }, /* R4886 */ + { 0x0000, 0x0000, 0x0000 }, /* R4887 */ + { 0x0000, 0x0000, 0x0000 }, /* R4888 */ + { 0x0000, 0x0000, 0x0000 }, /* R4889 */ + { 0x0000, 0x0000, 0x0000 }, /* R4890 */ + { 0x0000, 0x0000, 0x0000 }, /* R4891 */ + { 0x0000, 0x0000, 0x0000 }, /* R4892 */ + { 0x0000, 0x0000, 0x0000 }, /* R4893 */ + { 0x0000, 0x0000, 0x0000 }, /* R4894 */ + { 0x0000, 0x0000, 0x0000 }, /* R4895 */ + { 0x0000, 0x0000, 0x0000 }, /* R4896 */ + { 0x0000, 0x0000, 0x0000 }, /* R4897 */ + { 0x0000, 0x0000, 0x0000 }, /* R4898 */ + { 0x0000, 0x0000, 0x0000 }, /* R4899 */ + { 0x0000, 0x0000, 0x0000 }, /* R4900 */ + { 0x0000, 0x0000, 0x0000 }, /* R4901 */ + { 0x0000, 0x0000, 0x0000 }, /* R4902 */ + { 0x0000, 0x0000, 0x0000 }, /* R4903 */ + { 0x0000, 0x0000, 0x0000 }, /* R4904 */ + { 0x0000, 0x0000, 0x0000 }, /* R4905 */ + { 0x0000, 0x0000, 0x0000 }, /* R4906 */ + { 0x0000, 0x0000, 0x0000 }, /* R4907 */ + { 0x0000, 0x0000, 0x0000 }, /* R4908 */ + { 0x0000, 0x0000, 0x0000 }, /* R4909 */ + { 0x0000, 0x0000, 0x0000 }, /* R4910 */ + { 0x0000, 0x0000, 0x0000 }, /* R4911 */ + { 0x0000, 0x0000, 0x0000 }, /* R4912 */ + { 0x0000, 0x0000, 0x0000 }, /* R4913 */ + { 0x0000, 0x0000, 0x0000 }, /* R4914 */ + { 0x0000, 0x0000, 0x0000 }, /* R4915 */ + { 0x0000, 0x0000, 0x0000 }, /* R4916 */ + { 0x0000, 0x0000, 0x0000 }, /* R4917 */ + { 0x0000, 0x0000, 0x0000 }, /* R4918 */ + { 0x0000, 0x0000, 0x0000 }, /* R4919 */ + { 0x0000, 0x0000, 0x0000 }, /* R4920 */ + { 0x0000, 0x0000, 0x0000 }, /* R4921 */ + { 0x0000, 0x0000, 0x0000 }, /* R4922 */ + { 0x0000, 0x0000, 0x0000 }, /* R4923 */ + { 0x0000, 0x0000, 0x0000 }, /* R4924 */ + { 0x0000, 0x0000, 0x0000 }, /* R4925 */ + { 0x0000, 0x0000, 0x0000 }, /* R4926 */ + { 0x0000, 0x0000, 0x0000 }, /* R4927 */ + { 0x0000, 0x0000, 0x0000 }, /* R4928 */ + { 0x0000, 0x0000, 0x0000 }, /* R4929 */ + { 0x0000, 0x0000, 0x0000 }, /* R4930 */ + { 0x0000, 0x0000, 0x0000 }, /* R4931 */ + { 0x0000, 0x0000, 0x0000 }, /* R4932 */ + { 0x0000, 0x0000, 0x0000 }, /* R4933 */ + { 0x0000, 0x0000, 0x0000 }, /* R4934 */ + { 0x0000, 0x0000, 0x0000 }, /* R4935 */ + { 0x0000, 0x0000, 0x0000 }, /* R4936 */ + { 0x0000, 0x0000, 0x0000 }, /* R4937 */ + { 0x0000, 0x0000, 0x0000 }, /* R4938 */ + { 0x0000, 0x0000, 0x0000 }, /* R4939 */ + { 0x0000, 0x0000, 0x0000 }, /* R4940 */ + { 0x0000, 0x0000, 0x0000 }, /* R4941 */ + { 0x0000, 0x0000, 0x0000 }, /* R4942 */ + { 0x0000, 0x0000, 0x0000 }, /* R4943 */ + { 0x0000, 0x0000, 0x0000 }, /* R4944 */ + { 0x0000, 0x0000, 0x0000 }, /* R4945 */ + { 0x0000, 0x0000, 0x0000 }, /* R4946 */ + { 0x0000, 0x0000, 0x0000 }, /* R4947 */ + { 0x0000, 0x0000, 0x0000 }, /* R4948 */ + { 0x0000, 0x0000, 0x0000 }, /* R4949 */ + { 0x0000, 0x0000, 0x0000 }, /* R4950 */ + { 0x0000, 0x0000, 0x0000 }, /* R4951 */ + { 0x0000, 0x0000, 0x0000 }, /* R4952 */ + { 0x0000, 0x0000, 0x0000 }, /* R4953 */ + { 0x0000, 0x0000, 0x0000 }, /* R4954 */ + { 0x0000, 0x0000, 0x0000 }, /* R4955 */ + { 0x0000, 0x0000, 0x0000 }, /* R4956 */ + { 0x0000, 0x0000, 0x0000 }, /* R4957 */ + { 0x0000, 0x0000, 0x0000 }, /* R4958 */ + { 0x0000, 0x0000, 0x0000 }, /* R4959 */ + { 0x0000, 0x0000, 0x0000 }, /* R4960 */ + { 0x0000, 0x0000, 0x0000 }, /* R4961 */ + { 0x0000, 0x0000, 0x0000 }, /* R4962 */ + { 0x0000, 0x0000, 0x0000 }, /* R4963 */ + { 0x0000, 0x0000, 0x0000 }, /* R4964 */ + { 0x0000, 0x0000, 0x0000 }, /* R4965 */ + { 0x0000, 0x0000, 0x0000 }, /* R4966 */ + { 0x0000, 0x0000, 0x0000 }, /* R4967 */ + { 0x0000, 0x0000, 0x0000 }, /* R4968 */ + { 0x0000, 0x0000, 0x0000 }, /* R4969 */ + { 0x0000, 0x0000, 0x0000 }, /* R4970 */ + { 0x0000, 0x0000, 0x0000 }, /* R4971 */ + { 0x0000, 0x0000, 0x0000 }, /* R4972 */ + { 0x0000, 0x0000, 0x0000 }, /* R4973 */ + { 0x0000, 0x0000, 0x0000 }, /* R4974 */ + { 0x0000, 0x0000, 0x0000 }, /* R4975 */ + { 0x0000, 0x0000, 0x0000 }, /* R4976 */ + { 0x0000, 0x0000, 0x0000 }, /* R4977 */ + { 0x0000, 0x0000, 0x0000 }, /* R4978 */ + { 0x0000, 0x0000, 0x0000 }, /* R4979 */ + { 0x0000, 0x0000, 0x0000 }, /* R4980 */ + { 0x0000, 0x0000, 0x0000 }, /* R4981 */ + { 0x0000, 0x0000, 0x0000 }, /* R4982 */ + { 0x0000, 0x0000, 0x0000 }, /* R4983 */ + { 0x0000, 0x0000, 0x0000 }, /* R4984 */ + { 0x0000, 0x0000, 0x0000 }, /* R4985 */ + { 0x0000, 0x0000, 0x0000 }, /* R4986 */ + { 0x0000, 0x0000, 0x0000 }, /* R4987 */ + { 0x0000, 0x0000, 0x0000 }, /* R4988 */ + { 0x0000, 0x0000, 0x0000 }, /* R4989 */ + { 0x0000, 0x0000, 0x0000 }, /* R4990 */ + { 0x0000, 0x0000, 0x0000 }, /* R4991 */ + { 0x0000, 0x0000, 0x0000 }, /* R4992 */ + { 0x0000, 0x0000, 0x0000 }, /* R4993 */ + { 0x0000, 0x0000, 0x0000 }, /* R4994 */ + { 0x0000, 0x0000, 0x0000 }, /* R4995 */ + { 0x0000, 0x0000, 0x0000 }, /* R4996 */ + { 0x0000, 0x0000, 0x0000 }, /* R4997 */ + { 0x0000, 0x0000, 0x0000 }, /* R4998 */ + { 0x0000, 0x0000, 0x0000 }, /* R4999 */ + { 0x0000, 0x0000, 0x0000 }, /* R5000 */ + { 0x0000, 0x0000, 0x0000 }, /* R5001 */ + { 0x0000, 0x0000, 0x0000 }, /* R5002 */ + { 0x0000, 0x0000, 0x0000 }, /* R5003 */ + { 0x0000, 0x0000, 0x0000 }, /* R5004 */ + { 0x0000, 0x0000, 0x0000 }, /* R5005 */ + { 0x0000, 0x0000, 0x0000 }, /* R5006 */ + { 0x0000, 0x0000, 0x0000 }, /* R5007 */ + { 0x0000, 0x0000, 0x0000 }, /* R5008 */ + { 0x0000, 0x0000, 0x0000 }, /* R5009 */ + { 0x0000, 0x0000, 0x0000 }, /* R5010 */ + { 0x0000, 0x0000, 0x0000 }, /* R5011 */ + { 0x0000, 0x0000, 0x0000 }, /* R5012 */ + { 0x0000, 0x0000, 0x0000 }, /* R5013 */ + { 0x0000, 0x0000, 0x0000 }, /* R5014 */ + { 0x0000, 0x0000, 0x0000 }, /* R5015 */ + { 0x0000, 0x0000, 0x0000 }, /* R5016 */ + { 0x0000, 0x0000, 0x0000 }, /* R5017 */ + { 0x0000, 0x0000, 0x0000 }, /* R5018 */ + { 0x0000, 0x0000, 0x0000 }, /* R5019 */ + { 0x0000, 0x0000, 0x0000 }, /* R5020 */ + { 0x0000, 0x0000, 0x0000 }, /* R5021 */ + { 0x0000, 0x0000, 0x0000 }, /* R5022 */ + { 0x0000, 0x0000, 0x0000 }, /* R5023 */ + { 0x0000, 0x0000, 0x0000 }, /* R5024 */ + { 0x0000, 0x0000, 0x0000 }, /* R5025 */ + { 0x0000, 0x0000, 0x0000 }, /* R5026 */ + { 0x0000, 0x0000, 0x0000 }, /* R5027 */ + { 0x0000, 0x0000, 0x0000 }, /* R5028 */ + { 0x0000, 0x0000, 0x0000 }, /* R5029 */ + { 0x0000, 0x0000, 0x0000 }, /* R5030 */ + { 0x0000, 0x0000, 0x0000 }, /* R5031 */ + { 0x0000, 0x0000, 0x0000 }, /* R5032 */ + { 0x0000, 0x0000, 0x0000 }, /* R5033 */ + { 0x0000, 0x0000, 0x0000 }, /* R5034 */ + { 0x0000, 0x0000, 0x0000 }, /* R5035 */ + { 0x0000, 0x0000, 0x0000 }, /* R5036 */ + { 0x0000, 0x0000, 0x0000 }, /* R5037 */ + { 0x0000, 0x0000, 0x0000 }, /* R5038 */ + { 0x0000, 0x0000, 0x0000 }, /* R5039 */ + { 0x0000, 0x0000, 0x0000 }, /* R5040 */ + { 0x0000, 0x0000, 0x0000 }, /* R5041 */ + { 0x0000, 0x0000, 0x0000 }, /* R5042 */ + { 0x0000, 0x0000, 0x0000 }, /* R5043 */ + { 0x0000, 0x0000, 0x0000 }, /* R5044 */ + { 0x0000, 0x0000, 0x0000 }, /* R5045 */ + { 0x0000, 0x0000, 0x0000 }, /* R5046 */ + { 0x0000, 0x0000, 0x0000 }, /* R5047 */ + { 0x0000, 0x0000, 0x0000 }, /* R5048 */ + { 0x0000, 0x0000, 0x0000 }, /* R5049 */ + { 0x0000, 0x0000, 0x0000 }, /* R5050 */ + { 0x0000, 0x0000, 0x0000 }, /* R5051 */ + { 0x0000, 0x0000, 0x0000 }, /* R5052 */ + { 0x0000, 0x0000, 0x0000 }, /* R5053 */ + { 0x0000, 0x0000, 0x0000 }, /* R5054 */ + { 0x0000, 0x0000, 0x0000 }, /* R5055 */ + { 0x0000, 0x0000, 0x0000 }, /* R5056 */ + { 0x0000, 0x0000, 0x0000 }, /* R5057 */ + { 0x0000, 0x0000, 0x0000 }, /* R5058 */ + { 0x0000, 0x0000, 0x0000 }, /* R5059 */ + { 0x0000, 0x0000, 0x0000 }, /* R5060 */ + { 0x0000, 0x0000, 0x0000 }, /* R5061 */ + { 0x0000, 0x0000, 0x0000 }, /* R5062 */ + { 0x0000, 0x0000, 0x0000 }, /* R5063 */ + { 0x0000, 0x0000, 0x0000 }, /* R5064 */ + { 0x0000, 0x0000, 0x0000 }, /* R5065 */ + { 0x0000, 0x0000, 0x0000 }, /* R5066 */ + { 0x0000, 0x0000, 0x0000 }, /* R5067 */ + { 0x0000, 0x0000, 0x0000 }, /* R5068 */ + { 0x0000, 0x0000, 0x0000 }, /* R5069 */ + { 0x0000, 0x0000, 0x0000 }, /* R5070 */ + { 0x0000, 0x0000, 0x0000 }, /* R5071 */ + { 0x0000, 0x0000, 0x0000 }, /* R5072 */ + { 0x0000, 0x0000, 0x0000 }, /* R5073 */ + { 0x0000, 0x0000, 0x0000 }, /* R5074 */ + { 0x0000, 0x0000, 0x0000 }, /* R5075 */ + { 0x0000, 0x0000, 0x0000 }, /* R5076 */ + { 0x0000, 0x0000, 0x0000 }, /* R5077 */ + { 0x0000, 0x0000, 0x0000 }, /* R5078 */ + { 0x0000, 0x0000, 0x0000 }, /* R5079 */ + { 0x0000, 0x0000, 0x0000 }, /* R5080 */ + { 0x0000, 0x0000, 0x0000 }, /* R5081 */ + { 0x0000, 0x0000, 0x0000 }, /* R5082 */ + { 0x0000, 0x0000, 0x0000 }, /* R5083 */ + { 0x0000, 0x0000, 0x0000 }, /* R5084 */ + { 0x0000, 0x0000, 0x0000 }, /* R5085 */ + { 0x0000, 0x0000, 0x0000 }, /* R5086 */ + { 0x0000, 0x0000, 0x0000 }, /* R5087 */ + { 0x0000, 0x0000, 0x0000 }, /* R5088 */ + { 0x0000, 0x0000, 0x0000 }, /* R5089 */ + { 0x0000, 0x0000, 0x0000 }, /* R5090 */ + { 0x0000, 0x0000, 0x0000 }, /* R5091 */ + { 0x0000, 0x0000, 0x0000 }, /* R5092 */ + { 0x0000, 0x0000, 0x0000 }, /* R5093 */ + { 0x0000, 0x0000, 0x0000 }, /* R5094 */ + { 0x0000, 0x0000, 0x0000 }, /* R5095 */ + { 0x0000, 0x0000, 0x0000 }, /* R5096 */ + { 0x0000, 0x0000, 0x0000 }, /* R5097 */ + { 0x0000, 0x0000, 0x0000 }, /* R5098 */ + { 0x0000, 0x0000, 0x0000 }, /* R5099 */ + { 0x0000, 0x0000, 0x0000 }, /* R5100 */ + { 0x0000, 0x0000, 0x0000 }, /* R5101 */ + { 0x0000, 0x0000, 0x0000 }, /* R5102 */ + { 0x0000, 0x0000, 0x0000 }, /* R5103 */ + { 0x0000, 0x0000, 0x0000 }, /* R5104 */ + { 0x0000, 0x0000, 0x0000 }, /* R5105 */ + { 0x0000, 0x0000, 0x0000 }, /* R5106 */ + { 0x0000, 0x0000, 0x0000 }, /* R5107 */ + { 0x0000, 0x0000, 0x0000 }, /* R5108 */ + { 0x0000, 0x0000, 0x0000 }, /* R5109 */ + { 0x0000, 0x0000, 0x0000 }, /* R5110 */ + { 0x0000, 0x0000, 0x0000 }, /* R5111 */ + { 0x0000, 0x0000, 0x0000 }, /* R5112 */ + { 0x0000, 0x0000, 0x0000 }, /* R5113 */ + { 0x0000, 0x0000, 0x0000 }, /* R5114 */ + { 0x0000, 0x0000, 0x0000 }, /* R5115 */ + { 0x0000, 0x0000, 0x0000 }, /* R5116 */ + { 0x0000, 0x0000, 0x0000 }, /* R5117 */ + { 0x0000, 0x0000, 0x0000 }, /* R5118 */ + { 0x0000, 0x0000, 0x0000 }, /* R5119 */ + { 0x0000, 0x0000, 0x0000 }, /* R5120 */ + { 0x0000, 0x0000, 0x0000 }, /* R5121 */ + { 0x0000, 0x0000, 0x0000 }, /* R5122 */ + { 0x0000, 0x0000, 0x0000 }, /* R5123 */ + { 0x0000, 0x0000, 0x0000 }, /* R5124 */ + { 0x0000, 0x0000, 0x0000 }, /* R5125 */ + { 0x0000, 0x0000, 0x0000 }, /* R5126 */ + { 0x0000, 0x0000, 0x0000 }, /* R5127 */ + { 0x0000, 0x0000, 0x0000 }, /* R5128 */ + { 0x0000, 0x0000, 0x0000 }, /* R5129 */ + { 0x0000, 0x0000, 0x0000 }, /* R5130 */ + { 0x0000, 0x0000, 0x0000 }, /* R5131 */ + { 0x0000, 0x0000, 0x0000 }, /* R5132 */ + { 0x0000, 0x0000, 0x0000 }, /* R5133 */ + { 0x0000, 0x0000, 0x0000 }, /* R5134 */ + { 0x0000, 0x0000, 0x0000 }, /* R5135 */ + { 0x0000, 0x0000, 0x0000 }, /* R5136 */ + { 0x0000, 0x0000, 0x0000 }, /* R5137 */ + { 0x0000, 0x0000, 0x0000 }, /* R5138 */ + { 0x0000, 0x0000, 0x0000 }, /* R5139 */ + { 0x0000, 0x0000, 0x0000 }, /* R5140 */ + { 0x0000, 0x0000, 0x0000 }, /* R5141 */ + { 0x0000, 0x0000, 0x0000 }, /* R5142 */ + { 0x0000, 0x0000, 0x0000 }, /* R5143 */ + { 0x0000, 0x0000, 0x0000 }, /* R5144 */ + { 0x0000, 0x0000, 0x0000 }, /* R5145 */ + { 0x0000, 0x0000, 0x0000 }, /* R5146 */ + { 0x0000, 0x0000, 0x0000 }, /* R5147 */ + { 0x0000, 0x0000, 0x0000 }, /* R5148 */ + { 0x0000, 0x0000, 0x0000 }, /* R5149 */ + { 0x0000, 0x0000, 0x0000 }, /* R5150 */ + { 0x0000, 0x0000, 0x0000 }, /* R5151 */ + { 0x0000, 0x0000, 0x0000 }, /* R5152 */ + { 0x0000, 0x0000, 0x0000 }, /* R5153 */ + { 0x0000, 0x0000, 0x0000 }, /* R5154 */ + { 0x0000, 0x0000, 0x0000 }, /* R5155 */ + { 0x0000, 0x0000, 0x0000 }, /* R5156 */ + { 0x0000, 0x0000, 0x0000 }, /* R5157 */ + { 0x0000, 0x0000, 0x0000 }, /* R5158 */ + { 0x0000, 0x0000, 0x0000 }, /* R5159 */ + { 0x0000, 0x0000, 0x0000 }, /* R5160 */ + { 0x0000, 0x0000, 0x0000 }, /* R5161 */ + { 0x0000, 0x0000, 0x0000 }, /* R5162 */ + { 0x0000, 0x0000, 0x0000 }, /* R5163 */ + { 0x0000, 0x0000, 0x0000 }, /* R5164 */ + { 0x0000, 0x0000, 0x0000 }, /* R5165 */ + { 0x0000, 0x0000, 0x0000 }, /* R5166 */ + { 0x0000, 0x0000, 0x0000 }, /* R5167 */ + { 0x0000, 0x0000, 0x0000 }, /* R5168 */ + { 0x0000, 0x0000, 0x0000 }, /* R5169 */ + { 0x0000, 0x0000, 0x0000 }, /* R5170 */ + { 0x0000, 0x0000, 0x0000 }, /* R5171 */ + { 0x0000, 0x0000, 0x0000 }, /* R5172 */ + { 0x0000, 0x0000, 0x0000 }, /* R5173 */ + { 0x0000, 0x0000, 0x0000 }, /* R5174 */ + { 0x0000, 0x0000, 0x0000 }, /* R5175 */ + { 0x0000, 0x0000, 0x0000 }, /* R5176 */ + { 0x0000, 0x0000, 0x0000 }, /* R5177 */ + { 0x0000, 0x0000, 0x0000 }, /* R5178 */ + { 0x0000, 0x0000, 0x0000 }, /* R5179 */ + { 0x0000, 0x0000, 0x0000 }, /* R5180 */ + { 0x0000, 0x0000, 0x0000 }, /* R5181 */ + { 0x0000, 0x0000, 0x0000 }, /* R5182 */ + { 0x0000, 0x0000, 0x0000 }, /* R5183 */ + { 0x0000, 0x0000, 0x0000 }, /* R5184 */ + { 0x0000, 0x0000, 0x0000 }, /* R5185 */ + { 0x0000, 0x0000, 0x0000 }, /* R5186 */ + { 0x0000, 0x0000, 0x0000 }, /* R5187 */ + { 0x0000, 0x0000, 0x0000 }, /* R5188 */ + { 0x0000, 0x0000, 0x0000 }, /* R5189 */ + { 0x0000, 0x0000, 0x0000 }, /* R5190 */ + { 0x0000, 0x0000, 0x0000 }, /* R5191 */ + { 0x0000, 0x0000, 0x0000 }, /* R5192 */ + { 0x0000, 0x0000, 0x0000 }, /* R5193 */ + { 0x0000, 0x0000, 0x0000 }, /* R5194 */ + { 0x0000, 0x0000, 0x0000 }, /* R5195 */ + { 0x0000, 0x0000, 0x0000 }, /* R5196 */ + { 0x0000, 0x0000, 0x0000 }, /* R5197 */ + { 0x0000, 0x0000, 0x0000 }, /* R5198 */ + { 0x0000, 0x0000, 0x0000 }, /* R5199 */ + { 0x0000, 0x0000, 0x0000 }, /* R5200 */ + { 0x0000, 0x0000, 0x0000 }, /* R5201 */ + { 0x0000, 0x0000, 0x0000 }, /* R5202 */ + { 0x0000, 0x0000, 0x0000 }, /* R5203 */ + { 0x0000, 0x0000, 0x0000 }, /* R5204 */ + { 0x0000, 0x0000, 0x0000 }, /* R5205 */ + { 0x0000, 0x0000, 0x0000 }, /* R5206 */ + { 0x0000, 0x0000, 0x0000 }, /* R5207 */ + { 0x0000, 0x0000, 0x0000 }, /* R5208 */ + { 0x0000, 0x0000, 0x0000 }, /* R5209 */ + { 0x0000, 0x0000, 0x0000 }, /* R5210 */ + { 0x0000, 0x0000, 0x0000 }, /* R5211 */ + { 0x0000, 0x0000, 0x0000 }, /* R5212 */ + { 0x0000, 0x0000, 0x0000 }, /* R5213 */ + { 0x0000, 0x0000, 0x0000 }, /* R5214 */ + { 0x0000, 0x0000, 0x0000 }, /* R5215 */ + { 0x0000, 0x0000, 0x0000 }, /* R5216 */ + { 0x0000, 0x0000, 0x0000 }, /* R5217 */ + { 0x0000, 0x0000, 0x0000 }, /* R5218 */ + { 0x0000, 0x0000, 0x0000 }, /* R5219 */ + { 0x0000, 0x0000, 0x0000 }, /* R5220 */ + { 0x0000, 0x0000, 0x0000 }, /* R5221 */ + { 0x0000, 0x0000, 0x0000 }, /* R5222 */ + { 0x0000, 0x0000, 0x0000 }, /* R5223 */ + { 0x0000, 0x0000, 0x0000 }, /* R5224 */ + { 0x0000, 0x0000, 0x0000 }, /* R5225 */ + { 0x0000, 0x0000, 0x0000 }, /* R5226 */ + { 0x0000, 0x0000, 0x0000 }, /* R5227 */ + { 0x0000, 0x0000, 0x0000 }, /* R5228 */ + { 0x0000, 0x0000, 0x0000 }, /* R5229 */ + { 0x0000, 0x0000, 0x0000 }, /* R5230 */ + { 0x0000, 0x0000, 0x0000 }, /* R5231 */ + { 0x0000, 0x0000, 0x0000 }, /* R5232 */ + { 0x0000, 0x0000, 0x0000 }, /* R5233 */ + { 0x0000, 0x0000, 0x0000 }, /* R5234 */ + { 0x0000, 0x0000, 0x0000 }, /* R5235 */ + { 0x0000, 0x0000, 0x0000 }, /* R5236 */ + { 0x0000, 0x0000, 0x0000 }, /* R5237 */ + { 0x0000, 0x0000, 0x0000 }, /* R5238 */ + { 0x0000, 0x0000, 0x0000 }, /* R5239 */ + { 0x0000, 0x0000, 0x0000 }, /* R5240 */ + { 0x0000, 0x0000, 0x0000 }, /* R5241 */ + { 0x0000, 0x0000, 0x0000 }, /* R5242 */ + { 0x0000, 0x0000, 0x0000 }, /* R5243 */ + { 0x0000, 0x0000, 0x0000 }, /* R5244 */ + { 0x0000, 0x0000, 0x0000 }, /* R5245 */ + { 0x0000, 0x0000, 0x0000 }, /* R5246 */ + { 0x0000, 0x0000, 0x0000 }, /* R5247 */ + { 0x0000, 0x0000, 0x0000 }, /* R5248 */ + { 0x0000, 0x0000, 0x0000 }, /* R5249 */ + { 0x0000, 0x0000, 0x0000 }, /* R5250 */ + { 0x0000, 0x0000, 0x0000 }, /* R5251 */ + { 0x0000, 0x0000, 0x0000 }, /* R5252 */ + { 0x0000, 0x0000, 0x0000 }, /* R5253 */ + { 0x0000, 0x0000, 0x0000 }, /* R5254 */ + { 0x0000, 0x0000, 0x0000 }, /* R5255 */ + { 0x0000, 0x0000, 0x0000 }, /* R5256 */ + { 0x0000, 0x0000, 0x0000 }, /* R5257 */ + { 0x0000, 0x0000, 0x0000 }, /* R5258 */ + { 0x0000, 0x0000, 0x0000 }, /* R5259 */ + { 0x0000, 0x0000, 0x0000 }, /* R5260 */ + { 0x0000, 0x0000, 0x0000 }, /* R5261 */ + { 0x0000, 0x0000, 0x0000 }, /* R5262 */ + { 0x0000, 0x0000, 0x0000 }, /* R5263 */ + { 0x0000, 0x0000, 0x0000 }, /* R5264 */ + { 0x0000, 0x0000, 0x0000 }, /* R5265 */ + { 0x0000, 0x0000, 0x0000 }, /* R5266 */ + { 0x0000, 0x0000, 0x0000 }, /* R5267 */ + { 0x0000, 0x0000, 0x0000 }, /* R5268 */ + { 0x0000, 0x0000, 0x0000 }, /* R5269 */ + { 0x0000, 0x0000, 0x0000 }, /* R5270 */ + { 0x0000, 0x0000, 0x0000 }, /* R5271 */ + { 0x0000, 0x0000, 0x0000 }, /* R5272 */ + { 0x0000, 0x0000, 0x0000 }, /* R5273 */ + { 0x0000, 0x0000, 0x0000 }, /* R5274 */ + { 0x0000, 0x0000, 0x0000 }, /* R5275 */ + { 0x0000, 0x0000, 0x0000 }, /* R5276 */ + { 0x0000, 0x0000, 0x0000 }, /* R5277 */ + { 0x0000, 0x0000, 0x0000 }, /* R5278 */ + { 0x0000, 0x0000, 0x0000 }, /* R5279 */ + { 0x0000, 0x0000, 0x0000 }, /* R5280 */ + { 0x0000, 0x0000, 0x0000 }, /* R5281 */ + { 0x0000, 0x0000, 0x0000 }, /* R5282 */ + { 0x0000, 0x0000, 0x0000 }, /* R5283 */ + { 0x0000, 0x0000, 0x0000 }, /* R5284 */ + { 0x0000, 0x0000, 0x0000 }, /* R5285 */ + { 0x0000, 0x0000, 0x0000 }, /* R5286 */ + { 0x0000, 0x0000, 0x0000 }, /* R5287 */ + { 0x0000, 0x0000, 0x0000 }, /* R5288 */ + { 0x0000, 0x0000, 0x0000 }, /* R5289 */ + { 0x0000, 0x0000, 0x0000 }, /* R5290 */ + { 0x0000, 0x0000, 0x0000 }, /* R5291 */ + { 0x0000, 0x0000, 0x0000 }, /* R5292 */ + { 0x0000, 0x0000, 0x0000 }, /* R5293 */ + { 0x0000, 0x0000, 0x0000 }, /* R5294 */ + { 0x0000, 0x0000, 0x0000 }, /* R5295 */ + { 0x0000, 0x0000, 0x0000 }, /* R5296 */ + { 0x0000, 0x0000, 0x0000 }, /* R5297 */ + { 0x0000, 0x0000, 0x0000 }, /* R5298 */ + { 0x0000, 0x0000, 0x0000 }, /* R5299 */ + { 0x0000, 0x0000, 0x0000 }, /* R5300 */ + { 0x0000, 0x0000, 0x0000 }, /* R5301 */ + { 0x0000, 0x0000, 0x0000 }, /* R5302 */ + { 0x0000, 0x0000, 0x0000 }, /* R5303 */ + { 0x0000, 0x0000, 0x0000 }, /* R5304 */ + { 0x0000, 0x0000, 0x0000 }, /* R5305 */ + { 0x0000, 0x0000, 0x0000 }, /* R5306 */ + { 0x0000, 0x0000, 0x0000 }, /* R5307 */ + { 0x0000, 0x0000, 0x0000 }, /* R5308 */ + { 0x0000, 0x0000, 0x0000 }, /* R5309 */ + { 0x0000, 0x0000, 0x0000 }, /* R5310 */ + { 0x0000, 0x0000, 0x0000 }, /* R5311 */ + { 0x0000, 0x0000, 0x0000 }, /* R5312 */ + { 0x0000, 0x0000, 0x0000 }, /* R5313 */ + { 0x0000, 0x0000, 0x0000 }, /* R5314 */ + { 0x0000, 0x0000, 0x0000 }, /* R5315 */ + { 0x0000, 0x0000, 0x0000 }, /* R5316 */ + { 0x0000, 0x0000, 0x0000 }, /* R5317 */ + { 0x0000, 0x0000, 0x0000 }, /* R5318 */ + { 0x0000, 0x0000, 0x0000 }, /* R5319 */ + { 0x0000, 0x0000, 0x0000 }, /* R5320 */ + { 0x0000, 0x0000, 0x0000 }, /* R5321 */ + { 0x0000, 0x0000, 0x0000 }, /* R5322 */ + { 0x0000, 0x0000, 0x0000 }, /* R5323 */ + { 0x0000, 0x0000, 0x0000 }, /* R5324 */ + { 0x0000, 0x0000, 0x0000 }, /* R5325 */ + { 0x0000, 0x0000, 0x0000 }, /* R5326 */ + { 0x0000, 0x0000, 0x0000 }, /* R5327 */ + { 0x0000, 0x0000, 0x0000 }, /* R5328 */ + { 0x0000, 0x0000, 0x0000 }, /* R5329 */ + { 0x0000, 0x0000, 0x0000 }, /* R5330 */ + { 0x0000, 0x0000, 0x0000 }, /* R5331 */ + { 0x0000, 0x0000, 0x0000 }, /* R5332 */ + { 0x0000, 0x0000, 0x0000 }, /* R5333 */ + { 0x0000, 0x0000, 0x0000 }, /* R5334 */ + { 0x0000, 0x0000, 0x0000 }, /* R5335 */ + { 0x0000, 0x0000, 0x0000 }, /* R5336 */ + { 0x0000, 0x0000, 0x0000 }, /* R5337 */ + { 0x0000, 0x0000, 0x0000 }, /* R5338 */ + { 0x0000, 0x0000, 0x0000 }, /* R5339 */ + { 0x0000, 0x0000, 0x0000 }, /* R5340 */ + { 0x0000, 0x0000, 0x0000 }, /* R5341 */ + { 0x0000, 0x0000, 0x0000 }, /* R5342 */ + { 0x0000, 0x0000, 0x0000 }, /* R5343 */ + { 0x0000, 0x0000, 0x0000 }, /* R5344 */ + { 0x0000, 0x0000, 0x0000 }, /* R5345 */ + { 0x0000, 0x0000, 0x0000 }, /* R5346 */ + { 0x0000, 0x0000, 0x0000 }, /* R5347 */ + { 0x0000, 0x0000, 0x0000 }, /* R5348 */ + { 0x0000, 0x0000, 0x0000 }, /* R5349 */ + { 0x0000, 0x0000, 0x0000 }, /* R5350 */ + { 0x0000, 0x0000, 0x0000 }, /* R5351 */ + { 0x0000, 0x0000, 0x0000 }, /* R5352 */ + { 0x0000, 0x0000, 0x0000 }, /* R5353 */ + { 0x0000, 0x0000, 0x0000 }, /* R5354 */ + { 0x0000, 0x0000, 0x0000 }, /* R5355 */ + { 0x0000, 0x0000, 0x0000 }, /* R5356 */ + { 0x0000, 0x0000, 0x0000 }, /* R5357 */ + { 0x0000, 0x0000, 0x0000 }, /* R5358 */ + { 0x0000, 0x0000, 0x0000 }, /* R5359 */ + { 0x0000, 0x0000, 0x0000 }, /* R5360 */ + { 0x0000, 0x0000, 0x0000 }, /* R5361 */ + { 0x0000, 0x0000, 0x0000 }, /* R5362 */ + { 0x0000, 0x0000, 0x0000 }, /* R5363 */ + { 0x0000, 0x0000, 0x0000 }, /* R5364 */ + { 0x0000, 0x0000, 0x0000 }, /* R5365 */ + { 0x0000, 0x0000, 0x0000 }, /* R5366 */ + { 0x0000, 0x0000, 0x0000 }, /* R5367 */ + { 0x0000, 0x0000, 0x0000 }, /* R5368 */ + { 0x0000, 0x0000, 0x0000 }, /* R5369 */ + { 0x0000, 0x0000, 0x0000 }, /* R5370 */ + { 0x0000, 0x0000, 0x0000 }, /* R5371 */ + { 0x0000, 0x0000, 0x0000 }, /* R5372 */ + { 0x0000, 0x0000, 0x0000 }, /* R5373 */ + { 0x0000, 0x0000, 0x0000 }, /* R5374 */ + { 0x0000, 0x0000, 0x0000 }, /* R5375 */ + { 0x0000, 0x0000, 0x0000 }, /* R5376 */ + { 0x0000, 0x0000, 0x0000 }, /* R5377 */ + { 0x0000, 0x0000, 0x0000 }, /* R5378 */ + { 0x0000, 0x0000, 0x0000 }, /* R5379 */ + { 0x0000, 0x0000, 0x0000 }, /* R5380 */ + { 0x0000, 0x0000, 0x0000 }, /* R5381 */ + { 0x0000, 0x0000, 0x0000 }, /* R5382 */ + { 0x0000, 0x0000, 0x0000 }, /* R5383 */ + { 0x0000, 0x0000, 0x0000 }, /* R5384 */ + { 0x0000, 0x0000, 0x0000 }, /* R5385 */ + { 0x0000, 0x0000, 0x0000 }, /* R5386 */ + { 0x0000, 0x0000, 0x0000 }, /* R5387 */ + { 0x0000, 0x0000, 0x0000 }, /* R5388 */ + { 0x0000, 0x0000, 0x0000 }, /* R5389 */ + { 0x0000, 0x0000, 0x0000 }, /* R5390 */ + { 0x0000, 0x0000, 0x0000 }, /* R5391 */ + { 0x0000, 0x0000, 0x0000 }, /* R5392 */ + { 0x0000, 0x0000, 0x0000 }, /* R5393 */ + { 0x0000, 0x0000, 0x0000 }, /* R5394 */ + { 0x0000, 0x0000, 0x0000 }, /* R5395 */ + { 0x0000, 0x0000, 0x0000 }, /* R5396 */ + { 0x0000, 0x0000, 0x0000 }, /* R5397 */ + { 0x0000, 0x0000, 0x0000 }, /* R5398 */ + { 0x0000, 0x0000, 0x0000 }, /* R5399 */ + { 0x0000, 0x0000, 0x0000 }, /* R5400 */ + { 0x0000, 0x0000, 0x0000 }, /* R5401 */ + { 0x0000, 0x0000, 0x0000 }, /* R5402 */ + { 0x0000, 0x0000, 0x0000 }, /* R5403 */ + { 0x0000, 0x0000, 0x0000 }, /* R5404 */ + { 0x0000, 0x0000, 0x0000 }, /* R5405 */ + { 0x0000, 0x0000, 0x0000 }, /* R5406 */ + { 0x0000, 0x0000, 0x0000 }, /* R5407 */ + { 0x0000, 0x0000, 0x0000 }, /* R5408 */ + { 0x0000, 0x0000, 0x0000 }, /* R5409 */ + { 0x0000, 0x0000, 0x0000 }, /* R5410 */ + { 0x0000, 0x0000, 0x0000 }, /* R5411 */ + { 0x0000, 0x0000, 0x0000 }, /* R5412 */ + { 0x0000, 0x0000, 0x0000 }, /* R5413 */ + { 0x0000, 0x0000, 0x0000 }, /* R5414 */ + { 0x0000, 0x0000, 0x0000 }, /* R5415 */ + { 0x0000, 0x0000, 0x0000 }, /* R5416 */ + { 0x0000, 0x0000, 0x0000 }, /* R5417 */ + { 0x0000, 0x0000, 0x0000 }, /* R5418 */ + { 0x0000, 0x0000, 0x0000 }, /* R5419 */ + { 0x0000, 0x0000, 0x0000 }, /* R5420 */ + { 0x0000, 0x0000, 0x0000 }, /* R5421 */ + { 0x0000, 0x0000, 0x0000 }, /* R5422 */ + { 0x0000, 0x0000, 0x0000 }, /* R5423 */ + { 0x0000, 0x0000, 0x0000 }, /* R5424 */ + { 0x0000, 0x0000, 0x0000 }, /* R5425 */ + { 0x0000, 0x0000, 0x0000 }, /* R5426 */ + { 0x0000, 0x0000, 0x0000 }, /* R5427 */ + { 0x0000, 0x0000, 0x0000 }, /* R5428 */ + { 0x0000, 0x0000, 0x0000 }, /* R5429 */ + { 0x0000, 0x0000, 0x0000 }, /* R5430 */ + { 0x0000, 0x0000, 0x0000 }, /* R5431 */ + { 0x0000, 0x0000, 0x0000 }, /* R5432 */ + { 0x0000, 0x0000, 0x0000 }, /* R5433 */ + { 0x0000, 0x0000, 0x0000 }, /* R5434 */ + { 0x0000, 0x0000, 0x0000 }, /* R5435 */ + { 0x0000, 0x0000, 0x0000 }, /* R5436 */ + { 0x0000, 0x0000, 0x0000 }, /* R5437 */ + { 0x0000, 0x0000, 0x0000 }, /* R5438 */ + { 0x0000, 0x0000, 0x0000 }, /* R5439 */ + { 0x0000, 0x0000, 0x0000 }, /* R5440 */ + { 0x0000, 0x0000, 0x0000 }, /* R5441 */ + { 0x0000, 0x0000, 0x0000 }, /* R5442 */ + { 0x0000, 0x0000, 0x0000 }, /* R5443 */ + { 0x0000, 0x0000, 0x0000 }, /* R5444 */ + { 0x0000, 0x0000, 0x0000 }, /* R5445 */ + { 0x0000, 0x0000, 0x0000 }, /* R5446 */ + { 0x0000, 0x0000, 0x0000 }, /* R5447 */ + { 0x0000, 0x0000, 0x0000 }, /* R5448 */ + { 0x0000, 0x0000, 0x0000 }, /* R5449 */ + { 0x0000, 0x0000, 0x0000 }, /* R5450 */ + { 0x0000, 0x0000, 0x0000 }, /* R5451 */ + { 0x0000, 0x0000, 0x0000 }, /* R5452 */ + { 0x0000, 0x0000, 0x0000 }, /* R5453 */ + { 0x0000, 0x0000, 0x0000 }, /* R5454 */ + { 0x0000, 0x0000, 0x0000 }, /* R5455 */ + { 0x0000, 0x0000, 0x0000 }, /* R5456 */ + { 0x0000, 0x0000, 0x0000 }, /* R5457 */ + { 0x0000, 0x0000, 0x0000 }, /* R5458 */ + { 0x0000, 0x0000, 0x0000 }, /* R5459 */ + { 0x0000, 0x0000, 0x0000 }, /* R5460 */ + { 0x0000, 0x0000, 0x0000 }, /* R5461 */ + { 0x0000, 0x0000, 0x0000 }, /* R5462 */ + { 0x0000, 0x0000, 0x0000 }, /* R5463 */ + { 0x0000, 0x0000, 0x0000 }, /* R5464 */ + { 0x0000, 0x0000, 0x0000 }, /* R5465 */ + { 0x0000, 0x0000, 0x0000 }, /* R5466 */ + { 0x0000, 0x0000, 0x0000 }, /* R5467 */ + { 0x0000, 0x0000, 0x0000 }, /* R5468 */ + { 0x0000, 0x0000, 0x0000 }, /* R5469 */ + { 0x0000, 0x0000, 0x0000 }, /* R5470 */ + { 0x0000, 0x0000, 0x0000 }, /* R5471 */ + { 0x0000, 0x0000, 0x0000 }, /* R5472 */ + { 0x0000, 0x0000, 0x0000 }, /* R5473 */ + { 0x0000, 0x0000, 0x0000 }, /* R5474 */ + { 0x0000, 0x0000, 0x0000 }, /* R5475 */ + { 0x0000, 0x0000, 0x0000 }, /* R5476 */ + { 0x0000, 0x0000, 0x0000 }, /* R5477 */ + { 0x0000, 0x0000, 0x0000 }, /* R5478 */ + { 0x0000, 0x0000, 0x0000 }, /* R5479 */ + { 0x0000, 0x0000, 0x0000 }, /* R5480 */ + { 0x0000, 0x0000, 0x0000 }, /* R5481 */ + { 0x0000, 0x0000, 0x0000 }, /* R5482 */ + { 0x0000, 0x0000, 0x0000 }, /* R5483 */ + { 0x0000, 0x0000, 0x0000 }, /* R5484 */ + { 0x0000, 0x0000, 0x0000 }, /* R5485 */ + { 0x0000, 0x0000, 0x0000 }, /* R5486 */ + { 0x0000, 0x0000, 0x0000 }, /* R5487 */ + { 0x0000, 0x0000, 0x0000 }, /* R5488 */ + { 0x0000, 0x0000, 0x0000 }, /* R5489 */ + { 0x0000, 0x0000, 0x0000 }, /* R5490 */ + { 0x0000, 0x0000, 0x0000 }, /* R5491 */ + { 0x0000, 0x0000, 0x0000 }, /* R5492 */ + { 0x0000, 0x0000, 0x0000 }, /* R5493 */ + { 0x0000, 0x0000, 0x0000 }, /* R5494 */ + { 0x0000, 0x0000, 0x0000 }, /* R5495 */ + { 0x0000, 0x0000, 0x0000 }, /* R5496 */ + { 0x0000, 0x0000, 0x0000 }, /* R5497 */ + { 0x0000, 0x0000, 0x0000 }, /* R5498 */ + { 0x0000, 0x0000, 0x0000 }, /* R5499 */ + { 0x0000, 0x0000, 0x0000 }, /* R5500 */ + { 0x0000, 0x0000, 0x0000 }, /* R5501 */ + { 0x0000, 0x0000, 0x0000 }, /* R5502 */ + { 0x0000, 0x0000, 0x0000 }, /* R5503 */ + { 0x0000, 0x0000, 0x0000 }, /* R5504 */ + { 0x0000, 0x0000, 0x0000 }, /* R5505 */ + { 0x0000, 0x0000, 0x0000 }, /* R5506 */ + { 0x0000, 0x0000, 0x0000 }, /* R5507 */ + { 0x0000, 0x0000, 0x0000 }, /* R5508 */ + { 0x0000, 0x0000, 0x0000 }, /* R5509 */ + { 0x0000, 0x0000, 0x0000 }, /* R5510 */ + { 0x0000, 0x0000, 0x0000 }, /* R5511 */ + { 0x0000, 0x0000, 0x0000 }, /* R5512 */ + { 0x0000, 0x0000, 0x0000 }, /* R5513 */ + { 0x0000, 0x0000, 0x0000 }, /* R5514 */ + { 0x0000, 0x0000, 0x0000 }, /* R5515 */ + { 0x0000, 0x0000, 0x0000 }, /* R5516 */ + { 0x0000, 0x0000, 0x0000 }, /* R5517 */ + { 0x0000, 0x0000, 0x0000 }, /* R5518 */ + { 0x0000, 0x0000, 0x0000 }, /* R5519 */ + { 0x0000, 0x0000, 0x0000 }, /* R5520 */ + { 0x0000, 0x0000, 0x0000 }, /* R5521 */ + { 0x0000, 0x0000, 0x0000 }, /* R5522 */ + { 0x0000, 0x0000, 0x0000 }, /* R5523 */ + { 0x0000, 0x0000, 0x0000 }, /* R5524 */ + { 0x0000, 0x0000, 0x0000 }, /* R5525 */ + { 0x0000, 0x0000, 0x0000 }, /* R5526 */ + { 0x0000, 0x0000, 0x0000 }, /* R5527 */ + { 0x0000, 0x0000, 0x0000 }, /* R5528 */ + { 0x0000, 0x0000, 0x0000 }, /* R5529 */ + { 0x0000, 0x0000, 0x0000 }, /* R5530 */ + { 0x0000, 0x0000, 0x0000 }, /* R5531 */ + { 0x0000, 0x0000, 0x0000 }, /* R5532 */ + { 0x0000, 0x0000, 0x0000 }, /* R5533 */ + { 0x0000, 0x0000, 0x0000 }, /* R5534 */ + { 0x0000, 0x0000, 0x0000 }, /* R5535 */ + { 0x0000, 0x0000, 0x0000 }, /* R5536 */ + { 0x0000, 0x0000, 0x0000 }, /* R5537 */ + { 0x0000, 0x0000, 0x0000 }, /* R5538 */ + { 0x0000, 0x0000, 0x0000 }, /* R5539 */ + { 0x0000, 0x0000, 0x0000 }, /* R5540 */ + { 0x0000, 0x0000, 0x0000 }, /* R5541 */ + { 0x0000, 0x0000, 0x0000 }, /* R5542 */ + { 0x0000, 0x0000, 0x0000 }, /* R5543 */ + { 0x0000, 0x0000, 0x0000 }, /* R5544 */ + { 0x0000, 0x0000, 0x0000 }, /* R5545 */ + { 0x0000, 0x0000, 0x0000 }, /* R5546 */ + { 0x0000, 0x0000, 0x0000 }, /* R5547 */ + { 0x0000, 0x0000, 0x0000 }, /* R5548 */ + { 0x0000, 0x0000, 0x0000 }, /* R5549 */ + { 0x0000, 0x0000, 0x0000 }, /* R5550 */ + { 0x0000, 0x0000, 0x0000 }, /* R5551 */ + { 0x0000, 0x0000, 0x0000 }, /* R5552 */ + { 0x0000, 0x0000, 0x0000 }, /* R5553 */ + { 0x0000, 0x0000, 0x0000 }, /* R5554 */ + { 0x0000, 0x0000, 0x0000 }, /* R5555 */ + { 0x0000, 0x0000, 0x0000 }, /* R5556 */ + { 0x0000, 0x0000, 0x0000 }, /* R5557 */ + { 0x0000, 0x0000, 0x0000 }, /* R5558 */ + { 0x0000, 0x0000, 0x0000 }, /* R5559 */ + { 0x0000, 0x0000, 0x0000 }, /* R5560 */ + { 0x0000, 0x0000, 0x0000 }, /* R5561 */ + { 0x0000, 0x0000, 0x0000 }, /* R5562 */ + { 0x0000, 0x0000, 0x0000 }, /* R5563 */ + { 0x0000, 0x0000, 0x0000 }, /* R5564 */ + { 0x0000, 0x0000, 0x0000 }, /* R5565 */ + { 0x0000, 0x0000, 0x0000 }, /* R5566 */ + { 0x0000, 0x0000, 0x0000 }, /* R5567 */ + { 0x0000, 0x0000, 0x0000 }, /* R5568 */ + { 0x0000, 0x0000, 0x0000 }, /* R5569 */ + { 0x0000, 0x0000, 0x0000 }, /* R5570 */ + { 0x0000, 0x0000, 0x0000 }, /* R5571 */ + { 0x0000, 0x0000, 0x0000 }, /* R5572 */ + { 0x0000, 0x0000, 0x0000 }, /* R5573 */ + { 0x0000, 0x0000, 0x0000 }, /* R5574 */ + { 0x0000, 0x0000, 0x0000 }, /* R5575 */ + { 0x0000, 0x0000, 0x0000 }, /* R5576 */ + { 0x0000, 0x0000, 0x0000 }, /* R5577 */ + { 0x0000, 0x0000, 0x0000 }, /* R5578 */ + { 0x0000, 0x0000, 0x0000 }, /* R5579 */ + { 0x0000, 0x0000, 0x0000 }, /* R5580 */ + { 0x0000, 0x0000, 0x0000 }, /* R5581 */ + { 0x0000, 0x0000, 0x0000 }, /* R5582 */ + { 0x0000, 0x0000, 0x0000 }, /* R5583 */ + { 0x0000, 0x0000, 0x0000 }, /* R5584 */ + { 0x0000, 0x0000, 0x0000 }, /* R5585 */ + { 0x0000, 0x0000, 0x0000 }, /* R5586 */ + { 0x0000, 0x0000, 0x0000 }, /* R5587 */ + { 0x0000, 0x0000, 0x0000 }, /* R5588 */ + { 0x0000, 0x0000, 0x0000 }, /* R5589 */ + { 0x0000, 0x0000, 0x0000 }, /* R5590 */ + { 0x0000, 0x0000, 0x0000 }, /* R5591 */ + { 0x0000, 0x0000, 0x0000 }, /* R5592 */ + { 0x0000, 0x0000, 0x0000 }, /* R5593 */ + { 0x0000, 0x0000, 0x0000 }, /* R5594 */ + { 0x0000, 0x0000, 0x0000 }, /* R5595 */ + { 0x0000, 0x0000, 0x0000 }, /* R5596 */ + { 0x0000, 0x0000, 0x0000 }, /* R5597 */ + { 0x0000, 0x0000, 0x0000 }, /* R5598 */ + { 0x0000, 0x0000, 0x0000 }, /* R5599 */ + { 0x0000, 0x0000, 0x0000 }, /* R5600 */ + { 0x0000, 0x0000, 0x0000 }, /* R5601 */ + { 0x0000, 0x0000, 0x0000 }, /* R5602 */ + { 0x0000, 0x0000, 0x0000 }, /* R5603 */ + { 0x0000, 0x0000, 0x0000 }, /* R5604 */ + { 0x0000, 0x0000, 0x0000 }, /* R5605 */ + { 0x0000, 0x0000, 0x0000 }, /* R5606 */ + { 0x0000, 0x0000, 0x0000 }, /* R5607 */ + { 0x0000, 0x0000, 0x0000 }, /* R5608 */ + { 0x0000, 0x0000, 0x0000 }, /* R5609 */ + { 0x0000, 0x0000, 0x0000 }, /* R5610 */ + { 0x0000, 0x0000, 0x0000 }, /* R5611 */ + { 0x0000, 0x0000, 0x0000 }, /* R5612 */ + { 0x0000, 0x0000, 0x0000 }, /* R5613 */ + { 0x0000, 0x0000, 0x0000 }, /* R5614 */ + { 0x0000, 0x0000, 0x0000 }, /* R5615 */ + { 0x0000, 0x0000, 0x0000 }, /* R5616 */ + { 0x0000, 0x0000, 0x0000 }, /* R5617 */ + { 0x0000, 0x0000, 0x0000 }, /* R5618 */ + { 0x0000, 0x0000, 0x0000 }, /* R5619 */ + { 0x0000, 0x0000, 0x0000 }, /* R5620 */ + { 0x0000, 0x0000, 0x0000 }, /* R5621 */ + { 0x0000, 0x0000, 0x0000 }, /* R5622 */ + { 0x0000, 0x0000, 0x0000 }, /* R5623 */ + { 0x0000, 0x0000, 0x0000 }, /* R5624 */ + { 0x0000, 0x0000, 0x0000 }, /* R5625 */ + { 0x0000, 0x0000, 0x0000 }, /* R5626 */ + { 0x0000, 0x0000, 0x0000 }, /* R5627 */ + { 0x0000, 0x0000, 0x0000 }, /* R5628 */ + { 0x0000, 0x0000, 0x0000 }, /* R5629 */ + { 0x0000, 0x0000, 0x0000 }, /* R5630 */ + { 0x0000, 0x0000, 0x0000 }, /* R5631 */ + { 0x0000, 0x0000, 0x0000 }, /* R5632 */ + { 0x0000, 0x0000, 0x0000 }, /* R5633 */ + { 0x0000, 0x0000, 0x0000 }, /* R5634 */ + { 0x0000, 0x0000, 0x0000 }, /* R5635 */ + { 0x0000, 0x0000, 0x0000 }, /* R5636 */ + { 0x0000, 0x0000, 0x0000 }, /* R5637 */ + { 0x0000, 0x0000, 0x0000 }, /* R5638 */ + { 0x0000, 0x0000, 0x0000 }, /* R5639 */ + { 0x0000, 0x0000, 0x0000 }, /* R5640 */ + { 0x0000, 0x0000, 0x0000 }, /* R5641 */ + { 0x0000, 0x0000, 0x0000 }, /* R5642 */ + { 0x0000, 0x0000, 0x0000 }, /* R5643 */ + { 0x0000, 0x0000, 0x0000 }, /* R5644 */ + { 0x0000, 0x0000, 0x0000 }, /* R5645 */ + { 0x0000, 0x0000, 0x0000 }, /* R5646 */ + { 0x0000, 0x0000, 0x0000 }, /* R5647 */ + { 0x0000, 0x0000, 0x0000 }, /* R5648 */ + { 0x0000, 0x0000, 0x0000 }, /* R5649 */ + { 0x0000, 0x0000, 0x0000 }, /* R5650 */ + { 0x0000, 0x0000, 0x0000 }, /* R5651 */ + { 0x0000, 0x0000, 0x0000 }, /* R5652 */ + { 0x0000, 0x0000, 0x0000 }, /* R5653 */ + { 0x0000, 0x0000, 0x0000 }, /* R5654 */ + { 0x0000, 0x0000, 0x0000 }, /* R5655 */ + { 0x0000, 0x0000, 0x0000 }, /* R5656 */ + { 0x0000, 0x0000, 0x0000 }, /* R5657 */ + { 0x0000, 0x0000, 0x0000 }, /* R5658 */ + { 0x0000, 0x0000, 0x0000 }, /* R5659 */ + { 0x0000, 0x0000, 0x0000 }, /* R5660 */ + { 0x0000, 0x0000, 0x0000 }, /* R5661 */ + { 0x0000, 0x0000, 0x0000 }, /* R5662 */ + { 0x0000, 0x0000, 0x0000 }, /* R5663 */ + { 0x0000, 0x0000, 0x0000 }, /* R5664 */ + { 0x0000, 0x0000, 0x0000 }, /* R5665 */ + { 0x0000, 0x0000, 0x0000 }, /* R5666 */ + { 0x0000, 0x0000, 0x0000 }, /* R5667 */ + { 0x0000, 0x0000, 0x0000 }, /* R5668 */ + { 0x0000, 0x0000, 0x0000 }, /* R5669 */ + { 0x0000, 0x0000, 0x0000 }, /* R5670 */ + { 0x0000, 0x0000, 0x0000 }, /* R5671 */ + { 0x0000, 0x0000, 0x0000 }, /* R5672 */ + { 0x0000, 0x0000, 0x0000 }, /* R5673 */ + { 0x0000, 0x0000, 0x0000 }, /* R5674 */ + { 0x0000, 0x0000, 0x0000 }, /* R5675 */ + { 0x0000, 0x0000, 0x0000 }, /* R5676 */ + { 0x0000, 0x0000, 0x0000 }, /* R5677 */ + { 0x0000, 0x0000, 0x0000 }, /* R5678 */ + { 0x0000, 0x0000, 0x0000 }, /* R5679 */ + { 0x0000, 0x0000, 0x0000 }, /* R5680 */ + { 0x0000, 0x0000, 0x0000 }, /* R5681 */ + { 0x0000, 0x0000, 0x0000 }, /* R5682 */ + { 0x0000, 0x0000, 0x0000 }, /* R5683 */ + { 0x0000, 0x0000, 0x0000 }, /* R5684 */ + { 0x0000, 0x0000, 0x0000 }, /* R5685 */ + { 0x0000, 0x0000, 0x0000 }, /* R5686 */ + { 0x0000, 0x0000, 0x0000 }, /* R5687 */ + { 0x0000, 0x0000, 0x0000 }, /* R5688 */ + { 0x0000, 0x0000, 0x0000 }, /* R5689 */ + { 0x0000, 0x0000, 0x0000 }, /* R5690 */ + { 0x0000, 0x0000, 0x0000 }, /* R5691 */ + { 0x0000, 0x0000, 0x0000 }, /* R5692 */ + { 0x0000, 0x0000, 0x0000 }, /* R5693 */ + { 0x0000, 0x0000, 0x0000 }, /* R5694 */ + { 0x0000, 0x0000, 0x0000 }, /* R5695 */ + { 0x0000, 0x0000, 0x0000 }, /* R5696 */ + { 0x0000, 0x0000, 0x0000 }, /* R5697 */ + { 0x0000, 0x0000, 0x0000 }, /* R5698 */ + { 0x0000, 0x0000, 0x0000 }, /* R5699 */ + { 0x0000, 0x0000, 0x0000 }, /* R5700 */ + { 0x0000, 0x0000, 0x0000 }, /* R5701 */ + { 0x0000, 0x0000, 0x0000 }, /* R5702 */ + { 0x0000, 0x0000, 0x0000 }, /* R5703 */ + { 0x0000, 0x0000, 0x0000 }, /* R5704 */ + { 0x0000, 0x0000, 0x0000 }, /* R5705 */ + { 0x0000, 0x0000, 0x0000 }, /* R5706 */ + { 0x0000, 0x0000, 0x0000 }, /* R5707 */ + { 0x0000, 0x0000, 0x0000 }, /* R5708 */ + { 0x0000, 0x0000, 0x0000 }, /* R5709 */ + { 0x0000, 0x0000, 0x0000 }, /* R5710 */ + { 0x0000, 0x0000, 0x0000 }, /* R5711 */ + { 0x0000, 0x0000, 0x0000 }, /* R5712 */ + { 0x0000, 0x0000, 0x0000 }, /* R5713 */ + { 0x0000, 0x0000, 0x0000 }, /* R5714 */ + { 0x0000, 0x0000, 0x0000 }, /* R5715 */ + { 0x0000, 0x0000, 0x0000 }, /* R5716 */ + { 0x0000, 0x0000, 0x0000 }, /* R5717 */ + { 0x0000, 0x0000, 0x0000 }, /* R5718 */ + { 0x0000, 0x0000, 0x0000 }, /* R5719 */ + { 0x0000, 0x0000, 0x0000 }, /* R5720 */ + { 0x0000, 0x0000, 0x0000 }, /* R5721 */ + { 0x0000, 0x0000, 0x0000 }, /* R5722 */ + { 0x0000, 0x0000, 0x0000 }, /* R5723 */ + { 0x0000, 0x0000, 0x0000 }, /* R5724 */ + { 0x0000, 0x0000, 0x0000 }, /* R5725 */ + { 0x0000, 0x0000, 0x0000 }, /* R5726 */ + { 0x0000, 0x0000, 0x0000 }, /* R5727 */ + { 0x0000, 0x0000, 0x0000 }, /* R5728 */ + { 0x0000, 0x0000, 0x0000 }, /* R5729 */ + { 0x0000, 0x0000, 0x0000 }, /* R5730 */ + { 0x0000, 0x0000, 0x0000 }, /* R5731 */ + { 0x0000, 0x0000, 0x0000 }, /* R5732 */ + { 0x0000, 0x0000, 0x0000 }, /* R5733 */ + { 0x0000, 0x0000, 0x0000 }, /* R5734 */ + { 0x0000, 0x0000, 0x0000 }, /* R5735 */ + { 0x0000, 0x0000, 0x0000 }, /* R5736 */ + { 0x0000, 0x0000, 0x0000 }, /* R5737 */ + { 0x0000, 0x0000, 0x0000 }, /* R5738 */ + { 0x0000, 0x0000, 0x0000 }, /* R5739 */ + { 0x0000, 0x0000, 0x0000 }, /* R5740 */ + { 0x0000, 0x0000, 0x0000 }, /* R5741 */ + { 0x0000, 0x0000, 0x0000 }, /* R5742 */ + { 0x0000, 0x0000, 0x0000 }, /* R5743 */ + { 0x0000, 0x0000, 0x0000 }, /* R5744 */ + { 0x0000, 0x0000, 0x0000 }, /* R5745 */ + { 0x0000, 0x0000, 0x0000 }, /* R5746 */ + { 0x0000, 0x0000, 0x0000 }, /* R5747 */ + { 0x0000, 0x0000, 0x0000 }, /* R5748 */ + { 0x0000, 0x0000, 0x0000 }, /* R5749 */ + { 0x0000, 0x0000, 0x0000 }, /* R5750 */ + { 0x0000, 0x0000, 0x0000 }, /* R5751 */ + { 0x0000, 0x0000, 0x0000 }, /* R5752 */ + { 0x0000, 0x0000, 0x0000 }, /* R5753 */ + { 0x0000, 0x0000, 0x0000 }, /* R5754 */ + { 0x0000, 0x0000, 0x0000 }, /* R5755 */ + { 0x0000, 0x0000, 0x0000 }, /* R5756 */ + { 0x0000, 0x0000, 0x0000 }, /* R5757 */ + { 0x0000, 0x0000, 0x0000 }, /* R5758 */ + { 0x0000, 0x0000, 0x0000 }, /* R5759 */ + { 0x0000, 0x0000, 0x0000 }, /* R5760 */ + { 0x0000, 0x0000, 0x0000 }, /* R5761 */ + { 0x0000, 0x0000, 0x0000 }, /* R5762 */ + { 0x0000, 0x0000, 0x0000 }, /* R5763 */ + { 0x0000, 0x0000, 0x0000 }, /* R5764 */ + { 0x0000, 0x0000, 0x0000 }, /* R5765 */ + { 0x0000, 0x0000, 0x0000 }, /* R5766 */ + { 0x0000, 0x0000, 0x0000 }, /* R5767 */ + { 0x0000, 0x0000, 0x0000 }, /* R5768 */ + { 0x0000, 0x0000, 0x0000 }, /* R5769 */ + { 0x0000, 0x0000, 0x0000 }, /* R5770 */ + { 0x0000, 0x0000, 0x0000 }, /* R5771 */ + { 0x0000, 0x0000, 0x0000 }, /* R5772 */ + { 0x0000, 0x0000, 0x0000 }, /* R5773 */ + { 0x0000, 0x0000, 0x0000 }, /* R5774 */ + { 0x0000, 0x0000, 0x0000 }, /* R5775 */ + { 0x0000, 0x0000, 0x0000 }, /* R5776 */ + { 0x0000, 0x0000, 0x0000 }, /* R5777 */ + { 0x0000, 0x0000, 0x0000 }, /* R5778 */ + { 0x0000, 0x0000, 0x0000 }, /* R5779 */ + { 0x0000, 0x0000, 0x0000 }, /* R5780 */ + { 0x0000, 0x0000, 0x0000 }, /* R5781 */ + { 0x0000, 0x0000, 0x0000 }, /* R5782 */ + { 0x0000, 0x0000, 0x0000 }, /* R5783 */ + { 0x0000, 0x0000, 0x0000 }, /* R5784 */ + { 0x0000, 0x0000, 0x0000 }, /* R5785 */ + { 0x0000, 0x0000, 0x0000 }, /* R5786 */ + { 0x0000, 0x0000, 0x0000 }, /* R5787 */ + { 0x0000, 0x0000, 0x0000 }, /* R5788 */ + { 0x0000, 0x0000, 0x0000 }, /* R5789 */ + { 0x0000, 0x0000, 0x0000 }, /* R5790 */ + { 0x0000, 0x0000, 0x0000 }, /* R5791 */ + { 0x0000, 0x0000, 0x0000 }, /* R5792 */ + { 0x0000, 0x0000, 0x0000 }, /* R5793 */ + { 0x0000, 0x0000, 0x0000 }, /* R5794 */ + { 0x0000, 0x0000, 0x0000 }, /* R5795 */ + { 0x0000, 0x0000, 0x0000 }, /* R5796 */ + { 0x0000, 0x0000, 0x0000 }, /* R5797 */ + { 0x0000, 0x0000, 0x0000 }, /* R5798 */ + { 0x0000, 0x0000, 0x0000 }, /* R5799 */ + { 0x0000, 0x0000, 0x0000 }, /* R5800 */ + { 0x0000, 0x0000, 0x0000 }, /* R5801 */ + { 0x0000, 0x0000, 0x0000 }, /* R5802 */ + { 0x0000, 0x0000, 0x0000 }, /* R5803 */ + { 0x0000, 0x0000, 0x0000 }, /* R5804 */ + { 0x0000, 0x0000, 0x0000 }, /* R5805 */ + { 0x0000, 0x0000, 0x0000 }, /* R5806 */ + { 0x0000, 0x0000, 0x0000 }, /* R5807 */ + { 0x0000, 0x0000, 0x0000 }, /* R5808 */ + { 0x0000, 0x0000, 0x0000 }, /* R5809 */ + { 0x0000, 0x0000, 0x0000 }, /* R5810 */ + { 0x0000, 0x0000, 0x0000 }, /* R5811 */ + { 0x0000, 0x0000, 0x0000 }, /* R5812 */ + { 0x0000, 0x0000, 0x0000 }, /* R5813 */ + { 0x0000, 0x0000, 0x0000 }, /* R5814 */ + { 0x0000, 0x0000, 0x0000 }, /* R5815 */ + { 0x0000, 0x0000, 0x0000 }, /* R5816 */ + { 0x0000, 0x0000, 0x0000 }, /* R5817 */ + { 0x0000, 0x0000, 0x0000 }, /* R5818 */ + { 0x0000, 0x0000, 0x0000 }, /* R5819 */ + { 0x0000, 0x0000, 0x0000 }, /* R5820 */ + { 0x0000, 0x0000, 0x0000 }, /* R5821 */ + { 0x0000, 0x0000, 0x0000 }, /* R5822 */ + { 0x0000, 0x0000, 0x0000 }, /* R5823 */ + { 0x0000, 0x0000, 0x0000 }, /* R5824 */ + { 0x0000, 0x0000, 0x0000 }, /* R5825 */ + { 0x0000, 0x0000, 0x0000 }, /* R5826 */ + { 0x0000, 0x0000, 0x0000 }, /* R5827 */ + { 0x0000, 0x0000, 0x0000 }, /* R5828 */ + { 0x0000, 0x0000, 0x0000 }, /* R5829 */ + { 0x0000, 0x0000, 0x0000 }, /* R5830 */ + { 0x0000, 0x0000, 0x0000 }, /* R5831 */ + { 0x0000, 0x0000, 0x0000 }, /* R5832 */ + { 0x0000, 0x0000, 0x0000 }, /* R5833 */ + { 0x0000, 0x0000, 0x0000 }, /* R5834 */ + { 0x0000, 0x0000, 0x0000 }, /* R5835 */ + { 0x0000, 0x0000, 0x0000 }, /* R5836 */ + { 0x0000, 0x0000, 0x0000 }, /* R5837 */ + { 0x0000, 0x0000, 0x0000 }, /* R5838 */ + { 0x0000, 0x0000, 0x0000 }, /* R5839 */ + { 0x0000, 0x0000, 0x0000 }, /* R5840 */ + { 0x0000, 0x0000, 0x0000 }, /* R5841 */ + { 0x0000, 0x0000, 0x0000 }, /* R5842 */ + { 0x0000, 0x0000, 0x0000 }, /* R5843 */ + { 0x0000, 0x0000, 0x0000 }, /* R5844 */ + { 0x0000, 0x0000, 0x0000 }, /* R5845 */ + { 0x0000, 0x0000, 0x0000 }, /* R5846 */ + { 0x0000, 0x0000, 0x0000 }, /* R5847 */ + { 0x0000, 0x0000, 0x0000 }, /* R5848 */ + { 0x0000, 0x0000, 0x0000 }, /* R5849 */ + { 0x0000, 0x0000, 0x0000 }, /* R5850 */ + { 0x0000, 0x0000, 0x0000 }, /* R5851 */ + { 0x0000, 0x0000, 0x0000 }, /* R5852 */ + { 0x0000, 0x0000, 0x0000 }, /* R5853 */ + { 0x0000, 0x0000, 0x0000 }, /* R5854 */ + { 0x0000, 0x0000, 0x0000 }, /* R5855 */ + { 0x0000, 0x0000, 0x0000 }, /* R5856 */ + { 0x0000, 0x0000, 0x0000 }, /* R5857 */ + { 0x0000, 0x0000, 0x0000 }, /* R5858 */ + { 0x0000, 0x0000, 0x0000 }, /* R5859 */ + { 0x0000, 0x0000, 0x0000 }, /* R5860 */ + { 0x0000, 0x0000, 0x0000 }, /* R5861 */ + { 0x0000, 0x0000, 0x0000 }, /* R5862 */ + { 0x0000, 0x0000, 0x0000 }, /* R5863 */ + { 0x0000, 0x0000, 0x0000 }, /* R5864 */ + { 0x0000, 0x0000, 0x0000 }, /* R5865 */ + { 0x0000, 0x0000, 0x0000 }, /* R5866 */ + { 0x0000, 0x0000, 0x0000 }, /* R5867 */ + { 0x0000, 0x0000, 0x0000 }, /* R5868 */ + { 0x0000, 0x0000, 0x0000 }, /* R5869 */ + { 0x0000, 0x0000, 0x0000 }, /* R5870 */ + { 0x0000, 0x0000, 0x0000 }, /* R5871 */ + { 0x0000, 0x0000, 0x0000 }, /* R5872 */ + { 0x0000, 0x0000, 0x0000 }, /* R5873 */ + { 0x0000, 0x0000, 0x0000 }, /* R5874 */ + { 0x0000, 0x0000, 0x0000 }, /* R5875 */ + { 0x0000, 0x0000, 0x0000 }, /* R5876 */ + { 0x0000, 0x0000, 0x0000 }, /* R5877 */ + { 0x0000, 0x0000, 0x0000 }, /* R5878 */ + { 0x0000, 0x0000, 0x0000 }, /* R5879 */ + { 0x0000, 0x0000, 0x0000 }, /* R5880 */ + { 0x0000, 0x0000, 0x0000 }, /* R5881 */ + { 0x0000, 0x0000, 0x0000 }, /* R5882 */ + { 0x0000, 0x0000, 0x0000 }, /* R5883 */ + { 0x0000, 0x0000, 0x0000 }, /* R5884 */ + { 0x0000, 0x0000, 0x0000 }, /* R5885 */ + { 0x0000, 0x0000, 0x0000 }, /* R5886 */ + { 0x0000, 0x0000, 0x0000 }, /* R5887 */ + { 0x0000, 0x0000, 0x0000 }, /* R5888 */ + { 0x0000, 0x0000, 0x0000 }, /* R5889 */ + { 0x0000, 0x0000, 0x0000 }, /* R5890 */ + { 0x0000, 0x0000, 0x0000 }, /* R5891 */ + { 0x0000, 0x0000, 0x0000 }, /* R5892 */ + { 0x0000, 0x0000, 0x0000 }, /* R5893 */ + { 0x0000, 0x0000, 0x0000 }, /* R5894 */ + { 0x0000, 0x0000, 0x0000 }, /* R5895 */ + { 0x0000, 0x0000, 0x0000 }, /* R5896 */ + { 0x0000, 0x0000, 0x0000 }, /* R5897 */ + { 0x0000, 0x0000, 0x0000 }, /* R5898 */ + { 0x0000, 0x0000, 0x0000 }, /* R5899 */ + { 0x0000, 0x0000, 0x0000 }, /* R5900 */ + { 0x0000, 0x0000, 0x0000 }, /* R5901 */ + { 0x0000, 0x0000, 0x0000 }, /* R5902 */ + { 0x0000, 0x0000, 0x0000 }, /* R5903 */ + { 0x0000, 0x0000, 0x0000 }, /* R5904 */ + { 0x0000, 0x0000, 0x0000 }, /* R5905 */ + { 0x0000, 0x0000, 0x0000 }, /* R5906 */ + { 0x0000, 0x0000, 0x0000 }, /* R5907 */ + { 0x0000, 0x0000, 0x0000 }, /* R5908 */ + { 0x0000, 0x0000, 0x0000 }, /* R5909 */ + { 0x0000, 0x0000, 0x0000 }, /* R5910 */ + { 0x0000, 0x0000, 0x0000 }, /* R5911 */ + { 0x0000, 0x0000, 0x0000 }, /* R5912 */ + { 0x0000, 0x0000, 0x0000 }, /* R5913 */ + { 0x0000, 0x0000, 0x0000 }, /* R5914 */ + { 0x0000, 0x0000, 0x0000 }, /* R5915 */ + { 0x0000, 0x0000, 0x0000 }, /* R5916 */ + { 0x0000, 0x0000, 0x0000 }, /* R5917 */ + { 0x0000, 0x0000, 0x0000 }, /* R5918 */ + { 0x0000, 0x0000, 0x0000 }, /* R5919 */ + { 0x0000, 0x0000, 0x0000 }, /* R5920 */ + { 0x0000, 0x0000, 0x0000 }, /* R5921 */ + { 0x0000, 0x0000, 0x0000 }, /* R5922 */ + { 0x0000, 0x0000, 0x0000 }, /* R5923 */ + { 0x0000, 0x0000, 0x0000 }, /* R5924 */ + { 0x0000, 0x0000, 0x0000 }, /* R5925 */ + { 0x0000, 0x0000, 0x0000 }, /* R5926 */ + { 0x0000, 0x0000, 0x0000 }, /* R5927 */ + { 0x0000, 0x0000, 0x0000 }, /* R5928 */ + { 0x0000, 0x0000, 0x0000 }, /* R5929 */ + { 0x0000, 0x0000, 0x0000 }, /* R5930 */ + { 0x0000, 0x0000, 0x0000 }, /* R5931 */ + { 0x0000, 0x0000, 0x0000 }, /* R5932 */ + { 0x0000, 0x0000, 0x0000 }, /* R5933 */ + { 0x0000, 0x0000, 0x0000 }, /* R5934 */ + { 0x0000, 0x0000, 0x0000 }, /* R5935 */ + { 0x0000, 0x0000, 0x0000 }, /* R5936 */ + { 0x0000, 0x0000, 0x0000 }, /* R5937 */ + { 0x0000, 0x0000, 0x0000 }, /* R5938 */ + { 0x0000, 0x0000, 0x0000 }, /* R5939 */ + { 0x0000, 0x0000, 0x0000 }, /* R5940 */ + { 0x0000, 0x0000, 0x0000 }, /* R5941 */ + { 0x0000, 0x0000, 0x0000 }, /* R5942 */ + { 0x0000, 0x0000, 0x0000 }, /* R5943 */ + { 0x0000, 0x0000, 0x0000 }, /* R5944 */ + { 0x0000, 0x0000, 0x0000 }, /* R5945 */ + { 0x0000, 0x0000, 0x0000 }, /* R5946 */ + { 0x0000, 0x0000, 0x0000 }, /* R5947 */ + { 0x0000, 0x0000, 0x0000 }, /* R5948 */ + { 0x0000, 0x0000, 0x0000 }, /* R5949 */ + { 0x0000, 0x0000, 0x0000 }, /* R5950 */ + { 0x0000, 0x0000, 0x0000 }, /* R5951 */ + { 0x0000, 0x0000, 0x0000 }, /* R5952 */ + { 0x0000, 0x0000, 0x0000 }, /* R5953 */ + { 0x0000, 0x0000, 0x0000 }, /* R5954 */ + { 0x0000, 0x0000, 0x0000 }, /* R5955 */ + { 0x0000, 0x0000, 0x0000 }, /* R5956 */ + { 0x0000, 0x0000, 0x0000 }, /* R5957 */ + { 0x0000, 0x0000, 0x0000 }, /* R5958 */ + { 0x0000, 0x0000, 0x0000 }, /* R5959 */ + { 0x0000, 0x0000, 0x0000 }, /* R5960 */ + { 0x0000, 0x0000, 0x0000 }, /* R5961 */ + { 0x0000, 0x0000, 0x0000 }, /* R5962 */ + { 0x0000, 0x0000, 0x0000 }, /* R5963 */ + { 0x0000, 0x0000, 0x0000 }, /* R5964 */ + { 0x0000, 0x0000, 0x0000 }, /* R5965 */ + { 0x0000, 0x0000, 0x0000 }, /* R5966 */ + { 0x0000, 0x0000, 0x0000 }, /* R5967 */ + { 0x0000, 0x0000, 0x0000 }, /* R5968 */ + { 0x0000, 0x0000, 0x0000 }, /* R5969 */ + { 0x0000, 0x0000, 0x0000 }, /* R5970 */ + { 0x0000, 0x0000, 0x0000 }, /* R5971 */ + { 0x0000, 0x0000, 0x0000 }, /* R5972 */ + { 0x0000, 0x0000, 0x0000 }, /* R5973 */ + { 0x0000, 0x0000, 0x0000 }, /* R5974 */ + { 0x0000, 0x0000, 0x0000 }, /* R5975 */ + { 0x0000, 0x0000, 0x0000 }, /* R5976 */ + { 0x0000, 0x0000, 0x0000 }, /* R5977 */ + { 0x0000, 0x0000, 0x0000 }, /* R5978 */ + { 0x0000, 0x0000, 0x0000 }, /* R5979 */ + { 0x0000, 0x0000, 0x0000 }, /* R5980 */ + { 0x0000, 0x0000, 0x0000 }, /* R5981 */ + { 0x0000, 0x0000, 0x0000 }, /* R5982 */ + { 0x0000, 0x0000, 0x0000 }, /* R5983 */ + { 0x0000, 0x0000, 0x0000 }, /* R5984 */ + { 0x0000, 0x0000, 0x0000 }, /* R5985 */ + { 0x0000, 0x0000, 0x0000 }, /* R5986 */ + { 0x0000, 0x0000, 0x0000 }, /* R5987 */ + { 0x0000, 0x0000, 0x0000 }, /* R5988 */ + { 0x0000, 0x0000, 0x0000 }, /* R5989 */ + { 0x0000, 0x0000, 0x0000 }, /* R5990 */ + { 0x0000, 0x0000, 0x0000 }, /* R5991 */ + { 0x0000, 0x0000, 0x0000 }, /* R5992 */ + { 0x0000, 0x0000, 0x0000 }, /* R5993 */ + { 0x0000, 0x0000, 0x0000 }, /* R5994 */ + { 0x0000, 0x0000, 0x0000 }, /* R5995 */ + { 0x0000, 0x0000, 0x0000 }, /* R5996 */ + { 0x0000, 0x0000, 0x0000 }, /* R5997 */ + { 0x0000, 0x0000, 0x0000 }, /* R5998 */ + { 0x0000, 0x0000, 0x0000 }, /* R5999 */ + { 0x0000, 0x0000, 0x0000 }, /* R6000 */ + { 0x0000, 0x0000, 0x0000 }, /* R6001 */ + { 0x0000, 0x0000, 0x0000 }, /* R6002 */ + { 0x0000, 0x0000, 0x0000 }, /* R6003 */ + { 0x0000, 0x0000, 0x0000 }, /* R6004 */ + { 0x0000, 0x0000, 0x0000 }, /* R6005 */ + { 0x0000, 0x0000, 0x0000 }, /* R6006 */ + { 0x0000, 0x0000, 0x0000 }, /* R6007 */ + { 0x0000, 0x0000, 0x0000 }, /* R6008 */ + { 0x0000, 0x0000, 0x0000 }, /* R6009 */ + { 0x0000, 0x0000, 0x0000 }, /* R6010 */ + { 0x0000, 0x0000, 0x0000 }, /* R6011 */ + { 0x0000, 0x0000, 0x0000 }, /* R6012 */ + { 0x0000, 0x0000, 0x0000 }, /* R6013 */ + { 0x0000, 0x0000, 0x0000 }, /* R6014 */ + { 0x0000, 0x0000, 0x0000 }, /* R6015 */ + { 0x0000, 0x0000, 0x0000 }, /* R6016 */ + { 0x0000, 0x0000, 0x0000 }, /* R6017 */ + { 0x0000, 0x0000, 0x0000 }, /* R6018 */ + { 0x0000, 0x0000, 0x0000 }, /* R6019 */ + { 0x0000, 0x0000, 0x0000 }, /* R6020 */ + { 0x0000, 0x0000, 0x0000 }, /* R6021 */ + { 0x0000, 0x0000, 0x0000 }, /* R6022 */ + { 0x0000, 0x0000, 0x0000 }, /* R6023 */ + { 0x0000, 0x0000, 0x0000 }, /* R6024 */ + { 0x0000, 0x0000, 0x0000 }, /* R6025 */ + { 0x0000, 0x0000, 0x0000 }, /* R6026 */ + { 0x0000, 0x0000, 0x0000 }, /* R6027 */ + { 0x0000, 0x0000, 0x0000 }, /* R6028 */ + { 0x0000, 0x0000, 0x0000 }, /* R6029 */ + { 0x0000, 0x0000, 0x0000 }, /* R6030 */ + { 0x0000, 0x0000, 0x0000 }, /* R6031 */ + { 0x0000, 0x0000, 0x0000 }, /* R6032 */ + { 0x0000, 0x0000, 0x0000 }, /* R6033 */ + { 0x0000, 0x0000, 0x0000 }, /* R6034 */ + { 0x0000, 0x0000, 0x0000 }, /* R6035 */ + { 0x0000, 0x0000, 0x0000 }, /* R6036 */ + { 0x0000, 0x0000, 0x0000 }, /* R6037 */ + { 0x0000, 0x0000, 0x0000 }, /* R6038 */ + { 0x0000, 0x0000, 0x0000 }, /* R6039 */ + { 0x0000, 0x0000, 0x0000 }, /* R6040 */ + { 0x0000, 0x0000, 0x0000 }, /* R6041 */ + { 0x0000, 0x0000, 0x0000 }, /* R6042 */ + { 0x0000, 0x0000, 0x0000 }, /* R6043 */ + { 0x0000, 0x0000, 0x0000 }, /* R6044 */ + { 0x0000, 0x0000, 0x0000 }, /* R6045 */ + { 0x0000, 0x0000, 0x0000 }, /* R6046 */ + { 0x0000, 0x0000, 0x0000 }, /* R6047 */ + { 0x0000, 0x0000, 0x0000 }, /* R6048 */ + { 0x0000, 0x0000, 0x0000 }, /* R6049 */ + { 0x0000, 0x0000, 0x0000 }, /* R6050 */ + { 0x0000, 0x0000, 0x0000 }, /* R6051 */ + { 0x0000, 0x0000, 0x0000 }, /* R6052 */ + { 0x0000, 0x0000, 0x0000 }, /* R6053 */ + { 0x0000, 0x0000, 0x0000 }, /* R6054 */ + { 0x0000, 0x0000, 0x0000 }, /* R6055 */ + { 0x0000, 0x0000, 0x0000 }, /* R6056 */ + { 0x0000, 0x0000, 0x0000 }, /* R6057 */ + { 0x0000, 0x0000, 0x0000 }, /* R6058 */ + { 0x0000, 0x0000, 0x0000 }, /* R6059 */ + { 0x0000, 0x0000, 0x0000 }, /* R6060 */ + { 0x0000, 0x0000, 0x0000 }, /* R6061 */ + { 0x0000, 0x0000, 0x0000 }, /* R6062 */ + { 0x0000, 0x0000, 0x0000 }, /* R6063 */ + { 0x0000, 0x0000, 0x0000 }, /* R6064 */ + { 0x0000, 0x0000, 0x0000 }, /* R6065 */ + { 0x0000, 0x0000, 0x0000 }, /* R6066 */ + { 0x0000, 0x0000, 0x0000 }, /* R6067 */ + { 0x0000, 0x0000, 0x0000 }, /* R6068 */ + { 0x0000, 0x0000, 0x0000 }, /* R6069 */ + { 0x0000, 0x0000, 0x0000 }, /* R6070 */ + { 0x0000, 0x0000, 0x0000 }, /* R6071 */ + { 0x0000, 0x0000, 0x0000 }, /* R6072 */ + { 0x0000, 0x0000, 0x0000 }, /* R6073 */ + { 0x0000, 0x0000, 0x0000 }, /* R6074 */ + { 0x0000, 0x0000, 0x0000 }, /* R6075 */ + { 0x0000, 0x0000, 0x0000 }, /* R6076 */ + { 0x0000, 0x0000, 0x0000 }, /* R6077 */ + { 0x0000, 0x0000, 0x0000 }, /* R6078 */ + { 0x0000, 0x0000, 0x0000 }, /* R6079 */ + { 0x0000, 0x0000, 0x0000 }, /* R6080 */ + { 0x0000, 0x0000, 0x0000 }, /* R6081 */ + { 0x0000, 0x0000, 0x0000 }, /* R6082 */ + { 0x0000, 0x0000, 0x0000 }, /* R6083 */ + { 0x0000, 0x0000, 0x0000 }, /* R6084 */ + { 0x0000, 0x0000, 0x0000 }, /* R6085 */ + { 0x0000, 0x0000, 0x0000 }, /* R6086 */ + { 0x0000, 0x0000, 0x0000 }, /* R6087 */ + { 0x0000, 0x0000, 0x0000 }, /* R6088 */ + { 0x0000, 0x0000, 0x0000 }, /* R6089 */ + { 0x0000, 0x0000, 0x0000 }, /* R6090 */ + { 0x0000, 0x0000, 0x0000 }, /* R6091 */ + { 0x0000, 0x0000, 0x0000 }, /* R6092 */ + { 0x0000, 0x0000, 0x0000 }, /* R6093 */ + { 0x0000, 0x0000, 0x0000 }, /* R6094 */ + { 0x0000, 0x0000, 0x0000 }, /* R6095 */ + { 0x0000, 0x0000, 0x0000 }, /* R6096 */ + { 0x0000, 0x0000, 0x0000 }, /* R6097 */ + { 0x0000, 0x0000, 0x0000 }, /* R6098 */ + { 0x0000, 0x0000, 0x0000 }, /* R6099 */ + { 0x0000, 0x0000, 0x0000 }, /* R6100 */ + { 0x0000, 0x0000, 0x0000 }, /* R6101 */ + { 0x0000, 0x0000, 0x0000 }, /* R6102 */ + { 0x0000, 0x0000, 0x0000 }, /* R6103 */ + { 0x0000, 0x0000, 0x0000 }, /* R6104 */ + { 0x0000, 0x0000, 0x0000 }, /* R6105 */ + { 0x0000, 0x0000, 0x0000 }, /* R6106 */ + { 0x0000, 0x0000, 0x0000 }, /* R6107 */ + { 0x0000, 0x0000, 0x0000 }, /* R6108 */ + { 0x0000, 0x0000, 0x0000 }, /* R6109 */ + { 0x0000, 0x0000, 0x0000 }, /* R6110 */ + { 0x0000, 0x0000, 0x0000 }, /* R6111 */ + { 0x0000, 0x0000, 0x0000 }, /* R6112 */ + { 0x0000, 0x0000, 0x0000 }, /* R6113 */ + { 0x0000, 0x0000, 0x0000 }, /* R6114 */ + { 0x0000, 0x0000, 0x0000 }, /* R6115 */ + { 0x0000, 0x0000, 0x0000 }, /* R6116 */ + { 0x0000, 0x0000, 0x0000 }, /* R6117 */ + { 0x0000, 0x0000, 0x0000 }, /* R6118 */ + { 0x0000, 0x0000, 0x0000 }, /* R6119 */ + { 0x0000, 0x0000, 0x0000 }, /* R6120 */ + { 0x0000, 0x0000, 0x0000 }, /* R6121 */ + { 0x0000, 0x0000, 0x0000 }, /* R6122 */ + { 0x0000, 0x0000, 0x0000 }, /* R6123 */ + { 0x0000, 0x0000, 0x0000 }, /* R6124 */ + { 0x0000, 0x0000, 0x0000 }, /* R6125 */ + { 0x0000, 0x0000, 0x0000 }, /* R6126 */ + { 0x0000, 0x0000, 0x0000 }, /* R6127 */ + { 0x0000, 0x0000, 0x0000 }, /* R6128 */ + { 0x0000, 0x0000, 0x0000 }, /* R6129 */ + { 0x0000, 0x0000, 0x0000 }, /* R6130 */ + { 0x0000, 0x0000, 0x0000 }, /* R6131 */ + { 0x0000, 0x0000, 0x0000 }, /* R6132 */ + { 0x0000, 0x0000, 0x0000 }, /* R6133 */ + { 0x0000, 0x0000, 0x0000 }, /* R6134 */ + { 0x0000, 0x0000, 0x0000 }, /* R6135 */ + { 0x0000, 0x0000, 0x0000 }, /* R6136 */ + { 0x0000, 0x0000, 0x0000 }, /* R6137 */ + { 0x0000, 0x0000, 0x0000 }, /* R6138 */ + { 0x0000, 0x0000, 0x0000 }, /* R6139 */ + { 0x0000, 0x0000, 0x0000 }, /* R6140 */ + { 0x0000, 0x0000, 0x0000 }, /* R6141 */ + { 0x0000, 0x0000, 0x0000 }, /* R6142 */ + { 0x0000, 0x0000, 0x0000 }, /* R6143 */ + { 0x0000, 0x0000, 0x0000 }, /* R6144 */ + { 0x0000, 0x0000, 0x0000 }, /* R6145 */ + { 0x0000, 0x0000, 0x0000 }, /* R6146 */ + { 0x0000, 0x0000, 0x0000 }, /* R6147 */ + { 0x0000, 0x0000, 0x0000 }, /* R6148 */ + { 0x0000, 0x0000, 0x0000 }, /* R6149 */ + { 0x0000, 0x0000, 0x0000 }, /* R6150 */ + { 0x0000, 0x0000, 0x0000 }, /* R6151 */ + { 0x0000, 0x0000, 0x0000 }, /* R6152 */ + { 0x0000, 0x0000, 0x0000 }, /* R6153 */ + { 0x0000, 0x0000, 0x0000 }, /* R6154 */ + { 0x0000, 0x0000, 0x0000 }, /* R6155 */ + { 0x0000, 0x0000, 0x0000 }, /* R6156 */ + { 0x0000, 0x0000, 0x0000 }, /* R6157 */ + { 0x0000, 0x0000, 0x0000 }, /* R6158 */ + { 0x0000, 0x0000, 0x0000 }, /* R6159 */ + { 0x0000, 0x0000, 0x0000 }, /* R6160 */ + { 0x0000, 0x0000, 0x0000 }, /* R6161 */ + { 0x0000, 0x0000, 0x0000 }, /* R6162 */ + { 0x0000, 0x0000, 0x0000 }, /* R6163 */ + { 0x0000, 0x0000, 0x0000 }, /* R6164 */ + { 0x0000, 0x0000, 0x0000 }, /* R6165 */ + { 0x0000, 0x0000, 0x0000 }, /* R6166 */ + { 0x0000, 0x0000, 0x0000 }, /* R6167 */ + { 0x0000, 0x0000, 0x0000 }, /* R6168 */ + { 0x0000, 0x0000, 0x0000 }, /* R6169 */ + { 0x0000, 0x0000, 0x0000 }, /* R6170 */ + { 0x0000, 0x0000, 0x0000 }, /* R6171 */ + { 0x0000, 0x0000, 0x0000 }, /* R6172 */ + { 0x0000, 0x0000, 0x0000 }, /* R6173 */ + { 0x0000, 0x0000, 0x0000 }, /* R6174 */ + { 0x0000, 0x0000, 0x0000 }, /* R6175 */ + { 0x0000, 0x0000, 0x0000 }, /* R6176 */ + { 0x0000, 0x0000, 0x0000 }, /* R6177 */ + { 0x0000, 0x0000, 0x0000 }, /* R6178 */ + { 0x0000, 0x0000, 0x0000 }, /* R6179 */ + { 0x0000, 0x0000, 0x0000 }, /* R6180 */ + { 0x0000, 0x0000, 0x0000 }, /* R6181 */ + { 0x0000, 0x0000, 0x0000 }, /* R6182 */ + { 0x0000, 0x0000, 0x0000 }, /* R6183 */ + { 0x0000, 0x0000, 0x0000 }, /* R6184 */ + { 0x0000, 0x0000, 0x0000 }, /* R6185 */ + { 0x0000, 0x0000, 0x0000 }, /* R6186 */ + { 0x0000, 0x0000, 0x0000 }, /* R6187 */ + { 0x0000, 0x0000, 0x0000 }, /* R6188 */ + { 0x0000, 0x0000, 0x0000 }, /* R6189 */ + { 0x0000, 0x0000, 0x0000 }, /* R6190 */ + { 0x0000, 0x0000, 0x0000 }, /* R6191 */ + { 0x0000, 0x0000, 0x0000 }, /* R6192 */ + { 0x0000, 0x0000, 0x0000 }, /* R6193 */ + { 0x0000, 0x0000, 0x0000 }, /* R6194 */ + { 0x0000, 0x0000, 0x0000 }, /* R6195 */ + { 0x0000, 0x0000, 0x0000 }, /* R6196 */ + { 0x0000, 0x0000, 0x0000 }, /* R6197 */ + { 0x0000, 0x0000, 0x0000 }, /* R6198 */ + { 0x0000, 0x0000, 0x0000 }, /* R6199 */ + { 0x0000, 0x0000, 0x0000 }, /* R6200 */ + { 0x0000, 0x0000, 0x0000 }, /* R6201 */ + { 0x0000, 0x0000, 0x0000 }, /* R6202 */ + { 0x0000, 0x0000, 0x0000 }, /* R6203 */ + { 0x0000, 0x0000, 0x0000 }, /* R6204 */ + { 0x0000, 0x0000, 0x0000 }, /* R6205 */ + { 0x0000, 0x0000, 0x0000 }, /* R6206 */ + { 0x0000, 0x0000, 0x0000 }, /* R6207 */ + { 0x0000, 0x0000, 0x0000 }, /* R6208 */ + { 0x0000, 0x0000, 0x0000 }, /* R6209 */ + { 0x0000, 0x0000, 0x0000 }, /* R6210 */ + { 0x0000, 0x0000, 0x0000 }, /* R6211 */ + { 0x0000, 0x0000, 0x0000 }, /* R6212 */ + { 0x0000, 0x0000, 0x0000 }, /* R6213 */ + { 0x0000, 0x0000, 0x0000 }, /* R6214 */ + { 0x0000, 0x0000, 0x0000 }, /* R6215 */ + { 0x0000, 0x0000, 0x0000 }, /* R6216 */ + { 0x0000, 0x0000, 0x0000 }, /* R6217 */ + { 0x0000, 0x0000, 0x0000 }, /* R6218 */ + { 0x0000, 0x0000, 0x0000 }, /* R6219 */ + { 0x0000, 0x0000, 0x0000 }, /* R6220 */ + { 0x0000, 0x0000, 0x0000 }, /* R6221 */ + { 0x0000, 0x0000, 0x0000 }, /* R6222 */ + { 0x0000, 0x0000, 0x0000 }, /* R6223 */ + { 0x0000, 0x0000, 0x0000 }, /* R6224 */ + { 0x0000, 0x0000, 0x0000 }, /* R6225 */ + { 0x0000, 0x0000, 0x0000 }, /* R6226 */ + { 0x0000, 0x0000, 0x0000 }, /* R6227 */ + { 0x0000, 0x0000, 0x0000 }, /* R6228 */ + { 0x0000, 0x0000, 0x0000 }, /* R6229 */ + { 0x0000, 0x0000, 0x0000 }, /* R6230 */ + { 0x0000, 0x0000, 0x0000 }, /* R6231 */ + { 0x0000, 0x0000, 0x0000 }, /* R6232 */ + { 0x0000, 0x0000, 0x0000 }, /* R6233 */ + { 0x0000, 0x0000, 0x0000 }, /* R6234 */ + { 0x0000, 0x0000, 0x0000 }, /* R6235 */ + { 0x0000, 0x0000, 0x0000 }, /* R6236 */ + { 0x0000, 0x0000, 0x0000 }, /* R6237 */ + { 0x0000, 0x0000, 0x0000 }, /* R6238 */ + { 0x0000, 0x0000, 0x0000 }, /* R6239 */ + { 0x0000, 0x0000, 0x0000 }, /* R6240 */ + { 0x0000, 0x0000, 0x0000 }, /* R6241 */ + { 0x0000, 0x0000, 0x0000 }, /* R6242 */ + { 0x0000, 0x0000, 0x0000 }, /* R6243 */ + { 0x0000, 0x0000, 0x0000 }, /* R6244 */ + { 0x0000, 0x0000, 0x0000 }, /* R6245 */ + { 0x0000, 0x0000, 0x0000 }, /* R6246 */ + { 0x0000, 0x0000, 0x0000 }, /* R6247 */ + { 0x0000, 0x0000, 0x0000 }, /* R6248 */ + { 0x0000, 0x0000, 0x0000 }, /* R6249 */ + { 0x0000, 0x0000, 0x0000 }, /* R6250 */ + { 0x0000, 0x0000, 0x0000 }, /* R6251 */ + { 0x0000, 0x0000, 0x0000 }, /* R6252 */ + { 0x0000, 0x0000, 0x0000 }, /* R6253 */ + { 0x0000, 0x0000, 0x0000 }, /* R6254 */ + { 0x0000, 0x0000, 0x0000 }, /* R6255 */ + { 0x0000, 0x0000, 0x0000 }, /* R6256 */ + { 0x0000, 0x0000, 0x0000 }, /* R6257 */ + { 0x0000, 0x0000, 0x0000 }, /* R6258 */ + { 0x0000, 0x0000, 0x0000 }, /* R6259 */ + { 0x0000, 0x0000, 0x0000 }, /* R6260 */ + { 0x0000, 0x0000, 0x0000 }, /* R6261 */ + { 0x0000, 0x0000, 0x0000 }, /* R6262 */ + { 0x0000, 0x0000, 0x0000 }, /* R6263 */ + { 0x0000, 0x0000, 0x0000 }, /* R6264 */ + { 0x0000, 0x0000, 0x0000 }, /* R6265 */ + { 0x0000, 0x0000, 0x0000 }, /* R6266 */ + { 0x0000, 0x0000, 0x0000 }, /* R6267 */ + { 0x0000, 0x0000, 0x0000 }, /* R6268 */ + { 0x0000, 0x0000, 0x0000 }, /* R6269 */ + { 0x0000, 0x0000, 0x0000 }, /* R6270 */ + { 0x0000, 0x0000, 0x0000 }, /* R6271 */ + { 0x0000, 0x0000, 0x0000 }, /* R6272 */ + { 0x0000, 0x0000, 0x0000 }, /* R6273 */ + { 0x0000, 0x0000, 0x0000 }, /* R6274 */ + { 0x0000, 0x0000, 0x0000 }, /* R6275 */ + { 0x0000, 0x0000, 0x0000 }, /* R6276 */ + { 0x0000, 0x0000, 0x0000 }, /* R6277 */ + { 0x0000, 0x0000, 0x0000 }, /* R6278 */ + { 0x0000, 0x0000, 0x0000 }, /* R6279 */ + { 0x0000, 0x0000, 0x0000 }, /* R6280 */ + { 0x0000, 0x0000, 0x0000 }, /* R6281 */ + { 0x0000, 0x0000, 0x0000 }, /* R6282 */ + { 0x0000, 0x0000, 0x0000 }, /* R6283 */ + { 0x0000, 0x0000, 0x0000 }, /* R6284 */ + { 0x0000, 0x0000, 0x0000 }, /* R6285 */ + { 0x0000, 0x0000, 0x0000 }, /* R6286 */ + { 0x0000, 0x0000, 0x0000 }, /* R6287 */ + { 0x0000, 0x0000, 0x0000 }, /* R6288 */ + { 0x0000, 0x0000, 0x0000 }, /* R6289 */ + { 0x0000, 0x0000, 0x0000 }, /* R6290 */ + { 0x0000, 0x0000, 0x0000 }, /* R6291 */ + { 0x0000, 0x0000, 0x0000 }, /* R6292 */ + { 0x0000, 0x0000, 0x0000 }, /* R6293 */ + { 0x0000, 0x0000, 0x0000 }, /* R6294 */ + { 0x0000, 0x0000, 0x0000 }, /* R6295 */ + { 0x0000, 0x0000, 0x0000 }, /* R6296 */ + { 0x0000, 0x0000, 0x0000 }, /* R6297 */ + { 0x0000, 0x0000, 0x0000 }, /* R6298 */ + { 0x0000, 0x0000, 0x0000 }, /* R6299 */ + { 0x0000, 0x0000, 0x0000 }, /* R6300 */ + { 0x0000, 0x0000, 0x0000 }, /* R6301 */ + { 0x0000, 0x0000, 0x0000 }, /* R6302 */ + { 0x0000, 0x0000, 0x0000 }, /* R6303 */ + { 0x0000, 0x0000, 0x0000 }, /* R6304 */ + { 0x0000, 0x0000, 0x0000 }, /* R6305 */ + { 0x0000, 0x0000, 0x0000 }, /* R6306 */ + { 0x0000, 0x0000, 0x0000 }, /* R6307 */ + { 0x0000, 0x0000, 0x0000 }, /* R6308 */ + { 0x0000, 0x0000, 0x0000 }, /* R6309 */ + { 0x0000, 0x0000, 0x0000 }, /* R6310 */ + { 0x0000, 0x0000, 0x0000 }, /* R6311 */ + { 0x0000, 0x0000, 0x0000 }, /* R6312 */ + { 0x0000, 0x0000, 0x0000 }, /* R6313 */ + { 0x0000, 0x0000, 0x0000 }, /* R6314 */ + { 0x0000, 0x0000, 0x0000 }, /* R6315 */ + { 0x0000, 0x0000, 0x0000 }, /* R6316 */ + { 0x0000, 0x0000, 0x0000 }, /* R6317 */ + { 0x0000, 0x0000, 0x0000 }, /* R6318 */ + { 0x0000, 0x0000, 0x0000 }, /* R6319 */ + { 0x0000, 0x0000, 0x0000 }, /* R6320 */ + { 0x0000, 0x0000, 0x0000 }, /* R6321 */ + { 0x0000, 0x0000, 0x0000 }, /* R6322 */ + { 0x0000, 0x0000, 0x0000 }, /* R6323 */ + { 0x0000, 0x0000, 0x0000 }, /* R6324 */ + { 0x0000, 0x0000, 0x0000 }, /* R6325 */ + { 0x0000, 0x0000, 0x0000 }, /* R6326 */ + { 0x0000, 0x0000, 0x0000 }, /* R6327 */ + { 0x0000, 0x0000, 0x0000 }, /* R6328 */ + { 0x0000, 0x0000, 0x0000 }, /* R6329 */ + { 0x0000, 0x0000, 0x0000 }, /* R6330 */ + { 0x0000, 0x0000, 0x0000 }, /* R6331 */ + { 0x0000, 0x0000, 0x0000 }, /* R6332 */ + { 0x0000, 0x0000, 0x0000 }, /* R6333 */ + { 0x0000, 0x0000, 0x0000 }, /* R6334 */ + { 0x0000, 0x0000, 0x0000 }, /* R6335 */ + { 0x0000, 0x0000, 0x0000 }, /* R6336 */ + { 0x0000, 0x0000, 0x0000 }, /* R6337 */ + { 0x0000, 0x0000, 0x0000 }, /* R6338 */ + { 0x0000, 0x0000, 0x0000 }, /* R6339 */ + { 0x0000, 0x0000, 0x0000 }, /* R6340 */ + { 0x0000, 0x0000, 0x0000 }, /* R6341 */ + { 0x0000, 0x0000, 0x0000 }, /* R6342 */ + { 0x0000, 0x0000, 0x0000 }, /* R6343 */ + { 0x0000, 0x0000, 0x0000 }, /* R6344 */ + { 0x0000, 0x0000, 0x0000 }, /* R6345 */ + { 0x0000, 0x0000, 0x0000 }, /* R6346 */ + { 0x0000, 0x0000, 0x0000 }, /* R6347 */ + { 0x0000, 0x0000, 0x0000 }, /* R6348 */ + { 0x0000, 0x0000, 0x0000 }, /* R6349 */ + { 0x0000, 0x0000, 0x0000 }, /* R6350 */ + { 0x0000, 0x0000, 0x0000 }, /* R6351 */ + { 0x0000, 0x0000, 0x0000 }, /* R6352 */ + { 0x0000, 0x0000, 0x0000 }, /* R6353 */ + { 0x0000, 0x0000, 0x0000 }, /* R6354 */ + { 0x0000, 0x0000, 0x0000 }, /* R6355 */ + { 0x0000, 0x0000, 0x0000 }, /* R6356 */ + { 0x0000, 0x0000, 0x0000 }, /* R6357 */ + { 0x0000, 0x0000, 0x0000 }, /* R6358 */ + { 0x0000, 0x0000, 0x0000 }, /* R6359 */ + { 0x0000, 0x0000, 0x0000 }, /* R6360 */ + { 0x0000, 0x0000, 0x0000 }, /* R6361 */ + { 0x0000, 0x0000, 0x0000 }, /* R6362 */ + { 0x0000, 0x0000, 0x0000 }, /* R6363 */ + { 0x0000, 0x0000, 0x0000 }, /* R6364 */ + { 0x0000, 0x0000, 0x0000 }, /* R6365 */ + { 0x0000, 0x0000, 0x0000 }, /* R6366 */ + { 0x0000, 0x0000, 0x0000 }, /* R6367 */ + { 0x0000, 0x0000, 0x0000 }, /* R6368 */ + { 0x0000, 0x0000, 0x0000 }, /* R6369 */ + { 0x0000, 0x0000, 0x0000 }, /* R6370 */ + { 0x0000, 0x0000, 0x0000 }, /* R6371 */ + { 0x0000, 0x0000, 0x0000 }, /* R6372 */ + { 0x0000, 0x0000, 0x0000 }, /* R6373 */ + { 0x0000, 0x0000, 0x0000 }, /* R6374 */ + { 0x0000, 0x0000, 0x0000 }, /* R6375 */ + { 0x0000, 0x0000, 0x0000 }, /* R6376 */ + { 0x0000, 0x0000, 0x0000 }, /* R6377 */ + { 0x0000, 0x0000, 0x0000 }, /* R6378 */ + { 0x0000, 0x0000, 0x0000 }, /* R6379 */ + { 0x0000, 0x0000, 0x0000 }, /* R6380 */ + { 0x0000, 0x0000, 0x0000 }, /* R6381 */ + { 0x0000, 0x0000, 0x0000 }, /* R6382 */ + { 0x0000, 0x0000, 0x0000 }, /* R6383 */ + { 0x0000, 0x0000, 0x0000 }, /* R6384 */ + { 0x0000, 0x0000, 0x0000 }, /* R6385 */ + { 0x0000, 0x0000, 0x0000 }, /* R6386 */ + { 0x0000, 0x0000, 0x0000 }, /* R6387 */ + { 0x0000, 0x0000, 0x0000 }, /* R6388 */ + { 0x0000, 0x0000, 0x0000 }, /* R6389 */ + { 0x0000, 0x0000, 0x0000 }, /* R6390 */ + { 0x0000, 0x0000, 0x0000 }, /* R6391 */ + { 0x0000, 0x0000, 0x0000 }, /* R6392 */ + { 0x0000, 0x0000, 0x0000 }, /* R6393 */ + { 0x0000, 0x0000, 0x0000 }, /* R6394 */ + { 0x0000, 0x0000, 0x0000 }, /* R6395 */ + { 0x0000, 0x0000, 0x0000 }, /* R6396 */ + { 0x0000, 0x0000, 0x0000 }, /* R6397 */ + { 0x0000, 0x0000, 0x0000 }, /* R6398 */ + { 0x0000, 0x0000, 0x0000 }, /* R6399 */ + { 0x0000, 0x0000, 0x0000 }, /* R6400 */ + { 0x0000, 0x0000, 0x0000 }, /* R6401 */ + { 0x0000, 0x0000, 0x0000 }, /* R6402 */ + { 0x0000, 0x0000, 0x0000 }, /* R6403 */ + { 0x0000, 0x0000, 0x0000 }, /* R6404 */ + { 0x0000, 0x0000, 0x0000 }, /* R6405 */ + { 0x0000, 0x0000, 0x0000 }, /* R6406 */ + { 0x0000, 0x0000, 0x0000 }, /* R6407 */ + { 0x0000, 0x0000, 0x0000 }, /* R6408 */ + { 0x0000, 0x0000, 0x0000 }, /* R6409 */ + { 0x0000, 0x0000, 0x0000 }, /* R6410 */ + { 0x0000, 0x0000, 0x0000 }, /* R6411 */ + { 0x0000, 0x0000, 0x0000 }, /* R6412 */ + { 0x0000, 0x0000, 0x0000 }, /* R6413 */ + { 0x0000, 0x0000, 0x0000 }, /* R6414 */ + { 0x0000, 0x0000, 0x0000 }, /* R6415 */ + { 0x0000, 0x0000, 0x0000 }, /* R6416 */ + { 0x0000, 0x0000, 0x0000 }, /* R6417 */ + { 0x0000, 0x0000, 0x0000 }, /* R6418 */ + { 0x0000, 0x0000, 0x0000 }, /* R6419 */ + { 0x0000, 0x0000, 0x0000 }, /* R6420 */ + { 0x0000, 0x0000, 0x0000 }, /* R6421 */ + { 0x0000, 0x0000, 0x0000 }, /* R6422 */ + { 0x0000, 0x0000, 0x0000 }, /* R6423 */ + { 0x0000, 0x0000, 0x0000 }, /* R6424 */ + { 0x0000, 0x0000, 0x0000 }, /* R6425 */ + { 0x0000, 0x0000, 0x0000 }, /* R6426 */ + { 0x0000, 0x0000, 0x0000 }, /* R6427 */ + { 0x0000, 0x0000, 0x0000 }, /* R6428 */ + { 0x0000, 0x0000, 0x0000 }, /* R6429 */ + { 0x0000, 0x0000, 0x0000 }, /* R6430 */ + { 0x0000, 0x0000, 0x0000 }, /* R6431 */ + { 0x0000, 0x0000, 0x0000 }, /* R6432 */ + { 0x0000, 0x0000, 0x0000 }, /* R6433 */ + { 0x0000, 0x0000, 0x0000 }, /* R6434 */ + { 0x0000, 0x0000, 0x0000 }, /* R6435 */ + { 0x0000, 0x0000, 0x0000 }, /* R6436 */ + { 0x0000, 0x0000, 0x0000 }, /* R6437 */ + { 0x0000, 0x0000, 0x0000 }, /* R6438 */ + { 0x0000, 0x0000, 0x0000 }, /* R6439 */ + { 0x0000, 0x0000, 0x0000 }, /* R6440 */ + { 0x0000, 0x0000, 0x0000 }, /* R6441 */ + { 0x0000, 0x0000, 0x0000 }, /* R6442 */ + { 0x0000, 0x0000, 0x0000 }, /* R6443 */ + { 0x0000, 0x0000, 0x0000 }, /* R6444 */ + { 0x0000, 0x0000, 0x0000 }, /* R6445 */ + { 0x0000, 0x0000, 0x0000 }, /* R6446 */ + { 0x0000, 0x0000, 0x0000 }, /* R6447 */ + { 0x0000, 0x0000, 0x0000 }, /* R6448 */ + { 0x0000, 0x0000, 0x0000 }, /* R6449 */ + { 0x0000, 0x0000, 0x0000 }, /* R6450 */ + { 0x0000, 0x0000, 0x0000 }, /* R6451 */ + { 0x0000, 0x0000, 0x0000 }, /* R6452 */ + { 0x0000, 0x0000, 0x0000 }, /* R6453 */ + { 0x0000, 0x0000, 0x0000 }, /* R6454 */ + { 0x0000, 0x0000, 0x0000 }, /* R6455 */ + { 0x0000, 0x0000, 0x0000 }, /* R6456 */ + { 0x0000, 0x0000, 0x0000 }, /* R6457 */ + { 0x0000, 0x0000, 0x0000 }, /* R6458 */ + { 0x0000, 0x0000, 0x0000 }, /* R6459 */ + { 0x0000, 0x0000, 0x0000 }, /* R6460 */ + { 0x0000, 0x0000, 0x0000 }, /* R6461 */ + { 0x0000, 0x0000, 0x0000 }, /* R6462 */ + { 0x0000, 0x0000, 0x0000 }, /* R6463 */ + { 0x0000, 0x0000, 0x0000 }, /* R6464 */ + { 0x0000, 0x0000, 0x0000 }, /* R6465 */ + { 0x0000, 0x0000, 0x0000 }, /* R6466 */ + { 0x0000, 0x0000, 0x0000 }, /* R6467 */ + { 0x0000, 0x0000, 0x0000 }, /* R6468 */ + { 0x0000, 0x0000, 0x0000 }, /* R6469 */ + { 0x0000, 0x0000, 0x0000 }, /* R6470 */ + { 0x0000, 0x0000, 0x0000 }, /* R6471 */ + { 0x0000, 0x0000, 0x0000 }, /* R6472 */ + { 0x0000, 0x0000, 0x0000 }, /* R6473 */ + { 0x0000, 0x0000, 0x0000 }, /* R6474 */ + { 0x0000, 0x0000, 0x0000 }, /* R6475 */ + { 0x0000, 0x0000, 0x0000 }, /* R6476 */ + { 0x0000, 0x0000, 0x0000 }, /* R6477 */ + { 0x0000, 0x0000, 0x0000 }, /* R6478 */ + { 0x0000, 0x0000, 0x0000 }, /* R6479 */ + { 0x0000, 0x0000, 0x0000 }, /* R6480 */ + { 0x0000, 0x0000, 0x0000 }, /* R6481 */ + { 0x0000, 0x0000, 0x0000 }, /* R6482 */ + { 0x0000, 0x0000, 0x0000 }, /* R6483 */ + { 0x0000, 0x0000, 0x0000 }, /* R6484 */ + { 0x0000, 0x0000, 0x0000 }, /* R6485 */ + { 0x0000, 0x0000, 0x0000 }, /* R6486 */ + { 0x0000, 0x0000, 0x0000 }, /* R6487 */ + { 0x0000, 0x0000, 0x0000 }, /* R6488 */ + { 0x0000, 0x0000, 0x0000 }, /* R6489 */ + { 0x0000, 0x0000, 0x0000 }, /* R6490 */ + { 0x0000, 0x0000, 0x0000 }, /* R6491 */ + { 0x0000, 0x0000, 0x0000 }, /* R6492 */ + { 0x0000, 0x0000, 0x0000 }, /* R6493 */ + { 0x0000, 0x0000, 0x0000 }, /* R6494 */ + { 0x0000, 0x0000, 0x0000 }, /* R6495 */ + { 0x0000, 0x0000, 0x0000 }, /* R6496 */ + { 0x0000, 0x0000, 0x0000 }, /* R6497 */ + { 0x0000, 0x0000, 0x0000 }, /* R6498 */ + { 0x0000, 0x0000, 0x0000 }, /* R6499 */ + { 0x0000, 0x0000, 0x0000 }, /* R6500 */ + { 0x0000, 0x0000, 0x0000 }, /* R6501 */ + { 0x0000, 0x0000, 0x0000 }, /* R6502 */ + { 0x0000, 0x0000, 0x0000 }, /* R6503 */ + { 0x0000, 0x0000, 0x0000 }, /* R6504 */ + { 0x0000, 0x0000, 0x0000 }, /* R6505 */ + { 0x0000, 0x0000, 0x0000 }, /* R6506 */ + { 0x0000, 0x0000, 0x0000 }, /* R6507 */ + { 0x0000, 0x0000, 0x0000 }, /* R6508 */ + { 0x0000, 0x0000, 0x0000 }, /* R6509 */ + { 0x0000, 0x0000, 0x0000 }, /* R6510 */ + { 0x0000, 0x0000, 0x0000 }, /* R6511 */ + { 0x0000, 0x0000, 0x0000 }, /* R6512 */ + { 0x0000, 0x0000, 0x0000 }, /* R6513 */ + { 0x0000, 0x0000, 0x0000 }, /* R6514 */ + { 0x0000, 0x0000, 0x0000 }, /* R6515 */ + { 0x0000, 0x0000, 0x0000 }, /* R6516 */ + { 0x0000, 0x0000, 0x0000 }, /* R6517 */ + { 0x0000, 0x0000, 0x0000 }, /* R6518 */ + { 0x0000, 0x0000, 0x0000 }, /* R6519 */ + { 0x0000, 0x0000, 0x0000 }, /* R6520 */ + { 0x0000, 0x0000, 0x0000 }, /* R6521 */ + { 0x0000, 0x0000, 0x0000 }, /* R6522 */ + { 0x0000, 0x0000, 0x0000 }, /* R6523 */ + { 0x0000, 0x0000, 0x0000 }, /* R6524 */ + { 0x0000, 0x0000, 0x0000 }, /* R6525 */ + { 0x0000, 0x0000, 0x0000 }, /* R6526 */ + { 0x0000, 0x0000, 0x0000 }, /* R6527 */ + { 0x0000, 0x0000, 0x0000 }, /* R6528 */ + { 0x0000, 0x0000, 0x0000 }, /* R6529 */ + { 0x0000, 0x0000, 0x0000 }, /* R6530 */ + { 0x0000, 0x0000, 0x0000 }, /* R6531 */ + { 0x0000, 0x0000, 0x0000 }, /* R6532 */ + { 0x0000, 0x0000, 0x0000 }, /* R6533 */ + { 0x0000, 0x0000, 0x0000 }, /* R6534 */ + { 0x0000, 0x0000, 0x0000 }, /* R6535 */ + { 0x0000, 0x0000, 0x0000 }, /* R6536 */ + { 0x0000, 0x0000, 0x0000 }, /* R6537 */ + { 0x0000, 0x0000, 0x0000 }, /* R6538 */ + { 0x0000, 0x0000, 0x0000 }, /* R6539 */ + { 0x0000, 0x0000, 0x0000 }, /* R6540 */ + { 0x0000, 0x0000, 0x0000 }, /* R6541 */ + { 0x0000, 0x0000, 0x0000 }, /* R6542 */ + { 0x0000, 0x0000, 0x0000 }, /* R6543 */ + { 0x0000, 0x0000, 0x0000 }, /* R6544 */ + { 0x0000, 0x0000, 0x0000 }, /* R6545 */ + { 0x0000, 0x0000, 0x0000 }, /* R6546 */ + { 0x0000, 0x0000, 0x0000 }, /* R6547 */ + { 0x0000, 0x0000, 0x0000 }, /* R6548 */ + { 0x0000, 0x0000, 0x0000 }, /* R6549 */ + { 0x0000, 0x0000, 0x0000 }, /* R6550 */ + { 0x0000, 0x0000, 0x0000 }, /* R6551 */ + { 0x0000, 0x0000, 0x0000 }, /* R6552 */ + { 0x0000, 0x0000, 0x0000 }, /* R6553 */ + { 0x0000, 0x0000, 0x0000 }, /* R6554 */ + { 0x0000, 0x0000, 0x0000 }, /* R6555 */ + { 0x0000, 0x0000, 0x0000 }, /* R6556 */ + { 0x0000, 0x0000, 0x0000 }, /* R6557 */ + { 0x0000, 0x0000, 0x0000 }, /* R6558 */ + { 0x0000, 0x0000, 0x0000 }, /* R6559 */ + { 0x0000, 0x0000, 0x0000 }, /* R6560 */ + { 0x0000, 0x0000, 0x0000 }, /* R6561 */ + { 0x0000, 0x0000, 0x0000 }, /* R6562 */ + { 0x0000, 0x0000, 0x0000 }, /* R6563 */ + { 0x0000, 0x0000, 0x0000 }, /* R6564 */ + { 0x0000, 0x0000, 0x0000 }, /* R6565 */ + { 0x0000, 0x0000, 0x0000 }, /* R6566 */ + { 0x0000, 0x0000, 0x0000 }, /* R6567 */ + { 0x0000, 0x0000, 0x0000 }, /* R6568 */ + { 0x0000, 0x0000, 0x0000 }, /* R6569 */ + { 0x0000, 0x0000, 0x0000 }, /* R6570 */ + { 0x0000, 0x0000, 0x0000 }, /* R6571 */ + { 0x0000, 0x0000, 0x0000 }, /* R6572 */ + { 0x0000, 0x0000, 0x0000 }, /* R6573 */ + { 0x0000, 0x0000, 0x0000 }, /* R6574 */ + { 0x0000, 0x0000, 0x0000 }, /* R6575 */ + { 0x0000, 0x0000, 0x0000 }, /* R6576 */ + { 0x0000, 0x0000, 0x0000 }, /* R6577 */ + { 0x0000, 0x0000, 0x0000 }, /* R6578 */ + { 0x0000, 0x0000, 0x0000 }, /* R6579 */ + { 0x0000, 0x0000, 0x0000 }, /* R6580 */ + { 0x0000, 0x0000, 0x0000 }, /* R6581 */ + { 0x0000, 0x0000, 0x0000 }, /* R6582 */ + { 0x0000, 0x0000, 0x0000 }, /* R6583 */ + { 0x0000, 0x0000, 0x0000 }, /* R6584 */ + { 0x0000, 0x0000, 0x0000 }, /* R6585 */ + { 0x0000, 0x0000, 0x0000 }, /* R6586 */ + { 0x0000, 0x0000, 0x0000 }, /* R6587 */ + { 0x0000, 0x0000, 0x0000 }, /* R6588 */ + { 0x0000, 0x0000, 0x0000 }, /* R6589 */ + { 0x0000, 0x0000, 0x0000 }, /* R6590 */ + { 0x0000, 0x0000, 0x0000 }, /* R6591 */ + { 0x0000, 0x0000, 0x0000 }, /* R6592 */ + { 0x0000, 0x0000, 0x0000 }, /* R6593 */ + { 0x0000, 0x0000, 0x0000 }, /* R6594 */ + { 0x0000, 0x0000, 0x0000 }, /* R6595 */ + { 0x0000, 0x0000, 0x0000 }, /* R6596 */ + { 0x0000, 0x0000, 0x0000 }, /* R6597 */ + { 0x0000, 0x0000, 0x0000 }, /* R6598 */ + { 0x0000, 0x0000, 0x0000 }, /* R6599 */ + { 0x0000, 0x0000, 0x0000 }, /* R6600 */ + { 0x0000, 0x0000, 0x0000 }, /* R6601 */ + { 0x0000, 0x0000, 0x0000 }, /* R6602 */ + { 0x0000, 0x0000, 0x0000 }, /* R6603 */ + { 0x0000, 0x0000, 0x0000 }, /* R6604 */ + { 0x0000, 0x0000, 0x0000 }, /* R6605 */ + { 0x0000, 0x0000, 0x0000 }, /* R6606 */ + { 0x0000, 0x0000, 0x0000 }, /* R6607 */ + { 0x0000, 0x0000, 0x0000 }, /* R6608 */ + { 0x0000, 0x0000, 0x0000 }, /* R6609 */ + { 0x0000, 0x0000, 0x0000 }, /* R6610 */ + { 0x0000, 0x0000, 0x0000 }, /* R6611 */ + { 0x0000, 0x0000, 0x0000 }, /* R6612 */ + { 0x0000, 0x0000, 0x0000 }, /* R6613 */ + { 0x0000, 0x0000, 0x0000 }, /* R6614 */ + { 0x0000, 0x0000, 0x0000 }, /* R6615 */ + { 0x0000, 0x0000, 0x0000 }, /* R6616 */ + { 0x0000, 0x0000, 0x0000 }, /* R6617 */ + { 0x0000, 0x0000, 0x0000 }, /* R6618 */ + { 0x0000, 0x0000, 0x0000 }, /* R6619 */ + { 0x0000, 0x0000, 0x0000 }, /* R6620 */ + { 0x0000, 0x0000, 0x0000 }, /* R6621 */ + { 0x0000, 0x0000, 0x0000 }, /* R6622 */ + { 0x0000, 0x0000, 0x0000 }, /* R6623 */ + { 0x0000, 0x0000, 0x0000 }, /* R6624 */ + { 0x0000, 0x0000, 0x0000 }, /* R6625 */ + { 0x0000, 0x0000, 0x0000 }, /* R6626 */ + { 0x0000, 0x0000, 0x0000 }, /* R6627 */ + { 0x0000, 0x0000, 0x0000 }, /* R6628 */ + { 0x0000, 0x0000, 0x0000 }, /* R6629 */ + { 0x0000, 0x0000, 0x0000 }, /* R6630 */ + { 0x0000, 0x0000, 0x0000 }, /* R6631 */ + { 0x0000, 0x0000, 0x0000 }, /* R6632 */ + { 0x0000, 0x0000, 0x0000 }, /* R6633 */ + { 0x0000, 0x0000, 0x0000 }, /* R6634 */ + { 0x0000, 0x0000, 0x0000 }, /* R6635 */ + { 0x0000, 0x0000, 0x0000 }, /* R6636 */ + { 0x0000, 0x0000, 0x0000 }, /* R6637 */ + { 0x0000, 0x0000, 0x0000 }, /* R6638 */ + { 0x0000, 0x0000, 0x0000 }, /* R6639 */ + { 0x0000, 0x0000, 0x0000 }, /* R6640 */ + { 0x0000, 0x0000, 0x0000 }, /* R6641 */ + { 0x0000, 0x0000, 0x0000 }, /* R6642 */ + { 0x0000, 0x0000, 0x0000 }, /* R6643 */ + { 0x0000, 0x0000, 0x0000 }, /* R6644 */ + { 0x0000, 0x0000, 0x0000 }, /* R6645 */ + { 0x0000, 0x0000, 0x0000 }, /* R6646 */ + { 0x0000, 0x0000, 0x0000 }, /* R6647 */ + { 0x0000, 0x0000, 0x0000 }, /* R6648 */ + { 0x0000, 0x0000, 0x0000 }, /* R6649 */ + { 0x0000, 0x0000, 0x0000 }, /* R6650 */ + { 0x0000, 0x0000, 0x0000 }, /* R6651 */ + { 0x0000, 0x0000, 0x0000 }, /* R6652 */ + { 0x0000, 0x0000, 0x0000 }, /* R6653 */ + { 0x0000, 0x0000, 0x0000 }, /* R6654 */ + { 0x0000, 0x0000, 0x0000 }, /* R6655 */ + { 0x0000, 0x0000, 0x0000 }, /* R6656 */ + { 0x0000, 0x0000, 0x0000 }, /* R6657 */ + { 0x0000, 0x0000, 0x0000 }, /* R6658 */ + { 0x0000, 0x0000, 0x0000 }, /* R6659 */ + { 0x0000, 0x0000, 0x0000 }, /* R6660 */ + { 0x0000, 0x0000, 0x0000 }, /* R6661 */ + { 0x0000, 0x0000, 0x0000 }, /* R6662 */ + { 0x0000, 0x0000, 0x0000 }, /* R6663 */ + { 0x0000, 0x0000, 0x0000 }, /* R6664 */ + { 0x0000, 0x0000, 0x0000 }, /* R6665 */ + { 0x0000, 0x0000, 0x0000 }, /* R6666 */ + { 0x0000, 0x0000, 0x0000 }, /* R6667 */ + { 0x0000, 0x0000, 0x0000 }, /* R6668 */ + { 0x0000, 0x0000, 0x0000 }, /* R6669 */ + { 0x0000, 0x0000, 0x0000 }, /* R6670 */ + { 0x0000, 0x0000, 0x0000 }, /* R6671 */ + { 0x0000, 0x0000, 0x0000 }, /* R6672 */ + { 0x0000, 0x0000, 0x0000 }, /* R6673 */ + { 0x0000, 0x0000, 0x0000 }, /* R6674 */ + { 0x0000, 0x0000, 0x0000 }, /* R6675 */ + { 0x0000, 0x0000, 0x0000 }, /* R6676 */ + { 0x0000, 0x0000, 0x0000 }, /* R6677 */ + { 0x0000, 0x0000, 0x0000 }, /* R6678 */ + { 0x0000, 0x0000, 0x0000 }, /* R6679 */ + { 0x0000, 0x0000, 0x0000 }, /* R6680 */ + { 0x0000, 0x0000, 0x0000 }, /* R6681 */ + { 0x0000, 0x0000, 0x0000 }, /* R6682 */ + { 0x0000, 0x0000, 0x0000 }, /* R6683 */ + { 0x0000, 0x0000, 0x0000 }, /* R6684 */ + { 0x0000, 0x0000, 0x0000 }, /* R6685 */ + { 0x0000, 0x0000, 0x0000 }, /* R6686 */ + { 0x0000, 0x0000, 0x0000 }, /* R6687 */ + { 0x0000, 0x0000, 0x0000 }, /* R6688 */ + { 0x0000, 0x0000, 0x0000 }, /* R6689 */ + { 0x0000, 0x0000, 0x0000 }, /* R6690 */ + { 0x0000, 0x0000, 0x0000 }, /* R6691 */ + { 0x0000, 0x0000, 0x0000 }, /* R6692 */ + { 0x0000, 0x0000, 0x0000 }, /* R6693 */ + { 0x0000, 0x0000, 0x0000 }, /* R6694 */ + { 0x0000, 0x0000, 0x0000 }, /* R6695 */ + { 0x0000, 0x0000, 0x0000 }, /* R6696 */ + { 0x0000, 0x0000, 0x0000 }, /* R6697 */ + { 0x0000, 0x0000, 0x0000 }, /* R6698 */ + { 0x0000, 0x0000, 0x0000 }, /* R6699 */ + { 0x0000, 0x0000, 0x0000 }, /* R6700 */ + { 0x0000, 0x0000, 0x0000 }, /* R6701 */ + { 0x0000, 0x0000, 0x0000 }, /* R6702 */ + { 0x0000, 0x0000, 0x0000 }, /* R6703 */ + { 0x0000, 0x0000, 0x0000 }, /* R6704 */ + { 0x0000, 0x0000, 0x0000 }, /* R6705 */ + { 0x0000, 0x0000, 0x0000 }, /* R6706 */ + { 0x0000, 0x0000, 0x0000 }, /* R6707 */ + { 0x0000, 0x0000, 0x0000 }, /* R6708 */ + { 0x0000, 0x0000, 0x0000 }, /* R6709 */ + { 0x0000, 0x0000, 0x0000 }, /* R6710 */ + { 0x0000, 0x0000, 0x0000 }, /* R6711 */ + { 0x0000, 0x0000, 0x0000 }, /* R6712 */ + { 0x0000, 0x0000, 0x0000 }, /* R6713 */ + { 0x0000, 0x0000, 0x0000 }, /* R6714 */ + { 0x0000, 0x0000, 0x0000 }, /* R6715 */ + { 0x0000, 0x0000, 0x0000 }, /* R6716 */ + { 0x0000, 0x0000, 0x0000 }, /* R6717 */ + { 0x0000, 0x0000, 0x0000 }, /* R6718 */ + { 0x0000, 0x0000, 0x0000 }, /* R6719 */ + { 0x0000, 0x0000, 0x0000 }, /* R6720 */ + { 0x0000, 0x0000, 0x0000 }, /* R6721 */ + { 0x0000, 0x0000, 0x0000 }, /* R6722 */ + { 0x0000, 0x0000, 0x0000 }, /* R6723 */ + { 0x0000, 0x0000, 0x0000 }, /* R6724 */ + { 0x0000, 0x0000, 0x0000 }, /* R6725 */ + { 0x0000, 0x0000, 0x0000 }, /* R6726 */ + { 0x0000, 0x0000, 0x0000 }, /* R6727 */ + { 0x0000, 0x0000, 0x0000 }, /* R6728 */ + { 0x0000, 0x0000, 0x0000 }, /* R6729 */ + { 0x0000, 0x0000, 0x0000 }, /* R6730 */ + { 0x0000, 0x0000, 0x0000 }, /* R6731 */ + { 0x0000, 0x0000, 0x0000 }, /* R6732 */ + { 0x0000, 0x0000, 0x0000 }, /* R6733 */ + { 0x0000, 0x0000, 0x0000 }, /* R6734 */ + { 0x0000, 0x0000, 0x0000 }, /* R6735 */ + { 0x0000, 0x0000, 0x0000 }, /* R6736 */ + { 0x0000, 0x0000, 0x0000 }, /* R6737 */ + { 0x0000, 0x0000, 0x0000 }, /* R6738 */ + { 0x0000, 0x0000, 0x0000 }, /* R6739 */ + { 0x0000, 0x0000, 0x0000 }, /* R6740 */ + { 0x0000, 0x0000, 0x0000 }, /* R6741 */ + { 0x0000, 0x0000, 0x0000 }, /* R6742 */ + { 0x0000, 0x0000, 0x0000 }, /* R6743 */ + { 0x0000, 0x0000, 0x0000 }, /* R6744 */ + { 0x0000, 0x0000, 0x0000 }, /* R6745 */ + { 0x0000, 0x0000, 0x0000 }, /* R6746 */ + { 0x0000, 0x0000, 0x0000 }, /* R6747 */ + { 0x0000, 0x0000, 0x0000 }, /* R6748 */ + { 0x0000, 0x0000, 0x0000 }, /* R6749 */ + { 0x0000, 0x0000, 0x0000 }, /* R6750 */ + { 0x0000, 0x0000, 0x0000 }, /* R6751 */ + { 0x0000, 0x0000, 0x0000 }, /* R6752 */ + { 0x0000, 0x0000, 0x0000 }, /* R6753 */ + { 0x0000, 0x0000, 0x0000 }, /* R6754 */ + { 0x0000, 0x0000, 0x0000 }, /* R6755 */ + { 0x0000, 0x0000, 0x0000 }, /* R6756 */ + { 0x0000, 0x0000, 0x0000 }, /* R6757 */ + { 0x0000, 0x0000, 0x0000 }, /* R6758 */ + { 0x0000, 0x0000, 0x0000 }, /* R6759 */ + { 0x0000, 0x0000, 0x0000 }, /* R6760 */ + { 0x0000, 0x0000, 0x0000 }, /* R6761 */ + { 0x0000, 0x0000, 0x0000 }, /* R6762 */ + { 0x0000, 0x0000, 0x0000 }, /* R6763 */ + { 0x0000, 0x0000, 0x0000 }, /* R6764 */ + { 0x0000, 0x0000, 0x0000 }, /* R6765 */ + { 0x0000, 0x0000, 0x0000 }, /* R6766 */ + { 0x0000, 0x0000, 0x0000 }, /* R6767 */ + { 0x0000, 0x0000, 0x0000 }, /* R6768 */ + { 0x0000, 0x0000, 0x0000 }, /* R6769 */ + { 0x0000, 0x0000, 0x0000 }, /* R6770 */ + { 0x0000, 0x0000, 0x0000 }, /* R6771 */ + { 0x0000, 0x0000, 0x0000 }, /* R6772 */ + { 0x0000, 0x0000, 0x0000 }, /* R6773 */ + { 0x0000, 0x0000, 0x0000 }, /* R6774 */ + { 0x0000, 0x0000, 0x0000 }, /* R6775 */ + { 0x0000, 0x0000, 0x0000 }, /* R6776 */ + { 0x0000, 0x0000, 0x0000 }, /* R6777 */ + { 0x0000, 0x0000, 0x0000 }, /* R6778 */ + { 0x0000, 0x0000, 0x0000 }, /* R6779 */ + { 0x0000, 0x0000, 0x0000 }, /* R6780 */ + { 0x0000, 0x0000, 0x0000 }, /* R6781 */ + { 0x0000, 0x0000, 0x0000 }, /* R6782 */ + { 0x0000, 0x0000, 0x0000 }, /* R6783 */ + { 0x0000, 0x0000, 0x0000 }, /* R6784 */ + { 0x0000, 0x0000, 0x0000 }, /* R6785 */ + { 0x0000, 0x0000, 0x0000 }, /* R6786 */ + { 0x0000, 0x0000, 0x0000 }, /* R6787 */ + { 0x0000, 0x0000, 0x0000 }, /* R6788 */ + { 0x0000, 0x0000, 0x0000 }, /* R6789 */ + { 0x0000, 0x0000, 0x0000 }, /* R6790 */ + { 0x0000, 0x0000, 0x0000 }, /* R6791 */ + { 0x0000, 0x0000, 0x0000 }, /* R6792 */ + { 0x0000, 0x0000, 0x0000 }, /* R6793 */ + { 0x0000, 0x0000, 0x0000 }, /* R6794 */ + { 0x0000, 0x0000, 0x0000 }, /* R6795 */ + { 0x0000, 0x0000, 0x0000 }, /* R6796 */ + { 0x0000, 0x0000, 0x0000 }, /* R6797 */ + { 0x0000, 0x0000, 0x0000 }, /* R6798 */ + { 0x0000, 0x0000, 0x0000 }, /* R6799 */ + { 0x0000, 0x0000, 0x0000 }, /* R6800 */ + { 0x0000, 0x0000, 0x0000 }, /* R6801 */ + { 0x0000, 0x0000, 0x0000 }, /* R6802 */ + { 0x0000, 0x0000, 0x0000 }, /* R6803 */ + { 0x0000, 0x0000, 0x0000 }, /* R6804 */ + { 0x0000, 0x0000, 0x0000 }, /* R6805 */ + { 0x0000, 0x0000, 0x0000 }, /* R6806 */ + { 0x0000, 0x0000, 0x0000 }, /* R6807 */ + { 0x0000, 0x0000, 0x0000 }, /* R6808 */ + { 0x0000, 0x0000, 0x0000 }, /* R6809 */ + { 0x0000, 0x0000, 0x0000 }, /* R6810 */ + { 0x0000, 0x0000, 0x0000 }, /* R6811 */ + { 0x0000, 0x0000, 0x0000 }, /* R6812 */ + { 0x0000, 0x0000, 0x0000 }, /* R6813 */ + { 0x0000, 0x0000, 0x0000 }, /* R6814 */ + { 0x0000, 0x0000, 0x0000 }, /* R6815 */ + { 0x0000, 0x0000, 0x0000 }, /* R6816 */ + { 0x0000, 0x0000, 0x0000 }, /* R6817 */ + { 0x0000, 0x0000, 0x0000 }, /* R6818 */ + { 0x0000, 0x0000, 0x0000 }, /* R6819 */ + { 0x0000, 0x0000, 0x0000 }, /* R6820 */ + { 0x0000, 0x0000, 0x0000 }, /* R6821 */ + { 0x0000, 0x0000, 0x0000 }, /* R6822 */ + { 0x0000, 0x0000, 0x0000 }, /* R6823 */ + { 0x0000, 0x0000, 0x0000 }, /* R6824 */ + { 0x0000, 0x0000, 0x0000 }, /* R6825 */ + { 0x0000, 0x0000, 0x0000 }, /* R6826 */ + { 0x0000, 0x0000, 0x0000 }, /* R6827 */ + { 0x0000, 0x0000, 0x0000 }, /* R6828 */ + { 0x0000, 0x0000, 0x0000 }, /* R6829 */ + { 0x0000, 0x0000, 0x0000 }, /* R6830 */ + { 0x0000, 0x0000, 0x0000 }, /* R6831 */ + { 0x0000, 0x0000, 0x0000 }, /* R6832 */ + { 0x0000, 0x0000, 0x0000 }, /* R6833 */ + { 0x0000, 0x0000, 0x0000 }, /* R6834 */ + { 0x0000, 0x0000, 0x0000 }, /* R6835 */ + { 0x0000, 0x0000, 0x0000 }, /* R6836 */ + { 0x0000, 0x0000, 0x0000 }, /* R6837 */ + { 0x0000, 0x0000, 0x0000 }, /* R6838 */ + { 0x0000, 0x0000, 0x0000 }, /* R6839 */ + { 0x0000, 0x0000, 0x0000 }, /* R6840 */ + { 0x0000, 0x0000, 0x0000 }, /* R6841 */ + { 0x0000, 0x0000, 0x0000 }, /* R6842 */ + { 0x0000, 0x0000, 0x0000 }, /* R6843 */ + { 0x0000, 0x0000, 0x0000 }, /* R6844 */ + { 0x0000, 0x0000, 0x0000 }, /* R6845 */ + { 0x0000, 0x0000, 0x0000 }, /* R6846 */ + { 0x0000, 0x0000, 0x0000 }, /* R6847 */ + { 0x0000, 0x0000, 0x0000 }, /* R6848 */ + { 0x0000, 0x0000, 0x0000 }, /* R6849 */ + { 0x0000, 0x0000, 0x0000 }, /* R6850 */ + { 0x0000, 0x0000, 0x0000 }, /* R6851 */ + { 0x0000, 0x0000, 0x0000 }, /* R6852 */ + { 0x0000, 0x0000, 0x0000 }, /* R6853 */ + { 0x0000, 0x0000, 0x0000 }, /* R6854 */ + { 0x0000, 0x0000, 0x0000 }, /* R6855 */ + { 0x0000, 0x0000, 0x0000 }, /* R6856 */ + { 0x0000, 0x0000, 0x0000 }, /* R6857 */ + { 0x0000, 0x0000, 0x0000 }, /* R6858 */ + { 0x0000, 0x0000, 0x0000 }, /* R6859 */ + { 0x0000, 0x0000, 0x0000 }, /* R6860 */ + { 0x0000, 0x0000, 0x0000 }, /* R6861 */ + { 0x0000, 0x0000, 0x0000 }, /* R6862 */ + { 0x0000, 0x0000, 0x0000 }, /* R6863 */ + { 0x0000, 0x0000, 0x0000 }, /* R6864 */ + { 0x0000, 0x0000, 0x0000 }, /* R6865 */ + { 0x0000, 0x0000, 0x0000 }, /* R6866 */ + { 0x0000, 0x0000, 0x0000 }, /* R6867 */ + { 0x0000, 0x0000, 0x0000 }, /* R6868 */ + { 0x0000, 0x0000, 0x0000 }, /* R6869 */ + { 0x0000, 0x0000, 0x0000 }, /* R6870 */ + { 0x0000, 0x0000, 0x0000 }, /* R6871 */ + { 0x0000, 0x0000, 0x0000 }, /* R6872 */ + { 0x0000, 0x0000, 0x0000 }, /* R6873 */ + { 0x0000, 0x0000, 0x0000 }, /* R6874 */ + { 0x0000, 0x0000, 0x0000 }, /* R6875 */ + { 0x0000, 0x0000, 0x0000 }, /* R6876 */ + { 0x0000, 0x0000, 0x0000 }, /* R6877 */ + { 0x0000, 0x0000, 0x0000 }, /* R6878 */ + { 0x0000, 0x0000, 0x0000 }, /* R6879 */ + { 0x0000, 0x0000, 0x0000 }, /* R6880 */ + { 0x0000, 0x0000, 0x0000 }, /* R6881 */ + { 0x0000, 0x0000, 0x0000 }, /* R6882 */ + { 0x0000, 0x0000, 0x0000 }, /* R6883 */ + { 0x0000, 0x0000, 0x0000 }, /* R6884 */ + { 0x0000, 0x0000, 0x0000 }, /* R6885 */ + { 0x0000, 0x0000, 0x0000 }, /* R6886 */ + { 0x0000, 0x0000, 0x0000 }, /* R6887 */ + { 0x0000, 0x0000, 0x0000 }, /* R6888 */ + { 0x0000, 0x0000, 0x0000 }, /* R6889 */ + { 0x0000, 0x0000, 0x0000 }, /* R6890 */ + { 0x0000, 0x0000, 0x0000 }, /* R6891 */ + { 0x0000, 0x0000, 0x0000 }, /* R6892 */ + { 0x0000, 0x0000, 0x0000 }, /* R6893 */ + { 0x0000, 0x0000, 0x0000 }, /* R6894 */ + { 0x0000, 0x0000, 0x0000 }, /* R6895 */ + { 0x0000, 0x0000, 0x0000 }, /* R6896 */ + { 0x0000, 0x0000, 0x0000 }, /* R6897 */ + { 0x0000, 0x0000, 0x0000 }, /* R6898 */ + { 0x0000, 0x0000, 0x0000 }, /* R6899 */ + { 0x0000, 0x0000, 0x0000 }, /* R6900 */ + { 0x0000, 0x0000, 0x0000 }, /* R6901 */ + { 0x0000, 0x0000, 0x0000 }, /* R6902 */ + { 0x0000, 0x0000, 0x0000 }, /* R6903 */ + { 0x0000, 0x0000, 0x0000 }, /* R6904 */ + { 0x0000, 0x0000, 0x0000 }, /* R6905 */ + { 0x0000, 0x0000, 0x0000 }, /* R6906 */ + { 0x0000, 0x0000, 0x0000 }, /* R6907 */ + { 0x0000, 0x0000, 0x0000 }, /* R6908 */ + { 0x0000, 0x0000, 0x0000 }, /* R6909 */ + { 0x0000, 0x0000, 0x0000 }, /* R6910 */ + { 0x0000, 0x0000, 0x0000 }, /* R6911 */ + { 0x0000, 0x0000, 0x0000 }, /* R6912 */ + { 0x0000, 0x0000, 0x0000 }, /* R6913 */ + { 0x0000, 0x0000, 0x0000 }, /* R6914 */ + { 0x0000, 0x0000, 0x0000 }, /* R6915 */ + { 0x0000, 0x0000, 0x0000 }, /* R6916 */ + { 0x0000, 0x0000, 0x0000 }, /* R6917 */ + { 0x0000, 0x0000, 0x0000 }, /* R6918 */ + { 0x0000, 0x0000, 0x0000 }, /* R6919 */ + { 0x0000, 0x0000, 0x0000 }, /* R6920 */ + { 0x0000, 0x0000, 0x0000 }, /* R6921 */ + { 0x0000, 0x0000, 0x0000 }, /* R6922 */ + { 0x0000, 0x0000, 0x0000 }, /* R6923 */ + { 0x0000, 0x0000, 0x0000 }, /* R6924 */ + { 0x0000, 0x0000, 0x0000 }, /* R6925 */ + { 0x0000, 0x0000, 0x0000 }, /* R6926 */ + { 0x0000, 0x0000, 0x0000 }, /* R6927 */ + { 0x0000, 0x0000, 0x0000 }, /* R6928 */ + { 0x0000, 0x0000, 0x0000 }, /* R6929 */ + { 0x0000, 0x0000, 0x0000 }, /* R6930 */ + { 0x0000, 0x0000, 0x0000 }, /* R6931 */ + { 0x0000, 0x0000, 0x0000 }, /* R6932 */ + { 0x0000, 0x0000, 0x0000 }, /* R6933 */ + { 0x0000, 0x0000, 0x0000 }, /* R6934 */ + { 0x0000, 0x0000, 0x0000 }, /* R6935 */ + { 0x0000, 0x0000, 0x0000 }, /* R6936 */ + { 0x0000, 0x0000, 0x0000 }, /* R6937 */ + { 0x0000, 0x0000, 0x0000 }, /* R6938 */ + { 0x0000, 0x0000, 0x0000 }, /* R6939 */ + { 0x0000, 0x0000, 0x0000 }, /* R6940 */ + { 0x0000, 0x0000, 0x0000 }, /* R6941 */ + { 0x0000, 0x0000, 0x0000 }, /* R6942 */ + { 0x0000, 0x0000, 0x0000 }, /* R6943 */ + { 0x0000, 0x0000, 0x0000 }, /* R6944 */ + { 0x0000, 0x0000, 0x0000 }, /* R6945 */ + { 0x0000, 0x0000, 0x0000 }, /* R6946 */ + { 0x0000, 0x0000, 0x0000 }, /* R6947 */ + { 0x0000, 0x0000, 0x0000 }, /* R6948 */ + { 0x0000, 0x0000, 0x0000 }, /* R6949 */ + { 0x0000, 0x0000, 0x0000 }, /* R6950 */ + { 0x0000, 0x0000, 0x0000 }, /* R6951 */ + { 0x0000, 0x0000, 0x0000 }, /* R6952 */ + { 0x0000, 0x0000, 0x0000 }, /* R6953 */ + { 0x0000, 0x0000, 0x0000 }, /* R6954 */ + { 0x0000, 0x0000, 0x0000 }, /* R6955 */ + { 0x0000, 0x0000, 0x0000 }, /* R6956 */ + { 0x0000, 0x0000, 0x0000 }, /* R6957 */ + { 0x0000, 0x0000, 0x0000 }, /* R6958 */ + { 0x0000, 0x0000, 0x0000 }, /* R6959 */ + { 0x0000, 0x0000, 0x0000 }, /* R6960 */ + { 0x0000, 0x0000, 0x0000 }, /* R6961 */ + { 0x0000, 0x0000, 0x0000 }, /* R6962 */ + { 0x0000, 0x0000, 0x0000 }, /* R6963 */ + { 0x0000, 0x0000, 0x0000 }, /* R6964 */ + { 0x0000, 0x0000, 0x0000 }, /* R6965 */ + { 0x0000, 0x0000, 0x0000 }, /* R6966 */ + { 0x0000, 0x0000, 0x0000 }, /* R6967 */ + { 0x0000, 0x0000, 0x0000 }, /* R6968 */ + { 0x0000, 0x0000, 0x0000 }, /* R6969 */ + { 0x0000, 0x0000, 0x0000 }, /* R6970 */ + { 0x0000, 0x0000, 0x0000 }, /* R6971 */ + { 0x0000, 0x0000, 0x0000 }, /* R6972 */ + { 0x0000, 0x0000, 0x0000 }, /* R6973 */ + { 0x0000, 0x0000, 0x0000 }, /* R6974 */ + { 0x0000, 0x0000, 0x0000 }, /* R6975 */ + { 0x0000, 0x0000, 0x0000 }, /* R6976 */ + { 0x0000, 0x0000, 0x0000 }, /* R6977 */ + { 0x0000, 0x0000, 0x0000 }, /* R6978 */ + { 0x0000, 0x0000, 0x0000 }, /* R6979 */ + { 0x0000, 0x0000, 0x0000 }, /* R6980 */ + { 0x0000, 0x0000, 0x0000 }, /* R6981 */ + { 0x0000, 0x0000, 0x0000 }, /* R6982 */ + { 0x0000, 0x0000, 0x0000 }, /* R6983 */ + { 0x0000, 0x0000, 0x0000 }, /* R6984 */ + { 0x0000, 0x0000, 0x0000 }, /* R6985 */ + { 0x0000, 0x0000, 0x0000 }, /* R6986 */ + { 0x0000, 0x0000, 0x0000 }, /* R6987 */ + { 0x0000, 0x0000, 0x0000 }, /* R6988 */ + { 0x0000, 0x0000, 0x0000 }, /* R6989 */ + { 0x0000, 0x0000, 0x0000 }, /* R6990 */ + { 0x0000, 0x0000, 0x0000 }, /* R6991 */ + { 0x0000, 0x0000, 0x0000 }, /* R6992 */ + { 0x0000, 0x0000, 0x0000 }, /* R6993 */ + { 0x0000, 0x0000, 0x0000 }, /* R6994 */ + { 0x0000, 0x0000, 0x0000 }, /* R6995 */ + { 0x0000, 0x0000, 0x0000 }, /* R6996 */ + { 0x0000, 0x0000, 0x0000 }, /* R6997 */ + { 0x0000, 0x0000, 0x0000 }, /* R6998 */ + { 0x0000, 0x0000, 0x0000 }, /* R6999 */ + { 0x0000, 0x0000, 0x0000 }, /* R7000 */ + { 0x0000, 0x0000, 0x0000 }, /* R7001 */ + { 0x0000, 0x0000, 0x0000 }, /* R7002 */ + { 0x0000, 0x0000, 0x0000 }, /* R7003 */ + { 0x0000, 0x0000, 0x0000 }, /* R7004 */ + { 0x0000, 0x0000, 0x0000 }, /* R7005 */ + { 0x0000, 0x0000, 0x0000 }, /* R7006 */ + { 0x0000, 0x0000, 0x0000 }, /* R7007 */ + { 0x0000, 0x0000, 0x0000 }, /* R7008 */ + { 0x0000, 0x0000, 0x0000 }, /* R7009 */ + { 0x0000, 0x0000, 0x0000 }, /* R7010 */ + { 0x0000, 0x0000, 0x0000 }, /* R7011 */ + { 0x0000, 0x0000, 0x0000 }, /* R7012 */ + { 0x0000, 0x0000, 0x0000 }, /* R7013 */ + { 0x0000, 0x0000, 0x0000 }, /* R7014 */ + { 0x0000, 0x0000, 0x0000 }, /* R7015 */ + { 0x0000, 0x0000, 0x0000 }, /* R7016 */ + { 0x0000, 0x0000, 0x0000 }, /* R7017 */ + { 0x0000, 0x0000, 0x0000 }, /* R7018 */ + { 0x0000, 0x0000, 0x0000 }, /* R7019 */ + { 0x0000, 0x0000, 0x0000 }, /* R7020 */ + { 0x0000, 0x0000, 0x0000 }, /* R7021 */ + { 0x0000, 0x0000, 0x0000 }, /* R7022 */ + { 0x0000, 0x0000, 0x0000 }, /* R7023 */ + { 0x0000, 0x0000, 0x0000 }, /* R7024 */ + { 0x0000, 0x0000, 0x0000 }, /* R7025 */ + { 0x0000, 0x0000, 0x0000 }, /* R7026 */ + { 0x0000, 0x0000, 0x0000 }, /* R7027 */ + { 0x0000, 0x0000, 0x0000 }, /* R7028 */ + { 0x0000, 0x0000, 0x0000 }, /* R7029 */ + { 0x0000, 0x0000, 0x0000 }, /* R7030 */ + { 0x0000, 0x0000, 0x0000 }, /* R7031 */ + { 0x0000, 0x0000, 0x0000 }, /* R7032 */ + { 0x0000, 0x0000, 0x0000 }, /* R7033 */ + { 0x0000, 0x0000, 0x0000 }, /* R7034 */ + { 0x0000, 0x0000, 0x0000 }, /* R7035 */ + { 0x0000, 0x0000, 0x0000 }, /* R7036 */ + { 0x0000, 0x0000, 0x0000 }, /* R7037 */ + { 0x0000, 0x0000, 0x0000 }, /* R7038 */ + { 0x0000, 0x0000, 0x0000 }, /* R7039 */ + { 0x0000, 0x0000, 0x0000 }, /* R7040 */ + { 0x0000, 0x0000, 0x0000 }, /* R7041 */ + { 0x0000, 0x0000, 0x0000 }, /* R7042 */ + { 0x0000, 0x0000, 0x0000 }, /* R7043 */ + { 0x0000, 0x0000, 0x0000 }, /* R7044 */ + { 0x0000, 0x0000, 0x0000 }, /* R7045 */ + { 0x0000, 0x0000, 0x0000 }, /* R7046 */ + { 0x0000, 0x0000, 0x0000 }, /* R7047 */ + { 0x0000, 0x0000, 0x0000 }, /* R7048 */ + { 0x0000, 0x0000, 0x0000 }, /* R7049 */ + { 0x0000, 0x0000, 0x0000 }, /* R7050 */ + { 0x0000, 0x0000, 0x0000 }, /* R7051 */ + { 0x0000, 0x0000, 0x0000 }, /* R7052 */ + { 0x0000, 0x0000, 0x0000 }, /* R7053 */ + { 0x0000, 0x0000, 0x0000 }, /* R7054 */ + { 0x0000, 0x0000, 0x0000 }, /* R7055 */ + { 0x0000, 0x0000, 0x0000 }, /* R7056 */ + { 0x0000, 0x0000, 0x0000 }, /* R7057 */ + { 0x0000, 0x0000, 0x0000 }, /* R7058 */ + { 0x0000, 0x0000, 0x0000 }, /* R7059 */ + { 0x0000, 0x0000, 0x0000 }, /* R7060 */ + { 0x0000, 0x0000, 0x0000 }, /* R7061 */ + { 0x0000, 0x0000, 0x0000 }, /* R7062 */ + { 0x0000, 0x0000, 0x0000 }, /* R7063 */ + { 0x0000, 0x0000, 0x0000 }, /* R7064 */ + { 0x0000, 0x0000, 0x0000 }, /* R7065 */ + { 0x0000, 0x0000, 0x0000 }, /* R7066 */ + { 0x0000, 0x0000, 0x0000 }, /* R7067 */ + { 0x0000, 0x0000, 0x0000 }, /* R7068 */ + { 0x0000, 0x0000, 0x0000 }, /* R7069 */ + { 0x0000, 0x0000, 0x0000 }, /* R7070 */ + { 0x0000, 0x0000, 0x0000 }, /* R7071 */ + { 0x0000, 0x0000, 0x0000 }, /* R7072 */ + { 0x0000, 0x0000, 0x0000 }, /* R7073 */ + { 0x0000, 0x0000, 0x0000 }, /* R7074 */ + { 0x0000, 0x0000, 0x0000 }, /* R7075 */ + { 0x0000, 0x0000, 0x0000 }, /* R7076 */ + { 0x0000, 0x0000, 0x0000 }, /* R7077 */ + { 0x0000, 0x0000, 0x0000 }, /* R7078 */ + { 0x0000, 0x0000, 0x0000 }, /* R7079 */ + { 0x0000, 0x0000, 0x0000 }, /* R7080 */ + { 0x0000, 0x0000, 0x0000 }, /* R7081 */ + { 0x0000, 0x0000, 0x0000 }, /* R7082 */ + { 0x0000, 0x0000, 0x0000 }, /* R7083 */ + { 0x0000, 0x0000, 0x0000 }, /* R7084 */ + { 0x0000, 0x0000, 0x0000 }, /* R7085 */ + { 0x0000, 0x0000, 0x0000 }, /* R7086 */ + { 0x0000, 0x0000, 0x0000 }, /* R7087 */ + { 0x0000, 0x0000, 0x0000 }, /* R7088 */ + { 0x0000, 0x0000, 0x0000 }, /* R7089 */ + { 0x0000, 0x0000, 0x0000 }, /* R7090 */ + { 0x0000, 0x0000, 0x0000 }, /* R7091 */ + { 0x0000, 0x0000, 0x0000 }, /* R7092 */ + { 0x0000, 0x0000, 0x0000 }, /* R7093 */ + { 0x0000, 0x0000, 0x0000 }, /* R7094 */ + { 0x0000, 0x0000, 0x0000 }, /* R7095 */ + { 0x0000, 0x0000, 0x0000 }, /* R7096 */ + { 0x0000, 0x0000, 0x0000 }, /* R7097 */ + { 0x0000, 0x0000, 0x0000 }, /* R7098 */ + { 0x0000, 0x0000, 0x0000 }, /* R7099 */ + { 0x0000, 0x0000, 0x0000 }, /* R7100 */ + { 0x0000, 0x0000, 0x0000 }, /* R7101 */ + { 0x0000, 0x0000, 0x0000 }, /* R7102 */ + { 0x0000, 0x0000, 0x0000 }, /* R7103 */ + { 0x0000, 0x0000, 0x0000 }, /* R7104 */ + { 0x0000, 0x0000, 0x0000 }, /* R7105 */ + { 0x0000, 0x0000, 0x0000 }, /* R7106 */ + { 0x0000, 0x0000, 0x0000 }, /* R7107 */ + { 0x0000, 0x0000, 0x0000 }, /* R7108 */ + { 0x0000, 0x0000, 0x0000 }, /* R7109 */ + { 0x0000, 0x0000, 0x0000 }, /* R7110 */ + { 0x0000, 0x0000, 0x0000 }, /* R7111 */ + { 0x0000, 0x0000, 0x0000 }, /* R7112 */ + { 0x0000, 0x0000, 0x0000 }, /* R7113 */ + { 0x0000, 0x0000, 0x0000 }, /* R7114 */ + { 0x0000, 0x0000, 0x0000 }, /* R7115 */ + { 0x0000, 0x0000, 0x0000 }, /* R7116 */ + { 0x0000, 0x0000, 0x0000 }, /* R7117 */ + { 0x0000, 0x0000, 0x0000 }, /* R7118 */ + { 0x0000, 0x0000, 0x0000 }, /* R7119 */ + { 0x0000, 0x0000, 0x0000 }, /* R7120 */ + { 0x0000, 0x0000, 0x0000 }, /* R7121 */ + { 0x0000, 0x0000, 0x0000 }, /* R7122 */ + { 0x0000, 0x0000, 0x0000 }, /* R7123 */ + { 0x0000, 0x0000, 0x0000 }, /* R7124 */ + { 0x0000, 0x0000, 0x0000 }, /* R7125 */ + { 0x0000, 0x0000, 0x0000 }, /* R7126 */ + { 0x0000, 0x0000, 0x0000 }, /* R7127 */ + { 0x0000, 0x0000, 0x0000 }, /* R7128 */ + { 0x0000, 0x0000, 0x0000 }, /* R7129 */ + { 0x0000, 0x0000, 0x0000 }, /* R7130 */ + { 0x0000, 0x0000, 0x0000 }, /* R7131 */ + { 0x0000, 0x0000, 0x0000 }, /* R7132 */ + { 0x0000, 0x0000, 0x0000 }, /* R7133 */ + { 0x0000, 0x0000, 0x0000 }, /* R7134 */ + { 0x0000, 0x0000, 0x0000 }, /* R7135 */ + { 0x0000, 0x0000, 0x0000 }, /* R7136 */ + { 0x0000, 0x0000, 0x0000 }, /* R7137 */ + { 0x0000, 0x0000, 0x0000 }, /* R7138 */ + { 0x0000, 0x0000, 0x0000 }, /* R7139 */ + { 0x0000, 0x0000, 0x0000 }, /* R7140 */ + { 0x0000, 0x0000, 0x0000 }, /* R7141 */ + { 0x0000, 0x0000, 0x0000 }, /* R7142 */ + { 0x0000, 0x0000, 0x0000 }, /* R7143 */ + { 0x0000, 0x0000, 0x0000 }, /* R7144 */ + { 0x0000, 0x0000, 0x0000 }, /* R7145 */ + { 0x0000, 0x0000, 0x0000 }, /* R7146 */ + { 0x0000, 0x0000, 0x0000 }, /* R7147 */ + { 0x0000, 0x0000, 0x0000 }, /* R7148 */ + { 0x0000, 0x0000, 0x0000 }, /* R7149 */ + { 0x0000, 0x0000, 0x0000 }, /* R7150 */ + { 0x0000, 0x0000, 0x0000 }, /* R7151 */ + { 0x0000, 0x0000, 0x0000 }, /* R7152 */ + { 0x0000, 0x0000, 0x0000 }, /* R7153 */ + { 0x0000, 0x0000, 0x0000 }, /* R7154 */ + { 0x0000, 0x0000, 0x0000 }, /* R7155 */ + { 0x0000, 0x0000, 0x0000 }, /* R7156 */ + { 0x0000, 0x0000, 0x0000 }, /* R7157 */ + { 0x0000, 0x0000, 0x0000 }, /* R7158 */ + { 0x0000, 0x0000, 0x0000 }, /* R7159 */ + { 0x0000, 0x0000, 0x0000 }, /* R7160 */ + { 0x0000, 0x0000, 0x0000 }, /* R7161 */ + { 0x0000, 0x0000, 0x0000 }, /* R7162 */ + { 0x0000, 0x0000, 0x0000 }, /* R7163 */ + { 0x0000, 0x0000, 0x0000 }, /* R7164 */ + { 0x0000, 0x0000, 0x0000 }, /* R7165 */ + { 0x0000, 0x0000, 0x0000 }, /* R7166 */ + { 0x0000, 0x0000, 0x0000 }, /* R7167 */ + { 0x0000, 0x0000, 0x0000 }, /* R7168 */ + { 0x0000, 0x0000, 0x0000 }, /* R7169 */ + { 0x0000, 0x0000, 0x0000 }, /* R7170 */ + { 0x0000, 0x0000, 0x0000 }, /* R7171 */ + { 0x0000, 0x0000, 0x0000 }, /* R7172 */ + { 0x0000, 0x0000, 0x0000 }, /* R7173 */ + { 0x0000, 0x0000, 0x0000 }, /* R7174 */ + { 0x0000, 0x0000, 0x0000 }, /* R7175 */ + { 0x0000, 0x0000, 0x0000 }, /* R7176 */ + { 0x0000, 0x0000, 0x0000 }, /* R7177 */ + { 0x0000, 0x0000, 0x0000 }, /* R7178 */ + { 0x0000, 0x0000, 0x0000 }, /* R7179 */ + { 0x0000, 0x0000, 0x0000 }, /* R7180 */ + { 0x0000, 0x0000, 0x0000 }, /* R7181 */ + { 0x0000, 0x0000, 0x0000 }, /* R7182 */ + { 0x0000, 0x0000, 0x0000 }, /* R7183 */ + { 0x0000, 0x0000, 0x0000 }, /* R7184 */ + { 0x0000, 0x0000, 0x0000 }, /* R7185 */ + { 0x0000, 0x0000, 0x0000 }, /* R7186 */ + { 0x0000, 0x0000, 0x0000 }, /* R7187 */ + { 0x0000, 0x0000, 0x0000 }, /* R7188 */ + { 0x0000, 0x0000, 0x0000 }, /* R7189 */ + { 0x0000, 0x0000, 0x0000 }, /* R7190 */ + { 0x0000, 0x0000, 0x0000 }, /* R7191 */ + { 0x0000, 0x0000, 0x0000 }, /* R7192 */ + { 0x0000, 0x0000, 0x0000 }, /* R7193 */ + { 0x0000, 0x0000, 0x0000 }, /* R7194 */ + { 0x0000, 0x0000, 0x0000 }, /* R7195 */ + { 0x0000, 0x0000, 0x0000 }, /* R7196 */ + { 0x0000, 0x0000, 0x0000 }, /* R7197 */ + { 0x0000, 0x0000, 0x0000 }, /* R7198 */ + { 0x0000, 0x0000, 0x0000 }, /* R7199 */ + { 0x0000, 0x0000, 0x0000 }, /* R7200 */ + { 0x0000, 0x0000, 0x0000 }, /* R7201 */ + { 0x0000, 0x0000, 0x0000 }, /* R7202 */ + { 0x0000, 0x0000, 0x0000 }, /* R7203 */ + { 0x0000, 0x0000, 0x0000 }, /* R7204 */ + { 0x0000, 0x0000, 0x0000 }, /* R7205 */ + { 0x0000, 0x0000, 0x0000 }, /* R7206 */ + { 0x0000, 0x0000, 0x0000 }, /* R7207 */ + { 0x0000, 0x0000, 0x0000 }, /* R7208 */ + { 0x0000, 0x0000, 0x0000 }, /* R7209 */ + { 0x0000, 0x0000, 0x0000 }, /* R7210 */ + { 0x0000, 0x0000, 0x0000 }, /* R7211 */ + { 0x0000, 0x0000, 0x0000 }, /* R7212 */ + { 0x0000, 0x0000, 0x0000 }, /* R7213 */ + { 0x0000, 0x0000, 0x0000 }, /* R7214 */ + { 0x0000, 0x0000, 0x0000 }, /* R7215 */ + { 0x0000, 0x0000, 0x0000 }, /* R7216 */ + { 0x0000, 0x0000, 0x0000 }, /* R7217 */ + { 0x0000, 0x0000, 0x0000 }, /* R7218 */ + { 0x0000, 0x0000, 0x0000 }, /* R7219 */ + { 0x0000, 0x0000, 0x0000 }, /* R7220 */ + { 0x0000, 0x0000, 0x0000 }, /* R7221 */ + { 0x0000, 0x0000, 0x0000 }, /* R7222 */ + { 0x0000, 0x0000, 0x0000 }, /* R7223 */ + { 0x0000, 0x0000, 0x0000 }, /* R7224 */ + { 0x0000, 0x0000, 0x0000 }, /* R7225 */ + { 0x0000, 0x0000, 0x0000 }, /* R7226 */ + { 0x0000, 0x0000, 0x0000 }, /* R7227 */ + { 0x0000, 0x0000, 0x0000 }, /* R7228 */ + { 0x0000, 0x0000, 0x0000 }, /* R7229 */ + { 0x0000, 0x0000, 0x0000 }, /* R7230 */ + { 0x0000, 0x0000, 0x0000 }, /* R7231 */ + { 0x0000, 0x0000, 0x0000 }, /* R7232 */ + { 0x0000, 0x0000, 0x0000 }, /* R7233 */ + { 0x0000, 0x0000, 0x0000 }, /* R7234 */ + { 0x0000, 0x0000, 0x0000 }, /* R7235 */ + { 0x0000, 0x0000, 0x0000 }, /* R7236 */ + { 0x0000, 0x0000, 0x0000 }, /* R7237 */ + { 0x0000, 0x0000, 0x0000 }, /* R7238 */ + { 0x0000, 0x0000, 0x0000 }, /* R7239 */ + { 0x0000, 0x0000, 0x0000 }, /* R7240 */ + { 0x0000, 0x0000, 0x0000 }, /* R7241 */ + { 0x0000, 0x0000, 0x0000 }, /* R7242 */ + { 0x0000, 0x0000, 0x0000 }, /* R7243 */ + { 0x0000, 0x0000, 0x0000 }, /* R7244 */ + { 0x0000, 0x0000, 0x0000 }, /* R7245 */ + { 0x0000, 0x0000, 0x0000 }, /* R7246 */ + { 0x0000, 0x0000, 0x0000 }, /* R7247 */ + { 0x0000, 0x0000, 0x0000 }, /* R7248 */ + { 0x0000, 0x0000, 0x0000 }, /* R7249 */ + { 0x0000, 0x0000, 0x0000 }, /* R7250 */ + { 0x0000, 0x0000, 0x0000 }, /* R7251 */ + { 0x0000, 0x0000, 0x0000 }, /* R7252 */ + { 0x0000, 0x0000, 0x0000 }, /* R7253 */ + { 0x0000, 0x0000, 0x0000 }, /* R7254 */ + { 0x0000, 0x0000, 0x0000 }, /* R7255 */ + { 0x0000, 0x0000, 0x0000 }, /* R7256 */ + { 0x0000, 0x0000, 0x0000 }, /* R7257 */ + { 0x0000, 0x0000, 0x0000 }, /* R7258 */ + { 0x0000, 0x0000, 0x0000 }, /* R7259 */ + { 0x0000, 0x0000, 0x0000 }, /* R7260 */ + { 0x0000, 0x0000, 0x0000 }, /* R7261 */ + { 0x0000, 0x0000, 0x0000 }, /* R7262 */ + { 0x0000, 0x0000, 0x0000 }, /* R7263 */ + { 0x0000, 0x0000, 0x0000 }, /* R7264 */ + { 0x0000, 0x0000, 0x0000 }, /* R7265 */ + { 0x0000, 0x0000, 0x0000 }, /* R7266 */ + { 0x0000, 0x0000, 0x0000 }, /* R7267 */ + { 0x0000, 0x0000, 0x0000 }, /* R7268 */ + { 0x0000, 0x0000, 0x0000 }, /* R7269 */ + { 0x0000, 0x0000, 0x0000 }, /* R7270 */ + { 0x0000, 0x0000, 0x0000 }, /* R7271 */ + { 0x0000, 0x0000, 0x0000 }, /* R7272 */ + { 0x0000, 0x0000, 0x0000 }, /* R7273 */ + { 0x0000, 0x0000, 0x0000 }, /* R7274 */ + { 0x0000, 0x0000, 0x0000 }, /* R7275 */ + { 0x0000, 0x0000, 0x0000 }, /* R7276 */ + { 0x0000, 0x0000, 0x0000 }, /* R7277 */ + { 0x0000, 0x0000, 0x0000 }, /* R7278 */ + { 0x0000, 0x0000, 0x0000 }, /* R7279 */ + { 0x0000, 0x0000, 0x0000 }, /* R7280 */ + { 0x0000, 0x0000, 0x0000 }, /* R7281 */ + { 0x0000, 0x0000, 0x0000 }, /* R7282 */ + { 0x0000, 0x0000, 0x0000 }, /* R7283 */ + { 0x0000, 0x0000, 0x0000 }, /* R7284 */ + { 0x0000, 0x0000, 0x0000 }, /* R7285 */ + { 0x0000, 0x0000, 0x0000 }, /* R7286 */ + { 0x0000, 0x0000, 0x0000 }, /* R7287 */ + { 0x0000, 0x0000, 0x0000 }, /* R7288 */ + { 0x0000, 0x0000, 0x0000 }, /* R7289 */ + { 0x0000, 0x0000, 0x0000 }, /* R7290 */ + { 0x0000, 0x0000, 0x0000 }, /* R7291 */ + { 0x0000, 0x0000, 0x0000 }, /* R7292 */ + { 0x0000, 0x0000, 0x0000 }, /* R7293 */ + { 0x0000, 0x0000, 0x0000 }, /* R7294 */ + { 0x0000, 0x0000, 0x0000 }, /* R7295 */ + { 0x0000, 0x0000, 0x0000 }, /* R7296 */ + { 0x0000, 0x0000, 0x0000 }, /* R7297 */ + { 0x0000, 0x0000, 0x0000 }, /* R7298 */ + { 0x0000, 0x0000, 0x0000 }, /* R7299 */ + { 0x0000, 0x0000, 0x0000 }, /* R7300 */ + { 0x0000, 0x0000, 0x0000 }, /* R7301 */ + { 0x0000, 0x0000, 0x0000 }, /* R7302 */ + { 0x0000, 0x0000, 0x0000 }, /* R7303 */ + { 0x0000, 0x0000, 0x0000 }, /* R7304 */ + { 0x0000, 0x0000, 0x0000 }, /* R7305 */ + { 0x0000, 0x0000, 0x0000 }, /* R7306 */ + { 0x0000, 0x0000, 0x0000 }, /* R7307 */ + { 0x0000, 0x0000, 0x0000 }, /* R7308 */ + { 0x0000, 0x0000, 0x0000 }, /* R7309 */ + { 0x0000, 0x0000, 0x0000 }, /* R7310 */ + { 0x0000, 0x0000, 0x0000 }, /* R7311 */ + { 0x0000, 0x0000, 0x0000 }, /* R7312 */ + { 0x0000, 0x0000, 0x0000 }, /* R7313 */ + { 0x0000, 0x0000, 0x0000 }, /* R7314 */ + { 0x0000, 0x0000, 0x0000 }, /* R7315 */ + { 0x0000, 0x0000, 0x0000 }, /* R7316 */ + { 0x0000, 0x0000, 0x0000 }, /* R7317 */ + { 0x0000, 0x0000, 0x0000 }, /* R7318 */ + { 0x0000, 0x0000, 0x0000 }, /* R7319 */ + { 0x0000, 0x0000, 0x0000 }, /* R7320 */ + { 0x0000, 0x0000, 0x0000 }, /* R7321 */ + { 0x0000, 0x0000, 0x0000 }, /* R7322 */ + { 0x0000, 0x0000, 0x0000 }, /* R7323 */ + { 0x0000, 0x0000, 0x0000 }, /* R7324 */ + { 0x0000, 0x0000, 0x0000 }, /* R7325 */ + { 0x0000, 0x0000, 0x0000 }, /* R7326 */ + { 0x0000, 0x0000, 0x0000 }, /* R7327 */ + { 0x0000, 0x0000, 0x0000 }, /* R7328 */ + { 0x0000, 0x0000, 0x0000 }, /* R7329 */ + { 0x0000, 0x0000, 0x0000 }, /* R7330 */ + { 0x0000, 0x0000, 0x0000 }, /* R7331 */ + { 0x0000, 0x0000, 0x0000 }, /* R7332 */ + { 0x0000, 0x0000, 0x0000 }, /* R7333 */ + { 0x0000, 0x0000, 0x0000 }, /* R7334 */ + { 0x0000, 0x0000, 0x0000 }, /* R7335 */ + { 0x0000, 0x0000, 0x0000 }, /* R7336 */ + { 0x0000, 0x0000, 0x0000 }, /* R7337 */ + { 0x0000, 0x0000, 0x0000 }, /* R7338 */ + { 0x0000, 0x0000, 0x0000 }, /* R7339 */ + { 0x0000, 0x0000, 0x0000 }, /* R7340 */ + { 0x0000, 0x0000, 0x0000 }, /* R7341 */ + { 0x0000, 0x0000, 0x0000 }, /* R7342 */ + { 0x0000, 0x0000, 0x0000 }, /* R7343 */ + { 0x0000, 0x0000, 0x0000 }, /* R7344 */ + { 0x0000, 0x0000, 0x0000 }, /* R7345 */ + { 0x0000, 0x0000, 0x0000 }, /* R7346 */ + { 0x0000, 0x0000, 0x0000 }, /* R7347 */ + { 0x0000, 0x0000, 0x0000 }, /* R7348 */ + { 0x0000, 0x0000, 0x0000 }, /* R7349 */ + { 0x0000, 0x0000, 0x0000 }, /* R7350 */ + { 0x0000, 0x0000, 0x0000 }, /* R7351 */ + { 0x0000, 0x0000, 0x0000 }, /* R7352 */ + { 0x0000, 0x0000, 0x0000 }, /* R7353 */ + { 0x0000, 0x0000, 0x0000 }, /* R7354 */ + { 0x0000, 0x0000, 0x0000 }, /* R7355 */ + { 0x0000, 0x0000, 0x0000 }, /* R7356 */ + { 0x0000, 0x0000, 0x0000 }, /* R7357 */ + { 0x0000, 0x0000, 0x0000 }, /* R7358 */ + { 0x0000, 0x0000, 0x0000 }, /* R7359 */ + { 0x0000, 0x0000, 0x0000 }, /* R7360 */ + { 0x0000, 0x0000, 0x0000 }, /* R7361 */ + { 0x0000, 0x0000, 0x0000 }, /* R7362 */ + { 0x0000, 0x0000, 0x0000 }, /* R7363 */ + { 0x0000, 0x0000, 0x0000 }, /* R7364 */ + { 0x0000, 0x0000, 0x0000 }, /* R7365 */ + { 0x0000, 0x0000, 0x0000 }, /* R7366 */ + { 0x0000, 0x0000, 0x0000 }, /* R7367 */ + { 0x0000, 0x0000, 0x0000 }, /* R7368 */ + { 0x0000, 0x0000, 0x0000 }, /* R7369 */ + { 0x0000, 0x0000, 0x0000 }, /* R7370 */ + { 0x0000, 0x0000, 0x0000 }, /* R7371 */ + { 0x0000, 0x0000, 0x0000 }, /* R7372 */ + { 0x0000, 0x0000, 0x0000 }, /* R7373 */ + { 0x0000, 0x0000, 0x0000 }, /* R7374 */ + { 0x0000, 0x0000, 0x0000 }, /* R7375 */ + { 0x0000, 0x0000, 0x0000 }, /* R7376 */ + { 0x0000, 0x0000, 0x0000 }, /* R7377 */ + { 0x0000, 0x0000, 0x0000 }, /* R7378 */ + { 0x0000, 0x0000, 0x0000 }, /* R7379 */ + { 0x0000, 0x0000, 0x0000 }, /* R7380 */ + { 0x0000, 0x0000, 0x0000 }, /* R7381 */ + { 0x0000, 0x0000, 0x0000 }, /* R7382 */ + { 0x0000, 0x0000, 0x0000 }, /* R7383 */ + { 0x0000, 0x0000, 0x0000 }, /* R7384 */ + { 0x0000, 0x0000, 0x0000 }, /* R7385 */ + { 0x0000, 0x0000, 0x0000 }, /* R7386 */ + { 0x0000, 0x0000, 0x0000 }, /* R7387 */ + { 0x0000, 0x0000, 0x0000 }, /* R7388 */ + { 0x0000, 0x0000, 0x0000 }, /* R7389 */ + { 0x0000, 0x0000, 0x0000 }, /* R7390 */ + { 0x0000, 0x0000, 0x0000 }, /* R7391 */ + { 0x0000, 0x0000, 0x0000 }, /* R7392 */ + { 0x0000, 0x0000, 0x0000 }, /* R7393 */ + { 0x0000, 0x0000, 0x0000 }, /* R7394 */ + { 0x0000, 0x0000, 0x0000 }, /* R7395 */ + { 0x0000, 0x0000, 0x0000 }, /* R7396 */ + { 0x0000, 0x0000, 0x0000 }, /* R7397 */ + { 0x0000, 0x0000, 0x0000 }, /* R7398 */ + { 0x0000, 0x0000, 0x0000 }, /* R7399 */ + { 0x0000, 0x0000, 0x0000 }, /* R7400 */ + { 0x0000, 0x0000, 0x0000 }, /* R7401 */ + { 0x0000, 0x0000, 0x0000 }, /* R7402 */ + { 0x0000, 0x0000, 0x0000 }, /* R7403 */ + { 0x0000, 0x0000, 0x0000 }, /* R7404 */ + { 0x0000, 0x0000, 0x0000 }, /* R7405 */ + { 0x0000, 0x0000, 0x0000 }, /* R7406 */ + { 0x0000, 0x0000, 0x0000 }, /* R7407 */ + { 0x0000, 0x0000, 0x0000 }, /* R7408 */ + { 0x0000, 0x0000, 0x0000 }, /* R7409 */ + { 0x0000, 0x0000, 0x0000 }, /* R7410 */ + { 0x0000, 0x0000, 0x0000 }, /* R7411 */ + { 0x0000, 0x0000, 0x0000 }, /* R7412 */ + { 0x0000, 0x0000, 0x0000 }, /* R7413 */ + { 0x0000, 0x0000, 0x0000 }, /* R7414 */ + { 0x0000, 0x0000, 0x0000 }, /* R7415 */ + { 0x0000, 0x0000, 0x0000 }, /* R7416 */ + { 0x0000, 0x0000, 0x0000 }, /* R7417 */ + { 0x0000, 0x0000, 0x0000 }, /* R7418 */ + { 0x0000, 0x0000, 0x0000 }, /* R7419 */ + { 0x0000, 0x0000, 0x0000 }, /* R7420 */ + { 0x0000, 0x0000, 0x0000 }, /* R7421 */ + { 0x0000, 0x0000, 0x0000 }, /* R7422 */ + { 0x0000, 0x0000, 0x0000 }, /* R7423 */ + { 0x0000, 0x0000, 0x0000 }, /* R7424 */ + { 0x0000, 0x0000, 0x0000 }, /* R7425 */ + { 0x0000, 0x0000, 0x0000 }, /* R7426 */ + { 0x0000, 0x0000, 0x0000 }, /* R7427 */ + { 0x0000, 0x0000, 0x0000 }, /* R7428 */ + { 0x0000, 0x0000, 0x0000 }, /* R7429 */ + { 0x0000, 0x0000, 0x0000 }, /* R7430 */ + { 0x0000, 0x0000, 0x0000 }, /* R7431 */ + { 0x0000, 0x0000, 0x0000 }, /* R7432 */ + { 0x0000, 0x0000, 0x0000 }, /* R7433 */ + { 0x0000, 0x0000, 0x0000 }, /* R7434 */ + { 0x0000, 0x0000, 0x0000 }, /* R7435 */ + { 0x0000, 0x0000, 0x0000 }, /* R7436 */ + { 0x0000, 0x0000, 0x0000 }, /* R7437 */ + { 0x0000, 0x0000, 0x0000 }, /* R7438 */ + { 0x0000, 0x0000, 0x0000 }, /* R7439 */ + { 0x0000, 0x0000, 0x0000 }, /* R7440 */ + { 0x0000, 0x0000, 0x0000 }, /* R7441 */ + { 0x0000, 0x0000, 0x0000 }, /* R7442 */ + { 0x0000, 0x0000, 0x0000 }, /* R7443 */ + { 0x0000, 0x0000, 0x0000 }, /* R7444 */ + { 0x0000, 0x0000, 0x0000 }, /* R7445 */ + { 0x0000, 0x0000, 0x0000 }, /* R7446 */ + { 0x0000, 0x0000, 0x0000 }, /* R7447 */ + { 0x0000, 0x0000, 0x0000 }, /* R7448 */ + { 0x0000, 0x0000, 0x0000 }, /* R7449 */ + { 0x0000, 0x0000, 0x0000 }, /* R7450 */ + { 0x0000, 0x0000, 0x0000 }, /* R7451 */ + { 0x0000, 0x0000, 0x0000 }, /* R7452 */ + { 0x0000, 0x0000, 0x0000 }, /* R7453 */ + { 0x0000, 0x0000, 0x0000 }, /* R7454 */ + { 0x0000, 0x0000, 0x0000 }, /* R7455 */ + { 0x0000, 0x0000, 0x0000 }, /* R7456 */ + { 0x0000, 0x0000, 0x0000 }, /* R7457 */ + { 0x0000, 0x0000, 0x0000 }, /* R7458 */ + { 0x0000, 0x0000, 0x0000 }, /* R7459 */ + { 0x0000, 0x0000, 0x0000 }, /* R7460 */ + { 0x0000, 0x0000, 0x0000 }, /* R7461 */ + { 0x0000, 0x0000, 0x0000 }, /* R7462 */ + { 0x0000, 0x0000, 0x0000 }, /* R7463 */ + { 0x0000, 0x0000, 0x0000 }, /* R7464 */ + { 0x0000, 0x0000, 0x0000 }, /* R7465 */ + { 0x0000, 0x0000, 0x0000 }, /* R7466 */ + { 0x0000, 0x0000, 0x0000 }, /* R7467 */ + { 0x0000, 0x0000, 0x0000 }, /* R7468 */ + { 0x0000, 0x0000, 0x0000 }, /* R7469 */ + { 0x0000, 0x0000, 0x0000 }, /* R7470 */ + { 0x0000, 0x0000, 0x0000 }, /* R7471 */ + { 0x0000, 0x0000, 0x0000 }, /* R7472 */ + { 0x0000, 0x0000, 0x0000 }, /* R7473 */ + { 0x0000, 0x0000, 0x0000 }, /* R7474 */ + { 0x0000, 0x0000, 0x0000 }, /* R7475 */ + { 0x0000, 0x0000, 0x0000 }, /* R7476 */ + { 0x0000, 0x0000, 0x0000 }, /* R7477 */ + { 0x0000, 0x0000, 0x0000 }, /* R7478 */ + { 0x0000, 0x0000, 0x0000 }, /* R7479 */ + { 0x0000, 0x0000, 0x0000 }, /* R7480 */ + { 0x0000, 0x0000, 0x0000 }, /* R7481 */ + { 0x0000, 0x0000, 0x0000 }, /* R7482 */ + { 0x0000, 0x0000, 0x0000 }, /* R7483 */ + { 0x0000, 0x0000, 0x0000 }, /* R7484 */ + { 0x0000, 0x0000, 0x0000 }, /* R7485 */ + { 0x0000, 0x0000, 0x0000 }, /* R7486 */ + { 0x0000, 0x0000, 0x0000 }, /* R7487 */ + { 0x0000, 0x0000, 0x0000 }, /* R7488 */ + { 0x0000, 0x0000, 0x0000 }, /* R7489 */ + { 0x0000, 0x0000, 0x0000 }, /* R7490 */ + { 0x0000, 0x0000, 0x0000 }, /* R7491 */ + { 0x0000, 0x0000, 0x0000 }, /* R7492 */ + { 0x0000, 0x0000, 0x0000 }, /* R7493 */ + { 0x0000, 0x0000, 0x0000 }, /* R7494 */ + { 0x0000, 0x0000, 0x0000 }, /* R7495 */ + { 0x0000, 0x0000, 0x0000 }, /* R7496 */ + { 0x0000, 0x0000, 0x0000 }, /* R7497 */ + { 0x0000, 0x0000, 0x0000 }, /* R7498 */ + { 0x0000, 0x0000, 0x0000 }, /* R7499 */ + { 0x0000, 0x0000, 0x0000 }, /* R7500 */ + { 0x0000, 0x0000, 0x0000 }, /* R7501 */ + { 0x0000, 0x0000, 0x0000 }, /* R7502 */ + { 0x0000, 0x0000, 0x0000 }, /* R7503 */ + { 0x0000, 0x0000, 0x0000 }, /* R7504 */ + { 0x0000, 0x0000, 0x0000 }, /* R7505 */ + { 0x0000, 0x0000, 0x0000 }, /* R7506 */ + { 0x0000, 0x0000, 0x0000 }, /* R7507 */ + { 0x0000, 0x0000, 0x0000 }, /* R7508 */ + { 0x0000, 0x0000, 0x0000 }, /* R7509 */ + { 0x0000, 0x0000, 0x0000 }, /* R7510 */ + { 0x0000, 0x0000, 0x0000 }, /* R7511 */ + { 0x0000, 0x0000, 0x0000 }, /* R7512 */ + { 0x0000, 0x0000, 0x0000 }, /* R7513 */ + { 0x0000, 0x0000, 0x0000 }, /* R7514 */ + { 0x0000, 0x0000, 0x0000 }, /* R7515 */ + { 0x0000, 0x0000, 0x0000 }, /* R7516 */ + { 0x0000, 0x0000, 0x0000 }, /* R7517 */ + { 0x0000, 0x0000, 0x0000 }, /* R7518 */ + { 0x0000, 0x0000, 0x0000 }, /* R7519 */ + { 0x0000, 0x0000, 0x0000 }, /* R7520 */ + { 0x0000, 0x0000, 0x0000 }, /* R7521 */ + { 0x0000, 0x0000, 0x0000 }, /* R7522 */ + { 0x0000, 0x0000, 0x0000 }, /* R7523 */ + { 0x0000, 0x0000, 0x0000 }, /* R7524 */ + { 0x0000, 0x0000, 0x0000 }, /* R7525 */ + { 0x0000, 0x0000, 0x0000 }, /* R7526 */ + { 0x0000, 0x0000, 0x0000 }, /* R7527 */ + { 0x0000, 0x0000, 0x0000 }, /* R7528 */ + { 0x0000, 0x0000, 0x0000 }, /* R7529 */ + { 0x0000, 0x0000, 0x0000 }, /* R7530 */ + { 0x0000, 0x0000, 0x0000 }, /* R7531 */ + { 0x0000, 0x0000, 0x0000 }, /* R7532 */ + { 0x0000, 0x0000, 0x0000 }, /* R7533 */ + { 0x0000, 0x0000, 0x0000 }, /* R7534 */ + { 0x0000, 0x0000, 0x0000 }, /* R7535 */ + { 0x0000, 0x0000, 0x0000 }, /* R7536 */ + { 0x0000, 0x0000, 0x0000 }, /* R7537 */ + { 0x0000, 0x0000, 0x0000 }, /* R7538 */ + { 0x0000, 0x0000, 0x0000 }, /* R7539 */ + { 0x0000, 0x0000, 0x0000 }, /* R7540 */ + { 0x0000, 0x0000, 0x0000 }, /* R7541 */ + { 0x0000, 0x0000, 0x0000 }, /* R7542 */ + { 0x0000, 0x0000, 0x0000 }, /* R7543 */ + { 0x0000, 0x0000, 0x0000 }, /* R7544 */ + { 0x0000, 0x0000, 0x0000 }, /* R7545 */ + { 0x0000, 0x0000, 0x0000 }, /* R7546 */ + { 0x0000, 0x0000, 0x0000 }, /* R7547 */ + { 0x0000, 0x0000, 0x0000 }, /* R7548 */ + { 0x0000, 0x0000, 0x0000 }, /* R7549 */ + { 0x0000, 0x0000, 0x0000 }, /* R7550 */ + { 0x0000, 0x0000, 0x0000 }, /* R7551 */ + { 0x0000, 0x0000, 0x0000 }, /* R7552 */ + { 0x0000, 0x0000, 0x0000 }, /* R7553 */ + { 0x0000, 0x0000, 0x0000 }, /* R7554 */ + { 0x0000, 0x0000, 0x0000 }, /* R7555 */ + { 0x0000, 0x0000, 0x0000 }, /* R7556 */ + { 0x0000, 0x0000, 0x0000 }, /* R7557 */ + { 0x0000, 0x0000, 0x0000 }, /* R7558 */ + { 0x0000, 0x0000, 0x0000 }, /* R7559 */ + { 0x0000, 0x0000, 0x0000 }, /* R7560 */ + { 0x0000, 0x0000, 0x0000 }, /* R7561 */ + { 0x0000, 0x0000, 0x0000 }, /* R7562 */ + { 0x0000, 0x0000, 0x0000 }, /* R7563 */ + { 0x0000, 0x0000, 0x0000 }, /* R7564 */ + { 0x0000, 0x0000, 0x0000 }, /* R7565 */ + { 0x0000, 0x0000, 0x0000 }, /* R7566 */ + { 0x0000, 0x0000, 0x0000 }, /* R7567 */ + { 0x0000, 0x0000, 0x0000 }, /* R7568 */ + { 0x0000, 0x0000, 0x0000 }, /* R7569 */ + { 0x0000, 0x0000, 0x0000 }, /* R7570 */ + { 0x0000, 0x0000, 0x0000 }, /* R7571 */ + { 0x0000, 0x0000, 0x0000 }, /* R7572 */ + { 0x0000, 0x0000, 0x0000 }, /* R7573 */ + { 0x0000, 0x0000, 0x0000 }, /* R7574 */ + { 0x0000, 0x0000, 0x0000 }, /* R7575 */ + { 0x0000, 0x0000, 0x0000 }, /* R7576 */ + { 0x0000, 0x0000, 0x0000 }, /* R7577 */ + { 0x0000, 0x0000, 0x0000 }, /* R7578 */ + { 0x0000, 0x0000, 0x0000 }, /* R7579 */ + { 0x0000, 0x0000, 0x0000 }, /* R7580 */ + { 0x0000, 0x0000, 0x0000 }, /* R7581 */ + { 0x0000, 0x0000, 0x0000 }, /* R7582 */ + { 0x0000, 0x0000, 0x0000 }, /* R7583 */ + { 0x0000, 0x0000, 0x0000 }, /* R7584 */ + { 0x0000, 0x0000, 0x0000 }, /* R7585 */ + { 0x0000, 0x0000, 0x0000 }, /* R7586 */ + { 0x0000, 0x0000, 0x0000 }, /* R7587 */ + { 0x0000, 0x0000, 0x0000 }, /* R7588 */ + { 0x0000, 0x0000, 0x0000 }, /* R7589 */ + { 0x0000, 0x0000, 0x0000 }, /* R7590 */ + { 0x0000, 0x0000, 0x0000 }, /* R7591 */ + { 0x0000, 0x0000, 0x0000 }, /* R7592 */ + { 0x0000, 0x0000, 0x0000 }, /* R7593 */ + { 0x0000, 0x0000, 0x0000 }, /* R7594 */ + { 0x0000, 0x0000, 0x0000 }, /* R7595 */ + { 0x0000, 0x0000, 0x0000 }, /* R7596 */ + { 0x0000, 0x0000, 0x0000 }, /* R7597 */ + { 0x0000, 0x0000, 0x0000 }, /* R7598 */ + { 0x0000, 0x0000, 0x0000 }, /* R7599 */ + { 0x0000, 0x0000, 0x0000 }, /* R7600 */ + { 0x0000, 0x0000, 0x0000 }, /* R7601 */ + { 0x0000, 0x0000, 0x0000 }, /* R7602 */ + { 0x0000, 0x0000, 0x0000 }, /* R7603 */ + { 0x0000, 0x0000, 0x0000 }, /* R7604 */ + { 0x0000, 0x0000, 0x0000 }, /* R7605 */ + { 0x0000, 0x0000, 0x0000 }, /* R7606 */ + { 0x0000, 0x0000, 0x0000 }, /* R7607 */ + { 0x0000, 0x0000, 0x0000 }, /* R7608 */ + { 0x0000, 0x0000, 0x0000 }, /* R7609 */ + { 0x0000, 0x0000, 0x0000 }, /* R7610 */ + { 0x0000, 0x0000, 0x0000 }, /* R7611 */ + { 0x0000, 0x0000, 0x0000 }, /* R7612 */ + { 0x0000, 0x0000, 0x0000 }, /* R7613 */ + { 0x0000, 0x0000, 0x0000 }, /* R7614 */ + { 0x0000, 0x0000, 0x0000 }, /* R7615 */ + { 0x0000, 0x0000, 0x0000 }, /* R7616 */ + { 0x0000, 0x0000, 0x0000 }, /* R7617 */ + { 0x0000, 0x0000, 0x0000 }, /* R7618 */ + { 0x0000, 0x0000, 0x0000 }, /* R7619 */ + { 0x0000, 0x0000, 0x0000 }, /* R7620 */ + { 0x0000, 0x0000, 0x0000 }, /* R7621 */ + { 0x0000, 0x0000, 0x0000 }, /* R7622 */ + { 0x0000, 0x0000, 0x0000 }, /* R7623 */ + { 0x0000, 0x0000, 0x0000 }, /* R7624 */ + { 0x0000, 0x0000, 0x0000 }, /* R7625 */ + { 0x0000, 0x0000, 0x0000 }, /* R7626 */ + { 0x0000, 0x0000, 0x0000 }, /* R7627 */ + { 0x0000, 0x0000, 0x0000 }, /* R7628 */ + { 0x0000, 0x0000, 0x0000 }, /* R7629 */ + { 0x0000, 0x0000, 0x0000 }, /* R7630 */ + { 0x0000, 0x0000, 0x0000 }, /* R7631 */ + { 0x0000, 0x0000, 0x0000 }, /* R7632 */ + { 0x0000, 0x0000, 0x0000 }, /* R7633 */ + { 0x0000, 0x0000, 0x0000 }, /* R7634 */ + { 0x0000, 0x0000, 0x0000 }, /* R7635 */ + { 0x0000, 0x0000, 0x0000 }, /* R7636 */ + { 0x0000, 0x0000, 0x0000 }, /* R7637 */ + { 0x0000, 0x0000, 0x0000 }, /* R7638 */ + { 0x0000, 0x0000, 0x0000 }, /* R7639 */ + { 0x0000, 0x0000, 0x0000 }, /* R7640 */ + { 0x0000, 0x0000, 0x0000 }, /* R7641 */ + { 0x0000, 0x0000, 0x0000 }, /* R7642 */ + { 0x0000, 0x0000, 0x0000 }, /* R7643 */ + { 0x0000, 0x0000, 0x0000 }, /* R7644 */ + { 0x0000, 0x0000, 0x0000 }, /* R7645 */ + { 0x0000, 0x0000, 0x0000 }, /* R7646 */ + { 0x0000, 0x0000, 0x0000 }, /* R7647 */ + { 0x0000, 0x0000, 0x0000 }, /* R7648 */ + { 0x0000, 0x0000, 0x0000 }, /* R7649 */ + { 0x0000, 0x0000, 0x0000 }, /* R7650 */ + { 0x0000, 0x0000, 0x0000 }, /* R7651 */ + { 0x0000, 0x0000, 0x0000 }, /* R7652 */ + { 0x0000, 0x0000, 0x0000 }, /* R7653 */ + { 0x0000, 0x0000, 0x0000 }, /* R7654 */ + { 0x0000, 0x0000, 0x0000 }, /* R7655 */ + { 0x0000, 0x0000, 0x0000 }, /* R7656 */ + { 0x0000, 0x0000, 0x0000 }, /* R7657 */ + { 0x0000, 0x0000, 0x0000 }, /* R7658 */ + { 0x0000, 0x0000, 0x0000 }, /* R7659 */ + { 0x0000, 0x0000, 0x0000 }, /* R7660 */ + { 0x0000, 0x0000, 0x0000 }, /* R7661 */ + { 0x0000, 0x0000, 0x0000 }, /* R7662 */ + { 0x0000, 0x0000, 0x0000 }, /* R7663 */ + { 0x0000, 0x0000, 0x0000 }, /* R7664 */ + { 0x0000, 0x0000, 0x0000 }, /* R7665 */ + { 0x0000, 0x0000, 0x0000 }, /* R7666 */ + { 0x0000, 0x0000, 0x0000 }, /* R7667 */ + { 0x0000, 0x0000, 0x0000 }, /* R7668 */ + { 0x0000, 0x0000, 0x0000 }, /* R7669 */ + { 0x0000, 0x0000, 0x0000 }, /* R7670 */ + { 0x0000, 0x0000, 0x0000 }, /* R7671 */ + { 0x0000, 0x0000, 0x0000 }, /* R7672 */ + { 0x0000, 0x0000, 0x0000 }, /* R7673 */ + { 0x0000, 0x0000, 0x0000 }, /* R7674 */ + { 0x0000, 0x0000, 0x0000 }, /* R7675 */ + { 0x0000, 0x0000, 0x0000 }, /* R7676 */ + { 0x0000, 0x0000, 0x0000 }, /* R7677 */ + { 0x0000, 0x0000, 0x0000 }, /* R7678 */ + { 0x0000, 0x0000, 0x0000 }, /* R7679 */ + { 0x0000, 0x0000, 0x0000 }, /* R7680 */ + { 0x0000, 0x0000, 0x0000 }, /* R7681 */ + { 0x0000, 0x0000, 0x0000 }, /* R7682 */ + { 0x0000, 0x0000, 0x0000 }, /* R7683 */ + { 0x0000, 0x0000, 0x0000 }, /* R7684 */ + { 0x0000, 0x0000, 0x0000 }, /* R7685 */ + { 0x0000, 0x0000, 0x0000 }, /* R7686 */ + { 0x0000, 0x0000, 0x0000 }, /* R7687 */ + { 0x0000, 0x0000, 0x0000 }, /* R7688 */ + { 0x0000, 0x0000, 0x0000 }, /* R7689 */ + { 0x0000, 0x0000, 0x0000 }, /* R7690 */ + { 0x0000, 0x0000, 0x0000 }, /* R7691 */ + { 0x0000, 0x0000, 0x0000 }, /* R7692 */ + { 0x0000, 0x0000, 0x0000 }, /* R7693 */ + { 0x0000, 0x0000, 0x0000 }, /* R7694 */ + { 0x0000, 0x0000, 0x0000 }, /* R7695 */ + { 0x0000, 0x0000, 0x0000 }, /* R7696 */ + { 0x0000, 0x0000, 0x0000 }, /* R7697 */ + { 0x0000, 0x0000, 0x0000 }, /* R7698 */ + { 0x0000, 0x0000, 0x0000 }, /* R7699 */ + { 0x0000, 0x0000, 0x0000 }, /* R7700 */ + { 0x0000, 0x0000, 0x0000 }, /* R7701 */ + { 0x0000, 0x0000, 0x0000 }, /* R7702 */ + { 0x0000, 0x0000, 0x0000 }, /* R7703 */ + { 0x0000, 0x0000, 0x0000 }, /* R7704 */ + { 0x0000, 0x0000, 0x0000 }, /* R7705 */ + { 0x0000, 0x0000, 0x0000 }, /* R7706 */ + { 0x0000, 0x0000, 0x0000 }, /* R7707 */ + { 0x0000, 0x0000, 0x0000 }, /* R7708 */ + { 0x0000, 0x0000, 0x0000 }, /* R7709 */ + { 0x0000, 0x0000, 0x0000 }, /* R7710 */ + { 0x0000, 0x0000, 0x0000 }, /* R7711 */ + { 0x0000, 0x0000, 0x0000 }, /* R7712 */ + { 0x0000, 0x0000, 0x0000 }, /* R7713 */ + { 0x0000, 0x0000, 0x0000 }, /* R7714 */ + { 0x0000, 0x0000, 0x0000 }, /* R7715 */ + { 0x0000, 0x0000, 0x0000 }, /* R7716 */ + { 0x0000, 0x0000, 0x0000 }, /* R7717 */ + { 0x0000, 0x0000, 0x0000 }, /* R7718 */ + { 0x0000, 0x0000, 0x0000 }, /* R7719 */ + { 0x0000, 0x0000, 0x0000 }, /* R7720 */ + { 0x0000, 0x0000, 0x0000 }, /* R7721 */ + { 0x0000, 0x0000, 0x0000 }, /* R7722 */ + { 0x0000, 0x0000, 0x0000 }, /* R7723 */ + { 0x0000, 0x0000, 0x0000 }, /* R7724 */ + { 0x0000, 0x0000, 0x0000 }, /* R7725 */ + { 0x0000, 0x0000, 0x0000 }, /* R7726 */ + { 0x0000, 0x0000, 0x0000 }, /* R7727 */ + { 0x0000, 0x0000, 0x0000 }, /* R7728 */ + { 0x0000, 0x0000, 0x0000 }, /* R7729 */ + { 0x0000, 0x0000, 0x0000 }, /* R7730 */ + { 0x0000, 0x0000, 0x0000 }, /* R7731 */ + { 0x0000, 0x0000, 0x0000 }, /* R7732 */ + { 0x0000, 0x0000, 0x0000 }, /* R7733 */ + { 0x0000, 0x0000, 0x0000 }, /* R7734 */ + { 0x0000, 0x0000, 0x0000 }, /* R7735 */ + { 0x0000, 0x0000, 0x0000 }, /* R7736 */ + { 0x0000, 0x0000, 0x0000 }, /* R7737 */ + { 0x0000, 0x0000, 0x0000 }, /* R7738 */ + { 0x0000, 0x0000, 0x0000 }, /* R7739 */ + { 0x0000, 0x0000, 0x0000 }, /* R7740 */ + { 0x0000, 0x0000, 0x0000 }, /* R7741 */ + { 0x0000, 0x0000, 0x0000 }, /* R7742 */ + { 0x0000, 0x0000, 0x0000 }, /* R7743 */ + { 0x0000, 0x0000, 0x0000 }, /* R7744 */ + { 0x0000, 0x0000, 0x0000 }, /* R7745 */ + { 0x0000, 0x0000, 0x0000 }, /* R7746 */ + { 0x0000, 0x0000, 0x0000 }, /* R7747 */ + { 0x0000, 0x0000, 0x0000 }, /* R7748 */ + { 0x0000, 0x0000, 0x0000 }, /* R7749 */ + { 0x0000, 0x0000, 0x0000 }, /* R7750 */ + { 0x0000, 0x0000, 0x0000 }, /* R7751 */ + { 0x0000, 0x0000, 0x0000 }, /* R7752 */ + { 0x0000, 0x0000, 0x0000 }, /* R7753 */ + { 0x0000, 0x0000, 0x0000 }, /* R7754 */ + { 0x0000, 0x0000, 0x0000 }, /* R7755 */ + { 0x0000, 0x0000, 0x0000 }, /* R7756 */ + { 0x0000, 0x0000, 0x0000 }, /* R7757 */ + { 0x0000, 0x0000, 0x0000 }, /* R7758 */ + { 0x0000, 0x0000, 0x0000 }, /* R7759 */ + { 0x0000, 0x0000, 0x0000 }, /* R7760 */ + { 0x0000, 0x0000, 0x0000 }, /* R7761 */ + { 0x0000, 0x0000, 0x0000 }, /* R7762 */ + { 0x0000, 0x0000, 0x0000 }, /* R7763 */ + { 0x0000, 0x0000, 0x0000 }, /* R7764 */ + { 0x0000, 0x0000, 0x0000 }, /* R7765 */ + { 0x0000, 0x0000, 0x0000 }, /* R7766 */ + { 0x0000, 0x0000, 0x0000 }, /* R7767 */ + { 0x0000, 0x0000, 0x0000 }, /* R7768 */ + { 0x0000, 0x0000, 0x0000 }, /* R7769 */ + { 0x0000, 0x0000, 0x0000 }, /* R7770 */ + { 0x0000, 0x0000, 0x0000 }, /* R7771 */ + { 0x0000, 0x0000, 0x0000 }, /* R7772 */ + { 0x0000, 0x0000, 0x0000 }, /* R7773 */ + { 0x0000, 0x0000, 0x0000 }, /* R7774 */ + { 0x0000, 0x0000, 0x0000 }, /* R7775 */ + { 0x0000, 0x0000, 0x0000 }, /* R7776 */ + { 0x0000, 0x0000, 0x0000 }, /* R7777 */ + { 0x0000, 0x0000, 0x0000 }, /* R7778 */ + { 0x0000, 0x0000, 0x0000 }, /* R7779 */ + { 0x0000, 0x0000, 0x0000 }, /* R7780 */ + { 0x0000, 0x0000, 0x0000 }, /* R7781 */ + { 0x0000, 0x0000, 0x0000 }, /* R7782 */ + { 0x0000, 0x0000, 0x0000 }, /* R7783 */ + { 0x0000, 0x0000, 0x0000 }, /* R7784 */ + { 0x0000, 0x0000, 0x0000 }, /* R7785 */ + { 0x0000, 0x0000, 0x0000 }, /* R7786 */ + { 0x0000, 0x0000, 0x0000 }, /* R7787 */ + { 0x0000, 0x0000, 0x0000 }, /* R7788 */ + { 0x0000, 0x0000, 0x0000 }, /* R7789 */ + { 0x0000, 0x0000, 0x0000 }, /* R7790 */ + { 0x0000, 0x0000, 0x0000 }, /* R7791 */ + { 0x0000, 0x0000, 0x0000 }, /* R7792 */ + { 0x0000, 0x0000, 0x0000 }, /* R7793 */ + { 0x0000, 0x0000, 0x0000 }, /* R7794 */ + { 0x0000, 0x0000, 0x0000 }, /* R7795 */ + { 0x0000, 0x0000, 0x0000 }, /* R7796 */ + { 0x0000, 0x0000, 0x0000 }, /* R7797 */ + { 0x0000, 0x0000, 0x0000 }, /* R7798 */ + { 0x0000, 0x0000, 0x0000 }, /* R7799 */ + { 0x0000, 0x0000, 0x0000 }, /* R7800 */ + { 0x0000, 0x0000, 0x0000 }, /* R7801 */ + { 0x0000, 0x0000, 0x0000 }, /* R7802 */ + { 0x0000, 0x0000, 0x0000 }, /* R7803 */ + { 0x0000, 0x0000, 0x0000 }, /* R7804 */ + { 0x0000, 0x0000, 0x0000 }, /* R7805 */ + { 0x0000, 0x0000, 0x0000 }, /* R7806 */ + { 0x0000, 0x0000, 0x0000 }, /* R7807 */ + { 0x0000, 0x0000, 0x0000 }, /* R7808 */ + { 0x0000, 0x0000, 0x0000 }, /* R7809 */ + { 0x0000, 0x0000, 0x0000 }, /* R7810 */ + { 0x0000, 0x0000, 0x0000 }, /* R7811 */ + { 0x0000, 0x0000, 0x0000 }, /* R7812 */ + { 0x0000, 0x0000, 0x0000 }, /* R7813 */ + { 0x0000, 0x0000, 0x0000 }, /* R7814 */ + { 0x0000, 0x0000, 0x0000 }, /* R7815 */ + { 0x0000, 0x0000, 0x0000 }, /* R7816 */ + { 0x0000, 0x0000, 0x0000 }, /* R7817 */ + { 0x0000, 0x0000, 0x0000 }, /* R7818 */ + { 0x0000, 0x0000, 0x0000 }, /* R7819 */ + { 0x0000, 0x0000, 0x0000 }, /* R7820 */ + { 0x0000, 0x0000, 0x0000 }, /* R7821 */ + { 0x0000, 0x0000, 0x0000 }, /* R7822 */ + { 0x0000, 0x0000, 0x0000 }, /* R7823 */ + { 0x0000, 0x0000, 0x0000 }, /* R7824 */ + { 0x0000, 0x0000, 0x0000 }, /* R7825 */ + { 0x0000, 0x0000, 0x0000 }, /* R7826 */ + { 0x0000, 0x0000, 0x0000 }, /* R7827 */ + { 0x0000, 0x0000, 0x0000 }, /* R7828 */ + { 0x0000, 0x0000, 0x0000 }, /* R7829 */ + { 0x0000, 0x0000, 0x0000 }, /* R7830 */ + { 0x0000, 0x0000, 0x0000 }, /* R7831 */ + { 0x0000, 0x0000, 0x0000 }, /* R7832 */ + { 0x0000, 0x0000, 0x0000 }, /* R7833 */ + { 0x0000, 0x0000, 0x0000 }, /* R7834 */ + { 0x0000, 0x0000, 0x0000 }, /* R7835 */ + { 0x0000, 0x0000, 0x0000 }, /* R7836 */ + { 0x0000, 0x0000, 0x0000 }, /* R7837 */ + { 0x0000, 0x0000, 0x0000 }, /* R7838 */ + { 0x0000, 0x0000, 0x0000 }, /* R7839 */ + { 0x0000, 0x0000, 0x0000 }, /* R7840 */ + { 0x0000, 0x0000, 0x0000 }, /* R7841 */ + { 0x0000, 0x0000, 0x0000 }, /* R7842 */ + { 0x0000, 0x0000, 0x0000 }, /* R7843 */ + { 0x0000, 0x0000, 0x0000 }, /* R7844 */ + { 0x0000, 0x0000, 0x0000 }, /* R7845 */ + { 0x0000, 0x0000, 0x0000 }, /* R7846 */ + { 0x0000, 0x0000, 0x0000 }, /* R7847 */ + { 0x0000, 0x0000, 0x0000 }, /* R7848 */ + { 0x0000, 0x0000, 0x0000 }, /* R7849 */ + { 0x0000, 0x0000, 0x0000 }, /* R7850 */ + { 0x0000, 0x0000, 0x0000 }, /* R7851 */ + { 0x0000, 0x0000, 0x0000 }, /* R7852 */ + { 0x0000, 0x0000, 0x0000 }, /* R7853 */ + { 0x0000, 0x0000, 0x0000 }, /* R7854 */ + { 0x0000, 0x0000, 0x0000 }, /* R7855 */ + { 0x0000, 0x0000, 0x0000 }, /* R7856 */ + { 0x0000, 0x0000, 0x0000 }, /* R7857 */ + { 0x0000, 0x0000, 0x0000 }, /* R7858 */ + { 0x0000, 0x0000, 0x0000 }, /* R7859 */ + { 0x0000, 0x0000, 0x0000 }, /* R7860 */ + { 0x0000, 0x0000, 0x0000 }, /* R7861 */ + { 0x0000, 0x0000, 0x0000 }, /* R7862 */ + { 0x0000, 0x0000, 0x0000 }, /* R7863 */ + { 0x0000, 0x0000, 0x0000 }, /* R7864 */ + { 0x0000, 0x0000, 0x0000 }, /* R7865 */ + { 0x0000, 0x0000, 0x0000 }, /* R7866 */ + { 0x0000, 0x0000, 0x0000 }, /* R7867 */ + { 0x0000, 0x0000, 0x0000 }, /* R7868 */ + { 0x0000, 0x0000, 0x0000 }, /* R7869 */ + { 0x0000, 0x0000, 0x0000 }, /* R7870 */ + { 0x0000, 0x0000, 0x0000 }, /* R7871 */ + { 0x0000, 0x0000, 0x0000 }, /* R7872 */ + { 0x0000, 0x0000, 0x0000 }, /* R7873 */ + { 0x0000, 0x0000, 0x0000 }, /* R7874 */ + { 0x0000, 0x0000, 0x0000 }, /* R7875 */ + { 0x0000, 0x0000, 0x0000 }, /* R7876 */ + { 0x0000, 0x0000, 0x0000 }, /* R7877 */ + { 0x0000, 0x0000, 0x0000 }, /* R7878 */ + { 0x0000, 0x0000, 0x0000 }, /* R7879 */ + { 0x0000, 0x0000, 0x0000 }, /* R7880 */ + { 0x0000, 0x0000, 0x0000 }, /* R7881 */ + { 0x0000, 0x0000, 0x0000 }, /* R7882 */ + { 0x0000, 0x0000, 0x0000 }, /* R7883 */ + { 0x0000, 0x0000, 0x0000 }, /* R7884 */ + { 0x0000, 0x0000, 0x0000 }, /* R7885 */ + { 0x0000, 0x0000, 0x0000 }, /* R7886 */ + { 0x0000, 0x0000, 0x0000 }, /* R7887 */ + { 0x0000, 0x0000, 0x0000 }, /* R7888 */ + { 0x0000, 0x0000, 0x0000 }, /* R7889 */ + { 0x0000, 0x0000, 0x0000 }, /* R7890 */ + { 0x0000, 0x0000, 0x0000 }, /* R7891 */ + { 0x0000, 0x0000, 0x0000 }, /* R7892 */ + { 0x0000, 0x0000, 0x0000 }, /* R7893 */ + { 0x0000, 0x0000, 0x0000 }, /* R7894 */ + { 0x0000, 0x0000, 0x0000 }, /* R7895 */ + { 0x0000, 0x0000, 0x0000 }, /* R7896 */ + { 0x0000, 0x0000, 0x0000 }, /* R7897 */ + { 0x0000, 0x0000, 0x0000 }, /* R7898 */ + { 0x0000, 0x0000, 0x0000 }, /* R7899 */ + { 0x0000, 0x0000, 0x0000 }, /* R7900 */ + { 0x0000, 0x0000, 0x0000 }, /* R7901 */ + { 0x0000, 0x0000, 0x0000 }, /* R7902 */ + { 0x0000, 0x0000, 0x0000 }, /* R7903 */ + { 0x0000, 0x0000, 0x0000 }, /* R7904 */ + { 0x0000, 0x0000, 0x0000 }, /* R7905 */ + { 0x0000, 0x0000, 0x0000 }, /* R7906 */ + { 0x0000, 0x0000, 0x0000 }, /* R7907 */ + { 0x0000, 0x0000, 0x0000 }, /* R7908 */ + { 0x0000, 0x0000, 0x0000 }, /* R7909 */ + { 0x0000, 0x0000, 0x0000 }, /* R7910 */ + { 0x0000, 0x0000, 0x0000 }, /* R7911 */ + { 0x0000, 0x0000, 0x0000 }, /* R7912 */ + { 0x0000, 0x0000, 0x0000 }, /* R7913 */ + { 0x0000, 0x0000, 0x0000 }, /* R7914 */ + { 0x0000, 0x0000, 0x0000 }, /* R7915 */ + { 0x0000, 0x0000, 0x0000 }, /* R7916 */ + { 0x0000, 0x0000, 0x0000 }, /* R7917 */ + { 0x0000, 0x0000, 0x0000 }, /* R7918 */ + { 0x0000, 0x0000, 0x0000 }, /* R7919 */ + { 0x0000, 0x0000, 0x0000 }, /* R7920 */ + { 0x0000, 0x0000, 0x0000 }, /* R7921 */ + { 0x0000, 0x0000, 0x0000 }, /* R7922 */ + { 0x0000, 0x0000, 0x0000 }, /* R7923 */ + { 0x0000, 0x0000, 0x0000 }, /* R7924 */ + { 0x0000, 0x0000, 0x0000 }, /* R7925 */ + { 0x0000, 0x0000, 0x0000 }, /* R7926 */ + { 0x0000, 0x0000, 0x0000 }, /* R7927 */ + { 0x0000, 0x0000, 0x0000 }, /* R7928 */ + { 0x0000, 0x0000, 0x0000 }, /* R7929 */ + { 0x0000, 0x0000, 0x0000 }, /* R7930 */ + { 0x0000, 0x0000, 0x0000 }, /* R7931 */ + { 0x0000, 0x0000, 0x0000 }, /* R7932 */ + { 0x0000, 0x0000, 0x0000 }, /* R7933 */ + { 0x0000, 0x0000, 0x0000 }, /* R7934 */ + { 0x0000, 0x0000, 0x0000 }, /* R7935 */ + { 0x0000, 0x0000, 0x0000 }, /* R7936 */ + { 0x0000, 0x0000, 0x0000 }, /* R7937 */ + { 0x0000, 0x0000, 0x0000 }, /* R7938 */ + { 0x0000, 0x0000, 0x0000 }, /* R7939 */ + { 0x0000, 0x0000, 0x0000 }, /* R7940 */ + { 0x0000, 0x0000, 0x0000 }, /* R7941 */ + { 0x0000, 0x0000, 0x0000 }, /* R7942 */ + { 0x0000, 0x0000, 0x0000 }, /* R7943 */ + { 0x0000, 0x0000, 0x0000 }, /* R7944 */ + { 0x0000, 0x0000, 0x0000 }, /* R7945 */ + { 0x0000, 0x0000, 0x0000 }, /* R7946 */ + { 0x0000, 0x0000, 0x0000 }, /* R7947 */ + { 0x0000, 0x0000, 0x0000 }, /* R7948 */ + { 0x0000, 0x0000, 0x0000 }, /* R7949 */ + { 0x0000, 0x0000, 0x0000 }, /* R7950 */ + { 0x0000, 0x0000, 0x0000 }, /* R7951 */ + { 0x0000, 0x0000, 0x0000 }, /* R7952 */ + { 0x0000, 0x0000, 0x0000 }, /* R7953 */ + { 0x0000, 0x0000, 0x0000 }, /* R7954 */ + { 0x0000, 0x0000, 0x0000 }, /* R7955 */ + { 0x0000, 0x0000, 0x0000 }, /* R7956 */ + { 0x0000, 0x0000, 0x0000 }, /* R7957 */ + { 0x0000, 0x0000, 0x0000 }, /* R7958 */ + { 0x0000, 0x0000, 0x0000 }, /* R7959 */ + { 0x0000, 0x0000, 0x0000 }, /* R7960 */ + { 0x0000, 0x0000, 0x0000 }, /* R7961 */ + { 0x0000, 0x0000, 0x0000 }, /* R7962 */ + { 0x0000, 0x0000, 0x0000 }, /* R7963 */ + { 0x0000, 0x0000, 0x0000 }, /* R7964 */ + { 0x0000, 0x0000, 0x0000 }, /* R7965 */ + { 0x0000, 0x0000, 0x0000 }, /* R7966 */ + { 0x0000, 0x0000, 0x0000 }, /* R7967 */ + { 0x0000, 0x0000, 0x0000 }, /* R7968 */ + { 0x0000, 0x0000, 0x0000 }, /* R7969 */ + { 0x0000, 0x0000, 0x0000 }, /* R7970 */ + { 0x0000, 0x0000, 0x0000 }, /* R7971 */ + { 0x0000, 0x0000, 0x0000 }, /* R7972 */ + { 0x0000, 0x0000, 0x0000 }, /* R7973 */ + { 0x0000, 0x0000, 0x0000 }, /* R7974 */ + { 0x0000, 0x0000, 0x0000 }, /* R7975 */ + { 0x0000, 0x0000, 0x0000 }, /* R7976 */ + { 0x0000, 0x0000, 0x0000 }, /* R7977 */ + { 0x0000, 0x0000, 0x0000 }, /* R7978 */ + { 0x0000, 0x0000, 0x0000 }, /* R7979 */ + { 0x0000, 0x0000, 0x0000 }, /* R7980 */ + { 0x0000, 0x0000, 0x0000 }, /* R7981 */ + { 0x0000, 0x0000, 0x0000 }, /* R7982 */ + { 0x0000, 0x0000, 0x0000 }, /* R7983 */ + { 0x0000, 0x0000, 0x0000 }, /* R7984 */ + { 0x0000, 0x0000, 0x0000 }, /* R7985 */ + { 0x0000, 0x0000, 0x0000 }, /* R7986 */ + { 0x0000, 0x0000, 0x0000 }, /* R7987 */ + { 0x0000, 0x0000, 0x0000 }, /* R7988 */ + { 0x0000, 0x0000, 0x0000 }, /* R7989 */ + { 0x0000, 0x0000, 0x0000 }, /* R7990 */ + { 0x0000, 0x0000, 0x0000 }, /* R7991 */ + { 0x0000, 0x0000, 0x0000 }, /* R7992 */ + { 0x0000, 0x0000, 0x0000 }, /* R7993 */ + { 0x0000, 0x0000, 0x0000 }, /* R7994 */ + { 0x0000, 0x0000, 0x0000 }, /* R7995 */ + { 0x0000, 0x0000, 0x0000 }, /* R7996 */ + { 0x0000, 0x0000, 0x0000 }, /* R7997 */ + { 0x0000, 0x0000, 0x0000 }, /* R7998 */ + { 0x0000, 0x0000, 0x0000 }, /* R7999 */ + { 0x0000, 0x0000, 0x0000 }, /* R8000 */ + { 0x0000, 0x0000, 0x0000 }, /* R8001 */ + { 0x0000, 0x0000, 0x0000 }, /* R8002 */ + { 0x0000, 0x0000, 0x0000 }, /* R8003 */ + { 0x0000, 0x0000, 0x0000 }, /* R8004 */ + { 0x0000, 0x0000, 0x0000 }, /* R8005 */ + { 0x0000, 0x0000, 0x0000 }, /* R8006 */ + { 0x0000, 0x0000, 0x0000 }, /* R8007 */ + { 0x0000, 0x0000, 0x0000 }, /* R8008 */ + { 0x0000, 0x0000, 0x0000 }, /* R8009 */ + { 0x0000, 0x0000, 0x0000 }, /* R8010 */ + { 0x0000, 0x0000, 0x0000 }, /* R8011 */ + { 0x0000, 0x0000, 0x0000 }, /* R8012 */ + { 0x0000, 0x0000, 0x0000 }, /* R8013 */ + { 0x0000, 0x0000, 0x0000 }, /* R8014 */ + { 0x0000, 0x0000, 0x0000 }, /* R8015 */ + { 0x0000, 0x0000, 0x0000 }, /* R8016 */ + { 0x0000, 0x0000, 0x0000 }, /* R8017 */ + { 0x0000, 0x0000, 0x0000 }, /* R8018 */ + { 0x0000, 0x0000, 0x0000 }, /* R8019 */ + { 0x0000, 0x0000, 0x0000 }, /* R8020 */ + { 0x0000, 0x0000, 0x0000 }, /* R8021 */ + { 0x0000, 0x0000, 0x0000 }, /* R8022 */ + { 0x0000, 0x0000, 0x0000 }, /* R8023 */ + { 0x0000, 0x0000, 0x0000 }, /* R8024 */ + { 0x0000, 0x0000, 0x0000 }, /* R8025 */ + { 0x0000, 0x0000, 0x0000 }, /* R8026 */ + { 0x0000, 0x0000, 0x0000 }, /* R8027 */ + { 0x0000, 0x0000, 0x0000 }, /* R8028 */ + { 0x0000, 0x0000, 0x0000 }, /* R8029 */ + { 0x0000, 0x0000, 0x0000 }, /* R8030 */ + { 0x0000, 0x0000, 0x0000 }, /* R8031 */ + { 0x0000, 0x0000, 0x0000 }, /* R8032 */ + { 0x0000, 0x0000, 0x0000 }, /* R8033 */ + { 0x0000, 0x0000, 0x0000 }, /* R8034 */ + { 0x0000, 0x0000, 0x0000 }, /* R8035 */ + { 0x0000, 0x0000, 0x0000 }, /* R8036 */ + { 0x0000, 0x0000, 0x0000 }, /* R8037 */ + { 0x0000, 0x0000, 0x0000 }, /* R8038 */ + { 0x0000, 0x0000, 0x0000 }, /* R8039 */ + { 0x0000, 0x0000, 0x0000 }, /* R8040 */ + { 0x0000, 0x0000, 0x0000 }, /* R8041 */ + { 0x0000, 0x0000, 0x0000 }, /* R8042 */ + { 0x0000, 0x0000, 0x0000 }, /* R8043 */ + { 0x0000, 0x0000, 0x0000 }, /* R8044 */ + { 0x0000, 0x0000, 0x0000 }, /* R8045 */ + { 0x0000, 0x0000, 0x0000 }, /* R8046 */ + { 0x0000, 0x0000, 0x0000 }, /* R8047 */ + { 0x0000, 0x0000, 0x0000 }, /* R8048 */ + { 0x0000, 0x0000, 0x0000 }, /* R8049 */ + { 0x0000, 0x0000, 0x0000 }, /* R8050 */ + { 0x0000, 0x0000, 0x0000 }, /* R8051 */ + { 0x0000, 0x0000, 0x0000 }, /* R8052 */ + { 0x0000, 0x0000, 0x0000 }, /* R8053 */ + { 0x0000, 0x0000, 0x0000 }, /* R8054 */ + { 0x0000, 0x0000, 0x0000 }, /* R8055 */ + { 0x0000, 0x0000, 0x0000 }, /* R8056 */ + { 0x0000, 0x0000, 0x0000 }, /* R8057 */ + { 0x0000, 0x0000, 0x0000 }, /* R8058 */ + { 0x0000, 0x0000, 0x0000 }, /* R8059 */ + { 0x0000, 0x0000, 0x0000 }, /* R8060 */ + { 0x0000, 0x0000, 0x0000 }, /* R8061 */ + { 0x0000, 0x0000, 0x0000 }, /* R8062 */ + { 0x0000, 0x0000, 0x0000 }, /* R8063 */ + { 0x0000, 0x0000, 0x0000 }, /* R8064 */ + { 0x0000, 0x0000, 0x0000 }, /* R8065 */ + { 0x0000, 0x0000, 0x0000 }, /* R8066 */ + { 0x0000, 0x0000, 0x0000 }, /* R8067 */ + { 0x0000, 0x0000, 0x0000 }, /* R8068 */ + { 0x0000, 0x0000, 0x0000 }, /* R8069 */ + { 0x0000, 0x0000, 0x0000 }, /* R8070 */ + { 0x0000, 0x0000, 0x0000 }, /* R8071 */ + { 0x0000, 0x0000, 0x0000 }, /* R8072 */ + { 0x0000, 0x0000, 0x0000 }, /* R8073 */ + { 0x0000, 0x0000, 0x0000 }, /* R8074 */ + { 0x0000, 0x0000, 0x0000 }, /* R8075 */ + { 0x0000, 0x0000, 0x0000 }, /* R8076 */ + { 0x0000, 0x0000, 0x0000 }, /* R8077 */ + { 0x0000, 0x0000, 0x0000 }, /* R8078 */ + { 0x0000, 0x0000, 0x0000 }, /* R8079 */ + { 0x0000, 0x0000, 0x0000 }, /* R8080 */ + { 0x0000, 0x0000, 0x0000 }, /* R8081 */ + { 0x0000, 0x0000, 0x0000 }, /* R8082 */ + { 0x0000, 0x0000, 0x0000 }, /* R8083 */ + { 0x0000, 0x0000, 0x0000 }, /* R8084 */ + { 0x0000, 0x0000, 0x0000 }, /* R8085 */ + { 0x0000, 0x0000, 0x0000 }, /* R8086 */ + { 0x0000, 0x0000, 0x0000 }, /* R8087 */ + { 0x0000, 0x0000, 0x0000 }, /* R8088 */ + { 0x0000, 0x0000, 0x0000 }, /* R8089 */ + { 0x0000, 0x0000, 0x0000 }, /* R8090 */ + { 0x0000, 0x0000, 0x0000 }, /* R8091 */ + { 0x0000, 0x0000, 0x0000 }, /* R8092 */ + { 0x0000, 0x0000, 0x0000 }, /* R8093 */ + { 0x0000, 0x0000, 0x0000 }, /* R8094 */ + { 0x0000, 0x0000, 0x0000 }, /* R8095 */ + { 0x0000, 0x0000, 0x0000 }, /* R8096 */ + { 0x0000, 0x0000, 0x0000 }, /* R8097 */ + { 0x0000, 0x0000, 0x0000 }, /* R8098 */ + { 0x0000, 0x0000, 0x0000 }, /* R8099 */ + { 0x0000, 0x0000, 0x0000 }, /* R8100 */ + { 0x0000, 0x0000, 0x0000 }, /* R8101 */ + { 0x0000, 0x0000, 0x0000 }, /* R8102 */ + { 0x0000, 0x0000, 0x0000 }, /* R8103 */ + { 0x0000, 0x0000, 0x0000 }, /* R8104 */ + { 0x0000, 0x0000, 0x0000 }, /* R8105 */ + { 0x0000, 0x0000, 0x0000 }, /* R8106 */ + { 0x0000, 0x0000, 0x0000 }, /* R8107 */ + { 0x0000, 0x0000, 0x0000 }, /* R8108 */ + { 0x0000, 0x0000, 0x0000 }, /* R8109 */ + { 0x0000, 0x0000, 0x0000 }, /* R8110 */ + { 0x0000, 0x0000, 0x0000 }, /* R8111 */ + { 0x0000, 0x0000, 0x0000 }, /* R8112 */ + { 0x0000, 0x0000, 0x0000 }, /* R8113 */ + { 0x0000, 0x0000, 0x0000 }, /* R8114 */ + { 0x0000, 0x0000, 0x0000 }, /* R8115 */ + { 0x0000, 0x0000, 0x0000 }, /* R8116 */ + { 0x0000, 0x0000, 0x0000 }, /* R8117 */ + { 0x0000, 0x0000, 0x0000 }, /* R8118 */ + { 0x0000, 0x0000, 0x0000 }, /* R8119 */ + { 0x0000, 0x0000, 0x0000 }, /* R8120 */ + { 0x0000, 0x0000, 0x0000 }, /* R8121 */ + { 0x0000, 0x0000, 0x0000 }, /* R8122 */ + { 0x0000, 0x0000, 0x0000 }, /* R8123 */ + { 0x0000, 0x0000, 0x0000 }, /* R8124 */ + { 0x0000, 0x0000, 0x0000 }, /* R8125 */ + { 0x0000, 0x0000, 0x0000 }, /* R8126 */ + { 0x0000, 0x0000, 0x0000 }, /* R8127 */ + { 0x0000, 0x0000, 0x0000 }, /* R8128 */ + { 0x0000, 0x0000, 0x0000 }, /* R8129 */ + { 0x0000, 0x0000, 0x0000 }, /* R8130 */ + { 0x0000, 0x0000, 0x0000 }, /* R8131 */ + { 0x0000, 0x0000, 0x0000 }, /* R8132 */ + { 0x0000, 0x0000, 0x0000 }, /* R8133 */ + { 0x0000, 0x0000, 0x0000 }, /* R8134 */ + { 0x0000, 0x0000, 0x0000 }, /* R8135 */ + { 0x0000, 0x0000, 0x0000 }, /* R8136 */ + { 0x0000, 0x0000, 0x0000 }, /* R8137 */ + { 0x0000, 0x0000, 0x0000 }, /* R8138 */ + { 0x0000, 0x0000, 0x0000 }, /* R8139 */ + { 0x0000, 0x0000, 0x0000 }, /* R8140 */ + { 0x0000, 0x0000, 0x0000 }, /* R8141 */ + { 0x0000, 0x0000, 0x0000 }, /* R8142 */ + { 0x0000, 0x0000, 0x0000 }, /* R8143 */ + { 0x0000, 0x0000, 0x0000 }, /* R8144 */ + { 0x0000, 0x0000, 0x0000 }, /* R8145 */ + { 0x0000, 0x0000, 0x0000 }, /* R8146 */ + { 0x0000, 0x0000, 0x0000 }, /* R8147 */ + { 0x0000, 0x0000, 0x0000 }, /* R8148 */ + { 0x0000, 0x0000, 0x0000 }, /* R8149 */ + { 0x0000, 0x0000, 0x0000 }, /* R8150 */ + { 0x0000, 0x0000, 0x0000 }, /* R8151 */ + { 0x0000, 0x0000, 0x0000 }, /* R8152 */ + { 0x0000, 0x0000, 0x0000 }, /* R8153 */ + { 0x0000, 0x0000, 0x0000 }, /* R8154 */ + { 0x0000, 0x0000, 0x0000 }, /* R8155 */ + { 0x0000, 0x0000, 0x0000 }, /* R8156 */ + { 0x0000, 0x0000, 0x0000 }, /* R8157 */ + { 0x0000, 0x0000, 0x0000 }, /* R8158 */ + { 0x0000, 0x0000, 0x0000 }, /* R8159 */ + { 0x0000, 0x0000, 0x0000 }, /* R8160 */ + { 0x0000, 0x0000, 0x0000 }, /* R8161 */ + { 0x0000, 0x0000, 0x0000 }, /* R8162 */ + { 0x0000, 0x0000, 0x0000 }, /* R8163 */ + { 0x0000, 0x0000, 0x0000 }, /* R8164 */ + { 0x0000, 0x0000, 0x0000 }, /* R8165 */ + { 0x0000, 0x0000, 0x0000 }, /* R8166 */ + { 0x0000, 0x0000, 0x0000 }, /* R8167 */ + { 0x0000, 0x0000, 0x0000 }, /* R8168 */ + { 0x0000, 0x0000, 0x0000 }, /* R8169 */ + { 0x0000, 0x0000, 0x0000 }, /* R8170 */ + { 0x0000, 0x0000, 0x0000 }, /* R8171 */ + { 0x0000, 0x0000, 0x0000 }, /* R8172 */ + { 0x0000, 0x0000, 0x0000 }, /* R8173 */ + { 0x0000, 0x0000, 0x0000 }, /* R8174 */ + { 0x0000, 0x0000, 0x0000 }, /* R8175 */ + { 0x0000, 0x0000, 0x0000 }, /* R8176 */ + { 0x0000, 0x0000, 0x0000 }, /* R8177 */ + { 0x0000, 0x0000, 0x0000 }, /* R8178 */ + { 0x0000, 0x0000, 0x0000 }, /* R8179 */ + { 0x0000, 0x0000, 0x0000 }, /* R8180 */ + { 0x0000, 0x0000, 0x0000 }, /* R8181 */ + { 0x0000, 0x0000, 0x0000 }, /* R8182 */ + { 0x0000, 0x0000, 0x0000 }, /* R8183 */ + { 0x0000, 0x0000, 0x0000 }, /* R8184 */ + { 0x0000, 0x0000, 0x0000 }, /* R8185 */ + { 0x0000, 0x0000, 0x0000 }, /* R8186 */ + { 0x0000, 0x0000, 0x0000 }, /* R8187 */ + { 0x0000, 0x0000, 0x0000 }, /* R8188 */ + { 0x0000, 0x0000, 0x0000 }, /* R8189 */ + { 0x0000, 0x0000, 0x0000 }, /* R8190 */ + { 0x0000, 0x0000, 0x0000 }, /* R8191 */ + { 0x03FF, 0x03FF, 0x0000 }, /* R8192 - DSP2 Instruction RAM 0 */ + { 0x0000, 0x0000, 0x0000 }, /* R8193 */ + { 0x0000, 0x0000, 0x0000 }, /* R8194 */ + { 0x0000, 0x0000, 0x0000 }, /* R8195 */ + { 0x0000, 0x0000, 0x0000 }, /* R8196 */ + { 0x0000, 0x0000, 0x0000 }, /* R8197 */ + { 0x0000, 0x0000, 0x0000 }, /* R8198 */ + { 0x0000, 0x0000, 0x0000 }, /* R8199 */ + { 0x0000, 0x0000, 0x0000 }, /* R8200 */ + { 0x0000, 0x0000, 0x0000 }, /* R8201 */ + { 0x0000, 0x0000, 0x0000 }, /* R8202 */ + { 0x0000, 0x0000, 0x0000 }, /* R8203 */ + { 0x0000, 0x0000, 0x0000 }, /* R8204 */ + { 0x0000, 0x0000, 0x0000 }, /* R8205 */ + { 0x0000, 0x0000, 0x0000 }, /* R8206 */ + { 0x0000, 0x0000, 0x0000 }, /* R8207 */ + { 0x0000, 0x0000, 0x0000 }, /* R8208 */ + { 0x0000, 0x0000, 0x0000 }, /* R8209 */ + { 0x0000, 0x0000, 0x0000 }, /* R8210 */ + { 0x0000, 0x0000, 0x0000 }, /* R8211 */ + { 0x0000, 0x0000, 0x0000 }, /* R8212 */ + { 0x0000, 0x0000, 0x0000 }, /* R8213 */ + { 0x0000, 0x0000, 0x0000 }, /* R8214 */ + { 0x0000, 0x0000, 0x0000 }, /* R8215 */ + { 0x0000, 0x0000, 0x0000 }, /* R8216 */ + { 0x0000, 0x0000, 0x0000 }, /* R8217 */ + { 0x0000, 0x0000, 0x0000 }, /* R8218 */ + { 0x0000, 0x0000, 0x0000 }, /* R8219 */ + { 0x0000, 0x0000, 0x0000 }, /* R8220 */ + { 0x0000, 0x0000, 0x0000 }, /* R8221 */ + { 0x0000, 0x0000, 0x0000 }, /* R8222 */ + { 0x0000, 0x0000, 0x0000 }, /* R8223 */ + { 0x0000, 0x0000, 0x0000 }, /* R8224 */ + { 0x0000, 0x0000, 0x0000 }, /* R8225 */ + { 0x0000, 0x0000, 0x0000 }, /* R8226 */ + { 0x0000, 0x0000, 0x0000 }, /* R8227 */ + { 0x0000, 0x0000, 0x0000 }, /* R8228 */ + { 0x0000, 0x0000, 0x0000 }, /* R8229 */ + { 0x0000, 0x0000, 0x0000 }, /* R8230 */ + { 0x0000, 0x0000, 0x0000 }, /* R8231 */ + { 0x0000, 0x0000, 0x0000 }, /* R8232 */ + { 0x0000, 0x0000, 0x0000 }, /* R8233 */ + { 0x0000, 0x0000, 0x0000 }, /* R8234 */ + { 0x0000, 0x0000, 0x0000 }, /* R8235 */ + { 0x0000, 0x0000, 0x0000 }, /* R8236 */ + { 0x0000, 0x0000, 0x0000 }, /* R8237 */ + { 0x0000, 0x0000, 0x0000 }, /* R8238 */ + { 0x0000, 0x0000, 0x0000 }, /* R8239 */ + { 0x0000, 0x0000, 0x0000 }, /* R8240 */ + { 0x0000, 0x0000, 0x0000 }, /* R8241 */ + { 0x0000, 0x0000, 0x0000 }, /* R8242 */ + { 0x0000, 0x0000, 0x0000 }, /* R8243 */ + { 0x0000, 0x0000, 0x0000 }, /* R8244 */ + { 0x0000, 0x0000, 0x0000 }, /* R8245 */ + { 0x0000, 0x0000, 0x0000 }, /* R8246 */ + { 0x0000, 0x0000, 0x0000 }, /* R8247 */ + { 0x0000, 0x0000, 0x0000 }, /* R8248 */ + { 0x0000, 0x0000, 0x0000 }, /* R8249 */ + { 0x0000, 0x0000, 0x0000 }, /* R8250 */ + { 0x0000, 0x0000, 0x0000 }, /* R8251 */ + { 0x0000, 0x0000, 0x0000 }, /* R8252 */ + { 0x0000, 0x0000, 0x0000 }, /* R8253 */ + { 0x0000, 0x0000, 0x0000 }, /* R8254 */ + { 0x0000, 0x0000, 0x0000 }, /* R8255 */ + { 0x0000, 0x0000, 0x0000 }, /* R8256 */ + { 0x0000, 0x0000, 0x0000 }, /* R8257 */ + { 0x0000, 0x0000, 0x0000 }, /* R8258 */ + { 0x0000, 0x0000, 0x0000 }, /* R8259 */ + { 0x0000, 0x0000, 0x0000 }, /* R8260 */ + { 0x0000, 0x0000, 0x0000 }, /* R8261 */ + { 0x0000, 0x0000, 0x0000 }, /* R8262 */ + { 0x0000, 0x0000, 0x0000 }, /* R8263 */ + { 0x0000, 0x0000, 0x0000 }, /* R8264 */ + { 0x0000, 0x0000, 0x0000 }, /* R8265 */ + { 0x0000, 0x0000, 0x0000 }, /* R8266 */ + { 0x0000, 0x0000, 0x0000 }, /* R8267 */ + { 0x0000, 0x0000, 0x0000 }, /* R8268 */ + { 0x0000, 0x0000, 0x0000 }, /* R8269 */ + { 0x0000, 0x0000, 0x0000 }, /* R8270 */ + { 0x0000, 0x0000, 0x0000 }, /* R8271 */ + { 0x0000, 0x0000, 0x0000 }, /* R8272 */ + { 0x0000, 0x0000, 0x0000 }, /* R8273 */ + { 0x0000, 0x0000, 0x0000 }, /* R8274 */ + { 0x0000, 0x0000, 0x0000 }, /* R8275 */ + { 0x0000, 0x0000, 0x0000 }, /* R8276 */ + { 0x0000, 0x0000, 0x0000 }, /* R8277 */ + { 0x0000, 0x0000, 0x0000 }, /* R8278 */ + { 0x0000, 0x0000, 0x0000 }, /* R8279 */ + { 0x0000, 0x0000, 0x0000 }, /* R8280 */ + { 0x0000, 0x0000, 0x0000 }, /* R8281 */ + { 0x0000, 0x0000, 0x0000 }, /* R8282 */ + { 0x0000, 0x0000, 0x0000 }, /* R8283 */ + { 0x0000, 0x0000, 0x0000 }, /* R8284 */ + { 0x0000, 0x0000, 0x0000 }, /* R8285 */ + { 0x0000, 0x0000, 0x0000 }, /* R8286 */ + { 0x0000, 0x0000, 0x0000 }, /* R8287 */ + { 0x0000, 0x0000, 0x0000 }, /* R8288 */ + { 0x0000, 0x0000, 0x0000 }, /* R8289 */ + { 0x0000, 0x0000, 0x0000 }, /* R8290 */ + { 0x0000, 0x0000, 0x0000 }, /* R8291 */ + { 0x0000, 0x0000, 0x0000 }, /* R8292 */ + { 0x0000, 0x0000, 0x0000 }, /* R8293 */ + { 0x0000, 0x0000, 0x0000 }, /* R8294 */ + { 0x0000, 0x0000, 0x0000 }, /* R8295 */ + { 0x0000, 0x0000, 0x0000 }, /* R8296 */ + { 0x0000, 0x0000, 0x0000 }, /* R8297 */ + { 0x0000, 0x0000, 0x0000 }, /* R8298 */ + { 0x0000, 0x0000, 0x0000 }, /* R8299 */ + { 0x0000, 0x0000, 0x0000 }, /* R8300 */ + { 0x0000, 0x0000, 0x0000 }, /* R8301 */ + { 0x0000, 0x0000, 0x0000 }, /* R8302 */ + { 0x0000, 0x0000, 0x0000 }, /* R8303 */ + { 0x0000, 0x0000, 0x0000 }, /* R8304 */ + { 0x0000, 0x0000, 0x0000 }, /* R8305 */ + { 0x0000, 0x0000, 0x0000 }, /* R8306 */ + { 0x0000, 0x0000, 0x0000 }, /* R8307 */ + { 0x0000, 0x0000, 0x0000 }, /* R8308 */ + { 0x0000, 0x0000, 0x0000 }, /* R8309 */ + { 0x0000, 0x0000, 0x0000 }, /* R8310 */ + { 0x0000, 0x0000, 0x0000 }, /* R8311 */ + { 0x0000, 0x0000, 0x0000 }, /* R8312 */ + { 0x0000, 0x0000, 0x0000 }, /* R8313 */ + { 0x0000, 0x0000, 0x0000 }, /* R8314 */ + { 0x0000, 0x0000, 0x0000 }, /* R8315 */ + { 0x0000, 0x0000, 0x0000 }, /* R8316 */ + { 0x0000, 0x0000, 0x0000 }, /* R8317 */ + { 0x0000, 0x0000, 0x0000 }, /* R8318 */ + { 0x0000, 0x0000, 0x0000 }, /* R8319 */ + { 0x0000, 0x0000, 0x0000 }, /* R8320 */ + { 0x0000, 0x0000, 0x0000 }, /* R8321 */ + { 0x0000, 0x0000, 0x0000 }, /* R8322 */ + { 0x0000, 0x0000, 0x0000 }, /* R8323 */ + { 0x0000, 0x0000, 0x0000 }, /* R8324 */ + { 0x0000, 0x0000, 0x0000 }, /* R8325 */ + { 0x0000, 0x0000, 0x0000 }, /* R8326 */ + { 0x0000, 0x0000, 0x0000 }, /* R8327 */ + { 0x0000, 0x0000, 0x0000 }, /* R8328 */ + { 0x0000, 0x0000, 0x0000 }, /* R8329 */ + { 0x0000, 0x0000, 0x0000 }, /* R8330 */ + { 0x0000, 0x0000, 0x0000 }, /* R8331 */ + { 0x0000, 0x0000, 0x0000 }, /* R8332 */ + { 0x0000, 0x0000, 0x0000 }, /* R8333 */ + { 0x0000, 0x0000, 0x0000 }, /* R8334 */ + { 0x0000, 0x0000, 0x0000 }, /* R8335 */ + { 0x0000, 0x0000, 0x0000 }, /* R8336 */ + { 0x0000, 0x0000, 0x0000 }, /* R8337 */ + { 0x0000, 0x0000, 0x0000 }, /* R8338 */ + { 0x0000, 0x0000, 0x0000 }, /* R8339 */ + { 0x0000, 0x0000, 0x0000 }, /* R8340 */ + { 0x0000, 0x0000, 0x0000 }, /* R8341 */ + { 0x0000, 0x0000, 0x0000 }, /* R8342 */ + { 0x0000, 0x0000, 0x0000 }, /* R8343 */ + { 0x0000, 0x0000, 0x0000 }, /* R8344 */ + { 0x0000, 0x0000, 0x0000 }, /* R8345 */ + { 0x0000, 0x0000, 0x0000 }, /* R8346 */ + { 0x0000, 0x0000, 0x0000 }, /* R8347 */ + { 0x0000, 0x0000, 0x0000 }, /* R8348 */ + { 0x0000, 0x0000, 0x0000 }, /* R8349 */ + { 0x0000, 0x0000, 0x0000 }, /* R8350 */ + { 0x0000, 0x0000, 0x0000 }, /* R8351 */ + { 0x0000, 0x0000, 0x0000 }, /* R8352 */ + { 0x0000, 0x0000, 0x0000 }, /* R8353 */ + { 0x0000, 0x0000, 0x0000 }, /* R8354 */ + { 0x0000, 0x0000, 0x0000 }, /* R8355 */ + { 0x0000, 0x0000, 0x0000 }, /* R8356 */ + { 0x0000, 0x0000, 0x0000 }, /* R8357 */ + { 0x0000, 0x0000, 0x0000 }, /* R8358 */ + { 0x0000, 0x0000, 0x0000 }, /* R8359 */ + { 0x0000, 0x0000, 0x0000 }, /* R8360 */ + { 0x0000, 0x0000, 0x0000 }, /* R8361 */ + { 0x0000, 0x0000, 0x0000 }, /* R8362 */ + { 0x0000, 0x0000, 0x0000 }, /* R8363 */ + { 0x0000, 0x0000, 0x0000 }, /* R8364 */ + { 0x0000, 0x0000, 0x0000 }, /* R8365 */ + { 0x0000, 0x0000, 0x0000 }, /* R8366 */ + { 0x0000, 0x0000, 0x0000 }, /* R8367 */ + { 0x0000, 0x0000, 0x0000 }, /* R8368 */ + { 0x0000, 0x0000, 0x0000 }, /* R8369 */ + { 0x0000, 0x0000, 0x0000 }, /* R8370 */ + { 0x0000, 0x0000, 0x0000 }, /* R8371 */ + { 0x0000, 0x0000, 0x0000 }, /* R8372 */ + { 0x0000, 0x0000, 0x0000 }, /* R8373 */ + { 0x0000, 0x0000, 0x0000 }, /* R8374 */ + { 0x0000, 0x0000, 0x0000 }, /* R8375 */ + { 0x0000, 0x0000, 0x0000 }, /* R8376 */ + { 0x0000, 0x0000, 0x0000 }, /* R8377 */ + { 0x0000, 0x0000, 0x0000 }, /* R8378 */ + { 0x0000, 0x0000, 0x0000 }, /* R8379 */ + { 0x0000, 0x0000, 0x0000 }, /* R8380 */ + { 0x0000, 0x0000, 0x0000 }, /* R8381 */ + { 0x0000, 0x0000, 0x0000 }, /* R8382 */ + { 0x0000, 0x0000, 0x0000 }, /* R8383 */ + { 0x0000, 0x0000, 0x0000 }, /* R8384 */ + { 0x0000, 0x0000, 0x0000 }, /* R8385 */ + { 0x0000, 0x0000, 0x0000 }, /* R8386 */ + { 0x0000, 0x0000, 0x0000 }, /* R8387 */ + { 0x0000, 0x0000, 0x0000 }, /* R8388 */ + { 0x0000, 0x0000, 0x0000 }, /* R8389 */ + { 0x0000, 0x0000, 0x0000 }, /* R8390 */ + { 0x0000, 0x0000, 0x0000 }, /* R8391 */ + { 0x0000, 0x0000, 0x0000 }, /* R8392 */ + { 0x0000, 0x0000, 0x0000 }, /* R8393 */ + { 0x0000, 0x0000, 0x0000 }, /* R8394 */ + { 0x0000, 0x0000, 0x0000 }, /* R8395 */ + { 0x0000, 0x0000, 0x0000 }, /* R8396 */ + { 0x0000, 0x0000, 0x0000 }, /* R8397 */ + { 0x0000, 0x0000, 0x0000 }, /* R8398 */ + { 0x0000, 0x0000, 0x0000 }, /* R8399 */ + { 0x0000, 0x0000, 0x0000 }, /* R8400 */ + { 0x0000, 0x0000, 0x0000 }, /* R8401 */ + { 0x0000, 0x0000, 0x0000 }, /* R8402 */ + { 0x0000, 0x0000, 0x0000 }, /* R8403 */ + { 0x0000, 0x0000, 0x0000 }, /* R8404 */ + { 0x0000, 0x0000, 0x0000 }, /* R8405 */ + { 0x0000, 0x0000, 0x0000 }, /* R8406 */ + { 0x0000, 0x0000, 0x0000 }, /* R8407 */ + { 0x0000, 0x0000, 0x0000 }, /* R8408 */ + { 0x0000, 0x0000, 0x0000 }, /* R8409 */ + { 0x0000, 0x0000, 0x0000 }, /* R8410 */ + { 0x0000, 0x0000, 0x0000 }, /* R8411 */ + { 0x0000, 0x0000, 0x0000 }, /* R8412 */ + { 0x0000, 0x0000, 0x0000 }, /* R8413 */ + { 0x0000, 0x0000, 0x0000 }, /* R8414 */ + { 0x0000, 0x0000, 0x0000 }, /* R8415 */ + { 0x0000, 0x0000, 0x0000 }, /* R8416 */ + { 0x0000, 0x0000, 0x0000 }, /* R8417 */ + { 0x0000, 0x0000, 0x0000 }, /* R8418 */ + { 0x0000, 0x0000, 0x0000 }, /* R8419 */ + { 0x0000, 0x0000, 0x0000 }, /* R8420 */ + { 0x0000, 0x0000, 0x0000 }, /* R8421 */ + { 0x0000, 0x0000, 0x0000 }, /* R8422 */ + { 0x0000, 0x0000, 0x0000 }, /* R8423 */ + { 0x0000, 0x0000, 0x0000 }, /* R8424 */ + { 0x0000, 0x0000, 0x0000 }, /* R8425 */ + { 0x0000, 0x0000, 0x0000 }, /* R8426 */ + { 0x0000, 0x0000, 0x0000 }, /* R8427 */ + { 0x0000, 0x0000, 0x0000 }, /* R8428 */ + { 0x0000, 0x0000, 0x0000 }, /* R8429 */ + { 0x0000, 0x0000, 0x0000 }, /* R8430 */ + { 0x0000, 0x0000, 0x0000 }, /* R8431 */ + { 0x0000, 0x0000, 0x0000 }, /* R8432 */ + { 0x0000, 0x0000, 0x0000 }, /* R8433 */ + { 0x0000, 0x0000, 0x0000 }, /* R8434 */ + { 0x0000, 0x0000, 0x0000 }, /* R8435 */ + { 0x0000, 0x0000, 0x0000 }, /* R8436 */ + { 0x0000, 0x0000, 0x0000 }, /* R8437 */ + { 0x0000, 0x0000, 0x0000 }, /* R8438 */ + { 0x0000, 0x0000, 0x0000 }, /* R8439 */ + { 0x0000, 0x0000, 0x0000 }, /* R8440 */ + { 0x0000, 0x0000, 0x0000 }, /* R8441 */ + { 0x0000, 0x0000, 0x0000 }, /* R8442 */ + { 0x0000, 0x0000, 0x0000 }, /* R8443 */ + { 0x0000, 0x0000, 0x0000 }, /* R8444 */ + { 0x0000, 0x0000, 0x0000 }, /* R8445 */ + { 0x0000, 0x0000, 0x0000 }, /* R8446 */ + { 0x0000, 0x0000, 0x0000 }, /* R8447 */ + { 0x0000, 0x0000, 0x0000 }, /* R8448 */ + { 0x0000, 0x0000, 0x0000 }, /* R8449 */ + { 0x0000, 0x0000, 0x0000 }, /* R8450 */ + { 0x0000, 0x0000, 0x0000 }, /* R8451 */ + { 0x0000, 0x0000, 0x0000 }, /* R8452 */ + { 0x0000, 0x0000, 0x0000 }, /* R8453 */ + { 0x0000, 0x0000, 0x0000 }, /* R8454 */ + { 0x0000, 0x0000, 0x0000 }, /* R8455 */ + { 0x0000, 0x0000, 0x0000 }, /* R8456 */ + { 0x0000, 0x0000, 0x0000 }, /* R8457 */ + { 0x0000, 0x0000, 0x0000 }, /* R8458 */ + { 0x0000, 0x0000, 0x0000 }, /* R8459 */ + { 0x0000, 0x0000, 0x0000 }, /* R8460 */ + { 0x0000, 0x0000, 0x0000 }, /* R8461 */ + { 0x0000, 0x0000, 0x0000 }, /* R8462 */ + { 0x0000, 0x0000, 0x0000 }, /* R8463 */ + { 0x0000, 0x0000, 0x0000 }, /* R8464 */ + { 0x0000, 0x0000, 0x0000 }, /* R8465 */ + { 0x0000, 0x0000, 0x0000 }, /* R8466 */ + { 0x0000, 0x0000, 0x0000 }, /* R8467 */ + { 0x0000, 0x0000, 0x0000 }, /* R8468 */ + { 0x0000, 0x0000, 0x0000 }, /* R8469 */ + { 0x0000, 0x0000, 0x0000 }, /* R8470 */ + { 0x0000, 0x0000, 0x0000 }, /* R8471 */ + { 0x0000, 0x0000, 0x0000 }, /* R8472 */ + { 0x0000, 0x0000, 0x0000 }, /* R8473 */ + { 0x0000, 0x0000, 0x0000 }, /* R8474 */ + { 0x0000, 0x0000, 0x0000 }, /* R8475 */ + { 0x0000, 0x0000, 0x0000 }, /* R8476 */ + { 0x0000, 0x0000, 0x0000 }, /* R8477 */ + { 0x0000, 0x0000, 0x0000 }, /* R8478 */ + { 0x0000, 0x0000, 0x0000 }, /* R8479 */ + { 0x0000, 0x0000, 0x0000 }, /* R8480 */ + { 0x0000, 0x0000, 0x0000 }, /* R8481 */ + { 0x0000, 0x0000, 0x0000 }, /* R8482 */ + { 0x0000, 0x0000, 0x0000 }, /* R8483 */ + { 0x0000, 0x0000, 0x0000 }, /* R8484 */ + { 0x0000, 0x0000, 0x0000 }, /* R8485 */ + { 0x0000, 0x0000, 0x0000 }, /* R8486 */ + { 0x0000, 0x0000, 0x0000 }, /* R8487 */ + { 0x0000, 0x0000, 0x0000 }, /* R8488 */ + { 0x0000, 0x0000, 0x0000 }, /* R8489 */ + { 0x0000, 0x0000, 0x0000 }, /* R8490 */ + { 0x0000, 0x0000, 0x0000 }, /* R8491 */ + { 0x0000, 0x0000, 0x0000 }, /* R8492 */ + { 0x0000, 0x0000, 0x0000 }, /* R8493 */ + { 0x0000, 0x0000, 0x0000 }, /* R8494 */ + { 0x0000, 0x0000, 0x0000 }, /* R8495 */ + { 0x0000, 0x0000, 0x0000 }, /* R8496 */ + { 0x0000, 0x0000, 0x0000 }, /* R8497 */ + { 0x0000, 0x0000, 0x0000 }, /* R8498 */ + { 0x0000, 0x0000, 0x0000 }, /* R8499 */ + { 0x0000, 0x0000, 0x0000 }, /* R8500 */ + { 0x0000, 0x0000, 0x0000 }, /* R8501 */ + { 0x0000, 0x0000, 0x0000 }, /* R8502 */ + { 0x0000, 0x0000, 0x0000 }, /* R8503 */ + { 0x0000, 0x0000, 0x0000 }, /* R8504 */ + { 0x0000, 0x0000, 0x0000 }, /* R8505 */ + { 0x0000, 0x0000, 0x0000 }, /* R8506 */ + { 0x0000, 0x0000, 0x0000 }, /* R8507 */ + { 0x0000, 0x0000, 0x0000 }, /* R8508 */ + { 0x0000, 0x0000, 0x0000 }, /* R8509 */ + { 0x0000, 0x0000, 0x0000 }, /* R8510 */ + { 0x0000, 0x0000, 0x0000 }, /* R8511 */ + { 0x0000, 0x0000, 0x0000 }, /* R8512 */ + { 0x0000, 0x0000, 0x0000 }, /* R8513 */ + { 0x0000, 0x0000, 0x0000 }, /* R8514 */ + { 0x0000, 0x0000, 0x0000 }, /* R8515 */ + { 0x0000, 0x0000, 0x0000 }, /* R8516 */ + { 0x0000, 0x0000, 0x0000 }, /* R8517 */ + { 0x0000, 0x0000, 0x0000 }, /* R8518 */ + { 0x0000, 0x0000, 0x0000 }, /* R8519 */ + { 0x0000, 0x0000, 0x0000 }, /* R8520 */ + { 0x0000, 0x0000, 0x0000 }, /* R8521 */ + { 0x0000, 0x0000, 0x0000 }, /* R8522 */ + { 0x0000, 0x0000, 0x0000 }, /* R8523 */ + { 0x0000, 0x0000, 0x0000 }, /* R8524 */ + { 0x0000, 0x0000, 0x0000 }, /* R8525 */ + { 0x0000, 0x0000, 0x0000 }, /* R8526 */ + { 0x0000, 0x0000, 0x0000 }, /* R8527 */ + { 0x0000, 0x0000, 0x0000 }, /* R8528 */ + { 0x0000, 0x0000, 0x0000 }, /* R8529 */ + { 0x0000, 0x0000, 0x0000 }, /* R8530 */ + { 0x0000, 0x0000, 0x0000 }, /* R8531 */ + { 0x0000, 0x0000, 0x0000 }, /* R8532 */ + { 0x0000, 0x0000, 0x0000 }, /* R8533 */ + { 0x0000, 0x0000, 0x0000 }, /* R8534 */ + { 0x0000, 0x0000, 0x0000 }, /* R8535 */ + { 0x0000, 0x0000, 0x0000 }, /* R8536 */ + { 0x0000, 0x0000, 0x0000 }, /* R8537 */ + { 0x0000, 0x0000, 0x0000 }, /* R8538 */ + { 0x0000, 0x0000, 0x0000 }, /* R8539 */ + { 0x0000, 0x0000, 0x0000 }, /* R8540 */ + { 0x0000, 0x0000, 0x0000 }, /* R8541 */ + { 0x0000, 0x0000, 0x0000 }, /* R8542 */ + { 0x0000, 0x0000, 0x0000 }, /* R8543 */ + { 0x0000, 0x0000, 0x0000 }, /* R8544 */ + { 0x0000, 0x0000, 0x0000 }, /* R8545 */ + { 0x0000, 0x0000, 0x0000 }, /* R8546 */ + { 0x0000, 0x0000, 0x0000 }, /* R8547 */ + { 0x0000, 0x0000, 0x0000 }, /* R8548 */ + { 0x0000, 0x0000, 0x0000 }, /* R8549 */ + { 0x0000, 0x0000, 0x0000 }, /* R8550 */ + { 0x0000, 0x0000, 0x0000 }, /* R8551 */ + { 0x0000, 0x0000, 0x0000 }, /* R8552 */ + { 0x0000, 0x0000, 0x0000 }, /* R8553 */ + { 0x0000, 0x0000, 0x0000 }, /* R8554 */ + { 0x0000, 0x0000, 0x0000 }, /* R8555 */ + { 0x0000, 0x0000, 0x0000 }, /* R8556 */ + { 0x0000, 0x0000, 0x0000 }, /* R8557 */ + { 0x0000, 0x0000, 0x0000 }, /* R8558 */ + { 0x0000, 0x0000, 0x0000 }, /* R8559 */ + { 0x0000, 0x0000, 0x0000 }, /* R8560 */ + { 0x0000, 0x0000, 0x0000 }, /* R8561 */ + { 0x0000, 0x0000, 0x0000 }, /* R8562 */ + { 0x0000, 0x0000, 0x0000 }, /* R8563 */ + { 0x0000, 0x0000, 0x0000 }, /* R8564 */ + { 0x0000, 0x0000, 0x0000 }, /* R8565 */ + { 0x0000, 0x0000, 0x0000 }, /* R8566 */ + { 0x0000, 0x0000, 0x0000 }, /* R8567 */ + { 0x0000, 0x0000, 0x0000 }, /* R8568 */ + { 0x0000, 0x0000, 0x0000 }, /* R8569 */ + { 0x0000, 0x0000, 0x0000 }, /* R8570 */ + { 0x0000, 0x0000, 0x0000 }, /* R8571 */ + { 0x0000, 0x0000, 0x0000 }, /* R8572 */ + { 0x0000, 0x0000, 0x0000 }, /* R8573 */ + { 0x0000, 0x0000, 0x0000 }, /* R8574 */ + { 0x0000, 0x0000, 0x0000 }, /* R8575 */ + { 0x0000, 0x0000, 0x0000 }, /* R8576 */ + { 0x0000, 0x0000, 0x0000 }, /* R8577 */ + { 0x0000, 0x0000, 0x0000 }, /* R8578 */ + { 0x0000, 0x0000, 0x0000 }, /* R8579 */ + { 0x0000, 0x0000, 0x0000 }, /* R8580 */ + { 0x0000, 0x0000, 0x0000 }, /* R8581 */ + { 0x0000, 0x0000, 0x0000 }, /* R8582 */ + { 0x0000, 0x0000, 0x0000 }, /* R8583 */ + { 0x0000, 0x0000, 0x0000 }, /* R8584 */ + { 0x0000, 0x0000, 0x0000 }, /* R8585 */ + { 0x0000, 0x0000, 0x0000 }, /* R8586 */ + { 0x0000, 0x0000, 0x0000 }, /* R8587 */ + { 0x0000, 0x0000, 0x0000 }, /* R8588 */ + { 0x0000, 0x0000, 0x0000 }, /* R8589 */ + { 0x0000, 0x0000, 0x0000 }, /* R8590 */ + { 0x0000, 0x0000, 0x0000 }, /* R8591 */ + { 0x0000, 0x0000, 0x0000 }, /* R8592 */ + { 0x0000, 0x0000, 0x0000 }, /* R8593 */ + { 0x0000, 0x0000, 0x0000 }, /* R8594 */ + { 0x0000, 0x0000, 0x0000 }, /* R8595 */ + { 0x0000, 0x0000, 0x0000 }, /* R8596 */ + { 0x0000, 0x0000, 0x0000 }, /* R8597 */ + { 0x0000, 0x0000, 0x0000 }, /* R8598 */ + { 0x0000, 0x0000, 0x0000 }, /* R8599 */ + { 0x0000, 0x0000, 0x0000 }, /* R8600 */ + { 0x0000, 0x0000, 0x0000 }, /* R8601 */ + { 0x0000, 0x0000, 0x0000 }, /* R8602 */ + { 0x0000, 0x0000, 0x0000 }, /* R8603 */ + { 0x0000, 0x0000, 0x0000 }, /* R8604 */ + { 0x0000, 0x0000, 0x0000 }, /* R8605 */ + { 0x0000, 0x0000, 0x0000 }, /* R8606 */ + { 0x0000, 0x0000, 0x0000 }, /* R8607 */ + { 0x0000, 0x0000, 0x0000 }, /* R8608 */ + { 0x0000, 0x0000, 0x0000 }, /* R8609 */ + { 0x0000, 0x0000, 0x0000 }, /* R8610 */ + { 0x0000, 0x0000, 0x0000 }, /* R8611 */ + { 0x0000, 0x0000, 0x0000 }, /* R8612 */ + { 0x0000, 0x0000, 0x0000 }, /* R8613 */ + { 0x0000, 0x0000, 0x0000 }, /* R8614 */ + { 0x0000, 0x0000, 0x0000 }, /* R8615 */ + { 0x0000, 0x0000, 0x0000 }, /* R8616 */ + { 0x0000, 0x0000, 0x0000 }, /* R8617 */ + { 0x0000, 0x0000, 0x0000 }, /* R8618 */ + { 0x0000, 0x0000, 0x0000 }, /* R8619 */ + { 0x0000, 0x0000, 0x0000 }, /* R8620 */ + { 0x0000, 0x0000, 0x0000 }, /* R8621 */ + { 0x0000, 0x0000, 0x0000 }, /* R8622 */ + { 0x0000, 0x0000, 0x0000 }, /* R8623 */ + { 0x0000, 0x0000, 0x0000 }, /* R8624 */ + { 0x0000, 0x0000, 0x0000 }, /* R8625 */ + { 0x0000, 0x0000, 0x0000 }, /* R8626 */ + { 0x0000, 0x0000, 0x0000 }, /* R8627 */ + { 0x0000, 0x0000, 0x0000 }, /* R8628 */ + { 0x0000, 0x0000, 0x0000 }, /* R8629 */ + { 0x0000, 0x0000, 0x0000 }, /* R8630 */ + { 0x0000, 0x0000, 0x0000 }, /* R8631 */ + { 0x0000, 0x0000, 0x0000 }, /* R8632 */ + { 0x0000, 0x0000, 0x0000 }, /* R8633 */ + { 0x0000, 0x0000, 0x0000 }, /* R8634 */ + { 0x0000, 0x0000, 0x0000 }, /* R8635 */ + { 0x0000, 0x0000, 0x0000 }, /* R8636 */ + { 0x0000, 0x0000, 0x0000 }, /* R8637 */ + { 0x0000, 0x0000, 0x0000 }, /* R8638 */ + { 0x0000, 0x0000, 0x0000 }, /* R8639 */ + { 0x0000, 0x0000, 0x0000 }, /* R8640 */ + { 0x0000, 0x0000, 0x0000 }, /* R8641 */ + { 0x0000, 0x0000, 0x0000 }, /* R8642 */ + { 0x0000, 0x0000, 0x0000 }, /* R8643 */ + { 0x0000, 0x0000, 0x0000 }, /* R8644 */ + { 0x0000, 0x0000, 0x0000 }, /* R8645 */ + { 0x0000, 0x0000, 0x0000 }, /* R8646 */ + { 0x0000, 0x0000, 0x0000 }, /* R8647 */ + { 0x0000, 0x0000, 0x0000 }, /* R8648 */ + { 0x0000, 0x0000, 0x0000 }, /* R8649 */ + { 0x0000, 0x0000, 0x0000 }, /* R8650 */ + { 0x0000, 0x0000, 0x0000 }, /* R8651 */ + { 0x0000, 0x0000, 0x0000 }, /* R8652 */ + { 0x0000, 0x0000, 0x0000 }, /* R8653 */ + { 0x0000, 0x0000, 0x0000 }, /* R8654 */ + { 0x0000, 0x0000, 0x0000 }, /* R8655 */ + { 0x0000, 0x0000, 0x0000 }, /* R8656 */ + { 0x0000, 0x0000, 0x0000 }, /* R8657 */ + { 0x0000, 0x0000, 0x0000 }, /* R8658 */ + { 0x0000, 0x0000, 0x0000 }, /* R8659 */ + { 0x0000, 0x0000, 0x0000 }, /* R8660 */ + { 0x0000, 0x0000, 0x0000 }, /* R8661 */ + { 0x0000, 0x0000, 0x0000 }, /* R8662 */ + { 0x0000, 0x0000, 0x0000 }, /* R8663 */ + { 0x0000, 0x0000, 0x0000 }, /* R8664 */ + { 0x0000, 0x0000, 0x0000 }, /* R8665 */ + { 0x0000, 0x0000, 0x0000 }, /* R8666 */ + { 0x0000, 0x0000, 0x0000 }, /* R8667 */ + { 0x0000, 0x0000, 0x0000 }, /* R8668 */ + { 0x0000, 0x0000, 0x0000 }, /* R8669 */ + { 0x0000, 0x0000, 0x0000 }, /* R8670 */ + { 0x0000, 0x0000, 0x0000 }, /* R8671 */ + { 0x0000, 0x0000, 0x0000 }, /* R8672 */ + { 0x0000, 0x0000, 0x0000 }, /* R8673 */ + { 0x0000, 0x0000, 0x0000 }, /* R8674 */ + { 0x0000, 0x0000, 0x0000 }, /* R8675 */ + { 0x0000, 0x0000, 0x0000 }, /* R8676 */ + { 0x0000, 0x0000, 0x0000 }, /* R8677 */ + { 0x0000, 0x0000, 0x0000 }, /* R8678 */ + { 0x0000, 0x0000, 0x0000 }, /* R8679 */ + { 0x0000, 0x0000, 0x0000 }, /* R8680 */ + { 0x0000, 0x0000, 0x0000 }, /* R8681 */ + { 0x0000, 0x0000, 0x0000 }, /* R8682 */ + { 0x0000, 0x0000, 0x0000 }, /* R8683 */ + { 0x0000, 0x0000, 0x0000 }, /* R8684 */ + { 0x0000, 0x0000, 0x0000 }, /* R8685 */ + { 0x0000, 0x0000, 0x0000 }, /* R8686 */ + { 0x0000, 0x0000, 0x0000 }, /* R8687 */ + { 0x0000, 0x0000, 0x0000 }, /* R8688 */ + { 0x0000, 0x0000, 0x0000 }, /* R8689 */ + { 0x0000, 0x0000, 0x0000 }, /* R8690 */ + { 0x0000, 0x0000, 0x0000 }, /* R8691 */ + { 0x0000, 0x0000, 0x0000 }, /* R8692 */ + { 0x0000, 0x0000, 0x0000 }, /* R8693 */ + { 0x0000, 0x0000, 0x0000 }, /* R8694 */ + { 0x0000, 0x0000, 0x0000 }, /* R8695 */ + { 0x0000, 0x0000, 0x0000 }, /* R8696 */ + { 0x0000, 0x0000, 0x0000 }, /* R8697 */ + { 0x0000, 0x0000, 0x0000 }, /* R8698 */ + { 0x0000, 0x0000, 0x0000 }, /* R8699 */ + { 0x0000, 0x0000, 0x0000 }, /* R8700 */ + { 0x0000, 0x0000, 0x0000 }, /* R8701 */ + { 0x0000, 0x0000, 0x0000 }, /* R8702 */ + { 0x0000, 0x0000, 0x0000 }, /* R8703 */ + { 0x0000, 0x0000, 0x0000 }, /* R8704 */ + { 0x0000, 0x0000, 0x0000 }, /* R8705 */ + { 0x0000, 0x0000, 0x0000 }, /* R8706 */ + { 0x0000, 0x0000, 0x0000 }, /* R8707 */ + { 0x0000, 0x0000, 0x0000 }, /* R8708 */ + { 0x0000, 0x0000, 0x0000 }, /* R8709 */ + { 0x0000, 0x0000, 0x0000 }, /* R8710 */ + { 0x0000, 0x0000, 0x0000 }, /* R8711 */ + { 0x0000, 0x0000, 0x0000 }, /* R8712 */ + { 0x0000, 0x0000, 0x0000 }, /* R8713 */ + { 0x0000, 0x0000, 0x0000 }, /* R8714 */ + { 0x0000, 0x0000, 0x0000 }, /* R8715 */ + { 0x0000, 0x0000, 0x0000 }, /* R8716 */ + { 0x0000, 0x0000, 0x0000 }, /* R8717 */ + { 0x0000, 0x0000, 0x0000 }, /* R8718 */ + { 0x0000, 0x0000, 0x0000 }, /* R8719 */ + { 0x0000, 0x0000, 0x0000 }, /* R8720 */ + { 0x0000, 0x0000, 0x0000 }, /* R8721 */ + { 0x0000, 0x0000, 0x0000 }, /* R8722 */ + { 0x0000, 0x0000, 0x0000 }, /* R8723 */ + { 0x0000, 0x0000, 0x0000 }, /* R8724 */ + { 0x0000, 0x0000, 0x0000 }, /* R8725 */ + { 0x0000, 0x0000, 0x0000 }, /* R8726 */ + { 0x0000, 0x0000, 0x0000 }, /* R8727 */ + { 0x0000, 0x0000, 0x0000 }, /* R8728 */ + { 0x0000, 0x0000, 0x0000 }, /* R8729 */ + { 0x0000, 0x0000, 0x0000 }, /* R8730 */ + { 0x0000, 0x0000, 0x0000 }, /* R8731 */ + { 0x0000, 0x0000, 0x0000 }, /* R8732 */ + { 0x0000, 0x0000, 0x0000 }, /* R8733 */ + { 0x0000, 0x0000, 0x0000 }, /* R8734 */ + { 0x0000, 0x0000, 0x0000 }, /* R8735 */ + { 0x0000, 0x0000, 0x0000 }, /* R8736 */ + { 0x0000, 0x0000, 0x0000 }, /* R8737 */ + { 0x0000, 0x0000, 0x0000 }, /* R8738 */ + { 0x0000, 0x0000, 0x0000 }, /* R8739 */ + { 0x0000, 0x0000, 0x0000 }, /* R8740 */ + { 0x0000, 0x0000, 0x0000 }, /* R8741 */ + { 0x0000, 0x0000, 0x0000 }, /* R8742 */ + { 0x0000, 0x0000, 0x0000 }, /* R8743 */ + { 0x0000, 0x0000, 0x0000 }, /* R8744 */ + { 0x0000, 0x0000, 0x0000 }, /* R8745 */ + { 0x0000, 0x0000, 0x0000 }, /* R8746 */ + { 0x0000, 0x0000, 0x0000 }, /* R8747 */ + { 0x0000, 0x0000, 0x0000 }, /* R8748 */ + { 0x0000, 0x0000, 0x0000 }, /* R8749 */ + { 0x0000, 0x0000, 0x0000 }, /* R8750 */ + { 0x0000, 0x0000, 0x0000 }, /* R8751 */ + { 0x0000, 0x0000, 0x0000 }, /* R8752 */ + { 0x0000, 0x0000, 0x0000 }, /* R8753 */ + { 0x0000, 0x0000, 0x0000 }, /* R8754 */ + { 0x0000, 0x0000, 0x0000 }, /* R8755 */ + { 0x0000, 0x0000, 0x0000 }, /* R8756 */ + { 0x0000, 0x0000, 0x0000 }, /* R8757 */ + { 0x0000, 0x0000, 0x0000 }, /* R8758 */ + { 0x0000, 0x0000, 0x0000 }, /* R8759 */ + { 0x0000, 0x0000, 0x0000 }, /* R8760 */ + { 0x0000, 0x0000, 0x0000 }, /* R8761 */ + { 0x0000, 0x0000, 0x0000 }, /* R8762 */ + { 0x0000, 0x0000, 0x0000 }, /* R8763 */ + { 0x0000, 0x0000, 0x0000 }, /* R8764 */ + { 0x0000, 0x0000, 0x0000 }, /* R8765 */ + { 0x0000, 0x0000, 0x0000 }, /* R8766 */ + { 0x0000, 0x0000, 0x0000 }, /* R8767 */ + { 0x0000, 0x0000, 0x0000 }, /* R8768 */ + { 0x0000, 0x0000, 0x0000 }, /* R8769 */ + { 0x0000, 0x0000, 0x0000 }, /* R8770 */ + { 0x0000, 0x0000, 0x0000 }, /* R8771 */ + { 0x0000, 0x0000, 0x0000 }, /* R8772 */ + { 0x0000, 0x0000, 0x0000 }, /* R8773 */ + { 0x0000, 0x0000, 0x0000 }, /* R8774 */ + { 0x0000, 0x0000, 0x0000 }, /* R8775 */ + { 0x0000, 0x0000, 0x0000 }, /* R8776 */ + { 0x0000, 0x0000, 0x0000 }, /* R8777 */ + { 0x0000, 0x0000, 0x0000 }, /* R8778 */ + { 0x0000, 0x0000, 0x0000 }, /* R8779 */ + { 0x0000, 0x0000, 0x0000 }, /* R8780 */ + { 0x0000, 0x0000, 0x0000 }, /* R8781 */ + { 0x0000, 0x0000, 0x0000 }, /* R8782 */ + { 0x0000, 0x0000, 0x0000 }, /* R8783 */ + { 0x0000, 0x0000, 0x0000 }, /* R8784 */ + { 0x0000, 0x0000, 0x0000 }, /* R8785 */ + { 0x0000, 0x0000, 0x0000 }, /* R8786 */ + { 0x0000, 0x0000, 0x0000 }, /* R8787 */ + { 0x0000, 0x0000, 0x0000 }, /* R8788 */ + { 0x0000, 0x0000, 0x0000 }, /* R8789 */ + { 0x0000, 0x0000, 0x0000 }, /* R8790 */ + { 0x0000, 0x0000, 0x0000 }, /* R8791 */ + { 0x0000, 0x0000, 0x0000 }, /* R8792 */ + { 0x0000, 0x0000, 0x0000 }, /* R8793 */ + { 0x0000, 0x0000, 0x0000 }, /* R8794 */ + { 0x0000, 0x0000, 0x0000 }, /* R8795 */ + { 0x0000, 0x0000, 0x0000 }, /* R8796 */ + { 0x0000, 0x0000, 0x0000 }, /* R8797 */ + { 0x0000, 0x0000, 0x0000 }, /* R8798 */ + { 0x0000, 0x0000, 0x0000 }, /* R8799 */ + { 0x0000, 0x0000, 0x0000 }, /* R8800 */ + { 0x0000, 0x0000, 0x0000 }, /* R8801 */ + { 0x0000, 0x0000, 0x0000 }, /* R8802 */ + { 0x0000, 0x0000, 0x0000 }, /* R8803 */ + { 0x0000, 0x0000, 0x0000 }, /* R8804 */ + { 0x0000, 0x0000, 0x0000 }, /* R8805 */ + { 0x0000, 0x0000, 0x0000 }, /* R8806 */ + { 0x0000, 0x0000, 0x0000 }, /* R8807 */ + { 0x0000, 0x0000, 0x0000 }, /* R8808 */ + { 0x0000, 0x0000, 0x0000 }, /* R8809 */ + { 0x0000, 0x0000, 0x0000 }, /* R8810 */ + { 0x0000, 0x0000, 0x0000 }, /* R8811 */ + { 0x0000, 0x0000, 0x0000 }, /* R8812 */ + { 0x0000, 0x0000, 0x0000 }, /* R8813 */ + { 0x0000, 0x0000, 0x0000 }, /* R8814 */ + { 0x0000, 0x0000, 0x0000 }, /* R8815 */ + { 0x0000, 0x0000, 0x0000 }, /* R8816 */ + { 0x0000, 0x0000, 0x0000 }, /* R8817 */ + { 0x0000, 0x0000, 0x0000 }, /* R8818 */ + { 0x0000, 0x0000, 0x0000 }, /* R8819 */ + { 0x0000, 0x0000, 0x0000 }, /* R8820 */ + { 0x0000, 0x0000, 0x0000 }, /* R8821 */ + { 0x0000, 0x0000, 0x0000 }, /* R8822 */ + { 0x0000, 0x0000, 0x0000 }, /* R8823 */ + { 0x0000, 0x0000, 0x0000 }, /* R8824 */ + { 0x0000, 0x0000, 0x0000 }, /* R8825 */ + { 0x0000, 0x0000, 0x0000 }, /* R8826 */ + { 0x0000, 0x0000, 0x0000 }, /* R8827 */ + { 0x0000, 0x0000, 0x0000 }, /* R8828 */ + { 0x0000, 0x0000, 0x0000 }, /* R8829 */ + { 0x0000, 0x0000, 0x0000 }, /* R8830 */ + { 0x0000, 0x0000, 0x0000 }, /* R8831 */ + { 0x0000, 0x0000, 0x0000 }, /* R8832 */ + { 0x0000, 0x0000, 0x0000 }, /* R8833 */ + { 0x0000, 0x0000, 0x0000 }, /* R8834 */ + { 0x0000, 0x0000, 0x0000 }, /* R8835 */ + { 0x0000, 0x0000, 0x0000 }, /* R8836 */ + { 0x0000, 0x0000, 0x0000 }, /* R8837 */ + { 0x0000, 0x0000, 0x0000 }, /* R8838 */ + { 0x0000, 0x0000, 0x0000 }, /* R8839 */ + { 0x0000, 0x0000, 0x0000 }, /* R8840 */ + { 0x0000, 0x0000, 0x0000 }, /* R8841 */ + { 0x0000, 0x0000, 0x0000 }, /* R8842 */ + { 0x0000, 0x0000, 0x0000 }, /* R8843 */ + { 0x0000, 0x0000, 0x0000 }, /* R8844 */ + { 0x0000, 0x0000, 0x0000 }, /* R8845 */ + { 0x0000, 0x0000, 0x0000 }, /* R8846 */ + { 0x0000, 0x0000, 0x0000 }, /* R8847 */ + { 0x0000, 0x0000, 0x0000 }, /* R8848 */ + { 0x0000, 0x0000, 0x0000 }, /* R8849 */ + { 0x0000, 0x0000, 0x0000 }, /* R8850 */ + { 0x0000, 0x0000, 0x0000 }, /* R8851 */ + { 0x0000, 0x0000, 0x0000 }, /* R8852 */ + { 0x0000, 0x0000, 0x0000 }, /* R8853 */ + { 0x0000, 0x0000, 0x0000 }, /* R8854 */ + { 0x0000, 0x0000, 0x0000 }, /* R8855 */ + { 0x0000, 0x0000, 0x0000 }, /* R8856 */ + { 0x0000, 0x0000, 0x0000 }, /* R8857 */ + { 0x0000, 0x0000, 0x0000 }, /* R8858 */ + { 0x0000, 0x0000, 0x0000 }, /* R8859 */ + { 0x0000, 0x0000, 0x0000 }, /* R8860 */ + { 0x0000, 0x0000, 0x0000 }, /* R8861 */ + { 0x0000, 0x0000, 0x0000 }, /* R8862 */ + { 0x0000, 0x0000, 0x0000 }, /* R8863 */ + { 0x0000, 0x0000, 0x0000 }, /* R8864 */ + { 0x0000, 0x0000, 0x0000 }, /* R8865 */ + { 0x0000, 0x0000, 0x0000 }, /* R8866 */ + { 0x0000, 0x0000, 0x0000 }, /* R8867 */ + { 0x0000, 0x0000, 0x0000 }, /* R8868 */ + { 0x0000, 0x0000, 0x0000 }, /* R8869 */ + { 0x0000, 0x0000, 0x0000 }, /* R8870 */ + { 0x0000, 0x0000, 0x0000 }, /* R8871 */ + { 0x0000, 0x0000, 0x0000 }, /* R8872 */ + { 0x0000, 0x0000, 0x0000 }, /* R8873 */ + { 0x0000, 0x0000, 0x0000 }, /* R8874 */ + { 0x0000, 0x0000, 0x0000 }, /* R8875 */ + { 0x0000, 0x0000, 0x0000 }, /* R8876 */ + { 0x0000, 0x0000, 0x0000 }, /* R8877 */ + { 0x0000, 0x0000, 0x0000 }, /* R8878 */ + { 0x0000, 0x0000, 0x0000 }, /* R8879 */ + { 0x0000, 0x0000, 0x0000 }, /* R8880 */ + { 0x0000, 0x0000, 0x0000 }, /* R8881 */ + { 0x0000, 0x0000, 0x0000 }, /* R8882 */ + { 0x0000, 0x0000, 0x0000 }, /* R8883 */ + { 0x0000, 0x0000, 0x0000 }, /* R8884 */ + { 0x0000, 0x0000, 0x0000 }, /* R8885 */ + { 0x0000, 0x0000, 0x0000 }, /* R8886 */ + { 0x0000, 0x0000, 0x0000 }, /* R8887 */ + { 0x0000, 0x0000, 0x0000 }, /* R8888 */ + { 0x0000, 0x0000, 0x0000 }, /* R8889 */ + { 0x0000, 0x0000, 0x0000 }, /* R8890 */ + { 0x0000, 0x0000, 0x0000 }, /* R8891 */ + { 0x0000, 0x0000, 0x0000 }, /* R8892 */ + { 0x0000, 0x0000, 0x0000 }, /* R8893 */ + { 0x0000, 0x0000, 0x0000 }, /* R8894 */ + { 0x0000, 0x0000, 0x0000 }, /* R8895 */ + { 0x0000, 0x0000, 0x0000 }, /* R8896 */ + { 0x0000, 0x0000, 0x0000 }, /* R8897 */ + { 0x0000, 0x0000, 0x0000 }, /* R8898 */ + { 0x0000, 0x0000, 0x0000 }, /* R8899 */ + { 0x0000, 0x0000, 0x0000 }, /* R8900 */ + { 0x0000, 0x0000, 0x0000 }, /* R8901 */ + { 0x0000, 0x0000, 0x0000 }, /* R8902 */ + { 0x0000, 0x0000, 0x0000 }, /* R8903 */ + { 0x0000, 0x0000, 0x0000 }, /* R8904 */ + { 0x0000, 0x0000, 0x0000 }, /* R8905 */ + { 0x0000, 0x0000, 0x0000 }, /* R8906 */ + { 0x0000, 0x0000, 0x0000 }, /* R8907 */ + { 0x0000, 0x0000, 0x0000 }, /* R8908 */ + { 0x0000, 0x0000, 0x0000 }, /* R8909 */ + { 0x0000, 0x0000, 0x0000 }, /* R8910 */ + { 0x0000, 0x0000, 0x0000 }, /* R8911 */ + { 0x0000, 0x0000, 0x0000 }, /* R8912 */ + { 0x0000, 0x0000, 0x0000 }, /* R8913 */ + { 0x0000, 0x0000, 0x0000 }, /* R8914 */ + { 0x0000, 0x0000, 0x0000 }, /* R8915 */ + { 0x0000, 0x0000, 0x0000 }, /* R8916 */ + { 0x0000, 0x0000, 0x0000 }, /* R8917 */ + { 0x0000, 0x0000, 0x0000 }, /* R8918 */ + { 0x0000, 0x0000, 0x0000 }, /* R8919 */ + { 0x0000, 0x0000, 0x0000 }, /* R8920 */ + { 0x0000, 0x0000, 0x0000 }, /* R8921 */ + { 0x0000, 0x0000, 0x0000 }, /* R8922 */ + { 0x0000, 0x0000, 0x0000 }, /* R8923 */ + { 0x0000, 0x0000, 0x0000 }, /* R8924 */ + { 0x0000, 0x0000, 0x0000 }, /* R8925 */ + { 0x0000, 0x0000, 0x0000 }, /* R8926 */ + { 0x0000, 0x0000, 0x0000 }, /* R8927 */ + { 0x0000, 0x0000, 0x0000 }, /* R8928 */ + { 0x0000, 0x0000, 0x0000 }, /* R8929 */ + { 0x0000, 0x0000, 0x0000 }, /* R8930 */ + { 0x0000, 0x0000, 0x0000 }, /* R8931 */ + { 0x0000, 0x0000, 0x0000 }, /* R8932 */ + { 0x0000, 0x0000, 0x0000 }, /* R8933 */ + { 0x0000, 0x0000, 0x0000 }, /* R8934 */ + { 0x0000, 0x0000, 0x0000 }, /* R8935 */ + { 0x0000, 0x0000, 0x0000 }, /* R8936 */ + { 0x0000, 0x0000, 0x0000 }, /* R8937 */ + { 0x0000, 0x0000, 0x0000 }, /* R8938 */ + { 0x0000, 0x0000, 0x0000 }, /* R8939 */ + { 0x0000, 0x0000, 0x0000 }, /* R8940 */ + { 0x0000, 0x0000, 0x0000 }, /* R8941 */ + { 0x0000, 0x0000, 0x0000 }, /* R8942 */ + { 0x0000, 0x0000, 0x0000 }, /* R8943 */ + { 0x0000, 0x0000, 0x0000 }, /* R8944 */ + { 0x0000, 0x0000, 0x0000 }, /* R8945 */ + { 0x0000, 0x0000, 0x0000 }, /* R8946 */ + { 0x0000, 0x0000, 0x0000 }, /* R8947 */ + { 0x0000, 0x0000, 0x0000 }, /* R8948 */ + { 0x0000, 0x0000, 0x0000 }, /* R8949 */ + { 0x0000, 0x0000, 0x0000 }, /* R8950 */ + { 0x0000, 0x0000, 0x0000 }, /* R8951 */ + { 0x0000, 0x0000, 0x0000 }, /* R8952 */ + { 0x0000, 0x0000, 0x0000 }, /* R8953 */ + { 0x0000, 0x0000, 0x0000 }, /* R8954 */ + { 0x0000, 0x0000, 0x0000 }, /* R8955 */ + { 0x0000, 0x0000, 0x0000 }, /* R8956 */ + { 0x0000, 0x0000, 0x0000 }, /* R8957 */ + { 0x0000, 0x0000, 0x0000 }, /* R8958 */ + { 0x0000, 0x0000, 0x0000 }, /* R8959 */ + { 0x0000, 0x0000, 0x0000 }, /* R8960 */ + { 0x0000, 0x0000, 0x0000 }, /* R8961 */ + { 0x0000, 0x0000, 0x0000 }, /* R8962 */ + { 0x0000, 0x0000, 0x0000 }, /* R8963 */ + { 0x0000, 0x0000, 0x0000 }, /* R8964 */ + { 0x0000, 0x0000, 0x0000 }, /* R8965 */ + { 0x0000, 0x0000, 0x0000 }, /* R8966 */ + { 0x0000, 0x0000, 0x0000 }, /* R8967 */ + { 0x0000, 0x0000, 0x0000 }, /* R8968 */ + { 0x0000, 0x0000, 0x0000 }, /* R8969 */ + { 0x0000, 0x0000, 0x0000 }, /* R8970 */ + { 0x0000, 0x0000, 0x0000 }, /* R8971 */ + { 0x0000, 0x0000, 0x0000 }, /* R8972 */ + { 0x0000, 0x0000, 0x0000 }, /* R8973 */ + { 0x0000, 0x0000, 0x0000 }, /* R8974 */ + { 0x0000, 0x0000, 0x0000 }, /* R8975 */ + { 0x0000, 0x0000, 0x0000 }, /* R8976 */ + { 0x0000, 0x0000, 0x0000 }, /* R8977 */ + { 0x0000, 0x0000, 0x0000 }, /* R8978 */ + { 0x0000, 0x0000, 0x0000 }, /* R8979 */ + { 0x0000, 0x0000, 0x0000 }, /* R8980 */ + { 0x0000, 0x0000, 0x0000 }, /* R8981 */ + { 0x0000, 0x0000, 0x0000 }, /* R8982 */ + { 0x0000, 0x0000, 0x0000 }, /* R8983 */ + { 0x0000, 0x0000, 0x0000 }, /* R8984 */ + { 0x0000, 0x0000, 0x0000 }, /* R8985 */ + { 0x0000, 0x0000, 0x0000 }, /* R8986 */ + { 0x0000, 0x0000, 0x0000 }, /* R8987 */ + { 0x0000, 0x0000, 0x0000 }, /* R8988 */ + { 0x0000, 0x0000, 0x0000 }, /* R8989 */ + { 0x0000, 0x0000, 0x0000 }, /* R8990 */ + { 0x0000, 0x0000, 0x0000 }, /* R8991 */ + { 0x0000, 0x0000, 0x0000 }, /* R8992 */ + { 0x0000, 0x0000, 0x0000 }, /* R8993 */ + { 0x0000, 0x0000, 0x0000 }, /* R8994 */ + { 0x0000, 0x0000, 0x0000 }, /* R8995 */ + { 0x0000, 0x0000, 0x0000 }, /* R8996 */ + { 0x0000, 0x0000, 0x0000 }, /* R8997 */ + { 0x0000, 0x0000, 0x0000 }, /* R8998 */ + { 0x0000, 0x0000, 0x0000 }, /* R8999 */ + { 0x0000, 0x0000, 0x0000 }, /* R9000 */ + { 0x0000, 0x0000, 0x0000 }, /* R9001 */ + { 0x0000, 0x0000, 0x0000 }, /* R9002 */ + { 0x0000, 0x0000, 0x0000 }, /* R9003 */ + { 0x0000, 0x0000, 0x0000 }, /* R9004 */ + { 0x0000, 0x0000, 0x0000 }, /* R9005 */ + { 0x0000, 0x0000, 0x0000 }, /* R9006 */ + { 0x0000, 0x0000, 0x0000 }, /* R9007 */ + { 0x0000, 0x0000, 0x0000 }, /* R9008 */ + { 0x0000, 0x0000, 0x0000 }, /* R9009 */ + { 0x0000, 0x0000, 0x0000 }, /* R9010 */ + { 0x0000, 0x0000, 0x0000 }, /* R9011 */ + { 0x0000, 0x0000, 0x0000 }, /* R9012 */ + { 0x0000, 0x0000, 0x0000 }, /* R9013 */ + { 0x0000, 0x0000, 0x0000 }, /* R9014 */ + { 0x0000, 0x0000, 0x0000 }, /* R9015 */ + { 0x0000, 0x0000, 0x0000 }, /* R9016 */ + { 0x0000, 0x0000, 0x0000 }, /* R9017 */ + { 0x0000, 0x0000, 0x0000 }, /* R9018 */ + { 0x0000, 0x0000, 0x0000 }, /* R9019 */ + { 0x0000, 0x0000, 0x0000 }, /* R9020 */ + { 0x0000, 0x0000, 0x0000 }, /* R9021 */ + { 0x0000, 0x0000, 0x0000 }, /* R9022 */ + { 0x0000, 0x0000, 0x0000 }, /* R9023 */ + { 0x0000, 0x0000, 0x0000 }, /* R9024 */ + { 0x0000, 0x0000, 0x0000 }, /* R9025 */ + { 0x0000, 0x0000, 0x0000 }, /* R9026 */ + { 0x0000, 0x0000, 0x0000 }, /* R9027 */ + { 0x0000, 0x0000, 0x0000 }, /* R9028 */ + { 0x0000, 0x0000, 0x0000 }, /* R9029 */ + { 0x0000, 0x0000, 0x0000 }, /* R9030 */ + { 0x0000, 0x0000, 0x0000 }, /* R9031 */ + { 0x0000, 0x0000, 0x0000 }, /* R9032 */ + { 0x0000, 0x0000, 0x0000 }, /* R9033 */ + { 0x0000, 0x0000, 0x0000 }, /* R9034 */ + { 0x0000, 0x0000, 0x0000 }, /* R9035 */ + { 0x0000, 0x0000, 0x0000 }, /* R9036 */ + { 0x0000, 0x0000, 0x0000 }, /* R9037 */ + { 0x0000, 0x0000, 0x0000 }, /* R9038 */ + { 0x0000, 0x0000, 0x0000 }, /* R9039 */ + { 0x0000, 0x0000, 0x0000 }, /* R9040 */ + { 0x0000, 0x0000, 0x0000 }, /* R9041 */ + { 0x0000, 0x0000, 0x0000 }, /* R9042 */ + { 0x0000, 0x0000, 0x0000 }, /* R9043 */ + { 0x0000, 0x0000, 0x0000 }, /* R9044 */ + { 0x0000, 0x0000, 0x0000 }, /* R9045 */ + { 0x0000, 0x0000, 0x0000 }, /* R9046 */ + { 0x0000, 0x0000, 0x0000 }, /* R9047 */ + { 0x0000, 0x0000, 0x0000 }, /* R9048 */ + { 0x0000, 0x0000, 0x0000 }, /* R9049 */ + { 0x0000, 0x0000, 0x0000 }, /* R9050 */ + { 0x0000, 0x0000, 0x0000 }, /* R9051 */ + { 0x0000, 0x0000, 0x0000 }, /* R9052 */ + { 0x0000, 0x0000, 0x0000 }, /* R9053 */ + { 0x0000, 0x0000, 0x0000 }, /* R9054 */ + { 0x0000, 0x0000, 0x0000 }, /* R9055 */ + { 0x0000, 0x0000, 0x0000 }, /* R9056 */ + { 0x0000, 0x0000, 0x0000 }, /* R9057 */ + { 0x0000, 0x0000, 0x0000 }, /* R9058 */ + { 0x0000, 0x0000, 0x0000 }, /* R9059 */ + { 0x0000, 0x0000, 0x0000 }, /* R9060 */ + { 0x0000, 0x0000, 0x0000 }, /* R9061 */ + { 0x0000, 0x0000, 0x0000 }, /* R9062 */ + { 0x0000, 0x0000, 0x0000 }, /* R9063 */ + { 0x0000, 0x0000, 0x0000 }, /* R9064 */ + { 0x0000, 0x0000, 0x0000 }, /* R9065 */ + { 0x0000, 0x0000, 0x0000 }, /* R9066 */ + { 0x0000, 0x0000, 0x0000 }, /* R9067 */ + { 0x0000, 0x0000, 0x0000 }, /* R9068 */ + { 0x0000, 0x0000, 0x0000 }, /* R9069 */ + { 0x0000, 0x0000, 0x0000 }, /* R9070 */ + { 0x0000, 0x0000, 0x0000 }, /* R9071 */ + { 0x0000, 0x0000, 0x0000 }, /* R9072 */ + { 0x0000, 0x0000, 0x0000 }, /* R9073 */ + { 0x0000, 0x0000, 0x0000 }, /* R9074 */ + { 0x0000, 0x0000, 0x0000 }, /* R9075 */ + { 0x0000, 0x0000, 0x0000 }, /* R9076 */ + { 0x0000, 0x0000, 0x0000 }, /* R9077 */ + { 0x0000, 0x0000, 0x0000 }, /* R9078 */ + { 0x0000, 0x0000, 0x0000 }, /* R9079 */ + { 0x0000, 0x0000, 0x0000 }, /* R9080 */ + { 0x0000, 0x0000, 0x0000 }, /* R9081 */ + { 0x0000, 0x0000, 0x0000 }, /* R9082 */ + { 0x0000, 0x0000, 0x0000 }, /* R9083 */ + { 0x0000, 0x0000, 0x0000 }, /* R9084 */ + { 0x0000, 0x0000, 0x0000 }, /* R9085 */ + { 0x0000, 0x0000, 0x0000 }, /* R9086 */ + { 0x0000, 0x0000, 0x0000 }, /* R9087 */ + { 0x0000, 0x0000, 0x0000 }, /* R9088 */ + { 0x0000, 0x0000, 0x0000 }, /* R9089 */ + { 0x0000, 0x0000, 0x0000 }, /* R9090 */ + { 0x0000, 0x0000, 0x0000 }, /* R9091 */ + { 0x0000, 0x0000, 0x0000 }, /* R9092 */ + { 0x0000, 0x0000, 0x0000 }, /* R9093 */ + { 0x0000, 0x0000, 0x0000 }, /* R9094 */ + { 0x0000, 0x0000, 0x0000 }, /* R9095 */ + { 0x0000, 0x0000, 0x0000 }, /* R9096 */ + { 0x0000, 0x0000, 0x0000 }, /* R9097 */ + { 0x0000, 0x0000, 0x0000 }, /* R9098 */ + { 0x0000, 0x0000, 0x0000 }, /* R9099 */ + { 0x0000, 0x0000, 0x0000 }, /* R9100 */ + { 0x0000, 0x0000, 0x0000 }, /* R9101 */ + { 0x0000, 0x0000, 0x0000 }, /* R9102 */ + { 0x0000, 0x0000, 0x0000 }, /* R9103 */ + { 0x0000, 0x0000, 0x0000 }, /* R9104 */ + { 0x0000, 0x0000, 0x0000 }, /* R9105 */ + { 0x0000, 0x0000, 0x0000 }, /* R9106 */ + { 0x0000, 0x0000, 0x0000 }, /* R9107 */ + { 0x0000, 0x0000, 0x0000 }, /* R9108 */ + { 0x0000, 0x0000, 0x0000 }, /* R9109 */ + { 0x0000, 0x0000, 0x0000 }, /* R9110 */ + { 0x0000, 0x0000, 0x0000 }, /* R9111 */ + { 0x0000, 0x0000, 0x0000 }, /* R9112 */ + { 0x0000, 0x0000, 0x0000 }, /* R9113 */ + { 0x0000, 0x0000, 0x0000 }, /* R9114 */ + { 0x0000, 0x0000, 0x0000 }, /* R9115 */ + { 0x0000, 0x0000, 0x0000 }, /* R9116 */ + { 0x0000, 0x0000, 0x0000 }, /* R9117 */ + { 0x0000, 0x0000, 0x0000 }, /* R9118 */ + { 0x0000, 0x0000, 0x0000 }, /* R9119 */ + { 0x0000, 0x0000, 0x0000 }, /* R9120 */ + { 0x0000, 0x0000, 0x0000 }, /* R9121 */ + { 0x0000, 0x0000, 0x0000 }, /* R9122 */ + { 0x0000, 0x0000, 0x0000 }, /* R9123 */ + { 0x0000, 0x0000, 0x0000 }, /* R9124 */ + { 0x0000, 0x0000, 0x0000 }, /* R9125 */ + { 0x0000, 0x0000, 0x0000 }, /* R9126 */ + { 0x0000, 0x0000, 0x0000 }, /* R9127 */ + { 0x0000, 0x0000, 0x0000 }, /* R9128 */ + { 0x0000, 0x0000, 0x0000 }, /* R9129 */ + { 0x0000, 0x0000, 0x0000 }, /* R9130 */ + { 0x0000, 0x0000, 0x0000 }, /* R9131 */ + { 0x0000, 0x0000, 0x0000 }, /* R9132 */ + { 0x0000, 0x0000, 0x0000 }, /* R9133 */ + { 0x0000, 0x0000, 0x0000 }, /* R9134 */ + { 0x0000, 0x0000, 0x0000 }, /* R9135 */ + { 0x0000, 0x0000, 0x0000 }, /* R9136 */ + { 0x0000, 0x0000, 0x0000 }, /* R9137 */ + { 0x0000, 0x0000, 0x0000 }, /* R9138 */ + { 0x0000, 0x0000, 0x0000 }, /* R9139 */ + { 0x0000, 0x0000, 0x0000 }, /* R9140 */ + { 0x0000, 0x0000, 0x0000 }, /* R9141 */ + { 0x0000, 0x0000, 0x0000 }, /* R9142 */ + { 0x0000, 0x0000, 0x0000 }, /* R9143 */ + { 0x0000, 0x0000, 0x0000 }, /* R9144 */ + { 0x0000, 0x0000, 0x0000 }, /* R9145 */ + { 0x0000, 0x0000, 0x0000 }, /* R9146 */ + { 0x0000, 0x0000, 0x0000 }, /* R9147 */ + { 0x0000, 0x0000, 0x0000 }, /* R9148 */ + { 0x0000, 0x0000, 0x0000 }, /* R9149 */ + { 0x0000, 0x0000, 0x0000 }, /* R9150 */ + { 0x0000, 0x0000, 0x0000 }, /* R9151 */ + { 0x0000, 0x0000, 0x0000 }, /* R9152 */ + { 0x0000, 0x0000, 0x0000 }, /* R9153 */ + { 0x0000, 0x0000, 0x0000 }, /* R9154 */ + { 0x0000, 0x0000, 0x0000 }, /* R9155 */ + { 0x0000, 0x0000, 0x0000 }, /* R9156 */ + { 0x0000, 0x0000, 0x0000 }, /* R9157 */ + { 0x0000, 0x0000, 0x0000 }, /* R9158 */ + { 0x0000, 0x0000, 0x0000 }, /* R9159 */ + { 0x0000, 0x0000, 0x0000 }, /* R9160 */ + { 0x0000, 0x0000, 0x0000 }, /* R9161 */ + { 0x0000, 0x0000, 0x0000 }, /* R9162 */ + { 0x0000, 0x0000, 0x0000 }, /* R9163 */ + { 0x0000, 0x0000, 0x0000 }, /* R9164 */ + { 0x0000, 0x0000, 0x0000 }, /* R9165 */ + { 0x0000, 0x0000, 0x0000 }, /* R9166 */ + { 0x0000, 0x0000, 0x0000 }, /* R9167 */ + { 0x0000, 0x0000, 0x0000 }, /* R9168 */ + { 0x0000, 0x0000, 0x0000 }, /* R9169 */ + { 0x0000, 0x0000, 0x0000 }, /* R9170 */ + { 0x0000, 0x0000, 0x0000 }, /* R9171 */ + { 0x0000, 0x0000, 0x0000 }, /* R9172 */ + { 0x0000, 0x0000, 0x0000 }, /* R9173 */ + { 0x0000, 0x0000, 0x0000 }, /* R9174 */ + { 0x0000, 0x0000, 0x0000 }, /* R9175 */ + { 0x0000, 0x0000, 0x0000 }, /* R9176 */ + { 0x0000, 0x0000, 0x0000 }, /* R9177 */ + { 0x0000, 0x0000, 0x0000 }, /* R9178 */ + { 0x0000, 0x0000, 0x0000 }, /* R9179 */ + { 0x0000, 0x0000, 0x0000 }, /* R9180 */ + { 0x0000, 0x0000, 0x0000 }, /* R9181 */ + { 0x0000, 0x0000, 0x0000 }, /* R9182 */ + { 0x0000, 0x0000, 0x0000 }, /* R9183 */ + { 0x0000, 0x0000, 0x0000 }, /* R9184 */ + { 0x0000, 0x0000, 0x0000 }, /* R9185 */ + { 0x0000, 0x0000, 0x0000 }, /* R9186 */ + { 0x0000, 0x0000, 0x0000 }, /* R9187 */ + { 0x0000, 0x0000, 0x0000 }, /* R9188 */ + { 0x0000, 0x0000, 0x0000 }, /* R9189 */ + { 0x0000, 0x0000, 0x0000 }, /* R9190 */ + { 0x0000, 0x0000, 0x0000 }, /* R9191 */ + { 0x0000, 0x0000, 0x0000 }, /* R9192 */ + { 0x0000, 0x0000, 0x0000 }, /* R9193 */ + { 0x0000, 0x0000, 0x0000 }, /* R9194 */ + { 0x0000, 0x0000, 0x0000 }, /* R9195 */ + { 0x0000, 0x0000, 0x0000 }, /* R9196 */ + { 0x0000, 0x0000, 0x0000 }, /* R9197 */ + { 0x0000, 0x0000, 0x0000 }, /* R9198 */ + { 0x0000, 0x0000, 0x0000 }, /* R9199 */ + { 0x0000, 0x0000, 0x0000 }, /* R9200 */ + { 0x0000, 0x0000, 0x0000 }, /* R9201 */ + { 0x0000, 0x0000, 0x0000 }, /* R9202 */ + { 0x0000, 0x0000, 0x0000 }, /* R9203 */ + { 0x0000, 0x0000, 0x0000 }, /* R9204 */ + { 0x0000, 0x0000, 0x0000 }, /* R9205 */ + { 0x0000, 0x0000, 0x0000 }, /* R9206 */ + { 0x0000, 0x0000, 0x0000 }, /* R9207 */ + { 0x0000, 0x0000, 0x0000 }, /* R9208 */ + { 0x0000, 0x0000, 0x0000 }, /* R9209 */ + { 0x0000, 0x0000, 0x0000 }, /* R9210 */ + { 0x0000, 0x0000, 0x0000 }, /* R9211 */ + { 0x0000, 0x0000, 0x0000 }, /* R9212 */ + { 0x0000, 0x0000, 0x0000 }, /* R9213 */ + { 0x0000, 0x0000, 0x0000 }, /* R9214 */ + { 0x0000, 0x0000, 0x0000 }, /* R9215 */ + { 0x003F, 0x003F, 0x0000 }, /* R9216 - DSP2 Address RAM 2 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R9217 - DSP2 Address RAM 1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R9218 - DSP2 Address RAM 0 */ + { 0x0000, 0x0000, 0x0000 }, /* R9219 */ + { 0x0000, 0x0000, 0x0000 }, /* R9220 */ + { 0x0000, 0x0000, 0x0000 }, /* R9221 */ + { 0x0000, 0x0000, 0x0000 }, /* R9222 */ + { 0x0000, 0x0000, 0x0000 }, /* R9223 */ + { 0x0000, 0x0000, 0x0000 }, /* R9224 */ + { 0x0000, 0x0000, 0x0000 }, /* R9225 */ + { 0x0000, 0x0000, 0x0000 }, /* R9226 */ + { 0x0000, 0x0000, 0x0000 }, /* R9227 */ + { 0x0000, 0x0000, 0x0000 }, /* R9228 */ + { 0x0000, 0x0000, 0x0000 }, /* R9229 */ + { 0x0000, 0x0000, 0x0000 }, /* R9230 */ + { 0x0000, 0x0000, 0x0000 }, /* R9231 */ + { 0x0000, 0x0000, 0x0000 }, /* R9232 */ + { 0x0000, 0x0000, 0x0000 }, /* R9233 */ + { 0x0000, 0x0000, 0x0000 }, /* R9234 */ + { 0x0000, 0x0000, 0x0000 }, /* R9235 */ + { 0x0000, 0x0000, 0x0000 }, /* R9236 */ + { 0x0000, 0x0000, 0x0000 }, /* R9237 */ + { 0x0000, 0x0000, 0x0000 }, /* R9238 */ + { 0x0000, 0x0000, 0x0000 }, /* R9239 */ + { 0x0000, 0x0000, 0x0000 }, /* R9240 */ + { 0x0000, 0x0000, 0x0000 }, /* R9241 */ + { 0x0000, 0x0000, 0x0000 }, /* R9242 */ + { 0x0000, 0x0000, 0x0000 }, /* R9243 */ + { 0x0000, 0x0000, 0x0000 }, /* R9244 */ + { 0x0000, 0x0000, 0x0000 }, /* R9245 */ + { 0x0000, 0x0000, 0x0000 }, /* R9246 */ + { 0x0000, 0x0000, 0x0000 }, /* R9247 */ + { 0x0000, 0x0000, 0x0000 }, /* R9248 */ + { 0x0000, 0x0000, 0x0000 }, /* R9249 */ + { 0x0000, 0x0000, 0x0000 }, /* R9250 */ + { 0x0000, 0x0000, 0x0000 }, /* R9251 */ + { 0x0000, 0x0000, 0x0000 }, /* R9252 */ + { 0x0000, 0x0000, 0x0000 }, /* R9253 */ + { 0x0000, 0x0000, 0x0000 }, /* R9254 */ + { 0x0000, 0x0000, 0x0000 }, /* R9255 */ + { 0x0000, 0x0000, 0x0000 }, /* R9256 */ + { 0x0000, 0x0000, 0x0000 }, /* R9257 */ + { 0x0000, 0x0000, 0x0000 }, /* R9258 */ + { 0x0000, 0x0000, 0x0000 }, /* R9259 */ + { 0x0000, 0x0000, 0x0000 }, /* R9260 */ + { 0x0000, 0x0000, 0x0000 }, /* R9261 */ + { 0x0000, 0x0000, 0x0000 }, /* R9262 */ + { 0x0000, 0x0000, 0x0000 }, /* R9263 */ + { 0x0000, 0x0000, 0x0000 }, /* R9264 */ + { 0x0000, 0x0000, 0x0000 }, /* R9265 */ + { 0x0000, 0x0000, 0x0000 }, /* R9266 */ + { 0x0000, 0x0000, 0x0000 }, /* R9267 */ + { 0x0000, 0x0000, 0x0000 }, /* R9268 */ + { 0x0000, 0x0000, 0x0000 }, /* R9269 */ + { 0x0000, 0x0000, 0x0000 }, /* R9270 */ + { 0x0000, 0x0000, 0x0000 }, /* R9271 */ + { 0x0000, 0x0000, 0x0000 }, /* R9272 */ + { 0x0000, 0x0000, 0x0000 }, /* R9273 */ + { 0x0000, 0x0000, 0x0000 }, /* R9274 */ + { 0x0000, 0x0000, 0x0000 }, /* R9275 */ + { 0x0000, 0x0000, 0x0000 }, /* R9276 */ + { 0x0000, 0x0000, 0x0000 }, /* R9277 */ + { 0x0000, 0x0000, 0x0000 }, /* R9278 */ + { 0x0000, 0x0000, 0x0000 }, /* R9279 */ + { 0x0000, 0x0000, 0x0000 }, /* R9280 */ + { 0x0000, 0x0000, 0x0000 }, /* R9281 */ + { 0x0000, 0x0000, 0x0000 }, /* R9282 */ + { 0x0000, 0x0000, 0x0000 }, /* R9283 */ + { 0x0000, 0x0000, 0x0000 }, /* R9284 */ + { 0x0000, 0x0000, 0x0000 }, /* R9285 */ + { 0x0000, 0x0000, 0x0000 }, /* R9286 */ + { 0x0000, 0x0000, 0x0000 }, /* R9287 */ + { 0x0000, 0x0000, 0x0000 }, /* R9288 */ + { 0x0000, 0x0000, 0x0000 }, /* R9289 */ + { 0x0000, 0x0000, 0x0000 }, /* R9290 */ + { 0x0000, 0x0000, 0x0000 }, /* R9291 */ + { 0x0000, 0x0000, 0x0000 }, /* R9292 */ + { 0x0000, 0x0000, 0x0000 }, /* R9293 */ + { 0x0000, 0x0000, 0x0000 }, /* R9294 */ + { 0x0000, 0x0000, 0x0000 }, /* R9295 */ + { 0x0000, 0x0000, 0x0000 }, /* R9296 */ + { 0x0000, 0x0000, 0x0000 }, /* R9297 */ + { 0x0000, 0x0000, 0x0000 }, /* R9298 */ + { 0x0000, 0x0000, 0x0000 }, /* R9299 */ + { 0x0000, 0x0000, 0x0000 }, /* R9300 */ + { 0x0000, 0x0000, 0x0000 }, /* R9301 */ + { 0x0000, 0x0000, 0x0000 }, /* R9302 */ + { 0x0000, 0x0000, 0x0000 }, /* R9303 */ + { 0x0000, 0x0000, 0x0000 }, /* R9304 */ + { 0x0000, 0x0000, 0x0000 }, /* R9305 */ + { 0x0000, 0x0000, 0x0000 }, /* R9306 */ + { 0x0000, 0x0000, 0x0000 }, /* R9307 */ + { 0x0000, 0x0000, 0x0000 }, /* R9308 */ + { 0x0000, 0x0000, 0x0000 }, /* R9309 */ + { 0x0000, 0x0000, 0x0000 }, /* R9310 */ + { 0x0000, 0x0000, 0x0000 }, /* R9311 */ + { 0x0000, 0x0000, 0x0000 }, /* R9312 */ + { 0x0000, 0x0000, 0x0000 }, /* R9313 */ + { 0x0000, 0x0000, 0x0000 }, /* R9314 */ + { 0x0000, 0x0000, 0x0000 }, /* R9315 */ + { 0x0000, 0x0000, 0x0000 }, /* R9316 */ + { 0x0000, 0x0000, 0x0000 }, /* R9317 */ + { 0x0000, 0x0000, 0x0000 }, /* R9318 */ + { 0x0000, 0x0000, 0x0000 }, /* R9319 */ + { 0x0000, 0x0000, 0x0000 }, /* R9320 */ + { 0x0000, 0x0000, 0x0000 }, /* R9321 */ + { 0x0000, 0x0000, 0x0000 }, /* R9322 */ + { 0x0000, 0x0000, 0x0000 }, /* R9323 */ + { 0x0000, 0x0000, 0x0000 }, /* R9324 */ + { 0x0000, 0x0000, 0x0000 }, /* R9325 */ + { 0x0000, 0x0000, 0x0000 }, /* R9326 */ + { 0x0000, 0x0000, 0x0000 }, /* R9327 */ + { 0x0000, 0x0000, 0x0000 }, /* R9328 */ + { 0x0000, 0x0000, 0x0000 }, /* R9329 */ + { 0x0000, 0x0000, 0x0000 }, /* R9330 */ + { 0x0000, 0x0000, 0x0000 }, /* R9331 */ + { 0x0000, 0x0000, 0x0000 }, /* R9332 */ + { 0x0000, 0x0000, 0x0000 }, /* R9333 */ + { 0x0000, 0x0000, 0x0000 }, /* R9334 */ + { 0x0000, 0x0000, 0x0000 }, /* R9335 */ + { 0x0000, 0x0000, 0x0000 }, /* R9336 */ + { 0x0000, 0x0000, 0x0000 }, /* R9337 */ + { 0x0000, 0x0000, 0x0000 }, /* R9338 */ + { 0x0000, 0x0000, 0x0000 }, /* R9339 */ + { 0x0000, 0x0000, 0x0000 }, /* R9340 */ + { 0x0000, 0x0000, 0x0000 }, /* R9341 */ + { 0x0000, 0x0000, 0x0000 }, /* R9342 */ + { 0x0000, 0x0000, 0x0000 }, /* R9343 */ + { 0x0000, 0x0000, 0x0000 }, /* R9344 */ + { 0x0000, 0x0000, 0x0000 }, /* R9345 */ + { 0x0000, 0x0000, 0x0000 }, /* R9346 */ + { 0x0000, 0x0000, 0x0000 }, /* R9347 */ + { 0x0000, 0x0000, 0x0000 }, /* R9348 */ + { 0x0000, 0x0000, 0x0000 }, /* R9349 */ + { 0x0000, 0x0000, 0x0000 }, /* R9350 */ + { 0x0000, 0x0000, 0x0000 }, /* R9351 */ + { 0x0000, 0x0000, 0x0000 }, /* R9352 */ + { 0x0000, 0x0000, 0x0000 }, /* R9353 */ + { 0x0000, 0x0000, 0x0000 }, /* R9354 */ + { 0x0000, 0x0000, 0x0000 }, /* R9355 */ + { 0x0000, 0x0000, 0x0000 }, /* R9356 */ + { 0x0000, 0x0000, 0x0000 }, /* R9357 */ + { 0x0000, 0x0000, 0x0000 }, /* R9358 */ + { 0x0000, 0x0000, 0x0000 }, /* R9359 */ + { 0x0000, 0x0000, 0x0000 }, /* R9360 */ + { 0x0000, 0x0000, 0x0000 }, /* R9361 */ + { 0x0000, 0x0000, 0x0000 }, /* R9362 */ + { 0x0000, 0x0000, 0x0000 }, /* R9363 */ + { 0x0000, 0x0000, 0x0000 }, /* R9364 */ + { 0x0000, 0x0000, 0x0000 }, /* R9365 */ + { 0x0000, 0x0000, 0x0000 }, /* R9366 */ + { 0x0000, 0x0000, 0x0000 }, /* R9367 */ + { 0x0000, 0x0000, 0x0000 }, /* R9368 */ + { 0x0000, 0x0000, 0x0000 }, /* R9369 */ + { 0x0000, 0x0000, 0x0000 }, /* R9370 */ + { 0x0000, 0x0000, 0x0000 }, /* R9371 */ + { 0x0000, 0x0000, 0x0000 }, /* R9372 */ + { 0x0000, 0x0000, 0x0000 }, /* R9373 */ + { 0x0000, 0x0000, 0x0000 }, /* R9374 */ + { 0x0000, 0x0000, 0x0000 }, /* R9375 */ + { 0x0000, 0x0000, 0x0000 }, /* R9376 */ + { 0x0000, 0x0000, 0x0000 }, /* R9377 */ + { 0x0000, 0x0000, 0x0000 }, /* R9378 */ + { 0x0000, 0x0000, 0x0000 }, /* R9379 */ + { 0x0000, 0x0000, 0x0000 }, /* R9380 */ + { 0x0000, 0x0000, 0x0000 }, /* R9381 */ + { 0x0000, 0x0000, 0x0000 }, /* R9382 */ + { 0x0000, 0x0000, 0x0000 }, /* R9383 */ + { 0x0000, 0x0000, 0x0000 }, /* R9384 */ + { 0x0000, 0x0000, 0x0000 }, /* R9385 */ + { 0x0000, 0x0000, 0x0000 }, /* R9386 */ + { 0x0000, 0x0000, 0x0000 }, /* R9387 */ + { 0x0000, 0x0000, 0x0000 }, /* R9388 */ + { 0x0000, 0x0000, 0x0000 }, /* R9389 */ + { 0x0000, 0x0000, 0x0000 }, /* R9390 */ + { 0x0000, 0x0000, 0x0000 }, /* R9391 */ + { 0x0000, 0x0000, 0x0000 }, /* R9392 */ + { 0x0000, 0x0000, 0x0000 }, /* R9393 */ + { 0x0000, 0x0000, 0x0000 }, /* R9394 */ + { 0x0000, 0x0000, 0x0000 }, /* R9395 */ + { 0x0000, 0x0000, 0x0000 }, /* R9396 */ + { 0x0000, 0x0000, 0x0000 }, /* R9397 */ + { 0x0000, 0x0000, 0x0000 }, /* R9398 */ + { 0x0000, 0x0000, 0x0000 }, /* R9399 */ + { 0x0000, 0x0000, 0x0000 }, /* R9400 */ + { 0x0000, 0x0000, 0x0000 }, /* R9401 */ + { 0x0000, 0x0000, 0x0000 }, /* R9402 */ + { 0x0000, 0x0000, 0x0000 }, /* R9403 */ + { 0x0000, 0x0000, 0x0000 }, /* R9404 */ + { 0x0000, 0x0000, 0x0000 }, /* R9405 */ + { 0x0000, 0x0000, 0x0000 }, /* R9406 */ + { 0x0000, 0x0000, 0x0000 }, /* R9407 */ + { 0x0000, 0x0000, 0x0000 }, /* R9408 */ + { 0x0000, 0x0000, 0x0000 }, /* R9409 */ + { 0x0000, 0x0000, 0x0000 }, /* R9410 */ + { 0x0000, 0x0000, 0x0000 }, /* R9411 */ + { 0x0000, 0x0000, 0x0000 }, /* R9412 */ + { 0x0000, 0x0000, 0x0000 }, /* R9413 */ + { 0x0000, 0x0000, 0x0000 }, /* R9414 */ + { 0x0000, 0x0000, 0x0000 }, /* R9415 */ + { 0x0000, 0x0000, 0x0000 }, /* R9416 */ + { 0x0000, 0x0000, 0x0000 }, /* R9417 */ + { 0x0000, 0x0000, 0x0000 }, /* R9418 */ + { 0x0000, 0x0000, 0x0000 }, /* R9419 */ + { 0x0000, 0x0000, 0x0000 }, /* R9420 */ + { 0x0000, 0x0000, 0x0000 }, /* R9421 */ + { 0x0000, 0x0000, 0x0000 }, /* R9422 */ + { 0x0000, 0x0000, 0x0000 }, /* R9423 */ + { 0x0000, 0x0000, 0x0000 }, /* R9424 */ + { 0x0000, 0x0000, 0x0000 }, /* R9425 */ + { 0x0000, 0x0000, 0x0000 }, /* R9426 */ + { 0x0000, 0x0000, 0x0000 }, /* R9427 */ + { 0x0000, 0x0000, 0x0000 }, /* R9428 */ + { 0x0000, 0x0000, 0x0000 }, /* R9429 */ + { 0x0000, 0x0000, 0x0000 }, /* R9430 */ + { 0x0000, 0x0000, 0x0000 }, /* R9431 */ + { 0x0000, 0x0000, 0x0000 }, /* R9432 */ + { 0x0000, 0x0000, 0x0000 }, /* R9433 */ + { 0x0000, 0x0000, 0x0000 }, /* R9434 */ + { 0x0000, 0x0000, 0x0000 }, /* R9435 */ + { 0x0000, 0x0000, 0x0000 }, /* R9436 */ + { 0x0000, 0x0000, 0x0000 }, /* R9437 */ + { 0x0000, 0x0000, 0x0000 }, /* R9438 */ + { 0x0000, 0x0000, 0x0000 }, /* R9439 */ + { 0x0000, 0x0000, 0x0000 }, /* R9440 */ + { 0x0000, 0x0000, 0x0000 }, /* R9441 */ + { 0x0000, 0x0000, 0x0000 }, /* R9442 */ + { 0x0000, 0x0000, 0x0000 }, /* R9443 */ + { 0x0000, 0x0000, 0x0000 }, /* R9444 */ + { 0x0000, 0x0000, 0x0000 }, /* R9445 */ + { 0x0000, 0x0000, 0x0000 }, /* R9446 */ + { 0x0000, 0x0000, 0x0000 }, /* R9447 */ + { 0x0000, 0x0000, 0x0000 }, /* R9448 */ + { 0x0000, 0x0000, 0x0000 }, /* R9449 */ + { 0x0000, 0x0000, 0x0000 }, /* R9450 */ + { 0x0000, 0x0000, 0x0000 }, /* R9451 */ + { 0x0000, 0x0000, 0x0000 }, /* R9452 */ + { 0x0000, 0x0000, 0x0000 }, /* R9453 */ + { 0x0000, 0x0000, 0x0000 }, /* R9454 */ + { 0x0000, 0x0000, 0x0000 }, /* R9455 */ + { 0x0000, 0x0000, 0x0000 }, /* R9456 */ + { 0x0000, 0x0000, 0x0000 }, /* R9457 */ + { 0x0000, 0x0000, 0x0000 }, /* R9458 */ + { 0x0000, 0x0000, 0x0000 }, /* R9459 */ + { 0x0000, 0x0000, 0x0000 }, /* R9460 */ + { 0x0000, 0x0000, 0x0000 }, /* R9461 */ + { 0x0000, 0x0000, 0x0000 }, /* R9462 */ + { 0x0000, 0x0000, 0x0000 }, /* R9463 */ + { 0x0000, 0x0000, 0x0000 }, /* R9464 */ + { 0x0000, 0x0000, 0x0000 }, /* R9465 */ + { 0x0000, 0x0000, 0x0000 }, /* R9466 */ + { 0x0000, 0x0000, 0x0000 }, /* R9467 */ + { 0x0000, 0x0000, 0x0000 }, /* R9468 */ + { 0x0000, 0x0000, 0x0000 }, /* R9469 */ + { 0x0000, 0x0000, 0x0000 }, /* R9470 */ + { 0x0000, 0x0000, 0x0000 }, /* R9471 */ + { 0x0000, 0x0000, 0x0000 }, /* R9472 */ + { 0x0000, 0x0000, 0x0000 }, /* R9473 */ + { 0x0000, 0x0000, 0x0000 }, /* R9474 */ + { 0x0000, 0x0000, 0x0000 }, /* R9475 */ + { 0x0000, 0x0000, 0x0000 }, /* R9476 */ + { 0x0000, 0x0000, 0x0000 }, /* R9477 */ + { 0x0000, 0x0000, 0x0000 }, /* R9478 */ + { 0x0000, 0x0000, 0x0000 }, /* R9479 */ + { 0x0000, 0x0000, 0x0000 }, /* R9480 */ + { 0x0000, 0x0000, 0x0000 }, /* R9481 */ + { 0x0000, 0x0000, 0x0000 }, /* R9482 */ + { 0x0000, 0x0000, 0x0000 }, /* R9483 */ + { 0x0000, 0x0000, 0x0000 }, /* R9484 */ + { 0x0000, 0x0000, 0x0000 }, /* R9485 */ + { 0x0000, 0x0000, 0x0000 }, /* R9486 */ + { 0x0000, 0x0000, 0x0000 }, /* R9487 */ + { 0x0000, 0x0000, 0x0000 }, /* R9488 */ + { 0x0000, 0x0000, 0x0000 }, /* R9489 */ + { 0x0000, 0x0000, 0x0000 }, /* R9490 */ + { 0x0000, 0x0000, 0x0000 }, /* R9491 */ + { 0x0000, 0x0000, 0x0000 }, /* R9492 */ + { 0x0000, 0x0000, 0x0000 }, /* R9493 */ + { 0x0000, 0x0000, 0x0000 }, /* R9494 */ + { 0x0000, 0x0000, 0x0000 }, /* R9495 */ + { 0x0000, 0x0000, 0x0000 }, /* R9496 */ + { 0x0000, 0x0000, 0x0000 }, /* R9497 */ + { 0x0000, 0x0000, 0x0000 }, /* R9498 */ + { 0x0000, 0x0000, 0x0000 }, /* R9499 */ + { 0x0000, 0x0000, 0x0000 }, /* R9500 */ + { 0x0000, 0x0000, 0x0000 }, /* R9501 */ + { 0x0000, 0x0000, 0x0000 }, /* R9502 */ + { 0x0000, 0x0000, 0x0000 }, /* R9503 */ + { 0x0000, 0x0000, 0x0000 }, /* R9504 */ + { 0x0000, 0x0000, 0x0000 }, /* R9505 */ + { 0x0000, 0x0000, 0x0000 }, /* R9506 */ + { 0x0000, 0x0000, 0x0000 }, /* R9507 */ + { 0x0000, 0x0000, 0x0000 }, /* R9508 */ + { 0x0000, 0x0000, 0x0000 }, /* R9509 */ + { 0x0000, 0x0000, 0x0000 }, /* R9510 */ + { 0x0000, 0x0000, 0x0000 }, /* R9511 */ + { 0x0000, 0x0000, 0x0000 }, /* R9512 */ + { 0x0000, 0x0000, 0x0000 }, /* R9513 */ + { 0x0000, 0x0000, 0x0000 }, /* R9514 */ + { 0x0000, 0x0000, 0x0000 }, /* R9515 */ + { 0x0000, 0x0000, 0x0000 }, /* R9516 */ + { 0x0000, 0x0000, 0x0000 }, /* R9517 */ + { 0x0000, 0x0000, 0x0000 }, /* R9518 */ + { 0x0000, 0x0000, 0x0000 }, /* R9519 */ + { 0x0000, 0x0000, 0x0000 }, /* R9520 */ + { 0x0000, 0x0000, 0x0000 }, /* R9521 */ + { 0x0000, 0x0000, 0x0000 }, /* R9522 */ + { 0x0000, 0x0000, 0x0000 }, /* R9523 */ + { 0x0000, 0x0000, 0x0000 }, /* R9524 */ + { 0x0000, 0x0000, 0x0000 }, /* R9525 */ + { 0x0000, 0x0000, 0x0000 }, /* R9526 */ + { 0x0000, 0x0000, 0x0000 }, /* R9527 */ + { 0x0000, 0x0000, 0x0000 }, /* R9528 */ + { 0x0000, 0x0000, 0x0000 }, /* R9529 */ + { 0x0000, 0x0000, 0x0000 }, /* R9530 */ + { 0x0000, 0x0000, 0x0000 }, /* R9531 */ + { 0x0000, 0x0000, 0x0000 }, /* R9532 */ + { 0x0000, 0x0000, 0x0000 }, /* R9533 */ + { 0x0000, 0x0000, 0x0000 }, /* R9534 */ + { 0x0000, 0x0000, 0x0000 }, /* R9535 */ + { 0x0000, 0x0000, 0x0000 }, /* R9536 */ + { 0x0000, 0x0000, 0x0000 }, /* R9537 */ + { 0x0000, 0x0000, 0x0000 }, /* R9538 */ + { 0x0000, 0x0000, 0x0000 }, /* R9539 */ + { 0x0000, 0x0000, 0x0000 }, /* R9540 */ + { 0x0000, 0x0000, 0x0000 }, /* R9541 */ + { 0x0000, 0x0000, 0x0000 }, /* R9542 */ + { 0x0000, 0x0000, 0x0000 }, /* R9543 */ + { 0x0000, 0x0000, 0x0000 }, /* R9544 */ + { 0x0000, 0x0000, 0x0000 }, /* R9545 */ + { 0x0000, 0x0000, 0x0000 }, /* R9546 */ + { 0x0000, 0x0000, 0x0000 }, /* R9547 */ + { 0x0000, 0x0000, 0x0000 }, /* R9548 */ + { 0x0000, 0x0000, 0x0000 }, /* R9549 */ + { 0x0000, 0x0000, 0x0000 }, /* R9550 */ + { 0x0000, 0x0000, 0x0000 }, /* R9551 */ + { 0x0000, 0x0000, 0x0000 }, /* R9552 */ + { 0x0000, 0x0000, 0x0000 }, /* R9553 */ + { 0x0000, 0x0000, 0x0000 }, /* R9554 */ + { 0x0000, 0x0000, 0x0000 }, /* R9555 */ + { 0x0000, 0x0000, 0x0000 }, /* R9556 */ + { 0x0000, 0x0000, 0x0000 }, /* R9557 */ + { 0x0000, 0x0000, 0x0000 }, /* R9558 */ + { 0x0000, 0x0000, 0x0000 }, /* R9559 */ + { 0x0000, 0x0000, 0x0000 }, /* R9560 */ + { 0x0000, 0x0000, 0x0000 }, /* R9561 */ + { 0x0000, 0x0000, 0x0000 }, /* R9562 */ + { 0x0000, 0x0000, 0x0000 }, /* R9563 */ + { 0x0000, 0x0000, 0x0000 }, /* R9564 */ + { 0x0000, 0x0000, 0x0000 }, /* R9565 */ + { 0x0000, 0x0000, 0x0000 }, /* R9566 */ + { 0x0000, 0x0000, 0x0000 }, /* R9567 */ + { 0x0000, 0x0000, 0x0000 }, /* R9568 */ + { 0x0000, 0x0000, 0x0000 }, /* R9569 */ + { 0x0000, 0x0000, 0x0000 }, /* R9570 */ + { 0x0000, 0x0000, 0x0000 }, /* R9571 */ + { 0x0000, 0x0000, 0x0000 }, /* R9572 */ + { 0x0000, 0x0000, 0x0000 }, /* R9573 */ + { 0x0000, 0x0000, 0x0000 }, /* R9574 */ + { 0x0000, 0x0000, 0x0000 }, /* R9575 */ + { 0x0000, 0x0000, 0x0000 }, /* R9576 */ + { 0x0000, 0x0000, 0x0000 }, /* R9577 */ + { 0x0000, 0x0000, 0x0000 }, /* R9578 */ + { 0x0000, 0x0000, 0x0000 }, /* R9579 */ + { 0x0000, 0x0000, 0x0000 }, /* R9580 */ + { 0x0000, 0x0000, 0x0000 }, /* R9581 */ + { 0x0000, 0x0000, 0x0000 }, /* R9582 */ + { 0x0000, 0x0000, 0x0000 }, /* R9583 */ + { 0x0000, 0x0000, 0x0000 }, /* R9584 */ + { 0x0000, 0x0000, 0x0000 }, /* R9585 */ + { 0x0000, 0x0000, 0x0000 }, /* R9586 */ + { 0x0000, 0x0000, 0x0000 }, /* R9587 */ + { 0x0000, 0x0000, 0x0000 }, /* R9588 */ + { 0x0000, 0x0000, 0x0000 }, /* R9589 */ + { 0x0000, 0x0000, 0x0000 }, /* R9590 */ + { 0x0000, 0x0000, 0x0000 }, /* R9591 */ + { 0x0000, 0x0000, 0x0000 }, /* R9592 */ + { 0x0000, 0x0000, 0x0000 }, /* R9593 */ + { 0x0000, 0x0000, 0x0000 }, /* R9594 */ + { 0x0000, 0x0000, 0x0000 }, /* R9595 */ + { 0x0000, 0x0000, 0x0000 }, /* R9596 */ + { 0x0000, 0x0000, 0x0000 }, /* R9597 */ + { 0x0000, 0x0000, 0x0000 }, /* R9598 */ + { 0x0000, 0x0000, 0x0000 }, /* R9599 */ + { 0x0000, 0x0000, 0x0000 }, /* R9600 */ + { 0x0000, 0x0000, 0x0000 }, /* R9601 */ + { 0x0000, 0x0000, 0x0000 }, /* R9602 */ + { 0x0000, 0x0000, 0x0000 }, /* R9603 */ + { 0x0000, 0x0000, 0x0000 }, /* R9604 */ + { 0x0000, 0x0000, 0x0000 }, /* R9605 */ + { 0x0000, 0x0000, 0x0000 }, /* R9606 */ + { 0x0000, 0x0000, 0x0000 }, /* R9607 */ + { 0x0000, 0x0000, 0x0000 }, /* R9608 */ + { 0x0000, 0x0000, 0x0000 }, /* R9609 */ + { 0x0000, 0x0000, 0x0000 }, /* R9610 */ + { 0x0000, 0x0000, 0x0000 }, /* R9611 */ + { 0x0000, 0x0000, 0x0000 }, /* R9612 */ + { 0x0000, 0x0000, 0x0000 }, /* R9613 */ + { 0x0000, 0x0000, 0x0000 }, /* R9614 */ + { 0x0000, 0x0000, 0x0000 }, /* R9615 */ + { 0x0000, 0x0000, 0x0000 }, /* R9616 */ + { 0x0000, 0x0000, 0x0000 }, /* R9617 */ + { 0x0000, 0x0000, 0x0000 }, /* R9618 */ + { 0x0000, 0x0000, 0x0000 }, /* R9619 */ + { 0x0000, 0x0000, 0x0000 }, /* R9620 */ + { 0x0000, 0x0000, 0x0000 }, /* R9621 */ + { 0x0000, 0x0000, 0x0000 }, /* R9622 */ + { 0x0000, 0x0000, 0x0000 }, /* R9623 */ + { 0x0000, 0x0000, 0x0000 }, /* R9624 */ + { 0x0000, 0x0000, 0x0000 }, /* R9625 */ + { 0x0000, 0x0000, 0x0000 }, /* R9626 */ + { 0x0000, 0x0000, 0x0000 }, /* R9627 */ + { 0x0000, 0x0000, 0x0000 }, /* R9628 */ + { 0x0000, 0x0000, 0x0000 }, /* R9629 */ + { 0x0000, 0x0000, 0x0000 }, /* R9630 */ + { 0x0000, 0x0000, 0x0000 }, /* R9631 */ + { 0x0000, 0x0000, 0x0000 }, /* R9632 */ + { 0x0000, 0x0000, 0x0000 }, /* R9633 */ + { 0x0000, 0x0000, 0x0000 }, /* R9634 */ + { 0x0000, 0x0000, 0x0000 }, /* R9635 */ + { 0x0000, 0x0000, 0x0000 }, /* R9636 */ + { 0x0000, 0x0000, 0x0000 }, /* R9637 */ + { 0x0000, 0x0000, 0x0000 }, /* R9638 */ + { 0x0000, 0x0000, 0x0000 }, /* R9639 */ + { 0x0000, 0x0000, 0x0000 }, /* R9640 */ + { 0x0000, 0x0000, 0x0000 }, /* R9641 */ + { 0x0000, 0x0000, 0x0000 }, /* R9642 */ + { 0x0000, 0x0000, 0x0000 }, /* R9643 */ + { 0x0000, 0x0000, 0x0000 }, /* R9644 */ + { 0x0000, 0x0000, 0x0000 }, /* R9645 */ + { 0x0000, 0x0000, 0x0000 }, /* R9646 */ + { 0x0000, 0x0000, 0x0000 }, /* R9647 */ + { 0x0000, 0x0000, 0x0000 }, /* R9648 */ + { 0x0000, 0x0000, 0x0000 }, /* R9649 */ + { 0x0000, 0x0000, 0x0000 }, /* R9650 */ + { 0x0000, 0x0000, 0x0000 }, /* R9651 */ + { 0x0000, 0x0000, 0x0000 }, /* R9652 */ + { 0x0000, 0x0000, 0x0000 }, /* R9653 */ + { 0x0000, 0x0000, 0x0000 }, /* R9654 */ + { 0x0000, 0x0000, 0x0000 }, /* R9655 */ + { 0x0000, 0x0000, 0x0000 }, /* R9656 */ + { 0x0000, 0x0000, 0x0000 }, /* R9657 */ + { 0x0000, 0x0000, 0x0000 }, /* R9658 */ + { 0x0000, 0x0000, 0x0000 }, /* R9659 */ + { 0x0000, 0x0000, 0x0000 }, /* R9660 */ + { 0x0000, 0x0000, 0x0000 }, /* R9661 */ + { 0x0000, 0x0000, 0x0000 }, /* R9662 */ + { 0x0000, 0x0000, 0x0000 }, /* R9663 */ + { 0x0000, 0x0000, 0x0000 }, /* R9664 */ + { 0x0000, 0x0000, 0x0000 }, /* R9665 */ + { 0x0000, 0x0000, 0x0000 }, /* R9666 */ + { 0x0000, 0x0000, 0x0000 }, /* R9667 */ + { 0x0000, 0x0000, 0x0000 }, /* R9668 */ + { 0x0000, 0x0000, 0x0000 }, /* R9669 */ + { 0x0000, 0x0000, 0x0000 }, /* R9670 */ + { 0x0000, 0x0000, 0x0000 }, /* R9671 */ + { 0x0000, 0x0000, 0x0000 }, /* R9672 */ + { 0x0000, 0x0000, 0x0000 }, /* R9673 */ + { 0x0000, 0x0000, 0x0000 }, /* R9674 */ + { 0x0000, 0x0000, 0x0000 }, /* R9675 */ + { 0x0000, 0x0000, 0x0000 }, /* R9676 */ + { 0x0000, 0x0000, 0x0000 }, /* R9677 */ + { 0x0000, 0x0000, 0x0000 }, /* R9678 */ + { 0x0000, 0x0000, 0x0000 }, /* R9679 */ + { 0x0000, 0x0000, 0x0000 }, /* R9680 */ + { 0x0000, 0x0000, 0x0000 }, /* R9681 */ + { 0x0000, 0x0000, 0x0000 }, /* R9682 */ + { 0x0000, 0x0000, 0x0000 }, /* R9683 */ + { 0x0000, 0x0000, 0x0000 }, /* R9684 */ + { 0x0000, 0x0000, 0x0000 }, /* R9685 */ + { 0x0000, 0x0000, 0x0000 }, /* R9686 */ + { 0x0000, 0x0000, 0x0000 }, /* R9687 */ + { 0x0000, 0x0000, 0x0000 }, /* R9688 */ + { 0x0000, 0x0000, 0x0000 }, /* R9689 */ + { 0x0000, 0x0000, 0x0000 }, /* R9690 */ + { 0x0000, 0x0000, 0x0000 }, /* R9691 */ + { 0x0000, 0x0000, 0x0000 }, /* R9692 */ + { 0x0000, 0x0000, 0x0000 }, /* R9693 */ + { 0x0000, 0x0000, 0x0000 }, /* R9694 */ + { 0x0000, 0x0000, 0x0000 }, /* R9695 */ + { 0x0000, 0x0000, 0x0000 }, /* R9696 */ + { 0x0000, 0x0000, 0x0000 }, /* R9697 */ + { 0x0000, 0x0000, 0x0000 }, /* R9698 */ + { 0x0000, 0x0000, 0x0000 }, /* R9699 */ + { 0x0000, 0x0000, 0x0000 }, /* R9700 */ + { 0x0000, 0x0000, 0x0000 }, /* R9701 */ + { 0x0000, 0x0000, 0x0000 }, /* R9702 */ + { 0x0000, 0x0000, 0x0000 }, /* R9703 */ + { 0x0000, 0x0000, 0x0000 }, /* R9704 */ + { 0x0000, 0x0000, 0x0000 }, /* R9705 */ + { 0x0000, 0x0000, 0x0000 }, /* R9706 */ + { 0x0000, 0x0000, 0x0000 }, /* R9707 */ + { 0x0000, 0x0000, 0x0000 }, /* R9708 */ + { 0x0000, 0x0000, 0x0000 }, /* R9709 */ + { 0x0000, 0x0000, 0x0000 }, /* R9710 */ + { 0x0000, 0x0000, 0x0000 }, /* R9711 */ + { 0x0000, 0x0000, 0x0000 }, /* R9712 */ + { 0x0000, 0x0000, 0x0000 }, /* R9713 */ + { 0x0000, 0x0000, 0x0000 }, /* R9714 */ + { 0x0000, 0x0000, 0x0000 }, /* R9715 */ + { 0x0000, 0x0000, 0x0000 }, /* R9716 */ + { 0x0000, 0x0000, 0x0000 }, /* R9717 */ + { 0x0000, 0x0000, 0x0000 }, /* R9718 */ + { 0x0000, 0x0000, 0x0000 }, /* R9719 */ + { 0x0000, 0x0000, 0x0000 }, /* R9720 */ + { 0x0000, 0x0000, 0x0000 }, /* R9721 */ + { 0x0000, 0x0000, 0x0000 }, /* R9722 */ + { 0x0000, 0x0000, 0x0000 }, /* R9723 */ + { 0x0000, 0x0000, 0x0000 }, /* R9724 */ + { 0x0000, 0x0000, 0x0000 }, /* R9725 */ + { 0x0000, 0x0000, 0x0000 }, /* R9726 */ + { 0x0000, 0x0000, 0x0000 }, /* R9727 */ + { 0x0000, 0x0000, 0x0000 }, /* R9728 */ + { 0x0000, 0x0000, 0x0000 }, /* R9729 */ + { 0x0000, 0x0000, 0x0000 }, /* R9730 */ + { 0x0000, 0x0000, 0x0000 }, /* R9731 */ + { 0x0000, 0x0000, 0x0000 }, /* R9732 */ + { 0x0000, 0x0000, 0x0000 }, /* R9733 */ + { 0x0000, 0x0000, 0x0000 }, /* R9734 */ + { 0x0000, 0x0000, 0x0000 }, /* R9735 */ + { 0x0000, 0x0000, 0x0000 }, /* R9736 */ + { 0x0000, 0x0000, 0x0000 }, /* R9737 */ + { 0x0000, 0x0000, 0x0000 }, /* R9738 */ + { 0x0000, 0x0000, 0x0000 }, /* R9739 */ + { 0x0000, 0x0000, 0x0000 }, /* R9740 */ + { 0x0000, 0x0000, 0x0000 }, /* R9741 */ + { 0x0000, 0x0000, 0x0000 }, /* R9742 */ + { 0x0000, 0x0000, 0x0000 }, /* R9743 */ + { 0x0000, 0x0000, 0x0000 }, /* R9744 */ + { 0x0000, 0x0000, 0x0000 }, /* R9745 */ + { 0x0000, 0x0000, 0x0000 }, /* R9746 */ + { 0x0000, 0x0000, 0x0000 }, /* R9747 */ + { 0x0000, 0x0000, 0x0000 }, /* R9748 */ + { 0x0000, 0x0000, 0x0000 }, /* R9749 */ + { 0x0000, 0x0000, 0x0000 }, /* R9750 */ + { 0x0000, 0x0000, 0x0000 }, /* R9751 */ + { 0x0000, 0x0000, 0x0000 }, /* R9752 */ + { 0x0000, 0x0000, 0x0000 }, /* R9753 */ + { 0x0000, 0x0000, 0x0000 }, /* R9754 */ + { 0x0000, 0x0000, 0x0000 }, /* R9755 */ + { 0x0000, 0x0000, 0x0000 }, /* R9756 */ + { 0x0000, 0x0000, 0x0000 }, /* R9757 */ + { 0x0000, 0x0000, 0x0000 }, /* R9758 */ + { 0x0000, 0x0000, 0x0000 }, /* R9759 */ + { 0x0000, 0x0000, 0x0000 }, /* R9760 */ + { 0x0000, 0x0000, 0x0000 }, /* R9761 */ + { 0x0000, 0x0000, 0x0000 }, /* R9762 */ + { 0x0000, 0x0000, 0x0000 }, /* R9763 */ + { 0x0000, 0x0000, 0x0000 }, /* R9764 */ + { 0x0000, 0x0000, 0x0000 }, /* R9765 */ + { 0x0000, 0x0000, 0x0000 }, /* R9766 */ + { 0x0000, 0x0000, 0x0000 }, /* R9767 */ + { 0x0000, 0x0000, 0x0000 }, /* R9768 */ + { 0x0000, 0x0000, 0x0000 }, /* R9769 */ + { 0x0000, 0x0000, 0x0000 }, /* R9770 */ + { 0x0000, 0x0000, 0x0000 }, /* R9771 */ + { 0x0000, 0x0000, 0x0000 }, /* R9772 */ + { 0x0000, 0x0000, 0x0000 }, /* R9773 */ + { 0x0000, 0x0000, 0x0000 }, /* R9774 */ + { 0x0000, 0x0000, 0x0000 }, /* R9775 */ + { 0x0000, 0x0000, 0x0000 }, /* R9776 */ + { 0x0000, 0x0000, 0x0000 }, /* R9777 */ + { 0x0000, 0x0000, 0x0000 }, /* R9778 */ + { 0x0000, 0x0000, 0x0000 }, /* R9779 */ + { 0x0000, 0x0000, 0x0000 }, /* R9780 */ + { 0x0000, 0x0000, 0x0000 }, /* R9781 */ + { 0x0000, 0x0000, 0x0000 }, /* R9782 */ + { 0x0000, 0x0000, 0x0000 }, /* R9783 */ + { 0x0000, 0x0000, 0x0000 }, /* R9784 */ + { 0x0000, 0x0000, 0x0000 }, /* R9785 */ + { 0x0000, 0x0000, 0x0000 }, /* R9786 */ + { 0x0000, 0x0000, 0x0000 }, /* R9787 */ + { 0x0000, 0x0000, 0x0000 }, /* R9788 */ + { 0x0000, 0x0000, 0x0000 }, /* R9789 */ + { 0x0000, 0x0000, 0x0000 }, /* R9790 */ + { 0x0000, 0x0000, 0x0000 }, /* R9791 */ + { 0x0000, 0x0000, 0x0000 }, /* R9792 */ + { 0x0000, 0x0000, 0x0000 }, /* R9793 */ + { 0x0000, 0x0000, 0x0000 }, /* R9794 */ + { 0x0000, 0x0000, 0x0000 }, /* R9795 */ + { 0x0000, 0x0000, 0x0000 }, /* R9796 */ + { 0x0000, 0x0000, 0x0000 }, /* R9797 */ + { 0x0000, 0x0000, 0x0000 }, /* R9798 */ + { 0x0000, 0x0000, 0x0000 }, /* R9799 */ + { 0x0000, 0x0000, 0x0000 }, /* R9800 */ + { 0x0000, 0x0000, 0x0000 }, /* R9801 */ + { 0x0000, 0x0000, 0x0000 }, /* R9802 */ + { 0x0000, 0x0000, 0x0000 }, /* R9803 */ + { 0x0000, 0x0000, 0x0000 }, /* R9804 */ + { 0x0000, 0x0000, 0x0000 }, /* R9805 */ + { 0x0000, 0x0000, 0x0000 }, /* R9806 */ + { 0x0000, 0x0000, 0x0000 }, /* R9807 */ + { 0x0000, 0x0000, 0x0000 }, /* R9808 */ + { 0x0000, 0x0000, 0x0000 }, /* R9809 */ + { 0x0000, 0x0000, 0x0000 }, /* R9810 */ + { 0x0000, 0x0000, 0x0000 }, /* R9811 */ + { 0x0000, 0x0000, 0x0000 }, /* R9812 */ + { 0x0000, 0x0000, 0x0000 }, /* R9813 */ + { 0x0000, 0x0000, 0x0000 }, /* R9814 */ + { 0x0000, 0x0000, 0x0000 }, /* R9815 */ + { 0x0000, 0x0000, 0x0000 }, /* R9816 */ + { 0x0000, 0x0000, 0x0000 }, /* R9817 */ + { 0x0000, 0x0000, 0x0000 }, /* R9818 */ + { 0x0000, 0x0000, 0x0000 }, /* R9819 */ + { 0x0000, 0x0000, 0x0000 }, /* R9820 */ + { 0x0000, 0x0000, 0x0000 }, /* R9821 */ + { 0x0000, 0x0000, 0x0000 }, /* R9822 */ + { 0x0000, 0x0000, 0x0000 }, /* R9823 */ + { 0x0000, 0x0000, 0x0000 }, /* R9824 */ + { 0x0000, 0x0000, 0x0000 }, /* R9825 */ + { 0x0000, 0x0000, 0x0000 }, /* R9826 */ + { 0x0000, 0x0000, 0x0000 }, /* R9827 */ + { 0x0000, 0x0000, 0x0000 }, /* R9828 */ + { 0x0000, 0x0000, 0x0000 }, /* R9829 */ + { 0x0000, 0x0000, 0x0000 }, /* R9830 */ + { 0x0000, 0x0000, 0x0000 }, /* R9831 */ + { 0x0000, 0x0000, 0x0000 }, /* R9832 */ + { 0x0000, 0x0000, 0x0000 }, /* R9833 */ + { 0x0000, 0x0000, 0x0000 }, /* R9834 */ + { 0x0000, 0x0000, 0x0000 }, /* R9835 */ + { 0x0000, 0x0000, 0x0000 }, /* R9836 */ + { 0x0000, 0x0000, 0x0000 }, /* R9837 */ + { 0x0000, 0x0000, 0x0000 }, /* R9838 */ + { 0x0000, 0x0000, 0x0000 }, /* R9839 */ + { 0x0000, 0x0000, 0x0000 }, /* R9840 */ + { 0x0000, 0x0000, 0x0000 }, /* R9841 */ + { 0x0000, 0x0000, 0x0000 }, /* R9842 */ + { 0x0000, 0x0000, 0x0000 }, /* R9843 */ + { 0x0000, 0x0000, 0x0000 }, /* R9844 */ + { 0x0000, 0x0000, 0x0000 }, /* R9845 */ + { 0x0000, 0x0000, 0x0000 }, /* R9846 */ + { 0x0000, 0x0000, 0x0000 }, /* R9847 */ + { 0x0000, 0x0000, 0x0000 }, /* R9848 */ + { 0x0000, 0x0000, 0x0000 }, /* R9849 */ + { 0x0000, 0x0000, 0x0000 }, /* R9850 */ + { 0x0000, 0x0000, 0x0000 }, /* R9851 */ + { 0x0000, 0x0000, 0x0000 }, /* R9852 */ + { 0x0000, 0x0000, 0x0000 }, /* R9853 */ + { 0x0000, 0x0000, 0x0000 }, /* R9854 */ + { 0x0000, 0x0000, 0x0000 }, /* R9855 */ + { 0x0000, 0x0000, 0x0000 }, /* R9856 */ + { 0x0000, 0x0000, 0x0000 }, /* R9857 */ + { 0x0000, 0x0000, 0x0000 }, /* R9858 */ + { 0x0000, 0x0000, 0x0000 }, /* R9859 */ + { 0x0000, 0x0000, 0x0000 }, /* R9860 */ + { 0x0000, 0x0000, 0x0000 }, /* R9861 */ + { 0x0000, 0x0000, 0x0000 }, /* R9862 */ + { 0x0000, 0x0000, 0x0000 }, /* R9863 */ + { 0x0000, 0x0000, 0x0000 }, /* R9864 */ + { 0x0000, 0x0000, 0x0000 }, /* R9865 */ + { 0x0000, 0x0000, 0x0000 }, /* R9866 */ + { 0x0000, 0x0000, 0x0000 }, /* R9867 */ + { 0x0000, 0x0000, 0x0000 }, /* R9868 */ + { 0x0000, 0x0000, 0x0000 }, /* R9869 */ + { 0x0000, 0x0000, 0x0000 }, /* R9870 */ + { 0x0000, 0x0000, 0x0000 }, /* R9871 */ + { 0x0000, 0x0000, 0x0000 }, /* R9872 */ + { 0x0000, 0x0000, 0x0000 }, /* R9873 */ + { 0x0000, 0x0000, 0x0000 }, /* R9874 */ + { 0x0000, 0x0000, 0x0000 }, /* R9875 */ + { 0x0000, 0x0000, 0x0000 }, /* R9876 */ + { 0x0000, 0x0000, 0x0000 }, /* R9877 */ + { 0x0000, 0x0000, 0x0000 }, /* R9878 */ + { 0x0000, 0x0000, 0x0000 }, /* R9879 */ + { 0x0000, 0x0000, 0x0000 }, /* R9880 */ + { 0x0000, 0x0000, 0x0000 }, /* R9881 */ + { 0x0000, 0x0000, 0x0000 }, /* R9882 */ + { 0x0000, 0x0000, 0x0000 }, /* R9883 */ + { 0x0000, 0x0000, 0x0000 }, /* R9884 */ + { 0x0000, 0x0000, 0x0000 }, /* R9885 */ + { 0x0000, 0x0000, 0x0000 }, /* R9886 */ + { 0x0000, 0x0000, 0x0000 }, /* R9887 */ + { 0x0000, 0x0000, 0x0000 }, /* R9888 */ + { 0x0000, 0x0000, 0x0000 }, /* R9889 */ + { 0x0000, 0x0000, 0x0000 }, /* R9890 */ + { 0x0000, 0x0000, 0x0000 }, /* R9891 */ + { 0x0000, 0x0000, 0x0000 }, /* R9892 */ + { 0x0000, 0x0000, 0x0000 }, /* R9893 */ + { 0x0000, 0x0000, 0x0000 }, /* R9894 */ + { 0x0000, 0x0000, 0x0000 }, /* R9895 */ + { 0x0000, 0x0000, 0x0000 }, /* R9896 */ + { 0x0000, 0x0000, 0x0000 }, /* R9897 */ + { 0x0000, 0x0000, 0x0000 }, /* R9898 */ + { 0x0000, 0x0000, 0x0000 }, /* R9899 */ + { 0x0000, 0x0000, 0x0000 }, /* R9900 */ + { 0x0000, 0x0000, 0x0000 }, /* R9901 */ + { 0x0000, 0x0000, 0x0000 }, /* R9902 */ + { 0x0000, 0x0000, 0x0000 }, /* R9903 */ + { 0x0000, 0x0000, 0x0000 }, /* R9904 */ + { 0x0000, 0x0000, 0x0000 }, /* R9905 */ + { 0x0000, 0x0000, 0x0000 }, /* R9906 */ + { 0x0000, 0x0000, 0x0000 }, /* R9907 */ + { 0x0000, 0x0000, 0x0000 }, /* R9908 */ + { 0x0000, 0x0000, 0x0000 }, /* R9909 */ + { 0x0000, 0x0000, 0x0000 }, /* R9910 */ + { 0x0000, 0x0000, 0x0000 }, /* R9911 */ + { 0x0000, 0x0000, 0x0000 }, /* R9912 */ + { 0x0000, 0x0000, 0x0000 }, /* R9913 */ + { 0x0000, 0x0000, 0x0000 }, /* R9914 */ + { 0x0000, 0x0000, 0x0000 }, /* R9915 */ + { 0x0000, 0x0000, 0x0000 }, /* R9916 */ + { 0x0000, 0x0000, 0x0000 }, /* R9917 */ + { 0x0000, 0x0000, 0x0000 }, /* R9918 */ + { 0x0000, 0x0000, 0x0000 }, /* R9919 */ + { 0x0000, 0x0000, 0x0000 }, /* R9920 */ + { 0x0000, 0x0000, 0x0000 }, /* R9921 */ + { 0x0000, 0x0000, 0x0000 }, /* R9922 */ + { 0x0000, 0x0000, 0x0000 }, /* R9923 */ + { 0x0000, 0x0000, 0x0000 }, /* R9924 */ + { 0x0000, 0x0000, 0x0000 }, /* R9925 */ + { 0x0000, 0x0000, 0x0000 }, /* R9926 */ + { 0x0000, 0x0000, 0x0000 }, /* R9927 */ + { 0x0000, 0x0000, 0x0000 }, /* R9928 */ + { 0x0000, 0x0000, 0x0000 }, /* R9929 */ + { 0x0000, 0x0000, 0x0000 }, /* R9930 */ + { 0x0000, 0x0000, 0x0000 }, /* R9931 */ + { 0x0000, 0x0000, 0x0000 }, /* R9932 */ + { 0x0000, 0x0000, 0x0000 }, /* R9933 */ + { 0x0000, 0x0000, 0x0000 }, /* R9934 */ + { 0x0000, 0x0000, 0x0000 }, /* R9935 */ + { 0x0000, 0x0000, 0x0000 }, /* R9936 */ + { 0x0000, 0x0000, 0x0000 }, /* R9937 */ + { 0x0000, 0x0000, 0x0000 }, /* R9938 */ + { 0x0000, 0x0000, 0x0000 }, /* R9939 */ + { 0x0000, 0x0000, 0x0000 }, /* R9940 */ + { 0x0000, 0x0000, 0x0000 }, /* R9941 */ + { 0x0000, 0x0000, 0x0000 }, /* R9942 */ + { 0x0000, 0x0000, 0x0000 }, /* R9943 */ + { 0x0000, 0x0000, 0x0000 }, /* R9944 */ + { 0x0000, 0x0000, 0x0000 }, /* R9945 */ + { 0x0000, 0x0000, 0x0000 }, /* R9946 */ + { 0x0000, 0x0000, 0x0000 }, /* R9947 */ + { 0x0000, 0x0000, 0x0000 }, /* R9948 */ + { 0x0000, 0x0000, 0x0000 }, /* R9949 */ + { 0x0000, 0x0000, 0x0000 }, /* R9950 */ + { 0x0000, 0x0000, 0x0000 }, /* R9951 */ + { 0x0000, 0x0000, 0x0000 }, /* R9952 */ + { 0x0000, 0x0000, 0x0000 }, /* R9953 */ + { 0x0000, 0x0000, 0x0000 }, /* R9954 */ + { 0x0000, 0x0000, 0x0000 }, /* R9955 */ + { 0x0000, 0x0000, 0x0000 }, /* R9956 */ + { 0x0000, 0x0000, 0x0000 }, /* R9957 */ + { 0x0000, 0x0000, 0x0000 }, /* R9958 */ + { 0x0000, 0x0000, 0x0000 }, /* R9959 */ + { 0x0000, 0x0000, 0x0000 }, /* R9960 */ + { 0x0000, 0x0000, 0x0000 }, /* R9961 */ + { 0x0000, 0x0000, 0x0000 }, /* R9962 */ + { 0x0000, 0x0000, 0x0000 }, /* R9963 */ + { 0x0000, 0x0000, 0x0000 }, /* R9964 */ + { 0x0000, 0x0000, 0x0000 }, /* R9965 */ + { 0x0000, 0x0000, 0x0000 }, /* R9966 */ + { 0x0000, 0x0000, 0x0000 }, /* R9967 */ + { 0x0000, 0x0000, 0x0000 }, /* R9968 */ + { 0x0000, 0x0000, 0x0000 }, /* R9969 */ + { 0x0000, 0x0000, 0x0000 }, /* R9970 */ + { 0x0000, 0x0000, 0x0000 }, /* R9971 */ + { 0x0000, 0x0000, 0x0000 }, /* R9972 */ + { 0x0000, 0x0000, 0x0000 }, /* R9973 */ + { 0x0000, 0x0000, 0x0000 }, /* R9974 */ + { 0x0000, 0x0000, 0x0000 }, /* R9975 */ + { 0x0000, 0x0000, 0x0000 }, /* R9976 */ + { 0x0000, 0x0000, 0x0000 }, /* R9977 */ + { 0x0000, 0x0000, 0x0000 }, /* R9978 */ + { 0x0000, 0x0000, 0x0000 }, /* R9979 */ + { 0x0000, 0x0000, 0x0000 }, /* R9980 */ + { 0x0000, 0x0000, 0x0000 }, /* R9981 */ + { 0x0000, 0x0000, 0x0000 }, /* R9982 */ + { 0x0000, 0x0000, 0x0000 }, /* R9983 */ + { 0x0000, 0x0000, 0x0000 }, /* R9984 */ + { 0x0000, 0x0000, 0x0000 }, /* R9985 */ + { 0x0000, 0x0000, 0x0000 }, /* R9986 */ + { 0x0000, 0x0000, 0x0000 }, /* R9987 */ + { 0x0000, 0x0000, 0x0000 }, /* R9988 */ + { 0x0000, 0x0000, 0x0000 }, /* R9989 */ + { 0x0000, 0x0000, 0x0000 }, /* R9990 */ + { 0x0000, 0x0000, 0x0000 }, /* R9991 */ + { 0x0000, 0x0000, 0x0000 }, /* R9992 */ + { 0x0000, 0x0000, 0x0000 }, /* R9993 */ + { 0x0000, 0x0000, 0x0000 }, /* R9994 */ + { 0x0000, 0x0000, 0x0000 }, /* R9995 */ + { 0x0000, 0x0000, 0x0000 }, /* R9996 */ + { 0x0000, 0x0000, 0x0000 }, /* R9997 */ + { 0x0000, 0x0000, 0x0000 }, /* R9998 */ + { 0x0000, 0x0000, 0x0000 }, /* R9999 */ + { 0x0000, 0x0000, 0x0000 }, /* R10000 */ + { 0x0000, 0x0000, 0x0000 }, /* R10001 */ + { 0x0000, 0x0000, 0x0000 }, /* R10002 */ + { 0x0000, 0x0000, 0x0000 }, /* R10003 */ + { 0x0000, 0x0000, 0x0000 }, /* R10004 */ + { 0x0000, 0x0000, 0x0000 }, /* R10005 */ + { 0x0000, 0x0000, 0x0000 }, /* R10006 */ + { 0x0000, 0x0000, 0x0000 }, /* R10007 */ + { 0x0000, 0x0000, 0x0000 }, /* R10008 */ + { 0x0000, 0x0000, 0x0000 }, /* R10009 */ + { 0x0000, 0x0000, 0x0000 }, /* R10010 */ + { 0x0000, 0x0000, 0x0000 }, /* R10011 */ + { 0x0000, 0x0000, 0x0000 }, /* R10012 */ + { 0x0000, 0x0000, 0x0000 }, /* R10013 */ + { 0x0000, 0x0000, 0x0000 }, /* R10014 */ + { 0x0000, 0x0000, 0x0000 }, /* R10015 */ + { 0x0000, 0x0000, 0x0000 }, /* R10016 */ + { 0x0000, 0x0000, 0x0000 }, /* R10017 */ + { 0x0000, 0x0000, 0x0000 }, /* R10018 */ + { 0x0000, 0x0000, 0x0000 }, /* R10019 */ + { 0x0000, 0x0000, 0x0000 }, /* R10020 */ + { 0x0000, 0x0000, 0x0000 }, /* R10021 */ + { 0x0000, 0x0000, 0x0000 }, /* R10022 */ + { 0x0000, 0x0000, 0x0000 }, /* R10023 */ + { 0x0000, 0x0000, 0x0000 }, /* R10024 */ + { 0x0000, 0x0000, 0x0000 }, /* R10025 */ + { 0x0000, 0x0000, 0x0000 }, /* R10026 */ + { 0x0000, 0x0000, 0x0000 }, /* R10027 */ + { 0x0000, 0x0000, 0x0000 }, /* R10028 */ + { 0x0000, 0x0000, 0x0000 }, /* R10029 */ + { 0x0000, 0x0000, 0x0000 }, /* R10030 */ + { 0x0000, 0x0000, 0x0000 }, /* R10031 */ + { 0x0000, 0x0000, 0x0000 }, /* R10032 */ + { 0x0000, 0x0000, 0x0000 }, /* R10033 */ + { 0x0000, 0x0000, 0x0000 }, /* R10034 */ + { 0x0000, 0x0000, 0x0000 }, /* R10035 */ + { 0x0000, 0x0000, 0x0000 }, /* R10036 */ + { 0x0000, 0x0000, 0x0000 }, /* R10037 */ + { 0x0000, 0x0000, 0x0000 }, /* R10038 */ + { 0x0000, 0x0000, 0x0000 }, /* R10039 */ + { 0x0000, 0x0000, 0x0000 }, /* R10040 */ + { 0x0000, 0x0000, 0x0000 }, /* R10041 */ + { 0x0000, 0x0000, 0x0000 }, /* R10042 */ + { 0x0000, 0x0000, 0x0000 }, /* R10043 */ + { 0x0000, 0x0000, 0x0000 }, /* R10044 */ + { 0x0000, 0x0000, 0x0000 }, /* R10045 */ + { 0x0000, 0x0000, 0x0000 }, /* R10046 */ + { 0x0000, 0x0000, 0x0000 }, /* R10047 */ + { 0x0000, 0x0000, 0x0000 }, /* R10048 */ + { 0x0000, 0x0000, 0x0000 }, /* R10049 */ + { 0x0000, 0x0000, 0x0000 }, /* R10050 */ + { 0x0000, 0x0000, 0x0000 }, /* R10051 */ + { 0x0000, 0x0000, 0x0000 }, /* R10052 */ + { 0x0000, 0x0000, 0x0000 }, /* R10053 */ + { 0x0000, 0x0000, 0x0000 }, /* R10054 */ + { 0x0000, 0x0000, 0x0000 }, /* R10055 */ + { 0x0000, 0x0000, 0x0000 }, /* R10056 */ + { 0x0000, 0x0000, 0x0000 }, /* R10057 */ + { 0x0000, 0x0000, 0x0000 }, /* R10058 */ + { 0x0000, 0x0000, 0x0000 }, /* R10059 */ + { 0x0000, 0x0000, 0x0000 }, /* R10060 */ + { 0x0000, 0x0000, 0x0000 }, /* R10061 */ + { 0x0000, 0x0000, 0x0000 }, /* R10062 */ + { 0x0000, 0x0000, 0x0000 }, /* R10063 */ + { 0x0000, 0x0000, 0x0000 }, /* R10064 */ + { 0x0000, 0x0000, 0x0000 }, /* R10065 */ + { 0x0000, 0x0000, 0x0000 }, /* R10066 */ + { 0x0000, 0x0000, 0x0000 }, /* R10067 */ + { 0x0000, 0x0000, 0x0000 }, /* R10068 */ + { 0x0000, 0x0000, 0x0000 }, /* R10069 */ + { 0x0000, 0x0000, 0x0000 }, /* R10070 */ + { 0x0000, 0x0000, 0x0000 }, /* R10071 */ + { 0x0000, 0x0000, 0x0000 }, /* R10072 */ + { 0x0000, 0x0000, 0x0000 }, /* R10073 */ + { 0x0000, 0x0000, 0x0000 }, /* R10074 */ + { 0x0000, 0x0000, 0x0000 }, /* R10075 */ + { 0x0000, 0x0000, 0x0000 }, /* R10076 */ + { 0x0000, 0x0000, 0x0000 }, /* R10077 */ + { 0x0000, 0x0000, 0x0000 }, /* R10078 */ + { 0x0000, 0x0000, 0x0000 }, /* R10079 */ + { 0x0000, 0x0000, 0x0000 }, /* R10080 */ + { 0x0000, 0x0000, 0x0000 }, /* R10081 */ + { 0x0000, 0x0000, 0x0000 }, /* R10082 */ + { 0x0000, 0x0000, 0x0000 }, /* R10083 */ + { 0x0000, 0x0000, 0x0000 }, /* R10084 */ + { 0x0000, 0x0000, 0x0000 }, /* R10085 */ + { 0x0000, 0x0000, 0x0000 }, /* R10086 */ + { 0x0000, 0x0000, 0x0000 }, /* R10087 */ + { 0x0000, 0x0000, 0x0000 }, /* R10088 */ + { 0x0000, 0x0000, 0x0000 }, /* R10089 */ + { 0x0000, 0x0000, 0x0000 }, /* R10090 */ + { 0x0000, 0x0000, 0x0000 }, /* R10091 */ + { 0x0000, 0x0000, 0x0000 }, /* R10092 */ + { 0x0000, 0x0000, 0x0000 }, /* R10093 */ + { 0x0000, 0x0000, 0x0000 }, /* R10094 */ + { 0x0000, 0x0000, 0x0000 }, /* R10095 */ + { 0x0000, 0x0000, 0x0000 }, /* R10096 */ + { 0x0000, 0x0000, 0x0000 }, /* R10097 */ + { 0x0000, 0x0000, 0x0000 }, /* R10098 */ + { 0x0000, 0x0000, 0x0000 }, /* R10099 */ + { 0x0000, 0x0000, 0x0000 }, /* R10100 */ + { 0x0000, 0x0000, 0x0000 }, /* R10101 */ + { 0x0000, 0x0000, 0x0000 }, /* R10102 */ + { 0x0000, 0x0000, 0x0000 }, /* R10103 */ + { 0x0000, 0x0000, 0x0000 }, /* R10104 */ + { 0x0000, 0x0000, 0x0000 }, /* R10105 */ + { 0x0000, 0x0000, 0x0000 }, /* R10106 */ + { 0x0000, 0x0000, 0x0000 }, /* R10107 */ + { 0x0000, 0x0000, 0x0000 }, /* R10108 */ + { 0x0000, 0x0000, 0x0000 }, /* R10109 */ + { 0x0000, 0x0000, 0x0000 }, /* R10110 */ + { 0x0000, 0x0000, 0x0000 }, /* R10111 */ + { 0x0000, 0x0000, 0x0000 }, /* R10112 */ + { 0x0000, 0x0000, 0x0000 }, /* R10113 */ + { 0x0000, 0x0000, 0x0000 }, /* R10114 */ + { 0x0000, 0x0000, 0x0000 }, /* R10115 */ + { 0x0000, 0x0000, 0x0000 }, /* R10116 */ + { 0x0000, 0x0000, 0x0000 }, /* R10117 */ + { 0x0000, 0x0000, 0x0000 }, /* R10118 */ + { 0x0000, 0x0000, 0x0000 }, /* R10119 */ + { 0x0000, 0x0000, 0x0000 }, /* R10120 */ + { 0x0000, 0x0000, 0x0000 }, /* R10121 */ + { 0x0000, 0x0000, 0x0000 }, /* R10122 */ + { 0x0000, 0x0000, 0x0000 }, /* R10123 */ + { 0x0000, 0x0000, 0x0000 }, /* R10124 */ + { 0x0000, 0x0000, 0x0000 }, /* R10125 */ + { 0x0000, 0x0000, 0x0000 }, /* R10126 */ + { 0x0000, 0x0000, 0x0000 }, /* R10127 */ + { 0x0000, 0x0000, 0x0000 }, /* R10128 */ + { 0x0000, 0x0000, 0x0000 }, /* R10129 */ + { 0x0000, 0x0000, 0x0000 }, /* R10130 */ + { 0x0000, 0x0000, 0x0000 }, /* R10131 */ + { 0x0000, 0x0000, 0x0000 }, /* R10132 */ + { 0x0000, 0x0000, 0x0000 }, /* R10133 */ + { 0x0000, 0x0000, 0x0000 }, /* R10134 */ + { 0x0000, 0x0000, 0x0000 }, /* R10135 */ + { 0x0000, 0x0000, 0x0000 }, /* R10136 */ + { 0x0000, 0x0000, 0x0000 }, /* R10137 */ + { 0x0000, 0x0000, 0x0000 }, /* R10138 */ + { 0x0000, 0x0000, 0x0000 }, /* R10139 */ + { 0x0000, 0x0000, 0x0000 }, /* R10140 */ + { 0x0000, 0x0000, 0x0000 }, /* R10141 */ + { 0x0000, 0x0000, 0x0000 }, /* R10142 */ + { 0x0000, 0x0000, 0x0000 }, /* R10143 */ + { 0x0000, 0x0000, 0x0000 }, /* R10144 */ + { 0x0000, 0x0000, 0x0000 }, /* R10145 */ + { 0x0000, 0x0000, 0x0000 }, /* R10146 */ + { 0x0000, 0x0000, 0x0000 }, /* R10147 */ + { 0x0000, 0x0000, 0x0000 }, /* R10148 */ + { 0x0000, 0x0000, 0x0000 }, /* R10149 */ + { 0x0000, 0x0000, 0x0000 }, /* R10150 */ + { 0x0000, 0x0000, 0x0000 }, /* R10151 */ + { 0x0000, 0x0000, 0x0000 }, /* R10152 */ + { 0x0000, 0x0000, 0x0000 }, /* R10153 */ + { 0x0000, 0x0000, 0x0000 }, /* R10154 */ + { 0x0000, 0x0000, 0x0000 }, /* R10155 */ + { 0x0000, 0x0000, 0x0000 }, /* R10156 */ + { 0x0000, 0x0000, 0x0000 }, /* R10157 */ + { 0x0000, 0x0000, 0x0000 }, /* R10158 */ + { 0x0000, 0x0000, 0x0000 }, /* R10159 */ + { 0x0000, 0x0000, 0x0000 }, /* R10160 */ + { 0x0000, 0x0000, 0x0000 }, /* R10161 */ + { 0x0000, 0x0000, 0x0000 }, /* R10162 */ + { 0x0000, 0x0000, 0x0000 }, /* R10163 */ + { 0x0000, 0x0000, 0x0000 }, /* R10164 */ + { 0x0000, 0x0000, 0x0000 }, /* R10165 */ + { 0x0000, 0x0000, 0x0000 }, /* R10166 */ + { 0x0000, 0x0000, 0x0000 }, /* R10167 */ + { 0x0000, 0x0000, 0x0000 }, /* R10168 */ + { 0x0000, 0x0000, 0x0000 }, /* R10169 */ + { 0x0000, 0x0000, 0x0000 }, /* R10170 */ + { 0x0000, 0x0000, 0x0000 }, /* R10171 */ + { 0x0000, 0x0000, 0x0000 }, /* R10172 */ + { 0x0000, 0x0000, 0x0000 }, /* R10173 */ + { 0x0000, 0x0000, 0x0000 }, /* R10174 */ + { 0x0000, 0x0000, 0x0000 }, /* R10175 */ + { 0x0000, 0x0000, 0x0000 }, /* R10176 */ + { 0x0000, 0x0000, 0x0000 }, /* R10177 */ + { 0x0000, 0x0000, 0x0000 }, /* R10178 */ + { 0x0000, 0x0000, 0x0000 }, /* R10179 */ + { 0x0000, 0x0000, 0x0000 }, /* R10180 */ + { 0x0000, 0x0000, 0x0000 }, /* R10181 */ + { 0x0000, 0x0000, 0x0000 }, /* R10182 */ + { 0x0000, 0x0000, 0x0000 }, /* R10183 */ + { 0x0000, 0x0000, 0x0000 }, /* R10184 */ + { 0x0000, 0x0000, 0x0000 }, /* R10185 */ + { 0x0000, 0x0000, 0x0000 }, /* R10186 */ + { 0x0000, 0x0000, 0x0000 }, /* R10187 */ + { 0x0000, 0x0000, 0x0000 }, /* R10188 */ + { 0x0000, 0x0000, 0x0000 }, /* R10189 */ + { 0x0000, 0x0000, 0x0000 }, /* R10190 */ + { 0x0000, 0x0000, 0x0000 }, /* R10191 */ + { 0x0000, 0x0000, 0x0000 }, /* R10192 */ + { 0x0000, 0x0000, 0x0000 }, /* R10193 */ + { 0x0000, 0x0000, 0x0000 }, /* R10194 */ + { 0x0000, 0x0000, 0x0000 }, /* R10195 */ + { 0x0000, 0x0000, 0x0000 }, /* R10196 */ + { 0x0000, 0x0000, 0x0000 }, /* R10197 */ + { 0x0000, 0x0000, 0x0000 }, /* R10198 */ + { 0x0000, 0x0000, 0x0000 }, /* R10199 */ + { 0x0000, 0x0000, 0x0000 }, /* R10200 */ + { 0x0000, 0x0000, 0x0000 }, /* R10201 */ + { 0x0000, 0x0000, 0x0000 }, /* R10202 */ + { 0x0000, 0x0000, 0x0000 }, /* R10203 */ + { 0x0000, 0x0000, 0x0000 }, /* R10204 */ + { 0x0000, 0x0000, 0x0000 }, /* R10205 */ + { 0x0000, 0x0000, 0x0000 }, /* R10206 */ + { 0x0000, 0x0000, 0x0000 }, /* R10207 */ + { 0x0000, 0x0000, 0x0000 }, /* R10208 */ + { 0x0000, 0x0000, 0x0000 }, /* R10209 */ + { 0x0000, 0x0000, 0x0000 }, /* R10210 */ + { 0x0000, 0x0000, 0x0000 }, /* R10211 */ + { 0x0000, 0x0000, 0x0000 }, /* R10212 */ + { 0x0000, 0x0000, 0x0000 }, /* R10213 */ + { 0x0000, 0x0000, 0x0000 }, /* R10214 */ + { 0x0000, 0x0000, 0x0000 }, /* R10215 */ + { 0x0000, 0x0000, 0x0000 }, /* R10216 */ + { 0x0000, 0x0000, 0x0000 }, /* R10217 */ + { 0x0000, 0x0000, 0x0000 }, /* R10218 */ + { 0x0000, 0x0000, 0x0000 }, /* R10219 */ + { 0x0000, 0x0000, 0x0000 }, /* R10220 */ + { 0x0000, 0x0000, 0x0000 }, /* R10221 */ + { 0x0000, 0x0000, 0x0000 }, /* R10222 */ + { 0x0000, 0x0000, 0x0000 }, /* R10223 */ + { 0x0000, 0x0000, 0x0000 }, /* R10224 */ + { 0x0000, 0x0000, 0x0000 }, /* R10225 */ + { 0x0000, 0x0000, 0x0000 }, /* R10226 */ + { 0x0000, 0x0000, 0x0000 }, /* R10227 */ + { 0x0000, 0x0000, 0x0000 }, /* R10228 */ + { 0x0000, 0x0000, 0x0000 }, /* R10229 */ + { 0x0000, 0x0000, 0x0000 }, /* R10230 */ + { 0x0000, 0x0000, 0x0000 }, /* R10231 */ + { 0x0000, 0x0000, 0x0000 }, /* R10232 */ + { 0x0000, 0x0000, 0x0000 }, /* R10233 */ + { 0x0000, 0x0000, 0x0000 }, /* R10234 */ + { 0x0000, 0x0000, 0x0000 }, /* R10235 */ + { 0x0000, 0x0000, 0x0000 }, /* R10236 */ + { 0x0000, 0x0000, 0x0000 }, /* R10237 */ + { 0x0000, 0x0000, 0x0000 }, /* R10238 */ + { 0x0000, 0x0000, 0x0000 }, /* R10239 */ + { 0x0000, 0x0000, 0x0000 }, /* R10240 */ + { 0x0000, 0x0000, 0x0000 }, /* R10241 */ + { 0x0000, 0x0000, 0x0000 }, /* R10242 */ + { 0x0000, 0x0000, 0x0000 }, /* R10243 */ + { 0x0000, 0x0000, 0x0000 }, /* R10244 */ + { 0x0000, 0x0000, 0x0000 }, /* R10245 */ + { 0x0000, 0x0000, 0x0000 }, /* R10246 */ + { 0x0000, 0x0000, 0x0000 }, /* R10247 */ + { 0x0000, 0x0000, 0x0000 }, /* R10248 */ + { 0x0000, 0x0000, 0x0000 }, /* R10249 */ + { 0x0000, 0x0000, 0x0000 }, /* R10250 */ + { 0x0000, 0x0000, 0x0000 }, /* R10251 */ + { 0x0000, 0x0000, 0x0000 }, /* R10252 */ + { 0x0000, 0x0000, 0x0000 }, /* R10253 */ + { 0x0000, 0x0000, 0x0000 }, /* R10254 */ + { 0x0000, 0x0000, 0x0000 }, /* R10255 */ + { 0x0000, 0x0000, 0x0000 }, /* R10256 */ + { 0x0000, 0x0000, 0x0000 }, /* R10257 */ + { 0x0000, 0x0000, 0x0000 }, /* R10258 */ + { 0x0000, 0x0000, 0x0000 }, /* R10259 */ + { 0x0000, 0x0000, 0x0000 }, /* R10260 */ + { 0x0000, 0x0000, 0x0000 }, /* R10261 */ + { 0x0000, 0x0000, 0x0000 }, /* R10262 */ + { 0x0000, 0x0000, 0x0000 }, /* R10263 */ + { 0x0000, 0x0000, 0x0000 }, /* R10264 */ + { 0x0000, 0x0000, 0x0000 }, /* R10265 */ + { 0x0000, 0x0000, 0x0000 }, /* R10266 */ + { 0x0000, 0x0000, 0x0000 }, /* R10267 */ + { 0x0000, 0x0000, 0x0000 }, /* R10268 */ + { 0x0000, 0x0000, 0x0000 }, /* R10269 */ + { 0x0000, 0x0000, 0x0000 }, /* R10270 */ + { 0x0000, 0x0000, 0x0000 }, /* R10271 */ + { 0x0000, 0x0000, 0x0000 }, /* R10272 */ + { 0x0000, 0x0000, 0x0000 }, /* R10273 */ + { 0x0000, 0x0000, 0x0000 }, /* R10274 */ + { 0x0000, 0x0000, 0x0000 }, /* R10275 */ + { 0x0000, 0x0000, 0x0000 }, /* R10276 */ + { 0x0000, 0x0000, 0x0000 }, /* R10277 */ + { 0x0000, 0x0000, 0x0000 }, /* R10278 */ + { 0x0000, 0x0000, 0x0000 }, /* R10279 */ + { 0x0000, 0x0000, 0x0000 }, /* R10280 */ + { 0x0000, 0x0000, 0x0000 }, /* R10281 */ + { 0x0000, 0x0000, 0x0000 }, /* R10282 */ + { 0x0000, 0x0000, 0x0000 }, /* R10283 */ + { 0x0000, 0x0000, 0x0000 }, /* R10284 */ + { 0x0000, 0x0000, 0x0000 }, /* R10285 */ + { 0x0000, 0x0000, 0x0000 }, /* R10286 */ + { 0x0000, 0x0000, 0x0000 }, /* R10287 */ + { 0x0000, 0x0000, 0x0000 }, /* R10288 */ + { 0x0000, 0x0000, 0x0000 }, /* R10289 */ + { 0x0000, 0x0000, 0x0000 }, /* R10290 */ + { 0x0000, 0x0000, 0x0000 }, /* R10291 */ + { 0x0000, 0x0000, 0x0000 }, /* R10292 */ + { 0x0000, 0x0000, 0x0000 }, /* R10293 */ + { 0x0000, 0x0000, 0x0000 }, /* R10294 */ + { 0x0000, 0x0000, 0x0000 }, /* R10295 */ + { 0x0000, 0x0000, 0x0000 }, /* R10296 */ + { 0x0000, 0x0000, 0x0000 }, /* R10297 */ + { 0x0000, 0x0000, 0x0000 }, /* R10298 */ + { 0x0000, 0x0000, 0x0000 }, /* R10299 */ + { 0x0000, 0x0000, 0x0000 }, /* R10300 */ + { 0x0000, 0x0000, 0x0000 }, /* R10301 */ + { 0x0000, 0x0000, 0x0000 }, /* R10302 */ + { 0x0000, 0x0000, 0x0000 }, /* R10303 */ + { 0x0000, 0x0000, 0x0000 }, /* R10304 */ + { 0x0000, 0x0000, 0x0000 }, /* R10305 */ + { 0x0000, 0x0000, 0x0000 }, /* R10306 */ + { 0x0000, 0x0000, 0x0000 }, /* R10307 */ + { 0x0000, 0x0000, 0x0000 }, /* R10308 */ + { 0x0000, 0x0000, 0x0000 }, /* R10309 */ + { 0x0000, 0x0000, 0x0000 }, /* R10310 */ + { 0x0000, 0x0000, 0x0000 }, /* R10311 */ + { 0x0000, 0x0000, 0x0000 }, /* R10312 */ + { 0x0000, 0x0000, 0x0000 }, /* R10313 */ + { 0x0000, 0x0000, 0x0000 }, /* R10314 */ + { 0x0000, 0x0000, 0x0000 }, /* R10315 */ + { 0x0000, 0x0000, 0x0000 }, /* R10316 */ + { 0x0000, 0x0000, 0x0000 }, /* R10317 */ + { 0x0000, 0x0000, 0x0000 }, /* R10318 */ + { 0x0000, 0x0000, 0x0000 }, /* R10319 */ + { 0x0000, 0x0000, 0x0000 }, /* R10320 */ + { 0x0000, 0x0000, 0x0000 }, /* R10321 */ + { 0x0000, 0x0000, 0x0000 }, /* R10322 */ + { 0x0000, 0x0000, 0x0000 }, /* R10323 */ + { 0x0000, 0x0000, 0x0000 }, /* R10324 */ + { 0x0000, 0x0000, 0x0000 }, /* R10325 */ + { 0x0000, 0x0000, 0x0000 }, /* R10326 */ + { 0x0000, 0x0000, 0x0000 }, /* R10327 */ + { 0x0000, 0x0000, 0x0000 }, /* R10328 */ + { 0x0000, 0x0000, 0x0000 }, /* R10329 */ + { 0x0000, 0x0000, 0x0000 }, /* R10330 */ + { 0x0000, 0x0000, 0x0000 }, /* R10331 */ + { 0x0000, 0x0000, 0x0000 }, /* R10332 */ + { 0x0000, 0x0000, 0x0000 }, /* R10333 */ + { 0x0000, 0x0000, 0x0000 }, /* R10334 */ + { 0x0000, 0x0000, 0x0000 }, /* R10335 */ + { 0x0000, 0x0000, 0x0000 }, /* R10336 */ + { 0x0000, 0x0000, 0x0000 }, /* R10337 */ + { 0x0000, 0x0000, 0x0000 }, /* R10338 */ + { 0x0000, 0x0000, 0x0000 }, /* R10339 */ + { 0x0000, 0x0000, 0x0000 }, /* R10340 */ + { 0x0000, 0x0000, 0x0000 }, /* R10341 */ + { 0x0000, 0x0000, 0x0000 }, /* R10342 */ + { 0x0000, 0x0000, 0x0000 }, /* R10343 */ + { 0x0000, 0x0000, 0x0000 }, /* R10344 */ + { 0x0000, 0x0000, 0x0000 }, /* R10345 */ + { 0x0000, 0x0000, 0x0000 }, /* R10346 */ + { 0x0000, 0x0000, 0x0000 }, /* R10347 */ + { 0x0000, 0x0000, 0x0000 }, /* R10348 */ + { 0x0000, 0x0000, 0x0000 }, /* R10349 */ + { 0x0000, 0x0000, 0x0000 }, /* R10350 */ + { 0x0000, 0x0000, 0x0000 }, /* R10351 */ + { 0x0000, 0x0000, 0x0000 }, /* R10352 */ + { 0x0000, 0x0000, 0x0000 }, /* R10353 */ + { 0x0000, 0x0000, 0x0000 }, /* R10354 */ + { 0x0000, 0x0000, 0x0000 }, /* R10355 */ + { 0x0000, 0x0000, 0x0000 }, /* R10356 */ + { 0x0000, 0x0000, 0x0000 }, /* R10357 */ + { 0x0000, 0x0000, 0x0000 }, /* R10358 */ + { 0x0000, 0x0000, 0x0000 }, /* R10359 */ + { 0x0000, 0x0000, 0x0000 }, /* R10360 */ + { 0x0000, 0x0000, 0x0000 }, /* R10361 */ + { 0x0000, 0x0000, 0x0000 }, /* R10362 */ + { 0x0000, 0x0000, 0x0000 }, /* R10363 */ + { 0x0000, 0x0000, 0x0000 }, /* R10364 */ + { 0x0000, 0x0000, 0x0000 }, /* R10365 */ + { 0x0000, 0x0000, 0x0000 }, /* R10366 */ + { 0x0000, 0x0000, 0x0000 }, /* R10367 */ + { 0x0000, 0x0000, 0x0000 }, /* R10368 */ + { 0x0000, 0x0000, 0x0000 }, /* R10369 */ + { 0x0000, 0x0000, 0x0000 }, /* R10370 */ + { 0x0000, 0x0000, 0x0000 }, /* R10371 */ + { 0x0000, 0x0000, 0x0000 }, /* R10372 */ + { 0x0000, 0x0000, 0x0000 }, /* R10373 */ + { 0x0000, 0x0000, 0x0000 }, /* R10374 */ + { 0x0000, 0x0000, 0x0000 }, /* R10375 */ + { 0x0000, 0x0000, 0x0000 }, /* R10376 */ + { 0x0000, 0x0000, 0x0000 }, /* R10377 */ + { 0x0000, 0x0000, 0x0000 }, /* R10378 */ + { 0x0000, 0x0000, 0x0000 }, /* R10379 */ + { 0x0000, 0x0000, 0x0000 }, /* R10380 */ + { 0x0000, 0x0000, 0x0000 }, /* R10381 */ + { 0x0000, 0x0000, 0x0000 }, /* R10382 */ + { 0x0000, 0x0000, 0x0000 }, /* R10383 */ + { 0x0000, 0x0000, 0x0000 }, /* R10384 */ + { 0x0000, 0x0000, 0x0000 }, /* R10385 */ + { 0x0000, 0x0000, 0x0000 }, /* R10386 */ + { 0x0000, 0x0000, 0x0000 }, /* R10387 */ + { 0x0000, 0x0000, 0x0000 }, /* R10388 */ + { 0x0000, 0x0000, 0x0000 }, /* R10389 */ + { 0x0000, 0x0000, 0x0000 }, /* R10390 */ + { 0x0000, 0x0000, 0x0000 }, /* R10391 */ + { 0x0000, 0x0000, 0x0000 }, /* R10392 */ + { 0x0000, 0x0000, 0x0000 }, /* R10393 */ + { 0x0000, 0x0000, 0x0000 }, /* R10394 */ + { 0x0000, 0x0000, 0x0000 }, /* R10395 */ + { 0x0000, 0x0000, 0x0000 }, /* R10396 */ + { 0x0000, 0x0000, 0x0000 }, /* R10397 */ + { 0x0000, 0x0000, 0x0000 }, /* R10398 */ + { 0x0000, 0x0000, 0x0000 }, /* R10399 */ + { 0x0000, 0x0000, 0x0000 }, /* R10400 */ + { 0x0000, 0x0000, 0x0000 }, /* R10401 */ + { 0x0000, 0x0000, 0x0000 }, /* R10402 */ + { 0x0000, 0x0000, 0x0000 }, /* R10403 */ + { 0x0000, 0x0000, 0x0000 }, /* R10404 */ + { 0x0000, 0x0000, 0x0000 }, /* R10405 */ + { 0x0000, 0x0000, 0x0000 }, /* R10406 */ + { 0x0000, 0x0000, 0x0000 }, /* R10407 */ + { 0x0000, 0x0000, 0x0000 }, /* R10408 */ + { 0x0000, 0x0000, 0x0000 }, /* R10409 */ + { 0x0000, 0x0000, 0x0000 }, /* R10410 */ + { 0x0000, 0x0000, 0x0000 }, /* R10411 */ + { 0x0000, 0x0000, 0x0000 }, /* R10412 */ + { 0x0000, 0x0000, 0x0000 }, /* R10413 */ + { 0x0000, 0x0000, 0x0000 }, /* R10414 */ + { 0x0000, 0x0000, 0x0000 }, /* R10415 */ + { 0x0000, 0x0000, 0x0000 }, /* R10416 */ + { 0x0000, 0x0000, 0x0000 }, /* R10417 */ + { 0x0000, 0x0000, 0x0000 }, /* R10418 */ + { 0x0000, 0x0000, 0x0000 }, /* R10419 */ + { 0x0000, 0x0000, 0x0000 }, /* R10420 */ + { 0x0000, 0x0000, 0x0000 }, /* R10421 */ + { 0x0000, 0x0000, 0x0000 }, /* R10422 */ + { 0x0000, 0x0000, 0x0000 }, /* R10423 */ + { 0x0000, 0x0000, 0x0000 }, /* R10424 */ + { 0x0000, 0x0000, 0x0000 }, /* R10425 */ + { 0x0000, 0x0000, 0x0000 }, /* R10426 */ + { 0x0000, 0x0000, 0x0000 }, /* R10427 */ + { 0x0000, 0x0000, 0x0000 }, /* R10428 */ + { 0x0000, 0x0000, 0x0000 }, /* R10429 */ + { 0x0000, 0x0000, 0x0000 }, /* R10430 */ + { 0x0000, 0x0000, 0x0000 }, /* R10431 */ + { 0x0000, 0x0000, 0x0000 }, /* R10432 */ + { 0x0000, 0x0000, 0x0000 }, /* R10433 */ + { 0x0000, 0x0000, 0x0000 }, /* R10434 */ + { 0x0000, 0x0000, 0x0000 }, /* R10435 */ + { 0x0000, 0x0000, 0x0000 }, /* R10436 */ + { 0x0000, 0x0000, 0x0000 }, /* R10437 */ + { 0x0000, 0x0000, 0x0000 }, /* R10438 */ + { 0x0000, 0x0000, 0x0000 }, /* R10439 */ + { 0x0000, 0x0000, 0x0000 }, /* R10440 */ + { 0x0000, 0x0000, 0x0000 }, /* R10441 */ + { 0x0000, 0x0000, 0x0000 }, /* R10442 */ + { 0x0000, 0x0000, 0x0000 }, /* R10443 */ + { 0x0000, 0x0000, 0x0000 }, /* R10444 */ + { 0x0000, 0x0000, 0x0000 }, /* R10445 */ + { 0x0000, 0x0000, 0x0000 }, /* R10446 */ + { 0x0000, 0x0000, 0x0000 }, /* R10447 */ + { 0x0000, 0x0000, 0x0000 }, /* R10448 */ + { 0x0000, 0x0000, 0x0000 }, /* R10449 */ + { 0x0000, 0x0000, 0x0000 }, /* R10450 */ + { 0x0000, 0x0000, 0x0000 }, /* R10451 */ + { 0x0000, 0x0000, 0x0000 }, /* R10452 */ + { 0x0000, 0x0000, 0x0000 }, /* R10453 */ + { 0x0000, 0x0000, 0x0000 }, /* R10454 */ + { 0x0000, 0x0000, 0x0000 }, /* R10455 */ + { 0x0000, 0x0000, 0x0000 }, /* R10456 */ + { 0x0000, 0x0000, 0x0000 }, /* R10457 */ + { 0x0000, 0x0000, 0x0000 }, /* R10458 */ + { 0x0000, 0x0000, 0x0000 }, /* R10459 */ + { 0x0000, 0x0000, 0x0000 }, /* R10460 */ + { 0x0000, 0x0000, 0x0000 }, /* R10461 */ + { 0x0000, 0x0000, 0x0000 }, /* R10462 */ + { 0x0000, 0x0000, 0x0000 }, /* R10463 */ + { 0x0000, 0x0000, 0x0000 }, /* R10464 */ + { 0x0000, 0x0000, 0x0000 }, /* R10465 */ + { 0x0000, 0x0000, 0x0000 }, /* R10466 */ + { 0x0000, 0x0000, 0x0000 }, /* R10467 */ + { 0x0000, 0x0000, 0x0000 }, /* R10468 */ + { 0x0000, 0x0000, 0x0000 }, /* R10469 */ + { 0x0000, 0x0000, 0x0000 }, /* R10470 */ + { 0x0000, 0x0000, 0x0000 }, /* R10471 */ + { 0x0000, 0x0000, 0x0000 }, /* R10472 */ + { 0x0000, 0x0000, 0x0000 }, /* R10473 */ + { 0x0000, 0x0000, 0x0000 }, /* R10474 */ + { 0x0000, 0x0000, 0x0000 }, /* R10475 */ + { 0x0000, 0x0000, 0x0000 }, /* R10476 */ + { 0x0000, 0x0000, 0x0000 }, /* R10477 */ + { 0x0000, 0x0000, 0x0000 }, /* R10478 */ + { 0x0000, 0x0000, 0x0000 }, /* R10479 */ + { 0x0000, 0x0000, 0x0000 }, /* R10480 */ + { 0x0000, 0x0000, 0x0000 }, /* R10481 */ + { 0x0000, 0x0000, 0x0000 }, /* R10482 */ + { 0x0000, 0x0000, 0x0000 }, /* R10483 */ + { 0x0000, 0x0000, 0x0000 }, /* R10484 */ + { 0x0000, 0x0000, 0x0000 }, /* R10485 */ + { 0x0000, 0x0000, 0x0000 }, /* R10486 */ + { 0x0000, 0x0000, 0x0000 }, /* R10487 */ + { 0x0000, 0x0000, 0x0000 }, /* R10488 */ + { 0x0000, 0x0000, 0x0000 }, /* R10489 */ + { 0x0000, 0x0000, 0x0000 }, /* R10490 */ + { 0x0000, 0x0000, 0x0000 }, /* R10491 */ + { 0x0000, 0x0000, 0x0000 }, /* R10492 */ + { 0x0000, 0x0000, 0x0000 }, /* R10493 */ + { 0x0000, 0x0000, 0x0000 }, /* R10494 */ + { 0x0000, 0x0000, 0x0000 }, /* R10495 */ + { 0x0000, 0x0000, 0x0000 }, /* R10496 */ + { 0x0000, 0x0000, 0x0000 }, /* R10497 */ + { 0x0000, 0x0000, 0x0000 }, /* R10498 */ + { 0x0000, 0x0000, 0x0000 }, /* R10499 */ + { 0x0000, 0x0000, 0x0000 }, /* R10500 */ + { 0x0000, 0x0000, 0x0000 }, /* R10501 */ + { 0x0000, 0x0000, 0x0000 }, /* R10502 */ + { 0x0000, 0x0000, 0x0000 }, /* R10503 */ + { 0x0000, 0x0000, 0x0000 }, /* R10504 */ + { 0x0000, 0x0000, 0x0000 }, /* R10505 */ + { 0x0000, 0x0000, 0x0000 }, /* R10506 */ + { 0x0000, 0x0000, 0x0000 }, /* R10507 */ + { 0x0000, 0x0000, 0x0000 }, /* R10508 */ + { 0x0000, 0x0000, 0x0000 }, /* R10509 */ + { 0x0000, 0x0000, 0x0000 }, /* R10510 */ + { 0x0000, 0x0000, 0x0000 }, /* R10511 */ + { 0x0000, 0x0000, 0x0000 }, /* R10512 */ + { 0x0000, 0x0000, 0x0000 }, /* R10513 */ + { 0x0000, 0x0000, 0x0000 }, /* R10514 */ + { 0x0000, 0x0000, 0x0000 }, /* R10515 */ + { 0x0000, 0x0000, 0x0000 }, /* R10516 */ + { 0x0000, 0x0000, 0x0000 }, /* R10517 */ + { 0x0000, 0x0000, 0x0000 }, /* R10518 */ + { 0x0000, 0x0000, 0x0000 }, /* R10519 */ + { 0x0000, 0x0000, 0x0000 }, /* R10520 */ + { 0x0000, 0x0000, 0x0000 }, /* R10521 */ + { 0x0000, 0x0000, 0x0000 }, /* R10522 */ + { 0x0000, 0x0000, 0x0000 }, /* R10523 */ + { 0x0000, 0x0000, 0x0000 }, /* R10524 */ + { 0x0000, 0x0000, 0x0000 }, /* R10525 */ + { 0x0000, 0x0000, 0x0000 }, /* R10526 */ + { 0x0000, 0x0000, 0x0000 }, /* R10527 */ + { 0x0000, 0x0000, 0x0000 }, /* R10528 */ + { 0x0000, 0x0000, 0x0000 }, /* R10529 */ + { 0x0000, 0x0000, 0x0000 }, /* R10530 */ + { 0x0000, 0x0000, 0x0000 }, /* R10531 */ + { 0x0000, 0x0000, 0x0000 }, /* R10532 */ + { 0x0000, 0x0000, 0x0000 }, /* R10533 */ + { 0x0000, 0x0000, 0x0000 }, /* R10534 */ + { 0x0000, 0x0000, 0x0000 }, /* R10535 */ + { 0x0000, 0x0000, 0x0000 }, /* R10536 */ + { 0x0000, 0x0000, 0x0000 }, /* R10537 */ + { 0x0000, 0x0000, 0x0000 }, /* R10538 */ + { 0x0000, 0x0000, 0x0000 }, /* R10539 */ + { 0x0000, 0x0000, 0x0000 }, /* R10540 */ + { 0x0000, 0x0000, 0x0000 }, /* R10541 */ + { 0x0000, 0x0000, 0x0000 }, /* R10542 */ + { 0x0000, 0x0000, 0x0000 }, /* R10543 */ + { 0x0000, 0x0000, 0x0000 }, /* R10544 */ + { 0x0000, 0x0000, 0x0000 }, /* R10545 */ + { 0x0000, 0x0000, 0x0000 }, /* R10546 */ + { 0x0000, 0x0000, 0x0000 }, /* R10547 */ + { 0x0000, 0x0000, 0x0000 }, /* R10548 */ + { 0x0000, 0x0000, 0x0000 }, /* R10549 */ + { 0x0000, 0x0000, 0x0000 }, /* R10550 */ + { 0x0000, 0x0000, 0x0000 }, /* R10551 */ + { 0x0000, 0x0000, 0x0000 }, /* R10552 */ + { 0x0000, 0x0000, 0x0000 }, /* R10553 */ + { 0x0000, 0x0000, 0x0000 }, /* R10554 */ + { 0x0000, 0x0000, 0x0000 }, /* R10555 */ + { 0x0000, 0x0000, 0x0000 }, /* R10556 */ + { 0x0000, 0x0000, 0x0000 }, /* R10557 */ + { 0x0000, 0x0000, 0x0000 }, /* R10558 */ + { 0x0000, 0x0000, 0x0000 }, /* R10559 */ + { 0x0000, 0x0000, 0x0000 }, /* R10560 */ + { 0x0000, 0x0000, 0x0000 }, /* R10561 */ + { 0x0000, 0x0000, 0x0000 }, /* R10562 */ + { 0x0000, 0x0000, 0x0000 }, /* R10563 */ + { 0x0000, 0x0000, 0x0000 }, /* R10564 */ + { 0x0000, 0x0000, 0x0000 }, /* R10565 */ + { 0x0000, 0x0000, 0x0000 }, /* R10566 */ + { 0x0000, 0x0000, 0x0000 }, /* R10567 */ + { 0x0000, 0x0000, 0x0000 }, /* R10568 */ + { 0x0000, 0x0000, 0x0000 }, /* R10569 */ + { 0x0000, 0x0000, 0x0000 }, /* R10570 */ + { 0x0000, 0x0000, 0x0000 }, /* R10571 */ + { 0x0000, 0x0000, 0x0000 }, /* R10572 */ + { 0x0000, 0x0000, 0x0000 }, /* R10573 */ + { 0x0000, 0x0000, 0x0000 }, /* R10574 */ + { 0x0000, 0x0000, 0x0000 }, /* R10575 */ + { 0x0000, 0x0000, 0x0000 }, /* R10576 */ + { 0x0000, 0x0000, 0x0000 }, /* R10577 */ + { 0x0000, 0x0000, 0x0000 }, /* R10578 */ + { 0x0000, 0x0000, 0x0000 }, /* R10579 */ + { 0x0000, 0x0000, 0x0000 }, /* R10580 */ + { 0x0000, 0x0000, 0x0000 }, /* R10581 */ + { 0x0000, 0x0000, 0x0000 }, /* R10582 */ + { 0x0000, 0x0000, 0x0000 }, /* R10583 */ + { 0x0000, 0x0000, 0x0000 }, /* R10584 */ + { 0x0000, 0x0000, 0x0000 }, /* R10585 */ + { 0x0000, 0x0000, 0x0000 }, /* R10586 */ + { 0x0000, 0x0000, 0x0000 }, /* R10587 */ + { 0x0000, 0x0000, 0x0000 }, /* R10588 */ + { 0x0000, 0x0000, 0x0000 }, /* R10589 */ + { 0x0000, 0x0000, 0x0000 }, /* R10590 */ + { 0x0000, 0x0000, 0x0000 }, /* R10591 */ + { 0x0000, 0x0000, 0x0000 }, /* R10592 */ + { 0x0000, 0x0000, 0x0000 }, /* R10593 */ + { 0x0000, 0x0000, 0x0000 }, /* R10594 */ + { 0x0000, 0x0000, 0x0000 }, /* R10595 */ + { 0x0000, 0x0000, 0x0000 }, /* R10596 */ + { 0x0000, 0x0000, 0x0000 }, /* R10597 */ + { 0x0000, 0x0000, 0x0000 }, /* R10598 */ + { 0x0000, 0x0000, 0x0000 }, /* R10599 */ + { 0x0000, 0x0000, 0x0000 }, /* R10600 */ + { 0x0000, 0x0000, 0x0000 }, /* R10601 */ + { 0x0000, 0x0000, 0x0000 }, /* R10602 */ + { 0x0000, 0x0000, 0x0000 }, /* R10603 */ + { 0x0000, 0x0000, 0x0000 }, /* R10604 */ + { 0x0000, 0x0000, 0x0000 }, /* R10605 */ + { 0x0000, 0x0000, 0x0000 }, /* R10606 */ + { 0x0000, 0x0000, 0x0000 }, /* R10607 */ + { 0x0000, 0x0000, 0x0000 }, /* R10608 */ + { 0x0000, 0x0000, 0x0000 }, /* R10609 */ + { 0x0000, 0x0000, 0x0000 }, /* R10610 */ + { 0x0000, 0x0000, 0x0000 }, /* R10611 */ + { 0x0000, 0x0000, 0x0000 }, /* R10612 */ + { 0x0000, 0x0000, 0x0000 }, /* R10613 */ + { 0x0000, 0x0000, 0x0000 }, /* R10614 */ + { 0x0000, 0x0000, 0x0000 }, /* R10615 */ + { 0x0000, 0x0000, 0x0000 }, /* R10616 */ + { 0x0000, 0x0000, 0x0000 }, /* R10617 */ + { 0x0000, 0x0000, 0x0000 }, /* R10618 */ + { 0x0000, 0x0000, 0x0000 }, /* R10619 */ + { 0x0000, 0x0000, 0x0000 }, /* R10620 */ + { 0x0000, 0x0000, 0x0000 }, /* R10621 */ + { 0x0000, 0x0000, 0x0000 }, /* R10622 */ + { 0x0000, 0x0000, 0x0000 }, /* R10623 */ + { 0x0000, 0x0000, 0x0000 }, /* R10624 */ + { 0x0000, 0x0000, 0x0000 }, /* R10625 */ + { 0x0000, 0x0000, 0x0000 }, /* R10626 */ + { 0x0000, 0x0000, 0x0000 }, /* R10627 */ + { 0x0000, 0x0000, 0x0000 }, /* R10628 */ + { 0x0000, 0x0000, 0x0000 }, /* R10629 */ + { 0x0000, 0x0000, 0x0000 }, /* R10630 */ + { 0x0000, 0x0000, 0x0000 }, /* R10631 */ + { 0x0000, 0x0000, 0x0000 }, /* R10632 */ + { 0x0000, 0x0000, 0x0000 }, /* R10633 */ + { 0x0000, 0x0000, 0x0000 }, /* R10634 */ + { 0x0000, 0x0000, 0x0000 }, /* R10635 */ + { 0x0000, 0x0000, 0x0000 }, /* R10636 */ + { 0x0000, 0x0000, 0x0000 }, /* R10637 */ + { 0x0000, 0x0000, 0x0000 }, /* R10638 */ + { 0x0000, 0x0000, 0x0000 }, /* R10639 */ + { 0x0000, 0x0000, 0x0000 }, /* R10640 */ + { 0x0000, 0x0000, 0x0000 }, /* R10641 */ + { 0x0000, 0x0000, 0x0000 }, /* R10642 */ + { 0x0000, 0x0000, 0x0000 }, /* R10643 */ + { 0x0000, 0x0000, 0x0000 }, /* R10644 */ + { 0x0000, 0x0000, 0x0000 }, /* R10645 */ + { 0x0000, 0x0000, 0x0000 }, /* R10646 */ + { 0x0000, 0x0000, 0x0000 }, /* R10647 */ + { 0x0000, 0x0000, 0x0000 }, /* R10648 */ + { 0x0000, 0x0000, 0x0000 }, /* R10649 */ + { 0x0000, 0x0000, 0x0000 }, /* R10650 */ + { 0x0000, 0x0000, 0x0000 }, /* R10651 */ + { 0x0000, 0x0000, 0x0000 }, /* R10652 */ + { 0x0000, 0x0000, 0x0000 }, /* R10653 */ + { 0x0000, 0x0000, 0x0000 }, /* R10654 */ + { 0x0000, 0x0000, 0x0000 }, /* R10655 */ + { 0x0000, 0x0000, 0x0000 }, /* R10656 */ + { 0x0000, 0x0000, 0x0000 }, /* R10657 */ + { 0x0000, 0x0000, 0x0000 }, /* R10658 */ + { 0x0000, 0x0000, 0x0000 }, /* R10659 */ + { 0x0000, 0x0000, 0x0000 }, /* R10660 */ + { 0x0000, 0x0000, 0x0000 }, /* R10661 */ + { 0x0000, 0x0000, 0x0000 }, /* R10662 */ + { 0x0000, 0x0000, 0x0000 }, /* R10663 */ + { 0x0000, 0x0000, 0x0000 }, /* R10664 */ + { 0x0000, 0x0000, 0x0000 }, /* R10665 */ + { 0x0000, 0x0000, 0x0000 }, /* R10666 */ + { 0x0000, 0x0000, 0x0000 }, /* R10667 */ + { 0x0000, 0x0000, 0x0000 }, /* R10668 */ + { 0x0000, 0x0000, 0x0000 }, /* R10669 */ + { 0x0000, 0x0000, 0x0000 }, /* R10670 */ + { 0x0000, 0x0000, 0x0000 }, /* R10671 */ + { 0x0000, 0x0000, 0x0000 }, /* R10672 */ + { 0x0000, 0x0000, 0x0000 }, /* R10673 */ + { 0x0000, 0x0000, 0x0000 }, /* R10674 */ + { 0x0000, 0x0000, 0x0000 }, /* R10675 */ + { 0x0000, 0x0000, 0x0000 }, /* R10676 */ + { 0x0000, 0x0000, 0x0000 }, /* R10677 */ + { 0x0000, 0x0000, 0x0000 }, /* R10678 */ + { 0x0000, 0x0000, 0x0000 }, /* R10679 */ + { 0x0000, 0x0000, 0x0000 }, /* R10680 */ + { 0x0000, 0x0000, 0x0000 }, /* R10681 */ + { 0x0000, 0x0000, 0x0000 }, /* R10682 */ + { 0x0000, 0x0000, 0x0000 }, /* R10683 */ + { 0x0000, 0x0000, 0x0000 }, /* R10684 */ + { 0x0000, 0x0000, 0x0000 }, /* R10685 */ + { 0x0000, 0x0000, 0x0000 }, /* R10686 */ + { 0x0000, 0x0000, 0x0000 }, /* R10687 */ + { 0x0000, 0x0000, 0x0000 }, /* R10688 */ + { 0x0000, 0x0000, 0x0000 }, /* R10689 */ + { 0x0000, 0x0000, 0x0000 }, /* R10690 */ + { 0x0000, 0x0000, 0x0000 }, /* R10691 */ + { 0x0000, 0x0000, 0x0000 }, /* R10692 */ + { 0x0000, 0x0000, 0x0000 }, /* R10693 */ + { 0x0000, 0x0000, 0x0000 }, /* R10694 */ + { 0x0000, 0x0000, 0x0000 }, /* R10695 */ + { 0x0000, 0x0000, 0x0000 }, /* R10696 */ + { 0x0000, 0x0000, 0x0000 }, /* R10697 */ + { 0x0000, 0x0000, 0x0000 }, /* R10698 */ + { 0x0000, 0x0000, 0x0000 }, /* R10699 */ + { 0x0000, 0x0000, 0x0000 }, /* R10700 */ + { 0x0000, 0x0000, 0x0000 }, /* R10701 */ + { 0x0000, 0x0000, 0x0000 }, /* R10702 */ + { 0x0000, 0x0000, 0x0000 }, /* R10703 */ + { 0x0000, 0x0000, 0x0000 }, /* R10704 */ + { 0x0000, 0x0000, 0x0000 }, /* R10705 */ + { 0x0000, 0x0000, 0x0000 }, /* R10706 */ + { 0x0000, 0x0000, 0x0000 }, /* R10707 */ + { 0x0000, 0x0000, 0x0000 }, /* R10708 */ + { 0x0000, 0x0000, 0x0000 }, /* R10709 */ + { 0x0000, 0x0000, 0x0000 }, /* R10710 */ + { 0x0000, 0x0000, 0x0000 }, /* R10711 */ + { 0x0000, 0x0000, 0x0000 }, /* R10712 */ + { 0x0000, 0x0000, 0x0000 }, /* R10713 */ + { 0x0000, 0x0000, 0x0000 }, /* R10714 */ + { 0x0000, 0x0000, 0x0000 }, /* R10715 */ + { 0x0000, 0x0000, 0x0000 }, /* R10716 */ + { 0x0000, 0x0000, 0x0000 }, /* R10717 */ + { 0x0000, 0x0000, 0x0000 }, /* R10718 */ + { 0x0000, 0x0000, 0x0000 }, /* R10719 */ + { 0x0000, 0x0000, 0x0000 }, /* R10720 */ + { 0x0000, 0x0000, 0x0000 }, /* R10721 */ + { 0x0000, 0x0000, 0x0000 }, /* R10722 */ + { 0x0000, 0x0000, 0x0000 }, /* R10723 */ + { 0x0000, 0x0000, 0x0000 }, /* R10724 */ + { 0x0000, 0x0000, 0x0000 }, /* R10725 */ + { 0x0000, 0x0000, 0x0000 }, /* R10726 */ + { 0x0000, 0x0000, 0x0000 }, /* R10727 */ + { 0x0000, 0x0000, 0x0000 }, /* R10728 */ + { 0x0000, 0x0000, 0x0000 }, /* R10729 */ + { 0x0000, 0x0000, 0x0000 }, /* R10730 */ + { 0x0000, 0x0000, 0x0000 }, /* R10731 */ + { 0x0000, 0x0000, 0x0000 }, /* R10732 */ + { 0x0000, 0x0000, 0x0000 }, /* R10733 */ + { 0x0000, 0x0000, 0x0000 }, /* R10734 */ + { 0x0000, 0x0000, 0x0000 }, /* R10735 */ + { 0x0000, 0x0000, 0x0000 }, /* R10736 */ + { 0x0000, 0x0000, 0x0000 }, /* R10737 */ + { 0x0000, 0x0000, 0x0000 }, /* R10738 */ + { 0x0000, 0x0000, 0x0000 }, /* R10739 */ + { 0x0000, 0x0000, 0x0000 }, /* R10740 */ + { 0x0000, 0x0000, 0x0000 }, /* R10741 */ + { 0x0000, 0x0000, 0x0000 }, /* R10742 */ + { 0x0000, 0x0000, 0x0000 }, /* R10743 */ + { 0x0000, 0x0000, 0x0000 }, /* R10744 */ + { 0x0000, 0x0000, 0x0000 }, /* R10745 */ + { 0x0000, 0x0000, 0x0000 }, /* R10746 */ + { 0x0000, 0x0000, 0x0000 }, /* R10747 */ + { 0x0000, 0x0000, 0x0000 }, /* R10748 */ + { 0x0000, 0x0000, 0x0000 }, /* R10749 */ + { 0x0000, 0x0000, 0x0000 }, /* R10750 */ + { 0x0000, 0x0000, 0x0000 }, /* R10751 */ + { 0x0000, 0x0000, 0x0000 }, /* R10752 */ + { 0x0000, 0x0000, 0x0000 }, /* R10753 */ + { 0x0000, 0x0000, 0x0000 }, /* R10754 */ + { 0x0000, 0x0000, 0x0000 }, /* R10755 */ + { 0x0000, 0x0000, 0x0000 }, /* R10756 */ + { 0x0000, 0x0000, 0x0000 }, /* R10757 */ + { 0x0000, 0x0000, 0x0000 }, /* R10758 */ + { 0x0000, 0x0000, 0x0000 }, /* R10759 */ + { 0x0000, 0x0000, 0x0000 }, /* R10760 */ + { 0x0000, 0x0000, 0x0000 }, /* R10761 */ + { 0x0000, 0x0000, 0x0000 }, /* R10762 */ + { 0x0000, 0x0000, 0x0000 }, /* R10763 */ + { 0x0000, 0x0000, 0x0000 }, /* R10764 */ + { 0x0000, 0x0000, 0x0000 }, /* R10765 */ + { 0x0000, 0x0000, 0x0000 }, /* R10766 */ + { 0x0000, 0x0000, 0x0000 }, /* R10767 */ + { 0x0000, 0x0000, 0x0000 }, /* R10768 */ + { 0x0000, 0x0000, 0x0000 }, /* R10769 */ + { 0x0000, 0x0000, 0x0000 }, /* R10770 */ + { 0x0000, 0x0000, 0x0000 }, /* R10771 */ + { 0x0000, 0x0000, 0x0000 }, /* R10772 */ + { 0x0000, 0x0000, 0x0000 }, /* R10773 */ + { 0x0000, 0x0000, 0x0000 }, /* R10774 */ + { 0x0000, 0x0000, 0x0000 }, /* R10775 */ + { 0x0000, 0x0000, 0x0000 }, /* R10776 */ + { 0x0000, 0x0000, 0x0000 }, /* R10777 */ + { 0x0000, 0x0000, 0x0000 }, /* R10778 */ + { 0x0000, 0x0000, 0x0000 }, /* R10779 */ + { 0x0000, 0x0000, 0x0000 }, /* R10780 */ + { 0x0000, 0x0000, 0x0000 }, /* R10781 */ + { 0x0000, 0x0000, 0x0000 }, /* R10782 */ + { 0x0000, 0x0000, 0x0000 }, /* R10783 */ + { 0x0000, 0x0000, 0x0000 }, /* R10784 */ + { 0x0000, 0x0000, 0x0000 }, /* R10785 */ + { 0x0000, 0x0000, 0x0000 }, /* R10786 */ + { 0x0000, 0x0000, 0x0000 }, /* R10787 */ + { 0x0000, 0x0000, 0x0000 }, /* R10788 */ + { 0x0000, 0x0000, 0x0000 }, /* R10789 */ + { 0x0000, 0x0000, 0x0000 }, /* R10790 */ + { 0x0000, 0x0000, 0x0000 }, /* R10791 */ + { 0x0000, 0x0000, 0x0000 }, /* R10792 */ + { 0x0000, 0x0000, 0x0000 }, /* R10793 */ + { 0x0000, 0x0000, 0x0000 }, /* R10794 */ + { 0x0000, 0x0000, 0x0000 }, /* R10795 */ + { 0x0000, 0x0000, 0x0000 }, /* R10796 */ + { 0x0000, 0x0000, 0x0000 }, /* R10797 */ + { 0x0000, 0x0000, 0x0000 }, /* R10798 */ + { 0x0000, 0x0000, 0x0000 }, /* R10799 */ + { 0x0000, 0x0000, 0x0000 }, /* R10800 */ + { 0x0000, 0x0000, 0x0000 }, /* R10801 */ + { 0x0000, 0x0000, 0x0000 }, /* R10802 */ + { 0x0000, 0x0000, 0x0000 }, /* R10803 */ + { 0x0000, 0x0000, 0x0000 }, /* R10804 */ + { 0x0000, 0x0000, 0x0000 }, /* R10805 */ + { 0x0000, 0x0000, 0x0000 }, /* R10806 */ + { 0x0000, 0x0000, 0x0000 }, /* R10807 */ + { 0x0000, 0x0000, 0x0000 }, /* R10808 */ + { 0x0000, 0x0000, 0x0000 }, /* R10809 */ + { 0x0000, 0x0000, 0x0000 }, /* R10810 */ + { 0x0000, 0x0000, 0x0000 }, /* R10811 */ + { 0x0000, 0x0000, 0x0000 }, /* R10812 */ + { 0x0000, 0x0000, 0x0000 }, /* R10813 */ + { 0x0000, 0x0000, 0x0000 }, /* R10814 */ + { 0x0000, 0x0000, 0x0000 }, /* R10815 */ + { 0x0000, 0x0000, 0x0000 }, /* R10816 */ + { 0x0000, 0x0000, 0x0000 }, /* R10817 */ + { 0x0000, 0x0000, 0x0000 }, /* R10818 */ + { 0x0000, 0x0000, 0x0000 }, /* R10819 */ + { 0x0000, 0x0000, 0x0000 }, /* R10820 */ + { 0x0000, 0x0000, 0x0000 }, /* R10821 */ + { 0x0000, 0x0000, 0x0000 }, /* R10822 */ + { 0x0000, 0x0000, 0x0000 }, /* R10823 */ + { 0x0000, 0x0000, 0x0000 }, /* R10824 */ + { 0x0000, 0x0000, 0x0000 }, /* R10825 */ + { 0x0000, 0x0000, 0x0000 }, /* R10826 */ + { 0x0000, 0x0000, 0x0000 }, /* R10827 */ + { 0x0000, 0x0000, 0x0000 }, /* R10828 */ + { 0x0000, 0x0000, 0x0000 }, /* R10829 */ + { 0x0000, 0x0000, 0x0000 }, /* R10830 */ + { 0x0000, 0x0000, 0x0000 }, /* R10831 */ + { 0x0000, 0x0000, 0x0000 }, /* R10832 */ + { 0x0000, 0x0000, 0x0000 }, /* R10833 */ + { 0x0000, 0x0000, 0x0000 }, /* R10834 */ + { 0x0000, 0x0000, 0x0000 }, /* R10835 */ + { 0x0000, 0x0000, 0x0000 }, /* R10836 */ + { 0x0000, 0x0000, 0x0000 }, /* R10837 */ + { 0x0000, 0x0000, 0x0000 }, /* R10838 */ + { 0x0000, 0x0000, 0x0000 }, /* R10839 */ + { 0x0000, 0x0000, 0x0000 }, /* R10840 */ + { 0x0000, 0x0000, 0x0000 }, /* R10841 */ + { 0x0000, 0x0000, 0x0000 }, /* R10842 */ + { 0x0000, 0x0000, 0x0000 }, /* R10843 */ + { 0x0000, 0x0000, 0x0000 }, /* R10844 */ + { 0x0000, 0x0000, 0x0000 }, /* R10845 */ + { 0x0000, 0x0000, 0x0000 }, /* R10846 */ + { 0x0000, 0x0000, 0x0000 }, /* R10847 */ + { 0x0000, 0x0000, 0x0000 }, /* R10848 */ + { 0x0000, 0x0000, 0x0000 }, /* R10849 */ + { 0x0000, 0x0000, 0x0000 }, /* R10850 */ + { 0x0000, 0x0000, 0x0000 }, /* R10851 */ + { 0x0000, 0x0000, 0x0000 }, /* R10852 */ + { 0x0000, 0x0000, 0x0000 }, /* R10853 */ + { 0x0000, 0x0000, 0x0000 }, /* R10854 */ + { 0x0000, 0x0000, 0x0000 }, /* R10855 */ + { 0x0000, 0x0000, 0x0000 }, /* R10856 */ + { 0x0000, 0x0000, 0x0000 }, /* R10857 */ + { 0x0000, 0x0000, 0x0000 }, /* R10858 */ + { 0x0000, 0x0000, 0x0000 }, /* R10859 */ + { 0x0000, 0x0000, 0x0000 }, /* R10860 */ + { 0x0000, 0x0000, 0x0000 }, /* R10861 */ + { 0x0000, 0x0000, 0x0000 }, /* R10862 */ + { 0x0000, 0x0000, 0x0000 }, /* R10863 */ + { 0x0000, 0x0000, 0x0000 }, /* R10864 */ + { 0x0000, 0x0000, 0x0000 }, /* R10865 */ + { 0x0000, 0x0000, 0x0000 }, /* R10866 */ + { 0x0000, 0x0000, 0x0000 }, /* R10867 */ + { 0x0000, 0x0000, 0x0000 }, /* R10868 */ + { 0x0000, 0x0000, 0x0000 }, /* R10869 */ + { 0x0000, 0x0000, 0x0000 }, /* R10870 */ + { 0x0000, 0x0000, 0x0000 }, /* R10871 */ + { 0x0000, 0x0000, 0x0000 }, /* R10872 */ + { 0x0000, 0x0000, 0x0000 }, /* R10873 */ + { 0x0000, 0x0000, 0x0000 }, /* R10874 */ + { 0x0000, 0x0000, 0x0000 }, /* R10875 */ + { 0x0000, 0x0000, 0x0000 }, /* R10876 */ + { 0x0000, 0x0000, 0x0000 }, /* R10877 */ + { 0x0000, 0x0000, 0x0000 }, /* R10878 */ + { 0x0000, 0x0000, 0x0000 }, /* R10879 */ + { 0x0000, 0x0000, 0x0000 }, /* R10880 */ + { 0x0000, 0x0000, 0x0000 }, /* R10881 */ + { 0x0000, 0x0000, 0x0000 }, /* R10882 */ + { 0x0000, 0x0000, 0x0000 }, /* R10883 */ + { 0x0000, 0x0000, 0x0000 }, /* R10884 */ + { 0x0000, 0x0000, 0x0000 }, /* R10885 */ + { 0x0000, 0x0000, 0x0000 }, /* R10886 */ + { 0x0000, 0x0000, 0x0000 }, /* R10887 */ + { 0x0000, 0x0000, 0x0000 }, /* R10888 */ + { 0x0000, 0x0000, 0x0000 }, /* R10889 */ + { 0x0000, 0x0000, 0x0000 }, /* R10890 */ + { 0x0000, 0x0000, 0x0000 }, /* R10891 */ + { 0x0000, 0x0000, 0x0000 }, /* R10892 */ + { 0x0000, 0x0000, 0x0000 }, /* R10893 */ + { 0x0000, 0x0000, 0x0000 }, /* R10894 */ + { 0x0000, 0x0000, 0x0000 }, /* R10895 */ + { 0x0000, 0x0000, 0x0000 }, /* R10896 */ + { 0x0000, 0x0000, 0x0000 }, /* R10897 */ + { 0x0000, 0x0000, 0x0000 }, /* R10898 */ + { 0x0000, 0x0000, 0x0000 }, /* R10899 */ + { 0x0000, 0x0000, 0x0000 }, /* R10900 */ + { 0x0000, 0x0000, 0x0000 }, /* R10901 */ + { 0x0000, 0x0000, 0x0000 }, /* R10902 */ + { 0x0000, 0x0000, 0x0000 }, /* R10903 */ + { 0x0000, 0x0000, 0x0000 }, /* R10904 */ + { 0x0000, 0x0000, 0x0000 }, /* R10905 */ + { 0x0000, 0x0000, 0x0000 }, /* R10906 */ + { 0x0000, 0x0000, 0x0000 }, /* R10907 */ + { 0x0000, 0x0000, 0x0000 }, /* R10908 */ + { 0x0000, 0x0000, 0x0000 }, /* R10909 */ + { 0x0000, 0x0000, 0x0000 }, /* R10910 */ + { 0x0000, 0x0000, 0x0000 }, /* R10911 */ + { 0x0000, 0x0000, 0x0000 }, /* R10912 */ + { 0x0000, 0x0000, 0x0000 }, /* R10913 */ + { 0x0000, 0x0000, 0x0000 }, /* R10914 */ + { 0x0000, 0x0000, 0x0000 }, /* R10915 */ + { 0x0000, 0x0000, 0x0000 }, /* R10916 */ + { 0x0000, 0x0000, 0x0000 }, /* R10917 */ + { 0x0000, 0x0000, 0x0000 }, /* R10918 */ + { 0x0000, 0x0000, 0x0000 }, /* R10919 */ + { 0x0000, 0x0000, 0x0000 }, /* R10920 */ + { 0x0000, 0x0000, 0x0000 }, /* R10921 */ + { 0x0000, 0x0000, 0x0000 }, /* R10922 */ + { 0x0000, 0x0000, 0x0000 }, /* R10923 */ + { 0x0000, 0x0000, 0x0000 }, /* R10924 */ + { 0x0000, 0x0000, 0x0000 }, /* R10925 */ + { 0x0000, 0x0000, 0x0000 }, /* R10926 */ + { 0x0000, 0x0000, 0x0000 }, /* R10927 */ + { 0x0000, 0x0000, 0x0000 }, /* R10928 */ + { 0x0000, 0x0000, 0x0000 }, /* R10929 */ + { 0x0000, 0x0000, 0x0000 }, /* R10930 */ + { 0x0000, 0x0000, 0x0000 }, /* R10931 */ + { 0x0000, 0x0000, 0x0000 }, /* R10932 */ + { 0x0000, 0x0000, 0x0000 }, /* R10933 */ + { 0x0000, 0x0000, 0x0000 }, /* R10934 */ + { 0x0000, 0x0000, 0x0000 }, /* R10935 */ + { 0x0000, 0x0000, 0x0000 }, /* R10936 */ + { 0x0000, 0x0000, 0x0000 }, /* R10937 */ + { 0x0000, 0x0000, 0x0000 }, /* R10938 */ + { 0x0000, 0x0000, 0x0000 }, /* R10939 */ + { 0x0000, 0x0000, 0x0000 }, /* R10940 */ + { 0x0000, 0x0000, 0x0000 }, /* R10941 */ + { 0x0000, 0x0000, 0x0000 }, /* R10942 */ + { 0x0000, 0x0000, 0x0000 }, /* R10943 */ + { 0x0000, 0x0000, 0x0000 }, /* R10944 */ + { 0x0000, 0x0000, 0x0000 }, /* R10945 */ + { 0x0000, 0x0000, 0x0000 }, /* R10946 */ + { 0x0000, 0x0000, 0x0000 }, /* R10947 */ + { 0x0000, 0x0000, 0x0000 }, /* R10948 */ + { 0x0000, 0x0000, 0x0000 }, /* R10949 */ + { 0x0000, 0x0000, 0x0000 }, /* R10950 */ + { 0x0000, 0x0000, 0x0000 }, /* R10951 */ + { 0x0000, 0x0000, 0x0000 }, /* R10952 */ + { 0x0000, 0x0000, 0x0000 }, /* R10953 */ + { 0x0000, 0x0000, 0x0000 }, /* R10954 */ + { 0x0000, 0x0000, 0x0000 }, /* R10955 */ + { 0x0000, 0x0000, 0x0000 }, /* R10956 */ + { 0x0000, 0x0000, 0x0000 }, /* R10957 */ + { 0x0000, 0x0000, 0x0000 }, /* R10958 */ + { 0x0000, 0x0000, 0x0000 }, /* R10959 */ + { 0x0000, 0x0000, 0x0000 }, /* R10960 */ + { 0x0000, 0x0000, 0x0000 }, /* R10961 */ + { 0x0000, 0x0000, 0x0000 }, /* R10962 */ + { 0x0000, 0x0000, 0x0000 }, /* R10963 */ + { 0x0000, 0x0000, 0x0000 }, /* R10964 */ + { 0x0000, 0x0000, 0x0000 }, /* R10965 */ + { 0x0000, 0x0000, 0x0000 }, /* R10966 */ + { 0x0000, 0x0000, 0x0000 }, /* R10967 */ + { 0x0000, 0x0000, 0x0000 }, /* R10968 */ + { 0x0000, 0x0000, 0x0000 }, /* R10969 */ + { 0x0000, 0x0000, 0x0000 }, /* R10970 */ + { 0x0000, 0x0000, 0x0000 }, /* R10971 */ + { 0x0000, 0x0000, 0x0000 }, /* R10972 */ + { 0x0000, 0x0000, 0x0000 }, /* R10973 */ + { 0x0000, 0x0000, 0x0000 }, /* R10974 */ + { 0x0000, 0x0000, 0x0000 }, /* R10975 */ + { 0x0000, 0x0000, 0x0000 }, /* R10976 */ + { 0x0000, 0x0000, 0x0000 }, /* R10977 */ + { 0x0000, 0x0000, 0x0000 }, /* R10978 */ + { 0x0000, 0x0000, 0x0000 }, /* R10979 */ + { 0x0000, 0x0000, 0x0000 }, /* R10980 */ + { 0x0000, 0x0000, 0x0000 }, /* R10981 */ + { 0x0000, 0x0000, 0x0000 }, /* R10982 */ + { 0x0000, 0x0000, 0x0000 }, /* R10983 */ + { 0x0000, 0x0000, 0x0000 }, /* R10984 */ + { 0x0000, 0x0000, 0x0000 }, /* R10985 */ + { 0x0000, 0x0000, 0x0000 }, /* R10986 */ + { 0x0000, 0x0000, 0x0000 }, /* R10987 */ + { 0x0000, 0x0000, 0x0000 }, /* R10988 */ + { 0x0000, 0x0000, 0x0000 }, /* R10989 */ + { 0x0000, 0x0000, 0x0000 }, /* R10990 */ + { 0x0000, 0x0000, 0x0000 }, /* R10991 */ + { 0x0000, 0x0000, 0x0000 }, /* R10992 */ + { 0x0000, 0x0000, 0x0000 }, /* R10993 */ + { 0x0000, 0x0000, 0x0000 }, /* R10994 */ + { 0x0000, 0x0000, 0x0000 }, /* R10995 */ + { 0x0000, 0x0000, 0x0000 }, /* R10996 */ + { 0x0000, 0x0000, 0x0000 }, /* R10997 */ + { 0x0000, 0x0000, 0x0000 }, /* R10998 */ + { 0x0000, 0x0000, 0x0000 }, /* R10999 */ + { 0x0000, 0x0000, 0x0000 }, /* R11000 */ + { 0x0000, 0x0000, 0x0000 }, /* R11001 */ + { 0x0000, 0x0000, 0x0000 }, /* R11002 */ + { 0x0000, 0x0000, 0x0000 }, /* R11003 */ + { 0x0000, 0x0000, 0x0000 }, /* R11004 */ + { 0x0000, 0x0000, 0x0000 }, /* R11005 */ + { 0x0000, 0x0000, 0x0000 }, /* R11006 */ + { 0x0000, 0x0000, 0x0000 }, /* R11007 */ + { 0x0000, 0x0000, 0x0000 }, /* R11008 */ + { 0x0000, 0x0000, 0x0000 }, /* R11009 */ + { 0x0000, 0x0000, 0x0000 }, /* R11010 */ + { 0x0000, 0x0000, 0x0000 }, /* R11011 */ + { 0x0000, 0x0000, 0x0000 }, /* R11012 */ + { 0x0000, 0x0000, 0x0000 }, /* R11013 */ + { 0x0000, 0x0000, 0x0000 }, /* R11014 */ + { 0x0000, 0x0000, 0x0000 }, /* R11015 */ + { 0x0000, 0x0000, 0x0000 }, /* R11016 */ + { 0x0000, 0x0000, 0x0000 }, /* R11017 */ + { 0x0000, 0x0000, 0x0000 }, /* R11018 */ + { 0x0000, 0x0000, 0x0000 }, /* R11019 */ + { 0x0000, 0x0000, 0x0000 }, /* R11020 */ + { 0x0000, 0x0000, 0x0000 }, /* R11021 */ + { 0x0000, 0x0000, 0x0000 }, /* R11022 */ + { 0x0000, 0x0000, 0x0000 }, /* R11023 */ + { 0x0000, 0x0000, 0x0000 }, /* R11024 */ + { 0x0000, 0x0000, 0x0000 }, /* R11025 */ + { 0x0000, 0x0000, 0x0000 }, /* R11026 */ + { 0x0000, 0x0000, 0x0000 }, /* R11027 */ + { 0x0000, 0x0000, 0x0000 }, /* R11028 */ + { 0x0000, 0x0000, 0x0000 }, /* R11029 */ + { 0x0000, 0x0000, 0x0000 }, /* R11030 */ + { 0x0000, 0x0000, 0x0000 }, /* R11031 */ + { 0x0000, 0x0000, 0x0000 }, /* R11032 */ + { 0x0000, 0x0000, 0x0000 }, /* R11033 */ + { 0x0000, 0x0000, 0x0000 }, /* R11034 */ + { 0x0000, 0x0000, 0x0000 }, /* R11035 */ + { 0x0000, 0x0000, 0x0000 }, /* R11036 */ + { 0x0000, 0x0000, 0x0000 }, /* R11037 */ + { 0x0000, 0x0000, 0x0000 }, /* R11038 */ + { 0x0000, 0x0000, 0x0000 }, /* R11039 */ + { 0x0000, 0x0000, 0x0000 }, /* R11040 */ + { 0x0000, 0x0000, 0x0000 }, /* R11041 */ + { 0x0000, 0x0000, 0x0000 }, /* R11042 */ + { 0x0000, 0x0000, 0x0000 }, /* R11043 */ + { 0x0000, 0x0000, 0x0000 }, /* R11044 */ + { 0x0000, 0x0000, 0x0000 }, /* R11045 */ + { 0x0000, 0x0000, 0x0000 }, /* R11046 */ + { 0x0000, 0x0000, 0x0000 }, /* R11047 */ + { 0x0000, 0x0000, 0x0000 }, /* R11048 */ + { 0x0000, 0x0000, 0x0000 }, /* R11049 */ + { 0x0000, 0x0000, 0x0000 }, /* R11050 */ + { 0x0000, 0x0000, 0x0000 }, /* R11051 */ + { 0x0000, 0x0000, 0x0000 }, /* R11052 */ + { 0x0000, 0x0000, 0x0000 }, /* R11053 */ + { 0x0000, 0x0000, 0x0000 }, /* R11054 */ + { 0x0000, 0x0000, 0x0000 }, /* R11055 */ + { 0x0000, 0x0000, 0x0000 }, /* R11056 */ + { 0x0000, 0x0000, 0x0000 }, /* R11057 */ + { 0x0000, 0x0000, 0x0000 }, /* R11058 */ + { 0x0000, 0x0000, 0x0000 }, /* R11059 */ + { 0x0000, 0x0000, 0x0000 }, /* R11060 */ + { 0x0000, 0x0000, 0x0000 }, /* R11061 */ + { 0x0000, 0x0000, 0x0000 }, /* R11062 */ + { 0x0000, 0x0000, 0x0000 }, /* R11063 */ + { 0x0000, 0x0000, 0x0000 }, /* R11064 */ + { 0x0000, 0x0000, 0x0000 }, /* R11065 */ + { 0x0000, 0x0000, 0x0000 }, /* R11066 */ + { 0x0000, 0x0000, 0x0000 }, /* R11067 */ + { 0x0000, 0x0000, 0x0000 }, /* R11068 */ + { 0x0000, 0x0000, 0x0000 }, /* R11069 */ + { 0x0000, 0x0000, 0x0000 }, /* R11070 */ + { 0x0000, 0x0000, 0x0000 }, /* R11071 */ + { 0x0000, 0x0000, 0x0000 }, /* R11072 */ + { 0x0000, 0x0000, 0x0000 }, /* R11073 */ + { 0x0000, 0x0000, 0x0000 }, /* R11074 */ + { 0x0000, 0x0000, 0x0000 }, /* R11075 */ + { 0x0000, 0x0000, 0x0000 }, /* R11076 */ + { 0x0000, 0x0000, 0x0000 }, /* R11077 */ + { 0x0000, 0x0000, 0x0000 }, /* R11078 */ + { 0x0000, 0x0000, 0x0000 }, /* R11079 */ + { 0x0000, 0x0000, 0x0000 }, /* R11080 */ + { 0x0000, 0x0000, 0x0000 }, /* R11081 */ + { 0x0000, 0x0000, 0x0000 }, /* R11082 */ + { 0x0000, 0x0000, 0x0000 }, /* R11083 */ + { 0x0000, 0x0000, 0x0000 }, /* R11084 */ + { 0x0000, 0x0000, 0x0000 }, /* R11085 */ + { 0x0000, 0x0000, 0x0000 }, /* R11086 */ + { 0x0000, 0x0000, 0x0000 }, /* R11087 */ + { 0x0000, 0x0000, 0x0000 }, /* R11088 */ + { 0x0000, 0x0000, 0x0000 }, /* R11089 */ + { 0x0000, 0x0000, 0x0000 }, /* R11090 */ + { 0x0000, 0x0000, 0x0000 }, /* R11091 */ + { 0x0000, 0x0000, 0x0000 }, /* R11092 */ + { 0x0000, 0x0000, 0x0000 }, /* R11093 */ + { 0x0000, 0x0000, 0x0000 }, /* R11094 */ + { 0x0000, 0x0000, 0x0000 }, /* R11095 */ + { 0x0000, 0x0000, 0x0000 }, /* R11096 */ + { 0x0000, 0x0000, 0x0000 }, /* R11097 */ + { 0x0000, 0x0000, 0x0000 }, /* R11098 */ + { 0x0000, 0x0000, 0x0000 }, /* R11099 */ + { 0x0000, 0x0000, 0x0000 }, /* R11100 */ + { 0x0000, 0x0000, 0x0000 }, /* R11101 */ + { 0x0000, 0x0000, 0x0000 }, /* R11102 */ + { 0x0000, 0x0000, 0x0000 }, /* R11103 */ + { 0x0000, 0x0000, 0x0000 }, /* R11104 */ + { 0x0000, 0x0000, 0x0000 }, /* R11105 */ + { 0x0000, 0x0000, 0x0000 }, /* R11106 */ + { 0x0000, 0x0000, 0x0000 }, /* R11107 */ + { 0x0000, 0x0000, 0x0000 }, /* R11108 */ + { 0x0000, 0x0000, 0x0000 }, /* R11109 */ + { 0x0000, 0x0000, 0x0000 }, /* R11110 */ + { 0x0000, 0x0000, 0x0000 }, /* R11111 */ + { 0x0000, 0x0000, 0x0000 }, /* R11112 */ + { 0x0000, 0x0000, 0x0000 }, /* R11113 */ + { 0x0000, 0x0000, 0x0000 }, /* R11114 */ + { 0x0000, 0x0000, 0x0000 }, /* R11115 */ + { 0x0000, 0x0000, 0x0000 }, /* R11116 */ + { 0x0000, 0x0000, 0x0000 }, /* R11117 */ + { 0x0000, 0x0000, 0x0000 }, /* R11118 */ + { 0x0000, 0x0000, 0x0000 }, /* R11119 */ + { 0x0000, 0x0000, 0x0000 }, /* R11120 */ + { 0x0000, 0x0000, 0x0000 }, /* R11121 */ + { 0x0000, 0x0000, 0x0000 }, /* R11122 */ + { 0x0000, 0x0000, 0x0000 }, /* R11123 */ + { 0x0000, 0x0000, 0x0000 }, /* R11124 */ + { 0x0000, 0x0000, 0x0000 }, /* R11125 */ + { 0x0000, 0x0000, 0x0000 }, /* R11126 */ + { 0x0000, 0x0000, 0x0000 }, /* R11127 */ + { 0x0000, 0x0000, 0x0000 }, /* R11128 */ + { 0x0000, 0x0000, 0x0000 }, /* R11129 */ + { 0x0000, 0x0000, 0x0000 }, /* R11130 */ + { 0x0000, 0x0000, 0x0000 }, /* R11131 */ + { 0x0000, 0x0000, 0x0000 }, /* R11132 */ + { 0x0000, 0x0000, 0x0000 }, /* R11133 */ + { 0x0000, 0x0000, 0x0000 }, /* R11134 */ + { 0x0000, 0x0000, 0x0000 }, /* R11135 */ + { 0x0000, 0x0000, 0x0000 }, /* R11136 */ + { 0x0000, 0x0000, 0x0000 }, /* R11137 */ + { 0x0000, 0x0000, 0x0000 }, /* R11138 */ + { 0x0000, 0x0000, 0x0000 }, /* R11139 */ + { 0x0000, 0x0000, 0x0000 }, /* R11140 */ + { 0x0000, 0x0000, 0x0000 }, /* R11141 */ + { 0x0000, 0x0000, 0x0000 }, /* R11142 */ + { 0x0000, 0x0000, 0x0000 }, /* R11143 */ + { 0x0000, 0x0000, 0x0000 }, /* R11144 */ + { 0x0000, 0x0000, 0x0000 }, /* R11145 */ + { 0x0000, 0x0000, 0x0000 }, /* R11146 */ + { 0x0000, 0x0000, 0x0000 }, /* R11147 */ + { 0x0000, 0x0000, 0x0000 }, /* R11148 */ + { 0x0000, 0x0000, 0x0000 }, /* R11149 */ + { 0x0000, 0x0000, 0x0000 }, /* R11150 */ + { 0x0000, 0x0000, 0x0000 }, /* R11151 */ + { 0x0000, 0x0000, 0x0000 }, /* R11152 */ + { 0x0000, 0x0000, 0x0000 }, /* R11153 */ + { 0x0000, 0x0000, 0x0000 }, /* R11154 */ + { 0x0000, 0x0000, 0x0000 }, /* R11155 */ + { 0x0000, 0x0000, 0x0000 }, /* R11156 */ + { 0x0000, 0x0000, 0x0000 }, /* R11157 */ + { 0x0000, 0x0000, 0x0000 }, /* R11158 */ + { 0x0000, 0x0000, 0x0000 }, /* R11159 */ + { 0x0000, 0x0000, 0x0000 }, /* R11160 */ + { 0x0000, 0x0000, 0x0000 }, /* R11161 */ + { 0x0000, 0x0000, 0x0000 }, /* R11162 */ + { 0x0000, 0x0000, 0x0000 }, /* R11163 */ + { 0x0000, 0x0000, 0x0000 }, /* R11164 */ + { 0x0000, 0x0000, 0x0000 }, /* R11165 */ + { 0x0000, 0x0000, 0x0000 }, /* R11166 */ + { 0x0000, 0x0000, 0x0000 }, /* R11167 */ + { 0x0000, 0x0000, 0x0000 }, /* R11168 */ + { 0x0000, 0x0000, 0x0000 }, /* R11169 */ + { 0x0000, 0x0000, 0x0000 }, /* R11170 */ + { 0x0000, 0x0000, 0x0000 }, /* R11171 */ + { 0x0000, 0x0000, 0x0000 }, /* R11172 */ + { 0x0000, 0x0000, 0x0000 }, /* R11173 */ + { 0x0000, 0x0000, 0x0000 }, /* R11174 */ + { 0x0000, 0x0000, 0x0000 }, /* R11175 */ + { 0x0000, 0x0000, 0x0000 }, /* R11176 */ + { 0x0000, 0x0000, 0x0000 }, /* R11177 */ + { 0x0000, 0x0000, 0x0000 }, /* R11178 */ + { 0x0000, 0x0000, 0x0000 }, /* R11179 */ + { 0x0000, 0x0000, 0x0000 }, /* R11180 */ + { 0x0000, 0x0000, 0x0000 }, /* R11181 */ + { 0x0000, 0x0000, 0x0000 }, /* R11182 */ + { 0x0000, 0x0000, 0x0000 }, /* R11183 */ + { 0x0000, 0x0000, 0x0000 }, /* R11184 */ + { 0x0000, 0x0000, 0x0000 }, /* R11185 */ + { 0x0000, 0x0000, 0x0000 }, /* R11186 */ + { 0x0000, 0x0000, 0x0000 }, /* R11187 */ + { 0x0000, 0x0000, 0x0000 }, /* R11188 */ + { 0x0000, 0x0000, 0x0000 }, /* R11189 */ + { 0x0000, 0x0000, 0x0000 }, /* R11190 */ + { 0x0000, 0x0000, 0x0000 }, /* R11191 */ + { 0x0000, 0x0000, 0x0000 }, /* R11192 */ + { 0x0000, 0x0000, 0x0000 }, /* R11193 */ + { 0x0000, 0x0000, 0x0000 }, /* R11194 */ + { 0x0000, 0x0000, 0x0000 }, /* R11195 */ + { 0x0000, 0x0000, 0x0000 }, /* R11196 */ + { 0x0000, 0x0000, 0x0000 }, /* R11197 */ + { 0x0000, 0x0000, 0x0000 }, /* R11198 */ + { 0x0000, 0x0000, 0x0000 }, /* R11199 */ + { 0x0000, 0x0000, 0x0000 }, /* R11200 */ + { 0x0000, 0x0000, 0x0000 }, /* R11201 */ + { 0x0000, 0x0000, 0x0000 }, /* R11202 */ + { 0x0000, 0x0000, 0x0000 }, /* R11203 */ + { 0x0000, 0x0000, 0x0000 }, /* R11204 */ + { 0x0000, 0x0000, 0x0000 }, /* R11205 */ + { 0x0000, 0x0000, 0x0000 }, /* R11206 */ + { 0x0000, 0x0000, 0x0000 }, /* R11207 */ + { 0x0000, 0x0000, 0x0000 }, /* R11208 */ + { 0x0000, 0x0000, 0x0000 }, /* R11209 */ + { 0x0000, 0x0000, 0x0000 }, /* R11210 */ + { 0x0000, 0x0000, 0x0000 }, /* R11211 */ + { 0x0000, 0x0000, 0x0000 }, /* R11212 */ + { 0x0000, 0x0000, 0x0000 }, /* R11213 */ + { 0x0000, 0x0000, 0x0000 }, /* R11214 */ + { 0x0000, 0x0000, 0x0000 }, /* R11215 */ + { 0x0000, 0x0000, 0x0000 }, /* R11216 */ + { 0x0000, 0x0000, 0x0000 }, /* R11217 */ + { 0x0000, 0x0000, 0x0000 }, /* R11218 */ + { 0x0000, 0x0000, 0x0000 }, /* R11219 */ + { 0x0000, 0x0000, 0x0000 }, /* R11220 */ + { 0x0000, 0x0000, 0x0000 }, /* R11221 */ + { 0x0000, 0x0000, 0x0000 }, /* R11222 */ + { 0x0000, 0x0000, 0x0000 }, /* R11223 */ + { 0x0000, 0x0000, 0x0000 }, /* R11224 */ + { 0x0000, 0x0000, 0x0000 }, /* R11225 */ + { 0x0000, 0x0000, 0x0000 }, /* R11226 */ + { 0x0000, 0x0000, 0x0000 }, /* R11227 */ + { 0x0000, 0x0000, 0x0000 }, /* R11228 */ + { 0x0000, 0x0000, 0x0000 }, /* R11229 */ + { 0x0000, 0x0000, 0x0000 }, /* R11230 */ + { 0x0000, 0x0000, 0x0000 }, /* R11231 */ + { 0x0000, 0x0000, 0x0000 }, /* R11232 */ + { 0x0000, 0x0000, 0x0000 }, /* R11233 */ + { 0x0000, 0x0000, 0x0000 }, /* R11234 */ + { 0x0000, 0x0000, 0x0000 }, /* R11235 */ + { 0x0000, 0x0000, 0x0000 }, /* R11236 */ + { 0x0000, 0x0000, 0x0000 }, /* R11237 */ + { 0x0000, 0x0000, 0x0000 }, /* R11238 */ + { 0x0000, 0x0000, 0x0000 }, /* R11239 */ + { 0x0000, 0x0000, 0x0000 }, /* R11240 */ + { 0x0000, 0x0000, 0x0000 }, /* R11241 */ + { 0x0000, 0x0000, 0x0000 }, /* R11242 */ + { 0x0000, 0x0000, 0x0000 }, /* R11243 */ + { 0x0000, 0x0000, 0x0000 }, /* R11244 */ + { 0x0000, 0x0000, 0x0000 }, /* R11245 */ + { 0x0000, 0x0000, 0x0000 }, /* R11246 */ + { 0x0000, 0x0000, 0x0000 }, /* R11247 */ + { 0x0000, 0x0000, 0x0000 }, /* R11248 */ + { 0x0000, 0x0000, 0x0000 }, /* R11249 */ + { 0x0000, 0x0000, 0x0000 }, /* R11250 */ + { 0x0000, 0x0000, 0x0000 }, /* R11251 */ + { 0x0000, 0x0000, 0x0000 }, /* R11252 */ + { 0x0000, 0x0000, 0x0000 }, /* R11253 */ + { 0x0000, 0x0000, 0x0000 }, /* R11254 */ + { 0x0000, 0x0000, 0x0000 }, /* R11255 */ + { 0x0000, 0x0000, 0x0000 }, /* R11256 */ + { 0x0000, 0x0000, 0x0000 }, /* R11257 */ + { 0x0000, 0x0000, 0x0000 }, /* R11258 */ + { 0x0000, 0x0000, 0x0000 }, /* R11259 */ + { 0x0000, 0x0000, 0x0000 }, /* R11260 */ + { 0x0000, 0x0000, 0x0000 }, /* R11261 */ + { 0x0000, 0x0000, 0x0000 }, /* R11262 */ + { 0x0000, 0x0000, 0x0000 }, /* R11263 */ + { 0x0000, 0x0000, 0x0000 }, /* R11264 */ + { 0x0000, 0x0000, 0x0000 }, /* R11265 */ + { 0x0000, 0x0000, 0x0000 }, /* R11266 */ + { 0x0000, 0x0000, 0x0000 }, /* R11267 */ + { 0x0000, 0x0000, 0x0000 }, /* R11268 */ + { 0x0000, 0x0000, 0x0000 }, /* R11269 */ + { 0x0000, 0x0000, 0x0000 }, /* R11270 */ + { 0x0000, 0x0000, 0x0000 }, /* R11271 */ + { 0x0000, 0x0000, 0x0000 }, /* R11272 */ + { 0x0000, 0x0000, 0x0000 }, /* R11273 */ + { 0x0000, 0x0000, 0x0000 }, /* R11274 */ + { 0x0000, 0x0000, 0x0000 }, /* R11275 */ + { 0x0000, 0x0000, 0x0000 }, /* R11276 */ + { 0x0000, 0x0000, 0x0000 }, /* R11277 */ + { 0x0000, 0x0000, 0x0000 }, /* R11278 */ + { 0x0000, 0x0000, 0x0000 }, /* R11279 */ + { 0x0000, 0x0000, 0x0000 }, /* R11280 */ + { 0x0000, 0x0000, 0x0000 }, /* R11281 */ + { 0x0000, 0x0000, 0x0000 }, /* R11282 */ + { 0x0000, 0x0000, 0x0000 }, /* R11283 */ + { 0x0000, 0x0000, 0x0000 }, /* R11284 */ + { 0x0000, 0x0000, 0x0000 }, /* R11285 */ + { 0x0000, 0x0000, 0x0000 }, /* R11286 */ + { 0x0000, 0x0000, 0x0000 }, /* R11287 */ + { 0x0000, 0x0000, 0x0000 }, /* R11288 */ + { 0x0000, 0x0000, 0x0000 }, /* R11289 */ + { 0x0000, 0x0000, 0x0000 }, /* R11290 */ + { 0x0000, 0x0000, 0x0000 }, /* R11291 */ + { 0x0000, 0x0000, 0x0000 }, /* R11292 */ + { 0x0000, 0x0000, 0x0000 }, /* R11293 */ + { 0x0000, 0x0000, 0x0000 }, /* R11294 */ + { 0x0000, 0x0000, 0x0000 }, /* R11295 */ + { 0x0000, 0x0000, 0x0000 }, /* R11296 */ + { 0x0000, 0x0000, 0x0000 }, /* R11297 */ + { 0x0000, 0x0000, 0x0000 }, /* R11298 */ + { 0x0000, 0x0000, 0x0000 }, /* R11299 */ + { 0x0000, 0x0000, 0x0000 }, /* R11300 */ + { 0x0000, 0x0000, 0x0000 }, /* R11301 */ + { 0x0000, 0x0000, 0x0000 }, /* R11302 */ + { 0x0000, 0x0000, 0x0000 }, /* R11303 */ + { 0x0000, 0x0000, 0x0000 }, /* R11304 */ + { 0x0000, 0x0000, 0x0000 }, /* R11305 */ + { 0x0000, 0x0000, 0x0000 }, /* R11306 */ + { 0x0000, 0x0000, 0x0000 }, /* R11307 */ + { 0x0000, 0x0000, 0x0000 }, /* R11308 */ + { 0x0000, 0x0000, 0x0000 }, /* R11309 */ + { 0x0000, 0x0000, 0x0000 }, /* R11310 */ + { 0x0000, 0x0000, 0x0000 }, /* R11311 */ + { 0x0000, 0x0000, 0x0000 }, /* R11312 */ + { 0x0000, 0x0000, 0x0000 }, /* R11313 */ + { 0x0000, 0x0000, 0x0000 }, /* R11314 */ + { 0x0000, 0x0000, 0x0000 }, /* R11315 */ + { 0x0000, 0x0000, 0x0000 }, /* R11316 */ + { 0x0000, 0x0000, 0x0000 }, /* R11317 */ + { 0x0000, 0x0000, 0x0000 }, /* R11318 */ + { 0x0000, 0x0000, 0x0000 }, /* R11319 */ + { 0x0000, 0x0000, 0x0000 }, /* R11320 */ + { 0x0000, 0x0000, 0x0000 }, /* R11321 */ + { 0x0000, 0x0000, 0x0000 }, /* R11322 */ + { 0x0000, 0x0000, 0x0000 }, /* R11323 */ + { 0x0000, 0x0000, 0x0000 }, /* R11324 */ + { 0x0000, 0x0000, 0x0000 }, /* R11325 */ + { 0x0000, 0x0000, 0x0000 }, /* R11326 */ + { 0x0000, 0x0000, 0x0000 }, /* R11327 */ + { 0x0000, 0x0000, 0x0000 }, /* R11328 */ + { 0x0000, 0x0000, 0x0000 }, /* R11329 */ + { 0x0000, 0x0000, 0x0000 }, /* R11330 */ + { 0x0000, 0x0000, 0x0000 }, /* R11331 */ + { 0x0000, 0x0000, 0x0000 }, /* R11332 */ + { 0x0000, 0x0000, 0x0000 }, /* R11333 */ + { 0x0000, 0x0000, 0x0000 }, /* R11334 */ + { 0x0000, 0x0000, 0x0000 }, /* R11335 */ + { 0x0000, 0x0000, 0x0000 }, /* R11336 */ + { 0x0000, 0x0000, 0x0000 }, /* R11337 */ + { 0x0000, 0x0000, 0x0000 }, /* R11338 */ + { 0x0000, 0x0000, 0x0000 }, /* R11339 */ + { 0x0000, 0x0000, 0x0000 }, /* R11340 */ + { 0x0000, 0x0000, 0x0000 }, /* R11341 */ + { 0x0000, 0x0000, 0x0000 }, /* R11342 */ + { 0x0000, 0x0000, 0x0000 }, /* R11343 */ + { 0x0000, 0x0000, 0x0000 }, /* R11344 */ + { 0x0000, 0x0000, 0x0000 }, /* R11345 */ + { 0x0000, 0x0000, 0x0000 }, /* R11346 */ + { 0x0000, 0x0000, 0x0000 }, /* R11347 */ + { 0x0000, 0x0000, 0x0000 }, /* R11348 */ + { 0x0000, 0x0000, 0x0000 }, /* R11349 */ + { 0x0000, 0x0000, 0x0000 }, /* R11350 */ + { 0x0000, 0x0000, 0x0000 }, /* R11351 */ + { 0x0000, 0x0000, 0x0000 }, /* R11352 */ + { 0x0000, 0x0000, 0x0000 }, /* R11353 */ + { 0x0000, 0x0000, 0x0000 }, /* R11354 */ + { 0x0000, 0x0000, 0x0000 }, /* R11355 */ + { 0x0000, 0x0000, 0x0000 }, /* R11356 */ + { 0x0000, 0x0000, 0x0000 }, /* R11357 */ + { 0x0000, 0x0000, 0x0000 }, /* R11358 */ + { 0x0000, 0x0000, 0x0000 }, /* R11359 */ + { 0x0000, 0x0000, 0x0000 }, /* R11360 */ + { 0x0000, 0x0000, 0x0000 }, /* R11361 */ + { 0x0000, 0x0000, 0x0000 }, /* R11362 */ + { 0x0000, 0x0000, 0x0000 }, /* R11363 */ + { 0x0000, 0x0000, 0x0000 }, /* R11364 */ + { 0x0000, 0x0000, 0x0000 }, /* R11365 */ + { 0x0000, 0x0000, 0x0000 }, /* R11366 */ + { 0x0000, 0x0000, 0x0000 }, /* R11367 */ + { 0x0000, 0x0000, 0x0000 }, /* R11368 */ + { 0x0000, 0x0000, 0x0000 }, /* R11369 */ + { 0x0000, 0x0000, 0x0000 }, /* R11370 */ + { 0x0000, 0x0000, 0x0000 }, /* R11371 */ + { 0x0000, 0x0000, 0x0000 }, /* R11372 */ + { 0x0000, 0x0000, 0x0000 }, /* R11373 */ + { 0x0000, 0x0000, 0x0000 }, /* R11374 */ + { 0x0000, 0x0000, 0x0000 }, /* R11375 */ + { 0x0000, 0x0000, 0x0000 }, /* R11376 */ + { 0x0000, 0x0000, 0x0000 }, /* R11377 */ + { 0x0000, 0x0000, 0x0000 }, /* R11378 */ + { 0x0000, 0x0000, 0x0000 }, /* R11379 */ + { 0x0000, 0x0000, 0x0000 }, /* R11380 */ + { 0x0000, 0x0000, 0x0000 }, /* R11381 */ + { 0x0000, 0x0000, 0x0000 }, /* R11382 */ + { 0x0000, 0x0000, 0x0000 }, /* R11383 */ + { 0x0000, 0x0000, 0x0000 }, /* R11384 */ + { 0x0000, 0x0000, 0x0000 }, /* R11385 */ + { 0x0000, 0x0000, 0x0000 }, /* R11386 */ + { 0x0000, 0x0000, 0x0000 }, /* R11387 */ + { 0x0000, 0x0000, 0x0000 }, /* R11388 */ + { 0x0000, 0x0000, 0x0000 }, /* R11389 */ + { 0x0000, 0x0000, 0x0000 }, /* R11390 */ + { 0x0000, 0x0000, 0x0000 }, /* R11391 */ + { 0x0000, 0x0000, 0x0000 }, /* R11392 */ + { 0x0000, 0x0000, 0x0000 }, /* R11393 */ + { 0x0000, 0x0000, 0x0000 }, /* R11394 */ + { 0x0000, 0x0000, 0x0000 }, /* R11395 */ + { 0x0000, 0x0000, 0x0000 }, /* R11396 */ + { 0x0000, 0x0000, 0x0000 }, /* R11397 */ + { 0x0000, 0x0000, 0x0000 }, /* R11398 */ + { 0x0000, 0x0000, 0x0000 }, /* R11399 */ + { 0x0000, 0x0000, 0x0000 }, /* R11400 */ + { 0x0000, 0x0000, 0x0000 }, /* R11401 */ + { 0x0000, 0x0000, 0x0000 }, /* R11402 */ + { 0x0000, 0x0000, 0x0000 }, /* R11403 */ + { 0x0000, 0x0000, 0x0000 }, /* R11404 */ + { 0x0000, 0x0000, 0x0000 }, /* R11405 */ + { 0x0000, 0x0000, 0x0000 }, /* R11406 */ + { 0x0000, 0x0000, 0x0000 }, /* R11407 */ + { 0x0000, 0x0000, 0x0000 }, /* R11408 */ + { 0x0000, 0x0000, 0x0000 }, /* R11409 */ + { 0x0000, 0x0000, 0x0000 }, /* R11410 */ + { 0x0000, 0x0000, 0x0000 }, /* R11411 */ + { 0x0000, 0x0000, 0x0000 }, /* R11412 */ + { 0x0000, 0x0000, 0x0000 }, /* R11413 */ + { 0x0000, 0x0000, 0x0000 }, /* R11414 */ + { 0x0000, 0x0000, 0x0000 }, /* R11415 */ + { 0x0000, 0x0000, 0x0000 }, /* R11416 */ + { 0x0000, 0x0000, 0x0000 }, /* R11417 */ + { 0x0000, 0x0000, 0x0000 }, /* R11418 */ + { 0x0000, 0x0000, 0x0000 }, /* R11419 */ + { 0x0000, 0x0000, 0x0000 }, /* R11420 */ + { 0x0000, 0x0000, 0x0000 }, /* R11421 */ + { 0x0000, 0x0000, 0x0000 }, /* R11422 */ + { 0x0000, 0x0000, 0x0000 }, /* R11423 */ + { 0x0000, 0x0000, 0x0000 }, /* R11424 */ + { 0x0000, 0x0000, 0x0000 }, /* R11425 */ + { 0x0000, 0x0000, 0x0000 }, /* R11426 */ + { 0x0000, 0x0000, 0x0000 }, /* R11427 */ + { 0x0000, 0x0000, 0x0000 }, /* R11428 */ + { 0x0000, 0x0000, 0x0000 }, /* R11429 */ + { 0x0000, 0x0000, 0x0000 }, /* R11430 */ + { 0x0000, 0x0000, 0x0000 }, /* R11431 */ + { 0x0000, 0x0000, 0x0000 }, /* R11432 */ + { 0x0000, 0x0000, 0x0000 }, /* R11433 */ + { 0x0000, 0x0000, 0x0000 }, /* R11434 */ + { 0x0000, 0x0000, 0x0000 }, /* R11435 */ + { 0x0000, 0x0000, 0x0000 }, /* R11436 */ + { 0x0000, 0x0000, 0x0000 }, /* R11437 */ + { 0x0000, 0x0000, 0x0000 }, /* R11438 */ + { 0x0000, 0x0000, 0x0000 }, /* R11439 */ + { 0x0000, 0x0000, 0x0000 }, /* R11440 */ + { 0x0000, 0x0000, 0x0000 }, /* R11441 */ + { 0x0000, 0x0000, 0x0000 }, /* R11442 */ + { 0x0000, 0x0000, 0x0000 }, /* R11443 */ + { 0x0000, 0x0000, 0x0000 }, /* R11444 */ + { 0x0000, 0x0000, 0x0000 }, /* R11445 */ + { 0x0000, 0x0000, 0x0000 }, /* R11446 */ + { 0x0000, 0x0000, 0x0000 }, /* R11447 */ + { 0x0000, 0x0000, 0x0000 }, /* R11448 */ + { 0x0000, 0x0000, 0x0000 }, /* R11449 */ + { 0x0000, 0x0000, 0x0000 }, /* R11450 */ + { 0x0000, 0x0000, 0x0000 }, /* R11451 */ + { 0x0000, 0x0000, 0x0000 }, /* R11452 */ + { 0x0000, 0x0000, 0x0000 }, /* R11453 */ + { 0x0000, 0x0000, 0x0000 }, /* R11454 */ + { 0x0000, 0x0000, 0x0000 }, /* R11455 */ + { 0x0000, 0x0000, 0x0000 }, /* R11456 */ + { 0x0000, 0x0000, 0x0000 }, /* R11457 */ + { 0x0000, 0x0000, 0x0000 }, /* R11458 */ + { 0x0000, 0x0000, 0x0000 }, /* R11459 */ + { 0x0000, 0x0000, 0x0000 }, /* R11460 */ + { 0x0000, 0x0000, 0x0000 }, /* R11461 */ + { 0x0000, 0x0000, 0x0000 }, /* R11462 */ + { 0x0000, 0x0000, 0x0000 }, /* R11463 */ + { 0x0000, 0x0000, 0x0000 }, /* R11464 */ + { 0x0000, 0x0000, 0x0000 }, /* R11465 */ + { 0x0000, 0x0000, 0x0000 }, /* R11466 */ + { 0x0000, 0x0000, 0x0000 }, /* R11467 */ + { 0x0000, 0x0000, 0x0000 }, /* R11468 */ + { 0x0000, 0x0000, 0x0000 }, /* R11469 */ + { 0x0000, 0x0000, 0x0000 }, /* R11470 */ + { 0x0000, 0x0000, 0x0000 }, /* R11471 */ + { 0x0000, 0x0000, 0x0000 }, /* R11472 */ + { 0x0000, 0x0000, 0x0000 }, /* R11473 */ + { 0x0000, 0x0000, 0x0000 }, /* R11474 */ + { 0x0000, 0x0000, 0x0000 }, /* R11475 */ + { 0x0000, 0x0000, 0x0000 }, /* R11476 */ + { 0x0000, 0x0000, 0x0000 }, /* R11477 */ + { 0x0000, 0x0000, 0x0000 }, /* R11478 */ + { 0x0000, 0x0000, 0x0000 }, /* R11479 */ + { 0x0000, 0x0000, 0x0000 }, /* R11480 */ + { 0x0000, 0x0000, 0x0000 }, /* R11481 */ + { 0x0000, 0x0000, 0x0000 }, /* R11482 */ + { 0x0000, 0x0000, 0x0000 }, /* R11483 */ + { 0x0000, 0x0000, 0x0000 }, /* R11484 */ + { 0x0000, 0x0000, 0x0000 }, /* R11485 */ + { 0x0000, 0x0000, 0x0000 }, /* R11486 */ + { 0x0000, 0x0000, 0x0000 }, /* R11487 */ + { 0x0000, 0x0000, 0x0000 }, /* R11488 */ + { 0x0000, 0x0000, 0x0000 }, /* R11489 */ + { 0x0000, 0x0000, 0x0000 }, /* R11490 */ + { 0x0000, 0x0000, 0x0000 }, /* R11491 */ + { 0x0000, 0x0000, 0x0000 }, /* R11492 */ + { 0x0000, 0x0000, 0x0000 }, /* R11493 */ + { 0x0000, 0x0000, 0x0000 }, /* R11494 */ + { 0x0000, 0x0000, 0x0000 }, /* R11495 */ + { 0x0000, 0x0000, 0x0000 }, /* R11496 */ + { 0x0000, 0x0000, 0x0000 }, /* R11497 */ + { 0x0000, 0x0000, 0x0000 }, /* R11498 */ + { 0x0000, 0x0000, 0x0000 }, /* R11499 */ + { 0x0000, 0x0000, 0x0000 }, /* R11500 */ + { 0x0000, 0x0000, 0x0000 }, /* R11501 */ + { 0x0000, 0x0000, 0x0000 }, /* R11502 */ + { 0x0000, 0x0000, 0x0000 }, /* R11503 */ + { 0x0000, 0x0000, 0x0000 }, /* R11504 */ + { 0x0000, 0x0000, 0x0000 }, /* R11505 */ + { 0x0000, 0x0000, 0x0000 }, /* R11506 */ + { 0x0000, 0x0000, 0x0000 }, /* R11507 */ + { 0x0000, 0x0000, 0x0000 }, /* R11508 */ + { 0x0000, 0x0000, 0x0000 }, /* R11509 */ + { 0x0000, 0x0000, 0x0000 }, /* R11510 */ + { 0x0000, 0x0000, 0x0000 }, /* R11511 */ + { 0x0000, 0x0000, 0x0000 }, /* R11512 */ + { 0x0000, 0x0000, 0x0000 }, /* R11513 */ + { 0x0000, 0x0000, 0x0000 }, /* R11514 */ + { 0x0000, 0x0000, 0x0000 }, /* R11515 */ + { 0x0000, 0x0000, 0x0000 }, /* R11516 */ + { 0x0000, 0x0000, 0x0000 }, /* R11517 */ + { 0x0000, 0x0000, 0x0000 }, /* R11518 */ + { 0x0000, 0x0000, 0x0000 }, /* R11519 */ + { 0x0000, 0x0000, 0x0000 }, /* R11520 */ + { 0x0000, 0x0000, 0x0000 }, /* R11521 */ + { 0x0000, 0x0000, 0x0000 }, /* R11522 */ + { 0x0000, 0x0000, 0x0000 }, /* R11523 */ + { 0x0000, 0x0000, 0x0000 }, /* R11524 */ + { 0x0000, 0x0000, 0x0000 }, /* R11525 */ + { 0x0000, 0x0000, 0x0000 }, /* R11526 */ + { 0x0000, 0x0000, 0x0000 }, /* R11527 */ + { 0x0000, 0x0000, 0x0000 }, /* R11528 */ + { 0x0000, 0x0000, 0x0000 }, /* R11529 */ + { 0x0000, 0x0000, 0x0000 }, /* R11530 */ + { 0x0000, 0x0000, 0x0000 }, /* R11531 */ + { 0x0000, 0x0000, 0x0000 }, /* R11532 */ + { 0x0000, 0x0000, 0x0000 }, /* R11533 */ + { 0x0000, 0x0000, 0x0000 }, /* R11534 */ + { 0x0000, 0x0000, 0x0000 }, /* R11535 */ + { 0x0000, 0x0000, 0x0000 }, /* R11536 */ + { 0x0000, 0x0000, 0x0000 }, /* R11537 */ + { 0x0000, 0x0000, 0x0000 }, /* R11538 */ + { 0x0000, 0x0000, 0x0000 }, /* R11539 */ + { 0x0000, 0x0000, 0x0000 }, /* R11540 */ + { 0x0000, 0x0000, 0x0000 }, /* R11541 */ + { 0x0000, 0x0000, 0x0000 }, /* R11542 */ + { 0x0000, 0x0000, 0x0000 }, /* R11543 */ + { 0x0000, 0x0000, 0x0000 }, /* R11544 */ + { 0x0000, 0x0000, 0x0000 }, /* R11545 */ + { 0x0000, 0x0000, 0x0000 }, /* R11546 */ + { 0x0000, 0x0000, 0x0000 }, /* R11547 */ + { 0x0000, 0x0000, 0x0000 }, /* R11548 */ + { 0x0000, 0x0000, 0x0000 }, /* R11549 */ + { 0x0000, 0x0000, 0x0000 }, /* R11550 */ + { 0x0000, 0x0000, 0x0000 }, /* R11551 */ + { 0x0000, 0x0000, 0x0000 }, /* R11552 */ + { 0x0000, 0x0000, 0x0000 }, /* R11553 */ + { 0x0000, 0x0000, 0x0000 }, /* R11554 */ + { 0x0000, 0x0000, 0x0000 }, /* R11555 */ + { 0x0000, 0x0000, 0x0000 }, /* R11556 */ + { 0x0000, 0x0000, 0x0000 }, /* R11557 */ + { 0x0000, 0x0000, 0x0000 }, /* R11558 */ + { 0x0000, 0x0000, 0x0000 }, /* R11559 */ + { 0x0000, 0x0000, 0x0000 }, /* R11560 */ + { 0x0000, 0x0000, 0x0000 }, /* R11561 */ + { 0x0000, 0x0000, 0x0000 }, /* R11562 */ + { 0x0000, 0x0000, 0x0000 }, /* R11563 */ + { 0x0000, 0x0000, 0x0000 }, /* R11564 */ + { 0x0000, 0x0000, 0x0000 }, /* R11565 */ + { 0x0000, 0x0000, 0x0000 }, /* R11566 */ + { 0x0000, 0x0000, 0x0000 }, /* R11567 */ + { 0x0000, 0x0000, 0x0000 }, /* R11568 */ + { 0x0000, 0x0000, 0x0000 }, /* R11569 */ + { 0x0000, 0x0000, 0x0000 }, /* R11570 */ + { 0x0000, 0x0000, 0x0000 }, /* R11571 */ + { 0x0000, 0x0000, 0x0000 }, /* R11572 */ + { 0x0000, 0x0000, 0x0000 }, /* R11573 */ + { 0x0000, 0x0000, 0x0000 }, /* R11574 */ + { 0x0000, 0x0000, 0x0000 }, /* R11575 */ + { 0x0000, 0x0000, 0x0000 }, /* R11576 */ + { 0x0000, 0x0000, 0x0000 }, /* R11577 */ + { 0x0000, 0x0000, 0x0000 }, /* R11578 */ + { 0x0000, 0x0000, 0x0000 }, /* R11579 */ + { 0x0000, 0x0000, 0x0000 }, /* R11580 */ + { 0x0000, 0x0000, 0x0000 }, /* R11581 */ + { 0x0000, 0x0000, 0x0000 }, /* R11582 */ + { 0x0000, 0x0000, 0x0000 }, /* R11583 */ + { 0x0000, 0x0000, 0x0000 }, /* R11584 */ + { 0x0000, 0x0000, 0x0000 }, /* R11585 */ + { 0x0000, 0x0000, 0x0000 }, /* R11586 */ + { 0x0000, 0x0000, 0x0000 }, /* R11587 */ + { 0x0000, 0x0000, 0x0000 }, /* R11588 */ + { 0x0000, 0x0000, 0x0000 }, /* R11589 */ + { 0x0000, 0x0000, 0x0000 }, /* R11590 */ + { 0x0000, 0x0000, 0x0000 }, /* R11591 */ + { 0x0000, 0x0000, 0x0000 }, /* R11592 */ + { 0x0000, 0x0000, 0x0000 }, /* R11593 */ + { 0x0000, 0x0000, 0x0000 }, /* R11594 */ + { 0x0000, 0x0000, 0x0000 }, /* R11595 */ + { 0x0000, 0x0000, 0x0000 }, /* R11596 */ + { 0x0000, 0x0000, 0x0000 }, /* R11597 */ + { 0x0000, 0x0000, 0x0000 }, /* R11598 */ + { 0x0000, 0x0000, 0x0000 }, /* R11599 */ + { 0x0000, 0x0000, 0x0000 }, /* R11600 */ + { 0x0000, 0x0000, 0x0000 }, /* R11601 */ + { 0x0000, 0x0000, 0x0000 }, /* R11602 */ + { 0x0000, 0x0000, 0x0000 }, /* R11603 */ + { 0x0000, 0x0000, 0x0000 }, /* R11604 */ + { 0x0000, 0x0000, 0x0000 }, /* R11605 */ + { 0x0000, 0x0000, 0x0000 }, /* R11606 */ + { 0x0000, 0x0000, 0x0000 }, /* R11607 */ + { 0x0000, 0x0000, 0x0000 }, /* R11608 */ + { 0x0000, 0x0000, 0x0000 }, /* R11609 */ + { 0x0000, 0x0000, 0x0000 }, /* R11610 */ + { 0x0000, 0x0000, 0x0000 }, /* R11611 */ + { 0x0000, 0x0000, 0x0000 }, /* R11612 */ + { 0x0000, 0x0000, 0x0000 }, /* R11613 */ + { 0x0000, 0x0000, 0x0000 }, /* R11614 */ + { 0x0000, 0x0000, 0x0000 }, /* R11615 */ + { 0x0000, 0x0000, 0x0000 }, /* R11616 */ + { 0x0000, 0x0000, 0x0000 }, /* R11617 */ + { 0x0000, 0x0000, 0x0000 }, /* R11618 */ + { 0x0000, 0x0000, 0x0000 }, /* R11619 */ + { 0x0000, 0x0000, 0x0000 }, /* R11620 */ + { 0x0000, 0x0000, 0x0000 }, /* R11621 */ + { 0x0000, 0x0000, 0x0000 }, /* R11622 */ + { 0x0000, 0x0000, 0x0000 }, /* R11623 */ + { 0x0000, 0x0000, 0x0000 }, /* R11624 */ + { 0x0000, 0x0000, 0x0000 }, /* R11625 */ + { 0x0000, 0x0000, 0x0000 }, /* R11626 */ + { 0x0000, 0x0000, 0x0000 }, /* R11627 */ + { 0x0000, 0x0000, 0x0000 }, /* R11628 */ + { 0x0000, 0x0000, 0x0000 }, /* R11629 */ + { 0x0000, 0x0000, 0x0000 }, /* R11630 */ + { 0x0000, 0x0000, 0x0000 }, /* R11631 */ + { 0x0000, 0x0000, 0x0000 }, /* R11632 */ + { 0x0000, 0x0000, 0x0000 }, /* R11633 */ + { 0x0000, 0x0000, 0x0000 }, /* R11634 */ + { 0x0000, 0x0000, 0x0000 }, /* R11635 */ + { 0x0000, 0x0000, 0x0000 }, /* R11636 */ + { 0x0000, 0x0000, 0x0000 }, /* R11637 */ + { 0x0000, 0x0000, 0x0000 }, /* R11638 */ + { 0x0000, 0x0000, 0x0000 }, /* R11639 */ + { 0x0000, 0x0000, 0x0000 }, /* R11640 */ + { 0x0000, 0x0000, 0x0000 }, /* R11641 */ + { 0x0000, 0x0000, 0x0000 }, /* R11642 */ + { 0x0000, 0x0000, 0x0000 }, /* R11643 */ + { 0x0000, 0x0000, 0x0000 }, /* R11644 */ + { 0x0000, 0x0000, 0x0000 }, /* R11645 */ + { 0x0000, 0x0000, 0x0000 }, /* R11646 */ + { 0x0000, 0x0000, 0x0000 }, /* R11647 */ + { 0x0000, 0x0000, 0x0000 }, /* R11648 */ + { 0x0000, 0x0000, 0x0000 }, /* R11649 */ + { 0x0000, 0x0000, 0x0000 }, /* R11650 */ + { 0x0000, 0x0000, 0x0000 }, /* R11651 */ + { 0x0000, 0x0000, 0x0000 }, /* R11652 */ + { 0x0000, 0x0000, 0x0000 }, /* R11653 */ + { 0x0000, 0x0000, 0x0000 }, /* R11654 */ + { 0x0000, 0x0000, 0x0000 }, /* R11655 */ + { 0x0000, 0x0000, 0x0000 }, /* R11656 */ + { 0x0000, 0x0000, 0x0000 }, /* R11657 */ + { 0x0000, 0x0000, 0x0000 }, /* R11658 */ + { 0x0000, 0x0000, 0x0000 }, /* R11659 */ + { 0x0000, 0x0000, 0x0000 }, /* R11660 */ + { 0x0000, 0x0000, 0x0000 }, /* R11661 */ + { 0x0000, 0x0000, 0x0000 }, /* R11662 */ + { 0x0000, 0x0000, 0x0000 }, /* R11663 */ + { 0x0000, 0x0000, 0x0000 }, /* R11664 */ + { 0x0000, 0x0000, 0x0000 }, /* R11665 */ + { 0x0000, 0x0000, 0x0000 }, /* R11666 */ + { 0x0000, 0x0000, 0x0000 }, /* R11667 */ + { 0x0000, 0x0000, 0x0000 }, /* R11668 */ + { 0x0000, 0x0000, 0x0000 }, /* R11669 */ + { 0x0000, 0x0000, 0x0000 }, /* R11670 */ + { 0x0000, 0x0000, 0x0000 }, /* R11671 */ + { 0x0000, 0x0000, 0x0000 }, /* R11672 */ + { 0x0000, 0x0000, 0x0000 }, /* R11673 */ + { 0x0000, 0x0000, 0x0000 }, /* R11674 */ + { 0x0000, 0x0000, 0x0000 }, /* R11675 */ + { 0x0000, 0x0000, 0x0000 }, /* R11676 */ + { 0x0000, 0x0000, 0x0000 }, /* R11677 */ + { 0x0000, 0x0000, 0x0000 }, /* R11678 */ + { 0x0000, 0x0000, 0x0000 }, /* R11679 */ + { 0x0000, 0x0000, 0x0000 }, /* R11680 */ + { 0x0000, 0x0000, 0x0000 }, /* R11681 */ + { 0x0000, 0x0000, 0x0000 }, /* R11682 */ + { 0x0000, 0x0000, 0x0000 }, /* R11683 */ + { 0x0000, 0x0000, 0x0000 }, /* R11684 */ + { 0x0000, 0x0000, 0x0000 }, /* R11685 */ + { 0x0000, 0x0000, 0x0000 }, /* R11686 */ + { 0x0000, 0x0000, 0x0000 }, /* R11687 */ + { 0x0000, 0x0000, 0x0000 }, /* R11688 */ + { 0x0000, 0x0000, 0x0000 }, /* R11689 */ + { 0x0000, 0x0000, 0x0000 }, /* R11690 */ + { 0x0000, 0x0000, 0x0000 }, /* R11691 */ + { 0x0000, 0x0000, 0x0000 }, /* R11692 */ + { 0x0000, 0x0000, 0x0000 }, /* R11693 */ + { 0x0000, 0x0000, 0x0000 }, /* R11694 */ + { 0x0000, 0x0000, 0x0000 }, /* R11695 */ + { 0x0000, 0x0000, 0x0000 }, /* R11696 */ + { 0x0000, 0x0000, 0x0000 }, /* R11697 */ + { 0x0000, 0x0000, 0x0000 }, /* R11698 */ + { 0x0000, 0x0000, 0x0000 }, /* R11699 */ + { 0x0000, 0x0000, 0x0000 }, /* R11700 */ + { 0x0000, 0x0000, 0x0000 }, /* R11701 */ + { 0x0000, 0x0000, 0x0000 }, /* R11702 */ + { 0x0000, 0x0000, 0x0000 }, /* R11703 */ + { 0x0000, 0x0000, 0x0000 }, /* R11704 */ + { 0x0000, 0x0000, 0x0000 }, /* R11705 */ + { 0x0000, 0x0000, 0x0000 }, /* R11706 */ + { 0x0000, 0x0000, 0x0000 }, /* R11707 */ + { 0x0000, 0x0000, 0x0000 }, /* R11708 */ + { 0x0000, 0x0000, 0x0000 }, /* R11709 */ + { 0x0000, 0x0000, 0x0000 }, /* R11710 */ + { 0x0000, 0x0000, 0x0000 }, /* R11711 */ + { 0x0000, 0x0000, 0x0000 }, /* R11712 */ + { 0x0000, 0x0000, 0x0000 }, /* R11713 */ + { 0x0000, 0x0000, 0x0000 }, /* R11714 */ + { 0x0000, 0x0000, 0x0000 }, /* R11715 */ + { 0x0000, 0x0000, 0x0000 }, /* R11716 */ + { 0x0000, 0x0000, 0x0000 }, /* R11717 */ + { 0x0000, 0x0000, 0x0000 }, /* R11718 */ + { 0x0000, 0x0000, 0x0000 }, /* R11719 */ + { 0x0000, 0x0000, 0x0000 }, /* R11720 */ + { 0x0000, 0x0000, 0x0000 }, /* R11721 */ + { 0x0000, 0x0000, 0x0000 }, /* R11722 */ + { 0x0000, 0x0000, 0x0000 }, /* R11723 */ + { 0x0000, 0x0000, 0x0000 }, /* R11724 */ + { 0x0000, 0x0000, 0x0000 }, /* R11725 */ + { 0x0000, 0x0000, 0x0000 }, /* R11726 */ + { 0x0000, 0x0000, 0x0000 }, /* R11727 */ + { 0x0000, 0x0000, 0x0000 }, /* R11728 */ + { 0x0000, 0x0000, 0x0000 }, /* R11729 */ + { 0x0000, 0x0000, 0x0000 }, /* R11730 */ + { 0x0000, 0x0000, 0x0000 }, /* R11731 */ + { 0x0000, 0x0000, 0x0000 }, /* R11732 */ + { 0x0000, 0x0000, 0x0000 }, /* R11733 */ + { 0x0000, 0x0000, 0x0000 }, /* R11734 */ + { 0x0000, 0x0000, 0x0000 }, /* R11735 */ + { 0x0000, 0x0000, 0x0000 }, /* R11736 */ + { 0x0000, 0x0000, 0x0000 }, /* R11737 */ + { 0x0000, 0x0000, 0x0000 }, /* R11738 */ + { 0x0000, 0x0000, 0x0000 }, /* R11739 */ + { 0x0000, 0x0000, 0x0000 }, /* R11740 */ + { 0x0000, 0x0000, 0x0000 }, /* R11741 */ + { 0x0000, 0x0000, 0x0000 }, /* R11742 */ + { 0x0000, 0x0000, 0x0000 }, /* R11743 */ + { 0x0000, 0x0000, 0x0000 }, /* R11744 */ + { 0x0000, 0x0000, 0x0000 }, /* R11745 */ + { 0x0000, 0x0000, 0x0000 }, /* R11746 */ + { 0x0000, 0x0000, 0x0000 }, /* R11747 */ + { 0x0000, 0x0000, 0x0000 }, /* R11748 */ + { 0x0000, 0x0000, 0x0000 }, /* R11749 */ + { 0x0000, 0x0000, 0x0000 }, /* R11750 */ + { 0x0000, 0x0000, 0x0000 }, /* R11751 */ + { 0x0000, 0x0000, 0x0000 }, /* R11752 */ + { 0x0000, 0x0000, 0x0000 }, /* R11753 */ + { 0x0000, 0x0000, 0x0000 }, /* R11754 */ + { 0x0000, 0x0000, 0x0000 }, /* R11755 */ + { 0x0000, 0x0000, 0x0000 }, /* R11756 */ + { 0x0000, 0x0000, 0x0000 }, /* R11757 */ + { 0x0000, 0x0000, 0x0000 }, /* R11758 */ + { 0x0000, 0x0000, 0x0000 }, /* R11759 */ + { 0x0000, 0x0000, 0x0000 }, /* R11760 */ + { 0x0000, 0x0000, 0x0000 }, /* R11761 */ + { 0x0000, 0x0000, 0x0000 }, /* R11762 */ + { 0x0000, 0x0000, 0x0000 }, /* R11763 */ + { 0x0000, 0x0000, 0x0000 }, /* R11764 */ + { 0x0000, 0x0000, 0x0000 }, /* R11765 */ + { 0x0000, 0x0000, 0x0000 }, /* R11766 */ + { 0x0000, 0x0000, 0x0000 }, /* R11767 */ + { 0x0000, 0x0000, 0x0000 }, /* R11768 */ + { 0x0000, 0x0000, 0x0000 }, /* R11769 */ + { 0x0000, 0x0000, 0x0000 }, /* R11770 */ + { 0x0000, 0x0000, 0x0000 }, /* R11771 */ + { 0x0000, 0x0000, 0x0000 }, /* R11772 */ + { 0x0000, 0x0000, 0x0000 }, /* R11773 */ + { 0x0000, 0x0000, 0x0000 }, /* R11774 */ + { 0x0000, 0x0000, 0x0000 }, /* R11775 */ + { 0x0000, 0x0000, 0x0000 }, /* R11776 */ + { 0x0000, 0x0000, 0x0000 }, /* R11777 */ + { 0x0000, 0x0000, 0x0000 }, /* R11778 */ + { 0x0000, 0x0000, 0x0000 }, /* R11779 */ + { 0x0000, 0x0000, 0x0000 }, /* R11780 */ + { 0x0000, 0x0000, 0x0000 }, /* R11781 */ + { 0x0000, 0x0000, 0x0000 }, /* R11782 */ + { 0x0000, 0x0000, 0x0000 }, /* R11783 */ + { 0x0000, 0x0000, 0x0000 }, /* R11784 */ + { 0x0000, 0x0000, 0x0000 }, /* R11785 */ + { 0x0000, 0x0000, 0x0000 }, /* R11786 */ + { 0x0000, 0x0000, 0x0000 }, /* R11787 */ + { 0x0000, 0x0000, 0x0000 }, /* R11788 */ + { 0x0000, 0x0000, 0x0000 }, /* R11789 */ + { 0x0000, 0x0000, 0x0000 }, /* R11790 */ + { 0x0000, 0x0000, 0x0000 }, /* R11791 */ + { 0x0000, 0x0000, 0x0000 }, /* R11792 */ + { 0x0000, 0x0000, 0x0000 }, /* R11793 */ + { 0x0000, 0x0000, 0x0000 }, /* R11794 */ + { 0x0000, 0x0000, 0x0000 }, /* R11795 */ + { 0x0000, 0x0000, 0x0000 }, /* R11796 */ + { 0x0000, 0x0000, 0x0000 }, /* R11797 */ + { 0x0000, 0x0000, 0x0000 }, /* R11798 */ + { 0x0000, 0x0000, 0x0000 }, /* R11799 */ + { 0x0000, 0x0000, 0x0000 }, /* R11800 */ + { 0x0000, 0x0000, 0x0000 }, /* R11801 */ + { 0x0000, 0x0000, 0x0000 }, /* R11802 */ + { 0x0000, 0x0000, 0x0000 }, /* R11803 */ + { 0x0000, 0x0000, 0x0000 }, /* R11804 */ + { 0x0000, 0x0000, 0x0000 }, /* R11805 */ + { 0x0000, 0x0000, 0x0000 }, /* R11806 */ + { 0x0000, 0x0000, 0x0000 }, /* R11807 */ + { 0x0000, 0x0000, 0x0000 }, /* R11808 */ + { 0x0000, 0x0000, 0x0000 }, /* R11809 */ + { 0x0000, 0x0000, 0x0000 }, /* R11810 */ + { 0x0000, 0x0000, 0x0000 }, /* R11811 */ + { 0x0000, 0x0000, 0x0000 }, /* R11812 */ + { 0x0000, 0x0000, 0x0000 }, /* R11813 */ + { 0x0000, 0x0000, 0x0000 }, /* R11814 */ + { 0x0000, 0x0000, 0x0000 }, /* R11815 */ + { 0x0000, 0x0000, 0x0000 }, /* R11816 */ + { 0x0000, 0x0000, 0x0000 }, /* R11817 */ + { 0x0000, 0x0000, 0x0000 }, /* R11818 */ + { 0x0000, 0x0000, 0x0000 }, /* R11819 */ + { 0x0000, 0x0000, 0x0000 }, /* R11820 */ + { 0x0000, 0x0000, 0x0000 }, /* R11821 */ + { 0x0000, 0x0000, 0x0000 }, /* R11822 */ + { 0x0000, 0x0000, 0x0000 }, /* R11823 */ + { 0x0000, 0x0000, 0x0000 }, /* R11824 */ + { 0x0000, 0x0000, 0x0000 }, /* R11825 */ + { 0x0000, 0x0000, 0x0000 }, /* R11826 */ + { 0x0000, 0x0000, 0x0000 }, /* R11827 */ + { 0x0000, 0x0000, 0x0000 }, /* R11828 */ + { 0x0000, 0x0000, 0x0000 }, /* R11829 */ + { 0x0000, 0x0000, 0x0000 }, /* R11830 */ + { 0x0000, 0x0000, 0x0000 }, /* R11831 */ + { 0x0000, 0x0000, 0x0000 }, /* R11832 */ + { 0x0000, 0x0000, 0x0000 }, /* R11833 */ + { 0x0000, 0x0000, 0x0000 }, /* R11834 */ + { 0x0000, 0x0000, 0x0000 }, /* R11835 */ + { 0x0000, 0x0000, 0x0000 }, /* R11836 */ + { 0x0000, 0x0000, 0x0000 }, /* R11837 */ + { 0x0000, 0x0000, 0x0000 }, /* R11838 */ + { 0x0000, 0x0000, 0x0000 }, /* R11839 */ + { 0x0000, 0x0000, 0x0000 }, /* R11840 */ + { 0x0000, 0x0000, 0x0000 }, /* R11841 */ + { 0x0000, 0x0000, 0x0000 }, /* R11842 */ + { 0x0000, 0x0000, 0x0000 }, /* R11843 */ + { 0x0000, 0x0000, 0x0000 }, /* R11844 */ + { 0x0000, 0x0000, 0x0000 }, /* R11845 */ + { 0x0000, 0x0000, 0x0000 }, /* R11846 */ + { 0x0000, 0x0000, 0x0000 }, /* R11847 */ + { 0x0000, 0x0000, 0x0000 }, /* R11848 */ + { 0x0000, 0x0000, 0x0000 }, /* R11849 */ + { 0x0000, 0x0000, 0x0000 }, /* R11850 */ + { 0x0000, 0x0000, 0x0000 }, /* R11851 */ + { 0x0000, 0x0000, 0x0000 }, /* R11852 */ + { 0x0000, 0x0000, 0x0000 }, /* R11853 */ + { 0x0000, 0x0000, 0x0000 }, /* R11854 */ + { 0x0000, 0x0000, 0x0000 }, /* R11855 */ + { 0x0000, 0x0000, 0x0000 }, /* R11856 */ + { 0x0000, 0x0000, 0x0000 }, /* R11857 */ + { 0x0000, 0x0000, 0x0000 }, /* R11858 */ + { 0x0000, 0x0000, 0x0000 }, /* R11859 */ + { 0x0000, 0x0000, 0x0000 }, /* R11860 */ + { 0x0000, 0x0000, 0x0000 }, /* R11861 */ + { 0x0000, 0x0000, 0x0000 }, /* R11862 */ + { 0x0000, 0x0000, 0x0000 }, /* R11863 */ + { 0x0000, 0x0000, 0x0000 }, /* R11864 */ + { 0x0000, 0x0000, 0x0000 }, /* R11865 */ + { 0x0000, 0x0000, 0x0000 }, /* R11866 */ + { 0x0000, 0x0000, 0x0000 }, /* R11867 */ + { 0x0000, 0x0000, 0x0000 }, /* R11868 */ + { 0x0000, 0x0000, 0x0000 }, /* R11869 */ + { 0x0000, 0x0000, 0x0000 }, /* R11870 */ + { 0x0000, 0x0000, 0x0000 }, /* R11871 */ + { 0x0000, 0x0000, 0x0000 }, /* R11872 */ + { 0x0000, 0x0000, 0x0000 }, /* R11873 */ + { 0x0000, 0x0000, 0x0000 }, /* R11874 */ + { 0x0000, 0x0000, 0x0000 }, /* R11875 */ + { 0x0000, 0x0000, 0x0000 }, /* R11876 */ + { 0x0000, 0x0000, 0x0000 }, /* R11877 */ + { 0x0000, 0x0000, 0x0000 }, /* R11878 */ + { 0x0000, 0x0000, 0x0000 }, /* R11879 */ + { 0x0000, 0x0000, 0x0000 }, /* R11880 */ + { 0x0000, 0x0000, 0x0000 }, /* R11881 */ + { 0x0000, 0x0000, 0x0000 }, /* R11882 */ + { 0x0000, 0x0000, 0x0000 }, /* R11883 */ + { 0x0000, 0x0000, 0x0000 }, /* R11884 */ + { 0x0000, 0x0000, 0x0000 }, /* R11885 */ + { 0x0000, 0x0000, 0x0000 }, /* R11886 */ + { 0x0000, 0x0000, 0x0000 }, /* R11887 */ + { 0x0000, 0x0000, 0x0000 }, /* R11888 */ + { 0x0000, 0x0000, 0x0000 }, /* R11889 */ + { 0x0000, 0x0000, 0x0000 }, /* R11890 */ + { 0x0000, 0x0000, 0x0000 }, /* R11891 */ + { 0x0000, 0x0000, 0x0000 }, /* R11892 */ + { 0x0000, 0x0000, 0x0000 }, /* R11893 */ + { 0x0000, 0x0000, 0x0000 }, /* R11894 */ + { 0x0000, 0x0000, 0x0000 }, /* R11895 */ + { 0x0000, 0x0000, 0x0000 }, /* R11896 */ + { 0x0000, 0x0000, 0x0000 }, /* R11897 */ + { 0x0000, 0x0000, 0x0000 }, /* R11898 */ + { 0x0000, 0x0000, 0x0000 }, /* R11899 */ + { 0x0000, 0x0000, 0x0000 }, /* R11900 */ + { 0x0000, 0x0000, 0x0000 }, /* R11901 */ + { 0x0000, 0x0000, 0x0000 }, /* R11902 */ + { 0x0000, 0x0000, 0x0000 }, /* R11903 */ + { 0x0000, 0x0000, 0x0000 }, /* R11904 */ + { 0x0000, 0x0000, 0x0000 }, /* R11905 */ + { 0x0000, 0x0000, 0x0000 }, /* R11906 */ + { 0x0000, 0x0000, 0x0000 }, /* R11907 */ + { 0x0000, 0x0000, 0x0000 }, /* R11908 */ + { 0x0000, 0x0000, 0x0000 }, /* R11909 */ + { 0x0000, 0x0000, 0x0000 }, /* R11910 */ + { 0x0000, 0x0000, 0x0000 }, /* R11911 */ + { 0x0000, 0x0000, 0x0000 }, /* R11912 */ + { 0x0000, 0x0000, 0x0000 }, /* R11913 */ + { 0x0000, 0x0000, 0x0000 }, /* R11914 */ + { 0x0000, 0x0000, 0x0000 }, /* R11915 */ + { 0x0000, 0x0000, 0x0000 }, /* R11916 */ + { 0x0000, 0x0000, 0x0000 }, /* R11917 */ + { 0x0000, 0x0000, 0x0000 }, /* R11918 */ + { 0x0000, 0x0000, 0x0000 }, /* R11919 */ + { 0x0000, 0x0000, 0x0000 }, /* R11920 */ + { 0x0000, 0x0000, 0x0000 }, /* R11921 */ + { 0x0000, 0x0000, 0x0000 }, /* R11922 */ + { 0x0000, 0x0000, 0x0000 }, /* R11923 */ + { 0x0000, 0x0000, 0x0000 }, /* R11924 */ + { 0x0000, 0x0000, 0x0000 }, /* R11925 */ + { 0x0000, 0x0000, 0x0000 }, /* R11926 */ + { 0x0000, 0x0000, 0x0000 }, /* R11927 */ + { 0x0000, 0x0000, 0x0000 }, /* R11928 */ + { 0x0000, 0x0000, 0x0000 }, /* R11929 */ + { 0x0000, 0x0000, 0x0000 }, /* R11930 */ + { 0x0000, 0x0000, 0x0000 }, /* R11931 */ + { 0x0000, 0x0000, 0x0000 }, /* R11932 */ + { 0x0000, 0x0000, 0x0000 }, /* R11933 */ + { 0x0000, 0x0000, 0x0000 }, /* R11934 */ + { 0x0000, 0x0000, 0x0000 }, /* R11935 */ + { 0x0000, 0x0000, 0x0000 }, /* R11936 */ + { 0x0000, 0x0000, 0x0000 }, /* R11937 */ + { 0x0000, 0x0000, 0x0000 }, /* R11938 */ + { 0x0000, 0x0000, 0x0000 }, /* R11939 */ + { 0x0000, 0x0000, 0x0000 }, /* R11940 */ + { 0x0000, 0x0000, 0x0000 }, /* R11941 */ + { 0x0000, 0x0000, 0x0000 }, /* R11942 */ + { 0x0000, 0x0000, 0x0000 }, /* R11943 */ + { 0x0000, 0x0000, 0x0000 }, /* R11944 */ + { 0x0000, 0x0000, 0x0000 }, /* R11945 */ + { 0x0000, 0x0000, 0x0000 }, /* R11946 */ + { 0x0000, 0x0000, 0x0000 }, /* R11947 */ + { 0x0000, 0x0000, 0x0000 }, /* R11948 */ + { 0x0000, 0x0000, 0x0000 }, /* R11949 */ + { 0x0000, 0x0000, 0x0000 }, /* R11950 */ + { 0x0000, 0x0000, 0x0000 }, /* R11951 */ + { 0x0000, 0x0000, 0x0000 }, /* R11952 */ + { 0x0000, 0x0000, 0x0000 }, /* R11953 */ + { 0x0000, 0x0000, 0x0000 }, /* R11954 */ + { 0x0000, 0x0000, 0x0000 }, /* R11955 */ + { 0x0000, 0x0000, 0x0000 }, /* R11956 */ + { 0x0000, 0x0000, 0x0000 }, /* R11957 */ + { 0x0000, 0x0000, 0x0000 }, /* R11958 */ + { 0x0000, 0x0000, 0x0000 }, /* R11959 */ + { 0x0000, 0x0000, 0x0000 }, /* R11960 */ + { 0x0000, 0x0000, 0x0000 }, /* R11961 */ + { 0x0000, 0x0000, 0x0000 }, /* R11962 */ + { 0x0000, 0x0000, 0x0000 }, /* R11963 */ + { 0x0000, 0x0000, 0x0000 }, /* R11964 */ + { 0x0000, 0x0000, 0x0000 }, /* R11965 */ + { 0x0000, 0x0000, 0x0000 }, /* R11966 */ + { 0x0000, 0x0000, 0x0000 }, /* R11967 */ + { 0x0000, 0x0000, 0x0000 }, /* R11968 */ + { 0x0000, 0x0000, 0x0000 }, /* R11969 */ + { 0x0000, 0x0000, 0x0000 }, /* R11970 */ + { 0x0000, 0x0000, 0x0000 }, /* R11971 */ + { 0x0000, 0x0000, 0x0000 }, /* R11972 */ + { 0x0000, 0x0000, 0x0000 }, /* R11973 */ + { 0x0000, 0x0000, 0x0000 }, /* R11974 */ + { 0x0000, 0x0000, 0x0000 }, /* R11975 */ + { 0x0000, 0x0000, 0x0000 }, /* R11976 */ + { 0x0000, 0x0000, 0x0000 }, /* R11977 */ + { 0x0000, 0x0000, 0x0000 }, /* R11978 */ + { 0x0000, 0x0000, 0x0000 }, /* R11979 */ + { 0x0000, 0x0000, 0x0000 }, /* R11980 */ + { 0x0000, 0x0000, 0x0000 }, /* R11981 */ + { 0x0000, 0x0000, 0x0000 }, /* R11982 */ + { 0x0000, 0x0000, 0x0000 }, /* R11983 */ + { 0x0000, 0x0000, 0x0000 }, /* R11984 */ + { 0x0000, 0x0000, 0x0000 }, /* R11985 */ + { 0x0000, 0x0000, 0x0000 }, /* R11986 */ + { 0x0000, 0x0000, 0x0000 }, /* R11987 */ + { 0x0000, 0x0000, 0x0000 }, /* R11988 */ + { 0x0000, 0x0000, 0x0000 }, /* R11989 */ + { 0x0000, 0x0000, 0x0000 }, /* R11990 */ + { 0x0000, 0x0000, 0x0000 }, /* R11991 */ + { 0x0000, 0x0000, 0x0000 }, /* R11992 */ + { 0x0000, 0x0000, 0x0000 }, /* R11993 */ + { 0x0000, 0x0000, 0x0000 }, /* R11994 */ + { 0x0000, 0x0000, 0x0000 }, /* R11995 */ + { 0x0000, 0x0000, 0x0000 }, /* R11996 */ + { 0x0000, 0x0000, 0x0000 }, /* R11997 */ + { 0x0000, 0x0000, 0x0000 }, /* R11998 */ + { 0x0000, 0x0000, 0x0000 }, /* R11999 */ + { 0x0000, 0x0000, 0x0000 }, /* R12000 */ + { 0x0000, 0x0000, 0x0000 }, /* R12001 */ + { 0x0000, 0x0000, 0x0000 }, /* R12002 */ + { 0x0000, 0x0000, 0x0000 }, /* R12003 */ + { 0x0000, 0x0000, 0x0000 }, /* R12004 */ + { 0x0000, 0x0000, 0x0000 }, /* R12005 */ + { 0x0000, 0x0000, 0x0000 }, /* R12006 */ + { 0x0000, 0x0000, 0x0000 }, /* R12007 */ + { 0x0000, 0x0000, 0x0000 }, /* R12008 */ + { 0x0000, 0x0000, 0x0000 }, /* R12009 */ + { 0x0000, 0x0000, 0x0000 }, /* R12010 */ + { 0x0000, 0x0000, 0x0000 }, /* R12011 */ + { 0x0000, 0x0000, 0x0000 }, /* R12012 */ + { 0x0000, 0x0000, 0x0000 }, /* R12013 */ + { 0x0000, 0x0000, 0x0000 }, /* R12014 */ + { 0x0000, 0x0000, 0x0000 }, /* R12015 */ + { 0x0000, 0x0000, 0x0000 }, /* R12016 */ + { 0x0000, 0x0000, 0x0000 }, /* R12017 */ + { 0x0000, 0x0000, 0x0000 }, /* R12018 */ + { 0x0000, 0x0000, 0x0000 }, /* R12019 */ + { 0x0000, 0x0000, 0x0000 }, /* R12020 */ + { 0x0000, 0x0000, 0x0000 }, /* R12021 */ + { 0x0000, 0x0000, 0x0000 }, /* R12022 */ + { 0x0000, 0x0000, 0x0000 }, /* R12023 */ + { 0x0000, 0x0000, 0x0000 }, /* R12024 */ + { 0x0000, 0x0000, 0x0000 }, /* R12025 */ + { 0x0000, 0x0000, 0x0000 }, /* R12026 */ + { 0x0000, 0x0000, 0x0000 }, /* R12027 */ + { 0x0000, 0x0000, 0x0000 }, /* R12028 */ + { 0x0000, 0x0000, 0x0000 }, /* R12029 */ + { 0x0000, 0x0000, 0x0000 }, /* R12030 */ + { 0x0000, 0x0000, 0x0000 }, /* R12031 */ + { 0x0000, 0x0000, 0x0000 }, /* R12032 */ + { 0x0000, 0x0000, 0x0000 }, /* R12033 */ + { 0x0000, 0x0000, 0x0000 }, /* R12034 */ + { 0x0000, 0x0000, 0x0000 }, /* R12035 */ + { 0x0000, 0x0000, 0x0000 }, /* R12036 */ + { 0x0000, 0x0000, 0x0000 }, /* R12037 */ + { 0x0000, 0x0000, 0x0000 }, /* R12038 */ + { 0x0000, 0x0000, 0x0000 }, /* R12039 */ + { 0x0000, 0x0000, 0x0000 }, /* R12040 */ + { 0x0000, 0x0000, 0x0000 }, /* R12041 */ + { 0x0000, 0x0000, 0x0000 }, /* R12042 */ + { 0x0000, 0x0000, 0x0000 }, /* R12043 */ + { 0x0000, 0x0000, 0x0000 }, /* R12044 */ + { 0x0000, 0x0000, 0x0000 }, /* R12045 */ + { 0x0000, 0x0000, 0x0000 }, /* R12046 */ + { 0x0000, 0x0000, 0x0000 }, /* R12047 */ + { 0x0000, 0x0000, 0x0000 }, /* R12048 */ + { 0x0000, 0x0000, 0x0000 }, /* R12049 */ + { 0x0000, 0x0000, 0x0000 }, /* R12050 */ + { 0x0000, 0x0000, 0x0000 }, /* R12051 */ + { 0x0000, 0x0000, 0x0000 }, /* R12052 */ + { 0x0000, 0x0000, 0x0000 }, /* R12053 */ + { 0x0000, 0x0000, 0x0000 }, /* R12054 */ + { 0x0000, 0x0000, 0x0000 }, /* R12055 */ + { 0x0000, 0x0000, 0x0000 }, /* R12056 */ + { 0x0000, 0x0000, 0x0000 }, /* R12057 */ + { 0x0000, 0x0000, 0x0000 }, /* R12058 */ + { 0x0000, 0x0000, 0x0000 }, /* R12059 */ + { 0x0000, 0x0000, 0x0000 }, /* R12060 */ + { 0x0000, 0x0000, 0x0000 }, /* R12061 */ + { 0x0000, 0x0000, 0x0000 }, /* R12062 */ + { 0x0000, 0x0000, 0x0000 }, /* R12063 */ + { 0x0000, 0x0000, 0x0000 }, /* R12064 */ + { 0x0000, 0x0000, 0x0000 }, /* R12065 */ + { 0x0000, 0x0000, 0x0000 }, /* R12066 */ + { 0x0000, 0x0000, 0x0000 }, /* R12067 */ + { 0x0000, 0x0000, 0x0000 }, /* R12068 */ + { 0x0000, 0x0000, 0x0000 }, /* R12069 */ + { 0x0000, 0x0000, 0x0000 }, /* R12070 */ + { 0x0000, 0x0000, 0x0000 }, /* R12071 */ + { 0x0000, 0x0000, 0x0000 }, /* R12072 */ + { 0x0000, 0x0000, 0x0000 }, /* R12073 */ + { 0x0000, 0x0000, 0x0000 }, /* R12074 */ + { 0x0000, 0x0000, 0x0000 }, /* R12075 */ + { 0x0000, 0x0000, 0x0000 }, /* R12076 */ + { 0x0000, 0x0000, 0x0000 }, /* R12077 */ + { 0x0000, 0x0000, 0x0000 }, /* R12078 */ + { 0x0000, 0x0000, 0x0000 }, /* R12079 */ + { 0x0000, 0x0000, 0x0000 }, /* R12080 */ + { 0x0000, 0x0000, 0x0000 }, /* R12081 */ + { 0x0000, 0x0000, 0x0000 }, /* R12082 */ + { 0x0000, 0x0000, 0x0000 }, /* R12083 */ + { 0x0000, 0x0000, 0x0000 }, /* R12084 */ + { 0x0000, 0x0000, 0x0000 }, /* R12085 */ + { 0x0000, 0x0000, 0x0000 }, /* R12086 */ + { 0x0000, 0x0000, 0x0000 }, /* R12087 */ + { 0x0000, 0x0000, 0x0000 }, /* R12088 */ + { 0x0000, 0x0000, 0x0000 }, /* R12089 */ + { 0x0000, 0x0000, 0x0000 }, /* R12090 */ + { 0x0000, 0x0000, 0x0000 }, /* R12091 */ + { 0x0000, 0x0000, 0x0000 }, /* R12092 */ + { 0x0000, 0x0000, 0x0000 }, /* R12093 */ + { 0x0000, 0x0000, 0x0000 }, /* R12094 */ + { 0x0000, 0x0000, 0x0000 }, /* R12095 */ + { 0x0000, 0x0000, 0x0000 }, /* R12096 */ + { 0x0000, 0x0000, 0x0000 }, /* R12097 */ + { 0x0000, 0x0000, 0x0000 }, /* R12098 */ + { 0x0000, 0x0000, 0x0000 }, /* R12099 */ + { 0x0000, 0x0000, 0x0000 }, /* R12100 */ + { 0x0000, 0x0000, 0x0000 }, /* R12101 */ + { 0x0000, 0x0000, 0x0000 }, /* R12102 */ + { 0x0000, 0x0000, 0x0000 }, /* R12103 */ + { 0x0000, 0x0000, 0x0000 }, /* R12104 */ + { 0x0000, 0x0000, 0x0000 }, /* R12105 */ + { 0x0000, 0x0000, 0x0000 }, /* R12106 */ + { 0x0000, 0x0000, 0x0000 }, /* R12107 */ + { 0x0000, 0x0000, 0x0000 }, /* R12108 */ + { 0x0000, 0x0000, 0x0000 }, /* R12109 */ + { 0x0000, 0x0000, 0x0000 }, /* R12110 */ + { 0x0000, 0x0000, 0x0000 }, /* R12111 */ + { 0x0000, 0x0000, 0x0000 }, /* R12112 */ + { 0x0000, 0x0000, 0x0000 }, /* R12113 */ + { 0x0000, 0x0000, 0x0000 }, /* R12114 */ + { 0x0000, 0x0000, 0x0000 }, /* R12115 */ + { 0x0000, 0x0000, 0x0000 }, /* R12116 */ + { 0x0000, 0x0000, 0x0000 }, /* R12117 */ + { 0x0000, 0x0000, 0x0000 }, /* R12118 */ + { 0x0000, 0x0000, 0x0000 }, /* R12119 */ + { 0x0000, 0x0000, 0x0000 }, /* R12120 */ + { 0x0000, 0x0000, 0x0000 }, /* R12121 */ + { 0x0000, 0x0000, 0x0000 }, /* R12122 */ + { 0x0000, 0x0000, 0x0000 }, /* R12123 */ + { 0x0000, 0x0000, 0x0000 }, /* R12124 */ + { 0x0000, 0x0000, 0x0000 }, /* R12125 */ + { 0x0000, 0x0000, 0x0000 }, /* R12126 */ + { 0x0000, 0x0000, 0x0000 }, /* R12127 */ + { 0x0000, 0x0000, 0x0000 }, /* R12128 */ + { 0x0000, 0x0000, 0x0000 }, /* R12129 */ + { 0x0000, 0x0000, 0x0000 }, /* R12130 */ + { 0x0000, 0x0000, 0x0000 }, /* R12131 */ + { 0x0000, 0x0000, 0x0000 }, /* R12132 */ + { 0x0000, 0x0000, 0x0000 }, /* R12133 */ + { 0x0000, 0x0000, 0x0000 }, /* R12134 */ + { 0x0000, 0x0000, 0x0000 }, /* R12135 */ + { 0x0000, 0x0000, 0x0000 }, /* R12136 */ + { 0x0000, 0x0000, 0x0000 }, /* R12137 */ + { 0x0000, 0x0000, 0x0000 }, /* R12138 */ + { 0x0000, 0x0000, 0x0000 }, /* R12139 */ + { 0x0000, 0x0000, 0x0000 }, /* R12140 */ + { 0x0000, 0x0000, 0x0000 }, /* R12141 */ + { 0x0000, 0x0000, 0x0000 }, /* R12142 */ + { 0x0000, 0x0000, 0x0000 }, /* R12143 */ + { 0x0000, 0x0000, 0x0000 }, /* R12144 */ + { 0x0000, 0x0000, 0x0000 }, /* R12145 */ + { 0x0000, 0x0000, 0x0000 }, /* R12146 */ + { 0x0000, 0x0000, 0x0000 }, /* R12147 */ + { 0x0000, 0x0000, 0x0000 }, /* R12148 */ + { 0x0000, 0x0000, 0x0000 }, /* R12149 */ + { 0x0000, 0x0000, 0x0000 }, /* R12150 */ + { 0x0000, 0x0000, 0x0000 }, /* R12151 */ + { 0x0000, 0x0000, 0x0000 }, /* R12152 */ + { 0x0000, 0x0000, 0x0000 }, /* R12153 */ + { 0x0000, 0x0000, 0x0000 }, /* R12154 */ + { 0x0000, 0x0000, 0x0000 }, /* R12155 */ + { 0x0000, 0x0000, 0x0000 }, /* R12156 */ + { 0x0000, 0x0000, 0x0000 }, /* R12157 */ + { 0x0000, 0x0000, 0x0000 }, /* R12158 */ + { 0x0000, 0x0000, 0x0000 }, /* R12159 */ + { 0x0000, 0x0000, 0x0000 }, /* R12160 */ + { 0x0000, 0x0000, 0x0000 }, /* R12161 */ + { 0x0000, 0x0000, 0x0000 }, /* R12162 */ + { 0x0000, 0x0000, 0x0000 }, /* R12163 */ + { 0x0000, 0x0000, 0x0000 }, /* R12164 */ + { 0x0000, 0x0000, 0x0000 }, /* R12165 */ + { 0x0000, 0x0000, 0x0000 }, /* R12166 */ + { 0x0000, 0x0000, 0x0000 }, /* R12167 */ + { 0x0000, 0x0000, 0x0000 }, /* R12168 */ + { 0x0000, 0x0000, 0x0000 }, /* R12169 */ + { 0x0000, 0x0000, 0x0000 }, /* R12170 */ + { 0x0000, 0x0000, 0x0000 }, /* R12171 */ + { 0x0000, 0x0000, 0x0000 }, /* R12172 */ + { 0x0000, 0x0000, 0x0000 }, /* R12173 */ + { 0x0000, 0x0000, 0x0000 }, /* R12174 */ + { 0x0000, 0x0000, 0x0000 }, /* R12175 */ + { 0x0000, 0x0000, 0x0000 }, /* R12176 */ + { 0x0000, 0x0000, 0x0000 }, /* R12177 */ + { 0x0000, 0x0000, 0x0000 }, /* R12178 */ + { 0x0000, 0x0000, 0x0000 }, /* R12179 */ + { 0x0000, 0x0000, 0x0000 }, /* R12180 */ + { 0x0000, 0x0000, 0x0000 }, /* R12181 */ + { 0x0000, 0x0000, 0x0000 }, /* R12182 */ + { 0x0000, 0x0000, 0x0000 }, /* R12183 */ + { 0x0000, 0x0000, 0x0000 }, /* R12184 */ + { 0x0000, 0x0000, 0x0000 }, /* R12185 */ + { 0x0000, 0x0000, 0x0000 }, /* R12186 */ + { 0x0000, 0x0000, 0x0000 }, /* R12187 */ + { 0x0000, 0x0000, 0x0000 }, /* R12188 */ + { 0x0000, 0x0000, 0x0000 }, /* R12189 */ + { 0x0000, 0x0000, 0x0000 }, /* R12190 */ + { 0x0000, 0x0000, 0x0000 }, /* R12191 */ + { 0x0000, 0x0000, 0x0000 }, /* R12192 */ + { 0x0000, 0x0000, 0x0000 }, /* R12193 */ + { 0x0000, 0x0000, 0x0000 }, /* R12194 */ + { 0x0000, 0x0000, 0x0000 }, /* R12195 */ + { 0x0000, 0x0000, 0x0000 }, /* R12196 */ + { 0x0000, 0x0000, 0x0000 }, /* R12197 */ + { 0x0000, 0x0000, 0x0000 }, /* R12198 */ + { 0x0000, 0x0000, 0x0000 }, /* R12199 */ + { 0x0000, 0x0000, 0x0000 }, /* R12200 */ + { 0x0000, 0x0000, 0x0000 }, /* R12201 */ + { 0x0000, 0x0000, 0x0000 }, /* R12202 */ + { 0x0000, 0x0000, 0x0000 }, /* R12203 */ + { 0x0000, 0x0000, 0x0000 }, /* R12204 */ + { 0x0000, 0x0000, 0x0000 }, /* R12205 */ + { 0x0000, 0x0000, 0x0000 }, /* R12206 */ + { 0x0000, 0x0000, 0x0000 }, /* R12207 */ + { 0x0000, 0x0000, 0x0000 }, /* R12208 */ + { 0x0000, 0x0000, 0x0000 }, /* R12209 */ + { 0x0000, 0x0000, 0x0000 }, /* R12210 */ + { 0x0000, 0x0000, 0x0000 }, /* R12211 */ + { 0x0000, 0x0000, 0x0000 }, /* R12212 */ + { 0x0000, 0x0000, 0x0000 }, /* R12213 */ + { 0x0000, 0x0000, 0x0000 }, /* R12214 */ + { 0x0000, 0x0000, 0x0000 }, /* R12215 */ + { 0x0000, 0x0000, 0x0000 }, /* R12216 */ + { 0x0000, 0x0000, 0x0000 }, /* R12217 */ + { 0x0000, 0x0000, 0x0000 }, /* R12218 */ + { 0x0000, 0x0000, 0x0000 }, /* R12219 */ + { 0x0000, 0x0000, 0x0000 }, /* R12220 */ + { 0x0000, 0x0000, 0x0000 }, /* R12221 */ + { 0x0000, 0x0000, 0x0000 }, /* R12222 */ + { 0x0000, 0x0000, 0x0000 }, /* R12223 */ + { 0x0000, 0x0000, 0x0000 }, /* R12224 */ + { 0x0000, 0x0000, 0x0000 }, /* R12225 */ + { 0x0000, 0x0000, 0x0000 }, /* R12226 */ + { 0x0000, 0x0000, 0x0000 }, /* R12227 */ + { 0x0000, 0x0000, 0x0000 }, /* R12228 */ + { 0x0000, 0x0000, 0x0000 }, /* R12229 */ + { 0x0000, 0x0000, 0x0000 }, /* R12230 */ + { 0x0000, 0x0000, 0x0000 }, /* R12231 */ + { 0x0000, 0x0000, 0x0000 }, /* R12232 */ + { 0x0000, 0x0000, 0x0000 }, /* R12233 */ + { 0x0000, 0x0000, 0x0000 }, /* R12234 */ + { 0x0000, 0x0000, 0x0000 }, /* R12235 */ + { 0x0000, 0x0000, 0x0000 }, /* R12236 */ + { 0x0000, 0x0000, 0x0000 }, /* R12237 */ + { 0x0000, 0x0000, 0x0000 }, /* R12238 */ + { 0x0000, 0x0000, 0x0000 }, /* R12239 */ + { 0x0000, 0x0000, 0x0000 }, /* R12240 */ + { 0x0000, 0x0000, 0x0000 }, /* R12241 */ + { 0x0000, 0x0000, 0x0000 }, /* R12242 */ + { 0x0000, 0x0000, 0x0000 }, /* R12243 */ + { 0x0000, 0x0000, 0x0000 }, /* R12244 */ + { 0x0000, 0x0000, 0x0000 }, /* R12245 */ + { 0x0000, 0x0000, 0x0000 }, /* R12246 */ + { 0x0000, 0x0000, 0x0000 }, /* R12247 */ + { 0x0000, 0x0000, 0x0000 }, /* R12248 */ + { 0x0000, 0x0000, 0x0000 }, /* R12249 */ + { 0x0000, 0x0000, 0x0000 }, /* R12250 */ + { 0x0000, 0x0000, 0x0000 }, /* R12251 */ + { 0x0000, 0x0000, 0x0000 }, /* R12252 */ + { 0x0000, 0x0000, 0x0000 }, /* R12253 */ + { 0x0000, 0x0000, 0x0000 }, /* R12254 */ + { 0x0000, 0x0000, 0x0000 }, /* R12255 */ + { 0x0000, 0x0000, 0x0000 }, /* R12256 */ + { 0x0000, 0x0000, 0x0000 }, /* R12257 */ + { 0x0000, 0x0000, 0x0000 }, /* R12258 */ + { 0x0000, 0x0000, 0x0000 }, /* R12259 */ + { 0x0000, 0x0000, 0x0000 }, /* R12260 */ + { 0x0000, 0x0000, 0x0000 }, /* R12261 */ + { 0x0000, 0x0000, 0x0000 }, /* R12262 */ + { 0x0000, 0x0000, 0x0000 }, /* R12263 */ + { 0x0000, 0x0000, 0x0000 }, /* R12264 */ + { 0x0000, 0x0000, 0x0000 }, /* R12265 */ + { 0x0000, 0x0000, 0x0000 }, /* R12266 */ + { 0x0000, 0x0000, 0x0000 }, /* R12267 */ + { 0x0000, 0x0000, 0x0000 }, /* R12268 */ + { 0x0000, 0x0000, 0x0000 }, /* R12269 */ + { 0x0000, 0x0000, 0x0000 }, /* R12270 */ + { 0x0000, 0x0000, 0x0000 }, /* R12271 */ + { 0x0000, 0x0000, 0x0000 }, /* R12272 */ + { 0x0000, 0x0000, 0x0000 }, /* R12273 */ + { 0x0000, 0x0000, 0x0000 }, /* R12274 */ + { 0x0000, 0x0000, 0x0000 }, /* R12275 */ + { 0x0000, 0x0000, 0x0000 }, /* R12276 */ + { 0x0000, 0x0000, 0x0000 }, /* R12277 */ + { 0x0000, 0x0000, 0x0000 }, /* R12278 */ + { 0x0000, 0x0000, 0x0000 }, /* R12279 */ + { 0x0000, 0x0000, 0x0000 }, /* R12280 */ + { 0x0000, 0x0000, 0x0000 }, /* R12281 */ + { 0x0000, 0x0000, 0x0000 }, /* R12282 */ + { 0x0000, 0x0000, 0x0000 }, /* R12283 */ + { 0x0000, 0x0000, 0x0000 }, /* R12284 */ + { 0x0000, 0x0000, 0x0000 }, /* R12285 */ + { 0x0000, 0x0000, 0x0000 }, /* R12286 */ + { 0x0000, 0x0000, 0x0000 }, /* R12287 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R12288 - DSP2 Data1 RAM 1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R12289 - DSP2 Data1 RAM 0 */ + { 0x0000, 0x0000, 0x0000 }, /* R12290 */ + { 0x0000, 0x0000, 0x0000 }, /* R12291 */ + { 0x0000, 0x0000, 0x0000 }, /* R12292 */ + { 0x0000, 0x0000, 0x0000 }, /* R12293 */ + { 0x0000, 0x0000, 0x0000 }, /* R12294 */ + { 0x0000, 0x0000, 0x0000 }, /* R12295 */ + { 0x0000, 0x0000, 0x0000 }, /* R12296 */ + { 0x0000, 0x0000, 0x0000 }, /* R12297 */ + { 0x0000, 0x0000, 0x0000 }, /* R12298 */ + { 0x0000, 0x0000, 0x0000 }, /* R12299 */ + { 0x0000, 0x0000, 0x0000 }, /* R12300 */ + { 0x0000, 0x0000, 0x0000 }, /* R12301 */ + { 0x0000, 0x0000, 0x0000 }, /* R12302 */ + { 0x0000, 0x0000, 0x0000 }, /* R12303 */ + { 0x0000, 0x0000, 0x0000 }, /* R12304 */ + { 0x0000, 0x0000, 0x0000 }, /* R12305 */ + { 0x0000, 0x0000, 0x0000 }, /* R12306 */ + { 0x0000, 0x0000, 0x0000 }, /* R12307 */ + { 0x0000, 0x0000, 0x0000 }, /* R12308 */ + { 0x0000, 0x0000, 0x0000 }, /* R12309 */ + { 0x0000, 0x0000, 0x0000 }, /* R12310 */ + { 0x0000, 0x0000, 0x0000 }, /* R12311 */ + { 0x0000, 0x0000, 0x0000 }, /* R12312 */ + { 0x0000, 0x0000, 0x0000 }, /* R12313 */ + { 0x0000, 0x0000, 0x0000 }, /* R12314 */ + { 0x0000, 0x0000, 0x0000 }, /* R12315 */ + { 0x0000, 0x0000, 0x0000 }, /* R12316 */ + { 0x0000, 0x0000, 0x0000 }, /* R12317 */ + { 0x0000, 0x0000, 0x0000 }, /* R12318 */ + { 0x0000, 0x0000, 0x0000 }, /* R12319 */ + { 0x0000, 0x0000, 0x0000 }, /* R12320 */ + { 0x0000, 0x0000, 0x0000 }, /* R12321 */ + { 0x0000, 0x0000, 0x0000 }, /* R12322 */ + { 0x0000, 0x0000, 0x0000 }, /* R12323 */ + { 0x0000, 0x0000, 0x0000 }, /* R12324 */ + { 0x0000, 0x0000, 0x0000 }, /* R12325 */ + { 0x0000, 0x0000, 0x0000 }, /* R12326 */ + { 0x0000, 0x0000, 0x0000 }, /* R12327 */ + { 0x0000, 0x0000, 0x0000 }, /* R12328 */ + { 0x0000, 0x0000, 0x0000 }, /* R12329 */ + { 0x0000, 0x0000, 0x0000 }, /* R12330 */ + { 0x0000, 0x0000, 0x0000 }, /* R12331 */ + { 0x0000, 0x0000, 0x0000 }, /* R12332 */ + { 0x0000, 0x0000, 0x0000 }, /* R12333 */ + { 0x0000, 0x0000, 0x0000 }, /* R12334 */ + { 0x0000, 0x0000, 0x0000 }, /* R12335 */ + { 0x0000, 0x0000, 0x0000 }, /* R12336 */ + { 0x0000, 0x0000, 0x0000 }, /* R12337 */ + { 0x0000, 0x0000, 0x0000 }, /* R12338 */ + { 0x0000, 0x0000, 0x0000 }, /* R12339 */ + { 0x0000, 0x0000, 0x0000 }, /* R12340 */ + { 0x0000, 0x0000, 0x0000 }, /* R12341 */ + { 0x0000, 0x0000, 0x0000 }, /* R12342 */ + { 0x0000, 0x0000, 0x0000 }, /* R12343 */ + { 0x0000, 0x0000, 0x0000 }, /* R12344 */ + { 0x0000, 0x0000, 0x0000 }, /* R12345 */ + { 0x0000, 0x0000, 0x0000 }, /* R12346 */ + { 0x0000, 0x0000, 0x0000 }, /* R12347 */ + { 0x0000, 0x0000, 0x0000 }, /* R12348 */ + { 0x0000, 0x0000, 0x0000 }, /* R12349 */ + { 0x0000, 0x0000, 0x0000 }, /* R12350 */ + { 0x0000, 0x0000, 0x0000 }, /* R12351 */ + { 0x0000, 0x0000, 0x0000 }, /* R12352 */ + { 0x0000, 0x0000, 0x0000 }, /* R12353 */ + { 0x0000, 0x0000, 0x0000 }, /* R12354 */ + { 0x0000, 0x0000, 0x0000 }, /* R12355 */ + { 0x0000, 0x0000, 0x0000 }, /* R12356 */ + { 0x0000, 0x0000, 0x0000 }, /* R12357 */ + { 0x0000, 0x0000, 0x0000 }, /* R12358 */ + { 0x0000, 0x0000, 0x0000 }, /* R12359 */ + { 0x0000, 0x0000, 0x0000 }, /* R12360 */ + { 0x0000, 0x0000, 0x0000 }, /* R12361 */ + { 0x0000, 0x0000, 0x0000 }, /* R12362 */ + { 0x0000, 0x0000, 0x0000 }, /* R12363 */ + { 0x0000, 0x0000, 0x0000 }, /* R12364 */ + { 0x0000, 0x0000, 0x0000 }, /* R12365 */ + { 0x0000, 0x0000, 0x0000 }, /* R12366 */ + { 0x0000, 0x0000, 0x0000 }, /* R12367 */ + { 0x0000, 0x0000, 0x0000 }, /* R12368 */ + { 0x0000, 0x0000, 0x0000 }, /* R12369 */ + { 0x0000, 0x0000, 0x0000 }, /* R12370 */ + { 0x0000, 0x0000, 0x0000 }, /* R12371 */ + { 0x0000, 0x0000, 0x0000 }, /* R12372 */ + { 0x0000, 0x0000, 0x0000 }, /* R12373 */ + { 0x0000, 0x0000, 0x0000 }, /* R12374 */ + { 0x0000, 0x0000, 0x0000 }, /* R12375 */ + { 0x0000, 0x0000, 0x0000 }, /* R12376 */ + { 0x0000, 0x0000, 0x0000 }, /* R12377 */ + { 0x0000, 0x0000, 0x0000 }, /* R12378 */ + { 0x0000, 0x0000, 0x0000 }, /* R12379 */ + { 0x0000, 0x0000, 0x0000 }, /* R12380 */ + { 0x0000, 0x0000, 0x0000 }, /* R12381 */ + { 0x0000, 0x0000, 0x0000 }, /* R12382 */ + { 0x0000, 0x0000, 0x0000 }, /* R12383 */ + { 0x0000, 0x0000, 0x0000 }, /* R12384 */ + { 0x0000, 0x0000, 0x0000 }, /* R12385 */ + { 0x0000, 0x0000, 0x0000 }, /* R12386 */ + { 0x0000, 0x0000, 0x0000 }, /* R12387 */ + { 0x0000, 0x0000, 0x0000 }, /* R12388 */ + { 0x0000, 0x0000, 0x0000 }, /* R12389 */ + { 0x0000, 0x0000, 0x0000 }, /* R12390 */ + { 0x0000, 0x0000, 0x0000 }, /* R12391 */ + { 0x0000, 0x0000, 0x0000 }, /* R12392 */ + { 0x0000, 0x0000, 0x0000 }, /* R12393 */ + { 0x0000, 0x0000, 0x0000 }, /* R12394 */ + { 0x0000, 0x0000, 0x0000 }, /* R12395 */ + { 0x0000, 0x0000, 0x0000 }, /* R12396 */ + { 0x0000, 0x0000, 0x0000 }, /* R12397 */ + { 0x0000, 0x0000, 0x0000 }, /* R12398 */ + { 0x0000, 0x0000, 0x0000 }, /* R12399 */ + { 0x0000, 0x0000, 0x0000 }, /* R12400 */ + { 0x0000, 0x0000, 0x0000 }, /* R12401 */ + { 0x0000, 0x0000, 0x0000 }, /* R12402 */ + { 0x0000, 0x0000, 0x0000 }, /* R12403 */ + { 0x0000, 0x0000, 0x0000 }, /* R12404 */ + { 0x0000, 0x0000, 0x0000 }, /* R12405 */ + { 0x0000, 0x0000, 0x0000 }, /* R12406 */ + { 0x0000, 0x0000, 0x0000 }, /* R12407 */ + { 0x0000, 0x0000, 0x0000 }, /* R12408 */ + { 0x0000, 0x0000, 0x0000 }, /* R12409 */ + { 0x0000, 0x0000, 0x0000 }, /* R12410 */ + { 0x0000, 0x0000, 0x0000 }, /* R12411 */ + { 0x0000, 0x0000, 0x0000 }, /* R12412 */ + { 0x0000, 0x0000, 0x0000 }, /* R12413 */ + { 0x0000, 0x0000, 0x0000 }, /* R12414 */ + { 0x0000, 0x0000, 0x0000 }, /* R12415 */ + { 0x0000, 0x0000, 0x0000 }, /* R12416 */ + { 0x0000, 0x0000, 0x0000 }, /* R12417 */ + { 0x0000, 0x0000, 0x0000 }, /* R12418 */ + { 0x0000, 0x0000, 0x0000 }, /* R12419 */ + { 0x0000, 0x0000, 0x0000 }, /* R12420 */ + { 0x0000, 0x0000, 0x0000 }, /* R12421 */ + { 0x0000, 0x0000, 0x0000 }, /* R12422 */ + { 0x0000, 0x0000, 0x0000 }, /* R12423 */ + { 0x0000, 0x0000, 0x0000 }, /* R12424 */ + { 0x0000, 0x0000, 0x0000 }, /* R12425 */ + { 0x0000, 0x0000, 0x0000 }, /* R12426 */ + { 0x0000, 0x0000, 0x0000 }, /* R12427 */ + { 0x0000, 0x0000, 0x0000 }, /* R12428 */ + { 0x0000, 0x0000, 0x0000 }, /* R12429 */ + { 0x0000, 0x0000, 0x0000 }, /* R12430 */ + { 0x0000, 0x0000, 0x0000 }, /* R12431 */ + { 0x0000, 0x0000, 0x0000 }, /* R12432 */ + { 0x0000, 0x0000, 0x0000 }, /* R12433 */ + { 0x0000, 0x0000, 0x0000 }, /* R12434 */ + { 0x0000, 0x0000, 0x0000 }, /* R12435 */ + { 0x0000, 0x0000, 0x0000 }, /* R12436 */ + { 0x0000, 0x0000, 0x0000 }, /* R12437 */ + { 0x0000, 0x0000, 0x0000 }, /* R12438 */ + { 0x0000, 0x0000, 0x0000 }, /* R12439 */ + { 0x0000, 0x0000, 0x0000 }, /* R12440 */ + { 0x0000, 0x0000, 0x0000 }, /* R12441 */ + { 0x0000, 0x0000, 0x0000 }, /* R12442 */ + { 0x0000, 0x0000, 0x0000 }, /* R12443 */ + { 0x0000, 0x0000, 0x0000 }, /* R12444 */ + { 0x0000, 0x0000, 0x0000 }, /* R12445 */ + { 0x0000, 0x0000, 0x0000 }, /* R12446 */ + { 0x0000, 0x0000, 0x0000 }, /* R12447 */ + { 0x0000, 0x0000, 0x0000 }, /* R12448 */ + { 0x0000, 0x0000, 0x0000 }, /* R12449 */ + { 0x0000, 0x0000, 0x0000 }, /* R12450 */ + { 0x0000, 0x0000, 0x0000 }, /* R12451 */ + { 0x0000, 0x0000, 0x0000 }, /* R12452 */ + { 0x0000, 0x0000, 0x0000 }, /* R12453 */ + { 0x0000, 0x0000, 0x0000 }, /* R12454 */ + { 0x0000, 0x0000, 0x0000 }, /* R12455 */ + { 0x0000, 0x0000, 0x0000 }, /* R12456 */ + { 0x0000, 0x0000, 0x0000 }, /* R12457 */ + { 0x0000, 0x0000, 0x0000 }, /* R12458 */ + { 0x0000, 0x0000, 0x0000 }, /* R12459 */ + { 0x0000, 0x0000, 0x0000 }, /* R12460 */ + { 0x0000, 0x0000, 0x0000 }, /* R12461 */ + { 0x0000, 0x0000, 0x0000 }, /* R12462 */ + { 0x0000, 0x0000, 0x0000 }, /* R12463 */ + { 0x0000, 0x0000, 0x0000 }, /* R12464 */ + { 0x0000, 0x0000, 0x0000 }, /* R12465 */ + { 0x0000, 0x0000, 0x0000 }, /* R12466 */ + { 0x0000, 0x0000, 0x0000 }, /* R12467 */ + { 0x0000, 0x0000, 0x0000 }, /* R12468 */ + { 0x0000, 0x0000, 0x0000 }, /* R12469 */ + { 0x0000, 0x0000, 0x0000 }, /* R12470 */ + { 0x0000, 0x0000, 0x0000 }, /* R12471 */ + { 0x0000, 0x0000, 0x0000 }, /* R12472 */ + { 0x0000, 0x0000, 0x0000 }, /* R12473 */ + { 0x0000, 0x0000, 0x0000 }, /* R12474 */ + { 0x0000, 0x0000, 0x0000 }, /* R12475 */ + { 0x0000, 0x0000, 0x0000 }, /* R12476 */ + { 0x0000, 0x0000, 0x0000 }, /* R12477 */ + { 0x0000, 0x0000, 0x0000 }, /* R12478 */ + { 0x0000, 0x0000, 0x0000 }, /* R12479 */ + { 0x0000, 0x0000, 0x0000 }, /* R12480 */ + { 0x0000, 0x0000, 0x0000 }, /* R12481 */ + { 0x0000, 0x0000, 0x0000 }, /* R12482 */ + { 0x0000, 0x0000, 0x0000 }, /* R12483 */ + { 0x0000, 0x0000, 0x0000 }, /* R12484 */ + { 0x0000, 0x0000, 0x0000 }, /* R12485 */ + { 0x0000, 0x0000, 0x0000 }, /* R12486 */ + { 0x0000, 0x0000, 0x0000 }, /* R12487 */ + { 0x0000, 0x0000, 0x0000 }, /* R12488 */ + { 0x0000, 0x0000, 0x0000 }, /* R12489 */ + { 0x0000, 0x0000, 0x0000 }, /* R12490 */ + { 0x0000, 0x0000, 0x0000 }, /* R12491 */ + { 0x0000, 0x0000, 0x0000 }, /* R12492 */ + { 0x0000, 0x0000, 0x0000 }, /* R12493 */ + { 0x0000, 0x0000, 0x0000 }, /* R12494 */ + { 0x0000, 0x0000, 0x0000 }, /* R12495 */ + { 0x0000, 0x0000, 0x0000 }, /* R12496 */ + { 0x0000, 0x0000, 0x0000 }, /* R12497 */ + { 0x0000, 0x0000, 0x0000 }, /* R12498 */ + { 0x0000, 0x0000, 0x0000 }, /* R12499 */ + { 0x0000, 0x0000, 0x0000 }, /* R12500 */ + { 0x0000, 0x0000, 0x0000 }, /* R12501 */ + { 0x0000, 0x0000, 0x0000 }, /* R12502 */ + { 0x0000, 0x0000, 0x0000 }, /* R12503 */ + { 0x0000, 0x0000, 0x0000 }, /* R12504 */ + { 0x0000, 0x0000, 0x0000 }, /* R12505 */ + { 0x0000, 0x0000, 0x0000 }, /* R12506 */ + { 0x0000, 0x0000, 0x0000 }, /* R12507 */ + { 0x0000, 0x0000, 0x0000 }, /* R12508 */ + { 0x0000, 0x0000, 0x0000 }, /* R12509 */ + { 0x0000, 0x0000, 0x0000 }, /* R12510 */ + { 0x0000, 0x0000, 0x0000 }, /* R12511 */ + { 0x0000, 0x0000, 0x0000 }, /* R12512 */ + { 0x0000, 0x0000, 0x0000 }, /* R12513 */ + { 0x0000, 0x0000, 0x0000 }, /* R12514 */ + { 0x0000, 0x0000, 0x0000 }, /* R12515 */ + { 0x0000, 0x0000, 0x0000 }, /* R12516 */ + { 0x0000, 0x0000, 0x0000 }, /* R12517 */ + { 0x0000, 0x0000, 0x0000 }, /* R12518 */ + { 0x0000, 0x0000, 0x0000 }, /* R12519 */ + { 0x0000, 0x0000, 0x0000 }, /* R12520 */ + { 0x0000, 0x0000, 0x0000 }, /* R12521 */ + { 0x0000, 0x0000, 0x0000 }, /* R12522 */ + { 0x0000, 0x0000, 0x0000 }, /* R12523 */ + { 0x0000, 0x0000, 0x0000 }, /* R12524 */ + { 0x0000, 0x0000, 0x0000 }, /* R12525 */ + { 0x0000, 0x0000, 0x0000 }, /* R12526 */ + { 0x0000, 0x0000, 0x0000 }, /* R12527 */ + { 0x0000, 0x0000, 0x0000 }, /* R12528 */ + { 0x0000, 0x0000, 0x0000 }, /* R12529 */ + { 0x0000, 0x0000, 0x0000 }, /* R12530 */ + { 0x0000, 0x0000, 0x0000 }, /* R12531 */ + { 0x0000, 0x0000, 0x0000 }, /* R12532 */ + { 0x0000, 0x0000, 0x0000 }, /* R12533 */ + { 0x0000, 0x0000, 0x0000 }, /* R12534 */ + { 0x0000, 0x0000, 0x0000 }, /* R12535 */ + { 0x0000, 0x0000, 0x0000 }, /* R12536 */ + { 0x0000, 0x0000, 0x0000 }, /* R12537 */ + { 0x0000, 0x0000, 0x0000 }, /* R12538 */ + { 0x0000, 0x0000, 0x0000 }, /* R12539 */ + { 0x0000, 0x0000, 0x0000 }, /* R12540 */ + { 0x0000, 0x0000, 0x0000 }, /* R12541 */ + { 0x0000, 0x0000, 0x0000 }, /* R12542 */ + { 0x0000, 0x0000, 0x0000 }, /* R12543 */ + { 0x0000, 0x0000, 0x0000 }, /* R12544 */ + { 0x0000, 0x0000, 0x0000 }, /* R12545 */ + { 0x0000, 0x0000, 0x0000 }, /* R12546 */ + { 0x0000, 0x0000, 0x0000 }, /* R12547 */ + { 0x0000, 0x0000, 0x0000 }, /* R12548 */ + { 0x0000, 0x0000, 0x0000 }, /* R12549 */ + { 0x0000, 0x0000, 0x0000 }, /* R12550 */ + { 0x0000, 0x0000, 0x0000 }, /* R12551 */ + { 0x0000, 0x0000, 0x0000 }, /* R12552 */ + { 0x0000, 0x0000, 0x0000 }, /* R12553 */ + { 0x0000, 0x0000, 0x0000 }, /* R12554 */ + { 0x0000, 0x0000, 0x0000 }, /* R12555 */ + { 0x0000, 0x0000, 0x0000 }, /* R12556 */ + { 0x0000, 0x0000, 0x0000 }, /* R12557 */ + { 0x0000, 0x0000, 0x0000 }, /* R12558 */ + { 0x0000, 0x0000, 0x0000 }, /* R12559 */ + { 0x0000, 0x0000, 0x0000 }, /* R12560 */ + { 0x0000, 0x0000, 0x0000 }, /* R12561 */ + { 0x0000, 0x0000, 0x0000 }, /* R12562 */ + { 0x0000, 0x0000, 0x0000 }, /* R12563 */ + { 0x0000, 0x0000, 0x0000 }, /* R12564 */ + { 0x0000, 0x0000, 0x0000 }, /* R12565 */ + { 0x0000, 0x0000, 0x0000 }, /* R12566 */ + { 0x0000, 0x0000, 0x0000 }, /* R12567 */ + { 0x0000, 0x0000, 0x0000 }, /* R12568 */ + { 0x0000, 0x0000, 0x0000 }, /* R12569 */ + { 0x0000, 0x0000, 0x0000 }, /* R12570 */ + { 0x0000, 0x0000, 0x0000 }, /* R12571 */ + { 0x0000, 0x0000, 0x0000 }, /* R12572 */ + { 0x0000, 0x0000, 0x0000 }, /* R12573 */ + { 0x0000, 0x0000, 0x0000 }, /* R12574 */ + { 0x0000, 0x0000, 0x0000 }, /* R12575 */ + { 0x0000, 0x0000, 0x0000 }, /* R12576 */ + { 0x0000, 0x0000, 0x0000 }, /* R12577 */ + { 0x0000, 0x0000, 0x0000 }, /* R12578 */ + { 0x0000, 0x0000, 0x0000 }, /* R12579 */ + { 0x0000, 0x0000, 0x0000 }, /* R12580 */ + { 0x0000, 0x0000, 0x0000 }, /* R12581 */ + { 0x0000, 0x0000, 0x0000 }, /* R12582 */ + { 0x0000, 0x0000, 0x0000 }, /* R12583 */ + { 0x0000, 0x0000, 0x0000 }, /* R12584 */ + { 0x0000, 0x0000, 0x0000 }, /* R12585 */ + { 0x0000, 0x0000, 0x0000 }, /* R12586 */ + { 0x0000, 0x0000, 0x0000 }, /* R12587 */ + { 0x0000, 0x0000, 0x0000 }, /* R12588 */ + { 0x0000, 0x0000, 0x0000 }, /* R12589 */ + { 0x0000, 0x0000, 0x0000 }, /* R12590 */ + { 0x0000, 0x0000, 0x0000 }, /* R12591 */ + { 0x0000, 0x0000, 0x0000 }, /* R12592 */ + { 0x0000, 0x0000, 0x0000 }, /* R12593 */ + { 0x0000, 0x0000, 0x0000 }, /* R12594 */ + { 0x0000, 0x0000, 0x0000 }, /* R12595 */ + { 0x0000, 0x0000, 0x0000 }, /* R12596 */ + { 0x0000, 0x0000, 0x0000 }, /* R12597 */ + { 0x0000, 0x0000, 0x0000 }, /* R12598 */ + { 0x0000, 0x0000, 0x0000 }, /* R12599 */ + { 0x0000, 0x0000, 0x0000 }, /* R12600 */ + { 0x0000, 0x0000, 0x0000 }, /* R12601 */ + { 0x0000, 0x0000, 0x0000 }, /* R12602 */ + { 0x0000, 0x0000, 0x0000 }, /* R12603 */ + { 0x0000, 0x0000, 0x0000 }, /* R12604 */ + { 0x0000, 0x0000, 0x0000 }, /* R12605 */ + { 0x0000, 0x0000, 0x0000 }, /* R12606 */ + { 0x0000, 0x0000, 0x0000 }, /* R12607 */ + { 0x0000, 0x0000, 0x0000 }, /* R12608 */ + { 0x0000, 0x0000, 0x0000 }, /* R12609 */ + { 0x0000, 0x0000, 0x0000 }, /* R12610 */ + { 0x0000, 0x0000, 0x0000 }, /* R12611 */ + { 0x0000, 0x0000, 0x0000 }, /* R12612 */ + { 0x0000, 0x0000, 0x0000 }, /* R12613 */ + { 0x0000, 0x0000, 0x0000 }, /* R12614 */ + { 0x0000, 0x0000, 0x0000 }, /* R12615 */ + { 0x0000, 0x0000, 0x0000 }, /* R12616 */ + { 0x0000, 0x0000, 0x0000 }, /* R12617 */ + { 0x0000, 0x0000, 0x0000 }, /* R12618 */ + { 0x0000, 0x0000, 0x0000 }, /* R12619 */ + { 0x0000, 0x0000, 0x0000 }, /* R12620 */ + { 0x0000, 0x0000, 0x0000 }, /* R12621 */ + { 0x0000, 0x0000, 0x0000 }, /* R12622 */ + { 0x0000, 0x0000, 0x0000 }, /* R12623 */ + { 0x0000, 0x0000, 0x0000 }, /* R12624 */ + { 0x0000, 0x0000, 0x0000 }, /* R12625 */ + { 0x0000, 0x0000, 0x0000 }, /* R12626 */ + { 0x0000, 0x0000, 0x0000 }, /* R12627 */ + { 0x0000, 0x0000, 0x0000 }, /* R12628 */ + { 0x0000, 0x0000, 0x0000 }, /* R12629 */ + { 0x0000, 0x0000, 0x0000 }, /* R12630 */ + { 0x0000, 0x0000, 0x0000 }, /* R12631 */ + { 0x0000, 0x0000, 0x0000 }, /* R12632 */ + { 0x0000, 0x0000, 0x0000 }, /* R12633 */ + { 0x0000, 0x0000, 0x0000 }, /* R12634 */ + { 0x0000, 0x0000, 0x0000 }, /* R12635 */ + { 0x0000, 0x0000, 0x0000 }, /* R12636 */ + { 0x0000, 0x0000, 0x0000 }, /* R12637 */ + { 0x0000, 0x0000, 0x0000 }, /* R12638 */ + { 0x0000, 0x0000, 0x0000 }, /* R12639 */ + { 0x0000, 0x0000, 0x0000 }, /* R12640 */ + { 0x0000, 0x0000, 0x0000 }, /* R12641 */ + { 0x0000, 0x0000, 0x0000 }, /* R12642 */ + { 0x0000, 0x0000, 0x0000 }, /* R12643 */ + { 0x0000, 0x0000, 0x0000 }, /* R12644 */ + { 0x0000, 0x0000, 0x0000 }, /* R12645 */ + { 0x0000, 0x0000, 0x0000 }, /* R12646 */ + { 0x0000, 0x0000, 0x0000 }, /* R12647 */ + { 0x0000, 0x0000, 0x0000 }, /* R12648 */ + { 0x0000, 0x0000, 0x0000 }, /* R12649 */ + { 0x0000, 0x0000, 0x0000 }, /* R12650 */ + { 0x0000, 0x0000, 0x0000 }, /* R12651 */ + { 0x0000, 0x0000, 0x0000 }, /* R12652 */ + { 0x0000, 0x0000, 0x0000 }, /* R12653 */ + { 0x0000, 0x0000, 0x0000 }, /* R12654 */ + { 0x0000, 0x0000, 0x0000 }, /* R12655 */ + { 0x0000, 0x0000, 0x0000 }, /* R12656 */ + { 0x0000, 0x0000, 0x0000 }, /* R12657 */ + { 0x0000, 0x0000, 0x0000 }, /* R12658 */ + { 0x0000, 0x0000, 0x0000 }, /* R12659 */ + { 0x0000, 0x0000, 0x0000 }, /* R12660 */ + { 0x0000, 0x0000, 0x0000 }, /* R12661 */ + { 0x0000, 0x0000, 0x0000 }, /* R12662 */ + { 0x0000, 0x0000, 0x0000 }, /* R12663 */ + { 0x0000, 0x0000, 0x0000 }, /* R12664 */ + { 0x0000, 0x0000, 0x0000 }, /* R12665 */ + { 0x0000, 0x0000, 0x0000 }, /* R12666 */ + { 0x0000, 0x0000, 0x0000 }, /* R12667 */ + { 0x0000, 0x0000, 0x0000 }, /* R12668 */ + { 0x0000, 0x0000, 0x0000 }, /* R12669 */ + { 0x0000, 0x0000, 0x0000 }, /* R12670 */ + { 0x0000, 0x0000, 0x0000 }, /* R12671 */ + { 0x0000, 0x0000, 0x0000 }, /* R12672 */ + { 0x0000, 0x0000, 0x0000 }, /* R12673 */ + { 0x0000, 0x0000, 0x0000 }, /* R12674 */ + { 0x0000, 0x0000, 0x0000 }, /* R12675 */ + { 0x0000, 0x0000, 0x0000 }, /* R12676 */ + { 0x0000, 0x0000, 0x0000 }, /* R12677 */ + { 0x0000, 0x0000, 0x0000 }, /* R12678 */ + { 0x0000, 0x0000, 0x0000 }, /* R12679 */ + { 0x0000, 0x0000, 0x0000 }, /* R12680 */ + { 0x0000, 0x0000, 0x0000 }, /* R12681 */ + { 0x0000, 0x0000, 0x0000 }, /* R12682 */ + { 0x0000, 0x0000, 0x0000 }, /* R12683 */ + { 0x0000, 0x0000, 0x0000 }, /* R12684 */ + { 0x0000, 0x0000, 0x0000 }, /* R12685 */ + { 0x0000, 0x0000, 0x0000 }, /* R12686 */ + { 0x0000, 0x0000, 0x0000 }, /* R12687 */ + { 0x0000, 0x0000, 0x0000 }, /* R12688 */ + { 0x0000, 0x0000, 0x0000 }, /* R12689 */ + { 0x0000, 0x0000, 0x0000 }, /* R12690 */ + { 0x0000, 0x0000, 0x0000 }, /* R12691 */ + { 0x0000, 0x0000, 0x0000 }, /* R12692 */ + { 0x0000, 0x0000, 0x0000 }, /* R12693 */ + { 0x0000, 0x0000, 0x0000 }, /* R12694 */ + { 0x0000, 0x0000, 0x0000 }, /* R12695 */ + { 0x0000, 0x0000, 0x0000 }, /* R12696 */ + { 0x0000, 0x0000, 0x0000 }, /* R12697 */ + { 0x0000, 0x0000, 0x0000 }, /* R12698 */ + { 0x0000, 0x0000, 0x0000 }, /* R12699 */ + { 0x0000, 0x0000, 0x0000 }, /* R12700 */ + { 0x0000, 0x0000, 0x0000 }, /* R12701 */ + { 0x0000, 0x0000, 0x0000 }, /* R12702 */ + { 0x0000, 0x0000, 0x0000 }, /* R12703 */ + { 0x0000, 0x0000, 0x0000 }, /* R12704 */ + { 0x0000, 0x0000, 0x0000 }, /* R12705 */ + { 0x0000, 0x0000, 0x0000 }, /* R12706 */ + { 0x0000, 0x0000, 0x0000 }, /* R12707 */ + { 0x0000, 0x0000, 0x0000 }, /* R12708 */ + { 0x0000, 0x0000, 0x0000 }, /* R12709 */ + { 0x0000, 0x0000, 0x0000 }, /* R12710 */ + { 0x0000, 0x0000, 0x0000 }, /* R12711 */ + { 0x0000, 0x0000, 0x0000 }, /* R12712 */ + { 0x0000, 0x0000, 0x0000 }, /* R12713 */ + { 0x0000, 0x0000, 0x0000 }, /* R12714 */ + { 0x0000, 0x0000, 0x0000 }, /* R12715 */ + { 0x0000, 0x0000, 0x0000 }, /* R12716 */ + { 0x0000, 0x0000, 0x0000 }, /* R12717 */ + { 0x0000, 0x0000, 0x0000 }, /* R12718 */ + { 0x0000, 0x0000, 0x0000 }, /* R12719 */ + { 0x0000, 0x0000, 0x0000 }, /* R12720 */ + { 0x0000, 0x0000, 0x0000 }, /* R12721 */ + { 0x0000, 0x0000, 0x0000 }, /* R12722 */ + { 0x0000, 0x0000, 0x0000 }, /* R12723 */ + { 0x0000, 0x0000, 0x0000 }, /* R12724 */ + { 0x0000, 0x0000, 0x0000 }, /* R12725 */ + { 0x0000, 0x0000, 0x0000 }, /* R12726 */ + { 0x0000, 0x0000, 0x0000 }, /* R12727 */ + { 0x0000, 0x0000, 0x0000 }, /* R12728 */ + { 0x0000, 0x0000, 0x0000 }, /* R12729 */ + { 0x0000, 0x0000, 0x0000 }, /* R12730 */ + { 0x0000, 0x0000, 0x0000 }, /* R12731 */ + { 0x0000, 0x0000, 0x0000 }, /* R12732 */ + { 0x0000, 0x0000, 0x0000 }, /* R12733 */ + { 0x0000, 0x0000, 0x0000 }, /* R12734 */ + { 0x0000, 0x0000, 0x0000 }, /* R12735 */ + { 0x0000, 0x0000, 0x0000 }, /* R12736 */ + { 0x0000, 0x0000, 0x0000 }, /* R12737 */ + { 0x0000, 0x0000, 0x0000 }, /* R12738 */ + { 0x0000, 0x0000, 0x0000 }, /* R12739 */ + { 0x0000, 0x0000, 0x0000 }, /* R12740 */ + { 0x0000, 0x0000, 0x0000 }, /* R12741 */ + { 0x0000, 0x0000, 0x0000 }, /* R12742 */ + { 0x0000, 0x0000, 0x0000 }, /* R12743 */ + { 0x0000, 0x0000, 0x0000 }, /* R12744 */ + { 0x0000, 0x0000, 0x0000 }, /* R12745 */ + { 0x0000, 0x0000, 0x0000 }, /* R12746 */ + { 0x0000, 0x0000, 0x0000 }, /* R12747 */ + { 0x0000, 0x0000, 0x0000 }, /* R12748 */ + { 0x0000, 0x0000, 0x0000 }, /* R12749 */ + { 0x0000, 0x0000, 0x0000 }, /* R12750 */ + { 0x0000, 0x0000, 0x0000 }, /* R12751 */ + { 0x0000, 0x0000, 0x0000 }, /* R12752 */ + { 0x0000, 0x0000, 0x0000 }, /* R12753 */ + { 0x0000, 0x0000, 0x0000 }, /* R12754 */ + { 0x0000, 0x0000, 0x0000 }, /* R12755 */ + { 0x0000, 0x0000, 0x0000 }, /* R12756 */ + { 0x0000, 0x0000, 0x0000 }, /* R12757 */ + { 0x0000, 0x0000, 0x0000 }, /* R12758 */ + { 0x0000, 0x0000, 0x0000 }, /* R12759 */ + { 0x0000, 0x0000, 0x0000 }, /* R12760 */ + { 0x0000, 0x0000, 0x0000 }, /* R12761 */ + { 0x0000, 0x0000, 0x0000 }, /* R12762 */ + { 0x0000, 0x0000, 0x0000 }, /* R12763 */ + { 0x0000, 0x0000, 0x0000 }, /* R12764 */ + { 0x0000, 0x0000, 0x0000 }, /* R12765 */ + { 0x0000, 0x0000, 0x0000 }, /* R12766 */ + { 0x0000, 0x0000, 0x0000 }, /* R12767 */ + { 0x0000, 0x0000, 0x0000 }, /* R12768 */ + { 0x0000, 0x0000, 0x0000 }, /* R12769 */ + { 0x0000, 0x0000, 0x0000 }, /* R12770 */ + { 0x0000, 0x0000, 0x0000 }, /* R12771 */ + { 0x0000, 0x0000, 0x0000 }, /* R12772 */ + { 0x0000, 0x0000, 0x0000 }, /* R12773 */ + { 0x0000, 0x0000, 0x0000 }, /* R12774 */ + { 0x0000, 0x0000, 0x0000 }, /* R12775 */ + { 0x0000, 0x0000, 0x0000 }, /* R12776 */ + { 0x0000, 0x0000, 0x0000 }, /* R12777 */ + { 0x0000, 0x0000, 0x0000 }, /* R12778 */ + { 0x0000, 0x0000, 0x0000 }, /* R12779 */ + { 0x0000, 0x0000, 0x0000 }, /* R12780 */ + { 0x0000, 0x0000, 0x0000 }, /* R12781 */ + { 0x0000, 0x0000, 0x0000 }, /* R12782 */ + { 0x0000, 0x0000, 0x0000 }, /* R12783 */ + { 0x0000, 0x0000, 0x0000 }, /* R12784 */ + { 0x0000, 0x0000, 0x0000 }, /* R12785 */ + { 0x0000, 0x0000, 0x0000 }, /* R12786 */ + { 0x0000, 0x0000, 0x0000 }, /* R12787 */ + { 0x0000, 0x0000, 0x0000 }, /* R12788 */ + { 0x0000, 0x0000, 0x0000 }, /* R12789 */ + { 0x0000, 0x0000, 0x0000 }, /* R12790 */ + { 0x0000, 0x0000, 0x0000 }, /* R12791 */ + { 0x0000, 0x0000, 0x0000 }, /* R12792 */ + { 0x0000, 0x0000, 0x0000 }, /* R12793 */ + { 0x0000, 0x0000, 0x0000 }, /* R12794 */ + { 0x0000, 0x0000, 0x0000 }, /* R12795 */ + { 0x0000, 0x0000, 0x0000 }, /* R12796 */ + { 0x0000, 0x0000, 0x0000 }, /* R12797 */ + { 0x0000, 0x0000, 0x0000 }, /* R12798 */ + { 0x0000, 0x0000, 0x0000 }, /* R12799 */ + { 0x0000, 0x0000, 0x0000 }, /* R12800 */ + { 0x0000, 0x0000, 0x0000 }, /* R12801 */ + { 0x0000, 0x0000, 0x0000 }, /* R12802 */ + { 0x0000, 0x0000, 0x0000 }, /* R12803 */ + { 0x0000, 0x0000, 0x0000 }, /* R12804 */ + { 0x0000, 0x0000, 0x0000 }, /* R12805 */ + { 0x0000, 0x0000, 0x0000 }, /* R12806 */ + { 0x0000, 0x0000, 0x0000 }, /* R12807 */ + { 0x0000, 0x0000, 0x0000 }, /* R12808 */ + { 0x0000, 0x0000, 0x0000 }, /* R12809 */ + { 0x0000, 0x0000, 0x0000 }, /* R12810 */ + { 0x0000, 0x0000, 0x0000 }, /* R12811 */ + { 0x0000, 0x0000, 0x0000 }, /* R12812 */ + { 0x0000, 0x0000, 0x0000 }, /* R12813 */ + { 0x0000, 0x0000, 0x0000 }, /* R12814 */ + { 0x0000, 0x0000, 0x0000 }, /* R12815 */ + { 0x0000, 0x0000, 0x0000 }, /* R12816 */ + { 0x0000, 0x0000, 0x0000 }, /* R12817 */ + { 0x0000, 0x0000, 0x0000 }, /* R12818 */ + { 0x0000, 0x0000, 0x0000 }, /* R12819 */ + { 0x0000, 0x0000, 0x0000 }, /* R12820 */ + { 0x0000, 0x0000, 0x0000 }, /* R12821 */ + { 0x0000, 0x0000, 0x0000 }, /* R12822 */ + { 0x0000, 0x0000, 0x0000 }, /* R12823 */ + { 0x0000, 0x0000, 0x0000 }, /* R12824 */ + { 0x0000, 0x0000, 0x0000 }, /* R12825 */ + { 0x0000, 0x0000, 0x0000 }, /* R12826 */ + { 0x0000, 0x0000, 0x0000 }, /* R12827 */ + { 0x0000, 0x0000, 0x0000 }, /* R12828 */ + { 0x0000, 0x0000, 0x0000 }, /* R12829 */ + { 0x0000, 0x0000, 0x0000 }, /* R12830 */ + { 0x0000, 0x0000, 0x0000 }, /* R12831 */ + { 0x0000, 0x0000, 0x0000 }, /* R12832 */ + { 0x0000, 0x0000, 0x0000 }, /* R12833 */ + { 0x0000, 0x0000, 0x0000 }, /* R12834 */ + { 0x0000, 0x0000, 0x0000 }, /* R12835 */ + { 0x0000, 0x0000, 0x0000 }, /* R12836 */ + { 0x0000, 0x0000, 0x0000 }, /* R12837 */ + { 0x0000, 0x0000, 0x0000 }, /* R12838 */ + { 0x0000, 0x0000, 0x0000 }, /* R12839 */ + { 0x0000, 0x0000, 0x0000 }, /* R12840 */ + { 0x0000, 0x0000, 0x0000 }, /* R12841 */ + { 0x0000, 0x0000, 0x0000 }, /* R12842 */ + { 0x0000, 0x0000, 0x0000 }, /* R12843 */ + { 0x0000, 0x0000, 0x0000 }, /* R12844 */ + { 0x0000, 0x0000, 0x0000 }, /* R12845 */ + { 0x0000, 0x0000, 0x0000 }, /* R12846 */ + { 0x0000, 0x0000, 0x0000 }, /* R12847 */ + { 0x0000, 0x0000, 0x0000 }, /* R12848 */ + { 0x0000, 0x0000, 0x0000 }, /* R12849 */ + { 0x0000, 0x0000, 0x0000 }, /* R12850 */ + { 0x0000, 0x0000, 0x0000 }, /* R12851 */ + { 0x0000, 0x0000, 0x0000 }, /* R12852 */ + { 0x0000, 0x0000, 0x0000 }, /* R12853 */ + { 0x0000, 0x0000, 0x0000 }, /* R12854 */ + { 0x0000, 0x0000, 0x0000 }, /* R12855 */ + { 0x0000, 0x0000, 0x0000 }, /* R12856 */ + { 0x0000, 0x0000, 0x0000 }, /* R12857 */ + { 0x0000, 0x0000, 0x0000 }, /* R12858 */ + { 0x0000, 0x0000, 0x0000 }, /* R12859 */ + { 0x0000, 0x0000, 0x0000 }, /* R12860 */ + { 0x0000, 0x0000, 0x0000 }, /* R12861 */ + { 0x0000, 0x0000, 0x0000 }, /* R12862 */ + { 0x0000, 0x0000, 0x0000 }, /* R12863 */ + { 0x0000, 0x0000, 0x0000 }, /* R12864 */ + { 0x0000, 0x0000, 0x0000 }, /* R12865 */ + { 0x0000, 0x0000, 0x0000 }, /* R12866 */ + { 0x0000, 0x0000, 0x0000 }, /* R12867 */ + { 0x0000, 0x0000, 0x0000 }, /* R12868 */ + { 0x0000, 0x0000, 0x0000 }, /* R12869 */ + { 0x0000, 0x0000, 0x0000 }, /* R12870 */ + { 0x0000, 0x0000, 0x0000 }, /* R12871 */ + { 0x0000, 0x0000, 0x0000 }, /* R12872 */ + { 0x0000, 0x0000, 0x0000 }, /* R12873 */ + { 0x0000, 0x0000, 0x0000 }, /* R12874 */ + { 0x0000, 0x0000, 0x0000 }, /* R12875 */ + { 0x0000, 0x0000, 0x0000 }, /* R12876 */ + { 0x0000, 0x0000, 0x0000 }, /* R12877 */ + { 0x0000, 0x0000, 0x0000 }, /* R12878 */ + { 0x0000, 0x0000, 0x0000 }, /* R12879 */ + { 0x0000, 0x0000, 0x0000 }, /* R12880 */ + { 0x0000, 0x0000, 0x0000 }, /* R12881 */ + { 0x0000, 0x0000, 0x0000 }, /* R12882 */ + { 0x0000, 0x0000, 0x0000 }, /* R12883 */ + { 0x0000, 0x0000, 0x0000 }, /* R12884 */ + { 0x0000, 0x0000, 0x0000 }, /* R12885 */ + { 0x0000, 0x0000, 0x0000 }, /* R12886 */ + { 0x0000, 0x0000, 0x0000 }, /* R12887 */ + { 0x0000, 0x0000, 0x0000 }, /* R12888 */ + { 0x0000, 0x0000, 0x0000 }, /* R12889 */ + { 0x0000, 0x0000, 0x0000 }, /* R12890 */ + { 0x0000, 0x0000, 0x0000 }, /* R12891 */ + { 0x0000, 0x0000, 0x0000 }, /* R12892 */ + { 0x0000, 0x0000, 0x0000 }, /* R12893 */ + { 0x0000, 0x0000, 0x0000 }, /* R12894 */ + { 0x0000, 0x0000, 0x0000 }, /* R12895 */ + { 0x0000, 0x0000, 0x0000 }, /* R12896 */ + { 0x0000, 0x0000, 0x0000 }, /* R12897 */ + { 0x0000, 0x0000, 0x0000 }, /* R12898 */ + { 0x0000, 0x0000, 0x0000 }, /* R12899 */ + { 0x0000, 0x0000, 0x0000 }, /* R12900 */ + { 0x0000, 0x0000, 0x0000 }, /* R12901 */ + { 0x0000, 0x0000, 0x0000 }, /* R12902 */ + { 0x0000, 0x0000, 0x0000 }, /* R12903 */ + { 0x0000, 0x0000, 0x0000 }, /* R12904 */ + { 0x0000, 0x0000, 0x0000 }, /* R12905 */ + { 0x0000, 0x0000, 0x0000 }, /* R12906 */ + { 0x0000, 0x0000, 0x0000 }, /* R12907 */ + { 0x0000, 0x0000, 0x0000 }, /* R12908 */ + { 0x0000, 0x0000, 0x0000 }, /* R12909 */ + { 0x0000, 0x0000, 0x0000 }, /* R12910 */ + { 0x0000, 0x0000, 0x0000 }, /* R12911 */ + { 0x0000, 0x0000, 0x0000 }, /* R12912 */ + { 0x0000, 0x0000, 0x0000 }, /* R12913 */ + { 0x0000, 0x0000, 0x0000 }, /* R12914 */ + { 0x0000, 0x0000, 0x0000 }, /* R12915 */ + { 0x0000, 0x0000, 0x0000 }, /* R12916 */ + { 0x0000, 0x0000, 0x0000 }, /* R12917 */ + { 0x0000, 0x0000, 0x0000 }, /* R12918 */ + { 0x0000, 0x0000, 0x0000 }, /* R12919 */ + { 0x0000, 0x0000, 0x0000 }, /* R12920 */ + { 0x0000, 0x0000, 0x0000 }, /* R12921 */ + { 0x0000, 0x0000, 0x0000 }, /* R12922 */ + { 0x0000, 0x0000, 0x0000 }, /* R12923 */ + { 0x0000, 0x0000, 0x0000 }, /* R12924 */ + { 0x0000, 0x0000, 0x0000 }, /* R12925 */ + { 0x0000, 0x0000, 0x0000 }, /* R12926 */ + { 0x0000, 0x0000, 0x0000 }, /* R12927 */ + { 0x0000, 0x0000, 0x0000 }, /* R12928 */ + { 0x0000, 0x0000, 0x0000 }, /* R12929 */ + { 0x0000, 0x0000, 0x0000 }, /* R12930 */ + { 0x0000, 0x0000, 0x0000 }, /* R12931 */ + { 0x0000, 0x0000, 0x0000 }, /* R12932 */ + { 0x0000, 0x0000, 0x0000 }, /* R12933 */ + { 0x0000, 0x0000, 0x0000 }, /* R12934 */ + { 0x0000, 0x0000, 0x0000 }, /* R12935 */ + { 0x0000, 0x0000, 0x0000 }, /* R12936 */ + { 0x0000, 0x0000, 0x0000 }, /* R12937 */ + { 0x0000, 0x0000, 0x0000 }, /* R12938 */ + { 0x0000, 0x0000, 0x0000 }, /* R12939 */ + { 0x0000, 0x0000, 0x0000 }, /* R12940 */ + { 0x0000, 0x0000, 0x0000 }, /* R12941 */ + { 0x0000, 0x0000, 0x0000 }, /* R12942 */ + { 0x0000, 0x0000, 0x0000 }, /* R12943 */ + { 0x0000, 0x0000, 0x0000 }, /* R12944 */ + { 0x0000, 0x0000, 0x0000 }, /* R12945 */ + { 0x0000, 0x0000, 0x0000 }, /* R12946 */ + { 0x0000, 0x0000, 0x0000 }, /* R12947 */ + { 0x0000, 0x0000, 0x0000 }, /* R12948 */ + { 0x0000, 0x0000, 0x0000 }, /* R12949 */ + { 0x0000, 0x0000, 0x0000 }, /* R12950 */ + { 0x0000, 0x0000, 0x0000 }, /* R12951 */ + { 0x0000, 0x0000, 0x0000 }, /* R12952 */ + { 0x0000, 0x0000, 0x0000 }, /* R12953 */ + { 0x0000, 0x0000, 0x0000 }, /* R12954 */ + { 0x0000, 0x0000, 0x0000 }, /* R12955 */ + { 0x0000, 0x0000, 0x0000 }, /* R12956 */ + { 0x0000, 0x0000, 0x0000 }, /* R12957 */ + { 0x0000, 0x0000, 0x0000 }, /* R12958 */ + { 0x0000, 0x0000, 0x0000 }, /* R12959 */ + { 0x0000, 0x0000, 0x0000 }, /* R12960 */ + { 0x0000, 0x0000, 0x0000 }, /* R12961 */ + { 0x0000, 0x0000, 0x0000 }, /* R12962 */ + { 0x0000, 0x0000, 0x0000 }, /* R12963 */ + { 0x0000, 0x0000, 0x0000 }, /* R12964 */ + { 0x0000, 0x0000, 0x0000 }, /* R12965 */ + { 0x0000, 0x0000, 0x0000 }, /* R12966 */ + { 0x0000, 0x0000, 0x0000 }, /* R12967 */ + { 0x0000, 0x0000, 0x0000 }, /* R12968 */ + { 0x0000, 0x0000, 0x0000 }, /* R12969 */ + { 0x0000, 0x0000, 0x0000 }, /* R12970 */ + { 0x0000, 0x0000, 0x0000 }, /* R12971 */ + { 0x0000, 0x0000, 0x0000 }, /* R12972 */ + { 0x0000, 0x0000, 0x0000 }, /* R12973 */ + { 0x0000, 0x0000, 0x0000 }, /* R12974 */ + { 0x0000, 0x0000, 0x0000 }, /* R12975 */ + { 0x0000, 0x0000, 0x0000 }, /* R12976 */ + { 0x0000, 0x0000, 0x0000 }, /* R12977 */ + { 0x0000, 0x0000, 0x0000 }, /* R12978 */ + { 0x0000, 0x0000, 0x0000 }, /* R12979 */ + { 0x0000, 0x0000, 0x0000 }, /* R12980 */ + { 0x0000, 0x0000, 0x0000 }, /* R12981 */ + { 0x0000, 0x0000, 0x0000 }, /* R12982 */ + { 0x0000, 0x0000, 0x0000 }, /* R12983 */ + { 0x0000, 0x0000, 0x0000 }, /* R12984 */ + { 0x0000, 0x0000, 0x0000 }, /* R12985 */ + { 0x0000, 0x0000, 0x0000 }, /* R12986 */ + { 0x0000, 0x0000, 0x0000 }, /* R12987 */ + { 0x0000, 0x0000, 0x0000 }, /* R12988 */ + { 0x0000, 0x0000, 0x0000 }, /* R12989 */ + { 0x0000, 0x0000, 0x0000 }, /* R12990 */ + { 0x0000, 0x0000, 0x0000 }, /* R12991 */ + { 0x0000, 0x0000, 0x0000 }, /* R12992 */ + { 0x0000, 0x0000, 0x0000 }, /* R12993 */ + { 0x0000, 0x0000, 0x0000 }, /* R12994 */ + { 0x0000, 0x0000, 0x0000 }, /* R12995 */ + { 0x0000, 0x0000, 0x0000 }, /* R12996 */ + { 0x0000, 0x0000, 0x0000 }, /* R12997 */ + { 0x0000, 0x0000, 0x0000 }, /* R12998 */ + { 0x0000, 0x0000, 0x0000 }, /* R12999 */ + { 0x0000, 0x0000, 0x0000 }, /* R13000 */ + { 0x0000, 0x0000, 0x0000 }, /* R13001 */ + { 0x0000, 0x0000, 0x0000 }, /* R13002 */ + { 0x0000, 0x0000, 0x0000 }, /* R13003 */ + { 0x0000, 0x0000, 0x0000 }, /* R13004 */ + { 0x0000, 0x0000, 0x0000 }, /* R13005 */ + { 0x0000, 0x0000, 0x0000 }, /* R13006 */ + { 0x0000, 0x0000, 0x0000 }, /* R13007 */ + { 0x0000, 0x0000, 0x0000 }, /* R13008 */ + { 0x0000, 0x0000, 0x0000 }, /* R13009 */ + { 0x0000, 0x0000, 0x0000 }, /* R13010 */ + { 0x0000, 0x0000, 0x0000 }, /* R13011 */ + { 0x0000, 0x0000, 0x0000 }, /* R13012 */ + { 0x0000, 0x0000, 0x0000 }, /* R13013 */ + { 0x0000, 0x0000, 0x0000 }, /* R13014 */ + { 0x0000, 0x0000, 0x0000 }, /* R13015 */ + { 0x0000, 0x0000, 0x0000 }, /* R13016 */ + { 0x0000, 0x0000, 0x0000 }, /* R13017 */ + { 0x0000, 0x0000, 0x0000 }, /* R13018 */ + { 0x0000, 0x0000, 0x0000 }, /* R13019 */ + { 0x0000, 0x0000, 0x0000 }, /* R13020 */ + { 0x0000, 0x0000, 0x0000 }, /* R13021 */ + { 0x0000, 0x0000, 0x0000 }, /* R13022 */ + { 0x0000, 0x0000, 0x0000 }, /* R13023 */ + { 0x0000, 0x0000, 0x0000 }, /* R13024 */ + { 0x0000, 0x0000, 0x0000 }, /* R13025 */ + { 0x0000, 0x0000, 0x0000 }, /* R13026 */ + { 0x0000, 0x0000, 0x0000 }, /* R13027 */ + { 0x0000, 0x0000, 0x0000 }, /* R13028 */ + { 0x0000, 0x0000, 0x0000 }, /* R13029 */ + { 0x0000, 0x0000, 0x0000 }, /* R13030 */ + { 0x0000, 0x0000, 0x0000 }, /* R13031 */ + { 0x0000, 0x0000, 0x0000 }, /* R13032 */ + { 0x0000, 0x0000, 0x0000 }, /* R13033 */ + { 0x0000, 0x0000, 0x0000 }, /* R13034 */ + { 0x0000, 0x0000, 0x0000 }, /* R13035 */ + { 0x0000, 0x0000, 0x0000 }, /* R13036 */ + { 0x0000, 0x0000, 0x0000 }, /* R13037 */ + { 0x0000, 0x0000, 0x0000 }, /* R13038 */ + { 0x0000, 0x0000, 0x0000 }, /* R13039 */ + { 0x0000, 0x0000, 0x0000 }, /* R13040 */ + { 0x0000, 0x0000, 0x0000 }, /* R13041 */ + { 0x0000, 0x0000, 0x0000 }, /* R13042 */ + { 0x0000, 0x0000, 0x0000 }, /* R13043 */ + { 0x0000, 0x0000, 0x0000 }, /* R13044 */ + { 0x0000, 0x0000, 0x0000 }, /* R13045 */ + { 0x0000, 0x0000, 0x0000 }, /* R13046 */ + { 0x0000, 0x0000, 0x0000 }, /* R13047 */ + { 0x0000, 0x0000, 0x0000 }, /* R13048 */ + { 0x0000, 0x0000, 0x0000 }, /* R13049 */ + { 0x0000, 0x0000, 0x0000 }, /* R13050 */ + { 0x0000, 0x0000, 0x0000 }, /* R13051 */ + { 0x0000, 0x0000, 0x0000 }, /* R13052 */ + { 0x0000, 0x0000, 0x0000 }, /* R13053 */ + { 0x0000, 0x0000, 0x0000 }, /* R13054 */ + { 0x0000, 0x0000, 0x0000 }, /* R13055 */ + { 0x0000, 0x0000, 0x0000 }, /* R13056 */ + { 0x0000, 0x0000, 0x0000 }, /* R13057 */ + { 0x0000, 0x0000, 0x0000 }, /* R13058 */ + { 0x0000, 0x0000, 0x0000 }, /* R13059 */ + { 0x0000, 0x0000, 0x0000 }, /* R13060 */ + { 0x0000, 0x0000, 0x0000 }, /* R13061 */ + { 0x0000, 0x0000, 0x0000 }, /* R13062 */ + { 0x0000, 0x0000, 0x0000 }, /* R13063 */ + { 0x0000, 0x0000, 0x0000 }, /* R13064 */ + { 0x0000, 0x0000, 0x0000 }, /* R13065 */ + { 0x0000, 0x0000, 0x0000 }, /* R13066 */ + { 0x0000, 0x0000, 0x0000 }, /* R13067 */ + { 0x0000, 0x0000, 0x0000 }, /* R13068 */ + { 0x0000, 0x0000, 0x0000 }, /* R13069 */ + { 0x0000, 0x0000, 0x0000 }, /* R13070 */ + { 0x0000, 0x0000, 0x0000 }, /* R13071 */ + { 0x0000, 0x0000, 0x0000 }, /* R13072 */ + { 0x0000, 0x0000, 0x0000 }, /* R13073 */ + { 0x0000, 0x0000, 0x0000 }, /* R13074 */ + { 0x0000, 0x0000, 0x0000 }, /* R13075 */ + { 0x0000, 0x0000, 0x0000 }, /* R13076 */ + { 0x0000, 0x0000, 0x0000 }, /* R13077 */ + { 0x0000, 0x0000, 0x0000 }, /* R13078 */ + { 0x0000, 0x0000, 0x0000 }, /* R13079 */ + { 0x0000, 0x0000, 0x0000 }, /* R13080 */ + { 0x0000, 0x0000, 0x0000 }, /* R13081 */ + { 0x0000, 0x0000, 0x0000 }, /* R13082 */ + { 0x0000, 0x0000, 0x0000 }, /* R13083 */ + { 0x0000, 0x0000, 0x0000 }, /* R13084 */ + { 0x0000, 0x0000, 0x0000 }, /* R13085 */ + { 0x0000, 0x0000, 0x0000 }, /* R13086 */ + { 0x0000, 0x0000, 0x0000 }, /* R13087 */ + { 0x0000, 0x0000, 0x0000 }, /* R13088 */ + { 0x0000, 0x0000, 0x0000 }, /* R13089 */ + { 0x0000, 0x0000, 0x0000 }, /* R13090 */ + { 0x0000, 0x0000, 0x0000 }, /* R13091 */ + { 0x0000, 0x0000, 0x0000 }, /* R13092 */ + { 0x0000, 0x0000, 0x0000 }, /* R13093 */ + { 0x0000, 0x0000, 0x0000 }, /* R13094 */ + { 0x0000, 0x0000, 0x0000 }, /* R13095 */ + { 0x0000, 0x0000, 0x0000 }, /* R13096 */ + { 0x0000, 0x0000, 0x0000 }, /* R13097 */ + { 0x0000, 0x0000, 0x0000 }, /* R13098 */ + { 0x0000, 0x0000, 0x0000 }, /* R13099 */ + { 0x0000, 0x0000, 0x0000 }, /* R13100 */ + { 0x0000, 0x0000, 0x0000 }, /* R13101 */ + { 0x0000, 0x0000, 0x0000 }, /* R13102 */ + { 0x0000, 0x0000, 0x0000 }, /* R13103 */ + { 0x0000, 0x0000, 0x0000 }, /* R13104 */ + { 0x0000, 0x0000, 0x0000 }, /* R13105 */ + { 0x0000, 0x0000, 0x0000 }, /* R13106 */ + { 0x0000, 0x0000, 0x0000 }, /* R13107 */ + { 0x0000, 0x0000, 0x0000 }, /* R13108 */ + { 0x0000, 0x0000, 0x0000 }, /* R13109 */ + { 0x0000, 0x0000, 0x0000 }, /* R13110 */ + { 0x0000, 0x0000, 0x0000 }, /* R13111 */ + { 0x0000, 0x0000, 0x0000 }, /* R13112 */ + { 0x0000, 0x0000, 0x0000 }, /* R13113 */ + { 0x0000, 0x0000, 0x0000 }, /* R13114 */ + { 0x0000, 0x0000, 0x0000 }, /* R13115 */ + { 0x0000, 0x0000, 0x0000 }, /* R13116 */ + { 0x0000, 0x0000, 0x0000 }, /* R13117 */ + { 0x0000, 0x0000, 0x0000 }, /* R13118 */ + { 0x0000, 0x0000, 0x0000 }, /* R13119 */ + { 0x0000, 0x0000, 0x0000 }, /* R13120 */ + { 0x0000, 0x0000, 0x0000 }, /* R13121 */ + { 0x0000, 0x0000, 0x0000 }, /* R13122 */ + { 0x0000, 0x0000, 0x0000 }, /* R13123 */ + { 0x0000, 0x0000, 0x0000 }, /* R13124 */ + { 0x0000, 0x0000, 0x0000 }, /* R13125 */ + { 0x0000, 0x0000, 0x0000 }, /* R13126 */ + { 0x0000, 0x0000, 0x0000 }, /* R13127 */ + { 0x0000, 0x0000, 0x0000 }, /* R13128 */ + { 0x0000, 0x0000, 0x0000 }, /* R13129 */ + { 0x0000, 0x0000, 0x0000 }, /* R13130 */ + { 0x0000, 0x0000, 0x0000 }, /* R13131 */ + { 0x0000, 0x0000, 0x0000 }, /* R13132 */ + { 0x0000, 0x0000, 0x0000 }, /* R13133 */ + { 0x0000, 0x0000, 0x0000 }, /* R13134 */ + { 0x0000, 0x0000, 0x0000 }, /* R13135 */ + { 0x0000, 0x0000, 0x0000 }, /* R13136 */ + { 0x0000, 0x0000, 0x0000 }, /* R13137 */ + { 0x0000, 0x0000, 0x0000 }, /* R13138 */ + { 0x0000, 0x0000, 0x0000 }, /* R13139 */ + { 0x0000, 0x0000, 0x0000 }, /* R13140 */ + { 0x0000, 0x0000, 0x0000 }, /* R13141 */ + { 0x0000, 0x0000, 0x0000 }, /* R13142 */ + { 0x0000, 0x0000, 0x0000 }, /* R13143 */ + { 0x0000, 0x0000, 0x0000 }, /* R13144 */ + { 0x0000, 0x0000, 0x0000 }, /* R13145 */ + { 0x0000, 0x0000, 0x0000 }, /* R13146 */ + { 0x0000, 0x0000, 0x0000 }, /* R13147 */ + { 0x0000, 0x0000, 0x0000 }, /* R13148 */ + { 0x0000, 0x0000, 0x0000 }, /* R13149 */ + { 0x0000, 0x0000, 0x0000 }, /* R13150 */ + { 0x0000, 0x0000, 0x0000 }, /* R13151 */ + { 0x0000, 0x0000, 0x0000 }, /* R13152 */ + { 0x0000, 0x0000, 0x0000 }, /* R13153 */ + { 0x0000, 0x0000, 0x0000 }, /* R13154 */ + { 0x0000, 0x0000, 0x0000 }, /* R13155 */ + { 0x0000, 0x0000, 0x0000 }, /* R13156 */ + { 0x0000, 0x0000, 0x0000 }, /* R13157 */ + { 0x0000, 0x0000, 0x0000 }, /* R13158 */ + { 0x0000, 0x0000, 0x0000 }, /* R13159 */ + { 0x0000, 0x0000, 0x0000 }, /* R13160 */ + { 0x0000, 0x0000, 0x0000 }, /* R13161 */ + { 0x0000, 0x0000, 0x0000 }, /* R13162 */ + { 0x0000, 0x0000, 0x0000 }, /* R13163 */ + { 0x0000, 0x0000, 0x0000 }, /* R13164 */ + { 0x0000, 0x0000, 0x0000 }, /* R13165 */ + { 0x0000, 0x0000, 0x0000 }, /* R13166 */ + { 0x0000, 0x0000, 0x0000 }, /* R13167 */ + { 0x0000, 0x0000, 0x0000 }, /* R13168 */ + { 0x0000, 0x0000, 0x0000 }, /* R13169 */ + { 0x0000, 0x0000, 0x0000 }, /* R13170 */ + { 0x0000, 0x0000, 0x0000 }, /* R13171 */ + { 0x0000, 0x0000, 0x0000 }, /* R13172 */ + { 0x0000, 0x0000, 0x0000 }, /* R13173 */ + { 0x0000, 0x0000, 0x0000 }, /* R13174 */ + { 0x0000, 0x0000, 0x0000 }, /* R13175 */ + { 0x0000, 0x0000, 0x0000 }, /* R13176 */ + { 0x0000, 0x0000, 0x0000 }, /* R13177 */ + { 0x0000, 0x0000, 0x0000 }, /* R13178 */ + { 0x0000, 0x0000, 0x0000 }, /* R13179 */ + { 0x0000, 0x0000, 0x0000 }, /* R13180 */ + { 0x0000, 0x0000, 0x0000 }, /* R13181 */ + { 0x0000, 0x0000, 0x0000 }, /* R13182 */ + { 0x0000, 0x0000, 0x0000 }, /* R13183 */ + { 0x0000, 0x0000, 0x0000 }, /* R13184 */ + { 0x0000, 0x0000, 0x0000 }, /* R13185 */ + { 0x0000, 0x0000, 0x0000 }, /* R13186 */ + { 0x0000, 0x0000, 0x0000 }, /* R13187 */ + { 0x0000, 0x0000, 0x0000 }, /* R13188 */ + { 0x0000, 0x0000, 0x0000 }, /* R13189 */ + { 0x0000, 0x0000, 0x0000 }, /* R13190 */ + { 0x0000, 0x0000, 0x0000 }, /* R13191 */ + { 0x0000, 0x0000, 0x0000 }, /* R13192 */ + { 0x0000, 0x0000, 0x0000 }, /* R13193 */ + { 0x0000, 0x0000, 0x0000 }, /* R13194 */ + { 0x0000, 0x0000, 0x0000 }, /* R13195 */ + { 0x0000, 0x0000, 0x0000 }, /* R13196 */ + { 0x0000, 0x0000, 0x0000 }, /* R13197 */ + { 0x0000, 0x0000, 0x0000 }, /* R13198 */ + { 0x0000, 0x0000, 0x0000 }, /* R13199 */ + { 0x0000, 0x0000, 0x0000 }, /* R13200 */ + { 0x0000, 0x0000, 0x0000 }, /* R13201 */ + { 0x0000, 0x0000, 0x0000 }, /* R13202 */ + { 0x0000, 0x0000, 0x0000 }, /* R13203 */ + { 0x0000, 0x0000, 0x0000 }, /* R13204 */ + { 0x0000, 0x0000, 0x0000 }, /* R13205 */ + { 0x0000, 0x0000, 0x0000 }, /* R13206 */ + { 0x0000, 0x0000, 0x0000 }, /* R13207 */ + { 0x0000, 0x0000, 0x0000 }, /* R13208 */ + { 0x0000, 0x0000, 0x0000 }, /* R13209 */ + { 0x0000, 0x0000, 0x0000 }, /* R13210 */ + { 0x0000, 0x0000, 0x0000 }, /* R13211 */ + { 0x0000, 0x0000, 0x0000 }, /* R13212 */ + { 0x0000, 0x0000, 0x0000 }, /* R13213 */ + { 0x0000, 0x0000, 0x0000 }, /* R13214 */ + { 0x0000, 0x0000, 0x0000 }, /* R13215 */ + { 0x0000, 0x0000, 0x0000 }, /* R13216 */ + { 0x0000, 0x0000, 0x0000 }, /* R13217 */ + { 0x0000, 0x0000, 0x0000 }, /* R13218 */ + { 0x0000, 0x0000, 0x0000 }, /* R13219 */ + { 0x0000, 0x0000, 0x0000 }, /* R13220 */ + { 0x0000, 0x0000, 0x0000 }, /* R13221 */ + { 0x0000, 0x0000, 0x0000 }, /* R13222 */ + { 0x0000, 0x0000, 0x0000 }, /* R13223 */ + { 0x0000, 0x0000, 0x0000 }, /* R13224 */ + { 0x0000, 0x0000, 0x0000 }, /* R13225 */ + { 0x0000, 0x0000, 0x0000 }, /* R13226 */ + { 0x0000, 0x0000, 0x0000 }, /* R13227 */ + { 0x0000, 0x0000, 0x0000 }, /* R13228 */ + { 0x0000, 0x0000, 0x0000 }, /* R13229 */ + { 0x0000, 0x0000, 0x0000 }, /* R13230 */ + { 0x0000, 0x0000, 0x0000 }, /* R13231 */ + { 0x0000, 0x0000, 0x0000 }, /* R13232 */ + { 0x0000, 0x0000, 0x0000 }, /* R13233 */ + { 0x0000, 0x0000, 0x0000 }, /* R13234 */ + { 0x0000, 0x0000, 0x0000 }, /* R13235 */ + { 0x0000, 0x0000, 0x0000 }, /* R13236 */ + { 0x0000, 0x0000, 0x0000 }, /* R13237 */ + { 0x0000, 0x0000, 0x0000 }, /* R13238 */ + { 0x0000, 0x0000, 0x0000 }, /* R13239 */ + { 0x0000, 0x0000, 0x0000 }, /* R13240 */ + { 0x0000, 0x0000, 0x0000 }, /* R13241 */ + { 0x0000, 0x0000, 0x0000 }, /* R13242 */ + { 0x0000, 0x0000, 0x0000 }, /* R13243 */ + { 0x0000, 0x0000, 0x0000 }, /* R13244 */ + { 0x0000, 0x0000, 0x0000 }, /* R13245 */ + { 0x0000, 0x0000, 0x0000 }, /* R13246 */ + { 0x0000, 0x0000, 0x0000 }, /* R13247 */ + { 0x0000, 0x0000, 0x0000 }, /* R13248 */ + { 0x0000, 0x0000, 0x0000 }, /* R13249 */ + { 0x0000, 0x0000, 0x0000 }, /* R13250 */ + { 0x0000, 0x0000, 0x0000 }, /* R13251 */ + { 0x0000, 0x0000, 0x0000 }, /* R13252 */ + { 0x0000, 0x0000, 0x0000 }, /* R13253 */ + { 0x0000, 0x0000, 0x0000 }, /* R13254 */ + { 0x0000, 0x0000, 0x0000 }, /* R13255 */ + { 0x0000, 0x0000, 0x0000 }, /* R13256 */ + { 0x0000, 0x0000, 0x0000 }, /* R13257 */ + { 0x0000, 0x0000, 0x0000 }, /* R13258 */ + { 0x0000, 0x0000, 0x0000 }, /* R13259 */ + { 0x0000, 0x0000, 0x0000 }, /* R13260 */ + { 0x0000, 0x0000, 0x0000 }, /* R13261 */ + { 0x0000, 0x0000, 0x0000 }, /* R13262 */ + { 0x0000, 0x0000, 0x0000 }, /* R13263 */ + { 0x0000, 0x0000, 0x0000 }, /* R13264 */ + { 0x0000, 0x0000, 0x0000 }, /* R13265 */ + { 0x0000, 0x0000, 0x0000 }, /* R13266 */ + { 0x0000, 0x0000, 0x0000 }, /* R13267 */ + { 0x0000, 0x0000, 0x0000 }, /* R13268 */ + { 0x0000, 0x0000, 0x0000 }, /* R13269 */ + { 0x0000, 0x0000, 0x0000 }, /* R13270 */ + { 0x0000, 0x0000, 0x0000 }, /* R13271 */ + { 0x0000, 0x0000, 0x0000 }, /* R13272 */ + { 0x0000, 0x0000, 0x0000 }, /* R13273 */ + { 0x0000, 0x0000, 0x0000 }, /* R13274 */ + { 0x0000, 0x0000, 0x0000 }, /* R13275 */ + { 0x0000, 0x0000, 0x0000 }, /* R13276 */ + { 0x0000, 0x0000, 0x0000 }, /* R13277 */ + { 0x0000, 0x0000, 0x0000 }, /* R13278 */ + { 0x0000, 0x0000, 0x0000 }, /* R13279 */ + { 0x0000, 0x0000, 0x0000 }, /* R13280 */ + { 0x0000, 0x0000, 0x0000 }, /* R13281 */ + { 0x0000, 0x0000, 0x0000 }, /* R13282 */ + { 0x0000, 0x0000, 0x0000 }, /* R13283 */ + { 0x0000, 0x0000, 0x0000 }, /* R13284 */ + { 0x0000, 0x0000, 0x0000 }, /* R13285 */ + { 0x0000, 0x0000, 0x0000 }, /* R13286 */ + { 0x0000, 0x0000, 0x0000 }, /* R13287 */ + { 0x0000, 0x0000, 0x0000 }, /* R13288 */ + { 0x0000, 0x0000, 0x0000 }, /* R13289 */ + { 0x0000, 0x0000, 0x0000 }, /* R13290 */ + { 0x0000, 0x0000, 0x0000 }, /* R13291 */ + { 0x0000, 0x0000, 0x0000 }, /* R13292 */ + { 0x0000, 0x0000, 0x0000 }, /* R13293 */ + { 0x0000, 0x0000, 0x0000 }, /* R13294 */ + { 0x0000, 0x0000, 0x0000 }, /* R13295 */ + { 0x0000, 0x0000, 0x0000 }, /* R13296 */ + { 0x0000, 0x0000, 0x0000 }, /* R13297 */ + { 0x0000, 0x0000, 0x0000 }, /* R13298 */ + { 0x0000, 0x0000, 0x0000 }, /* R13299 */ + { 0x0000, 0x0000, 0x0000 }, /* R13300 */ + { 0x0000, 0x0000, 0x0000 }, /* R13301 */ + { 0x0000, 0x0000, 0x0000 }, /* R13302 */ + { 0x0000, 0x0000, 0x0000 }, /* R13303 */ + { 0x0000, 0x0000, 0x0000 }, /* R13304 */ + { 0x0000, 0x0000, 0x0000 }, /* R13305 */ + { 0x0000, 0x0000, 0x0000 }, /* R13306 */ + { 0x0000, 0x0000, 0x0000 }, /* R13307 */ + { 0x0000, 0x0000, 0x0000 }, /* R13308 */ + { 0x0000, 0x0000, 0x0000 }, /* R13309 */ + { 0x0000, 0x0000, 0x0000 }, /* R13310 */ + { 0x0000, 0x0000, 0x0000 }, /* R13311 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R13312 - DSP2 Data2 RAM 1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R13313 - DSP2 Data2 RAM 0 */ + { 0x0000, 0x0000, 0x0000 }, /* R13314 */ + { 0x0000, 0x0000, 0x0000 }, /* R13315 */ + { 0x0000, 0x0000, 0x0000 }, /* R13316 */ + { 0x0000, 0x0000, 0x0000 }, /* R13317 */ + { 0x0000, 0x0000, 0x0000 }, /* R13318 */ + { 0x0000, 0x0000, 0x0000 }, /* R13319 */ + { 0x0000, 0x0000, 0x0000 }, /* R13320 */ + { 0x0000, 0x0000, 0x0000 }, /* R13321 */ + { 0x0000, 0x0000, 0x0000 }, /* R13322 */ + { 0x0000, 0x0000, 0x0000 }, /* R13323 */ + { 0x0000, 0x0000, 0x0000 }, /* R13324 */ + { 0x0000, 0x0000, 0x0000 }, /* R13325 */ + { 0x0000, 0x0000, 0x0000 }, /* R13326 */ + { 0x0000, 0x0000, 0x0000 }, /* R13327 */ + { 0x0000, 0x0000, 0x0000 }, /* R13328 */ + { 0x0000, 0x0000, 0x0000 }, /* R13329 */ + { 0x0000, 0x0000, 0x0000 }, /* R13330 */ + { 0x0000, 0x0000, 0x0000 }, /* R13331 */ + { 0x0000, 0x0000, 0x0000 }, /* R13332 */ + { 0x0000, 0x0000, 0x0000 }, /* R13333 */ + { 0x0000, 0x0000, 0x0000 }, /* R13334 */ + { 0x0000, 0x0000, 0x0000 }, /* R13335 */ + { 0x0000, 0x0000, 0x0000 }, /* R13336 */ + { 0x0000, 0x0000, 0x0000 }, /* R13337 */ + { 0x0000, 0x0000, 0x0000 }, /* R13338 */ + { 0x0000, 0x0000, 0x0000 }, /* R13339 */ + { 0x0000, 0x0000, 0x0000 }, /* R13340 */ + { 0x0000, 0x0000, 0x0000 }, /* R13341 */ + { 0x0000, 0x0000, 0x0000 }, /* R13342 */ + { 0x0000, 0x0000, 0x0000 }, /* R13343 */ + { 0x0000, 0x0000, 0x0000 }, /* R13344 */ + { 0x0000, 0x0000, 0x0000 }, /* R13345 */ + { 0x0000, 0x0000, 0x0000 }, /* R13346 */ + { 0x0000, 0x0000, 0x0000 }, /* R13347 */ + { 0x0000, 0x0000, 0x0000 }, /* R13348 */ + { 0x0000, 0x0000, 0x0000 }, /* R13349 */ + { 0x0000, 0x0000, 0x0000 }, /* R13350 */ + { 0x0000, 0x0000, 0x0000 }, /* R13351 */ + { 0x0000, 0x0000, 0x0000 }, /* R13352 */ + { 0x0000, 0x0000, 0x0000 }, /* R13353 */ + { 0x0000, 0x0000, 0x0000 }, /* R13354 */ + { 0x0000, 0x0000, 0x0000 }, /* R13355 */ + { 0x0000, 0x0000, 0x0000 }, /* R13356 */ + { 0x0000, 0x0000, 0x0000 }, /* R13357 */ + { 0x0000, 0x0000, 0x0000 }, /* R13358 */ + { 0x0000, 0x0000, 0x0000 }, /* R13359 */ + { 0x0000, 0x0000, 0x0000 }, /* R13360 */ + { 0x0000, 0x0000, 0x0000 }, /* R13361 */ + { 0x0000, 0x0000, 0x0000 }, /* R13362 */ + { 0x0000, 0x0000, 0x0000 }, /* R13363 */ + { 0x0000, 0x0000, 0x0000 }, /* R13364 */ + { 0x0000, 0x0000, 0x0000 }, /* R13365 */ + { 0x0000, 0x0000, 0x0000 }, /* R13366 */ + { 0x0000, 0x0000, 0x0000 }, /* R13367 */ + { 0x0000, 0x0000, 0x0000 }, /* R13368 */ + { 0x0000, 0x0000, 0x0000 }, /* R13369 */ + { 0x0000, 0x0000, 0x0000 }, /* R13370 */ + { 0x0000, 0x0000, 0x0000 }, /* R13371 */ + { 0x0000, 0x0000, 0x0000 }, /* R13372 */ + { 0x0000, 0x0000, 0x0000 }, /* R13373 */ + { 0x0000, 0x0000, 0x0000 }, /* R13374 */ + { 0x0000, 0x0000, 0x0000 }, /* R13375 */ + { 0x0000, 0x0000, 0x0000 }, /* R13376 */ + { 0x0000, 0x0000, 0x0000 }, /* R13377 */ + { 0x0000, 0x0000, 0x0000 }, /* R13378 */ + { 0x0000, 0x0000, 0x0000 }, /* R13379 */ + { 0x0000, 0x0000, 0x0000 }, /* R13380 */ + { 0x0000, 0x0000, 0x0000 }, /* R13381 */ + { 0x0000, 0x0000, 0x0000 }, /* R13382 */ + { 0x0000, 0x0000, 0x0000 }, /* R13383 */ + { 0x0000, 0x0000, 0x0000 }, /* R13384 */ + { 0x0000, 0x0000, 0x0000 }, /* R13385 */ + { 0x0000, 0x0000, 0x0000 }, /* R13386 */ + { 0x0000, 0x0000, 0x0000 }, /* R13387 */ + { 0x0000, 0x0000, 0x0000 }, /* R13388 */ + { 0x0000, 0x0000, 0x0000 }, /* R13389 */ + { 0x0000, 0x0000, 0x0000 }, /* R13390 */ + { 0x0000, 0x0000, 0x0000 }, /* R13391 */ + { 0x0000, 0x0000, 0x0000 }, /* R13392 */ + { 0x0000, 0x0000, 0x0000 }, /* R13393 */ + { 0x0000, 0x0000, 0x0000 }, /* R13394 */ + { 0x0000, 0x0000, 0x0000 }, /* R13395 */ + { 0x0000, 0x0000, 0x0000 }, /* R13396 */ + { 0x0000, 0x0000, 0x0000 }, /* R13397 */ + { 0x0000, 0x0000, 0x0000 }, /* R13398 */ + { 0x0000, 0x0000, 0x0000 }, /* R13399 */ + { 0x0000, 0x0000, 0x0000 }, /* R13400 */ + { 0x0000, 0x0000, 0x0000 }, /* R13401 */ + { 0x0000, 0x0000, 0x0000 }, /* R13402 */ + { 0x0000, 0x0000, 0x0000 }, /* R13403 */ + { 0x0000, 0x0000, 0x0000 }, /* R13404 */ + { 0x0000, 0x0000, 0x0000 }, /* R13405 */ + { 0x0000, 0x0000, 0x0000 }, /* R13406 */ + { 0x0000, 0x0000, 0x0000 }, /* R13407 */ + { 0x0000, 0x0000, 0x0000 }, /* R13408 */ + { 0x0000, 0x0000, 0x0000 }, /* R13409 */ + { 0x0000, 0x0000, 0x0000 }, /* R13410 */ + { 0x0000, 0x0000, 0x0000 }, /* R13411 */ + { 0x0000, 0x0000, 0x0000 }, /* R13412 */ + { 0x0000, 0x0000, 0x0000 }, /* R13413 */ + { 0x0000, 0x0000, 0x0000 }, /* R13414 */ + { 0x0000, 0x0000, 0x0000 }, /* R13415 */ + { 0x0000, 0x0000, 0x0000 }, /* R13416 */ + { 0x0000, 0x0000, 0x0000 }, /* R13417 */ + { 0x0000, 0x0000, 0x0000 }, /* R13418 */ + { 0x0000, 0x0000, 0x0000 }, /* R13419 */ + { 0x0000, 0x0000, 0x0000 }, /* R13420 */ + { 0x0000, 0x0000, 0x0000 }, /* R13421 */ + { 0x0000, 0x0000, 0x0000 }, /* R13422 */ + { 0x0000, 0x0000, 0x0000 }, /* R13423 */ + { 0x0000, 0x0000, 0x0000 }, /* R13424 */ + { 0x0000, 0x0000, 0x0000 }, /* R13425 */ + { 0x0000, 0x0000, 0x0000 }, /* R13426 */ + { 0x0000, 0x0000, 0x0000 }, /* R13427 */ + { 0x0000, 0x0000, 0x0000 }, /* R13428 */ + { 0x0000, 0x0000, 0x0000 }, /* R13429 */ + { 0x0000, 0x0000, 0x0000 }, /* R13430 */ + { 0x0000, 0x0000, 0x0000 }, /* R13431 */ + { 0x0000, 0x0000, 0x0000 }, /* R13432 */ + { 0x0000, 0x0000, 0x0000 }, /* R13433 */ + { 0x0000, 0x0000, 0x0000 }, /* R13434 */ + { 0x0000, 0x0000, 0x0000 }, /* R13435 */ + { 0x0000, 0x0000, 0x0000 }, /* R13436 */ + { 0x0000, 0x0000, 0x0000 }, /* R13437 */ + { 0x0000, 0x0000, 0x0000 }, /* R13438 */ + { 0x0000, 0x0000, 0x0000 }, /* R13439 */ + { 0x0000, 0x0000, 0x0000 }, /* R13440 */ + { 0x0000, 0x0000, 0x0000 }, /* R13441 */ + { 0x0000, 0x0000, 0x0000 }, /* R13442 */ + { 0x0000, 0x0000, 0x0000 }, /* R13443 */ + { 0x0000, 0x0000, 0x0000 }, /* R13444 */ + { 0x0000, 0x0000, 0x0000 }, /* R13445 */ + { 0x0000, 0x0000, 0x0000 }, /* R13446 */ + { 0x0000, 0x0000, 0x0000 }, /* R13447 */ + { 0x0000, 0x0000, 0x0000 }, /* R13448 */ + { 0x0000, 0x0000, 0x0000 }, /* R13449 */ + { 0x0000, 0x0000, 0x0000 }, /* R13450 */ + { 0x0000, 0x0000, 0x0000 }, /* R13451 */ + { 0x0000, 0x0000, 0x0000 }, /* R13452 */ + { 0x0000, 0x0000, 0x0000 }, /* R13453 */ + { 0x0000, 0x0000, 0x0000 }, /* R13454 */ + { 0x0000, 0x0000, 0x0000 }, /* R13455 */ + { 0x0000, 0x0000, 0x0000 }, /* R13456 */ + { 0x0000, 0x0000, 0x0000 }, /* R13457 */ + { 0x0000, 0x0000, 0x0000 }, /* R13458 */ + { 0x0000, 0x0000, 0x0000 }, /* R13459 */ + { 0x0000, 0x0000, 0x0000 }, /* R13460 */ + { 0x0000, 0x0000, 0x0000 }, /* R13461 */ + { 0x0000, 0x0000, 0x0000 }, /* R13462 */ + { 0x0000, 0x0000, 0x0000 }, /* R13463 */ + { 0x0000, 0x0000, 0x0000 }, /* R13464 */ + { 0x0000, 0x0000, 0x0000 }, /* R13465 */ + { 0x0000, 0x0000, 0x0000 }, /* R13466 */ + { 0x0000, 0x0000, 0x0000 }, /* R13467 */ + { 0x0000, 0x0000, 0x0000 }, /* R13468 */ + { 0x0000, 0x0000, 0x0000 }, /* R13469 */ + { 0x0000, 0x0000, 0x0000 }, /* R13470 */ + { 0x0000, 0x0000, 0x0000 }, /* R13471 */ + { 0x0000, 0x0000, 0x0000 }, /* R13472 */ + { 0x0000, 0x0000, 0x0000 }, /* R13473 */ + { 0x0000, 0x0000, 0x0000 }, /* R13474 */ + { 0x0000, 0x0000, 0x0000 }, /* R13475 */ + { 0x0000, 0x0000, 0x0000 }, /* R13476 */ + { 0x0000, 0x0000, 0x0000 }, /* R13477 */ + { 0x0000, 0x0000, 0x0000 }, /* R13478 */ + { 0x0000, 0x0000, 0x0000 }, /* R13479 */ + { 0x0000, 0x0000, 0x0000 }, /* R13480 */ + { 0x0000, 0x0000, 0x0000 }, /* R13481 */ + { 0x0000, 0x0000, 0x0000 }, /* R13482 */ + { 0x0000, 0x0000, 0x0000 }, /* R13483 */ + { 0x0000, 0x0000, 0x0000 }, /* R13484 */ + { 0x0000, 0x0000, 0x0000 }, /* R13485 */ + { 0x0000, 0x0000, 0x0000 }, /* R13486 */ + { 0x0000, 0x0000, 0x0000 }, /* R13487 */ + { 0x0000, 0x0000, 0x0000 }, /* R13488 */ + { 0x0000, 0x0000, 0x0000 }, /* R13489 */ + { 0x0000, 0x0000, 0x0000 }, /* R13490 */ + { 0x0000, 0x0000, 0x0000 }, /* R13491 */ + { 0x0000, 0x0000, 0x0000 }, /* R13492 */ + { 0x0000, 0x0000, 0x0000 }, /* R13493 */ + { 0x0000, 0x0000, 0x0000 }, /* R13494 */ + { 0x0000, 0x0000, 0x0000 }, /* R13495 */ + { 0x0000, 0x0000, 0x0000 }, /* R13496 */ + { 0x0000, 0x0000, 0x0000 }, /* R13497 */ + { 0x0000, 0x0000, 0x0000 }, /* R13498 */ + { 0x0000, 0x0000, 0x0000 }, /* R13499 */ + { 0x0000, 0x0000, 0x0000 }, /* R13500 */ + { 0x0000, 0x0000, 0x0000 }, /* R13501 */ + { 0x0000, 0x0000, 0x0000 }, /* R13502 */ + { 0x0000, 0x0000, 0x0000 }, /* R13503 */ + { 0x0000, 0x0000, 0x0000 }, /* R13504 */ + { 0x0000, 0x0000, 0x0000 }, /* R13505 */ + { 0x0000, 0x0000, 0x0000 }, /* R13506 */ + { 0x0000, 0x0000, 0x0000 }, /* R13507 */ + { 0x0000, 0x0000, 0x0000 }, /* R13508 */ + { 0x0000, 0x0000, 0x0000 }, /* R13509 */ + { 0x0000, 0x0000, 0x0000 }, /* R13510 */ + { 0x0000, 0x0000, 0x0000 }, /* R13511 */ + { 0x0000, 0x0000, 0x0000 }, /* R13512 */ + { 0x0000, 0x0000, 0x0000 }, /* R13513 */ + { 0x0000, 0x0000, 0x0000 }, /* R13514 */ + { 0x0000, 0x0000, 0x0000 }, /* R13515 */ + { 0x0000, 0x0000, 0x0000 }, /* R13516 */ + { 0x0000, 0x0000, 0x0000 }, /* R13517 */ + { 0x0000, 0x0000, 0x0000 }, /* R13518 */ + { 0x0000, 0x0000, 0x0000 }, /* R13519 */ + { 0x0000, 0x0000, 0x0000 }, /* R13520 */ + { 0x0000, 0x0000, 0x0000 }, /* R13521 */ + { 0x0000, 0x0000, 0x0000 }, /* R13522 */ + { 0x0000, 0x0000, 0x0000 }, /* R13523 */ + { 0x0000, 0x0000, 0x0000 }, /* R13524 */ + { 0x0000, 0x0000, 0x0000 }, /* R13525 */ + { 0x0000, 0x0000, 0x0000 }, /* R13526 */ + { 0x0000, 0x0000, 0x0000 }, /* R13527 */ + { 0x0000, 0x0000, 0x0000 }, /* R13528 */ + { 0x0000, 0x0000, 0x0000 }, /* R13529 */ + { 0x0000, 0x0000, 0x0000 }, /* R13530 */ + { 0x0000, 0x0000, 0x0000 }, /* R13531 */ + { 0x0000, 0x0000, 0x0000 }, /* R13532 */ + { 0x0000, 0x0000, 0x0000 }, /* R13533 */ + { 0x0000, 0x0000, 0x0000 }, /* R13534 */ + { 0x0000, 0x0000, 0x0000 }, /* R13535 */ + { 0x0000, 0x0000, 0x0000 }, /* R13536 */ + { 0x0000, 0x0000, 0x0000 }, /* R13537 */ + { 0x0000, 0x0000, 0x0000 }, /* R13538 */ + { 0x0000, 0x0000, 0x0000 }, /* R13539 */ + { 0x0000, 0x0000, 0x0000 }, /* R13540 */ + { 0x0000, 0x0000, 0x0000 }, /* R13541 */ + { 0x0000, 0x0000, 0x0000 }, /* R13542 */ + { 0x0000, 0x0000, 0x0000 }, /* R13543 */ + { 0x0000, 0x0000, 0x0000 }, /* R13544 */ + { 0x0000, 0x0000, 0x0000 }, /* R13545 */ + { 0x0000, 0x0000, 0x0000 }, /* R13546 */ + { 0x0000, 0x0000, 0x0000 }, /* R13547 */ + { 0x0000, 0x0000, 0x0000 }, /* R13548 */ + { 0x0000, 0x0000, 0x0000 }, /* R13549 */ + { 0x0000, 0x0000, 0x0000 }, /* R13550 */ + { 0x0000, 0x0000, 0x0000 }, /* R13551 */ + { 0x0000, 0x0000, 0x0000 }, /* R13552 */ + { 0x0000, 0x0000, 0x0000 }, /* R13553 */ + { 0x0000, 0x0000, 0x0000 }, /* R13554 */ + { 0x0000, 0x0000, 0x0000 }, /* R13555 */ + { 0x0000, 0x0000, 0x0000 }, /* R13556 */ + { 0x0000, 0x0000, 0x0000 }, /* R13557 */ + { 0x0000, 0x0000, 0x0000 }, /* R13558 */ + { 0x0000, 0x0000, 0x0000 }, /* R13559 */ + { 0x0000, 0x0000, 0x0000 }, /* R13560 */ + { 0x0000, 0x0000, 0x0000 }, /* R13561 */ + { 0x0000, 0x0000, 0x0000 }, /* R13562 */ + { 0x0000, 0x0000, 0x0000 }, /* R13563 */ + { 0x0000, 0x0000, 0x0000 }, /* R13564 */ + { 0x0000, 0x0000, 0x0000 }, /* R13565 */ + { 0x0000, 0x0000, 0x0000 }, /* R13566 */ + { 0x0000, 0x0000, 0x0000 }, /* R13567 */ + { 0x0000, 0x0000, 0x0000 }, /* R13568 */ + { 0x0000, 0x0000, 0x0000 }, /* R13569 */ + { 0x0000, 0x0000, 0x0000 }, /* R13570 */ + { 0x0000, 0x0000, 0x0000 }, /* R13571 */ + { 0x0000, 0x0000, 0x0000 }, /* R13572 */ + { 0x0000, 0x0000, 0x0000 }, /* R13573 */ + { 0x0000, 0x0000, 0x0000 }, /* R13574 */ + { 0x0000, 0x0000, 0x0000 }, /* R13575 */ + { 0x0000, 0x0000, 0x0000 }, /* R13576 */ + { 0x0000, 0x0000, 0x0000 }, /* R13577 */ + { 0x0000, 0x0000, 0x0000 }, /* R13578 */ + { 0x0000, 0x0000, 0x0000 }, /* R13579 */ + { 0x0000, 0x0000, 0x0000 }, /* R13580 */ + { 0x0000, 0x0000, 0x0000 }, /* R13581 */ + { 0x0000, 0x0000, 0x0000 }, /* R13582 */ + { 0x0000, 0x0000, 0x0000 }, /* R13583 */ + { 0x0000, 0x0000, 0x0000 }, /* R13584 */ + { 0x0000, 0x0000, 0x0000 }, /* R13585 */ + { 0x0000, 0x0000, 0x0000 }, /* R13586 */ + { 0x0000, 0x0000, 0x0000 }, /* R13587 */ + { 0x0000, 0x0000, 0x0000 }, /* R13588 */ + { 0x0000, 0x0000, 0x0000 }, /* R13589 */ + { 0x0000, 0x0000, 0x0000 }, /* R13590 */ + { 0x0000, 0x0000, 0x0000 }, /* R13591 */ + { 0x0000, 0x0000, 0x0000 }, /* R13592 */ + { 0x0000, 0x0000, 0x0000 }, /* R13593 */ + { 0x0000, 0x0000, 0x0000 }, /* R13594 */ + { 0x0000, 0x0000, 0x0000 }, /* R13595 */ + { 0x0000, 0x0000, 0x0000 }, /* R13596 */ + { 0x0000, 0x0000, 0x0000 }, /* R13597 */ + { 0x0000, 0x0000, 0x0000 }, /* R13598 */ + { 0x0000, 0x0000, 0x0000 }, /* R13599 */ + { 0x0000, 0x0000, 0x0000 }, /* R13600 */ + { 0x0000, 0x0000, 0x0000 }, /* R13601 */ + { 0x0000, 0x0000, 0x0000 }, /* R13602 */ + { 0x0000, 0x0000, 0x0000 }, /* R13603 */ + { 0x0000, 0x0000, 0x0000 }, /* R13604 */ + { 0x0000, 0x0000, 0x0000 }, /* R13605 */ + { 0x0000, 0x0000, 0x0000 }, /* R13606 */ + { 0x0000, 0x0000, 0x0000 }, /* R13607 */ + { 0x0000, 0x0000, 0x0000 }, /* R13608 */ + { 0x0000, 0x0000, 0x0000 }, /* R13609 */ + { 0x0000, 0x0000, 0x0000 }, /* R13610 */ + { 0x0000, 0x0000, 0x0000 }, /* R13611 */ + { 0x0000, 0x0000, 0x0000 }, /* R13612 */ + { 0x0000, 0x0000, 0x0000 }, /* R13613 */ + { 0x0000, 0x0000, 0x0000 }, /* R13614 */ + { 0x0000, 0x0000, 0x0000 }, /* R13615 */ + { 0x0000, 0x0000, 0x0000 }, /* R13616 */ + { 0x0000, 0x0000, 0x0000 }, /* R13617 */ + { 0x0000, 0x0000, 0x0000 }, /* R13618 */ + { 0x0000, 0x0000, 0x0000 }, /* R13619 */ + { 0x0000, 0x0000, 0x0000 }, /* R13620 */ + { 0x0000, 0x0000, 0x0000 }, /* R13621 */ + { 0x0000, 0x0000, 0x0000 }, /* R13622 */ + { 0x0000, 0x0000, 0x0000 }, /* R13623 */ + { 0x0000, 0x0000, 0x0000 }, /* R13624 */ + { 0x0000, 0x0000, 0x0000 }, /* R13625 */ + { 0x0000, 0x0000, 0x0000 }, /* R13626 */ + { 0x0000, 0x0000, 0x0000 }, /* R13627 */ + { 0x0000, 0x0000, 0x0000 }, /* R13628 */ + { 0x0000, 0x0000, 0x0000 }, /* R13629 */ + { 0x0000, 0x0000, 0x0000 }, /* R13630 */ + { 0x0000, 0x0000, 0x0000 }, /* R13631 */ + { 0x0000, 0x0000, 0x0000 }, /* R13632 */ + { 0x0000, 0x0000, 0x0000 }, /* R13633 */ + { 0x0000, 0x0000, 0x0000 }, /* R13634 */ + { 0x0000, 0x0000, 0x0000 }, /* R13635 */ + { 0x0000, 0x0000, 0x0000 }, /* R13636 */ + { 0x0000, 0x0000, 0x0000 }, /* R13637 */ + { 0x0000, 0x0000, 0x0000 }, /* R13638 */ + { 0x0000, 0x0000, 0x0000 }, /* R13639 */ + { 0x0000, 0x0000, 0x0000 }, /* R13640 */ + { 0x0000, 0x0000, 0x0000 }, /* R13641 */ + { 0x0000, 0x0000, 0x0000 }, /* R13642 */ + { 0x0000, 0x0000, 0x0000 }, /* R13643 */ + { 0x0000, 0x0000, 0x0000 }, /* R13644 */ + { 0x0000, 0x0000, 0x0000 }, /* R13645 */ + { 0x0000, 0x0000, 0x0000 }, /* R13646 */ + { 0x0000, 0x0000, 0x0000 }, /* R13647 */ + { 0x0000, 0x0000, 0x0000 }, /* R13648 */ + { 0x0000, 0x0000, 0x0000 }, /* R13649 */ + { 0x0000, 0x0000, 0x0000 }, /* R13650 */ + { 0x0000, 0x0000, 0x0000 }, /* R13651 */ + { 0x0000, 0x0000, 0x0000 }, /* R13652 */ + { 0x0000, 0x0000, 0x0000 }, /* R13653 */ + { 0x0000, 0x0000, 0x0000 }, /* R13654 */ + { 0x0000, 0x0000, 0x0000 }, /* R13655 */ + { 0x0000, 0x0000, 0x0000 }, /* R13656 */ + { 0x0000, 0x0000, 0x0000 }, /* R13657 */ + { 0x0000, 0x0000, 0x0000 }, /* R13658 */ + { 0x0000, 0x0000, 0x0000 }, /* R13659 */ + { 0x0000, 0x0000, 0x0000 }, /* R13660 */ + { 0x0000, 0x0000, 0x0000 }, /* R13661 */ + { 0x0000, 0x0000, 0x0000 }, /* R13662 */ + { 0x0000, 0x0000, 0x0000 }, /* R13663 */ + { 0x0000, 0x0000, 0x0000 }, /* R13664 */ + { 0x0000, 0x0000, 0x0000 }, /* R13665 */ + { 0x0000, 0x0000, 0x0000 }, /* R13666 */ + { 0x0000, 0x0000, 0x0000 }, /* R13667 */ + { 0x0000, 0x0000, 0x0000 }, /* R13668 */ + { 0x0000, 0x0000, 0x0000 }, /* R13669 */ + { 0x0000, 0x0000, 0x0000 }, /* R13670 */ + { 0x0000, 0x0000, 0x0000 }, /* R13671 */ + { 0x0000, 0x0000, 0x0000 }, /* R13672 */ + { 0x0000, 0x0000, 0x0000 }, /* R13673 */ + { 0x0000, 0x0000, 0x0000 }, /* R13674 */ + { 0x0000, 0x0000, 0x0000 }, /* R13675 */ + { 0x0000, 0x0000, 0x0000 }, /* R13676 */ + { 0x0000, 0x0000, 0x0000 }, /* R13677 */ + { 0x0000, 0x0000, 0x0000 }, /* R13678 */ + { 0x0000, 0x0000, 0x0000 }, /* R13679 */ + { 0x0000, 0x0000, 0x0000 }, /* R13680 */ + { 0x0000, 0x0000, 0x0000 }, /* R13681 */ + { 0x0000, 0x0000, 0x0000 }, /* R13682 */ + { 0x0000, 0x0000, 0x0000 }, /* R13683 */ + { 0x0000, 0x0000, 0x0000 }, /* R13684 */ + { 0x0000, 0x0000, 0x0000 }, /* R13685 */ + { 0x0000, 0x0000, 0x0000 }, /* R13686 */ + { 0x0000, 0x0000, 0x0000 }, /* R13687 */ + { 0x0000, 0x0000, 0x0000 }, /* R13688 */ + { 0x0000, 0x0000, 0x0000 }, /* R13689 */ + { 0x0000, 0x0000, 0x0000 }, /* R13690 */ + { 0x0000, 0x0000, 0x0000 }, /* R13691 */ + { 0x0000, 0x0000, 0x0000 }, /* R13692 */ + { 0x0000, 0x0000, 0x0000 }, /* R13693 */ + { 0x0000, 0x0000, 0x0000 }, /* R13694 */ + { 0x0000, 0x0000, 0x0000 }, /* R13695 */ + { 0x0000, 0x0000, 0x0000 }, /* R13696 */ + { 0x0000, 0x0000, 0x0000 }, /* R13697 */ + { 0x0000, 0x0000, 0x0000 }, /* R13698 */ + { 0x0000, 0x0000, 0x0000 }, /* R13699 */ + { 0x0000, 0x0000, 0x0000 }, /* R13700 */ + { 0x0000, 0x0000, 0x0000 }, /* R13701 */ + { 0x0000, 0x0000, 0x0000 }, /* R13702 */ + { 0x0000, 0x0000, 0x0000 }, /* R13703 */ + { 0x0000, 0x0000, 0x0000 }, /* R13704 */ + { 0x0000, 0x0000, 0x0000 }, /* R13705 */ + { 0x0000, 0x0000, 0x0000 }, /* R13706 */ + { 0x0000, 0x0000, 0x0000 }, /* R13707 */ + { 0x0000, 0x0000, 0x0000 }, /* R13708 */ + { 0x0000, 0x0000, 0x0000 }, /* R13709 */ + { 0x0000, 0x0000, 0x0000 }, /* R13710 */ + { 0x0000, 0x0000, 0x0000 }, /* R13711 */ + { 0x0000, 0x0000, 0x0000 }, /* R13712 */ + { 0x0000, 0x0000, 0x0000 }, /* R13713 */ + { 0x0000, 0x0000, 0x0000 }, /* R13714 */ + { 0x0000, 0x0000, 0x0000 }, /* R13715 */ + { 0x0000, 0x0000, 0x0000 }, /* R13716 */ + { 0x0000, 0x0000, 0x0000 }, /* R13717 */ + { 0x0000, 0x0000, 0x0000 }, /* R13718 */ + { 0x0000, 0x0000, 0x0000 }, /* R13719 */ + { 0x0000, 0x0000, 0x0000 }, /* R13720 */ + { 0x0000, 0x0000, 0x0000 }, /* R13721 */ + { 0x0000, 0x0000, 0x0000 }, /* R13722 */ + { 0x0000, 0x0000, 0x0000 }, /* R13723 */ + { 0x0000, 0x0000, 0x0000 }, /* R13724 */ + { 0x0000, 0x0000, 0x0000 }, /* R13725 */ + { 0x0000, 0x0000, 0x0000 }, /* R13726 */ + { 0x0000, 0x0000, 0x0000 }, /* R13727 */ + { 0x0000, 0x0000, 0x0000 }, /* R13728 */ + { 0x0000, 0x0000, 0x0000 }, /* R13729 */ + { 0x0000, 0x0000, 0x0000 }, /* R13730 */ + { 0x0000, 0x0000, 0x0000 }, /* R13731 */ + { 0x0000, 0x0000, 0x0000 }, /* R13732 */ + { 0x0000, 0x0000, 0x0000 }, /* R13733 */ + { 0x0000, 0x0000, 0x0000 }, /* R13734 */ + { 0x0000, 0x0000, 0x0000 }, /* R13735 */ + { 0x0000, 0x0000, 0x0000 }, /* R13736 */ + { 0x0000, 0x0000, 0x0000 }, /* R13737 */ + { 0x0000, 0x0000, 0x0000 }, /* R13738 */ + { 0x0000, 0x0000, 0x0000 }, /* R13739 */ + { 0x0000, 0x0000, 0x0000 }, /* R13740 */ + { 0x0000, 0x0000, 0x0000 }, /* R13741 */ + { 0x0000, 0x0000, 0x0000 }, /* R13742 */ + { 0x0000, 0x0000, 0x0000 }, /* R13743 */ + { 0x0000, 0x0000, 0x0000 }, /* R13744 */ + { 0x0000, 0x0000, 0x0000 }, /* R13745 */ + { 0x0000, 0x0000, 0x0000 }, /* R13746 */ + { 0x0000, 0x0000, 0x0000 }, /* R13747 */ + { 0x0000, 0x0000, 0x0000 }, /* R13748 */ + { 0x0000, 0x0000, 0x0000 }, /* R13749 */ + { 0x0000, 0x0000, 0x0000 }, /* R13750 */ + { 0x0000, 0x0000, 0x0000 }, /* R13751 */ + { 0x0000, 0x0000, 0x0000 }, /* R13752 */ + { 0x0000, 0x0000, 0x0000 }, /* R13753 */ + { 0x0000, 0x0000, 0x0000 }, /* R13754 */ + { 0x0000, 0x0000, 0x0000 }, /* R13755 */ + { 0x0000, 0x0000, 0x0000 }, /* R13756 */ + { 0x0000, 0x0000, 0x0000 }, /* R13757 */ + { 0x0000, 0x0000, 0x0000 }, /* R13758 */ + { 0x0000, 0x0000, 0x0000 }, /* R13759 */ + { 0x0000, 0x0000, 0x0000 }, /* R13760 */ + { 0x0000, 0x0000, 0x0000 }, /* R13761 */ + { 0x0000, 0x0000, 0x0000 }, /* R13762 */ + { 0x0000, 0x0000, 0x0000 }, /* R13763 */ + { 0x0000, 0x0000, 0x0000 }, /* R13764 */ + { 0x0000, 0x0000, 0x0000 }, /* R13765 */ + { 0x0000, 0x0000, 0x0000 }, /* R13766 */ + { 0x0000, 0x0000, 0x0000 }, /* R13767 */ + { 0x0000, 0x0000, 0x0000 }, /* R13768 */ + { 0x0000, 0x0000, 0x0000 }, /* R13769 */ + { 0x0000, 0x0000, 0x0000 }, /* R13770 */ + { 0x0000, 0x0000, 0x0000 }, /* R13771 */ + { 0x0000, 0x0000, 0x0000 }, /* R13772 */ + { 0x0000, 0x0000, 0x0000 }, /* R13773 */ + { 0x0000, 0x0000, 0x0000 }, /* R13774 */ + { 0x0000, 0x0000, 0x0000 }, /* R13775 */ + { 0x0000, 0x0000, 0x0000 }, /* R13776 */ + { 0x0000, 0x0000, 0x0000 }, /* R13777 */ + { 0x0000, 0x0000, 0x0000 }, /* R13778 */ + { 0x0000, 0x0000, 0x0000 }, /* R13779 */ + { 0x0000, 0x0000, 0x0000 }, /* R13780 */ + { 0x0000, 0x0000, 0x0000 }, /* R13781 */ + { 0x0000, 0x0000, 0x0000 }, /* R13782 */ + { 0x0000, 0x0000, 0x0000 }, /* R13783 */ + { 0x0000, 0x0000, 0x0000 }, /* R13784 */ + { 0x0000, 0x0000, 0x0000 }, /* R13785 */ + { 0x0000, 0x0000, 0x0000 }, /* R13786 */ + { 0x0000, 0x0000, 0x0000 }, /* R13787 */ + { 0x0000, 0x0000, 0x0000 }, /* R13788 */ + { 0x0000, 0x0000, 0x0000 }, /* R13789 */ + { 0x0000, 0x0000, 0x0000 }, /* R13790 */ + { 0x0000, 0x0000, 0x0000 }, /* R13791 */ + { 0x0000, 0x0000, 0x0000 }, /* R13792 */ + { 0x0000, 0x0000, 0x0000 }, /* R13793 */ + { 0x0000, 0x0000, 0x0000 }, /* R13794 */ + { 0x0000, 0x0000, 0x0000 }, /* R13795 */ + { 0x0000, 0x0000, 0x0000 }, /* R13796 */ + { 0x0000, 0x0000, 0x0000 }, /* R13797 */ + { 0x0000, 0x0000, 0x0000 }, /* R13798 */ + { 0x0000, 0x0000, 0x0000 }, /* R13799 */ + { 0x0000, 0x0000, 0x0000 }, /* R13800 */ + { 0x0000, 0x0000, 0x0000 }, /* R13801 */ + { 0x0000, 0x0000, 0x0000 }, /* R13802 */ + { 0x0000, 0x0000, 0x0000 }, /* R13803 */ + { 0x0000, 0x0000, 0x0000 }, /* R13804 */ + { 0x0000, 0x0000, 0x0000 }, /* R13805 */ + { 0x0000, 0x0000, 0x0000 }, /* R13806 */ + { 0x0000, 0x0000, 0x0000 }, /* R13807 */ + { 0x0000, 0x0000, 0x0000 }, /* R13808 */ + { 0x0000, 0x0000, 0x0000 }, /* R13809 */ + { 0x0000, 0x0000, 0x0000 }, /* R13810 */ + { 0x0000, 0x0000, 0x0000 }, /* R13811 */ + { 0x0000, 0x0000, 0x0000 }, /* R13812 */ + { 0x0000, 0x0000, 0x0000 }, /* R13813 */ + { 0x0000, 0x0000, 0x0000 }, /* R13814 */ + { 0x0000, 0x0000, 0x0000 }, /* R13815 */ + { 0x0000, 0x0000, 0x0000 }, /* R13816 */ + { 0x0000, 0x0000, 0x0000 }, /* R13817 */ + { 0x0000, 0x0000, 0x0000 }, /* R13818 */ + { 0x0000, 0x0000, 0x0000 }, /* R13819 */ + { 0x0000, 0x0000, 0x0000 }, /* R13820 */ + { 0x0000, 0x0000, 0x0000 }, /* R13821 */ + { 0x0000, 0x0000, 0x0000 }, /* R13822 */ + { 0x0000, 0x0000, 0x0000 }, /* R13823 */ + { 0x0000, 0x0000, 0x0000 }, /* R13824 */ + { 0x0000, 0x0000, 0x0000 }, /* R13825 */ + { 0x0000, 0x0000, 0x0000 }, /* R13826 */ + { 0x0000, 0x0000, 0x0000 }, /* R13827 */ + { 0x0000, 0x0000, 0x0000 }, /* R13828 */ + { 0x0000, 0x0000, 0x0000 }, /* R13829 */ + { 0x0000, 0x0000, 0x0000 }, /* R13830 */ + { 0x0000, 0x0000, 0x0000 }, /* R13831 */ + { 0x0000, 0x0000, 0x0000 }, /* R13832 */ + { 0x0000, 0x0000, 0x0000 }, /* R13833 */ + { 0x0000, 0x0000, 0x0000 }, /* R13834 */ + { 0x0000, 0x0000, 0x0000 }, /* R13835 */ + { 0x0000, 0x0000, 0x0000 }, /* R13836 */ + { 0x0000, 0x0000, 0x0000 }, /* R13837 */ + { 0x0000, 0x0000, 0x0000 }, /* R13838 */ + { 0x0000, 0x0000, 0x0000 }, /* R13839 */ + { 0x0000, 0x0000, 0x0000 }, /* R13840 */ + { 0x0000, 0x0000, 0x0000 }, /* R13841 */ + { 0x0000, 0x0000, 0x0000 }, /* R13842 */ + { 0x0000, 0x0000, 0x0000 }, /* R13843 */ + { 0x0000, 0x0000, 0x0000 }, /* R13844 */ + { 0x0000, 0x0000, 0x0000 }, /* R13845 */ + { 0x0000, 0x0000, 0x0000 }, /* R13846 */ + { 0x0000, 0x0000, 0x0000 }, /* R13847 */ + { 0x0000, 0x0000, 0x0000 }, /* R13848 */ + { 0x0000, 0x0000, 0x0000 }, /* R13849 */ + { 0x0000, 0x0000, 0x0000 }, /* R13850 */ + { 0x0000, 0x0000, 0x0000 }, /* R13851 */ + { 0x0000, 0x0000, 0x0000 }, /* R13852 */ + { 0x0000, 0x0000, 0x0000 }, /* R13853 */ + { 0x0000, 0x0000, 0x0000 }, /* R13854 */ + { 0x0000, 0x0000, 0x0000 }, /* R13855 */ + { 0x0000, 0x0000, 0x0000 }, /* R13856 */ + { 0x0000, 0x0000, 0x0000 }, /* R13857 */ + { 0x0000, 0x0000, 0x0000 }, /* R13858 */ + { 0x0000, 0x0000, 0x0000 }, /* R13859 */ + { 0x0000, 0x0000, 0x0000 }, /* R13860 */ + { 0x0000, 0x0000, 0x0000 }, /* R13861 */ + { 0x0000, 0x0000, 0x0000 }, /* R13862 */ + { 0x0000, 0x0000, 0x0000 }, /* R13863 */ + { 0x0000, 0x0000, 0x0000 }, /* R13864 */ + { 0x0000, 0x0000, 0x0000 }, /* R13865 */ + { 0x0000, 0x0000, 0x0000 }, /* R13866 */ + { 0x0000, 0x0000, 0x0000 }, /* R13867 */ + { 0x0000, 0x0000, 0x0000 }, /* R13868 */ + { 0x0000, 0x0000, 0x0000 }, /* R13869 */ + { 0x0000, 0x0000, 0x0000 }, /* R13870 */ + { 0x0000, 0x0000, 0x0000 }, /* R13871 */ + { 0x0000, 0x0000, 0x0000 }, /* R13872 */ + { 0x0000, 0x0000, 0x0000 }, /* R13873 */ + { 0x0000, 0x0000, 0x0000 }, /* R13874 */ + { 0x0000, 0x0000, 0x0000 }, /* R13875 */ + { 0x0000, 0x0000, 0x0000 }, /* R13876 */ + { 0x0000, 0x0000, 0x0000 }, /* R13877 */ + { 0x0000, 0x0000, 0x0000 }, /* R13878 */ + { 0x0000, 0x0000, 0x0000 }, /* R13879 */ + { 0x0000, 0x0000, 0x0000 }, /* R13880 */ + { 0x0000, 0x0000, 0x0000 }, /* R13881 */ + { 0x0000, 0x0000, 0x0000 }, /* R13882 */ + { 0x0000, 0x0000, 0x0000 }, /* R13883 */ + { 0x0000, 0x0000, 0x0000 }, /* R13884 */ + { 0x0000, 0x0000, 0x0000 }, /* R13885 */ + { 0x0000, 0x0000, 0x0000 }, /* R13886 */ + { 0x0000, 0x0000, 0x0000 }, /* R13887 */ + { 0x0000, 0x0000, 0x0000 }, /* R13888 */ + { 0x0000, 0x0000, 0x0000 }, /* R13889 */ + { 0x0000, 0x0000, 0x0000 }, /* R13890 */ + { 0x0000, 0x0000, 0x0000 }, /* R13891 */ + { 0x0000, 0x0000, 0x0000 }, /* R13892 */ + { 0x0000, 0x0000, 0x0000 }, /* R13893 */ + { 0x0000, 0x0000, 0x0000 }, /* R13894 */ + { 0x0000, 0x0000, 0x0000 }, /* R13895 */ + { 0x0000, 0x0000, 0x0000 }, /* R13896 */ + { 0x0000, 0x0000, 0x0000 }, /* R13897 */ + { 0x0000, 0x0000, 0x0000 }, /* R13898 */ + { 0x0000, 0x0000, 0x0000 }, /* R13899 */ + { 0x0000, 0x0000, 0x0000 }, /* R13900 */ + { 0x0000, 0x0000, 0x0000 }, /* R13901 */ + { 0x0000, 0x0000, 0x0000 }, /* R13902 */ + { 0x0000, 0x0000, 0x0000 }, /* R13903 */ + { 0x0000, 0x0000, 0x0000 }, /* R13904 */ + { 0x0000, 0x0000, 0x0000 }, /* R13905 */ + { 0x0000, 0x0000, 0x0000 }, /* R13906 */ + { 0x0000, 0x0000, 0x0000 }, /* R13907 */ + { 0x0000, 0x0000, 0x0000 }, /* R13908 */ + { 0x0000, 0x0000, 0x0000 }, /* R13909 */ + { 0x0000, 0x0000, 0x0000 }, /* R13910 */ + { 0x0000, 0x0000, 0x0000 }, /* R13911 */ + { 0x0000, 0x0000, 0x0000 }, /* R13912 */ + { 0x0000, 0x0000, 0x0000 }, /* R13913 */ + { 0x0000, 0x0000, 0x0000 }, /* R13914 */ + { 0x0000, 0x0000, 0x0000 }, /* R13915 */ + { 0x0000, 0x0000, 0x0000 }, /* R13916 */ + { 0x0000, 0x0000, 0x0000 }, /* R13917 */ + { 0x0000, 0x0000, 0x0000 }, /* R13918 */ + { 0x0000, 0x0000, 0x0000 }, /* R13919 */ + { 0x0000, 0x0000, 0x0000 }, /* R13920 */ + { 0x0000, 0x0000, 0x0000 }, /* R13921 */ + { 0x0000, 0x0000, 0x0000 }, /* R13922 */ + { 0x0000, 0x0000, 0x0000 }, /* R13923 */ + { 0x0000, 0x0000, 0x0000 }, /* R13924 */ + { 0x0000, 0x0000, 0x0000 }, /* R13925 */ + { 0x0000, 0x0000, 0x0000 }, /* R13926 */ + { 0x0000, 0x0000, 0x0000 }, /* R13927 */ + { 0x0000, 0x0000, 0x0000 }, /* R13928 */ + { 0x0000, 0x0000, 0x0000 }, /* R13929 */ + { 0x0000, 0x0000, 0x0000 }, /* R13930 */ + { 0x0000, 0x0000, 0x0000 }, /* R13931 */ + { 0x0000, 0x0000, 0x0000 }, /* R13932 */ + { 0x0000, 0x0000, 0x0000 }, /* R13933 */ + { 0x0000, 0x0000, 0x0000 }, /* R13934 */ + { 0x0000, 0x0000, 0x0000 }, /* R13935 */ + { 0x0000, 0x0000, 0x0000 }, /* R13936 */ + { 0x0000, 0x0000, 0x0000 }, /* R13937 */ + { 0x0000, 0x0000, 0x0000 }, /* R13938 */ + { 0x0000, 0x0000, 0x0000 }, /* R13939 */ + { 0x0000, 0x0000, 0x0000 }, /* R13940 */ + { 0x0000, 0x0000, 0x0000 }, /* R13941 */ + { 0x0000, 0x0000, 0x0000 }, /* R13942 */ + { 0x0000, 0x0000, 0x0000 }, /* R13943 */ + { 0x0000, 0x0000, 0x0000 }, /* R13944 */ + { 0x0000, 0x0000, 0x0000 }, /* R13945 */ + { 0x0000, 0x0000, 0x0000 }, /* R13946 */ + { 0x0000, 0x0000, 0x0000 }, /* R13947 */ + { 0x0000, 0x0000, 0x0000 }, /* R13948 */ + { 0x0000, 0x0000, 0x0000 }, /* R13949 */ + { 0x0000, 0x0000, 0x0000 }, /* R13950 */ + { 0x0000, 0x0000, 0x0000 }, /* R13951 */ + { 0x0000, 0x0000, 0x0000 }, /* R13952 */ + { 0x0000, 0x0000, 0x0000 }, /* R13953 */ + { 0x0000, 0x0000, 0x0000 }, /* R13954 */ + { 0x0000, 0x0000, 0x0000 }, /* R13955 */ + { 0x0000, 0x0000, 0x0000 }, /* R13956 */ + { 0x0000, 0x0000, 0x0000 }, /* R13957 */ + { 0x0000, 0x0000, 0x0000 }, /* R13958 */ + { 0x0000, 0x0000, 0x0000 }, /* R13959 */ + { 0x0000, 0x0000, 0x0000 }, /* R13960 */ + { 0x0000, 0x0000, 0x0000 }, /* R13961 */ + { 0x0000, 0x0000, 0x0000 }, /* R13962 */ + { 0x0000, 0x0000, 0x0000 }, /* R13963 */ + { 0x0000, 0x0000, 0x0000 }, /* R13964 */ + { 0x0000, 0x0000, 0x0000 }, /* R13965 */ + { 0x0000, 0x0000, 0x0000 }, /* R13966 */ + { 0x0000, 0x0000, 0x0000 }, /* R13967 */ + { 0x0000, 0x0000, 0x0000 }, /* R13968 */ + { 0x0000, 0x0000, 0x0000 }, /* R13969 */ + { 0x0000, 0x0000, 0x0000 }, /* R13970 */ + { 0x0000, 0x0000, 0x0000 }, /* R13971 */ + { 0x0000, 0x0000, 0x0000 }, /* R13972 */ + { 0x0000, 0x0000, 0x0000 }, /* R13973 */ + { 0x0000, 0x0000, 0x0000 }, /* R13974 */ + { 0x0000, 0x0000, 0x0000 }, /* R13975 */ + { 0x0000, 0x0000, 0x0000 }, /* R13976 */ + { 0x0000, 0x0000, 0x0000 }, /* R13977 */ + { 0x0000, 0x0000, 0x0000 }, /* R13978 */ + { 0x0000, 0x0000, 0x0000 }, /* R13979 */ + { 0x0000, 0x0000, 0x0000 }, /* R13980 */ + { 0x0000, 0x0000, 0x0000 }, /* R13981 */ + { 0x0000, 0x0000, 0x0000 }, /* R13982 */ + { 0x0000, 0x0000, 0x0000 }, /* R13983 */ + { 0x0000, 0x0000, 0x0000 }, /* R13984 */ + { 0x0000, 0x0000, 0x0000 }, /* R13985 */ + { 0x0000, 0x0000, 0x0000 }, /* R13986 */ + { 0x0000, 0x0000, 0x0000 }, /* R13987 */ + { 0x0000, 0x0000, 0x0000 }, /* R13988 */ + { 0x0000, 0x0000, 0x0000 }, /* R13989 */ + { 0x0000, 0x0000, 0x0000 }, /* R13990 */ + { 0x0000, 0x0000, 0x0000 }, /* R13991 */ + { 0x0000, 0x0000, 0x0000 }, /* R13992 */ + { 0x0000, 0x0000, 0x0000 }, /* R13993 */ + { 0x0000, 0x0000, 0x0000 }, /* R13994 */ + { 0x0000, 0x0000, 0x0000 }, /* R13995 */ + { 0x0000, 0x0000, 0x0000 }, /* R13996 */ + { 0x0000, 0x0000, 0x0000 }, /* R13997 */ + { 0x0000, 0x0000, 0x0000 }, /* R13998 */ + { 0x0000, 0x0000, 0x0000 }, /* R13999 */ + { 0x0000, 0x0000, 0x0000 }, /* R14000 */ + { 0x0000, 0x0000, 0x0000 }, /* R14001 */ + { 0x0000, 0x0000, 0x0000 }, /* R14002 */ + { 0x0000, 0x0000, 0x0000 }, /* R14003 */ + { 0x0000, 0x0000, 0x0000 }, /* R14004 */ + { 0x0000, 0x0000, 0x0000 }, /* R14005 */ + { 0x0000, 0x0000, 0x0000 }, /* R14006 */ + { 0x0000, 0x0000, 0x0000 }, /* R14007 */ + { 0x0000, 0x0000, 0x0000 }, /* R14008 */ + { 0x0000, 0x0000, 0x0000 }, /* R14009 */ + { 0x0000, 0x0000, 0x0000 }, /* R14010 */ + { 0x0000, 0x0000, 0x0000 }, /* R14011 */ + { 0x0000, 0x0000, 0x0000 }, /* R14012 */ + { 0x0000, 0x0000, 0x0000 }, /* R14013 */ + { 0x0000, 0x0000, 0x0000 }, /* R14014 */ + { 0x0000, 0x0000, 0x0000 }, /* R14015 */ + { 0x0000, 0x0000, 0x0000 }, /* R14016 */ + { 0x0000, 0x0000, 0x0000 }, /* R14017 */ + { 0x0000, 0x0000, 0x0000 }, /* R14018 */ + { 0x0000, 0x0000, 0x0000 }, /* R14019 */ + { 0x0000, 0x0000, 0x0000 }, /* R14020 */ + { 0x0000, 0x0000, 0x0000 }, /* R14021 */ + { 0x0000, 0x0000, 0x0000 }, /* R14022 */ + { 0x0000, 0x0000, 0x0000 }, /* R14023 */ + { 0x0000, 0x0000, 0x0000 }, /* R14024 */ + { 0x0000, 0x0000, 0x0000 }, /* R14025 */ + { 0x0000, 0x0000, 0x0000 }, /* R14026 */ + { 0x0000, 0x0000, 0x0000 }, /* R14027 */ + { 0x0000, 0x0000, 0x0000 }, /* R14028 */ + { 0x0000, 0x0000, 0x0000 }, /* R14029 */ + { 0x0000, 0x0000, 0x0000 }, /* R14030 */ + { 0x0000, 0x0000, 0x0000 }, /* R14031 */ + { 0x0000, 0x0000, 0x0000 }, /* R14032 */ + { 0x0000, 0x0000, 0x0000 }, /* R14033 */ + { 0x0000, 0x0000, 0x0000 }, /* R14034 */ + { 0x0000, 0x0000, 0x0000 }, /* R14035 */ + { 0x0000, 0x0000, 0x0000 }, /* R14036 */ + { 0x0000, 0x0000, 0x0000 }, /* R14037 */ + { 0x0000, 0x0000, 0x0000 }, /* R14038 */ + { 0x0000, 0x0000, 0x0000 }, /* R14039 */ + { 0x0000, 0x0000, 0x0000 }, /* R14040 */ + { 0x0000, 0x0000, 0x0000 }, /* R14041 */ + { 0x0000, 0x0000, 0x0000 }, /* R14042 */ + { 0x0000, 0x0000, 0x0000 }, /* R14043 */ + { 0x0000, 0x0000, 0x0000 }, /* R14044 */ + { 0x0000, 0x0000, 0x0000 }, /* R14045 */ + { 0x0000, 0x0000, 0x0000 }, /* R14046 */ + { 0x0000, 0x0000, 0x0000 }, /* R14047 */ + { 0x0000, 0x0000, 0x0000 }, /* R14048 */ + { 0x0000, 0x0000, 0x0000 }, /* R14049 */ + { 0x0000, 0x0000, 0x0000 }, /* R14050 */ + { 0x0000, 0x0000, 0x0000 }, /* R14051 */ + { 0x0000, 0x0000, 0x0000 }, /* R14052 */ + { 0x0000, 0x0000, 0x0000 }, /* R14053 */ + { 0x0000, 0x0000, 0x0000 }, /* R14054 */ + { 0x0000, 0x0000, 0x0000 }, /* R14055 */ + { 0x0000, 0x0000, 0x0000 }, /* R14056 */ + { 0x0000, 0x0000, 0x0000 }, /* R14057 */ + { 0x0000, 0x0000, 0x0000 }, /* R14058 */ + { 0x0000, 0x0000, 0x0000 }, /* R14059 */ + { 0x0000, 0x0000, 0x0000 }, /* R14060 */ + { 0x0000, 0x0000, 0x0000 }, /* R14061 */ + { 0x0000, 0x0000, 0x0000 }, /* R14062 */ + { 0x0000, 0x0000, 0x0000 }, /* R14063 */ + { 0x0000, 0x0000, 0x0000 }, /* R14064 */ + { 0x0000, 0x0000, 0x0000 }, /* R14065 */ + { 0x0000, 0x0000, 0x0000 }, /* R14066 */ + { 0x0000, 0x0000, 0x0000 }, /* R14067 */ + { 0x0000, 0x0000, 0x0000 }, /* R14068 */ + { 0x0000, 0x0000, 0x0000 }, /* R14069 */ + { 0x0000, 0x0000, 0x0000 }, /* R14070 */ + { 0x0000, 0x0000, 0x0000 }, /* R14071 */ + { 0x0000, 0x0000, 0x0000 }, /* R14072 */ + { 0x0000, 0x0000, 0x0000 }, /* R14073 */ + { 0x0000, 0x0000, 0x0000 }, /* R14074 */ + { 0x0000, 0x0000, 0x0000 }, /* R14075 */ + { 0x0000, 0x0000, 0x0000 }, /* R14076 */ + { 0x0000, 0x0000, 0x0000 }, /* R14077 */ + { 0x0000, 0x0000, 0x0000 }, /* R14078 */ + { 0x0000, 0x0000, 0x0000 }, /* R14079 */ + { 0x0000, 0x0000, 0x0000 }, /* R14080 */ + { 0x0000, 0x0000, 0x0000 }, /* R14081 */ + { 0x0000, 0x0000, 0x0000 }, /* R14082 */ + { 0x0000, 0x0000, 0x0000 }, /* R14083 */ + { 0x0000, 0x0000, 0x0000 }, /* R14084 */ + { 0x0000, 0x0000, 0x0000 }, /* R14085 */ + { 0x0000, 0x0000, 0x0000 }, /* R14086 */ + { 0x0000, 0x0000, 0x0000 }, /* R14087 */ + { 0x0000, 0x0000, 0x0000 }, /* R14088 */ + { 0x0000, 0x0000, 0x0000 }, /* R14089 */ + { 0x0000, 0x0000, 0x0000 }, /* R14090 */ + { 0x0000, 0x0000, 0x0000 }, /* R14091 */ + { 0x0000, 0x0000, 0x0000 }, /* R14092 */ + { 0x0000, 0x0000, 0x0000 }, /* R14093 */ + { 0x0000, 0x0000, 0x0000 }, /* R14094 */ + { 0x0000, 0x0000, 0x0000 }, /* R14095 */ + { 0x0000, 0x0000, 0x0000 }, /* R14096 */ + { 0x0000, 0x0000, 0x0000 }, /* R14097 */ + { 0x0000, 0x0000, 0x0000 }, /* R14098 */ + { 0x0000, 0x0000, 0x0000 }, /* R14099 */ + { 0x0000, 0x0000, 0x0000 }, /* R14100 */ + { 0x0000, 0x0000, 0x0000 }, /* R14101 */ + { 0x0000, 0x0000, 0x0000 }, /* R14102 */ + { 0x0000, 0x0000, 0x0000 }, /* R14103 */ + { 0x0000, 0x0000, 0x0000 }, /* R14104 */ + { 0x0000, 0x0000, 0x0000 }, /* R14105 */ + { 0x0000, 0x0000, 0x0000 }, /* R14106 */ + { 0x0000, 0x0000, 0x0000 }, /* R14107 */ + { 0x0000, 0x0000, 0x0000 }, /* R14108 */ + { 0x0000, 0x0000, 0x0000 }, /* R14109 */ + { 0x0000, 0x0000, 0x0000 }, /* R14110 */ + { 0x0000, 0x0000, 0x0000 }, /* R14111 */ + { 0x0000, 0x0000, 0x0000 }, /* R14112 */ + { 0x0000, 0x0000, 0x0000 }, /* R14113 */ + { 0x0000, 0x0000, 0x0000 }, /* R14114 */ + { 0x0000, 0x0000, 0x0000 }, /* R14115 */ + { 0x0000, 0x0000, 0x0000 }, /* R14116 */ + { 0x0000, 0x0000, 0x0000 }, /* R14117 */ + { 0x0000, 0x0000, 0x0000 }, /* R14118 */ + { 0x0000, 0x0000, 0x0000 }, /* R14119 */ + { 0x0000, 0x0000, 0x0000 }, /* R14120 */ + { 0x0000, 0x0000, 0x0000 }, /* R14121 */ + { 0x0000, 0x0000, 0x0000 }, /* R14122 */ + { 0x0000, 0x0000, 0x0000 }, /* R14123 */ + { 0x0000, 0x0000, 0x0000 }, /* R14124 */ + { 0x0000, 0x0000, 0x0000 }, /* R14125 */ + { 0x0000, 0x0000, 0x0000 }, /* R14126 */ + { 0x0000, 0x0000, 0x0000 }, /* R14127 */ + { 0x0000, 0x0000, 0x0000 }, /* R14128 */ + { 0x0000, 0x0000, 0x0000 }, /* R14129 */ + { 0x0000, 0x0000, 0x0000 }, /* R14130 */ + { 0x0000, 0x0000, 0x0000 }, /* R14131 */ + { 0x0000, 0x0000, 0x0000 }, /* R14132 */ + { 0x0000, 0x0000, 0x0000 }, /* R14133 */ + { 0x0000, 0x0000, 0x0000 }, /* R14134 */ + { 0x0000, 0x0000, 0x0000 }, /* R14135 */ + { 0x0000, 0x0000, 0x0000 }, /* R14136 */ + { 0x0000, 0x0000, 0x0000 }, /* R14137 */ + { 0x0000, 0x0000, 0x0000 }, /* R14138 */ + { 0x0000, 0x0000, 0x0000 }, /* R14139 */ + { 0x0000, 0x0000, 0x0000 }, /* R14140 */ + { 0x0000, 0x0000, 0x0000 }, /* R14141 */ + { 0x0000, 0x0000, 0x0000 }, /* R14142 */ + { 0x0000, 0x0000, 0x0000 }, /* R14143 */ + { 0x0000, 0x0000, 0x0000 }, /* R14144 */ + { 0x0000, 0x0000, 0x0000 }, /* R14145 */ + { 0x0000, 0x0000, 0x0000 }, /* R14146 */ + { 0x0000, 0x0000, 0x0000 }, /* R14147 */ + { 0x0000, 0x0000, 0x0000 }, /* R14148 */ + { 0x0000, 0x0000, 0x0000 }, /* R14149 */ + { 0x0000, 0x0000, 0x0000 }, /* R14150 */ + { 0x0000, 0x0000, 0x0000 }, /* R14151 */ + { 0x0000, 0x0000, 0x0000 }, /* R14152 */ + { 0x0000, 0x0000, 0x0000 }, /* R14153 */ + { 0x0000, 0x0000, 0x0000 }, /* R14154 */ + { 0x0000, 0x0000, 0x0000 }, /* R14155 */ + { 0x0000, 0x0000, 0x0000 }, /* R14156 */ + { 0x0000, 0x0000, 0x0000 }, /* R14157 */ + { 0x0000, 0x0000, 0x0000 }, /* R14158 */ + { 0x0000, 0x0000, 0x0000 }, /* R14159 */ + { 0x0000, 0x0000, 0x0000 }, /* R14160 */ + { 0x0000, 0x0000, 0x0000 }, /* R14161 */ + { 0x0000, 0x0000, 0x0000 }, /* R14162 */ + { 0x0000, 0x0000, 0x0000 }, /* R14163 */ + { 0x0000, 0x0000, 0x0000 }, /* R14164 */ + { 0x0000, 0x0000, 0x0000 }, /* R14165 */ + { 0x0000, 0x0000, 0x0000 }, /* R14166 */ + { 0x0000, 0x0000, 0x0000 }, /* R14167 */ + { 0x0000, 0x0000, 0x0000 }, /* R14168 */ + { 0x0000, 0x0000, 0x0000 }, /* R14169 */ + { 0x0000, 0x0000, 0x0000 }, /* R14170 */ + { 0x0000, 0x0000, 0x0000 }, /* R14171 */ + { 0x0000, 0x0000, 0x0000 }, /* R14172 */ + { 0x0000, 0x0000, 0x0000 }, /* R14173 */ + { 0x0000, 0x0000, 0x0000 }, /* R14174 */ + { 0x0000, 0x0000, 0x0000 }, /* R14175 */ + { 0x0000, 0x0000, 0x0000 }, /* R14176 */ + { 0x0000, 0x0000, 0x0000 }, /* R14177 */ + { 0x0000, 0x0000, 0x0000 }, /* R14178 */ + { 0x0000, 0x0000, 0x0000 }, /* R14179 */ + { 0x0000, 0x0000, 0x0000 }, /* R14180 */ + { 0x0000, 0x0000, 0x0000 }, /* R14181 */ + { 0x0000, 0x0000, 0x0000 }, /* R14182 */ + { 0x0000, 0x0000, 0x0000 }, /* R14183 */ + { 0x0000, 0x0000, 0x0000 }, /* R14184 */ + { 0x0000, 0x0000, 0x0000 }, /* R14185 */ + { 0x0000, 0x0000, 0x0000 }, /* R14186 */ + { 0x0000, 0x0000, 0x0000 }, /* R14187 */ + { 0x0000, 0x0000, 0x0000 }, /* R14188 */ + { 0x0000, 0x0000, 0x0000 }, /* R14189 */ + { 0x0000, 0x0000, 0x0000 }, /* R14190 */ + { 0x0000, 0x0000, 0x0000 }, /* R14191 */ + { 0x0000, 0x0000, 0x0000 }, /* R14192 */ + { 0x0000, 0x0000, 0x0000 }, /* R14193 */ + { 0x0000, 0x0000, 0x0000 }, /* R14194 */ + { 0x0000, 0x0000, 0x0000 }, /* R14195 */ + { 0x0000, 0x0000, 0x0000 }, /* R14196 */ + { 0x0000, 0x0000, 0x0000 }, /* R14197 */ + { 0x0000, 0x0000, 0x0000 }, /* R14198 */ + { 0x0000, 0x0000, 0x0000 }, /* R14199 */ + { 0x0000, 0x0000, 0x0000 }, /* R14200 */ + { 0x0000, 0x0000, 0x0000 }, /* R14201 */ + { 0x0000, 0x0000, 0x0000 }, /* R14202 */ + { 0x0000, 0x0000, 0x0000 }, /* R14203 */ + { 0x0000, 0x0000, 0x0000 }, /* R14204 */ + { 0x0000, 0x0000, 0x0000 }, /* R14205 */ + { 0x0000, 0x0000, 0x0000 }, /* R14206 */ + { 0x0000, 0x0000, 0x0000 }, /* R14207 */ + { 0x0000, 0x0000, 0x0000 }, /* R14208 */ + { 0x0000, 0x0000, 0x0000 }, /* R14209 */ + { 0x0000, 0x0000, 0x0000 }, /* R14210 */ + { 0x0000, 0x0000, 0x0000 }, /* R14211 */ + { 0x0000, 0x0000, 0x0000 }, /* R14212 */ + { 0x0000, 0x0000, 0x0000 }, /* R14213 */ + { 0x0000, 0x0000, 0x0000 }, /* R14214 */ + { 0x0000, 0x0000, 0x0000 }, /* R14215 */ + { 0x0000, 0x0000, 0x0000 }, /* R14216 */ + { 0x0000, 0x0000, 0x0000 }, /* R14217 */ + { 0x0000, 0x0000, 0x0000 }, /* R14218 */ + { 0x0000, 0x0000, 0x0000 }, /* R14219 */ + { 0x0000, 0x0000, 0x0000 }, /* R14220 */ + { 0x0000, 0x0000, 0x0000 }, /* R14221 */ + { 0x0000, 0x0000, 0x0000 }, /* R14222 */ + { 0x0000, 0x0000, 0x0000 }, /* R14223 */ + { 0x0000, 0x0000, 0x0000 }, /* R14224 */ + { 0x0000, 0x0000, 0x0000 }, /* R14225 */ + { 0x0000, 0x0000, 0x0000 }, /* R14226 */ + { 0x0000, 0x0000, 0x0000 }, /* R14227 */ + { 0x0000, 0x0000, 0x0000 }, /* R14228 */ + { 0x0000, 0x0000, 0x0000 }, /* R14229 */ + { 0x0000, 0x0000, 0x0000 }, /* R14230 */ + { 0x0000, 0x0000, 0x0000 }, /* R14231 */ + { 0x0000, 0x0000, 0x0000 }, /* R14232 */ + { 0x0000, 0x0000, 0x0000 }, /* R14233 */ + { 0x0000, 0x0000, 0x0000 }, /* R14234 */ + { 0x0000, 0x0000, 0x0000 }, /* R14235 */ + { 0x0000, 0x0000, 0x0000 }, /* R14236 */ + { 0x0000, 0x0000, 0x0000 }, /* R14237 */ + { 0x0000, 0x0000, 0x0000 }, /* R14238 */ + { 0x0000, 0x0000, 0x0000 }, /* R14239 */ + { 0x0000, 0x0000, 0x0000 }, /* R14240 */ + { 0x0000, 0x0000, 0x0000 }, /* R14241 */ + { 0x0000, 0x0000, 0x0000 }, /* R14242 */ + { 0x0000, 0x0000, 0x0000 }, /* R14243 */ + { 0x0000, 0x0000, 0x0000 }, /* R14244 */ + { 0x0000, 0x0000, 0x0000 }, /* R14245 */ + { 0x0000, 0x0000, 0x0000 }, /* R14246 */ + { 0x0000, 0x0000, 0x0000 }, /* R14247 */ + { 0x0000, 0x0000, 0x0000 }, /* R14248 */ + { 0x0000, 0x0000, 0x0000 }, /* R14249 */ + { 0x0000, 0x0000, 0x0000 }, /* R14250 */ + { 0x0000, 0x0000, 0x0000 }, /* R14251 */ + { 0x0000, 0x0000, 0x0000 }, /* R14252 */ + { 0x0000, 0x0000, 0x0000 }, /* R14253 */ + { 0x0000, 0x0000, 0x0000 }, /* R14254 */ + { 0x0000, 0x0000, 0x0000 }, /* R14255 */ + { 0x0000, 0x0000, 0x0000 }, /* R14256 */ + { 0x0000, 0x0000, 0x0000 }, /* R14257 */ + { 0x0000, 0x0000, 0x0000 }, /* R14258 */ + { 0x0000, 0x0000, 0x0000 }, /* R14259 */ + { 0x0000, 0x0000, 0x0000 }, /* R14260 */ + { 0x0000, 0x0000, 0x0000 }, /* R14261 */ + { 0x0000, 0x0000, 0x0000 }, /* R14262 */ + { 0x0000, 0x0000, 0x0000 }, /* R14263 */ + { 0x0000, 0x0000, 0x0000 }, /* R14264 */ + { 0x0000, 0x0000, 0x0000 }, /* R14265 */ + { 0x0000, 0x0000, 0x0000 }, /* R14266 */ + { 0x0000, 0x0000, 0x0000 }, /* R14267 */ + { 0x0000, 0x0000, 0x0000 }, /* R14268 */ + { 0x0000, 0x0000, 0x0000 }, /* R14269 */ + { 0x0000, 0x0000, 0x0000 }, /* R14270 */ + { 0x0000, 0x0000, 0x0000 }, /* R14271 */ + { 0x0000, 0x0000, 0x0000 }, /* R14272 */ + { 0x0000, 0x0000, 0x0000 }, /* R14273 */ + { 0x0000, 0x0000, 0x0000 }, /* R14274 */ + { 0x0000, 0x0000, 0x0000 }, /* R14275 */ + { 0x0000, 0x0000, 0x0000 }, /* R14276 */ + { 0x0000, 0x0000, 0x0000 }, /* R14277 */ + { 0x0000, 0x0000, 0x0000 }, /* R14278 */ + { 0x0000, 0x0000, 0x0000 }, /* R14279 */ + { 0x0000, 0x0000, 0x0000 }, /* R14280 */ + { 0x0000, 0x0000, 0x0000 }, /* R14281 */ + { 0x0000, 0x0000, 0x0000 }, /* R14282 */ + { 0x0000, 0x0000, 0x0000 }, /* R14283 */ + { 0x0000, 0x0000, 0x0000 }, /* R14284 */ + { 0x0000, 0x0000, 0x0000 }, /* R14285 */ + { 0x0000, 0x0000, 0x0000 }, /* R14286 */ + { 0x0000, 0x0000, 0x0000 }, /* R14287 */ + { 0x0000, 0x0000, 0x0000 }, /* R14288 */ + { 0x0000, 0x0000, 0x0000 }, /* R14289 */ + { 0x0000, 0x0000, 0x0000 }, /* R14290 */ + { 0x0000, 0x0000, 0x0000 }, /* R14291 */ + { 0x0000, 0x0000, 0x0000 }, /* R14292 */ + { 0x0000, 0x0000, 0x0000 }, /* R14293 */ + { 0x0000, 0x0000, 0x0000 }, /* R14294 */ + { 0x0000, 0x0000, 0x0000 }, /* R14295 */ + { 0x0000, 0x0000, 0x0000 }, /* R14296 */ + { 0x0000, 0x0000, 0x0000 }, /* R14297 */ + { 0x0000, 0x0000, 0x0000 }, /* R14298 */ + { 0x0000, 0x0000, 0x0000 }, /* R14299 */ + { 0x0000, 0x0000, 0x0000 }, /* R14300 */ + { 0x0000, 0x0000, 0x0000 }, /* R14301 */ + { 0x0000, 0x0000, 0x0000 }, /* R14302 */ + { 0x0000, 0x0000, 0x0000 }, /* R14303 */ + { 0x0000, 0x0000, 0x0000 }, /* R14304 */ + { 0x0000, 0x0000, 0x0000 }, /* R14305 */ + { 0x0000, 0x0000, 0x0000 }, /* R14306 */ + { 0x0000, 0x0000, 0x0000 }, /* R14307 */ + { 0x0000, 0x0000, 0x0000 }, /* R14308 */ + { 0x0000, 0x0000, 0x0000 }, /* R14309 */ + { 0x0000, 0x0000, 0x0000 }, /* R14310 */ + { 0x0000, 0x0000, 0x0000 }, /* R14311 */ + { 0x0000, 0x0000, 0x0000 }, /* R14312 */ + { 0x0000, 0x0000, 0x0000 }, /* R14313 */ + { 0x0000, 0x0000, 0x0000 }, /* R14314 */ + { 0x0000, 0x0000, 0x0000 }, /* R14315 */ + { 0x0000, 0x0000, 0x0000 }, /* R14316 */ + { 0x0000, 0x0000, 0x0000 }, /* R14317 */ + { 0x0000, 0x0000, 0x0000 }, /* R14318 */ + { 0x0000, 0x0000, 0x0000 }, /* R14319 */ + { 0x0000, 0x0000, 0x0000 }, /* R14320 */ + { 0x0000, 0x0000, 0x0000 }, /* R14321 */ + { 0x0000, 0x0000, 0x0000 }, /* R14322 */ + { 0x0000, 0x0000, 0x0000 }, /* R14323 */ + { 0x0000, 0x0000, 0x0000 }, /* R14324 */ + { 0x0000, 0x0000, 0x0000 }, /* R14325 */ + { 0x0000, 0x0000, 0x0000 }, /* R14326 */ + { 0x0000, 0x0000, 0x0000 }, /* R14327 */ + { 0x0000, 0x0000, 0x0000 }, /* R14328 */ + { 0x0000, 0x0000, 0x0000 }, /* R14329 */ + { 0x0000, 0x0000, 0x0000 }, /* R14330 */ + { 0x0000, 0x0000, 0x0000 }, /* R14331 */ + { 0x0000, 0x0000, 0x0000 }, /* R14332 */ + { 0x0000, 0x0000, 0x0000 }, /* R14333 */ + { 0x0000, 0x0000, 0x0000 }, /* R14334 */ + { 0x0000, 0x0000, 0x0000 }, /* R14335 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R14336 - DSP2 Data3 RAM 1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R14337 - DSP2 Data3 RAM 0 */ + { 0x0000, 0x0000, 0x0000 }, /* R14338 */ + { 0x0000, 0x0000, 0x0000 }, /* R14339 */ + { 0x0000, 0x0000, 0x0000 }, /* R14340 */ + { 0x0000, 0x0000, 0x0000 }, /* R14341 */ + { 0x0000, 0x0000, 0x0000 }, /* R14342 */ + { 0x0000, 0x0000, 0x0000 }, /* R14343 */ + { 0x0000, 0x0000, 0x0000 }, /* R14344 */ + { 0x0000, 0x0000, 0x0000 }, /* R14345 */ + { 0x0000, 0x0000, 0x0000 }, /* R14346 */ + { 0x0000, 0x0000, 0x0000 }, /* R14347 */ + { 0x0000, 0x0000, 0x0000 }, /* R14348 */ + { 0x0000, 0x0000, 0x0000 }, /* R14349 */ + { 0x0000, 0x0000, 0x0000 }, /* R14350 */ + { 0x0000, 0x0000, 0x0000 }, /* R14351 */ + { 0x0000, 0x0000, 0x0000 }, /* R14352 */ + { 0x0000, 0x0000, 0x0000 }, /* R14353 */ + { 0x0000, 0x0000, 0x0000 }, /* R14354 */ + { 0x0000, 0x0000, 0x0000 }, /* R14355 */ + { 0x0000, 0x0000, 0x0000 }, /* R14356 */ + { 0x0000, 0x0000, 0x0000 }, /* R14357 */ + { 0x0000, 0x0000, 0x0000 }, /* R14358 */ + { 0x0000, 0x0000, 0x0000 }, /* R14359 */ + { 0x0000, 0x0000, 0x0000 }, /* R14360 */ + { 0x0000, 0x0000, 0x0000 }, /* R14361 */ + { 0x0000, 0x0000, 0x0000 }, /* R14362 */ + { 0x0000, 0x0000, 0x0000 }, /* R14363 */ + { 0x0000, 0x0000, 0x0000 }, /* R14364 */ + { 0x0000, 0x0000, 0x0000 }, /* R14365 */ + { 0x0000, 0x0000, 0x0000 }, /* R14366 */ + { 0x0000, 0x0000, 0x0000 }, /* R14367 */ + { 0x0000, 0x0000, 0x0000 }, /* R14368 */ + { 0x0000, 0x0000, 0x0000 }, /* R14369 */ + { 0x0000, 0x0000, 0x0000 }, /* R14370 */ + { 0x0000, 0x0000, 0x0000 }, /* R14371 */ + { 0x0000, 0x0000, 0x0000 }, /* R14372 */ + { 0x0000, 0x0000, 0x0000 }, /* R14373 */ + { 0x0000, 0x0000, 0x0000 }, /* R14374 */ + { 0x0000, 0x0000, 0x0000 }, /* R14375 */ + { 0x0000, 0x0000, 0x0000 }, /* R14376 */ + { 0x0000, 0x0000, 0x0000 }, /* R14377 */ + { 0x0000, 0x0000, 0x0000 }, /* R14378 */ + { 0x0000, 0x0000, 0x0000 }, /* R14379 */ + { 0x0000, 0x0000, 0x0000 }, /* R14380 */ + { 0x0000, 0x0000, 0x0000 }, /* R14381 */ + { 0x0000, 0x0000, 0x0000 }, /* R14382 */ + { 0x0000, 0x0000, 0x0000 }, /* R14383 */ + { 0x0000, 0x0000, 0x0000 }, /* R14384 */ + { 0x0000, 0x0000, 0x0000 }, /* R14385 */ + { 0x0000, 0x0000, 0x0000 }, /* R14386 */ + { 0x0000, 0x0000, 0x0000 }, /* R14387 */ + { 0x0000, 0x0000, 0x0000 }, /* R14388 */ + { 0x0000, 0x0000, 0x0000 }, /* R14389 */ + { 0x0000, 0x0000, 0x0000 }, /* R14390 */ + { 0x0000, 0x0000, 0x0000 }, /* R14391 */ + { 0x0000, 0x0000, 0x0000 }, /* R14392 */ + { 0x0000, 0x0000, 0x0000 }, /* R14393 */ + { 0x0000, 0x0000, 0x0000 }, /* R14394 */ + { 0x0000, 0x0000, 0x0000 }, /* R14395 */ + { 0x0000, 0x0000, 0x0000 }, /* R14396 */ + { 0x0000, 0x0000, 0x0000 }, /* R14397 */ + { 0x0000, 0x0000, 0x0000 }, /* R14398 */ + { 0x0000, 0x0000, 0x0000 }, /* R14399 */ + { 0x0000, 0x0000, 0x0000 }, /* R14400 */ + { 0x0000, 0x0000, 0x0000 }, /* R14401 */ + { 0x0000, 0x0000, 0x0000 }, /* R14402 */ + { 0x0000, 0x0000, 0x0000 }, /* R14403 */ + { 0x0000, 0x0000, 0x0000 }, /* R14404 */ + { 0x0000, 0x0000, 0x0000 }, /* R14405 */ + { 0x0000, 0x0000, 0x0000 }, /* R14406 */ + { 0x0000, 0x0000, 0x0000 }, /* R14407 */ + { 0x0000, 0x0000, 0x0000 }, /* R14408 */ + { 0x0000, 0x0000, 0x0000 }, /* R14409 */ + { 0x0000, 0x0000, 0x0000 }, /* R14410 */ + { 0x0000, 0x0000, 0x0000 }, /* R14411 */ + { 0x0000, 0x0000, 0x0000 }, /* R14412 */ + { 0x0000, 0x0000, 0x0000 }, /* R14413 */ + { 0x0000, 0x0000, 0x0000 }, /* R14414 */ + { 0x0000, 0x0000, 0x0000 }, /* R14415 */ + { 0x0000, 0x0000, 0x0000 }, /* R14416 */ + { 0x0000, 0x0000, 0x0000 }, /* R14417 */ + { 0x0000, 0x0000, 0x0000 }, /* R14418 */ + { 0x0000, 0x0000, 0x0000 }, /* R14419 */ + { 0x0000, 0x0000, 0x0000 }, /* R14420 */ + { 0x0000, 0x0000, 0x0000 }, /* R14421 */ + { 0x0000, 0x0000, 0x0000 }, /* R14422 */ + { 0x0000, 0x0000, 0x0000 }, /* R14423 */ + { 0x0000, 0x0000, 0x0000 }, /* R14424 */ + { 0x0000, 0x0000, 0x0000 }, /* R14425 */ + { 0x0000, 0x0000, 0x0000 }, /* R14426 */ + { 0x0000, 0x0000, 0x0000 }, /* R14427 */ + { 0x0000, 0x0000, 0x0000 }, /* R14428 */ + { 0x0000, 0x0000, 0x0000 }, /* R14429 */ + { 0x0000, 0x0000, 0x0000 }, /* R14430 */ + { 0x0000, 0x0000, 0x0000 }, /* R14431 */ + { 0x0000, 0x0000, 0x0000 }, /* R14432 */ + { 0x0000, 0x0000, 0x0000 }, /* R14433 */ + { 0x0000, 0x0000, 0x0000 }, /* R14434 */ + { 0x0000, 0x0000, 0x0000 }, /* R14435 */ + { 0x0000, 0x0000, 0x0000 }, /* R14436 */ + { 0x0000, 0x0000, 0x0000 }, /* R14437 */ + { 0x0000, 0x0000, 0x0000 }, /* R14438 */ + { 0x0000, 0x0000, 0x0000 }, /* R14439 */ + { 0x0000, 0x0000, 0x0000 }, /* R14440 */ + { 0x0000, 0x0000, 0x0000 }, /* R14441 */ + { 0x0000, 0x0000, 0x0000 }, /* R14442 */ + { 0x0000, 0x0000, 0x0000 }, /* R14443 */ + { 0x0000, 0x0000, 0x0000 }, /* R14444 */ + { 0x0000, 0x0000, 0x0000 }, /* R14445 */ + { 0x0000, 0x0000, 0x0000 }, /* R14446 */ + { 0x0000, 0x0000, 0x0000 }, /* R14447 */ + { 0x0000, 0x0000, 0x0000 }, /* R14448 */ + { 0x0000, 0x0000, 0x0000 }, /* R14449 */ + { 0x0000, 0x0000, 0x0000 }, /* R14450 */ + { 0x0000, 0x0000, 0x0000 }, /* R14451 */ + { 0x0000, 0x0000, 0x0000 }, /* R14452 */ + { 0x0000, 0x0000, 0x0000 }, /* R14453 */ + { 0x0000, 0x0000, 0x0000 }, /* R14454 */ + { 0x0000, 0x0000, 0x0000 }, /* R14455 */ + { 0x0000, 0x0000, 0x0000 }, /* R14456 */ + { 0x0000, 0x0000, 0x0000 }, /* R14457 */ + { 0x0000, 0x0000, 0x0000 }, /* R14458 */ + { 0x0000, 0x0000, 0x0000 }, /* R14459 */ + { 0x0000, 0x0000, 0x0000 }, /* R14460 */ + { 0x0000, 0x0000, 0x0000 }, /* R14461 */ + { 0x0000, 0x0000, 0x0000 }, /* R14462 */ + { 0x0000, 0x0000, 0x0000 }, /* R14463 */ + { 0x0000, 0x0000, 0x0000 }, /* R14464 */ + { 0x0000, 0x0000, 0x0000 }, /* R14465 */ + { 0x0000, 0x0000, 0x0000 }, /* R14466 */ + { 0x0000, 0x0000, 0x0000 }, /* R14467 */ + { 0x0000, 0x0000, 0x0000 }, /* R14468 */ + { 0x0000, 0x0000, 0x0000 }, /* R14469 */ + { 0x0000, 0x0000, 0x0000 }, /* R14470 */ + { 0x0000, 0x0000, 0x0000 }, /* R14471 */ + { 0x0000, 0x0000, 0x0000 }, /* R14472 */ + { 0x0000, 0x0000, 0x0000 }, /* R14473 */ + { 0x0000, 0x0000, 0x0000 }, /* R14474 */ + { 0x0000, 0x0000, 0x0000 }, /* R14475 */ + { 0x0000, 0x0000, 0x0000 }, /* R14476 */ + { 0x0000, 0x0000, 0x0000 }, /* R14477 */ + { 0x0000, 0x0000, 0x0000 }, /* R14478 */ + { 0x0000, 0x0000, 0x0000 }, /* R14479 */ + { 0x0000, 0x0000, 0x0000 }, /* R14480 */ + { 0x0000, 0x0000, 0x0000 }, /* R14481 */ + { 0x0000, 0x0000, 0x0000 }, /* R14482 */ + { 0x0000, 0x0000, 0x0000 }, /* R14483 */ + { 0x0000, 0x0000, 0x0000 }, /* R14484 */ + { 0x0000, 0x0000, 0x0000 }, /* R14485 */ + { 0x0000, 0x0000, 0x0000 }, /* R14486 */ + { 0x0000, 0x0000, 0x0000 }, /* R14487 */ + { 0x0000, 0x0000, 0x0000 }, /* R14488 */ + { 0x0000, 0x0000, 0x0000 }, /* R14489 */ + { 0x0000, 0x0000, 0x0000 }, /* R14490 */ + { 0x0000, 0x0000, 0x0000 }, /* R14491 */ + { 0x0000, 0x0000, 0x0000 }, /* R14492 */ + { 0x0000, 0x0000, 0x0000 }, /* R14493 */ + { 0x0000, 0x0000, 0x0000 }, /* R14494 */ + { 0x0000, 0x0000, 0x0000 }, /* R14495 */ + { 0x0000, 0x0000, 0x0000 }, /* R14496 */ + { 0x0000, 0x0000, 0x0000 }, /* R14497 */ + { 0x0000, 0x0000, 0x0000 }, /* R14498 */ + { 0x0000, 0x0000, 0x0000 }, /* R14499 */ + { 0x0000, 0x0000, 0x0000 }, /* R14500 */ + { 0x0000, 0x0000, 0x0000 }, /* R14501 */ + { 0x0000, 0x0000, 0x0000 }, /* R14502 */ + { 0x0000, 0x0000, 0x0000 }, /* R14503 */ + { 0x0000, 0x0000, 0x0000 }, /* R14504 */ + { 0x0000, 0x0000, 0x0000 }, /* R14505 */ + { 0x0000, 0x0000, 0x0000 }, /* R14506 */ + { 0x0000, 0x0000, 0x0000 }, /* R14507 */ + { 0x0000, 0x0000, 0x0000 }, /* R14508 */ + { 0x0000, 0x0000, 0x0000 }, /* R14509 */ + { 0x0000, 0x0000, 0x0000 }, /* R14510 */ + { 0x0000, 0x0000, 0x0000 }, /* R14511 */ + { 0x0000, 0x0000, 0x0000 }, /* R14512 */ + { 0x0000, 0x0000, 0x0000 }, /* R14513 */ + { 0x0000, 0x0000, 0x0000 }, /* R14514 */ + { 0x0000, 0x0000, 0x0000 }, /* R14515 */ + { 0x0000, 0x0000, 0x0000 }, /* R14516 */ + { 0x0000, 0x0000, 0x0000 }, /* R14517 */ + { 0x0000, 0x0000, 0x0000 }, /* R14518 */ + { 0x0000, 0x0000, 0x0000 }, /* R14519 */ + { 0x0000, 0x0000, 0x0000 }, /* R14520 */ + { 0x0000, 0x0000, 0x0000 }, /* R14521 */ + { 0x0000, 0x0000, 0x0000 }, /* R14522 */ + { 0x0000, 0x0000, 0x0000 }, /* R14523 */ + { 0x0000, 0x0000, 0x0000 }, /* R14524 */ + { 0x0000, 0x0000, 0x0000 }, /* R14525 */ + { 0x0000, 0x0000, 0x0000 }, /* R14526 */ + { 0x0000, 0x0000, 0x0000 }, /* R14527 */ + { 0x0000, 0x0000, 0x0000 }, /* R14528 */ + { 0x0000, 0x0000, 0x0000 }, /* R14529 */ + { 0x0000, 0x0000, 0x0000 }, /* R14530 */ + { 0x0000, 0x0000, 0x0000 }, /* R14531 */ + { 0x0000, 0x0000, 0x0000 }, /* R14532 */ + { 0x0000, 0x0000, 0x0000 }, /* R14533 */ + { 0x0000, 0x0000, 0x0000 }, /* R14534 */ + { 0x0000, 0x0000, 0x0000 }, /* R14535 */ + { 0x0000, 0x0000, 0x0000 }, /* R14536 */ + { 0x0000, 0x0000, 0x0000 }, /* R14537 */ + { 0x0000, 0x0000, 0x0000 }, /* R14538 */ + { 0x0000, 0x0000, 0x0000 }, /* R14539 */ + { 0x0000, 0x0000, 0x0000 }, /* R14540 */ + { 0x0000, 0x0000, 0x0000 }, /* R14541 */ + { 0x0000, 0x0000, 0x0000 }, /* R14542 */ + { 0x0000, 0x0000, 0x0000 }, /* R14543 */ + { 0x0000, 0x0000, 0x0000 }, /* R14544 */ + { 0x0000, 0x0000, 0x0000 }, /* R14545 */ + { 0x0000, 0x0000, 0x0000 }, /* R14546 */ + { 0x0000, 0x0000, 0x0000 }, /* R14547 */ + { 0x0000, 0x0000, 0x0000 }, /* R14548 */ + { 0x0000, 0x0000, 0x0000 }, /* R14549 */ + { 0x0000, 0x0000, 0x0000 }, /* R14550 */ + { 0x0000, 0x0000, 0x0000 }, /* R14551 */ + { 0x0000, 0x0000, 0x0000 }, /* R14552 */ + { 0x0000, 0x0000, 0x0000 }, /* R14553 */ + { 0x0000, 0x0000, 0x0000 }, /* R14554 */ + { 0x0000, 0x0000, 0x0000 }, /* R14555 */ + { 0x0000, 0x0000, 0x0000 }, /* R14556 */ + { 0x0000, 0x0000, 0x0000 }, /* R14557 */ + { 0x0000, 0x0000, 0x0000 }, /* R14558 */ + { 0x0000, 0x0000, 0x0000 }, /* R14559 */ + { 0x0000, 0x0000, 0x0000 }, /* R14560 */ + { 0x0000, 0x0000, 0x0000 }, /* R14561 */ + { 0x0000, 0x0000, 0x0000 }, /* R14562 */ + { 0x0000, 0x0000, 0x0000 }, /* R14563 */ + { 0x0000, 0x0000, 0x0000 }, /* R14564 */ + { 0x0000, 0x0000, 0x0000 }, /* R14565 */ + { 0x0000, 0x0000, 0x0000 }, /* R14566 */ + { 0x0000, 0x0000, 0x0000 }, /* R14567 */ + { 0x0000, 0x0000, 0x0000 }, /* R14568 */ + { 0x0000, 0x0000, 0x0000 }, /* R14569 */ + { 0x0000, 0x0000, 0x0000 }, /* R14570 */ + { 0x0000, 0x0000, 0x0000 }, /* R14571 */ + { 0x0000, 0x0000, 0x0000 }, /* R14572 */ + { 0x0000, 0x0000, 0x0000 }, /* R14573 */ + { 0x0000, 0x0000, 0x0000 }, /* R14574 */ + { 0x0000, 0x0000, 0x0000 }, /* R14575 */ + { 0x0000, 0x0000, 0x0000 }, /* R14576 */ + { 0x0000, 0x0000, 0x0000 }, /* R14577 */ + { 0x0000, 0x0000, 0x0000 }, /* R14578 */ + { 0x0000, 0x0000, 0x0000 }, /* R14579 */ + { 0x0000, 0x0000, 0x0000 }, /* R14580 */ + { 0x0000, 0x0000, 0x0000 }, /* R14581 */ + { 0x0000, 0x0000, 0x0000 }, /* R14582 */ + { 0x0000, 0x0000, 0x0000 }, /* R14583 */ + { 0x0000, 0x0000, 0x0000 }, /* R14584 */ + { 0x0000, 0x0000, 0x0000 }, /* R14585 */ + { 0x0000, 0x0000, 0x0000 }, /* R14586 */ + { 0x0000, 0x0000, 0x0000 }, /* R14587 */ + { 0x0000, 0x0000, 0x0000 }, /* R14588 */ + { 0x0000, 0x0000, 0x0000 }, /* R14589 */ + { 0x0000, 0x0000, 0x0000 }, /* R14590 */ + { 0x0000, 0x0000, 0x0000 }, /* R14591 */ + { 0x0000, 0x0000, 0x0000 }, /* R14592 */ + { 0x0000, 0x0000, 0x0000 }, /* R14593 */ + { 0x0000, 0x0000, 0x0000 }, /* R14594 */ + { 0x0000, 0x0000, 0x0000 }, /* R14595 */ + { 0x0000, 0x0000, 0x0000 }, /* R14596 */ + { 0x0000, 0x0000, 0x0000 }, /* R14597 */ + { 0x0000, 0x0000, 0x0000 }, /* R14598 */ + { 0x0000, 0x0000, 0x0000 }, /* R14599 */ + { 0x0000, 0x0000, 0x0000 }, /* R14600 */ + { 0x0000, 0x0000, 0x0000 }, /* R14601 */ + { 0x0000, 0x0000, 0x0000 }, /* R14602 */ + { 0x0000, 0x0000, 0x0000 }, /* R14603 */ + { 0x0000, 0x0000, 0x0000 }, /* R14604 */ + { 0x0000, 0x0000, 0x0000 }, /* R14605 */ + { 0x0000, 0x0000, 0x0000 }, /* R14606 */ + { 0x0000, 0x0000, 0x0000 }, /* R14607 */ + { 0x0000, 0x0000, 0x0000 }, /* R14608 */ + { 0x0000, 0x0000, 0x0000 }, /* R14609 */ + { 0x0000, 0x0000, 0x0000 }, /* R14610 */ + { 0x0000, 0x0000, 0x0000 }, /* R14611 */ + { 0x0000, 0x0000, 0x0000 }, /* R14612 */ + { 0x0000, 0x0000, 0x0000 }, /* R14613 */ + { 0x0000, 0x0000, 0x0000 }, /* R14614 */ + { 0x0000, 0x0000, 0x0000 }, /* R14615 */ + { 0x0000, 0x0000, 0x0000 }, /* R14616 */ + { 0x0000, 0x0000, 0x0000 }, /* R14617 */ + { 0x0000, 0x0000, 0x0000 }, /* R14618 */ + { 0x0000, 0x0000, 0x0000 }, /* R14619 */ + { 0x0000, 0x0000, 0x0000 }, /* R14620 */ + { 0x0000, 0x0000, 0x0000 }, /* R14621 */ + { 0x0000, 0x0000, 0x0000 }, /* R14622 */ + { 0x0000, 0x0000, 0x0000 }, /* R14623 */ + { 0x0000, 0x0000, 0x0000 }, /* R14624 */ + { 0x0000, 0x0000, 0x0000 }, /* R14625 */ + { 0x0000, 0x0000, 0x0000 }, /* R14626 */ + { 0x0000, 0x0000, 0x0000 }, /* R14627 */ + { 0x0000, 0x0000, 0x0000 }, /* R14628 */ + { 0x0000, 0x0000, 0x0000 }, /* R14629 */ + { 0x0000, 0x0000, 0x0000 }, /* R14630 */ + { 0x0000, 0x0000, 0x0000 }, /* R14631 */ + { 0x0000, 0x0000, 0x0000 }, /* R14632 */ + { 0x0000, 0x0000, 0x0000 }, /* R14633 */ + { 0x0000, 0x0000, 0x0000 }, /* R14634 */ + { 0x0000, 0x0000, 0x0000 }, /* R14635 */ + { 0x0000, 0x0000, 0x0000 }, /* R14636 */ + { 0x0000, 0x0000, 0x0000 }, /* R14637 */ + { 0x0000, 0x0000, 0x0000 }, /* R14638 */ + { 0x0000, 0x0000, 0x0000 }, /* R14639 */ + { 0x0000, 0x0000, 0x0000 }, /* R14640 */ + { 0x0000, 0x0000, 0x0000 }, /* R14641 */ + { 0x0000, 0x0000, 0x0000 }, /* R14642 */ + { 0x0000, 0x0000, 0x0000 }, /* R14643 */ + { 0x0000, 0x0000, 0x0000 }, /* R14644 */ + { 0x0000, 0x0000, 0x0000 }, /* R14645 */ + { 0x0000, 0x0000, 0x0000 }, /* R14646 */ + { 0x0000, 0x0000, 0x0000 }, /* R14647 */ + { 0x0000, 0x0000, 0x0000 }, /* R14648 */ + { 0x0000, 0x0000, 0x0000 }, /* R14649 */ + { 0x0000, 0x0000, 0x0000 }, /* R14650 */ + { 0x0000, 0x0000, 0x0000 }, /* R14651 */ + { 0x0000, 0x0000, 0x0000 }, /* R14652 */ + { 0x0000, 0x0000, 0x0000 }, /* R14653 */ + { 0x0000, 0x0000, 0x0000 }, /* R14654 */ + { 0x0000, 0x0000, 0x0000 }, /* R14655 */ + { 0x0000, 0x0000, 0x0000 }, /* R14656 */ + { 0x0000, 0x0000, 0x0000 }, /* R14657 */ + { 0x0000, 0x0000, 0x0000 }, /* R14658 */ + { 0x0000, 0x0000, 0x0000 }, /* R14659 */ + { 0x0000, 0x0000, 0x0000 }, /* R14660 */ + { 0x0000, 0x0000, 0x0000 }, /* R14661 */ + { 0x0000, 0x0000, 0x0000 }, /* R14662 */ + { 0x0000, 0x0000, 0x0000 }, /* R14663 */ + { 0x0000, 0x0000, 0x0000 }, /* R14664 */ + { 0x0000, 0x0000, 0x0000 }, /* R14665 */ + { 0x0000, 0x0000, 0x0000 }, /* R14666 */ + { 0x0000, 0x0000, 0x0000 }, /* R14667 */ + { 0x0000, 0x0000, 0x0000 }, /* R14668 */ + { 0x0000, 0x0000, 0x0000 }, /* R14669 */ + { 0x0000, 0x0000, 0x0000 }, /* R14670 */ + { 0x0000, 0x0000, 0x0000 }, /* R14671 */ + { 0x0000, 0x0000, 0x0000 }, /* R14672 */ + { 0x0000, 0x0000, 0x0000 }, /* R14673 */ + { 0x0000, 0x0000, 0x0000 }, /* R14674 */ + { 0x0000, 0x0000, 0x0000 }, /* R14675 */ + { 0x0000, 0x0000, 0x0000 }, /* R14676 */ + { 0x0000, 0x0000, 0x0000 }, /* R14677 */ + { 0x0000, 0x0000, 0x0000 }, /* R14678 */ + { 0x0000, 0x0000, 0x0000 }, /* R14679 */ + { 0x0000, 0x0000, 0x0000 }, /* R14680 */ + { 0x0000, 0x0000, 0x0000 }, /* R14681 */ + { 0x0000, 0x0000, 0x0000 }, /* R14682 */ + { 0x0000, 0x0000, 0x0000 }, /* R14683 */ + { 0x0000, 0x0000, 0x0000 }, /* R14684 */ + { 0x0000, 0x0000, 0x0000 }, /* R14685 */ + { 0x0000, 0x0000, 0x0000 }, /* R14686 */ + { 0x0000, 0x0000, 0x0000 }, /* R14687 */ + { 0x0000, 0x0000, 0x0000 }, /* R14688 */ + { 0x0000, 0x0000, 0x0000 }, /* R14689 */ + { 0x0000, 0x0000, 0x0000 }, /* R14690 */ + { 0x0000, 0x0000, 0x0000 }, /* R14691 */ + { 0x0000, 0x0000, 0x0000 }, /* R14692 */ + { 0x0000, 0x0000, 0x0000 }, /* R14693 */ + { 0x0000, 0x0000, 0x0000 }, /* R14694 */ + { 0x0000, 0x0000, 0x0000 }, /* R14695 */ + { 0x0000, 0x0000, 0x0000 }, /* R14696 */ + { 0x0000, 0x0000, 0x0000 }, /* R14697 */ + { 0x0000, 0x0000, 0x0000 }, /* R14698 */ + { 0x0000, 0x0000, 0x0000 }, /* R14699 */ + { 0x0000, 0x0000, 0x0000 }, /* R14700 */ + { 0x0000, 0x0000, 0x0000 }, /* R14701 */ + { 0x0000, 0x0000, 0x0000 }, /* R14702 */ + { 0x0000, 0x0000, 0x0000 }, /* R14703 */ + { 0x0000, 0x0000, 0x0000 }, /* R14704 */ + { 0x0000, 0x0000, 0x0000 }, /* R14705 */ + { 0x0000, 0x0000, 0x0000 }, /* R14706 */ + { 0x0000, 0x0000, 0x0000 }, /* R14707 */ + { 0x0000, 0x0000, 0x0000 }, /* R14708 */ + { 0x0000, 0x0000, 0x0000 }, /* R14709 */ + { 0x0000, 0x0000, 0x0000 }, /* R14710 */ + { 0x0000, 0x0000, 0x0000 }, /* R14711 */ + { 0x0000, 0x0000, 0x0000 }, /* R14712 */ + { 0x0000, 0x0000, 0x0000 }, /* R14713 */ + { 0x0000, 0x0000, 0x0000 }, /* R14714 */ + { 0x0000, 0x0000, 0x0000 }, /* R14715 */ + { 0x0000, 0x0000, 0x0000 }, /* R14716 */ + { 0x0000, 0x0000, 0x0000 }, /* R14717 */ + { 0x0000, 0x0000, 0x0000 }, /* R14718 */ + { 0x0000, 0x0000, 0x0000 }, /* R14719 */ + { 0x0000, 0x0000, 0x0000 }, /* R14720 */ + { 0x0000, 0x0000, 0x0000 }, /* R14721 */ + { 0x0000, 0x0000, 0x0000 }, /* R14722 */ + { 0x0000, 0x0000, 0x0000 }, /* R14723 */ + { 0x0000, 0x0000, 0x0000 }, /* R14724 */ + { 0x0000, 0x0000, 0x0000 }, /* R14725 */ + { 0x0000, 0x0000, 0x0000 }, /* R14726 */ + { 0x0000, 0x0000, 0x0000 }, /* R14727 */ + { 0x0000, 0x0000, 0x0000 }, /* R14728 */ + { 0x0000, 0x0000, 0x0000 }, /* R14729 */ + { 0x0000, 0x0000, 0x0000 }, /* R14730 */ + { 0x0000, 0x0000, 0x0000 }, /* R14731 */ + { 0x0000, 0x0000, 0x0000 }, /* R14732 */ + { 0x0000, 0x0000, 0x0000 }, /* R14733 */ + { 0x0000, 0x0000, 0x0000 }, /* R14734 */ + { 0x0000, 0x0000, 0x0000 }, /* R14735 */ + { 0x0000, 0x0000, 0x0000 }, /* R14736 */ + { 0x0000, 0x0000, 0x0000 }, /* R14737 */ + { 0x0000, 0x0000, 0x0000 }, /* R14738 */ + { 0x0000, 0x0000, 0x0000 }, /* R14739 */ + { 0x0000, 0x0000, 0x0000 }, /* R14740 */ + { 0x0000, 0x0000, 0x0000 }, /* R14741 */ + { 0x0000, 0x0000, 0x0000 }, /* R14742 */ + { 0x0000, 0x0000, 0x0000 }, /* R14743 */ + { 0x0000, 0x0000, 0x0000 }, /* R14744 */ + { 0x0000, 0x0000, 0x0000 }, /* R14745 */ + { 0x0000, 0x0000, 0x0000 }, /* R14746 */ + { 0x0000, 0x0000, 0x0000 }, /* R14747 */ + { 0x0000, 0x0000, 0x0000 }, /* R14748 */ + { 0x0000, 0x0000, 0x0000 }, /* R14749 */ + { 0x0000, 0x0000, 0x0000 }, /* R14750 */ + { 0x0000, 0x0000, 0x0000 }, /* R14751 */ + { 0x0000, 0x0000, 0x0000 }, /* R14752 */ + { 0x0000, 0x0000, 0x0000 }, /* R14753 */ + { 0x0000, 0x0000, 0x0000 }, /* R14754 */ + { 0x0000, 0x0000, 0x0000 }, /* R14755 */ + { 0x0000, 0x0000, 0x0000 }, /* R14756 */ + { 0x0000, 0x0000, 0x0000 }, /* R14757 */ + { 0x0000, 0x0000, 0x0000 }, /* R14758 */ + { 0x0000, 0x0000, 0x0000 }, /* R14759 */ + { 0x0000, 0x0000, 0x0000 }, /* R14760 */ + { 0x0000, 0x0000, 0x0000 }, /* R14761 */ + { 0x0000, 0x0000, 0x0000 }, /* R14762 */ + { 0x0000, 0x0000, 0x0000 }, /* R14763 */ + { 0x0000, 0x0000, 0x0000 }, /* R14764 */ + { 0x0000, 0x0000, 0x0000 }, /* R14765 */ + { 0x0000, 0x0000, 0x0000 }, /* R14766 */ + { 0x0000, 0x0000, 0x0000 }, /* R14767 */ + { 0x0000, 0x0000, 0x0000 }, /* R14768 */ + { 0x0000, 0x0000, 0x0000 }, /* R14769 */ + { 0x0000, 0x0000, 0x0000 }, /* R14770 */ + { 0x0000, 0x0000, 0x0000 }, /* R14771 */ + { 0x0000, 0x0000, 0x0000 }, /* R14772 */ + { 0x0000, 0x0000, 0x0000 }, /* R14773 */ + { 0x0000, 0x0000, 0x0000 }, /* R14774 */ + { 0x0000, 0x0000, 0x0000 }, /* R14775 */ + { 0x0000, 0x0000, 0x0000 }, /* R14776 */ + { 0x0000, 0x0000, 0x0000 }, /* R14777 */ + { 0x0000, 0x0000, 0x0000 }, /* R14778 */ + { 0x0000, 0x0000, 0x0000 }, /* R14779 */ + { 0x0000, 0x0000, 0x0000 }, /* R14780 */ + { 0x0000, 0x0000, 0x0000 }, /* R14781 */ + { 0x0000, 0x0000, 0x0000 }, /* R14782 */ + { 0x0000, 0x0000, 0x0000 }, /* R14783 */ + { 0x0000, 0x0000, 0x0000 }, /* R14784 */ + { 0x0000, 0x0000, 0x0000 }, /* R14785 */ + { 0x0000, 0x0000, 0x0000 }, /* R14786 */ + { 0x0000, 0x0000, 0x0000 }, /* R14787 */ + { 0x0000, 0x0000, 0x0000 }, /* R14788 */ + { 0x0000, 0x0000, 0x0000 }, /* R14789 */ + { 0x0000, 0x0000, 0x0000 }, /* R14790 */ + { 0x0000, 0x0000, 0x0000 }, /* R14791 */ + { 0x0000, 0x0000, 0x0000 }, /* R14792 */ + { 0x0000, 0x0000, 0x0000 }, /* R14793 */ + { 0x0000, 0x0000, 0x0000 }, /* R14794 */ + { 0x0000, 0x0000, 0x0000 }, /* R14795 */ + { 0x0000, 0x0000, 0x0000 }, /* R14796 */ + { 0x0000, 0x0000, 0x0000 }, /* R14797 */ + { 0x0000, 0x0000, 0x0000 }, /* R14798 */ + { 0x0000, 0x0000, 0x0000 }, /* R14799 */ + { 0x0000, 0x0000, 0x0000 }, /* R14800 */ + { 0x0000, 0x0000, 0x0000 }, /* R14801 */ + { 0x0000, 0x0000, 0x0000 }, /* R14802 */ + { 0x0000, 0x0000, 0x0000 }, /* R14803 */ + { 0x0000, 0x0000, 0x0000 }, /* R14804 */ + { 0x0000, 0x0000, 0x0000 }, /* R14805 */ + { 0x0000, 0x0000, 0x0000 }, /* R14806 */ + { 0x0000, 0x0000, 0x0000 }, /* R14807 */ + { 0x0000, 0x0000, 0x0000 }, /* R14808 */ + { 0x0000, 0x0000, 0x0000 }, /* R14809 */ + { 0x0000, 0x0000, 0x0000 }, /* R14810 */ + { 0x0000, 0x0000, 0x0000 }, /* R14811 */ + { 0x0000, 0x0000, 0x0000 }, /* R14812 */ + { 0x0000, 0x0000, 0x0000 }, /* R14813 */ + { 0x0000, 0x0000, 0x0000 }, /* R14814 */ + { 0x0000, 0x0000, 0x0000 }, /* R14815 */ + { 0x0000, 0x0000, 0x0000 }, /* R14816 */ + { 0x0000, 0x0000, 0x0000 }, /* R14817 */ + { 0x0000, 0x0000, 0x0000 }, /* R14818 */ + { 0x0000, 0x0000, 0x0000 }, /* R14819 */ + { 0x0000, 0x0000, 0x0000 }, /* R14820 */ + { 0x0000, 0x0000, 0x0000 }, /* R14821 */ + { 0x0000, 0x0000, 0x0000 }, /* R14822 */ + { 0x0000, 0x0000, 0x0000 }, /* R14823 */ + { 0x0000, 0x0000, 0x0000 }, /* R14824 */ + { 0x0000, 0x0000, 0x0000 }, /* R14825 */ + { 0x0000, 0x0000, 0x0000 }, /* R14826 */ + { 0x0000, 0x0000, 0x0000 }, /* R14827 */ + { 0x0000, 0x0000, 0x0000 }, /* R14828 */ + { 0x0000, 0x0000, 0x0000 }, /* R14829 */ + { 0x0000, 0x0000, 0x0000 }, /* R14830 */ + { 0x0000, 0x0000, 0x0000 }, /* R14831 */ + { 0x0000, 0x0000, 0x0000 }, /* R14832 */ + { 0x0000, 0x0000, 0x0000 }, /* R14833 */ + { 0x0000, 0x0000, 0x0000 }, /* R14834 */ + { 0x0000, 0x0000, 0x0000 }, /* R14835 */ + { 0x0000, 0x0000, 0x0000 }, /* R14836 */ + { 0x0000, 0x0000, 0x0000 }, /* R14837 */ + { 0x0000, 0x0000, 0x0000 }, /* R14838 */ + { 0x0000, 0x0000, 0x0000 }, /* R14839 */ + { 0x0000, 0x0000, 0x0000 }, /* R14840 */ + { 0x0000, 0x0000, 0x0000 }, /* R14841 */ + { 0x0000, 0x0000, 0x0000 }, /* R14842 */ + { 0x0000, 0x0000, 0x0000 }, /* R14843 */ + { 0x0000, 0x0000, 0x0000 }, /* R14844 */ + { 0x0000, 0x0000, 0x0000 }, /* R14845 */ + { 0x0000, 0x0000, 0x0000 }, /* R14846 */ + { 0x0000, 0x0000, 0x0000 }, /* R14847 */ + { 0x0000, 0x0000, 0x0000 }, /* R14848 */ + { 0x0000, 0x0000, 0x0000 }, /* R14849 */ + { 0x0000, 0x0000, 0x0000 }, /* R14850 */ + { 0x0000, 0x0000, 0x0000 }, /* R14851 */ + { 0x0000, 0x0000, 0x0000 }, /* R14852 */ + { 0x0000, 0x0000, 0x0000 }, /* R14853 */ + { 0x0000, 0x0000, 0x0000 }, /* R14854 */ + { 0x0000, 0x0000, 0x0000 }, /* R14855 */ + { 0x0000, 0x0000, 0x0000 }, /* R14856 */ + { 0x0000, 0x0000, 0x0000 }, /* R14857 */ + { 0x0000, 0x0000, 0x0000 }, /* R14858 */ + { 0x0000, 0x0000, 0x0000 }, /* R14859 */ + { 0x0000, 0x0000, 0x0000 }, /* R14860 */ + { 0x0000, 0x0000, 0x0000 }, /* R14861 */ + { 0x0000, 0x0000, 0x0000 }, /* R14862 */ + { 0x0000, 0x0000, 0x0000 }, /* R14863 */ + { 0x0000, 0x0000, 0x0000 }, /* R14864 */ + { 0x0000, 0x0000, 0x0000 }, /* R14865 */ + { 0x0000, 0x0000, 0x0000 }, /* R14866 */ + { 0x0000, 0x0000, 0x0000 }, /* R14867 */ + { 0x0000, 0x0000, 0x0000 }, /* R14868 */ + { 0x0000, 0x0000, 0x0000 }, /* R14869 */ + { 0x0000, 0x0000, 0x0000 }, /* R14870 */ + { 0x0000, 0x0000, 0x0000 }, /* R14871 */ + { 0x0000, 0x0000, 0x0000 }, /* R14872 */ + { 0x0000, 0x0000, 0x0000 }, /* R14873 */ + { 0x0000, 0x0000, 0x0000 }, /* R14874 */ + { 0x0000, 0x0000, 0x0000 }, /* R14875 */ + { 0x0000, 0x0000, 0x0000 }, /* R14876 */ + { 0x0000, 0x0000, 0x0000 }, /* R14877 */ + { 0x0000, 0x0000, 0x0000 }, /* R14878 */ + { 0x0000, 0x0000, 0x0000 }, /* R14879 */ + { 0x0000, 0x0000, 0x0000 }, /* R14880 */ + { 0x0000, 0x0000, 0x0000 }, /* R14881 */ + { 0x0000, 0x0000, 0x0000 }, /* R14882 */ + { 0x0000, 0x0000, 0x0000 }, /* R14883 */ + { 0x0000, 0x0000, 0x0000 }, /* R14884 */ + { 0x0000, 0x0000, 0x0000 }, /* R14885 */ + { 0x0000, 0x0000, 0x0000 }, /* R14886 */ + { 0x0000, 0x0000, 0x0000 }, /* R14887 */ + { 0x0000, 0x0000, 0x0000 }, /* R14888 */ + { 0x0000, 0x0000, 0x0000 }, /* R14889 */ + { 0x0000, 0x0000, 0x0000 }, /* R14890 */ + { 0x0000, 0x0000, 0x0000 }, /* R14891 */ + { 0x0000, 0x0000, 0x0000 }, /* R14892 */ + { 0x0000, 0x0000, 0x0000 }, /* R14893 */ + { 0x0000, 0x0000, 0x0000 }, /* R14894 */ + { 0x0000, 0x0000, 0x0000 }, /* R14895 */ + { 0x0000, 0x0000, 0x0000 }, /* R14896 */ + { 0x0000, 0x0000, 0x0000 }, /* R14897 */ + { 0x0000, 0x0000, 0x0000 }, /* R14898 */ + { 0x0000, 0x0000, 0x0000 }, /* R14899 */ + { 0x0000, 0x0000, 0x0000 }, /* R14900 */ + { 0x0000, 0x0000, 0x0000 }, /* R14901 */ + { 0x0000, 0x0000, 0x0000 }, /* R14902 */ + { 0x0000, 0x0000, 0x0000 }, /* R14903 */ + { 0x0000, 0x0000, 0x0000 }, /* R14904 */ + { 0x0000, 0x0000, 0x0000 }, /* R14905 */ + { 0x0000, 0x0000, 0x0000 }, /* R14906 */ + { 0x0000, 0x0000, 0x0000 }, /* R14907 */ + { 0x0000, 0x0000, 0x0000 }, /* R14908 */ + { 0x0000, 0x0000, 0x0000 }, /* R14909 */ + { 0x0000, 0x0000, 0x0000 }, /* R14910 */ + { 0x0000, 0x0000, 0x0000 }, /* R14911 */ + { 0x0000, 0x0000, 0x0000 }, /* R14912 */ + { 0x0000, 0x0000, 0x0000 }, /* R14913 */ + { 0x0000, 0x0000, 0x0000 }, /* R14914 */ + { 0x0000, 0x0000, 0x0000 }, /* R14915 */ + { 0x0000, 0x0000, 0x0000 }, /* R14916 */ + { 0x0000, 0x0000, 0x0000 }, /* R14917 */ + { 0x0000, 0x0000, 0x0000 }, /* R14918 */ + { 0x0000, 0x0000, 0x0000 }, /* R14919 */ + { 0x0000, 0x0000, 0x0000 }, /* R14920 */ + { 0x0000, 0x0000, 0x0000 }, /* R14921 */ + { 0x0000, 0x0000, 0x0000 }, /* R14922 */ + { 0x0000, 0x0000, 0x0000 }, /* R14923 */ + { 0x0000, 0x0000, 0x0000 }, /* R14924 */ + { 0x0000, 0x0000, 0x0000 }, /* R14925 */ + { 0x0000, 0x0000, 0x0000 }, /* R14926 */ + { 0x0000, 0x0000, 0x0000 }, /* R14927 */ + { 0x0000, 0x0000, 0x0000 }, /* R14928 */ + { 0x0000, 0x0000, 0x0000 }, /* R14929 */ + { 0x0000, 0x0000, 0x0000 }, /* R14930 */ + { 0x0000, 0x0000, 0x0000 }, /* R14931 */ + { 0x0000, 0x0000, 0x0000 }, /* R14932 */ + { 0x0000, 0x0000, 0x0000 }, /* R14933 */ + { 0x0000, 0x0000, 0x0000 }, /* R14934 */ + { 0x0000, 0x0000, 0x0000 }, /* R14935 */ + { 0x0000, 0x0000, 0x0000 }, /* R14936 */ + { 0x0000, 0x0000, 0x0000 }, /* R14937 */ + { 0x0000, 0x0000, 0x0000 }, /* R14938 */ + { 0x0000, 0x0000, 0x0000 }, /* R14939 */ + { 0x0000, 0x0000, 0x0000 }, /* R14940 */ + { 0x0000, 0x0000, 0x0000 }, /* R14941 */ + { 0x0000, 0x0000, 0x0000 }, /* R14942 */ + { 0x0000, 0x0000, 0x0000 }, /* R14943 */ + { 0x0000, 0x0000, 0x0000 }, /* R14944 */ + { 0x0000, 0x0000, 0x0000 }, /* R14945 */ + { 0x0000, 0x0000, 0x0000 }, /* R14946 */ + { 0x0000, 0x0000, 0x0000 }, /* R14947 */ + { 0x0000, 0x0000, 0x0000 }, /* R14948 */ + { 0x0000, 0x0000, 0x0000 }, /* R14949 */ + { 0x0000, 0x0000, 0x0000 }, /* R14950 */ + { 0x0000, 0x0000, 0x0000 }, /* R14951 */ + { 0x0000, 0x0000, 0x0000 }, /* R14952 */ + { 0x0000, 0x0000, 0x0000 }, /* R14953 */ + { 0x0000, 0x0000, 0x0000 }, /* R14954 */ + { 0x0000, 0x0000, 0x0000 }, /* R14955 */ + { 0x0000, 0x0000, 0x0000 }, /* R14956 */ + { 0x0000, 0x0000, 0x0000 }, /* R14957 */ + { 0x0000, 0x0000, 0x0000 }, /* R14958 */ + { 0x0000, 0x0000, 0x0000 }, /* R14959 */ + { 0x0000, 0x0000, 0x0000 }, /* R14960 */ + { 0x0000, 0x0000, 0x0000 }, /* R14961 */ + { 0x0000, 0x0000, 0x0000 }, /* R14962 */ + { 0x0000, 0x0000, 0x0000 }, /* R14963 */ + { 0x0000, 0x0000, 0x0000 }, /* R14964 */ + { 0x0000, 0x0000, 0x0000 }, /* R14965 */ + { 0x0000, 0x0000, 0x0000 }, /* R14966 */ + { 0x0000, 0x0000, 0x0000 }, /* R14967 */ + { 0x0000, 0x0000, 0x0000 }, /* R14968 */ + { 0x0000, 0x0000, 0x0000 }, /* R14969 */ + { 0x0000, 0x0000, 0x0000 }, /* R14970 */ + { 0x0000, 0x0000, 0x0000 }, /* R14971 */ + { 0x0000, 0x0000, 0x0000 }, /* R14972 */ + { 0x0000, 0x0000, 0x0000 }, /* R14973 */ + { 0x0000, 0x0000, 0x0000 }, /* R14974 */ + { 0x0000, 0x0000, 0x0000 }, /* R14975 */ + { 0x0000, 0x0000, 0x0000 }, /* R14976 */ + { 0x0000, 0x0000, 0x0000 }, /* R14977 */ + { 0x0000, 0x0000, 0x0000 }, /* R14978 */ + { 0x0000, 0x0000, 0x0000 }, /* R14979 */ + { 0x0000, 0x0000, 0x0000 }, /* R14980 */ + { 0x0000, 0x0000, 0x0000 }, /* R14981 */ + { 0x0000, 0x0000, 0x0000 }, /* R14982 */ + { 0x0000, 0x0000, 0x0000 }, /* R14983 */ + { 0x0000, 0x0000, 0x0000 }, /* R14984 */ + { 0x0000, 0x0000, 0x0000 }, /* R14985 */ + { 0x0000, 0x0000, 0x0000 }, /* R14986 */ + { 0x0000, 0x0000, 0x0000 }, /* R14987 */ + { 0x0000, 0x0000, 0x0000 }, /* R14988 */ + { 0x0000, 0x0000, 0x0000 }, /* R14989 */ + { 0x0000, 0x0000, 0x0000 }, /* R14990 */ + { 0x0000, 0x0000, 0x0000 }, /* R14991 */ + { 0x0000, 0x0000, 0x0000 }, /* R14992 */ + { 0x0000, 0x0000, 0x0000 }, /* R14993 */ + { 0x0000, 0x0000, 0x0000 }, /* R14994 */ + { 0x0000, 0x0000, 0x0000 }, /* R14995 */ + { 0x0000, 0x0000, 0x0000 }, /* R14996 */ + { 0x0000, 0x0000, 0x0000 }, /* R14997 */ + { 0x0000, 0x0000, 0x0000 }, /* R14998 */ + { 0x0000, 0x0000, 0x0000 }, /* R14999 */ + { 0x0000, 0x0000, 0x0000 }, /* R15000 */ + { 0x0000, 0x0000, 0x0000 }, /* R15001 */ + { 0x0000, 0x0000, 0x0000 }, /* R15002 */ + { 0x0000, 0x0000, 0x0000 }, /* R15003 */ + { 0x0000, 0x0000, 0x0000 }, /* R15004 */ + { 0x0000, 0x0000, 0x0000 }, /* R15005 */ + { 0x0000, 0x0000, 0x0000 }, /* R15006 */ + { 0x0000, 0x0000, 0x0000 }, /* R15007 */ + { 0x0000, 0x0000, 0x0000 }, /* R15008 */ + { 0x0000, 0x0000, 0x0000 }, /* R15009 */ + { 0x0000, 0x0000, 0x0000 }, /* R15010 */ + { 0x0000, 0x0000, 0x0000 }, /* R15011 */ + { 0x0000, 0x0000, 0x0000 }, /* R15012 */ + { 0x0000, 0x0000, 0x0000 }, /* R15013 */ + { 0x0000, 0x0000, 0x0000 }, /* R15014 */ + { 0x0000, 0x0000, 0x0000 }, /* R15015 */ + { 0x0000, 0x0000, 0x0000 }, /* R15016 */ + { 0x0000, 0x0000, 0x0000 }, /* R15017 */ + { 0x0000, 0x0000, 0x0000 }, /* R15018 */ + { 0x0000, 0x0000, 0x0000 }, /* R15019 */ + { 0x0000, 0x0000, 0x0000 }, /* R15020 */ + { 0x0000, 0x0000, 0x0000 }, /* R15021 */ + { 0x0000, 0x0000, 0x0000 }, /* R15022 */ + { 0x0000, 0x0000, 0x0000 }, /* R15023 */ + { 0x0000, 0x0000, 0x0000 }, /* R15024 */ + { 0x0000, 0x0000, 0x0000 }, /* R15025 */ + { 0x0000, 0x0000, 0x0000 }, /* R15026 */ + { 0x0000, 0x0000, 0x0000 }, /* R15027 */ + { 0x0000, 0x0000, 0x0000 }, /* R15028 */ + { 0x0000, 0x0000, 0x0000 }, /* R15029 */ + { 0x0000, 0x0000, 0x0000 }, /* R15030 */ + { 0x0000, 0x0000, 0x0000 }, /* R15031 */ + { 0x0000, 0x0000, 0x0000 }, /* R15032 */ + { 0x0000, 0x0000, 0x0000 }, /* R15033 */ + { 0x0000, 0x0000, 0x0000 }, /* R15034 */ + { 0x0000, 0x0000, 0x0000 }, /* R15035 */ + { 0x0000, 0x0000, 0x0000 }, /* R15036 */ + { 0x0000, 0x0000, 0x0000 }, /* R15037 */ + { 0x0000, 0x0000, 0x0000 }, /* R15038 */ + { 0x0000, 0x0000, 0x0000 }, /* R15039 */ + { 0x0000, 0x0000, 0x0000 }, /* R15040 */ + { 0x0000, 0x0000, 0x0000 }, /* R15041 */ + { 0x0000, 0x0000, 0x0000 }, /* R15042 */ + { 0x0000, 0x0000, 0x0000 }, /* R15043 */ + { 0x0000, 0x0000, 0x0000 }, /* R15044 */ + { 0x0000, 0x0000, 0x0000 }, /* R15045 */ + { 0x0000, 0x0000, 0x0000 }, /* R15046 */ + { 0x0000, 0x0000, 0x0000 }, /* R15047 */ + { 0x0000, 0x0000, 0x0000 }, /* R15048 */ + { 0x0000, 0x0000, 0x0000 }, /* R15049 */ + { 0x0000, 0x0000, 0x0000 }, /* R15050 */ + { 0x0000, 0x0000, 0x0000 }, /* R15051 */ + { 0x0000, 0x0000, 0x0000 }, /* R15052 */ + { 0x0000, 0x0000, 0x0000 }, /* R15053 */ + { 0x0000, 0x0000, 0x0000 }, /* R15054 */ + { 0x0000, 0x0000, 0x0000 }, /* R15055 */ + { 0x0000, 0x0000, 0x0000 }, /* R15056 */ + { 0x0000, 0x0000, 0x0000 }, /* R15057 */ + { 0x0000, 0x0000, 0x0000 }, /* R15058 */ + { 0x0000, 0x0000, 0x0000 }, /* R15059 */ + { 0x0000, 0x0000, 0x0000 }, /* R15060 */ + { 0x0000, 0x0000, 0x0000 }, /* R15061 */ + { 0x0000, 0x0000, 0x0000 }, /* R15062 */ + { 0x0000, 0x0000, 0x0000 }, /* R15063 */ + { 0x0000, 0x0000, 0x0000 }, /* R15064 */ + { 0x0000, 0x0000, 0x0000 }, /* R15065 */ + { 0x0000, 0x0000, 0x0000 }, /* R15066 */ + { 0x0000, 0x0000, 0x0000 }, /* R15067 */ + { 0x0000, 0x0000, 0x0000 }, /* R15068 */ + { 0x0000, 0x0000, 0x0000 }, /* R15069 */ + { 0x0000, 0x0000, 0x0000 }, /* R15070 */ + { 0x0000, 0x0000, 0x0000 }, /* R15071 */ + { 0x0000, 0x0000, 0x0000 }, /* R15072 */ + { 0x0000, 0x0000, 0x0000 }, /* R15073 */ + { 0x0000, 0x0000, 0x0000 }, /* R15074 */ + { 0x0000, 0x0000, 0x0000 }, /* R15075 */ + { 0x0000, 0x0000, 0x0000 }, /* R15076 */ + { 0x0000, 0x0000, 0x0000 }, /* R15077 */ + { 0x0000, 0x0000, 0x0000 }, /* R15078 */ + { 0x0000, 0x0000, 0x0000 }, /* R15079 */ + { 0x0000, 0x0000, 0x0000 }, /* R15080 */ + { 0x0000, 0x0000, 0x0000 }, /* R15081 */ + { 0x0000, 0x0000, 0x0000 }, /* R15082 */ + { 0x0000, 0x0000, 0x0000 }, /* R15083 */ + { 0x0000, 0x0000, 0x0000 }, /* R15084 */ + { 0x0000, 0x0000, 0x0000 }, /* R15085 */ + { 0x0000, 0x0000, 0x0000 }, /* R15086 */ + { 0x0000, 0x0000, 0x0000 }, /* R15087 */ + { 0x0000, 0x0000, 0x0000 }, /* R15088 */ + { 0x0000, 0x0000, 0x0000 }, /* R15089 */ + { 0x0000, 0x0000, 0x0000 }, /* R15090 */ + { 0x0000, 0x0000, 0x0000 }, /* R15091 */ + { 0x0000, 0x0000, 0x0000 }, /* R15092 */ + { 0x0000, 0x0000, 0x0000 }, /* R15093 */ + { 0x0000, 0x0000, 0x0000 }, /* R15094 */ + { 0x0000, 0x0000, 0x0000 }, /* R15095 */ + { 0x0000, 0x0000, 0x0000 }, /* R15096 */ + { 0x0000, 0x0000, 0x0000 }, /* R15097 */ + { 0x0000, 0x0000, 0x0000 }, /* R15098 */ + { 0x0000, 0x0000, 0x0000 }, /* R15099 */ + { 0x0000, 0x0000, 0x0000 }, /* R15100 */ + { 0x0000, 0x0000, 0x0000 }, /* R15101 */ + { 0x0000, 0x0000, 0x0000 }, /* R15102 */ + { 0x0000, 0x0000, 0x0000 }, /* R15103 */ + { 0x0000, 0x0000, 0x0000 }, /* R15104 */ + { 0x0000, 0x0000, 0x0000 }, /* R15105 */ + { 0x0000, 0x0000, 0x0000 }, /* R15106 */ + { 0x0000, 0x0000, 0x0000 }, /* R15107 */ + { 0x0000, 0x0000, 0x0000 }, /* R15108 */ + { 0x0000, 0x0000, 0x0000 }, /* R15109 */ + { 0x0000, 0x0000, 0x0000 }, /* R15110 */ + { 0x0000, 0x0000, 0x0000 }, /* R15111 */ + { 0x0000, 0x0000, 0x0000 }, /* R15112 */ + { 0x0000, 0x0000, 0x0000 }, /* R15113 */ + { 0x0000, 0x0000, 0x0000 }, /* R15114 */ + { 0x0000, 0x0000, 0x0000 }, /* R15115 */ + { 0x0000, 0x0000, 0x0000 }, /* R15116 */ + { 0x0000, 0x0000, 0x0000 }, /* R15117 */ + { 0x0000, 0x0000, 0x0000 }, /* R15118 */ + { 0x0000, 0x0000, 0x0000 }, /* R15119 */ + { 0x0000, 0x0000, 0x0000 }, /* R15120 */ + { 0x0000, 0x0000, 0x0000 }, /* R15121 */ + { 0x0000, 0x0000, 0x0000 }, /* R15122 */ + { 0x0000, 0x0000, 0x0000 }, /* R15123 */ + { 0x0000, 0x0000, 0x0000 }, /* R15124 */ + { 0x0000, 0x0000, 0x0000 }, /* R15125 */ + { 0x0000, 0x0000, 0x0000 }, /* R15126 */ + { 0x0000, 0x0000, 0x0000 }, /* R15127 */ + { 0x0000, 0x0000, 0x0000 }, /* R15128 */ + { 0x0000, 0x0000, 0x0000 }, /* R15129 */ + { 0x0000, 0x0000, 0x0000 }, /* R15130 */ + { 0x0000, 0x0000, 0x0000 }, /* R15131 */ + { 0x0000, 0x0000, 0x0000 }, /* R15132 */ + { 0x0000, 0x0000, 0x0000 }, /* R15133 */ + { 0x0000, 0x0000, 0x0000 }, /* R15134 */ + { 0x0000, 0x0000, 0x0000 }, /* R15135 */ + { 0x0000, 0x0000, 0x0000 }, /* R15136 */ + { 0x0000, 0x0000, 0x0000 }, /* R15137 */ + { 0x0000, 0x0000, 0x0000 }, /* R15138 */ + { 0x0000, 0x0000, 0x0000 }, /* R15139 */ + { 0x0000, 0x0000, 0x0000 }, /* R15140 */ + { 0x0000, 0x0000, 0x0000 }, /* R15141 */ + { 0x0000, 0x0000, 0x0000 }, /* R15142 */ + { 0x0000, 0x0000, 0x0000 }, /* R15143 */ + { 0x0000, 0x0000, 0x0000 }, /* R15144 */ + { 0x0000, 0x0000, 0x0000 }, /* R15145 */ + { 0x0000, 0x0000, 0x0000 }, /* R15146 */ + { 0x0000, 0x0000, 0x0000 }, /* R15147 */ + { 0x0000, 0x0000, 0x0000 }, /* R15148 */ + { 0x0000, 0x0000, 0x0000 }, /* R15149 */ + { 0x0000, 0x0000, 0x0000 }, /* R15150 */ + { 0x0000, 0x0000, 0x0000 }, /* R15151 */ + { 0x0000, 0x0000, 0x0000 }, /* R15152 */ + { 0x0000, 0x0000, 0x0000 }, /* R15153 */ + { 0x0000, 0x0000, 0x0000 }, /* R15154 */ + { 0x0000, 0x0000, 0x0000 }, /* R15155 */ + { 0x0000, 0x0000, 0x0000 }, /* R15156 */ + { 0x0000, 0x0000, 0x0000 }, /* R15157 */ + { 0x0000, 0x0000, 0x0000 }, /* R15158 */ + { 0x0000, 0x0000, 0x0000 }, /* R15159 */ + { 0x0000, 0x0000, 0x0000 }, /* R15160 */ + { 0x0000, 0x0000, 0x0000 }, /* R15161 */ + { 0x0000, 0x0000, 0x0000 }, /* R15162 */ + { 0x0000, 0x0000, 0x0000 }, /* R15163 */ + { 0x0000, 0x0000, 0x0000 }, /* R15164 */ + { 0x0000, 0x0000, 0x0000 }, /* R15165 */ + { 0x0000, 0x0000, 0x0000 }, /* R15166 */ + { 0x0000, 0x0000, 0x0000 }, /* R15167 */ + { 0x0000, 0x0000, 0x0000 }, /* R15168 */ + { 0x0000, 0x0000, 0x0000 }, /* R15169 */ + { 0x0000, 0x0000, 0x0000 }, /* R15170 */ + { 0x0000, 0x0000, 0x0000 }, /* R15171 */ + { 0x0000, 0x0000, 0x0000 }, /* R15172 */ + { 0x0000, 0x0000, 0x0000 }, /* R15173 */ + { 0x0000, 0x0000, 0x0000 }, /* R15174 */ + { 0x0000, 0x0000, 0x0000 }, /* R15175 */ + { 0x0000, 0x0000, 0x0000 }, /* R15176 */ + { 0x0000, 0x0000, 0x0000 }, /* R15177 */ + { 0x0000, 0x0000, 0x0000 }, /* R15178 */ + { 0x0000, 0x0000, 0x0000 }, /* R15179 */ + { 0x0000, 0x0000, 0x0000 }, /* R15180 */ + { 0x0000, 0x0000, 0x0000 }, /* R15181 */ + { 0x0000, 0x0000, 0x0000 }, /* R15182 */ + { 0x0000, 0x0000, 0x0000 }, /* R15183 */ + { 0x0000, 0x0000, 0x0000 }, /* R15184 */ + { 0x0000, 0x0000, 0x0000 }, /* R15185 */ + { 0x0000, 0x0000, 0x0000 }, /* R15186 */ + { 0x0000, 0x0000, 0x0000 }, /* R15187 */ + { 0x0000, 0x0000, 0x0000 }, /* R15188 */ + { 0x0000, 0x0000, 0x0000 }, /* R15189 */ + { 0x0000, 0x0000, 0x0000 }, /* R15190 */ + { 0x0000, 0x0000, 0x0000 }, /* R15191 */ + { 0x0000, 0x0000, 0x0000 }, /* R15192 */ + { 0x0000, 0x0000, 0x0000 }, /* R15193 */ + { 0x0000, 0x0000, 0x0000 }, /* R15194 */ + { 0x0000, 0x0000, 0x0000 }, /* R15195 */ + { 0x0000, 0x0000, 0x0000 }, /* R15196 */ + { 0x0000, 0x0000, 0x0000 }, /* R15197 */ + { 0x0000, 0x0000, 0x0000 }, /* R15198 */ + { 0x0000, 0x0000, 0x0000 }, /* R15199 */ + { 0x0000, 0x0000, 0x0000 }, /* R15200 */ + { 0x0000, 0x0000, 0x0000 }, /* R15201 */ + { 0x0000, 0x0000, 0x0000 }, /* R15202 */ + { 0x0000, 0x0000, 0x0000 }, /* R15203 */ + { 0x0000, 0x0000, 0x0000 }, /* R15204 */ + { 0x0000, 0x0000, 0x0000 }, /* R15205 */ + { 0x0000, 0x0000, 0x0000 }, /* R15206 */ + { 0x0000, 0x0000, 0x0000 }, /* R15207 */ + { 0x0000, 0x0000, 0x0000 }, /* R15208 */ + { 0x0000, 0x0000, 0x0000 }, /* R15209 */ + { 0x0000, 0x0000, 0x0000 }, /* R15210 */ + { 0x0000, 0x0000, 0x0000 }, /* R15211 */ + { 0x0000, 0x0000, 0x0000 }, /* R15212 */ + { 0x0000, 0x0000, 0x0000 }, /* R15213 */ + { 0x0000, 0x0000, 0x0000 }, /* R15214 */ + { 0x0000, 0x0000, 0x0000 }, /* R15215 */ + { 0x0000, 0x0000, 0x0000 }, /* R15216 */ + { 0x0000, 0x0000, 0x0000 }, /* R15217 */ + { 0x0000, 0x0000, 0x0000 }, /* R15218 */ + { 0x0000, 0x0000, 0x0000 }, /* R15219 */ + { 0x0000, 0x0000, 0x0000 }, /* R15220 */ + { 0x0000, 0x0000, 0x0000 }, /* R15221 */ + { 0x0000, 0x0000, 0x0000 }, /* R15222 */ + { 0x0000, 0x0000, 0x0000 }, /* R15223 */ + { 0x0000, 0x0000, 0x0000 }, /* R15224 */ + { 0x0000, 0x0000, 0x0000 }, /* R15225 */ + { 0x0000, 0x0000, 0x0000 }, /* R15226 */ + { 0x0000, 0x0000, 0x0000 }, /* R15227 */ + { 0x0000, 0x0000, 0x0000 }, /* R15228 */ + { 0x0000, 0x0000, 0x0000 }, /* R15229 */ + { 0x0000, 0x0000, 0x0000 }, /* R15230 */ + { 0x0000, 0x0000, 0x0000 }, /* R15231 */ + { 0x0000, 0x0000, 0x0000 }, /* R15232 */ + { 0x0000, 0x0000, 0x0000 }, /* R15233 */ + { 0x0000, 0x0000, 0x0000 }, /* R15234 */ + { 0x0000, 0x0000, 0x0000 }, /* R15235 */ + { 0x0000, 0x0000, 0x0000 }, /* R15236 */ + { 0x0000, 0x0000, 0x0000 }, /* R15237 */ + { 0x0000, 0x0000, 0x0000 }, /* R15238 */ + { 0x0000, 0x0000, 0x0000 }, /* R15239 */ + { 0x0000, 0x0000, 0x0000 }, /* R15240 */ + { 0x0000, 0x0000, 0x0000 }, /* R15241 */ + { 0x0000, 0x0000, 0x0000 }, /* R15242 */ + { 0x0000, 0x0000, 0x0000 }, /* R15243 */ + { 0x0000, 0x0000, 0x0000 }, /* R15244 */ + { 0x0000, 0x0000, 0x0000 }, /* R15245 */ + { 0x0000, 0x0000, 0x0000 }, /* R15246 */ + { 0x0000, 0x0000, 0x0000 }, /* R15247 */ + { 0x0000, 0x0000, 0x0000 }, /* R15248 */ + { 0x0000, 0x0000, 0x0000 }, /* R15249 */ + { 0x0000, 0x0000, 0x0000 }, /* R15250 */ + { 0x0000, 0x0000, 0x0000 }, /* R15251 */ + { 0x0000, 0x0000, 0x0000 }, /* R15252 */ + { 0x0000, 0x0000, 0x0000 }, /* R15253 */ + { 0x0000, 0x0000, 0x0000 }, /* R15254 */ + { 0x0000, 0x0000, 0x0000 }, /* R15255 */ + { 0x0000, 0x0000, 0x0000 }, /* R15256 */ + { 0x0000, 0x0000, 0x0000 }, /* R15257 */ + { 0x0000, 0x0000, 0x0000 }, /* R15258 */ + { 0x0000, 0x0000, 0x0000 }, /* R15259 */ + { 0x0000, 0x0000, 0x0000 }, /* R15260 */ + { 0x0000, 0x0000, 0x0000 }, /* R15261 */ + { 0x0000, 0x0000, 0x0000 }, /* R15262 */ + { 0x0000, 0x0000, 0x0000 }, /* R15263 */ + { 0x0000, 0x0000, 0x0000 }, /* R15264 */ + { 0x0000, 0x0000, 0x0000 }, /* R15265 */ + { 0x0000, 0x0000, 0x0000 }, /* R15266 */ + { 0x0000, 0x0000, 0x0000 }, /* R15267 */ + { 0x0000, 0x0000, 0x0000 }, /* R15268 */ + { 0x0000, 0x0000, 0x0000 }, /* R15269 */ + { 0x0000, 0x0000, 0x0000 }, /* R15270 */ + { 0x0000, 0x0000, 0x0000 }, /* R15271 */ + { 0x0000, 0x0000, 0x0000 }, /* R15272 */ + { 0x0000, 0x0000, 0x0000 }, /* R15273 */ + { 0x0000, 0x0000, 0x0000 }, /* R15274 */ + { 0x0000, 0x0000, 0x0000 }, /* R15275 */ + { 0x0000, 0x0000, 0x0000 }, /* R15276 */ + { 0x0000, 0x0000, 0x0000 }, /* R15277 */ + { 0x0000, 0x0000, 0x0000 }, /* R15278 */ + { 0x0000, 0x0000, 0x0000 }, /* R15279 */ + { 0x0000, 0x0000, 0x0000 }, /* R15280 */ + { 0x0000, 0x0000, 0x0000 }, /* R15281 */ + { 0x0000, 0x0000, 0x0000 }, /* R15282 */ + { 0x0000, 0x0000, 0x0000 }, /* R15283 */ + { 0x0000, 0x0000, 0x0000 }, /* R15284 */ + { 0x0000, 0x0000, 0x0000 }, /* R15285 */ + { 0x0000, 0x0000, 0x0000 }, /* R15286 */ + { 0x0000, 0x0000, 0x0000 }, /* R15287 */ + { 0x0000, 0x0000, 0x0000 }, /* R15288 */ + { 0x0000, 0x0000, 0x0000 }, /* R15289 */ + { 0x0000, 0x0000, 0x0000 }, /* R15290 */ + { 0x0000, 0x0000, 0x0000 }, /* R15291 */ + { 0x0000, 0x0000, 0x0000 }, /* R15292 */ + { 0x0000, 0x0000, 0x0000 }, /* R15293 */ + { 0x0000, 0x0000, 0x0000 }, /* R15294 */ + { 0x0000, 0x0000, 0x0000 }, /* R15295 */ + { 0x0000, 0x0000, 0x0000 }, /* R15296 */ + { 0x0000, 0x0000, 0x0000 }, /* R15297 */ + { 0x0000, 0x0000, 0x0000 }, /* R15298 */ + { 0x0000, 0x0000, 0x0000 }, /* R15299 */ + { 0x0000, 0x0000, 0x0000 }, /* R15300 */ + { 0x0000, 0x0000, 0x0000 }, /* R15301 */ + { 0x0000, 0x0000, 0x0000 }, /* R15302 */ + { 0x0000, 0x0000, 0x0000 }, /* R15303 */ + { 0x0000, 0x0000, 0x0000 }, /* R15304 */ + { 0x0000, 0x0000, 0x0000 }, /* R15305 */ + { 0x0000, 0x0000, 0x0000 }, /* R15306 */ + { 0x0000, 0x0000, 0x0000 }, /* R15307 */ + { 0x0000, 0x0000, 0x0000 }, /* R15308 */ + { 0x0000, 0x0000, 0x0000 }, /* R15309 */ + { 0x0000, 0x0000, 0x0000 }, /* R15310 */ + { 0x0000, 0x0000, 0x0000 }, /* R15311 */ + { 0x0000, 0x0000, 0x0000 }, /* R15312 */ + { 0x0000, 0x0000, 0x0000 }, /* R15313 */ + { 0x0000, 0x0000, 0x0000 }, /* R15314 */ + { 0x0000, 0x0000, 0x0000 }, /* R15315 */ + { 0x0000, 0x0000, 0x0000 }, /* R15316 */ + { 0x0000, 0x0000, 0x0000 }, /* R15317 */ + { 0x0000, 0x0000, 0x0000 }, /* R15318 */ + { 0x0000, 0x0000, 0x0000 }, /* R15319 */ + { 0x0000, 0x0000, 0x0000 }, /* R15320 */ + { 0x0000, 0x0000, 0x0000 }, /* R15321 */ + { 0x0000, 0x0000, 0x0000 }, /* R15322 */ + { 0x0000, 0x0000, 0x0000 }, /* R15323 */ + { 0x0000, 0x0000, 0x0000 }, /* R15324 */ + { 0x0000, 0x0000, 0x0000 }, /* R15325 */ + { 0x0000, 0x0000, 0x0000 }, /* R15326 */ + { 0x0000, 0x0000, 0x0000 }, /* R15327 */ + { 0x0000, 0x0000, 0x0000 }, /* R15328 */ + { 0x0000, 0x0000, 0x0000 }, /* R15329 */ + { 0x0000, 0x0000, 0x0000 }, /* R15330 */ + { 0x0000, 0x0000, 0x0000 }, /* R15331 */ + { 0x0000, 0x0000, 0x0000 }, /* R15332 */ + { 0x0000, 0x0000, 0x0000 }, /* R15333 */ + { 0x0000, 0x0000, 0x0000 }, /* R15334 */ + { 0x0000, 0x0000, 0x0000 }, /* R15335 */ + { 0x0000, 0x0000, 0x0000 }, /* R15336 */ + { 0x0000, 0x0000, 0x0000 }, /* R15337 */ + { 0x0000, 0x0000, 0x0000 }, /* R15338 */ + { 0x0000, 0x0000, 0x0000 }, /* R15339 */ + { 0x0000, 0x0000, 0x0000 }, /* R15340 */ + { 0x0000, 0x0000, 0x0000 }, /* R15341 */ + { 0x0000, 0x0000, 0x0000 }, /* R15342 */ + { 0x0000, 0x0000, 0x0000 }, /* R15343 */ + { 0x0000, 0x0000, 0x0000 }, /* R15344 */ + { 0x0000, 0x0000, 0x0000 }, /* R15345 */ + { 0x0000, 0x0000, 0x0000 }, /* R15346 */ + { 0x0000, 0x0000, 0x0000 }, /* R15347 */ + { 0x0000, 0x0000, 0x0000 }, /* R15348 */ + { 0x0000, 0x0000, 0x0000 }, /* R15349 */ + { 0x0000, 0x0000, 0x0000 }, /* R15350 */ + { 0x0000, 0x0000, 0x0000 }, /* R15351 */ + { 0x0000, 0x0000, 0x0000 }, /* R15352 */ + { 0x0000, 0x0000, 0x0000 }, /* R15353 */ + { 0x0000, 0x0000, 0x0000 }, /* R15354 */ + { 0x0000, 0x0000, 0x0000 }, /* R15355 */ + { 0x0000, 0x0000, 0x0000 }, /* R15356 */ + { 0x0000, 0x0000, 0x0000 }, /* R15357 */ + { 0x0000, 0x0000, 0x0000 }, /* R15358 */ + { 0x0000, 0x0000, 0x0000 }, /* R15359 */ + { 0x07FF, 0x07FF, 0x0000 }, /* R15360 - DSP2 Coeff RAM 0 */ + { 0x0000, 0x0000, 0x0000 }, /* R15361 */ + { 0x0000, 0x0000, 0x0000 }, /* R15362 */ + { 0x0000, 0x0000, 0x0000 }, /* R15363 */ + { 0x0000, 0x0000, 0x0000 }, /* R15364 */ + { 0x0000, 0x0000, 0x0000 }, /* R15365 */ + { 0x0000, 0x0000, 0x0000 }, /* R15366 */ + { 0x0000, 0x0000, 0x0000 }, /* R15367 */ + { 0x0000, 0x0000, 0x0000 }, /* R15368 */ + { 0x0000, 0x0000, 0x0000 }, /* R15369 */ + { 0x0000, 0x0000, 0x0000 }, /* R15370 */ + { 0x0000, 0x0000, 0x0000 }, /* R15371 */ + { 0x0000, 0x0000, 0x0000 }, /* R15372 */ + { 0x0000, 0x0000, 0x0000 }, /* R15373 */ + { 0x0000, 0x0000, 0x0000 }, /* R15374 */ + { 0x0000, 0x0000, 0x0000 }, /* R15375 */ + { 0x0000, 0x0000, 0x0000 }, /* R15376 */ + { 0x0000, 0x0000, 0x0000 }, /* R15377 */ + { 0x0000, 0x0000, 0x0000 }, /* R15378 */ + { 0x0000, 0x0000, 0x0000 }, /* R15379 */ + { 0x0000, 0x0000, 0x0000 }, /* R15380 */ + { 0x0000, 0x0000, 0x0000 }, /* R15381 */ + { 0x0000, 0x0000, 0x0000 }, /* R15382 */ + { 0x0000, 0x0000, 0x0000 }, /* R15383 */ + { 0x0000, 0x0000, 0x0000 }, /* R15384 */ + { 0x0000, 0x0000, 0x0000 }, /* R15385 */ + { 0x0000, 0x0000, 0x0000 }, /* R15386 */ + { 0x0000, 0x0000, 0x0000 }, /* R15387 */ + { 0x0000, 0x0000, 0x0000 }, /* R15388 */ + { 0x0000, 0x0000, 0x0000 }, /* R15389 */ + { 0x0000, 0x0000, 0x0000 }, /* R15390 */ + { 0x0000, 0x0000, 0x0000 }, /* R15391 */ + { 0x0000, 0x0000, 0x0000 }, /* R15392 */ + { 0x0000, 0x0000, 0x0000 }, /* R15393 */ + { 0x0000, 0x0000, 0x0000 }, /* R15394 */ + { 0x0000, 0x0000, 0x0000 }, /* R15395 */ + { 0x0000, 0x0000, 0x0000 }, /* R15396 */ + { 0x0000, 0x0000, 0x0000 }, /* R15397 */ + { 0x0000, 0x0000, 0x0000 }, /* R15398 */ + { 0x0000, 0x0000, 0x0000 }, /* R15399 */ + { 0x0000, 0x0000, 0x0000 }, /* R15400 */ + { 0x0000, 0x0000, 0x0000 }, /* R15401 */ + { 0x0000, 0x0000, 0x0000 }, /* R15402 */ + { 0x0000, 0x0000, 0x0000 }, /* R15403 */ + { 0x0000, 0x0000, 0x0000 }, /* R15404 */ + { 0x0000, 0x0000, 0x0000 }, /* R15405 */ + { 0x0000, 0x0000, 0x0000 }, /* R15406 */ + { 0x0000, 0x0000, 0x0000 }, /* R15407 */ + { 0x0000, 0x0000, 0x0000 }, /* R15408 */ + { 0x0000, 0x0000, 0x0000 }, /* R15409 */ + { 0x0000, 0x0000, 0x0000 }, /* R15410 */ + { 0x0000, 0x0000, 0x0000 }, /* R15411 */ + { 0x0000, 0x0000, 0x0000 }, /* R15412 */ + { 0x0000, 0x0000, 0x0000 }, /* R15413 */ + { 0x0000, 0x0000, 0x0000 }, /* R15414 */ + { 0x0000, 0x0000, 0x0000 }, /* R15415 */ + { 0x0000, 0x0000, 0x0000 }, /* R15416 */ + { 0x0000, 0x0000, 0x0000 }, /* R15417 */ + { 0x0000, 0x0000, 0x0000 }, /* R15418 */ + { 0x0000, 0x0000, 0x0000 }, /* R15419 */ + { 0x0000, 0x0000, 0x0000 }, /* R15420 */ + { 0x0000, 0x0000, 0x0000 }, /* R15421 */ + { 0x0000, 0x0000, 0x0000 }, /* R15422 */ + { 0x0000, 0x0000, 0x0000 }, /* R15423 */ + { 0x0000, 0x0000, 0x0000 }, /* R15424 */ + { 0x0000, 0x0000, 0x0000 }, /* R15425 */ + { 0x0000, 0x0000, 0x0000 }, /* R15426 */ + { 0x0000, 0x0000, 0x0000 }, /* R15427 */ + { 0x0000, 0x0000, 0x0000 }, /* R15428 */ + { 0x0000, 0x0000, 0x0000 }, /* R15429 */ + { 0x0000, 0x0000, 0x0000 }, /* R15430 */ + { 0x0000, 0x0000, 0x0000 }, /* R15431 */ + { 0x0000, 0x0000, 0x0000 }, /* R15432 */ + { 0x0000, 0x0000, 0x0000 }, /* R15433 */ + { 0x0000, 0x0000, 0x0000 }, /* R15434 */ + { 0x0000, 0x0000, 0x0000 }, /* R15435 */ + { 0x0000, 0x0000, 0x0000 }, /* R15436 */ + { 0x0000, 0x0000, 0x0000 }, /* R15437 */ + { 0x0000, 0x0000, 0x0000 }, /* R15438 */ + { 0x0000, 0x0000, 0x0000 }, /* R15439 */ + { 0x0000, 0x0000, 0x0000 }, /* R15440 */ + { 0x0000, 0x0000, 0x0000 }, /* R15441 */ + { 0x0000, 0x0000, 0x0000 }, /* R15442 */ + { 0x0000, 0x0000, 0x0000 }, /* R15443 */ + { 0x0000, 0x0000, 0x0000 }, /* R15444 */ + { 0x0000, 0x0000, 0x0000 }, /* R15445 */ + { 0x0000, 0x0000, 0x0000 }, /* R15446 */ + { 0x0000, 0x0000, 0x0000 }, /* R15447 */ + { 0x0000, 0x0000, 0x0000 }, /* R15448 */ + { 0x0000, 0x0000, 0x0000 }, /* R15449 */ + { 0x0000, 0x0000, 0x0000 }, /* R15450 */ + { 0x0000, 0x0000, 0x0000 }, /* R15451 */ + { 0x0000, 0x0000, 0x0000 }, /* R15452 */ + { 0x0000, 0x0000, 0x0000 }, /* R15453 */ + { 0x0000, 0x0000, 0x0000 }, /* R15454 */ + { 0x0000, 0x0000, 0x0000 }, /* R15455 */ + { 0x0000, 0x0000, 0x0000 }, /* R15456 */ + { 0x0000, 0x0000, 0x0000 }, /* R15457 */ + { 0x0000, 0x0000, 0x0000 }, /* R15458 */ + { 0x0000, 0x0000, 0x0000 }, /* R15459 */ + { 0x0000, 0x0000, 0x0000 }, /* R15460 */ + { 0x0000, 0x0000, 0x0000 }, /* R15461 */ + { 0x0000, 0x0000, 0x0000 }, /* R15462 */ + { 0x0000, 0x0000, 0x0000 }, /* R15463 */ + { 0x0000, 0x0000, 0x0000 }, /* R15464 */ + { 0x0000, 0x0000, 0x0000 }, /* R15465 */ + { 0x0000, 0x0000, 0x0000 }, /* R15466 */ + { 0x0000, 0x0000, 0x0000 }, /* R15467 */ + { 0x0000, 0x0000, 0x0000 }, /* R15468 */ + { 0x0000, 0x0000, 0x0000 }, /* R15469 */ + { 0x0000, 0x0000, 0x0000 }, /* R15470 */ + { 0x0000, 0x0000, 0x0000 }, /* R15471 */ + { 0x0000, 0x0000, 0x0000 }, /* R15472 */ + { 0x0000, 0x0000, 0x0000 }, /* R15473 */ + { 0x0000, 0x0000, 0x0000 }, /* R15474 */ + { 0x0000, 0x0000, 0x0000 }, /* R15475 */ + { 0x0000, 0x0000, 0x0000 }, /* R15476 */ + { 0x0000, 0x0000, 0x0000 }, /* R15477 */ + { 0x0000, 0x0000, 0x0000 }, /* R15478 */ + { 0x0000, 0x0000, 0x0000 }, /* R15479 */ + { 0x0000, 0x0000, 0x0000 }, /* R15480 */ + { 0x0000, 0x0000, 0x0000 }, /* R15481 */ + { 0x0000, 0x0000, 0x0000 }, /* R15482 */ + { 0x0000, 0x0000, 0x0000 }, /* R15483 */ + { 0x0000, 0x0000, 0x0000 }, /* R15484 */ + { 0x0000, 0x0000, 0x0000 }, /* R15485 */ + { 0x0000, 0x0000, 0x0000 }, /* R15486 */ + { 0x0000, 0x0000, 0x0000 }, /* R15487 */ + { 0x0000, 0x0000, 0x0000 }, /* R15488 */ + { 0x0000, 0x0000, 0x0000 }, /* R15489 */ + { 0x0000, 0x0000, 0x0000 }, /* R15490 */ + { 0x0000, 0x0000, 0x0000 }, /* R15491 */ + { 0x0000, 0x0000, 0x0000 }, /* R15492 */ + { 0x0000, 0x0000, 0x0000 }, /* R15493 */ + { 0x0000, 0x0000, 0x0000 }, /* R15494 */ + { 0x0000, 0x0000, 0x0000 }, /* R15495 */ + { 0x0000, 0x0000, 0x0000 }, /* R15496 */ + { 0x0000, 0x0000, 0x0000 }, /* R15497 */ + { 0x0000, 0x0000, 0x0000 }, /* R15498 */ + { 0x0000, 0x0000, 0x0000 }, /* R15499 */ + { 0x0000, 0x0000, 0x0000 }, /* R15500 */ + { 0x0000, 0x0000, 0x0000 }, /* R15501 */ + { 0x0000, 0x0000, 0x0000 }, /* R15502 */ + { 0x0000, 0x0000, 0x0000 }, /* R15503 */ + { 0x0000, 0x0000, 0x0000 }, /* R15504 */ + { 0x0000, 0x0000, 0x0000 }, /* R15505 */ + { 0x0000, 0x0000, 0x0000 }, /* R15506 */ + { 0x0000, 0x0000, 0x0000 }, /* R15507 */ + { 0x0000, 0x0000, 0x0000 }, /* R15508 */ + { 0x0000, 0x0000, 0x0000 }, /* R15509 */ + { 0x0000, 0x0000, 0x0000 }, /* R15510 */ + { 0x0000, 0x0000, 0x0000 }, /* R15511 */ + { 0x0000, 0x0000, 0x0000 }, /* R15512 */ + { 0x0000, 0x0000, 0x0000 }, /* R15513 */ + { 0x0000, 0x0000, 0x0000 }, /* R15514 */ + { 0x0000, 0x0000, 0x0000 }, /* R15515 */ + { 0x0000, 0x0000, 0x0000 }, /* R15516 */ + { 0x0000, 0x0000, 0x0000 }, /* R15517 */ + { 0x0000, 0x0000, 0x0000 }, /* R15518 */ + { 0x0000, 0x0000, 0x0000 }, /* R15519 */ + { 0x0000, 0x0000, 0x0000 }, /* R15520 */ + { 0x0000, 0x0000, 0x0000 }, /* R15521 */ + { 0x0000, 0x0000, 0x0000 }, /* R15522 */ + { 0x0000, 0x0000, 0x0000 }, /* R15523 */ + { 0x0000, 0x0000, 0x0000 }, /* R15524 */ + { 0x0000, 0x0000, 0x0000 }, /* R15525 */ + { 0x0000, 0x0000, 0x0000 }, /* R15526 */ + { 0x0000, 0x0000, 0x0000 }, /* R15527 */ + { 0x0000, 0x0000, 0x0000 }, /* R15528 */ + { 0x0000, 0x0000, 0x0000 }, /* R15529 */ + { 0x0000, 0x0000, 0x0000 }, /* R15530 */ + { 0x0000, 0x0000, 0x0000 }, /* R15531 */ + { 0x0000, 0x0000, 0x0000 }, /* R15532 */ + { 0x0000, 0x0000, 0x0000 }, /* R15533 */ + { 0x0000, 0x0000, 0x0000 }, /* R15534 */ + { 0x0000, 0x0000, 0x0000 }, /* R15535 */ + { 0x0000, 0x0000, 0x0000 }, /* R15536 */ + { 0x0000, 0x0000, 0x0000 }, /* R15537 */ + { 0x0000, 0x0000, 0x0000 }, /* R15538 */ + { 0x0000, 0x0000, 0x0000 }, /* R15539 */ + { 0x0000, 0x0000, 0x0000 }, /* R15540 */ + { 0x0000, 0x0000, 0x0000 }, /* R15541 */ + { 0x0000, 0x0000, 0x0000 }, /* R15542 */ + { 0x0000, 0x0000, 0x0000 }, /* R15543 */ + { 0x0000, 0x0000, 0x0000 }, /* R15544 */ + { 0x0000, 0x0000, 0x0000 }, /* R15545 */ + { 0x0000, 0x0000, 0x0000 }, /* R15546 */ + { 0x0000, 0x0000, 0x0000 }, /* R15547 */ + { 0x0000, 0x0000, 0x0000 }, /* R15548 */ + { 0x0000, 0x0000, 0x0000 }, /* R15549 */ + { 0x0000, 0x0000, 0x0000 }, /* R15550 */ + { 0x0000, 0x0000, 0x0000 }, /* R15551 */ + { 0x0000, 0x0000, 0x0000 }, /* R15552 */ + { 0x0000, 0x0000, 0x0000 }, /* R15553 */ + { 0x0000, 0x0000, 0x0000 }, /* R15554 */ + { 0x0000, 0x0000, 0x0000 }, /* R15555 */ + { 0x0000, 0x0000, 0x0000 }, /* R15556 */ + { 0x0000, 0x0000, 0x0000 }, /* R15557 */ + { 0x0000, 0x0000, 0x0000 }, /* R15558 */ + { 0x0000, 0x0000, 0x0000 }, /* R15559 */ + { 0x0000, 0x0000, 0x0000 }, /* R15560 */ + { 0x0000, 0x0000, 0x0000 }, /* R15561 */ + { 0x0000, 0x0000, 0x0000 }, /* R15562 */ + { 0x0000, 0x0000, 0x0000 }, /* R15563 */ + { 0x0000, 0x0000, 0x0000 }, /* R15564 */ + { 0x0000, 0x0000, 0x0000 }, /* R15565 */ + { 0x0000, 0x0000, 0x0000 }, /* R15566 */ + { 0x0000, 0x0000, 0x0000 }, /* R15567 */ + { 0x0000, 0x0000, 0x0000 }, /* R15568 */ + { 0x0000, 0x0000, 0x0000 }, /* R15569 */ + { 0x0000, 0x0000, 0x0000 }, /* R15570 */ + { 0x0000, 0x0000, 0x0000 }, /* R15571 */ + { 0x0000, 0x0000, 0x0000 }, /* R15572 */ + { 0x0000, 0x0000, 0x0000 }, /* R15573 */ + { 0x0000, 0x0000, 0x0000 }, /* R15574 */ + { 0x0000, 0x0000, 0x0000 }, /* R15575 */ + { 0x0000, 0x0000, 0x0000 }, /* R15576 */ + { 0x0000, 0x0000, 0x0000 }, /* R15577 */ + { 0x0000, 0x0000, 0x0000 }, /* R15578 */ + { 0x0000, 0x0000, 0x0000 }, /* R15579 */ + { 0x0000, 0x0000, 0x0000 }, /* R15580 */ + { 0x0000, 0x0000, 0x0000 }, /* R15581 */ + { 0x0000, 0x0000, 0x0000 }, /* R15582 */ + { 0x0000, 0x0000, 0x0000 }, /* R15583 */ + { 0x0000, 0x0000, 0x0000 }, /* R15584 */ + { 0x0000, 0x0000, 0x0000 }, /* R15585 */ + { 0x0000, 0x0000, 0x0000 }, /* R15586 */ + { 0x0000, 0x0000, 0x0000 }, /* R15587 */ + { 0x0000, 0x0000, 0x0000 }, /* R15588 */ + { 0x0000, 0x0000, 0x0000 }, /* R15589 */ + { 0x0000, 0x0000, 0x0000 }, /* R15590 */ + { 0x0000, 0x0000, 0x0000 }, /* R15591 */ + { 0x0000, 0x0000, 0x0000 }, /* R15592 */ + { 0x0000, 0x0000, 0x0000 }, /* R15593 */ + { 0x0000, 0x0000, 0x0000 }, /* R15594 */ + { 0x0000, 0x0000, 0x0000 }, /* R15595 */ + { 0x0000, 0x0000, 0x0000 }, /* R15596 */ + { 0x0000, 0x0000, 0x0000 }, /* R15597 */ + { 0x0000, 0x0000, 0x0000 }, /* R15598 */ + { 0x0000, 0x0000, 0x0000 }, /* R15599 */ + { 0x0000, 0x0000, 0x0000 }, /* R15600 */ + { 0x0000, 0x0000, 0x0000 }, /* R15601 */ + { 0x0000, 0x0000, 0x0000 }, /* R15602 */ + { 0x0000, 0x0000, 0x0000 }, /* R15603 */ + { 0x0000, 0x0000, 0x0000 }, /* R15604 */ + { 0x0000, 0x0000, 0x0000 }, /* R15605 */ + { 0x0000, 0x0000, 0x0000 }, /* R15606 */ + { 0x0000, 0x0000, 0x0000 }, /* R15607 */ + { 0x0000, 0x0000, 0x0000 }, /* R15608 */ + { 0x0000, 0x0000, 0x0000 }, /* R15609 */ + { 0x0000, 0x0000, 0x0000 }, /* R15610 */ + { 0x0000, 0x0000, 0x0000 }, /* R15611 */ + { 0x0000, 0x0000, 0x0000 }, /* R15612 */ + { 0x0000, 0x0000, 0x0000 }, /* R15613 */ + { 0x0000, 0x0000, 0x0000 }, /* R15614 */ + { 0x0000, 0x0000, 0x0000 }, /* R15615 */ + { 0x0000, 0x0000, 0x0000 }, /* R15616 */ + { 0x0000, 0x0000, 0x0000 }, /* R15617 */ + { 0x0000, 0x0000, 0x0000 }, /* R15618 */ + { 0x0000, 0x0000, 0x0000 }, /* R15619 */ + { 0x0000, 0x0000, 0x0000 }, /* R15620 */ + { 0x0000, 0x0000, 0x0000 }, /* R15621 */ + { 0x0000, 0x0000, 0x0000 }, /* R15622 */ + { 0x0000, 0x0000, 0x0000 }, /* R15623 */ + { 0x0000, 0x0000, 0x0000 }, /* R15624 */ + { 0x0000, 0x0000, 0x0000 }, /* R15625 */ + { 0x0000, 0x0000, 0x0000 }, /* R15626 */ + { 0x0000, 0x0000, 0x0000 }, /* R15627 */ + { 0x0000, 0x0000, 0x0000 }, /* R15628 */ + { 0x0000, 0x0000, 0x0000 }, /* R15629 */ + { 0x0000, 0x0000, 0x0000 }, /* R15630 */ + { 0x0000, 0x0000, 0x0000 }, /* R15631 */ + { 0x0000, 0x0000, 0x0000 }, /* R15632 */ + { 0x0000, 0x0000, 0x0000 }, /* R15633 */ + { 0x0000, 0x0000, 0x0000 }, /* R15634 */ + { 0x0000, 0x0000, 0x0000 }, /* R15635 */ + { 0x0000, 0x0000, 0x0000 }, /* R15636 */ + { 0x0000, 0x0000, 0x0000 }, /* R15637 */ + { 0x0000, 0x0000, 0x0000 }, /* R15638 */ + { 0x0000, 0x0000, 0x0000 }, /* R15639 */ + { 0x0000, 0x0000, 0x0000 }, /* R15640 */ + { 0x0000, 0x0000, 0x0000 }, /* R15641 */ + { 0x0000, 0x0000, 0x0000 }, /* R15642 */ + { 0x0000, 0x0000, 0x0000 }, /* R15643 */ + { 0x0000, 0x0000, 0x0000 }, /* R15644 */ + { 0x0000, 0x0000, 0x0000 }, /* R15645 */ + { 0x0000, 0x0000, 0x0000 }, /* R15646 */ + { 0x0000, 0x0000, 0x0000 }, /* R15647 */ + { 0x0000, 0x0000, 0x0000 }, /* R15648 */ + { 0x0000, 0x0000, 0x0000 }, /* R15649 */ + { 0x0000, 0x0000, 0x0000 }, /* R15650 */ + { 0x0000, 0x0000, 0x0000 }, /* R15651 */ + { 0x0000, 0x0000, 0x0000 }, /* R15652 */ + { 0x0000, 0x0000, 0x0000 }, /* R15653 */ + { 0x0000, 0x0000, 0x0000 }, /* R15654 */ + { 0x0000, 0x0000, 0x0000 }, /* R15655 */ + { 0x0000, 0x0000, 0x0000 }, /* R15656 */ + { 0x0000, 0x0000, 0x0000 }, /* R15657 */ + { 0x0000, 0x0000, 0x0000 }, /* R15658 */ + { 0x0000, 0x0000, 0x0000 }, /* R15659 */ + { 0x0000, 0x0000, 0x0000 }, /* R15660 */ + { 0x0000, 0x0000, 0x0000 }, /* R15661 */ + { 0x0000, 0x0000, 0x0000 }, /* R15662 */ + { 0x0000, 0x0000, 0x0000 }, /* R15663 */ + { 0x0000, 0x0000, 0x0000 }, /* R15664 */ + { 0x0000, 0x0000, 0x0000 }, /* R15665 */ + { 0x0000, 0x0000, 0x0000 }, /* R15666 */ + { 0x0000, 0x0000, 0x0000 }, /* R15667 */ + { 0x0000, 0x0000, 0x0000 }, /* R15668 */ + { 0x0000, 0x0000, 0x0000 }, /* R15669 */ + { 0x0000, 0x0000, 0x0000 }, /* R15670 */ + { 0x0000, 0x0000, 0x0000 }, /* R15671 */ + { 0x0000, 0x0000, 0x0000 }, /* R15672 */ + { 0x0000, 0x0000, 0x0000 }, /* R15673 */ + { 0x0000, 0x0000, 0x0000 }, /* R15674 */ + { 0x0000, 0x0000, 0x0000 }, /* R15675 */ + { 0x0000, 0x0000, 0x0000 }, /* R15676 */ + { 0x0000, 0x0000, 0x0000 }, /* R15677 */ + { 0x0000, 0x0000, 0x0000 }, /* R15678 */ + { 0x0000, 0x0000, 0x0000 }, /* R15679 */ + { 0x0000, 0x0000, 0x0000 }, /* R15680 */ + { 0x0000, 0x0000, 0x0000 }, /* R15681 */ + { 0x0000, 0x0000, 0x0000 }, /* R15682 */ + { 0x0000, 0x0000, 0x0000 }, /* R15683 */ + { 0x0000, 0x0000, 0x0000 }, /* R15684 */ + { 0x0000, 0x0000, 0x0000 }, /* R15685 */ + { 0x0000, 0x0000, 0x0000 }, /* R15686 */ + { 0x0000, 0x0000, 0x0000 }, /* R15687 */ + { 0x0000, 0x0000, 0x0000 }, /* R15688 */ + { 0x0000, 0x0000, 0x0000 }, /* R15689 */ + { 0x0000, 0x0000, 0x0000 }, /* R15690 */ + { 0x0000, 0x0000, 0x0000 }, /* R15691 */ + { 0x0000, 0x0000, 0x0000 }, /* R15692 */ + { 0x0000, 0x0000, 0x0000 }, /* R15693 */ + { 0x0000, 0x0000, 0x0000 }, /* R15694 */ + { 0x0000, 0x0000, 0x0000 }, /* R15695 */ + { 0x0000, 0x0000, 0x0000 }, /* R15696 */ + { 0x0000, 0x0000, 0x0000 }, /* R15697 */ + { 0x0000, 0x0000, 0x0000 }, /* R15698 */ + { 0x0000, 0x0000, 0x0000 }, /* R15699 */ + { 0x0000, 0x0000, 0x0000 }, /* R15700 */ + { 0x0000, 0x0000, 0x0000 }, /* R15701 */ + { 0x0000, 0x0000, 0x0000 }, /* R15702 */ + { 0x0000, 0x0000, 0x0000 }, /* R15703 */ + { 0x0000, 0x0000, 0x0000 }, /* R15704 */ + { 0x0000, 0x0000, 0x0000 }, /* R15705 */ + { 0x0000, 0x0000, 0x0000 }, /* R15706 */ + { 0x0000, 0x0000, 0x0000 }, /* R15707 */ + { 0x0000, 0x0000, 0x0000 }, /* R15708 */ + { 0x0000, 0x0000, 0x0000 }, /* R15709 */ + { 0x0000, 0x0000, 0x0000 }, /* R15710 */ + { 0x0000, 0x0000, 0x0000 }, /* R15711 */ + { 0x0000, 0x0000, 0x0000 }, /* R15712 */ + { 0x0000, 0x0000, 0x0000 }, /* R15713 */ + { 0x0000, 0x0000, 0x0000 }, /* R15714 */ + { 0x0000, 0x0000, 0x0000 }, /* R15715 */ + { 0x0000, 0x0000, 0x0000 }, /* R15716 */ + { 0x0000, 0x0000, 0x0000 }, /* R15717 */ + { 0x0000, 0x0000, 0x0000 }, /* R15718 */ + { 0x0000, 0x0000, 0x0000 }, /* R15719 */ + { 0x0000, 0x0000, 0x0000 }, /* R15720 */ + { 0x0000, 0x0000, 0x0000 }, /* R15721 */ + { 0x0000, 0x0000, 0x0000 }, /* R15722 */ + { 0x0000, 0x0000, 0x0000 }, /* R15723 */ + { 0x0000, 0x0000, 0x0000 }, /* R15724 */ + { 0x0000, 0x0000, 0x0000 }, /* R15725 */ + { 0x0000, 0x0000, 0x0000 }, /* R15726 */ + { 0x0000, 0x0000, 0x0000 }, /* R15727 */ + { 0x0000, 0x0000, 0x0000 }, /* R15728 */ + { 0x0000, 0x0000, 0x0000 }, /* R15729 */ + { 0x0000, 0x0000, 0x0000 }, /* R15730 */ + { 0x0000, 0x0000, 0x0000 }, /* R15731 */ + { 0x0000, 0x0000, 0x0000 }, /* R15732 */ + { 0x0000, 0x0000, 0x0000 }, /* R15733 */ + { 0x0000, 0x0000, 0x0000 }, /* R15734 */ + { 0x0000, 0x0000, 0x0000 }, /* R15735 */ + { 0x0000, 0x0000, 0x0000 }, /* R15736 */ + { 0x0000, 0x0000, 0x0000 }, /* R15737 */ + { 0x0000, 0x0000, 0x0000 }, /* R15738 */ + { 0x0000, 0x0000, 0x0000 }, /* R15739 */ + { 0x0000, 0x0000, 0x0000 }, /* R15740 */ + { 0x0000, 0x0000, 0x0000 }, /* R15741 */ + { 0x0000, 0x0000, 0x0000 }, /* R15742 */ + { 0x0000, 0x0000, 0x0000 }, /* R15743 */ + { 0x0000, 0x0000, 0x0000 }, /* R15744 */ + { 0x0000, 0x0000, 0x0000 }, /* R15745 */ + { 0x0000, 0x0000, 0x0000 }, /* R15746 */ + { 0x0000, 0x0000, 0x0000 }, /* R15747 */ + { 0x0000, 0x0000, 0x0000 }, /* R15748 */ + { 0x0000, 0x0000, 0x0000 }, /* R15749 */ + { 0x0000, 0x0000, 0x0000 }, /* R15750 */ + { 0x0000, 0x0000, 0x0000 }, /* R15751 */ + { 0x0000, 0x0000, 0x0000 }, /* R15752 */ + { 0x0000, 0x0000, 0x0000 }, /* R15753 */ + { 0x0000, 0x0000, 0x0000 }, /* R15754 */ + { 0x0000, 0x0000, 0x0000 }, /* R15755 */ + { 0x0000, 0x0000, 0x0000 }, /* R15756 */ + { 0x0000, 0x0000, 0x0000 }, /* R15757 */ + { 0x0000, 0x0000, 0x0000 }, /* R15758 */ + { 0x0000, 0x0000, 0x0000 }, /* R15759 */ + { 0x0000, 0x0000, 0x0000 }, /* R15760 */ + { 0x0000, 0x0000, 0x0000 }, /* R15761 */ + { 0x0000, 0x0000, 0x0000 }, /* R15762 */ + { 0x0000, 0x0000, 0x0000 }, /* R15763 */ + { 0x0000, 0x0000, 0x0000 }, /* R15764 */ + { 0x0000, 0x0000, 0x0000 }, /* R15765 */ + { 0x0000, 0x0000, 0x0000 }, /* R15766 */ + { 0x0000, 0x0000, 0x0000 }, /* R15767 */ + { 0x0000, 0x0000, 0x0000 }, /* R15768 */ + { 0x0000, 0x0000, 0x0000 }, /* R15769 */ + { 0x0000, 0x0000, 0x0000 }, /* R15770 */ + { 0x0000, 0x0000, 0x0000 }, /* R15771 */ + { 0x0000, 0x0000, 0x0000 }, /* R15772 */ + { 0x0000, 0x0000, 0x0000 }, /* R15773 */ + { 0x0000, 0x0000, 0x0000 }, /* R15774 */ + { 0x0000, 0x0000, 0x0000 }, /* R15775 */ + { 0x0000, 0x0000, 0x0000 }, /* R15776 */ + { 0x0000, 0x0000, 0x0000 }, /* R15777 */ + { 0x0000, 0x0000, 0x0000 }, /* R15778 */ + { 0x0000, 0x0000, 0x0000 }, /* R15779 */ + { 0x0000, 0x0000, 0x0000 }, /* R15780 */ + { 0x0000, 0x0000, 0x0000 }, /* R15781 */ + { 0x0000, 0x0000, 0x0000 }, /* R15782 */ + { 0x0000, 0x0000, 0x0000 }, /* R15783 */ + { 0x0000, 0x0000, 0x0000 }, /* R15784 */ + { 0x0000, 0x0000, 0x0000 }, /* R15785 */ + { 0x0000, 0x0000, 0x0000 }, /* R15786 */ + { 0x0000, 0x0000, 0x0000 }, /* R15787 */ + { 0x0000, 0x0000, 0x0000 }, /* R15788 */ + { 0x0000, 0x0000, 0x0000 }, /* R15789 */ + { 0x0000, 0x0000, 0x0000 }, /* R15790 */ + { 0x0000, 0x0000, 0x0000 }, /* R15791 */ + { 0x0000, 0x0000, 0x0000 }, /* R15792 */ + { 0x0000, 0x0000, 0x0000 }, /* R15793 */ + { 0x0000, 0x0000, 0x0000 }, /* R15794 */ + { 0x0000, 0x0000, 0x0000 }, /* R15795 */ + { 0x0000, 0x0000, 0x0000 }, /* R15796 */ + { 0x0000, 0x0000, 0x0000 }, /* R15797 */ + { 0x0000, 0x0000, 0x0000 }, /* R15798 */ + { 0x0000, 0x0000, 0x0000 }, /* R15799 */ + { 0x0000, 0x0000, 0x0000 }, /* R15800 */ + { 0x0000, 0x0000, 0x0000 }, /* R15801 */ + { 0x0000, 0x0000, 0x0000 }, /* R15802 */ + { 0x0000, 0x0000, 0x0000 }, /* R15803 */ + { 0x0000, 0x0000, 0x0000 }, /* R15804 */ + { 0x0000, 0x0000, 0x0000 }, /* R15805 */ + { 0x0000, 0x0000, 0x0000 }, /* R15806 */ + { 0x0000, 0x0000, 0x0000 }, /* R15807 */ + { 0x0000, 0x0000, 0x0000 }, /* R15808 */ + { 0x0000, 0x0000, 0x0000 }, /* R15809 */ + { 0x0000, 0x0000, 0x0000 }, /* R15810 */ + { 0x0000, 0x0000, 0x0000 }, /* R15811 */ + { 0x0000, 0x0000, 0x0000 }, /* R15812 */ + { 0x0000, 0x0000, 0x0000 }, /* R15813 */ + { 0x0000, 0x0000, 0x0000 }, /* R15814 */ + { 0x0000, 0x0000, 0x0000 }, /* R15815 */ + { 0x0000, 0x0000, 0x0000 }, /* R15816 */ + { 0x0000, 0x0000, 0x0000 }, /* R15817 */ + { 0x0000, 0x0000, 0x0000 }, /* R15818 */ + { 0x0000, 0x0000, 0x0000 }, /* R15819 */ + { 0x0000, 0x0000, 0x0000 }, /* R15820 */ + { 0x0000, 0x0000, 0x0000 }, /* R15821 */ + { 0x0000, 0x0000, 0x0000 }, /* R15822 */ + { 0x0000, 0x0000, 0x0000 }, /* R15823 */ + { 0x0000, 0x0000, 0x0000 }, /* R15824 */ + { 0x0000, 0x0000, 0x0000 }, /* R15825 */ + { 0x0000, 0x0000, 0x0000 }, /* R15826 */ + { 0x0000, 0x0000, 0x0000 }, /* R15827 */ + { 0x0000, 0x0000, 0x0000 }, /* R15828 */ + { 0x0000, 0x0000, 0x0000 }, /* R15829 */ + { 0x0000, 0x0000, 0x0000 }, /* R15830 */ + { 0x0000, 0x0000, 0x0000 }, /* R15831 */ + { 0x0000, 0x0000, 0x0000 }, /* R15832 */ + { 0x0000, 0x0000, 0x0000 }, /* R15833 */ + { 0x0000, 0x0000, 0x0000 }, /* R15834 */ + { 0x0000, 0x0000, 0x0000 }, /* R15835 */ + { 0x0000, 0x0000, 0x0000 }, /* R15836 */ + { 0x0000, 0x0000, 0x0000 }, /* R15837 */ + { 0x0000, 0x0000, 0x0000 }, /* R15838 */ + { 0x0000, 0x0000, 0x0000 }, /* R15839 */ + { 0x0000, 0x0000, 0x0000 }, /* R15840 */ + { 0x0000, 0x0000, 0x0000 }, /* R15841 */ + { 0x0000, 0x0000, 0x0000 }, /* R15842 */ + { 0x0000, 0x0000, 0x0000 }, /* R15843 */ + { 0x0000, 0x0000, 0x0000 }, /* R15844 */ + { 0x0000, 0x0000, 0x0000 }, /* R15845 */ + { 0x0000, 0x0000, 0x0000 }, /* R15846 */ + { 0x0000, 0x0000, 0x0000 }, /* R15847 */ + { 0x0000, 0x0000, 0x0000 }, /* R15848 */ + { 0x0000, 0x0000, 0x0000 }, /* R15849 */ + { 0x0000, 0x0000, 0x0000 }, /* R15850 */ + { 0x0000, 0x0000, 0x0000 }, /* R15851 */ + { 0x0000, 0x0000, 0x0000 }, /* R15852 */ + { 0x0000, 0x0000, 0x0000 }, /* R15853 */ + { 0x0000, 0x0000, 0x0000 }, /* R15854 */ + { 0x0000, 0x0000, 0x0000 }, /* R15855 */ + { 0x0000, 0x0000, 0x0000 }, /* R15856 */ + { 0x0000, 0x0000, 0x0000 }, /* R15857 */ + { 0x0000, 0x0000, 0x0000 }, /* R15858 */ + { 0x0000, 0x0000, 0x0000 }, /* R15859 */ + { 0x0000, 0x0000, 0x0000 }, /* R15860 */ + { 0x0000, 0x0000, 0x0000 }, /* R15861 */ + { 0x0000, 0x0000, 0x0000 }, /* R15862 */ + { 0x0000, 0x0000, 0x0000 }, /* R15863 */ + { 0x0000, 0x0000, 0x0000 }, /* R15864 */ + { 0x0000, 0x0000, 0x0000 }, /* R15865 */ + { 0x0000, 0x0000, 0x0000 }, /* R15866 */ + { 0x0000, 0x0000, 0x0000 }, /* R15867 */ + { 0x0000, 0x0000, 0x0000 }, /* R15868 */ + { 0x0000, 0x0000, 0x0000 }, /* R15869 */ + { 0x0000, 0x0000, 0x0000 }, /* R15870 */ + { 0x0000, 0x0000, 0x0000 }, /* R15871 */ + { 0x0000, 0x0000, 0x0000 }, /* R15872 */ + { 0x0000, 0x0000, 0x0000 }, /* R15873 */ + { 0x0000, 0x0000, 0x0000 }, /* R15874 */ + { 0x0000, 0x0000, 0x0000 }, /* R15875 */ + { 0x0000, 0x0000, 0x0000 }, /* R15876 */ + { 0x0000, 0x0000, 0x0000 }, /* R15877 */ + { 0x0000, 0x0000, 0x0000 }, /* R15878 */ + { 0x0000, 0x0000, 0x0000 }, /* R15879 */ + { 0x0000, 0x0000, 0x0000 }, /* R15880 */ + { 0x0000, 0x0000, 0x0000 }, /* R15881 */ + { 0x0000, 0x0000, 0x0000 }, /* R15882 */ + { 0x0000, 0x0000, 0x0000 }, /* R15883 */ + { 0x0000, 0x0000, 0x0000 }, /* R15884 */ + { 0x0000, 0x0000, 0x0000 }, /* R15885 */ + { 0x0000, 0x0000, 0x0000 }, /* R15886 */ + { 0x0000, 0x0000, 0x0000 }, /* R15887 */ + { 0x0000, 0x0000, 0x0000 }, /* R15888 */ + { 0x0000, 0x0000, 0x0000 }, /* R15889 */ + { 0x0000, 0x0000, 0x0000 }, /* R15890 */ + { 0x0000, 0x0000, 0x0000 }, /* R15891 */ + { 0x0000, 0x0000, 0x0000 }, /* R15892 */ + { 0x0000, 0x0000, 0x0000 }, /* R15893 */ + { 0x0000, 0x0000, 0x0000 }, /* R15894 */ + { 0x0000, 0x0000, 0x0000 }, /* R15895 */ + { 0x0000, 0x0000, 0x0000 }, /* R15896 */ + { 0x0000, 0x0000, 0x0000 }, /* R15897 */ + { 0x0000, 0x0000, 0x0000 }, /* R15898 */ + { 0x0000, 0x0000, 0x0000 }, /* R15899 */ + { 0x0000, 0x0000, 0x0000 }, /* R15900 */ + { 0x0000, 0x0000, 0x0000 }, /* R15901 */ + { 0x0000, 0x0000, 0x0000 }, /* R15902 */ + { 0x0000, 0x0000, 0x0000 }, /* R15903 */ + { 0x0000, 0x0000, 0x0000 }, /* R15904 */ + { 0x0000, 0x0000, 0x0000 }, /* R15905 */ + { 0x0000, 0x0000, 0x0000 }, /* R15906 */ + { 0x0000, 0x0000, 0x0000 }, /* R15907 */ + { 0x0000, 0x0000, 0x0000 }, /* R15908 */ + { 0x0000, 0x0000, 0x0000 }, /* R15909 */ + { 0x0000, 0x0000, 0x0000 }, /* R15910 */ + { 0x0000, 0x0000, 0x0000 }, /* R15911 */ + { 0x0000, 0x0000, 0x0000 }, /* R15912 */ + { 0x0000, 0x0000, 0x0000 }, /* R15913 */ + { 0x0000, 0x0000, 0x0000 }, /* R15914 */ + { 0x0000, 0x0000, 0x0000 }, /* R15915 */ + { 0x0000, 0x0000, 0x0000 }, /* R15916 */ + { 0x0000, 0x0000, 0x0000 }, /* R15917 */ + { 0x0000, 0x0000, 0x0000 }, /* R15918 */ + { 0x0000, 0x0000, 0x0000 }, /* R15919 */ + { 0x0000, 0x0000, 0x0000 }, /* R15920 */ + { 0x0000, 0x0000, 0x0000 }, /* R15921 */ + { 0x0000, 0x0000, 0x0000 }, /* R15922 */ + { 0x0000, 0x0000, 0x0000 }, /* R15923 */ + { 0x0000, 0x0000, 0x0000 }, /* R15924 */ + { 0x0000, 0x0000, 0x0000 }, /* R15925 */ + { 0x0000, 0x0000, 0x0000 }, /* R15926 */ + { 0x0000, 0x0000, 0x0000 }, /* R15927 */ + { 0x0000, 0x0000, 0x0000 }, /* R15928 */ + { 0x0000, 0x0000, 0x0000 }, /* R15929 */ + { 0x0000, 0x0000, 0x0000 }, /* R15930 */ + { 0x0000, 0x0000, 0x0000 }, /* R15931 */ + { 0x0000, 0x0000, 0x0000 }, /* R15932 */ + { 0x0000, 0x0000, 0x0000 }, /* R15933 */ + { 0x0000, 0x0000, 0x0000 }, /* R15934 */ + { 0x0000, 0x0000, 0x0000 }, /* R15935 */ + { 0x0000, 0x0000, 0x0000 }, /* R15936 */ + { 0x0000, 0x0000, 0x0000 }, /* R15937 */ + { 0x0000, 0x0000, 0x0000 }, /* R15938 */ + { 0x0000, 0x0000, 0x0000 }, /* R15939 */ + { 0x0000, 0x0000, 0x0000 }, /* R15940 */ + { 0x0000, 0x0000, 0x0000 }, /* R15941 */ + { 0x0000, 0x0000, 0x0000 }, /* R15942 */ + { 0x0000, 0x0000, 0x0000 }, /* R15943 */ + { 0x0000, 0x0000, 0x0000 }, /* R15944 */ + { 0x0000, 0x0000, 0x0000 }, /* R15945 */ + { 0x0000, 0x0000, 0x0000 }, /* R15946 */ + { 0x0000, 0x0000, 0x0000 }, /* R15947 */ + { 0x0000, 0x0000, 0x0000 }, /* R15948 */ + { 0x0000, 0x0000, 0x0000 }, /* R15949 */ + { 0x0000, 0x0000, 0x0000 }, /* R15950 */ + { 0x0000, 0x0000, 0x0000 }, /* R15951 */ + { 0x0000, 0x0000, 0x0000 }, /* R15952 */ + { 0x0000, 0x0000, 0x0000 }, /* R15953 */ + { 0x0000, 0x0000, 0x0000 }, /* R15954 */ + { 0x0000, 0x0000, 0x0000 }, /* R15955 */ + { 0x0000, 0x0000, 0x0000 }, /* R15956 */ + { 0x0000, 0x0000, 0x0000 }, /* R15957 */ + { 0x0000, 0x0000, 0x0000 }, /* R15958 */ + { 0x0000, 0x0000, 0x0000 }, /* R15959 */ + { 0x0000, 0x0000, 0x0000 }, /* R15960 */ + { 0x0000, 0x0000, 0x0000 }, /* R15961 */ + { 0x0000, 0x0000, 0x0000 }, /* R15962 */ + { 0x0000, 0x0000, 0x0000 }, /* R15963 */ + { 0x0000, 0x0000, 0x0000 }, /* R15964 */ + { 0x0000, 0x0000, 0x0000 }, /* R15965 */ + { 0x0000, 0x0000, 0x0000 }, /* R15966 */ + { 0x0000, 0x0000, 0x0000 }, /* R15967 */ + { 0x0000, 0x0000, 0x0000 }, /* R15968 */ + { 0x0000, 0x0000, 0x0000 }, /* R15969 */ + { 0x0000, 0x0000, 0x0000 }, /* R15970 */ + { 0x0000, 0x0000, 0x0000 }, /* R15971 */ + { 0x0000, 0x0000, 0x0000 }, /* R15972 */ + { 0x0000, 0x0000, 0x0000 }, /* R15973 */ + { 0x0000, 0x0000, 0x0000 }, /* R15974 */ + { 0x0000, 0x0000, 0x0000 }, /* R15975 */ + { 0x0000, 0x0000, 0x0000 }, /* R15976 */ + { 0x0000, 0x0000, 0x0000 }, /* R15977 */ + { 0x0000, 0x0000, 0x0000 }, /* R15978 */ + { 0x0000, 0x0000, 0x0000 }, /* R15979 */ + { 0x0000, 0x0000, 0x0000 }, /* R15980 */ + { 0x0000, 0x0000, 0x0000 }, /* R15981 */ + { 0x0000, 0x0000, 0x0000 }, /* R15982 */ + { 0x0000, 0x0000, 0x0000 }, /* R15983 */ + { 0x0000, 0x0000, 0x0000 }, /* R15984 */ + { 0x0000, 0x0000, 0x0000 }, /* R15985 */ + { 0x0000, 0x0000, 0x0000 }, /* R15986 */ + { 0x0000, 0x0000, 0x0000 }, /* R15987 */ + { 0x0000, 0x0000, 0x0000 }, /* R15988 */ + { 0x0000, 0x0000, 0x0000 }, /* R15989 */ + { 0x0000, 0x0000, 0x0000 }, /* R15990 */ + { 0x0000, 0x0000, 0x0000 }, /* R15991 */ + { 0x0000, 0x0000, 0x0000 }, /* R15992 */ + { 0x0000, 0x0000, 0x0000 }, /* R15993 */ + { 0x0000, 0x0000, 0x0000 }, /* R15994 */ + { 0x0000, 0x0000, 0x0000 }, /* R15995 */ + { 0x0000, 0x0000, 0x0000 }, /* R15996 */ + { 0x0000, 0x0000, 0x0000 }, /* R15997 */ + { 0x0000, 0x0000, 0x0000 }, /* R15998 */ + { 0x0000, 0x0000, 0x0000 }, /* R15999 */ + { 0x0000, 0x0000, 0x0000 }, /* R16000 */ + { 0x0000, 0x0000, 0x0000 }, /* R16001 */ + { 0x0000, 0x0000, 0x0000 }, /* R16002 */ + { 0x0000, 0x0000, 0x0000 }, /* R16003 */ + { 0x0000, 0x0000, 0x0000 }, /* R16004 */ + { 0x0000, 0x0000, 0x0000 }, /* R16005 */ + { 0x0000, 0x0000, 0x0000 }, /* R16006 */ + { 0x0000, 0x0000, 0x0000 }, /* R16007 */ + { 0x0000, 0x0000, 0x0000 }, /* R16008 */ + { 0x0000, 0x0000, 0x0000 }, /* R16009 */ + { 0x0000, 0x0000, 0x0000 }, /* R16010 */ + { 0x0000, 0x0000, 0x0000 }, /* R16011 */ + { 0x0000, 0x0000, 0x0000 }, /* R16012 */ + { 0x0000, 0x0000, 0x0000 }, /* R16013 */ + { 0x0000, 0x0000, 0x0000 }, /* R16014 */ + { 0x0000, 0x0000, 0x0000 }, /* R16015 */ + { 0x0000, 0x0000, 0x0000 }, /* R16016 */ + { 0x0000, 0x0000, 0x0000 }, /* R16017 */ + { 0x0000, 0x0000, 0x0000 }, /* R16018 */ + { 0x0000, 0x0000, 0x0000 }, /* R16019 */ + { 0x0000, 0x0000, 0x0000 }, /* R16020 */ + { 0x0000, 0x0000, 0x0000 }, /* R16021 */ + { 0x0000, 0x0000, 0x0000 }, /* R16022 */ + { 0x0000, 0x0000, 0x0000 }, /* R16023 */ + { 0x0000, 0x0000, 0x0000 }, /* R16024 */ + { 0x0000, 0x0000, 0x0000 }, /* R16025 */ + { 0x0000, 0x0000, 0x0000 }, /* R16026 */ + { 0x0000, 0x0000, 0x0000 }, /* R16027 */ + { 0x0000, 0x0000, 0x0000 }, /* R16028 */ + { 0x0000, 0x0000, 0x0000 }, /* R16029 */ + { 0x0000, 0x0000, 0x0000 }, /* R16030 */ + { 0x0000, 0x0000, 0x0000 }, /* R16031 */ + { 0x0000, 0x0000, 0x0000 }, /* R16032 */ + { 0x0000, 0x0000, 0x0000 }, /* R16033 */ + { 0x0000, 0x0000, 0x0000 }, /* R16034 */ + { 0x0000, 0x0000, 0x0000 }, /* R16035 */ + { 0x0000, 0x0000, 0x0000 }, /* R16036 */ + { 0x0000, 0x0000, 0x0000 }, /* R16037 */ + { 0x0000, 0x0000, 0x0000 }, /* R16038 */ + { 0x0000, 0x0000, 0x0000 }, /* R16039 */ + { 0x0000, 0x0000, 0x0000 }, /* R16040 */ + { 0x0000, 0x0000, 0x0000 }, /* R16041 */ + { 0x0000, 0x0000, 0x0000 }, /* R16042 */ + { 0x0000, 0x0000, 0x0000 }, /* R16043 */ + { 0x0000, 0x0000, 0x0000 }, /* R16044 */ + { 0x0000, 0x0000, 0x0000 }, /* R16045 */ + { 0x0000, 0x0000, 0x0000 }, /* R16046 */ + { 0x0000, 0x0000, 0x0000 }, /* R16047 */ + { 0x0000, 0x0000, 0x0000 }, /* R16048 */ + { 0x0000, 0x0000, 0x0000 }, /* R16049 */ + { 0x0000, 0x0000, 0x0000 }, /* R16050 */ + { 0x0000, 0x0000, 0x0000 }, /* R16051 */ + { 0x0000, 0x0000, 0x0000 }, /* R16052 */ + { 0x0000, 0x0000, 0x0000 }, /* R16053 */ + { 0x0000, 0x0000, 0x0000 }, /* R16054 */ + { 0x0000, 0x0000, 0x0000 }, /* R16055 */ + { 0x0000, 0x0000, 0x0000 }, /* R16056 */ + { 0x0000, 0x0000, 0x0000 }, /* R16057 */ + { 0x0000, 0x0000, 0x0000 }, /* R16058 */ + { 0x0000, 0x0000, 0x0000 }, /* R16059 */ + { 0x0000, 0x0000, 0x0000 }, /* R16060 */ + { 0x0000, 0x0000, 0x0000 }, /* R16061 */ + { 0x0000, 0x0000, 0x0000 }, /* R16062 */ + { 0x0000, 0x0000, 0x0000 }, /* R16063 */ + { 0x0000, 0x0000, 0x0000 }, /* R16064 */ + { 0x0000, 0x0000, 0x0000 }, /* R16065 */ + { 0x0000, 0x0000, 0x0000 }, /* R16066 */ + { 0x0000, 0x0000, 0x0000 }, /* R16067 */ + { 0x0000, 0x0000, 0x0000 }, /* R16068 */ + { 0x0000, 0x0000, 0x0000 }, /* R16069 */ + { 0x0000, 0x0000, 0x0000 }, /* R16070 */ + { 0x0000, 0x0000, 0x0000 }, /* R16071 */ + { 0x0000, 0x0000, 0x0000 }, /* R16072 */ + { 0x0000, 0x0000, 0x0000 }, /* R16073 */ + { 0x0000, 0x0000, 0x0000 }, /* R16074 */ + { 0x0000, 0x0000, 0x0000 }, /* R16075 */ + { 0x0000, 0x0000, 0x0000 }, /* R16076 */ + { 0x0000, 0x0000, 0x0000 }, /* R16077 */ + { 0x0000, 0x0000, 0x0000 }, /* R16078 */ + { 0x0000, 0x0000, 0x0000 }, /* R16079 */ + { 0x0000, 0x0000, 0x0000 }, /* R16080 */ + { 0x0000, 0x0000, 0x0000 }, /* R16081 */ + { 0x0000, 0x0000, 0x0000 }, /* R16082 */ + { 0x0000, 0x0000, 0x0000 }, /* R16083 */ + { 0x0000, 0x0000, 0x0000 }, /* R16084 */ + { 0x0000, 0x0000, 0x0000 }, /* R16085 */ + { 0x0000, 0x0000, 0x0000 }, /* R16086 */ + { 0x0000, 0x0000, 0x0000 }, /* R16087 */ + { 0x0000, 0x0000, 0x0000 }, /* R16088 */ + { 0x0000, 0x0000, 0x0000 }, /* R16089 */ + { 0x0000, 0x0000, 0x0000 }, /* R16090 */ + { 0x0000, 0x0000, 0x0000 }, /* R16091 */ + { 0x0000, 0x0000, 0x0000 }, /* R16092 */ + { 0x0000, 0x0000, 0x0000 }, /* R16093 */ + { 0x0000, 0x0000, 0x0000 }, /* R16094 */ + { 0x0000, 0x0000, 0x0000 }, /* R16095 */ + { 0x0000, 0x0000, 0x0000 }, /* R16096 */ + { 0x0000, 0x0000, 0x0000 }, /* R16097 */ + { 0x0000, 0x0000, 0x0000 }, /* R16098 */ + { 0x0000, 0x0000, 0x0000 }, /* R16099 */ + { 0x0000, 0x0000, 0x0000 }, /* R16100 */ + { 0x0000, 0x0000, 0x0000 }, /* R16101 */ + { 0x0000, 0x0000, 0x0000 }, /* R16102 */ + { 0x0000, 0x0000, 0x0000 }, /* R16103 */ + { 0x0000, 0x0000, 0x0000 }, /* R16104 */ + { 0x0000, 0x0000, 0x0000 }, /* R16105 */ + { 0x0000, 0x0000, 0x0000 }, /* R16106 */ + { 0x0000, 0x0000, 0x0000 }, /* R16107 */ + { 0x0000, 0x0000, 0x0000 }, /* R16108 */ + { 0x0000, 0x0000, 0x0000 }, /* R16109 */ + { 0x0000, 0x0000, 0x0000 }, /* R16110 */ + { 0x0000, 0x0000, 0x0000 }, /* R16111 */ + { 0x0000, 0x0000, 0x0000 }, /* R16112 */ + { 0x0000, 0x0000, 0x0000 }, /* R16113 */ + { 0x0000, 0x0000, 0x0000 }, /* R16114 */ + { 0x0000, 0x0000, 0x0000 }, /* R16115 */ + { 0x0000, 0x0000, 0x0000 }, /* R16116 */ + { 0x0000, 0x0000, 0x0000 }, /* R16117 */ + { 0x0000, 0x0000, 0x0000 }, /* R16118 */ + { 0x0000, 0x0000, 0x0000 }, /* R16119 */ + { 0x0000, 0x0000, 0x0000 }, /* R16120 */ + { 0x0000, 0x0000, 0x0000 }, /* R16121 */ + { 0x0000, 0x0000, 0x0000 }, /* R16122 */ + { 0x0000, 0x0000, 0x0000 }, /* R16123 */ + { 0x0000, 0x0000, 0x0000 }, /* R16124 */ + { 0x0000, 0x0000, 0x0000 }, /* R16125 */ + { 0x0000, 0x0000, 0x0000 }, /* R16126 */ + { 0x0000, 0x0000, 0x0000 }, /* R16127 */ + { 0x0000, 0x0000, 0x0000 }, /* R16128 */ + { 0x0000, 0x0000, 0x0000 }, /* R16129 */ + { 0x0000, 0x0000, 0x0000 }, /* R16130 */ + { 0x0000, 0x0000, 0x0000 }, /* R16131 */ + { 0x0000, 0x0000, 0x0000 }, /* R16132 */ + { 0x0000, 0x0000, 0x0000 }, /* R16133 */ + { 0x0000, 0x0000, 0x0000 }, /* R16134 */ + { 0x0000, 0x0000, 0x0000 }, /* R16135 */ + { 0x0000, 0x0000, 0x0000 }, /* R16136 */ + { 0x0000, 0x0000, 0x0000 }, /* R16137 */ + { 0x0000, 0x0000, 0x0000 }, /* R16138 */ + { 0x0000, 0x0000, 0x0000 }, /* R16139 */ + { 0x0000, 0x0000, 0x0000 }, /* R16140 */ + { 0x0000, 0x0000, 0x0000 }, /* R16141 */ + { 0x0000, 0x0000, 0x0000 }, /* R16142 */ + { 0x0000, 0x0000, 0x0000 }, /* R16143 */ + { 0x0000, 0x0000, 0x0000 }, /* R16144 */ + { 0x0000, 0x0000, 0x0000 }, /* R16145 */ + { 0x0000, 0x0000, 0x0000 }, /* R16146 */ + { 0x0000, 0x0000, 0x0000 }, /* R16147 */ + { 0x0000, 0x0000, 0x0000 }, /* R16148 */ + { 0x0000, 0x0000, 0x0000 }, /* R16149 */ + { 0x0000, 0x0000, 0x0000 }, /* R16150 */ + { 0x0000, 0x0000, 0x0000 }, /* R16151 */ + { 0x0000, 0x0000, 0x0000 }, /* R16152 */ + { 0x0000, 0x0000, 0x0000 }, /* R16153 */ + { 0x0000, 0x0000, 0x0000 }, /* R16154 */ + { 0x0000, 0x0000, 0x0000 }, /* R16155 */ + { 0x0000, 0x0000, 0x0000 }, /* R16156 */ + { 0x0000, 0x0000, 0x0000 }, /* R16157 */ + { 0x0000, 0x0000, 0x0000 }, /* R16158 */ + { 0x0000, 0x0000, 0x0000 }, /* R16159 */ + { 0x0000, 0x0000, 0x0000 }, /* R16160 */ + { 0x0000, 0x0000, 0x0000 }, /* R16161 */ + { 0x0000, 0x0000, 0x0000 }, /* R16162 */ + { 0x0000, 0x0000, 0x0000 }, /* R16163 */ + { 0x0000, 0x0000, 0x0000 }, /* R16164 */ + { 0x0000, 0x0000, 0x0000 }, /* R16165 */ + { 0x0000, 0x0000, 0x0000 }, /* R16166 */ + { 0x0000, 0x0000, 0x0000 }, /* R16167 */ + { 0x0000, 0x0000, 0x0000 }, /* R16168 */ + { 0x0000, 0x0000, 0x0000 }, /* R16169 */ + { 0x0000, 0x0000, 0x0000 }, /* R16170 */ + { 0x0000, 0x0000, 0x0000 }, /* R16171 */ + { 0x0000, 0x0000, 0x0000 }, /* R16172 */ + { 0x0000, 0x0000, 0x0000 }, /* R16173 */ + { 0x0000, 0x0000, 0x0000 }, /* R16174 */ + { 0x0000, 0x0000, 0x0000 }, /* R16175 */ + { 0x0000, 0x0000, 0x0000 }, /* R16176 */ + { 0x0000, 0x0000, 0x0000 }, /* R16177 */ + { 0x0000, 0x0000, 0x0000 }, /* R16178 */ + { 0x0000, 0x0000, 0x0000 }, /* R16179 */ + { 0x0000, 0x0000, 0x0000 }, /* R16180 */ + { 0x0000, 0x0000, 0x0000 }, /* R16181 */ + { 0x0000, 0x0000, 0x0000 }, /* R16182 */ + { 0x0000, 0x0000, 0x0000 }, /* R16183 */ + { 0x0000, 0x0000, 0x0000 }, /* R16184 */ + { 0x0000, 0x0000, 0x0000 }, /* R16185 */ + { 0x0000, 0x0000, 0x0000 }, /* R16186 */ + { 0x0000, 0x0000, 0x0000 }, /* R16187 */ + { 0x0000, 0x0000, 0x0000 }, /* R16188 */ + { 0x0000, 0x0000, 0x0000 }, /* R16189 */ + { 0x0000, 0x0000, 0x0000 }, /* R16190 */ + { 0x0000, 0x0000, 0x0000 }, /* R16191 */ + { 0x0000, 0x0000, 0x0000 }, /* R16192 */ + { 0x0000, 0x0000, 0x0000 }, /* R16193 */ + { 0x0000, 0x0000, 0x0000 }, /* R16194 */ + { 0x0000, 0x0000, 0x0000 }, /* R16195 */ + { 0x0000, 0x0000, 0x0000 }, /* R16196 */ + { 0x0000, 0x0000, 0x0000 }, /* R16197 */ + { 0x0000, 0x0000, 0x0000 }, /* R16198 */ + { 0x0000, 0x0000, 0x0000 }, /* R16199 */ + { 0x0000, 0x0000, 0x0000 }, /* R16200 */ + { 0x0000, 0x0000, 0x0000 }, /* R16201 */ + { 0x0000, 0x0000, 0x0000 }, /* R16202 */ + { 0x0000, 0x0000, 0x0000 }, /* R16203 */ + { 0x0000, 0x0000, 0x0000 }, /* R16204 */ + { 0x0000, 0x0000, 0x0000 }, /* R16205 */ + { 0x0000, 0x0000, 0x0000 }, /* R16206 */ + { 0x0000, 0x0000, 0x0000 }, /* R16207 */ + { 0x0000, 0x0000, 0x0000 }, /* R16208 */ + { 0x0000, 0x0000, 0x0000 }, /* R16209 */ + { 0x0000, 0x0000, 0x0000 }, /* R16210 */ + { 0x0000, 0x0000, 0x0000 }, /* R16211 */ + { 0x0000, 0x0000, 0x0000 }, /* R16212 */ + { 0x0000, 0x0000, 0x0000 }, /* R16213 */ + { 0x0000, 0x0000, 0x0000 }, /* R16214 */ + { 0x0000, 0x0000, 0x0000 }, /* R16215 */ + { 0x0000, 0x0000, 0x0000 }, /* R16216 */ + { 0x0000, 0x0000, 0x0000 }, /* R16217 */ + { 0x0000, 0x0000, 0x0000 }, /* R16218 */ + { 0x0000, 0x0000, 0x0000 }, /* R16219 */ + { 0x0000, 0x0000, 0x0000 }, /* R16220 */ + { 0x0000, 0x0000, 0x0000 }, /* R16221 */ + { 0x0000, 0x0000, 0x0000 }, /* R16222 */ + { 0x0000, 0x0000, 0x0000 }, /* R16223 */ + { 0x0000, 0x0000, 0x0000 }, /* R16224 */ + { 0x0000, 0x0000, 0x0000 }, /* R16225 */ + { 0x0000, 0x0000, 0x0000 }, /* R16226 */ + { 0x0000, 0x0000, 0x0000 }, /* R16227 */ + { 0x0000, 0x0000, 0x0000 }, /* R16228 */ + { 0x0000, 0x0000, 0x0000 }, /* R16229 */ + { 0x0000, 0x0000, 0x0000 }, /* R16230 */ + { 0x0000, 0x0000, 0x0000 }, /* R16231 */ + { 0x0000, 0x0000, 0x0000 }, /* R16232 */ + { 0x0000, 0x0000, 0x0000 }, /* R16233 */ + { 0x0000, 0x0000, 0x0000 }, /* R16234 */ + { 0x0000, 0x0000, 0x0000 }, /* R16235 */ + { 0x0000, 0x0000, 0x0000 }, /* R16236 */ + { 0x0000, 0x0000, 0x0000 }, /* R16237 */ + { 0x0000, 0x0000, 0x0000 }, /* R16238 */ + { 0x0000, 0x0000, 0x0000 }, /* R16239 */ + { 0x0000, 0x0000, 0x0000 }, /* R16240 */ + { 0x0000, 0x0000, 0x0000 }, /* R16241 */ + { 0x0000, 0x0000, 0x0000 }, /* R16242 */ + { 0x0000, 0x0000, 0x0000 }, /* R16243 */ + { 0x0000, 0x0000, 0x0000 }, /* R16244 */ + { 0x0000, 0x0000, 0x0000 }, /* R16245 */ + { 0x0000, 0x0000, 0x0000 }, /* R16246 */ + { 0x0000, 0x0000, 0x0000 }, /* R16247 */ + { 0x0000, 0x0000, 0x0000 }, /* R16248 */ + { 0x0000, 0x0000, 0x0000 }, /* R16249 */ + { 0x0000, 0x0000, 0x0000 }, /* R16250 */ + { 0x0000, 0x0000, 0x0000 }, /* R16251 */ + { 0x0000, 0x0000, 0x0000 }, /* R16252 */ + { 0x0000, 0x0000, 0x0000 }, /* R16253 */ + { 0x0000, 0x0000, 0x0000 }, /* R16254 */ + { 0x0000, 0x0000, 0x0000 }, /* R16255 */ + { 0x0000, 0x0000, 0x0000 }, /* R16256 */ + { 0x0000, 0x0000, 0x0000 }, /* R16257 */ + { 0x0000, 0x0000, 0x0000 }, /* R16258 */ + { 0x0000, 0x0000, 0x0000 }, /* R16259 */ + { 0x0000, 0x0000, 0x0000 }, /* R16260 */ + { 0x0000, 0x0000, 0x0000 }, /* R16261 */ + { 0x0000, 0x0000, 0x0000 }, /* R16262 */ + { 0x0000, 0x0000, 0x0000 }, /* R16263 */ + { 0x0000, 0x0000, 0x0000 }, /* R16264 */ + { 0x0000, 0x0000, 0x0000 }, /* R16265 */ + { 0x0000, 0x0000, 0x0000 }, /* R16266 */ + { 0x0000, 0x0000, 0x0000 }, /* R16267 */ + { 0x0000, 0x0000, 0x0000 }, /* R16268 */ + { 0x0000, 0x0000, 0x0000 }, /* R16269 */ + { 0x0000, 0x0000, 0x0000 }, /* R16270 */ + { 0x0000, 0x0000, 0x0000 }, /* R16271 */ + { 0x0000, 0x0000, 0x0000 }, /* R16272 */ + { 0x0000, 0x0000, 0x0000 }, /* R16273 */ + { 0x0000, 0x0000, 0x0000 }, /* R16274 */ + { 0x0000, 0x0000, 0x0000 }, /* R16275 */ + { 0x0000, 0x0000, 0x0000 }, /* R16276 */ + { 0x0000, 0x0000, 0x0000 }, /* R16277 */ + { 0x0000, 0x0000, 0x0000 }, /* R16278 */ + { 0x0000, 0x0000, 0x0000 }, /* R16279 */ + { 0x0000, 0x0000, 0x0000 }, /* R16280 */ + { 0x0000, 0x0000, 0x0000 }, /* R16281 */ + { 0x0000, 0x0000, 0x0000 }, /* R16282 */ + { 0x0000, 0x0000, 0x0000 }, /* R16283 */ + { 0x0000, 0x0000, 0x0000 }, /* R16284 */ + { 0x0000, 0x0000, 0x0000 }, /* R16285 */ + { 0x0000, 0x0000, 0x0000 }, /* R16286 */ + { 0x0000, 0x0000, 0x0000 }, /* R16287 */ + { 0x0000, 0x0000, 0x0000 }, /* R16288 */ + { 0x0000, 0x0000, 0x0000 }, /* R16289 */ + { 0x0000, 0x0000, 0x0000 }, /* R16290 */ + { 0x0000, 0x0000, 0x0000 }, /* R16291 */ + { 0x0000, 0x0000, 0x0000 }, /* R16292 */ + { 0x0000, 0x0000, 0x0000 }, /* R16293 */ + { 0x0000, 0x0000, 0x0000 }, /* R16294 */ + { 0x0000, 0x0000, 0x0000 }, /* R16295 */ + { 0x0000, 0x0000, 0x0000 }, /* R16296 */ + { 0x0000, 0x0000, 0x0000 }, /* R16297 */ + { 0x0000, 0x0000, 0x0000 }, /* R16298 */ + { 0x0000, 0x0000, 0x0000 }, /* R16299 */ + { 0x0000, 0x0000, 0x0000 }, /* R16300 */ + { 0x0000, 0x0000, 0x0000 }, /* R16301 */ + { 0x0000, 0x0000, 0x0000 }, /* R16302 */ + { 0x0000, 0x0000, 0x0000 }, /* R16303 */ + { 0x0000, 0x0000, 0x0000 }, /* R16304 */ + { 0x0000, 0x0000, 0x0000 }, /* R16305 */ + { 0x0000, 0x0000, 0x0000 }, /* R16306 */ + { 0x0000, 0x0000, 0x0000 }, /* R16307 */ + { 0x0000, 0x0000, 0x0000 }, /* R16308 */ + { 0x0000, 0x0000, 0x0000 }, /* R16309 */ + { 0x0000, 0x0000, 0x0000 }, /* R16310 */ + { 0x0000, 0x0000, 0x0000 }, /* R16311 */ + { 0x0000, 0x0000, 0x0000 }, /* R16312 */ + { 0x0000, 0x0000, 0x0000 }, /* R16313 */ + { 0x0000, 0x0000, 0x0000 }, /* R16314 */ + { 0x0000, 0x0000, 0x0000 }, /* R16315 */ + { 0x0000, 0x0000, 0x0000 }, /* R16316 */ + { 0x0000, 0x0000, 0x0000 }, /* R16317 */ + { 0x0000, 0x0000, 0x0000 }, /* R16318 */ + { 0x0000, 0x0000, 0x0000 }, /* R16319 */ + { 0x0000, 0x0000, 0x0000 }, /* R16320 */ + { 0x0000, 0x0000, 0x0000 }, /* R16321 */ + { 0x0000, 0x0000, 0x0000 }, /* R16322 */ + { 0x0000, 0x0000, 0x0000 }, /* R16323 */ + { 0x0000, 0x0000, 0x0000 }, /* R16324 */ + { 0x0000, 0x0000, 0x0000 }, /* R16325 */ + { 0x0000, 0x0000, 0x0000 }, /* R16326 */ + { 0x0000, 0x0000, 0x0000 }, /* R16327 */ + { 0x0000, 0x0000, 0x0000 }, /* R16328 */ + { 0x0000, 0x0000, 0x0000 }, /* R16329 */ + { 0x0000, 0x0000, 0x0000 }, /* R16330 */ + { 0x0000, 0x0000, 0x0000 }, /* R16331 */ + { 0x0000, 0x0000, 0x0000 }, /* R16332 */ + { 0x0000, 0x0000, 0x0000 }, /* R16333 */ + { 0x0000, 0x0000, 0x0000 }, /* R16334 */ + { 0x0000, 0x0000, 0x0000 }, /* R16335 */ + { 0x0000, 0x0000, 0x0000 }, /* R16336 */ + { 0x0000, 0x0000, 0x0000 }, /* R16337 */ + { 0x0000, 0x0000, 0x0000 }, /* R16338 */ + { 0x0000, 0x0000, 0x0000 }, /* R16339 */ + { 0x0000, 0x0000, 0x0000 }, /* R16340 */ + { 0x0000, 0x0000, 0x0000 }, /* R16341 */ + { 0x0000, 0x0000, 0x0000 }, /* R16342 */ + { 0x0000, 0x0000, 0x0000 }, /* R16343 */ + { 0x0000, 0x0000, 0x0000 }, /* R16344 */ + { 0x0000, 0x0000, 0x0000 }, /* R16345 */ + { 0x0000, 0x0000, 0x0000 }, /* R16346 */ + { 0x0000, 0x0000, 0x0000 }, /* R16347 */ + { 0x0000, 0x0000, 0x0000 }, /* R16348 */ + { 0x0000, 0x0000, 0x0000 }, /* R16349 */ + { 0x0000, 0x0000, 0x0000 }, /* R16350 */ + { 0x0000, 0x0000, 0x0000 }, /* R16351 */ + { 0x0000, 0x0000, 0x0000 }, /* R16352 */ + { 0x0000, 0x0000, 0x0000 }, /* R16353 */ + { 0x0000, 0x0000, 0x0000 }, /* R16354 */ + { 0x0000, 0x0000, 0x0000 }, /* R16355 */ + { 0x0000, 0x0000, 0x0000 }, /* R16356 */ + { 0x0000, 0x0000, 0x0000 }, /* R16357 */ + { 0x0000, 0x0000, 0x0000 }, /* R16358 */ + { 0x0000, 0x0000, 0x0000 }, /* R16359 */ + { 0x0000, 0x0000, 0x0000 }, /* R16360 */ + { 0x0000, 0x0000, 0x0000 }, /* R16361 */ + { 0x0000, 0x0000, 0x0000 }, /* R16362 */ + { 0x0000, 0x0000, 0x0000 }, /* R16363 */ + { 0x0000, 0x0000, 0x0000 }, /* R16364 */ + { 0x0000, 0x0000, 0x0000 }, /* R16365 */ + { 0x0000, 0x0000, 0x0000 }, /* R16366 */ + { 0x0000, 0x0000, 0x0000 }, /* R16367 */ + { 0x0000, 0x0000, 0x0000 }, /* R16368 */ + { 0x0000, 0x0000, 0x0000 }, /* R16369 */ + { 0x0000, 0x0000, 0x0000 }, /* R16370 */ + { 0x0000, 0x0000, 0x0000 }, /* R16371 */ + { 0x0000, 0x0000, 0x0000 }, /* R16372 */ + { 0x0000, 0x0000, 0x0000 }, /* R16373 */ + { 0x0000, 0x0000, 0x0000 }, /* R16374 */ + { 0x0000, 0x0000, 0x0000 }, /* R16375 */ + { 0x0000, 0x0000, 0x0000 }, /* R16376 */ + { 0x0000, 0x0000, 0x0000 }, /* R16377 */ + { 0x0000, 0x0000, 0x0000 }, /* R16378 */ + { 0x0000, 0x0000, 0x0000 }, /* R16379 */ + { 0x0000, 0x0000, 0x0000 }, /* R16380 */ + { 0x0000, 0x0000, 0x0000 }, /* R16381 */ + { 0x0000, 0x0000, 0x0000 }, /* R16382 */ + { 0x0000, 0x0000, 0x0000 }, /* R16383 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16384 - RETUNEADC_SHARED_COEFF_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16385 - RETUNEADC_SHARED_COEFF_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16386 - RETUNEDAC_SHARED_COEFF_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16387 - RETUNEDAC_SHARED_COEFF_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16388 - SOUNDSTAGE_ENABLES_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16389 - SOUNDSTAGE_ENABLES_0 */ + { 0x0000, 0x0000, 0x0000 }, /* R16390 */ + { 0x0000, 0x0000, 0x0000 }, /* R16391 */ + { 0x0000, 0x0000, 0x0000 }, /* R16392 */ + { 0x0000, 0x0000, 0x0000 }, /* R16393 */ + { 0x0000, 0x0000, 0x0000 }, /* R16394 */ + { 0x0000, 0x0000, 0x0000 }, /* R16395 */ + { 0x0000, 0x0000, 0x0000 }, /* R16396 */ + { 0x0000, 0x0000, 0x0000 }, /* R16397 */ + { 0x0000, 0x0000, 0x0000 }, /* R16398 */ + { 0x0000, 0x0000, 0x0000 }, /* R16399 */ + { 0x0000, 0x0000, 0x0000 }, /* R16400 */ + { 0x0000, 0x0000, 0x0000 }, /* R16401 */ + { 0x0000, 0x0000, 0x0000 }, /* R16402 */ + { 0x0000, 0x0000, 0x0000 }, /* R16403 */ + { 0x0000, 0x0000, 0x0000 }, /* R16404 */ + { 0x0000, 0x0000, 0x0000 }, /* R16405 */ + { 0x0000, 0x0000, 0x0000 }, /* R16406 */ + { 0x0000, 0x0000, 0x0000 }, /* R16407 */ + { 0x0000, 0x0000, 0x0000 }, /* R16408 */ + { 0x0000, 0x0000, 0x0000 }, /* R16409 */ + { 0x0000, 0x0000, 0x0000 }, /* R16410 */ + { 0x0000, 0x0000, 0x0000 }, /* R16411 */ + { 0x0000, 0x0000, 0x0000 }, /* R16412 */ + { 0x0000, 0x0000, 0x0000 }, /* R16413 */ + { 0x0000, 0x0000, 0x0000 }, /* R16414 */ + { 0x0000, 0x0000, 0x0000 }, /* R16415 */ + { 0x0000, 0x0000, 0x0000 }, /* R16416 */ + { 0x0000, 0x0000, 0x0000 }, /* R16417 */ + { 0x0000, 0x0000, 0x0000 }, /* R16418 */ + { 0x0000, 0x0000, 0x0000 }, /* R16419 */ + { 0x0000, 0x0000, 0x0000 }, /* R16420 */ + { 0x0000, 0x0000, 0x0000 }, /* R16421 */ + { 0x0000, 0x0000, 0x0000 }, /* R16422 */ + { 0x0000, 0x0000, 0x0000 }, /* R16423 */ + { 0x0000, 0x0000, 0x0000 }, /* R16424 */ + { 0x0000, 0x0000, 0x0000 }, /* R16425 */ + { 0x0000, 0x0000, 0x0000 }, /* R16426 */ + { 0x0000, 0x0000, 0x0000 }, /* R16427 */ + { 0x0000, 0x0000, 0x0000 }, /* R16428 */ + { 0x0000, 0x0000, 0x0000 }, /* R16429 */ + { 0x0000, 0x0000, 0x0000 }, /* R16430 */ + { 0x0000, 0x0000, 0x0000 }, /* R16431 */ + { 0x0000, 0x0000, 0x0000 }, /* R16432 */ + { 0x0000, 0x0000, 0x0000 }, /* R16433 */ + { 0x0000, 0x0000, 0x0000 }, /* R16434 */ + { 0x0000, 0x0000, 0x0000 }, /* R16435 */ + { 0x0000, 0x0000, 0x0000 }, /* R16436 */ + { 0x0000, 0x0000, 0x0000 }, /* R16437 */ + { 0x0000, 0x0000, 0x0000 }, /* R16438 */ + { 0x0000, 0x0000, 0x0000 }, /* R16439 */ + { 0x0000, 0x0000, 0x0000 }, /* R16440 */ + { 0x0000, 0x0000, 0x0000 }, /* R16441 */ + { 0x0000, 0x0000, 0x0000 }, /* R16442 */ + { 0x0000, 0x0000, 0x0000 }, /* R16443 */ + { 0x0000, 0x0000, 0x0000 }, /* R16444 */ + { 0x0000, 0x0000, 0x0000 }, /* R16445 */ + { 0x0000, 0x0000, 0x0000 }, /* R16446 */ + { 0x0000, 0x0000, 0x0000 }, /* R16447 */ + { 0x0000, 0x0000, 0x0000 }, /* R16448 */ + { 0x0000, 0x0000, 0x0000 }, /* R16449 */ + { 0x0000, 0x0000, 0x0000 }, /* R16450 */ + { 0x0000, 0x0000, 0x0000 }, /* R16451 */ + { 0x0000, 0x0000, 0x0000 }, /* R16452 */ + { 0x0000, 0x0000, 0x0000 }, /* R16453 */ + { 0x0000, 0x0000, 0x0000 }, /* R16454 */ + { 0x0000, 0x0000, 0x0000 }, /* R16455 */ + { 0x0000, 0x0000, 0x0000 }, /* R16456 */ + { 0x0000, 0x0000, 0x0000 }, /* R16457 */ + { 0x0000, 0x0000, 0x0000 }, /* R16458 */ + { 0x0000, 0x0000, 0x0000 }, /* R16459 */ + { 0x0000, 0x0000, 0x0000 }, /* R16460 */ + { 0x0000, 0x0000, 0x0000 }, /* R16461 */ + { 0x0000, 0x0000, 0x0000 }, /* R16462 */ + { 0x0000, 0x0000, 0x0000 }, /* R16463 */ + { 0x0000, 0x0000, 0x0000 }, /* R16464 */ + { 0x0000, 0x0000, 0x0000 }, /* R16465 */ + { 0x0000, 0x0000, 0x0000 }, /* R16466 */ + { 0x0000, 0x0000, 0x0000 }, /* R16467 */ + { 0x0000, 0x0000, 0x0000 }, /* R16468 */ + { 0x0000, 0x0000, 0x0000 }, /* R16469 */ + { 0x0000, 0x0000, 0x0000 }, /* R16470 */ + { 0x0000, 0x0000, 0x0000 }, /* R16471 */ + { 0x0000, 0x0000, 0x0000 }, /* R16472 */ + { 0x0000, 0x0000, 0x0000 }, /* R16473 */ + { 0x0000, 0x0000, 0x0000 }, /* R16474 */ + { 0x0000, 0x0000, 0x0000 }, /* R16475 */ + { 0x0000, 0x0000, 0x0000 }, /* R16476 */ + { 0x0000, 0x0000, 0x0000 }, /* R16477 */ + { 0x0000, 0x0000, 0x0000 }, /* R16478 */ + { 0x0000, 0x0000, 0x0000 }, /* R16479 */ + { 0x0000, 0x0000, 0x0000 }, /* R16480 */ + { 0x0000, 0x0000, 0x0000 }, /* R16481 */ + { 0x0000, 0x0000, 0x0000 }, /* R16482 */ + { 0x0000, 0x0000, 0x0000 }, /* R16483 */ + { 0x0000, 0x0000, 0x0000 }, /* R16484 */ + { 0x0000, 0x0000, 0x0000 }, /* R16485 */ + { 0x0000, 0x0000, 0x0000 }, /* R16486 */ + { 0x0000, 0x0000, 0x0000 }, /* R16487 */ + { 0x0000, 0x0000, 0x0000 }, /* R16488 */ + { 0x0000, 0x0000, 0x0000 }, /* R16489 */ + { 0x0000, 0x0000, 0x0000 }, /* R16490 */ + { 0x0000, 0x0000, 0x0000 }, /* R16491 */ + { 0x0000, 0x0000, 0x0000 }, /* R16492 */ + { 0x0000, 0x0000, 0x0000 }, /* R16493 */ + { 0x0000, 0x0000, 0x0000 }, /* R16494 */ + { 0x0000, 0x0000, 0x0000 }, /* R16495 */ + { 0x0000, 0x0000, 0x0000 }, /* R16496 */ + { 0x0000, 0x0000, 0x0000 }, /* R16497 */ + { 0x0000, 0x0000, 0x0000 }, /* R16498 */ + { 0x0000, 0x0000, 0x0000 }, /* R16499 */ + { 0x0000, 0x0000, 0x0000 }, /* R16500 */ + { 0x0000, 0x0000, 0x0000 }, /* R16501 */ + { 0x0000, 0x0000, 0x0000 }, /* R16502 */ + { 0x0000, 0x0000, 0x0000 }, /* R16503 */ + { 0x0000, 0x0000, 0x0000 }, /* R16504 */ + { 0x0000, 0x0000, 0x0000 }, /* R16505 */ + { 0x0000, 0x0000, 0x0000 }, /* R16506 */ + { 0x0000, 0x0000, 0x0000 }, /* R16507 */ + { 0x0000, 0x0000, 0x0000 }, /* R16508 */ + { 0x0000, 0x0000, 0x0000 }, /* R16509 */ + { 0x0000, 0x0000, 0x0000 }, /* R16510 */ + { 0x0000, 0x0000, 0x0000 }, /* R16511 */ + { 0x0000, 0x0000, 0x0000 }, /* R16512 */ + { 0x0000, 0x0000, 0x0000 }, /* R16513 */ + { 0x0000, 0x0000, 0x0000 }, /* R16514 */ + { 0x0000, 0x0000, 0x0000 }, /* R16515 */ + { 0x0000, 0x0000, 0x0000 }, /* R16516 */ + { 0x0000, 0x0000, 0x0000 }, /* R16517 */ + { 0x0000, 0x0000, 0x0000 }, /* R16518 */ + { 0x0000, 0x0000, 0x0000 }, /* R16519 */ + { 0x0000, 0x0000, 0x0000 }, /* R16520 */ + { 0x0000, 0x0000, 0x0000 }, /* R16521 */ + { 0x0000, 0x0000, 0x0000 }, /* R16522 */ + { 0x0000, 0x0000, 0x0000 }, /* R16523 */ + { 0x0000, 0x0000, 0x0000 }, /* R16524 */ + { 0x0000, 0x0000, 0x0000 }, /* R16525 */ + { 0x0000, 0x0000, 0x0000 }, /* R16526 */ + { 0x0000, 0x0000, 0x0000 }, /* R16527 */ + { 0x0000, 0x0000, 0x0000 }, /* R16528 */ + { 0x0000, 0x0000, 0x0000 }, /* R16529 */ + { 0x0000, 0x0000, 0x0000 }, /* R16530 */ + { 0x0000, 0x0000, 0x0000 }, /* R16531 */ + { 0x0000, 0x0000, 0x0000 }, /* R16532 */ + { 0x0000, 0x0000, 0x0000 }, /* R16533 */ + { 0x0000, 0x0000, 0x0000 }, /* R16534 */ + { 0x0000, 0x0000, 0x0000 }, /* R16535 */ + { 0x0000, 0x0000, 0x0000 }, /* R16536 */ + { 0x0000, 0x0000, 0x0000 }, /* R16537 */ + { 0x0000, 0x0000, 0x0000 }, /* R16538 */ + { 0x0000, 0x0000, 0x0000 }, /* R16539 */ + { 0x0000, 0x0000, 0x0000 }, /* R16540 */ + { 0x0000, 0x0000, 0x0000 }, /* R16541 */ + { 0x0000, 0x0000, 0x0000 }, /* R16542 */ + { 0x0000, 0x0000, 0x0000 }, /* R16543 */ + { 0x0000, 0x0000, 0x0000 }, /* R16544 */ + { 0x0000, 0x0000, 0x0000 }, /* R16545 */ + { 0x0000, 0x0000, 0x0000 }, /* R16546 */ + { 0x0000, 0x0000, 0x0000 }, /* R16547 */ + { 0x0000, 0x0000, 0x0000 }, /* R16548 */ + { 0x0000, 0x0000, 0x0000 }, /* R16549 */ + { 0x0000, 0x0000, 0x0000 }, /* R16550 */ + { 0x0000, 0x0000, 0x0000 }, /* R16551 */ + { 0x0000, 0x0000, 0x0000 }, /* R16552 */ + { 0x0000, 0x0000, 0x0000 }, /* R16553 */ + { 0x0000, 0x0000, 0x0000 }, /* R16554 */ + { 0x0000, 0x0000, 0x0000 }, /* R16555 */ + { 0x0000, 0x0000, 0x0000 }, /* R16556 */ + { 0x0000, 0x0000, 0x0000 }, /* R16557 */ + { 0x0000, 0x0000, 0x0000 }, /* R16558 */ + { 0x0000, 0x0000, 0x0000 }, /* R16559 */ + { 0x0000, 0x0000, 0x0000 }, /* R16560 */ + { 0x0000, 0x0000, 0x0000 }, /* R16561 */ + { 0x0000, 0x0000, 0x0000 }, /* R16562 */ + { 0x0000, 0x0000, 0x0000 }, /* R16563 */ + { 0x0000, 0x0000, 0x0000 }, /* R16564 */ + { 0x0000, 0x0000, 0x0000 }, /* R16565 */ + { 0x0000, 0x0000, 0x0000 }, /* R16566 */ + { 0x0000, 0x0000, 0x0000 }, /* R16567 */ + { 0x0000, 0x0000, 0x0000 }, /* R16568 */ + { 0x0000, 0x0000, 0x0000 }, /* R16569 */ + { 0x0000, 0x0000, 0x0000 }, /* R16570 */ + { 0x0000, 0x0000, 0x0000 }, /* R16571 */ + { 0x0000, 0x0000, 0x0000 }, /* R16572 */ + { 0x0000, 0x0000, 0x0000 }, /* R16573 */ + { 0x0000, 0x0000, 0x0000 }, /* R16574 */ + { 0x0000, 0x0000, 0x0000 }, /* R16575 */ + { 0x0000, 0x0000, 0x0000 }, /* R16576 */ + { 0x0000, 0x0000, 0x0000 }, /* R16577 */ + { 0x0000, 0x0000, 0x0000 }, /* R16578 */ + { 0x0000, 0x0000, 0x0000 }, /* R16579 */ + { 0x0000, 0x0000, 0x0000 }, /* R16580 */ + { 0x0000, 0x0000, 0x0000 }, /* R16581 */ + { 0x0000, 0x0000, 0x0000 }, /* R16582 */ + { 0x0000, 0x0000, 0x0000 }, /* R16583 */ + { 0x0000, 0x0000, 0x0000 }, /* R16584 */ + { 0x0000, 0x0000, 0x0000 }, /* R16585 */ + { 0x0000, 0x0000, 0x0000 }, /* R16586 */ + { 0x0000, 0x0000, 0x0000 }, /* R16587 */ + { 0x0000, 0x0000, 0x0000 }, /* R16588 */ + { 0x0000, 0x0000, 0x0000 }, /* R16589 */ + { 0x0000, 0x0000, 0x0000 }, /* R16590 */ + { 0x0000, 0x0000, 0x0000 }, /* R16591 */ + { 0x0000, 0x0000, 0x0000 }, /* R16592 */ + { 0x0000, 0x0000, 0x0000 }, /* R16593 */ + { 0x0000, 0x0000, 0x0000 }, /* R16594 */ + { 0x0000, 0x0000, 0x0000 }, /* R16595 */ + { 0x0000, 0x0000, 0x0000 }, /* R16596 */ + { 0x0000, 0x0000, 0x0000 }, /* R16597 */ + { 0x0000, 0x0000, 0x0000 }, /* R16598 */ + { 0x0000, 0x0000, 0x0000 }, /* R16599 */ + { 0x0000, 0x0000, 0x0000 }, /* R16600 */ + { 0x0000, 0x0000, 0x0000 }, /* R16601 */ + { 0x0000, 0x0000, 0x0000 }, /* R16602 */ + { 0x0000, 0x0000, 0x0000 }, /* R16603 */ + { 0x0000, 0x0000, 0x0000 }, /* R16604 */ + { 0x0000, 0x0000, 0x0000 }, /* R16605 */ + { 0x0000, 0x0000, 0x0000 }, /* R16606 */ + { 0x0000, 0x0000, 0x0000 }, /* R16607 */ + { 0x0000, 0x0000, 0x0000 }, /* R16608 */ + { 0x0000, 0x0000, 0x0000 }, /* R16609 */ + { 0x0000, 0x0000, 0x0000 }, /* R16610 */ + { 0x0000, 0x0000, 0x0000 }, /* R16611 */ + { 0x0000, 0x0000, 0x0000 }, /* R16612 */ + { 0x0000, 0x0000, 0x0000 }, /* R16613 */ + { 0x0000, 0x0000, 0x0000 }, /* R16614 */ + { 0x0000, 0x0000, 0x0000 }, /* R16615 */ + { 0x0000, 0x0000, 0x0000 }, /* R16616 */ + { 0x0000, 0x0000, 0x0000 }, /* R16617 */ + { 0x0000, 0x0000, 0x0000 }, /* R16618 */ + { 0x0000, 0x0000, 0x0000 }, /* R16619 */ + { 0x0000, 0x0000, 0x0000 }, /* R16620 */ + { 0x0000, 0x0000, 0x0000 }, /* R16621 */ + { 0x0000, 0x0000, 0x0000 }, /* R16622 */ + { 0x0000, 0x0000, 0x0000 }, /* R16623 */ + { 0x0000, 0x0000, 0x0000 }, /* R16624 */ + { 0x0000, 0x0000, 0x0000 }, /* R16625 */ + { 0x0000, 0x0000, 0x0000 }, /* R16626 */ + { 0x0000, 0x0000, 0x0000 }, /* R16627 */ + { 0x0000, 0x0000, 0x0000 }, /* R16628 */ + { 0x0000, 0x0000, 0x0000 }, /* R16629 */ + { 0x0000, 0x0000, 0x0000 }, /* R16630 */ + { 0x0000, 0x0000, 0x0000 }, /* R16631 */ + { 0x0000, 0x0000, 0x0000 }, /* R16632 */ + { 0x0000, 0x0000, 0x0000 }, /* R16633 */ + { 0x0000, 0x0000, 0x0000 }, /* R16634 */ + { 0x0000, 0x0000, 0x0000 }, /* R16635 */ + { 0x0000, 0x0000, 0x0000 }, /* R16636 */ + { 0x0000, 0x0000, 0x0000 }, /* R16637 */ + { 0x0000, 0x0000, 0x0000 }, /* R16638 */ + { 0x0000, 0x0000, 0x0000 }, /* R16639 */ + { 0x0000, 0x0000, 0x0000 }, /* R16640 */ + { 0x0000, 0x0000, 0x0000 }, /* R16641 */ + { 0x0000, 0x0000, 0x0000 }, /* R16642 */ + { 0x0000, 0x0000, 0x0000 }, /* R16643 */ + { 0x0000, 0x0000, 0x0000 }, /* R16644 */ + { 0x0000, 0x0000, 0x0000 }, /* R16645 */ + { 0x0000, 0x0000, 0x0000 }, /* R16646 */ + { 0x0000, 0x0000, 0x0000 }, /* R16647 */ + { 0x0000, 0x0000, 0x0000 }, /* R16648 */ + { 0x0000, 0x0000, 0x0000 }, /* R16649 */ + { 0x0000, 0x0000, 0x0000 }, /* R16650 */ + { 0x0000, 0x0000, 0x0000 }, /* R16651 */ + { 0x0000, 0x0000, 0x0000 }, /* R16652 */ + { 0x0000, 0x0000, 0x0000 }, /* R16653 */ + { 0x0000, 0x0000, 0x0000 }, /* R16654 */ + { 0x0000, 0x0000, 0x0000 }, /* R16655 */ + { 0x0000, 0x0000, 0x0000 }, /* R16656 */ + { 0x0000, 0x0000, 0x0000 }, /* R16657 */ + { 0x0000, 0x0000, 0x0000 }, /* R16658 */ + { 0x0000, 0x0000, 0x0000 }, /* R16659 */ + { 0x0000, 0x0000, 0x0000 }, /* R16660 */ + { 0x0000, 0x0000, 0x0000 }, /* R16661 */ + { 0x0000, 0x0000, 0x0000 }, /* R16662 */ + { 0x0000, 0x0000, 0x0000 }, /* R16663 */ + { 0x0000, 0x0000, 0x0000 }, /* R16664 */ + { 0x0000, 0x0000, 0x0000 }, /* R16665 */ + { 0x0000, 0x0000, 0x0000 }, /* R16666 */ + { 0x0000, 0x0000, 0x0000 }, /* R16667 */ + { 0x0000, 0x0000, 0x0000 }, /* R16668 */ + { 0x0000, 0x0000, 0x0000 }, /* R16669 */ + { 0x0000, 0x0000, 0x0000 }, /* R16670 */ + { 0x0000, 0x0000, 0x0000 }, /* R16671 */ + { 0x0000, 0x0000, 0x0000 }, /* R16672 */ + { 0x0000, 0x0000, 0x0000 }, /* R16673 */ + { 0x0000, 0x0000, 0x0000 }, /* R16674 */ + { 0x0000, 0x0000, 0x0000 }, /* R16675 */ + { 0x0000, 0x0000, 0x0000 }, /* R16676 */ + { 0x0000, 0x0000, 0x0000 }, /* R16677 */ + { 0x0000, 0x0000, 0x0000 }, /* R16678 */ + { 0x0000, 0x0000, 0x0000 }, /* R16679 */ + { 0x0000, 0x0000, 0x0000 }, /* R16680 */ + { 0x0000, 0x0000, 0x0000 }, /* R16681 */ + { 0x0000, 0x0000, 0x0000 }, /* R16682 */ + { 0x0000, 0x0000, 0x0000 }, /* R16683 */ + { 0x0000, 0x0000, 0x0000 }, /* R16684 */ + { 0x0000, 0x0000, 0x0000 }, /* R16685 */ + { 0x0000, 0x0000, 0x0000 }, /* R16686 */ + { 0x0000, 0x0000, 0x0000 }, /* R16687 */ + { 0x0000, 0x0000, 0x0000 }, /* R16688 */ + { 0x0000, 0x0000, 0x0000 }, /* R16689 */ + { 0x0000, 0x0000, 0x0000 }, /* R16690 */ + { 0x0000, 0x0000, 0x0000 }, /* R16691 */ + { 0x0000, 0x0000, 0x0000 }, /* R16692 */ + { 0x0000, 0x0000, 0x0000 }, /* R16693 */ + { 0x0000, 0x0000, 0x0000 }, /* R16694 */ + { 0x0000, 0x0000, 0x0000 }, /* R16695 */ + { 0x0000, 0x0000, 0x0000 }, /* R16696 */ + { 0x0000, 0x0000, 0x0000 }, /* R16697 */ + { 0x0000, 0x0000, 0x0000 }, /* R16698 */ + { 0x0000, 0x0000, 0x0000 }, /* R16699 */ + { 0x0000, 0x0000, 0x0000 }, /* R16700 */ + { 0x0000, 0x0000, 0x0000 }, /* R16701 */ + { 0x0000, 0x0000, 0x0000 }, /* R16702 */ + { 0x0000, 0x0000, 0x0000 }, /* R16703 */ + { 0x0000, 0x0000, 0x0000 }, /* R16704 */ + { 0x0000, 0x0000, 0x0000 }, /* R16705 */ + { 0x0000, 0x0000, 0x0000 }, /* R16706 */ + { 0x0000, 0x0000, 0x0000 }, /* R16707 */ + { 0x0000, 0x0000, 0x0000 }, /* R16708 */ + { 0x0000, 0x0000, 0x0000 }, /* R16709 */ + { 0x0000, 0x0000, 0x0000 }, /* R16710 */ + { 0x0000, 0x0000, 0x0000 }, /* R16711 */ + { 0x0000, 0x0000, 0x0000 }, /* R16712 */ + { 0x0000, 0x0000, 0x0000 }, /* R16713 */ + { 0x0000, 0x0000, 0x0000 }, /* R16714 */ + { 0x0000, 0x0000, 0x0000 }, /* R16715 */ + { 0x0000, 0x0000, 0x0000 }, /* R16716 */ + { 0x0000, 0x0000, 0x0000 }, /* R16717 */ + { 0x0000, 0x0000, 0x0000 }, /* R16718 */ + { 0x0000, 0x0000, 0x0000 }, /* R16719 */ + { 0x0000, 0x0000, 0x0000 }, /* R16720 */ + { 0x0000, 0x0000, 0x0000 }, /* R16721 */ + { 0x0000, 0x0000, 0x0000 }, /* R16722 */ + { 0x0000, 0x0000, 0x0000 }, /* R16723 */ + { 0x0000, 0x0000, 0x0000 }, /* R16724 */ + { 0x0000, 0x0000, 0x0000 }, /* R16725 */ + { 0x0000, 0x0000, 0x0000 }, /* R16726 */ + { 0x0000, 0x0000, 0x0000 }, /* R16727 */ + { 0x0000, 0x0000, 0x0000 }, /* R16728 */ + { 0x0000, 0x0000, 0x0000 }, /* R16729 */ + { 0x0000, 0x0000, 0x0000 }, /* R16730 */ + { 0x0000, 0x0000, 0x0000 }, /* R16731 */ + { 0x0000, 0x0000, 0x0000 }, /* R16732 */ + { 0x0000, 0x0000, 0x0000 }, /* R16733 */ + { 0x0000, 0x0000, 0x0000 }, /* R16734 */ + { 0x0000, 0x0000, 0x0000 }, /* R16735 */ + { 0x0000, 0x0000, 0x0000 }, /* R16736 */ + { 0x0000, 0x0000, 0x0000 }, /* R16737 */ + { 0x0000, 0x0000, 0x0000 }, /* R16738 */ + { 0x0000, 0x0000, 0x0000 }, /* R16739 */ + { 0x0000, 0x0000, 0x0000 }, /* R16740 */ + { 0x0000, 0x0000, 0x0000 }, /* R16741 */ + { 0x0000, 0x0000, 0x0000 }, /* R16742 */ + { 0x0000, 0x0000, 0x0000 }, /* R16743 */ + { 0x0000, 0x0000, 0x0000 }, /* R16744 */ + { 0x0000, 0x0000, 0x0000 }, /* R16745 */ + { 0x0000, 0x0000, 0x0000 }, /* R16746 */ + { 0x0000, 0x0000, 0x0000 }, /* R16747 */ + { 0x0000, 0x0000, 0x0000 }, /* R16748 */ + { 0x0000, 0x0000, 0x0000 }, /* R16749 */ + { 0x0000, 0x0000, 0x0000 }, /* R16750 */ + { 0x0000, 0x0000, 0x0000 }, /* R16751 */ + { 0x0000, 0x0000, 0x0000 }, /* R16752 */ + { 0x0000, 0x0000, 0x0000 }, /* R16753 */ + { 0x0000, 0x0000, 0x0000 }, /* R16754 */ + { 0x0000, 0x0000, 0x0000 }, /* R16755 */ + { 0x0000, 0x0000, 0x0000 }, /* R16756 */ + { 0x0000, 0x0000, 0x0000 }, /* R16757 */ + { 0x0000, 0x0000, 0x0000 }, /* R16758 */ + { 0x0000, 0x0000, 0x0000 }, /* R16759 */ + { 0x0000, 0x0000, 0x0000 }, /* R16760 */ + { 0x0000, 0x0000, 0x0000 }, /* R16761 */ + { 0x0000, 0x0000, 0x0000 }, /* R16762 */ + { 0x0000, 0x0000, 0x0000 }, /* R16763 */ + { 0x0000, 0x0000, 0x0000 }, /* R16764 */ + { 0x0000, 0x0000, 0x0000 }, /* R16765 */ + { 0x0000, 0x0000, 0x0000 }, /* R16766 */ + { 0x0000, 0x0000, 0x0000 }, /* R16767 */ + { 0x0000, 0x0000, 0x0000 }, /* R16768 */ + { 0x0000, 0x0000, 0x0000 }, /* R16769 */ + { 0x0000, 0x0000, 0x0000 }, /* R16770 */ + { 0x0000, 0x0000, 0x0000 }, /* R16771 */ + { 0x0000, 0x0000, 0x0000 }, /* R16772 */ + { 0x0000, 0x0000, 0x0000 }, /* R16773 */ + { 0x0000, 0x0000, 0x0000 }, /* R16774 */ + { 0x0000, 0x0000, 0x0000 }, /* R16775 */ + { 0x0000, 0x0000, 0x0000 }, /* R16776 */ + { 0x0000, 0x0000, 0x0000 }, /* R16777 */ + { 0x0000, 0x0000, 0x0000 }, /* R16778 */ + { 0x0000, 0x0000, 0x0000 }, /* R16779 */ + { 0x0000, 0x0000, 0x0000 }, /* R16780 */ + { 0x0000, 0x0000, 0x0000 }, /* R16781 */ + { 0x0000, 0x0000, 0x0000 }, /* R16782 */ + { 0x0000, 0x0000, 0x0000 }, /* R16783 */ + { 0x0000, 0x0000, 0x0000 }, /* R16784 */ + { 0x0000, 0x0000, 0x0000 }, /* R16785 */ + { 0x0000, 0x0000, 0x0000 }, /* R16786 */ + { 0x0000, 0x0000, 0x0000 }, /* R16787 */ + { 0x0000, 0x0000, 0x0000 }, /* R16788 */ + { 0x0000, 0x0000, 0x0000 }, /* R16789 */ + { 0x0000, 0x0000, 0x0000 }, /* R16790 */ + { 0x0000, 0x0000, 0x0000 }, /* R16791 */ + { 0x0000, 0x0000, 0x0000 }, /* R16792 */ + { 0x0000, 0x0000, 0x0000 }, /* R16793 */ + { 0x0000, 0x0000, 0x0000 }, /* R16794 */ + { 0x0000, 0x0000, 0x0000 }, /* R16795 */ + { 0x0000, 0x0000, 0x0000 }, /* R16796 */ + { 0x0000, 0x0000, 0x0000 }, /* R16797 */ + { 0x0000, 0x0000, 0x0000 }, /* R16798 */ + { 0x0000, 0x0000, 0x0000 }, /* R16799 */ + { 0x0000, 0x0000, 0x0000 }, /* R16800 */ + { 0x0000, 0x0000, 0x0000 }, /* R16801 */ + { 0x0000, 0x0000, 0x0000 }, /* R16802 */ + { 0x0000, 0x0000, 0x0000 }, /* R16803 */ + { 0x0000, 0x0000, 0x0000 }, /* R16804 */ + { 0x0000, 0x0000, 0x0000 }, /* R16805 */ + { 0x0000, 0x0000, 0x0000 }, /* R16806 */ + { 0x0000, 0x0000, 0x0000 }, /* R16807 */ + { 0x0000, 0x0000, 0x0000 }, /* R16808 */ + { 0x0000, 0x0000, 0x0000 }, /* R16809 */ + { 0x0000, 0x0000, 0x0000 }, /* R16810 */ + { 0x0000, 0x0000, 0x0000 }, /* R16811 */ + { 0x0000, 0x0000, 0x0000 }, /* R16812 */ + { 0x0000, 0x0000, 0x0000 }, /* R16813 */ + { 0x0000, 0x0000, 0x0000 }, /* R16814 */ + { 0x0000, 0x0000, 0x0000 }, /* R16815 */ + { 0x0000, 0x0000, 0x0000 }, /* R16816 */ + { 0x0000, 0x0000, 0x0000 }, /* R16817 */ + { 0x0000, 0x0000, 0x0000 }, /* R16818 */ + { 0x0000, 0x0000, 0x0000 }, /* R16819 */ + { 0x0000, 0x0000, 0x0000 }, /* R16820 */ + { 0x0000, 0x0000, 0x0000 }, /* R16821 */ + { 0x0000, 0x0000, 0x0000 }, /* R16822 */ + { 0x0000, 0x0000, 0x0000 }, /* R16823 */ + { 0x0000, 0x0000, 0x0000 }, /* R16824 */ + { 0x0000, 0x0000, 0x0000 }, /* R16825 */ + { 0x0000, 0x0000, 0x0000 }, /* R16826 */ + { 0x0000, 0x0000, 0x0000 }, /* R16827 */ + { 0x0000, 0x0000, 0x0000 }, /* R16828 */ + { 0x0000, 0x0000, 0x0000 }, /* R16829 */ + { 0x0000, 0x0000, 0x0000 }, /* R16830 */ + { 0x0000, 0x0000, 0x0000 }, /* R16831 */ + { 0x0000, 0x0000, 0x0000 }, /* R16832 */ + { 0x0000, 0x0000, 0x0000 }, /* R16833 */ + { 0x0000, 0x0000, 0x0000 }, /* R16834 */ + { 0x0000, 0x0000, 0x0000 }, /* R16835 */ + { 0x0000, 0x0000, 0x0000 }, /* R16836 */ + { 0x0000, 0x0000, 0x0000 }, /* R16837 */ + { 0x0000, 0x0000, 0x0000 }, /* R16838 */ + { 0x0000, 0x0000, 0x0000 }, /* R16839 */ + { 0x0000, 0x0000, 0x0000 }, /* R16840 */ + { 0x0000, 0x0000, 0x0000 }, /* R16841 */ + { 0x0000, 0x0000, 0x0000 }, /* R16842 */ + { 0x0000, 0x0000, 0x0000 }, /* R16843 */ + { 0x0000, 0x0000, 0x0000 }, /* R16844 */ + { 0x0000, 0x0000, 0x0000 }, /* R16845 */ + { 0x0000, 0x0000, 0x0000 }, /* R16846 */ + { 0x0000, 0x0000, 0x0000 }, /* R16847 */ + { 0x0000, 0x0000, 0x0000 }, /* R16848 */ + { 0x0000, 0x0000, 0x0000 }, /* R16849 */ + { 0x0000, 0x0000, 0x0000 }, /* R16850 */ + { 0x0000, 0x0000, 0x0000 }, /* R16851 */ + { 0x0000, 0x0000, 0x0000 }, /* R16852 */ + { 0x0000, 0x0000, 0x0000 }, /* R16853 */ + { 0x0000, 0x0000, 0x0000 }, /* R16854 */ + { 0x0000, 0x0000, 0x0000 }, /* R16855 */ + { 0x0000, 0x0000, 0x0000 }, /* R16856 */ + { 0x0000, 0x0000, 0x0000 }, /* R16857 */ + { 0x0000, 0x0000, 0x0000 }, /* R16858 */ + { 0x0000, 0x0000, 0x0000 }, /* R16859 */ + { 0x0000, 0x0000, 0x0000 }, /* R16860 */ + { 0x0000, 0x0000, 0x0000 }, /* R16861 */ + { 0x0000, 0x0000, 0x0000 }, /* R16862 */ + { 0x0000, 0x0000, 0x0000 }, /* R16863 */ + { 0x0000, 0x0000, 0x0000 }, /* R16864 */ + { 0x0000, 0x0000, 0x0000 }, /* R16865 */ + { 0x0000, 0x0000, 0x0000 }, /* R16866 */ + { 0x0000, 0x0000, 0x0000 }, /* R16867 */ + { 0x0000, 0x0000, 0x0000 }, /* R16868 */ + { 0x0000, 0x0000, 0x0000 }, /* R16869 */ + { 0x0000, 0x0000, 0x0000 }, /* R16870 */ + { 0x0000, 0x0000, 0x0000 }, /* R16871 */ + { 0x0000, 0x0000, 0x0000 }, /* R16872 */ + { 0x0000, 0x0000, 0x0000 }, /* R16873 */ + { 0x0000, 0x0000, 0x0000 }, /* R16874 */ + { 0x0000, 0x0000, 0x0000 }, /* R16875 */ + { 0x0000, 0x0000, 0x0000 }, /* R16876 */ + { 0x0000, 0x0000, 0x0000 }, /* R16877 */ + { 0x0000, 0x0000, 0x0000 }, /* R16878 */ + { 0x0000, 0x0000, 0x0000 }, /* R16879 */ + { 0x0000, 0x0000, 0x0000 }, /* R16880 */ + { 0x0000, 0x0000, 0x0000 }, /* R16881 */ + { 0x0000, 0x0000, 0x0000 }, /* R16882 */ + { 0x0000, 0x0000, 0x0000 }, /* R16883 */ + { 0x0000, 0x0000, 0x0000 }, /* R16884 */ + { 0x0000, 0x0000, 0x0000 }, /* R16885 */ + { 0x0000, 0x0000, 0x0000 }, /* R16886 */ + { 0x0000, 0x0000, 0x0000 }, /* R16887 */ + { 0x0000, 0x0000, 0x0000 }, /* R16888 */ + { 0x0000, 0x0000, 0x0000 }, /* R16889 */ + { 0x0000, 0x0000, 0x0000 }, /* R16890 */ + { 0x0000, 0x0000, 0x0000 }, /* R16891 */ + { 0x0000, 0x0000, 0x0000 }, /* R16892 */ + { 0x0000, 0x0000, 0x0000 }, /* R16893 */ + { 0x0000, 0x0000, 0x0000 }, /* R16894 */ + { 0x0000, 0x0000, 0x0000 }, /* R16895 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16896 - HDBASS_AI_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16897 - HDBASS_AI_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16898 - HDBASS_AR_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16899 - HDBASS_AR_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16900 - HDBASS_B_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16901 - HDBASS_B_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16902 - HDBASS_K_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16903 - HDBASS_K_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16904 - HDBASS_N1_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16905 - HDBASS_N1_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16906 - HDBASS_N2_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16907 - HDBASS_N2_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16908 - HDBASS_N3_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16909 - HDBASS_N3_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16910 - HDBASS_N4_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16911 - HDBASS_N4_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16912 - HDBASS_N5_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16913 - HDBASS_N5_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16914 - HDBASS_X1_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16915 - HDBASS_X1_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16916 - HDBASS_X2_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16917 - HDBASS_X2_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16918 - HDBASS_X3_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16919 - HDBASS_X3_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16920 - HDBASS_ATK_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16921 - HDBASS_ATK_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16922 - HDBASS_DCY_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16923 - HDBASS_DCY_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R16924 - HDBASS_PG_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R16925 - HDBASS_PG_0 */ + { 0x0000, 0x0000, 0x0000 }, /* R16926 */ + { 0x0000, 0x0000, 0x0000 }, /* R16927 */ + { 0x0000, 0x0000, 0x0000 }, /* R16928 */ + { 0x0000, 0x0000, 0x0000 }, /* R16929 */ + { 0x0000, 0x0000, 0x0000 }, /* R16930 */ + { 0x0000, 0x0000, 0x0000 }, /* R16931 */ + { 0x0000, 0x0000, 0x0000 }, /* R16932 */ + { 0x0000, 0x0000, 0x0000 }, /* R16933 */ + { 0x0000, 0x0000, 0x0000 }, /* R16934 */ + { 0x0000, 0x0000, 0x0000 }, /* R16935 */ + { 0x0000, 0x0000, 0x0000 }, /* R16936 */ + { 0x0000, 0x0000, 0x0000 }, /* R16937 */ + { 0x0000, 0x0000, 0x0000 }, /* R16938 */ + { 0x0000, 0x0000, 0x0000 }, /* R16939 */ + { 0x0000, 0x0000, 0x0000 }, /* R16940 */ + { 0x0000, 0x0000, 0x0000 }, /* R16941 */ + { 0x0000, 0x0000, 0x0000 }, /* R16942 */ + { 0x0000, 0x0000, 0x0000 }, /* R16943 */ + { 0x0000, 0x0000, 0x0000 }, /* R16944 */ + { 0x0000, 0x0000, 0x0000 }, /* R16945 */ + { 0x0000, 0x0000, 0x0000 }, /* R16946 */ + { 0x0000, 0x0000, 0x0000 }, /* R16947 */ + { 0x0000, 0x0000, 0x0000 }, /* R16948 */ + { 0x0000, 0x0000, 0x0000 }, /* R16949 */ + { 0x0000, 0x0000, 0x0000 }, /* R16950 */ + { 0x0000, 0x0000, 0x0000 }, /* R16951 */ + { 0x0000, 0x0000, 0x0000 }, /* R16952 */ + { 0x0000, 0x0000, 0x0000 }, /* R16953 */ + { 0x0000, 0x0000, 0x0000 }, /* R16954 */ + { 0x0000, 0x0000, 0x0000 }, /* R16955 */ + { 0x0000, 0x0000, 0x0000 }, /* R16956 */ + { 0x0000, 0x0000, 0x0000 }, /* R16957 */ + { 0x0000, 0x0000, 0x0000 }, /* R16958 */ + { 0x0000, 0x0000, 0x0000 }, /* R16959 */ + { 0x0000, 0x0000, 0x0000 }, /* R16960 */ + { 0x0000, 0x0000, 0x0000 }, /* R16961 */ + { 0x0000, 0x0000, 0x0000 }, /* R16962 */ + { 0x0000, 0x0000, 0x0000 }, /* R16963 */ + { 0x0000, 0x0000, 0x0000 }, /* R16964 */ + { 0x0000, 0x0000, 0x0000 }, /* R16965 */ + { 0x0000, 0x0000, 0x0000 }, /* R16966 */ + { 0x0000, 0x0000, 0x0000 }, /* R16967 */ + { 0x0000, 0x0000, 0x0000 }, /* R16968 */ + { 0x0000, 0x0000, 0x0000 }, /* R16969 */ + { 0x0000, 0x0000, 0x0000 }, /* R16970 */ + { 0x0000, 0x0000, 0x0000 }, /* R16971 */ + { 0x0000, 0x0000, 0x0000 }, /* R16972 */ + { 0x0000, 0x0000, 0x0000 }, /* R16973 */ + { 0x0000, 0x0000, 0x0000 }, /* R16974 */ + { 0x0000, 0x0000, 0x0000 }, /* R16975 */ + { 0x0000, 0x0000, 0x0000 }, /* R16976 */ + { 0x0000, 0x0000, 0x0000 }, /* R16977 */ + { 0x0000, 0x0000, 0x0000 }, /* R16978 */ + { 0x0000, 0x0000, 0x0000 }, /* R16979 */ + { 0x0000, 0x0000, 0x0000 }, /* R16980 */ + { 0x0000, 0x0000, 0x0000 }, /* R16981 */ + { 0x0000, 0x0000, 0x0000 }, /* R16982 */ + { 0x0000, 0x0000, 0x0000 }, /* R16983 */ + { 0x0000, 0x0000, 0x0000 }, /* R16984 */ + { 0x0000, 0x0000, 0x0000 }, /* R16985 */ + { 0x0000, 0x0000, 0x0000 }, /* R16986 */ + { 0x0000, 0x0000, 0x0000 }, /* R16987 */ + { 0x0000, 0x0000, 0x0000 }, /* R16988 */ + { 0x0000, 0x0000, 0x0000 }, /* R16989 */ + { 0x0000, 0x0000, 0x0000 }, /* R16990 */ + { 0x0000, 0x0000, 0x0000 }, /* R16991 */ + { 0x0000, 0x0000, 0x0000 }, /* R16992 */ + { 0x0000, 0x0000, 0x0000 }, /* R16993 */ + { 0x0000, 0x0000, 0x0000 }, /* R16994 */ + { 0x0000, 0x0000, 0x0000 }, /* R16995 */ + { 0x0000, 0x0000, 0x0000 }, /* R16996 */ + { 0x0000, 0x0000, 0x0000 }, /* R16997 */ + { 0x0000, 0x0000, 0x0000 }, /* R16998 */ + { 0x0000, 0x0000, 0x0000 }, /* R16999 */ + { 0x0000, 0x0000, 0x0000 }, /* R17000 */ + { 0x0000, 0x0000, 0x0000 }, /* R17001 */ + { 0x0000, 0x0000, 0x0000 }, /* R17002 */ + { 0x0000, 0x0000, 0x0000 }, /* R17003 */ + { 0x0000, 0x0000, 0x0000 }, /* R17004 */ + { 0x0000, 0x0000, 0x0000 }, /* R17005 */ + { 0x0000, 0x0000, 0x0000 }, /* R17006 */ + { 0x0000, 0x0000, 0x0000 }, /* R17007 */ + { 0x0000, 0x0000, 0x0000 }, /* R17008 */ + { 0x0000, 0x0000, 0x0000 }, /* R17009 */ + { 0x0000, 0x0000, 0x0000 }, /* R17010 */ + { 0x0000, 0x0000, 0x0000 }, /* R17011 */ + { 0x0000, 0x0000, 0x0000 }, /* R17012 */ + { 0x0000, 0x0000, 0x0000 }, /* R17013 */ + { 0x0000, 0x0000, 0x0000 }, /* R17014 */ + { 0x0000, 0x0000, 0x0000 }, /* R17015 */ + { 0x0000, 0x0000, 0x0000 }, /* R17016 */ + { 0x0000, 0x0000, 0x0000 }, /* R17017 */ + { 0x0000, 0x0000, 0x0000 }, /* R17018 */ + { 0x0000, 0x0000, 0x0000 }, /* R17019 */ + { 0x0000, 0x0000, 0x0000 }, /* R17020 */ + { 0x0000, 0x0000, 0x0000 }, /* R17021 */ + { 0x0000, 0x0000, 0x0000 }, /* R17022 */ + { 0x0000, 0x0000, 0x0000 }, /* R17023 */ + { 0x0000, 0x0000, 0x0000 }, /* R17024 */ + { 0x0000, 0x0000, 0x0000 }, /* R17025 */ + { 0x0000, 0x0000, 0x0000 }, /* R17026 */ + { 0x0000, 0x0000, 0x0000 }, /* R17027 */ + { 0x0000, 0x0000, 0x0000 }, /* R17028 */ + { 0x0000, 0x0000, 0x0000 }, /* R17029 */ + { 0x0000, 0x0000, 0x0000 }, /* R17030 */ + { 0x0000, 0x0000, 0x0000 }, /* R17031 */ + { 0x0000, 0x0000, 0x0000 }, /* R17032 */ + { 0x0000, 0x0000, 0x0000 }, /* R17033 */ + { 0x0000, 0x0000, 0x0000 }, /* R17034 */ + { 0x0000, 0x0000, 0x0000 }, /* R17035 */ + { 0x0000, 0x0000, 0x0000 }, /* R17036 */ + { 0x0000, 0x0000, 0x0000 }, /* R17037 */ + { 0x0000, 0x0000, 0x0000 }, /* R17038 */ + { 0x0000, 0x0000, 0x0000 }, /* R17039 */ + { 0x0000, 0x0000, 0x0000 }, /* R17040 */ + { 0x0000, 0x0000, 0x0000 }, /* R17041 */ + { 0x0000, 0x0000, 0x0000 }, /* R17042 */ + { 0x0000, 0x0000, 0x0000 }, /* R17043 */ + { 0x0000, 0x0000, 0x0000 }, /* R17044 */ + { 0x0000, 0x0000, 0x0000 }, /* R17045 */ + { 0x0000, 0x0000, 0x0000 }, /* R17046 */ + { 0x0000, 0x0000, 0x0000 }, /* R17047 */ + { 0x0000, 0x0000, 0x0000 }, /* R17048 */ + { 0x0000, 0x0000, 0x0000 }, /* R17049 */ + { 0x0000, 0x0000, 0x0000 }, /* R17050 */ + { 0x0000, 0x0000, 0x0000 }, /* R17051 */ + { 0x0000, 0x0000, 0x0000 }, /* R17052 */ + { 0x0000, 0x0000, 0x0000 }, /* R17053 */ + { 0x0000, 0x0000, 0x0000 }, /* R17054 */ + { 0x0000, 0x0000, 0x0000 }, /* R17055 */ + { 0x0000, 0x0000, 0x0000 }, /* R17056 */ + { 0x0000, 0x0000, 0x0000 }, /* R17057 */ + { 0x0000, 0x0000, 0x0000 }, /* R17058 */ + { 0x0000, 0x0000, 0x0000 }, /* R17059 */ + { 0x0000, 0x0000, 0x0000 }, /* R17060 */ + { 0x0000, 0x0000, 0x0000 }, /* R17061 */ + { 0x0000, 0x0000, 0x0000 }, /* R17062 */ + { 0x0000, 0x0000, 0x0000 }, /* R17063 */ + { 0x0000, 0x0000, 0x0000 }, /* R17064 */ + { 0x0000, 0x0000, 0x0000 }, /* R17065 */ + { 0x0000, 0x0000, 0x0000 }, /* R17066 */ + { 0x0000, 0x0000, 0x0000 }, /* R17067 */ + { 0x0000, 0x0000, 0x0000 }, /* R17068 */ + { 0x0000, 0x0000, 0x0000 }, /* R17069 */ + { 0x0000, 0x0000, 0x0000 }, /* R17070 */ + { 0x0000, 0x0000, 0x0000 }, /* R17071 */ + { 0x0000, 0x0000, 0x0000 }, /* R17072 */ + { 0x0000, 0x0000, 0x0000 }, /* R17073 */ + { 0x0000, 0x0000, 0x0000 }, /* R17074 */ + { 0x0000, 0x0000, 0x0000 }, /* R17075 */ + { 0x0000, 0x0000, 0x0000 }, /* R17076 */ + { 0x0000, 0x0000, 0x0000 }, /* R17077 */ + { 0x0000, 0x0000, 0x0000 }, /* R17078 */ + { 0x0000, 0x0000, 0x0000 }, /* R17079 */ + { 0x0000, 0x0000, 0x0000 }, /* R17080 */ + { 0x0000, 0x0000, 0x0000 }, /* R17081 */ + { 0x0000, 0x0000, 0x0000 }, /* R17082 */ + { 0x0000, 0x0000, 0x0000 }, /* R17083 */ + { 0x0000, 0x0000, 0x0000 }, /* R17084 */ + { 0x0000, 0x0000, 0x0000 }, /* R17085 */ + { 0x0000, 0x0000, 0x0000 }, /* R17086 */ + { 0x0000, 0x0000, 0x0000 }, /* R17087 */ + { 0x0000, 0x0000, 0x0000 }, /* R17088 */ + { 0x0000, 0x0000, 0x0000 }, /* R17089 */ + { 0x0000, 0x0000, 0x0000 }, /* R17090 */ + { 0x0000, 0x0000, 0x0000 }, /* R17091 */ + { 0x0000, 0x0000, 0x0000 }, /* R17092 */ + { 0x0000, 0x0000, 0x0000 }, /* R17093 */ + { 0x0000, 0x0000, 0x0000 }, /* R17094 */ + { 0x0000, 0x0000, 0x0000 }, /* R17095 */ + { 0x0000, 0x0000, 0x0000 }, /* R17096 */ + { 0x0000, 0x0000, 0x0000 }, /* R17097 */ + { 0x0000, 0x0000, 0x0000 }, /* R17098 */ + { 0x0000, 0x0000, 0x0000 }, /* R17099 */ + { 0x0000, 0x0000, 0x0000 }, /* R17100 */ + { 0x0000, 0x0000, 0x0000 }, /* R17101 */ + { 0x0000, 0x0000, 0x0000 }, /* R17102 */ + { 0x0000, 0x0000, 0x0000 }, /* R17103 */ + { 0x0000, 0x0000, 0x0000 }, /* R17104 */ + { 0x0000, 0x0000, 0x0000 }, /* R17105 */ + { 0x0000, 0x0000, 0x0000 }, /* R17106 */ + { 0x0000, 0x0000, 0x0000 }, /* R17107 */ + { 0x0000, 0x0000, 0x0000 }, /* R17108 */ + { 0x0000, 0x0000, 0x0000 }, /* R17109 */ + { 0x0000, 0x0000, 0x0000 }, /* R17110 */ + { 0x0000, 0x0000, 0x0000 }, /* R17111 */ + { 0x0000, 0x0000, 0x0000 }, /* R17112 */ + { 0x0000, 0x0000, 0x0000 }, /* R17113 */ + { 0x0000, 0x0000, 0x0000 }, /* R17114 */ + { 0x0000, 0x0000, 0x0000 }, /* R17115 */ + { 0x0000, 0x0000, 0x0000 }, /* R17116 */ + { 0x0000, 0x0000, 0x0000 }, /* R17117 */ + { 0x0000, 0x0000, 0x0000 }, /* R17118 */ + { 0x0000, 0x0000, 0x0000 }, /* R17119 */ + { 0x0000, 0x0000, 0x0000 }, /* R17120 */ + { 0x0000, 0x0000, 0x0000 }, /* R17121 */ + { 0x0000, 0x0000, 0x0000 }, /* R17122 */ + { 0x0000, 0x0000, 0x0000 }, /* R17123 */ + { 0x0000, 0x0000, 0x0000 }, /* R17124 */ + { 0x0000, 0x0000, 0x0000 }, /* R17125 */ + { 0x0000, 0x0000, 0x0000 }, /* R17126 */ + { 0x0000, 0x0000, 0x0000 }, /* R17127 */ + { 0x0000, 0x0000, 0x0000 }, /* R17128 */ + { 0x0000, 0x0000, 0x0000 }, /* R17129 */ + { 0x0000, 0x0000, 0x0000 }, /* R17130 */ + { 0x0000, 0x0000, 0x0000 }, /* R17131 */ + { 0x0000, 0x0000, 0x0000 }, /* R17132 */ + { 0x0000, 0x0000, 0x0000 }, /* R17133 */ + { 0x0000, 0x0000, 0x0000 }, /* R17134 */ + { 0x0000, 0x0000, 0x0000 }, /* R17135 */ + { 0x0000, 0x0000, 0x0000 }, /* R17136 */ + { 0x0000, 0x0000, 0x0000 }, /* R17137 */ + { 0x0000, 0x0000, 0x0000 }, /* R17138 */ + { 0x0000, 0x0000, 0x0000 }, /* R17139 */ + { 0x0000, 0x0000, 0x0000 }, /* R17140 */ + { 0x0000, 0x0000, 0x0000 }, /* R17141 */ + { 0x0000, 0x0000, 0x0000 }, /* R17142 */ + { 0x0000, 0x0000, 0x0000 }, /* R17143 */ + { 0x0000, 0x0000, 0x0000 }, /* R17144 */ + { 0x0000, 0x0000, 0x0000 }, /* R17145 */ + { 0x0000, 0x0000, 0x0000 }, /* R17146 */ + { 0x0000, 0x0000, 0x0000 }, /* R17147 */ + { 0x0000, 0x0000, 0x0000 }, /* R17148 */ + { 0x0000, 0x0000, 0x0000 }, /* R17149 */ + { 0x0000, 0x0000, 0x0000 }, /* R17150 */ + { 0x0000, 0x0000, 0x0000 }, /* R17151 */ + { 0x0000, 0x0000, 0x0000 }, /* R17152 */ + { 0x0000, 0x0000, 0x0000 }, /* R17153 */ + { 0x0000, 0x0000, 0x0000 }, /* R17154 */ + { 0x0000, 0x0000, 0x0000 }, /* R17155 */ + { 0x0000, 0x0000, 0x0000 }, /* R17156 */ + { 0x0000, 0x0000, 0x0000 }, /* R17157 */ + { 0x0000, 0x0000, 0x0000 }, /* R17158 */ + { 0x0000, 0x0000, 0x0000 }, /* R17159 */ + { 0x0000, 0x0000, 0x0000 }, /* R17160 */ + { 0x0000, 0x0000, 0x0000 }, /* R17161 */ + { 0x0000, 0x0000, 0x0000 }, /* R17162 */ + { 0x0000, 0x0000, 0x0000 }, /* R17163 */ + { 0x0000, 0x0000, 0x0000 }, /* R17164 */ + { 0x0000, 0x0000, 0x0000 }, /* R17165 */ + { 0x0000, 0x0000, 0x0000 }, /* R17166 */ + { 0x0000, 0x0000, 0x0000 }, /* R17167 */ + { 0x0000, 0x0000, 0x0000 }, /* R17168 */ + { 0x0000, 0x0000, 0x0000 }, /* R17169 */ + { 0x0000, 0x0000, 0x0000 }, /* R17170 */ + { 0x0000, 0x0000, 0x0000 }, /* R17171 */ + { 0x0000, 0x0000, 0x0000 }, /* R17172 */ + { 0x0000, 0x0000, 0x0000 }, /* R17173 */ + { 0x0000, 0x0000, 0x0000 }, /* R17174 */ + { 0x0000, 0x0000, 0x0000 }, /* R17175 */ + { 0x0000, 0x0000, 0x0000 }, /* R17176 */ + { 0x0000, 0x0000, 0x0000 }, /* R17177 */ + { 0x0000, 0x0000, 0x0000 }, /* R17178 */ + { 0x0000, 0x0000, 0x0000 }, /* R17179 */ + { 0x0000, 0x0000, 0x0000 }, /* R17180 */ + { 0x0000, 0x0000, 0x0000 }, /* R17181 */ + { 0x0000, 0x0000, 0x0000 }, /* R17182 */ + { 0x0000, 0x0000, 0x0000 }, /* R17183 */ + { 0x0000, 0x0000, 0x0000 }, /* R17184 */ + { 0x0000, 0x0000, 0x0000 }, /* R17185 */ + { 0x0000, 0x0000, 0x0000 }, /* R17186 */ + { 0x0000, 0x0000, 0x0000 }, /* R17187 */ + { 0x0000, 0x0000, 0x0000 }, /* R17188 */ + { 0x0000, 0x0000, 0x0000 }, /* R17189 */ + { 0x0000, 0x0000, 0x0000 }, /* R17190 */ + { 0x0000, 0x0000, 0x0000 }, /* R17191 */ + { 0x0000, 0x0000, 0x0000 }, /* R17192 */ + { 0x0000, 0x0000, 0x0000 }, /* R17193 */ + { 0x0000, 0x0000, 0x0000 }, /* R17194 */ + { 0x0000, 0x0000, 0x0000 }, /* R17195 */ + { 0x0000, 0x0000, 0x0000 }, /* R17196 */ + { 0x0000, 0x0000, 0x0000 }, /* R17197 */ + { 0x0000, 0x0000, 0x0000 }, /* R17198 */ + { 0x0000, 0x0000, 0x0000 }, /* R17199 */ + { 0x0000, 0x0000, 0x0000 }, /* R17200 */ + { 0x0000, 0x0000, 0x0000 }, /* R17201 */ + { 0x0000, 0x0000, 0x0000 }, /* R17202 */ + { 0x0000, 0x0000, 0x0000 }, /* R17203 */ + { 0x0000, 0x0000, 0x0000 }, /* R17204 */ + { 0x0000, 0x0000, 0x0000 }, /* R17205 */ + { 0x0000, 0x0000, 0x0000 }, /* R17206 */ + { 0x0000, 0x0000, 0x0000 }, /* R17207 */ + { 0x0000, 0x0000, 0x0000 }, /* R17208 */ + { 0x0000, 0x0000, 0x0000 }, /* R17209 */ + { 0x0000, 0x0000, 0x0000 }, /* R17210 */ + { 0x0000, 0x0000, 0x0000 }, /* R17211 */ + { 0x0000, 0x0000, 0x0000 }, /* R17212 */ + { 0x0000, 0x0000, 0x0000 }, /* R17213 */ + { 0x0000, 0x0000, 0x0000 }, /* R17214 */ + { 0x0000, 0x0000, 0x0000 }, /* R17215 */ + { 0x0000, 0x0000, 0x0000 }, /* R17216 */ + { 0x0000, 0x0000, 0x0000 }, /* R17217 */ + { 0x0000, 0x0000, 0x0000 }, /* R17218 */ + { 0x0000, 0x0000, 0x0000 }, /* R17219 */ + { 0x0000, 0x0000, 0x0000 }, /* R17220 */ + { 0x0000, 0x0000, 0x0000 }, /* R17221 */ + { 0x0000, 0x0000, 0x0000 }, /* R17222 */ + { 0x0000, 0x0000, 0x0000 }, /* R17223 */ + { 0x0000, 0x0000, 0x0000 }, /* R17224 */ + { 0x0000, 0x0000, 0x0000 }, /* R17225 */ + { 0x0000, 0x0000, 0x0000 }, /* R17226 */ + { 0x0000, 0x0000, 0x0000 }, /* R17227 */ + { 0x0000, 0x0000, 0x0000 }, /* R17228 */ + { 0x0000, 0x0000, 0x0000 }, /* R17229 */ + { 0x0000, 0x0000, 0x0000 }, /* R17230 */ + { 0x0000, 0x0000, 0x0000 }, /* R17231 */ + { 0x0000, 0x0000, 0x0000 }, /* R17232 */ + { 0x0000, 0x0000, 0x0000 }, /* R17233 */ + { 0x0000, 0x0000, 0x0000 }, /* R17234 */ + { 0x0000, 0x0000, 0x0000 }, /* R17235 */ + { 0x0000, 0x0000, 0x0000 }, /* R17236 */ + { 0x0000, 0x0000, 0x0000 }, /* R17237 */ + { 0x0000, 0x0000, 0x0000 }, /* R17238 */ + { 0x0000, 0x0000, 0x0000 }, /* R17239 */ + { 0x0000, 0x0000, 0x0000 }, /* R17240 */ + { 0x0000, 0x0000, 0x0000 }, /* R17241 */ + { 0x0000, 0x0000, 0x0000 }, /* R17242 */ + { 0x0000, 0x0000, 0x0000 }, /* R17243 */ + { 0x0000, 0x0000, 0x0000 }, /* R17244 */ + { 0x0000, 0x0000, 0x0000 }, /* R17245 */ + { 0x0000, 0x0000, 0x0000 }, /* R17246 */ + { 0x0000, 0x0000, 0x0000 }, /* R17247 */ + { 0x0000, 0x0000, 0x0000 }, /* R17248 */ + { 0x0000, 0x0000, 0x0000 }, /* R17249 */ + { 0x0000, 0x0000, 0x0000 }, /* R17250 */ + { 0x0000, 0x0000, 0x0000 }, /* R17251 */ + { 0x0000, 0x0000, 0x0000 }, /* R17252 */ + { 0x0000, 0x0000, 0x0000 }, /* R17253 */ + { 0x0000, 0x0000, 0x0000 }, /* R17254 */ + { 0x0000, 0x0000, 0x0000 }, /* R17255 */ + { 0x0000, 0x0000, 0x0000 }, /* R17256 */ + { 0x0000, 0x0000, 0x0000 }, /* R17257 */ + { 0x0000, 0x0000, 0x0000 }, /* R17258 */ + { 0x0000, 0x0000, 0x0000 }, /* R17259 */ + { 0x0000, 0x0000, 0x0000 }, /* R17260 */ + { 0x0000, 0x0000, 0x0000 }, /* R17261 */ + { 0x0000, 0x0000, 0x0000 }, /* R17262 */ + { 0x0000, 0x0000, 0x0000 }, /* R17263 */ + { 0x0000, 0x0000, 0x0000 }, /* R17264 */ + { 0x0000, 0x0000, 0x0000 }, /* R17265 */ + { 0x0000, 0x0000, 0x0000 }, /* R17266 */ + { 0x0000, 0x0000, 0x0000 }, /* R17267 */ + { 0x0000, 0x0000, 0x0000 }, /* R17268 */ + { 0x0000, 0x0000, 0x0000 }, /* R17269 */ + { 0x0000, 0x0000, 0x0000 }, /* R17270 */ + { 0x0000, 0x0000, 0x0000 }, /* R17271 */ + { 0x0000, 0x0000, 0x0000 }, /* R17272 */ + { 0x0000, 0x0000, 0x0000 }, /* R17273 */ + { 0x0000, 0x0000, 0x0000 }, /* R17274 */ + { 0x0000, 0x0000, 0x0000 }, /* R17275 */ + { 0x0000, 0x0000, 0x0000 }, /* R17276 */ + { 0x0000, 0x0000, 0x0000 }, /* R17277 */ + { 0x0000, 0x0000, 0x0000 }, /* R17278 */ + { 0x0000, 0x0000, 0x0000 }, /* R17279 */ + { 0x0000, 0x0000, 0x0000 }, /* R17280 */ + { 0x0000, 0x0000, 0x0000 }, /* R17281 */ + { 0x0000, 0x0000, 0x0000 }, /* R17282 */ + { 0x0000, 0x0000, 0x0000 }, /* R17283 */ + { 0x0000, 0x0000, 0x0000 }, /* R17284 */ + { 0x0000, 0x0000, 0x0000 }, /* R17285 */ + { 0x0000, 0x0000, 0x0000 }, /* R17286 */ + { 0x0000, 0x0000, 0x0000 }, /* R17287 */ + { 0x0000, 0x0000, 0x0000 }, /* R17288 */ + { 0x0000, 0x0000, 0x0000 }, /* R17289 */ + { 0x0000, 0x0000, 0x0000 }, /* R17290 */ + { 0x0000, 0x0000, 0x0000 }, /* R17291 */ + { 0x0000, 0x0000, 0x0000 }, /* R17292 */ + { 0x0000, 0x0000, 0x0000 }, /* R17293 */ + { 0x0000, 0x0000, 0x0000 }, /* R17294 */ + { 0x0000, 0x0000, 0x0000 }, /* R17295 */ + { 0x0000, 0x0000, 0x0000 }, /* R17296 */ + { 0x0000, 0x0000, 0x0000 }, /* R17297 */ + { 0x0000, 0x0000, 0x0000 }, /* R17298 */ + { 0x0000, 0x0000, 0x0000 }, /* R17299 */ + { 0x0000, 0x0000, 0x0000 }, /* R17300 */ + { 0x0000, 0x0000, 0x0000 }, /* R17301 */ + { 0x0000, 0x0000, 0x0000 }, /* R17302 */ + { 0x0000, 0x0000, 0x0000 }, /* R17303 */ + { 0x0000, 0x0000, 0x0000 }, /* R17304 */ + { 0x0000, 0x0000, 0x0000 }, /* R17305 */ + { 0x0000, 0x0000, 0x0000 }, /* R17306 */ + { 0x0000, 0x0000, 0x0000 }, /* R17307 */ + { 0x0000, 0x0000, 0x0000 }, /* R17308 */ + { 0x0000, 0x0000, 0x0000 }, /* R17309 */ + { 0x0000, 0x0000, 0x0000 }, /* R17310 */ + { 0x0000, 0x0000, 0x0000 }, /* R17311 */ + { 0x0000, 0x0000, 0x0000 }, /* R17312 */ + { 0x0000, 0x0000, 0x0000 }, /* R17313 */ + { 0x0000, 0x0000, 0x0000 }, /* R17314 */ + { 0x0000, 0x0000, 0x0000 }, /* R17315 */ + { 0x0000, 0x0000, 0x0000 }, /* R17316 */ + { 0x0000, 0x0000, 0x0000 }, /* R17317 */ + { 0x0000, 0x0000, 0x0000 }, /* R17318 */ + { 0x0000, 0x0000, 0x0000 }, /* R17319 */ + { 0x0000, 0x0000, 0x0000 }, /* R17320 */ + { 0x0000, 0x0000, 0x0000 }, /* R17321 */ + { 0x0000, 0x0000, 0x0000 }, /* R17322 */ + { 0x0000, 0x0000, 0x0000 }, /* R17323 */ + { 0x0000, 0x0000, 0x0000 }, /* R17324 */ + { 0x0000, 0x0000, 0x0000 }, /* R17325 */ + { 0x0000, 0x0000, 0x0000 }, /* R17326 */ + { 0x0000, 0x0000, 0x0000 }, /* R17327 */ + { 0x0000, 0x0000, 0x0000 }, /* R17328 */ + { 0x0000, 0x0000, 0x0000 }, /* R17329 */ + { 0x0000, 0x0000, 0x0000 }, /* R17330 */ + { 0x0000, 0x0000, 0x0000 }, /* R17331 */ + { 0x0000, 0x0000, 0x0000 }, /* R17332 */ + { 0x0000, 0x0000, 0x0000 }, /* R17333 */ + { 0x0000, 0x0000, 0x0000 }, /* R17334 */ + { 0x0000, 0x0000, 0x0000 }, /* R17335 */ + { 0x0000, 0x0000, 0x0000 }, /* R17336 */ + { 0x0000, 0x0000, 0x0000 }, /* R17337 */ + { 0x0000, 0x0000, 0x0000 }, /* R17338 */ + { 0x0000, 0x0000, 0x0000 }, /* R17339 */ + { 0x0000, 0x0000, 0x0000 }, /* R17340 */ + { 0x0000, 0x0000, 0x0000 }, /* R17341 */ + { 0x0000, 0x0000, 0x0000 }, /* R17342 */ + { 0x0000, 0x0000, 0x0000 }, /* R17343 */ + { 0x0000, 0x0000, 0x0000 }, /* R17344 */ + { 0x0000, 0x0000, 0x0000 }, /* R17345 */ + { 0x0000, 0x0000, 0x0000 }, /* R17346 */ + { 0x0000, 0x0000, 0x0000 }, /* R17347 */ + { 0x0000, 0x0000, 0x0000 }, /* R17348 */ + { 0x0000, 0x0000, 0x0000 }, /* R17349 */ + { 0x0000, 0x0000, 0x0000 }, /* R17350 */ + { 0x0000, 0x0000, 0x0000 }, /* R17351 */ + { 0x0000, 0x0000, 0x0000 }, /* R17352 */ + { 0x0000, 0x0000, 0x0000 }, /* R17353 */ + { 0x0000, 0x0000, 0x0000 }, /* R17354 */ + { 0x0000, 0x0000, 0x0000 }, /* R17355 */ + { 0x0000, 0x0000, 0x0000 }, /* R17356 */ + { 0x0000, 0x0000, 0x0000 }, /* R17357 */ + { 0x0000, 0x0000, 0x0000 }, /* R17358 */ + { 0x0000, 0x0000, 0x0000 }, /* R17359 */ + { 0x0000, 0x0000, 0x0000 }, /* R17360 */ + { 0x0000, 0x0000, 0x0000 }, /* R17361 */ + { 0x0000, 0x0000, 0x0000 }, /* R17362 */ + { 0x0000, 0x0000, 0x0000 }, /* R17363 */ + { 0x0000, 0x0000, 0x0000 }, /* R17364 */ + { 0x0000, 0x0000, 0x0000 }, /* R17365 */ + { 0x0000, 0x0000, 0x0000 }, /* R17366 */ + { 0x0000, 0x0000, 0x0000 }, /* R17367 */ + { 0x0000, 0x0000, 0x0000 }, /* R17368 */ + { 0x0000, 0x0000, 0x0000 }, /* R17369 */ + { 0x0000, 0x0000, 0x0000 }, /* R17370 */ + { 0x0000, 0x0000, 0x0000 }, /* R17371 */ + { 0x0000, 0x0000, 0x0000 }, /* R17372 */ + { 0x0000, 0x0000, 0x0000 }, /* R17373 */ + { 0x0000, 0x0000, 0x0000 }, /* R17374 */ + { 0x0000, 0x0000, 0x0000 }, /* R17375 */ + { 0x0000, 0x0000, 0x0000 }, /* R17376 */ + { 0x0000, 0x0000, 0x0000 }, /* R17377 */ + { 0x0000, 0x0000, 0x0000 }, /* R17378 */ + { 0x0000, 0x0000, 0x0000 }, /* R17379 */ + { 0x0000, 0x0000, 0x0000 }, /* R17380 */ + { 0x0000, 0x0000, 0x0000 }, /* R17381 */ + { 0x0000, 0x0000, 0x0000 }, /* R17382 */ + { 0x0000, 0x0000, 0x0000 }, /* R17383 */ + { 0x0000, 0x0000, 0x0000 }, /* R17384 */ + { 0x0000, 0x0000, 0x0000 }, /* R17385 */ + { 0x0000, 0x0000, 0x0000 }, /* R17386 */ + { 0x0000, 0x0000, 0x0000 }, /* R17387 */ + { 0x0000, 0x0000, 0x0000 }, /* R17388 */ + { 0x0000, 0x0000, 0x0000 }, /* R17389 */ + { 0x0000, 0x0000, 0x0000 }, /* R17390 */ + { 0x0000, 0x0000, 0x0000 }, /* R17391 */ + { 0x0000, 0x0000, 0x0000 }, /* R17392 */ + { 0x0000, 0x0000, 0x0000 }, /* R17393 */ + { 0x0000, 0x0000, 0x0000 }, /* R17394 */ + { 0x0000, 0x0000, 0x0000 }, /* R17395 */ + { 0x0000, 0x0000, 0x0000 }, /* R17396 */ + { 0x0000, 0x0000, 0x0000 }, /* R17397 */ + { 0x0000, 0x0000, 0x0000 }, /* R17398 */ + { 0x0000, 0x0000, 0x0000 }, /* R17399 */ + { 0x0000, 0x0000, 0x0000 }, /* R17400 */ + { 0x0000, 0x0000, 0x0000 }, /* R17401 */ + { 0x0000, 0x0000, 0x0000 }, /* R17402 */ + { 0x0000, 0x0000, 0x0000 }, /* R17403 */ + { 0x0000, 0x0000, 0x0000 }, /* R17404 */ + { 0x0000, 0x0000, 0x0000 }, /* R17405 */ + { 0x0000, 0x0000, 0x0000 }, /* R17406 */ + { 0x0000, 0x0000, 0x0000 }, /* R17407 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17408 - HPF_C_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17409 - HPF_C_0 */ + { 0x0000, 0x0000, 0x0000 }, /* R17410 */ + { 0x0000, 0x0000, 0x0000 }, /* R17411 */ + { 0x0000, 0x0000, 0x0000 }, /* R17412 */ + { 0x0000, 0x0000, 0x0000 }, /* R17413 */ + { 0x0000, 0x0000, 0x0000 }, /* R17414 */ + { 0x0000, 0x0000, 0x0000 }, /* R17415 */ + { 0x0000, 0x0000, 0x0000 }, /* R17416 */ + { 0x0000, 0x0000, 0x0000 }, /* R17417 */ + { 0x0000, 0x0000, 0x0000 }, /* R17418 */ + { 0x0000, 0x0000, 0x0000 }, /* R17419 */ + { 0x0000, 0x0000, 0x0000 }, /* R17420 */ + { 0x0000, 0x0000, 0x0000 }, /* R17421 */ + { 0x0000, 0x0000, 0x0000 }, /* R17422 */ + { 0x0000, 0x0000, 0x0000 }, /* R17423 */ + { 0x0000, 0x0000, 0x0000 }, /* R17424 */ + { 0x0000, 0x0000, 0x0000 }, /* R17425 */ + { 0x0000, 0x0000, 0x0000 }, /* R17426 */ + { 0x0000, 0x0000, 0x0000 }, /* R17427 */ + { 0x0000, 0x0000, 0x0000 }, /* R17428 */ + { 0x0000, 0x0000, 0x0000 }, /* R17429 */ + { 0x0000, 0x0000, 0x0000 }, /* R17430 */ + { 0x0000, 0x0000, 0x0000 }, /* R17431 */ + { 0x0000, 0x0000, 0x0000 }, /* R17432 */ + { 0x0000, 0x0000, 0x0000 }, /* R17433 */ + { 0x0000, 0x0000, 0x0000 }, /* R17434 */ + { 0x0000, 0x0000, 0x0000 }, /* R17435 */ + { 0x0000, 0x0000, 0x0000 }, /* R17436 */ + { 0x0000, 0x0000, 0x0000 }, /* R17437 */ + { 0x0000, 0x0000, 0x0000 }, /* R17438 */ + { 0x0000, 0x0000, 0x0000 }, /* R17439 */ + { 0x0000, 0x0000, 0x0000 }, /* R17440 */ + { 0x0000, 0x0000, 0x0000 }, /* R17441 */ + { 0x0000, 0x0000, 0x0000 }, /* R17442 */ + { 0x0000, 0x0000, 0x0000 }, /* R17443 */ + { 0x0000, 0x0000, 0x0000 }, /* R17444 */ + { 0x0000, 0x0000, 0x0000 }, /* R17445 */ + { 0x0000, 0x0000, 0x0000 }, /* R17446 */ + { 0x0000, 0x0000, 0x0000 }, /* R17447 */ + { 0x0000, 0x0000, 0x0000 }, /* R17448 */ + { 0x0000, 0x0000, 0x0000 }, /* R17449 */ + { 0x0000, 0x0000, 0x0000 }, /* R17450 */ + { 0x0000, 0x0000, 0x0000 }, /* R17451 */ + { 0x0000, 0x0000, 0x0000 }, /* R17452 */ + { 0x0000, 0x0000, 0x0000 }, /* R17453 */ + { 0x0000, 0x0000, 0x0000 }, /* R17454 */ + { 0x0000, 0x0000, 0x0000 }, /* R17455 */ + { 0x0000, 0x0000, 0x0000 }, /* R17456 */ + { 0x0000, 0x0000, 0x0000 }, /* R17457 */ + { 0x0000, 0x0000, 0x0000 }, /* R17458 */ + { 0x0000, 0x0000, 0x0000 }, /* R17459 */ + { 0x0000, 0x0000, 0x0000 }, /* R17460 */ + { 0x0000, 0x0000, 0x0000 }, /* R17461 */ + { 0x0000, 0x0000, 0x0000 }, /* R17462 */ + { 0x0000, 0x0000, 0x0000 }, /* R17463 */ + { 0x0000, 0x0000, 0x0000 }, /* R17464 */ + { 0x0000, 0x0000, 0x0000 }, /* R17465 */ + { 0x0000, 0x0000, 0x0000 }, /* R17466 */ + { 0x0000, 0x0000, 0x0000 }, /* R17467 */ + { 0x0000, 0x0000, 0x0000 }, /* R17468 */ + { 0x0000, 0x0000, 0x0000 }, /* R17469 */ + { 0x0000, 0x0000, 0x0000 }, /* R17470 */ + { 0x0000, 0x0000, 0x0000 }, /* R17471 */ + { 0x0000, 0x0000, 0x0000 }, /* R17472 */ + { 0x0000, 0x0000, 0x0000 }, /* R17473 */ + { 0x0000, 0x0000, 0x0000 }, /* R17474 */ + { 0x0000, 0x0000, 0x0000 }, /* R17475 */ + { 0x0000, 0x0000, 0x0000 }, /* R17476 */ + { 0x0000, 0x0000, 0x0000 }, /* R17477 */ + { 0x0000, 0x0000, 0x0000 }, /* R17478 */ + { 0x0000, 0x0000, 0x0000 }, /* R17479 */ + { 0x0000, 0x0000, 0x0000 }, /* R17480 */ + { 0x0000, 0x0000, 0x0000 }, /* R17481 */ + { 0x0000, 0x0000, 0x0000 }, /* R17482 */ + { 0x0000, 0x0000, 0x0000 }, /* R17483 */ + { 0x0000, 0x0000, 0x0000 }, /* R17484 */ + { 0x0000, 0x0000, 0x0000 }, /* R17485 */ + { 0x0000, 0x0000, 0x0000 }, /* R17486 */ + { 0x0000, 0x0000, 0x0000 }, /* R17487 */ + { 0x0000, 0x0000, 0x0000 }, /* R17488 */ + { 0x0000, 0x0000, 0x0000 }, /* R17489 */ + { 0x0000, 0x0000, 0x0000 }, /* R17490 */ + { 0x0000, 0x0000, 0x0000 }, /* R17491 */ + { 0x0000, 0x0000, 0x0000 }, /* R17492 */ + { 0x0000, 0x0000, 0x0000 }, /* R17493 */ + { 0x0000, 0x0000, 0x0000 }, /* R17494 */ + { 0x0000, 0x0000, 0x0000 }, /* R17495 */ + { 0x0000, 0x0000, 0x0000 }, /* R17496 */ + { 0x0000, 0x0000, 0x0000 }, /* R17497 */ + { 0x0000, 0x0000, 0x0000 }, /* R17498 */ + { 0x0000, 0x0000, 0x0000 }, /* R17499 */ + { 0x0000, 0x0000, 0x0000 }, /* R17500 */ + { 0x0000, 0x0000, 0x0000 }, /* R17501 */ + { 0x0000, 0x0000, 0x0000 }, /* R17502 */ + { 0x0000, 0x0000, 0x0000 }, /* R17503 */ + { 0x0000, 0x0000, 0x0000 }, /* R17504 */ + { 0x0000, 0x0000, 0x0000 }, /* R17505 */ + { 0x0000, 0x0000, 0x0000 }, /* R17506 */ + { 0x0000, 0x0000, 0x0000 }, /* R17507 */ + { 0x0000, 0x0000, 0x0000 }, /* R17508 */ + { 0x0000, 0x0000, 0x0000 }, /* R17509 */ + { 0x0000, 0x0000, 0x0000 }, /* R17510 */ + { 0x0000, 0x0000, 0x0000 }, /* R17511 */ + { 0x0000, 0x0000, 0x0000 }, /* R17512 */ + { 0x0000, 0x0000, 0x0000 }, /* R17513 */ + { 0x0000, 0x0000, 0x0000 }, /* R17514 */ + { 0x0000, 0x0000, 0x0000 }, /* R17515 */ + { 0x0000, 0x0000, 0x0000 }, /* R17516 */ + { 0x0000, 0x0000, 0x0000 }, /* R17517 */ + { 0x0000, 0x0000, 0x0000 }, /* R17518 */ + { 0x0000, 0x0000, 0x0000 }, /* R17519 */ + { 0x0000, 0x0000, 0x0000 }, /* R17520 */ + { 0x0000, 0x0000, 0x0000 }, /* R17521 */ + { 0x0000, 0x0000, 0x0000 }, /* R17522 */ + { 0x0000, 0x0000, 0x0000 }, /* R17523 */ + { 0x0000, 0x0000, 0x0000 }, /* R17524 */ + { 0x0000, 0x0000, 0x0000 }, /* R17525 */ + { 0x0000, 0x0000, 0x0000 }, /* R17526 */ + { 0x0000, 0x0000, 0x0000 }, /* R17527 */ + { 0x0000, 0x0000, 0x0000 }, /* R17528 */ + { 0x0000, 0x0000, 0x0000 }, /* R17529 */ + { 0x0000, 0x0000, 0x0000 }, /* R17530 */ + { 0x0000, 0x0000, 0x0000 }, /* R17531 */ + { 0x0000, 0x0000, 0x0000 }, /* R17532 */ + { 0x0000, 0x0000, 0x0000 }, /* R17533 */ + { 0x0000, 0x0000, 0x0000 }, /* R17534 */ + { 0x0000, 0x0000, 0x0000 }, /* R17535 */ + { 0x0000, 0x0000, 0x0000 }, /* R17536 */ + { 0x0000, 0x0000, 0x0000 }, /* R17537 */ + { 0x0000, 0x0000, 0x0000 }, /* R17538 */ + { 0x0000, 0x0000, 0x0000 }, /* R17539 */ + { 0x0000, 0x0000, 0x0000 }, /* R17540 */ + { 0x0000, 0x0000, 0x0000 }, /* R17541 */ + { 0x0000, 0x0000, 0x0000 }, /* R17542 */ + { 0x0000, 0x0000, 0x0000 }, /* R17543 */ + { 0x0000, 0x0000, 0x0000 }, /* R17544 */ + { 0x0000, 0x0000, 0x0000 }, /* R17545 */ + { 0x0000, 0x0000, 0x0000 }, /* R17546 */ + { 0x0000, 0x0000, 0x0000 }, /* R17547 */ + { 0x0000, 0x0000, 0x0000 }, /* R17548 */ + { 0x0000, 0x0000, 0x0000 }, /* R17549 */ + { 0x0000, 0x0000, 0x0000 }, /* R17550 */ + { 0x0000, 0x0000, 0x0000 }, /* R17551 */ + { 0x0000, 0x0000, 0x0000 }, /* R17552 */ + { 0x0000, 0x0000, 0x0000 }, /* R17553 */ + { 0x0000, 0x0000, 0x0000 }, /* R17554 */ + { 0x0000, 0x0000, 0x0000 }, /* R17555 */ + { 0x0000, 0x0000, 0x0000 }, /* R17556 */ + { 0x0000, 0x0000, 0x0000 }, /* R17557 */ + { 0x0000, 0x0000, 0x0000 }, /* R17558 */ + { 0x0000, 0x0000, 0x0000 }, /* R17559 */ + { 0x0000, 0x0000, 0x0000 }, /* R17560 */ + { 0x0000, 0x0000, 0x0000 }, /* R17561 */ + { 0x0000, 0x0000, 0x0000 }, /* R17562 */ + { 0x0000, 0x0000, 0x0000 }, /* R17563 */ + { 0x0000, 0x0000, 0x0000 }, /* R17564 */ + { 0x0000, 0x0000, 0x0000 }, /* R17565 */ + { 0x0000, 0x0000, 0x0000 }, /* R17566 */ + { 0x0000, 0x0000, 0x0000 }, /* R17567 */ + { 0x0000, 0x0000, 0x0000 }, /* R17568 */ + { 0x0000, 0x0000, 0x0000 }, /* R17569 */ + { 0x0000, 0x0000, 0x0000 }, /* R17570 */ + { 0x0000, 0x0000, 0x0000 }, /* R17571 */ + { 0x0000, 0x0000, 0x0000 }, /* R17572 */ + { 0x0000, 0x0000, 0x0000 }, /* R17573 */ + { 0x0000, 0x0000, 0x0000 }, /* R17574 */ + { 0x0000, 0x0000, 0x0000 }, /* R17575 */ + { 0x0000, 0x0000, 0x0000 }, /* R17576 */ + { 0x0000, 0x0000, 0x0000 }, /* R17577 */ + { 0x0000, 0x0000, 0x0000 }, /* R17578 */ + { 0x0000, 0x0000, 0x0000 }, /* R17579 */ + { 0x0000, 0x0000, 0x0000 }, /* R17580 */ + { 0x0000, 0x0000, 0x0000 }, /* R17581 */ + { 0x0000, 0x0000, 0x0000 }, /* R17582 */ + { 0x0000, 0x0000, 0x0000 }, /* R17583 */ + { 0x0000, 0x0000, 0x0000 }, /* R17584 */ + { 0x0000, 0x0000, 0x0000 }, /* R17585 */ + { 0x0000, 0x0000, 0x0000 }, /* R17586 */ + { 0x0000, 0x0000, 0x0000 }, /* R17587 */ + { 0x0000, 0x0000, 0x0000 }, /* R17588 */ + { 0x0000, 0x0000, 0x0000 }, /* R17589 */ + { 0x0000, 0x0000, 0x0000 }, /* R17590 */ + { 0x0000, 0x0000, 0x0000 }, /* R17591 */ + { 0x0000, 0x0000, 0x0000 }, /* R17592 */ + { 0x0000, 0x0000, 0x0000 }, /* R17593 */ + { 0x0000, 0x0000, 0x0000 }, /* R17594 */ + { 0x0000, 0x0000, 0x0000 }, /* R17595 */ + { 0x0000, 0x0000, 0x0000 }, /* R17596 */ + { 0x0000, 0x0000, 0x0000 }, /* R17597 */ + { 0x0000, 0x0000, 0x0000 }, /* R17598 */ + { 0x0000, 0x0000, 0x0000 }, /* R17599 */ + { 0x0000, 0x0000, 0x0000 }, /* R17600 */ + { 0x0000, 0x0000, 0x0000 }, /* R17601 */ + { 0x0000, 0x0000, 0x0000 }, /* R17602 */ + { 0x0000, 0x0000, 0x0000 }, /* R17603 */ + { 0x0000, 0x0000, 0x0000 }, /* R17604 */ + { 0x0000, 0x0000, 0x0000 }, /* R17605 */ + { 0x0000, 0x0000, 0x0000 }, /* R17606 */ + { 0x0000, 0x0000, 0x0000 }, /* R17607 */ + { 0x0000, 0x0000, 0x0000 }, /* R17608 */ + { 0x0000, 0x0000, 0x0000 }, /* R17609 */ + { 0x0000, 0x0000, 0x0000 }, /* R17610 */ + { 0x0000, 0x0000, 0x0000 }, /* R17611 */ + { 0x0000, 0x0000, 0x0000 }, /* R17612 */ + { 0x0000, 0x0000, 0x0000 }, /* R17613 */ + { 0x0000, 0x0000, 0x0000 }, /* R17614 */ + { 0x0000, 0x0000, 0x0000 }, /* R17615 */ + { 0x0000, 0x0000, 0x0000 }, /* R17616 */ + { 0x0000, 0x0000, 0x0000 }, /* R17617 */ + { 0x0000, 0x0000, 0x0000 }, /* R17618 */ + { 0x0000, 0x0000, 0x0000 }, /* R17619 */ + { 0x0000, 0x0000, 0x0000 }, /* R17620 */ + { 0x0000, 0x0000, 0x0000 }, /* R17621 */ + { 0x0000, 0x0000, 0x0000 }, /* R17622 */ + { 0x0000, 0x0000, 0x0000 }, /* R17623 */ + { 0x0000, 0x0000, 0x0000 }, /* R17624 */ + { 0x0000, 0x0000, 0x0000 }, /* R17625 */ + { 0x0000, 0x0000, 0x0000 }, /* R17626 */ + { 0x0000, 0x0000, 0x0000 }, /* R17627 */ + { 0x0000, 0x0000, 0x0000 }, /* R17628 */ + { 0x0000, 0x0000, 0x0000 }, /* R17629 */ + { 0x0000, 0x0000, 0x0000 }, /* R17630 */ + { 0x0000, 0x0000, 0x0000 }, /* R17631 */ + { 0x0000, 0x0000, 0x0000 }, /* R17632 */ + { 0x0000, 0x0000, 0x0000 }, /* R17633 */ + { 0x0000, 0x0000, 0x0000 }, /* R17634 */ + { 0x0000, 0x0000, 0x0000 }, /* R17635 */ + { 0x0000, 0x0000, 0x0000 }, /* R17636 */ + { 0x0000, 0x0000, 0x0000 }, /* R17637 */ + { 0x0000, 0x0000, 0x0000 }, /* R17638 */ + { 0x0000, 0x0000, 0x0000 }, /* R17639 */ + { 0x0000, 0x0000, 0x0000 }, /* R17640 */ + { 0x0000, 0x0000, 0x0000 }, /* R17641 */ + { 0x0000, 0x0000, 0x0000 }, /* R17642 */ + { 0x0000, 0x0000, 0x0000 }, /* R17643 */ + { 0x0000, 0x0000, 0x0000 }, /* R17644 */ + { 0x0000, 0x0000, 0x0000 }, /* R17645 */ + { 0x0000, 0x0000, 0x0000 }, /* R17646 */ + { 0x0000, 0x0000, 0x0000 }, /* R17647 */ + { 0x0000, 0x0000, 0x0000 }, /* R17648 */ + { 0x0000, 0x0000, 0x0000 }, /* R17649 */ + { 0x0000, 0x0000, 0x0000 }, /* R17650 */ + { 0x0000, 0x0000, 0x0000 }, /* R17651 */ + { 0x0000, 0x0000, 0x0000 }, /* R17652 */ + { 0x0000, 0x0000, 0x0000 }, /* R17653 */ + { 0x0000, 0x0000, 0x0000 }, /* R17654 */ + { 0x0000, 0x0000, 0x0000 }, /* R17655 */ + { 0x0000, 0x0000, 0x0000 }, /* R17656 */ + { 0x0000, 0x0000, 0x0000 }, /* R17657 */ + { 0x0000, 0x0000, 0x0000 }, /* R17658 */ + { 0x0000, 0x0000, 0x0000 }, /* R17659 */ + { 0x0000, 0x0000, 0x0000 }, /* R17660 */ + { 0x0000, 0x0000, 0x0000 }, /* R17661 */ + { 0x0000, 0x0000, 0x0000 }, /* R17662 */ + { 0x0000, 0x0000, 0x0000 }, /* R17663 */ + { 0x0000, 0x0000, 0x0000 }, /* R17664 */ + { 0x0000, 0x0000, 0x0000 }, /* R17665 */ + { 0x0000, 0x0000, 0x0000 }, /* R17666 */ + { 0x0000, 0x0000, 0x0000 }, /* R17667 */ + { 0x0000, 0x0000, 0x0000 }, /* R17668 */ + { 0x0000, 0x0000, 0x0000 }, /* R17669 */ + { 0x0000, 0x0000, 0x0000 }, /* R17670 */ + { 0x0000, 0x0000, 0x0000 }, /* R17671 */ + { 0x0000, 0x0000, 0x0000 }, /* R17672 */ + { 0x0000, 0x0000, 0x0000 }, /* R17673 */ + { 0x0000, 0x0000, 0x0000 }, /* R17674 */ + { 0x0000, 0x0000, 0x0000 }, /* R17675 */ + { 0x0000, 0x0000, 0x0000 }, /* R17676 */ + { 0x0000, 0x0000, 0x0000 }, /* R17677 */ + { 0x0000, 0x0000, 0x0000 }, /* R17678 */ + { 0x0000, 0x0000, 0x0000 }, /* R17679 */ + { 0x0000, 0x0000, 0x0000 }, /* R17680 */ + { 0x0000, 0x0000, 0x0000 }, /* R17681 */ + { 0x0000, 0x0000, 0x0000 }, /* R17682 */ + { 0x0000, 0x0000, 0x0000 }, /* R17683 */ + { 0x0000, 0x0000, 0x0000 }, /* R17684 */ + { 0x0000, 0x0000, 0x0000 }, /* R17685 */ + { 0x0000, 0x0000, 0x0000 }, /* R17686 */ + { 0x0000, 0x0000, 0x0000 }, /* R17687 */ + { 0x0000, 0x0000, 0x0000 }, /* R17688 */ + { 0x0000, 0x0000, 0x0000 }, /* R17689 */ + { 0x0000, 0x0000, 0x0000 }, /* R17690 */ + { 0x0000, 0x0000, 0x0000 }, /* R17691 */ + { 0x0000, 0x0000, 0x0000 }, /* R17692 */ + { 0x0000, 0x0000, 0x0000 }, /* R17693 */ + { 0x0000, 0x0000, 0x0000 }, /* R17694 */ + { 0x0000, 0x0000, 0x0000 }, /* R17695 */ + { 0x0000, 0x0000, 0x0000 }, /* R17696 */ + { 0x0000, 0x0000, 0x0000 }, /* R17697 */ + { 0x0000, 0x0000, 0x0000 }, /* R17698 */ + { 0x0000, 0x0000, 0x0000 }, /* R17699 */ + { 0x0000, 0x0000, 0x0000 }, /* R17700 */ + { 0x0000, 0x0000, 0x0000 }, /* R17701 */ + { 0x0000, 0x0000, 0x0000 }, /* R17702 */ + { 0x0000, 0x0000, 0x0000 }, /* R17703 */ + { 0x0000, 0x0000, 0x0000 }, /* R17704 */ + { 0x0000, 0x0000, 0x0000 }, /* R17705 */ + { 0x0000, 0x0000, 0x0000 }, /* R17706 */ + { 0x0000, 0x0000, 0x0000 }, /* R17707 */ + { 0x0000, 0x0000, 0x0000 }, /* R17708 */ + { 0x0000, 0x0000, 0x0000 }, /* R17709 */ + { 0x0000, 0x0000, 0x0000 }, /* R17710 */ + { 0x0000, 0x0000, 0x0000 }, /* R17711 */ + { 0x0000, 0x0000, 0x0000 }, /* R17712 */ + { 0x0000, 0x0000, 0x0000 }, /* R17713 */ + { 0x0000, 0x0000, 0x0000 }, /* R17714 */ + { 0x0000, 0x0000, 0x0000 }, /* R17715 */ + { 0x0000, 0x0000, 0x0000 }, /* R17716 */ + { 0x0000, 0x0000, 0x0000 }, /* R17717 */ + { 0x0000, 0x0000, 0x0000 }, /* R17718 */ + { 0x0000, 0x0000, 0x0000 }, /* R17719 */ + { 0x0000, 0x0000, 0x0000 }, /* R17720 */ + { 0x0000, 0x0000, 0x0000 }, /* R17721 */ + { 0x0000, 0x0000, 0x0000 }, /* R17722 */ + { 0x0000, 0x0000, 0x0000 }, /* R17723 */ + { 0x0000, 0x0000, 0x0000 }, /* R17724 */ + { 0x0000, 0x0000, 0x0000 }, /* R17725 */ + { 0x0000, 0x0000, 0x0000 }, /* R17726 */ + { 0x0000, 0x0000, 0x0000 }, /* R17727 */ + { 0x0000, 0x0000, 0x0000 }, /* R17728 */ + { 0x0000, 0x0000, 0x0000 }, /* R17729 */ + { 0x0000, 0x0000, 0x0000 }, /* R17730 */ + { 0x0000, 0x0000, 0x0000 }, /* R17731 */ + { 0x0000, 0x0000, 0x0000 }, /* R17732 */ + { 0x0000, 0x0000, 0x0000 }, /* R17733 */ + { 0x0000, 0x0000, 0x0000 }, /* R17734 */ + { 0x0000, 0x0000, 0x0000 }, /* R17735 */ + { 0x0000, 0x0000, 0x0000 }, /* R17736 */ + { 0x0000, 0x0000, 0x0000 }, /* R17737 */ + { 0x0000, 0x0000, 0x0000 }, /* R17738 */ + { 0x0000, 0x0000, 0x0000 }, /* R17739 */ + { 0x0000, 0x0000, 0x0000 }, /* R17740 */ + { 0x0000, 0x0000, 0x0000 }, /* R17741 */ + { 0x0000, 0x0000, 0x0000 }, /* R17742 */ + { 0x0000, 0x0000, 0x0000 }, /* R17743 */ + { 0x0000, 0x0000, 0x0000 }, /* R17744 */ + { 0x0000, 0x0000, 0x0000 }, /* R17745 */ + { 0x0000, 0x0000, 0x0000 }, /* R17746 */ + { 0x0000, 0x0000, 0x0000 }, /* R17747 */ + { 0x0000, 0x0000, 0x0000 }, /* R17748 */ + { 0x0000, 0x0000, 0x0000 }, /* R17749 */ + { 0x0000, 0x0000, 0x0000 }, /* R17750 */ + { 0x0000, 0x0000, 0x0000 }, /* R17751 */ + { 0x0000, 0x0000, 0x0000 }, /* R17752 */ + { 0x0000, 0x0000, 0x0000 }, /* R17753 */ + { 0x0000, 0x0000, 0x0000 }, /* R17754 */ + { 0x0000, 0x0000, 0x0000 }, /* R17755 */ + { 0x0000, 0x0000, 0x0000 }, /* R17756 */ + { 0x0000, 0x0000, 0x0000 }, /* R17757 */ + { 0x0000, 0x0000, 0x0000 }, /* R17758 */ + { 0x0000, 0x0000, 0x0000 }, /* R17759 */ + { 0x0000, 0x0000, 0x0000 }, /* R17760 */ + { 0x0000, 0x0000, 0x0000 }, /* R17761 */ + { 0x0000, 0x0000, 0x0000 }, /* R17762 */ + { 0x0000, 0x0000, 0x0000 }, /* R17763 */ + { 0x0000, 0x0000, 0x0000 }, /* R17764 */ + { 0x0000, 0x0000, 0x0000 }, /* R17765 */ + { 0x0000, 0x0000, 0x0000 }, /* R17766 */ + { 0x0000, 0x0000, 0x0000 }, /* R17767 */ + { 0x0000, 0x0000, 0x0000 }, /* R17768 */ + { 0x0000, 0x0000, 0x0000 }, /* R17769 */ + { 0x0000, 0x0000, 0x0000 }, /* R17770 */ + { 0x0000, 0x0000, 0x0000 }, /* R17771 */ + { 0x0000, 0x0000, 0x0000 }, /* R17772 */ + { 0x0000, 0x0000, 0x0000 }, /* R17773 */ + { 0x0000, 0x0000, 0x0000 }, /* R17774 */ + { 0x0000, 0x0000, 0x0000 }, /* R17775 */ + { 0x0000, 0x0000, 0x0000 }, /* R17776 */ + { 0x0000, 0x0000, 0x0000 }, /* R17777 */ + { 0x0000, 0x0000, 0x0000 }, /* R17778 */ + { 0x0000, 0x0000, 0x0000 }, /* R17779 */ + { 0x0000, 0x0000, 0x0000 }, /* R17780 */ + { 0x0000, 0x0000, 0x0000 }, /* R17781 */ + { 0x0000, 0x0000, 0x0000 }, /* R17782 */ + { 0x0000, 0x0000, 0x0000 }, /* R17783 */ + { 0x0000, 0x0000, 0x0000 }, /* R17784 */ + { 0x0000, 0x0000, 0x0000 }, /* R17785 */ + { 0x0000, 0x0000, 0x0000 }, /* R17786 */ + { 0x0000, 0x0000, 0x0000 }, /* R17787 */ + { 0x0000, 0x0000, 0x0000 }, /* R17788 */ + { 0x0000, 0x0000, 0x0000 }, /* R17789 */ + { 0x0000, 0x0000, 0x0000 }, /* R17790 */ + { 0x0000, 0x0000, 0x0000 }, /* R17791 */ + { 0x0000, 0x0000, 0x0000 }, /* R17792 */ + { 0x0000, 0x0000, 0x0000 }, /* R17793 */ + { 0x0000, 0x0000, 0x0000 }, /* R17794 */ + { 0x0000, 0x0000, 0x0000 }, /* R17795 */ + { 0x0000, 0x0000, 0x0000 }, /* R17796 */ + { 0x0000, 0x0000, 0x0000 }, /* R17797 */ + { 0x0000, 0x0000, 0x0000 }, /* R17798 */ + { 0x0000, 0x0000, 0x0000 }, /* R17799 */ + { 0x0000, 0x0000, 0x0000 }, /* R17800 */ + { 0x0000, 0x0000, 0x0000 }, /* R17801 */ + { 0x0000, 0x0000, 0x0000 }, /* R17802 */ + { 0x0000, 0x0000, 0x0000 }, /* R17803 */ + { 0x0000, 0x0000, 0x0000 }, /* R17804 */ + { 0x0000, 0x0000, 0x0000 }, /* R17805 */ + { 0x0000, 0x0000, 0x0000 }, /* R17806 */ + { 0x0000, 0x0000, 0x0000 }, /* R17807 */ + { 0x0000, 0x0000, 0x0000 }, /* R17808 */ + { 0x0000, 0x0000, 0x0000 }, /* R17809 */ + { 0x0000, 0x0000, 0x0000 }, /* R17810 */ + { 0x0000, 0x0000, 0x0000 }, /* R17811 */ + { 0x0000, 0x0000, 0x0000 }, /* R17812 */ + { 0x0000, 0x0000, 0x0000 }, /* R17813 */ + { 0x0000, 0x0000, 0x0000 }, /* R17814 */ + { 0x0000, 0x0000, 0x0000 }, /* R17815 */ + { 0x0000, 0x0000, 0x0000 }, /* R17816 */ + { 0x0000, 0x0000, 0x0000 }, /* R17817 */ + { 0x0000, 0x0000, 0x0000 }, /* R17818 */ + { 0x0000, 0x0000, 0x0000 }, /* R17819 */ + { 0x0000, 0x0000, 0x0000 }, /* R17820 */ + { 0x0000, 0x0000, 0x0000 }, /* R17821 */ + { 0x0000, 0x0000, 0x0000 }, /* R17822 */ + { 0x0000, 0x0000, 0x0000 }, /* R17823 */ + { 0x0000, 0x0000, 0x0000 }, /* R17824 */ + { 0x0000, 0x0000, 0x0000 }, /* R17825 */ + { 0x0000, 0x0000, 0x0000 }, /* R17826 */ + { 0x0000, 0x0000, 0x0000 }, /* R17827 */ + { 0x0000, 0x0000, 0x0000 }, /* R17828 */ + { 0x0000, 0x0000, 0x0000 }, /* R17829 */ + { 0x0000, 0x0000, 0x0000 }, /* R17830 */ + { 0x0000, 0x0000, 0x0000 }, /* R17831 */ + { 0x0000, 0x0000, 0x0000 }, /* R17832 */ + { 0x0000, 0x0000, 0x0000 }, /* R17833 */ + { 0x0000, 0x0000, 0x0000 }, /* R17834 */ + { 0x0000, 0x0000, 0x0000 }, /* R17835 */ + { 0x0000, 0x0000, 0x0000 }, /* R17836 */ + { 0x0000, 0x0000, 0x0000 }, /* R17837 */ + { 0x0000, 0x0000, 0x0000 }, /* R17838 */ + { 0x0000, 0x0000, 0x0000 }, /* R17839 */ + { 0x0000, 0x0000, 0x0000 }, /* R17840 */ + { 0x0000, 0x0000, 0x0000 }, /* R17841 */ + { 0x0000, 0x0000, 0x0000 }, /* R17842 */ + { 0x0000, 0x0000, 0x0000 }, /* R17843 */ + { 0x0000, 0x0000, 0x0000 }, /* R17844 */ + { 0x0000, 0x0000, 0x0000 }, /* R17845 */ + { 0x0000, 0x0000, 0x0000 }, /* R17846 */ + { 0x0000, 0x0000, 0x0000 }, /* R17847 */ + { 0x0000, 0x0000, 0x0000 }, /* R17848 */ + { 0x0000, 0x0000, 0x0000 }, /* R17849 */ + { 0x0000, 0x0000, 0x0000 }, /* R17850 */ + { 0x0000, 0x0000, 0x0000 }, /* R17851 */ + { 0x0000, 0x0000, 0x0000 }, /* R17852 */ + { 0x0000, 0x0000, 0x0000 }, /* R17853 */ + { 0x0000, 0x0000, 0x0000 }, /* R17854 */ + { 0x0000, 0x0000, 0x0000 }, /* R17855 */ + { 0x0000, 0x0000, 0x0000 }, /* R17856 */ + { 0x0000, 0x0000, 0x0000 }, /* R17857 */ + { 0x0000, 0x0000, 0x0000 }, /* R17858 */ + { 0x0000, 0x0000, 0x0000 }, /* R17859 */ + { 0x0000, 0x0000, 0x0000 }, /* R17860 */ + { 0x0000, 0x0000, 0x0000 }, /* R17861 */ + { 0x0000, 0x0000, 0x0000 }, /* R17862 */ + { 0x0000, 0x0000, 0x0000 }, /* R17863 */ + { 0x0000, 0x0000, 0x0000 }, /* R17864 */ + { 0x0000, 0x0000, 0x0000 }, /* R17865 */ + { 0x0000, 0x0000, 0x0000 }, /* R17866 */ + { 0x0000, 0x0000, 0x0000 }, /* R17867 */ + { 0x0000, 0x0000, 0x0000 }, /* R17868 */ + { 0x0000, 0x0000, 0x0000 }, /* R17869 */ + { 0x0000, 0x0000, 0x0000 }, /* R17870 */ + { 0x0000, 0x0000, 0x0000 }, /* R17871 */ + { 0x0000, 0x0000, 0x0000 }, /* R17872 */ + { 0x0000, 0x0000, 0x0000 }, /* R17873 */ + { 0x0000, 0x0000, 0x0000 }, /* R17874 */ + { 0x0000, 0x0000, 0x0000 }, /* R17875 */ + { 0x0000, 0x0000, 0x0000 }, /* R17876 */ + { 0x0000, 0x0000, 0x0000 }, /* R17877 */ + { 0x0000, 0x0000, 0x0000 }, /* R17878 */ + { 0x0000, 0x0000, 0x0000 }, /* R17879 */ + { 0x0000, 0x0000, 0x0000 }, /* R17880 */ + { 0x0000, 0x0000, 0x0000 }, /* R17881 */ + { 0x0000, 0x0000, 0x0000 }, /* R17882 */ + { 0x0000, 0x0000, 0x0000 }, /* R17883 */ + { 0x0000, 0x0000, 0x0000 }, /* R17884 */ + { 0x0000, 0x0000, 0x0000 }, /* R17885 */ + { 0x0000, 0x0000, 0x0000 }, /* R17886 */ + { 0x0000, 0x0000, 0x0000 }, /* R17887 */ + { 0x0000, 0x0000, 0x0000 }, /* R17888 */ + { 0x0000, 0x0000, 0x0000 }, /* R17889 */ + { 0x0000, 0x0000, 0x0000 }, /* R17890 */ + { 0x0000, 0x0000, 0x0000 }, /* R17891 */ + { 0x0000, 0x0000, 0x0000 }, /* R17892 */ + { 0x0000, 0x0000, 0x0000 }, /* R17893 */ + { 0x0000, 0x0000, 0x0000 }, /* R17894 */ + { 0x0000, 0x0000, 0x0000 }, /* R17895 */ + { 0x0000, 0x0000, 0x0000 }, /* R17896 */ + { 0x0000, 0x0000, 0x0000 }, /* R17897 */ + { 0x0000, 0x0000, 0x0000 }, /* R17898 */ + { 0x0000, 0x0000, 0x0000 }, /* R17899 */ + { 0x0000, 0x0000, 0x0000 }, /* R17900 */ + { 0x0000, 0x0000, 0x0000 }, /* R17901 */ + { 0x0000, 0x0000, 0x0000 }, /* R17902 */ + { 0x0000, 0x0000, 0x0000 }, /* R17903 */ + { 0x0000, 0x0000, 0x0000 }, /* R17904 */ + { 0x0000, 0x0000, 0x0000 }, /* R17905 */ + { 0x0000, 0x0000, 0x0000 }, /* R17906 */ + { 0x0000, 0x0000, 0x0000 }, /* R17907 */ + { 0x0000, 0x0000, 0x0000 }, /* R17908 */ + { 0x0000, 0x0000, 0x0000 }, /* R17909 */ + { 0x0000, 0x0000, 0x0000 }, /* R17910 */ + { 0x0000, 0x0000, 0x0000 }, /* R17911 */ + { 0x0000, 0x0000, 0x0000 }, /* R17912 */ + { 0x0000, 0x0000, 0x0000 }, /* R17913 */ + { 0x0000, 0x0000, 0x0000 }, /* R17914 */ + { 0x0000, 0x0000, 0x0000 }, /* R17915 */ + { 0x0000, 0x0000, 0x0000 }, /* R17916 */ + { 0x0000, 0x0000, 0x0000 }, /* R17917 */ + { 0x0000, 0x0000, 0x0000 }, /* R17918 */ + { 0x0000, 0x0000, 0x0000 }, /* R17919 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17920 - ADCL_RETUNE_C1_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17921 - ADCL_RETUNE_C1_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17922 - ADCL_RETUNE_C2_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17923 - ADCL_RETUNE_C2_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17924 - ADCL_RETUNE_C3_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17925 - ADCL_RETUNE_C3_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17926 - ADCL_RETUNE_C4_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17927 - ADCL_RETUNE_C4_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17928 - ADCL_RETUNE_C5_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17929 - ADCL_RETUNE_C5_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17930 - ADCL_RETUNE_C6_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17931 - ADCL_RETUNE_C6_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17932 - ADCL_RETUNE_C7_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17933 - ADCL_RETUNE_C7_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17934 - ADCL_RETUNE_C8_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17935 - ADCL_RETUNE_C8_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17936 - ADCL_RETUNE_C9_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17937 - ADCL_RETUNE_C9_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17938 - ADCL_RETUNE_C10_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17939 - ADCL_RETUNE_C10_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17940 - ADCL_RETUNE_C11_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17941 - ADCL_RETUNE_C11_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17942 - ADCL_RETUNE_C12_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17943 - ADCL_RETUNE_C12_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17944 - ADCL_RETUNE_C13_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17945 - ADCL_RETUNE_C13_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17946 - ADCL_RETUNE_C14_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17947 - ADCL_RETUNE_C14_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17948 - ADCL_RETUNE_C15_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17949 - ADCL_RETUNE_C15_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17950 - ADCL_RETUNE_C16_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17951 - ADCL_RETUNE_C16_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17952 - ADCL_RETUNE_C17_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17953 - ADCL_RETUNE_C17_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17954 - ADCL_RETUNE_C18_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17955 - ADCL_RETUNE_C18_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17956 - ADCL_RETUNE_C19_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17957 - ADCL_RETUNE_C19_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17958 - ADCL_RETUNE_C20_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17959 - ADCL_RETUNE_C20_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17960 - ADCL_RETUNE_C21_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17961 - ADCL_RETUNE_C21_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17962 - ADCL_RETUNE_C22_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17963 - ADCL_RETUNE_C22_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17964 - ADCL_RETUNE_C23_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17965 - ADCL_RETUNE_C23_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17966 - ADCL_RETUNE_C24_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17967 - ADCL_RETUNE_C24_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17968 - ADCL_RETUNE_C25_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17969 - ADCL_RETUNE_C25_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17970 - ADCL_RETUNE_C26_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17971 - ADCL_RETUNE_C26_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17972 - ADCL_RETUNE_C27_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17973 - ADCL_RETUNE_C27_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17974 - ADCL_RETUNE_C28_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17975 - ADCL_RETUNE_C28_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17976 - ADCL_RETUNE_C29_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17977 - ADCL_RETUNE_C29_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17978 - ADCL_RETUNE_C30_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17979 - ADCL_RETUNE_C30_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17980 - ADCL_RETUNE_C31_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17981 - ADCL_RETUNE_C31_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R17982 - ADCL_RETUNE_C32_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R17983 - ADCL_RETUNE_C32_0 */ + { 0x0000, 0x0000, 0x0000 }, /* R17984 */ + { 0x0000, 0x0000, 0x0000 }, /* R17985 */ + { 0x0000, 0x0000, 0x0000 }, /* R17986 */ + { 0x0000, 0x0000, 0x0000 }, /* R17987 */ + { 0x0000, 0x0000, 0x0000 }, /* R17988 */ + { 0x0000, 0x0000, 0x0000 }, /* R17989 */ + { 0x0000, 0x0000, 0x0000 }, /* R17990 */ + { 0x0000, 0x0000, 0x0000 }, /* R17991 */ + { 0x0000, 0x0000, 0x0000 }, /* R17992 */ + { 0x0000, 0x0000, 0x0000 }, /* R17993 */ + { 0x0000, 0x0000, 0x0000 }, /* R17994 */ + { 0x0000, 0x0000, 0x0000 }, /* R17995 */ + { 0x0000, 0x0000, 0x0000 }, /* R17996 */ + { 0x0000, 0x0000, 0x0000 }, /* R17997 */ + { 0x0000, 0x0000, 0x0000 }, /* R17998 */ + { 0x0000, 0x0000, 0x0000 }, /* R17999 */ + { 0x0000, 0x0000, 0x0000 }, /* R18000 */ + { 0x0000, 0x0000, 0x0000 }, /* R18001 */ + { 0x0000, 0x0000, 0x0000 }, /* R18002 */ + { 0x0000, 0x0000, 0x0000 }, /* R18003 */ + { 0x0000, 0x0000, 0x0000 }, /* R18004 */ + { 0x0000, 0x0000, 0x0000 }, /* R18005 */ + { 0x0000, 0x0000, 0x0000 }, /* R18006 */ + { 0x0000, 0x0000, 0x0000 }, /* R18007 */ + { 0x0000, 0x0000, 0x0000 }, /* R18008 */ + { 0x0000, 0x0000, 0x0000 }, /* R18009 */ + { 0x0000, 0x0000, 0x0000 }, /* R18010 */ + { 0x0000, 0x0000, 0x0000 }, /* R18011 */ + { 0x0000, 0x0000, 0x0000 }, /* R18012 */ + { 0x0000, 0x0000, 0x0000 }, /* R18013 */ + { 0x0000, 0x0000, 0x0000 }, /* R18014 */ + { 0x0000, 0x0000, 0x0000 }, /* R18015 */ + { 0x0000, 0x0000, 0x0000 }, /* R18016 */ + { 0x0000, 0x0000, 0x0000 }, /* R18017 */ + { 0x0000, 0x0000, 0x0000 }, /* R18018 */ + { 0x0000, 0x0000, 0x0000 }, /* R18019 */ + { 0x0000, 0x0000, 0x0000 }, /* R18020 */ + { 0x0000, 0x0000, 0x0000 }, /* R18021 */ + { 0x0000, 0x0000, 0x0000 }, /* R18022 */ + { 0x0000, 0x0000, 0x0000 }, /* R18023 */ + { 0x0000, 0x0000, 0x0000 }, /* R18024 */ + { 0x0000, 0x0000, 0x0000 }, /* R18025 */ + { 0x0000, 0x0000, 0x0000 }, /* R18026 */ + { 0x0000, 0x0000, 0x0000 }, /* R18027 */ + { 0x0000, 0x0000, 0x0000 }, /* R18028 */ + { 0x0000, 0x0000, 0x0000 }, /* R18029 */ + { 0x0000, 0x0000, 0x0000 }, /* R18030 */ + { 0x0000, 0x0000, 0x0000 }, /* R18031 */ + { 0x0000, 0x0000, 0x0000 }, /* R18032 */ + { 0x0000, 0x0000, 0x0000 }, /* R18033 */ + { 0x0000, 0x0000, 0x0000 }, /* R18034 */ + { 0x0000, 0x0000, 0x0000 }, /* R18035 */ + { 0x0000, 0x0000, 0x0000 }, /* R18036 */ + { 0x0000, 0x0000, 0x0000 }, /* R18037 */ + { 0x0000, 0x0000, 0x0000 }, /* R18038 */ + { 0x0000, 0x0000, 0x0000 }, /* R18039 */ + { 0x0000, 0x0000, 0x0000 }, /* R18040 */ + { 0x0000, 0x0000, 0x0000 }, /* R18041 */ + { 0x0000, 0x0000, 0x0000 }, /* R18042 */ + { 0x0000, 0x0000, 0x0000 }, /* R18043 */ + { 0x0000, 0x0000, 0x0000 }, /* R18044 */ + { 0x0000, 0x0000, 0x0000 }, /* R18045 */ + { 0x0000, 0x0000, 0x0000 }, /* R18046 */ + { 0x0000, 0x0000, 0x0000 }, /* R18047 */ + { 0x0000, 0x0000, 0x0000 }, /* R18048 */ + { 0x0000, 0x0000, 0x0000 }, /* R18049 */ + { 0x0000, 0x0000, 0x0000 }, /* R18050 */ + { 0x0000, 0x0000, 0x0000 }, /* R18051 */ + { 0x0000, 0x0000, 0x0000 }, /* R18052 */ + { 0x0000, 0x0000, 0x0000 }, /* R18053 */ + { 0x0000, 0x0000, 0x0000 }, /* R18054 */ + { 0x0000, 0x0000, 0x0000 }, /* R18055 */ + { 0x0000, 0x0000, 0x0000 }, /* R18056 */ + { 0x0000, 0x0000, 0x0000 }, /* R18057 */ + { 0x0000, 0x0000, 0x0000 }, /* R18058 */ + { 0x0000, 0x0000, 0x0000 }, /* R18059 */ + { 0x0000, 0x0000, 0x0000 }, /* R18060 */ + { 0x0000, 0x0000, 0x0000 }, /* R18061 */ + { 0x0000, 0x0000, 0x0000 }, /* R18062 */ + { 0x0000, 0x0000, 0x0000 }, /* R18063 */ + { 0x0000, 0x0000, 0x0000 }, /* R18064 */ + { 0x0000, 0x0000, 0x0000 }, /* R18065 */ + { 0x0000, 0x0000, 0x0000 }, /* R18066 */ + { 0x0000, 0x0000, 0x0000 }, /* R18067 */ + { 0x0000, 0x0000, 0x0000 }, /* R18068 */ + { 0x0000, 0x0000, 0x0000 }, /* R18069 */ + { 0x0000, 0x0000, 0x0000 }, /* R18070 */ + { 0x0000, 0x0000, 0x0000 }, /* R18071 */ + { 0x0000, 0x0000, 0x0000 }, /* R18072 */ + { 0x0000, 0x0000, 0x0000 }, /* R18073 */ + { 0x0000, 0x0000, 0x0000 }, /* R18074 */ + { 0x0000, 0x0000, 0x0000 }, /* R18075 */ + { 0x0000, 0x0000, 0x0000 }, /* R18076 */ + { 0x0000, 0x0000, 0x0000 }, /* R18077 */ + { 0x0000, 0x0000, 0x0000 }, /* R18078 */ + { 0x0000, 0x0000, 0x0000 }, /* R18079 */ + { 0x0000, 0x0000, 0x0000 }, /* R18080 */ + { 0x0000, 0x0000, 0x0000 }, /* R18081 */ + { 0x0000, 0x0000, 0x0000 }, /* R18082 */ + { 0x0000, 0x0000, 0x0000 }, /* R18083 */ + { 0x0000, 0x0000, 0x0000 }, /* R18084 */ + { 0x0000, 0x0000, 0x0000 }, /* R18085 */ + { 0x0000, 0x0000, 0x0000 }, /* R18086 */ + { 0x0000, 0x0000, 0x0000 }, /* R18087 */ + { 0x0000, 0x0000, 0x0000 }, /* R18088 */ + { 0x0000, 0x0000, 0x0000 }, /* R18089 */ + { 0x0000, 0x0000, 0x0000 }, /* R18090 */ + { 0x0000, 0x0000, 0x0000 }, /* R18091 */ + { 0x0000, 0x0000, 0x0000 }, /* R18092 */ + { 0x0000, 0x0000, 0x0000 }, /* R18093 */ + { 0x0000, 0x0000, 0x0000 }, /* R18094 */ + { 0x0000, 0x0000, 0x0000 }, /* R18095 */ + { 0x0000, 0x0000, 0x0000 }, /* R18096 */ + { 0x0000, 0x0000, 0x0000 }, /* R18097 */ + { 0x0000, 0x0000, 0x0000 }, /* R18098 */ + { 0x0000, 0x0000, 0x0000 }, /* R18099 */ + { 0x0000, 0x0000, 0x0000 }, /* R18100 */ + { 0x0000, 0x0000, 0x0000 }, /* R18101 */ + { 0x0000, 0x0000, 0x0000 }, /* R18102 */ + { 0x0000, 0x0000, 0x0000 }, /* R18103 */ + { 0x0000, 0x0000, 0x0000 }, /* R18104 */ + { 0x0000, 0x0000, 0x0000 }, /* R18105 */ + { 0x0000, 0x0000, 0x0000 }, /* R18106 */ + { 0x0000, 0x0000, 0x0000 }, /* R18107 */ + { 0x0000, 0x0000, 0x0000 }, /* R18108 */ + { 0x0000, 0x0000, 0x0000 }, /* R18109 */ + { 0x0000, 0x0000, 0x0000 }, /* R18110 */ + { 0x0000, 0x0000, 0x0000 }, /* R18111 */ + { 0x0000, 0x0000, 0x0000 }, /* R18112 */ + { 0x0000, 0x0000, 0x0000 }, /* R18113 */ + { 0x0000, 0x0000, 0x0000 }, /* R18114 */ + { 0x0000, 0x0000, 0x0000 }, /* R18115 */ + { 0x0000, 0x0000, 0x0000 }, /* R18116 */ + { 0x0000, 0x0000, 0x0000 }, /* R18117 */ + { 0x0000, 0x0000, 0x0000 }, /* R18118 */ + { 0x0000, 0x0000, 0x0000 }, /* R18119 */ + { 0x0000, 0x0000, 0x0000 }, /* R18120 */ + { 0x0000, 0x0000, 0x0000 }, /* R18121 */ + { 0x0000, 0x0000, 0x0000 }, /* R18122 */ + { 0x0000, 0x0000, 0x0000 }, /* R18123 */ + { 0x0000, 0x0000, 0x0000 }, /* R18124 */ + { 0x0000, 0x0000, 0x0000 }, /* R18125 */ + { 0x0000, 0x0000, 0x0000 }, /* R18126 */ + { 0x0000, 0x0000, 0x0000 }, /* R18127 */ + { 0x0000, 0x0000, 0x0000 }, /* R18128 */ + { 0x0000, 0x0000, 0x0000 }, /* R18129 */ + { 0x0000, 0x0000, 0x0000 }, /* R18130 */ + { 0x0000, 0x0000, 0x0000 }, /* R18131 */ + { 0x0000, 0x0000, 0x0000 }, /* R18132 */ + { 0x0000, 0x0000, 0x0000 }, /* R18133 */ + { 0x0000, 0x0000, 0x0000 }, /* R18134 */ + { 0x0000, 0x0000, 0x0000 }, /* R18135 */ + { 0x0000, 0x0000, 0x0000 }, /* R18136 */ + { 0x0000, 0x0000, 0x0000 }, /* R18137 */ + { 0x0000, 0x0000, 0x0000 }, /* R18138 */ + { 0x0000, 0x0000, 0x0000 }, /* R18139 */ + { 0x0000, 0x0000, 0x0000 }, /* R18140 */ + { 0x0000, 0x0000, 0x0000 }, /* R18141 */ + { 0x0000, 0x0000, 0x0000 }, /* R18142 */ + { 0x0000, 0x0000, 0x0000 }, /* R18143 */ + { 0x0000, 0x0000, 0x0000 }, /* R18144 */ + { 0x0000, 0x0000, 0x0000 }, /* R18145 */ + { 0x0000, 0x0000, 0x0000 }, /* R18146 */ + { 0x0000, 0x0000, 0x0000 }, /* R18147 */ + { 0x0000, 0x0000, 0x0000 }, /* R18148 */ + { 0x0000, 0x0000, 0x0000 }, /* R18149 */ + { 0x0000, 0x0000, 0x0000 }, /* R18150 */ + { 0x0000, 0x0000, 0x0000 }, /* R18151 */ + { 0x0000, 0x0000, 0x0000 }, /* R18152 */ + { 0x0000, 0x0000, 0x0000 }, /* R18153 */ + { 0x0000, 0x0000, 0x0000 }, /* R18154 */ + { 0x0000, 0x0000, 0x0000 }, /* R18155 */ + { 0x0000, 0x0000, 0x0000 }, /* R18156 */ + { 0x0000, 0x0000, 0x0000 }, /* R18157 */ + { 0x0000, 0x0000, 0x0000 }, /* R18158 */ + { 0x0000, 0x0000, 0x0000 }, /* R18159 */ + { 0x0000, 0x0000, 0x0000 }, /* R18160 */ + { 0x0000, 0x0000, 0x0000 }, /* R18161 */ + { 0x0000, 0x0000, 0x0000 }, /* R18162 */ + { 0x0000, 0x0000, 0x0000 }, /* R18163 */ + { 0x0000, 0x0000, 0x0000 }, /* R18164 */ + { 0x0000, 0x0000, 0x0000 }, /* R18165 */ + { 0x0000, 0x0000, 0x0000 }, /* R18166 */ + { 0x0000, 0x0000, 0x0000 }, /* R18167 */ + { 0x0000, 0x0000, 0x0000 }, /* R18168 */ + { 0x0000, 0x0000, 0x0000 }, /* R18169 */ + { 0x0000, 0x0000, 0x0000 }, /* R18170 */ + { 0x0000, 0x0000, 0x0000 }, /* R18171 */ + { 0x0000, 0x0000, 0x0000 }, /* R18172 */ + { 0x0000, 0x0000, 0x0000 }, /* R18173 */ + { 0x0000, 0x0000, 0x0000 }, /* R18174 */ + { 0x0000, 0x0000, 0x0000 }, /* R18175 */ + { 0x0000, 0x0000, 0x0000 }, /* R18176 */ + { 0x0000, 0x0000, 0x0000 }, /* R18177 */ + { 0x0000, 0x0000, 0x0000 }, /* R18178 */ + { 0x0000, 0x0000, 0x0000 }, /* R18179 */ + { 0x0000, 0x0000, 0x0000 }, /* R18180 */ + { 0x0000, 0x0000, 0x0000 }, /* R18181 */ + { 0x0000, 0x0000, 0x0000 }, /* R18182 */ + { 0x0000, 0x0000, 0x0000 }, /* R18183 */ + { 0x0000, 0x0000, 0x0000 }, /* R18184 */ + { 0x0000, 0x0000, 0x0000 }, /* R18185 */ + { 0x0000, 0x0000, 0x0000 }, /* R18186 */ + { 0x0000, 0x0000, 0x0000 }, /* R18187 */ + { 0x0000, 0x0000, 0x0000 }, /* R18188 */ + { 0x0000, 0x0000, 0x0000 }, /* R18189 */ + { 0x0000, 0x0000, 0x0000 }, /* R18190 */ + { 0x0000, 0x0000, 0x0000 }, /* R18191 */ + { 0x0000, 0x0000, 0x0000 }, /* R18192 */ + { 0x0000, 0x0000, 0x0000 }, /* R18193 */ + { 0x0000, 0x0000, 0x0000 }, /* R18194 */ + { 0x0000, 0x0000, 0x0000 }, /* R18195 */ + { 0x0000, 0x0000, 0x0000 }, /* R18196 */ + { 0x0000, 0x0000, 0x0000 }, /* R18197 */ + { 0x0000, 0x0000, 0x0000 }, /* R18198 */ + { 0x0000, 0x0000, 0x0000 }, /* R18199 */ + { 0x0000, 0x0000, 0x0000 }, /* R18200 */ + { 0x0000, 0x0000, 0x0000 }, /* R18201 */ + { 0x0000, 0x0000, 0x0000 }, /* R18202 */ + { 0x0000, 0x0000, 0x0000 }, /* R18203 */ + { 0x0000, 0x0000, 0x0000 }, /* R18204 */ + { 0x0000, 0x0000, 0x0000 }, /* R18205 */ + { 0x0000, 0x0000, 0x0000 }, /* R18206 */ + { 0x0000, 0x0000, 0x0000 }, /* R18207 */ + { 0x0000, 0x0000, 0x0000 }, /* R18208 */ + { 0x0000, 0x0000, 0x0000 }, /* R18209 */ + { 0x0000, 0x0000, 0x0000 }, /* R18210 */ + { 0x0000, 0x0000, 0x0000 }, /* R18211 */ + { 0x0000, 0x0000, 0x0000 }, /* R18212 */ + { 0x0000, 0x0000, 0x0000 }, /* R18213 */ + { 0x0000, 0x0000, 0x0000 }, /* R18214 */ + { 0x0000, 0x0000, 0x0000 }, /* R18215 */ + { 0x0000, 0x0000, 0x0000 }, /* R18216 */ + { 0x0000, 0x0000, 0x0000 }, /* R18217 */ + { 0x0000, 0x0000, 0x0000 }, /* R18218 */ + { 0x0000, 0x0000, 0x0000 }, /* R18219 */ + { 0x0000, 0x0000, 0x0000 }, /* R18220 */ + { 0x0000, 0x0000, 0x0000 }, /* R18221 */ + { 0x0000, 0x0000, 0x0000 }, /* R18222 */ + { 0x0000, 0x0000, 0x0000 }, /* R18223 */ + { 0x0000, 0x0000, 0x0000 }, /* R18224 */ + { 0x0000, 0x0000, 0x0000 }, /* R18225 */ + { 0x0000, 0x0000, 0x0000 }, /* R18226 */ + { 0x0000, 0x0000, 0x0000 }, /* R18227 */ + { 0x0000, 0x0000, 0x0000 }, /* R18228 */ + { 0x0000, 0x0000, 0x0000 }, /* R18229 */ + { 0x0000, 0x0000, 0x0000 }, /* R18230 */ + { 0x0000, 0x0000, 0x0000 }, /* R18231 */ + { 0x0000, 0x0000, 0x0000 }, /* R18232 */ + { 0x0000, 0x0000, 0x0000 }, /* R18233 */ + { 0x0000, 0x0000, 0x0000 }, /* R18234 */ + { 0x0000, 0x0000, 0x0000 }, /* R18235 */ + { 0x0000, 0x0000, 0x0000 }, /* R18236 */ + { 0x0000, 0x0000, 0x0000 }, /* R18237 */ + { 0x0000, 0x0000, 0x0000 }, /* R18238 */ + { 0x0000, 0x0000, 0x0000 }, /* R18239 */ + { 0x0000, 0x0000, 0x0000 }, /* R18240 */ + { 0x0000, 0x0000, 0x0000 }, /* R18241 */ + { 0x0000, 0x0000, 0x0000 }, /* R18242 */ + { 0x0000, 0x0000, 0x0000 }, /* R18243 */ + { 0x0000, 0x0000, 0x0000 }, /* R18244 */ + { 0x0000, 0x0000, 0x0000 }, /* R18245 */ + { 0x0000, 0x0000, 0x0000 }, /* R18246 */ + { 0x0000, 0x0000, 0x0000 }, /* R18247 */ + { 0x0000, 0x0000, 0x0000 }, /* R18248 */ + { 0x0000, 0x0000, 0x0000 }, /* R18249 */ + { 0x0000, 0x0000, 0x0000 }, /* R18250 */ + { 0x0000, 0x0000, 0x0000 }, /* R18251 */ + { 0x0000, 0x0000, 0x0000 }, /* R18252 */ + { 0x0000, 0x0000, 0x0000 }, /* R18253 */ + { 0x0000, 0x0000, 0x0000 }, /* R18254 */ + { 0x0000, 0x0000, 0x0000 }, /* R18255 */ + { 0x0000, 0x0000, 0x0000 }, /* R18256 */ + { 0x0000, 0x0000, 0x0000 }, /* R18257 */ + { 0x0000, 0x0000, 0x0000 }, /* R18258 */ + { 0x0000, 0x0000, 0x0000 }, /* R18259 */ + { 0x0000, 0x0000, 0x0000 }, /* R18260 */ + { 0x0000, 0x0000, 0x0000 }, /* R18261 */ + { 0x0000, 0x0000, 0x0000 }, /* R18262 */ + { 0x0000, 0x0000, 0x0000 }, /* R18263 */ + { 0x0000, 0x0000, 0x0000 }, /* R18264 */ + { 0x0000, 0x0000, 0x0000 }, /* R18265 */ + { 0x0000, 0x0000, 0x0000 }, /* R18266 */ + { 0x0000, 0x0000, 0x0000 }, /* R18267 */ + { 0x0000, 0x0000, 0x0000 }, /* R18268 */ + { 0x0000, 0x0000, 0x0000 }, /* R18269 */ + { 0x0000, 0x0000, 0x0000 }, /* R18270 */ + { 0x0000, 0x0000, 0x0000 }, /* R18271 */ + { 0x0000, 0x0000, 0x0000 }, /* R18272 */ + { 0x0000, 0x0000, 0x0000 }, /* R18273 */ + { 0x0000, 0x0000, 0x0000 }, /* R18274 */ + { 0x0000, 0x0000, 0x0000 }, /* R18275 */ + { 0x0000, 0x0000, 0x0000 }, /* R18276 */ + { 0x0000, 0x0000, 0x0000 }, /* R18277 */ + { 0x0000, 0x0000, 0x0000 }, /* R18278 */ + { 0x0000, 0x0000, 0x0000 }, /* R18279 */ + { 0x0000, 0x0000, 0x0000 }, /* R18280 */ + { 0x0000, 0x0000, 0x0000 }, /* R18281 */ + { 0x0000, 0x0000, 0x0000 }, /* R18282 */ + { 0x0000, 0x0000, 0x0000 }, /* R18283 */ + { 0x0000, 0x0000, 0x0000 }, /* R18284 */ + { 0x0000, 0x0000, 0x0000 }, /* R18285 */ + { 0x0000, 0x0000, 0x0000 }, /* R18286 */ + { 0x0000, 0x0000, 0x0000 }, /* R18287 */ + { 0x0000, 0x0000, 0x0000 }, /* R18288 */ + { 0x0000, 0x0000, 0x0000 }, /* R18289 */ + { 0x0000, 0x0000, 0x0000 }, /* R18290 */ + { 0x0000, 0x0000, 0x0000 }, /* R18291 */ + { 0x0000, 0x0000, 0x0000 }, /* R18292 */ + { 0x0000, 0x0000, 0x0000 }, /* R18293 */ + { 0x0000, 0x0000, 0x0000 }, /* R18294 */ + { 0x0000, 0x0000, 0x0000 }, /* R18295 */ + { 0x0000, 0x0000, 0x0000 }, /* R18296 */ + { 0x0000, 0x0000, 0x0000 }, /* R18297 */ + { 0x0000, 0x0000, 0x0000 }, /* R18298 */ + { 0x0000, 0x0000, 0x0000 }, /* R18299 */ + { 0x0000, 0x0000, 0x0000 }, /* R18300 */ + { 0x0000, 0x0000, 0x0000 }, /* R18301 */ + { 0x0000, 0x0000, 0x0000 }, /* R18302 */ + { 0x0000, 0x0000, 0x0000 }, /* R18303 */ + { 0x0000, 0x0000, 0x0000 }, /* R18304 */ + { 0x0000, 0x0000, 0x0000 }, /* R18305 */ + { 0x0000, 0x0000, 0x0000 }, /* R18306 */ + { 0x0000, 0x0000, 0x0000 }, /* R18307 */ + { 0x0000, 0x0000, 0x0000 }, /* R18308 */ + { 0x0000, 0x0000, 0x0000 }, /* R18309 */ + { 0x0000, 0x0000, 0x0000 }, /* R18310 */ + { 0x0000, 0x0000, 0x0000 }, /* R18311 */ + { 0x0000, 0x0000, 0x0000 }, /* R18312 */ + { 0x0000, 0x0000, 0x0000 }, /* R18313 */ + { 0x0000, 0x0000, 0x0000 }, /* R18314 */ + { 0x0000, 0x0000, 0x0000 }, /* R18315 */ + { 0x0000, 0x0000, 0x0000 }, /* R18316 */ + { 0x0000, 0x0000, 0x0000 }, /* R18317 */ + { 0x0000, 0x0000, 0x0000 }, /* R18318 */ + { 0x0000, 0x0000, 0x0000 }, /* R18319 */ + { 0x0000, 0x0000, 0x0000 }, /* R18320 */ + { 0x0000, 0x0000, 0x0000 }, /* R18321 */ + { 0x0000, 0x0000, 0x0000 }, /* R18322 */ + { 0x0000, 0x0000, 0x0000 }, /* R18323 */ + { 0x0000, 0x0000, 0x0000 }, /* R18324 */ + { 0x0000, 0x0000, 0x0000 }, /* R18325 */ + { 0x0000, 0x0000, 0x0000 }, /* R18326 */ + { 0x0000, 0x0000, 0x0000 }, /* R18327 */ + { 0x0000, 0x0000, 0x0000 }, /* R18328 */ + { 0x0000, 0x0000, 0x0000 }, /* R18329 */ + { 0x0000, 0x0000, 0x0000 }, /* R18330 */ + { 0x0000, 0x0000, 0x0000 }, /* R18331 */ + { 0x0000, 0x0000, 0x0000 }, /* R18332 */ + { 0x0000, 0x0000, 0x0000 }, /* R18333 */ + { 0x0000, 0x0000, 0x0000 }, /* R18334 */ + { 0x0000, 0x0000, 0x0000 }, /* R18335 */ + { 0x0000, 0x0000, 0x0000 }, /* R18336 */ + { 0x0000, 0x0000, 0x0000 }, /* R18337 */ + { 0x0000, 0x0000, 0x0000 }, /* R18338 */ + { 0x0000, 0x0000, 0x0000 }, /* R18339 */ + { 0x0000, 0x0000, 0x0000 }, /* R18340 */ + { 0x0000, 0x0000, 0x0000 }, /* R18341 */ + { 0x0000, 0x0000, 0x0000 }, /* R18342 */ + { 0x0000, 0x0000, 0x0000 }, /* R18343 */ + { 0x0000, 0x0000, 0x0000 }, /* R18344 */ + { 0x0000, 0x0000, 0x0000 }, /* R18345 */ + { 0x0000, 0x0000, 0x0000 }, /* R18346 */ + { 0x0000, 0x0000, 0x0000 }, /* R18347 */ + { 0x0000, 0x0000, 0x0000 }, /* R18348 */ + { 0x0000, 0x0000, 0x0000 }, /* R18349 */ + { 0x0000, 0x0000, 0x0000 }, /* R18350 */ + { 0x0000, 0x0000, 0x0000 }, /* R18351 */ + { 0x0000, 0x0000, 0x0000 }, /* R18352 */ + { 0x0000, 0x0000, 0x0000 }, /* R18353 */ + { 0x0000, 0x0000, 0x0000 }, /* R18354 */ + { 0x0000, 0x0000, 0x0000 }, /* R18355 */ + { 0x0000, 0x0000, 0x0000 }, /* R18356 */ + { 0x0000, 0x0000, 0x0000 }, /* R18357 */ + { 0x0000, 0x0000, 0x0000 }, /* R18358 */ + { 0x0000, 0x0000, 0x0000 }, /* R18359 */ + { 0x0000, 0x0000, 0x0000 }, /* R18360 */ + { 0x0000, 0x0000, 0x0000 }, /* R18361 */ + { 0x0000, 0x0000, 0x0000 }, /* R18362 */ + { 0x0000, 0x0000, 0x0000 }, /* R18363 */ + { 0x0000, 0x0000, 0x0000 }, /* R18364 */ + { 0x0000, 0x0000, 0x0000 }, /* R18365 */ + { 0x0000, 0x0000, 0x0000 }, /* R18366 */ + { 0x0000, 0x0000, 0x0000 }, /* R18367 */ + { 0x0000, 0x0000, 0x0000 }, /* R18368 */ + { 0x0000, 0x0000, 0x0000 }, /* R18369 */ + { 0x0000, 0x0000, 0x0000 }, /* R18370 */ + { 0x0000, 0x0000, 0x0000 }, /* R18371 */ + { 0x0000, 0x0000, 0x0000 }, /* R18372 */ + { 0x0000, 0x0000, 0x0000 }, /* R18373 */ + { 0x0000, 0x0000, 0x0000 }, /* R18374 */ + { 0x0000, 0x0000, 0x0000 }, /* R18375 */ + { 0x0000, 0x0000, 0x0000 }, /* R18376 */ + { 0x0000, 0x0000, 0x0000 }, /* R18377 */ + { 0x0000, 0x0000, 0x0000 }, /* R18378 */ + { 0x0000, 0x0000, 0x0000 }, /* R18379 */ + { 0x0000, 0x0000, 0x0000 }, /* R18380 */ + { 0x0000, 0x0000, 0x0000 }, /* R18381 */ + { 0x0000, 0x0000, 0x0000 }, /* R18382 */ + { 0x0000, 0x0000, 0x0000 }, /* R18383 */ + { 0x0000, 0x0000, 0x0000 }, /* R18384 */ + { 0x0000, 0x0000, 0x0000 }, /* R18385 */ + { 0x0000, 0x0000, 0x0000 }, /* R18386 */ + { 0x0000, 0x0000, 0x0000 }, /* R18387 */ + { 0x0000, 0x0000, 0x0000 }, /* R18388 */ + { 0x0000, 0x0000, 0x0000 }, /* R18389 */ + { 0x0000, 0x0000, 0x0000 }, /* R18390 */ + { 0x0000, 0x0000, 0x0000 }, /* R18391 */ + { 0x0000, 0x0000, 0x0000 }, /* R18392 */ + { 0x0000, 0x0000, 0x0000 }, /* R18393 */ + { 0x0000, 0x0000, 0x0000 }, /* R18394 */ + { 0x0000, 0x0000, 0x0000 }, /* R18395 */ + { 0x0000, 0x0000, 0x0000 }, /* R18396 */ + { 0x0000, 0x0000, 0x0000 }, /* R18397 */ + { 0x0000, 0x0000, 0x0000 }, /* R18398 */ + { 0x0000, 0x0000, 0x0000 }, /* R18399 */ + { 0x0000, 0x0000, 0x0000 }, /* R18400 */ + { 0x0000, 0x0000, 0x0000 }, /* R18401 */ + { 0x0000, 0x0000, 0x0000 }, /* R18402 */ + { 0x0000, 0x0000, 0x0000 }, /* R18403 */ + { 0x0000, 0x0000, 0x0000 }, /* R18404 */ + { 0x0000, 0x0000, 0x0000 }, /* R18405 */ + { 0x0000, 0x0000, 0x0000 }, /* R18406 */ + { 0x0000, 0x0000, 0x0000 }, /* R18407 */ + { 0x0000, 0x0000, 0x0000 }, /* R18408 */ + { 0x0000, 0x0000, 0x0000 }, /* R18409 */ + { 0x0000, 0x0000, 0x0000 }, /* R18410 */ + { 0x0000, 0x0000, 0x0000 }, /* R18411 */ + { 0x0000, 0x0000, 0x0000 }, /* R18412 */ + { 0x0000, 0x0000, 0x0000 }, /* R18413 */ + { 0x0000, 0x0000, 0x0000 }, /* R18414 */ + { 0x0000, 0x0000, 0x0000 }, /* R18415 */ + { 0x0000, 0x0000, 0x0000 }, /* R18416 */ + { 0x0000, 0x0000, 0x0000 }, /* R18417 */ + { 0x0000, 0x0000, 0x0000 }, /* R18418 */ + { 0x0000, 0x0000, 0x0000 }, /* R18419 */ + { 0x0000, 0x0000, 0x0000 }, /* R18420 */ + { 0x0000, 0x0000, 0x0000 }, /* R18421 */ + { 0x0000, 0x0000, 0x0000 }, /* R18422 */ + { 0x0000, 0x0000, 0x0000 }, /* R18423 */ + { 0x0000, 0x0000, 0x0000 }, /* R18424 */ + { 0x0000, 0x0000, 0x0000 }, /* R18425 */ + { 0x0000, 0x0000, 0x0000 }, /* R18426 */ + { 0x0000, 0x0000, 0x0000 }, /* R18427 */ + { 0x0000, 0x0000, 0x0000 }, /* R18428 */ + { 0x0000, 0x0000, 0x0000 }, /* R18429 */ + { 0x0000, 0x0000, 0x0000 }, /* R18430 */ + { 0x0000, 0x0000, 0x0000 }, /* R18431 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18432 - RETUNEADC_PG2_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18433 - RETUNEADC_PG2_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18434 - RETUNEADC_PG_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18435 - RETUNEADC_PG_0 */ + { 0x0000, 0x0000, 0x0000 }, /* R18436 */ + { 0x0000, 0x0000, 0x0000 }, /* R18437 */ + { 0x0000, 0x0000, 0x0000 }, /* R18438 */ + { 0x0000, 0x0000, 0x0000 }, /* R18439 */ + { 0x0000, 0x0000, 0x0000 }, /* R18440 */ + { 0x0000, 0x0000, 0x0000 }, /* R18441 */ + { 0x0000, 0x0000, 0x0000 }, /* R18442 */ + { 0x0000, 0x0000, 0x0000 }, /* R18443 */ + { 0x0000, 0x0000, 0x0000 }, /* R18444 */ + { 0x0000, 0x0000, 0x0000 }, /* R18445 */ + { 0x0000, 0x0000, 0x0000 }, /* R18446 */ + { 0x0000, 0x0000, 0x0000 }, /* R18447 */ + { 0x0000, 0x0000, 0x0000 }, /* R18448 */ + { 0x0000, 0x0000, 0x0000 }, /* R18449 */ + { 0x0000, 0x0000, 0x0000 }, /* R18450 */ + { 0x0000, 0x0000, 0x0000 }, /* R18451 */ + { 0x0000, 0x0000, 0x0000 }, /* R18452 */ + { 0x0000, 0x0000, 0x0000 }, /* R18453 */ + { 0x0000, 0x0000, 0x0000 }, /* R18454 */ + { 0x0000, 0x0000, 0x0000 }, /* R18455 */ + { 0x0000, 0x0000, 0x0000 }, /* R18456 */ + { 0x0000, 0x0000, 0x0000 }, /* R18457 */ + { 0x0000, 0x0000, 0x0000 }, /* R18458 */ + { 0x0000, 0x0000, 0x0000 }, /* R18459 */ + { 0x0000, 0x0000, 0x0000 }, /* R18460 */ + { 0x0000, 0x0000, 0x0000 }, /* R18461 */ + { 0x0000, 0x0000, 0x0000 }, /* R18462 */ + { 0x0000, 0x0000, 0x0000 }, /* R18463 */ + { 0x0000, 0x0000, 0x0000 }, /* R18464 */ + { 0x0000, 0x0000, 0x0000 }, /* R18465 */ + { 0x0000, 0x0000, 0x0000 }, /* R18466 */ + { 0x0000, 0x0000, 0x0000 }, /* R18467 */ + { 0x0000, 0x0000, 0x0000 }, /* R18468 */ + { 0x0000, 0x0000, 0x0000 }, /* R18469 */ + { 0x0000, 0x0000, 0x0000 }, /* R18470 */ + { 0x0000, 0x0000, 0x0000 }, /* R18471 */ + { 0x0000, 0x0000, 0x0000 }, /* R18472 */ + { 0x0000, 0x0000, 0x0000 }, /* R18473 */ + { 0x0000, 0x0000, 0x0000 }, /* R18474 */ + { 0x0000, 0x0000, 0x0000 }, /* R18475 */ + { 0x0000, 0x0000, 0x0000 }, /* R18476 */ + { 0x0000, 0x0000, 0x0000 }, /* R18477 */ + { 0x0000, 0x0000, 0x0000 }, /* R18478 */ + { 0x0000, 0x0000, 0x0000 }, /* R18479 */ + { 0x0000, 0x0000, 0x0000 }, /* R18480 */ + { 0x0000, 0x0000, 0x0000 }, /* R18481 */ + { 0x0000, 0x0000, 0x0000 }, /* R18482 */ + { 0x0000, 0x0000, 0x0000 }, /* R18483 */ + { 0x0000, 0x0000, 0x0000 }, /* R18484 */ + { 0x0000, 0x0000, 0x0000 }, /* R18485 */ + { 0x0000, 0x0000, 0x0000 }, /* R18486 */ + { 0x0000, 0x0000, 0x0000 }, /* R18487 */ + { 0x0000, 0x0000, 0x0000 }, /* R18488 */ + { 0x0000, 0x0000, 0x0000 }, /* R18489 */ + { 0x0000, 0x0000, 0x0000 }, /* R18490 */ + { 0x0000, 0x0000, 0x0000 }, /* R18491 */ + { 0x0000, 0x0000, 0x0000 }, /* R18492 */ + { 0x0000, 0x0000, 0x0000 }, /* R18493 */ + { 0x0000, 0x0000, 0x0000 }, /* R18494 */ + { 0x0000, 0x0000, 0x0000 }, /* R18495 */ + { 0x0000, 0x0000, 0x0000 }, /* R18496 */ + { 0x0000, 0x0000, 0x0000 }, /* R18497 */ + { 0x0000, 0x0000, 0x0000 }, /* R18498 */ + { 0x0000, 0x0000, 0x0000 }, /* R18499 */ + { 0x0000, 0x0000, 0x0000 }, /* R18500 */ + { 0x0000, 0x0000, 0x0000 }, /* R18501 */ + { 0x0000, 0x0000, 0x0000 }, /* R18502 */ + { 0x0000, 0x0000, 0x0000 }, /* R18503 */ + { 0x0000, 0x0000, 0x0000 }, /* R18504 */ + { 0x0000, 0x0000, 0x0000 }, /* R18505 */ + { 0x0000, 0x0000, 0x0000 }, /* R18506 */ + { 0x0000, 0x0000, 0x0000 }, /* R18507 */ + { 0x0000, 0x0000, 0x0000 }, /* R18508 */ + { 0x0000, 0x0000, 0x0000 }, /* R18509 */ + { 0x0000, 0x0000, 0x0000 }, /* R18510 */ + { 0x0000, 0x0000, 0x0000 }, /* R18511 */ + { 0x0000, 0x0000, 0x0000 }, /* R18512 */ + { 0x0000, 0x0000, 0x0000 }, /* R18513 */ + { 0x0000, 0x0000, 0x0000 }, /* R18514 */ + { 0x0000, 0x0000, 0x0000 }, /* R18515 */ + { 0x0000, 0x0000, 0x0000 }, /* R18516 */ + { 0x0000, 0x0000, 0x0000 }, /* R18517 */ + { 0x0000, 0x0000, 0x0000 }, /* R18518 */ + { 0x0000, 0x0000, 0x0000 }, /* R18519 */ + { 0x0000, 0x0000, 0x0000 }, /* R18520 */ + { 0x0000, 0x0000, 0x0000 }, /* R18521 */ + { 0x0000, 0x0000, 0x0000 }, /* R18522 */ + { 0x0000, 0x0000, 0x0000 }, /* R18523 */ + { 0x0000, 0x0000, 0x0000 }, /* R18524 */ + { 0x0000, 0x0000, 0x0000 }, /* R18525 */ + { 0x0000, 0x0000, 0x0000 }, /* R18526 */ + { 0x0000, 0x0000, 0x0000 }, /* R18527 */ + { 0x0000, 0x0000, 0x0000 }, /* R18528 */ + { 0x0000, 0x0000, 0x0000 }, /* R18529 */ + { 0x0000, 0x0000, 0x0000 }, /* R18530 */ + { 0x0000, 0x0000, 0x0000 }, /* R18531 */ + { 0x0000, 0x0000, 0x0000 }, /* R18532 */ + { 0x0000, 0x0000, 0x0000 }, /* R18533 */ + { 0x0000, 0x0000, 0x0000 }, /* R18534 */ + { 0x0000, 0x0000, 0x0000 }, /* R18535 */ + { 0x0000, 0x0000, 0x0000 }, /* R18536 */ + { 0x0000, 0x0000, 0x0000 }, /* R18537 */ + { 0x0000, 0x0000, 0x0000 }, /* R18538 */ + { 0x0000, 0x0000, 0x0000 }, /* R18539 */ + { 0x0000, 0x0000, 0x0000 }, /* R18540 */ + { 0x0000, 0x0000, 0x0000 }, /* R18541 */ + { 0x0000, 0x0000, 0x0000 }, /* R18542 */ + { 0x0000, 0x0000, 0x0000 }, /* R18543 */ + { 0x0000, 0x0000, 0x0000 }, /* R18544 */ + { 0x0000, 0x0000, 0x0000 }, /* R18545 */ + { 0x0000, 0x0000, 0x0000 }, /* R18546 */ + { 0x0000, 0x0000, 0x0000 }, /* R18547 */ + { 0x0000, 0x0000, 0x0000 }, /* R18548 */ + { 0x0000, 0x0000, 0x0000 }, /* R18549 */ + { 0x0000, 0x0000, 0x0000 }, /* R18550 */ + { 0x0000, 0x0000, 0x0000 }, /* R18551 */ + { 0x0000, 0x0000, 0x0000 }, /* R18552 */ + { 0x0000, 0x0000, 0x0000 }, /* R18553 */ + { 0x0000, 0x0000, 0x0000 }, /* R18554 */ + { 0x0000, 0x0000, 0x0000 }, /* R18555 */ + { 0x0000, 0x0000, 0x0000 }, /* R18556 */ + { 0x0000, 0x0000, 0x0000 }, /* R18557 */ + { 0x0000, 0x0000, 0x0000 }, /* R18558 */ + { 0x0000, 0x0000, 0x0000 }, /* R18559 */ + { 0x0000, 0x0000, 0x0000 }, /* R18560 */ + { 0x0000, 0x0000, 0x0000 }, /* R18561 */ + { 0x0000, 0x0000, 0x0000 }, /* R18562 */ + { 0x0000, 0x0000, 0x0000 }, /* R18563 */ + { 0x0000, 0x0000, 0x0000 }, /* R18564 */ + { 0x0000, 0x0000, 0x0000 }, /* R18565 */ + { 0x0000, 0x0000, 0x0000 }, /* R18566 */ + { 0x0000, 0x0000, 0x0000 }, /* R18567 */ + { 0x0000, 0x0000, 0x0000 }, /* R18568 */ + { 0x0000, 0x0000, 0x0000 }, /* R18569 */ + { 0x0000, 0x0000, 0x0000 }, /* R18570 */ + { 0x0000, 0x0000, 0x0000 }, /* R18571 */ + { 0x0000, 0x0000, 0x0000 }, /* R18572 */ + { 0x0000, 0x0000, 0x0000 }, /* R18573 */ + { 0x0000, 0x0000, 0x0000 }, /* R18574 */ + { 0x0000, 0x0000, 0x0000 }, /* R18575 */ + { 0x0000, 0x0000, 0x0000 }, /* R18576 */ + { 0x0000, 0x0000, 0x0000 }, /* R18577 */ + { 0x0000, 0x0000, 0x0000 }, /* R18578 */ + { 0x0000, 0x0000, 0x0000 }, /* R18579 */ + { 0x0000, 0x0000, 0x0000 }, /* R18580 */ + { 0x0000, 0x0000, 0x0000 }, /* R18581 */ + { 0x0000, 0x0000, 0x0000 }, /* R18582 */ + { 0x0000, 0x0000, 0x0000 }, /* R18583 */ + { 0x0000, 0x0000, 0x0000 }, /* R18584 */ + { 0x0000, 0x0000, 0x0000 }, /* R18585 */ + { 0x0000, 0x0000, 0x0000 }, /* R18586 */ + { 0x0000, 0x0000, 0x0000 }, /* R18587 */ + { 0x0000, 0x0000, 0x0000 }, /* R18588 */ + { 0x0000, 0x0000, 0x0000 }, /* R18589 */ + { 0x0000, 0x0000, 0x0000 }, /* R18590 */ + { 0x0000, 0x0000, 0x0000 }, /* R18591 */ + { 0x0000, 0x0000, 0x0000 }, /* R18592 */ + { 0x0000, 0x0000, 0x0000 }, /* R18593 */ + { 0x0000, 0x0000, 0x0000 }, /* R18594 */ + { 0x0000, 0x0000, 0x0000 }, /* R18595 */ + { 0x0000, 0x0000, 0x0000 }, /* R18596 */ + { 0x0000, 0x0000, 0x0000 }, /* R18597 */ + { 0x0000, 0x0000, 0x0000 }, /* R18598 */ + { 0x0000, 0x0000, 0x0000 }, /* R18599 */ + { 0x0000, 0x0000, 0x0000 }, /* R18600 */ + { 0x0000, 0x0000, 0x0000 }, /* R18601 */ + { 0x0000, 0x0000, 0x0000 }, /* R18602 */ + { 0x0000, 0x0000, 0x0000 }, /* R18603 */ + { 0x0000, 0x0000, 0x0000 }, /* R18604 */ + { 0x0000, 0x0000, 0x0000 }, /* R18605 */ + { 0x0000, 0x0000, 0x0000 }, /* R18606 */ + { 0x0000, 0x0000, 0x0000 }, /* R18607 */ + { 0x0000, 0x0000, 0x0000 }, /* R18608 */ + { 0x0000, 0x0000, 0x0000 }, /* R18609 */ + { 0x0000, 0x0000, 0x0000 }, /* R18610 */ + { 0x0000, 0x0000, 0x0000 }, /* R18611 */ + { 0x0000, 0x0000, 0x0000 }, /* R18612 */ + { 0x0000, 0x0000, 0x0000 }, /* R18613 */ + { 0x0000, 0x0000, 0x0000 }, /* R18614 */ + { 0x0000, 0x0000, 0x0000 }, /* R18615 */ + { 0x0000, 0x0000, 0x0000 }, /* R18616 */ + { 0x0000, 0x0000, 0x0000 }, /* R18617 */ + { 0x0000, 0x0000, 0x0000 }, /* R18618 */ + { 0x0000, 0x0000, 0x0000 }, /* R18619 */ + { 0x0000, 0x0000, 0x0000 }, /* R18620 */ + { 0x0000, 0x0000, 0x0000 }, /* R18621 */ + { 0x0000, 0x0000, 0x0000 }, /* R18622 */ + { 0x0000, 0x0000, 0x0000 }, /* R18623 */ + { 0x0000, 0x0000, 0x0000 }, /* R18624 */ + { 0x0000, 0x0000, 0x0000 }, /* R18625 */ + { 0x0000, 0x0000, 0x0000 }, /* R18626 */ + { 0x0000, 0x0000, 0x0000 }, /* R18627 */ + { 0x0000, 0x0000, 0x0000 }, /* R18628 */ + { 0x0000, 0x0000, 0x0000 }, /* R18629 */ + { 0x0000, 0x0000, 0x0000 }, /* R18630 */ + { 0x0000, 0x0000, 0x0000 }, /* R18631 */ + { 0x0000, 0x0000, 0x0000 }, /* R18632 */ + { 0x0000, 0x0000, 0x0000 }, /* R18633 */ + { 0x0000, 0x0000, 0x0000 }, /* R18634 */ + { 0x0000, 0x0000, 0x0000 }, /* R18635 */ + { 0x0000, 0x0000, 0x0000 }, /* R18636 */ + { 0x0000, 0x0000, 0x0000 }, /* R18637 */ + { 0x0000, 0x0000, 0x0000 }, /* R18638 */ + { 0x0000, 0x0000, 0x0000 }, /* R18639 */ + { 0x0000, 0x0000, 0x0000 }, /* R18640 */ + { 0x0000, 0x0000, 0x0000 }, /* R18641 */ + { 0x0000, 0x0000, 0x0000 }, /* R18642 */ + { 0x0000, 0x0000, 0x0000 }, /* R18643 */ + { 0x0000, 0x0000, 0x0000 }, /* R18644 */ + { 0x0000, 0x0000, 0x0000 }, /* R18645 */ + { 0x0000, 0x0000, 0x0000 }, /* R18646 */ + { 0x0000, 0x0000, 0x0000 }, /* R18647 */ + { 0x0000, 0x0000, 0x0000 }, /* R18648 */ + { 0x0000, 0x0000, 0x0000 }, /* R18649 */ + { 0x0000, 0x0000, 0x0000 }, /* R18650 */ + { 0x0000, 0x0000, 0x0000 }, /* R18651 */ + { 0x0000, 0x0000, 0x0000 }, /* R18652 */ + { 0x0000, 0x0000, 0x0000 }, /* R18653 */ + { 0x0000, 0x0000, 0x0000 }, /* R18654 */ + { 0x0000, 0x0000, 0x0000 }, /* R18655 */ + { 0x0000, 0x0000, 0x0000 }, /* R18656 */ + { 0x0000, 0x0000, 0x0000 }, /* R18657 */ + { 0x0000, 0x0000, 0x0000 }, /* R18658 */ + { 0x0000, 0x0000, 0x0000 }, /* R18659 */ + { 0x0000, 0x0000, 0x0000 }, /* R18660 */ + { 0x0000, 0x0000, 0x0000 }, /* R18661 */ + { 0x0000, 0x0000, 0x0000 }, /* R18662 */ + { 0x0000, 0x0000, 0x0000 }, /* R18663 */ + { 0x0000, 0x0000, 0x0000 }, /* R18664 */ + { 0x0000, 0x0000, 0x0000 }, /* R18665 */ + { 0x0000, 0x0000, 0x0000 }, /* R18666 */ + { 0x0000, 0x0000, 0x0000 }, /* R18667 */ + { 0x0000, 0x0000, 0x0000 }, /* R18668 */ + { 0x0000, 0x0000, 0x0000 }, /* R18669 */ + { 0x0000, 0x0000, 0x0000 }, /* R18670 */ + { 0x0000, 0x0000, 0x0000 }, /* R18671 */ + { 0x0000, 0x0000, 0x0000 }, /* R18672 */ + { 0x0000, 0x0000, 0x0000 }, /* R18673 */ + { 0x0000, 0x0000, 0x0000 }, /* R18674 */ + { 0x0000, 0x0000, 0x0000 }, /* R18675 */ + { 0x0000, 0x0000, 0x0000 }, /* R18676 */ + { 0x0000, 0x0000, 0x0000 }, /* R18677 */ + { 0x0000, 0x0000, 0x0000 }, /* R18678 */ + { 0x0000, 0x0000, 0x0000 }, /* R18679 */ + { 0x0000, 0x0000, 0x0000 }, /* R18680 */ + { 0x0000, 0x0000, 0x0000 }, /* R18681 */ + { 0x0000, 0x0000, 0x0000 }, /* R18682 */ + { 0x0000, 0x0000, 0x0000 }, /* R18683 */ + { 0x0000, 0x0000, 0x0000 }, /* R18684 */ + { 0x0000, 0x0000, 0x0000 }, /* R18685 */ + { 0x0000, 0x0000, 0x0000 }, /* R18686 */ + { 0x0000, 0x0000, 0x0000 }, /* R18687 */ + { 0x0000, 0x0000, 0x0000 }, /* R18688 */ + { 0x0000, 0x0000, 0x0000 }, /* R18689 */ + { 0x0000, 0x0000, 0x0000 }, /* R18690 */ + { 0x0000, 0x0000, 0x0000 }, /* R18691 */ + { 0x0000, 0x0000, 0x0000 }, /* R18692 */ + { 0x0000, 0x0000, 0x0000 }, /* R18693 */ + { 0x0000, 0x0000, 0x0000 }, /* R18694 */ + { 0x0000, 0x0000, 0x0000 }, /* R18695 */ + { 0x0000, 0x0000, 0x0000 }, /* R18696 */ + { 0x0000, 0x0000, 0x0000 }, /* R18697 */ + { 0x0000, 0x0000, 0x0000 }, /* R18698 */ + { 0x0000, 0x0000, 0x0000 }, /* R18699 */ + { 0x0000, 0x0000, 0x0000 }, /* R18700 */ + { 0x0000, 0x0000, 0x0000 }, /* R18701 */ + { 0x0000, 0x0000, 0x0000 }, /* R18702 */ + { 0x0000, 0x0000, 0x0000 }, /* R18703 */ + { 0x0000, 0x0000, 0x0000 }, /* R18704 */ + { 0x0000, 0x0000, 0x0000 }, /* R18705 */ + { 0x0000, 0x0000, 0x0000 }, /* R18706 */ + { 0x0000, 0x0000, 0x0000 }, /* R18707 */ + { 0x0000, 0x0000, 0x0000 }, /* R18708 */ + { 0x0000, 0x0000, 0x0000 }, /* R18709 */ + { 0x0000, 0x0000, 0x0000 }, /* R18710 */ + { 0x0000, 0x0000, 0x0000 }, /* R18711 */ + { 0x0000, 0x0000, 0x0000 }, /* R18712 */ + { 0x0000, 0x0000, 0x0000 }, /* R18713 */ + { 0x0000, 0x0000, 0x0000 }, /* R18714 */ + { 0x0000, 0x0000, 0x0000 }, /* R18715 */ + { 0x0000, 0x0000, 0x0000 }, /* R18716 */ + { 0x0000, 0x0000, 0x0000 }, /* R18717 */ + { 0x0000, 0x0000, 0x0000 }, /* R18718 */ + { 0x0000, 0x0000, 0x0000 }, /* R18719 */ + { 0x0000, 0x0000, 0x0000 }, /* R18720 */ + { 0x0000, 0x0000, 0x0000 }, /* R18721 */ + { 0x0000, 0x0000, 0x0000 }, /* R18722 */ + { 0x0000, 0x0000, 0x0000 }, /* R18723 */ + { 0x0000, 0x0000, 0x0000 }, /* R18724 */ + { 0x0000, 0x0000, 0x0000 }, /* R18725 */ + { 0x0000, 0x0000, 0x0000 }, /* R18726 */ + { 0x0000, 0x0000, 0x0000 }, /* R18727 */ + { 0x0000, 0x0000, 0x0000 }, /* R18728 */ + { 0x0000, 0x0000, 0x0000 }, /* R18729 */ + { 0x0000, 0x0000, 0x0000 }, /* R18730 */ + { 0x0000, 0x0000, 0x0000 }, /* R18731 */ + { 0x0000, 0x0000, 0x0000 }, /* R18732 */ + { 0x0000, 0x0000, 0x0000 }, /* R18733 */ + { 0x0000, 0x0000, 0x0000 }, /* R18734 */ + { 0x0000, 0x0000, 0x0000 }, /* R18735 */ + { 0x0000, 0x0000, 0x0000 }, /* R18736 */ + { 0x0000, 0x0000, 0x0000 }, /* R18737 */ + { 0x0000, 0x0000, 0x0000 }, /* R18738 */ + { 0x0000, 0x0000, 0x0000 }, /* R18739 */ + { 0x0000, 0x0000, 0x0000 }, /* R18740 */ + { 0x0000, 0x0000, 0x0000 }, /* R18741 */ + { 0x0000, 0x0000, 0x0000 }, /* R18742 */ + { 0x0000, 0x0000, 0x0000 }, /* R18743 */ + { 0x0000, 0x0000, 0x0000 }, /* R18744 */ + { 0x0000, 0x0000, 0x0000 }, /* R18745 */ + { 0x0000, 0x0000, 0x0000 }, /* R18746 */ + { 0x0000, 0x0000, 0x0000 }, /* R18747 */ + { 0x0000, 0x0000, 0x0000 }, /* R18748 */ + { 0x0000, 0x0000, 0x0000 }, /* R18749 */ + { 0x0000, 0x0000, 0x0000 }, /* R18750 */ + { 0x0000, 0x0000, 0x0000 }, /* R18751 */ + { 0x0000, 0x0000, 0x0000 }, /* R18752 */ + { 0x0000, 0x0000, 0x0000 }, /* R18753 */ + { 0x0000, 0x0000, 0x0000 }, /* R18754 */ + { 0x0000, 0x0000, 0x0000 }, /* R18755 */ + { 0x0000, 0x0000, 0x0000 }, /* R18756 */ + { 0x0000, 0x0000, 0x0000 }, /* R18757 */ + { 0x0000, 0x0000, 0x0000 }, /* R18758 */ + { 0x0000, 0x0000, 0x0000 }, /* R18759 */ + { 0x0000, 0x0000, 0x0000 }, /* R18760 */ + { 0x0000, 0x0000, 0x0000 }, /* R18761 */ + { 0x0000, 0x0000, 0x0000 }, /* R18762 */ + { 0x0000, 0x0000, 0x0000 }, /* R18763 */ + { 0x0000, 0x0000, 0x0000 }, /* R18764 */ + { 0x0000, 0x0000, 0x0000 }, /* R18765 */ + { 0x0000, 0x0000, 0x0000 }, /* R18766 */ + { 0x0000, 0x0000, 0x0000 }, /* R18767 */ + { 0x0000, 0x0000, 0x0000 }, /* R18768 */ + { 0x0000, 0x0000, 0x0000 }, /* R18769 */ + { 0x0000, 0x0000, 0x0000 }, /* R18770 */ + { 0x0000, 0x0000, 0x0000 }, /* R18771 */ + { 0x0000, 0x0000, 0x0000 }, /* R18772 */ + { 0x0000, 0x0000, 0x0000 }, /* R18773 */ + { 0x0000, 0x0000, 0x0000 }, /* R18774 */ + { 0x0000, 0x0000, 0x0000 }, /* R18775 */ + { 0x0000, 0x0000, 0x0000 }, /* R18776 */ + { 0x0000, 0x0000, 0x0000 }, /* R18777 */ + { 0x0000, 0x0000, 0x0000 }, /* R18778 */ + { 0x0000, 0x0000, 0x0000 }, /* R18779 */ + { 0x0000, 0x0000, 0x0000 }, /* R18780 */ + { 0x0000, 0x0000, 0x0000 }, /* R18781 */ + { 0x0000, 0x0000, 0x0000 }, /* R18782 */ + { 0x0000, 0x0000, 0x0000 }, /* R18783 */ + { 0x0000, 0x0000, 0x0000 }, /* R18784 */ + { 0x0000, 0x0000, 0x0000 }, /* R18785 */ + { 0x0000, 0x0000, 0x0000 }, /* R18786 */ + { 0x0000, 0x0000, 0x0000 }, /* R18787 */ + { 0x0000, 0x0000, 0x0000 }, /* R18788 */ + { 0x0000, 0x0000, 0x0000 }, /* R18789 */ + { 0x0000, 0x0000, 0x0000 }, /* R18790 */ + { 0x0000, 0x0000, 0x0000 }, /* R18791 */ + { 0x0000, 0x0000, 0x0000 }, /* R18792 */ + { 0x0000, 0x0000, 0x0000 }, /* R18793 */ + { 0x0000, 0x0000, 0x0000 }, /* R18794 */ + { 0x0000, 0x0000, 0x0000 }, /* R18795 */ + { 0x0000, 0x0000, 0x0000 }, /* R18796 */ + { 0x0000, 0x0000, 0x0000 }, /* R18797 */ + { 0x0000, 0x0000, 0x0000 }, /* R18798 */ + { 0x0000, 0x0000, 0x0000 }, /* R18799 */ + { 0x0000, 0x0000, 0x0000 }, /* R18800 */ + { 0x0000, 0x0000, 0x0000 }, /* R18801 */ + { 0x0000, 0x0000, 0x0000 }, /* R18802 */ + { 0x0000, 0x0000, 0x0000 }, /* R18803 */ + { 0x0000, 0x0000, 0x0000 }, /* R18804 */ + { 0x0000, 0x0000, 0x0000 }, /* R18805 */ + { 0x0000, 0x0000, 0x0000 }, /* R18806 */ + { 0x0000, 0x0000, 0x0000 }, /* R18807 */ + { 0x0000, 0x0000, 0x0000 }, /* R18808 */ + { 0x0000, 0x0000, 0x0000 }, /* R18809 */ + { 0x0000, 0x0000, 0x0000 }, /* R18810 */ + { 0x0000, 0x0000, 0x0000 }, /* R18811 */ + { 0x0000, 0x0000, 0x0000 }, /* R18812 */ + { 0x0000, 0x0000, 0x0000 }, /* R18813 */ + { 0x0000, 0x0000, 0x0000 }, /* R18814 */ + { 0x0000, 0x0000, 0x0000 }, /* R18815 */ + { 0x0000, 0x0000, 0x0000 }, /* R18816 */ + { 0x0000, 0x0000, 0x0000 }, /* R18817 */ + { 0x0000, 0x0000, 0x0000 }, /* R18818 */ + { 0x0000, 0x0000, 0x0000 }, /* R18819 */ + { 0x0000, 0x0000, 0x0000 }, /* R18820 */ + { 0x0000, 0x0000, 0x0000 }, /* R18821 */ + { 0x0000, 0x0000, 0x0000 }, /* R18822 */ + { 0x0000, 0x0000, 0x0000 }, /* R18823 */ + { 0x0000, 0x0000, 0x0000 }, /* R18824 */ + { 0x0000, 0x0000, 0x0000 }, /* R18825 */ + { 0x0000, 0x0000, 0x0000 }, /* R18826 */ + { 0x0000, 0x0000, 0x0000 }, /* R18827 */ + { 0x0000, 0x0000, 0x0000 }, /* R18828 */ + { 0x0000, 0x0000, 0x0000 }, /* R18829 */ + { 0x0000, 0x0000, 0x0000 }, /* R18830 */ + { 0x0000, 0x0000, 0x0000 }, /* R18831 */ + { 0x0000, 0x0000, 0x0000 }, /* R18832 */ + { 0x0000, 0x0000, 0x0000 }, /* R18833 */ + { 0x0000, 0x0000, 0x0000 }, /* R18834 */ + { 0x0000, 0x0000, 0x0000 }, /* R18835 */ + { 0x0000, 0x0000, 0x0000 }, /* R18836 */ + { 0x0000, 0x0000, 0x0000 }, /* R18837 */ + { 0x0000, 0x0000, 0x0000 }, /* R18838 */ + { 0x0000, 0x0000, 0x0000 }, /* R18839 */ + { 0x0000, 0x0000, 0x0000 }, /* R18840 */ + { 0x0000, 0x0000, 0x0000 }, /* R18841 */ + { 0x0000, 0x0000, 0x0000 }, /* R18842 */ + { 0x0000, 0x0000, 0x0000 }, /* R18843 */ + { 0x0000, 0x0000, 0x0000 }, /* R18844 */ + { 0x0000, 0x0000, 0x0000 }, /* R18845 */ + { 0x0000, 0x0000, 0x0000 }, /* R18846 */ + { 0x0000, 0x0000, 0x0000 }, /* R18847 */ + { 0x0000, 0x0000, 0x0000 }, /* R18848 */ + { 0x0000, 0x0000, 0x0000 }, /* R18849 */ + { 0x0000, 0x0000, 0x0000 }, /* R18850 */ + { 0x0000, 0x0000, 0x0000 }, /* R18851 */ + { 0x0000, 0x0000, 0x0000 }, /* R18852 */ + { 0x0000, 0x0000, 0x0000 }, /* R18853 */ + { 0x0000, 0x0000, 0x0000 }, /* R18854 */ + { 0x0000, 0x0000, 0x0000 }, /* R18855 */ + { 0x0000, 0x0000, 0x0000 }, /* R18856 */ + { 0x0000, 0x0000, 0x0000 }, /* R18857 */ + { 0x0000, 0x0000, 0x0000 }, /* R18858 */ + { 0x0000, 0x0000, 0x0000 }, /* R18859 */ + { 0x0000, 0x0000, 0x0000 }, /* R18860 */ + { 0x0000, 0x0000, 0x0000 }, /* R18861 */ + { 0x0000, 0x0000, 0x0000 }, /* R18862 */ + { 0x0000, 0x0000, 0x0000 }, /* R18863 */ + { 0x0000, 0x0000, 0x0000 }, /* R18864 */ + { 0x0000, 0x0000, 0x0000 }, /* R18865 */ + { 0x0000, 0x0000, 0x0000 }, /* R18866 */ + { 0x0000, 0x0000, 0x0000 }, /* R18867 */ + { 0x0000, 0x0000, 0x0000 }, /* R18868 */ + { 0x0000, 0x0000, 0x0000 }, /* R18869 */ + { 0x0000, 0x0000, 0x0000 }, /* R18870 */ + { 0x0000, 0x0000, 0x0000 }, /* R18871 */ + { 0x0000, 0x0000, 0x0000 }, /* R18872 */ + { 0x0000, 0x0000, 0x0000 }, /* R18873 */ + { 0x0000, 0x0000, 0x0000 }, /* R18874 */ + { 0x0000, 0x0000, 0x0000 }, /* R18875 */ + { 0x0000, 0x0000, 0x0000 }, /* R18876 */ + { 0x0000, 0x0000, 0x0000 }, /* R18877 */ + { 0x0000, 0x0000, 0x0000 }, /* R18878 */ + { 0x0000, 0x0000, 0x0000 }, /* R18879 */ + { 0x0000, 0x0000, 0x0000 }, /* R18880 */ + { 0x0000, 0x0000, 0x0000 }, /* R18881 */ + { 0x0000, 0x0000, 0x0000 }, /* R18882 */ + { 0x0000, 0x0000, 0x0000 }, /* R18883 */ + { 0x0000, 0x0000, 0x0000 }, /* R18884 */ + { 0x0000, 0x0000, 0x0000 }, /* R18885 */ + { 0x0000, 0x0000, 0x0000 }, /* R18886 */ + { 0x0000, 0x0000, 0x0000 }, /* R18887 */ + { 0x0000, 0x0000, 0x0000 }, /* R18888 */ + { 0x0000, 0x0000, 0x0000 }, /* R18889 */ + { 0x0000, 0x0000, 0x0000 }, /* R18890 */ + { 0x0000, 0x0000, 0x0000 }, /* R18891 */ + { 0x0000, 0x0000, 0x0000 }, /* R18892 */ + { 0x0000, 0x0000, 0x0000 }, /* R18893 */ + { 0x0000, 0x0000, 0x0000 }, /* R18894 */ + { 0x0000, 0x0000, 0x0000 }, /* R18895 */ + { 0x0000, 0x0000, 0x0000 }, /* R18896 */ + { 0x0000, 0x0000, 0x0000 }, /* R18897 */ + { 0x0000, 0x0000, 0x0000 }, /* R18898 */ + { 0x0000, 0x0000, 0x0000 }, /* R18899 */ + { 0x0000, 0x0000, 0x0000 }, /* R18900 */ + { 0x0000, 0x0000, 0x0000 }, /* R18901 */ + { 0x0000, 0x0000, 0x0000 }, /* R18902 */ + { 0x0000, 0x0000, 0x0000 }, /* R18903 */ + { 0x0000, 0x0000, 0x0000 }, /* R18904 */ + { 0x0000, 0x0000, 0x0000 }, /* R18905 */ + { 0x0000, 0x0000, 0x0000 }, /* R18906 */ + { 0x0000, 0x0000, 0x0000 }, /* R18907 */ + { 0x0000, 0x0000, 0x0000 }, /* R18908 */ + { 0x0000, 0x0000, 0x0000 }, /* R18909 */ + { 0x0000, 0x0000, 0x0000 }, /* R18910 */ + { 0x0000, 0x0000, 0x0000 }, /* R18911 */ + { 0x0000, 0x0000, 0x0000 }, /* R18912 */ + { 0x0000, 0x0000, 0x0000 }, /* R18913 */ + { 0x0000, 0x0000, 0x0000 }, /* R18914 */ + { 0x0000, 0x0000, 0x0000 }, /* R18915 */ + { 0x0000, 0x0000, 0x0000 }, /* R18916 */ + { 0x0000, 0x0000, 0x0000 }, /* R18917 */ + { 0x0000, 0x0000, 0x0000 }, /* R18918 */ + { 0x0000, 0x0000, 0x0000 }, /* R18919 */ + { 0x0000, 0x0000, 0x0000 }, /* R18920 */ + { 0x0000, 0x0000, 0x0000 }, /* R18921 */ + { 0x0000, 0x0000, 0x0000 }, /* R18922 */ + { 0x0000, 0x0000, 0x0000 }, /* R18923 */ + { 0x0000, 0x0000, 0x0000 }, /* R18924 */ + { 0x0000, 0x0000, 0x0000 }, /* R18925 */ + { 0x0000, 0x0000, 0x0000 }, /* R18926 */ + { 0x0000, 0x0000, 0x0000 }, /* R18927 */ + { 0x0000, 0x0000, 0x0000 }, /* R18928 */ + { 0x0000, 0x0000, 0x0000 }, /* R18929 */ + { 0x0000, 0x0000, 0x0000 }, /* R18930 */ + { 0x0000, 0x0000, 0x0000 }, /* R18931 */ + { 0x0000, 0x0000, 0x0000 }, /* R18932 */ + { 0x0000, 0x0000, 0x0000 }, /* R18933 */ + { 0x0000, 0x0000, 0x0000 }, /* R18934 */ + { 0x0000, 0x0000, 0x0000 }, /* R18935 */ + { 0x0000, 0x0000, 0x0000 }, /* R18936 */ + { 0x0000, 0x0000, 0x0000 }, /* R18937 */ + { 0x0000, 0x0000, 0x0000 }, /* R18938 */ + { 0x0000, 0x0000, 0x0000 }, /* R18939 */ + { 0x0000, 0x0000, 0x0000 }, /* R18940 */ + { 0x0000, 0x0000, 0x0000 }, /* R18941 */ + { 0x0000, 0x0000, 0x0000 }, /* R18942 */ + { 0x0000, 0x0000, 0x0000 }, /* R18943 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18944 - ADCR_RETUNE_C1_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18945 - ADCR_RETUNE_C1_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18946 - ADCR_RETUNE_C2_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18947 - ADCR_RETUNE_C2_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18948 - ADCR_RETUNE_C3_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18949 - ADCR_RETUNE_C3_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18950 - ADCR_RETUNE_C4_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18951 - ADCR_RETUNE_C4_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18952 - ADCR_RETUNE_C5_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18953 - ADCR_RETUNE_C5_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18954 - ADCR_RETUNE_C6_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18955 - ADCR_RETUNE_C6_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18956 - ADCR_RETUNE_C7_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18957 - ADCR_RETUNE_C7_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18958 - ADCR_RETUNE_C8_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18959 - ADCR_RETUNE_C8_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18960 - ADCR_RETUNE_C9_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18961 - ADCR_RETUNE_C9_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18962 - ADCR_RETUNE_C10_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18963 - ADCR_RETUNE_C10_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18964 - ADCR_RETUNE_C11_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18965 - ADCR_RETUNE_C11_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18966 - ADCR_RETUNE_C12_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18967 - ADCR_RETUNE_C12_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18968 - ADCR_RETUNE_C13_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18969 - ADCR_RETUNE_C13_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18970 - ADCR_RETUNE_C14_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18971 - ADCR_RETUNE_C14_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18972 - ADCR_RETUNE_C15_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18973 - ADCR_RETUNE_C15_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18974 - ADCR_RETUNE_C16_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18975 - ADCR_RETUNE_C16_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18976 - ADCR_RETUNE_C17_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18977 - ADCR_RETUNE_C17_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18978 - ADCR_RETUNE_C18_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18979 - ADCR_RETUNE_C18_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18980 - ADCR_RETUNE_C19_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18981 - ADCR_RETUNE_C19_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18982 - ADCR_RETUNE_C20_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18983 - ADCR_RETUNE_C20_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18984 - ADCR_RETUNE_C21_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18985 - ADCR_RETUNE_C21_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18986 - ADCR_RETUNE_C22_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18987 - ADCR_RETUNE_C22_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18988 - ADCR_RETUNE_C23_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18989 - ADCR_RETUNE_C23_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18990 - ADCR_RETUNE_C24_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18991 - ADCR_RETUNE_C24_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18992 - ADCR_RETUNE_C25_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18993 - ADCR_RETUNE_C25_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18994 - ADCR_RETUNE_C26_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18995 - ADCR_RETUNE_C26_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18996 - ADCR_RETUNE_C27_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18997 - ADCR_RETUNE_C27_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R18998 - ADCR_RETUNE_C28_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R18999 - ADCR_RETUNE_C28_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19000 - ADCR_RETUNE_C29_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19001 - ADCR_RETUNE_C29_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19002 - ADCR_RETUNE_C30_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19003 - ADCR_RETUNE_C30_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19004 - ADCR_RETUNE_C31_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19005 - ADCR_RETUNE_C31_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19006 - ADCR_RETUNE_C32_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19007 - ADCR_RETUNE_C32_0 */ + { 0x0000, 0x0000, 0x0000 }, /* R19008 */ + { 0x0000, 0x0000, 0x0000 }, /* R19009 */ + { 0x0000, 0x0000, 0x0000 }, /* R19010 */ + { 0x0000, 0x0000, 0x0000 }, /* R19011 */ + { 0x0000, 0x0000, 0x0000 }, /* R19012 */ + { 0x0000, 0x0000, 0x0000 }, /* R19013 */ + { 0x0000, 0x0000, 0x0000 }, /* R19014 */ + { 0x0000, 0x0000, 0x0000 }, /* R19015 */ + { 0x0000, 0x0000, 0x0000 }, /* R19016 */ + { 0x0000, 0x0000, 0x0000 }, /* R19017 */ + { 0x0000, 0x0000, 0x0000 }, /* R19018 */ + { 0x0000, 0x0000, 0x0000 }, /* R19019 */ + { 0x0000, 0x0000, 0x0000 }, /* R19020 */ + { 0x0000, 0x0000, 0x0000 }, /* R19021 */ + { 0x0000, 0x0000, 0x0000 }, /* R19022 */ + { 0x0000, 0x0000, 0x0000 }, /* R19023 */ + { 0x0000, 0x0000, 0x0000 }, /* R19024 */ + { 0x0000, 0x0000, 0x0000 }, /* R19025 */ + { 0x0000, 0x0000, 0x0000 }, /* R19026 */ + { 0x0000, 0x0000, 0x0000 }, /* R19027 */ + { 0x0000, 0x0000, 0x0000 }, /* R19028 */ + { 0x0000, 0x0000, 0x0000 }, /* R19029 */ + { 0x0000, 0x0000, 0x0000 }, /* R19030 */ + { 0x0000, 0x0000, 0x0000 }, /* R19031 */ + { 0x0000, 0x0000, 0x0000 }, /* R19032 */ + { 0x0000, 0x0000, 0x0000 }, /* R19033 */ + { 0x0000, 0x0000, 0x0000 }, /* R19034 */ + { 0x0000, 0x0000, 0x0000 }, /* R19035 */ + { 0x0000, 0x0000, 0x0000 }, /* R19036 */ + { 0x0000, 0x0000, 0x0000 }, /* R19037 */ + { 0x0000, 0x0000, 0x0000 }, /* R19038 */ + { 0x0000, 0x0000, 0x0000 }, /* R19039 */ + { 0x0000, 0x0000, 0x0000 }, /* R19040 */ + { 0x0000, 0x0000, 0x0000 }, /* R19041 */ + { 0x0000, 0x0000, 0x0000 }, /* R19042 */ + { 0x0000, 0x0000, 0x0000 }, /* R19043 */ + { 0x0000, 0x0000, 0x0000 }, /* R19044 */ + { 0x0000, 0x0000, 0x0000 }, /* R19045 */ + { 0x0000, 0x0000, 0x0000 }, /* R19046 */ + { 0x0000, 0x0000, 0x0000 }, /* R19047 */ + { 0x0000, 0x0000, 0x0000 }, /* R19048 */ + { 0x0000, 0x0000, 0x0000 }, /* R19049 */ + { 0x0000, 0x0000, 0x0000 }, /* R19050 */ + { 0x0000, 0x0000, 0x0000 }, /* R19051 */ + { 0x0000, 0x0000, 0x0000 }, /* R19052 */ + { 0x0000, 0x0000, 0x0000 }, /* R19053 */ + { 0x0000, 0x0000, 0x0000 }, /* R19054 */ + { 0x0000, 0x0000, 0x0000 }, /* R19055 */ + { 0x0000, 0x0000, 0x0000 }, /* R19056 */ + { 0x0000, 0x0000, 0x0000 }, /* R19057 */ + { 0x0000, 0x0000, 0x0000 }, /* R19058 */ + { 0x0000, 0x0000, 0x0000 }, /* R19059 */ + { 0x0000, 0x0000, 0x0000 }, /* R19060 */ + { 0x0000, 0x0000, 0x0000 }, /* R19061 */ + { 0x0000, 0x0000, 0x0000 }, /* R19062 */ + { 0x0000, 0x0000, 0x0000 }, /* R19063 */ + { 0x0000, 0x0000, 0x0000 }, /* R19064 */ + { 0x0000, 0x0000, 0x0000 }, /* R19065 */ + { 0x0000, 0x0000, 0x0000 }, /* R19066 */ + { 0x0000, 0x0000, 0x0000 }, /* R19067 */ + { 0x0000, 0x0000, 0x0000 }, /* R19068 */ + { 0x0000, 0x0000, 0x0000 }, /* R19069 */ + { 0x0000, 0x0000, 0x0000 }, /* R19070 */ + { 0x0000, 0x0000, 0x0000 }, /* R19071 */ + { 0x0000, 0x0000, 0x0000 }, /* R19072 */ + { 0x0000, 0x0000, 0x0000 }, /* R19073 */ + { 0x0000, 0x0000, 0x0000 }, /* R19074 */ + { 0x0000, 0x0000, 0x0000 }, /* R19075 */ + { 0x0000, 0x0000, 0x0000 }, /* R19076 */ + { 0x0000, 0x0000, 0x0000 }, /* R19077 */ + { 0x0000, 0x0000, 0x0000 }, /* R19078 */ + { 0x0000, 0x0000, 0x0000 }, /* R19079 */ + { 0x0000, 0x0000, 0x0000 }, /* R19080 */ + { 0x0000, 0x0000, 0x0000 }, /* R19081 */ + { 0x0000, 0x0000, 0x0000 }, /* R19082 */ + { 0x0000, 0x0000, 0x0000 }, /* R19083 */ + { 0x0000, 0x0000, 0x0000 }, /* R19084 */ + { 0x0000, 0x0000, 0x0000 }, /* R19085 */ + { 0x0000, 0x0000, 0x0000 }, /* R19086 */ + { 0x0000, 0x0000, 0x0000 }, /* R19087 */ + { 0x0000, 0x0000, 0x0000 }, /* R19088 */ + { 0x0000, 0x0000, 0x0000 }, /* R19089 */ + { 0x0000, 0x0000, 0x0000 }, /* R19090 */ + { 0x0000, 0x0000, 0x0000 }, /* R19091 */ + { 0x0000, 0x0000, 0x0000 }, /* R19092 */ + { 0x0000, 0x0000, 0x0000 }, /* R19093 */ + { 0x0000, 0x0000, 0x0000 }, /* R19094 */ + { 0x0000, 0x0000, 0x0000 }, /* R19095 */ + { 0x0000, 0x0000, 0x0000 }, /* R19096 */ + { 0x0000, 0x0000, 0x0000 }, /* R19097 */ + { 0x0000, 0x0000, 0x0000 }, /* R19098 */ + { 0x0000, 0x0000, 0x0000 }, /* R19099 */ + { 0x0000, 0x0000, 0x0000 }, /* R19100 */ + { 0x0000, 0x0000, 0x0000 }, /* R19101 */ + { 0x0000, 0x0000, 0x0000 }, /* R19102 */ + { 0x0000, 0x0000, 0x0000 }, /* R19103 */ + { 0x0000, 0x0000, 0x0000 }, /* R19104 */ + { 0x0000, 0x0000, 0x0000 }, /* R19105 */ + { 0x0000, 0x0000, 0x0000 }, /* R19106 */ + { 0x0000, 0x0000, 0x0000 }, /* R19107 */ + { 0x0000, 0x0000, 0x0000 }, /* R19108 */ + { 0x0000, 0x0000, 0x0000 }, /* R19109 */ + { 0x0000, 0x0000, 0x0000 }, /* R19110 */ + { 0x0000, 0x0000, 0x0000 }, /* R19111 */ + { 0x0000, 0x0000, 0x0000 }, /* R19112 */ + { 0x0000, 0x0000, 0x0000 }, /* R19113 */ + { 0x0000, 0x0000, 0x0000 }, /* R19114 */ + { 0x0000, 0x0000, 0x0000 }, /* R19115 */ + { 0x0000, 0x0000, 0x0000 }, /* R19116 */ + { 0x0000, 0x0000, 0x0000 }, /* R19117 */ + { 0x0000, 0x0000, 0x0000 }, /* R19118 */ + { 0x0000, 0x0000, 0x0000 }, /* R19119 */ + { 0x0000, 0x0000, 0x0000 }, /* R19120 */ + { 0x0000, 0x0000, 0x0000 }, /* R19121 */ + { 0x0000, 0x0000, 0x0000 }, /* R19122 */ + { 0x0000, 0x0000, 0x0000 }, /* R19123 */ + { 0x0000, 0x0000, 0x0000 }, /* R19124 */ + { 0x0000, 0x0000, 0x0000 }, /* R19125 */ + { 0x0000, 0x0000, 0x0000 }, /* R19126 */ + { 0x0000, 0x0000, 0x0000 }, /* R19127 */ + { 0x0000, 0x0000, 0x0000 }, /* R19128 */ + { 0x0000, 0x0000, 0x0000 }, /* R19129 */ + { 0x0000, 0x0000, 0x0000 }, /* R19130 */ + { 0x0000, 0x0000, 0x0000 }, /* R19131 */ + { 0x0000, 0x0000, 0x0000 }, /* R19132 */ + { 0x0000, 0x0000, 0x0000 }, /* R19133 */ + { 0x0000, 0x0000, 0x0000 }, /* R19134 */ + { 0x0000, 0x0000, 0x0000 }, /* R19135 */ + { 0x0000, 0x0000, 0x0000 }, /* R19136 */ + { 0x0000, 0x0000, 0x0000 }, /* R19137 */ + { 0x0000, 0x0000, 0x0000 }, /* R19138 */ + { 0x0000, 0x0000, 0x0000 }, /* R19139 */ + { 0x0000, 0x0000, 0x0000 }, /* R19140 */ + { 0x0000, 0x0000, 0x0000 }, /* R19141 */ + { 0x0000, 0x0000, 0x0000 }, /* R19142 */ + { 0x0000, 0x0000, 0x0000 }, /* R19143 */ + { 0x0000, 0x0000, 0x0000 }, /* R19144 */ + { 0x0000, 0x0000, 0x0000 }, /* R19145 */ + { 0x0000, 0x0000, 0x0000 }, /* R19146 */ + { 0x0000, 0x0000, 0x0000 }, /* R19147 */ + { 0x0000, 0x0000, 0x0000 }, /* R19148 */ + { 0x0000, 0x0000, 0x0000 }, /* R19149 */ + { 0x0000, 0x0000, 0x0000 }, /* R19150 */ + { 0x0000, 0x0000, 0x0000 }, /* R19151 */ + { 0x0000, 0x0000, 0x0000 }, /* R19152 */ + { 0x0000, 0x0000, 0x0000 }, /* R19153 */ + { 0x0000, 0x0000, 0x0000 }, /* R19154 */ + { 0x0000, 0x0000, 0x0000 }, /* R19155 */ + { 0x0000, 0x0000, 0x0000 }, /* R19156 */ + { 0x0000, 0x0000, 0x0000 }, /* R19157 */ + { 0x0000, 0x0000, 0x0000 }, /* R19158 */ + { 0x0000, 0x0000, 0x0000 }, /* R19159 */ + { 0x0000, 0x0000, 0x0000 }, /* R19160 */ + { 0x0000, 0x0000, 0x0000 }, /* R19161 */ + { 0x0000, 0x0000, 0x0000 }, /* R19162 */ + { 0x0000, 0x0000, 0x0000 }, /* R19163 */ + { 0x0000, 0x0000, 0x0000 }, /* R19164 */ + { 0x0000, 0x0000, 0x0000 }, /* R19165 */ + { 0x0000, 0x0000, 0x0000 }, /* R19166 */ + { 0x0000, 0x0000, 0x0000 }, /* R19167 */ + { 0x0000, 0x0000, 0x0000 }, /* R19168 */ + { 0x0000, 0x0000, 0x0000 }, /* R19169 */ + { 0x0000, 0x0000, 0x0000 }, /* R19170 */ + { 0x0000, 0x0000, 0x0000 }, /* R19171 */ + { 0x0000, 0x0000, 0x0000 }, /* R19172 */ + { 0x0000, 0x0000, 0x0000 }, /* R19173 */ + { 0x0000, 0x0000, 0x0000 }, /* R19174 */ + { 0x0000, 0x0000, 0x0000 }, /* R19175 */ + { 0x0000, 0x0000, 0x0000 }, /* R19176 */ + { 0x0000, 0x0000, 0x0000 }, /* R19177 */ + { 0x0000, 0x0000, 0x0000 }, /* R19178 */ + { 0x0000, 0x0000, 0x0000 }, /* R19179 */ + { 0x0000, 0x0000, 0x0000 }, /* R19180 */ + { 0x0000, 0x0000, 0x0000 }, /* R19181 */ + { 0x0000, 0x0000, 0x0000 }, /* R19182 */ + { 0x0000, 0x0000, 0x0000 }, /* R19183 */ + { 0x0000, 0x0000, 0x0000 }, /* R19184 */ + { 0x0000, 0x0000, 0x0000 }, /* R19185 */ + { 0x0000, 0x0000, 0x0000 }, /* R19186 */ + { 0x0000, 0x0000, 0x0000 }, /* R19187 */ + { 0x0000, 0x0000, 0x0000 }, /* R19188 */ + { 0x0000, 0x0000, 0x0000 }, /* R19189 */ + { 0x0000, 0x0000, 0x0000 }, /* R19190 */ + { 0x0000, 0x0000, 0x0000 }, /* R19191 */ + { 0x0000, 0x0000, 0x0000 }, /* R19192 */ + { 0x0000, 0x0000, 0x0000 }, /* R19193 */ + { 0x0000, 0x0000, 0x0000 }, /* R19194 */ + { 0x0000, 0x0000, 0x0000 }, /* R19195 */ + { 0x0000, 0x0000, 0x0000 }, /* R19196 */ + { 0x0000, 0x0000, 0x0000 }, /* R19197 */ + { 0x0000, 0x0000, 0x0000 }, /* R19198 */ + { 0x0000, 0x0000, 0x0000 }, /* R19199 */ + { 0x0000, 0x0000, 0x0000 }, /* R19200 */ + { 0x0000, 0x0000, 0x0000 }, /* R19201 */ + { 0x0000, 0x0000, 0x0000 }, /* R19202 */ + { 0x0000, 0x0000, 0x0000 }, /* R19203 */ + { 0x0000, 0x0000, 0x0000 }, /* R19204 */ + { 0x0000, 0x0000, 0x0000 }, /* R19205 */ + { 0x0000, 0x0000, 0x0000 }, /* R19206 */ + { 0x0000, 0x0000, 0x0000 }, /* R19207 */ + { 0x0000, 0x0000, 0x0000 }, /* R19208 */ + { 0x0000, 0x0000, 0x0000 }, /* R19209 */ + { 0x0000, 0x0000, 0x0000 }, /* R19210 */ + { 0x0000, 0x0000, 0x0000 }, /* R19211 */ + { 0x0000, 0x0000, 0x0000 }, /* R19212 */ + { 0x0000, 0x0000, 0x0000 }, /* R19213 */ + { 0x0000, 0x0000, 0x0000 }, /* R19214 */ + { 0x0000, 0x0000, 0x0000 }, /* R19215 */ + { 0x0000, 0x0000, 0x0000 }, /* R19216 */ + { 0x0000, 0x0000, 0x0000 }, /* R19217 */ + { 0x0000, 0x0000, 0x0000 }, /* R19218 */ + { 0x0000, 0x0000, 0x0000 }, /* R19219 */ + { 0x0000, 0x0000, 0x0000 }, /* R19220 */ + { 0x0000, 0x0000, 0x0000 }, /* R19221 */ + { 0x0000, 0x0000, 0x0000 }, /* R19222 */ + { 0x0000, 0x0000, 0x0000 }, /* R19223 */ + { 0x0000, 0x0000, 0x0000 }, /* R19224 */ + { 0x0000, 0x0000, 0x0000 }, /* R19225 */ + { 0x0000, 0x0000, 0x0000 }, /* R19226 */ + { 0x0000, 0x0000, 0x0000 }, /* R19227 */ + { 0x0000, 0x0000, 0x0000 }, /* R19228 */ + { 0x0000, 0x0000, 0x0000 }, /* R19229 */ + { 0x0000, 0x0000, 0x0000 }, /* R19230 */ + { 0x0000, 0x0000, 0x0000 }, /* R19231 */ + { 0x0000, 0x0000, 0x0000 }, /* R19232 */ + { 0x0000, 0x0000, 0x0000 }, /* R19233 */ + { 0x0000, 0x0000, 0x0000 }, /* R19234 */ + { 0x0000, 0x0000, 0x0000 }, /* R19235 */ + { 0x0000, 0x0000, 0x0000 }, /* R19236 */ + { 0x0000, 0x0000, 0x0000 }, /* R19237 */ + { 0x0000, 0x0000, 0x0000 }, /* R19238 */ + { 0x0000, 0x0000, 0x0000 }, /* R19239 */ + { 0x0000, 0x0000, 0x0000 }, /* R19240 */ + { 0x0000, 0x0000, 0x0000 }, /* R19241 */ + { 0x0000, 0x0000, 0x0000 }, /* R19242 */ + { 0x0000, 0x0000, 0x0000 }, /* R19243 */ + { 0x0000, 0x0000, 0x0000 }, /* R19244 */ + { 0x0000, 0x0000, 0x0000 }, /* R19245 */ + { 0x0000, 0x0000, 0x0000 }, /* R19246 */ + { 0x0000, 0x0000, 0x0000 }, /* R19247 */ + { 0x0000, 0x0000, 0x0000 }, /* R19248 */ + { 0x0000, 0x0000, 0x0000 }, /* R19249 */ + { 0x0000, 0x0000, 0x0000 }, /* R19250 */ + { 0x0000, 0x0000, 0x0000 }, /* R19251 */ + { 0x0000, 0x0000, 0x0000 }, /* R19252 */ + { 0x0000, 0x0000, 0x0000 }, /* R19253 */ + { 0x0000, 0x0000, 0x0000 }, /* R19254 */ + { 0x0000, 0x0000, 0x0000 }, /* R19255 */ + { 0x0000, 0x0000, 0x0000 }, /* R19256 */ + { 0x0000, 0x0000, 0x0000 }, /* R19257 */ + { 0x0000, 0x0000, 0x0000 }, /* R19258 */ + { 0x0000, 0x0000, 0x0000 }, /* R19259 */ + { 0x0000, 0x0000, 0x0000 }, /* R19260 */ + { 0x0000, 0x0000, 0x0000 }, /* R19261 */ + { 0x0000, 0x0000, 0x0000 }, /* R19262 */ + { 0x0000, 0x0000, 0x0000 }, /* R19263 */ + { 0x0000, 0x0000, 0x0000 }, /* R19264 */ + { 0x0000, 0x0000, 0x0000 }, /* R19265 */ + { 0x0000, 0x0000, 0x0000 }, /* R19266 */ + { 0x0000, 0x0000, 0x0000 }, /* R19267 */ + { 0x0000, 0x0000, 0x0000 }, /* R19268 */ + { 0x0000, 0x0000, 0x0000 }, /* R19269 */ + { 0x0000, 0x0000, 0x0000 }, /* R19270 */ + { 0x0000, 0x0000, 0x0000 }, /* R19271 */ + { 0x0000, 0x0000, 0x0000 }, /* R19272 */ + { 0x0000, 0x0000, 0x0000 }, /* R19273 */ + { 0x0000, 0x0000, 0x0000 }, /* R19274 */ + { 0x0000, 0x0000, 0x0000 }, /* R19275 */ + { 0x0000, 0x0000, 0x0000 }, /* R19276 */ + { 0x0000, 0x0000, 0x0000 }, /* R19277 */ + { 0x0000, 0x0000, 0x0000 }, /* R19278 */ + { 0x0000, 0x0000, 0x0000 }, /* R19279 */ + { 0x0000, 0x0000, 0x0000 }, /* R19280 */ + { 0x0000, 0x0000, 0x0000 }, /* R19281 */ + { 0x0000, 0x0000, 0x0000 }, /* R19282 */ + { 0x0000, 0x0000, 0x0000 }, /* R19283 */ + { 0x0000, 0x0000, 0x0000 }, /* R19284 */ + { 0x0000, 0x0000, 0x0000 }, /* R19285 */ + { 0x0000, 0x0000, 0x0000 }, /* R19286 */ + { 0x0000, 0x0000, 0x0000 }, /* R19287 */ + { 0x0000, 0x0000, 0x0000 }, /* R19288 */ + { 0x0000, 0x0000, 0x0000 }, /* R19289 */ + { 0x0000, 0x0000, 0x0000 }, /* R19290 */ + { 0x0000, 0x0000, 0x0000 }, /* R19291 */ + { 0x0000, 0x0000, 0x0000 }, /* R19292 */ + { 0x0000, 0x0000, 0x0000 }, /* R19293 */ + { 0x0000, 0x0000, 0x0000 }, /* R19294 */ + { 0x0000, 0x0000, 0x0000 }, /* R19295 */ + { 0x0000, 0x0000, 0x0000 }, /* R19296 */ + { 0x0000, 0x0000, 0x0000 }, /* R19297 */ + { 0x0000, 0x0000, 0x0000 }, /* R19298 */ + { 0x0000, 0x0000, 0x0000 }, /* R19299 */ + { 0x0000, 0x0000, 0x0000 }, /* R19300 */ + { 0x0000, 0x0000, 0x0000 }, /* R19301 */ + { 0x0000, 0x0000, 0x0000 }, /* R19302 */ + { 0x0000, 0x0000, 0x0000 }, /* R19303 */ + { 0x0000, 0x0000, 0x0000 }, /* R19304 */ + { 0x0000, 0x0000, 0x0000 }, /* R19305 */ + { 0x0000, 0x0000, 0x0000 }, /* R19306 */ + { 0x0000, 0x0000, 0x0000 }, /* R19307 */ + { 0x0000, 0x0000, 0x0000 }, /* R19308 */ + { 0x0000, 0x0000, 0x0000 }, /* R19309 */ + { 0x0000, 0x0000, 0x0000 }, /* R19310 */ + { 0x0000, 0x0000, 0x0000 }, /* R19311 */ + { 0x0000, 0x0000, 0x0000 }, /* R19312 */ + { 0x0000, 0x0000, 0x0000 }, /* R19313 */ + { 0x0000, 0x0000, 0x0000 }, /* R19314 */ + { 0x0000, 0x0000, 0x0000 }, /* R19315 */ + { 0x0000, 0x0000, 0x0000 }, /* R19316 */ + { 0x0000, 0x0000, 0x0000 }, /* R19317 */ + { 0x0000, 0x0000, 0x0000 }, /* R19318 */ + { 0x0000, 0x0000, 0x0000 }, /* R19319 */ + { 0x0000, 0x0000, 0x0000 }, /* R19320 */ + { 0x0000, 0x0000, 0x0000 }, /* R19321 */ + { 0x0000, 0x0000, 0x0000 }, /* R19322 */ + { 0x0000, 0x0000, 0x0000 }, /* R19323 */ + { 0x0000, 0x0000, 0x0000 }, /* R19324 */ + { 0x0000, 0x0000, 0x0000 }, /* R19325 */ + { 0x0000, 0x0000, 0x0000 }, /* R19326 */ + { 0x0000, 0x0000, 0x0000 }, /* R19327 */ + { 0x0000, 0x0000, 0x0000 }, /* R19328 */ + { 0x0000, 0x0000, 0x0000 }, /* R19329 */ + { 0x0000, 0x0000, 0x0000 }, /* R19330 */ + { 0x0000, 0x0000, 0x0000 }, /* R19331 */ + { 0x0000, 0x0000, 0x0000 }, /* R19332 */ + { 0x0000, 0x0000, 0x0000 }, /* R19333 */ + { 0x0000, 0x0000, 0x0000 }, /* R19334 */ + { 0x0000, 0x0000, 0x0000 }, /* R19335 */ + { 0x0000, 0x0000, 0x0000 }, /* R19336 */ + { 0x0000, 0x0000, 0x0000 }, /* R19337 */ + { 0x0000, 0x0000, 0x0000 }, /* R19338 */ + { 0x0000, 0x0000, 0x0000 }, /* R19339 */ + { 0x0000, 0x0000, 0x0000 }, /* R19340 */ + { 0x0000, 0x0000, 0x0000 }, /* R19341 */ + { 0x0000, 0x0000, 0x0000 }, /* R19342 */ + { 0x0000, 0x0000, 0x0000 }, /* R19343 */ + { 0x0000, 0x0000, 0x0000 }, /* R19344 */ + { 0x0000, 0x0000, 0x0000 }, /* R19345 */ + { 0x0000, 0x0000, 0x0000 }, /* R19346 */ + { 0x0000, 0x0000, 0x0000 }, /* R19347 */ + { 0x0000, 0x0000, 0x0000 }, /* R19348 */ + { 0x0000, 0x0000, 0x0000 }, /* R19349 */ + { 0x0000, 0x0000, 0x0000 }, /* R19350 */ + { 0x0000, 0x0000, 0x0000 }, /* R19351 */ + { 0x0000, 0x0000, 0x0000 }, /* R19352 */ + { 0x0000, 0x0000, 0x0000 }, /* R19353 */ + { 0x0000, 0x0000, 0x0000 }, /* R19354 */ + { 0x0000, 0x0000, 0x0000 }, /* R19355 */ + { 0x0000, 0x0000, 0x0000 }, /* R19356 */ + { 0x0000, 0x0000, 0x0000 }, /* R19357 */ + { 0x0000, 0x0000, 0x0000 }, /* R19358 */ + { 0x0000, 0x0000, 0x0000 }, /* R19359 */ + { 0x0000, 0x0000, 0x0000 }, /* R19360 */ + { 0x0000, 0x0000, 0x0000 }, /* R19361 */ + { 0x0000, 0x0000, 0x0000 }, /* R19362 */ + { 0x0000, 0x0000, 0x0000 }, /* R19363 */ + { 0x0000, 0x0000, 0x0000 }, /* R19364 */ + { 0x0000, 0x0000, 0x0000 }, /* R19365 */ + { 0x0000, 0x0000, 0x0000 }, /* R19366 */ + { 0x0000, 0x0000, 0x0000 }, /* R19367 */ + { 0x0000, 0x0000, 0x0000 }, /* R19368 */ + { 0x0000, 0x0000, 0x0000 }, /* R19369 */ + { 0x0000, 0x0000, 0x0000 }, /* R19370 */ + { 0x0000, 0x0000, 0x0000 }, /* R19371 */ + { 0x0000, 0x0000, 0x0000 }, /* R19372 */ + { 0x0000, 0x0000, 0x0000 }, /* R19373 */ + { 0x0000, 0x0000, 0x0000 }, /* R19374 */ + { 0x0000, 0x0000, 0x0000 }, /* R19375 */ + { 0x0000, 0x0000, 0x0000 }, /* R19376 */ + { 0x0000, 0x0000, 0x0000 }, /* R19377 */ + { 0x0000, 0x0000, 0x0000 }, /* R19378 */ + { 0x0000, 0x0000, 0x0000 }, /* R19379 */ + { 0x0000, 0x0000, 0x0000 }, /* R19380 */ + { 0x0000, 0x0000, 0x0000 }, /* R19381 */ + { 0x0000, 0x0000, 0x0000 }, /* R19382 */ + { 0x0000, 0x0000, 0x0000 }, /* R19383 */ + { 0x0000, 0x0000, 0x0000 }, /* R19384 */ + { 0x0000, 0x0000, 0x0000 }, /* R19385 */ + { 0x0000, 0x0000, 0x0000 }, /* R19386 */ + { 0x0000, 0x0000, 0x0000 }, /* R19387 */ + { 0x0000, 0x0000, 0x0000 }, /* R19388 */ + { 0x0000, 0x0000, 0x0000 }, /* R19389 */ + { 0x0000, 0x0000, 0x0000 }, /* R19390 */ + { 0x0000, 0x0000, 0x0000 }, /* R19391 */ + { 0x0000, 0x0000, 0x0000 }, /* R19392 */ + { 0x0000, 0x0000, 0x0000 }, /* R19393 */ + { 0x0000, 0x0000, 0x0000 }, /* R19394 */ + { 0x0000, 0x0000, 0x0000 }, /* R19395 */ + { 0x0000, 0x0000, 0x0000 }, /* R19396 */ + { 0x0000, 0x0000, 0x0000 }, /* R19397 */ + { 0x0000, 0x0000, 0x0000 }, /* R19398 */ + { 0x0000, 0x0000, 0x0000 }, /* R19399 */ + { 0x0000, 0x0000, 0x0000 }, /* R19400 */ + { 0x0000, 0x0000, 0x0000 }, /* R19401 */ + { 0x0000, 0x0000, 0x0000 }, /* R19402 */ + { 0x0000, 0x0000, 0x0000 }, /* R19403 */ + { 0x0000, 0x0000, 0x0000 }, /* R19404 */ + { 0x0000, 0x0000, 0x0000 }, /* R19405 */ + { 0x0000, 0x0000, 0x0000 }, /* R19406 */ + { 0x0000, 0x0000, 0x0000 }, /* R19407 */ + { 0x0000, 0x0000, 0x0000 }, /* R19408 */ + { 0x0000, 0x0000, 0x0000 }, /* R19409 */ + { 0x0000, 0x0000, 0x0000 }, /* R19410 */ + { 0x0000, 0x0000, 0x0000 }, /* R19411 */ + { 0x0000, 0x0000, 0x0000 }, /* R19412 */ + { 0x0000, 0x0000, 0x0000 }, /* R19413 */ + { 0x0000, 0x0000, 0x0000 }, /* R19414 */ + { 0x0000, 0x0000, 0x0000 }, /* R19415 */ + { 0x0000, 0x0000, 0x0000 }, /* R19416 */ + { 0x0000, 0x0000, 0x0000 }, /* R19417 */ + { 0x0000, 0x0000, 0x0000 }, /* R19418 */ + { 0x0000, 0x0000, 0x0000 }, /* R19419 */ + { 0x0000, 0x0000, 0x0000 }, /* R19420 */ + { 0x0000, 0x0000, 0x0000 }, /* R19421 */ + { 0x0000, 0x0000, 0x0000 }, /* R19422 */ + { 0x0000, 0x0000, 0x0000 }, /* R19423 */ + { 0x0000, 0x0000, 0x0000 }, /* R19424 */ + { 0x0000, 0x0000, 0x0000 }, /* R19425 */ + { 0x0000, 0x0000, 0x0000 }, /* R19426 */ + { 0x0000, 0x0000, 0x0000 }, /* R19427 */ + { 0x0000, 0x0000, 0x0000 }, /* R19428 */ + { 0x0000, 0x0000, 0x0000 }, /* R19429 */ + { 0x0000, 0x0000, 0x0000 }, /* R19430 */ + { 0x0000, 0x0000, 0x0000 }, /* R19431 */ + { 0x0000, 0x0000, 0x0000 }, /* R19432 */ + { 0x0000, 0x0000, 0x0000 }, /* R19433 */ + { 0x0000, 0x0000, 0x0000 }, /* R19434 */ + { 0x0000, 0x0000, 0x0000 }, /* R19435 */ + { 0x0000, 0x0000, 0x0000 }, /* R19436 */ + { 0x0000, 0x0000, 0x0000 }, /* R19437 */ + { 0x0000, 0x0000, 0x0000 }, /* R19438 */ + { 0x0000, 0x0000, 0x0000 }, /* R19439 */ + { 0x0000, 0x0000, 0x0000 }, /* R19440 */ + { 0x0000, 0x0000, 0x0000 }, /* R19441 */ + { 0x0000, 0x0000, 0x0000 }, /* R19442 */ + { 0x0000, 0x0000, 0x0000 }, /* R19443 */ + { 0x0000, 0x0000, 0x0000 }, /* R19444 */ + { 0x0000, 0x0000, 0x0000 }, /* R19445 */ + { 0x0000, 0x0000, 0x0000 }, /* R19446 */ + { 0x0000, 0x0000, 0x0000 }, /* R19447 */ + { 0x0000, 0x0000, 0x0000 }, /* R19448 */ + { 0x0000, 0x0000, 0x0000 }, /* R19449 */ + { 0x0000, 0x0000, 0x0000 }, /* R19450 */ + { 0x0000, 0x0000, 0x0000 }, /* R19451 */ + { 0x0000, 0x0000, 0x0000 }, /* R19452 */ + { 0x0000, 0x0000, 0x0000 }, /* R19453 */ + { 0x0000, 0x0000, 0x0000 }, /* R19454 */ + { 0x0000, 0x0000, 0x0000 }, /* R19455 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19456 - DACL_RETUNE_C1_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19457 - DACL_RETUNE_C1_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19458 - DACL_RETUNE_C2_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19459 - DACL_RETUNE_C2_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19460 - DACL_RETUNE_C3_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19461 - DACL_RETUNE_C3_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19462 - DACL_RETUNE_C4_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19463 - DACL_RETUNE_C4_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19464 - DACL_RETUNE_C5_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19465 - DACL_RETUNE_C5_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19466 - DACL_RETUNE_C6_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19467 - DACL_RETUNE_C6_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19468 - DACL_RETUNE_C7_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19469 - DACL_RETUNE_C7_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19470 - DACL_RETUNE_C8_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19471 - DACL_RETUNE_C8_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19472 - DACL_RETUNE_C9_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19473 - DACL_RETUNE_C9_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19474 - DACL_RETUNE_C10_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19475 - DACL_RETUNE_C10_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19476 - DACL_RETUNE_C11_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19477 - DACL_RETUNE_C11_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19478 - DACL_RETUNE_C12_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19479 - DACL_RETUNE_C12_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19480 - DACL_RETUNE_C13_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19481 - DACL_RETUNE_C13_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19482 - DACL_RETUNE_C14_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19483 - DACL_RETUNE_C14_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19484 - DACL_RETUNE_C15_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19485 - DACL_RETUNE_C15_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19486 - DACL_RETUNE_C16_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19487 - DACL_RETUNE_C16_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19488 - DACL_RETUNE_C17_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19489 - DACL_RETUNE_C17_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19490 - DACL_RETUNE_C18_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19491 - DACL_RETUNE_C18_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19492 - DACL_RETUNE_C19_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19493 - DACL_RETUNE_C19_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19494 - DACL_RETUNE_C20_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19495 - DACL_RETUNE_C20_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19496 - DACL_RETUNE_C21_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19497 - DACL_RETUNE_C21_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19498 - DACL_RETUNE_C22_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19499 - DACL_RETUNE_C22_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19500 - DACL_RETUNE_C23_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19501 - DACL_RETUNE_C23_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19502 - DACL_RETUNE_C24_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19503 - DACL_RETUNE_C24_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19504 - DACL_RETUNE_C25_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19505 - DACL_RETUNE_C25_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19506 - DACL_RETUNE_C26_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19507 - DACL_RETUNE_C26_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19508 - DACL_RETUNE_C27_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19509 - DACL_RETUNE_C27_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19510 - DACL_RETUNE_C28_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19511 - DACL_RETUNE_C28_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19512 - DACL_RETUNE_C29_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19513 - DACL_RETUNE_C29_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19514 - DACL_RETUNE_C30_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19515 - DACL_RETUNE_C30_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19516 - DACL_RETUNE_C31_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19517 - DACL_RETUNE_C31_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19518 - DACL_RETUNE_C32_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19519 - DACL_RETUNE_C32_0 */ + { 0x0000, 0x0000, 0x0000 }, /* R19520 */ + { 0x0000, 0x0000, 0x0000 }, /* R19521 */ + { 0x0000, 0x0000, 0x0000 }, /* R19522 */ + { 0x0000, 0x0000, 0x0000 }, /* R19523 */ + { 0x0000, 0x0000, 0x0000 }, /* R19524 */ + { 0x0000, 0x0000, 0x0000 }, /* R19525 */ + { 0x0000, 0x0000, 0x0000 }, /* R19526 */ + { 0x0000, 0x0000, 0x0000 }, /* R19527 */ + { 0x0000, 0x0000, 0x0000 }, /* R19528 */ + { 0x0000, 0x0000, 0x0000 }, /* R19529 */ + { 0x0000, 0x0000, 0x0000 }, /* R19530 */ + { 0x0000, 0x0000, 0x0000 }, /* R19531 */ + { 0x0000, 0x0000, 0x0000 }, /* R19532 */ + { 0x0000, 0x0000, 0x0000 }, /* R19533 */ + { 0x0000, 0x0000, 0x0000 }, /* R19534 */ + { 0x0000, 0x0000, 0x0000 }, /* R19535 */ + { 0x0000, 0x0000, 0x0000 }, /* R19536 */ + { 0x0000, 0x0000, 0x0000 }, /* R19537 */ + { 0x0000, 0x0000, 0x0000 }, /* R19538 */ + { 0x0000, 0x0000, 0x0000 }, /* R19539 */ + { 0x0000, 0x0000, 0x0000 }, /* R19540 */ + { 0x0000, 0x0000, 0x0000 }, /* R19541 */ + { 0x0000, 0x0000, 0x0000 }, /* R19542 */ + { 0x0000, 0x0000, 0x0000 }, /* R19543 */ + { 0x0000, 0x0000, 0x0000 }, /* R19544 */ + { 0x0000, 0x0000, 0x0000 }, /* R19545 */ + { 0x0000, 0x0000, 0x0000 }, /* R19546 */ + { 0x0000, 0x0000, 0x0000 }, /* R19547 */ + { 0x0000, 0x0000, 0x0000 }, /* R19548 */ + { 0x0000, 0x0000, 0x0000 }, /* R19549 */ + { 0x0000, 0x0000, 0x0000 }, /* R19550 */ + { 0x0000, 0x0000, 0x0000 }, /* R19551 */ + { 0x0000, 0x0000, 0x0000 }, /* R19552 */ + { 0x0000, 0x0000, 0x0000 }, /* R19553 */ + { 0x0000, 0x0000, 0x0000 }, /* R19554 */ + { 0x0000, 0x0000, 0x0000 }, /* R19555 */ + { 0x0000, 0x0000, 0x0000 }, /* R19556 */ + { 0x0000, 0x0000, 0x0000 }, /* R19557 */ + { 0x0000, 0x0000, 0x0000 }, /* R19558 */ + { 0x0000, 0x0000, 0x0000 }, /* R19559 */ + { 0x0000, 0x0000, 0x0000 }, /* R19560 */ + { 0x0000, 0x0000, 0x0000 }, /* R19561 */ + { 0x0000, 0x0000, 0x0000 }, /* R19562 */ + { 0x0000, 0x0000, 0x0000 }, /* R19563 */ + { 0x0000, 0x0000, 0x0000 }, /* R19564 */ + { 0x0000, 0x0000, 0x0000 }, /* R19565 */ + { 0x0000, 0x0000, 0x0000 }, /* R19566 */ + { 0x0000, 0x0000, 0x0000 }, /* R19567 */ + { 0x0000, 0x0000, 0x0000 }, /* R19568 */ + { 0x0000, 0x0000, 0x0000 }, /* R19569 */ + { 0x0000, 0x0000, 0x0000 }, /* R19570 */ + { 0x0000, 0x0000, 0x0000 }, /* R19571 */ + { 0x0000, 0x0000, 0x0000 }, /* R19572 */ + { 0x0000, 0x0000, 0x0000 }, /* R19573 */ + { 0x0000, 0x0000, 0x0000 }, /* R19574 */ + { 0x0000, 0x0000, 0x0000 }, /* R19575 */ + { 0x0000, 0x0000, 0x0000 }, /* R19576 */ + { 0x0000, 0x0000, 0x0000 }, /* R19577 */ + { 0x0000, 0x0000, 0x0000 }, /* R19578 */ + { 0x0000, 0x0000, 0x0000 }, /* R19579 */ + { 0x0000, 0x0000, 0x0000 }, /* R19580 */ + { 0x0000, 0x0000, 0x0000 }, /* R19581 */ + { 0x0000, 0x0000, 0x0000 }, /* R19582 */ + { 0x0000, 0x0000, 0x0000 }, /* R19583 */ + { 0x0000, 0x0000, 0x0000 }, /* R19584 */ + { 0x0000, 0x0000, 0x0000 }, /* R19585 */ + { 0x0000, 0x0000, 0x0000 }, /* R19586 */ + { 0x0000, 0x0000, 0x0000 }, /* R19587 */ + { 0x0000, 0x0000, 0x0000 }, /* R19588 */ + { 0x0000, 0x0000, 0x0000 }, /* R19589 */ + { 0x0000, 0x0000, 0x0000 }, /* R19590 */ + { 0x0000, 0x0000, 0x0000 }, /* R19591 */ + { 0x0000, 0x0000, 0x0000 }, /* R19592 */ + { 0x0000, 0x0000, 0x0000 }, /* R19593 */ + { 0x0000, 0x0000, 0x0000 }, /* R19594 */ + { 0x0000, 0x0000, 0x0000 }, /* R19595 */ + { 0x0000, 0x0000, 0x0000 }, /* R19596 */ + { 0x0000, 0x0000, 0x0000 }, /* R19597 */ + { 0x0000, 0x0000, 0x0000 }, /* R19598 */ + { 0x0000, 0x0000, 0x0000 }, /* R19599 */ + { 0x0000, 0x0000, 0x0000 }, /* R19600 */ + { 0x0000, 0x0000, 0x0000 }, /* R19601 */ + { 0x0000, 0x0000, 0x0000 }, /* R19602 */ + { 0x0000, 0x0000, 0x0000 }, /* R19603 */ + { 0x0000, 0x0000, 0x0000 }, /* R19604 */ + { 0x0000, 0x0000, 0x0000 }, /* R19605 */ + { 0x0000, 0x0000, 0x0000 }, /* R19606 */ + { 0x0000, 0x0000, 0x0000 }, /* R19607 */ + { 0x0000, 0x0000, 0x0000 }, /* R19608 */ + { 0x0000, 0x0000, 0x0000 }, /* R19609 */ + { 0x0000, 0x0000, 0x0000 }, /* R19610 */ + { 0x0000, 0x0000, 0x0000 }, /* R19611 */ + { 0x0000, 0x0000, 0x0000 }, /* R19612 */ + { 0x0000, 0x0000, 0x0000 }, /* R19613 */ + { 0x0000, 0x0000, 0x0000 }, /* R19614 */ + { 0x0000, 0x0000, 0x0000 }, /* R19615 */ + { 0x0000, 0x0000, 0x0000 }, /* R19616 */ + { 0x0000, 0x0000, 0x0000 }, /* R19617 */ + { 0x0000, 0x0000, 0x0000 }, /* R19618 */ + { 0x0000, 0x0000, 0x0000 }, /* R19619 */ + { 0x0000, 0x0000, 0x0000 }, /* R19620 */ + { 0x0000, 0x0000, 0x0000 }, /* R19621 */ + { 0x0000, 0x0000, 0x0000 }, /* R19622 */ + { 0x0000, 0x0000, 0x0000 }, /* R19623 */ + { 0x0000, 0x0000, 0x0000 }, /* R19624 */ + { 0x0000, 0x0000, 0x0000 }, /* R19625 */ + { 0x0000, 0x0000, 0x0000 }, /* R19626 */ + { 0x0000, 0x0000, 0x0000 }, /* R19627 */ + { 0x0000, 0x0000, 0x0000 }, /* R19628 */ + { 0x0000, 0x0000, 0x0000 }, /* R19629 */ + { 0x0000, 0x0000, 0x0000 }, /* R19630 */ + { 0x0000, 0x0000, 0x0000 }, /* R19631 */ + { 0x0000, 0x0000, 0x0000 }, /* R19632 */ + { 0x0000, 0x0000, 0x0000 }, /* R19633 */ + { 0x0000, 0x0000, 0x0000 }, /* R19634 */ + { 0x0000, 0x0000, 0x0000 }, /* R19635 */ + { 0x0000, 0x0000, 0x0000 }, /* R19636 */ + { 0x0000, 0x0000, 0x0000 }, /* R19637 */ + { 0x0000, 0x0000, 0x0000 }, /* R19638 */ + { 0x0000, 0x0000, 0x0000 }, /* R19639 */ + { 0x0000, 0x0000, 0x0000 }, /* R19640 */ + { 0x0000, 0x0000, 0x0000 }, /* R19641 */ + { 0x0000, 0x0000, 0x0000 }, /* R19642 */ + { 0x0000, 0x0000, 0x0000 }, /* R19643 */ + { 0x0000, 0x0000, 0x0000 }, /* R19644 */ + { 0x0000, 0x0000, 0x0000 }, /* R19645 */ + { 0x0000, 0x0000, 0x0000 }, /* R19646 */ + { 0x0000, 0x0000, 0x0000 }, /* R19647 */ + { 0x0000, 0x0000, 0x0000 }, /* R19648 */ + { 0x0000, 0x0000, 0x0000 }, /* R19649 */ + { 0x0000, 0x0000, 0x0000 }, /* R19650 */ + { 0x0000, 0x0000, 0x0000 }, /* R19651 */ + { 0x0000, 0x0000, 0x0000 }, /* R19652 */ + { 0x0000, 0x0000, 0x0000 }, /* R19653 */ + { 0x0000, 0x0000, 0x0000 }, /* R19654 */ + { 0x0000, 0x0000, 0x0000 }, /* R19655 */ + { 0x0000, 0x0000, 0x0000 }, /* R19656 */ + { 0x0000, 0x0000, 0x0000 }, /* R19657 */ + { 0x0000, 0x0000, 0x0000 }, /* R19658 */ + { 0x0000, 0x0000, 0x0000 }, /* R19659 */ + { 0x0000, 0x0000, 0x0000 }, /* R19660 */ + { 0x0000, 0x0000, 0x0000 }, /* R19661 */ + { 0x0000, 0x0000, 0x0000 }, /* R19662 */ + { 0x0000, 0x0000, 0x0000 }, /* R19663 */ + { 0x0000, 0x0000, 0x0000 }, /* R19664 */ + { 0x0000, 0x0000, 0x0000 }, /* R19665 */ + { 0x0000, 0x0000, 0x0000 }, /* R19666 */ + { 0x0000, 0x0000, 0x0000 }, /* R19667 */ + { 0x0000, 0x0000, 0x0000 }, /* R19668 */ + { 0x0000, 0x0000, 0x0000 }, /* R19669 */ + { 0x0000, 0x0000, 0x0000 }, /* R19670 */ + { 0x0000, 0x0000, 0x0000 }, /* R19671 */ + { 0x0000, 0x0000, 0x0000 }, /* R19672 */ + { 0x0000, 0x0000, 0x0000 }, /* R19673 */ + { 0x0000, 0x0000, 0x0000 }, /* R19674 */ + { 0x0000, 0x0000, 0x0000 }, /* R19675 */ + { 0x0000, 0x0000, 0x0000 }, /* R19676 */ + { 0x0000, 0x0000, 0x0000 }, /* R19677 */ + { 0x0000, 0x0000, 0x0000 }, /* R19678 */ + { 0x0000, 0x0000, 0x0000 }, /* R19679 */ + { 0x0000, 0x0000, 0x0000 }, /* R19680 */ + { 0x0000, 0x0000, 0x0000 }, /* R19681 */ + { 0x0000, 0x0000, 0x0000 }, /* R19682 */ + { 0x0000, 0x0000, 0x0000 }, /* R19683 */ + { 0x0000, 0x0000, 0x0000 }, /* R19684 */ + { 0x0000, 0x0000, 0x0000 }, /* R19685 */ + { 0x0000, 0x0000, 0x0000 }, /* R19686 */ + { 0x0000, 0x0000, 0x0000 }, /* R19687 */ + { 0x0000, 0x0000, 0x0000 }, /* R19688 */ + { 0x0000, 0x0000, 0x0000 }, /* R19689 */ + { 0x0000, 0x0000, 0x0000 }, /* R19690 */ + { 0x0000, 0x0000, 0x0000 }, /* R19691 */ + { 0x0000, 0x0000, 0x0000 }, /* R19692 */ + { 0x0000, 0x0000, 0x0000 }, /* R19693 */ + { 0x0000, 0x0000, 0x0000 }, /* R19694 */ + { 0x0000, 0x0000, 0x0000 }, /* R19695 */ + { 0x0000, 0x0000, 0x0000 }, /* R19696 */ + { 0x0000, 0x0000, 0x0000 }, /* R19697 */ + { 0x0000, 0x0000, 0x0000 }, /* R19698 */ + { 0x0000, 0x0000, 0x0000 }, /* R19699 */ + { 0x0000, 0x0000, 0x0000 }, /* R19700 */ + { 0x0000, 0x0000, 0x0000 }, /* R19701 */ + { 0x0000, 0x0000, 0x0000 }, /* R19702 */ + { 0x0000, 0x0000, 0x0000 }, /* R19703 */ + { 0x0000, 0x0000, 0x0000 }, /* R19704 */ + { 0x0000, 0x0000, 0x0000 }, /* R19705 */ + { 0x0000, 0x0000, 0x0000 }, /* R19706 */ + { 0x0000, 0x0000, 0x0000 }, /* R19707 */ + { 0x0000, 0x0000, 0x0000 }, /* R19708 */ + { 0x0000, 0x0000, 0x0000 }, /* R19709 */ + { 0x0000, 0x0000, 0x0000 }, /* R19710 */ + { 0x0000, 0x0000, 0x0000 }, /* R19711 */ + { 0x0000, 0x0000, 0x0000 }, /* R19712 */ + { 0x0000, 0x0000, 0x0000 }, /* R19713 */ + { 0x0000, 0x0000, 0x0000 }, /* R19714 */ + { 0x0000, 0x0000, 0x0000 }, /* R19715 */ + { 0x0000, 0x0000, 0x0000 }, /* R19716 */ + { 0x0000, 0x0000, 0x0000 }, /* R19717 */ + { 0x0000, 0x0000, 0x0000 }, /* R19718 */ + { 0x0000, 0x0000, 0x0000 }, /* R19719 */ + { 0x0000, 0x0000, 0x0000 }, /* R19720 */ + { 0x0000, 0x0000, 0x0000 }, /* R19721 */ + { 0x0000, 0x0000, 0x0000 }, /* R19722 */ + { 0x0000, 0x0000, 0x0000 }, /* R19723 */ + { 0x0000, 0x0000, 0x0000 }, /* R19724 */ + { 0x0000, 0x0000, 0x0000 }, /* R19725 */ + { 0x0000, 0x0000, 0x0000 }, /* R19726 */ + { 0x0000, 0x0000, 0x0000 }, /* R19727 */ + { 0x0000, 0x0000, 0x0000 }, /* R19728 */ + { 0x0000, 0x0000, 0x0000 }, /* R19729 */ + { 0x0000, 0x0000, 0x0000 }, /* R19730 */ + { 0x0000, 0x0000, 0x0000 }, /* R19731 */ + { 0x0000, 0x0000, 0x0000 }, /* R19732 */ + { 0x0000, 0x0000, 0x0000 }, /* R19733 */ + { 0x0000, 0x0000, 0x0000 }, /* R19734 */ + { 0x0000, 0x0000, 0x0000 }, /* R19735 */ + { 0x0000, 0x0000, 0x0000 }, /* R19736 */ + { 0x0000, 0x0000, 0x0000 }, /* R19737 */ + { 0x0000, 0x0000, 0x0000 }, /* R19738 */ + { 0x0000, 0x0000, 0x0000 }, /* R19739 */ + { 0x0000, 0x0000, 0x0000 }, /* R19740 */ + { 0x0000, 0x0000, 0x0000 }, /* R19741 */ + { 0x0000, 0x0000, 0x0000 }, /* R19742 */ + { 0x0000, 0x0000, 0x0000 }, /* R19743 */ + { 0x0000, 0x0000, 0x0000 }, /* R19744 */ + { 0x0000, 0x0000, 0x0000 }, /* R19745 */ + { 0x0000, 0x0000, 0x0000 }, /* R19746 */ + { 0x0000, 0x0000, 0x0000 }, /* R19747 */ + { 0x0000, 0x0000, 0x0000 }, /* R19748 */ + { 0x0000, 0x0000, 0x0000 }, /* R19749 */ + { 0x0000, 0x0000, 0x0000 }, /* R19750 */ + { 0x0000, 0x0000, 0x0000 }, /* R19751 */ + { 0x0000, 0x0000, 0x0000 }, /* R19752 */ + { 0x0000, 0x0000, 0x0000 }, /* R19753 */ + { 0x0000, 0x0000, 0x0000 }, /* R19754 */ + { 0x0000, 0x0000, 0x0000 }, /* R19755 */ + { 0x0000, 0x0000, 0x0000 }, /* R19756 */ + { 0x0000, 0x0000, 0x0000 }, /* R19757 */ + { 0x0000, 0x0000, 0x0000 }, /* R19758 */ + { 0x0000, 0x0000, 0x0000 }, /* R19759 */ + { 0x0000, 0x0000, 0x0000 }, /* R19760 */ + { 0x0000, 0x0000, 0x0000 }, /* R19761 */ + { 0x0000, 0x0000, 0x0000 }, /* R19762 */ + { 0x0000, 0x0000, 0x0000 }, /* R19763 */ + { 0x0000, 0x0000, 0x0000 }, /* R19764 */ + { 0x0000, 0x0000, 0x0000 }, /* R19765 */ + { 0x0000, 0x0000, 0x0000 }, /* R19766 */ + { 0x0000, 0x0000, 0x0000 }, /* R19767 */ + { 0x0000, 0x0000, 0x0000 }, /* R19768 */ + { 0x0000, 0x0000, 0x0000 }, /* R19769 */ + { 0x0000, 0x0000, 0x0000 }, /* R19770 */ + { 0x0000, 0x0000, 0x0000 }, /* R19771 */ + { 0x0000, 0x0000, 0x0000 }, /* R19772 */ + { 0x0000, 0x0000, 0x0000 }, /* R19773 */ + { 0x0000, 0x0000, 0x0000 }, /* R19774 */ + { 0x0000, 0x0000, 0x0000 }, /* R19775 */ + { 0x0000, 0x0000, 0x0000 }, /* R19776 */ + { 0x0000, 0x0000, 0x0000 }, /* R19777 */ + { 0x0000, 0x0000, 0x0000 }, /* R19778 */ + { 0x0000, 0x0000, 0x0000 }, /* R19779 */ + { 0x0000, 0x0000, 0x0000 }, /* R19780 */ + { 0x0000, 0x0000, 0x0000 }, /* R19781 */ + { 0x0000, 0x0000, 0x0000 }, /* R19782 */ + { 0x0000, 0x0000, 0x0000 }, /* R19783 */ + { 0x0000, 0x0000, 0x0000 }, /* R19784 */ + { 0x0000, 0x0000, 0x0000 }, /* R19785 */ + { 0x0000, 0x0000, 0x0000 }, /* R19786 */ + { 0x0000, 0x0000, 0x0000 }, /* R19787 */ + { 0x0000, 0x0000, 0x0000 }, /* R19788 */ + { 0x0000, 0x0000, 0x0000 }, /* R19789 */ + { 0x0000, 0x0000, 0x0000 }, /* R19790 */ + { 0x0000, 0x0000, 0x0000 }, /* R19791 */ + { 0x0000, 0x0000, 0x0000 }, /* R19792 */ + { 0x0000, 0x0000, 0x0000 }, /* R19793 */ + { 0x0000, 0x0000, 0x0000 }, /* R19794 */ + { 0x0000, 0x0000, 0x0000 }, /* R19795 */ + { 0x0000, 0x0000, 0x0000 }, /* R19796 */ + { 0x0000, 0x0000, 0x0000 }, /* R19797 */ + { 0x0000, 0x0000, 0x0000 }, /* R19798 */ + { 0x0000, 0x0000, 0x0000 }, /* R19799 */ + { 0x0000, 0x0000, 0x0000 }, /* R19800 */ + { 0x0000, 0x0000, 0x0000 }, /* R19801 */ + { 0x0000, 0x0000, 0x0000 }, /* R19802 */ + { 0x0000, 0x0000, 0x0000 }, /* R19803 */ + { 0x0000, 0x0000, 0x0000 }, /* R19804 */ + { 0x0000, 0x0000, 0x0000 }, /* R19805 */ + { 0x0000, 0x0000, 0x0000 }, /* R19806 */ + { 0x0000, 0x0000, 0x0000 }, /* R19807 */ + { 0x0000, 0x0000, 0x0000 }, /* R19808 */ + { 0x0000, 0x0000, 0x0000 }, /* R19809 */ + { 0x0000, 0x0000, 0x0000 }, /* R19810 */ + { 0x0000, 0x0000, 0x0000 }, /* R19811 */ + { 0x0000, 0x0000, 0x0000 }, /* R19812 */ + { 0x0000, 0x0000, 0x0000 }, /* R19813 */ + { 0x0000, 0x0000, 0x0000 }, /* R19814 */ + { 0x0000, 0x0000, 0x0000 }, /* R19815 */ + { 0x0000, 0x0000, 0x0000 }, /* R19816 */ + { 0x0000, 0x0000, 0x0000 }, /* R19817 */ + { 0x0000, 0x0000, 0x0000 }, /* R19818 */ + { 0x0000, 0x0000, 0x0000 }, /* R19819 */ + { 0x0000, 0x0000, 0x0000 }, /* R19820 */ + { 0x0000, 0x0000, 0x0000 }, /* R19821 */ + { 0x0000, 0x0000, 0x0000 }, /* R19822 */ + { 0x0000, 0x0000, 0x0000 }, /* R19823 */ + { 0x0000, 0x0000, 0x0000 }, /* R19824 */ + { 0x0000, 0x0000, 0x0000 }, /* R19825 */ + { 0x0000, 0x0000, 0x0000 }, /* R19826 */ + { 0x0000, 0x0000, 0x0000 }, /* R19827 */ + { 0x0000, 0x0000, 0x0000 }, /* R19828 */ + { 0x0000, 0x0000, 0x0000 }, /* R19829 */ + { 0x0000, 0x0000, 0x0000 }, /* R19830 */ + { 0x0000, 0x0000, 0x0000 }, /* R19831 */ + { 0x0000, 0x0000, 0x0000 }, /* R19832 */ + { 0x0000, 0x0000, 0x0000 }, /* R19833 */ + { 0x0000, 0x0000, 0x0000 }, /* R19834 */ + { 0x0000, 0x0000, 0x0000 }, /* R19835 */ + { 0x0000, 0x0000, 0x0000 }, /* R19836 */ + { 0x0000, 0x0000, 0x0000 }, /* R19837 */ + { 0x0000, 0x0000, 0x0000 }, /* R19838 */ + { 0x0000, 0x0000, 0x0000 }, /* R19839 */ + { 0x0000, 0x0000, 0x0000 }, /* R19840 */ + { 0x0000, 0x0000, 0x0000 }, /* R19841 */ + { 0x0000, 0x0000, 0x0000 }, /* R19842 */ + { 0x0000, 0x0000, 0x0000 }, /* R19843 */ + { 0x0000, 0x0000, 0x0000 }, /* R19844 */ + { 0x0000, 0x0000, 0x0000 }, /* R19845 */ + { 0x0000, 0x0000, 0x0000 }, /* R19846 */ + { 0x0000, 0x0000, 0x0000 }, /* R19847 */ + { 0x0000, 0x0000, 0x0000 }, /* R19848 */ + { 0x0000, 0x0000, 0x0000 }, /* R19849 */ + { 0x0000, 0x0000, 0x0000 }, /* R19850 */ + { 0x0000, 0x0000, 0x0000 }, /* R19851 */ + { 0x0000, 0x0000, 0x0000 }, /* R19852 */ + { 0x0000, 0x0000, 0x0000 }, /* R19853 */ + { 0x0000, 0x0000, 0x0000 }, /* R19854 */ + { 0x0000, 0x0000, 0x0000 }, /* R19855 */ + { 0x0000, 0x0000, 0x0000 }, /* R19856 */ + { 0x0000, 0x0000, 0x0000 }, /* R19857 */ + { 0x0000, 0x0000, 0x0000 }, /* R19858 */ + { 0x0000, 0x0000, 0x0000 }, /* R19859 */ + { 0x0000, 0x0000, 0x0000 }, /* R19860 */ + { 0x0000, 0x0000, 0x0000 }, /* R19861 */ + { 0x0000, 0x0000, 0x0000 }, /* R19862 */ + { 0x0000, 0x0000, 0x0000 }, /* R19863 */ + { 0x0000, 0x0000, 0x0000 }, /* R19864 */ + { 0x0000, 0x0000, 0x0000 }, /* R19865 */ + { 0x0000, 0x0000, 0x0000 }, /* R19866 */ + { 0x0000, 0x0000, 0x0000 }, /* R19867 */ + { 0x0000, 0x0000, 0x0000 }, /* R19868 */ + { 0x0000, 0x0000, 0x0000 }, /* R19869 */ + { 0x0000, 0x0000, 0x0000 }, /* R19870 */ + { 0x0000, 0x0000, 0x0000 }, /* R19871 */ + { 0x0000, 0x0000, 0x0000 }, /* R19872 */ + { 0x0000, 0x0000, 0x0000 }, /* R19873 */ + { 0x0000, 0x0000, 0x0000 }, /* R19874 */ + { 0x0000, 0x0000, 0x0000 }, /* R19875 */ + { 0x0000, 0x0000, 0x0000 }, /* R19876 */ + { 0x0000, 0x0000, 0x0000 }, /* R19877 */ + { 0x0000, 0x0000, 0x0000 }, /* R19878 */ + { 0x0000, 0x0000, 0x0000 }, /* R19879 */ + { 0x0000, 0x0000, 0x0000 }, /* R19880 */ + { 0x0000, 0x0000, 0x0000 }, /* R19881 */ + { 0x0000, 0x0000, 0x0000 }, /* R19882 */ + { 0x0000, 0x0000, 0x0000 }, /* R19883 */ + { 0x0000, 0x0000, 0x0000 }, /* R19884 */ + { 0x0000, 0x0000, 0x0000 }, /* R19885 */ + { 0x0000, 0x0000, 0x0000 }, /* R19886 */ + { 0x0000, 0x0000, 0x0000 }, /* R19887 */ + { 0x0000, 0x0000, 0x0000 }, /* R19888 */ + { 0x0000, 0x0000, 0x0000 }, /* R19889 */ + { 0x0000, 0x0000, 0x0000 }, /* R19890 */ + { 0x0000, 0x0000, 0x0000 }, /* R19891 */ + { 0x0000, 0x0000, 0x0000 }, /* R19892 */ + { 0x0000, 0x0000, 0x0000 }, /* R19893 */ + { 0x0000, 0x0000, 0x0000 }, /* R19894 */ + { 0x0000, 0x0000, 0x0000 }, /* R19895 */ + { 0x0000, 0x0000, 0x0000 }, /* R19896 */ + { 0x0000, 0x0000, 0x0000 }, /* R19897 */ + { 0x0000, 0x0000, 0x0000 }, /* R19898 */ + { 0x0000, 0x0000, 0x0000 }, /* R19899 */ + { 0x0000, 0x0000, 0x0000 }, /* R19900 */ + { 0x0000, 0x0000, 0x0000 }, /* R19901 */ + { 0x0000, 0x0000, 0x0000 }, /* R19902 */ + { 0x0000, 0x0000, 0x0000 }, /* R19903 */ + { 0x0000, 0x0000, 0x0000 }, /* R19904 */ + { 0x0000, 0x0000, 0x0000 }, /* R19905 */ + { 0x0000, 0x0000, 0x0000 }, /* R19906 */ + { 0x0000, 0x0000, 0x0000 }, /* R19907 */ + { 0x0000, 0x0000, 0x0000 }, /* R19908 */ + { 0x0000, 0x0000, 0x0000 }, /* R19909 */ + { 0x0000, 0x0000, 0x0000 }, /* R19910 */ + { 0x0000, 0x0000, 0x0000 }, /* R19911 */ + { 0x0000, 0x0000, 0x0000 }, /* R19912 */ + { 0x0000, 0x0000, 0x0000 }, /* R19913 */ + { 0x0000, 0x0000, 0x0000 }, /* R19914 */ + { 0x0000, 0x0000, 0x0000 }, /* R19915 */ + { 0x0000, 0x0000, 0x0000 }, /* R19916 */ + { 0x0000, 0x0000, 0x0000 }, /* R19917 */ + { 0x0000, 0x0000, 0x0000 }, /* R19918 */ + { 0x0000, 0x0000, 0x0000 }, /* R19919 */ + { 0x0000, 0x0000, 0x0000 }, /* R19920 */ + { 0x0000, 0x0000, 0x0000 }, /* R19921 */ + { 0x0000, 0x0000, 0x0000 }, /* R19922 */ + { 0x0000, 0x0000, 0x0000 }, /* R19923 */ + { 0x0000, 0x0000, 0x0000 }, /* R19924 */ + { 0x0000, 0x0000, 0x0000 }, /* R19925 */ + { 0x0000, 0x0000, 0x0000 }, /* R19926 */ + { 0x0000, 0x0000, 0x0000 }, /* R19927 */ + { 0x0000, 0x0000, 0x0000 }, /* R19928 */ + { 0x0000, 0x0000, 0x0000 }, /* R19929 */ + { 0x0000, 0x0000, 0x0000 }, /* R19930 */ + { 0x0000, 0x0000, 0x0000 }, /* R19931 */ + { 0x0000, 0x0000, 0x0000 }, /* R19932 */ + { 0x0000, 0x0000, 0x0000 }, /* R19933 */ + { 0x0000, 0x0000, 0x0000 }, /* R19934 */ + { 0x0000, 0x0000, 0x0000 }, /* R19935 */ + { 0x0000, 0x0000, 0x0000 }, /* R19936 */ + { 0x0000, 0x0000, 0x0000 }, /* R19937 */ + { 0x0000, 0x0000, 0x0000 }, /* R19938 */ + { 0x0000, 0x0000, 0x0000 }, /* R19939 */ + { 0x0000, 0x0000, 0x0000 }, /* R19940 */ + { 0x0000, 0x0000, 0x0000 }, /* R19941 */ + { 0x0000, 0x0000, 0x0000 }, /* R19942 */ + { 0x0000, 0x0000, 0x0000 }, /* R19943 */ + { 0x0000, 0x0000, 0x0000 }, /* R19944 */ + { 0x0000, 0x0000, 0x0000 }, /* R19945 */ + { 0x0000, 0x0000, 0x0000 }, /* R19946 */ + { 0x0000, 0x0000, 0x0000 }, /* R19947 */ + { 0x0000, 0x0000, 0x0000 }, /* R19948 */ + { 0x0000, 0x0000, 0x0000 }, /* R19949 */ + { 0x0000, 0x0000, 0x0000 }, /* R19950 */ + { 0x0000, 0x0000, 0x0000 }, /* R19951 */ + { 0x0000, 0x0000, 0x0000 }, /* R19952 */ + { 0x0000, 0x0000, 0x0000 }, /* R19953 */ + { 0x0000, 0x0000, 0x0000 }, /* R19954 */ + { 0x0000, 0x0000, 0x0000 }, /* R19955 */ + { 0x0000, 0x0000, 0x0000 }, /* R19956 */ + { 0x0000, 0x0000, 0x0000 }, /* R19957 */ + { 0x0000, 0x0000, 0x0000 }, /* R19958 */ + { 0x0000, 0x0000, 0x0000 }, /* R19959 */ + { 0x0000, 0x0000, 0x0000 }, /* R19960 */ + { 0x0000, 0x0000, 0x0000 }, /* R19961 */ + { 0x0000, 0x0000, 0x0000 }, /* R19962 */ + { 0x0000, 0x0000, 0x0000 }, /* R19963 */ + { 0x0000, 0x0000, 0x0000 }, /* R19964 */ + { 0x0000, 0x0000, 0x0000 }, /* R19965 */ + { 0x0000, 0x0000, 0x0000 }, /* R19966 */ + { 0x0000, 0x0000, 0x0000 }, /* R19967 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19968 - RETUNEDAC_PG2_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19969 - RETUNEDAC_PG2_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R19970 - RETUNEDAC_PG_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R19971 - RETUNEDAC_PG_0 */ + { 0x0000, 0x0000, 0x0000 }, /* R19972 */ + { 0x0000, 0x0000, 0x0000 }, /* R19973 */ + { 0x0000, 0x0000, 0x0000 }, /* R19974 */ + { 0x0000, 0x0000, 0x0000 }, /* R19975 */ + { 0x0000, 0x0000, 0x0000 }, /* R19976 */ + { 0x0000, 0x0000, 0x0000 }, /* R19977 */ + { 0x0000, 0x0000, 0x0000 }, /* R19978 */ + { 0x0000, 0x0000, 0x0000 }, /* R19979 */ + { 0x0000, 0x0000, 0x0000 }, /* R19980 */ + { 0x0000, 0x0000, 0x0000 }, /* R19981 */ + { 0x0000, 0x0000, 0x0000 }, /* R19982 */ + { 0x0000, 0x0000, 0x0000 }, /* R19983 */ + { 0x0000, 0x0000, 0x0000 }, /* R19984 */ + { 0x0000, 0x0000, 0x0000 }, /* R19985 */ + { 0x0000, 0x0000, 0x0000 }, /* R19986 */ + { 0x0000, 0x0000, 0x0000 }, /* R19987 */ + { 0x0000, 0x0000, 0x0000 }, /* R19988 */ + { 0x0000, 0x0000, 0x0000 }, /* R19989 */ + { 0x0000, 0x0000, 0x0000 }, /* R19990 */ + { 0x0000, 0x0000, 0x0000 }, /* R19991 */ + { 0x0000, 0x0000, 0x0000 }, /* R19992 */ + { 0x0000, 0x0000, 0x0000 }, /* R19993 */ + { 0x0000, 0x0000, 0x0000 }, /* R19994 */ + { 0x0000, 0x0000, 0x0000 }, /* R19995 */ + { 0x0000, 0x0000, 0x0000 }, /* R19996 */ + { 0x0000, 0x0000, 0x0000 }, /* R19997 */ + { 0x0000, 0x0000, 0x0000 }, /* R19998 */ + { 0x0000, 0x0000, 0x0000 }, /* R19999 */ + { 0x0000, 0x0000, 0x0000 }, /* R20000 */ + { 0x0000, 0x0000, 0x0000 }, /* R20001 */ + { 0x0000, 0x0000, 0x0000 }, /* R20002 */ + { 0x0000, 0x0000, 0x0000 }, /* R20003 */ + { 0x0000, 0x0000, 0x0000 }, /* R20004 */ + { 0x0000, 0x0000, 0x0000 }, /* R20005 */ + { 0x0000, 0x0000, 0x0000 }, /* R20006 */ + { 0x0000, 0x0000, 0x0000 }, /* R20007 */ + { 0x0000, 0x0000, 0x0000 }, /* R20008 */ + { 0x0000, 0x0000, 0x0000 }, /* R20009 */ + { 0x0000, 0x0000, 0x0000 }, /* R20010 */ + { 0x0000, 0x0000, 0x0000 }, /* R20011 */ + { 0x0000, 0x0000, 0x0000 }, /* R20012 */ + { 0x0000, 0x0000, 0x0000 }, /* R20013 */ + { 0x0000, 0x0000, 0x0000 }, /* R20014 */ + { 0x0000, 0x0000, 0x0000 }, /* R20015 */ + { 0x0000, 0x0000, 0x0000 }, /* R20016 */ + { 0x0000, 0x0000, 0x0000 }, /* R20017 */ + { 0x0000, 0x0000, 0x0000 }, /* R20018 */ + { 0x0000, 0x0000, 0x0000 }, /* R20019 */ + { 0x0000, 0x0000, 0x0000 }, /* R20020 */ + { 0x0000, 0x0000, 0x0000 }, /* R20021 */ + { 0x0000, 0x0000, 0x0000 }, /* R20022 */ + { 0x0000, 0x0000, 0x0000 }, /* R20023 */ + { 0x0000, 0x0000, 0x0000 }, /* R20024 */ + { 0x0000, 0x0000, 0x0000 }, /* R20025 */ + { 0x0000, 0x0000, 0x0000 }, /* R20026 */ + { 0x0000, 0x0000, 0x0000 }, /* R20027 */ + { 0x0000, 0x0000, 0x0000 }, /* R20028 */ + { 0x0000, 0x0000, 0x0000 }, /* R20029 */ + { 0x0000, 0x0000, 0x0000 }, /* R20030 */ + { 0x0000, 0x0000, 0x0000 }, /* R20031 */ + { 0x0000, 0x0000, 0x0000 }, /* R20032 */ + { 0x0000, 0x0000, 0x0000 }, /* R20033 */ + { 0x0000, 0x0000, 0x0000 }, /* R20034 */ + { 0x0000, 0x0000, 0x0000 }, /* R20035 */ + { 0x0000, 0x0000, 0x0000 }, /* R20036 */ + { 0x0000, 0x0000, 0x0000 }, /* R20037 */ + { 0x0000, 0x0000, 0x0000 }, /* R20038 */ + { 0x0000, 0x0000, 0x0000 }, /* R20039 */ + { 0x0000, 0x0000, 0x0000 }, /* R20040 */ + { 0x0000, 0x0000, 0x0000 }, /* R20041 */ + { 0x0000, 0x0000, 0x0000 }, /* R20042 */ + { 0x0000, 0x0000, 0x0000 }, /* R20043 */ + { 0x0000, 0x0000, 0x0000 }, /* R20044 */ + { 0x0000, 0x0000, 0x0000 }, /* R20045 */ + { 0x0000, 0x0000, 0x0000 }, /* R20046 */ + { 0x0000, 0x0000, 0x0000 }, /* R20047 */ + { 0x0000, 0x0000, 0x0000 }, /* R20048 */ + { 0x0000, 0x0000, 0x0000 }, /* R20049 */ + { 0x0000, 0x0000, 0x0000 }, /* R20050 */ + { 0x0000, 0x0000, 0x0000 }, /* R20051 */ + { 0x0000, 0x0000, 0x0000 }, /* R20052 */ + { 0x0000, 0x0000, 0x0000 }, /* R20053 */ + { 0x0000, 0x0000, 0x0000 }, /* R20054 */ + { 0x0000, 0x0000, 0x0000 }, /* R20055 */ + { 0x0000, 0x0000, 0x0000 }, /* R20056 */ + { 0x0000, 0x0000, 0x0000 }, /* R20057 */ + { 0x0000, 0x0000, 0x0000 }, /* R20058 */ + { 0x0000, 0x0000, 0x0000 }, /* R20059 */ + { 0x0000, 0x0000, 0x0000 }, /* R20060 */ + { 0x0000, 0x0000, 0x0000 }, /* R20061 */ + { 0x0000, 0x0000, 0x0000 }, /* R20062 */ + { 0x0000, 0x0000, 0x0000 }, /* R20063 */ + { 0x0000, 0x0000, 0x0000 }, /* R20064 */ + { 0x0000, 0x0000, 0x0000 }, /* R20065 */ + { 0x0000, 0x0000, 0x0000 }, /* R20066 */ + { 0x0000, 0x0000, 0x0000 }, /* R20067 */ + { 0x0000, 0x0000, 0x0000 }, /* R20068 */ + { 0x0000, 0x0000, 0x0000 }, /* R20069 */ + { 0x0000, 0x0000, 0x0000 }, /* R20070 */ + { 0x0000, 0x0000, 0x0000 }, /* R20071 */ + { 0x0000, 0x0000, 0x0000 }, /* R20072 */ + { 0x0000, 0x0000, 0x0000 }, /* R20073 */ + { 0x0000, 0x0000, 0x0000 }, /* R20074 */ + { 0x0000, 0x0000, 0x0000 }, /* R20075 */ + { 0x0000, 0x0000, 0x0000 }, /* R20076 */ + { 0x0000, 0x0000, 0x0000 }, /* R20077 */ + { 0x0000, 0x0000, 0x0000 }, /* R20078 */ + { 0x0000, 0x0000, 0x0000 }, /* R20079 */ + { 0x0000, 0x0000, 0x0000 }, /* R20080 */ + { 0x0000, 0x0000, 0x0000 }, /* R20081 */ + { 0x0000, 0x0000, 0x0000 }, /* R20082 */ + { 0x0000, 0x0000, 0x0000 }, /* R20083 */ + { 0x0000, 0x0000, 0x0000 }, /* R20084 */ + { 0x0000, 0x0000, 0x0000 }, /* R20085 */ + { 0x0000, 0x0000, 0x0000 }, /* R20086 */ + { 0x0000, 0x0000, 0x0000 }, /* R20087 */ + { 0x0000, 0x0000, 0x0000 }, /* R20088 */ + { 0x0000, 0x0000, 0x0000 }, /* R20089 */ + { 0x0000, 0x0000, 0x0000 }, /* R20090 */ + { 0x0000, 0x0000, 0x0000 }, /* R20091 */ + { 0x0000, 0x0000, 0x0000 }, /* R20092 */ + { 0x0000, 0x0000, 0x0000 }, /* R20093 */ + { 0x0000, 0x0000, 0x0000 }, /* R20094 */ + { 0x0000, 0x0000, 0x0000 }, /* R20095 */ + { 0x0000, 0x0000, 0x0000 }, /* R20096 */ + { 0x0000, 0x0000, 0x0000 }, /* R20097 */ + { 0x0000, 0x0000, 0x0000 }, /* R20098 */ + { 0x0000, 0x0000, 0x0000 }, /* R20099 */ + { 0x0000, 0x0000, 0x0000 }, /* R20100 */ + { 0x0000, 0x0000, 0x0000 }, /* R20101 */ + { 0x0000, 0x0000, 0x0000 }, /* R20102 */ + { 0x0000, 0x0000, 0x0000 }, /* R20103 */ + { 0x0000, 0x0000, 0x0000 }, /* R20104 */ + { 0x0000, 0x0000, 0x0000 }, /* R20105 */ + { 0x0000, 0x0000, 0x0000 }, /* R20106 */ + { 0x0000, 0x0000, 0x0000 }, /* R20107 */ + { 0x0000, 0x0000, 0x0000 }, /* R20108 */ + { 0x0000, 0x0000, 0x0000 }, /* R20109 */ + { 0x0000, 0x0000, 0x0000 }, /* R20110 */ + { 0x0000, 0x0000, 0x0000 }, /* R20111 */ + { 0x0000, 0x0000, 0x0000 }, /* R20112 */ + { 0x0000, 0x0000, 0x0000 }, /* R20113 */ + { 0x0000, 0x0000, 0x0000 }, /* R20114 */ + { 0x0000, 0x0000, 0x0000 }, /* R20115 */ + { 0x0000, 0x0000, 0x0000 }, /* R20116 */ + { 0x0000, 0x0000, 0x0000 }, /* R20117 */ + { 0x0000, 0x0000, 0x0000 }, /* R20118 */ + { 0x0000, 0x0000, 0x0000 }, /* R20119 */ + { 0x0000, 0x0000, 0x0000 }, /* R20120 */ + { 0x0000, 0x0000, 0x0000 }, /* R20121 */ + { 0x0000, 0x0000, 0x0000 }, /* R20122 */ + { 0x0000, 0x0000, 0x0000 }, /* R20123 */ + { 0x0000, 0x0000, 0x0000 }, /* R20124 */ + { 0x0000, 0x0000, 0x0000 }, /* R20125 */ + { 0x0000, 0x0000, 0x0000 }, /* R20126 */ + { 0x0000, 0x0000, 0x0000 }, /* R20127 */ + { 0x0000, 0x0000, 0x0000 }, /* R20128 */ + { 0x0000, 0x0000, 0x0000 }, /* R20129 */ + { 0x0000, 0x0000, 0x0000 }, /* R20130 */ + { 0x0000, 0x0000, 0x0000 }, /* R20131 */ + { 0x0000, 0x0000, 0x0000 }, /* R20132 */ + { 0x0000, 0x0000, 0x0000 }, /* R20133 */ + { 0x0000, 0x0000, 0x0000 }, /* R20134 */ + { 0x0000, 0x0000, 0x0000 }, /* R20135 */ + { 0x0000, 0x0000, 0x0000 }, /* R20136 */ + { 0x0000, 0x0000, 0x0000 }, /* R20137 */ + { 0x0000, 0x0000, 0x0000 }, /* R20138 */ + { 0x0000, 0x0000, 0x0000 }, /* R20139 */ + { 0x0000, 0x0000, 0x0000 }, /* R20140 */ + { 0x0000, 0x0000, 0x0000 }, /* R20141 */ + { 0x0000, 0x0000, 0x0000 }, /* R20142 */ + { 0x0000, 0x0000, 0x0000 }, /* R20143 */ + { 0x0000, 0x0000, 0x0000 }, /* R20144 */ + { 0x0000, 0x0000, 0x0000 }, /* R20145 */ + { 0x0000, 0x0000, 0x0000 }, /* R20146 */ + { 0x0000, 0x0000, 0x0000 }, /* R20147 */ + { 0x0000, 0x0000, 0x0000 }, /* R20148 */ + { 0x0000, 0x0000, 0x0000 }, /* R20149 */ + { 0x0000, 0x0000, 0x0000 }, /* R20150 */ + { 0x0000, 0x0000, 0x0000 }, /* R20151 */ + { 0x0000, 0x0000, 0x0000 }, /* R20152 */ + { 0x0000, 0x0000, 0x0000 }, /* R20153 */ + { 0x0000, 0x0000, 0x0000 }, /* R20154 */ + { 0x0000, 0x0000, 0x0000 }, /* R20155 */ + { 0x0000, 0x0000, 0x0000 }, /* R20156 */ + { 0x0000, 0x0000, 0x0000 }, /* R20157 */ + { 0x0000, 0x0000, 0x0000 }, /* R20158 */ + { 0x0000, 0x0000, 0x0000 }, /* R20159 */ + { 0x0000, 0x0000, 0x0000 }, /* R20160 */ + { 0x0000, 0x0000, 0x0000 }, /* R20161 */ + { 0x0000, 0x0000, 0x0000 }, /* R20162 */ + { 0x0000, 0x0000, 0x0000 }, /* R20163 */ + { 0x0000, 0x0000, 0x0000 }, /* R20164 */ + { 0x0000, 0x0000, 0x0000 }, /* R20165 */ + { 0x0000, 0x0000, 0x0000 }, /* R20166 */ + { 0x0000, 0x0000, 0x0000 }, /* R20167 */ + { 0x0000, 0x0000, 0x0000 }, /* R20168 */ + { 0x0000, 0x0000, 0x0000 }, /* R20169 */ + { 0x0000, 0x0000, 0x0000 }, /* R20170 */ + { 0x0000, 0x0000, 0x0000 }, /* R20171 */ + { 0x0000, 0x0000, 0x0000 }, /* R20172 */ + { 0x0000, 0x0000, 0x0000 }, /* R20173 */ + { 0x0000, 0x0000, 0x0000 }, /* R20174 */ + { 0x0000, 0x0000, 0x0000 }, /* R20175 */ + { 0x0000, 0x0000, 0x0000 }, /* R20176 */ + { 0x0000, 0x0000, 0x0000 }, /* R20177 */ + { 0x0000, 0x0000, 0x0000 }, /* R20178 */ + { 0x0000, 0x0000, 0x0000 }, /* R20179 */ + { 0x0000, 0x0000, 0x0000 }, /* R20180 */ + { 0x0000, 0x0000, 0x0000 }, /* R20181 */ + { 0x0000, 0x0000, 0x0000 }, /* R20182 */ + { 0x0000, 0x0000, 0x0000 }, /* R20183 */ + { 0x0000, 0x0000, 0x0000 }, /* R20184 */ + { 0x0000, 0x0000, 0x0000 }, /* R20185 */ + { 0x0000, 0x0000, 0x0000 }, /* R20186 */ + { 0x0000, 0x0000, 0x0000 }, /* R20187 */ + { 0x0000, 0x0000, 0x0000 }, /* R20188 */ + { 0x0000, 0x0000, 0x0000 }, /* R20189 */ + { 0x0000, 0x0000, 0x0000 }, /* R20190 */ + { 0x0000, 0x0000, 0x0000 }, /* R20191 */ + { 0x0000, 0x0000, 0x0000 }, /* R20192 */ + { 0x0000, 0x0000, 0x0000 }, /* R20193 */ + { 0x0000, 0x0000, 0x0000 }, /* R20194 */ + { 0x0000, 0x0000, 0x0000 }, /* R20195 */ + { 0x0000, 0x0000, 0x0000 }, /* R20196 */ + { 0x0000, 0x0000, 0x0000 }, /* R20197 */ + { 0x0000, 0x0000, 0x0000 }, /* R20198 */ + { 0x0000, 0x0000, 0x0000 }, /* R20199 */ + { 0x0000, 0x0000, 0x0000 }, /* R20200 */ + { 0x0000, 0x0000, 0x0000 }, /* R20201 */ + { 0x0000, 0x0000, 0x0000 }, /* R20202 */ + { 0x0000, 0x0000, 0x0000 }, /* R20203 */ + { 0x0000, 0x0000, 0x0000 }, /* R20204 */ + { 0x0000, 0x0000, 0x0000 }, /* R20205 */ + { 0x0000, 0x0000, 0x0000 }, /* R20206 */ + { 0x0000, 0x0000, 0x0000 }, /* R20207 */ + { 0x0000, 0x0000, 0x0000 }, /* R20208 */ + { 0x0000, 0x0000, 0x0000 }, /* R20209 */ + { 0x0000, 0x0000, 0x0000 }, /* R20210 */ + { 0x0000, 0x0000, 0x0000 }, /* R20211 */ + { 0x0000, 0x0000, 0x0000 }, /* R20212 */ + { 0x0000, 0x0000, 0x0000 }, /* R20213 */ + { 0x0000, 0x0000, 0x0000 }, /* R20214 */ + { 0x0000, 0x0000, 0x0000 }, /* R20215 */ + { 0x0000, 0x0000, 0x0000 }, /* R20216 */ + { 0x0000, 0x0000, 0x0000 }, /* R20217 */ + { 0x0000, 0x0000, 0x0000 }, /* R20218 */ + { 0x0000, 0x0000, 0x0000 }, /* R20219 */ + { 0x0000, 0x0000, 0x0000 }, /* R20220 */ + { 0x0000, 0x0000, 0x0000 }, /* R20221 */ + { 0x0000, 0x0000, 0x0000 }, /* R20222 */ + { 0x0000, 0x0000, 0x0000 }, /* R20223 */ + { 0x0000, 0x0000, 0x0000 }, /* R20224 */ + { 0x0000, 0x0000, 0x0000 }, /* R20225 */ + { 0x0000, 0x0000, 0x0000 }, /* R20226 */ + { 0x0000, 0x0000, 0x0000 }, /* R20227 */ + { 0x0000, 0x0000, 0x0000 }, /* R20228 */ + { 0x0000, 0x0000, 0x0000 }, /* R20229 */ + { 0x0000, 0x0000, 0x0000 }, /* R20230 */ + { 0x0000, 0x0000, 0x0000 }, /* R20231 */ + { 0x0000, 0x0000, 0x0000 }, /* R20232 */ + { 0x0000, 0x0000, 0x0000 }, /* R20233 */ + { 0x0000, 0x0000, 0x0000 }, /* R20234 */ + { 0x0000, 0x0000, 0x0000 }, /* R20235 */ + { 0x0000, 0x0000, 0x0000 }, /* R20236 */ + { 0x0000, 0x0000, 0x0000 }, /* R20237 */ + { 0x0000, 0x0000, 0x0000 }, /* R20238 */ + { 0x0000, 0x0000, 0x0000 }, /* R20239 */ + { 0x0000, 0x0000, 0x0000 }, /* R20240 */ + { 0x0000, 0x0000, 0x0000 }, /* R20241 */ + { 0x0000, 0x0000, 0x0000 }, /* R20242 */ + { 0x0000, 0x0000, 0x0000 }, /* R20243 */ + { 0x0000, 0x0000, 0x0000 }, /* R20244 */ + { 0x0000, 0x0000, 0x0000 }, /* R20245 */ + { 0x0000, 0x0000, 0x0000 }, /* R20246 */ + { 0x0000, 0x0000, 0x0000 }, /* R20247 */ + { 0x0000, 0x0000, 0x0000 }, /* R20248 */ + { 0x0000, 0x0000, 0x0000 }, /* R20249 */ + { 0x0000, 0x0000, 0x0000 }, /* R20250 */ + { 0x0000, 0x0000, 0x0000 }, /* R20251 */ + { 0x0000, 0x0000, 0x0000 }, /* R20252 */ + { 0x0000, 0x0000, 0x0000 }, /* R20253 */ + { 0x0000, 0x0000, 0x0000 }, /* R20254 */ + { 0x0000, 0x0000, 0x0000 }, /* R20255 */ + { 0x0000, 0x0000, 0x0000 }, /* R20256 */ + { 0x0000, 0x0000, 0x0000 }, /* R20257 */ + { 0x0000, 0x0000, 0x0000 }, /* R20258 */ + { 0x0000, 0x0000, 0x0000 }, /* R20259 */ + { 0x0000, 0x0000, 0x0000 }, /* R20260 */ + { 0x0000, 0x0000, 0x0000 }, /* R20261 */ + { 0x0000, 0x0000, 0x0000 }, /* R20262 */ + { 0x0000, 0x0000, 0x0000 }, /* R20263 */ + { 0x0000, 0x0000, 0x0000 }, /* R20264 */ + { 0x0000, 0x0000, 0x0000 }, /* R20265 */ + { 0x0000, 0x0000, 0x0000 }, /* R20266 */ + { 0x0000, 0x0000, 0x0000 }, /* R20267 */ + { 0x0000, 0x0000, 0x0000 }, /* R20268 */ + { 0x0000, 0x0000, 0x0000 }, /* R20269 */ + { 0x0000, 0x0000, 0x0000 }, /* R20270 */ + { 0x0000, 0x0000, 0x0000 }, /* R20271 */ + { 0x0000, 0x0000, 0x0000 }, /* R20272 */ + { 0x0000, 0x0000, 0x0000 }, /* R20273 */ + { 0x0000, 0x0000, 0x0000 }, /* R20274 */ + { 0x0000, 0x0000, 0x0000 }, /* R20275 */ + { 0x0000, 0x0000, 0x0000 }, /* R20276 */ + { 0x0000, 0x0000, 0x0000 }, /* R20277 */ + { 0x0000, 0x0000, 0x0000 }, /* R20278 */ + { 0x0000, 0x0000, 0x0000 }, /* R20279 */ + { 0x0000, 0x0000, 0x0000 }, /* R20280 */ + { 0x0000, 0x0000, 0x0000 }, /* R20281 */ + { 0x0000, 0x0000, 0x0000 }, /* R20282 */ + { 0x0000, 0x0000, 0x0000 }, /* R20283 */ + { 0x0000, 0x0000, 0x0000 }, /* R20284 */ + { 0x0000, 0x0000, 0x0000 }, /* R20285 */ + { 0x0000, 0x0000, 0x0000 }, /* R20286 */ + { 0x0000, 0x0000, 0x0000 }, /* R20287 */ + { 0x0000, 0x0000, 0x0000 }, /* R20288 */ + { 0x0000, 0x0000, 0x0000 }, /* R20289 */ + { 0x0000, 0x0000, 0x0000 }, /* R20290 */ + { 0x0000, 0x0000, 0x0000 }, /* R20291 */ + { 0x0000, 0x0000, 0x0000 }, /* R20292 */ + { 0x0000, 0x0000, 0x0000 }, /* R20293 */ + { 0x0000, 0x0000, 0x0000 }, /* R20294 */ + { 0x0000, 0x0000, 0x0000 }, /* R20295 */ + { 0x0000, 0x0000, 0x0000 }, /* R20296 */ + { 0x0000, 0x0000, 0x0000 }, /* R20297 */ + { 0x0000, 0x0000, 0x0000 }, /* R20298 */ + { 0x0000, 0x0000, 0x0000 }, /* R20299 */ + { 0x0000, 0x0000, 0x0000 }, /* R20300 */ + { 0x0000, 0x0000, 0x0000 }, /* R20301 */ + { 0x0000, 0x0000, 0x0000 }, /* R20302 */ + { 0x0000, 0x0000, 0x0000 }, /* R20303 */ + { 0x0000, 0x0000, 0x0000 }, /* R20304 */ + { 0x0000, 0x0000, 0x0000 }, /* R20305 */ + { 0x0000, 0x0000, 0x0000 }, /* R20306 */ + { 0x0000, 0x0000, 0x0000 }, /* R20307 */ + { 0x0000, 0x0000, 0x0000 }, /* R20308 */ + { 0x0000, 0x0000, 0x0000 }, /* R20309 */ + { 0x0000, 0x0000, 0x0000 }, /* R20310 */ + { 0x0000, 0x0000, 0x0000 }, /* R20311 */ + { 0x0000, 0x0000, 0x0000 }, /* R20312 */ + { 0x0000, 0x0000, 0x0000 }, /* R20313 */ + { 0x0000, 0x0000, 0x0000 }, /* R20314 */ + { 0x0000, 0x0000, 0x0000 }, /* R20315 */ + { 0x0000, 0x0000, 0x0000 }, /* R20316 */ + { 0x0000, 0x0000, 0x0000 }, /* R20317 */ + { 0x0000, 0x0000, 0x0000 }, /* R20318 */ + { 0x0000, 0x0000, 0x0000 }, /* R20319 */ + { 0x0000, 0x0000, 0x0000 }, /* R20320 */ + { 0x0000, 0x0000, 0x0000 }, /* R20321 */ + { 0x0000, 0x0000, 0x0000 }, /* R20322 */ + { 0x0000, 0x0000, 0x0000 }, /* R20323 */ + { 0x0000, 0x0000, 0x0000 }, /* R20324 */ + { 0x0000, 0x0000, 0x0000 }, /* R20325 */ + { 0x0000, 0x0000, 0x0000 }, /* R20326 */ + { 0x0000, 0x0000, 0x0000 }, /* R20327 */ + { 0x0000, 0x0000, 0x0000 }, /* R20328 */ + { 0x0000, 0x0000, 0x0000 }, /* R20329 */ + { 0x0000, 0x0000, 0x0000 }, /* R20330 */ + { 0x0000, 0x0000, 0x0000 }, /* R20331 */ + { 0x0000, 0x0000, 0x0000 }, /* R20332 */ + { 0x0000, 0x0000, 0x0000 }, /* R20333 */ + { 0x0000, 0x0000, 0x0000 }, /* R20334 */ + { 0x0000, 0x0000, 0x0000 }, /* R20335 */ + { 0x0000, 0x0000, 0x0000 }, /* R20336 */ + { 0x0000, 0x0000, 0x0000 }, /* R20337 */ + { 0x0000, 0x0000, 0x0000 }, /* R20338 */ + { 0x0000, 0x0000, 0x0000 }, /* R20339 */ + { 0x0000, 0x0000, 0x0000 }, /* R20340 */ + { 0x0000, 0x0000, 0x0000 }, /* R20341 */ + { 0x0000, 0x0000, 0x0000 }, /* R20342 */ + { 0x0000, 0x0000, 0x0000 }, /* R20343 */ + { 0x0000, 0x0000, 0x0000 }, /* R20344 */ + { 0x0000, 0x0000, 0x0000 }, /* R20345 */ + { 0x0000, 0x0000, 0x0000 }, /* R20346 */ + { 0x0000, 0x0000, 0x0000 }, /* R20347 */ + { 0x0000, 0x0000, 0x0000 }, /* R20348 */ + { 0x0000, 0x0000, 0x0000 }, /* R20349 */ + { 0x0000, 0x0000, 0x0000 }, /* R20350 */ + { 0x0000, 0x0000, 0x0000 }, /* R20351 */ + { 0x0000, 0x0000, 0x0000 }, /* R20352 */ + { 0x0000, 0x0000, 0x0000 }, /* R20353 */ + { 0x0000, 0x0000, 0x0000 }, /* R20354 */ + { 0x0000, 0x0000, 0x0000 }, /* R20355 */ + { 0x0000, 0x0000, 0x0000 }, /* R20356 */ + { 0x0000, 0x0000, 0x0000 }, /* R20357 */ + { 0x0000, 0x0000, 0x0000 }, /* R20358 */ + { 0x0000, 0x0000, 0x0000 }, /* R20359 */ + { 0x0000, 0x0000, 0x0000 }, /* R20360 */ + { 0x0000, 0x0000, 0x0000 }, /* R20361 */ + { 0x0000, 0x0000, 0x0000 }, /* R20362 */ + { 0x0000, 0x0000, 0x0000 }, /* R20363 */ + { 0x0000, 0x0000, 0x0000 }, /* R20364 */ + { 0x0000, 0x0000, 0x0000 }, /* R20365 */ + { 0x0000, 0x0000, 0x0000 }, /* R20366 */ + { 0x0000, 0x0000, 0x0000 }, /* R20367 */ + { 0x0000, 0x0000, 0x0000 }, /* R20368 */ + { 0x0000, 0x0000, 0x0000 }, /* R20369 */ + { 0x0000, 0x0000, 0x0000 }, /* R20370 */ + { 0x0000, 0x0000, 0x0000 }, /* R20371 */ + { 0x0000, 0x0000, 0x0000 }, /* R20372 */ + { 0x0000, 0x0000, 0x0000 }, /* R20373 */ + { 0x0000, 0x0000, 0x0000 }, /* R20374 */ + { 0x0000, 0x0000, 0x0000 }, /* R20375 */ + { 0x0000, 0x0000, 0x0000 }, /* R20376 */ + { 0x0000, 0x0000, 0x0000 }, /* R20377 */ + { 0x0000, 0x0000, 0x0000 }, /* R20378 */ + { 0x0000, 0x0000, 0x0000 }, /* R20379 */ + { 0x0000, 0x0000, 0x0000 }, /* R20380 */ + { 0x0000, 0x0000, 0x0000 }, /* R20381 */ + { 0x0000, 0x0000, 0x0000 }, /* R20382 */ + { 0x0000, 0x0000, 0x0000 }, /* R20383 */ + { 0x0000, 0x0000, 0x0000 }, /* R20384 */ + { 0x0000, 0x0000, 0x0000 }, /* R20385 */ + { 0x0000, 0x0000, 0x0000 }, /* R20386 */ + { 0x0000, 0x0000, 0x0000 }, /* R20387 */ + { 0x0000, 0x0000, 0x0000 }, /* R20388 */ + { 0x0000, 0x0000, 0x0000 }, /* R20389 */ + { 0x0000, 0x0000, 0x0000 }, /* R20390 */ + { 0x0000, 0x0000, 0x0000 }, /* R20391 */ + { 0x0000, 0x0000, 0x0000 }, /* R20392 */ + { 0x0000, 0x0000, 0x0000 }, /* R20393 */ + { 0x0000, 0x0000, 0x0000 }, /* R20394 */ + { 0x0000, 0x0000, 0x0000 }, /* R20395 */ + { 0x0000, 0x0000, 0x0000 }, /* R20396 */ + { 0x0000, 0x0000, 0x0000 }, /* R20397 */ + { 0x0000, 0x0000, 0x0000 }, /* R20398 */ + { 0x0000, 0x0000, 0x0000 }, /* R20399 */ + { 0x0000, 0x0000, 0x0000 }, /* R20400 */ + { 0x0000, 0x0000, 0x0000 }, /* R20401 */ + { 0x0000, 0x0000, 0x0000 }, /* R20402 */ + { 0x0000, 0x0000, 0x0000 }, /* R20403 */ + { 0x0000, 0x0000, 0x0000 }, /* R20404 */ + { 0x0000, 0x0000, 0x0000 }, /* R20405 */ + { 0x0000, 0x0000, 0x0000 }, /* R20406 */ + { 0x0000, 0x0000, 0x0000 }, /* R20407 */ + { 0x0000, 0x0000, 0x0000 }, /* R20408 */ + { 0x0000, 0x0000, 0x0000 }, /* R20409 */ + { 0x0000, 0x0000, 0x0000 }, /* R20410 */ + { 0x0000, 0x0000, 0x0000 }, /* R20411 */ + { 0x0000, 0x0000, 0x0000 }, /* R20412 */ + { 0x0000, 0x0000, 0x0000 }, /* R20413 */ + { 0x0000, 0x0000, 0x0000 }, /* R20414 */ + { 0x0000, 0x0000, 0x0000 }, /* R20415 */ + { 0x0000, 0x0000, 0x0000 }, /* R20416 */ + { 0x0000, 0x0000, 0x0000 }, /* R20417 */ + { 0x0000, 0x0000, 0x0000 }, /* R20418 */ + { 0x0000, 0x0000, 0x0000 }, /* R20419 */ + { 0x0000, 0x0000, 0x0000 }, /* R20420 */ + { 0x0000, 0x0000, 0x0000 }, /* R20421 */ + { 0x0000, 0x0000, 0x0000 }, /* R20422 */ + { 0x0000, 0x0000, 0x0000 }, /* R20423 */ + { 0x0000, 0x0000, 0x0000 }, /* R20424 */ + { 0x0000, 0x0000, 0x0000 }, /* R20425 */ + { 0x0000, 0x0000, 0x0000 }, /* R20426 */ + { 0x0000, 0x0000, 0x0000 }, /* R20427 */ + { 0x0000, 0x0000, 0x0000 }, /* R20428 */ + { 0x0000, 0x0000, 0x0000 }, /* R20429 */ + { 0x0000, 0x0000, 0x0000 }, /* R20430 */ + { 0x0000, 0x0000, 0x0000 }, /* R20431 */ + { 0x0000, 0x0000, 0x0000 }, /* R20432 */ + { 0x0000, 0x0000, 0x0000 }, /* R20433 */ + { 0x0000, 0x0000, 0x0000 }, /* R20434 */ + { 0x0000, 0x0000, 0x0000 }, /* R20435 */ + { 0x0000, 0x0000, 0x0000 }, /* R20436 */ + { 0x0000, 0x0000, 0x0000 }, /* R20437 */ + { 0x0000, 0x0000, 0x0000 }, /* R20438 */ + { 0x0000, 0x0000, 0x0000 }, /* R20439 */ + { 0x0000, 0x0000, 0x0000 }, /* R20440 */ + { 0x0000, 0x0000, 0x0000 }, /* R20441 */ + { 0x0000, 0x0000, 0x0000 }, /* R20442 */ + { 0x0000, 0x0000, 0x0000 }, /* R20443 */ + { 0x0000, 0x0000, 0x0000 }, /* R20444 */ + { 0x0000, 0x0000, 0x0000 }, /* R20445 */ + { 0x0000, 0x0000, 0x0000 }, /* R20446 */ + { 0x0000, 0x0000, 0x0000 }, /* R20447 */ + { 0x0000, 0x0000, 0x0000 }, /* R20448 */ + { 0x0000, 0x0000, 0x0000 }, /* R20449 */ + { 0x0000, 0x0000, 0x0000 }, /* R20450 */ + { 0x0000, 0x0000, 0x0000 }, /* R20451 */ + { 0x0000, 0x0000, 0x0000 }, /* R20452 */ + { 0x0000, 0x0000, 0x0000 }, /* R20453 */ + { 0x0000, 0x0000, 0x0000 }, /* R20454 */ + { 0x0000, 0x0000, 0x0000 }, /* R20455 */ + { 0x0000, 0x0000, 0x0000 }, /* R20456 */ + { 0x0000, 0x0000, 0x0000 }, /* R20457 */ + { 0x0000, 0x0000, 0x0000 }, /* R20458 */ + { 0x0000, 0x0000, 0x0000 }, /* R20459 */ + { 0x0000, 0x0000, 0x0000 }, /* R20460 */ + { 0x0000, 0x0000, 0x0000 }, /* R20461 */ + { 0x0000, 0x0000, 0x0000 }, /* R20462 */ + { 0x0000, 0x0000, 0x0000 }, /* R20463 */ + { 0x0000, 0x0000, 0x0000 }, /* R20464 */ + { 0x0000, 0x0000, 0x0000 }, /* R20465 */ + { 0x0000, 0x0000, 0x0000 }, /* R20466 */ + { 0x0000, 0x0000, 0x0000 }, /* R20467 */ + { 0x0000, 0x0000, 0x0000 }, /* R20468 */ + { 0x0000, 0x0000, 0x0000 }, /* R20469 */ + { 0x0000, 0x0000, 0x0000 }, /* R20470 */ + { 0x0000, 0x0000, 0x0000 }, /* R20471 */ + { 0x0000, 0x0000, 0x0000 }, /* R20472 */ + { 0x0000, 0x0000, 0x0000 }, /* R20473 */ + { 0x0000, 0x0000, 0x0000 }, /* R20474 */ + { 0x0000, 0x0000, 0x0000 }, /* R20475 */ + { 0x0000, 0x0000, 0x0000 }, /* R20476 */ + { 0x0000, 0x0000, 0x0000 }, /* R20477 */ + { 0x0000, 0x0000, 0x0000 }, /* R20478 */ + { 0x0000, 0x0000, 0x0000 }, /* R20479 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20480 - DACR_RETUNE_C1_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20481 - DACR_RETUNE_C1_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20482 - DACR_RETUNE_C2_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20483 - DACR_RETUNE_C2_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20484 - DACR_RETUNE_C3_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20485 - DACR_RETUNE_C3_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20486 - DACR_RETUNE_C4_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20487 - DACR_RETUNE_C4_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20488 - DACR_RETUNE_C5_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20489 - DACR_RETUNE_C5_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20490 - DACR_RETUNE_C6_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20491 - DACR_RETUNE_C6_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20492 - DACR_RETUNE_C7_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20493 - DACR_RETUNE_C7_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20494 - DACR_RETUNE_C8_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20495 - DACR_RETUNE_C8_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20496 - DACR_RETUNE_C9_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20497 - DACR_RETUNE_C9_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20498 - DACR_RETUNE_C10_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20499 - DACR_RETUNE_C10_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20500 - DACR_RETUNE_C11_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20501 - DACR_RETUNE_C11_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20502 - DACR_RETUNE_C12_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20503 - DACR_RETUNE_C12_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20504 - DACR_RETUNE_C13_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20505 - DACR_RETUNE_C13_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20506 - DACR_RETUNE_C14_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20507 - DACR_RETUNE_C14_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20508 - DACR_RETUNE_C15_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20509 - DACR_RETUNE_C15_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20510 - DACR_RETUNE_C16_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20511 - DACR_RETUNE_C16_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20512 - DACR_RETUNE_C17_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20513 - DACR_RETUNE_C17_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20514 - DACR_RETUNE_C18_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20515 - DACR_RETUNE_C18_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20516 - DACR_RETUNE_C19_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20517 - DACR_RETUNE_C19_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20518 - DACR_RETUNE_C20_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20519 - DACR_RETUNE_C20_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20520 - DACR_RETUNE_C21_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20521 - DACR_RETUNE_C21_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20522 - DACR_RETUNE_C22_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20523 - DACR_RETUNE_C22_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20524 - DACR_RETUNE_C23_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20525 - DACR_RETUNE_C23_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20526 - DACR_RETUNE_C24_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20527 - DACR_RETUNE_C24_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20528 - DACR_RETUNE_C25_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20529 - DACR_RETUNE_C25_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20530 - DACR_RETUNE_C26_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20531 - DACR_RETUNE_C26_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20532 - DACR_RETUNE_C27_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20533 - DACR_RETUNE_C27_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20534 - DACR_RETUNE_C28_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20535 - DACR_RETUNE_C28_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20536 - DACR_RETUNE_C29_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20537 - DACR_RETUNE_C29_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20538 - DACR_RETUNE_C30_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20539 - DACR_RETUNE_C30_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20540 - DACR_RETUNE_C31_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20541 - DACR_RETUNE_C31_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20542 - DACR_RETUNE_C32_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20543 - DACR_RETUNE_C32_0 */ + { 0x0000, 0x0000, 0x0000 }, /* R20544 */ + { 0x0000, 0x0000, 0x0000 }, /* R20545 */ + { 0x0000, 0x0000, 0x0000 }, /* R20546 */ + { 0x0000, 0x0000, 0x0000 }, /* R20547 */ + { 0x0000, 0x0000, 0x0000 }, /* R20548 */ + { 0x0000, 0x0000, 0x0000 }, /* R20549 */ + { 0x0000, 0x0000, 0x0000 }, /* R20550 */ + { 0x0000, 0x0000, 0x0000 }, /* R20551 */ + { 0x0000, 0x0000, 0x0000 }, /* R20552 */ + { 0x0000, 0x0000, 0x0000 }, /* R20553 */ + { 0x0000, 0x0000, 0x0000 }, /* R20554 */ + { 0x0000, 0x0000, 0x0000 }, /* R20555 */ + { 0x0000, 0x0000, 0x0000 }, /* R20556 */ + { 0x0000, 0x0000, 0x0000 }, /* R20557 */ + { 0x0000, 0x0000, 0x0000 }, /* R20558 */ + { 0x0000, 0x0000, 0x0000 }, /* R20559 */ + { 0x0000, 0x0000, 0x0000 }, /* R20560 */ + { 0x0000, 0x0000, 0x0000 }, /* R20561 */ + { 0x0000, 0x0000, 0x0000 }, /* R20562 */ + { 0x0000, 0x0000, 0x0000 }, /* R20563 */ + { 0x0000, 0x0000, 0x0000 }, /* R20564 */ + { 0x0000, 0x0000, 0x0000 }, /* R20565 */ + { 0x0000, 0x0000, 0x0000 }, /* R20566 */ + { 0x0000, 0x0000, 0x0000 }, /* R20567 */ + { 0x0000, 0x0000, 0x0000 }, /* R20568 */ + { 0x0000, 0x0000, 0x0000 }, /* R20569 */ + { 0x0000, 0x0000, 0x0000 }, /* R20570 */ + { 0x0000, 0x0000, 0x0000 }, /* R20571 */ + { 0x0000, 0x0000, 0x0000 }, /* R20572 */ + { 0x0000, 0x0000, 0x0000 }, /* R20573 */ + { 0x0000, 0x0000, 0x0000 }, /* R20574 */ + { 0x0000, 0x0000, 0x0000 }, /* R20575 */ + { 0x0000, 0x0000, 0x0000 }, /* R20576 */ + { 0x0000, 0x0000, 0x0000 }, /* R20577 */ + { 0x0000, 0x0000, 0x0000 }, /* R20578 */ + { 0x0000, 0x0000, 0x0000 }, /* R20579 */ + { 0x0000, 0x0000, 0x0000 }, /* R20580 */ + { 0x0000, 0x0000, 0x0000 }, /* R20581 */ + { 0x0000, 0x0000, 0x0000 }, /* R20582 */ + { 0x0000, 0x0000, 0x0000 }, /* R20583 */ + { 0x0000, 0x0000, 0x0000 }, /* R20584 */ + { 0x0000, 0x0000, 0x0000 }, /* R20585 */ + { 0x0000, 0x0000, 0x0000 }, /* R20586 */ + { 0x0000, 0x0000, 0x0000 }, /* R20587 */ + { 0x0000, 0x0000, 0x0000 }, /* R20588 */ + { 0x0000, 0x0000, 0x0000 }, /* R20589 */ + { 0x0000, 0x0000, 0x0000 }, /* R20590 */ + { 0x0000, 0x0000, 0x0000 }, /* R20591 */ + { 0x0000, 0x0000, 0x0000 }, /* R20592 */ + { 0x0000, 0x0000, 0x0000 }, /* R20593 */ + { 0x0000, 0x0000, 0x0000 }, /* R20594 */ + { 0x0000, 0x0000, 0x0000 }, /* R20595 */ + { 0x0000, 0x0000, 0x0000 }, /* R20596 */ + { 0x0000, 0x0000, 0x0000 }, /* R20597 */ + { 0x0000, 0x0000, 0x0000 }, /* R20598 */ + { 0x0000, 0x0000, 0x0000 }, /* R20599 */ + { 0x0000, 0x0000, 0x0000 }, /* R20600 */ + { 0x0000, 0x0000, 0x0000 }, /* R20601 */ + { 0x0000, 0x0000, 0x0000 }, /* R20602 */ + { 0x0000, 0x0000, 0x0000 }, /* R20603 */ + { 0x0000, 0x0000, 0x0000 }, /* R20604 */ + { 0x0000, 0x0000, 0x0000 }, /* R20605 */ + { 0x0000, 0x0000, 0x0000 }, /* R20606 */ + { 0x0000, 0x0000, 0x0000 }, /* R20607 */ + { 0x0000, 0x0000, 0x0000 }, /* R20608 */ + { 0x0000, 0x0000, 0x0000 }, /* R20609 */ + { 0x0000, 0x0000, 0x0000 }, /* R20610 */ + { 0x0000, 0x0000, 0x0000 }, /* R20611 */ + { 0x0000, 0x0000, 0x0000 }, /* R20612 */ + { 0x0000, 0x0000, 0x0000 }, /* R20613 */ + { 0x0000, 0x0000, 0x0000 }, /* R20614 */ + { 0x0000, 0x0000, 0x0000 }, /* R20615 */ + { 0x0000, 0x0000, 0x0000 }, /* R20616 */ + { 0x0000, 0x0000, 0x0000 }, /* R20617 */ + { 0x0000, 0x0000, 0x0000 }, /* R20618 */ + { 0x0000, 0x0000, 0x0000 }, /* R20619 */ + { 0x0000, 0x0000, 0x0000 }, /* R20620 */ + { 0x0000, 0x0000, 0x0000 }, /* R20621 */ + { 0x0000, 0x0000, 0x0000 }, /* R20622 */ + { 0x0000, 0x0000, 0x0000 }, /* R20623 */ + { 0x0000, 0x0000, 0x0000 }, /* R20624 */ + { 0x0000, 0x0000, 0x0000 }, /* R20625 */ + { 0x0000, 0x0000, 0x0000 }, /* R20626 */ + { 0x0000, 0x0000, 0x0000 }, /* R20627 */ + { 0x0000, 0x0000, 0x0000 }, /* R20628 */ + { 0x0000, 0x0000, 0x0000 }, /* R20629 */ + { 0x0000, 0x0000, 0x0000 }, /* R20630 */ + { 0x0000, 0x0000, 0x0000 }, /* R20631 */ + { 0x0000, 0x0000, 0x0000 }, /* R20632 */ + { 0x0000, 0x0000, 0x0000 }, /* R20633 */ + { 0x0000, 0x0000, 0x0000 }, /* R20634 */ + { 0x0000, 0x0000, 0x0000 }, /* R20635 */ + { 0x0000, 0x0000, 0x0000 }, /* R20636 */ + { 0x0000, 0x0000, 0x0000 }, /* R20637 */ + { 0x0000, 0x0000, 0x0000 }, /* R20638 */ + { 0x0000, 0x0000, 0x0000 }, /* R20639 */ + { 0x0000, 0x0000, 0x0000 }, /* R20640 */ + { 0x0000, 0x0000, 0x0000 }, /* R20641 */ + { 0x0000, 0x0000, 0x0000 }, /* R20642 */ + { 0x0000, 0x0000, 0x0000 }, /* R20643 */ + { 0x0000, 0x0000, 0x0000 }, /* R20644 */ + { 0x0000, 0x0000, 0x0000 }, /* R20645 */ + { 0x0000, 0x0000, 0x0000 }, /* R20646 */ + { 0x0000, 0x0000, 0x0000 }, /* R20647 */ + { 0x0000, 0x0000, 0x0000 }, /* R20648 */ + { 0x0000, 0x0000, 0x0000 }, /* R20649 */ + { 0x0000, 0x0000, 0x0000 }, /* R20650 */ + { 0x0000, 0x0000, 0x0000 }, /* R20651 */ + { 0x0000, 0x0000, 0x0000 }, /* R20652 */ + { 0x0000, 0x0000, 0x0000 }, /* R20653 */ + { 0x0000, 0x0000, 0x0000 }, /* R20654 */ + { 0x0000, 0x0000, 0x0000 }, /* R20655 */ + { 0x0000, 0x0000, 0x0000 }, /* R20656 */ + { 0x0000, 0x0000, 0x0000 }, /* R20657 */ + { 0x0000, 0x0000, 0x0000 }, /* R20658 */ + { 0x0000, 0x0000, 0x0000 }, /* R20659 */ + { 0x0000, 0x0000, 0x0000 }, /* R20660 */ + { 0x0000, 0x0000, 0x0000 }, /* R20661 */ + { 0x0000, 0x0000, 0x0000 }, /* R20662 */ + { 0x0000, 0x0000, 0x0000 }, /* R20663 */ + { 0x0000, 0x0000, 0x0000 }, /* R20664 */ + { 0x0000, 0x0000, 0x0000 }, /* R20665 */ + { 0x0000, 0x0000, 0x0000 }, /* R20666 */ + { 0x0000, 0x0000, 0x0000 }, /* R20667 */ + { 0x0000, 0x0000, 0x0000 }, /* R20668 */ + { 0x0000, 0x0000, 0x0000 }, /* R20669 */ + { 0x0000, 0x0000, 0x0000 }, /* R20670 */ + { 0x0000, 0x0000, 0x0000 }, /* R20671 */ + { 0x0000, 0x0000, 0x0000 }, /* R20672 */ + { 0x0000, 0x0000, 0x0000 }, /* R20673 */ + { 0x0000, 0x0000, 0x0000 }, /* R20674 */ + { 0x0000, 0x0000, 0x0000 }, /* R20675 */ + { 0x0000, 0x0000, 0x0000 }, /* R20676 */ + { 0x0000, 0x0000, 0x0000 }, /* R20677 */ + { 0x0000, 0x0000, 0x0000 }, /* R20678 */ + { 0x0000, 0x0000, 0x0000 }, /* R20679 */ + { 0x0000, 0x0000, 0x0000 }, /* R20680 */ + { 0x0000, 0x0000, 0x0000 }, /* R20681 */ + { 0x0000, 0x0000, 0x0000 }, /* R20682 */ + { 0x0000, 0x0000, 0x0000 }, /* R20683 */ + { 0x0000, 0x0000, 0x0000 }, /* R20684 */ + { 0x0000, 0x0000, 0x0000 }, /* R20685 */ + { 0x0000, 0x0000, 0x0000 }, /* R20686 */ + { 0x0000, 0x0000, 0x0000 }, /* R20687 */ + { 0x0000, 0x0000, 0x0000 }, /* R20688 */ + { 0x0000, 0x0000, 0x0000 }, /* R20689 */ + { 0x0000, 0x0000, 0x0000 }, /* R20690 */ + { 0x0000, 0x0000, 0x0000 }, /* R20691 */ + { 0x0000, 0x0000, 0x0000 }, /* R20692 */ + { 0x0000, 0x0000, 0x0000 }, /* R20693 */ + { 0x0000, 0x0000, 0x0000 }, /* R20694 */ + { 0x0000, 0x0000, 0x0000 }, /* R20695 */ + { 0x0000, 0x0000, 0x0000 }, /* R20696 */ + { 0x0000, 0x0000, 0x0000 }, /* R20697 */ + { 0x0000, 0x0000, 0x0000 }, /* R20698 */ + { 0x0000, 0x0000, 0x0000 }, /* R20699 */ + { 0x0000, 0x0000, 0x0000 }, /* R20700 */ + { 0x0000, 0x0000, 0x0000 }, /* R20701 */ + { 0x0000, 0x0000, 0x0000 }, /* R20702 */ + { 0x0000, 0x0000, 0x0000 }, /* R20703 */ + { 0x0000, 0x0000, 0x0000 }, /* R20704 */ + { 0x0000, 0x0000, 0x0000 }, /* R20705 */ + { 0x0000, 0x0000, 0x0000 }, /* R20706 */ + { 0x0000, 0x0000, 0x0000 }, /* R20707 */ + { 0x0000, 0x0000, 0x0000 }, /* R20708 */ + { 0x0000, 0x0000, 0x0000 }, /* R20709 */ + { 0x0000, 0x0000, 0x0000 }, /* R20710 */ + { 0x0000, 0x0000, 0x0000 }, /* R20711 */ + { 0x0000, 0x0000, 0x0000 }, /* R20712 */ + { 0x0000, 0x0000, 0x0000 }, /* R20713 */ + { 0x0000, 0x0000, 0x0000 }, /* R20714 */ + { 0x0000, 0x0000, 0x0000 }, /* R20715 */ + { 0x0000, 0x0000, 0x0000 }, /* R20716 */ + { 0x0000, 0x0000, 0x0000 }, /* R20717 */ + { 0x0000, 0x0000, 0x0000 }, /* R20718 */ + { 0x0000, 0x0000, 0x0000 }, /* R20719 */ + { 0x0000, 0x0000, 0x0000 }, /* R20720 */ + { 0x0000, 0x0000, 0x0000 }, /* R20721 */ + { 0x0000, 0x0000, 0x0000 }, /* R20722 */ + { 0x0000, 0x0000, 0x0000 }, /* R20723 */ + { 0x0000, 0x0000, 0x0000 }, /* R20724 */ + { 0x0000, 0x0000, 0x0000 }, /* R20725 */ + { 0x0000, 0x0000, 0x0000 }, /* R20726 */ + { 0x0000, 0x0000, 0x0000 }, /* R20727 */ + { 0x0000, 0x0000, 0x0000 }, /* R20728 */ + { 0x0000, 0x0000, 0x0000 }, /* R20729 */ + { 0x0000, 0x0000, 0x0000 }, /* R20730 */ + { 0x0000, 0x0000, 0x0000 }, /* R20731 */ + { 0x0000, 0x0000, 0x0000 }, /* R20732 */ + { 0x0000, 0x0000, 0x0000 }, /* R20733 */ + { 0x0000, 0x0000, 0x0000 }, /* R20734 */ + { 0x0000, 0x0000, 0x0000 }, /* R20735 */ + { 0x0000, 0x0000, 0x0000 }, /* R20736 */ + { 0x0000, 0x0000, 0x0000 }, /* R20737 */ + { 0x0000, 0x0000, 0x0000 }, /* R20738 */ + { 0x0000, 0x0000, 0x0000 }, /* R20739 */ + { 0x0000, 0x0000, 0x0000 }, /* R20740 */ + { 0x0000, 0x0000, 0x0000 }, /* R20741 */ + { 0x0000, 0x0000, 0x0000 }, /* R20742 */ + { 0x0000, 0x0000, 0x0000 }, /* R20743 */ + { 0x0000, 0x0000, 0x0000 }, /* R20744 */ + { 0x0000, 0x0000, 0x0000 }, /* R20745 */ + { 0x0000, 0x0000, 0x0000 }, /* R20746 */ + { 0x0000, 0x0000, 0x0000 }, /* R20747 */ + { 0x0000, 0x0000, 0x0000 }, /* R20748 */ + { 0x0000, 0x0000, 0x0000 }, /* R20749 */ + { 0x0000, 0x0000, 0x0000 }, /* R20750 */ + { 0x0000, 0x0000, 0x0000 }, /* R20751 */ + { 0x0000, 0x0000, 0x0000 }, /* R20752 */ + { 0x0000, 0x0000, 0x0000 }, /* R20753 */ + { 0x0000, 0x0000, 0x0000 }, /* R20754 */ + { 0x0000, 0x0000, 0x0000 }, /* R20755 */ + { 0x0000, 0x0000, 0x0000 }, /* R20756 */ + { 0x0000, 0x0000, 0x0000 }, /* R20757 */ + { 0x0000, 0x0000, 0x0000 }, /* R20758 */ + { 0x0000, 0x0000, 0x0000 }, /* R20759 */ + { 0x0000, 0x0000, 0x0000 }, /* R20760 */ + { 0x0000, 0x0000, 0x0000 }, /* R20761 */ + { 0x0000, 0x0000, 0x0000 }, /* R20762 */ + { 0x0000, 0x0000, 0x0000 }, /* R20763 */ + { 0x0000, 0x0000, 0x0000 }, /* R20764 */ + { 0x0000, 0x0000, 0x0000 }, /* R20765 */ + { 0x0000, 0x0000, 0x0000 }, /* R20766 */ + { 0x0000, 0x0000, 0x0000 }, /* R20767 */ + { 0x0000, 0x0000, 0x0000 }, /* R20768 */ + { 0x0000, 0x0000, 0x0000 }, /* R20769 */ + { 0x0000, 0x0000, 0x0000 }, /* R20770 */ + { 0x0000, 0x0000, 0x0000 }, /* R20771 */ + { 0x0000, 0x0000, 0x0000 }, /* R20772 */ + { 0x0000, 0x0000, 0x0000 }, /* R20773 */ + { 0x0000, 0x0000, 0x0000 }, /* R20774 */ + { 0x0000, 0x0000, 0x0000 }, /* R20775 */ + { 0x0000, 0x0000, 0x0000 }, /* R20776 */ + { 0x0000, 0x0000, 0x0000 }, /* R20777 */ + { 0x0000, 0x0000, 0x0000 }, /* R20778 */ + { 0x0000, 0x0000, 0x0000 }, /* R20779 */ + { 0x0000, 0x0000, 0x0000 }, /* R20780 */ + { 0x0000, 0x0000, 0x0000 }, /* R20781 */ + { 0x0000, 0x0000, 0x0000 }, /* R20782 */ + { 0x0000, 0x0000, 0x0000 }, /* R20783 */ + { 0x0000, 0x0000, 0x0000 }, /* R20784 */ + { 0x0000, 0x0000, 0x0000 }, /* R20785 */ + { 0x0000, 0x0000, 0x0000 }, /* R20786 */ + { 0x0000, 0x0000, 0x0000 }, /* R20787 */ + { 0x0000, 0x0000, 0x0000 }, /* R20788 */ + { 0x0000, 0x0000, 0x0000 }, /* R20789 */ + { 0x0000, 0x0000, 0x0000 }, /* R20790 */ + { 0x0000, 0x0000, 0x0000 }, /* R20791 */ + { 0x0000, 0x0000, 0x0000 }, /* R20792 */ + { 0x0000, 0x0000, 0x0000 }, /* R20793 */ + { 0x0000, 0x0000, 0x0000 }, /* R20794 */ + { 0x0000, 0x0000, 0x0000 }, /* R20795 */ + { 0x0000, 0x0000, 0x0000 }, /* R20796 */ + { 0x0000, 0x0000, 0x0000 }, /* R20797 */ + { 0x0000, 0x0000, 0x0000 }, /* R20798 */ + { 0x0000, 0x0000, 0x0000 }, /* R20799 */ + { 0x0000, 0x0000, 0x0000 }, /* R20800 */ + { 0x0000, 0x0000, 0x0000 }, /* R20801 */ + { 0x0000, 0x0000, 0x0000 }, /* R20802 */ + { 0x0000, 0x0000, 0x0000 }, /* R20803 */ + { 0x0000, 0x0000, 0x0000 }, /* R20804 */ + { 0x0000, 0x0000, 0x0000 }, /* R20805 */ + { 0x0000, 0x0000, 0x0000 }, /* R20806 */ + { 0x0000, 0x0000, 0x0000 }, /* R20807 */ + { 0x0000, 0x0000, 0x0000 }, /* R20808 */ + { 0x0000, 0x0000, 0x0000 }, /* R20809 */ + { 0x0000, 0x0000, 0x0000 }, /* R20810 */ + { 0x0000, 0x0000, 0x0000 }, /* R20811 */ + { 0x0000, 0x0000, 0x0000 }, /* R20812 */ + { 0x0000, 0x0000, 0x0000 }, /* R20813 */ + { 0x0000, 0x0000, 0x0000 }, /* R20814 */ + { 0x0000, 0x0000, 0x0000 }, /* R20815 */ + { 0x0000, 0x0000, 0x0000 }, /* R20816 */ + { 0x0000, 0x0000, 0x0000 }, /* R20817 */ + { 0x0000, 0x0000, 0x0000 }, /* R20818 */ + { 0x0000, 0x0000, 0x0000 }, /* R20819 */ + { 0x0000, 0x0000, 0x0000 }, /* R20820 */ + { 0x0000, 0x0000, 0x0000 }, /* R20821 */ + { 0x0000, 0x0000, 0x0000 }, /* R20822 */ + { 0x0000, 0x0000, 0x0000 }, /* R20823 */ + { 0x0000, 0x0000, 0x0000 }, /* R20824 */ + { 0x0000, 0x0000, 0x0000 }, /* R20825 */ + { 0x0000, 0x0000, 0x0000 }, /* R20826 */ + { 0x0000, 0x0000, 0x0000 }, /* R20827 */ + { 0x0000, 0x0000, 0x0000 }, /* R20828 */ + { 0x0000, 0x0000, 0x0000 }, /* R20829 */ + { 0x0000, 0x0000, 0x0000 }, /* R20830 */ + { 0x0000, 0x0000, 0x0000 }, /* R20831 */ + { 0x0000, 0x0000, 0x0000 }, /* R20832 */ + { 0x0000, 0x0000, 0x0000 }, /* R20833 */ + { 0x0000, 0x0000, 0x0000 }, /* R20834 */ + { 0x0000, 0x0000, 0x0000 }, /* R20835 */ + { 0x0000, 0x0000, 0x0000 }, /* R20836 */ + { 0x0000, 0x0000, 0x0000 }, /* R20837 */ + { 0x0000, 0x0000, 0x0000 }, /* R20838 */ + { 0x0000, 0x0000, 0x0000 }, /* R20839 */ + { 0x0000, 0x0000, 0x0000 }, /* R20840 */ + { 0x0000, 0x0000, 0x0000 }, /* R20841 */ + { 0x0000, 0x0000, 0x0000 }, /* R20842 */ + { 0x0000, 0x0000, 0x0000 }, /* R20843 */ + { 0x0000, 0x0000, 0x0000 }, /* R20844 */ + { 0x0000, 0x0000, 0x0000 }, /* R20845 */ + { 0x0000, 0x0000, 0x0000 }, /* R20846 */ + { 0x0000, 0x0000, 0x0000 }, /* R20847 */ + { 0x0000, 0x0000, 0x0000 }, /* R20848 */ + { 0x0000, 0x0000, 0x0000 }, /* R20849 */ + { 0x0000, 0x0000, 0x0000 }, /* R20850 */ + { 0x0000, 0x0000, 0x0000 }, /* R20851 */ + { 0x0000, 0x0000, 0x0000 }, /* R20852 */ + { 0x0000, 0x0000, 0x0000 }, /* R20853 */ + { 0x0000, 0x0000, 0x0000 }, /* R20854 */ + { 0x0000, 0x0000, 0x0000 }, /* R20855 */ + { 0x0000, 0x0000, 0x0000 }, /* R20856 */ + { 0x0000, 0x0000, 0x0000 }, /* R20857 */ + { 0x0000, 0x0000, 0x0000 }, /* R20858 */ + { 0x0000, 0x0000, 0x0000 }, /* R20859 */ + { 0x0000, 0x0000, 0x0000 }, /* R20860 */ + { 0x0000, 0x0000, 0x0000 }, /* R20861 */ + { 0x0000, 0x0000, 0x0000 }, /* R20862 */ + { 0x0000, 0x0000, 0x0000 }, /* R20863 */ + { 0x0000, 0x0000, 0x0000 }, /* R20864 */ + { 0x0000, 0x0000, 0x0000 }, /* R20865 */ + { 0x0000, 0x0000, 0x0000 }, /* R20866 */ + { 0x0000, 0x0000, 0x0000 }, /* R20867 */ + { 0x0000, 0x0000, 0x0000 }, /* R20868 */ + { 0x0000, 0x0000, 0x0000 }, /* R20869 */ + { 0x0000, 0x0000, 0x0000 }, /* R20870 */ + { 0x0000, 0x0000, 0x0000 }, /* R20871 */ + { 0x0000, 0x0000, 0x0000 }, /* R20872 */ + { 0x0000, 0x0000, 0x0000 }, /* R20873 */ + { 0x0000, 0x0000, 0x0000 }, /* R20874 */ + { 0x0000, 0x0000, 0x0000 }, /* R20875 */ + { 0x0000, 0x0000, 0x0000 }, /* R20876 */ + { 0x0000, 0x0000, 0x0000 }, /* R20877 */ + { 0x0000, 0x0000, 0x0000 }, /* R20878 */ + { 0x0000, 0x0000, 0x0000 }, /* R20879 */ + { 0x0000, 0x0000, 0x0000 }, /* R20880 */ + { 0x0000, 0x0000, 0x0000 }, /* R20881 */ + { 0x0000, 0x0000, 0x0000 }, /* R20882 */ + { 0x0000, 0x0000, 0x0000 }, /* R20883 */ + { 0x0000, 0x0000, 0x0000 }, /* R20884 */ + { 0x0000, 0x0000, 0x0000 }, /* R20885 */ + { 0x0000, 0x0000, 0x0000 }, /* R20886 */ + { 0x0000, 0x0000, 0x0000 }, /* R20887 */ + { 0x0000, 0x0000, 0x0000 }, /* R20888 */ + { 0x0000, 0x0000, 0x0000 }, /* R20889 */ + { 0x0000, 0x0000, 0x0000 }, /* R20890 */ + { 0x0000, 0x0000, 0x0000 }, /* R20891 */ + { 0x0000, 0x0000, 0x0000 }, /* R20892 */ + { 0x0000, 0x0000, 0x0000 }, /* R20893 */ + { 0x0000, 0x0000, 0x0000 }, /* R20894 */ + { 0x0000, 0x0000, 0x0000 }, /* R20895 */ + { 0x0000, 0x0000, 0x0000 }, /* R20896 */ + { 0x0000, 0x0000, 0x0000 }, /* R20897 */ + { 0x0000, 0x0000, 0x0000 }, /* R20898 */ + { 0x0000, 0x0000, 0x0000 }, /* R20899 */ + { 0x0000, 0x0000, 0x0000 }, /* R20900 */ + { 0x0000, 0x0000, 0x0000 }, /* R20901 */ + { 0x0000, 0x0000, 0x0000 }, /* R20902 */ + { 0x0000, 0x0000, 0x0000 }, /* R20903 */ + { 0x0000, 0x0000, 0x0000 }, /* R20904 */ + { 0x0000, 0x0000, 0x0000 }, /* R20905 */ + { 0x0000, 0x0000, 0x0000 }, /* R20906 */ + { 0x0000, 0x0000, 0x0000 }, /* R20907 */ + { 0x0000, 0x0000, 0x0000 }, /* R20908 */ + { 0x0000, 0x0000, 0x0000 }, /* R20909 */ + { 0x0000, 0x0000, 0x0000 }, /* R20910 */ + { 0x0000, 0x0000, 0x0000 }, /* R20911 */ + { 0x0000, 0x0000, 0x0000 }, /* R20912 */ + { 0x0000, 0x0000, 0x0000 }, /* R20913 */ + { 0x0000, 0x0000, 0x0000 }, /* R20914 */ + { 0x0000, 0x0000, 0x0000 }, /* R20915 */ + { 0x0000, 0x0000, 0x0000 }, /* R20916 */ + { 0x0000, 0x0000, 0x0000 }, /* R20917 */ + { 0x0000, 0x0000, 0x0000 }, /* R20918 */ + { 0x0000, 0x0000, 0x0000 }, /* R20919 */ + { 0x0000, 0x0000, 0x0000 }, /* R20920 */ + { 0x0000, 0x0000, 0x0000 }, /* R20921 */ + { 0x0000, 0x0000, 0x0000 }, /* R20922 */ + { 0x0000, 0x0000, 0x0000 }, /* R20923 */ + { 0x0000, 0x0000, 0x0000 }, /* R20924 */ + { 0x0000, 0x0000, 0x0000 }, /* R20925 */ + { 0x0000, 0x0000, 0x0000 }, /* R20926 */ + { 0x0000, 0x0000, 0x0000 }, /* R20927 */ + { 0x0000, 0x0000, 0x0000 }, /* R20928 */ + { 0x0000, 0x0000, 0x0000 }, /* R20929 */ + { 0x0000, 0x0000, 0x0000 }, /* R20930 */ + { 0x0000, 0x0000, 0x0000 }, /* R20931 */ + { 0x0000, 0x0000, 0x0000 }, /* R20932 */ + { 0x0000, 0x0000, 0x0000 }, /* R20933 */ + { 0x0000, 0x0000, 0x0000 }, /* R20934 */ + { 0x0000, 0x0000, 0x0000 }, /* R20935 */ + { 0x0000, 0x0000, 0x0000 }, /* R20936 */ + { 0x0000, 0x0000, 0x0000 }, /* R20937 */ + { 0x0000, 0x0000, 0x0000 }, /* R20938 */ + { 0x0000, 0x0000, 0x0000 }, /* R20939 */ + { 0x0000, 0x0000, 0x0000 }, /* R20940 */ + { 0x0000, 0x0000, 0x0000 }, /* R20941 */ + { 0x0000, 0x0000, 0x0000 }, /* R20942 */ + { 0x0000, 0x0000, 0x0000 }, /* R20943 */ + { 0x0000, 0x0000, 0x0000 }, /* R20944 */ + { 0x0000, 0x0000, 0x0000 }, /* R20945 */ + { 0x0000, 0x0000, 0x0000 }, /* R20946 */ + { 0x0000, 0x0000, 0x0000 }, /* R20947 */ + { 0x0000, 0x0000, 0x0000 }, /* R20948 */ + { 0x0000, 0x0000, 0x0000 }, /* R20949 */ + { 0x0000, 0x0000, 0x0000 }, /* R20950 */ + { 0x0000, 0x0000, 0x0000 }, /* R20951 */ + { 0x0000, 0x0000, 0x0000 }, /* R20952 */ + { 0x0000, 0x0000, 0x0000 }, /* R20953 */ + { 0x0000, 0x0000, 0x0000 }, /* R20954 */ + { 0x0000, 0x0000, 0x0000 }, /* R20955 */ + { 0x0000, 0x0000, 0x0000 }, /* R20956 */ + { 0x0000, 0x0000, 0x0000 }, /* R20957 */ + { 0x0000, 0x0000, 0x0000 }, /* R20958 */ + { 0x0000, 0x0000, 0x0000 }, /* R20959 */ + { 0x0000, 0x0000, 0x0000 }, /* R20960 */ + { 0x0000, 0x0000, 0x0000 }, /* R20961 */ + { 0x0000, 0x0000, 0x0000 }, /* R20962 */ + { 0x0000, 0x0000, 0x0000 }, /* R20963 */ + { 0x0000, 0x0000, 0x0000 }, /* R20964 */ + { 0x0000, 0x0000, 0x0000 }, /* R20965 */ + { 0x0000, 0x0000, 0x0000 }, /* R20966 */ + { 0x0000, 0x0000, 0x0000 }, /* R20967 */ + { 0x0000, 0x0000, 0x0000 }, /* R20968 */ + { 0x0000, 0x0000, 0x0000 }, /* R20969 */ + { 0x0000, 0x0000, 0x0000 }, /* R20970 */ + { 0x0000, 0x0000, 0x0000 }, /* R20971 */ + { 0x0000, 0x0000, 0x0000 }, /* R20972 */ + { 0x0000, 0x0000, 0x0000 }, /* R20973 */ + { 0x0000, 0x0000, 0x0000 }, /* R20974 */ + { 0x0000, 0x0000, 0x0000 }, /* R20975 */ + { 0x0000, 0x0000, 0x0000 }, /* R20976 */ + { 0x0000, 0x0000, 0x0000 }, /* R20977 */ + { 0x0000, 0x0000, 0x0000 }, /* R20978 */ + { 0x0000, 0x0000, 0x0000 }, /* R20979 */ + { 0x0000, 0x0000, 0x0000 }, /* R20980 */ + { 0x0000, 0x0000, 0x0000 }, /* R20981 */ + { 0x0000, 0x0000, 0x0000 }, /* R20982 */ + { 0x0000, 0x0000, 0x0000 }, /* R20983 */ + { 0x0000, 0x0000, 0x0000 }, /* R20984 */ + { 0x0000, 0x0000, 0x0000 }, /* R20985 */ + { 0x0000, 0x0000, 0x0000 }, /* R20986 */ + { 0x0000, 0x0000, 0x0000 }, /* R20987 */ + { 0x0000, 0x0000, 0x0000 }, /* R20988 */ + { 0x0000, 0x0000, 0x0000 }, /* R20989 */ + { 0x0000, 0x0000, 0x0000 }, /* R20990 */ + { 0x0000, 0x0000, 0x0000 }, /* R20991 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20992 - VSS_XHD2_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20993 - VSS_XHD2_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20994 - VSS_XHD3_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20995 - VSS_XHD3_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20996 - VSS_XHN1_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20997 - VSS_XHN1_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R20998 - VSS_XHN2_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R20999 - VSS_XHN2_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21000 - VSS_XHN3_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21001 - VSS_XHN3_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21002 - VSS_XLA_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21003 - VSS_XLA_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21004 - VSS_XLB_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21005 - VSS_XLB_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21006 - VSS_XLG_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21007 - VSS_XLG_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21008 - VSS_PG2_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21009 - VSS_PG2_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21010 - VSS_PG_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21011 - VSS_PG_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21012 - VSS_XTD1_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21013 - VSS_XTD1_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21014 - VSS_XTD2_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21015 - VSS_XTD2_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21016 - VSS_XTD3_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21017 - VSS_XTD3_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21018 - VSS_XTD4_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21019 - VSS_XTD4_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21020 - VSS_XTD5_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21021 - VSS_XTD5_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21022 - VSS_XTD6_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21023 - VSS_XTD6_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21024 - VSS_XTD7_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21025 - VSS_XTD7_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21026 - VSS_XTD8_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21027 - VSS_XTD8_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21028 - VSS_XTD9_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21029 - VSS_XTD9_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21030 - VSS_XTD10_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21031 - VSS_XTD10_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21032 - VSS_XTD11_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21033 - VSS_XTD11_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21034 - VSS_XTD12_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21035 - VSS_XTD12_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21036 - VSS_XTD13_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21037 - VSS_XTD13_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21038 - VSS_XTD14_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21039 - VSS_XTD14_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21040 - VSS_XTD15_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21041 - VSS_XTD15_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21042 - VSS_XTD16_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21043 - VSS_XTD16_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21044 - VSS_XTD17_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21045 - VSS_XTD17_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21046 - VSS_XTD18_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21047 - VSS_XTD18_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21048 - VSS_XTD19_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21049 - VSS_XTD19_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21050 - VSS_XTD20_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21051 - VSS_XTD20_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21052 - VSS_XTD21_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21053 - VSS_XTD21_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21054 - VSS_XTD22_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21055 - VSS_XTD22_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21056 - VSS_XTD23_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21057 - VSS_XTD23_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21058 - VSS_XTD24_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21059 - VSS_XTD24_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21060 - VSS_XTD25_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21061 - VSS_XTD25_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21062 - VSS_XTD26_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21063 - VSS_XTD26_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21064 - VSS_XTD27_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21065 - VSS_XTD27_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21066 - VSS_XTD28_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21067 - VSS_XTD28_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21068 - VSS_XTD29_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21069 - VSS_XTD29_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21070 - VSS_XTD30_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21071 - VSS_XTD30_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21072 - VSS_XTD31_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21073 - VSS_XTD31_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21074 - VSS_XTD32_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21075 - VSS_XTD32_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21076 - VSS_XTS1_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21077 - VSS_XTS1_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21078 - VSS_XTS2_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21079 - VSS_XTS2_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21080 - VSS_XTS3_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21081 - VSS_XTS3_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21082 - VSS_XTS4_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21083 - VSS_XTS4_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21084 - VSS_XTS5_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21085 - VSS_XTS5_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21086 - VSS_XTS6_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21087 - VSS_XTS6_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21088 - VSS_XTS7_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21089 - VSS_XTS7_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21090 - VSS_XTS8_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21091 - VSS_XTS8_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21092 - VSS_XTS9_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21093 - VSS_XTS9_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21094 - VSS_XTS10_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21095 - VSS_XTS10_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21096 - VSS_XTS11_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21097 - VSS_XTS11_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21098 - VSS_XTS12_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21099 - VSS_XTS12_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21100 - VSS_XTS13_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21101 - VSS_XTS13_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21102 - VSS_XTS14_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21103 - VSS_XTS14_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21104 - VSS_XTS15_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21105 - VSS_XTS15_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21106 - VSS_XTS16_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21107 - VSS_XTS16_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21108 - VSS_XTS17_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21109 - VSS_XTS17_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21110 - VSS_XTS18_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21111 - VSS_XTS18_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21112 - VSS_XTS19_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21113 - VSS_XTS19_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21114 - VSS_XTS20_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21115 - VSS_XTS20_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21116 - VSS_XTS21_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21117 - VSS_XTS21_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21118 - VSS_XTS22_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21119 - VSS_XTS22_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21120 - VSS_XTS23_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21121 - VSS_XTS23_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21122 - VSS_XTS24_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21123 - VSS_XTS24_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21124 - VSS_XTS25_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21125 - VSS_XTS25_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21126 - VSS_XTS26_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21127 - VSS_XTS26_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21128 - VSS_XTS27_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21129 - VSS_XTS27_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21130 - VSS_XTS28_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21131 - VSS_XTS28_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21132 - VSS_XTS29_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21133 - VSS_XTS29_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21134 - VSS_XTS30_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21135 - VSS_XTS30_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21136 - VSS_XTS31_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21137 - VSS_XTS31_0 */ + { 0x00FF, 0x00FF, 0x0000 }, /* R21138 - VSS_XTS32_1 */ + { 0xFFFF, 0xFFFF, 0x0000 }, /* R21139 - VSS_XTS32_0 */ +}; diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c new file mode 100644 index 000000000000..ea8940e80263 --- /dev/null +++ b/sound/soc/codecs/wm8962.c @@ -0,0 +1,1933 @@ +/* + * wm8962.c -- WM8962 ALSA SoC Audio driver + * + * Copyright 2010 Wolfson Microelectronics plc + * + * Author: Mark Brown + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wm8962.h" + +static struct snd_soc_codec *wm8962_codec; +struct snd_soc_codec_device soc_codec_dev_wm8962; + +#define WM8962_NUM_SUPPLIES 8 +static const char *wm8962_supply_names[WM8962_NUM_SUPPLIES] = { + "DCVDD", + "DBVDD", + "AVDD", + "CPVDD", + "MICVDD", + "PLLVDD", + "SPKVDD1", + "SPKVDD2", +}; + +/* codec private data */ +struct wm8962_priv { + struct snd_soc_codec codec; + u16 reg_cache[WM8962_MAX_REGISTER + 1]; + + int sysclk; + int sysclk_rate; + + int bclk; /* Desired BCLK */ + int lrclk; + + int fll_src; + int fll_fref; + int fll_fout; + + struct regulator_bulk_data supplies[WM8962_NUM_SUPPLIES]; + struct notifier_block disable_nb[WM8962_NUM_SUPPLIES]; + +#if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE) + struct input_dev *beep; + struct work_struct beep_work; + int beep_rate; +#endif +}; + +/* We can't use the same notifier block for more than one supply and + * there's no way I can see to get from a callback to the caller + * except container_of(). + */ +#define WM8962_REGULATOR_EVENT(n) \ +static int wm8962_regulator_event_##n(struct notifier_block *nb, \ + unsigned long event, void *data) \ +{ \ + struct wm8962_priv *wm8962 = container_of(nb, struct wm8962_priv, \ + disable_nb[n]); \ + if (event & REGULATOR_EVENT_DISABLE) { \ + wm8962->codec.cache_sync = 1; \ + } \ + return 0; \ +} + +WM8962_REGULATOR_EVENT(0) +WM8962_REGULATOR_EVENT(1) +WM8962_REGULATOR_EVENT(2) +WM8962_REGULATOR_EVENT(3) +WM8962_REGULATOR_EVENT(4) +WM8962_REGULATOR_EVENT(5) +WM8962_REGULATOR_EVENT(6) +WM8962_REGULATOR_EVENT(7) + +static int wm8962_volatile_register(unsigned int reg) +{ + if (wm8962_reg_access[reg].vol) + return 1; + else + return 0; +} + +static int wm8962_readable(unsigned int reg) +{ + if (wm8962_reg_access[reg].read) + return 1; + else + return 0; +} + +static int wm8962_reset(struct snd_soc_codec *codec) +{ + return snd_soc_write(codec, WM8962_SOFTWARE_RESET, 0); +} + +static const DECLARE_TLV_DB_SCALE(inpga_tlv, -2325, 75, 0); +static const DECLARE_TLV_DB_SCALE(mixin_tlv, -1500, 300, 0); +static const unsigned int mixinpga_tlv[] = { + TLV_DB_RANGE_HEAD(7), + 0, 1, TLV_DB_SCALE_ITEM(0, 600, 0), + 2, 2, TLV_DB_SCALE_ITEM(1300, 1300, 0), + 3, 4, TLV_DB_SCALE_ITEM(1800, 200, 0), + 5, 5, TLV_DB_SCALE_ITEM(2400, 0, 0), + 6, 7, TLV_DB_SCALE_ITEM(2700, 300, 0), +}; +static const DECLARE_TLV_DB_SCALE(beep_tlv, -9600, 600, 1); +static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1); +static const DECLARE_TLV_DB_SCALE(st_tlv, -3600, 300, 0); +static const DECLARE_TLV_DB_SCALE(inmix_tlv, -600, 600, 0); +static const DECLARE_TLV_DB_SCALE(bypass_tlv, -1500, 300, 0); +static const DECLARE_TLV_DB_SCALE(out_tlv, -12100, 100, 1); +static const DECLARE_TLV_DB_SCALE(hp_tlv, -700, 100, 0); +static const unsigned int classd_tlv[] = { + TLV_DB_RANGE_HEAD(7), + 0, 6, TLV_DB_SCALE_ITEM(0, 150, 0), + 7, 7, TLV_DB_SCALE_ITEM(1200, 0, 0), +}; + +/* The VU bits for the headphones are in a different register to the mute + * bits and only take effect on the PGA if it is actually powered. + */ +static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + u16 *reg_cache = codec->reg_cache; + int ret; + + /* Apply the update (if any) */ + ret = snd_soc_put_volsw(kcontrol, ucontrol); + if (ret == 0) + return 0; + + /* If the left PGA is enabled hit that VU bit... */ + if (reg_cache[WM8962_PWR_MGMT_2] & WM8962_HPOUTL_PGA_ENA) + return snd_soc_write(codec, WM8962_HPOUTL_VOLUME, + reg_cache[WM8962_HPOUTL_VOLUME]); + + /* ...otherwise the right. The VU is stereo. */ + if (reg_cache[WM8962_PWR_MGMT_2] & WM8962_HPOUTR_PGA_ENA) + return snd_soc_write(codec, WM8962_HPOUTR_VOLUME, + reg_cache[WM8962_HPOUTR_VOLUME]); + + return 0; +} + +/* The VU bits for the speakers are in a different register to the mute + * bits and only take effect on the PGA if it is actually powered. + */ +static int wm8962_put_spk_sw(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + u16 *reg_cache = codec->reg_cache; + int ret; + + /* Apply the update (if any) */ + ret = snd_soc_put_volsw(kcontrol, ucontrol); + if (ret == 0) + return 0; + + /* If the left PGA is enabled hit that VU bit... */ + if (reg_cache[WM8962_PWR_MGMT_2] & WM8962_SPKOUTL_PGA_ENA) + return snd_soc_write(codec, WM8962_SPKOUTL_VOLUME, + reg_cache[WM8962_SPKOUTL_VOLUME]); + + /* ...otherwise the right. The VU is stereo. */ + if (reg_cache[WM8962_PWR_MGMT_2] & WM8962_SPKOUTR_PGA_ENA) + return snd_soc_write(codec, WM8962_SPKOUTR_VOLUME, + reg_cache[WM8962_SPKOUTR_VOLUME]); + + return 0; +} + +static const struct snd_kcontrol_new wm8962_snd_controls[] = { +SOC_DOUBLE("Input Mixer Switch", WM8962_INPUT_MIXER_CONTROL_1, 3, 2, 1, 1), + +SOC_SINGLE_TLV("MIXINL IN2L Volume", WM8962_LEFT_INPUT_MIXER_VOLUME, 6, 7, 0, + mixin_tlv), +SOC_SINGLE_TLV("MIXINL PGA Volume", WM8962_LEFT_INPUT_MIXER_VOLUME, 3, 7, 0, + mixinpga_tlv), +SOC_SINGLE_TLV("MIXINL IN3L Volume", WM8962_LEFT_INPUT_MIXER_VOLUME, 0, 7, 0, + mixin_tlv), + +SOC_SINGLE_TLV("MIXINR IN2R Volume", WM8962_RIGHT_INPUT_MIXER_VOLUME, 6, 7, 0, + mixin_tlv), +SOC_SINGLE_TLV("MIXINR PGA Volume", WM8962_RIGHT_INPUT_MIXER_VOLUME, 3, 7, 0, + mixinpga_tlv), +SOC_SINGLE_TLV("MIXINR IN3R Volume", WM8962_RIGHT_INPUT_MIXER_VOLUME, 0, 7, 0, + mixin_tlv), + +SOC_DOUBLE_R_TLV("Digital Capture Volume", WM8962_LEFT_ADC_VOLUME, + WM8962_RIGHT_ADC_VOLUME, 1, 127, 0, digital_tlv), +SOC_DOUBLE_R_TLV("Capture Volume", WM8962_LEFT_INPUT_VOLUME, + WM8962_RIGHT_INPUT_VOLUME, 0, 63, 0, inpga_tlv), +SOC_DOUBLE_R("Capture Switch", WM8962_LEFT_INPUT_VOLUME, + WM8962_RIGHT_INPUT_VOLUME, 7, 1, 1), +SOC_DOUBLE_R("Capture ZC Switch", WM8962_LEFT_INPUT_VOLUME, + WM8962_RIGHT_INPUT_VOLUME, 6, 1, 1), + +SOC_DOUBLE_R_TLV("Sidetone Volume", WM8962_DAC_DSP_MIXING_1, + WM8962_DAC_DSP_MIXING_2, 4, 12, 0, st_tlv), + +SOC_DOUBLE_R_TLV("Digital Playback Volume", WM8962_LEFT_DAC_VOLUME, + WM8962_RIGHT_DAC_VOLUME, 1, 127, 0, digital_tlv), +SOC_SINGLE("DAC High Performance Switch", WM8962_ADC_DAC_CONTROL_2, 0, 1, 0), + +SOC_SINGLE("ADC High Performance Switch", WM8962_ADDITIONAL_CONTROL_1, + 5, 1, 0), + +SOC_SINGLE_TLV("Beep Volume", WM8962_BEEP_GENERATOR_1, 4, 15, 0, beep_tlv), + +SOC_DOUBLE_R_TLV("Headphone Volume", WM8962_HPOUTL_VOLUME, + WM8962_HPOUTR_VOLUME, 0, 127, 0, out_tlv), +SOC_DOUBLE_EXT("Headphone Switch", WM8962_PWR_MGMT_2, 1, 0, 1, 1, + snd_soc_get_volsw, wm8962_put_hp_sw), +SOC_DOUBLE_R("Headphone ZC Switch", WM8962_HPOUTL_VOLUME, WM8962_HPOUTR_VOLUME, + 7, 1, 0), +SOC_DOUBLE_TLV("Headphone Aux Volume", WM8962_ANALOGUE_HP_2, 3, 6, 7, 0, + hp_tlv), + +SOC_DOUBLE_R("Headphone Mixer Switch", WM8962_HEADPHONE_MIXER_3, + WM8962_HEADPHONE_MIXER_4, 8, 1, 1), + +SOC_SINGLE_TLV("HPMIXL IN4L Volume", WM8962_HEADPHONE_MIXER_3, + 3, 7, 0, bypass_tlv), +SOC_SINGLE_TLV("HPMIXL IN4R Volume", WM8962_HEADPHONE_MIXER_3, + 0, 7, 0, bypass_tlv), +SOC_SINGLE_TLV("HPMIXL MIXINL Volume", WM8962_HEADPHONE_MIXER_3, + 7, 1, 1, inmix_tlv), +SOC_SINGLE_TLV("HPMIXL MIXINR Volume", WM8962_HEADPHONE_MIXER_3, + 6, 1, 1, inmix_tlv), + +SOC_SINGLE_TLV("HPMIXR IN4L Volume", WM8962_HEADPHONE_MIXER_4, + 3, 7, 0, bypass_tlv), +SOC_SINGLE_TLV("HPMIXR IN4R Volume", WM8962_HEADPHONE_MIXER_4, + 0, 7, 0, bypass_tlv), +SOC_SINGLE_TLV("HPMIXR MIXINL Volume", WM8962_HEADPHONE_MIXER_4, + 7, 1, 1, inmix_tlv), +SOC_SINGLE_TLV("HPMIXR MIXINR Volume", WM8962_HEADPHONE_MIXER_4, + 6, 1, 1, inmix_tlv), + +SOC_SINGLE_TLV("Speaker Boost Volume", WM8962_CLASS_D_CONTROL_2, 0, 7, 0, + classd_tlv), +}; + +static const struct snd_kcontrol_new wm8962_spk_mono_controls[] = { +SOC_SINGLE_TLV("Speaker Volume", WM8962_SPKOUTL_VOLUME, 0, 127, 0, out_tlv), +SOC_SINGLE_EXT("Speaker Switch", WM8962_CLASS_D_CONTROL_1, 1, 1, 1, + snd_soc_get_volsw, wm8962_put_spk_sw), +SOC_SINGLE("Speaker ZC Switch", WM8962_SPKOUTL_VOLUME, 7, 1, 0), + +SOC_SINGLE("Speaker Mixer Switch", WM8962_SPEAKER_MIXER_3, 8, 1, 1), +SOC_SINGLE_TLV("Speaker Mixer IN4L Volume", WM8962_SPEAKER_MIXER_3, + 3, 7, 0, bypass_tlv), +SOC_SINGLE_TLV("Speaker Mixer IN4R Volume", WM8962_SPEAKER_MIXER_3, + 0, 7, 0, bypass_tlv), +SOC_SINGLE_TLV("Speaker Mixer MIXINL Volume", WM8962_SPEAKER_MIXER_3, + 7, 1, 1, inmix_tlv), +SOC_SINGLE_TLV("Speaker Mixer MIXINR Volume", WM8962_SPEAKER_MIXER_3, + 6, 1, 1, inmix_tlv), +SOC_SINGLE_TLV("Speaker Mixer DACL Volume", WM8962_SPEAKER_MIXER_5, + 7, 1, 0, inmix_tlv), +SOC_SINGLE_TLV("Speaker Mixer DACR Volume", WM8962_SPEAKER_MIXER_5, + 6, 1, 0, inmix_tlv), +}; + +static const struct snd_kcontrol_new wm8962_spk_stereo_controls[] = { +SOC_DOUBLE_R_TLV("Speaker Volume", WM8962_SPKOUTL_VOLUME, + WM8962_SPKOUTR_VOLUME, 0, 127, 0, out_tlv), +SOC_DOUBLE_EXT("Speaker Switch", WM8962_CLASS_D_CONTROL_1, 1, 0, 1, 1, + snd_soc_get_volsw, wm8962_put_spk_sw), +SOC_DOUBLE_R("Speaker ZC Switch", WM8962_SPKOUTL_VOLUME, WM8962_SPKOUTR_VOLUME, + 7, 1, 0), + +SOC_DOUBLE_R("Speaker Mixer Switch", WM8962_SPEAKER_MIXER_3, + WM8962_SPEAKER_MIXER_4, 8, 1, 1), + +SOC_SINGLE_TLV("SPKOUTL Mixer IN4L Volume", WM8962_SPEAKER_MIXER_3, + 3, 7, 0, bypass_tlv), +SOC_SINGLE_TLV("SPKOUTL Mixer IN4R Volume", WM8962_SPEAKER_MIXER_3, + 0, 7, 0, bypass_tlv), +SOC_SINGLE_TLV("SPKOUTL Mixer MIXINL Volume", WM8962_SPEAKER_MIXER_3, + 7, 1, 1, inmix_tlv), +SOC_SINGLE_TLV("SPKOUTL Mixer MIXINR Volume", WM8962_SPEAKER_MIXER_3, + 6, 1, 1, inmix_tlv), +SOC_SINGLE_TLV("SPKOUTL Mixer DACL Volume", WM8962_SPEAKER_MIXER_5, + 7, 1, 0, inmix_tlv), +SOC_SINGLE_TLV("SPKOUTL Mixer DACR Volume", WM8962_SPEAKER_MIXER_5, + 6, 1, 0, inmix_tlv), + +SOC_SINGLE_TLV("SPKOUTR Mixer IN4L Volume", WM8962_SPEAKER_MIXER_4, + 3, 7, 0, bypass_tlv), +SOC_SINGLE_TLV("SPKOUTR Mixer IN4R Volume", WM8962_SPEAKER_MIXER_4, + 0, 7, 0, bypass_tlv), +SOC_SINGLE_TLV("SPKOUTR Mixer MIXINL Volume", WM8962_SPEAKER_MIXER_4, + 7, 1, 1, inmix_tlv), +SOC_SINGLE_TLV("SPKOUTR Mixer MIXINR Volume", WM8962_SPEAKER_MIXER_4, + 6, 1, 1, inmix_tlv), +SOC_SINGLE_TLV("SPKOUTR Mixer DACL Volume", WM8962_SPEAKER_MIXER_5, + 5, 1, 0, inmix_tlv), +SOC_SINGLE_TLV("SPKOUTR Mixer DACR Volume", WM8962_SPEAKER_MIXER_5, + 4, 1, 0, inmix_tlv), +}; + +static int sysclk_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = w->codec; + int src; + int fll; + + src = snd_soc_read(codec, WM8962_CLOCKING2) & WM8962_SYSCLK_SRC_MASK; + + switch (src) { + case 0: /* MCLK */ + fll = 0; + break; + case 0x200: /* FLL */ + fll = 1; + break; + default: + dev_err(codec->dev, "Unknown SYSCLK source %x\n", src); + return -EINVAL; + } + + switch (event) { + case SND_SOC_DAPM_PRE_PMU: + if (fll) + snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1, + WM8962_FLL_ENA, WM8962_FLL_ENA); + break; + + case SND_SOC_DAPM_POST_PMD: + if (fll) + snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1, + WM8962_FLL_ENA, 0); + break; + + default: + BUG(); + return -EINVAL; + } + + return 0; +} + +static int cp_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + switch (event) { + case SND_SOC_DAPM_POST_PMU: + msleep(5); + break; + + default: + BUG(); + return -EINVAL; + } + + return 0; +} + +static int hp_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = w->codec; + int timeout; + int reg; + int expected = (WM8962_DCS_STARTUP_DONE_HP1L | + WM8962_DCS_STARTUP_DONE_HP1R); + + switch (event) { + case SND_SOC_DAPM_POST_PMU: + snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0, + WM8962_HP1L_ENA | WM8962_HP1R_ENA, + WM8962_HP1L_ENA | WM8962_HP1R_ENA); + udelay(20); + + snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0, + WM8962_HP1L_ENA_DLY | WM8962_HP1R_ENA_DLY, + WM8962_HP1L_ENA_DLY | WM8962_HP1R_ENA_DLY); + + /* Start the DC servo */ + snd_soc_update_bits(codec, WM8962_DC_SERVO_1, + WM8962_HP1L_DCS_ENA | WM8962_HP1R_DCS_ENA | + WM8962_HP1L_DCS_STARTUP | + WM8962_HP1R_DCS_STARTUP, + WM8962_HP1L_DCS_ENA | WM8962_HP1R_DCS_ENA | + WM8962_HP1L_DCS_STARTUP | + WM8962_HP1R_DCS_STARTUP); + + /* Wait for it to complete, should be well under 100ms */ + timeout = 0; + do { + msleep(1); + reg = snd_soc_read(codec, WM8962_DC_SERVO_6); + if (reg < 0) { + dev_err(codec->dev, + "Failed to read DCS status: %d\n", + reg); + continue; + } + dev_dbg(codec->dev, "DCS status: %x\n", reg); + } while (++timeout < 200 && (reg & expected) != expected); + + if ((reg & expected) != expected) + dev_err(codec->dev, "DC servo timed out\n"); + else + dev_dbg(codec->dev, "DC servo complete after %dms\n", + timeout); + + snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0, + WM8962_HP1L_ENA_OUTP | + WM8962_HP1R_ENA_OUTP, + WM8962_HP1L_ENA_OUTP | + WM8962_HP1R_ENA_OUTP); + udelay(20); + + snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0, + WM8962_HP1L_RMV_SHORT | + WM8962_HP1R_RMV_SHORT, + WM8962_HP1L_RMV_SHORT | + WM8962_HP1R_RMV_SHORT); + break; + + case SND_SOC_DAPM_PRE_PMD: + snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0, + WM8962_HP1L_RMV_SHORT | + WM8962_HP1R_RMV_SHORT, 0); + + udelay(20); + + snd_soc_update_bits(codec, WM8962_DC_SERVO_1, + WM8962_HP1L_DCS_ENA | WM8962_HP1R_DCS_ENA | + WM8962_HP1L_DCS_STARTUP | + WM8962_HP1R_DCS_STARTUP, + 0); + + snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0, + WM8962_HP1L_ENA | WM8962_HP1R_ENA | + WM8962_HP1L_ENA_DLY | WM8962_HP1R_ENA_DLY | + WM8962_HP1L_ENA_OUTP | + WM8962_HP1R_ENA_OUTP, 0); + + break; + + default: + BUG(); + return -EINVAL; + + } + + return 0; +} + +/* VU bits for the output PGAs only take effect while the PGA is powered */ +static int out_pga_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = w->codec; + u16 *reg_cache = codec->reg_cache; + int reg; + + switch (w->shift) { + case WM8962_HPOUTR_PGA_ENA_SHIFT: + reg = WM8962_HPOUTR_VOLUME; + break; + case WM8962_HPOUTL_PGA_ENA_SHIFT: + reg = WM8962_HPOUTL_VOLUME; + break; + case WM8962_SPKOUTR_PGA_ENA_SHIFT: + reg = WM8962_SPKOUTR_VOLUME; + break; + case WM8962_SPKOUTL_PGA_ENA_SHIFT: + reg = WM8962_SPKOUTL_VOLUME; + break; + default: + BUG(); + return -EINVAL; + } + + switch (event) { + case SND_SOC_DAPM_POST_PMU: + return snd_soc_write(codec, reg, reg_cache[reg]); + default: + BUG(); + return -EINVAL; + } +} + +static const char *st_text[] = { "None", "Right", "Left" }; + +static const struct soc_enum str_enum = + SOC_ENUM_SINGLE(WM8962_DAC_DSP_MIXING_1, 2, 3, st_text); + +static const struct snd_kcontrol_new str_mux = + SOC_DAPM_ENUM("Right Sidetone", str_enum); + +static const struct soc_enum stl_enum = + SOC_ENUM_SINGLE(WM8962_DAC_DSP_MIXING_2, 2, 3, st_text); + +static const struct snd_kcontrol_new stl_mux = + SOC_DAPM_ENUM("Left Sidetone", stl_enum); + +static const char *outmux_text[] = { "DAC", "Mixer" }; + +static const struct soc_enum spkoutr_enum = + SOC_ENUM_SINGLE(WM8962_SPEAKER_MIXER_2, 7, 2, outmux_text); + +static const struct snd_kcontrol_new spkoutr_mux = + SOC_DAPM_ENUM("SPKOUTR Mux", spkoutr_enum); + +static const struct soc_enum spkoutl_enum = + SOC_ENUM_SINGLE(WM8962_SPEAKER_MIXER_1, 7, 2, outmux_text); + +static const struct snd_kcontrol_new spkoutl_mux = + SOC_DAPM_ENUM("SPKOUTL Mux", spkoutl_enum); + +static const struct soc_enum hpoutr_enum = + SOC_ENUM_SINGLE(WM8962_HEADPHONE_MIXER_2, 7, 2, outmux_text); + +static const struct snd_kcontrol_new hpoutr_mux = + SOC_DAPM_ENUM("HPOUTR Mux", hpoutr_enum); + +static const struct soc_enum hpoutl_enum = + SOC_ENUM_SINGLE(WM8962_HEADPHONE_MIXER_1, 7, 2, outmux_text); + +static const struct snd_kcontrol_new hpoutl_mux = + SOC_DAPM_ENUM("HPOUTL Mux", hpoutl_enum); + +static const struct snd_kcontrol_new inpgal[] = { +SOC_DAPM_SINGLE("IN1L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 3, 1, 0), +SOC_DAPM_SINGLE("IN2L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 2, 1, 0), +SOC_DAPM_SINGLE("IN3L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 1, 1, 0), +SOC_DAPM_SINGLE("IN4L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 0, 1, 0), +}; + +static const struct snd_kcontrol_new inpgar[] = { +SOC_DAPM_SINGLE("IN1R Switch", WM8962_RIGHT_INPUT_PGA_CONTROL, 3, 1, 0), +SOC_DAPM_SINGLE("IN2R Switch", WM8962_RIGHT_INPUT_PGA_CONTROL, 2, 1, 0), +SOC_DAPM_SINGLE("IN3R Switch", WM8962_RIGHT_INPUT_PGA_CONTROL, 1, 1, 0), +SOC_DAPM_SINGLE("IN4R Switch", WM8962_RIGHT_INPUT_PGA_CONTROL, 0, 1, 0), +}; + +static const struct snd_kcontrol_new mixinl[] = { +SOC_DAPM_SINGLE("IN2L Switch", WM8962_INPUT_MIXER_CONTROL_2, 5, 1, 0), +SOC_DAPM_SINGLE("IN3L Switch", WM8962_INPUT_MIXER_CONTROL_2, 4, 1, 0), +SOC_DAPM_SINGLE("PGA Switch", WM8962_INPUT_MIXER_CONTROL_2, 3, 1, 0), +}; + +static const struct snd_kcontrol_new mixinr[] = { +SOC_DAPM_SINGLE("IN2R Switch", WM8962_INPUT_MIXER_CONTROL_2, 2, 1, 0), +SOC_DAPM_SINGLE("IN3R Switch", WM8962_INPUT_MIXER_CONTROL_2, 1, 1, 0), +SOC_DAPM_SINGLE("PGA Switch", WM8962_INPUT_MIXER_CONTROL_2, 0, 1, 0), +}; + +static const struct snd_kcontrol_new hpmixl[] = { +SOC_DAPM_SINGLE("DACL Switch", WM8962_HEADPHONE_MIXER_1, 5, 1, 0), +SOC_DAPM_SINGLE("DACR Switch", WM8962_HEADPHONE_MIXER_1, 4, 1, 0), +SOC_DAPM_SINGLE("MIXINL Switch", WM8962_HEADPHONE_MIXER_1, 3, 1, 0), +SOC_DAPM_SINGLE("MIXINR Switch", WM8962_HEADPHONE_MIXER_1, 2, 1, 0), +SOC_DAPM_SINGLE("IN4L Switch", WM8962_HEADPHONE_MIXER_1, 1, 1, 0), +SOC_DAPM_SINGLE("IN4R Switch", WM8962_HEADPHONE_MIXER_1, 0, 1, 0), +}; + +static const struct snd_kcontrol_new hpmixr[] = { +SOC_DAPM_SINGLE("DACL Switch", WM8962_HEADPHONE_MIXER_2, 5, 1, 0), +SOC_DAPM_SINGLE("DACR Switch", WM8962_HEADPHONE_MIXER_2, 4, 1, 0), +SOC_DAPM_SINGLE("MIXINL Switch", WM8962_HEADPHONE_MIXER_2, 3, 1, 0), +SOC_DAPM_SINGLE("MIXINR Switch", WM8962_HEADPHONE_MIXER_2, 2, 1, 0), +SOC_DAPM_SINGLE("IN4L Switch", WM8962_HEADPHONE_MIXER_2, 1, 1, 0), +SOC_DAPM_SINGLE("IN4R Switch", WM8962_HEADPHONE_MIXER_2, 0, 1, 0), +}; + +static const struct snd_kcontrol_new spkmixl[] = { +SOC_DAPM_SINGLE("DACL Switch", WM8962_SPEAKER_MIXER_1, 5, 1, 0), +SOC_DAPM_SINGLE("DACR Switch", WM8962_SPEAKER_MIXER_1, 4, 1, 0), +SOC_DAPM_SINGLE("MIXINL Switch", WM8962_SPEAKER_MIXER_1, 3, 1, 0), +SOC_DAPM_SINGLE("MIXINR Switch", WM8962_SPEAKER_MIXER_1, 2, 1, 0), +SOC_DAPM_SINGLE("IN4L Switch", WM8962_SPEAKER_MIXER_1, 1, 1, 0), +SOC_DAPM_SINGLE("IN4R Switch", WM8962_SPEAKER_MIXER_1, 0, 1, 0), +}; + +static const struct snd_kcontrol_new spkmixr[] = { +SOC_DAPM_SINGLE("DACL Switch", WM8962_SPEAKER_MIXER_2, 5, 1, 0), +SOC_DAPM_SINGLE("DACR Switch", WM8962_SPEAKER_MIXER_2, 4, 1, 0), +SOC_DAPM_SINGLE("MIXINL Switch", WM8962_SPEAKER_MIXER_2, 3, 1, 0), +SOC_DAPM_SINGLE("MIXINR Switch", WM8962_SPEAKER_MIXER_2, 2, 1, 0), +SOC_DAPM_SINGLE("IN4L Switch", WM8962_SPEAKER_MIXER_2, 1, 1, 0), +SOC_DAPM_SINGLE("IN4R Switch", WM8962_SPEAKER_MIXER_2, 0, 1, 0), +}; + +static const struct snd_soc_dapm_widget wm8962_dapm_widgets[] = { +SND_SOC_DAPM_INPUT("IN1L"), +SND_SOC_DAPM_INPUT("IN1R"), +SND_SOC_DAPM_INPUT("IN2L"), +SND_SOC_DAPM_INPUT("IN2R"), +SND_SOC_DAPM_INPUT("IN3L"), +SND_SOC_DAPM_INPUT("IN3R"), +SND_SOC_DAPM_INPUT("IN4L"), +SND_SOC_DAPM_INPUT("IN4R"), +SND_SOC_DAPM_INPUT("Beep"), + +SND_SOC_DAPM_SUPPLY("Class G", WM8962_CHARGE_PUMP_B, 0, 1, NULL, 0), +SND_SOC_DAPM_SUPPLY("SYSCLK", WM8962_CLOCKING2, 5, 0, sysclk_event, + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), +SND_SOC_DAPM_SUPPLY("Charge Pump", WM8962_CHARGE_PUMP_1, 0, 0, cp_event, + SND_SOC_DAPM_POST_PMU), +SND_SOC_DAPM_SUPPLY("TOCLK", WM8962_ADDITIONAL_CONTROL_1, 0, 0, NULL, 0), + +SND_SOC_DAPM_MIXER("INPGAL", WM8962_LEFT_INPUT_PGA_CONTROL, 4, 0, + inpgal, ARRAY_SIZE(inpgal)), +SND_SOC_DAPM_MIXER("INPGAR", WM8962_RIGHT_INPUT_PGA_CONTROL, 4, 0, + inpgar, ARRAY_SIZE(inpgar)), +SND_SOC_DAPM_MIXER("MIXINL", WM8962_PWR_MGMT_1, 5, 0, + mixinl, ARRAY_SIZE(mixinl)), +SND_SOC_DAPM_MIXER("MIXINR", WM8962_PWR_MGMT_1, 4, 0, + mixinr, ARRAY_SIZE(mixinr)), + +SND_SOC_DAPM_ADC("ADCL", "Capture", WM8962_PWR_MGMT_1, 3, 0), +SND_SOC_DAPM_ADC("ADCR", "Capture", WM8962_PWR_MGMT_1, 2, 0), + +SND_SOC_DAPM_MUX("STL", SND_SOC_NOPM, 0, 0, &stl_mux), +SND_SOC_DAPM_MUX("STR", SND_SOC_NOPM, 0, 0, &str_mux), + +SND_SOC_DAPM_DAC("DACL", "Playback", WM8962_PWR_MGMT_2, 8, 0), +SND_SOC_DAPM_DAC("DACR", "Playback", WM8962_PWR_MGMT_2, 7, 0), + +SND_SOC_DAPM_PGA("Left Bypass", SND_SOC_NOPM, 0, 0, NULL, 0), +SND_SOC_DAPM_PGA("Right Bypass", SND_SOC_NOPM, 0, 0, NULL, 0), + +SND_SOC_DAPM_MIXER("HPMIXL", WM8962_MIXER_ENABLES, 3, 0, + hpmixl, ARRAY_SIZE(hpmixl)), +SND_SOC_DAPM_MIXER("HPMIXR", WM8962_MIXER_ENABLES, 2, 0, + hpmixr, ARRAY_SIZE(hpmixr)), + +SND_SOC_DAPM_MUX_E("HPOUTL PGA", WM8962_PWR_MGMT_2, 6, 0, &hpoutl_mux, + out_pga_event, SND_SOC_DAPM_POST_PMU), +SND_SOC_DAPM_MUX_E("HPOUTR PGA", WM8962_PWR_MGMT_2, 5, 0, &hpoutr_mux, + out_pga_event, SND_SOC_DAPM_POST_PMU), + +SND_SOC_DAPM_PGA_E("HPOUT", SND_SOC_NOPM, 0, 0, NULL, 0, hp_event, + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), + +SND_SOC_DAPM_OUTPUT("HPOUTL"), +SND_SOC_DAPM_OUTPUT("HPOUTR"), +}; + +static const struct snd_soc_dapm_widget wm8962_dapm_spk_mono_widgets[] = { +SND_SOC_DAPM_MIXER("Speaker Mixer", WM8962_MIXER_ENABLES, 1, 0, + spkmixl, ARRAY_SIZE(spkmixl)), +SND_SOC_DAPM_MUX_E("Speaker PGA", WM8962_PWR_MGMT_2, 4, 0, &spkoutl_mux, + out_pga_event, SND_SOC_DAPM_POST_PMU), +SND_SOC_DAPM_PGA("Speaker Output", WM8962_CLASS_D_CONTROL_1, 7, 0, NULL, 0), +SND_SOC_DAPM_OUTPUT("SPKOUT"), +}; + +static const struct snd_soc_dapm_widget wm8962_dapm_spk_stereo_widgets[] = { +SND_SOC_DAPM_MIXER("SPKOUTL Mixer", WM8962_MIXER_ENABLES, 1, 0, + spkmixl, ARRAY_SIZE(spkmixl)), +SND_SOC_DAPM_MIXER("SPKOUTR Mixer", WM8962_MIXER_ENABLES, 0, 0, + spkmixr, ARRAY_SIZE(spkmixr)), + +SND_SOC_DAPM_MUX_E("SPKOUTL PGA", WM8962_PWR_MGMT_2, 4, 0, &spkoutl_mux, + out_pga_event, SND_SOC_DAPM_POST_PMU), +SND_SOC_DAPM_MUX_E("SPKOUTR PGA", WM8962_PWR_MGMT_2, 3, 0, &spkoutr_mux, + out_pga_event, SND_SOC_DAPM_POST_PMU), + +SND_SOC_DAPM_PGA("SPKOUTR Output", WM8962_CLASS_D_CONTROL_1, 7, 0, NULL, 0), +SND_SOC_DAPM_PGA("SPKOUTL Output", WM8962_CLASS_D_CONTROL_1, 6, 0, NULL, 0), + +SND_SOC_DAPM_OUTPUT("SPKOUTL"), +SND_SOC_DAPM_OUTPUT("SPKOUTR"), +}; + +static const struct snd_soc_dapm_route wm8962_intercon[] = { + { "INPGAL", "IN1L Switch", "IN1L" }, + { "INPGAL", "IN2L Switch", "IN2L" }, + { "INPGAL", "IN3L Switch", "IN3L" }, + { "INPGAL", "IN4L Switch", "IN4L" }, + + { "INPGAR", "IN1R Switch", "IN1R" }, + { "INPGAR", "IN2R Switch", "IN2R" }, + { "INPGAR", "IN3R Switch", "IN3R" }, + { "INPGAR", "IN4R Switch", "IN4R" }, + + { "MIXINL", "IN2L Switch", "IN2L" }, + { "MIXINL", "IN3L Switch", "IN3L" }, + { "MIXINL", "PGA Switch", "INPGAL" }, + + { "MIXINR", "IN2R Switch", "IN2R" }, + { "MIXINR", "IN3R Switch", "IN3R" }, + { "MIXINR", "PGA Switch", "INPGAR" }, + + { "ADCL", NULL, "SYSCLK" }, + { "ADCL", NULL, "TOCLK" }, + { "ADCL", NULL, "MIXINL" }, + + { "ADCR", NULL, "SYSCLK" }, + { "ADCR", NULL, "TOCLK" }, + { "ADCR", NULL, "MIXINR" }, + + { "STL", "Left", "ADCL" }, + { "STL", "Right", "ADCR" }, + + { "STR", "Left", "ADCL" }, + { "STR", "Right", "ADCR" }, + + { "DACL", NULL, "SYSCLK" }, + { "DACL", NULL, "TOCLK" }, + { "DACL", NULL, "Beep" }, + { "DACL", NULL, "STL" }, + + { "DACR", NULL, "SYSCLK" }, + { "DACR", NULL, "TOCLK" }, + { "DACR", NULL, "Beep" }, + { "DACR", NULL, "STR" }, + + { "HPMIXL", "IN4L Switch", "IN4L" }, + { "HPMIXL", "IN4R Switch", "IN4R" }, + { "HPMIXL", "DACL Switch", "DACL" }, + { "HPMIXL", "DACR Switch", "DACR" }, + { "HPMIXL", "MIXINL Switch", "MIXINL" }, + { "HPMIXL", "MIXINR Switch", "MIXINR" }, + + { "HPMIXR", "IN4L Switch", "IN4L" }, + { "HPMIXR", "IN4R Switch", "IN4R" }, + { "HPMIXR", "DACL Switch", "DACL" }, + { "HPMIXR", "DACR Switch", "DACR" }, + { "HPMIXR", "MIXINL Switch", "MIXINL" }, + { "HPMIXR", "MIXINR Switch", "MIXINR" }, + + { "Left Bypass", NULL, "HPMIXL" }, + { "Left Bypass", NULL, "Class G" }, + + { "Right Bypass", NULL, "HPMIXR" }, + { "Right Bypass", NULL, "Class G" }, + + { "HPOUTL PGA", "Mixer", "Left Bypass" }, + { "HPOUTL PGA", "DAC", "DACL" }, + + { "HPOUTR PGA", "Mixer", "Right Bypass" }, + { "HPOUTR PGA", "DAC", "DACR" }, + + { "HPOUT", NULL, "HPOUTL PGA" }, + { "HPOUT", NULL, "HPOUTR PGA" }, + { "HPOUT", NULL, "Charge Pump" }, + { "HPOUT", NULL, "SYSCLK" }, + { "HPOUT", NULL, "TOCLK" }, + + { "HPOUTL", NULL, "HPOUT" }, + { "HPOUTR", NULL, "HPOUT" }, +}; + +static const struct snd_soc_dapm_route wm8962_spk_mono_intercon[] = { + { "Speaker Mixer", "IN4L Switch", "IN4L" }, + { "Speaker Mixer", "IN4R Switch", "IN4R" }, + { "Speaker Mixer", "DACL Switch", "DACL" }, + { "Speaker Mixer", "DACR Switch", "DACR" }, + { "Speaker Mixer", "MIXINL Switch", "MIXINL" }, + { "Speaker Mixer", "MIXINR Switch", "MIXINR" }, + + { "Speaker PGA", "Mixer", "Speaker Mixer" }, + { "Speaker PGA", "DAC", "DACL" }, + + { "Speaker Output", NULL, "Speaker PGA" }, + { "Speaker Output", NULL, "SYSCLK" }, + { "Speaker Output", NULL, "TOCLK" }, + + { "SPKOUT", NULL, "Speaker Output" }, +}; + +static const struct snd_soc_dapm_route wm8962_spk_stereo_intercon[] = { + { "SPKOUTL Mixer", "IN4L Switch", "IN4L" }, + { "SPKOUTL Mixer", "IN4R Switch", "IN4R" }, + { "SPKOUTL Mixer", "DACL Switch", "DACL" }, + { "SPKOUTL Mixer", "DACR Switch", "DACR" }, + { "SPKOUTL Mixer", "MIXINL Switch", "MIXINL" }, + { "SPKOUTL Mixer", "MIXINR Switch", "MIXINR" }, + + { "SPKOUTR Mixer", "IN4L Switch", "IN4L" }, + { "SPKOUTR Mixer", "IN4R Switch", "IN4R" }, + { "SPKOUTR Mixer", "DACL Switch", "DACL" }, + { "SPKOUTR Mixer", "DACR Switch", "DACR" }, + { "SPKOUTR Mixer", "MIXINL Switch", "MIXINL" }, + { "SPKOUTR Mixer", "MIXINR Switch", "MIXINR" }, + + { "SPKOUTL PGA", "Mixer", "SPKOUTL Mixer" }, + { "SPKOUTL PGA", "DAC", "DACL" }, + + { "SPKOUTR PGA", "Mixer", "SPKOUTR Mixer" }, + { "SPKOUTR PGA", "DAC", "DACR" }, + + { "SPKOUTL Output", NULL, "SPKOUTL PGA" }, + { "SPKOUTL Output", NULL, "SYSCLK" }, + { "SPKOUTL Output", NULL, "TOCLK" }, + + { "SPKOUTR Output", NULL, "SPKOUTR PGA" }, + { "SPKOUTR Output", NULL, "SYSCLK" }, + { "SPKOUTR Output", NULL, "TOCLK" }, + + { "SPKOUTL", NULL, "SPKOUTL Output" }, + { "SPKOUTR", NULL, "SPKOUTR Output" }, +}; + +static int wm8962_add_widgets(struct snd_soc_codec *codec) +{ + struct wm8962_pdata *pdata = dev_get_platdata(codec->dev); + + snd_soc_add_controls(codec, wm8962_snd_controls, + ARRAY_SIZE(wm8962_snd_controls)); + if (pdata && pdata->spk_mono) + snd_soc_add_controls(codec, wm8962_spk_mono_controls, + ARRAY_SIZE(wm8962_spk_mono_controls)); + else + snd_soc_add_controls(codec, wm8962_spk_stereo_controls, + ARRAY_SIZE(wm8962_spk_stereo_controls)); + + + snd_soc_dapm_new_controls(codec, wm8962_dapm_widgets, + ARRAY_SIZE(wm8962_dapm_widgets)); + if (pdata && pdata->spk_mono) + snd_soc_dapm_new_controls(codec, wm8962_dapm_spk_mono_widgets, + ARRAY_SIZE(wm8962_dapm_spk_mono_widgets)); + else + snd_soc_dapm_new_controls(codec, wm8962_dapm_spk_stereo_widgets, + ARRAY_SIZE(wm8962_dapm_spk_stereo_widgets)); + + snd_soc_dapm_add_routes(codec, wm8962_intercon, + ARRAY_SIZE(wm8962_intercon)); + if (pdata && pdata->spk_mono) + snd_soc_dapm_add_routes(codec, wm8962_spk_mono_intercon, + ARRAY_SIZE(wm8962_spk_mono_intercon)); + else + snd_soc_dapm_add_routes(codec, wm8962_spk_stereo_intercon, + ARRAY_SIZE(wm8962_spk_stereo_intercon)); + + + snd_soc_dapm_disable_pin(codec, "Beep"); + + return 0; +} + +static void wm8962_sync_cache(struct snd_soc_codec *codec) +{ + struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); + int i; + + if (!codec->cache_sync) + return; + + dev_dbg(codec->dev, "Syncing cache\n"); + + codec->cache_only = 0; + + /* Sync back cached values if they're different from the + * hardware default. + */ + for (i = 1; i < ARRAY_SIZE(wm8962->reg_cache); i++) { + if (i == WM8962_SOFTWARE_RESET) + continue; + if (wm8962->reg_cache[i] == wm8962_reg[i]) + continue; + + snd_soc_write(codec, i, wm8962->reg_cache[i]); + } + + codec->cache_sync = 0; +} + +/* -1 for reserved values */ +static const int bclk_divs[] = { + 1, -1, 2, 3, 4, -1, 6, 8, -1, 12, 16, 24, -1, 32, 32, 32 +}; + +static void wm8962_configure_bclk(struct snd_soc_codec *codec) +{ + struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); + int dspclk, i; + int clocking2 = 0; + int aif2 = 0; + + /* If the CODEC is powered on we can configure BCLK */ + if (codec->bias_level != SND_SOC_BIAS_OFF) { + dev_dbg(codec->dev, "Bias is off, can't configure BCLK\n"); + return; + } + + if (!wm8962->bclk) { + dev_dbg(codec->dev, "No BCLK rate configured\n"); + return; + } + + dspclk = snd_soc_read(codec, WM8962_CLOCKING1); + if (dspclk < 0) { + dev_err(codec->dev, "Failed to read DSPCLK: %d\n", dspclk); + return; + } + + dspclk = (dspclk & WM8962_DSPCLK_DIV_MASK) >> WM8962_DSPCLK_DIV_SHIFT; + switch (dspclk) { + case 0: + dspclk = wm8962->sysclk_rate; + break; + case 1: + dspclk = wm8962->sysclk_rate / 2; + break; + case 2: + dspclk = wm8962->sysclk_rate / 4; + break; + default: + dev_warn(codec->dev, "Unknown DSPCLK divisor read back\n"); + dspclk = wm8962->sysclk; + } + + dev_dbg(codec->dev, "DSPCLK is %dHz, BCLK %d\n", dspclk, wm8962->bclk); + + /* We're expecting an exact match */ + for (i = 0; i < ARRAY_SIZE(bclk_divs); i++) { + if (bclk_divs[i] < 0) + continue; + + if (dspclk / bclk_divs[i] == wm8962->bclk) { + dev_dbg(codec->dev, "Selected BCLK_DIV %d for %dHz\n", + bclk_divs[i], wm8962->bclk); + clocking2 |= i; + break; + } + } + if (i == ARRAY_SIZE(bclk_divs)) { + dev_err(codec->dev, "Unsupported BCLK ratio %d\n", + dspclk / wm8962->bclk); + return; + } + + aif2 |= wm8962->bclk / wm8962->lrclk; + dev_dbg(codec->dev, "Selected LRCLK divisor %d for %dHz\n", + wm8962->bclk / wm8962->lrclk, wm8962->lrclk); + + snd_soc_update_bits(codec, WM8962_CLOCKING2, + WM8962_BCLK_DIV_MASK, clocking2); + snd_soc_update_bits(codec, WM8962_AUDIO_INTERFACE_2, + WM8962_AIF_RATE_MASK, aif2); +} + +static int wm8962_set_bias_level(struct snd_soc_codec *codec, + enum snd_soc_bias_level level) +{ + struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); + int ret; + + if (level == codec->bias_level) + return 0; + + switch (level) { + case SND_SOC_BIAS_ON: + break; + + case SND_SOC_BIAS_PREPARE: + /* VMID 2*50k */ + snd_soc_update_bits(codec, WM8962_PWR_MGMT_1, + WM8962_VMID_SEL_MASK, 0x80); + break; + + case SND_SOC_BIAS_STANDBY: + if (codec->bias_level == SND_SOC_BIAS_OFF) { + ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies), + wm8962->supplies); + if (ret != 0) { + dev_err(codec->dev, + "Failed to enable supplies: %d\n", + ret); + return ret; + } + + wm8962_sync_cache(codec); + + snd_soc_update_bits(codec, WM8962_ANTI_POP, + WM8962_STARTUP_BIAS_ENA | + WM8962_VMID_BUF_ENA, + WM8962_STARTUP_BIAS_ENA | + WM8962_VMID_BUF_ENA); + + /* Bias enable at 2*50k for ramp */ + snd_soc_update_bits(codec, WM8962_PWR_MGMT_1, + WM8962_VMID_SEL_MASK | + WM8962_BIAS_ENA, + WM8962_BIAS_ENA | 0x180); + + msleep(5); + + snd_soc_update_bits(codec, WM8962_CLOCKING2, + WM8962_CLKREG_OVD, + WM8962_CLKREG_OVD); + + wm8962_configure_bclk(codec); + } + + /* VMID 2*250k */ + snd_soc_update_bits(codec, WM8962_PWR_MGMT_1, + WM8962_VMID_SEL_MASK, 0x100); + break; + + case SND_SOC_BIAS_OFF: + snd_soc_update_bits(codec, WM8962_PWR_MGMT_1, + WM8962_VMID_SEL_MASK | WM8962_BIAS_ENA, 0); + + snd_soc_update_bits(codec, WM8962_ANTI_POP, + WM8962_STARTUP_BIAS_ENA | + WM8962_VMID_BUF_ENA, 0); + + regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), + wm8962->supplies); + break; + } + codec->bias_level = level; + return 0; +} + +static const struct { + int rate; + int reg; +} sr_vals[] = { + { 48000, 0 }, + { 44100, 0 }, + { 32000, 1 }, + { 22050, 2 }, + { 24000, 2 }, + { 16000, 3 }, + { 11025, 4 }, + { 12000, 4 }, + { 8000, 5 }, + { 88200, 6 }, + { 96000, 6 }, +}; + +static const int sysclk_rates[] = { + 64, 128, 192, 256, 384, 512, 768, 1024, 1408, 1536, +}; + +static int wm8962_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_device *socdev = rtd->socdev; + struct snd_soc_codec *codec = socdev->card->codec; + struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); + int rate = params_rate(params); + int i; + int aif0 = 0; + int adctl3 = 0; + int clocking4 = 0; + + wm8962->bclk = snd_soc_params_to_bclk(params); + wm8962->lrclk = params_rate(params); + + for (i = 0; i < ARRAY_SIZE(sr_vals); i++) { + if (sr_vals[i].rate == rate) { + adctl3 |= sr_vals[i].reg; + break; + } + } + if (i == ARRAY_SIZE(sr_vals)) { + dev_err(codec->dev, "Unsupported rate %dHz\n", rate); + return -EINVAL; + } + + if (rate % 8000 == 0) + adctl3 |= WM8962_SAMPLE_RATE_INT_MODE; + + for (i = 0; i < ARRAY_SIZE(sysclk_rates); i++) { + if (sysclk_rates[i] == wm8962->sysclk_rate / rate) { + clocking4 |= i << WM8962_SYSCLK_RATE_SHIFT; + break; + } + } + if (i == ARRAY_SIZE(sysclk_rates)) { + dev_err(codec->dev, "Unsupported sysclk ratio %d\n", + wm8962->sysclk_rate / rate); + return -EINVAL; + } + + switch (params_format(params)) { + case SNDRV_PCM_FORMAT_S16_LE: + break; + case SNDRV_PCM_FORMAT_S20_3LE: + aif0 |= 0x40; + break; + case SNDRV_PCM_FORMAT_S24_LE: + aif0 |= 0x80; + break; + case SNDRV_PCM_FORMAT_S32_LE: + aif0 |= 0xc0; + break; + default: + return -EINVAL; + } + + snd_soc_update_bits(codec, WM8962_AUDIO_INTERFACE_0, + WM8962_WL_MASK, aif0); + snd_soc_update_bits(codec, WM8962_ADDITIONAL_CONTROL_3, + WM8962_SAMPLE_RATE_INT_MODE | + WM8962_SAMPLE_RATE_MASK, adctl3); + snd_soc_update_bits(codec, WM8962_CLOCKING_4, + WM8962_SYSCLK_RATE_MASK, clocking4); + + wm8962_configure_bclk(codec); + + return 0; +} + +static int wm8962_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, + unsigned int freq, int dir) +{ + struct snd_soc_codec *codec = dai->codec; + struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); + int src; + + switch (clk_id) { + case WM8962_SYSCLK_MCLK: + wm8962->sysclk = WM8962_SYSCLK_MCLK; + src = 0; + break; + case WM8962_SYSCLK_FLL: + wm8962->sysclk = WM8962_SYSCLK_FLL; + src = 1 << WM8962_SYSCLK_SRC_SHIFT; + WARN_ON(freq != wm8962->fll_fout); + break; + default: + return -EINVAL; + } + + snd_soc_update_bits(codec, WM8962_CLOCKING2, WM8962_SYSCLK_SRC_MASK, + src); + + wm8962->sysclk_rate = freq; + + return 0; +} + +static int wm8962_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) +{ + struct snd_soc_codec *codec = dai->codec; + int aif0 = 0; + + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_DSP_A: + aif0 |= WM8962_LRCLK_INV; + case SND_SOC_DAIFMT_DSP_B: + aif0 |= 3; + + switch (fmt & SND_SOC_DAIFMT_INV_MASK) { + case SND_SOC_DAIFMT_NB_NF: + case SND_SOC_DAIFMT_IB_NF: + break; + default: + return -EINVAL; + } + break; + + case SND_SOC_DAIFMT_RIGHT_J: + break; + case SND_SOC_DAIFMT_LEFT_J: + aif0 |= 1; + break; + case SND_SOC_DAIFMT_I2S: + aif0 |= 2; + break; + default: + return -EINVAL; + } + + switch (fmt & SND_SOC_DAIFMT_INV_MASK) { + case SND_SOC_DAIFMT_NB_NF: + break; + case SND_SOC_DAIFMT_IB_NF: + aif0 |= WM8962_BCLK_INV; + break; + case SND_SOC_DAIFMT_NB_IF: + aif0 |= WM8962_LRCLK_INV; + break; + case SND_SOC_DAIFMT_IB_IF: + aif0 |= WM8962_BCLK_INV | WM8962_LRCLK_INV; + break; + default: + return -EINVAL; + } + + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBM_CFM: + aif0 |= WM8962_MSTR; + break; + case SND_SOC_DAIFMT_CBS_CFS: + break; + default: + return -EINVAL; + } + + snd_soc_update_bits(codec, WM8962_AUDIO_INTERFACE_0, + WM8962_FMT_MASK | WM8962_BCLK_INV | WM8962_MSTR | + WM8962_LRCLK_INV, aif0); + + return 0; +} + +struct _fll_div { + u16 fll_fratio; + u16 fll_outdiv; + u16 fll_refclk_div; + u16 n; + u16 theta; + u16 lambda; +}; + +/* The size in bits of the FLL divide multiplied by 10 + * to allow rounding later */ +#define FIXED_FLL_SIZE ((1 << 16) * 10) + +static struct { + unsigned int min; + unsigned int max; + u16 fll_fratio; + int ratio; +} fll_fratios[] = { + { 0, 64000, 4, 16 }, + { 64000, 128000, 3, 8 }, + { 128000, 256000, 2, 4 }, + { 256000, 1000000, 1, 2 }, + { 1000000, 13500000, 0, 1 }, +}; + +static int fll_factors(struct _fll_div *fll_div, unsigned int Fref, + unsigned int Fout) +{ + unsigned int target; + unsigned int div; + unsigned int fratio, gcd_fll; + int i; + + /* Fref must be <=13.5MHz */ + div = 1; + fll_div->fll_refclk_div = 0; + while ((Fref / div) > 13500000) { + div *= 2; + fll_div->fll_refclk_div++; + + if (div > 4) { + pr_err("Can't scale %dMHz input down to <=13.5MHz\n", + Fref); + return -EINVAL; + } + } + + pr_debug("FLL Fref=%u Fout=%u\n", Fref, Fout); + + /* Apply the division for our remaining calculations */ + Fref /= div; + + /* Fvco should be 90-100MHz; don't check the upper bound */ + div = 2; + while (Fout * div < 90000000) { + div++; + if (div > 64) { + pr_err("Unable to find FLL_OUTDIV for Fout=%uHz\n", + Fout); + return -EINVAL; + } + } + target = Fout * div; + fll_div->fll_outdiv = div - 1; + + pr_debug("FLL Fvco=%dHz\n", target); + + /* Find an appropraite FLL_FRATIO and factor it out of the target */ + for (i = 0; i < ARRAY_SIZE(fll_fratios); i++) { + if (fll_fratios[i].min <= Fref && Fref <= fll_fratios[i].max) { + fll_div->fll_fratio = fll_fratios[i].fll_fratio; + fratio = fll_fratios[i].ratio; + break; + } + } + if (i == ARRAY_SIZE(fll_fratios)) { + pr_err("Unable to find FLL_FRATIO for Fref=%uHz\n", Fref); + return -EINVAL; + } + + fll_div->n = target / (fratio * Fref); + + if (target % Fref == 0) { + fll_div->theta = 0; + fll_div->lambda = 0; + } else { + gcd_fll = gcd(target, fratio * Fref); + + fll_div->theta = (target - (fll_div->n * fratio * Fref)) + / gcd_fll; + fll_div->lambda = (fratio * Fref) / gcd_fll; + } + + pr_debug("FLL N=%x THETA=%x LAMBDA=%x\n", + fll_div->n, fll_div->theta, fll_div->lambda); + pr_debug("FLL_FRATIO=%x FLL_OUTDIV=%x FLL_REFCLK_DIV=%x\n", + fll_div->fll_fratio, fll_div->fll_outdiv, + fll_div->fll_refclk_div); + + return 0; +} + +static int wm8962_set_fll(struct snd_soc_dai *dai, int fll_id, int source, + unsigned int Fref, unsigned int Fout) +{ + struct snd_soc_codec *codec = dai->codec; + struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); + struct _fll_div fll_div; + int ret; + int fll1 = snd_soc_read(codec, WM8962_FLL_CONTROL_1); + + /* Any change? */ + if (source == wm8962->fll_src && Fref == wm8962->fll_fref && + Fout == wm8962->fll_fout) + return 0; + + if (Fout == 0) { + dev_dbg(codec->dev, "FLL disabled\n"); + + wm8962->fll_fref = 0; + wm8962->fll_fout = 0; + + snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1, + WM8962_FLL_ENA, 0); + + return 0; + } + + ret = fll_factors(&fll_div, Fref, Fout); + if (ret != 0) + return ret; + + switch (fll_id) { + case WM8962_FLL_MCLK: + case WM8962_FLL_BCLK: + case WM8962_FLL_OSC: + fll1 |= (fll_id - 1) << WM8962_FLL_REFCLK_SRC_SHIFT; + break; + case WM8962_FLL_INT: + snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1, + WM8962_FLL_OSC_ENA, WM8962_FLL_OSC_ENA); + snd_soc_update_bits(codec, WM8962_FLL_CONTROL_5, + WM8962_FLL_FRC_NCO, WM8962_FLL_FRC_NCO); + break; + default: + dev_err(codec->dev, "Unknown FLL source %d\n", ret); + return -EINVAL; + } + + if (fll_div.theta || fll_div.lambda) + fll1 |= WM8962_FLL_FRAC; + + /* Stop the FLL while we reconfigure */ + snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1, WM8962_FLL_ENA, 0); + + snd_soc_update_bits(codec, WM8962_FLL_CONTROL_2, + WM8962_FLL_OUTDIV_MASK | + WM8962_FLL_REFCLK_DIV_MASK, + (fll_div.fll_outdiv << WM8962_FLL_OUTDIV_SHIFT) | + (fll_div.fll_refclk_div)); + + snd_soc_update_bits(codec, WM8962_FLL_CONTROL_3, + WM8962_FLL_FRATIO_MASK, fll_div.fll_fratio); + + snd_soc_write(codec, WM8962_FLL_CONTROL_6, fll_div.theta); + snd_soc_write(codec, WM8962_FLL_CONTROL_7, fll_div.lambda); + snd_soc_write(codec, WM8962_FLL_CONTROL_8, fll_div.n); + + snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1, + WM8962_FLL_FRAC | WM8962_FLL_REFCLK_SRC_MASK | + WM8962_FLL_ENA, fll1); + + dev_dbg(codec->dev, "FLL configured for %dHz->%dHz\n", Fref, Fout); + + wm8962->fll_fref = Fref; + wm8962->fll_fout = Fout; + wm8962->fll_src = source; + + return 0; +} + +static int wm8962_mute(struct snd_soc_dai *dai, int mute) +{ + struct snd_soc_codec *codec = dai->codec; + int val; + + if (mute) + val = WM8962_DAC_MUTE; + else + val = 0; + + return snd_soc_update_bits(codec, WM8962_ADC_DAC_CONTROL_1, + WM8962_DAC_MUTE, val); +} + +#define WM8962_RATES SNDRV_PCM_RATE_8000_96000 + +#define WM8962_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ + SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) + +static struct snd_soc_dai_ops wm8962_dai_ops = { + .hw_params = wm8962_hw_params, + .set_sysclk = wm8962_set_dai_sysclk, + .set_fmt = wm8962_set_dai_fmt, + .set_pll = wm8962_set_fll, + .digital_mute = wm8962_mute, +}; + +struct snd_soc_dai wm8962_dai = { + .name = "WM8962", + .playback = { + .stream_name = "Playback", + .channels_min = 2, + .channels_max = 2, + .rates = WM8962_RATES, + .formats = WM8962_FORMATS, + }, + .capture = { + .stream_name = "Capture", + .channels_min = 2, + .channels_max = 2, + .rates = WM8962_RATES, + .formats = WM8962_FORMATS, + }, + .ops = &wm8962_dai_ops, + .symmetric_rates = 1, +}; +EXPORT_SYMBOL_GPL(wm8962_dai); + +static int wm8962_probe(struct platform_device *pdev) +{ + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + struct snd_soc_codec *codec; + int ret = 0; + + if (wm8962_codec == NULL) { + dev_err(&pdev->dev, "Codec device not registered\n"); + return -ENODEV; + } + + socdev->card->codec = wm8962_codec; + codec = wm8962_codec; + + /* register pcms */ + ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); + if (ret < 0) { + dev_err(codec->dev, "failed to create pcms: %d\n", ret); + goto pcm_err; + } + + wm8962_add_widgets(codec); + + return ret; + +pcm_err: + return ret; +} + +static int wm8962_remove(struct platform_device *pdev) +{ + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + + snd_soc_free_pcms(socdev); + snd_soc_dapm_free(socdev); + + return 0; +} + +#ifdef CONFIG_PM +static int wm8962_resume(struct platform_device *pdev) +{ + struct snd_soc_device *socdev = platform_get_drvdata(pdev); + struct snd_soc_codec *codec = socdev->card->codec; + struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); + u16 *reg_cache = codec->reg_cache; + int i; + + /* Restore the registers */ + for (i = 1; i < ARRAY_SIZE(wm8962->reg_cache); i++) { + switch (i) { + case WM8962_SOFTWARE_RESET: + continue; + default: + break; + } + + if (reg_cache[i] != wm8962_reg[i]) + snd_soc_write(codec, i, reg_cache[i]); + } + + return 0; +} +#else +#define wm8962_resume NULL +#endif + +struct snd_soc_codec_device soc_codec_dev_wm8962 = { + .probe = wm8962_probe, + .remove = wm8962_remove, + .resume = wm8962_resume, +}; +EXPORT_SYMBOL_GPL(soc_codec_dev_wm8962); + +#if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE) +static int beep_rates[] = { + 500, 1000, 2000, 4000, +}; + +static void wm8962_beep_work(struct work_struct *work) +{ + struct wm8962_priv *wm8962 = + container_of(work, struct wm8962_priv, beep_work); + struct snd_soc_codec *codec = &wm8962->codec; + int i; + int reg = 0; + int best = 0; + + if (wm8962->beep_rate) { + for (i = 0; i < ARRAY_SIZE(beep_rates); i++) { + if (abs(wm8962->beep_rate - beep_rates[i]) < + abs(wm8962->beep_rate - beep_rates[best])) + best = i; + } + + dev_dbg(codec->dev, "Set beep rate %dHz for requested %dHz\n", + beep_rates[best], wm8962->beep_rate); + + reg = WM8962_BEEP_ENA | (best << WM8962_BEEP_RATE_SHIFT); + + snd_soc_dapm_enable_pin(codec, "Beep"); + } else { + dev_dbg(codec->dev, "Disabling beep\n"); + snd_soc_dapm_disable_pin(codec, "Beep"); + } + + snd_soc_update_bits(codec, WM8962_BEEP_GENERATOR_1, + WM8962_BEEP_ENA | WM8962_BEEP_RATE_MASK, reg); + + snd_soc_dapm_sync(codec); +} + +/* For usability define a way of injecting beep events for the device - + * many systems will not have a keyboard. + */ +static int wm8962_beep_event(struct input_dev *dev, unsigned int type, + unsigned int code, int hz) +{ + struct snd_soc_codec *codec = input_get_drvdata(dev); + struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); + + dev_dbg(codec->dev, "Beep event %x %x\n", code, hz); + + switch (code) { + case SND_BELL: + if (hz) + hz = 1000; + case SND_TONE: + break; + default: + return -1; + } + + /* Kick the beep from a workqueue */ + wm8962->beep_rate = hz; + schedule_work(&wm8962->beep_work); + return 0; +} + +static ssize_t wm8962_beep_set(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct wm8962_priv *wm8962 = dev_get_drvdata(dev); + long int time; + + strict_strtol(buf, 10, &time); + + input_event(wm8962->beep, EV_SND, SND_TONE, time); + + return count; +} + +static DEVICE_ATTR(beep, 0200, NULL, wm8962_beep_set); + +static void wm8962_init_beep(struct snd_soc_codec *codec) +{ + struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); + int ret; + + wm8962->beep = input_allocate_device(); + if (!wm8962->beep) { + dev_err(codec->dev, "Failed to allocate beep device\n"); + return; + } + + INIT_WORK(&wm8962->beep_work, wm8962_beep_work); + wm8962->beep_rate = 0; + + wm8962->beep->name = "WM8962 Beep Generator"; + wm8962->beep->phys = dev_name(codec->dev); + wm8962->beep->id.bustype = BUS_I2C; + + wm8962->beep->evbit[0] = BIT_MASK(EV_SND); + wm8962->beep->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE); + wm8962->beep->event = wm8962_beep_event; + wm8962->beep->dev.parent = codec->dev; + input_set_drvdata(wm8962->beep, codec); + + ret = input_register_device(wm8962->beep); + if (ret != 0) { + input_free_device(wm8962->beep); + wm8962->beep = NULL; + dev_err(codec->dev, "Failed to register beep device\n"); + } + + ret = device_create_file(codec->dev, &dev_attr_beep); + if (ret != 0) { + dev_err(codec->dev, "Failed to create keyclick file: %d\n", + ret); + } +} + +static void wm8962_free_beep(struct snd_soc_codec *codec) +{ + struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); + + device_remove_file(codec->dev, &dev_attr_beep); + input_unregister_device(wm8962->beep); + cancel_work_sync(&wm8962->beep_work); + wm8962->beep = NULL; + + snd_soc_update_bits(codec, WM8962_BEEP_GENERATOR_1, WM8962_BEEP_ENA,0); +} +#else +static void wm8962_init_beep(struct snd_soc_codec *codec) +{ +} + +static void wm8962_free_beep(struct snd_soc_codec *codec) +{ +} +#endif + +static int wm8962_register(struct wm8962_priv *wm8962, + enum snd_soc_control_type control) +{ + int ret; + struct snd_soc_codec *codec = &wm8962->codec; + struct wm8962_pdata *pdata = dev_get_platdata(codec->dev); + int i; + + if (wm8962_codec) { + dev_err(codec->dev, "Another WM8962 is registered\n"); + return -EINVAL; + } + + mutex_init(&codec->mutex); + INIT_LIST_HEAD(&codec->dapm_widgets); + INIT_LIST_HEAD(&codec->dapm_paths); + + snd_soc_codec_set_drvdata(codec, wm8962); + codec->name = "WM8962"; + codec->owner = THIS_MODULE; + codec->bias_level = SND_SOC_BIAS_OFF; + codec->set_bias_level = wm8962_set_bias_level; + codec->dai = &wm8962_dai; + codec->num_dai = 1; + codec->reg_cache_size = WM8962_MAX_REGISTER; + codec->reg_cache = &wm8962->reg_cache; + codec->volatile_register = wm8962_volatile_register; + codec->cache_sync = 1; + codec->idle_bias_off = 1; + codec->readable_register = wm8962_readable; + + memcpy(codec->reg_cache, wm8962_reg, sizeof(wm8962_reg)); + + ret = snd_soc_codec_set_cache_io(codec, 16, 16, control); + if (ret != 0) { + dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); + goto err; + } + + for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++) + wm8962->supplies[i].supply = wm8962_supply_names[i]; + + ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8962->supplies), + wm8962->supplies); + if (ret != 0) { + dev_err(codec->dev, "Failed to request supplies: %d\n", ret); + goto err; + } + + wm8962->disable_nb[0].notifier_call = wm8962_regulator_event_0; + wm8962->disable_nb[1].notifier_call = wm8962_regulator_event_1; + wm8962->disable_nb[2].notifier_call = wm8962_regulator_event_2; + wm8962->disable_nb[3].notifier_call = wm8962_regulator_event_3; + wm8962->disable_nb[4].notifier_call = wm8962_regulator_event_4; + wm8962->disable_nb[5].notifier_call = wm8962_regulator_event_5; + wm8962->disable_nb[6].notifier_call = wm8962_regulator_event_6; + wm8962->disable_nb[7].notifier_call = wm8962_regulator_event_7; + + /* This should really be moved into the regulator core */ + for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++) { + ret = regulator_register_notifier(wm8962->supplies[i].consumer, + &wm8962->disable_nb[i]); + if (ret != 0) { + dev_err(codec->dev, + "Failed to register regulator notifier: %d\n", + ret); + } + } + + ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies), + wm8962->supplies); + if (ret != 0) { + dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); + goto err_get; + } + + ret = snd_soc_read(codec, WM8962_SOFTWARE_RESET); + if (ret < 0) { + dev_err(codec->dev, "Failed to read ID register\n"); + goto err_enable; + } + if (ret != wm8962_reg[WM8962_SOFTWARE_RESET]) { + dev_err(codec->dev, "Device is not a WM8962, ID %x != %x\n", + ret, wm8962_reg[WM8962_SOFTWARE_RESET]); + ret = -EINVAL; + goto err_enable; + } + + ret = snd_soc_read(codec, WM8962_RIGHT_INPUT_VOLUME); + if (ret < 0) { + dev_err(codec->dev, "Failed to read device revision: %d\n", + ret); + goto err_enable; + } + + dev_info(codec->dev, "customer id %x revision %c\n", + (ret & WM8962_CUST_ID_MASK) >> WM8962_CUST_ID_SHIFT, + ((ret & WM8962_CHIP_REV_MASK) >> WM8962_CHIP_REV_SHIFT) + + 'A'); + + ret = wm8962_reset(codec); + if (ret < 0) { + dev_err(codec->dev, "Failed to issue reset\n"); + goto err_enable; + } + + /* SYSCLK defaults to on; make sure it is off so we can safely + * write to registers if the device is declocked. + */ + snd_soc_update_bits(codec, WM8962_CLOCKING2, WM8962_SYSCLK_ENA, 0); + + regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); + + if (pdata) { + /* Apply static configuration for GPIOs */ + for (i = 0; i < ARRAY_SIZE(pdata->gpio_init); i++) + if (pdata->gpio_init[i]) + snd_soc_write(codec, 0x200 + i, + pdata->gpio_init[i] & 0xffff); + + /* Put the speakers into mono mode? */ + if (pdata->spk_mono) + wm8962->reg_cache[WM8962_CLASS_D_CONTROL_2] + |= WM8962_SPK_MONO; + } + + /* Latch volume update bits */ + wm8962->reg_cache[WM8962_LEFT_INPUT_VOLUME] |= WM8962_IN_VU; + wm8962->reg_cache[WM8962_RIGHT_INPUT_VOLUME] |= WM8962_IN_VU; + wm8962->reg_cache[WM8962_LEFT_ADC_VOLUME] |= WM8962_ADC_VU; + wm8962->reg_cache[WM8962_RIGHT_ADC_VOLUME] |= WM8962_ADC_VU; + wm8962->reg_cache[WM8962_LEFT_DAC_VOLUME] |= WM8962_DAC_VU; + wm8962->reg_cache[WM8962_RIGHT_DAC_VOLUME] |= WM8962_DAC_VU; + wm8962->reg_cache[WM8962_SPKOUTL_VOLUME] |= WM8962_SPKOUT_VU; + wm8962->reg_cache[WM8962_SPKOUTR_VOLUME] |= WM8962_SPKOUT_VU; + wm8962->reg_cache[WM8962_HPOUTL_VOLUME] |= WM8962_HPOUT_VU; + wm8962->reg_cache[WM8962_HPOUTR_VOLUME] |= WM8962_HPOUT_VU; + + wm8962_dai.dev = codec->dev; + + wm8962_codec = codec; + + ret = snd_soc_register_codec(codec); + if (ret != 0) { + dev_err(codec->dev, "Failed to register codec: %d\n", ret); + return ret; + } + + ret = snd_soc_register_dai(&wm8962_dai); + if (ret != 0) { + dev_err(codec->dev, "Failed to register DAI: %d\n", ret); + snd_soc_unregister_codec(codec); + return ret; + } + + wm8962_init_beep(codec); + + return 0; + +err_enable: + regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); +err_get: + regulator_bulk_free(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); +err: + kfree(wm8962); + return ret; +} + +static void wm8962_unregister(struct wm8962_priv *wm8962) +{ + int i; + + wm8962_free_beep(&wm8962->codec); + wm8962_set_bias_level(&wm8962->codec, SND_SOC_BIAS_OFF); + for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++) + regulator_unregister_notifier(wm8962->supplies[i].consumer, + &wm8962->disable_nb[i]); + regulator_bulk_free(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); + snd_soc_unregister_dai(&wm8962_dai); + snd_soc_unregister_codec(&wm8962->codec); + kfree(wm8962); + wm8962_codec = NULL; +} + +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +static __devinit int wm8962_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) +{ + struct wm8962_priv *wm8962; + struct snd_soc_codec *codec; + + wm8962 = kzalloc(sizeof(struct wm8962_priv), GFP_KERNEL); + if (wm8962 == NULL) + return -ENOMEM; + + codec = &wm8962->codec; + codec->hw_write = (hw_write_t)i2c_master_send; + + i2c_set_clientdata(i2c, wm8962); + codec->control_data = i2c; + + codec->dev = &i2c->dev; + + return wm8962_register(wm8962, SND_SOC_I2C); +} + +static __devexit int wm8962_i2c_remove(struct i2c_client *client) +{ + struct wm8962_priv *wm8962 = i2c_get_clientdata(client); + wm8962_unregister(wm8962); + return 0; +} + +static const struct i2c_device_id wm8962_i2c_id[] = { + { "wm8962", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, wm8962_i2c_id); + +static struct i2c_driver wm8962_i2c_driver = { + .driver = { + .name = "WM8962", + .owner = THIS_MODULE, + }, + .probe = wm8962_i2c_probe, + .remove = __devexit_p(wm8962_i2c_remove), + .id_table = wm8962_i2c_id, +}; +#endif + +static int __init wm8962_modinit(void) +{ + int ret; +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) + ret = i2c_add_driver(&wm8962_i2c_driver); + if (ret != 0) { + printk(KERN_ERR "Failed to register WM8962 I2C driver: %d\n", + ret); + } +#endif + return 0; +} +module_init(wm8962_modinit); + +static void __exit wm8962_exit(void) +{ +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) + i2c_del_driver(&wm8962_i2c_driver); +#endif +} +module_exit(wm8962_exit); + +MODULE_DESCRIPTION("ASoC WM8962 driver"); +MODULE_AUTHOR("Mark Brown "); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/wm8962.h b/sound/soc/codecs/wm8962.h new file mode 100644 index 000000000000..bc0b1876174c --- /dev/null +++ b/sound/soc/codecs/wm8962.h @@ -0,0 +1,3790 @@ +/* + * wm8962.h -- WM8962 ASoC driver + * + * Copyright 2010 Wolfson Microelectronics, plc + * + * Author: Mark Brown + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _WM8962_H +#define _WM8962_H + +#include + +extern struct snd_soc_dai wm8962_dai; +extern struct snd_soc_codec_device soc_codec_dev_wm8962; + +#define WM8962_SYSCLK_MCLK 1 +#define WM8962_SYSCLK_FLL 2 +#define WM8962_SYSCLK_PLL3 3 + +#define WM8962_FLL 1 + +#define WM8962_FLL_MCLK 1 +#define WM8962_FLL_BCLK 2 +#define WM8962_FLL_OSC 3 +#define WM8962_FLL_INT 4 + +/* + * Register values. + */ +#define WM8962_LEFT_INPUT_VOLUME 0x00 +#define WM8962_RIGHT_INPUT_VOLUME 0x01 +#define WM8962_HPOUTL_VOLUME 0x02 +#define WM8962_HPOUTR_VOLUME 0x03 +#define WM8962_CLOCKING1 0x04 +#define WM8962_ADC_DAC_CONTROL_1 0x05 +#define WM8962_ADC_DAC_CONTROL_2 0x06 +#define WM8962_AUDIO_INTERFACE_0 0x07 +#define WM8962_CLOCKING2 0x08 +#define WM8962_AUDIO_INTERFACE_1 0x09 +#define WM8962_LEFT_DAC_VOLUME 0x0A +#define WM8962_RIGHT_DAC_VOLUME 0x0B +#define WM8962_AUDIO_INTERFACE_2 0x0E +#define WM8962_SOFTWARE_RESET 0x0F +#define WM8962_ALC1 0x11 +#define WM8962_ALC2 0x12 +#define WM8962_ALC3 0x13 +#define WM8962_NOISE_GATE 0x14 +#define WM8962_LEFT_ADC_VOLUME 0x15 +#define WM8962_RIGHT_ADC_VOLUME 0x16 +#define WM8962_ADDITIONAL_CONTROL_1 0x17 +#define WM8962_ADDITIONAL_CONTROL_2 0x18 +#define WM8962_PWR_MGMT_1 0x19 +#define WM8962_PWR_MGMT_2 0x1A +#define WM8962_ADDITIONAL_CONTROL_3 0x1B +#define WM8962_ANTI_POP 0x1C +#define WM8962_CLOCKING_3 0x1E +#define WM8962_INPUT_MIXER_CONTROL_1 0x1F +#define WM8962_LEFT_INPUT_MIXER_VOLUME 0x20 +#define WM8962_RIGHT_INPUT_MIXER_VOLUME 0x21 +#define WM8962_INPUT_MIXER_CONTROL_2 0x22 +#define WM8962_INPUT_BIAS_CONTROL 0x23 +#define WM8962_LEFT_INPUT_PGA_CONTROL 0x25 +#define WM8962_RIGHT_INPUT_PGA_CONTROL 0x26 +#define WM8962_SPKOUTL_VOLUME 0x28 +#define WM8962_SPKOUTR_VOLUME 0x29 +#define WM8962_THERMAL_SHUTDOWN_STATUS 0x2F +#define WM8962_ADDITIONAL_CONTROL_4 0x30 +#define WM8962_CLASS_D_CONTROL_1 0x31 +#define WM8962_CLASS_D_CONTROL_2 0x33 +#define WM8962_CLOCKING_4 0x38 +#define WM8962_DAC_DSP_MIXING_1 0x39 +#define WM8962_DAC_DSP_MIXING_2 0x3A +#define WM8962_DC_SERVO_0 0x3C +#define WM8962_DC_SERVO_1 0x3D +#define WM8962_DC_SERVO_4 0x40 +#define WM8962_DC_SERVO_6 0x42 +#define WM8962_ANALOGUE_PGA_BIAS 0x44 +#define WM8962_ANALOGUE_HP_0 0x45 +#define WM8962_ANALOGUE_HP_2 0x47 +#define WM8962_CHARGE_PUMP_1 0x48 +#define WM8962_CHARGE_PUMP_B 0x52 +#define WM8962_WRITE_SEQUENCER_CONTROL_1 0x57 +#define WM8962_WRITE_SEQUENCER_CONTROL_2 0x5A +#define WM8962_WRITE_SEQUENCER_CONTROL_3 0x5D +#define WM8962_CONTROL_INTERFACE 0x5E +#define WM8962_MIXER_ENABLES 0x63 +#define WM8962_HEADPHONE_MIXER_1 0x64 +#define WM8962_HEADPHONE_MIXER_2 0x65 +#define WM8962_HEADPHONE_MIXER_3 0x66 +#define WM8962_HEADPHONE_MIXER_4 0x67 +#define WM8962_SPEAKER_MIXER_1 0x69 +#define WM8962_SPEAKER_MIXER_2 0x6A +#define WM8962_SPEAKER_MIXER_3 0x6B +#define WM8962_SPEAKER_MIXER_4 0x6C +#define WM8962_SPEAKER_MIXER_5 0x6D +#define WM8962_BEEP_GENERATOR_1 0x6E +#define WM8962_OSCILLATOR_TRIM_3 0x73 +#define WM8962_OSCILLATOR_TRIM_4 0x74 +#define WM8962_OSCILLATOR_TRIM_7 0x77 +#define WM8962_ANALOGUE_CLOCKING1 0x7C +#define WM8962_ANALOGUE_CLOCKING2 0x7D +#define WM8962_ANALOGUE_CLOCKING3 0x7E +#define WM8962_PLL_SOFTWARE_RESET 0x7F +#define WM8962_PLL2 0x81 +#define WM8962_PLL_4 0x83 +#define WM8962_PLL_9 0x88 +#define WM8962_PLL_10 0x89 +#define WM8962_PLL_11 0x8A +#define WM8962_PLL_12 0x8B +#define WM8962_PLL_13 0x8C +#define WM8962_PLL_14 0x8D +#define WM8962_PLL_15 0x8E +#define WM8962_PLL_16 0x8F +#define WM8962_FLL_CONTROL_1 0x9B +#define WM8962_FLL_CONTROL_2 0x9C +#define WM8962_FLL_CONTROL_3 0x9D +#define WM8962_FLL_CONTROL_5 0x9F +#define WM8962_FLL_CONTROL_6 0xA0 +#define WM8962_FLL_CONTROL_7 0xA1 +#define WM8962_FLL_CONTROL_8 0xA2 +#define WM8962_GENERAL_TEST_1 0xFC +#define WM8962_DF1 0x100 +#define WM8962_DF2 0x101 +#define WM8962_DF3 0x102 +#define WM8962_DF4 0x103 +#define WM8962_DF5 0x104 +#define WM8962_DF6 0x105 +#define WM8962_DF7 0x106 +#define WM8962_LHPF1 0x108 +#define WM8962_LHPF2 0x109 +#define WM8962_THREED1 0x10C +#define WM8962_THREED2 0x10D +#define WM8962_THREED3 0x10E +#define WM8962_THREED4 0x10F +#define WM8962_DRC_1 0x114 +#define WM8962_DRC_2 0x115 +#define WM8962_DRC_3 0x116 +#define WM8962_DRC_4 0x117 +#define WM8962_DRC_5 0x118 +#define WM8962_TLOOPBACK 0x11D +#define WM8962_EQ1 0x14F +#define WM8962_EQ2 0x150 +#define WM8962_EQ3 0x151 +#define WM8962_EQ4 0x152 +#define WM8962_EQ5 0x153 +#define WM8962_EQ6 0x154 +#define WM8962_EQ7 0x155 +#define WM8962_EQ8 0x156 +#define WM8962_EQ9 0x157 +#define WM8962_EQ10 0x158 +#define WM8962_EQ11 0x159 +#define WM8962_EQ12 0x15A +#define WM8962_EQ13 0x15B +#define WM8962_EQ14 0x15C +#define WM8962_EQ15 0x15D +#define WM8962_EQ16 0x15E +#define WM8962_EQ17 0x15F +#define WM8962_EQ18 0x160 +#define WM8962_EQ19 0x161 +#define WM8962_EQ20 0x162 +#define WM8962_EQ21 0x163 +#define WM8962_EQ22 0x164 +#define WM8962_EQ23 0x165 +#define WM8962_EQ24 0x166 +#define WM8962_EQ25 0x167 +#define WM8962_EQ26 0x168 +#define WM8962_EQ27 0x169 +#define WM8962_EQ28 0x16A +#define WM8962_EQ29 0x16B +#define WM8962_EQ30 0x16C +#define WM8962_EQ31 0x16D +#define WM8962_EQ32 0x16E +#define WM8962_EQ33 0x16F +#define WM8962_EQ34 0x170 +#define WM8962_EQ35 0x171 +#define WM8962_EQ36 0x172 +#define WM8962_EQ37 0x173 +#define WM8962_EQ38 0x174 +#define WM8962_EQ39 0x175 +#define WM8962_EQ40 0x176 +#define WM8962_EQ41 0x177 +#define WM8962_GPIO_2 0x201 +#define WM8962_GPIO_3 0x202 +#define WM8962_GPIO_5 0x204 +#define WM8962_GPIO_6 0x205 +#define WM8962_INTERRUPT_STATUS_1 0x230 +#define WM8962_INTERRUPT_STATUS_2 0x231 +#define WM8962_INTERRUPT_STATUS_1_MASK 0x238 +#define WM8962_INTERRUPT_STATUS_2_MASK 0x239 +#define WM8962_INTERRUPT_CONTROL 0x240 +#define WM8962_IRQ_DEBOUNCE 0x248 +#define WM8962_MICINT_SOURCE_POL 0x24A +#define WM8962_DSP2_POWER_MANAGEMENT 0x300 +#define WM8962_DSP2_EXECCONTROL 0x40D +#define WM8962_WRITE_SEQUENCER_0 0x1000 +#define WM8962_WRITE_SEQUENCER_1 0x1001 +#define WM8962_WRITE_SEQUENCER_2 0x1002 +#define WM8962_WRITE_SEQUENCER_3 0x1003 +#define WM8962_WRITE_SEQUENCER_4 0x1004 +#define WM8962_WRITE_SEQUENCER_5 0x1005 +#define WM8962_WRITE_SEQUENCER_6 0x1006 +#define WM8962_WRITE_SEQUENCER_7 0x1007 +#define WM8962_WRITE_SEQUENCER_8 0x1008 +#define WM8962_WRITE_SEQUENCER_9 0x1009 +#define WM8962_WRITE_SEQUENCER_10 0x100A +#define WM8962_WRITE_SEQUENCER_11 0x100B +#define WM8962_WRITE_SEQUENCER_12 0x100C +#define WM8962_WRITE_SEQUENCER_13 0x100D +#define WM8962_WRITE_SEQUENCER_14 0x100E +#define WM8962_WRITE_SEQUENCER_15 0x100F +#define WM8962_WRITE_SEQUENCER_16 0x1010 +#define WM8962_WRITE_SEQUENCER_17 0x1011 +#define WM8962_WRITE_SEQUENCER_18 0x1012 +#define WM8962_WRITE_SEQUENCER_19 0x1013 +#define WM8962_WRITE_SEQUENCER_20 0x1014 +#define WM8962_WRITE_SEQUENCER_21 0x1015 +#define WM8962_WRITE_SEQUENCER_22 0x1016 +#define WM8962_WRITE_SEQUENCER_23 0x1017 +#define WM8962_WRITE_SEQUENCER_24 0x1018 +#define WM8962_WRITE_SEQUENCER_25 0x1019 +#define WM8962_WRITE_SEQUENCER_26 0x101A +#define WM8962_WRITE_SEQUENCER_27 0x101B +#define WM8962_WRITE_SEQUENCER_28 0x101C +#define WM8962_WRITE_SEQUENCER_29 0x101D +#define WM8962_WRITE_SEQUENCER_30 0x101E +#define WM8962_WRITE_SEQUENCER_31 0x101F +#define WM8962_WRITE_SEQUENCER_32 0x1020 +#define WM8962_WRITE_SEQUENCER_33 0x1021 +#define WM8962_WRITE_SEQUENCER_34 0x1022 +#define WM8962_WRITE_SEQUENCER_35 0x1023 +#define WM8962_WRITE_SEQUENCER_36 0x1024 +#define WM8962_WRITE_SEQUENCER_37 0x1025 +#define WM8962_WRITE_SEQUENCER_38 0x1026 +#define WM8962_WRITE_SEQUENCER_39 0x1027 +#define WM8962_WRITE_SEQUENCER_40 0x1028 +#define WM8962_WRITE_SEQUENCER_41 0x1029 +#define WM8962_WRITE_SEQUENCER_42 0x102A +#define WM8962_WRITE_SEQUENCER_43 0x102B +#define WM8962_WRITE_SEQUENCER_44 0x102C +#define WM8962_WRITE_SEQUENCER_45 0x102D +#define WM8962_WRITE_SEQUENCER_46 0x102E +#define WM8962_WRITE_SEQUENCER_47 0x102F +#define WM8962_WRITE_SEQUENCER_48 0x1030 +#define WM8962_WRITE_SEQUENCER_49 0x1031 +#define WM8962_WRITE_SEQUENCER_50 0x1032 +#define WM8962_WRITE_SEQUENCER_51 0x1033 +#define WM8962_WRITE_SEQUENCER_52 0x1034 +#define WM8962_WRITE_SEQUENCER_53 0x1035 +#define WM8962_WRITE_SEQUENCER_54 0x1036 +#define WM8962_WRITE_SEQUENCER_55 0x1037 +#define WM8962_WRITE_SEQUENCER_56 0x1038 +#define WM8962_WRITE_SEQUENCER_57 0x1039 +#define WM8962_WRITE_SEQUENCER_58 0x103A +#define WM8962_WRITE_SEQUENCER_59 0x103B +#define WM8962_WRITE_SEQUENCER_60 0x103C +#define WM8962_WRITE_SEQUENCER_61 0x103D +#define WM8962_WRITE_SEQUENCER_62 0x103E +#define WM8962_WRITE_SEQUENCER_63 0x103F +#define WM8962_WRITE_SEQUENCER_64 0x1040 +#define WM8962_WRITE_SEQUENCER_65 0x1041 +#define WM8962_WRITE_SEQUENCER_66 0x1042 +#define WM8962_WRITE_SEQUENCER_67 0x1043 +#define WM8962_WRITE_SEQUENCER_68 0x1044 +#define WM8962_WRITE_SEQUENCER_69 0x1045 +#define WM8962_WRITE_SEQUENCER_70 0x1046 +#define WM8962_WRITE_SEQUENCER_71 0x1047 +#define WM8962_WRITE_SEQUENCER_72 0x1048 +#define WM8962_WRITE_SEQUENCER_73 0x1049 +#define WM8962_WRITE_SEQUENCER_74 0x104A +#define WM8962_WRITE_SEQUENCER_75 0x104B +#define WM8962_WRITE_SEQUENCER_76 0x104C +#define WM8962_WRITE_SEQUENCER_77 0x104D +#define WM8962_WRITE_SEQUENCER_78 0x104E +#define WM8962_WRITE_SEQUENCER_79 0x104F +#define WM8962_WRITE_SEQUENCER_80 0x1050 +#define WM8962_WRITE_SEQUENCER_81 0x1051 +#define WM8962_WRITE_SEQUENCER_82 0x1052 +#define WM8962_WRITE_SEQUENCER_83 0x1053 +#define WM8962_WRITE_SEQUENCER_84 0x1054 +#define WM8962_WRITE_SEQUENCER_85 0x1055 +#define WM8962_WRITE_SEQUENCER_86 0x1056 +#define WM8962_WRITE_SEQUENCER_87 0x1057 +#define WM8962_WRITE_SEQUENCER_88 0x1058 +#define WM8962_WRITE_SEQUENCER_89 0x1059 +#define WM8962_WRITE_SEQUENCER_90 0x105A +#define WM8962_WRITE_SEQUENCER_91 0x105B +#define WM8962_WRITE_SEQUENCER_92 0x105C +#define WM8962_WRITE_SEQUENCER_93 0x105D +#define WM8962_WRITE_SEQUENCER_94 0x105E +#define WM8962_WRITE_SEQUENCER_95 0x105F +#define WM8962_WRITE_SEQUENCER_96 0x1060 +#define WM8962_WRITE_SEQUENCER_97 0x1061 +#define WM8962_WRITE_SEQUENCER_98 0x1062 +#define WM8962_WRITE_SEQUENCER_99 0x1063 +#define WM8962_WRITE_SEQUENCER_100 0x1064 +#define WM8962_WRITE_SEQUENCER_101 0x1065 +#define WM8962_WRITE_SEQUENCER_102 0x1066 +#define WM8962_WRITE_SEQUENCER_103 0x1067 +#define WM8962_WRITE_SEQUENCER_104 0x1068 +#define WM8962_WRITE_SEQUENCER_105 0x1069 +#define WM8962_WRITE_SEQUENCER_106 0x106A +#define WM8962_WRITE_SEQUENCER_107 0x106B +#define WM8962_WRITE_SEQUENCER_108 0x106C +#define WM8962_WRITE_SEQUENCER_109 0x106D +#define WM8962_WRITE_SEQUENCER_110 0x106E +#define WM8962_WRITE_SEQUENCER_111 0x106F +#define WM8962_WRITE_SEQUENCER_112 0x1070 +#define WM8962_WRITE_SEQUENCER_113 0x1071 +#define WM8962_WRITE_SEQUENCER_114 0x1072 +#define WM8962_WRITE_SEQUENCER_115 0x1073 +#define WM8962_WRITE_SEQUENCER_116 0x1074 +#define WM8962_WRITE_SEQUENCER_117 0x1075 +#define WM8962_WRITE_SEQUENCER_118 0x1076 +#define WM8962_WRITE_SEQUENCER_119 0x1077 +#define WM8962_WRITE_SEQUENCER_120 0x1078 +#define WM8962_WRITE_SEQUENCER_121 0x1079 +#define WM8962_WRITE_SEQUENCER_122 0x107A +#define WM8962_WRITE_SEQUENCER_123 0x107B +#define WM8962_WRITE_SEQUENCER_124 0x107C +#define WM8962_WRITE_SEQUENCER_125 0x107D +#define WM8962_WRITE_SEQUENCER_126 0x107E +#define WM8962_WRITE_SEQUENCER_127 0x107F +#define WM8962_WRITE_SEQUENCER_128 0x1080 +#define WM8962_WRITE_SEQUENCER_129 0x1081 +#define WM8962_WRITE_SEQUENCER_130 0x1082 +#define WM8962_WRITE_SEQUENCER_131 0x1083 +#define WM8962_WRITE_SEQUENCER_132 0x1084 +#define WM8962_WRITE_SEQUENCER_133 0x1085 +#define WM8962_WRITE_SEQUENCER_134 0x1086 +#define WM8962_WRITE_SEQUENCER_135 0x1087 +#define WM8962_WRITE_SEQUENCER_136 0x1088 +#define WM8962_WRITE_SEQUENCER_137 0x1089 +#define WM8962_WRITE_SEQUENCER_138 0x108A +#define WM8962_WRITE_SEQUENCER_139 0x108B +#define WM8962_WRITE_SEQUENCER_140 0x108C +#define WM8962_WRITE_SEQUENCER_141 0x108D +#define WM8962_WRITE_SEQUENCER_142 0x108E +#define WM8962_WRITE_SEQUENCER_143 0x108F +#define WM8962_WRITE_SEQUENCER_144 0x1090 +#define WM8962_WRITE_SEQUENCER_145 0x1091 +#define WM8962_WRITE_SEQUENCER_146 0x1092 +#define WM8962_WRITE_SEQUENCER_147 0x1093 +#define WM8962_WRITE_SEQUENCER_148 0x1094 +#define WM8962_WRITE_SEQUENCER_149 0x1095 +#define WM8962_WRITE_SEQUENCER_150 0x1096 +#define WM8962_WRITE_SEQUENCER_151 0x1097 +#define WM8962_WRITE_SEQUENCER_152 0x1098 +#define WM8962_WRITE_SEQUENCER_153 0x1099 +#define WM8962_WRITE_SEQUENCER_154 0x109A +#define WM8962_WRITE_SEQUENCER_155 0x109B +#define WM8962_WRITE_SEQUENCER_156 0x109C +#define WM8962_WRITE_SEQUENCER_157 0x109D +#define WM8962_WRITE_SEQUENCER_158 0x109E +#define WM8962_WRITE_SEQUENCER_159 0x109F +#define WM8962_WRITE_SEQUENCER_160 0x10A0 +#define WM8962_WRITE_SEQUENCER_161 0x10A1 +#define WM8962_WRITE_SEQUENCER_162 0x10A2 +#define WM8962_WRITE_SEQUENCER_163 0x10A3 +#define WM8962_WRITE_SEQUENCER_164 0x10A4 +#define WM8962_WRITE_SEQUENCER_165 0x10A5 +#define WM8962_WRITE_SEQUENCER_166 0x10A6 +#define WM8962_WRITE_SEQUENCER_167 0x10A7 +#define WM8962_WRITE_SEQUENCER_168 0x10A8 +#define WM8962_WRITE_SEQUENCER_169 0x10A9 +#define WM8962_WRITE_SEQUENCER_170 0x10AA +#define WM8962_WRITE_SEQUENCER_171 0x10AB +#define WM8962_WRITE_SEQUENCER_172 0x10AC +#define WM8962_WRITE_SEQUENCER_173 0x10AD +#define WM8962_WRITE_SEQUENCER_174 0x10AE +#define WM8962_WRITE_SEQUENCER_175 0x10AF +#define WM8962_WRITE_SEQUENCER_176 0x10B0 +#define WM8962_WRITE_SEQUENCER_177 0x10B1 +#define WM8962_WRITE_SEQUENCER_178 0x10B2 +#define WM8962_WRITE_SEQUENCER_179 0x10B3 +#define WM8962_WRITE_SEQUENCER_180 0x10B4 +#define WM8962_WRITE_SEQUENCER_181 0x10B5 +#define WM8962_WRITE_SEQUENCER_182 0x10B6 +#define WM8962_WRITE_SEQUENCER_183 0x10B7 +#define WM8962_WRITE_SEQUENCER_184 0x10B8 +#define WM8962_WRITE_SEQUENCER_185 0x10B9 +#define WM8962_WRITE_SEQUENCER_186 0x10BA +#define WM8962_WRITE_SEQUENCER_187 0x10BB +#define WM8962_WRITE_SEQUENCER_188 0x10BC +#define WM8962_WRITE_SEQUENCER_189 0x10BD +#define WM8962_WRITE_SEQUENCER_190 0x10BE +#define WM8962_WRITE_SEQUENCER_191 0x10BF +#define WM8962_WRITE_SEQUENCER_192 0x10C0 +#define WM8962_WRITE_SEQUENCER_193 0x10C1 +#define WM8962_WRITE_SEQUENCER_194 0x10C2 +#define WM8962_WRITE_SEQUENCER_195 0x10C3 +#define WM8962_WRITE_SEQUENCER_196 0x10C4 +#define WM8962_WRITE_SEQUENCER_197 0x10C5 +#define WM8962_WRITE_SEQUENCER_198 0x10C6 +#define WM8962_WRITE_SEQUENCER_199 0x10C7 +#define WM8962_WRITE_SEQUENCER_200 0x10C8 +#define WM8962_WRITE_SEQUENCER_201 0x10C9 +#define WM8962_WRITE_SEQUENCER_202 0x10CA +#define WM8962_WRITE_SEQUENCER_203 0x10CB +#define WM8962_WRITE_SEQUENCER_204 0x10CC +#define WM8962_WRITE_SEQUENCER_205 0x10CD +#define WM8962_WRITE_SEQUENCER_206 0x10CE +#define WM8962_WRITE_SEQUENCER_207 0x10CF +#define WM8962_WRITE_SEQUENCER_208 0x10D0 +#define WM8962_WRITE_SEQUENCER_209 0x10D1 +#define WM8962_WRITE_SEQUENCER_210 0x10D2 +#define WM8962_WRITE_SEQUENCER_211 0x10D3 +#define WM8962_WRITE_SEQUENCER_212 0x10D4 +#define WM8962_WRITE_SEQUENCER_213 0x10D5 +#define WM8962_WRITE_SEQUENCER_214 0x10D6 +#define WM8962_WRITE_SEQUENCER_215 0x10D7 +#define WM8962_WRITE_SEQUENCER_216 0x10D8 +#define WM8962_WRITE_SEQUENCER_217 0x10D9 +#define WM8962_WRITE_SEQUENCER_218 0x10DA +#define WM8962_WRITE_SEQUENCER_219 0x10DB +#define WM8962_WRITE_SEQUENCER_220 0x10DC +#define WM8962_WRITE_SEQUENCER_221 0x10DD +#define WM8962_WRITE_SEQUENCER_222 0x10DE +#define WM8962_WRITE_SEQUENCER_223 0x10DF +#define WM8962_WRITE_SEQUENCER_224 0x10E0 +#define WM8962_WRITE_SEQUENCER_225 0x10E1 +#define WM8962_WRITE_SEQUENCER_226 0x10E2 +#define WM8962_WRITE_SEQUENCER_227 0x10E3 +#define WM8962_WRITE_SEQUENCER_228 0x10E4 +#define WM8962_WRITE_SEQUENCER_229 0x10E5 +#define WM8962_WRITE_SEQUENCER_230 0x10E6 +#define WM8962_WRITE_SEQUENCER_231 0x10E7 +#define WM8962_WRITE_SEQUENCER_232 0x10E8 +#define WM8962_WRITE_SEQUENCER_233 0x10E9 +#define WM8962_WRITE_SEQUENCER_234 0x10EA +#define WM8962_WRITE_SEQUENCER_235 0x10EB +#define WM8962_WRITE_SEQUENCER_236 0x10EC +#define WM8962_WRITE_SEQUENCER_237 0x10ED +#define WM8962_WRITE_SEQUENCER_238 0x10EE +#define WM8962_WRITE_SEQUENCER_239 0x10EF +#define WM8962_WRITE_SEQUENCER_240 0x10F0 +#define WM8962_WRITE_SEQUENCER_241 0x10F1 +#define WM8962_WRITE_SEQUENCER_242 0x10F2 +#define WM8962_WRITE_SEQUENCER_243 0x10F3 +#define WM8962_WRITE_SEQUENCER_244 0x10F4 +#define WM8962_WRITE_SEQUENCER_245 0x10F5 +#define WM8962_WRITE_SEQUENCER_246 0x10F6 +#define WM8962_WRITE_SEQUENCER_247 0x10F7 +#define WM8962_WRITE_SEQUENCER_248 0x10F8 +#define WM8962_WRITE_SEQUENCER_249 0x10F9 +#define WM8962_WRITE_SEQUENCER_250 0x10FA +#define WM8962_WRITE_SEQUENCER_251 0x10FB +#define WM8962_WRITE_SEQUENCER_252 0x10FC +#define WM8962_WRITE_SEQUENCER_253 0x10FD +#define WM8962_WRITE_SEQUENCER_254 0x10FE +#define WM8962_WRITE_SEQUENCER_255 0x10FF +#define WM8962_WRITE_SEQUENCER_256 0x1100 +#define WM8962_WRITE_SEQUENCER_257 0x1101 +#define WM8962_WRITE_SEQUENCER_258 0x1102 +#define WM8962_WRITE_SEQUENCER_259 0x1103 +#define WM8962_WRITE_SEQUENCER_260 0x1104 +#define WM8962_WRITE_SEQUENCER_261 0x1105 +#define WM8962_WRITE_SEQUENCER_262 0x1106 +#define WM8962_WRITE_SEQUENCER_263 0x1107 +#define WM8962_WRITE_SEQUENCER_264 0x1108 +#define WM8962_WRITE_SEQUENCER_265 0x1109 +#define WM8962_WRITE_SEQUENCER_266 0x110A +#define WM8962_WRITE_SEQUENCER_267 0x110B +#define WM8962_WRITE_SEQUENCER_268 0x110C +#define WM8962_WRITE_SEQUENCER_269 0x110D +#define WM8962_WRITE_SEQUENCER_270 0x110E +#define WM8962_WRITE_SEQUENCER_271 0x110F +#define WM8962_WRITE_SEQUENCER_272 0x1110 +#define WM8962_WRITE_SEQUENCER_273 0x1111 +#define WM8962_WRITE_SEQUENCER_274 0x1112 +#define WM8962_WRITE_SEQUENCER_275 0x1113 +#define WM8962_WRITE_SEQUENCER_276 0x1114 +#define WM8962_WRITE_SEQUENCER_277 0x1115 +#define WM8962_WRITE_SEQUENCER_278 0x1116 +#define WM8962_WRITE_SEQUENCER_279 0x1117 +#define WM8962_WRITE_SEQUENCER_280 0x1118 +#define WM8962_WRITE_SEQUENCER_281 0x1119 +#define WM8962_WRITE_SEQUENCER_282 0x111A +#define WM8962_WRITE_SEQUENCER_283 0x111B +#define WM8962_WRITE_SEQUENCER_284 0x111C +#define WM8962_WRITE_SEQUENCER_285 0x111D +#define WM8962_WRITE_SEQUENCER_286 0x111E +#define WM8962_WRITE_SEQUENCER_287 0x111F +#define WM8962_WRITE_SEQUENCER_288 0x1120 +#define WM8962_WRITE_SEQUENCER_289 0x1121 +#define WM8962_WRITE_SEQUENCER_290 0x1122 +#define WM8962_WRITE_SEQUENCER_291 0x1123 +#define WM8962_WRITE_SEQUENCER_292 0x1124 +#define WM8962_WRITE_SEQUENCER_293 0x1125 +#define WM8962_WRITE_SEQUENCER_294 0x1126 +#define WM8962_WRITE_SEQUENCER_295 0x1127 +#define WM8962_WRITE_SEQUENCER_296 0x1128 +#define WM8962_WRITE_SEQUENCER_297 0x1129 +#define WM8962_WRITE_SEQUENCER_298 0x112A +#define WM8962_WRITE_SEQUENCER_299 0x112B +#define WM8962_WRITE_SEQUENCER_300 0x112C +#define WM8962_WRITE_SEQUENCER_301 0x112D +#define WM8962_WRITE_SEQUENCER_302 0x112E +#define WM8962_WRITE_SEQUENCER_303 0x112F +#define WM8962_WRITE_SEQUENCER_304 0x1130 +#define WM8962_WRITE_SEQUENCER_305 0x1131 +#define WM8962_WRITE_SEQUENCER_306 0x1132 +#define WM8962_WRITE_SEQUENCER_307 0x1133 +#define WM8962_WRITE_SEQUENCER_308 0x1134 +#define WM8962_WRITE_SEQUENCER_309 0x1135 +#define WM8962_WRITE_SEQUENCER_310 0x1136 +#define WM8962_WRITE_SEQUENCER_311 0x1137 +#define WM8962_WRITE_SEQUENCER_312 0x1138 +#define WM8962_WRITE_SEQUENCER_313 0x1139 +#define WM8962_WRITE_SEQUENCER_314 0x113A +#define WM8962_WRITE_SEQUENCER_315 0x113B +#define WM8962_WRITE_SEQUENCER_316 0x113C +#define WM8962_WRITE_SEQUENCER_317 0x113D +#define WM8962_WRITE_SEQUENCER_318 0x113E +#define WM8962_WRITE_SEQUENCER_319 0x113F +#define WM8962_WRITE_SEQUENCER_320 0x1140 +#define WM8962_WRITE_SEQUENCER_321 0x1141 +#define WM8962_WRITE_SEQUENCER_322 0x1142 +#define WM8962_WRITE_SEQUENCER_323 0x1143 +#define WM8962_WRITE_SEQUENCER_324 0x1144 +#define WM8962_WRITE_SEQUENCER_325 0x1145 +#define WM8962_WRITE_SEQUENCER_326 0x1146 +#define WM8962_WRITE_SEQUENCER_327 0x1147 +#define WM8962_WRITE_SEQUENCER_328 0x1148 +#define WM8962_WRITE_SEQUENCER_329 0x1149 +#define WM8962_WRITE_SEQUENCER_330 0x114A +#define WM8962_WRITE_SEQUENCER_331 0x114B +#define WM8962_WRITE_SEQUENCER_332 0x114C +#define WM8962_WRITE_SEQUENCER_333 0x114D +#define WM8962_WRITE_SEQUENCER_334 0x114E +#define WM8962_WRITE_SEQUENCER_335 0x114F +#define WM8962_WRITE_SEQUENCER_336 0x1150 +#define WM8962_WRITE_SEQUENCER_337 0x1151 +#define WM8962_WRITE_SEQUENCER_338 0x1152 +#define WM8962_WRITE_SEQUENCER_339 0x1153 +#define WM8962_WRITE_SEQUENCER_340 0x1154 +#define WM8962_WRITE_SEQUENCER_341 0x1155 +#define WM8962_WRITE_SEQUENCER_342 0x1156 +#define WM8962_WRITE_SEQUENCER_343 0x1157 +#define WM8962_WRITE_SEQUENCER_344 0x1158 +#define WM8962_WRITE_SEQUENCER_345 0x1159 +#define WM8962_WRITE_SEQUENCER_346 0x115A +#define WM8962_WRITE_SEQUENCER_347 0x115B +#define WM8962_WRITE_SEQUENCER_348 0x115C +#define WM8962_WRITE_SEQUENCER_349 0x115D +#define WM8962_WRITE_SEQUENCER_350 0x115E +#define WM8962_WRITE_SEQUENCER_351 0x115F +#define WM8962_WRITE_SEQUENCER_352 0x1160 +#define WM8962_WRITE_SEQUENCER_353 0x1161 +#define WM8962_WRITE_SEQUENCER_354 0x1162 +#define WM8962_WRITE_SEQUENCER_355 0x1163 +#define WM8962_WRITE_SEQUENCER_356 0x1164 +#define WM8962_WRITE_SEQUENCER_357 0x1165 +#define WM8962_WRITE_SEQUENCER_358 0x1166 +#define WM8962_WRITE_SEQUENCER_359 0x1167 +#define WM8962_WRITE_SEQUENCER_360 0x1168 +#define WM8962_WRITE_SEQUENCER_361 0x1169 +#define WM8962_WRITE_SEQUENCER_362 0x116A +#define WM8962_WRITE_SEQUENCER_363 0x116B +#define WM8962_WRITE_SEQUENCER_364 0x116C +#define WM8962_WRITE_SEQUENCER_365 0x116D +#define WM8962_WRITE_SEQUENCER_366 0x116E +#define WM8962_WRITE_SEQUENCER_367 0x116F +#define WM8962_WRITE_SEQUENCER_368 0x1170 +#define WM8962_WRITE_SEQUENCER_369 0x1171 +#define WM8962_WRITE_SEQUENCER_370 0x1172 +#define WM8962_WRITE_SEQUENCER_371 0x1173 +#define WM8962_WRITE_SEQUENCER_372 0x1174 +#define WM8962_WRITE_SEQUENCER_373 0x1175 +#define WM8962_WRITE_SEQUENCER_374 0x1176 +#define WM8962_WRITE_SEQUENCER_375 0x1177 +#define WM8962_WRITE_SEQUENCER_376 0x1178 +#define WM8962_WRITE_SEQUENCER_377 0x1179 +#define WM8962_WRITE_SEQUENCER_378 0x117A +#define WM8962_WRITE_SEQUENCER_379 0x117B +#define WM8962_WRITE_SEQUENCER_380 0x117C +#define WM8962_WRITE_SEQUENCER_381 0x117D +#define WM8962_WRITE_SEQUENCER_382 0x117E +#define WM8962_WRITE_SEQUENCER_383 0x117F +#define WM8962_WRITE_SEQUENCER_384 0x1180 +#define WM8962_WRITE_SEQUENCER_385 0x1181 +#define WM8962_WRITE_SEQUENCER_386 0x1182 +#define WM8962_WRITE_SEQUENCER_387 0x1183 +#define WM8962_WRITE_SEQUENCER_388 0x1184 +#define WM8962_WRITE_SEQUENCER_389 0x1185 +#define WM8962_WRITE_SEQUENCER_390 0x1186 +#define WM8962_WRITE_SEQUENCER_391 0x1187 +#define WM8962_WRITE_SEQUENCER_392 0x1188 +#define WM8962_WRITE_SEQUENCER_393 0x1189 +#define WM8962_WRITE_SEQUENCER_394 0x118A +#define WM8962_WRITE_SEQUENCER_395 0x118B +#define WM8962_WRITE_SEQUENCER_396 0x118C +#define WM8962_WRITE_SEQUENCER_397 0x118D +#define WM8962_WRITE_SEQUENCER_398 0x118E +#define WM8962_WRITE_SEQUENCER_399 0x118F +#define WM8962_WRITE_SEQUENCER_400 0x1190 +#define WM8962_WRITE_SEQUENCER_401 0x1191 +#define WM8962_WRITE_SEQUENCER_402 0x1192 +#define WM8962_WRITE_SEQUENCER_403 0x1193 +#define WM8962_WRITE_SEQUENCER_404 0x1194 +#define WM8962_WRITE_SEQUENCER_405 0x1195 +#define WM8962_WRITE_SEQUENCER_406 0x1196 +#define WM8962_WRITE_SEQUENCER_407 0x1197 +#define WM8962_WRITE_SEQUENCER_408 0x1198 +#define WM8962_WRITE_SEQUENCER_409 0x1199 +#define WM8962_WRITE_SEQUENCER_410 0x119A +#define WM8962_WRITE_SEQUENCER_411 0x119B +#define WM8962_WRITE_SEQUENCER_412 0x119C +#define WM8962_WRITE_SEQUENCER_413 0x119D +#define WM8962_WRITE_SEQUENCER_414 0x119E +#define WM8962_WRITE_SEQUENCER_415 0x119F +#define WM8962_WRITE_SEQUENCER_416 0x11A0 +#define WM8962_WRITE_SEQUENCER_417 0x11A1 +#define WM8962_WRITE_SEQUENCER_418 0x11A2 +#define WM8962_WRITE_SEQUENCER_419 0x11A3 +#define WM8962_WRITE_SEQUENCER_420 0x11A4 +#define WM8962_WRITE_SEQUENCER_421 0x11A5 +#define WM8962_WRITE_SEQUENCER_422 0x11A6 +#define WM8962_WRITE_SEQUENCER_423 0x11A7 +#define WM8962_WRITE_SEQUENCER_424 0x11A8 +#define WM8962_WRITE_SEQUENCER_425 0x11A9 +#define WM8962_WRITE_SEQUENCER_426 0x11AA +#define WM8962_WRITE_SEQUENCER_427 0x11AB +#define WM8962_WRITE_SEQUENCER_428 0x11AC +#define WM8962_WRITE_SEQUENCER_429 0x11AD +#define WM8962_WRITE_SEQUENCER_430 0x11AE +#define WM8962_WRITE_SEQUENCER_431 0x11AF +#define WM8962_WRITE_SEQUENCER_432 0x11B0 +#define WM8962_WRITE_SEQUENCER_433 0x11B1 +#define WM8962_WRITE_SEQUENCER_434 0x11B2 +#define WM8962_WRITE_SEQUENCER_435 0x11B3 +#define WM8962_WRITE_SEQUENCER_436 0x11B4 +#define WM8962_WRITE_SEQUENCER_437 0x11B5 +#define WM8962_WRITE_SEQUENCER_438 0x11B6 +#define WM8962_WRITE_SEQUENCER_439 0x11B7 +#define WM8962_WRITE_SEQUENCER_440 0x11B8 +#define WM8962_WRITE_SEQUENCER_441 0x11B9 +#define WM8962_WRITE_SEQUENCER_442 0x11BA +#define WM8962_WRITE_SEQUENCER_443 0x11BB +#define WM8962_WRITE_SEQUENCER_444 0x11BC +#define WM8962_WRITE_SEQUENCER_445 0x11BD +#define WM8962_WRITE_SEQUENCER_446 0x11BE +#define WM8962_WRITE_SEQUENCER_447 0x11BF +#define WM8962_WRITE_SEQUENCER_448 0x11C0 +#define WM8962_WRITE_SEQUENCER_449 0x11C1 +#define WM8962_WRITE_SEQUENCER_450 0x11C2 +#define WM8962_WRITE_SEQUENCER_451 0x11C3 +#define WM8962_WRITE_SEQUENCER_452 0x11C4 +#define WM8962_WRITE_SEQUENCER_453 0x11C5 +#define WM8962_WRITE_SEQUENCER_454 0x11C6 +#define WM8962_WRITE_SEQUENCER_455 0x11C7 +#define WM8962_WRITE_SEQUENCER_456 0x11C8 +#define WM8962_WRITE_SEQUENCER_457 0x11C9 +#define WM8962_WRITE_SEQUENCER_458 0x11CA +#define WM8962_WRITE_SEQUENCER_459 0x11CB +#define WM8962_WRITE_SEQUENCER_460 0x11CC +#define WM8962_WRITE_SEQUENCER_461 0x11CD +#define WM8962_WRITE_SEQUENCER_462 0x11CE +#define WM8962_WRITE_SEQUENCER_463 0x11CF +#define WM8962_WRITE_SEQUENCER_464 0x11D0 +#define WM8962_WRITE_SEQUENCER_465 0x11D1 +#define WM8962_WRITE_SEQUENCER_466 0x11D2 +#define WM8962_WRITE_SEQUENCER_467 0x11D3 +#define WM8962_WRITE_SEQUENCER_468 0x11D4 +#define WM8962_WRITE_SEQUENCER_469 0x11D5 +#define WM8962_WRITE_SEQUENCER_470 0x11D6 +#define WM8962_WRITE_SEQUENCER_471 0x11D7 +#define WM8962_WRITE_SEQUENCER_472 0x11D8 +#define WM8962_WRITE_SEQUENCER_473 0x11D9 +#define WM8962_WRITE_SEQUENCER_474 0x11DA +#define WM8962_WRITE_SEQUENCER_475 0x11DB +#define WM8962_WRITE_SEQUENCER_476 0x11DC +#define WM8962_WRITE_SEQUENCER_477 0x11DD +#define WM8962_WRITE_SEQUENCER_478 0x11DE +#define WM8962_WRITE_SEQUENCER_479 0x11DF +#define WM8962_WRITE_SEQUENCER_480 0x11E0 +#define WM8962_WRITE_SEQUENCER_481 0x11E1 +#define WM8962_WRITE_SEQUENCER_482 0x11E2 +#define WM8962_WRITE_SEQUENCER_483 0x11E3 +#define WM8962_WRITE_SEQUENCER_484 0x11E4 +#define WM8962_WRITE_SEQUENCER_485 0x11E5 +#define WM8962_WRITE_SEQUENCER_486 0x11E6 +#define WM8962_WRITE_SEQUENCER_487 0x11E7 +#define WM8962_WRITE_SEQUENCER_488 0x11E8 +#define WM8962_WRITE_SEQUENCER_489 0x11E9 +#define WM8962_WRITE_SEQUENCER_490 0x11EA +#define WM8962_WRITE_SEQUENCER_491 0x11EB +#define WM8962_WRITE_SEQUENCER_492 0x11EC +#define WM8962_WRITE_SEQUENCER_493 0x11ED +#define WM8962_WRITE_SEQUENCER_494 0x11EE +#define WM8962_WRITE_SEQUENCER_495 0x11EF +#define WM8962_WRITE_SEQUENCER_496 0x11F0 +#define WM8962_WRITE_SEQUENCER_497 0x11F1 +#define WM8962_WRITE_SEQUENCER_498 0x11F2 +#define WM8962_WRITE_SEQUENCER_499 0x11F3 +#define WM8962_WRITE_SEQUENCER_500 0x11F4 +#define WM8962_WRITE_SEQUENCER_501 0x11F5 +#define WM8962_WRITE_SEQUENCER_502 0x11F6 +#define WM8962_WRITE_SEQUENCER_503 0x11F7 +#define WM8962_WRITE_SEQUENCER_504 0x11F8 +#define WM8962_WRITE_SEQUENCER_505 0x11F9 +#define WM8962_WRITE_SEQUENCER_506 0x11FA +#define WM8962_WRITE_SEQUENCER_507 0x11FB +#define WM8962_WRITE_SEQUENCER_508 0x11FC +#define WM8962_WRITE_SEQUENCER_509 0x11FD +#define WM8962_WRITE_SEQUENCER_510 0x11FE +#define WM8962_WRITE_SEQUENCER_511 0x11FF +#define WM8962_DSP2_INSTRUCTION_RAM_0 0x2000 +#define WM8962_DSP2_ADDRESS_RAM_2 0x2400 +#define WM8962_DSP2_ADDRESS_RAM_1 0x2401 +#define WM8962_DSP2_ADDRESS_RAM_0 0x2402 +#define WM8962_DSP2_DATA1_RAM_1 0x3000 +#define WM8962_DSP2_DATA1_RAM_0 0x3001 +#define WM8962_DSP2_DATA2_RAM_1 0x3400 +#define WM8962_DSP2_DATA2_RAM_0 0x3401 +#define WM8962_DSP2_DATA3_RAM_1 0x3800 +#define WM8962_DSP2_DATA3_RAM_0 0x3801 +#define WM8962_DSP2_COEFF_RAM_0 0x3C00 +#define WM8962_RETUNEADC_SHARED_COEFF_1 0x4000 +#define WM8962_RETUNEADC_SHARED_COEFF_0 0x4001 +#define WM8962_RETUNEDAC_SHARED_COEFF_1 0x4002 +#define WM8962_RETUNEDAC_SHARED_COEFF_0 0x4003 +#define WM8962_SOUNDSTAGE_ENABLES_1 0x4004 +#define WM8962_SOUNDSTAGE_ENABLES_0 0x4005 +#define WM8962_HDBASS_AI_1 0x4200 +#define WM8962_HDBASS_AI_0 0x4201 +#define WM8962_HDBASS_AR_1 0x4202 +#define WM8962_HDBASS_AR_0 0x4203 +#define WM8962_HDBASS_B_1 0x4204 +#define WM8962_HDBASS_B_0 0x4205 +#define WM8962_HDBASS_K_1 0x4206 +#define WM8962_HDBASS_K_0 0x4207 +#define WM8962_HDBASS_N1_1 0x4208 +#define WM8962_HDBASS_N1_0 0x4209 +#define WM8962_HDBASS_N2_1 0x420A +#define WM8962_HDBASS_N2_0 0x420B +#define WM8962_HDBASS_N3_1 0x420C +#define WM8962_HDBASS_N3_0 0x420D +#define WM8962_HDBASS_N4_1 0x420E +#define WM8962_HDBASS_N4_0 0x420F +#define WM8962_HDBASS_N5_1 0x4210 +#define WM8962_HDBASS_N5_0 0x4211 +#define WM8962_HDBASS_X1_1 0x4212 +#define WM8962_HDBASS_X1_0 0x4213 +#define WM8962_HDBASS_X2_1 0x4214 +#define WM8962_HDBASS_X2_0 0x4215 +#define WM8962_HDBASS_X3_1 0x4216 +#define WM8962_HDBASS_X3_0 0x4217 +#define WM8962_HDBASS_ATK_1 0x4218 +#define WM8962_HDBASS_ATK_0 0x4219 +#define WM8962_HDBASS_DCY_1 0x421A +#define WM8962_HDBASS_DCY_0 0x421B +#define WM8962_HDBASS_PG_1 0x421C +#define WM8962_HDBASS_PG_0 0x421D +#define WM8962_HPF_C_1 0x4400 +#define WM8962_HPF_C_0 0x4401 +#define WM8962_ADCL_RETUNE_C1_1 0x4600 +#define WM8962_ADCL_RETUNE_C1_0 0x4601 +#define WM8962_ADCL_RETUNE_C2_1 0x4602 +#define WM8962_ADCL_RETUNE_C2_0 0x4603 +#define WM8962_ADCL_RETUNE_C3_1 0x4604 +#define WM8962_ADCL_RETUNE_C3_0 0x4605 +#define WM8962_ADCL_RETUNE_C4_1 0x4606 +#define WM8962_ADCL_RETUNE_C4_0 0x4607 +#define WM8962_ADCL_RETUNE_C5_1 0x4608 +#define WM8962_ADCL_RETUNE_C5_0 0x4609 +#define WM8962_ADCL_RETUNE_C6_1 0x460A +#define WM8962_ADCL_RETUNE_C6_0 0x460B +#define WM8962_ADCL_RETUNE_C7_1 0x460C +#define WM8962_ADCL_RETUNE_C7_0 0x460D +#define WM8962_ADCL_RETUNE_C8_1 0x460E +#define WM8962_ADCL_RETUNE_C8_0 0x460F +#define WM8962_ADCL_RETUNE_C9_1 0x4610 +#define WM8962_ADCL_RETUNE_C9_0 0x4611 +#define WM8962_ADCL_RETUNE_C10_1 0x4612 +#define WM8962_ADCL_RETUNE_C10_0 0x4613 +#define WM8962_ADCL_RETUNE_C11_1 0x4614 +#define WM8962_ADCL_RETUNE_C11_0 0x4615 +#define WM8962_ADCL_RETUNE_C12_1 0x4616 +#define WM8962_ADCL_RETUNE_C12_0 0x4617 +#define WM8962_ADCL_RETUNE_C13_1 0x4618 +#define WM8962_ADCL_RETUNE_C13_0 0x4619 +#define WM8962_ADCL_RETUNE_C14_1 0x461A +#define WM8962_ADCL_RETUNE_C14_0 0x461B +#define WM8962_ADCL_RETUNE_C15_1 0x461C +#define WM8962_ADCL_RETUNE_C15_0 0x461D +#define WM8962_ADCL_RETUNE_C16_1 0x461E +#define WM8962_ADCL_RETUNE_C16_0 0x461F +#define WM8962_ADCL_RETUNE_C17_1 0x4620 +#define WM8962_ADCL_RETUNE_C17_0 0x4621 +#define WM8962_ADCL_RETUNE_C18_1 0x4622 +#define WM8962_ADCL_RETUNE_C18_0 0x4623 +#define WM8962_ADCL_RETUNE_C19_1 0x4624 +#define WM8962_ADCL_RETUNE_C19_0 0x4625 +#define WM8962_ADCL_RETUNE_C20_1 0x4626 +#define WM8962_ADCL_RETUNE_C20_0 0x4627 +#define WM8962_ADCL_RETUNE_C21_1 0x4628 +#define WM8962_ADCL_RETUNE_C21_0 0x4629 +#define WM8962_ADCL_RETUNE_C22_1 0x462A +#define WM8962_ADCL_RETUNE_C22_0 0x462B +#define WM8962_ADCL_RETUNE_C23_1 0x462C +#define WM8962_ADCL_RETUNE_C23_0 0x462D +#define WM8962_ADCL_RETUNE_C24_1 0x462E +#define WM8962_ADCL_RETUNE_C24_0 0x462F +#define WM8962_ADCL_RETUNE_C25_1 0x4630 +#define WM8962_ADCL_RETUNE_C25_0 0x4631 +#define WM8962_ADCL_RETUNE_C26_1 0x4632 +#define WM8962_ADCL_RETUNE_C26_0 0x4633 +#define WM8962_ADCL_RETUNE_C27_1 0x4634 +#define WM8962_ADCL_RETUNE_C27_0 0x4635 +#define WM8962_ADCL_RETUNE_C28_1 0x4636 +#define WM8962_ADCL_RETUNE_C28_0 0x4637 +#define WM8962_ADCL_RETUNE_C29_1 0x4638 +#define WM8962_ADCL_RETUNE_C29_0 0x4639 +#define WM8962_ADCL_RETUNE_C30_1 0x463A +#define WM8962_ADCL_RETUNE_C30_0 0x463B +#define WM8962_ADCL_RETUNE_C31_1 0x463C +#define WM8962_ADCL_RETUNE_C31_0 0x463D +#define WM8962_ADCL_RETUNE_C32_1 0x463E +#define WM8962_ADCL_RETUNE_C32_0 0x463F +#define WM8962_RETUNEADC_PG2_1 0x4800 +#define WM8962_RETUNEADC_PG2_0 0x4801 +#define WM8962_RETUNEADC_PG_1 0x4802 +#define WM8962_RETUNEADC_PG_0 0x4803 +#define WM8962_ADCR_RETUNE_C1_1 0x4A00 +#define WM8962_ADCR_RETUNE_C1_0 0x4A01 +#define WM8962_ADCR_RETUNE_C2_1 0x4A02 +#define WM8962_ADCR_RETUNE_C2_0 0x4A03 +#define WM8962_ADCR_RETUNE_C3_1 0x4A04 +#define WM8962_ADCR_RETUNE_C3_0 0x4A05 +#define WM8962_ADCR_RETUNE_C4_1 0x4A06 +#define WM8962_ADCR_RETUNE_C4_0 0x4A07 +#define WM8962_ADCR_RETUNE_C5_1 0x4A08 +#define WM8962_ADCR_RETUNE_C5_0 0x4A09 +#define WM8962_ADCR_RETUNE_C6_1 0x4A0A +#define WM8962_ADCR_RETUNE_C6_0 0x4A0B +#define WM8962_ADCR_RETUNE_C7_1 0x4A0C +#define WM8962_ADCR_RETUNE_C7_0 0x4A0D +#define WM8962_ADCR_RETUNE_C8_1 0x4A0E +#define WM8962_ADCR_RETUNE_C8_0 0x4A0F +#define WM8962_ADCR_RETUNE_C9_1 0x4A10 +#define WM8962_ADCR_RETUNE_C9_0 0x4A11 +#define WM8962_ADCR_RETUNE_C10_1 0x4A12 +#define WM8962_ADCR_RETUNE_C10_0 0x4A13 +#define WM8962_ADCR_RETUNE_C11_1 0x4A14 +#define WM8962_ADCR_RETUNE_C11_0 0x4A15 +#define WM8962_ADCR_RETUNE_C12_1 0x4A16 +#define WM8962_ADCR_RETUNE_C12_0 0x4A17 +#define WM8962_ADCR_RETUNE_C13_1 0x4A18 +#define WM8962_ADCR_RETUNE_C13_0 0x4A19 +#define WM8962_ADCR_RETUNE_C14_1 0x4A1A +#define WM8962_ADCR_RETUNE_C14_0 0x4A1B +#define WM8962_ADCR_RETUNE_C15_1 0x4A1C +#define WM8962_ADCR_RETUNE_C15_0 0x4A1D +#define WM8962_ADCR_RETUNE_C16_1 0x4A1E +#define WM8962_ADCR_RETUNE_C16_0 0x4A1F +#define WM8962_ADCR_RETUNE_C17_1 0x4A20 +#define WM8962_ADCR_RETUNE_C17_0 0x4A21 +#define WM8962_ADCR_RETUNE_C18_1 0x4A22 +#define WM8962_ADCR_RETUNE_C18_0 0x4A23 +#define WM8962_ADCR_RETUNE_C19_1 0x4A24 +#define WM8962_ADCR_RETUNE_C19_0 0x4A25 +#define WM8962_ADCR_RETUNE_C20_1 0x4A26 +#define WM8962_ADCR_RETUNE_C20_0 0x4A27 +#define WM8962_ADCR_RETUNE_C21_1 0x4A28 +#define WM8962_ADCR_RETUNE_C21_0 0x4A29 +#define WM8962_ADCR_RETUNE_C22_1 0x4A2A +#define WM8962_ADCR_RETUNE_C22_0 0x4A2B +#define WM8962_ADCR_RETUNE_C23_1 0x4A2C +#define WM8962_ADCR_RETUNE_C23_0 0x4A2D +#define WM8962_ADCR_RETUNE_C24_1 0x4A2E +#define WM8962_ADCR_RETUNE_C24_0 0x4A2F +#define WM8962_ADCR_RETUNE_C25_1 0x4A30 +#define WM8962_ADCR_RETUNE_C25_0 0x4A31 +#define WM8962_ADCR_RETUNE_C26_1 0x4A32 +#define WM8962_ADCR_RETUNE_C26_0 0x4A33 +#define WM8962_ADCR_RETUNE_C27_1 0x4A34 +#define WM8962_ADCR_RETUNE_C27_0 0x4A35 +#define WM8962_ADCR_RETUNE_C28_1 0x4A36 +#define WM8962_ADCR_RETUNE_C28_0 0x4A37 +#define WM8962_ADCR_RETUNE_C29_1 0x4A38 +#define WM8962_ADCR_RETUNE_C29_0 0x4A39 +#define WM8962_ADCR_RETUNE_C30_1 0x4A3A +#define WM8962_ADCR_RETUNE_C30_0 0x4A3B +#define WM8962_ADCR_RETUNE_C31_1 0x4A3C +#define WM8962_ADCR_RETUNE_C31_0 0x4A3D +#define WM8962_ADCR_RETUNE_C32_1 0x4A3E +#define WM8962_ADCR_RETUNE_C32_0 0x4A3F +#define WM8962_DACL_RETUNE_C1_1 0x4C00 +#define WM8962_DACL_RETUNE_C1_0 0x4C01 +#define WM8962_DACL_RETUNE_C2_1 0x4C02 +#define WM8962_DACL_RETUNE_C2_0 0x4C03 +#define WM8962_DACL_RETUNE_C3_1 0x4C04 +#define WM8962_DACL_RETUNE_C3_0 0x4C05 +#define WM8962_DACL_RETUNE_C4_1 0x4C06 +#define WM8962_DACL_RETUNE_C4_0 0x4C07 +#define WM8962_DACL_RETUNE_C5_1 0x4C08 +#define WM8962_DACL_RETUNE_C5_0 0x4C09 +#define WM8962_DACL_RETUNE_C6_1 0x4C0A +#define WM8962_DACL_RETUNE_C6_0 0x4C0B +#define WM8962_DACL_RETUNE_C7_1 0x4C0C +#define WM8962_DACL_RETUNE_C7_0 0x4C0D +#define WM8962_DACL_RETUNE_C8_1 0x4C0E +#define WM8962_DACL_RETUNE_C8_0 0x4C0F +#define WM8962_DACL_RETUNE_C9_1 0x4C10 +#define WM8962_DACL_RETUNE_C9_0 0x4C11 +#define WM8962_DACL_RETUNE_C10_1 0x4C12 +#define WM8962_DACL_RETUNE_C10_0 0x4C13 +#define WM8962_DACL_RETUNE_C11_1 0x4C14 +#define WM8962_DACL_RETUNE_C11_0 0x4C15 +#define WM8962_DACL_RETUNE_C12_1 0x4C16 +#define WM8962_DACL_RETUNE_C12_0 0x4C17 +#define WM8962_DACL_RETUNE_C13_1 0x4C18 +#define WM8962_DACL_RETUNE_C13_0 0x4C19 +#define WM8962_DACL_RETUNE_C14_1 0x4C1A +#define WM8962_DACL_RETUNE_C14_0 0x4C1B +#define WM8962_DACL_RETUNE_C15_1 0x4C1C +#define WM8962_DACL_RETUNE_C15_0 0x4C1D +#define WM8962_DACL_RETUNE_C16_1 0x4C1E +#define WM8962_DACL_RETUNE_C16_0 0x4C1F +#define WM8962_DACL_RETUNE_C17_1 0x4C20 +#define WM8962_DACL_RETUNE_C17_0 0x4C21 +#define WM8962_DACL_RETUNE_C18_1 0x4C22 +#define WM8962_DACL_RETUNE_C18_0 0x4C23 +#define WM8962_DACL_RETUNE_C19_1 0x4C24 +#define WM8962_DACL_RETUNE_C19_0 0x4C25 +#define WM8962_DACL_RETUNE_C20_1 0x4C26 +#define WM8962_DACL_RETUNE_C20_0 0x4C27 +#define WM8962_DACL_RETUNE_C21_1 0x4C28 +#define WM8962_DACL_RETUNE_C21_0 0x4C29 +#define WM8962_DACL_RETUNE_C22_1 0x4C2A +#define WM8962_DACL_RETUNE_C22_0 0x4C2B +#define WM8962_DACL_RETUNE_C23_1 0x4C2C +#define WM8962_DACL_RETUNE_C23_0 0x4C2D +#define WM8962_DACL_RETUNE_C24_1 0x4C2E +#define WM8962_DACL_RETUNE_C24_0 0x4C2F +#define WM8962_DACL_RETUNE_C25_1 0x4C30 +#define WM8962_DACL_RETUNE_C25_0 0x4C31 +#define WM8962_DACL_RETUNE_C26_1 0x4C32 +#define WM8962_DACL_RETUNE_C26_0 0x4C33 +#define WM8962_DACL_RETUNE_C27_1 0x4C34 +#define WM8962_DACL_RETUNE_C27_0 0x4C35 +#define WM8962_DACL_RETUNE_C28_1 0x4C36 +#define WM8962_DACL_RETUNE_C28_0 0x4C37 +#define WM8962_DACL_RETUNE_C29_1 0x4C38 +#define WM8962_DACL_RETUNE_C29_0 0x4C39 +#define WM8962_DACL_RETUNE_C30_1 0x4C3A +#define WM8962_DACL_RETUNE_C30_0 0x4C3B +#define WM8962_DACL_RETUNE_C31_1 0x4C3C +#define WM8962_DACL_RETUNE_C31_0 0x4C3D +#define WM8962_DACL_RETUNE_C32_1 0x4C3E +#define WM8962_DACL_RETUNE_C32_0 0x4C3F +#define WM8962_RETUNEDAC_PG2_1 0x4E00 +#define WM8962_RETUNEDAC_PG2_0 0x4E01 +#define WM8962_RETUNEDAC_PG_1 0x4E02 +#define WM8962_RETUNEDAC_PG_0 0x4E03 +#define WM8962_DACR_RETUNE_C1_1 0x5000 +#define WM8962_DACR_RETUNE_C1_0 0x5001 +#define WM8962_DACR_RETUNE_C2_1 0x5002 +#define WM8962_DACR_RETUNE_C2_0 0x5003 +#define WM8962_DACR_RETUNE_C3_1 0x5004 +#define WM8962_DACR_RETUNE_C3_0 0x5005 +#define WM8962_DACR_RETUNE_C4_1 0x5006 +#define WM8962_DACR_RETUNE_C4_0 0x5007 +#define WM8962_DACR_RETUNE_C5_1 0x5008 +#define WM8962_DACR_RETUNE_C5_0 0x5009 +#define WM8962_DACR_RETUNE_C6_1 0x500A +#define WM8962_DACR_RETUNE_C6_0 0x500B +#define WM8962_DACR_RETUNE_C7_1 0x500C +#define WM8962_DACR_RETUNE_C7_0 0x500D +#define WM8962_DACR_RETUNE_C8_1 0x500E +#define WM8962_DACR_RETUNE_C8_0 0x500F +#define WM8962_DACR_RETUNE_C9_1 0x5010 +#define WM8962_DACR_RETUNE_C9_0 0x5011 +#define WM8962_DACR_RETUNE_C10_1 0x5012 +#define WM8962_DACR_RETUNE_C10_0 0x5013 +#define WM8962_DACR_RETUNE_C11_1 0x5014 +#define WM8962_DACR_RETUNE_C11_0 0x5015 +#define WM8962_DACR_RETUNE_C12_1 0x5016 +#define WM8962_DACR_RETUNE_C12_0 0x5017 +#define WM8962_DACR_RETUNE_C13_1 0x5018 +#define WM8962_DACR_RETUNE_C13_0 0x5019 +#define WM8962_DACR_RETUNE_C14_1 0x501A +#define WM8962_DACR_RETUNE_C14_0 0x501B +#define WM8962_DACR_RETUNE_C15_1 0x501C +#define WM8962_DACR_RETUNE_C15_0 0x501D +#define WM8962_DACR_RETUNE_C16_1 0x501E +#define WM8962_DACR_RETUNE_C16_0 0x501F +#define WM8962_DACR_RETUNE_C17_1 0x5020 +#define WM8962_DACR_RETUNE_C17_0 0x5021 +#define WM8962_DACR_RETUNE_C18_1 0x5022 +#define WM8962_DACR_RETUNE_C18_0 0x5023 +#define WM8962_DACR_RETUNE_C19_1 0x5024 +#define WM8962_DACR_RETUNE_C19_0 0x5025 +#define WM8962_DACR_RETUNE_C20_1 0x5026 +#define WM8962_DACR_RETUNE_C20_0 0x5027 +#define WM8962_DACR_RETUNE_C21_1 0x5028 +#define WM8962_DACR_RETUNE_C21_0 0x5029 +#define WM8962_DACR_RETUNE_C22_1 0x502A +#define WM8962_DACR_RETUNE_C22_0 0x502B +#define WM8962_DACR_RETUNE_C23_1 0x502C +#define WM8962_DACR_RETUNE_C23_0 0x502D +#define WM8962_DACR_RETUNE_C24_1 0x502E +#define WM8962_DACR_RETUNE_C24_0 0x502F +#define WM8962_DACR_RETUNE_C25_1 0x5030 +#define WM8962_DACR_RETUNE_C25_0 0x5031 +#define WM8962_DACR_RETUNE_C26_1 0x5032 +#define WM8962_DACR_RETUNE_C26_0 0x5033 +#define WM8962_DACR_RETUNE_C27_1 0x5034 +#define WM8962_DACR_RETUNE_C27_0 0x5035 +#define WM8962_DACR_RETUNE_C28_1 0x5036 +#define WM8962_DACR_RETUNE_C28_0 0x5037 +#define WM8962_DACR_RETUNE_C29_1 0x5038 +#define WM8962_DACR_RETUNE_C29_0 0x5039 +#define WM8962_DACR_RETUNE_C30_1 0x503A +#define WM8962_DACR_RETUNE_C30_0 0x503B +#define WM8962_DACR_RETUNE_C31_1 0x503C +#define WM8962_DACR_RETUNE_C31_0 0x503D +#define WM8962_DACR_RETUNE_C32_1 0x503E +#define WM8962_DACR_RETUNE_C32_0 0x503F +#define WM8962_VSS_XHD2_1 0x5200 +#define WM8962_VSS_XHD2_0 0x5201 +#define WM8962_VSS_XHD3_1 0x5202 +#define WM8962_VSS_XHD3_0 0x5203 +#define WM8962_VSS_XHN1_1 0x5204 +#define WM8962_VSS_XHN1_0 0x5205 +#define WM8962_VSS_XHN2_1 0x5206 +#define WM8962_VSS_XHN2_0 0x5207 +#define WM8962_VSS_XHN3_1 0x5208 +#define WM8962_VSS_XHN3_0 0x5209 +#define WM8962_VSS_XLA_1 0x520A +#define WM8962_VSS_XLA_0 0x520B +#define WM8962_VSS_XLB_1 0x520C +#define WM8962_VSS_XLB_0 0x520D +#define WM8962_VSS_XLG_1 0x520E +#define WM8962_VSS_XLG_0 0x520F +#define WM8962_VSS_PG2_1 0x5210 +#define WM8962_VSS_PG2_0 0x5211 +#define WM8962_VSS_PG_1 0x5212 +#define WM8962_VSS_PG_0 0x5213 +#define WM8962_VSS_XTD1_1 0x5214 +#define WM8962_VSS_XTD1_0 0x5215 +#define WM8962_VSS_XTD2_1 0x5216 +#define WM8962_VSS_XTD2_0 0x5217 +#define WM8962_VSS_XTD3_1 0x5218 +#define WM8962_VSS_XTD3_0 0x5219 +#define WM8962_VSS_XTD4_1 0x521A +#define WM8962_VSS_XTD4_0 0x521B +#define WM8962_VSS_XTD5_1 0x521C +#define WM8962_VSS_XTD5_0 0x521D +#define WM8962_VSS_XTD6_1 0x521E +#define WM8962_VSS_XTD6_0 0x521F +#define WM8962_VSS_XTD7_1 0x5220 +#define WM8962_VSS_XTD7_0 0x5221 +#define WM8962_VSS_XTD8_1 0x5222 +#define WM8962_VSS_XTD8_0 0x5223 +#define WM8962_VSS_XTD9_1 0x5224 +#define WM8962_VSS_XTD9_0 0x5225 +#define WM8962_VSS_XTD10_1 0x5226 +#define WM8962_VSS_XTD10_0 0x5227 +#define WM8962_VSS_XTD11_1 0x5228 +#define WM8962_VSS_XTD11_0 0x5229 +#define WM8962_VSS_XTD12_1 0x522A +#define WM8962_VSS_XTD12_0 0x522B +#define WM8962_VSS_XTD13_1 0x522C +#define WM8962_VSS_XTD13_0 0x522D +#define WM8962_VSS_XTD14_1 0x522E +#define WM8962_VSS_XTD14_0 0x522F +#define WM8962_VSS_XTD15_1 0x5230 +#define WM8962_VSS_XTD15_0 0x5231 +#define WM8962_VSS_XTD16_1 0x5232 +#define WM8962_VSS_XTD16_0 0x5233 +#define WM8962_VSS_XTD17_1 0x5234 +#define WM8962_VSS_XTD17_0 0x5235 +#define WM8962_VSS_XTD18_1 0x5236 +#define WM8962_VSS_XTD18_0 0x5237 +#define WM8962_VSS_XTD19_1 0x5238 +#define WM8962_VSS_XTD19_0 0x5239 +#define WM8962_VSS_XTD20_1 0x523A +#define WM8962_VSS_XTD20_0 0x523B +#define WM8962_VSS_XTD21_1 0x523C +#define WM8962_VSS_XTD21_0 0x523D +#define WM8962_VSS_XTD22_1 0x523E +#define WM8962_VSS_XTD22_0 0x523F +#define WM8962_VSS_XTD23_1 0x5240 +#define WM8962_VSS_XTD23_0 0x5241 +#define WM8962_VSS_XTD24_1 0x5242 +#define WM8962_VSS_XTD24_0 0x5243 +#define WM8962_VSS_XTD25_1 0x5244 +#define WM8962_VSS_XTD25_0 0x5245 +#define WM8962_VSS_XTD26_1 0x5246 +#define WM8962_VSS_XTD26_0 0x5247 +#define WM8962_VSS_XTD27_1 0x5248 +#define WM8962_VSS_XTD27_0 0x5249 +#define WM8962_VSS_XTD28_1 0x524A +#define WM8962_VSS_XTD28_0 0x524B +#define WM8962_VSS_XTD29_1 0x524C +#define WM8962_VSS_XTD29_0 0x524D +#define WM8962_VSS_XTD30_1 0x524E +#define WM8962_VSS_XTD30_0 0x524F +#define WM8962_VSS_XTD31_1 0x5250 +#define WM8962_VSS_XTD31_0 0x5251 +#define WM8962_VSS_XTD32_1 0x5252 +#define WM8962_VSS_XTD32_0 0x5253 +#define WM8962_VSS_XTS1_1 0x5254 +#define WM8962_VSS_XTS1_0 0x5255 +#define WM8962_VSS_XTS2_1 0x5256 +#define WM8962_VSS_XTS2_0 0x5257 +#define WM8962_VSS_XTS3_1 0x5258 +#define WM8962_VSS_XTS3_0 0x5259 +#define WM8962_VSS_XTS4_1 0x525A +#define WM8962_VSS_XTS4_0 0x525B +#define WM8962_VSS_XTS5_1 0x525C +#define WM8962_VSS_XTS5_0 0x525D +#define WM8962_VSS_XTS6_1 0x525E +#define WM8962_VSS_XTS6_0 0x525F +#define WM8962_VSS_XTS7_1 0x5260 +#define WM8962_VSS_XTS7_0 0x5261 +#define WM8962_VSS_XTS8_1 0x5262 +#define WM8962_VSS_XTS8_0 0x5263 +#define WM8962_VSS_XTS9_1 0x5264 +#define WM8962_VSS_XTS9_0 0x5265 +#define WM8962_VSS_XTS10_1 0x5266 +#define WM8962_VSS_XTS10_0 0x5267 +#define WM8962_VSS_XTS11_1 0x5268 +#define WM8962_VSS_XTS11_0 0x5269 +#define WM8962_VSS_XTS12_1 0x526A +#define WM8962_VSS_XTS12_0 0x526B +#define WM8962_VSS_XTS13_1 0x526C +#define WM8962_VSS_XTS13_0 0x526D +#define WM8962_VSS_XTS14_1 0x526E +#define WM8962_VSS_XTS14_0 0x526F +#define WM8962_VSS_XTS15_1 0x5270 +#define WM8962_VSS_XTS15_0 0x5271 +#define WM8962_VSS_XTS16_1 0x5272 +#define WM8962_VSS_XTS16_0 0x5273 +#define WM8962_VSS_XTS17_1 0x5274 +#define WM8962_VSS_XTS17_0 0x5275 +#define WM8962_VSS_XTS18_1 0x5276 +#define WM8962_VSS_XTS18_0 0x5277 +#define WM8962_VSS_XTS19_1 0x5278 +#define WM8962_VSS_XTS19_0 0x5279 +#define WM8962_VSS_XTS20_1 0x527A +#define WM8962_VSS_XTS20_0 0x527B +#define WM8962_VSS_XTS21_1 0x527C +#define WM8962_VSS_XTS21_0 0x527D +#define WM8962_VSS_XTS22_1 0x527E +#define WM8962_VSS_XTS22_0 0x527F +#define WM8962_VSS_XTS23_1 0x5280 +#define WM8962_VSS_XTS23_0 0x5281 +#define WM8962_VSS_XTS24_1 0x5282 +#define WM8962_VSS_XTS24_0 0x5283 +#define WM8962_VSS_XTS25_1 0x5284 +#define WM8962_VSS_XTS25_0 0x5285 +#define WM8962_VSS_XTS26_1 0x5286 +#define WM8962_VSS_XTS26_0 0x5287 +#define WM8962_VSS_XTS27_1 0x5288 +#define WM8962_VSS_XTS27_0 0x5289 +#define WM8962_VSS_XTS28_1 0x528A +#define WM8962_VSS_XTS28_0 0x528B +#define WM8962_VSS_XTS29_1 0x528C +#define WM8962_VSS_XTS29_0 0x528D +#define WM8962_VSS_XTS30_1 0x528E +#define WM8962_VSS_XTS30_0 0x528F +#define WM8962_VSS_XTS31_1 0x5290 +#define WM8962_VSS_XTS31_0 0x5291 +#define WM8962_VSS_XTS32_1 0x5292 +#define WM8962_VSS_XTS32_0 0x5293 + +#define WM8962_REGISTER_COUNT 1138 +#define WM8962_MAX_REGISTER 0x5293 + +/* + * Field Definitions. + */ + +/* + * R0 (0x00) - Left Input volume + */ +#define WM8962_IN_VU 0x0100 /* IN_VU */ +#define WM8962_IN_VU_MASK 0x0100 /* IN_VU */ +#define WM8962_IN_VU_SHIFT 8 /* IN_VU */ +#define WM8962_IN_VU_WIDTH 1 /* IN_VU */ +#define WM8962_INPGAL_MUTE 0x0080 /* INPGAL_MUTE */ +#define WM8962_INPGAL_MUTE_MASK 0x0080 /* INPGAL_MUTE */ +#define WM8962_INPGAL_MUTE_SHIFT 7 /* INPGAL_MUTE */ +#define WM8962_INPGAL_MUTE_WIDTH 1 /* INPGAL_MUTE */ +#define WM8962_INL_ZC 0x0040 /* INL_ZC */ +#define WM8962_INL_ZC_MASK 0x0040 /* INL_ZC */ +#define WM8962_INL_ZC_SHIFT 6 /* INL_ZC */ +#define WM8962_INL_ZC_WIDTH 1 /* INL_ZC */ +#define WM8962_INL_VOL_MASK 0x003F /* INL_VOL - [5:0] */ +#define WM8962_INL_VOL_SHIFT 0 /* INL_VOL - [5:0] */ +#define WM8962_INL_VOL_WIDTH 6 /* INL_VOL - [5:0] */ + +/* + * R1 (0x01) - Right Input volume + */ +#define WM8962_CUST_ID_MASK 0xF000 /* CUST_ID - [15:12] */ +#define WM8962_CUST_ID_SHIFT 12 /* CUST_ID - [15:12] */ +#define WM8962_CUST_ID_WIDTH 4 /* CUST_ID - [15:12] */ +#define WM8962_CHIP_REV_MASK 0x0E00 /* CHIP_REV - [11:9] */ +#define WM8962_CHIP_REV_SHIFT 9 /* CHIP_REV - [11:9] */ +#define WM8962_CHIP_REV_WIDTH 3 /* CHIP_REV - [11:9] */ +#define WM8962_IN_VU 0x0100 /* IN_VU */ +#define WM8962_IN_VU_MASK 0x0100 /* IN_VU */ +#define WM8962_IN_VU_SHIFT 8 /* IN_VU */ +#define WM8962_IN_VU_WIDTH 1 /* IN_VU */ +#define WM8962_INPGAR_MUTE 0x0080 /* INPGAR_MUTE */ +#define WM8962_INPGAR_MUTE_MASK 0x0080 /* INPGAR_MUTE */ +#define WM8962_INPGAR_MUTE_SHIFT 7 /* INPGAR_MUTE */ +#define WM8962_INPGAR_MUTE_WIDTH 1 /* INPGAR_MUTE */ +#define WM8962_INR_ZC 0x0040 /* INR_ZC */ +#define WM8962_INR_ZC_MASK 0x0040 /* INR_ZC */ +#define WM8962_INR_ZC_SHIFT 6 /* INR_ZC */ +#define WM8962_INR_ZC_WIDTH 1 /* INR_ZC */ +#define WM8962_INR_VOL_MASK 0x003F /* INR_VOL - [5:0] */ +#define WM8962_INR_VOL_SHIFT 0 /* INR_VOL - [5:0] */ +#define WM8962_INR_VOL_WIDTH 6 /* INR_VOL - [5:0] */ + +/* + * R2 (0x02) - HPOUTL volume + */ +#define WM8962_HPOUT_VU 0x0100 /* HPOUT_VU */ +#define WM8962_HPOUT_VU_MASK 0x0100 /* HPOUT_VU */ +#define WM8962_HPOUT_VU_SHIFT 8 /* HPOUT_VU */ +#define WM8962_HPOUT_VU_WIDTH 1 /* HPOUT_VU */ +#define WM8962_HPOUTL_ZC 0x0080 /* HPOUTL_ZC */ +#define WM8962_HPOUTL_ZC_MASK 0x0080 /* HPOUTL_ZC */ +#define WM8962_HPOUTL_ZC_SHIFT 7 /* HPOUTL_ZC */ +#define WM8962_HPOUTL_ZC_WIDTH 1 /* HPOUTL_ZC */ +#define WM8962_HPOUTL_VOL_MASK 0x007F /* HPOUTL_VOL - [6:0] */ +#define WM8962_HPOUTL_VOL_SHIFT 0 /* HPOUTL_VOL - [6:0] */ +#define WM8962_HPOUTL_VOL_WIDTH 7 /* HPOUTL_VOL - [6:0] */ + +/* + * R3 (0x03) - HPOUTR volume + */ +#define WM8962_HPOUT_VU 0x0100 /* HPOUT_VU */ +#define WM8962_HPOUT_VU_MASK 0x0100 /* HPOUT_VU */ +#define WM8962_HPOUT_VU_SHIFT 8 /* HPOUT_VU */ +#define WM8962_HPOUT_VU_WIDTH 1 /* HPOUT_VU */ +#define WM8962_HPOUTR_ZC 0x0080 /* HPOUTR_ZC */ +#define WM8962_HPOUTR_ZC_MASK 0x0080 /* HPOUTR_ZC */ +#define WM8962_HPOUTR_ZC_SHIFT 7 /* HPOUTR_ZC */ +#define WM8962_HPOUTR_ZC_WIDTH 1 /* HPOUTR_ZC */ +#define WM8962_HPOUTR_VOL_MASK 0x007F /* HPOUTR_VOL - [6:0] */ +#define WM8962_HPOUTR_VOL_SHIFT 0 /* HPOUTR_VOL - [6:0] */ +#define WM8962_HPOUTR_VOL_WIDTH 7 /* HPOUTR_VOL - [6:0] */ + +/* + * R4 (0x04) - Clocking1 + */ +#define WM8962_DSPCLK_DIV_MASK 0x0600 /* DSPCLK_DIV - [10:9] */ +#define WM8962_DSPCLK_DIV_SHIFT 9 /* DSPCLK_DIV - [10:9] */ +#define WM8962_DSPCLK_DIV_WIDTH 2 /* DSPCLK_DIV - [10:9] */ +#define WM8962_ADCSYS_CLK_DIV_MASK 0x01C0 /* ADCSYS_CLK_DIV - [8:6] */ +#define WM8962_ADCSYS_CLK_DIV_SHIFT 6 /* ADCSYS_CLK_DIV - [8:6] */ +#define WM8962_ADCSYS_CLK_DIV_WIDTH 3 /* ADCSYS_CLK_DIV - [8:6] */ +#define WM8962_DACSYS_CLK_DIV_MASK 0x0038 /* DACSYS_CLK_DIV - [5:3] */ +#define WM8962_DACSYS_CLK_DIV_SHIFT 3 /* DACSYS_CLK_DIV - [5:3] */ +#define WM8962_DACSYS_CLK_DIV_WIDTH 3 /* DACSYS_CLK_DIV - [5:3] */ +#define WM8962_MCLKDIV_MASK 0x0006 /* MCLKDIV - [2:1] */ +#define WM8962_MCLKDIV_SHIFT 1 /* MCLKDIV - [2:1] */ +#define WM8962_MCLKDIV_WIDTH 2 /* MCLKDIV - [2:1] */ + +/* + * R5 (0x05) - ADC & DAC Control 1 + */ +#define WM8962_ADCR_DAT_INV 0x0040 /* ADCR_DAT_INV */ +#define WM8962_ADCR_DAT_INV_MASK 0x0040 /* ADCR_DAT_INV */ +#define WM8962_ADCR_DAT_INV_SHIFT 6 /* ADCR_DAT_INV */ +#define WM8962_ADCR_DAT_INV_WIDTH 1 /* ADCR_DAT_INV */ +#define WM8962_ADCL_DAT_INV 0x0020 /* ADCL_DAT_INV */ +#define WM8962_ADCL_DAT_INV_MASK 0x0020 /* ADCL_DAT_INV */ +#define WM8962_ADCL_DAT_INV_SHIFT 5 /* ADCL_DAT_INV */ +#define WM8962_ADCL_DAT_INV_WIDTH 1 /* ADCL_DAT_INV */ +#define WM8962_DAC_MUTE_RAMP 0x0010 /* DAC_MUTE_RAMP */ +#define WM8962_DAC_MUTE_RAMP_MASK 0x0010 /* DAC_MUTE_RAMP */ +#define WM8962_DAC_MUTE_RAMP_SHIFT 4 /* DAC_MUTE_RAMP */ +#define WM8962_DAC_MUTE_RAMP_WIDTH 1 /* DAC_MUTE_RAMP */ +#define WM8962_DAC_MUTE 0x0008 /* DAC_MUTE */ +#define WM8962_DAC_MUTE_MASK 0x0008 /* DAC_MUTE */ +#define WM8962_DAC_MUTE_SHIFT 3 /* DAC_MUTE */ +#define WM8962_DAC_MUTE_WIDTH 1 /* DAC_MUTE */ +#define WM8962_DAC_DEEMP_MASK 0x0006 /* DAC_DEEMP - [2:1] */ +#define WM8962_DAC_DEEMP_SHIFT 1 /* DAC_DEEMP - [2:1] */ +#define WM8962_DAC_DEEMP_WIDTH 2 /* DAC_DEEMP - [2:1] */ +#define WM8962_ADC_HPF_DIS 0x0001 /* ADC_HPF_DIS */ +#define WM8962_ADC_HPF_DIS_MASK 0x0001 /* ADC_HPF_DIS */ +#define WM8962_ADC_HPF_DIS_SHIFT 0 /* ADC_HPF_DIS */ +#define WM8962_ADC_HPF_DIS_WIDTH 1 /* ADC_HPF_DIS */ + +/* + * R6 (0x06) - ADC & DAC Control 2 + */ +#define WM8962_ADC_HPF_SR_MASK 0x3000 /* ADC_HPF_SR - [13:12] */ +#define WM8962_ADC_HPF_SR_SHIFT 12 /* ADC_HPF_SR - [13:12] */ +#define WM8962_ADC_HPF_SR_WIDTH 2 /* ADC_HPF_SR - [13:12] */ +#define WM8962_ADC_HPF_MODE 0x0400 /* ADC_HPF_MODE */ +#define WM8962_ADC_HPF_MODE_MASK 0x0400 /* ADC_HPF_MODE */ +#define WM8962_ADC_HPF_MODE_SHIFT 10 /* ADC_HPF_MODE */ +#define WM8962_ADC_HPF_MODE_WIDTH 1 /* ADC_HPF_MODE */ +#define WM8962_ADC_HPF_CUT_MASK 0x0380 /* ADC_HPF_CUT - [9:7] */ +#define WM8962_ADC_HPF_CUT_SHIFT 7 /* ADC_HPF_CUT - [9:7] */ +#define WM8962_ADC_HPF_CUT_WIDTH 3 /* ADC_HPF_CUT - [9:7] */ +#define WM8962_DACR_DAT_INV 0x0040 /* DACR_DAT_INV */ +#define WM8962_DACR_DAT_INV_MASK 0x0040 /* DACR_DAT_INV */ +#define WM8962_DACR_DAT_INV_SHIFT 6 /* DACR_DAT_INV */ +#define WM8962_DACR_DAT_INV_WIDTH 1 /* DACR_DAT_INV */ +#define WM8962_DACL_DAT_INV 0x0020 /* DACL_DAT_INV */ +#define WM8962_DACL_DAT_INV_MASK 0x0020 /* DACL_DAT_INV */ +#define WM8962_DACL_DAT_INV_SHIFT 5 /* DACL_DAT_INV */ +#define WM8962_DACL_DAT_INV_WIDTH 1 /* DACL_DAT_INV */ +#define WM8962_DAC_UNMUTE_RAMP 0x0008 /* DAC_UNMUTE_RAMP */ +#define WM8962_DAC_UNMUTE_RAMP_MASK 0x0008 /* DAC_UNMUTE_RAMP */ +#define WM8962_DAC_UNMUTE_RAMP_SHIFT 3 /* DAC_UNMUTE_RAMP */ +#define WM8962_DAC_UNMUTE_RAMP_WIDTH 1 /* DAC_UNMUTE_RAMP */ +#define WM8962_DAC_MUTERATE 0x0004 /* DAC_MUTERATE */ +#define WM8962_DAC_MUTERATE_MASK 0x0004 /* DAC_MUTERATE */ +#define WM8962_DAC_MUTERATE_SHIFT 2 /* DAC_MUTERATE */ +#define WM8962_DAC_MUTERATE_WIDTH 1 /* DAC_MUTERATE */ +#define WM8962_DAC_HP 0x0001 /* DAC_HP */ +#define WM8962_DAC_HP_MASK 0x0001 /* DAC_HP */ +#define WM8962_DAC_HP_SHIFT 0 /* DAC_HP */ +#define WM8962_DAC_HP_WIDTH 1 /* DAC_HP */ + +/* + * R7 (0x07) - Audio Interface 0 + */ +#define WM8962_AIFDAC_TDM_MODE 0x1000 /* AIFDAC_TDM_MODE */ +#define WM8962_AIFDAC_TDM_MODE_MASK 0x1000 /* AIFDAC_TDM_MODE */ +#define WM8962_AIFDAC_TDM_MODE_SHIFT 12 /* AIFDAC_TDM_MODE */ +#define WM8962_AIFDAC_TDM_MODE_WIDTH 1 /* AIFDAC_TDM_MODE */ +#define WM8962_AIFDAC_TDM_SLOT 0x0800 /* AIFDAC_TDM_SLOT */ +#define WM8962_AIFDAC_TDM_SLOT_MASK 0x0800 /* AIFDAC_TDM_SLOT */ +#define WM8962_AIFDAC_TDM_SLOT_SHIFT 11 /* AIFDAC_TDM_SLOT */ +#define WM8962_AIFDAC_TDM_SLOT_WIDTH 1 /* AIFDAC_TDM_SLOT */ +#define WM8962_AIFADC_TDM_MODE 0x0400 /* AIFADC_TDM_MODE */ +#define WM8962_AIFADC_TDM_MODE_MASK 0x0400 /* AIFADC_TDM_MODE */ +#define WM8962_AIFADC_TDM_MODE_SHIFT 10 /* AIFADC_TDM_MODE */ +#define WM8962_AIFADC_TDM_MODE_WIDTH 1 /* AIFADC_TDM_MODE */ +#define WM8962_AIFADC_TDM_SLOT 0x0200 /* AIFADC_TDM_SLOT */ +#define WM8962_AIFADC_TDM_SLOT_MASK 0x0200 /* AIFADC_TDM_SLOT */ +#define WM8962_AIFADC_TDM_SLOT_SHIFT 9 /* AIFADC_TDM_SLOT */ +#define WM8962_AIFADC_TDM_SLOT_WIDTH 1 /* AIFADC_TDM_SLOT */ +#define WM8962_ADC_LRSWAP 0x0100 /* ADC_LRSWAP */ +#define WM8962_ADC_LRSWAP_MASK 0x0100 /* ADC_LRSWAP */ +#define WM8962_ADC_LRSWAP_SHIFT 8 /* ADC_LRSWAP */ +#define WM8962_ADC_LRSWAP_WIDTH 1 /* ADC_LRSWAP */ +#define WM8962_BCLK_INV 0x0080 /* BCLK_INV */ +#define WM8962_BCLK_INV_MASK 0x0080 /* BCLK_INV */ +#define WM8962_BCLK_INV_SHIFT 7 /* BCLK_INV */ +#define WM8962_BCLK_INV_WIDTH 1 /* BCLK_INV */ +#define WM8962_MSTR 0x0040 /* MSTR */ +#define WM8962_MSTR_MASK 0x0040 /* MSTR */ +#define WM8962_MSTR_SHIFT 6 /* MSTR */ +#define WM8962_MSTR_WIDTH 1 /* MSTR */ +#define WM8962_DAC_LRSWAP 0x0020 /* DAC_LRSWAP */ +#define WM8962_DAC_LRSWAP_MASK 0x0020 /* DAC_LRSWAP */ +#define WM8962_DAC_LRSWAP_SHIFT 5 /* DAC_LRSWAP */ +#define WM8962_DAC_LRSWAP_WIDTH 1 /* DAC_LRSWAP */ +#define WM8962_LRCLK_INV 0x0010 /* LRCLK_INV */ +#define WM8962_LRCLK_INV_MASK 0x0010 /* LRCLK_INV */ +#define WM8962_LRCLK_INV_SHIFT 4 /* LRCLK_INV */ +#define WM8962_LRCLK_INV_WIDTH 1 /* LRCLK_INV */ +#define WM8962_WL_MASK 0x000C /* WL - [3:2] */ +#define WM8962_WL_SHIFT 2 /* WL - [3:2] */ +#define WM8962_WL_WIDTH 2 /* WL - [3:2] */ +#define WM8962_FMT_MASK 0x0003 /* FMT - [1:0] */ +#define WM8962_FMT_SHIFT 0 /* FMT - [1:0] */ +#define WM8962_FMT_WIDTH 2 /* FMT - [1:0] */ + +/* + * R8 (0x08) - Clocking2 + */ +#define WM8962_CLKREG_OVD 0x0800 /* CLKREG_OVD */ +#define WM8962_CLKREG_OVD_MASK 0x0800 /* CLKREG_OVD */ +#define WM8962_CLKREG_OVD_SHIFT 11 /* CLKREG_OVD */ +#define WM8962_CLKREG_OVD_WIDTH 1 /* CLKREG_OVD */ +#define WM8962_SYSCLK_SRC_MASK 0x0600 /* SYSCLK_SRC - [10:9] */ +#define WM8962_SYSCLK_SRC_SHIFT 9 /* SYSCLK_SRC - [10:9] */ +#define WM8962_SYSCLK_SRC_WIDTH 2 /* SYSCLK_SRC - [10:9] */ +#define WM8962_CLASSD_CLK_DIV_MASK 0x01C0 /* CLASSD_CLK_DIV - [8:6] */ +#define WM8962_CLASSD_CLK_DIV_SHIFT 6 /* CLASSD_CLK_DIV - [8:6] */ +#define WM8962_CLASSD_CLK_DIV_WIDTH 3 /* CLASSD_CLK_DIV - [8:6] */ +#define WM8962_SYSCLK_ENA 0x0020 /* SYSCLK_ENA */ +#define WM8962_SYSCLK_ENA_MASK 0x0020 /* SYSCLK_ENA */ +#define WM8962_SYSCLK_ENA_SHIFT 5 /* SYSCLK_ENA */ +#define WM8962_SYSCLK_ENA_WIDTH 1 /* SYSCLK_ENA */ +#define WM8962_BCLK_DIV_MASK 0x000F /* BCLK_DIV - [3:0] */ +#define WM8962_BCLK_DIV_SHIFT 0 /* BCLK_DIV - [3:0] */ +#define WM8962_BCLK_DIV_WIDTH 4 /* BCLK_DIV - [3:0] */ + +/* + * R9 (0x09) - Audio Interface 1 + */ +#define WM8962_AUTOMUTE_STS 0x0800 /* AUTOMUTE_STS */ +#define WM8962_AUTOMUTE_STS_MASK 0x0800 /* AUTOMUTE_STS */ +#define WM8962_AUTOMUTE_STS_SHIFT 11 /* AUTOMUTE_STS */ +#define WM8962_AUTOMUTE_STS_WIDTH 1 /* AUTOMUTE_STS */ +#define WM8962_DAC_AUTOMUTE_SAMPLES_MASK 0x0300 /* DAC_AUTOMUTE_SAMPLES - [9:8] */ +#define WM8962_DAC_AUTOMUTE_SAMPLES_SHIFT 8 /* DAC_AUTOMUTE_SAMPLES - [9:8] */ +#define WM8962_DAC_AUTOMUTE_SAMPLES_WIDTH 2 /* DAC_AUTOMUTE_SAMPLES - [9:8] */ +#define WM8962_DAC_AUTOMUTE 0x0080 /* DAC_AUTOMUTE */ +#define WM8962_DAC_AUTOMUTE_MASK 0x0080 /* DAC_AUTOMUTE */ +#define WM8962_DAC_AUTOMUTE_SHIFT 7 /* DAC_AUTOMUTE */ +#define WM8962_DAC_AUTOMUTE_WIDTH 1 /* DAC_AUTOMUTE */ +#define WM8962_DAC_COMP 0x0010 /* DAC_COMP */ +#define WM8962_DAC_COMP_MASK 0x0010 /* DAC_COMP */ +#define WM8962_DAC_COMP_SHIFT 4 /* DAC_COMP */ +#define WM8962_DAC_COMP_WIDTH 1 /* DAC_COMP */ +#define WM8962_DAC_COMPMODE 0x0008 /* DAC_COMPMODE */ +#define WM8962_DAC_COMPMODE_MASK 0x0008 /* DAC_COMPMODE */ +#define WM8962_DAC_COMPMODE_SHIFT 3 /* DAC_COMPMODE */ +#define WM8962_DAC_COMPMODE_WIDTH 1 /* DAC_COMPMODE */ +#define WM8962_ADC_COMP 0x0004 /* ADC_COMP */ +#define WM8962_ADC_COMP_MASK 0x0004 /* ADC_COMP */ +#define WM8962_ADC_COMP_SHIFT 2 /* ADC_COMP */ +#define WM8962_ADC_COMP_WIDTH 1 /* ADC_COMP */ +#define WM8962_ADC_COMPMODE 0x0002 /* ADC_COMPMODE */ +#define WM8962_ADC_COMPMODE_MASK 0x0002 /* ADC_COMPMODE */ +#define WM8962_ADC_COMPMODE_SHIFT 1 /* ADC_COMPMODE */ +#define WM8962_ADC_COMPMODE_WIDTH 1 /* ADC_COMPMODE */ +#define WM8962_LOOPBACK 0x0001 /* LOOPBACK */ +#define WM8962_LOOPBACK_MASK 0x0001 /* LOOPBACK */ +#define WM8962_LOOPBACK_SHIFT 0 /* LOOPBACK */ +#define WM8962_LOOPBACK_WIDTH 1 /* LOOPBACK */ + +/* + * R10 (0x0A) - Left DAC volume + */ +#define WM8962_DAC_VU 0x0100 /* DAC_VU */ +#define WM8962_DAC_VU_MASK 0x0100 /* DAC_VU */ +#define WM8962_DAC_VU_SHIFT 8 /* DAC_VU */ +#define WM8962_DAC_VU_WIDTH 1 /* DAC_VU */ +#define WM8962_DACL_VOL_MASK 0x00FF /* DACL_VOL - [7:0] */ +#define WM8962_DACL_VOL_SHIFT 0 /* DACL_VOL - [7:0] */ +#define WM8962_DACL_VOL_WIDTH 8 /* DACL_VOL - [7:0] */ + +/* + * R11 (0x0B) - Right DAC volume + */ +#define WM8962_DAC_VU 0x0100 /* DAC_VU */ +#define WM8962_DAC_VU_MASK 0x0100 /* DAC_VU */ +#define WM8962_DAC_VU_SHIFT 8 /* DAC_VU */ +#define WM8962_DAC_VU_WIDTH 1 /* DAC_VU */ +#define WM8962_DACR_VOL_MASK 0x00FF /* DACR_VOL - [7:0] */ +#define WM8962_DACR_VOL_SHIFT 0 /* DACR_VOL - [7:0] */ +#define WM8962_DACR_VOL_WIDTH 8 /* DACR_VOL - [7:0] */ + +/* + * R14 (0x0E) - Audio Interface 2 + */ +#define WM8962_AIF_RATE_MASK 0x07FF /* AIF_RATE - [10:0] */ +#define WM8962_AIF_RATE_SHIFT 0 /* AIF_RATE - [10:0] */ +#define WM8962_AIF_RATE_WIDTH 11 /* AIF_RATE - [10:0] */ + +/* + * R15 (0x0F) - Software Reset + */ +#define WM8962_SW_RESET_MASK 0xFFFF /* SW_RESET - [15:0] */ +#define WM8962_SW_RESET_SHIFT 0 /* SW_RESET - [15:0] */ +#define WM8962_SW_RESET_WIDTH 16 /* SW_RESET - [15:0] */ + +/* + * R17 (0x11) - ALC1 + */ +#define WM8962_ALC_INACTIVE_ENA 0x0400 /* ALC_INACTIVE_ENA */ +#define WM8962_ALC_INACTIVE_ENA_MASK 0x0400 /* ALC_INACTIVE_ENA */ +#define WM8962_ALC_INACTIVE_ENA_SHIFT 10 /* ALC_INACTIVE_ENA */ +#define WM8962_ALC_INACTIVE_ENA_WIDTH 1 /* ALC_INACTIVE_ENA */ +#define WM8962_ALC_LVL_MODE 0x0200 /* ALC_LVL_MODE */ +#define WM8962_ALC_LVL_MODE_MASK 0x0200 /* ALC_LVL_MODE */ +#define WM8962_ALC_LVL_MODE_SHIFT 9 /* ALC_LVL_MODE */ +#define WM8962_ALC_LVL_MODE_WIDTH 1 /* ALC_LVL_MODE */ +#define WM8962_ALCL_ENA 0x0100 /* ALCL_ENA */ +#define WM8962_ALCL_ENA_MASK 0x0100 /* ALCL_ENA */ +#define WM8962_ALCL_ENA_SHIFT 8 /* ALCL_ENA */ +#define WM8962_ALCL_ENA_WIDTH 1 /* ALCL_ENA */ +#define WM8962_ALCR_ENA 0x0080 /* ALCR_ENA */ +#define WM8962_ALCR_ENA_MASK 0x0080 /* ALCR_ENA */ +#define WM8962_ALCR_ENA_SHIFT 7 /* ALCR_ENA */ +#define WM8962_ALCR_ENA_WIDTH 1 /* ALCR_ENA */ +#define WM8962_ALC_MAXGAIN_MASK 0x0070 /* ALC_MAXGAIN - [6:4] */ +#define WM8962_ALC_MAXGAIN_SHIFT 4 /* ALC_MAXGAIN - [6:4] */ +#define WM8962_ALC_MAXGAIN_WIDTH 3 /* ALC_MAXGAIN - [6:4] */ +#define WM8962_ALC_LVL_MASK 0x000F /* ALC_LVL - [3:0] */ +#define WM8962_ALC_LVL_SHIFT 0 /* ALC_LVL - [3:0] */ +#define WM8962_ALC_LVL_WIDTH 4 /* ALC_LVL - [3:0] */ + +/* + * R18 (0x12) - ALC2 + */ +#define WM8962_ALC_LOCK_STS 0x8000 /* ALC_LOCK_STS */ +#define WM8962_ALC_LOCK_STS_MASK 0x8000 /* ALC_LOCK_STS */ +#define WM8962_ALC_LOCK_STS_SHIFT 15 /* ALC_LOCK_STS */ +#define WM8962_ALC_LOCK_STS_WIDTH 1 /* ALC_LOCK_STS */ +#define WM8962_ALC_THRESH_STS 0x4000 /* ALC_THRESH_STS */ +#define WM8962_ALC_THRESH_STS_MASK 0x4000 /* ALC_THRESH_STS */ +#define WM8962_ALC_THRESH_STS_SHIFT 14 /* ALC_THRESH_STS */ +#define WM8962_ALC_THRESH_STS_WIDTH 1 /* ALC_THRESH_STS */ +#define WM8962_ALC_SAT_STS 0x2000 /* ALC_SAT_STS */ +#define WM8962_ALC_SAT_STS_MASK 0x2000 /* ALC_SAT_STS */ +#define WM8962_ALC_SAT_STS_SHIFT 13 /* ALC_SAT_STS */ +#define WM8962_ALC_SAT_STS_WIDTH 1 /* ALC_SAT_STS */ +#define WM8962_ALC_PKOVR_STS 0x1000 /* ALC_PKOVR_STS */ +#define WM8962_ALC_PKOVR_STS_MASK 0x1000 /* ALC_PKOVR_STS */ +#define WM8962_ALC_PKOVR_STS_SHIFT 12 /* ALC_PKOVR_STS */ +#define WM8962_ALC_PKOVR_STS_WIDTH 1 /* ALC_PKOVR_STS */ +#define WM8962_ALC_NGATE_STS 0x0800 /* ALC_NGATE_STS */ +#define WM8962_ALC_NGATE_STS_MASK 0x0800 /* ALC_NGATE_STS */ +#define WM8962_ALC_NGATE_STS_SHIFT 11 /* ALC_NGATE_STS */ +#define WM8962_ALC_NGATE_STS_WIDTH 1 /* ALC_NGATE_STS */ +#define WM8962_ALC_ZC 0x0080 /* ALC_ZC */ +#define WM8962_ALC_ZC_MASK 0x0080 /* ALC_ZC */ +#define WM8962_ALC_ZC_SHIFT 7 /* ALC_ZC */ +#define WM8962_ALC_ZC_WIDTH 1 /* ALC_ZC */ +#define WM8962_ALC_MINGAIN_MASK 0x0070 /* ALC_MINGAIN - [6:4] */ +#define WM8962_ALC_MINGAIN_SHIFT 4 /* ALC_MINGAIN - [6:4] */ +#define WM8962_ALC_MINGAIN_WIDTH 3 /* ALC_MINGAIN - [6:4] */ +#define WM8962_ALC_HLD_MASK 0x000F /* ALC_HLD - [3:0] */ +#define WM8962_ALC_HLD_SHIFT 0 /* ALC_HLD - [3:0] */ +#define WM8962_ALC_HLD_WIDTH 4 /* ALC_HLD - [3:0] */ + +/* + * R19 (0x13) - ALC3 + */ +#define WM8962_ALC_NGATE_GAIN_MASK 0x1C00 /* ALC_NGATE_GAIN - [12:10] */ +#define WM8962_ALC_NGATE_GAIN_SHIFT 10 /* ALC_NGATE_GAIN - [12:10] */ +#define WM8962_ALC_NGATE_GAIN_WIDTH 3 /* ALC_NGATE_GAIN - [12:10] */ +#define WM8962_ALC_MODE 0x0100 /* ALC_MODE */ +#define WM8962_ALC_MODE_MASK 0x0100 /* ALC_MODE */ +#define WM8962_ALC_MODE_SHIFT 8 /* ALC_MODE */ +#define WM8962_ALC_MODE_WIDTH 1 /* ALC_MODE */ +#define WM8962_ALC_DCY_MASK 0x00F0 /* ALC_DCY - [7:4] */ +#define WM8962_ALC_DCY_SHIFT 4 /* ALC_DCY - [7:4] */ +#define WM8962_ALC_DCY_WIDTH 4 /* ALC_DCY - [7:4] */ +#define WM8962_ALC_ATK_MASK 0x000F /* ALC_ATK - [3:0] */ +#define WM8962_ALC_ATK_SHIFT 0 /* ALC_ATK - [3:0] */ +#define WM8962_ALC_ATK_WIDTH 4 /* ALC_ATK - [3:0] */ + +/* + * R20 (0x14) - Noise Gate + */ +#define WM8962_ALC_NGATE_DCY_MASK 0xF000 /* ALC_NGATE_DCY - [15:12] */ +#define WM8962_ALC_NGATE_DCY_SHIFT 12 /* ALC_NGATE_DCY - [15:12] */ +#define WM8962_ALC_NGATE_DCY_WIDTH 4 /* ALC_NGATE_DCY - [15:12] */ +#define WM8962_ALC_NGATE_ATK_MASK 0x0F00 /* ALC_NGATE_ATK - [11:8] */ +#define WM8962_ALC_NGATE_ATK_SHIFT 8 /* ALC_NGATE_ATK - [11:8] */ +#define WM8962_ALC_NGATE_ATK_WIDTH 4 /* ALC_NGATE_ATK - [11:8] */ +#define WM8962_ALC_NGATE_THR_MASK 0x00F8 /* ALC_NGATE_THR - [7:3] */ +#define WM8962_ALC_NGATE_THR_SHIFT 3 /* ALC_NGATE_THR - [7:3] */ +#define WM8962_ALC_NGATE_THR_WIDTH 5 /* ALC_NGATE_THR - [7:3] */ +#define WM8962_ALC_NGATE_MODE_MASK 0x0006 /* ALC_NGATE_MODE - [2:1] */ +#define WM8962_ALC_NGATE_MODE_SHIFT 1 /* ALC_NGATE_MODE - [2:1] */ +#define WM8962_ALC_NGATE_MODE_WIDTH 2 /* ALC_NGATE_MODE - [2:1] */ +#define WM8962_ALC_NGATE_ENA 0x0001 /* ALC_NGATE_ENA */ +#define WM8962_ALC_NGATE_ENA_MASK 0x0001 /* ALC_NGATE_ENA */ +#define WM8962_ALC_NGATE_ENA_SHIFT 0 /* ALC_NGATE_ENA */ +#define WM8962_ALC_NGATE_ENA_WIDTH 1 /* ALC_NGATE_ENA */ + +/* + * R21 (0x15) - Left ADC volume + */ +#define WM8962_ADC_VU 0x0100 /* ADC_VU */ +#define WM8962_ADC_VU_MASK 0x0100 /* ADC_VU */ +#define WM8962_ADC_VU_SHIFT 8 /* ADC_VU */ +#define WM8962_ADC_VU_WIDTH 1 /* ADC_VU */ +#define WM8962_ADCL_VOL_MASK 0x00FF /* ADCL_VOL - [7:0] */ +#define WM8962_ADCL_VOL_SHIFT 0 /* ADCL_VOL - [7:0] */ +#define WM8962_ADCL_VOL_WIDTH 8 /* ADCL_VOL - [7:0] */ + +/* + * R22 (0x16) - Right ADC volume + */ +#define WM8962_ADC_VU 0x0100 /* ADC_VU */ +#define WM8962_ADC_VU_MASK 0x0100 /* ADC_VU */ +#define WM8962_ADC_VU_SHIFT 8 /* ADC_VU */ +#define WM8962_ADC_VU_WIDTH 1 /* ADC_VU */ +#define WM8962_ADCR_VOL_MASK 0x00FF /* ADCR_VOL - [7:0] */ +#define WM8962_ADCR_VOL_SHIFT 0 /* ADCR_VOL - [7:0] */ +#define WM8962_ADCR_VOL_WIDTH 8 /* ADCR_VOL - [7:0] */ + +/* + * R23 (0x17) - Additional control(1) + */ +#define WM8962_THERR_ACT 0x0100 /* THERR_ACT */ +#define WM8962_THERR_ACT_MASK 0x0100 /* THERR_ACT */ +#define WM8962_THERR_ACT_SHIFT 8 /* THERR_ACT */ +#define WM8962_THERR_ACT_WIDTH 1 /* THERR_ACT */ +#define WM8962_ADC_BIAS 0x0040 /* ADC_BIAS */ +#define WM8962_ADC_BIAS_MASK 0x0040 /* ADC_BIAS */ +#define WM8962_ADC_BIAS_SHIFT 6 /* ADC_BIAS */ +#define WM8962_ADC_BIAS_WIDTH 1 /* ADC_BIAS */ +#define WM8962_ADC_HP 0x0020 /* ADC_HP */ +#define WM8962_ADC_HP_MASK 0x0020 /* ADC_HP */ +#define WM8962_ADC_HP_SHIFT 5 /* ADC_HP */ +#define WM8962_ADC_HP_WIDTH 1 /* ADC_HP */ +#define WM8962_TOCLK_ENA 0x0001 /* TOCLK_ENA */ +#define WM8962_TOCLK_ENA_MASK 0x0001 /* TOCLK_ENA */ +#define WM8962_TOCLK_ENA_SHIFT 0 /* TOCLK_ENA */ +#define WM8962_TOCLK_ENA_WIDTH 1 /* TOCLK_ENA */ + +/* + * R24 (0x18) - Additional control(2) + */ +#define WM8962_AIF_TRI 0x0008 /* AIF_TRI */ +#define WM8962_AIF_TRI_MASK 0x0008 /* AIF_TRI */ +#define WM8962_AIF_TRI_SHIFT 3 /* AIF_TRI */ +#define WM8962_AIF_TRI_WIDTH 1 /* AIF_TRI */ + +/* + * R25 (0x19) - Pwr Mgmt (1) + */ +#define WM8962_DMIC_ENA 0x0400 /* DMIC_ENA */ +#define WM8962_DMIC_ENA_MASK 0x0400 /* DMIC_ENA */ +#define WM8962_DMIC_ENA_SHIFT 10 /* DMIC_ENA */ +#define WM8962_DMIC_ENA_WIDTH 1 /* DMIC_ENA */ +#define WM8962_OPCLK_ENA 0x0200 /* OPCLK_ENA */ +#define WM8962_OPCLK_ENA_MASK 0x0200 /* OPCLK_ENA */ +#define WM8962_OPCLK_ENA_SHIFT 9 /* OPCLK_ENA */ +#define WM8962_OPCLK_ENA_WIDTH 1 /* OPCLK_ENA */ +#define WM8962_VMID_SEL_MASK 0x0180 /* VMID_SEL - [8:7] */ +#define WM8962_VMID_SEL_SHIFT 7 /* VMID_SEL - [8:7] */ +#define WM8962_VMID_SEL_WIDTH 2 /* VMID_SEL - [8:7] */ +#define WM8962_BIAS_ENA 0x0040 /* BIAS_ENA */ +#define WM8962_BIAS_ENA_MASK 0x0040 /* BIAS_ENA */ +#define WM8962_BIAS_ENA_SHIFT 6 /* BIAS_ENA */ +#define WM8962_BIAS_ENA_WIDTH 1 /* BIAS_ENA */ +#define WM8962_INL_ENA 0x0020 /* INL_ENA */ +#define WM8962_INL_ENA_MASK 0x0020 /* INL_ENA */ +#define WM8962_INL_ENA_SHIFT 5 /* INL_ENA */ +#define WM8962_INL_ENA_WIDTH 1 /* INL_ENA */ +#define WM8962_INR_ENA 0x0010 /* INR_ENA */ +#define WM8962_INR_ENA_MASK 0x0010 /* INR_ENA */ +#define WM8962_INR_ENA_SHIFT 4 /* INR_ENA */ +#define WM8962_INR_ENA_WIDTH 1 /* INR_ENA */ +#define WM8962_ADCL_ENA 0x0008 /* ADCL_ENA */ +#define WM8962_ADCL_ENA_MASK 0x0008 /* ADCL_ENA */ +#define WM8962_ADCL_ENA_SHIFT 3 /* ADCL_ENA */ +#define WM8962_ADCL_ENA_WIDTH 1 /* ADCL_ENA */ +#define WM8962_ADCR_ENA 0x0004 /* ADCR_ENA */ +#define WM8962_ADCR_ENA_MASK 0x0004 /* ADCR_ENA */ +#define WM8962_ADCR_ENA_SHIFT 2 /* ADCR_ENA */ +#define WM8962_ADCR_ENA_WIDTH 1 /* ADCR_ENA */ +#define WM8962_MICBIAS_ENA 0x0002 /* MICBIAS_ENA */ +#define WM8962_MICBIAS_ENA_MASK 0x0002 /* MICBIAS_ENA */ +#define WM8962_MICBIAS_ENA_SHIFT 1 /* MICBIAS_ENA */ +#define WM8962_MICBIAS_ENA_WIDTH 1 /* MICBIAS_ENA */ + +/* + * R26 (0x1A) - Pwr Mgmt (2) + */ +#define WM8962_DACL_ENA 0x0100 /* DACL_ENA */ +#define WM8962_DACL_ENA_MASK 0x0100 /* DACL_ENA */ +#define WM8962_DACL_ENA_SHIFT 8 /* DACL_ENA */ +#define WM8962_DACL_ENA_WIDTH 1 /* DACL_ENA */ +#define WM8962_DACR_ENA 0x0080 /* DACR_ENA */ +#define WM8962_DACR_ENA_MASK 0x0080 /* DACR_ENA */ +#define WM8962_DACR_ENA_SHIFT 7 /* DACR_ENA */ +#define WM8962_DACR_ENA_WIDTH 1 /* DACR_ENA */ +#define WM8962_HPOUTL_PGA_ENA 0x0040 /* HPOUTL_PGA_ENA */ +#define WM8962_HPOUTL_PGA_ENA_MASK 0x0040 /* HPOUTL_PGA_ENA */ +#define WM8962_HPOUTL_PGA_ENA_SHIFT 6 /* HPOUTL_PGA_ENA */ +#define WM8962_HPOUTL_PGA_ENA_WIDTH 1 /* HPOUTL_PGA_ENA */ +#define WM8962_HPOUTR_PGA_ENA 0x0020 /* HPOUTR_PGA_ENA */ +#define WM8962_HPOUTR_PGA_ENA_MASK 0x0020 /* HPOUTR_PGA_ENA */ +#define WM8962_HPOUTR_PGA_ENA_SHIFT 5 /* HPOUTR_PGA_ENA */ +#define WM8962_HPOUTR_PGA_ENA_WIDTH 1 /* HPOUTR_PGA_ENA */ +#define WM8962_SPKOUTL_PGA_ENA 0x0010 /* SPKOUTL_PGA_ENA */ +#define WM8962_SPKOUTL_PGA_ENA_MASK 0x0010 /* SPKOUTL_PGA_ENA */ +#define WM8962_SPKOUTL_PGA_ENA_SHIFT 4 /* SPKOUTL_PGA_ENA */ +#define WM8962_SPKOUTL_PGA_ENA_WIDTH 1 /* SPKOUTL_PGA_ENA */ +#define WM8962_SPKOUTR_PGA_ENA 0x0008 /* SPKOUTR_PGA_ENA */ +#define WM8962_SPKOUTR_PGA_ENA_MASK 0x0008 /* SPKOUTR_PGA_ENA */ +#define WM8962_SPKOUTR_PGA_ENA_SHIFT 3 /* SPKOUTR_PGA_ENA */ +#define WM8962_SPKOUTR_PGA_ENA_WIDTH 1 /* SPKOUTR_PGA_ENA */ +#define WM8962_HPOUTL_PGA_MUTE 0x0002 /* HPOUTL_PGA_MUTE */ +#define WM8962_HPOUTL_PGA_MUTE_MASK 0x0002 /* HPOUTL_PGA_MUTE */ +#define WM8962_HPOUTL_PGA_MUTE_SHIFT 1 /* HPOUTL_PGA_MUTE */ +#define WM8962_HPOUTL_PGA_MUTE_WIDTH 1 /* HPOUTL_PGA_MUTE */ +#define WM8962_HPOUTR_PGA_MUTE 0x0001 /* HPOUTR_PGA_MUTE */ +#define WM8962_HPOUTR_PGA_MUTE_MASK 0x0001 /* HPOUTR_PGA_MUTE */ +#define WM8962_HPOUTR_PGA_MUTE_SHIFT 0 /* HPOUTR_PGA_MUTE */ +#define WM8962_HPOUTR_PGA_MUTE_WIDTH 1 /* HPOUTR_PGA_MUTE */ + +/* + * R27 (0x1B) - Additional Control (3) + */ +#define WM8962_SAMPLE_RATE_INT_MODE 0x0010 /* SAMPLE_RATE_INT_MODE */ +#define WM8962_SAMPLE_RATE_INT_MODE_MASK 0x0010 /* SAMPLE_RATE_INT_MODE */ +#define WM8962_SAMPLE_RATE_INT_MODE_SHIFT 4 /* SAMPLE_RATE_INT_MODE */ +#define WM8962_SAMPLE_RATE_INT_MODE_WIDTH 1 /* SAMPLE_RATE_INT_MODE */ +#define WM8962_SAMPLE_RATE_MASK 0x0007 /* SAMPLE_RATE - [2:0] */ +#define WM8962_SAMPLE_RATE_SHIFT 0 /* SAMPLE_RATE - [2:0] */ +#define WM8962_SAMPLE_RATE_WIDTH 3 /* SAMPLE_RATE - [2:0] */ + +/* + * R28 (0x1C) - Anti-pop + */ +#define WM8962_STARTUP_BIAS_ENA 0x0010 /* STARTUP_BIAS_ENA */ +#define WM8962_STARTUP_BIAS_ENA_MASK 0x0010 /* STARTUP_BIAS_ENA */ +#define WM8962_STARTUP_BIAS_ENA_SHIFT 4 /* STARTUP_BIAS_ENA */ +#define WM8962_STARTUP_BIAS_ENA_WIDTH 1 /* STARTUP_BIAS_ENA */ +#define WM8962_VMID_BUF_ENA 0x0008 /* VMID_BUF_ENA */ +#define WM8962_VMID_BUF_ENA_MASK 0x0008 /* VMID_BUF_ENA */ +#define WM8962_VMID_BUF_ENA_SHIFT 3 /* VMID_BUF_ENA */ +#define WM8962_VMID_BUF_ENA_WIDTH 1 /* VMID_BUF_ENA */ +#define WM8962_VMID_RAMP 0x0004 /* VMID_RAMP */ +#define WM8962_VMID_RAMP_MASK 0x0004 /* VMID_RAMP */ +#define WM8962_VMID_RAMP_SHIFT 2 /* VMID_RAMP */ +#define WM8962_VMID_RAMP_WIDTH 1 /* VMID_RAMP */ + +/* + * R30 (0x1E) - Clocking 3 + */ +#define WM8962_DBCLK_DIV_MASK 0xE000 /* DBCLK_DIV - [15:13] */ +#define WM8962_DBCLK_DIV_SHIFT 13 /* DBCLK_DIV - [15:13] */ +#define WM8962_DBCLK_DIV_WIDTH 3 /* DBCLK_DIV - [15:13] */ +#define WM8962_OPCLK_DIV_MASK 0x1C00 /* OPCLK_DIV - [12:10] */ +#define WM8962_OPCLK_DIV_SHIFT 10 /* OPCLK_DIV - [12:10] */ +#define WM8962_OPCLK_DIV_WIDTH 3 /* OPCLK_DIV - [12:10] */ +#define WM8962_TOCLK_DIV_MASK 0x0380 /* TOCLK_DIV - [9:7] */ +#define WM8962_TOCLK_DIV_SHIFT 7 /* TOCLK_DIV - [9:7] */ +#define WM8962_TOCLK_DIV_WIDTH 3 /* TOCLK_DIV - [9:7] */ +#define WM8962_F256KCLK_DIV_MASK 0x007E /* F256KCLK_DIV - [6:1] */ +#define WM8962_F256KCLK_DIV_SHIFT 1 /* F256KCLK_DIV - [6:1] */ +#define WM8962_F256KCLK_DIV_WIDTH 6 /* F256KCLK_DIV - [6:1] */ + +/* + * R31 (0x1F) - Input mixer control (1) + */ +#define WM8962_MIXINL_MUTE 0x0008 /* MIXINL_MUTE */ +#define WM8962_MIXINL_MUTE_MASK 0x0008 /* MIXINL_MUTE */ +#define WM8962_MIXINL_MUTE_SHIFT 3 /* MIXINL_MUTE */ +#define WM8962_MIXINL_MUTE_WIDTH 1 /* MIXINL_MUTE */ +#define WM8962_MIXINR_MUTE 0x0004 /* MIXINR_MUTE */ +#define WM8962_MIXINR_MUTE_MASK 0x0004 /* MIXINR_MUTE */ +#define WM8962_MIXINR_MUTE_SHIFT 2 /* MIXINR_MUTE */ +#define WM8962_MIXINR_MUTE_WIDTH 1 /* MIXINR_MUTE */ +#define WM8962_MIXINL_ENA 0x0002 /* MIXINL_ENA */ +#define WM8962_MIXINL_ENA_MASK 0x0002 /* MIXINL_ENA */ +#define WM8962_MIXINL_ENA_SHIFT 1 /* MIXINL_ENA */ +#define WM8962_MIXINL_ENA_WIDTH 1 /* MIXINL_ENA */ +#define WM8962_MIXINR_ENA 0x0001 /* MIXINR_ENA */ +#define WM8962_MIXINR_ENA_MASK 0x0001 /* MIXINR_ENA */ +#define WM8962_MIXINR_ENA_SHIFT 0 /* MIXINR_ENA */ +#define WM8962_MIXINR_ENA_WIDTH 1 /* MIXINR_ENA */ + +/* + * R32 (0x20) - Left input mixer volume + */ +#define WM8962_IN2L_MIXINL_VOL_MASK 0x01C0 /* IN2L_MIXINL_VOL - [8:6] */ +#define WM8962_IN2L_MIXINL_VOL_SHIFT 6 /* IN2L_MIXINL_VOL - [8:6] */ +#define WM8962_IN2L_MIXINL_VOL_WIDTH 3 /* IN2L_MIXINL_VOL - [8:6] */ +#define WM8962_INPGAL_MIXINL_VOL_MASK 0x0038 /* INPGAL_MIXINL_VOL - [5:3] */ +#define WM8962_INPGAL_MIXINL_VOL_SHIFT 3 /* INPGAL_MIXINL_VOL - [5:3] */ +#define WM8962_INPGAL_MIXINL_VOL_WIDTH 3 /* INPGAL_MIXINL_VOL - [5:3] */ +#define WM8962_IN3L_MIXINL_VOL_MASK 0x0007 /* IN3L_MIXINL_VOL - [2:0] */ +#define WM8962_IN3L_MIXINL_VOL_SHIFT 0 /* IN3L_MIXINL_VOL - [2:0] */ +#define WM8962_IN3L_MIXINL_VOL_WIDTH 3 /* IN3L_MIXINL_VOL - [2:0] */ + +/* + * R33 (0x21) - Right input mixer volume + */ +#define WM8962_IN2R_MIXINR_VOL_MASK 0x01C0 /* IN2R_MIXINR_VOL - [8:6] */ +#define WM8962_IN2R_MIXINR_VOL_SHIFT 6 /* IN2R_MIXINR_VOL - [8:6] */ +#define WM8962_IN2R_MIXINR_VOL_WIDTH 3 /* IN2R_MIXINR_VOL - [8:6] */ +#define WM8962_INPGAR_MIXINR_VOL_MASK 0x0038 /* INPGAR_MIXINR_VOL - [5:3] */ +#define WM8962_INPGAR_MIXINR_VOL_SHIFT 3 /* INPGAR_MIXINR_VOL - [5:3] */ +#define WM8962_INPGAR_MIXINR_VOL_WIDTH 3 /* INPGAR_MIXINR_VOL - [5:3] */ +#define WM8962_IN3R_MIXINR_VOL_MASK 0x0007 /* IN3R_MIXINR_VOL - [2:0] */ +#define WM8962_IN3R_MIXINR_VOL_SHIFT 0 /* IN3R_MIXINR_VOL - [2:0] */ +#define WM8962_IN3R_MIXINR_VOL_WIDTH 3 /* IN3R_MIXINR_VOL - [2:0] */ + +/* + * R34 (0x22) - Input mixer control (2) + */ +#define WM8962_IN2L_TO_MIXINL 0x0020 /* IN2L_TO_MIXINL */ +#define WM8962_IN2L_TO_MIXINL_MASK 0x0020 /* IN2L_TO_MIXINL */ +#define WM8962_IN2L_TO_MIXINL_SHIFT 5 /* IN2L_TO_MIXINL */ +#define WM8962_IN2L_TO_MIXINL_WIDTH 1 /* IN2L_TO_MIXINL */ +#define WM8962_IN3L_TO_MIXINL 0x0010 /* IN3L_TO_MIXINL */ +#define WM8962_IN3L_TO_MIXINL_MASK 0x0010 /* IN3L_TO_MIXINL */ +#define WM8962_IN3L_TO_MIXINL_SHIFT 4 /* IN3L_TO_MIXINL */ +#define WM8962_IN3L_TO_MIXINL_WIDTH 1 /* IN3L_TO_MIXINL */ +#define WM8962_INPGAL_TO_MIXINL 0x0008 /* INPGAL_TO_MIXINL */ +#define WM8962_INPGAL_TO_MIXINL_MASK 0x0008 /* INPGAL_TO_MIXINL */ +#define WM8962_INPGAL_TO_MIXINL_SHIFT 3 /* INPGAL_TO_MIXINL */ +#define WM8962_INPGAL_TO_MIXINL_WIDTH 1 /* INPGAL_TO_MIXINL */ +#define WM8962_IN2R_TO_MIXINR 0x0004 /* IN2R_TO_MIXINR */ +#define WM8962_IN2R_TO_MIXINR_MASK 0x0004 /* IN2R_TO_MIXINR */ +#define WM8962_IN2R_TO_MIXINR_SHIFT 2 /* IN2R_TO_MIXINR */ +#define WM8962_IN2R_TO_MIXINR_WIDTH 1 /* IN2R_TO_MIXINR */ +#define WM8962_IN3R_TO_MIXINR 0x0002 /* IN3R_TO_MIXINR */ +#define WM8962_IN3R_TO_MIXINR_MASK 0x0002 /* IN3R_TO_MIXINR */ +#define WM8962_IN3R_TO_MIXINR_SHIFT 1 /* IN3R_TO_MIXINR */ +#define WM8962_IN3R_TO_MIXINR_WIDTH 1 /* IN3R_TO_MIXINR */ +#define WM8962_INPGAR_TO_MIXINR 0x0001 /* INPGAR_TO_MIXINR */ +#define WM8962_INPGAR_TO_MIXINR_MASK 0x0001 /* INPGAR_TO_MIXINR */ +#define WM8962_INPGAR_TO_MIXINR_SHIFT 0 /* INPGAR_TO_MIXINR */ +#define WM8962_INPGAR_TO_MIXINR_WIDTH 1 /* INPGAR_TO_MIXINR */ + +/* + * R35 (0x23) - Input bias control + */ +#define WM8962_MIXIN_BIAS_MASK 0x0038 /* MIXIN_BIAS - [5:3] */ +#define WM8962_MIXIN_BIAS_SHIFT 3 /* MIXIN_BIAS - [5:3] */ +#define WM8962_MIXIN_BIAS_WIDTH 3 /* MIXIN_BIAS - [5:3] */ +#define WM8962_INPGA_BIAS_MASK 0x0007 /* INPGA_BIAS - [2:0] */ +#define WM8962_INPGA_BIAS_SHIFT 0 /* INPGA_BIAS - [2:0] */ +#define WM8962_INPGA_BIAS_WIDTH 3 /* INPGA_BIAS - [2:0] */ + +/* + * R37 (0x25) - Left input PGA control + */ +#define WM8962_INPGAL_ENA 0x0010 /* INPGAL_ENA */ +#define WM8962_INPGAL_ENA_MASK 0x0010 /* INPGAL_ENA */ +#define WM8962_INPGAL_ENA_SHIFT 4 /* INPGAL_ENA */ +#define WM8962_INPGAL_ENA_WIDTH 1 /* INPGAL_ENA */ +#define WM8962_IN1L_TO_INPGAL 0x0008 /* IN1L_TO_INPGAL */ +#define WM8962_IN1L_TO_INPGAL_MASK 0x0008 /* IN1L_TO_INPGAL */ +#define WM8962_IN1L_TO_INPGAL_SHIFT 3 /* IN1L_TO_INPGAL */ +#define WM8962_IN1L_TO_INPGAL_WIDTH 1 /* IN1L_TO_INPGAL */ +#define WM8962_IN2L_TO_INPGAL 0x0004 /* IN2L_TO_INPGAL */ +#define WM8962_IN2L_TO_INPGAL_MASK 0x0004 /* IN2L_TO_INPGAL */ +#define WM8962_IN2L_TO_INPGAL_SHIFT 2 /* IN2L_TO_INPGAL */ +#define WM8962_IN2L_TO_INPGAL_WIDTH 1 /* IN2L_TO_INPGAL */ +#define WM8962_IN3L_TO_INPGAL 0x0002 /* IN3L_TO_INPGAL */ +#define WM8962_IN3L_TO_INPGAL_MASK 0x0002 /* IN3L_TO_INPGAL */ +#define WM8962_IN3L_TO_INPGAL_SHIFT 1 /* IN3L_TO_INPGAL */ +#define WM8962_IN3L_TO_INPGAL_WIDTH 1 /* IN3L_TO_INPGAL */ +#define WM8962_IN4L_TO_INPGAL 0x0001 /* IN4L_TO_INPGAL */ +#define WM8962_IN4L_TO_INPGAL_MASK 0x0001 /* IN4L_TO_INPGAL */ +#define WM8962_IN4L_TO_INPGAL_SHIFT 0 /* IN4L_TO_INPGAL */ +#define WM8962_IN4L_TO_INPGAL_WIDTH 1 /* IN4L_TO_INPGAL */ + +/* + * R38 (0x26) - Right input PGA control + */ +#define WM8962_INPGAR_ENA 0x0010 /* INPGAR_ENA */ +#define WM8962_INPGAR_ENA_MASK 0x0010 /* INPGAR_ENA */ +#define WM8962_INPGAR_ENA_SHIFT 4 /* INPGAR_ENA */ +#define WM8962_INPGAR_ENA_WIDTH 1 /* INPGAR_ENA */ +#define WM8962_IN1R_TO_INPGAR 0x0008 /* IN1R_TO_INPGAR */ +#define WM8962_IN1R_TO_INPGAR_MASK 0x0008 /* IN1R_TO_INPGAR */ +#define WM8962_IN1R_TO_INPGAR_SHIFT 3 /* IN1R_TO_INPGAR */ +#define WM8962_IN1R_TO_INPGAR_WIDTH 1 /* IN1R_TO_INPGAR */ +#define WM8962_IN2R_TO_INPGAR 0x0004 /* IN2R_TO_INPGAR */ +#define WM8962_IN2R_TO_INPGAR_MASK 0x0004 /* IN2R_TO_INPGAR */ +#define WM8962_IN2R_TO_INPGAR_SHIFT 2 /* IN2R_TO_INPGAR */ +#define WM8962_IN2R_TO_INPGAR_WIDTH 1 /* IN2R_TO_INPGAR */ +#define WM8962_IN3R_TO_INPGAR 0x0002 /* IN3R_TO_INPGAR */ +#define WM8962_IN3R_TO_INPGAR_MASK 0x0002 /* IN3R_TO_INPGAR */ +#define WM8962_IN3R_TO_INPGAR_SHIFT 1 /* IN3R_TO_INPGAR */ +#define WM8962_IN3R_TO_INPGAR_WIDTH 1 /* IN3R_TO_INPGAR */ +#define WM8962_IN4R_TO_INPGAR 0x0001 /* IN4R_TO_INPGAR */ +#define WM8962_IN4R_TO_INPGAR_MASK 0x0001 /* IN4R_TO_INPGAR */ +#define WM8962_IN4R_TO_INPGAR_SHIFT 0 /* IN4R_TO_INPGAR */ +#define WM8962_IN4R_TO_INPGAR_WIDTH 1 /* IN4R_TO_INPGAR */ + +/* + * R40 (0x28) - SPKOUTL volume + */ +#define WM8962_SPKOUT_VU 0x0100 /* SPKOUT_VU */ +#define WM8962_SPKOUT_VU_MASK 0x0100 /* SPKOUT_VU */ +#define WM8962_SPKOUT_VU_SHIFT 8 /* SPKOUT_VU */ +#define WM8962_SPKOUT_VU_WIDTH 1 /* SPKOUT_VU */ +#define WM8962_SPKOUTL_ZC 0x0080 /* SPKOUTL_ZC */ +#define WM8962_SPKOUTL_ZC_MASK 0x0080 /* SPKOUTL_ZC */ +#define WM8962_SPKOUTL_ZC_SHIFT 7 /* SPKOUTL_ZC */ +#define WM8962_SPKOUTL_ZC_WIDTH 1 /* SPKOUTL_ZC */ +#define WM8962_SPKOUTL_VOL_MASK 0x007F /* SPKOUTL_VOL - [6:0] */ +#define WM8962_SPKOUTL_VOL_SHIFT 0 /* SPKOUTL_VOL - [6:0] */ +#define WM8962_SPKOUTL_VOL_WIDTH 7 /* SPKOUTL_VOL - [6:0] */ + +/* + * R41 (0x29) - SPKOUTR volume + */ +#define WM8962_SPKOUTR_ZC 0x0080 /* SPKOUTR_ZC */ +#define WM8962_SPKOUTR_ZC_MASK 0x0080 /* SPKOUTR_ZC */ +#define WM8962_SPKOUTR_ZC_SHIFT 7 /* SPKOUTR_ZC */ +#define WM8962_SPKOUTR_ZC_WIDTH 1 /* SPKOUTR_ZC */ +#define WM8962_SPKOUTR_VOL_MASK 0x007F /* SPKOUTR_VOL - [6:0] */ +#define WM8962_SPKOUTR_VOL_SHIFT 0 /* SPKOUTR_VOL - [6:0] */ +#define WM8962_SPKOUTR_VOL_WIDTH 7 /* SPKOUTR_VOL - [6:0] */ + +/* + * R47 (0x2F) - Thermal Shutdown Status + */ +#define WM8962_TEMP_ERR_HP 0x0008 /* TEMP_ERR_HP */ +#define WM8962_TEMP_ERR_HP_MASK 0x0008 /* TEMP_ERR_HP */ +#define WM8962_TEMP_ERR_HP_SHIFT 3 /* TEMP_ERR_HP */ +#define WM8962_TEMP_ERR_HP_WIDTH 1 /* TEMP_ERR_HP */ +#define WM8962_TEMP_WARN_HP 0x0004 /* TEMP_WARN_HP */ +#define WM8962_TEMP_WARN_HP_MASK 0x0004 /* TEMP_WARN_HP */ +#define WM8962_TEMP_WARN_HP_SHIFT 2 /* TEMP_WARN_HP */ +#define WM8962_TEMP_WARN_HP_WIDTH 1 /* TEMP_WARN_HP */ +#define WM8962_TEMP_ERR_SPK 0x0002 /* TEMP_ERR_SPK */ +#define WM8962_TEMP_ERR_SPK_MASK 0x0002 /* TEMP_ERR_SPK */ +#define WM8962_TEMP_ERR_SPK_SHIFT 1 /* TEMP_ERR_SPK */ +#define WM8962_TEMP_ERR_SPK_WIDTH 1 /* TEMP_ERR_SPK */ +#define WM8962_TEMP_WARN_SPK 0x0001 /* TEMP_WARN_SPK */ +#define WM8962_TEMP_WARN_SPK_MASK 0x0001 /* TEMP_WARN_SPK */ +#define WM8962_TEMP_WARN_SPK_SHIFT 0 /* TEMP_WARN_SPK */ +#define WM8962_TEMP_WARN_SPK_WIDTH 1 /* TEMP_WARN_SPK */ + +/* + * R48 (0x30) - Additional Control (4) + */ +#define WM8962_MICDET_THR_MASK 0x7000 /* MICDET_THR - [14:12] */ +#define WM8962_MICDET_THR_SHIFT 12 /* MICDET_THR - [14:12] */ +#define WM8962_MICDET_THR_WIDTH 3 /* MICDET_THR - [14:12] */ +#define WM8962_MICSHORT_THR_MASK 0x0C00 /* MICSHORT_THR - [11:10] */ +#define WM8962_MICSHORT_THR_SHIFT 10 /* MICSHORT_THR - [11:10] */ +#define WM8962_MICSHORT_THR_WIDTH 2 /* MICSHORT_THR - [11:10] */ +#define WM8962_MICDET_ENA 0x0200 /* MICDET_ENA */ +#define WM8962_MICDET_ENA_MASK 0x0200 /* MICDET_ENA */ +#define WM8962_MICDET_ENA_SHIFT 9 /* MICDET_ENA */ +#define WM8962_MICDET_ENA_WIDTH 1 /* MICDET_ENA */ +#define WM8962_MICDET_STS 0x0080 /* MICDET_STS */ +#define WM8962_MICDET_STS_MASK 0x0080 /* MICDET_STS */ +#define WM8962_MICDET_STS_SHIFT 7 /* MICDET_STS */ +#define WM8962_MICDET_STS_WIDTH 1 /* MICDET_STS */ +#define WM8962_MICSHORT_STS 0x0040 /* MICSHORT_STS */ +#define WM8962_MICSHORT_STS_MASK 0x0040 /* MICSHORT_STS */ +#define WM8962_MICSHORT_STS_SHIFT 6 /* MICSHORT_STS */ +#define WM8962_MICSHORT_STS_WIDTH 1 /* MICSHORT_STS */ +#define WM8962_TEMP_ENA_HP 0x0004 /* TEMP_ENA_HP */ +#define WM8962_TEMP_ENA_HP_MASK 0x0004 /* TEMP_ENA_HP */ +#define WM8962_TEMP_ENA_HP_SHIFT 2 /* TEMP_ENA_HP */ +#define WM8962_TEMP_ENA_HP_WIDTH 1 /* TEMP_ENA_HP */ +#define WM8962_TEMP_ENA_SPK 0x0002 /* TEMP_ENA_SPK */ +#define WM8962_TEMP_ENA_SPK_MASK 0x0002 /* TEMP_ENA_SPK */ +#define WM8962_TEMP_ENA_SPK_SHIFT 1 /* TEMP_ENA_SPK */ +#define WM8962_TEMP_ENA_SPK_WIDTH 1 /* TEMP_ENA_SPK */ +#define WM8962_MICBIAS_LVL 0x0001 /* MICBIAS_LVL */ +#define WM8962_MICBIAS_LVL_MASK 0x0001 /* MICBIAS_LVL */ +#define WM8962_MICBIAS_LVL_SHIFT 0 /* MICBIAS_LVL */ +#define WM8962_MICBIAS_LVL_WIDTH 1 /* MICBIAS_LVL */ + +/* + * R49 (0x31) - Class D Control 1 + */ +#define WM8962_SPKOUTR_ENA 0x0080 /* SPKOUTR_ENA */ +#define WM8962_SPKOUTR_ENA_MASK 0x0080 /* SPKOUTR_ENA */ +#define WM8962_SPKOUTR_ENA_SHIFT 7 /* SPKOUTR_ENA */ +#define WM8962_SPKOUTR_ENA_WIDTH 1 /* SPKOUTR_ENA */ +#define WM8962_SPKOUTL_ENA 0x0040 /* SPKOUTL_ENA */ +#define WM8962_SPKOUTL_ENA_MASK 0x0040 /* SPKOUTL_ENA */ +#define WM8962_SPKOUTL_ENA_SHIFT 6 /* SPKOUTL_ENA */ +#define WM8962_SPKOUTL_ENA_WIDTH 1 /* SPKOUTL_ENA */ +#define WM8962_SPKOUTL_PGA_MUTE 0x0002 /* SPKOUTL_PGA_MUTE */ +#define WM8962_SPKOUTL_PGA_MUTE_MASK 0x0002 /* SPKOUTL_PGA_MUTE */ +#define WM8962_SPKOUTL_PGA_MUTE_SHIFT 1 /* SPKOUTL_PGA_MUTE */ +#define WM8962_SPKOUTL_PGA_MUTE_WIDTH 1 /* SPKOUTL_PGA_MUTE */ +#define WM8962_SPKOUTR_PGA_MUTE 0x0001 /* SPKOUTR_PGA_MUTE */ +#define WM8962_SPKOUTR_PGA_MUTE_MASK 0x0001 /* SPKOUTR_PGA_MUTE */ +#define WM8962_SPKOUTR_PGA_MUTE_SHIFT 0 /* SPKOUTR_PGA_MUTE */ +#define WM8962_SPKOUTR_PGA_MUTE_WIDTH 1 /* SPKOUTR_PGA_MUTE */ + +/* + * R51 (0x33) - Class D Control 2 + */ +#define WM8962_SPK_MONO 0x0040 /* SPK_MONO */ +#define WM8962_SPK_MONO_MASK 0x0040 /* SPK_MONO */ +#define WM8962_SPK_MONO_SHIFT 6 /* SPK_MONO */ +#define WM8962_SPK_MONO_WIDTH 1 /* SPK_MONO */ +#define WM8962_CLASSD_VOL_MASK 0x0007 /* CLASSD_VOL - [2:0] */ +#define WM8962_CLASSD_VOL_SHIFT 0 /* CLASSD_VOL - [2:0] */ +#define WM8962_CLASSD_VOL_WIDTH 3 /* CLASSD_VOL - [2:0] */ + +/* + * R56 (0x38) - Clocking 4 + */ +#define WM8962_SYSCLK_RATE_MASK 0x001E /* SYSCLK_RATE - [4:1] */ +#define WM8962_SYSCLK_RATE_SHIFT 1 /* SYSCLK_RATE - [4:1] */ +#define WM8962_SYSCLK_RATE_WIDTH 4 /* SYSCLK_RATE - [4:1] */ + +/* + * R57 (0x39) - DAC DSP Mixing (1) + */ +#define WM8962_DAC_MONOMIX 0x0200 /* DAC_MONOMIX */ +#define WM8962_DAC_MONOMIX_MASK 0x0200 /* DAC_MONOMIX */ +#define WM8962_DAC_MONOMIX_SHIFT 9 /* DAC_MONOMIX */ +#define WM8962_DAC_MONOMIX_WIDTH 1 /* DAC_MONOMIX */ +#define WM8962_ADCR_DAC_SVOL_MASK 0x00F0 /* ADCR_DAC_SVOL - [7:4] */ +#define WM8962_ADCR_DAC_SVOL_SHIFT 4 /* ADCR_DAC_SVOL - [7:4] */ +#define WM8962_ADCR_DAC_SVOL_WIDTH 4 /* ADCR_DAC_SVOL - [7:4] */ +#define WM8962_ADC_TO_DACR_MASK 0x000C /* ADC_TO_DACR - [3:2] */ +#define WM8962_ADC_TO_DACR_SHIFT 2 /* ADC_TO_DACR - [3:2] */ +#define WM8962_ADC_TO_DACR_WIDTH 2 /* ADC_TO_DACR - [3:2] */ + +/* + * R58 (0x3A) - DAC DSP Mixing (2) + */ +#define WM8962_ADCL_DAC_SVOL_MASK 0x00F0 /* ADCL_DAC_SVOL - [7:4] */ +#define WM8962_ADCL_DAC_SVOL_SHIFT 4 /* ADCL_DAC_SVOL - [7:4] */ +#define WM8962_ADCL_DAC_SVOL_WIDTH 4 /* ADCL_DAC_SVOL - [7:4] */ +#define WM8962_ADC_TO_DACL_MASK 0x000C /* ADC_TO_DACL - [3:2] */ +#define WM8962_ADC_TO_DACL_SHIFT 2 /* ADC_TO_DACL - [3:2] */ +#define WM8962_ADC_TO_DACL_WIDTH 2 /* ADC_TO_DACL - [3:2] */ + +/* + * R60 (0x3C) - DC Servo 0 + */ +#define WM8962_INL_DCS_ENA 0x0080 /* INL_DCS_ENA */ +#define WM8962_INL_DCS_ENA_MASK 0x0080 /* INL_DCS_ENA */ +#define WM8962_INL_DCS_ENA_SHIFT 7 /* INL_DCS_ENA */ +#define WM8962_INL_DCS_ENA_WIDTH 1 /* INL_DCS_ENA */ +#define WM8962_INL_DCS_STARTUP 0x0040 /* INL_DCS_STARTUP */ +#define WM8962_INL_DCS_STARTUP_MASK 0x0040 /* INL_DCS_STARTUP */ +#define WM8962_INL_DCS_STARTUP_SHIFT 6 /* INL_DCS_STARTUP */ +#define WM8962_INL_DCS_STARTUP_WIDTH 1 /* INL_DCS_STARTUP */ +#define WM8962_INR_DCS_ENA 0x0008 /* INR_DCS_ENA */ +#define WM8962_INR_DCS_ENA_MASK 0x0008 /* INR_DCS_ENA */ +#define WM8962_INR_DCS_ENA_SHIFT 3 /* INR_DCS_ENA */ +#define WM8962_INR_DCS_ENA_WIDTH 1 /* INR_DCS_ENA */ +#define WM8962_INR_DCS_STARTUP 0x0004 /* INR_DCS_STARTUP */ +#define WM8962_INR_DCS_STARTUP_MASK 0x0004 /* INR_DCS_STARTUP */ +#define WM8962_INR_DCS_STARTUP_SHIFT 2 /* INR_DCS_STARTUP */ +#define WM8962_INR_DCS_STARTUP_WIDTH 1 /* INR_DCS_STARTUP */ + +/* + * R61 (0x3D) - DC Servo 1 + */ +#define WM8962_HP1L_DCS_ENA 0x0080 /* HP1L_DCS_ENA */ +#define WM8962_HP1L_DCS_ENA_MASK 0x0080 /* HP1L_DCS_ENA */ +#define WM8962_HP1L_DCS_ENA_SHIFT 7 /* HP1L_DCS_ENA */ +#define WM8962_HP1L_DCS_ENA_WIDTH 1 /* HP1L_DCS_ENA */ +#define WM8962_HP1L_DCS_STARTUP 0x0040 /* HP1L_DCS_STARTUP */ +#define WM8962_HP1L_DCS_STARTUP_MASK 0x0040 /* HP1L_DCS_STARTUP */ +#define WM8962_HP1L_DCS_STARTUP_SHIFT 6 /* HP1L_DCS_STARTUP */ +#define WM8962_HP1L_DCS_STARTUP_WIDTH 1 /* HP1L_DCS_STARTUP */ +#define WM8962_HP1L_DCS_SYNC 0x0010 /* HP1L_DCS_SYNC */ +#define WM8962_HP1L_DCS_SYNC_MASK 0x0010 /* HP1L_DCS_SYNC */ +#define WM8962_HP1L_DCS_SYNC_SHIFT 4 /* HP1L_DCS_SYNC */ +#define WM8962_HP1L_DCS_SYNC_WIDTH 1 /* HP1L_DCS_SYNC */ +#define WM8962_HP1R_DCS_ENA 0x0008 /* HP1R_DCS_ENA */ +#define WM8962_HP1R_DCS_ENA_MASK 0x0008 /* HP1R_DCS_ENA */ +#define WM8962_HP1R_DCS_ENA_SHIFT 3 /* HP1R_DCS_ENA */ +#define WM8962_HP1R_DCS_ENA_WIDTH 1 /* HP1R_DCS_ENA */ +#define WM8962_HP1R_DCS_STARTUP 0x0004 /* HP1R_DCS_STARTUP */ +#define WM8962_HP1R_DCS_STARTUP_MASK 0x0004 /* HP1R_DCS_STARTUP */ +#define WM8962_HP1R_DCS_STARTUP_SHIFT 2 /* HP1R_DCS_STARTUP */ +#define WM8962_HP1R_DCS_STARTUP_WIDTH 1 /* HP1R_DCS_STARTUP */ +#define WM8962_HP1R_DCS_SYNC 0x0001 /* HP1R_DCS_SYNC */ +#define WM8962_HP1R_DCS_SYNC_MASK 0x0001 /* HP1R_DCS_SYNC */ +#define WM8962_HP1R_DCS_SYNC_SHIFT 0 /* HP1R_DCS_SYNC */ +#define WM8962_HP1R_DCS_SYNC_WIDTH 1 /* HP1R_DCS_SYNC */ + +/* + * R64 (0x40) - DC Servo 4 + */ +#define WM8962_HP1_DCS_SYNC_STEPS_MASK 0x3F80 /* HP1_DCS_SYNC_STEPS - [13:7] */ +#define WM8962_HP1_DCS_SYNC_STEPS_SHIFT 7 /* HP1_DCS_SYNC_STEPS - [13:7] */ +#define WM8962_HP1_DCS_SYNC_STEPS_WIDTH 7 /* HP1_DCS_SYNC_STEPS - [13:7] */ + +/* + * R66 (0x42) - DC Servo 6 + */ +#define WM8962_DCS_STARTUP_DONE_INL 0x0400 /* DCS_STARTUP_DONE_INL */ +#define WM8962_DCS_STARTUP_DONE_INL_MASK 0x0400 /* DCS_STARTUP_DONE_INL */ +#define WM8962_DCS_STARTUP_DONE_INL_SHIFT 10 /* DCS_STARTUP_DONE_INL */ +#define WM8962_DCS_STARTUP_DONE_INL_WIDTH 1 /* DCS_STARTUP_DONE_INL */ +#define WM8962_DCS_STARTUP_DONE_INR 0x0200 /* DCS_STARTUP_DONE_INR */ +#define WM8962_DCS_STARTUP_DONE_INR_MASK 0x0200 /* DCS_STARTUP_DONE_INR */ +#define WM8962_DCS_STARTUP_DONE_INR_SHIFT 9 /* DCS_STARTUP_DONE_INR */ +#define WM8962_DCS_STARTUP_DONE_INR_WIDTH 1 /* DCS_STARTUP_DONE_INR */ +#define WM8962_DCS_STARTUP_DONE_HP1L 0x0100 /* DCS_STARTUP_DONE_HP1L */ +#define WM8962_DCS_STARTUP_DONE_HP1L_MASK 0x0100 /* DCS_STARTUP_DONE_HP1L */ +#define WM8962_DCS_STARTUP_DONE_HP1L_SHIFT 8 /* DCS_STARTUP_DONE_HP1L */ +#define WM8962_DCS_STARTUP_DONE_HP1L_WIDTH 1 /* DCS_STARTUP_DONE_HP1L */ +#define WM8962_DCS_STARTUP_DONE_HP1R 0x0080 /* DCS_STARTUP_DONE_HP1R */ +#define WM8962_DCS_STARTUP_DONE_HP1R_MASK 0x0080 /* DCS_STARTUP_DONE_HP1R */ +#define WM8962_DCS_STARTUP_DONE_HP1R_SHIFT 7 /* DCS_STARTUP_DONE_HP1R */ +#define WM8962_DCS_STARTUP_DONE_HP1R_WIDTH 1 /* DCS_STARTUP_DONE_HP1R */ + +/* + * R68 (0x44) - Analogue PGA Bias + */ +#define WM8962_HP_PGAS_BIAS_MASK 0x0007 /* HP_PGAS_BIAS - [2:0] */ +#define WM8962_HP_PGAS_BIAS_SHIFT 0 /* HP_PGAS_BIAS - [2:0] */ +#define WM8962_HP_PGAS_BIAS_WIDTH 3 /* HP_PGAS_BIAS - [2:0] */ + +/* + * R69 (0x45) - Analogue HP 0 + */ +#define WM8962_HP1L_RMV_SHORT 0x0080 /* HP1L_RMV_SHORT */ +#define WM8962_HP1L_RMV_SHORT_MASK 0x0080 /* HP1L_RMV_SHORT */ +#define WM8962_HP1L_RMV_SHORT_SHIFT 7 /* HP1L_RMV_SHORT */ +#define WM8962_HP1L_RMV_SHORT_WIDTH 1 /* HP1L_RMV_SHORT */ +#define WM8962_HP1L_ENA_OUTP 0x0040 /* HP1L_ENA_OUTP */ +#define WM8962_HP1L_ENA_OUTP_MASK 0x0040 /* HP1L_ENA_OUTP */ +#define WM8962_HP1L_ENA_OUTP_SHIFT 6 /* HP1L_ENA_OUTP */ +#define WM8962_HP1L_ENA_OUTP_WIDTH 1 /* HP1L_ENA_OUTP */ +#define WM8962_HP1L_ENA_DLY 0x0020 /* HP1L_ENA_DLY */ +#define WM8962_HP1L_ENA_DLY_MASK 0x0020 /* HP1L_ENA_DLY */ +#define WM8962_HP1L_ENA_DLY_SHIFT 5 /* HP1L_ENA_DLY */ +#define WM8962_HP1L_ENA_DLY_WIDTH 1 /* HP1L_ENA_DLY */ +#define WM8962_HP1L_ENA 0x0010 /* HP1L_ENA */ +#define WM8962_HP1L_ENA_MASK 0x0010 /* HP1L_ENA */ +#define WM8962_HP1L_ENA_SHIFT 4 /* HP1L_ENA */ +#define WM8962_HP1L_ENA_WIDTH 1 /* HP1L_ENA */ +#define WM8962_HP1R_RMV_SHORT 0x0008 /* HP1R_RMV_SHORT */ +#define WM8962_HP1R_RMV_SHORT_MASK 0x0008 /* HP1R_RMV_SHORT */ +#define WM8962_HP1R_RMV_SHORT_SHIFT 3 /* HP1R_RMV_SHORT */ +#define WM8962_HP1R_RMV_SHORT_WIDTH 1 /* HP1R_RMV_SHORT */ +#define WM8962_HP1R_ENA_OUTP 0x0004 /* HP1R_ENA_OUTP */ +#define WM8962_HP1R_ENA_OUTP_MASK 0x0004 /* HP1R_ENA_OUTP */ +#define WM8962_HP1R_ENA_OUTP_SHIFT 2 /* HP1R_ENA_OUTP */ +#define WM8962_HP1R_ENA_OUTP_WIDTH 1 /* HP1R_ENA_OUTP */ +#define WM8962_HP1R_ENA_DLY 0x0002 /* HP1R_ENA_DLY */ +#define WM8962_HP1R_ENA_DLY_MASK 0x0002 /* HP1R_ENA_DLY */ +#define WM8962_HP1R_ENA_DLY_SHIFT 1 /* HP1R_ENA_DLY */ +#define WM8962_HP1R_ENA_DLY_WIDTH 1 /* HP1R_ENA_DLY */ +#define WM8962_HP1R_ENA 0x0001 /* HP1R_ENA */ +#define WM8962_HP1R_ENA_MASK 0x0001 /* HP1R_ENA */ +#define WM8962_HP1R_ENA_SHIFT 0 /* HP1R_ENA */ +#define WM8962_HP1R_ENA_WIDTH 1 /* HP1R_ENA */ + +/* + * R71 (0x47) - Analogue HP 2 + */ +#define WM8962_HP1L_VOL_MASK 0x01C0 /* HP1L_VOL - [8:6] */ +#define WM8962_HP1L_VOL_SHIFT 6 /* HP1L_VOL - [8:6] */ +#define WM8962_HP1L_VOL_WIDTH 3 /* HP1L_VOL - [8:6] */ +#define WM8962_HP1R_VOL_MASK 0x0038 /* HP1R_VOL - [5:3] */ +#define WM8962_HP1R_VOL_SHIFT 3 /* HP1R_VOL - [5:3] */ +#define WM8962_HP1R_VOL_WIDTH 3 /* HP1R_VOL - [5:3] */ +#define WM8962_HP_BIAS_BOOST_MASK 0x0007 /* HP_BIAS_BOOST - [2:0] */ +#define WM8962_HP_BIAS_BOOST_SHIFT 0 /* HP_BIAS_BOOST - [2:0] */ +#define WM8962_HP_BIAS_BOOST_WIDTH 3 /* HP_BIAS_BOOST - [2:0] */ + +/* + * R72 (0x48) - Charge Pump 1 + */ +#define WM8962_CP_ENA 0x0001 /* CP_ENA */ +#define WM8962_CP_ENA_MASK 0x0001 /* CP_ENA */ +#define WM8962_CP_ENA_SHIFT 0 /* CP_ENA */ +#define WM8962_CP_ENA_WIDTH 1 /* CP_ENA */ + +/* + * R82 (0x52) - Charge Pump B + */ +#define WM8962_CP_DYN_PWR 0x0001 /* CP_DYN_PWR */ +#define WM8962_CP_DYN_PWR_MASK 0x0001 /* CP_DYN_PWR */ +#define WM8962_CP_DYN_PWR_SHIFT 0 /* CP_DYN_PWR */ +#define WM8962_CP_DYN_PWR_WIDTH 1 /* CP_DYN_PWR */ + +/* + * R87 (0x57) - Write Sequencer Control 1 + */ +#define WM8962_WSEQ_AUTOSEQ_ENA 0x0080 /* WSEQ_AUTOSEQ_ENA */ +#define WM8962_WSEQ_AUTOSEQ_ENA_MASK 0x0080 /* WSEQ_AUTOSEQ_ENA */ +#define WM8962_WSEQ_AUTOSEQ_ENA_SHIFT 7 /* WSEQ_AUTOSEQ_ENA */ +#define WM8962_WSEQ_AUTOSEQ_ENA_WIDTH 1 /* WSEQ_AUTOSEQ_ENA */ +#define WM8962_WSEQ_ENA 0x0020 /* WSEQ_ENA */ +#define WM8962_WSEQ_ENA_MASK 0x0020 /* WSEQ_ENA */ +#define WM8962_WSEQ_ENA_SHIFT 5 /* WSEQ_ENA */ +#define WM8962_WSEQ_ENA_WIDTH 1 /* WSEQ_ENA */ + +/* + * R90 (0x5A) - Write Sequencer Control 2 + */ +#define WM8962_WSEQ_ABORT 0x0100 /* WSEQ_ABORT */ +#define WM8962_WSEQ_ABORT_MASK 0x0100 /* WSEQ_ABORT */ +#define WM8962_WSEQ_ABORT_SHIFT 8 /* WSEQ_ABORT */ +#define WM8962_WSEQ_ABORT_WIDTH 1 /* WSEQ_ABORT */ +#define WM8962_WSEQ_START 0x0080 /* WSEQ_START */ +#define WM8962_WSEQ_START_MASK 0x0080 /* WSEQ_START */ +#define WM8962_WSEQ_START_SHIFT 7 /* WSEQ_START */ +#define WM8962_WSEQ_START_WIDTH 1 /* WSEQ_START */ +#define WM8962_WSEQ_START_INDEX_MASK 0x007F /* WSEQ_START_INDEX - [6:0] */ +#define WM8962_WSEQ_START_INDEX_SHIFT 0 /* WSEQ_START_INDEX - [6:0] */ +#define WM8962_WSEQ_START_INDEX_WIDTH 7 /* WSEQ_START_INDEX - [6:0] */ + +/* + * R93 (0x5D) - Write Sequencer Control 3 + */ +#define WM8962_WSEQ_CURRENT_INDEX_MASK 0x03F8 /* WSEQ_CURRENT_INDEX - [9:3] */ +#define WM8962_WSEQ_CURRENT_INDEX_SHIFT 3 /* WSEQ_CURRENT_INDEX - [9:3] */ +#define WM8962_WSEQ_CURRENT_INDEX_WIDTH 7 /* WSEQ_CURRENT_INDEX - [9:3] */ +#define WM8962_WSEQ_BUSY 0x0001 /* WSEQ_BUSY */ +#define WM8962_WSEQ_BUSY_MASK 0x0001 /* WSEQ_BUSY */ +#define WM8962_WSEQ_BUSY_SHIFT 0 /* WSEQ_BUSY */ +#define WM8962_WSEQ_BUSY_WIDTH 1 /* WSEQ_BUSY */ + +/* + * R94 (0x5E) - Control Interface + */ +#define WM8962_SPI_CONTRD 0x0040 /* SPI_CONTRD */ +#define WM8962_SPI_CONTRD_MASK 0x0040 /* SPI_CONTRD */ +#define WM8962_SPI_CONTRD_SHIFT 6 /* SPI_CONTRD */ +#define WM8962_SPI_CONTRD_WIDTH 1 /* SPI_CONTRD */ +#define WM8962_SPI_4WIRE 0x0020 /* SPI_4WIRE */ +#define WM8962_SPI_4WIRE_MASK 0x0020 /* SPI_4WIRE */ +#define WM8962_SPI_4WIRE_SHIFT 5 /* SPI_4WIRE */ +#define WM8962_SPI_4WIRE_WIDTH 1 /* SPI_4WIRE */ +#define WM8962_SPI_CFG 0x0010 /* SPI_CFG */ +#define WM8962_SPI_CFG_MASK 0x0010 /* SPI_CFG */ +#define WM8962_SPI_CFG_SHIFT 4 /* SPI_CFG */ +#define WM8962_SPI_CFG_WIDTH 1 /* SPI_CFG */ + +/* + * R99 (0x63) - Mixer Enables + */ +#define WM8962_HPMIXL_ENA 0x0008 /* HPMIXL_ENA */ +#define WM8962_HPMIXL_ENA_MASK 0x0008 /* HPMIXL_ENA */ +#define WM8962_HPMIXL_ENA_SHIFT 3 /* HPMIXL_ENA */ +#define WM8962_HPMIXL_ENA_WIDTH 1 /* HPMIXL_ENA */ +#define WM8962_HPMIXR_ENA 0x0004 /* HPMIXR_ENA */ +#define WM8962_HPMIXR_ENA_MASK 0x0004 /* HPMIXR_ENA */ +#define WM8962_HPMIXR_ENA_SHIFT 2 /* HPMIXR_ENA */ +#define WM8962_HPMIXR_ENA_WIDTH 1 /* HPMIXR_ENA */ +#define WM8962_SPKMIXL_ENA 0x0002 /* SPKMIXL_ENA */ +#define WM8962_SPKMIXL_ENA_MASK 0x0002 /* SPKMIXL_ENA */ +#define WM8962_SPKMIXL_ENA_SHIFT 1 /* SPKMIXL_ENA */ +#define WM8962_SPKMIXL_ENA_WIDTH 1 /* SPKMIXL_ENA */ +#define WM8962_SPKMIXR_ENA 0x0001 /* SPKMIXR_ENA */ +#define WM8962_SPKMIXR_ENA_MASK 0x0001 /* SPKMIXR_ENA */ +#define WM8962_SPKMIXR_ENA_SHIFT 0 /* SPKMIXR_ENA */ +#define WM8962_SPKMIXR_ENA_WIDTH 1 /* SPKMIXR_ENA */ + +/* + * R100 (0x64) - Headphone Mixer (1) + */ +#define WM8962_HPMIXL_TO_HPOUTL_PGA 0x0080 /* HPMIXL_TO_HPOUTL_PGA */ +#define WM8962_HPMIXL_TO_HPOUTL_PGA_MASK 0x0080 /* HPMIXL_TO_HPOUTL_PGA */ +#define WM8962_HPMIXL_TO_HPOUTL_PGA_SHIFT 7 /* HPMIXL_TO_HPOUTL_PGA */ +#define WM8962_HPMIXL_TO_HPOUTL_PGA_WIDTH 1 /* HPMIXL_TO_HPOUTL_PGA */ +#define WM8962_DACL_TO_HPMIXL 0x0020 /* DACL_TO_HPMIXL */ +#define WM8962_DACL_TO_HPMIXL_MASK 0x0020 /* DACL_TO_HPMIXL */ +#define WM8962_DACL_TO_HPMIXL_SHIFT 5 /* DACL_TO_HPMIXL */ +#define WM8962_DACL_TO_HPMIXL_WIDTH 1 /* DACL_TO_HPMIXL */ +#define WM8962_DACR_TO_HPMIXL 0x0010 /* DACR_TO_HPMIXL */ +#define WM8962_DACR_TO_HPMIXL_MASK 0x0010 /* DACR_TO_HPMIXL */ +#define WM8962_DACR_TO_HPMIXL_SHIFT 4 /* DACR_TO_HPMIXL */ +#define WM8962_DACR_TO_HPMIXL_WIDTH 1 /* DACR_TO_HPMIXL */ +#define WM8962_MIXINL_TO_HPMIXL 0x0008 /* MIXINL_TO_HPMIXL */ +#define WM8962_MIXINL_TO_HPMIXL_MASK 0x0008 /* MIXINL_TO_HPMIXL */ +#define WM8962_MIXINL_TO_HPMIXL_SHIFT 3 /* MIXINL_TO_HPMIXL */ +#define WM8962_MIXINL_TO_HPMIXL_WIDTH 1 /* MIXINL_TO_HPMIXL */ +#define WM8962_MIXINR_TO_HPMIXL 0x0004 /* MIXINR_TO_HPMIXL */ +#define WM8962_MIXINR_TO_HPMIXL_MASK 0x0004 /* MIXINR_TO_HPMIXL */ +#define WM8962_MIXINR_TO_HPMIXL_SHIFT 2 /* MIXINR_TO_HPMIXL */ +#define WM8962_MIXINR_TO_HPMIXL_WIDTH 1 /* MIXINR_TO_HPMIXL */ +#define WM8962_IN4L_TO_HPMIXL 0x0002 /* IN4L_TO_HPMIXL */ +#define WM8962_IN4L_TO_HPMIXL_MASK 0x0002 /* IN4L_TO_HPMIXL */ +#define WM8962_IN4L_TO_HPMIXL_SHIFT 1 /* IN4L_TO_HPMIXL */ +#define WM8962_IN4L_TO_HPMIXL_WIDTH 1 /* IN4L_TO_HPMIXL */ +#define WM8962_IN4R_TO_HPMIXL 0x0001 /* IN4R_TO_HPMIXL */ +#define WM8962_IN4R_TO_HPMIXL_MASK 0x0001 /* IN4R_TO_HPMIXL */ +#define WM8962_IN4R_TO_HPMIXL_SHIFT 0 /* IN4R_TO_HPMIXL */ +#define WM8962_IN4R_TO_HPMIXL_WIDTH 1 /* IN4R_TO_HPMIXL */ + +/* + * R101 (0x65) - Headphone Mixer (2) + */ +#define WM8962_HPMIXR_TO_HPOUTR_PGA 0x0080 /* HPMIXR_TO_HPOUTR_PGA */ +#define WM8962_HPMIXR_TO_HPOUTR_PGA_MASK 0x0080 /* HPMIXR_TO_HPOUTR_PGA */ +#define WM8962_HPMIXR_TO_HPOUTR_PGA_SHIFT 7 /* HPMIXR_TO_HPOUTR_PGA */ +#define WM8962_HPMIXR_TO_HPOUTR_PGA_WIDTH 1 /* HPMIXR_TO_HPOUTR_PGA */ +#define WM8962_DACL_TO_HPMIXR 0x0020 /* DACL_TO_HPMIXR */ +#define WM8962_DACL_TO_HPMIXR_MASK 0x0020 /* DACL_TO_HPMIXR */ +#define WM8962_DACL_TO_HPMIXR_SHIFT 5 /* DACL_TO_HPMIXR */ +#define WM8962_DACL_TO_HPMIXR_WIDTH 1 /* DACL_TO_HPMIXR */ +#define WM8962_DACR_TO_HPMIXR 0x0010 /* DACR_TO_HPMIXR */ +#define WM8962_DACR_TO_HPMIXR_MASK 0x0010 /* DACR_TO_HPMIXR */ +#define WM8962_DACR_TO_HPMIXR_SHIFT 4 /* DACR_TO_HPMIXR */ +#define WM8962_DACR_TO_HPMIXR_WIDTH 1 /* DACR_TO_HPMIXR */ +#define WM8962_MIXINL_TO_HPMIXR 0x0008 /* MIXINL_TO_HPMIXR */ +#define WM8962_MIXINL_TO_HPMIXR_MASK 0x0008 /* MIXINL_TO_HPMIXR */ +#define WM8962_MIXINL_TO_HPMIXR_SHIFT 3 /* MIXINL_TO_HPMIXR */ +#define WM8962_MIXINL_TO_HPMIXR_WIDTH 1 /* MIXINL_TO_HPMIXR */ +#define WM8962_MIXINR_TO_HPMIXR 0x0004 /* MIXINR_TO_HPMIXR */ +#define WM8962_MIXINR_TO_HPMIXR_MASK 0x0004 /* MIXINR_TO_HPMIXR */ +#define WM8962_MIXINR_TO_HPMIXR_SHIFT 2 /* MIXINR_TO_HPMIXR */ +#define WM8962_MIXINR_TO_HPMIXR_WIDTH 1 /* MIXINR_TO_HPMIXR */ +#define WM8962_IN4L_TO_HPMIXR 0x0002 /* IN4L_TO_HPMIXR */ +#define WM8962_IN4L_TO_HPMIXR_MASK 0x0002 /* IN4L_TO_HPMIXR */ +#define WM8962_IN4L_TO_HPMIXR_SHIFT 1 /* IN4L_TO_HPMIXR */ +#define WM8962_IN4L_TO_HPMIXR_WIDTH 1 /* IN4L_TO_HPMIXR */ +#define WM8962_IN4R_TO_HPMIXR 0x0001 /* IN4R_TO_HPMIXR */ +#define WM8962_IN4R_TO_HPMIXR_MASK 0x0001 /* IN4R_TO_HPMIXR */ +#define WM8962_IN4R_TO_HPMIXR_SHIFT 0 /* IN4R_TO_HPMIXR */ +#define WM8962_IN4R_TO_HPMIXR_WIDTH 1 /* IN4R_TO_HPMIXR */ + +/* + * R102 (0x66) - Headphone Mixer (3) + */ +#define WM8962_HPMIXL_MUTE 0x0100 /* HPMIXL_MUTE */ +#define WM8962_HPMIXL_MUTE_MASK 0x0100 /* HPMIXL_MUTE */ +#define WM8962_HPMIXL_MUTE_SHIFT 8 /* HPMIXL_MUTE */ +#define WM8962_HPMIXL_MUTE_WIDTH 1 /* HPMIXL_MUTE */ +#define WM8962_MIXINL_HPMIXL_VOL 0x0080 /* MIXINL_HPMIXL_VOL */ +#define WM8962_MIXINL_HPMIXL_VOL_MASK 0x0080 /* MIXINL_HPMIXL_VOL */ +#define WM8962_MIXINL_HPMIXL_VOL_SHIFT 7 /* MIXINL_HPMIXL_VOL */ +#define WM8962_MIXINL_HPMIXL_VOL_WIDTH 1 /* MIXINL_HPMIXL_VOL */ +#define WM8962_MIXINR_HPMIXL_VOL 0x0040 /* MIXINR_HPMIXL_VOL */ +#define WM8962_MIXINR_HPMIXL_VOL_MASK 0x0040 /* MIXINR_HPMIXL_VOL */ +#define WM8962_MIXINR_HPMIXL_VOL_SHIFT 6 /* MIXINR_HPMIXL_VOL */ +#define WM8962_MIXINR_HPMIXL_VOL_WIDTH 1 /* MIXINR_HPMIXL_VOL */ +#define WM8962_IN4L_HPMIXL_VOL_MASK 0x0038 /* IN4L_HPMIXL_VOL - [5:3] */ +#define WM8962_IN4L_HPMIXL_VOL_SHIFT 3 /* IN4L_HPMIXL_VOL - [5:3] */ +#define WM8962_IN4L_HPMIXL_VOL_WIDTH 3 /* IN4L_HPMIXL_VOL - [5:3] */ +#define WM8962_IN4R_HPMIXL_VOL_MASK 0x0007 /* IN4R_HPMIXL_VOL - [2:0] */ +#define WM8962_IN4R_HPMIXL_VOL_SHIFT 0 /* IN4R_HPMIXL_VOL - [2:0] */ +#define WM8962_IN4R_HPMIXL_VOL_WIDTH 3 /* IN4R_HPMIXL_VOL - [2:0] */ + +/* + * R103 (0x67) - Headphone Mixer (4) + */ +#define WM8962_HPMIXR_MUTE 0x0100 /* HPMIXR_MUTE */ +#define WM8962_HPMIXR_MUTE_MASK 0x0100 /* HPMIXR_MUTE */ +#define WM8962_HPMIXR_MUTE_SHIFT 8 /* HPMIXR_MUTE */ +#define WM8962_HPMIXR_MUTE_WIDTH 1 /* HPMIXR_MUTE */ +#define WM8962_MIXINL_HPMIXR_VOL 0x0080 /* MIXINL_HPMIXR_VOL */ +#define WM8962_MIXINL_HPMIXR_VOL_MASK 0x0080 /* MIXINL_HPMIXR_VOL */ +#define WM8962_MIXINL_HPMIXR_VOL_SHIFT 7 /* MIXINL_HPMIXR_VOL */ +#define WM8962_MIXINL_HPMIXR_VOL_WIDTH 1 /* MIXINL_HPMIXR_VOL */ +#define WM8962_MIXINR_HPMIXR_VOL 0x0040 /* MIXINR_HPMIXR_VOL */ +#define WM8962_MIXINR_HPMIXR_VOL_MASK 0x0040 /* MIXINR_HPMIXR_VOL */ +#define WM8962_MIXINR_HPMIXR_VOL_SHIFT 6 /* MIXINR_HPMIXR_VOL */ +#define WM8962_MIXINR_HPMIXR_VOL_WIDTH 1 /* MIXINR_HPMIXR_VOL */ +#define WM8962_IN4L_HPMIXR_VOL_MASK 0x0038 /* IN4L_HPMIXR_VOL - [5:3] */ +#define WM8962_IN4L_HPMIXR_VOL_SHIFT 3 /* IN4L_HPMIXR_VOL - [5:3] */ +#define WM8962_IN4L_HPMIXR_VOL_WIDTH 3 /* IN4L_HPMIXR_VOL - [5:3] */ +#define WM8962_IN4R_HPMIXR_VOL_MASK 0x0007 /* IN4R_HPMIXR_VOL - [2:0] */ +#define WM8962_IN4R_HPMIXR_VOL_SHIFT 0 /* IN4R_HPMIXR_VOL - [2:0] */ +#define WM8962_IN4R_HPMIXR_VOL_WIDTH 3 /* IN4R_HPMIXR_VOL - [2:0] */ + +/* + * R105 (0x69) - Speaker Mixer (1) + */ +#define WM8962_SPKMIXL_TO_SPKOUTL_PGA 0x0080 /* SPKMIXL_TO_SPKOUTL_PGA */ +#define WM8962_SPKMIXL_TO_SPKOUTL_PGA_MASK 0x0080 /* SPKMIXL_TO_SPKOUTL_PGA */ +#define WM8962_SPKMIXL_TO_SPKOUTL_PGA_SHIFT 7 /* SPKMIXL_TO_SPKOUTL_PGA */ +#define WM8962_SPKMIXL_TO_SPKOUTL_PGA_WIDTH 1 /* SPKMIXL_TO_SPKOUTL_PGA */ +#define WM8962_DACL_TO_SPKMIXL 0x0020 /* DACL_TO_SPKMIXL */ +#define WM8962_DACL_TO_SPKMIXL_MASK 0x0020 /* DACL_TO_SPKMIXL */ +#define WM8962_DACL_TO_SPKMIXL_SHIFT 5 /* DACL_TO_SPKMIXL */ +#define WM8962_DACL_TO_SPKMIXL_WIDTH 1 /* DACL_TO_SPKMIXL */ +#define WM8962_DACR_TO_SPKMIXL 0x0010 /* DACR_TO_SPKMIXL */ +#define WM8962_DACR_TO_SPKMIXL_MASK 0x0010 /* DACR_TO_SPKMIXL */ +#define WM8962_DACR_TO_SPKMIXL_SHIFT 4 /* DACR_TO_SPKMIXL */ +#define WM8962_DACR_TO_SPKMIXL_WIDTH 1 /* DACR_TO_SPKMIXL */ +#define WM8962_MIXINL_TO_SPKMIXL 0x0008 /* MIXINL_TO_SPKMIXL */ +#define WM8962_MIXINL_TO_SPKMIXL_MASK 0x0008 /* MIXINL_TO_SPKMIXL */ +#define WM8962_MIXINL_TO_SPKMIXL_SHIFT 3 /* MIXINL_TO_SPKMIXL */ +#define WM8962_MIXINL_TO_SPKMIXL_WIDTH 1 /* MIXINL_TO_SPKMIXL */ +#define WM8962_MIXINR_TO_SPKMIXL 0x0004 /* MIXINR_TO_SPKMIXL */ +#define WM8962_MIXINR_TO_SPKMIXL_MASK 0x0004 /* MIXINR_TO_SPKMIXL */ +#define WM8962_MIXINR_TO_SPKMIXL_SHIFT 2 /* MIXINR_TO_SPKMIXL */ +#define WM8962_MIXINR_TO_SPKMIXL_WIDTH 1 /* MIXINR_TO_SPKMIXL */ +#define WM8962_IN4L_TO_SPKMIXL 0x0002 /* IN4L_TO_SPKMIXL */ +#define WM8962_IN4L_TO_SPKMIXL_MASK 0x0002 /* IN4L_TO_SPKMIXL */ +#define WM8962_IN4L_TO_SPKMIXL_SHIFT 1 /* IN4L_TO_SPKMIXL */ +#define WM8962_IN4L_TO_SPKMIXL_WIDTH 1 /* IN4L_TO_SPKMIXL */ +#define WM8962_IN4R_TO_SPKMIXL 0x0001 /* IN4R_TO_SPKMIXL */ +#define WM8962_IN4R_TO_SPKMIXL_MASK 0x0001 /* IN4R_TO_SPKMIXL */ +#define WM8962_IN4R_TO_SPKMIXL_SHIFT 0 /* IN4R_TO_SPKMIXL */ +#define WM8962_IN4R_TO_SPKMIXL_WIDTH 1 /* IN4R_TO_SPKMIXL */ + +/* + * R106 (0x6A) - Speaker Mixer (2) + */ +#define WM8962_SPKMIXR_TO_SPKOUTR_PGA 0x0080 /* SPKMIXR_TO_SPKOUTR_PGA */ +#define WM8962_SPKMIXR_TO_SPKOUTR_PGA_MASK 0x0080 /* SPKMIXR_TO_SPKOUTR_PGA */ +#define WM8962_SPKMIXR_TO_SPKOUTR_PGA_SHIFT 7 /* SPKMIXR_TO_SPKOUTR_PGA */ +#define WM8962_SPKMIXR_TO_SPKOUTR_PGA_WIDTH 1 /* SPKMIXR_TO_SPKOUTR_PGA */ +#define WM8962_DACL_TO_SPKMIXR 0x0020 /* DACL_TO_SPKMIXR */ +#define WM8962_DACL_TO_SPKMIXR_MASK 0x0020 /* DACL_TO_SPKMIXR */ +#define WM8962_DACL_TO_SPKMIXR_SHIFT 5 /* DACL_TO_SPKMIXR */ +#define WM8962_DACL_TO_SPKMIXR_WIDTH 1 /* DACL_TO_SPKMIXR */ +#define WM8962_DACR_TO_SPKMIXR 0x0010 /* DACR_TO_SPKMIXR */ +#define WM8962_DACR_TO_SPKMIXR_MASK 0x0010 /* DACR_TO_SPKMIXR */ +#define WM8962_DACR_TO_SPKMIXR_SHIFT 4 /* DACR_TO_SPKMIXR */ +#define WM8962_DACR_TO_SPKMIXR_WIDTH 1 /* DACR_TO_SPKMIXR */ +#define WM8962_MIXINL_TO_SPKMIXR 0x0008 /* MIXINL_TO_SPKMIXR */ +#define WM8962_MIXINL_TO_SPKMIXR_MASK 0x0008 /* MIXINL_TO_SPKMIXR */ +#define WM8962_MIXINL_TO_SPKMIXR_SHIFT 3 /* MIXINL_TO_SPKMIXR */ +#define WM8962_MIXINL_TO_SPKMIXR_WIDTH 1 /* MIXINL_TO_SPKMIXR */ +#define WM8962_MIXINR_TO_SPKMIXR 0x0004 /* MIXINR_TO_SPKMIXR */ +#define WM8962_MIXINR_TO_SPKMIXR_MASK 0x0004 /* MIXINR_TO_SPKMIXR */ +#define WM8962_MIXINR_TO_SPKMIXR_SHIFT 2 /* MIXINR_TO_SPKMIXR */ +#define WM8962_MIXINR_TO_SPKMIXR_WIDTH 1 /* MIXINR_TO_SPKMIXR */ +#define WM8962_IN4L_TO_SPKMIXR 0x0002 /* IN4L_TO_SPKMIXR */ +#define WM8962_IN4L_TO_SPKMIXR_MASK 0x0002 /* IN4L_TO_SPKMIXR */ +#define WM8962_IN4L_TO_SPKMIXR_SHIFT 1 /* IN4L_TO_SPKMIXR */ +#define WM8962_IN4L_TO_SPKMIXR_WIDTH 1 /* IN4L_TO_SPKMIXR */ +#define WM8962_IN4R_TO_SPKMIXR 0x0001 /* IN4R_TO_SPKMIXR */ +#define WM8962_IN4R_TO_SPKMIXR_MASK 0x0001 /* IN4R_TO_SPKMIXR */ +#define WM8962_IN4R_TO_SPKMIXR_SHIFT 0 /* IN4R_TO_SPKMIXR */ +#define WM8962_IN4R_TO_SPKMIXR_WIDTH 1 /* IN4R_TO_SPKMIXR */ + +/* + * R107 (0x6B) - Speaker Mixer (3) + */ +#define WM8962_SPKMIXL_MUTE 0x0100 /* SPKMIXL_MUTE */ +#define WM8962_SPKMIXL_MUTE_MASK 0x0100 /* SPKMIXL_MUTE */ +#define WM8962_SPKMIXL_MUTE_SHIFT 8 /* SPKMIXL_MUTE */ +#define WM8962_SPKMIXL_MUTE_WIDTH 1 /* SPKMIXL_MUTE */ +#define WM8962_MIXINL_SPKMIXL_VOL 0x0080 /* MIXINL_SPKMIXL_VOL */ +#define WM8962_MIXINL_SPKMIXL_VOL_MASK 0x0080 /* MIXINL_SPKMIXL_VOL */ +#define WM8962_MIXINL_SPKMIXL_VOL_SHIFT 7 /* MIXINL_SPKMIXL_VOL */ +#define WM8962_MIXINL_SPKMIXL_VOL_WIDTH 1 /* MIXINL_SPKMIXL_VOL */ +#define WM8962_MIXINR_SPKMIXL_VOL 0x0040 /* MIXINR_SPKMIXL_VOL */ +#define WM8962_MIXINR_SPKMIXL_VOL_MASK 0x0040 /* MIXINR_SPKMIXL_VOL */ +#define WM8962_MIXINR_SPKMIXL_VOL_SHIFT 6 /* MIXINR_SPKMIXL_VOL */ +#define WM8962_MIXINR_SPKMIXL_VOL_WIDTH 1 /* MIXINR_SPKMIXL_VOL */ +#define WM8962_IN4L_SPKMIXL_VOL_MASK 0x0038 /* IN4L_SPKMIXL_VOL - [5:3] */ +#define WM8962_IN4L_SPKMIXL_VOL_SHIFT 3 /* IN4L_SPKMIXL_VOL - [5:3] */ +#define WM8962_IN4L_SPKMIXL_VOL_WIDTH 3 /* IN4L_SPKMIXL_VOL - [5:3] */ +#define WM8962_IN4R_SPKMIXL_VOL_MASK 0x0007 /* IN4R_SPKMIXL_VOL - [2:0] */ +#define WM8962_IN4R_SPKMIXL_VOL_SHIFT 0 /* IN4R_SPKMIXL_VOL - [2:0] */ +#define WM8962_IN4R_SPKMIXL_VOL_WIDTH 3 /* IN4R_SPKMIXL_VOL - [2:0] */ + +/* + * R108 (0x6C) - Speaker Mixer (4) + */ +#define WM8962_SPKMIXR_MUTE 0x0100 /* SPKMIXR_MUTE */ +#define WM8962_SPKMIXR_MUTE_MASK 0x0100 /* SPKMIXR_MUTE */ +#define WM8962_SPKMIXR_MUTE_SHIFT 8 /* SPKMIXR_MUTE */ +#define WM8962_SPKMIXR_MUTE_WIDTH 1 /* SPKMIXR_MUTE */ +#define WM8962_MIXINL_SPKMIXR_VOL 0x0080 /* MIXINL_SPKMIXR_VOL */ +#define WM8962_MIXINL_SPKMIXR_VOL_MASK 0x0080 /* MIXINL_SPKMIXR_VOL */ +#define WM8962_MIXINL_SPKMIXR_VOL_SHIFT 7 /* MIXINL_SPKMIXR_VOL */ +#define WM8962_MIXINL_SPKMIXR_VOL_WIDTH 1 /* MIXINL_SPKMIXR_VOL */ +#define WM8962_MIXINR_SPKMIXR_VOL 0x0040 /* MIXINR_SPKMIXR_VOL */ +#define WM8962_MIXINR_SPKMIXR_VOL_MASK 0x0040 /* MIXINR_SPKMIXR_VOL */ +#define WM8962_MIXINR_SPKMIXR_VOL_SHIFT 6 /* MIXINR_SPKMIXR_VOL */ +#define WM8962_MIXINR_SPKMIXR_VOL_WIDTH 1 /* MIXINR_SPKMIXR_VOL */ +#define WM8962_IN4L_SPKMIXR_VOL_MASK 0x0038 /* IN4L_SPKMIXR_VOL - [5:3] */ +#define WM8962_IN4L_SPKMIXR_VOL_SHIFT 3 /* IN4L_SPKMIXR_VOL - [5:3] */ +#define WM8962_IN4L_SPKMIXR_VOL_WIDTH 3 /* IN4L_SPKMIXR_VOL - [5:3] */ +#define WM8962_IN4R_SPKMIXR_VOL_MASK 0x0007 /* IN4R_SPKMIXR_VOL - [2:0] */ +#define WM8962_IN4R_SPKMIXR_VOL_SHIFT 0 /* IN4R_SPKMIXR_VOL - [2:0] */ +#define WM8962_IN4R_SPKMIXR_VOL_WIDTH 3 /* IN4R_SPKMIXR_VOL - [2:0] */ + +/* + * R109 (0x6D) - Speaker Mixer (5) + */ +#define WM8962_DACL_SPKMIXL_VOL 0x0080 /* DACL_SPKMIXL_VOL */ +#define WM8962_DACL_SPKMIXL_VOL_MASK 0x0080 /* DACL_SPKMIXL_VOL */ +#define WM8962_DACL_SPKMIXL_VOL_SHIFT 7 /* DACL_SPKMIXL_VOL */ +#define WM8962_DACL_SPKMIXL_VOL_WIDTH 1 /* DACL_SPKMIXL_VOL */ +#define WM8962_DACR_SPKMIXL_VOL 0x0040 /* DACR_SPKMIXL_VOL */ +#define WM8962_DACR_SPKMIXL_VOL_MASK 0x0040 /* DACR_SPKMIXL_VOL */ +#define WM8962_DACR_SPKMIXL_VOL_SHIFT 6 /* DACR_SPKMIXL_VOL */ +#define WM8962_DACR_SPKMIXL_VOL_WIDTH 1 /* DACR_SPKMIXL_VOL */ +#define WM8962_DACL_SPKMIXR_VOL 0x0020 /* DACL_SPKMIXR_VOL */ +#define WM8962_DACL_SPKMIXR_VOL_MASK 0x0020 /* DACL_SPKMIXR_VOL */ +#define WM8962_DACL_SPKMIXR_VOL_SHIFT 5 /* DACL_SPKMIXR_VOL */ +#define WM8962_DACL_SPKMIXR_VOL_WIDTH 1 /* DACL_SPKMIXR_VOL */ +#define WM8962_DACR_SPKMIXR_VOL 0x0010 /* DACR_SPKMIXR_VOL */ +#define WM8962_DACR_SPKMIXR_VOL_MASK 0x0010 /* DACR_SPKMIXR_VOL */ +#define WM8962_DACR_SPKMIXR_VOL_SHIFT 4 /* DACR_SPKMIXR_VOL */ +#define WM8962_DACR_SPKMIXR_VOL_WIDTH 1 /* DACR_SPKMIXR_VOL */ + +/* + * R110 (0x6E) - Beep Generator (1) + */ +#define WM8962_BEEP_GAIN_MASK 0x00F0 /* BEEP_GAIN - [7:4] */ +#define WM8962_BEEP_GAIN_SHIFT 4 /* BEEP_GAIN - [7:4] */ +#define WM8962_BEEP_GAIN_WIDTH 4 /* BEEP_GAIN - [7:4] */ +#define WM8962_BEEP_RATE_MASK 0x0006 /* BEEP_RATE - [2:1] */ +#define WM8962_BEEP_RATE_SHIFT 1 /* BEEP_RATE - [2:1] */ +#define WM8962_BEEP_RATE_WIDTH 2 /* BEEP_RATE - [2:1] */ +#define WM8962_BEEP_ENA 0x0001 /* BEEP_ENA */ +#define WM8962_BEEP_ENA_MASK 0x0001 /* BEEP_ENA */ +#define WM8962_BEEP_ENA_SHIFT 0 /* BEEP_ENA */ +#define WM8962_BEEP_ENA_WIDTH 1 /* BEEP_ENA */ + +/* + * R115 (0x73) - Oscillator Trim (3) + */ +#define WM8962_OSC_TRIM_XTI_MASK 0x001F /* OSC_TRIM_XTI - [4:0] */ +#define WM8962_OSC_TRIM_XTI_SHIFT 0 /* OSC_TRIM_XTI - [4:0] */ +#define WM8962_OSC_TRIM_XTI_WIDTH 5 /* OSC_TRIM_XTI - [4:0] */ + +/* + * R116 (0x74) - Oscillator Trim (4) + */ +#define WM8962_OSC_TRIM_XTO_MASK 0x001F /* OSC_TRIM_XTO - [4:0] */ +#define WM8962_OSC_TRIM_XTO_SHIFT 0 /* OSC_TRIM_XTO - [4:0] */ +#define WM8962_OSC_TRIM_XTO_WIDTH 5 /* OSC_TRIM_XTO - [4:0] */ + +/* + * R119 (0x77) - Oscillator Trim (7) + */ +#define WM8962_XTO_CAP_SEL_MASK 0x00F0 /* XTO_CAP_SEL - [7:4] */ +#define WM8962_XTO_CAP_SEL_SHIFT 4 /* XTO_CAP_SEL - [7:4] */ +#define WM8962_XTO_CAP_SEL_WIDTH 4 /* XTO_CAP_SEL - [7:4] */ +#define WM8962_XTI_CAP_SEL_MASK 0x000F /* XTI_CAP_SEL - [3:0] */ +#define WM8962_XTI_CAP_SEL_SHIFT 0 /* XTI_CAP_SEL - [3:0] */ +#define WM8962_XTI_CAP_SEL_WIDTH 4 /* XTI_CAP_SEL - [3:0] */ + +/* + * R124 (0x7C) - Analogue Clocking1 + */ +#define WM8962_CLKOUT2_SEL_MASK 0x0060 /* CLKOUT2_SEL - [6:5] */ +#define WM8962_CLKOUT2_SEL_SHIFT 5 /* CLKOUT2_SEL - [6:5] */ +#define WM8962_CLKOUT2_SEL_WIDTH 2 /* CLKOUT2_SEL - [6:5] */ +#define WM8962_CLKOUT3_SEL_MASK 0x0018 /* CLKOUT3_SEL - [4:3] */ +#define WM8962_CLKOUT3_SEL_SHIFT 3 /* CLKOUT3_SEL - [4:3] */ +#define WM8962_CLKOUT3_SEL_WIDTH 2 /* CLKOUT3_SEL - [4:3] */ +#define WM8962_CLKOUT5_SEL 0x0001 /* CLKOUT5_SEL */ +#define WM8962_CLKOUT5_SEL_MASK 0x0001 /* CLKOUT5_SEL */ +#define WM8962_CLKOUT5_SEL_SHIFT 0 /* CLKOUT5_SEL */ +#define WM8962_CLKOUT5_SEL_WIDTH 1 /* CLKOUT5_SEL */ + +/* + * R125 (0x7D) - Analogue Clocking2 + */ +#define WM8962_PLL2_OUTDIV 0x0080 /* PLL2_OUTDIV */ +#define WM8962_PLL2_OUTDIV_MASK 0x0080 /* PLL2_OUTDIV */ +#define WM8962_PLL2_OUTDIV_SHIFT 7 /* PLL2_OUTDIV */ +#define WM8962_PLL2_OUTDIV_WIDTH 1 /* PLL2_OUTDIV */ +#define WM8962_PLL3_OUTDIV 0x0040 /* PLL3_OUTDIV */ +#define WM8962_PLL3_OUTDIV_MASK 0x0040 /* PLL3_OUTDIV */ +#define WM8962_PLL3_OUTDIV_SHIFT 6 /* PLL3_OUTDIV */ +#define WM8962_PLL3_OUTDIV_WIDTH 1 /* PLL3_OUTDIV */ +#define WM8962_PLL_SYSCLK_DIV_MASK 0x0018 /* PLL_SYSCLK_DIV - [4:3] */ +#define WM8962_PLL_SYSCLK_DIV_SHIFT 3 /* PLL_SYSCLK_DIV - [4:3] */ +#define WM8962_PLL_SYSCLK_DIV_WIDTH 2 /* PLL_SYSCLK_DIV - [4:3] */ +#define WM8962_CLKOUT3_DIV 0x0004 /* CLKOUT3_DIV */ +#define WM8962_CLKOUT3_DIV_MASK 0x0004 /* CLKOUT3_DIV */ +#define WM8962_CLKOUT3_DIV_SHIFT 2 /* CLKOUT3_DIV */ +#define WM8962_CLKOUT3_DIV_WIDTH 1 /* CLKOUT3_DIV */ +#define WM8962_CLKOUT2_DIV 0x0002 /* CLKOUT2_DIV */ +#define WM8962_CLKOUT2_DIV_MASK 0x0002 /* CLKOUT2_DIV */ +#define WM8962_CLKOUT2_DIV_SHIFT 1 /* CLKOUT2_DIV */ +#define WM8962_CLKOUT2_DIV_WIDTH 1 /* CLKOUT2_DIV */ +#define WM8962_CLKOUT5_DIV 0x0001 /* CLKOUT5_DIV */ +#define WM8962_CLKOUT5_DIV_MASK 0x0001 /* CLKOUT5_DIV */ +#define WM8962_CLKOUT5_DIV_SHIFT 0 /* CLKOUT5_DIV */ +#define WM8962_CLKOUT5_DIV_WIDTH 1 /* CLKOUT5_DIV */ + +/* + * R126 (0x7E) - Analogue Clocking3 + */ +#define WM8962_CLKOUT2_OE 0x0008 /* CLKOUT2_OE */ +#define WM8962_CLKOUT2_OE_MASK 0x0008 /* CLKOUT2_OE */ +#define WM8962_CLKOUT2_OE_SHIFT 3 /* CLKOUT2_OE */ +#define WM8962_CLKOUT2_OE_WIDTH 1 /* CLKOUT2_OE */ +#define WM8962_CLKOUT3_OE 0x0004 /* CLKOUT3_OE */ +#define WM8962_CLKOUT3_OE_MASK 0x0004 /* CLKOUT3_OE */ +#define WM8962_CLKOUT3_OE_SHIFT 2 /* CLKOUT3_OE */ +#define WM8962_CLKOUT3_OE_WIDTH 1 /* CLKOUT3_OE */ +#define WM8962_CLKOUT5_OE 0x0001 /* CLKOUT5_OE */ +#define WM8962_CLKOUT5_OE_MASK 0x0001 /* CLKOUT5_OE */ +#define WM8962_CLKOUT5_OE_SHIFT 0 /* CLKOUT5_OE */ +#define WM8962_CLKOUT5_OE_WIDTH 1 /* CLKOUT5_OE */ + +/* + * R127 (0x7F) - PLL Software Reset + */ +#define WM8962_SW_RESET_PLL_MASK 0xFFFF /* SW_RESET_PLL - [15:0] */ +#define WM8962_SW_RESET_PLL_SHIFT 0 /* SW_RESET_PLL - [15:0] */ +#define WM8962_SW_RESET_PLL_WIDTH 16 /* SW_RESET_PLL - [15:0] */ + +/* + * R129 (0x81) - PLL2 + */ +#define WM8962_OSC_ENA 0x0080 /* OSC_ENA */ +#define WM8962_OSC_ENA_MASK 0x0080 /* OSC_ENA */ +#define WM8962_OSC_ENA_SHIFT 7 /* OSC_ENA */ +#define WM8962_OSC_ENA_WIDTH 1 /* OSC_ENA */ +#define WM8962_PLL2_ENA 0x0020 /* PLL2_ENA */ +#define WM8962_PLL2_ENA_MASK 0x0020 /* PLL2_ENA */ +#define WM8962_PLL2_ENA_SHIFT 5 /* PLL2_ENA */ +#define WM8962_PLL2_ENA_WIDTH 1 /* PLL2_ENA */ +#define WM8962_PLL3_ENA 0x0010 /* PLL3_ENA */ +#define WM8962_PLL3_ENA_MASK 0x0010 /* PLL3_ENA */ +#define WM8962_PLL3_ENA_SHIFT 4 /* PLL3_ENA */ +#define WM8962_PLL3_ENA_WIDTH 1 /* PLL3_ENA */ + +/* + * R131 (0x83) - PLL 4 + */ +#define WM8962_PLL_CLK_SRC 0x0002 /* PLL_CLK_SRC */ +#define WM8962_PLL_CLK_SRC_MASK 0x0002 /* PLL_CLK_SRC */ +#define WM8962_PLL_CLK_SRC_SHIFT 1 /* PLL_CLK_SRC */ +#define WM8962_PLL_CLK_SRC_WIDTH 1 /* PLL_CLK_SRC */ +#define WM8962_FLL_TO_PLL3 0x0001 /* FLL_TO_PLL3 */ +#define WM8962_FLL_TO_PLL3_MASK 0x0001 /* FLL_TO_PLL3 */ +#define WM8962_FLL_TO_PLL3_SHIFT 0 /* FLL_TO_PLL3 */ +#define WM8962_FLL_TO_PLL3_WIDTH 1 /* FLL_TO_PLL3 */ + +/* + * R136 (0x88) - PLL 9 + */ +#define WM8962_PLL2_FRAC 0x0040 /* PLL2_FRAC */ +#define WM8962_PLL2_FRAC_MASK 0x0040 /* PLL2_FRAC */ +#define WM8962_PLL2_FRAC_SHIFT 6 /* PLL2_FRAC */ +#define WM8962_PLL2_FRAC_WIDTH 1 /* PLL2_FRAC */ +#define WM8962_PLL2_N_MASK 0x001F /* PLL2_N - [4:0] */ +#define WM8962_PLL2_N_SHIFT 0 /* PLL2_N - [4:0] */ +#define WM8962_PLL2_N_WIDTH 5 /* PLL2_N - [4:0] */ + +/* + * R137 (0x89) - PLL 10 + */ +#define WM8962_PLL2_K_MASK 0x00FF /* PLL2_K - [7:0] */ +#define WM8962_PLL2_K_SHIFT 0 /* PLL2_K - [7:0] */ +#define WM8962_PLL2_K_WIDTH 8 /* PLL2_K - [7:0] */ + +/* + * R138 (0x8A) - PLL 11 + */ +#define WM8962_PLL2_K_MASK 0x00FF /* PLL2_K - [7:0] */ +#define WM8962_PLL2_K_SHIFT 0 /* PLL2_K - [7:0] */ +#define WM8962_PLL2_K_WIDTH 8 /* PLL2_K - [7:0] */ + +/* + * R139 (0x8B) - PLL 12 + */ +#define WM8962_PLL2_K_MASK 0x00FF /* PLL2_K - [7:0] */ +#define WM8962_PLL2_K_SHIFT 0 /* PLL2_K - [7:0] */ +#define WM8962_PLL2_K_WIDTH 8 /* PLL2_K - [7:0] */ + +/* + * R140 (0x8C) - PLL 13 + */ +#define WM8962_PLL3_FRAC 0x0040 /* PLL3_FRAC */ +#define WM8962_PLL3_FRAC_MASK 0x0040 /* PLL3_FRAC */ +#define WM8962_PLL3_FRAC_SHIFT 6 /* PLL3_FRAC */ +#define WM8962_PLL3_FRAC_WIDTH 1 /* PLL3_FRAC */ +#define WM8962_PLL3_N_MASK 0x001F /* PLL3_N - [4:0] */ +#define WM8962_PLL3_N_SHIFT 0 /* PLL3_N - [4:0] */ +#define WM8962_PLL3_N_WIDTH 5 /* PLL3_N - [4:0] */ + +/* + * R141 (0x8D) - PLL 14 + */ +#define WM8962_PLL3_K_MASK 0x00FF /* PLL3_K - [7:0] */ +#define WM8962_PLL3_K_SHIFT 0 /* PLL3_K - [7:0] */ +#define WM8962_PLL3_K_WIDTH 8 /* PLL3_K - [7:0] */ + +/* + * R142 (0x8E) - PLL 15 + */ +#define WM8962_PLL3_K_MASK 0x00FF /* PLL3_K - [7:0] */ +#define WM8962_PLL3_K_SHIFT 0 /* PLL3_K - [7:0] */ +#define WM8962_PLL3_K_WIDTH 8 /* PLL3_K - [7:0] */ + +/* + * R143 (0x8F) - PLL 16 + */ +#define WM8962_PLL3_K_MASK 0x00FF /* PLL3_K - [7:0] */ +#define WM8962_PLL3_K_SHIFT 0 /* PLL3_K - [7:0] */ +#define WM8962_PLL3_K_WIDTH 8 /* PLL3_K - [7:0] */ + +/* + * R155 (0x9B) - FLL Control (1) + */ +#define WM8962_FLL_REFCLK_SRC_MASK 0x0060 /* FLL_REFCLK_SRC - [6:5] */ +#define WM8962_FLL_REFCLK_SRC_SHIFT 5 /* FLL_REFCLK_SRC - [6:5] */ +#define WM8962_FLL_REFCLK_SRC_WIDTH 2 /* FLL_REFCLK_SRC - [6:5] */ +#define WM8962_FLL_FRAC 0x0004 /* FLL_FRAC */ +#define WM8962_FLL_FRAC_MASK 0x0004 /* FLL_FRAC */ +#define WM8962_FLL_FRAC_SHIFT 2 /* FLL_FRAC */ +#define WM8962_FLL_FRAC_WIDTH 1 /* FLL_FRAC */ +#define WM8962_FLL_OSC_ENA 0x0002 /* FLL_OSC_ENA */ +#define WM8962_FLL_OSC_ENA_MASK 0x0002 /* FLL_OSC_ENA */ +#define WM8962_FLL_OSC_ENA_SHIFT 1 /* FLL_OSC_ENA */ +#define WM8962_FLL_OSC_ENA_WIDTH 1 /* FLL_OSC_ENA */ +#define WM8962_FLL_ENA 0x0001 /* FLL_ENA */ +#define WM8962_FLL_ENA_MASK 0x0001 /* FLL_ENA */ +#define WM8962_FLL_ENA_SHIFT 0 /* FLL_ENA */ +#define WM8962_FLL_ENA_WIDTH 1 /* FLL_ENA */ + +/* + * R156 (0x9C) - FLL Control (2) + */ +#define WM8962_FLL_OUTDIV_MASK 0x01F8 /* FLL_OUTDIV - [8:3] */ +#define WM8962_FLL_OUTDIV_SHIFT 3 /* FLL_OUTDIV - [8:3] */ +#define WM8962_FLL_OUTDIV_WIDTH 6 /* FLL_OUTDIV - [8:3] */ +#define WM8962_FLL_REFCLK_DIV_MASK 0x0003 /* FLL_REFCLK_DIV - [1:0] */ +#define WM8962_FLL_REFCLK_DIV_SHIFT 0 /* FLL_REFCLK_DIV - [1:0] */ +#define WM8962_FLL_REFCLK_DIV_WIDTH 2 /* FLL_REFCLK_DIV - [1:0] */ + +/* + * R157 (0x9D) - FLL Control (3) + */ +#define WM8962_FLL_FRATIO_MASK 0x0007 /* FLL_FRATIO - [2:0] */ +#define WM8962_FLL_FRATIO_SHIFT 0 /* FLL_FRATIO - [2:0] */ +#define WM8962_FLL_FRATIO_WIDTH 3 /* FLL_FRATIO - [2:0] */ + +/* + * R159 (0x9F) - FLL Control (5) + */ +#define WM8962_FLL_FRC_NCO_VAL_MASK 0x007E /* FLL_FRC_NCO_VAL - [6:1] */ +#define WM8962_FLL_FRC_NCO_VAL_SHIFT 1 /* FLL_FRC_NCO_VAL - [6:1] */ +#define WM8962_FLL_FRC_NCO_VAL_WIDTH 6 /* FLL_FRC_NCO_VAL - [6:1] */ +#define WM8962_FLL_FRC_NCO 0x0001 /* FLL_FRC_NCO */ +#define WM8962_FLL_FRC_NCO_MASK 0x0001 /* FLL_FRC_NCO */ +#define WM8962_FLL_FRC_NCO_SHIFT 0 /* FLL_FRC_NCO */ +#define WM8962_FLL_FRC_NCO_WIDTH 1 /* FLL_FRC_NCO */ + +/* + * R160 (0xA0) - FLL Control (6) + */ +#define WM8962_FLL_THETA_MASK 0xFFFF /* FLL_THETA - [15:0] */ +#define WM8962_FLL_THETA_SHIFT 0 /* FLL_THETA - [15:0] */ +#define WM8962_FLL_THETA_WIDTH 16 /* FLL_THETA - [15:0] */ + +/* + * R161 (0xA1) - FLL Control (7) + */ +#define WM8962_FLL_LAMBDA_MASK 0xFFFF /* FLL_LAMBDA - [15:0] */ +#define WM8962_FLL_LAMBDA_SHIFT 0 /* FLL_LAMBDA - [15:0] */ +#define WM8962_FLL_LAMBDA_WIDTH 16 /* FLL_LAMBDA - [15:0] */ + +/* + * R162 (0xA2) - FLL Control (8) + */ +#define WM8962_FLL_N_MASK 0x03FF /* FLL_N - [9:0] */ +#define WM8962_FLL_N_SHIFT 0 /* FLL_N - [9:0] */ +#define WM8962_FLL_N_WIDTH 10 /* FLL_N - [9:0] */ + +/* + * R252 (0xFC) - General test 1 + */ +#define WM8962_REG_SYNC 0x0004 /* REG_SYNC */ +#define WM8962_REG_SYNC_MASK 0x0004 /* REG_SYNC */ +#define WM8962_REG_SYNC_SHIFT 2 /* REG_SYNC */ +#define WM8962_REG_SYNC_WIDTH 1 /* REG_SYNC */ +#define WM8962_AUTO_INC 0x0001 /* AUTO_INC */ +#define WM8962_AUTO_INC_MASK 0x0001 /* AUTO_INC */ +#define WM8962_AUTO_INC_SHIFT 0 /* AUTO_INC */ +#define WM8962_AUTO_INC_WIDTH 1 /* AUTO_INC */ + +/* + * R256 (0x100) - DF1 + */ +#define WM8962_DRC_DF1_ENA 0x0008 /* DRC_DF1_ENA */ +#define WM8962_DRC_DF1_ENA_MASK 0x0008 /* DRC_DF1_ENA */ +#define WM8962_DRC_DF1_ENA_SHIFT 3 /* DRC_DF1_ENA */ +#define WM8962_DRC_DF1_ENA_WIDTH 1 /* DRC_DF1_ENA */ +#define WM8962_DF1_SHARED_COEFF 0x0004 /* DF1_SHARED_COEFF */ +#define WM8962_DF1_SHARED_COEFF_MASK 0x0004 /* DF1_SHARED_COEFF */ +#define WM8962_DF1_SHARED_COEFF_SHIFT 2 /* DF1_SHARED_COEFF */ +#define WM8962_DF1_SHARED_COEFF_WIDTH 1 /* DF1_SHARED_COEFF */ +#define WM8962_DF1_SHARED_COEFF_SEL 0x0002 /* DF1_SHARED_COEFF_SEL */ +#define WM8962_DF1_SHARED_COEFF_SEL_MASK 0x0002 /* DF1_SHARED_COEFF_SEL */ +#define WM8962_DF1_SHARED_COEFF_SEL_SHIFT 1 /* DF1_SHARED_COEFF_SEL */ +#define WM8962_DF1_SHARED_COEFF_SEL_WIDTH 1 /* DF1_SHARED_COEFF_SEL */ +#define WM8962_DF1_ENA 0x0001 /* DF1_ENA */ +#define WM8962_DF1_ENA_MASK 0x0001 /* DF1_ENA */ +#define WM8962_DF1_ENA_SHIFT 0 /* DF1_ENA */ +#define WM8962_DF1_ENA_WIDTH 1 /* DF1_ENA */ + +/* + * R257 (0x101) - DF2 + */ +#define WM8962_DF1_COEFF_L0_MASK 0xFFFF /* DF1_COEFF_L0 - [15:0] */ +#define WM8962_DF1_COEFF_L0_SHIFT 0 /* DF1_COEFF_L0 - [15:0] */ +#define WM8962_DF1_COEFF_L0_WIDTH 16 /* DF1_COEFF_L0 - [15:0] */ + +/* + * R258 (0x102) - DF3 + */ +#define WM8962_DF1_COEFF_L1_MASK 0xFFFF /* DF1_COEFF_L1 - [15:0] */ +#define WM8962_DF1_COEFF_L1_SHIFT 0 /* DF1_COEFF_L1 - [15:0] */ +#define WM8962_DF1_COEFF_L1_WIDTH 16 /* DF1_COEFF_L1 - [15:0] */ + +/* + * R259 (0x103) - DF4 + */ +#define WM8962_DF1_COEFF_L2_MASK 0xFFFF /* DF1_COEFF_L2 - [15:0] */ +#define WM8962_DF1_COEFF_L2_SHIFT 0 /* DF1_COEFF_L2 - [15:0] */ +#define WM8962_DF1_COEFF_L2_WIDTH 16 /* DF1_COEFF_L2 - [15:0] */ + +/* + * R260 (0x104) - DF5 + */ +#define WM8962_DF1_COEFF_R0_MASK 0xFFFF /* DF1_COEFF_R0 - [15:0] */ +#define WM8962_DF1_COEFF_R0_SHIFT 0 /* DF1_COEFF_R0 - [15:0] */ +#define WM8962_DF1_COEFF_R0_WIDTH 16 /* DF1_COEFF_R0 - [15:0] */ + +/* + * R261 (0x105) - DF6 + */ +#define WM8962_DF1_COEFF_R1_MASK 0xFFFF /* DF1_COEFF_R1 - [15:0] */ +#define WM8962_DF1_COEFF_R1_SHIFT 0 /* DF1_COEFF_R1 - [15:0] */ +#define WM8962_DF1_COEFF_R1_WIDTH 16 /* DF1_COEFF_R1 - [15:0] */ + +/* + * R262 (0x106) - DF7 + */ +#define WM8962_DF1_COEFF_R2_MASK 0xFFFF /* DF1_COEFF_R2 - [15:0] */ +#define WM8962_DF1_COEFF_R2_SHIFT 0 /* DF1_COEFF_R2 - [15:0] */ +#define WM8962_DF1_COEFF_R2_WIDTH 16 /* DF1_COEFF_R2 - [15:0] */ + +/* + * R264 (0x108) - LHPF1 + */ +#define WM8962_LHPF_MODE 0x0002 /* LHPF_MODE */ +#define WM8962_LHPF_MODE_MASK 0x0002 /* LHPF_MODE */ +#define WM8962_LHPF_MODE_SHIFT 1 /* LHPF_MODE */ +#define WM8962_LHPF_MODE_WIDTH 1 /* LHPF_MODE */ +#define WM8962_LHPF_ENA 0x0001 /* LHPF_ENA */ +#define WM8962_LHPF_ENA_MASK 0x0001 /* LHPF_ENA */ +#define WM8962_LHPF_ENA_SHIFT 0 /* LHPF_ENA */ +#define WM8962_LHPF_ENA_WIDTH 1 /* LHPF_ENA */ + +/* + * R265 (0x109) - LHPF2 + */ +#define WM8962_LHPF_COEFF_MASK 0xFFFF /* LHPF_COEFF - [15:0] */ +#define WM8962_LHPF_COEFF_SHIFT 0 /* LHPF_COEFF - [15:0] */ +#define WM8962_LHPF_COEFF_WIDTH 16 /* LHPF_COEFF - [15:0] */ + +/* + * R268 (0x10C) - THREED1 + */ +#define WM8962_ADC_MONOMIX 0x0040 /* ADC_MONOMIX */ +#define WM8962_ADC_MONOMIX_MASK 0x0040 /* ADC_MONOMIX */ +#define WM8962_ADC_MONOMIX_SHIFT 6 /* ADC_MONOMIX */ +#define WM8962_ADC_MONOMIX_WIDTH 1 /* ADC_MONOMIX */ +#define WM8962_THREED_SIGN_L 0x0020 /* THREED_SIGN_L */ +#define WM8962_THREED_SIGN_L_MASK 0x0020 /* THREED_SIGN_L */ +#define WM8962_THREED_SIGN_L_SHIFT 5 /* THREED_SIGN_L */ +#define WM8962_THREED_SIGN_L_WIDTH 1 /* THREED_SIGN_L */ +#define WM8962_THREED_SIGN_R 0x0010 /* THREED_SIGN_R */ +#define WM8962_THREED_SIGN_R_MASK 0x0010 /* THREED_SIGN_R */ +#define WM8962_THREED_SIGN_R_SHIFT 4 /* THREED_SIGN_R */ +#define WM8962_THREED_SIGN_R_WIDTH 1 /* THREED_SIGN_R */ +#define WM8962_THREED_LHPF_MODE 0x0004 /* THREED_LHPF_MODE */ +#define WM8962_THREED_LHPF_MODE_MASK 0x0004 /* THREED_LHPF_MODE */ +#define WM8962_THREED_LHPF_MODE_SHIFT 2 /* THREED_LHPF_MODE */ +#define WM8962_THREED_LHPF_MODE_WIDTH 1 /* THREED_LHPF_MODE */ +#define WM8962_THREED_LHPF_ENA 0x0002 /* THREED_LHPF_ENA */ +#define WM8962_THREED_LHPF_ENA_MASK 0x0002 /* THREED_LHPF_ENA */ +#define WM8962_THREED_LHPF_ENA_SHIFT 1 /* THREED_LHPF_ENA */ +#define WM8962_THREED_LHPF_ENA_WIDTH 1 /* THREED_LHPF_ENA */ +#define WM8962_THREED_ENA 0x0001 /* THREED_ENA */ +#define WM8962_THREED_ENA_MASK 0x0001 /* THREED_ENA */ +#define WM8962_THREED_ENA_SHIFT 0 /* THREED_ENA */ +#define WM8962_THREED_ENA_WIDTH 1 /* THREED_ENA */ + +/* + * R269 (0x10D) - THREED2 + */ +#define WM8962_THREED_FGAINL_MASK 0xF800 /* THREED_FGAINL - [15:11] */ +#define WM8962_THREED_FGAINL_SHIFT 11 /* THREED_FGAINL - [15:11] */ +#define WM8962_THREED_FGAINL_WIDTH 5 /* THREED_FGAINL - [15:11] */ +#define WM8962_THREED_CGAINL_MASK 0x07C0 /* THREED_CGAINL - [10:6] */ +#define WM8962_THREED_CGAINL_SHIFT 6 /* THREED_CGAINL - [10:6] */ +#define WM8962_THREED_CGAINL_WIDTH 5 /* THREED_CGAINL - [10:6] */ +#define WM8962_THREED_DELAYL_MASK 0x003C /* THREED_DELAYL - [5:2] */ +#define WM8962_THREED_DELAYL_SHIFT 2 /* THREED_DELAYL - [5:2] */ +#define WM8962_THREED_DELAYL_WIDTH 4 /* THREED_DELAYL - [5:2] */ + +/* + * R270 (0x10E) - THREED3 + */ +#define WM8962_THREED_LHPF_COEFF_MASK 0xFFFF /* THREED_LHPF_COEFF - [15:0] */ +#define WM8962_THREED_LHPF_COEFF_SHIFT 0 /* THREED_LHPF_COEFF - [15:0] */ +#define WM8962_THREED_LHPF_COEFF_WIDTH 16 /* THREED_LHPF_COEFF - [15:0] */ + +/* + * R271 (0x10F) - THREED4 + */ +#define WM8962_THREED_FGAINR_MASK 0xF800 /* THREED_FGAINR - [15:11] */ +#define WM8962_THREED_FGAINR_SHIFT 11 /* THREED_FGAINR - [15:11] */ +#define WM8962_THREED_FGAINR_WIDTH 5 /* THREED_FGAINR - [15:11] */ +#define WM8962_THREED_CGAINR_MASK 0x07C0 /* THREED_CGAINR - [10:6] */ +#define WM8962_THREED_CGAINR_SHIFT 6 /* THREED_CGAINR - [10:6] */ +#define WM8962_THREED_CGAINR_WIDTH 5 /* THREED_CGAINR - [10:6] */ +#define WM8962_THREED_DELAYR_MASK 0x003C /* THREED_DELAYR - [5:2] */ +#define WM8962_THREED_DELAYR_SHIFT 2 /* THREED_DELAYR - [5:2] */ +#define WM8962_THREED_DELAYR_WIDTH 4 /* THREED_DELAYR - [5:2] */ + +/* + * R276 (0x114) - DRC 1 + */ +#define WM8962_DRC_SIG_DET_RMS_MASK 0x7C00 /* DRC_SIG_DET_RMS - [14:10] */ +#define WM8962_DRC_SIG_DET_RMS_SHIFT 10 /* DRC_SIG_DET_RMS - [14:10] */ +#define WM8962_DRC_SIG_DET_RMS_WIDTH 5 /* DRC_SIG_DET_RMS - [14:10] */ +#define WM8962_DRC_SIG_DET_PK_MASK 0x0300 /* DRC_SIG_DET_PK - [9:8] */ +#define WM8962_DRC_SIG_DET_PK_SHIFT 8 /* DRC_SIG_DET_PK - [9:8] */ +#define WM8962_DRC_SIG_DET_PK_WIDTH 2 /* DRC_SIG_DET_PK - [9:8] */ +#define WM8962_DRC_NG_ENA 0x0080 /* DRC_NG_ENA */ +#define WM8962_DRC_NG_ENA_MASK 0x0080 /* DRC_NG_ENA */ +#define WM8962_DRC_NG_ENA_SHIFT 7 /* DRC_NG_ENA */ +#define WM8962_DRC_NG_ENA_WIDTH 1 /* DRC_NG_ENA */ +#define WM8962_DRC_SIG_DET_MODE 0x0040 /* DRC_SIG_DET_MODE */ +#define WM8962_DRC_SIG_DET_MODE_MASK 0x0040 /* DRC_SIG_DET_MODE */ +#define WM8962_DRC_SIG_DET_MODE_SHIFT 6 /* DRC_SIG_DET_MODE */ +#define WM8962_DRC_SIG_DET_MODE_WIDTH 1 /* DRC_SIG_DET_MODE */ +#define WM8962_DRC_SIG_DET 0x0020 /* DRC_SIG_DET */ +#define WM8962_DRC_SIG_DET_MASK 0x0020 /* DRC_SIG_DET */ +#define WM8962_DRC_SIG_DET_SHIFT 5 /* DRC_SIG_DET */ +#define WM8962_DRC_SIG_DET_WIDTH 1 /* DRC_SIG_DET */ +#define WM8962_DRC_KNEE2_OP_ENA 0x0010 /* DRC_KNEE2_OP_ENA */ +#define WM8962_DRC_KNEE2_OP_ENA_MASK 0x0010 /* DRC_KNEE2_OP_ENA */ +#define WM8962_DRC_KNEE2_OP_ENA_SHIFT 4 /* DRC_KNEE2_OP_ENA */ +#define WM8962_DRC_KNEE2_OP_ENA_WIDTH 1 /* DRC_KNEE2_OP_ENA */ +#define WM8962_DRC_QR 0x0008 /* DRC_QR */ +#define WM8962_DRC_QR_MASK 0x0008 /* DRC_QR */ +#define WM8962_DRC_QR_SHIFT 3 /* DRC_QR */ +#define WM8962_DRC_QR_WIDTH 1 /* DRC_QR */ +#define WM8962_DRC_ANTICLIP 0x0004 /* DRC_ANTICLIP */ +#define WM8962_DRC_ANTICLIP_MASK 0x0004 /* DRC_ANTICLIP */ +#define WM8962_DRC_ANTICLIP_SHIFT 2 /* DRC_ANTICLIP */ +#define WM8962_DRC_ANTICLIP_WIDTH 1 /* DRC_ANTICLIP */ +#define WM8962_DRC_MODE 0x0002 /* DRC_MODE */ +#define WM8962_DRC_MODE_MASK 0x0002 /* DRC_MODE */ +#define WM8962_DRC_MODE_SHIFT 1 /* DRC_MODE */ +#define WM8962_DRC_MODE_WIDTH 1 /* DRC_MODE */ +#define WM8962_DRC_ENA 0x0001 /* DRC_ENA */ +#define WM8962_DRC_ENA_MASK 0x0001 /* DRC_ENA */ +#define WM8962_DRC_ENA_SHIFT 0 /* DRC_ENA */ +#define WM8962_DRC_ENA_WIDTH 1 /* DRC_ENA */ + +/* + * R277 (0x115) - DRC 2 + */ +#define WM8962_DRC_ATK_MASK 0x1E00 /* DRC_ATK - [12:9] */ +#define WM8962_DRC_ATK_SHIFT 9 /* DRC_ATK - [12:9] */ +#define WM8962_DRC_ATK_WIDTH 4 /* DRC_ATK - [12:9] */ +#define WM8962_DRC_DCY_MASK 0x01E0 /* DRC_DCY - [8:5] */ +#define WM8962_DRC_DCY_SHIFT 5 /* DRC_DCY - [8:5] */ +#define WM8962_DRC_DCY_WIDTH 4 /* DRC_DCY - [8:5] */ +#define WM8962_DRC_MINGAIN_MASK 0x001C /* DRC_MINGAIN - [4:2] */ +#define WM8962_DRC_MINGAIN_SHIFT 2 /* DRC_MINGAIN - [4:2] */ +#define WM8962_DRC_MINGAIN_WIDTH 3 /* DRC_MINGAIN - [4:2] */ +#define WM8962_DRC_MAXGAIN_MASK 0x0003 /* DRC_MAXGAIN - [1:0] */ +#define WM8962_DRC_MAXGAIN_SHIFT 0 /* DRC_MAXGAIN - [1:0] */ +#define WM8962_DRC_MAXGAIN_WIDTH 2 /* DRC_MAXGAIN - [1:0] */ + +/* + * R278 (0x116) - DRC 3 + */ +#define WM8962_DRC_NG_MINGAIN_MASK 0xF000 /* DRC_NG_MINGAIN - [15:12] */ +#define WM8962_DRC_NG_MINGAIN_SHIFT 12 /* DRC_NG_MINGAIN - [15:12] */ +#define WM8962_DRC_NG_MINGAIN_WIDTH 4 /* DRC_NG_MINGAIN - [15:12] */ +#define WM8962_DRC_QR_THR_MASK 0x0C00 /* DRC_QR_THR - [11:10] */ +#define WM8962_DRC_QR_THR_SHIFT 10 /* DRC_QR_THR - [11:10] */ +#define WM8962_DRC_QR_THR_WIDTH 2 /* DRC_QR_THR - [11:10] */ +#define WM8962_DRC_QR_DCY_MASK 0x0300 /* DRC_QR_DCY - [9:8] */ +#define WM8962_DRC_QR_DCY_SHIFT 8 /* DRC_QR_DCY - [9:8] */ +#define WM8962_DRC_QR_DCY_WIDTH 2 /* DRC_QR_DCY - [9:8] */ +#define WM8962_DRC_NG_EXP_MASK 0x00C0 /* DRC_NG_EXP - [7:6] */ +#define WM8962_DRC_NG_EXP_SHIFT 6 /* DRC_NG_EXP - [7:6] */ +#define WM8962_DRC_NG_EXP_WIDTH 2 /* DRC_NG_EXP - [7:6] */ +#define WM8962_DRC_HI_COMP_MASK 0x0038 /* DRC_HI_COMP - [5:3] */ +#define WM8962_DRC_HI_COMP_SHIFT 3 /* DRC_HI_COMP - [5:3] */ +#define WM8962_DRC_HI_COMP_WIDTH 3 /* DRC_HI_COMP - [5:3] */ +#define WM8962_DRC_LO_COMP_MASK 0x0007 /* DRC_LO_COMP - [2:0] */ +#define WM8962_DRC_LO_COMP_SHIFT 0 /* DRC_LO_COMP - [2:0] */ +#define WM8962_DRC_LO_COMP_WIDTH 3 /* DRC_LO_COMP - [2:0] */ + +/* + * R279 (0x117) - DRC 4 + */ +#define WM8962_DRC_KNEE_IP_MASK 0x07E0 /* DRC_KNEE_IP - [10:5] */ +#define WM8962_DRC_KNEE_IP_SHIFT 5 /* DRC_KNEE_IP - [10:5] */ +#define WM8962_DRC_KNEE_IP_WIDTH 6 /* DRC_KNEE_IP - [10:5] */ +#define WM8962_DRC_KNEE_OP_MASK 0x001F /* DRC_KNEE_OP - [4:0] */ +#define WM8962_DRC_KNEE_OP_SHIFT 0 /* DRC_KNEE_OP - [4:0] */ +#define WM8962_DRC_KNEE_OP_WIDTH 5 /* DRC_KNEE_OP - [4:0] */ + +/* + * R280 (0x118) - DRC 5 + */ +#define WM8962_DRC_KNEE2_IP_MASK 0x03E0 /* DRC_KNEE2_IP - [9:5] */ +#define WM8962_DRC_KNEE2_IP_SHIFT 5 /* DRC_KNEE2_IP - [9:5] */ +#define WM8962_DRC_KNEE2_IP_WIDTH 5 /* DRC_KNEE2_IP - [9:5] */ +#define WM8962_DRC_KNEE2_OP_MASK 0x001F /* DRC_KNEE2_OP - [4:0] */ +#define WM8962_DRC_KNEE2_OP_SHIFT 0 /* DRC_KNEE2_OP - [4:0] */ +#define WM8962_DRC_KNEE2_OP_WIDTH 5 /* DRC_KNEE2_OP - [4:0] */ + +/* + * R285 (0x11D) - Tloopback + */ +#define WM8962_TLB_ENA 0x0002 /* TLB_ENA */ +#define WM8962_TLB_ENA_MASK 0x0002 /* TLB_ENA */ +#define WM8962_TLB_ENA_SHIFT 1 /* TLB_ENA */ +#define WM8962_TLB_ENA_WIDTH 1 /* TLB_ENA */ +#define WM8962_TLB_MODE 0x0001 /* TLB_MODE */ +#define WM8962_TLB_MODE_MASK 0x0001 /* TLB_MODE */ +#define WM8962_TLB_MODE_SHIFT 0 /* TLB_MODE */ +#define WM8962_TLB_MODE_WIDTH 1 /* TLB_MODE */ + +/* + * R335 (0x14F) - EQ1 + */ +#define WM8962_EQ_SHARED_COEFF 0x0004 /* EQ_SHARED_COEFF */ +#define WM8962_EQ_SHARED_COEFF_MASK 0x0004 /* EQ_SHARED_COEFF */ +#define WM8962_EQ_SHARED_COEFF_SHIFT 2 /* EQ_SHARED_COEFF */ +#define WM8962_EQ_SHARED_COEFF_WIDTH 1 /* EQ_SHARED_COEFF */ +#define WM8962_EQ_SHARED_COEFF_SEL 0x0002 /* EQ_SHARED_COEFF_SEL */ +#define WM8962_EQ_SHARED_COEFF_SEL_MASK 0x0002 /* EQ_SHARED_COEFF_SEL */ +#define WM8962_EQ_SHARED_COEFF_SEL_SHIFT 1 /* EQ_SHARED_COEFF_SEL */ +#define WM8962_EQ_SHARED_COEFF_SEL_WIDTH 1 /* EQ_SHARED_COEFF_SEL */ +#define WM8962_EQ_ENA 0x0001 /* EQ_ENA */ +#define WM8962_EQ_ENA_MASK 0x0001 /* EQ_ENA */ +#define WM8962_EQ_ENA_SHIFT 0 /* EQ_ENA */ +#define WM8962_EQ_ENA_WIDTH 1 /* EQ_ENA */ + +/* + * R336 (0x150) - EQ2 + */ +#define WM8962_EQL_B1_GAIN_MASK 0xF800 /* EQL_B1_GAIN - [15:11] */ +#define WM8962_EQL_B1_GAIN_SHIFT 11 /* EQL_B1_GAIN - [15:11] */ +#define WM8962_EQL_B1_GAIN_WIDTH 5 /* EQL_B1_GAIN - [15:11] */ +#define WM8962_EQL_B2_GAIN_MASK 0x07C0 /* EQL_B2_GAIN - [10:6] */ +#define WM8962_EQL_B2_GAIN_SHIFT 6 /* EQL_B2_GAIN - [10:6] */ +#define WM8962_EQL_B2_GAIN_WIDTH 5 /* EQL_B2_GAIN - [10:6] */ +#define WM8962_EQL_B3_GAIN_MASK 0x003E /* EQL_B3_GAIN - [5:1] */ +#define WM8962_EQL_B3_GAIN_SHIFT 1 /* EQL_B3_GAIN - [5:1] */ +#define WM8962_EQL_B3_GAIN_WIDTH 5 /* EQL_B3_GAIN - [5:1] */ + +/* + * R337 (0x151) - EQ3 + */ +#define WM8962_EQL_B4_GAIN_MASK 0xF800 /* EQL_B4_GAIN - [15:11] */ +#define WM8962_EQL_B4_GAIN_SHIFT 11 /* EQL_B4_GAIN - [15:11] */ +#define WM8962_EQL_B4_GAIN_WIDTH 5 /* EQL_B4_GAIN - [15:11] */ +#define WM8962_EQL_B5_GAIN_MASK 0x07C0 /* EQL_B5_GAIN - [10:6] */ +#define WM8962_EQL_B5_GAIN_SHIFT 6 /* EQL_B5_GAIN - [10:6] */ +#define WM8962_EQL_B5_GAIN_WIDTH 5 /* EQL_B5_GAIN - [10:6] */ + +/* + * R338 (0x152) - EQ4 + */ +#define WM8962_EQL_B1_A_MASK 0xFFFF /* EQL_B1_A - [15:0] */ +#define WM8962_EQL_B1_A_SHIFT 0 /* EQL_B1_A - [15:0] */ +#define WM8962_EQL_B1_A_WIDTH 16 /* EQL_B1_A - [15:0] */ + +/* + * R339 (0x153) - EQ5 + */ +#define WM8962_EQL_B1_B_MASK 0xFFFF /* EQL_B1_B - [15:0] */ +#define WM8962_EQL_B1_B_SHIFT 0 /* EQL_B1_B - [15:0] */ +#define WM8962_EQL_B1_B_WIDTH 16 /* EQL_B1_B - [15:0] */ + +/* + * R340 (0x154) - EQ6 + */ +#define WM8962_EQL_B1_PG_MASK 0xFFFF /* EQL_B1_PG - [15:0] */ +#define WM8962_EQL_B1_PG_SHIFT 0 /* EQL_B1_PG - [15:0] */ +#define WM8962_EQL_B1_PG_WIDTH 16 /* EQL_B1_PG - [15:0] */ + +/* + * R341 (0x155) - EQ7 + */ +#define WM8962_EQL_B2_A_MASK 0xFFFF /* EQL_B2_A - [15:0] */ +#define WM8962_EQL_B2_A_SHIFT 0 /* EQL_B2_A - [15:0] */ +#define WM8962_EQL_B2_A_WIDTH 16 /* EQL_B2_A - [15:0] */ + +/* + * R342 (0x156) - EQ8 + */ +#define WM8962_EQL_B2_B_MASK 0xFFFF /* EQL_B2_B - [15:0] */ +#define WM8962_EQL_B2_B_SHIFT 0 /* EQL_B2_B - [15:0] */ +#define WM8962_EQL_B2_B_WIDTH 16 /* EQL_B2_B - [15:0] */ + +/* + * R343 (0x157) - EQ9 + */ +#define WM8962_EQL_B2_C_MASK 0xFFFF /* EQL_B2_C - [15:0] */ +#define WM8962_EQL_B2_C_SHIFT 0 /* EQL_B2_C - [15:0] */ +#define WM8962_EQL_B2_C_WIDTH 16 /* EQL_B2_C - [15:0] */ + +/* + * R344 (0x158) - EQ10 + */ +#define WM8962_EQL_B2_PG_MASK 0xFFFF /* EQL_B2_PG - [15:0] */ +#define WM8962_EQL_B2_PG_SHIFT 0 /* EQL_B2_PG - [15:0] */ +#define WM8962_EQL_B2_PG_WIDTH 16 /* EQL_B2_PG - [15:0] */ + +/* + * R345 (0x159) - EQ11 + */ +#define WM8962_EQL_B3_A_MASK 0xFFFF /* EQL_B3_A - [15:0] */ +#define WM8962_EQL_B3_A_SHIFT 0 /* EQL_B3_A - [15:0] */ +#define WM8962_EQL_B3_A_WIDTH 16 /* EQL_B3_A - [15:0] */ + +/* + * R346 (0x15A) - EQ12 + */ +#define WM8962_EQL_B3_B_MASK 0xFFFF /* EQL_B3_B - [15:0] */ +#define WM8962_EQL_B3_B_SHIFT 0 /* EQL_B3_B - [15:0] */ +#define WM8962_EQL_B3_B_WIDTH 16 /* EQL_B3_B - [15:0] */ + +/* + * R347 (0x15B) - EQ13 + */ +#define WM8962_EQL_B3_C_MASK 0xFFFF /* EQL_B3_C - [15:0] */ +#define WM8962_EQL_B3_C_SHIFT 0 /* EQL_B3_C - [15:0] */ +#define WM8962_EQL_B3_C_WIDTH 16 /* EQL_B3_C - [15:0] */ + +/* + * R348 (0x15C) - EQ14 + */ +#define WM8962_EQL_B3_PG_MASK 0xFFFF /* EQL_B3_PG - [15:0] */ +#define WM8962_EQL_B3_PG_SHIFT 0 /* EQL_B3_PG - [15:0] */ +#define WM8962_EQL_B3_PG_WIDTH 16 /* EQL_B3_PG - [15:0] */ + +/* + * R349 (0x15D) - EQ15 + */ +#define WM8962_EQL_B4_A_MASK 0xFFFF /* EQL_B4_A - [15:0] */ +#define WM8962_EQL_B4_A_SHIFT 0 /* EQL_B4_A - [15:0] */ +#define WM8962_EQL_B4_A_WIDTH 16 /* EQL_B4_A - [15:0] */ + +/* + * R350 (0x15E) - EQ16 + */ +#define WM8962_EQL_B4_B_MASK 0xFFFF /* EQL_B4_B - [15:0] */ +#define WM8962_EQL_B4_B_SHIFT 0 /* EQL_B4_B - [15:0] */ +#define WM8962_EQL_B4_B_WIDTH 16 /* EQL_B4_B - [15:0] */ + +/* + * R351 (0x15F) - EQ17 + */ +#define WM8962_EQL_B4_C_MASK 0xFFFF /* EQL_B4_C - [15:0] */ +#define WM8962_EQL_B4_C_SHIFT 0 /* EQL_B4_C - [15:0] */ +#define WM8962_EQL_B4_C_WIDTH 16 /* EQL_B4_C - [15:0] */ + +/* + * R352 (0x160) - EQ18 + */ +#define WM8962_EQL_B4_PG_MASK 0xFFFF /* EQL_B4_PG - [15:0] */ +#define WM8962_EQL_B4_PG_SHIFT 0 /* EQL_B4_PG - [15:0] */ +#define WM8962_EQL_B4_PG_WIDTH 16 /* EQL_B4_PG - [15:0] */ + +/* + * R353 (0x161) - EQ19 + */ +#define WM8962_EQL_B5_A_MASK 0xFFFF /* EQL_B5_A - [15:0] */ +#define WM8962_EQL_B5_A_SHIFT 0 /* EQL_B5_A - [15:0] */ +#define WM8962_EQL_B5_A_WIDTH 16 /* EQL_B5_A - [15:0] */ + +/* + * R354 (0x162) - EQ20 + */ +#define WM8962_EQL_B5_B_MASK 0xFFFF /* EQL_B5_B - [15:0] */ +#define WM8962_EQL_B5_B_SHIFT 0 /* EQL_B5_B - [15:0] */ +#define WM8962_EQL_B5_B_WIDTH 16 /* EQL_B5_B - [15:0] */ + +/* + * R355 (0x163) - EQ21 + */ +#define WM8962_EQL_B5_PG_MASK 0xFFFF /* EQL_B5_PG - [15:0] */ +#define WM8962_EQL_B5_PG_SHIFT 0 /* EQL_B5_PG - [15:0] */ +#define WM8962_EQL_B5_PG_WIDTH 16 /* EQL_B5_PG - [15:0] */ + +/* + * R356 (0x164) - EQ22 + */ +#define WM8962_EQR_B1_GAIN_MASK 0xF800 /* EQR_B1_GAIN - [15:11] */ +#define WM8962_EQR_B1_GAIN_SHIFT 11 /* EQR_B1_GAIN - [15:11] */ +#define WM8962_EQR_B1_GAIN_WIDTH 5 /* EQR_B1_GAIN - [15:11] */ +#define WM8962_EQR_B2_GAIN_MASK 0x07C0 /* EQR_B2_GAIN - [10:6] */ +#define WM8962_EQR_B2_GAIN_SHIFT 6 /* EQR_B2_GAIN - [10:6] */ +#define WM8962_EQR_B2_GAIN_WIDTH 5 /* EQR_B2_GAIN - [10:6] */ +#define WM8962_EQR_B3_GAIN_MASK 0x003E /* EQR_B3_GAIN - [5:1] */ +#define WM8962_EQR_B3_GAIN_SHIFT 1 /* EQR_B3_GAIN - [5:1] */ +#define WM8962_EQR_B3_GAIN_WIDTH 5 /* EQR_B3_GAIN - [5:1] */ + +/* + * R357 (0x165) - EQ23 + */ +#define WM8962_EQR_B4_GAIN_MASK 0xF800 /* EQR_B4_GAIN - [15:11] */ +#define WM8962_EQR_B4_GAIN_SHIFT 11 /* EQR_B4_GAIN - [15:11] */ +#define WM8962_EQR_B4_GAIN_WIDTH 5 /* EQR_B4_GAIN - [15:11] */ +#define WM8962_EQR_B5_GAIN_MASK 0x07C0 /* EQR_B5_GAIN - [10:6] */ +#define WM8962_EQR_B5_GAIN_SHIFT 6 /* EQR_B5_GAIN - [10:6] */ +#define WM8962_EQR_B5_GAIN_WIDTH 5 /* EQR_B5_GAIN - [10:6] */ + +/* + * R358 (0x166) - EQ24 + */ +#define WM8962_EQR_B1_A_MASK 0xFFFF /* EQR_B1_A - [15:0] */ +#define WM8962_EQR_B1_A_SHIFT 0 /* EQR_B1_A - [15:0] */ +#define WM8962_EQR_B1_A_WIDTH 16 /* EQR_B1_A - [15:0] */ + +/* + * R359 (0x167) - EQ25 + */ +#define WM8962_EQR_B1_B_MASK 0xFFFF /* EQR_B1_B - [15:0] */ +#define WM8962_EQR_B1_B_SHIFT 0 /* EQR_B1_B - [15:0] */ +#define WM8962_EQR_B1_B_WIDTH 16 /* EQR_B1_B - [15:0] */ + +/* + * R360 (0x168) - EQ26 + */ +#define WM8962_EQR_B1_PG_MASK 0xFFFF /* EQR_B1_PG - [15:0] */ +#define WM8962_EQR_B1_PG_SHIFT 0 /* EQR_B1_PG - [15:0] */ +#define WM8962_EQR_B1_PG_WIDTH 16 /* EQR_B1_PG - [15:0] */ + +/* + * R361 (0x169) - EQ27 + */ +#define WM8962_EQR_B2_A_MASK 0xFFFF /* EQR_B2_A - [15:0] */ +#define WM8962_EQR_B2_A_SHIFT 0 /* EQR_B2_A - [15:0] */ +#define WM8962_EQR_B2_A_WIDTH 16 /* EQR_B2_A - [15:0] */ + +/* + * R362 (0x16A) - EQ28 + */ +#define WM8962_EQR_B2_B_MASK 0xFFFF /* EQR_B2_B - [15:0] */ +#define WM8962_EQR_B2_B_SHIFT 0 /* EQR_B2_B - [15:0] */ +#define WM8962_EQR_B2_B_WIDTH 16 /* EQR_B2_B - [15:0] */ + +/* + * R363 (0x16B) - EQ29 + */ +#define WM8962_EQR_B2_C_MASK 0xFFFF /* EQR_B2_C - [15:0] */ +#define WM8962_EQR_B2_C_SHIFT 0 /* EQR_B2_C - [15:0] */ +#define WM8962_EQR_B2_C_WIDTH 16 /* EQR_B2_C - [15:0] */ + +/* + * R364 (0x16C) - EQ30 + */ +#define WM8962_EQR_B2_PG_MASK 0xFFFF /* EQR_B2_PG - [15:0] */ +#define WM8962_EQR_B2_PG_SHIFT 0 /* EQR_B2_PG - [15:0] */ +#define WM8962_EQR_B2_PG_WIDTH 16 /* EQR_B2_PG - [15:0] */ + +/* + * R365 (0x16D) - EQ31 + */ +#define WM8962_EQR_B3_A_MASK 0xFFFF /* EQR_B3_A - [15:0] */ +#define WM8962_EQR_B3_A_SHIFT 0 /* EQR_B3_A - [15:0] */ +#define WM8962_EQR_B3_A_WIDTH 16 /* EQR_B3_A - [15:0] */ + +/* + * R366 (0x16E) - EQ32 + */ +#define WM8962_EQR_B3_B_MASK 0xFFFF /* EQR_B3_B - [15:0] */ +#define WM8962_EQR_B3_B_SHIFT 0 /* EQR_B3_B - [15:0] */ +#define WM8962_EQR_B3_B_WIDTH 16 /* EQR_B3_B - [15:0] */ + +/* + * R367 (0x16F) - EQ33 + */ +#define WM8962_EQR_B3_C_MASK 0xFFFF /* EQR_B3_C - [15:0] */ +#define WM8962_EQR_B3_C_SHIFT 0 /* EQR_B3_C - [15:0] */ +#define WM8962_EQR_B3_C_WIDTH 16 /* EQR_B3_C - [15:0] */ + +/* + * R368 (0x170) - EQ34 + */ +#define WM8962_EQR_B3_PG_MASK 0xFFFF /* EQR_B3_PG - [15:0] */ +#define WM8962_EQR_B3_PG_SHIFT 0 /* EQR_B3_PG - [15:0] */ +#define WM8962_EQR_B3_PG_WIDTH 16 /* EQR_B3_PG - [15:0] */ + +/* + * R369 (0x171) - EQ35 + */ +#define WM8962_EQR_B4_A_MASK 0xFFFF /* EQR_B4_A - [15:0] */ +#define WM8962_EQR_B4_A_SHIFT 0 /* EQR_B4_A - [15:0] */ +#define WM8962_EQR_B4_A_WIDTH 16 /* EQR_B4_A - [15:0] */ + +/* + * R370 (0x172) - EQ36 + */ +#define WM8962_EQR_B4_B_MASK 0xFFFF /* EQR_B4_B - [15:0] */ +#define WM8962_EQR_B4_B_SHIFT 0 /* EQR_B4_B - [15:0] */ +#define WM8962_EQR_B4_B_WIDTH 16 /* EQR_B4_B - [15:0] */ + +/* + * R371 (0x173) - EQ37 + */ +#define WM8962_EQR_B4_C_MASK 0xFFFF /* EQR_B4_C - [15:0] */ +#define WM8962_EQR_B4_C_SHIFT 0 /* EQR_B4_C - [15:0] */ +#define WM8962_EQR_B4_C_WIDTH 16 /* EQR_B4_C - [15:0] */ + +/* + * R372 (0x174) - EQ38 + */ +#define WM8962_EQR_B4_PG_MASK 0xFFFF /* EQR_B4_PG - [15:0] */ +#define WM8962_EQR_B4_PG_SHIFT 0 /* EQR_B4_PG - [15:0] */ +#define WM8962_EQR_B4_PG_WIDTH 16 /* EQR_B4_PG - [15:0] */ + +/* + * R373 (0x175) - EQ39 + */ +#define WM8962_EQR_B5_A_MASK 0xFFFF /* EQR_B5_A - [15:0] */ +#define WM8962_EQR_B5_A_SHIFT 0 /* EQR_B5_A - [15:0] */ +#define WM8962_EQR_B5_A_WIDTH 16 /* EQR_B5_A - [15:0] */ + +/* + * R374 (0x176) - EQ40 + */ +#define WM8962_EQR_B5_B_MASK 0xFFFF /* EQR_B5_B - [15:0] */ +#define WM8962_EQR_B5_B_SHIFT 0 /* EQR_B5_B - [15:0] */ +#define WM8962_EQR_B5_B_WIDTH 16 /* EQR_B5_B - [15:0] */ + +/* + * R375 (0x177) - EQ41 + */ +#define WM8962_EQR_B5_PG_MASK 0xFFFF /* EQR_B5_PG - [15:0] */ +#define WM8962_EQR_B5_PG_SHIFT 0 /* EQR_B5_PG - [15:0] */ +#define WM8962_EQR_B5_PG_WIDTH 16 /* EQR_B5_PG - [15:0] */ + +/* + * R513 (0x201) - GPIO 2 + */ +#define WM8962_GP2_POL 0x0400 /* GP2_POL */ +#define WM8962_GP2_POL_MASK 0x0400 /* GP2_POL */ +#define WM8962_GP2_POL_SHIFT 10 /* GP2_POL */ +#define WM8962_GP2_POL_WIDTH 1 /* GP2_POL */ +#define WM8962_GP2_LVL 0x0040 /* GP2_LVL */ +#define WM8962_GP2_LVL_MASK 0x0040 /* GP2_LVL */ +#define WM8962_GP2_LVL_SHIFT 6 /* GP2_LVL */ +#define WM8962_GP2_LVL_WIDTH 1 /* GP2_LVL */ +#define WM8962_GP2_FN_MASK 0x001F /* GP2_FN - [4:0] */ +#define WM8962_GP2_FN_SHIFT 0 /* GP2_FN - [4:0] */ +#define WM8962_GP2_FN_WIDTH 5 /* GP2_FN - [4:0] */ + +/* + * R514 (0x202) - GPIO 3 + */ +#define WM8962_GP3_POL 0x0400 /* GP3_POL */ +#define WM8962_GP3_POL_MASK 0x0400 /* GP3_POL */ +#define WM8962_GP3_POL_SHIFT 10 /* GP3_POL */ +#define WM8962_GP3_POL_WIDTH 1 /* GP3_POL */ +#define WM8962_GP3_LVL 0x0040 /* GP3_LVL */ +#define WM8962_GP3_LVL_MASK 0x0040 /* GP3_LVL */ +#define WM8962_GP3_LVL_SHIFT 6 /* GP3_LVL */ +#define WM8962_GP3_LVL_WIDTH 1 /* GP3_LVL */ +#define WM8962_GP3_FN_MASK 0x001F /* GP3_FN - [4:0] */ +#define WM8962_GP3_FN_SHIFT 0 /* GP3_FN - [4:0] */ +#define WM8962_GP3_FN_WIDTH 5 /* GP3_FN - [4:0] */ + +/* + * R516 (0x204) - GPIO 5 + */ +#define WM8962_GP5_DIR 0x8000 /* GP5_DIR */ +#define WM8962_GP5_DIR_MASK 0x8000 /* GP5_DIR */ +#define WM8962_GP5_DIR_SHIFT 15 /* GP5_DIR */ +#define WM8962_GP5_DIR_WIDTH 1 /* GP5_DIR */ +#define WM8962_GP5_PU 0x4000 /* GP5_PU */ +#define WM8962_GP5_PU_MASK 0x4000 /* GP5_PU */ +#define WM8962_GP5_PU_SHIFT 14 /* GP5_PU */ +#define WM8962_GP5_PU_WIDTH 1 /* GP5_PU */ +#define WM8962_GP5_PD 0x2000 /* GP5_PD */ +#define WM8962_GP5_PD_MASK 0x2000 /* GP5_PD */ +#define WM8962_GP5_PD_SHIFT 13 /* GP5_PD */ +#define WM8962_GP5_PD_WIDTH 1 /* GP5_PD */ +#define WM8962_GP5_POL 0x0400 /* GP5_POL */ +#define WM8962_GP5_POL_MASK 0x0400 /* GP5_POL */ +#define WM8962_GP5_POL_SHIFT 10 /* GP5_POL */ +#define WM8962_GP5_POL_WIDTH 1 /* GP5_POL */ +#define WM8962_GP5_OP_CFG 0x0200 /* GP5_OP_CFG */ +#define WM8962_GP5_OP_CFG_MASK 0x0200 /* GP5_OP_CFG */ +#define WM8962_GP5_OP_CFG_SHIFT 9 /* GP5_OP_CFG */ +#define WM8962_GP5_OP_CFG_WIDTH 1 /* GP5_OP_CFG */ +#define WM8962_GP5_DB 0x0100 /* GP5_DB */ +#define WM8962_GP5_DB_MASK 0x0100 /* GP5_DB */ +#define WM8962_GP5_DB_SHIFT 8 /* GP5_DB */ +#define WM8962_GP5_DB_WIDTH 1 /* GP5_DB */ +#define WM8962_GP5_LVL 0x0040 /* GP5_LVL */ +#define WM8962_GP5_LVL_MASK 0x0040 /* GP5_LVL */ +#define WM8962_GP5_LVL_SHIFT 6 /* GP5_LVL */ +#define WM8962_GP5_LVL_WIDTH 1 /* GP5_LVL */ +#define WM8962_GP5_FN_MASK 0x001F /* GP5_FN - [4:0] */ +#define WM8962_GP5_FN_SHIFT 0 /* GP5_FN - [4:0] */ +#define WM8962_GP5_FN_WIDTH 5 /* GP5_FN - [4:0] */ + +/* + * R517 (0x205) - GPIO 6 + */ +#define WM8962_GP6_DIR 0x8000 /* GP6_DIR */ +#define WM8962_GP6_DIR_MASK 0x8000 /* GP6_DIR */ +#define WM8962_GP6_DIR_SHIFT 15 /* GP6_DIR */ +#define WM8962_GP6_DIR_WIDTH 1 /* GP6_DIR */ +#define WM8962_GP6_PU 0x4000 /* GP6_PU */ +#define WM8962_GP6_PU_MASK 0x4000 /* GP6_PU */ +#define WM8962_GP6_PU_SHIFT 14 /* GP6_PU */ +#define WM8962_GP6_PU_WIDTH 1 /* GP6_PU */ +#define WM8962_GP6_PD 0x2000 /* GP6_PD */ +#define WM8962_GP6_PD_MASK 0x2000 /* GP6_PD */ +#define WM8962_GP6_PD_SHIFT 13 /* GP6_PD */ +#define WM8962_GP6_PD_WIDTH 1 /* GP6_PD */ +#define WM8962_GP6_POL 0x0400 /* GP6_POL */ +#define WM8962_GP6_POL_MASK 0x0400 /* GP6_POL */ +#define WM8962_GP6_POL_SHIFT 10 /* GP6_POL */ +#define WM8962_GP6_POL_WIDTH 1 /* GP6_POL */ +#define WM8962_GP6_OP_CFG 0x0200 /* GP6_OP_CFG */ +#define WM8962_GP6_OP_CFG_MASK 0x0200 /* GP6_OP_CFG */ +#define WM8962_GP6_OP_CFG_SHIFT 9 /* GP6_OP_CFG */ +#define WM8962_GP6_OP_CFG_WIDTH 1 /* GP6_OP_CFG */ +#define WM8962_GP6_DB 0x0100 /* GP6_DB */ +#define WM8962_GP6_DB_MASK 0x0100 /* GP6_DB */ +#define WM8962_GP6_DB_SHIFT 8 /* GP6_DB */ +#define WM8962_GP6_DB_WIDTH 1 /* GP6_DB */ +#define WM8962_GP6_LVL 0x0040 /* GP6_LVL */ +#define WM8962_GP6_LVL_MASK 0x0040 /* GP6_LVL */ +#define WM8962_GP6_LVL_SHIFT 6 /* GP6_LVL */ +#define WM8962_GP6_LVL_WIDTH 1 /* GP6_LVL */ +#define WM8962_GP6_FN_MASK 0x001F /* GP6_FN - [4:0] */ +#define WM8962_GP6_FN_SHIFT 0 /* GP6_FN - [4:0] */ +#define WM8962_GP6_FN_WIDTH 5 /* GP6_FN - [4:0] */ + +/* + * R560 (0x230) - Interrupt Status 1 + */ +#define WM8962_GP6_EINT 0x0020 /* GP6_EINT */ +#define WM8962_GP6_EINT_MASK 0x0020 /* GP6_EINT */ +#define WM8962_GP6_EINT_SHIFT 5 /* GP6_EINT */ +#define WM8962_GP6_EINT_WIDTH 1 /* GP6_EINT */ +#define WM8962_GP5_EINT 0x0010 /* GP5_EINT */ +#define WM8962_GP5_EINT_MASK 0x0010 /* GP5_EINT */ +#define WM8962_GP5_EINT_SHIFT 4 /* GP5_EINT */ +#define WM8962_GP5_EINT_WIDTH 1 /* GP5_EINT */ + +/* + * R561 (0x231) - Interrupt Status 2 + */ +#define WM8962_MICSCD_EINT 0x8000 /* MICSCD_EINT */ +#define WM8962_MICSCD_EINT_MASK 0x8000 /* MICSCD_EINT */ +#define WM8962_MICSCD_EINT_SHIFT 15 /* MICSCD_EINT */ +#define WM8962_MICSCD_EINT_WIDTH 1 /* MICSCD_EINT */ +#define WM8962_MICD_EINT 0x4000 /* MICD_EINT */ +#define WM8962_MICD_EINT_MASK 0x4000 /* MICD_EINT */ +#define WM8962_MICD_EINT_SHIFT 14 /* MICD_EINT */ +#define WM8962_MICD_EINT_WIDTH 1 /* MICD_EINT */ +#define WM8962_FIFOS_ERR_EINT 0x2000 /* FIFOS_ERR_EINT */ +#define WM8962_FIFOS_ERR_EINT_MASK 0x2000 /* FIFOS_ERR_EINT */ +#define WM8962_FIFOS_ERR_EINT_SHIFT 13 /* FIFOS_ERR_EINT */ +#define WM8962_FIFOS_ERR_EINT_WIDTH 1 /* FIFOS_ERR_EINT */ +#define WM8962_ALC_LOCK_EINT 0x1000 /* ALC_LOCK_EINT */ +#define WM8962_ALC_LOCK_EINT_MASK 0x1000 /* ALC_LOCK_EINT */ +#define WM8962_ALC_LOCK_EINT_SHIFT 12 /* ALC_LOCK_EINT */ +#define WM8962_ALC_LOCK_EINT_WIDTH 1 /* ALC_LOCK_EINT */ +#define WM8962_ALC_THRESH_EINT 0x0800 /* ALC_THRESH_EINT */ +#define WM8962_ALC_THRESH_EINT_MASK 0x0800 /* ALC_THRESH_EINT */ +#define WM8962_ALC_THRESH_EINT_SHIFT 11 /* ALC_THRESH_EINT */ +#define WM8962_ALC_THRESH_EINT_WIDTH 1 /* ALC_THRESH_EINT */ +#define WM8962_ALC_SAT_EINT 0x0400 /* ALC_SAT_EINT */ +#define WM8962_ALC_SAT_EINT_MASK 0x0400 /* ALC_SAT_EINT */ +#define WM8962_ALC_SAT_EINT_SHIFT 10 /* ALC_SAT_EINT */ +#define WM8962_ALC_SAT_EINT_WIDTH 1 /* ALC_SAT_EINT */ +#define WM8962_ALC_PKOVR_EINT 0x0200 /* ALC_PKOVR_EINT */ +#define WM8962_ALC_PKOVR_EINT_MASK 0x0200 /* ALC_PKOVR_EINT */ +#define WM8962_ALC_PKOVR_EINT_SHIFT 9 /* ALC_PKOVR_EINT */ +#define WM8962_ALC_PKOVR_EINT_WIDTH 1 /* ALC_PKOVR_EINT */ +#define WM8962_ALC_NGATE_EINT 0x0100 /* ALC_NGATE_EINT */ +#define WM8962_ALC_NGATE_EINT_MASK 0x0100 /* ALC_NGATE_EINT */ +#define WM8962_ALC_NGATE_EINT_SHIFT 8 /* ALC_NGATE_EINT */ +#define WM8962_ALC_NGATE_EINT_WIDTH 1 /* ALC_NGATE_EINT */ +#define WM8962_WSEQ_DONE_EINT 0x0080 /* WSEQ_DONE_EINT */ +#define WM8962_WSEQ_DONE_EINT_MASK 0x0080 /* WSEQ_DONE_EINT */ +#define WM8962_WSEQ_DONE_EINT_SHIFT 7 /* WSEQ_DONE_EINT */ +#define WM8962_WSEQ_DONE_EINT_WIDTH 1 /* WSEQ_DONE_EINT */ +#define WM8962_DRC_ACTDET_EINT 0x0040 /* DRC_ACTDET_EINT */ +#define WM8962_DRC_ACTDET_EINT_MASK 0x0040 /* DRC_ACTDET_EINT */ +#define WM8962_DRC_ACTDET_EINT_SHIFT 6 /* DRC_ACTDET_EINT */ +#define WM8962_DRC_ACTDET_EINT_WIDTH 1 /* DRC_ACTDET_EINT */ +#define WM8962_FLL_LOCK_EINT 0x0020 /* FLL_LOCK_EINT */ +#define WM8962_FLL_LOCK_EINT_MASK 0x0020 /* FLL_LOCK_EINT */ +#define WM8962_FLL_LOCK_EINT_SHIFT 5 /* FLL_LOCK_EINT */ +#define WM8962_FLL_LOCK_EINT_WIDTH 1 /* FLL_LOCK_EINT */ +#define WM8962_PLL3_LOCK_EINT 0x0008 /* PLL3_LOCK_EINT */ +#define WM8962_PLL3_LOCK_EINT_MASK 0x0008 /* PLL3_LOCK_EINT */ +#define WM8962_PLL3_LOCK_EINT_SHIFT 3 /* PLL3_LOCK_EINT */ +#define WM8962_PLL3_LOCK_EINT_WIDTH 1 /* PLL3_LOCK_EINT */ +#define WM8962_PLL2_LOCK_EINT 0x0004 /* PLL2_LOCK_EINT */ +#define WM8962_PLL2_LOCK_EINT_MASK 0x0004 /* PLL2_LOCK_EINT */ +#define WM8962_PLL2_LOCK_EINT_SHIFT 2 /* PLL2_LOCK_EINT */ +#define WM8962_PLL2_LOCK_EINT_WIDTH 1 /* PLL2_LOCK_EINT */ +#define WM8962_TEMP_SHUT_EINT 0x0001 /* TEMP_SHUT_EINT */ +#define WM8962_TEMP_SHUT_EINT_MASK 0x0001 /* TEMP_SHUT_EINT */ +#define WM8962_TEMP_SHUT_EINT_SHIFT 0 /* TEMP_SHUT_EINT */ +#define WM8962_TEMP_SHUT_EINT_WIDTH 1 /* TEMP_SHUT_EINT */ + +/* + * R568 (0x238) - Interrupt Status 1 Mask + */ +#define WM8962_IM_GP6_EINT 0x0020 /* IM_GP6_EINT */ +#define WM8962_IM_GP6_EINT_MASK 0x0020 /* IM_GP6_EINT */ +#define WM8962_IM_GP6_EINT_SHIFT 5 /* IM_GP6_EINT */ +#define WM8962_IM_GP6_EINT_WIDTH 1 /* IM_GP6_EINT */ +#define WM8962_IM_GP5_EINT 0x0010 /* IM_GP5_EINT */ +#define WM8962_IM_GP5_EINT_MASK 0x0010 /* IM_GP5_EINT */ +#define WM8962_IM_GP5_EINT_SHIFT 4 /* IM_GP5_EINT */ +#define WM8962_IM_GP5_EINT_WIDTH 1 /* IM_GP5_EINT */ + +/* + * R569 (0x239) - Interrupt Status 2 Mask + */ +#define WM8962_IM_MICSCD_EINT 0x8000 /* IM_MICSCD_EINT */ +#define WM8962_IM_MICSCD_EINT_MASK 0x8000 /* IM_MICSCD_EINT */ +#define WM8962_IM_MICSCD_EINT_SHIFT 15 /* IM_MICSCD_EINT */ +#define WM8962_IM_MICSCD_EINT_WIDTH 1 /* IM_MICSCD_EINT */ +#define WM8962_IM_MICD_EINT 0x4000 /* IM_MICD_EINT */ +#define WM8962_IM_MICD_EINT_MASK 0x4000 /* IM_MICD_EINT */ +#define WM8962_IM_MICD_EINT_SHIFT 14 /* IM_MICD_EINT */ +#define WM8962_IM_MICD_EINT_WIDTH 1 /* IM_MICD_EINT */ +#define WM8962_IM_FIFOS_ERR_EINT 0x2000 /* IM_FIFOS_ERR_EINT */ +#define WM8962_IM_FIFOS_ERR_EINT_MASK 0x2000 /* IM_FIFOS_ERR_EINT */ +#define WM8962_IM_FIFOS_ERR_EINT_SHIFT 13 /* IM_FIFOS_ERR_EINT */ +#define WM8962_IM_FIFOS_ERR_EINT_WIDTH 1 /* IM_FIFOS_ERR_EINT */ +#define WM8962_IM_ALC_LOCK_EINT 0x1000 /* IM_ALC_LOCK_EINT */ +#define WM8962_IM_ALC_LOCK_EINT_MASK 0x1000 /* IM_ALC_LOCK_EINT */ +#define WM8962_IM_ALC_LOCK_EINT_SHIFT 12 /* IM_ALC_LOCK_EINT */ +#define WM8962_IM_ALC_LOCK_EINT_WIDTH 1 /* IM_ALC_LOCK_EINT */ +#define WM8962_IM_ALC_THRESH_EINT 0x0800 /* IM_ALC_THRESH_EINT */ +#define WM8962_IM_ALC_THRESH_EINT_MASK 0x0800 /* IM_ALC_THRESH_EINT */ +#define WM8962_IM_ALC_THRESH_EINT_SHIFT 11 /* IM_ALC_THRESH_EINT */ +#define WM8962_IM_ALC_THRESH_EINT_WIDTH 1 /* IM_ALC_THRESH_EINT */ +#define WM8962_IM_ALC_SAT_EINT 0x0400 /* IM_ALC_SAT_EINT */ +#define WM8962_IM_ALC_SAT_EINT_MASK 0x0400 /* IM_ALC_SAT_EINT */ +#define WM8962_IM_ALC_SAT_EINT_SHIFT 10 /* IM_ALC_SAT_EINT */ +#define WM8962_IM_ALC_SAT_EINT_WIDTH 1 /* IM_ALC_SAT_EINT */ +#define WM8962_IM_ALC_PKOVR_EINT 0x0200 /* IM_ALC_PKOVR_EINT */ +#define WM8962_IM_ALC_PKOVR_EINT_MASK 0x0200 /* IM_ALC_PKOVR_EINT */ +#define WM8962_IM_ALC_PKOVR_EINT_SHIFT 9 /* IM_ALC_PKOVR_EINT */ +#define WM8962_IM_ALC_PKOVR_EINT_WIDTH 1 /* IM_ALC_PKOVR_EINT */ +#define WM8962_IM_ALC_NGATE_EINT 0x0100 /* IM_ALC_NGATE_EINT */ +#define WM8962_IM_ALC_NGATE_EINT_MASK 0x0100 /* IM_ALC_NGATE_EINT */ +#define WM8962_IM_ALC_NGATE_EINT_SHIFT 8 /* IM_ALC_NGATE_EINT */ +#define WM8962_IM_ALC_NGATE_EINT_WIDTH 1 /* IM_ALC_NGATE_EINT */ +#define WM8962_IM_WSEQ_DONE_EINT 0x0080 /* IM_WSEQ_DONE_EINT */ +#define WM8962_IM_WSEQ_DONE_EINT_MASK 0x0080 /* IM_WSEQ_DONE_EINT */ +#define WM8962_IM_WSEQ_DONE_EINT_SHIFT 7 /* IM_WSEQ_DONE_EINT */ +#define WM8962_IM_WSEQ_DONE_EINT_WIDTH 1 /* IM_WSEQ_DONE_EINT */ +#define WM8962_IM_DRC_ACTDET_EINT 0x0040 /* IM_DRC_ACTDET_EINT */ +#define WM8962_IM_DRC_ACTDET_EINT_MASK 0x0040 /* IM_DRC_ACTDET_EINT */ +#define WM8962_IM_DRC_ACTDET_EINT_SHIFT 6 /* IM_DRC_ACTDET_EINT */ +#define WM8962_IM_DRC_ACTDET_EINT_WIDTH 1 /* IM_DRC_ACTDET_EINT */ +#define WM8962_IM_FLL_LOCK_EINT 0x0020 /* IM_FLL_LOCK_EINT */ +#define WM8962_IM_FLL_LOCK_EINT_MASK 0x0020 /* IM_FLL_LOCK_EINT */ +#define WM8962_IM_FLL_LOCK_EINT_SHIFT 5 /* IM_FLL_LOCK_EINT */ +#define WM8962_IM_FLL_LOCK_EINT_WIDTH 1 /* IM_FLL_LOCK_EINT */ +#define WM8962_IM_PLL3_LOCK_EINT 0x0008 /* IM_PLL3_LOCK_EINT */ +#define WM8962_IM_PLL3_LOCK_EINT_MASK 0x0008 /* IM_PLL3_LOCK_EINT */ +#define WM8962_IM_PLL3_LOCK_EINT_SHIFT 3 /* IM_PLL3_LOCK_EINT */ +#define WM8962_IM_PLL3_LOCK_EINT_WIDTH 1 /* IM_PLL3_LOCK_EINT */ +#define WM8962_IM_PLL2_LOCK_EINT 0x0004 /* IM_PLL2_LOCK_EINT */ +#define WM8962_IM_PLL2_LOCK_EINT_MASK 0x0004 /* IM_PLL2_LOCK_EINT */ +#define WM8962_IM_PLL2_LOCK_EINT_SHIFT 2 /* IM_PLL2_LOCK_EINT */ +#define WM8962_IM_PLL2_LOCK_EINT_WIDTH 1 /* IM_PLL2_LOCK_EINT */ +#define WM8962_IM_TEMP_SHUT_EINT 0x0001 /* IM_TEMP_SHUT_EINT */ +#define WM8962_IM_TEMP_SHUT_EINT_MASK 0x0001 /* IM_TEMP_SHUT_EINT */ +#define WM8962_IM_TEMP_SHUT_EINT_SHIFT 0 /* IM_TEMP_SHUT_EINT */ +#define WM8962_IM_TEMP_SHUT_EINT_WIDTH 1 /* IM_TEMP_SHUT_EINT */ + +/* + * R576 (0x240) - Interrupt Control + */ +#define WM8962_IRQ_POL 0x0001 /* IRQ_POL */ +#define WM8962_IRQ_POL_MASK 0x0001 /* IRQ_POL */ +#define WM8962_IRQ_POL_SHIFT 0 /* IRQ_POL */ +#define WM8962_IRQ_POL_WIDTH 1 /* IRQ_POL */ + +/* + * R584 (0x248) - IRQ Debounce + */ +#define WM8962_FLL_LOCK_DB 0x0020 /* FLL_LOCK_DB */ +#define WM8962_FLL_LOCK_DB_MASK 0x0020 /* FLL_LOCK_DB */ +#define WM8962_FLL_LOCK_DB_SHIFT 5 /* FLL_LOCK_DB */ +#define WM8962_FLL_LOCK_DB_WIDTH 1 /* FLL_LOCK_DB */ +#define WM8962_PLL3_LOCK_DB 0x0008 /* PLL3_LOCK_DB */ +#define WM8962_PLL3_LOCK_DB_MASK 0x0008 /* PLL3_LOCK_DB */ +#define WM8962_PLL3_LOCK_DB_SHIFT 3 /* PLL3_LOCK_DB */ +#define WM8962_PLL3_LOCK_DB_WIDTH 1 /* PLL3_LOCK_DB */ +#define WM8962_PLL2_LOCK_DB 0x0004 /* PLL2_LOCK_DB */ +#define WM8962_PLL2_LOCK_DB_MASK 0x0004 /* PLL2_LOCK_DB */ +#define WM8962_PLL2_LOCK_DB_SHIFT 2 /* PLL2_LOCK_DB */ +#define WM8962_PLL2_LOCK_DB_WIDTH 1 /* PLL2_LOCK_DB */ +#define WM8962_TEMP_SHUT_DB 0x0001 /* TEMP_SHUT_DB */ +#define WM8962_TEMP_SHUT_DB_MASK 0x0001 /* TEMP_SHUT_DB */ +#define WM8962_TEMP_SHUT_DB_SHIFT 0 /* TEMP_SHUT_DB */ +#define WM8962_TEMP_SHUT_DB_WIDTH 1 /* TEMP_SHUT_DB */ + +/* + * R586 (0x24A) - MICINT Source Pol + */ +#define WM8962_MICSCD_IRQ_POL 0x8000 /* MICSCD_IRQ_POL */ +#define WM8962_MICSCD_IRQ_POL_MASK 0x8000 /* MICSCD_IRQ_POL */ +#define WM8962_MICSCD_IRQ_POL_SHIFT 15 /* MICSCD_IRQ_POL */ +#define WM8962_MICSCD_IRQ_POL_WIDTH 1 /* MICSCD_IRQ_POL */ +#define WM8962_MICD_IRQ_POL 0x4000 /* MICD_IRQ_POL */ +#define WM8962_MICD_IRQ_POL_MASK 0x4000 /* MICD_IRQ_POL */ +#define WM8962_MICD_IRQ_POL_SHIFT 14 /* MICD_IRQ_POL */ +#define WM8962_MICD_IRQ_POL_WIDTH 1 /* MICD_IRQ_POL */ + +/* + * R768 (0x300) - DSP2 Power Management + */ +#define WM8962_DSP2_ENA 0x0001 /* DSP2_ENA */ +#define WM8962_DSP2_ENA_MASK 0x0001 /* DSP2_ENA */ +#define WM8962_DSP2_ENA_SHIFT 0 /* DSP2_ENA */ +#define WM8962_DSP2_ENA_WIDTH 1 /* DSP2_ENA */ + +/* + * R1037 (0x40D) - DSP2_ExecControl + */ +#define WM8962_DSP2_STOPC 0x0020 /* DSP2_STOPC */ +#define WM8962_DSP2_STOPC_MASK 0x0020 /* DSP2_STOPC */ +#define WM8962_DSP2_STOPC_SHIFT 5 /* DSP2_STOPC */ +#define WM8962_DSP2_STOPC_WIDTH 1 /* DSP2_STOPC */ +#define WM8962_DSP2_STOPS 0x0010 /* DSP2_STOPS */ +#define WM8962_DSP2_STOPS_MASK 0x0010 /* DSP2_STOPS */ +#define WM8962_DSP2_STOPS_SHIFT 4 /* DSP2_STOPS */ +#define WM8962_DSP2_STOPS_WIDTH 1 /* DSP2_STOPS */ +#define WM8962_DSP2_STOPI 0x0008 /* DSP2_STOPI */ +#define WM8962_DSP2_STOPI_MASK 0x0008 /* DSP2_STOPI */ +#define WM8962_DSP2_STOPI_SHIFT 3 /* DSP2_STOPI */ +#define WM8962_DSP2_STOPI_WIDTH 1 /* DSP2_STOPI */ +#define WM8962_DSP2_STOP 0x0004 /* DSP2_STOP */ +#define WM8962_DSP2_STOP_MASK 0x0004 /* DSP2_STOP */ +#define WM8962_DSP2_STOP_SHIFT 2 /* DSP2_STOP */ +#define WM8962_DSP2_STOP_WIDTH 1 /* DSP2_STOP */ +#define WM8962_DSP2_RUNR 0x0002 /* DSP2_RUNR */ +#define WM8962_DSP2_RUNR_MASK 0x0002 /* DSP2_RUNR */ +#define WM8962_DSP2_RUNR_SHIFT 1 /* DSP2_RUNR */ +#define WM8962_DSP2_RUNR_WIDTH 1 /* DSP2_RUNR */ +#define WM8962_DSP2_RUN 0x0001 /* DSP2_RUN */ +#define WM8962_DSP2_RUN_MASK 0x0001 /* DSP2_RUN */ +#define WM8962_DSP2_RUN_SHIFT 0 /* DSP2_RUN */ +#define WM8962_DSP2_RUN_WIDTH 1 /* DSP2_RUN */ + +/* + * R8192 (0x2000) - DSP2 Instruction RAM 0 + */ +#define WM8962_DSP2_INSTR_RAM_1024_10_9_0_MASK 0x03FF /* DSP2_INSTR_RAM_1024_10_9_0 - [9:0] */ +#define WM8962_DSP2_INSTR_RAM_1024_10_9_0_SHIFT 0 /* DSP2_INSTR_RAM_1024_10_9_0 - [9:0] */ +#define WM8962_DSP2_INSTR_RAM_1024_10_9_0_WIDTH 10 /* DSP2_INSTR_RAM_1024_10_9_0 - [9:0] */ + +/* + * R9216 (0x2400) - DSP2 Address RAM 2 + */ +#define WM8962_DSP2_ADDR_RAM_1024_38_37_32_MASK 0x003F /* DSP2_ADDR_RAM_1024_38_37_32 - [5:0] */ +#define WM8962_DSP2_ADDR_RAM_1024_38_37_32_SHIFT 0 /* DSP2_ADDR_RAM_1024_38_37_32 - [5:0] */ +#define WM8962_DSP2_ADDR_RAM_1024_38_37_32_WIDTH 6 /* DSP2_ADDR_RAM_1024_38_37_32 - [5:0] */ + +/* + * R9217 (0x2401) - DSP2 Address RAM 1 + */ +#define WM8962_DSP2_ADDR_RAM_1024_38_31_16_MASK 0xFFFF /* DSP2_ADDR_RAM_1024_38_31_16 - [15:0] */ +#define WM8962_DSP2_ADDR_RAM_1024_38_31_16_SHIFT 0 /* DSP2_ADDR_RAM_1024_38_31_16 - [15:0] */ +#define WM8962_DSP2_ADDR_RAM_1024_38_31_16_WIDTH 16 /* DSP2_ADDR_RAM_1024_38_31_16 - [15:0] */ + +/* + * R9218 (0x2402) - DSP2 Address RAM 0 + */ +#define WM8962_DSP2_ADDR_RAM_1024_38_15_0_MASK 0xFFFF /* DSP2_ADDR_RAM_1024_38_15_0 - [15:0] */ +#define WM8962_DSP2_ADDR_RAM_1024_38_15_0_SHIFT 0 /* DSP2_ADDR_RAM_1024_38_15_0 - [15:0] */ +#define WM8962_DSP2_ADDR_RAM_1024_38_15_0_WIDTH 16 /* DSP2_ADDR_RAM_1024_38_15_0 - [15:0] */ + +/* + * R12288 (0x3000) - DSP2 Data1 RAM 1 + */ +#define WM8962_DSP2_DATA1_RAM_384_24_23_16_MASK 0x00FF /* DSP2_DATA1_RAM_384_24_23_16 - [7:0] */ +#define WM8962_DSP2_DATA1_RAM_384_24_23_16_SHIFT 0 /* DSP2_DATA1_RAM_384_24_23_16 - [7:0] */ +#define WM8962_DSP2_DATA1_RAM_384_24_23_16_WIDTH 8 /* DSP2_DATA1_RAM_384_24_23_16 - [7:0] */ + +/* + * R12289 (0x3001) - DSP2 Data1 RAM 0 + */ +#define WM8962_DSP2_DATA1_RAM_384_24_15_0_MASK 0xFFFF /* DSP2_DATA1_RAM_384_24_15_0 - [15:0] */ +#define WM8962_DSP2_DATA1_RAM_384_24_15_0_SHIFT 0 /* DSP2_DATA1_RAM_384_24_15_0 - [15:0] */ +#define WM8962_DSP2_DATA1_RAM_384_24_15_0_WIDTH 16 /* DSP2_DATA1_RAM_384_24_15_0 - [15:0] */ + +/* + * R13312 (0x3400) - DSP2 Data2 RAM 1 + */ +#define WM8962_DSP2_DATA2_RAM_384_24_23_16_MASK 0x00FF /* DSP2_DATA2_RAM_384_24_23_16 - [7:0] */ +#define WM8962_DSP2_DATA2_RAM_384_24_23_16_SHIFT 0 /* DSP2_DATA2_RAM_384_24_23_16 - [7:0] */ +#define WM8962_DSP2_DATA2_RAM_384_24_23_16_WIDTH 8 /* DSP2_DATA2_RAM_384_24_23_16 - [7:0] */ + +/* + * R13313 (0x3401) - DSP2 Data2 RAM 0 + */ +#define WM8962_DSP2_DATA2_RAM_384_24_15_0_MASK 0xFFFF /* DSP2_DATA2_RAM_384_24_15_0 - [15:0] */ +#define WM8962_DSP2_DATA2_RAM_384_24_15_0_SHIFT 0 /* DSP2_DATA2_RAM_384_24_15_0 - [15:0] */ +#define WM8962_DSP2_DATA2_RAM_384_24_15_0_WIDTH 16 /* DSP2_DATA2_RAM_384_24_15_0 - [15:0] */ + +/* + * R14336 (0x3800) - DSP2 Data3 RAM 1 + */ +#define WM8962_DSP2_DATA3_RAM_384_24_23_16_MASK 0x00FF /* DSP2_DATA3_RAM_384_24_23_16 - [7:0] */ +#define WM8962_DSP2_DATA3_RAM_384_24_23_16_SHIFT 0 /* DSP2_DATA3_RAM_384_24_23_16 - [7:0] */ +#define WM8962_DSP2_DATA3_RAM_384_24_23_16_WIDTH 8 /* DSP2_DATA3_RAM_384_24_23_16 - [7:0] */ + +/* + * R14337 (0x3801) - DSP2 Data3 RAM 0 + */ +#define WM8962_DSP2_DATA3_RAM_384_24_15_0_MASK 0xFFFF /* DSP2_DATA3_RAM_384_24_15_0 - [15:0] */ +#define WM8962_DSP2_DATA3_RAM_384_24_15_0_SHIFT 0 /* DSP2_DATA3_RAM_384_24_15_0 - [15:0] */ +#define WM8962_DSP2_DATA3_RAM_384_24_15_0_WIDTH 16 /* DSP2_DATA3_RAM_384_24_15_0 - [15:0] */ + +/* + * R15360 (0x3C00) - DSP2 Coeff RAM 0 + */ +#define WM8962_DSP2_CMAP_RAM_384_11_10_0_MASK 0x07FF /* DSP2_CMAP_RAM_384_11_10_0 - [10:0] */ +#define WM8962_DSP2_CMAP_RAM_384_11_10_0_SHIFT 0 /* DSP2_CMAP_RAM_384_11_10_0 - [10:0] */ +#define WM8962_DSP2_CMAP_RAM_384_11_10_0_WIDTH 11 /* DSP2_CMAP_RAM_384_11_10_0 - [10:0] */ + +/* + * R16384 (0x4000) - RETUNEADC_SHARED_COEFF_1 + */ +#define WM8962_ADC_RETUNE_SCV 0x0080 /* ADC_RETUNE_SCV */ +#define WM8962_ADC_RETUNE_SCV_MASK 0x0080 /* ADC_RETUNE_SCV */ +#define WM8962_ADC_RETUNE_SCV_SHIFT 7 /* ADC_RETUNE_SCV */ +#define WM8962_ADC_RETUNE_SCV_WIDTH 1 /* ADC_RETUNE_SCV */ +#define WM8962_RETUNEADC_SHARED_COEFF_22_16_MASK 0x007F /* RETUNEADC_SHARED_COEFF_22_16 - [6:0] */ +#define WM8962_RETUNEADC_SHARED_COEFF_22_16_SHIFT 0 /* RETUNEADC_SHARED_COEFF_22_16 - [6:0] */ +#define WM8962_RETUNEADC_SHARED_COEFF_22_16_WIDTH 7 /* RETUNEADC_SHARED_COEFF_22_16 - [6:0] */ + +/* + * R16385 (0x4001) - RETUNEADC_SHARED_COEFF_0 + */ +#define WM8962_RETUNEADC_SHARED_COEFF_15_00_MASK 0xFFFF /* RETUNEADC_SHARED_COEFF_15_00 - [15:0] */ +#define WM8962_RETUNEADC_SHARED_COEFF_15_00_SHIFT 0 /* RETUNEADC_SHARED_COEFF_15_00 - [15:0] */ +#define WM8962_RETUNEADC_SHARED_COEFF_15_00_WIDTH 16 /* RETUNEADC_SHARED_COEFF_15_00 - [15:0] */ + +/* + * R16386 (0x4002) - RETUNEDAC_SHARED_COEFF_1 + */ +#define WM8962_DAC_RETUNE_SCV 0x0080 /* DAC_RETUNE_SCV */ +#define WM8962_DAC_RETUNE_SCV_MASK 0x0080 /* DAC_RETUNE_SCV */ +#define WM8962_DAC_RETUNE_SCV_SHIFT 7 /* DAC_RETUNE_SCV */ +#define WM8962_DAC_RETUNE_SCV_WIDTH 1 /* DAC_RETUNE_SCV */ +#define WM8962_RETUNEDAC_SHARED_COEFF_23_16_MASK 0x007F /* RETUNEDAC_SHARED_COEFF_23_16 - [6:0] */ +#define WM8962_RETUNEDAC_SHARED_COEFF_23_16_SHIFT 0 /* RETUNEDAC_SHARED_COEFF_23_16 - [6:0] */ +#define WM8962_RETUNEDAC_SHARED_COEFF_23_16_WIDTH 7 /* RETUNEDAC_SHARED_COEFF_23_16 - [6:0] */ + +/* + * R16387 (0x4003) - RETUNEDAC_SHARED_COEFF_0 + */ +#define WM8962_RETUNEDAC_SHARED_COEFF_15_00_MASK 0xFFFF /* RETUNEDAC_SHARED_COEFF_15_00 - [15:0] */ +#define WM8962_RETUNEDAC_SHARED_COEFF_15_00_SHIFT 0 /* RETUNEDAC_SHARED_COEFF_15_00 - [15:0] */ +#define WM8962_RETUNEDAC_SHARED_COEFF_15_00_WIDTH 16 /* RETUNEDAC_SHARED_COEFF_15_00 - [15:0] */ + +/* + * R16388 (0x4004) - SOUNDSTAGE_ENABLES_1 + */ +#define WM8962_SOUNDSTAGE_ENABLES_23_16_MASK 0x00FF /* SOUNDSTAGE_ENABLES_23_16 - [7:0] */ +#define WM8962_SOUNDSTAGE_ENABLES_23_16_SHIFT 0 /* SOUNDSTAGE_ENABLES_23_16 - [7:0] */ +#define WM8962_SOUNDSTAGE_ENABLES_23_16_WIDTH 8 /* SOUNDSTAGE_ENABLES_23_16 - [7:0] */ + +/* + * R16389 (0x4005) - SOUNDSTAGE_ENABLES_0 + */ +#define WM8962_SOUNDSTAGE_ENABLES_15_06_MASK 0xFFC0 /* SOUNDSTAGE_ENABLES_15_06 - [15:6] */ +#define WM8962_SOUNDSTAGE_ENABLES_15_06_SHIFT 6 /* SOUNDSTAGE_ENABLES_15_06 - [15:6] */ +#define WM8962_SOUNDSTAGE_ENABLES_15_06_WIDTH 10 /* SOUNDSTAGE_ENABLES_15_06 - [15:6] */ +#define WM8962_RTN_ADC_ENA 0x0020 /* RTN_ADC_ENA */ +#define WM8962_RTN_ADC_ENA_MASK 0x0020 /* RTN_ADC_ENA */ +#define WM8962_RTN_ADC_ENA_SHIFT 5 /* RTN_ADC_ENA */ +#define WM8962_RTN_ADC_ENA_WIDTH 1 /* RTN_ADC_ENA */ +#define WM8962_RTN_DAC_ENA 0x0010 /* RTN_DAC_ENA */ +#define WM8962_RTN_DAC_ENA_MASK 0x0010 /* RTN_DAC_ENA */ +#define WM8962_RTN_DAC_ENA_SHIFT 4 /* RTN_DAC_ENA */ +#define WM8962_RTN_DAC_ENA_WIDTH 1 /* RTN_DAC_ENA */ +#define WM8962_HDBASS_ENA 0x0008 /* HDBASS_ENA */ +#define WM8962_HDBASS_ENA_MASK 0x0008 /* HDBASS_ENA */ +#define WM8962_HDBASS_ENA_SHIFT 3 /* HDBASS_ENA */ +#define WM8962_HDBASS_ENA_WIDTH 1 /* HDBASS_ENA */ +#define WM8962_HPF2_ENA 0x0004 /* HPF2_ENA */ +#define WM8962_HPF2_ENA_MASK 0x0004 /* HPF2_ENA */ +#define WM8962_HPF2_ENA_SHIFT 2 /* HPF2_ENA */ +#define WM8962_HPF2_ENA_WIDTH 1 /* HPF2_ENA */ +#define WM8962_HPF1_ENA 0x0002 /* HPF1_ENA */ +#define WM8962_HPF1_ENA_MASK 0x0002 /* HPF1_ENA */ +#define WM8962_HPF1_ENA_SHIFT 1 /* HPF1_ENA */ +#define WM8962_HPF1_ENA_WIDTH 1 /* HPF1_ENA */ +#define WM8962_VSS_ENA 0x0001 /* VSS_ENA */ +#define WM8962_VSS_ENA_MASK 0x0001 /* VSS_ENA */ +#define WM8962_VSS_ENA_SHIFT 0 /* VSS_ENA */ +#define WM8962_VSS_ENA_WIDTH 1 /* VSS_ENA */ + +extern const u16 wm8962_reg[WM8962_MAX_REGISTER + 1]; + +struct wm8962_reg_access { + u16 read; + u16 write; + u16 vol; +}; + +extern +const struct wm8962_reg_access wm8962_reg_access[WM8962_MAX_REGISTER + 1]; + +#endif -- cgit v1.2.3 From bb4d0044aa9bd8768cfb2704672d25fcf0d87552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eric=20B=C3=A9nard?= Date: Fri, 30 Jul 2010 23:01:31 +0200 Subject: ASoC: Fix for changed Eureka Kconfig symbol names MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Eric Bénard Signed-off-by: Mark Brown --- sound/soc/imx/Kconfig | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/imx/Kconfig b/sound/soc/imx/Kconfig index 52dac5e3874c..687c76fc0839 100644 --- a/sound/soc/imx/Kconfig +++ b/sound/soc/imx/Kconfig @@ -28,7 +28,9 @@ config SND_SOC_PHYCORE_AC97 config SND_SOC_EUKREA_TLV320 tristate "Eukrea TLV320" - depends on MACH_EUKREA_MBIMX27_BASEBOARD || MACH_EUKREA_MBIMXSD_BASEBOARD + depends on MACH_EUKREA_MBIMX27_BASEBOARD \ + || MACH_EUKREA_MBIMXSD25_BASEBOARD \ + || MACH_EUKREA_MBIMXSD35_BASEBOARD select SND_SOC_TLV320AIC23 help Enable I2S based access to the TLV320AIC23B codec attached -- cgit v1.2.3 From 2d00775c58325f63ad44702b3d9a1e2171536193 Mon Sep 17 00:00:00 2001 From: Andrea Gelmini Date: Thu, 5 Aug 2010 15:51:37 +0200 Subject: sound: oss: au1550_ac97.c removed duplicated #include Signed-off-by: Andrea Gelmini Signed-off-by: Takashi Iwai --- sound/oss/au1550_ac97.c | 1 - 1 file changed, 1 deletion(-) (limited to 'sound') diff --git a/sound/oss/au1550_ac97.c b/sound/oss/au1550_ac97.c index c4a4cdc07ab9..c6f2621221ba 100644 --- a/sound/oss/au1550_ac97.c +++ b/sound/oss/au1550_ac97.c @@ -50,7 +50,6 @@ #include #include #include -#include #include #include -- cgit v1.2.3 From dc386c4f6f3e6f495d1c6f72602c065153814385 Mon Sep 17 00:00:00 2001 From: Julia Lawall Date: Thu, 5 Aug 2010 22:27:32 +0200 Subject: sound/oss: Adjust confusing if indentation Indent the branch of an if. The semantic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // @r disable braces4@ position p1,p2; statement S1,S2; @@ ( if (...) { ... } | if (...) S1@p1 S2@p2 ) @script:python@ p1 << r.p1; p2 << r.p2; @@ if (p1[0].column == p2[0].column): cocci.print_main("branch",p1) cocci.print_secs("after",p2) // Signed-off-by: Julia Lawall Signed-off-by: Takashi Iwai --- sound/oss/ad1848.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/oss/ad1848.c b/sound/oss/ad1848.c index 24793c5b65ac..4d2a6ae978f7 100644 --- a/sound/oss/ad1848.c +++ b/sound/oss/ad1848.c @@ -716,7 +716,7 @@ static int ad1848_mixer_ioctl(int dev, unsigned int cmd, void __user *arg) default: if (get_user(val, (int __user *)arg)) - return -EFAULT; + return -EFAULT; val = ad1848_mixer_set(devc, cmd & 0xff, val); break; } -- cgit v1.2.3 From fe3eb0a73ca052ee9346a1544f4c00e697cc9a4e Mon Sep 17 00:00:00 2001 From: Kailang Yang Date: Fri, 6 Aug 2010 10:02:57 +0200 Subject: ALSA: hda - Add support for Acer ZGA ALC271 (1025:047c) Signed-off-by: Kailang Yang Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 6ac53f7de549..2891571e7647 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -137,6 +137,7 @@ enum { ALC269VB_DMIC, ALC269_FUJITSU, ALC269_LIFEBOOK, + ALC271_ACER, ALC269_AUTO, ALC269_MODEL_LAST /* last tag */ }; @@ -13866,6 +13867,12 @@ static struct snd_kcontrol_new alc269vb_laptop_mixer[] = { { } /* end */ }; +static struct snd_kcontrol_new alc269_asus_mixer[] = { + HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x0, HDA_INPUT), + { } /* end */ +}; + /* capture mixer elements */ static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = { HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), @@ -14086,6 +14093,20 @@ static struct hda_verb alc269vb_laptop_amic_init_verbs[] = { {} }; +static struct hda_verb alc271_acer_dmic_verbs[] = { + {0x20, AC_VERB_SET_COEF_INDEX, 0x0d}, + {0x20, AC_VERB_SET_PROC_COEF, 0x4000}, + {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, + {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, + {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, + {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, + {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, + {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, + {0x22, AC_VERB_SET_CONNECT_SEL, 6}, + { } +}; + /* toggle speaker-output according to the hp-jack state */ static void alc269_speaker_automute(struct hda_codec *codec) { @@ -14465,6 +14486,7 @@ static const char *alc269_models[ALC269_MODEL_LAST] = { static struct snd_pci_quirk alc269_cfg_tbl[] = { SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1), + SND_PCI_QUIRK(0x1025, 0x047c, "ACER ZGA", ALC271_ACER), SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", ALC269_AMIC), SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC), @@ -14626,6 +14648,23 @@ static struct alc_config_preset alc269_presets[] = { .unsol_event = alc269_lifebook_unsol_event, .init_hook = alc269_lifebook_init_hook, }, + [ALC271_ACER] = { + .mixers = { alc269_asus_mixer }, + .cap_mixer = alc269vb_laptop_digital_capture_mixer, + .init_verbs = { alc269_init_verbs, alc271_acer_dmic_verbs }, + .num_dacs = ARRAY_SIZE(alc269_dac_nids), + .dac_nids = alc269_dac_nids, + .adc_nids = alc262_dmic_adc_nids, + .num_adc_nids = ARRAY_SIZE(alc262_dmic_adc_nids), + .capsrc_nids = alc262_dmic_capsrc_nids, + .num_channel_mode = ARRAY_SIZE(alc269_modes), + .channel_mode = alc269_modes, + .input_mux = &alc269_capture_source, + .dig_out_nid = ALC880_DIGOUT_NID, + .unsol_event = alc_sku_unsol_event, + .setup = alc269vb_laptop_dmic_setup, + .init_hook = alc_inithook, + }, }; static int patch_alc269(struct hda_codec *codec) -- cgit v1.2.3 From eb541337b7a43822fce7d0c9d967ee149b2d9a96 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Fri, 6 Aug 2010 13:48:11 +0200 Subject: ALSA: hda - Make converter setups sticky So far, we reset the converter setups like the stream-tag, the channel-id and format-id in prepare callbacks, and clear them in cleanup callbacks. This often causes a silence of the digital receiver for a couple of seconds. This patch tries to delay the converter setup changes as much as possible. The converter setups are cached and aren't reset as long as the same values are used. At suspend/resume, they are cleared to be recovered properly, too. Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_codec.c | 150 +++++++++++++++++++++++++++++++++++++++++++--- sound/pci/hda/hda_codec.h | 12 ++++ sound/pci/hda/hda_intel.c | 6 +- 3 files changed, 157 insertions(+), 11 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index a7802b99436c..720a81d711e3 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -970,6 +970,36 @@ static void restore_init_pincfgs(struct hda_codec *codec) snd_array_free(&codec->init_pins); } +/* + * audio-converter setup caches + */ +struct hda_cvt_setup { + hda_nid_t nid; + u8 stream_tag; + u8 channel_id; + u16 format_id; + unsigned char active; /* cvt is currently used */ + unsigned char dirty; /* setups should be cleared */ +}; + +/* get or create a cache entry for the given audio converter NID */ +static struct hda_cvt_setup * +get_hda_cvt_setup(struct hda_codec *codec, hda_nid_t nid) +{ + struct hda_cvt_setup *p; + int i; + + for (i = 0; i < codec->cvt_setups.used; i++) { + p = snd_array_elem(&codec->cvt_setups, i); + if (p->nid == nid) + return p; + } + p = snd_array_new(&codec->cvt_setups); + if (p) + p->nid = nid; + return p; +} + /* * codec destructor */ @@ -1038,12 +1068,14 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, codec->addr = codec_addr; mutex_init(&codec->spdif_mutex); mutex_init(&codec->control_mutex); + mutex_init(&codec->prepare_mutex); init_hda_cache(&codec->amp_cache, sizeof(struct hda_amp_info)); init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head)); snd_array_init(&codec->mixers, sizeof(struct hda_nid_item), 32); snd_array_init(&codec->nids, sizeof(struct hda_nid_item), 32); snd_array_init(&codec->init_pins, sizeof(struct hda_pincfg), 16); snd_array_init(&codec->driver_pins, sizeof(struct hda_pincfg), 16); + snd_array_init(&codec->cvt_setups, sizeof(struct hda_cvt_setup), 8); if (codec->bus->modelname) { codec->modelname = kstrdup(codec->bus->modelname, GFP_KERNEL); if (!codec->modelname) { @@ -1181,16 +1213,51 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, u32 stream_tag, int channel_id, int format) { + struct hda_cvt_setup *p; + unsigned int oldval, newval; + int i; + if (!nid) return; snd_printdd("hda_codec_setup_stream: " "NID=0x%x, stream=0x%x, channel=%d, format=0x%x\n", nid, stream_tag, channel_id, format); - snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID, - (stream_tag << 4) | channel_id); - msleep(1); - snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, format); + p = get_hda_cvt_setup(codec, nid); + if (!p) + return; + /* update the stream-id if changed */ + if (p->stream_tag != stream_tag || p->channel_id != channel_id) { + oldval = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0); + newval = (stream_tag << 4) | channel_id; + if (oldval != newval) + snd_hda_codec_write(codec, nid, 0, + AC_VERB_SET_CHANNEL_STREAMID, + newval); + p->stream_tag = stream_tag; + p->channel_id = channel_id; + } + /* update the format-id if changed */ + if (p->format_id != format) { + oldval = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_STREAM_FORMAT, 0); + if (oldval != format) { + msleep(1); + snd_hda_codec_write(codec, nid, 0, + AC_VERB_SET_STREAM_FORMAT, + format); + } + p->format_id = format; + } + p->active = 1; + p->dirty = 0; + + /* make other inactive cvts with the same stream-tag dirty */ + for (i = 0; i < codec->cvt_setups.used; i++) { + p = snd_array_elem(&codec->cvt_setups, i); + if (!p->active && p->stream_tag == stream_tag) + p->dirty = 1; + } } EXPORT_SYMBOL_HDA(snd_hda_codec_setup_stream); @@ -1201,17 +1268,54 @@ EXPORT_SYMBOL_HDA(snd_hda_codec_setup_stream); */ void snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid) { + struct hda_cvt_setup *p; + if (!nid) return; snd_printdd("hda_codec_cleanup_stream: NID=0x%x\n", nid); + /* here we just clear the active flag; actual clean-ups will be done + * in purify_inactive_streams() + */ + p = get_hda_cvt_setup(codec, nid); + if (p) + p->active = 0; +} +EXPORT_SYMBOL_HDA(snd_hda_codec_cleanup_stream); + +static void really_cleanup_stream(struct hda_codec *codec, + struct hda_cvt_setup *q) +{ + hda_nid_t nid = q->nid; snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID, 0); -#if 0 /* keep the format */ - msleep(1); snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, 0); -#endif + memset(q, 0, sizeof(*q)); + q->nid = nid; +} + +/* clean up the all conflicting obsolete streams */ +static void purify_inactive_streams(struct hda_codec *codec) +{ + int i; + + for (i = 0; i < codec->cvt_setups.used; i++) { + struct hda_cvt_setup *p = snd_array_elem(&codec->cvt_setups, i); + if (p->dirty) + really_cleanup_stream(codec, p); + } +} + +/* clean up all streams; called from suspend */ +static void hda_cleanup_all_streams(struct hda_codec *codec) +{ + int i; + + for (i = 0; i < codec->cvt_setups.used; i++) { + struct hda_cvt_setup *p = snd_array_elem(&codec->cvt_setups, i); + if (p->stream_tag) + really_cleanup_stream(codec, p); + } } -EXPORT_SYMBOL_HDA(snd_hda_codec_cleanup_stream); /* * amp access functions @@ -2928,6 +3032,7 @@ static void hda_call_codec_suspend(struct hda_codec *codec) { if (codec->patch_ops.suspend) codec->patch_ops.suspend(codec, PMSG_SUSPEND); + hda_cleanup_all_streams(codec); hda_set_power_state(codec, codec->afg ? codec->afg : codec->mfg, AC_PWRST_D3); @@ -3377,6 +3482,35 @@ static int set_pcm_default_values(struct hda_codec *codec, return 0; } +/* + * codec prepare/cleanup entries + */ +int snd_hda_codec_prepare(struct hda_codec *codec, + struct hda_pcm_stream *hinfo, + unsigned int stream, + unsigned int format, + struct snd_pcm_substream *substream) +{ + int ret; + mutex_lock(&codec->prepare_mutex); + ret = hinfo->ops.prepare(hinfo, codec, stream, format, substream); + if (ret >= 0) + purify_inactive_streams(codec); + mutex_unlock(&codec->prepare_mutex); + return ret; +} +EXPORT_SYMBOL_HDA(snd_hda_codec_prepare); + +void snd_hda_codec_cleanup(struct hda_codec *codec, + struct hda_pcm_stream *hinfo, + struct snd_pcm_substream *substream) +{ + mutex_lock(&codec->prepare_mutex); + hinfo->ops.cleanup(hinfo, codec, substream); + mutex_unlock(&codec->prepare_mutex); +} +EXPORT_SYMBOL_HDA(snd_hda_codec_cleanup); + /* global */ const char *snd_hda_pcm_type_name[HDA_PCM_NTYPES] = { "Audio", "SPDIF", "HDMI", "Modem" diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 0328cf55cdba..3f7a479881e5 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h @@ -826,12 +826,14 @@ struct hda_codec { struct mutex spdif_mutex; struct mutex control_mutex; + struct mutex prepare_mutex; unsigned int spdif_status; /* IEC958 status bits */ unsigned short spdif_ctls; /* SPDIF control bits */ unsigned int spdif_in_enable; /* SPDIF input enable? */ hda_nid_t *slave_dig_outs; /* optional digital out slave widgets */ struct snd_array init_pins; /* initial (BIOS) pin configurations */ struct snd_array driver_pins; /* pin configs set by codec parser */ + struct snd_array cvt_setups; /* audio convert setups */ #ifdef CONFIG_SND_HDA_HWDEP struct snd_hwdep *hwdep; /* assigned hwdep device */ @@ -948,6 +950,16 @@ int snd_hda_codec_build_controls(struct hda_codec *codec); */ int snd_hda_build_pcms(struct hda_bus *bus); int snd_hda_codec_build_pcms(struct hda_codec *codec); + +int snd_hda_codec_prepare(struct hda_codec *codec, + struct hda_pcm_stream *hinfo, + unsigned int stream, + unsigned int format, + struct snd_pcm_substream *substream); +void snd_hda_codec_cleanup(struct hda_codec *codec, + struct hda_pcm_stream *hinfo, + struct snd_pcm_substream *substream); + void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, u32 stream_tag, int channel_id, int format); diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 66d420212d9a..1053fff4bd0a 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -1634,7 +1634,7 @@ static int azx_pcm_hw_free(struct snd_pcm_substream *substream) azx_dev->period_bytes = 0; azx_dev->format_val = 0; - hinfo->ops.cleanup(hinfo, apcm->codec, substream); + snd_hda_codec_cleanup(apcm->codec, hinfo, substream); return snd_pcm_lib_free_pages(substream); } @@ -1688,8 +1688,8 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) else azx_dev->fifo_size = 0; - return hinfo->ops.prepare(hinfo, apcm->codec, azx_dev->stream_tag, - azx_dev->format_val, substream); + return snd_hda_codec_prepare(apcm->codec, hinfo, azx_dev->stream_tag, + azx_dev->format_val, substream); } static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -- cgit v1.2.3 From 2dc11581376829303b98eadb2de253bee065a56a Mon Sep 17 00:00:00 2001 From: Grant Likely Date: Fri, 6 Aug 2010 09:25:50 -0600 Subject: of/device: Replace struct of_device with struct platform_device of_device is just an alias for platform_device, so remove it entirely. Also replace to_of_device() with to_platform_device() and update comment blocks. This patch was initially generated from the following semantic patch, and then edited by hand to pick up the bits that coccinelle didn't catch. @@ @@ -struct of_device +struct platform_device Signed-off-by: Grant Likely Reviewed-by: David S. Miller --- sound/aoa/soundbus/core.c | 2 +- sound/aoa/soundbus/soundbus.h | 2 +- sound/aoa/soundbus/sysfs.c | 2 +- sound/soc/fsl/mpc5200_dma.c | 4 ++-- sound/soc/fsl/mpc5200_dma.h | 4 ++-- sound/soc/fsl/mpc5200_psc_ac97.c | 4 ++-- sound/soc/fsl/mpc5200_psc_i2s.c | 4 ++-- sound/soc/fsl/mpc8610_hpcd.c | 4 ++-- sound/sparc/amd7930.c | 8 ++++---- sound/sparc/cs4231.c | 18 +++++++++--------- sound/sparc/dbri.c | 8 ++++---- 11 files changed, 30 insertions(+), 30 deletions(-) (limited to 'sound') diff --git a/sound/aoa/soundbus/core.c b/sound/aoa/soundbus/core.c index 99ca7120e269..7487eb76e034 100644 --- a/sound/aoa/soundbus/core.c +++ b/sound/aoa/soundbus/core.c @@ -59,7 +59,7 @@ static int soundbus_probe(struct device *dev) static int soundbus_uevent(struct device *dev, struct kobj_uevent_env *env) { struct soundbus_dev * soundbus_dev; - struct of_device * of; + struct platform_device * of; const char *compat; int retval = 0; int cplen, seen = 0; diff --git a/sound/aoa/soundbus/soundbus.h b/sound/aoa/soundbus/soundbus.h index a0f223c13f66..adecbf36f4f6 100644 --- a/sound/aoa/soundbus/soundbus.h +++ b/sound/aoa/soundbus/soundbus.h @@ -141,7 +141,7 @@ struct soundbus_dev { struct list_head onbuslist; /* the of device it represents */ - struct of_device ofdev; + struct platform_device ofdev; /* what modules go by */ char modalias[32]; diff --git a/sound/aoa/soundbus/sysfs.c b/sound/aoa/soundbus/sysfs.c index 6496e754f00a..e0980b5c2cd8 100644 --- a/sound/aoa/soundbus/sysfs.c +++ b/sound/aoa/soundbus/sysfs.c @@ -16,7 +16,7 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf) { struct soundbus_dev *sdev = to_soundbus_device(dev); - struct of_device *of = &sdev->ofdev; + struct platform_device *of = &sdev->ofdev; int length; if (*sdev->modalias) { diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c index 1d4e7164e80a..3dcd1469f283 100644 --- a/sound/soc/fsl/mpc5200_dma.c +++ b/sound/soc/fsl/mpc5200_dma.c @@ -369,7 +369,7 @@ struct snd_soc_platform mpc5200_audio_dma_platform = { }; EXPORT_SYMBOL_GPL(mpc5200_audio_dma_platform); -int mpc5200_audio_dma_create(struct of_device *op) +int mpc5200_audio_dma_create(struct platform_device *op) { phys_addr_t fifo; struct psc_dma *psc_dma; @@ -488,7 +488,7 @@ out_unmap: } EXPORT_SYMBOL_GPL(mpc5200_audio_dma_create); -int mpc5200_audio_dma_destroy(struct of_device *op) +int mpc5200_audio_dma_destroy(struct platform_device *op) { struct psc_dma *psc_dma = dev_get_drvdata(&op->dev); diff --git a/sound/soc/fsl/mpc5200_dma.h b/sound/soc/fsl/mpc5200_dma.h index e1ec6d91ea38..ca99586f2ad9 100644 --- a/sound/soc/fsl/mpc5200_dma.h +++ b/sound/soc/fsl/mpc5200_dma.h @@ -81,8 +81,8 @@ to_psc_dma_stream(struct snd_pcm_substream *substream, struct psc_dma *psc_dma) return &psc_dma->playback; } -int mpc5200_audio_dma_create(struct of_device *op); -int mpc5200_audio_dma_destroy(struct of_device *op); +int mpc5200_audio_dma_create(struct platform_device *op); +int mpc5200_audio_dma_destroy(struct platform_device *op); extern struct snd_soc_platform mpc5200_audio_dma_platform; diff --git a/sound/soc/fsl/mpc5200_psc_ac97.c b/sound/soc/fsl/mpc5200_psc_ac97.c index e2ee220bfb7e..a0310170a170 100644 --- a/sound/soc/fsl/mpc5200_psc_ac97.c +++ b/sound/soc/fsl/mpc5200_psc_ac97.c @@ -263,7 +263,7 @@ EXPORT_SYMBOL_GPL(psc_ac97_dai); * - Probe/remove operations * - OF device match table */ -static int __devinit psc_ac97_of_probe(struct of_device *op, +static int __devinit psc_ac97_of_probe(struct platform_device *op, const struct of_device_id *match) { int rc, i; @@ -303,7 +303,7 @@ static int __devinit psc_ac97_of_probe(struct of_device *op, return 0; } -static int __devexit psc_ac97_of_remove(struct of_device *op) +static int __devexit psc_ac97_of_remove(struct platform_device *op) { return mpc5200_audio_dma_destroy(op); } diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_psc_i2s.c index 4f455bd6851f..9aee748eca7d 100644 --- a/sound/soc/fsl/mpc5200_psc_i2s.c +++ b/sound/soc/fsl/mpc5200_psc_i2s.c @@ -153,7 +153,7 @@ EXPORT_SYMBOL_GPL(psc_i2s_dai); * - Probe/remove operations * - OF device match table */ -static int __devinit psc_i2s_of_probe(struct of_device *op, +static int __devinit psc_i2s_of_probe(struct platform_device *op, const struct of_device_id *match) { int rc; @@ -206,7 +206,7 @@ static int __devinit psc_i2s_of_probe(struct of_device *op, } -static int __devexit psc_i2s_of_remove(struct of_device *op) +static int __devexit psc_i2s_of_remove(struct platform_device *op) { return mpc5200_audio_dma_destroy(op); } diff --git a/sound/soc/fsl/mpc8610_hpcd.c b/sound/soc/fsl/mpc8610_hpcd.c index 3a501062c244..3b13b8d65262 100644 --- a/sound/soc/fsl/mpc8610_hpcd.c +++ b/sound/soc/fsl/mpc8610_hpcd.c @@ -200,7 +200,7 @@ static struct snd_soc_ops mpc8610_hpcd_ops = { * SSI devices. We also probably aren't compatible with the generic Elo DMA * device driver. */ -static int mpc8610_hpcd_probe(struct of_device *ofdev, +static int mpc8610_hpcd_probe(struct platform_device *ofdev, const struct of_device_id *match) { struct device_node *np = ofdev->dev.of_node; @@ -534,7 +534,7 @@ error: * * This function is called when the OF device is removed. */ -static int mpc8610_hpcd_remove(struct of_device *ofdev) +static int mpc8610_hpcd_remove(struct platform_device *ofdev) { struct platform_device *sound_device = dev_get_drvdata(&ofdev->dev); struct mpc8610_hpcd_data *machine_data = diff --git a/sound/sparc/amd7930.c b/sound/sparc/amd7930.c index 9eb1a4e0363b..f8bcfc30f800 100644 --- a/sound/sparc/amd7930.c +++ b/sound/sparc/amd7930.c @@ -336,7 +336,7 @@ struct snd_amd7930 { int pgain; int mgain; - struct of_device *op; + struct platform_device *op; unsigned int irq; struct snd_amd7930 *next; }; @@ -906,7 +906,7 @@ static int __devinit snd_amd7930_mixer(struct snd_amd7930 *amd) static int snd_amd7930_free(struct snd_amd7930 *amd) { - struct of_device *op = amd->op; + struct platform_device *op = amd->op; amd7930_idle(amd); @@ -934,7 +934,7 @@ static struct snd_device_ops snd_amd7930_dev_ops = { }; static int __devinit snd_amd7930_create(struct snd_card *card, - struct of_device *op, + struct platform_device *op, int irq, int dev, struct snd_amd7930 **ramd) { @@ -1002,7 +1002,7 @@ static int __devinit snd_amd7930_create(struct snd_card *card, return 0; } -static int __devinit amd7930_sbus_probe(struct of_device *op, const struct of_device_id *match) +static int __devinit amd7930_sbus_probe(struct platform_device *op, const struct of_device_id *match) { struct resource *rp = &op->resource[0]; static int dev_num; diff --git a/sound/sparc/cs4231.c b/sound/sparc/cs4231.c index 68570ee2c9bb..c276086c3b57 100644 --- a/sound/sparc/cs4231.c +++ b/sound/sparc/cs4231.c @@ -111,7 +111,7 @@ struct snd_cs4231 { struct mutex mce_mutex; /* mutex for mce register */ struct mutex open_mutex; /* mutex for ALSA open/close */ - struct of_device *op; + struct platform_device *op; unsigned int irq[2]; unsigned int regs_size; struct snd_cs4231 *next; @@ -1771,7 +1771,7 @@ static unsigned int sbus_dma_addr(struct cs4231_dma_control *dma_cont) static int snd_cs4231_sbus_free(struct snd_cs4231 *chip) { - struct of_device *op = chip->op; + struct platform_device *op = chip->op; if (chip->irq[0]) free_irq(chip->irq[0], chip); @@ -1794,7 +1794,7 @@ static struct snd_device_ops snd_cs4231_sbus_dev_ops = { }; static int __devinit snd_cs4231_sbus_create(struct snd_card *card, - struct of_device *op, + struct platform_device *op, int dev) { struct snd_cs4231 *chip = card->private_data; @@ -1856,7 +1856,7 @@ static int __devinit snd_cs4231_sbus_create(struct snd_card *card, return 0; } -static int __devinit cs4231_sbus_probe(struct of_device *op, const struct of_device_id *match) +static int __devinit cs4231_sbus_probe(struct platform_device *op, const struct of_device_id *match) { struct resource *rp = &op->resource[0]; struct snd_card *card; @@ -1931,7 +1931,7 @@ static unsigned int _ebus_dma_addr(struct cs4231_dma_control *dma_cont) static int snd_cs4231_ebus_free(struct snd_cs4231 *chip) { - struct of_device *op = chip->op; + struct platform_device *op = chip->op; if (chip->c_dma.ebus_info.regs) { ebus_dma_unregister(&chip->c_dma.ebus_info); @@ -1960,7 +1960,7 @@ static struct snd_device_ops snd_cs4231_ebus_dev_ops = { }; static int __devinit snd_cs4231_ebus_create(struct snd_card *card, - struct of_device *op, + struct platform_device *op, int dev) { struct snd_cs4231 *chip = card->private_data; @@ -2048,7 +2048,7 @@ static int __devinit snd_cs4231_ebus_create(struct snd_card *card, return 0; } -static int __devinit cs4231_ebus_probe(struct of_device *op, const struct of_device_id *match) +static int __devinit cs4231_ebus_probe(struct platform_device *op, const struct of_device_id *match) { struct snd_card *card; int err; @@ -2072,7 +2072,7 @@ static int __devinit cs4231_ebus_probe(struct of_device *op, const struct of_dev } #endif -static int __devinit cs4231_probe(struct of_device *op, const struct of_device_id *match) +static int __devinit cs4231_probe(struct platform_device *op, const struct of_device_id *match) { #ifdef EBUS_SUPPORT if (!strcmp(op->dev.of_node->parent->name, "ebus")) @@ -2086,7 +2086,7 @@ static int __devinit cs4231_probe(struct of_device *op, const struct of_device_i return -ENODEV; } -static int __devexit cs4231_remove(struct of_device *op) +static int __devexit cs4231_remove(struct platform_device *op) { struct snd_cs4231 *chip = dev_get_drvdata(&op->dev); diff --git a/sound/sparc/dbri.c b/sound/sparc/dbri.c index c421901c48d0..39cd5d69d051 100644 --- a/sound/sparc/dbri.c +++ b/sound/sparc/dbri.c @@ -299,7 +299,7 @@ struct dbri_streaminfo { /* This structure holds the information for both chips (DBRI & CS4215) */ struct snd_dbri { int regs_size, irq; /* Needed for unload */ - struct of_device *op; /* OF device info */ + struct platform_device *op; /* OF device info */ spinlock_t lock; struct dbri_dma *dma; /* Pointer to our DMA block */ @@ -2523,7 +2523,7 @@ static void __devinit snd_dbri_proc(struct snd_card *card) static void snd_dbri_free(struct snd_dbri *dbri); static int __devinit snd_dbri_create(struct snd_card *card, - struct of_device *op, + struct platform_device *op, int irq, int dev) { struct snd_dbri *dbri = card->private_data; @@ -2592,7 +2592,7 @@ static void snd_dbri_free(struct snd_dbri *dbri) (void *)dbri->dma, dbri->dma_dvma); } -static int __devinit dbri_probe(struct of_device *op, const struct of_device_id *match) +static int __devinit dbri_probe(struct platform_device *op, const struct of_device_id *match) { struct snd_dbri *dbri; struct resource *rp; @@ -2662,7 +2662,7 @@ _err: return err; } -static int __devexit dbri_remove(struct of_device *op) +static int __devexit dbri_remove(struct platform_device *op) { struct snd_card *card = dev_get_drvdata(&op->dev); -- cgit v1.2.3 From 949ad0a783729ad8c2e8e5bcbbad5d05a60de616 Mon Sep 17 00:00:00 2001 From: Eric Millbrandt Date: Fri, 6 Aug 2010 20:49:19 -0600 Subject: sound/soc: mpc5200_psc_ac97: Use gpio pins for cold reset Call the gpio reset platform function instead of using the flawed ac97 functionality of the MPC5200(b) From MPC5200B User's Manual: "Some AC97 devices goes to a test mode, if the Sync line is high during the Res line is low (reset phase). To avoid this behavior the Sync line must be also forced to zero during the reset phase. To do that, the pin muxing should switch to GPIO mode and the GPIO control register should be used to control the output lines." Signed-off-by: Eric Millbrandt Signed-off-by: Grant Likely --- sound/soc/fsl/mpc5200_psc_ac97.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/fsl/mpc5200_psc_ac97.c b/sound/soc/fsl/mpc5200_psc_ac97.c index e2ee220bfb7e..e7f5d50ed084 100644 --- a/sound/soc/fsl/mpc5200_psc_ac97.c +++ b/sound/soc/fsl/mpc5200_psc_ac97.c @@ -20,6 +20,7 @@ #include #include +#include #include #include "mpc5200_dma.h" @@ -100,19 +101,32 @@ static void psc_ac97_warm_reset(struct snd_ac97 *ac97) { struct mpc52xx_psc __iomem *regs = psc_dma->psc_regs; + mutex_lock(&psc_dma->mutex); + out_be32(®s->sicr, psc_dma->sicr | MPC52xx_PSC_SICR_AWR); udelay(3); out_be32(®s->sicr, psc_dma->sicr); + + mutex_unlock(&psc_dma->mutex); } static void psc_ac97_cold_reset(struct snd_ac97 *ac97) { struct mpc52xx_psc __iomem *regs = psc_dma->psc_regs; - /* Do a cold reset */ - out_8(®s->op1, MPC52xx_PSC_OP_RES); - udelay(10); - out_8(®s->op0, MPC52xx_PSC_OP_RES); + mutex_lock(&psc_dma->mutex); + dev_dbg(psc_dma->dev, "cold reset\n"); + + mpc5200_psc_ac97_gpio_reset(psc_dma->id); + + /* Notify the PSC that a reset has occurred */ + out_be32(®s->sicr, psc_dma->sicr | MPC52xx_PSC_SICR_ACRB); + + /* Re-enable RX and TX */ + out_8(®s->command, MPC52xx_PSC_TX_ENABLE | MPC52xx_PSC_RX_ENABLE); + + mutex_unlock(&psc_dma->mutex); + msleep(1); psc_ac97_warm_reset(ac97); } -- cgit v1.2.3 From 53bacfbbb2ddd981287b58a511c8b8f5df179886 Mon Sep 17 00:00:00 2001 From: Jonathan Woithe Date: Sun, 8 Aug 2010 00:17:05 +0930 Subject: ALSA: hda - Fix missing stream for second ADC on Realtek ALC260 HDA codec I discovered tonight that ALSA no longer sets up a stream for the second ADC provided by the Realtek ALC260 HDA codec. At some point alc_build_pcms() started using stream_analog_alt_capture when constructing the second ADC stream, but patch_alc260() was never updated accordingly. I have no idea when this regression occurred. The trivial patch to patch_alc260() given below fixes the problem as far as I can tell. The patch is against 2.6.35. Signed-off-by: Jonathan Woithe Cc: Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 2891571e7647..6b00a2369e97 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -7042,6 +7042,7 @@ static int patch_alc260(struct hda_codec *codec) spec->stream_analog_playback = &alc260_pcm_analog_playback; spec->stream_analog_capture = &alc260_pcm_analog_capture; + spec->stream_analog_alt_capture = &alc260_pcm_analog_capture; spec->stream_digital_playback = &alc260_pcm_digital_playback; spec->stream_digital_capture = &alc260_pcm_digital_capture; -- cgit v1.2.3 From 48315590186f0f9f5653dd7c35623e66ca4dd91a Mon Sep 17 00:00:00 2001 From: Steven Eastland Date: Fri, 6 Aug 2010 15:07:35 -0600 Subject: ALSA: hda - New snd-hda-intel model/pin config for hp dv7-4000 This provides a new model and pin config for the snd-hda-intel 92HD83XXX codec for hp laptop model dv7-4000, enabling the subwoofer. Signed-off-by: Steven Eastland Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_sigmatel.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index b8d730c47df1..a664367ad65c 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -94,6 +94,7 @@ enum { STAC_92HD83XXX_PWR_REF, STAC_DELL_S14, STAC_92HD83XXX_HP, + STAC_HP_DV7_4000, STAC_92HD83XXX_MODELS }; @@ -1632,10 +1633,17 @@ static unsigned int dell_s14_pin_configs[10] = { 0x40f000f0, 0x40f000f0, }; +static unsigned int hp_dv7_4000_pin_configs[10] = { + 0x03a12050, 0x0321201f, 0x40f000f0, 0x90170110, + 0x40f000f0, 0x40f000f0, 0x90170110, 0xd5a30140, + 0x40f000f0, 0x40f000f0, +}; + static unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = { [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs, [STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs, [STAC_DELL_S14] = dell_s14_pin_configs, + [STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs, }; static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = { @@ -1644,6 +1652,7 @@ static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = { [STAC_92HD83XXX_PWR_REF] = "mic-ref", [STAC_DELL_S14] = "dell-s14", [STAC_92HD83XXX_HP] = "hp", + [STAC_HP_DV7_4000] = "hp-dv7-4000", }; static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = { -- cgit v1.2.3 From 850eab9d1b74f4ec9de16df68f008d0a65aafae7 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 9 Aug 2010 13:44:27 +0200 Subject: ALSA: hda - add support for Conexant CX20584 The Conexant CX20584 with 141f:5068 seems compatible with other cxt5066 code. Just add the missing id. Tested-by: Cristopher Camacho Leandro Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_conexant.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index df8b19b17308..f7e234e5ee96 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -3206,6 +3206,8 @@ static struct hda_codec_preset snd_hda_preset_conexant[] = { .patch = patch_cxt5066 }, { .id = 0x14f15067, .name = "CX20583 (Pebble HSF)", .patch = patch_cxt5066 }, + { .id = 0x14f15068, .name = "CX20584", + .patch = patch_cxt5066 }, { .id = 0x14f15069, .name = "CX20585", .patch = patch_cxt5066 }, {} /* terminator */ @@ -3216,6 +3218,7 @@ MODULE_ALIAS("snd-hda-codec-id:14f15047"); MODULE_ALIAS("snd-hda-codec-id:14f15051"); MODULE_ALIAS("snd-hda-codec-id:14f15066"); MODULE_ALIAS("snd-hda-codec-id:14f15067"); +MODULE_ALIAS("snd-hda-codec-id:14f15068"); MODULE_ALIAS("snd-hda-codec-id:14f15069"); MODULE_LICENSE("GPL"); -- cgit v1.2.3 From 597603d615d2b19a9e451d8cfac24372856a522d Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 9 Aug 2010 14:21:11 +0200 Subject: ALSA: introduce the snd-aloop module for the PCM loopback The snd-aloop module allows redirecting of the PCM playback in the kernel back to the user space using the standard ALSA PCM capture API. The module also allows time synchronization with another timing source and notifications of playback stream parameter changes. Signed-off-by: Jaroslav Kysela --- sound/drivers/Kconfig | 19 + sound/drivers/Makefile | 2 + sound/drivers/aloop.c | 1055 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1076 insertions(+) create mode 100644 sound/drivers/aloop.c (limited to 'sound') diff --git a/sound/drivers/Kconfig b/sound/drivers/Kconfig index 84714a65e5c8..b6ae76285255 100644 --- a/sound/drivers/Kconfig +++ b/sound/drivers/Kconfig @@ -74,6 +74,25 @@ config SND_DUMMY To compile this driver as a module, choose M here: the module will be called snd-dummy. +config SND_ALOOP + tristate "Generic loopback driver (PCM)" + select SND_PCM + help + Say 'Y' or 'M' to include support for the PCM loopback device. + This module returns played samples back to the user space using + the standard ALSA PCM device. The devices are routed 0->1 and + 1->0, where first number is the playback PCM device and second + number is the capture device. Module creates two PCM devices and + configured number of substreams (see the pcm_substreams module + parameter). + + The looback device allow time sychronization with an external + timing source using the time shift universal control (+-20% + of system time). + + To compile this driver as a module, choose M here: the module + will be called snd-aloop. + config SND_VIRMIDI tristate "Virtual MIDI soundcard" depends on SND_SEQUENCER diff --git a/sound/drivers/Makefile b/sound/drivers/Makefile index d4a07f9ff2c7..1a8440c8b138 100644 --- a/sound/drivers/Makefile +++ b/sound/drivers/Makefile @@ -4,6 +4,7 @@ # snd-dummy-objs := dummy.o +snd-aloop-objs := aloop.o snd-mtpav-objs := mtpav.o snd-mts64-objs := mts64.o snd-portman2x4-objs := portman2x4.o @@ -13,6 +14,7 @@ snd-ml403-ac97cr-objs := ml403-ac97cr.o pcm-indirect2.o # Toplevel Module Dependency obj-$(CONFIG_SND_DUMMY) += snd-dummy.o +obj-$(CONFIG_SND_ALOOP) += snd-aloop.o obj-$(CONFIG_SND_VIRMIDI) += snd-virmidi.o obj-$(CONFIG_SND_SERIAL_U16550) += snd-serial-u16550.o obj-$(CONFIG_SND_MTPAV) += snd-mtpav.o diff --git a/sound/drivers/aloop.c b/sound/drivers/aloop.c new file mode 100644 index 000000000000..3123a15d23f6 --- /dev/null +++ b/sound/drivers/aloop.c @@ -0,0 +1,1055 @@ +/* + * Loopback soundcard + * + * Original code: + * Copyright (c) by Jaroslav Kysela + * + * More accurate positioning and full-duplex support: + * Copyright (c) Ahmet Ä°nan + * + * Major (almost complete) rewrite: + * Copyright (c) by Takashi Iwai + * + * A next major update in 2010 (separate timers for playback and capture): + * Copyright (c) Jaroslav Kysela + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Jaroslav Kysela "); +MODULE_DESCRIPTION("A loopback soundcard"); +MODULE_LICENSE("GPL"); +MODULE_SUPPORTED_DEVICE("{{ALSA,Loopback soundcard}}"); + +#define MAX_PCM_SUBSTREAMS 8 + +static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ +static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ +static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0}; +static int pcm_substreams[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 8}; +static int pcm_notify[SNDRV_CARDS]; + +module_param_array(index, int, NULL, 0444); +MODULE_PARM_DESC(index, "Index value for loopback soundcard."); +module_param_array(id, charp, NULL, 0444); +MODULE_PARM_DESC(id, "ID string for loopback soundcard."); +module_param_array(enable, bool, NULL, 0444); +MODULE_PARM_DESC(enable, "Enable this loopback soundcard."); +module_param_array(pcm_substreams, int, NULL, 0444); +MODULE_PARM_DESC(pcm_substreams, "PCM substreams # (1-8) for loopback driver."); +module_param_array(pcm_notify, int, NULL, 0444); +MODULE_PARM_DESC(pcm_notify, "Break capture when PCM format/rate/channels changes."); + +#define NO_PITCH 100000 + +struct loopback_pcm; + +struct loopback_cable { + spinlock_t lock; + struct loopback_pcm *streams[2]; + struct snd_pcm_hardware hw; + /* flags */ + unsigned int valid; + unsigned int running; +}; + +struct loopback_setup { + unsigned int notify: 1; + unsigned int rate_shift; + unsigned int format; + unsigned int rate; + unsigned int channels; + struct snd_ctl_elem_id active_id; + struct snd_ctl_elem_id format_id; + struct snd_ctl_elem_id rate_id; + struct snd_ctl_elem_id channels_id; +}; + +struct loopback { + struct snd_card *card; + struct mutex cable_lock; + struct loopback_cable *cables[MAX_PCM_SUBSTREAMS][2]; + struct snd_pcm *pcm[2]; + struct loopback_setup setup[MAX_PCM_SUBSTREAMS][2]; +}; + +struct loopback_pcm { + struct loopback *loopback; + struct snd_pcm_substream *substream; + struct loopback_cable *cable; + unsigned int pcm_buffer_size; + unsigned int buf_pos; /* position in buffer */ + unsigned int silent_size; + /* PCM parameters */ + unsigned int pcm_period_size; + unsigned int pcm_bps; /* bytes per second */ + unsigned int pcm_salign; /* bytes per sample * channels */ + unsigned int pcm_rate_shift; /* rate shift value */ + /* flags */ + unsigned int period_update_pending :1; + /* timer stuff */ + unsigned int irq_pos; /* fractional IRQ position */ + unsigned int period_size_frac; + unsigned long last_jiffies; + struct timer_list timer; +}; + +static struct platform_device *devices[SNDRV_CARDS]; + +static inline unsigned int byte_pos(struct loopback_pcm *dpcm, unsigned int x) +{ + if (dpcm->pcm_rate_shift == NO_PITCH) { + x /= HZ; + } else { + x = div_u64(NO_PITCH * (unsigned long long)x, + HZ * (unsigned long long)dpcm->pcm_rate_shift); + } + return x - (x % dpcm->pcm_salign); +} + +static inline unsigned int frac_pos(struct loopback_pcm *dpcm, unsigned int x) +{ + if (dpcm->pcm_rate_shift == NO_PITCH) { /* no pitch */ + return x * HZ; + } else { + x = div_u64(dpcm->pcm_rate_shift * (unsigned long long)x * HZ, + NO_PITCH); + } + return x; +} + +static inline struct loopback_setup *get_setup(struct loopback_pcm *dpcm) +{ + int device = dpcm->substream->pstr->pcm->device; + + if (dpcm->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + device ^= 1; + return &dpcm->loopback->setup[dpcm->substream->number][device]; +} + +static inline unsigned int get_notify(struct loopback_pcm *dpcm) +{ + return get_setup(dpcm)->notify; +} + +static inline unsigned int get_rate_shift(struct loopback_pcm *dpcm) +{ + return get_setup(dpcm)->rate_shift; +} + +static void loopback_timer_start(struct loopback_pcm *dpcm) +{ + unsigned long tick; + unsigned int rate_shift = get_rate_shift(dpcm); + + if (rate_shift != dpcm->pcm_rate_shift) { + dpcm->pcm_rate_shift = rate_shift; + dpcm->period_size_frac = frac_pos(dpcm, dpcm->pcm_period_size); + } + tick = dpcm->period_size_frac - dpcm->irq_pos; + tick = (tick + dpcm->pcm_bps - 1) / dpcm->pcm_bps; + dpcm->timer.expires = jiffies + tick; + add_timer(&dpcm->timer); +} + +static inline void loopback_timer_stop(struct loopback_pcm *dpcm) +{ + del_timer(&dpcm->timer); +} + +#define CABLE_VALID_PLAYBACK (1 << SNDRV_PCM_STREAM_PLAYBACK) +#define CABLE_VALID_CAPTURE (1 << SNDRV_PCM_STREAM_CAPTURE) +#define CABLE_VALID_BOTH (CABLE_VALID_PLAYBACK|CABLE_VALID_CAPTURE) + +static int loopback_check_format(struct loopback_cable *cable, int stream) +{ + struct snd_pcm_runtime *runtime; + struct loopback_setup *setup; + struct snd_card *card; + int check; + + if (cable->valid != CABLE_VALID_BOTH) { + if (stream == SNDRV_PCM_STREAM_PLAYBACK) + goto __notify; + return 0; + } + runtime = cable->streams[SNDRV_PCM_STREAM_PLAYBACK]-> + substream->runtime; + check = cable->hw.formats != (1ULL << runtime->format) || + cable->hw.rate_min != runtime->rate || + cable->hw.rate_max != runtime->rate || + cable->hw.channels_min != runtime->channels || + cable->hw.channels_max != runtime->channels; + if (!check) + return 0; + if (stream == SNDRV_PCM_STREAM_CAPTURE) { + return -EIO; + } else { + snd_pcm_stop(cable->streams[SNDRV_PCM_STREAM_CAPTURE]-> + substream, SNDRV_PCM_STATE_DRAINING); + __notify: + runtime = cable->streams[SNDRV_PCM_STREAM_PLAYBACK]-> + substream->runtime; + setup = get_setup(cable->streams[SNDRV_PCM_STREAM_PLAYBACK]); + card = cable->streams[SNDRV_PCM_STREAM_PLAYBACK]->loopback->card; + if (setup->format != runtime->format) { + snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, + &setup->format_id); + setup->format = runtime->format; + } + if (setup->rate != runtime->rate) { + snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, + &setup->rate_id); + setup->rate = runtime->rate; + } + if (setup->channels != runtime->channels) { + snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, + &setup->channels_id); + setup->channels = runtime->channels; + } + } + return 0; +} + +static void loopback_active_notify(struct loopback_pcm *dpcm) +{ + snd_ctl_notify(dpcm->loopback->card, + SNDRV_CTL_EVENT_MASK_VALUE, + &get_setup(dpcm)->active_id); +} + +static int loopback_trigger(struct snd_pcm_substream *substream, int cmd) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct loopback_pcm *dpcm = runtime->private_data; + struct loopback_cable *cable = dpcm->cable; + int err; + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + err = loopback_check_format(cable, substream->stream); + if (err < 0) + return err; + dpcm->last_jiffies = jiffies; + dpcm->pcm_rate_shift = 0; + loopback_timer_start(dpcm); + cable->running |= (1 << substream->stream); + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + loopback_active_notify(dpcm); + break; + case SNDRV_PCM_TRIGGER_STOP: + cable->running &= ~(1 << substream->stream); + loopback_timer_stop(dpcm); + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + loopback_active_notify(dpcm); + break; + default: + return -EINVAL; + } + return 0; +} + +static int loopback_prepare(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct loopback_pcm *dpcm = runtime->private_data; + struct loopback_cable *cable = dpcm->cable; + unsigned int bps, salign; + + salign = (snd_pcm_format_width(runtime->format) * + runtime->channels) / 8; + bps = salign * runtime->rate; + if (bps <= 0 || salign <= 0) + return -EINVAL; + + dpcm->buf_pos = 0; + dpcm->pcm_buffer_size = frames_to_bytes(runtime, runtime->buffer_size); + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { + /* clear capture buffer */ + dpcm->silent_size = dpcm->pcm_buffer_size; + snd_pcm_format_set_silence(runtime->format, runtime->dma_area, + runtime->buffer_size * runtime->channels); + } + + dpcm->irq_pos = 0; + dpcm->period_update_pending = 0; + dpcm->pcm_bps = bps; + dpcm->pcm_salign = salign; + dpcm->pcm_period_size = frames_to_bytes(runtime, runtime->period_size); + + mutex_lock(&dpcm->loopback->cable_lock); + if (!(cable->valid & ~(1 << substream->stream))) { + cable->hw.formats = (1ULL << runtime->format); + cable->hw.rate_min = runtime->rate; + cable->hw.rate_max = runtime->rate; + cable->hw.channels_min = runtime->channels; + cable->hw.channels_max = runtime->channels; + } + cable->valid |= 1 << substream->stream; + mutex_unlock(&dpcm->loopback->cable_lock); + + return 0; +} + +static void clear_capture_buf(struct loopback_pcm *dpcm, unsigned int bytes) +{ + struct snd_pcm_runtime *runtime = dpcm->substream->runtime; + char *dst = runtime->dma_area; + unsigned int dst_off = dpcm->buf_pos; + + if (dpcm->silent_size >= dpcm->pcm_buffer_size) + return; + if (dpcm->silent_size + bytes > dpcm->pcm_buffer_size) + bytes = dpcm->pcm_buffer_size - dpcm->silent_size; + + for (;;) { + unsigned int size = bytes; + if (dst_off + size > dpcm->pcm_buffer_size) + size = dpcm->pcm_buffer_size - dst_off; + snd_pcm_format_set_silence(runtime->format, dst + dst_off, + bytes_to_frames(runtime, size) * + runtime->channels); + dpcm->silent_size += size; + bytes -= size; + if (!bytes) + break; + dst_off = 0; + } +} + +static void copy_play_buf(struct loopback_pcm *play, + struct loopback_pcm *capt, + unsigned int bytes) +{ + struct snd_pcm_runtime *runtime = play->substream->runtime; + char *src = play->substream->runtime->dma_area; + char *dst = capt->substream->runtime->dma_area; + unsigned int src_off = play->buf_pos; + unsigned int dst_off = capt->buf_pos; + unsigned int clear_bytes = 0; + + /* check if playback is draining, trim the capture copy size + * when our pointer is at the end of playback ring buffer */ + if (runtime->status->state == SNDRV_PCM_STATE_DRAINING && + snd_pcm_playback_hw_avail(runtime) < runtime->buffer_size) { + snd_pcm_uframes_t appl_ptr, appl_ptr1, diff; + appl_ptr = appl_ptr1 = runtime->control->appl_ptr; + appl_ptr1 -= appl_ptr1 % runtime->buffer_size; + appl_ptr1 += play->buf_pos / play->pcm_salign; + if (appl_ptr < appl_ptr1) + appl_ptr1 -= runtime->buffer_size; + diff = (appl_ptr - appl_ptr1) * play->pcm_salign; + if (diff < bytes) { + clear_bytes = bytes - diff; + bytes = diff; + } + } + + for (;;) { + unsigned int size = bytes; + if (src_off + size > play->pcm_buffer_size) + size = play->pcm_buffer_size - src_off; + if (dst_off + size > capt->pcm_buffer_size) + size = capt->pcm_buffer_size - dst_off; + memcpy(dst + dst_off, src + src_off, size); + capt->silent_size = 0; + bytes -= size; + if (!bytes) + break; + src_off = (src_off + size) % play->pcm_buffer_size; + dst_off = (dst_off + size) % capt->pcm_buffer_size; + } + + if (clear_bytes > 0) + clear_capture_buf(capt, clear_bytes); +} + +#define BYTEPOS_UPDATE_POSONLY 0 +#define BYTEPOS_UPDATE_CLEAR 1 +#define BYTEPOS_UPDATE_COPY 2 + +static void loopback_bytepos_update(struct loopback_pcm *dpcm, + unsigned int delta, + unsigned int cmd) +{ + unsigned int count; + unsigned long last_pos; + + last_pos = byte_pos(dpcm, dpcm->irq_pos); + dpcm->irq_pos += delta * dpcm->pcm_bps; + count = byte_pos(dpcm, dpcm->irq_pos) - last_pos; + if (!count) + return; + if (cmd == BYTEPOS_UPDATE_CLEAR) + clear_capture_buf(dpcm, count); + else if (cmd == BYTEPOS_UPDATE_COPY) + copy_play_buf(dpcm->cable->streams[SNDRV_PCM_STREAM_PLAYBACK], + dpcm->cable->streams[SNDRV_PCM_STREAM_CAPTURE], + count); + dpcm->buf_pos += count; + dpcm->buf_pos %= dpcm->pcm_buffer_size; + if (dpcm->irq_pos >= dpcm->period_size_frac) { + dpcm->irq_pos %= dpcm->period_size_frac; + dpcm->period_update_pending = 1; + } +} + +static void loopback_pos_update(struct loopback_cable *cable) +{ + struct loopback_pcm *dpcm_play = + cable->streams[SNDRV_PCM_STREAM_PLAYBACK]; + struct loopback_pcm *dpcm_capt = + cable->streams[SNDRV_PCM_STREAM_CAPTURE]; + unsigned long delta_play = 0, delta_capt = 0; + + spin_lock(&cable->lock); + if (cable->running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) { + delta_play = jiffies - dpcm_play->last_jiffies; + dpcm_play->last_jiffies += delta_play; + } + + if (cable->running & (1 << SNDRV_PCM_STREAM_CAPTURE)) { + delta_capt = jiffies - dpcm_capt->last_jiffies; + dpcm_capt->last_jiffies += delta_capt; + } + + if (delta_play == 0 && delta_capt == 0) { + spin_unlock(&cable->lock); + return; + } + + if (delta_play > delta_capt) { + loopback_bytepos_update(dpcm_play, delta_play - delta_capt, + BYTEPOS_UPDATE_POSONLY); + delta_play = delta_capt; + } else if (delta_play < delta_capt) { + loopback_bytepos_update(dpcm_capt, delta_capt - delta_play, + BYTEPOS_UPDATE_CLEAR); + delta_capt = delta_play; + } + + if (delta_play == 0 && delta_capt == 0) { + spin_unlock(&cable->lock); + return; + } + /* note delta_capt == delta_play at this moment */ + loopback_bytepos_update(dpcm_capt, delta_capt, BYTEPOS_UPDATE_COPY); + loopback_bytepos_update(dpcm_play, delta_play, BYTEPOS_UPDATE_POSONLY); + spin_unlock(&cable->lock); +} + +static void loopback_timer_function(unsigned long data) +{ + struct loopback_pcm *dpcm = (struct loopback_pcm *)data; + int stream; + + loopback_pos_update(dpcm->cable); + stream = dpcm->substream->stream; + if (dpcm->cable->running & (1 << stream)) + loopback_timer_start(dpcm); + if (dpcm->period_update_pending) { + dpcm->period_update_pending = 0; + if (dpcm->cable->running & (1 << stream)) + snd_pcm_period_elapsed(dpcm->substream); + } +} + +static snd_pcm_uframes_t loopback_pointer(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct loopback_pcm *dpcm = runtime->private_data; + + loopback_pos_update(dpcm->cable); + return bytes_to_frames(runtime, dpcm->buf_pos); +} + +static struct snd_pcm_hardware loopback_pcm_hardware = +{ + .info = (SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_MMAP_VALID), + .formats = (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE | + SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S32_BE | + SNDRV_PCM_FMTBIT_FLOAT_LE | SNDRV_PCM_FMTBIT_FLOAT_BE), + .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_192000, + .rate_min = 8000, + .rate_max = 192000, + .channels_min = 1, + .channels_max = 32, + .buffer_bytes_max = 2 * 1024 * 1024, + .period_bytes_min = 64, + .period_bytes_max = 2 * 1024 * 1024, + .periods_min = 1, + .periods_max = 1024, + .fifo_size = 0, +}; + +static void loopback_runtime_free(struct snd_pcm_runtime *runtime) +{ + struct loopback_pcm *dpcm = runtime->private_data; + kfree(dpcm); +} + +static int loopback_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(params)); +} + +static int loopback_hw_free(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct loopback_pcm *dpcm = runtime->private_data; + struct loopback_cable *cable = dpcm->cable; + + mutex_lock(&dpcm->loopback->cable_lock); + cable->valid &= ~(1 << substream->stream); + mutex_unlock(&dpcm->loopback->cable_lock); + return snd_pcm_lib_free_pages(substream); +} + +static unsigned int get_cable_index(struct snd_pcm_substream *substream) +{ + if (!substream->pcm->device) + return substream->stream; + else + return !substream->stream; +} + +static int loopback_open(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct loopback *loopback = substream->private_data; + struct loopback_pcm *dpcm; + struct loopback_cable *cable; + int err = 0; + int dev = get_cable_index(substream); + + mutex_lock(&loopback->cable_lock); + dpcm = kzalloc(sizeof(*dpcm), GFP_KERNEL); + if (!dpcm) { + err = -ENOMEM; + goto unlock; + } + dpcm->loopback = loopback; + dpcm->substream = substream; + setup_timer(&dpcm->timer, loopback_timer_function, + (unsigned long)dpcm); + + cable = loopback->cables[substream->number][dev]; + if (!cable) { + cable = kzalloc(sizeof(*cable), GFP_KERNEL); + if (!cable) { + kfree(dpcm); + err = -ENOMEM; + goto unlock; + } + spin_lock_init(&cable->lock); + cable->hw = loopback_pcm_hardware; + loopback->cables[substream->number][dev] = cable; + } + dpcm->cable = cable; + cable->streams[substream->stream] = dpcm; + + snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); + + runtime->private_data = dpcm; + runtime->private_free = loopback_runtime_free; + if (get_notify(dpcm) && + substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + runtime->hw = loopback_pcm_hardware; + } else { + runtime->hw = cable->hw; + } + unlock: + mutex_unlock(&loopback->cable_lock); + return err; +} + +static int loopback_close(struct snd_pcm_substream *substream) +{ + struct loopback *loopback = substream->private_data; + struct loopback_pcm *dpcm = substream->runtime->private_data; + struct loopback_cable *cable; + int dev = get_cable_index(substream); + + loopback_timer_stop(dpcm); + mutex_lock(&loopback->cable_lock); + cable = loopback->cables[substream->number][dev]; + if (cable->streams[!substream->stream]) { + /* other stream is still alive */ + cable->streams[substream->stream] = NULL; + } else { + /* free the cable */ + loopback->cables[substream->number][dev] = NULL; + kfree(cable); + } + mutex_unlock(&loopback->cable_lock); + return 0; +} + +static struct snd_pcm_ops loopback_playback_ops = { + .open = loopback_open, + .close = loopback_close, + .ioctl = snd_pcm_lib_ioctl, + .hw_params = loopback_hw_params, + .hw_free = loopback_hw_free, + .prepare = loopback_prepare, + .trigger = loopback_trigger, + .pointer = loopback_pointer, +}; + +static struct snd_pcm_ops loopback_capture_ops = { + .open = loopback_open, + .close = loopback_close, + .ioctl = snd_pcm_lib_ioctl, + .hw_params = loopback_hw_params, + .hw_free = loopback_hw_free, + .prepare = loopback_prepare, + .trigger = loopback_trigger, + .pointer = loopback_pointer, +}; + +static int __devinit loopback_pcm_new(struct loopback *loopback, + int device, int substreams) +{ + struct snd_pcm *pcm; + int err; + + err = snd_pcm_new(loopback->card, "Loopback PCM", device, + substreams, substreams, &pcm); + if (err < 0) + return err; + snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &loopback_playback_ops); + snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &loopback_capture_ops); + + pcm->private_data = loopback; + pcm->info_flags = 0; + strcpy(pcm->name, "Loopback PCM"); + + loopback->pcm[device] = pcm; + + snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS, + snd_dma_continuous_data(GFP_KERNEL), + 0, 2 * 1024 * 1024); + return 0; +} + +static int loopback_rate_shift_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; + uinfo->count = 1; + uinfo->value.integer.min = 80000; + uinfo->value.integer.max = 120000; + uinfo->value.integer.step = 1; + return 0; +} + +static int loopback_rate_shift_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct loopback *loopback = snd_kcontrol_chip(kcontrol); + + ucontrol->value.integer.value[0] = + loopback->setup[kcontrol->id.subdevice] + [kcontrol->id.device].rate_shift; + return 0; +} + +static int loopback_rate_shift_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct loopback *loopback = snd_kcontrol_chip(kcontrol); + unsigned int val; + int change = 0; + + val = ucontrol->value.integer.value[0]; + if (val < 80000) + val = 80000; + if (val > 120000) + val = 120000; + mutex_lock(&loopback->cable_lock); + if (val != loopback->setup[kcontrol->id.subdevice] + [kcontrol->id.device].rate_shift) { + loopback->setup[kcontrol->id.subdevice] + [kcontrol->id.device].rate_shift = val; + change = 1; + } + mutex_unlock(&loopback->cable_lock); + return change; +} + +static int loopback_notify_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct loopback *loopback = snd_kcontrol_chip(kcontrol); + + ucontrol->value.integer.value[0] = + loopback->setup[kcontrol->id.subdevice] + [kcontrol->id.device].notify; + return 0; +} + +static int loopback_notify_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct loopback *loopback = snd_kcontrol_chip(kcontrol); + unsigned int val; + int change = 0; + + val = ucontrol->value.integer.value[0] ? 1 : 0; + if (val != loopback->setup[kcontrol->id.subdevice] + [kcontrol->id.device].notify) { + loopback->setup[kcontrol->id.subdevice] + [kcontrol->id.device].notify = val; + change = 1; + } + return change; +} + +static int loopback_active_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct loopback *loopback = snd_kcontrol_chip(kcontrol); + struct loopback_cable *cable = loopback->cables + [kcontrol->id.subdevice][kcontrol->id.device]; + unsigned int val = 0; + + if (cable != NULL) + val = (cable->running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) ? + 1 : 0; + ucontrol->value.integer.value[0] = val; + return 0; +} + +static int loopback_format_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; + uinfo->count = 1; + uinfo->value.integer.min = 0; + uinfo->value.integer.max = SNDRV_PCM_FORMAT_LAST; + uinfo->value.integer.step = 1; + return 0; +} + +static int loopback_format_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct loopback *loopback = snd_kcontrol_chip(kcontrol); + + ucontrol->value.integer.value[0] = + loopback->setup[kcontrol->id.subdevice] + [kcontrol->id.device].format; + return 0; +} + +static int loopback_rate_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; + uinfo->count = 1; + uinfo->value.integer.min = 0; + uinfo->value.integer.max = 192000; + uinfo->value.integer.step = 1; + return 0; +} + +static int loopback_rate_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct loopback *loopback = snd_kcontrol_chip(kcontrol); + + ucontrol->value.integer.value[0] = + loopback->setup[kcontrol->id.subdevice] + [kcontrol->id.device].rate; + return 0; +} + +static int loopback_channels_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; + uinfo->count = 1; + uinfo->value.integer.min = 1; + uinfo->value.integer.max = 1024; + uinfo->value.integer.step = 1; + return 0; +} + +static int loopback_channels_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct loopback *loopback = snd_kcontrol_chip(kcontrol); + + ucontrol->value.integer.value[0] = + loopback->setup[kcontrol->id.subdevice] + [kcontrol->id.device].rate; + return 0; +} + +static struct snd_kcontrol_new loopback_controls[] __devinitdata = { +{ + .iface = SNDRV_CTL_ELEM_IFACE_PCM, + .name = "PCM Rate Shift 100000", + .info = loopback_rate_shift_info, + .get = loopback_rate_shift_get, + .put = loopback_rate_shift_put, +}, +{ + .iface = SNDRV_CTL_ELEM_IFACE_PCM, + .name = "PCM Notify", + .info = snd_ctl_boolean_mono_info, + .get = loopback_notify_get, + .put = loopback_notify_put, +}, +#define ACTIVE_IDX 2 +{ + .access = SNDRV_CTL_ELEM_ACCESS_READ, + .iface = SNDRV_CTL_ELEM_IFACE_PCM, + .name = "PCM Slave Active", + .info = snd_ctl_boolean_mono_info, + .get = loopback_active_get, +}, +#define FORMAT_IDX 3 +{ + .access = SNDRV_CTL_ELEM_ACCESS_READ, + .iface = SNDRV_CTL_ELEM_IFACE_PCM, + .name = "PCM Slave Format", + .info = loopback_format_info, + .get = loopback_format_get +}, +#define RATE_IDX 4 +{ + .access = SNDRV_CTL_ELEM_ACCESS_READ, + .iface = SNDRV_CTL_ELEM_IFACE_PCM, + .name = "PCM Slave Rate", + .info = loopback_rate_info, + .get = loopback_rate_get +}, +#define CHANNELS_IDX 5 +{ + .access = SNDRV_CTL_ELEM_ACCESS_READ, + .iface = SNDRV_CTL_ELEM_IFACE_PCM, + .name = "PCM Slave Channels", + .info = loopback_channels_info, + .get = loopback_channels_get +} +}; + +static int __devinit loopback_mixer_new(struct loopback *loopback, int notify) +{ + struct snd_card *card = loopback->card; + struct snd_pcm *pcm; + struct snd_kcontrol *kctl; + struct loopback_setup *setup; + int err, dev, substr, substr_count, idx; + + strcpy(card->mixername, "Loopback Mixer"); + for (dev = 0; dev < 2; dev++) { + pcm = loopback->pcm[dev]; + substr_count = + pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream_count; + for (substr = 0; substr < substr_count; substr++) { + setup = &loopback->setup[substr][dev]; + setup->notify = notify; + setup->rate_shift = NO_PITCH; + setup->format = SNDRV_PCM_FORMAT_S16_LE; + setup->rate = 48000; + setup->channels = 2; + for (idx = 0; idx < ARRAY_SIZE(loopback_controls); + idx++) { + kctl = snd_ctl_new1(&loopback_controls[idx], + loopback); + if (!kctl) + return -ENOMEM; + kctl->id.device = dev; + kctl->id.subdevice = substr; + switch (idx) { + case ACTIVE_IDX: + setup->active_id = kctl->id; + break; + case FORMAT_IDX: + setup->format_id = kctl->id; + break; + case RATE_IDX: + setup->rate_id = kctl->id; + break; + case CHANNELS_IDX: + setup->channels_id = kctl->id; + break; + default: + break; + } + err = snd_ctl_add(card, kctl); + if (err < 0) + return err; + } + } + } + return 0; +} + +static int __devinit loopback_probe(struct platform_device *devptr) +{ + struct snd_card *card; + struct loopback *loopback; + int dev = devptr->id; + int err; + + err = snd_card_create(index[dev], id[dev], THIS_MODULE, + sizeof(struct loopback), &card); + if (err < 0) + return err; + loopback = card->private_data; + + if (pcm_substreams[dev] < 1) + pcm_substreams[dev] = 1; + if (pcm_substreams[dev] > MAX_PCM_SUBSTREAMS) + pcm_substreams[dev] = MAX_PCM_SUBSTREAMS; + + loopback->card = card; + mutex_init(&loopback->cable_lock); + + err = loopback_pcm_new(loopback, 0, pcm_substreams[dev]); + if (err < 0) + goto __nodev; + err = loopback_pcm_new(loopback, 1, pcm_substreams[dev]); + if (err < 0) + goto __nodev; + err = loopback_mixer_new(loopback, pcm_notify[dev] ? 1 : 0); + if (err < 0) + goto __nodev; + strcpy(card->driver, "Loopback"); + strcpy(card->shortname, "Loopback"); + sprintf(card->longname, "Loopback %i", dev + 1); + err = snd_card_register(card); + if (!err) { + platform_set_drvdata(devptr, card); + return 0; + } + __nodev: + snd_card_free(card); + return err; +} + +static int __devexit loopback_remove(struct platform_device *devptr) +{ + snd_card_free(platform_get_drvdata(devptr)); + platform_set_drvdata(devptr, NULL); + return 0; +} + +#ifdef CONFIG_PM +static int loopback_suspend(struct platform_device *pdev, + pm_message_t state) +{ + struct snd_card *card = platform_get_drvdata(pdev); + struct loopback *loopback = card->private_data; + + snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); + + snd_pcm_suspend_all(loopback->pcm[0]); + snd_pcm_suspend_all(loopback->pcm[1]); + return 0; +} + +static int loopback_resume(struct platform_device *pdev) +{ + struct snd_card *card = platform_get_drvdata(pdev); + + snd_power_change_state(card, SNDRV_CTL_POWER_D0); + return 0; +} +#endif + +#define SND_LOOPBACK_DRIVER "snd_aloop" + +static struct platform_driver loopback_driver = { + .probe = loopback_probe, + .remove = __devexit_p(loopback_remove), +#ifdef CONFIG_PM + .suspend = loopback_suspend, + .resume = loopback_resume, +#endif + .driver = { + .name = SND_LOOPBACK_DRIVER + }, +}; + +static void loopback_unregister_all(void) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(devices); ++i) + platform_device_unregister(devices[i]); + platform_driver_unregister(&loopback_driver); +} + +static int __init alsa_card_loopback_init(void) +{ + int i, err, cards; + + err = platform_driver_register(&loopback_driver); + if (err < 0) + return err; + + + cards = 0; + for (i = 0; i < SNDRV_CARDS; i++) { + struct platform_device *device; + if (!enable[i]) + continue; + device = platform_device_register_simple(SND_LOOPBACK_DRIVER, + i, NULL, 0); + if (IS_ERR(device)) + continue; + if (!platform_get_drvdata(device)) { + platform_device_unregister(device); + continue; + } + devices[i] = device; + cards++; + } + if (!cards) { +#ifdef MODULE + printk(KERN_ERR "aloop: No loopback enabled\n"); +#endif + loopback_unregister_all(); + return -ENODEV; + } + return 0; +} + +static void __exit alsa_card_loopback_exit(void) +{ + loopback_unregister_all(); +} + +module_init(alsa_card_loopback_init) +module_exit(alsa_card_loopback_exit) -- cgit v1.2.3 From 9cf2657d05f9f9e04c3e113d68bf7cef5a942070 Mon Sep 17 00:00:00 2001 From: Stephen Warren Date: Mon, 9 Aug 2010 22:41:40 -0600 Subject: ALSA: hda - patch_nvhdmi.c: Add missing codec IDs, unify names * Add missing codec IDs. * Modify some existing codec names for discrete GPUs to match newly added IDs. Note: existing names were a mixture of marketing and engineering GPU names. Equally, there's no reason that codec IDs have to be specific to a particular GPU or board, so identify codecs in a less marketing-oriented fashion. * Reformat codec ID table so it's easier to read, for me at least. Signed-off-by: Stephen Warren Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_nvhdmi.c | 61 +++++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 20 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_nvhdmi.c b/sound/pci/hda/patch_nvhdmi.c index a281836fd472..77e2b4028b9f 100644 --- a/sound/pci/hda/patch_nvhdmi.c +++ b/sound/pci/hda/patch_nvhdmi.c @@ -540,26 +540,32 @@ static int patch_nvhdmi_2ch(struct hda_codec *codec) * patch entries */ static struct hda_codec_preset snd_hda_preset_nvhdmi[] = { - { .id = 0x10de0002, .name = "MCP77/78 HDMI", - .patch = patch_nvhdmi_8ch_7x }, - { .id = 0x10de0003, .name = "MCP77/78 HDMI", - .patch = patch_nvhdmi_8ch_7x }, - { .id = 0x10de0005, .name = "MCP77/78 HDMI", - .patch = patch_nvhdmi_8ch_7x }, - { .id = 0x10de0006, .name = "MCP77/78 HDMI", - .patch = patch_nvhdmi_8ch_7x }, - { .id = 0x10de0007, .name = "MCP79/7A HDMI", - .patch = patch_nvhdmi_8ch_7x }, - { .id = 0x10de000a, .name = "GT220 HDMI", - .patch = patch_nvhdmi_8ch_89 }, - { .id = 0x10de000b, .name = "GT21x HDMI", - .patch = patch_nvhdmi_8ch_89 }, - { .id = 0x10de000c, .name = "MCP89 HDMI", - .patch = patch_nvhdmi_8ch_89 }, - { .id = 0x10de000d, .name = "GT240 HDMI", - .patch = patch_nvhdmi_8ch_89 }, - { .id = 0x10de0067, .name = "MCP67 HDMI", .patch = patch_nvhdmi_2ch }, - { .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi_2ch }, + { .id = 0x10de0002, .name = "MCP77/78 HDMI", .patch = patch_nvhdmi_8ch_7x }, + { .id = 0x10de0003, .name = "MCP77/78 HDMI", .patch = patch_nvhdmi_8ch_7x }, + { .id = 0x10de0005, .name = "MCP77/78 HDMI", .patch = patch_nvhdmi_8ch_7x }, + { .id = 0x10de0006, .name = "MCP77/78 HDMI", .patch = patch_nvhdmi_8ch_7x }, + { .id = 0x10de0007, .name = "MCP79/7A HDMI", .patch = patch_nvhdmi_8ch_7x }, + { .id = 0x10de000a, .name = "GPU 0a HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de000b, .name = "GPU 0b HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de000c, .name = "MCP89 HDMI", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de000d, .name = "GPU 0d HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de0010, .name = "GPU 10 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de0011, .name = "GPU 11 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de0012, .name = "GPU 12 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de0013, .name = "GPU 13 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de0014, .name = "GPU 14 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de0018, .name = "GPU 18 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de0019, .name = "GPU 19 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de001a, .name = "GPU 1a HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de001b, .name = "GPU 1b HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de001c, .name = "GPU 1c HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de0040, .name = "GPU 40 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de0041, .name = "GPU 41 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de0042, .name = "GPU 42 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de0043, .name = "GPU 43 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de0044, .name = "GPU 44 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, + { .id = 0x10de0067, .name = "MCP67 HDMI", .patch = patch_nvhdmi_2ch }, + { .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi_2ch }, {} /* terminator */ }; @@ -572,6 +578,21 @@ MODULE_ALIAS("snd-hda-codec-id:10de000a"); MODULE_ALIAS("snd-hda-codec-id:10de000b"); MODULE_ALIAS("snd-hda-codec-id:10de000c"); MODULE_ALIAS("snd-hda-codec-id:10de000d"); +MODULE_ALIAS("snd-hda-codec-id:10de0010"); +MODULE_ALIAS("snd-hda-codec-id:10de0011"); +MODULE_ALIAS("snd-hda-codec-id:10de0012"); +MODULE_ALIAS("snd-hda-codec-id:10de0013"); +MODULE_ALIAS("snd-hda-codec-id:10de0014"); +MODULE_ALIAS("snd-hda-codec-id:10de0018"); +MODULE_ALIAS("snd-hda-codec-id:10de0019"); +MODULE_ALIAS("snd-hda-codec-id:10de001a"); +MODULE_ALIAS("snd-hda-codec-id:10de001b"); +MODULE_ALIAS("snd-hda-codec-id:10de001c"); +MODULE_ALIAS("snd-hda-codec-id:10de0040"); +MODULE_ALIAS("snd-hda-codec-id:10de0041"); +MODULE_ALIAS("snd-hda-codec-id:10de0042"); +MODULE_ALIAS("snd-hda-codec-id:10de0043"); +MODULE_ALIAS("snd-hda-codec-id:10de0044"); MODULE_ALIAS("snd-hda-codec-id:10de0067"); MODULE_ALIAS("snd-hda-codec-id:10de8001"); -- cgit v1.2.3 From 81cd3fca642cecb40a1ccef099799dcb5730734b Mon Sep 17 00:00:00 2001 From: David Henningsson Date: Tue, 10 Aug 2010 09:18:00 +0200 Subject: ALSA: HDA: Use model=auto for LG R510 Two users report model=auto is needed to make the internal mic work properly. BugLink: https://bugs.launchpad.net/bugs/495134 Signed-off-by: David Henningsson Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 1 - 1 file changed, 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 6b00a2369e97..55d6e5b6bb7d 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -13477,7 +13477,6 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = { SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER), SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), - SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL), {} }; -- cgit v1.2.3 From 4f0ed9a51bc8ef16c2589112fdb110479e4b0df1 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 6 Aug 2010 17:57:12 +0100 Subject: ASoC: Fix inverted mute controls for WM8580 Signed-off-by: Mark Brown Acked-by: Liam Girdwood Cc: stable@kernel.org --- sound/soc/codecs/wm8580.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c index c3571ee5c11b..72deeabef4fe 100644 --- a/sound/soc/codecs/wm8580.c +++ b/sound/soc/codecs/wm8580.c @@ -269,9 +269,9 @@ SOC_DOUBLE("DAC2 Invert Switch", WM8580_DAC_CONTROL4, 2, 3, 1, 0), SOC_DOUBLE("DAC3 Invert Switch", WM8580_DAC_CONTROL4, 4, 5, 1, 0), SOC_SINGLE("DAC ZC Switch", WM8580_DAC_CONTROL5, 5, 1, 0), -SOC_SINGLE("DAC1 Switch", WM8580_DAC_CONTROL5, 0, 1, 0), -SOC_SINGLE("DAC2 Switch", WM8580_DAC_CONTROL5, 1, 1, 0), -SOC_SINGLE("DAC3 Switch", WM8580_DAC_CONTROL5, 2, 1, 0), +SOC_SINGLE("DAC1 Switch", WM8580_DAC_CONTROL5, 0, 1, 1), +SOC_SINGLE("DAC2 Switch", WM8580_DAC_CONTROL5, 1, 1, 1), +SOC_SINGLE("DAC3 Switch", WM8580_DAC_CONTROL5, 2, 1, 1), SOC_DOUBLE("ADC Mute Switch", WM8580_ADC_CONTROL1, 0, 1, 1, 0), SOC_SINGLE("ADC High-Pass Filter Switch", WM8580_ADC_CONTROL1, 4, 1, 0), -- cgit v1.2.3 From 698cb111f44d81dd3a604ba2a7f3f865b66b9ddf Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 6 Aug 2010 17:23:02 +0100 Subject: ASoC: Remove /s from widget names on SMDK64xx WM8580 Otherwise debugfs gets upset when we try to create filenames with / in them. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/s3c24xx/smdk64xx_wm8580.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'sound') diff --git a/sound/soc/s3c24xx/smdk64xx_wm8580.c b/sound/soc/s3c24xx/smdk64xx_wm8580.c index 07e8e51d10d6..5853f6609f6f 100644 --- a/sound/soc/s3c24xx/smdk64xx_wm8580.c +++ b/sound/soc/s3c24xx/smdk64xx_wm8580.c @@ -138,9 +138,9 @@ static struct snd_soc_ops smdk64xx_ops = { /* SMDK64xx Playback widgets */ static const struct snd_soc_dapm_widget wm8580_dapm_widgets_pbk[] = { - SND_SOC_DAPM_HP("Front-L/R", NULL), - SND_SOC_DAPM_HP("Center/Sub", NULL), - SND_SOC_DAPM_HP("Rear-L/R", NULL), + SND_SOC_DAPM_HP("Front", NULL), + SND_SOC_DAPM_HP("Center+Sub", NULL), + SND_SOC_DAPM_HP("Rear", NULL), }; /* SMDK64xx Capture widgets */ @@ -162,16 +162,16 @@ static const struct snd_soc_dapm_route audio_map_tx[] = { /* SMDK-PAIFRX connections */ static const struct snd_soc_dapm_route audio_map_rx[] = { /* Front Left/Right are fed VOUT1L/R */ - {"Front-L/R", NULL, "VOUT1L"}, - {"Front-L/R", NULL, "VOUT1R"}, + {"Front", NULL, "VOUT1L"}, + {"Front", NULL, "VOUT1R"}, /* Center/Sub are fed VOUT2L/R */ - {"Center/Sub", NULL, "VOUT2L"}, - {"Center/Sub", NULL, "VOUT2R"}, + {"Center+Sub", NULL, "VOUT2L"}, + {"Center+Sub", NULL, "VOUT2R"}, /* Rear Left/Right are fed VOUT3L/R */ - {"Rear-L/R", NULL, "VOUT3L"}, - {"Rear-L/R", NULL, "VOUT3R"}, + {"Rear", NULL, "VOUT3L"}, + {"Rear", NULL, "VOUT3R"}, }; static int smdk64xx_wm8580_init_paiftx(struct snd_soc_codec *codec) -- cgit v1.2.3 From 9d37e8947c613190b7b92c63830e638ffdb08e48 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 6 Aug 2010 17:57:45 +0100 Subject: ASoC: Document CFG switch settings for SMDK6410 WM8580 usage Sadly these aren't soft controllable and can't be read back either :( Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/s3c24xx/smdk64xx_wm8580.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'sound') diff --git a/sound/soc/s3c24xx/smdk64xx_wm8580.c b/sound/soc/s3c24xx/smdk64xx_wm8580.c index 5853f6609f6f..4926acaaa8b0 100644 --- a/sound/soc/s3c24xx/smdk64xx_wm8580.c +++ b/sound/soc/s3c24xx/smdk64xx_wm8580.c @@ -22,6 +22,12 @@ #include "s3c-dma.h" #include "s3c64xx-i2s.h" +/* + * Default CFG switch settings to use this driver: + * + * SMDK6410: Set CFG1 1-3 Off, CFG2 1-4 On + */ + /* SMDK64XX has a 12MHZ crystal attached to WM8580 */ #define SMDK64XX_WM8580_FREQ 12000000 -- cgit v1.2.3 From 6f341d14811550d863ba804ce6ec7757a7145081 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 6 Aug 2010 18:14:09 +0100 Subject: ASoC: Correct WM8580 Capture control names Should use Capture rather than ADC so the UI tools can identify their function more readily. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8580.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c index c3571ee5c11b..1881b16bc248 100644 --- a/sound/soc/codecs/wm8580.c +++ b/sound/soc/codecs/wm8580.c @@ -273,8 +273,8 @@ SOC_SINGLE("DAC1 Switch", WM8580_DAC_CONTROL5, 0, 1, 0), SOC_SINGLE("DAC2 Switch", WM8580_DAC_CONTROL5, 1, 1, 0), SOC_SINGLE("DAC3 Switch", WM8580_DAC_CONTROL5, 2, 1, 0), -SOC_DOUBLE("ADC Mute Switch", WM8580_ADC_CONTROL1, 0, 1, 1, 0), -SOC_SINGLE("ADC High-Pass Filter Switch", WM8580_ADC_CONTROL1, 4, 1, 0), +SOC_DOUBLE("Capture Switch", WM8580_ADC_CONTROL1, 0, 1, 1, 0), +SOC_SINGLE("Capture High-Pass Filter Switch", WM8580_ADC_CONTROL1, 4, 1, 0), }; static const struct snd_soc_dapm_widget wm8580_dapm_widgets[] = { -- cgit v1.2.3 From 8a345a042ae75097fd493633633382644257cfc3 Mon Sep 17 00:00:00 2001 From: Charles Chin Date: Tue, 10 Aug 2010 11:43:25 +0200 Subject: ALSA: hda - Adding support for new IDT 92HD87XX codecs Added the entries for 92HD87B1/3 and 92HD87B2/4 codecs. These are compatible with existing 83xxx codecs. Signed-off-by: Charles Chin Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_sigmatel.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index a664367ad65c..f3f861bd1bf8 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -5349,6 +5349,8 @@ again: case 0x111d7667: case 0x111d7668: case 0x111d7669: + case 0x111d76d1: + case 0x111d76d9: spec->num_pins = ARRAY_SIZE(stac92hd88xxx_pin_nids); spec->pin_nids = stac92hd88xxx_pin_nids; spec->mono_nid = 0; @@ -6283,6 +6285,8 @@ static struct hda_codec_preset snd_hda_preset_sigmatel[] = { { .id = 0x111d76d4, .name = "92HD83C1C5", .patch = patch_stac92hd83xxx}, { .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx}, { .id = 0x111d76d5, .name = "92HD81B1C5", .patch = patch_stac92hd83xxx}, + { .id = 0x111d76d1, .name = "92HD87B1/3", .patch = patch_stac92hd83xxx}, + { .id = 0x111d76d9, .name = "92HD87B2/4", .patch = patch_stac92hd83xxx}, { .id = 0x111d7666, .name = "92HD88B3", .patch = patch_stac92hd83xxx}, { .id = 0x111d7667, .name = "92HD88B1", .patch = patch_stac92hd83xxx}, { .id = 0x111d7668, .name = "92HD88B2", .patch = patch_stac92hd83xxx}, -- cgit v1.2.3 From ac770267a7cd85a747b6111db46f66d1515e7cd7 Mon Sep 17 00:00:00 2001 From: Cliff Cai Date: Sat, 7 Aug 2010 11:16:27 -0400 Subject: ASoC: register cache should be 1 byte aligned for 1 byte long register Signed-off-by: Cliff Cai Signed-off-by: Mike Frysinger Acked-by: Liam Girdwood Signed-off-by: Mark Brown Cc: stable@kernel.org --- sound/soc/soc-cache.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c index 472af38188c1..adbc68ce9050 100644 --- a/sound/soc/soc-cache.c +++ b/sound/soc/soc-cache.c @@ -340,7 +340,7 @@ static unsigned int snd_soc_16_8_read_i2c(struct snd_soc_codec *codec, static unsigned int snd_soc_16_8_read(struct snd_soc_codec *codec, unsigned int reg) { - u16 *cache = codec->reg_cache; + u8 *cache = codec->reg_cache; reg &= 0xff; if (reg >= codec->reg_cache_size) @@ -351,7 +351,7 @@ static unsigned int snd_soc_16_8_read(struct snd_soc_codec *codec, static int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg, unsigned int value) { - u16 *cache = codec->reg_cache; + u8 *cache = codec->reg_cache; u8 data[3]; int ret; -- cgit v1.2.3 From 2e2211a387e70c62e1249822a94f4a33933ecd62 Mon Sep 17 00:00:00 2001 From: Sonic Zhang Date: Sat, 7 Aug 2010 12:06:07 -0400 Subject: ASoC: add AD1980 obsolete information This codec has been obsoleted by ADI, so add appropriate warnings to the source tree to dissuade people from using in new designs based on driver support. Signed-off-by: Sonic Zhang Signed-off-by: Mike Frysinger Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/blackfin/Kconfig | 7 ++++++- sound/soc/blackfin/bf5xx-ad1980.c | 10 +++++++++- sound/soc/codecs/ad1980.c | 10 +++++++++- sound/soc/codecs/ad1980.h | 6 ++++++ 4 files changed, 30 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/soc/blackfin/Kconfig b/sound/soc/blackfin/Kconfig index 8ef25025f3dc..3abeeddc67d3 100644 --- a/sound/soc/blackfin/Kconfig +++ b/sound/soc/blackfin/Kconfig @@ -105,13 +105,18 @@ config SND_BF5XX_RESET_GPIO_NUM Set the correct GPIO for RESET the sound chip. config SND_BF5XX_SOC_AD1980 - tristate "SoC AD1980/1 Audio support for BF5xx" + tristate "SoC AD1980/1 Audio support for BF5xx (Obsolete)" depends on SND_BF5XX_AC97 select SND_BF5XX_SOC_AC97 select SND_SOC_AD1980 help Say Y if you want to add support for SoC audio on BF5xx STAMP/EZKIT. + Warning: + Because Analog Devices Inc. discontinued the ad1980 sound chip since + Sep. 2009, this ad1980 driver is not maintained, tested and supported + by ADI now. + config SND_BF5XX_SOC_SPORT tristate diff --git a/sound/soc/blackfin/bf5xx-ad1980.c b/sound/soc/blackfin/bf5xx-ad1980.c index d8f591273778..92f7c327bb7a 100644 --- a/sound/soc/blackfin/bf5xx-ad1980.c +++ b/sound/soc/blackfin/bf5xx-ad1980.c @@ -26,6 +26,14 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +/* + * WARNING: + * + * Because Analog Devices Inc. discontinued the ad1980 sound chip since + * Sep. 2009, this ad1980 driver is not maintained, tested and supported + * by ADI now. + */ + #include #include #include @@ -109,5 +117,5 @@ module_exit(bf5xx_board_exit); /* Module information */ MODULE_AUTHOR("Cliff Cai"); -MODULE_DESCRIPTION("ALSA SoC AD1980/1 BF5xx board"); +MODULE_DESCRIPTION("ALSA SoC AD1980/1 BF5xx board (Obsolete)"); MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/ad1980.c b/sound/soc/codecs/ad1980.c index 042072738cdc..70cfaec3be2c 100644 --- a/sound/soc/codecs/ad1980.c +++ b/sound/soc/codecs/ad1980.c @@ -11,6 +11,14 @@ * option) any later version. */ +/* + * WARNING: + * + * Because Analog Devices Inc. discontinued the ad1980 sound chip since + * Sep. 2009, this ad1980 driver is not maintained, tested and supported + * by ADI now. + */ + #include #include #include @@ -298,6 +306,6 @@ struct snd_soc_codec_device soc_codec_dev_ad1980 = { }; EXPORT_SYMBOL_GPL(soc_codec_dev_ad1980); -MODULE_DESCRIPTION("ASoC ad1980 driver"); +MODULE_DESCRIPTION("ASoC ad1980 driver (Obsolete)"); MODULE_AUTHOR("Roy Huang, Cliff Cai"); MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/ad1980.h b/sound/soc/codecs/ad1980.h index db6c8500d66b..538f37c90806 100644 --- a/sound/soc/codecs/ad1980.h +++ b/sound/soc/codecs/ad1980.h @@ -1,5 +1,11 @@ /* * ad1980.h -- ad1980 Soc Audio driver + * + * WARNING: + * + * Because Analog Devices Inc. discontinued the ad1980 sound chip since + * Sep. 2009, this ad1980 driver is not maintained, tested and supported + * by ADI now. */ #ifndef _AD1980_H -- cgit v1.2.3 From 31cbd97726207b483a1731562559fabd4e2efdd0 Mon Sep 17 00:00:00 2001 From: Andrea Gelmini Date: Wed, 11 Aug 2010 21:07:33 +0200 Subject: sound: oss: sh_dac_audio.c removed duplicated #include Signed-off-by: Andrea Gelmini Signed-off-by: Takashi Iwai --- sound/oss/sh_dac_audio.c | 1 - 1 file changed, 1 deletion(-) (limited to 'sound') diff --git a/sound/oss/sh_dac_audio.c b/sound/oss/sh_dac_audio.c index fdb58eb83d4e..479e3025a8a3 100644 --- a/sound/oss/sh_dac_audio.c +++ b/sound/oss/sh_dac_audio.c @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include -- cgit v1.2.3 From f0fba2ad1b6b53d5360125c41953b7afcd6deff0 Mon Sep 17 00:00:00 2001 From: Liam Girdwood Date: Wed, 17 Mar 2010 20:15:21 +0000 Subject: ASoC: multi-component - ASoC Multi-Component Support This patch extends the ASoC API to allow sound cards to have more than one CODEC and more than one platform DMA controller. This is achieved by dividing some current ASoC structures that contain both driver data and device data into structures that only either contain device data or driver data. i.e. struct snd_soc_codec ---> struct snd_soc_codec (device data) +-> struct snd_soc_codec_driver (driver data) struct snd_soc_platform ---> struct snd_soc_platform (device data) +-> struct snd_soc_platform_driver (driver data) struct snd_soc_dai ---> struct snd_soc_dai (device data) +-> struct snd_soc_dai_driver (driver data) struct snd_soc_device ---> deleted This now allows ASoC to be more tightly aligned with the Linux driver model and also means that every ASoC codec, platform and (platform) DAI is a kernel device. ASoC component private data is now stored as device private data. The ASoC sound card struct snd_soc_card has also been updated to store lists of it's components rather than a pointer to a codec and platform. The PCM runtime struct soc_pcm_runtime now has pointers to all its components. This patch adds DAPM support for ASoC multi-component and removes struct snd_soc_socdev from DAPM core. All DAPM calls are now made on a card, codec or runtime PCM level basis rather than using snd_soc_socdev. Other notable multi-component changes:- * Stream operations now de-reference less structures. * close_delayed work() now runs on a DAI basis rather than looping all DAIs in a card. * PM suspend()/resume() operations can now handle N CODECs and Platforms per sound card. * Added soc_bind_dai_link() to bind the component devices to the sound card. * Added soc_dai_link_probe() and soc_dai_link_remove() to probe and remove DAI link components. * sysfs entries can now be registered per component per card. * snd_soc_new_pcms() functionailty rolled into dai_link_probe(). * snd_soc_register_codec() now does all the codec list and mutex init. This patch changes the probe() and remove() of the CODEC drivers as follows:- o Make CODEC driver a platform driver o Moved all struct snd_soc_codec list, mutex, etc initialiasation to core. o Removed all static codec pointers (drivers now support > 1 codec dev) o snd_soc_register_pcms() now done by core. o snd_soc_register_dai() folded into snd_soc_register_codec(). CS4270 portions: Acked-by: Timur Tabi Some TLV320aic23 and Cirrus platform fixes. Signed-off-by: Ryan Mallon TI CODEC and OMAP fixes Signed-off-by: Peter Ujfalusi Signed-off-by: Janusz Krzysztofik Signed-off-by: Jarkko Nikula Samsung platform and misc fixes :- Signed-off-by: Chanwoo Choi Signed-off-by: Joonyoung Shim Signed-off-by: Kyungmin Park Reviewed-by: Jassi Brar Signed-off-by: Seungwhan Youn MPC8610 and PPC fixes. Signed-off-by: Timur Tabi i.MX fixes and some core fixes. Signed-off-by: Sascha Hauer J4740 platform fixes:- Signed-off-by: Lars-Peter Clausen CC: Tony Lindgren CC: Nicolas Ferre CC: Kevin Hilman CC: Sascha Hauer CC: Atsushi Nemoto CC: Kuninori Morimoto CC: Daniel Gloeckner CC: Manuel Lauss CC: Mike Frysinger CC: Arnaud Patard CC: Wan ZongShun Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/atmel/atmel-pcm.c | 59 +- sound/soc/atmel/atmel-pcm.h | 3 - sound/soc/atmel/atmel_ssc_dai.c | 97 +- sound/soc/atmel/atmel_ssc_dai.h | 1 - sound/soc/atmel/playpaq_wm8510.c | 65 +- sound/soc/atmel/sam9g20_wm8731.c | 51 +- sound/soc/atmel/snd-soc-afeb9260.c | 35 +- sound/soc/au1x/db1200.c | 35 +- sound/soc/au1x/dbdma2.c | 19 +- sound/soc/au1x/psc-ac97.c | 20 +- sound/soc/au1x/psc-i2s.c | 21 +- sound/soc/au1x/psc.h | 3 - sound/soc/blackfin/bf5xx-ac97-pcm.c | 43 +- sound/soc/blackfin/bf5xx-ac97-pcm.h | 3 - sound/soc/blackfin/bf5xx-ac97.c | 41 +- sound/soc/blackfin/bf5xx-ac97.h | 2 - sound/soc/blackfin/bf5xx-ad1836.c | 23 +- sound/soc/blackfin/bf5xx-ad193x.c | 23 +- sound/soc/blackfin/bf5xx-ad1980.c | 19 +- sound/soc/blackfin/bf5xx-ad73311.c | 22 +- sound/soc/blackfin/bf5xx-i2s-pcm.c | 44 +- sound/soc/blackfin/bf5xx-i2s-pcm.h | 3 - sound/soc/blackfin/bf5xx-i2s.c | 45 +- sound/soc/blackfin/bf5xx-i2s.h | 14 - sound/soc/blackfin/bf5xx-ssm2602.c | 38 +- sound/soc/blackfin/bf5xx-tdm-pcm.c | 43 +- sound/soc/blackfin/bf5xx-tdm-pcm.h | 3 - sound/soc/blackfin/bf5xx-tdm.c | 15 +- sound/soc/blackfin/bf5xx-tdm.h | 2 - sound/soc/codecs/ac97.c | 124 +- sound/soc/codecs/ac97.h | 19 - sound/soc/codecs/ad1836.c | 191 +-- sound/soc/codecs/ad1836.h | 2 - sound/soc/codecs/ad193x.c | 217 ++- sound/soc/codecs/ad193x.h | 3 - sound/soc/codecs/ad1980.c | 107 +- sound/soc/codecs/ad1980.h | 3 - sound/soc/codecs/ad73311.c | 66 +- sound/soc/codecs/ad73311.h | 2 - sound/soc/codecs/ads117x.c | 72 +- sound/soc/codecs/ads117x.h | 4 +- sound/soc/codecs/ak4104.c | 149 +-- sound/soc/codecs/ak4104.h | 7 - sound/soc/codecs/ak4535.c | 236 +--- sound/soc/codecs/ak4535.h | 8 - sound/soc/codecs/ak4642.c | 175 +-- sound/soc/codecs/ak4642.h | 20 - sound/soc/codecs/ak4671.c | 141 +- sound/soc/codecs/ak4671.h | 3 - sound/soc/codecs/cq93vc.c | 132 +- sound/soc/codecs/cq93vc.h | 29 - sound/soc/codecs/cs4270.c | 393 ++---- sound/soc/codecs/cs4270.h | 28 - sound/soc/codecs/cs42l51.c | 293 ++--- sound/soc/codecs/cs42l51.h | 2 - sound/soc/codecs/cx20442.c | 173 +-- sound/soc/codecs/cx20442.h | 2 - sound/soc/codecs/da7210.c | 157 +-- sound/soc/codecs/da7210.h | 24 - sound/soc/codecs/jz4740.c | 116 +- sound/soc/codecs/jz4740.h | 20 - sound/soc/codecs/pcm3008.c | 92 +- sound/soc/codecs/pcm3008.h | 3 - sound/soc/codecs/spdif_transciever.c | 102 +- sound/soc/codecs/spdif_transciever.h | 18 - sound/soc/codecs/ssm2602.c | 219 +--- sound/soc/codecs/ssm2602.h | 3 - sound/soc/codecs/stac9766.c | 118 +- sound/soc/codecs/stac9766.h | 4 - sound/soc/codecs/tlv320aic23.c | 182 +-- sound/soc/codecs/tlv320aic23.h | 3 - sound/soc/codecs/tlv320aic26.c | 180 +-- sound/soc/codecs/tlv320aic26.h | 3 - sound/soc/codecs/tlv320aic3x.c | 223 +--- sound/soc/codecs/tlv320aic3x.h | 43 - sound/soc/codecs/tlv320dac33.c | 249 ++-- sound/soc/codecs/tlv320dac33.h | 3 - sound/soc/codecs/twl4030.c | 231 +--- sound/soc/codecs/twl4030.h | 55 - sound/soc/codecs/twl6040.c | 170 +-- sound/soc/codecs/twl6040.h | 3 - sound/soc/codecs/uda134x.c | 154 +-- sound/soc/codecs/uda134x.h | 3 - sound/soc/codecs/uda1380.c | 211 +-- sound/soc/codecs/uda1380.h | 3 - sound/soc/codecs/wm2000.h | 3 - sound/soc/codecs/wm8350.c | 231 ++-- sound/soc/codecs/wm8350.h | 3 - sound/soc/codecs/wm8400.c | 181 +-- sound/soc/codecs/wm8400.h | 3 - sound/soc/codecs/wm8510.c | 290 ++--- sound/soc/codecs/wm8510.h | 3 - sound/soc/codecs/wm8523.c | 180 +-- sound/soc/codecs/wm8523.h | 3 - sound/soc/codecs/wm8580.c | 186 +-- sound/soc/codecs/wm8580.h | 3 - sound/soc/codecs/wm8711.c | 206 +-- sound/soc/codecs/wm8711.h | 3 - sound/soc/codecs/wm8727.c | 106 +- sound/soc/codecs/wm8727.h | 21 - sound/soc/codecs/wm8728.c | 294 ++--- sound/soc/codecs/wm8728.h | 9 - sound/soc/codecs/wm8731.c | 217 +-- sound/soc/codecs/wm8731.h | 3 - sound/soc/codecs/wm8741.c | 204 +-- sound/soc/codecs/wm8741.h | 3 - sound/soc/codecs/wm8750.c | 269 ++-- sound/soc/codecs/wm8750.h | 9 - sound/soc/codecs/wm8753.c | 407 +++--- sound/soc/codecs/wm8753.h | 3 - sound/soc/codecs/wm8776.c | 251 +--- sound/soc/codecs/wm8776.h | 3 - sound/soc/codecs/wm8900.c | 251 ++-- sound/soc/codecs/wm8900.h | 3 - sound/soc/codecs/wm8903.c | 268 ++-- sound/soc/codecs/wm8903.h | 3 - sound/soc/codecs/wm8904.c | 208 +-- sound/soc/codecs/wm8904.h | 3 - sound/soc/codecs/wm8940.c | 199 +-- sound/soc/codecs/wm8940.h | 2 - sound/soc/codecs/wm8955.c | 184 +-- sound/soc/codecs/wm8955.h | 3 - sound/soc/codecs/wm8960.c | 209 +-- sound/soc/codecs/wm8960.h | 3 - sound/soc/codecs/wm8961.c | 241 ++-- sound/soc/codecs/wm8961.h | 3 - sound/soc/codecs/wm8971.c | 250 +--- sound/soc/codecs/wm8971.h | 8 - sound/soc/codecs/wm8974.c | 171 +-- sound/soc/codecs/wm8974.h | 3 - sound/soc/codecs/wm8978.c | 190 +-- sound/soc/codecs/wm8978.h | 3 - sound/soc/codecs/wm8988.c | 266 ++-- sound/soc/codecs/wm8988.h | 3 - sound/soc/codecs/wm8990.c | 226 +--- sound/soc/codecs/wm8990.h | 8 - sound/soc/codecs/wm8993.c | 307 ++--- sound/soc/codecs/wm8993.h | 3 - sound/soc/codecs/wm8994.c | 230 ++-- sound/soc/codecs/wm8994.h | 3 - sound/soc/codecs/wm9081.c | 208 +-- sound/soc/codecs/wm9081.h | 3 - sound/soc/codecs/wm9090.c | 183 +-- sound/soc/codecs/wm9090.h | 2 - sound/soc/codecs/wm9705.c | 116 +- sound/soc/codecs/wm9705.h | 3 - sound/soc/codecs/wm9712.c | 124 +- sound/soc/codecs/wm9712.h | 3 - sound/soc/codecs/wm9713.c | 131 +- sound/soc/codecs/wm9713.h | 3 - sound/soc/davinci/davinci-evm.c | 109 +- sound/soc/davinci/davinci-i2s.c | 44 +- sound/soc/davinci/davinci-i2s.h | 2 - sound/soc/davinci/davinci-mcasp.c | 32 +- sound/soc/davinci/davinci-mcasp.h | 2 - sound/soc/davinci/davinci-pcm.c | 45 +- sound/soc/davinci/davinci-pcm.h | 3 - sound/soc/davinci/davinci-sffsdr.c | 27 +- sound/soc/davinci/davinci-vcif.c | 25 +- sound/soc/davinci/davinci-vcif.h | 28 - sound/soc/ep93xx/ep93xx-i2s.c | 34 +- sound/soc/ep93xx/ep93xx-i2s.h | 18 - sound/soc/ep93xx/ep93xx-pcm.c | 37 +- sound/soc/ep93xx/ep93xx-pcm.h | 2 - sound/soc/ep93xx/snappercl15.c | 24 +- sound/soc/fsl/Kconfig | 3 - sound/soc/fsl/Makefile | 3 - sound/soc/fsl/efika-audio-fabric.c | 20 +- sound/soc/fsl/fsl_dma.c | 312 +++-- sound/soc/fsl/fsl_dma.h | 20 - sound/soc/fsl/fsl_ssi.c | 249 ++-- sound/soc/fsl/fsl_ssi.h | 26 - sound/soc/fsl/mpc5200_dma.c | 66 +- sound/soc/fsl/mpc5200_dma.h | 5 - sound/soc/fsl/mpc5200_psc_ac97.c | 34 +- sound/soc/fsl/mpc5200_psc_ac97.h | 2 - sound/soc/fsl/mpc5200_psc_i2s.c | 19 +- sound/soc/fsl/mpc8610_hpcd.c | 658 +++++----- sound/soc/fsl/pcm030-audio-fabric.c | 21 +- sound/soc/fsl/soc-of-simple.c | 172 --- sound/soc/imx/Kconfig | 16 + sound/soc/imx/Makefile | 10 +- sound/soc/imx/eukrea-tlv320.c | 16 +- sound/soc/imx/imx-pcm-dma-mx2.c | 43 +- sound/soc/imx/imx-pcm-fiq.c | 68 +- sound/soc/imx/imx-ssi.c | 148 +-- sound/soc/imx/imx-ssi.h | 7 +- sound/soc/imx/phycore-ac97.c | 19 +- sound/soc/imx/wm1133-ev1.c | 27 +- sound/soc/jz4740/jz4740-i2s.c | 104 +- sound/soc/jz4740/jz4740-i2s.h | 2 - sound/soc/jz4740/jz4740-pcm.c | 18 +- sound/soc/jz4740/jz4740-pcm.h | 2 - sound/soc/jz4740/qi_lb60.c | 20 +- sound/soc/kirkwood/kirkwood-dma.c | 64 +- sound/soc/kirkwood/kirkwood-dma.h | 17 - sound/soc/kirkwood/kirkwood-i2s.c | 52 +- sound/soc/kirkwood/kirkwood-i2s.h | 17 - sound/soc/kirkwood/kirkwood-openrd.c | 21 +- sound/soc/nuc900/nuc900-ac97.c | 12 +- sound/soc/nuc900/nuc900-audio.c | 16 +- sound/soc/nuc900/nuc900-audio.h | 4 - sound/soc/nuc900/nuc900-pcm.c | 38 +- sound/soc/omap/am3517evm.c | 25 +- sound/soc/omap/ams-delta.c | 98 +- sound/soc/omap/igep0020.c | 22 +- sound/soc/omap/mcpdm.c | 19 +- sound/soc/omap/mcpdm.h | 2 + sound/soc/omap/n810.c | 42 +- sound/soc/omap/omap-mcbsp.c | 123 +- sound/soc/omap/omap-mcbsp.h | 2 - sound/soc/omap/omap-mcpdm.c | 71 +- sound/soc/omap/omap-mcpdm.h | 29 - sound/soc/omap/omap-pcm.c | 47 +- sound/soc/omap/omap-pcm.h | 2 - sound/soc/omap/omap2evm.c | 25 +- sound/soc/omap/omap3beagle.c | 23 +- sound/soc/omap/omap3evm.c | 30 +- sound/soc/omap/omap3pandora.c | 36 +- sound/soc/omap/osk5912.c | 24 +- sound/soc/omap/overo.c | 22 +- sound/soc/omap/rx51.c | 37 +- sound/soc/omap/sdp3430.c | 56 +- sound/soc/omap/sdp4430.c | 23 +- sound/soc/omap/zoom2.c | 64 +- sound/soc/pxa/corgi.c | 25 +- sound/soc/pxa/e740_wm9705.c | 26 +- sound/soc/pxa/e750_wm9705.c | 26 +- sound/soc/pxa/e800_wm9712.c | 26 +- sound/soc/pxa/em-x270.c | 21 +- sound/soc/pxa/imote2.c | 20 +- sound/soc/pxa/magician.c | 35 +- sound/soc/pxa/mioa701_wm9713.c | 33 +- sound/soc/pxa/palm27x.c | 27 +- sound/soc/pxa/poodle.c | 27 +- sound/soc/pxa/pxa-ssp.c | 148 +-- sound/soc/pxa/pxa-ssp.h | 2 - sound/soc/pxa/pxa2xx-ac97.c | 45 +- sound/soc/pxa/pxa2xx-ac97.h | 2 - sound/soc/pxa/pxa2xx-i2s.c | 89 +- sound/soc/pxa/pxa2xx-i2s.h | 2 - sound/soc/pxa/pxa2xx-pcm.c | 45 +- sound/soc/pxa/pxa2xx-pcm.h | 19 - sound/soc/pxa/raumfeld.c | 114 +- sound/soc/pxa/spitz.c | 62 +- sound/soc/pxa/tosa.c | 27 +- sound/soc/pxa/z2.c | 26 +- sound/soc/pxa/zylonite.c | 40 +- sound/soc/s3c24xx/jive_wm8750.c | 23 +- sound/soc/s3c24xx/ln2440sbc_alc650.c | 17 +- sound/soc/s3c24xx/neo1973_gta02_wm8753.c | 58 +- sound/soc/s3c24xx/neo1973_wm8753.c | 37 +- sound/soc/s3c24xx/s3c-ac97.c | 21 +- sound/soc/s3c24xx/s3c-ac97.h | 2 - sound/soc/s3c24xx/s3c-dma.c | 45 +- sound/soc/s3c24xx/s3c-dma.h | 1 - sound/soc/s3c24xx/s3c-i2s-v2.c | 50 +- sound/soc/s3c24xx/s3c-i2s-v2.h | 13 +- sound/soc/s3c24xx/s3c-pcm.c | 41 +- sound/soc/s3c24xx/s3c2412-i2s.c | 53 +- sound/soc/s3c24xx/s3c2412-i2s.h | 2 - sound/soc/s3c24xx/s3c24xx-i2s.c | 39 +- sound/soc/s3c24xx/s3c24xx-i2s.h | 2 - sound/soc/s3c24xx/s3c24xx_simtec.c | 15 +- sound/soc/s3c24xx/s3c24xx_simtec.h | 4 +- sound/soc/s3c24xx/s3c24xx_simtec_hermes.c | 25 +- sound/soc/s3c24xx/s3c24xx_simtec_tlv320aic23.c | 21 +- sound/soc/s3c24xx/s3c24xx_uda134x.c | 21 +- sound/soc/s3c24xx/s3c64xx-i2s-v4.c | 123 +- sound/soc/s3c24xx/s3c64xx-i2s.c | 205 +-- sound/soc/s3c24xx/s3c64xx-i2s.h | 2 - sound/soc/s3c24xx/smartq_wm8987.c | 15 +- sound/soc/s3c24xx/smdk2443_wm9710.c | 17 +- sound/soc/s3c24xx/smdk64xx_wm8580.c | 33 +- sound/soc/s3c24xx/smdk_wm9713.c | 38 +- sound/soc/s6000/s6000-i2s.c | 56 +- sound/soc/s6000/s6000-i2s.h | 2 - sound/soc/s6000/s6000-pcm.c | 100 +- sound/soc/s6000/s6000-pcm.h | 2 - sound/soc/s6000/s6105-ipcam.c | 31 +- sound/soc/sh/dma-sh7760.c | 53 +- sound/soc/sh/fsi-ak4642.c | 24 +- sound/soc/sh/fsi-da7210.c | 22 +- sound/soc/sh/fsi.c | 47 +- sound/soc/sh/hac.c | 46 +- sound/soc/sh/migor.c | 29 +- sound/soc/sh/sh7760-ac97.c | 25 +- sound/soc/sh/siu.h | 5 +- sound/soc/sh/siu_dai.c | 66 +- sound/soc/sh/siu_pcm.c | 32 +- sound/soc/sh/ssi.c | 55 +- sound/soc/soc-cache.c | 34 +- sound/soc/soc-core.c | 1665 ++++++++++++++---------- sound/soc/soc-dapm.c | 88 +- sound/soc/soc-jack.c | 10 +- sound/soc/txx9/txx9aclc-ac97.c | 55 +- sound/soc/txx9/txx9aclc-generic.c | 24 +- sound/soc/txx9/txx9aclc.c | 141 +- sound/soc/txx9/txx9aclc.h | 13 +- 299 files changed, 8017 insertions(+), 13129 deletions(-) delete mode 100644 sound/soc/blackfin/bf5xx-i2s.h delete mode 100644 sound/soc/codecs/ac97.h delete mode 100644 sound/soc/codecs/ak4104.h delete mode 100644 sound/soc/codecs/ak4642.h delete mode 100644 sound/soc/codecs/cq93vc.h delete mode 100644 sound/soc/codecs/cs4270.h delete mode 100644 sound/soc/codecs/da7210.h delete mode 100644 sound/soc/codecs/jz4740.h delete mode 100644 sound/soc/codecs/spdif_transciever.h delete mode 100644 sound/soc/codecs/twl4030.h delete mode 100644 sound/soc/codecs/wm8727.h delete mode 100644 sound/soc/davinci/davinci-vcif.h delete mode 100644 sound/soc/ep93xx/ep93xx-i2s.h delete mode 100644 sound/soc/fsl/soc-of-simple.c delete mode 100644 sound/soc/kirkwood/kirkwood-dma.h delete mode 100644 sound/soc/kirkwood/kirkwood-i2s.h delete mode 100644 sound/soc/omap/omap-mcpdm.h delete mode 100644 sound/soc/pxa/pxa2xx-pcm.h (limited to 'sound') diff --git a/sound/soc/atmel/atmel-pcm.c b/sound/soc/atmel/atmel-pcm.c index dc5249fba85c..d0e75323ec19 100644 --- a/sound/soc/atmel/atmel-pcm.c +++ b/sound/soc/atmel/atmel-pcm.c @@ -179,7 +179,7 @@ static int atmel_pcm_hw_params(struct snd_pcm_substream *substream, snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); runtime->dma_bytes = params_buffer_bytes(params); - prtd->params = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); + prtd->params = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); prtd->params->dma_intr_handler = atmel_pcm_dma_irq; prtd->dma_buffer = runtime->dma_addr; @@ -374,14 +374,14 @@ static int atmel_pcm_new(struct snd_card *card, if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = 0xffffffff; - if (dai->playback.channels_min) { + if (dai->driver->playback.channels_min) { ret = atmel_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_PLAYBACK); if (ret) goto out; } - if (dai->capture.channels_min) { + if (dai->driver->capture.channels_min) { pr_debug("at32-pcm:" "Allocating PCM capture DMA buffer\n"); ret = atmel_pcm_preallocate_dma_buffer(pcm, @@ -414,12 +414,9 @@ static void atmel_pcm_free_dma_buffers(struct snd_pcm *pcm) } #ifdef CONFIG_PM -static int atmel_pcm_suspend(struct snd_soc_dai_link *dai_link) +static int atmel_pcm_suspend(struct snd_soc_dai *dai) { - struct snd_pcm *pcm = dai_link->pcm; - struct snd_pcm_str *stream = &pcm->streams[0]; - struct snd_pcm_substream *substream = stream->substream; - struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_pcm_runtime *runtime = dai->runtime; struct atmel_runtime_data *prtd; struct atmel_pcm_dma_params *params; @@ -441,12 +438,9 @@ static int atmel_pcm_suspend(struct snd_soc_dai_link *dai_link) return 0; } -static int atmel_pcm_resume(struct snd_soc_dai_link *dai_link) +static int atmel_pcm_resume(struct snd_soc_dai *dai) { - struct snd_pcm *pcm = dai_link->pcm; - struct snd_pcm_str *stream = &pcm->streams[0]; - struct snd_pcm_substream *substream = stream->substream; - struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_pcm_runtime *runtime = dai->runtime; struct atmel_runtime_data *prtd; struct atmel_pcm_dma_params *params; @@ -470,27 +464,46 @@ static int atmel_pcm_resume(struct snd_soc_dai_link *dai_link) #define atmel_pcm_resume NULL #endif -struct snd_soc_platform atmel_soc_platform = { - .name = "atmel-audio", - .pcm_ops = &atmel_pcm_ops, +static struct snd_soc_platform_driver atmel_soc_platform = { + .ops = &atmel_pcm_ops, .pcm_new = atmel_pcm_new, .pcm_free = atmel_pcm_free_dma_buffers, .suspend = atmel_pcm_suspend, .resume = atmel_pcm_resume, }; -EXPORT_SYMBOL_GPL(atmel_soc_platform); -static int __init atmel_pcm_modinit(void) +static int __devinit atmel_soc_platform_probe(struct platform_device *pdev) +{ + return snd_soc_register_platform(&pdev->dev, &atmel_soc_platform); +} + +static int __devexit atmel_soc_platform_remove(struct platform_device *pdev) +{ + snd_soc_unregister_platform(&pdev->dev); + return 0; +} + +static struct platform_driver atmel_pcm_driver = { + .driver = { + .name = "atmel-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = atmel_soc_platform_probe, + .remove = __devexit_p(atmel_soc_platform_remove), +}; + +static int __init snd_atmel_pcm_init(void) { - return snd_soc_register_platform(&atmel_soc_platform); + return platform_driver_register(&atmel_pcm_driver); } -module_init(atmel_pcm_modinit); +module_init(snd_atmel_pcm_init); -static void __exit atmel_pcm_modexit(void) +static void __exit snd_atmel_pcm_exit(void) { - snd_soc_unregister_platform(&atmel_soc_platform); + platform_driver_unregister(&atmel_pcm_driver); } -module_exit(atmel_pcm_modexit); +module_exit(snd_atmel_pcm_exit); MODULE_AUTHOR("Sedji Gaouaou "); MODULE_DESCRIPTION("Atmel PCM module"); diff --git a/sound/soc/atmel/atmel-pcm.h b/sound/soc/atmel/atmel-pcm.h index ec9b2824b663..2597329302e7 100644 --- a/sound/soc/atmel/atmel-pcm.h +++ b/sound/soc/atmel/atmel-pcm.h @@ -74,9 +74,6 @@ struct atmel_pcm_dma_params { void (*dma_intr_handler)(u32, struct snd_pcm_substream *); }; -extern struct snd_soc_platform atmel_soc_platform; - - /* * SSC register access (since ssc_writel() / ssc_readl() require literal name) */ diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c index c85844d4845b..eabf66af12cd 100644 --- a/sound/soc/atmel/atmel_ssc_dai.c +++ b/sound/soc/atmel/atmel_ssc_dai.c @@ -205,8 +205,7 @@ static irqreturn_t atmel_ssc_interrupt(int irq, void *dev_id) static int atmel_ssc_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); - struct atmel_ssc_info *ssc_p = &ssc_info[rtd->dai->cpu_dai->id]; + struct atmel_ssc_info *ssc_p = &ssc_info[dai->id]; int dir_mask; pr_debug("atmel_ssc_startup: SSC_SR=0x%u\n", @@ -235,8 +234,7 @@ static int atmel_ssc_startup(struct snd_pcm_substream *substream, static void atmel_ssc_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); - struct atmel_ssc_info *ssc_p = &ssc_info[rtd->dai->cpu_dai->id]; + struct atmel_ssc_info *ssc_p = &ssc_info[dai->id]; struct atmel_pcm_dma_params *dma_params; int dir, dir_mask; @@ -338,7 +336,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); - int id = rtd->dai->cpu_dai->id; + int id = dai->id; struct atmel_ssc_info *ssc_p = &ssc_info[id]; struct atmel_pcm_dma_params *dma_params; int dir, channels, bits; @@ -368,7 +366,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, * function. It should not be used for other purposes * as it is common to all substreams. */ - snd_soc_dai_set_dma_data(rtd->dai->cpu_dai, substream, dma_params); + snd_soc_dai_set_dma_data(rtd->cpu_dai, substream, dma_params); channels = params_channels(params); @@ -605,8 +603,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, static int atmel_ssc_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); - struct atmel_ssc_info *ssc_p = &ssc_info[rtd->dai->cpu_dai->id]; + struct atmel_ssc_info *ssc_p = &ssc_info[dai->id]; struct atmel_pcm_dma_params *dma_params; int dir; @@ -690,6 +687,32 @@ static int atmel_ssc_resume(struct snd_soc_dai *cpu_dai) # define atmel_ssc_resume NULL #endif /* CONFIG_PM */ +static int atmel_ssc_probe(struct snd_soc_dai *dai) +{ + struct atmel_ssc_info *ssc_p = &ssc_info[dai->id]; + int ret = 0; + + snd_soc_dai_set_drvdata(dai, ssc_p); + + /* + * Request SSC device + */ + ssc_p->ssc = ssc_request(dai->id); + if (IS_ERR(ssc_p->ssc)) { + printk(KERN_ERR "ASoC: Failed to request SSC %d\n", dai->id); + ret = PTR_ERR(ssc_p->ssc); + } + + return ret; +} + +static int atmel_ssc_remove(struct snd_soc_dai *dai) +{ + struct atmel_ssc_info *ssc_p = snd_soc_dai_get_drvdata(dai); + + ssc_free(ssc_p->ssc); + return 0; +} #define ATMEL_SSC_RATES (SNDRV_PCM_RATE_8000_96000) @@ -705,9 +728,11 @@ static struct snd_soc_dai_ops atmel_ssc_dai_ops = { .set_clkdiv = atmel_ssc_set_dai_clkdiv, }; -struct snd_soc_dai atmel_ssc_dai[NUM_SSC_DEVICES] = { - { .name = "atmel-ssc0", - .id = 0, +static struct snd_soc_dai_driver atmel_ssc_dai[NUM_SSC_DEVICES] = { + { + .name = "atmel-ssc-dai.0", + .probe = atmel_ssc_probe, + .remove = atmel_ssc_remove, .suspend = atmel_ssc_suspend, .resume = atmel_ssc_resume, .playback = { @@ -721,11 +746,12 @@ struct snd_soc_dai atmel_ssc_dai[NUM_SSC_DEVICES] = { .rates = ATMEL_SSC_RATES, .formats = ATMEL_SSC_FORMATS,}, .ops = &atmel_ssc_dai_ops, - .private_data = &ssc_info[0], }, #if NUM_SSC_DEVICES == 3 - { .name = "atmel-ssc1", - .id = 1, + { + .name = "atmel-ssc-dai.1", + .probe = atmel_ssc_probe, + .remove = atmel_ssc_remove, .suspend = atmel_ssc_suspend, .resume = atmel_ssc_resume, .playback = { @@ -739,10 +765,11 @@ struct snd_soc_dai atmel_ssc_dai[NUM_SSC_DEVICES] = { .rates = ATMEL_SSC_RATES, .formats = ATMEL_SSC_FORMATS,}, .ops = &atmel_ssc_dai_ops, - .private_data = &ssc_info[1], }, - { .name = "atmel-ssc2", - .id = 2, + { + .name = "atmel-ssc-dai.2", + .probe = atmel_ssc_probe, + .remove = atmel_ssc_remove, .suspend = atmel_ssc_suspend, .resume = atmel_ssc_resume, .playback = { @@ -756,23 +783,43 @@ struct snd_soc_dai atmel_ssc_dai[NUM_SSC_DEVICES] = { .rates = ATMEL_SSC_RATES, .formats = ATMEL_SSC_FORMATS,}, .ops = &atmel_ssc_dai_ops, - .private_data = &ssc_info[2], }, #endif }; -EXPORT_SYMBOL_GPL(atmel_ssc_dai); -static int __init atmel_ssc_modinit(void) +static __devinit int asoc_ssc_probe(struct platform_device *pdev) +{ + return snd_soc_register_dais(&pdev->dev, atmel_ssc_dai, + ARRAY_SIZE(atmel_ssc_dai)); +} + +static int __devexit asoc_ssc_remove(struct platform_device *pdev) +{ + snd_soc_unregister_dais(&pdev->dev, ARRAY_SIZE(atmel_ssc_dai)); + return 0; +} + +static struct platform_driver asoc_ssc_driver = { + .driver = { + .name = "atmel-ssc-dai", + .owner = THIS_MODULE, + }, + + .probe = asoc_ssc_probe, + .remove = __devexit_p(asoc_ssc_remove), +}; + +static int __init snd_atmel_ssc_init(void) { - return snd_soc_register_dais(atmel_ssc_dai, ARRAY_SIZE(atmel_ssc_dai)); + return platform_driver_register(&asoc_ssc_driver); } -module_init(atmel_ssc_modinit); +module_init(snd_atmel_ssc_init); -static void __exit atmel_ssc_modexit(void) +static void __exit snd_atmel_ssc_exit(void) { - snd_soc_unregister_dais(atmel_ssc_dai, ARRAY_SIZE(atmel_ssc_dai)); + platform_driver_unregister(&asoc_ssc_driver); } -module_exit(atmel_ssc_modexit); +module_exit(snd_atmel_ssc_exit); /* Module information */ MODULE_AUTHOR("Sedji Gaouaou, sedji.gaouaou@atmel.com, www.atmel.com"); diff --git a/sound/soc/atmel/atmel_ssc_dai.h b/sound/soc/atmel/atmel_ssc_dai.h index 391135f9c6c1..392a46953112 100644 --- a/sound/soc/atmel/atmel_ssc_dai.h +++ b/sound/soc/atmel/atmel_ssc_dai.h @@ -116,6 +116,5 @@ struct atmel_ssc_info { struct atmel_pcm_dma_params *dma_params[2]; struct atmel_ssc_state ssc_state; }; -extern struct snd_soc_dai atmel_ssc_dai[]; #endif /* _AT91_SSC_DAI_H */ diff --git a/sound/soc/atmel/playpaq_wm8510.c b/sound/soc/atmel/playpaq_wm8510.c index 9df4c68ef000..5f4e59f4461c 100644 --- a/sound/soc/atmel/playpaq_wm8510.c +++ b/sound/soc/atmel/playpaq_wm8510.c @@ -83,7 +83,7 @@ static struct ssc_clock_data playpaq_wm8510_calc_ssc_clock( struct snd_pcm_hw_params *params, struct snd_soc_dai *cpu_dai) { - struct at32_ssc_info *ssc_p = cpu_dai->private_data; + struct at32_ssc_info *ssc_p = snd_soc_dai_get_drvdata(cpu_dai); struct ssc_device *ssc = ssc_p->ssc; struct ssc_clock_data cd; unsigned int rate, width_bits, channels; @@ -131,9 +131,9 @@ static int playpaq_wm8510_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct at32_ssc_info *ssc_p = cpu_dai->private_data; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct at32_ssc_info *ssc_p = snd_soc_dai_get_drvdata(cpu_dai); struct ssc_device *ssc = ssc_p->ssc; unsigned int pll_out = 0, bclk = 0, mclk_div = 0; int ret; @@ -315,8 +315,9 @@ static const struct snd_soc_dapm_route intercon[] = { -static int playpaq_wm8510_init(struct snd_soc_codec *codec) +static int playpaq_wm8510_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int i; /* @@ -342,7 +343,7 @@ static int playpaq_wm8510_init(struct snd_soc_codec *codec) /* Make CSB show PLL rate */ - snd_soc_dai_set_clkdiv(codec->dai, WM8510_OPCLKDIV, + snd_soc_dai_set_clkdiv(rtd->codec_dai, WM8510_OPCLKDIV, WM8510_OPCLKDIV_1 | 4); return 0; @@ -353,8 +354,10 @@ static int playpaq_wm8510_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link playpaq_wm8510_dai = { .name = "WM8510", .stream_name = "WM8510 PCM", - .cpu_dai = &at32_ssc_dai[0], - .codec_dai = &wm8510_dai, + .cpu_dai_name= "atmel-ssc-dai.0", + .platform_name = "atmel-pcm-audio", + .codec_name = "wm8510-codec.0-0x1a", + .codec_dai_name = "wm8510-hifi", .init = playpaq_wm8510_init, .ops = &playpaq_wm8510_ops, }; @@ -363,46 +366,16 @@ static struct snd_soc_dai_link playpaq_wm8510_dai = { static struct snd_soc_card snd_soc_playpaq = { .name = "LRS_PlayPaq_WM8510", - .platform = &at32_soc_platform, .dai_link = &playpaq_wm8510_dai, .num_links = 1, }; - - -static struct wm8510_setup_data playpaq_wm8510_setup = { - .i2c_bus = 0, - .i2c_address = 0x1a, -}; - - - -static struct snd_soc_device playpaq_wm8510_snd_devdata = { - .card = &snd_soc_playpaq, - .codec_dev = &soc_codec_dev_wm8510, - .codec_data = &playpaq_wm8510_setup, -}; - static struct platform_device *playpaq_snd_device; static int __init playpaq_asoc_init(void) { int ret = 0; - struct at32_ssc_info *ssc_p = playpaq_wm8510_dai.cpu_dai->private_data; - struct ssc_device *ssc = NULL; - - - /* - * Request SSC device - */ - ssc = ssc_request(0); - if (IS_ERR(ssc)) { - ret = PTR_ERR(ssc); - goto err_ssc; - } - ssc_p->ssc = ssc; - /* * Configure MCLK for WM8510 @@ -439,8 +412,7 @@ static int __init playpaq_asoc_init(void) goto err_device_alloc; } - platform_set_drvdata(playpaq_snd_device, &playpaq_wm8510_snd_devdata); - playpaq_wm8510_snd_devdata.dev = &playpaq_snd_device->dev; + platform_set_drvdata(playpaq_snd_device, &snd_soc_playpaq); ret = platform_device_add(playpaq_snd_device); if (ret) { @@ -468,25 +440,12 @@ err_pll0: clk_put(_gclk0); _gclk0 = NULL; } -err_gclk0: - ssc_free(ssc); -err_ssc: return ret; } static void __exit playpaq_asoc_exit(void) { - struct at32_ssc_info *ssc_p = playpaq_wm8510_dai.cpu_dai->private_data; - struct ssc_device *ssc; - - if (ssc_p != NULL) { - ssc = ssc_p->ssc; - if (ssc != NULL) - ssc_free(ssc); - ssc_p->ssc = NULL; - } - if (_gclk0 != NULL) { clk_put(_gclk0); _gclk0 = NULL; diff --git a/sound/soc/atmel/sam9g20_wm8731.c b/sound/soc/atmel/sam9g20_wm8731.c index e028744c32ce..66a6f1879689 100644 --- a/sound/soc/atmel/sam9g20_wm8731.c +++ b/sound/soc/atmel/sam9g20_wm8731.c @@ -69,8 +69,8 @@ static int at91sam9g20ek_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret; /* set codec DAI configuration */ @@ -136,9 +136,10 @@ static const struct snd_soc_dapm_route intercon[] = { /* * Logic for a wm8731 as connected on a at91sam9g20ek board. */ -static int at91sam9g20ek_wm8731_init(struct snd_soc_codec *codec) +static int at91sam9g20ek_wm8731_init(struct snd_soc_pcm_runtime *rtd) { - struct snd_soc_dai *codec_dai = &codec->dai[0]; + struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_dai *codec_dai = rtd->codec_dai; int ret; printk(KERN_DEBUG @@ -179,31 +180,25 @@ static int at91sam9g20ek_wm8731_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link at91sam9g20ek_dai = { .name = "WM8731", .stream_name = "WM8731 PCM", - .cpu_dai = &atmel_ssc_dai[0], - .codec_dai = &wm8731_dai, + .cpu_dai_name = "atmel-ssc-dai.0", + .codec_dai_name = "wm8731-hifi", .init = at91sam9g20ek_wm8731_init, + .platform_name = "atmel_pcm-audio", + .codec_name = "wm8731-codec.0-001a", .ops = &at91sam9g20ek_ops, }; static struct snd_soc_card snd_soc_at91sam9g20ek = { .name = "AT91SAMG20-EK", - .platform = &atmel_soc_platform, .dai_link = &at91sam9g20ek_dai, .num_links = 1, .set_bias_level = at91sam9g20ek_set_bias_level, }; -static struct snd_soc_device at91sam9g20ek_snd_devdata = { - .card = &snd_soc_at91sam9g20ek, - .codec_dev = &soc_codec_dev_wm8731, -}; - static struct platform_device *at91sam9g20ek_snd_device; static int __init at91sam9g20ek_init(void) { - struct atmel_ssc_info *ssc_p = at91sam9g20ek_dai.cpu_dai->private_data; - struct ssc_device *ssc = NULL; struct clk *pllb; int ret; @@ -235,18 +230,6 @@ static int __init at91sam9g20ek_init(void) clk_set_rate(mclk, MCLK_RATE); - /* - * Request SSC device - */ - ssc = ssc_request(0); - if (IS_ERR(ssc)) { - printk(KERN_ERR "ASoC: Failed to request SSC 0\n"); - ret = PTR_ERR(ssc); - ssc = NULL; - goto err_ssc; - } - ssc_p->ssc = ssc; - at91sam9g20ek_snd_device = platform_device_alloc("soc-audio", -1); if (!at91sam9g20ek_snd_device) { printk(KERN_ERR "ASoC: Platform device allocation failed\n"); @@ -254,8 +237,7 @@ static int __init at91sam9g20ek_init(void) } platform_set_drvdata(at91sam9g20ek_snd_device, - &at91sam9g20ek_snd_devdata); - at91sam9g20ek_snd_devdata.dev = &at91sam9g20ek_snd_device->dev; + &snd_soc_at91sam9g20ek); ret = platform_device_add(at91sam9g20ek_snd_device); if (ret) { @@ -265,9 +247,6 @@ static int __init at91sam9g20ek_init(void) return ret; -err_ssc: - ssc_free(ssc); - ssc_p->ssc = NULL; err_mclk: clk_put(mclk); mclk = NULL; @@ -277,16 +256,6 @@ err: static void __exit at91sam9g20ek_exit(void) { - struct atmel_ssc_info *ssc_p = at91sam9g20ek_dai.cpu_dai->private_data; - struct ssc_device *ssc; - - if (ssc_p != NULL) { - ssc = ssc_p->ssc; - if (ssc != NULL) - ssc_free(ssc); - ssc_p->ssc = NULL; - } - platform_device_unregister(at91sam9g20ek_snd_device); at91sam9g20ek_snd_device = NULL; clk_put(mclk); diff --git a/sound/soc/atmel/snd-soc-afeb9260.c b/sound/soc/atmel/snd-soc-afeb9260.c index 23349de27313..e3d283561c19 100644 --- a/sound/soc/atmel/snd-soc-afeb9260.c +++ b/sound/soc/atmel/snd-soc-afeb9260.c @@ -46,8 +46,8 @@ static int afeb9260_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int err; /* Set codec DAI configuration */ @@ -102,8 +102,9 @@ static const struct snd_soc_dapm_route audio_map[] = { {"MICIN", NULL, "Mic Jack"}, }; -static int afeb9260_tlv320aic23_init(struct snd_soc_codec *codec) +static int afeb9260_tlv320aic23_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; /* Add afeb9260 specific widgets */ snd_soc_dapm_new_controls(codec, tlv320aic23_dapm_widgets, @@ -125,8 +126,10 @@ static int afeb9260_tlv320aic23_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link afeb9260_dai = { .name = "TLV320AIC23", .stream_name = "AIC23", - .cpu_dai = &atmel_ssc_dai[0], - .codec_dai = &tlv320aic23_dai, + .cpu_dai_name = "atmel-ssc-dai.0", + .codec_dai_name = "tlv320aic23-hifi", + .platform_name = "atmel_pcm-audio", + .codec_name = "tlv320aic23-codec.0-0x1a", .init = afeb9260_tlv320aic23_init, .ops = &afeb9260_ops, }; @@ -134,37 +137,20 @@ static struct snd_soc_dai_link afeb9260_dai = { /* Audio machine driver */ static struct snd_soc_card snd_soc_machine_afeb9260 = { .name = "AFEB9260", - .platform = &atmel_soc_platform, .dai_link = &afeb9260_dai, .num_links = 1, }; -/* Audio subsystem */ -static struct snd_soc_device afeb9260_snd_devdata = { - .card = &snd_soc_machine_afeb9260, - .codec_dev = &soc_codec_dev_tlv320aic23, -}; - static struct platform_device *afeb9260_snd_device; static int __init afeb9260_soc_init(void) { int err; struct device *dev; - struct atmel_ssc_info *ssc_p = afeb9260_dai.cpu_dai->private_data; - struct ssc_device *ssc = NULL; if (!(machine_is_afeb9260())) return -ENODEV; - ssc = ssc_request(0); - if (IS_ERR(ssc)) { - printk(KERN_ERR "ASoC: Failed to request SSC 0\n"); - err = PTR_ERR(ssc); - ssc = NULL; - goto err_ssc; - } - ssc_p->ssc = ssc; afeb9260_snd_device = platform_device_alloc("soc-audio", -1); if (!afeb9260_snd_device) { @@ -172,8 +158,7 @@ static int __init afeb9260_soc_init(void) return -ENOMEM; } - platform_set_drvdata(afeb9260_snd_device, &afeb9260_snd_devdata); - afeb9260_snd_devdata.dev = &afeb9260_snd_device->dev; + platform_set_drvdata(afeb9260_snd_device, &snd_soc_machine_afeb9260); err = platform_device_add(afeb9260_snd_device); if (err) goto err1; @@ -184,9 +169,7 @@ static int __init afeb9260_soc_init(void) err1: platform_device_del(afeb9260_snd_device); platform_device_put(afeb9260_snd_device); -err_ssc: return err; - } static void __exit afeb9260_soc_exit(void) diff --git a/sound/soc/au1x/db1200.c b/sound/soc/au1x/db1200.c index cdf7be1b9b91..8780c90107fc 100644 --- a/sound/soc/au1x/db1200.c +++ b/sound/soc/au1x/db1200.c @@ -19,7 +19,6 @@ #include #include -#include "../codecs/ac97.h" #include "../codecs/wm8731.h" #include "psc.h" @@ -28,20 +27,16 @@ static struct snd_soc_dai_link db1200_ac97_dai = { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai = &au1xpsc_ac97_dai, - .codec_dai = &ac97_dai, + .cpu_dai_name = "au1xpsc-ac97", + .codec_dai_name = "ac97-hifi", + .platform_name = "au1xpsc-pcm-audio", + .codec_name = "ac97-codec", }; static struct snd_soc_card db1200_ac97_machine = { .name = "DB1200_AC97", .dai_link = &db1200_ac97_dai, .num_links = 1, - .platform = &au1xpsc_soc_platform, -}; - -static struct snd_soc_device db1200_ac97_devdata = { - .card = &db1200_ac97_machine, - .codec_dev = &soc_codec_dev_ac97, }; /*------------------------- I2S PART ---------------------------*/ @@ -49,8 +44,8 @@ static struct snd_soc_device db1200_ac97_devdata = { static int db1200_i2s_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret; /* WM8731 has its own 12MHz crystal */ @@ -80,8 +75,10 @@ static struct snd_soc_ops db1200_i2s_wm8731_ops = { static struct snd_soc_dai_link db1200_i2s_dai = { .name = "WM8731", .stream_name = "WM8731 PCM", - .cpu_dai = &au1xpsc_i2s_dai, - .codec_dai = &wm8731_dai, + .cpu_dai_name = "au1xpsc", + .codec_dai_name = "wm8731-hifi" + .platform_name = "au1xpsc-pcm-audio", + .codec_name = "wm8731-codec.0-001a", .ops = &db1200_i2s_wm8731_ops, }; @@ -89,12 +86,6 @@ static struct snd_soc_card db1200_i2s_machine = { .name = "DB1200_I2S", .dai_link = &db1200_i2s_dai, .num_links = 1, - .platform = &au1xpsc_soc_platform, -}; - -static struct snd_soc_device db1200_i2s_devdata = { - .card = &db1200_i2s_machine, - .codec_dev = &soc_codec_dev_wm8731, }; /*------------------------- COMMON PART ---------------------------*/ @@ -112,12 +103,10 @@ static int __init db1200_audio_load(void) /* DB1200 board setup set PSC1MUX to preferred audio device */ if (bcsr_read(BCSR_RESETS) & BCSR_RESETS_PSC1MUX) - platform_set_drvdata(db1200_asoc_dev, &db1200_i2s_devdata); + platform_set_drvdata(db1200_asoc_dev, &db1200_i2s_machine); else - platform_set_drvdata(db1200_asoc_dev, &db1200_ac97_devdata); + platform_set_drvdata(db1200_asoc_dev, &db1200_ac97_machine); - db1200_ac97_devdata.dev = &db1200_asoc_dev->dev; - db1200_i2s_devdata.dev = &db1200_asoc_dev->dev; ret = platform_device_add(db1200_asoc_dev); if (ret) { diff --git a/sound/soc/au1x/dbdma2.c b/sound/soc/au1x/dbdma2.c index 6d9f4c624949..00fdb9cbfc2d 100644 --- a/sound/soc/au1x/dbdma2.c +++ b/sound/soc/au1x/dbdma2.c @@ -329,7 +329,7 @@ static int au1xpsc_pcm_new(struct snd_card *card, return 0; } -static int au1xpsc_pcm_probe(struct platform_device *pdev) +static int au1xpsc_pcm_probe(struct snd_soc_platform *platform) { if (!au1xpsc_audio_pcmdma[PCM_TX] || !au1xpsc_audio_pcmdma[PCM_RX]) return -ENODEV; @@ -337,17 +337,10 @@ static int au1xpsc_pcm_probe(struct platform_device *pdev) return 0; } -static int au1xpsc_pcm_remove(struct platform_device *pdev) -{ - return 0; -} - /* au1xpsc audio platform */ -struct snd_soc_platform au1xpsc_soc_platform = { - .name = "au1xpsc-pcm-dbdma", +struct snd_soc_platform_driver au1xpsc_soc_platform = { .probe = au1xpsc_pcm_probe, - .remove = au1xpsc_pcm_remove, - .pcm_ops = &au1xpsc_pcm_ops, + .ops = &au1xpsc_pcm_ops, .pcm_new = au1xpsc_pcm_new, .pcm_free = au1xpsc_pcm_free_dma_buffers, }; @@ -387,7 +380,7 @@ static int __devinit au1xpsc_pcm_drvprobe(struct platform_device *pdev) } (au1xpsc_audio_pcmdma[PCM_RX])->ddma_id = r->start; - ret = snd_soc_register_platform(&au1xpsc_soc_platform); + ret = snd_soc_register_platform(&pdev->dev, &au1xpsc_soc_platform); if (!ret) return ret; @@ -404,7 +397,7 @@ static int __devexit au1xpsc_pcm_drvremove(struct platform_device *pdev) { int i; - snd_soc_unregister_platform(&au1xpsc_soc_platform); + snd_soc_unregister_platform(&pdev->dev); for (i = 0; i < 2; i++) { if (au1xpsc_audio_pcmdma[i]) { @@ -419,7 +412,7 @@ static int __devexit au1xpsc_pcm_drvremove(struct platform_device *pdev) static struct platform_driver au1xpsc_pcm_driver = { .driver = { - .name = "au1xpsc-pcm", + .name = "au1xpsc-pcm-audio", .owner = THIS_MODULE, }, .probe = au1xpsc_pcm_drvprobe, diff --git a/sound/soc/au1x/psc-ac97.c b/sound/soc/au1x/psc-ac97.c index d14a5a91a465..6a9516cbe424 100644 --- a/sound/soc/au1x/psc-ac97.c +++ b/sound/soc/au1x/psc-ac97.c @@ -315,27 +315,19 @@ static int au1xpsc_ac97_trigger(struct snd_pcm_substream *substream, return ret; } -static int au1xpsc_ac97_probe(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int au1xpsc_ac97_probe(struct snd_soc_dai *dai) { return au1xpsc_ac97_workdata ? 0 : -ENODEV; } -static void au1xpsc_ac97_remove(struct platform_device *pdev, - struct snd_soc_dai *dai) -{ -} - static struct snd_soc_dai_ops au1xpsc_ac97_dai_ops = { .trigger = au1xpsc_ac97_trigger, .hw_params = au1xpsc_ac97_hw_params, }; -struct snd_soc_dai au1xpsc_ac97_dai = { - .name = "au1xpsc_ac97", +struct snd_soc_dai_driver au1xpsc_ac97_dai = { .ac97_control = 1, .probe = au1xpsc_ac97_probe, - .remove = au1xpsc_ac97_remove, .playback = { .rates = AC97_RATES, .formats = AC97_FMTS, @@ -395,7 +387,7 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) au_writel(PSC_SEL_PS_AC97MODE | sel, PSC_SEL(wd)); au_sync(); - ret = snd_soc_register_dai(&au1xpsc_ac97_dai); + ret = snd_soc_register_dai(&pdev->dev, &au1xpsc_ac97_dai); if (ret) goto out1; @@ -406,7 +398,7 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) return 0; } - snd_soc_unregister_dai(&au1xpsc_ac97_dai); + snd_soc_unregister_dai(&pdev->dev); out1: release_mem_region(r->start, resource_size(r)); out0: @@ -422,7 +414,7 @@ static int __devexit au1xpsc_ac97_drvremove(struct platform_device *pdev) if (wd->dmapd) au1xpsc_pcm_destroy(wd->dmapd); - snd_soc_unregister_dai(&au1xpsc_ac97_dai); + snd_soc_unregister_dai(&pdev->dev); /* disable PSC completely */ au_writel(0, AC97_CFG(wd)); @@ -485,7 +477,7 @@ static struct dev_pm_ops au1xpscac97_pmops = { static struct platform_driver au1xpsc_ac97_driver = { .driver = { - .name = "au1xpsc_ac97", + .name = "au1xpsc-ac97", .owner = THIS_MODULE, .pm = AU1XPSCAC97_PMOPS, }, diff --git a/sound/soc/au1x/psc-i2s.c b/sound/soc/au1x/psc-i2s.c index 6083fe7799fa..94e560a8756d 100644 --- a/sound/soc/au1x/psc-i2s.c +++ b/sound/soc/au1x/psc-i2s.c @@ -263,27 +263,19 @@ static int au1xpsc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, return ret; } -static int au1xpsc_i2s_probe(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int au1xpsc_i2s_probe(struct snd_soc_dai *dai) { return au1xpsc_i2s_workdata ? 0 : -ENODEV; } -static void au1xpsc_i2s_remove(struct platform_device *pdev, - struct snd_soc_dai *dai) -{ -} - static struct snd_soc_dai_ops au1xpsc_i2s_dai_ops = { .trigger = au1xpsc_i2s_trigger, .hw_params = au1xpsc_i2s_hw_params, .set_fmt = au1xpsc_i2s_set_fmt, }; -struct snd_soc_dai au1xpsc_i2s_dai = { - .name = "au1xpsc_i2s", +static struct snd_soc_dai_driver au1xpsc_i2s_dai = { .probe = au1xpsc_i2s_probe, - .remove = au1xpsc_i2s_remove, .playback = { .rates = AU1XPSC_I2S_RATES, .formats = AU1XPSC_I2S_FMTS, @@ -298,7 +290,6 @@ struct snd_soc_dai au1xpsc_i2s_dai = { }, .ops = &au1xpsc_i2s_dai_ops, }; -EXPORT_SYMBOL(au1xpsc_i2s_dai); static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev) { @@ -346,7 +337,7 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev) * time out. */ - ret = snd_soc_register_dai(&au1xpsc_i2s_dai); + ret = snd_soc_register_dai(&pdev->dev, &au1xpsc_i2s_dai); if (ret) goto out1; @@ -358,7 +349,7 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev) return 0; } - snd_soc_unregister_dai(&au1xpsc_i2s_dai); + snd_soc_unregister_dai(&pdev->dev); out1: release_mem_region(r->start, resource_size(r)); out0: @@ -374,7 +365,7 @@ static int __devexit au1xpsc_i2s_drvremove(struct platform_device *pdev) if (wd->dmapd) au1xpsc_pcm_destroy(wd->dmapd); - snd_soc_unregister_dai(&au1xpsc_i2s_dai); + snd_soc_unregister_dai(&pdev->dev); au_writel(0, I2S_CFG(wd)); au_sync(); @@ -436,7 +427,7 @@ static struct dev_pm_ops au1xpsci2s_pmops = { static struct platform_driver au1xpsc_i2s_driver = { .driver = { - .name = "au1xpsc_i2s", + .name = "au1xpsc", .owner = THIS_MODULE, .pm = AU1XPSCI2S_PMOPS, }, diff --git a/sound/soc/au1x/psc.h b/sound/soc/au1x/psc.h index 093775d4dc3e..f281443fd52f 100644 --- a/sound/soc/au1x/psc.h +++ b/sound/soc/au1x/psc.h @@ -16,9 +16,6 @@ #ifndef _AU1X_PCM_H #define _AU1X_PCM_H -extern struct snd_soc_dai au1xpsc_ac97_dai; -extern struct snd_soc_dai au1xpsc_i2s_dai; -extern struct snd_soc_platform au1xpsc_soc_platform; extern struct snd_ac97_bus_ops soc_ac97_ops; /* DBDMA helpers */ diff --git a/sound/soc/blackfin/bf5xx-ac97-pcm.c b/sound/soc/blackfin/bf5xx-ac97-pcm.c index 5e7aacf3bb5a..5a2fd8abaefa 100644 --- a/sound/soc/blackfin/bf5xx-ac97-pcm.c +++ b/sound/soc/blackfin/bf5xx-ac97-pcm.c @@ -422,14 +422,14 @@ int bf5xx_pcm_ac97_new(struct snd_card *card, struct snd_soc_dai *dai, if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - if (dai->playback.channels_min) { + if (dai->driver->playback.channels_min) { ret = bf5xx_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_PLAYBACK); if (ret) goto out; } - if (dai->capture.channels_min) { + if (dai->driver->capture.channels_min) { ret = bf5xx_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_CAPTURE); if (ret) @@ -439,25 +439,44 @@ int bf5xx_pcm_ac97_new(struct snd_card *card, struct snd_soc_dai *dai, return ret; } -struct snd_soc_platform bf5xx_ac97_soc_platform = { - .name = "bf5xx-audio", - .pcm_ops = &bf5xx_pcm_ac97_ops, +static struct snd_soc_platform_driver bf5xx_ac97_soc_platform = { + .ops = &bf5xx_pcm_ac97_ops, .pcm_new = bf5xx_pcm_ac97_new, .pcm_free = bf5xx_pcm_free_dma_buffers, }; -EXPORT_SYMBOL_GPL(bf5xx_ac97_soc_platform); -static int __init bfin_ac97_init(void) +static int __devinit bf5xx_soc_platform_probe(struct platform_device *pdev) { - return snd_soc_register_platform(&bf5xx_ac97_soc_platform); + return snd_soc_register_platform(&pdev->dev, &bf5xx_ac97_soc_platform); } -module_init(bfin_ac97_init); -static void __exit bfin_ac97_exit(void) +static int __devexit bf5xx_soc_platform_remove(struct platform_device *pdev) { - snd_soc_unregister_platform(&bf5xx_ac97_soc_platform); + snd_soc_unregister_platform(&pdev->dev); + return 0; +} + +static struct platform_driver bf5xx_pcm_driver = { + .driver = { + .name = "bf5xx-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = bf5xx_soc_platform_probe, + .remove = __devexit_p(bf5xx_soc_platform_remove), +}; + +static int __init snd_bf5xx_pcm_init(void) +{ + return platform_driver_register(&bf5xx_pcm_driver); +} +module_init(snd_bf5xx_pcm_init); + +static void __exit snd_bf5xx_pcm_exit(void) +{ + platform_driver_unregister(&bf5xx_pcm_driver); } -module_exit(bfin_ac97_exit); +module_exit(snd_bf5xx_pcm_exit); MODULE_AUTHOR("Cliff Cai"); MODULE_DESCRIPTION("ADI Blackfin AC97 PCM DMA module"); diff --git a/sound/soc/blackfin/bf5xx-ac97-pcm.h b/sound/soc/blackfin/bf5xx-ac97-pcm.h index 350125a0ae21..d324d5826a9b 100644 --- a/sound/soc/blackfin/bf5xx-ac97-pcm.h +++ b/sound/soc/blackfin/bf5xx-ac97-pcm.h @@ -23,7 +23,4 @@ struct bf5xx_gpio { u32 frm; }; -/* platform data */ -extern struct snd_soc_platform bf5xx_ac97_soc_platform; - #endif diff --git a/sound/soc/blackfin/bf5xx-ac97.c b/sound/soc/blackfin/bf5xx-ac97.c index c0eba5109980..c5f856ec27ca 100644 --- a/sound/soc/blackfin/bf5xx-ac97.c +++ b/sound/soc/blackfin/bf5xx-ac97.c @@ -255,7 +255,7 @@ EXPORT_SYMBOL_GPL(soc_ac97_ops); #ifdef CONFIG_PM static int bf5xx_ac97_suspend(struct snd_soc_dai *dai) { - struct sport_device *sport = dai->private_data; + struct sport_device *sport = snd_soc_dai_get_drvdata(dai); pr_debug("%s : sport %d\n", __func__, dai->id); if (!dai->active) @@ -270,7 +270,7 @@ static int bf5xx_ac97_suspend(struct snd_soc_dai *dai) static int bf5xx_ac97_resume(struct snd_soc_dai *dai) { int ret; - struct sport_device *sport = dai->private_data; + struct sport_device *sport = snd_soc_dai_get_drvdata(dai); pr_debug("%s : sport %d\n", __func__, dai->id); if (!dai->active) @@ -306,8 +306,7 @@ static int bf5xx_ac97_resume(struct snd_soc_dai *dai) #define bf5xx_ac97_resume NULL #endif -static int bf5xx_ac97_probe(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int bf5xx_ac97_probe(struct snd_soc_dai *dai) { int ret = 0; cmd_count = (int *)get_zeroed_page(GFP_KERNEL); @@ -379,8 +378,7 @@ peripheral_err: return ret; } -static void bf5xx_ac97_remove(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int bf5xx_ac97_remove(struct snd_soc_dai *dai) { free_page((unsigned long)cmd_count); cmd_count = NULL; @@ -388,11 +386,10 @@ static void bf5xx_ac97_remove(struct platform_device *pdev, #ifdef CONFIG_SND_BF5XX_HAVE_COLD_RESET gpio_free(CONFIG_SND_BF5XX_RESET_GPIO_NUM); #endif + return 0; } -struct snd_soc_dai bfin_ac97_dai = { - .name = "bf5xx-ac97", - .id = 0, +struct snd_soc_dai_driver bfin_ac97_dai = { .ac97_control = 1, .probe = bf5xx_ac97_probe, .remove = bf5xx_ac97_remove, @@ -417,18 +414,40 @@ struct snd_soc_dai bfin_ac97_dai = { }; EXPORT_SYMBOL_GPL(bfin_ac97_dai); +static __devinit int asoc_bfin_ac97_probe(struct platform_device *pdev) +{ + return snd_soc_register_dai(&pdev->dev, &bfin_ac97_dai); +} + +static int __devexit asoc_bfin_ac97_remove(struct platform_device *pdev) +{ + snd_soc_unregister_dai(&pdev->dev); + return 0; +} + +static struct platform_driver asoc_bfin_ac97_driver = { + .driver = { + .name = "bfin-ac97", + .owner = THIS_MODULE, + }, + + .probe = asoc_bfin_ac97_probe, + .remove = __devexit_p(asoc_bfin_ac97_remove), +}; + static int __init bfin_ac97_init(void) { - return snd_soc_register_dai(&bfin_ac97_dai); + return platform_driver_register(&asoc_bfin_ac97_driver); } module_init(bfin_ac97_init); static void __exit bfin_ac97_exit(void) { - snd_soc_unregister_dai(&bfin_ac97_dai); + platform_driver_unregister(&asoc_bfin_ac97_driver); } module_exit(bfin_ac97_exit); + MODULE_AUTHOR("Roy Huang"); MODULE_DESCRIPTION("AC97 driver for ADI Blackfin"); MODULE_LICENSE("GPL"); diff --git a/sound/soc/blackfin/bf5xx-ac97.h b/sound/soc/blackfin/bf5xx-ac97.h index a1f97dd809d6..15c635e33f4d 100644 --- a/sound/soc/blackfin/bf5xx-ac97.h +++ b/sound/soc/blackfin/bf5xx-ac97.h @@ -50,8 +50,6 @@ struct ac97_frame { #define TAG_PCM_SR 0x0080 #define TAG_PCM_LFE 0x0040 -extern struct snd_soc_dai bfin_ac97_dai; - void bf5xx_pcm_to_ac97(struct ac97_frame *dst, const __u16 *src, \ size_t count, unsigned int chan_mask); diff --git a/sound/soc/blackfin/bf5xx-ad1836.c b/sound/soc/blackfin/bf5xx-ad1836.c index 0f45a3f56be8..2394bff2b655 100644 --- a/sound/soc/blackfin/bf5xx-ad1836.c +++ b/sound/soc/blackfin/bf5xx-ad1836.c @@ -40,9 +40,9 @@ static struct snd_soc_card bf5xx_ad1836; static int bf5xx_ad1836_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - cpu_dai->private_data = sport_handle; + snd_soc_dai_set_drvdata(cpu_dai, sport_handle); return 0; } @@ -50,8 +50,8 @@ static int bf5xx_ad1836_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; unsigned int channel_map[] = {0, 4, 1, 5, 2, 6, 3, 7}; int ret = 0; /* set cpu DAI configuration */ @@ -83,23 +83,19 @@ static struct snd_soc_ops bf5xx_ad1836_ops = { static struct snd_soc_dai_link bf5xx_ad1836_dai = { .name = "ad1836", .stream_name = "AD1836", - .cpu_dai = &bf5xx_tdm_dai, - .codec_dai = &ad1836_dai, + .cpu_dai_name = "bf5xx-tdm", + .codec_dai_name = "ad1836-hifi", + .platform_name = "bf5xx-tdm-pcm-audio", + .codec_name = "ad1836-codec.0", .ops = &bf5xx_ad1836_ops, }; static struct snd_soc_card bf5xx_ad1836 = { .name = "bf5xx_ad1836", - .platform = &bf5xx_tdm_soc_platform, .dai_link = &bf5xx_ad1836_dai, .num_links = 1, }; -static struct snd_soc_device bf5xx_ad1836_snd_devdata = { - .card = &bf5xx_ad1836, - .codec_dev = &soc_codec_dev_ad1836, -}; - static struct platform_device *bfxx_ad1836_snd_device; static int __init bf5xx_ad1836_init(void) @@ -110,8 +106,7 @@ static int __init bf5xx_ad1836_init(void) if (!bfxx_ad1836_snd_device) return -ENOMEM; - platform_set_drvdata(bfxx_ad1836_snd_device, &bf5xx_ad1836_snd_devdata); - bf5xx_ad1836_snd_devdata.dev = &bfxx_ad1836_snd_device->dev; + platform_set_drvdata(bfxx_ad1836_snd_device, &bf5xx_ad1836); ret = platform_device_add(bfxx_ad1836_snd_device); if (ret) diff --git a/sound/soc/blackfin/bf5xx-ad193x.c b/sound/soc/blackfin/bf5xx-ad193x.c index b8c9060cfd8e..e4a625317a1a 100644 --- a/sound/soc/blackfin/bf5xx-ad193x.c +++ b/sound/soc/blackfin/bf5xx-ad193x.c @@ -49,9 +49,9 @@ static struct snd_soc_card bf5xx_ad193x; static int bf5xx_ad193x_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - cpu_dai->private_data = sport_handle; + snd_soc_dai_set_drvdata(cpu_dai, sport_handle); return 0; } @@ -59,8 +59,8 @@ static int bf5xx_ad193x_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; unsigned int channel_map[] = {0, 1, 2, 3, 4, 5, 6, 7}; int ret = 0; /* set cpu DAI configuration */ @@ -97,23 +97,19 @@ static struct snd_soc_ops bf5xx_ad193x_ops = { static struct snd_soc_dai_link bf5xx_ad193x_dai = { .name = "ad193x", .stream_name = "AD193X", - .cpu_dai = &bf5xx_tdm_dai, - .codec_dai = &ad193x_dai, + .cpu_dai_name = "bf5xx-tdm", + .codec_dai_name ="ad193x-hifi", + .platform_name = "bf5xx-tdm-pcm-audio", + .codec_name = "ad193x-codec.5", .ops = &bf5xx_ad193x_ops, }; static struct snd_soc_card bf5xx_ad193x = { .name = "bf5xx_ad193x", - .platform = &bf5xx_tdm_soc_platform, .dai_link = &bf5xx_ad193x_dai, .num_links = 1, }; -static struct snd_soc_device bf5xx_ad193x_snd_devdata = { - .card = &bf5xx_ad193x, - .codec_dev = &soc_codec_dev_ad193x, -}; - static struct platform_device *bfxx_ad193x_snd_device; static int __init bf5xx_ad193x_init(void) @@ -124,8 +120,7 @@ static int __init bf5xx_ad193x_init(void) if (!bfxx_ad193x_snd_device) return -ENOMEM; - platform_set_drvdata(bfxx_ad193x_snd_device, &bf5xx_ad193x_snd_devdata); - bf5xx_ad193x_snd_devdata.dev = &bfxx_ad193x_snd_device->dev; + platform_set_drvdata(bfxx_ad193x_snd_device, &bf5xx_ad193x); ret = platform_device_add(bfxx_ad193x_snd_device); if (ret) diff --git a/sound/soc/blackfin/bf5xx-ad1980.c b/sound/soc/blackfin/bf5xx-ad1980.c index d8f591273778..a31bdf656fce 100644 --- a/sound/soc/blackfin/bf5xx-ad1980.c +++ b/sound/soc/blackfin/bf5xx-ad1980.c @@ -48,10 +48,10 @@ static struct snd_soc_card bf5xx_board; static int bf5xx_board_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; pr_debug("%s enter\n", __func__); - cpu_dai->private_data = sport_handle; + snd_soc_dai_set_drvdata(cpu_dai, sport_handle); return 0; } @@ -62,23 +62,19 @@ static struct snd_soc_ops bf5xx_board_ops = { static struct snd_soc_dai_link bf5xx_board_dai = { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai = &bfin_ac97_dai, - .codec_dai = &ad1980_dai, + .cpu_dai_name = "bfin-ac97", + .codec_dai_name = "ad1980-hifi", + .platform_name = "bfin-pcm-audio", + .codec_name = "ad1980-codec", .ops = &bf5xx_board_ops, }; static struct snd_soc_card bf5xx_board = { .name = "bf5xx-board", - .platform = &bf5xx_ac97_soc_platform, .dai_link = &bf5xx_board_dai, .num_links = 1, }; -static struct snd_soc_device bf5xx_board_snd_devdata = { - .card = &bf5xx_board, - .codec_dev = &soc_codec_dev_ad1980, -}; - static struct platform_device *bf5xx_board_snd_device; static int __init bf5xx_board_init(void) @@ -89,8 +85,7 @@ static int __init bf5xx_board_init(void) if (!bf5xx_board_snd_device) return -ENOMEM; - platform_set_drvdata(bf5xx_board_snd_device, &bf5xx_board_snd_devdata); - bf5xx_board_snd_devdata.dev = &bf5xx_board_snd_device->dev; + platform_set_drvdata(bf5xx_board_snd_device, &bf5xx_board); ret = platform_device_add(bf5xx_board_snd_device); if (ret) diff --git a/sound/soc/blackfin/bf5xx-ad73311.c b/sound/soc/blackfin/bf5xx-ad73311.c index 9825b71d0e28..900ced54ac79 100644 --- a/sound/soc/blackfin/bf5xx-ad73311.c +++ b/sound/soc/blackfin/bf5xx-ad73311.c @@ -47,7 +47,6 @@ #include "../codecs/ad73311.h" #include "bf5xx-sport.h" #include "bf5xx-i2s-pcm.h" -#include "bf5xx-i2s.h" #if CONFIG_SND_BF5XX_SPORT_NUM == 0 #define bfin_write_SPORT_TCR1 bfin_write_SPORT0_TCR1 @@ -150,10 +149,10 @@ static int bf5xx_probe(struct platform_device *pdev) static int bf5xx_ad73311_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; pr_debug("%s enter\n", __func__); - cpu_dai->private_data = sport_handle; + snd_soc_dai_set_drvdata(cpu_dai, sport_handle); return 0; } @@ -161,7 +160,7 @@ static int bf5xx_ad73311_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret = 0; pr_debug("%s rate %d format %x\n", __func__, params_rate(params), @@ -185,24 +184,20 @@ static struct snd_soc_ops bf5xx_ad73311_ops = { static struct snd_soc_dai_link bf5xx_ad73311_dai = { .name = "ad73311", .stream_name = "AD73311", - .cpu_dai = &bf5xx_i2s_dai, - .codec_dai = &ad73311_dai, + .cpu_dai_name = "bf5xx-i2s", + .codec_dai_name = "ad73311-hifi", + .platform_name = "bfin-pcm-audio", + .codec_name = "ad73311-codec", .ops = &bf5xx_ad73311_ops, }; static struct snd_soc_card bf5xx_ad73311 = { .name = "bf5xx_ad73311", - .platform = &bf5xx_i2s_soc_platform, .probe = bf5xx_probe, .dai_link = &bf5xx_ad73311_dai, .num_links = 1, }; -static struct snd_soc_device bf5xx_ad73311_snd_devdata = { - .card = &bf5xx_ad73311, - .codec_dev = &soc_codec_dev_ad73311, -}; - static struct platform_device *bf5xx_ad73311_snd_device; static int __init bf5xx_ad73311_init(void) @@ -214,8 +209,7 @@ static int __init bf5xx_ad73311_init(void) if (!bf5xx_ad73311_snd_device) return -ENOMEM; - platform_set_drvdata(bf5xx_ad73311_snd_device, &bf5xx_ad73311_snd_devdata); - bf5xx_ad73311_snd_devdata.dev = &bf5xx_ad73311_snd_device->dev; + platform_set_drvdata(bf5xx_ad73311_snd_device, &bf5xx_ad73311); ret = platform_device_add(bf5xx_ad73311_snd_device); if (ret) diff --git a/sound/soc/blackfin/bf5xx-i2s-pcm.c b/sound/soc/blackfin/bf5xx-i2s-pcm.c index 1d2a1adf2575..890a0dccf902 100644 --- a/sound/soc/blackfin/bf5xx-i2s-pcm.c +++ b/sound/soc/blackfin/bf5xx-i2s-pcm.c @@ -40,7 +40,6 @@ #include #include "bf5xx-i2s-pcm.h" -#include "bf5xx-i2s.h" #include "bf5xx-sport.h" static void bf5xx_dma_irq(void *data) @@ -257,14 +256,14 @@ int bf5xx_pcm_i2s_new(struct snd_card *card, struct snd_soc_dai *dai, if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - if (dai->playback.channels_min) { + if (dai->driver->playback.channels_min) { ret = bf5xx_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_PLAYBACK); if (ret) goto out; } - if (dai->capture.channels_min) { + if (dai->driver->capture.channels_min) { ret = bf5xx_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_CAPTURE); if (ret) @@ -274,25 +273,44 @@ int bf5xx_pcm_i2s_new(struct snd_card *card, struct snd_soc_dai *dai, return ret; } -struct snd_soc_platform bf5xx_i2s_soc_platform = { - .name = "bf5xx-audio", - .pcm_ops = &bf5xx_pcm_i2s_ops, +static struct snd_soc_platform_driver bf5xx_i2s_soc_platform = { + .ops = &bf5xx_pcm_i2s_ops, .pcm_new = bf5xx_pcm_i2s_new, .pcm_free = bf5xx_pcm_free_dma_buffers, }; -EXPORT_SYMBOL_GPL(bf5xx_i2s_soc_platform); -static int __init bfin_i2s_init(void) +static int __devinit bfin_i2s_soc_platform_probe(struct platform_device *pdev) { - return snd_soc_register_platform(&bf5xx_i2s_soc_platform); + return snd_soc_register_platform(&pdev->dev, &bf5xx_i2s_soc_platform); } -module_init(bfin_i2s_init); -static void __exit bfin_i2s_exit(void) +static int __devexit bfin_i2s_soc_platform_remove(struct platform_device *pdev) { - snd_soc_unregister_platform(&bf5xx_i2s_soc_platform); + snd_soc_unregister_platform(&pdev->dev); + return 0; +} + +static struct platform_driver bfin_i2s_pcm_driver = { + .driver = { + .name = "bfin-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = bfin_i2s_soc_platform_probe, + .remove = __devexit_p(bfin_i2s_soc_platform_remove), +}; + +static int __init snd_bfin_i2s_pcm_init(void) +{ + return platform_driver_register(&bfin_i2s_pcm_driver); +} +module_init(snd_bfin_i2s_pcm_init); + +static void __exit snd_bfin_i2s_pcm_exit(void) +{ + platform_driver_unregister(&bfin_i2s_pcm_driver); } -module_exit(bfin_i2s_exit); +module_exit(snd_bfin_i2s_pcm_exit); MODULE_AUTHOR("Cliff Cai"); MODULE_DESCRIPTION("ADI Blackfin I2S PCM DMA module"); diff --git a/sound/soc/blackfin/bf5xx-i2s-pcm.h b/sound/soc/blackfin/bf5xx-i2s-pcm.h index 4d4609a97c59..0c2c5a68d4ff 100644 --- a/sound/soc/blackfin/bf5xx-i2s-pcm.h +++ b/sound/soc/blackfin/bf5xx-i2s-pcm.h @@ -23,7 +23,4 @@ struct bf5xx_gpio { u32 frm; }; -/* platform data */ -extern struct snd_soc_platform bf5xx_i2s_soc_platform; - #endif diff --git a/sound/soc/blackfin/bf5xx-i2s.c b/sound/soc/blackfin/bf5xx-i2s.c index 3e6ada0dd1c4..d453b1e9d607 100644 --- a/sound/soc/blackfin/bf5xx-i2s.c +++ b/sound/soc/blackfin/bf5xx-i2s.c @@ -42,7 +42,6 @@ #include #include "bf5xx-sport.h" -#include "bf5xx-i2s.h" struct bf5xx_i2s_port { u16 tcr1; @@ -195,8 +194,7 @@ static void bf5xx_i2s_shutdown(struct snd_pcm_substream *substream, bf5xx_i2s.configured = 0; } -static int bf5xx_i2s_probe(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int bf5xx_i2s_probe(struct snd_soc_dai *dai) { pr_debug("%s enter\n", __func__); if (peripheral_request_list(&sport_req[sport_num][0], "soc-audio")) { @@ -215,11 +213,11 @@ static int bf5xx_i2s_probe(struct platform_device *pdev, return 0; } -static void bf5xx_i2s_remove(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int bf5xx_i2s_remove(struct snd_soc_dai *dai) { pr_debug("%s enter\n", __func__); peripheral_free_list(&sport_req[sport_num][0]); + return 0; } #ifdef CONFIG_PM @@ -228,9 +226,9 @@ static int bf5xx_i2s_suspend(struct snd_soc_dai *dai) pr_debug("%s : sport %d\n", __func__, dai->id); - if (dai->capture.active) + if (dai->capture_active) sport_rx_stop(sport_handle); - if (dai->playback.active) + if (dai->playback_active) sport_tx_stop(sport_handle); return 0; } @@ -277,9 +275,7 @@ static struct snd_soc_dai_ops bf5xx_i2s_dai_ops = { .set_fmt = bf5xx_i2s_set_dai_fmt, }; -struct snd_soc_dai bf5xx_i2s_dai = { - .name = "bf5xx-i2s", - .id = 0, +static struct snd_soc_dai_driver bf5xx_i2s_dai = { .probe = bf5xx_i2s_probe, .remove = bf5xx_i2s_remove, .suspend = bf5xx_i2s_suspend, @@ -296,18 +292,39 @@ struct snd_soc_dai bf5xx_i2s_dai = { .formats = BF5XX_I2S_FORMATS,}, .ops = &bf5xx_i2s_dai_ops, }; -EXPORT_SYMBOL_GPL(bf5xx_i2s_dai); + +static int bfin_i2s_drv_probe(struct platform_device *pdev) +{ + return snd_soc_register_dai(&pdev->dev, &bf5xx_i2s_dai); +} + +static int __devexit bfin_i2s_drv_remove(struct platform_device *pdev) +{ + snd_soc_unregister_dai(&pdev->dev); + return 0; +} + +static struct platform_driver bfin_i2s_driver = { + .probe = bfin_i2s_drv_probe, + .remove = __devexit_p(bfin_i2s_drv_remove), + + .driver = { + .name = "bf5xx-i2s", + .owner = THIS_MODULE, + }, +}; static int __init bfin_i2s_init(void) { - return snd_soc_register_dai(&bf5xx_i2s_dai); + return platform_driver_register(&bfin_i2s_driver); } -module_init(bfin_i2s_init); static void __exit bfin_i2s_exit(void) { - snd_soc_unregister_dai(&bf5xx_i2s_dai); + platform_driver_unregister(&bfin_i2s_driver); } + +module_init(bfin_i2s_init); module_exit(bfin_i2s_exit); /* Module information */ diff --git a/sound/soc/blackfin/bf5xx-i2s.h b/sound/soc/blackfin/bf5xx-i2s.h deleted file mode 100644 index 264ecdcba35a..000000000000 --- a/sound/soc/blackfin/bf5xx-i2s.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * sound/soc/blackfin/bf5xx-i2s.h - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef _BF5XX_I2S_H -#define _BF5XX_I2S_H - -extern struct snd_soc_dai bf5xx_i2s_dai; - -#endif diff --git a/sound/soc/blackfin/bf5xx-ssm2602.c b/sound/soc/blackfin/bf5xx-ssm2602.c index 3a00fa4dbe6d..36f2769eb912 100644 --- a/sound/soc/blackfin/bf5xx-ssm2602.c +++ b/sound/soc/blackfin/bf5xx-ssm2602.c @@ -42,17 +42,16 @@ #include "../codecs/ssm2602.h" #include "bf5xx-sport.h" #include "bf5xx-i2s-pcm.h" -#include "bf5xx-i2s.h" static struct snd_soc_card bf5xx_ssm2602; static int bf5xx_ssm2602_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; pr_debug("%s enter\n", __func__); - cpu_dai->private_data = sport_handle; + snd_soc_dai_set_drvdata(cpu_dai, sport_handle); return 0; } @@ -60,8 +59,8 @@ static int bf5xx_ssm2602_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; unsigned int clk = 0; int ret = 0; @@ -118,36 +117,19 @@ static struct snd_soc_ops bf5xx_ssm2602_ops = { static struct snd_soc_dai_link bf5xx_ssm2602_dai = { .name = "ssm2602", .stream_name = "SSM2602", - .cpu_dai = &bf5xx_i2s_dai, - .codec_dai = &ssm2602_dai, + .cpu_dai_name = "bf5xx-i2s", + .codec_dai_name = "ssm2602-hifi", + .platform_name = "bf5xx-pcm-audio", + .codec_name = "ssm2602-codec.0-0x1b", .ops = &bf5xx_ssm2602_ops, }; -/* - * SSM2602 2 wire address is determined by CSB - * state during powerup. - * low = 0x1a - * high = 0x1b - */ - -static struct ssm2602_setup_data bf5xx_ssm2602_setup = { - .i2c_bus = 0, - .i2c_address = 0x1b, -}; - static struct snd_soc_card bf5xx_ssm2602 = { .name = "bf5xx_ssm2602", - .platform = &bf5xx_i2s_soc_platform, .dai_link = &bf5xx_ssm2602_dai, .num_links = 1, }; -static struct snd_soc_device bf5xx_ssm2602_snd_devdata = { - .card = &bf5xx_ssm2602, - .codec_dev = &soc_codec_dev_ssm2602, - .codec_data = &bf5xx_ssm2602_setup, -}; - static struct platform_device *bf5xx_ssm2602_snd_device; static int __init bf5xx_ssm2602_init(void) @@ -159,9 +141,7 @@ static int __init bf5xx_ssm2602_init(void) if (!bf5xx_ssm2602_snd_device) return -ENOMEM; - platform_set_drvdata(bf5xx_ssm2602_snd_device, - &bf5xx_ssm2602_snd_devdata); - bf5xx_ssm2602_snd_devdata.dev = &bf5xx_ssm2602_snd_device->dev; + platform_set_drvdata(bf5xx_ssm2602_snd_device, &bf5xx_ssm2602); ret = platform_device_add(bf5xx_ssm2602_snd_device); if (ret) diff --git a/sound/soc/blackfin/bf5xx-tdm-pcm.c b/sound/soc/blackfin/bf5xx-tdm-pcm.c index 6bac1ac1a315..74cf759b78a6 100644 --- a/sound/soc/blackfin/bf5xx-tdm-pcm.c +++ b/sound/soc/blackfin/bf5xx-tdm-pcm.c @@ -290,14 +290,14 @@ static int bf5xx_pcm_tdm_new(struct snd_card *card, struct snd_soc_dai *dai, if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - if (dai->playback.channels_min) { + if (dai->driver->playback.channels_min) { ret = bf5xx_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_PLAYBACK); if (ret) goto out; } - if (dai->capture.channels_min) { + if (dai->driver->capture.channels_min) { ret = bf5xx_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_CAPTURE); if (ret) @@ -307,25 +307,44 @@ out: return ret; } -struct snd_soc_platform bf5xx_tdm_soc_platform = { - .name = "bf5xx-audio", - .pcm_ops = &bf5xx_pcm_tdm_ops, +static struct snd_soc_platform_driver bf5xx_tdm_soc_platform = { + .ops = &bf5xx_pcm_tdm_ops, .pcm_new = bf5xx_pcm_tdm_new, .pcm_free = bf5xx_pcm_free_dma_buffers, }; -EXPORT_SYMBOL_GPL(bf5xx_tdm_soc_platform); -static int __init bfin_pcm_tdm_init(void) +static int __devinit bf5xx_soc_platform_probe(struct platform_device *pdev) { - return snd_soc_register_platform(&bf5xx_tdm_soc_platform); + return snd_soc_register_platform(&pdev->dev, &bf5xx_tdm_soc_platform); } -module_init(bfin_pcm_tdm_init); -static void __exit bfin_pcm_tdm_exit(void) +static int __devexit bf5xx_soc_platform_remove(struct platform_device *pdev) { - snd_soc_unregister_platform(&bf5xx_tdm_soc_platform); + snd_soc_unregister_platform(&pdev->dev); + return 0; +} + +static struct platform_driver bfin_tdm_driver = { + .driver = { + .name = "bf5xx-tdm-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = bf5xx_soc_platform_probe, + .remove = __devexit_p(bf5xx_soc_platform_remove), +}; + +static int __init snd_bfin_tdm_init(void) +{ + return platform_driver_register(&bfin_tdm_driver); +} +module_init(snd_bfin_tdm_init); + +static void __exit snd_bfin_tdm_exit(void) +{ + platform_driver_unregister(&bfin_tdm_driver); } -module_exit(bfin_pcm_tdm_exit); +module_exit(snd_bfin_tdm_exit); MODULE_AUTHOR("Barry Song"); MODULE_DESCRIPTION("ADI Blackfin TDM PCM DMA module"); diff --git a/sound/soc/blackfin/bf5xx-tdm-pcm.h b/sound/soc/blackfin/bf5xx-tdm-pcm.h index ddc5047df88c..7f8cc01c4477 100644 --- a/sound/soc/blackfin/bf5xx-tdm-pcm.h +++ b/sound/soc/blackfin/bf5xx-tdm-pcm.h @@ -15,7 +15,4 @@ struct bf5xx_pcm_dma_params { char *name; /* stream identifier */ }; -/* platform data */ -extern struct snd_soc_platform bf5xx_tdm_soc_platform; - #endif diff --git a/sound/soc/blackfin/bf5xx-tdm.c b/sound/soc/blackfin/bf5xx-tdm.c index 24c14269f4bc..125123929f16 100644 --- a/sound/soc/blackfin/bf5xx-tdm.c +++ b/sound/soc/blackfin/bf5xx-tdm.c @@ -214,9 +214,9 @@ static int bf5xx_tdm_suspend(struct snd_soc_dai *dai) if (!dai->active) return 0; - if (dai->capture.active) + if (dai->capture_active) sport_rx_stop(sport); - if (dai->playback.active) + if (dai->playback_active) sport_tx_stop(sport); return 0; } @@ -224,7 +224,7 @@ static int bf5xx_tdm_suspend(struct snd_soc_dai *dai) static int bf5xx_tdm_resume(struct snd_soc_dai *dai) { int ret; - struct sport_device *sport = dai->private_data; + struct sport_device *sport = snd_soc_dai_get_drvdata(dai); if (!dai->active) return 0; @@ -262,9 +262,7 @@ static struct snd_soc_dai_ops bf5xx_tdm_dai_ops = { .set_channel_map = bf5xx_tdm_set_channel_map, }; -struct snd_soc_dai bf5xx_tdm_dai = { - .name = "bf5xx-tdm", - .id = 0, +static struct snd_soc_dai_driver bf5xx_tdm_dai = { .suspend = bf5xx_tdm_suspend, .resume = bf5xx_tdm_resume, .playback = { @@ -279,7 +277,6 @@ struct snd_soc_dai bf5xx_tdm_dai = { .formats = SNDRV_PCM_FMTBIT_S32_LE,}, .ops = &bf5xx_tdm_dai_ops, }; -EXPORT_SYMBOL_GPL(bf5xx_tdm_dai); static int __devinit bfin_tdm_probe(struct platform_device *pdev) { @@ -320,7 +317,7 @@ static int __devinit bfin_tdm_probe(struct platform_device *pdev) goto sport_config_err; } - ret = snd_soc_register_dai(&bf5xx_tdm_dai); + ret = snd_soc_register_dai(&pdev->dev, &bf5xx_tdm_dai); if (ret) { pr_err("Failed to register DAI: %d\n", ret); goto sport_config_err; @@ -337,7 +334,7 @@ sport_config_err: static int __devexit bfin_tdm_remove(struct platform_device *pdev) { peripheral_free_list(&sport_req[sport_num][0]); - snd_soc_unregister_dai(&bf5xx_tdm_dai); + snd_soc_unregister_dai(&pdev->dev); return 0; } diff --git a/sound/soc/blackfin/bf5xx-tdm.h b/sound/soc/blackfin/bf5xx-tdm.h index 04189a18c1ba..e986a3ea3315 100644 --- a/sound/soc/blackfin/bf5xx-tdm.h +++ b/sound/soc/blackfin/bf5xx-tdm.h @@ -20,6 +20,4 @@ struct bf5xx_tdm_port { int configured; }; -extern struct snd_soc_dai bf5xx_tdm_dai; - #endif diff --git a/sound/soc/codecs/ac97.c b/sound/soc/codecs/ac97.c index 1f5e57a4bb7a..12c87d37eba1 100644 --- a/sound/soc/codecs/ac97.c +++ b/sound/soc/codecs/ac97.c @@ -21,7 +21,6 @@ #include #include #include -#include "ac97.h" #define AC97_VERSION "0.6" @@ -30,8 +29,7 @@ static int ac97_prepare(struct snd_pcm_substream *substream, { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; int reg = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? AC97_PCM_FRONT_DAC_RATE : AC97_PCM_LR_ADC_RATE; @@ -46,8 +44,8 @@ static struct snd_soc_dai_ops ac97_dai_ops = { .prepare = ac97_prepare, }; -struct snd_soc_dai ac97_dai = { - .name = "AC97 HiFi", +static struct snd_soc_dai_driver ac97_dai = { + .name = "ac97-hifi", .ac97_control = 1, .playback = { .stream_name = "AC97 Playback", @@ -63,7 +61,6 @@ struct snd_soc_dai ac97_dai = { .formats = SND_SOC_STD_AC97_FMTS,}, .ops = &ac97_dai_ops, }; -EXPORT_SYMBOL_GPL(ac97_dai); static unsigned int ac97_read(struct snd_soc_codec *codec, unsigned int reg) @@ -78,95 +75,49 @@ static int ac97_write(struct snd_soc_codec *codec, unsigned int reg, return 0; } -static int ac97_soc_probe(struct platform_device *pdev) +static int ac97_soc_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_card *card = socdev->card; - struct snd_soc_codec *codec; struct snd_ac97_bus *ac97_bus; struct snd_ac97_template ac97_template; - int i; - int ret = 0; + int ret; printk(KERN_INFO "AC97 SoC Audio Codec %s\n", AC97_VERSION); - socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (!socdev->card->codec) - return -ENOMEM; - codec = socdev->card->codec; - mutex_init(&codec->mutex); - - codec->name = "AC97"; - codec->owner = THIS_MODULE; - codec->dai = &ac97_dai; - codec->num_dai = 1; - codec->write = ac97_write; - codec->read = ac97_read; - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) - goto err; + ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); + if (ret < 0) { + printk(KERN_ERR "ASoC: failed to init gen ac97 glue\n"); + return ret; + } /* add codec as bus device for standard ac97 */ - ret = snd_ac97_bus(codec->card, 0, &soc_ac97_ops, NULL, &ac97_bus); + ret = snd_ac97_bus(codec->card->snd_card, 0, &soc_ac97_ops, NULL, &ac97_bus); if (ret < 0) - goto bus_err; + return ret; memset(&ac97_template, 0, sizeof(struct snd_ac97_template)); ret = snd_ac97_mixer(ac97_bus, &ac97_template, &codec->ac97); if (ret < 0) - goto bus_err; - - for (i = 0; i < card->num_links; i++) { - if (card->dai_link[i].codec_dai->ac97_control) { - snd_ac97_dev_add_pdata(codec->ac97, - card->dai_link[i].cpu_dai->ac97_pdata); - } - } + return ret; return 0; - -bus_err: - snd_soc_free_pcms(socdev); - -err: - kfree(socdev->card->codec); - socdev->card->codec = NULL; - return ret; } -static int ac97_soc_remove(struct platform_device *pdev) +static int ac97_soc_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - if (!codec) - return 0; - - snd_soc_free_pcms(socdev); - kfree(socdev->card->codec); - return 0; } #ifdef CONFIG_PM -static int ac97_soc_suspend(struct platform_device *pdev, pm_message_t msg) +static int ac97_soc_suspend(struct snd_soc_codec *codec, pm_message_t msg) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_ac97_suspend(socdev->card->codec->ac97); + snd_ac97_suspend(codec->ac97); return 0; } -static int ac97_soc_resume(struct platform_device *pdev) +static int ac97_soc_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_ac97_resume(socdev->card->codec->ac97); + snd_ac97_resume(codec->ac97); return 0; } @@ -175,13 +126,48 @@ static int ac97_soc_resume(struct platform_device *pdev) #define ac97_soc_resume NULL #endif -struct snd_soc_codec_device soc_codec_dev_ac97 = { +static struct snd_soc_codec_driver soc_codec_dev_ac97 = { + .write = ac97_write, + .read = ac97_read, .probe = ac97_soc_probe, .remove = ac97_soc_remove, .suspend = ac97_soc_suspend, .resume = ac97_soc_resume, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_ac97); + +static __devinit int ac97_probe(struct platform_device *pdev) +{ + return snd_soc_register_codec(&pdev->dev, + &soc_codec_dev_ac97, &ac97_dai, 1); +} + +static int __devexit ac97_remove(struct platform_device *pdev) +{ + snd_soc_unregister_codec(&pdev->dev); + return 0; +} + +static struct platform_driver ac97_codec_driver = { + .driver = { + .name = "ac97-codec", + .owner = THIS_MODULE, + }, + + .probe = ac97_probe, + .remove = __devexit_p(ac97_remove), +}; + +static int __init ac97_init(void) +{ + return platform_driver_register(&ac97_codec_driver); +} +module_init(ac97_init); + +static void __exit ac97_exit(void) +{ + platform_driver_unregister(&ac97_codec_driver); +} +module_exit(ac97_exit); MODULE_DESCRIPTION("Soc Generic AC97 driver"); MODULE_AUTHOR("Liam Girdwood"); diff --git a/sound/soc/codecs/ac97.h b/sound/soc/codecs/ac97.h deleted file mode 100644 index 281aa42e2bbb..000000000000 --- a/sound/soc/codecs/ac97.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * linux/sound/codecs/ac97.h -- ALSA SoC Layer - * - * Author: Liam Girdwood - * Created: Dec 1st 2005 - * Copyright: Wolfson Microelectronics. PLC. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef __LINUX_SND_SOC_AC97_H -#define __LINUX_SND_SOC_AC97_H - -extern struct snd_soc_codec_device soc_codec_dev_ac97; -extern struct snd_soc_dai ac97_dai; - -#endif diff --git a/sound/soc/codecs/ad1836.c b/sound/soc/codecs/ad1836.c index a01006c8c606..d272534c8f84 100644 --- a/sound/soc/codecs/ad1836.c +++ b/sound/soc/codecs/ad1836.c @@ -33,15 +33,10 @@ /* codec private data */ struct ad1836_priv { - struct snd_soc_codec codec; - u16 reg_cache[AD1836_NUM_REGS]; + enum snd_soc_control_type control_type; + void *control_data; }; -static struct snd_soc_codec *ad1836_codec; -struct snd_soc_codec_device soc_codec_dev_ad1836; -static int ad1836_register(struct ad1836_priv *ad1836); -static void ad1836_unregister(struct ad1836_priv *ad1836); - /* * AD1836 volume/mute/de-emphasis etc. controls */ @@ -146,8 +141,7 @@ static int ad1836_hw_params(struct snd_pcm_substream *substream, int word_len = 0; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; /* bit size */ switch (params_format(params)) { @@ -173,12 +167,9 @@ static int ad1836_hw_params(struct snd_pcm_substream *substream, } #ifdef CONFIG_PM -static int ad1836_soc_suspend(struct platform_device *pdev, +static int ad1836_soc_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - /* reset clock control mode */ u16 adc_ctrl2 = snd_soc_read(codec, AD1836_ADC_CTRL2); adc_ctrl2 &= ~AD1836_ADC_SERFMT_MASK; @@ -186,11 +177,8 @@ static int ad1836_soc_suspend(struct platform_device *pdev, return snd_soc_write(codec, AD1836_ADC_CTRL2, adc_ctrl2); } -static int ad1836_soc_resume(struct platform_device *pdev) +static int ad1836_soc_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - /* restore clock control mode */ u16 adc_ctrl2 = snd_soc_read(codec, AD1836_ADC_CTRL2); adc_ctrl2 |= AD1836_ADC_AUX; @@ -202,49 +190,14 @@ static int ad1836_soc_resume(struct platform_device *pdev) #define ad1836_soc_resume NULL #endif -static int __devinit ad1836_spi_probe(struct spi_device *spi) -{ - struct snd_soc_codec *codec; - struct ad1836_priv *ad1836; - - ad1836 = kzalloc(sizeof(struct ad1836_priv), GFP_KERNEL); - if (ad1836 == NULL) - return -ENOMEM; - - codec = &ad1836->codec; - codec->control_data = spi; - codec->dev = &spi->dev; - - dev_set_drvdata(&spi->dev, ad1836); - - return ad1836_register(ad1836); -} - -static int __devexit ad1836_spi_remove(struct spi_device *spi) -{ - struct ad1836_priv *ad1836 = dev_get_drvdata(&spi->dev); - - ad1836_unregister(ad1836); - return 0; -} - -static struct spi_driver ad1836_spi_driver = { - .driver = { - .name = "ad1836", - .owner = THIS_MODULE, - }, - .probe = ad1836_spi_probe, - .remove = __devexit_p(ad1836_spi_remove), -}; - static struct snd_soc_dai_ops ad1836_dai_ops = { .hw_params = ad1836_hw_params, .set_fmt = ad1836_set_dai_fmt, }; /* codec DAI instance */ -struct snd_soc_dai ad1836_dai = { - .name = "AD1836", +static struct snd_soc_dai_driver ad1836_dai = { + .name = "ad1836-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, @@ -263,35 +216,13 @@ struct snd_soc_dai ad1836_dai = { }, .ops = &ad1836_dai_ops, }; -EXPORT_SYMBOL_GPL(ad1836_dai); -static int ad1836_register(struct ad1836_priv *ad1836) +static int ad1836_probe(struct snd_soc_codec *codec) { - int ret; - struct snd_soc_codec *codec = &ad1836->codec; - - if (ad1836_codec) { - dev_err(codec->dev, "Another ad1836 is registered\n"); - kfree(ad1836); - return -EINVAL; - } - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - snd_soc_codec_set_drvdata(codec, ad1836); - codec->reg_cache = ad1836->reg_cache; - codec->reg_cache_size = AD1836_NUM_REGS; - codec->name = "AD1836"; - codec->owner = THIS_MODULE; - codec->dai = &ad1836_dai; - codec->num_dai = 1; - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - ad1836_dai.dev = codec->dev; - ad1836_codec = codec; + struct ad1836_priv *ad1836 = snd_soc_codec_get_drvdata(codec); + int ret = 0; + codec->control_data = ad1836->control_data; ret = snd_soc_codec_set_cache_io(codec, 4, 12, SND_SOC_SPI); if (ret < 0) { dev_err(codec->dev, "failed to set cache I/O: %d\n", @@ -319,81 +250,69 @@ static int ad1836_register(struct ad1836_priv *ad1836) snd_soc_write(codec, AD1836_DAC_L3_VOL, 0x3FF); snd_soc_write(codec, AD1836_DAC_R3_VOL, 0x3FF); - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - kfree(ad1836); - return ret; - } - - ret = snd_soc_register_dai(&ad1836_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - snd_soc_unregister_codec(codec); - kfree(ad1836); - return ret; - } - - return 0; -} - -static void ad1836_unregister(struct ad1836_priv *ad1836) -{ - snd_soc_unregister_dai(&ad1836_dai); - snd_soc_unregister_codec(&ad1836->codec); - kfree(ad1836); - ad1836_codec = NULL; -} - -static int ad1836_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - if (ad1836_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = ad1836_codec; - codec = ad1836_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; - } - snd_soc_add_controls(codec, ad1836_snd_controls, ARRAY_SIZE(ad1836_snd_controls)); snd_soc_dapm_new_controls(codec, ad1836_dapm_widgets, ARRAY_SIZE(ad1836_dapm_widgets)); snd_soc_dapm_add_routes(codec, audio_paths, ARRAY_SIZE(audio_paths)); -pcm_err: return ret; } /* power down chip */ -static int ad1836_remove(struct platform_device *pdev) +static int ad1836_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); + /* reset clock control mode */ + u16 adc_ctrl2 = snd_soc_read(codec, AD1836_ADC_CTRL2); + adc_ctrl2 &= ~AD1836_ADC_SERFMT_MASK; - return 0; + return snd_soc_write(codec, AD1836_ADC_CTRL2, adc_ctrl2); } -struct snd_soc_codec_device soc_codec_dev_ad1836 = { +static struct snd_soc_codec_driver soc_codec_dev_ad1836 = { .probe = ad1836_probe, .remove = ad1836_remove, .suspend = ad1836_soc_suspend, .resume = ad1836_soc_resume, + .reg_cache_size = AD1836_NUM_REGS, + .reg_word_size = sizeof(u16), +}; + +static int __devinit ad1836_spi_probe(struct spi_device *spi) +{ + struct ad1836_priv *ad1836; + int ret; + + ad1836 = kzalloc(sizeof(struct ad1836_priv), GFP_KERNEL); + if (ad1836 == NULL) + return -ENOMEM; + + spi_set_drvdata(spi, ad1836); + ad1836->control_data = spi; + ad1836->control_type = SND_SOC_SPI; + + ret = snd_soc_register_codec(&spi->dev, + &soc_codec_dev_ad1836, &ad1836_dai, 1); + if (ret < 0) + kfree(ad1836); + return ret; +} + +static int __devexit ad1836_spi_remove(struct spi_device *spi) +{ + snd_soc_unregister_codec(&spi->dev); + kfree(spi_get_drvdata(spi)); + return 0; +} + +static struct spi_driver ad1836_spi_driver = { + .driver = { + .name = "ad1836-codec", + .owner = THIS_MODULE, + }, + .probe = ad1836_spi_probe, + .remove = __devexit_p(ad1836_spi_remove), }; -EXPORT_SYMBOL_GPL(soc_codec_dev_ad1836); static int __init ad1836_init(void) { diff --git a/sound/soc/codecs/ad1836.h b/sound/soc/codecs/ad1836.h index e9d90d3951c5..845596717fdf 100644 --- a/sound/soc/codecs/ad1836.h +++ b/sound/soc/codecs/ad1836.h @@ -60,6 +60,4 @@ #define AD1836_NUM_REGS 16 -extern struct snd_soc_dai ad1836_dai; -extern struct snd_soc_codec_device soc_codec_dev_ad1836; #endif diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c index 1def75e4862f..fa2834c91b9f 100644 --- a/sound/soc/codecs/ad193x.c +++ b/sound/soc/codecs/ad193x.c @@ -24,9 +24,10 @@ /* codec private data */ struct ad193x_priv { - unsigned int sysclk; - struct snd_soc_codec codec; u8 reg_cache[AD193X_NUM_REGS]; + enum snd_soc_control_type bus_type; + void *control_data; + int sysclk; }; /* ad193x register cache & default register settings */ @@ -34,9 +35,6 @@ static const u8 ad193x_reg[AD193X_NUM_REGS] = { 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0, 0, }; -static struct snd_soc_codec *ad193x_codec; -struct snd_soc_codec_device soc_codec_dev_ad193x; - /* * AD193X volume/mute/de-emphasis etc. controls */ @@ -275,8 +273,7 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream, int word_len = 0, reg = 0, master_rate = 0; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec); /* bit size */ @@ -323,100 +320,6 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream, return 0; } -static int ad193x_bus_probe(struct device *dev, void *ctrl_data, int bus_type) -{ - struct snd_soc_codec *codec; - struct ad193x_priv *ad193x; - int ret; - - if (ad193x_codec) { - dev_err(dev, "Another ad193x is registered\n"); - return -EINVAL; - } - - ad193x = kzalloc(sizeof(struct ad193x_priv), GFP_KERNEL); - if (ad193x == NULL) - return -ENOMEM; - - dev_set_drvdata(dev, ad193x); - - codec = &ad193x->codec; - mutex_init(&codec->mutex); - codec->control_data = ctrl_data; - codec->dev = dev; - snd_soc_codec_set_drvdata(codec, ad193x); - codec->reg_cache = ad193x->reg_cache; - codec->reg_cache_size = AD193X_NUM_REGS; - codec->name = "AD193X"; - codec->owner = THIS_MODULE; - codec->dai = &ad193x_dai; - codec->num_dai = 1; - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - ad193x_dai.dev = codec->dev; - ad193x_codec = codec; - - memcpy(codec->reg_cache, ad193x_reg, AD193X_NUM_REGS); - - if (bus_type == SND_SOC_I2C) - ret = snd_soc_codec_set_cache_io(codec, 8, 8, bus_type); - else - ret = snd_soc_codec_set_cache_io(codec, 16, 8, bus_type); - if (ret < 0) { - dev_err(codec->dev, "failed to set cache I/O: %d\n", - ret); - kfree(ad193x); - return ret; - } - - /* default setting for ad193x */ - - /* unmute dac channels */ - snd_soc_write(codec, AD193X_DAC_CHNL_MUTE, 0x0); - /* de-emphasis: 48kHz, powedown dac */ - snd_soc_write(codec, AD193X_DAC_CTRL2, 0x1A); - /* powerdown dac, dac in tdm mode */ - snd_soc_write(codec, AD193X_DAC_CTRL0, 0x41); - /* high-pass filter enable */ - snd_soc_write(codec, AD193X_ADC_CTRL0, 0x3); - /* sata delay=1, adc aux mode */ - snd_soc_write(codec, AD193X_ADC_CTRL1, 0x43); - /* pll input: mclki/xi */ - snd_soc_write(codec, AD193X_PLL_CLK_CTRL0, 0x99); /* mclk=24.576Mhz: 0x9D; mclk=12.288Mhz: 0x99 */ - snd_soc_write(codec, AD193X_PLL_CLK_CTRL1, 0x04); - ad193x->sysclk = 12288000; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - kfree(ad193x); - return ret; - } - - ret = snd_soc_register_dai(&ad193x_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - snd_soc_unregister_codec(codec); - kfree(ad193x); - return ret; - } - - return 0; -} - -static int ad193x_bus_remove(struct device *dev) -{ - struct ad193x_priv *ad193x = dev_get_drvdata(dev); - - snd_soc_unregister_dai(&ad193x_dai); - snd_soc_unregister_codec(&ad193x->codec); - kfree(ad193x); - ad193x_codec = NULL; - - return 0; -} - static struct snd_soc_dai_ops ad193x_dai_ops = { .hw_params = ad193x_hw_params, .digital_mute = ad193x_mute, @@ -426,8 +329,8 @@ static struct snd_soc_dai_ops ad193x_dai_ops = { }; /* codec DAI instance */ -struct snd_soc_dai ad193x_dai = { - .name = "AD193X", +static struct snd_soc_dai_driver ad193x_dai = { + .name = "ad193x-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, @@ -446,28 +349,39 @@ struct snd_soc_dai ad193x_dai = { }, .ops = &ad193x_dai_ops, }; -EXPORT_SYMBOL_GPL(ad193x_dai); -static int ad193x_probe(struct platform_device *pdev) +static int ad193x_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; + struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec); + int ret; - if (ad193x_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; + codec->control_data = ad193x->control_data; + if (ad193x->bus_type == SND_SOC_I2C) + ret = snd_soc_codec_set_cache_io(codec, 8, 8, ad193x->bus_type); + else + ret = snd_soc_codec_set_cache_io(codec, 16, 8, ad193x->bus_type); + if (ret < 0) { + dev_err(codec->dev, "failed to set cache I/O: %d\n", + ret); + kfree(ad193x); + return ret; } - socdev->card->codec = ad193x_codec; - codec = ad193x_codec; + /* default setting for ad193x */ - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; - } + /* unmute dac channels */ + snd_soc_write(codec, AD193X_DAC_CHNL_MUTE, 0x0); + /* de-emphasis: 48kHz, powedown dac */ + snd_soc_write(codec, AD193X_DAC_CTRL2, 0x1A); + /* powerdown dac, dac in tdm mode */ + snd_soc_write(codec, AD193X_DAC_CTRL0, 0x41); + /* high-pass filter enable */ + snd_soc_write(codec, AD193X_ADC_CTRL0, 0x3); + /* sata delay=1, adc aux mode */ + snd_soc_write(codec, AD193X_ADC_CTRL1, 0x43); + /* pll input: mclki/xi */ + snd_soc_write(codec, AD193X_PLL_CLK_CTRL0, 0x99); /* mclk=24.576Mhz: 0x9D; mclk=12.288Mhz: 0x99 */ + snd_soc_write(codec, AD193X_PLL_CLK_CTRL1, 0x04); snd_soc_add_controls(codec, ad193x_snd_controls, ARRAY_SIZE(ad193x_snd_controls)); @@ -475,41 +389,47 @@ static int ad193x_probe(struct platform_device *pdev) ARRAY_SIZE(ad193x_dapm_widgets)); snd_soc_dapm_add_routes(codec, audio_paths, ARRAY_SIZE(audio_paths)); -pcm_err: return ret; } -/* power down chip */ -static int ad193x_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_ad193x = { +static struct snd_soc_codec_driver soc_codec_dev_ad193x = { .probe = ad193x_probe, - .remove = ad193x_remove, + .reg_cache_default = ad193x_reg, + .reg_cache_size = AD193X_NUM_REGS, + .reg_word_size = sizeof(u16), }; -EXPORT_SYMBOL_GPL(soc_codec_dev_ad193x); #if defined(CONFIG_SPI_MASTER) static int __devinit ad193x_spi_probe(struct spi_device *spi) { - return ad193x_bus_probe(&spi->dev, spi, SND_SOC_SPI); + struct ad193x_priv *ad193x; + int ret; + + ad193x = kzalloc(sizeof(struct ad193x_priv), GFP_KERNEL); + if (ad193x == NULL) + return -ENOMEM; + + spi_set_drvdata(spi, ad193x); + ad193x->control_data = spi; + ad193x->bus_type = SND_SOC_SPI; + + ret = snd_soc_register_codec(&spi->dev, + &soc_codec_dev_ad193x, &ad193x_dai, 1); + if (ret < 0) + kfree(ad193x); + return ret; } static int __devexit ad193x_spi_remove(struct spi_device *spi) { - return ad193x_bus_remove(&spi->dev); + snd_soc_unregister_codec(&spi->dev); + kfree(spi_get_drvdata(spi)); + return 0; } static struct spi_driver ad193x_spi_driver = { .driver = { - .name = "ad193x", + .name = "ad193x-codec", .owner = THIS_MODULE, }, .probe = ad193x_spi_probe, @@ -528,17 +448,34 @@ MODULE_DEVICE_TABLE(i2c, ad193x_id); static int __devinit ad193x_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { - return ad193x_bus_probe(&client->dev, client, SND_SOC_I2C); + struct ad193x_priv *ad193x; + int ret; + + ad193x = kzalloc(sizeof(struct ad193x_priv), GFP_KERNEL); + if (ad193x == NULL) + return -ENOMEM; + + i2c_set_clientdata(client, ad193x); + ad193x->control_data = client; + ad193x->bus_type = SND_SOC_I2C; + + ret = snd_soc_register_codec(&client->dev, + &soc_codec_dev_ad193x, &ad193x_dai, 1); + if (ret < 0) + kfree(ad193x); + return ret; } static int __devexit ad193x_i2c_remove(struct i2c_client *client) { - return ad193x_bus_remove(&client->dev); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); + return 0; } static struct i2c_driver ad193x_i2c_driver = { .driver = { - .name = "ad193x", + .name = "ad193x-codec", }, .probe = ad193x_i2c_probe, .remove = __devexit_p(ad193x_i2c_remove), diff --git a/sound/soc/codecs/ad193x.h b/sound/soc/codecs/ad193x.h index 654ba64ae04c..9747b5497877 100644 --- a/sound/soc/codecs/ad193x.h +++ b/sound/soc/codecs/ad193x.h @@ -80,7 +80,4 @@ #define AD193X_NUM_REGS 17 -extern struct snd_soc_dai ad193x_dai; -extern struct snd_soc_codec_device soc_codec_dev_ad193x; - #endif diff --git a/sound/soc/codecs/ad1980.c b/sound/soc/codecs/ad1980.c index 042072738cdc..1371afac657b 100644 --- a/sound/soc/codecs/ad1980.c +++ b/sound/soc/codecs/ad1980.c @@ -130,8 +130,8 @@ static int ac97_write(struct snd_soc_codec *codec, unsigned int reg, return 0; } -struct snd_soc_dai ad1980_dai = { - .name = "AC97", +struct snd_soc_dai_driver ad1980_dai = { + .name = "ad1980-hifi", .ac97_control = 1, .playback = { .stream_name = "Playback", @@ -177,53 +177,20 @@ err: return -EIO; } -static int ad1980_soc_probe(struct platform_device *pdev) +static int ad1980_soc_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; + int ret; u16 vendor_id2; u16 ext_status; printk(KERN_INFO "AD1980 SoC Audio Codec\n"); - socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (socdev->card->codec == NULL) - return -ENOMEM; - codec = socdev->card->codec; - mutex_init(&codec->mutex); - - codec->reg_cache = - kzalloc(sizeof(u16) * ARRAY_SIZE(ad1980_reg), GFP_KERNEL); - if (codec->reg_cache == NULL) { - ret = -ENOMEM; - goto cache_err; - } - memcpy(codec->reg_cache, ad1980_reg, sizeof(u16) * \ - ARRAY_SIZE(ad1980_reg)); - codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(ad1980_reg); - codec->reg_cache_step = 2; - codec->name = "AD1980"; - codec->owner = THIS_MODULE; - codec->dai = &ad1980_dai; - codec->num_dai = 1; - codec->write = ac97_write; - codec->read = ac97_read; - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); if (ret < 0) { printk(KERN_ERR "ad1980: failed to register AC97 codec\n"); - goto codec_err; + return ret; } - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) - goto pcm_err; - - ret = ad1980_reset(codec, 0); if (ret < 0) { printk(KERN_ERR "Failed to reset AD1980: AC97 link error\n"); @@ -262,41 +229,59 @@ static int ad1980_soc_probe(struct platform_device *pdev) return 0; reset_err: - snd_soc_free_pcms(socdev); - -pcm_err: snd_soc_free_ac97_codec(codec); - -codec_err: - kfree(codec->reg_cache); - -cache_err: - kfree(socdev->card->codec); - socdev->card->codec = NULL; return ret; } -static int ad1980_soc_remove(struct platform_device *pdev) +static int ad1980_soc_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - if (codec == NULL) - return 0; - - snd_soc_dapm_free(socdev); - snd_soc_free_pcms(socdev); snd_soc_free_ac97_codec(codec); - kfree(codec->reg_cache); - kfree(codec); return 0; } -struct snd_soc_codec_device soc_codec_dev_ad1980 = { +static struct snd_soc_codec_driver soc_codec_dev_ad1980 = { .probe = ad1980_soc_probe, .remove = ad1980_soc_remove, + .reg_cache_size = ARRAY_SIZE(ad1980_reg), + .reg_word_size = sizeof(u16), + .reg_cache_step = 2, + .write = ac97_write, + .read = ac97_read, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_ad1980); + +static __devinit int ad1980_probe(struct platform_device *pdev) +{ + return snd_soc_register_codec(&pdev->dev, + &soc_codec_dev_ad1980, &ad1980_dai, 1); +} + +static int __devexit ad1980_remove(struct platform_device *pdev) +{ + snd_soc_unregister_codec(&pdev->dev); + return 0; +} + +static struct platform_driver ad1980_codec_driver = { + .driver = { + .name = "ad1980-codec", + .owner = THIS_MODULE, + }, + + .probe = ad1980_probe, + .remove = __devexit_p(ad1980_remove), +}; + +static int __init ad1980_init(void) +{ + return platform_driver_register(&ad1980_codec_driver); +} +module_init(ad1980_init); + +static void __exit ad1980_exit(void) +{ + platform_driver_unregister(&ad1980_codec_driver); +} +module_exit(ad1980_exit); MODULE_DESCRIPTION("ASoC ad1980 driver"); MODULE_AUTHOR("Roy Huang, Cliff Cai"); diff --git a/sound/soc/codecs/ad1980.h b/sound/soc/codecs/ad1980.h index db6c8500d66b..29b5a8750926 100644 --- a/sound/soc/codecs/ad1980.h +++ b/sound/soc/codecs/ad1980.h @@ -17,7 +17,4 @@ #define PR5 0x2000 #define PR6 0x4000 -extern struct snd_soc_dai ad1980_dai; -extern struct snd_soc_codec_device soc_codec_dev_ad1980; - #endif diff --git a/sound/soc/codecs/ad73311.c b/sound/soc/codecs/ad73311.c index 475807bea2c2..c53955fe17b6 100644 --- a/sound/soc/codecs/ad73311.c +++ b/sound/soc/codecs/ad73311.c @@ -23,8 +23,8 @@ #include "ad73311.h" -struct snd_soc_dai ad73311_dai = { - .name = "AD73311", +static struct snd_soc_dai_driver ad73311_dai = { + .name = "ad73311-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -38,68 +38,40 @@ struct snd_soc_dai ad73311_dai = { .rates = SNDRV_PCM_RATE_8000, .formats = SNDRV_PCM_FMTBIT_S16_LE, }, }; -EXPORT_SYMBOL_GPL(ad73311_dai); -static int ad73311_soc_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (codec == NULL) - return -ENOMEM; - mutex_init(&codec->mutex); - codec->name = "AD73311"; - codec->owner = THIS_MODULE; - codec->dai = &ad73311_dai; - codec->num_dai = 1; - socdev->card->codec = codec; - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - printk(KERN_ERR "ad73311: failed to create pcms\n"); - goto pcm_err; - } - - return ret; +static struct snd_soc_codec_driver soc_codec_dev_ad73311; -pcm_err: - kfree(socdev->card->codec); - socdev->card->codec = NULL; - return ret; +static int ad73311_probe(struct platform_device *pdev) +{ + return snd_soc_register_codec(&pdev->dev, + &soc_codec_dev_ad73311, &ad73311_dai, 1); } -static int ad73311_soc_remove(struct platform_device *pdev) +static int ad73311_remove(struct platform_device *pdev) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - if (codec == NULL) - return 0; - snd_soc_free_pcms(socdev); - kfree(codec); + snd_soc_unregister_codec(&pdev->dev); return 0; } -struct snd_soc_codec_device soc_codec_dev_ad73311 = { - .probe = ad73311_soc_probe, - .remove = ad73311_soc_remove, +static struct platform_driver ad73311_codec_driver = { + .driver = { + .name = "ad73311-codec", + .owner = THIS_MODULE, + }, + + .probe = ad73311_probe, + .remove = __devexit_p(ad73311_remove), }; -EXPORT_SYMBOL_GPL(soc_codec_dev_ad73311); static int __init ad73311_init(void) { - return snd_soc_register_dai(&ad73311_dai); + return platform_driver_register(&ad73311_codec_driver); } module_init(ad73311_init); static void __exit ad73311_exit(void) { - snd_soc_unregister_dai(&ad73311_dai); + platform_driver_unregister(&ad73311_codec_driver); } module_exit(ad73311_exit); diff --git a/sound/soc/codecs/ad73311.h b/sound/soc/codecs/ad73311.h index 569573d2d4d7..4b353eefc0bf 100644 --- a/sound/soc/codecs/ad73311.h +++ b/sound/soc/codecs/ad73311.h @@ -85,6 +85,4 @@ #define REGF_INV (1 << 6) #define REGF_ALB (1 << 7) -extern struct snd_soc_dai ad73311_dai; -extern struct snd_soc_codec_device soc_codec_dev_ad73311; #endif diff --git a/sound/soc/codecs/ads117x.c b/sound/soc/codecs/ads117x.c index f8e75edb27b7..8402854ec15e 100644 --- a/sound/soc/codecs/ads117x.c +++ b/sound/soc/codecs/ads117x.c @@ -19,16 +19,12 @@ #include #include -#include "ads117x.h" - #define ADS117X_RATES (SNDRV_PCM_RATE_8000_48000) - #define ADS117X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE) -struct snd_soc_dai ads117x_dai = { +static struct snd_soc_dai_driver ads117x_dai = { /* ADC */ - .name = "ADS117X ADC", - .id = 1, + .name = "ads117x-hifi", .capture = { .stream_name = "Capture", .channels_min = 1, @@ -36,75 +32,29 @@ struct snd_soc_dai ads117x_dai = { .rates = ADS117X_RATES, .formats = ADS117X_FORMATS,}, }; -EXPORT_SYMBOL_GPL(ads117x_dai); - -static int ads117x_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret; - - codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (codec == NULL) - return -ENOMEM; - socdev->card->codec = codec; - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - codec->name = "ADS117X"; - codec->owner = THIS_MODULE; - codec->dai = &ads117x_dai; - codec->num_dai = 1; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - printk(KERN_ERR "ads117x: failed to create pcms\n"); - kfree(codec); - return ret; - } - - return 0; -} - -static int ads117x_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - snd_soc_free_pcms(socdev); - kfree(codec); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_ads117x = { - .probe = ads117x_probe, - .remove = ads117x_remove, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_ads117x); +static struct snd_soc_codec_driver soc_codec_dev_ads117x; -static __devinit int ads117x_platform_probe(struct platform_device *pdev) +static __devinit int ads117x_probe(struct platform_device *pdev) { - ads117x_dai.dev = &pdev->dev; - return snd_soc_register_dai(&ads117x_dai); + return snd_soc_register_codec(&pdev->dev, + &soc_codec_dev_ads117x, &ads117x_dai, 1); } -static int __devexit ads117x_platform_remove(struct platform_device *pdev) +static int __devexit ads117x_remove(struct platform_device *pdev) { - snd_soc_unregister_dai(&ads117x_dai); + snd_soc_unregister_codec(&pdev->dev); return 0; } static struct platform_driver ads117x_codec_driver = { .driver = { - .name = "ads117x", + .name = "ads117x-codec", .owner = THIS_MODULE, }, - .probe = ads117x_platform_probe, - .remove = __devexit_p(ads117x_platform_remove), + .probe = ads117x_probe, + .remove = __devexit_p(ads117x_remove), }; static int __init ads117x_init(void) diff --git a/sound/soc/codecs/ads117x.h b/sound/soc/codecs/ads117x.h index dbcf50ec9bd1..3ce028614002 100644 --- a/sound/soc/codecs/ads117x.h +++ b/sound/soc/codecs/ads117x.h @@ -9,5 +9,5 @@ * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. */ -extern struct snd_soc_dai ads117x_dai; -extern struct snd_soc_codec_device soc_codec_dev_ads117x; +extern struct snd_soc_dai_driver ads117x_dai; +extern struct snd_soc_codec_driver soc_codec_dev_ads117x; diff --git a/sound/soc/codecs/ak4104.c b/sound/soc/codecs/ak4104.c index 192aebda3029..c27f8f59dc66 100644 --- a/sound/soc/codecs/ak4104.c +++ b/sound/soc/codecs/ak4104.c @@ -17,8 +17,6 @@ #include #include -#include "ak4104.h" - /* AK4104 registers addresses */ #define AK4104_REG_CONTROL1 0x00 #define AK4104_REG_RESERVED 0x01 @@ -45,11 +43,11 @@ #define AK4104_TX_TXE (1 << 0) #define AK4104_TX_V (1 << 1) -#define DRV_NAME "ak4104" +#define DRV_NAME "ak4104-codec" struct ak4104_private { - struct snd_soc_codec codec; - u8 reg_cache[AK4104_NUM_REGS]; + enum snd_soc_control_type control_type; + void *control_data; }; static int ak4104_fill_cache(struct snd_soc_codec *codec) @@ -58,7 +56,7 @@ static int ak4104_fill_cache(struct snd_soc_codec *codec) u8 *reg_cache = codec->reg_cache; struct spi_device *spi = codec->control_data; - for (i = 0; i < codec->reg_cache_size; i++) { + for (i = 0; i < codec->driver->reg_cache_size; i++) { int ret = spi_w8r8(spi, i | AK4104_READ); if (ret < 0) { dev_err(&spi->dev, "SPI write failure\n"); @@ -76,7 +74,7 @@ static unsigned int ak4104_read_reg_cache(struct snd_soc_codec *codec, { u8 *reg_cache = codec->reg_cache; - if (reg >= codec->reg_cache_size) + if (reg >= codec->driver->reg_cache_size) return -EINVAL; return reg_cache[reg]; @@ -88,7 +86,7 @@ static int ak4104_spi_write(struct snd_soc_codec *codec, unsigned int reg, u8 *cache = codec->reg_cache; struct spi_device *spi = codec->control_data; - if (reg >= codec->reg_cache_size) + if (reg >= codec->driver->reg_cache_size) return -EINVAL; /* only write to the hardware if value has changed */ @@ -145,8 +143,7 @@ static int ak4104_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; int val = 0; /* set the IEC958 bits: consumer mode, no copyright bit */ @@ -178,8 +175,8 @@ static struct snd_soc_dai_ops ak4101_dai_ops = { .set_fmt = ak4104_set_dai_fmt, }; -struct snd_soc_dai ak4104_dai = { - .name = DRV_NAME, +static struct snd_soc_dai_driver ak4104_dai = { + .name = "ak4104-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, @@ -192,45 +189,17 @@ struct snd_soc_dai ak4104_dai = { .ops = &ak4101_dai_ops, }; -static struct snd_soc_codec *ak4104_codec; - -static int ak4104_spi_probe(struct spi_device *spi) +static int ak4104_probe(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec; - struct ak4104_private *ak4104; + struct ak4104_private *ak4104 = snd_soc_codec_get_drvdata(codec); int ret, val; - spi->bits_per_word = 8; - spi->mode = SPI_MODE_0; - ret = spi_setup(spi); - if (ret < 0) - return ret; - - ak4104 = kzalloc(sizeof(struct ak4104_private), GFP_KERNEL); - if (!ak4104) { - dev_err(&spi->dev, "could not allocate codec\n"); - return -ENOMEM; - } - - codec = &ak4104->codec; - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - codec->dev = &spi->dev; - codec->name = DRV_NAME; - codec->owner = THIS_MODULE; - codec->dai = &ak4104_dai; - codec->num_dai = 1; - snd_soc_codec_set_drvdata(codec, ak4104); - codec->control_data = spi; - codec->reg_cache = ak4104->reg_cache; - codec->reg_cache_size = AK4104_NUM_REGS; + codec->control_data = ak4104->control_data; /* read all regs and fill the cache */ ret = ak4104_fill_cache(codec); if (ret < 0) { - dev_err(&spi->dev, "failed to fill register cache\n"); + dev_err(codec->dev, "failed to fill register cache\n"); return ret; } @@ -238,93 +207,81 @@ static int ak4104_spi_probe(struct spi_device *spi) * should contain 0x5b. Not a good way to verify the presence of * the device, but there is no hardware ID register. */ if (ak4104_read_reg_cache(codec, AK4104_REG_RESERVED) != - AK4104_RESERVED_VAL) { - ret = -ENODEV; - goto error_free_codec; - } + AK4104_RESERVED_VAL) + return -ENODEV; /* set power-up and non-reset bits */ val = ak4104_read_reg_cache(codec, AK4104_REG_CONTROL1); val |= AK4104_CONTROL1_PW | AK4104_CONTROL1_RSTN; ret = ak4104_spi_write(codec, AK4104_REG_CONTROL1, val); if (ret < 0) - goto error_free_codec; + return ret; /* enable transmitter */ val = ak4104_read_reg_cache(codec, AK4104_REG_TX); val |= AK4104_TX_TXE; ret = ak4104_spi_write(codec, AK4104_REG_TX, val); if (ret < 0) - goto error_free_codec; - - ak4104_codec = codec; - ret = snd_soc_register_dai(&ak4104_dai); - if (ret < 0) { - dev_err(&spi->dev, "failed to register DAI\n"); - goto error_free_codec; - } + return ret; - spi_set_drvdata(spi, ak4104); - dev_info(&spi->dev, "SPI device initialized\n"); + dev_info(codec->dev, "SPI device initialized\n"); return 0; - -error_free_codec: - kfree(ak4104); - ak4104_dai.dev = NULL; - return ret; } -static int __devexit ak4104_spi_remove(struct spi_device *spi) +static int ak4104_remove(struct snd_soc_codec *codec) { - int ret, val; - struct ak4104_private *ak4104 = spi_get_drvdata(spi); + int val, ret; - val = ak4104_read_reg_cache(&ak4104->codec, AK4104_REG_CONTROL1); + val = ak4104_read_reg_cache(codec, AK4104_REG_CONTROL1); if (val < 0) return val; /* clear power-up and non-reset bits */ val &= ~(AK4104_CONTROL1_PW | AK4104_CONTROL1_RSTN); - ret = ak4104_spi_write(&ak4104->codec, AK4104_REG_CONTROL1, val); - if (ret < 0) - return ret; + ret = ak4104_spi_write(codec, AK4104_REG_CONTROL1, val); - ak4104_codec = NULL; - kfree(ak4104); - return 0; + return ret; } -static int ak4104_probe(struct platform_device *pdev) +static struct snd_soc_codec_driver soc_codec_device_ak4104 = { + .probe = ak4104_probe, + .remove = ak4104_remove, + .reg_cache_size = AK4104_NUM_REGS, + .reg_word_size = sizeof(u16), +}; + +static int ak4104_spi_probe(struct spi_device *spi) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = ak4104_codec; + struct ak4104_private *ak4104; int ret; - /* Connect the codec to the socdev. snd_soc_new_pcms() needs this. */ - socdev->card->codec = codec; - - /* Register PCMs */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms\n"); + spi->bits_per_word = 8; + spi->mode = SPI_MODE_0; + ret = spi_setup(spi); + if (ret < 0) return ret; - } - return 0; + ak4104 = kzalloc(sizeof(struct ak4104_private), GFP_KERNEL); + if (ak4104 == NULL) + return -ENOMEM; + + ak4104->control_data = spi; + ak4104->control_type = SND_SOC_SPI; + spi_set_drvdata(spi, ak4104); + + ret = snd_soc_register_codec(&spi->dev, + &soc_codec_device_ak4104, &ak4104_dai, 1); + if (ret < 0) + kfree(ak4104); + return ret; } -static int ak4104_remove(struct platform_device *pdev) +static int __devexit ak4104_spi_remove(struct spi_device *spi) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - snd_soc_free_pcms(socdev); + snd_soc_unregister_codec(&spi->dev); + kfree(spi_get_drvdata(spi)); return 0; -}; - -struct snd_soc_codec_device soc_codec_device_ak4104 = { - .probe = ak4104_probe, - .remove = ak4104_remove -}; -EXPORT_SYMBOL_GPL(soc_codec_device_ak4104); +} static struct spi_driver ak4104_spi_driver = { .driver = { diff --git a/sound/soc/codecs/ak4104.h b/sound/soc/codecs/ak4104.h deleted file mode 100644 index eb88fe7e4def..000000000000 --- a/sound/soc/codecs/ak4104.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _AK4104_H -#define _AK4104_H - -extern struct snd_soc_dai ak4104_dai; -extern struct snd_soc_codec_device soc_codec_device_ak4104; - -#endif diff --git a/sound/soc/codecs/ak4535.c b/sound/soc/codecs/ak4535.c index d4253675b2d3..cd88c8f32a38 100644 --- a/sound/soc/codecs/ak4535.c +++ b/sound/soc/codecs/ak4535.c @@ -31,11 +31,11 @@ #define AK4535_VERSION "0.3" -struct snd_soc_codec_device soc_codec_dev_ak4535; - /* codec private data */ struct ak4535_priv { unsigned int sysclk; + enum snd_soc_control_type control_type; + void *control_data; }; /* @@ -313,8 +313,7 @@ static int ak4535_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct ak4535_priv *ak4535 = snd_soc_codec_get_drvdata(codec); u8 mode2 = ak4535_read_reg_cache(codec, AK4535_MODE2) & ~(0x3 << 5); int rate = params_rate(params), fs = 256; @@ -378,14 +377,16 @@ static int ak4535_mute(struct snd_soc_dai *dai, int mute) static int ak4535_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) { - u16 i; + u16 i, mute_reg; switch (level) { case SND_SOC_BIAS_ON: - ak4535_mute(codec->dai, 0); + mute_reg = ak4535_read_reg_cache(codec, AK4535_DAC) & 0xffdf; + ak4535_write(codec, AK4535_DAC, mute_reg); break; case SND_SOC_BIAS_PREPARE: - ak4535_mute(codec->dai, 1); + mute_reg = ak4535_read_reg_cache(codec, AK4535_DAC) & 0xffdf; + ak4535_write(codec, AK4535_DAC, mute_reg | 0x20); break; case SND_SOC_BIAS_STANDBY: i = ak4535_read_reg_cache(codec, AK4535_PM1); @@ -413,8 +414,8 @@ static struct snd_soc_dai_ops ak4535_dai_ops = { .set_sysclk = ak4535_set_dai_sysclk, }; -struct snd_soc_dai ak4535_dai = { - .name = "AK4535", +static struct snd_soc_dai_driver ak4535_dai = { + .name = "ak4535-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -429,54 +430,27 @@ struct snd_soc_dai ak4535_dai = { .formats = SNDRV_PCM_FMTBIT_S16_LE,}, .ops = &ak4535_dai_ops, }; -EXPORT_SYMBOL_GPL(ak4535_dai); -static int ak4535_suspend(struct platform_device *pdev, pm_message_t state) +static int ak4535_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - ak4535_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int ak4535_resume(struct platform_device *pdev) +static int ak4535_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; ak4535_sync(codec); ak4535_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; } -/* - * initialise the AK4535 driver - * register the mixer and dsp interfaces with the kernel - */ -static int ak4535_init(struct snd_soc_device *socdev) +static int ak4535_probe(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = socdev->card->codec; - int ret = 0; + struct ak4535_priv *ak4535 = snd_soc_codec_get_drvdata(codec); - codec->name = "AK4535"; - codec->owner = THIS_MODULE; - codec->read = ak4535_read_reg_cache; - codec->write = ak4535_write; - codec->set_bias_level = ak4535_set_bias_level; - codec->dai = &ak4535_dai; - codec->num_dai = 1; - codec->reg_cache_size = ARRAY_SIZE(ak4535_reg); - codec->reg_cache = kmemdup(ak4535_reg, sizeof(ak4535_reg), GFP_KERNEL); - - if (codec->reg_cache == NULL) - return -ENOMEM; + printk(KERN_INFO "AK4535 Audio Codec %s", AK4535_VERSION); - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - printk(KERN_ERR "ak4535: failed to create pcms\n"); - goto pcm_err; - } + codec->control_data = ak4535->control_data; /* power on device */ ak4535_set_bias_level(codec, SND_SOC_BIAS_STANDBY); @@ -485,39 +459,55 @@ static int ak4535_init(struct snd_soc_device *socdev) ARRAY_SIZE(ak4535_snd_controls)); ak4535_add_widgets(codec); - return ret; - -pcm_err: - kfree(codec->reg_cache); + return 0; +} - return ret; +/* power down chip */ +static int ak4535_remove(struct snd_soc_codec *codec) +{ + ak4535_set_bias_level(codec, SND_SOC_BIAS_OFF); + return 0; } -static struct snd_soc_device *ak4535_socdev; +static struct snd_soc_codec_driver soc_codec_dev_ak4535 = { + .probe = ak4535_probe, + .remove = ak4535_remove, + .suspend = ak4535_suspend, + .resume = ak4535_resume, + .read = ak4535_read_reg_cache, + .write = ak4535_write, + .set_bias_level = ak4535_set_bias_level, + .reg_cache_size = ARRAY_SIZE(ak4535_reg), + .reg_word_size = sizeof(u8), + .reg_cache_default = ak4535_reg, +}; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - -static int ak4535_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) +static __devinit int ak4535_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) { - struct snd_soc_device *socdev = ak4535_socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct ak4535_priv *ak4535; int ret; - i2c_set_clientdata(i2c, codec); - codec->control_data = i2c; + ak4535 = kzalloc(sizeof(struct ak4535_priv), GFP_KERNEL); + if (ak4535 == NULL) + return -ENOMEM; - ret = ak4535_init(socdev); - if (ret < 0) - printk(KERN_ERR "failed to initialise AK4535\n"); + i2c_set_clientdata(i2c, ak4535); + ak4535->control_data = i2c; + ak4535->control_type = SND_SOC_I2C; + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_ak4535, &ak4535_dai, 1); + if (ret < 0) + kfree(ak4535); return ret; } -static int ak4535_i2c_remove(struct i2c_client *client) +static __devexit int ak4535_i2c_remove(struct i2c_client *client) { - struct snd_soc_codec *codec = i2c_get_clientdata(client); - kfree(codec->reg_cache); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -529,138 +519,34 @@ MODULE_DEVICE_TABLE(i2c, ak4535_i2c_id); static struct i2c_driver ak4535_i2c_driver = { .driver = { - .name = "AK4535 I2C Codec", + .name = "ak4535-codec", .owner = THIS_MODULE, }, .probe = ak4535_i2c_probe, - .remove = ak4535_i2c_remove, + .remove = __devexit_p(ak4535_i2c_remove), .id_table = ak4535_i2c_id, }; - -static int ak4535_add_i2c_device(struct platform_device *pdev, - const struct ak4535_setup_data *setup) -{ - struct i2c_board_info info; - struct i2c_adapter *adapter; - struct i2c_client *client; - int ret; - - ret = i2c_add_driver(&ak4535_i2c_driver); - if (ret != 0) { - dev_err(&pdev->dev, "can't add i2c driver\n"); - return ret; - } - - memset(&info, 0, sizeof(struct i2c_board_info)); - info.addr = setup->i2c_address; - strlcpy(info.type, "ak4535", I2C_NAME_SIZE); - - adapter = i2c_get_adapter(setup->i2c_bus); - if (!adapter) { - dev_err(&pdev->dev, "can't get i2c adapter %d\n", - setup->i2c_bus); - goto err_driver; - } - - client = i2c_new_device(adapter, &info); - i2c_put_adapter(adapter); - if (!client) { - dev_err(&pdev->dev, "can't add i2c device at 0x%x\n", - (unsigned int)info.addr); - goto err_driver; - } - - return 0; - -err_driver: - i2c_del_driver(&ak4535_i2c_driver); - return -ENODEV; -} #endif -static int ak4535_probe(struct platform_device *pdev) +static int __init ak4535_modinit(void) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct ak4535_setup_data *setup; - struct snd_soc_codec *codec; - struct ak4535_priv *ak4535; - int ret; - - printk(KERN_INFO "AK4535 Audio Codec %s", AK4535_VERSION); - - setup = socdev->codec_data; - codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (codec == NULL) - return -ENOMEM; - - ak4535 = kzalloc(sizeof(struct ak4535_priv), GFP_KERNEL); - if (ak4535 == NULL) { - kfree(codec); - return -ENOMEM; - } - - snd_soc_codec_set_drvdata(codec, ak4535); - socdev->card->codec = codec; - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - ak4535_socdev = socdev; - ret = -ENODEV; - + int ret = 0; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - if (setup->i2c_address) { - codec->hw_write = (hw_write_t)i2c_master_send; - ret = ak4535_add_i2c_device(pdev, setup); - } -#endif - + ret = i2c_add_driver(&ak4535_i2c_driver); if (ret != 0) { - kfree(snd_soc_codec_get_drvdata(codec)); - kfree(codec); + printk(KERN_ERR "Failed to register AK4535 I2C driver: %d\n", + ret); } +#endif return ret; } +module_init(ak4535_modinit); -/* power down chip */ -static int ak4535_remove(struct platform_device *pdev) +static void __exit ak4535_exit(void) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - if (codec->control_data) - ak4535_set_bias_level(codec, SND_SOC_BIAS_OFF); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - if (codec->control_data) - i2c_unregister_device(codec->control_data); i2c_del_driver(&ak4535_i2c_driver); #endif - kfree(snd_soc_codec_get_drvdata(codec)); - kfree(codec); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_ak4535 = { - .probe = ak4535_probe, - .remove = ak4535_remove, - .suspend = ak4535_suspend, - .resume = ak4535_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_ak4535); - -static int __init ak4535_modinit(void) -{ - return snd_soc_register_dai(&ak4535_dai); -} -module_init(ak4535_modinit); - -static void __exit ak4535_exit(void) -{ - snd_soc_unregister_dai(&ak4535_dai); } module_exit(ak4535_exit); diff --git a/sound/soc/codecs/ak4535.h b/sound/soc/codecs/ak4535.h index c7a58703ea39..0431e5f634a2 100644 --- a/sound/soc/codecs/ak4535.h +++ b/sound/soc/codecs/ak4535.h @@ -36,12 +36,4 @@ #define AK4535_CACHEREGNUM 0x10 -struct ak4535_setup_data { - int i2c_bus; - unsigned short i2c_address; -}; - -extern struct snd_soc_dai ak4535_dai; -extern struct snd_soc_codec_device soc_codec_dev_ak4535; - #endif diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 3d7dc55305ec..31b35e967398 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -30,8 +30,6 @@ #include #include -#include "ak4642.h" - #define AK4642_VERSION "0.0.1" #define PW_MGMT1 0x00 @@ -102,7 +100,6 @@ #define FS3 (1 << 5) #define FS_MASK (FS0 | FS1 | FS2 | FS3) -struct snd_soc_codec_device soc_codec_dev_ak4642; /* * Playback Volume (table 39) @@ -123,11 +120,11 @@ static const struct snd_kcontrol_new ak4642_snd_controls[] = { /* codec private data */ struct ak4642_priv { - struct snd_soc_codec codec; + unsigned int sysclk; + enum snd_soc_control_type control_type; + void *control_data; }; -static struct snd_soc_codec *ak4642_codec; - /* * ak4642 register cache */ @@ -393,8 +390,8 @@ static struct snd_soc_dai_ops ak4642_dai_ops = { .hw_params = ak4642_dai_hw_params, }; -struct snd_soc_dai ak4642_dai = { - .name = "AK4642", +static struct snd_soc_dai_driver ak4642_dai = { + .name = "ak4642-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -410,112 +407,63 @@ struct snd_soc_dai ak4642_dai = { .ops = &ak4642_dai_ops, .symmetric_rates = 1, }; -EXPORT_SYMBOL_GPL(ak4642_dai); -static int ak4642_resume(struct platform_device *pdev) +static int ak4642_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - ak4642_sync(codec); return 0; } -/* - * initialise the AK4642 driver - * register the mixer and dsp interfaces with the kernel - */ -static int ak4642_init(struct ak4642_priv *ak4642) + +static int ak4642_probe(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = &ak4642->codec; - int ret = 0; + struct ak4642_priv *ak4642 = snd_soc_codec_get_drvdata(codec); - if (ak4642_codec) { - dev_err(codec->dev, "Another ak4642 is registered\n"); - return -EINVAL; - } + dev_info(codec->dev, "AK4642 Audio Codec %s", AK4642_VERSION); - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, ak4642); - codec->name = "AK4642"; - codec->owner = THIS_MODULE; - codec->read = ak4642_read_reg_cache; - codec->write = ak4642_write; - codec->dai = &ak4642_dai; - codec->num_dai = 1; codec->hw_write = (hw_write_t)i2c_master_send; - codec->reg_cache_size = ARRAY_SIZE(ak4642_reg); - codec->reg_cache = kmemdup(ak4642_reg, - sizeof(ak4642_reg), GFP_KERNEL); - - if (!codec->reg_cache) - return -ENOMEM; - - ak4642_dai.dev = codec->dev; - ak4642_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto reg_cache_err; - } + codec->control_data = ak4642->control_data; - ret = snd_soc_register_dai(&ak4642_dai); - if (ret) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - snd_soc_unregister_codec(codec); - goto reg_cache_err; - } - - return ret; - -reg_cache_err: - kfree(codec->reg_cache); - codec->reg_cache = NULL; - return ret; + return 0; } +static struct snd_soc_codec_driver soc_codec_dev_ak4642 = { + .probe = ak4642_probe, + .resume = ak4642_resume, + .read = ak4642_read_reg_cache, + .write = ak4642_write, + .reg_cache_size = ARRAY_SIZE(ak4642_reg), + .reg_word_size = sizeof(u8), + .reg_cache_default = ak4642_reg, +}; + #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) -static int ak4642_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) +static __devinit int ak4642_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) { struct ak4642_priv *ak4642; - struct snd_soc_codec *codec; int ret; ak4642 = kzalloc(sizeof(struct ak4642_priv), GFP_KERNEL); - if (!ak4642) + if (ak4642 == NULL) return -ENOMEM; - codec = &ak4642->codec; - codec->dev = &i2c->dev; - i2c_set_clientdata(i2c, ak4642); - codec->control_data = i2c; + ak4642->control_data = i2c; + ak4642->control_type = SND_SOC_I2C; - ret = ak4642_init(ak4642); - if (ret < 0) { - printk(KERN_ERR "failed to initialise AK4642\n"); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_ak4642, &ak4642_dai, 1); + if (ret < 0) kfree(ak4642); - } - return ret; } -static int ak4642_i2c_remove(struct i2c_client *client) +static __devexit int ak4642_i2c_remove(struct i2c_client *client) { - struct ak4642_priv *ak4642 = i2c_get_clientdata(client); - - snd_soc_unregister_dai(&ak4642_dai); - snd_soc_unregister_codec(&ak4642->codec); - kfree(ak4642->codec.reg_cache); - kfree(ak4642); - ak4642_codec = NULL; - + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -528,64 +476,15 @@ MODULE_DEVICE_TABLE(i2c, ak4642_i2c_id); static struct i2c_driver ak4642_i2c_driver = { .driver = { - .name = "AK4642 I2C Codec", + .name = "ak4642-codec", .owner = THIS_MODULE, }, - .probe = ak4642_i2c_probe, - .remove = ak4642_i2c_remove, - .id_table = ak4642_i2c_id, + .probe = ak4642_i2c_probe, + .remove = __devexit_p(ak4642_i2c_remove), + .id_table = ak4642_i2c_id, }; - #endif -static int ak4642_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - int ret; - - if (!ak4642_codec) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = ak4642_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - printk(KERN_ERR "ak4642: failed to create pcms\n"); - goto pcm_err; - } - - snd_soc_add_controls(ak4642_codec, ak4642_snd_controls, - ARRAY_SIZE(ak4642_snd_controls)); - - dev_info(&pdev->dev, "AK4642 Audio Codec %s", AK4642_VERSION); - return ret; - -pcm_err: - return ret; - -} - -/* power down chip */ -static int ak4642_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_ak4642 = { - .probe = ak4642_probe, - .remove = ak4642_remove, - .resume = ak4642_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_ak4642); - static int __init ak4642_modinit(void) { int ret = 0; diff --git a/sound/soc/codecs/ak4642.h b/sound/soc/codecs/ak4642.h deleted file mode 100644 index e476833d314e..000000000000 --- a/sound/soc/codecs/ak4642.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * ak4642.h -- AK4642 Soc Audio driver - * - * Copyright (C) 2009 Renesas Solutions Corp. - * Kuninori Morimoto - * - * Based on ak4535.c - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef _AK4642_H -#define _AK4642_H - -extern struct snd_soc_dai ak4642_dai; -extern struct snd_soc_codec_device soc_codec_dev_ak4642; - -#endif diff --git a/sound/soc/codecs/ak4671.c b/sound/soc/codecs/ak4671.c index 87566932a3b1..239f0562003c 100644 --- a/sound/soc/codecs/ak4671.c +++ b/sound/soc/codecs/ak4671.c @@ -23,11 +23,11 @@ #include "ak4671.h" -static struct snd_soc_codec *ak4671_codec; /* codec private data */ struct ak4671_priv { - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; u8 reg_cache[AK4671_CACHEREGNUM]; }; @@ -619,8 +619,8 @@ static struct snd_soc_dai_ops ak4671_dai_ops = { .set_fmt = ak4671_set_dai_fmt, }; -struct snd_soc_dai ak4671_dai = { - .name = "AK4671", +static struct snd_soc_dai_driver ak4671_dai = { + .name = "ak4671-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -635,27 +635,19 @@ struct snd_soc_dai ak4671_dai = { .formats = AK4671_FORMATS,}, .ops = &ak4671_dai_ops, }; -EXPORT_SYMBOL_GPL(ak4671_dai); -static int ak4671_probe(struct platform_device *pdev) +static int ak4671_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - if (ak4671_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } + struct ak4671_priv *ak4671 = snd_soc_codec_get_drvdata(codec); + int ret; - socdev->card->codec = ak4671_codec; - codec = ak4671_codec; + codec->hw_write = (hw_write_t)i2c_master_send; + codec->bias_level = SND_SOC_BIAS_OFF; - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); + ret = snd_soc_codec_set_cache_io(codec, 8, 8, ak4671->control_type); if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; + dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); + return ret; } snd_soc_add_controls(codec, ak4671_snd_controls, @@ -665,121 +657,48 @@ static int ak4671_probe(struct platform_device *pdev) ak4671_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return ret; - -pcm_err: - return ret; } -static int ak4671_remove(struct platform_device *pdev) +static int ak4671_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - + ak4671_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -struct snd_soc_codec_device soc_codec_dev_ak4671 = { +static struct snd_soc_codec_driver soc_codec_dev_ak4671 = { .probe = ak4671_probe, .remove = ak4671_remove, + .set_bias_level = ak4671_set_bias_level, + .reg_cache_size = AK4671_CACHEREGNUM, + .reg_word_size = sizeof(u8), + .reg_cache_default = ak4671_reg, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_ak4671); - -static int ak4671_register(struct ak4671_priv *ak4671, - enum snd_soc_control_type control) -{ - int ret; - struct snd_soc_codec *codec = &ak4671->codec; - - if (ak4671_codec) { - dev_err(codec->dev, "Another AK4671 is registered\n"); - ret = -EINVAL; - goto err; - } - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, ak4671); - codec->name = "AK4671"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = ak4671_set_bias_level; - codec->dai = &ak4671_dai; - codec->num_dai = 1; - codec->reg_cache_size = AK4671_CACHEREGNUM; - codec->reg_cache = &ak4671->reg_cache; - - memcpy(codec->reg_cache, ak4671_reg, sizeof(ak4671_reg)); - - ret = snd_soc_codec_set_cache_io(codec, 8, 8, control); - if (ret < 0) { - dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; - } - - ak4671_dai.dev = codec->dev; - ak4671_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err; - } - - ret = snd_soc_register_dai(&ak4671_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } - - return 0; - -err_codec: - snd_soc_unregister_codec(codec); -err: - kfree(ak4671); - return ret; -} - -static void ak4671_unregister(struct ak4671_priv *ak4671) -{ - ak4671_set_bias_level(&ak4671->codec, SND_SOC_BIAS_OFF); - snd_soc_unregister_dai(&ak4671_dai); - snd_soc_unregister_codec(&ak4671->codec); - kfree(ak4671); - ak4671_codec = NULL; -} static int __devinit ak4671_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct ak4671_priv *ak4671; - struct snd_soc_codec *codec; + int ret; ak4671 = kzalloc(sizeof(struct ak4671_priv), GFP_KERNEL); if (ak4671 == NULL) return -ENOMEM; - codec = &ak4671->codec; - codec->hw_write = (hw_write_t)i2c_master_send; - i2c_set_clientdata(client, ak4671); - codec->control_data = client; - - codec->dev = &client->dev; + ak4671->control_data = client; + ak4671->control_type = SND_SOC_I2C; - return ak4671_register(ak4671, SND_SOC_I2C); + ret = snd_soc_register_codec(&client->dev, + &soc_codec_dev_ak4671, &ak4671_dai, 1); + if (ret < 0) + kfree(ak4671); + return ret; } static __devexit int ak4671_i2c_remove(struct i2c_client *client) { - struct ak4671_priv *ak4671 = i2c_get_clientdata(client); - - ak4671_unregister(ak4671); - + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -791,7 +710,7 @@ MODULE_DEVICE_TABLE(i2c, ak4671_i2c_id); static struct i2c_driver ak4671_i2c_driver = { .driver = { - .name = "ak4671", + .name = "ak4671-codec", .owner = THIS_MODULE, }, .probe = ak4671_i2c_probe, diff --git a/sound/soc/codecs/ak4671.h b/sound/soc/codecs/ak4671.h index e2fad964e88b..61cb7ab7552c 100644 --- a/sound/soc/codecs/ak4671.h +++ b/sound/soc/codecs/ak4671.h @@ -150,7 +150,4 @@ /* AK4671_LOUT2_POWER_MANAGEMENT (0x10) Fields */ #define AK4671_MUTEN 0x04 -extern struct snd_soc_dai ak4671_dai; -extern struct snd_soc_codec_device soc_codec_dev_ak4671; - #endif diff --git a/sound/soc/codecs/cq93vc.c b/sound/soc/codecs/cq93vc.c index a320fb5a0e26..823643932dde 100644 --- a/sound/soc/codecs/cq93vc.c +++ b/sound/soc/codecs/cq93vc.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -41,8 +42,6 @@ #include -#include "cq93vc.h" - static inline unsigned int cq93vc_read(struct snd_soc_codec *codec, unsigned int reg) { @@ -130,8 +129,8 @@ static struct snd_soc_dai_ops cq93vc_dai_ops = { .set_sysclk = cq93vc_set_dai_sysclk, }; -struct snd_soc_dai cq93vc_dai = { - .name = "CQ93VC", +static struct snd_soc_dai_driver cq93vc_dai = { + .name = "cq93vc-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -146,36 +145,20 @@ struct snd_soc_dai cq93vc_dai = { .formats = CQ93VC_FORMATS,}, .ops = &cq93vc_dai_ops, }; -EXPORT_SYMBOL_GPL(cq93vc_dai); -static int cq93vc_resume(struct platform_device *pdev) +static int cq93vc_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - cq93vc_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; } -static struct snd_soc_codec *cq93vc_codec; - -static int cq93vc_probe(struct platform_device *pdev) +static int cq93vc_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct device *dev = &pdev->dev; - struct snd_soc_codec *codec; - int ret; - - socdev->card->codec = cq93vc_codec; - codec = socdev->card->codec; - - /* Register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(dev, "%s: failed to create pcms\n", pdev->name); - return ret; - } + struct davinci_vc *davinci_vc = codec->dev->platform_data; + + davinci_vc->cq93vc.codec = codec; + codec->control_data = davinci_vc; /* Set controls */ snd_soc_add_controls(codec, cq93vc_snd_controls, @@ -187,108 +170,51 @@ static int cq93vc_probe(struct platform_device *pdev) return 0; } -static int cq93vc_remove(struct platform_device *pdev) +static int cq93vc_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); + cq93vc_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -struct snd_soc_codec_device soc_codec_dev_cq93vc = { +static struct snd_soc_codec_driver soc_codec_dev_cq93vc = { + .read = cq93vc_read, + .write = cq93vc_write, + .set_bias_level = cq93vc_set_bias_level, .probe = cq93vc_probe, .remove = cq93vc_remove, .resume = cq93vc_resume, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_cq93vc); -static __init int cq93vc_codec_probe(struct platform_device *pdev) +static int cq93vc_platform_probe(struct platform_device *pdev) { - struct davinci_vc *davinci_vc = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret; - - codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (codec == NULL) { - dev_dbg(davinci_vc->dev, - "could not allocate memory for codec data\n"); - return -ENOMEM; - } - - davinci_vc->cq93vc.codec = codec; - - cq93vc_dai.dev = &pdev->dev; - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - codec->dev = &pdev->dev; - codec->name = "CQ93VC"; - codec->owner = THIS_MODULE; - codec->read = cq93vc_read; - codec->write = cq93vc_write; - codec->set_bias_level = cq93vc_set_bias_level; - codec->dai = &cq93vc_dai; - codec->num_dai = 1; - codec->control_data = davinci_vc; - - cq93vc_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret) { - dev_err(davinci_vc->dev, "failed to register codec\n"); - goto fail1; - } - - ret = snd_soc_register_dai(&cq93vc_dai); - if (ret) { - dev_err(davinci_vc->dev, "could register dai\n"); - goto fail2; - } - return 0; - -fail2: - snd_soc_unregister_codec(codec); - -fail1: - kfree(codec); - cq93vc_codec = NULL; - - return ret; + return snd_soc_register_codec(&pdev->dev, + &soc_codec_dev_cq93vc, &cq93vc_dai, 1); } -static int __devexit cq93vc_codec_remove(struct platform_device *pdev) +static int cq93vc_platform_remove(struct platform_device *pdev) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - snd_soc_unregister_dai(&cq93vc_dai); - snd_soc_unregister_codec(&codec); - - kfree(codec); - cq93vc_codec = NULL; - + snd_soc_unregister_codec(&pdev->dev); return 0; } static struct platform_driver cq93vc_codec_driver = { .driver = { - .name = "cq93vc", - .owner = THIS_MODULE, - }, - .probe = cq93vc_codec_probe, - .remove = __devexit_p(cq93vc_codec_remove), + .name = "cq93vc-codec", + .owner = THIS_MODULE, + }, + + .probe = cq93vc_platform_probe, + .remove = __devexit_p(cq93vc_platform_remove), }; -static __init int cq93vc_init(void) +static int __init cq93vc_init(void) { - return platform_driver_probe(&cq93vc_codec_driver, cq93vc_codec_probe); + return platform_driver_register(&cq93vc_codec_driver); } module_init(cq93vc_init); -static __exit void cq93vc_exit(void) +static void __exit cq93vc_exit(void) { platform_driver_unregister(&cq93vc_codec_driver); } diff --git a/sound/soc/codecs/cq93vc.h b/sound/soc/codecs/cq93vc.h deleted file mode 100644 index 845b1968ef9c..000000000000 --- a/sound/soc/codecs/cq93vc.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * ALSA SoC CQ0093 Voice Codec Driver for DaVinci platforms - * - * Copyright (C) 2010 Texas Instruments, Inc - * - * Author: Miguel Aguilar - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _CQ93VC_H -#define _CQ93VC_H - -extern struct snd_soc_dai cq93vc_dai; -extern struct snd_soc_codec_device soc_codec_dev_cq93vc; - -#endif diff --git a/sound/soc/codecs/cs4270.c b/sound/soc/codecs/cs4270.c index 30d949239def..6542dc038951 100644 --- a/sound/soc/codecs/cs4270.c +++ b/sound/soc/codecs/cs4270.c @@ -31,8 +31,6 @@ #include #include -#include "cs4270.h" - /* * The codec isn't really big-endian or little-endian, since the I2S * interface requires data to be sent serially with the MSbit first. @@ -114,7 +112,8 @@ static const char *supply_names[] = { /* Private data for the CS4270 */ struct cs4270_private { - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; u8 reg_cache[CS4270_NUMREGS]; unsigned int mclk; /* Input frequency of the MCLK pin */ unsigned int mode; /* The mode (I2S or left-justified) */ @@ -212,44 +211,8 @@ static int cs4270_set_dai_sysclk(struct snd_soc_dai *codec_dai, { struct snd_soc_codec *codec = codec_dai->codec; struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); - unsigned int rates = 0; - unsigned int rate_min = -1; - unsigned int rate_max = 0; - unsigned int i; cs4270->mclk = freq; - - if (cs4270->mclk) { - for (i = 0; i < NUM_MCLK_RATIOS; i++) { - unsigned int rate = freq / cs4270_mode_ratios[i].ratio; - rates |= snd_pcm_rate_to_rate_bit(rate); - if (rate < rate_min) - rate_min = rate; - if (rate > rate_max) - rate_max = rate; - } - /* FIXME: soc should support a rate list */ - rates &= ~SNDRV_PCM_RATE_KNOT; - - if (!rates) { - dev_err(codec->dev, "could not find a valid sample rate\n"); - return -EINVAL; - } - } else { - /* enable all possible rates */ - rates = SNDRV_PCM_RATE_8000_192000; - rate_min = 8000; - rate_max = 192000; - } - - codec_dai->playback.rates = rates; - codec_dai->playback.rate_min = rate_min; - codec_dai->playback.rate_max = rate_max; - - codec_dai->capture.rates = rates; - codec_dai->capture.rate_min = rate_min; - codec_dai->capture.rate_max = rate_max; - return 0; } @@ -410,8 +373,7 @@ static int cs4270_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); int ret; unsigned int i; @@ -549,19 +511,6 @@ static const struct snd_kcontrol_new cs4270_snd_controls[] = { snd_soc_get_volsw, cs4270_soc_put_mute), }; -/* - * cs4270_codec - global variable to store codec for the ASoC probe function - * - * If struct i2c_driver had a private_data field, we wouldn't need to use - * cs4270_codec. This is the only way to pass the codec structure from - * cs4270_i2c_probe() to cs4270_probe(). Unfortunately, there is no good - * way to synchronize these two functions. cs4270_i2c_probe() can be called - * multiple times before cs4270_probe() is called even once. So for now, we - * also only allow cs4270_i2c_probe() to be run once. That means that we do - * not support more than one cs4270 device in the system, at least for now. - */ -static struct snd_soc_codec *cs4270_codec; - static struct snd_soc_dai_ops cs4270_dai_ops = { .hw_params = cs4270_hw_params, .set_sysclk = cs4270_set_dai_sysclk, @@ -569,20 +518,24 @@ static struct snd_soc_dai_ops cs4270_dai_ops = { .digital_mute = cs4270_dai_mute, }; -struct snd_soc_dai cs4270_dai = { - .name = "cs4270", +struct snd_soc_dai_driver cs4270_dai = { + .name = "cs4270-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, .channels_max = 2, - .rates = 0, + .rates = SNDRV_PCM_RATE_CONTINUOUS, + .rate_min = 4000, + .rate_max = 216000, .formats = CS4270_FORMATS, }, .capture = { .stream_name = "Capture", .channels_min = 1, .channels_max = 2, - .rates = 0, + .rates = SNDRV_PCM_RATE_CONTINUOUS, + .rate_min = 4000, + .rate_max = 216000, .formats = CS4270_FORMATS, }, .ops = &cs4270_dai_ops, @@ -596,153 +549,19 @@ EXPORT_SYMBOL_GPL(cs4270_dai); * This function is called when ASoC has all the pieces it needs to * instantiate a sound driver. */ -static int cs4270_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = cs4270_codec; - struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); - int i, ret; - - /* Connect the codec to the socdev. snd_soc_new_pcms() needs this. */ - socdev->card->codec = codec; - - /* Register PCMs */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms\n"); - return ret; - } - - /* Add the non-DAPM controls */ - ret = snd_soc_add_controls(codec, cs4270_snd_controls, - ARRAY_SIZE(cs4270_snd_controls)); - if (ret < 0) { - dev_err(codec->dev, "failed to add controls\n"); - goto error_free_pcms; - } - - /* get the power supply regulators */ - for (i = 0; i < ARRAY_SIZE(supply_names); i++) - cs4270->supplies[i].supply = supply_names[i]; - - ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(cs4270->supplies), - cs4270->supplies); - if (ret < 0) - goto error_free_pcms; - - ret = regulator_bulk_enable(ARRAY_SIZE(cs4270->supplies), - cs4270->supplies); - if (ret < 0) - goto error_free_regulators; - - return 0; - -error_free_regulators: - regulator_bulk_free(ARRAY_SIZE(cs4270->supplies), - cs4270->supplies); - -error_free_pcms: - snd_soc_free_pcms(socdev); - - return ret; -} - -/** - * cs4270_remove - ASoC remove function - * @pdev: platform device - * - * This function is the counterpart to cs4270_probe(). - */ -static int cs4270_remove(struct platform_device *pdev) +static int cs4270_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = cs4270_codec; struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); + int i, ret, reg; - snd_soc_free_pcms(socdev); - regulator_bulk_disable(ARRAY_SIZE(cs4270->supplies), cs4270->supplies); - regulator_bulk_free(ARRAY_SIZE(cs4270->supplies), cs4270->supplies); - - return 0; -}; - -/** - * cs4270_i2c_probe - initialize the I2C interface of the CS4270 - * @i2c_client: the I2C client object - * @id: the I2C device ID (ignored) - * - * This function is called whenever the I2C subsystem finds a device that - * matches the device ID given via a prior call to i2c_add_driver(). - */ -static int cs4270_i2c_probe(struct i2c_client *i2c_client, - const struct i2c_device_id *id) -{ - struct snd_soc_codec *codec; - struct cs4270_private *cs4270; - unsigned int reg; - int ret; - - /* For now, we only support one cs4270 device in the system. See the - * comment for cs4270_codec. - */ - if (cs4270_codec) { - dev_err(&i2c_client->dev, "ignoring CS4270 at addr %X\n", - i2c_client->addr); - dev_err(&i2c_client->dev, "only one per board allowed\n"); - /* Should we return something other than ENODEV here? */ - return -ENODEV; - } - - /* Verify that we have a CS4270 */ - - ret = i2c_smbus_read_byte_data(i2c_client, CS4270_CHIPID); - if (ret < 0) { - dev_err(&i2c_client->dev, "failed to read i2c at addr %X\n", - i2c_client->addr); - return ret; - } - /* The top four bits of the chip ID should be 1100. */ - if ((ret & 0xF0) != 0xC0) { - dev_err(&i2c_client->dev, "device at addr %X is not a CS4270\n", - i2c_client->addr); - return -ENODEV; - } - - dev_info(&i2c_client->dev, "found device at i2c address %X\n", - i2c_client->addr); - dev_info(&i2c_client->dev, "hardware revision %X\n", ret & 0xF); - - /* Allocate enough space for the snd_soc_codec structure - and our private data together. */ - cs4270 = kzalloc(sizeof(struct cs4270_private), GFP_KERNEL); - if (!cs4270) { - dev_err(&i2c_client->dev, "could not allocate codec\n"); - return -ENOMEM; - } - codec = &cs4270->codec; - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - codec->dev = &i2c_client->dev; - codec->name = "CS4270"; - codec->owner = THIS_MODULE; - codec->dai = &cs4270_dai; - codec->num_dai = 1; - snd_soc_codec_set_drvdata(codec, cs4270); - codec->control_data = i2c_client; - codec->read = cs4270_read_reg_cache; - codec->write = cs4270_i2c_write; - codec->reg_cache = cs4270->reg_cache; - codec->reg_cache_size = CS4270_NUMREGS; + codec->control_data = cs4270->control_data; /* The I2C interface is set up, so pre-fill our register cache */ ret = cs4270_fill_cache(codec); if (ret < 0) { - dev_err(&i2c_client->dev, "failed to fill register cache\n"); - goto error_free_codec; + dev_err(codec->dev, "failed to fill register cache\n"); + return ret; } /* Disable auto-mute. This feature appears to be buggy. In some @@ -755,7 +574,7 @@ static int cs4270_i2c_probe(struct i2c_client *i2c_client, reg &= ~CS4270_MUTE_AUTO; ret = cs4270_i2c_write(codec, CS4270_MUTE, reg); if (ret < 0) { - dev_err(&i2c_client->dev, "i2c write failed\n"); + dev_err(codec->dev, "i2c write failed\n"); return ret; } @@ -769,65 +588,56 @@ static int cs4270_i2c_probe(struct i2c_client *i2c_client, reg &= ~(CS4270_TRANS_SOFT | CS4270_TRANS_ZERO); ret = cs4270_i2c_write(codec, CS4270_TRANS, reg); if (ret < 0) { - dev_err(&i2c_client->dev, "i2c write failed\n"); + dev_err(codec->dev, "i2c write failed\n"); return ret; } - /* Initialize the DAI. Normally, we'd prefer to have a kmalloc'd DAI - * structure for each CS4270 device, but the machine driver needs to - * have a pointer to the DAI structure, so for now it must be a global - * variable. - */ - cs4270_dai.dev = &i2c_client->dev; - - /* Register the DAI. If all the other ASoC driver have already - * registered, then this will call our probe function, so - * cs4270_codec needs to be ready. - */ - cs4270_codec = codec; - ret = snd_soc_register_dai(&cs4270_dai); + /* Add the non-DAPM controls */ + ret = snd_soc_add_controls(codec, cs4270_snd_controls, + ARRAY_SIZE(cs4270_snd_controls)); if (ret < 0) { - dev_err(&i2c_client->dev, "failed to register DAIe\n"); - goto error_free_codec; + dev_err(codec->dev, "failed to add controls\n"); + return ret; } - i2c_set_clientdata(i2c_client, cs4270); + /* get the power supply regulators */ + for (i = 0; i < ARRAY_SIZE(supply_names); i++) + cs4270->supplies[i].supply = supply_names[i]; + + ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(cs4270->supplies), + cs4270->supplies); + if (ret < 0) + return ret; + + ret = regulator_bulk_enable(ARRAY_SIZE(cs4270->supplies), + cs4270->supplies); + if (ret < 0) + goto error_free_regulators; return 0; -error_free_codec: - kfree(cs4270); - cs4270_codec = NULL; - cs4270_dai.dev = NULL; +error_free_regulators: + regulator_bulk_free(ARRAY_SIZE(cs4270->supplies), + cs4270->supplies); return ret; } /** - * cs4270_i2c_remove - remove an I2C device - * @i2c_client: the I2C client object + * cs4270_remove - ASoC remove function + * @pdev: platform device * - * This function is the counterpart to cs4270_i2c_probe(). + * This function is the counterpart to cs4270_probe(). */ -static int cs4270_i2c_remove(struct i2c_client *i2c_client) +static int cs4270_remove(struct snd_soc_codec *codec) { - struct cs4270_private *cs4270 = i2c_get_clientdata(i2c_client); + struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); - kfree(cs4270); - cs4270_codec = NULL; - cs4270_dai.dev = NULL; + regulator_bulk_disable(ARRAY_SIZE(cs4270->supplies), cs4270->supplies); + regulator_bulk_free(ARRAY_SIZE(cs4270->supplies), cs4270->supplies); return 0; -} - -/* - * cs4270_id - I2C device IDs supported by this driver - */ -static struct i2c_device_id cs4270_id[] = { - {"cs4270", 0}, - {} }; -MODULE_DEVICE_TABLE(i2c, cs4270_id); #ifdef CONFIG_PM @@ -840,9 +650,8 @@ MODULE_DEVICE_TABLE(i2c, cs4270_id); * and all registers are written back to the hardware when resuming. */ -static int cs4270_soc_suspend(struct platform_device *pdev, pm_message_t mesg) +static int cs4270_soc_suspend(struct snd_soc_codec *codec, pm_message_t mesg) { - struct snd_soc_codec *codec = cs4270_codec; struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); int reg, ret; @@ -860,9 +669,8 @@ static int cs4270_soc_suspend(struct platform_device *pdev, pm_message_t mesg) return 0; } -static int cs4270_soc_resume(struct platform_device *pdev) +static int cs4270_soc_resume(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = cs4270_codec; struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); struct i2c_client *i2c_client = codec->control_data; int reg; @@ -895,6 +703,95 @@ static int cs4270_soc_resume(struct platform_device *pdev) #define cs4270_soc_resume NULL #endif /* CONFIG_PM */ +/* + * ASoC codec device structure + * + * Assign this variable to the codec_dev field of the machine driver's + * snd_soc_device structure. + */ +static struct snd_soc_codec_driver soc_codec_device_cs4270 = { + .probe = cs4270_probe, + .remove = cs4270_remove, + .suspend = cs4270_soc_suspend, + .resume = cs4270_soc_resume, + .read = cs4270_read_reg_cache, + .write = cs4270_i2c_write, + .reg_cache_size = CS4270_NUMREGS, + .reg_word_size = sizeof(u8), +}; + +/** + * cs4270_i2c_probe - initialize the I2C interface of the CS4270 + * @i2c_client: the I2C client object + * @id: the I2C device ID (ignored) + * + * This function is called whenever the I2C subsystem finds a device that + * matches the device ID given via a prior call to i2c_add_driver(). + */ +static int cs4270_i2c_probe(struct i2c_client *i2c_client, + const struct i2c_device_id *id) +{ + struct cs4270_private *cs4270; + int ret; + + /* Verify that we have a CS4270 */ + + ret = i2c_smbus_read_byte_data(i2c_client, CS4270_CHIPID); + if (ret < 0) { + dev_err(&i2c_client->dev, "failed to read i2c at addr %X\n", + i2c_client->addr); + return ret; + } + /* The top four bits of the chip ID should be 1100. */ + if ((ret & 0xF0) != 0xC0) { + dev_err(&i2c_client->dev, "device at addr %X is not a CS4270\n", + i2c_client->addr); + return -ENODEV; + } + + dev_info(&i2c_client->dev, "found device at i2c address %X\n", + i2c_client->addr); + dev_info(&i2c_client->dev, "hardware revision %X\n", ret & 0xF); + + cs4270 = kzalloc(sizeof(struct cs4270_private), GFP_KERNEL); + if (!cs4270) { + dev_err(&i2c_client->dev, "could not allocate codec\n"); + return -ENOMEM; + } + + i2c_set_clientdata(i2c_client, cs4270); + cs4270->control_data = i2c_client; + cs4270->control_type = SND_SOC_I2C; + + ret = snd_soc_register_codec(&i2c_client->dev, + &soc_codec_device_cs4270, &cs4270_dai, 1); + if (ret < 0) + kfree(cs4270); + return ret; +} + +/** + * cs4270_i2c_remove - remove an I2C device + * @i2c_client: the I2C client object + * + * This function is the counterpart to cs4270_i2c_probe(). + */ +static int cs4270_i2c_remove(struct i2c_client *i2c_client) +{ + snd_soc_unregister_codec(&i2c_client->dev); + kfree(i2c_get_clientdata(i2c_client)); + return 0; +} + +/* + * cs4270_id - I2C device IDs supported by this driver + */ +static struct i2c_device_id cs4270_id[] = { + {"cs4270", 0}, + {} +}; +MODULE_DEVICE_TABLE(i2c, cs4270_id); + /* * cs4270_i2c_driver - I2C device identification * @@ -903,7 +800,7 @@ static int cs4270_soc_resume(struct platform_device *pdev) */ static struct i2c_driver cs4270_i2c_driver = { .driver = { - .name = "cs4270", + .name = "cs4270-codec", .owner = THIS_MODULE, }, .id_table = cs4270_id, @@ -911,20 +808,6 @@ static struct i2c_driver cs4270_i2c_driver = { .remove = cs4270_i2c_remove, }; -/* - * ASoC codec device structure - * - * Assign this variable to the codec_dev field of the machine driver's - * snd_soc_device structure. - */ -struct snd_soc_codec_device soc_codec_device_cs4270 = { - .probe = cs4270_probe, - .remove = cs4270_remove, - .suspend = cs4270_soc_suspend, - .resume = cs4270_soc_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_device_cs4270); - static int __init cs4270_init(void) { pr_info("Cirrus Logic CS4270 ALSA SoC Codec Driver\n"); diff --git a/sound/soc/codecs/cs4270.h b/sound/soc/codecs/cs4270.h deleted file mode 100644 index adc6cd9667d4..000000000000 --- a/sound/soc/codecs/cs4270.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Cirrus Logic CS4270 ALSA SoC Codec Driver - * - * Author: Timur Tabi - * - * Copyright 2007 Freescale Semiconductor, Inc. This file is licensed under - * the terms of the GNU General Public License version 2. This program - * is licensed "as is" without any warranty of any kind, whether express - * or implied. - */ - -#ifndef _CS4270_H -#define _CS4270_H - -/* - * The ASoC codec DAI structure for the CS4270. Assign this structure to - * the .codec_dai field of your machine driver's snd_soc_dai_link structure. - */ -extern struct snd_soc_dai cs4270_dai; - -/* - * The ASoC codec device structure for the CS4270. Assign this structure - * to the .codec_dev field of your machine driver's snd_soc_device - * structure. - */ -extern struct snd_soc_codec_device soc_codec_device_cs4270; - -#endif diff --git a/sound/soc/codecs/cs42l51.c b/sound/soc/codecs/cs42l51.c index dd9b8550c402..8a25743870c2 100644 --- a/sound/soc/codecs/cs42l51.c +++ b/sound/soc/codecs/cs42l51.c @@ -42,15 +42,14 @@ enum master_slave_mode { }; struct cs42l51_private { + enum snd_soc_control_type control_type; + void *control_data; unsigned int mclk; unsigned int audio_mode; /* The mode (I2S or left-justified) */ enum master_slave_mode func; - struct snd_soc_codec codec; u8 reg_cache[CS42L51_NUMREGS]; }; -static struct snd_soc_codec *cs42l51_codec; - #define CS42L51_FORMATS ( \ SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE | \ SNDRV_PCM_FMTBIT_S18_3LE | SNDRV_PCM_FMTBIT_S18_3BE | \ @@ -75,134 +74,6 @@ static int cs42l51_fill_cache(struct snd_soc_codec *codec) return 0; } -static int cs42l51_i2c_probe(struct i2c_client *i2c_client, - const struct i2c_device_id *id) -{ - struct snd_soc_codec *codec; - struct cs42l51_private *cs42l51; - int ret = 0; - int reg; - - if (cs42l51_codec) - return -EBUSY; - - /* Verify that we have a CS42L51 */ - ret = i2c_smbus_read_byte_data(i2c_client, CS42L51_CHIP_REV_ID); - if (ret < 0) { - dev_err(&i2c_client->dev, "failed to read I2C\n"); - goto error; - } - - if ((ret != CS42L51_MK_CHIP_REV(CS42L51_CHIP_ID, CS42L51_CHIP_REV_A)) && - (ret != CS42L51_MK_CHIP_REV(CS42L51_CHIP_ID, CS42L51_CHIP_REV_B))) { - dev_err(&i2c_client->dev, "Invalid chip id\n"); - ret = -ENODEV; - goto error; - } - - dev_info(&i2c_client->dev, "found device cs42l51 rev %d\n", - ret & 7); - - cs42l51 = kzalloc(sizeof(struct cs42l51_private), GFP_KERNEL); - if (!cs42l51) { - dev_err(&i2c_client->dev, "could not allocate codec\n"); - return -ENOMEM; - } - codec = &cs42l51->codec; - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - codec->dev = &i2c_client->dev; - codec->name = "CS42L51"; - codec->owner = THIS_MODULE; - codec->dai = &cs42l51_dai; - codec->num_dai = 1; - snd_soc_codec_set_drvdata(codec, cs42l51); - - codec->control_data = i2c_client; - codec->reg_cache = cs42l51->reg_cache; - codec->reg_cache_size = CS42L51_NUMREGS; - i2c_set_clientdata(i2c_client, codec); - - ret = cs42l51_fill_cache(codec); - if (ret < 0) { - dev_err(&i2c_client->dev, "failed to fill register cache\n"); - goto error_alloc; - } - - ret = snd_soc_codec_set_cache_io(codec, 8, 8, SND_SOC_I2C); - if (ret < 0) { - dev_err(&i2c_client->dev, "Failed to set cache I/O: %d\n", ret); - goto error_alloc; - } - - /* - * DAC configuration - * - Use signal processor - * - auto mute - * - vol changes immediate - * - no de-emphasize - */ - reg = CS42L51_DAC_CTL_DATA_SEL(1) - | CS42L51_DAC_CTL_AMUTE | CS42L51_DAC_CTL_DACSZ(0); - ret = snd_soc_write(codec, CS42L51_DAC_CTL, reg); - if (ret < 0) - goto error_alloc; - - cs42l51_dai.dev = codec->dev; - cs42l51_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto error_alloc; - } - - ret = snd_soc_register_dai(&cs42l51_dai); - if (ret < 0) { - dev_err(&i2c_client->dev, "failed to register DAIe\n"); - goto error_reg; - } - - return 0; - -error_reg: - snd_soc_unregister_codec(codec); -error_alloc: - kfree(cs42l51); -error: - return ret; -} - -static int cs42l51_i2c_remove(struct i2c_client *client) -{ - struct cs42l51_private *cs42l51 = i2c_get_clientdata(client); - snd_soc_unregister_dai(&cs42l51_dai); - snd_soc_unregister_codec(cs42l51_codec); - cs42l51_codec = NULL; - kfree(cs42l51); - return 0; -} - - -static const struct i2c_device_id cs42l51_id[] = { - {"cs42l51", 0}, - {} -}; -MODULE_DEVICE_TABLE(i2c, cs42l51_id); - -static struct i2c_driver cs42l51_i2c_driver = { - .driver = { - .name = "CS42L51 I2C", - .owner = THIS_MODULE, - }, - .id_table = cs42l51_id, - .probe = cs42l51_i2c_probe, - .remove = cs42l51_i2c_remove, -}; - static int cs42l51_get_chan_mix(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { @@ -484,51 +355,8 @@ static int cs42l51_set_dai_sysclk(struct snd_soc_dai *codec_dai, { struct snd_soc_codec *codec = codec_dai->codec; struct cs42l51_private *cs42l51 = snd_soc_codec_get_drvdata(codec); - struct cs42l51_ratios *ratios = NULL; - int nr_ratios = 0; - unsigned int rates = 0; - unsigned int rate_min = -1; - unsigned int rate_max = 0; - int i; cs42l51->mclk = freq; - - switch (cs42l51->func) { - case MODE_MASTER: - return -EINVAL; - case MODE_SLAVE: - ratios = slave_ratios; - nr_ratios = ARRAY_SIZE(slave_ratios); - break; - case MODE_SLAVE_AUTO: - ratios = slave_auto_ratios; - nr_ratios = ARRAY_SIZE(slave_auto_ratios); - break; - } - - for (i = 0; i < nr_ratios; i++) { - unsigned int rate = freq / ratios[i].ratio; - rates |= snd_pcm_rate_to_rate_bit(rate); - if (rate < rate_min) - rate_min = rate; - if (rate > rate_max) - rate_max = rate; - } - rates &= ~SNDRV_PCM_RATE_KNOT; - - if (!rates) { - dev_err(codec->dev, "could not find a valid sample rate\n"); - return -EINVAL; - } - - codec_dai->playback.rates = rates; - codec_dai->playback.rate_min = rate_min; - codec_dai->playback.rate_max = rate_max; - - codec_dai->capture.rates = rates; - codec_dai->capture.rate_min = rate_min; - codec_dai->capture.rate_max = rate_max; - return 0; } @@ -537,8 +365,7 @@ static int cs42l51_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct cs42l51_private *cs42l51 = snd_soc_codec_get_drvdata(codec); int ret; unsigned int i; @@ -670,8 +497,8 @@ static struct snd_soc_dai_ops cs42l51_dai_ops = { .digital_mute = cs42l51_dai_mute, }; -struct snd_soc_dai cs42l51_dai = { - .name = "CS42L51 HiFi", +static struct snd_soc_dai_driver cs42l51_dai = { + .name = "cs42l51-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -688,30 +515,39 @@ struct snd_soc_dai cs42l51_dai = { }, .ops = &cs42l51_dai_ops, }; -EXPORT_SYMBOL_GPL(cs42l51_dai); - -static int cs42l51_probe(struct platform_device *pdev) +static int cs42l51_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; + struct cs42l51_private *cs42l51 = snd_soc_codec_get_drvdata(codec); + int ret, reg; - if (!cs42l51_codec) { - dev_err(&pdev->dev, "CS42L51 codec not yet registered\n"); - return -EINVAL; - } + codec->control_data = cs42l51->control_data; - socdev->card->codec = cs42l51_codec; - codec = socdev->card->codec; + ret = cs42l51_fill_cache(codec); + if (ret < 0) { + dev_err(codec->dev, "failed to fill register cache\n"); + return ret; + } - /* Register PCMs */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); + ret = snd_soc_codec_set_cache_io(codec, 8, 8, cs42l51->control_type); if (ret < 0) { - dev_err(&pdev->dev, "failed to create PCMs\n"); + dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); return ret; } + /* + * DAC configuration + * - Use signal processor + * - auto mute + * - vol changes immediate + * - no de-emphasize + */ + reg = CS42L51_DAC_CTL_DATA_SEL(1) + | CS42L51_DAC_CTL_AMUTE | CS42L51_DAC_CTL_DACSZ(0); + ret = snd_soc_write(codec, CS42L51_DAC_CTL, reg); + if (ret < 0) + return ret; + snd_soc_add_controls(codec, cs42l51_snd_controls, ARRAY_SIZE(cs42l51_snd_controls)); snd_soc_dapm_new_controls(codec, cs42l51_dapm_widgets, @@ -722,22 +558,77 @@ static int cs42l51_probe(struct platform_device *pdev) return 0; } +static struct snd_soc_codec_driver soc_codec_device_cs42l51 = { + .probe = cs42l51_probe, + .reg_cache_size = CS42L51_NUMREGS, + .reg_word_size = sizeof(u8), +}; -static int cs42l51_remove(struct platform_device *pdev) +static int cs42l51_i2c_probe(struct i2c_client *i2c_client, + const struct i2c_device_id *id) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); + struct cs42l51_private *cs42l51; + int ret; - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); + /* Verify that we have a CS42L51 */ + ret = i2c_smbus_read_byte_data(i2c_client, CS42L51_CHIP_REV_ID); + if (ret < 0) { + dev_err(&i2c_client->dev, "failed to read I2C\n"); + goto error; + } + + if ((ret != CS42L51_MK_CHIP_REV(CS42L51_CHIP_ID, CS42L51_CHIP_REV_A)) && + (ret != CS42L51_MK_CHIP_REV(CS42L51_CHIP_ID, CS42L51_CHIP_REV_B))) { + dev_err(&i2c_client->dev, "Invalid chip id\n"); + ret = -ENODEV; + goto error; + } + + dev_info(&i2c_client->dev, "found device cs42l51 rev %d\n", + ret & 7); + + cs42l51 = kzalloc(sizeof(struct cs42l51_private), GFP_KERNEL); + if (!cs42l51) { + dev_err(&i2c_client->dev, "could not allocate codec\n"); + return -ENOMEM; + } + + i2c_set_clientdata(i2c_client, cs42l51); + cs42l51->control_data = i2c_client; + cs42l51->control_type = SND_SOC_I2C; + ret = snd_soc_register_codec(&i2c_client->dev, + &soc_codec_device_cs42l51, &cs42l51_dai, 1); + if (ret < 0) + kfree(cs42l51); +error: + return ret; +} + +static int cs42l51_i2c_remove(struct i2c_client *client) +{ + struct cs42l51_private *cs42l51 = i2c_get_clientdata(client); + + snd_soc_unregister_codec(&client->dev); + kfree(cs42l51); return 0; } -struct snd_soc_codec_device soc_codec_device_cs42l51 = { - .probe = cs42l51_probe, - .remove = cs42l51_remove +static const struct i2c_device_id cs42l51_id[] = { + {"cs42l51", 0}, + {} +}; +MODULE_DEVICE_TABLE(i2c, cs42l51_id); + +static struct i2c_driver cs42l51_i2c_driver = { + .driver = { + .name = "cs42L51-codec", + .owner = THIS_MODULE, + }, + .id_table = cs42l51_id, + .probe = cs42l51_i2c_probe, + .remove = cs42l51_i2c_remove, }; -EXPORT_SYMBOL_GPL(soc_codec_device_cs42l51); static int __init cs42l51_init(void) { diff --git a/sound/soc/codecs/cs42l51.h b/sound/soc/codecs/cs42l51.h index 8f0bd9786ad2..2beeb171db4b 100644 --- a/sound/soc/codecs/cs42l51.h +++ b/sound/soc/codecs/cs42l51.h @@ -158,6 +158,4 @@ #define CS42L51_LASTREG 0x20 #define CS42L51_NUMREGS (CS42L51_LASTREG - CS42L51_FIRSTREG + 1) -extern struct snd_soc_dai cs42l51_dai; -extern struct snd_soc_codec_device soc_codec_device_cs42l51; #endif diff --git a/sound/soc/codecs/cx20442.c b/sound/soc/codecs/cx20442.c index f07a415c753f..cf4323dbf9c4 100644 --- a/sound/soc/codecs/cx20442.c +++ b/sound/soc/codecs/cx20442.c @@ -24,7 +24,8 @@ struct cx20442_priv { - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; u8 reg_cache[1]; }; @@ -102,7 +103,7 @@ static unsigned int cx20442_read_reg_cache(struct snd_soc_codec *codec, { u8 *reg_cache = codec->reg_cache; - if (reg >= codec->reg_cache_size) + if (reg >= codec->driver->reg_cache_size) return -EINVAL; return reg_cache[reg]; @@ -164,16 +165,17 @@ static int cx20442_pm_to_v253_vsp(u8 value) static int cx20442_write(struct snd_soc_codec *codec, unsigned int reg, unsigned int value) { + struct cx20442_priv *cx20442 = snd_soc_codec_get_drvdata(codec); u8 *reg_cache = codec->reg_cache; int vls, vsp, old, len; char buf[18]; - if (reg >= codec->reg_cache_size) + if (reg >= codec->driver->reg_cache_size) return -EINVAL; /* hw_write and control_data pointers required for talking to the modem * are expected to be set by the line discipline initialization code */ - if (!codec->hw_write || !codec->control_data) + if (!codec->hw_write || !cx20442->control_data) return -EIO; old = reg_cache[reg]; @@ -202,17 +204,13 @@ static int cx20442_write(struct snd_soc_codec *codec, unsigned int reg, return -ENOMEM; dev_dbg(codec->dev, "%s: %s\n", __func__, buf); - if (codec->hw_write(codec->control_data, buf, len) != len) + if (codec->hw_write(cx20442->control_data, buf, len) != len) return -EIO; return 0; } -/* Moved up here as line discipline referres it during initialization */ -static struct snd_soc_codec *cx20442_codec; - - /* * Line discpline related code * @@ -228,15 +226,15 @@ static const char *v253_init = "ate0m0q0+fclass=8\r"; /* Line discipline .open() */ static int v253_open(struct tty_struct *tty) { - struct snd_soc_codec *codec = cx20442_codec; int ret, len = strlen(v253_init); /* Doesn't make sense without write callback */ if (!tty->ops->write) return -EINVAL; - /* Pass the codec structure address for use by other ldisc callbacks */ - tty->disc_data = codec; + /* Won't work if no codec pointer has been passed by a card driver */ + if (!tty->disc_data) + return -ENODEV; if (tty->ops->write(tty, v253_init, len) != len) { ret = -EIO; @@ -253,15 +251,18 @@ err: static void v253_close(struct tty_struct *tty) { struct snd_soc_codec *codec = tty->disc_data; + struct cx20442_priv *cx20442; tty->disc_data = NULL; if (!codec) return; + cx20442 = snd_soc_codec_get_drvdata(codec); + /* Prevent the codec driver from further accessing the modem */ codec->hw_write = NULL; - codec->control_data = NULL; + cx20442->control_data = NULL; codec->pop_time = 0; } @@ -277,15 +278,18 @@ static void v253_receive(struct tty_struct *tty, const unsigned char *cp, char *fp, int count) { struct snd_soc_codec *codec = tty->disc_data; + struct cx20442_priv *cx20442; if (!codec) return; - if (!codec->control_data) { + cx20442 = snd_soc_codec_get_drvdata(codec); + + if (!cx20442->control_data) { /* First modem response, complete setup procedure */ /* Set up codec driver access to modem controls */ - codec->control_data = tty; + cx20442->control_data = tty; codec->hw_write = (hw_write_t)tty->ops->write; codec->pop_time = 1; } @@ -313,8 +317,8 @@ EXPORT_SYMBOL_GPL(v253_ops); * Codec DAI */ -struct snd_soc_dai cx20442_dai = { - .name = "CX20442", +static struct snd_soc_dai_driver cx20442_dai = { + .name = "cx20442-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -330,142 +334,63 @@ struct snd_soc_dai cx20442_dai = { .formats = SNDRV_PCM_FMTBIT_S16_LE, }, }; -EXPORT_SYMBOL_GPL(cx20442_dai); -static int cx20442_codec_probe(struct platform_device *pdev) +static int cx20442_codec_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret; - - if (!cx20442_codec) { - dev_err(&pdev->dev, "cx20442 not yet discovered\n"); - return -ENODEV; - } - codec = cx20442_codec; - - socdev->card->codec = codec; + struct cx20442_priv *cx20442; - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(&pdev->dev, "failed to create pcms\n"); - goto pcm_err; - } + cx20442 = kzalloc(sizeof(struct cx20442_priv), GFP_KERNEL); + if (cx20442 == NULL) + return -ENOMEM; + snd_soc_codec_set_drvdata(codec, cx20442); cx20442_add_widgets(codec); -pcm_err: - return ret; + cx20442->control_data = NULL; + codec->hw_write = NULL; + codec->pop_time = 0; + + return 0; } /* power down chip */ -static int cx20442_codec_remove(struct platform_device *pdev) +static int cx20442_codec_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); + struct cx20442_priv *cx20442 = snd_soc_codec_get_drvdata(codec); - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); + if (cx20442->control_data) { + struct tty_struct *tty = cx20442->control_data; + tty_hangup(tty); + } + kfree(cx20442); return 0; } -struct snd_soc_codec_device cx20442_codec_dev = { +static struct snd_soc_codec_driver cx20442_codec_dev = { .probe = cx20442_codec_probe, .remove = cx20442_codec_remove, + .reg_cache_size = 1, + .reg_word_size = sizeof(u8), + .read = cx20442_read_reg_cache, + .write = cx20442_write, }; -EXPORT_SYMBOL_GPL(cx20442_codec_dev); - -static int cx20442_register(struct cx20442_priv *cx20442) -{ - struct snd_soc_codec *codec = &cx20442->codec; - int ret; - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - codec->name = "CX20442"; - codec->owner = THIS_MODULE; - snd_soc_codec_set_drvdata(codec, cx20442); - - codec->dai = &cx20442_dai; - codec->num_dai = 1; - - codec->reg_cache = &cx20442->reg_cache; - codec->reg_cache_size = ARRAY_SIZE(cx20442->reg_cache); - codec->read = cx20442_read_reg_cache; - codec->write = cx20442_write; - - codec->bias_level = SND_SOC_BIAS_OFF; - - cx20442_dai.dev = codec->dev; - - cx20442_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err; - } - - ret = snd_soc_register_dai(&cx20442_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } - - return 0; - -err_codec: - snd_soc_unregister_codec(codec); -err: - cx20442_codec = NULL; - kfree(cx20442); - return ret; -} - -static void cx20442_unregister(struct cx20442_priv *cx20442) -{ - snd_soc_unregister_dai(&cx20442_dai); - snd_soc_unregister_codec(&cx20442->codec); - - cx20442_codec = NULL; - kfree(cx20442); -} static int cx20442_platform_probe(struct platform_device *pdev) { - struct cx20442_priv *cx20442; - struct snd_soc_codec *codec; - - cx20442 = kzalloc(sizeof(struct cx20442_priv), GFP_KERNEL); - if (cx20442 == NULL) - return -ENOMEM; - - codec = &cx20442->codec; - - codec->control_data = NULL; - codec->hw_write = NULL; - codec->pop_time = 0; - - codec->dev = &pdev->dev; - platform_set_drvdata(pdev, cx20442); - - return cx20442_register(cx20442); + return snd_soc_register_codec(&pdev->dev, + &cx20442_codec_dev, &cx20442_dai, 1); } static int __exit cx20442_platform_remove(struct platform_device *pdev) { - struct cx20442_priv *cx20442 = platform_get_drvdata(pdev); - - cx20442_unregister(cx20442); + snd_soc_unregister_codec(&pdev->dev); return 0; } static struct platform_driver cx20442_platform_driver = { .driver = { - .name = "cx20442", + .name = "cx20442-codec", .owner = THIS_MODULE, }, .probe = cx20442_platform_probe, @@ -487,4 +412,4 @@ module_exit(cx20442_exit); MODULE_DESCRIPTION("ASoC CX20442-11 voice modem codec driver"); MODULE_AUTHOR("Janusz Krzysztofik"); MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:cx20442"); +MODULE_ALIAS("platform:cx20442-codec"); diff --git a/sound/soc/codecs/cx20442.h b/sound/soc/codecs/cx20442.h index 688a5eb62e17..c7a7c79ef0cd 100644 --- a/sound/soc/codecs/cx20442.h +++ b/sound/soc/codecs/cx20442.h @@ -13,8 +13,6 @@ #ifndef _CX20442_CODEC_H #define _CX20442_CODEC_H -extern struct snd_soc_dai cx20442_dai; -extern struct snd_soc_codec_device cx20442_codec_dev; extern struct tty_ldisc_ops v253_ops; #endif diff --git a/sound/soc/codecs/da7210.c b/sound/soc/codecs/da7210.c index 3c51d6a57523..eabf3c062500 100644 --- a/sound/soc/codecs/da7210.c +++ b/sound/soc/codecs/da7210.c @@ -25,8 +25,6 @@ #include #include -#include "da7210.h" - /* DA7210 register space */ #define DA7210_STATUS 0x02 #define DA7210_STARTUP1 0x03 @@ -162,11 +160,10 @@ static const struct snd_kcontrol_new da7210_snd_controls[] = { /* Codec private data */ struct da7210_priv { - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; }; -static struct snd_soc_codec *da7210_codec; - /* * Register cache */ @@ -209,12 +206,12 @@ static int da7210_write(struct snd_soc_codec *codec, u32 reg, u32 value) u8 *cache = codec->reg_cache; u8 data[2]; - BUG_ON(codec->volatile_register); + BUG_ON(codec->driver->volatile_register); data[0] = reg & 0xff; data[1] = value & 0xff; - if (reg >= codec->reg_cache_size) + if (reg >= codec->driver->reg_cache_size) return -EIO; if (2 != codec->hw_write(codec->control_data, data, 2)) @@ -267,8 +264,7 @@ static int da7210_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; u32 dai_cfg1; u32 hpf_reg, hpf_mask, hpf_value; u32 fs, bypass; @@ -430,9 +426,8 @@ static struct snd_soc_dai_ops da7210_dai_ops = { .set_fmt = da7210_set_dai_fmt, }; -struct snd_soc_dai da7210_dai = { - .name = "DA7210 IIS", - .id = 0, +static struct snd_soc_dai_driver da7210_dai = { + .name = "da7210-hifi", /* playback capabilities */ .playback = { .stream_name = "Playback", @@ -452,55 +447,15 @@ struct snd_soc_dai da7210_dai = { .ops = &da7210_dai_ops, .symmetric_rates = 1, }; -EXPORT_SYMBOL_GPL(da7210_dai); -/* - * Initialize the DA7210 driver - * register the mixer and dsp interfaces with the kernel - */ -static int da7210_init(struct da7210_priv *da7210) +static int da7210_probe(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = &da7210->codec; - int ret = 0; + struct da7210_priv *da7210 = snd_soc_codec_get_drvdata(codec); - if (da7210_codec) { - dev_err(codec->dev, "Another da7210 is registered\n"); - return -EINVAL; - } + dev_info(codec->dev, "DA7210 Audio Codec %s\n", DA7210_VERSION); - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, da7210); - codec->name = "DA7210"; - codec->owner = THIS_MODULE; - codec->read = da7210_read; - codec->write = da7210_write; - codec->dai = &da7210_dai; - codec->num_dai = 1; + codec->control_data = da7210->control_data; codec->hw_write = (hw_write_t)i2c_master_send; - codec->reg_cache_size = ARRAY_SIZE(da7210_reg); - codec->reg_cache = kmemdup(da7210_reg, - sizeof(da7210_reg), GFP_KERNEL); - - if (!codec->reg_cache) - return -ENOMEM; - - da7210_dai.dev = codec->dev; - da7210_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret) { - dev_err(codec->dev, "Failed to register CODEC: %d\n", ret); - goto init_err; - } - - ret = snd_soc_register_dai(&da7210_dai); - if (ret) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - goto codec_err; - } /* FIXME * @@ -583,54 +538,50 @@ static int da7210_init(struct da7210_priv *da7210) /* Activate all enabled subsystem */ da7210_write(codec, DA7210_STARTUP1, DA7210_SC_MST_EN); - return ret; - -codec_err: - snd_soc_unregister_codec(codec); -init_err: - kfree(codec->reg_cache); - codec->reg_cache = NULL; + snd_soc_add_controls(codec, da7210_snd_controls, + ARRAY_SIZE(da7210_snd_controls)); - return ret; + dev_info(codec->dev, "DA7210 Audio Codec %s\n", DA7210_VERSION); + return 0; } +static struct snd_soc_codec_driver soc_codec_dev_da7210 = { + .probe = da7210_probe, + .read = da7210_read, + .write = da7210_write, + .reg_cache_size = ARRAY_SIZE(da7210_reg), + .reg_word_size = sizeof(u8), + .reg_cache_default = da7210_reg, +}; + #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) static int __devinit da7210_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct da7210_priv *da7210; - struct snd_soc_codec *codec; int ret; da7210 = kzalloc(sizeof(struct da7210_priv), GFP_KERNEL); if (!da7210) return -ENOMEM; - codec = &da7210->codec; - codec->dev = &i2c->dev; - i2c_set_clientdata(i2c, da7210); - codec->control_data = i2c; + da7210->control_data = i2c; + da7210->control_type = SND_SOC_I2C; - ret = da7210_init(da7210); - if (ret < 0) { - pr_err("Failed to initialise da7210 audio codec\n"); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_da7210, &da7210_dai, 1); + if (ret < 0) kfree(da7210); - } return ret; } static int __devexit da7210_i2c_remove(struct i2c_client *client) { - struct da7210_priv *da7210 = i2c_get_clientdata(client); - - snd_soc_unregister_dai(&da7210_dai); - kfree(da7210->codec.reg_cache); - kfree(da7210); - da7210_codec = NULL; - + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -643,7 +594,7 @@ MODULE_DEVICE_TABLE(i2c, da7210_i2c_id); /* I2C codec control layer */ static struct i2c_driver da7210_i2c_driver = { .driver = { - .name = "DA7210 I2C Codec", + .name = "da7210-codec", .owner = THIS_MODULE, }, .probe = da7210_i2c_probe, @@ -652,50 +603,6 @@ static struct i2c_driver da7210_i2c_driver = { }; #endif -static int da7210_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret; - - if (!da7210_codec) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = da7210_codec; - codec = da7210_codec; - - /* Register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) - goto pcm_err; - - snd_soc_add_controls(da7210_codec, da7210_snd_controls, - ARRAY_SIZE(da7210_snd_controls)); - - dev_info(&pdev->dev, "DA7210 Audio Codec %s\n", DA7210_VERSION); - -pcm_err: - return ret; -} - -static int da7210_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_da7210 = { - .probe = da7210_probe, - .remove = da7210_remove, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_da7210); - static int __init da7210_modinit(void) { int ret = 0; diff --git a/sound/soc/codecs/da7210.h b/sound/soc/codecs/da7210.h deleted file mode 100644 index 390d621eb742..000000000000 --- a/sound/soc/codecs/da7210.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * da7210.h -- audio driver for da7210 - * - * Copyright (c) 2009 Dialog Semiconductor - * Written by David Chen - * - * Copyright (C) 2009 Renesas Solutions Corp. - * Cleanups by Kuninori Morimoto - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - */ - -#ifndef _DA7210_H -#define _DA7210_H - -extern struct snd_soc_dai da7210_dai; -extern struct snd_soc_codec_device soc_codec_dev_da7210; - -#endif - diff --git a/sound/soc/codecs/jz4740.c b/sound/soc/codecs/jz4740.c index 66557de1e4fe..16253ec9b022 100644 --- a/sound/soc/codecs/jz4740.c +++ b/sound/soc/codecs/jz4740.c @@ -74,29 +74,22 @@ static const uint32_t jz4740_codec_regs[] = { struct jz4740_codec { void __iomem *base; struct resource *mem; - - uint32_t reg_cache[2]; - struct snd_soc_codec codec; }; -static inline struct jz4740_codec *codec_to_jz4740(struct snd_soc_codec *codec) -{ - return container_of(codec, struct jz4740_codec, codec); -} - static unsigned int jz4740_codec_read(struct snd_soc_codec *codec, unsigned int reg) { - struct jz4740_codec *jz4740_codec = codec_to_jz4740(codec); + struct jz4740_codec *jz4740_codec = snd_soc_codec_get_drvdata(codec); return readl(jz4740_codec->base + (reg << 2)); } static int jz4740_codec_write(struct snd_soc_codec *codec, unsigned int reg, unsigned int val) { - struct jz4740_codec *jz4740_codec = codec_to_jz4740(codec); + struct jz4740_codec *jz4740_codec = snd_soc_codec_get_drvdata(codec); + u32 *cache = codec->reg_cache; - jz4740_codec->reg_cache[reg] = val; + cache[reg] = val; writel(val, jz4740_codec->base + (reg << 2)); return 0; @@ -172,8 +165,7 @@ static int jz4740_codec_hw_params(struct snd_pcm_substream *substream, { uint32_t val; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec =rtd->codec; switch (params_rate(params)) { case 8000: @@ -219,8 +211,8 @@ static struct snd_soc_dai_ops jz4740_codec_dai_ops = { .hw_params = jz4740_codec_hw_params, }; -struct snd_soc_dai jz4740_codec_dai = { - .name = "jz4740", +static struct snd_soc_dai_driver jz4740_codec_dai = { + .name = "jz4740-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, @@ -238,7 +230,6 @@ struct snd_soc_dai jz4740_codec_dai = { .ops = &jz4740_codec_dai_ops, .symmetric_rates = 1, }; -EXPORT_SYMBOL_GPL(jz4740_codec_dai); static void jz4740_codec_wakeup(struct snd_soc_codec *codec) { @@ -302,23 +293,10 @@ static int jz4740_codec_set_bias_level(struct snd_soc_codec *codec, return 0; } -static struct snd_soc_codec *jz4740_codec_codec; - -static int jz4740_codec_dev_probe(struct platform_device *pdev) +static int jz4740_codec_dev_probe(struct snd_soc_codec *codec) { - int ret; - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = jz4740_codec_codec; - - BUG_ON(!codec); - - socdev->card->codec = codec; - - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret) { - dev_err(&pdev->dev, "Failed to create pcms: %d\n", ret); - return ret; - } + snd_soc_update_bits(codec, JZ4740_REG_CODEC_1, + JZ4740_CODEC_1_SW2_ENABLE, JZ4740_CODEC_1_SW2_ENABLE); snd_soc_add_controls(codec, jz4740_codec_controls, ARRAY_SIZE(jz4740_codec_controls)); @@ -331,34 +309,27 @@ static int jz4740_codec_dev_probe(struct platform_device *pdev) snd_soc_dapm_new_widgets(codec); + jz4740_codec_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + return 0; } -static int jz4740_codec_dev_remove(struct platform_device *pdev) +static int jz4740_codec_dev_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); + jz4740_codec_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } #ifdef CONFIG_PM_SLEEP -static int jz4740_codec_suspend(struct platform_device *pdev, pm_message_t state) +static int jz4740_codec_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - return jz4740_codec_set_bias_level(codec, SND_SOC_BIAS_OFF); } -static int jz4740_codec_resume(struct platform_device *pdev) +static int jz4740_codec_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - return jz4740_codec_set_bias_level(codec, SND_SOC_BIAS_STANDBY); } @@ -367,19 +338,23 @@ static int jz4740_codec_resume(struct platform_device *pdev) #define jz4740_codec_resume NULL #endif -struct snd_soc_codec_device soc_codec_dev_jz4740_codec = { +static struct snd_soc_codec_driver soc_codec_dev_jz4740_codec = { .probe = jz4740_codec_dev_probe, .remove = jz4740_codec_dev_remove, .suspend = jz4740_codec_suspend, .resume = jz4740_codec_resume, + .read = jz4740_codec_read, + .write = jz4740_codec_write, + .set_bias_level = jz4740_codec_set_bias_level, + .reg_cache_default = jz4740_codec_regs, + .reg_word_size = sizeof(u32), + .reg_cache_size = 2, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_jz4740_codec); static int __devinit jz4740_codec_probe(struct platform_device *pdev) { int ret; struct jz4740_codec *jz4740_codec; - struct snd_soc_codec *codec; struct resource *mem; jz4740_codec = kzalloc(sizeof(*jz4740_codec), GFP_KERNEL); @@ -408,55 +383,17 @@ static int __devinit jz4740_codec_probe(struct platform_device *pdev) } jz4740_codec->mem = mem; - jz4740_codec_dai.dev = &pdev->dev; - - codec = &jz4740_codec->codec; - - codec->dev = &pdev->dev; - codec->name = "jz4740"; - codec->owner = THIS_MODULE; - - codec->read = jz4740_codec_read; - codec->write = jz4740_codec_write; - codec->set_bias_level = jz4740_codec_set_bias_level; - codec->bias_level = SND_SOC_BIAS_OFF; - - codec->dai = &jz4740_codec_dai; - codec->num_dai = 1; - - codec->reg_cache = jz4740_codec->reg_cache; - codec->reg_cache_size = 2; - memcpy(codec->reg_cache, jz4740_codec_regs, sizeof(jz4740_codec_regs)); - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - jz4740_codec_codec = codec; - - snd_soc_update_bits(codec, JZ4740_REG_CODEC_1, - JZ4740_CODEC_1_SW2_ENABLE, JZ4740_CODEC_1_SW2_ENABLE); - platform_set_drvdata(pdev, jz4740_codec); - ret = snd_soc_register_codec(codec); + ret = snd_soc_register_codec(&pdev->dev, + &soc_codec_dev_jz4740_codec, &jz4740_codec_dai, 1); if (ret) { dev_err(&pdev->dev, "Failed to register codec\n"); goto err_iounmap; } - ret = snd_soc_register_dai(&jz4740_codec_dai); - if (ret) { - dev_err(&pdev->dev, "Failed to register codec dai\n"); - goto err_unregister_codec; - } - - jz4740_codec_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - return 0; -err_unregister_codec: - snd_soc_unregister_codec(codec); err_iounmap: iounmap(jz4740_codec->base); err_release_mem_region: @@ -472,8 +409,7 @@ static int __devexit jz4740_codec_remove(struct platform_device *pdev) struct jz4740_codec *jz4740_codec = platform_get_drvdata(pdev); struct resource *mem = jz4740_codec->mem; - snd_soc_unregister_dai(&jz4740_codec_dai); - snd_soc_unregister_codec(&jz4740_codec->codec); + snd_soc_unregister_codec(&pdev->dev); iounmap(jz4740_codec->base); release_mem_region(mem->start, resource_size(mem)); diff --git a/sound/soc/codecs/jz4740.h b/sound/soc/codecs/jz4740.h deleted file mode 100644 index b5a0691be763..000000000000 --- a/sound/soc/codecs/jz4740.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (C) 2009, Lars-Peter Clausen - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#ifndef __SND_SOC_CODECS_JZ4740_CODEC_H__ -#define __SND_SOC_CODECS_JZ4740_CODEC_H__ - -extern struct snd_soc_dai jz4740_codec_dai; -extern struct snd_soc_codec_device soc_codec_dev_jz4740_codec; - -#endif diff --git a/sound/soc/codecs/pcm3008.c b/sound/soc/codecs/pcm3008.c index 5a5f187a2657..bd8f26e41602 100644 --- a/sound/soc/codecs/pcm3008.c +++ b/sound/soc/codecs/pcm3008.c @@ -32,8 +32,8 @@ #define PCM3008_RATES (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ SNDRV_PCM_RATE_48000) -struct snd_soc_dai pcm3008_dai = { - .name = "PCM3008 HiFi", +static struct snd_soc_dai_driver pcm3008_dai = { + .name = "pcm3008-hifi", .playback = { .stream_name = "PCM3008 Playback", .channels_min = 1, @@ -49,7 +49,6 @@ struct snd_soc_dai pcm3008_dai = { .formats = SNDRV_PCM_FMTBIT_S16_LE, }, }; -EXPORT_SYMBOL_GPL(pcm3008_dai); static void pcm3008_gpio_free(struct pcm3008_setup_data *setup) { @@ -59,38 +58,13 @@ static void pcm3008_gpio_free(struct pcm3008_setup_data *setup) gpio_free(setup->pdda_pin); } -static int pcm3008_soc_probe(struct platform_device *pdev) +static int pcm3008_soc_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - struct pcm3008_setup_data *setup = socdev->codec_data; + struct pcm3008_setup_data *setup = codec->dev->platform_data; int ret = 0; printk(KERN_INFO "PCM3008 SoC Audio Codec %s\n", PCM3008_VERSION); - socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (!socdev->card->codec) - return -ENOMEM; - - codec = socdev->card->codec; - mutex_init(&codec->mutex); - - codec->name = "PCM3008"; - codec->owner = THIS_MODULE; - codec->dai = &pcm3008_dai; - codec->num_dai = 1; - codec->write = NULL; - codec->read = NULL; - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - /* Register PCMs. */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - printk(KERN_ERR "pcm3008: failed to create pcms\n"); - goto pcm_err; - } - /* DEM1 DEM0 DE-EMPHASIS_MODE * Low Low De-emphasis 44.1 kHz ON * Low High De-emphasis OFF @@ -130,33 +104,22 @@ static int pcm3008_soc_probe(struct platform_device *pdev) gpio_err: pcm3008_gpio_free(setup); -pcm_err: - kfree(socdev->card->codec); return ret; } -static int pcm3008_soc_remove(struct platform_device *pdev) +static int pcm3008_soc_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - struct pcm3008_setup_data *setup = socdev->codec_data; - - if (!codec) - return 0; + struct pcm3008_setup_data *setup = codec->dev->platform_data; pcm3008_gpio_free(setup); - snd_soc_free_pcms(socdev); - kfree(socdev->card->codec); - return 0; } #ifdef CONFIG_PM -static int pcm3008_soc_suspend(struct platform_device *pdev, pm_message_t msg) +static int pcm3008_soc_suspend(struct snd_soc_codec *codec, pm_message_t msg) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct pcm3008_setup_data *setup = socdev->codec_data; + struct pcm3008_setup_data *setup = codec->dev->platform_data; gpio_set_value(setup->pdad_pin, 0); gpio_set_value(setup->pdda_pin, 0); @@ -164,10 +127,9 @@ static int pcm3008_soc_suspend(struct platform_device *pdev, pm_message_t msg) return 0; } -static int pcm3008_soc_resume(struct platform_device *pdev) +static int pcm3008_soc_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct pcm3008_setup_data *setup = socdev->codec_data; + struct pcm3008_setup_data *setup = codec->dev->platform_data; gpio_set_value(setup->pdad_pin, 1); gpio_set_value(setup->pdda_pin, 1); @@ -179,23 +141,45 @@ static int pcm3008_soc_resume(struct platform_device *pdev) #define pcm3008_soc_resume NULL #endif -struct snd_soc_codec_device soc_codec_dev_pcm3008 = { +static struct snd_soc_codec_driver soc_codec_dev_pcm3008 = { .probe = pcm3008_soc_probe, .remove = pcm3008_soc_remove, .suspend = pcm3008_soc_suspend, .resume = pcm3008_soc_resume, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_pcm3008); -static int __init pcm3008_init(void) +static int __devinit pcm3008_codec_probe(struct platform_device *pdev) +{ + return snd_soc_register_codec(&pdev->dev, + &soc_codec_dev_pcm3008, &pcm3008_dai, 1); +} + +static int __devexit pcm3008_codec_remove(struct platform_device *pdev) +{ + snd_soc_unregister_codec(&pdev->dev); + return 0; +} + +MODULE_ALIAS("platform:pcm3008-codec"); + +static struct platform_driver pcm3008_codec_driver = { + .probe = pcm3008_codec_probe, + .remove = __devexit_p(pcm3008_codec_remove), + .driver = { + .name = "pcm3008-codec", + .owner = THIS_MODULE, + }, +}; + +static int __init pcm3008_modinit(void) { - return snd_soc_register_dai(&pcm3008_dai); + return platform_driver_register(&pcm3008_codec_driver); } -module_init(pcm3008_init); +module_init(pcm3008_modinit); static void __exit pcm3008_exit(void) { - snd_soc_unregister_dai(&pcm3008_dai); + platform_driver_unregister(&pcm3008_codec_driver); } module_exit(pcm3008_exit); diff --git a/sound/soc/codecs/pcm3008.h b/sound/soc/codecs/pcm3008.h index d04e87d3c060..7e5489ab4812 100644 --- a/sound/soc/codecs/pcm3008.h +++ b/sound/soc/codecs/pcm3008.h @@ -19,7 +19,4 @@ struct pcm3008_setup_data { unsigned pdda_pin; }; -extern struct snd_soc_codec_device soc_codec_dev_pcm3008; -extern struct snd_soc_dai pcm3008_dai; - #endif diff --git a/sound/soc/codecs/spdif_transciever.c b/sound/soc/codecs/spdif_transciever.c index 9119836051a4..4c32b54913ad 100644 --- a/sound/soc/codecs/spdif_transciever.c +++ b/sound/soc/codecs/spdif_transciever.c @@ -21,57 +21,16 @@ #include #include -#include "spdif_transciever.h" - MODULE_LICENSE("GPL"); #define STUB_RATES SNDRV_PCM_RATE_8000_96000 #define STUB_FORMATS SNDRV_PCM_FMTBIT_S16_LE -static struct snd_soc_codec *spdif_dit_codec; - -static int spdif_dit_codec_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret; - - if (spdif_dit_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = spdif_dit_codec; - codec = spdif_dit_codec; - - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto err_create_pcms; - } - - return 0; - -err_create_pcms: - return ret; -} - -static int spdif_dit_codec_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - - return 0; -} -struct snd_soc_codec_device soc_codec_dev_spdif_dit = { - .probe = spdif_dit_codec_probe, - .remove = spdif_dit_codec_remove, -}; EXPORT_SYMBOL_GPL(soc_codec_dev_spdif_dit); +static struct snd_soc_codec_driver soc_codec_spdif_dit; -struct snd_soc_dai dit_stub_dai = { - .name = "DIT", +static struct snd_soc_dai_driver dit_stub_dai = { + .name = "dit-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -80,65 +39,16 @@ struct snd_soc_dai dit_stub_dai = { .formats = STUB_FORMATS, }, }; -EXPORT_SYMBOL_GPL(dit_stub_dai); static int spdif_dit_probe(struct platform_device *pdev) { - struct snd_soc_codec *codec; - int ret; - - if (spdif_dit_codec) { - dev_err(&pdev->dev, "Another Codec is registered\n"); - ret = -EINVAL; - goto err_reg_codec; - } - - codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (codec == NULL) - return -ENOMEM; - - codec->dev = &pdev->dev; - - mutex_init(&codec->mutex); - - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - codec->name = "spdif-dit"; - codec->owner = THIS_MODULE; - codec->dai = &dit_stub_dai; - codec->num_dai = 1; - - spdif_dit_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret < 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err_reg_codec; - } - - dit_stub_dai.dev = &pdev->dev; - ret = snd_soc_register_dai(&dit_stub_dai); - if (ret < 0) { - dev_err(codec->dev, "Failed to register dai: %d\n", ret); - goto err_reg_dai; - } - - return 0; - -err_reg_dai: - snd_soc_unregister_codec(codec); -err_reg_codec: - kfree(spdif_dit_codec); - return ret; + return snd_soc_register_codec(&pdev->dev, &soc_codec_spdif_dit, + &dit_stub_dai, 1); } static int spdif_dit_remove(struct platform_device *pdev) { - snd_soc_unregister_dai(&dit_stub_dai); - snd_soc_unregister_codec(spdif_dit_codec); - kfree(spdif_dit_codec); - spdif_dit_codec = NULL; + snd_soc_unregister_codec(&pdev->dev); return 0; } diff --git a/sound/soc/codecs/spdif_transciever.h b/sound/soc/codecs/spdif_transciever.h deleted file mode 100644 index 1e102124f546..000000000000 --- a/sound/soc/codecs/spdif_transciever.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ALSA SoC DIT/DIR driver header - * - * Author: Steve Chen, - * Copyright: (C) 2008 MontaVista Software, Inc., - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef CODEC_STUBS_H -#define CODEC_STUBS_H - -extern struct snd_soc_codec_device soc_codec_dev_spdif_dit; -extern struct snd_soc_dai dit_stub_dai; - -#endif /* CODEC_STUBS_H */ diff --git a/sound/soc/codecs/ssm2602.c b/sound/soc/codecs/ssm2602.c index b47ed4f6ab20..67d8c044ca04 100644 --- a/sound/soc/codecs/ssm2602.c +++ b/sound/soc/codecs/ssm2602.c @@ -45,11 +45,11 @@ #define SSM2602_VERSION "0.1" -struct snd_soc_codec_device soc_codec_dev_ssm2602; - /* codec private data */ struct ssm2602_priv { unsigned int sysclk; + enum snd_soc_control_type control_type; + void *control_data; struct snd_pcm_substream *master_substream; struct snd_pcm_substream *slave_substream; }; @@ -276,8 +276,7 @@ static int ssm2602_hw_params(struct snd_pcm_substream *substream, { u16 srate; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec); struct i2c_client *i2c = codec->control_data; u16 iface = ssm2602_read_reg_cache(codec, SSM2602_IFACE) & 0xfff3; @@ -321,8 +320,7 @@ static int ssm2602_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec); struct i2c_client *i2c = codec->control_data; struct snd_pcm_runtime *master_runtime; @@ -360,8 +358,7 @@ static int ssm2602_pcm_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; /* set active */ ssm2602_write(codec, SSM2602_ACTIVE, ACTIVE_ACTIVATE_CODEC); @@ -372,8 +369,7 @@ static void ssm2602_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec); /* deactivate */ @@ -518,8 +514,8 @@ static struct snd_soc_dai_ops ssm2602_dai_ops = { .set_fmt = ssm2602_set_dai_fmt, }; -struct snd_soc_dai ssm2602_dai = { - .name = "SSM2602", +static struct snd_soc_dai_driver ssm2602_dai = { + .name = "ssm2602-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, @@ -534,21 +530,15 @@ struct snd_soc_dai ssm2602_dai = { .formats = SSM2602_FORMATS,}, .ops = &ssm2602_dai_ops, }; -EXPORT_SYMBOL_GPL(ssm2602_dai); -static int ssm2602_suspend(struct platform_device *pdev, pm_message_t state) +static int ssm2602_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - ssm2602_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int ssm2602_resume(struct platform_device *pdev) +static int ssm2602_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; int i; u8 data[2]; u16 *cache = codec->reg_cache; @@ -563,36 +553,18 @@ static int ssm2602_resume(struct platform_device *pdev) return 0; } -/* - * initialise the ssm2602 driver - * register the mixer and dsp interfaces with the kernel - */ -static int ssm2602_init(struct snd_soc_device *socdev) +static int ssm2602_probe(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = socdev->card->codec; - int reg, ret = 0; - - codec->name = "SSM2602"; - codec->owner = THIS_MODULE; - codec->read = ssm2602_read_reg_cache; - codec->write = ssm2602_write; - codec->set_bias_level = ssm2602_set_bias_level; - codec->dai = &ssm2602_dai; - codec->num_dai = 1; - codec->reg_cache_size = sizeof(ssm2602_reg); - codec->reg_cache = kmemdup(ssm2602_reg, sizeof(ssm2602_reg), - GFP_KERNEL); - if (codec->reg_cache == NULL) - return -ENOMEM; + struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec); + int ret = 0, reg; + + pr_info("ssm2602 Audio Codec %s", SSM2602_VERSION); + + codec->bias_level = SND_SOC_BIAS_OFF, + codec->control_data = ssm2602->control_data; ssm2602_reset(codec); - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - pr_err("ssm2602: failed to create pcms\n"); - goto pcm_err; - } /*power on device*/ ssm2602_write(codec, SSM2602_ACTIVE, 0); /* set the update bits */ @@ -614,13 +586,27 @@ static int ssm2602_init(struct snd_soc_device *socdev) ssm2602_add_widgets(codec); return ret; +} -pcm_err: - kfree(codec->reg_cache); - return ret; +/* remove everything here */ +static int ssm2602_remove(struct snd_soc_codec *codec) +{ + ssm2602_set_bias_level(codec, SND_SOC_BIAS_OFF); + return 0; } -static struct snd_soc_device *ssm2602_socdev; +static struct snd_soc_codec_driver soc_codec_dev_ssm2602 = { + .probe = ssm2602_probe, + .remove = ssm2602_remove, + .suspend = ssm2602_suspend, + .resume = ssm2602_resume, + .read = ssm2602_read_reg_cache, + .write = ssm2602_write, + .set_bias_level = ssm2602_set_bias_level, + .reg_cache_size = sizeof(ssm2602_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = ssm2602_reg, +}; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) /* @@ -632,24 +618,28 @@ static struct snd_soc_device *ssm2602_socdev; static int ssm2602_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { - struct snd_soc_device *socdev = ssm2602_socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct ssm2602_priv *ssm2602; int ret; - i2c_set_clientdata(i2c, codec); - codec->control_data = i2c; + ssm2602 = kzalloc(sizeof(struct ssm2602_priv), GFP_KERNEL); + if (ssm2602 == NULL) + return -ENOMEM; - ret = ssm2602_init(socdev); - if (ret < 0) - pr_err("failed to initialise SSM2602\n"); + i2c_set_clientdata(i2c, ssm2602); + ssm2602->control_data = i2c; + ssm2602->control_type = SND_SOC_I2C; + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_ssm2602, &ssm2602_dai, 1); + if (ret < 0) + kfree(ssm2602); return ret; } static int ssm2602_i2c_remove(struct i2c_client *client) { - struct snd_soc_codec *codec = i2c_get_clientdata(client); - kfree(codec->reg_cache); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -658,130 +648,39 @@ static const struct i2c_device_id ssm2602_i2c_id[] = { { } }; MODULE_DEVICE_TABLE(i2c, ssm2602_i2c_id); + /* corgi i2c codec control layer */ static struct i2c_driver ssm2602_i2c_driver = { .driver = { - .name = "SSM2602 I2C Codec", + .name = "ssm2602-codec", .owner = THIS_MODULE, }, .probe = ssm2602_i2c_probe, .remove = ssm2602_i2c_remove, .id_table = ssm2602_i2c_id, }; - -static int ssm2602_add_i2c_device(struct platform_device *pdev, - const struct ssm2602_setup_data *setup) -{ - struct i2c_board_info info; - struct i2c_adapter *adapter; - struct i2c_client *client; - int ret; - - ret = i2c_add_driver(&ssm2602_i2c_driver); - if (ret != 0) { - dev_err(&pdev->dev, "can't add i2c driver\n"); - return ret; - } - memset(&info, 0, sizeof(struct i2c_board_info)); - info.addr = setup->i2c_address; - strlcpy(info.type, "ssm2602", I2C_NAME_SIZE); - adapter = i2c_get_adapter(setup->i2c_bus); - if (!adapter) { - dev_err(&pdev->dev, "can't get i2c adapter %d\n", - setup->i2c_bus); - goto err_driver; - } - client = i2c_new_device(adapter, &info); - i2c_put_adapter(adapter); - if (!client) { - dev_err(&pdev->dev, "can't add i2c device at 0x%x\n", - (unsigned int)info.addr); - goto err_driver; - } - return 0; -err_driver: - i2c_del_driver(&ssm2602_i2c_driver); - return -ENODEV; -} #endif -static int ssm2602_probe(struct platform_device *pdev) + +static int __init ssm2602_modinit(void) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct ssm2602_setup_data *setup; - struct snd_soc_codec *codec; - struct ssm2602_priv *ssm2602; int ret = 0; - - pr_info("ssm2602 Audio Codec %s", SSM2602_VERSION); - - setup = socdev->codec_data; - codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (codec == NULL) - return -ENOMEM; - - ssm2602 = kzalloc(sizeof(struct ssm2602_priv), GFP_KERNEL); - if (ssm2602 == NULL) { - kfree(codec); - return -ENOMEM; - } - - snd_soc_codec_set_drvdata(codec, ssm2602); - socdev->card->codec = codec; - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - ssm2602_socdev = socdev; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - if (setup->i2c_address) { - codec->hw_write = (hw_write_t)i2c_master_send; - ret = ssm2602_add_i2c_device(pdev, setup); + ret = i2c_add_driver(&ssm2602_i2c_driver); + if (ret != 0) { + printk(KERN_ERR "Failed to register SSM2602 I2C driver: %d\n", + ret); } -#else - /* other interfaces */ #endif return ret; } +module_init(ssm2602_modinit); -/* remove everything here */ -static int ssm2602_remove(struct platform_device *pdev) +static void __exit ssm2602_exit(void) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - if (codec->control_data) - ssm2602_set_bias_level(codec, SND_SOC_BIAS_OFF); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - i2c_unregister_device(codec->control_data); i2c_del_driver(&ssm2602_i2c_driver); #endif - kfree(snd_soc_codec_get_drvdata(codec)); - kfree(codec); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_ssm2602 = { - .probe = ssm2602_probe, - .remove = ssm2602_remove, - .suspend = ssm2602_suspend, - .resume = ssm2602_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_ssm2602); - -static int __init ssm2602_modinit(void) -{ - return snd_soc_register_dai(&ssm2602_dai); -} -module_init(ssm2602_modinit); - -static void __exit ssm2602_exit(void) -{ - snd_soc_unregister_dai(&ssm2602_dai); } module_exit(ssm2602_exit); diff --git a/sound/soc/codecs/ssm2602.h b/sound/soc/codecs/ssm2602.h index f344e6d76e31..42a47d0f8e25 100644 --- a/sound/soc/codecs/ssm2602.h +++ b/sound/soc/codecs/ssm2602.h @@ -124,7 +124,4 @@ struct ssm2602_setup_data { unsigned short i2c_address; }; -extern struct snd_soc_dai ssm2602_dai; -extern struct snd_soc_codec_device soc_codec_dev_ssm2602; - #endif diff --git a/sound/soc/codecs/stac9766.c b/sound/soc/codecs/stac9766.c index ee86568545c2..00d67cc8e206 100644 --- a/sound/soc/codecs/stac9766.c +++ b/sound/soc/codecs/stac9766.c @@ -25,7 +25,6 @@ #include #include #include -#include #include "stac9766.h" @@ -257,20 +256,15 @@ static int stac9766_reset(struct snd_soc_codec *codec, int try_warm) return 0; } -static int stac9766_codec_suspend(struct platform_device *pdev, +static int stac9766_codec_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - stac9766_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int stac9766_codec_resume(struct platform_device *pdev) +static int stac9766_codec_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; u16 id, reset; reset = 0; @@ -300,10 +294,9 @@ static struct snd_soc_dai_ops stac9766_dai_ops_digital = { .prepare = ac97_digital_prepare, }; -struct snd_soc_dai stac9766_dai[] = { +static struct snd_soc_dai_driver stac9766_dai[] = { { - .name = "stac9766 analog", - .id = 0, + .name = "stac9766-hifi-analog", .ac97_control = 1, /* stream cababilities */ @@ -325,8 +318,7 @@ struct snd_soc_dai stac9766_dai[] = { .ops = &stac9766_dai_ops_analog, }, { - .name = "stac9766 IEC958", - .id = 1, + .name = "stac9766-hifi-IEC958", .ac97_control = 1, /* stream cababilities */ @@ -342,57 +334,24 @@ struct snd_soc_dai stac9766_dai[] = { .ops = &stac9766_dai_ops_digital, } }; -EXPORT_SYMBOL_GPL(stac9766_dai); -static int stac9766_codec_probe(struct platform_device *pdev) +static int stac9766_codec_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; int ret = 0; printk(KERN_INFO "STAC9766 SoC Audio Codec %s\n", STAC9766_VERSION); - socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (socdev->card->codec == NULL) - return -ENOMEM; - codec = socdev->card->codec; - mutex_init(&codec->mutex); - - codec->reg_cache = kmemdup(stac9766_reg, sizeof(stac9766_reg), - GFP_KERNEL); - if (codec->reg_cache == NULL) { - ret = -ENOMEM; - goto cache_err; - } - codec->reg_cache_size = sizeof(stac9766_reg); - codec->reg_cache_step = 2; - - codec->name = "STAC9766"; - codec->owner = THIS_MODULE; - codec->dai = stac9766_dai; - codec->num_dai = ARRAY_SIZE(stac9766_dai); - codec->write = stac9766_ac97_write; - codec->read = stac9766_ac97_read; - codec->set_bias_level = stac9766_set_bias_level; - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); if (ret < 0) goto codec_err; - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) - goto pcm_err; - /* do a cold reset for the controller and then try * a warm reset followed by an optional cold reset for codec */ stac9766_reset(codec, 0); ret = stac9766_reset(codec, 1); if (ret < 0) { printk(KERN_ERR "Failed to reset STAC9766: AC97 link error\n"); - goto reset_err; + goto codec_err; } stac9766_set_bias_level(codec, SND_SOC_BIAS_STANDBY); @@ -402,40 +361,63 @@ static int stac9766_codec_probe(struct platform_device *pdev) return 0; -reset_err: - snd_soc_free_pcms(socdev); -pcm_err: - snd_soc_free_ac97_codec(codec); codec_err: - kfree(snd_soc_codec_get_drvdata(codec)); -cache_err: - kfree(socdev->card->codec); - socdev->card->codec = NULL; + snd_soc_free_ac97_codec(codec); return ret; } -static int stac9766_codec_remove(struct platform_device *pdev) +static int stac9766_codec_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - if (codec == NULL) - return 0; - - snd_soc_free_pcms(socdev); snd_soc_free_ac97_codec(codec); - kfree(codec->reg_cache); - kfree(codec); return 0; } -struct snd_soc_codec_device soc_codec_dev_stac9766 = { +static struct snd_soc_codec_driver soc_codec_dev_stac9766 = { + .write = stac9766_ac97_write, + .read = stac9766_ac97_read, + .set_bias_level = stac9766_set_bias_level, .probe = stac9766_codec_probe, .remove = stac9766_codec_remove, .suspend = stac9766_codec_suspend, .resume = stac9766_codec_resume, + .reg_cache_size = sizeof(stac9766_reg), + .reg_word_size = sizeof(u16), + .reg_cache_step = 2, +}; + +static __devinit int stac9766_probe(struct platform_device *pdev) +{ + return snd_soc_register_codec(&pdev->dev, + &soc_codec_dev_stac9766, stac9766_dai, ARRAY_SIZE(stac9766_dai)); +} + +static int __devexit stac9766_remove(struct platform_device *pdev) +{ + snd_soc_unregister_codec(&pdev->dev); + return 0; +} + +static struct platform_driver stac9766_codec_driver = { + .driver = { + .name = "stac9766-codec", + .owner = THIS_MODULE, + }, + + .probe = stac9766_probe, + .remove = __devexit_p(stac9766_remove), }; -EXPORT_SYMBOL_GPL(soc_codec_dev_stac9766); + +static int __init stac9766_init(void) +{ + return platform_driver_register(&stac9766_codec_driver); +} +module_init(stac9766_init); + +static void __exit stac9766_exit(void) +{ + platform_driver_unregister(&stac9766_codec_driver); +} +module_exit(stac9766_exit); MODULE_DESCRIPTION("ASoC stac9766 driver"); MODULE_AUTHOR("Jon Smirl "); diff --git a/sound/soc/codecs/stac9766.h b/sound/soc/codecs/stac9766.h index 65642eb8393e..c726f907e2c0 100644 --- a/sound/soc/codecs/stac9766.h +++ b/sound/soc/codecs/stac9766.h @@ -14,8 +14,4 @@ #define STAC9766_DAI_AC97_ANALOG 0 #define STAC9766_DAI_AC97_DIGITAL 1 -extern struct snd_soc_dai stac9766_dai[]; -extern struct snd_soc_codec_device soc_codec_dev_stac9766; - - #endif diff --git a/sound/soc/codecs/tlv320aic23.c b/sound/soc/codecs/tlv320aic23.c index 0a4b0fef3355..e8652b1ae326 100644 --- a/sound/soc/codecs/tlv320aic23.c +++ b/sound/soc/codecs/tlv320aic23.c @@ -240,7 +240,8 @@ static const struct snd_soc_dapm_route intercon[] = { /* AIC23 driver data */ struct aic23 { - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; int mclk; int requested_adc; int requested_dac; @@ -404,11 +405,10 @@ static int tlv320aic23_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; u16 iface_reg; int ret; - struct aic23 *aic23 = container_of(codec, struct aic23, codec); + struct aic23 *aic23 = snd_soc_codec_get_drvdata(codec); u32 sample_rate_adc = aic23->requested_adc; u32 sample_rate_dac = aic23->requested_dac; u32 sample_rate = params_rate(params); @@ -452,8 +452,7 @@ static int tlv320aic23_pcm_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; /* set active */ tlv320aic23_write(codec, TLV320AIC23_ACTIVE, 0x0001); @@ -465,9 +464,8 @@ static void tlv320aic23_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; - struct aic23 *aic23 = container_of(codec, struct aic23, codec); + struct snd_soc_codec *codec = rtd->codec; + struct aic23 *aic23 = snd_soc_codec_get_drvdata(codec); /* deactivate */ if (!codec->active) { @@ -546,8 +544,7 @@ static int tlv320aic23_set_dai_fmt(struct snd_soc_dai *codec_dai, static int tlv320aic23_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct aic23 *aic23 = container_of(codec, struct aic23, codec); + struct aic23 *aic23 = snd_soc_dai_get_drvdata(codec_dai); aic23->mclk = freq; return 0; } @@ -594,8 +591,8 @@ static struct snd_soc_dai_ops tlv320aic23_dai_ops = { .set_sysclk = tlv320aic23_set_dai_sysclk, }; -struct snd_soc_dai tlv320aic23_dai = { - .name = "tlv320aic23", +static struct snd_soc_dai_driver tlv320aic23_dai = { + .name = "tlv320aic23-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, @@ -610,23 +607,17 @@ struct snd_soc_dai tlv320aic23_dai = { .formats = AIC23_FORMATS,}, .ops = &tlv320aic23_dai_ops, }; -EXPORT_SYMBOL_GPL(tlv320aic23_dai); -static int tlv320aic23_suspend(struct platform_device *pdev, +static int tlv320aic23_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int tlv320aic23_resume(struct platform_device *pdev) +static int tlv320aic23_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; u16 reg; /* Sync reg_cache with the hardware */ @@ -639,39 +630,19 @@ static int tlv320aic23_resume(struct platform_device *pdev) return 0; } -/* - * initialise the AIC23 driver - * register the mixer and dsp interfaces with the kernel - */ -static int tlv320aic23_init(struct snd_soc_device *socdev) +static int tlv320aic23_probe(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = socdev->card->codec; - int ret = 0; - u16 reg; + struct aic23 *aic23 = snd_soc_codec_get_drvdata(codec); + int reg; - codec->name = "tlv320aic23"; - codec->owner = THIS_MODULE; - codec->read = tlv320aic23_read_reg_cache; - codec->write = tlv320aic23_write; - codec->set_bias_level = tlv320aic23_set_bias_level; - codec->dai = &tlv320aic23_dai; - codec->num_dai = 1; - codec->reg_cache_size = ARRAY_SIZE(tlv320aic23_reg); - codec->reg_cache = - kmemdup(tlv320aic23_reg, sizeof(tlv320aic23_reg), GFP_KERNEL); - if (codec->reg_cache == NULL) - return -ENOMEM; + printk(KERN_INFO "AIC23 Audio Codec %s\n", AIC23_VERSION); + codec->control_data = aic23->control_data; + codec->hw_write = (hw_write_t)i2c_master_send; + codec->hw_read = NULL; /* Reset codec */ tlv320aic23_write(codec, TLV320AIC23_RESET, 0); - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - printk(KERN_ERR "tlv320aic23: failed to create pcms\n"); - goto pcm_err; - } - /* power on device */ tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_STANDBY); @@ -707,13 +678,27 @@ static int tlv320aic23_init(struct snd_soc_device *socdev) ARRAY_SIZE(tlv320aic23_snd_controls)); tlv320aic23_add_widgets(codec); - return ret; + return 0; +} -pcm_err: - kfree(codec->reg_cache); - return ret; +static int tlv320aic23_remove(struct snd_soc_codec *codec) +{ + tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_OFF); + return 0; } -static struct snd_soc_device *tlv320aic23_socdev; + +static struct snd_soc_codec_driver soc_codec_dev_tlv320aic23 = { + .reg_cache_size = ARRAY_SIZE(tlv320aic23_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = tlv320aic23_reg, + .probe = tlv320aic23_probe, + .remove = tlv320aic23_remove, + .suspend = tlv320aic23_suspend, + .resume = tlv320aic23_resume, + .read = tlv320aic23_read_reg_cache, + .write = tlv320aic23_write, + .set_bias_level = tlv320aic23_set_bias_level, +}; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) /* @@ -723,31 +708,30 @@ static struct snd_soc_device *tlv320aic23_socdev; static int tlv320aic23_codec_probe(struct i2c_client *i2c, const struct i2c_device_id *i2c_id) { - struct snd_soc_device *socdev = tlv320aic23_socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct aic23 *aic23; int ret; if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) return -EINVAL; - i2c_set_clientdata(i2c, codec); - codec->control_data = i2c; + aic23 = kzalloc(sizeof(struct aic23), GFP_KERNEL); + if (aic23 == NULL) + return -ENOMEM; - ret = tlv320aic23_init(socdev); - if (ret < 0) { - printk(KERN_ERR "tlv320aic23: failed to initialise AIC23\n"); - goto err; - } - return ret; + i2c_set_clientdata(i2c, aic23); + aic23->control_data = i2c; + aic23->control_type = SND_SOC_I2C; -err: - kfree(codec); - kfree(i2c); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_tlv320aic23, &tlv320aic23_dai, 1); + if (ret < 0) + kfree(aic23); return ret; } static int __exit tlv320aic23_i2c_remove(struct i2c_client *i2c) { - put_device(&i2c->dev); + snd_soc_unregister_codec(&i2c->dev); + kfree(i2c_get_clientdata(i2c)); return 0; } @@ -760,7 +744,7 @@ MODULE_DEVICE_TABLE(i2c, tlv320aic23_id); static struct i2c_driver tlv320aic23_i2c_driver = { .driver = { - .name = "tlv320aic23", + .name = "tlv320aic23-codec", }, .probe = tlv320aic23_codec_probe, .remove = __exit_p(tlv320aic23_i2c_remove), @@ -769,71 +753,25 @@ static struct i2c_driver tlv320aic23_i2c_driver = { #endif -static int tlv320aic23_probe(struct platform_device *pdev) +static int __init tlv320aic23_modinit(void) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - struct aic23 *aic23; - int ret = 0; - - printk(KERN_INFO "AIC23 Audio Codec %s\n", AIC23_VERSION); - - aic23 = kzalloc(sizeof(struct aic23), GFP_KERNEL); - if (aic23 == NULL) - return -ENOMEM; - codec = &aic23->codec; - socdev->card->codec = codec; - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - tlv320aic23_socdev = socdev; + int ret; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - codec->hw_write = (hw_write_t) i2c_master_send; - codec->hw_read = NULL; ret = i2c_add_driver(&tlv320aic23_i2c_driver); - if (ret != 0) - printk(KERN_ERR "can't add i2c driver"); + if (ret != 0) { + printk(KERN_ERR "Failed to register TLV320AIC23 I2C driver: %d\n", + ret); + } #endif return ret; } +module_init(tlv320aic23_modinit); -static int tlv320aic23_remove(struct platform_device *pdev) +static void __exit tlv320aic23_exit(void) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - struct aic23 *aic23 = container_of(codec, struct aic23, codec); - - if (codec->control_data) - tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_OFF); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) i2c_del_driver(&tlv320aic23_i2c_driver); #endif - kfree(codec->reg_cache); - kfree(aic23); - - return 0; -} -struct snd_soc_codec_device soc_codec_dev_tlv320aic23 = { - .probe = tlv320aic23_probe, - .remove = tlv320aic23_remove, - .suspend = tlv320aic23_suspend, - .resume = tlv320aic23_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_tlv320aic23); - -static int __init tlv320aic23_modinit(void) -{ - return snd_soc_register_dai(&tlv320aic23_dai); -} -module_init(tlv320aic23_modinit); - -static void __exit tlv320aic23_exit(void) -{ - snd_soc_unregister_dai(&tlv320aic23_dai); } module_exit(tlv320aic23_exit); diff --git a/sound/soc/codecs/tlv320aic23.h b/sound/soc/codecs/tlv320aic23.h index 79d1faf8e570..e804120bd3da 100644 --- a/sound/soc/codecs/tlv320aic23.h +++ b/sound/soc/codecs/tlv320aic23.h @@ -116,7 +116,4 @@ #define TLV320AIC23_SIDETONE_12 0x080 #define TLV320AIC23_SIDETONE_18 0x0c0 -extern struct snd_soc_dai tlv320aic23_dai; -extern struct snd_soc_codec_device soc_codec_dev_tlv320aic23; - #endif /* _TLV320AIC23_H */ diff --git a/sound/soc/codecs/tlv320aic26.c b/sound/soc/codecs/tlv320aic26.c index f0e00fd4b435..6b7d71ec0004 100644 --- a/sound/soc/codecs/tlv320aic26.c +++ b/sound/soc/codecs/tlv320aic26.c @@ -19,7 +19,6 @@ #include #include #include -#include #include #include "tlv320aic26.h" @@ -130,8 +129,7 @@ static int aic26_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct aic26 *aic26 = snd_soc_codec_get_drvdata(codec); int fsref, divisor, wlen, pval, jval, dval, qval; u16 reg; @@ -278,8 +276,8 @@ static struct snd_soc_dai_ops aic26_dai_ops = { .set_fmt = aic26_set_fmt, }; -struct snd_soc_dai aic26_dai = { - .name = "tlv320aic26", +static struct snd_soc_dai_driver aic26_dai = { + .name = "tlv320aic26-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, @@ -296,7 +294,6 @@ struct snd_soc_dai aic26_dai = { }, .ops = &aic26_dai_ops, }; -EXPORT_SYMBOL_GPL(aic26_dai); /* --------------------------------------------------------------------- * ALSA controls @@ -318,61 +315,6 @@ static const struct snd_kcontrol_new aic26_snd_controls[] = { SOC_ENUM("Capture Source", aic26_capture_src_enum), }; -/* --------------------------------------------------------------------- - * SoC CODEC portion of driver: probe and release routines - */ -static int aic26_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - struct aic26 *aic26; - int ret, err; - - dev_info(&pdev->dev, "Probing AIC26 SoC CODEC driver\n"); - dev_dbg(&pdev->dev, "socdev=%p\n", socdev); - dev_dbg(&pdev->dev, "codec_data=%p\n", socdev->codec_data); - - /* Fetch the relevant aic26 private data here (it's already been - * stored in the .codec pointer) */ - aic26 = socdev->codec_data; - if (aic26 == NULL) { - dev_err(&pdev->dev, "aic26: missing codec pointer\n"); - return -ENODEV; - } - codec = &aic26->codec; - socdev->card->codec = codec; - - dev_dbg(&pdev->dev, "Registering PCMs, dev=%p, socdev->dev=%p\n", - &pdev->dev, socdev->dev); - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(&pdev->dev, "aic26: failed to create pcms\n"); - return -ENODEV; - } - - /* register controls */ - dev_dbg(&pdev->dev, "Registering controls\n"); - err = snd_soc_add_controls(codec, aic26_snd_controls, - ARRAY_SIZE(aic26_snd_controls)); - WARN_ON(err < 0); - - return 0; -} - -static int aic26_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - snd_soc_free_pcms(socdev); - return 0; -} - -struct snd_soc_codec_device aic26_soc_codec_dev = { - .probe = aic26_probe, - .remove = aic26_remove, -}; -EXPORT_SYMBOL_GPL(aic26_soc_codec_dev); - /* --------------------------------------------------------------------- * SPI device portion of driver: sysfs files for debugging */ @@ -409,95 +351,95 @@ static ssize_t aic26_keyclick_set(struct device *dev, static DEVICE_ATTR(keyclick, 0644, aic26_keyclick_show, aic26_keyclick_set); /* --------------------------------------------------------------------- - * SPI device portion of driver: probe and release routines and SPI - * driver registration. + * SoC CODEC portion of driver: probe and release routines */ -static int aic26_spi_probe(struct spi_device *spi) +static int aic26_probe(struct snd_soc_codec *codec) { - struct aic26 *aic26; - int ret, i, reg; - - dev_dbg(&spi->dev, "probing tlv320aic26 spi device\n"); - - /* Allocate driver data */ - aic26 = kzalloc(sizeof *aic26, GFP_KERNEL); - if (!aic26) - return -ENOMEM; - - /* Initialize the driver data */ - aic26->spi = spi; - dev_set_drvdata(&spi->dev, aic26); + struct aic26 *aic26 = snd_soc_codec_get_drvdata(codec); + int ret, err, i, reg; - /* Setup what we can in the codec structure so that the register - * access functions will work as expected. More will be filled - * out when it is probed by the SoC CODEC part of this driver */ - snd_soc_codec_set_drvdata(&aic26->codec, aic26); - aic26->codec.name = "aic26"; - aic26->codec.owner = THIS_MODULE; - aic26->codec.dai = &aic26_dai; - aic26->codec.num_dai = 1; - aic26->codec.read = aic26_reg_read; - aic26->codec.write = aic26_reg_write; - aic26->master = 1; - mutex_init(&aic26->codec.mutex); - INIT_LIST_HEAD(&aic26->codec.dapm_widgets); - INIT_LIST_HEAD(&aic26->codec.dapm_paths); - aic26->codec.reg_cache_size = AIC26_NUM_REGS; - aic26->codec.reg_cache = aic26->reg_cache; - - aic26_dai.dev = &spi->dev; - ret = snd_soc_register_dai(&aic26_dai); - if (ret != 0) { - dev_err(&spi->dev, "Failed to register DAI: %d\n", ret); - kfree(aic26); - return ret; - } + dev_info(codec->dev, "Probing AIC26 SoC CODEC driver\n"); /* Reset the codec to power on defaults */ - aic26_reg_write(&aic26->codec, AIC26_REG_RESET, 0xBB00); + aic26_reg_write(codec, AIC26_REG_RESET, 0xBB00); /* Power up CODEC */ - aic26_reg_write(&aic26->codec, AIC26_REG_POWER_CTRL, 0); + aic26_reg_write(codec, AIC26_REG_POWER_CTRL, 0); /* Audio Control 3 (master mode, fsref rate) */ - reg = aic26_reg_read(&aic26->codec, AIC26_REG_AUDIO_CTRL3); + reg = aic26_reg_read(codec, AIC26_REG_AUDIO_CTRL3); reg &= ~0xf800; reg |= 0x0800; /* set master mode */ - aic26_reg_write(&aic26->codec, AIC26_REG_AUDIO_CTRL3, reg); + aic26_reg_write(codec, AIC26_REG_AUDIO_CTRL3, reg); /* Fill register cache */ for (i = 0; i < ARRAY_SIZE(aic26->reg_cache); i++) - aic26_reg_read(&aic26->codec, i); + aic26_reg_read(codec, i); /* Register the sysfs files for debugging */ /* Create SysFS files */ - ret = device_create_file(&spi->dev, &dev_attr_keyclick); + ret = device_create_file(codec->dev, &dev_attr_keyclick); if (ret) - dev_info(&spi->dev, "error creating sysfs files\n"); + dev_info(codec->dev, "error creating sysfs files\n"); -#if defined(CONFIG_SND_SOC_OF_SIMPLE) - /* Tell the of_soc helper about this codec */ - of_snd_soc_register_codec(&aic26_soc_codec_dev, aic26, &aic26_dai, - spi->dev.archdata.of_node); -#endif + /* register controls */ + dev_dbg(codec->dev, "Registering controls\n"); + err = snd_soc_add_controls(codec, aic26_snd_controls, + ARRAY_SIZE(aic26_snd_controls)); + WARN_ON(err < 0); - dev_dbg(&spi->dev, "SPI device initialized\n"); return 0; } -static int aic26_spi_remove(struct spi_device *spi) +static struct snd_soc_codec_driver aic26_soc_codec_dev = { + .probe = aic26_probe, + .read = aic26_reg_read, + .write = aic26_reg_write, + .reg_cache_size = AIC26_NUM_REGS, + .reg_word_size = sizeof(u16), +}; + +/* --------------------------------------------------------------------- + * SPI device portion of driver: probe and release routines and SPI + * driver registration. + */ +static int aic26_spi_probe(struct spi_device *spi) { - struct aic26 *aic26 = dev_get_drvdata(&spi->dev); + struct aic26 *aic26; + int ret; - snd_soc_unregister_dai(&aic26_dai); - kfree(aic26); + dev_dbg(&spi->dev, "probing tlv320aic26 spi device\n"); + + /* Allocate driver data */ + aic26 = kzalloc(sizeof *aic26, GFP_KERNEL); + if (!aic26) + return -ENOMEM; + /* Initialize the driver data */ + aic26->spi = spi; + dev_set_drvdata(&spi->dev, aic26); + aic26->master = 1; + + ret = snd_soc_register_codec(&spi->dev, + &aic26_soc_codec_dev, &aic26_dai, 1); + if (ret < 0) + kfree(aic26); + return ret; + + dev_dbg(&spi->dev, "SPI device initialized\n"); + return 0; +} + +static int aic26_spi_remove(struct spi_device *spi) +{ + snd_soc_unregister_codec(&spi->dev); + kfree(spi_get_drvdata(spi)); return 0; } static struct spi_driver aic26_spi = { .driver = { - .name = "tlv320aic26", + .name = "tlv320aic26-codec", .owner = THIS_MODULE, }, .probe = aic26_spi_probe, diff --git a/sound/soc/codecs/tlv320aic26.h b/sound/soc/codecs/tlv320aic26.h index 786ba16c945f..62b1f2261429 100644 --- a/sound/soc/codecs/tlv320aic26.h +++ b/sound/soc/codecs/tlv320aic26.h @@ -90,7 +90,4 @@ enum aic26_wlen { AIC26_WLEN_32 = 3 << 10, }; -extern struct snd_soc_dai aic26_dai; -extern struct snd_soc_codec_device aic26_soc_codec_dev; - #endif /* _TLV320AIC16_H_ */ diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index 71a69908ccf6..43fd9c171742 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c @@ -63,8 +63,10 @@ static const char *aic3x_supply_names[AIC3X_NUM_SUPPLIES] = { /* codec private data */ struct aic3x_priv { - struct snd_soc_codec codec; struct regulator_bulk_data supplies[AIC3X_NUM_SUPPLIES]; + enum snd_soc_control_type control_type; + struct aic3x_setup_data *setup; + void *control_data; unsigned int sysclk; int master; int gpio_reset; @@ -773,8 +775,7 @@ static int aic3x_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec =rtd->codec; struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); int codec_clk = 0, bypass_pll = 0, fsref, last_clk = 0; u8 data, j, r, p, pll_q, pll_p = 1, pll_r = 1, pll_j = 1; @@ -1101,8 +1102,8 @@ static struct snd_soc_dai_ops aic3x_dai_ops = { .set_fmt = aic3x_set_dai_fmt, }; -struct snd_soc_dai aic3x_dai = { - .name = "tlv320aic3x", +static struct snd_soc_dai_driver aic3x_dai = { + .name = "tlv320aic3x-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -1117,22 +1118,16 @@ struct snd_soc_dai aic3x_dai = { .formats = AIC3X_FORMATS,}, .ops = &aic3x_dai_ops, }; -EXPORT_SYMBOL_GPL(aic3x_dai); -static int aic3x_suspend(struct platform_device *pdev, pm_message_t state) +static int aic3x_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - aic3x_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int aic3x_resume(struct platform_device *pdev) +static int aic3x_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; int i; u8 data[2]; u8 *cache = codec->reg_cache; @@ -1157,22 +1152,6 @@ static int aic3x_init(struct snd_soc_codec *codec) { int reg; - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - codec->name = "tlv320aic3x"; - codec->owner = THIS_MODULE; - codec->read = aic3x_read_reg_cache; - codec->write = aic3x_write; - codec->set_bias_level = aic3x_set_bias_level; - codec->dai = &aic3x_dai; - codec->num_dai = 1; - codec->reg_cache_size = ARRAY_SIZE(aic3x_reg); - codec->reg_cache = kmemdup(aic3x_reg, sizeof(aic3x_reg), GFP_KERNEL); - if (codec->reg_cache == NULL) - return -ENOMEM; - aic3x_write(codec, AIC3X_PAGE_SELECT, PAGE0_SELECT); aic3x_write(codec, AIC3X_RESET, SOFT_RESET); @@ -1245,56 +1224,50 @@ static int aic3x_init(struct snd_soc_codec *codec) return 0; } -static struct snd_soc_codec *aic3x_codec; - -static int aic3x_register(struct snd_soc_codec *codec) +static int aic3x_probe(struct snd_soc_codec *codec) { - int ret; + struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); + + codec->hw_write = (hw_write_t) i2c_master_send; + codec->control_data = aic3x->control_data; - ret = aic3x_init(codec); - if (ret < 0) { - dev_err(codec->dev, "Failed to initialise device\n"); - return ret; + if (aic3x->setup) { + /* setup GPIO functions */ + aic3x_write(codec, AIC3X_GPIO1_REG, + (aic3x->setup->gpio_func[0] & 0xf) << 4); + aic3x_write(codec, AIC3X_GPIO2_REG, + (aic3x->setup->gpio_func[1] & 0xf) << 4); } - aic3x_codec = codec; + aic3x_init(codec); - ret = snd_soc_register_codec(codec); - if (ret) { - dev_err(codec->dev, "Failed to register codec\n"); - return ret; - } + snd_soc_add_controls(codec, aic3x_snd_controls, + ARRAY_SIZE(aic3x_snd_controls)); - ret = snd_soc_register_dai(&aic3x_dai); - if (ret) { - dev_err(codec->dev, "Failed to register dai\n"); - snd_soc_unregister_codec(codec); - return ret; - } + aic3x_add_widgets(codec); return 0; } -static int aic3x_unregister(struct aic3x_priv *aic3x) +static int aic3x_remove(struct snd_soc_codec *codec) { - aic3x_set_bias_level(&aic3x->codec, SND_SOC_BIAS_OFF); - - snd_soc_unregister_dai(&aic3x_dai); - snd_soc_unregister_codec(&aic3x->codec); - - if (aic3x->gpio_reset >= 0) { - gpio_set_value(aic3x->gpio_reset, 0); - gpio_free(aic3x->gpio_reset); - } - regulator_bulk_disable(ARRAY_SIZE(aic3x->supplies), aic3x->supplies); - regulator_bulk_free(ARRAY_SIZE(aic3x->supplies), aic3x->supplies); - - kfree(aic3x); - aic3x_codec = NULL; - + aic3x_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } +static struct snd_soc_codec_driver soc_codec_dev_aic3x = { + .read = aic3x_read_reg_cache, + .write = aic3x_write, + .set_bias_level = aic3x_set_bias_level, + .reg_cache_size = ARRAY_SIZE(aic3x_reg), + .reg_word_size = sizeof(u8), + .reg_cache_default = aic3x_reg, + .probe = aic3x_probe, + .remove = aic3x_remove, + .suspend = aic3x_suspend, + .resume = aic3x_resume, +}; + #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) /* * AIC3X 2 wire address can be up to 4 devices with device addresses @@ -1308,9 +1281,9 @@ static int aic3x_unregister(struct aic3x_priv *aic3x) static int aic3x_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { - struct snd_soc_codec *codec; - struct aic3x_priv *aic3x; struct aic3x_pdata *pdata = i2c->dev.platform_data; + struct aic3x_setup_data *setup = pdata->setup; + struct aic3x_priv *aic3x; int ret, i; aic3x = kzalloc(sizeof(struct aic3x_priv), GFP_KERNEL); @@ -1319,12 +1292,8 @@ static int aic3x_i2c_probe(struct i2c_client *i2c, return -ENOMEM; } - codec = &aic3x->codec; - codec->dev = &i2c->dev; - snd_soc_codec_set_drvdata(codec, aic3x); - codec->control_data = i2c; - codec->hw_write = (hw_write_t) i2c_master_send; - + aic3x->control_data = i2c; + aic3x->setup = setup; i2c_set_clientdata(i2c, aic3x); aic3x->gpio_reset = -1; @@ -1339,17 +1308,17 @@ static int aic3x_i2c_probe(struct i2c_client *i2c, for (i = 0; i < ARRAY_SIZE(aic3x->supplies); i++) aic3x->supplies[i].supply = aic3x_supply_names[i]; - ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(aic3x->supplies), + ret = regulator_bulk_get(&i2c->dev, ARRAY_SIZE(aic3x->supplies), aic3x->supplies); if (ret != 0) { - dev_err(codec->dev, "Failed to request supplies: %d\n", ret); + dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret); goto err_get; } ret = regulator_bulk_enable(ARRAY_SIZE(aic3x->supplies), aic3x->supplies); if (ret != 0) { - dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); + dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret); goto err_enable; } @@ -1358,7 +1327,11 @@ static int aic3x_i2c_probe(struct i2c_client *i2c, gpio_set_value(aic3x->gpio_reset, 1); } - return aic3x_register(codec); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_aic3x, &aic3x_dai, 1); + if (ret < 0) + goto err_enable; + return ret; err_enable: regulator_bulk_free(ARRAY_SIZE(aic3x->supplies), aic3x->supplies); @@ -1374,7 +1347,16 @@ static int aic3x_i2c_remove(struct i2c_client *client) { struct aic3x_priv *aic3x = i2c_get_clientdata(client); - return aic3x_unregister(aic3x); + if (aic3x->gpio_reset >= 0) { + gpio_set_value(aic3x->gpio_reset, 0); + gpio_free(aic3x->gpio_reset); + } + regulator_bulk_disable(ARRAY_SIZE(aic3x->supplies), aic3x->supplies); + regulator_bulk_free(ARRAY_SIZE(aic3x->supplies), aic3x->supplies); + + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); + return 0; } static const struct i2c_device_id aic3x_i2c_id[] = { @@ -1387,7 +1369,7 @@ MODULE_DEVICE_TABLE(i2c, aic3x_i2c_id); /* machine i2c codec control layer */ static struct i2c_driver aic3x_i2c_driver = { .driver = { - .name = "aic3x I2C Codec", + .name = "tlv320aic3x-codec", .owner = THIS_MODULE, }, .probe = aic3x_i2c_probe, @@ -1409,90 +1391,27 @@ static inline void aic3x_i2c_exit(void) { i2c_del_driver(&aic3x_i2c_driver); } -#else -static inline void aic3x_i2c_init(void) { } -static inline void aic3x_i2c_exit(void) { } #endif -static int aic3x_probe(struct platform_device *pdev) +static int __init aic3x_modinit(void) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct aic3x_setup_data *setup; - struct snd_soc_codec *codec; int ret = 0; - - codec = aic3x_codec; - if (!codec) { - dev_err(&pdev->dev, "Codec not registered\n"); - return -ENODEV; - } - - socdev->card->codec = codec; - setup = socdev->codec_data; - - if (setup) { - /* setup GPIO functions */ - aic3x_write(codec, AIC3X_GPIO1_REG, - (setup->gpio_func[0] & 0xf) << 4); - aic3x_write(codec, AIC3X_GPIO2_REG, - (setup->gpio_func[1] & 0xf) << 4); - } - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - printk(KERN_ERR "aic3x: failed to create pcms\n"); - goto pcm_err; +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) + ret = i2c_add_driver(&aic3x_i2c_driver); + if (ret != 0) { + printk(KERN_ERR "Failed to register TLV320AIC3x I2C driver: %d\n", + ret); } - - snd_soc_add_controls(codec, aic3x_snd_controls, - ARRAY_SIZE(aic3x_snd_controls)); - - aic3x_add_widgets(codec); - - return ret; - -pcm_err: - kfree(codec->reg_cache); +#endif return ret; } - -static int aic3x_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - /* power down chip */ - if (codec->control_data) - aic3x_set_bias_level(codec, SND_SOC_BIAS_OFF); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - kfree(codec->reg_cache); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_aic3x = { - .probe = aic3x_probe, - .remove = aic3x_remove, - .suspend = aic3x_suspend, - .resume = aic3x_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_aic3x); - -static int __init aic3x_modinit(void) -{ - aic3x_i2c_init(); - - return 0; -} module_init(aic3x_modinit); static void __exit aic3x_exit(void) { - aic3x_i2c_exit(); +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) + i2c_del_driver(&aic3x_i2c_driver); +#endif } module_exit(aic3x_exit); diff --git a/sound/soc/codecs/tlv320aic3x.h b/sound/soc/codecs/tlv320aic3x.h index 9af1c886213c..f6e3d9b42daf 100644 --- a/sound/soc/codecs/tlv320aic3x.h +++ b/sound/soc/codecs/tlv320aic3x.h @@ -199,42 +199,6 @@ /* Default input volume */ #define DEFAULT_GAIN 0x20 -/* GPIO API */ -enum { - AIC3X_GPIO1_FUNC_DISABLED = 0, - AIC3X_GPIO1_FUNC_AUDIO_WORDCLK_ADC = 1, - AIC3X_GPIO1_FUNC_CLOCK_MUX = 2, - AIC3X_GPIO1_FUNC_CLOCK_MUX_DIV2 = 3, - AIC3X_GPIO1_FUNC_CLOCK_MUX_DIV4 = 4, - AIC3X_GPIO1_FUNC_CLOCK_MUX_DIV8 = 5, - AIC3X_GPIO1_FUNC_SHORT_CIRCUIT_IRQ = 6, - AIC3X_GPIO1_FUNC_AGC_NOISE_IRQ = 7, - AIC3X_GPIO1_FUNC_INPUT = 8, - AIC3X_GPIO1_FUNC_OUTPUT = 9, - AIC3X_GPIO1_FUNC_DIGITAL_MIC_MODCLK = 10, - AIC3X_GPIO1_FUNC_AUDIO_WORDCLK = 11, - AIC3X_GPIO1_FUNC_BUTTON_IRQ = 12, - AIC3X_GPIO1_FUNC_HEADSET_DETECT_IRQ = 13, - AIC3X_GPIO1_FUNC_HEADSET_DETECT_OR_BUTTON_IRQ = 14, - AIC3X_GPIO1_FUNC_ALL_IRQ = 16 -}; - -enum { - AIC3X_GPIO2_FUNC_DISABLED = 0, - AIC3X_GPIO2_FUNC_HEADSET_DETECT_IRQ = 2, - AIC3X_GPIO2_FUNC_INPUT = 3, - AIC3X_GPIO2_FUNC_OUTPUT = 4, - AIC3X_GPIO2_FUNC_DIGITAL_MIC_INPUT = 5, - AIC3X_GPIO2_FUNC_AUDIO_BITCLK = 8, - AIC3X_GPIO2_FUNC_HEADSET_DETECT_OR_BUTTON_IRQ = 9, - AIC3X_GPIO2_FUNC_ALL_IRQ = 10, - AIC3X_GPIO2_FUNC_SHORT_CIRCUIT_OR_AGC_IRQ = 11, - AIC3X_GPIO2_FUNC_HEADSET_OR_BUTTON_PRESS_OR_SHORT_CIRCUIT_IRQ = 12, - AIC3X_GPIO2_FUNC_SHORT_CIRCUIT_IRQ = 13, - AIC3X_GPIO2_FUNC_AGC_NOISE_IRQ = 14, - AIC3X_GPIO2_FUNC_BUTTON_PRESS_IRQ = 15 -}; - void aic3x_set_gpio(struct snd_soc_codec *codec, int gpio, int state); int aic3x_get_gpio(struct snd_soc_codec *codec, int gpio); @@ -281,11 +245,4 @@ void aic3x_set_headset_detection(struct snd_soc_codec *codec, int detect, int aic3x_headset_detected(struct snd_soc_codec *codec); int aic3x_button_pressed(struct snd_soc_codec *codec); -struct aic3x_setup_data { - unsigned int gpio_func[2]; -}; - -extern struct snd_soc_dai aic3x_dai; -extern struct snd_soc_codec_device soc_codec_dev_aic3x; - #endif /* _AIC3X_H */ diff --git a/sound/soc/codecs/tlv320dac33.c b/sound/soc/codecs/tlv320dac33.c index 8651b01ed223..a3c5b521da6a 100644 --- a/sound/soc/codecs/tlv320dac33.c +++ b/sound/soc/codecs/tlv320dac33.c @@ -66,8 +66,6 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream); static int dac33_prepare_chip(struct snd_pcm_substream *substream); -static struct snd_soc_codec *tlv320dac33_codec; - enum dac33_state { DAC33_IDLE = 0, DAC33_PREFILL, @@ -93,7 +91,7 @@ struct tlv320dac33_priv { struct mutex mutex; struct workqueue_struct *dac33_wq; struct work_struct work; - struct snd_soc_codec codec; + struct snd_soc_codec *codec; struct regulator_bulk_data supplies[DAC33_NUM_SUPPLIES]; struct snd_pcm_substream *substream; int power_gpio; @@ -128,6 +126,8 @@ struct tlv320dac33_priv { unsigned int uthr; enum dac33_state state; + enum snd_soc_control_type control_type; + void *control_data; }; static const u8 dac33_reg[DAC33_CACHEREGNUM] = { @@ -650,9 +650,7 @@ static int dac33_set_bias_level(struct snd_soc_codec *codec, static inline void dac33_prefill_handler(struct tlv320dac33_priv *dac33) { - struct snd_soc_codec *codec; - - codec = &dac33->codec; + struct snd_soc_codec *codec = dac33->codec; switch (dac33->fifo_mode) { case DAC33_FIFO_MODE1: @@ -695,9 +693,7 @@ static inline void dac33_prefill_handler(struct tlv320dac33_priv *dac33) static inline void dac33_playback_handler(struct tlv320dac33_priv *dac33) { - struct snd_soc_codec *codec; - - codec = &dac33->codec; + struct snd_soc_codec *codec = dac33->codec; switch (dac33->fifo_mode) { case DAC33_FIFO_MODE1: @@ -726,7 +722,7 @@ static void dac33_work(struct work_struct *work) u8 reg; dac33 = container_of(work, struct tlv320dac33_priv, work); - codec = &dac33->codec; + codec = dac33->codec; mutex_lock(&dac33->mutex); switch (dac33->state) { @@ -787,8 +783,7 @@ static int dac33_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); /* Stream started, save the substream pointer */ @@ -801,8 +796,7 @@ static void dac33_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); dac33->substream = NULL; @@ -817,8 +811,7 @@ static int dac33_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; /* Check parameters for validity */ switch (params_rate(params)) { @@ -856,8 +849,7 @@ static int dac33_hw_params(struct snd_pcm_substream *substream, static int dac33_prepare_chip(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); unsigned int oscset, ratioset, pwr_ctrl, reg_tmp; u8 aictrl_a, aictrl_b, fifoctrl_a; @@ -1049,8 +1041,7 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream) static void dac33_calculate_times(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); unsigned int period_size = substream->runtime->period_size; unsigned int rate = substream->runtime->rate; @@ -1129,8 +1120,7 @@ static int dac33_pcm_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); int ret = 0; @@ -1163,8 +1153,7 @@ static snd_pcm_sframes_t dac33_dai_delay( struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); unsigned long long t0, t1, t_now; unsigned int time_delta, uthr; @@ -1389,24 +1378,47 @@ static int dac33_set_dai_fmt(struct snd_soc_dai *codec_dai, return 0; } -static int dac33_soc_probe(struct platform_device *pdev) +static int dac33_soc_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - struct tlv320dac33_priv *dac33; + struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); int ret = 0; - BUG_ON(!tlv320dac33_codec); + codec->control_data = dac33->control_data; + codec->hw_write = (hw_write_t) i2c_master_send; + codec->bias_level = SND_SOC_BIAS_OFF; + codec->idle_bias_off = 1; + dac33->codec = codec; - codec = tlv320dac33_codec; - socdev->card->codec = codec; - dac33 = snd_soc_codec_get_drvdata(codec); + /* Read the tlv320dac33 ID registers */ + ret = dac33_hard_power(codec, 1); + if (ret != 0) { + dev_err(codec->dev, "Failed to power up codec: %d\n", ret); + goto err_power; + } + dac33_read_id(codec); + dac33_hard_power(codec, 0); - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms\n"); - goto pcm_err; + /* Check if the IRQ number is valid and request it */ + if (dac33->irq >= 0) { + ret = request_irq(dac33->irq, dac33_interrupt_handler, + IRQF_TRIGGER_RISING | IRQF_DISABLED, + codec->name, codec); + if (ret < 0) { + dev_err(codec->dev, "Could not request IRQ%d (%d)\n", + dac33->irq, ret); + dac33->irq = -1; + } + if (dac33->irq != -1) { + /* Setup work queue */ + dac33->dac33_wq = + create_singlethread_workqueue("tlv320dac33"); + if (dac33->dac33_wq == NULL) { + free_irq(dac33->irq, codec); + return -ENOMEM; + } + + INIT_WORK(&dac33->work, dac33_work); + } } snd_soc_add_controls(codec, dac33_snd_controls, @@ -1420,56 +1432,51 @@ static int dac33_soc_probe(struct platform_device *pdev) snd_soc_add_controls(codec, dac33_fifo_snd_controls, ARRAY_SIZE(dac33_fifo_snd_controls)); } - dac33_add_widgets(codec); - return 0; - -pcm_err: - dac33_hard_power(codec, 0); +err_power: return ret; } -static int dac33_soc_remove(struct platform_device *pdev) +static int dac33_soc_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; + struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); dac33_set_bias_level(codec, SND_SOC_BIAS_OFF); - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - + if (dac33->irq >= 0) { + free_irq(dac33->irq, dac33->codec); + destroy_workqueue(dac33->dac33_wq); + } return 0; } -static int dac33_soc_suspend(struct platform_device *pdev, pm_message_t state) +static int dac33_soc_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - dac33_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int dac33_soc_resume(struct platform_device *pdev) +static int dac33_soc_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - dac33_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; } -struct snd_soc_codec_device soc_codec_dev_tlv320dac33 = { +static struct snd_soc_codec_driver soc_codec_dev_tlv320dac33 = { + .read = dac33_read_reg_cache, + .write = dac33_write_locked, + .set_bias_level = dac33_set_bias_level, + .reg_cache_size = ARRAY_SIZE(dac33_reg), + .reg_word_size = sizeof(u8), + .reg_cache_default = dac33_reg, .probe = dac33_soc_probe, .remove = dac33_soc_remove, .suspend = dac33_soc_suspend, .resume = dac33_soc_resume, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_tlv320dac33); #define DAC33_RATES (SNDRV_PCM_RATE_44100 | \ SNDRV_PCM_RATE_48000) @@ -1485,8 +1492,8 @@ static struct snd_soc_dai_ops dac33_dai_ops = { .set_fmt = dac33_set_dai_fmt, }; -struct snd_soc_dai dac33_dai = { - .name = "tlv320dac33", +static struct snd_soc_dai_driver dac33_dai = { + .name = "tlv320dac33-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, @@ -1495,14 +1502,12 @@ struct snd_soc_dai dac33_dai = { .formats = DAC33_FORMATS,}, .ops = &dac33_dai_ops, }; -EXPORT_SYMBOL_GPL(dac33_dai); static int __devinit dac33_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct tlv320dac33_platform_data *pdata; struct tlv320dac33_priv *dac33; - struct snd_soc_codec *codec; int ret, i; if (client->dev.platform_data == NULL) { @@ -1515,33 +1520,9 @@ static int __devinit dac33_i2c_probe(struct i2c_client *client, if (dac33 == NULL) return -ENOMEM; - codec = &dac33->codec; - snd_soc_codec_set_drvdata(codec, dac33); - codec->control_data = client; - - mutex_init(&codec->mutex); + dac33->control_data = client; mutex_init(&dac33->mutex); spin_lock_init(&dac33->lock); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - codec->name = "tlv320dac33"; - codec->owner = THIS_MODULE; - codec->read = dac33_read_reg_cache; - codec->write = dac33_write_locked; - codec->hw_write = (hw_write_t) i2c_master_send; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = dac33_set_bias_level; - codec->idle_bias_off = 1; - codec->dai = &dac33_dai; - codec->num_dai = 1; - codec->reg_cache_size = ARRAY_SIZE(dac33_reg); - codec->reg_cache = kmemdup(dac33_reg, ARRAY_SIZE(dac33_reg), - GFP_KERNEL); - if (codec->reg_cache == NULL) { - ret = -ENOMEM; - goto error_reg; - } i2c_set_clientdata(client, dac33); @@ -1561,125 +1542,59 @@ static int __devinit dac33_i2c_probe(struct i2c_client *client, /* Disable FIFO use by default */ dac33->fifo_mode = DAC33_FIFO_BYPASS; - tlv320dac33_codec = codec; - - codec->dev = &client->dev; - dac33_dai.dev = codec->dev; - /* Check if the reset GPIO number is valid and request it */ if (dac33->power_gpio >= 0) { ret = gpio_request(dac33->power_gpio, "tlv320dac33 reset"); if (ret < 0) { - dev_err(codec->dev, + dev_err(&client->dev, "Failed to request reset GPIO (%d)\n", dac33->power_gpio); - snd_soc_unregister_dai(&dac33_dai); - snd_soc_unregister_codec(codec); - goto error_gpio; + goto err_gpio; } gpio_direction_output(dac33->power_gpio, 0); } - /* Check if the IRQ number is valid and request it */ - if (dac33->irq >= 0) { - ret = request_irq(dac33->irq, dac33_interrupt_handler, - IRQF_TRIGGER_RISING | IRQF_DISABLED, - codec->name, codec); - if (ret < 0) { - dev_err(codec->dev, "Could not request IRQ%d (%d)\n", - dac33->irq, ret); - dac33->irq = -1; - } - if (dac33->irq != -1) { - /* Setup work queue */ - dac33->dac33_wq = - create_singlethread_workqueue("tlv320dac33"); - if (dac33->dac33_wq == NULL) { - free_irq(dac33->irq, &dac33->codec); - ret = -ENOMEM; - goto error_wq; - } - - INIT_WORK(&dac33->work, dac33_work); - } - } - for (i = 0; i < ARRAY_SIZE(dac33->supplies); i++) dac33->supplies[i].supply = dac33_supply_names[i]; - ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(dac33->supplies), + ret = regulator_bulk_get(&client->dev, ARRAY_SIZE(dac33->supplies), dac33->supplies); if (ret != 0) { - dev_err(codec->dev, "Failed to request supplies: %d\n", ret); + dev_err(&client->dev, "Failed to request supplies: %d\n", ret); goto err_get; } - /* Read the tlv320dac33 ID registers */ - ret = dac33_hard_power(codec, 1); - if (ret != 0) { - dev_err(codec->dev, "Failed to power up codec: %d\n", ret); - goto error_codec; - } - dac33_read_id(codec); - dac33_hard_power(codec, 0); - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto error_codec; - } - - ret = snd_soc_register_dai(&dac33_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - snd_soc_unregister_codec(codec); - goto error_codec; - } + ret = snd_soc_register_codec(&client->dev, + &soc_codec_dev_tlv320dac33, &dac33_dai, 1); + if (ret < 0) + goto err_register; return ret; - -error_codec: +err_register: regulator_bulk_free(ARRAY_SIZE(dac33->supplies), dac33->supplies); err_get: - if (dac33->irq >= 0) { - free_irq(dac33->irq, &dac33->codec); - destroy_workqueue(dac33->dac33_wq); - } -error_wq: if (dac33->power_gpio >= 0) gpio_free(dac33->power_gpio); -error_gpio: - kfree(codec->reg_cache); -error_reg: - tlv320dac33_codec = NULL; +err_gpio: kfree(dac33); - return ret; } static int __devexit dac33_i2c_remove(struct i2c_client *client) { - struct tlv320dac33_priv *dac33; - - dac33 = i2c_get_clientdata(client); + struct tlv320dac33_priv *dac33 = i2c_get_clientdata(client); if (unlikely(dac33->chip_power)) - dac33_hard_power(&dac33->codec, 0); + dac33_hard_power(dac33->codec, 0); if (dac33->power_gpio >= 0) gpio_free(dac33->power_gpio); - if (dac33->irq >= 0) - free_irq(dac33->irq, &dac33->codec); regulator_bulk_free(ARRAY_SIZE(dac33->supplies), dac33->supplies); - destroy_workqueue(dac33->dac33_wq); - snd_soc_unregister_dai(&dac33_dai); - snd_soc_unregister_codec(&dac33->codec); - kfree(dac33->codec.reg_cache); + snd_soc_unregister_codec(&client->dev); kfree(dac33); - tlv320dac33_codec = NULL; return 0; } @@ -1694,7 +1609,7 @@ static const struct i2c_device_id tlv320dac33_i2c_id[] = { static struct i2c_driver tlv320dac33_i2c_driver = { .driver = { - .name = "tlv320dac33", + .name = "tlv320dac33-codec", .owner = THIS_MODULE, }, .probe = dac33_i2c_probe, diff --git a/sound/soc/codecs/tlv320dac33.h b/sound/soc/codecs/tlv320dac33.h index eb8ae07f0bd2..7c318b5da437 100644 --- a/sound/soc/codecs/tlv320dac33.h +++ b/sound/soc/codecs/tlv320dac33.h @@ -261,7 +261,4 @@ #define TLV320DAC33_MCLK 0 #define TLV320DAC33_SLEEPCLK 1 -extern struct snd_soc_dai dac33_dai; -extern struct snd_soc_codec_device soc_codec_dev_tlv320dac33; - #endif /* __TLV320DAC33_H */ diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index 7b618bbff884..898430f44f9d 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -36,7 +36,16 @@ #include #include -#include "twl4030.h" +/* Register descriptions are here */ +#include + +/* Shadow register used by the audio driver */ +#define TWL4030_REG_SW_SHADOW 0x4A +#define TWL4030_CACHEREGNUM (TWL4030_REG_SW_SHADOW + 1) + +/* TWL4030_REG_SW_SHADOW (0x4A) Fields */ +#define TWL4030_HFL_EN 0x01 +#define TWL4030_HFR_EN 0x02 /* * twl4030 register cache & default register settings @@ -277,21 +286,19 @@ static inline void twl4030_reset_registers(struct snd_soc_codec *codec) } -static void twl4030_init_chip(struct platform_device *pdev) +static void twl4030_init_chip(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct twl4030_setup_data *setup = socdev->codec_data; - struct snd_soc_codec *codec = socdev->card->codec; + struct twl4030_codec_audio_data *pdata = dev_get_platdata(codec->dev); struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); u8 reg, byte; int i = 0; /* Check defaults, if instructed before anything else */ - if (setup && setup->check_defaults) + if (pdata && pdata->check_defaults) twl4030_check_defaults(codec); /* Reset registers, if no setup data or if instructed to do so */ - if (!setup || (setup && setup->reset_registers)) + if (!pdata || (pdata && pdata->reset_registers)) twl4030_reset_registers(codec); /* Refresh APLL_CTL register from HW */ @@ -312,20 +319,14 @@ static void twl4030_init_chip(struct platform_device *pdev) twl4030_write(codec, TWL4030_REG_ARXR2_APGA_CTL, 0x32); /* Machine dependent setup */ - if (!setup) + if (!pdata) return; - twl4030->digimic_delay = setup->digimic_delay; - - /* Configuration for headset ramp delay from setup data */ - if (setup->sysclk != twl4030->sysclk) - dev_warn(codec->dev, - "Mismatch in APLL mclk: %u (configured: %u)\n", - setup->sysclk, twl4030->sysclk); + twl4030->digimic_delay = pdata->digimic_delay; reg = twl4030_read_reg_cache(codec, TWL4030_REG_HS_POPN_SET); reg &= ~TWL4030_RAMP_DELAY; - reg |= (setup->ramp_delay_value << 2); + reg |= (pdata->ramp_delay_value << 2); twl4030_write_reg_cache(codec, TWL4030_REG_HS_POPN_SET, reg); /* initiate offset cancellation */ @@ -333,7 +334,7 @@ static void twl4030_init_chip(struct platform_device *pdev) reg = twl4030_read_reg_cache(codec, TWL4030_REG_ANAMICL); reg &= ~TWL4030_OFFSET_CNCL_SEL; - reg |= setup->offset_cncl_path; + reg |= pdata->offset_cncl_path; twl4030_write(codec, TWL4030_REG_ANAMICL, reg | TWL4030_CNCL_OFFSET_START); @@ -718,9 +719,7 @@ static int aif_event(struct snd_soc_dapm_widget *w, static void headset_ramp(struct snd_soc_codec *codec, int ramp) { - struct snd_soc_device *socdev = codec->socdev; - struct twl4030_setup_data *setup = socdev->codec_data; - + struct twl4030_codec_audio_data *pdata = codec->dev->platform_data; unsigned char hs_gain, hs_pop; struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); /* Base values for ramp delay calculation: 2^19 - 2^26 */ @@ -732,9 +731,9 @@ static void headset_ramp(struct snd_soc_codec *codec, int ramp) /* Enable external mute control, this dramatically reduces * the pop-noise */ - if (setup && setup->hs_extmute) { - if (setup->set_hs_extmute) { - setup->set_hs_extmute(1); + if (pdata && pdata->hs_extmute) { + if (pdata->set_hs_extmute) { + pdata->set_hs_extmute(1); } else { hs_pop |= TWL4030_EXTMUTE; twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop); @@ -772,9 +771,9 @@ static void headset_ramp(struct snd_soc_codec *codec, int ramp) } /* Disable external mute */ - if (setup && setup->hs_extmute) { - if (setup->set_hs_extmute) { - setup->set_hs_extmute(0); + if (pdata && pdata->hs_extmute) { + if (pdata->set_hs_extmute) { + pdata->set_hs_extmute(0); } else { hs_pop &= ~TWL4030_EXTMUTE; twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop); @@ -1707,8 +1706,7 @@ static int twl4030_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); if (twl4030->master_substream) { @@ -1738,8 +1736,7 @@ static void twl4030_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); if (twl4030->master_substream == substream) @@ -1764,8 +1761,7 @@ static int twl4030_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); u8 mode, old_mode, format, old_format; @@ -1999,8 +1995,7 @@ static int twl4030_voice_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); u8 mode; @@ -2033,8 +2028,7 @@ static void twl4030_voice_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; /* Enable voice digital filters */ twl4030_voice_enable(codec, substream->stream, 0); @@ -2044,8 +2038,7 @@ static int twl4030_voice_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); u8 old_mode, mode; @@ -2175,7 +2168,7 @@ static int twl4030_voice_set_tristate(struct snd_soc_dai *dai, int tristate) #define TWL4030_RATES (SNDRV_PCM_RATE_8000_48000) #define TWL4030_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FORMAT_S24_LE) -static struct snd_soc_dai_ops twl4030_dai_ops = { +static struct snd_soc_dai_ops twl4030_dai_hifi_ops = { .startup = twl4030_startup, .shutdown = twl4030_shutdown, .hw_params = twl4030_hw_params, @@ -2193,9 +2186,9 @@ static struct snd_soc_dai_ops twl4030_dai_voice_ops = { .set_tristate = twl4030_voice_set_tristate, }; -struct snd_soc_dai twl4030_dai[] = { +static struct snd_soc_dai_driver twl4030_dai[] = { { - .name = "twl4030", + .name = "twl4030-hifi", .playback = { .stream_name = "HiFi Playback", .channels_min = 2, @@ -2208,10 +2201,10 @@ struct snd_soc_dai twl4030_dai[] = { .channels_max = 4, .rates = TWL4030_RATES, .formats = TWL4030_FORMATS,}, - .ops = &twl4030_dai_ops, + .ops = &twl4030_dai_hifi_ops, }, { - .name = "twl4030 Voice", + .name = "twl4030-voice", .playback = { .stream_name = "Voice Playback", .channels_min = 1, @@ -2227,164 +2220,90 @@ struct snd_soc_dai twl4030_dai[] = { .ops = &twl4030_dai_voice_ops, }, }; -EXPORT_SYMBOL_GPL(twl4030_dai); -static int twl4030_soc_suspend(struct platform_device *pdev, pm_message_t state) +static int twl4030_soc_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - twl4030_set_bias_level(codec, SND_SOC_BIAS_OFF); - return 0; } -static int twl4030_soc_resume(struct platform_device *pdev) +static int twl4030_soc_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - twl4030_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; } -static struct snd_soc_codec *twl4030_codec; - -static int twl4030_soc_probe(struct platform_device *pdev) +static int twl4030_soc_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret; - - BUG_ON(!twl4030_codec); - - codec = twl4030_codec; - socdev->card->codec = codec; - - twl4030_init_chip(pdev); + struct twl4030_priv *twl4030; - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(&pdev->dev, "failed to create pcms\n"); - return ret; + twl4030 = kzalloc(sizeof(struct twl4030_priv), GFP_KERNEL); + if (twl4030 == NULL) { + printk("Can not allocate memroy\n"); + return -ENOMEM; } + snd_soc_codec_set_drvdata(codec, twl4030); + /* Set the defaults, and power up the codec */ + twl4030->sysclk = twl4030_codec_get_mclk() / 1000; + codec->bias_level = SND_SOC_BIAS_OFF; + codec->idle_bias_off = 1; + + twl4030_init_chip(codec); snd_soc_add_controls(codec, twl4030_snd_controls, ARRAY_SIZE(twl4030_snd_controls)); twl4030_add_widgets(codec); - return 0; } -static int twl4030_soc_remove(struct platform_device *pdev) +static int twl4030_soc_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - /* Reset registers to their chip default before leaving */ - twl4030_reset_registers(codec); twl4030_set_bias_level(codec, SND_SOC_BIAS_OFF); - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - return 0; } +static struct snd_soc_codec_driver soc_codec_dev_twl4030 = { + .probe = twl4030_soc_probe, + .remove = twl4030_soc_remove, + .suspend = twl4030_soc_suspend, + .resume = twl4030_soc_resume, + .read = twl4030_read_reg_cache, + .write = twl4030_write, + .set_bias_level = twl4030_set_bias_level, + .reg_cache_size = sizeof(twl4030_reg), + .reg_word_size = sizeof(u8), + .reg_cache_default = twl4030_reg, +}; + static int __devinit twl4030_codec_probe(struct platform_device *pdev) { struct twl4030_codec_audio_data *pdata = pdev->dev.platform_data; - struct snd_soc_codec *codec; - struct twl4030_priv *twl4030; - int ret; if (!pdata) { dev_err(&pdev->dev, "platform_data is missing\n"); return -EINVAL; } - twl4030 = kzalloc(sizeof(struct twl4030_priv), GFP_KERNEL); - if (twl4030 == NULL) { - dev_err(&pdev->dev, "Can not allocate memroy\n"); - return -ENOMEM; - } - - codec = &twl4030->codec; - snd_soc_codec_set_drvdata(codec, twl4030); - codec->dev = &pdev->dev; - twl4030_dai[0].dev = &pdev->dev; - twl4030_dai[1].dev = &pdev->dev; - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - codec->name = "twl4030"; - codec->owner = THIS_MODULE; - codec->read = twl4030_read_reg_cache; - codec->write = twl4030_write; - codec->set_bias_level = twl4030_set_bias_level; - codec->idle_bias_off = 1; - codec->dai = twl4030_dai; - codec->num_dai = ARRAY_SIZE(twl4030_dai); - codec->reg_cache_size = sizeof(twl4030_reg); - codec->reg_cache = kmemdup(twl4030_reg, sizeof(twl4030_reg), - GFP_KERNEL); - if (codec->reg_cache == NULL) { - ret = -ENOMEM; - goto error_cache; - } - - platform_set_drvdata(pdev, twl4030); - twl4030_codec = codec; - - /* Set the defaults, and power up the codec */ - twl4030->sysclk = twl4030_codec_get_mclk() / 1000; - codec->bias_level = SND_SOC_BIAS_OFF; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto error_codec; - } - - ret = snd_soc_register_dais(&twl4030_dai[0], ARRAY_SIZE(twl4030_dai)); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAIs: %d\n", ret); - snd_soc_unregister_codec(codec); - goto error_codec; - } - - return 0; - -error_codec: - twl4030_codec_enable(codec, 0); - kfree(codec->reg_cache); -error_cache: - kfree(twl4030); - return ret; + return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_twl4030, + twl4030_dai, ARRAY_SIZE(twl4030_dai)); } static int __devexit twl4030_codec_remove(struct platform_device *pdev) { - struct twl4030_priv *twl4030 = platform_get_drvdata(pdev); + struct twl4030_priv *twl4030 = dev_get_drvdata(&pdev->dev); - snd_soc_unregister_dais(&twl4030_dai[0], ARRAY_SIZE(twl4030_dai)); - snd_soc_unregister_codec(&twl4030->codec); - kfree(twl4030->codec.reg_cache); + snd_soc_unregister_codec(&pdev->dev); kfree(twl4030); - - twl4030_codec = NULL; return 0; } -MODULE_ALIAS("platform:twl4030_codec_audio"); +MODULE_ALIAS("platform:twl4030-codec"); static struct platform_driver twl4030_codec_driver = { .probe = twl4030_codec_probe, .remove = __devexit_p(twl4030_codec_remove), .driver = { - .name = "twl4030_codec_audio", + .name = "twl4030-codec", .owner = THIS_MODULE, }, }; @@ -2401,14 +2320,6 @@ static void __exit twl4030_exit(void) } module_exit(twl4030_exit); -struct snd_soc_codec_device soc_codec_dev_twl4030 = { - .probe = twl4030_soc_probe, - .remove = twl4030_soc_remove, - .suspend = twl4030_soc_suspend, - .resume = twl4030_soc_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_twl4030); - MODULE_DESCRIPTION("ASoC TWL4030 codec driver"); MODULE_AUTHOR("Steve Sakoman"); MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/twl4030.h b/sound/soc/codecs/twl4030.h deleted file mode 100644 index 6c57430f6e24..000000000000 --- a/sound/soc/codecs/twl4030.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ALSA SoC TWL4030 codec driver - * - * Author: Steve Sakoman - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA - * - */ - -#ifndef __TWL4030_AUDIO_H__ -#define __TWL4030_AUDIO_H__ - -/* Register descriptions are here */ -#include - -/* Shadow register used by the audio driver */ -#define TWL4030_REG_SW_SHADOW 0x4A -#define TWL4030_CACHEREGNUM (TWL4030_REG_SW_SHADOW + 1) - -/* TWL4030_REG_SW_SHADOW (0x4A) Fields */ -#define TWL4030_HFL_EN 0x01 -#define TWL4030_HFR_EN 0x02 - -#define TWL4030_DAI_HIFI 0 -#define TWL4030_DAI_VOICE 1 - -extern struct snd_soc_dai twl4030_dai[2]; -extern struct snd_soc_codec_device soc_codec_dev_twl4030; - -struct twl4030_setup_data { - unsigned int ramp_delay_value; - unsigned int digimic_delay; /* in ms */ - unsigned int sysclk; - unsigned int offset_cncl_path; - unsigned int check_defaults:1; - unsigned int reset_registers:1; - unsigned int hs_extmute:1; - void (*set_hs_extmute)(int mute); -}; - -#endif /* End of __TWL4030_AUDIO_H__ */ - - diff --git a/sound/soc/codecs/twl6040.c b/sound/soc/codecs/twl6040.c index 64a807f1a8a1..10f6e5214511 100644 --- a/sound/soc/codecs/twl6040.c +++ b/sound/soc/codecs/twl6040.c @@ -45,7 +45,6 @@ /* codec private data */ struct twl6040_data { - struct snd_soc_codec codec; int audpwron; int naudint; int codec_powered; @@ -770,8 +769,7 @@ static int twl6040_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); if (!priv->sysclk) { @@ -803,8 +801,7 @@ static int twl6040_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); u8 lppllctl; int rate; @@ -839,8 +836,7 @@ static int twl6040_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); switch (cmd) { @@ -978,8 +974,8 @@ static struct snd_soc_dai_ops twl6040_dai_ops = { .set_sysclk = twl6040_set_dai_sysclk, }; -struct snd_soc_dai twl6040_dai = { - .name = "twl6040", +static struct snd_soc_dai_driver twl6040_dai = { + .name = "twl6040-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -996,24 +992,17 @@ struct snd_soc_dai twl6040_dai = { }, .ops = &twl6040_dai_ops, }; -EXPORT_SYMBOL_GPL(twl6040_dai); #ifdef CONFIG_PM -static int twl6040_suspend(struct platform_device *pdev, pm_message_t state) +static int twl6040_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - twl6040_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int twl6040_resume(struct platform_device *pdev) +static int twl6040_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - twl6040_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; @@ -1023,68 +1012,9 @@ static int twl6040_resume(struct platform_device *pdev) #define twl6040_resume NULL #endif -static struct snd_soc_codec *twl6040_codec; - -static int twl6040_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - BUG_ON(!twl6040_codec); - - codec = twl6040_codec; - socdev->card->codec = codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(&pdev->dev, "failed to create pcms\n"); - return ret; - } - - snd_soc_add_controls(codec, twl6040_snd_controls, - ARRAY_SIZE(twl6040_snd_controls)); - twl6040_add_widgets(codec); - - if (ret < 0) { - dev_err(&pdev->dev, "failed to register card\n"); - goto card_err; - } - - return ret; - -card_err: - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - return ret; -} - -static int twl6040_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - twl6040_set_bias_level(codec, SND_SOC_BIAS_OFF); - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - kfree(codec); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_twl6040 = { - .probe = twl6040_probe, - .remove = twl6040_remove, - .suspend = twl6040_suspend, - .resume = twl6040_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_twl6040); - -static int __devinit twl6040_codec_probe(struct platform_device *pdev) +static int twl6040_probe(struct snd_soc_codec *codec) { - struct twl4030_codec_data *twl_codec = pdev->dev.platform_data; - struct snd_soc_codec *codec; + struct twl4030_codec_data *twl_codec = codec->dev->platform_data; struct twl6040_data *priv; int audpwron, naudint; int ret = 0; @@ -1092,6 +1022,7 @@ static int __devinit twl6040_codec_probe(struct platform_device *pdev) priv = kzalloc(sizeof(struct twl6040_data), GFP_KERNEL); if (priv == NULL) return -ENOMEM; + snd_soc_codec_set_drvdata(codec, priv); if (twl_codec) { audpwron = twl_codec->audpwron_gpio; @@ -1104,29 +1035,6 @@ static int __devinit twl6040_codec_probe(struct platform_device *pdev) priv->audpwron = audpwron; priv->naudint = naudint; - codec = &priv->codec; - codec->dev = &pdev->dev; - twl6040_dai.dev = &pdev->dev; - - codec->name = "twl6040"; - codec->owner = THIS_MODULE; - codec->read = twl6040_read_reg_cache; - codec->write = twl6040_write; - codec->set_bias_level = twl6040_set_bias_level; - snd_soc_codec_set_drvdata(codec, priv); - codec->dai = &twl6040_dai; - codec->num_dai = 1; - codec->reg_cache_size = ARRAY_SIZE(twl6040_reg); - codec->reg_cache = kmemdup(twl6040_reg, sizeof(twl6040_reg), - GFP_KERNEL); - if (codec->reg_cache == NULL) { - ret = -ENOMEM; - goto cache_err; - } - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); init_completion(&priv->ready); if (gpio_is_valid(audpwron)) { @@ -1169,23 +1077,12 @@ static int __devinit twl6040_codec_probe(struct platform_device *pdev) if (ret) goto irq_err; - ret = snd_soc_register_codec(codec); - if (ret) - goto reg_err; - - twl6040_codec = codec; - - ret = snd_soc_register_dai(&twl6040_dai); - if (ret) - goto dai_err; + snd_soc_add_controls(codec, twl6040_snd_controls, + ARRAY_SIZE(twl6040_snd_controls)); + twl6040_add_widgets(codec); return 0; -dai_err: - snd_soc_unregister_codec(codec); - twl6040_codec = NULL; -reg_err: - twl6040_set_bias_level(codec, SND_SOC_BIAS_OFF); irq_err: if (naudint) free_irq(naudint, codec); @@ -1193,36 +1090,57 @@ gpio2_err: if (gpio_is_valid(audpwron)) gpio_free(audpwron); gpio1_err: - kfree(codec->reg_cache); -cache_err: kfree(priv); return ret; } -static int __devexit twl6040_codec_remove(struct platform_device *pdev) +static int twl6040_remove(struct snd_soc_codec *codec) { - struct twl6040_data *priv = snd_soc_codec_get_drvdata(twl6040_codec); + struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); int audpwron = priv->audpwron; int naudint = priv->naudint; + twl6040_set_bias_level(codec, SND_SOC_BIAS_OFF); + if (gpio_is_valid(audpwron)) gpio_free(audpwron); if (naudint) - free_irq(naudint, twl6040_codec); + free_irq(naudint, codec); - snd_soc_unregister_dai(&twl6040_dai); - snd_soc_unregister_codec(twl6040_codec); + kfree(priv); - kfree(twl6040_codec); - twl6040_codec = NULL; + return 0; +} +static struct snd_soc_codec_driver soc_codec_dev_twl6040 = { + .probe = twl6040_probe, + .remove = twl6040_remove, + .suspend = twl6040_suspend, + .resume = twl6040_resume, + .read = twl6040_read_reg_cache, + .write = twl6040_write, + .set_bias_level = twl6040_set_bias_level, + .reg_cache_size = ARRAY_SIZE(twl6040_reg), + .reg_word_size = sizeof(u8), + .reg_cache_default = twl6040_reg, +}; + +static int __devinit twl6040_codec_probe(struct platform_device *pdev) +{ + return snd_soc_register_codec(&pdev->dev, + &soc_codec_dev_twl6040, &twl6040_dai, 1); +} + +static int __devexit twl6040_codec_remove(struct platform_device *pdev) +{ + snd_soc_unregister_codec(&pdev->dev); return 0; } static struct platform_driver twl6040_codec_driver = { .driver = { - .name = "twl6040_codec", + .name = "twl6040-codec", .owner = THIS_MODULE, }, .probe = twl6040_codec_probe, diff --git a/sound/soc/codecs/twl6040.h b/sound/soc/codecs/twl6040.h index c472070a1da2..f7c77fa58a3c 100644 --- a/sound/soc/codecs/twl6040.h +++ b/sound/soc/codecs/twl6040.h @@ -135,7 +135,4 @@ #define TWL6040_HPPLL_ID 1 #define TWL6040_LPPLL_ID 2 -extern struct snd_soc_dai twl6040_dai; -extern struct snd_soc_codec_device soc_codec_dev_twl6040; - #endif /* End of __TWL6040_H__ */ diff --git a/sound/soc/codecs/uda134x.c b/sound/soc/codecs/uda134x.c index f3b4c1d6a82d..7540a509a6f5 100644 --- a/sound/soc/codecs/uda134x.c +++ b/sound/soc/codecs/uda134x.c @@ -161,8 +161,7 @@ static int uda134x_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec =rtd->codec; struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec); struct snd_pcm_runtime *master_runtime; @@ -194,8 +193,7 @@ static void uda134x_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec); if (uda134x->master_substream == substream) @@ -209,8 +207,7 @@ static int uda134x_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec); u8 hw_params; @@ -364,7 +361,7 @@ static int uda134x_set_bias_level(struct snd_soc_codec *codec, pd->power(1); /* Sync reg_cache with the hardware */ for (i = 0; i < ARRAY_SIZE(uda134x_reg); i++) - codec->write(codec, i, *cache++); + codec->driver->write(codec, i, *cache++); } break; case SND_SOC_BIAS_STANDBY: @@ -465,8 +462,8 @@ static struct snd_soc_dai_ops uda134x_dai_ops = { .set_fmt = uda134x_set_dai_fmt, }; -struct snd_soc_dai uda134x_dai = { - .name = "UDA134X", +static struct snd_soc_dai_driver uda134x_dai = { + .name = "uda134x-hifi", /* playback capabilities */ .playback = { .stream_name = "Playback", @@ -486,27 +483,21 @@ struct snd_soc_dai uda134x_dai = { /* pcm operations */ .ops = &uda134x_dai_ops, }; -EXPORT_SYMBOL(uda134x_dai); - -static int uda134x_soc_probe(struct platform_device *pdev) +static int uda134x_soc_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; struct uda134x_priv *uda134x; - void *codec_setup_data = socdev->codec_data; - int ret = -ENOMEM; - struct uda134x_platform_data *pd; + struct uda134x_platform_data *pd = dev_get_drvdata(codec->card->dev); + int ret; printk(KERN_INFO "UDA134X SoC Audio Codec\n"); - if (!codec_setup_data) { + if (!pd) { printk(KERN_ERR "UDA134X SoC codec: " "missing L3 bitbang function\n"); return -ENODEV; } - pd = codec_setup_data; switch (pd->model) { case UDA134X_UDA1340: case UDA134X_UDA1341: @@ -520,58 +511,22 @@ static int uda134x_soc_probe(struct platform_device *pdev) return -EINVAL; } - socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (socdev->card->codec == NULL) - return ret; - - codec = socdev->card->codec; - uda134x = kzalloc(sizeof(struct uda134x_priv), GFP_KERNEL); if (uda134x == NULL) - goto priv_err; + return -ENOMEM; snd_soc_codec_set_drvdata(codec, uda134x); - codec->reg_cache = kmemdup(uda134x_reg, sizeof(uda134x_reg), - GFP_KERNEL); - if (codec->reg_cache == NULL) - goto reg_err; - - mutex_init(&codec->mutex); - - codec->reg_cache_size = sizeof(uda134x_reg); - codec->reg_cache_step = 1; - - codec->name = "UDA134X"; - codec->owner = THIS_MODULE; - codec->dai = &uda134x_dai; - codec->num_dai = 1; - codec->read = uda134x_read_reg_cache; - codec->write = uda134x_write; - - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - codec->control_data = codec_setup_data; + codec->control_data = pd; if (pd->power) pd->power(1); uda134x_reset(codec); - if (pd->is_powered_on_standby) { - codec->set_bias_level = NULL; + if (pd->is_powered_on_standby) uda134x_set_bias_level(codec, SND_SOC_BIAS_ON); - } else { - codec->set_bias_level = uda134x_set_bias_level; + else uda134x_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - } - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - printk(KERN_ERR "UDA134X: failed to register pcms\n"); - goto pcm_err; - } switch (pd->model) { case UDA134X_UDA1340: @@ -590,61 +545,42 @@ static int uda134x_soc_probe(struct platform_device *pdev) default: printk(KERN_ERR "%s unknown codec type: %d", __func__, pd->model); - return -EINVAL; + kfree(uda134x); + return -EINVAL; } if (ret < 0) { printk(KERN_ERR "UDA134X: failed to register controls\n"); - goto pcm_err; + kfree(uda134x); + return ret; } return 0; - -pcm_err: - kfree(codec->reg_cache); -reg_err: - kfree(snd_soc_codec_get_drvdata(codec)); -priv_err: - kfree(codec); - return ret; } /* power down chip */ -static int uda134x_soc_remove(struct platform_device *pdev) +static int uda134x_soc_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; + struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec); uda134x_set_bias_level(codec, SND_SOC_BIAS_STANDBY); uda134x_set_bias_level(codec, SND_SOC_BIAS_OFF); - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - kfree(snd_soc_codec_get_drvdata(codec)); - kfree(codec->reg_cache); - kfree(codec); - + kfree(uda134x); return 0; } #if defined(CONFIG_PM) -static int uda134x_soc_suspend(struct platform_device *pdev, +static int uda134x_soc_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - uda134x_set_bias_level(codec, SND_SOC_BIAS_STANDBY); uda134x_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int uda134x_soc_resume(struct platform_device *pdev) +static int uda134x_soc_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - uda134x_set_bias_level(codec, SND_SOC_BIAS_PREPARE); uda134x_set_bias_level(codec, SND_SOC_BIAS_ON); return 0; @@ -654,25 +590,53 @@ static int uda134x_soc_resume(struct platform_device *pdev) #define uda134x_soc_resume NULL #endif /* CONFIG_PM */ -struct snd_soc_codec_device soc_codec_dev_uda134x = { +static struct snd_soc_codec_driver soc_codec_dev_uda134x = { .probe = uda134x_soc_probe, .remove = uda134x_soc_remove, .suspend = uda134x_soc_suspend, .resume = uda134x_soc_resume, + .reg_cache_size = sizeof(uda134x_reg), + .reg_word_size = sizeof(u8), + .reg_cache_step = 1, + .read = uda134x_read_reg_cache, + .write = uda134x_write, +#ifdef POWER_OFF_ON_STANDBY + .set_bias_level = uda134x_set_bias_level, +#endif +}; + +static int __devinit uda134x_codec_probe(struct platform_device *pdev) +{ + return snd_soc_register_codec(&pdev->dev, + &soc_codec_dev_uda134x, &uda134x_dai, 1); +} + +static int __devexit uda134x_codec_remove(struct platform_device *pdev) +{ + snd_soc_unregister_codec(&pdev->dev); + return 0; +} + +static struct platform_driver uda134x_codec_driver = { + .driver = { + .name = "uda134x-codec", + .owner = THIS_MODULE, + }, + .probe = uda134x_codec_probe, + .remove = __devexit_p(uda134x_codec_remove), }; -EXPORT_SYMBOL_GPL(soc_codec_dev_uda134x); -static int __init uda134x_init(void) +static int __init uda134x_codec_init(void) { - return snd_soc_register_dai(&uda134x_dai); + return platform_driver_register(&uda134x_codec_driver); } -module_init(uda134x_init); +module_init(uda134x_codec_init); -static void __exit uda134x_exit(void) +static void __exit uda134x_codec_exit(void) { - snd_soc_unregister_dai(&uda134x_dai); + platform_driver_unregister(&uda134x_codec_driver); } -module_exit(uda134x_exit); +module_exit(uda134x_codec_exit); MODULE_DESCRIPTION("UDA134X ALSA soc codec driver"); MODULE_AUTHOR("Zoltan Devai, Christian Pellegrin "); diff --git a/sound/soc/codecs/uda134x.h b/sound/soc/codecs/uda134x.h index 205f03b3eaf8..9faae06972b3 100644 --- a/sound/soc/codecs/uda134x.h +++ b/sound/soc/codecs/uda134x.h @@ -31,7 +31,4 @@ #define STATUS0_DAIFMT_MASK (~(7<<1)) #define STATUS0_SYSCLK_MASK (~(3<<4)) -extern struct snd_soc_dai uda134x_dai; -extern struct snd_soc_codec_device soc_codec_dev_uda134x; - #endif diff --git a/sound/soc/codecs/uda1380.c b/sound/soc/codecs/uda1380.c index 2f925a27dcde..1a51c816e542 100644 --- a/sound/soc/codecs/uda1380.c +++ b/sound/soc/codecs/uda1380.c @@ -33,11 +33,9 @@ #include "uda1380.h" -static struct snd_soc_codec *uda1380_codec; - /* codec private data */ struct uda1380_priv { - struct snd_soc_codec codec; + struct snd_soc_codec *codec; u16 reg_cache[UDA1380_CACHEREGNUM]; unsigned int dac_clk; struct work_struct work; @@ -135,6 +133,8 @@ static int uda1380_write(struct snd_soc_codec *codec, unsigned int reg, static void uda1380_flush_work(struct work_struct *work) { + struct uda1380_priv *uda1380 = container_of(work, struct uda1380_priv, work); + struct snd_soc_codec *uda1380_codec = uda1380->codec; int bit, reg; for_each_set_bit(bit, &uda1380_cache_dirty, UDA1380_CACHEREGNUM - 0x10) { @@ -145,6 +145,7 @@ static void uda1380_flush_work(struct work_struct *work) uda1380_read_reg_cache(uda1380_codec, reg)); clear_bit(bit, &uda1380_cache_dirty); } + } /* declarations of ALSA reg_elem_REAL controls */ @@ -474,8 +475,7 @@ static int uda1380_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec); int mixer = uda1380_read_reg_cache(codec, UDA1380_MIXER); @@ -501,8 +501,7 @@ static int uda1380_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; u16 clk = uda1380_read_reg_cache(codec, UDA1380_CLK); /* set WSPLL power and divider if running from this clock */ @@ -540,8 +539,7 @@ static void uda1380_pcm_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; u16 clk = uda1380_read_reg_cache(codec, UDA1380_CLK); /* shut down WSPLL power if running from this clock */ @@ -604,9 +602,9 @@ static struct snd_soc_dai_ops uda1380_dai_ops_capture = { .set_fmt = uda1380_set_dai_fmt_capture, }; -struct snd_soc_dai uda1380_dai[] = { +static struct snd_soc_dai_driver uda1380_dai[] = { { - .name = "UDA1380", + .name = "uda1380-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -622,7 +620,7 @@ struct snd_soc_dai uda1380_dai[] = { .ops = &uda1380_dai_ops, }, { /* playback only - dual interface */ - .name = "UDA1380", + .name = "uda1380-hifi-playback", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -633,7 +631,7 @@ struct snd_soc_dai uda1380_dai[] = { .ops = &uda1380_dai_ops_playback, }, { /* capture only - dual interface*/ - .name = "UDA1380", + .name = "uda1380-hifi-capture", .capture = { .stream_name = "Capture", .channels_min = 1, @@ -644,21 +642,15 @@ struct snd_soc_dai uda1380_dai[] = { .ops = &uda1380_dai_ops_capture, }, }; -EXPORT_SYMBOL_GPL(uda1380_dai); -static int uda1380_suspend(struct platform_device *pdev, pm_message_t state) +static int uda1380_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - uda1380_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int uda1380_resume(struct platform_device *pdev) +static int uda1380_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; int i; u8 data[2]; u16 *cache = codec->reg_cache; @@ -673,91 +665,20 @@ static int uda1380_resume(struct platform_device *pdev) return 0; } -static int uda1380_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - struct uda1380_platform_data *pdata; - int ret = 0; - - if (uda1380_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = uda1380_codec; - codec = uda1380_codec; - pdata = codec->dev->platform_data; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; - } - - /* power on device */ - uda1380_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - /* set clock input */ - switch (pdata->dac_clk) { - case UDA1380_DAC_CLK_SYSCLK: - uda1380_write(codec, UDA1380_CLK, 0); - break; - case UDA1380_DAC_CLK_WSPLL: - uda1380_write(codec, UDA1380_CLK, R00_DAC_CLK); - break; - } - - snd_soc_add_controls(codec, uda1380_snd_controls, - ARRAY_SIZE(uda1380_snd_controls)); - uda1380_add_widgets(codec); - - return ret; - -pcm_err: - return ret; -} - -/* power down chip */ -static int uda1380_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - if (codec->control_data) - uda1380_set_bias_level(codec, SND_SOC_BIAS_OFF); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_uda1380 = { - .probe = uda1380_probe, - .remove = uda1380_remove, - .suspend = uda1380_suspend, - .resume = uda1380_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_uda1380); - -static int uda1380_register(struct uda1380_priv *uda1380) +static int uda1380_probe(struct snd_soc_codec *codec) { - int ret, i; - struct snd_soc_codec *codec = &uda1380->codec; - struct uda1380_platform_data *pdata = codec->dev->platform_data; + struct uda1380_platform_data *pdata =codec->dev->platform_data; + struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec); + int ret; - if (uda1380_codec) { - dev_err(codec->dev, "Another UDA1380 is registered\n"); - return -EINVAL; - } + codec->hw_write = (hw_write_t)i2c_master_send; if (!pdata || !pdata->gpio_power || !pdata->gpio_reset) return -EINVAL; ret = gpio_request(pdata->gpio_power, "uda1380 power"); if (ret) - goto err_out; + return ret; ret = gpio_request(pdata->gpio_reset, "uda1380 reset"); if (ret) goto err_gpio; @@ -769,25 +690,6 @@ static int uda1380_register(struct uda1380_priv *uda1380) udelay(5); gpio_set_value(pdata->gpio_reset, 0); - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, uda1380); - codec->name = "UDA1380"; - codec->owner = THIS_MODULE; - codec->read = uda1380_read_reg_cache; - codec->write = uda1380_write; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = uda1380_set_bias_level; - codec->dai = uda1380_dai; - codec->num_dai = ARRAY_SIZE(uda1380_dai); - codec->reg_cache_size = ARRAY_SIZE(uda1380_reg); - codec->reg_cache = &uda1380->reg_cache; - codec->reg_cache_step = 1; - - memcpy(codec->reg_cache, uda1380_reg, sizeof(uda1380_reg)); - ret = uda1380_reset(codec); if (ret < 0) { dev_err(codec->dev, "Failed to issue reset\n"); @@ -796,83 +698,84 @@ static int uda1380_register(struct uda1380_priv *uda1380) INIT_WORK(&uda1380->work, uda1380_flush_work); - for (i = 0; i < ARRAY_SIZE(uda1380_dai); i++) - uda1380_dai[i].dev = codec->dev; - - uda1380_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err_reset; + /* power on device */ + uda1380_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + /* set clock input */ + switch (pdata->dac_clk) { + case UDA1380_DAC_CLK_SYSCLK: + uda1380_write(codec, UDA1380_CLK, 0); + break; + case UDA1380_DAC_CLK_WSPLL: + uda1380_write(codec, UDA1380_CLK, R00_DAC_CLK); + break; } - ret = snd_soc_register_dais(uda1380_dai, ARRAY_SIZE(uda1380_dai)); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAIs: %d\n", ret); - goto err_dai; - } + snd_soc_add_controls(codec, uda1380_snd_controls, + ARRAY_SIZE(uda1380_snd_controls)); + uda1380_add_widgets(codec); return 0; -err_dai: - snd_soc_unregister_codec(codec); err_reset: gpio_set_value(pdata->gpio_power, 0); gpio_free(pdata->gpio_reset); err_gpio: gpio_free(pdata->gpio_power); -err_out: return ret; } -static void uda1380_unregister(struct uda1380_priv *uda1380) +/* power down chip */ +static int uda1380_remove(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = &uda1380->codec; - struct uda1380_platform_data *pdata = codec->dev->platform_data; + struct uda1380_platform_data *pdata =codec->dev->platform_data; - snd_soc_unregister_dais(uda1380_dai, ARRAY_SIZE(uda1380_dai)); - snd_soc_unregister_codec(&uda1380->codec); + uda1380_set_bias_level(codec, SND_SOC_BIAS_OFF); gpio_set_value(pdata->gpio_power, 0); gpio_free(pdata->gpio_reset); gpio_free(pdata->gpio_power); - kfree(uda1380); - uda1380_codec = NULL; + return 0; } +static struct snd_soc_codec_driver soc_codec_dev_uda1380 = { + .probe = uda1380_probe, + .remove = uda1380_remove, + .suspend = uda1380_suspend, + .resume = uda1380_resume, + .read = uda1380_read_reg_cache, + .write = uda1380_write, + .set_bias_level = uda1380_set_bias_level, + .reg_cache_size = ARRAY_SIZE(uda1380_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = uda1380_reg, + .reg_cache_step = 1, +}; + #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) static __devinit int uda1380_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct uda1380_priv *uda1380; - struct snd_soc_codec *codec; int ret; uda1380 = kzalloc(sizeof(struct uda1380_priv), GFP_KERNEL); if (uda1380 == NULL) return -ENOMEM; - codec = &uda1380->codec; - codec->hw_write = (hw_write_t)i2c_master_send; - i2c_set_clientdata(i2c, uda1380); - codec->control_data = i2c; - - codec->dev = &i2c->dev; - ret = uda1380_register(uda1380); - if (ret != 0) + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_uda1380, uda1380_dai, ARRAY_SIZE(uda1380_dai)); + if (ret < 0) kfree(uda1380); - return ret; } static int __devexit uda1380_i2c_remove(struct i2c_client *i2c) { - struct uda1380_priv *uda1380 = i2c_get_clientdata(i2c); - uda1380_unregister(uda1380); + snd_soc_unregister_codec(&i2c->dev); + kfree(i2c_get_clientdata(i2c)); return 0; } @@ -884,7 +787,7 @@ MODULE_DEVICE_TABLE(i2c, uda1380_i2c_id); static struct i2c_driver uda1380_i2c_driver = { .driver = { - .name = "UDA1380 I2C Codec", + .name = "uda1380-codec", .owner = THIS_MODULE, }, .probe = uda1380_i2c_probe, diff --git a/sound/soc/codecs/uda1380.h b/sound/soc/codecs/uda1380.h index 9cefa8a54770..942e3927c72b 100644 --- a/sound/soc/codecs/uda1380.h +++ b/sound/soc/codecs/uda1380.h @@ -76,7 +76,4 @@ #define UDA1380_DAI_PLAYBACK 1 /* playback DAI */ #define UDA1380_DAI_CAPTURE 2 /* capture DAI */ -extern struct snd_soc_dai uda1380_dai[3]; -extern struct snd_soc_codec_device soc_codec_dev_uda1380; - #endif /* _UDA1380_H */ diff --git a/sound/soc/codecs/wm2000.h b/sound/soc/codecs/wm2000.h index c18e261c3c7f..0b6f056f73cc 100644 --- a/sound/soc/codecs/wm2000.h +++ b/sound/soc/codecs/wm2000.h @@ -16,9 +16,6 @@ struct wm2000_setup_data { extern int wm2000_add_controls(struct snd_soc_codec *codec); -extern struct snd_soc_dai wm2000_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm2000; - #define WM2000_REG_SYS_START 0x8000 #define WM2000_REG_SPEECH_CLARITY 0x8fef #define WM2000_REG_SYS_WATCHDOG 0x8ff6 diff --git a/sound/soc/codecs/wm8350.c b/sound/soc/codecs/wm8350.c index 0221ca79b3ae..f4f1fba38eb9 100644 --- a/sound/soc/codecs/wm8350.c +++ b/sound/soc/codecs/wm8350.c @@ -1321,20 +1321,14 @@ static int wm8350_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int wm8350_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8350_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8350_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8350_resume(struct platform_device *pdev) +static int wm8350_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8350_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; @@ -1489,24 +1483,74 @@ int wm8350_mic_jack_detect(struct snd_soc_codec *codec, } EXPORT_SYMBOL_GPL(wm8350_mic_jack_detect); -static struct snd_soc_codec *wm8350_codec; +#define WM8350_RATES (SNDRV_PCM_RATE_8000_96000) + +#define WM8350_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ + SNDRV_PCM_FMTBIT_S20_3LE |\ + SNDRV_PCM_FMTBIT_S24_LE) + +static struct snd_soc_dai_ops wm8350_dai_ops = { + .hw_params = wm8350_pcm_hw_params, + .digital_mute = wm8350_mute, + .trigger = wm8350_pcm_trigger, + .set_fmt = wm8350_set_dai_fmt, + .set_sysclk = wm8350_set_dai_sysclk, + .set_pll = wm8350_set_fll, + .set_clkdiv = wm8350_set_clkdiv, +}; + +static struct snd_soc_dai_driver wm8350_dai = { + .name = "wm8350-hifi", + .playback = { + .stream_name = "Playback", + .channels_min = 1, + .channels_max = 2, + .rates = WM8350_RATES, + .formats = WM8350_FORMATS, + }, + .capture = { + .stream_name = "Capture", + .channels_min = 1, + .channels_max = 2, + .rates = WM8350_RATES, + .formats = WM8350_FORMATS, + }, + .ops = &wm8350_dai_ops, +}; -static int wm8350_probe(struct platform_device *pdev) +static int wm8350_codec_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - struct wm8350 *wm8350; + struct wm8350 *wm8350 = dev_get_platdata(codec->dev); struct wm8350_data *priv; - int ret; struct wm8350_output *out1; struct wm8350_output *out2; + int ret, i; - BUG_ON(!wm8350_codec); + if (wm8350->codec.platform_data == NULL) { + dev_err(codec->dev, "No audio platform data supplied\n"); + return -EINVAL; + } + + priv = kzalloc(sizeof(struct wm8350_data), GFP_KERNEL); + if (priv == NULL) + return -ENOMEM; + snd_soc_codec_set_drvdata(codec, priv); + + for (i = 0; i < ARRAY_SIZE(supply_names); i++) + priv->supplies[i].supply = supply_names[i]; + + ret = regulator_bulk_get(wm8350->dev, ARRAY_SIZE(priv->supplies), + priv->supplies); + if (ret != 0) + goto err_priv; + + wm8350->codec.codec = codec; + codec->control_data = wm8350; - socdev->card->codec = wm8350_codec; - codec = socdev->card->codec; - wm8350 = codec->control_data; - priv = snd_soc_codec_get_drvdata(codec); + /* Put the codec into reset if it wasn't already */ + wm8350_clear_bits(wm8350, WM8350_POWER_MGMT_5, WM8350_CODEC_ENA); + + INIT_DELAYED_WORK(&codec->delayed_work, wm8350_pga_work); /* Enable the codec */ wm8350_set_bits(wm8350, WM8350_POWER_MGMT_5, WM8350_CODEC_ENA); @@ -1557,11 +1601,6 @@ static int wm8350_probe(struct platform_device *pdev) wm8350_register_irq(wm8350, WM8350_IRQ_CODEC_MICD, wm8350_mic_handler, 0, "Microphone detect", priv); - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(&pdev->dev, "failed to create pcms\n"); - return ret; - } snd_soc_add_controls(codec, wm8350_snd_controls, ARRAY_SIZE(wm8350_snd_controls)); @@ -1570,14 +1609,16 @@ static int wm8350_probe(struct platform_device *pdev) wm8350_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; + +err_priv: + kfree(priv); + return ret; } -static int wm8350_remove(struct platform_device *pdev) +static int wm8350_codec_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - struct wm8350 *wm8350 = codec->control_data; struct wm8350_data *priv = snd_soc_codec_get_drvdata(codec); + struct wm8350 *wm8350 = dev_get_platdata(codec->dev); int ret; wm8350_clear_bits(wm8350, WM8350_JACK_DETECT, @@ -1607,134 +1648,30 @@ static int wm8350_remove(struct platform_device *pdev) wm8350_clear_bits(wm8350, WM8350_POWER_MGMT_5, WM8350_CODEC_ENA); + regulator_bulk_free(ARRAY_SIZE(priv->supplies), priv->supplies); + kfree(priv); return 0; } -#define WM8350_RATES (SNDRV_PCM_RATE_8000_96000) - -#define WM8350_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ - SNDRV_PCM_FMTBIT_S20_3LE |\ - SNDRV_PCM_FMTBIT_S24_LE) - -static struct snd_soc_dai_ops wm8350_dai_ops = { - .hw_params = wm8350_pcm_hw_params, - .digital_mute = wm8350_mute, - .trigger = wm8350_pcm_trigger, - .set_fmt = wm8350_set_dai_fmt, - .set_sysclk = wm8350_set_dai_sysclk, - .set_pll = wm8350_set_fll, - .set_clkdiv = wm8350_set_clkdiv, -}; - -struct snd_soc_dai wm8350_dai = { - .name = "WM8350", - .playback = { - .stream_name = "Playback", - .channels_min = 1, - .channels_max = 2, - .rates = WM8350_RATES, - .formats = WM8350_FORMATS, - }, - .capture = { - .stream_name = "Capture", - .channels_min = 1, - .channels_max = 2, - .rates = WM8350_RATES, - .formats = WM8350_FORMATS, - }, - .ops = &wm8350_dai_ops, -}; -EXPORT_SYMBOL_GPL(wm8350_dai); - -struct snd_soc_codec_device soc_codec_dev_wm8350 = { - .probe = wm8350_probe, - .remove = wm8350_remove, +static struct snd_soc_codec_driver soc_codec_dev_wm8350 = { + .probe = wm8350_codec_probe, + .remove = wm8350_codec_remove, .suspend = wm8350_suspend, .resume = wm8350_resume, + .read = wm8350_codec_read, + .write = wm8350_codec_write, + .set_bias_level = wm8350_set_bias_level, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8350); -static __devinit int wm8350_codec_probe(struct platform_device *pdev) +static int __devinit wm8350_probe(struct platform_device *pdev) { - struct wm8350 *wm8350 = platform_get_drvdata(pdev); - struct wm8350_data *priv; - struct snd_soc_codec *codec; - int ret, i; - - if (wm8350->codec.platform_data == NULL) { - dev_err(&pdev->dev, "No audio platform data supplied\n"); - return -EINVAL; - } - - priv = kzalloc(sizeof(struct wm8350_data), GFP_KERNEL); - if (priv == NULL) - return -ENOMEM; - - for (i = 0; i < ARRAY_SIZE(supply_names); i++) - priv->supplies[i].supply = supply_names[i]; - - ret = regulator_bulk_get(wm8350->dev, ARRAY_SIZE(priv->supplies), - priv->supplies); - if (ret != 0) - goto err_priv; - - codec = &priv->codec; - wm8350->codec.codec = codec; - - wm8350_dai.dev = &pdev->dev; - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - codec->dev = &pdev->dev; - codec->name = "WM8350"; - codec->owner = THIS_MODULE; - codec->read = wm8350_codec_read; - codec->write = wm8350_codec_write; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8350_set_bias_level; - codec->dai = &wm8350_dai; - codec->num_dai = 1; - codec->reg_cache_size = WM8350_MAX_REGISTER; - snd_soc_codec_set_drvdata(codec, priv); - codec->control_data = wm8350; - - /* Put the codec into reset if it wasn't already */ - wm8350_clear_bits(wm8350, WM8350_POWER_MGMT_5, WM8350_CODEC_ENA); - - INIT_DELAYED_WORK(&codec->delayed_work, wm8350_pga_work); - ret = snd_soc_register_codec(codec); - if (ret != 0) - goto err_supply; - - wm8350_codec = codec; - - ret = snd_soc_register_dai(&wm8350_dai); - if (ret != 0) - goto err_codec; - return 0; - -err_codec: - snd_soc_unregister_codec(codec); -err_supply: - regulator_bulk_free(ARRAY_SIZE(priv->supplies), priv->supplies); -err_priv: - kfree(priv); - wm8350_codec = NULL; - return ret; + return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8350, + &wm8350_dai, 1); } -static int __devexit wm8350_codec_remove(struct platform_device *pdev) +static int __devexit wm8350_remove(struct platform_device *pdev) { - struct wm8350 *wm8350 = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = wm8350->codec.codec; - struct wm8350_data *priv = snd_soc_codec_get_drvdata(codec); - - snd_soc_unregister_dai(&wm8350_dai); - snd_soc_unregister_codec(codec); - regulator_bulk_free(ARRAY_SIZE(priv->supplies), priv->supplies); - kfree(priv); - wm8350_codec = NULL; + snd_soc_unregister_codec(&pdev->dev); return 0; } @@ -1743,8 +1680,8 @@ static struct platform_driver wm8350_codec_driver = { .name = "wm8350-codec", .owner = THIS_MODULE, }, - .probe = wm8350_codec_probe, - .remove = __devexit_p(wm8350_codec_remove), + .probe = wm8350_probe, + .remove = __devexit_p(wm8350_remove), }; static __init int wm8350_init(void) diff --git a/sound/soc/codecs/wm8350.h b/sound/soc/codecs/wm8350.h index 9ed0467c71db..74108eb82938 100644 --- a/sound/soc/codecs/wm8350.h +++ b/sound/soc/codecs/wm8350.h @@ -15,9 +15,6 @@ #include #include -extern struct snd_soc_dai wm8350_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8350; - enum wm8350_jack { WM8350_JDL = 1, WM8350_JDR = 2, diff --git a/sound/soc/codecs/wm8400.c b/sound/soc/codecs/wm8400.c index 8f294066b0ed..850299786e02 100644 --- a/sound/soc/codecs/wm8400.c +++ b/sound/soc/codecs/wm8400.c @@ -65,7 +65,7 @@ static struct regulator_bulk_data power[] = { /* codec private data */ struct wm8400_priv { - struct snd_soc_codec codec; + struct snd_soc_codec *codec; struct wm8400 *wm8400; u16 fake_register; unsigned int sysclk; @@ -1163,8 +1163,7 @@ static int wm8400_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; u16 audio1 = wm8400_read(codec, WM8400_AUDIO_INTERFACE_1); audio1 &= ~WM8400_AIF_WL_MASK; @@ -1332,10 +1331,9 @@ static struct snd_soc_dai_ops wm8400_dai_ops = { * 1. ADC/DAC on Primary Interface * 2. ADC on Primary Interface/DAC on secondary */ -struct snd_soc_dai wm8400_dai = { +static struct snd_soc_dai_driver wm8400_dai = { /* ADC/DAC on primary */ - .name = "WM8400 ADC/DAC Primary", - .id = 1, + .name = "wm8400-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -1352,147 +1350,53 @@ struct snd_soc_dai wm8400_dai = { }, .ops = &wm8400_dai_ops, }; -EXPORT_SYMBOL_GPL(wm8400_dai); -static int wm8400_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8400_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8400_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8400_resume(struct platform_device *pdev) +static int wm8400_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8400_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; } -static struct snd_soc_codec *wm8400_codec; - -static int wm8400_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret; - - if (!wm8400_codec) { - dev_err(&pdev->dev, "wm8400 not yet discovered\n"); - return -ENODEV; - } - codec = wm8400_codec; - - socdev->card->codec = codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(&pdev->dev, "failed to create pcms\n"); - goto pcm_err; - } - - wm8400_add_controls(codec); - wm8400_add_widgets(codec); - -pcm_err: - return ret; -} - -/* power down chip */ -static int wm8400_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8400 = { - .probe = wm8400_probe, - .remove = wm8400_remove, - .suspend = wm8400_suspend, - .resume = wm8400_resume, -}; - static void wm8400_probe_deferred(struct work_struct *work) { struct wm8400_priv *priv = container_of(work, struct wm8400_priv, work); - struct snd_soc_codec *codec = &priv->codec; - int ret; + struct snd_soc_codec *codec = priv->codec; /* charge output caps */ wm8400_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - - /* We're done, tell the subsystem. */ - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(priv->wm8400->dev, - "Failed to register codec: %d\n", ret); - goto err; - } - - ret = snd_soc_register_dai(&wm8400_dai); - if (ret != 0) { - dev_err(priv->wm8400->dev, - "Failed to register DAI: %d\n", ret); - goto err_codec; - } - - return; - -err_codec: - snd_soc_unregister_codec(codec); -err: - wm8400_set_bias_level(codec, SND_SOC_BIAS_OFF); } -static int wm8400_codec_probe(struct platform_device *dev) +static int wm8400_codec_probe(struct snd_soc_codec *codec) { + struct wm8400 *wm8400 = dev_get_platdata(codec->dev); struct wm8400_priv *priv; int ret; u16 reg; - struct snd_soc_codec *codec; priv = kzalloc(sizeof(struct wm8400_priv), GFP_KERNEL); if (priv == NULL) return -ENOMEM; - codec = &priv->codec; snd_soc_codec_set_drvdata(codec, priv); - codec->control_data = dev_get_drvdata(&dev->dev); - priv->wm8400 = dev_get_drvdata(&dev->dev); + codec->control_data = priv->wm8400 = wm8400; + priv->codec = codec; - ret = regulator_bulk_get(priv->wm8400->dev, + ret = regulator_bulk_get(wm8400->dev, ARRAY_SIZE(power), &power[0]); if (ret != 0) { - dev_err(&dev->dev, "Failed to get regulators: %d\n", ret); + dev_err(codec->dev, "Failed to get regulators: %d\n", ret); goto err; } - codec->dev = &dev->dev; - wm8400_dai.dev = &dev->dev; - - codec->name = "WM8400"; - codec->owner = THIS_MODULE; - codec->read = wm8400_read; - codec->write = wm8400_write; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8400_set_bias_level; - codec->dai = &wm8400_dai; - codec->num_dai = 1; - codec->reg_cache_size = WM8400_REGISTER_COUNT; - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); INIT_WORK(&priv->work, wm8400_probe_deferred); wm8400_codec_reset(codec); @@ -1511,65 +1415,78 @@ static int wm8400_codec_probe(struct platform_device *dev) wm8400_write(codec, WM8400_LEFT_OUTPUT_VOLUME, 0x50 | (1<<8)); wm8400_write(codec, WM8400_RIGHT_OUTPUT_VOLUME, 0x50 | (1<<8)); - wm8400_codec = codec; - if (!schedule_work(&priv->work)) { ret = -EINVAL; goto err_regulator; } - + wm8400_add_controls(codec); + wm8400_add_widgets(codec); return 0; err_regulator: - wm8400_codec = NULL; regulator_bulk_free(ARRAY_SIZE(power), power); err: kfree(priv); return ret; } -static int __exit wm8400_codec_remove(struct platform_device *dev) +static int wm8400_codec_remove(struct snd_soc_codec *codec) { - struct wm8400_priv *priv = snd_soc_codec_get_drvdata(wm8400_codec); + struct wm8400_priv *priv = snd_soc_codec_get_drvdata(codec); u16 reg; - snd_soc_unregister_dai(&wm8400_dai); - snd_soc_unregister_codec(wm8400_codec); - - reg = wm8400_read(wm8400_codec, WM8400_POWER_MANAGEMENT_1); - wm8400_write(wm8400_codec, WM8400_POWER_MANAGEMENT_1, + reg = wm8400_read(codec, WM8400_POWER_MANAGEMENT_1); + wm8400_write(codec, WM8400_POWER_MANAGEMENT_1, reg & (~WM8400_CODEC_ENA)); regulator_bulk_free(ARRAY_SIZE(power), power); kfree(priv); - wm8400_codec = NULL; + return 0; +} + +static struct snd_soc_codec_driver soc_codec_dev_wm8400 = { + .probe = wm8400_codec_probe, + .remove = wm8400_codec_remove, + .suspend = wm8400_suspend, + .resume = wm8400_resume, + .read = wm8400_read, + .write = wm8400_write, + .set_bias_level = wm8400_set_bias_level, +}; + +static int __devinit wm8400_probe(struct platform_device *pdev) +{ + return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8400, + &wm8400_dai, 1); +} +static int __devexit wm8400_remove(struct platform_device *pdev) +{ + snd_soc_unregister_codec(&pdev->dev); return 0; } static struct platform_driver wm8400_codec_driver = { .driver = { - .name = "wm8400-codec", - .owner = THIS_MODULE, - }, - .probe = wm8400_codec_probe, - .remove = __exit_p(wm8400_codec_remove), + .name = "wm8400-codec", + .owner = THIS_MODULE, + }, + .probe = wm8400_probe, + .remove = __devexit_p(wm8400_remove), }; -static int __init wm8400_codec_init(void) +static __init int wm8400_init(void) { return platform_driver_register(&wm8400_codec_driver); } -module_init(wm8400_codec_init); +module_init(wm8400_init); -static void __exit wm8400_codec_exit(void) +static __exit void wm8400_exit(void) { platform_driver_unregister(&wm8400_codec_driver); } -module_exit(wm8400_codec_exit); - -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8400); +module_exit(wm8400_exit); MODULE_DESCRIPTION("ASoC WM8400 driver"); MODULE_AUTHOR("Mark Brown"); diff --git a/sound/soc/codecs/wm8400.h b/sound/soc/codecs/wm8400.h index 79c5934d4776..521adb193870 100644 --- a/sound/soc/codecs/wm8400.h +++ b/sound/soc/codecs/wm8400.h @@ -56,7 +56,4 @@ #define WM8400_BCLK_DIV_44 (0xE << 1) #define WM8400_BCLK_DIV_48 (0xF << 1) -extern struct snd_soc_dai wm8400_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8400; - #endif diff --git a/sound/soc/codecs/wm8510.c b/sound/soc/codecs/wm8510.c index 0f7bcb61071a..dbfa05d2cb92 100644 --- a/sound/soc/codecs/wm8510.c +++ b/sound/soc/codecs/wm8510.c @@ -31,8 +31,6 @@ #define WM8510_VERSION "0.6" -struct snd_soc_codec_device soc_codec_dev_wm8510; - /* * wm8510 register cache * We can't read the WM8510 register space when we are @@ -61,6 +59,12 @@ static const u16 wm8510_reg[WM8510_CACHEREGNUM] = { #define wm8510_reset(c) snd_soc_write(c, WM8510_RESET, 0) +/* codec private data */ +struct wm8510_priv { + enum snd_soc_control_type control_type; + void *control_data; +}; + static const char *wm8510_companding[] = { "Off", "NC", "u-law", "A-law" }; static const char *wm8510_deemp[] = { "None", "32kHz", "44.1kHz", "48kHz" }; static const char *wm8510_alc[] = { "ALC", "Limiter" }; @@ -403,8 +407,7 @@ static int wm8510_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; u16 iface = snd_soc_read(codec, WM8510_IFACE) & 0x19f; u16 adn = snd_soc_read(codec, WM8510_ADD) & 0x1f1; @@ -514,8 +517,8 @@ static struct snd_soc_dai_ops wm8510_dai_ops = { .set_pll = wm8510_set_dai_pll, }; -struct snd_soc_dai wm8510_dai = { - .name = "WM8510 HiFi", +static struct snd_soc_dai_driver wm8510_dai = { + .name = "wm8510-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, @@ -531,21 +534,15 @@ struct snd_soc_dai wm8510_dai = { .ops = &wm8510_dai_ops, .symmetric_rates = 1, }; -EXPORT_SYMBOL_GPL(wm8510_dai); -static int wm8510_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8510_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8510_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8510_resume(struct platform_device *pdev) +static int wm8510_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; int i; u8 data[2]; u16 *cache = codec->reg_cache; @@ -561,43 +558,22 @@ static int wm8510_resume(struct platform_device *pdev) return 0; } -/* - * initialise the WM8510 driver - * register the mixer and dsp interfaces with the kernel - */ -static int wm8510_init(struct snd_soc_device *socdev, - enum snd_soc_control_type control) +static int wm8510_probe(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = socdev->card->codec; - int ret = 0; - - codec->name = "WM8510"; - codec->owner = THIS_MODULE; - codec->set_bias_level = wm8510_set_bias_level; - codec->dai = &wm8510_dai; - codec->num_dai = 1; - codec->reg_cache_size = ARRAY_SIZE(wm8510_reg); - codec->reg_cache = kmemdup(wm8510_reg, sizeof(wm8510_reg), GFP_KERNEL); + struct wm8510_priv *wm8510 = snd_soc_codec_get_drvdata(codec); + int ret; - if (codec->reg_cache == NULL) - return -ENOMEM; + pr_info("WM8510 Audio Codec %s", WM8510_VERSION); - ret = snd_soc_codec_set_cache_io(codec, 7, 9, control); + codec->control_data = wm8510->control_data; + ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8510->control_type); if (ret < 0) { - printk(KERN_ERR "wm8510: failed to set cache I/O: %d\n", - ret); - goto err; + printk(KERN_ERR "wm8510: failed to set cache I/O: %d\n", ret); + return ret; } wm8510_reset(codec); - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - printk(KERN_ERR "wm8510: failed to create pcms\n"); - goto err; - } - /* power on device */ codec->bias_level = SND_SOC_BIAS_OFF; wm8510_set_bias_level(codec, SND_SOC_BIAS_STANDBY); @@ -606,119 +582,53 @@ static int wm8510_init(struct snd_soc_device *socdev, wm8510_add_widgets(codec); return ret; - -err: - kfree(codec->reg_cache); - return ret; } -static struct snd_soc_device *wm8510_socdev; - -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - -/* - * WM8510 2 wire address is 0x1a - */ - -static int wm8510_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) +/* power down chip */ +static int wm8510_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = wm8510_socdev; - struct snd_soc_codec *codec = socdev->card->codec; - int ret; - - i2c_set_clientdata(i2c, codec); - codec->control_data = i2c; - - ret = wm8510_init(socdev, SND_SOC_I2C); - if (ret < 0) - pr_err("failed to initialise WM8510\n"); - - return ret; -} + struct wm8510_priv *wm8510 = snd_soc_codec_get_drvdata(codec); -static int wm8510_i2c_remove(struct i2c_client *client) -{ - struct snd_soc_codec *codec = i2c_get_clientdata(client); - kfree(codec->reg_cache); + wm8510_set_bias_level(codec, SND_SOC_BIAS_OFF); + kfree(wm8510); return 0; } -static const struct i2c_device_id wm8510_i2c_id[] = { - { "wm8510", 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, wm8510_i2c_id); - -static struct i2c_driver wm8510_i2c_driver = { - .driver = { - .name = "WM8510 I2C Codec", - .owner = THIS_MODULE, - }, - .probe = wm8510_i2c_probe, - .remove = wm8510_i2c_remove, - .id_table = wm8510_i2c_id, +static struct snd_soc_codec_driver soc_codec_dev_wm8510 = { + .probe = wm8510_probe, + .remove = wm8510_remove, + .suspend = wm8510_suspend, + .resume = wm8510_resume, + .set_bias_level = wm8510_set_bias_level, + .reg_cache_size = ARRAY_SIZE(wm8510_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default =wm8510_reg, }; -static int wm8510_add_i2c_device(struct platform_device *pdev, - const struct wm8510_setup_data *setup) -{ - struct i2c_board_info info; - struct i2c_adapter *adapter; - struct i2c_client *client; - int ret; - - ret = i2c_add_driver(&wm8510_i2c_driver); - if (ret != 0) { - dev_err(&pdev->dev, "can't add i2c driver\n"); - return ret; - } - - memset(&info, 0, sizeof(struct i2c_board_info)); - info.addr = setup->i2c_address; - strlcpy(info.type, "wm8510", I2C_NAME_SIZE); - - adapter = i2c_get_adapter(setup->i2c_bus); - if (!adapter) { - dev_err(&pdev->dev, "can't get i2c adapter %d\n", - setup->i2c_bus); - goto err_driver; - } - - client = i2c_new_device(adapter, &info); - i2c_put_adapter(adapter); - if (!client) { - dev_err(&pdev->dev, "can't add i2c device at 0x%x\n", - (unsigned int)info.addr); - goto err_driver; - } - - return 0; - -err_driver: - i2c_del_driver(&wm8510_i2c_driver); - return -ENODEV; -} -#endif - #if defined(CONFIG_SPI_MASTER) static int __devinit wm8510_spi_probe(struct spi_device *spi) { - struct snd_soc_device *socdev = wm8510_socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct wm8510_priv *wm8510; int ret; - codec->control_data = spi; + wm8510 = kzalloc(sizeof(struct wm8510_priv), GFP_KERNEL); + if (wm8510 == NULL) + return -ENOMEM; + + wm8510->control_data = spi; + wm8510->control_type = SND_SOC_SPI; + spi_set_drvdata(spi, wm8510); - ret = wm8510_init(socdev, SND_SOC_SPI); + ret = snd_soc_register_codec(&spi->dev, + &soc_codec_dev_wm8510, &wm8510_dai, 1); if (ret < 0) - dev_err(&spi->dev, "failed to initialise WM8510\n"); - + kfree(wm8510); return ret; } static int __devexit wm8510_spi_remove(struct spi_device *spi) { + snd_soc_unregister_codec(&spi->dev); return 0; } @@ -733,84 +643,80 @@ static struct spi_driver wm8510_spi_driver = { }; #endif /* CONFIG_SPI_MASTER */ -static int wm8510_probe(struct platform_device *pdev) +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +static __devinit int wm8510_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct wm8510_setup_data *setup; - struct snd_soc_codec *codec; - int ret = 0; - - pr_info("WM8510 Audio Codec %s", WM8510_VERSION); + struct wm8510_priv *wm8510; + int ret; - setup = socdev->codec_data; - codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (codec == NULL) + wm8510 = kzalloc(sizeof(struct wm8510_priv), GFP_KERNEL); + if (wm8510 == NULL) return -ENOMEM; - socdev->card->codec = codec; - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); + i2c_set_clientdata(i2c, wm8510); + wm8510->control_data = i2c; + wm8510->control_type = SND_SOC_I2C; - wm8510_socdev = socdev; -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - if (setup->i2c_address) { - ret = wm8510_add_i2c_device(pdev, setup); - } -#endif -#if defined(CONFIG_SPI_MASTER) - if (setup->spi) { - ret = spi_register_driver(&wm8510_spi_driver); - if (ret != 0) - printk(KERN_ERR "can't add spi driver"); - } -#endif - - if (ret != 0) - kfree(codec); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8510, &wm8510_dai, 1); + if (ret < 0) + kfree(wm8510); return ret; } -/* power down chip */ -static int wm8510_remove(struct platform_device *pdev) +static __devexit int wm8510_i2c_remove(struct i2c_client *client) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - if (codec->control_data) - wm8510_set_bias_level(codec, SND_SOC_BIAS_OFF); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - i2c_unregister_device(codec->control_data); - i2c_del_driver(&wm8510_i2c_driver); -#endif -#if defined(CONFIG_SPI_MASTER) - spi_unregister_driver(&wm8510_spi_driver); -#endif - kfree(codec); - + snd_soc_unregister_codec(&client->dev); return 0; } -struct snd_soc_codec_device soc_codec_dev_wm8510 = { - .probe = wm8510_probe, - .remove = wm8510_remove, - .suspend = wm8510_suspend, - .resume = wm8510_resume, +static const struct i2c_device_id wm8510_i2c_id[] = { + { "wm8510", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, wm8510_i2c_id); + +static struct i2c_driver wm8510_i2c_driver = { + .driver = { + .name = "wm8510-codec", + .owner = THIS_MODULE, + }, + .probe = wm8510_i2c_probe, + .remove = __devexit_p(wm8510_i2c_remove), + .id_table = wm8510_i2c_id, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8510); +#endif static int __init wm8510_modinit(void) { - return snd_soc_register_dai(&wm8510_dai); + int ret = 0; +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) + ret = i2c_add_driver(&wm8510_i2c_driver); + if (ret != 0) { + printk(KERN_ERR "Failed to register WM8510 I2C driver: %d\n", + ret); + } +#endif +#if defined(CONFIG_SPI_MASTER) + ret = spi_register_driver(&wm8510_spi_driver); + if (ret != 0) { + printk(KERN_ERR "Failed to register WM8510 SPI driver: %d\n", + ret); + } +#endif + return ret; } module_init(wm8510_modinit); static void __exit wm8510_exit(void) { - snd_soc_unregister_dai(&wm8510_dai); +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) + i2c_del_driver(&wm8510_i2c_driver); +#endif +#if defined(CONFIG_SPI_MASTER) + spi_unregister_driver(&wm8510_spi_driver); +#endif } module_exit(wm8510_exit); diff --git a/sound/soc/codecs/wm8510.h b/sound/soc/codecs/wm8510.h index bdefcf5c69ff..b3e26ed9f2d0 100644 --- a/sound/soc/codecs/wm8510.h +++ b/sound/soc/codecs/wm8510.h @@ -99,7 +99,4 @@ struct wm8510_setup_data { unsigned short i2c_address; }; -extern struct snd_soc_dai wm8510_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8510; - #endif diff --git a/sound/soc/codecs/wm8523.c b/sound/soc/codecs/wm8523.c index 0ad039b4adf5..58d411b6faaf 100644 --- a/sound/soc/codecs/wm8523.c +++ b/sound/soc/codecs/wm8523.c @@ -30,9 +30,6 @@ #include "wm8523.h" -static struct snd_soc_codec *wm8523_codec; -struct snd_soc_codec_device soc_codec_dev_wm8523; - #define WM8523_NUM_SUPPLIES 2 static const char *wm8523_supply_names[WM8523_NUM_SUPPLIES] = { "AVDD", @@ -43,7 +40,8 @@ static const char *wm8523_supply_names[WM8523_NUM_SUPPLIES] = { /* codec private data */ struct wm8523_priv { - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; u16 reg_cache[WM8523_REGISTER_COUNT]; struct regulator_bulk_data supplies[WM8523_NUM_SUPPLIES]; unsigned int sysclk; @@ -162,8 +160,7 @@ static int wm8523_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct wm8523_priv *wm8523 = snd_soc_codec_get_drvdata(codec); int i; u16 aifctrl1 = snd_soc_read(codec, WM8523_AIF_CTRL1); @@ -387,8 +384,8 @@ static struct snd_soc_dai_ops wm8523_dai_ops = { .set_fmt = wm8523_set_dai_fmt, }; -struct snd_soc_dai wm8523_dai = { - .name = "WM8523", +static struct snd_soc_dai_driver wm8523_dai = { + .name = "wm8523-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, /* Mono modes not yet supported */ @@ -398,25 +395,17 @@ struct snd_soc_dai wm8523_dai = { }, .ops = &wm8523_dai_ops, }; -EXPORT_SYMBOL_GPL(wm8523_dai); #ifdef CONFIG_PM -static int wm8523_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8523_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8523_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8523_resume(struct platform_device *pdev) +static int wm8523_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8523_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - return 0; } #else @@ -424,93 +413,21 @@ static int wm8523_resume(struct platform_device *pdev) #define wm8523_resume NULL #endif -static int wm8523_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - if (wm8523_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = wm8523_codec; - codec = wm8523_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; - } - - snd_soc_add_controls(codec, wm8523_snd_controls, - ARRAY_SIZE(wm8523_snd_controls)); - wm8523_add_widgets(codec); - - return ret; - -pcm_err: - return ret; -} - -static int wm8523_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8523 = { - .probe = wm8523_probe, - .remove = wm8523_remove, - .suspend = wm8523_suspend, - .resume = wm8523_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8523); - -static int wm8523_register(struct wm8523_priv *wm8523, - enum snd_soc_control_type control) +static int wm8523_probe(struct snd_soc_codec *codec) { - int ret; - struct snd_soc_codec *codec = &wm8523->codec; - int i; - - if (wm8523_codec) { - dev_err(codec->dev, "Another WM8523 is registered\n"); - ret = -EINVAL; - goto err; - } - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, wm8523); - codec->name = "WM8523"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8523_set_bias_level; - codec->dai = &wm8523_dai; - codec->num_dai = 1; - codec->reg_cache_size = WM8523_REGISTER_COUNT; - codec->reg_cache = &wm8523->reg_cache; - codec->volatile_register = wm8523_volatile_register; + struct wm8523_priv *wm8523 = snd_soc_codec_get_drvdata(codec); + int ret, i; + codec->hw_write = (hw_write_t)i2c_master_send; + codec->control_data = wm8523->control_data; wm8523->rate_constraint.list = &wm8523->rate_constraint_list[0]; wm8523->rate_constraint.count = ARRAY_SIZE(wm8523->rate_constraint_list); - memcpy(codec->reg_cache, wm8523_reg, sizeof(wm8523_reg)); - - ret = snd_soc_codec_set_cache_io(codec, 8, 16, control); + ret = snd_soc_codec_set_cache_io(codec, 8, 16, wm8523->control_type); if (ret != 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; + return ret; } for (i = 0; i < ARRAY_SIZE(wm8523->supplies); i++) @@ -520,7 +437,7 @@ static int wm8523_register(struct wm8523_priv *wm8523, wm8523->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to request supplies: %d\n", ret); - goto err; + return ret; } ret = regulator_bulk_enable(ARRAY_SIZE(wm8523->supplies), @@ -555,8 +472,6 @@ static int wm8523_register(struct wm8523_priv *wm8523, goto err_enable; } - wm8523_dai.dev = codec->dev; - /* Change some default settings - latch VU and enable ZC */ wm8523->reg_cache[WM8523_DAC_GAINR] |= WM8523_DACR_VU; wm8523->reg_cache[WM8523_DAC_CTRL3] |= WM8523_ZC; @@ -566,69 +481,68 @@ static int wm8523_register(struct wm8523_priv *wm8523, /* Bias level configuration will have done an extra enable */ regulator_bulk_disable(ARRAY_SIZE(wm8523->supplies), wm8523->supplies); - wm8523_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err_enable; - } - - ret = snd_soc_register_dai(&wm8523_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } + snd_soc_add_controls(codec, wm8523_snd_controls, + ARRAY_SIZE(wm8523_snd_controls)); + wm8523_add_widgets(codec); return 0; -err_codec: - snd_soc_unregister_codec(codec); err_enable: regulator_bulk_disable(ARRAY_SIZE(wm8523->supplies), wm8523->supplies); err_get: regulator_bulk_free(ARRAY_SIZE(wm8523->supplies), wm8523->supplies); -err: - kfree(wm8523); + return ret; } -static void wm8523_unregister(struct wm8523_priv *wm8523) +static int wm8523_remove(struct snd_soc_codec *codec) { - wm8523_set_bias_level(&wm8523->codec, SND_SOC_BIAS_OFF); + struct wm8523_priv *wm8523 = snd_soc_codec_get_drvdata(codec); + + wm8523_set_bias_level(codec, SND_SOC_BIAS_OFF); regulator_bulk_free(ARRAY_SIZE(wm8523->supplies), wm8523->supplies); - snd_soc_unregister_dai(&wm8523_dai); - snd_soc_unregister_codec(&wm8523->codec); - kfree(wm8523); - wm8523_codec = NULL; + return 0; } +static struct snd_soc_codec_driver soc_codec_dev_wm8523 = { + .probe = wm8523_probe, + .remove = wm8523_remove, + .suspend = wm8523_suspend, + .resume = wm8523_resume, + .set_bias_level = wm8523_set_bias_level, + .reg_cache_size = WM8523_REGISTER_COUNT, + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8523_reg, + .volatile_register = wm8523_volatile_register, +}; + #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) static __devinit int wm8523_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct wm8523_priv *wm8523; - struct snd_soc_codec *codec; + int ret; wm8523 = kzalloc(sizeof(struct wm8523_priv), GFP_KERNEL); if (wm8523 == NULL) return -ENOMEM; - codec = &wm8523->codec; - codec->hw_write = (hw_write_t)i2c_master_send; - i2c_set_clientdata(i2c, wm8523); - codec->control_data = i2c; + wm8523->control_data = i2c; + wm8523->control_type = SND_SOC_I2C; - codec->dev = &i2c->dev; + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8523, &wm8523_dai, 1); + if (ret < 0) + kfree(wm8523); + return ret; - return wm8523_register(wm8523, SND_SOC_I2C); } static __devexit int wm8523_i2c_remove(struct i2c_client *client) { - struct wm8523_priv *wm8523 = i2c_get_clientdata(client); - wm8523_unregister(wm8523); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -640,7 +554,7 @@ MODULE_DEVICE_TABLE(i2c, wm8523_i2c_id); static struct i2c_driver wm8523_i2c_driver = { .driver = { - .name = "WM8523", + .name = "wm8523-codec", .owner = THIS_MODULE, }, .probe = wm8523_i2c_probe, diff --git a/sound/soc/codecs/wm8523.h b/sound/soc/codecs/wm8523.h index 1aa9ce3e1357..4d5b1eb8f2fc 100644 --- a/sound/soc/codecs/wm8523.h +++ b/sound/soc/codecs/wm8523.h @@ -154,7 +154,4 @@ #define WM8523_ZD_COUNT_SHIFT 0 /* ZD_COUNT - [1:0] */ #define WM8523_ZD_COUNT_WIDTH 2 /* ZD_COUNT - [1:0] */ -extern struct snd_soc_dai wm8523_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8523; - #endif diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c index c3571ee5c11b..cae58941a32f 100644 --- a/sound/soc/codecs/wm8580.c +++ b/sound/soc/codecs/wm8580.c @@ -199,7 +199,8 @@ static const char *wm8580_supply_names[WM8580_NUM_SUPPLIES] = { /* codec private data */ struct wm8580_priv { - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; struct regulator_bulk_data supplies[WM8580_NUM_SUPPLIES]; u16 reg_cache[WM8580_MAX_REGISTER + 1]; struct pll_state a; @@ -484,9 +485,8 @@ static int wm8580_paif_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; - u16 paifb = snd_soc_read(codec, WM8580_PAIF3 + dai->id); + struct snd_soc_codec *codec = rtd->codec; + u16 paifb = snd_soc_read(codec, WM8580_PAIF3 + dai->driver->id); paifb &= ~WM8580_AIF_LENGTH_MASK; /* bit size */ @@ -506,7 +506,7 @@ static int wm8580_paif_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_write(codec, WM8580_PAIF3 + dai->id, paifb); + snd_soc_write(codec, WM8580_PAIF3 + dai->driver->id, paifb); return 0; } @@ -518,8 +518,8 @@ static int wm8580_set_paif_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int aifb; int can_invert_lrclk; - aifa = snd_soc_read(codec, WM8580_PAIF1 + codec_dai->id); - aifb = snd_soc_read(codec, WM8580_PAIF3 + codec_dai->id); + aifa = snd_soc_read(codec, WM8580_PAIF1 + codec_dai->driver->id); + aifb = snd_soc_read(codec, WM8580_PAIF3 + codec_dai->driver->id); aifb &= ~(WM8580_AIF_FMT_MASK | WM8580_AIF_LRP | WM8580_AIF_BCP); @@ -585,8 +585,8 @@ static int wm8580_set_paif_dai_fmt(struct snd_soc_dai *codec_dai, return -EINVAL; } - snd_soc_write(codec, WM8580_PAIF1 + codec_dai->id, aifa); - snd_soc_write(codec, WM8580_PAIF3 + codec_dai->id, aifb); + snd_soc_write(codec, WM8580_PAIF1 + codec_dai->driver->id, aifa); + snd_soc_write(codec, WM8580_PAIF3 + codec_dai->driver->id, aifb); return 0; } @@ -746,10 +746,10 @@ static struct snd_soc_dai_ops wm8580_dai_ops_capture = { .set_pll = wm8580_set_dai_pll, }; -struct snd_soc_dai wm8580_dai[] = { +static struct snd_soc_dai_driver wm8580_dai[] = { { - .name = "WM8580 PAIFRX", - .id = 0, + .name = "wm8580-hifi-playback", + .id = WM8580_DAI_PAIFRX, .playback = { .stream_name = "Playback", .channels_min = 1, @@ -760,8 +760,8 @@ struct snd_soc_dai wm8580_dai[] = { .ops = &wm8580_dai_ops_playback, }, { - .name = "WM8580 PAIFTX", - .id = 1, + .name = "wm8580-hifi-capture", + .id = WM8580_DAI_PAIFTX, .capture = { .stream_name = "Capture", .channels_min = 2, @@ -772,90 +772,17 @@ struct snd_soc_dai wm8580_dai[] = { .ops = &wm8580_dai_ops_capture, }, }; -EXPORT_SYMBOL_GPL(wm8580_dai); -static struct snd_soc_codec *wm8580_codec; - -static int wm8580_probe(struct platform_device *pdev) +static int wm8580_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - if (wm8580_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = wm8580_codec; - codec = wm8580_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; - } - - snd_soc_add_controls(codec, wm8580_snd_controls, - ARRAY_SIZE(wm8580_snd_controls)); - wm8580_add_widgets(codec); - - return ret; - -pcm_err: - return ret; -} - -/* power down chip */ -static int wm8580_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8580 = { - .probe = wm8580_probe, - .remove = wm8580_remove, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8580); - -static int wm8580_register(struct wm8580_priv *wm8580, - enum snd_soc_control_type control) -{ - int ret, i; - struct snd_soc_codec *codec = &wm8580->codec; - - if (wm8580_codec) { - dev_err(codec->dev, "Another WM8580 is registered\n"); - ret = -EINVAL; - goto err; - } - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, wm8580); - codec->name = "WM8580"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8580_set_bias_level; - codec->dai = wm8580_dai; - codec->num_dai = ARRAY_SIZE(wm8580_dai); - codec->reg_cache_size = ARRAY_SIZE(wm8580->reg_cache); - codec->reg_cache = &wm8580->reg_cache; - - memcpy(codec->reg_cache, wm8580_reg, sizeof(wm8580_reg)); + struct wm8580_priv *wm8580 = snd_soc_codec_get_drvdata(codec); + int ret = 0,i; - ret = snd_soc_codec_set_cache_io(codec, 7, 9, control); + codec->control_data = wm8580->control_data; + ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8580->control_type); if (ret < 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; + return ret; } for (i = 0; i < ARRAY_SIZE(wm8580->supplies); i++) @@ -865,7 +792,7 @@ static int wm8580_register(struct wm8580_priv *wm8580, wm8580->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to request supplies: %d\n", ret); - goto err; + return ret; } ret = regulator_bulk_enable(ARRAY_SIZE(wm8580->supplies), @@ -882,74 +809,69 @@ static int wm8580_register(struct wm8580_priv *wm8580, goto err_regulator_enable; } - for (i = 0; i < ARRAY_SIZE(wm8580_dai); i++) - wm8580_dai[i].dev = codec->dev; - wm8580_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - wm8580_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err_regulator_enable; - } - - ret = snd_soc_register_dais(wm8580_dai, ARRAY_SIZE(wm8580_dai)); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } + snd_soc_add_controls(codec, wm8580_snd_controls, + ARRAY_SIZE(wm8580_snd_controls)); + wm8580_add_widgets(codec); return 0; -err_codec: - snd_soc_unregister_codec(codec); err_regulator_enable: regulator_bulk_disable(ARRAY_SIZE(wm8580->supplies), wm8580->supplies); err_regulator_get: regulator_bulk_free(ARRAY_SIZE(wm8580->supplies), wm8580->supplies); -err: - kfree(wm8580); return ret; } -static void wm8580_unregister(struct wm8580_priv *wm8580) +/* power down chip */ +static int wm8580_remove(struct snd_soc_codec *codec) { - wm8580_set_bias_level(&wm8580->codec, SND_SOC_BIAS_OFF); - snd_soc_unregister_dais(wm8580_dai, ARRAY_SIZE(wm8580_dai)); - snd_soc_unregister_codec(&wm8580->codec); + struct wm8580_priv *wm8580 = snd_soc_codec_get_drvdata(codec); + + wm8580_set_bias_level(codec, SND_SOC_BIAS_OFF); + regulator_bulk_disable(ARRAY_SIZE(wm8580->supplies), wm8580->supplies); regulator_bulk_free(ARRAY_SIZE(wm8580->supplies), wm8580->supplies); - kfree(wm8580); - wm8580_codec = NULL; + + return 0; } +static struct snd_soc_codec_driver soc_codec_dev_wm8580 = { + .probe = wm8580_probe, + .remove = wm8580_remove, + .set_bias_level = wm8580_set_bias_level, + .reg_cache_size = sizeof(wm8580_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = &wm8580_reg, +}; + #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) static int wm8580_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct wm8580_priv *wm8580; - struct snd_soc_codec *codec; + int ret; wm8580 = kzalloc(sizeof(struct wm8580_priv), GFP_KERNEL); if (wm8580 == NULL) return -ENOMEM; - codec = &wm8580->codec; - i2c_set_clientdata(i2c, wm8580); - codec->control_data = i2c; - - codec->dev = &i2c->dev; + wm8580->control_data = i2c; + wm8580->control_type = SND_SOC_I2C; - return wm8580_register(wm8580, SND_SOC_I2C); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8580, wm8580_dai, ARRAY_SIZE(wm8580_dai)); + if (ret < 0) + kfree(wm8580); + return ret; } static int wm8580_i2c_remove(struct i2c_client *client) { - struct wm8580_priv *wm8580 = i2c_get_clientdata(client); - wm8580_unregister(wm8580); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -961,7 +883,7 @@ MODULE_DEVICE_TABLE(i2c, wm8580_i2c_id); static struct i2c_driver wm8580_i2c_driver = { .driver = { - .name = "wm8580", + .name = "wm8580-codec", .owner = THIS_MODULE, }, .probe = wm8580_i2c_probe, @@ -972,7 +894,7 @@ static struct i2c_driver wm8580_i2c_driver = { static int __init wm8580_modinit(void) { - int ret; + int ret = 0; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ret = i2c_add_driver(&wm8580_i2c_driver); @@ -981,7 +903,7 @@ static int __init wm8580_modinit(void) } #endif - return 0; + return ret; } module_init(wm8580_modinit); diff --git a/sound/soc/codecs/wm8580.h b/sound/soc/codecs/wm8580.h index 0dfb5ddde6a2..8328ef667593 100644 --- a/sound/soc/codecs/wm8580.h +++ b/sound/soc/codecs/wm8580.h @@ -31,8 +31,5 @@ #define WM8580_DAI_PAIFRX 0 #define WM8580_DAI_PAIFTX 1 -extern struct snd_soc_dai wm8580_dai[]; -extern struct snd_soc_codec_device soc_codec_dev_wm8580; - #endif diff --git a/sound/soc/codecs/wm8711.c b/sound/soc/codecs/wm8711.c index e2dba07f0260..8d942b3b111f 100644 --- a/sound/soc/codecs/wm8711.c +++ b/sound/soc/codecs/wm8711.c @@ -31,11 +31,10 @@ #include "wm8711.h" -static struct snd_soc_codec *wm8711_codec; - /* codec private data */ struct wm8711_priv { - struct snd_soc_codec codec; + enum snd_soc_control_type bus_type; + void *control_data; u16 reg_cache[WM8711_CACHEREGNUM]; unsigned int sysclk; }; @@ -163,7 +162,7 @@ static int wm8711_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_codec *codec = dai->codec; - struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec); + struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec); u16 iface = snd_soc_read(codec, WM8711_IFACE) & 0xfffc; int i = get_coeff(wm8711->sysclk, params_rate(params)); u16 srate = (coeff_div[i].sr << 2) | @@ -227,7 +226,7 @@ static int wm8711_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { struct snd_soc_codec *codec = codec_dai->codec; - struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec); + struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec); switch (freq) { case 11289600: @@ -338,8 +337,8 @@ static struct snd_soc_dai_ops wm8711_ops = { .set_fmt = wm8711_set_dai_fmt, }; -struct snd_soc_dai wm8711_dai = { - .name = "WM8711", +static struct snd_soc_dai_driver wm8711_dai = { + .name = "wm8711-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -349,22 +348,16 @@ struct snd_soc_dai wm8711_dai = { }, .ops = &wm8711_ops, }; -EXPORT_SYMBOL_GPL(wm8711_dai); -static int wm8711_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8711_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - snd_soc_write(codec, WM8711_ACTIVE, 0x0); wm8711_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8711_resume(struct platform_device *pdev) +static int wm8711_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; int i; u8 data[2]; u16 *cache = codec->reg_cache; @@ -380,99 +373,24 @@ static int wm8711_resume(struct platform_device *pdev) return 0; } -static int wm8711_probe(struct platform_device *pdev) +static int wm8711_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - if (wm8711_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = wm8711_codec; - codec = wm8711_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; - } - - snd_soc_add_controls(codec, wm8711_snd_controls, - ARRAY_SIZE(wm8711_snd_controls)); - wm8711_add_widgets(codec); - - return ret; - -pcm_err: - return ret; -} - -/* power down chip */ -static int wm8711_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8711 = { - .probe = wm8711_probe, - .remove = wm8711_remove, - .suspend = wm8711_suspend, - .resume = wm8711_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8711); - -static int wm8711_register(struct wm8711_priv *wm8711, - enum snd_soc_control_type control) -{ - int ret; - struct snd_soc_codec *codec = &wm8711->codec; - u16 reg; - - if (wm8711_codec) { - dev_err(codec->dev, "Another WM8711 is registered\n"); - ret = -EINVAL; - goto err; - } - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, wm8711); - codec->name = "WM8711"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8711_set_bias_level; - codec->dai = &wm8711_dai; - codec->num_dai = 1; - codec->reg_cache_size = WM8711_CACHEREGNUM; - codec->reg_cache = &wm8711->reg_cache; - - memcpy(codec->reg_cache, wm8711_reg, sizeof(wm8711_reg)); + struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec); + int ret, reg; - ret = snd_soc_codec_set_cache_io(codec, 7, 9, control); + codec->control_data = wm8711->control_data; + ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8711->bus_type); if (ret < 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; + return ret; } ret = wm8711_reset(codec); if (ret < 0) { dev_err(codec->dev, "Failed to issue reset\n"); - goto err; + return ret; } - wm8711_dai.dev = codec->dev; - wm8711_set_bias_level(codec, SND_SOC_BIAS_STANDBY); /* Latch the update bits */ @@ -481,69 +399,63 @@ static int wm8711_register(struct wm8711_priv *wm8711, reg = snd_soc_read(codec, WM8711_ROUT1V); snd_soc_write(codec, WM8711_ROUT1V, reg | 0x0100); - wm8711_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err; - } - - ret = snd_soc_register_dai(&wm8711_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } - - return 0; + snd_soc_add_controls(codec, wm8711_snd_controls, + ARRAY_SIZE(wm8711_snd_controls)); + wm8711_add_widgets(codec); -err_codec: - snd_soc_unregister_codec(codec); -err: - kfree(wm8711); return ret; + } -static void wm8711_unregister(struct wm8711_priv *wm8711) +/* power down chip */ +static int wm8711_remove(struct snd_soc_codec *codec) { - wm8711_set_bias_level(&wm8711->codec, SND_SOC_BIAS_OFF); - snd_soc_unregister_dai(&wm8711_dai); - snd_soc_unregister_codec(&wm8711->codec); - kfree(wm8711); - wm8711_codec = NULL; + wm8711_set_bias_level(codec, SND_SOC_BIAS_OFF); + return 0; } +static struct snd_soc_codec_driver soc_codec_dev_wm8711 = { + .probe = wm8711_probe, + .remove = wm8711_remove, + .suspend = wm8711_suspend, + .resume = wm8711_resume, + .set_bias_level = wm8711_set_bias_level, + .reg_cache_size = sizeof(wm8711_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8711_reg, +}; + #if defined(CONFIG_SPI_MASTER) static int __devinit wm8711_spi_probe(struct spi_device *spi) { - struct snd_soc_codec *codec; struct wm8711_priv *wm8711; + int ret; wm8711 = kzalloc(sizeof(struct wm8711_priv), GFP_KERNEL); if (wm8711 == NULL) return -ENOMEM; - codec = &wm8711->codec; - codec->control_data = spi; - codec->dev = &spi->dev; + spi_set_drvdata(spi, wm8711); + wm8711->control_data = spi; + wm8711->bus_type = SND_SOC_SPI; - dev_set_drvdata(&spi->dev, wm8711); - - return wm8711_register(wm8711, SND_SOC_SPI); + ret = snd_soc_register_codec(&spi->dev, + &soc_codec_dev_wm8711, &wm8711_dai, 1); + if (ret < 0) + kfree(wm8711); + return ret; } static int __devexit wm8711_spi_remove(struct spi_device *spi) { - struct wm8711_priv *wm8711 = dev_get_drvdata(&spi->dev); - - wm8711_unregister(wm8711); - + snd_soc_unregister_codec(&spi->dev); + kfree(spi_get_drvdata(spi)); return 0; } static struct spi_driver wm8711_spi_driver = { .driver = { - .name = "wm8711", + .name = "wm8711-codec", .bus = &spi_bus_type, .owner = THIS_MODULE, }, @@ -553,31 +465,31 @@ static struct spi_driver wm8711_spi_driver = { #endif /* CONFIG_SPI_MASTER */ #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) -static __devinit int wm8711_i2c_probe(struct i2c_client *i2c, +static __devinit int wm8711_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct wm8711_priv *wm8711; - struct snd_soc_codec *codec; + int ret; wm8711 = kzalloc(sizeof(struct wm8711_priv), GFP_KERNEL); if (wm8711 == NULL) return -ENOMEM; - codec = &wm8711->codec; - codec->hw_write = (hw_write_t)i2c_master_send; - - i2c_set_clientdata(i2c, wm8711); - codec->control_data = i2c; + i2c_set_clientdata(client, wm8711); + wm8711->control_data = client; + wm8711->bus_type = SND_SOC_I2C; - codec->dev = &i2c->dev; - - return wm8711_register(wm8711, SND_SOC_I2C); + ret = snd_soc_register_codec(&client->dev, + &soc_codec_dev_wm8711, &wm8711_dai, 1); + if (ret < 0) + kfree(wm8711); + return ret; } static __devexit int wm8711_i2c_remove(struct i2c_client *client) { - struct wm8711_priv *wm8711 = i2c_get_clientdata(client); - wm8711_unregister(wm8711); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -589,7 +501,7 @@ MODULE_DEVICE_TABLE(i2c, wm8711_i2c_id); static struct i2c_driver wm8711_i2c_driver = { .driver = { - .name = "WM8711 I2C Codec", + .name = "wm8711-codec", .owner = THIS_MODULE, }, .probe = wm8711_i2c_probe, diff --git a/sound/soc/codecs/wm8711.h b/sound/soc/codecs/wm8711.h index 381e84a43816..a61db985499f 100644 --- a/sound/soc/codecs/wm8711.h +++ b/sound/soc/codecs/wm8711.h @@ -36,7 +36,4 @@ struct wm8711_setup_data { unsigned short i2c_address; }; -extern struct snd_soc_dai wm8711_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8711; - #endif diff --git a/sound/soc/codecs/wm8727.c b/sound/soc/codecs/wm8727.c index 9d1df2628136..6a40080ba701 100644 --- a/sound/soc/codecs/wm8727.c +++ b/sound/soc/codecs/wm8727.c @@ -23,7 +23,6 @@ #include #include -#include "wm8727.h" /* * Note this is a simple chip with no configuration interface, sample rate is * determined automatically by examining the Master clock and Bit clock ratios @@ -33,8 +32,8 @@ SNDRV_PCM_RATE_192000) -struct snd_soc_dai wm8727_dai = { - .name = "WM8727", +static struct snd_soc_dai_driver wm8727_dai = { + .name = "wm8727-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, @@ -43,103 +42,18 @@ struct snd_soc_dai wm8727_dai = { .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE, }, }; -EXPORT_SYMBOL_GPL(wm8727_dai); -static struct snd_soc_codec *wm8727_codec; +struct snd_soc_codec_driver soc_codec_dev_wm8727; -static int wm8727_soc_probe(struct platform_device *pdev) +static __devinit int wm8727_probe(struct platform_device *pdev) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - int ret = 0; - - BUG_ON(!wm8727_codec); - - socdev->card->codec = wm8727_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - printk(KERN_ERR "wm8727: failed to create pcms\n"); - goto pcm_err; - } - - return ret; - -pcm_err: - kfree(socdev->card->codec); - socdev->card->codec = NULL; - return ret; -} - -static int wm8727_soc_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8727 = { - .probe = wm8727_soc_probe, - .remove = wm8727_soc_remove, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8727); - - -static __devinit int wm8727_platform_probe(struct platform_device *pdev) -{ - struct snd_soc_codec *codec; - int ret; - - if (wm8727_codec) { - dev_err(&pdev->dev, "Another WM8727 is registered\n"); - return -EBUSY; - } - - codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (codec == NULL) - return -ENOMEM; - wm8727_codec = codec; - - platform_set_drvdata(pdev, codec); - - mutex_init(&codec->mutex); - codec->dev = &pdev->dev; - codec->name = "WM8727"; - codec->owner = THIS_MODULE; - codec->dai = &wm8727_dai; - codec->num_dai = 1; - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - wm8727_dai.dev = &pdev->dev; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(&pdev->dev, "Failed to register CODEC: %d\n", ret); - goto err; - } - - ret = snd_soc_register_dai(&wm8727_dai); - if (ret != 0) { - dev_err(&pdev->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } - - return 0; - -err_codec: - snd_soc_unregister_codec(codec); -err: - kfree(codec); - return ret; + return snd_soc_register_codec(&pdev->dev, + &soc_codec_dev_wm8727, &wm8727_dai, 1); } -static int __devexit wm8727_platform_remove(struct platform_device *pdev) +static int __devexit wm8727_remove(struct platform_device *pdev) { - snd_soc_unregister_dai(&wm8727_dai); - snd_soc_unregister_codec(platform_get_drvdata(pdev)); + snd_soc_unregister_codec(&pdev->dev); return 0; } @@ -149,8 +63,8 @@ static struct platform_driver wm8727_codec_driver = { .owner = THIS_MODULE, }, - .probe = wm8727_platform_probe, - .remove = __devexit_p(wm8727_platform_remove), + .probe = wm8727_probe, + .remove = __devexit_p(wm8727_remove), }; static int __init wm8727_init(void) diff --git a/sound/soc/codecs/wm8727.h b/sound/soc/codecs/wm8727.h deleted file mode 100644 index ee19aa71bcdc..000000000000 --- a/sound/soc/codecs/wm8727.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * wm8727.h - * - * Created on: 15-Oct-2009 - * Author: neil.jones@imgtec.com - * - * Copyright (C) 2009 Imagination Technologies Ltd. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - */ - -#ifndef WM8727_H_ -#define WM8727_H_ - -extern struct snd_soc_dai wm8727_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8727; - -#endif /* WM8727_H_ */ diff --git a/sound/soc/codecs/wm8728.c b/sound/soc/codecs/wm8728.c index 34be2d2b69ef..ae2292444783 100644 --- a/sound/soc/codecs/wm8728.c +++ b/sound/soc/codecs/wm8728.c @@ -29,8 +29,6 @@ #include "wm8728.h" -struct snd_soc_codec_device soc_codec_dev_wm8728; - /* * We can't read the WM8728 register space so we cache them instead. * Note that the defaults here aren't the physical defaults, we latch @@ -44,6 +42,12 @@ static const u16 wm8728_reg_defaults[] = { 0x100, }; +/* codec private data */ +struct wm8728_priv { + enum snd_soc_control_type control_type; + void *control_data; +}; + static const DECLARE_TLV_DB_SCALE(wm8728_tlv, -12750, 50, 1); static const struct snd_kcontrol_new wm8728_snd_controls[] = { @@ -96,8 +100,7 @@ static int wm8728_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; u16 dac = snd_soc_read(codec, WM8728_DACCTL); dac &= ~0x18; @@ -210,8 +213,8 @@ static struct snd_soc_dai_ops wm8728_dai_ops = { .set_fmt = wm8728_set_dai_fmt, }; -struct snd_soc_dai wm8728_dai = { - .name = "WM8728", +static struct snd_soc_dai_driver wm8728_dai = { + .name = "wm8728-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, @@ -221,63 +224,32 @@ struct snd_soc_dai wm8728_dai = { }, .ops = &wm8728_dai_ops, }; -EXPORT_SYMBOL_GPL(wm8728_dai); -static int wm8728_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8728_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8728_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8728_resume(struct platform_device *pdev) +static int wm8728_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8728_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; } -/* - * initialise the WM8728 driver - * register the mixer and dsp interfaces with the kernel - */ -static int wm8728_init(struct snd_soc_device *socdev, - enum snd_soc_control_type control) +static int wm8728_probe(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = socdev->card->codec; - int ret = 0; - - codec->name = "WM8728"; - codec->owner = THIS_MODULE; - codec->set_bias_level = wm8728_set_bias_level; - codec->dai = &wm8728_dai; - codec->num_dai = 1; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->reg_cache_size = ARRAY_SIZE(wm8728_reg_defaults); - codec->reg_cache = kmemdup(wm8728_reg_defaults, - sizeof(wm8728_reg_defaults), - GFP_KERNEL); - if (codec->reg_cache == NULL) - return -ENOMEM; + struct wm8728_priv *wm8728 = snd_soc_codec_get_drvdata(codec); + int ret; - ret = snd_soc_codec_set_cache_io(codec, 7, 9, control); + codec->control_data = wm8728->control_data; + ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8728->control_type); if (ret < 0) { printk(KERN_ERR "wm8728: failed to configure cache I/O: %d\n", ret); - goto err; - } - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - printk(KERN_ERR "wm8728: failed to create pcms\n"); - goto err; + return ret; } /* power on device */ @@ -288,128 +260,56 @@ static int wm8728_init(struct snd_soc_device *socdev, wm8728_add_widgets(codec); return ret; - -err: - kfree(codec->reg_cache); - return ret; } -static struct snd_soc_device *wm8728_socdev; - -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - -/* - * WM8728 2 wire address is determined by GPIO5 - * state during powerup. - * low = 0x1a - * high = 0x1b - */ - -static int wm8728_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) +static int wm8728_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = wm8728_socdev; - struct snd_soc_codec *codec = socdev->card->codec; - int ret; - - i2c_set_clientdata(i2c, codec); - codec->control_data = i2c; - - ret = wm8728_init(socdev, SND_SOC_I2C); - if (ret < 0) - pr_err("failed to initialise WM8728\n"); - - return ret; -} - -static int wm8728_i2c_remove(struct i2c_client *client) -{ - struct snd_soc_codec *codec = i2c_get_clientdata(client); - kfree(codec->reg_cache); + wm8728_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static const struct i2c_device_id wm8728_i2c_id[] = { - { "wm8728", 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, wm8728_i2c_id); - -static struct i2c_driver wm8728_i2c_driver = { - .driver = { - .name = "WM8728 I2C Codec", - .owner = THIS_MODULE, - }, - .probe = wm8728_i2c_probe, - .remove = wm8728_i2c_remove, - .id_table = wm8728_i2c_id, +static struct snd_soc_codec_driver soc_codec_dev_wm8728 = { + .probe = wm8728_probe, + .remove = wm8728_remove, + .suspend = wm8728_suspend, + .resume = wm8728_resume, + .set_bias_level = wm8728_set_bias_level, + .reg_cache_size = sizeof(wm8728_reg_defaults), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8728_reg_defaults, }; -static int wm8728_add_i2c_device(struct platform_device *pdev, - const struct wm8728_setup_data *setup) -{ - struct i2c_board_info info; - struct i2c_adapter *adapter; - struct i2c_client *client; - int ret; - - ret = i2c_add_driver(&wm8728_i2c_driver); - if (ret != 0) { - dev_err(&pdev->dev, "can't add i2c driver\n"); - return ret; - } - - memset(&info, 0, sizeof(struct i2c_board_info)); - info.addr = setup->i2c_address; - strlcpy(info.type, "wm8728", I2C_NAME_SIZE); - - adapter = i2c_get_adapter(setup->i2c_bus); - if (!adapter) { - dev_err(&pdev->dev, "can't get i2c adapter %d\n", - setup->i2c_bus); - goto err_driver; - } - - client = i2c_new_device(adapter, &info); - i2c_put_adapter(adapter); - if (!client) { - dev_err(&pdev->dev, "can't add i2c device at 0x%x\n", - (unsigned int)info.addr); - goto err_driver; - } - - return 0; - -err_driver: - i2c_del_driver(&wm8728_i2c_driver); - return -ENODEV; -} -#endif - #if defined(CONFIG_SPI_MASTER) static int __devinit wm8728_spi_probe(struct spi_device *spi) { - struct snd_soc_device *socdev = wm8728_socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct wm8728_priv *wm8728; int ret; - codec->control_data = spi; + wm8728 = kzalloc(sizeof(struct wm8728_priv), GFP_KERNEL); + if (wm8728 == NULL) + return -ENOMEM; - ret = wm8728_init(socdev, SND_SOC_SPI); - if (ret < 0) - dev_err(&spi->dev, "failed to initialise WM8728\n"); + wm8728->control_data = spi; + wm8728->control_type = SND_SOC_SPI; + spi_set_drvdata(spi, wm8728); + ret = snd_soc_register_codec(&spi->dev, + &soc_codec_dev_wm8728, &wm8728_dai, 1); + if (ret < 0) + kfree(wm8728); return ret; } static int __devexit wm8728_spi_remove(struct spi_device *spi) { + snd_soc_unregister_codec(&spi->dev); + kfree(spi_get_drvdata(spi)); return 0; } static struct spi_driver wm8728_spi_driver = { .driver = { - .name = "wm8728", + .name = "wm8728-codec", .bus = &spi_bus_type, .owner = THIS_MODULE, }, @@ -418,85 +318,81 @@ static struct spi_driver wm8728_spi_driver = { }; #endif /* CONFIG_SPI_MASTER */ -static int wm8728_probe(struct platform_device *pdev) +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +static __devinit int wm8728_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct wm8728_setup_data *setup; - struct snd_soc_codec *codec; - int ret = 0; + struct wm8728_priv *wm8728; + int ret; - setup = socdev->codec_data; - codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (codec == NULL) + wm8728 = kzalloc(sizeof(struct wm8728_priv), GFP_KERNEL); + if (wm8728 == NULL) return -ENOMEM; - socdev->card->codec = codec; - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); + i2c_set_clientdata(i2c, wm8728); + wm8728->control_data = i2c; + wm8728->control_type = SND_SOC_I2C; + + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8728, &wm8728_dai, 1); + if (ret < 0) + kfree(wm8728); + return ret; +} + +static __devexit int wm8728_i2c_remove(struct i2c_client *client) +{ + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); + return 0; +} - wm8728_socdev = socdev; - ret = -ENODEV; +static const struct i2c_device_id wm8728_i2c_id[] = { + { "wm8728", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, wm8728_i2c_id); + +static struct i2c_driver wm8728_i2c_driver = { + .driver = { + .name = "wm8728-codec", + .owner = THIS_MODULE, + }, + .probe = wm8728_i2c_probe, + .remove = __devexit_p(wm8728_i2c_remove), + .id_table = wm8728_i2c_id, +}; +#endif +static int __init wm8728_modinit(void) +{ + int ret = 0; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - if (setup->i2c_address) { - ret = wm8728_add_i2c_device(pdev, setup); + ret = i2c_add_driver(&wm8728_i2c_driver); + if (ret != 0) { + printk(KERN_ERR "Failed to register wm8728 I2C driver: %d\n", + ret); } #endif #if defined(CONFIG_SPI_MASTER) - if (setup->spi) { - ret = spi_register_driver(&wm8728_spi_driver); - if (ret != 0) - printk(KERN_ERR "can't add spi driver"); + ret = spi_register_driver(&wm8728_spi_driver); + if (ret != 0) { + printk(KERN_ERR "Failed to register wm8728 SPI driver: %d\n", + ret); } #endif - - if (ret != 0) - kfree(codec); - return ret; } +module_init(wm8728_modinit); -/* power down chip */ -static int wm8728_remove(struct platform_device *pdev) +static void __exit wm8728_exit(void) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - if (codec->control_data) - wm8728_set_bias_level(codec, SND_SOC_BIAS_OFF); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - i2c_unregister_device(codec->control_data); i2c_del_driver(&wm8728_i2c_driver); #endif #if defined(CONFIG_SPI_MASTER) spi_unregister_driver(&wm8728_spi_driver); #endif - kfree(codec); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8728 = { - .probe = wm8728_probe, - .remove = wm8728_remove, - .suspend = wm8728_suspend, - .resume = wm8728_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8728); - -static int __init wm8728_modinit(void) -{ - return snd_soc_register_dai(&wm8728_dai); -} -module_init(wm8728_modinit); - -static void __exit wm8728_exit(void) -{ - snd_soc_unregister_dai(&wm8728_dai); } module_exit(wm8728_exit); diff --git a/sound/soc/codecs/wm8728.h b/sound/soc/codecs/wm8728.h index d269c132474b..8aea362ffd47 100644 --- a/sound/soc/codecs/wm8728.h +++ b/sound/soc/codecs/wm8728.h @@ -18,13 +18,4 @@ #define WM8728_DACCTL 0x02 #define WM8728_IFCTL 0x03 -struct wm8728_setup_data { - int spi; - int i2c_bus; - unsigned short i2c_address; -}; - -extern struct snd_soc_dai wm8728_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8728; - #endif diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c index 0ab9b6355297..7da360ee1fee 100644 --- a/sound/soc/codecs/wm8731.c +++ b/sound/soc/codecs/wm8731.c @@ -32,9 +32,6 @@ #include "wm8731.h" -static struct snd_soc_codec *wm8731_codec; -struct snd_soc_codec_device soc_codec_dev_wm8731; - #define WM8731_NUM_SUPPLIES 4 static const char *wm8731_supply_names[WM8731_NUM_SUPPLIES] = { "AVDD", @@ -45,7 +42,8 @@ static const char *wm8731_supply_names[WM8731_NUM_SUPPLIES] = { /* codec private data */ struct wm8731_priv { - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; struct regulator_bulk_data supplies[WM8731_NUM_SUPPLIES]; u16 reg_cache[WM8731_CACHEREGNUM]; unsigned int sysclk; @@ -222,9 +220,7 @@ static int wm8731_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = dai->codec; struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec); u16 iface = snd_soc_read(codec, WM8731_IFACE) & 0xfff3; int i = get_coeff(wm8731->sysclk, params_rate(params)); @@ -252,9 +248,7 @@ static int wm8731_hw_params(struct snd_pcm_substream *substream, static int wm8731_pcm_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = dai->codec; /* set active */ snd_soc_write(codec, WM8731_ACTIVE, 0x0001); @@ -265,9 +259,7 @@ static int wm8731_pcm_prepare(struct snd_pcm_substream *substream, static void wm8731_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = dai->codec; /* deactivate */ if (!codec->active) { @@ -428,8 +420,8 @@ static struct snd_soc_dai_ops wm8731_dai_ops = { .set_fmt = wm8731_set_dai_fmt, }; -struct snd_soc_dai wm8731_dai = { - .name = "WM8731", +static struct snd_soc_dai_driver wm8731_dai = { + .name = "wm8731-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -445,24 +437,17 @@ struct snd_soc_dai wm8731_dai = { .ops = &wm8731_dai_ops, .symmetric_rates = 1, }; -EXPORT_SYMBOL_GPL(wm8731_dai); #ifdef CONFIG_PM -static int wm8731_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8731_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8731_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8731_resume(struct platform_device *pdev) +static int wm8731_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8731_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; @@ -472,88 +457,18 @@ static int wm8731_resume(struct platform_device *pdev) #define wm8731_resume NULL #endif -static int wm8731_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - if (wm8731_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = wm8731_codec; - codec = wm8731_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; - } - - snd_soc_add_controls(codec, wm8731_snd_controls, - ARRAY_SIZE(wm8731_snd_controls)); - wm8731_add_widgets(codec); - - return ret; - -pcm_err: - return ret; -} - -/* power down chip */ -static int wm8731_remove(struct platform_device *pdev) +static int wm8731_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8731 = { - .probe = wm8731_probe, - .remove = wm8731_remove, - .suspend = wm8731_suspend, - .resume = wm8731_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8731); - -static int wm8731_register(struct wm8731_priv *wm8731, - enum snd_soc_control_type control) -{ - int ret, i; - struct snd_soc_codec *codec = &wm8731->codec; - - if (wm8731_codec) { - dev_err(codec->dev, "Another WM8731 is registered\n"); - ret = -EINVAL; - goto err; - } - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, wm8731); - codec->name = "WM8731"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8731_set_bias_level; - codec->dai = &wm8731_dai; - codec->num_dai = 1; - codec->reg_cache_size = WM8731_CACHEREGNUM; - codec->reg_cache = &wm8731->reg_cache; + struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec); + int ret = 0, i; - memcpy(codec->reg_cache, wm8731_reg, sizeof(wm8731_reg)); + codec->bias_level = SND_SOC_BIAS_OFF, + codec->control_data = wm8731->control_data; - ret = snd_soc_codec_set_cache_io(codec, 7, 9, control); + ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8731->control_type); if (ret < 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; + return ret; } for (i = 0; i < ARRAY_SIZE(wm8731->supplies); i++) @@ -563,7 +478,7 @@ static int wm8731_register(struct wm8731_priv *wm8731, wm8731->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to request supplies: %d\n", ret); - goto err; + return ret; } ret = regulator_bulk_enable(ARRAY_SIZE(wm8731->supplies), @@ -579,8 +494,6 @@ static int wm8731_register(struct wm8731_priv *wm8731, goto err_regulator_enable; } - wm8731_dai.dev = codec->dev; - wm8731_set_bias_level(codec, SND_SOC_BIAS_STANDBY); /* Latch the update bits */ @@ -592,78 +505,79 @@ static int wm8731_register(struct wm8731_priv *wm8731, /* Disable bypass path by default */ snd_soc_update_bits(codec, WM8731_APANA, 0x4, 0); - wm8731_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err_regulator_enable; - } - - ret = snd_soc_register_dai(&wm8731_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - snd_soc_unregister_codec(codec); - goto err_codec; - } + snd_soc_add_controls(codec, wm8731_snd_controls, + ARRAY_SIZE(wm8731_snd_controls)); + wm8731_add_widgets(codec); /* Regulators will have been enabled by bias management */ regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); return 0; -err_codec: - snd_soc_unregister_codec(codec); err_regulator_enable: regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); err_regulator_get: regulator_bulk_free(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); -err: + kfree(wm8731); return ret; } -static void wm8731_unregister(struct wm8731_priv *wm8731) +/* power down chip */ +static int wm8731_remove(struct snd_soc_codec *codec) { - wm8731_set_bias_level(&wm8731->codec, SND_SOC_BIAS_OFF); - snd_soc_unregister_dai(&wm8731_dai); - snd_soc_unregister_codec(&wm8731->codec); + struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec); + + wm8731_set_bias_level(codec, SND_SOC_BIAS_OFF); + + regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); regulator_bulk_free(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); - kfree(wm8731); - wm8731_codec = NULL; + + return 0; } +static struct snd_soc_codec_driver soc_codec_dev_wm8731 = { + .probe = wm8731_probe, + .remove = wm8731_remove, + .suspend = wm8731_suspend, + .resume = wm8731_resume, + .set_bias_level = wm8731_set_bias_level, + .reg_cache_size = sizeof(wm8731_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8731_reg, +}; + #if defined(CONFIG_SPI_MASTER) static int __devinit wm8731_spi_probe(struct spi_device *spi) { - struct snd_soc_codec *codec; struct wm8731_priv *wm8731; + int ret; wm8731 = kzalloc(sizeof(struct wm8731_priv), GFP_KERNEL); if (wm8731 == NULL) return -ENOMEM; - codec = &wm8731->codec; - codec->control_data = spi; - codec->dev = &spi->dev; - - dev_set_drvdata(&spi->dev, wm8731); + wm8731->control_data = spi; + wm8731->control_type = SND_SOC_SPI; + spi_set_drvdata(spi, wm8731); - return wm8731_register(wm8731, SND_SOC_SPI); + ret = snd_soc_register_codec(&spi->dev, + &soc_codec_dev_wm8731, &wm8731_dai, 1); + if (ret < 0) + kfree(wm8731); + return ret; } static int __devexit wm8731_spi_remove(struct spi_device *spi) { - struct wm8731_priv *wm8731 = dev_get_drvdata(&spi->dev); - - wm8731_unregister(wm8731); - + snd_soc_unregister_codec(&spi->dev); + kfree(spi_get_drvdata(spi)); return 0; } static struct spi_driver wm8731_spi_driver = { .driver = { - .name = "wm8731", + .name = "wm8731-codec", .bus = &spi_bus_type, .owner = THIS_MODULE, }, @@ -677,26 +591,27 @@ static __devinit int wm8731_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct wm8731_priv *wm8731; - struct snd_soc_codec *codec; + int ret; wm8731 = kzalloc(sizeof(struct wm8731_priv), GFP_KERNEL); if (wm8731 == NULL) return -ENOMEM; - codec = &wm8731->codec; - i2c_set_clientdata(i2c, wm8731); - codec->control_data = i2c; + wm8731->control_data = i2c; + wm8731->control_type = SND_SOC_I2C; - codec->dev = &i2c->dev; - - return wm8731_register(wm8731, SND_SOC_I2C); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8731, &wm8731_dai, 1); + if (ret < 0) + kfree(wm8731); + return ret; } static __devexit int wm8731_i2c_remove(struct i2c_client *client) { - struct wm8731_priv *wm8731 = i2c_get_clientdata(client); - wm8731_unregister(wm8731); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -708,7 +623,7 @@ MODULE_DEVICE_TABLE(i2c, wm8731_i2c_id); static struct i2c_driver wm8731_i2c_driver = { .driver = { - .name = "wm8731", + .name = "wm8731-codec", .owner = THIS_MODULE, }, .probe = wm8731_i2c_probe, @@ -719,7 +634,7 @@ static struct i2c_driver wm8731_i2c_driver = { static int __init wm8731_modinit(void) { - int ret; + int ret = 0; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ret = i2c_add_driver(&wm8731_i2c_driver); if (ret != 0) { @@ -734,7 +649,7 @@ static int __init wm8731_modinit(void) ret); } #endif - return 0; + return ret; } module_init(wm8731_modinit); diff --git a/sound/soc/codecs/wm8731.h b/sound/soc/codecs/wm8731.h index cd7b806e8ad0..73a70e206ba9 100644 --- a/sound/soc/codecs/wm8731.h +++ b/sound/soc/codecs/wm8731.h @@ -34,7 +34,4 @@ #define WM8731_SYSCLK 0 #define WM8731_DAI 0 -extern struct snd_soc_dai wm8731_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8731; - #endif diff --git a/sound/soc/codecs/wm8741.c b/sound/soc/codecs/wm8741.c index b9ea8904ad4b..0c6d59e4d226 100644 --- a/sound/soc/codecs/wm8741.c +++ b/sound/soc/codecs/wm8741.c @@ -30,9 +30,6 @@ #include "wm8741.h" -static struct snd_soc_codec *wm8741_codec; -struct snd_soc_codec_device soc_codec_dev_wm8741; - #define WM8741_NUM_SUPPLIES 2 static const char *wm8741_supply_names[WM8741_NUM_SUPPLIES] = { "AVDD", @@ -43,7 +40,8 @@ static const char *wm8741_supply_names[WM8741_NUM_SUPPLIES] = { /* codec private data */ struct wm8741_priv { - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; u16 reg_cache[WM8741_REGISTER_COUNT]; struct regulator_bulk_data supplies[WM8741_NUM_SUPPLIES]; unsigned int sysclk; @@ -145,8 +143,7 @@ static int wm8741_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec); u16 iface = snd_soc_read(codec, WM8741_FORMAT_CONTROL) & 0x1FC; int i; @@ -314,7 +311,7 @@ static struct snd_soc_dai_ops wm8741_dai_ops = { .set_fmt = wm8741_set_dai_fmt, }; -struct snd_soc_dai wm8741_dai = { +static struct snd_soc_dai_driver wm8741_dai = { .name = "WM8741", .playback = { .stream_name = "Playback", @@ -325,13 +322,10 @@ struct snd_soc_dai wm8741_dai = { }, .ops = &wm8741_dai_ops, }; -EXPORT_SYMBOL_GPL(wm8741_dai); #ifdef CONFIG_PM -static int wm8741_resume(struct platform_device *pdev) +static int wm8741_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; u16 *cache = codec->reg_cache; int i; @@ -348,189 +342,105 @@ static int wm8741_resume(struct platform_device *pdev) #define wm8741_resume NULL #endif -static int wm8741_probe(struct platform_device *pdev) +static int wm8741_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; + struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec); int ret = 0; - if (wm8741_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; + codec->control_data = wm8741->control_data; + ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8741->control_type); + if (ret != 0) { + dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); + return ret; } - socdev->card->codec = wm8741_codec; - codec = wm8741_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); + ret = wm8741_reset(codec); if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; + dev_err(codec->dev, "Failed to issue reset\n"); + return ret; } + /* Change some default settings - latch VU */ + wm8741->reg_cache[WM8741_DACLLSB_ATTENUATION] |= WM8741_UPDATELL; + wm8741->reg_cache[WM8741_DACLMSB_ATTENUATION] |= WM8741_UPDATELM; + wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERL; + wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERM; + snd_soc_add_controls(codec, wm8741_snd_controls, ARRAY_SIZE(wm8741_snd_controls)); wm8741_add_widgets(codec); + dev_dbg(codec->dev, "Successful registration\n"); return ret; - -pcm_err: - return ret; -} - -static int wm8741_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; } -struct snd_soc_codec_device soc_codec_dev_wm8741 = { +static struct snd_soc_codec_driver soc_codec_dev_wm8741 = { .probe = wm8741_probe, - .remove = wm8741_remove, .resume = wm8741_resume, + .reg_cache_size = sizeof(wm8741_reg_defaults), + .reg_word_size = sizeof(u16), + .reg_cache_default = &wm8741_reg_defaults, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8741); -static int wm8741_register(struct wm8741_priv *wm8741, - enum snd_soc_control_type control) +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +static int wm8741_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) { - int ret; - struct snd_soc_codec *codec = &wm8741->codec; - int i; - - if (wm8741_codec) { - dev_err(codec->dev, "Another WM8741 is registered\n"); - return -EINVAL; - } - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); + struct wm8741_priv *wm8741; + int ret, i; - snd_soc_codec_set_drvdata(codec, wm8741); - codec->name = "WM8741"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = NULL; - codec->dai = &wm8741_dai; - codec->num_dai = 1; - codec->reg_cache_size = WM8741_REGISTER_COUNT; - codec->reg_cache = &wm8741->reg_cache; + wm8741 = kzalloc(sizeof(struct wm8741_priv), GFP_KERNEL); + if (wm8741 == NULL) + return -ENOMEM; wm8741->rate_constraint.list = &wm8741->rate_constraint_list[0]; wm8741->rate_constraint.count = ARRAY_SIZE(wm8741->rate_constraint_list); - memcpy(codec->reg_cache, wm8741_reg_defaults, - sizeof(wm8741->reg_cache)); - - ret = snd_soc_codec_set_cache_io(codec, 7, 9, control); - if (ret != 0) { - dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; - } - for (i = 0; i < ARRAY_SIZE(wm8741->supplies); i++) wm8741->supplies[i].supply = wm8741_supply_names[i]; - ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8741->supplies), + ret = regulator_bulk_get(&i2c->dev, ARRAY_SIZE(wm8741->supplies), wm8741->supplies); if (ret != 0) { - dev_err(codec->dev, "Failed to request supplies: %d\n", ret); + dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret); goto err; } ret = regulator_bulk_enable(ARRAY_SIZE(wm8741->supplies), wm8741->supplies); if (ret != 0) { - dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); + dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret); goto err_get; } - ret = wm8741_reset(codec); - if (ret < 0) { - dev_err(codec->dev, "Failed to issue reset\n"); - goto err_enable; - } - - wm8741_dai.dev = codec->dev; - - /* Change some default settings - latch VU */ - wm8741->reg_cache[WM8741_DACLLSB_ATTENUATION] |= WM8741_UPDATELL; - wm8741->reg_cache[WM8741_DACLMSB_ATTENUATION] |= WM8741_UPDATELM; - wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERL; - wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERM; - - wm8741_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - return ret; - } - - ret = snd_soc_register_dai(&wm8741_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - snd_soc_unregister_codec(codec); - return ret; - } + i2c_set_clientdata(i2c, wm8741); + wm8741->control_data = i2c; + wm8741->control_type = SND_SOC_I2C; - dev_dbg(codec->dev, "Successful registration\n"); - return 0; + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8741, &wm8741_dai, 1); + if (ret < 0) + goto err_enable; + return ret; err_enable: regulator_bulk_disable(ARRAY_SIZE(wm8741->supplies), wm8741->supplies); err_get: regulator_bulk_free(ARRAY_SIZE(wm8741->supplies), wm8741->supplies); - err: kfree(wm8741); return ret; } -static void wm8741_unregister(struct wm8741_priv *wm8741) -{ - regulator_bulk_free(ARRAY_SIZE(wm8741->supplies), wm8741->supplies); - - snd_soc_unregister_dai(&wm8741_dai); - snd_soc_unregister_codec(&wm8741->codec); - kfree(wm8741); - wm8741_codec = NULL; -} - -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) -static __devinit int wm8741_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) -{ - struct wm8741_priv *wm8741; - struct snd_soc_codec *codec; - - wm8741 = kzalloc(sizeof(struct wm8741_priv), GFP_KERNEL); - if (wm8741 == NULL) - return -ENOMEM; - - codec = &wm8741->codec; - codec->hw_write = (hw_write_t)i2c_master_send; - - i2c_set_clientdata(i2c, wm8741); - codec->control_data = i2c; - - codec->dev = &i2c->dev; - - return wm8741_register(wm8741, SND_SOC_I2C); -} - -static __devexit int wm8741_i2c_remove(struct i2c_client *client) +static int wm8741_i2c_remove(struct i2c_client *client) { struct wm8741_priv *wm8741 = i2c_get_clientdata(client); - wm8741_unregister(wm8741); + + snd_soc_unregister_codec(&client->dev); + regulator_bulk_free(ARRAY_SIZE(wm8741->supplies), wm8741->supplies); + kfree(i2c_get_clientdata(client)); return 0; } @@ -540,29 +450,29 @@ static const struct i2c_device_id wm8741_i2c_id[] = { }; MODULE_DEVICE_TABLE(i2c, wm8741_i2c_id); - static struct i2c_driver wm8741_i2c_driver = { .driver = { - .name = "WM8741", + .name = "wm8741-codec", .owner = THIS_MODULE, }, .probe = wm8741_i2c_probe, - .remove = __devexit_p(wm8741_i2c_remove), + .remove = wm8741_i2c_remove, .id_table = wm8741_i2c_id, }; #endif static int __init wm8741_modinit(void) { - int ret; + int ret = 0; + #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ret = i2c_add_driver(&wm8741_i2c_driver); if (ret != 0) { - printk(KERN_ERR "Failed to register WM8741 I2C driver: %d\n", - ret); + pr_err("Failed to register WM8741 I2C driver: %d\n", ret); } #endif - return 0; + + return ret; } module_init(wm8741_modinit); diff --git a/sound/soc/codecs/wm8741.h b/sound/soc/codecs/wm8741.h index fdef6ecd1f6f..56c1b1d4a681 100644 --- a/sound/soc/codecs/wm8741.h +++ b/sound/soc/codecs/wm8741.h @@ -208,7 +208,4 @@ #define WM8741_SYSCLK 0 -extern struct snd_soc_dai wm8741_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8741; - #endif diff --git a/sound/soc/codecs/wm8750.c b/sound/soc/codecs/wm8750.c index e2c05e3e323a..89863a5bc830 100644 --- a/sound/soc/codecs/wm8750.c +++ b/sound/soc/codecs/wm8750.c @@ -52,7 +52,8 @@ static const u16 wm8750_reg[] = { /* codec private data */ struct wm8750_priv { unsigned int sysclk; - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; u16 reg_cache[ARRAY_SIZE(wm8750_reg)]; }; @@ -560,8 +561,7 @@ static int wm8750_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct wm8750_priv *wm8750 = snd_soc_codec_get_drvdata(codec); u16 iface = snd_soc_read(codec, WM8750_IFACE) & 0x1f3; u16 srate = snd_soc_read(codec, WM8750_SRATE) & 0x1c0; @@ -649,8 +649,8 @@ static struct snd_soc_dai_ops wm8750_dai_ops = { .set_sysclk = wm8750_set_dai_sysclk, }; -struct snd_soc_dai wm8750_dai = { - .name = "WM8750", +static struct snd_soc_dai_driver wm8750_dai = { + .name = "wm8750-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -665,21 +665,15 @@ struct snd_soc_dai wm8750_dai = { .formats = WM8750_FORMATS,}, .ops = &wm8750_dai_ops, }; -EXPORT_SYMBOL_GPL(wm8750_dai); -static int wm8750_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8750_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8750_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8750_resume(struct platform_device *pdev) +static int wm8750_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; int i; u8 data[2]; u16 *cache = codec->reg_cache; @@ -698,100 +692,22 @@ static int wm8750_resume(struct platform_device *pdev) return 0; } -static struct snd_soc_codec *wm8750_codec; - -static int wm8750_probe(struct platform_device *pdev) +static int wm8750_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - if (!wm8750_codec) { - dev_err(&pdev->dev, "WM8750 codec not yet registered\n"); - return -EINVAL; - } - - socdev->card->codec = wm8750_codec; - codec = wm8750_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - printk(KERN_ERR "wm8750: failed to create pcms\n"); - goto err; - } - - snd_soc_add_controls(codec, wm8750_snd_controls, - ARRAY_SIZE(wm8750_snd_controls)); - wm8750_add_widgets(codec); - - return 0; - -err: - return ret; -} - -/* power down chip */ -static int wm8750_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8750 = { - .probe = wm8750_probe, - .remove = wm8750_remove, - .suspend = wm8750_suspend, - .resume = wm8750_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8750); - -/* - * initialise the WM8750 driver - * register the mixer and dsp interfaces with the kernel - */ -static int wm8750_register(struct wm8750_priv *wm8750, - enum snd_soc_control_type control) -{ - struct snd_soc_codec *codec = &wm8750->codec; - int reg, ret = 0; - - if (wm8750_codec) { - dev_err(codec->dev, "Multiple WM8750 devices not supported\n"); - ret = -EINVAL; - goto err; - } - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - codec->name = "WM8750"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_STANDBY; - codec->set_bias_level = wm8750_set_bias_level; - codec->dai = &wm8750_dai; - codec->num_dai = 1; - codec->reg_cache_size = ARRAY_SIZE(wm8750->reg_cache) + 1; - codec->reg_cache = &wm8750->reg_cache; - snd_soc_codec_set_drvdata(codec, wm8750); - - memcpy(codec->reg_cache, wm8750_reg, sizeof(wm8750->reg_cache)); + struct wm8750_priv *wm8750 = snd_soc_codec_get_drvdata(codec); + int reg, ret; - ret = snd_soc_codec_set_cache_io(codec, 7, 9, control); + codec->control_data = wm8750->control_data; + ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8750->control_type); if (ret < 0) { printk(KERN_ERR "wm8750: failed to set cache I/O: %d\n", ret); - goto err; + return ret; } ret = wm8750_reset(codec); if (ret < 0) { printk(KERN_ERR "wm8750: failed to reset: %d\n", ret); - goto err; + return ret; } /* charge output caps */ @@ -815,150 +731,133 @@ static int wm8750_register(struct wm8750_priv *wm8750, reg = snd_soc_read(codec, WM8750_RINVOL); snd_soc_write(codec, WM8750_RINVOL, reg | 0x0100); - wm8750_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err; - } - - ret = snd_soc_register_dais(&wm8750_dai, 1); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAIs: %d\n", ret); - goto err_codec; - } - - return 0; - -err_codec: - snd_soc_unregister_codec(codec); -err: - kfree(wm8750); + snd_soc_add_controls(codec, wm8750_snd_controls, + ARRAY_SIZE(wm8750_snd_controls)); + wm8750_add_widgets(codec); return ret; } -static void wm8750_unregister(struct wm8750_priv *wm8750) +static int wm8750_remove(struct snd_soc_codec *codec) { - wm8750_set_bias_level(&wm8750->codec, SND_SOC_BIAS_OFF); - snd_soc_unregister_dais(&wm8750_dai, 1); - snd_soc_unregister_codec(&wm8750->codec); - kfree(wm8750); - wm8750_codec = NULL; + wm8750_set_bias_level(codec, SND_SOC_BIAS_OFF); + return 0; } -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - -/* - * WM8750 2 wire address is determined by GPIO5 - * state during powerup. - * low = 0x1a - * high = 0x1b - */ +static struct snd_soc_codec_driver soc_codec_dev_wm8750 = { + .probe = wm8750_probe, + .remove = wm8750_remove, + .suspend = wm8750_suspend, + .resume = wm8750_resume, + .set_bias_level = wm8750_set_bias_level, + .reg_cache_size = sizeof(wm8750_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8750_reg, +}; -static int wm8750_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) +#if defined(CONFIG_SPI_MASTER) +static int __devinit wm8750_spi_probe(struct spi_device *spi) { - struct snd_soc_codec *codec; struct wm8750_priv *wm8750; + int ret; wm8750 = kzalloc(sizeof(struct wm8750_priv), GFP_KERNEL); if (wm8750 == NULL) return -ENOMEM; - codec = &wm8750->codec; - codec->control_data = i2c; - i2c_set_clientdata(i2c, wm8750); - - codec->dev = &i2c->dev; + wm8750->control_data = spi; + wm8750->control_type = SND_SOC_SPI; + spi_set_drvdata(spi, wm8750); - return wm8750_register(wm8750, SND_SOC_I2C); + ret = snd_soc_register_codec(&spi->dev, + &soc_codec_dev_wm8750, &wm8750_dai, 1); + if (ret < 0) + kfree(wm8750); + return ret; } -static int wm8750_i2c_remove(struct i2c_client *client) +static int __devexit wm8750_spi_remove(struct spi_device *spi) { - struct wm8750_priv *wm8750 = i2c_get_clientdata(client); - wm8750_unregister(wm8750); + snd_soc_unregister_codec(&spi->dev); + kfree(spi_get_drvdata(spi)); return 0; } -static const struct i2c_device_id wm8750_i2c_id[] = { - { "wm8750", 0 }, - { "wm8987", 0 }, /* WM8987 is register compatible with WM8750 */ - { } -}; -MODULE_DEVICE_TABLE(i2c, wm8750_i2c_id); - -static struct i2c_driver wm8750_i2c_driver = { +static struct spi_driver wm8750_spi_driver = { .driver = { - .name = "WM8750 I2C Codec", - .owner = THIS_MODULE, + .name = "wm8750-codec", + .bus = &spi_bus_type, + .owner = THIS_MODULE, }, - .probe = wm8750_i2c_probe, - .remove = wm8750_i2c_remove, - .id_table = wm8750_i2c_id, + .probe = wm8750_spi_probe, + .remove = __devexit_p(wm8750_spi_remove), }; -#endif +#endif /* CONFIG_SPI_MASTER */ -#if defined(CONFIG_SPI_MASTER) -static int __devinit wm8750_spi_probe(struct spi_device *spi) +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +static __devinit int wm8750_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) { - struct snd_soc_codec *codec; struct wm8750_priv *wm8750; + int ret; wm8750 = kzalloc(sizeof(struct wm8750_priv), GFP_KERNEL); if (wm8750 == NULL) return -ENOMEM; - codec = &wm8750->codec; - codec->control_data = spi; - codec->dev = &spi->dev; - - dev_set_drvdata(&spi->dev, wm8750); + i2c_set_clientdata(i2c, wm8750); + wm8750->control_data = i2c; + wm8750->control_type = SND_SOC_I2C; - return wm8750_register(wm8750, SND_SOC_SPI); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8750, &wm8750_dai, 1); + if (ret < 0) + kfree(wm8750); + return ret; } -static int __devexit wm8750_spi_remove(struct spi_device *spi) +static __devexit int wm8750_i2c_remove(struct i2c_client *client) { - struct wm8750_priv *wm8750 = dev_get_drvdata(&spi->dev); - wm8750_unregister(wm8750); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } -static const struct spi_device_id wm8750_spi_id[] = { +static const struct i2c_device_id wm8750_i2c_id[] = { { "wm8750", 0 }, { "wm8987", 0 }, { } }; -MODULE_DEVICE_TABLE(spi, wm8750_spi_id); +MODULE_DEVICE_TABLE(i2c, wm8750_i2c_id); -static struct spi_driver wm8750_spi_driver = { +static struct i2c_driver wm8750_i2c_driver = { .driver = { - .name = "WM8750 SPI Codec", - .bus = &spi_bus_type, - .owner = THIS_MODULE, + .name = "wm8750-codec", + .owner = THIS_MODULE, }, - .probe = wm8750_spi_probe, - .remove = __devexit_p(wm8750_spi_remove), - .id_table = wm8750_spi_id, + .probe = wm8750_i2c_probe, + .remove = __devexit_p(wm8750_i2c_remove), + .id_table = wm8750_i2c_id, }; #endif static int __init wm8750_modinit(void) { - int ret; + int ret = 0; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ret = i2c_add_driver(&wm8750_i2c_driver); - if (ret != 0) - pr_err("Failed to register WM8750 I2C driver: %d\n", ret); + if (ret != 0) { + printk(KERN_ERR "Failed to register wm8750 I2C driver: %d\n", + ret); + } #endif #if defined(CONFIG_SPI_MASTER) ret = spi_register_driver(&wm8750_spi_driver); - if (ret != 0) - pr_err("Failed to register WM8750 SPI driver: %d\n", ret); + if (ret != 0) { + printk(KERN_ERR "Failed to register wm8750 SPI driver: %d\n", + ret); + } #endif - return 0; + return ret; } module_init(wm8750_modinit); diff --git a/sound/soc/codecs/wm8750.h b/sound/soc/codecs/wm8750.h index 1dc100e19cfe..121427c047fb 100644 --- a/sound/soc/codecs/wm8750.h +++ b/sound/soc/codecs/wm8750.h @@ -57,13 +57,4 @@ #define WM8750_SYSCLK 0 -struct wm8750_setup_data { - int spi; - int i2c_bus; - unsigned short i2c_address; -}; - -extern struct snd_soc_dai wm8750_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8750; - #endif diff --git a/sound/soc/codecs/wm8753.c b/sound/soc/codecs/wm8753.c index b59f349c5218..976e408b3616 100644 --- a/sound/soc/codecs/wm8753.c +++ b/sound/soc/codecs/wm8753.c @@ -57,7 +57,7 @@ module_param(caps_charge, int, 0); MODULE_PARM_DESC(caps_charge, "WM8753 cap charge time (msecs)"); static void wm8753_set_dai_mode(struct snd_soc_codec *codec, - unsigned int mode); + struct snd_soc_dai *dai, unsigned int hifi); /* * wm8753 register cache @@ -85,10 +85,12 @@ static const u16 wm8753_reg[] = { /* codec private data */ struct wm8753_priv { + enum snd_soc_control_type control_type; + void *control_data; unsigned int sysclk; unsigned int pcmclk; - struct snd_soc_codec codec; u16 reg_cache[ARRAY_SIZE(wm8753_reg)]; + int dai_func; }; /* @@ -228,6 +230,7 @@ static int wm8753_set_dai(struct snd_kcontrol *kcontrol, { struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); int mode = wm8753_read_reg_cache(codec, WM8753_IOCTL); + struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); if (((mode & 0xc) >> 2) == ucontrol->value.integer.value[0]) return 0; @@ -235,8 +238,7 @@ static int wm8753_set_dai(struct snd_kcontrol *kcontrol, mode &= 0xfff3; mode |= (ucontrol->value.integer.value[0] << 2); - wm8753_write(codec, WM8753_IOCTL, mode); - wm8753_set_dai_mode(codec, ucontrol->value.integer.value[0]); + wm8753->dai_func = ucontrol->value.integer.value[0]; return 1; } @@ -904,6 +906,13 @@ static int wm8753_vdac_adc_set_dai_fmt(struct snd_soc_dai *codec_dai, return 0; } +static int wm8753_pcm_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + wm8753_set_dai_mode(dai->codec, dai, 0); + return 0; +} + /* * Set PCM DAI bit size and sample rate. */ @@ -912,8 +921,7 @@ static int wm8753_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); u16 voice = wm8753_read_reg_cache(codec, WM8753_PCM) & 0x01f3; u16 srate = wm8753_read_reg_cache(codec, WM8753_SRATE1) & 0x017f; @@ -1138,6 +1146,13 @@ static int wm8753_i2s_set_dai_fmt(struct snd_soc_dai *codec_dai, return 0; } +static int wm8753_i2s_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + wm8753_set_dai_mode(dai->codec, dai, 1); + return 0; +} + /* * Set PCM DAI bit size and sample rate. */ @@ -1146,8 +1161,7 @@ static int wm8753_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); u16 srate = wm8753_read_reg_cache(codec, WM8753_SRATE1) & 0x01c0; u16 hifi = wm8753_read_reg_cache(codec, WM8753_HIFI) & 0x01f3; @@ -1240,12 +1254,12 @@ static int wm8753_mute(struct snd_soc_dai *dai, int mute) { struct snd_soc_codec *codec = dai->codec; u16 mute_reg = wm8753_read_reg_cache(codec, WM8753_DAC) & 0xfff7; + struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); /* the digital mute covers the HiFi and Voice DAC's on the WM8753. * make sure we check if they are not both active when we mute */ - if (mute && dai->id == 1) { - if (!wm8753_dai[WM8753_DAI_VOICE].playback.active || - !wm8753_dai[WM8753_DAI_HIFI].playback.active) + if (mute && wm8753->dai_func == 1) { + if (!codec->active) wm8753_write(codec, WM8753_DAC, mute_reg | 0x8); } else { if (mute) @@ -1303,6 +1317,7 @@ static int wm8753_set_bias_level(struct snd_soc_codec *codec, * 4. Voice disabled - HIFI over HIFI, uses voice DAI LRC for capture */ static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode1 = { + .startup = wm8753_i2s_startup, .hw_params = wm8753_i2s_hw_params, .digital_mute = wm8753_mute, .set_fmt = wm8753_mode1h_set_dai_fmt, @@ -1312,6 +1327,7 @@ static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode1 = { }; static struct snd_soc_dai_ops wm8753_dai_ops_voice_mode1 = { + .startup = wm8753_pcm_startup, .hw_params = wm8753_pcm_hw_params, .digital_mute = wm8753_mute, .set_fmt = wm8753_mode1v_set_dai_fmt, @@ -1321,6 +1337,7 @@ static struct snd_soc_dai_ops wm8753_dai_ops_voice_mode1 = { }; static struct snd_soc_dai_ops wm8753_dai_ops_voice_mode2 = { + .startup = wm8753_pcm_startup, .hw_params = wm8753_pcm_hw_params, .digital_mute = wm8753_mute, .set_fmt = wm8753_mode2_set_dai_fmt, @@ -1330,6 +1347,7 @@ static struct snd_soc_dai_ops wm8753_dai_ops_voice_mode2 = { }; static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode3 = { + .startup = wm8753_i2s_startup, .hw_params = wm8753_i2s_hw_params, .digital_mute = wm8753_mute, .set_fmt = wm8753_mode3_4_set_dai_fmt, @@ -1339,6 +1357,7 @@ static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode3 = { }; static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode4 = { + .startup = wm8753_i2s_startup, .hw_params = wm8753_i2s_hw_params, .digital_mute = wm8753_mute, .set_fmt = wm8753_mode3_4_set_dai_fmt, @@ -1347,10 +1366,9 @@ static struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode4 = { .set_sysclk = wm8753_set_dai_sysclk, }; -static const struct snd_soc_dai wm8753_all_dai[] = { +static struct snd_soc_dai_driver wm8753_all_dai[] = { /* DAI HiFi mode 1 */ -{ .name = "WM8753 HiFi", - .id = 1, +{ .name = "wm8753-hifi", .playback = { .stream_name = "HiFi Playback", .channels_min = 1, @@ -1366,8 +1384,7 @@ static const struct snd_soc_dai wm8753_all_dai[] = { .ops = &wm8753_dai_ops_hifi_mode1, }, /* DAI Voice mode 1 */ -{ .name = "WM8753 Voice", - .id = 1, +{ .name = "wm8753-voice", .playback = { .stream_name = "Voice Playback", .channels_min = 1, @@ -1383,12 +1400,10 @@ static const struct snd_soc_dai wm8753_all_dai[] = { .ops = &wm8753_dai_ops_voice_mode1, }, /* DAI HiFi mode 2 - dummy */ -{ .name = "WM8753 HiFi", - .id = 2, +{ .name = "wm8753-hifi", }, /* DAI Voice mode 2 */ -{ .name = "WM8753 Voice", - .id = 2, +{ .name = "wm8753-voice", .playback = { .stream_name = "Voice Playback", .channels_min = 1, @@ -1404,8 +1419,7 @@ static const struct snd_soc_dai wm8753_all_dai[] = { .ops = &wm8753_dai_ops_voice_mode2, }, /* DAI HiFi mode 3 */ -{ .name = "WM8753 HiFi", - .id = 3, +{ .name = "wm8753-hifi", .playback = { .stream_name = "HiFi Playback", .channels_min = 1, @@ -1421,12 +1435,10 @@ static const struct snd_soc_dai wm8753_all_dai[] = { .ops = &wm8753_dai_ops_hifi_mode3, }, /* DAI Voice mode 3 - dummy */ -{ .name = "WM8753 Voice", - .id = 3, +{ .name = "wm8753-voice", }, /* DAI HiFi mode 4 */ -{ .name = "WM8753 HiFi", - .id = 4, +{ .name = "wm8753-hifi", .playback = { .stream_name = "HiFi Playback", .channels_min = 1, @@ -1442,58 +1454,31 @@ static const struct snd_soc_dai wm8753_all_dai[] = { .ops = &wm8753_dai_ops_hifi_mode4, }, /* DAI Voice mode 4 - dummy */ -{ .name = "WM8753 Voice", - .id = 4, +{ .name = "wm8753-voice", }, }; -struct snd_soc_dai wm8753_dai[] = { +static struct snd_soc_dai_driver wm8753_dai[] = { { - .name = "WM8753 DAI 0", + .name = "wm8753-aif0", }, { - .name = "WM8753 DAI 1", + .name = "wm8753-aif1", }, }; -EXPORT_SYMBOL_GPL(wm8753_dai); -static void wm8753_set_dai_mode(struct snd_soc_codec *codec, unsigned int mode) +static void wm8753_set_dai_mode(struct snd_soc_codec *codec, + struct snd_soc_dai *dai, unsigned int hifi) { - if (mode < 4) { - int playback_active, capture_active, codec_active, pop_wait; - void *private_data; - struct list_head list; - - playback_active = wm8753_dai[0].playback.active; - capture_active = wm8753_dai[0].capture.active; - codec_active = wm8753_dai[0].active; - private_data = wm8753_dai[0].private_data; - pop_wait = wm8753_dai[0].pop_wait; - list = wm8753_dai[0].list; - wm8753_dai[0] = wm8753_all_dai[mode << 1]; - wm8753_dai[0].playback.active = playback_active; - wm8753_dai[0].capture.active = capture_active; - wm8753_dai[0].active = codec_active; - wm8753_dai[0].private_data = private_data; - wm8753_dai[0].pop_wait = pop_wait; - wm8753_dai[0].list = list; - - playback_active = wm8753_dai[1].playback.active; - capture_active = wm8753_dai[1].capture.active; - codec_active = wm8753_dai[1].active; - private_data = wm8753_dai[1].private_data; - pop_wait = wm8753_dai[1].pop_wait; - list = wm8753_dai[1].list; - wm8753_dai[1] = wm8753_all_dai[(mode << 1) + 1]; - wm8753_dai[1].playback.active = playback_active; - wm8753_dai[1].capture.active = capture_active; - wm8753_dai[1].active = codec_active; - wm8753_dai[1].private_data = private_data; - wm8753_dai[1].pop_wait = pop_wait; - wm8753_dai[1].list = list; + struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); + + if (wm8753->dai_func < 4) { + if (hifi) + dai->driver = &wm8753_all_dai[wm8753->dai_func << 1]; + else + dai->driver = &wm8753_all_dai[(wm8753->dai_func << 1) + 1]; } - wm8753_dai[0].codec = codec; - wm8753_dai[1].codec = codec; + wm8753_write(codec, WM8753_IOCTL, wm8753->dai_func); } static void wm8753_work(struct work_struct *work) @@ -1503,19 +1488,14 @@ static void wm8753_work(struct work_struct *work) wm8753_set_bias_level(codec, codec->bias_level); } -static int wm8753_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8753_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8753_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8753_resume(struct platform_device *pdev) +static int wm8753_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; int i; u8 data[2]; u16 *cache = codec->reg_cache; @@ -1547,41 +1527,6 @@ static int wm8753_resume(struct platform_device *pdev) return 0; } -static struct snd_soc_codec *wm8753_codec; - -static int wm8753_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - if (!wm8753_codec) { - dev_err(&pdev->dev, "WM8753 codec not yet registered\n"); - return -EINVAL; - } - - socdev->card->codec = wm8753_codec; - codec = wm8753_codec; - - wm8753_set_dai_mode(codec, 0); - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - printk(KERN_ERR "wm8753: failed to create pcms\n"); - goto pcm_err; - } - - snd_soc_add_controls(codec, wm8753_snd_controls, - ARRAY_SIZE(wm8753_snd_controls)); - wm8753_add_widgets(codec); - - return 0; - -pcm_err: - return ret; -} - /* * This function forces any delayed work to be queued and run. */ @@ -1601,62 +1546,30 @@ static int run_delayed_work(struct delayed_work *dwork) return ret; } -/* power down chip */ -static int wm8753_remove(struct platform_device *pdev) +static int wm8753_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8753 = { - .probe = wm8753_probe, - .remove = wm8753_remove, - .suspend = wm8753_suspend, - .resume = wm8753_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8753); + struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); + int ret = 0, reg; -static int wm8753_register(struct wm8753_priv *wm8753) -{ - int ret, i; - struct snd_soc_codec *codec = &wm8753->codec; - u16 reg; + codec->bias_level = SND_SOC_BIAS_OFF, + codec->control_data = wm8753->control_data; + INIT_DELAYED_WORK(&codec->delayed_work, wm8753_work); - if (wm8753_codec) { - dev_err(codec->dev, "Multiple WM8753 devices not supported\n"); - ret = -EINVAL; - goto err; + ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8753->control_type); + if (ret < 0) { + dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); + return ret; } - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - codec->name = "WM8753"; - codec->owner = THIS_MODULE; - codec->read = wm8753_read_reg_cache; - codec->write = wm8753_write; - codec->bias_level = SND_SOC_BIAS_STANDBY; - codec->set_bias_level = wm8753_set_bias_level; - codec->dai = wm8753_dai; - codec->num_dai = 2; - codec->reg_cache_size = ARRAY_SIZE(wm8753->reg_cache) + 1; - codec->reg_cache = &wm8753->reg_cache; - snd_soc_codec_set_drvdata(codec, wm8753); - - memcpy(codec->reg_cache, wm8753_reg, sizeof(wm8753->reg_cache)); - INIT_DELAYED_WORK(&codec->delayed_work, wm8753_work); - ret = wm8753_reset(codec); if (ret < 0) { - dev_err(codec->dev, "Failed to issue reset\n"); - goto err; + dev_err(codec->dev, "Failed to issue reset: %d\n", ret); + return ret; } + wm8753_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + wm8753->dai_func = 0; + /* charge output caps */ wm8753_set_bias_level(codec, SND_SOC_BIAS_PREPARE); schedule_delayed_work(&codec->delayed_work, @@ -1684,165 +1597,139 @@ static int wm8753_register(struct wm8753_priv *wm8753) reg = wm8753_read_reg_cache(codec, WM8753_RINVOL); wm8753_write(codec, WM8753_RINVOL, reg | 0x0100); - wm8753_codec = codec; - - for (i = 0; i < ARRAY_SIZE(wm8753_dai); i++) - wm8753_dai[i].dev = codec->dev; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err; - } - - ret = snd_soc_register_dais(&wm8753_dai[0], ARRAY_SIZE(wm8753_dai)); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAIs: %d\n", ret); - goto err_codec; - } + snd_soc_add_controls(codec, wm8753_snd_controls, + ARRAY_SIZE(wm8753_snd_controls)); + wm8753_add_widgets(codec); return 0; -err_codec: run_delayed_work(&codec->delayed_work); - snd_soc_unregister_codec(codec); -err: - kfree(wm8753); return ret; } -static void wm8753_unregister(struct wm8753_priv *wm8753) +/* power down chip */ +static int wm8753_remove(struct snd_soc_codec *codec) { - wm8753_set_bias_level(&wm8753->codec, SND_SOC_BIAS_OFF); - run_delayed_work(&wm8753->codec.delayed_work); - snd_soc_unregister_dais(&wm8753_dai[0], ARRAY_SIZE(wm8753_dai)); - snd_soc_unregister_codec(&wm8753->codec); - kfree(wm8753); - wm8753_codec = NULL; + run_delayed_work(&codec->delayed_work); + wm8753_set_bias_level(codec, SND_SOC_BIAS_OFF); + + return 0; } -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +static struct snd_soc_codec_driver soc_codec_dev_wm8753 = { + .probe = wm8753_probe, + .remove = wm8753_remove, + .suspend = wm8753_suspend, + .resume = wm8753_resume, + .set_bias_level = wm8753_set_bias_level, + .reg_cache_size = sizeof(wm8753_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8753_reg, +}; -static int wm8753_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) +#if defined(CONFIG_SPI_MASTER) +static int __devinit wm8753_spi_probe(struct spi_device *spi) { - struct snd_soc_codec *codec; struct wm8753_priv *wm8753; + int ret; wm8753 = kzalloc(sizeof(struct wm8753_priv), GFP_KERNEL); if (wm8753 == NULL) return -ENOMEM; - codec = &wm8753->codec; - codec->hw_write = (hw_write_t)i2c_master_send; - codec->control_data = i2c; - i2c_set_clientdata(i2c, wm8753); - - codec->dev = &i2c->dev; + wm8753->control_data = spi; + wm8753->control_type = SND_SOC_SPI; + spi_set_drvdata(spi, wm8753); - return wm8753_register(wm8753); + ret = snd_soc_register_codec(&spi->dev, + &soc_codec_dev_wm8753, wm8753_dai, ARRAY_SIZE(wm8753_dai)); + if (ret < 0) + kfree(wm8753); + return ret; } -static int wm8753_i2c_remove(struct i2c_client *client) +static int __devexit wm8753_spi_remove(struct spi_device *spi) { - struct wm8753_priv *wm8753 = i2c_get_clientdata(client); - wm8753_unregister(wm8753); - return 0; + snd_soc_unregister_codec(&spi->dev); + kfree(spi_get_drvdata(spi)); + return 0; } -static const struct i2c_device_id wm8753_i2c_id[] = { - { "wm8753", 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, wm8753_i2c_id); - -static struct i2c_driver wm8753_i2c_driver = { +static struct spi_driver wm8753_spi_driver = { .driver = { - .name = "wm8753", - .owner = THIS_MODULE, + .name = "wm8753-codec", + .bus = &spi_bus_type, + .owner = THIS_MODULE, }, - .probe = wm8753_i2c_probe, - .remove = wm8753_i2c_remove, - .id_table = wm8753_i2c_id, + .probe = wm8753_spi_probe, + .remove = __devexit_p(wm8753_spi_remove), }; -#endif - -#if defined(CONFIG_SPI_MASTER) -static int wm8753_spi_write(struct spi_device *spi, const char *data, int len) -{ - struct spi_transfer t; - struct spi_message m; - u8 msg[2]; - - if (len <= 0) - return 0; - - msg[0] = data[0]; - msg[1] = data[1]; +#endif /* CONFIG_SPI_MASTER */ - spi_message_init(&m); - memset(&t, 0, (sizeof t)); - - t.tx_buf = &msg[0]; - t.len = len; - - spi_message_add_tail(&t, &m); - spi_sync(spi, &m); - - return len; -} - -static int __devinit wm8753_spi_probe(struct spi_device *spi) +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +static __devinit int wm8753_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) { - struct snd_soc_codec *codec; struct wm8753_priv *wm8753; + int ret; wm8753 = kzalloc(sizeof(struct wm8753_priv), GFP_KERNEL); if (wm8753 == NULL) return -ENOMEM; - codec = &wm8753->codec; - codec->control_data = spi; - codec->hw_write = (hw_write_t)wm8753_spi_write; - codec->dev = &spi->dev; - - dev_set_drvdata(&spi->dev, wm8753); + i2c_set_clientdata(i2c, wm8753); + wm8753->control_data = i2c; + wm8753->control_type = SND_SOC_I2C; - return wm8753_register(wm8753); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8753, wm8753_dai, ARRAY_SIZE(wm8753_dai)); + if (ret < 0) + kfree(wm8753); + return ret; } -static int __devexit wm8753_spi_remove(struct spi_device *spi) +static __devexit int wm8753_i2c_remove(struct i2c_client *client) { - struct wm8753_priv *wm8753 = dev_get_drvdata(&spi->dev); - wm8753_unregister(wm8753); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } -static struct spi_driver wm8753_spi_driver = { +static const struct i2c_device_id wm8753_i2c_id[] = { + { "wm8753", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, wm8753_i2c_id); + +static struct i2c_driver wm8753_i2c_driver = { .driver = { - .name = "wm8753", - .bus = &spi_bus_type, - .owner = THIS_MODULE, + .name = "wm8753-codec", + .owner = THIS_MODULE, }, - .probe = wm8753_spi_probe, - .remove = __devexit_p(wm8753_spi_remove), + .probe = wm8753_i2c_probe, + .remove = __devexit_p(wm8753_i2c_remove), + .id_table = wm8753_i2c_id, }; #endif static int __init wm8753_modinit(void) { - int ret; + int ret = 0; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ret = i2c_add_driver(&wm8753_i2c_driver); - if (ret != 0) - pr_err("Failed to register WM8753 I2C driver: %d\n", ret); + if (ret != 0) { + printk(KERN_ERR "Failed to register wm8753 I2C driver: %d\n", + ret); + } #endif #if defined(CONFIG_SPI_MASTER) ret = spi_register_driver(&wm8753_spi_driver); - if (ret != 0) - pr_err("Failed to register WM8753 SPI driver: %d\n", ret); + if (ret != 0) { + printk(KERN_ERR "Failed to register wm8753 SPI driver: %d\n", + ret); + } #endif - return 0; + return ret; } module_init(wm8753_modinit); diff --git a/sound/soc/codecs/wm8753.h b/sound/soc/codecs/wm8753.h index 57b2ba244040..94edac144bcb 100644 --- a/sound/soc/codecs/wm8753.h +++ b/sound/soc/codecs/wm8753.h @@ -115,7 +115,4 @@ #define WM8753_DAI_HIFI 0 #define WM8753_DAI_VOICE 1 -extern struct snd_soc_dai wm8753_dai[2]; -extern struct snd_soc_codec_device soc_codec_dev_wm8753; - #endif diff --git a/sound/soc/codecs/wm8776.c b/sound/soc/codecs/wm8776.c index 4e212ed62ea6..51a2d265d40e 100644 --- a/sound/soc/codecs/wm8776.c +++ b/sound/soc/codecs/wm8776.c @@ -31,20 +31,14 @@ #include "wm8776.h" -static struct snd_soc_codec *wm8776_codec; -struct snd_soc_codec_device soc_codec_dev_wm8776; - /* codec private data */ struct wm8776_priv { - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; u16 reg_cache[WM8776_CACHEREGNUM]; int sysclk[2]; }; -#ifdef CONFIG_SPI_MASTER -static int wm8776_spi_write(struct spi_device *spi, const char *data, int len); -#endif - static const u16 wm8776_reg[WM8776_CACHEREGNUM] = { 0x79, 0x79, 0x79, 0xff, 0xff, /* 4 */ 0xff, 0x00, 0x90, 0x00, 0x00, /* 9 */ @@ -144,7 +138,7 @@ static int wm8776_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) struct snd_soc_codec *codec = dai->codec; int reg, iface, master; - switch (dai->id) { + switch (dai->driver->id) { case WM8776_DAI_DAC: reg = WM8776_DACIFCTRL; master = 0x80; @@ -233,7 +227,7 @@ static int wm8776_hw_params(struct snd_pcm_substream *substream, iface = 0; - switch (dai->id) { + switch (dai->driver->id) { case WM8776_DAI_DAC: iface_reg = WM8776_DACIFCTRL; master = 0x80; @@ -267,7 +261,7 @@ static int wm8776_hw_params(struct snd_pcm_substream *substream, /* Only need to set MCLK/LRCLK ratio if we're master */ if (snd_soc_read(codec, WM8776_MSTRCTRL) & master) { for (i = 0; i < ARRAY_SIZE(mclk_ratios); i++) { - if (wm8776->sysclk[dai->id] / params_rate(params) + if (wm8776->sysclk[dai->driver->id] / params_rate(params) == mclk_ratios[i]) break; } @@ -275,7 +269,7 @@ static int wm8776_hw_params(struct snd_pcm_substream *substream, if (i == ARRAY_SIZE(mclk_ratios)) { dev_err(codec->dev, "Unable to configure MCLK ratio %d/%d\n", - wm8776->sysclk[dai->id], params_rate(params)); + wm8776->sysclk[dai->driver->id], params_rate(params)); return -EINVAL; } @@ -305,9 +299,9 @@ static int wm8776_set_sysclk(struct snd_soc_dai *dai, struct snd_soc_codec *codec = dai->codec; struct wm8776_priv *wm8776 = snd_soc_codec_get_drvdata(codec); - BUG_ON(dai->id >= ARRAY_SIZE(wm8776->sysclk)); + BUG_ON(dai->driver->id >= ARRAY_SIZE(wm8776->sysclk)); - wm8776->sysclk[dai->id] = freq; + wm8776->sysclk[dai->driver->id] = freq; return 0; } @@ -357,10 +351,10 @@ static struct snd_soc_dai_ops wm8776_adc_ops = { .set_sysclk = wm8776_set_sysclk, }; -struct snd_soc_dai wm8776_dai[] = { +static struct snd_soc_dai_driver wm8776_dai[] = { { - .name = "WM8776 Playback", - .id = WM8776_DAI_DAC, + .name = "wm8776-hifi-playback", + .id = WM8776_DAI_DAC, .playback = { .stream_name = "Playback", .channels_min = 2, @@ -371,8 +365,8 @@ struct snd_soc_dai wm8776_dai[] = { .ops = &wm8776_dac_ops, }, { - .name = "WM8776 Capture", - .id = WM8776_DAI_ADC, + .name = "wm8776-hifi-capture", + .id = WM8776_DAI_ADC, .capture = { .stream_name = "Capture", .channels_min = 2, @@ -383,23 +377,17 @@ struct snd_soc_dai wm8776_dai[] = { .ops = &wm8776_adc_ops, }, }; -EXPORT_SYMBOL_GPL(wm8776_dai); #ifdef CONFIG_PM -static int wm8776_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8776_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8776_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8776_resume(struct platform_device *pdev) +static int wm8776_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; int i; u8 data[2]; u16 *cache = codec->reg_cache; @@ -422,27 +410,31 @@ static int wm8776_resume(struct platform_device *pdev) #define wm8776_resume NULL #endif -static int wm8776_probe(struct platform_device *pdev) +static int wm8776_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; + struct wm8776_priv *wm8776 = snd_soc_codec_get_drvdata(codec); int ret = 0; - if (wm8776_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; + codec->control_data = wm8776->control_data; + ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8776->control_type); + if (ret < 0) { + dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); + return ret; } - socdev->card->codec = wm8776_codec; - codec = wm8776_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); + ret = wm8776_reset(codec); if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; + dev_err(codec->dev, "Failed to issue reset: %d\n", ret); + return ret; } + wm8776_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + + /* Latch the update bits; right channel only since we always + * update both. */ + snd_soc_update_bits(codec, WM8776_HPRVOL, 0x100, 0x100); + snd_soc_update_bits(codec, WM8776_DACRVOL, 0x100, 0x100); + snd_soc_add_controls(codec, wm8776_snd_controls, ARRAY_SIZE(wm8776_snd_controls)); snd_soc_dapm_new_controls(codec, wm8776_dapm_widgets, @@ -450,168 +442,57 @@ static int wm8776_probe(struct platform_device *pdev) snd_soc_dapm_add_routes(codec, routes, ARRAY_SIZE(routes)); return ret; - -pcm_err: - return ret; } /* power down chip */ -static int wm8776_remove(struct platform_device *pdev) +static int wm8776_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - + wm8776_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -struct snd_soc_codec_device soc_codec_dev_wm8776 = { +static struct snd_soc_codec_driver soc_codec_dev_wm8776 = { .probe = wm8776_probe, .remove = wm8776_remove, .suspend = wm8776_suspend, .resume = wm8776_resume, + .set_bias_level = wm8776_set_bias_level, + .reg_cache_size = sizeof(wm8776_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8776_reg, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8776); - -static int wm8776_register(struct wm8776_priv *wm8776, - enum snd_soc_control_type control) -{ - int ret, i; - struct snd_soc_codec *codec = &wm8776->codec; - - if (wm8776_codec) { - dev_err(codec->dev, "Another WM8776 is registered\n"); - ret = -EINVAL; - goto err; - } - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, wm8776); - codec->name = "WM8776"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8776_set_bias_level; - codec->dai = wm8776_dai; - codec->num_dai = ARRAY_SIZE(wm8776_dai); - codec->reg_cache_size = WM8776_CACHEREGNUM; - codec->reg_cache = &wm8776->reg_cache; - - memcpy(codec->reg_cache, wm8776_reg, sizeof(wm8776_reg)); - - ret = snd_soc_codec_set_cache_io(codec, 7, 9, control); - if (ret < 0) { - dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; - } - - for (i = 0; i < ARRAY_SIZE(wm8776_dai); i++) - wm8776_dai[i].dev = codec->dev; - - ret = wm8776_reset(codec); - if (ret < 0) { - dev_err(codec->dev, "Failed to issue reset: %d\n", ret); - goto err; - } - - wm8776_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - - /* Latch the update bits; right channel only since we always - * update both. */ - snd_soc_update_bits(codec, WM8776_HPRVOL, 0x100, 0x100); - snd_soc_update_bits(codec, WM8776_DACRVOL, 0x100, 0x100); - - wm8776_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err; - } - - ret = snd_soc_register_dais(wm8776_dai, ARRAY_SIZE(wm8776_dai)); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAIs: %d\n", ret); - goto err_codec; - } - - return 0; - -err_codec: - snd_soc_unregister_codec(codec); -err: - kfree(wm8776); - return ret; -} - -static void wm8776_unregister(struct wm8776_priv *wm8776) -{ - wm8776_set_bias_level(&wm8776->codec, SND_SOC_BIAS_OFF); - snd_soc_unregister_dais(wm8776_dai, ARRAY_SIZE(wm8776_dai)); - snd_soc_unregister_codec(&wm8776->codec); - kfree(wm8776); - wm8776_codec = NULL; -} #if defined(CONFIG_SPI_MASTER) -static int wm8776_spi_write(struct spi_device *spi, const char *data, int len) -{ - struct spi_transfer t; - struct spi_message m; - u8 msg[2]; - - if (len <= 0) - return 0; - - msg[0] = data[0]; - msg[1] = data[1]; - - spi_message_init(&m); - memset(&t, 0, (sizeof t)); - - t.tx_buf = &msg[0]; - t.len = len; - - spi_message_add_tail(&t, &m); - spi_sync(spi, &m); - - return len; -} - static int __devinit wm8776_spi_probe(struct spi_device *spi) { - struct snd_soc_codec *codec; struct wm8776_priv *wm8776; + int ret; wm8776 = kzalloc(sizeof(struct wm8776_priv), GFP_KERNEL); if (wm8776 == NULL) return -ENOMEM; - codec = &wm8776->codec; - codec->control_data = spi; - codec->hw_write = (hw_write_t)wm8776_spi_write; - codec->dev = &spi->dev; + wm8776->control_data = spi; + wm8776->control_type = SND_SOC_SPI; + spi_set_drvdata(spi, wm8776); - dev_set_drvdata(&spi->dev, wm8776); - - return wm8776_register(wm8776, SND_SOC_SPI); + ret = snd_soc_register_codec(&spi->dev, + &soc_codec_dev_wm8776, wm8776_dai, ARRAY_SIZE(wm8776_dai)); + if (ret < 0) + kfree(wm8776); + return ret; } static int __devexit wm8776_spi_remove(struct spi_device *spi) { - struct wm8776_priv *wm8776 = dev_get_drvdata(&spi->dev); - - wm8776_unregister(wm8776); - + snd_soc_unregister_codec(&spi->dev); + kfree(spi_get_drvdata(spi)); return 0; } static struct spi_driver wm8776_spi_driver = { .driver = { - .name = "wm8776", + .name = "wm8776-codec", .bus = &spi_bus_type, .owner = THIS_MODULE, }, @@ -625,27 +506,27 @@ static __devinit int wm8776_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct wm8776_priv *wm8776; - struct snd_soc_codec *codec; + int ret; wm8776 = kzalloc(sizeof(struct wm8776_priv), GFP_KERNEL); if (wm8776 == NULL) return -ENOMEM; - codec = &wm8776->codec; - codec->hw_write = (hw_write_t)i2c_master_send; - i2c_set_clientdata(i2c, wm8776); - codec->control_data = i2c; - - codec->dev = &i2c->dev; + wm8776->control_data = i2c; + wm8776->control_type = SND_SOC_I2C; - return wm8776_register(wm8776, SND_SOC_I2C); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8776, wm8776_dai, ARRAY_SIZE(wm8776_dai)); + if (ret < 0) + kfree(wm8776); + return ret; } static __devexit int wm8776_i2c_remove(struct i2c_client *client) { - struct wm8776_priv *wm8776 = i2c_get_clientdata(client); - wm8776_unregister(wm8776); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -657,7 +538,7 @@ MODULE_DEVICE_TABLE(i2c, wm8776_i2c_id); static struct i2c_driver wm8776_i2c_driver = { .driver = { - .name = "wm8776", + .name = "wm8776-codec", .owner = THIS_MODULE, }, .probe = wm8776_i2c_probe, @@ -668,22 +549,22 @@ static struct i2c_driver wm8776_i2c_driver = { static int __init wm8776_modinit(void) { - int ret; + int ret = 0; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ret = i2c_add_driver(&wm8776_i2c_driver); if (ret != 0) { - printk(KERN_ERR "Failed to register WM8776 I2C driver: %d\n", + printk(KERN_ERR "Failed to register wm8776 I2C driver: %d\n", ret); } #endif #if defined(CONFIG_SPI_MASTER) ret = spi_register_driver(&wm8776_spi_driver); if (ret != 0) { - printk(KERN_ERR "Failed to register WM8776 SPI driver: %d\n", + printk(KERN_ERR "Failed to register wm8776 SPI driver: %d\n", ret); } #endif - return 0; + return ret; } module_init(wm8776_modinit); diff --git a/sound/soc/codecs/wm8776.h b/sound/soc/codecs/wm8776.h index 6606d25d2d83..4cf1c8e0bfc9 100644 --- a/sound/soc/codecs/wm8776.h +++ b/sound/soc/codecs/wm8776.h @@ -45,7 +45,4 @@ #define WM8776_DAI_DAC 0 #define WM8776_DAI_ADC 1 -extern struct snd_soc_dai wm8776_dai[]; -extern struct snd_soc_codec_device soc_codec_dev_wm8776; - #endif diff --git a/sound/soc/codecs/wm8900.c b/sound/soc/codecs/wm8900.c index 5da17a704e5a..33c3b57f3f66 100644 --- a/sound/soc/codecs/wm8900.c +++ b/sound/soc/codecs/wm8900.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -137,11 +138,9 @@ #define WM8900_LRC_MASK 0xfc00 -struct snd_soc_codec_device soc_codec_dev_wm8900; - struct wm8900_priv { - struct snd_soc_codec codec; - + enum snd_soc_control_type control_type; + void *control_data; u16 reg_cache[WM8900_MAXREG]; u32 fll_in; /* FLL input frequency */ @@ -627,8 +626,7 @@ static int wm8900_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; u16 reg; reg = snd_soc_read(codec, WM8900_REG_AUDIO1) & ~0x60; @@ -1015,8 +1013,8 @@ static struct snd_soc_dai_ops wm8900_dai_ops = { .digital_mute = wm8900_digital_mute, }; -struct snd_soc_dai wm8900_dai = { - .name = "WM8900 HiFi", +static struct snd_soc_dai_driver wm8900_dai = { + .name = "wm8900-hifi", .playback = { .stream_name = "HiFi Playback", .channels_min = 1, @@ -1033,7 +1031,6 @@ struct snd_soc_dai wm8900_dai = { }, .ops = &wm8900_dai_ops, }; -EXPORT_SYMBOL_GPL(wm8900_dai); static int wm8900_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) @@ -1128,10 +1125,8 @@ static int wm8900_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int wm8900_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8900_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; struct wm8900_priv *wm8900 = snd_soc_codec_get_drvdata(codec); int fll_out = wm8900->fll_out; int fll_in = wm8900->fll_in; @@ -1140,7 +1135,7 @@ static int wm8900_suspend(struct platform_device *pdev, pm_message_t state) /* Stop the FLL in an orderly fashion */ ret = wm8900_set_fll(codec, 0, 0, 0); if (ret != 0) { - dev_err(&pdev->dev, "Failed to stop FLL\n"); + dev_err(codec->dev, "Failed to stop FLL\n"); return ret; } @@ -1152,10 +1147,8 @@ static int wm8900_suspend(struct platform_device *pdev, pm_message_t state) return 0; } -static int wm8900_resume(struct platform_device *pdev) +static int wm8900_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; struct wm8900_priv *wm8900 = snd_soc_codec_get_drvdata(codec); u16 *cache; int i, ret; @@ -1176,7 +1169,7 @@ static int wm8900_resume(struct platform_device *pdev) ret = wm8900_set_fll(codec, 0, fll_in, fll_out); if (ret != 0) { - dev_err(&pdev->dev, "Failed to restart FLL\n"); + dev_err(codec->dev, "Failed to restart FLL\n"); return ret; } } @@ -1186,60 +1179,33 @@ static int wm8900_resume(struct platform_device *pdev) snd_soc_write(codec, i, cache[i]); kfree(cache); } else - dev_err(&pdev->dev, "Unable to allocate register cache\n"); + dev_err(codec->dev, "Unable to allocate register cache\n"); return 0; } -static struct snd_soc_codec *wm8900_codec; - -static __devinit int wm8900_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) +static int wm8900_probe(struct snd_soc_codec *codec) { - struct wm8900_priv *wm8900; - struct snd_soc_codec *codec; - unsigned int reg; - int ret; - - wm8900 = kzalloc(sizeof(struct wm8900_priv), GFP_KERNEL); - if (wm8900 == NULL) - return -ENOMEM; + struct wm8900_priv *wm8900 = snd_soc_codec_get_drvdata(codec); + int ret = 0, reg; - codec = &wm8900->codec; - snd_soc_codec_set_drvdata(codec, wm8900); - codec->reg_cache = &wm8900->reg_cache[0]; - codec->reg_cache_size = WM8900_MAXREG; - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - codec->name = "WM8900"; - codec->owner = THIS_MODULE; - codec->dai = &wm8900_dai; - codec->num_dai = 1; - codec->control_data = i2c; - codec->set_bias_level = wm8900_set_bias_level; - codec->volatile_register = wm8900_volatile_register; - codec->dev = &i2c->dev; - - ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C); + codec->control_data = wm8900->control_data; + ret = snd_soc_codec_set_cache_io(codec, 8, 16, wm8900->control_type); if (ret != 0) { - dev_err(&i2c->dev, "Failed to set cache I/O: %d\n", ret); - goto err; + dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); + return ret; } reg = snd_soc_read(codec, WM8900_REG_ID); if (reg != 0x8900) { - dev_err(&i2c->dev, "Device is not a WM8900 - ID %x\n", reg); - ret = -ENODEV; - goto err; + dev_err(codec->dev, "Device is not a WM8900 - ID %x\n", reg); + return -ENODEV; } /* Read back from the chip */ reg = snd_soc_read(codec, WM8900_REG_POWER1); reg = (reg >> 12) & 0xf; - dev_info(&i2c->dev, "WM8900 revision %d\n", reg); + dev_info(codec->dev, "WM8900 revision %d\n", reg); wm8900_reset(codec); @@ -1271,43 +1237,97 @@ static __devinit int wm8900_i2c_probe(struct i2c_client *i2c, /* Set the DAC and mixer output bias */ snd_soc_write(codec, WM8900_REG_OUTBIASCTL, 0x81); - wm8900_dai.dev = &i2c->dev; + snd_soc_add_controls(codec, wm8900_snd_controls, + ARRAY_SIZE(wm8900_snd_controls)); + wm8900_add_widgets(codec); - wm8900_codec = codec; + return 0; +} - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(&i2c->dev, "Failed to register codec: %d\n", ret); - goto err; - } +/* power down chip */ +static int wm8900_remove(struct snd_soc_codec *codec) +{ + wm8900_set_bias_level(codec, SND_SOC_BIAS_OFF); + return 0; +} - ret = snd_soc_register_dai(&wm8900_dai); - if (ret != 0) { - dev_err(&i2c->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } +static struct snd_soc_codec_driver soc_codec_dev_wm8900 = { + .probe = wm8900_probe, + .remove = wm8900_remove, + .suspend = wm8900_suspend, + .resume = wm8900_resume, + .set_bias_level = wm8900_set_bias_level, + .volatile_register = wm8900_volatile_register, + .reg_cache_size = sizeof(wm8900_reg_defaults), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8900_reg_defaults, +}; - return ret; +#if defined(CONFIG_SPI_MASTER) +static int __devinit wm8900_spi_probe(struct spi_device *spi) +{ + struct wm8900_priv *wm8900; + int ret; + + wm8900 = kzalloc(sizeof(struct wm8900_priv), GFP_KERNEL); + if (wm8900 == NULL) + return -ENOMEM; -err_codec: - snd_soc_unregister_codec(codec); -err: - kfree(wm8900); - wm8900_codec = NULL; + wm8900->control_data = spi; + wm8900->control_type = SND_SOC_SPI; + spi_set_drvdata(spi, wm8900); + + ret = snd_soc_register_codec(&spi->dev, + &soc_codec_dev_wm8900, &wm8900_dai, 1); + if (ret < 0) + kfree(wm8900); return ret; } -static __devexit int wm8900_i2c_remove(struct i2c_client *client) +static int __devexit wm8900_spi_remove(struct spi_device *spi) { - snd_soc_unregister_dai(&wm8900_dai); - snd_soc_unregister_codec(wm8900_codec); + snd_soc_unregister_codec(&spi->dev); + kfree(spi_get_drvdata(spi)); + return 0; +} - wm8900_set_bias_level(wm8900_codec, SND_SOC_BIAS_OFF); +static struct spi_driver wm8900_spi_driver = { + .driver = { + .name = "wm8900-codec", + .bus = &spi_bus_type, + .owner = THIS_MODULE, + }, + .probe = wm8900_spi_probe, + .remove = __devexit_p(wm8900_spi_remove), +}; +#endif /* CONFIG_SPI_MASTER */ + +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +static __devinit int wm8900_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) +{ + struct wm8900_priv *wm8900; + int ret; + + wm8900 = kzalloc(sizeof(struct wm8900_priv), GFP_KERNEL); + if (wm8900 == NULL) + return -ENOMEM; + + i2c_set_clientdata(i2c, wm8900); + wm8900->control_data = i2c; + wm8900->control_type = SND_SOC_I2C; - wm8900_dai.dev = NULL; - kfree(snd_soc_codec_get_drvdata(wm8900_codec)); - wm8900_codec = NULL; + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8900, &wm8900_dai, 1); + if (ret < 0) + kfree(wm8900); + return ret; +} +static __devexit int wm8900_i2c_remove(struct i2c_client *client) +{ + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -1319,71 +1339,44 @@ MODULE_DEVICE_TABLE(i2c, wm8900_i2c_id); static struct i2c_driver wm8900_i2c_driver = { .driver = { - .name = "WM8900", + .name = "wm8900-codec", .owner = THIS_MODULE, }, - .probe = wm8900_i2c_probe, - .remove = __devexit_p(wm8900_i2c_remove), + .probe = wm8900_i2c_probe, + .remove = __devexit_p(wm8900_i2c_remove), .id_table = wm8900_i2c_id, }; +#endif -static int wm8900_probe(struct platform_device *pdev) +static int __init wm8900_modinit(void) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; int ret = 0; - - if (!wm8900_codec) { - dev_err(&pdev->dev, "I2C client not yet instantiated\n"); - return -ENODEV; +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) + ret = i2c_add_driver(&wm8900_i2c_driver); + if (ret != 0) { + printk(KERN_ERR "Failed to register wm8900 I2C driver: %d\n", + ret); } - - codec = wm8900_codec; - socdev->card->codec = codec; - - /* Register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(&pdev->dev, "Failed to register new PCMs\n"); - goto pcm_err; +#endif +#if defined(CONFIG_SPI_MASTER) + ret = spi_register_driver(&wm8900_spi_driver); + if (ret != 0) { + printk(KERN_ERR "Failed to register wm8900 SPI driver: %d\n", + ret); } - - snd_soc_add_controls(codec, wm8900_snd_controls, - ARRAY_SIZE(wm8900_snd_controls)); - wm8900_add_widgets(codec); - -pcm_err: +#endif return ret; } - -/* power down chip */ -static int wm8900_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8900 = { - .probe = wm8900_probe, - .remove = wm8900_remove, - .suspend = wm8900_suspend, - .resume = wm8900_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8900); - -static int __init wm8900_modinit(void) -{ - return i2c_add_driver(&wm8900_i2c_driver); -} module_init(wm8900_modinit); static void __exit wm8900_exit(void) { +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) i2c_del_driver(&wm8900_i2c_driver); +#endif +#if defined(CONFIG_SPI_MASTER) + spi_unregister_driver(&wm8900_spi_driver); +#endif } module_exit(wm8900_exit); diff --git a/sound/soc/codecs/wm8900.h b/sound/soc/codecs/wm8900.h index fd15007d10c7..583f257e799b 100644 --- a/sound/soc/codecs/wm8900.h +++ b/sound/soc/codecs/wm8900.h @@ -52,7 +52,4 @@ #define WM8900_DAC_CLKDIV_5_5 0x14 #define WM8900_DAC_CLKDIV_6 0x18 -extern struct snd_soc_dai wm8900_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8900; - #endif diff --git a/sound/soc/codecs/wm8903.c b/sound/soc/codecs/wm8903.c index bf08282d5ee5..f5d73ed72cbd 100644 --- a/sound/soc/codecs/wm8903.c +++ b/sound/soc/codecs/wm8903.c @@ -213,10 +213,12 @@ static u16 wm8903_reg_defaults[] = { }; struct wm8903_priv { - struct snd_soc_codec codec; + u16 reg_cache[ARRAY_SIZE(wm8903_reg_defaults)]; int sysclk; + struct i2c_client *control_data; + int irq; /* Reference counts */ int class_w_users; @@ -252,7 +254,6 @@ static int wm8903_volatile_register(unsigned int reg) static int wm8903_run_sequence(struct snd_soc_codec *codec, unsigned int start) { u16 reg[5]; - struct i2c_client *i2c = codec->control_data; struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec); BUG_ON(start > 48); @@ -262,7 +263,7 @@ static int wm8903_run_sequence(struct snd_soc_codec *codec, unsigned int start) snd_soc_write(codec, WM8903_WRITE_SEQUENCER_0, reg[0] | WM8903_WSEQ_ENA); - dev_dbg(&i2c->dev, "Starting sequence at %d\n", start); + dev_dbg(codec->dev, "Starting sequence at %d\n", start); snd_soc_write(codec, WM8903_WRITE_SEQUENCER_3, start | WM8903_WSEQ_START); @@ -277,7 +278,7 @@ static int wm8903_run_sequence(struct snd_soc_codec *codec, unsigned int start) reg[4] = snd_soc_read(codec, WM8903_WRITE_SEQUENCER_4); } while (reg[4] & WM8903_WSEQ_BUSY); - dev_dbg(&i2c->dev, "Sequence complete\n"); + dev_dbg(codec->dev, "Sequence complete\n"); /* Disable the sequencer again if we enabled it */ snd_soc_write(codec, WM8903_WRITE_SEQUENCER_0, reg[0]); @@ -422,7 +423,6 @@ static int wm8903_class_w_put(struct snd_kcontrol *kcontrol, struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol); struct snd_soc_codec *codec = widget->codec; struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec); - struct i2c_client *i2c = codec->control_data; u16 reg; int ret; @@ -431,7 +431,7 @@ static int wm8903_class_w_put(struct snd_kcontrol *kcontrol, /* Turn it off if we're about to enable bypass */ if (ucontrol->value.integer.value[0]) { if (wm8903->class_w_users == 0) { - dev_dbg(&i2c->dev, "Disabling Class W\n"); + dev_dbg(codec->dev, "Disabling Class W\n"); snd_soc_write(codec, WM8903_CLASS_W_0, reg & ~(WM8903_CP_DYN_FREQ | WM8903_CP_DYN_V)); } @@ -444,14 +444,14 @@ static int wm8903_class_w_put(struct snd_kcontrol *kcontrol, /* If we've just disabled the last bypass path turn Class W on */ if (!ucontrol->value.integer.value[0]) { if (wm8903->class_w_users == 1) { - dev_dbg(&i2c->dev, "Enabling Class W\n"); + dev_dbg(codec->dev, "Enabling Class W\n"); snd_soc_write(codec, WM8903_CLASS_W_0, reg | WM8903_CP_DYN_FREQ | WM8903_CP_DYN_V); } wm8903->class_w_users--; } - dev_dbg(&i2c->dev, "Bypass use count now %d\n", + dev_dbg(codec->dev, "Bypass use count now %d\n", wm8903->class_w_users); return ret; @@ -935,7 +935,6 @@ static int wm8903_add_widgets(struct snd_soc_codec *codec) static int wm8903_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) { - struct i2c_client *i2c = codec->control_data; u16 reg, reg2; switch (level) { @@ -974,7 +973,7 @@ static int wm8903_set_bias_level(struct snd_soc_codec *codec, /* By default no bypass paths are enabled so * enable Class W support. */ - dev_dbg(&i2c->dev, "Enabling Class W\n"); + dev_dbg(codec->dev, "Enabling Class W\n"); snd_soc_write(codec, WM8903_CLASS_W_0, reg | WM8903_CP_DYN_FREQ | WM8903_CP_DYN_V); } @@ -1228,10 +1227,8 @@ static int wm8903_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec); - struct i2c_client *i2c = codec->control_data; struct snd_pcm_runtime *master_runtime; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) @@ -1245,7 +1242,7 @@ static int wm8903_startup(struct snd_pcm_substream *substream, if (wm8903->master_substream) { master_runtime = wm8903->master_substream->runtime; - dev_dbg(&i2c->dev, "Constraining to %d bits\n", + dev_dbg(codec->dev, "Constraining to %d bits\n", master_runtime->sample_bits); snd_pcm_hw_constraint_minmax(substream->runtime, @@ -1264,8 +1261,7 @@ static void wm8903_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) @@ -1284,10 +1280,8 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec =rtd->codec; struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec); - struct i2c_client *i2c = codec->control_data; int fs = params_rate(params); int bclk; int bclk_div; @@ -1306,7 +1300,7 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream, u16 dac_digital1 = snd_soc_read(codec, WM8903_DAC_DIGITAL_1); if (substream == wm8903->slave_substream) { - dev_dbg(&i2c->dev, "Ignoring hw_params for slave substream\n"); + dev_dbg(codec->dev, "Ignoring hw_params for slave substream\n"); return 0; } @@ -1332,7 +1326,7 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream, switch (sample_rates[dsp_config].rate) { case 88200: case 96000: - dev_err(&i2c->dev, "%dHz unsupported by ADC\n", + dev_err(codec->dev, "%dHz unsupported by ADC\n", fs); return -EINVAL; @@ -1340,7 +1334,7 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream, break; } - dev_dbg(&i2c->dev, "DSP fs = %dHz\n", sample_rates[dsp_config].rate); + dev_dbg(codec->dev, "DSP fs = %dHz\n", sample_rates[dsp_config].rate); clock1 &= ~WM8903_SAMPLE_RATE_MASK; clock1 |= sample_rates[dsp_config].value; @@ -1366,7 +1360,7 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - dev_dbg(&i2c->dev, "MCLK = %dHz, target sample rate = %dHz\n", + dev_dbg(codec->dev, "MCLK = %dHz, target sample rate = %dHz\n", wm8903->sysclk, fs); /* We may not have an MCLK which allows us to generate exactly @@ -1401,12 +1395,12 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream, clock1 |= clk_sys_ratios[clk_config].rate << WM8903_CLK_SYS_RATE_SHIFT; clock1 |= clk_sys_ratios[clk_config].mode << WM8903_CLK_SYS_MODE_SHIFT; - dev_dbg(&i2c->dev, "CLK_SYS_RATE=%x, CLK_SYS_MODE=%x div=%d\n", + dev_dbg(codec->dev, "CLK_SYS_RATE=%x, CLK_SYS_MODE=%x div=%d\n", clk_sys_ratios[clk_config].rate, clk_sys_ratios[clk_config].mode, clk_sys_ratios[clk_config].div); - dev_dbg(&i2c->dev, "Actual CLK_SYS = %dHz\n", clk_sys); + dev_dbg(codec->dev, "Actual CLK_SYS = %dHz\n", clk_sys); /* We may not get quite the right frequency if using * approximate clocks so look for the closest match that is @@ -1428,7 +1422,7 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream, aif2 &= ~WM8903_BCLK_DIV_MASK; aif3 &= ~WM8903_LRCLK_RATE_MASK; - dev_dbg(&i2c->dev, "BCLK ratio %d for %dHz - actual BCLK = %dHz\n", + dev_dbg(codec->dev, "BCLK ratio %d for %dHz - actual BCLK = %dHz\n", bclk_divs[bclk_div].ratio / 10, bclk, (clk_sys * 10) / bclk_divs[bclk_div].ratio); @@ -1504,8 +1498,8 @@ EXPORT_SYMBOL_GPL(wm8903_mic_detect); static irqreturn_t wm8903_irq(int irq, void *data) { - struct wm8903_priv *wm8903 = data; - struct snd_soc_codec *codec = &wm8903->codec; + struct snd_soc_codec *codec = data; + struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec); int mic_report; int int_pol; int int_val = 0; @@ -1586,8 +1580,8 @@ static struct snd_soc_dai_ops wm8903_dai_ops = { .set_sysclk = wm8903_set_dai_sysclk, }; -struct snd_soc_dai wm8903_dai = { - .name = "WM8903", +static struct snd_soc_dai_driver wm8903_dai = { + .name = "wm8903-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, @@ -1605,23 +1599,16 @@ struct snd_soc_dai wm8903_dai = { .ops = &wm8903_dai_ops, .symmetric_rates = 1, }; -EXPORT_SYMBOL_GPL(wm8903_dai); -static int wm8903_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8903_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8903_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8903_resume(struct platform_device *pdev) +static int wm8903_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - struct i2c_client *i2c = codec->control_data; int i; u16 *reg_cache = codec->reg_cache; u16 *tmp_cache = kmemdup(reg_cache, sizeof(wm8903_reg_defaults), @@ -1637,65 +1624,38 @@ static int wm8903_resume(struct platform_device *pdev) snd_soc_write(codec, i, tmp_cache[i]); kfree(tmp_cache); } else { - dev_err(&i2c->dev, "Failed to allocate temporary cache\n"); + dev_err(codec->dev, "Failed to allocate temporary cache\n"); } return 0; } -static struct snd_soc_codec *wm8903_codec; - -static __devinit int wm8903_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) +static int wm8903_probe(struct snd_soc_codec *codec) { - struct wm8903_platform_data *pdata = dev_get_platdata(&i2c->dev); - struct wm8903_priv *wm8903; - struct snd_soc_codec *codec; + struct wm8903_platform_data *pdata = dev_get_platdata(codec->dev); + struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec); int ret, i; int trigger, irq_pol; u16 val; - wm8903 = kzalloc(sizeof(struct wm8903_priv), GFP_KERNEL); - if (wm8903 == NULL) - return -ENOMEM; - - codec = &wm8903->codec; - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - codec->dev = &i2c->dev; - codec->name = "WM8903"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8903_set_bias_level; - codec->dai = &wm8903_dai; - codec->num_dai = 1; - codec->reg_cache_size = ARRAY_SIZE(wm8903->reg_cache); - codec->reg_cache = &wm8903->reg_cache[0]; - snd_soc_codec_set_drvdata(codec, wm8903); - codec->volatile_register = wm8903_volatile_register; init_completion(&wm8903->wseq); - - i2c_set_clientdata(i2c, codec); - codec->control_data = i2c; + codec->control_data = wm8903->control_data; ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C); if (ret != 0) { - dev_err(&i2c->dev, "Failed to set cache I/O: %d\n", ret); - goto err; + dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); + return ret; } val = snd_soc_read(codec, WM8903_SW_RESET_AND_ID); if (val != wm8903_reg_defaults[WM8903_SW_RESET_AND_ID]) { - dev_err(&i2c->dev, + dev_err(codec->dev, "Device with ID register %x is not a WM8903\n", val); return -ENODEV; } val = snd_soc_read(codec, WM8903_REVISION_NUMBER); - dev_info(&i2c->dev, "WM8903 revision %d\n", + dev_info(codec->dev, "WM8903 revision %d\n", val & WM8903_CHIP_REV_MASK); wm8903_reset(codec); @@ -1721,7 +1681,7 @@ static __devinit int wm8903_i2c_probe(struct i2c_client *i2c, wm8903->mic_delay = pdata->micdet_delay; } - if (i2c->irq) { + if (wm8903->irq) { if (pdata && pdata->irq_active_low) { trigger = IRQF_TRIGGER_LOW; irq_pol = WM8903_IRQ_POL; @@ -1733,13 +1693,13 @@ static __devinit int wm8903_i2c_probe(struct i2c_client *i2c, snd_soc_update_bits(codec, WM8903_INTERRUPT_CONTROL, WM8903_IRQ_POL, irq_pol); - ret = request_threaded_irq(i2c->irq, NULL, wm8903_irq, + ret = request_threaded_irq(wm8903->irq, NULL, wm8903_irq, trigger | IRQF_ONESHOT, - "wm8903", wm8903); + "wm8903", codec); if (ret != 0) { - dev_err(&i2c->dev, "Failed to request IRQ: %d\n", + dev_err(codec->dev, "Failed to request IRQ: %d\n", ret); - goto err; + return ret; } /* Enable write sequencer interrupts */ @@ -1781,133 +1741,97 @@ static __devinit int wm8903_i2c_probe(struct i2c_client *i2c, val |= WM8903_DAC_MUTEMODE; snd_soc_write(codec, WM8903_DAC_DIGITAL_1, val); - wm8903_dai.dev = &i2c->dev; - wm8903_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(&i2c->dev, "Failed to register codec: %d\n", ret); - goto err_irq; - } - - ret = snd_soc_register_dai(&wm8903_dai); - if (ret != 0) { - dev_err(&i2c->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } - - return ret; + snd_soc_add_controls(codec, wm8903_snd_controls, + ARRAY_SIZE(wm8903_snd_controls)); + wm8903_add_widgets(codec); -err_codec: - snd_soc_unregister_codec(codec); -err_irq: - if (i2c->irq) - free_irq(i2c->irq, wm8903); -err: - wm8903_codec = NULL; - kfree(wm8903); return ret; } -static __devexit int wm8903_i2c_remove(struct i2c_client *client) +/* power down chip */ +static int wm8903_remove(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = i2c_get_clientdata(client); - struct wm8903_priv *priv = snd_soc_codec_get_drvdata(codec); + wm8903_set_bias_level(codec, SND_SOC_BIAS_OFF); + return 0; +} - snd_soc_unregister_dai(&wm8903_dai); - snd_soc_unregister_codec(codec); +static struct snd_soc_codec_driver soc_codec_dev_wm8903 = { + .probe = wm8903_probe, + .remove = wm8903_remove, + .suspend = wm8903_suspend, + .resume = wm8903_resume, + .set_bias_level = wm8903_set_bias_level, + .reg_cache_size = ARRAY_SIZE(wm8903_reg_defaults), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8903_reg_defaults, + .volatile_register = wm8903_volatile_register, +}; - wm8903_set_bias_level(codec, SND_SOC_BIAS_OFF); +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +static __devinit int wm8903_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) +{ + struct wm8903_priv *wm8903; + int ret; - if (client->irq) - free_irq(client->irq, priv); + wm8903 = kzalloc(sizeof(struct wm8903_priv), GFP_KERNEL); + if (wm8903 == NULL) + return -ENOMEM; - kfree(priv); + i2c_set_clientdata(i2c, wm8903); + wm8903->control_data = i2c; + wm8903->irq = i2c->irq; - wm8903_codec = NULL; - wm8903_dai.dev = NULL; + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8903, &wm8903_dai, 1); + if (ret < 0) + kfree(wm8903); + return ret; +} +static __devexit int wm8903_i2c_remove(struct i2c_client *client) +{ + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } -/* i2c codec control layer */ static const struct i2c_device_id wm8903_i2c_id[] = { - { "wm8903", 0 }, - { } + { "wm8903", 0 }, + { } }; MODULE_DEVICE_TABLE(i2c, wm8903_i2c_id); static struct i2c_driver wm8903_i2c_driver = { .driver = { - .name = "WM8903", + .name = "wm8903-codec", .owner = THIS_MODULE, }, - .probe = wm8903_i2c_probe, - .remove = __devexit_p(wm8903_i2c_remove), + .probe = wm8903_i2c_probe, + .remove = __devexit_p(wm8903_i2c_remove), .id_table = wm8903_i2c_id, }; +#endif -static int wm8903_probe(struct platform_device *pdev) +static int __init wm8903_modinit(void) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); int ret = 0; - - if (!wm8903_codec) { - dev_err(&pdev->dev, "I2C device not yet probed\n"); - goto err; - } - - socdev->card->codec = wm8903_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(&pdev->dev, "failed to create pcms\n"); - goto err; +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) + ret = i2c_add_driver(&wm8903_i2c_driver); + if (ret != 0) { + printk(KERN_ERR "Failed to register wm8903 I2C driver: %d\n", + ret); } - - snd_soc_add_controls(socdev->card->codec, wm8903_snd_controls, - ARRAY_SIZE(wm8903_snd_controls)); - wm8903_add_widgets(socdev->card->codec); - +#endif return ret; - -err: - return ret; -} - -/* power down chip */ -static int wm8903_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - if (codec->control_data) - wm8903_set_bias_level(codec, SND_SOC_BIAS_OFF); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8903 = { - .probe = wm8903_probe, - .remove = wm8903_remove, - .suspend = wm8903_suspend, - .resume = wm8903_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8903); - -static int __init wm8903_modinit(void) -{ - return i2c_add_driver(&wm8903_i2c_driver); } module_init(wm8903_modinit); static void __exit wm8903_exit(void) { +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) i2c_del_driver(&wm8903_i2c_driver); +#endif } module_exit(wm8903_exit); diff --git a/sound/soc/codecs/wm8903.h b/sound/soc/codecs/wm8903.h index ce384a2ad820..996435e681e5 100644 --- a/sound/soc/codecs/wm8903.h +++ b/sound/soc/codecs/wm8903.h @@ -15,9 +15,6 @@ #include -extern struct snd_soc_dai wm8903_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8903; - extern int wm8903_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, int det, int shrt); diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c index f7dcabf6283c..33be84e506ea 100644 --- a/sound/soc/codecs/wm8904.c +++ b/sound/soc/codecs/wm8904.c @@ -31,9 +31,6 @@ #include "wm8904.h" -static struct snd_soc_codec *wm8904_codec; -struct snd_soc_codec_device soc_codec_dev_wm8904; - enum wm8904_type { WM8904, WM8912, @@ -52,10 +49,11 @@ static const char *wm8904_supply_names[WM8904_NUM_SUPPLIES] = { /* codec private data */ struct wm8904_priv { - struct snd_soc_codec codec; + u16 reg_cache[WM8904_MAX_REGISTER + 1]; enum wm8904_type devtype; + void *control_data; struct regulator_bulk_data supplies[WM8904_NUM_SUPPLIES]; @@ -689,7 +687,7 @@ static int wm8904_put_drc_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); - struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec); + struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec); struct wm8904_pdata *pdata = wm8904->pdata; int value = ucontrol->value.integer.value[0]; @@ -760,7 +758,7 @@ static int wm8904_put_retune_mobile_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); - struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec); + struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec); struct wm8904_pdata *pdata = wm8904->pdata; int value = ucontrol->value.integer.value[0]; @@ -2218,8 +2216,8 @@ static struct snd_soc_dai_ops wm8904_dai_ops = { .digital_mute = wm8904_digital_mute, }; -struct snd_soc_dai wm8904_dai = { - .name = "WM8904", +static struct snd_soc_dai_driver wm8904_dai = { + .name = "wm8904-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, @@ -2237,24 +2235,17 @@ struct snd_soc_dai wm8904_dai = { .ops = &wm8904_dai_ops, .symmetric_rates = 1, }; -EXPORT_SYMBOL_GPL(wm8904_dai); #ifdef CONFIG_PM -static int wm8904_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8904_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8904_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8904_resume(struct platform_device *pdev) +static int wm8904_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8904_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; @@ -2264,9 +2255,9 @@ static int wm8904_resume(struct platform_device *pdev) #define wm8904_resume NULL #endif -static void wm8904_handle_retune_mobile_pdata(struct wm8904_priv *wm8904) +static void wm8904_handle_retune_mobile_pdata(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = &wm8904->codec; + struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec); struct wm8904_pdata *pdata = wm8904->pdata; struct snd_kcontrol_new control = SOC_ENUM_EXT("EQ Mode", @@ -2315,20 +2306,20 @@ static void wm8904_handle_retune_mobile_pdata(struct wm8904_priv *wm8904) wm8904->retune_mobile_enum.max = wm8904->num_retune_mobile_texts; wm8904->retune_mobile_enum.texts = wm8904->retune_mobile_texts; - ret = snd_soc_add_controls(&wm8904->codec, &control, 1); + ret = snd_soc_add_controls(codec, &control, 1); if (ret != 0) - dev_err(wm8904->codec.dev, + dev_err(codec->dev, "Failed to add ReTune Mobile control: %d\n", ret); } -static void wm8904_handle_pdata(struct wm8904_priv *wm8904) +static void wm8904_handle_pdata(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = &wm8904->codec; + struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec); struct wm8904_pdata *pdata = wm8904->pdata; int ret, i; if (!pdata) { - snd_soc_add_controls(&wm8904->codec, wm8904_eq_controls, + snd_soc_add_controls(codec, wm8904_eq_controls, ARRAY_SIZE(wm8904_eq_controls)); return; } @@ -2344,7 +2335,7 @@ static void wm8904_handle_pdata(struct wm8904_priv *wm8904) wm8904->drc_texts = kmalloc(sizeof(char *) * pdata->num_drc_cfgs, GFP_KERNEL); if (!wm8904->drc_texts) { - dev_err(wm8904->codec.dev, + dev_err(codec->dev, "Failed to allocate %d DRC config texts\n", pdata->num_drc_cfgs); return; @@ -2356,9 +2347,9 @@ static void wm8904_handle_pdata(struct wm8904_priv *wm8904) wm8904->drc_enum.max = pdata->num_drc_cfgs; wm8904->drc_enum.texts = wm8904->drc_texts; - ret = snd_soc_add_controls(&wm8904->codec, &control, 1); + ret = snd_soc_add_controls(codec, &control, 1); if (ret != 0) - dev_err(wm8904->codec.dev, + dev_err(codec->dev, "Failed to add DRC mode control: %d\n", ret); wm8904_set_drc(codec); @@ -2368,89 +2359,19 @@ static void wm8904_handle_pdata(struct wm8904_priv *wm8904) pdata->num_retune_mobile_cfgs); if (pdata->num_retune_mobile_cfgs) - wm8904_handle_retune_mobile_pdata(wm8904); + wm8904_handle_retune_mobile_pdata(codec); else - snd_soc_add_controls(&wm8904->codec, wm8904_eq_controls, + snd_soc_add_controls(codec, wm8904_eq_controls, ARRAY_SIZE(wm8904_eq_controls)); } -static int wm8904_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - if (wm8904_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - socdev->card->codec = wm8904_codec; - codec = wm8904_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; - } - - wm8904_handle_pdata(snd_soc_codec_get_drvdata(codec)); - - wm8904_add_widgets(codec); - - return ret; - -pcm_err: - return ret; -} - -static int wm8904_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8904 = { - .probe = wm8904_probe, - .remove = wm8904_remove, - .suspend = wm8904_suspend, - .resume = wm8904_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8904); - -static int wm8904_register(struct wm8904_priv *wm8904, - enum snd_soc_control_type control) +static int wm8904_probe(struct snd_soc_codec *codec) { + struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec); struct wm8904_pdata *pdata = wm8904->pdata; - int ret; - struct snd_soc_codec *codec = &wm8904->codec; - int i; - - if (wm8904_codec) { - dev_err(codec->dev, "Another WM8904 is registered\n"); - ret = -EINVAL; - goto err; - } + int ret, i; - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, wm8904); - codec->name = "WM8904"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8904_set_bias_level; - codec->dai = &wm8904_dai; - codec->num_dai = 1; - codec->reg_cache_size = WM8904_MAX_REGISTER; - codec->reg_cache = &wm8904->reg_cache; - codec->volatile_register = wm8904_volatile_register; codec->cache_sync = 1; codec->idle_bias_off = 1; @@ -2463,16 +2384,13 @@ static int wm8904_register(struct wm8904_priv *wm8904, default: dev_err(codec->dev, "Unknown device type %d\n", wm8904->devtype); - ret = -EINVAL; - goto err; + return -EINVAL; } - memcpy(codec->reg_cache, wm8904_reg, sizeof(wm8904_reg)); - - ret = snd_soc_codec_set_cache_io(codec, 8, 16, control); + ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C); if (ret != 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; + return ret; } for (i = 0; i < ARRAY_SIZE(wm8904->supplies); i++) @@ -2482,7 +2400,7 @@ static int wm8904_register(struct wm8904_priv *wm8904, wm8904->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to request supplies: %d\n", ret); - goto err; + return ret; } ret = regulator_bulk_enable(ARRAY_SIZE(wm8904->supplies), @@ -2517,8 +2435,6 @@ static int wm8904_register(struct wm8904_priv *wm8904, goto err_enable; } - wm8904_dai.dev = codec->dev; - /* Change some default settings - latch VU and enable ZC */ wm8904->reg_cache[WM8904_ADC_DIGITAL_VOLUME_LEFT] |= WM8904_ADC_VU; wm8904->reg_cache[WM8904_ADC_DIGITAL_VOLUME_RIGHT] |= WM8904_ADC_VU; @@ -2563,72 +2479,68 @@ static int wm8904_register(struct wm8904_priv *wm8904, /* Bias level configuration will have done an extra enable */ regulator_bulk_disable(ARRAY_SIZE(wm8904->supplies), wm8904->supplies); - wm8904_codec = codec; + wm8904_handle_pdata(codec); - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err_enable; - } - - ret = snd_soc_register_dai(&wm8904_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } + wm8904_add_widgets(codec); return 0; -err_codec: - snd_soc_unregister_codec(codec); err_enable: regulator_bulk_disable(ARRAY_SIZE(wm8904->supplies), wm8904->supplies); err_get: regulator_bulk_free(ARRAY_SIZE(wm8904->supplies), wm8904->supplies); -err: - kfree(wm8904); return ret; } -static void wm8904_unregister(struct wm8904_priv *wm8904) +static int wm8904_remove(struct snd_soc_codec *codec) { - wm8904_set_bias_level(&wm8904->codec, SND_SOC_BIAS_OFF); + struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec); + + wm8904_set_bias_level(codec, SND_SOC_BIAS_OFF); regulator_bulk_free(ARRAY_SIZE(wm8904->supplies), wm8904->supplies); - snd_soc_unregister_dai(&wm8904_dai); - snd_soc_unregister_codec(&wm8904->codec); - kfree(wm8904); - wm8904_codec = NULL; + + return 0; } +static struct snd_soc_codec_driver soc_codec_dev_wm8904 = { + .probe = wm8904_probe, + .remove = wm8904_remove, + .suspend = wm8904_suspend, + .resume = wm8904_resume, + .set_bias_level = wm8904_set_bias_level, + .reg_cache_size = ARRAY_SIZE(wm8904_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8904_reg, + .volatile_register = wm8904_volatile_register, +}; + #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) static __devinit int wm8904_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct wm8904_priv *wm8904; - struct snd_soc_codec *codec; + int ret; wm8904 = kzalloc(sizeof(struct wm8904_priv), GFP_KERNEL); if (wm8904 == NULL) return -ENOMEM; - codec = &wm8904->codec; - codec->hw_write = (hw_write_t)i2c_master_send; - wm8904->devtype = id->driver_data; - i2c_set_clientdata(i2c, wm8904); - codec->control_data = i2c; + wm8904->control_data = i2c; wm8904->pdata = i2c->dev.platform_data; - codec->dev = &i2c->dev; - - return wm8904_register(wm8904, SND_SOC_I2C); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8904, &wm8904_dai, 1); + if (ret < 0) + kfree(wm8904); + return ret; } static __devexit int wm8904_i2c_remove(struct i2c_client *client) { - struct wm8904_priv *wm8904 = i2c_get_clientdata(client); - wm8904_unregister(wm8904); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -2641,7 +2553,7 @@ MODULE_DEVICE_TABLE(i2c, wm8904_i2c_id); static struct i2c_driver wm8904_i2c_driver = { .driver = { - .name = "WM8904", + .name = "wm8904-codec", .owner = THIS_MODULE, }, .probe = wm8904_i2c_probe, @@ -2652,15 +2564,15 @@ static struct i2c_driver wm8904_i2c_driver = { static int __init wm8904_modinit(void) { - int ret; + int ret = 0; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ret = i2c_add_driver(&wm8904_i2c_driver); if (ret != 0) { - printk(KERN_ERR "Failed to register WM8904 I2C driver: %d\n", + printk(KERN_ERR "Failed to register wm8904 I2C driver: %d\n", ret); } #endif - return 0; + return ret; } module_init(wm8904_modinit); diff --git a/sound/soc/codecs/wm8904.h b/sound/soc/codecs/wm8904.h index abe5059b3004..9e8c84188ba7 100644 --- a/sound/soc/codecs/wm8904.h +++ b/sound/soc/codecs/wm8904.h @@ -21,9 +21,6 @@ #define WM8904_FLL_LRCLK 3 #define WM8904_FLL_FREE_RUNNING 4 -extern struct snd_soc_dai wm8904_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8904; - /* * Register values. */ diff --git a/sound/soc/codecs/wm8940.c b/sound/soc/codecs/wm8940.c index f0c11138e610..d28bf0dfdb1d 100644 --- a/sound/soc/codecs/wm8940.c +++ b/sound/soc/codecs/wm8940.c @@ -44,7 +44,8 @@ struct wm8940_priv { unsigned int sysclk; u16 reg_cache[WM8940_CACHEREGNUM]; - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; }; static u16 wm8940_reg_defaults[] = { @@ -365,8 +366,7 @@ static int wm8940_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; u16 iface = snd_soc_read(codec, WM8940_IFACE) & 0xFD9F; u16 addcntrl = snd_soc_read(codec, WM8940_ADDCNTRL) & 0xFFF1; u16 companding = snd_soc_read(codec, @@ -636,8 +636,8 @@ static struct snd_soc_dai_ops wm8940_dai_ops = { .set_pll = wm8940_set_dai_pll, }; -struct snd_soc_dai wm8940_dai = { - .name = "WM8940", +static struct snd_soc_dai_driver wm8940_dai = { + .name = "wm8940-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -655,20 +655,14 @@ struct snd_soc_dai wm8940_dai = { .ops = &wm8940_dai_ops, .symmetric_rates = 1, }; -EXPORT_SYMBOL_GPL(wm8940_dai); -static int wm8940_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8940_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - return wm8940_set_bias_level(codec, SND_SOC_BIAS_OFF); } -static int wm8940_resume(struct platform_device *pdev) +static int wm8940_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; int i; int ret; u8 data[3]; @@ -697,108 +691,26 @@ error_ret: return ret; } -static struct snd_soc_codec *wm8940_codec; - -static int wm8940_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - - int ret = 0; - - if (wm8940_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = wm8940_codec; - codec = wm8940_codec; - - mutex_init(&codec->mutex); - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; - } - - ret = snd_soc_add_controls(codec, wm8940_snd_controls, - ARRAY_SIZE(wm8940_snd_controls)); - if (ret) - goto error_free_pcms; - ret = wm8940_add_widgets(codec); - if (ret) - goto error_free_pcms; - - return ret; - -error_free_pcms: - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); -pcm_err: - return ret; -} - -static int wm8940_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8940 = { - .probe = wm8940_probe, - .remove = wm8940_remove, - .suspend = wm8940_suspend, - .resume = wm8940_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8940); - -static int wm8940_register(struct wm8940_priv *wm8940, - enum snd_soc_control_type control) +static int wm8940_probe(struct snd_soc_codec *codec) { - struct wm8940_setup_data *pdata = wm8940->codec.dev->platform_data; - struct snd_soc_codec *codec = &wm8940->codec; + struct wm8940_priv *wm8940 = snd_soc_codec_get_drvdata(codec); + struct wm8940_setup_data *pdata = codec->dev->platform_data; int ret; u16 reg; - if (wm8940_codec) { - dev_err(codec->dev, "Another WM8940 is registered\n"); - return -EINVAL; - } - - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, wm8940); - codec->name = "WM8940"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8940_set_bias_level; - codec->dai = &wm8940_dai; - codec->num_dai = 1; - codec->reg_cache_size = ARRAY_SIZE(wm8940_reg_defaults); - codec->reg_cache = &wm8940->reg_cache; - ret = snd_soc_codec_set_cache_io(codec, 8, 16, control); + codec->control_data = wm8940->control_data; + ret = snd_soc_codec_set_cache_io(codec, 8, 16, wm8940->control_type); if (ret < 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); return ret; } - memcpy(codec->reg_cache, wm8940_reg_defaults, - sizeof(wm8940_reg_defaults)); - ret = wm8940_reset(codec); if (ret < 0) { dev_err(codec->dev, "Failed to issue reset\n"); return ret; } - wm8940_dai.dev = codec->dev; - wm8940_set_bias_level(codec, SND_SOC_BIAS_STANDBY); ret = snd_soc_write(codec, WM8940_POWER1, 0x180); @@ -814,64 +726,60 @@ static int wm8940_register(struct wm8940_priv *wm8940, return ret; } - - wm8940_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); + ret = snd_soc_add_controls(codec, wm8940_snd_controls, + ARRAY_SIZE(wm8940_snd_controls)); + if (ret) return ret; - } - - ret = snd_soc_register_dai(&wm8940_dai); - if (ret) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - snd_soc_unregister_codec(codec); + ret = wm8940_add_widgets(codec); + if (ret) return ret; - } - return 0; + return ret; +; } -static void wm8940_unregister(struct wm8940_priv *wm8940) +static int wm8940_remove(struct snd_soc_codec *codec) { - wm8940_set_bias_level(&wm8940->codec, SND_SOC_BIAS_OFF); - snd_soc_unregister_dai(&wm8940_dai); - snd_soc_unregister_codec(&wm8940->codec); - kfree(wm8940); - wm8940_codec = NULL; + wm8940_set_bias_level(codec, SND_SOC_BIAS_OFF); + return 0; } -static int wm8940_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) +static struct snd_soc_codec_driver soc_codec_dev_wm8940 = { + .probe = wm8940_probe, + .remove = wm8940_remove, + .suspend = wm8940_suspend, + .resume = wm8940_resume, + .set_bias_level = wm8940_set_bias_level, + .reg_cache_size = sizeof(wm8940_reg_defaults), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8940_reg_defaults, +}; + +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +static __devinit int wm8940_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) { - int ret; struct wm8940_priv *wm8940; - struct snd_soc_codec *codec; + int ret; - wm8940 = kzalloc(sizeof *wm8940, GFP_KERNEL); + wm8940 = kzalloc(sizeof(struct wm8940_priv), GFP_KERNEL); if (wm8940 == NULL) return -ENOMEM; - codec = &wm8940->codec; - codec->hw_write = (hw_write_t)i2c_master_send; i2c_set_clientdata(i2c, wm8940); - codec->control_data = i2c; - codec->dev = &i2c->dev; + wm8940->control_data = i2c; - ret = wm8940_register(wm8940, SND_SOC_I2C); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8940, &wm8940_dai, 1); if (ret < 0) kfree(wm8940); - return ret; } -static int __devexit wm8940_i2c_remove(struct i2c_client *client) +static __devexit int wm8940_i2c_remove(struct i2c_client *client) { - struct wm8940_priv *wm8940 = i2c_get_clientdata(client); - - wm8940_unregister(wm8940); - + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -883,29 +791,34 @@ MODULE_DEVICE_TABLE(i2c, wm8940_i2c_id); static struct i2c_driver wm8940_i2c_driver = { .driver = { - .name = "WM8940 I2C Codec", + .name = "wm8940-codec", .owner = THIS_MODULE, }, - .probe = wm8940_i2c_probe, - .remove = __devexit_p(wm8940_i2c_remove), + .probe = wm8940_i2c_probe, + .remove = __devexit_p(wm8940_i2c_remove), .id_table = wm8940_i2c_id, }; +#endif static int __init wm8940_modinit(void) { - int ret; - + int ret = 0; +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ret = i2c_add_driver(&wm8940_i2c_driver); - if (ret) - printk(KERN_ERR "Failed to register WM8940 I2C driver: %d\n", + if (ret != 0) { + printk(KERN_ERR "Failed to register wm8940 I2C driver: %d\n", ret); + } +#endif return ret; } module_init(wm8940_modinit); static void __exit wm8940_exit(void) { +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) i2c_del_driver(&wm8940_i2c_driver); +#endif } module_exit(wm8940_exit); diff --git a/sound/soc/codecs/wm8940.h b/sound/soc/codecs/wm8940.h index 8410eed3ef84..907fe192e9e0 100644 --- a/sound/soc/codecs/wm8940.h +++ b/sound/soc/codecs/wm8940.h @@ -15,8 +15,6 @@ struct wm8940_setup_data { #define WM8940_VROI_30K 1 unsigned int vroi:1; }; -extern struct snd_soc_dai wm8940_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8940; /* WM8940 register space */ #define WM8940_SOFTRESET 0x00 diff --git a/sound/soc/codecs/wm8955.c b/sound/soc/codecs/wm8955.c index 5f025593d84d..a5a9f8ef5771 100644 --- a/sound/soc/codecs/wm8955.c +++ b/sound/soc/codecs/wm8955.c @@ -30,9 +30,6 @@ #include "wm8955.h" -static struct snd_soc_codec *wm8955_codec; -struct snd_soc_codec_device soc_codec_dev_wm8955; - #define WM8955_NUM_SUPPLIES 4 static const char *wm8955_supply_names[WM8955_NUM_SUPPLIES] = { "DCVDD", @@ -43,7 +40,9 @@ static const char *wm8955_supply_names[WM8955_NUM_SUPPLIES] = { /* codec private data */ struct wm8955_priv { - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; + u16 reg_cache[WM8955_MAX_REGISTER + 1]; unsigned int mclk_rate; @@ -52,8 +51,6 @@ struct wm8955_priv { int fs; struct regulator_bulk_data supplies[WM8955_NUM_SUPPLIES]; - - struct wm8955_pdata *pdata; }; static const u16 wm8955_reg[WM8955_MAX_REGISTER + 1] = { @@ -870,8 +867,8 @@ static struct snd_soc_dai_ops wm8955_dai_ops = { .digital_mute = wm8955_digital_mute, }; -struct snd_soc_dai wm8955_dai = { - .name = "WM8955", +static struct snd_soc_dai_driver wm8955_dai = { + .name = "wm8955-hifi", .playback = { .stream_name = "Playback", .channels_min = 2, @@ -881,24 +878,17 @@ struct snd_soc_dai wm8955_dai = { }, .ops = &wm8955_dai_ops, }; -EXPORT_SYMBOL_GPL(wm8955_dai); #ifdef CONFIG_PM -static int wm8955_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8955_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8955_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8955_resume(struct platform_device *pdev) +static int wm8955_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8955_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; @@ -908,86 +898,17 @@ static int wm8955_resume(struct platform_device *pdev) #define wm8955_resume NULL #endif -static int wm8955_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - if (wm8955_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = wm8955_codec; - codec = wm8955_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; - } - - wm8955_add_widgets(codec); - - return ret; - -pcm_err: - return ret; -} - -static int wm8955_remove(struct platform_device *pdev) +static int wm8955_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8955 = { - .probe = wm8955_probe, - .remove = wm8955_remove, - .suspend = wm8955_suspend, - .resume = wm8955_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8955); - -static int wm8955_register(struct wm8955_priv *wm8955, - enum snd_soc_control_type control) -{ - int ret; - struct snd_soc_codec *codec = &wm8955->codec; - int i; - - if (wm8955_codec) { - dev_err(codec->dev, "Another WM8955 is registered\n"); - ret = -EINVAL; - goto err; - } - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, wm8955); - codec->name = "WM8955"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8955_set_bias_level; - codec->dai = &wm8955_dai; - codec->num_dai = 1; - codec->reg_cache_size = WM8955_MAX_REGISTER; - codec->reg_cache = &wm8955->reg_cache; - - memcpy(codec->reg_cache, wm8955_reg, sizeof(wm8955_reg)); + struct wm8955_priv *wm8955 = snd_soc_codec_get_drvdata(codec); + struct wm8955_pdata *pdata = dev_get_platdata(codec->dev); + int ret, i; - ret = snd_soc_codec_set_cache_io(codec, 7, 9, control); + codec->control_data = wm8955->control_data; + ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8955->control_type); if (ret != 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; + return ret; } for (i = 0; i < ARRAY_SIZE(wm8955->supplies); i++) @@ -997,7 +918,7 @@ static int wm8955_register(struct wm8955_priv *wm8955, wm8955->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to request supplies: %d\n", ret); - goto err; + return ret; } ret = regulator_bulk_enable(ARRAY_SIZE(wm8955->supplies), @@ -1013,8 +934,6 @@ static int wm8955_register(struct wm8955_priv *wm8955, goto err_enable; } - wm8955_dai.dev = codec->dev; - /* Change some default settings - latch VU and enable ZC */ wm8955->reg_cache[WM8955_LEFT_DAC_VOLUME] |= WM8955_LDVU; wm8955->reg_cache[WM8955_RIGHT_DAC_VOLUME] |= WM8955_RDVU; @@ -1028,12 +947,12 @@ static int wm8955_register(struct wm8955_priv *wm8955, wm8955->reg_cache[WM8955_BASS_CONTROL] |= WM8955_BB; /* Set platform data values */ - if (wm8955->pdata) { - if (wm8955->pdata->out2_speaker) + if (pdata) { + if (pdata->out2_speaker) wm8955->reg_cache[WM8955_ADDITIONAL_CONTROL_2] |= WM8955_ROUT2INV; - if (wm8955->pdata->monoin_diff) + if (pdata->monoin_diff) wm8955->reg_cache[WM8955_MONO_OUT_MIX_1] |= WM8955_DMEN; } @@ -1043,70 +962,61 @@ static int wm8955_register(struct wm8955_priv *wm8955, /* Bias level configuration will have done an extra enable */ regulator_bulk_disable(ARRAY_SIZE(wm8955->supplies), wm8955->supplies); - wm8955_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err_enable; - } - - ret = snd_soc_register_dai(&wm8955_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } - + wm8955_add_widgets(codec); return 0; -err_codec: - snd_soc_unregister_codec(codec); err_enable: regulator_bulk_disable(ARRAY_SIZE(wm8955->supplies), wm8955->supplies); err_get: regulator_bulk_free(ARRAY_SIZE(wm8955->supplies), wm8955->supplies); -err: - kfree(wm8955); return ret; } -static void wm8955_unregister(struct wm8955_priv *wm8955) +static int wm8955_remove(struct snd_soc_codec *codec) { - wm8955_set_bias_level(&wm8955->codec, SND_SOC_BIAS_OFF); + struct wm8955_priv *wm8955 = snd_soc_codec_get_drvdata(codec); + + wm8955_set_bias_level(codec, SND_SOC_BIAS_OFF); regulator_bulk_free(ARRAY_SIZE(wm8955->supplies), wm8955->supplies); - snd_soc_unregister_dai(&wm8955_dai); - snd_soc_unregister_codec(&wm8955->codec); - kfree(wm8955); - wm8955_codec = NULL; + return 0; } +static struct snd_soc_codec_driver soc_codec_dev_wm8955 = { + .probe = wm8955_probe, + .remove = wm8955_remove, + .suspend = wm8955_suspend, + .resume = wm8955_resume, + .set_bias_level = wm8955_set_bias_level, + .reg_cache_size = ARRAY_SIZE(wm8955_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8955_reg, +}; + #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) static __devinit int wm8955_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct wm8955_priv *wm8955; - struct snd_soc_codec *codec; + int ret; wm8955 = kzalloc(sizeof(struct wm8955_priv), GFP_KERNEL); if (wm8955 == NULL) return -ENOMEM; - codec = &wm8955->codec; - codec->hw_write = (hw_write_t)i2c_master_send; - i2c_set_clientdata(i2c, wm8955); - codec->control_data = i2c; - wm8955->pdata = i2c->dev.platform_data; - - codec->dev = &i2c->dev; + wm8955->control_data = i2c; - return wm8955_register(wm8955, SND_SOC_I2C); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8955, &wm8955_dai, 1); + if (ret < 0) + kfree(wm8955); + return ret; } static __devexit int wm8955_i2c_remove(struct i2c_client *client) { - struct wm8955_priv *wm8955 = i2c_get_clientdata(client); - wm8955_unregister(wm8955); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -1118,7 +1028,7 @@ MODULE_DEVICE_TABLE(i2c, wm8955_i2c_id); static struct i2c_driver wm8955_i2c_driver = { .driver = { - .name = "wm8955", + .name = "wm8955-codec", .owner = THIS_MODULE, }, .probe = wm8955_i2c_probe, @@ -1129,7 +1039,7 @@ static struct i2c_driver wm8955_i2c_driver = { static int __init wm8955_modinit(void) { - int ret; + int ret = 0; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ret = i2c_add_driver(&wm8955_i2c_driver); if (ret != 0) { @@ -1137,7 +1047,7 @@ static int __init wm8955_modinit(void) ret); } #endif - return 0; + return ret; } module_init(wm8955_modinit); diff --git a/sound/soc/codecs/wm8955.h b/sound/soc/codecs/wm8955.h index ae349c8531f6..d13fd5c5fa63 100644 --- a/sound/soc/codecs/wm8955.h +++ b/sound/soc/codecs/wm8955.h @@ -15,9 +15,6 @@ #define WM8955_CLK_MCLK 1 -extern struct snd_soc_dai wm8955_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8955; - /* * Register values. */ diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index 3c6ee61f6c95..8d5efb333c33 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c @@ -29,8 +29,6 @@ #define AUDIO_NAME "wm8960" -struct snd_soc_codec_device soc_codec_dev_wm8960; - /* R25 - Power 1 */ #define WM8960_VMID_MASK 0x180 #define WM8960_VREF 0x40 @@ -75,7 +73,10 @@ static const u16 wm8960_reg[WM8960_CACHEREGNUM] = { struct wm8960_priv { u16 reg_cache[WM8960_CACHEREGNUM]; - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; + int (*set_bias_level)(struct snd_soc_codec *, + enum snd_soc_bias_level level); struct snd_soc_dapm_widget *lout1; struct snd_soc_dapm_widget *rout1; struct snd_soc_dapm_widget *out3; @@ -507,8 +508,7 @@ static int wm8960_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); u16 iface = snd_soc_read(codec, WM8960_IFACE1) & 0xfff3; int i; @@ -849,6 +849,14 @@ static int wm8960_set_dai_clkdiv(struct snd_soc_dai *codec_dai, return 0; } +static int wm8960_set_bias_level(struct snd_soc_codec *codec, + enum snd_soc_bias_level level) +{ + struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); + + return wm8960->set_bias_level(codec, level); +} + #define WM8960_RATES SNDRV_PCM_RATE_8000_48000 #define WM8960_FORMATS \ @@ -863,8 +871,8 @@ static struct snd_soc_dai_ops wm8960_dai_ops = { .set_pll = wm8960_set_dai_pll, }; -struct snd_soc_dai wm8960_dai = { - .name = "WM8960", +static struct snd_soc_dai_driver wm8960_dai = { + .name = "wm8960-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -880,21 +888,18 @@ struct snd_soc_dai wm8960_dai = { .ops = &wm8960_dai_ops, .symmetric_rates = 1, }; -EXPORT_SYMBOL_GPL(wm8960_dai); -static int wm8960_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8960_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; + struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); - codec->set_bias_level(codec, SND_SOC_BIAS_OFF); + wm8960->set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8960_resume(struct platform_device *pdev) +static int wm8960_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; + struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); int i; u8 data[2]; u16 *cache = codec->reg_cache; @@ -906,78 +911,19 @@ static int wm8960_resume(struct platform_device *pdev) codec->hw_write(codec->control_data, data, 2); } - codec->set_bias_level(codec, SND_SOC_BIAS_STANDBY); - + wm8960->set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; } -static struct snd_soc_codec *wm8960_codec; - -static int wm8960_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - if (wm8960_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = wm8960_codec; - codec = wm8960_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; - } - - snd_soc_add_controls(codec, wm8960_snd_controls, - ARRAY_SIZE(wm8960_snd_controls)); - wm8960_add_widgets(codec); - - return ret; - -pcm_err: - return ret; -} - -/* power down chip */ -static int wm8960_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8960 = { - .probe = wm8960_probe, - .remove = wm8960_remove, - .suspend = wm8960_suspend, - .resume = wm8960_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8960); - -static int wm8960_register(struct wm8960_priv *wm8960, - enum snd_soc_control_type control) +static int wm8960_probe(struct snd_soc_codec *codec) { - struct wm8960_data *pdata = wm8960->codec.dev->platform_data; - struct snd_soc_codec *codec = &wm8960->codec; + struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); + struct wm8960_data *pdata = dev_get_platdata(codec->dev); int ret; u16 reg; - if (wm8960_codec) { - dev_err(codec->dev, "Another WM8960 is registered\n"); - ret = -EINVAL; - goto err; - } - - codec->set_bias_level = wm8960_set_bias_level_out3; + wm8960->set_bias_level = wm8960_set_bias_level_out3; + codec->control_data = wm8960->control_data; if (!pdata) { dev_warn(codec->dev, "No platform data supplied\n"); @@ -988,39 +934,22 @@ static int wm8960_register(struct wm8960_priv *wm8960, } if (pdata->capless) - codec->set_bias_level = wm8960_set_bias_level_capless; + wm8960->set_bias_level = wm8960_set_bias_level_capless; } - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, wm8960); - codec->name = "WM8960"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->dai = &wm8960_dai; - codec->num_dai = 1; - codec->reg_cache_size = WM8960_CACHEREGNUM; - codec->reg_cache = &wm8960->reg_cache; - - memcpy(codec->reg_cache, wm8960_reg, sizeof(wm8960_reg)); - - ret = snd_soc_codec_set_cache_io(codec, 7, 9, control); + ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8960->control_type); if (ret < 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; + return ret; } ret = wm8960_reset(codec); if (ret < 0) { dev_err(codec->dev, "Failed to issue reset\n"); - goto err; + return ret; } - wm8960_dai.dev = codec->dev; - - codec->set_bias_level(codec, SND_SOC_BIAS_STANDBY); + wm8960->set_bias_level(codec, SND_SOC_BIAS_STANDBY); /* Latch the update bits */ reg = snd_soc_read(codec, WM8960_LINVOL); @@ -1044,62 +973,58 @@ static int wm8960_register(struct wm8960_priv *wm8960, reg = snd_soc_read(codec, WM8960_ROUT2); snd_soc_write(codec, WM8960_ROUT2, reg | 0x100); - wm8960_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err; - } - - ret = snd_soc_register_dai(&wm8960_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } + snd_soc_add_controls(codec, wm8960_snd_controls, + ARRAY_SIZE(wm8960_snd_controls)); + wm8960_add_widgets(codec); return 0; - -err_codec: - snd_soc_unregister_codec(codec); -err: - kfree(wm8960); - return ret; } -static void wm8960_unregister(struct wm8960_priv *wm8960) +/* power down chip */ +static int wm8960_remove(struct snd_soc_codec *codec) { - wm8960->codec.set_bias_level(&wm8960->codec, SND_SOC_BIAS_OFF); - snd_soc_unregister_dai(&wm8960_dai); - snd_soc_unregister_codec(&wm8960->codec); - kfree(wm8960); - wm8960_codec = NULL; + struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); + + wm8960->set_bias_level(codec, SND_SOC_BIAS_OFF); + return 0; } +static struct snd_soc_codec_driver soc_codec_dev_wm8960 = { + .probe = wm8960_probe, + .remove = wm8960_remove, + .suspend = wm8960_suspend, + .resume = wm8960_resume, + .set_bias_level = wm8960_set_bias_level, + .reg_cache_size = ARRAY_SIZE(wm8960_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8960_reg, +}; + +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) static __devinit int wm8960_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct wm8960_priv *wm8960; - struct snd_soc_codec *codec; + int ret; wm8960 = kzalloc(sizeof(struct wm8960_priv), GFP_KERNEL); if (wm8960 == NULL) return -ENOMEM; - codec = &wm8960->codec; - i2c_set_clientdata(i2c, wm8960); - codec->control_data = i2c; - - codec->dev = &i2c->dev; + wm8960->control_data = i2c; - return wm8960_register(wm8960, SND_SOC_I2C); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8960, &wm8960_dai, 1); + if (ret < 0) + kfree(wm8960); + return ret; } static __devexit int wm8960_i2c_remove(struct i2c_client *client) { - struct wm8960_priv *wm8960 = i2c_get_clientdata(client); - wm8960_unregister(wm8960); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -1111,35 +1036,37 @@ MODULE_DEVICE_TABLE(i2c, wm8960_i2c_id); static struct i2c_driver wm8960_i2c_driver = { .driver = { - .name = "wm8960", + .name = "wm8960-codec", .owner = THIS_MODULE, }, .probe = wm8960_i2c_probe, .remove = __devexit_p(wm8960_i2c_remove), .id_table = wm8960_i2c_id, }; +#endif static int __init wm8960_modinit(void) { - int ret; - + int ret = 0; +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ret = i2c_add_driver(&wm8960_i2c_driver); if (ret != 0) { printk(KERN_ERR "Failed to register WM8960 I2C driver: %d\n", ret); } - +#endif return ret; } module_init(wm8960_modinit); static void __exit wm8960_exit(void) { +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) i2c_del_driver(&wm8960_i2c_driver); +#endif } module_exit(wm8960_exit); - MODULE_DESCRIPTION("ASoC WM8960 driver"); MODULE_AUTHOR("Liam Girdwood"); MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/wm8960.h b/sound/soc/codecs/wm8960.h index a5ef65481b86..2d8163d7004b 100644 --- a/sound/soc/codecs/wm8960.h +++ b/sound/soc/codecs/wm8960.h @@ -110,7 +110,4 @@ #define WM8960_OPCLK_DIV_5_5 (4 << 0) #define WM8960_OPCLK_DIV_6 (5 << 0) -extern struct snd_soc_dai wm8960_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8960; - #endif diff --git a/sound/soc/codecs/wm8961.c b/sound/soc/codecs/wm8961.c index 2549d3a297ab..5ebe2c04e5cf 100644 --- a/sound/soc/codecs/wm8961.c +++ b/sound/soc/codecs/wm8961.c @@ -288,7 +288,8 @@ static u16 wm8961_reg_defaults[] = { }; struct wm8961_priv { - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; int sysclk; u16 reg_cache[WM8961_MAX_REGISTER]; }; @@ -940,8 +941,8 @@ static struct snd_soc_dai_ops wm8961_dai_ops = { .set_clkdiv = wm8961_set_clkdiv, }; -struct snd_soc_dai wm8961_dai = { - .name = "WM8961", +static struct snd_soc_dai_driver wm8961_dai = { + .name = "wm8961-hifi", .playback = { .stream_name = "HiFi Playback", .channels_min = 1, @@ -956,140 +957,24 @@ struct snd_soc_dai wm8961_dai = { .formats = WM8961_FORMATS,}, .ops = &wm8961_dai_ops, }; -EXPORT_SYMBOL_GPL(wm8961_dai); - -static struct snd_soc_codec *wm8961_codec; - -static int wm8961_probe(struct platform_device *pdev) +static int wm8961_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; + struct wm8961_priv *wm8961 = snd_soc_codec_get_drvdata(codec); int ret = 0; - - if (wm8961_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = wm8961_codec; - codec = wm8961_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; - } - - snd_soc_add_controls(codec, wm8961_snd_controls, - ARRAY_SIZE(wm8961_snd_controls)); - snd_soc_dapm_new_controls(codec, wm8961_dapm_widgets, - ARRAY_SIZE(wm8961_dapm_widgets)); - snd_soc_dapm_add_routes(codec, audio_paths, ARRAY_SIZE(audio_paths)); - - return ret; - -pcm_err: - return ret; -} - -static int wm8961_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -#ifdef CONFIG_PM -static int wm8961_suspend(struct platform_device *pdev, pm_message_t state) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - wm8961_set_bias_level(codec, SND_SOC_BIAS_OFF); - - return 0; -} - -static int wm8961_resume(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - u16 *reg_cache = codec->reg_cache; - int i; - - for (i = 0; i < codec->reg_cache_size; i++) { - if (reg_cache[i] == wm8961_reg_defaults[i]) - continue; - - if (i == WM8961_SOFTWARE_RESET) - continue; - - snd_soc_write(codec, i, reg_cache[i]); - } - - wm8961_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - - return 0; -} -#else -#define wm8961_suspend NULL -#define wm8961_resume NULL -#endif - -struct snd_soc_codec_device soc_codec_dev_wm8961 = { - .probe = wm8961_probe, - .remove = wm8961_remove, - .suspend = wm8961_suspend, - .resume = wm8961_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8961); - -static int wm8961_register(struct wm8961_priv *wm8961) -{ - struct snd_soc_codec *codec = &wm8961->codec; - int ret; u16 reg; - if (wm8961_codec) { - dev_err(codec->dev, "Another WM8961 is registered\n"); - ret = -EINVAL; - goto err; - } - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, wm8961); - codec->name = "WM8961"; - codec->owner = THIS_MODULE; - codec->dai = &wm8961_dai; - codec->num_dai = 1; - codec->reg_cache_size = ARRAY_SIZE(wm8961->reg_cache); - codec->reg_cache = &wm8961->reg_cache; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8961_set_bias_level; - codec->volatile_register = wm8961_volatile_register; - - memcpy(codec->reg_cache, wm8961_reg_defaults, - sizeof(wm8961_reg_defaults)); - + codec->control_data = wm8961->control_data; ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C); if (ret != 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; + return ret; } reg = snd_soc_read(codec, WM8961_SOFTWARE_RESET); if (reg != 0x1801) { dev_err(codec->dev, "Device is not a WM8961: ID=0x%x\n", reg); - ret = -EINVAL; - goto err; + return -EINVAL; } /* This isn't volatile - readback doesn't correspond to write */ @@ -1102,7 +987,7 @@ static int wm8961_register(struct wm8961_priv *wm8961) ret = wm8961_reset(codec); if (ret < 0) { dev_err(codec->dev, "Failed to issue reset\n"); - goto err; + return ret; } /* Enable class W */ @@ -1140,64 +1025,90 @@ static int wm8961_register(struct wm8961_priv *wm8961) wm8961_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - wm8961_dai.dev = codec->dev; + snd_soc_add_controls(codec, wm8961_snd_controls, + ARRAY_SIZE(wm8961_snd_controls)); + snd_soc_dapm_new_controls(codec, wm8961_dapm_widgets, + ARRAY_SIZE(wm8961_dapm_widgets)); + snd_soc_dapm_add_routes(codec, audio_paths, ARRAY_SIZE(audio_paths)); - wm8961_codec = codec; + return 0; +} - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err; - } +static int wm8961_remove(struct snd_soc_codec *codec) +{ + wm8961_set_bias_level(codec, SND_SOC_BIAS_OFF); + return 0; +} - ret = snd_soc_register_dai(&wm8961_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } +#ifdef CONFIG_PM +static int wm8961_suspend(struct snd_soc_codec *codec, pm_message_t state) +{ + wm8961_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; - -err_codec: - snd_soc_unregister_codec(codec); -err: - kfree(wm8961); - return ret; } -static void wm8961_unregister(struct wm8961_priv *wm8961) +static int wm8961_resume(struct snd_soc_codec *codec) { - wm8961_set_bias_level(&wm8961->codec, SND_SOC_BIAS_OFF); - snd_soc_unregister_dai(&wm8961_dai); - snd_soc_unregister_codec(&wm8961->codec); - kfree(wm8961); - wm8961_codec = NULL; + u16 *reg_cache = codec->reg_cache; + int i; + + for (i = 0; i < codec->driver->reg_cache_size; i++) { + if (reg_cache[i] == wm8961_reg_defaults[i]) + continue; + + if (i == WM8961_SOFTWARE_RESET) + continue; + + snd_soc_write(codec, i, reg_cache[i]); + } + + wm8961_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + + return 0; } +#else +#define wm8961_suspend NULL +#define wm8961_resume NULL +#endif +static struct snd_soc_codec_driver soc_codec_dev_wm8961 = { + .probe = wm8961_probe, + .remove = wm8961_remove, + .suspend = wm8961_suspend, + .resume = wm8961_resume, + .set_bias_level = wm8961_set_bias_level, + .reg_cache_size = sizeof(wm8961_reg_defaults), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8961_reg_defaults, + .volatile_register = wm8961_volatile_register, +}; + +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) static __devinit int wm8961_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct wm8961_priv *wm8961; - struct snd_soc_codec *codec; + int ret; wm8961 = kzalloc(sizeof(struct wm8961_priv), GFP_KERNEL); if (wm8961 == NULL) return -ENOMEM; - codec = &wm8961->codec; - i2c_set_clientdata(i2c, wm8961); - codec->control_data = i2c; - - codec->dev = &i2c->dev; + wm8961->control_data = i2c; - return wm8961_register(wm8961); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8961, &wm8961_dai, 1); + if (ret < 0) + kfree(wm8961); + return ret; } static __devexit int wm8961_i2c_remove(struct i2c_client *client) { - struct wm8961_priv *wm8961 = i2c_get_clientdata(client); - wm8961_unregister(wm8961); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -1209,35 +1120,37 @@ MODULE_DEVICE_TABLE(i2c, wm8961_i2c_id); static struct i2c_driver wm8961_i2c_driver = { .driver = { - .name = "wm8961", + .name = "wm8961-codec", .owner = THIS_MODULE, }, .probe = wm8961_i2c_probe, .remove = __devexit_p(wm8961_i2c_remove), .id_table = wm8961_i2c_id, }; +#endif static int __init wm8961_modinit(void) { - int ret; - + int ret = 0; +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ret = i2c_add_driver(&wm8961_i2c_driver); if (ret != 0) { - printk(KERN_ERR "Failed to register WM8961 I2C driver: %d\n", + printk(KERN_ERR "Failed to register wm8961 I2C driver: %d\n", ret); } - +#endif return ret; } module_init(wm8961_modinit); static void __exit wm8961_exit(void) { +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) i2c_del_driver(&wm8961_i2c_driver); +#endif } module_exit(wm8961_exit); - MODULE_DESCRIPTION("ASoC WM8961 driver"); MODULE_AUTHOR("Mark Brown "); MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/wm8961.h b/sound/soc/codecs/wm8961.h index 5513bfd720d6..1d736e5701c8 100644 --- a/sound/soc/codecs/wm8961.h +++ b/sound/soc/codecs/wm8961.h @@ -11,9 +11,6 @@ #include -extern struct snd_soc_codec_device soc_codec_dev_wm8961; -extern struct snd_soc_dai wm8961_dai; - #define WM8961_BCLK 1 #define WM8961_LRCLK 2 diff --git a/sound/soc/codecs/wm8971.c b/sound/soc/codecs/wm8971.c index a99620f335d2..ad2692afbb31 100644 --- a/sound/soc/codecs/wm8971.c +++ b/sound/soc/codecs/wm8971.c @@ -38,6 +38,8 @@ static struct workqueue_struct *wm8971_workq = NULL; /* codec private data */ struct wm8971_priv { + enum snd_soc_control_type control_type; + void *control_data; unsigned int sysclk; }; @@ -492,8 +494,7 @@ static int wm8971_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct wm8971_priv *wm8971 = snd_soc_codec_get_drvdata(codec); u16 iface = snd_soc_read(codec, WM8971_IFACE) & 0x1f3; u16 srate = snd_soc_read(codec, WM8971_SRATE) & 0x1c0; @@ -573,8 +574,8 @@ static struct snd_soc_dai_ops wm8971_dai_ops = { .set_sysclk = wm8971_set_dai_sysclk, }; -struct snd_soc_dai wm8971_dai = { - .name = "WM8971", +static struct snd_soc_dai_driver wm8971_dai = { + .name = "wm8971-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -589,7 +590,6 @@ struct snd_soc_dai wm8971_dai = { .formats = WM8971_FORMATS,}, .ops = &wm8971_dai_ops, }; -EXPORT_SYMBOL_GPL(wm8971_dai); static void wm8971_work(struct work_struct *work) { @@ -598,19 +598,14 @@ static void wm8971_work(struct work_struct *work) wm8971_set_bias_level(codec, codec->bias_level); } -static int wm8971_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8971_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8971_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8971_resume(struct platform_device *pdev) +static int wm8971_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; int i; u8 data[2]; u16 *cache = codec->reg_cache; @@ -639,37 +634,27 @@ static int wm8971_resume(struct platform_device *pdev) return 0; } -static int wm8971_init(struct snd_soc_device *socdev, - enum snd_soc_control_type control) +static int wm8971_probe(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = socdev->card->codec; - int reg, ret = 0; - - codec->name = "WM8971"; - codec->owner = THIS_MODULE; - codec->set_bias_level = wm8971_set_bias_level; - codec->dai = &wm8971_dai; - codec->reg_cache_size = ARRAY_SIZE(wm8971_reg); - codec->num_dai = 1; - codec->reg_cache = kmemdup(wm8971_reg, sizeof(wm8971_reg), GFP_KERNEL); - - if (codec->reg_cache == NULL) - return -ENOMEM; + struct wm8971_priv *wm8971 = snd_soc_codec_get_drvdata(codec); + int ret = 0; + u16 reg; + + pr_info("WM8971 Audio Codec %s", WM8971_VERSION); - ret = snd_soc_codec_set_cache_io(codec, 7, 9, control); + codec->control_data = wm8971->control_data; + ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8971->control_type); if (ret < 0) { printk(KERN_ERR "wm8971: failed to set cache I/O: %d\n", ret); - goto err; + return ret; } - wm8971_reset(codec); + INIT_DELAYED_WORK(&codec->delayed_work, wm8971_work); + wm8971_workq = create_workqueue("wm8971"); + if (wm8971_workq == NULL) + return -ENOMEM; - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - printk(KERN_ERR "wm8971: failed to create pcms\n"); - goto err; - } + wm8971_reset(codec); /* charge output caps - set vmid to 5k for quick power up */ reg = snd_soc_read(codec, WM8971_PWR1) & 0xfe3e; @@ -704,40 +689,55 @@ static int wm8971_init(struct snd_soc_device *socdev, wm8971_add_widgets(codec); return ret; - -err: - kfree(codec->reg_cache); - return ret; } -/* If the i2c layer weren't so broken, we could pass this kind of data - around */ -static struct snd_soc_device *wm8971_socdev; -#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE) +/* power down chip */ +static int wm8971_remove(struct snd_soc_codec *codec) +{ + wm8971_set_bias_level(codec, SND_SOC_BIAS_OFF); + + if (wm8971_workq) + destroy_workqueue(wm8971_workq); + return 0; +} + +static struct snd_soc_codec_driver soc_codec_dev_wm8971 = { + .probe = wm8971_probe, + .remove = wm8971_remove, + .suspend = wm8971_suspend, + .resume = wm8971_resume, + .set_bias_level = wm8971_set_bias_level, + .reg_cache_size = ARRAY_SIZE(wm8971_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8971_reg, +}; -static int wm8971_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +static __devinit int wm8971_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) { - struct snd_soc_device *socdev = wm8971_socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct wm8971_priv *wm8971; int ret; - i2c_set_clientdata(i2c, codec); + wm8971 = kzalloc(sizeof(struct wm8971_priv), GFP_KERNEL); + if (wm8971 == NULL) + return -ENOMEM; - codec->control_data = i2c; + i2c_set_clientdata(i2c, wm8971); + wm8971->control_data = i2c; - ret = wm8971_init(socdev, SND_SOC_I2C); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8971, &wm8971_dai, 1); if (ret < 0) - pr_err("failed to initialise WM8971\n"); - + kfree(wm8971); return ret; } -static int wm8971_i2c_remove(struct i2c_client *client) +static __devexit int wm8971_i2c_remove(struct i2c_client *client) { - struct snd_soc_codec *codec = i2c_get_clientdata(client); - kfree(codec->reg_cache); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -749,148 +749,34 @@ MODULE_DEVICE_TABLE(i2c, wm8971_i2c_id); static struct i2c_driver wm8971_i2c_driver = { .driver = { - .name = "WM8971 I2C Codec", + .name = "wm8971-codec", .owner = THIS_MODULE, }, - .probe = wm8971_i2c_probe, - .remove = wm8971_i2c_remove, + .probe = wm8971_i2c_probe, + .remove = __devexit_p(wm8971_i2c_remove), .id_table = wm8971_i2c_id, }; - -static int wm8971_add_i2c_device(struct platform_device *pdev, - const struct wm8971_setup_data *setup) -{ - struct i2c_board_info info; - struct i2c_adapter *adapter; - struct i2c_client *client; - int ret; - - ret = i2c_add_driver(&wm8971_i2c_driver); - if (ret != 0) { - dev_err(&pdev->dev, "can't add i2c driver\n"); - return ret; - } - - memset(&info, 0, sizeof(struct i2c_board_info)); - info.addr = setup->i2c_address; - strlcpy(info.type, "wm8971", I2C_NAME_SIZE); - - adapter = i2c_get_adapter(setup->i2c_bus); - if (!adapter) { - dev_err(&pdev->dev, "can't get i2c adapter %d\n", - setup->i2c_bus); - goto err_driver; - } - - client = i2c_new_device(adapter, &info); - i2c_put_adapter(adapter); - if (!client) { - dev_err(&pdev->dev, "can't add i2c device at 0x%x\n", - (unsigned int)info.addr); - goto err_driver; - } - - return 0; - -err_driver: - i2c_del_driver(&wm8971_i2c_driver); - return -ENODEV; -} - #endif -static int wm8971_probe(struct platform_device *pdev) +static int __init wm8971_modinit(void) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct wm8971_setup_data *setup; - struct snd_soc_codec *codec; - struct wm8971_priv *wm8971; int ret = 0; - - pr_info("WM8971 Audio Codec %s", WM8971_VERSION); - - setup = socdev->codec_data; - codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (codec == NULL) - return -ENOMEM; - - wm8971 = kzalloc(sizeof(struct wm8971_priv), GFP_KERNEL); - if (wm8971 == NULL) { - kfree(codec); - return -ENOMEM; - } - - snd_soc_codec_set_drvdata(codec, wm8971); - socdev->card->codec = codec; - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - wm8971_socdev = socdev; - - INIT_DELAYED_WORK(&codec->delayed_work, wm8971_work); - wm8971_workq = create_workqueue("wm8971"); - if (wm8971_workq == NULL) { - kfree(snd_soc_codec_get_drvdata(codec)); - kfree(codec); - return -ENOMEM; - } - -#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE) - if (setup->i2c_address) { - ret = wm8971_add_i2c_device(pdev, setup); - } -#endif - /* Add other interfaces here */ - +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) + ret = i2c_add_driver(&wm8971_i2c_driver); if (ret != 0) { - destroy_workqueue(wm8971_workq); - kfree(snd_soc_codec_get_drvdata(codec)); - kfree(codec); + printk(KERN_ERR "Failed to register WM8971 I2C driver: %d\n", + ret); } - - return ret; -} - -/* power down chip */ -static int wm8971_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - if (codec->control_data) - wm8971_set_bias_level(codec, SND_SOC_BIAS_OFF); - if (wm8971_workq) - destroy_workqueue(wm8971_workq); - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); -#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE) - i2c_unregister_device(codec->control_data); - i2c_del_driver(&wm8971_i2c_driver); #endif - kfree(snd_soc_codec_get_drvdata(codec)); - kfree(codec); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8971 = { - .probe = wm8971_probe, - .remove = wm8971_remove, - .suspend = wm8971_suspend, - .resume = wm8971_resume, -}; - -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8971); - -static int __init wm8971_modinit(void) -{ - return snd_soc_register_dai(&wm8971_dai); + return ret; } module_init(wm8971_modinit); static void __exit wm8971_exit(void) { - snd_soc_unregister_dai(&wm8971_dai); +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) + i2c_del_driver(&wm8971_i2c_driver); +#endif } module_exit(wm8971_exit); diff --git a/sound/soc/codecs/wm8971.h b/sound/soc/codecs/wm8971.h index ef4f08f9f344..f31c38fddfc4 100644 --- a/sound/soc/codecs/wm8971.h +++ b/sound/soc/codecs/wm8971.h @@ -53,12 +53,4 @@ #define WM8971_SYSCLK 0 -struct wm8971_setup_data { - int i2c_bus; - unsigned short i2c_address; -}; - -extern struct snd_soc_dai wm8971_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8971; - #endif diff --git a/sound/soc/codecs/wm8974.c b/sound/soc/codecs/wm8974.c index 1468fe10cbbe..52f631c62e29 100644 --- a/sound/soc/codecs/wm8974.c +++ b/sound/soc/codecs/wm8974.c @@ -51,12 +51,11 @@ static const u16 wm8974_reg[WM8974_CACHEREGNUM] = { #define WM8974_POWER1_BUFIOEN 0x04 struct wm8974_priv { - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; u16 reg_cache[WM8974_CACHEREGNUM]; }; -static struct snd_soc_codec *wm8974_codec; - #define wm8974_reset(c) snd_soc_write(c, WM8974_RESET, 0) static const char *wm8974_companding[] = {"Off", "NC", "u-law", "A-law" }; @@ -566,8 +565,8 @@ static struct snd_soc_dai_ops wm8974_ops = { .set_pll = wm8974_set_dai_pll, }; -struct snd_soc_dai wm8974_dai = { - .name = "WM8974 HiFi", +static struct snd_soc_dai_driver wm8974_dai = { + .name = "wm8974-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -583,21 +582,15 @@ struct snd_soc_dai wm8974_dai = { .ops = &wm8974_ops, .symmetric_rates = 1, }; -EXPORT_SYMBOL_GPL(wm8974_dai); -static int wm8974_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8974_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8974_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8974_resume(struct platform_device *pdev) +static int wm8974_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; int i; u8 data[2]; u16 *cache = codec->reg_cache; @@ -613,156 +606,75 @@ static int wm8974_resume(struct platform_device *pdev) return 0; } -static int wm8974_probe(struct platform_device *pdev) +static int wm8974_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; + struct wm8974_priv *wm8974 = snd_soc_codec_get_drvdata(codec); int ret = 0; - if (wm8974_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; + codec->control_data = wm8974->control_data; + ret = snd_soc_codec_set_cache_io(codec, 7, 9, SND_SOC_I2C); + if (ret < 0) { + dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); + return ret; } - socdev->card->codec = wm8974_codec; - codec = wm8974_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); + ret = wm8974_reset(codec); if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; + dev_err(codec->dev, "Failed to issue reset\n"); + return ret; } + wm8974_set_bias_level(codec, SND_SOC_BIAS_STANDBY); snd_soc_add_controls(codec, wm8974_snd_controls, ARRAY_SIZE(wm8974_snd_controls)); wm8974_add_widgets(codec); return ret; - -pcm_err: - return ret; } /* power down chip */ -static int wm8974_remove(struct platform_device *pdev) +static int wm8974_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - + wm8974_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -struct snd_soc_codec_device soc_codec_dev_wm8974 = { +static struct snd_soc_codec_driver soc_codec_dev_wm8974 = { .probe = wm8974_probe, .remove = wm8974_remove, .suspend = wm8974_suspend, .resume = wm8974_resume, + .set_bias_level = wm8974_set_bias_level, + .reg_cache_size = ARRAY_SIZE(wm8974_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8974_reg, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8974); - -static __devinit int wm8974_register(struct wm8974_priv *wm8974) -{ - int ret; - struct snd_soc_codec *codec = &wm8974->codec; - - if (wm8974_codec) { - dev_err(codec->dev, "Another WM8974 is registered\n"); - ret = -EINVAL; - goto err; - } - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, wm8974); - codec->name = "WM8974"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8974_set_bias_level; - codec->dai = &wm8974_dai; - codec->num_dai = 1; - codec->reg_cache_size = WM8974_CACHEREGNUM; - codec->reg_cache = &wm8974->reg_cache; - - ret = snd_soc_codec_set_cache_io(codec, 7, 9, SND_SOC_I2C); - if (ret < 0) { - dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; - } - - memcpy(codec->reg_cache, wm8974_reg, sizeof(wm8974_reg)); - - ret = wm8974_reset(codec); - if (ret < 0) { - dev_err(codec->dev, "Failed to issue reset\n"); - goto err; - } - - wm8974_dai.dev = codec->dev; - - wm8974_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - - wm8974_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err; - } - - ret = snd_soc_register_dai(&wm8974_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } - - return 0; - -err_codec: - snd_soc_unregister_codec(codec); -err: - kfree(wm8974); - return ret; -} - -static __devexit void wm8974_unregister(struct wm8974_priv *wm8974) -{ - wm8974_set_bias_level(&wm8974->codec, SND_SOC_BIAS_OFF); - snd_soc_unregister_dai(&wm8974_dai); - snd_soc_unregister_codec(&wm8974->codec); - kfree(wm8974); - wm8974_codec = NULL; -} +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) static __devinit int wm8974_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct wm8974_priv *wm8974; - struct snd_soc_codec *codec; + int ret; wm8974 = kzalloc(sizeof(struct wm8974_priv), GFP_KERNEL); if (wm8974 == NULL) return -ENOMEM; - codec = &wm8974->codec; - codec->hw_write = (hw_write_t)i2c_master_send; - i2c_set_clientdata(i2c, wm8974); - codec->control_data = i2c; - - codec->dev = &i2c->dev; + wm8974->control_data = i2c; - return wm8974_register(wm8974); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8974, &wm8974_dai, 1); + if (ret < 0) + kfree(wm8974); + return ret; } static __devexit int wm8974_i2c_remove(struct i2c_client *client) { - struct wm8974_priv *wm8974 = i2c_get_clientdata(client); - wm8974_unregister(wm8974); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -774,23 +686,34 @@ MODULE_DEVICE_TABLE(i2c, wm8974_i2c_id); static struct i2c_driver wm8974_i2c_driver = { .driver = { - .name = "WM8974", + .name = "wm8974-codec", .owner = THIS_MODULE, }, .probe = wm8974_i2c_probe, .remove = __devexit_p(wm8974_i2c_remove), .id_table = wm8974_i2c_id, }; +#endif static int __init wm8974_modinit(void) { - return i2c_add_driver(&wm8974_i2c_driver); + int ret = 0; +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) + ret = i2c_add_driver(&wm8974_i2c_driver); + if (ret != 0) { + printk(KERN_ERR "Failed to register wm8974 I2C driver: %d\n", + ret); + } +#endif + return ret; } module_init(wm8974_modinit); static void __exit wm8974_exit(void) { +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) i2c_del_driver(&wm8974_i2c_driver); +#endif } module_exit(wm8974_exit); diff --git a/sound/soc/codecs/wm8974.h b/sound/soc/codecs/wm8974.h index 896a7f0f3fc4..3c94e7bb55a6 100644 --- a/sound/soc/codecs/wm8974.h +++ b/sound/soc/codecs/wm8974.h @@ -83,7 +83,4 @@ #define WM8974_MCLKDIV_8 (6 << 5) #define WM8974_MCLKDIV_12 (7 << 5) -extern struct snd_soc_dai wm8974_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8974; - #endif diff --git a/sound/soc/codecs/wm8978.c b/sound/soc/codecs/wm8978.c index 8a1ad778e7e3..676a4306cc87 100644 --- a/sound/soc/codecs/wm8978.c +++ b/sound/soc/codecs/wm8978.c @@ -31,8 +31,6 @@ #include "wm8978.h" -static struct snd_soc_codec *wm8978_codec; - /* wm8978 register cache. Note that register 0 is not included in the cache. */ static const u16 wm8978_reg[WM8978_CACHEREGNUM] = { 0x0000, 0x0000, 0x0000, 0x0000, /* 0x00...0x03 */ @@ -54,7 +52,8 @@ static const u16 wm8978_reg[WM8978_CACHEREGNUM] = { /* codec private data */ struct wm8978_priv { - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; unsigned int f_pllout; unsigned int f_mclk; unsigned int f_256fs; @@ -374,8 +373,8 @@ struct wm8978_pll_div { #define FIXED_PLL_SIZE (1 << 24) -static void pll_factors(struct wm8978_pll_div *pll_div, unsigned int target, - unsigned int source) +static void pll_factors(struct snd_soc_codec *codec, + struct wm8978_pll_div *pll_div, unsigned int target, unsigned int source) { u64 k_part; unsigned int k, n_div, n_mod; @@ -390,7 +389,7 @@ static void pll_factors(struct wm8978_pll_div *pll_div, unsigned int target, } if (n_div < 6 || n_div > 12) - dev_warn(wm8978_codec->dev, + dev_warn(codec->dev, "WM8978 N value exceeds recommended range! N = %u\n", n_div); @@ -505,7 +504,7 @@ static int wm8978_configure_pll(struct snd_soc_codec *codec) dev_dbg(codec->dev, "%s: f_MCLK=%uHz, f_PLLOUT=%uHz\n", __func__, wm8978->f_mclk, wm8978->f_pllout); - pll_factors(&pll_div, f2, wm8978->f_mclk); + pll_factors(codec, &pll_div, f2, wm8978->f_mclk); dev_dbg(codec->dev, "%s: calculated PLL N=0x%x, K=0x%x, div2=%d\n", __func__, pll_div.n, pll_div.k, pll_div.div2); @@ -690,8 +689,7 @@ static int wm8978_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct wm8978_priv *wm8978 = snd_soc_codec_get_drvdata(codec); /* Word length mask = 0x60 */ u16 iface_ctl = snd_soc_read(codec, WM8978_AUDIO_INTERFACE) & ~0x60; @@ -875,9 +873,8 @@ static struct snd_soc_dai_ops wm8978_dai_ops = { }; /* Also supports 12kHz */ -struct snd_soc_dai wm8978_dai = { - .name = "WM8978 HiFi", - .id = 1, +static struct snd_soc_dai_driver wm8978_dai = { + .name = "wm8978-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -894,13 +891,9 @@ struct snd_soc_dai wm8978_dai = { }, .ops = &wm8978_dai_ops, }; -EXPORT_SYMBOL_GPL(wm8978_dai); -static int wm8978_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8978_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8978_set_bias_level(codec, SND_SOC_BIAS_OFF); /* Also switch PLL off */ snd_soc_write(codec, WM8978_POWER_MANAGEMENT_1, 0); @@ -908,10 +901,8 @@ static int wm8978_suspend(struct platform_device *pdev, pm_message_t state) return 0; } -static int wm8978_resume(struct platform_device *pdev) +static int wm8978_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; struct wm8978_priv *wm8978 = snd_soc_codec_get_drvdata(codec); int i; u16 *cache = codec->reg_cache; @@ -933,54 +924,6 @@ static int wm8978_resume(struct platform_device *pdev) return 0; } -static int wm8978_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - if (wm8978_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = wm8978_codec; - codec = wm8978_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; - } - - snd_soc_add_controls(codec, wm8978_snd_controls, - ARRAY_SIZE(wm8978_snd_controls)); - wm8978_add_widgets(codec); - -pcm_err: - return ret; -} - -/* power down chip */ -static int wm8978_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8978 = { - .probe = wm8978_probe, - .remove = wm8978_remove, - .suspend = wm8978_suspend, - .resume = wm8978_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8978); - /* * These registers contain an "update" bit - bit 8. This means, for example, * that one can write new DAC digital volume for both channels, but only when @@ -1000,44 +943,23 @@ static const int update_reg[] = { WM8978_ROUT2_SPK_CONTROL, }; -static __devinit int wm8978_register(struct wm8978_priv *wm8978) +static int wm8978_probe(struct snd_soc_codec *codec) { - int ret, i; - struct snd_soc_codec *codec = &wm8978->codec; - - if (wm8978_codec) { - dev_err(codec->dev, "Another WM8978 is registered\n"); - return -EINVAL; - } + struct wm8978_priv *wm8978 = snd_soc_codec_get_drvdata(codec); + int ret = 0, i; /* * Set default system clock to PLL, it is more precise, this is also the * default hardware setting */ wm8978->sysclk = WM8978_PLL; - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, wm8978); - codec->name = "WM8978"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8978_set_bias_level; - codec->dai = &wm8978_dai; - codec->num_dai = 1; - codec->reg_cache_size = WM8978_CACHEREGNUM; - codec->reg_cache = &wm8978->reg_cache; - + codec->control_data = wm8978->control_data; ret = snd_soc_codec_set_cache_io(codec, 7, 9, SND_SOC_I2C); if (ret < 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; + return ret; } - memcpy(codec->reg_cache, wm8978_reg, sizeof(wm8978_reg)); - /* * Set the update bit in all registers, that have one. This way all * writes to those registers will also cause the update bit to be @@ -1050,74 +972,61 @@ static __devinit int wm8978_register(struct wm8978_priv *wm8978) ret = snd_soc_write(codec, WM8978_RESET, 0); if (ret < 0) { dev_err(codec->dev, "Failed to issue reset\n"); - goto err; + return ret; } - wm8978_dai.dev = codec->dev; - wm8978_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - wm8978_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err; - } - - ret = snd_soc_register_dai(&wm8978_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } + snd_soc_add_controls(codec, wm8978_snd_controls, + ARRAY_SIZE(wm8978_snd_controls)); + wm8978_add_widgets(codec); return 0; - -err_codec: - snd_soc_unregister_codec(codec); -err: - return ret; } -static __devexit void wm8978_unregister(struct wm8978_priv *wm8978) +/* power down chip */ +static int wm8978_remove(struct snd_soc_codec *codec) { - wm8978_set_bias_level(&wm8978->codec, SND_SOC_BIAS_OFF); - snd_soc_unregister_dai(&wm8978_dai); - snd_soc_unregister_codec(&wm8978->codec); - wm8978_codec = NULL; + wm8978_set_bias_level(codec, SND_SOC_BIAS_OFF); + return 0; } +static struct snd_soc_codec_driver soc_codec_dev_wm8978 = { + .probe = wm8978_probe, + .remove = wm8978_remove, + .suspend = wm8978_suspend, + .resume = wm8978_resume, + .set_bias_level = wm8978_set_bias_level, + .reg_cache_size = ARRAY_SIZE(wm8978_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8978_reg, +}; + +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) static __devinit int wm8978_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { - int ret; struct wm8978_priv *wm8978; - struct snd_soc_codec *codec; + int ret; wm8978 = kzalloc(sizeof(struct wm8978_priv), GFP_KERNEL); if (wm8978 == NULL) return -ENOMEM; - codec = &wm8978->codec; - codec->hw_write = (hw_write_t)i2c_master_send; - i2c_set_clientdata(i2c, wm8978); - codec->control_data = i2c; - - codec->dev = &i2c->dev; + wm8978->control_data = i2c; - ret = wm8978_register(wm8978); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8978, &wm8978_dai, 1); if (ret < 0) kfree(wm8978); - return ret; } static __devexit int wm8978_i2c_remove(struct i2c_client *client) { - struct wm8978_priv *wm8978 = i2c_get_clientdata(client); - wm8978_unregister(wm8978); - kfree(wm8978); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -1129,23 +1038,34 @@ MODULE_DEVICE_TABLE(i2c, wm8978_i2c_id); static struct i2c_driver wm8978_i2c_driver = { .driver = { - .name = "WM8978", + .name = "WM8978-codec", .owner = THIS_MODULE, }, .probe = wm8978_i2c_probe, .remove = __devexit_p(wm8978_i2c_remove), .id_table = wm8978_i2c_id, }; +#endif static int __init wm8978_modinit(void) { - return i2c_add_driver(&wm8978_i2c_driver); + int ret = 0; +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) + ret = i2c_add_driver(&wm8978_i2c_driver); + if (ret != 0) { + printk(KERN_ERR "Failed to register WM8978 I2C driver: %d\n", + ret); + } +#endif + return ret; } module_init(wm8978_modinit); static void __exit wm8978_exit(void) { +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) i2c_del_driver(&wm8978_i2c_driver); +#endif } module_exit(wm8978_exit); diff --git a/sound/soc/codecs/wm8978.h b/sound/soc/codecs/wm8978.h index 56ec83270917..c75525b7f154 100644 --- a/sound/soc/codecs/wm8978.h +++ b/sound/soc/codecs/wm8978.h @@ -80,7 +80,4 @@ enum wm8978_sysclk_src { WM8978_MCLK }; -extern struct snd_soc_dai wm8978_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8978; - #endif /* __WM8978_H__ */ diff --git a/sound/soc/codecs/wm8988.c b/sound/soc/codecs/wm8988.c index 19ad590ca0b3..ecbffcea71db 100644 --- a/sound/soc/codecs/wm8988.c +++ b/sound/soc/codecs/wm8988.c @@ -52,7 +52,8 @@ static const u16 wm8988_reg[] = { /* codec private data */ struct wm8988_priv { unsigned int sysclk; - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; struct snd_pcm_hw_constraint_list *sysclk_constraints; u16 reg_cache[WM8988_NUM_REG]; }; @@ -608,8 +609,7 @@ static int wm8988_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct wm8988_priv *wm8988 = snd_soc_codec_get_drvdata(codec); u16 iface = snd_soc_read(codec, WM8988_IFACE) & 0x1f3; u16 srate = snd_soc_read(codec, WM8988_SRATE) & 0x180; @@ -711,8 +711,8 @@ static struct snd_soc_dai_ops wm8988_ops = { .digital_mute = wm8988_mute, }; -struct snd_soc_dai wm8988_dai = { - .name = "WM8988", +static struct snd_soc_dai_driver wm8988_dai = { + .name = "wm8988-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -730,21 +730,15 @@ struct snd_soc_dai wm8988_dai = { .ops = &wm8988_ops, .symmetric_rates = 1, }; -EXPORT_SYMBOL_GPL(wm8988_dai); -static int wm8988_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8988_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8988_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8988_resume(struct platform_device *pdev) +static int wm8988_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; int i; u8 data[2]; u16 *cache = codec->reg_cache; @@ -763,99 +757,23 @@ static int wm8988_resume(struct platform_device *pdev) return 0; } -static struct snd_soc_codec *wm8988_codec; - -static int wm8988_probe(struct platform_device *pdev) +static int wm8988_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; + struct wm8988_priv *wm8988 = snd_soc_codec_get_drvdata(codec); int ret = 0; - - if (wm8988_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = wm8988_codec; - codec = wm8988_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; - } - - snd_soc_add_controls(codec, wm8988_snd_controls, - ARRAY_SIZE(wm8988_snd_controls)); - snd_soc_dapm_new_controls(codec, wm8988_dapm_widgets, - ARRAY_SIZE(wm8988_dapm_widgets)); - snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map)); - - return ret; - -pcm_err: - return ret; -} - -static int wm8988_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8988 = { - .probe = wm8988_probe, - .remove = wm8988_remove, - .suspend = wm8988_suspend, - .resume = wm8988_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8988); - -static int wm8988_register(struct wm8988_priv *wm8988, - enum snd_soc_control_type control) -{ - struct snd_soc_codec *codec = &wm8988->codec; - int ret; u16 reg; - if (wm8988_codec) { - dev_err(codec->dev, "Another WM8988 is registered\n"); - ret = -EINVAL; - goto err; - } - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, wm8988); - codec->name = "WM8988"; - codec->owner = THIS_MODULE; - codec->dai = &wm8988_dai; - codec->num_dai = 1; - codec->reg_cache_size = ARRAY_SIZE(wm8988->reg_cache); - codec->reg_cache = &wm8988->reg_cache; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8988_set_bias_level; - - memcpy(codec->reg_cache, wm8988_reg, - sizeof(wm8988_reg)); - - ret = snd_soc_codec_set_cache_io(codec, 7, 9, control); + codec->control_data = wm8988->control_data; + ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8988->control_type); if (ret < 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; + return ret; } ret = wm8988_reset(codec); if (ret < 0) { dev_err(codec->dev, "Failed to issue reset\n"); - goto err; + return ret; } /* set the update bits (we always update left then right) */ @@ -870,139 +788,135 @@ static int wm8988_register(struct wm8988_priv *wm8988, reg = snd_soc_read(codec, WM8988_RINVOL); snd_soc_write(codec, WM8988_RINVOL, reg | 0x0100); - wm8988_set_bias_level(&wm8988->codec, SND_SOC_BIAS_STANDBY); - - wm8988_dai.dev = codec->dev; - - wm8988_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err; - } + wm8988_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - ret = snd_soc_register_dai(&wm8988_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } + snd_soc_add_controls(codec, wm8988_snd_controls, + ARRAY_SIZE(wm8988_snd_controls)); + snd_soc_dapm_new_controls(codec, wm8988_dapm_widgets, + ARRAY_SIZE(wm8988_dapm_widgets)); + snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map)); return 0; - -err_codec: - snd_soc_unregister_codec(codec); -err: - kfree(wm8988); - return ret; } -static void wm8988_unregister(struct wm8988_priv *wm8988) +static int wm8988_remove(struct snd_soc_codec *codec) { - wm8988_set_bias_level(&wm8988->codec, SND_SOC_BIAS_OFF); - snd_soc_unregister_dai(&wm8988_dai); - snd_soc_unregister_codec(&wm8988->codec); - kfree(wm8988); - wm8988_codec = NULL; + wm8988_set_bias_level(codec, SND_SOC_BIAS_OFF); + return 0; } -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) -static int wm8988_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) +static struct snd_soc_codec_driver soc_codec_dev_wm8988 = { + .probe = wm8988_probe, + .remove = wm8988_remove, + .suspend = wm8988_suspend, + .resume = wm8988_resume, + .set_bias_level = wm8988_set_bias_level, + .reg_cache_size = sizeof(wm8988_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8988_reg, +}; + +#if defined(CONFIG_SPI_MASTER) +static int __devinit wm8988_spi_probe(struct spi_device *spi) { struct wm8988_priv *wm8988; - struct snd_soc_codec *codec; + int ret; wm8988 = kzalloc(sizeof(struct wm8988_priv), GFP_KERNEL); if (wm8988 == NULL) return -ENOMEM; - codec = &wm8988->codec; - - i2c_set_clientdata(i2c, wm8988); - codec->control_data = i2c; - - codec->dev = &i2c->dev; + wm8988->control_data = spi; + wm8988->control_type = SND_SOC_SPI; + spi_set_drvdata(spi, wm8988); - return wm8988_register(wm8988, SND_SOC_I2C); + ret = snd_soc_register_codec(&spi->dev, + &soc_codec_dev_wm8988, &wm8988_dai, 1); + if (ret < 0) + kfree(wm8988); + return ret; } -static int wm8988_i2c_remove(struct i2c_client *client) +static int __devexit wm8988_spi_remove(struct spi_device *spi) { - struct wm8988_priv *wm8988 = i2c_get_clientdata(client); - wm8988_unregister(wm8988); + snd_soc_unregister_codec(&spi->dev); + kfree(spi_get_drvdata(spi)); return 0; } -static const struct i2c_device_id wm8988_i2c_id[] = { - { "wm8988", 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, wm8988_i2c_id); - -static struct i2c_driver wm8988_i2c_driver = { +static struct spi_driver wm8988_spi_driver = { .driver = { - .name = "WM8988", - .owner = THIS_MODULE, + .name = "wm8988-codec", + .bus = &spi_bus_type, + .owner = THIS_MODULE, }, - .probe = wm8988_i2c_probe, - .remove = wm8988_i2c_remove, - .id_table = wm8988_i2c_id, + .probe = wm8988_spi_probe, + .remove = __devexit_p(wm8988_spi_remove), }; -#endif +#endif /* CONFIG_SPI_MASTER */ -#if defined(CONFIG_SPI_MASTER) -static int __devinit wm8988_spi_probe(struct spi_device *spi) +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +static __devinit int wm8988_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) { struct wm8988_priv *wm8988; - struct snd_soc_codec *codec; + int ret; wm8988 = kzalloc(sizeof(struct wm8988_priv), GFP_KERNEL); if (wm8988 == NULL) return -ENOMEM; - codec = &wm8988->codec; - codec->control_data = spi; - codec->dev = &spi->dev; - - dev_set_drvdata(&spi->dev, wm8988); + i2c_set_clientdata(i2c, wm8988); + wm8988->control_data = i2c; + wm8988->control_type = SND_SOC_I2C; - return wm8988_register(wm8988, SND_SOC_SPI); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8988, &wm8988_dai, 1); + if (ret < 0) + kfree(wm8988); + return ret; } -static int __devexit wm8988_spi_remove(struct spi_device *spi) +static __devexit int wm8988_i2c_remove(struct i2c_client *client) { - struct wm8988_priv *wm8988 = dev_get_drvdata(&spi->dev); - - wm8988_unregister(wm8988); - + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } -static struct spi_driver wm8988_spi_driver = { +static const struct i2c_device_id wm8988_i2c_id[] = { + { "wm8988", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, wm8988_i2c_id); + +static struct i2c_driver wm8988_i2c_driver = { .driver = { - .name = "wm8988", - .bus = &spi_bus_type, - .owner = THIS_MODULE, + .name = "wm8988-codec", + .owner = THIS_MODULE, }, - .probe = wm8988_spi_probe, - .remove = __devexit_p(wm8988_spi_remove), + .probe = wm8988_i2c_probe, + .remove = __devexit_p(wm8988_i2c_remove), + .id_table = wm8988_i2c_id, }; #endif static int __init wm8988_modinit(void) { - int ret; - + int ret = 0; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ret = i2c_add_driver(&wm8988_i2c_driver); - if (ret != 0) - pr_err("WM8988: Unable to register I2C driver: %d\n", ret); + if (ret != 0) { + printk(KERN_ERR "Failed to register WM8988 I2C driver: %d\n", + ret); + } #endif #if defined(CONFIG_SPI_MASTER) ret = spi_register_driver(&wm8988_spi_driver); - if (ret != 0) - pr_err("WM8988: Unable to register SPI driver: %d\n", ret); + if (ret != 0) { + printk(KERN_ERR "Failed to register WM8988 SPI driver: %d\n", + ret); + } #endif return ret; } diff --git a/sound/soc/codecs/wm8988.h b/sound/soc/codecs/wm8988.h index 4552d37fdd41..5c04024e5f9f 100644 --- a/sound/soc/codecs/wm8988.h +++ b/sound/soc/codecs/wm8988.h @@ -54,7 +54,4 @@ #define WM8988_SYSCLK 0 -extern struct snd_soc_dai wm8988_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8988; - #endif diff --git a/sound/soc/codecs/wm8990.c b/sound/soc/codecs/wm8990.c index dd8d909788c1..b25243382966 100644 --- a/sound/soc/codecs/wm8990.c +++ b/sound/soc/codecs/wm8990.c @@ -32,6 +32,8 @@ /* codec private data */ struct wm8990_priv { + enum snd_soc_control_type control_type; + void *control_data; unsigned int sysclk; unsigned int pcmclk; }; @@ -1114,8 +1116,7 @@ static int wm8990_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; u16 audio1 = snd_soc_read(codec, WM8990_AUDIO_INTERFACE_1); audio1 &= ~WM8990_AIF_WL_MASK; @@ -1293,10 +1294,9 @@ static struct snd_soc_dai_ops wm8990_dai_ops = { .set_sysclk = wm8990_set_dai_sysclk, }; -struct snd_soc_dai wm8990_dai = { +static struct snd_soc_dai_driver wm8990_dai = { /* ADC/DAC on primary */ - .name = "WM8990 ADC/DAC Primary", - .id = 1, + .name = "wm8990-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -1311,21 +1311,15 @@ struct snd_soc_dai wm8990_dai = { .formats = WM8990_FORMATS,}, .ops = &wm8990_dai_ops, }; -EXPORT_SYMBOL_GPL(wm8990_dai); -static int wm8990_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8990_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm8990_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm8990_resume(struct platform_device *pdev) +static int wm8990_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; int i; u8 data[2]; u16 *cache = codec->reg_cache; @@ -1347,38 +1341,21 @@ static int wm8990_resume(struct platform_device *pdev) * initialise the WM8990 driver * register the mixer and dsp interfaces with the kernel */ -static int wm8990_init(struct snd_soc_device *socdev) +static int wm8990_probe(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = socdev->card->codec; + struct wm8990_priv *wm8990 = snd_soc_codec_get_drvdata(codec); + int ret; u16 reg; - int ret = 0; - - codec->name = "WM8990"; - codec->owner = THIS_MODULE; - codec->set_bias_level = wm8990_set_bias_level; - codec->dai = &wm8990_dai; - codec->num_dai = 2; - codec->reg_cache_size = ARRAY_SIZE(wm8990_reg); - codec->reg_cache = kmemdup(wm8990_reg, sizeof(wm8990_reg), GFP_KERNEL); - - if (codec->reg_cache == NULL) - return -ENOMEM; + codec->control_data = wm8990->control_data; ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C); if (ret < 0) { printk(KERN_ERR "wm8990: failed to set cache I/O: %d\n", ret); - goto pcm_err; + return ret; } wm8990_reset(codec); - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - printk(KERN_ERR "wm8990: failed to create pcms\n"); - goto pcm_err; - } - /* charge output caps */ codec->bias_level = SND_SOC_BIAS_OFF; wm8990_set_bias_level(codec, SND_SOC_BIAS_STANDBY); @@ -1400,47 +1377,52 @@ static int wm8990_init(struct snd_soc_device *socdev) ARRAY_SIZE(wm8990_snd_controls)); wm8990_add_widgets(codec); - return ret; + return 0; +} -pcm_err: - kfree(codec->reg_cache); - return ret; +/* power down chip */ +static int wm8990_remove(struct snd_soc_codec *codec) +{ + wm8990_set_bias_level(codec, SND_SOC_BIAS_OFF); + return 0; } -/* If the i2c layer weren't so broken, we could pass this kind of data - around */ -static struct snd_soc_device *wm8990_socdev; +static struct snd_soc_codec_driver soc_codec_dev_wm8990 = { + .probe = wm8990_probe, + .remove = wm8990_remove, + .suspend = wm8990_suspend, + .resume = wm8990_resume, + .set_bias_level = wm8990_set_bias_level, + .reg_cache_size = ARRAY_SIZE(wm8990_reg), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8990_reg, +}; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - -/* - * WM891 2 wire address is determined by GPIO5 - * state during powerup. - * low = 0x34 - * high = 0x36 - */ - -static int wm8990_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) +static __devinit int wm8990_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) { - struct snd_soc_device *socdev = wm8990_socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct wm8990_priv *wm8990; int ret; - i2c_set_clientdata(i2c, codec); - codec->control_data = i2c; + wm8990 = kzalloc(sizeof(struct wm8990_priv), GFP_KERNEL); + if (wm8990 == NULL) + return -ENOMEM; - ret = wm8990_init(socdev); - if (ret < 0) - pr_err("failed to initialise WM8990\n"); + i2c_set_clientdata(i2c, wm8990); + wm8990->control_data = i2c; + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8990, &wm8990_dai, 1); + if (ret < 0) + kfree(wm8990); return ret; } -static int wm8990_i2c_remove(struct i2c_client *client) +static __devexit int wm8990_i2c_remove(struct i2c_client *client) { - struct snd_soc_codec *codec = i2c_get_clientdata(client); - kfree(codec->reg_cache); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -1452,134 +1434,34 @@ MODULE_DEVICE_TABLE(i2c, wm8990_i2c_id); static struct i2c_driver wm8990_i2c_driver = { .driver = { - .name = "WM8990 I2C Codec", + .name = "wm8990-codec", .owner = THIS_MODULE, }, .probe = wm8990_i2c_probe, - .remove = wm8990_i2c_remove, + .remove = __devexit_p(wm8990_i2c_remove), .id_table = wm8990_i2c_id, }; - -static int wm8990_add_i2c_device(struct platform_device *pdev, - const struct wm8990_setup_data *setup) -{ - struct i2c_board_info info; - struct i2c_adapter *adapter; - struct i2c_client *client; - int ret; - - ret = i2c_add_driver(&wm8990_i2c_driver); - if (ret != 0) { - dev_err(&pdev->dev, "can't add i2c driver\n"); - return ret; - } - - memset(&info, 0, sizeof(struct i2c_board_info)); - info.addr = setup->i2c_address; - strlcpy(info.type, "wm8990", I2C_NAME_SIZE); - - adapter = i2c_get_adapter(setup->i2c_bus); - if (!adapter) { - dev_err(&pdev->dev, "can't get i2c adapter %d\n", - setup->i2c_bus); - goto err_driver; - } - - client = i2c_new_device(adapter, &info); - i2c_put_adapter(adapter); - if (!client) { - dev_err(&pdev->dev, "can't add i2c device at 0x%x\n", - (unsigned int)info.addr); - goto err_driver; - } - - return 0; - -err_driver: - i2c_del_driver(&wm8990_i2c_driver); - return -ENODEV; -} #endif -static int wm8990_probe(struct platform_device *pdev) +static int __init wm8990_modinit(void) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct wm8990_setup_data *setup; - struct snd_soc_codec *codec; - struct wm8990_priv *wm8990; - int ret; - - setup = socdev->codec_data; - codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); - if (codec == NULL) - return -ENOMEM; - - wm8990 = kzalloc(sizeof(struct wm8990_priv), GFP_KERNEL); - if (wm8990 == NULL) { - kfree(codec); - return -ENOMEM; - } - - snd_soc_codec_set_drvdata(codec, wm8990); - socdev->card->codec = codec; - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - wm8990_socdev = socdev; - - ret = -ENODEV; - + int ret = 0; #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - if (setup->i2c_address) { - codec->hw_write = (hw_write_t)i2c_master_send; - ret = wm8990_add_i2c_device(pdev, setup); - } -#endif - + ret = i2c_add_driver(&wm8990_i2c_driver); if (ret != 0) { - kfree(snd_soc_codec_get_drvdata(codec)); - kfree(codec); + printk(KERN_ERR "Failed to register wm8990 I2C driver: %d\n", + ret); } +#endif return ret; } +module_init(wm8990_modinit); -/* power down chip */ -static int wm8990_remove(struct platform_device *pdev) +static void __exit wm8990_exit(void) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - if (codec->control_data) - wm8990_set_bias_level(codec, SND_SOC_BIAS_OFF); - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) - i2c_unregister_device(codec->control_data); i2c_del_driver(&wm8990_i2c_driver); #endif - kfree(snd_soc_codec_get_drvdata(codec)); - kfree(codec); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8990 = { - .probe = wm8990_probe, - .remove = wm8990_remove, - .suspend = wm8990_suspend, - .resume = wm8990_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8990); - -static int __init wm8990_modinit(void) -{ - return snd_soc_register_dai(&wm8990_dai); -} -module_init(wm8990_modinit); - -static void __exit wm8990_exit(void) -{ - snd_soc_unregister_dai(&wm8990_dai); } module_exit(wm8990_exit); diff --git a/sound/soc/codecs/wm8990.h b/sound/soc/codecs/wm8990.h index 7114ddc88b4b..77c98a4bfe9c 100644 --- a/sound/soc/codecs/wm8990.h +++ b/sound/soc/codecs/wm8990.h @@ -826,18 +826,10 @@ #define WM8990_INMIXR_PWR_BIT 2 #define WM8990_AINRMUX_PWR_BIT 3 -struct wm8990_setup_data { - unsigned i2c_bus; - unsigned short i2c_address; -}; - #define WM8990_MCLK_DIV 0 #define WM8990_DACCLK_DIV 1 #define WM8990_ADCCLK_DIV 2 #define WM8990_BCLK_DIV 3 -extern struct snd_soc_dai wm8990_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8990; - #endif /* __WM8990REGISTERDEFS_H__ */ /*------------------------------ END OF FILE ---------------------------------*/ diff --git a/sound/soc/codecs/wm8993.c b/sound/soc/codecs/wm8993.c index d8d300c6175f..1d9e1837a2df 100644 --- a/sound/soc/codecs/wm8993.c +++ b/sound/soc/codecs/wm8993.c @@ -229,7 +229,8 @@ struct wm8993_priv { u16 reg_cache[WM8993_REGISTER_COUNT]; struct regulator_bulk_data supplies[WM8993_NUM_SUPPLIES]; struct wm8993_platform_data pdata; - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; int master; int sysclk_source; int tdm_slots; @@ -367,10 +368,9 @@ static int fll_factors(struct _fll_div *fll_div, unsigned int Fref, return 0; } -static int wm8993_set_fll(struct snd_soc_dai *dai, int fll_id, int source, +static int _wm8993_set_fll(struct snd_soc_codec *codec, int fll_id, int source, unsigned int Fref, unsigned int Fout) { - struct snd_soc_codec *codec = dai->codec; struct wm8993_priv *wm8993 = snd_soc_codec_get_drvdata(codec); u16 reg1, reg4, reg5; struct _fll_div fll_div; @@ -456,6 +456,12 @@ static int wm8993_set_fll(struct snd_soc_dai *dai, int fll_id, int source, return 0; } +static int wm8993_set_fll(struct snd_soc_dai *dai, int fll_id, int source, + unsigned int Fref, unsigned int Fout) +{ + return _wm8993_set_fll(dai->codec, fll_id, source, Fref, Fout); +} + static int configure_clock(struct snd_soc_codec *codec) { struct wm8993_priv *wm8993 = snd_soc_codec_get_drvdata(codec); @@ -1394,8 +1400,8 @@ static struct snd_soc_dai_ops wm8993_ops = { SNDRV_PCM_FMTBIT_S24_LE |\ SNDRV_PCM_FMTBIT_S32_LE) -struct snd_soc_dai wm8993_dai = { - .name = "WM8993", +static struct snd_soc_dai_driver wm8993_dai = { + .name = "wm8993-hifi", .playback = { .stream_name = "Playback", .channels_min = 1, @@ -1413,32 +1419,82 @@ struct snd_soc_dai wm8993_dai = { .ops = &wm8993_ops, .symmetric_rates = 1, }; -EXPORT_SYMBOL_GPL(wm8993_dai); - -static struct snd_soc_codec *wm8993_codec; -static int wm8993_probe(struct platform_device *pdev) +static int wm8993_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - struct wm8993_priv *wm8993; - int ret = 0; + struct wm8993_priv *wm8993 = snd_soc_codec_get_drvdata(codec); + int ret, i, val; + + codec->control_data = wm8993->control_data; + wm8993->hubs_data.hp_startup_mode = 1; + wm8993->hubs_data.dcs_codes = -2; + + ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C); + if (ret != 0) { + dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); + return ret; + } + + for (i = 0; i < ARRAY_SIZE(wm8993->supplies); i++) + wm8993->supplies[i].supply = wm8993_supply_names[i]; - if (!wm8993_codec) { - dev_err(&pdev->dev, "I2C device not yet probed\n"); - goto err; + ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8993->supplies), + wm8993->supplies); + if (ret != 0) { + dev_err(codec->dev, "Failed to request supplies: %d\n", ret); + return ret; } - socdev->card->codec = wm8993_codec; - codec = wm8993_codec; - wm8993 = snd_soc_codec_get_drvdata(codec); + ret = regulator_bulk_enable(ARRAY_SIZE(wm8993->supplies), + wm8993->supplies); + if (ret != 0) { + dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); + goto err_get; + } - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms\n"); - goto err; + val = snd_soc_read(codec, WM8993_SOFTWARE_RESET); + if (val != wm8993_reg_defaults[WM8993_SOFTWARE_RESET]) { + dev_err(codec->dev, "Invalid ID register value %x\n", val); + ret = -EINVAL; + goto err_enable; } + ret = snd_soc_write(codec, WM8993_SOFTWARE_RESET, 0xffff); + if (ret != 0) + goto err_enable; + + codec->cache_only = 1; + + /* By default we're using the output mixers */ + wm8993->class_w_users = 2; + + /* Latch volume update bits and default ZC on */ + snd_soc_update_bits(codec, WM8993_RIGHT_DAC_DIGITAL_VOLUME, + WM8993_DAC_VU, WM8993_DAC_VU); + snd_soc_update_bits(codec, WM8993_RIGHT_ADC_DIGITAL_VOLUME, + WM8993_ADC_VU, WM8993_ADC_VU); + + /* Manualy manage the HPOUT sequencing for independent stereo + * control. */ + snd_soc_update_bits(codec, WM8993_ANALOGUE_HP_0, + WM8993_HPOUT1_AUTO_PU, 0); + + /* Use automatic clock configuration */ + snd_soc_update_bits(codec, WM8993_CLOCKING_4, WM8993_SR_MODE, 0); + + wm_hubs_handle_analogue_pdata(codec, wm8993->pdata.lineout1_diff, + wm8993->pdata.lineout2_diff, + wm8993->pdata.lineout1fb, + wm8993->pdata.lineout2fb, + wm8993->pdata.jd_scthr, + wm8993->pdata.jd_thr, + wm8993->pdata.micbias1_lvl, + wm8993->pdata.micbias2_lvl); + + ret = wm8993_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + if (ret != 0) + goto err_enable; + snd_soc_add_controls(codec, wm8993_snd_controls, ARRAY_SIZE(wm8993_snd_controls)); if (wm8993->pdata.num_retune_configs != 0) { @@ -1457,36 +1513,36 @@ static int wm8993_probe(struct platform_device *pdev) wm_hubs_add_analogue_routes(codec, wm8993->pdata.lineout1_diff, wm8993->pdata.lineout2_diff); - return ret; + return 0; -err: +err_enable: + regulator_bulk_disable(ARRAY_SIZE(wm8993->supplies), wm8993->supplies); +err_get: + regulator_bulk_free(ARRAY_SIZE(wm8993->supplies), wm8993->supplies); return ret; } -static int wm8993_remove(struct platform_device *pdev) +static int wm8993_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); + struct wm8993_priv *wm8993 = snd_soc_codec_get_drvdata(codec); + wm8993_set_bias_level(codec, SND_SOC_BIAS_OFF); + regulator_bulk_free(ARRAY_SIZE(wm8993->supplies), wm8993->supplies); return 0; } #ifdef CONFIG_PM -static int wm8993_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8993_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; struct wm8993_priv *wm8993 = snd_soc_codec_get_drvdata(codec); int fll_fout = wm8993->fll_fout; int fll_fref = wm8993->fll_fref; int ret; /* Stop the FLL in an orderly fashion */ - ret = wm8993_set_fll(codec->dai, 0, 0, 0, 0); + ret = _wm8993_set_fll(codec, 0, 0, 0, 0); if (ret != 0) { - dev_err(&pdev->dev, "Failed to stop FLL\n"); + dev_err(codec->dev, "Failed to stop FLL\n"); return ret; } @@ -1498,10 +1554,8 @@ static int wm8993_suspend(struct platform_device *pdev, pm_message_t state) return 0; } -static int wm8993_resume(struct platform_device *pdev) +static int wm8993_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; struct wm8993_priv *wm8993 = snd_soc_codec_get_drvdata(codec); int ret; @@ -1515,7 +1569,7 @@ static int wm8993_resume(struct platform_device *pdev) wm8993->fll_fref = 0; wm8993->fll_fout = 0; - ret = wm8993_set_fll(codec->dai, 0, wm8993->fll_src, + ret = _wm8993_set_fll(codec, 0, wm8993->fll_src, fll_fref, fll_fout); if (ret != 0) dev_err(codec->dev, "Failed to restart FLL\n"); @@ -1528,162 +1582,43 @@ static int wm8993_resume(struct platform_device *pdev) #define wm8993_resume NULL #endif -struct snd_soc_codec_device soc_codec_dev_wm8993 = { +static struct snd_soc_codec_driver soc_codec_dev_wm8993 = { .probe = wm8993_probe, .remove = wm8993_remove, .suspend = wm8993_suspend, .resume = wm8993_resume, + .set_bias_level = wm8993_set_bias_level, + .reg_cache_size = sizeof(wm8993_reg_defaults), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8993_reg_defaults, + .volatile_register = wm8993_volatile, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8993); -static int wm8993_i2c_probe(struct i2c_client *i2c, - const struct i2c_device_id *id) +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +static __devinit int wm8993_i2c_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) { struct wm8993_priv *wm8993; - struct snd_soc_codec *codec; - unsigned int val; int ret; - int i; - - if (wm8993_codec) { - dev_err(&i2c->dev, "A WM8993 is already registered\n"); - return -EINVAL; - } wm8993 = kzalloc(sizeof(struct wm8993_priv), GFP_KERNEL); if (wm8993 == NULL) return -ENOMEM; - codec = &wm8993->codec; - if (i2c->dev.platform_data) - memcpy(&wm8993->pdata, i2c->dev.platform_data, - sizeof(wm8993->pdata)); - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - codec->name = "WM8993"; - codec->volatile_register = wm8993_volatile; - codec->reg_cache = wm8993->reg_cache; - codec->reg_cache_size = ARRAY_SIZE(wm8993->reg_cache); - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8993_set_bias_level; - codec->dai = &wm8993_dai; - codec->num_dai = 1; - snd_soc_codec_set_drvdata(codec, wm8993); - - wm8993->hubs_data.hp_startup_mode = 1; - wm8993->hubs_data.dcs_codes = -2; - - memcpy(wm8993->reg_cache, wm8993_reg_defaults, - sizeof(wm8993->reg_cache)); - - ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C); - if (ret != 0) { - dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; - } - i2c_set_clientdata(i2c, wm8993); - codec->control_data = i2c; - wm8993_codec = codec; - - codec->dev = &i2c->dev; - - for (i = 0; i < ARRAY_SIZE(wm8993->supplies); i++) - wm8993->supplies[i].supply = wm8993_supply_names[i]; - - ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8993->supplies), - wm8993->supplies); - if (ret != 0) { - dev_err(codec->dev, "Failed to request supplies: %d\n", ret); - goto err; - } - - ret = regulator_bulk_enable(ARRAY_SIZE(wm8993->supplies), - wm8993->supplies); - if (ret != 0) { - dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); - goto err_get; - } - - val = snd_soc_read(codec, WM8993_SOFTWARE_RESET); - if (val != wm8993_reg_defaults[WM8993_SOFTWARE_RESET]) { - dev_err(codec->dev, "Invalid ID register value %x\n", val); - ret = -EINVAL; - goto err_enable; - } - - ret = snd_soc_write(codec, WM8993_SOFTWARE_RESET, 0xffff); - if (ret != 0) - goto err_enable; - - codec->cache_only = 1; - - /* By default we're using the output mixers */ - wm8993->class_w_users = 2; - - /* Latch volume update bits and default ZC on */ - snd_soc_update_bits(codec, WM8993_RIGHT_DAC_DIGITAL_VOLUME, - WM8993_DAC_VU, WM8993_DAC_VU); - snd_soc_update_bits(codec, WM8993_RIGHT_ADC_DIGITAL_VOLUME, - WM8993_ADC_VU, WM8993_ADC_VU); + wm8993->control_data = i2c; - /* Manualy manage the HPOUT sequencing for independent stereo - * control. */ - snd_soc_update_bits(codec, WM8993_ANALOGUE_HP_0, - WM8993_HPOUT1_AUTO_PU, 0); - - /* Use automatic clock configuration */ - snd_soc_update_bits(codec, WM8993_CLOCKING_4, WM8993_SR_MODE, 0); - - wm_hubs_handle_analogue_pdata(codec, wm8993->pdata.lineout1_diff, - wm8993->pdata.lineout2_diff, - wm8993->pdata.lineout1fb, - wm8993->pdata.lineout2fb, - wm8993->pdata.jd_scthr, - wm8993->pdata.jd_thr, - wm8993->pdata.micbias1_lvl, - wm8993->pdata.micbias2_lvl); - - ret = wm8993_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - if (ret != 0) - goto err_enable; - - wm8993_dai.dev = codec->dev; - - ret = snd_soc_register_dai(&wm8993_dai); - if (ret != 0) - goto err_bias; - - ret = snd_soc_register_codec(codec); - - return 0; - -err_bias: - wm8993_set_bias_level(codec, SND_SOC_BIAS_OFF); -err_enable: - regulator_bulk_disable(ARRAY_SIZE(wm8993->supplies), wm8993->supplies); -err_get: - regulator_bulk_free(ARRAY_SIZE(wm8993->supplies), wm8993->supplies); -err: - wm8993_codec = NULL; - kfree(wm8993); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8993, &wm8993_dai, 1); + if (ret < 0) + kfree(wm8993); return ret; } -static int wm8993_i2c_remove(struct i2c_client *client) +static __devexit int wm8993_i2c_remove(struct i2c_client *client) { - struct wm8993_priv *wm8993 = i2c_get_clientdata(client); - - snd_soc_unregister_codec(&wm8993->codec); - snd_soc_unregister_dai(&wm8993_dai); - - wm8993_set_bias_level(&wm8993->codec, SND_SOC_BIAS_OFF); - regulator_bulk_free(ARRAY_SIZE(wm8993->supplies), wm8993->supplies); - kfree(wm8993); - + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -1695,30 +1630,34 @@ MODULE_DEVICE_TABLE(i2c, wm8993_i2c_id); static struct i2c_driver wm8993_i2c_driver = { .driver = { - .name = "WM8993", + .name = "wm8993-codec", .owner = THIS_MODULE, }, - .probe = wm8993_i2c_probe, - .remove = wm8993_i2c_remove, + .probe = wm8993_i2c_probe, + .remove = __devexit_p(wm8993_i2c_remove), .id_table = wm8993_i2c_id, }; - +#endif static int __init wm8993_modinit(void) { - int ret; - + int ret = 0; +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ret = i2c_add_driver(&wm8993_i2c_driver); - if (ret != 0) - pr_err("WM8993: Unable to register I2C driver: %d\n", ret); - + if (ret != 0) { + pr_err("WM8993: Unable to register I2C driver: %d\n", + ret); + } +#endif return ret; } module_init(wm8993_modinit); static void __exit wm8993_exit(void) { +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) i2c_del_driver(&wm8993_i2c_driver); +#endif } module_exit(wm8993_exit); diff --git a/sound/soc/codecs/wm8993.h b/sound/soc/codecs/wm8993.h index 30e71ca88dad..2184617b9611 100644 --- a/sound/soc/codecs/wm8993.h +++ b/sound/soc/codecs/wm8993.h @@ -1,9 +1,6 @@ #ifndef WM8993_H #define WM8993_H -extern struct snd_soc_dai wm8993_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8993; - #define WM8993_SYSCLK_MCLK 1 #define WM8993_SYSCLK_FLL 2 diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index a87046a96f2a..7823f92413f3 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -36,9 +36,6 @@ #include "wm8994.h" #include "wm_hubs.h" -static struct snd_soc_codec *wm8994_codec; -struct snd_soc_codec_device soc_codec_dev_wm8994; - struct fll_config { int src; int in; @@ -71,7 +68,9 @@ struct wm8994_micdet { /* codec private data */ struct wm8994_priv { struct wm_hubs_data hubs; - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; + struct snd_soc_codec *codec; u16 reg_cache[WM8994_REG_CACHE_SIZE + 1]; int sysclk[2]; int sysclk_rate[2]; @@ -1901,8 +1900,6 @@ static int wm8994_put_drc_sw(struct snd_kcontrol *kcontrol, return snd_soc_put_volsw(kcontrol, ucontrol); } - - static void wm8994_set_drc(struct snd_soc_codec *codec, int drc) { struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); @@ -1941,7 +1938,7 @@ static int wm8994_put_drc_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); - struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); + struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); struct wm8994_pdata *pdata = wm8994->pdata; int drc = wm8994_get_drc(kcontrol->id.name); int value = ucontrol->value.integer.value[0]; @@ -2044,7 +2041,7 @@ static int wm8994_put_retune_mobile_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); - struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); + struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); struct wm8994_pdata *pdata = wm8994->pdata; int block = wm8994_get_retune_mobile_block(kcontrol->id.name); int value = ucontrol->value.integer.value[0]; @@ -2066,7 +2063,7 @@ static int wm8994_get_retune_mobile_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); - struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); + struct wm8994_priv *wm8994 =snd_soc_codec_get_drvdata(codec); int block = wm8994_get_retune_mobile_block(kcontrol->id.name); ucontrol->value.enumerated.item[0] = wm8994->retune_mobile_cfg[block]; @@ -2880,10 +2877,9 @@ static int wm8994_get_fll_config(struct fll_div *fll, return 0; } -static int wm8994_set_fll(struct snd_soc_dai *dai, int id, int src, +static int _wm8994_set_fll(struct snd_soc_codec *codec, int id, int src, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_codec *codec = dai->codec; struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); int reg_offset, ret; struct fll_div fll; @@ -2994,8 +2990,15 @@ static int wm8994_set_fll(struct snd_soc_dai *dai, int id, int src, return 0; } + static int opclk_divs[] = { 10, 20, 30, 40, 55, 60, 80, 120, 160 }; +static int wm8994_set_fll(struct snd_soc_dai *dai, int id, int src, + unsigned int freq_in, unsigned int freq_out) +{ + return _wm8994_set_fll(dai->codec, id, src, freq_in, freq_out); +} + static int wm8994_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { @@ -3507,10 +3510,9 @@ static struct snd_soc_dai_ops wm8994_aif3_dai_ops = { .set_tristate = wm8994_set_tristate, }; -struct snd_soc_dai wm8994_dai[] = { +static struct snd_soc_dai_driver wm8994_dai[] = { { - .name = "WM8994 AIF1", - .id = 1, + .name = "wm8994-aif1", .playback = { .stream_name = "AIF1 Playback", .channels_min = 2, @@ -3528,8 +3530,7 @@ struct snd_soc_dai wm8994_dai[] = { .ops = &wm8994_aif1_dai_ops, }, { - .name = "WM8994 AIF2", - .id = 2, + .name = "wm8994-aif2", .playback = { .stream_name = "AIF2 Playback", .channels_min = 2, @@ -3547,8 +3548,7 @@ struct snd_soc_dai wm8994_dai[] = { .ops = &wm8994_aif2_dai_ops, }, { - .name = "WM8994 AIF3", - .id = 3, + .name = "wm8994-aif3", .playback = { .stream_name = "AIF3 Playback", .channels_min = 2, @@ -3566,20 +3566,17 @@ struct snd_soc_dai wm8994_dai[] = { .ops = &wm8994_aif3_dai_ops, } }; -EXPORT_SYMBOL_GPL(wm8994_dai); #ifdef CONFIG_PM -static int wm8994_suspend(struct platform_device *pdev, pm_message_t state) +static int wm8994_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); int i, ret; for (i = 0; i < ARRAY_SIZE(wm8994->fll); i++) { memcpy(&wm8994->fll_suspend[i], &wm8994->fll[i], sizeof(struct fll_config)); - ret = wm8994_set_fll(&codec->dai[0], i + 1, 0, 0, 0); + ret = _wm8994_set_fll(codec, i + 1, 0, 0, 0); if (ret < 0) dev_warn(codec->dev, "Failed to stop FLL%d: %d\n", i + 1, ret); @@ -3590,10 +3587,8 @@ static int wm8994_suspend(struct platform_device *pdev, pm_message_t state) return 0; } -static int wm8994_resume(struct platform_device *pdev) +static int wm8994_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); u16 *reg_cache = codec->reg_cache; int i, ret; @@ -3622,7 +3617,7 @@ static int wm8994_resume(struct platform_device *pdev) if (!wm8994->fll_suspend[i].out) continue; - ret = wm8994_set_fll(&codec->dai[0], i + 1, + ret = _wm8994_set_fll(codec, i + 1, wm8994->fll_suspend[i].src, wm8994->fll_suspend[i].in, wm8994->fll_suspend[i].out); @@ -3640,7 +3635,7 @@ static int wm8994_resume(struct platform_device *pdev) static void wm8994_handle_retune_mobile_pdata(struct wm8994_priv *wm8994) { - struct snd_soc_codec *codec = &wm8994->codec; + struct snd_soc_codec *codec = wm8994->codec; struct wm8994_pdata *pdata = wm8994->pdata; struct snd_kcontrol_new controls[] = { SOC_ENUM_EXT("AIF1.1 EQ Mode", @@ -3698,16 +3693,16 @@ static void wm8994_handle_retune_mobile_pdata(struct wm8994_priv *wm8994) wm8994->retune_mobile_enum.max = wm8994->num_retune_mobile_texts; wm8994->retune_mobile_enum.texts = wm8994->retune_mobile_texts; - ret = snd_soc_add_controls(&wm8994->codec, controls, + ret = snd_soc_add_controls(wm8994->codec, controls, ARRAY_SIZE(controls)); if (ret != 0) - dev_err(wm8994->codec.dev, + dev_err(wm8994->codec->dev, "Failed to add ReTune Mobile controls: %d\n", ret); } static void wm8994_handle_pdata(struct wm8994_priv *wm8994) { - struct snd_soc_codec *codec = &wm8994->codec; + struct snd_soc_codec *codec = wm8994->codec; struct wm8994_pdata *pdata = wm8994->pdata; int ret, i; @@ -3739,7 +3734,7 @@ static void wm8994_handle_pdata(struct wm8994_priv *wm8994) wm8994->drc_texts = kmalloc(sizeof(char *) * pdata->num_drc_cfgs, GFP_KERNEL); if (!wm8994->drc_texts) { - dev_err(wm8994->codec.dev, + dev_err(wm8994->codec->dev, "Failed to allocate %d DRC config texts\n", pdata->num_drc_cfgs); return; @@ -3751,10 +3746,10 @@ static void wm8994_handle_pdata(struct wm8994_priv *wm8994) wm8994->drc_enum.max = pdata->num_drc_cfgs; wm8994->drc_enum.texts = wm8994->drc_texts; - ret = snd_soc_add_controls(&wm8994->codec, controls, + ret = snd_soc_add_controls(wm8994->codec, controls, ARRAY_SIZE(controls)); if (ret != 0) - dev_err(wm8994->codec.dev, + dev_err(wm8994->codec->dev, "Failed to add DRC mode controls: %d\n", ret); for (i = 0; i < WM8994_NUM_DRC; i++) @@ -3767,62 +3762,10 @@ static void wm8994_handle_pdata(struct wm8994_priv *wm8994) if (pdata->num_retune_mobile_cfgs) wm8994_handle_retune_mobile_pdata(wm8994); else - snd_soc_add_controls(&wm8994->codec, wm8994_eq_controls, + snd_soc_add_controls(wm8994->codec, wm8994_eq_controls, ARRAY_SIZE(wm8994_eq_controls)); } -static int wm8994_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - if (wm8994_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = wm8994_codec; - codec = wm8994_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - return ret; - } - - wm8994_handle_pdata(snd_soc_codec_get_drvdata(codec)); - - wm_hubs_add_analogue_controls(codec); - snd_soc_add_controls(codec, wm8994_snd_controls, - ARRAY_SIZE(wm8994_snd_controls)); - snd_soc_dapm_new_controls(codec, wm8994_dapm_widgets, - ARRAY_SIZE(wm8994_dapm_widgets)); - wm_hubs_add_analogue_routes(codec, 0, 0); - snd_soc_dapm_add_routes(codec, intercon, ARRAY_SIZE(intercon)); - - return 0; -} - -static int wm8994_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} - -struct snd_soc_codec_device soc_codec_dev_wm8994 = { - .probe = wm8994_probe, - .remove = wm8994_remove, - .suspend = wm8994_suspend, - .resume = wm8994_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8994); - /** * wm8994_mic_detect - Enable microphone detection via the WM8994 IRQ * @@ -3881,7 +3824,7 @@ EXPORT_SYMBOL_GPL(wm8994_mic_detect); static irqreturn_t wm8994_mic_irq(int irq, void *data) { struct wm8994_priv *priv = data; - struct snd_soc_codec *codec = &priv->codec; + struct snd_soc_codec *codec = priv->codec; int reg; int report; @@ -3913,47 +3856,20 @@ static irqreturn_t wm8994_mic_irq(int irq, void *data) return IRQ_HANDLED; } -static int wm8994_codec_probe(struct platform_device *pdev) +static int wm8994_codec_probe(struct snd_soc_codec *codec) { - int ret; struct wm8994_priv *wm8994; - struct snd_soc_codec *codec; - int i; - u16 rev; + int ret, i, rev; - if (wm8994_codec) { - dev_err(&pdev->dev, "Another WM8994 is registered\n"); - return -EINVAL; - } + codec->control_data = dev_get_drvdata(codec->dev->parent); wm8994 = kzalloc(sizeof(struct wm8994_priv), GFP_KERNEL); - if (!wm8994) { - dev_err(&pdev->dev, "Failed to allocate private data\n"); + if (wm8994 == NULL) return -ENOMEM; - } - - codec = &wm8994->codec; - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - snd_soc_codec_set_drvdata(codec, wm8994); - codec->control_data = dev_get_drvdata(pdev->dev.parent); - codec->name = "WM8994"; - codec->owner = THIS_MODULE; - codec->read = wm8994_read; - codec->write = wm8994_write; - codec->readable_register = wm8994_readable; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8994_set_bias_level; - codec->dai = &wm8994_dai[0]; - codec->num_dai = 3; - codec->reg_cache_size = WM8994_MAX_REGISTER; - codec->reg_cache = &wm8994->reg_cache; - codec->dev = &pdev->dev; - - wm8994->pdata = pdev->dev.parent->platform_data; + + wm8994->pdata = dev_get_platdata(codec->dev->parent); + wm8994->codec = codec; /* Fill the cache with physical values we inherited; don't reset */ ret = wm8994_bulk_read(codec->control_data, 0, @@ -3989,25 +3905,25 @@ static int wm8994_codec_probe(struct platform_device *pdev) ret = wm8994_request_irq(codec->control_data, WM8994_IRQ_MIC1_DET, wm8994_mic_irq, "Mic 1 detect", wm8994); if (ret != 0) - dev_warn(&pdev->dev, + dev_warn(codec->dev, "Failed to request Mic1 detect IRQ: %d\n", ret); ret = wm8994_request_irq(codec->control_data, WM8994_IRQ_MIC1_SHRT, wm8994_mic_irq, "Mic 1 short", wm8994); if (ret != 0) - dev_warn(&pdev->dev, + dev_warn(codec->dev, "Failed to request Mic1 short IRQ: %d\n", ret); ret = wm8994_request_irq(codec->control_data, WM8994_IRQ_MIC2_DET, wm8994_mic_irq, "Mic 2 detect", wm8994); if (ret != 0) - dev_warn(&pdev->dev, + dev_warn(codec->dev, "Failed to request Mic2 detect IRQ: %d\n", ret); ret = wm8994_request_irq(codec->control_data, WM8994_IRQ_MIC2_SHRT, wm8994_mic_irq, "Mic 2 short", wm8994); if (ret != 0) - dev_warn(&pdev->dev, + dev_warn(codec->dev, "Failed to request Mic2 short IRQ: %d\n", ret); /* Remember if AIFnLRCLK is configured as a GPIO. This should be @@ -4038,13 +3954,8 @@ static int wm8994_codec_probe(struct platform_device *pdev) wm8994->lrclk_shared[1] = 0; } - for (i = 0; i < ARRAY_SIZE(wm8994_dai); i++) - wm8994_dai[i].dev = codec->dev; - wm8994_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - wm8994_codec = codec; - /* Latch volume updates (right only; we always do left then right). */ snd_soc_update_bits(codec, WM8994_AIF1_DAC1_RIGHT_VOLUME, WM8994_AIF1DAC1_VU, WM8994_AIF1DAC1_VU); @@ -4081,24 +3992,18 @@ static int wm8994_codec_probe(struct platform_device *pdev) wm8994_update_class_w(codec); - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err_irq; - } - - ret = snd_soc_register_dais(wm8994_dai, ARRAY_SIZE(wm8994_dai)); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAIs: %d\n", ret); - goto err_codec; - } + wm8994_handle_pdata(wm8994); - platform_set_drvdata(pdev, wm8994); + wm_hubs_add_analogue_controls(codec); + snd_soc_add_controls(codec, wm8994_snd_controls, + ARRAY_SIZE(wm8994_snd_controls)); + snd_soc_dapm_new_controls(codec, wm8994_dapm_widgets, + ARRAY_SIZE(wm8994_dapm_widgets)); + wm_hubs_add_analogue_routes(codec, 0, 0); + snd_soc_dapm_add_routes(codec, intercon, ARRAY_SIZE(intercon)); return 0; -err_codec: - snd_soc_unregister_codec(codec); err_irq: wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_SHRT, wm8994); wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_DET, wm8994); @@ -4109,31 +4014,50 @@ err: return ret; } -static int __devexit wm8994_codec_remove(struct platform_device *pdev) +static int wm8994_codec_remove(struct snd_soc_codec *codec) { - struct wm8994_priv *wm8994 = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = &wm8994->codec; + struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); wm8994_set_bias_level(codec, SND_SOC_BIAS_OFF); - snd_soc_unregister_dais(wm8994_dai, ARRAY_SIZE(wm8994_dai)); - snd_soc_unregister_codec(&wm8994->codec); + wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_SHRT, wm8994); wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC2_DET, wm8994); wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC1_SHRT, wm8994); wm8994_free_irq(codec->control_data, WM8994_IRQ_MIC1_DET, wm8994); kfree(wm8994); - wm8994_codec = NULL; return 0; } +static struct snd_soc_codec_driver soc_codec_dev_wm8994 = { + .probe = wm8994_codec_probe, + .remove = wm8994_codec_remove, + .suspend = wm8994_suspend, + .resume = wm8994_resume, + .read = wm8994_read, + .write = wm8994_write, + .set_bias_level = wm8994_set_bias_level, +}; + +static int __devinit wm8994_probe(struct platform_device *pdev) +{ + return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8994, + wm8994_dai, ARRAY_SIZE(wm8994_dai)); +} + +static int __devexit wm8994_remove(struct platform_device *pdev) +{ + snd_soc_unregister_codec(&pdev->dev); + return 0; +} + static struct platform_driver wm8994_codec_driver = { .driver = { .name = "wm8994-codec", .owner = THIS_MODULE, }, - .probe = wm8994_codec_probe, - .remove = __devexit_p(wm8994_codec_remove), + .probe = wm8994_probe, + .remove = __devexit_p(wm8994_remove), }; static __init int wm8994_init(void) diff --git a/sound/soc/codecs/wm8994.h b/sound/soc/codecs/wm8994.h index 2e0ca67a8df7..d8dce260c430 100644 --- a/sound/soc/codecs/wm8994.h +++ b/sound/soc/codecs/wm8994.h @@ -11,9 +11,6 @@ #include -extern struct snd_soc_codec_device soc_codec_dev_wm8994; -extern struct snd_soc_dai wm8994_dai[]; - /* Sources for AIF1/2 SYSCLK - use with set_dai_sysclk() */ #define WM8994_SYSCLK_MCLK1 1 #define WM8994_SYSCLK_MCLK2 2 diff --git a/sound/soc/codecs/wm9081.c b/sound/soc/codecs/wm9081.c index 76b37ff6c264..00249d5b6793 100644 --- a/sound/soc/codecs/wm9081.c +++ b/sound/soc/codecs/wm9081.c @@ -156,7 +156,8 @@ static struct { }; struct wm9081_priv { - struct snd_soc_codec codec; + enum snd_soc_control_type control_type; + void *control_data; u16 reg_cache[WM9081_MAX_REGISTER + 1]; int sysclk_source; int mclk_rate; @@ -1212,8 +1213,8 @@ static struct snd_soc_dai_ops wm9081_dai_ops = { /* We report two channels because the CODEC processes a stereo signal, even * though it is only capable of handling a mono output. */ -struct snd_soc_dai wm9081_dai = { - .name = "WM9081", +static struct snd_soc_dai_driver wm9081_dai = { + .name = "wm9081-hifi", .playback = { .stream_name = "HiFi Playback", .channels_min = 1, @@ -1223,34 +1224,42 @@ struct snd_soc_dai wm9081_dai = { }, .ops = &wm9081_dai_ops, }; -EXPORT_SYMBOL_GPL(wm9081_dai); - -static struct snd_soc_codec *wm9081_codec; - -static int wm9081_probe(struct platform_device *pdev) +static int wm9081_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - struct wm9081_priv *wm9081; - int ret = 0; + struct wm9081_priv *wm9081 = snd_soc_codec_get_drvdata(codec); + int ret; + u16 reg; - if (wm9081_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; + codec->control_data = wm9081->control_data; + ret = snd_soc_codec_set_cache_io(codec, 8, 16, wm9081->control_type); + if (ret != 0) { + dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); + return ret; } - socdev->card->codec = wm9081_codec; - codec = wm9081_codec; - wm9081 = snd_soc_codec_get_drvdata(codec); + reg = snd_soc_read(codec, WM9081_SOFTWARE_RESET); + if (reg != 0x9081) { + dev_err(codec->dev, "Device is not a WM9081: ID=0x%x\n", reg); + ret = -EINVAL; + return ret; + } - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); + ret = wm9081_reset(codec); if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; + dev_err(codec->dev, "Failed to issue reset\n"); + return ret; } + wm9081_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + + /* Enable zero cross by default */ + reg = snd_soc_read(codec, WM9081_ANALOGUE_LINEOUT); + snd_soc_write(codec, WM9081_ANALOGUE_LINEOUT, reg | WM9081_LINEOUTZC); + reg = snd_soc_read(codec, WM9081_ANALOGUE_SPEAKER_PGA); + snd_soc_write(codec, WM9081_ANALOGUE_SPEAKER_PGA, + reg | WM9081_SPKPGAZC); + snd_soc_add_controls(codec, wm9081_snd_controls, ARRAY_SIZE(wm9081_snd_controls)); if (!wm9081->retune) { @@ -1265,40 +1274,28 @@ static int wm9081_probe(struct platform_device *pdev) snd_soc_dapm_add_routes(codec, audio_paths, ARRAY_SIZE(audio_paths)); return ret; - -pcm_err: - return ret; } -static int wm9081_remove(struct platform_device *pdev) +static int wm9081_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - + wm9081_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } #ifdef CONFIG_PM -static int wm9081_suspend(struct platform_device *pdev, pm_message_t state) +static int wm9081_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm9081_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm9081_resume(struct platform_device *pdev) +static int wm9081_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; u16 *reg_cache = codec->reg_cache; int i; - for (i = 0; i < codec->reg_cache_size; i++) { + for (i = 0; i < codec->driver->reg_cache_size; i++) { if (i == WM9081_SOFTWARE_RESET) continue; @@ -1314,133 +1311,43 @@ static int wm9081_resume(struct platform_device *pdev) #define wm9081_resume NULL #endif -struct snd_soc_codec_device soc_codec_dev_wm9081 = { +static struct snd_soc_codec_driver soc_codec_dev_wm9081 = { .probe = wm9081_probe, .remove = wm9081_remove, .suspend = wm9081_suspend, .resume = wm9081_resume, + .set_bias_level = wm9081_set_bias_level, + .reg_cache_size = sizeof(wm9081_reg_defaults), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm9081_reg_defaults, + .volatile_register = wm9081_volatile_register, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm9081); - -static int wm9081_register(struct wm9081_priv *wm9081, - enum snd_soc_control_type control) -{ - struct snd_soc_codec *codec = &wm9081->codec; - int ret; - u16 reg; - - if (wm9081_codec) { - dev_err(codec->dev, "Another WM9081 is registered\n"); - ret = -EINVAL; - goto err; - } - - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, wm9081); - codec->name = "WM9081"; - codec->owner = THIS_MODULE; - codec->dai = &wm9081_dai; - codec->num_dai = 1; - codec->reg_cache_size = ARRAY_SIZE(wm9081->reg_cache); - codec->reg_cache = &wm9081->reg_cache; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm9081_set_bias_level; - codec->volatile_register = wm9081_volatile_register; - - memcpy(codec->reg_cache, wm9081_reg_defaults, - sizeof(wm9081_reg_defaults)); - - ret = snd_soc_codec_set_cache_io(codec, 8, 16, control); - if (ret != 0) { - dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; - } - - reg = snd_soc_read(codec, WM9081_SOFTWARE_RESET); - if (reg != 0x9081) { - dev_err(codec->dev, "Device is not a WM9081: ID=0x%x\n", reg); - ret = -EINVAL; - goto err; - } - - ret = wm9081_reset(codec); - if (ret < 0) { - dev_err(codec->dev, "Failed to issue reset\n"); - goto err; - } - - wm9081_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - - /* Enable zero cross by default */ - reg = snd_soc_read(codec, WM9081_ANALOGUE_LINEOUT); - snd_soc_write(codec, WM9081_ANALOGUE_LINEOUT, reg | WM9081_LINEOUTZC); - reg = snd_soc_read(codec, WM9081_ANALOGUE_SPEAKER_PGA); - snd_soc_write(codec, WM9081_ANALOGUE_SPEAKER_PGA, - reg | WM9081_SPKPGAZC); - - wm9081_dai.dev = codec->dev; - - wm9081_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto err; - } - - ret = snd_soc_register_dai(&wm9081_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - goto err_codec; - } - - return 0; - -err_codec: - snd_soc_unregister_codec(codec); -err: - kfree(wm9081); - return ret; -} - -static void wm9081_unregister(struct wm9081_priv *wm9081) -{ - wm9081_set_bias_level(&wm9081->codec, SND_SOC_BIAS_OFF); - snd_soc_unregister_dai(&wm9081_dai); - snd_soc_unregister_codec(&wm9081->codec); - kfree(wm9081); - wm9081_codec = NULL; -} +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) static __devinit int wm9081_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct wm9081_priv *wm9081; - struct snd_soc_codec *codec; + int ret; wm9081 = kzalloc(sizeof(struct wm9081_priv), GFP_KERNEL); if (wm9081 == NULL) return -ENOMEM; - codec = &wm9081->codec; - codec->hw_write = (hw_write_t)i2c_master_send; - wm9081->retune = i2c->dev.platform_data; - i2c_set_clientdata(i2c, wm9081); - codec->control_data = i2c; - - codec->dev = &i2c->dev; + wm9081->control_data = i2c; - return wm9081_register(wm9081, SND_SOC_I2C); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm9081, &wm9081_dai, 1); + if (ret < 0) + kfree(wm9081); + return ret; } static __devexit int wm9081_i2c_remove(struct i2c_client *client) { - struct wm9081_priv *wm9081 = i2c_get_clientdata(client); - wm9081_unregister(wm9081); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } @@ -1452,31 +1359,34 @@ MODULE_DEVICE_TABLE(i2c, wm9081_i2c_id); static struct i2c_driver wm9081_i2c_driver = { .driver = { - .name = "wm9081", + .name = "wm9081-codec", .owner = THIS_MODULE, }, .probe = wm9081_i2c_probe, .remove = __devexit_p(wm9081_i2c_remove), .id_table = wm9081_i2c_id, }; +#endif static int __init wm9081_modinit(void) { - int ret; - + int ret = 0; +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ret = i2c_add_driver(&wm9081_i2c_driver); if (ret != 0) { printk(KERN_ERR "Failed to register WM9081 I2C driver: %d\n", ret); } - +#endif return ret; } module_init(wm9081_modinit); static void __exit wm9081_exit(void) { +#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) i2c_del_driver(&wm9081_i2c_driver); +#endif } module_exit(wm9081_exit); diff --git a/sound/soc/codecs/wm9081.h b/sound/soc/codecs/wm9081.h index 42d3bc757021..871cccb066dc 100644 --- a/sound/soc/codecs/wm9081.h +++ b/sound/soc/codecs/wm9081.h @@ -15,9 +15,6 @@ #include -extern struct snd_soc_dai wm9081_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm9081; - /* * SYSCLK sources */ diff --git a/sound/soc/codecs/wm9090.c b/sound/soc/codecs/wm9090.c index 1592250daec0..7a1825418ee4 100644 --- a/sound/soc/codecs/wm9090.c +++ b/sound/soc/codecs/wm9090.c @@ -34,8 +34,6 @@ #include "wm9090.h" -static struct snd_soc_codec *wm9090_codec; - static const u16 wm9090_reg_defaults[] = { 0x9093, /* R0 - Software Reset */ 0x0006, /* R1 - Power Management (1) */ @@ -142,15 +140,10 @@ static const u16 wm9090_reg_defaults[] = { /* This struct is used to save the context */ struct wm9090_priv { - /* We're not really registering as a CODEC since ASoC core - * does not yet support multiple CODECs but having the CODEC - * structure means we can reuse some of the ASoC core - * features. - */ - struct snd_soc_codec codec; struct mutex mutex; u16 reg_cache[WM9090_MAX_REGISTER + 1]; struct wm9090_platform_data pdata; + void *control_data; }; static int wm9090_volatile(unsigned int reg) @@ -523,7 +516,7 @@ static int wm9090_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_STANDBY: if (codec->bias_level == SND_SOC_BIAS_OFF) { /* Restore the register cache */ - for (i = 1; i < codec->reg_cache_size; i++) { + for (i = 1; i < codec->driver->reg_cache_size; i++) { if (reg_cache[i] == wm9090_reg_defaults[i]) continue; if (wm9090_volatile(i)) @@ -556,51 +549,67 @@ static int wm9090_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int wm9090_probe(struct platform_device *pdev) +static int wm9090_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; + struct wm9090_priv *wm9090 = snd_soc_codec_get_drvdata(codec); + int ret; - if (wm9090_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; + codec->control_data = wm9090->control_data; + ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C); + if (ret != 0) { + dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); + return ret; } - socdev->card->codec = wm9090_codec; - codec = wm9090_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; + ret = snd_soc_read(codec, WM9090_SOFTWARE_RESET); + if (ret < 0) + return ret; + if (ret != wm9090_reg_defaults[WM9090_SOFTWARE_RESET]) { + dev_err(codec->dev, "Device is not a WM9090, ID=%x\n", ret); + return -EINVAL; } + ret = snd_soc_write(codec, WM9090_SOFTWARE_RESET, 0); + if (ret < 0) + return ret; + + /* Configure some defaults; they will be written out when we + * bring the bias up. + */ + wm9090->reg_cache[WM9090_IN1_LINE_INPUT_A_VOLUME] |= WM9090_IN1_VU + | WM9090_IN1A_ZC; + wm9090->reg_cache[WM9090_IN1_LINE_INPUT_B_VOLUME] |= WM9090_IN1_VU + | WM9090_IN1B_ZC; + wm9090->reg_cache[WM9090_IN2_LINE_INPUT_A_VOLUME] |= WM9090_IN2_VU + | WM9090_IN2A_ZC; + wm9090->reg_cache[WM9090_IN2_LINE_INPUT_B_VOLUME] |= WM9090_IN2_VU + | WM9090_IN2B_ZC; + wm9090->reg_cache[WM9090_SPEAKER_VOLUME_LEFT] |= + WM9090_SPKOUT_VU | WM9090_SPKOUTL_ZC; + wm9090->reg_cache[WM9090_LEFT_OUTPUT_VOLUME] |= + WM9090_HPOUT1_VU | WM9090_HPOUT1L_ZC; + wm9090->reg_cache[WM9090_RIGHT_OUTPUT_VOLUME] |= + WM9090_HPOUT1_VU | WM9090_HPOUT1R_ZC; + + wm9090->reg_cache[WM9090_CLOCKING_1] |= WM9090_TOCLK_ENA; + + wm9090_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + wm9090_add_controls(codec); return 0; - -pcm_err: - return ret; } #ifdef CONFIG_PM -static int wm9090_suspend(struct platform_device *pdev, pm_message_t state) +static int wm9090_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm9090_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm9090_resume(struct platform_device *pdev) +static int wm9090_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm9090_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; @@ -610,29 +619,29 @@ static int wm9090_resume(struct platform_device *pdev) #define wm9090_resume NULL #endif -static int wm9090_remove(struct platform_device *pdev) +static int wm9090_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); + wm9090_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -struct snd_soc_codec_device soc_codec_dev_wm9090 = { +static struct snd_soc_codec_driver soc_codec_dev_wm9090 = { .probe = wm9090_probe, .remove = wm9090_remove, .suspend = wm9090_suspend, .resume = wm9090_resume, + .set_bias_level = wm9090_set_bias_level, + .reg_cache_size = (WM9090_MAX_REGISTER + 1), + .reg_word_size = sizeof(u16), + .reg_cache_default = wm9090_reg_defaults, + .volatile_register = wm9090_volatile, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm9090); static int wm9090_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct wm9090_priv *wm9090; - struct snd_soc_codec *codec; int ret; wm9090 = kzalloc(sizeof(*wm9090), GFP_KERNEL); @@ -640,102 +649,28 @@ static int wm9090_i2c_probe(struct i2c_client *i2c, dev_err(&i2c->dev, "Can not allocate memory\n"); return -ENOMEM; } - codec = &wm9090->codec; if (i2c->dev.platform_data) memcpy(&wm9090->pdata, i2c->dev.platform_data, sizeof(wm9090->pdata)); - wm9090_codec = codec; - i2c_set_clientdata(i2c, wm9090); + wm9090->control_data = i2c; + mutex_init(&wm9090->mutex); - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - codec->control_data = i2c; - snd_soc_codec_set_drvdata(codec, wm9090); - codec->dev = &i2c->dev; - codec->name = "WM9090"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm9090_set_bias_level, - codec->reg_cache_size = WM9090_MAX_REGISTER + 1; - codec->reg_cache = &wm9090->reg_cache; - codec->volatile_register = wm9090_volatile; - - ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C); - if (ret != 0) { - dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); - goto err; - } - - memcpy(&wm9090->reg_cache, wm9090_reg_defaults, - sizeof(wm9090->reg_cache)); - - ret = snd_soc_read(codec, WM9090_SOFTWARE_RESET); - if (ret < 0) - goto err; - if (ret != wm9090_reg_defaults[WM9090_SOFTWARE_RESET]) { - dev_err(&i2c->dev, "Device is not a WM9090, ID=%x\n", ret); - ret = -EINVAL; - goto err; - } - - ret = snd_soc_write(codec, WM9090_SOFTWARE_RESET, 0); + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm9090, NULL, 0); if (ret < 0) - goto err; - - /* Configure some defaults; they will be written out when we - * bring the bias up. - */ - wm9090->reg_cache[WM9090_IN1_LINE_INPUT_A_VOLUME] |= WM9090_IN1_VU - | WM9090_IN1A_ZC; - wm9090->reg_cache[WM9090_IN1_LINE_INPUT_B_VOLUME] |= WM9090_IN1_VU - | WM9090_IN1B_ZC; - wm9090->reg_cache[WM9090_IN2_LINE_INPUT_A_VOLUME] |= WM9090_IN2_VU - | WM9090_IN2A_ZC; - wm9090->reg_cache[WM9090_IN2_LINE_INPUT_B_VOLUME] |= WM9090_IN2_VU - | WM9090_IN2B_ZC; - wm9090->reg_cache[WM9090_SPEAKER_VOLUME_LEFT] |= - WM9090_SPKOUT_VU | WM9090_SPKOUTL_ZC; - wm9090->reg_cache[WM9090_LEFT_OUTPUT_VOLUME] |= - WM9090_HPOUT1_VU | WM9090_HPOUT1L_ZC; - wm9090->reg_cache[WM9090_RIGHT_OUTPUT_VOLUME] |= - WM9090_HPOUT1_VU | WM9090_HPOUT1R_ZC; - - wm9090->reg_cache[WM9090_CLOCKING_1] |= WM9090_TOCLK_ENA; - - wm9090_set_bias_level(codec, SND_SOC_BIAS_STANDBY); - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(&i2c->dev, "Failed to register CODEC: %d\n", ret); - goto err_bias; - } - - return 0; - -err_bias: - wm9090_set_bias_level(codec, SND_SOC_BIAS_OFF); -err: - kfree(wm9090); - i2c_set_clientdata(i2c, NULL); - wm9090_codec = NULL; - + kfree(wm9090); return ret; } static int wm9090_i2c_remove(struct i2c_client *i2c) { struct wm9090_priv *wm9090 = i2c_get_clientdata(i2c); - struct snd_soc_codec *codec = &wm9090->codec; - snd_soc_unregister_codec(codec); - wm9090_set_bias_level(codec, SND_SOC_BIAS_OFF); + snd_soc_unregister_codec(&i2c->dev); kfree(wm9090); - wm9090_codec = NULL; return 0; } @@ -748,7 +683,7 @@ MODULE_DEVICE_TABLE(i2c, wm9090_id); static struct i2c_driver wm9090_i2c_driver = { .driver = { - .name = "wm9090", + .name = "wm9090-codec", .owner = THIS_MODULE, }, .probe = wm9090_i2c_probe, diff --git a/sound/soc/codecs/wm9090.h b/sound/soc/codecs/wm9090.h index b08eab932a5b..29b9d9fc70b4 100644 --- a/sound/soc/codecs/wm9090.h +++ b/sound/soc/codecs/wm9090.h @@ -23,8 +23,6 @@ #ifndef __WM9090_H #define __WM9090_H -extern struct snd_soc_codec_device soc_codec_dev_wm9090; - /* * Register values. */ diff --git a/sound/soc/codecs/wm9705.c b/sound/soc/codecs/wm9705.c index 8793341849d1..e4d8f5339c51 100644 --- a/sound/soc/codecs/wm9705.c +++ b/sound/soc/codecs/wm9705.c @@ -248,8 +248,7 @@ static int ac97_prepare(struct snd_pcm_substream *substream, { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; int reg; u16 vra; @@ -273,9 +272,9 @@ static struct snd_soc_dai_ops wm9705_dai_ops = { .prepare = ac97_prepare, }; -struct snd_soc_dai wm9705_dai[] = { +static struct snd_soc_dai_driver wm9705_dai[] = { { - .name = "AC97 HiFi", + .name = "wm9705-hifi", .ac97_control = 1, .playback = { .stream_name = "HiFi Playback", @@ -294,7 +293,7 @@ struct snd_soc_dai wm9705_dai[] = { .ops = &wm9705_dai_ops, }, { - .name = "AC97 Aux", + .name = "wm9705-aux", .playback = { .stream_name = "Aux Playback", .channels_min = 1, @@ -304,7 +303,6 @@ struct snd_soc_dai wm9705_dai[] = { }, } }; -EXPORT_SYMBOL_GPL(wm9705_dai); static int wm9705_reset(struct snd_soc_codec *codec) { @@ -318,20 +316,15 @@ static int wm9705_reset(struct snd_soc_codec *codec) } #ifdef CONFIG_PM -static int wm9705_soc_suspend(struct platform_device *pdev, pm_message_t msg) +static int wm9705_soc_suspend(struct snd_soc_codec *codec, pm_message_t msg) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - soc_ac97_ops.write(codec->ac97, AC97_POWERDOWN, 0xffff); return 0; } -static int wm9705_soc_resume(struct platform_device *pdev) +static int wm9705_soc_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; int i, ret; u16 *cache = codec->reg_cache; @@ -352,49 +345,18 @@ static int wm9705_soc_resume(struct platform_device *pdev) #define wm9705_soc_resume NULL #endif -static int wm9705_soc_probe(struct platform_device *pdev) +static int wm9705_soc_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; int ret = 0; printk(KERN_INFO "WM9705 SoC Audio Codec\n"); - socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec), - GFP_KERNEL); - if (socdev->card->codec == NULL) - return -ENOMEM; - codec = socdev->card->codec; - mutex_init(&codec->mutex); - - codec->reg_cache = kmemdup(wm9705_reg, sizeof(wm9705_reg), GFP_KERNEL); - if (codec->reg_cache == NULL) { - ret = -ENOMEM; - goto cache_err; - } - codec->reg_cache_size = sizeof(wm9705_reg); - codec->reg_cache_step = 2; - - codec->name = "WM9705"; - codec->owner = THIS_MODULE; - codec->dai = wm9705_dai; - codec->num_dai = ARRAY_SIZE(wm9705_dai); - codec->write = ac97_write; - codec->read = ac97_read; - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); if (ret < 0) { printk(KERN_ERR "wm9705: failed to register AC97 codec\n"); - goto codec_err; + return ret; } - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) - goto pcm_err; - ret = wm9705_reset(codec); if (ret) goto reset_err; @@ -406,40 +368,62 @@ static int wm9705_soc_probe(struct platform_device *pdev) return 0; reset_err: - snd_soc_free_pcms(socdev); -pcm_err: snd_soc_free_ac97_codec(codec); -codec_err: - kfree(codec->reg_cache); -cache_err: - kfree(socdev->card->codec); - socdev->card->codec = NULL; return ret; } -static int wm9705_soc_remove(struct platform_device *pdev) +static int wm9705_soc_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - if (codec == NULL) - return 0; - - snd_soc_dapm_free(socdev); - snd_soc_free_pcms(socdev); snd_soc_free_ac97_codec(codec); - kfree(codec->reg_cache); - kfree(codec); return 0; } -struct snd_soc_codec_device soc_codec_dev_wm9705 = { +static struct snd_soc_codec_driver soc_codec_dev_wm9705 = { .probe = wm9705_soc_probe, .remove = wm9705_soc_remove, .suspend = wm9705_soc_suspend, .resume = wm9705_soc_resume, + .read = ac97_read, + .write = ac97_write, + .reg_cache_size = sizeof(wm9705_reg), + .reg_word_size = sizeof(u16), + .reg_cache_step = 2, + .reg_cache_default = wm9705_reg, +}; + +static __devinit int wm9705_probe(struct platform_device *pdev) +{ + return snd_soc_register_codec(&pdev->dev, + &soc_codec_dev_wm9705, wm9705_dai, ARRAY_SIZE(wm9705_dai)); +} + +static int __devexit wm9705_remove(struct platform_device *pdev) +{ + snd_soc_unregister_codec(&pdev->dev); + return 0; +} + +static struct platform_driver wm9705_codec_driver = { + .driver = { + .name = "wm9705-codec", + .owner = THIS_MODULE, + }, + + .probe = wm9705_probe, + .remove = __devexit_p(wm9705_remove), }; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm9705); + +static int __init wm9705_init(void) +{ + return platform_driver_register(&wm9705_codec_driver); +} +module_init(wm9705_init); + +static void __exit wm9705_exit(void) +{ + platform_driver_unregister(&wm9705_codec_driver); +} +module_exit(wm9705_exit); MODULE_DESCRIPTION("ASoC WM9705 driver"); MODULE_AUTHOR("Ian Molton"); diff --git a/sound/soc/codecs/wm9705.h b/sound/soc/codecs/wm9705.h index d380f110f9e2..23ea9ce47359 100644 --- a/sound/soc/codecs/wm9705.h +++ b/sound/soc/codecs/wm9705.h @@ -8,7 +8,4 @@ #define WM9705_DAI_AC97_HIFI 0 #define WM9705_DAI_AC97_AUX 1 -extern struct snd_soc_dai wm9705_dai[2]; -extern struct snd_soc_codec_device soc_codec_dev_wm9705; - #endif diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c index 28790a2ffe8d..f8f37ae30910 100644 --- a/sound/soc/codecs/wm9712.c +++ b/sound/soc/codecs/wm9712.c @@ -478,8 +478,7 @@ static int ac97_prepare(struct snd_pcm_substream *substream, { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec =rtd->codec; int reg; u16 vra; @@ -499,8 +498,7 @@ static int ac97_aux_prepare(struct snd_pcm_substream *substream, { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; u16 vra, xsle; vra = ac97_read(codec, AC97_EXTENDED_STATUS); @@ -526,9 +524,9 @@ static struct snd_soc_dai_ops wm9712_dai_ops_aux = { .prepare = ac97_aux_prepare, }; -struct snd_soc_dai wm9712_dai[] = { +struct snd_soc_dai_driver wm9712_dai[] = { { - .name = "AC97 HiFi", + .name = "wm9712-hifi", .ac97_control = 1, .playback = { .stream_name = "HiFi Playback", @@ -545,7 +543,7 @@ struct snd_soc_dai wm9712_dai[] = { .ops = &wm9712_dai_ops_hifi, }, { - .name = "AC97 Aux", + .name = "wm9712-aux", .playback = { .stream_name = "Aux Playback", .channels_min = 1, @@ -555,7 +553,6 @@ struct snd_soc_dai wm9712_dai[] = { .ops = &wm9712_dai_ops_aux, } }; -EXPORT_SYMBOL_GPL(wm9712_dai); static int wm9712_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) @@ -597,20 +594,15 @@ err: return -EIO; } -static int wm9712_soc_suspend(struct platform_device *pdev, +static int wm9712_soc_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - wm9712_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -static int wm9712_soc_resume(struct platform_device *pdev) +static int wm9712_soc_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; int i, ret; u16 *cache = codec->reg_cache; @@ -635,51 +627,18 @@ static int wm9712_soc_resume(struct platform_device *pdev) return ret; } -static int wm9712_soc_probe(struct platform_device *pdev) +static int wm9712_soc_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; int ret = 0; printk(KERN_INFO "WM9711/WM9712 SoC Audio Codec %s\n", WM9712_VERSION); - socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec), - GFP_KERNEL); - if (socdev->card->codec == NULL) - return -ENOMEM; - codec = socdev->card->codec; - mutex_init(&codec->mutex); - - codec->reg_cache = kmemdup(wm9712_reg, sizeof(wm9712_reg), GFP_KERNEL); - - if (codec->reg_cache == NULL) { - ret = -ENOMEM; - goto cache_err; - } - codec->reg_cache_size = sizeof(wm9712_reg); - codec->reg_cache_step = 2; - - codec->name = "WM9712"; - codec->owner = THIS_MODULE; - codec->dai = wm9712_dai; - codec->num_dai = ARRAY_SIZE(wm9712_dai); - codec->write = ac97_write; - codec->read = ac97_read; - codec->set_bias_level = wm9712_set_bias_level; - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); if (ret < 0) { printk(KERN_ERR "wm9712: failed to register AC97 codec\n"); - goto codec_err; + return ret; } - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) - goto pcm_err; - ret = wm9712_reset(codec, 0); if (ret < 0) { printk(KERN_ERR "Failed to reset WM9712: AC97 link error\n"); @@ -697,42 +656,63 @@ static int wm9712_soc_probe(struct platform_device *pdev) return 0; reset_err: - snd_soc_free_pcms(socdev); -pcm_err: snd_soc_free_ac97_codec(codec); - -codec_err: - kfree(codec->reg_cache); - -cache_err: - kfree(socdev->card->codec); - socdev->card->codec = NULL; return ret; } -static int wm9712_soc_remove(struct platform_device *pdev) +static int wm9712_soc_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - if (codec == NULL) - return 0; - - snd_soc_dapm_free(socdev); - snd_soc_free_pcms(socdev); snd_soc_free_ac97_codec(codec); - kfree(codec->reg_cache); - kfree(codec); return 0; } -struct snd_soc_codec_device soc_codec_dev_wm9712 = { +static struct snd_soc_codec_driver soc_codec_dev_wm9712 = { .probe = wm9712_soc_probe, .remove = wm9712_soc_remove, .suspend = wm9712_soc_suspend, .resume = wm9712_soc_resume, + .read = ac97_read, + .write = ac97_write, + .set_bias_level = wm9712_set_bias_level, + .reg_cache_size = sizeof(wm9712_reg), + .reg_word_size = sizeof(u16), + .reg_cache_step = 2, + .reg_cache_default = wm9712_reg, }; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm9712); + +static __devinit int wm9712_probe(struct platform_device *pdev) +{ + return snd_soc_register_codec(&pdev->dev, + &soc_codec_dev_wm9712, wm9712_dai, ARRAY_SIZE(wm9712_dai)); +} + +static int __devexit wm9712_remove(struct platform_device *pdev) +{ + snd_soc_unregister_codec(&pdev->dev); + return 0; +} + +static struct platform_driver wm9712_codec_driver = { + .driver = { + .name = "wm9712-codec", + .owner = THIS_MODULE, + }, + + .probe = wm9712_probe, + .remove = __devexit_p(wm9712_remove), +}; + +static int __init wm9712_init(void) +{ + return platform_driver_register(&wm9712_codec_driver); +} +module_init(wm9712_init); + +static void __exit wm9712_exit(void) +{ + platform_driver_unregister(&wm9712_codec_driver); +} +module_exit(wm9712_exit); MODULE_DESCRIPTION("ASoC WM9711/WM9712 driver"); MODULE_AUTHOR("Liam Girdwood"); diff --git a/sound/soc/codecs/wm9712.h b/sound/soc/codecs/wm9712.h index d29e8a18ca6d..fb69c3aa4ed0 100644 --- a/sound/soc/codecs/wm9712.h +++ b/sound/soc/codecs/wm9712.h @@ -8,7 +8,4 @@ #define WM9712_DAI_AC97_HIFI 0 #define WM9712_DAI_AC97_AUX 1 -extern struct snd_soc_dai wm9712_dai[2]; -extern struct snd_soc_codec_device soc_codec_dev_wm9712; - #endif diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c index 34e0c91092fa..463917e762b5 100644 --- a/sound/soc/codecs/wm9713.c +++ b/sound/soc/codecs/wm9713.c @@ -1057,9 +1057,9 @@ static struct snd_soc_dai_ops wm9713_dai_ops_voice = { .set_tristate = wm9713_set_dai_tristate, }; -struct snd_soc_dai wm9713_dai[] = { +static struct snd_soc_dai_driver wm9713_dai[] = { { - .name = "AC97 HiFi", + .name = "wm9713-hifi", .ac97_control = 1, .playback = { .stream_name = "HiFi Playback", @@ -1076,7 +1076,7 @@ struct snd_soc_dai wm9713_dai[] = { .ops = &wm9713_dai_ops_hifi, }, { - .name = "AC97 Aux", + .name = "wm9713-aux", .playback = { .stream_name = "Aux Playback", .channels_min = 1, @@ -1086,7 +1086,7 @@ struct snd_soc_dai wm9713_dai[] = { .ops = &wm9713_dai_ops_aux, }, { - .name = "WM9713 Voice", + .name = "wm9713-voice", .playback = { .stream_name = "Voice Playback", .channels_min = 1, @@ -1103,7 +1103,6 @@ struct snd_soc_dai wm9713_dai[] = { .symmetric_rates = 1, }, }; -EXPORT_SYMBOL_GPL(wm9713_dai); int wm9713_reset(struct snd_soc_codec *codec, int try_warm) { @@ -1152,11 +1151,9 @@ static int wm9713_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int wm9713_soc_suspend(struct platform_device *pdev, +static int wm9713_soc_suspend(struct snd_soc_codec *codec, pm_message_t state) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; u16 reg; /* Disable everything except touchpanel - that will be handled @@ -1171,10 +1168,8 @@ static int wm9713_soc_suspend(struct platform_device *pdev, return 0; } -static int wm9713_soc_resume(struct platform_device *pdev) +static int wm9713_soc_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); int i, ret; u16 *cache = codec->reg_cache; @@ -1204,53 +1199,20 @@ static int wm9713_soc_resume(struct platform_device *pdev) return ret; } -static int wm9713_soc_probe(struct platform_device *pdev) +static int wm9713_soc_probe(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; + struct wm9713_priv *wm9713; int ret = 0, reg; - socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec), - GFP_KERNEL); - if (socdev->card->codec == NULL) + wm9713 = kzalloc(sizeof(struct wm9713_priv), GFP_KERNEL); + if (wm9713 == NULL) return -ENOMEM; - codec = socdev->card->codec; - mutex_init(&codec->mutex); - - codec->reg_cache = kmemdup(wm9713_reg, sizeof(wm9713_reg), GFP_KERNEL); - if (codec->reg_cache == NULL) { - ret = -ENOMEM; - goto cache_err; - } - codec->reg_cache_size = sizeof(wm9713_reg); - codec->reg_cache_step = 2; - - snd_soc_codec_set_drvdata(codec, kzalloc(sizeof(struct wm9713_priv), - GFP_KERNEL)); - if (snd_soc_codec_get_drvdata(codec) == NULL) { - ret = -ENOMEM; - goto priv_err; - } - - codec->name = "WM9713"; - codec->owner = THIS_MODULE; - codec->dai = wm9713_dai; - codec->num_dai = ARRAY_SIZE(wm9713_dai); - codec->write = ac97_write; - codec->read = ac97_read; - codec->set_bias_level = wm9713_set_bias_level; - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); + snd_soc_codec_set_drvdata(codec, wm9713); ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0); if (ret < 0) goto codec_err; - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) - goto pcm_err; - /* do a cold reset for the controller and then try * a warm reset followed by an optional cold reset for codec */ wm9713_reset(codec, 0); @@ -1273,46 +1235,67 @@ static int wm9713_soc_probe(struct platform_device *pdev) return 0; reset_err: - snd_soc_free_pcms(socdev); -pcm_err: snd_soc_free_ac97_codec(codec); - codec_err: - kfree(snd_soc_codec_get_drvdata(codec)); - -priv_err: - kfree(codec->reg_cache); - -cache_err: - kfree(socdev->card->codec); - socdev->card->codec = NULL; + kfree(wm9713); return ret; } -static int wm9713_soc_remove(struct platform_device *pdev) +static int wm9713_soc_remove(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; - - if (codec == NULL) - return 0; - - snd_soc_dapm_free(socdev); - snd_soc_free_pcms(socdev); + struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); snd_soc_free_ac97_codec(codec); - kfree(snd_soc_codec_get_drvdata(codec)); - kfree(codec->reg_cache); - kfree(codec); + kfree(wm9713); return 0; } -struct snd_soc_codec_device soc_codec_dev_wm9713 = { +static struct snd_soc_codec_driver soc_codec_dev_wm9713 = { .probe = wm9713_soc_probe, .remove = wm9713_soc_remove, .suspend = wm9713_soc_suspend, .resume = wm9713_soc_resume, + .read = ac97_read, + .write = ac97_write, + .set_bias_level = wm9713_set_bias_level, + .reg_cache_size = sizeof(wm9713_reg), + .reg_word_size = sizeof(u16), + .reg_cache_step = 2, + .reg_cache_default = wm9713_reg, +}; + +static __devinit int wm9713_probe(struct platform_device *pdev) +{ + return snd_soc_register_codec(&pdev->dev, + &soc_codec_dev_wm9713, wm9713_dai, ARRAY_SIZE(wm9713_dai)); +} + +static int __devexit wm9713_remove(struct platform_device *pdev) +{ + snd_soc_unregister_codec(&pdev->dev); + return 0; +} + +static struct platform_driver wm9713_codec_driver = { + .driver = { + .name = "wm9713-codec", + .owner = THIS_MODULE, + }, + + .probe = wm9713_probe, + .remove = __devexit_p(wm9713_remove), }; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm9713); + +static int __init wm9713_init(void) +{ + return platform_driver_register(&wm9713_codec_driver); +} +module_init(wm9713_init); + +static void __exit wm9713_exit(void) +{ + platform_driver_unregister(&wm9713_codec_driver); +} +module_exit(wm9713_exit); MODULE_DESCRIPTION("ASoC WM9713/WM9714 driver"); MODULE_AUTHOR("Liam Girdwood"); diff --git a/sound/soc/codecs/wm9713.h b/sound/soc/codecs/wm9713.h index 63b8d81756e3..793da863a03d 100644 --- a/sound/soc/codecs/wm9713.h +++ b/sound/soc/codecs/wm9713.h @@ -45,9 +45,6 @@ #define WM9713_DAI_AC97_AUX 1 #define WM9713_DAI_PCM_VOICE 2 -extern struct snd_soc_codec_device soc_codec_dev_wm9713; -extern struct snd_soc_dai wm9713_dai[3]; - int wm9713_reset(struct snd_soc_codec *codec, int try_warm); #endif diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c index 97f74d6a33e6..2b07b17a6b2d 100644 --- a/sound/soc/davinci/davinci-evm.c +++ b/sound/soc/davinci/davinci-evm.c @@ -28,12 +28,9 @@ #include #include "../codecs/tlv320aic3x.h" -#include "../codecs/cq93vc.h" -#include "../codecs/spdif_transciever.h" #include "davinci-pcm.h" #include "davinci-i2s.h" #include "davinci-mcasp.h" -#include "davinci-vcif.h" #define AUDIO_FORMAT (SND_SOC_DAIFMT_DSP_B | \ SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_IB_NF) @@ -41,8 +38,8 @@ static int evm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret = 0; unsigned sysclk; @@ -87,7 +84,7 @@ static int evm_spdif_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; /* set cpu DAI configuration */ return snd_soc_dai_set_fmt(cpu_dai, AUDIO_FORMAT); @@ -132,8 +129,10 @@ static const struct snd_soc_dapm_route audio_map[] = { }; /* Logic for a aic3x as connected on a davinci-evm */ -static int evm_aic3x_init(struct snd_soc_codec *codec) +static int evm_aic3x_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; + /* Add davinci-evm specific widgets */ snd_soc_dapm_new_controls(codec, aic3x_dapm_widgets, ARRAY_SIZE(aic3x_dapm_widgets)); @@ -161,8 +160,10 @@ static int evm_aic3x_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link evm_dai = { .name = "TLV320AIC3X", .stream_name = "AIC3X", - .cpu_dai = &davinci_i2s_dai, - .codec_dai = &aic3x_dai, + .cpu_dai_name = "davinci-mcasp.0", + .codec_dai_name = "tlv320aic3x-hifi", + .codec_name = "tlv320aic3x-codec.0-001a", + .platform_name = "davinci-pcm-audio", .init = evm_aic3x_init, .ops = &evm_ops, }; @@ -171,40 +172,49 @@ static struct snd_soc_dai_link dm365_evm_dai = { #ifdef CONFIG_SND_DM365_AIC3X_CODEC .name = "TLV320AIC3X", .stream_name = "AIC3X", - .cpu_dai = &davinci_i2s_dai, - .codec_dai = &aic3x_dai, + .cpu_dai_name = "davinci-i2s", + .codec_dai_name = "tlv320aic3x-hifi", .init = evm_aic3x_init, + .codec_name = "tlv320aic3x-codec.0-001a", .ops = &evm_ops, #elif defined(CONFIG_SND_DM365_VOICE_CODEC) .name = "Voice Codec - CQ93VC", .stream_name = "CQ93", - .cpu_dai = &davinci_vcif_dai, - .codec_dai = &cq93vc_dai, + .cpu_dai_name = "davinci-vcif", + .codec_dai_name = "cq93vc-hifi", + .codec_name = "cq93vc-codec", #endif + .platform_name = "davinci-pcm-audio", }; static struct snd_soc_dai_link dm6467_evm_dai[] = { { .name = "TLV320AIC3X", .stream_name = "AIC3X", - .cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_I2S_DAI], - .codec_dai = &aic3x_dai, + .cpu_dai_name= "davinci-mcasp.0", + .codec_dai_name = "tlv320aic3x-hifi", + .platform_name ="davinci-pcm-audio", + .codec_name = "tlv320aic3x-codec.0-001a", .init = evm_aic3x_init, .ops = &evm_ops, }, { .name = "McASP", .stream_name = "spdif", - .cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_DIT_DAI], - .codec_dai = &dit_stub_dai, + .cpu_dai_name= "davinci-mcasp.1", + .codec_dai_name = "dit-hifi", + .codec_name = "spdif_dit", + .platform_name = "davinci-pcm-audio", .ops = &evm_spdif_ops, }, }; static struct snd_soc_dai_link da8xx_evm_dai = { .name = "TLV320AIC3X", .stream_name = "AIC3X", - .cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_I2S_DAI], - .codec_dai = &aic3x_dai, + .cpu_dai_name= "davinci-mcasp.0", + .codec_dai_name = "tlv320aic3x-hifi", + .codec_name = "tlv320aic3x-codec.0-001a", + .platform_name = "davinci-pcm-audio", .init = evm_aic3x_init, .ops = &evm_ops, }; @@ -212,7 +222,6 @@ static struct snd_soc_dai_link da8xx_evm_dai = { /* davinci dm6446, dm355 evm audio machine driver */ static struct snd_soc_card snd_soc_card_evm = { .name = "DaVinci EVM", - .platform = &davinci_soc_platform, .dai_link = &evm_dai, .num_links = 1, }; @@ -220,16 +229,13 @@ static struct snd_soc_card snd_soc_card_evm = { /* davinci dm365 evm audio machine driver */ static struct snd_soc_card dm365_snd_soc_card_evm = { .name = "DaVinci DM365 EVM", - .platform = &davinci_soc_platform, .dai_link = &dm365_evm_dai, .num_links = 1, }; - /* davinci dm6467 evm audio machine driver */ static struct snd_soc_card dm6467_snd_soc_card_evm = { .name = "DaVinci DM6467 EVM", - .platform = &davinci_soc_platform, .dai_link = dm6467_evm_dai, .num_links = ARRAY_SIZE(dm6467_evm_dai), }; @@ -237,82 +243,40 @@ static struct snd_soc_card dm6467_snd_soc_card_evm = { static struct snd_soc_card da830_snd_soc_card = { .name = "DA830/OMAP-L137 EVM", .dai_link = &da8xx_evm_dai, - .platform = &davinci_soc_platform, .num_links = 1, }; static struct snd_soc_card da850_snd_soc_card = { .name = "DA850/OMAP-L138 EVM", .dai_link = &da8xx_evm_dai, - .platform = &davinci_soc_platform, .num_links = 1, }; -static struct aic3x_setup_data aic3x_setup; - -/* evm audio subsystem */ -static struct snd_soc_device evm_snd_devdata = { - .card = &snd_soc_card_evm, - .codec_dev = &soc_codec_dev_aic3x, - .codec_data = &aic3x_setup, -}; - -/* evm audio subsystem */ -static struct snd_soc_device dm365_evm_snd_devdata = { - .card = &dm365_snd_soc_card_evm, -#ifdef CONFIG_SND_DM365_AIC3X_CODEC - .codec_dev = &soc_codec_dev_aic3x, - .codec_data = &aic3x_setup, -#elif defined(CONFIG_SND_DM365_VOICE_CODEC) - .codec_dev = &soc_codec_dev_cq93vc, -#endif -}; - -/* evm audio subsystem */ -static struct snd_soc_device dm6467_evm_snd_devdata = { - .card = &dm6467_snd_soc_card_evm, - .codec_dev = &soc_codec_dev_aic3x, - .codec_data = &aic3x_setup, -}; - -/* evm audio subsystem */ -static struct snd_soc_device da830_evm_snd_devdata = { - .card = &da830_snd_soc_card, - .codec_dev = &soc_codec_dev_aic3x, - .codec_data = &aic3x_setup, -}; - -static struct snd_soc_device da850_evm_snd_devdata = { - .card = &da850_snd_soc_card, - .codec_dev = &soc_codec_dev_aic3x, - .codec_data = &aic3x_setup, -}; - static struct platform_device *evm_snd_device; static int __init evm_init(void) { - struct snd_soc_device *evm_snd_dev_data; + struct snd_soc_card *evm_snd_dev_data; int index; int ret; if (machine_is_davinci_evm()) { - evm_snd_dev_data = &evm_snd_devdata; + evm_snd_dev_data = &snd_soc_card_evm; index = 0; } else if (machine_is_davinci_dm355_evm()) { - evm_snd_dev_data = &evm_snd_devdata; + evm_snd_dev_data = &snd_soc_card_evm; index = 1; } else if (machine_is_davinci_dm365_evm()) { - evm_snd_dev_data = &dm365_evm_snd_devdata; + evm_snd_dev_data = &dm365_snd_soc_card_evm; index = 0; } else if (machine_is_davinci_dm6467_evm()) { - evm_snd_dev_data = &dm6467_evm_snd_devdata; + evm_snd_dev_data = &dm6467_snd_soc_card_evm; index = 0; } else if (machine_is_davinci_da830_evm()) { - evm_snd_dev_data = &da830_evm_snd_devdata; + evm_snd_dev_data = &da830_snd_soc_card; index = 1; } else if (machine_is_davinci_da850_evm()) { - evm_snd_dev_data = &da850_evm_snd_devdata; + evm_snd_dev_data = &da850_snd_soc_card; index = 0; } else return -EINVAL; @@ -322,7 +286,6 @@ static int __init evm_init(void) return -ENOMEM; platform_set_drvdata(evm_snd_device, evm_snd_dev_data); - evm_snd_dev_data->dev = &evm_snd_device->dev; ret = platform_device_add(evm_snd_device); if (ret) platform_device_put(evm_snd_device); diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c index 9e8932abf158..9f8b6c556866 100644 --- a/sound/soc/davinci/davinci-i2s.c +++ b/sound/soc/davinci/davinci-i2s.c @@ -183,8 +183,7 @@ static void davinci_mcbsp_start(struct davinci_mcbsp_dev *dev, struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_platform *platform = socdev->card->platform; + struct snd_soc_platform *platform = rtd->platform; int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); u32 spcr; u32 mask = playback ? DAVINCI_MCBSP_SPCR_XRST : DAVINCI_MCBSP_SPCR_RRST; @@ -205,8 +204,8 @@ static void davinci_mcbsp_start(struct davinci_mcbsp_dev *dev, if (playback) { /* Stop the DMA to avoid data loss */ /* while the transmitter is out of reset to handle XSYNCERR */ - if (platform->pcm_ops->trigger) { - int ret = platform->pcm_ops->trigger(substream, + if (platform->driver->ops->trigger) { + int ret = platform->driver->ops->trigger(substream, SNDRV_PCM_TRIGGER_STOP); if (ret < 0) printk(KERN_DEBUG "Playback DMA stop failed\n"); @@ -227,8 +226,8 @@ static void davinci_mcbsp_start(struct davinci_mcbsp_dev *dev, toggle_clock(dev, playback); /* Restart the DMA */ - if (platform->pcm_ops->trigger) { - int ret = platform->pcm_ops->trigger(substream, + if (platform->driver->ops->trigger) { + int ret = platform->driver->ops->trigger(substream, SNDRV_PCM_TRIGGER_START); if (ret < 0) printk(KERN_DEBUG "Playback DMA start failed\n"); @@ -263,7 +262,7 @@ static void davinci_mcbsp_stop(struct davinci_mcbsp_dev *dev, int playback) static int davinci_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { - struct davinci_mcbsp_dev *dev = cpu_dai->private_data; + struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(cpu_dai); unsigned int pcr; unsigned int srgr; /* Attention srgr is updated by hw_params! */ @@ -404,7 +403,7 @@ static int davinci_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, static int davinci_i2s_dai_set_clkdiv(struct snd_soc_dai *cpu_dai, int div_id, int div) { - struct davinci_mcbsp_dev *dev = cpu_dai->private_data; + struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(cpu_dai); if (div_id != DAVINCI_MCBSP_CLKGDV) return -ENODEV; @@ -417,7 +416,7 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct davinci_mcbsp_dev *dev = dai->private_data; + struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai); struct davinci_pcm_dma_params *dma_params = &dev->dma_params[substream->stream]; struct snd_interval *i = NULL; @@ -427,6 +426,9 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream, snd_pcm_format_t fmt; unsigned element_cnt = 1; + dai->capture_dma_data = dev->dma_params; + dai->playback_dma_data = dev->dma_params; + /* general line settings */ spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG); if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { @@ -569,7 +571,7 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream, static int davinci_i2s_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct davinci_mcbsp_dev *dev = dai->private_data; + struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai); int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); davinci_mcbsp_stop(dev, playback); if ((dev->pcr & DAVINCI_MCBSP_PCR_FSXM) == 0) { @@ -582,7 +584,7 @@ static int davinci_i2s_prepare(struct snd_pcm_substream *substream, static int davinci_i2s_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { - struct davinci_mcbsp_dev *dev = dai->private_data; + struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai); int ret = 0; int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); if ((dev->pcr & DAVINCI_MCBSP_PCR_FSXM) == 0) @@ -608,7 +610,7 @@ static int davinci_i2s_trigger(struct snd_pcm_substream *substream, int cmd, static void davinci_i2s_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct davinci_mcbsp_dev *dev = dai->private_data; + struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai); int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); davinci_mcbsp_stop(dev, playback); } @@ -625,9 +627,7 @@ static struct snd_soc_dai_ops davinci_i2s_dai_ops = { }; -struct snd_soc_dai davinci_i2s_dai = { - .name = "davinci-i2s", - .id = 0, +static struct snd_soc_dai_driver davinci_i2s_dai = { .playback = { .channels_min = 2, .channels_max = 2, @@ -641,7 +641,6 @@ struct snd_soc_dai davinci_i2s_dai = { .ops = &davinci_i2s_dai_ops, }; -EXPORT_SYMBOL_GPL(davinci_i2s_dai); static int davinci_i2s_probe(struct platform_device *pdev) { @@ -720,10 +719,9 @@ static int davinci_i2s_probe(struct platform_device *pdev) dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start; dev->dev = &pdev->dev; - davinci_i2s_dai.private_data = dev; - davinci_i2s_dai.capture.dma_data = dev->dma_params; - davinci_i2s_dai.playback.dma_data = dev->dma_params; - ret = snd_soc_register_dai(&davinci_i2s_dai); + dev_set_drvdata(&pdev->dev, dev); + + ret = snd_soc_register_dai(&pdev->dev, &davinci_i2s_dai); if (ret != 0) goto err_free_mem; @@ -739,10 +737,10 @@ err_release_region: static int davinci_i2s_remove(struct platform_device *pdev) { - struct davinci_mcbsp_dev *dev = davinci_i2s_dai.private_data; + struct davinci_mcbsp_dev *dev = dev_get_drvdata(&pdev->dev); struct resource *mem; - snd_soc_unregister_dai(&davinci_i2s_dai); + snd_soc_unregister_dai(&pdev->dev); clk_disable(dev->clk); clk_put(dev->clk); dev->clk = NULL; @@ -757,7 +755,7 @@ static struct platform_driver davinci_mcbsp_driver = { .probe = davinci_i2s_probe, .remove = davinci_i2s_remove, .driver = { - .name = "davinci-asp", + .name = "davinci-i2s", .owner = THIS_MODULE, }, }; diff --git a/sound/soc/davinci/davinci-i2s.h b/sound/soc/davinci/davinci-i2s.h index 0b1e77b8c279..48dac3e2521a 100644 --- a/sound/soc/davinci/davinci-i2s.h +++ b/sound/soc/davinci/davinci-i2s.h @@ -17,6 +17,4 @@ enum davinci_mcbsp_div { DAVINCI_MCBSP_CLKGDV, /* Sample rate generator divider */ }; -extern struct snd_soc_dai davinci_i2s_dai; - #endif diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index b24720894af6..c8e97dcbfff4 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c @@ -422,7 +422,7 @@ static void davinci_mcasp_stop(struct davinci_audio_dev *dev, int stream) static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { - struct davinci_audio_dev *dev = cpu_dai->private_data; + struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai); void __iomem *base = dev->base; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -709,12 +709,15 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *cpu_dai) { - struct davinci_audio_dev *dev = cpu_dai->private_data; + struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai); struct davinci_pcm_dma_params *dma_params = &dev->dma_params[substream->stream]; int word_length; u8 fifo_level; + cpu_dai->capture_dma_data = dev->dma_params; + cpu_dai->playback_dma_data = dev->dma_params; + davinci_hw_common_param(dev, substream->stream); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) fifo_level = dev->txnumevt; @@ -761,8 +764,7 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, static int davinci_mcasp_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *cpu_dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct davinci_audio_dev *dev = rtd->dai->cpu_dai->private_data; + struct davinci_audio_dev *dev = snd_soc_dai_get_drvdata(cpu_dai); int ret = 0; switch (cmd) { @@ -804,10 +806,9 @@ static struct snd_soc_dai_ops davinci_mcasp_dai_ops = { }; -struct snd_soc_dai davinci_mcasp_dai[] = { +static struct snd_soc_dai_driver davinci_mcasp_dai[] = { { - .name = "davinci-i2s", - .id = 0, + .name = "davinci-mcasp.0", .playback = { .channels_min = 2, .channels_max = 2, @@ -828,8 +829,7 @@ struct snd_soc_dai davinci_mcasp_dai[] = { }, { - .name = "davinci-dit", - .id = 1, + "davinci-mcasp.1", .playback = { .channels_min = 1, .channels_max = 384, @@ -840,7 +840,6 @@ struct snd_soc_dai davinci_mcasp_dai[] = { }, }; -EXPORT_SYMBOL_GPL(davinci_mcasp_dai); static int davinci_mcasp_probe(struct platform_device *pdev) { @@ -917,11 +916,8 @@ static int davinci_mcasp_probe(struct platform_device *pdev) } dma_data->channel = res->start; - davinci_mcasp_dai[pdata->op_mode].private_data = dev; - davinci_mcasp_dai[pdata->op_mode].capture.dma_data = dev->dma_params; - davinci_mcasp_dai[pdata->op_mode].playback.dma_data = dev->dma_params; - davinci_mcasp_dai[pdata->op_mode].dev = &pdev->dev; - ret = snd_soc_register_dai(&davinci_mcasp_dai[pdata->op_mode]); + dev_set_drvdata(&pdev->dev, dev); + ret = snd_soc_register_dai(&pdev->dev, &davinci_mcasp_dai[pdata->op_mode]); if (ret != 0) goto err_release_region; @@ -937,12 +933,10 @@ err_release_data: static int davinci_mcasp_remove(struct platform_device *pdev) { - struct snd_platform_data *pdata = pdev->dev.platform_data; - struct davinci_audio_dev *dev; + struct davinci_audio_dev *dev = dev_get_drvdata(&pdev->dev); struct resource *mem; - snd_soc_unregister_dai(&davinci_mcasp_dai[pdata->op_mode]); - dev = davinci_mcasp_dai[pdata->op_mode].private_data; + snd_soc_unregister_dai(&pdev->dev); clk_disable(dev->clk); clk_put(dev->clk); dev->clk = NULL; diff --git a/sound/soc/davinci/davinci-mcasp.h b/sound/soc/davinci/davinci-mcasp.h index e755b5121ec7..4681acc63606 100644 --- a/sound/soc/davinci/davinci-mcasp.h +++ b/sound/soc/davinci/davinci-mcasp.h @@ -22,8 +22,6 @@ #include #include "davinci-pcm.h" -extern struct snd_soc_dai davinci_mcasp_dai[]; - #define DAVINCI_MCASP_RATES SNDRV_PCM_RATE_8000_96000 #define DAVINCI_MCASP_I2S_DAI 0 #define DAVINCI_MCASP_DIT_DAI 1 diff --git a/sound/soc/davinci/davinci-pcm.c b/sound/soc/davinci/davinci-pcm.c index a7124116d2e0..9d35b8c1a624 100644 --- a/sound/soc/davinci/davinci-pcm.c +++ b/sound/soc/davinci/davinci-pcm.c @@ -653,7 +653,7 @@ static int davinci_pcm_open(struct snd_pcm_substream *substream) struct davinci_pcm_dma_params *pa; struct davinci_pcm_dma_params *params; - pa = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); + pa = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); if (!pa) return -ENODEV; params = &pa[substream->stream]; @@ -821,7 +821,7 @@ static int davinci_pcm_new(struct snd_card *card, if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = 0xffffffff; - if (dai->playback.channels_min) { + if (dai->driver->playback.channels_min) { ret = davinci_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_PLAYBACK, pcm_hardware_playback.buffer_bytes_max); @@ -829,7 +829,7 @@ static int davinci_pcm_new(struct snd_card *card, return ret; } - if (dai->capture.channels_min) { + if (dai->driver->capture.channels_min) { ret = davinci_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_CAPTURE, pcm_hardware_capture.buffer_bytes_max); @@ -840,25 +840,44 @@ static int davinci_pcm_new(struct snd_card *card, return 0; } -struct snd_soc_platform davinci_soc_platform = { - .name = "davinci-audio", - .pcm_ops = &davinci_pcm_ops, +static struct snd_soc_platform_driver davinci_soc_platform = { + .ops = &davinci_pcm_ops, .pcm_new = davinci_pcm_new, .pcm_free = davinci_pcm_free, }; -EXPORT_SYMBOL_GPL(davinci_soc_platform); -static int __init davinci_soc_platform_init(void) +static int __devinit davinci_soc_platform_probe(struct platform_device *pdev) { - return snd_soc_register_platform(&davinci_soc_platform); + return snd_soc_register_platform(&pdev->dev, &davinci_soc_platform); } -module_init(davinci_soc_platform_init); -static void __exit davinci_soc_platform_exit(void) +static int __devexit davinci_soc_platform_remove(struct platform_device *pdev) { - snd_soc_unregister_platform(&davinci_soc_platform); + snd_soc_unregister_platform(&pdev->dev); + return 0; +} + +static struct platform_driver davinci_pcm_driver = { + .driver = { + .name = "davinci-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = davinci_soc_platform_probe, + .remove = __devexit_p(davinci_soc_platform_remove), +}; + +static int __init snd_davinci_pcm_init(void) +{ + return platform_driver_register(&davinci_pcm_driver); +} +module_init(snd_davinci_pcm_init); + +static void __exit snd_davinci_pcm_exit(void) +{ + platform_driver_unregister(&davinci_pcm_driver); } -module_exit(davinci_soc_platform_exit); +module_exit(snd_davinci_pcm_exit); MODULE_AUTHOR("Vladimir Barinov"); MODULE_DESCRIPTION("TI DAVINCI PCM DMA module"); diff --git a/sound/soc/davinci/davinci-pcm.h b/sound/soc/davinci/davinci-pcm.h index b799a02333d8..c0d6c9be4b4d 100644 --- a/sound/soc/davinci/davinci-pcm.h +++ b/sound/soc/davinci/davinci-pcm.h @@ -28,7 +28,4 @@ struct davinci_pcm_dma_params { unsigned int fifo_level; }; - -extern struct snd_soc_platform davinci_soc_platform; - #endif diff --git a/sound/soc/davinci/davinci-sffsdr.c b/sound/soc/davinci/davinci-sffsdr.c index 40eccfe9e358..997c54f3693c 100644 --- a/sound/soc/davinci/davinci-sffsdr.c +++ b/sound/soc/davinci/davinci-sffsdr.c @@ -29,7 +29,6 @@ #include #endif -#include #include #include "../codecs/pcm3008.h" @@ -48,7 +47,7 @@ static int sffsdr_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int fs; int ret = 0; @@ -85,15 +84,16 @@ static struct snd_soc_ops sffsdr_ops = { static struct snd_soc_dai_link sffsdr_dai = { .name = "PCM3008", /* Codec name */ .stream_name = "PCM3008 HiFi", - .cpu_dai = &davinci_i2s_dai, - .codec_dai = &pcm3008_dai, + .cpu_dai_name = "davinci-asp.0", + .codec_dai_name = "pcm3008-hifi", + .codec_name = "pcm3008-codec", + .platform_name = "davinci-pcm-audio", .ops = &sffsdr_ops, }; /* davinci-sffsdr audio machine driver */ static struct snd_soc_card snd_soc_sffsdr = { .name = "DaVinci SFFSDR", - .platform = &davinci_soc_platform, .dai_link = &sffsdr_dai, .num_links = 1, }; @@ -106,11 +106,12 @@ static struct pcm3008_setup_data sffsdr_pcm3008_setup = { .pdda_pin = GPIO(38), }; -/* sffsdr audio subsystem */ -static struct snd_soc_device sffsdr_snd_devdata = { - .card = &snd_soc_sffsdr, - .codec_dev = &soc_codec_dev_pcm3008, - .codec_data = &sffsdr_pcm3008_setup, +struct platform_device pcm3008_codec = { + .name = "pcm3008-codec", + .id = 0, + .dev = { + .platform_data = &sffsdr_pcm3008_setup, + }, }; static struct resource sffsdr_snd_resources[] = { @@ -135,14 +136,15 @@ static int __init sffsdr_init(void) if (!machine_is_sffsdr()) return -EINVAL; + platform_device_register(&pcm3008_codec); + sffsdr_snd_device = platform_device_alloc("soc-audio", 0); if (!sffsdr_snd_device) { printk(KERN_ERR "platform device allocation failed\n"); return -ENOMEM; } - platform_set_drvdata(sffsdr_snd_device, &sffsdr_snd_devdata); - sffsdr_snd_devdata.dev = &sffsdr_snd_device->dev; + platform_set_drvdata(sffsdr_snd_device, &snd_soc_sffsdr); platform_device_add_data(sffsdr_snd_device, &sffsdr_snd_data, sizeof(sffsdr_snd_data)); @@ -168,6 +170,7 @@ error: static void __exit sffsdr_exit(void) { platform_device_unregister(sffsdr_snd_device); + platform_device_unregister(&pcm3008_codec); } module_init(sffsdr_init); diff --git a/sound/soc/davinci/davinci-vcif.c b/sound/soc/davinci/davinci-vcif.c index 48678533da7a..ea232f6a2c21 100644 --- a/sound/soc/davinci/davinci-vcif.c +++ b/sound/soc/davinci/davinci-vcif.c @@ -36,7 +36,6 @@ #include "davinci-pcm.h" #include "davinci-i2s.h" -#include "davinci-vcif.h" #define MOD_REG_BIT(val, mask, set) do { \ if (set) { \ @@ -55,7 +54,7 @@ static void davinci_vcif_start(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct davinci_vcif_dev *davinci_vcif_dev = - rtd->dai->cpu_dai->private_data; + snd_soc_dai_get_drvdata(rtd->cpu_dai); struct davinci_vc *davinci_vc = davinci_vcif_dev->davinci_vc; u32 w; @@ -74,7 +73,7 @@ static void davinci_vcif_stop(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct davinci_vcif_dev *davinci_vcif_dev = - rtd->dai->cpu_dai->private_data; + snd_soc_dai_get_drvdata(rtd->cpu_dai); struct davinci_vc *davinci_vc = davinci_vcif_dev->davinci_vc; u32 w; @@ -92,12 +91,15 @@ static int davinci_vcif_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct davinci_vcif_dev *davinci_vcif_dev = dai->private_data; + struct davinci_vcif_dev *davinci_vcif_dev = snd_soc_dai_get_drvdata(dai); struct davinci_vc *davinci_vc = davinci_vcif_dev->davinci_vc; struct davinci_pcm_dma_params *dma_params = &davinci_vcif_dev->dma_params[substream->stream]; u32 w; + dai->capture_dma_data = davinci_vcif_dev->dma_params; + dai->playback_dma_data = davinci_vcif_dev->dma_params; + /* Restart the codec before setup */ davinci_vcif_stop(substream); davinci_vcif_start(substream); @@ -179,8 +181,7 @@ static struct snd_soc_dai_ops davinci_vcif_dai_ops = { .hw_params = davinci_vcif_hw_params, }; -struct snd_soc_dai davinci_vcif_dai = { - .name = "davinci-vcif", +static struct snd_soc_dai_driver davinci_vcif_dai = { .playback = { .channels_min = 1, .channels_max = 2, @@ -194,7 +195,6 @@ struct snd_soc_dai davinci_vcif_dai = { .ops = &davinci_vcif_dai_ops, }; -EXPORT_SYMBOL_GPL(davinci_vcif_dai); static int davinci_vcif_probe(struct platform_device *pdev) { @@ -222,12 +222,9 @@ static int davinci_vcif_probe(struct platform_device *pdev) davinci_vcif_dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].dma_addr = davinci_vc->davinci_vcif.dma_rx_addr; - davinci_vcif_dai.dev = &pdev->dev; - davinci_vcif_dai.capture.dma_data = davinci_vcif_dev->dma_params; - davinci_vcif_dai.playback.dma_data = davinci_vcif_dev->dma_params; - davinci_vcif_dai.private_data = davinci_vcif_dev; + dev_set_drvdata(&pdev->dev, davinci_vcif_dev); - ret = snd_soc_register_dai(&davinci_vcif_dai); + ret = snd_soc_register_dai(&pdev->dev, &davinci_vcif_dai); if (ret != 0) { dev_err(&pdev->dev, "could not register dai\n"); goto fail; @@ -243,7 +240,7 @@ fail: static int davinci_vcif_remove(struct platform_device *pdev) { - snd_soc_unregister_dai(&davinci_vcif_dai); + snd_soc_unregister_dai(&pdev->dev); return 0; } @@ -252,7 +249,7 @@ static struct platform_driver davinci_vcif_driver = { .probe = davinci_vcif_probe, .remove = davinci_vcif_remove, .driver = { - .name = "davinci_vcif", + .name = "davinci-vcif", .owner = THIS_MODULE, }, }; diff --git a/sound/soc/davinci/davinci-vcif.h b/sound/soc/davinci/davinci-vcif.h deleted file mode 100644 index 571c9948724f..000000000000 --- a/sound/soc/davinci/davinci-vcif.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * ALSA SoC Voice Codec Interface for TI DAVINCI processor - * - * Copyright (C) 2010 Texas Instruments. - * - * Author: Miguel Aguilar - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _DAVINCI_VCIF_H -#define _DAVINCI_VCIF_H - -extern struct snd_soc_dai davinci_vcif_dai; - -#endif diff --git a/sound/soc/ep93xx/ep93xx-i2s.c b/sound/soc/ep93xx/ep93xx-i2s.c index 00b946632184..4f4873359613 100644 --- a/sound/soc/ep93xx/ep93xx-i2s.c +++ b/sound/soc/ep93xx/ep93xx-i2s.c @@ -31,7 +31,6 @@ #include #include "ep93xx-pcm.h" -#include "ep93xx-i2s.h" #define EP93XX_I2S_TXCLKCFG 0x00 #define EP93XX_I2S_RXCLKCFG 0x04 @@ -145,8 +144,8 @@ static int ep93xx_i2s_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct ep93xx_i2s_info *info = rtd->dai->cpu_dai->private_data; + struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(dai); + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; snd_soc_dai_set_dma_data(cpu_dai, substream, &info->dma_params[substream->stream]); @@ -156,8 +155,7 @@ static int ep93xx_i2s_startup(struct snd_pcm_substream *substream, static void ep93xx_i2s_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct ep93xx_i2s_info *info = rtd->dai->cpu_dai->private_data; + struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(dai); ep93xx_i2s_disable(info, substream->stream); } @@ -165,7 +163,7 @@ static void ep93xx_i2s_shutdown(struct snd_pcm_substream *substream, static int ep93xx_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { - struct ep93xx_i2s_info *info = cpu_dai->private_data; + struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(cpu_dai); unsigned int clk_cfg, lin_ctrl; clk_cfg = ep93xx_i2s_read_reg(info, EP93XX_I2S_RXCLKCFG); @@ -242,9 +240,7 @@ static int ep93xx_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct ep93xx_i2s_info *info = cpu_dai->private_data; + struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(dai); unsigned word_len, div, sdiv, lrdiv; int found = 0, err; @@ -302,7 +298,7 @@ out: static int ep93xx_i2s_set_sysclk(struct snd_soc_dai *cpu_dai, int clk_id, unsigned int freq, int dir) { - struct ep93xx_i2s_info *info = cpu_dai->private_data; + struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(cpu_dai); if (dir == SND_SOC_CLOCK_IN || clk_id != 0) return -EINVAL; @@ -313,7 +309,7 @@ static int ep93xx_i2s_set_sysclk(struct snd_soc_dai *cpu_dai, int clk_id, #ifdef CONFIG_PM static int ep93xx_i2s_suspend(struct snd_soc_dai *dai) { - struct ep93xx_i2s_info *info = dai->private_data; + struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(dai); if (!dai->active) return; @@ -324,7 +320,7 @@ static int ep93xx_i2s_suspend(struct snd_soc_dai *dai) static int ep93xx_i2s_resume(struct snd_soc_dai *dai) { - struct ep93xx_i2s_info *info = dai->private_data; + struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(dai); if (!dai->active) return; @@ -349,9 +345,7 @@ static struct snd_soc_dai_ops ep93xx_i2s_dai_ops = { SNDRV_PCM_FMTBIT_S24_LE | \ SNDRV_PCM_FMTBIT_S32_LE) -struct snd_soc_dai ep93xx_i2s_dai = { - .name = "ep93xx-i2s", - .id = 0, +static struct snd_soc_dai_driver ep93xx_i2s_dai = { .symmetric_rates= 1, .suspend = ep93xx_i2s_suspend, .resume = ep93xx_i2s_resume, @@ -369,7 +363,6 @@ struct snd_soc_dai ep93xx_i2s_dai = { }, .ops = &ep93xx_i2s_dai_ops, }; -EXPORT_SYMBOL_GPL(ep93xx_i2s_dai); static int ep93xx_i2s_probe(struct platform_device *pdev) { @@ -383,8 +376,7 @@ static int ep93xx_i2s_probe(struct platform_device *pdev) goto fail; } - ep93xx_i2s_dai.dev = &pdev->dev; - ep93xx_i2s_dai.private_data = info; + dev_set_drvdata(&pdev->dev, info); info->dma_params = ep93xx_i2s_dma_params; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -424,7 +416,7 @@ static int ep93xx_i2s_probe(struct platform_device *pdev) goto fail_put_sclk; } - err = snd_soc_register_dai(&ep93xx_i2s_dai); + err = snd_soc_register_dai(&pdev->dev, &ep93xx_i2s_dai); if (err) goto fail_put_lrclk; @@ -447,9 +439,9 @@ fail: static int __devexit ep93xx_i2s_remove(struct platform_device *pdev) { - struct ep93xx_i2s_info *info = ep93xx_i2s_dai.private_data; + struct ep93xx_i2s_info *info = dev_get_drvdata(&pdev->dev); - snd_soc_unregister_dai(&ep93xx_i2s_dai); + snd_soc_unregister_dai(&pdev->dev); clk_put(info->lrclk); clk_put(info->sclk); clk_put(info->mclk); diff --git a/sound/soc/ep93xx/ep93xx-i2s.h b/sound/soc/ep93xx/ep93xx-i2s.h deleted file mode 100644 index 3bd4ebfaa1de..000000000000 --- a/sound/soc/ep93xx/ep93xx-i2s.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * linux/sound/soc/ep93xx-i2s.h - * EP93xx I2S driver - * - * Copyright (C) 2010 Ryan Mallon - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#ifndef _EP93XX_SND_SOC_I2S_H -#define _EP93XX_SND_SOC_I2S_H - -extern struct snd_soc_dai ep93xx_i2s_dai; - -#endif /* _EP93XX_SND_SOC_I2S_H */ diff --git a/sound/soc/ep93xx/ep93xx-pcm.c b/sound/soc/ep93xx/ep93xx-pcm.c index 4ba938400791..2f121ddbe4bb 100644 --- a/sound/soc/ep93xx/ep93xx-pcm.c +++ b/sound/soc/ep93xx/ep93xx-pcm.c @@ -95,7 +95,7 @@ static void ep93xx_pcm_buffer_finished(void *cookie, static int ep93xx_pcm_open(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *soc_rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = soc_rtd->dai->cpu_dai; + struct snd_soc_dai *cpu_dai = soc_rtd->cpu_dai; struct ep93xx_pcm_dma_params *dma_params; struct ep93xx_runtime_data *rtd; int ret; @@ -276,14 +276,14 @@ static int ep93xx_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = 0xffffffff; - if (dai->playback.channels_min) { + if (dai->driver->playback.channels_min) { ret = ep93xx_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_PLAYBACK); if (ret) return ret; } - if (dai->capture.channels_min) { + if (dai->driver->capture.channels_min) { ret = ep93xx_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_CAPTURE); if (ret) @@ -293,22 +293,41 @@ static int ep93xx_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, return 0; } -struct snd_soc_platform ep93xx_soc_platform = { - .name = "ep93xx-audio", - .pcm_ops = &ep93xx_pcm_ops, +static struct snd_soc_platform_driver ep93xx_soc_platform = { + .ops = &ep93xx_pcm_ops, .pcm_new = &ep93xx_pcm_new, .pcm_free = &ep93xx_pcm_free_dma_buffers, }; -EXPORT_SYMBOL_GPL(ep93xx_soc_platform); + +static int __devinit ep93xx_soc_platform_probe(struct platform_device *pdev) +{ + return snd_soc_register_platform(&pdev->dev, &ep93xx_soc_platform); +} + +static int __devexit ep93xx_soc_platform_remove(struct platform_device *pdev) +{ + snd_soc_unregister_platform(&pdev->dev); + return 0; +} + +static struct platform_driver ep93xx_pcm_driver = { + .driver = { + .name = "ep93xx-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = ep93xx_soc_platform_probe, + .remove = __devexit_p(ep93xx_soc_platform_remove), +}; static int __init ep93xx_soc_platform_init(void) { - return snd_soc_register_platform(&ep93xx_soc_platform); + return platform_driver_register(&ep93xx_pcm_driver); } static void __exit ep93xx_soc_platform_exit(void) { - snd_soc_unregister_platform(&ep93xx_soc_platform); + platform_driver_unregister(&ep93xx_pcm_driver); } module_init(ep93xx_soc_platform_init); diff --git a/sound/soc/ep93xx/ep93xx-pcm.h b/sound/soc/ep93xx/ep93xx-pcm.h index 4ffdd3f62fe9..111e1121ecb8 100644 --- a/sound/soc/ep93xx/ep93xx-pcm.h +++ b/sound/soc/ep93xx/ep93xx-pcm.h @@ -17,6 +17,4 @@ struct ep93xx_pcm_dma_params { int dma_port; }; -extern struct snd_soc_platform ep93xx_soc_platform; - #endif /* _EP93XX_SND_SOC_PCM_H */ diff --git a/sound/soc/ep93xx/snappercl15.c b/sound/soc/ep93xx/snappercl15.c index 64955340ff75..28ab5ff772ac 100644 --- a/sound/soc/ep93xx/snappercl15.c +++ b/sound/soc/ep93xx/snappercl15.c @@ -22,7 +22,6 @@ #include "../codecs/tlv320aic23.h" #include "ep93xx-pcm.h" -#include "ep93xx-i2s.h" #define CODEC_CLOCK 5644800 @@ -30,8 +29,8 @@ static int snappercl15_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int err; err = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | @@ -77,8 +76,10 @@ static const struct snd_soc_dapm_route audio_map[] = { {"MICIN", NULL, "Mic Jack"}, }; -static int snappercl15_tlv320aic23_init(struct snd_soc_codec *codec) +static int snappercl15_tlv320aic23_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; + snd_soc_dapm_new_controls(codec, tlv320aic23_dapm_widgets, ARRAY_SIZE(tlv320aic23_dapm_widgets)); @@ -89,24 +90,20 @@ static int snappercl15_tlv320aic23_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link snappercl15_dai = { .name = "tlv320aic23", .stream_name = "AIC23", - .cpu_dai = &ep93xx_i2s_dai, - .codec_dai = &tlv320aic23_dai, + .cpu_dai_name = "ep93xx-i2s", + .codec_dai_name = "tlv320aic23-hifi", + .codec_name = "tlv320aic23-codec.0-001a", + .platform_name = "ep93xx-pcm-audio", .init = snappercl15_tlv320aic23_init, .ops = &snappercl15_ops, }; static struct snd_soc_card snd_soc_snappercl15 = { .name = "Snapper CL15", - .platform = &ep93xx_soc_platform, .dai_link = &snappercl15_dai, .num_links = 1, }; -static struct snd_soc_device snappercl15_snd_devdata = { - .card = &snd_soc_snappercl15, - .codec_dev = &soc_codec_dev_tlv320aic23, -}; - static struct platform_device *snappercl15_snd_device; static int __init snappercl15_init(void) @@ -126,8 +123,7 @@ static int __init snappercl15_init(void) if (!snappercl15_snd_device) return -ENOMEM; - platform_set_drvdata(snappercl15_snd_device, &snappercl15_snd_devdata); - snappercl15_snd_devdata.dev = &snappercl15_snd_device->dev; + platform_set_drvdata(snappercl15_snd_device, &snd_soc_snappercl15); ret = platform_device_add(snappercl15_snd_device); if (ret) platform_device_put(snappercl15_snd_device); diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig index 8cb65ccad35f..981868700388 100644 --- a/sound/soc/fsl/Kconfig +++ b/sound/soc/fsl/Kconfig @@ -1,6 +1,3 @@ -config SND_SOC_OF_SIMPLE - tristate - config SND_MPC52xx_DMA tristate diff --git a/sound/soc/fsl/Makefile b/sound/soc/fsl/Makefile index a83a73967ec6..7e472a53fcd3 100644 --- a/sound/soc/fsl/Makefile +++ b/sound/soc/fsl/Makefile @@ -1,6 +1,3 @@ -# Simple machine driver that extracts configuration from the OF device tree -obj-$(CONFIG_SND_SOC_OF_SIMPLE) += soc-of-simple.o - # MPC8610 HPCD Machine Support snd-soc-mpc8610-hpcd-objs := mpc8610_hpcd.o obj-$(CONFIG_SND_SOC_MPC8610_HPCD) += snd-soc-mpc8610-hpcd.o diff --git a/sound/soc/fsl/efika-audio-fabric.c b/sound/soc/fsl/efika-audio-fabric.c index 1a5b8e0d6a34..53251e6b5bd5 100644 --- a/sound/soc/fsl/efika-audio-fabric.c +++ b/sound/soc/fsl/efika-audio-fabric.c @@ -24,7 +24,6 @@ #include #include #include -#include #include "mpc5200_dma.h" #include "mpc5200_psc_ac97.h" @@ -32,21 +31,24 @@ #define DRV_NAME "efika-audio-fabric" -static struct snd_soc_device device; static struct snd_soc_card card; static struct snd_soc_dai_link efika_fabric_dai[] = { { .name = "AC97", .stream_name = "AC97 Analog", - .codec_dai = &stac9766_dai[STAC9766_DAI_AC97_ANALOG], - .cpu_dai = &psc_ac97_dai[MPC5200_AC97_NORMAL], + .codec_dai_name = "stac9766-hifi-analog", + .cpu_dai_name = "mpc5200-psc-ac97.0", + .platform_name = "mpc5200-pcm-audio", + .codec_name = "stac9766-codec", }, { .name = "AC97", .stream_name = "AC97 IEC958", - .codec_dai = &stac9766_dai[STAC9766_DAI_AC97_DIGITAL], - .cpu_dai = &psc_ac97_dai[MPC5200_AC97_SPDIF], + .codec_dai_name = "stac9766-hifi-IEC958", + .cpu_dai_name = "mpc5200-psc-ac97.1", + .platform_name = "mpc5200-pcm-audio", + .codec_name = "stac9766-codec", }, }; @@ -58,13 +60,10 @@ static __init int efika_fabric_init(void) if (!of_machine_is_compatible("bplan,efika")) return -ENODEV; - card.platform = &mpc5200_audio_dma_platform; card.name = "Efika"; card.dai_link = efika_fabric_dai; card.num_links = ARRAY_SIZE(efika_fabric_dai); - device.card = &card; - device.codec_dev = &soc_codec_dev_stac9766; pdev = platform_device_alloc("soc-audio", 1); if (!pdev) { @@ -72,8 +71,7 @@ static __init int efika_fabric_init(void) return -ENODEV; } - platform_set_drvdata(pdev, &device); - device.dev = &pdev->dev; + platform_set_drvdata(pdev, &card); rc = platform_device_add(pdev); if (rc) { diff --git a/sound/soc/fsl/fsl_dma.c b/sound/soc/fsl/fsl_dma.c index 410c7496a18d..d09e1941b1fa 100644 --- a/sound/soc/fsl/fsl_dma.c +++ b/sound/soc/fsl/fsl_dma.c @@ -3,10 +3,11 @@ * * Author: Timur Tabi * - * Copyright 2007-2008 Freescale Semiconductor, Inc. This file is licensed - * under the terms of the GNU General Public License version 2. This - * program is licensed "as is" without any warranty of any kind, whether - * express or implied. + * Copyright 2007-2010 Freescale Semiconductor, Inc. + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. * * This driver implements ASoC support for the Elo DMA controller, which is * the DMA controller on Freescale 83xx, 85xx, and 86xx SOCs. In ALSA terms, @@ -20,6 +21,8 @@ #include #include #include +#include +#include #include #include @@ -29,6 +32,7 @@ #include #include "fsl_dma.h" +#include "fsl_ssi.h" /* For the offset of stx0 and srx0 */ /* * The formats that the DMA controller supports, which is anything @@ -52,26 +56,16 @@ #define FSLDMA_PCM_RATES (SNDRV_PCM_RATE_5512 | SNDRV_PCM_RATE_8000_192000 | \ SNDRV_PCM_RATE_CONTINUOUS) -/* DMA global data. This structure is used by fsl_dma_open() to determine - * which DMA channels to assign to a substream. Unfortunately, ASoC V1 does - * not allow the machine driver to provide this information to the PCM - * driver in advance, and there's no way to differentiate between the two - * DMA controllers. So for now, this driver only supports one SSI device - * using two DMA channels. We cannot support multiple DMA devices. - * - * ssi_stx_phys: bus address of SSI STX register - * ssi_srx_phys: bus address of SSI SRX register - * dma_channel: pointer to the DMA channel's registers - * irq: IRQ for this DMA channel - * assigned: set to 1 if that DMA channel is assigned to a substream - */ -static struct { +struct dma_object { + struct list_head list; + struct snd_soc_platform_driver dai; dma_addr_t ssi_stx_phys; dma_addr_t ssi_srx_phys; - struct ccsr_dma_channel __iomem *dma_channel[2]; - unsigned int irq[2]; - unsigned int assigned[2]; -} dma_global_data; + struct ccsr_dma_channel __iomem *channel; + unsigned int irq; + bool assigned; + char path[1]; +}; /* * The number of DMA links to use. Two is the bare minimum, but if you @@ -88,8 +82,6 @@ static struct { * structure. * * @link[]: array of link descriptors - * @controller_id: which DMA controller (0, 1, ...) - * @channel_id: which DMA channel on the controller (0, 1, 2, ...) * @dma_channel: pointer to the DMA channel's registers * @irq: IRQ for this DMA channel * @substream: pointer to the substream object, needed by the ISR @@ -104,8 +96,6 @@ static struct { */ struct fsl_dma_private { struct fsl_dma_link_descriptor link[NUM_DMA_LINKS]; - unsigned int controller_id; - unsigned int channel_id; struct ccsr_dma_channel __iomem *dma_channel; unsigned int irq; struct snd_pcm_substream *substream; @@ -212,6 +202,9 @@ static void fsl_dma_update_pointers(struct fsl_dma_private *dma_private) static irqreturn_t fsl_dma_isr(int irq, void *dev_id) { struct fsl_dma_private *dma_private = dev_id; + struct snd_pcm_substream *substream = dma_private->substream; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct device *dev = rtd->platform->dev; struct ccsr_dma_channel __iomem *dma_channel = dma_private->dma_channel; irqreturn_t ret = IRQ_NONE; u32 sr, sr2 = 0; @@ -222,11 +215,8 @@ static irqreturn_t fsl_dma_isr(int irq, void *dev_id) sr = in_be32(&dma_channel->sr); if (sr & CCSR_DMA_SR_TE) { - dev_err(dma_private->substream->pcm->card->dev, - "DMA transmit error (controller=%u channel=%u irq=%u\n", - dma_private->controller_id, - dma_private->channel_id, irq); - fsl_dma_abort_stream(dma_private->substream); + dev_err(dev, "dma transmit error\n"); + fsl_dma_abort_stream(substream); sr2 |= CCSR_DMA_SR_TE; ret = IRQ_HANDLED; } @@ -235,11 +225,8 @@ static irqreturn_t fsl_dma_isr(int irq, void *dev_id) ret = IRQ_HANDLED; if (sr & CCSR_DMA_SR_PE) { - dev_err(dma_private->substream->pcm->card->dev, - "DMA%u programming error (channel=%u irq=%u)\n", - dma_private->controller_id, - dma_private->channel_id, irq); - fsl_dma_abort_stream(dma_private->substream); + dev_err(dev, "dma programming error\n"); + fsl_dma_abort_stream(substream); sr2 |= CCSR_DMA_SR_PE; ret = IRQ_HANDLED; } @@ -253,8 +240,6 @@ static irqreturn_t fsl_dma_isr(int irq, void *dev_id) ret = IRQ_HANDLED; if (sr & CCSR_DMA_SR_EOSI) { - struct snd_pcm_substream *substream = dma_private->substream; - /* Tell ALSA we completed a period. */ snd_pcm_period_elapsed(substream); @@ -305,10 +290,8 @@ static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai, fsl_dma_hardware.buffer_bytes_max, &pcm->streams[0].substream->dma_buffer); if (ret) { - dev_err(card->dev, - "Can't allocate playback DMA buffer (size=%u)\n", - fsl_dma_hardware.buffer_bytes_max); - return -ENOMEM; + dev_err(card->dev, "can't allocate playback dma buffer\n"); + return ret; } ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev, @@ -316,10 +299,8 @@ static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai, &pcm->streams[1].substream->dma_buffer); if (ret) { snd_dma_free_pages(&pcm->streams[0].substream->dma_buffer); - dev_err(card->dev, - "Can't allocate capture DMA buffer (size=%u)\n", - fsl_dma_hardware.buffer_bytes_max); - return -ENOMEM; + dev_err(card->dev, "can't allocate capture dma buffer\n"); + return ret; } return 0; @@ -390,6 +371,10 @@ static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai, static int fsl_dma_open(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct device *dev = rtd->platform->dev; + struct dma_object *dma = + container_of(rtd->platform->driver, struct dma_object, dai); struct fsl_dma_private *dma_private; struct ccsr_dma_channel __iomem *dma_channel; dma_addr_t ld_buf_phys; @@ -407,52 +392,44 @@ static int fsl_dma_open(struct snd_pcm_substream *substream) ret = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); if (ret < 0) { - dev_err(substream->pcm->card->dev, "invalid buffer size\n"); + dev_err(dev, "invalid buffer size\n"); return ret; } channel = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1; - if (dma_global_data.assigned[channel]) { - dev_err(substream->pcm->card->dev, - "DMA channel already assigned\n"); + if (dma->assigned) { + dev_err(dev, "dma channel already assigned\n"); return -EBUSY; } - dma_private = dma_alloc_coherent(substream->pcm->card->dev, - sizeof(struct fsl_dma_private), &ld_buf_phys, GFP_KERNEL); + dma_private = dma_alloc_coherent(dev, sizeof(struct fsl_dma_private), + &ld_buf_phys, GFP_KERNEL); if (!dma_private) { - dev_err(substream->pcm->card->dev, - "can't allocate DMA private data\n"); + dev_err(dev, "can't allocate dma private data\n"); return -ENOMEM; } if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dma_private->ssi_sxx_phys = dma_global_data.ssi_stx_phys; + dma_private->ssi_sxx_phys = dma->ssi_stx_phys; else - dma_private->ssi_sxx_phys = dma_global_data.ssi_srx_phys; + dma_private->ssi_sxx_phys = dma->ssi_srx_phys; - dma_private->dma_channel = dma_global_data.dma_channel[channel]; - dma_private->irq = dma_global_data.irq[channel]; + dma_private->dma_channel = dma->channel; + dma_private->irq = dma->irq; dma_private->substream = substream; dma_private->ld_buf_phys = ld_buf_phys; dma_private->dma_buf_phys = substream->dma_buffer.addr; - /* We only support one DMA controller for now */ - dma_private->controller_id = 0; - dma_private->channel_id = channel; - ret = request_irq(dma_private->irq, fsl_dma_isr, 0, "DMA", dma_private); if (ret) { - dev_err(substream->pcm->card->dev, - "can't register ISR for IRQ %u (ret=%i)\n", + dev_err(dev, "can't register ISR for IRQ %u (ret=%i)\n", dma_private->irq, ret); - dma_free_coherent(substream->pcm->card->dev, - sizeof(struct fsl_dma_private), + dma_free_coherent(dev, sizeof(struct fsl_dma_private), dma_private, dma_private->ld_buf_phys); return ret; } - dma_global_data.assigned[channel] = 1; + dma->assigned = 1; snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); snd_soc_set_runtime_hwparams(substream, &fsl_dma_hardware); @@ -546,6 +523,8 @@ static int fsl_dma_hw_params(struct snd_pcm_substream *substream, { struct snd_pcm_runtime *runtime = substream->runtime; struct fsl_dma_private *dma_private = runtime->private_data; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct device *dev = rtd->platform->dev; /* Number of bits per sample */ unsigned int sample_size = @@ -606,8 +585,7 @@ static int fsl_dma_hw_params(struct snd_pcm_substream *substream, break; default: /* We should never get here */ - dev_err(substream->pcm->card->dev, - "unsupported sample size %u\n", sample_size); + dev_err(dev, "unsupported sample size %u\n", sample_size); return -EINVAL; } @@ -689,6 +667,8 @@ static snd_pcm_uframes_t fsl_dma_pointer(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct fsl_dma_private *dma_private = runtime->private_data; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct device *dev = rtd->platform->dev; struct ccsr_dma_channel __iomem *dma_channel = dma_private->dma_channel; dma_addr_t position; snd_pcm_uframes_t frames; @@ -710,8 +690,7 @@ static snd_pcm_uframes_t fsl_dma_pointer(struct snd_pcm_substream *substream) if ((position < dma_private->dma_buf_phys) || (position > dma_private->dma_buf_end)) { - dev_err(substream->pcm->card->dev, - "dma pointer is out of range, halting stream\n"); + dev_err(dev, "dma pointer is out of range, halting stream\n"); return SNDRV_PCM_POS_XRUN; } @@ -772,26 +751,28 @@ static int fsl_dma_close(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct fsl_dma_private *dma_private = runtime->private_data; - int dir = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct device *dev = rtd->platform->dev; + struct dma_object *dma = + container_of(rtd->platform->driver, struct dma_object, dai); if (dma_private) { if (dma_private->irq) free_irq(dma_private->irq, dma_private); if (dma_private->ld_buf_phys) { - dma_unmap_single(substream->pcm->card->dev, - dma_private->ld_buf_phys, - sizeof(dma_private->link), DMA_TO_DEVICE); + dma_unmap_single(dev, dma_private->ld_buf_phys, + sizeof(dma_private->link), + DMA_TO_DEVICE); } /* Deallocate the fsl_dma_private structure */ - dma_free_coherent(substream->pcm->card->dev, - sizeof(struct fsl_dma_private), - dma_private, dma_private->ld_buf_phys); + dma_free_coherent(dev, sizeof(struct fsl_dma_private), + dma_private, dma_private->ld_buf_phys); substream->runtime->private_data = NULL; } - dma_global_data.assigned[dir] = 0; + dma->assigned = 0; return 0; } @@ -814,6 +795,40 @@ static void fsl_dma_free_dma_buffers(struct snd_pcm *pcm) } } +/* List of DMA nodes that we've probed */ +static LIST_HEAD(dma_list); + +/** + * find_ssi_node -- returns the SSI node that points to his DMA channel node + * + * Although this DMA driver attempts to operate independently of the other + * devices, it still needs to determine some information about the SSI device + * that it's working with. Unfortunately, the device tree does not contain + * a pointer from the DMA channel node to the SSI node -- the pointer goes the + * other way. So we need to scan the device tree for SSI nodes until we find + * the one that points to the given DMA channel node. It's ugly, but at least + * it's contained in this one function. + */ +static struct device_node *find_ssi_node(struct device_node *dma_channel_np) +{ + struct device_node *ssi_np, *np; + + for_each_compatible_node(ssi_np, NULL, "fsl,mpc8610-ssi") { + /* Check each DMA phandle to see if it points to us. We + * assume that device_node pointers are a valid comparison. + */ + np = of_parse_phandle(ssi_np, "fsl,playback-dma", 0); + if (np == dma_channel_np) + return ssi_np; + + np = of_parse_phandle(ssi_np, "fsl,capture-dma", 0); + if (np == dma_channel_np) + return ssi_np; + } + + return NULL; +} + static struct snd_pcm_ops fsl_dma_ops = { .open = fsl_dma_open, .close = fsl_dma_close, @@ -823,59 +838,112 @@ static struct snd_pcm_ops fsl_dma_ops = { .pointer = fsl_dma_pointer, }; -struct snd_soc_platform fsl_soc_platform = { - .name = "fsl-dma", - .pcm_ops = &fsl_dma_ops, - .pcm_new = fsl_dma_new, - .pcm_free = fsl_dma_free_dma_buffers, -}; -EXPORT_SYMBOL_GPL(fsl_soc_platform); +static int __devinit fsl_soc_dma_probe(struct of_device *of_dev, + const struct of_device_id *match) + { + struct dma_object *dma; + struct device_node *np = of_dev->dev.of_node; + struct device_node *ssi_np; + struct resource res; + int ret; -/** - * fsl_dma_configure: store the DMA parameters from the fabric driver. - * - * This function is called by the ASoC fabric driver to give us the DMA and - * SSI channel information. - * - * Unfortunately, ASoC V1 does make it possible to determine the DMA/SSI - * data when a substream is created, so for now we need to store this data - * into a global variable. This means that we can only support one DMA - * controller, and hence only one SSI. - */ -int fsl_dma_configure(struct fsl_dma_info *dma_info) + /* Find the SSI node that points to us. */ + ssi_np = find_ssi_node(np); + if (!ssi_np) { + dev_err(&of_dev->dev, "cannot find parent SSI node\n"); + return -ENODEV; + } + + ret = of_address_to_resource(ssi_np, 0, &res); + of_node_put(ssi_np); + if (ret) { + dev_err(&of_dev->dev, "could not determine device resources\n"); + return ret; + } + + dma = kzalloc(sizeof(*dma) + strlen(np->full_name), GFP_KERNEL); + if (!dma) { + dev_err(&of_dev->dev, "could not allocate dma object\n"); + return -ENOMEM; + } + + strcpy(dma->path, np->full_name); + dma->dai.ops = &fsl_dma_ops; + dma->dai.pcm_new = fsl_dma_new; + dma->dai.pcm_free = fsl_dma_free_dma_buffers; + + /* Store the SSI-specific information that we need */ + dma->ssi_stx_phys = res.start + offsetof(struct ccsr_ssi, stx0); + dma->ssi_srx_phys = res.start + offsetof(struct ccsr_ssi, srx0); + + ret = snd_soc_register_platform(&of_dev->dev, &dma->dai); + if (ret) { + dev_err(&of_dev->dev, "could not register platform\n"); + kfree(dma); + return ret; + } + + dma->channel = of_iomap(np, 0); + dma->irq = irq_of_parse_and_map(np, 0); + list_add(&dma->list, &dma_list); + + return 0; +} + +static int __devexit fsl_soc_dma_remove(struct of_device *of_dev) { - static int initialized; + struct list_head *n, *ptr; + struct dma_object *dma; - /* We only support one DMA controller for now */ - if (initialized) - return 0; + list_for_each_safe(ptr, n, &dma_list) { + dma = list_entry(ptr, struct dma_object, list); + list_del_init(ptr); + + snd_soc_unregister_platform(&of_dev->dev); + iounmap(dma->channel); + irq_dispose_mapping(dma->irq); + kfree(dma); + } - dma_global_data.ssi_stx_phys = dma_info->ssi_stx_phys; - dma_global_data.ssi_srx_phys = dma_info->ssi_srx_phys; - dma_global_data.dma_channel[0] = dma_info->dma_channel[0]; - dma_global_data.dma_channel[1] = dma_info->dma_channel[1]; - dma_global_data.irq[0] = dma_info->dma_irq[0]; - dma_global_data.irq[1] = dma_info->dma_irq[1]; - dma_global_data.assigned[0] = 0; - dma_global_data.assigned[1] = 0; - - initialized = 1; - return 1; + return 0; } -EXPORT_SYMBOL_GPL(fsl_dma_configure); -static int __init fsl_soc_platform_init(void) +static const struct of_device_id fsl_soc_dma_ids[] = { + { .compatible = "fsl,ssi-dma-channel", }, + {} +}; +MODULE_DEVICE_TABLE(of, fsl_soc_dma_ids); + +static struct of_platform_driver fsl_soc_dma_driver = { + .driver = { + .name = "fsl-pcm-audio", + .owner = THIS_MODULE, + .of_match_table = fsl_soc_dma_ids, + }, + .probe = fsl_soc_dma_probe, + .remove = __devexit_p(fsl_soc_dma_remove), +}; + +static int __init fsl_soc_dma_init(void) { - return snd_soc_register_platform(&fsl_soc_platform); + pr_info("Freescale Elo DMA ASoC PCM Driver\n"); + + return of_register_platform_driver(&fsl_soc_dma_driver); } -module_init(fsl_soc_platform_init); -static void __exit fsl_soc_platform_exit(void) +static void __exit fsl_soc_dma_exit(void) { - snd_soc_unregister_platform(&fsl_soc_platform); + of_unregister_platform_driver(&fsl_soc_dma_driver); } -module_exit(fsl_soc_platform_exit); + +/* We want the DMA driver to be initialized before the SSI driver, so that + * when the SSI driver calls fsl_soc_dma_dai_from_node(), the DMA driver + * will already have been probed. The easiest way to do that is to make the + * __init function called via arch_initcall(). + */ +module_init(fsl_soc_dma_init); +module_exit(fsl_soc_dma_exit); MODULE_AUTHOR("Timur Tabi "); -MODULE_DESCRIPTION("Freescale Elo DMA ASoC PCM module"); -MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Freescale Elo DMA ASoC PCM Driver"); +MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/fsl/fsl_dma.h b/sound/soc/fsl/fsl_dma.h index 385d4a42603c..78fee97e8036 100644 --- a/sound/soc/fsl/fsl_dma.h +++ b/sound/soc/fsl/fsl_dma.h @@ -126,24 +126,4 @@ struct fsl_dma_link_descriptor { u8 res[4]; /* Reserved */ } __attribute__ ((aligned(32), packed)); -/* DMA information needed to create a snd_soc_dai object - * - * ssi_stx_phys: bus address of SSI STX register to use - * ssi_srx_phys: bus address of SSI SRX register to use - * dma[0]: points to the DMA channel to use for playback - * dma[1]: points to the DMA channel to use for capture - * dma_irq[0]: IRQ of the DMA channel to use for playback - * dma_irq[1]: IRQ of the DMA channel to use for capture - */ -struct fsl_dma_info { - dma_addr_t ssi_stx_phys; - dma_addr_t ssi_srx_phys; - struct ccsr_dma_channel __iomem *dma_channel[2]; - unsigned int dma_irq[2]; -}; - -extern struct snd_soc_platform fsl_soc_platform; - -int fsl_dma_configure(struct fsl_dma_info *dma_info); - #endif diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index 762c1b8e8e4e..64f65910a7d7 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c @@ -3,10 +3,11 @@ * * Author: Timur Tabi * - * Copyright 2007-2008 Freescale Semiconductor, Inc. This file is licensed - * under the terms of the GNU General Public License version 2. This - * program is licensed "as is" without any warranty of any kind, whether - * express or implied. + * Copyright 2007-2010 Freescale Semiconductor, Inc. + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. */ #include @@ -15,6 +16,7 @@ #include #include #include +#include #include #include @@ -71,33 +73,31 @@ /** * fsl_ssi_private: per-SSI private data * - * @name: short name for this device ("SSI0", "SSI1", etc) * @ssi: pointer to the SSI's registers * @ssi_phys: physical address of the SSI registers * @irq: IRQ of this SSI * @first_stream: pointer to the stream that was opened first * @second_stream: pointer to second stream - * @dev: struct device pointer * @playback: the number of playback streams opened * @capture: the number of capture streams opened * @asynchronous: 0=synchronous mode, 1=asynchronous mode * @cpu_dai: the CPU DAI for this device * @dev_attr: the sysfs device attribute structure * @stats: SSI statistics + * @name: name for this device */ struct fsl_ssi_private { - char name[8]; struct ccsr_ssi __iomem *ssi; dma_addr_t ssi_phys; unsigned int irq; struct snd_pcm_substream *first_stream; struct snd_pcm_substream *second_stream; - struct device *dev; unsigned int playback; unsigned int capture; int asynchronous; - struct snd_soc_dai cpu_dai; + struct snd_soc_dai_driver cpu_dai_drv; struct device_attribute dev_attr; + struct platform_device *pdev; struct { unsigned int rfrc; @@ -122,6 +122,8 @@ struct fsl_ssi_private { unsigned int tfe1; unsigned int tfe0; } stats; + + char name[1]; }; /** @@ -280,7 +282,7 @@ static int fsl_ssi_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct fsl_ssi_private *ssi_private = rtd->dai->cpu_dai->private_data; + struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(rtd->cpu_dai); /* * If this is the first stream opened, then request the IRQ @@ -290,6 +292,7 @@ static int fsl_ssi_startup(struct snd_pcm_substream *substream, struct ccsr_ssi __iomem *ssi = ssi_private->ssi; int ret; + /* The 'name' should not have any slashes in it. */ ret = request_irq(ssi_private->irq, fsl_ssi_isr, 0, ssi_private->name, ssi_private); if (ret < 0) { @@ -422,7 +425,7 @@ static int fsl_ssi_startup(struct snd_pcm_substream *substream, static int fsl_ssi_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *hw_params, struct snd_soc_dai *cpu_dai) { - struct fsl_ssi_private *ssi_private = cpu_dai->private_data; + struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); if (substream == ssi_private->first_stream) { struct ccsr_ssi __iomem *ssi = ssi_private->ssi; @@ -458,7 +461,7 @@ static int fsl_ssi_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct fsl_ssi_private *ssi_private = rtd->dai->cpu_dai->private_data; + struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(rtd->cpu_dai); struct ccsr_ssi __iomem *ssi = ssi_private->ssi; switch (cmd) { @@ -497,7 +500,7 @@ static void fsl_ssi_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct fsl_ssi_private *ssi_private = rtd->dai->cpu_dai->private_data; + struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(rtd->cpu_dai); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ssi_private->playback--; @@ -523,56 +526,15 @@ static void fsl_ssi_shutdown(struct snd_pcm_substream *substream, } } -/** - * fsl_ssi_set_sysclk: set the clock frequency and direction - * - * This function is called by the machine driver to tell us what the clock - * frequency and direction are. - * - * Currently, we only support operating as a clock slave (SND_SOC_CLOCK_IN), - * and we don't care about the frequency. Return an error if the direction - * is not SND_SOC_CLOCK_IN. - * - * @clk_id: reserved, should be zero - * @freq: the frequency of the given clock ID, currently ignored - * @dir: SND_SOC_CLOCK_IN (clock slave) or SND_SOC_CLOCK_OUT (clock master) - */ -static int fsl_ssi_set_sysclk(struct snd_soc_dai *cpu_dai, - int clk_id, unsigned int freq, int dir) -{ - - return (dir == SND_SOC_CLOCK_IN) ? 0 : -EINVAL; -} - -/** - * fsl_ssi_set_fmt: set the serial format. - * - * This function is called by the machine driver to tell us what serial - * format to use. - * - * Currently, we only support I2S mode. Return an error if the format is - * not SND_SOC_DAIFMT_I2S. - * - * @format: one of SND_SOC_DAIFMT_xxx - */ -static int fsl_ssi_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int format) -{ - return (format == SND_SOC_DAIFMT_I2S) ? 0 : -EINVAL; -} - -/** - * fsl_ssi_dai_template: template CPU DAI for the SSI - */ static struct snd_soc_dai_ops fsl_ssi_dai_ops = { .startup = fsl_ssi_startup, .hw_params = fsl_ssi_hw_params, .shutdown = fsl_ssi_shutdown, .trigger = fsl_ssi_trigger, - .set_sysclk = fsl_ssi_set_sysclk, - .set_fmt = fsl_ssi_set_fmt, }; -static struct snd_soc_dai fsl_ssi_dai_template = { +/* Template for the CPU dai driver structure */ +static struct snd_soc_dai_driver fsl_ssi_dai_template = { .playback = { /* The SSI does not support monaural audio. */ .channels_min = 2, @@ -640,95 +602,176 @@ static ssize_t fsl_sysfs_ssi_show(struct device *dev, } /** - * fsl_ssi_create_dai: create a snd_soc_dai structure - * - * This function is called by the machine driver to create a snd_soc_dai - * structure. The function creates an ssi_private object, which contains - * the snd_soc_dai. It also creates the sysfs statistics device. + * Make every character in a string lower-case */ -struct snd_soc_dai *fsl_ssi_create_dai(struct fsl_ssi_info *ssi_info) +static void make_lowercase(char *s) +{ + char *p = s; + char c; + + while ((c = *p)) { + if ((c >= 'A') && (c <= 'Z')) + *p = c + ('a' - 'A'); + p++; + } +} + +static int __devinit fsl_ssi_probe(struct of_device *of_dev, + const struct of_device_id *match) { - struct snd_soc_dai *fsl_ssi_dai; struct fsl_ssi_private *ssi_private; int ret = 0; struct device_attribute *dev_attr; + struct device_node *np = of_dev->dev.of_node; + const char *p, *sprop; + struct resource res; + char name[64]; - ssi_private = kzalloc(sizeof(struct fsl_ssi_private), GFP_KERNEL); + /* We are only interested in SSIs with a codec phandle in them, so let's + * make sure this SSI has one. + */ + if (!of_get_property(np, "codec-handle", NULL)) + return -ENODEV; + + /* We only support the SSI in "I2S Slave" mode */ + sprop = of_get_property(np, "fsl,mode", NULL); + if (!sprop || strcmp(sprop, "i2s-slave")) { + dev_notice(&of_dev->dev, "mode %s is unsupported\n", sprop); + return -ENODEV; + } + + /* The DAI name is the last part of the full name of the node. */ + p = strrchr(np->full_name, '/') + 1; + ssi_private = kzalloc(sizeof(struct fsl_ssi_private) + strlen(p), + GFP_KERNEL); if (!ssi_private) { - dev_err(ssi_info->dev, "could not allocate DAI object\n"); - return NULL; + dev_err(&of_dev->dev, "could not allocate DAI object\n"); + return -ENOMEM; } - memcpy(&ssi_private->cpu_dai, &fsl_ssi_dai_template, - sizeof(struct snd_soc_dai)); - fsl_ssi_dai = &ssi_private->cpu_dai; - dev_attr = &ssi_private->dev_attr; + strcpy(ssi_private->name, p); - sprintf(ssi_private->name, "ssi%u", (u8) ssi_info->id); - ssi_private->ssi = ssi_info->ssi; - ssi_private->ssi_phys = ssi_info->ssi_phys; - ssi_private->irq = ssi_info->irq; - ssi_private->dev = ssi_info->dev; - ssi_private->asynchronous = ssi_info->asynchronous; + /* Initialize this copy of the CPU DAI driver structure */ + memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_dai_template, + sizeof(fsl_ssi_dai_template)); + ssi_private->cpu_dai_drv.name = ssi_private->name; + + /* Get the addresses and IRQ */ + ret = of_address_to_resource(np, 0, &res); + if (ret) { + dev_err(&of_dev->dev, "could not determine device resources\n"); + kfree(ssi_private); + return ret; + } + ssi_private->ssi = ioremap(res.start, 1 + res.end - res.start); + ssi_private->ssi_phys = res.start; + ssi_private->irq = irq_of_parse_and_map(np, 0); - dev_set_drvdata(ssi_private->dev, fsl_ssi_dai); + /* Are the RX and the TX clocks locked? */ + if (of_find_property(np, "fsl,ssi-asynchronous", NULL)) + ssi_private->asynchronous = 1; + else + ssi_private->cpu_dai_drv.symmetric_rates = 1; /* Initialize the the device_attribute structure */ - dev_attr->attr.name = "ssi-stats"; + dev_attr = &ssi_private->dev_attr; + dev_attr->attr.name = "statistics"; dev_attr->attr.mode = S_IRUGO; dev_attr->show = fsl_sysfs_ssi_show; - ret = device_create_file(ssi_private->dev, dev_attr); + ret = device_create_file(&of_dev->dev, dev_attr); if (ret) { - dev_err(ssi_info->dev, "could not create sysfs %s file\n", + dev_err(&of_dev->dev, "could not create sysfs %s file\n", ssi_private->dev_attr.attr.name); - kfree(fsl_ssi_dai); - return NULL; + kfree(ssi_private); + return ret; } - fsl_ssi_dai->private_data = ssi_private; - fsl_ssi_dai->name = ssi_private->name; - fsl_ssi_dai->id = ssi_info->id; - fsl_ssi_dai->dev = ssi_info->dev; - fsl_ssi_dai->symmetric_rates = 1; + /* Register with ASoC */ + dev_set_drvdata(&of_dev->dev, ssi_private); - ret = snd_soc_register_dai(fsl_ssi_dai); + ret = snd_soc_register_dai(&of_dev->dev, &ssi_private->cpu_dai_drv); if (ret != 0) { - dev_err(ssi_info->dev, "failed to register DAI: %d\n", ret); - kfree(fsl_ssi_dai); - return NULL; + dev_err(&of_dev->dev, "failed to register DAI: %d\n", ret); + kfree(ssi_private); + return ret; + } + + /* Trigger the machine driver's probe function. The platform driver + * name of the machine driver is taken from the /model property of the + * device tree. We also pass the address of the CPU DAI driver + * structure. + */ + sprop = of_get_property(of_find_node_by_path("/"), "model", NULL); + /* Sometimes the model name has a "fsl," prefix, so we strip that. */ + p = strrchr(sprop, ','); + if (p) + sprop = p + 1; + snprintf(name, sizeof(name), "snd-soc-%s", sprop); + make_lowercase(name); + + ssi_private->pdev = + platform_device_register_data(&of_dev->dev, name, 0, NULL, 0); + if (IS_ERR(ssi_private->pdev)) { + ret = PTR_ERR(ssi_private->pdev); + dev_err(&of_dev->dev, "failed to register platform: %d\n", ret); + kfree(ssi_private); + return ret; } - return fsl_ssi_dai; + return 0; } -EXPORT_SYMBOL_GPL(fsl_ssi_create_dai); /** * fsl_ssi_destroy_dai: destroy the snd_soc_dai object * - * This function undoes the operations of fsl_ssi_create_dai() + * This function undoes the operations of fsl_ssi_probe() */ -void fsl_ssi_destroy_dai(struct snd_soc_dai *fsl_ssi_dai) +static int fsl_ssi_remove(struct of_device *of_dev) { - struct fsl_ssi_private *ssi_private = - container_of(fsl_ssi_dai, struct fsl_ssi_private, cpu_dai); + struct fsl_ssi_private *ssi_private = dev_get_drvdata(&of_dev->dev); - device_remove_file(ssi_private->dev, &ssi_private->dev_attr); - - snd_soc_unregister_dai(&ssi_private->cpu_dai); + platform_device_unregister(ssi_private->pdev); + snd_soc_unregister_dai(&of_dev->dev); + device_remove_file(&of_dev->dev, &ssi_private->dev_attr); kfree(ssi_private); + dev_set_drvdata(&of_dev->dev, NULL); + + return 0; } -EXPORT_SYMBOL_GPL(fsl_ssi_destroy_dai); + +static const struct of_device_id fsl_ssi_ids[] = { + { .compatible = "fsl,mpc8610-ssi", }, + {} +}; +MODULE_DEVICE_TABLE(of, fsl_ssi_ids); + +static struct of_platform_driver fsl_ssi_driver = { + .driver = { + .name = "fsl-ssi-dai", + .owner = THIS_MODULE, + .of_match_table = fsl_ssi_ids, + }, + .probe = fsl_ssi_probe, + .remove = fsl_ssi_remove, +}; static int __init fsl_ssi_init(void) { printk(KERN_INFO "Freescale Synchronous Serial Interface (SSI) ASoC Driver\n"); - return 0; + return of_register_platform_driver(&fsl_ssi_driver); +} + +static void __exit fsl_ssi_exit(void) +{ + of_unregister_platform_driver(&fsl_ssi_driver); } + module_init(fsl_ssi_init); +module_exit(fsl_ssi_exit); MODULE_AUTHOR("Timur Tabi "); MODULE_DESCRIPTION("Freescale Synchronous Serial Interface (SSI) ASoC Driver"); -MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/fsl/fsl_ssi.h b/sound/soc/fsl/fsl_ssi.h index eade01feaab6..217300029b5b 100644 --- a/sound/soc/fsl/fsl_ssi.h +++ b/sound/soc/fsl/fsl_ssi.h @@ -196,31 +196,5 @@ struct ccsr_ssi { #define CCSR_SSI_SOR_WAIT(x) (((x) & 3) << CCSR_SSI_SOR_WAIT_SHIFT) #define CCSR_SSI_SOR_SYNRST 0x00000001 -/* Instantiation data for an SSI interface - * - * This structure contains all the information that the the SSI driver needs - * to instantiate an SSI interface with ALSA. The machine driver should - * create this structure, fill it in, call fsl_ssi_create_dai(), and then - * delete the structure. - * - * id: which SSI this is (0, 1, etc. ) - * ssi: pointer to the SSI's registers - * ssi_phys: physical address of the SSI registers - * irq: IRQ of this SSI - * dev: struct device, used to create the sysfs statistics file - * asynchronous: 0=synchronous mode, 1=asynchronous mode -*/ -struct fsl_ssi_info { - unsigned int id; - struct ccsr_ssi __iomem *ssi; - dma_addr_t ssi_phys; - unsigned int irq; - struct device *dev; - int asynchronous; -}; - -struct snd_soc_dai *fsl_ssi_create_dai(struct fsl_ssi_info *ssi_info); -void fsl_ssi_destroy_dai(struct snd_soc_dai *fsl_ssi_dai); - #endif diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c index 1d4e7164e80a..dce6b551cd78 100644 --- a/sound/soc/fsl/mpc5200_dma.c +++ b/sound/soc/fsl/mpc5200_dma.c @@ -9,6 +9,8 @@ #include #include #include +#include +#include #include @@ -107,7 +109,7 @@ static int psc_dma_hw_free(struct snd_pcm_substream *substream) static int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data; + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai); struct snd_pcm_runtime *runtime = substream->runtime; struct psc_dma_stream *s = to_psc_dma_stream(substream, psc_dma); struct mpc52xx_psc __iomem *regs = psc_dma->psc_regs; @@ -212,7 +214,7 @@ static int psc_dma_open(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data; + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai); struct psc_dma_stream *s; int rc; @@ -239,7 +241,7 @@ static int psc_dma_open(struct snd_pcm_substream *substream) static int psc_dma_close(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data; + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai); struct psc_dma_stream *s; dev_dbg(psc_dma->dev, "psc_dma_close(substream=%p)\n", substream); @@ -264,7 +266,7 @@ static snd_pcm_uframes_t psc_dma_pointer(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data; + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai); struct psc_dma_stream *s; dma_addr_t count; @@ -302,11 +304,11 @@ static int psc_dma_new(struct snd_card *card, struct snd_soc_dai *dai, struct snd_pcm *pcm) { struct snd_soc_pcm_runtime *rtd = pcm->private_data; - struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data; + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai); size_t size = psc_dma_hardware.buffer_bytes_max; int rc = 0; - dev_dbg(rtd->socdev->dev, "psc_dma_new(card=%p, dai=%p, pcm=%p)\n", + dev_dbg(rtd->platform->dev, "psc_dma_new(card=%p, dai=%p, pcm=%p)\n", card, dai, pcm); if (!card->dev->dma_mask) @@ -328,8 +330,8 @@ static int psc_dma_new(struct snd_card *card, struct snd_soc_dai *dai, goto capture_alloc_err; } - if (rtd->socdev->card->codec->ac97) - rtd->socdev->card->codec->ac97->private_data = psc_dma; + if (rtd->codec->ac97) + rtd->codec->ac97->private_data = psc_dma; return 0; @@ -349,7 +351,7 @@ static void psc_dma_free(struct snd_pcm *pcm) struct snd_pcm_substream *substream; int stream; - dev_dbg(rtd->socdev->dev, "psc_dma_free(pcm=%p)\n", pcm); + dev_dbg(rtd->platform->dev, "psc_dma_free(pcm=%p)\n", pcm); for (stream = 0; stream < 2; stream++) { substream = pcm->streams[stream].substream; @@ -361,15 +363,14 @@ static void psc_dma_free(struct snd_pcm *pcm) } } -struct snd_soc_platform mpc5200_audio_dma_platform = { - .name = "mpc5200-psc-audio", - .pcm_ops = &psc_dma_ops, +static struct snd_soc_platform_driver mpc5200_audio_dma_platform = { + .ops = &psc_dma_ops, .pcm_new = &psc_dma_new, .pcm_free = &psc_dma_free, }; -EXPORT_SYMBOL_GPL(mpc5200_audio_dma_platform); -int mpc5200_audio_dma_create(struct of_device *op) +static int mpc5200_hpcd_probe(struct of_device *op, + const struct of_device_id *match) { phys_addr_t fifo; struct psc_dma *psc_dma; @@ -475,7 +476,7 @@ int mpc5200_audio_dma_create(struct of_device *op) dev_set_drvdata(&op->dev, psc_dma); /* Tell the ASoC OF helpers about it */ - return snd_soc_register_platform(&mpc5200_audio_dma_platform); + return snd_soc_register_platform(&op->dev, &mpc5200_audio_dma_platform); out_irq: free_irq(psc_dma->irq, psc_dma); free_irq(psc_dma->capture.irq, &psc_dma->capture); @@ -486,15 +487,14 @@ out_unmap: iounmap(regs); return ret; } -EXPORT_SYMBOL_GPL(mpc5200_audio_dma_create); -int mpc5200_audio_dma_destroy(struct of_device *op) +static int mpc5200_hpcd_remove(struct of_device *op) { struct psc_dma *psc_dma = dev_get_drvdata(&op->dev); dev_dbg(&op->dev, "mpc5200_audio_dma_destroy()\n"); - snd_soc_unregister_platform(&mpc5200_audio_dma_platform); + snd_soc_unregister_platform(&op->dev); bcom_gen_bd_rx_release(psc_dma->capture.bcom_task); bcom_gen_bd_tx_release(psc_dma->playback.bcom_task); @@ -510,7 +510,35 @@ int mpc5200_audio_dma_destroy(struct of_device *op) return 0; } -EXPORT_SYMBOL_GPL(mpc5200_audio_dma_destroy); + +static struct of_device_id mpc5200_hpcd_match[] = { + { + .compatible = "fsl,mpc5200-pcm", + }, + {} +}; +MODULE_DEVICE_TABLE(of, mpc5200_hpcd_match); + +static struct of_platform_driver mpc5200_hpcd_of_driver = { + .owner = THIS_MODULE, + .name = "mpc5200-pcm-audio", + .match_table = mpc5200_hpcd_match, + .probe = mpc5200_hpcd_probe, + .remove = mpc5200_hpcd_remove, +}; + +static int __init mpc5200_hpcd_init(void) +{ + return of_register_platform_driver(&mpc5200_hpcd_of_driver); +} + +static void __exit mpc5200_hpcd_exit(void) +{ + of_unregister_platform_driver(&mpc5200_hpcd_of_driver); +} + +module_init(mpc5200_hpcd_init); +module_exit(mpc5200_hpcd_exit); MODULE_AUTHOR("Grant Likely "); MODULE_DESCRIPTION("Freescale MPC5200 PSC in DMA mode ASoC Driver"); diff --git a/sound/soc/fsl/mpc5200_dma.h b/sound/soc/fsl/mpc5200_dma.h index 22208b373fb9..7472531bc2a4 100644 --- a/sound/soc/fsl/mpc5200_dma.h +++ b/sound/soc/fsl/mpc5200_dma.h @@ -81,9 +81,4 @@ to_psc_dma_stream(struct snd_pcm_substream *substream, struct psc_dma *psc_dma) return &psc_dma->playback; } -int mpc5200_audio_dma_create(struct of_device *op); -int mpc5200_audio_dma_destroy(struct of_device *op); - -extern struct snd_soc_platform mpc5200_audio_dma_platform; - #endif /* __SOUND_SOC_FSL_MPC5200_DMA_H__ */ diff --git a/sound/soc/fsl/mpc5200_psc_ac97.c b/sound/soc/fsl/mpc5200_psc_ac97.c index e2ee220bfb7e..11706c128c08 100644 --- a/sound/soc/fsl/mpc5200_psc_ac97.c +++ b/sound/soc/fsl/mpc5200_psc_ac97.c @@ -129,7 +129,7 @@ static int psc_ac97_hw_analog_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *cpu_dai) { - struct psc_dma *psc_dma = cpu_dai->private_data; + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(cpu_dai); struct psc_dma_stream *s = to_psc_dma_stream(substream, psc_dma); dev_dbg(psc_dma->dev, "%s(substream=%p) p_size=%i p_bytes=%i" @@ -152,7 +152,7 @@ static int psc_ac97_hw_digital_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *cpu_dai) { - struct psc_dma *psc_dma = cpu_dai->private_data; + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(cpu_dai); dev_dbg(psc_dma->dev, "%s(substream=%p)\n", __func__, substream); @@ -167,8 +167,7 @@ static int psc_ac97_hw_digital_params(struct snd_pcm_substream *substream, static int psc_ac97_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data; + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(dai); struct psc_dma_stream *s = to_psc_dma_stream(substream, psc_dma); switch (cmd) { @@ -193,10 +192,9 @@ static int psc_ac97_trigger(struct snd_pcm_substream *substream, int cmd, return 0; } -static int psc_ac97_probe(struct platform_device *pdev, - struct snd_soc_dai *cpu_dai) +static int psc_ac97_probe(struct snd_soc_dai *cpu_dai) { - struct psc_dma *psc_dma = cpu_dai->private_data; + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(cpu_dai); struct mpc52xx_psc __iomem *regs = psc_dma->psc_regs; /* Go */ @@ -223,9 +221,8 @@ static struct snd_soc_dai_ops psc_ac97_digital_ops = { .hw_params = psc_ac97_hw_digital_params, }; -struct snd_soc_dai psc_ac97_dai[] = { +static struct snd_soc_dai_driver psc_ac97_dai[] = { { - .name = "AC97", .ac97_control = 1, .probe = psc_ac97_probe, .playback = { @@ -243,7 +240,6 @@ struct snd_soc_dai psc_ac97_dai[] = { .ops = &psc_ac97_analog_ops, }, { - .name = "SPDIF", .ac97_control = 1, .playback = { .channels_min = 1, @@ -254,7 +250,6 @@ struct snd_soc_dai psc_ac97_dai[] = { }, .ops = &psc_ac97_digital_ops, } }; -EXPORT_SYMBOL_GPL(psc_ac97_dai); @@ -266,18 +261,11 @@ EXPORT_SYMBOL_GPL(psc_ac97_dai); static int __devinit psc_ac97_of_probe(struct of_device *op, const struct of_device_id *match) { - int rc, i; + int rc; struct snd_ac97 ac97; struct mpc52xx_psc __iomem *regs; - rc = mpc5200_audio_dma_create(op); - if (rc != 0) - return rc; - - for (i = 0; i < ARRAY_SIZE(psc_ac97_dai); i++) - psc_ac97_dai[i].dev = &op->dev; - - rc = snd_soc_register_dais(psc_ac97_dai, ARRAY_SIZE(psc_ac97_dai)); + rc = snd_soc_register_dais(&op->dev, psc_ac97_dai, ARRAY_SIZE(psc_ac97_dai)); if (rc != 0) { dev_err(&op->dev, "Failed to register DAI\n"); return rc; @@ -287,9 +275,6 @@ static int __devinit psc_ac97_of_probe(struct of_device *op, regs = psc_dma->psc_regs; ac97.private_data = psc_dma; - for (i = 0; i < ARRAY_SIZE(psc_ac97_dai); i++) - psc_ac97_dai[i].private_data = psc_dma; - psc_dma->imr = 0; out_be16(&psc_dma->psc_regs->isr_imr.imr, psc_dma->imr); @@ -305,7 +290,8 @@ static int __devinit psc_ac97_of_probe(struct of_device *op, static int __devexit psc_ac97_of_remove(struct of_device *op) { - return mpc5200_audio_dma_destroy(op); + snd_soc_unregister_dais(&op->dev, ARRAY_SIZE(psc_ac97_dai)); + return 0; } /* Match table for of_platform binding */ diff --git a/sound/soc/fsl/mpc5200_psc_ac97.h b/sound/soc/fsl/mpc5200_psc_ac97.h index 4bc18c35c369..e881e784b270 100644 --- a/sound/soc/fsl/mpc5200_psc_ac97.h +++ b/sound/soc/fsl/mpc5200_psc_ac97.h @@ -7,8 +7,6 @@ #ifndef __SOUND_SOC_FSL_MPC52xx_PSC_AC97_H__ #define __SOUND_SOC_FSL_MPC52xx_PSC_AC97_H__ -extern struct snd_soc_dai psc_ac97_dai[]; - #define MPC5200_AC97_NORMAL 0 #define MPC5200_AC97_SPDIF 1 diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_psc_i2s.c index 676841cbae98..5b9f2c73f031 100644 --- a/sound/soc/fsl/mpc5200_psc_i2s.c +++ b/sound/soc/fsl/mpc5200_psc_i2s.c @@ -40,7 +40,7 @@ static int psc_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data; + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai); u32 mode; dev_dbg(psc_dma->dev, "%s(substream=%p) p_size=%i p_bytes=%i" @@ -88,7 +88,7 @@ static int psc_i2s_hw_params(struct snd_pcm_substream *substream, static int psc_i2s_set_sysclk(struct snd_soc_dai *cpu_dai, int clk_id, unsigned int freq, int dir) { - struct psc_dma *psc_dma = cpu_dai->private_data; + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(cpu_dai); dev_dbg(psc_dma->dev, "psc_i2s_set_sysclk(cpu_dai=%p, dir=%i)\n", cpu_dai, dir); return (dir == SND_SOC_CLOCK_IN) ? 0 : -EINVAL; @@ -107,7 +107,7 @@ static int psc_i2s_set_sysclk(struct snd_soc_dai *cpu_dai, */ static int psc_i2s_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int format) { - struct psc_dma *psc_dma = cpu_dai->private_data; + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(cpu_dai); dev_dbg(psc_dma->dev, "psc_i2s_set_fmt(cpu_dai=%p, format=%i)\n", cpu_dai, format); return (format == SND_SOC_DAIFMT_I2S) ? 0 : -EINVAL; @@ -129,8 +129,7 @@ static struct snd_soc_dai_ops psc_i2s_dai_ops = { .set_fmt = psc_i2s_set_fmt, }; -struct snd_soc_dai psc_i2s_dai[] = {{ - .name = "I2S", +static struct snd_soc_dai_driver psc_i2s_dai[] = {{ .playback = { .channels_min = 2, .channels_max = 2, @@ -145,7 +144,6 @@ struct snd_soc_dai psc_i2s_dai[] = {{ }, .ops = &psc_i2s_dai_ops, } }; -EXPORT_SYMBOL_GPL(psc_i2s_dai); /* --------------------------------------------------------------------- * OF platform bus binding code: @@ -159,11 +157,7 @@ static int __devinit psc_i2s_of_probe(struct of_device *op, struct psc_dma *psc_dma; struct mpc52xx_psc __iomem *regs; - rc = mpc5200_audio_dma_create(op); - if (rc != 0) - return rc; - - rc = snd_soc_register_dais(psc_i2s_dai, ARRAY_SIZE(psc_i2s_dai)); + rc = snd_soc_register_dais(&op->dev, psc_i2s_dai, ARRAY_SIZE(psc_i2s_dai)); if (rc != 0) { pr_err("Failed to register DAI\n"); return 0; @@ -207,7 +201,8 @@ static int __devinit psc_i2s_of_probe(struct of_device *op, static int __devexit psc_i2s_of_remove(struct of_device *op) { - return mpc5200_audio_dma_destroy(op); + snd_soc_unregister_dais(&op->dev, ARRAY_SIZE(psc_i2s_dai)); + return 0; } /* Match table for of_platform binding */ diff --git a/sound/soc/fsl/mpc8610_hpcd.c b/sound/soc/fsl/mpc8610_hpcd.c index 6a2764ee8203..5ba823213abe 100644 --- a/sound/soc/fsl/mpc8610_hpcd.c +++ b/sound/soc/fsl/mpc8610_hpcd.c @@ -1,85 +1,96 @@ /** - * Freescale MPC8610HPCD ALSA SoC Fabric driver + * Freescale MPC8610HPCD ALSA SoC Machine driver * * Author: Timur Tabi * - * Copyright 2007-2008 Freescale Semiconductor, Inc. This file is licensed - * under the terms of the GNU General Public License version 2. This - * program is licensed "as is" without any warranty of any kind, whether - * express or implied. + * Copyright 2007-2010 Freescale Semiconductor, Inc. + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. */ -#include #include #include #include -#include #include #include -#include "../codecs/cs4270.h" #include "fsl_dma.h" #include "fsl_ssi.h" +/* There's only one global utilities register */ +static phys_addr_t guts_phys; + +#define DAI_NAME_SIZE 32 + /** - * mpc8610_hpcd_data: fabric-specific ASoC device data + * mpc8610_hpcd_data: machine-specific ASoC device data * * This structure contains data for a single sound platform device on an * MPC8610 HPCD. Some of the data is taken from the device tree. */ struct mpc8610_hpcd_data { - struct snd_soc_device sound_devdata; - struct snd_soc_dai_link dai; - struct snd_soc_card machine; + struct snd_soc_dai_link dai[2]; + struct snd_soc_card card; unsigned int dai_format; unsigned int codec_clk_direction; unsigned int cpu_clk_direction; unsigned int clk_frequency; - struct ccsr_guts __iomem *guts; - struct ccsr_ssi __iomem *ssi; - unsigned int ssi_id; /* 0 = SSI1, 1 = SSI2, etc */ - unsigned int ssi_irq; - unsigned int dma_id; /* 0 = DMA1, 1 = DMA2, etc */ - unsigned int dma_irq[2]; - struct ccsr_dma_channel __iomem *dma[2]; + unsigned int ssi_id; /* 0 = SSI1, 1 = SSI2, etc */ + unsigned int dma_id[2]; /* 0 = DMA1, 1 = DMA2, etc */ unsigned int dma_channel_id[2]; /* 0 = ch 0, 1 = ch 1, etc*/ + char codec_dai_name[DAI_NAME_SIZE]; + char codec_name[DAI_NAME_SIZE]; + char platform_name[2][DAI_NAME_SIZE]; /* One for each DMA channel */ }; /** - * mpc8610_hpcd_machine_probe: initalize the board + * mpc8610_hpcd_machine_probe: initialize the board * - * This function is called when platform_device_add() is called. It is used - * to initialize the board-specific hardware. + * This function is used to initialize the board-specific hardware. * * Here we program the DMACR and PMUXCR registers. */ static int mpc8610_hpcd_machine_probe(struct platform_device *sound_device) { + struct snd_soc_card *card = platform_get_drvdata(sound_device); struct mpc8610_hpcd_data *machine_data = - sound_device->dev.platform_data; + container_of(card, struct mpc8610_hpcd_data, card); + struct ccsr_guts __iomem *guts; - /* Program the signal routing between the SSI and the DMA */ - guts_set_dmacr(machine_data->guts, machine_data->dma_id, - machine_data->dma_channel_id[0], CCSR_GUTS_DMACR_DEV_SSI); - guts_set_dmacr(machine_data->guts, machine_data->dma_id, - machine_data->dma_channel_id[1], CCSR_GUTS_DMACR_DEV_SSI); + guts = ioremap(guts_phys, sizeof(struct ccsr_guts)); + if (!guts) { + dev_err(card->dev, "could not map global utilities\n"); + return -ENOMEM; + } - guts_set_pmuxcr_dma(machine_data->guts, machine_data->dma_id, - machine_data->dma_channel_id[0], 0); - guts_set_pmuxcr_dma(machine_data->guts, machine_data->dma_id, - machine_data->dma_channel_id[1], 0); + /* Program the signal routing between the SSI and the DMA */ + guts_set_dmacr(guts, machine_data->dma_id[0], + machine_data->dma_channel_id[0], + CCSR_GUTS_DMACR_DEV_SSI); + guts_set_dmacr(guts, machine_data->dma_id[1], + machine_data->dma_channel_id[1], + CCSR_GUTS_DMACR_DEV_SSI); + + guts_set_pmuxcr_dma(guts, machine_data->dma_id[0], + machine_data->dma_channel_id[0], 0); + guts_set_pmuxcr_dma(guts, machine_data->dma_id[1], + machine_data->dma_channel_id[1], 0); switch (machine_data->ssi_id) { case 0: - clrsetbits_be32(&machine_data->guts->pmuxcr, + clrsetbits_be32(&guts->pmuxcr, CCSR_GUTS_PMUXCR_SSI1_MASK, CCSR_GUTS_PMUXCR_SSI1_SSI); break; case 1: - clrsetbits_be32(&machine_data->guts->pmuxcr, + clrsetbits_be32(&guts->pmuxcr, CCSR_GUTS_PMUXCR_SSI2_MASK, CCSR_GUTS_PMUXCR_SSI2_SSI); break; } + iounmap(guts); + return 0; } @@ -93,38 +104,15 @@ static int mpc8610_hpcd_machine_probe(struct platform_device *sound_device) static int mpc8610_hpcd_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; struct mpc8610_hpcd_data *machine_data = - rtd->socdev->dev->platform_data; + container_of(rtd->card, struct mpc8610_hpcd_data, card); + struct device *dev = rtd->card->dev; int ret = 0; - /* Tell the CPU driver what the serial protocol is. */ - ret = snd_soc_dai_set_fmt(cpu_dai, machine_data->dai_format); - if (ret < 0) { - dev_err(substream->pcm->card->dev, - "could not set CPU driver audio format\n"); - return ret; - } - /* Tell the codec driver what the serial protocol is. */ - ret = snd_soc_dai_set_fmt(codec_dai, machine_data->dai_format); + ret = snd_soc_dai_set_fmt(rtd->codec_dai, machine_data->dai_format); if (ret < 0) { - dev_err(substream->pcm->card->dev, - "could not set codec driver audio format\n"); - return ret; - } - - /* - * Tell the CPU driver what the clock frequency is, and whether it's a - * slave or master. - */ - ret = snd_soc_dai_set_sysclk(cpu_dai, 0, - machine_data->clk_frequency, - machine_data->cpu_clk_direction); - if (ret < 0) { - dev_err(substream->pcm->card->dev, - "could not set CPU driver clock parameters\n"); + dev_err(dev, "could not set codec driver audio format\n"); return ret; } @@ -132,12 +120,11 @@ static int mpc8610_hpcd_startup(struct snd_pcm_substream *substream) * Tell the codec driver what the MCLK frequency is, and whether it's * a slave or master. */ - ret = snd_soc_dai_set_sysclk(codec_dai, 0, - machine_data->clk_frequency, - machine_data->codec_clk_direction); + ret = snd_soc_dai_set_sysclk(rtd->codec_dai, 0, + machine_data->clk_frequency, + machine_data->codec_clk_direction); if (ret < 0) { - dev_err(substream->pcm->card->dev, - "could not set codec driver clock params\n"); + dev_err(dev, "could not set codec driver clock params\n"); return ret; } @@ -150,116 +137,254 @@ static int mpc8610_hpcd_startup(struct snd_pcm_substream *substream) * This function is called to remove the sound device for one SSI. We * de-program the DMACR and PMUXCR register. */ -int mpc8610_hpcd_machine_remove(struct platform_device *sound_device) +static int mpc8610_hpcd_machine_remove(struct platform_device *sound_device) { + struct snd_soc_card *card = platform_get_drvdata(sound_device); struct mpc8610_hpcd_data *machine_data = - sound_device->dev.platform_data; + container_of(card, struct mpc8610_hpcd_data, card); + struct ccsr_guts __iomem *guts; + + guts = ioremap(guts_phys, sizeof(struct ccsr_guts)); + if (!guts) { + dev_err(card->dev, "could not map global utilities\n"); + return -ENOMEM; + } /* Restore the signal routing */ - guts_set_dmacr(machine_data->guts, machine_data->dma_id, - machine_data->dma_channel_id[0], 0); - guts_set_dmacr(machine_data->guts, machine_data->dma_id, - machine_data->dma_channel_id[1], 0); + guts_set_dmacr(guts, machine_data->dma_id[0], + machine_data->dma_channel_id[0], 0); + guts_set_dmacr(guts, machine_data->dma_id[1], + machine_data->dma_channel_id[1], 0); switch (machine_data->ssi_id) { case 0: - clrsetbits_be32(&machine_data->guts->pmuxcr, + clrsetbits_be32(&guts->pmuxcr, CCSR_GUTS_PMUXCR_SSI1_MASK, CCSR_GUTS_PMUXCR_SSI1_LA); break; case 1: - clrsetbits_be32(&machine_data->guts->pmuxcr, + clrsetbits_be32(&guts->pmuxcr, CCSR_GUTS_PMUXCR_SSI2_MASK, CCSR_GUTS_PMUXCR_SSI2_LA); break; } + iounmap(guts); + return 0; } /** - * mpc8610_hpcd_ops: ASoC fabric driver operations + * mpc8610_hpcd_ops: ASoC machine driver operations */ static struct snd_soc_ops mpc8610_hpcd_ops = { .startup = mpc8610_hpcd_startup, }; /** - * mpc8610_hpcd_probe: OF probe function for the fabric driver + * get_node_by_phandle_name - get a node by its phandle name * - * This function gets called when an SSI node is found in the device tree. + * This function takes a node, the name of a property in that node, and a + * compatible string. Assuming the property is a phandle to another node, + * it returns that node, (optionally) if that node is compatible. * - * Although this is a fabric driver, the SSI node is the "master" node with - * respect to audio hardware connections. Therefore, we create a new ASoC - * device for each new SSI node that has a codec attached. + * If the property is not a phandle, or the node it points to is not compatible + * with the specific string, then NULL is returned. + */ +static struct device_node *get_node_by_phandle_name(struct device_node *np, + const char *name, + const char *compatible) +{ + const phandle *ph; + int len; + + ph = of_get_property(np, name, &len); + if (!ph || (len != sizeof(phandle))) + return NULL; + + np = of_find_node_by_phandle(*ph); + if (!np) + return NULL; + + if (compatible && !of_device_is_compatible(np, compatible)) { + of_node_put(np); + return NULL; + } + + return np; +} + +/** + * get_parent_cell_index -- return the cell-index of the parent of a node * - * FIXME: Currently, we only support one DMA controller, so if there are - * multiple SSI nodes with codecs, only the first will be supported. + * Return the value of the cell-index property of the parent of the given + * node. This is used for DMA channel nodes that need to know the DMA ID + * of the controller they are on. + */ +static int get_parent_cell_index(struct device_node *np) +{ + struct device_node *parent = of_get_parent(np); + const u32 *iprop; + + if (!parent) + return -1; + + iprop = of_get_property(parent, "cell-index", NULL); + of_node_put(parent); + + if (!iprop) + return -1; + + return *iprop; +} + +/** + * codec_node_dev_name - determine the dev_name for a codec node * - * FIXME: Even if we did support multiple DMA controllers, we have no - * mechanism for assigning DMA controllers and channels to the individual - * SSI devices. We also probably aren't compatible with the generic Elo DMA - * device driver. + * This function determines the dev_name for an I2C node. This is the name + * that would be returned by dev_name() if this device_node were part of a + * 'struct device' It's ugly and hackish, but it works. + * + * The dev_name for such devices include the bus number and I2C address. For + * example, "cs4270-codec.0-004f". */ -static int mpc8610_hpcd_probe(struct of_device *ofdev, - const struct of_device_id *match) +static int codec_node_dev_name(struct device_node *np, char *buf, size_t len) { - struct device_node *np = ofdev->dev.of_node; - struct device_node *codec_np = NULL; - struct device_node *guts_np = NULL; - struct device_node *dma_np = NULL; - struct device_node *dma_channel_np = NULL; - const phandle *codec_ph; - const char *sprop; const u32 *iprop; + int bus, addr; + char temp[DAI_NAME_SIZE]; + + of_modalias_node(np, temp, DAI_NAME_SIZE); + + iprop = of_get_property(np, "reg", NULL); + if (!iprop) + return -EINVAL; + + addr = *iprop; + + bus = get_parent_cell_index(np); + if (bus < 0) + return bus; + + snprintf(buf, len, "%s-codec.%u-%04x", temp, bus, addr); + + return 0; +} + +static int get_dma_channel(struct device_node *ssi_np, + const char *compatible, + struct snd_soc_dai_link *dai, + unsigned int *dma_channel_id, + unsigned int *dma_id) +{ struct resource res; + struct device_node *dma_channel_np; + const u32 *iprop; + int ret; + + dma_channel_np = get_node_by_phandle_name(ssi_np, compatible, + "fsl,ssi-dma-channel"); + if (!dma_channel_np) + return -EINVAL; + + /* Determine the dev_name for the device_node. This code mimics the + * behavior of of_device_make_bus_id(). We need this because ASoC uses + * the dev_name() of the device to match the platform (DMA) device with + * the CPU (SSI) device. It's all ugly and hackish, but it works (for + * now). + * + * dai->platform name should already point to an allocated buffer. + */ + ret = of_address_to_resource(dma_channel_np, 0, &res); + if (ret) + return ret; + snprintf((char *)dai->platform_name, DAI_NAME_SIZE, "%llx.%s", + (unsigned long long) res.start, dma_channel_np->name); + + iprop = of_get_property(dma_channel_np, "cell-index", NULL); + if (!iprop) { + of_node_put(dma_channel_np); + return -EINVAL; + } + + *dma_channel_id = *iprop; + *dma_id = get_parent_cell_index(dma_channel_np); + of_node_put(dma_channel_np); + + return 0; +} + +/** + * mpc8610_hpcd_probe: platform probe function for the machine driver + * + * Although this is a machine driver, the SSI node is the "master" node with + * respect to audio hardware connections. Therefore, we create a new ASoC + * device for each new SSI node that has a codec attached. + */ +static int mpc8610_hpcd_probe(struct platform_device *pdev) +{ + struct device *dev = pdev->dev.parent; + /* of_dev is the OF device for the SSI node that probed us */ + struct of_device *of_dev = container_of(dev, struct of_device, dev); + struct device_node *np = of_dev->dev.of_node; + struct device_node *codec_np = NULL; struct platform_device *sound_device = NULL; struct mpc8610_hpcd_data *machine_data; - struct fsl_ssi_info ssi_info; - struct fsl_dma_info dma_info; int ret = -ENODEV; - unsigned int playback_dma_channel; - unsigned int capture_dma_channel; + const char *sprop; + const u32 *iprop; + + /* We are only interested in SSIs with a codec phandle in them, + * so let's make sure this SSI has one. The MPC8610 HPCD only + * knows about the CS4270 codec, so reject anything else. + */ + codec_np = get_node_by_phandle_name(np, "codec-handle", + "cirrus,cs4270"); + if (!codec_np) { + dev_err(dev, "invalid codec node\n"); + return -EINVAL; + } machine_data = kzalloc(sizeof(struct mpc8610_hpcd_data), GFP_KERNEL); if (!machine_data) return -ENOMEM; - memset(&ssi_info, 0, sizeof(ssi_info)); - memset(&dma_info, 0, sizeof(dma_info)); + machine_data->dai[0].cpu_dai_name = dev_name(&of_dev->dev); + machine_data->dai[0].ops = &mpc8610_hpcd_ops; - ssi_info.dev = &ofdev->dev; - - /* - * We are only interested in SSIs with a codec phandle in them, so let's - * make sure this SSI has one. - */ - codec_ph = of_get_property(np, "codec-handle", NULL); - if (!codec_ph) + /* Determine the codec name, it will be used as the codec DAI name */ + ret = codec_node_dev_name(codec_np, machine_data->codec_name, + DAI_NAME_SIZE); + if (ret) { + dev_err(&pdev->dev, "invalid codec node %s\n", + codec_np->full_name); + ret = -EINVAL; goto error; + } + machine_data->dai[0].codec_name = machine_data->codec_name; - codec_np = of_find_node_by_phandle(*codec_ph); - if (!codec_np) - goto error; + /* The DAI name from the codec (snd_soc_dai_driver.name) */ + machine_data->dai[0].codec_dai_name = "cs4270-hifi"; - /* The MPC8610 HPCD only knows about the CS4270 codec, so reject - anything else. */ - if (!of_device_is_compatible(codec_np, "cirrus,cs4270")) - goto error; + /* We register two DAIs per SSI, one for playback and the other for + * capture. Currently, we only support codecs that have one DAI for + * both playback and capture. + */ + memcpy(&machine_data->dai[1], &machine_data->dai[0], + sizeof(struct snd_soc_dai_link)); /* Get the device ID */ iprop = of_get_property(np, "cell-index", NULL); if (!iprop) { - dev_err(&ofdev->dev, "cell-index property not found\n"); + dev_err(&pdev->dev, "cell-index property not found\n"); ret = -EINVAL; goto error; } machine_data->ssi_id = *iprop; - ssi_info.id = *iprop; /* Get the serial format and clock direction. */ sprop = of_get_property(np, "fsl,mode", NULL); if (!sprop) { - dev_err(&ofdev->dev, "fsl,mode property not found\n"); + dev_err(&pdev->dev, "fsl,mode property not found\n"); ret = -EINVAL; goto error; } @@ -269,15 +394,14 @@ static int mpc8610_hpcd_probe(struct of_device *ofdev, machine_data->codec_clk_direction = SND_SOC_CLOCK_OUT; machine_data->cpu_clk_direction = SND_SOC_CLOCK_IN; - /* - * In i2s-slave mode, the codec has its own clock source, so we + /* In i2s-slave mode, the codec has its own clock source, so we * need to get the frequency from the device tree and pass it to * the codec driver. */ iprop = of_get_property(codec_np, "clock-frequency", NULL); if (!iprop || !*iprop) { - dev_err(&ofdev->dev, "codec bus-frequency property " - "is missing or invalid\n"); + dev_err(&pdev->dev, "codec bus-frequency " + "property is missing or invalid\n"); ret = -EINVAL; goto error; } @@ -311,317 +435,153 @@ static int mpc8610_hpcd_probe(struct of_device *ofdev, machine_data->codec_clk_direction = SND_SOC_CLOCK_IN; machine_data->cpu_clk_direction = SND_SOC_CLOCK_OUT; } else { - dev_err(&ofdev->dev, - "unrecognized fsl,mode property \"%s\"\n", sprop); + dev_err(&pdev->dev, + "unrecognized fsl,mode property '%s'\n", sprop); ret = -EINVAL; goto error; } if (!machine_data->clk_frequency) { - dev_err(&ofdev->dev, "unknown clock frequency\n"); + dev_err(&pdev->dev, "unknown clock frequency\n"); ret = -EINVAL; goto error; } - /* Read the SSI information from the device tree */ - ret = of_address_to_resource(np, 0, &res); + /* Find the playback DMA channel to use. */ + machine_data->dai[0].platform_name = machine_data->platform_name[0]; + ret = get_dma_channel(np, "fsl,playback-dma", &machine_data->dai[0], + &machine_data->dma_channel_id[0], + &machine_data->dma_id[0]); if (ret) { - dev_err(&ofdev->dev, "could not obtain SSI address\n"); - goto error; - } - if (!res.start) { - dev_err(&ofdev->dev, "invalid SSI address\n"); - goto error; - } - ssi_info.ssi_phys = res.start; - - machine_data->ssi = ioremap(ssi_info.ssi_phys, sizeof(struct ccsr_ssi)); - if (!machine_data->ssi) { - dev_err(&ofdev->dev, "could not map SSI address %x\n", - ssi_info.ssi_phys); - ret = -EINVAL; - goto error; - } - ssi_info.ssi = machine_data->ssi; - - - /* Get the IRQ of the SSI */ - machine_data->ssi_irq = irq_of_parse_and_map(np, 0); - if (!machine_data->ssi_irq) { - dev_err(&ofdev->dev, "could not get SSI IRQ\n"); - ret = -EINVAL; - goto error; - } - ssi_info.irq = machine_data->ssi_irq; - - /* Do we want to use asynchronous mode? */ - ssi_info.asynchronous = - of_find_property(np, "fsl,ssi-asynchronous", NULL) ? 1 : 0; - if (ssi_info.asynchronous) - dev_info(&ofdev->dev, "using asynchronous mode\n"); - - /* Map the global utilities registers. */ - guts_np = of_find_compatible_node(NULL, NULL, "fsl,mpc8610-guts"); - if (!guts_np) { - dev_err(&ofdev->dev, "could not obtain address of GUTS\n"); - ret = -EINVAL; - goto error; - } - machine_data->guts = of_iomap(guts_np, 0); - of_node_put(guts_np); - if (!machine_data->guts) { - dev_err(&ofdev->dev, "could not map GUTS\n"); - ret = -EINVAL; - goto error; - } - - /* Find the DMA channels to use. Both SSIs need to use the same DMA - * controller, so let's use DMA#1. - */ - for_each_compatible_node(dma_np, NULL, "fsl,mpc8610-dma") { - iprop = of_get_property(dma_np, "cell-index", NULL); - if (iprop && (*iprop == 0)) { - of_node_put(dma_np); - break; - } - } - if (!dma_np) { - dev_err(&ofdev->dev, "could not find DMA node\n"); - ret = -EINVAL; - goto error; - } - machine_data->dma_id = *iprop; - - /* SSI1 needs to use DMA Channels 0 and 1, and SSI2 needs to use DMA - * channels 2 and 3. This is just how the MPC8610 is wired - * internally. - */ - playback_dma_channel = (machine_data->ssi_id == 0) ? 0 : 2; - capture_dma_channel = (machine_data->ssi_id == 0) ? 1 : 3; - - /* - * Find the DMA channels to use. - */ - while ((dma_channel_np = of_get_next_child(dma_np, dma_channel_np))) { - iprop = of_get_property(dma_channel_np, "cell-index", NULL); - if (iprop && (*iprop == playback_dma_channel)) { - /* dma_channel[0] and dma_irq[0] are for playback */ - dma_info.dma_channel[0] = of_iomap(dma_channel_np, 0); - dma_info.dma_irq[0] = - irq_of_parse_and_map(dma_channel_np, 0); - machine_data->dma_channel_id[0] = *iprop; - continue; - } - if (iprop && (*iprop == capture_dma_channel)) { - /* dma_channel[1] and dma_irq[1] are for capture */ - dma_info.dma_channel[1] = of_iomap(dma_channel_np, 0); - dma_info.dma_irq[1] = - irq_of_parse_and_map(dma_channel_np, 0); - machine_data->dma_channel_id[1] = *iprop; - continue; - } - } - if (!dma_info.dma_channel[0] || !dma_info.dma_channel[1] || - !dma_info.dma_irq[0] || !dma_info.dma_irq[1]) { - dev_err(&ofdev->dev, "could not find DMA channels\n"); - ret = -EINVAL; + dev_err(&pdev->dev, "missing/invalid playback DMA phandle\n"); goto error; } - dma_info.ssi_stx_phys = ssi_info.ssi_phys + - offsetof(struct ccsr_ssi, stx0); - dma_info.ssi_srx_phys = ssi_info.ssi_phys + - offsetof(struct ccsr_ssi, srx0); - - /* We have the DMA information, so tell the DMA driver what it is */ - if (!fsl_dma_configure(&dma_info)) { - dev_err(&ofdev->dev, "could not instantiate DMA device\n"); - ret = -EBUSY; + /* Find the capture DMA channel to use. */ + machine_data->dai[1].platform_name = machine_data->platform_name[1]; + ret = get_dma_channel(np, "fsl,capture-dma", &machine_data->dai[1], + &machine_data->dma_channel_id[1], + &machine_data->dma_id[1]); + if (ret) { + dev_err(&pdev->dev, "missing/invalid capture DMA phandle\n"); goto error; } - /* - * Initialize our DAI data structure. We should probably get this - * information from the device tree. - */ - machine_data->dai.name = "CS4270"; - machine_data->dai.stream_name = "CS4270"; - - machine_data->dai.cpu_dai = fsl_ssi_create_dai(&ssi_info); - machine_data->dai.codec_dai = &cs4270_dai; /* The codec_dai we want */ - machine_data->dai.ops = &mpc8610_hpcd_ops; + /* Initialize our DAI data structure. */ + machine_data->dai[0].stream_name = "playback"; + machine_data->dai[1].stream_name = "capture"; + machine_data->dai[0].name = machine_data->dai[0].stream_name; + machine_data->dai[1].name = machine_data->dai[1].stream_name; - machine_data->machine.probe = mpc8610_hpcd_machine_probe; - machine_data->machine.remove = mpc8610_hpcd_machine_remove; - machine_data->machine.name = "MPC8610 HPCD"; - machine_data->machine.num_links = 1; - machine_data->machine.dai_link = &machine_data->dai; + machine_data->card.probe = mpc8610_hpcd_machine_probe; + machine_data->card.remove = mpc8610_hpcd_machine_remove; + machine_data->card.name = pdev->name; /* The platform driver name */ + machine_data->card.num_links = 2; + machine_data->card.dai_link = machine_data->dai; /* Allocate a new audio platform device structure */ sound_device = platform_device_alloc("soc-audio", -1); if (!sound_device) { - dev_err(&ofdev->dev, "platform device allocation failed\n"); + dev_err(&pdev->dev, "platform device alloc failed\n"); ret = -ENOMEM; goto error; } - machine_data->sound_devdata.card = &machine_data->machine; - machine_data->sound_devdata.codec_dev = &soc_codec_device_cs4270; - machine_data->machine.platform = &fsl_soc_platform; - - sound_device->dev.platform_data = machine_data; - + /* Associate the card data with the sound device */ + platform_set_drvdata(sound_device, &machine_data->card); - /* Set the platform device and ASoC device to point to each other */ - platform_set_drvdata(sound_device, &machine_data->sound_devdata); - - machine_data->sound_devdata.dev = &sound_device->dev; - - - /* Tell ASoC to probe us. This will call mpc8610_hpcd_machine.probe(), - if it exists. */ + /* Register with ASoC */ ret = platform_device_add(sound_device); - if (ret) { - dev_err(&ofdev->dev, "platform device add failed\n"); + dev_err(&pdev->dev, "platform device add failed\n"); goto error; } - dev_set_drvdata(&ofdev->dev, sound_device); + of_node_put(codec_np); return 0; error: of_node_put(codec_np); - of_node_put(guts_np); - of_node_put(dma_np); - of_node_put(dma_channel_np); if (sound_device) platform_device_unregister(sound_device); - if (machine_data->dai.cpu_dai) - fsl_ssi_destroy_dai(machine_data->dai.cpu_dai); - - if (ssi_info.ssi) - iounmap(ssi_info.ssi); - - if (ssi_info.irq) - irq_dispose_mapping(ssi_info.irq); - - if (dma_info.dma_channel[0]) - iounmap(dma_info.dma_channel[0]); - - if (dma_info.dma_channel[1]) - iounmap(dma_info.dma_channel[1]); - - if (dma_info.dma_irq[0]) - irq_dispose_mapping(dma_info.dma_irq[0]); - - if (dma_info.dma_irq[1]) - irq_dispose_mapping(dma_info.dma_irq[1]); - - if (machine_data->guts) - iounmap(machine_data->guts); - kfree(machine_data); return ret; } /** - * mpc8610_hpcd_remove: remove the OF device + * mpc8610_hpcd_remove: remove the platform device * - * This function is called when the OF device is removed. + * This function is called when the platform device is removed. */ -static int mpc8610_hpcd_remove(struct of_device *ofdev) +static int __devexit mpc8610_hpcd_remove(struct platform_device *pdev) { - struct platform_device *sound_device = dev_get_drvdata(&ofdev->dev); + struct platform_device *sound_device = dev_get_drvdata(&pdev->dev); + struct snd_soc_card *card = platform_get_drvdata(sound_device); struct mpc8610_hpcd_data *machine_data = - sound_device->dev.platform_data; + container_of(card, struct mpc8610_hpcd_data, card); platform_device_unregister(sound_device); - if (machine_data->dai.cpu_dai) - fsl_ssi_destroy_dai(machine_data->dai.cpu_dai); - - if (machine_data->ssi) - iounmap(machine_data->ssi); - - if (machine_data->dma[0]) - iounmap(machine_data->dma[0]); - - if (machine_data->dma[1]) - iounmap(machine_data->dma[1]); - - if (machine_data->dma_irq[0]) - irq_dispose_mapping(machine_data->dma_irq[0]); - - if (machine_data->dma_irq[1]) - irq_dispose_mapping(machine_data->dma_irq[1]); - - if (machine_data->guts) - iounmap(machine_data->guts); - kfree(machine_data); sound_device->dev.platform_data = NULL; - dev_set_drvdata(&ofdev->dev, NULL); + dev_set_drvdata(&pdev->dev, NULL); return 0; } -static struct of_device_id mpc8610_hpcd_match[] = { - { - .compatible = "fsl,mpc8610-ssi", - }, - {} -}; -MODULE_DEVICE_TABLE(of, mpc8610_hpcd_match); - -static struct of_platform_driver mpc8610_hpcd_of_driver = { +static struct platform_driver mpc8610_hpcd_driver = { + .probe = mpc8610_hpcd_probe, + .remove = __devexit_p(mpc8610_hpcd_remove), .driver = { - .name = "mpc8610_hpcd", + /* The name must match the 'model' property in the device tree, + * in lowercase letters. + */ + .name = "snd-soc-mpc8610hpcd", .owner = THIS_MODULE, - .of_match_table = mpc8610_hpcd_match, }, - .probe = mpc8610_hpcd_probe, - .remove = mpc8610_hpcd_remove, }; /** - * mpc8610_hpcd_init: fabric driver initialization. + * mpc8610_hpcd_init: machine driver initialization. * * This function is called when this module is loaded. */ static int __init mpc8610_hpcd_init(void) { - int ret; - - printk(KERN_INFO "Freescale MPC8610 HPCD ALSA SoC fabric driver\n"); + struct device_node *guts_np; + struct resource res; - ret = of_register_platform_driver(&mpc8610_hpcd_of_driver); + pr_info("Freescale MPC8610 HPCD ALSA SoC machine driver\n"); - if (ret) - printk(KERN_ERR - "mpc8610-hpcd: failed to register platform driver\n"); + /* Get the physical address of the global utilities registers */ + guts_np = of_find_compatible_node(NULL, NULL, "fsl,mpc8610-guts"); + if (of_address_to_resource(guts_np, 0, &res)) { + pr_err("mpc8610-hpcd: missing/invalid global utilities node\n"); + return -EINVAL; + } + guts_phys = res.start; - return ret; + return platform_driver_register(&mpc8610_hpcd_driver); } /** - * mpc8610_hpcd_exit: fabric driver exit + * mpc8610_hpcd_exit: machine driver exit * * This function is called when this driver is unloaded. */ static void __exit mpc8610_hpcd_exit(void) { - of_unregister_platform_driver(&mpc8610_hpcd_of_driver); + platform_driver_unregister(&mpc8610_hpcd_driver); } module_init(mpc8610_hpcd_init); module_exit(mpc8610_hpcd_exit); MODULE_AUTHOR("Timur Tabi "); -MODULE_DESCRIPTION("Freescale MPC8610 HPCD ALSA SoC fabric driver"); -MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Freescale MPC8610 HPCD ALSA SoC machine driver"); +MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/fsl/pcm030-audio-fabric.c b/sound/soc/fsl/pcm030-audio-fabric.c index 6644cba7cbf2..fe15bb26e484 100644 --- a/sound/soc/fsl/pcm030-audio-fabric.c +++ b/sound/soc/fsl/pcm030-audio-fabric.c @@ -32,21 +32,24 @@ #define DRV_NAME "pcm030-audio-fabric" -static struct snd_soc_device device; static struct snd_soc_card card; static struct snd_soc_dai_link pcm030_fabric_dai[] = { { .name = "AC97", .stream_name = "AC97 Analog", - .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI], - .cpu_dai = &psc_ac97_dai[MPC5200_AC97_NORMAL], + .codec_dai_name = "wm9712-hifi", + .cpu_dai_name = "mpc5200-psc-ac97.0", + .platform_name = "mpc5200-pcm-audio", + .codec_name = "wm9712-codec", }, { .name = "AC97", .stream_name = "AC97 IEC958", - .codec_dai = &wm9712_dai[WM9712_DAI_AC97_AUX], - .cpu_dai = &psc_ac97_dai[MPC5200_AC97_SPDIF], + .codec_dai_name = "wm9712-aux", + .cpu_dai_name = "mpc5200-psc-ac97.1", + .platform_name = "mpc5200-pcm-audio", + ..codec_name = "wm9712-codec", }, }; @@ -58,22 +61,18 @@ static __init int pcm030_fabric_init(void) if (!of_machine_is_compatible("phytec,pcm030")) return -ENODEV; - card.platform = &mpc5200_audio_dma_platform; + card.name = "pcm030"; card.dai_link = pcm030_fabric_dai; card.num_links = ARRAY_SIZE(pcm030_fabric_dai); - device.card = &card; - device.codec_dev = &soc_codec_dev_wm9712; - pdev = platform_device_alloc("soc-audio", 1); if (!pdev) { pr_err("pcm030_fabric_init: platform_device_alloc() failed\n"); return -ENODEV; } - platform_set_drvdata(pdev, &device); - device.dev = &pdev->dev; + platform_set_drvdata(pdev, &card); rc = platform_device_add(pdev); if (rc) { diff --git a/sound/soc/fsl/soc-of-simple.c b/sound/soc/fsl/soc-of-simple.c deleted file mode 100644 index 3bc13fd89096..000000000000 --- a/sound/soc/fsl/soc-of-simple.c +++ /dev/null @@ -1,172 +0,0 @@ -/* - * OF helpers for ALSA SoC Layer - * - * Copyright (C) 2008, Secret Lab Technologies Ltd. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -MODULE_AUTHOR("Grant Likely "); -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("ALSA SoC OpenFirmware bindings"); - -static DEFINE_MUTEX(of_snd_soc_mutex); -static LIST_HEAD(of_snd_soc_device_list); -static int of_snd_soc_next_index; - -struct of_snd_soc_device { - int id; - struct list_head list; - struct snd_soc_device device; - struct snd_soc_card card; - struct snd_soc_dai_link dai_link; - struct platform_device *pdev; - struct device_node *platform_node; - struct device_node *codec_node; -}; - -static struct snd_soc_ops of_snd_soc_ops = { -}; - -static struct of_snd_soc_device * -of_snd_soc_get_device(struct device_node *codec_node) -{ - struct of_snd_soc_device *of_soc; - - list_for_each_entry(of_soc, &of_snd_soc_device_list, list) { - if (of_soc->codec_node == codec_node) - return of_soc; - } - - of_soc = kzalloc(sizeof(struct of_snd_soc_device), GFP_KERNEL); - if (!of_soc) - return NULL; - - /* Initialize the structure and add it to the global list */ - of_soc->codec_node = codec_node; - of_soc->id = of_snd_soc_next_index++; - of_soc->card.dai_link = &of_soc->dai_link; - of_soc->card.num_links = 1; - of_soc->device.card = &of_soc->card; - of_soc->dai_link.ops = &of_snd_soc_ops; - list_add(&of_soc->list, &of_snd_soc_device_list); - - return of_soc; -} - -static void of_snd_soc_register_device(struct of_snd_soc_device *of_soc) -{ - struct platform_device *pdev; - int rc; - - /* Only register the device if both the codec and platform have - * been registered */ - if ((!of_soc->device.codec_data) || (!of_soc->platform_node)) - return; - - pr_info("platform<-->codec match achieved; registering machine\n"); - - pdev = platform_device_alloc("soc-audio", of_soc->id); - if (!pdev) { - pr_err("of_soc: platform_device_alloc() failed\n"); - return; - } - - pdev->dev.platform_data = of_soc; - platform_set_drvdata(pdev, &of_soc->device); - of_soc->device.dev = &pdev->dev; - - /* The ASoC device is complete; register it */ - rc = platform_device_add(pdev); - if (rc) { - pr_err("of_soc: platform_device_add() failed\n"); - return; - } - -} - -int of_snd_soc_register_codec(struct snd_soc_codec_device *codec_dev, - void *codec_data, struct snd_soc_dai *dai, - struct device_node *node) -{ - struct of_snd_soc_device *of_soc; - int rc = 0; - - pr_info("registering ASoC codec driver: %s\n", node->full_name); - - mutex_lock(&of_snd_soc_mutex); - of_soc = of_snd_soc_get_device(node); - if (!of_soc) { - rc = -ENOMEM; - goto out; - } - - /* Store the codec data */ - of_soc->device.codec_data = codec_data; - of_soc->device.codec_dev = codec_dev; - of_soc->dai_link.name = (char *)node->name; - of_soc->dai_link.stream_name = (char *)node->name; - of_soc->dai_link.codec_dai = dai; - - /* Now try to register the SoC device */ - of_snd_soc_register_device(of_soc); - - out: - mutex_unlock(&of_snd_soc_mutex); - return rc; -} -EXPORT_SYMBOL_GPL(of_snd_soc_register_codec); - -int of_snd_soc_register_platform(struct snd_soc_platform *platform, - struct device_node *node, - struct snd_soc_dai *cpu_dai) -{ - struct of_snd_soc_device *of_soc; - struct device_node *codec_node; - const phandle *handle; - int len, rc = 0; - - pr_info("registering ASoC platform driver: %s\n", node->full_name); - - handle = of_get_property(node, "codec-handle", &len); - if (!handle || len < sizeof(handle)) - return -ENODEV; - codec_node = of_find_node_by_phandle(*handle); - if (!codec_node) - return -ENODEV; - pr_info("looking for codec: %s\n", codec_node->full_name); - - mutex_lock(&of_snd_soc_mutex); - of_soc = of_snd_soc_get_device(codec_node); - if (!of_soc) { - rc = -ENOMEM; - goto out; - } - - of_soc->platform_node = node; - of_soc->dai_link.cpu_dai = cpu_dai; - of_soc->card.platform = platform; - of_soc->card.name = of_soc->dai_link.cpu_dai->name; - - /* Now try to register the SoC device */ - of_snd_soc_register_device(of_soc); - - out: - mutex_unlock(&of_snd_soc_mutex); - return rc; -} -EXPORT_SYMBOL_GPL(of_snd_soc_register_platform); diff --git a/sound/soc/imx/Kconfig b/sound/soc/imx/Kconfig index 52dac5e3874c..66ba26393c10 100644 --- a/sound/soc/imx/Kconfig +++ b/sound/soc/imx/Kconfig @@ -8,12 +8,24 @@ menuconfig SND_IMX_SOC Say Y or M if you want to add support for codecs attached to the i.MX SSI interface. + if SND_IMX_SOC +config SND_MXC_SOC_SSI + tristate + +config SND_MXC_SOC_FIQ + tristate + +config SND_MXC_SOC_MX2 + tristate + config SND_MXC_SOC_WM1133_EV1 tristate "Audio on the the i.MX31ADS with WM1133-EV1 fitted" depends on MACH_MX31ADS_WM1133_EV1 && EXPERIMENTAL select SND_SOC_WM8350 + select SND_MXC_SOC_SSI + select SND_MXC_SOC_FIQ help Enable support for audio on the i.MX31ADS with the WM1133-EV1 PMIC board with WM8835x fitted. @@ -22,6 +34,8 @@ config SND_SOC_PHYCORE_AC97 tristate "SoC Audio support for Phytec phyCORE (and phyCARD) boards" depends on MACH_PCM043 || MACH_PCA100 select SND_SOC_WM9712 + select SND_MXC_SOC_SSI + select SND_MXC_SOC_FIQ help Say Y if you want to add support for SoC audio on Phytec phyCORE and phyCARD boards in AC97 mode @@ -30,6 +44,8 @@ config SND_SOC_EUKREA_TLV320 tristate "Eukrea TLV320" depends on MACH_EUKREA_MBIMX27_BASEBOARD || MACH_EUKREA_MBIMXSD_BASEBOARD select SND_SOC_TLV320AIC23 + select SND_MXC_SOC_SSI + select SND_MXC_SOC_FIQ help Enable I2S based access to the TLV320AIC23B codec attached to the SSI interface diff --git a/sound/soc/imx/Makefile b/sound/soc/imx/Makefile index 7bc57baf2b0e..b67fc02a4ecc 100644 --- a/sound/soc/imx/Makefile +++ b/sound/soc/imx/Makefile @@ -1,11 +1,11 @@ # i.MX Platform Support -snd-soc-imx-objs := imx-ssi.o imx-pcm-fiq.o - -ifdef CONFIG_MACH_MX27 -snd-soc-imx-objs += imx-pcm-dma-mx2.o -endif +snd-soc-imx-objs := imx-ssi.o +snd-soc-imx-fiq-objs := imx-pcm-fiq.o +snd-soc-imx-mx2-objs := imx-pcm-dma-mx2.o obj-$(CONFIG_SND_IMX_SOC) += snd-soc-imx.o +obj-$(CONFIG_SND_MXC_SOC_FIQ) += snd-soc-imx-fiq.o +obj-$(CONFIG_SND_MXC_SOC_MX2) += snd-soc-imx-mx2.o # i.MX Machine Support snd-soc-eukrea-tlv320-objs := eukrea-tlv320.o diff --git a/sound/soc/imx/eukrea-tlv320.c b/sound/soc/imx/eukrea-tlv320.c index f15dfbdc47ee..807f736ee294 100644 --- a/sound/soc/imx/eukrea-tlv320.c +++ b/sound/soc/imx/eukrea-tlv320.c @@ -79,22 +79,19 @@ static struct snd_soc_ops eukrea_tlv320_snd_ops = { static struct snd_soc_dai_link eukrea_tlv320_dai = { .name = "tlv320aic23", .stream_name = "TLV320AIC23", - .codec_dai = &tlv320aic23_dai, + .codec_dai = "tlv320aic23-hifi", + .platform_name = "imx-pcm-audio.0", + .codec_name = "tlv320aic23-codec.0-001a", + .cpu_dai = "imx-ssi-dai.0", .ops = &eukrea_tlv320_snd_ops, }; static struct snd_soc_card eukrea_tlv320 = { .name = "cpuimx-audio", - .platform = &imx_soc_platform, .dai_link = &eukrea_tlv320_dai, .num_links = 1, }; -static struct snd_soc_device eukrea_tlv320_snd_devdata = { - .card = &eukrea_tlv320, - .codec_dev = &soc_codec_dev_tlv320aic23, -}; - static struct platform_device *eukrea_tlv320_snd_device; static int __init eukrea_tlv320_init(void) @@ -110,10 +107,7 @@ static int __init eukrea_tlv320_init(void) if (!eukrea_tlv320_snd_device) return -ENOMEM; - eukrea_tlv320_dai.cpu_dai = &imx_ssi_pcm_dai[0]; - - platform_set_drvdata(eukrea_tlv320_snd_device, &eukrea_tlv320_snd_devdata); - eukrea_tlv320_snd_devdata.dev = &eukrea_tlv320_snd_device->dev; + platform_set_drvdata(eukrea_tlv320_snd_device, &eukrea_tlv320); ret = platform_device_add(eukrea_tlv320_snd_device); if (ret) { diff --git a/sound/soc/imx/imx-pcm-dma-mx2.c b/sound/soc/imx/imx-pcm-dma-mx2.c index 0a595da4811d..fd493ee1428e 100644 --- a/sound/soc/imx/imx-pcm-dma-mx2.c +++ b/sound/soc/imx/imx-pcm-dma-mx2.c @@ -103,7 +103,7 @@ static int imx_ssi_dma_alloc(struct snd_pcm_substream *substream) struct imx_pcm_runtime_data *iprtd = runtime->private_data; int ret; - dma_params = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); + dma_params = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); iprtd->dma = imx_dma_request_by_prio(DRV_NAME, DMA_PRIO_HIGH); if (iprtd->dma < 0) { @@ -213,7 +213,7 @@ static int snd_imx_pcm_prepare(struct snd_pcm_substream *substream) struct imx_pcm_runtime_data *iprtd = runtime->private_data; int err; - dma_params = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); + dma_params = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); iprtd->substream = substream; iprtd->buf = (unsigned int *)substream->dma_buffer.area; @@ -318,19 +318,42 @@ static struct snd_pcm_ops imx_pcm_ops = { .mmap = snd_imx_pcm_mmap, }; -static struct snd_soc_platform imx_soc_platform_dma = { - .name = "imx-audio", - .pcm_ops = &imx_pcm_ops, +static struct snd_soc_platform_driver imx_soc_platform_mx2 = { + .ops = &imx_pcm_ops, .pcm_new = imx_pcm_new, .pcm_free = imx_pcm_free, }; -struct snd_soc_platform *imx_ssi_dma_mx2_init(struct platform_device *pdev, - struct imx_ssi *ssi) +static int __devinit imx_soc_platform_probe(struct platform_device *pdev) { - ssi->dma_params_tx.burstsize = DMA_TXFIFO_BURST; - ssi->dma_params_rx.burstsize = DMA_RXFIFO_BURST; + return snd_soc_register_platform(&pdev->dev, &imx_soc_platform_mx2); +} + +static int __devexit imx_soc_platform_remove(struct platform_device *pdev) +{ + snd_soc_unregister_platform(&pdev->dev); + return 0; +} + +static struct platform_driver imx_pcm_driver = { + .driver = { + .name = "imx-pcm-audio", + .owner = THIS_MODULE, + }, - return &imx_soc_platform_dma; + .probe = imx_soc_platform_probe, + .remove = __devexit_p(imx_soc_platform_remove), +}; + +static int __init snd_imx_pcm_init(void) +{ + return platform_driver_register(&imx_pcm_driver); +} +module_init(snd_imx_pcm_init); + +static void __exit snd_imx_pcm_exit(void) +{ + platform_driver_unregister(&imx_pcm_driver); } +module_exit(snd_imx_pcm_exit); diff --git a/sound/soc/imx/imx-pcm-fiq.c b/sound/soc/imx/imx-pcm-fiq.c index b2bf27282cd2..413b78da248f 100644 --- a/sound/soc/imx/imx-pcm-fiq.c +++ b/sound/soc/imx/imx-pcm-fiq.c @@ -236,6 +236,8 @@ static struct snd_pcm_ops imx_pcm_ops = { .mmap = snd_imx_pcm_mmap, }; +static int ssi_irq = 0; + static int imx_pcm_fiq_new(struct snd_card *card, struct snd_soc_dai *dai, struct snd_pcm *pcm) { @@ -245,7 +247,7 @@ static int imx_pcm_fiq_new(struct snd_card *card, struct snd_soc_dai *dai, if (ret) return ret; - if (dai->playback.channels_min) { + if (dai->driver->playback.channels_min) { struct snd_pcm_substream *substream = pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; struct snd_dma_buffer *buf = &substream->dma_buffer; @@ -253,7 +255,7 @@ static int imx_pcm_fiq_new(struct snd_card *card, struct snd_soc_dai *dai, imx_ssi_fiq_tx_buffer = (unsigned long)buf->area; } - if (dai->capture.channels_min) { + if (dai->driver->capture.channels_min) { struct snd_pcm_substream *substream = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream; struct snd_dma_buffer *buf = &substream->dma_buffer; @@ -267,24 +269,32 @@ static int imx_pcm_fiq_new(struct snd_card *card, struct snd_soc_dai *dai, return 0; } -static struct snd_soc_platform imx_soc_platform_fiq = { - .pcm_ops = &imx_pcm_ops, +static void imx_pcm_fiq_free(struct snd_pcm *pcm) +{ + mxc_set_irq_fiq(ssi_irq, 0); + release_fiq(&fh); + imx_pcm_free(pcm); +} + +static struct snd_soc_platform_driver imx_soc_platform_fiq = { + .ops = &imx_pcm_ops, .pcm_new = imx_pcm_fiq_new, - .pcm_free = imx_pcm_free, + .pcm_free = imx_pcm_fiq_free, }; -struct snd_soc_platform *imx_ssi_fiq_init(struct platform_device *pdev, - struct imx_ssi *ssi) +static int __devinit imx_soc_platform_probe(struct platform_device *pdev) { - int ret = 0; + struct imx_ssi *ssi = platform_get_drvdata(pdev); + int ret; ret = claim_fiq(&fh); if (ret) { dev_err(&pdev->dev, "failed to claim fiq: %d", ret); - return ERR_PTR(ret); + return ret; } mxc_set_irq_fiq(ssi->irq, 1); + ssi_irq = ssi->irq; imx_pcm_fiq = ssi->irq; @@ -293,13 +303,43 @@ struct snd_soc_platform *imx_ssi_fiq_init(struct platform_device *pdev, ssi->dma_params_tx.burstsize = 4; ssi->dma_params_rx.burstsize = 6; - return &imx_soc_platform_fiq; + ret = snd_soc_register_platform(&pdev->dev, &imx_soc_platform_fiq); + if (ret) + goto failed_register; + + return 0; + +failed_register: + mxc_set_irq_fiq(ssi_irq, 0); + release_fiq(&fh); + + return ret; } -void imx_ssi_fiq_exit(struct platform_device *pdev, - struct imx_ssi *ssi) +static int __devexit imx_soc_platform_remove(struct platform_device *pdev) { - mxc_set_irq_fiq(ssi->irq, 0); - release_fiq(&fh); + snd_soc_unregister_platform(&pdev->dev); + return 0; } +static struct platform_driver imx_pcm_driver = { + .driver = { + .name = "imx-fiq-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = imx_soc_platform_probe, + .remove = __devexit_p(imx_soc_platform_remove), +}; + +static int __init snd_imx_pcm_init(void) +{ + return platform_driver_register(&imx_pcm_driver); +} +module_init(snd_imx_pcm_init); + +static void __exit snd_imx_pcm_exit(void) +{ + platform_driver_unregister(&imx_pcm_driver); +} +module_exit(snd_imx_pcm_exit); diff --git a/sound/soc/imx/imx-ssi.c b/sound/soc/imx/imx-ssi.c index 50f51624c535..02a3e7c799d8 100644 --- a/sound/soc/imx/imx-ssi.c +++ b/sound/soc/imx/imx-ssi.c @@ -61,7 +61,7 @@ static int imx_ssi_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct imx_ssi *ssi = cpu_dai->private_data; + struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai); u32 sccr; sccr = readl(ssi->base + SSI_STCCR); @@ -86,7 +86,7 @@ static int imx_ssi_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, */ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { - struct imx_ssi *ssi = cpu_dai->private_data; + struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai); u32 strcr = 0, scr; scr = readl(ssi->base + SSI_SCR) & ~(SSI_SCR_SYN | SSI_SCR_NET); @@ -164,7 +164,7 @@ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) static int imx_ssi_set_dai_sysclk(struct snd_soc_dai *cpu_dai, int clk_id, unsigned int freq, int dir) { - struct imx_ssi *ssi = cpu_dai->private_data; + struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai); u32 scr; scr = readl(ssi->base + SSI_SCR); @@ -192,7 +192,7 @@ static int imx_ssi_set_dai_sysclk(struct snd_soc_dai *cpu_dai, static int imx_ssi_set_dai_clkdiv(struct snd_soc_dai *cpu_dai, int div_id, int div) { - struct imx_ssi *ssi = cpu_dai->private_data; + struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai); u32 stccr, srccr; stccr = readl(ssi->base + SSI_STCCR); @@ -241,7 +241,7 @@ static int imx_ssi_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *cpu_dai) { - struct imx_ssi *ssi = cpu_dai->private_data; + struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai); struct imx_pcm_dma_params *dma_data; u32 reg, sccr; @@ -279,9 +279,7 @@ static int imx_ssi_hw_params(struct snd_pcm_substream *substream, static int imx_ssi_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct imx_ssi *ssi = cpu_dai->private_data; + struct imx_ssi *ssi = snd_soc_dai_get_drvdata(dai); unsigned int sier_bits, sier; unsigned int scr; @@ -350,22 +348,6 @@ static struct snd_soc_dai_ops imx_ssi_pcm_dai_ops = { .trigger = imx_ssi_trigger, }; -static struct snd_soc_dai imx_ssi_dai = { - .playback = { - .channels_min = 2, - .channels_max = 2, - .rates = SNDRV_PCM_RATE_8000_96000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - }, - .capture = { - .channels_min = 2, - .channels_max = 2, - .rates = SNDRV_PCM_RATE_8000_96000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, - }, - .ops = &imx_ssi_pcm_dai_ops, -}; - int snd_imx_pcm_mmap(struct snd_pcm_substream *substream, struct vm_area_struct *vma) { @@ -381,6 +363,7 @@ int snd_imx_pcm_mmap(struct snd_pcm_substream *substream, runtime->dma_bytes); return ret; } +EXPORT_SYMBOL_GPL(snd_imx_pcm_mmap); static int imx_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream) { @@ -412,14 +395,14 @@ int imx_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, card->dev->dma_mask = &imx_pcm_dmamask; if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - if (dai->playback.channels_min) { + if (dai->driver->playback.channels_min) { ret = imx_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_PLAYBACK); if (ret) goto out; } - if (dai->capture.channels_min) { + if (dai->driver->capture.channels_min) { ret = imx_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_CAPTURE); if (ret) @@ -429,6 +412,7 @@ int imx_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, out: return ret; } +EXPORT_SYMBOL_GPL(imx_pcm_new); void imx_pcm_free(struct snd_pcm *pcm) { @@ -450,14 +434,40 @@ void imx_pcm_free(struct snd_pcm *pcm) buf->area = NULL; } } +EXPORT_SYMBOL_GPL(imx_pcm_free); -struct snd_soc_platform imx_soc_platform = { - .name = "imx-audio", +static struct snd_soc_dai_driver imx_ssi_dai = { + .playback = { + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_96000, + .formats = SNDRV_PCM_FMTBIT_S16_LE, + }, + .capture = { + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_96000, + .formats = SNDRV_PCM_FMTBIT_S16_LE, + }, + .ops = &imx_ssi_pcm_dai_ops, }; -EXPORT_SYMBOL_GPL(imx_soc_platform); -static struct snd_soc_dai imx_ac97_dai = { - .name = "AC97", +static int imx_ssi_dai_probe(struct snd_soc_dai *dai) +{ + struct imx_ssi *ssi = dev_get_drvdata(dai->dev); + uint32_t val; + + snd_soc_dai_set_drvdata(dai, ssi); + + val = SSI_SFCSR_TFWM0(ssi->dma_params_tx.burstsize) | + SSI_SFCSR_RFWM0(ssi->dma_params_rx.burstsize); + writel(val, ssi->base + SSI_SFCSR); + + return 0; +} + +static struct snd_soc_dai_driver imx_ac97_dai = { + .probe = imx_ssi_dai_probe, .ac97_control = 1, .playback = { .stream_name = "AC97 Playback", @@ -577,25 +587,18 @@ struct snd_ac97_bus_ops soc_ac97_ops = { }; EXPORT_SYMBOL_GPL(soc_ac97_ops); -struct snd_soc_dai imx_ssi_pcm_dai[2]; -EXPORT_SYMBOL_GPL(imx_ssi_pcm_dai); - static int imx_ssi_probe(struct platform_device *pdev) { struct resource *res; struct imx_ssi *ssi; struct imx_ssi_platform_data *pdata = pdev->dev.platform_data; - struct snd_soc_platform *platform; int ret = 0; - unsigned int val; - struct snd_soc_dai *dai = &imx_ssi_pcm_dai[pdev->id]; - - if (dai->id >= ARRAY_SIZE(imx_ssi_pcm_dai)) - return -EINVAL; + struct snd_soc_dai_driver *dai; ssi = kzalloc(sizeof(*ssi), GFP_KERNEL); if (!ssi) return -ENOMEM; + dev_set_drvdata(&pdev->dev, ssi); if (pdata) { ssi->ac97_reset = pdata->ac97_reset; @@ -640,9 +643,9 @@ static int imx_ssi_probe(struct platform_device *pdev) } ac97_ssi = ssi; setup_channel_to_ac97(ssi); - memcpy(dai, &imx_ac97_dai, sizeof(imx_ac97_dai)); + dai = &imx_ac97_dai; } else - memcpy(dai, &imx_ssi_dai, sizeof(imx_ssi_dai)); + dai = &imx_ssi_dai; writel(0x0, ssi->base + SSI_SIER); @@ -657,37 +660,36 @@ static int imx_ssi_probe(struct platform_device *pdev) if (res) ssi->dma_params_rx.dma = res->start; - dai->id = pdev->id; - dai->dev = &pdev->dev; - dai->name = kasprintf(GFP_KERNEL, "imx-ssi.%d", pdev->id); - dai->private_data = ssi; - if ((cpu_is_mx27() || cpu_is_mx21()) && !(ssi->flags & IMX_SSI_USE_AC97) && (ssi->flags & IMX_SSI_DMA)) { ssi->flags |= IMX_SSI_DMA; - platform = imx_ssi_dma_mx2_init(pdev, ssi); - } else - platform = imx_ssi_fiq_init(pdev, ssi); - - imx_soc_platform.pcm_ops = platform->pcm_ops; - imx_soc_platform.pcm_new = platform->pcm_new; - imx_soc_platform.pcm_free = platform->pcm_free; + } - val = SSI_SFCSR_TFWM0(ssi->dma_params_tx.burstsize) | - SSI_SFCSR_RFWM0(ssi->dma_params_rx.burstsize); - writel(val, ssi->base + SSI_SFCSR); + platform_set_drvdata(pdev, ssi); - ret = snd_soc_register_dai(dai); + ret = snd_soc_register_dai(&pdev->dev, dai); if (ret) { dev_err(&pdev->dev, "register DAI failed\n"); goto failed_register; } - platform_set_drvdata(pdev, ssi); + ssi->soc_platform_pdev = platform_device_alloc("imx-fiq-pcm-audio", pdev->id); + if (!ssi->soc_platform_pdev) + goto failed_pdev_alloc; + platform_set_drvdata(ssi->soc_platform_pdev, ssi); + ret = platform_device_add(ssi->soc_platform_pdev); + if (ret) { + dev_err(&pdev->dev, "failed to add platform device\n"); + goto failed_pdev_add; + } return 0; +failed_pdev_add: + platform_device_put(ssi->soc_platform_pdev); +failed_pdev_alloc: + snd_soc_unregister_dai(&pdev->dev); failed_register: failed_ac97: iounmap(ssi->base); @@ -706,16 +708,15 @@ static int __devexit imx_ssi_remove(struct platform_device *pdev) { struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); struct imx_ssi *ssi = platform_get_drvdata(pdev); - struct snd_soc_dai *dai = &imx_ssi_pcm_dai[pdev->id]; - snd_soc_unregister_dai(dai); + platform_device_del(ssi->soc_platform_pdev); + platform_device_put(ssi->soc_platform_pdev); + + snd_soc_unregister_dai(&pdev->dev); if (ssi->flags & IMX_SSI_USE_AC97) ac97_ssi = NULL; - if (!(ssi->flags & IMX_SSI_DMA)) - imx_ssi_fiq_exit(pdev, ssi); - iounmap(ssi->base); release_mem_region(res->start, resource_size(res)); clk_disable(ssi->clk); @@ -730,34 +731,19 @@ static struct platform_driver imx_ssi_driver = { .remove = __devexit_p(imx_ssi_remove), .driver = { - .name = DRV_NAME, + .name = "imx-ssi-dai", .owner = THIS_MODULE, }, }; static int __init imx_ssi_init(void) { - int ret; - - ret = snd_soc_register_platform(&imx_soc_platform); - if (ret) { - pr_err("failed to register soc platform: %d\n", ret); - return ret; - } - - ret = platform_driver_register(&imx_ssi_driver); - if (ret) { - snd_soc_unregister_platform(&imx_soc_platform); - return ret; - } - - return 0; + return platform_driver_register(&imx_ssi_driver); } static void __exit imx_ssi_exit(void) { platform_driver_unregister(&imx_ssi_driver); - snd_soc_unregister_platform(&imx_soc_platform); } module_init(imx_ssi_init); diff --git a/sound/soc/imx/imx-ssi.h b/sound/soc/imx/imx-ssi.h index 55f26ebcd8c2..53b780d9b2b0 100644 --- a/sound/soc/imx/imx-ssi.h +++ b/sound/soc/imx/imx-ssi.h @@ -183,9 +183,6 @@ #define IMX_SSI_RX_DIV_PSR 4 #define IMX_SSI_RX_DIV_PM 5 -extern struct snd_soc_dai imx_ssi_pcm_dai[2]; -extern struct snd_soc_platform imx_soc_platform; - #define DRV_NAME "imx-ssi" struct imx_pcm_dma_params { @@ -197,7 +194,7 @@ struct imx_pcm_dma_params { struct imx_ssi { struct platform_device *ac97_dev; - struct snd_soc_device imx_ac97; + struct snd_soc_dai *imx_ac97; struct clk *clk; void __iomem *base; int irq; @@ -213,6 +210,8 @@ struct imx_ssi { struct imx_pcm_dma_params dma_params_tx; int enabled; + + struct platform_device *soc_platform_pdev; }; struct snd_soc_platform *imx_ssi_fiq_init(struct platform_device *pdev, diff --git a/sound/soc/imx/phycore-ac97.c b/sound/soc/imx/phycore-ac97.c index a8307d55c70e..65f0f99ca6dd 100644 --- a/sound/soc/imx/phycore-ac97.c +++ b/sound/soc/imx/phycore-ac97.c @@ -32,23 +32,20 @@ static struct snd_soc_dai_link imx_phycore_dai_ac97[] = { { .name = "HiFi", .stream_name = "HiFi", - .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI], + .codec_dai_name = "wm9712-hifi", + .codec_name = "wm9712-codec", + .cpu_dai_name = "imx-ssi-dai.0", + .platform_name = "imx-fiq-pcm-audio.0", .ops = &imx_phycore_hifi_ops, }, }; static struct snd_soc_card imx_phycore = { .name = "PhyCORE-audio", - .platform = &imx_soc_platform, .dai_link = imx_phycore_dai_ac97, .num_links = ARRAY_SIZE(imx_phycore_dai_ac97), }; -static struct snd_soc_device imx_phycore_snd_devdata = { - .card = &imx_phycore, - .codec_dev = &soc_codec_dev_wm9712, -}; - static struct platform_device *imx_phycore_snd_device; static int __init imx_phycore_init(void) @@ -63,10 +60,12 @@ static int __init imx_phycore_init(void) if (!imx_phycore_snd_device) return -ENOMEM; - imx_phycore_dai_ac97[0].cpu_dai = &imx_ssi_pcm_dai[0]; + platform_set_drvdata(imx_phycore_snd_device, &imx_phycore); + ret = platform_device_add(imx_phycore_snd_device); - platform_set_drvdata(imx_phycore_snd_device, &imx_phycore_snd_devdata); - imx_phycore_snd_devdata.dev = &imx_phycore_snd_device->dev; + imx_phycore_snd_device = platform_device_alloc("wm9712-codec", -1); + if (!imx_phycore_snd_device) + return -ENOMEM; ret = platform_device_add(imx_phycore_snd_device); if (ret) { diff --git a/sound/soc/imx/wm1133-ev1.c b/sound/soc/imx/wm1133-ev1.c index a6e7d9497639..74068636c1d8 100644 --- a/sound/soc/imx/wm1133-ev1.c +++ b/sound/soc/imx/wm1133-ev1.c @@ -82,8 +82,8 @@ static int wm1133_ev1_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int i, found = 0; snd_pcm_format_t format = params_format(params); unsigned int rate = params_rate(params); @@ -210,9 +210,9 @@ static struct snd_soc_jack_pin mic_jack_pins[] = { { .pin = "Mic2 Jack", .mask = SND_JACK_MICROPHONE }, }; -static int wm1133_ev1_init(struct snd_soc_codec *codec) +static int wm1133_ev1_init(struct snd_soc_pcm_runtime *rtd) { - struct snd_soc_card *card = codec->socdev->card; + struct snd_soc_codec *codec = rtd->codec; snd_soc_dapm_new_controls(codec, wm1133_ev1_widgets, ARRAY_SIZE(wm1133_ev1_widgets)); @@ -221,13 +221,13 @@ static int wm1133_ev1_init(struct snd_soc_codec *codec) ARRAY_SIZE(wm1133_ev1_map)); /* Headphone jack detection */ - snd_soc_jack_new(card, "Headphone", SND_JACK_HEADPHONE, &hp_jack); + snd_soc_jack_new(codec, "Headphone", SND_JACK_HEADPHONE, &hp_jack); snd_soc_jack_add_pins(&hp_jack, ARRAY_SIZE(hp_jack_pins), hp_jack_pins); wm8350_hp_jack_detect(codec, WM8350_JDR, &hp_jack, SND_JACK_HEADPHONE); /* Microphone jack detection */ - snd_soc_jack_new(card, "Microphone", + snd_soc_jack_new(codec, "Microphone", SND_JACK_MICROPHONE | SND_JACK_BTN_0, &mic_jack); snd_soc_jack_add_pins(&mic_jack, ARRAY_SIZE(mic_jack_pins), mic_jack_pins); @@ -243,8 +243,10 @@ static int wm1133_ev1_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link wm1133_ev1_dai = { .name = "WM1133-EV1", .stream_name = "Audio", - .cpu_dai = &imx_ssi_pcm_dai[0], - .codec_dai = &wm8350_dai, + .cpu_dai_name = "imx-ssi-dai.0", + .codec_dai_name = "wm8350-hifi", + .platform_name = "imx-fiq-pcm-audio.0", + .codec_name = "wm8350-codec.0-0x1a", .init = wm1133_ev1_init, .ops = &wm1133_ev1_ops, .symmetric_rates = 1, @@ -252,16 +254,10 @@ static struct snd_soc_dai_link wm1133_ev1_dai = { static struct snd_soc_card wm1133_ev1 = { .name = "WM1133-EV1", - .platform = &imx_soc_platform, .dai_link = &wm1133_ev1_dai, .num_links = 1, }; -static struct snd_soc_device wm1133_ev1_snd_devdata = { - .card = &wm1133_ev1, - .codec_dev = &soc_codec_dev_wm8350, -}; - static struct platform_device *wm1133_ev1_snd_device; static int __init wm1133_ev1_audio_init(void) @@ -286,8 +282,7 @@ static int __init wm1133_ev1_audio_init(void) if (!wm1133_ev1_snd_device) return -ENOMEM; - platform_set_drvdata(wm1133_ev1_snd_device, &wm1133_ev1_snd_devdata); - wm1133_ev1_snd_devdata.dev = &wm1133_ev1_snd_device->dev; + platform_set_drvdata(wm1133_ev1_snd_device, &wm1133_ev1); ret = platform_device_add(wm1133_ev1_snd_device); if (ret) diff --git a/sound/soc/jz4740/jz4740-i2s.c b/sound/soc/jz4740/jz4740-i2s.c index eb518f0c5e01..f3cffd183401 100644 --- a/sound/soc/jz4740/jz4740-i2s.c +++ b/sound/soc/jz4740/jz4740-i2s.c @@ -106,15 +106,10 @@ static inline void jz4740_i2s_write(const struct jz4740_i2s *i2s, writel(value, i2s->base + reg); } -static inline struct jz4740_i2s *jz4740_dai_to_i2s(struct snd_soc_dai *dai) -{ - return dai->private_data; -} - static int jz4740_i2s_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai); uint32_t conf, ctrl; if (dai->active) @@ -136,7 +131,7 @@ static int jz4740_i2s_startup(struct snd_pcm_substream *substream, static void jz4740_i2s_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai); uint32_t conf; if (!dai->active) @@ -152,7 +147,7 @@ static void jz4740_i2s_shutdown(struct snd_pcm_substream *substream, static int jz4740_i2s_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { - struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai); uint32_t ctrl; uint32_t mask; @@ -186,7 +181,7 @@ static int jz4740_i2s_trigger(struct snd_pcm_substream *substream, int cmd, static int jz4740_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai); uint32_t format = 0; uint32_t conf; @@ -238,7 +233,7 @@ static int jz4740_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int jz4740_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai); enum jz4740_dma_width dma_width; struct jz4740_pcm_config *pcm_config; unsigned int sample_size; @@ -288,7 +283,7 @@ static int jz4740_i2s_hw_params(struct snd_pcm_substream *substream, static int jz4740_i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai); struct clk *parent; int ret = 0; @@ -312,7 +307,7 @@ static int jz4740_i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id, static int jz4740_i2s_suspend(struct snd_soc_dai *dai) { - struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai); uint32_t conf; if (dai->active) { @@ -330,7 +325,7 @@ static int jz4740_i2s_suspend(struct snd_soc_dai *dai) static int jz4740_i2s_resume(struct snd_soc_dai *dai) { - struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai); uint32_t conf; clk_enable(i2s->clk_aic); @@ -346,11 +341,38 @@ static int jz4740_i2s_resume(struct snd_soc_dai *dai) return 0; } -static int jz4740_i2s_probe(struct platform_device *pdev, struct snd_soc_dai *dai) +static void jz4740_i2c_init_pcm_config(struct jz4740_i2s *i2s) { - struct jz4740_i2s *i2s = jz4740_dai_to_i2s(dai); + struct jz4740_dma_config *dma_config; + + /* Playback */ + dma_config = &i2s->pcm_config_playback.dma_config; + dma_config->src_width = JZ4740_DMA_WIDTH_32BIT, + dma_config->transfer_size = JZ4740_DMA_TRANSFER_SIZE_16BYTE; + dma_config->request_type = JZ4740_DMA_TYPE_AIC_TRANSMIT; + dma_config->flags = JZ4740_DMA_SRC_AUTOINC; + dma_config->mode = JZ4740_DMA_MODE_SINGLE; + i2s->pcm_config_playback.fifo_addr = i2s->phys_base + JZ_REG_AIC_FIFO; + + /* Capture */ + dma_config = &i2s->pcm_config_capture.dma_config; + dma_config->dst_width = JZ4740_DMA_WIDTH_32BIT, + dma_config->transfer_size = JZ4740_DMA_TRANSFER_SIZE_16BYTE; + dma_config->request_type = JZ4740_DMA_TYPE_AIC_RECEIVE; + dma_config->flags = JZ4740_DMA_DST_AUTOINC; + dma_config->mode = JZ4740_DMA_MODE_SINGLE; + i2s->pcm_config_capture.fifo_addr = i2s->phys_base + JZ_REG_AIC_FIFO; +} + +static int jz4740_i2s_dai_probe(struct snd_soc_dai *dai) +{ + struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai); uint32_t conf; + clk_enable(i2s->clk_aic); + + jz4740_i2c_init_pcm_config(i2s); + conf = (7 << JZ_AIC_CONF_FIFO_RX_THRESHOLD_OFFSET) | (8 << JZ_AIC_CONF_FIFO_TX_THRESHOLD_OFFSET) | JZ_AIC_CONF_OVERFLOW_PLAY_LAST | @@ -363,6 +385,14 @@ static int jz4740_i2s_probe(struct platform_device *pdev, struct snd_soc_dai *da return 0; } +static int jz4740_i2s_dai_remove(struct snd_soc_dai *dai) +{ + struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai); + + clk_disable(i2s->clk_aic); + return 0; +} + static struct snd_soc_dai_ops jz4740_i2s_dai_ops = { .startup = jz4740_i2s_startup, .shutdown = jz4740_i2s_shutdown, @@ -375,9 +405,9 @@ static struct snd_soc_dai_ops jz4740_i2s_dai_ops = { #define JZ4740_I2S_FMTS (SNDRV_PCM_FMTBIT_S8 | \ SNDRV_PCM_FMTBIT_S16_LE) -struct snd_soc_dai jz4740_i2s_dai = { - .name = "jz4740-i2s", - .probe = jz4740_i2s_probe, +static struct snd_soc_dai_driver jz4740_i2s_dai = { + .probe = jz4740_i2s_dai_probe, + .remove = jz4740_i2s_dai_remove, .playback = { .channels_min = 1, .channels_max = 2, @@ -395,30 +425,6 @@ struct snd_soc_dai jz4740_i2s_dai = { .suspend = jz4740_i2s_suspend, .resume = jz4740_i2s_resume, }; -EXPORT_SYMBOL_GPL(jz4740_i2s_dai); - -static void __devinit jz4740_i2c_init_pcm_config(struct jz4740_i2s *i2s) -{ - struct jz4740_dma_config *dma_config; - - /* Playback */ - dma_config = &i2s->pcm_config_playback.dma_config; - dma_config->src_width = JZ4740_DMA_WIDTH_32BIT, - dma_config->transfer_size = JZ4740_DMA_TRANSFER_SIZE_16BYTE; - dma_config->request_type = JZ4740_DMA_TYPE_AIC_TRANSMIT; - dma_config->flags = JZ4740_DMA_SRC_AUTOINC; - dma_config->mode = JZ4740_DMA_MODE_SINGLE; - i2s->pcm_config_playback.fifo_addr = i2s->phys_base + JZ_REG_AIC_FIFO; - - /* Capture */ - dma_config = &i2s->pcm_config_capture.dma_config; - dma_config->dst_width = JZ4740_DMA_WIDTH_32BIT, - dma_config->transfer_size = JZ4740_DMA_TRANSFER_SIZE_16BYTE; - dma_config->request_type = JZ4740_DMA_TYPE_AIC_RECEIVE; - dma_config->flags = JZ4740_DMA_DST_AUTOINC; - dma_config->mode = JZ4740_DMA_MODE_SINGLE; - i2s->pcm_config_capture.fifo_addr = i2s->phys_base + JZ_REG_AIC_FIFO; -} static int __devinit jz4740_i2s_dev_probe(struct platform_device *pdev) { @@ -463,24 +469,17 @@ static int __devinit jz4740_i2s_dev_probe(struct platform_device *pdev) goto err_clk_put_aic; } - clk_enable(i2s->clk_aic); - - jz4740_i2c_init_pcm_config(i2s); - - jz4740_i2s_dai.private_data = i2s; - ret = snd_soc_register_dai(&jz4740_i2s_dai); + platform_set_drvdata(pdev, i2s); + ret = snd_soc_register_dai(&pdev->dev, &jz4740_i2s_dai); if (ret) { dev_err(&pdev->dev, "Failed to register DAI\n"); goto err_clk_put_i2s; } - platform_set_drvdata(pdev, i2s); - return 0; err_clk_put_i2s: - clk_disable(i2s->clk_aic); clk_put(i2s->clk_i2s); err_clk_put_aic: clk_put(i2s->clk_aic); @@ -498,9 +497,8 @@ static int __devexit jz4740_i2s_dev_remove(struct platform_device *pdev) { struct jz4740_i2s *i2s = platform_get_drvdata(pdev); - snd_soc_unregister_dai(&jz4740_i2s_dai); + snd_soc_unregister_dai(&pdev->dev); - clk_disable(i2s->clk_aic); clk_put(i2s->clk_i2s); clk_put(i2s->clk_aic); diff --git a/sound/soc/jz4740/jz4740-i2s.h b/sound/soc/jz4740/jz4740-i2s.h index da22ed88a589..5e49339d8b93 100644 --- a/sound/soc/jz4740/jz4740-i2s.h +++ b/sound/soc/jz4740/jz4740-i2s.h @@ -13,6 +13,4 @@ #define JZ4740_I2S_BIT_CLK 0 -extern struct snd_soc_dai jz4740_i2s_dai; - #endif diff --git a/sound/soc/jz4740/jz4740-pcm.c b/sound/soc/jz4740/jz4740-pcm.c index ee68d850c8dd..fb1483f7c966 100644 --- a/sound/soc/jz4740/jz4740-pcm.c +++ b/sound/soc/jz4740/jz4740-pcm.c @@ -109,7 +109,7 @@ static int jz4740_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_soc_pcm_runtime *rtd = substream->private_data; struct jz4740_pcm_config *config; - config = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); + config = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); if (!config) return 0; @@ -310,14 +310,14 @@ int jz4740_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - if (dai->playback.channels_min) { + if (dai->driver->playback.channels_min) { ret = jz4740_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_PLAYBACK); if (ret) goto err; } - if (dai->capture.channels_min) { + if (dai->driver->capture.channels_min) { ret = jz4740_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_CAPTURE); if (ret) @@ -328,22 +328,20 @@ err: return ret; } -struct snd_soc_platform jz4740_soc_platform = { - .name = "jz4740-pcm", - .pcm_ops = &jz4740_pcm_ops, +static struct snd_soc_platform_driver jz4740_soc_platform = { + .ops = &jz4740_pcm_ops, .pcm_new = jz4740_pcm_new, .pcm_free = jz4740_pcm_free, }; -EXPORT_SYMBOL_GPL(jz4740_soc_platform); static int __devinit jz4740_pcm_probe(struct platform_device *pdev) { - return snd_soc_register_platform(&jz4740_soc_platform); + return snd_soc_register_platform(&pdev->dev, &jz4740_soc_platform); } static int __devexit jz4740_pcm_remove(struct platform_device *pdev) { - snd_soc_unregister_platform(&jz4740_soc_platform); + snd_soc_unregister_platform(&pdev->dev); return 0; } @@ -351,7 +349,7 @@ static struct platform_driver jz4740_pcm_driver = { .probe = jz4740_pcm_probe, .remove = __devexit_p(jz4740_pcm_remove), .driver = { - .name = "jz4740-pcm", + .name = "jz4740-pcm-audio", .owner = THIS_MODULE, }, }; diff --git a/sound/soc/jz4740/jz4740-pcm.h b/sound/soc/jz4740/jz4740-pcm.h index e3f221e2779c..1220cbb4382c 100644 --- a/sound/soc/jz4740/jz4740-pcm.h +++ b/sound/soc/jz4740/jz4740-pcm.h @@ -11,8 +11,6 @@ #include #include -/* platform data */ -extern struct snd_soc_platform jz4740_soc_platform; struct jz4740_pcm_config { struct jz4740_dma_config dma_config; diff --git a/sound/soc/jz4740/qi_lb60.c b/sound/soc/jz4740/qi_lb60.c index f15f4918f15f..78dabebe8fd0 100644 --- a/sound/soc/jz4740/qi_lb60.c +++ b/sound/soc/jz4740/qi_lb60.c @@ -60,10 +60,11 @@ static const struct snd_soc_dapm_route qi_lb60_routes[] = { SND_SOC_DAIFMT_NB_NF | \ SND_SOC_DAIFMT_CBM_CFM) -static int qi_lb60_codec_init(struct snd_soc_codec *codec) +static int qi_lb60_codec_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret; - struct snd_soc_dai *cpu_dai = codec->socdev->card->dai_link->cpu_dai; snd_soc_dapm_nc_pin(codec, "LIN"); snd_soc_dapm_nc_pin(codec, "RIN"); @@ -84,8 +85,10 @@ static int qi_lb60_codec_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link qi_lb60_dai = { .name = "jz4740", .stream_name = "jz4740", - .cpu_dai = &jz4740_i2s_dai, - .codec_dai = &jz4740_codec_dai, + .cpu_dai_name = "jz4740-i2s", + .platform_name = "jz4740-pmc-audio", + .codec_dai_name = "jz4740-hifi", + .codec_name = "jz4740-codec", .init = qi_lb60_codec_init, }; @@ -93,12 +96,6 @@ static struct snd_soc_card qi_lb60 = { .name = "QI LB60", .dai_link = &qi_lb60_dai, .num_links = 1, - .platform = &jz4740_soc_platform, -}; - -static struct snd_soc_device qi_lb60_snd_devdata = { - .card = &qi_lb60, - .codec_dev = &soc_codec_dev_jz4740_codec, }; static struct platform_device *qi_lb60_snd_device; @@ -129,8 +126,7 @@ static int __init qi_lb60_init(void) gpio_direction_output(QI_LB60_SND_GPIO, 0); gpio_direction_output(QI_LB60_AMP_GPIO, 0); - platform_set_drvdata(qi_lb60_snd_device, &qi_lb60_snd_devdata); - qi_lb60_snd_devdata.dev = &qi_lb60_snd_device->dev; + platform_set_drvdata(qi_lb60_snd_device, &qi_lb60); ret = platform_device_add(qi_lb60_snd_device); if (ret) { diff --git a/sound/soc/kirkwood/kirkwood-dma.c b/sound/soc/kirkwood/kirkwood-dma.c index a30205be3e2b..693049d42d24 100644 --- a/sound/soc/kirkwood/kirkwood-dma.c +++ b/sound/soc/kirkwood/kirkwood-dma.c @@ -18,7 +18,6 @@ #include #include #include -#include "kirkwood-dma.h" #include "kirkwood.h" #define KIRKWOOD_RATES \ @@ -123,9 +122,10 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream) int err; struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; - struct snd_soc_dai *cpu_dai = soc_runtime->dai->cpu_dai; + struct snd_soc_platform *platform = soc_runtime->platform; + struct snd_soc_dai *cpu_dai = soc_runtime->cpu_dai; struct kirkwood_dma_data *priv; - struct kirkwood_dma_priv *prdata = cpu_dai->private_data; + struct kirkwood_dma_priv *prdata = snd_soc_platform_get_drvdata(platform); unsigned long addr; priv = snd_soc_dai_get_dma_data(cpu_dai, substream); @@ -151,7 +151,7 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream) if (err < 0) return err; - if (soc_runtime->dai->cpu_dai->private_data == NULL) { + if (prdata == NULL) { prdata = kzalloc(sizeof(struct kirkwood_dma_priv), GFP_KERNEL); if (prdata == NULL) return -ENOMEM; @@ -165,7 +165,7 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream) return -EBUSY; } - soc_runtime->dai->cpu_dai->private_data = prdata; + snd_soc_platform_set_drvdata(platform, prdata); /* * Enable Error interrupts. We're only ack'ing them but @@ -191,8 +191,9 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream) static int kirkwood_dma_close(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; - struct snd_soc_dai *cpu_dai = soc_runtime->dai->cpu_dai; - struct kirkwood_dma_priv *prdata = cpu_dai->private_data; + struct snd_soc_dai *cpu_dai = soc_runtime->cpu_dai; + struct snd_soc_platform *platform = soc_runtime->platform; + struct kirkwood_dma_priv *prdata = snd_soc_platform_get_drvdata(platform); struct kirkwood_dma_data *priv; priv = snd_soc_dai_get_dma_data(cpu_dai, substream); @@ -209,7 +210,7 @@ static int kirkwood_dma_close(struct snd_pcm_substream *substream) writel(0, priv->io + KIRKWOOD_ERR_MASK); free_irq(priv->irq, prdata); kfree(prdata); - soc_runtime->dai->cpu_dai->private_data = NULL; + snd_soc_platform_set_drvdata(platform, NULL); } return 0; @@ -236,7 +237,7 @@ static int kirkwood_dma_prepare(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; - struct snd_soc_dai *cpu_dai = soc_runtime->dai->cpu_dai; + struct snd_soc_dai *cpu_dai = soc_runtime->cpu_dai; struct kirkwood_dma_data *priv; unsigned long size, count; @@ -265,7 +266,7 @@ static snd_pcm_uframes_t kirkwood_dma_pointer(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; - struct snd_soc_dai *cpu_dai = soc_runtime->dai->cpu_dai; + struct snd_soc_dai *cpu_dai = soc_runtime->cpu_dai; struct kirkwood_dma_data *priv; snd_pcm_uframes_t count; @@ -320,14 +321,14 @@ static int kirkwood_dma_new(struct snd_card *card, if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = 0xffffffff; - if (dai->playback.channels_min) { + if (dai->driver->playback.channels_min) { ret = kirkwood_dma_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_PLAYBACK); if (ret) return ret; } - if (dai->capture.channels_min) { + if (dai->driver->capture.channels_min) { ret = kirkwood_dma_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_CAPTURE); if (ret) @@ -357,25 +358,44 @@ static void kirkwood_dma_free_dma_buffers(struct snd_pcm *pcm) } } -struct snd_soc_platform kirkwood_soc_platform = { - .name = "kirkwood-dma", - .pcm_ops = &kirkwood_dma_ops, +static struct snd_soc_platform_driver kirkwood_soc_platform = { + .ops = &kirkwood_dma_ops, .pcm_new = kirkwood_dma_new, .pcm_free = kirkwood_dma_free_dma_buffers, }; -EXPORT_SYMBOL_GPL(kirkwood_soc_platform); -static int __init kirkwood_soc_platform_init(void) +static int __devinit kirkwood_soc_platform_probe(struct platform_device *pdev) { - return snd_soc_register_platform(&kirkwood_soc_platform); + return snd_soc_register_platform(&pdev->dev, &kirkwood_soc_platform); } -module_init(kirkwood_soc_platform_init); -static void __exit kirkwood_soc_platform_exit(void) +static int __devexit kirkwood_soc_platform_remove(struct platform_device *pdev) { - snd_soc_unregister_platform(&kirkwood_soc_platform); + snd_soc_unregister_platform(&pdev->dev); + return 0; +} + +static struct platform_driver kirkwood_pcm_driver = { + .driver = { + .name = "kirkwood-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = kirkwood_soc_platform_probe, + .remove = __devexit_p(kirkwood_soc_platform_remove), +}; + +static int __init kirkwood_pcm_init(void) +{ + return platform_driver_register(&kirkwood_pcm_driver); +} +module_init(kirkwood_pcm_init); + +static void __exit kirkwood_pcm_exit(void) +{ + platform_driver_unregister(&kirkwood_pcm_driver); } -module_exit(kirkwood_soc_platform_exit); +module_exit(kirkwood_pcm_exit); MODULE_AUTHOR("Arnaud Patard "); MODULE_DESCRIPTION("Marvell Kirkwood Audio DMA module"); diff --git a/sound/soc/kirkwood/kirkwood-dma.h b/sound/soc/kirkwood/kirkwood-dma.h deleted file mode 100644 index ba4454cd34f1..000000000000 --- a/sound/soc/kirkwood/kirkwood-dma.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * kirkwood-dma.h - * - * (c) 2010 Arnaud Patard - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - */ - -#ifndef _KIRKWOOD_DMA_H -#define _KIRKWOOD_DMA_H - -extern struct snd_soc_platform kirkwood_soc_platform; - -#endif diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c index 981ffc2a13c8..9b62cba4f590 100644 --- a/sound/soc/kirkwood/kirkwood-i2s.c +++ b/sound/soc/kirkwood/kirkwood-i2s.c @@ -20,7 +20,6 @@ #include #include #include -#include "kirkwood-i2s.h" #include "kirkwood.h" #define DRV_NAME "kirkwood-i2s" @@ -33,13 +32,10 @@ SNDRV_PCM_FMTBIT_S24_LE | \ SNDRV_PCM_FMTBIT_S32_LE) - -struct snd_soc_dai kirkwood_i2s_dai; -static struct kirkwood_dma_data *priv; - static int kirkwood_i2s_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { + struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(cpu_dai); unsigned long mask; unsigned long value; @@ -101,10 +97,20 @@ static inline void kirkwood_set_dco(void __iomem *io, unsigned long rate) } while (value == 0); } +static int kirkwood_i2s_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai); + + snd_soc_dai_set_dma_data(dai, substream, priv); + return 0; +} + static int kirkwood_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { + struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai); unsigned int i2s_reg, reg; unsigned long i2s_value, value; @@ -171,6 +177,7 @@ static int kirkwood_i2s_hw_params(struct snd_pcm_substream *substream, static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { + struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai); unsigned long value; /* @@ -244,6 +251,7 @@ static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream, static int kirkwood_i2s_rec_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { + struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai); unsigned long value; value = readl(priv->io + KIRKWOOD_RECCTL); @@ -323,9 +331,9 @@ static int kirkwood_i2s_trigger(struct snd_pcm_substream *substream, int cmd, return 0; } -static int kirkwood_i2s_probe(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int kirkwood_i2s_probe(struct snd_soc_dai *dai) { + struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai); unsigned long value; unsigned int reg_data; @@ -359,21 +367,20 @@ static int kirkwood_i2s_probe(struct platform_device *pdev, } -static void kirkwood_i2s_remove(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int kirkwood_i2s_remove(struct snd_soc_dai *dai) { + return 0; } static struct snd_soc_dai_ops kirkwood_i2s_dai_ops = { + .startup = kirkwood_i2s_startup, .trigger = kirkwood_i2s_trigger, .hw_params = kirkwood_i2s_hw_params, .set_fmt = kirkwood_i2s_set_fmt, }; -struct snd_soc_dai kirkwood_i2s_dai = { - .name = DRV_NAME, - .id = 0, +static struct snd_soc_dai_driver kirkwood_i2s_dai = { .probe = kirkwood_i2s_probe, .remove = kirkwood_i2s_remove, .playback = { @@ -388,13 +395,13 @@ struct snd_soc_dai kirkwood_i2s_dai = { .formats = KIRKWOOD_I2S_FORMATS,}, .ops = &kirkwood_i2s_dai_ops, }; -EXPORT_SYMBOL_GPL(kirkwood_i2s_dai); static __devinit int kirkwood_i2s_dev_probe(struct platform_device *pdev) { struct resource *mem; struct kirkwood_asoc_platform_data *data = pdev->dev.platform_data; + struct kirkwood_dma_data *priv; int err; priv = kzalloc(sizeof(struct kirkwood_dma_data), GFP_KERNEL); @@ -403,6 +410,7 @@ static __devinit int kirkwood_i2s_dev_probe(struct platform_device *pdev) err = -ENOMEM; goto error; } + dev_set_drvdata(&pdev->dev, priv); mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!mem) { @@ -441,10 +449,7 @@ static __devinit int kirkwood_i2s_dev_probe(struct platform_device *pdev) priv->dram = data->dram; priv->burst = data->burst; - kirkwood_i2s_dai.capture.dma_data = priv; - kirkwood_i2s_dai.playback.dma_data = priv; - - return snd_soc_register_dai(&kirkwood_i2s_dai); + return snd_soc_register_dai(&pdev->dev, &kirkwood_i2s_dai); err_ioremap: iounmap(priv->io); @@ -458,12 +463,13 @@ error: static __devexit int kirkwood_i2s_dev_remove(struct platform_device *pdev) { - if (priv) { - iounmap(priv->io); - release_mem_region(priv->mem->start, SZ_16K); - kfree(priv); - } - snd_soc_unregister_dai(&kirkwood_i2s_dai); + struct kirkwood_dma_data *priv = dev_get_drvdata(&pdev->dev); + + snd_soc_unregister_dai(&pdev->dev); + iounmap(priv->io); + release_mem_region(priv->mem->start, SZ_16K); + kfree(priv); + return 0; } diff --git a/sound/soc/kirkwood/kirkwood-i2s.h b/sound/soc/kirkwood/kirkwood-i2s.h deleted file mode 100644 index c5595c616d7a..000000000000 --- a/sound/soc/kirkwood/kirkwood-i2s.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * kirkwood-i2s.h - * - * (c) 2010 Arnaud Patard - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - */ - -#ifndef _KIRKWOOD_I2S_H -#define _KIRKWOOD_I2S_H - -extern struct snd_soc_dai kirkwood_i2s_dai; - -#endif diff --git a/sound/soc/kirkwood/kirkwood-openrd.c b/sound/soc/kirkwood/kirkwood-openrd.c index 0353d06bc41a..cc1a1e277edf 100644 --- a/sound/soc/kirkwood/kirkwood-openrd.c +++ b/sound/soc/kirkwood/kirkwood-openrd.c @@ -18,16 +18,14 @@ #include #include #include -#include "kirkwood-i2s.h" -#include "kirkwood-dma.h" #include "../codecs/cs42l51.h" static int openrd_client_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret; unsigned int freq, fmt; @@ -66,8 +64,10 @@ static struct snd_soc_dai_link openrd_client_dai[] = { { .name = "CS42L51", .stream_name = "CS42L51 HiFi", - .cpu_dai = &kirkwood_i2s_dai, - .codec_dai = &cs42l51_dai, + .cpu_dai_name = "kirkwood-i2s", + .platform_name = "kirkwood-pcm-audio", + .codec_dai_name = "cs42l51_hifi", + .codec_name = "cs42l51-codec.0-004a", .ops = &openrd_client_ops, }, }; @@ -75,16 +75,10 @@ static struct snd_soc_dai_link openrd_client_dai[] = { static struct snd_soc_card openrd_client = { .name = "OpenRD Client", - .platform = &kirkwood_soc_platform, .dai_link = openrd_client_dai, .num_links = ARRAY_SIZE(openrd_client_dai), }; -static struct snd_soc_device openrd_client_snd_devdata = { - .card = &openrd_client, - .codec_dev = &soc_codec_device_cs42l51, -}; - static struct platform_device *openrd_client_snd_device; static int __init openrd_client_init(void) @@ -99,8 +93,7 @@ static int __init openrd_client_init(void) return -ENOMEM; platform_set_drvdata(openrd_client_snd_device, - &openrd_client_snd_devdata); - openrd_client_snd_devdata.dev = &openrd_client_snd_device->dev; + &openrd_client); ret = platform_device_add(openrd_client_snd_device); if (ret) { diff --git a/sound/soc/nuc900/nuc900-ac97.c b/sound/soc/nuc900/nuc900-ac97.c index caa7c901bc2e..02b64a17dec2 100644 --- a/sound/soc/nuc900/nuc900-ac97.c +++ b/sound/soc/nuc900/nuc900-ac97.c @@ -297,8 +297,7 @@ static struct snd_soc_dai_ops nuc900_ac97_dai_ops = { .trigger = nuc900_ac97_trigger, }; -struct snd_soc_dai nuc900_ac97_dai = { - .name = "nuc900-ac97", +static struct snd_soc_dai_driver nuc900_ac97_dai = { .probe = nuc900_ac97_probe, .remove = nuc900_ac97_remove, .ac97_control = 1, @@ -316,7 +315,6 @@ struct snd_soc_dai nuc900_ac97_dai = { }, .ops = &nuc900_ac97_dai_ops, } -EXPORT_SYMBOL_GPL(nuc900_ac97_dai); static int __devinit nuc900_ac97_drvprobe(struct platform_device *pdev) { @@ -365,9 +363,7 @@ static int __devinit nuc900_ac97_drvprobe(struct platform_device *pdev) nuc900_ac97_data = nuc900_audio; - nuc900_audio->dev = nuc900_ac97_dai.dev = &pdev->dev; - - ret = snd_soc_register_dai(&nuc900_ac97_dai); + ret = snd_soc_register_dai(&pdev->dev, &nuc900_ac97_dai); if (ret) goto out3; @@ -390,7 +386,7 @@ out0: static int __devexit nuc900_ac97_drvremove(struct platform_device *pdev) { - snd_soc_unregister_dai(&nuc900_ac97_dai); + snd_soc_unregister_dai(&pdev->dev); clk_put(nuc900_ac97_data->clk); iounmap(nuc900_ac97_data->mmio); @@ -404,7 +400,7 @@ static int __devexit nuc900_ac97_drvremove(struct platform_device *pdev) static struct platform_driver nuc900_ac97_driver = { .driver = { - .name = "nuc900-audio", + .name = "nuc900-ac97", .owner = THIS_MODULE, }, .probe = nuc900_ac97_drvprobe, diff --git a/sound/soc/nuc900/nuc900-audio.c b/sound/soc/nuc900/nuc900-audio.c index 72e6f518f7b2..161f5b667d7b 100644 --- a/sound/soc/nuc900/nuc900-audio.c +++ b/sound/soc/nuc900/nuc900-audio.c @@ -20,26 +20,21 @@ #include #include -#include "../codecs/ac97.h" #include "nuc900-audio.h" static struct snd_soc_dai_link nuc900evb_ac97_dai = { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai = &nuc900_ac97_dai, - .codec_dai = &ac97_dai, + .cpu_dai_name = "nuc900-ac97", + .codec_dai_name = "ac97-hifi", + .codec_name = "ac97-codec", + .platform_name = "nuc900-pcm-audio", }; static struct snd_soc_card nuc900evb_audio_machine = { .name = "NUC900EVB_AC97", .dai_link = &nuc900evb_ac97_dai, .num_links = 1, - .platform = &nuc900_soc_platform, -}; - -static struct snd_soc_device nuc900evb_ac97_devdata = { - .card = &nuc900evb_audio_machine, - .codec_dev = &soc_codec_dev_ac97, }; static struct platform_device *nuc900evb_asoc_dev; @@ -54,9 +49,8 @@ static int __init nuc900evb_audio_init(void) goto out; /* nuc900 board audio device */ - platform_set_drvdata(nuc900evb_asoc_dev, &nuc900evb_ac97_devdata); + platform_set_drvdata(nuc900evb_asoc_dev, &nuc900evb_audio_machine); - nuc900evb_ac97_devdata.dev = &nuc900evb_asoc_dev->dev; ret = platform_device_add(nuc900evb_asoc_dev); if (ret) { diff --git a/sound/soc/nuc900/nuc900-audio.h b/sound/soc/nuc900/nuc900-audio.h index 3038f519729f..aeed8ead2b2b 100644 --- a/sound/soc/nuc900/nuc900-audio.h +++ b/sound/soc/nuc900/nuc900-audio.h @@ -110,8 +110,4 @@ struct nuc900_audio { }; -extern struct nuc900_audio *nuc900_ac97_data; -extern struct snd_soc_dai nuc900_ac97_dai; -extern struct snd_soc_platform nuc900_soc_platform; - #endif /*end _NUC900_AUDIO_H */ diff --git a/sound/soc/nuc900/nuc900-pcm.c b/sound/soc/nuc900/nuc900-pcm.c index e81e803b3a63..195d1ac94771 100644 --- a/sound/soc/nuc900/nuc900-pcm.c +++ b/sound/soc/nuc900/nuc900-pcm.c @@ -328,26 +328,44 @@ static int nuc900_dma_new(struct snd_card *card, return 0; } -struct snd_soc_platform nuc900_soc_platform = { - .name = "nuc900-dma", - .pcm_ops = &nuc900_dma_ops, +static struct snd_soc_platform_driver nuc900_soc_platform = { + .ops = &nuc900_dma_ops, .pcm_new = nuc900_dma_new, .pcm_free = nuc900_dma_free_dma_buffers, } -EXPORT_SYMBOL_GPL(nuc900_soc_platform); -static int __init nuc900_soc_platform_init(void) +static int __devinit nuc900_soc_platform_probe(struct platform_device *pdev) { - return snd_soc_register_platform(&nuc900_soc_platform); + return snd_soc_register_platform(&pdev->dev, &nuc900_soc_platform); } -static void __exit nuc900_soc_platform_exit(void) +static int __devexit nuc900_soc_platform_remove(struct platform_device *pdev) { - snd_soc_unregister_platform(&nuc900_soc_platform); + snd_soc_unregister_platform(&pdev->dev); + return 0; } -module_init(nuc900_soc_platform_init); -module_exit(nuc900_soc_platform_exit); +static struct platform_driver nuc900_pcm_driver = { + .driver = { + .name = "nuc900-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = nuc900_soc_platform_probe, + .remove = __devexit_p(nuc900_soc_platform_remove), +}; + +static int __init nuc900_pcm_init(void) +{ + return platform_driver_register(&nuc900_pcm_driver); +} +module_init(nuc900_pcm_init); + +static void __exit nuc900_pcm_exit(void) +{ + platform_driver_unregister(&nuc900_pcm_driver); +} +module_exit(nuc900_pcm_exit); MODULE_AUTHOR("Wan ZongShun, "); MODULE_DESCRIPTION("nuc900 Audio DMA module"); diff --git a/sound/soc/omap/am3517evm.c b/sound/soc/omap/am3517evm.c index 135901b2ea11..68bd902ccd4e 100644 --- a/sound/soc/omap/am3517evm.c +++ b/sound/soc/omap/am3517evm.c @@ -40,8 +40,8 @@ static int am3517evm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret; /* Set codec DAI configuration */ @@ -111,8 +111,10 @@ static const struct snd_soc_dapm_route audio_map[] = { {"MICIN", NULL, "Mic In"}, }; -static int am3517evm_aic23_init(struct snd_soc_codec *codec) +static int am3517evm_aic23_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; + /* Add am3517-evm specific widgets */ snd_soc_dapm_new_controls(codec, tlv320aic23_dapm_widgets, ARRAY_SIZE(tlv320aic23_dapm_widgets)); @@ -134,8 +136,10 @@ static int am3517evm_aic23_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link am3517evm_dai = { .name = "TLV320AIC23", .stream_name = "AIC23", - .cpu_dai = &omap_mcbsp_dai[0], - .codec_dai = &tlv320aic23_dai, + .cpu_dai_name ="omap-mcbsp-dai.0", + .codec_dai_name = "tlv320aic23-hifi", + .platform_name = "omap-pcm-audio", + .codec_name = "tlv320aic23-codec", .init = am3517evm_aic23_init, .ops = &am3517evm_ops, }; @@ -143,17 +147,10 @@ static struct snd_soc_dai_link am3517evm_dai = { /* Audio machine driver */ static struct snd_soc_card snd_soc_am3517evm = { .name = "am3517evm", - .platform = &omap_soc_platform, .dai_link = &am3517evm_dai, .num_links = 1, }; -/* Audio subsystem */ -static struct snd_soc_device am3517evm_snd_devdata = { - .card = &snd_soc_am3517evm, - .codec_dev = &soc_codec_dev_tlv320aic23, -}; - static struct platform_device *am3517evm_snd_device; static int __init am3517evm_soc_init(void) @@ -172,9 +169,7 @@ static int __init am3517evm_soc_init(void) return -ENOMEM; } - platform_set_drvdata(am3517evm_snd_device, &am3517evm_snd_devdata); - am3517evm_snd_devdata.dev = &am3517evm_snd_device->dev; - *(unsigned int *)am3517evm_dai.cpu_dai->private_data = 0; /* McBSP1 */ + platform_set_drvdata(am3517evm_snd_device, &snd_soc_am3517evm); ret = platform_device_add(am3517evm_snd_device); if (ret) diff --git a/sound/soc/omap/ams-delta.c b/sound/soc/omap/ams-delta.c index b0f618e44840..9d88efa06e3c 100644 --- a/sound/soc/omap/ams-delta.c +++ b/sound/soc/omap/ams-delta.c @@ -99,7 +99,7 @@ static int ams_delta_set_audio_mode(struct snd_kcontrol *kcontrol, int pin, changed = 0; /* Refuse any mode changes if we are not able to control the codec. */ - if (!codec->control_data) + if (!codec->hw_write) return -EUNATCH; if (ucontrol->value.enumerated.item[0] >= control->max) @@ -268,10 +268,32 @@ static void cx81801_timeout(unsigned long data) ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_CODEC, 0); } +/* + * Used for passing a codec structure pointer + * from the board initialization code to the tty line discipline. + */ +static struct snd_soc_codec *cx20442_codec; + /* Line discipline .open() */ static int cx81801_open(struct tty_struct *tty) { - return v253_ops.open(tty); + int ret; + + if (!cx20442_codec) + return -ENODEV; + + /* + * Pass the codec structure pointer for use by other ldisc callbacks, + * both the card and the codec specific parts. + */ + tty->disc_data = cx20442_codec; + + ret = v253_ops.open(tty); + + if (ret < 0) + tty->disc_data = NULL; + + return ret; } /* Line discipline .close() */ @@ -281,11 +303,14 @@ static void cx81801_close(struct tty_struct *tty) del_timer_sync(&cx81801_timer); - v253_ops.close(tty); - /* Prevent the hook switch from further changing the DAPM pins */ INIT_LIST_HEAD(&ams_delta_hook_switch.pins); + if (!codec) + return; + + v253_ops.close(tty); + /* Revert back to default audio input/output constellation */ snd_soc_dapm_disable_pin(codec, "Mouthpiece"); snd_soc_dapm_enable_pin(codec, "Earpiece"); @@ -310,7 +335,10 @@ static void cx81801_receive(struct tty_struct *tty, const unsigned char *c; int apply, ret; - if (!codec->control_data) { + if (!codec) + return; + + if (!codec->hw_write) { /* First modem response, complete setup procedure */ /* Initialize timer used for config pulse generation */ @@ -323,7 +351,7 @@ static void cx81801_receive(struct tty_struct *tty, ARRAY_SIZE(ams_delta_hook_switch_pins), ams_delta_hook_switch_pins); if (ret) - dev_warn(codec->socdev->card->dev, + dev_warn(codec->dev, "Failed to link hook switch to DAPM pins, " "will continue with hook switch unlinked.\n"); @@ -383,7 +411,7 @@ static int ams_delta_hw_params(struct snd_pcm_substream *substream, struct snd_soc_pcm_runtime *rtd = substream->private_data; /* Set cpu DAI configuration */ - return snd_soc_dai_set_fmt(rtd->dai->cpu_dai, + return snd_soc_dai_set_fmt(rtd->cpu_dai, SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); @@ -398,7 +426,7 @@ static struct snd_soc_ops ams_delta_ops = { static int ams_delta_set_bias_level(struct snd_soc_card *card, enum snd_soc_bias_level level) { - struct snd_soc_codec *codec = card->codec; + struct snd_soc_codec *codec = card->rtd->codec; switch (level) { case SND_SOC_BIAS_ON: @@ -461,18 +489,22 @@ static void ams_delta_shutdown(struct snd_pcm_substream *substream) * Card initialization */ -static int ams_delta_cx20442_init(struct snd_soc_codec *codec) +static int ams_delta_cx20442_init(struct snd_soc_pcm_runtime *rtd) { - struct snd_soc_dai *codec_dai = codec->dai; - struct snd_soc_card *card = codec->socdev->card; + struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_card *card = rtd->card; int ret; /* Codec is ready, now add/activate board specific controls */ + /* Store a pointer to the codec structure for tty ldisc use */ + cx20442_codec = codec; + /* Set up digital mute if not provided by the codec */ - if (!codec_dai->ops) { - codec_dai->ops = &ams_delta_dai_ops; - } else if (!codec_dai->ops->digital_mute) { - codec_dai->ops->digital_mute = ams_delta_digital_mute; + if (!codec_dai->driver->ops) { + codec_dai->driver->ops = &ams_delta_dai_ops; + } else if (!codec_dai->driver->ops->digital_mute) { + codec_dai->driver->ops->digital_mute = ams_delta_digital_mute; } else { ams_delta_ops.startup = ams_delta_startup; ams_delta_ops.shutdown = ams_delta_shutdown; @@ -483,7 +515,7 @@ static int ams_delta_cx20442_init(struct snd_soc_codec *codec) /* Add hook switch - can be used to control the codec from userspace * even if line discipline fails */ - ret = snd_soc_jack_new(card, "hook_switch", + ret = snd_soc_jack_new(rtd->codec, "hook_switch", SND_JACK_HEADSET, &ams_delta_hook_switch); if (ret) dev_warn(card->dev, @@ -551,27 +583,22 @@ static int ams_delta_cx20442_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link ams_delta_dai_link = { .name = "CX20442", .stream_name = "CX20442", - .cpu_dai = &omap_mcbsp_dai[0], - .codec_dai = &cx20442_dai, + .cpu_dai_name ="omap-mcbsp-dai.0", + .codec_dai_name = "cx20442-hifi", .init = ams_delta_cx20442_init, + .platform_name = "omap-pcm-audio", + .codec_name = "cx20442-codec", .ops = &ams_delta_ops, }; /* Audio card driver */ static struct snd_soc_card ams_delta_audio_card = { .name = "AMS_DELTA", - .platform = &omap_soc_platform, .dai_link = &ams_delta_dai_link, .num_links = 1, .set_bias_level = ams_delta_set_bias_level, }; -/* Audio subsystem */ -static struct snd_soc_device ams_delta_snd_soc_device = { - .card = &ams_delta_audio_card, - .codec_dev = &cx20442_codec_dev, -}; - /* Module init/exit */ static struct platform_device *ams_delta_audio_platform_device; static struct platform_device *cx20442_platform_device; @@ -589,9 +616,7 @@ static int __init ams_delta_module_init(void) return -ENOMEM; platform_set_drvdata(ams_delta_audio_platform_device, - &ams_delta_snd_soc_device); - ams_delta_snd_soc_device.dev = &ams_delta_audio_platform_device->dev; - *(unsigned int *)ams_delta_dai_link.cpu_dai->private_data = OMAP_MCBSP1; + &ams_delta_audio_card); ret = platform_device_add(ams_delta_audio_platform_device); if (ret) @@ -601,8 +626,8 @@ static int __init ams_delta_module_init(void) * Codec platform device could be registered from elsewhere (board?), * but I do it here as it makes sense only if used with the card. */ - cx20442_platform_device = platform_device_register_simple("cx20442", - -1, NULL, 0); + cx20442_platform_device = + platform_device_register_simple("cx20442-codec", -1, NULL, 0); return 0; err: platform_device_put(ams_delta_audio_platform_device); @@ -612,19 +637,6 @@ module_init(ams_delta_module_init); static void __exit ams_delta_module_exit(void) { - struct snd_soc_codec *codec; - struct tty_struct *tty; - - if (ams_delta_audio_card.codec) { - codec = ams_delta_audio_card.codec; - - if (codec->control_data) { - tty = codec->control_data; - - tty_hangup(tty); - } - } - if (tty_unregister_ldisc(N_V253) != 0) dev_warn(&ams_delta_audio_platform_device->dev, "failed to unregister V253 line discipline\n"); diff --git a/sound/soc/omap/igep0020.c b/sound/soc/omap/igep0020.c index 3583c429f9be..d296cfcc672e 100644 --- a/sound/soc/omap/igep0020.c +++ b/sound/soc/omap/igep0020.c @@ -33,14 +33,13 @@ #include "omap-mcbsp.h" #include "omap-pcm.h" -#include "../codecs/twl4030.h" static int igep2_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret; /* Set codec DAI configuration */ @@ -82,25 +81,20 @@ static struct snd_soc_ops igep2_ops = { static struct snd_soc_dai_link igep2_dai = { .name = "TWL4030", .stream_name = "TWL4030", - .cpu_dai = &omap_mcbsp_dai[0], - .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI], + .cpu_dai_name = "omap-mcbsp-dai.1", + .codec_dai_name = "twl4030-hifi", + .platform_name = "omap-pcm-audio", + .codec_name = "twl4030-codec", .ops = &igep2_ops, }; /* Audio machine driver */ static struct snd_soc_card snd_soc_card_igep2 = { .name = "igep2", - .platform = &omap_soc_platform, .dai_link = &igep2_dai, .num_links = 1, }; -/* Audio subsystem */ -static struct snd_soc_device igep2_snd_devdata = { - .card = &snd_soc_card_igep2, - .codec_dev = &soc_codec_dev_twl4030, -}; - static struct platform_device *igep2_snd_device; static int __init igep2_soc_init(void) @@ -119,9 +113,7 @@ static int __init igep2_soc_init(void) return -ENOMEM; } - platform_set_drvdata(igep2_snd_device, &igep2_snd_devdata); - igep2_snd_devdata.dev = &igep2_snd_device->dev; - *(unsigned int *)igep2_dai.cpu_dai->private_data = 1; /* McBSP2 */ + platform_set_drvdata(igep2_snd_device, &snd_soc_card_igep2); ret = platform_device_add(igep2_snd_device); if (ret) diff --git a/sound/soc/omap/mcpdm.c b/sound/soc/omap/mcpdm.c index 90b8bf71c893..928f03707451 100644 --- a/sound/soc/omap/mcpdm.c +++ b/sound/soc/omap/mcpdm.c @@ -402,7 +402,7 @@ int omap_mcpdm_set_offset(int offset1, int offset2) return 0; } -static int __devinit omap_mcpdm_probe(struct platform_device *pdev) +int __devinit omap_mcpdm_probe(struct platform_device *pdev) { struct resource *res; int ret = 0; @@ -449,7 +449,7 @@ exit: return ret; } -static int __devexit omap_mcpdm_remove(struct platform_device *pdev) +int __devexit omap_mcpdm_remove(struct platform_device *pdev) { struct omap_mcpdm *mcpdm_ptr = platform_get_drvdata(pdev); @@ -468,18 +468,3 @@ static int __devexit omap_mcpdm_remove(struct platform_device *pdev) return 0; } -static struct platform_driver omap_mcpdm_driver = { - .probe = omap_mcpdm_probe, - .remove = __devexit_p(omap_mcpdm_remove), - .driver = { - .name = "omap-mcpdm", - }, -}; - -static struct platform_device *omap_mcpdm_device; - -static int __init omap_mcpdm_init(void) -{ - return platform_driver_register(&omap_mcpdm_driver); -} -arch_initcall(omap_mcpdm_init); diff --git a/sound/soc/omap/mcpdm.h b/sound/soc/omap/mcpdm.h index 7bb326ef0886..df3e16fb51f3 100644 --- a/sound/soc/omap/mcpdm.h +++ b/sound/soc/omap/mcpdm.h @@ -149,3 +149,5 @@ extern int omap_mcpdm_playback_close(struct omap_mcpdm_link *downlink); extern int omap_mcpdm_request(void); extern void omap_mcpdm_free(void); extern int omap_mcpdm_set_offset(int offset1, int offset2); +int __devinit omap_mcpdm_probe(struct platform_device *pdev); +int __devexit omap_mcpdm_remove(struct platform_device *pdev); diff --git a/sound/soc/omap/n810.c b/sound/soc/omap/n810.c index 08e09d72790f..a3b6d897ad84 100644 --- a/sound/soc/omap/n810.c +++ b/sound/soc/omap/n810.c @@ -97,7 +97,7 @@ static int n810_startup(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_codec *codec = rtd->socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_CHANNELS, 2, 2); @@ -115,8 +115,8 @@ static int n810_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int err; /* Set codec DAI configuration */ @@ -271,8 +271,9 @@ static const struct snd_kcontrol_new aic33_n810_controls[] = { n810_get_input, n810_set_input), }; -static int n810_aic33_init(struct snd_soc_codec *codec) +static int n810_aic33_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int err; /* Not connected */ @@ -307,8 +308,10 @@ static int n810_aic33_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link n810_dai = { .name = "TLV320AIC33", .stream_name = "AIC33", - .cpu_dai = &omap_mcbsp_dai[0], - .codec_dai = &aic3x_dai, + .cpu_dai_name = "omap-mcbsp-dai.1", + .platform_name = "omap-pcm-audio", + .codec_name = "tlv320aic3x-codec.2-0018", + .codec_dai_name = "tlv320aic3x-hifi", .init = n810_aic33_init, .ops = &n810_ops, }; @@ -316,33 +319,12 @@ static struct snd_soc_dai_link n810_dai = { /* Audio machine driver */ static struct snd_soc_card snd_soc_n810 = { .name = "N810", - .platform = &omap_soc_platform, .dai_link = &n810_dai, .num_links = 1, }; -/* Audio private data */ -static struct aic3x_setup_data n810_aic33_setup = { - .gpio_func[0] = AIC3X_GPIO1_FUNC_DISABLED, - .gpio_func[1] = AIC3X_GPIO2_FUNC_DIGITAL_MIC_INPUT, -}; - -/* Audio subsystem */ -static struct snd_soc_device n810_snd_devdata = { - .card = &snd_soc_n810, - .codec_dev = &soc_codec_dev_aic3x, - .codec_data = &n810_aic33_setup, -}; - static struct platform_device *n810_snd_device; -/* temporary i2c device creation until this can be moved into the machine - * support file. -*/ -static struct i2c_board_info i2c_device[] = { - { I2C_BOARD_INFO("tlv320aic3x", 0x1b), } -}; - static int __init n810_soc_init(void) { int err; @@ -351,15 +333,11 @@ static int __init n810_soc_init(void) if (!(machine_is_nokia_n810() || machine_is_nokia_n810_wimax())) return -ENODEV; - i2c_register_board_info(1, i2c_device, ARRAY_SIZE(i2c_device)); - n810_snd_device = platform_device_alloc("soc-audio", -1); if (!n810_snd_device) return -ENOMEM; - platform_set_drvdata(n810_snd_device, &n810_snd_devdata); - n810_snd_devdata.dev = &n810_snd_device->dev; - *(unsigned int *)n810_dai.cpu_dai->private_data = 1; /* McBSP2 */ + platform_set_drvdata(n810_snd_device, &snd_soc_n810); err = platform_device_add(n810_snd_device); if (err) goto err1; diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 86f213905e2c..7ba5690118f8 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c @@ -62,8 +62,6 @@ struct omap_mcbsp_data { int wlen; }; -#define to_mcbsp(priv) container_of((priv), struct omap_mcbsp_data, bus_id) - static struct omap_mcbsp_data mcbsp_data[NUM_LINKS]; /* @@ -153,13 +151,13 @@ static const unsigned long omap34xx_mcbsp_port[][2] = {}; static void omap_mcbsp_set_threshold(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai); struct omap_pcm_dma_data *dma_data; int dma_op_mode = omap_mcbsp_get_dma_op_mode(mcbsp_data->bus_id); int words; - dma_data = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); + dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); /* TODO: Currently, MODE_ELEMENT == MODE_FRAME */ if (dma_op_mode == MCBSP_DMA_MODE_THRESHOLD) @@ -203,11 +201,9 @@ static int omap_mcbsp_hwrule_min_buffersize(struct snd_pcm_hw_params *params, } static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) + struct snd_soc_dai *cpu_dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); + struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai); int bus_id = mcbsp_data->bus_id; int err = 0; @@ -249,11 +245,9 @@ static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream, } static void omap_mcbsp_dai_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) + struct snd_soc_dai *cpu_dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); + struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai); if (!cpu_dai->active) { omap_mcbsp_free(mcbsp_data->bus_id); @@ -262,11 +256,9 @@ static void omap_mcbsp_dai_shutdown(struct snd_pcm_substream *substream, } static int omap_mcbsp_dai_trigger(struct snd_pcm_substream *substream, int cmd, - struct snd_soc_dai *dai) + struct snd_soc_dai *cpu_dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); + struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai); int err = 0, play = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); switch (cmd) { @@ -295,8 +287,8 @@ static snd_pcm_sframes_t omap_mcbsp_dai_delay( struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai); u16 fifo_use; snd_pcm_sframes_t delay; @@ -317,11 +309,9 @@ static snd_pcm_sframes_t omap_mcbsp_dai_delay( static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) + struct snd_soc_dai *cpu_dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); + struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai); struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs; struct omap_pcm_dma_data *dma_data; int dma, bus_id = mcbsp_data->bus_id; @@ -496,7 +486,7 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { - struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); + struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai); struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs; unsigned int temp_fmt = fmt; @@ -596,7 +586,7 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai, static int omap_mcbsp_dai_set_clkdiv(struct snd_soc_dai *cpu_dai, int div_id, int div) { - struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); + struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai); struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs; if (div_id != OMAP_MCBSP_CLKGDV) @@ -699,7 +689,7 @@ static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai, int clk_id, unsigned int freq, int dir) { - struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); + struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai); struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs; int err = 0; @@ -733,7 +723,7 @@ static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai, return err; } -static struct snd_soc_dai_ops omap_mcbsp_dai_ops = { +static struct snd_soc_dai_ops mcbsp_dai_ops = { .startup = omap_mcbsp_dai_startup, .shutdown = omap_mcbsp_dai_shutdown, .trigger = omap_mcbsp_dai_trigger, @@ -744,42 +734,31 @@ static struct snd_soc_dai_ops omap_mcbsp_dai_ops = { .set_sysclk = omap_mcbsp_dai_set_dai_sysclk, }; -#define OMAP_MCBSP_DAI_BUILDER(link_id) \ -{ \ - .name = "omap-mcbsp-dai-"#link_id, \ - .id = (link_id), \ - .playback = { \ - .channels_min = 1, \ - .channels_max = 16, \ - .rates = OMAP_MCBSP_RATES, \ - .formats = SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S32_LE, \ - }, \ - .capture = { \ - .channels_min = 1, \ - .channels_max = 16, \ - .rates = OMAP_MCBSP_RATES, \ - .formats = SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S32_LE, \ - }, \ - .ops = &omap_mcbsp_dai_ops, \ - .private_data = &mcbsp_data[(link_id)].bus_id, \ +static int mcbsp_dai_probe(struct snd_soc_dai *dai) +{ + mcbsp_data[dai->id].bus_id = dai->id; + snd_soc_dai_set_drvdata(dai, &mcbsp_data[dai->id].bus_id); + return 0; } -struct snd_soc_dai omap_mcbsp_dai[] = { - OMAP_MCBSP_DAI_BUILDER(0), - OMAP_MCBSP_DAI_BUILDER(1), -#if NUM_LINKS >= 3 - OMAP_MCBSP_DAI_BUILDER(2), -#endif -#if NUM_LINKS == 5 - OMAP_MCBSP_DAI_BUILDER(3), - OMAP_MCBSP_DAI_BUILDER(4), -#endif +static struct snd_soc_dai_driver omap_mcbsp_dai = +{ + .probe = mcbsp_dai_probe, + .playback = { + .channels_min = 1, + .channels_max = 16, + .rates = OMAP_MCBSP_RATES, + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE, + }, + .capture = { + .channels_min = 1, + .channels_max = 16, + .rates = OMAP_MCBSP_RATES, + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE, + }, + .ops = &mcbsp_dai_ops, }; -EXPORT_SYMBOL_GPL(omap_mcbsp_dai); - int omap_mcbsp_st_info_volsw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) { @@ -910,16 +889,36 @@ int omap_mcbsp_st_add_controls(struct snd_soc_codec *codec, int mcbsp_id) } EXPORT_SYMBOL_GPL(omap_mcbsp_st_add_controls); +static __devinit int asoc_mcbsp_probe(struct platform_device *pdev) +{ + return snd_soc_register_dai(&pdev->dev, &omap_mcbsp_dai); +} + +static int __devexit asoc_mcbsp_remove(struct platform_device *pdev) +{ + snd_soc_unregister_dai(&pdev->dev); + return 0; +} + +static struct platform_driver asoc_mcbsp_driver = { + .driver = { + .name = "omap-mcbsp-dai", + .owner = THIS_MODULE, + }, + + .probe = asoc_mcbsp_probe, + .remove = __devexit_p(asoc_mcbsp_remove), +}; + static int __init snd_omap_mcbsp_init(void) { - return snd_soc_register_dais(omap_mcbsp_dai, - ARRAY_SIZE(omap_mcbsp_dai)); + return platform_driver_register(&asoc_mcbsp_driver); } module_init(snd_omap_mcbsp_init); static void __exit snd_omap_mcbsp_exit(void) { - snd_soc_unregister_dais(omap_mcbsp_dai, ARRAY_SIZE(omap_mcbsp_dai)); + platform_driver_unregister(&asoc_mcbsp_driver); } module_exit(snd_omap_mcbsp_exit); diff --git a/sound/soc/omap/omap-mcbsp.h b/sound/soc/omap/omap-mcbsp.h index 6c363e5f4387..ffdcc5abb7b9 100644 --- a/sound/soc/omap/omap-mcbsp.h +++ b/sound/soc/omap/omap-mcbsp.h @@ -55,8 +55,6 @@ enum omap_mcbsp_div { #define NUM_LINKS 5 #endif -extern struct snd_soc_dai omap_mcbsp_dai[NUM_LINKS]; - int omap_mcbsp_st_add_controls(struct snd_soc_codec *codec, int mcbsp_id); #endif diff --git a/sound/soc/omap/omap-mcpdm.c b/sound/soc/omap/omap-mcpdm.c index b7f4f7e015f3..f161c2f5ed36 100644 --- a/sound/soc/omap/omap-mcpdm.c +++ b/sound/soc/omap/omap-mcpdm.c @@ -36,7 +36,6 @@ #include #include #include "mcpdm.h" -#include "omap-mcpdm.h" #include "omap-pcm.h" struct omap_mcpdm_data { @@ -89,11 +88,9 @@ static struct omap_pcm_dma_data omap_mcpdm_dai_dma_params[] = { static int omap_mcpdm_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; int err = 0; - if (!cpu_dai->active) + if (!dai->active) err = omap_mcpdm_request(); return err; @@ -102,19 +99,14 @@ static int omap_mcpdm_dai_startup(struct snd_pcm_substream *substream, static void omap_mcpdm_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - - if (!cpu_dai->active) + if (!dai->active) omap_mcpdm_free(); } static int omap_mcpdm_dai_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct omap_mcpdm_data *mcpdm_priv = cpu_dai->private_data; + struct omap_mcpdm_data *mcpdm_priv = snd_soc_dai_get_drvdata(dai); int stream = substream->stream; int err = 0; @@ -143,14 +135,12 @@ static int omap_mcpdm_dai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct omap_mcpdm_data *mcpdm_priv = cpu_dai->private_data; + struct omap_mcpdm_data *mcpdm_priv = snd_soc_dai_get_drvdata(dai); struct omap_mcpdm_link *mcpdm_links = mcpdm_priv->links; int stream = substream->stream; int channels, err, link_mask = 0; - snd_soc_dai_set_dma_data(cpu_dai, substream, + snd_soc_dai_set_dma_data(dai, substream, &omap_mcpdm_dai_dma_params[stream]); channels = params_channels(params); @@ -189,9 +179,7 @@ static int omap_mcpdm_dai_hw_params(struct snd_pcm_substream *substream, static int omap_mcpdm_dai_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct omap_mcpdm_data *mcpdm_priv = cpu_dai->private_data; + struct omap_mcpdm_data *mcpdm_priv = snd_soc_dai_get_drvdata(dai); struct omap_mcpdm_link *mcpdm_links = mcpdm_priv->links; int stream = substream->stream; int err; @@ -215,9 +203,14 @@ static struct snd_soc_dai_ops omap_mcpdm_dai_ops = { #define OMAP_MCPDM_RATES (SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000) #define OMAP_MCPDM_FORMATS (SNDRV_PCM_FMTBIT_S32_LE) -struct snd_soc_dai omap_mcpdm_dai = { - .name = "omap-mcpdm", - .id = -1, +static int omap_mcpdm_dai_probe(struct snd_soc_dai *dai) +{ + snd_soc_dai_set_drvdata(dai, &mcpdm_data); + return 0; +} + +static struct snd_soc_dai_driver omap_mcpdm_dai = { + .probe = omap_mcpdm_dai_probe, .playback = { .channels_min = 1, .channels_max = 4, @@ -231,19 +224,47 @@ struct snd_soc_dai omap_mcpdm_dai = { .formats = OMAP_MCPDM_FORMATS, }, .ops = &omap_mcpdm_dai_ops, - .private_data = &mcpdm_data, }; -EXPORT_SYMBOL_GPL(omap_mcpdm_dai); + +static __devinit int asoc_mcpdm_probe(struct platform_device *pdev) +{ + int ret; + + ret = omap_mcpdm_probe(pdev); + if (ret < 0) + return ret; + ret = snd_soc_register_dai(&pdev->dev, &omap_mcpdm_dai); + if (ret < 0) + omap_mcpdm_remove(pdev); + return ret; +} + +static int __devexit asoc_mcpdm_remove(struct platform_device *pdev) +{ + snd_soc_unregister_dai(&pdev->dev); + omap_mcpdm_remove(pdev); + return 0; +} + +static struct platform_driver asoc_mcpdm_driver = { + .driver = { + .name = "omap-mcpdm-dai", + .owner = THIS_MODULE, + }, + + .probe = asoc_mcpdm_probe, + .remove = __devexit_p(asoc_mcpdm_remove), +}; static int __init snd_omap_mcpdm_init(void) { - return snd_soc_register_dai(&omap_mcpdm_dai); + return platform_driver_register(&asoc_mcpdm_driver); } module_init(snd_omap_mcpdm_init); static void __exit snd_omap_mcpdm_exit(void) { - snd_soc_unregister_dai(&omap_mcpdm_dai); + platform_driver_unregister(&asoc_mcpdm_driver); } module_exit(snd_omap_mcpdm_exit); diff --git a/sound/soc/omap/omap-mcpdm.h b/sound/soc/omap/omap-mcpdm.h deleted file mode 100644 index 73b80d559345..000000000000 --- a/sound/soc/omap/omap-mcpdm.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * omap-mcpdm.h - * - * Copyright (C) 2009 Texas Instruments - * - * Contact: Misael Lopez Cruz - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA - * - */ - -#ifndef __OMAP_MCPDM_H__ -#define __OMAP_MCPDM_H__ - -extern struct snd_soc_dai omap_mcpdm_dai; - -#endif /* End of __OMAP_MCPDM_H__ */ diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c index 1e521904ea64..8caeb8d305c3 100644 --- a/sound/soc/omap/omap-pcm.c +++ b/sound/soc/omap/omap-pcm.c @@ -101,9 +101,10 @@ static int omap_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_soc_pcm_runtime *rtd = substream->private_data; struct omap_runtime_data *prtd = runtime->private_data; struct omap_pcm_dma_data *dma_data; + int err = 0; - dma_data = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); + dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); /* return if this is a bufferless transfer e.g. * codec <--> BT codec or GSM modem -- lg FIXME */ @@ -374,14 +375,14 @@ static int omap_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = DMA_BIT_MASK(64); - if (dai->playback.channels_min) { + if (dai->driver->playback.channels_min) { ret = omap_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_PLAYBACK); if (ret) goto out; } - if (dai->capture.channels_min) { + if (dai->driver->capture.channels_min) { ret = omap_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_CAPTURE); if (ret) @@ -392,25 +393,45 @@ out: return ret; } -struct snd_soc_platform omap_soc_platform = { - .name = "omap-pcm-audio", - .pcm_ops = &omap_pcm_ops, +static struct snd_soc_platform_driver omap_soc_platform = { + .ops = &omap_pcm_ops, .pcm_new = omap_pcm_new, .pcm_free = omap_pcm_free_dma_buffers, }; -EXPORT_SYMBOL_GPL(omap_soc_platform); -static int __init omap_soc_platform_init(void) +static __devinit int omap_pcm_probe(struct platform_device *pdev) +{ + return snd_soc_register_platform(&pdev->dev, + &omap_soc_platform); +} + +static int __devexit omap_pcm_remove(struct platform_device *pdev) +{ + snd_soc_unregister_platform(&pdev->dev); + return 0; +} + +static struct platform_driver omap_pcm_driver = { + .driver = { + .name = "omap-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = omap_pcm_probe, + .remove = __devexit_p(omap_pcm_remove), +}; + +static int __init snd_omap_pcm_init(void) { - return snd_soc_register_platform(&omap_soc_platform); + return platform_driver_register(&omap_pcm_driver); } -module_init(omap_soc_platform_init); +module_init(snd_omap_pcm_init); -static void __exit omap_soc_platform_exit(void) +static void __exit snd_omap_pcm_exit(void) { - snd_soc_unregister_platform(&omap_soc_platform); + platform_driver_unregister(&omap_pcm_driver); } -module_exit(omap_soc_platform_exit); +module_exit(snd_omap_pcm_exit); MODULE_AUTHOR("Jarkko Nikula "); MODULE_DESCRIPTION("OMAP PCM DMA module"); diff --git a/sound/soc/omap/omap-pcm.h b/sound/soc/omap/omap-pcm.h index b19975d26907..fea0515331fb 100644 --- a/sound/soc/omap/omap-pcm.h +++ b/sound/soc/omap/omap-pcm.h @@ -35,6 +35,4 @@ struct omap_pcm_dma_data { int packet_size; /* packet size only in PACKET mode */ }; -extern struct snd_soc_platform omap_soc_platform; - #endif diff --git a/sound/soc/omap/omap2evm.c b/sound/soc/omap/omap2evm.c index c7adea38274c..38cd1894623e 100644 --- a/sound/soc/omap/omap2evm.c +++ b/sound/soc/omap/omap2evm.c @@ -35,15 +35,13 @@ #include "omap-mcbsp.h" #include "omap-pcm.h" -#include "../codecs/twl4030.h" static int omap2evm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) + struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret; /* Set codec DAI configuration */ @@ -85,25 +83,20 @@ static struct snd_soc_ops omap2evm_ops = { static struct snd_soc_dai_link omap2evm_dai = { .name = "TWL4030", .stream_name = "TWL4030", - .cpu_dai = &omap_mcbsp_dai[0], - .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI], + .cpu_dai_name = "omap-mcbsp-dai.1", + .codec_dai_name = "twl4030-hifi", + .platform_name = "omap-pcm-audio", + .codec_name = "twl4030-codec", .ops = &omap2evm_ops, }; /* Audio machine driver */ static struct snd_soc_card snd_soc_omap2evm = { .name = "omap2evm", - .platform = &omap_soc_platform, .dai_link = &omap2evm_dai, .num_links = 1, }; -/* Audio subsystem */ -static struct snd_soc_device omap2evm_snd_devdata = { - .card = &snd_soc_omap2evm, - .codec_dev = &soc_codec_dev_twl4030, -}; - static struct platform_device *omap2evm_snd_device; static int __init omap2evm_soc_init(void) @@ -122,9 +115,7 @@ static int __init omap2evm_soc_init(void) return -ENOMEM; } - platform_set_drvdata(omap2evm_snd_device, &omap2evm_snd_devdata); - omap2evm_snd_devdata.dev = &omap2evm_snd_device->dev; - *(unsigned int *)omap2evm_dai.cpu_dai->private_data = 1; /* McBSP2 */ + platform_set_drvdata(omap2evm_snd_device, &snd_soc_omap2evm); ret = platform_device_add(omap2evm_snd_device); if (ret) diff --git a/sound/soc/omap/omap3beagle.c b/sound/soc/omap/omap3beagle.c index 240e0975dd6a..7c11e1afe9e6 100644 --- a/sound/soc/omap/omap3beagle.c +++ b/sound/soc/omap/omap3beagle.c @@ -33,14 +33,13 @@ #include "omap-mcbsp.h" #include "omap-pcm.h" -#include "../codecs/twl4030.h" static int omap3beagle_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; unsigned int fmt; int ret; @@ -92,25 +91,21 @@ static struct snd_soc_ops omap3beagle_ops = { static struct snd_soc_dai_link omap3beagle_dai = { .name = "TWL4030", .stream_name = "TWL4030", - .cpu_dai = &omap_mcbsp_dai[0], - .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI], + .cpu_dai_name = "omap-mcbsp-dai.1", + .platform_name = "omap-pcm-audio", + .codec_dai_name = "twl4030-hifi", + .codec_name = "twl4030-codec", .ops = &omap3beagle_ops, }; /* Audio machine driver */ static struct snd_soc_card snd_soc_omap3beagle = { .name = "omap3beagle", - .platform = &omap_soc_platform, + .owner = THIS_MODULE, .dai_link = &omap3beagle_dai, .num_links = 1, }; -/* Audio subsystem */ -static struct snd_soc_device omap3beagle_snd_devdata = { - .card = &snd_soc_omap3beagle, - .codec_dev = &soc_codec_dev_twl4030, -}; - static struct platform_device *omap3beagle_snd_device; static int __init omap3beagle_soc_init(void) @@ -129,9 +124,7 @@ static int __init omap3beagle_soc_init(void) return -ENOMEM; } - platform_set_drvdata(omap3beagle_snd_device, &omap3beagle_snd_devdata); - omap3beagle_snd_devdata.dev = &omap3beagle_snd_device->dev; - *(unsigned int *)omap3beagle_dai.cpu_dai->private_data = 1; /* McBSP2 */ + platform_set_drvdata(omap3beagle_snd_device, &snd_soc_omap3beagle); ret = platform_device_add(omap3beagle_snd_device); if (ret) diff --git a/sound/soc/omap/omap3evm.c b/sound/soc/omap/omap3evm.c index dfcb344092e4..1ac5babef00d 100644 --- a/sound/soc/omap/omap3evm.c +++ b/sound/soc/omap/omap3evm.c @@ -31,14 +31,13 @@ #include "omap-mcbsp.h" #include "omap-pcm.h" -#include "../codecs/twl4030.h" static int omap3evm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret; /* Set codec DAI configuration */ @@ -80,32 +79,20 @@ static struct snd_soc_ops omap3evm_ops = { static struct snd_soc_dai_link omap3evm_dai = { .name = "TWL4030", .stream_name = "TWL4030", - .cpu_dai = &omap_mcbsp_dai[0], - .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI], + .cpu_dai_name = "omap-mcbsp-dai.1", + .codec_dai_name = "twl4030-hifi", + .platform_name = "omap-pcm-audio", + .codec_name = "twl4030-codec", .ops = &omap3evm_ops, }; /* Audio machine driver */ static struct snd_soc_card snd_soc_omap3evm = { .name = "omap3evm", - .platform = &omap_soc_platform, .dai_link = &omap3evm_dai, .num_links = 1, }; -/* twl4030 setup */ -static struct twl4030_setup_data twl4030_setup = { - .ramp_delay_value = 4, - .sysclk = 26000, -}; - -/* Audio subsystem */ -static struct snd_soc_device omap3evm_snd_devdata = { - .card = &snd_soc_omap3evm, - .codec_dev = &soc_codec_dev_twl4030, - .codec_data = &twl4030_setup, -}; - static struct platform_device *omap3evm_snd_device; static int __init omap3evm_soc_init(void) @@ -124,10 +111,7 @@ static int __init omap3evm_soc_init(void) return -ENOMEM; } - platform_set_drvdata(omap3evm_snd_device, &omap3evm_snd_devdata); - omap3evm_snd_devdata.dev = &omap3evm_snd_device->dev; - *(unsigned int *)omap3evm_dai.cpu_dai->private_data = 1; - + platform_set_drvdata(omap3evm_snd_device, &snd_soc_omap3evm); ret = platform_device_add(omap3evm_snd_device); if (ret) goto err1; diff --git a/sound/soc/omap/omap3pandora.c b/sound/soc/omap/omap3pandora.c index 9eecac135bbb..dbd9d96b5f92 100644 --- a/sound/soc/omap/omap3pandora.c +++ b/sound/soc/omap/omap3pandora.c @@ -31,10 +31,10 @@ #include #include +#include #include "omap-mcbsp.h" #include "omap-pcm.h" -#include "../codecs/twl4030.h" #define OMAP3_PANDORA_DAC_POWER_GPIO 118 #define OMAP3_PANDORA_AMP_POWER_GPIO 14 @@ -47,8 +47,8 @@ static int omap3pandora_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS; int ret; @@ -167,8 +167,9 @@ static const struct snd_soc_dapm_route omap3pandora_in_map[] = { {"Mic Bias 2", NULL, "Mic (external)"}, }; -static int omap3pandora_out_init(struct snd_soc_codec *codec) +static int omap3pandora_out_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int ret; /* All TWL4030 output pins are floating */ @@ -194,8 +195,9 @@ static int omap3pandora_out_init(struct snd_soc_codec *codec) return snd_soc_dapm_sync(codec); } -static int omap3pandora_in_init(struct snd_soc_codec *codec) +static int omap3pandora_in_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int ret; /* Not comnnected */ @@ -224,15 +226,19 @@ static struct snd_soc_dai_link omap3pandora_dai[] = { { .name = "PCM1773", .stream_name = "HiFi Out", - .cpu_dai = &omap_mcbsp_dai[0], - .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI], + .cpu_dai_name = "omap-mcbsp-dai.1", + .codec_dai_name = "twl4030-hifi", + .platform_name = "omap-pcm-audio", + .codec_name = "twl4030-codec", .ops = &omap3pandora_ops, .init = omap3pandora_out_init, }, { .name = "TWL4030", .stream_name = "Line/Mic In", - .cpu_dai = &omap_mcbsp_dai[1], - .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI], + .cpu_dai_name = "omap-mcbsp-dai.3", + .codec_dai_name = "twl4030-hifi", + .platform_name = "omap-pcm-audio", + .codec_name = "twl4030-codec", .ops = &omap3pandora_ops, .init = omap3pandora_in_init, } @@ -241,17 +247,10 @@ static struct snd_soc_dai_link omap3pandora_dai[] = { /* SoC card */ static struct snd_soc_card snd_soc_card_omap3pandora = { .name = "omap3pandora", - .platform = &omap_soc_platform, .dai_link = omap3pandora_dai, .num_links = ARRAY_SIZE(omap3pandora_dai), }; -/* Audio subsystem */ -static struct snd_soc_device omap3pandora_snd_data = { - .card = &snd_soc_card_omap3pandora, - .codec_dev = &soc_codec_dev_twl4030, -}; - static struct platform_device *omap3pandora_snd_device; static int __init omap3pandora_soc_init(void) @@ -294,10 +293,7 @@ static int __init omap3pandora_soc_init(void) goto fail1; } - platform_set_drvdata(omap3pandora_snd_device, &omap3pandora_snd_data); - omap3pandora_snd_data.dev = &omap3pandora_snd_device->dev; - *(unsigned int *)omap_mcbsp_dai[0].private_data = 1; /* McBSP2 */ - *(unsigned int *)omap_mcbsp_dai[1].private_data = 3; /* McBSP4 */ + platform_set_drvdata(omap3pandora_snd_device, &snd_soc_card_omap3pandora); ret = platform_device_add(omap3pandora_snd_device); if (ret) { diff --git a/sound/soc/omap/osk5912.c b/sound/soc/omap/osk5912.c index 498ca2e03519..f0e662556428 100644 --- a/sound/soc/omap/osk5912.c +++ b/sound/soc/omap/osk5912.c @@ -55,8 +55,8 @@ static int osk_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int err; /* Set codec DAI configuration */ @@ -113,8 +113,9 @@ static const struct snd_soc_dapm_route audio_map[] = { {"MICIN", NULL, "Mic Jack"}, }; -static int osk_tlv320aic23_init(struct snd_soc_codec *codec) +static int osk_tlv320aic23_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; /* Add osk5912 specific widgets */ snd_soc_dapm_new_controls(codec, tlv320aic23_dapm_widgets, @@ -136,8 +137,10 @@ static int osk_tlv320aic23_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link osk_dai = { .name = "TLV320AIC23", .stream_name = "AIC23", - .cpu_dai = &omap_mcbsp_dai[0], - .codec_dai = &tlv320aic23_dai, + .cpu_dai_name = "omap-mcbsp-dai.0", + .codec_dai_name = "tlv320aic23-hifi", + .platform_name = "omap-pcm-audio", + .codec_name = "tlv320aic23-codec", .init = osk_tlv320aic23_init, .ops = &osk_ops, }; @@ -145,17 +148,10 @@ static struct snd_soc_dai_link osk_dai = { /* Audio machine driver */ static struct snd_soc_card snd_soc_card_osk = { .name = "OSK5912", - .platform = &omap_soc_platform, .dai_link = &osk_dai, .num_links = 1, }; -/* Audio subsystem */ -static struct snd_soc_device osk_snd_devdata = { - .card = &snd_soc_card_osk, - .codec_dev = &soc_codec_dev_tlv320aic23, -}; - static struct platform_device *osk_snd_device; static int __init osk_soc_init(void) @@ -171,9 +167,7 @@ static int __init osk_soc_init(void) if (!osk_snd_device) return -ENOMEM; - platform_set_drvdata(osk_snd_device, &osk_snd_devdata); - osk_snd_devdata.dev = &osk_snd_device->dev; - *(unsigned int *)osk_dai.cpu_dai->private_data = 0; /* McBSP1 */ + platform_set_drvdata(osk_snd_device, &snd_soc_card_osk); err = platform_device_add(osk_snd_device); if (err) goto err1; diff --git a/sound/soc/omap/overo.c b/sound/soc/omap/overo.c index c25f5276ad6f..e95a607937de 100644 --- a/sound/soc/omap/overo.c +++ b/sound/soc/omap/overo.c @@ -33,14 +33,13 @@ #include "omap-mcbsp.h" #include "omap-pcm.h" -#include "../codecs/twl4030.h" static int overo_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret; /* Set codec DAI configuration */ @@ -82,25 +81,20 @@ static struct snd_soc_ops overo_ops = { static struct snd_soc_dai_link overo_dai = { .name = "TWL4030", .stream_name = "TWL4030", - .cpu_dai = &omap_mcbsp_dai[0], - .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI], + .cpu_dai_name = "omap-mcbsp-dai.1", + .codec_dai_name = "twl4030-hifi", + .platform_name = "omap-pcm-audio", + .codec_name = "twl4030-codec", .ops = &overo_ops, }; /* Audio machine driver */ static struct snd_soc_card snd_soc_card_overo = { .name = "overo", - .platform = &omap_soc_platform, .dai_link = &overo_dai, .num_links = 1, }; -/* Audio subsystem */ -static struct snd_soc_device overo_snd_devdata = { - .card = &snd_soc_card_overo, - .codec_dev = &soc_codec_dev_twl4030, -}; - static struct platform_device *overo_snd_device; static int __init overo_soc_init(void) @@ -119,9 +113,7 @@ static int __init overo_soc_init(void) return -ENOMEM; } - platform_set_drvdata(overo_snd_device, &overo_snd_devdata); - overo_snd_devdata.dev = &overo_snd_device->dev; - *(unsigned int *)overo_dai.cpu_dai->private_data = 1; /* McBSP2 */ + platform_set_drvdata(overo_snd_device, &snd_soc_card_overo); ret = platform_device_add(overo_snd_device); if (ret) diff --git a/sound/soc/omap/rx51.c b/sound/soc/omap/rx51.c index 88052d29617f..d1d8098923ce 100644 --- a/sound/soc/omap/rx51.c +++ b/sound/soc/omap/rx51.c @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -76,7 +77,7 @@ static int rx51_startup(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_codec *codec = rtd->socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_CHANNELS, 2, 2); @@ -89,8 +90,8 @@ static int rx51_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int err; /* Set codec DAI configuration */ @@ -240,9 +241,9 @@ static const struct snd_kcontrol_new aic34_rx51_controls[] = { rx51_get_jack, rx51_set_jack), }; -static int rx51_aic34_init(struct snd_soc_codec *codec) +static int rx51_aic34_init(struct snd_soc_pcm_runtime *rtd) { - struct snd_soc_card *card = codec->socdev->card; + struct snd_soc_codec *codec = rtd->codec; int err; /* Set up NC codec pins */ @@ -266,7 +267,7 @@ static int rx51_aic34_init(struct snd_soc_codec *codec) snd_soc_dapm_sync(codec); /* AV jack detection */ - err = snd_soc_jack_new(card, "AV Jack", + err = snd_soc_jack_new(codec, "AV Jack", SND_JACK_VIDEOOUT, &rx51_av_jack); if (err) return err; @@ -282,32 +283,20 @@ static struct snd_soc_dai_link rx51_dai[] = { { .name = "TLV320AIC34", .stream_name = "AIC34", - .cpu_dai = &omap_mcbsp_dai[0], - .codec_dai = &aic3x_dai, + .cpu_dai_name = "omap-mcbsp-dai.1", + .codec_dai_name = "tlv320aic3x-hifi", + .platform_name = "omap-pcm-audio", + .codec_name = "tlv320aic3x-codec.2-0018", .init = rx51_aic34_init, .ops = &rx51_ops, }, }; -/* Audio private data */ -static struct aic3x_setup_data rx51_aic34_setup = { - .gpio_func[0] = AIC3X_GPIO1_FUNC_DISABLED, - .gpio_func[1] = AIC3X_GPIO2_FUNC_DIGITAL_MIC_INPUT, -}; - /* Audio card */ static struct snd_soc_card rx51_sound_card = { .name = "RX-51", .dai_link = rx51_dai, .num_links = ARRAY_SIZE(rx51_dai), - .platform = &omap_soc_platform, -}; - -/* Audio subsystem */ -static struct snd_soc_device rx51_snd_devdata = { - .card = &rx51_sound_card, - .codec_dev = &soc_codec_dev_aic3x, - .codec_data = &rx51_aic34_setup, }; static struct platform_device *rx51_snd_device; @@ -330,9 +319,7 @@ static int __init rx51_soc_init(void) goto err1; } - platform_set_drvdata(rx51_snd_device, &rx51_snd_devdata); - rx51_snd_devdata.dev = &rx51_snd_device->dev; - *(unsigned int *)rx51_dai[0].cpu_dai->private_data = 1; /* McBSP2 */ + platform_set_drvdata(rx51_snd_device, &rx51_sound_card); err = platform_device_add(rx51_snd_device); if (err) diff --git a/sound/soc/omap/sdp3430.c b/sound/soc/omap/sdp3430.c index 3c85c0f92823..76ce77b91844 100644 --- a/sound/soc/omap/sdp3430.c +++ b/sound/soc/omap/sdp3430.c @@ -36,9 +36,11 @@ #include #include +/* Register descriptions for twl4030 codec part */ +#include + #include "omap-mcbsp.h" #include "omap-pcm.h" -#include "../codecs/twl4030.h" /* TWL4030 PMBR1 Register */ #define TWL4030_INTBR_PMBR1 0x0D @@ -51,8 +53,8 @@ static int sdp3430_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret; /* Set codec DAI configuration */ @@ -94,8 +96,8 @@ static int sdp3430_hw_voice_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret; /* Set codec DAI configuration */ @@ -186,8 +188,9 @@ static const struct snd_soc_dapm_route audio_map[] = { {"Headset Stereophone", NULL, "HSOR"}, }; -static int sdp3430_twl4030_init(struct snd_soc_codec *codec) +static int sdp3430_twl4030_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int ret; /* Add SDP3430 specific widgets */ @@ -225,7 +228,7 @@ static int sdp3430_twl4030_init(struct snd_soc_codec *codec) return ret; /* Headset jack detection */ - ret = snd_soc_jack_new(&snd_soc_sdp3430, "Headset Jack", + ret = snd_soc_jack_new(codec, "Headset Jack", SND_JACK_HEADSET, &hs_jack); if (ret) return ret; @@ -241,14 +244,15 @@ static int sdp3430_twl4030_init(struct snd_soc_codec *codec) return ret; } -static int sdp3430_twl4030_voice_init(struct snd_soc_codec *codec) +static int sdp3430_twl4030_voice_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; unsigned short reg; /* Enable voice interface */ - reg = codec->read(codec, TWL4030_REG_VOICE_IF); + reg = codec->driver->read(codec, TWL4030_REG_VOICE_IF); reg |= TWL4030_VIF_DIN_EN | TWL4030_VIF_DOUT_EN | TWL4030_VIF_EN; - codec->write(codec, TWL4030_REG_VOICE_IF, reg); + codec->driver->write(codec, TWL4030_REG_VOICE_IF, reg); return 0; } @@ -259,16 +263,20 @@ static struct snd_soc_dai_link sdp3430_dai[] = { { .name = "TWL4030 I2S", .stream_name = "TWL4030 Audio", - .cpu_dai = &omap_mcbsp_dai[0], - .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI], + .cpu_dai_name = "omap-mcbsp-dai.1", + .codec_dai_name = "twl4030-hifi", + .platform_name = "omap-pcm-audio", + .codec_name = "twl4030-codec", .init = sdp3430_twl4030_init, .ops = &sdp3430_ops, }, { .name = "TWL4030 PCM", .stream_name = "TWL4030 Voice", - .cpu_dai = &omap_mcbsp_dai[1], - .codec_dai = &twl4030_dai[TWL4030_DAI_VOICE], + .cpu_dai_name = "omap-mcbsp-dai.2", + .codec_dai_name = "twl4030-voice", + .platform_name = "omap-pcm-audio", + .codec_name = "twl4030-codec", .init = sdp3430_twl4030_voice_init, .ops = &sdp3430_voice_ops, }, @@ -277,25 +285,10 @@ static struct snd_soc_dai_link sdp3430_dai[] = { /* Audio machine driver */ static struct snd_soc_card snd_soc_sdp3430 = { .name = "SDP3430", - .platform = &omap_soc_platform, .dai_link = sdp3430_dai, .num_links = ARRAY_SIZE(sdp3430_dai), }; -/* twl4030 setup */ -static struct twl4030_setup_data twl4030_setup = { - .ramp_delay_value = 3, - .sysclk = 26000, - .hs_extmute = 1, -}; - -/* Audio subsystem */ -static struct snd_soc_device sdp3430_snd_devdata = { - .card = &snd_soc_sdp3430, - .codec_dev = &soc_codec_dev_twl4030, - .codec_data = &twl4030_setup, -}; - static struct platform_device *sdp3430_snd_device; static int __init sdp3430_soc_init(void) @@ -315,10 +308,7 @@ static int __init sdp3430_soc_init(void) return -ENOMEM; } - platform_set_drvdata(sdp3430_snd_device, &sdp3430_snd_devdata); - sdp3430_snd_devdata.dev = &sdp3430_snd_device->dev; - *(unsigned int *)sdp3430_dai[0].cpu_dai->private_data = 1; /* McBSP2 */ - *(unsigned int *)sdp3430_dai[1].cpu_dai->private_data = 2; /* McBSP3 */ + platform_set_drvdata(sdp3430_snd_device, &snd_soc_sdp3430); /* Set TWL4030 GPIO6 as EXTMUTE signal */ twl_i2c_read_u8(TWL4030_MODULE_INTBR, &pin_mux, diff --git a/sound/soc/omap/sdp4430.c b/sound/soc/omap/sdp4430.c index 4ebbde6b565f..62f6a622d791 100644 --- a/sound/soc/omap/sdp4430.c +++ b/sound/soc/omap/sdp4430.c @@ -31,7 +31,6 @@ #include #include "mcpdm.h" -#include "omap-mcpdm.h" #include "omap-pcm.h" #include "../codecs/twl6040.h" @@ -41,7 +40,7 @@ static int sdp4430_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; int clk_id, freq; int ret; @@ -60,6 +59,7 @@ static int sdp4430_hw_params(struct snd_pcm_substream *substream, printk(KERN_ERR "can't set codec system clock\n"); return ret; } + return ret; } static struct snd_soc_ops sdp4430_ops = { @@ -126,8 +126,9 @@ static const struct snd_soc_dapm_route audio_map[] = { {"Earphone Spk", NULL, "EP"}, }; -static int sdp4430_twl6040_init(struct snd_soc_codec *codec) +static int sdp4430_twl6040_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int ret; /* Add SDP4430 specific controls */ @@ -164,8 +165,10 @@ static int sdp4430_twl6040_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link sdp4430_dai = { .name = "TWL6040", .stream_name = "TWL6040", - .cpu_dai = &omap_mcpdm_dai, - .codec_dai = &twl6040_dai, + .cpu_dai_name ="omap-mcpdm-dai", + .codec_dai_name = "twl6040-hifi", + .platform_name = "omap-pcm-audio", + .codec_name = "twl6040-codec", .init = sdp4430_twl6040_init, .ops = &sdp4430_ops, }; @@ -173,17 +176,10 @@ static struct snd_soc_dai_link sdp4430_dai = { /* Audio machine driver */ static struct snd_soc_card snd_soc_sdp4430 = { .name = "SDP4430", - .platform = &omap_soc_platform, .dai_link = &sdp4430_dai, .num_links = 1, }; -/* Audio subsystem */ -static struct snd_soc_device sdp4430_snd_devdata = { - .card = &snd_soc_sdp4430, - .codec_dev = &soc_codec_dev_twl6040, -}; - static struct platform_device *sdp4430_snd_device; static int __init sdp4430_soc_init(void) @@ -202,8 +198,7 @@ static int __init sdp4430_soc_init(void) return -ENOMEM; } - platform_set_drvdata(sdp4430_snd_device, &sdp4430_snd_devdata); - sdp4430_snd_devdata.dev = &sdp4430_snd_device->dev; + platform_set_drvdata(sdp4430_snd_device, &snd_soc_sdp4430); ret = platform_device_add(sdp4430_snd_device); if (ret) diff --git a/sound/soc/omap/zoom2.c b/sound/soc/omap/zoom2.c index 50a94ee76ecc..338dc9552bd6 100644 --- a/sound/soc/omap/zoom2.c +++ b/sound/soc/omap/zoom2.c @@ -29,21 +29,23 @@ #include #include #include +#include #include +/* Register descriptions for twl4030 codec part */ +#include + #include "omap-mcbsp.h" #include "omap-pcm.h" -#include "../codecs/twl4030.h" #define ZOOM2_HEADSET_MUX_GPIO (OMAP_MAX_GPIO_LINES + 15) -#define ZOOM2_HEADSET_EXTMUTE_GPIO 153 static int zoom2_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret; /* Set codec DAI configuration */ @@ -85,8 +87,8 @@ static int zoom2_hw_voice_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret; /* Set codec DAI configuration */ @@ -157,8 +159,9 @@ static const struct snd_soc_dapm_route audio_map[] = { {"Aux In", NULL, "AUXR"}, }; -static int zoom2_twl4030_init(struct snd_soc_codec *codec) +static int zoom2_twl4030_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int ret; /* Add Zoom2 specific widgets */ @@ -192,14 +195,15 @@ static int zoom2_twl4030_init(struct snd_soc_codec *codec) return ret; } -static int zoom2_twl4030_voice_init(struct snd_soc_codec *codec) +static int zoom2_twl4030_voice_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; unsigned short reg; /* Enable voice interface */ - reg = codec->read(codec, TWL4030_REG_VOICE_IF); + reg = codec->driver->read(codec, TWL4030_REG_VOICE_IF); reg |= TWL4030_VIF_DIN_EN | TWL4030_VIF_DOUT_EN | TWL4030_VIF_EN; - codec->write(codec, TWL4030_REG_VOICE_IF, reg); + codec->driver->write(codec, TWL4030_REG_VOICE_IF, reg); return 0; } @@ -209,16 +213,20 @@ static struct snd_soc_dai_link zoom2_dai[] = { { .name = "TWL4030 I2S", .stream_name = "TWL4030 Audio", - .cpu_dai = &omap_mcbsp_dai[0], - .codec_dai = &twl4030_dai[TWL4030_DAI_HIFI], + .cpu_dai_name = "omap-mcbsp-dai.1", + .codec_dai_name = "twl4030-hifi", + .platform_name = "omap-pcm-audio", + .codec_name = "twl4030-codec", .init = zoom2_twl4030_init, .ops = &zoom2_ops, }, { .name = "TWL4030 PCM", .stream_name = "TWL4030 Voice", - .cpu_dai = &omap_mcbsp_dai[1], - .codec_dai = &twl4030_dai[TWL4030_DAI_VOICE], + .cpu_dai_name = "omap-mcbsp-dai.2", + .codec_dai_name = "twl4030-voice", + .platform_name = "omap-pcm-audio", + .codec_name = "twl4030-codec", .init = zoom2_twl4030_voice_init, .ops = &zoom2_voice_ops, }, @@ -227,32 +235,10 @@ static struct snd_soc_dai_link zoom2_dai[] = { /* Audio machine driver */ static struct snd_soc_card snd_soc_zoom2 = { .name = "Zoom2", - .platform = &omap_soc_platform, .dai_link = zoom2_dai, .num_links = ARRAY_SIZE(zoom2_dai), }; -/* EXTMUTE callback function */ -void zoom2_set_hs_extmute(int mute) -{ - gpio_set_value(ZOOM2_HEADSET_EXTMUTE_GPIO, mute); -} - -/* twl4030 setup */ -static struct twl4030_setup_data twl4030_setup = { - .ramp_delay_value = 3, /* 161 ms */ - .sysclk = 26000, - .hs_extmute = 1, - .set_hs_extmute = zoom2_set_hs_extmute, -}; - -/* Audio subsystem */ -static struct snd_soc_device zoom2_snd_devdata = { - .card = &snd_soc_zoom2, - .codec_dev = &soc_codec_dev_twl4030, - .codec_data = &twl4030_setup, -}; - static struct platform_device *zoom2_snd_device; static int __init zoom2_soc_init(void) @@ -271,11 +257,7 @@ static int __init zoom2_soc_init(void) return -ENOMEM; } - platform_set_drvdata(zoom2_snd_device, &zoom2_snd_devdata); - zoom2_snd_devdata.dev = &zoom2_snd_device->dev; - *(unsigned int *)zoom2_dai[0].cpu_dai->private_data = 1; /* McBSP2 */ - *(unsigned int *)zoom2_dai[1].cpu_dai->private_data = 2; /* McBSP3 */ - + platform_set_drvdata(zoom2_snd_device, &snd_soc_zoom2); ret = platform_device_add(zoom2_snd_device); if (ret) goto err1; diff --git a/sound/soc/pxa/corgi.c b/sound/soc/pxa/corgi.c index fefe1a57f31a..11c6a495f970 100644 --- a/sound/soc/pxa/corgi.c +++ b/sound/soc/pxa/corgi.c @@ -99,7 +99,7 @@ static void corgi_ext_control(struct snd_soc_codec *codec) static int corgi_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_codec *codec = rtd->socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; /* check the jack status at stream startup */ corgi_ext_control(codec); @@ -118,8 +118,8 @@ static int corgi_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; unsigned int clk = 0; int ret = 0; @@ -272,8 +272,9 @@ static const struct snd_kcontrol_new wm8731_corgi_controls[] = { /* * Logic for a wm8731 as connected on a Sharp SL-C7x0 Device */ -static int corgi_wm8731_init(struct snd_soc_codec *codec) +static int corgi_wm8731_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int err; snd_soc_dapm_nc_pin(codec, "LLINEIN"); @@ -300,8 +301,10 @@ static int corgi_wm8731_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link corgi_dai = { .name = "WM8731", .stream_name = "WM8731", - .cpu_dai = &pxa_i2s_dai, - .codec_dai = &wm8731_dai, + .cpu_dai_name = "pxa-is2-dai", + .codec_dai_name = "wm8731-hifi", + .platform_name = "pxa-pcm-audio", + .codec_name = "wm8731-codec-0.001a", .init = corgi_wm8731_init, .ops = &corgi_ops, }; @@ -309,17 +312,10 @@ static struct snd_soc_dai_link corgi_dai = { /* corgi audio machine driver */ static struct snd_soc_card snd_soc_corgi = { .name = "Corgi", - .platform = &pxa2xx_soc_platform, .dai_link = &corgi_dai, .num_links = 1, }; -/* corgi audio subsystem */ -static struct snd_soc_device corgi_snd_devdata = { - .card = &snd_soc_corgi, - .codec_dev = &soc_codec_dev_wm8731, -}; - static struct platform_device *corgi_snd_device; static int __init corgi_init(void) @@ -334,8 +330,7 @@ static int __init corgi_init(void) if (!corgi_snd_device) return -ENOMEM; - platform_set_drvdata(corgi_snd_device, &corgi_snd_devdata); - corgi_snd_devdata.dev = &corgi_snd_device->dev; + platform_set_drvdata(corgi_snd_device, &snd_soc_corgi); ret = platform_device_add(corgi_snd_device); if (ret) diff --git a/sound/soc/pxa/e740_wm9705.c b/sound/soc/pxa/e740_wm9705.c index 7cd2f89d7b10..f614607b2055 100644 --- a/sound/soc/pxa/e740_wm9705.c +++ b/sound/soc/pxa/e740_wm9705.c @@ -24,7 +24,6 @@ #include #include "../codecs/wm9705.h" -#include "pxa2xx-pcm.h" #include "pxa2xx-ac97.h" @@ -90,8 +89,10 @@ static const struct snd_soc_dapm_route audio_map[] = { {"Mic Amp", NULL, "Mic (Internal)"}, }; -static int e740_ac97_init(struct snd_soc_codec *codec) +static int e740_ac97_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; + snd_soc_dapm_nc_pin(codec, "HPOUTL"); snd_soc_dapm_nc_pin(codec, "HPOUTR"); snd_soc_dapm_nc_pin(codec, "PHONE"); @@ -116,30 +117,28 @@ static struct snd_soc_dai_link e740_dai[] = { { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI], - .codec_dai = &wm9705_dai[WM9705_DAI_AC97_HIFI], + .cpu_dai_name = "pxa-ac97.0", + .codec_dai_name = "wm9705-hifi", + .platform_name = "pxa-pcm-audio", + .codec_name = "wm9705-codec", .init = e740_ac97_init, }, { .name = "AC97 Aux", .stream_name = "AC97 Aux", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX], - .codec_dai = &wm9705_dai[WM9705_DAI_AC97_AUX], + .cpu_dai_name = "pxa-ac97.1", + .codec_dai_name = "wm9705-aux", + .platform_name = "pxa-pcm-audio", + .codec_name = "wm9705-codec", }, }; static struct snd_soc_card e740 = { .name = "Toshiba e740", - .platform = &pxa2xx_soc_platform, .dai_link = e740_dai, .num_links = ARRAY_SIZE(e740_dai), }; -static struct snd_soc_device e740_snd_devdata = { - .card = &e740, - .codec_dev = &soc_codec_dev_wm9705, -}; - static struct platform_device *e740_snd_device; static int __init e740_init(void) @@ -178,8 +177,7 @@ static int __init e740_init(void) goto free_apwr_gpio; } - platform_set_drvdata(e740_snd_device, &e740_snd_devdata); - e740_snd_devdata.dev = &e740_snd_device->dev; + platform_set_drvdata(e740_snd_device, &e740); ret = platform_device_add(e740_snd_device); if (!ret) diff --git a/sound/soc/pxa/e750_wm9705.c b/sound/soc/pxa/e750_wm9705.c index 8dceccc5e059..4c143803a75e 100644 --- a/sound/soc/pxa/e750_wm9705.c +++ b/sound/soc/pxa/e750_wm9705.c @@ -24,7 +24,6 @@ #include #include "../codecs/wm9705.h" -#include "pxa2xx-pcm.h" #include "pxa2xx-ac97.h" static int e750_spk_amp_event(struct snd_soc_dapm_widget *w, @@ -72,8 +71,10 @@ static const struct snd_soc_dapm_route audio_map[] = { {"MIC1", NULL, "Mic (Internal)"}, }; -static int e750_ac97_init(struct snd_soc_codec *codec) +static int e750_ac97_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; + snd_soc_dapm_nc_pin(codec, "LOUT"); snd_soc_dapm_nc_pin(codec, "ROUT"); snd_soc_dapm_nc_pin(codec, "PHONE"); @@ -98,31 +99,29 @@ static struct snd_soc_dai_link e750_dai[] = { { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI], - .codec_dai = &wm9705_dai[WM9705_DAI_AC97_HIFI], + .cpu_dai_name = "pxa-ac97.0", + .codec_dai_name = "wm9705-hifi", + .platform_name = "pxa-pcm-audio", + .codec_name = "wm9705-codec", .init = e750_ac97_init, /* use ops to check startup state */ }, { .name = "AC97 Aux", .stream_name = "AC97 Aux", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX], - .codec_dai = &wm9705_dai[WM9705_DAI_AC97_AUX], + .cpu_dai_name = "pxa-ac97.1", + .codec_dai_name ="wm9705-aux", + .platform_name = "pxa-pcm-audio", + .codec_name = "wm9705-codec", }, }; static struct snd_soc_card e750 = { .name = "Toshiba e750", - .platform = &pxa2xx_soc_platform, .dai_link = e750_dai, .num_links = ARRAY_SIZE(e750_dai), }; -static struct snd_soc_device e750_snd_devdata = { - .card = &e750, - .codec_dev = &soc_codec_dev_wm9705, -}; - static struct platform_device *e750_snd_device; static int __init e750_init(void) @@ -154,8 +153,7 @@ static int __init e750_init(void) goto free_spk_amp_gpio; } - platform_set_drvdata(e750_snd_device, &e750_snd_devdata); - e750_snd_devdata.dev = &e750_snd_device->dev; + platform_set_drvdata(e750_snd_device, &e750); ret = platform_device_add(e750_snd_device); if (!ret) diff --git a/sound/soc/pxa/e800_wm9712.c b/sound/soc/pxa/e800_wm9712.c index bc019cdce429..d42e5fe832c5 100644 --- a/sound/soc/pxa/e800_wm9712.c +++ b/sound/soc/pxa/e800_wm9712.c @@ -23,7 +23,6 @@ #include #include "../codecs/wm9712.h" -#include "pxa2xx-pcm.h" #include "pxa2xx-ac97.h" static int e800_spk_amp_event(struct snd_soc_dapm_widget *w, @@ -73,8 +72,10 @@ static const struct snd_soc_dapm_route audio_map[] = { {"MIC2", NULL, "Mic (Internal2)"}, }; -static int e800_ac97_init(struct snd_soc_codec *codec) +static int e800_ac97_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; + snd_soc_dapm_new_controls(codec, e800_dapm_widgets, ARRAY_SIZE(e800_dapm_widgets)); @@ -88,30 +89,28 @@ static struct snd_soc_dai_link e800_dai[] = { { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI], - .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI], + .cpu_dai_name = "pxa-ac97.0", + .codec_dai_name = "wm9712-hifi", + .platform_name = "pxa-pcm-audio", + .codec_name = "wm9712-codec", .init = e800_ac97_init, }, { .name = "AC97 Aux", .stream_name = "AC97 Aux", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX], - .codec_dai = &wm9712_dai[WM9712_DAI_AC97_AUX], + .cpu_dai_name = "pxa-ac97.1", + .codec_dai_name ="wm9712-aux", + .platform_name = "pxa-pcm-audio", + .codec_name = "wm9712-codec", }, }; static struct snd_soc_card e800 = { .name = "Toshiba e800", - .platform = &pxa2xx_soc_platform, .dai_link = e800_dai, .num_links = ARRAY_SIZE(e800_dai), }; -static struct snd_soc_device e800_snd_devdata = { - .card = &e800, - .codec_dev = &soc_codec_dev_wm9712, -}; - static struct platform_device *e800_snd_device; static int __init e800_init(void) @@ -141,8 +140,7 @@ static int __init e800_init(void) if (!e800_snd_device) return -ENOMEM; - platform_set_drvdata(e800_snd_device, &e800_snd_devdata); - e800_snd_devdata.dev = &e800_snd_device->dev; + platform_set_drvdata(e800_snd_device, &e800); ret = platform_device_add(e800_snd_device); if (!ret) diff --git a/sound/soc/pxa/em-x270.c b/sound/soc/pxa/em-x270.c index f4756e4025fd..7046128b2a4c 100644 --- a/sound/soc/pxa/em-x270.c +++ b/sound/soc/pxa/em-x270.c @@ -39,29 +39,27 @@ static struct snd_soc_dai_link em_x270_dai[] = { { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI], - .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI], + .cpu_dai_name = "pxa-ac97.0", + .codec_dai_name = "wm9712-hifi", + .platform_name = "pxa-pcm-audio", + .codec_name = "wm9712-codec", }, { .name = "AC97 Aux", .stream_name = "AC97 Aux", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX], - .codec_dai = &wm9712_dai[WM9712_DAI_AC97_AUX], + .cpu_dai_name = "pxa-ac97.1", + .codec_dai_name ="wm9712-aux", + .platform_name = "pxa-pcm-audio", + .codec_name = "wm9712-codec", }, }; static struct snd_soc_card em_x270 = { .name = "EM-X270", - .platform = &pxa2xx_soc_platform, .dai_link = em_x270_dai, .num_links = ARRAY_SIZE(em_x270_dai), }; -static struct snd_soc_device em_x270_snd_devdata = { - .card = &em_x270, - .codec_dev = &soc_codec_dev_wm9712, -}; - static struct platform_device *em_x270_snd_device; static int __init em_x270_init(void) @@ -76,8 +74,7 @@ static int __init em_x270_init(void) if (!em_x270_snd_device) return -ENOMEM; - platform_set_drvdata(em_x270_snd_device, &em_x270_snd_devdata); - em_x270_snd_devdata.dev = &em_x270_snd_device->dev; + platform_set_drvdata(em_x270_snd_device, &em_x270); ret = platform_device_add(em_x270_snd_device); if (ret) diff --git a/sound/soc/pxa/imote2.c b/sound/soc/pxa/imote2.c index 405587a01160..03765fc5ac74 100644 --- a/sound/soc/pxa/imote2.c +++ b/sound/soc/pxa/imote2.c @@ -6,14 +6,13 @@ #include "../codecs/wm8940.h" #include "pxa2xx-i2s.h" -#include "pxa2xx-pcm.h" static int imote2_asoc_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; unsigned int clk = 0; int ret; @@ -64,23 +63,19 @@ static struct snd_soc_ops imote2_asoc_ops = { static struct snd_soc_dai_link imote2_dai = { .name = "WM8940", .stream_name = "WM8940", - .cpu_dai = &pxa_i2s_dai, - .codec_dai = &wm8940_dai, + .cpu_dai_name = "pxa-i2s", + .codec_dai_name = "wm8940-hifi", + .platform_name = "pxa-pcm-audio", + .codec_name = "wm8940-codec.0-0034", .ops = &imote2_asoc_ops, }; static struct snd_soc_card snd_soc_imote2 = { .name = "Imote2", - .platform = &pxa2xx_soc_platform, .dai_link = &imote2_dai, .num_links = 1, }; -static struct snd_soc_device imote2_snd_devdata = { - .card = &snd_soc_imote2, - .codec_dev = &soc_codec_dev_wm8940, -}; - static struct platform_device *imote2_snd_device; static int __init imote2_asoc_init(void) @@ -93,8 +88,7 @@ static int __init imote2_asoc_init(void) if (!imote2_snd_device) return -ENOMEM; - platform_set_drvdata(imote2_snd_device, &imote2_snd_devdata); - imote2_snd_devdata.dev = &imote2_snd_device->dev; + platform_set_drvdata(imote2_snd_device, &snd_soc_imote2); ret = platform_device_add(imote2_snd_device); if (ret) platform_device_put(imote2_snd_device); diff --git a/sound/soc/pxa/magician.c b/sound/soc/pxa/magician.c index 4c8d99a8d386..608bc3dd835f 100644 --- a/sound/soc/pxa/magician.c +++ b/sound/soc/pxa/magician.c @@ -32,7 +32,6 @@ #include #include #include "../codecs/uda1380.h" -#include "pxa2xx-pcm.h" #include "pxa2xx-i2s.h" #include "pxa-ssp.h" @@ -71,7 +70,7 @@ static void magician_ext_control(struct snd_soc_codec *codec) static int magician_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_codec *codec = rtd->socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; /* check the jack status at stream startup */ magician_ext_control(codec); @@ -86,8 +85,8 @@ static int magician_playback_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; unsigned int acps, acds, width, rate; unsigned int div4 = PXA_SSP_CLK_SCDB_4; int ret = 0; @@ -227,8 +226,8 @@ static int magician_capture_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret = 0; /* set codec DAI configuration */ @@ -393,8 +392,9 @@ static const struct snd_kcontrol_new uda1380_magician_controls[] = { /* * Logic for a uda1380 as connected on a HTC Magician */ -static int magician_uda1380_init(struct snd_soc_codec *codec) +static int magician_uda1380_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int err; /* NC codec pins */ @@ -427,16 +427,20 @@ static struct snd_soc_dai_link magician_dai[] = { { .name = "uda1380", .stream_name = "UDA1380 Playback", - .cpu_dai = &pxa_ssp_dai[PXA_DAI_SSP1], - .codec_dai = &uda1380_dai[UDA1380_DAI_PLAYBACK], + .cpu_dai_name = "pxa-ssp-dai.0", + .codec_dai_name = "uda1380-hifi-playback", + .platform_name = "pxa-pcm-audio", + .codec_name = "uda1380-codec.0-0018", .init = magician_uda1380_init, .ops = &magician_playback_ops, }, { .name = "uda1380", .stream_name = "UDA1380 Capture", - .cpu_dai = &pxa_i2s_dai, - .codec_dai = &uda1380_dai[UDA1380_DAI_CAPTURE], + .cpu_dai_name = "pxa-i2s", + .codec_dai_name = "uda1380-hifi-capture", + .platform_name = "pxa-pcm-audio", + .codec_name = "uda1380-codec.0-0018", .ops = &magician_capture_ops, } }; @@ -446,13 +450,7 @@ static struct snd_soc_card snd_soc_card_magician = { .name = "Magician", .dai_link = magician_dai, .num_links = ARRAY_SIZE(magician_dai), - .platform = &pxa2xx_soc_platform, -}; -/* magician audio subsystem */ -static struct snd_soc_device magician_snd_devdata = { - .card = &snd_soc_card_magician, - .codec_dev = &soc_codec_dev_uda1380, }; static struct platform_device *magician_snd_device; @@ -514,8 +512,7 @@ static int __init magician_init(void) goto err_pdev; } - platform_set_drvdata(magician_snd_device, &magician_snd_devdata); - magician_snd_devdata.dev = &magician_snd_device->dev; + platform_set_drvdata(magician_snd_device, &snd_soc_card_magician); ret = platform_device_add(magician_snd_device); if (ret) { platform_device_put(magician_snd_device); diff --git a/sound/soc/pxa/mioa701_wm9713.c b/sound/soc/pxa/mioa701_wm9713.c index 19eda8bbfdaf..f284cc54bc80 100644 --- a/sound/soc/pxa/mioa701_wm9713.c +++ b/sound/soc/pxa/mioa701_wm9713.c @@ -54,7 +54,6 @@ #include #include -#include "pxa2xx-pcm.h" #include "pxa2xx-ac97.h" #include "../codecs/wm9713.h" @@ -128,8 +127,9 @@ static const struct snd_soc_dapm_route audio_map[] = { {"Rear Speaker", NULL, "SPKR"}, }; -static int mioa701_wm9713_init(struct snd_soc_codec *codec) +static int mioa701_wm9713_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; unsigned short reg; /* Add mioa701 specific widgets */ @@ -139,12 +139,12 @@ static int mioa701_wm9713_init(struct snd_soc_codec *codec) snd_soc_dapm_add_routes(codec, ARRAY_AND_SIZE(audio_map)); /* Prepare GPIO8 for rear speaker amplifier */ - reg = codec->read(codec, AC97_GPIO_CFG); - codec->write(codec, AC97_GPIO_CFG, reg | 0x0100); + reg = codec->driver->read(codec, AC97_GPIO_CFG); + codec->driver->write(codec, AC97_GPIO_CFG, reg | 0x0100); /* Prepare MIC input */ - reg = codec->read(codec, AC97_3D_CONTROL); - codec->write(codec, AC97_3D_CONTROL, reg | 0xc000); + reg = codec->driver->read(codec, AC97_3D_CONTROL); + codec->driver->write(codec, AC97_3D_CONTROL, reg | 0xc000); snd_soc_dapm_enable_pin(codec, "Front Speaker"); snd_soc_dapm_enable_pin(codec, "Rear Speaker"); @@ -162,32 +162,30 @@ static struct snd_soc_dai_link mioa701_dai[] = { { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI], - .codec_dai = &wm9713_dai[WM9713_DAI_AC97_HIFI], + .cpu_dai_name = "pxa-ac97.0", + .codec_dai_name = "wm9713-hifi", + .codec_name = "wm9713-codec", .init = mioa701_wm9713_init, + .platform_name = "pxa-pcm-audio", .ops = &mioa701_ops, }, { .name = "AC97 Aux", .stream_name = "AC97 Aux", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX], - .codec_dai = &wm9713_dai[WM9713_DAI_AC97_AUX], + .cpu_dai_name = "pxa-ac97.1", + .codec_dai_name ="wm9713-aux", + .codec_name = "wm9713-codec", + .platform_name = "pxa-pcm-audio", .ops = &mioa701_ops, }, }; static struct snd_soc_card mioa701 = { .name = "MioA701", - .platform = &pxa2xx_soc_platform, .dai_link = mioa701_dai, .num_links = ARRAY_SIZE(mioa701_dai), }; -static struct snd_soc_device mioa701_snd_devdata = { - .card = &mioa701, - .codec_dev = &soc_codec_dev_wm9713, -}; - static struct platform_device *mioa701_snd_device; static int mioa701_wm9713_probe(struct platform_device *pdev) @@ -205,8 +203,7 @@ static int mioa701_wm9713_probe(struct platform_device *pdev) if (!mioa701_snd_device) return -ENOMEM; - platform_set_drvdata(mioa701_snd_device, &mioa701_snd_devdata); - mioa701_snd_devdata.dev = &mioa701_snd_device->dev; + platform_set_drvdata(mioa701_snd_device, &mioa701); ret = platform_device_add(mioa701_snd_device); if (!ret) diff --git a/sound/soc/pxa/palm27x.c b/sound/soc/pxa/palm27x.c index 1f96e3227be5..13f6d485d571 100644 --- a/sound/soc/pxa/palm27x.c +++ b/sound/soc/pxa/palm27x.c @@ -29,7 +29,6 @@ #include #include "../codecs/wm9712.h" -#include "pxa2xx-pcm.h" #include "pxa2xx-ac97.h" static struct snd_soc_jack hs_jack; @@ -75,8 +74,9 @@ static const struct snd_soc_dapm_route audio_map[] = { static struct snd_soc_card palm27x_asoc; -static int palm27x_ac97_init(struct snd_soc_codec *codec) +static int palm27x_ac97_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int err; /* add palm27x specific widgets */ @@ -112,7 +112,7 @@ static int palm27x_ac97_init(struct snd_soc_codec *codec) return err; /* Jack detection API stuff */ - err = snd_soc_jack_new(&palm27x_asoc, "Headphone Jack", + err = snd_soc_jack_new(codec, "Headphone Jack", SND_JACK_HEADPHONE, &hs_jack); if (err) return err; @@ -132,30 +132,28 @@ static struct snd_soc_dai_link palm27x_dai[] = { { .name = "AC97 HiFi", .stream_name = "AC97 HiFi", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI], - .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI], + .cpu_dai_name = "pxa-ac97.0", + .codec_dai_name = "wm9712-hifi", + .codec_name = "wm9712-codec", + .platform_name = "pxa-pcm-audio", .init = palm27x_ac97_init, }, { .name = "AC97 Aux", .stream_name = "AC97 Aux", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX], - .codec_dai = &wm9712_dai[WM9712_DAI_AC97_AUX], + .cpu_dai_name = "pxa-ac97.1", + .codec_dai_name = "wm9712-aux", + .codec_name = "wm9712-codec", + .platform_name = "pxa-pcm-audio", }, }; static struct snd_soc_card palm27x_asoc = { .name = "Palm/PXA27x", - .platform = &pxa2xx_soc_platform, .dai_link = palm27x_dai, .num_links = ARRAY_SIZE(palm27x_dai), }; -static struct snd_soc_device palm27x_snd_devdata = { - .card = &palm27x_asoc, - .codec_dev = &soc_codec_dev_wm9712, -}; - static struct platform_device *palm27x_snd_device; static int palm27x_asoc_probe(struct platform_device *pdev) @@ -178,8 +176,7 @@ static int palm27x_asoc_probe(struct platform_device *pdev) if (!palm27x_snd_device) return -ENOMEM; - platform_set_drvdata(palm27x_snd_device, &palm27x_snd_devdata); - palm27x_snd_devdata.dev = &palm27x_snd_device->dev; + platform_set_drvdata(palm27x_snd_device, &palm27x_asoc); ret = platform_device_add(palm27x_snd_device); if (ret != 0) diff --git a/sound/soc/pxa/poodle.c b/sound/soc/pxa/poodle.c index c5f36e0eab58..3ba5a962ecb8 100644 --- a/sound/soc/pxa/poodle.c +++ b/sound/soc/pxa/poodle.c @@ -31,7 +31,6 @@ #include #include "../codecs/wm8731.h" -#include "pxa2xx-pcm.h" #include "pxa2xx-i2s.h" #define POODLE_HP 1 @@ -76,7 +75,7 @@ static void poodle_ext_control(struct snd_soc_codec *codec) static int poodle_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_codec *codec = rtd->socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; /* check the jack status at stream startup */ poodle_ext_control(codec); @@ -97,8 +96,8 @@ static int poodle_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; unsigned int clk = 0; int ret = 0; @@ -237,8 +236,9 @@ static const struct snd_kcontrol_new wm8731_poodle_controls[] = { /* * Logic for a wm8731 as connected on a Sharp SL-C7x0 Device */ -static int poodle_wm8731_init(struct snd_soc_codec *codec) +static int poodle_wm8731_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int err; snd_soc_dapm_nc_pin(codec, "LLINEIN"); @@ -266,8 +266,10 @@ static int poodle_wm8731_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link poodle_dai = { .name = "WM8731", .stream_name = "WM8731", - .cpu_dai = &pxa_i2s_dai, - .codec_dai = &wm8731_dai, + .cpu_dai_name = "pxa-i2s", + .codec_dai_name = "wm8731-hifi" + .platform_name = "pxa-pcm-audio", + .codec_name = "wm8731-codec.0-001a", .init = poodle_wm8731_init, .ops = &poodle_ops, }; @@ -275,15 +277,9 @@ static struct snd_soc_dai_link poodle_dai = { /* poodle audio machine driver */ static struct snd_soc_card snd_soc_poodle = { .name = "Poodle", - .platform = &pxa2xx_soc_platform, .dai_link = &poodle_dai, .num_links = 1, -}; - -/* poodle audio subsystem */ -static struct snd_soc_device poodle_snd_devdata = { - .card = &snd_soc_poodle, - .codec_dev = &soc_codec_dev_wm8731, + .owner = THIS_MODULE, }; static struct platform_device *poodle_snd_device; @@ -307,8 +303,7 @@ static int __init poodle_init(void) if (!poodle_snd_device) return -ENOMEM; - platform_set_drvdata(poodle_snd_device, &poodle_snd_devdata); - poodle_snd_devdata.dev = &poodle_snd_device->dev; + platform_set_drvdata(poodle_snd_device, &snd_soc_poodle); ret = platform_device_add(poodle_snd_device); if (ret) diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c index a1fd23e0e3d0..99d80e85621c 100644 --- a/sound/soc/pxa/pxa-ssp.c +++ b/sound/soc/pxa/pxa-ssp.c @@ -108,11 +108,9 @@ pxa_ssp_get_dma_params(struct ssp_device *ssp, int width4, int out) } static int pxa_ssp_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) + struct snd_soc_dai *cpu_dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct ssp_priv *priv = cpu_dai->private_data; + struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai); struct ssp_device *ssp = priv->ssp; int ret = 0; @@ -128,11 +126,9 @@ static int pxa_ssp_startup(struct snd_pcm_substream *substream, } static void pxa_ssp_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) + struct snd_soc_dai *cpu_dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct ssp_priv *priv = cpu_dai->private_data; + struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai); struct ssp_device *ssp = priv->ssp; if (!cpu_dai->active) { @@ -148,7 +144,7 @@ static void pxa_ssp_shutdown(struct snd_pcm_substream *substream, static int pxa_ssp_suspend(struct snd_soc_dai *cpu_dai) { - struct ssp_priv *priv = cpu_dai->private_data; + struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai); struct ssp_device *ssp = priv->ssp; if (!cpu_dai->active) @@ -166,7 +162,7 @@ static int pxa_ssp_suspend(struct snd_soc_dai *cpu_dai) static int pxa_ssp_resume(struct snd_soc_dai *cpu_dai) { - struct ssp_priv *priv = cpu_dai->private_data; + struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai); struct ssp_device *ssp = priv->ssp; uint32_t sssr = SSSR_ROR | SSSR_TUR | SSSR_BCE; @@ -230,7 +226,7 @@ static u32 pxa_ssp_get_scr(struct ssp_device *ssp) static int pxa_ssp_set_dai_sysclk(struct snd_soc_dai *cpu_dai, int clk_id, unsigned int freq, int dir) { - struct ssp_priv *priv = cpu_dai->private_data; + struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai); struct ssp_device *ssp = priv->ssp; int val; @@ -287,7 +283,7 @@ static int pxa_ssp_set_dai_sysclk(struct snd_soc_dai *cpu_dai, static int pxa_ssp_set_dai_clkdiv(struct snd_soc_dai *cpu_dai, int div_id, int div) { - struct ssp_priv *priv = cpu_dai->private_data; + struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai); struct ssp_device *ssp = priv->ssp; int val; @@ -338,7 +334,7 @@ static int pxa_ssp_set_dai_clkdiv(struct snd_soc_dai *cpu_dai, static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct ssp_priv *priv = cpu_dai->private_data; + struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai); struct ssp_device *ssp = priv->ssp; u32 ssacd = pxa_ssp_read_reg(ssp, SSACD) & ~0x70; @@ -407,7 +403,7 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai, int pll_id, static int pxa_ssp_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct ssp_priv *priv = cpu_dai->private_data; + struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai); struct ssp_device *ssp = priv->ssp; u32 sscr0; @@ -442,7 +438,7 @@ static int pxa_ssp_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, static int pxa_ssp_set_dai_tristate(struct snd_soc_dai *cpu_dai, int tristate) { - struct ssp_priv *priv = cpu_dai->private_data; + struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai); struct ssp_device *ssp = priv->ssp; u32 sscr1; @@ -464,7 +460,7 @@ static int pxa_ssp_set_dai_tristate(struct snd_soc_dai *cpu_dai, static int pxa_ssp_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { - struct ssp_priv *priv = cpu_dai->private_data; + struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai); struct ssp_device *ssp = priv->ssp; u32 sscr0; u32 sscr1; @@ -555,11 +551,9 @@ static int pxa_ssp_set_dai_fmt(struct snd_soc_dai *cpu_dai, */ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) + struct snd_soc_dai *cpu_dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct ssp_priv *priv = cpu_dai->private_data; + struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai); struct ssp_device *ssp = priv->ssp; int chn = params_channels(params); u32 sscr0; @@ -568,7 +562,7 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream, int ttsa = pxa_ssp_read_reg(ssp, SSTSA) & 0xf; struct pxa2xx_pcm_dma_params *dma_data; - dma_data = snd_soc_dai_get_dma_data(dai, substream); + dma_data = snd_soc_dai_get_dma_data(cpu_dai, substream); /* generate correct DMA params */ kfree(dma_data); @@ -581,7 +575,7 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream, ((chn == 2) && (ttsa != 1)) || (width == 32), substream->stream == SNDRV_PCM_STREAM_PLAYBACK); - snd_soc_dai_set_dma_data(dai, substream, dma_data); + snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data); /* we can only change the settings if the port is not in use */ if (pxa_ssp_read_reg(ssp, SSCR0) & SSCR0_SSE) @@ -668,12 +662,10 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream, } static int pxa_ssp_trigger(struct snd_pcm_substream *substream, int cmd, - struct snd_soc_dai *dai) + struct snd_soc_dai *cpu_dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; int ret = 0; - struct ssp_priv *priv = cpu_dai->private_data; + struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai); struct ssp_device *ssp = priv->ssp; int val; @@ -729,8 +721,7 @@ static int pxa_ssp_trigger(struct snd_pcm_substream *substream, int cmd, return ret; } -static int pxa_ssp_probe(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int pxa_ssp_probe(struct snd_soc_dai *dai) { struct ssp_priv *priv; int ret; @@ -746,7 +737,7 @@ static int pxa_ssp_probe(struct platform_device *pdev, } priv->dai_fmt = (unsigned int) -1; - dai->private_data = priv; + snd_soc_dai_set_drvdata(dai, priv); return 0; @@ -755,11 +746,12 @@ err_priv: return ret; } -static void pxa_ssp_remove(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int pxa_ssp_remove(struct snd_soc_dai *dai) { - struct ssp_priv *priv = dai->private_data; + struct ssp_priv *priv = snd_soc_dai_get_drvdata(dai); + pxa_ssp_free(priv->ssp); + return 0; } #define PXA_SSP_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\ @@ -784,10 +776,7 @@ static struct snd_soc_dai_ops pxa_ssp_dai_ops = { .set_tristate = pxa_ssp_set_dai_tristate, }; -struct snd_soc_dai pxa_ssp_dai[] = { - { - .name = "pxa2xx-ssp1", - .id = 0, +static struct snd_soc_dai_driver pxa_ssp_dai = { .probe = pxa_ssp_probe, .remove = pxa_ssp_remove, .suspend = pxa_ssp_suspend, @@ -805,81 +794,38 @@ struct snd_soc_dai pxa_ssp_dai[] = { .formats = PXA_SSP_FORMATS, }, .ops = &pxa_ssp_dai_ops, +}; + +static __devinit int asoc_ssp_probe(struct platform_device *pdev) +{ + return snd_soc_register_dai(&pdev->dev, &pxa_ssp_dai); +} + +static int __devexit asoc_ssp_remove(struct platform_device *pdev) +{ + snd_soc_unregister_dai(&pdev->dev); + return 0; +} + +static struct platform_driver asoc_ssp_driver = { + .driver = { + .name = "pxa-ssp-dai", + .owner = THIS_MODULE, }, - { .name = "pxa2xx-ssp2", - .id = 1, - .probe = pxa_ssp_probe, - .remove = pxa_ssp_remove, - .suspend = pxa_ssp_suspend, - .resume = pxa_ssp_resume, - .playback = { - .channels_min = 1, - .channels_max = 8, - .rates = PXA_SSP_RATES, - .formats = PXA_SSP_FORMATS, - }, - .capture = { - .channels_min = 1, - .channels_max = 8, - .rates = PXA_SSP_RATES, - .formats = PXA_SSP_FORMATS, - }, - .ops = &pxa_ssp_dai_ops, - }, - { - .name = "pxa2xx-ssp3", - .id = 2, - .probe = pxa_ssp_probe, - .remove = pxa_ssp_remove, - .suspend = pxa_ssp_suspend, - .resume = pxa_ssp_resume, - .playback = { - .channels_min = 1, - .channels_max = 8, - .rates = PXA_SSP_RATES, - .formats = PXA_SSP_FORMATS, - }, - .capture = { - .channels_min = 1, - .channels_max = 8, - .rates = PXA_SSP_RATES, - .formats = PXA_SSP_FORMATS, - }, - .ops = &pxa_ssp_dai_ops, - }, - { - .name = "pxa2xx-ssp4", - .id = 3, - .probe = pxa_ssp_probe, - .remove = pxa_ssp_remove, - .suspend = pxa_ssp_suspend, - .resume = pxa_ssp_resume, - .playback = { - .channels_min = 1, - .channels_max = 8, - .rates = PXA_SSP_RATES, - .formats = PXA_SSP_FORMATS, - }, - .capture = { - .channels_min = 1, - .channels_max = 8, - .rates = PXA_SSP_RATES, - .formats = PXA_SSP_FORMATS, - }, - .ops = &pxa_ssp_dai_ops, - }, + + .probe = asoc_ssp_probe, + .remove = __devexit_p(asoc_ssp_remove), }; -EXPORT_SYMBOL_GPL(pxa_ssp_dai); static int __init pxa_ssp_init(void) { - return snd_soc_register_dais(pxa_ssp_dai, ARRAY_SIZE(pxa_ssp_dai)); + return platform_driver_register(&asoc_ssp_driver); } module_init(pxa_ssp_init); static void __exit pxa_ssp_exit(void) { - snd_soc_unregister_dais(pxa_ssp_dai, ARRAY_SIZE(pxa_ssp_dai)); + platform_driver_unregister(&asoc_ssp_driver); } module_exit(pxa_ssp_exit); diff --git a/sound/soc/pxa/pxa-ssp.h b/sound/soc/pxa/pxa-ssp.h index 91deadd55675..bc79da221c0d 100644 --- a/sound/soc/pxa/pxa-ssp.h +++ b/sound/soc/pxa/pxa-ssp.h @@ -42,6 +42,4 @@ #define PXA_SSP_PLL_OUT 0 -extern struct snd_soc_dai pxa_ssp_dai[4]; - #endif diff --git a/sound/soc/pxa/pxa2xx-ac97.c b/sound/soc/pxa/pxa2xx-ac97.c index d314115e3dd7..9c2bafa112ad 100644 --- a/sound/soc/pxa/pxa2xx-ac97.c +++ b/sound/soc/pxa/pxa2xx-ac97.c @@ -104,24 +104,21 @@ static int pxa2xx_ac97_resume(struct snd_soc_dai *dai) #define pxa2xx_ac97_resume NULL #endif -static int pxa2xx_ac97_probe(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int pxa2xx_ac97_probe(struct snd_soc_dai *dai) { return pxa2xx_ac97_hw_probe(to_platform_device(dai->dev)); } -static void pxa2xx_ac97_remove(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int pxa2xx_ac97_remove(struct snd_soc_dai *dai) { pxa2xx_ac97_hw_remove(to_platform_device(dai->dev)); + return 0; } static int pxa2xx_ac97_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) + struct snd_soc_dai *cpu_dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; struct pxa2xx_pcm_dma_params *dma_data; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) @@ -136,10 +133,8 @@ static int pxa2xx_ac97_hw_params(struct snd_pcm_substream *substream, static int pxa2xx_ac97_hw_aux_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) + struct snd_soc_dai *cpu_dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; struct pxa2xx_pcm_dma_params *dma_data; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) @@ -154,11 +149,8 @@ static int pxa2xx_ac97_hw_aux_params(struct snd_pcm_substream *substream, static int pxa2xx_ac97_hw_mic_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) + struct snd_soc_dai *cpu_dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) return -ENODEV; else @@ -188,10 +180,9 @@ static struct snd_soc_dai_ops pxa_ac97_mic_dai_ops = { * There is only 1 physical AC97 interface for pxa2xx, but it * has extra fifo's that can be used for aux DACs and ADCs. */ -struct snd_soc_dai pxa_ac97_dai[] = { +static struct snd_soc_dai_driver pxa_ac97_dai[] = { { .name = "pxa2xx-ac97", - .id = 0, .ac97_control = 1, .probe = pxa2xx_ac97_probe, .remove = pxa2xx_ac97_remove, @@ -213,7 +204,6 @@ struct snd_soc_dai pxa_ac97_dai[] = { }, { .name = "pxa2xx-ac97-aux", - .id = 1, .ac97_control = 1, .playback = { .stream_name = "AC97 Aux Playback", @@ -231,7 +221,6 @@ struct snd_soc_dai pxa_ac97_dai[] = { }, { .name = "pxa2xx-ac97-mic", - .id = 2, .ac97_control = 1, .capture = { .stream_name = "AC97 Mic Capture", @@ -243,36 +232,26 @@ struct snd_soc_dai pxa_ac97_dai[] = { }, }; -EXPORT_SYMBOL_GPL(pxa_ac97_dai); EXPORT_SYMBOL_GPL(soc_ac97_ops); -static int __devinit pxa2xx_ac97_dev_probe(struct platform_device *pdev) +static __devinit int pxa2xx_ac97_dev_probe(struct platform_device *pdev) { - int i; - pxa2xx_audio_ops_t *pdata = pdev->dev.platform_data; - - if (pdev->id >= 0) { + if (pdev->id != -1) { dev_err(&pdev->dev, "PXA2xx has only one AC97 port.\n"); return -ENXIO; } - for (i = 0; i < ARRAY_SIZE(pxa_ac97_dai); i++) { - pxa_ac97_dai[i].dev = &pdev->dev; - if (pdata && pdata->codec_pdata[0]) - pxa_ac97_dai[i].ac97_pdata = pdata->codec_pdata[0]; - } - /* Punt most of the init to the SoC probe; we may need the machine * driver to do interesting things with the clocking to get us up * and running. */ - return snd_soc_register_dais(pxa_ac97_dai, ARRAY_SIZE(pxa_ac97_dai)); + return snd_soc_register_dais(&pdev->dev, pxa_ac97_dai, + ARRAY_SIZE(pxa_ac97_dai)); } static int __devexit pxa2xx_ac97_dev_remove(struct platform_device *pdev) { - snd_soc_unregister_dais(pxa_ac97_dai, ARRAY_SIZE(pxa_ac97_dai)); - + snd_soc_unregister_dais(&pdev->dev, ARRAY_SIZE(pxa_ac97_dai)); return 0; } diff --git a/sound/soc/pxa/pxa2xx-ac97.h b/sound/soc/pxa/pxa2xx-ac97.h index e390de8edcd4..eda891e6f31b 100644 --- a/sound/soc/pxa/pxa2xx-ac97.h +++ b/sound/soc/pxa/pxa2xx-ac97.h @@ -14,8 +14,6 @@ #define PXA2XX_DAI_AC97_AUX 1 #define PXA2XX_DAI_AC97_MIC 2 -extern struct snd_soc_dai pxa_ac97_dai[3]; - /* platform data */ extern struct snd_ac97_bus_ops pxa2xx_ac97_ops; diff --git a/sound/soc/pxa/pxa2xx-i2s.c b/sound/soc/pxa/pxa2xx-i2s.c index c1a5275721e4..3b473b200a8f 100644 --- a/sound/soc/pxa/pxa2xx-i2s.c +++ b/sound/soc/pxa/pxa2xx-i2s.c @@ -80,6 +80,7 @@ struct pxa_i2s_port { }; static struct pxa_i2s_port pxa_i2s; static struct clk *clk_i2s; +static int clk_ena = 0; static struct pxa2xx_pcm_dma_params pxa2xx_i2s_pcm_stereo_out = { .name = "I2S PCM Stereo out", @@ -101,7 +102,7 @@ static int pxa2xx_i2s_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; if (IS_ERR(clk_i2s)) return PTR_ERR(clk_i2s); @@ -162,13 +163,11 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; struct pxa2xx_pcm_dma_params *dma_data; BUG_ON(IS_ERR(clk_i2s)); clk_enable(clk_i2s); - dai->private_data = dai; + clk_ena = 1; pxa_i2s_wait(); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) @@ -176,7 +175,7 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream, else dma_data = &pxa2xx_i2s_pcm_stereo_in; - snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data); + snd_soc_dai_set_dma_data(dai, substream, dma_data); /* is port used by another stream */ if (!(SACR0 & SACR0_ENB)) { @@ -259,9 +258,9 @@ static void pxa2xx_i2s_shutdown(struct snd_pcm_substream *substream, if ((SACR1 & (SACR1_DREC | SACR1_DRPL)) == (SACR1_DREC | SACR1_DRPL)) { SACR0 &= ~SACR0_ENB; pxa_i2s_wait(); - if (dai->private_data != NULL) { + if (clk_ena) { clk_disable(clk_i2s); - dai->private_data = NULL; + clk_ena = 0; } } } @@ -300,6 +299,35 @@ static int pxa2xx_i2s_resume(struct snd_soc_dai *dai) #define pxa2xx_i2s_resume NULL #endif +static int pxa2xx_i2s_probe(struct snd_soc_dai *dai) +{ + clk_i2s = clk_get(dai->dev, "I2SCLK"); + if (IS_ERR(clk_i2s)) + return PTR_ERR(clk_i2s); + + /* + * PXA Developer's Manual: + * If SACR0[ENB] is toggled in the middle of a normal operation, + * the SACR0[RST] bit must also be set and cleared to reset all + * I2S controller registers. + */ + SACR0 = SACR0_RST; + SACR0 = 0; + /* Make sure RPL and REC are disabled */ + SACR1 = SACR1_DRPL | SACR1_DREC; + /* Along with FIFO servicing */ + SAIMR &= ~(SAIMR_RFS | SAIMR_TFS); + + return 0; +} + +static int pxa2xx_i2s_remove(struct snd_soc_dai *dai) +{ + clk_put(clk_i2s); + clk_i2s = ERR_PTR(-ENOENT); + return 0; +} + #define PXA2XX_I2S_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 | \ SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000) @@ -313,9 +341,9 @@ static struct snd_soc_dai_ops pxa_i2s_dai_ops = { .set_sysclk = pxa2xx_i2s_set_dai_sysclk, }; -struct snd_soc_dai pxa_i2s_dai = { - .name = "pxa2xx-i2s", - .id = 0, +static struct snd_soc_dai_driver pxa_i2s_dai = { + .probe = pxa2xx_i2s_probe, + .remove = pxa2xx_i2s_remove, .suspend = pxa2xx_i2s_suspend, .resume = pxa2xx_i2s_resume, .playback = { @@ -332,49 +360,20 @@ struct snd_soc_dai pxa_i2s_dai = { .symmetric_rates = 1, }; -EXPORT_SYMBOL_GPL(pxa_i2s_dai); - -static int pxa2xx_i2s_probe(struct platform_device *dev) +static int pxa2xx_i2s_drv_probe(struct platform_device *pdev) { - int ret; - - clk_i2s = clk_get(&dev->dev, "I2SCLK"); - if (IS_ERR(clk_i2s)) - return PTR_ERR(clk_i2s); - - pxa_i2s_dai.dev = &dev->dev; - pxa_i2s_dai.private_data = NULL; - ret = snd_soc_register_dai(&pxa_i2s_dai); - if (ret != 0) - clk_put(clk_i2s); - - /* - * PXA Developer's Manual: - * If SACR0[ENB] is toggled in the middle of a normal operation, - * the SACR0[RST] bit must also be set and cleared to reset all - * I2S controller registers. - */ - SACR0 = SACR0_RST; - SACR0 = 0; - /* Make sure RPL and REC are disabled */ - SACR1 = SACR1_DRPL | SACR1_DREC; - /* Along with FIFO servicing */ - SAIMR &= ~(SAIMR_RFS | SAIMR_TFS); - - return ret; + return snd_soc_register_dai(&pdev->dev, &pxa_i2s_dai); } -static int __devexit pxa2xx_i2s_remove(struct platform_device *dev) +static int __devexit pxa2xx_i2s_drv_remove(struct platform_device *pdev) { - snd_soc_unregister_dai(&pxa_i2s_dai); - clk_put(clk_i2s); - clk_i2s = ERR_PTR(-ENOENT); + snd_soc_unregister_dai(&pdev->dev); return 0; } static struct platform_driver pxa2xx_i2s_driver = { - .probe = pxa2xx_i2s_probe, - .remove = __devexit_p(pxa2xx_i2s_remove), + .probe = pxa2xx_i2s_drv_probe, + .remove = __devexit_p(pxa2xx_i2s_drv_remove), .driver = { .name = "pxa2xx-i2s", diff --git a/sound/soc/pxa/pxa2xx-i2s.h b/sound/soc/pxa/pxa2xx-i2s.h index e2def441153e..070f3c6059fe 100644 --- a/sound/soc/pxa/pxa2xx-i2s.h +++ b/sound/soc/pxa/pxa2xx-i2s.h @@ -15,6 +15,4 @@ /* I2S clock */ #define PXA2XX_I2S_SYSCLK 0 -extern struct snd_soc_dai pxa_i2s_dai; - #endif diff --git a/sound/soc/pxa/pxa2xx-pcm.c b/sound/soc/pxa/pxa2xx-pcm.c index adc7e6f15f93..5127044acfec 100644 --- a/sound/soc/pxa/pxa2xx-pcm.c +++ b/sound/soc/pxa/pxa2xx-pcm.c @@ -28,7 +28,7 @@ static int pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream, struct pxa2xx_pcm_dma_params *dma; int ret; - dma = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); + dma = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); /* return if this is a bufferless transfer e.g. * codec <--> BT codec or GSM modem -- lg FIXME */ @@ -95,14 +95,14 @@ static int pxa2xx_soc_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - if (dai->playback.channels_min) { + if (dai->driver->playback.channels_min) { ret = pxa2xx_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_PLAYBACK); if (ret) goto out; } - if (dai->capture.channels_min) { + if (dai->driver->capture.channels_min) { ret = pxa2xx_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_CAPTURE); if (ret) @@ -112,25 +112,44 @@ static int pxa2xx_soc_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, return ret; } -struct snd_soc_platform pxa2xx_soc_platform = { - .name = "pxa2xx-audio", - .pcm_ops = &pxa2xx_pcm_ops, +static struct snd_soc_platform_driver pxa2xx_soc_platform = { + .ops = &pxa2xx_pcm_ops, .pcm_new = pxa2xx_soc_pcm_new, .pcm_free = pxa2xx_pcm_free_dma_buffers, }; -EXPORT_SYMBOL_GPL(pxa2xx_soc_platform); -static int __init pxa2xx_soc_platform_init(void) +static int __devinit pxa2xx_soc_platform_probe(struct platform_device *pdev) { - return snd_soc_register_platform(&pxa2xx_soc_platform); + return snd_soc_register_platform(&pdev->dev, &pxa2xx_soc_platform); } -module_init(pxa2xx_soc_platform_init); -static void __exit pxa2xx_soc_platform_exit(void) +static int __devexit pxa2xx_soc_platform_remove(struct platform_device *pdev) { - snd_soc_unregister_platform(&pxa2xx_soc_platform); + snd_soc_unregister_platform(&pdev->dev); + return 0; +} + +static struct platform_driver pxa_pcm_driver = { + .driver = { + .name = "pxa-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = pxa2xx_soc_platform_probe, + .remove = __devexit_p(pxa2xx_soc_platform_remove), +}; + +static int __init snd_pxa_pcm_init(void) +{ + return platform_driver_register(&pxa_pcm_driver); +} +module_init(snd_pxa_pcm_init); + +static void __exit snd_pxa_pcm_exit(void) +{ + platform_driver_unregister(&pxa_pcm_driver); } -module_exit(pxa2xx_soc_platform_exit); +module_exit(snd_pxa_pcm_exit); MODULE_AUTHOR("Nicolas Pitre"); MODULE_DESCRIPTION("Intel PXA2xx PCM DMA module"); diff --git a/sound/soc/pxa/pxa2xx-pcm.h b/sound/soc/pxa/pxa2xx-pcm.h deleted file mode 100644 index 60c3b20aeeb4..000000000000 --- a/sound/soc/pxa/pxa2xx-pcm.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * linux/sound/arm/pxa2xx-pcm.h -- ALSA PCM interface for the Intel PXA2xx chip - * - * Author: Nicolas Pitre - * Created: Nov 30, 2004 - * Copyright: MontaVista Software, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef _PXA2XX_PCM_H -#define _PXA2XX_PCM_H - -/* platform data */ -extern struct snd_soc_platform pxa2xx_soc_platform; - -#endif diff --git a/sound/soc/pxa/raumfeld.c b/sound/soc/pxa/raumfeld.c index 7e3f41696c41..2cda82bc5d2e 100644 --- a/sound/soc/pxa/raumfeld.c +++ b/sound/soc/pxa/raumfeld.c @@ -26,9 +26,6 @@ #include -#include "../codecs/cs4270.h" -#include "../codecs/ak4104.h" -#include "pxa2xx-pcm.h" #include "pxa-ssp.h" #define GPIO_SPDIF_RESET (38) @@ -71,7 +68,7 @@ static void raumfeld_enable_audio(bool en) static int raumfeld_cs4270_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; /* set freq to 0 to enable all possible codec sample rates */ return snd_soc_dai_set_sysclk(codec_dai, 0, 0, 0); @@ -80,7 +77,7 @@ static int raumfeld_cs4270_startup(struct snd_pcm_substream *substream) static void raumfeld_cs4270_shutdown(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; /* set freq to 0 to enable all possible codec sample rates */ snd_soc_dai_set_sysclk(codec_dai, 0, 0, 0); @@ -90,8 +87,8 @@ static int raumfeld_cs4270_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; unsigned int fmt, clk = 0; int ret = 0; @@ -167,32 +164,14 @@ static int raumfeld_line_resume(struct platform_device *pdev) return 0; } -static struct snd_soc_dai_link raumfeld_line_dai = { - .name = "CS4270", - .stream_name = "CS4270", - .cpu_dai = &pxa_ssp_dai[PXA_DAI_SSP1], - .codec_dai = &cs4270_dai, - .ops = &raumfeld_cs4270_ops, -}; - -static struct snd_soc_card snd_soc_line_raumfeld = { - .name = "Raumfeld analog", - .platform = &pxa2xx_soc_platform, - .dai_link = &raumfeld_line_dai, - .suspend_post = raumfeld_line_suspend, - .resume_pre = raumfeld_line_resume, - .num_links = 1, -}; - - /* AK4104 */ static int raumfeld_ak4104_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int fmt, ret = 0, clk = 0; switch (params_rate(params)) { @@ -247,34 +226,35 @@ static struct snd_soc_ops raumfeld_ak4104_ops = { .hw_params = raumfeld_ak4104_hw_params, }; -static struct snd_soc_dai_link raumfeld_spdif_dai = { +static struct snd_soc_dai_link raumfeld_dai[] = { +{ .name = "ak4104", .stream_name = "Playback", - .cpu_dai = &pxa_ssp_dai[PXA_DAI_SSP2], - .codec_dai = &ak4104_dai, + .cpu_dai_name = "pxa-ssp-dai.1", + .codec_dai_name = "ak4104-hifi", + .platform_name = "pxa-pcm-audio", .ops = &raumfeld_ak4104_ops, -}; - -static struct snd_soc_card snd_soc_spdif_raumfeld = { - .name = "Raumfeld S/PDIF", - .platform = &pxa2xx_soc_platform, - .dai_link = &raumfeld_spdif_dai, - .num_links = 1 -}; - -/* raumfeld_audio audio subsystem */ -static struct snd_soc_device raumfeld_line_devdata = { - .card = &snd_soc_line_raumfeld, - .codec_dev = &soc_codec_device_cs4270, -}; + .codec_name = "ak4104-codec.0", +}, +{ + .name = "CS4270", + .stream_name = "CS4270", + .cpu_dai_name = "pxa-ssp-dai.0", + .platform_name = "pxa-pcm-audio", + .codec_dai_name = "cs4270-hifi", + .codec_name = "cs4270-codec.0-0048", + .ops = &raumfeld_cs4270_ops, +},}; -static struct snd_soc_device raumfeld_spdif_devdata = { - .card = &snd_soc_spdif_raumfeld, - .codec_dev = &soc_codec_device_ak4104, +static struct snd_soc_card snd_soc_raumfeld = { + .name = "Raumfeld", + .dai_link = raumfeld_dai, + .suspend_post = raumfeld_line_suspend, + .resume_pre = raumfeld_line_resume, + .num_links = ARRAY_SIZE(raumfeld_dai), }; -static struct platform_device *raumfeld_audio_line_device; -static struct platform_device *raumfeld_audio_spdif_device; +static struct platform_device *raumfeld_audio_device; static int __init raumfeld_audio_init(void) { @@ -292,38 +272,19 @@ static int __init raumfeld_audio_init(void) set_max9485_clk(MAX9485_MCLK_FREQ_122880); - /* LINE */ - raumfeld_audio_line_device = platform_device_alloc("soc-audio", 0); - if (!raumfeld_audio_line_device) + /* Register LINE and SPDIF */ + raumfeld_audio_device = platform_device_alloc("soc-audio", 0); + if (!raumfeld_audio_device) return -ENOMEM; - platform_set_drvdata(raumfeld_audio_line_device, - &raumfeld_line_devdata); - raumfeld_line_devdata.dev = &raumfeld_audio_line_device->dev; - ret = platform_device_add(raumfeld_audio_line_device); - if (ret) - platform_device_put(raumfeld_audio_line_device); + platform_set_drvdata(raumfeld_audio_device, + &snd_soc_raumfeld); + ret = platform_device_add(raumfeld_audio_device); /* no S/PDIF on Speakers */ if (machine_is_raumfeld_speaker()) return ret; - /* S/PDIF */ - raumfeld_audio_spdif_device = platform_device_alloc("soc-audio", 1); - if (!raumfeld_audio_spdif_device) { - platform_device_put(raumfeld_audio_line_device); - return -ENOMEM; - } - - platform_set_drvdata(raumfeld_audio_spdif_device, - &raumfeld_spdif_devdata); - raumfeld_spdif_devdata.dev = &raumfeld_audio_spdif_device->dev; - ret = platform_device_add(raumfeld_audio_spdif_device); - if (ret) { - platform_device_put(raumfeld_audio_line_device); - platform_device_put(raumfeld_audio_spdif_device); - } - raumfeld_enable_audio(true); return ret; @@ -333,10 +294,7 @@ static void __exit raumfeld_audio_exit(void) { raumfeld_enable_audio(false); - platform_device_unregister(raumfeld_audio_line_device); - - if (machine_is_raumfeld_connector()) - platform_device_unregister(raumfeld_audio_spdif_device); + platform_device_unregister(raumfeld_audio_device); i2c_unregister_device(max9486_client); diff --git a/sound/soc/pxa/spitz.c b/sound/soc/pxa/spitz.c index 1941a357e8c4..f470f360f4dd 100644 --- a/sound/soc/pxa/spitz.c +++ b/sound/soc/pxa/spitz.c @@ -28,7 +28,6 @@ #include #include #include "../codecs/wm8750.h" -#include "pxa2xx-pcm.h" #include "pxa2xx-i2s.h" #define SPITZ_HP 0 @@ -107,7 +106,7 @@ static void spitz_ext_control(struct snd_soc_codec *codec) static int spitz_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_codec *codec = rtd->socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; /* check the jack status at stream startup */ spitz_ext_control(codec); @@ -118,8 +117,8 @@ static int spitz_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; unsigned int clk = 0; int ret = 0; @@ -274,8 +273,9 @@ static const struct snd_kcontrol_new wm8750_spitz_controls[] = { /* * Logic for a wm8750 as connected on a Sharp SL-Cxx00 Device */ -static int spitz_wm8750_init(struct snd_soc_codec *codec) +static int spitz_wm8750_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int err; /* NC codec pins */ @@ -308,8 +308,10 @@ static int spitz_wm8750_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link spitz_dai = { .name = "wm8750", .stream_name = "WM8750", - .cpu_dai = &pxa_i2s_dai, - .codec_dai = &wm8750_dai, + .cpu_dai_name = "pxa-is2", + .codec_dai_name = "wm8750-hifi", + .platform_name = "pxa-pcm-audio", + .codec_name = "wm8750-codec.0-001a", .init = spitz_wm8750_init, .ops = &spitz_ops, }; @@ -317,49 +319,10 @@ static struct snd_soc_dai_link spitz_dai = { /* spitz audio machine driver */ static struct snd_soc_card snd_soc_spitz = { .name = "Spitz", - .platform = &pxa2xx_soc_platform, .dai_link = &spitz_dai, .num_links = 1, }; -/* spitz audio subsystem */ -static struct snd_soc_device spitz_snd_devdata = { - .card = &snd_soc_spitz, - .codec_dev = &soc_codec_dev_wm8750, -}; - -/* - * FIXME: This is a temporary bodge to avoid cross-tree merge issues. - * New drivers should register the wm8750 I2C device in the machine - * setup code (under arch/arm for ARM systems). - */ -static int wm8750_i2c_register(void) -{ - struct i2c_board_info info; - struct i2c_adapter *adapter; - struct i2c_client *client; - - memset(&info, 0, sizeof(struct i2c_board_info)); - info.addr = 0x1b; - strlcpy(info.type, "wm8750", I2C_NAME_SIZE); - - adapter = i2c_get_adapter(0); - if (!adapter) { - printk(KERN_ERR "can't get i2c adapter 0\n"); - return -ENODEV; - } - - client = i2c_new_device(adapter, &info); - i2c_put_adapter(adapter); - if (!client) { - printk(KERN_ERR "can't add i2c device at 0x%x\n", - (unsigned int)info.addr); - return -ENODEV; - } - - return 0; -} - static struct platform_device *spitz_snd_device; static int __init spitz_init(void) @@ -369,16 +332,11 @@ static int __init spitz_init(void) if (!(machine_is_spitz() || machine_is_borzoi() || machine_is_akita())) return -ENODEV; - ret = wm8750_i2c_setup(); - if (ret != 0) - return ret; - spitz_snd_device = platform_device_alloc("soc-audio", -1); if (!spitz_snd_device) return -ENOMEM; - platform_set_drvdata(spitz_snd_device, &spitz_snd_devdata); - spitz_snd_devdata.dev = &spitz_snd_device->dev; + platform_set_drvdata(spitz_snd_device, &snd_soc_spitz); ret = platform_device_add(spitz_snd_device); if (ret) diff --git a/sound/soc/pxa/tosa.c b/sound/soc/pxa/tosa.c index dbbd3e9d1637..a3bfb2e8b70f 100644 --- a/sound/soc/pxa/tosa.c +++ b/sound/soc/pxa/tosa.c @@ -33,7 +33,6 @@ #include #include "../codecs/wm9712.h" -#include "pxa2xx-pcm.h" #include "pxa2xx-ac97.h" static struct snd_soc_card tosa; @@ -80,7 +79,7 @@ static void tosa_ext_control(struct snd_soc_codec *codec) static int tosa_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_codec *codec = rtd->socdev->card->codec; + struct snd_soc_codec *codec = rtd->card->codec; /* check the jack status at stream startup */ tosa_ext_control(codec); @@ -184,8 +183,9 @@ static const struct snd_kcontrol_new tosa_controls[] = { tosa_set_spk), }; -static int tosa_ac97_init(struct snd_soc_codec *codec) +static int tosa_ac97_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int err; snd_soc_dapm_nc_pin(codec, "OUT3"); @@ -212,16 +212,20 @@ static struct snd_soc_dai_link tosa_dai[] = { { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI], - .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI], + .cpu_dai_name = "pxa-ac97.0", + .codec_dai_name = "wm9712-hifi", + .platform_name = "pxa-pcm-audio", + .codec_name = "wm9712-codec", .init = tosa_ac97_init, .ops = &tosa_ops, }, { .name = "AC97 Aux", .stream_name = "AC97 Aux", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX], - .codec_dai = &wm9712_dai[WM9712_DAI_AC97_AUX], + .cpu_dai_name = "pxa-ac97.1", + .codec_dai_name = "wm9712-aux", + .platform_name = "pxa-pcm-audio", + .codec_name = "wm9712-codec", .ops = &tosa_ops, }, }; @@ -248,18 +252,12 @@ static int tosa_remove(struct platform_device *dev) static struct snd_soc_card tosa = { .name = "Tosa", - .platform = &pxa2xx_soc_platform, .dai_link = tosa_dai, .num_links = ARRAY_SIZE(tosa_dai), .probe = tosa_probe, .remove = tosa_remove, }; -static struct snd_soc_device tosa_snd_devdata = { - .card = &tosa, - .codec_dev = &soc_codec_dev_wm9712, -}; - static struct platform_device *tosa_snd_device; static int __init tosa_init(void) @@ -275,8 +273,7 @@ static int __init tosa_init(void) goto err_alloc; } - platform_set_drvdata(tosa_snd_device, &tosa_snd_devdata); - tosa_snd_devdata.dev = &tosa_snd_device->dev; + platform_set_drvdata(tosa_snd_device, &tosa); ret = platform_device_add(tosa_snd_device); if (!ret) diff --git a/sound/soc/pxa/z2.c b/sound/soc/pxa/z2.c index 4e4d2fa8ddc5..704f74b56ab6 100644 --- a/sound/soc/pxa/z2.c +++ b/sound/soc/pxa/z2.c @@ -30,7 +30,6 @@ #include #include "../codecs/wm8750.h" -#include "pxa2xx-pcm.h" #include "pxa2xx-i2s.h" static struct snd_soc_card snd_soc_z2; @@ -39,8 +38,8 @@ static int z2_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; unsigned int clk = 0; int ret = 0; @@ -138,8 +137,9 @@ static const struct snd_soc_dapm_route audio_map[] = { /* * Logic for a wm8750 as connected on a Z2 Device */ -static int z2_wm8750_init(struct snd_soc_codec *codec) +static int z2_wm8750_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int ret; /* NC codec pins */ @@ -160,7 +160,7 @@ static int z2_wm8750_init(struct snd_soc_codec *codec) goto err; /* Jack detection API stuff */ - ret = snd_soc_jack_new(&snd_soc_z2, "Headset Jack", SND_JACK_HEADSET, + ret = snd_soc_jack_new(codec, "Headset Jack", SND_JACK_HEADSET, &hs_jack); if (ret) goto err; @@ -189,8 +189,10 @@ static struct snd_soc_ops z2_ops = { static struct snd_soc_dai_link z2_dai = { .name = "wm8750", .stream_name = "WM8750", - .cpu_dai = &pxa_i2s_dai, - .codec_dai = &wm8750_dai, + .cpu_dai_name = "pxa-i2s", + .codec_dai_name = "wm8750-hifi", + .platform_name = "pxa-pcm-audio", + .codec_name = "wm8750-codec.0-001a", .init = z2_wm8750_init, .ops = &z2_ops, }; @@ -198,17 +200,10 @@ static struct snd_soc_dai_link z2_dai = { /* z2 audio machine driver */ static struct snd_soc_card snd_soc_z2 = { .name = "Z2", - .platform = &pxa2xx_soc_platform, .dai_link = &z2_dai, .num_links = 1, }; -/* z2 audio subsystem */ -static struct snd_soc_device z2_snd_devdata = { - .card = &snd_soc_z2, - .codec_dev = &soc_codec_dev_wm8750, -}; - static struct platform_device *z2_snd_device; static int __init z2_init(void) @@ -222,8 +217,7 @@ static int __init z2_init(void) if (!z2_snd_device) return -ENOMEM; - platform_set_drvdata(z2_snd_device, &z2_snd_devdata); - z2_snd_devdata.dev = &z2_snd_device->dev; + platform_set_drvdata(z2_snd_device, &snd_soc_z2); ret = platform_device_add(z2_snd_device); if (ret) diff --git a/sound/soc/pxa/zylonite.c b/sound/soc/pxa/zylonite.c index dd678ae24398..d27e05af7759 100644 --- a/sound/soc/pxa/zylonite.c +++ b/sound/soc/pxa/zylonite.c @@ -23,7 +23,6 @@ #include #include "../codecs/wm9713.h" -#include "pxa2xx-pcm.h" #include "pxa2xx-ac97.h" #include "pxa-ssp.h" @@ -71,10 +70,12 @@ static const struct snd_soc_dapm_route audio_map[] = { { "Multiactor", NULL, "SPKR" }, }; -static int zylonite_wm9713_init(struct snd_soc_codec *codec) +static int zylonite_wm9713_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; + if (clk_pout) - snd_soc_dai_set_pll(&codec->dai[0], 0, 0, + snd_soc_dai_set_pll(rtd->codec_dai, 0, 0, clk_get_rate(pout), 0); snd_soc_dapm_new_controls(codec, zylonite_dapm_widgets, @@ -94,8 +95,8 @@ static int zylonite_voice_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; unsigned int pll_out = 0; unsigned int wm9713_div = 0; int ret = 0; @@ -163,21 +164,27 @@ static struct snd_soc_dai_link zylonite_dai[] = { { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI], - .codec_dai = &wm9713_dai[WM9713_DAI_AC97_HIFI], + .codec_name = "wm9713-codec", + .platform_name = "pxa-pcm-audio", + .cpu_dai_name = "pxa-ac97.0", + .codec_name = "wm9713-hifi", .init = zylonite_wm9713_init, }, { .name = "AC97 Aux", .stream_name = "AC97 Aux", - .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX], - .codec_dai = &wm9713_dai[WM9713_DAI_AC97_AUX], + .codec_name = "wm9713-codec", + .platform_name = "pxa-pcm-audio", + .cpu_dai_name = "pxa-ac97.1", + .codec_name = "wm9713-aux", }, { .name = "WM9713 Voice", .stream_name = "WM9713 Voice", - .cpu_dai = &pxa_ssp_dai[PXA_DAI_SSP3], - .codec_dai = &wm9713_dai[WM9713_DAI_PCM_VOICE], + .codec_name = "wm9713-codec", + .platform_name = "pxa-pcm-audio", + .cpu_dai_name = "pxa-ssp-dai.2", + .codec_name = "wm9713-voice", .ops = &zylonite_voice_ops, }, }; @@ -248,14 +255,9 @@ static struct snd_soc_card zylonite = { .remove = &zylonite_remove, .suspend_post = &zylonite_suspend_post, .resume_pre = &zylonite_resume_pre, - .platform = &pxa2xx_soc_platform, .dai_link = zylonite_dai, .num_links = ARRAY_SIZE(zylonite_dai), -}; - -static struct snd_soc_device zylonite_snd_ac97_devdata = { - .card = &zylonite, - .codec_dev = &soc_codec_dev_wm9713, + .owner = THIS_MODULE, }; static struct platform_device *zylonite_snd_ac97_device; @@ -268,9 +270,7 @@ static int __init zylonite_init(void) if (!zylonite_snd_ac97_device) return -ENOMEM; - platform_set_drvdata(zylonite_snd_ac97_device, - &zylonite_snd_ac97_devdata); - zylonite_snd_ac97_devdata.dev = &zylonite_snd_ac97_device->dev; + platform_set_drvdata(zylonite_snd_ac97_device, &zylonite); ret = platform_device_add(zylonite_snd_ac97_device); if (ret != 0) diff --git a/sound/soc/s3c24xx/jive_wm8750.c b/sound/soc/s3c24xx/jive_wm8750.c index 8c108b121c10..49605cd83947 100644 --- a/sound/soc/s3c24xx/jive_wm8750.c +++ b/sound/soc/s3c24xx/jive_wm8750.c @@ -49,8 +49,8 @@ static int jive_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct s3c_i2sv2_rate_calc div; unsigned int clk = 0; int ret = 0; @@ -108,8 +108,9 @@ static struct snd_soc_ops jive_ops = { .hw_params = jive_hw_params, }; -static int jive_wm8750_init(struct snd_soc_codec *codec) +static int jive_wm8750_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int err; /* These endpoints are not being used. */ @@ -138,8 +139,10 @@ static int jive_wm8750_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link jive_dai = { .name = "wm8750", .stream_name = "WM8750", - .cpu_dai = &s3c2412_i2s_dai, - .codec_dai = &wm8750_dai, + .cpu_dai_name = "s3c2412-i2s", + .codec_dai_name = "wm8750-hifi", + .platform_name = "s3c24xx-pcm-audio", + .codec_name = "wm8750-codec.0-0x1a", .init = jive_wm8750_init, .ops = &jive_ops, }; @@ -147,17 +150,10 @@ static struct snd_soc_dai_link jive_dai = { /* jive audio machine driver */ static struct snd_soc_card snd_soc_machine_jive = { .name = "Jive", - .platform = &s3c24xx_soc_platform, .dai_link = &jive_dai, .num_links = 1, }; -/* jive audio subsystem */ -static struct snd_soc_device jive_snd_devdata = { - .card = &snd_soc_machine_jive, - .codec_dev = &soc_codec_dev_wm8750, -}; - static struct platform_device *jive_snd_device; static int __init jive_init(void) @@ -173,8 +169,7 @@ static int __init jive_init(void) if (!jive_snd_device) return -ENOMEM; - platform_set_drvdata(jive_snd_device, &jive_snd_devdata); - jive_snd_devdata.dev = &jive_snd_device->dev; + platform_set_drvdata(jive_snd_device, &snd_soc_machine_jive); ret = platform_device_add(jive_snd_device); if (ret) diff --git a/sound/soc/s3c24xx/ln2440sbc_alc650.c b/sound/soc/s3c24xx/ln2440sbc_alc650.c index ffa954fe6931..abe64abe8c84 100644 --- a/sound/soc/s3c24xx/ln2440sbc_alc650.c +++ b/sound/soc/s3c24xx/ln2440sbc_alc650.c @@ -23,7 +23,6 @@ #include #include -#include "../codecs/ac97.h" #include "s3c-dma.h" #include "s3c-ac97.h" @@ -33,23 +32,19 @@ static struct snd_soc_dai_link ln2440sbc_dai[] = { { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai = &s3c_ac97_dai[S3C_AC97_DAI_PCM], - .codec_dai = &ac97_dai, + .cpu_dai_name = "s3c-ac97", + .codec_dai_name = "ac97-hifi", + .codec_name = "ac97-codec", + .platform_name = "s3c24xx-pcm-audio", }, }; static struct snd_soc_card ln2440sbc = { .name = "LN2440SBC", - .platform = &s3c24xx_soc_platform, .dai_link = ln2440sbc_dai, .num_links = ARRAY_SIZE(ln2440sbc_dai), }; -static struct snd_soc_device ln2440sbc_snd_ac97_devdata = { - .card = &ln2440sbc, - .codec_dev = &soc_codec_dev_ac97, -}; - static struct platform_device *ln2440sbc_snd_ac97_device; static int __init ln2440sbc_init(void) @@ -60,9 +55,7 @@ static int __init ln2440sbc_init(void) if (!ln2440sbc_snd_ac97_device) return -ENOMEM; - platform_set_drvdata(ln2440sbc_snd_ac97_device, - &ln2440sbc_snd_ac97_devdata); - ln2440sbc_snd_ac97_devdata.dev = &ln2440sbc_snd_ac97_device->dev; + platform_set_drvdata(ln2440sbc_snd_ac97_device, &ln2440sbc); ret = platform_device_add(ln2440sbc_snd_ac97_device); if (ret) diff --git a/sound/soc/s3c24xx/neo1973_gta02_wm8753.c b/sound/soc/s3c24xx/neo1973_gta02_wm8753.c index 209c25994c7e..c457bfd8297c 100644 --- a/sound/soc/s3c24xx/neo1973_gta02_wm8753.c +++ b/sound/soc/s3c24xx/neo1973_gta02_wm8753.c @@ -41,8 +41,8 @@ static int neo1973_gta02_hifi_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; unsigned int pll_out = 0, bclk = 0; int ret = 0; unsigned long iis_clkrate; @@ -130,7 +130,7 @@ static int neo1973_gta02_hifi_hw_params(struct snd_pcm_substream *substream, static int neo1973_gta02_hifi_hw_free(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; /* disable the PLL */ return snd_soc_dai_set_pll(codec_dai, WM8753_PLL1, 0, 0, 0); @@ -149,7 +149,7 @@ static int neo1973_gta02_voice_hw_params( struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; unsigned int pcmdiv = 0; int ret = 0; unsigned long iis_clkrate; @@ -194,7 +194,7 @@ static int neo1973_gta02_voice_hw_params( static int neo1973_gta02_voice_hw_free(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; /* disable the PLL */ return snd_soc_dai_set_pll(codec_dai, WM8753_PLL2, 0, 0, 0); @@ -262,7 +262,7 @@ static int lm4853_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { - gpio_set_value(GTA02_GPIO_AMP_SHUT, SND_SOC_DAPM_EVENT_OFF(value)); + gpio_set_value(GTA02_GPIO_AMP_SHUT, SND_SOC_DAPM_EVENT_OFF(event)); return 0; } @@ -330,8 +330,9 @@ static const struct snd_kcontrol_new wm8753_neo1973_gta02_controls[] = { * This is an example machine initialisation for a wm8753 connected to a * neo1973 GTA02. */ -static int neo1973_gta02_wm8753_init(struct snd_soc_codec *codec) +static int neo1973_gta02_wm8753_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int err; /* set up NC codec pins */ @@ -378,9 +379,8 @@ static int neo1973_gta02_wm8753_init(struct snd_soc_codec *codec) /* * BT Codec DAI */ -static struct snd_soc_dai bt_dai = { - .name = "Bluetooth", - .id = 0, +static struct snd_soc_dai_driver bt_dai = { + .name = "bluetooth-dai", .playback = { .channels_min = 1, .channels_max = 1, @@ -397,32 +397,30 @@ static struct snd_soc_dai_link neo1973_gta02_dai[] = { { /* Hifi Playback - for similatious use with voice below */ .name = "WM8753", .stream_name = "WM8753 HiFi", - .cpu_dai = &s3c24xx_i2s_dai, - .codec_dai = &wm8753_dai[WM8753_DAI_HIFI], + .cpu_dai_name = "s3c24xx-i2s", + .codec_dai_name = "wm8753-hifi", .init = neo1973_gta02_wm8753_init, + .platform_name = "s3c24xx-pcm-audio", + .codec_name = "wm8753-codec.0-0x1a", .ops = &neo1973_gta02_hifi_ops, }, { /* Voice via BT */ .name = "Bluetooth", .stream_name = "Voice", - .cpu_dai = &bt_dai, - .codec_dai = &wm8753_dai[WM8753_DAI_VOICE], + .cpu_dai_name = "bluetooth-dai", + .codec_dai_name = "wm8753-voice", .ops = &neo1973_gta02_voice_ops, + .codec_name = "wm8753-codec.0-0x1a", + .platform_name = "s3c24xx-pcm-audio", }, }; static struct snd_soc_card neo1973_gta02 = { .name = "neo1973-gta02", - .platform = &s3c24xx_soc_platform, .dai_link = neo1973_gta02_dai, .num_links = ARRAY_SIZE(neo1973_gta02_dai), }; -static struct snd_soc_device neo1973_gta02_snd_devdata = { - .card = &neo1973_gta02, - .codec_dev = &soc_codec_dev_wm8753, -}; - static struct platform_device *neo1973_gta02_snd_device; static int __init neo1973_gta02_init(void) @@ -435,18 +433,18 @@ static int __init neo1973_gta02_init(void) return -ENODEV; } - /* register bluetooth DAI here */ - ret = snd_soc_register_dai(&bt_dai); - if (ret) - return ret; - neo1973_gta02_snd_device = platform_device_alloc("soc-audio", -1); if (!neo1973_gta02_snd_device) return -ENOMEM; - platform_set_drvdata(neo1973_gta02_snd_device, - &neo1973_gta02_snd_devdata); - neo1973_gta02_snd_devdata.dev = &neo1973_gta02_snd_device->dev; + /* register bluetooth DAI here */ + ret = snd_soc_register_dai(&neo1973_gta02_snd_device->dev, -1, &bt_dai); + if (ret) { + platform_device_put(neo1973_gta02_snd_device); + return ret; + } + + platform_set_drvdata(neo1973_gta02_snd_device, &neo1973_gta02); ret = platform_device_add(neo1973_gta02_snd_device); if (ret) { @@ -461,7 +459,7 @@ static int __init neo1973_gta02_init(void) goto err_unregister_device; } - ret = gpio_direction_output(GTA02_GPIO_AMP_HP_IN, 1); + ret = gpio_direction_output(GTA02_GPIO_HP_IN, 1); if (ret) { pr_err("gta02_wm8753: Failed to configure GPIO %d\n", GTA02_GPIO_HP_IN); goto err_free_gpio_hp_in; @@ -493,7 +491,7 @@ module_init(neo1973_gta02_init); static void __exit neo1973_gta02_exit(void) { - snd_soc_unregister_dai(&bt_dai); + snd_soc_unregister_dai(&neo1973_gta02_snd_device->dev, -1); platform_device_unregister(neo1973_gta02_snd_device); gpio_free(GTA02_GPIO_HP_IN); gpio_free(GTA02_GPIO_AMP_SHUT); diff --git a/sound/soc/s3c24xx/neo1973_wm8753.c b/sound/soc/s3c24xx/neo1973_wm8753.c index 0cb4f86f6d1e..d7a39a0fe99b 100644 --- a/sound/soc/s3c24xx/neo1973_wm8753.c +++ b/sound/soc/s3c24xx/neo1973_wm8753.c @@ -57,8 +57,8 @@ static int neo1973_hifi_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; unsigned int pll_out = 0, bclk = 0; int ret = 0; unsigned long iis_clkrate; @@ -147,7 +147,7 @@ static int neo1973_hifi_hw_params(struct snd_pcm_substream *substream, static int neo1973_hifi_hw_free(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; pr_debug("Entered %s\n", __func__); @@ -167,7 +167,7 @@ static int neo1973_voice_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; unsigned int pcmdiv = 0; int ret = 0; unsigned long iis_clkrate; @@ -213,7 +213,7 @@ static int neo1973_voice_hw_params(struct snd_pcm_substream *substream, static int neo1973_voice_hw_free(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; pr_debug("Entered %s\n", __func__); @@ -499,8 +499,9 @@ static const struct snd_kcontrol_new wm8753_neo1973_controls[] = { * neo1973 II. It is missing logic to detect hp/mic insertions and logic * to re-route the audio in such an event. */ -static int neo1973_wm8753_init(struct snd_soc_codec *codec) +static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; int err; pr_debug("Entered %s\n", __func__); @@ -538,8 +539,7 @@ static int neo1973_wm8753_init(struct snd_soc_codec *codec) * BT Codec DAI */ static struct snd_soc_dai bt_dai = { - .name = "Bluetooth", - .id = 0, + .name = "bluetooth-dai", .playback = { .channels_min = 1, .channels_max = 1, @@ -556,32 +556,30 @@ static struct snd_soc_dai_link neo1973_dai[] = { { /* Hifi Playback - for similatious use with voice below */ .name = "WM8753", .stream_name = "WM8753 HiFi", - .cpu_dai = &s3c24xx_i2s_dai, - .codec_dai = &wm8753_dai[WM8753_DAI_HIFI], + .platform_name = "s3c24xx-pcm-audio", + .cpu_dai_name = "s3c24xx-i2s", + .codec_dai_name = "wm8753-hifi", + .codec_name = "wm8753-codec.0-0x1a", .init = neo1973_wm8753_init, .ops = &neo1973_hifi_ops, }, { /* Voice via BT */ .name = "Bluetooth", .stream_name = "Voice", - .cpu_dai = &bt_dai, - .codec_dai = &wm8753_dai[WM8753_DAI_VOICE], + .platform_name = "s3c24xx-pcm-audio", + .cpu_dai_name = "bluetooth-dai", + .codec_dai_name = "wm8753-voice", + .codec_name = "wm8753-codec.0-0x1a", .ops = &neo1973_voice_ops, }, }; static struct snd_soc_card neo1973 = { .name = "neo1973", - .platform = &s3c24xx_soc_platform, .dai_link = neo1973_dai, .num_links = ARRAY_SIZE(neo1973_dai), }; -static struct snd_soc_device neo1973_snd_devdata = { - .card = &neo1973, - .codec_dev = &soc_codec_dev_wm8753, -}; - static int lm4857_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -673,8 +671,7 @@ static int __init neo1973_init(void) if (!neo1973_snd_device) return -ENOMEM; - platform_set_drvdata(neo1973_snd_device, &neo1973_snd_devdata); - neo1973_snd_devdata.dev = &neo1973_snd_device->dev; + platform_set_drvdata(neo1973_snd_device, &neo1973); ret = platform_device_add(neo1973_snd_device); if (ret) { diff --git a/sound/soc/s3c24xx/s3c-ac97.c b/sound/soc/s3c24xx/s3c-ac97.c index 31f6d45b6384..86f4a9b4a869 100644 --- a/sound/soc/s3c24xx/s3c-ac97.c +++ b/sound/soc/s3c24xx/s3c-ac97.c @@ -222,7 +222,7 @@ static int s3c_ac97_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct s3c_dma_params *dma_data; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) @@ -241,7 +241,7 @@ static int s3c_ac97_trigger(struct snd_pcm_substream *substream, int cmd, u32 ac_glbctrl; struct snd_soc_pcm_runtime *rtd = substream->private_data; struct s3c_dma_params *dma_data = - snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); + snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL); if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) @@ -277,7 +277,7 @@ static int s3c_ac97_hw_mic_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) return -ENODEV; @@ -293,7 +293,7 @@ static int s3c_ac97_mic_trigger(struct snd_pcm_substream *substream, u32 ac_glbctrl; struct snd_soc_pcm_runtime *rtd = substream->private_data; struct s3c_dma_params *dma_data = - snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); + snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL); ac_glbctrl &= ~S3C_AC97_GLBCTRL_MICINTM_MASK; @@ -328,10 +328,9 @@ static struct snd_soc_dai_ops s3c_ac97_mic_dai_ops = { .trigger = s3c_ac97_mic_trigger, }; -struct snd_soc_dai s3c_ac97_dai[] = { +static struct snd_soc_dai_driver s3c_ac97_dai[] = { [S3C_AC97_DAI_PCM] = { .name = "s3c-ac97", - .id = S3C_AC97_DAI_PCM, .ac97_control = 1, .playback = { .stream_name = "AC97 Playback", @@ -349,7 +348,6 @@ struct snd_soc_dai s3c_ac97_dai[] = { }, [S3C_AC97_DAI_MIC] = { .name = "s3c-ac97-mic", - .id = S3C_AC97_DAI_MIC, .ac97_control = 1, .capture = { .stream_name = "AC97 Mic Capture", @@ -360,7 +358,6 @@ struct snd_soc_dai s3c_ac97_dai[] = { .ops = &s3c_ac97_mic_dai_ops, }, }; -EXPORT_SYMBOL_GPL(s3c_ac97_dai); static __devinit int s3c_ac97_probe(struct platform_device *pdev) { @@ -449,10 +446,8 @@ static __devinit int s3c_ac97_probe(struct platform_device *pdev) goto err4; } - s3c_ac97_dai[S3C_AC97_DAI_PCM].dev = &pdev->dev; - s3c_ac97_dai[S3C_AC97_DAI_MIC].dev = &pdev->dev; - - ret = snd_soc_register_dais(s3c_ac97_dai, ARRAY_SIZE(s3c_ac97_dai)); + ret = snd_soc_register_dais(&pdev->dev, s3c_ac97_dai, + ARRAY_SIZE(s3c_ac97_dai)); if (ret) goto err5; @@ -476,7 +471,7 @@ static __devexit int s3c_ac97_remove(struct platform_device *pdev) { struct resource *mem_res, *irq_res; - snd_soc_unregister_dais(s3c_ac97_dai, ARRAY_SIZE(s3c_ac97_dai)); + snd_soc_unregister_dais(&pdev->dev, ARRAY_SIZE(s3c_ac97_dai)); irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); if (irq_res) diff --git a/sound/soc/s3c24xx/s3c-ac97.h b/sound/soc/s3c24xx/s3c-ac97.h index 278198379def..5dcedd07fdbb 100644 --- a/sound/soc/s3c24xx/s3c-ac97.h +++ b/sound/soc/s3c24xx/s3c-ac97.h @@ -18,6 +18,4 @@ #define S3C_AC97_DAI_PCM 0 #define S3C_AC97_DAI_MIC 1 -extern struct snd_soc_dai s3c_ac97_dai[]; - #endif /* __S3C_AC97_H_ */ diff --git a/sound/soc/s3c24xx/s3c-dma.c b/sound/soc/s3c24xx/s3c-dma.c index 1b61c23ff300..9f91b2d51454 100644 --- a/sound/soc/s3c24xx/s3c-dma.c +++ b/sound/soc/s3c24xx/s3c-dma.c @@ -147,7 +147,7 @@ static int s3c_dma_hw_params(struct snd_pcm_substream *substream, struct snd_soc_pcm_runtime *rtd = substream->private_data; unsigned long totbytes = params_buffer_bytes(params); struct s3c_dma_params *dma = - snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); + snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); int ret = 0; @@ -441,14 +441,14 @@ static int s3c_dma_new(struct snd_card *card, if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = 0xffffffff; - if (dai->playback.channels_min) { + if (dai->driver->playback.channels_min) { ret = s3c_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_PLAYBACK); if (ret) goto out; } - if (dai->capture.channels_min) { + if (dai->driver->capture.channels_min) { ret = s3c_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_CAPTURE); if (ret) @@ -458,25 +458,44 @@ static int s3c_dma_new(struct snd_card *card, return ret; } -struct snd_soc_platform s3c24xx_soc_platform = { - .name = "s3c24xx-audio", - .pcm_ops = &s3c_dma_ops, +static struct snd_soc_platform_driver s3c24xx_soc_platform = { + .ops = &s3c_dma_ops, .pcm_new = s3c_dma_new, .pcm_free = s3c_dma_free_dma_buffers, }; -EXPORT_SYMBOL_GPL(s3c24xx_soc_platform); -static int __init s3c24xx_soc_platform_init(void) +static int __devinit s3c24xx_soc_platform_probe(struct platform_device *pdev) { - return snd_soc_register_platform(&s3c24xx_soc_platform); + return snd_soc_register_platform(&pdev->dev, &s3c24xx_soc_platform); } -module_init(s3c24xx_soc_platform_init); -static void __exit s3c24xx_soc_platform_exit(void) +static int __devexit s3c24xx_soc_platform_remove(struct platform_device *pdev) { - snd_soc_unregister_platform(&s3c24xx_soc_platform); + snd_soc_unregister_platform(&pdev->dev); + return 0; +} + +static struct platform_driver s3c24xx_pcm_driver = { + .driver = { + .name = "s3c24xx-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = s3c24xx_soc_platform_probe, + .remove = __devexit_p(s3c24xx_soc_platform_remove), +}; + +static int __init snd_s3c24xx_pcm_init(void) +{ + return platform_driver_register(&s3c24xx_pcm_driver); +} +module_init(snd_s3c24xx_pcm_init); + +static void __exit snd_s3c24xx_pcm_exit(void) +{ + platform_driver_unregister(&s3c24xx_pcm_driver); } -module_exit(s3c24xx_soc_platform_exit); +module_exit(snd_s3c24xx_pcm_exit); MODULE_AUTHOR("Ben Dooks, "); MODULE_DESCRIPTION("Samsung S3C Audio DMA module"); diff --git a/sound/soc/s3c24xx/s3c-dma.h b/sound/soc/s3c24xx/s3c-dma.h index 69bb6bf6fc1c..748c07d7c075 100644 --- a/sound/soc/s3c24xx/s3c-dma.h +++ b/sound/soc/s3c24xx/s3c-dma.h @@ -25,7 +25,6 @@ struct s3c_dma_params { #define S3C24XX_DAI_I2S 0 /* platform data */ -extern struct snd_soc_platform s3c24xx_soc_platform; extern struct snd_ac97_bus_ops s3c24xx_ac97_ops; #endif diff --git a/sound/soc/s3c24xx/s3c-i2s-v2.c b/sound/soc/s3c24xx/s3c-i2s-v2.c index 64376b2aac73..f4fbc0e61733 100644 --- a/sound/soc/s3c24xx/s3c-i2s-v2.c +++ b/sound/soc/s3c24xx/s3c-i2s-v2.c @@ -49,7 +49,7 @@ static inline struct s3c_i2sv2_info *to_info(struct snd_soc_dai *cpu_dai) { - return cpu_dai->private_data; + return snd_soc_dai_get_drvdata(cpu_dai); } #define bit_set(v, b) (((v) & (b)) ? 1 : 0) @@ -307,11 +307,9 @@ static int s3c2412_i2s_set_fmt(struct snd_soc_dai *cpu_dai, static int s3c_i2sv2_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, - struct snd_soc_dai *socdai) + struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai_link *dai = rtd->dai; - struct s3c_i2sv2_info *i2s = to_info(dai->cpu_dai); + struct s3c_i2sv2_info *i2s = to_info(dai); struct s3c_dma_params *dma_data; u32 iismod; @@ -322,7 +320,7 @@ static int s3c_i2sv2_hw_params(struct snd_pcm_substream *substream, else dma_data = i2s->dma_capture; - snd_soc_dai_set_dma_data(dai->cpu_dai, substream, dma_data); + snd_soc_dai_set_dma_data(dai, substream, dma_data); /* Working copies of register */ iismod = readl(i2s->regs + S3C2412_IISMOD); @@ -396,12 +394,12 @@ static int s3c2412_i2s_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct s3c_i2sv2_info *i2s = to_info(rtd->dai->cpu_dai); + struct s3c_i2sv2_info *i2s = to_info(rtd->cpu_dai); int capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE); unsigned long irqs; int ret = 0; struct s3c_dma_params *dma_data = - snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); + snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); pr_debug("Entered %s\n", __func__); @@ -640,36 +638,17 @@ int s3c_i2sv2_iis_calc_rate(struct s3c_i2sv2_rate_calc *info, } EXPORT_SYMBOL_GPL(s3c_i2sv2_iis_calc_rate); -int s3c_i2sv2_probe(struct platform_device *pdev, - struct snd_soc_dai *dai, +int s3c_i2sv2_probe(struct snd_soc_dai *dai, struct s3c_i2sv2_info *i2s, unsigned long base) { - struct device *dev = &pdev->dev; + struct device *dev = dai->dev; unsigned int iismod; i2s->dev = dev; /* record our i2s structure for later use in the callbacks */ - dai->private_data = i2s; - - if (!base) { - struct resource *res = platform_get_resource(pdev, - IORESOURCE_MEM, - 0); - if (!res) { - dev_err(dev, "Unable to get register resource\n"); - return -ENXIO; - } - - if (!request_mem_region(res->start, resource_size(res), - "s3c64xx-i2s-v4")) { - dev_err(dev, "Unable to request register region\n"); - return -EBUSY; - } - - base = res->start; - } + snd_soc_dai_set_drvdata(dai, i2s); i2s->regs = ioremap(base, 0x100); if (i2s->regs == NULL) { @@ -752,9 +731,10 @@ static int s3c2412_i2s_resume(struct snd_soc_dai *dai) #define s3c2412_i2s_resume NULL #endif -int s3c_i2sv2_register_dai(struct snd_soc_dai *dai) +int s3c_i2sv2_register_dai(struct device *dev, int id, + struct snd_soc_dai_driver *drv) { - struct snd_soc_dai_ops *ops = dai->ops; + struct snd_soc_dai_ops *ops = drv->ops; ops->trigger = s3c2412_i2s_trigger; if (!ops->hw_params) @@ -767,10 +747,10 @@ int s3c_i2sv2_register_dai(struct snd_soc_dai *dai) if (!ops->delay) ops->delay = s3c2412_i2s_delay; - dai->suspend = s3c2412_i2s_suspend; - dai->resume = s3c2412_i2s_resume; + drv->suspend = s3c2412_i2s_suspend; + drv->resume = s3c2412_i2s_resume; - return snd_soc_register_dai(dai); + return snd_soc_register_dai(dev, id, drv); } EXPORT_SYMBOL_GPL(s3c_i2sv2_register_dai); diff --git a/sound/soc/s3c24xx/s3c-i2s-v2.h b/sound/soc/s3c24xx/s3c-i2s-v2.h index 766f43a13d8b..d45830151484 100644 --- a/sound/soc/s3c24xx/s3c-i2s-v2.h +++ b/sound/soc/s3c24xx/s3c-i2s-v2.h @@ -66,6 +66,8 @@ struct s3c_i2sv2_info { u32 suspend_iismod; u32 suspend_iiscon; u32 suspend_iispsr; + + unsigned long base; }; extern struct clk *s3c_i2sv2_get_clock(struct snd_soc_dai *cpu_dai); @@ -81,23 +83,24 @@ extern int s3c_i2sv2_iis_calc_rate(struct s3c_i2sv2_rate_calc *info, /** * s3c_i2sv2_probe - probe for i2s device helper - * @pdev: The platform device supplied to the original probe. * @dai: The ASoC DAI structure supplied to the original probe. * @i2s: Our local i2s structure to fill in. * @base: The base address for the registers. */ -extern int s3c_i2sv2_probe(struct platform_device *pdev, - struct snd_soc_dai *dai, +extern int s3c_i2sv2_probe(struct snd_soc_dai *dai, struct s3c_i2sv2_info *i2s, unsigned long base); /** * s3c_i2sv2_register_dai - register dai with soc core - * @dai: The snd_soc_dai structure to register + * @dev: DAI device + * @id: DAI ID + * @drv: The driver structure to register * * Fill in any missing fields and then register the given dai with the * soc core. */ -extern int s3c_i2sv2_register_dai(struct snd_soc_dai *dai); +extern int s3c_i2sv2_register_dai(struct device *dev, int id, + struct snd_soc_dai_driver *drv); #endif /* __SND_SOC_S3C24XX_S3C_I2SV2_I2S_H */ diff --git a/sound/soc/s3c24xx/s3c-pcm.c b/sound/soc/s3c24xx/s3c-pcm.c index 326f0a9e7e30..653ffa270915 100644 --- a/sound/soc/s3c24xx/s3c-pcm.c +++ b/sound/soc/s3c24xx/s3c-pcm.c @@ -64,11 +64,6 @@ static struct s3c_dma_params s3c_pcm_stereo_in[] = { static struct s3c_pcm_info s3c_pcm[2]; -static inline struct s3c_pcm_info *to_info(struct snd_soc_dai *cpu_dai) -{ - return cpu_dai->private_data; -} - static void s3c_pcm_snd_txctrl(struct s3c_pcm_info *pcm, int on) { void __iomem *regs = pcm->regs; @@ -132,7 +127,7 @@ static int s3c_pcm_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct s3c_pcm_info *pcm = to_info(rtd->dai->cpu_dai); + struct s3c_pcm_info *pcm = snd_soc_dai_get_drvdata(rtd->cpu_dai); unsigned long flags; dev_dbg(pcm->dev, "Entered %s\n", __func__); @@ -176,8 +171,7 @@ static int s3c_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *socdai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai_link *dai = rtd->dai; - struct s3c_pcm_info *pcm = to_info(dai->cpu_dai); + struct s3c_pcm_info *pcm = snd_soc_dai_get_drvdata(rtd->cpu_dai); struct s3c_dma_params *dma_data; void __iomem *regs = pcm->regs; struct clk *clk; @@ -192,7 +186,7 @@ static int s3c_pcm_hw_params(struct snd_pcm_substream *substream, else dma_data = pcm->dma_capture; - snd_soc_dai_set_dma_data(dai->cpu_dai, substream, dma_data); + snd_soc_dai_set_dma_data(rtd->cpu_dai, substream, dma_data); /* Strictly check for sample size */ switch (params_format(params)) { @@ -242,7 +236,7 @@ static int s3c_pcm_hw_params(struct snd_pcm_substream *substream, static int s3c_pcm_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { - struct s3c_pcm_info *pcm = to_info(cpu_dai); + struct s3c_pcm_info *pcm = snd_soc_dai_get_drvdata(cpu_dai); void __iomem *regs = pcm->regs; unsigned long flags; int ret = 0; @@ -313,7 +307,7 @@ exit: static int s3c_pcm_set_clkdiv(struct snd_soc_dai *cpu_dai, int div_id, int div) { - struct s3c_pcm_info *pcm = to_info(cpu_dai); + struct s3c_pcm_info *pcm = snd_soc_dai_get_drvdata(cpu_dai); switch (div_id) { case S3C_PCM_SCLK_PER_FS: @@ -330,7 +324,7 @@ static int s3c_pcm_set_clkdiv(struct snd_soc_dai *cpu_dai, static int s3c_pcm_set_sysclk(struct snd_soc_dai *cpu_dai, int clk_id, unsigned int freq, int dir) { - struct s3c_pcm_info *pcm = to_info(cpu_dai); + struct s3c_pcm_info *pcm = snd_soc_dai_get_drvdata(cpu_dai); void __iomem *regs = pcm->regs; u32 clkctl = readl(regs + S3C_PCM_CLKCTL); @@ -366,10 +360,9 @@ static struct snd_soc_dai_ops s3c_pcm_dai_ops = { #define S3C_PCM_RATES SNDRV_PCM_RATE_8000_96000 -#define S3C_PCM_DECLARE(n) \ +#define S3C_PCM_DAI_DECLARE \ { \ - .name = "samsung-pcm", \ - .id = (n), \ + .name = "samsung-dai", \ .symmetric_rates = 1, \ .ops = &s3c_pcm_dai_ops, \ .playback = { \ @@ -386,16 +379,15 @@ static struct snd_soc_dai_ops s3c_pcm_dai_ops = { }, \ } -struct snd_soc_dai s3c_pcm_dai[] = { - S3C_PCM_DECLARE(0), - S3C_PCM_DECLARE(1), +struct snd_soc_dai_driver s3c_pcm_dai[] = { + S3C_PCM_DAI_DECLARE, + S3C_PCM_DAI_DECLARE, }; EXPORT_SYMBOL_GPL(s3c_pcm_dai); static __devinit int s3c_pcm_dev_probe(struct platform_device *pdev) { struct s3c_pcm_info *pcm; - struct snd_soc_dai *dai; struct resource *mem_res, *dmatx_res, *dmarx_res; struct s3c_audio_pdata *pcm_pdata; int ret; @@ -437,9 +429,6 @@ static __devinit int s3c_pcm_dev_probe(struct platform_device *pdev) spin_lock_init(&pcm->lock); - dai = &s3c_pcm_dai[pdev->id]; - dai->dev = &pdev->dev; - /* Default is 128fs */ pcm->sclk_per_fs = 128; @@ -452,7 +441,7 @@ static __devinit int s3c_pcm_dev_probe(struct platform_device *pdev) clk_enable(pcm->cclk); /* record our pcm structure for later use in the callbacks */ - dai->private_data = pcm; + dev_set_drvdata(&pdev->dev, pcm); if (!request_mem_region(mem_res->start, resource_size(mem_res), "samsung-pcm")) { @@ -476,7 +465,7 @@ static __devinit int s3c_pcm_dev_probe(struct platform_device *pdev) } clk_enable(pcm->pclk); - ret = snd_soc_register_dai(dai); + ret = snd_soc_register_dai(&pdev->dev, s3c_pcm_dai); if (ret != 0) { dev_err(&pdev->dev, "failed to get pcm_clock\n"); goto err5; @@ -514,6 +503,8 @@ static __devexit int s3c_pcm_dev_remove(struct platform_device *pdev) struct s3c_pcm_info *pcm = &s3c_pcm[pdev->id]; struct resource *mem_res; + snd_soc_unregister_dai(&pdev->dev); + iounmap(pcm->regs); mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -531,7 +522,7 @@ static struct platform_driver s3c_pcm_driver = { .probe = s3c_pcm_dev_probe, .remove = s3c_pcm_dev_remove, .driver = { - .name = "samsung-pcm", + .name = "samsung-pcm-audio", .owner = THIS_MODULE, }, }; diff --git a/sound/soc/s3c24xx/s3c2412-i2s.c b/sound/soc/s3c24xx/s3c2412-i2s.c index 709adef9d043..acd00962ac36 100644 --- a/sound/soc/s3c24xx/s3c2412-i2s.c +++ b/sound/soc/s3c24xx/s3c2412-i2s.c @@ -65,26 +65,20 @@ static struct s3c_dma_params s3c2412_i2s_pcm_stereo_in = { static struct s3c_i2sv2_info s3c2412_i2s; -static inline struct s3c_i2sv2_info *to_info(struct snd_soc_dai *cpu_dai) -{ - return cpu_dai->private_data; -} - -static int s3c2412_i2s_probe(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int s3c2412_i2s_probe(struct snd_soc_dai *dai) { int ret; pr_debug("Entered %s\n", __func__); - ret = s3c_i2sv2_probe(pdev, dai, &s3c2412_i2s, S3C2410_PA_IIS); + ret = s3c_i2sv2_probe(dai, &s3c2412_i2s, S3C2410_PA_IIS); if (ret) return ret; s3c2412_i2s.dma_capture = &s3c2412_i2s_pcm_stereo_in; s3c2412_i2s.dma_playback = &s3c2412_i2s_pcm_stereo_out; - s3c2412_i2s.iis_cclk = clk_get(&pdev->dev, "i2sclk"); + s3c2412_i2s.iis_cclk = clk_get(dai->dev, "i2sclk"); if (s3c2412_i2s.iis_cclk == NULL) { pr_err("failed to get i2sclk clock\n"); iounmap(s3c2412_i2s.regs); @@ -108,11 +102,20 @@ static int s3c2412_i2s_probe(struct platform_device *pdev, return 0; } +static int s3c2412_i2s_remove(struct snd_soc_dai *dai) +{ + clk_disable(s3c2412_i2s.iis_cclk); + clk_put(s3c2412_i2s.iis_cclk); + iounmap(s3c2412_i2s.regs); + + return 0; +} + static int s3c2412_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *cpu_dai) { - struct s3c_i2sv2_info *i2s = to_info(cpu_dai); + struct s3c_i2sv2_info *i2s = snd_soc_dai_get_drvdata(cpu_dai); struct s3c_dma_params *dma_data; u32 iismod; @@ -152,10 +155,9 @@ static struct snd_soc_dai_ops s3c2412_i2s_dai_ops = { .hw_params = s3c2412_i2s_hw_params, }; -struct snd_soc_dai s3c2412_i2s_dai = { - .name = "s3c2412-i2s", - .id = 0, +static struct snd_soc_dai_driver s3c2412_i2s_dai = { .probe = s3c2412_i2s_probe, + .remove = s3c2412_i2s_remove, .playback = { .channels_min = 2, .channels_max = 2, @@ -170,17 +172,36 @@ struct snd_soc_dai s3c2412_i2s_dai = { }, .ops = &s3c2412_i2s_dai_ops, }; -EXPORT_SYMBOL_GPL(s3c2412_i2s_dai); + +static __devinit int s3c2412_iis_dev_probe(struct platform_device *pdev) +{ + return snd_soc_register_dai(&pdev->dev, &s3c2412_i2s_dai); +} + +static __devexit int s3c2412_iis_dev_remove(struct platform_device *pdev) +{ + snd_soc_unregister_dai(&pdev->dev); + return 0; +} + +static struct platform_driver s3c2412_iis_driver = { + .probe = s3c2412_iis_dev_probe, + .remove = s3c2412_iis_dev_remove, + .driver = { + .name = "s3c2412-iis", + .owner = THIS_MODULE, + }, +}; static int __init s3c2412_i2s_init(void) { - return s3c_i2sv2_register_dai(&s3c2412_i2s_dai); + return platform_driver_register(&s3c2412_iis_driver); } module_init(s3c2412_i2s_init); static void __exit s3c2412_i2s_exit(void) { - snd_soc_unregister_dai(&s3c2412_i2s_dai); + platform_driver_unregister(&s3c2412_iis_driver); } module_exit(s3c2412_i2s_exit); diff --git a/sound/soc/s3c24xx/s3c2412-i2s.h b/sound/soc/s3c24xx/s3c2412-i2s.h index 0b5686b4d5c3..01a0471ac65c 100644 --- a/sound/soc/s3c24xx/s3c2412-i2s.h +++ b/sound/soc/s3c24xx/s3c2412-i2s.h @@ -24,6 +24,4 @@ #define S3C2412_CLKSRC_PCLK S3C_I2SV2_CLKSRC_PCLK #define S3C2412_CLKSRC_I2SCLK S3C_I2SV2_CLKSRC_AUDIOBUS -extern struct snd_soc_dai s3c2412_i2s_dai; - #endif /* __SND_SOC_S3C24XX_S3C2412_I2S_H */ diff --git a/sound/soc/s3c24xx/s3c24xx-i2s.c b/sound/soc/s3c24xx/s3c24xx-i2s.c index c3ac890a3986..1d0bade10d3d 100644 --- a/sound/soc/s3c24xx/s3c24xx-i2s.c +++ b/sound/soc/s3c24xx/s3c24xx-i2s.c @@ -252,7 +252,7 @@ static int s3c24xx_i2s_hw_params(struct snd_pcm_substream *substream, else dma_data = &s3c24xx_i2s_pcm_stereo_in; - snd_soc_dai_set_dma_data(rtd->dai->cpu_dai, substream, dma_data); + snd_soc_dai_set_dma_data(rtd->cpu_dai, substream, dma_data); /* Working copies of register */ iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD); @@ -280,9 +280,8 @@ static int s3c24xx_i2s_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { int ret = 0; - struct snd_soc_pcm_runtime *rtd = substream->private_data; struct s3c_dma_params *dma_data = - snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream); + snd_soc_dai_get_dma_data(dai, substream); pr_debug("Entered %s\n", __func__); @@ -387,8 +386,7 @@ u32 s3c24xx_i2s_get_clockrate(void) } EXPORT_SYMBOL_GPL(s3c24xx_i2s_get_clockrate); -static int s3c24xx_i2s_probe(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int s3c24xx_i2s_probe(struct snd_soc_dai *dai) { pr_debug("Entered %s\n", __func__); @@ -396,7 +394,7 @@ static int s3c24xx_i2s_probe(struct platform_device *pdev, if (s3c24xx_i2s.regs == NULL) return -ENXIO; - s3c24xx_i2s.iis_clk = clk_get(&pdev->dev, "iis"); + s3c24xx_i2s.iis_clk = clk_get(dai->dev, "iis"); if (s3c24xx_i2s.iis_clk == NULL) { pr_err("failed to get iis_clock\n"); iounmap(s3c24xx_i2s.regs); @@ -465,9 +463,7 @@ static struct snd_soc_dai_ops s3c24xx_i2s_dai_ops = { .set_sysclk = s3c24xx_i2s_set_sysclk, }; -struct snd_soc_dai s3c24xx_i2s_dai = { - .name = "s3c24xx-i2s", - .id = 0, +static struct snd_soc_dai_driver s3c24xx_i2s_dai = { .probe = s3c24xx_i2s_probe, .suspend = s3c24xx_i2s_suspend, .resume = s3c24xx_i2s_resume, @@ -483,17 +479,36 @@ struct snd_soc_dai s3c24xx_i2s_dai = { .formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,}, .ops = &s3c24xx_i2s_dai_ops, }; -EXPORT_SYMBOL_GPL(s3c24xx_i2s_dai); + +static __devinit int s3c24xx_iis_dev_probe(struct platform_device *pdev) +{ + return snd_soc_register_dai(&pdev->dev, &s3c24xx_i2s_dai); +} + +static __devexit int s3c24xx_iis_dev_remove(struct platform_device *pdev) +{ + snd_soc_unregister_dai(&pdev->dev); + return 0; +} + +static struct platform_driver s3c24xx_iis_driver = { + .probe = s3c24xx_iis_dev_probe, + .remove = s3c24xx_iis_dev_remove, + .driver = { + .name = "s3c24xx-iis", + .owner = THIS_MODULE, + }, +}; static int __init s3c24xx_i2s_init(void) { - return snd_soc_register_dai(&s3c24xx_i2s_dai); + return platform_driver_register(&s3c24xx_iis_driver); } module_init(s3c24xx_i2s_init); static void __exit s3c24xx_i2s_exit(void) { - snd_soc_unregister_dai(&s3c24xx_i2s_dai); + platform_driver_unregister(&s3c24xx_iis_driver); } module_exit(s3c24xx_i2s_exit); diff --git a/sound/soc/s3c24xx/s3c24xx-i2s.h b/sound/soc/s3c24xx/s3c24xx-i2s.h index 726d91cf4e1c..f9ca04edacb7 100644 --- a/sound/soc/s3c24xx/s3c24xx-i2s.h +++ b/sound/soc/s3c24xx/s3c24xx-i2s.h @@ -32,6 +32,4 @@ u32 s3c24xx_i2s_get_clockrate(void); -extern struct snd_soc_dai s3c24xx_i2s_dai; - #endif /*S3C24XXI2S_H_*/ diff --git a/sound/soc/s3c24xx/s3c24xx_simtec.c b/sound/soc/s3c24xx/s3c24xx_simtec.c index 4984754f3298..c4c111442010 100644 --- a/sound/soc/s3c24xx/s3c24xx_simtec.c +++ b/sound/soc/s3c24xx/s3c24xx_simtec.c @@ -139,8 +139,10 @@ static const struct snd_kcontrol_new amp_unmute_controls[] = { speaker_unmute_get, speaker_unmute_put), }; -void simtec_audio_init(struct snd_soc_codec *codec) +void simtec_audio_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; + if (pdata->amp_gpio > 0) { pr_debug("%s: adding amp routes\n", __func__); @@ -170,8 +172,8 @@ static int simtec_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret; /* Set the CODEC as the bus clock master, I2S */ @@ -319,12 +321,12 @@ EXPORT_SYMBOL_GPL(simtec_audio_pmops); #endif int __devinit simtec_audio_core_probe(struct platform_device *pdev, - struct snd_soc_device *socdev) + struct snd_soc_card *card) { struct platform_device *snd_dev; int ret; - socdev->card->dai_link->ops = &simtec_snd_ops; + card->dai_link->ops = &simtec_snd_ops; pdata = pdev->dev.platform_data; if (!pdata) { @@ -353,8 +355,7 @@ int __devinit simtec_audio_core_probe(struct platform_device *pdev, goto err_gpio; } - platform_set_drvdata(snd_dev, socdev); - socdev->dev = &snd_dev->dev; + platform_set_drvdata(snd_dev, card); ret = platform_device_add(snd_dev); if (ret) { diff --git a/sound/soc/s3c24xx/s3c24xx_simtec.h b/sound/soc/s3c24xx/s3c24xx_simtec.h index e18faee30cce..e63d5ff9c41f 100644 --- a/sound/soc/s3c24xx/s3c24xx_simtec.h +++ b/sound/soc/s3c24xx/s3c24xx_simtec.h @@ -7,10 +7,10 @@ * published by the Free Software Foundation. */ -extern void simtec_audio_init(struct snd_soc_codec *codec); +extern void simtec_audio_init(struct snd_soc_pcm_runtime *rtd); extern int simtec_audio_core_probe(struct platform_device *pdev, - struct snd_soc_device *socdev); + struct snd_soc_card *card); extern int simtec_audio_remove(struct platform_device *pdev); diff --git a/sound/soc/s3c24xx/s3c24xx_simtec_hermes.c b/sound/soc/s3c24xx/s3c24xx_simtec_hermes.c index bdf8951af8e3..f88453735ae2 100644 --- a/sound/soc/s3c24xx/s3c24xx_simtec_hermes.c +++ b/sound/soc/s3c24xx/s3c24xx_simtec_hermes.c @@ -73,8 +73,10 @@ static const struct snd_soc_dapm_route base_map[] = { * Attach our controls and configure the necessary codec * mappings for our sound card instance. */ -static int simtec_hermes_init(struct snd_soc_codec *codec) +static int simtec_hermes_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; + snd_soc_dapm_new_controls(codec, dapm_widgets, ARRAY_SIZE(dapm_widgets)); @@ -85,42 +87,33 @@ static int simtec_hermes_init(struct snd_soc_codec *codec) snd_soc_dapm_enable_pin(codec, "Line Out"); snd_soc_dapm_enable_pin(codec, "Mic Jack"); - simtec_audio_init(codec); + simtec_audio_init(rtd); snd_soc_dapm_sync(codec); return 0; } -static struct aic3x_setup_data codec_setup = { -}; - static struct snd_soc_dai_link simtec_dai_aic33 = { .name = "tlv320aic33", .stream_name = "TLV320AIC33", - .cpu_dai = &s3c24xx_i2s_dai, - .codec_dai = &aic3x_dai, + .codec_name = "tlv320aic3x-codec.0-0x1a", + .cpu_dai_name = "s3c24xx-i2s", + .codec_dai_name = "tlv320aic3x-hifi", + .platform_name = "s3c24xx-pcm-audio", .init = simtec_hermes_init, }; /* simtec audio machine driver */ static struct snd_soc_card snd_soc_machine_simtec_aic33 = { .name = "Simtec-Hermes", - .platform = &s3c24xx_soc_platform, .dai_link = &simtec_dai_aic33, .num_links = 1, }; -/* simtec audio subsystem */ -static struct snd_soc_device simtec_snd_devdata_aic33 = { - .card = &snd_soc_machine_simtec_aic33, - .codec_dev = &soc_codec_dev_aic3x, - .codec_data = &codec_setup, -}; - static int __devinit simtec_audio_hermes_probe(struct platform_device *pd) { dev_info(&pd->dev, "probing....\n"); - return simtec_audio_core_probe(pd, &simtec_snd_devdata_aic33); + return simtec_audio_core_probe(pd, &snd_soc_machine_simtec_aic33); } static struct platform_driver simtec_audio_hermes_platdrv = { diff --git a/sound/soc/s3c24xx/s3c24xx_simtec_tlv320aic23.c b/sound/soc/s3c24xx/s3c24xx_simtec_tlv320aic23.c index 185c0acb5ce6..c0967593510d 100644 --- a/sound/soc/s3c24xx/s3c24xx_simtec_tlv320aic23.c +++ b/sound/soc/s3c24xx/s3c24xx_simtec_tlv320aic23.c @@ -62,8 +62,10 @@ static const struct snd_soc_dapm_route base_map[] = { * Attach our controls and configure the necessary codec * mappings for our sound card instance. */ -static int simtec_tlv320aic23_init(struct snd_soc_codec *codec) +static int simtec_tlv320aic23_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; + snd_soc_dapm_new_controls(codec, dapm_widgets, ARRAY_SIZE(dapm_widgets)); @@ -74,7 +76,7 @@ static int simtec_tlv320aic23_init(struct snd_soc_codec *codec) snd_soc_dapm_enable_pin(codec, "Line Out"); snd_soc_dapm_enable_pin(codec, "Mic Jack"); - simtec_audio_init(codec); + simtec_audio_init(rtd); snd_soc_dapm_sync(codec); return 0; @@ -83,28 +85,23 @@ static int simtec_tlv320aic23_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link simtec_dai_aic23 = { .name = "tlv320aic23", .stream_name = "TLV320AIC23", - .cpu_dai = &s3c24xx_i2s_dai, - .codec_dai = &tlv320aic23_dai, + .codec_name = "tlv320aic3x-codec.0-0x1a", + .cpu_dai_name = "s3c24xx-i2s", + .codec_dai_name = "tlv320aic3x-hifi", + .platform_name = "s3c24xx-pcm-audio", .init = simtec_tlv320aic23_init, }; /* simtec audio machine driver */ static struct snd_soc_card snd_soc_machine_simtec_aic23 = { .name = "Simtec", - .platform = &s3c24xx_soc_platform, .dai_link = &simtec_dai_aic23, .num_links = 1, }; -/* simtec audio subsystem */ -static struct snd_soc_device simtec_snd_devdata_aic23 = { - .card = &snd_soc_machine_simtec_aic23, - .codec_dev = &soc_codec_dev_tlv320aic23, -}; - static int __devinit simtec_audio_tlv320aic23_probe(struct platform_device *pd) { - return simtec_audio_core_probe(pd, &simtec_snd_devdata_aic23); + return simtec_audio_core_probe(pd, &snd_soc_machine_simtec_aic23); } static struct platform_driver simtec_audio_tlv320aic23_platdrv = { diff --git a/sound/soc/s3c24xx/s3c24xx_uda134x.c b/sound/soc/s3c24xx/s3c24xx_uda134x.c index 052d59659c29..bd48ffbde880 100644 --- a/sound/soc/s3c24xx/s3c24xx_uda134x.c +++ b/sound/soc/s3c24xx/s3c24xx_uda134x.c @@ -133,8 +133,8 @@ static int s3c24xx_uda134x_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; unsigned int clk = 0; int ret = 0; int clk_source, fs_mode; @@ -227,14 +227,15 @@ static struct snd_soc_ops s3c24xx_uda134x_ops = { static struct snd_soc_dai_link s3c24xx_uda134x_dai_link = { .name = "UDA134X", .stream_name = "UDA134X", - .codec_dai = &uda134x_dai, - .cpu_dai = &s3c24xx_i2s_dai, + .codec_name = "uda134x-hifi", + .codec_dai_name = "uda134x-hifi", + .cpu_dai_name = "s3c24xx-i2s", .ops = &s3c24xx_uda134x_ops, + .platform_name = "s3c24xx-pcm-audio", }; static struct snd_soc_card snd_soc_s3c24xx_uda134x = { .name = "S3C24XX_UDA134X", - .platform = &s3c24xx_soc_platform, .dai_link = &s3c24xx_uda134x_dai_link, .num_links = 1, }; @@ -256,6 +257,7 @@ static void setmode(int v) gpio_set_value(s3c24xx_uda134x_l3_pins->l3_mode, v > 0); } +/* FIXME - This must be codec platform data but in which board file ?? */ static struct uda134x_platform_data s3c24xx_uda134x = { .l3 = { .setdat = setdat, @@ -270,12 +272,6 @@ static struct uda134x_platform_data s3c24xx_uda134x = { }, }; -static struct snd_soc_device s3c24xx_uda134x_snd_devdata = { - .card = &snd_soc_s3c24xx_uda134x, - .codec_dev = &soc_codec_dev_uda134x, - .codec_data = &s3c24xx_uda134x, -}; - static int s3c24xx_uda134x_setup_pin(int pin, char *fun) { if (gpio_request(pin, "s3c24xx_uda134x") < 0) { @@ -325,8 +321,7 @@ static int s3c24xx_uda134x_probe(struct platform_device *pdev) } platform_set_drvdata(s3c24xx_uda134x_snd_device, - &s3c24xx_uda134x_snd_devdata); - s3c24xx_uda134x_snd_devdata.dev = &s3c24xx_uda134x_snd_device->dev; + &snd_soc_s3c24xx_uda134x); ret = platform_device_add(s3c24xx_uda134x_snd_device); if (ret) { printk(KERN_ERR "S3C24XX_UDA134X SoC Audio: Unable to add\n"); diff --git a/sound/soc/s3c24xx/s3c64xx-i2s-v4.c b/sound/soc/s3c24xx/s3c64xx-i2s-v4.c index 06db130030a1..7cab4fcf1f12 100644 --- a/sound/soc/s3c24xx/s3c64xx-i2s-v4.c +++ b/sound/soc/s3c24xx/s3c64xx-i2s-v4.c @@ -16,9 +16,7 @@ #include #include -#include -#include -#include +#include #include #include @@ -39,34 +37,23 @@ static struct s3c_dma_params s3c64xx_i2sv4_pcm_stereo_out; static struct s3c_dma_params s3c64xx_i2sv4_pcm_stereo_in; static struct s3c_i2sv2_info s3c64xx_i2sv4; -struct snd_soc_dai s3c64xx_i2s_v4_dai; -EXPORT_SYMBOL_GPL(s3c64xx_i2s_v4_dai); - -static inline struct s3c_i2sv2_info *to_info(struct snd_soc_dai *cpu_dai) +static int s3c64xx_i2sv4_probe(struct snd_soc_dai *dai) { - return cpu_dai->private_data; -} + struct s3c_i2sv2_info *i2s = &s3c64xx_i2sv4; + int ret = 0; -static int s3c64xx_i2sv4_probe(struct platform_device *pdev, - struct snd_soc_dai *dai) -{ - /* configure GPIO for i2s port */ - s3c_gpio_cfgpin(S3C64XX_GPC(4), S3C64XX_GPC4_I2S_V40_DO0); - s3c_gpio_cfgpin(S3C64XX_GPC(5), S3C64XX_GPC5_I2S_V40_DO1); - s3c_gpio_cfgpin(S3C64XX_GPC(7), S3C64XX_GPC7_I2S_V40_DO2); - s3c_gpio_cfgpin(S3C64XX_GPH(6), S3C64XX_GPH6_I2S_V40_BCLK); - s3c_gpio_cfgpin(S3C64XX_GPH(7), S3C64XX_GPH7_I2S_V40_CDCLK); - s3c_gpio_cfgpin(S3C64XX_GPH(8), S3C64XX_GPH8_I2S_V40_LRCLK); - s3c_gpio_cfgpin(S3C64XX_GPH(9), S3C64XX_GPH9_I2S_V40_DI); + snd_soc_dai_set_drvdata(dai, i2s); - return 0; + ret = s3c_i2sv2_probe(dai, i2s, i2s->base); + + return ret; } static int s3c_i2sv4_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *cpu_dai) { - struct s3c_i2sv2_info *i2s = to_info(cpu_dai); + struct s3c_i2sv2_info *i2s = snd_soc_dai_get_drvdata(cpu_dai); struct s3c_dma_params *dma_data; u32 iismod; @@ -104,51 +91,79 @@ static struct snd_soc_dai_ops s3c64xx_i2sv4_dai_ops = { .hw_params = s3c_i2sv4_hw_params, }; +static struct snd_soc_dai_driver s3c64xx_i2s_v4_dai = { + .symmetric_rates = 1, + .playback = { + .channels_min = 2, + .channels_max = 2, + .rates = S3C64XX_I2S_RATES, + .formats = S3C64XX_I2S_FMTS, + }, + .capture = { + .channels_min = 2, + .channels_max = 2, + .rates = S3C64XX_I2S_RATES, + .formats = S3C64XX_I2S_FMTS, + }, + .probe = s3c64xx_i2sv4_probe, + .ops = &s3c64xx_i2sv4_dai_ops, +}; + static __devinit int s3c64xx_i2sv4_dev_probe(struct platform_device *pdev) { + struct s3c_audio_pdata *i2s_pdata; struct s3c_i2sv2_info *i2s; - struct snd_soc_dai *dai; + struct resource *res; int ret; i2s = &s3c64xx_i2sv4; - dai = &s3c64xx_i2s_v4_dai; - - if (dai->dev) { - dev_dbg(dai->dev, "%s: \ - I2Sv4 instance already registered!\n", __func__); - return -EBUSY; - } - - dai->dev = &pdev->dev; - dai->name = "s3c64xx-i2s-v4"; - dai->id = 0; - dai->symmetric_rates = 1; - dai->playback.channels_min = 2; - dai->playback.channels_max = 2; - dai->playback.rates = S3C64XX_I2S_RATES; - dai->playback.formats = S3C64XX_I2S_FMTS; - dai->capture.channels_min = 2; - dai->capture.channels_max = 2; - dai->capture.rates = S3C64XX_I2S_RATES; - dai->capture.formats = S3C64XX_I2S_FMTS; - dai->probe = s3c64xx_i2sv4_probe; - dai->ops = &s3c64xx_i2sv4_dai_ops; i2s->feature |= S3C_FEATURE_CDCLKCON; i2s->dma_capture = &s3c64xx_i2sv4_pcm_stereo_in; i2s->dma_playback = &s3c64xx_i2sv4_pcm_stereo_out; - i2s->dma_capture->channel = DMACH_HSI_I2SV40_RX; - i2s->dma_capture->dma_addr = S3C64XX_PA_IISV4 + S3C2412_IISRXD; - i2s->dma_playback->channel = DMACH_HSI_I2SV40_TX; - i2s->dma_playback->dma_addr = S3C64XX_PA_IISV4 + S3C2412_IISTXD; + res = platform_get_resource(pdev, IORESOURCE_DMA, 0); + if (!res) { + dev_err(&pdev->dev, "Unable to get I2S-TX dma resource\n"); + return -ENXIO; + } + i2s->dma_playback->channel = res->start; + + res = platform_get_resource(pdev, IORESOURCE_DMA, 1); + if (!res) { + dev_err(&pdev->dev, "Unable to get I2S-RX dma resource\n"); + return -ENXIO; + } + i2s->dma_capture->channel = res->start; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "Unable to get I2S SFR address\n"); + return -ENXIO; + } + + if (!request_mem_region(res->start, resource_size(res), + "s3c64xx-i2s-v4")) { + dev_err(&pdev->dev, "Unable to request SFR region\n"); + return -EBUSY; + } + i2s->dma_capture->dma_addr = res->start + S3C2412_IISRXD; + i2s->dma_playback->dma_addr = res->start + S3C2412_IISTXD; i2s->dma_capture->client = &s3c64xx_dma_client_in; i2s->dma_capture->dma_size = 4; i2s->dma_playback->client = &s3c64xx_dma_client_out; i2s->dma_playback->dma_size = 4; + i2s->base = res->start; + + i2s_pdata = pdev->dev.platform_data; + if (i2s_pdata && i2s_pdata->cfg_gpio && i2s_pdata->cfg_gpio(pdev)) { + dev_err(&pdev->dev, "Unable to configure gpio\n"); + return -EINVAL; + } + i2s->iis_cclk = clk_get(&pdev->dev, "audio-bus"); if (IS_ERR(i2s->iis_cclk)) { dev_err(&pdev->dev, "failed to get audio-bus\n"); @@ -158,19 +173,13 @@ static __devinit int s3c64xx_i2sv4_dev_probe(struct platform_device *pdev) clk_enable(i2s->iis_cclk); - ret = s3c_i2sv2_probe(pdev, dai, i2s, 0); - if (ret) - goto err_clk; - - ret = s3c_i2sv2_register_dai(dai); + ret = s3c_i2sv2_register_dai(&pdev->dev, pdev->id, &s3c64xx_i2s_v4_dai); if (ret != 0) goto err_i2sv2; return 0; err_i2sv2: - /* Not implemented for I2Sv2 core yet */ -err_clk: clk_put(i2s->iis_cclk); err: return ret; @@ -178,7 +187,7 @@ err: static __devexit int s3c64xx_i2sv4_dev_remove(struct platform_device *pdev) { - dev_err(&pdev->dev, "Device removal not yet supported\n"); + snd_soc_unregister_dai(&pdev->dev); return 0; } diff --git a/sound/soc/s3c24xx/s3c64xx-i2s.c b/sound/soc/s3c24xx/s3c64xx-i2s.c index 1d85cb85a7d2..a1d0b2566416 100644 --- a/sound/soc/s3c24xx/s3c64xx-i2s.c +++ b/sound/soc/s3c24xx/s3c64xx-i2s.c @@ -12,15 +12,15 @@ * published by the Free Software Foundation. */ +#include #include #include #include +#include #include -#include -#include -#include +#include #include #include @@ -46,45 +46,107 @@ static struct s3c_dma_params s3c64xx_i2s_pcm_stereo_out[MAX_I2SV3]; static struct s3c_dma_params s3c64xx_i2s_pcm_stereo_in[MAX_I2SV3]; static struct s3c_i2sv2_info s3c64xx_i2s[MAX_I2SV3]; -struct snd_soc_dai s3c64xx_i2s_dai[MAX_I2SV3]; -EXPORT_SYMBOL_GPL(s3c64xx_i2s_dai); - -static inline struct s3c_i2sv2_info *to_info(struct snd_soc_dai *cpu_dai) +struct clk *s3c64xx_i2s_get_clock(struct snd_soc_dai *dai) { - return cpu_dai->private_data; + struct s3c_i2sv2_info *i2s = snd_soc_dai_get_drvdata(dai); + u32 iismod = readl(i2s->regs + S3C2412_IISMOD); + + if (iismod & S3C2412_IISMOD_IMS_SYSMUX) + return i2s->iis_cclk; + else + return i2s->iis_pclk; } +EXPORT_SYMBOL_GPL(s3c64xx_i2s_get_clock); -static int s3c64xx_i2s_probe(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int s3c64xx_i2s_probe(struct snd_soc_dai *dai) { - /* configure GPIO for i2s port */ - switch (dai->id) { - case 0: - s3c_gpio_cfgpin(S3C64XX_GPD(0), S3C64XX_GPD0_I2S0_CLK); - s3c_gpio_cfgpin(S3C64XX_GPD(1), S3C64XX_GPD1_I2S0_CDCLK); - s3c_gpio_cfgpin(S3C64XX_GPD(2), S3C64XX_GPD2_I2S0_LRCLK); - s3c_gpio_cfgpin(S3C64XX_GPD(3), S3C64XX_GPD3_I2S0_DI); - s3c_gpio_cfgpin(S3C64XX_GPD(4), S3C64XX_GPD4_I2S0_D0); - break; - case 1: - s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C64XX_GPE0_I2S1_CLK); - s3c_gpio_cfgpin(S3C64XX_GPE(1), S3C64XX_GPE1_I2S1_CDCLK); - s3c_gpio_cfgpin(S3C64XX_GPE(2), S3C64XX_GPE2_I2S1_LRCLK); - s3c_gpio_cfgpin(S3C64XX_GPE(3), S3C64XX_GPE3_I2S1_DI); - s3c_gpio_cfgpin(S3C64XX_GPE(4), S3C64XX_GPE4_I2S1_D0); + struct s3c_i2sv2_info *i2s; + int ret; + + if (dai->id >= MAX_I2SV3) { + dev_err(dai->dev, "id %d out of range\n", dai->id); + return -EINVAL; + } + + i2s = &s3c64xx_i2s[dai->id]; + snd_soc_dai_set_drvdata(dai, i2s); + + i2s->iis_cclk = clk_get(dai->dev, "audio-bus"); + if (IS_ERR(i2s->iis_cclk)) { + dev_err(dai->dev, "failed to get audio-bus\n"); + ret = PTR_ERR(i2s->iis_cclk); + goto err; } + clk_enable(i2s->iis_cclk); + + ret = s3c_i2sv2_probe(dai, i2s, i2s->base); + if (ret) + goto err_clk; + return 0; + +err_clk: + clk_disable(i2s->iis_cclk); + clk_put(i2s->iis_cclk); +err: + kfree(i2s); + return ret; } +static int s3c64xx_i2s_remove(struct snd_soc_dai *dai) +{ + struct s3c_i2sv2_info *i2s = snd_soc_dai_get_drvdata(dai); + + clk_disable(i2s->iis_cclk); + clk_put(i2s->iis_cclk); + kfree(i2s); + return 0; +} static struct snd_soc_dai_ops s3c64xx_i2s_dai_ops; +static struct snd_soc_dai_driver s3c64xx_i2s_dai[MAX_I2SV3] = { +{ + .name = "s3c64xx-i2s-0", + .probe = s3c64xx_i2s_probe, + .remove = s3c64xx_i2s_remove, + .playback = { + .channels_min = 2, + .channels_max = 2, + .rates = S3C64XX_I2S_RATES, + .formats = S3C64XX_I2S_FMTS,}, + .capture = { + .channels_min = 2, + .channels_max = 2, + .rates = S3C64XX_I2S_RATES, + .formats = S3C64XX_I2S_FMTS,}, + .ops = &s3c64xx_i2s_dai_ops, + .symmetric_rates = 1, +}, { + .name = "s3c64xx-i2s-1", + .probe = s3c64xx_i2s_probe, + .remove = s3c64xx_i2s_remove, + .playback = { + .channels_min = 2, + .channels_max = 2, + .rates = S3C64XX_I2S_RATES, + .formats = S3C64XX_I2S_FMTS,}, + .capture = { + .channels_min = 2, + .channels_max = 2, + .rates = S3C64XX_I2S_RATES, + .formats = S3C64XX_I2S_FMTS,}, + .ops = &s3c64xx_i2s_dai_ops, + .symmetric_rates = 1, +},}; + static __devinit int s3c64xx_iis_dev_probe(struct platform_device *pdev) { + struct s3c_audio_pdata *i2s_pdata; struct s3c_i2sv2_info *i2s; - struct snd_soc_dai *dai; - int ret; + struct resource *res; + int i, ret; if (pdev->id >= MAX_I2SV3) { dev_err(&pdev->dev, "id %d out of range\n", pdev->id); @@ -92,74 +154,63 @@ static __devinit int s3c64xx_iis_dev_probe(struct platform_device *pdev) } i2s = &s3c64xx_i2s[pdev->id]; - dai = &s3c64xx_i2s_dai[pdev->id]; - dai->dev = &pdev->dev; - dai->name = "s3c64xx-i2s"; - dai->id = pdev->id; - dai->symmetric_rates = 1; - dai->playback.channels_min = 2; - dai->playback.channels_max = 2; - dai->playback.rates = S3C64XX_I2S_RATES; - dai->playback.formats = S3C64XX_I2S_FMTS; - dai->capture.channels_min = 2; - dai->capture.channels_max = 2; - dai->capture.rates = S3C64XX_I2S_RATES; - dai->capture.formats = S3C64XX_I2S_FMTS; - dai->probe = s3c64xx_i2s_probe; - dai->ops = &s3c64xx_i2s_dai_ops; - - i2s->feature |= S3C_FEATURE_CDCLKCON; i2s->dma_capture = &s3c64xx_i2s_pcm_stereo_in[pdev->id]; i2s->dma_playback = &s3c64xx_i2s_pcm_stereo_out[pdev->id]; - if (pdev->id == 0) { - i2s->dma_capture->channel = DMACH_I2S0_IN; - i2s->dma_capture->dma_addr = S3C64XX_PA_IIS0 + S3C2412_IISRXD; - i2s->dma_playback->channel = DMACH_I2S0_OUT; - i2s->dma_playback->dma_addr = S3C64XX_PA_IIS0 + S3C2412_IISTXD; - } else { - i2s->dma_capture->channel = DMACH_I2S1_IN; - i2s->dma_capture->dma_addr = S3C64XX_PA_IIS1 + S3C2412_IISRXD; - i2s->dma_playback->channel = DMACH_I2S1_OUT; - i2s->dma_playback->dma_addr = S3C64XX_PA_IIS1 + S3C2412_IISTXD; + res = platform_get_resource(pdev, IORESOURCE_DMA, 0); + if (!res) { + dev_err(&pdev->dev, "Unable to get I2S-TX dma resource\n"); + return -ENXIO; + } + i2s->dma_playback->channel = res->start; + + res = platform_get_resource(pdev, IORESOURCE_DMA, 1); + if (!res) { + dev_err(&pdev->dev, "Unable to get I2S-RX dma resource\n"); + return -ENXIO; + } + i2s->dma_capture->channel = res->start; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "Unable to get I2S SFR address\n"); + return -ENXIO; } + if (!request_mem_region(res->start, resource_size(res), + "s3c64xx-i2s")) { + dev_err(&pdev->dev, "Unable to request SFR region\n"); + return -EBUSY; + } + i2s->base = res->start; + + i2s_pdata = pdev->dev.platform_data; + if (i2s_pdata && i2s_pdata->cfg_gpio && i2s_pdata->cfg_gpio(pdev)) { + dev_err(&pdev->dev, "Unable to configure gpio\n"); + return -EINVAL; + } + i2s->dma_capture->dma_addr = res->start + S3C2412_IISRXD; + i2s->dma_playback->dma_addr = res->start + S3C2412_IISTXD; + i2s->dma_capture->client = &s3c64xx_dma_client_in; i2s->dma_capture->dma_size = 4; i2s->dma_playback->client = &s3c64xx_dma_client_out; i2s->dma_playback->dma_size = 4; - i2s->iis_cclk = clk_get(&pdev->dev, "audio-bus"); - if (IS_ERR(i2s->iis_cclk)) { - dev_err(&pdev->dev, "failed to get audio-bus\n"); - ret = PTR_ERR(i2s->iis_cclk); - goto err; + for (i = 0; i < ARRAY_SIZE(s3c64xx_i2s_dai); i++) { + ret = s3c_i2sv2_register_dai(&pdev->dev, i, + &s3c64xx_i2s_dai[i]); + if (ret != 0) + return ret; } - clk_enable(i2s->iis_cclk); - - ret = s3c_i2sv2_probe(pdev, dai, i2s, 0); - if (ret) - goto err_clk; - - ret = s3c_i2sv2_register_dai(dai); - if (ret != 0) - goto err_i2sv2; - return 0; - -err_i2sv2: - /* Not implemented for I2Sv2 core yet */ -err_clk: - clk_put(i2s->iis_cclk); -err: - return ret; } static __devexit int s3c64xx_iis_dev_remove(struct platform_device *pdev) { - dev_err(&pdev->dev, "Device removal not yet supported\n"); + snd_soc_unregister_dais(&pdev->dev, ARRAY_SIZE(s3c64xx_i2s_dai)); return 0; } diff --git a/sound/soc/s3c24xx/s3c64xx-i2s.h b/sound/soc/s3c24xx/s3c64xx-i2s.h index 7a40f43d1d51..19bd444bf8a6 100644 --- a/sound/soc/s3c24xx/s3c64xx-i2s.h +++ b/sound/soc/s3c24xx/s3c64xx-i2s.h @@ -36,7 +36,5 @@ struct clk; (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |\ SNDRV_PCM_FMTBIT_S24_LE) -extern struct snd_soc_dai s3c64xx_i2s_dai[]; -extern struct snd_soc_dai s3c64xx_i2s_v4_dai; #endif /* __SND_SOC_S3C24XX_S3C64XX_I2S_H */ diff --git a/sound/soc/s3c24xx/smartq_wm8987.c b/sound/soc/s3c24xx/smartq_wm8987.c index b480348140b0..dd20ca7f4681 100644 --- a/sound/soc/s3c24xx/smartq_wm8987.c +++ b/sound/soc/s3c24xx/smartq_wm8987.c @@ -211,8 +211,10 @@ static struct snd_soc_dai_link smartq_dai[] = { { .name = "wm8987", .stream_name = "SmartQ Hi-Fi", - .cpu_dai = &s3c64xx_i2s_dai[0], - .codec_dai = &wm8750_dai, + .cpu_dai_name = "s3c64xx-i2s.0", + .codec_dai_name = "wm8750-hifi", + .platform_name = "s3c24xx-pcm-audio", + .codec_name = "wm8750-codec.0-0x1a", .init = smartq_wm8987_init, .ops = &smartq_hifi_ops, }, @@ -220,16 +222,10 @@ static struct snd_soc_dai_link smartq_dai[] = { static struct snd_soc_card snd_soc_smartq = { .name = "SmartQ", - .platform = &s3c24xx_soc_platform, .dai_link = smartq_dai, .num_links = ARRAY_SIZE(smartq_dai), }; -static struct snd_soc_device smartq_snd_devdata = { - .card = &snd_soc_smartq, - .codec_dev = &soc_codec_dev_wm8750, -}; - static struct platform_device *smartq_snd_device; static int __init smartq_init(void) @@ -245,8 +241,7 @@ static int __init smartq_init(void) if (!smartq_snd_device) return -ENOMEM; - platform_set_drvdata(smartq_snd_device, &smartq_snd_devdata); - smartq_snd_devdata.dev = &smartq_snd_device->dev; + platform_set_drvdata(smartq_snd_device, &snd_soc_smartq); ret = platform_device_add(smartq_snd_device); if (ret) { diff --git a/sound/soc/s3c24xx/smdk2443_wm9710.c b/sound/soc/s3c24xx/smdk2443_wm9710.c index 362258835e8d..66f9e222220b 100644 --- a/sound/soc/s3c24xx/smdk2443_wm9710.c +++ b/sound/soc/s3c24xx/smdk2443_wm9710.c @@ -19,7 +19,6 @@ #include #include -#include "../codecs/ac97.h" #include "s3c-dma.h" #include "s3c-ac97.h" @@ -29,23 +28,19 @@ static struct snd_soc_dai_link smdk2443_dai[] = { { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai = &s3c_ac97_dai[S3C_AC97_DAI_PCM], - .codec_dai = &ac97_dai, + .cpu_dai_name = "s3c-ac97-dai", + .codec_dai_name = "ac97-hifi", + .codec_name = "ac97-codec", + .platform_name = "s3c24xx-pcm-audio", }, }; static struct snd_soc_card smdk2443 = { .name = "SMDK2443", - .platform = &s3c24xx_soc_platform, .dai_link = smdk2443_dai, .num_links = ARRAY_SIZE(smdk2443_dai), }; -static struct snd_soc_device smdk2443_snd_ac97_devdata = { - .card = &smdk2443, - .codec_dev = &soc_codec_dev_ac97, -}; - static struct platform_device *smdk2443_snd_ac97_device; static int __init smdk2443_init(void) @@ -56,9 +51,7 @@ static int __init smdk2443_init(void) if (!smdk2443_snd_ac97_device) return -ENOMEM; - platform_set_drvdata(smdk2443_snd_ac97_device, - &smdk2443_snd_ac97_devdata); - smdk2443_snd_ac97_devdata.dev = &smdk2443_snd_ac97_device->dev; + platform_set_drvdata(smdk2443_snd_ac97_device, &smdk2443); ret = platform_device_add(smdk2443_snd_ac97_device); if (ret) diff --git a/sound/soc/s3c24xx/smdk64xx_wm8580.c b/sound/soc/s3c24xx/smdk64xx_wm8580.c index 07e8e51d10d6..634acfc41608 100644 --- a/sound/soc/s3c24xx/smdk64xx_wm8580.c +++ b/sound/soc/s3c24xx/smdk64xx_wm8580.c @@ -29,8 +29,8 @@ static int smdk64xx_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; unsigned int pll_out; int bfs, rfs, ret; @@ -174,8 +174,10 @@ static const struct snd_soc_dapm_route audio_map_rx[] = { {"Rear-L/R", NULL, "VOUT3R"}, }; -static int smdk64xx_wm8580_init_paiftx(struct snd_soc_codec *codec) +static int smdk64xx_wm8580_init_paiftx(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; + /* Add smdk64xx specific Capture widgets */ snd_soc_dapm_new_controls(codec, wm8580_dapm_widgets_cpt, ARRAY_SIZE(wm8580_dapm_widgets_cpt)); @@ -194,8 +196,10 @@ static int smdk64xx_wm8580_init_paiftx(struct snd_soc_codec *codec) return 0; } -static int smdk64xx_wm8580_init_paifrx(struct snd_soc_codec *codec) +static int smdk64xx_wm8580_init_paifrx(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; + /* Add smdk64xx specific Playback widgets */ snd_soc_dapm_new_controls(codec, wm8580_dapm_widgets_pbk, ARRAY_SIZE(wm8580_dapm_widgets_pbk)); @@ -213,16 +217,20 @@ static struct snd_soc_dai_link smdk64xx_dai[] = { { /* Primary Playback i/f */ .name = "WM8580 PAIF RX", .stream_name = "Playback", - .cpu_dai = &s3c64xx_i2s_v4_dai, - .codec_dai = &wm8580_dai[WM8580_DAI_PAIFRX], + .cpu_dai_name = "s3c64xx-iis-v4", + .codec_dai_name = "wm8580-hifi-playback", + .platform_name = "s3c24xx-pcm-audio", + .codec_name = "wm8580-codec.0-001b", .init = smdk64xx_wm8580_init_paifrx, .ops = &smdk64xx_ops, }, { /* Primary Capture i/f */ .name = "WM8580 PAIF TX", .stream_name = "Capture", - .cpu_dai = &s3c64xx_i2s_v4_dai, - .codec_dai = &wm8580_dai[WM8580_DAI_PAIFTX], + .cpu_dai_name = "s3c64xx-iis-v4", + .codec_dai_name = "wm8580-hifi-capture", + .platform_name = "s3c24xx-pcm-audio", + .codec_name = "wm8580-codec.0-001b", .init = smdk64xx_wm8580_init_paiftx, .ops = &smdk64xx_ops, }, @@ -230,16 +238,10 @@ static struct snd_soc_dai_link smdk64xx_dai[] = { static struct snd_soc_card smdk64xx = { .name = "smdk64xx", - .platform = &s3c24xx_soc_platform, .dai_link = smdk64xx_dai, .num_links = ARRAY_SIZE(smdk64xx_dai), }; -static struct snd_soc_device smdk64xx_snd_devdata = { - .card = &smdk64xx, - .codec_dev = &soc_codec_dev_wm8580, -}; - static struct platform_device *smdk64xx_snd_device; static int __init smdk64xx_audio_init(void) @@ -250,8 +252,7 @@ static int __init smdk64xx_audio_init(void) if (!smdk64xx_snd_device) return -ENOMEM; - platform_set_drvdata(smdk64xx_snd_device, &smdk64xx_snd_devdata); - smdk64xx_snd_devdata.dev = &smdk64xx_snd_device->dev; + platform_set_drvdata(smdk64xx_snd_device, &smdk64xx); ret = platform_device_add(smdk64xx_snd_device); if (ret) diff --git a/sound/soc/s3c24xx/smdk_wm9713.c b/sound/soc/s3c24xx/smdk_wm9713.c index 5527b9e88c98..90108a7a0a8e 100644 --- a/sound/soc/s3c24xx/smdk_wm9713.c +++ b/sound/soc/s3c24xx/smdk_wm9713.c @@ -46,40 +46,50 @@ static struct snd_soc_card smdk; static struct snd_soc_dai_link smdk_dai = { .name = "AC97", .stream_name = "AC97 PCM", - .cpu_dai = &s3c_ac97_dai[S3C_AC97_DAI_PCM], - .codec_dai = &wm9713_dai[WM9713_DAI_AC97_HIFI], + .platform_name = "s3c24xx-pcm-audio", + .cpu_dai_name = "s3c-ac97-dai", + .codec_dai_name = "wm9713-hifi", + .codec_name = "wm9713-codec", }; static struct snd_soc_card smdk = { .name = "SMDK", - .platform = &s3c24xx_soc_platform, .dai_link = &smdk_dai, .num_links = 1, }; -static struct snd_soc_device smdk_snd_ac97_devdata = { - .card = &smdk, - .codec_dev = &soc_codec_dev_wm9713, -}; - +static struct platform_device *smdk_snd_wm9713_device; static struct platform_device *smdk_snd_ac97_device; static int __init smdk_init(void) { int ret; - smdk_snd_ac97_device = platform_device_alloc("soc-audio", -1); - if (!smdk_snd_ac97_device) + smdk_snd_wm9713_device = platform_device_alloc("wm9713-codec", -1); + if (!smdk_snd_wm9713_device) return -ENOMEM; - platform_set_drvdata(smdk_snd_ac97_device, - &smdk_snd_ac97_devdata); - smdk_snd_ac97_devdata.dev = &smdk_snd_ac97_device->dev; + ret = platform_device_add(smdk_snd_wm9713_device); + if (ret) + goto err; + + smdk_snd_ac97_device = platform_device_alloc("soc-audio", -1); + if (!smdk_snd_ac97_device) { + ret = -ENOMEM; + goto err; + } + + platform_set_drvdata(smdk_snd_ac97_device, &smdk); ret = platform_device_add(smdk_snd_ac97_device); - if (ret) + if (ret) { platform_device_put(smdk_snd_ac97_device); + goto err; + } + return 0; +err: + platform_device_put(smdk_snd_wm9713_device); return ret; } diff --git a/sound/soc/s6000/s6000-i2s.c b/sound/soc/s6000/s6000-i2s.c index 59e3fa7bcb05..8778faa174a6 100644 --- a/sound/soc/s6000/s6000-i2s.c +++ b/sound/soc/s6000/s6000-i2s.c @@ -140,7 +140,7 @@ static void s6000_i2s_stop_channel(struct s6000_i2s_dev *dev, int channel) static void s6000_i2s_start(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct s6000_i2s_dev *dev = rtd->dai->cpu_dai->private_data; + struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(rtd->cpu_dai); int channel; channel = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? @@ -152,7 +152,7 @@ static void s6000_i2s_start(struct snd_pcm_substream *substream) static void s6000_i2s_stop(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct s6000_i2s_dev *dev = rtd->dai->cpu_dai->private_data; + struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(rtd->cpu_dai); int channel; channel = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? @@ -194,7 +194,7 @@ static unsigned int s6000_i2s_int_sources(struct s6000_i2s_dev *dev) static unsigned int s6000_i2s_check_xrun(struct snd_soc_dai *cpu_dai) { - struct s6000_i2s_dev *dev = cpu_dai->private_data; + struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(cpu_dai); unsigned int errors; unsigned int ret; @@ -232,7 +232,7 @@ static void s6000_i2s_wait_disabled(struct s6000_i2s_dev *dev) static int s6000_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { - struct s6000_i2s_dev *dev = cpu_dai->private_data; + struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(cpu_dai); u32 w; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -273,7 +273,7 @@ static int s6000_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, static int s6000_i2s_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div) { - struct s6000_i2s_dev *dev = dai->private_data; + struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(dai); if (!div || (div & 1) || div > (S6_I2S_DIV_MASK + 1) * 2) return -EINVAL; @@ -287,7 +287,7 @@ static int s6000_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct s6000_i2s_dev *dev = dai->private_data; + struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(dai); int interf; u32 w = 0; @@ -326,15 +326,17 @@ static int s6000_i2s_hw_params(struct snd_pcm_substream *substream, return 0; } -static int s6000_i2s_dai_probe(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int s6000_i2s_dai_probe(struct snd_soc_dai *dai) { - struct s6000_i2s_dev *dev = dai->private_data; - struct s6000_snd_platform_data *pdata = pdev->dev.platform_data; + struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(dai); + struct s6000_snd_platform_data *pdata = dai->dev->platform_data; if (!pdata) return -EINVAL; + dai->capture_dma_data = &dev->dma_params; + dai->playback_dma_data = &dev->dma_params; + dev->wide = pdata->wide; dev->channel_in = pdata->channel_in; dev->channel_out = pdata->channel_out; @@ -352,10 +354,10 @@ static int s6000_i2s_dai_probe(struct platform_device *pdev, dev->channel_in = 0; dev->channel_out = 1; - dai->capture.channels_min = 2 * dev->lines_in; - dai->capture.channels_max = dai->capture.channels_min; - dai->playback.channels_min = 2 * dev->lines_out; - dai->playback.channels_max = dai->playback.channels_min; + dai->driver->capture.channels_min = 2 * dev->lines_in; + dai->driver->capture.channels_max = dai->driver->capture.channels_min; + dai->driver->playback.channels_min = 2 * dev->lines_out; + dai->driver->playback.channels_max = dai->driver->playback.channels_min; for (i = 0; i < dev->lines_out; i++) s6_i2s_write_reg(dev, S6_I2S_DATA_CFG(i), S6_I2S_OUT); @@ -372,10 +374,10 @@ static int s6000_i2s_dai_probe(struct platform_device *pdev, if (dev->lines_in > 1 || dev->lines_out > 1) return -EINVAL; - dai->capture.channels_min = 2 * dev->lines_in; - dai->capture.channels_max = 8 * dev->lines_in; - dai->playback.channels_min = 2 * dev->lines_out; - dai->playback.channels_max = 8 * dev->lines_out; + dai->driver->capture.channels_min = 2 * dev->lines_in; + dai->driver->capture.channels_max = 8 * dev->lines_in; + dai->driver->playback.channels_min = 2 * dev->lines_out; + dai->driver->playback.channels_max = 8 * dev->lines_out; if (dev->lines_in) cfg[dev->channel_in] = S6_I2S_IN; @@ -413,9 +415,7 @@ static struct snd_soc_dai_ops s6000_i2s_dai_ops = { .hw_params = s6000_i2s_hw_params, }; -struct snd_soc_dai s6000_i2s_dai = { - .name = "s6000-i2s", - .id = 0, +static struct snd_soc_dai_driver s6000_i2s_dai = { .probe = s6000_i2s_dai_probe, .playback = { .channels_min = 2, @@ -435,7 +435,6 @@ struct snd_soc_dai s6000_i2s_dai = { }, .ops = &s6000_i2s_dai_ops, } -EXPORT_SYMBOL_GPL(s6000_i2s_dai); static int __devinit s6000_i2s_probe(struct platform_device *pdev) { @@ -513,11 +512,7 @@ static int __devinit s6000_i2s_probe(struct platform_device *pdev) ret = -ENOMEM; goto err_release_dma2; } - - s6000_i2s_dai.dev = &pdev->dev; - s6000_i2s_dai.private_data = dev; - s6000_i2s_dai.capture.dma_data = &dev->dma_params; - s6000_i2s_dai.playback.dma_data = &dev->dma_params; + dev_set_drvdata(&pdev->dev, dev); dev->sifbase = sifmem->start; dev->scbbase = mmio; @@ -548,7 +543,7 @@ static int __devinit s6000_i2s_probe(struct platform_device *pdev) S6_I2S_INT_UNDERRUN | S6_I2S_INT_OVERRUN); - ret = snd_soc_register_dai(&s6000_i2s_dai); + ret = snd_soc_register_dai(&pdev->dev, &s6000_i2s_dai); if (ret) goto err_release_dev; @@ -573,17 +568,16 @@ err_release_none: static void __devexit s6000_i2s_remove(struct platform_device *pdev) { - struct s6000_i2s_dev *dev = s6000_i2s_dai.private_data; + struct s6000_i2s_dev *dev = dev_get_drvdata(&pdev->dev); struct resource *region; void __iomem *mmio = dev->scbbase; - snd_soc_unregister_dai(&s6000_i2s_dai); + snd_soc_unregister_dai(&pdev->dev); s6000_i2s_stop_channel(dev, 0); s6000_i2s_stop_channel(dev, 1); s6_i2s_write_reg(dev, S6_I2S_INTERRUPT_ENABLE, 0); - s6000_i2s_dai.private_data = 0; kfree(dev); region = platform_get_resource(pdev, IORESOURCE_DMA, 0); diff --git a/sound/soc/s6000/s6000-i2s.h b/sound/soc/s6000/s6000-i2s.h index 2375fdfe6dba..86aa1921c89e 100644 --- a/sound/soc/s6000/s6000-i2s.h +++ b/sound/soc/s6000/s6000-i2s.h @@ -12,8 +12,6 @@ #ifndef _S6000_I2S_H #define _S6000_I2S_H -extern struct snd_soc_dai s6000_i2s_dai; - struct s6000_snd_platform_data { int lines_in; int lines_out; diff --git a/sound/soc/s6000/s6000-pcm.c b/sound/soc/s6000/s6000-pcm.c index 9c7f7f00cebb..271fd222bf19 100644 --- a/sound/soc/s6000/s6000-pcm.c +++ b/sound/soc/s6000/s6000-pcm.c @@ -65,7 +65,7 @@ static void s6000_pcm_enqueue_dma(struct snd_pcm_substream *substream) dma_addr_t dma_pos; dma_addr_t src, dst; - par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); + par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream); period_size = snd_pcm_lib_period_bytes(substream); dma_offset = prtd->period * period_size; @@ -103,23 +103,25 @@ static irqreturn_t s6000_pcm_irq(int irq, void *data) { struct snd_pcm *pcm = data; struct snd_soc_pcm_runtime *runtime = pcm->private_data; - struct s6000_pcm_dma_params *params = - snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); struct s6000_runtime_data *prtd; unsigned int has_xrun; int i, ret = IRQ_NONE; - u32 channel[2] = { - [SNDRV_PCM_STREAM_PLAYBACK] = params->dma_out, - [SNDRV_PCM_STREAM_CAPTURE] = params->dma_in - }; - - has_xrun = params->check_xrun(runtime->dai->cpu_dai); - for (i = 0; i < ARRAY_SIZE(channel); ++i) { + for (i = 0; i < 2; ++i) { struct snd_pcm_substream *substream = pcm->streams[i].substream; + struct s6000_pcm_dma_params *params = + snd_soc_dai_get_dma_data(runtime->cpu_dai, substream); + u32 channel; unsigned int pending; - if (!channel[i]) + if (substream == SNDRV_PCM_STREAM_PLAYBACK) + channel = params->dma_out; + else + channel = params->dma_in; + + has_xrun = params->check_xrun(runtime->cpu_dai); + + if (!channel) continue; if (unlikely(has_xrun & (1 << i)) && @@ -130,8 +132,8 @@ static irqreturn_t s6000_pcm_irq(int irq, void *data) ret = IRQ_HANDLED; } - pending = s6dmac_int_sources(DMA_MASK_DMAC(channel[i]), - DMA_INDEX_CHNL(channel[i])); + pending = s6dmac_int_sources(DMA_MASK_DMAC(channel), + DMA_INDEX_CHNL(channel)); if (pending & 1) { ret = IRQ_HANDLED; @@ -139,10 +141,10 @@ static irqreturn_t s6000_pcm_irq(int irq, void *data) snd_pcm_running(substream))) { snd_pcm_period_elapsed(substream); dev_dbg(pcm->dev, "period elapsed %x %x\n", - s6dmac_cur_src(DMA_MASK_DMAC(channel[i]), - DMA_INDEX_CHNL(channel[i])), - s6dmac_cur_dst(DMA_MASK_DMAC(channel[i]), - DMA_INDEX_CHNL(channel[i]))); + s6dmac_cur_src(DMA_MASK_DMAC(channel), + DMA_INDEX_CHNL(channel)), + s6dmac_cur_dst(DMA_MASK_DMAC(channel), + DMA_INDEX_CHNL(channel))); prtd = substream->runtime->private_data; spin_lock(&prtd->lock); s6000_pcm_enqueue_dma(substream); @@ -154,16 +156,16 @@ static irqreturn_t s6000_pcm_irq(int irq, void *data) if (pending & (1 << 3)) printk(KERN_WARNING "s6000-pcm: DMA %x Underflow\n", - channel[i]); + channel); if (pending & (1 << 4)) printk(KERN_WARNING "s6000-pcm: DMA %x Overflow\n", - channel[i]); + channel); if (pending & 0x1e0) printk(KERN_WARNING "s6000-pcm: DMA %x Master Error " "(mask %x)\n", - channel[i], pending >> 5); + channel, pending >> 5); } } @@ -180,7 +182,7 @@ static int s6000_pcm_start(struct snd_pcm_substream *substream) int srcinc; u32 dma; - par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); + par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream); spin_lock_irqsave(&prtd->lock, flags); @@ -221,7 +223,7 @@ static int s6000_pcm_stop(struct snd_pcm_substream *substream) unsigned long flags; u32 channel; - par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); + par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) channel = par->dma_out; @@ -246,7 +248,7 @@ static int s6000_pcm_trigger(struct snd_pcm_substream *substream, int cmd) struct s6000_pcm_dma_params *par; int ret; - par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); + par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream); ret = par->trigger(substream, cmd, 0); if (ret < 0) @@ -291,7 +293,7 @@ static snd_pcm_uframes_t s6000_pcm_pointer(struct snd_pcm_substream *substream) unsigned int offset; dma_addr_t count; - par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); + par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream); spin_lock_irqsave(&prtd->lock, flags); @@ -321,7 +323,7 @@ static int s6000_pcm_open(struct snd_pcm_substream *substream) struct s6000_runtime_data *prtd; int ret; - par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); + par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream); snd_soc_set_runtime_hwparams(substream, &s6000_pcm_hardware); ret = snd_pcm_hw_constraint_step(runtime, 0, @@ -385,7 +387,7 @@ static int s6000_pcm_hw_params(struct snd_pcm_substream *substream, return ret; } - par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); + par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream); if (par->same_rate) { spin_lock(&par->lock); @@ -407,7 +409,7 @@ static int s6000_pcm_hw_free(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; struct s6000_pcm_dma_params *par = - snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); + snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream); spin_lock(&par->lock); par->in_use &= ~(1 << substream->stream); @@ -433,7 +435,7 @@ static void s6000_pcm_free(struct snd_pcm *pcm) { struct snd_soc_pcm_runtime *runtime = pcm->private_data; struct s6000_pcm_dma_params *params = - snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); + snd_soc_dai_get_dma_data(runtime->cpu_dai, pcm->streams[0].substream); free_irq(params->irq, pcm); snd_pcm_lib_preallocate_free_for_all(pcm); @@ -448,7 +450,8 @@ static int s6000_pcm_new(struct snd_card *card, struct s6000_pcm_dma_params *params; int res; - params = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream); + params = snd_soc_dai_get_dma_data(runtime->cpu_dai, + pcm->streams[0].substream); if (!card->dev->dma_mask) card->dev->dma_mask = &s6000_pcm_dmamask; @@ -490,25 +493,44 @@ static int s6000_pcm_new(struct snd_card *card, return 0; } -struct snd_soc_platform s6000_soc_platform = { - .name = "s6000-audio", - .pcm_ops = &s6000_pcm_ops, +static struct snd_soc_platform_driver s6000_soc_platform = { + .ops = &s6000_pcm_ops, .pcm_new = s6000_pcm_new, .pcm_free = s6000_pcm_free, }; -EXPORT_SYMBOL_GPL(s6000_soc_platform); -static int __init s6000_pcm_init(void) +static int __devinit s6000_soc_platform_probe(struct platform_device *pdev) +{ + return snd_soc_register_platform(&pdev->dev, &s6000_soc_platform); +} + +static int __devexit s6000_soc_platform_remove(struct platform_device *pdev) +{ + snd_soc_unregister_platform(&pdev->dev); + return 0; +} + +static struct platform_driver s6000_pcm_driver = { + .driver = { + .name = "s6000-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = s6000_soc_platform_probe, + .remove = __devexit_p(s6000_soc_platform_remove), +}; + +static int __init snd_s6000_pcm_init(void) { - return snd_soc_register_platform(&s6000_soc_platform); + return platform_driver_register(&s6000_pcm_driver); } -module_init(s6000_pcm_init); +module_init(snd_s6000_pcm_init); -static void __exit s6000_pcm_exit(void) +static void __exit snd_s6000_pcm_exit(void) { - snd_soc_unregister_platform(&s6000_soc_platform); + platform_driver_unregister(&s6000_pcm_driver); } -module_exit(s6000_pcm_exit); +module_exit(snd_s6000_pcm_exit); MODULE_AUTHOR("Daniel Gloeckner"); MODULE_DESCRIPTION("Stretch s6000 family PCM DMA module"); diff --git a/sound/soc/s6000/s6000-pcm.h b/sound/soc/s6000/s6000-pcm.h index 96f23f6f52bf..09d9b883e58b 100644 --- a/sound/soc/s6000/s6000-pcm.h +++ b/sound/soc/s6000/s6000-pcm.h @@ -30,6 +30,4 @@ struct s6000_pcm_dma_params { int rate; }; -extern struct snd_soc_platform s6000_soc_platform; - #endif diff --git a/sound/soc/s6000/s6105-ipcam.c b/sound/soc/s6000/s6105-ipcam.c index c1b40ac22c05..96c05e137538 100644 --- a/sound/soc/s6000/s6105-ipcam.c +++ b/sound/soc/s6000/s6105-ipcam.c @@ -32,8 +32,8 @@ static int s6105_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; - struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret = 0; /* set codec DAI configuration */ @@ -134,8 +134,10 @@ static const struct snd_kcontrol_new audio_out_mux = { }; /* Logic for a aic3x as connected on the s6105 ip camera ref design */ -static int s6105_aic3x_init(struct snd_soc_codec *codec) +static int s6105_aic3x_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; + /* Add s6105 specific widgets */ snd_soc_dapm_new_controls(codec, aic3x_dapm_widgets, ARRAY_SIZE(aic3x_dapm_widgets)); @@ -165,7 +167,7 @@ static int s6105_aic3x_init(struct snd_soc_codec *codec) snd_soc_dapm_sync(codec); - snd_ctl_add(codec->card, snd_ctl_new1(&audio_out_mux, codec)); + snd_ctl_add(codec->snd_card, snd_ctl_new1(&audio_out_mux, codec)); return 0; } @@ -174,8 +176,10 @@ static int s6105_aic3x_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link s6105_dai = { .name = "TLV320AIC31", .stream_name = "AIC31", - .cpu_dai = &s6000_i2s_dai, - .codec_dai = &aic3x_dai, + .cpu_dai_name = "s6000-i2s", + .codec_dai_name = "tlv320aic3x-hifi", + .platform_name = "s6000-pcm-audio", + .codec_name = "tlv320aic3x-codec.0-001a", .init = s6105_aic3x_init, .ops = &s6105_ops, }; @@ -183,22 +187,10 @@ static struct snd_soc_dai_link s6105_dai = { /* s6105 audio machine driver */ static struct snd_soc_card snd_soc_card_s6105 = { .name = "Stretch IP Camera", - .platform = &s6000_soc_platform, .dai_link = &s6105_dai, .num_links = 1, }; -/* s6105 audio private data */ -static struct aic3x_setup_data s6105_aic3x_setup = { -}; - -/* s6105 audio subsystem */ -static struct snd_soc_device s6105_snd_devdata = { - .card = &snd_soc_card_s6105, - .codec_dev = &soc_codec_dev_aic3x, - .codec_data = &s6105_aic3x_setup, -}; - static struct s6000_snd_platform_data __initdata s6105_snd_data = { .wide = 0, .channel_in = 0, @@ -227,8 +219,7 @@ static int __init s6105_init(void) if (!s6105_snd_device) return -ENOMEM; - platform_set_drvdata(s6105_snd_device, &s6105_snd_devdata); - s6105_snd_devdata.dev = &s6105_snd_device->dev; + platform_set_drvdata(s6105_snd_device, &snd_soc_card_s6105); platform_device_add_data(s6105_snd_device, &s6105_snd_data, sizeof(s6105_snd_data)); diff --git a/sound/soc/sh/dma-sh7760.c b/sound/soc/sh/dma-sh7760.c index 0d8bdf07729c..c326d29992fe 100644 --- a/sound/soc/sh/dma-sh7760.c +++ b/sound/soc/sh/dma-sh7760.c @@ -137,7 +137,7 @@ static void camelot_rxdma(void *data) static int camelot_pcm_open(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct camelot_pcm *cam = &cam_pcm_data[rtd->dai->cpu_dai->id]; + struct camelot_pcm *cam = &cam_pcm_data[rtd->cpu_dai->id]; int recv = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0:1; int ret, dmairq; @@ -150,7 +150,7 @@ static int camelot_pcm_open(struct snd_pcm_substream *substream) ret = dmabrg_request_irq(dmairq, camelot_rxdma, cam); if (unlikely(ret)) { pr_debug("audio unit %d irqs already taken!\n", - rtd->dai->cpu_dai->id); + rtd->cpu_dai->id); return -EBUSY; } (void)dmabrg_request_irq(dmairq + 1,camelot_rxdma, cam); @@ -159,7 +159,7 @@ static int camelot_pcm_open(struct snd_pcm_substream *substream) ret = dmabrg_request_irq(dmairq, camelot_txdma, cam); if (unlikely(ret)) { pr_debug("audio unit %d irqs already taken!\n", - rtd->dai->cpu_dai->id); + rtd->cpu_dai->id); return -EBUSY; } (void)dmabrg_request_irq(dmairq + 1, camelot_txdma, cam); @@ -170,7 +170,7 @@ static int camelot_pcm_open(struct snd_pcm_substream *substream) static int camelot_pcm_close(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct camelot_pcm *cam = &cam_pcm_data[rtd->dai->cpu_dai->id]; + struct camelot_pcm *cam = &cam_pcm_data[rtd->cpu_dai->id]; int recv = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0:1; int dmairq; @@ -191,7 +191,7 @@ static int camelot_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *hw_params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct camelot_pcm *cam = &cam_pcm_data[rtd->dai->cpu_dai->id]; + struct camelot_pcm *cam = &cam_pcm_data[rtd->cpu_dai->id]; int recv = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0:1; int ret; @@ -219,7 +219,7 @@ static int camelot_prepare(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct camelot_pcm *cam = &cam_pcm_data[rtd->dai->cpu_dai->id]; + struct camelot_pcm *cam = &cam_pcm_data[rtd->cpu_dai->id]; pr_debug("PCM data: addr 0x%08ulx len %d\n", (u32)runtime->dma_addr, runtime->dma_bytes); @@ -266,7 +266,7 @@ static inline void dmabrg_rec_dma_stop(struct camelot_pcm *cam) static int camelot_trigger(struct snd_pcm_substream *substream, int cmd) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct camelot_pcm *cam = &cam_pcm_data[rtd->dai->cpu_dai->id]; + struct camelot_pcm *cam = &cam_pcm_data[rtd->cpu_dai->id]; int recv = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0:1; switch (cmd) { @@ -293,7 +293,7 @@ static snd_pcm_uframes_t camelot_pos(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct camelot_pcm *cam = &cam_pcm_data[rtd->dai->cpu_dai->id]; + struct camelot_pcm *cam = &cam_pcm_data[rtd->cpu_dai->id]; int recv = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0:1; unsigned long pos; @@ -342,25 +342,44 @@ static int camelot_pcm_new(struct snd_card *card, return 0; } -struct snd_soc_platform sh7760_soc_platform = { - .name = "sh7760-pcm", +static struct snd_soc_platform sh7760_soc_platform = { .pcm_ops = &camelot_pcm_ops, .pcm_new = camelot_pcm_new, .pcm_free = camelot_pcm_free, }; -EXPORT_SYMBOL_GPL(sh7760_soc_platform); -static int __init sh7760_soc_platform_init(void) +static int __devinit sh7760_soc_platform_probe(struct platform_device *pdev) { - return snd_soc_register_platform(&sh7760_soc_platform); + return snd_soc_register_platform(&pdev->dev, &sh7760_soc_platform); } -module_init(sh7760_soc_platform_init); -static void __exit sh7760_soc_platform_exit(void) +static int __devexit sh7760_soc_platform_remove(struct platform_device *pdev) { - snd_soc_unregister_platform(&sh7760_soc_platform); + snd_soc_unregister_platform(&pdev->dev); + return 0; +} + +static struct platform_driver sh7760_pcm_driver = { + .driver = { + .name = "sh7760-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = sh7760_soc_platform_probe, + .remove = __devexit_p(sh7760_soc_platform_remove), +}; + +static int __init snd_sh7760_pcm_init(void) +{ + return platform_driver_register(&sh7760_pcm_driver); +} +module_init(snd_sh7760_pcm_init); + +static void __exit snd_sh7760_pcm_exit(void) +{ + platform_driver_unregister(&sh7760_pcm_driver); } -module_exit(sh7760_soc_platform_exit); +module_exit(snd_sh7760_pcm_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("SH7760 Audio DMA (DMABRG) driver"); diff --git a/sound/soc/sh/fsi-ak4642.c b/sound/soc/sh/fsi-ak4642.c index dad575a22622..9e107a9c4010 100644 --- a/sound/soc/sh/fsi-ak4642.c +++ b/sound/soc/sh/fsi-ak4642.c @@ -11,17 +11,17 @@ #include #include -#include <../sound/soc/codecs/ak4642.h> -static int fsi_ak4642_dai_init(struct snd_soc_codec *codec) +static int fsi_ak4642_dai_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_dai *dai = rtd->codec_dai; int ret; - ret = snd_soc_dai_set_fmt(&ak4642_dai, SND_SOC_DAIFMT_CBM_CFM); + ret = snd_soc_dai_set_fmt(dai, SND_SOC_DAIFMT_CBM_CFM); if (ret < 0) return ret; - ret = snd_soc_dai_set_sysclk(&ak4642_dai, 0, 11289600, 0); + ret = snd_soc_dai_set_sysclk(dai, 0, 11289600, 0); return ret; } @@ -29,24 +29,20 @@ static int fsi_ak4642_dai_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link fsi_dai_link = { .name = "AK4642", .stream_name = "AK4642", - .cpu_dai = &fsi_soc_dai[FSI_PORT_A], - .codec_dai = &ak4642_dai, + .cpu_dai_name = "fsia-dai", /* fsi A */ + .codec_dai_name = "ak4642-hifi", + .platform_name = "fsi-pcm-audio", + .codec_name = "ak4642-codec.0-0012", .init = fsi_ak4642_dai_init, .ops = NULL, }; static struct snd_soc_card fsi_soc_card = { .name = "FSI", - .platform = &fsi_soc_platform, .dai_link = &fsi_dai_link, .num_links = 1, }; -static struct snd_soc_device fsi_snd_devdata = { - .card = &fsi_soc_card, - .codec_dev = &soc_codec_dev_ak4642, -}; - static struct platform_device *fsi_snd_device; static int __init fsi_ak4642_init(void) @@ -57,9 +53,7 @@ static int __init fsi_ak4642_init(void) if (!fsi_snd_device) goto out; - platform_set_drvdata(fsi_snd_device, - &fsi_snd_devdata); - fsi_snd_devdata.dev = &fsi_snd_device->dev; + platform_set_drvdata(fsi_snd_device, &fsi_soc_card); ret = platform_device_add(fsi_snd_device); if (ret) diff --git a/sound/soc/sh/fsi-da7210.c b/sound/soc/sh/fsi-da7210.c index 121bbb07bb03..4f9298f45215 100644 --- a/sound/soc/sh/fsi-da7210.c +++ b/sound/soc/sh/fsi-da7210.c @@ -12,11 +12,12 @@ #include #include -#include "../codecs/da7210.h" -static int fsi_da7210_init(struct snd_soc_codec *codec) +static int fsi_da7210_init(struct snd_soc_pcm_runtime *rtd) { - return snd_soc_dai_set_fmt(&da7210_dai, + struct snd_soc_dai *dai = rtd->codec_dai; + + return snd_soc_dai_set_fmt(dai, SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); } @@ -24,23 +25,19 @@ static int fsi_da7210_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link fsi_da7210_dai = { .name = "DA7210", .stream_name = "DA7210", - .cpu_dai = &fsi_soc_dai[FSI_PORT_B], - .codec_dai = &da7210_dai, + .cpu_dai_name = "fsib-dai", /* FSI B */ + .codec_dai_name = "da7210-hifi", + .platform_name = "fsi-pcm-audio", + .codec_name = "da7210-codec.0-001a", .init = fsi_da7210_init, }; static struct snd_soc_card fsi_soc_card = { .name = "FSI", - .platform = &fsi_soc_platform, .dai_link = &fsi_da7210_dai, .num_links = 1, }; -static struct snd_soc_device fsi_da7210_snd_devdata = { - .card = &fsi_soc_card, - .codec_dev = &soc_codec_dev_da7210, -}; - static struct platform_device *fsi_da7210_snd_device; static int __init fsi_da7210_sound_init(void) @@ -51,8 +48,7 @@ static int __init fsi_da7210_sound_init(void) if (!fsi_da7210_snd_device) return -ENOMEM; - platform_set_drvdata(fsi_da7210_snd_device, &fsi_da7210_snd_devdata); - fsi_da7210_snd_devdata.dev = &fsi_da7210_snd_device->dev; + platform_set_drvdata(fsi_da7210_snd_device, &fsi_soc_card); ret = platform_device_add(fsi_da7210_snd_device); if (ret) platform_device_put(fsi_da7210_snd_device); diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index 58c6bec642de..abc6d8309609 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c @@ -271,16 +271,19 @@ static int fsi_is_port_a(struct fsi_priv *fsi) static struct snd_soc_dai *fsi_get_dai(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai_link *machine = rtd->dai; - return machine->cpu_dai; + return rtd->cpu_dai; } static struct fsi_priv *fsi_get_priv(struct snd_pcm_substream *substream) { struct snd_soc_dai *dai = fsi_get_dai(substream); + struct fsi_master *master = snd_soc_dai_get_drvdata(dai); - return dai->private_data; + if (dai->id == 0) + return &master->fsia; + else + return &master->fsib; } static u32 fsi_get_info_flags(struct fsi_priv *fsi) @@ -1025,10 +1028,9 @@ static int fsi_pcm_new(struct snd_card *card, ************************************************************************/ -struct snd_soc_dai fsi_soc_dai[] = { +static struct snd_soc_dai_driver fsi_soc_dai[] = { { - .name = "FSIA", - .id = 0, + .name = "fsia-dai", .playback = { .rates = FSI_RATES, .formats = FSI_FMTS, @@ -1044,8 +1046,7 @@ struct snd_soc_dai fsi_soc_dai[] = { .ops = &fsi_dai_ops, }, { - .name = "FSIB", - .id = 1, + .name = "fsib-dai", .playback = { .rates = FSI_RATES, .formats = FSI_FMTS, @@ -1061,15 +1062,12 @@ struct snd_soc_dai fsi_soc_dai[] = { .ops = &fsi_dai_ops, }, }; -EXPORT_SYMBOL_GPL(fsi_soc_dai); -struct snd_soc_platform fsi_soc_platform = { - .name = "fsi-pcm", - .pcm_ops = &fsi_pcm_ops, +static struct snd_soc_platform_driver fsi_soc_platform = { + .ops = &fsi_pcm_ops, .pcm_new = fsi_pcm_new, .pcm_free = fsi_pcm_free, }; -EXPORT_SYMBOL_GPL(fsi_soc_platform); /************************************************************************ @@ -1132,11 +1130,7 @@ static int fsi_probe(struct platform_device *pdev) pm_runtime_enable(&pdev->dev); pm_runtime_resume(&pdev->dev); - - fsi_soc_dai[0].dev = &pdev->dev; - fsi_soc_dai[0].private_data = &master->fsia; - fsi_soc_dai[1].dev = &pdev->dev; - fsi_soc_dai[1].private_data = &master->fsib; + dev_set_drvdata(&pdev->dev, master); fsi_soft_all_reset(master); @@ -1147,13 +1141,13 @@ static int fsi_probe(struct platform_device *pdev) goto exit_iounmap; } - ret = snd_soc_register_platform(&fsi_soc_platform); + ret = snd_soc_register_platform(&pdev->dev, &fsi_soc_platform); if (ret < 0) { dev_err(&pdev->dev, "cannot snd soc register\n"); goto exit_free_irq; } - return snd_soc_register_dais(fsi_soc_dai, ARRAY_SIZE(fsi_soc_dai)); + return snd_soc_register_dais(&pdev->dev, fsi_soc_dai, ARRAY_SIZE(fsi_soc_dai)); exit_free_irq: free_irq(irq, master); @@ -1171,10 +1165,10 @@ static int fsi_remove(struct platform_device *pdev) { struct fsi_master *master; - master = fsi_get_master(fsi_soc_dai[0].private_data); + master = dev_get_drvdata(&pdev->dev); - snd_soc_unregister_dais(fsi_soc_dai, ARRAY_SIZE(fsi_soc_dai)); - snd_soc_unregister_platform(&fsi_soc_platform); + snd_soc_unregister_dais(&pdev->dev, ARRAY_SIZE(fsi_soc_dai)); + snd_soc_unregister_platform(&pdev->dev); pm_runtime_disable(&pdev->dev); @@ -1183,11 +1177,6 @@ static int fsi_remove(struct platform_device *pdev) iounmap(master->base); kfree(master); - fsi_soc_dai[0].dev = NULL; - fsi_soc_dai[0].private_data = NULL; - fsi_soc_dai[1].dev = NULL; - fsi_soc_dai[1].private_data = NULL; - return 0; } @@ -1233,7 +1222,7 @@ static struct platform_device_id fsi_id_table[] = { static struct platform_driver fsi_driver = { .driver = { - .name = "sh_fsi", + .name = "fsi-pcm-audio", .pm = &fsi_pm_ops, }, .probe = fsi_probe, diff --git a/sound/soc/sh/hac.c b/sound/soc/sh/hac.c index 41db75af3c69..c87e3ff28a0a 100644 --- a/sound/soc/sh/hac.c +++ b/sound/soc/sh/hac.c @@ -239,8 +239,7 @@ static int hac_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct hac_priv *hac = &hac_cpu_data[rtd->dai->cpu_dai->id]; + struct hac_priv *hac = &hac_cpu_data[dai->id]; int d = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1; switch (params->msbits) { @@ -271,10 +270,9 @@ static struct snd_soc_dai_ops hac_dai_ops = { .hw_params = hac_hw_params, }; -struct snd_soc_dai sh4_hac_dai[] = { +static struct snd_soc_dai_driver sh4_hac_dai[] = { { - .name = "HAC0", - .id = 0, + .name = "hac-dai.0", .ac97_control = 1, .playback = { .rates = AC97_RATES, @@ -292,8 +290,7 @@ struct snd_soc_dai sh4_hac_dai[] = { }, #ifdef CONFIG_CPU_SUBTYPE_SH7760 { - .name = "HAC1", - .ac97_control = 1, + .name = "hac-dai.1", .id = 1, .playback = { .rates = AC97_RATES, @@ -312,19 +309,40 @@ struct snd_soc_dai sh4_hac_dai[] = { }, #endif }; -EXPORT_SYMBOL_GPL(sh4_hac_dai); -static int __init sh4_hac_init(void) +static int __devinit hac_soc_platform_probe(struct platform_device *pdev) +{ + return snd_soc_register_dais(&pdev->dev, sh4_hac_dai, + ARRAY_SIZE(sh4_hac_dai)); +} + +static int __devexit hac_soc_platform_remove(struct platform_device *pdev) +{ + snd_soc_unregister_dais(&pdev->dev, ARRAY_SIZE(sh4_hac_dai)); + return 0; +} + +static struct platform_driver hac_pcm_driver = { + .driver = { + .name = "hac-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = hac_soc_platform_probe, + .remove = __devexit_p(hac_soc_platform_remove), +}; + +static int __init sh4_hac_pcm_init(void) { - return snd_soc_register_dais(sh4_hac_dai, ARRAY_SIZE(sh4_hac_dai)); + return platform_driver_register(&hac_pcm_driver); } -module_init(sh4_hac_init); +module_init(sh4_hac_pcm_init); -static void __exit sh4_hac_exit(void) +static void __exit sh4_hac_pcm_exit(void) { - snd_soc_unregister_dais(sh4_hac_dai, ARRAY_SIZE(sh4_hac_dai)); + platform_driver_unregister(&hac_pcm_driver); } -module_exit(sh4_hac_exit); +module_exit(sh4_hac_pcm_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("SuperH onchip HAC (AC97) audio driver"); diff --git a/sound/soc/sh/migor.c b/sound/soc/sh/migor.c index b823a5c9b9bc..866d78fb8398 100644 --- a/sound/soc/sh/migor.c +++ b/sound/soc/sh/migor.c @@ -50,7 +50,7 @@ static int migor_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; int ret; unsigned int rate = params_rate(params); @@ -68,7 +68,7 @@ static int migor_hw_params(struct snd_pcm_substream *substream, if (ret < 0) return ret; - ret = snd_soc_dai_set_fmt(rtd->dai->cpu_dai, SND_SOC_DAIFMT_NB_IF | + ret = snd_soc_dai_set_fmt(rtd->cpu_dai, SND_SOC_DAIFMT_NB_IF | SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS); if (ret < 0) return ret; @@ -81,7 +81,7 @@ static int migor_hw_params(struct snd_pcm_substream *substream, clk_set_rate(&siumckb_clk, codec_freq); dev_dbg(codec_dai->dev, "%s: configure %luHz\n", __func__, codec_freq); - ret = snd_soc_dai_set_sysclk(rtd->dai->cpu_dai, SIU_CLKB_EXT, + ret = snd_soc_dai_set_sysclk(rtd->cpu_dai, SIU_CLKB_EXT, codec_freq / 2, SND_SOC_CLOCK_IN); if (!ret) @@ -93,7 +93,7 @@ static int migor_hw_params(struct snd_pcm_substream *substream, static int migor_hw_free(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; if (use_count) { use_count--; @@ -136,8 +136,10 @@ static const struct snd_soc_dapm_route audio_map[] = { { "Mic Bias", NULL, "External Microphone" }, }; -static int migor_dai_init(struct snd_soc_codec *codec) +static int migor_dai_init(struct snd_soc_pcm_runtime *rtd) { + struct snd_soc_codec *codec = rtd->codec; + snd_soc_dapm_new_controls(codec, migor_dapm_widgets, ARRAY_SIZE(migor_dapm_widgets)); @@ -150,8 +152,10 @@ static int migor_dai_init(struct snd_soc_codec *codec) static struct snd_soc_dai_link migor_dai = { .name = "wm8978", .stream_name = "WM8978", - .cpu_dai = &siu_i2s_dai, - .codec_dai = &wm8978_dai, + .cpu_dai_name = "siu-i2s-dai", + .codec_dai_name = "wm8978-hifi", + .platform_name = "siu-pcm-audio", + .codec_name = "wm8978-codec.0-001a", .ops = &migor_dai_ops, .init = migor_dai_init, }; @@ -159,17 +163,10 @@ static struct snd_soc_dai_link migor_dai = { /* migor audio machine driver */ static struct snd_soc_card snd_soc_migor = { .name = "Migo-R", - .platform = &siu_platform, .dai_link = &migor_dai, .num_links = 1, }; -/* migor audio subsystem */ -static struct snd_soc_device migor_snd_devdata = { - .card = &snd_soc_migor, - .codec_dev = &soc_codec_dev_wm8978, -}; - static struct platform_device *migor_snd_device; static int __init migor_init(void) @@ -187,9 +184,7 @@ static int __init migor_init(void) goto epdevalloc; } - platform_set_drvdata(migor_snd_device, &migor_snd_devdata); - - migor_snd_devdata.dev = &migor_snd_device->dev; + platform_set_drvdata(migor_snd_device, &snd_soc_migor); ret = platform_device_add(migor_snd_device); if (ret) diff --git a/sound/soc/sh/sh7760-ac97.c b/sound/soc/sh/sh7760-ac97.c index ce7f95b59de3..b897f7b96d89 100644 --- a/sound/soc/sh/sh7760-ac97.c +++ b/sound/soc/sh/sh7760-ac97.c @@ -15,41 +15,35 @@ #include #include -#include "../codecs/ac97.h" - #define IPSEL 0xFE400034 /* platform specific structs can be declared here */ -extern struct snd_soc_dai sh4_hac_dai[2]; -extern struct snd_soc_platform sh7760_soc_platform; +extern struct snd_soc_dai_driver sh4_hac_dai[2]; +extern struct snd_soc_platform_driver sh7760_soc_platform; -static int machine_init(struct snd_soc_codec *codec) +static int machine_init(struct snd_soc_pcm_runtime *rtd) { - snd_soc_dapm_sync(codec); + snd_soc_dapm_sync(rtd->codec); return 0; } static struct snd_soc_dai_link sh7760_ac97_dai = { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai = &sh4_hac_dai[0], /* HAC0 */ - .codec_dai = &ac97_dai, + .cpu_dai_name = "hac-dai.0", /* HAC0 */ + .codec_dai_name = "ac97-hifi", + .platform_name = "sh7760-pcm-audio", + .codec_name = "ac97-codec", .init = machine_init, .ops = NULL, }; static struct snd_soc_card sh7760_ac97_soc_machine = { .name = "SH7760 AC97", - .platform = &sh7760_soc_platform, .dai_link = &sh7760_ac97_dai, .num_links = 1, }; -static struct snd_soc_device sh7760_ac97_snd_devdata = { - .card = &sh7760_ac97_soc_machine, - .codec_dev = &soc_codec_dev_ac97, -}; - static struct platform_device *sh7760_ac97_snd_device; static int __init sh7760_ac97_init(void) @@ -67,8 +61,7 @@ static int __init sh7760_ac97_init(void) goto out; platform_set_drvdata(sh7760_ac97_snd_device, - &sh7760_ac97_snd_devdata); - sh7760_ac97_snd_devdata.dev = &sh7760_ac97_snd_device->dev; + &sh7760_ac97_soc_machine); ret = platform_device_add(sh7760_ac97_snd_device); if (ret) diff --git a/sound/soc/sh/siu.h b/sound/soc/sh/siu.h index 492b1cae24cc..aa239ff7310d 100644 --- a/sound/soc/sh/siu.h +++ b/sound/soc/sh/siu.h @@ -181,8 +181,9 @@ static inline u32 siu_read32(u32 __iomem *addr) #define SIU_BRGBSEL (0x108 / sizeof(u32)) #define SIU_BRRB (0x10c / sizeof(u32)) -extern struct snd_soc_platform siu_platform; -extern struct snd_soc_dai siu_i2s_dai; +extern struct snd_soc_platform_driver siu_platform; +extern struct snd_soc_dai_driver siu_i2s_dai; +extern struct siu_info *siu_i2s_data; int siu_init_port(int port, struct siu_port **port_info, struct snd_card *card); void siu_free_port(struct siu_port *port_info); diff --git a/sound/soc/sh/siu_dai.c b/sound/soc/sh/siu_dai.c index eeed5edd722b..827940a8e248 100644 --- a/sound/soc/sh/siu_dai.c +++ b/sound/soc/sh/siu_dai.c @@ -71,6 +71,9 @@ struct port_flag { struct format_flag capture; }; +struct siu_info *siu_i2s_data = NULL; +EXPORT_SYMBOL_GPL(siu_i2s_data); + static struct port_flag siu_flags[SIU_PORT_NUM] = { [SIU_PORT_A] = { .playback = { @@ -104,13 +107,13 @@ static struct port_flag siu_flags[SIU_PORT_NUM] = { static void siu_dai_start(struct siu_port *port_info) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; u32 __iomem *base = info->reg; dev_dbg(port_info->pcm->card->dev, "%s\n", __func__); /* Turn on SIU clock */ - pm_runtime_get_sync(siu_i2s_dai.dev); + pm_runtime_get_sync(port_info->pcm->card->dev); /* Issue software reset to siu */ siu_write32(base + SIU_SRCTL, 0); @@ -148,21 +151,21 @@ static void siu_dai_start(struct siu_port *port_info) siu_write32(base + SIU_SBDVCB, port_info->capture.volume); } -static void siu_dai_stop(void) +static void siu_dai_stop(struct siu_port *port_info) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; u32 __iomem *base = info->reg; /* SIU software reset */ siu_write32(base + SIU_SRCTL, 0); /* Turn off SIU clock */ - pm_runtime_put_sync(siu_i2s_dai.dev); + pm_runtime_put_sync(port_info->pcm->card->dev); } static void siu_dai_spbAselect(struct siu_port *port_info) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; struct siu_firmware *fw = &info->fw; u32 *ydef = fw->yram0; u32 idx; @@ -187,7 +190,7 @@ static void siu_dai_spbAselect(struct siu_port *port_info) static void siu_dai_spbBselect(struct siu_port *port_info) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; struct siu_firmware *fw = &info->fw; u32 *ydef = fw->yram0; u32 idx; @@ -207,7 +210,7 @@ static void siu_dai_spbBselect(struct siu_port *port_info) static void siu_dai_open(struct siu_stream *siu_stream) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; u32 __iomem *base = info->reg; u32 srctl, ifctl; @@ -238,7 +241,7 @@ static void siu_dai_open(struct siu_stream *siu_stream) */ static void siu_dai_pcmdatapack(struct siu_stream *siu_stream) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; u32 __iomem *base = info->reg; u32 dpak; @@ -258,7 +261,7 @@ static void siu_dai_pcmdatapack(struct siu_stream *siu_stream) static int siu_dai_spbstart(struct siu_port *port_info) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; u32 __iomem *base = info->reg; struct siu_firmware *fw = &info->fw; u32 *ydef = fw->yram0; @@ -323,7 +326,7 @@ static int siu_dai_spbstart(struct siu_port *port_info) static void siu_dai_spbstop(struct siu_port *port_info) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; u32 __iomem *base = info->reg; siu_write32(base + SIU_SBACTIV, 0); @@ -402,7 +405,7 @@ static int siu_dai_put_volume(struct snd_kcontrol *kctrl, { struct siu_port *port_info = snd_kcontrol_chip(kctrl); struct device *dev = port_info->pcm->card->dev; - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; u32 __iomem *base = info->reg; u32 new_vol; u32 cur_vol; @@ -510,7 +513,7 @@ void siu_free_port(struct siu_port *port_info) static int siu_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = snd_soc_dai_get_drvdata(dai); struct snd_pcm_runtime *rt = substream->runtime; struct siu_port *port_info = siu_port_info(substream); int ret; @@ -532,7 +535,7 @@ static int siu_dai_startup(struct snd_pcm_substream *substream, static void siu_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = snd_soc_dai_get_drvdata(dai); struct siu_port *port_info = siu_port_info(substream); dev_dbg(substream->pcm->card->dev, "%s: port=%d@%p\n", __func__, @@ -548,7 +551,7 @@ static void siu_dai_shutdown(struct snd_pcm_substream *substream, /* during stmread or stmwrite ? */ BUG_ON(port_info->playback.rw_flg || port_info->capture.rw_flg); siu_dai_spbstop(port_info); - siu_dai_stop(); + siu_dai_stop(port_info); } } @@ -556,7 +559,7 @@ static void siu_dai_shutdown(struct snd_pcm_substream *substream, static int siu_dai_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = snd_soc_dai_get_drvdata(dai); struct snd_pcm_runtime *rt = substream->runtime; struct siu_port *port_info = siu_port_info(substream); struct siu_stream *siu_stream; @@ -605,7 +608,7 @@ fail: static int siu_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = snd_soc_dai_get_drvdata(dai); u32 __iomem *base = info->reg; u32 ifctl; @@ -671,11 +674,11 @@ static int siu_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, return -EINVAL; } - siu_clk = clk_get(siu_i2s_dai.dev, siu_name); + siu_clk = clk_get(dai->dev, siu_name); if (IS_ERR(siu_clk)) return PTR_ERR(siu_clk); - parent_clk = clk_get(siu_i2s_dai.dev, parent_name); + parent_clk = clk_get(dai->dev, parent_name); if (!IS_ERR(parent_clk)) { ret = clk_set_parent(siu_clk, parent_clk); if (!ret) @@ -696,9 +699,8 @@ static struct snd_soc_dai_ops siu_dai_ops = { .set_fmt = siu_dai_set_fmt, }; -struct snd_soc_dai siu_i2s_dai = { - .name = "sh-siu", - .id = 0, +static struct snd_soc_dai_driver siu_i2s_dai = { + .name = "sui-i2s-dai", .playback = { .channels_min = 2, .channels_max = 2, @@ -713,7 +715,6 @@ struct snd_soc_dai siu_i2s_dai = { }, .ops = &siu_dai_ops, }; -EXPORT_SYMBOL_GPL(siu_i2s_dai); static int __devinit siu_probe(struct platform_device *pdev) { @@ -725,6 +726,7 @@ static int __devinit siu_probe(struct platform_device *pdev) info = kmalloc(sizeof(*info), GFP_KERNEL); if (!info) return -ENOMEM; + siu_i2s_data = info; ret = request_firmware(&fw_entry, "siu_spb.bin", &pdev->dev); if (ret) @@ -767,14 +769,14 @@ static int __devinit siu_probe(struct platform_device *pdev) if (!info->reg) goto emapreg; - siu_i2s_dai.dev = &pdev->dev; - siu_i2s_dai.private_data = info; + dev_set_drvdata(&pdev->dev, info); - ret = snd_soc_register_dais(&siu_i2s_dai, 1); + /* register using ARRAY version so we can keep dai name */ + ret = snd_soc_register_dais(&pdev->dev, &siu_i2s_dai, 1); if (ret < 0) goto edaiinit; - ret = snd_soc_register_platform(&siu_platform); + ret = snd_soc_register_platform(&pdev->dev, &siu_platform); if (ret < 0) goto esocregp; @@ -783,7 +785,7 @@ static int __devinit siu_probe(struct platform_device *pdev) return ret; esocregp: - snd_soc_unregister_dais(&siu_i2s_dai, 1); + snd_soc_unregister_dai(&pdev->dev); edaiinit: iounmap(info->reg); emapreg: @@ -804,13 +806,13 @@ ereqfw: static int __devexit siu_remove(struct platform_device *pdev) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = dev_get_drvdata(&pdev->dev); struct resource *res; pm_runtime_disable(&pdev->dev); - snd_soc_unregister_platform(&siu_platform); - snd_soc_unregister_dais(&siu_i2s_dai, 1); + snd_soc_unregister_platform(&pdev->dev); + snd_soc_unregister_dai(&pdev->dev); iounmap(info->reg); iounmap(info->yram); @@ -826,7 +828,7 @@ static int __devexit siu_remove(struct platform_device *pdev) static struct platform_driver siu_driver = { .driver = { - .name = "sh_siu", + .name = "siu-pcm-audio", }, .probe = siu_probe, .remove = __devexit_p(siu_remove), diff --git a/sound/soc/sh/siu_pcm.c b/sound/soc/sh/siu_pcm.c index 36170be15aa7..440476993325 100644 --- a/sound/soc/sh/siu_pcm.c +++ b/sound/soc/sh/siu_pcm.c @@ -48,7 +48,7 @@ struct siu_port *siu_ports[SIU_PORT_NUM]; /* transfersize is number of u32 dma transfers per period */ static int siu_pcm_stmwrite_stop(struct siu_port *port_info) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; u32 __iomem *base = info->reg; struct siu_stream *siu_stream = &port_info->playback; u32 stfifo; @@ -114,7 +114,7 @@ static void siu_dma_tx_complete(void *arg) static int siu_pcm_wr_set(struct siu_port *port_info, dma_addr_t buff, u32 size) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; u32 __iomem *base = info->reg; struct siu_stream *siu_stream = &port_info->playback; struct snd_pcm_substream *substream = siu_stream->substream; @@ -161,7 +161,7 @@ static int siu_pcm_wr_set(struct siu_port *port_info, static int siu_pcm_rd_set(struct siu_port *port_info, dma_addr_t buff, size_t size) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; u32 __iomem *base = info->reg; struct siu_stream *siu_stream = &port_info->capture; struct snd_pcm_substream *substream = siu_stream->substream; @@ -270,7 +270,7 @@ static int siu_pcm_stmread_start(struct siu_port *port_info) static int siu_pcm_stmread_stop(struct siu_port *port_info) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; u32 __iomem *base = info->reg; struct siu_stream *siu_stream = &port_info->capture; struct device *dev = siu_stream->substream->pcm->card->dev; @@ -294,7 +294,7 @@ static int siu_pcm_stmread_stop(struct siu_port *port_info) static int siu_pcm_hw_params(struct snd_pcm_substream *ss, struct snd_pcm_hw_params *hw_params) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; struct device *dev = ss->pcm->card->dev; int ret; @@ -309,7 +309,7 @@ static int siu_pcm_hw_params(struct snd_pcm_substream *ss, static int siu_pcm_hw_free(struct snd_pcm_substream *ss) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; struct siu_port *port_info = siu_port_info(ss); struct device *dev = ss->pcm->card->dev; struct siu_stream *siu_stream; @@ -340,11 +340,12 @@ static bool filter(struct dma_chan *chan, void *slave) static int siu_pcm_open(struct snd_pcm_substream *ss) { /* Playback / Capture */ - struct siu_info *info = siu_i2s_dai.private_data; + struct snd_soc_pcm_runtime *rtd = ss->private_data; + struct siu_platform *pdata = snd_soc_platform_get_drvdata(rtd->platform); + struct siu_info *info = siu_i2s_data; struct siu_port *port_info = siu_port_info(ss); struct siu_stream *siu_stream; u32 port = info->port_id; - struct siu_platform *pdata = siu_i2s_dai.dev->platform_data; struct device *dev = ss->pcm->card->dev; dma_cap_mask_t mask; struct sh_dmae_slave *param; @@ -381,7 +382,7 @@ static int siu_pcm_open(struct snd_pcm_substream *ss) static int siu_pcm_close(struct snd_pcm_substream *ss) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; struct device *dev = ss->pcm->card->dev; struct siu_port *port_info = siu_port_info(ss); struct siu_stream *siu_stream; @@ -403,7 +404,7 @@ static int siu_pcm_close(struct snd_pcm_substream *ss) static int siu_pcm_prepare(struct snd_pcm_substream *ss) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; struct siu_port *port_info = siu_port_info(ss); struct device *dev = ss->pcm->card->dev; struct snd_pcm_runtime *rt = ss->runtime; @@ -449,7 +450,7 @@ static int siu_pcm_prepare(struct snd_pcm_substream *ss) static int siu_pcm_trigger(struct snd_pcm_substream *ss, int cmd) { - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; struct device *dev = ss->pcm->card->dev; struct siu_port *port_info = siu_port_info(ss); int ret; @@ -492,7 +493,7 @@ static int siu_pcm_trigger(struct snd_pcm_substream *ss, int cmd) static snd_pcm_uframes_t siu_pcm_pointer_dma(struct snd_pcm_substream *ss) { struct device *dev = ss->pcm->card->dev; - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; u32 __iomem *base = info->reg; struct siu_port *port_info = siu_port_info(ss); struct snd_pcm_runtime *rt = ss->runtime; @@ -528,7 +529,7 @@ static int siu_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, struct snd_pcm *pcm) { /* card->dev == socdev->dev, see snd_soc_new_pcms() */ - struct siu_info *info = siu_i2s_dai.private_data; + struct siu_info *info = siu_i2s_data; struct platform_device *pdev = to_platform_device(card->dev); int ret; int i; @@ -605,9 +606,8 @@ static struct snd_pcm_ops siu_pcm_ops = { .pointer = siu_pcm_pointer_dma, }; -struct snd_soc_platform siu_platform = { - .name = "siu-audio", - .pcm_ops = &siu_pcm_ops, +struct snd_soc_platform_driver siu_platform = { + .ops = &siu_pcm_ops, .pcm_new = siu_pcm_new, .pcm_free = siu_pcm_free, }; diff --git a/sound/soc/sh/ssi.c b/sound/soc/sh/ssi.c index b378096cadb1..40bbdf1591dc 100644 --- a/sound/soc/sh/ssi.c +++ b/sound/soc/sh/ssi.c @@ -92,8 +92,7 @@ struct ssi_priv { static int ssi_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct ssi_priv *ssi = &ssi_cpu_data[rtd->dai->cpu_dai->id]; + struct ssi_priv *ssi = &ssi_cpu_data[dai->id]; if (ssi->inuse) { pr_debug("ssi: already in use!\n"); return -EBUSY; @@ -105,8 +104,7 @@ static int ssi_startup(struct snd_pcm_substream *substream, static void ssi_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct ssi_priv *ssi = &ssi_cpu_data[rtd->dai->cpu_dai->id]; + struct ssi_priv *ssi = &ssi_cpu_data[dai->id]; ssi->inuse = 0; } @@ -114,8 +112,7 @@ static void ssi_shutdown(struct snd_pcm_substream *substream, static int ssi_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct ssi_priv *ssi = &ssi_cpu_data[rtd->dai->cpu_dai->id]; + struct ssi_priv *ssi = &ssi_cpu_data[dai->id]; switch (cmd) { case SNDRV_PCM_TRIGGER_START: @@ -135,8 +132,7 @@ static int ssi_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct ssi_priv *ssi = &ssi_cpu_data[rtd->dai->cpu_dai->id]; + struct ssi_priv *ssi = &ssi_cpu_data[dai->id]; unsigned long ssicr = SSIREG(SSICR); unsigned int bits, channels, swl, recv, i; @@ -346,10 +342,9 @@ static struct snd_soc_dai_ops ssi_dai_ops = { .set_fmt = ssi_set_fmt, }; -struct snd_soc_dai sh4_ssi_dai[] = { +struct snd_soc_dai_driver sh4_ssi_dai[] = { { - .name = "SSI0", - .id = 0, + .name = "ssi-dai.0", .playback = { .rates = SSI_RATES, .formats = SSI_FMTS, @@ -366,8 +361,7 @@ struct snd_soc_dai sh4_ssi_dai[] = { }, #ifdef CONFIG_CPU_SUBTYPE_SH7760 { - .name = "SSI1", - .id = 1, + .name = "ssi-dai.1", .playback = { .rates = SSI_RATES, .formats = SSI_FMTS, @@ -384,19 +378,40 @@ struct snd_soc_dai sh4_ssi_dai[] = { }, #endif }; -EXPORT_SYMBOL_GPL(sh4_ssi_dai); -static int __init sh4_ssi_init(void) +static int __devinit sh4_soc_dai_probe(struct platform_device *pdev) +{ + return snd_soc_register_dais(&pdev->dev, sh4_ssi_dai, + ARRAY_SIZE(sh4_ssi_dai)); +} + +static int __devexit sh4_soc_dai_remove(struct platform_device *pdev) +{ + snd_soc_unregister_dai(&pdev->dev, ARRAY_SIZE(sh4_ssi_dai)); + return 0; +} + +static struct platform_driver sh4_ssi_driver = { + .driver = { + .name = "sh4-ssi-dai", + .owner = THIS_MODULE, + }, + + .probe = sh4_soc_dai_probe, + .remove = __devexit_p(sh4_soc_dai_remove), +}; + +static int __init snd_sh4_ssi_init(void) { - return snd_soc_register_dais(sh4_ssi_dai, ARRAY_SIZE(sh4_ssi_dai)); + return platform_driver_register(&sh4_ssi_driver); } -module_init(sh4_ssi_init); +module_init(snd_sh4_ssi_init); -static void __exit sh4_ssi_exit(void) +static void __exit snd_sh4_ssi_exit(void) { - snd_soc_unregister_dais(sh4_ssi_dai, ARRAY_SIZE(sh4_ssi_dai)); + platform_driver_unregister(&sh4_ssi_driver); } -module_exit(sh4_ssi_exit); +module_exit(snd_sh4_ssi_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("SuperH onchip SSI (I2S) audio driver"); diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c index 472af38188c1..83cd8ed944bf 100644 --- a/sound/soc/soc-cache.c +++ b/sound/soc/soc-cache.c @@ -19,7 +19,7 @@ static unsigned int snd_soc_4_12_read(struct snd_soc_codec *codec, unsigned int reg) { u16 *cache = codec->reg_cache; - if (reg >= codec->reg_cache_size) + if (reg >= codec->driver->reg_cache_size) return -1; return cache[reg]; } @@ -31,12 +31,12 @@ static int snd_soc_4_12_write(struct snd_soc_codec *codec, unsigned int reg, u8 data[2]; int ret; - BUG_ON(codec->volatile_register); + BUG_ON(codec->driver->volatile_register); data[0] = (reg << 4) | ((value >> 8) & 0x000f); data[1] = value & 0x00ff; - if (reg < codec->reg_cache_size) + if (reg < codec->driver->reg_cache_size) cache[reg] = value; if (codec->cache_only) { @@ -89,7 +89,7 @@ static unsigned int snd_soc_7_9_read(struct snd_soc_codec *codec, unsigned int reg) { u16 *cache = codec->reg_cache; - if (reg >= codec->reg_cache_size) + if (reg >= codec->driver->reg_cache_size) return -1; return cache[reg]; } @@ -101,12 +101,12 @@ static int snd_soc_7_9_write(struct snd_soc_codec *codec, unsigned int reg, u8 data[2]; int ret; - BUG_ON(codec->volatile_register); + BUG_ON(codec->driver->volatile_register); data[0] = (reg << 1) | ((value >> 8) & 0x0001); data[1] = value & 0x00ff; - if (reg < codec->reg_cache_size) + if (reg < codec->driver->reg_cache_size) cache[reg] = value; if (codec->cache_only) { @@ -161,13 +161,13 @@ static int snd_soc_8_8_write(struct snd_soc_codec *codec, unsigned int reg, u8 *cache = codec->reg_cache; u8 data[2]; - BUG_ON(codec->volatile_register); + BUG_ON(codec->driver->volatile_register); reg &= 0xff; data[0] = reg; data[1] = value & 0xff; - if (reg < codec->reg_cache_size) + if (reg < codec->driver->reg_cache_size) cache[reg] = value; if (codec->cache_only) { @@ -188,7 +188,7 @@ static unsigned int snd_soc_8_8_read(struct snd_soc_codec *codec, { u8 *cache = codec->reg_cache; reg &= 0xff; - if (reg >= codec->reg_cache_size) + if (reg >= codec->driver->reg_cache_size) return -1; return cache[reg]; } @@ -224,7 +224,7 @@ static unsigned int snd_soc_8_16_read(struct snd_soc_codec *codec, { u16 *cache = codec->reg_cache; - if (reg >= codec->reg_cache_size || + if (reg >= codec->driver->reg_cache_size || snd_soc_codec_volatile_register(codec, reg)) { if (codec->cache_only) return -EINVAL; @@ -343,7 +343,7 @@ static unsigned int snd_soc_16_8_read(struct snd_soc_codec *codec, u16 *cache = codec->reg_cache; reg &= 0xff; - if (reg >= codec->reg_cache_size) + if (reg >= codec->driver->reg_cache_size) return -1; return cache[reg]; } @@ -355,14 +355,14 @@ static int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg, u8 data[3]; int ret; - BUG_ON(codec->volatile_register); + BUG_ON(codec->driver->volatile_register); data[0] = (reg >> 8) & 0xff; data[1] = reg & 0xff; data[2] = value; reg &= 0xff; - if (reg < codec->reg_cache_size) + if (reg < codec->driver->reg_cache_size) cache[reg] = value; if (codec->cache_only) { @@ -451,7 +451,7 @@ static unsigned int snd_soc_16_16_read(struct snd_soc_codec *codec, { u16 *cache = codec->reg_cache; - if (reg >= codec->reg_cache_size || + if (reg >= codec->driver->reg_cache_size || snd_soc_codec_volatile_register(codec, reg)) { if (codec->cache_only) return -EINVAL; @@ -474,7 +474,7 @@ static int snd_soc_16_16_write(struct snd_soc_codec *codec, unsigned int reg, data[2] = (value >> 8) & 0xff; data[3] = value & 0xff; - if (reg < codec->reg_cache_size) + if (reg < codec->driver->reg_cache_size) cache[reg] = value; if (codec->cache_only) { @@ -571,8 +571,8 @@ int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec, return -EINVAL; } - codec->write = io_types[i].write; - codec->read = io_types[i].read; + codec->driver->write = io_types[i].write; + codec->driver->read = io_types[i].read; switch (control) { case SND_SOC_CUSTOM: diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 5299932db0b6..a004876a39a9 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -3,6 +3,8 @@ * * Copyright 2005 Wolfson Microelectronics PLC. * Copyright 2005 Openedhand Ltd. + * Copyright (C) 2010 Slimlogic Ltd. + * Copyright (C) 2010 Texas Instruments Inc. * * Author: Liam Girdwood * with code, comments and ideas from :- @@ -37,6 +39,8 @@ #include #include +#define NAME_SIZE 32 + static DEFINE_MUTEX(pcm_mutex); static DECLARE_WAIT_QUEUE_HEAD(soc_pm_waitq); @@ -52,6 +56,7 @@ static LIST_HEAD(codec_list); static int snd_soc_register_card(struct snd_soc_card *card); static int snd_soc_unregister_card(struct snd_soc_card *card); +static int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num); /* * This is a timeout to do a DAPM powerdown after a stream is closed(). @@ -86,30 +91,30 @@ static ssize_t soc_codec_reg_show(struct snd_soc_codec *codec, char *buf) { int ret, i, step = 1, count = 0; - if (!codec->reg_cache_size) + if (!codec->driver->reg_cache_size) return 0; - if (codec->reg_cache_step) - step = codec->reg_cache_step; + if (codec->driver->reg_cache_step) + step = codec->driver->reg_cache_step; count += sprintf(buf, "%s registers\n", codec->name); - for (i = 0; i < codec->reg_cache_size; i += step) { - if (codec->readable_register && !codec->readable_register(i)) + for (i = 0; i < codec->driver->reg_cache_size; i += step) { + if (codec->driver->readable_register && !codec->driver->readable_register(i)) continue; count += sprintf(buf + count, "%2x: ", i); if (count >= PAGE_SIZE - 1) break; - if (codec->display_register) { - count += codec->display_register(codec, buf + count, + if (codec->driver->display_register) { + count += codec->driver->display_register(codec, buf + count, PAGE_SIZE - count, i); } else { /* If the read fails it's almost certainly due to * the register being volatile and the device being * powered off. */ - ret = codec->read(codec, i); + ret = codec->driver->read(codec, i); if (ret >= 0) count += snprintf(buf + count, PAGE_SIZE - count, @@ -137,8 +142,10 @@ static ssize_t soc_codec_reg_show(struct snd_soc_codec *codec, char *buf) static ssize_t codec_reg_show(struct device *dev, struct device_attribute *attr, char *buf) { - struct snd_soc_device *devdata = dev_get_drvdata(dev); - return soc_codec_reg_show(devdata->card->codec, buf); + struct snd_soc_pcm_runtime *rtd = + container_of(dev, struct snd_soc_pcm_runtime, dev); + + return soc_codec_reg_show(rtd->codec, buf); } static DEVICE_ATTR(codec_reg, 0444, codec_reg_show, NULL); @@ -146,20 +153,20 @@ static DEVICE_ATTR(codec_reg, 0444, codec_reg_show, NULL); static ssize_t pmdown_time_show(struct device *dev, struct device_attribute *attr, char *buf) { - struct snd_soc_device *socdev = dev_get_drvdata(dev); - struct snd_soc_card *card = socdev->card; + struct snd_soc_pcm_runtime *rtd = + container_of(dev, struct snd_soc_pcm_runtime, dev); - return sprintf(buf, "%ld\n", card->pmdown_time); + return sprintf(buf, "%ld\n", rtd->pmdown_time); } static ssize_t pmdown_time_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - struct snd_soc_device *socdev = dev_get_drvdata(dev); - struct snd_soc_card *card = socdev->card; + struct snd_soc_pcm_runtime *rtd = + container_of(dev, struct snd_soc_pcm_runtime, dev); - strict_strtol(buf, 10, &card->pmdown_time); + strict_strtol(buf, 10, &rtd->pmdown_time); return count; } @@ -203,19 +210,19 @@ static ssize_t codec_reg_write_file(struct file *file, return -EFAULT; buf[buf_size] = 0; - if (codec->reg_cache_step) - step = codec->reg_cache_step; + if (codec->driver->reg_cache_step) + step = codec->driver->reg_cache_step; while (*start == ' ') start++; reg = simple_strtoul(start, &start, 16); - if ((reg >= codec->reg_cache_size) || (reg % step)) + if ((reg >= codec->driver->reg_cache_size) || (reg % step)) return -EINVAL; while (*start == ' ') start++; if (strict_strtoul(start, 16, &value)) return -EINVAL; - codec->write(codec, reg, value); + codec->driver->write(codec, reg, value); return buf_size; } @@ -305,7 +312,7 @@ static int soc_ac97_dev_register(struct snd_soc_codec *codec) codec->ac97->dev.release = soc_ac97_device_release; dev_set_name(&codec->ac97->dev, "%d-%d:%s", - codec->card->number, 0, codec->name); + codec->card->snd_card->number, 0, codec->name); err = device_register(&codec->ac97->dev); if (err < 0) { snd_printk(KERN_ERR "Can't register ac97 bus\n"); @@ -319,24 +326,21 @@ static int soc_ac97_dev_register(struct snd_soc_codec *codec) static int soc_pcm_apply_symmetry(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_card *card = socdev->card; - struct snd_soc_dai_link *machine = rtd->dai; - struct snd_soc_dai *cpu_dai = machine->cpu_dai; - struct snd_soc_dai *codec_dai = machine->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; int ret; - if (codec_dai->symmetric_rates || cpu_dai->symmetric_rates || - machine->symmetric_rates) { - dev_dbg(card->dev, "Symmetry forces %dHz rate\n", - machine->rate); + if (codec_dai->driver->symmetric_rates || cpu_dai->driver->symmetric_rates || + rtd->dai_link->symmetric_rates) { + dev_dbg(&rtd->dev, "Symmetry forces %dHz rate\n", + rtd->rate); ret = snd_pcm_hw_constraint_minmax(substream->runtime, SNDRV_PCM_HW_PARAM_RATE, - machine->rate, - machine->rate); + rtd->rate, + rtd->rate); if (ret < 0) { - dev_err(card->dev, + dev_err(&rtd->dev, "Unable to apply rate symmetry constraint: %d\n", ret); return ret; } @@ -353,20 +357,19 @@ static int soc_pcm_apply_symmetry(struct snd_pcm_substream *substream) static int soc_pcm_open(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_card *card = socdev->card; struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_dai_link *machine = rtd->dai; - struct snd_soc_platform *platform = card->platform; - struct snd_soc_dai *cpu_dai = machine->cpu_dai; - struct snd_soc_dai *codec_dai = machine->codec_dai; + struct snd_soc_platform *platform = rtd->platform; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai_driver *cpu_dai_drv = cpu_dai->driver; + struct snd_soc_dai_driver *codec_dai_drv = codec_dai->driver; int ret = 0; mutex_lock(&pcm_mutex); /* startup the audio subsystem */ - if (cpu_dai->ops->startup) { - ret = cpu_dai->ops->startup(substream, cpu_dai); + if (cpu_dai->driver->ops->startup) { + ret = cpu_dai->driver->ops->startup(substream, cpu_dai); if (ret < 0) { printk(KERN_ERR "asoc: can't open interface %s\n", cpu_dai->name); @@ -374,16 +377,16 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) } } - if (platform->pcm_ops->open) { - ret = platform->pcm_ops->open(substream); + if (platform->driver->ops->open) { + ret = platform->driver->ops->open(substream); if (ret < 0) { printk(KERN_ERR "asoc: can't open platform %s\n", platform->name); goto platform_err; } } - if (codec_dai->ops->startup) { - ret = codec_dai->ops->startup(substream, codec_dai); + if (codec_dai->driver->ops->startup) { + ret = codec_dai->driver->ops->startup(substream, codec_dai); if (ret < 0) { printk(KERN_ERR "asoc: can't open codec %s\n", codec_dai->name); @@ -391,10 +394,10 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) } } - if (machine->ops && machine->ops->startup) { - ret = machine->ops->startup(substream); + if (rtd->dai_link->ops && rtd->dai_link->ops->startup) { + ret = rtd->dai_link->ops->startup(substream); if (ret < 0) { - printk(KERN_ERR "asoc: %s startup failed\n", machine->name); + printk(KERN_ERR "asoc: %s startup failed\n", rtd->dai_link->name); goto machine_err; } } @@ -402,50 +405,50 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) /* Check that the codec and cpu DAI's are compatible */ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { runtime->hw.rate_min = - max(codec_dai->playback.rate_min, - cpu_dai->playback.rate_min); + max(codec_dai_drv->playback.rate_min, + cpu_dai_drv->playback.rate_min); runtime->hw.rate_max = - min(codec_dai->playback.rate_max, - cpu_dai->playback.rate_max); + min(codec_dai_drv->playback.rate_max, + cpu_dai_drv->playback.rate_max); runtime->hw.channels_min = - max(codec_dai->playback.channels_min, - cpu_dai->playback.channels_min); + max(codec_dai_drv->playback.channels_min, + cpu_dai_drv->playback.channels_min); runtime->hw.channels_max = - min(codec_dai->playback.channels_max, - cpu_dai->playback.channels_max); + min(codec_dai_drv->playback.channels_max, + cpu_dai_drv->playback.channels_max); runtime->hw.formats = - codec_dai->playback.formats & cpu_dai->playback.formats; + codec_dai_drv->playback.formats & cpu_dai_drv->playback.formats; runtime->hw.rates = - codec_dai->playback.rates & cpu_dai->playback.rates; - if (codec_dai->playback.rates + codec_dai_drv->playback.rates & cpu_dai_drv->playback.rates; + if (codec_dai_drv->playback.rates & (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS)) - runtime->hw.rates |= cpu_dai->playback.rates; - if (cpu_dai->playback.rates + runtime->hw.rates |= cpu_dai_drv->playback.rates; + if (cpu_dai_drv->playback.rates & (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS)) - runtime->hw.rates |= codec_dai->playback.rates; + runtime->hw.rates |= codec_dai_drv->playback.rates; } else { runtime->hw.rate_min = - max(codec_dai->capture.rate_min, - cpu_dai->capture.rate_min); + max(codec_dai_drv->capture.rate_min, + cpu_dai_drv->capture.rate_min); runtime->hw.rate_max = - min(codec_dai->capture.rate_max, - cpu_dai->capture.rate_max); + min(codec_dai_drv->capture.rate_max, + cpu_dai_drv->capture.rate_max); runtime->hw.channels_min = - max(codec_dai->capture.channels_min, - cpu_dai->capture.channels_min); + max(codec_dai_drv->capture.channels_min, + cpu_dai_drv->capture.channels_min); runtime->hw.channels_max = - min(codec_dai->capture.channels_max, - cpu_dai->capture.channels_max); + min(codec_dai_drv->capture.channels_max, + cpu_dai_drv->capture.channels_max); runtime->hw.formats = - codec_dai->capture.formats & cpu_dai->capture.formats; + codec_dai_drv->capture.formats & cpu_dai_drv->capture.formats; runtime->hw.rates = - codec_dai->capture.rates & cpu_dai->capture.rates; - if (codec_dai->capture.rates + codec_dai_drv->capture.rates & cpu_dai_drv->capture.rates; + if (codec_dai_drv->capture.rates & (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS)) - runtime->hw.rates |= cpu_dai->capture.rates; - if (cpu_dai->capture.rates + runtime->hw.rates |= cpu_dai_drv->capture.rates; + if (cpu_dai_drv->capture.rates & (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS)) - runtime->hw.rates |= codec_dai->capture.rates; + runtime->hw.rates |= codec_dai_drv->capture.rates; } snd_pcm_limit_hw_rates(runtime); @@ -461,7 +464,7 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) } if (!runtime->hw.channels_min || !runtime->hw.channels_max) { printk(KERN_ERR "asoc: %s <-> %s No matching channels\n", - codec_dai->name, cpu_dai->name); + codec_dai->name, cpu_dai->name); goto config_err; } @@ -472,7 +475,8 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) goto config_err; } - pr_debug("asoc: %s <-> %s info:\n", codec_dai->name, cpu_dai->name); + pr_debug("asoc: %s <-> %s info:\n", + codec_dai->name, cpu_dai->name); pr_debug("asoc: rate mask 0x%x\n", runtime->hw.rates); pr_debug("asoc: min ch %d max ch %d\n", runtime->hw.channels_min, runtime->hw.channels_max); @@ -480,33 +484,33 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) runtime->hw.rate_max); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - cpu_dai->playback.active++; - codec_dai->playback.active++; + cpu_dai->playback_active++; + codec_dai->playback_active++; } else { - cpu_dai->capture.active++; - codec_dai->capture.active++; + cpu_dai->capture_active++; + codec_dai->capture_active++; } cpu_dai->active++; codec_dai->active++; - card->codec->active++; + rtd->codec->active++; mutex_unlock(&pcm_mutex); return 0; config_err: - if (machine->ops && machine->ops->shutdown) - machine->ops->shutdown(substream); + if (rtd->dai_link->ops && rtd->dai_link->ops->shutdown) + rtd->dai_link->ops->shutdown(substream); machine_err: - if (codec_dai->ops->shutdown) - codec_dai->ops->shutdown(substream, codec_dai); + if (codec_dai->driver->ops->shutdown) + codec_dai->driver->ops->shutdown(substream, codec_dai); codec_dai_err: - if (platform->pcm_ops->close) - platform->pcm_ops->close(substream); + if (platform->driver->ops->close) + platform->driver->ops->close(substream); platform_err: - if (cpu_dai->ops->shutdown) - cpu_dai->ops->shutdown(substream, cpu_dai); + if (cpu_dai->driver->ops->shutdown) + cpu_dai->driver->ops->shutdown(substream, cpu_dai); out: mutex_unlock(&pcm_mutex); return ret; @@ -519,29 +523,25 @@ out: */ static void close_delayed_work(struct work_struct *work) { - struct snd_soc_card *card = container_of(work, struct snd_soc_card, - delayed_work.work); - struct snd_soc_codec *codec = card->codec; - struct snd_soc_dai *codec_dai; - int i; + struct snd_soc_pcm_runtime *rtd = + container_of(work, struct snd_soc_pcm_runtime, delayed_work.work); + struct snd_soc_dai *codec_dai = rtd->codec_dai; mutex_lock(&pcm_mutex); - for (i = 0; i < codec->num_dai; i++) { - codec_dai = &codec->dai[i]; - - pr_debug("pop wq checking: %s status: %s waiting: %s\n", - codec_dai->playback.stream_name, - codec_dai->playback.active ? "active" : "inactive", - codec_dai->pop_wait ? "yes" : "no"); - - /* are we waiting on this codec DAI stream */ - if (codec_dai->pop_wait == 1) { - codec_dai->pop_wait = 0; - snd_soc_dapm_stream_event(codec, - codec_dai->playback.stream_name, - SND_SOC_DAPM_STREAM_STOP); - } + + pr_debug("pop wq checking: %s status: %s waiting: %s\n", + codec_dai->driver->playback.stream_name, + codec_dai->playback_active ? "active" : "inactive", + codec_dai->pop_wait ? "yes" : "no"); + + /* are we waiting on this codec DAI stream */ + if (codec_dai->pop_wait == 1) { + codec_dai->pop_wait = 0; + snd_soc_dapm_stream_event(rtd, + codec_dai->driver->playback.stream_name, + SND_SOC_DAPM_STREAM_STOP); } + mutex_unlock(&pcm_mutex); } @@ -553,22 +553,19 @@ static void close_delayed_work(struct work_struct *work) static int soc_codec_close(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_card *card = socdev->card; - struct snd_soc_dai_link *machine = rtd->dai; - struct snd_soc_platform *platform = card->platform; - struct snd_soc_dai *cpu_dai = machine->cpu_dai; - struct snd_soc_dai *codec_dai = machine->codec_dai; - struct snd_soc_codec *codec = card->codec; + struct snd_soc_platform *platform = rtd->platform; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_codec *codec = rtd->codec; mutex_lock(&pcm_mutex); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - cpu_dai->playback.active--; - codec_dai->playback.active--; + cpu_dai->playback_active--; + codec_dai->playback_active--; } else { - cpu_dai->capture.active--; - codec_dai->capture.active--; + cpu_dai->capture_active--; + codec_dai->capture_active--; } cpu_dai->active--; @@ -581,27 +578,28 @@ static int soc_codec_close(struct snd_pcm_substream *substream) if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) snd_soc_dai_digital_mute(codec_dai, 1); - if (cpu_dai->ops->shutdown) - cpu_dai->ops->shutdown(substream, cpu_dai); + if (cpu_dai->driver->ops->shutdown) + cpu_dai->driver->ops->shutdown(substream, cpu_dai); - if (codec_dai->ops->shutdown) - codec_dai->ops->shutdown(substream, codec_dai); + if (codec_dai->driver->ops->shutdown) + codec_dai->driver->ops->shutdown(substream, codec_dai); - if (machine->ops && machine->ops->shutdown) - machine->ops->shutdown(substream); + if (rtd->dai_link->ops && rtd->dai_link->ops->shutdown) + rtd->dai_link->ops->shutdown(substream); - if (platform->pcm_ops->close) - platform->pcm_ops->close(substream); + if (platform->driver->ops->close) + platform->driver->ops->close(substream); + cpu_dai->runtime = NULL; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { /* start delayed pop wq here for playback streams */ codec_dai->pop_wait = 1; - schedule_delayed_work(&card->delayed_work, - msecs_to_jiffies(card->pmdown_time)); + schedule_delayed_work(&rtd->delayed_work, + msecs_to_jiffies(rtd->pmdown_time)); } else { /* capture streams can be powered down now */ - snd_soc_dapm_stream_event(codec, - codec_dai->capture.stream_name, + snd_soc_dapm_stream_event(rtd, + codec_dai->driver->capture.stream_name, SND_SOC_DAPM_STREAM_STOP); } @@ -617,43 +615,39 @@ static int soc_codec_close(struct snd_pcm_substream *substream) static int soc_pcm_prepare(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_card *card = socdev->card; - struct snd_soc_dai_link *machine = rtd->dai; - struct snd_soc_platform *platform = card->platform; - struct snd_soc_dai *cpu_dai = machine->cpu_dai; - struct snd_soc_dai *codec_dai = machine->codec_dai; - struct snd_soc_codec *codec = card->codec; + struct snd_soc_platform *platform = rtd->platform; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; int ret = 0; mutex_lock(&pcm_mutex); - if (machine->ops && machine->ops->prepare) { - ret = machine->ops->prepare(substream); + if (rtd->dai_link->ops && rtd->dai_link->ops->prepare) { + ret = rtd->dai_link->ops->prepare(substream); if (ret < 0) { printk(KERN_ERR "asoc: machine prepare error\n"); goto out; } } - if (platform->pcm_ops->prepare) { - ret = platform->pcm_ops->prepare(substream); + if (platform->driver->ops->prepare) { + ret = platform->driver->ops->prepare(substream); if (ret < 0) { printk(KERN_ERR "asoc: platform prepare error\n"); goto out; } } - if (codec_dai->ops->prepare) { - ret = codec_dai->ops->prepare(substream, codec_dai); + if (codec_dai->driver->ops->prepare) { + ret = codec_dai->driver->ops->prepare(substream, codec_dai); if (ret < 0) { printk(KERN_ERR "asoc: codec DAI prepare error\n"); goto out; } } - if (cpu_dai->ops->prepare) { - ret = cpu_dai->ops->prepare(substream, cpu_dai); + if (cpu_dai->driver->ops->prepare) { + ret = cpu_dai->driver->ops->prepare(substream, cpu_dai); if (ret < 0) { printk(KERN_ERR "asoc: cpu DAI prepare error\n"); goto out; @@ -664,16 +658,16 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream) if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && codec_dai->pop_wait) { codec_dai->pop_wait = 0; - cancel_delayed_work(&card->delayed_work); + cancel_delayed_work(&rtd->delayed_work); } if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - snd_soc_dapm_stream_event(codec, - codec_dai->playback.stream_name, + snd_soc_dapm_stream_event(rtd, + codec_dai->driver->playback.stream_name, SND_SOC_DAPM_STREAM_START); else - snd_soc_dapm_stream_event(codec, - codec_dai->capture.stream_name, + snd_soc_dapm_stream_event(rtd, + codec_dai->driver->capture.stream_name, SND_SOC_DAPM_STREAM_START); snd_soc_dai_digital_mute(codec_dai, 0); @@ -692,26 +686,23 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_dai_link *machine = rtd->dai; - struct snd_soc_card *card = socdev->card; - struct snd_soc_platform *platform = card->platform; - struct snd_soc_dai *cpu_dai = machine->cpu_dai; - struct snd_soc_dai *codec_dai = machine->codec_dai; + struct snd_soc_platform *platform = rtd->platform; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; int ret = 0; mutex_lock(&pcm_mutex); - if (machine->ops && machine->ops->hw_params) { - ret = machine->ops->hw_params(substream, params); + if (rtd->dai_link->ops && rtd->dai_link->ops->hw_params) { + ret = rtd->dai_link->ops->hw_params(substream, params); if (ret < 0) { printk(KERN_ERR "asoc: machine hw_params failed\n"); goto out; } } - if (codec_dai->ops->hw_params) { - ret = codec_dai->ops->hw_params(substream, params, codec_dai); + if (codec_dai->driver->ops->hw_params) { + ret = codec_dai->driver->ops->hw_params(substream, params, codec_dai); if (ret < 0) { printk(KERN_ERR "asoc: can't set codec %s hw params\n", codec_dai->name); @@ -719,8 +710,8 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream, } } - if (cpu_dai->ops->hw_params) { - ret = cpu_dai->ops->hw_params(substream, params, cpu_dai); + if (cpu_dai->driver->ops->hw_params) { + ret = cpu_dai->driver->ops->hw_params(substream, params, cpu_dai); if (ret < 0) { printk(KERN_ERR "asoc: interface %s hw params failed\n", cpu_dai->name); @@ -728,8 +719,8 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream, } } - if (platform->pcm_ops->hw_params) { - ret = platform->pcm_ops->hw_params(substream, params); + if (platform->driver->ops->hw_params) { + ret = platform->driver->ops->hw_params(substream, params); if (ret < 0) { printk(KERN_ERR "asoc: platform %s hw params failed\n", platform->name); @@ -737,23 +728,23 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream, } } - machine->rate = params_rate(params); + rtd->rate = params_rate(params); out: mutex_unlock(&pcm_mutex); return ret; platform_err: - if (cpu_dai->ops->hw_free) - cpu_dai->ops->hw_free(substream, cpu_dai); + if (cpu_dai->driver->ops->hw_free) + cpu_dai->driver->ops->hw_free(substream, cpu_dai); interface_err: - if (codec_dai->ops->hw_free) - codec_dai->ops->hw_free(substream, codec_dai); + if (codec_dai->driver->ops->hw_free) + codec_dai->driver->ops->hw_free(substream, codec_dai); codec_err: - if (machine->ops && machine->ops->hw_free) - machine->ops->hw_free(substream); + if (rtd->dai_link->ops && rtd->dai_link->ops->hw_free) + rtd->dai_link->ops->hw_free(substream); mutex_unlock(&pcm_mutex); return ret; @@ -765,13 +756,10 @@ codec_err: static int soc_pcm_hw_free(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_dai_link *machine = rtd->dai; - struct snd_soc_card *card = socdev->card; - struct snd_soc_platform *platform = card->platform; - struct snd_soc_dai *cpu_dai = machine->cpu_dai; - struct snd_soc_dai *codec_dai = machine->codec_dai; - struct snd_soc_codec *codec = card->codec; + struct snd_soc_platform *platform = rtd->platform; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_codec *codec = rtd->codec; mutex_lock(&pcm_mutex); @@ -780,19 +768,19 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream) snd_soc_dai_digital_mute(codec_dai, 1); /* free any machine hw params */ - if (machine->ops && machine->ops->hw_free) - machine->ops->hw_free(substream); + if (rtd->dai_link->ops && rtd->dai_link->ops->hw_free) + rtd->dai_link->ops->hw_free(substream); /* free any DMA resources */ - if (platform->pcm_ops->hw_free) - platform->pcm_ops->hw_free(substream); + if (platform->driver->ops->hw_free) + platform->driver->ops->hw_free(substream); /* now free hw params for the DAI's */ - if (codec_dai->ops->hw_free) - codec_dai->ops->hw_free(substream, codec_dai); + if (codec_dai->driver->ops->hw_free) + codec_dai->driver->ops->hw_free(substream, codec_dai); - if (cpu_dai->ops->hw_free) - cpu_dai->ops->hw_free(substream, cpu_dai); + if (cpu_dai->driver->ops->hw_free) + cpu_dai->driver->ops->hw_free(substream, cpu_dai); mutex_unlock(&pcm_mutex); return 0; @@ -801,28 +789,25 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream) static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_card *card= socdev->card; - struct snd_soc_dai_link *machine = rtd->dai; - struct snd_soc_platform *platform = card->platform; - struct snd_soc_dai *cpu_dai = machine->cpu_dai; - struct snd_soc_dai *codec_dai = machine->codec_dai; + struct snd_soc_platform *platform = rtd->platform; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; int ret; - if (codec_dai->ops->trigger) { - ret = codec_dai->ops->trigger(substream, cmd, codec_dai); + if (codec_dai->driver->ops->trigger) { + ret = codec_dai->driver->ops->trigger(substream, cmd, codec_dai); if (ret < 0) return ret; } - if (platform->pcm_ops->trigger) { - ret = platform->pcm_ops->trigger(substream, cmd); + if (platform->driver->ops->trigger) { + ret = platform->driver->ops->trigger(substream, cmd); if (ret < 0) return ret; } - if (cpu_dai->ops->trigger) { - ret = cpu_dai->ops->trigger(substream, cmd, cpu_dai); + if (cpu_dai->driver->ops->trigger) { + ret = cpu_dai->driver->ops->trigger(substream, cmd, cpu_dai); if (ret < 0) return ret; } @@ -837,27 +822,24 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd) static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_card *card = socdev->card; - struct snd_soc_platform *platform = card->platform; - struct snd_soc_dai_link *machine = rtd->dai; - struct snd_soc_dai *cpu_dai = machine->cpu_dai; - struct snd_soc_dai *codec_dai = machine->codec_dai; + struct snd_soc_platform *platform = rtd->platform; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; struct snd_pcm_runtime *runtime = substream->runtime; snd_pcm_uframes_t offset = 0; snd_pcm_sframes_t delay = 0; - if (platform->pcm_ops->pointer) - offset = platform->pcm_ops->pointer(substream); + if (platform->driver->ops->pointer) + offset = platform->driver->ops->pointer(substream); - if (cpu_dai->ops->delay) - delay += cpu_dai->ops->delay(substream, cpu_dai); + if (cpu_dai->driver->ops->delay) + delay += cpu_dai->driver->ops->delay(substream, cpu_dai); - if (codec_dai->ops->delay) - delay += codec_dai->ops->delay(substream, codec_dai); + if (codec_dai->driver->ops->delay) + delay += codec_dai->driver->ops->delay(substream, codec_dai); - if (platform->delay) - delay += platform->delay(substream, codec_dai); + if (platform->driver->delay) + delay += platform->driver->delay(substream, codec_dai); runtime->delay = delay; @@ -880,104 +862,111 @@ static struct snd_pcm_ops soc_pcm_ops = { static int soc_suspend(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_card *card = socdev->card; - struct snd_soc_platform *platform = card->platform; - struct snd_soc_codec_device *codec_dev = socdev->codec_dev; - struct snd_soc_codec *codec = card->codec; + struct snd_soc_card *card = platform_get_drvdata(pdev); int i; /* If the initialization of this soc device failed, there is no codec * associated with it. Just bail out in this case. */ - if (!codec) + if (list_empty(&card->codec_dev_list)) return 0; /* Due to the resume being scheduled into a workqueue we could * suspend before that's finished - wait for it to complete. */ - snd_power_lock(codec->card); - snd_power_wait(codec->card, SNDRV_CTL_POWER_D0); - snd_power_unlock(codec->card); + snd_power_lock(card->snd_card); + snd_power_wait(card->snd_card, SNDRV_CTL_POWER_D0); + snd_power_unlock(card->snd_card); /* we're going to block userspace touching us until resume completes */ - snd_power_change_state(codec->card, SNDRV_CTL_POWER_D3hot); + snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D3hot); /* mute any active DAC's */ - for (i = 0; i < card->num_links; i++) { - struct snd_soc_dai *dai = card->dai_link[i].codec_dai; + for (i = 0; i < card->num_rtd; i++) { + struct snd_soc_dai *dai = card->rtd[i].codec_dai; + struct snd_soc_dai_driver *drv = dai->driver; - if (card->dai_link[i].ignore_suspend) + if (card->rtd[i].dai_link->ignore_suspend) continue; - if (dai->ops->digital_mute && dai->playback.active) - dai->ops->digital_mute(dai, 1); + if (drv->ops->digital_mute && dai->playback_active) + drv->ops->digital_mute(dai, 1); } /* suspend all pcms */ - for (i = 0; i < card->num_links; i++) { - if (card->dai_link[i].ignore_suspend) + for (i = 0; i < card->num_rtd; i++) { + if (card->rtd[i].dai_link->ignore_suspend) continue; - snd_pcm_suspend_all(card->dai_link[i].pcm); + snd_pcm_suspend_all(card->rtd[i].pcm); } if (card->suspend_pre) card->suspend_pre(pdev, PMSG_SUSPEND); - for (i = 0; i < card->num_links; i++) { - struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai; + for (i = 0; i < card->num_rtd; i++) { + struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai; + struct snd_soc_platform *platform = card->rtd[i].platform; - if (card->dai_link[i].ignore_suspend) + if (card->rtd[i].dai_link->ignore_suspend) continue; - if (cpu_dai->suspend && !cpu_dai->ac97_control) - cpu_dai->suspend(cpu_dai); - if (platform->suspend) - platform->suspend(&card->dai_link[i]); + if (cpu_dai->driver->suspend && !cpu_dai->driver->ac97_control) + cpu_dai->driver->suspend(cpu_dai); + if (platform->driver->suspend && !platform->suspended) { + platform->driver->suspend(cpu_dai); + platform->suspended = 1; + } } /* close any waiting streams and save state */ - run_delayed_work(&card->delayed_work); - codec->suspend_bias_level = codec->bias_level; + for (i = 0; i < card->num_rtd; i++) { + run_delayed_work(&card->rtd[i].delayed_work); + card->rtd[i].codec->suspend_bias_level = card->rtd[i].codec->bias_level; + } - for (i = 0; i < codec->num_dai; i++) { - char *stream = codec->dai[i].playback.stream_name; + for (i = 0; i < card->num_rtd; i++) { + struct snd_soc_dai_driver *driver = card->rtd[i].codec_dai->driver; - if (card->dai_link[i].ignore_suspend) + if (card->rtd[i].dai_link->ignore_suspend) continue; - if (stream != NULL) - snd_soc_dapm_stream_event(codec, stream, + if (driver->playback.stream_name != NULL) + snd_soc_dapm_stream_event(&card->rtd[i], driver->playback.stream_name, SND_SOC_DAPM_STREAM_SUSPEND); - stream = codec->dai[i].capture.stream_name; - if (stream != NULL) - snd_soc_dapm_stream_event(codec, stream, + + if (driver->capture.stream_name != NULL) + snd_soc_dapm_stream_event(&card->rtd[i], driver->capture.stream_name, SND_SOC_DAPM_STREAM_SUSPEND); } - /* If there are paths active then the CODEC will be held with - * bias _ON and should not be suspended. */ - if (codec_dev->suspend) { - switch (codec->bias_level) { - case SND_SOC_BIAS_STANDBY: - case SND_SOC_BIAS_OFF: - codec_dev->suspend(pdev, PMSG_SUSPEND); - break; - default: - dev_dbg(socdev->dev, "CODEC is on over suspend\n"); - break; + /* suspend all CODECs */ + for (i = 0; i < card->num_rtd; i++) { + struct snd_soc_codec *codec = card->rtd[i].codec; + /* If there are paths active then the CODEC will be held with + * bias _ON and should not be suspended. */ + if (!codec->suspended && codec->driver->suspend) { + switch (codec->bias_level) { + case SND_SOC_BIAS_STANDBY: + case SND_SOC_BIAS_OFF: + codec->driver->suspend(codec, PMSG_SUSPEND); + codec->suspended = 1; + break; + default: + dev_dbg(codec->dev, "CODEC is on over suspend\n"); + break; + } } } - for (i = 0; i < card->num_links; i++) { - struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai; + for (i = 0; i < card->num_rtd; i++) { + struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai; - if (card->dai_link[i].ignore_suspend) + if (card->rtd[i].dai_link->ignore_suspend) continue; - if (cpu_dai->suspend && cpu_dai->ac97_control) - cpu_dai->suspend(cpu_dai); + if (cpu_dai->driver->suspend && cpu_dai->driver->ac97_control) + cpu_dai->driver->suspend(cpu_dai); } if (card->suspend_post) @@ -991,127 +980,127 @@ static int soc_suspend(struct device *dev) */ static void soc_resume_deferred(struct work_struct *work) { - struct snd_soc_card *card = container_of(work, - struct snd_soc_card, - deferred_resume_work); - struct snd_soc_device *socdev = card->socdev; - struct snd_soc_platform *platform = card->platform; - struct snd_soc_codec_device *codec_dev = socdev->codec_dev; - struct snd_soc_codec *codec = card->codec; - struct platform_device *pdev = to_platform_device(socdev->dev); + struct snd_soc_card *card = + container_of(work, struct snd_soc_card, deferred_resume_work); + struct platform_device *pdev = to_platform_device(card->dev); int i; /* our power state is still SNDRV_CTL_POWER_D3hot from suspend time, * so userspace apps are blocked from touching us */ - dev_dbg(socdev->dev, "starting resume work\n"); + dev_dbg(card->dev, "starting resume work\n"); /* Bring us up into D2 so that DAPM starts enabling things */ - snd_power_change_state(codec->card, SNDRV_CTL_POWER_D2); + snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D2); if (card->resume_pre) card->resume_pre(pdev); - for (i = 0; i < card->num_links; i++) { - struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai; + /* resume AC97 DAIs */ + for (i = 0; i < card->num_rtd; i++) { + struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai; - if (card->dai_link[i].ignore_suspend) + if (card->rtd[i].dai_link->ignore_suspend) continue; - if (cpu_dai->resume && cpu_dai->ac97_control) - cpu_dai->resume(cpu_dai); - } - - /* If the CODEC was idle over suspend then it will have been - * left with bias OFF or STANDBY and suspended so we must now - * resume. Otherwise the suspend was suppressed. - */ - if (codec_dev->resume) { - switch (codec->bias_level) { - case SND_SOC_BIAS_STANDBY: - case SND_SOC_BIAS_OFF: - codec_dev->resume(pdev); - break; - default: - dev_dbg(socdev->dev, "CODEC was on over suspend\n"); - break; + if (cpu_dai->driver->resume && cpu_dai->driver->ac97_control) + cpu_dai->driver->resume(cpu_dai); + } + + for (i = 0; i < card->num_rtd; i++) { + struct snd_soc_codec *codec = card->rtd[i].codec; + /* If the CODEC was idle over suspend then it will have been + * left with bias OFF or STANDBY and suspended so we must now + * resume. Otherwise the suspend was suppressed. + */ + if (codec->driver->resume && codec->suspended) { + switch (codec->bias_level) { + case SND_SOC_BIAS_STANDBY: + case SND_SOC_BIAS_OFF: + codec->driver->resume(codec); + codec->suspended = 0; + break; + default: + dev_dbg(codec->dev, "CODEC was on over suspend\n"); + break; + } } } - for (i = 0; i < codec->num_dai; i++) { - char *stream = codec->dai[i].playback.stream_name; + for (i = 0; i < card->num_rtd; i++) { + struct snd_soc_dai_driver *driver = card->rtd[i].codec_dai->driver; - if (card->dai_link[i].ignore_suspend) + if (card->rtd[i].dai_link->ignore_suspend) continue; - if (stream != NULL) - snd_soc_dapm_stream_event(codec, stream, + if (driver->playback.stream_name != NULL) + snd_soc_dapm_stream_event(&card->rtd[i], driver->playback.stream_name, SND_SOC_DAPM_STREAM_RESUME); - stream = codec->dai[i].capture.stream_name; - if (stream != NULL) - snd_soc_dapm_stream_event(codec, stream, + + if (driver->capture.stream_name != NULL) + snd_soc_dapm_stream_event(&card->rtd[i], driver->capture.stream_name, SND_SOC_DAPM_STREAM_RESUME); } /* unmute any active DACs */ - for (i = 0; i < card->num_links; i++) { - struct snd_soc_dai *dai = card->dai_link[i].codec_dai; + for (i = 0; i < card->num_rtd; i++) { + struct snd_soc_dai *dai = card->rtd[i].codec_dai; + struct snd_soc_dai_driver *drv = dai->driver; - if (card->dai_link[i].ignore_suspend) + if (card->rtd[i].dai_link->ignore_suspend) continue; - if (dai->ops->digital_mute && dai->playback.active) - dai->ops->digital_mute(dai, 0); + if (drv->ops->digital_mute && dai->playback_active) + drv->ops->digital_mute(dai, 0); } - for (i = 0; i < card->num_links; i++) { - struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai; + for (i = 0; i < card->num_rtd; i++) { + struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai; + struct snd_soc_platform *platform = card->rtd[i].platform; - if (card->dai_link[i].ignore_suspend) + if (card->rtd[i].dai_link->ignore_suspend) continue; - if (cpu_dai->resume && !cpu_dai->ac97_control) - cpu_dai->resume(cpu_dai); - if (platform->resume) - platform->resume(&card->dai_link[i]); + if (cpu_dai->driver->resume && !cpu_dai->driver->ac97_control) + cpu_dai->driver->resume(cpu_dai); + if (platform->driver->resume && platform->suspended) { + platform->driver->resume(cpu_dai); + platform->suspended = 0; + } } if (card->resume_post) card->resume_post(pdev); - dev_dbg(socdev->dev, "resume work completed\n"); + dev_dbg(card->dev, "resume work completed\n"); /* userspace can access us now we are back as we were before */ - snd_power_change_state(codec->card, SNDRV_CTL_POWER_D0); + snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D0); } /* powers up audio subsystem after a suspend */ static int soc_resume(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_card *card = socdev->card; - struct snd_soc_dai *cpu_dai = card->dai_link[0].cpu_dai; - - /* If the initialization of this soc device failed, there is no codec - * associated with it. Just bail out in this case. - */ - if (!card->codec) - return 0; + struct snd_soc_card *card = platform_get_drvdata(pdev); + int i; /* AC97 devices might have other drivers hanging off them so * need to resume immediately. Other drivers don't have that * problem and may take a substantial amount of time to resume * due to I/O costs and anti-pop so handle them out of line. */ - if (cpu_dai->ac97_control) { - dev_dbg(socdev->dev, "Resuming AC97 immediately\n"); - soc_resume_deferred(&card->deferred_resume_work); - } else { - dev_dbg(socdev->dev, "Scheduling resume work\n"); - if (!schedule_work(&card->deferred_resume_work)) - dev_err(socdev->dev, "resume work item may be lost\n"); + for (i = 0; i < card->num_rtd; i++) { + struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai; + if (cpu_dai->driver->ac97_control) { + dev_dbg(dev, "Resuming AC97 immediately\n"); + soc_resume_deferred(&card->deferred_resume_work); + } else { + dev_dbg(dev, "Scheduling resume work\n"); + if (!schedule_work(&card->deferred_resume_work)) + dev_err(dev, "resume work item may be lost\n"); + } } return 0; @@ -1124,198 +1113,429 @@ static int soc_resume(struct device *dev) static struct snd_soc_dai_ops null_dai_ops = { }; -static void snd_soc_instantiate_card(struct snd_soc_card *card) +static int soc_bind_dai_link(struct snd_soc_card *card, int num) { - struct platform_device *pdev = container_of(card->dev, - struct platform_device, - dev); - struct snd_soc_codec_device *codec_dev = card->socdev->codec_dev; + struct snd_soc_dai_link *dai_link = &card->dai_link[num]; + struct snd_soc_pcm_runtime *rtd = &card->rtd[num]; struct snd_soc_codec *codec; struct snd_soc_platform *platform; - struct snd_soc_dai *dai; - int i, found, ret, ac97; + struct snd_soc_dai *codec_dai, *cpu_dai; - if (card->instantiated) - return; + if (rtd->complete) + return 1; + dev_dbg(card->dev, "binding %s at idx %d\n", dai_link->name, num); - found = 0; - list_for_each_entry(platform, &platform_list, list) - if (card->platform == platform) { - found = 1; - break; + /* do we already have the CPU DAI for this link ? */ + if (rtd->cpu_dai) { + goto find_codec; + } + /* no, then find CPU DAI from registered DAIs*/ + list_for_each_entry(cpu_dai, &dai_list, list) { + if (!strcmp(cpu_dai->name, dai_link->cpu_dai_name)) { + + if (!try_module_get(cpu_dai->dev->driver->owner)) + return -ENODEV; + + rtd->cpu_dai = cpu_dai; + goto find_codec; } - if (!found) { - dev_dbg(card->dev, "Platform %s not registered\n", - card->platform->name); - return; } + dev_dbg(card->dev, "CPU DAI %s not registered\n", + dai_link->cpu_dai_name); - ac97 = 0; - for (i = 0; i < card->num_links; i++) { - found = 0; - list_for_each_entry(dai, &dai_list, list) - if (card->dai_link[i].cpu_dai == dai) { - found = 1; - break; +find_codec: + /* do we already have the CODEC for this link ? */ + if (rtd->codec) { + goto find_platform; + } + + /* no, then find CODEC from registered CODECs*/ + list_for_each_entry(codec, &codec_list, list) { + if (!strcmp(codec->name, dai_link->codec_name)) { + rtd->codec = codec; + + if (!try_module_get(codec->dev->driver->owner)) + return -ENODEV; + + /* CODEC found, so find CODEC DAI from registered DAIs from this CODEC*/ + list_for_each_entry(codec_dai, &dai_list, list) { + if (codec->dev == codec_dai->dev && + !strcmp(codec_dai->name, dai_link->codec_dai_name)) { + rtd->codec_dai = codec_dai; + goto find_platform; + } } - if (!found) { - dev_dbg(card->dev, "DAI %s not registered\n", - card->dai_link[i].cpu_dai->name); - return; + dev_dbg(card->dev, "CODEC DAI %s not registered\n", + dai_link->codec_dai_name); + + goto find_platform; } + } + dev_dbg(card->dev, "CODEC %s not registered\n", + dai_link->codec_name); - if (card->dai_link[i].cpu_dai->ac97_control) - ac97 = 1; +find_platform: + /* do we already have the CODEC DAI for this link ? */ + if (rtd->platform) { + goto out; } + /* no, then find CPU DAI from registered DAIs*/ + list_for_each_entry(platform, &platform_list, list) { + if (!strcmp(platform->name, dai_link->platform_name)) { - for (i = 0; i < card->num_links; i++) { - if (!card->dai_link[i].codec_dai->ops) - card->dai_link[i].codec_dai->ops = &null_dai_ops; + if (!try_module_get(platform->dev->driver->owner)) + return -ENODEV; + + rtd->platform = platform; + goto out; + } } - /* If we have AC97 in the system then don't wait for the - * codec. This will need revisiting if we have to handle - * systems with mixed AC97 and non-AC97 parts. Only check for - * DAIs currently; we can't do this per link since some AC97 - * codecs have non-AC97 DAIs. - */ - if (!ac97) - for (i = 0; i < card->num_links; i++) { - found = 0; - list_for_each_entry(dai, &dai_list, list) - if (card->dai_link[i].codec_dai == dai) { - found = 1; - break; - } - if (!found) { - dev_dbg(card->dev, "DAI %s not registered\n", - card->dai_link[i].codec_dai->name); - return; - } + dev_dbg(card->dev, "platform %s not registered\n", + dai_link->platform_name); + return 0; + +out: + /* mark rtd as complete if we found all 4 of our client devices */ + if (rtd->codec && rtd->codec_dai && rtd->platform && rtd->cpu_dai) { + rtd->complete = 1; + card->num_rtd++; + } + return 1; +} + +static void soc_remove_dai_link(struct snd_soc_card *card, int num) +{ + struct snd_soc_pcm_runtime *rtd = &card->rtd[num]; + struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_platform *platform = rtd->platform; + struct snd_soc_dai *codec_dai = rtd->codec_dai, *cpu_dai = rtd->cpu_dai; + int err; + + /* unregister the rtd device */ + if (rtd->dev_registered) { + device_remove_file(&rtd->dev, &dev_attr_pmdown_time); + device_unregister(&rtd->dev); + rtd->dev_registered = 0; + } + + /* remove the CODEC DAI */ + if (codec_dai && codec_dai->probed) { + if (codec_dai->driver->remove) { + err = codec_dai->driver->remove(codec_dai); + if (err < 0) + printk(KERN_ERR "asoc: failed to remove %s\n", codec_dai->name); } + codec_dai->probed = 0; + list_del(&codec_dai->card_list); + } - /* Note that we do not current check for codec components */ + /* remove the platform */ + if (platform && platform->probed) { + if (platform->driver->remove) { + err = platform->driver->remove(platform); + if (err < 0) + printk(KERN_ERR "asoc: failed to remove %s\n", platform->name); + } + platform->probed = 0; + list_del(&platform->card_list); + module_put(platform->dev->driver->owner); + } - dev_dbg(card->dev, "All components present, instantiating\n"); + /* remove the CODEC */ + if (codec && codec->probed) { + if (codec->driver->remove) { + err = codec->driver->remove(codec); + if (err < 0) + printk(KERN_ERR "asoc: failed to remove %s\n", codec->name); + } - /* Found everything, bring it up */ - card->pmdown_time = pmdown_time; + /* Make sure all DAPM widgets are freed */ + snd_soc_dapm_free(codec); - if (card->probe) { - ret = card->probe(pdev); - if (ret < 0) - return; + soc_cleanup_codec_debugfs(codec); + device_remove_file(&rtd->dev, &dev_attr_codec_reg); + codec->probed = 0; + list_del(&codec->card_list); + module_put(codec->dev->driver->owner); } - for (i = 0; i < card->num_links; i++) { - struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai; - if (cpu_dai->probe) { - ret = cpu_dai->probe(pdev, cpu_dai); - if (ret < 0) - goto cpu_dai_err; + /* remove the cpu_dai */ + if (cpu_dai && cpu_dai->probed) { + if (cpu_dai->driver->remove) { + err = cpu_dai->driver->remove(cpu_dai); + if (err < 0) + printk(KERN_ERR "asoc: failed to remove %s\n", cpu_dai->name); } + cpu_dai->probed = 0; + list_del(&cpu_dai->card_list); + module_put(cpu_dai->dev->driver->owner); } +} - if (codec_dev->probe) { - ret = codec_dev->probe(pdev); - if (ret < 0) - goto cpu_dai_err; +static void rtd_release(struct device *dev) {} + +static int soc_probe_dai_link(struct snd_soc_card *card, int num) +{ + struct snd_soc_dai_link *dai_link = &card->dai_link[num]; + struct snd_soc_pcm_runtime *rtd = &card->rtd[num]; + struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_platform *platform = rtd->platform; + struct snd_soc_dai *codec_dai = rtd->codec_dai, *cpu_dai = rtd->cpu_dai; + int ret; + + dev_dbg(card->dev, "probe %s dai link %d\n", card->name, num); + + /* config components */ + codec_dai->codec = codec; + codec->card = card; + cpu_dai->platform = platform; + rtd->card = card; + rtd->dev.parent = card->dev; + codec_dai->card = card; + cpu_dai->card = card; + + /* set default power off timeout */ + rtd->pmdown_time = pmdown_time; + + /* probe the cpu_dai */ + if (!cpu_dai->probed) { + if (cpu_dai->driver->probe) { + ret = cpu_dai->driver->probe(cpu_dai); + if (ret < 0) { + printk(KERN_ERR "asoc: failed to probe CPU DAI %s\n", + cpu_dai->name); + return ret; + } + } + cpu_dai->probed = 1; + /* mark cpu_dai as probed and add to card cpu_dai list */ + list_add(&cpu_dai->card_list, &card->dai_dev_list); } - codec = card->codec; - if (platform->probe) { - ret = platform->probe(pdev); - if (ret < 0) - goto platform_err; + /* probe the CODEC */ + if (!codec->probed) { + if (codec->driver->probe) { + ret = codec->driver->probe(codec); + if (ret < 0) { + printk(KERN_ERR "asoc: failed to probe CODEC %s\n", + codec->name); + return ret; + } + } + /* mark codec as probed and add to card codec list */ + codec->probed = 1; + list_add(&codec->card_list, &card->codec_dev_list); } - /* DAPM stream work */ - INIT_DELAYED_WORK(&card->delayed_work, close_delayed_work); -#ifdef CONFIG_PM - /* deferred resume work */ - INIT_WORK(&card->deferred_resume_work, soc_resume_deferred); -#endif + /* probe the platform */ + if (!platform->probed) { + if (platform->driver->probe) { + ret = platform->driver->probe(platform); + if (ret < 0) { + printk(KERN_ERR "asoc: failed to probe platform %s\n", + platform->name); + return ret; + } + } + /* mark platform as probed and add to card platform list */ + platform->probed = 1; + list_add(&platform->card_list, &card->platform_dev_list); + } - for (i = 0; i < card->num_links; i++) { - if (card->dai_link[i].init) { - ret = card->dai_link[i].init(codec); + /* probe the CODEC DAI */ + if (!codec_dai->probed) { + if (codec_dai->driver->probe) { + ret = codec_dai->driver->probe(codec_dai); if (ret < 0) { - printk(KERN_ERR "asoc: failed to init %s\n", - card->dai_link[i].stream_name); - continue; + printk(KERN_ERR "asoc: failed to probe CODEC DAI %s\n", + codec_dai->name); + return ret; } } - if (card->dai_link[i].codec_dai->ac97_control) - ac97 = 1; + + /* mark cpu_dai as probed and add to card cpu_dai list */ + codec_dai->probed = 1; + list_add(&codec_dai->card_list, &card->dai_dev_list); } - snprintf(codec->card->shortname, sizeof(codec->card->shortname), - "%s", card->name); - snprintf(codec->card->longname, sizeof(codec->card->longname), - "%s (%s)", card->name, codec->name); + /* DAPM dai link stream work */ + INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work); + + /* now that all clients have probed, initialise the DAI link */ + if (dai_link->init) { + ret = dai_link->init(rtd); + if (ret < 0) { + printk(KERN_ERR "asoc: failed to init %s\n", dai_link->stream_name); + return ret; + } + } /* Make sure all DAPM widgets are instantiated */ snd_soc_dapm_new_widgets(codec); + snd_soc_dapm_sync(codec); - ret = snd_card_register(codec->card); + /* register the rtd device */ + rtd->dev.init_name = rtd->dai_link->stream_name; + rtd->dev.release = rtd_release; + rtd->dev.init_name = dai_link->name; + ret = device_register(&rtd->dev); if (ret < 0) { - printk(KERN_ERR "asoc: failed to register soundcard for %s\n", - codec->name); - goto card_err; + printk(KERN_ERR "asoc: failed to register DAI runtime device %d\n", ret); + return ret; } - mutex_lock(&codec->mutex); + rtd->dev_registered = 1; + ret = device_create_file(&rtd->dev, &dev_attr_pmdown_time); + if (ret < 0) + printk(KERN_WARNING "asoc: failed to add pmdown_time sysfs\n"); + + /* add DAPM sysfs entries for this codec */ + ret = snd_soc_dapm_sys_add(&rtd->dev); + if (ret < 0) + printk(KERN_WARNING "asoc: failed to add codec dapm sysfs entries\n"); + + /* add codec sysfs entries */ + ret = device_create_file(&rtd->dev, &dev_attr_codec_reg); + if (ret < 0) + printk(KERN_WARNING "asoc: failed to add codec sysfs files\n"); + + soc_init_codec_debugfs(codec); + + /* create the pcm */ + ret = soc_new_pcm(rtd, num); + if (ret < 0) { + printk(KERN_ERR "asoc: can't create pcm %s\n", dai_link->stream_name); + return ret; + } + + /* add platform data for AC97 devices */ + if (rtd->codec_dai->driver->ac97_control) + snd_ac97_dev_add_pdata(codec->ac97, rtd->cpu_dai->ac97_pdata); + + return 0; +} + #ifdef CONFIG_SND_SOC_AC97_BUS +static int soc_register_ac97_dai_link(struct snd_soc_pcm_runtime *rtd) +{ + int ret; + /* Only instantiate AC97 if not already done by the adaptor * for the generic AC97 subsystem. */ - if (ac97 && strcmp(codec->name, "AC97") != 0) { - ret = soc_ac97_dev_register(codec); + if (rtd->codec_dai->driver->ac97_control && !rtd->codec->ac97_registered) { + + ret = soc_ac97_dev_register(rtd->codec); if (ret < 0) { printk(KERN_ERR "asoc: AC97 device register failed\n"); - snd_card_free(codec->card); - mutex_unlock(&codec->mutex); - goto card_err; + return ret; } + + rtd->codec->ac97_registered = 1; } + return 0; +} + +static void soc_unregister_ac97_dai_link(struct snd_soc_codec *codec) +{ + if (codec->ac97_registered) { + soc_ac97_dev_unregister(codec); + codec->ac97_registered = 0; + } +} #endif - ret = snd_soc_dapm_sys_add(card->socdev->dev); - if (ret < 0) - printk(KERN_WARNING "asoc: failed to add dapm sysfs entries\n"); +static void snd_soc_instantiate_card(struct snd_soc_card *card) +{ + struct platform_device *pdev = to_platform_device(card->dev); + int ret, i; - ret = device_create_file(card->socdev->dev, &dev_attr_pmdown_time); - if (ret < 0) - printk(KERN_WARNING "asoc: failed to add pmdown_time sysfs\n"); + mutex_lock(&card->mutex); - ret = device_create_file(card->socdev->dev, &dev_attr_codec_reg); - if (ret < 0) - printk(KERN_WARNING "asoc: failed to add codec sysfs files\n"); + if (card->instantiated) { + mutex_unlock(&card->mutex); + return; + } - soc_init_codec_debugfs(codec); - mutex_unlock(&codec->mutex); + /* bind DAIs */ + for (i = 0; i < card->num_links; i++) + soc_bind_dai_link(card, i); - card->instantiated = 1; + /* bind completed ? */ + if (card->num_rtd != card->num_links) { + mutex_unlock(&card->mutex); + return; + } - return; + /* card bind complete so register a sound card */ + ret = snd_card_create(SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, + card->owner, 0, &card->snd_card); + if (ret < 0) { + printk(KERN_ERR "asoc: can't create sound card for card %s\n", + card->name); + mutex_unlock(&card->mutex); + return; + } + card->snd_card->dev = card->dev; + +#ifdef CONFIG_PM + /* deferred resume work */ + INIT_WORK(&card->deferred_resume_work, soc_resume_deferred); +#endif -card_err: - if (platform->remove) - platform->remove(pdev); + /* initialise the sound card only once */ + if (card->probe) { + ret = card->probe(pdev); + if (ret < 0) + goto card_probe_error; + } -platform_err: - if (codec_dev->remove) - codec_dev->remove(pdev); + for (i = 0; i < card->num_links; i++) { + ret = soc_probe_dai_link(card, i); + if (ret < 0) { + printk(KERN_ERR "asoc: failed to instanciate card %s\n", card->name); + goto probe_dai_err; + } + } -cpu_dai_err: - for (i--; i >= 0; i--) { - struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai; - if (cpu_dai->remove) - cpu_dai->remove(pdev, cpu_dai); + snprintf(card->snd_card->shortname, sizeof(card->snd_card->shortname), + "%s", card->name); + snprintf(card->snd_card->longname, sizeof(card->snd_card->longname), + "%s", card->name); + + ret = snd_card_register(card->snd_card); + if (ret < 0) { + printk(KERN_ERR "asoc: failed to register soundcard for %s\n", card->name); + goto probe_dai_err; } +#ifdef CONFIG_SND_SOC_AC97_BUS + /* register any AC97 codecs */ + for (i = 0; i < card->num_rtd; i++) { + ret = soc_register_ac97_dai_link(&card->rtd[i]); + if (ret < 0) { + printk(KERN_ERR "asoc: failed to register AC97 %s\n", card->name); + goto probe_dai_err; + } + } +#endif + + card->instantiated = 1; + mutex_unlock(&card->mutex); + return; + +probe_dai_err: + for (i = 0; i < card->num_links; i++) + soc_remove_dai_link(card, i); + +card_probe_error: if (card->remove) card->remove(pdev); + + snd_card_free(card->snd_card); + + mutex_unlock(&card->mutex); } /* @@ -1332,15 +1552,15 @@ static void snd_soc_instantiate_cards(void) /* probes a new socdev */ static int soc_probe(struct platform_device *pdev) { + struct snd_soc_card *card = platform_get_drvdata(pdev); int ret = 0; - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_card *card = socdev->card; - - /* Bodge while we push things out of socdev */ - card->socdev = socdev; /* Bodge while we unpick instantiation */ card->dev = &pdev->dev; + INIT_LIST_HEAD(&card->dai_dev_list); + INIT_LIST_HEAD(&card->codec_dev_list); + INIT_LIST_HEAD(&card->platform_dev_list); + ret = snd_soc_register_card(card); if (ret != 0) { dev_err(&pdev->dev, "Failed to register card\n"); @@ -1353,50 +1573,49 @@ static int soc_probe(struct platform_device *pdev) /* removes a socdev */ static int soc_remove(struct platform_device *pdev) { + struct snd_soc_card *card = platform_get_drvdata(pdev); int i; - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_card *card = socdev->card; - struct snd_soc_platform *platform = card->platform; - struct snd_soc_codec_device *codec_dev = socdev->codec_dev; - if (card->instantiated) { - run_delayed_work(&card->delayed_work); + if (card->instantiated) { - if (platform->remove) - platform->remove(pdev); - - if (codec_dev->remove) - codec_dev->remove(pdev); - - for (i = 0; i < card->num_links; i++) { - struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai; - if (cpu_dai->remove) - cpu_dai->remove(pdev, cpu_dai); + /* make sure any delayed work runs */ + for (i = 0; i < card->num_rtd; i++) { + struct snd_soc_pcm_runtime *rtd = &card->rtd[i]; + run_delayed_work(&rtd->delayed_work); } + /* remove and free each DAI */ + for (i = 0; i < card->num_rtd; i++) + soc_remove_dai_link(card, i); + + /* remove the card */ if (card->remove) card->remove(pdev); - } + kfree(card->rtd); + snd_card_free(card->snd_card); + } snd_soc_unregister_card(card); - return 0; } static int soc_poweroff(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_card *card = socdev->card; + struct snd_soc_card *card = platform_get_drvdata(pdev); + int i; if (!card->instantiated) return 0; /* Flush out pmdown_time work - we actually do want to run it * now, we're shutting down so no imminent restart. */ - run_delayed_work(&card->delayed_work); + for (i = 0; i < card->num_rtd; i++) { + struct snd_soc_pcm_runtime *rtd = &card->rtd[i]; + run_delayed_work(&rtd->delayed_work); + } - snd_soc_dapm_shutdown(socdev); + snd_soc_dapm_shutdown(card); return 0; } @@ -1419,53 +1638,42 @@ static struct platform_driver soc_driver = { }; /* create a new pcm */ -static int soc_new_pcm(struct snd_soc_device *socdev, - struct snd_soc_dai_link *dai_link, int num) -{ - struct snd_soc_card *card = socdev->card; - struct snd_soc_codec *codec = card->codec; - struct snd_soc_platform *platform = card->platform; - struct snd_soc_dai *codec_dai = dai_link->codec_dai; - struct snd_soc_dai *cpu_dai = dai_link->cpu_dai; - struct snd_soc_pcm_runtime *rtd; +static int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) +{ + struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_platform *platform = rtd->platform; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct snd_pcm *pcm; char new_name[64]; int ret = 0, playback = 0, capture = 0; - rtd = kzalloc(sizeof(struct snd_soc_pcm_runtime), GFP_KERNEL); - if (rtd == NULL) - return -ENOMEM; - - rtd->dai = dai_link; - rtd->socdev = socdev; - codec_dai->codec = card->codec; - /* check client and interface hw capabilities */ snprintf(new_name, sizeof(new_name), "%s %s-%d", - dai_link->stream_name, codec_dai->name, num); + rtd->dai_link->stream_name, codec_dai->name, num); - if (codec_dai->playback.channels_min) + if (codec_dai->driver->playback.channels_min) playback = 1; - if (codec_dai->capture.channels_min) + if (codec_dai->driver->capture.channels_min) capture = 1; - ret = snd_pcm_new(codec->card, new_name, codec->pcm_devs++, playback, - capture, &pcm); + dev_dbg(rtd->card->dev, "registered pcm #%d %s\n",num,new_name); + ret = snd_pcm_new(rtd->card->snd_card, new_name, + num, playback, capture, &pcm); if (ret < 0) { - printk(KERN_ERR "asoc: can't create pcm for codec %s\n", - codec->name); - kfree(rtd); + printk(KERN_ERR "asoc: can't create pcm for codec %s\n", codec->name); return ret; } - dai_link->pcm = pcm; + rtd->pcm = pcm; pcm->private_data = rtd; - soc_pcm_ops.mmap = platform->pcm_ops->mmap; - soc_pcm_ops.ioctl = platform->pcm_ops->ioctl; - soc_pcm_ops.copy = platform->pcm_ops->copy; - soc_pcm_ops.silence = platform->pcm_ops->silence; - soc_pcm_ops.ack = platform->pcm_ops->ack; - soc_pcm_ops.page = platform->pcm_ops->page; + soc_pcm_ops.mmap = platform->driver->ops->mmap; + soc_pcm_ops.pointer = platform->driver->ops->pointer; + soc_pcm_ops.ioctl = platform->driver->ops->ioctl; + soc_pcm_ops.copy = platform->driver->ops->copy; + soc_pcm_ops.silence = platform->driver->ops->silence; + soc_pcm_ops.ack = platform->driver->ops->ack; + soc_pcm_ops.page = platform->driver->ops->page; if (playback) snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &soc_pcm_ops); @@ -1473,14 +1681,13 @@ static int soc_new_pcm(struct snd_soc_device *socdev, if (capture) snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &soc_pcm_ops); - ret = platform->pcm_new(codec->card, codec_dai, pcm); + ret = platform->driver->pcm_new(rtd->card->snd_card, codec_dai, pcm); if (ret < 0) { printk(KERN_ERR "asoc: platform pcm constructor failed\n"); - kfree(rtd); return ret; } - pcm->private_free = platform->pcm_free; + pcm->private_free = platform->driver->pcm_free; printk(KERN_INFO "asoc: %s <-> %s mapping ok\n", codec_dai->name, cpu_dai->name); return ret; @@ -1496,8 +1703,8 @@ static int soc_new_pcm(struct snd_soc_device *socdev, */ int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg) { - if (codec->volatile_register) - return codec->volatile_register(reg); + if (codec->driver->volatile_register) + return codec->driver->volatile_register(reg); else return 0; } @@ -1532,7 +1739,6 @@ int snd_soc_new_ac97_codec(struct snd_soc_codec *codec, codec->ac97->bus->ops = ops; codec->ac97->num = num; - codec->dev = &codec->ac97->dev; mutex_unlock(&codec->mutex); return 0; } @@ -1547,6 +1753,9 @@ EXPORT_SYMBOL_GPL(snd_soc_new_ac97_codec); void snd_soc_free_ac97_codec(struct snd_soc_codec *codec) { mutex_lock(&codec->mutex); +#ifdef CONFIG_SND_SOC_AC97_BUS + soc_unregister_ac97_dai_link(codec); +#endif kfree(codec->ac97->bus); kfree(codec->ac97); codec->ac97 = NULL; @@ -1632,95 +1841,6 @@ int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned short reg, } EXPORT_SYMBOL_GPL(snd_soc_test_bits); -/** - * snd_soc_new_pcms - create new sound card and pcms - * @socdev: the SoC audio device - * @idx: ALSA card index - * @xid: card identification - * - * Create a new sound card based upon the codec and interface pcms. - * - * Returns 0 for success, else error. - */ -int snd_soc_new_pcms(struct snd_soc_device *socdev, int idx, const char *xid) -{ - struct snd_soc_card *card = socdev->card; - struct snd_soc_codec *codec = card->codec; - int ret, i; - - mutex_lock(&codec->mutex); - - /* register a sound card */ - ret = snd_card_create(idx, xid, codec->owner, 0, &codec->card); - if (ret < 0) { - printk(KERN_ERR "asoc: can't create sound card for codec %s\n", - codec->name); - mutex_unlock(&codec->mutex); - return ret; - } - - codec->socdev = socdev; - codec->card->dev = socdev->dev; - codec->card->private_data = codec; - strncpy(codec->card->driver, codec->name, sizeof(codec->card->driver)); - - /* create the pcms */ - for (i = 0; i < card->num_links; i++) { - ret = soc_new_pcm(socdev, &card->dai_link[i], i); - if (ret < 0) { - printk(KERN_ERR "asoc: can't create pcm %s\n", - card->dai_link[i].stream_name); - mutex_unlock(&codec->mutex); - return ret; - } - /* Check for codec->ac97 to handle the ac97.c fun */ - if (card->dai_link[i].codec_dai->ac97_control && codec->ac97) { - snd_ac97_dev_add_pdata(codec->ac97, - card->dai_link[i].cpu_dai->ac97_pdata); - } - } - - mutex_unlock(&codec->mutex); - return ret; -} -EXPORT_SYMBOL_GPL(snd_soc_new_pcms); - -/** - * snd_soc_free_pcms - free sound card and pcms - * @socdev: the SoC audio device - * - * Frees sound card and pcms associated with the socdev. - * Also unregister the codec if it is an AC97 device. - */ -void snd_soc_free_pcms(struct snd_soc_device *socdev) -{ - struct snd_soc_codec *codec = socdev->card->codec; -#ifdef CONFIG_SND_SOC_AC97_BUS - struct snd_soc_dai *codec_dai; - int i; -#endif - - mutex_lock(&codec->mutex); - soc_cleanup_codec_debugfs(codec); -#ifdef CONFIG_SND_SOC_AC97_BUS - for (i = 0; i < codec->num_dai; i++) { - codec_dai = &codec->dai[i]; - if (codec_dai->ac97_control && codec->ac97 && - strcmp(codec->name, "AC97") != 0) { - soc_ac97_dev_unregister(codec); - goto free_card; - } - } -free_card: -#endif - - if (codec->card) - snd_card_free(codec->card); - device_remove_file(socdev->dev, &dev_attr_codec_reg); - mutex_unlock(&codec->mutex); -} -EXPORT_SYMBOL_GPL(snd_soc_free_pcms); - /** * snd_soc_set_runtime_hwparams - set the runtime hardware parameters * @substream: the pcm substream @@ -1782,7 +1902,7 @@ EXPORT_SYMBOL_GPL(snd_soc_cnew); int snd_soc_add_controls(struct snd_soc_codec *codec, const struct snd_kcontrol_new *controls, int num_controls) { - struct snd_card *card = codec->card; + struct snd_card *card = codec->card->snd_card; int err, i; for (i = 0; i < num_controls; i++) { @@ -2337,7 +2457,7 @@ EXPORT_SYMBOL_GPL(snd_soc_put_volsw_s8); int snd_soc_limit_volume(struct snd_soc_codec *codec, const char *name, int max) { - struct snd_card *card = codec->card; + struct snd_card *card = codec->card->snd_card; struct snd_kcontrol *kctl; struct soc_mixer_control *mc; int found = 0; @@ -2469,8 +2589,8 @@ EXPORT_SYMBOL_GPL(snd_soc_put_volsw_2r_sx); int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - if (dai->ops && dai->ops->set_sysclk) - return dai->ops->set_sysclk(dai, clk_id, freq, dir); + if (dai->driver && dai->driver->ops->set_sysclk) + return dai->driver->ops->set_sysclk(dai, clk_id, freq, dir); else return -EINVAL; } @@ -2489,8 +2609,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk); int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div) { - if (dai->ops && dai->ops->set_clkdiv) - return dai->ops->set_clkdiv(dai, div_id, div); + if (dai->driver && dai->driver->ops->set_clkdiv) + return dai->driver->ops->set_clkdiv(dai, div_id, div); else return -EINVAL; } @@ -2509,8 +2629,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_clkdiv); int snd_soc_dai_set_pll(struct snd_soc_dai *dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - if (dai->ops && dai->ops->set_pll) - return dai->ops->set_pll(dai, pll_id, source, + if (dai->driver && dai->driver->ops->set_pll) + return dai->driver->ops->set_pll(dai, pll_id, source, freq_in, freq_out); else return -EINVAL; @@ -2526,8 +2646,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_pll); */ int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - if (dai->ops && dai->ops->set_fmt) - return dai->ops->set_fmt(dai, fmt); + if (dai->driver && dai->driver->ops->set_fmt) + return dai->driver->ops->set_fmt(dai, fmt); else return -EINVAL; } @@ -2547,8 +2667,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_fmt); int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - if (dai->ops && dai->ops->set_tdm_slot) - return dai->ops->set_tdm_slot(dai, tx_mask, rx_mask, + if (dai->driver && dai->driver->ops->set_tdm_slot) + return dai->driver->ops->set_tdm_slot(dai, tx_mask, rx_mask, slots, slot_width); else return -EINVAL; @@ -2571,8 +2691,8 @@ int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai, unsigned int tx_num, unsigned int *tx_slot, unsigned int rx_num, unsigned int *rx_slot) { - if (dai->ops && dai->ops->set_channel_map) - return dai->ops->set_channel_map(dai, tx_num, tx_slot, + if (dai->driver && dai->driver->ops->set_channel_map) + return dai->driver->ops->set_channel_map(dai, tx_num, tx_slot, rx_num, rx_slot); else return -EINVAL; @@ -2588,8 +2708,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_channel_map); */ int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate) { - if (dai->ops && dai->ops->set_tristate) - return dai->ops->set_tristate(dai, tristate); + if (dai->driver && dai->driver->ops->set_tristate) + return dai->driver->ops->set_tristate(dai, tristate); else return -EINVAL; } @@ -2604,8 +2724,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_tristate); */ int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute) { - if (dai->ops && dai->ops->digital_mute) - return dai->ops->digital_mute(dai, mute); + if (dai->driver && dai->driver->ops->digital_mute) + return dai->driver->ops->digital_mute(dai, mute); else return -EINVAL; } @@ -2622,11 +2742,22 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_digital_mute); */ static int snd_soc_register_card(struct snd_soc_card *card) { + int i; + if (!card->name || !card->dev) return -EINVAL; + card->rtd = kzalloc(sizeof(struct snd_soc_pcm_runtime) * card->num_links, + GFP_KERNEL); + if (card->rtd == NULL) + return -ENOMEM; + + for (i = 0; i < card->num_links; i++) + card->rtd[i].dai_link = &card->dai_link[i]; + INIT_LIST_HEAD(&card->list); card->instantiated = 0; + mutex_init(&card->mutex); mutex_lock(&client_mutex); list_add(&card->list, &card_list); @@ -2652,30 +2783,97 @@ static int snd_soc_unregister_card(struct snd_soc_card *card) mutex_lock(&client_mutex); list_del(&card->list); mutex_unlock(&client_mutex); - dev_dbg(card->dev, "Unregistered card '%s'\n", card->name); return 0; } +/* + * Simplify DAI link configuration by removing ".-1" from device names + * and sanitizing names. + */ +static inline char *fmt_single_name(struct device *dev, int *id) +{ + char *found, name[NAME_SIZE]; + int id1, id2; + + if (dev_name(dev) == NULL) + return NULL; + + strncpy(name, dev_name(dev), NAME_SIZE); + + /* are we a "%s.%d" name (platform and SPI components) */ + found = strstr(name, dev->driver->name); + if (found) { + /* get ID */ + if (sscanf(&found[strlen(dev->driver->name)], ".%d", id) == 1) { + + /* discard ID from name if ID == -1 */ + if (*id == -1) + found[strlen(dev->driver->name)] = '\0'; + } + + } else { + /* I2C component devices are named "bus-addr" */ + if (sscanf(name, "%x-%x", &id1, &id2) == 2) { + char tmp[NAME_SIZE]; + + /* create unique ID number from I2C addr and bus */ + *id = ((id1 && 0xffff) << 16) + id2; + + /* sanitize component name for DAI link creation */ + snprintf(tmp, NAME_SIZE, "%s.%s", dev->driver->name, name); + strncpy(name, tmp, NAME_SIZE); + } else + *id = 0; + } + + return kstrdup(name, GFP_KERNEL); +} + +/* + * Simplify DAI link naming for single devices with multiple DAIs by removing + * any ".-1" and using the DAI name (instead of device name). + */ +static inline char *fmt_multiple_name(struct device *dev, + struct snd_soc_dai_driver *dai_drv) +{ + if (dai_drv->name == NULL) { + printk(KERN_ERR "asoc: error - multiple DAI %s registered with no name\n", + dev_name(dev)); + return NULL; + } + + return kstrdup(dai_drv->name, GFP_KERNEL); +} + /** * snd_soc_register_dai - Register a DAI with the ASoC core * * @dai: DAI to register */ -int snd_soc_register_dai(struct snd_soc_dai *dai) +int snd_soc_register_dai(struct device *dev, + struct snd_soc_dai_driver *dai_drv) { - if (!dai->name) - return -EINVAL; + struct snd_soc_dai *dai; + + dev_dbg(dev, "dai register %s\n", dev_name(dev)); - /* The device should become mandatory over time */ - if (!dai->dev) - printk(KERN_WARNING "No device for DAI %s\n", dai->name); + dai = kzalloc(sizeof(struct snd_soc_dai), GFP_KERNEL); + if (dai == NULL) + return -ENOMEM; - if (!dai->ops) - dai->ops = &null_dai_ops; + /* create DAI component name */ + dai->name = fmt_single_name(dev, &dai->id); + if (dai->name == NULL) { + kfree(dai); + return -ENOMEM; + } - INIT_LIST_HEAD(&dai->list); + dai->dev = dev; + dai->driver = dai_drv; + if (!dai->driver->ops) + dai->driver->ops = &null_dai_ops; mutex_lock(&client_mutex); list_add(&dai->list, &dai_list); @@ -2693,13 +2891,24 @@ EXPORT_SYMBOL_GPL(snd_soc_register_dai); * * @dai: DAI to unregister */ -void snd_soc_unregister_dai(struct snd_soc_dai *dai) +void snd_soc_unregister_dai(struct device *dev) { + struct snd_soc_dai *dai; + + list_for_each_entry(dai, &dai_list, list) { + if (dev == dai->dev) + goto found; + } + return; + +found: mutex_lock(&client_mutex); list_del(&dai->list); mutex_unlock(&client_mutex); pr_debug("Unregistered DAI '%s'\n", dai->name); + kfree(dai->name); + kfree(dai); } EXPORT_SYMBOL_GPL(snd_soc_unregister_dai); @@ -2709,21 +2918,47 @@ EXPORT_SYMBOL_GPL(snd_soc_unregister_dai); * @dai: Array of DAIs to register * @count: Number of DAIs */ -int snd_soc_register_dais(struct snd_soc_dai *dai, size_t count) +int snd_soc_register_dais(struct device *dev, + struct snd_soc_dai_driver *dai_drv, size_t count) { - int i, ret; + struct snd_soc_dai *dai; + int i, ret = 0; + + dev_dbg(dev, "dai register %s #%d\n", dev_name(dev), count); for (i = 0; i < count; i++) { - ret = snd_soc_register_dai(&dai[i]); - if (ret != 0) + + dai = kzalloc(sizeof(struct snd_soc_dai), GFP_KERNEL); + if (dai == NULL) + return -ENOMEM; + + /* create DAI component name */ + dai->name = fmt_multiple_name(dev, &dai_drv[i]); + if (dai->name == NULL) { + kfree(dai); + ret = -EINVAL; goto err; + } + + dai->dev = dev; + dai->id = i; + dai->driver = &dai_drv[i]; + if (!dai->driver->ops) + dai->driver->ops = &null_dai_ops; + + mutex_lock(&client_mutex); + list_add(&dai->list, &dai_list); + mutex_unlock(&client_mutex); + + pr_debug("Registered DAI '%s'\n", dai->name); } + snd_soc_instantiate_cards(); return 0; err: for (i--; i >= 0; i--) - snd_soc_unregister_dai(&dai[i]); + snd_soc_unregister_dai(dev); return ret; } @@ -2735,12 +2970,12 @@ EXPORT_SYMBOL_GPL(snd_soc_register_dais); * @dai: Array of DAIs to unregister * @count: Number of DAIs */ -void snd_soc_unregister_dais(struct snd_soc_dai *dai, size_t count) +void snd_soc_unregister_dais(struct device *dev, size_t count) { int i; for (i = 0; i < count; i++) - snd_soc_unregister_dai(&dai[i]); + snd_soc_unregister_dai(dev); } EXPORT_SYMBOL_GPL(snd_soc_unregister_dais); @@ -2749,12 +2984,26 @@ EXPORT_SYMBOL_GPL(snd_soc_unregister_dais); * * @platform: platform to register */ -int snd_soc_register_platform(struct snd_soc_platform *platform) +int snd_soc_register_platform(struct device *dev, + struct snd_soc_platform_driver *platform_drv) { - if (!platform->name) - return -EINVAL; + struct snd_soc_platform *platform; + + dev_dbg(dev, "platform register %s\n", dev_name(dev)); + + platform = kzalloc(sizeof(struct snd_soc_platform), GFP_KERNEL); + if (platform == NULL) + return -ENOMEM; + + /* create platform component name */ + platform->name = fmt_single_name(dev, &platform->id); + if (platform->name == NULL) { + kfree(platform); + return -ENOMEM; + } - INIT_LIST_HEAD(&platform->list); + platform->dev = dev; + platform->driver = platform_drv; mutex_lock(&client_mutex); list_add(&platform->list, &platform_list); @@ -2772,13 +3021,24 @@ EXPORT_SYMBOL_GPL(snd_soc_register_platform); * * @platform: platform to unregister */ -void snd_soc_unregister_platform(struct snd_soc_platform *platform) +void snd_soc_unregister_platform(struct device *dev) { + struct snd_soc_platform *platform; + + list_for_each_entry(platform, &platform_list, list) { + if (dev == platform->dev) + goto found; + } + return; + +found: mutex_lock(&client_mutex); list_del(&platform->list); mutex_unlock(&client_mutex); pr_debug("Unregistered platform '%s'\n", platform->name); + kfree(platform->name); + kfree(platform); } EXPORT_SYMBOL_GPL(snd_soc_unregister_platform); @@ -2820,32 +3080,78 @@ static void fixup_codec_formats(struct snd_soc_pcm_stream *stream) * * @codec: codec to register */ -int snd_soc_register_codec(struct snd_soc_codec *codec) +int snd_soc_register_codec(struct device *dev, + struct snd_soc_codec_driver *codec_drv, + struct snd_soc_dai_driver *dai_drv, int num_dai) { - int i; + struct snd_soc_codec *codec; + int ret, i; - if (!codec->name) - return -EINVAL; + dev_dbg(dev, "codec register %s\n", dev_name(dev)); + + codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); + if (codec == NULL) + return -ENOMEM; - /* The device should become mandatory over time */ - if (!codec->dev) - printk(KERN_WARNING "No device for codec %s\n", codec->name); + /* create CODEC component name */ + codec->name = fmt_single_name(dev, &codec->id); + if (codec->name == NULL) { + kfree(codec); + return -ENOMEM; + } + + /* allocate CODEC register cache */ + if (codec_drv->reg_cache_size && codec_drv->reg_word_size) { - INIT_LIST_HEAD(&codec->list); + if (codec_drv->reg_cache_default) + codec->reg_cache = kmemdup(codec_drv->reg_cache_default, + codec_drv->reg_cache_size * codec_drv->reg_word_size, GFP_KERNEL); + else + codec->reg_cache = kzalloc(codec_drv->reg_cache_size * + codec_drv->reg_word_size, GFP_KERNEL); - for (i = 0; i < codec->num_dai; i++) { - fixup_codec_formats(&codec->dai[i].playback); - fixup_codec_formats(&codec->dai[i].capture); + if (codec->reg_cache == NULL) { + kfree(codec->name); + kfree(codec); + return -ENOMEM; + } } + codec->dev = dev; + codec->driver = codec_drv; + codec->bias_level = SND_SOC_BIAS_OFF; + codec->num_dai = num_dai; + mutex_init(&codec->mutex); + INIT_LIST_HEAD(&codec->dapm_widgets); + INIT_LIST_HEAD(&codec->dapm_paths); + + for (i = 0; i < num_dai; i++) { + fixup_codec_formats(&dai_drv[i].playback); + fixup_codec_formats(&dai_drv[i].capture); + } + + /* register DAIs */ + ret = snd_soc_register_dais(dev, dai_drv, num_dai); + if (ret < 0) + goto error; + mutex_lock(&client_mutex); list_add(&codec->list, &codec_list); snd_soc_instantiate_cards(); mutex_unlock(&client_mutex); pr_debug("Registered codec '%s'\n", codec->name); - return 0; + +error: + for (i--; i >= 0; i--) + snd_soc_unregister_dai(dev); + + if (codec->reg_cache) + kfree(codec->reg_cache); + kfree(codec->name); + kfree(codec); + return ret; } EXPORT_SYMBOL_GPL(snd_soc_register_codec); @@ -2854,13 +3160,30 @@ EXPORT_SYMBOL_GPL(snd_soc_register_codec); * * @codec: codec to unregister */ -void snd_soc_unregister_codec(struct snd_soc_codec *codec) +void snd_soc_unregister_codec(struct device *dev) { + struct snd_soc_codec *codec; + int i; + + list_for_each_entry(codec, &codec_list, list) { + if (dev == codec->dev) + goto found; + } + return; + +found: + for (i = 0; i < codec->num_dai; i++) + snd_soc_unregister_dai(dev); + mutex_lock(&client_mutex); list_del(&codec->list); mutex_unlock(&client_mutex); pr_debug("Unregistered codec '%s'\n", codec->name); + + if (codec->reg_cache) + kfree(codec->reg_cache); + kfree(codec); } EXPORT_SYMBOL_GPL(snd_soc_unregister_codec); diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index 03cb7c05ebec..035cab85cb66 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c @@ -112,43 +112,41 @@ static inline struct snd_soc_dapm_widget *dapm_cnew_widget( /** * snd_soc_dapm_set_bias_level - set the bias level for the system - * @socdev: audio device + * @card: audio device * @level: level to configure * * Configure the bias (power) levels for the SoC audio device. * * Returns 0 for success else error. */ -static int snd_soc_dapm_set_bias_level(struct snd_soc_device *socdev, - enum snd_soc_bias_level level) +static int snd_soc_dapm_set_bias_level(struct snd_soc_card *card, + struct snd_soc_codec *codec, enum snd_soc_bias_level level) { - struct snd_soc_card *card = socdev->card; - struct snd_soc_codec *codec = socdev->card->codec; int ret = 0; switch (level) { case SND_SOC_BIAS_ON: - dev_dbg(socdev->dev, "Setting full bias\n"); + dev_dbg(codec->dev, "Setting full bias\n"); break; case SND_SOC_BIAS_PREPARE: - dev_dbg(socdev->dev, "Setting bias prepare\n"); + dev_dbg(codec->dev, "Setting bias prepare\n"); break; case SND_SOC_BIAS_STANDBY: - dev_dbg(socdev->dev, "Setting standby bias\n"); + dev_dbg(codec->dev, "Setting standby bias\n"); break; case SND_SOC_BIAS_OFF: - dev_dbg(socdev->dev, "Setting bias off\n"); + dev_dbg(codec->dev, "Setting bias off\n"); break; default: - dev_err(socdev->dev, "Setting invalid bias %d\n", level); + dev_err(codec->dev, "Setting invalid bias %d\n", level); return -EINVAL; } - if (card->set_bias_level) + if (card && card->set_bias_level) ret = card->set_bias_level(card, level); if (ret == 0) { - if (codec->set_bias_level) - ret = codec->set_bias_level(codec, level); + if (codec->driver->set_bias_level) + ret = codec->driver->set_bias_level(codec, level); else codec->bias_level = level; } @@ -370,7 +368,7 @@ static int dapm_new_mixer(struct snd_soc_codec *codec, path->kcontrol = snd_soc_cnew(&w->kcontrols[i], w, path->long_name); - ret = snd_ctl_add(codec->card, path->kcontrol); + ret = snd_ctl_add(codec->card->snd_card, path->kcontrol); if (ret < 0) { printk(KERN_ERR "asoc: failed to add dapm kcontrol %s: %d\n", path->long_name, @@ -398,7 +396,7 @@ static int dapm_new_mux(struct snd_soc_codec *codec, } kcontrol = snd_soc_cnew(&w->kcontrols[0], w, w->name); - ret = snd_ctl_add(codec->card, kcontrol); + ret = snd_ctl_add(codec->card->snd_card, kcontrol); if (ret < 0) goto err; @@ -437,9 +435,9 @@ static inline void dapm_clear_walk(struct snd_soc_codec *codec) */ static int snd_soc_dapm_suspend_check(struct snd_soc_dapm_widget *widget) { - struct snd_soc_codec *codec = widget->codec; + int level = snd_power_get_state(widget->codec->card->snd_card); - switch (snd_power_get_state(codec->card)) { + switch (level) { case SNDRV_CTL_POWER_D3hot: case SNDRV_CTL_POWER_D3cold: if (widget->ignore_suspend) @@ -893,7 +891,7 @@ static void dapm_seq_run(struct snd_soc_codec *codec, struct list_head *list, */ static int dapm_power_widgets(struct snd_soc_codec *codec, int event) { - struct snd_soc_device *socdev = codec->socdev; + struct snd_soc_card *card = codec->card; struct snd_soc_dapm_widget *w; LIST_HEAD(up_list); LIST_HEAD(down_list); @@ -966,7 +964,7 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event) } if (sys_power && codec->bias_level == SND_SOC_BIAS_OFF) { - ret = snd_soc_dapm_set_bias_level(socdev, + ret = snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_STANDBY); if (ret != 0) pr_err("Failed to turn on bias: %d\n", ret); @@ -975,8 +973,7 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event) /* If we're changing to all on or all off then prepare */ if ((sys_power && codec->bias_level == SND_SOC_BIAS_STANDBY) || (!sys_power && codec->bias_level == SND_SOC_BIAS_ON)) { - ret = snd_soc_dapm_set_bias_level(socdev, - SND_SOC_BIAS_PREPARE); + ret = snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_PREPARE); if (ret != 0) pr_err("Failed to prepare bias: %d\n", ret); } @@ -989,8 +986,7 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event) /* If we just powered the last thing off drop to standby bias */ if (codec->bias_level == SND_SOC_BIAS_PREPARE && !sys_power) { - ret = snd_soc_dapm_set_bias_level(socdev, - SND_SOC_BIAS_STANDBY); + ret = snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_STANDBY); if (ret != 0) pr_err("Failed to apply standby bias: %d\n", ret); } @@ -998,15 +994,14 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event) /* If we're in standby and can support bias off then do that */ if (codec->bias_level == SND_SOC_BIAS_STANDBY && codec->idle_bias_off) { - ret = snd_soc_dapm_set_bias_level(socdev, SND_SOC_BIAS_OFF); + ret = snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_OFF); if (ret != 0) pr_err("Failed to turn off bias: %d\n", ret); } /* If we just powered up then move to active bias */ if (codec->bias_level == SND_SOC_BIAS_PREPARE && sys_power) { - ret = snd_soc_dapm_set_bias_level(socdev, - SND_SOC_BIAS_ON); + ret = snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_ON); if (ret != 0) pr_err("Failed to apply active bias: %d\n", ret); } @@ -1188,8 +1183,9 @@ static int dapm_mixer_update_power(struct snd_soc_dapm_widget *widget, static ssize_t dapm_widget_show(struct device *dev, struct device_attribute *attr, char *buf) { - struct snd_soc_device *devdata = dev_get_drvdata(dev); - struct snd_soc_codec *codec = devdata->card->codec; + struct snd_soc_pcm_runtime *rtd = + container_of(dev, struct snd_soc_pcm_runtime, dev); + struct snd_soc_codec *codec =rtd->codec; struct snd_soc_dapm_widget *w; int count = 0; char *state = "not set"; @@ -1998,9 +1994,10 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_new_controls); * * Returns 0 for success else error. */ -int snd_soc_dapm_stream_event(struct snd_soc_codec *codec, - char *stream, int event) +int snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, + const char *stream, int event) { + struct snd_soc_codec *codec = rtd->codec; struct snd_soc_dapm_widget *w; if (stream == NULL) @@ -2168,25 +2165,19 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend); /** * snd_soc_dapm_free - free dapm resources - * @socdev: SoC device + * @card: SoC device * * Free all dapm widgets and resources. */ -void snd_soc_dapm_free(struct snd_soc_device *socdev) +void snd_soc_dapm_free(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = socdev->card->codec; - - snd_soc_dapm_sys_remove(socdev->dev); + snd_soc_dapm_sys_remove(codec->dev); dapm_free_widgets(codec); } EXPORT_SYMBOL_GPL(snd_soc_dapm_free); -/* - * snd_soc_dapm_shutdown - callback for system shutdown - */ -void snd_soc_dapm_shutdown(struct snd_soc_device *socdev) +static void soc_dapm_shutdown_codec(struct snd_soc_codec *codec) { - struct snd_soc_codec *codec = socdev->card->codec; struct snd_soc_dapm_widget *w; LIST_HEAD(down_list); int powerdown = 0; @@ -2203,12 +2194,23 @@ void snd_soc_dapm_shutdown(struct snd_soc_device *socdev) * standby. */ if (powerdown) { - snd_soc_dapm_set_bias_level(socdev, SND_SOC_BIAS_PREPARE); + snd_soc_dapm_set_bias_level(NULL, codec, SND_SOC_BIAS_PREPARE); dapm_seq_run(codec, &down_list, 0, dapm_down_seq); - snd_soc_dapm_set_bias_level(socdev, SND_SOC_BIAS_STANDBY); + snd_soc_dapm_set_bias_level(NULL, codec, SND_SOC_BIAS_STANDBY); } +} + +/* + * snd_soc_dapm_shutdown - callback for system shutdown + */ +void snd_soc_dapm_shutdown(struct snd_soc_card *card) +{ + struct snd_soc_codec *codec; + + list_for_each_entry(codec, &card->codec_dev_list, list) + soc_dapm_shutdown_codec(codec); - snd_soc_dapm_set_bias_level(socdev, SND_SOC_BIAS_OFF); + snd_soc_dapm_set_bias_level(card, codec, SND_SOC_BIAS_OFF); } /* Module information */ diff --git a/sound/soc/soc-jack.c b/sound/soc/soc-jack.c index 29159e1781d0..8862770aa221 100644 --- a/sound/soc/soc-jack.c +++ b/sound/soc/soc-jack.c @@ -32,14 +32,14 @@ * Returns zero if successful, or a negative error code on failure. * On success jack will be initialised. */ -int snd_soc_jack_new(struct snd_soc_card *card, const char *id, int type, +int snd_soc_jack_new(struct snd_soc_codec *codec, const char *id, int type, struct snd_soc_jack *jack) { - jack->card = card; + jack->codec = codec; INIT_LIST_HEAD(&jack->pins); BLOCKING_INIT_NOTIFIER_HEAD(&jack->notifier); - return snd_jack_new(card->codec->card, id, type, &jack->jack); + return snd_jack_new(codec->card->snd_card, id, type, &jack->jack); } EXPORT_SYMBOL_GPL(snd_soc_jack_new); @@ -67,7 +67,7 @@ void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask) if (!jack) return; - codec = jack->card->codec; + codec = jack->codec; mutex_lock(&codec->mutex); @@ -268,7 +268,7 @@ int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count, ret = request_irq(gpio_to_irq(gpios[i].gpio), gpio_handler, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, - jack->card->dev->driver->name, + jack->codec->dev->driver->name, &gpios[i]); if (ret) goto err; diff --git a/sound/soc/txx9/txx9aclc-ac97.c b/sound/soc/txx9/txx9aclc-ac97.c index 0ec20b68e8cb..743d07b82c06 100644 --- a/sound/soc/txx9/txx9aclc-ac97.c +++ b/sound/soc/txx9/txx9aclc-ac97.c @@ -36,13 +36,11 @@ static DECLARE_WAIT_QUEUE_HEAD(ac97_waitq); -/* REVISIT: How to find txx9aclc_soc_device from snd_ac97? */ -static struct txx9aclc_soc_device *txx9aclc_soc_dev; +/* REVISIT: How to find txx9aclc_drvdata from snd_ac97? */ +static struct txx9aclc_plat_drvdata *txx9aclc_drvdata; -static int txx9aclc_regready(struct txx9aclc_soc_device *dev) +static int txx9aclc_regready(struct txx9aclc_plat_drvdata *drvdata) { - struct txx9aclc_plat_drvdata *drvdata = txx9aclc_get_plat_drvdata(dev); - return __raw_readl(drvdata->base + ACINTSTS) & ACINT_REGACCRDY; } @@ -50,8 +48,7 @@ static int txx9aclc_regready(struct txx9aclc_soc_device *dev) static unsigned short txx9aclc_ac97_read(struct snd_ac97 *ac97, unsigned short reg) { - struct txx9aclc_soc_device *dev = txx9aclc_soc_dev; - struct txx9aclc_plat_drvdata *drvdata = txx9aclc_get_plat_drvdata(dev); + struct txx9aclc_plat_drvdata *drvdata = txx9aclc_drvdata; void __iomem *base = drvdata->base; u32 dat; @@ -61,15 +58,15 @@ static unsigned short txx9aclc_ac97_read(struct snd_ac97 *ac97, dat = (reg << ACREGACC_REG_SHIFT) | ACREGACC_READ; __raw_writel(dat, base + ACREGACC); __raw_writel(ACINT_REGACCRDY, base + ACINTEN); - if (!wait_event_timeout(ac97_waitq, txx9aclc_regready(dev), HZ)) { + if (!wait_event_timeout(ac97_waitq, txx9aclc_regready(txx9aclc_drvdata), HZ)) { __raw_writel(ACINT_REGACCRDY, base + ACINTDIS); - dev_err(dev->soc_dev.dev, "ac97 read timeout (reg %#x)\n", reg); + printk(KERN_ERR "ac97 read timeout (reg %#x)\n", reg); dat = 0xffff; goto done; } dat = __raw_readl(base + ACREGACC); if (((dat >> ACREGACC_REG_SHIFT) & 0xff) != reg) { - dev_err(dev->soc_dev.dev, "reg mismatch %x with %x\n", + printk(KERN_ERR "reg mismatch %x with %x\n", dat, reg); dat = 0xffff; goto done; @@ -84,16 +81,15 @@ done: static void txx9aclc_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short val) { - struct txx9aclc_soc_device *dev = txx9aclc_soc_dev; - struct txx9aclc_plat_drvdata *drvdata = txx9aclc_get_plat_drvdata(dev); + struct txx9aclc_plat_drvdata *drvdata = txx9aclc_drvdata; void __iomem *base = drvdata->base; __raw_writel(((reg | (ac97->num << 7)) << ACREGACC_REG_SHIFT) | (val << ACREGACC_DAT_SHIFT), base + ACREGACC); __raw_writel(ACINT_REGACCRDY, base + ACINTEN); - if (!wait_event_timeout(ac97_waitq, txx9aclc_regready(dev), HZ)) { - dev_err(dev->soc_dev.dev, + if (!wait_event_timeout(ac97_waitq, txx9aclc_regready(txx9aclc_drvdata), HZ)) { + printk(KERN_ERR "ac97 write timeout (reg %#x)\n", reg); } __raw_writel(ACINT_REGACCRDY, base + ACINTDIS); @@ -101,8 +97,7 @@ static void txx9aclc_ac97_write(struct snd_ac97 *ac97, unsigned short reg, static void txx9aclc_ac97_cold_reset(struct snd_ac97 *ac97) { - struct txx9aclc_soc_device *dev = txx9aclc_soc_dev; - struct txx9aclc_plat_drvdata *drvdata = txx9aclc_get_plat_drvdata(dev); + struct txx9aclc_plat_drvdata *drvdata = txx9aclc_drvdata; void __iomem *base = drvdata->base; u32 ready = ACINT_CODECRDY(ac97->num) | ACINT_REGACCRDY; @@ -141,31 +136,23 @@ static irqreturn_t txx9aclc_ac97_irq(int irq, void *dev_id) return IRQ_HANDLED; } -static int txx9aclc_ac97_probe(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int txx9aclc_ac97_probe(struct snd_soc_dai *dai) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct txx9aclc_soc_device *dev = - container_of(socdev, struct txx9aclc_soc_device, soc_dev); - - dev->aclc_pdev = to_platform_device(dai->dev); - txx9aclc_soc_dev = dev; + txx9aclc_drvdata = snd_soc_dai_get_drvdata(dai); return 0; } -static void txx9aclc_ac97_remove(struct platform_device *pdev, - struct snd_soc_dai *dai) +static int txx9aclc_ac97_remove(struct snd_soc_dai *dai) { - struct platform_device *aclc_pdev = to_platform_device(dai->dev); - struct txx9aclc_plat_drvdata *drvdata = platform_get_drvdata(aclc_pdev); + struct txx9aclc_plat_drvdata *drvdata = snd_soc_dai_get_drvdata(dai); /* disable AC-link */ __raw_writel(ACCTL_ENLINK, drvdata->base + ACCTLDIS); - txx9aclc_soc_dev = NULL; + txx9aclc_drvdata = NULL; + return 0; } -struct snd_soc_dai txx9aclc_ac97_dai = { - .name = "txx9aclc_ac97", +static struct snd_soc_dai_driver txx9aclc_ac97_dai = { .ac97_control = 1, .probe = txx9aclc_ac97_probe, .remove = txx9aclc_ac97_remove, @@ -182,7 +169,6 @@ struct snd_soc_dai txx9aclc_ac97_dai = { .channels_max = 2, }, }; -EXPORT_SYMBOL_GPL(txx9aclc_ac97_dai); static int __devinit txx9aclc_ac97_dev_probe(struct platform_device *pdev) { @@ -219,13 +205,12 @@ static int __devinit txx9aclc_ac97_dev_probe(struct platform_device *pdev) if (err < 0) return err; - txx9aclc_ac97_dai.dev = &pdev->dev; - return snd_soc_register_dai(&txx9aclc_ac97_dai); + return snd_soc_register_dai(&pdev->dev, &txx9aclc_ac97_dai); } static int __devexit txx9aclc_ac97_dev_remove(struct platform_device *pdev) { - snd_soc_unregister_dai(&txx9aclc_ac97_dai); + snd_soc_unregister_dai(&pdev->dev); return 0; } diff --git a/sound/soc/txx9/txx9aclc-generic.c b/sound/soc/txx9/txx9aclc-generic.c index 95b17f731aec..6770e7166be4 100644 --- a/sound/soc/txx9/txx9aclc-generic.c +++ b/sound/soc/txx9/txx9aclc-generic.c @@ -19,54 +19,44 @@ #include #include #include -#include "../codecs/ac97.h" #include "txx9aclc.h" static struct snd_soc_dai_link txx9aclc_generic_dai = { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai = &txx9aclc_ac97_dai, - .codec_dai = &ac97_dai, + .cpu_dai_name = "txx9aclc-ac97", + .codec_dai_name = "ac97-hifi", + .platform_name = "txx9aclc-pcm-audio", + .codec_name = "ac97-codec", }; static struct snd_soc_card txx9aclc_generic_card = { .name = "Generic TXx9 ACLC Audio", - .platform = &txx9aclc_soc_platform, .dai_link = &txx9aclc_generic_dai, .num_links = 1, }; -static struct txx9aclc_soc_device txx9aclc_generic_soc_device = { - .soc_dev = { - .card = &txx9aclc_generic_card, - .codec_dev = &soc_codec_dev_ac97, - }, -}; +static struct platform_device *soc_pdev; static int __init txx9aclc_generic_probe(struct platform_device *pdev) { - struct txx9aclc_soc_device *dev = &txx9aclc_generic_soc_device; - struct platform_device *soc_pdev; int ret; soc_pdev = platform_device_alloc("soc-audio", -1); if (!soc_pdev) return -ENOMEM; - platform_set_drvdata(soc_pdev, &dev->soc_dev); - dev->soc_dev.dev = &soc_pdev->dev; + platform_set_drvdata(soc_pdev, &txx9aclc_generic_card); ret = platform_device_add(soc_pdev); if (ret) { platform_device_put(soc_pdev); return ret; } - platform_set_drvdata(pdev, soc_pdev); + return 0; } static int __exit txx9aclc_generic_remove(struct platform_device *pdev) { - struct platform_device *soc_pdev = platform_get_drvdata(pdev); - platform_device_unregister(soc_pdev); return 0; } diff --git a/sound/soc/txx9/txx9aclc.c b/sound/soc/txx9/txx9aclc.c index 0e3452303ea6..f4aa4e03c888 100644 --- a/sound/soc/txx9/txx9aclc.c +++ b/sound/soc/txx9/txx9aclc.c @@ -22,6 +22,16 @@ #include #include "txx9aclc.h" +static struct txx9aclc_soc_device { + struct txx9aclc_dmadata dmadata[2]; +} txx9aclc_soc_device; + +/* REVISIT: How to find txx9aclc_drvdata from snd_ac97? */ +static struct txx9aclc_plat_drvdata *txx9aclc_drvdata; + +static int txx9aclc_dma_init(struct txx9aclc_soc_device *dev, + struct txx9aclc_dmadata *dmadata); + static const struct snd_pcm_hardware txx9aclc_pcm_hardware = { /* * REVISIT: SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID @@ -46,7 +56,6 @@ static int txx9aclc_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); - struct snd_soc_device *socdev = rtd->socdev; struct snd_pcm_runtime *runtime = substream->runtime; struct txx9aclc_dmadata *dmadata = runtime->private_data; int ret; @@ -55,13 +64,13 @@ static int txx9aclc_pcm_hw_params(struct snd_pcm_substream *substream, if (ret < 0) return ret; - dev_dbg(socdev->dev, + dev_dbg(rtd->platform->dev, "runtime->dma_area = %#lx dma_addr = %#lx dma_bytes = %zd " "runtime->min_align %ld\n", (unsigned long)runtime->dma_area, (unsigned long)runtime->dma_addr, runtime->dma_bytes, runtime->min_align); - dev_dbg(socdev->dev, + dev_dbg(rtd->platform->dev, "periods %d period_bytes %d stream %d\n", params_periods(params), params_period_bytes(params), substream->stream); @@ -152,11 +161,7 @@ static void txx9aclc_dma_tasklet(unsigned long data) spin_lock_irqsave(&dmadata->dma_lock, flags); if (dmadata->frag_count < 0) { - struct txx9aclc_soc_device *dev = - container_of(dmadata, struct txx9aclc_soc_device, - dmadata[substream->stream]); - struct txx9aclc_plat_drvdata *drvdata = - txx9aclc_get_plat_drvdata(dev); + struct txx9aclc_plat_drvdata *drvdata = txx9aclc_drvdata; void __iomem *base = drvdata->base; spin_unlock_irqrestore(&dmadata->dma_lock, flags); @@ -202,10 +207,7 @@ static void txx9aclc_dma_tasklet(unsigned long data) static int txx9aclc_pcm_trigger(struct snd_pcm_substream *substream, int cmd) { struct txx9aclc_dmadata *dmadata = substream->runtime->private_data; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct txx9aclc_soc_device *dev = - container_of(rtd->socdev, struct txx9aclc_soc_device, soc_dev); - struct txx9aclc_plat_drvdata *drvdata = txx9aclc_get_plat_drvdata(dev); + struct txx9aclc_plat_drvdata *drvdata =txx9aclc_drvdata; void __iomem *base = drvdata->base; unsigned long flags; int ret = 0; @@ -244,9 +246,7 @@ txx9aclc_pcm_pointer(struct snd_pcm_substream *substream) static int txx9aclc_pcm_open(struct snd_pcm_substream *substream) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct txx9aclc_soc_device *dev = - container_of(rtd->socdev, struct txx9aclc_soc_device, soc_dev); + struct txx9aclc_soc_device *dev = &txx9aclc_soc_device; struct txx9aclc_dmadata *dmadata = &dev->dmadata[substream->stream]; int ret; @@ -291,8 +291,38 @@ static void txx9aclc_pcm_free_dma_buffers(struct snd_pcm *pcm) static int txx9aclc_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, struct snd_pcm *pcm) { + struct platform_device *pdev = to_platform_device(dai->platform->dev); + struct txx9aclc_soc_device *dev; + struct resource *r; + int i; + int ret; + + /* at this point onwards the AC97 component has probed and this will be valid */ + dev = snd_soc_dai_get_drvdata(dai); + + dev->dmadata[0].stream = SNDRV_PCM_STREAM_PLAYBACK; + dev->dmadata[1].stream = SNDRV_PCM_STREAM_CAPTURE; + for (i = 0; i < 2; i++) { + r = platform_get_resource(pdev, IORESOURCE_DMA, i); + if (!r) { + ret = -EBUSY; + goto exit; + } + dev->dmadata[i].dma_res = r; + ret = txx9aclc_dma_init(dev, &dev->dmadata[i]); + if (ret) + goto exit; + } return snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, card->dev, 64 * 1024, 4 * 1024 * 1024); + +exit: + for (i = 0; i < 2; i++) { + if (dev->dmadata[i].dma_chan) + dma_release_channel(dev->dmadata[i].dma_chan); + dev->dmadata[i].dma_chan = NULL; + } + return ret; } static bool filter(struct dma_chan *chan, void *param) @@ -314,7 +344,7 @@ static bool filter(struct dma_chan *chan, void *param) static int txx9aclc_dma_init(struct txx9aclc_soc_device *dev, struct txx9aclc_dmadata *dmadata) { - struct txx9aclc_plat_drvdata *drvdata = txx9aclc_get_plat_drvdata(dev); + struct txx9aclc_plat_drvdata *drvdata =txx9aclc_drvdata; struct txx9dmac_slave *ds = &dmadata->dma_slave; dma_cap_mask_t mask; @@ -334,7 +364,7 @@ static int txx9aclc_dma_init(struct txx9aclc_soc_device *dev, dma_cap_set(DMA_SLAVE, mask); dmadata->dma_chan = dma_request_channel(mask, filter, dmadata); if (!dmadata->dma_chan) { - dev_err(dev->soc_dev.dev, + printk(KERN_ERR "DMA channel for %s is not available\n", dmadata->stream == SNDRV_PCM_STREAM_PLAYBACK ? "playback" : "capture"); @@ -345,45 +375,16 @@ static int txx9aclc_dma_init(struct txx9aclc_soc_device *dev, return 0; } -static int txx9aclc_pcm_probe(struct platform_device *pdev) +static int txx9aclc_pcm_probe(struct snd_soc_platform *platform) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct txx9aclc_soc_device *dev = - container_of(socdev, struct txx9aclc_soc_device, soc_dev); - struct resource *r; - int i; - int ret; - - dev->dmadata[0].stream = SNDRV_PCM_STREAM_PLAYBACK; - dev->dmadata[1].stream = SNDRV_PCM_STREAM_CAPTURE; - for (i = 0; i < 2; i++) { - r = platform_get_resource(dev->aclc_pdev, IORESOURCE_DMA, i); - if (!r) { - ret = -EBUSY; - goto exit; - } - dev->dmadata[i].dma_res = r; - ret = txx9aclc_dma_init(dev, &dev->dmadata[i]); - if (ret) - goto exit; - } + snd_soc_platform_set_drvdata(platform, &txx9aclc_soc_device); return 0; - -exit: - for (i = 0; i < 2; i++) { - if (dev->dmadata[i].dma_chan) - dma_release_channel(dev->dmadata[i].dma_chan); - dev->dmadata[i].dma_chan = NULL; - } - return ret; } -static int txx9aclc_pcm_remove(struct platform_device *pdev) +static int txx9aclc_pcm_remove(struct snd_soc_platform *platform) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct txx9aclc_soc_device *dev = - container_of(socdev, struct txx9aclc_soc_device, soc_dev); - struct txx9aclc_plat_drvdata *drvdata = txx9aclc_get_plat_drvdata(dev); + struct txx9aclc_soc_device *dev = snd_soc_platform_get_drvdata(platform); + struct txx9aclc_plat_drvdata *drvdata = txx9aclc_drvdata; void __iomem *base = drvdata->base; int i; @@ -406,28 +407,46 @@ static int txx9aclc_pcm_remove(struct platform_device *pdev) return 0; } -struct snd_soc_platform txx9aclc_soc_platform = { - .name = "txx9aclc-audio", +static struct snd_soc_platform_driver txx9aclc_soc_platform = { .probe = txx9aclc_pcm_probe, .remove = txx9aclc_pcm_remove, - .pcm_ops = &txx9aclc_pcm_ops, + .ops = &txx9aclc_pcm_ops, .pcm_new = txx9aclc_pcm_new, .pcm_free = txx9aclc_pcm_free_dma_buffers, }; -EXPORT_SYMBOL_GPL(txx9aclc_soc_platform); -static int __init txx9aclc_soc_platform_init(void) +static int __devinit txx9aclc_soc_platform_probe(struct platform_device *pdev) { - return snd_soc_register_platform(&txx9aclc_soc_platform); + return snd_soc_register_platform(&pdev->dev, &txx9aclc_soc_platform); } -static void __exit txx9aclc_soc_platform_exit(void) +static int __devexit txx9aclc_soc_platform_remove(struct platform_device *pdev) { - snd_soc_unregister_platform(&txx9aclc_soc_platform); + snd_soc_unregister_platform(&pdev->dev); + return 0; } -module_init(txx9aclc_soc_platform_init); -module_exit(txx9aclc_soc_platform_exit); +static struct platform_driver txx9aclc_pcm_driver = { + .driver = { + .name = "txx9aclc-pcm-audio", + .owner = THIS_MODULE, + }, + + .probe = txx9aclc_soc_platform_probe, + .remove = __devexit_p(txx9aclc_soc_platform_remove), +}; + +static int __init snd_txx9aclc_pcm_init(void) +{ + return platform_driver_register(&txx9aclc_pcm_driver); +} +module_init(snd_txx9aclc_pcm_init); + +static void __exit snd_txx9aclc_pcm_exit(void) +{ + platform_driver_unregister(&txx9aclc_pcm_driver); +} +module_exit(snd_txx9aclc_pcm_exit); MODULE_AUTHOR("Atsushi Nemoto "); MODULE_DESCRIPTION("TXx9 ACLC Audio DMA driver"); diff --git a/sound/soc/txx9/txx9aclc.h b/sound/soc/txx9/txx9aclc.h index 6769aab41b33..9c2de84fec3b 100644 --- a/sound/soc/txx9/txx9aclc.h +++ b/sound/soc/txx9/txx9aclc.h @@ -65,19 +65,10 @@ struct txx9aclc_plat_drvdata { u64 physbase; }; -struct txx9aclc_soc_device { - struct snd_soc_device soc_dev; - struct platform_device *aclc_pdev; /* for ioresources, drvdata */ - struct txx9aclc_dmadata dmadata[2]; -}; - static inline struct txx9aclc_plat_drvdata *txx9aclc_get_plat_drvdata( - struct txx9aclc_soc_device *sdev) + struct snd_soc_dai *dai) { - return platform_get_drvdata(sdev->aclc_pdev); + return dev_get_drvdata(dai->dev); } -extern struct snd_soc_platform txx9aclc_soc_platform; -extern struct snd_soc_dai txx9aclc_ac97_dai; - #endif /* __TXX9ACLC_H */ -- cgit v1.2.3 From 3782a528974c9607bde03ec265bbebd2dc300ea1 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Wed, 21 Jul 2010 08:06:56 +0900 Subject: ASoC: multi-component - Add Aquila sound driver This patch add sound support for the Aquila board based on S5PC110. The Aquila board is based on Samsung SoC(S5PC110) and include WM8994 codec over I2S to support sound. This uses the I2Sv4 driver compatible with I2Sv5 to run sound. The kind of jack is below states : * SND_JACK_HEADPHONE * SND_JACK_HEADSET * SND_JACK_MECHANICAL : When TV-OUT cable is inserted on Aquila board, the TV-OUT cable isn't connected to television. * SND_JACK_AVOUT : When TV-OUT cable is inserted on Aquila board, the TV-OUT cable is connected to television. Signed-off-by: Chanwoo Choi Signed-off-by: Joonyoung Shim Signed-off-by: Kyungmin Park Acked-by: Mark Brown Signed-off-by: Liam Girdwood ASoC: multi-component: SAMSUNG: Fix wrong field name on Aquila board This patch modify the wrong field name on Aquila board. Signed-off-by: Chanwoo Choi Signed-off-by: Kyungmin Park Signed-off-by: Liam Girdwood --- sound/soc/s3c24xx/Kconfig | 9 ++ sound/soc/s3c24xx/Makefile | 2 + sound/soc/s3c24xx/aquila_wm8994.c | 295 ++++++++++++++++++++++++++++++++++++++ sound/soc/s3c24xx/s3c-i2s-v2.c | 2 +- 4 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 sound/soc/s3c24xx/aquila_wm8994.c (limited to 'sound') diff --git a/sound/soc/s3c24xx/Kconfig b/sound/soc/s3c24xx/Kconfig index 213963ac3c28..c09b4021afe9 100644 --- a/sound/soc/s3c24xx/Kconfig +++ b/sound/soc/s3c24xx/Kconfig @@ -131,3 +131,12 @@ config SND_S3C64XX_SOC_SMARTQ depends on SND_S3C24XX_SOC && MACH_SMARTQ select SND_S3C64XX_SOC_I2S select SND_SOC_WM8750 + +config SND_S5PC110_SOC_AQUILA_WM8994 + tristate "SoC I2S Audio support for AQUILA - WM8994" + depends on SND_S3C24XX_SOC && MACH_AQUILA + select SND_S3C64XX_SOC_I2S_V4 + select SND_SOC_WM8994 + help + Say Y if you want to add support for SoC audio on aquila + with the WM8994. diff --git a/sound/soc/s3c24xx/Makefile b/sound/soc/s3c24xx/Makefile index 50172c385d90..02dd12c714f6 100644 --- a/sound/soc/s3c24xx/Makefile +++ b/sound/soc/s3c24xx/Makefile @@ -30,6 +30,7 @@ snd-soc-s3c24xx-simtec-tlv320aic23-objs := s3c24xx_simtec_tlv320aic23.o snd-soc-smdk64xx-wm8580-objs := smdk64xx_wm8580.o snd-soc-smdk-wm9713-objs := smdk_wm9713.o snd-soc-s3c64xx-smartq-wm8987-objs := smartq_wm8987.o +snd-soc-aquila-wm8994-objs := aquila_wm8994.o obj-$(CONFIG_SND_S3C24XX_SOC_JIVE_WM8750) += snd-soc-jive-wm8750.o obj-$(CONFIG_SND_S3C24XX_SOC_NEO1973_WM8753) += snd-soc-neo1973-wm8753.o @@ -43,3 +44,4 @@ obj-$(CONFIG_SND_S3C24XX_SOC_SIMTEC_TLV320AIC23) += snd-soc-s3c24xx-simtec-tlv32 obj-$(CONFIG_SND_S3C64XX_SOC_WM8580) += snd-soc-smdk64xx-wm8580.o obj-$(CONFIG_SND_SOC_SMDK_WM9713) += snd-soc-smdk-wm9713.o obj-$(CONFIG_SND_S3C64XX_SOC_SMARTQ) += snd-soc-s3c64xx-smartq-wm8987.o +obj-$(CONFIG_SND_S5PC110_SOC_AQUILA_WM8994) += snd-soc-aquila-wm8994.o diff --git a/sound/soc/s3c24xx/aquila_wm8994.c b/sound/soc/s3c24xx/aquila_wm8994.c new file mode 100644 index 000000000000..235d1973f7d0 --- /dev/null +++ b/sound/soc/s3c24xx/aquila_wm8994.c @@ -0,0 +1,295 @@ +/* + * aquila_wm8994.c + * + * Copyright (C) 2010 Samsung Electronics Co.Ltd + * Author: Chanwoo Choi + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "../codecs/wm8994.h" +#include "s3c-dma.h" +#include "s3c64xx-i2s.h" + +static struct snd_soc_card aquila; +static struct platform_device *aquila_snd_device; + +/* 3.5 pie jack */ +static struct snd_soc_jack jack; + +/* 3.5 pie jack detection DAPM pins */ +static struct snd_soc_jack_pin jack_pins[] = { + { + .pin = "Headset Mic", + .mask = SND_JACK_MICROPHONE, + }, { + .pin = "Headset Stereophone", + .mask = SND_JACK_HEADPHONE | SND_JACK_MECHANICAL | + SND_JACK_AVOUT, + }, +}; + +/* 3.5 pie jack detection gpios */ +static struct snd_soc_jack_gpio jack_gpios[] = { + { + .gpio = S5PV210_GPH0(6), + .name = "DET_3.5", + .report = SND_JACK_HEADSET | SND_JACK_MECHANICAL | + SND_JACK_AVOUT, + .debounce_time = 200, + }, +}; + +static const struct snd_soc_dapm_widget aquila_dapm_widgets[] = { + SND_SOC_DAPM_SPK("Ext Spk", NULL), + SND_SOC_DAPM_SPK("Ext Rcv", NULL), + SND_SOC_DAPM_HP("Headset Stereophone", NULL), + SND_SOC_DAPM_MIC("Headset Mic", NULL), + SND_SOC_DAPM_MIC("Main Mic", NULL), + SND_SOC_DAPM_MIC("2nd Mic", NULL), + SND_SOC_DAPM_LINE("Radio In", NULL), +}; + +static const struct snd_soc_dapm_route aquila_dapm_routes[] = { + {"Ext Spk", NULL, "SPKOUTLP"}, + {"Ext Spk", NULL, "SPKOUTLN"}, + + {"Ext Rcv", NULL, "HPOUT2N"}, + {"Ext Rcv", NULL, "HPOUT2P"}, + + {"Headset Stereophone", NULL, "HPOUT1L"}, + {"Headset Stereophone", NULL, "HPOUT1R"}, + + {"IN1RN", NULL, "Headset Mic"}, + {"IN1RP", NULL, "Headset Mic"}, + + {"IN1RN", NULL, "2nd Mic"}, + {"IN1RP", NULL, "2nd Mic"}, + + {"IN1LN", NULL, "Main Mic"}, + {"IN1LP", NULL, "Main Mic"}, + + {"IN2LN", NULL, "Radio In"}, + {"IN2RN", NULL, "Radio In"}, +}; + +static int aquila_wm8994_init(struct snd_soc_pcm_runtime *rtd) +{ + struct snd_soc_codec *codec = rtd->codec; + int ret; + + /* add aquila specific widgets */ + snd_soc_dapm_new_controls(codec, aquila_dapm_widgets, + ARRAY_SIZE(aquila_dapm_widgets)); + + /* set up aquila specific audio routes */ + snd_soc_dapm_add_routes(codec, aquila_dapm_routes, + ARRAY_SIZE(aquila_dapm_routes)); + + /* set endpoints to not connected */ + snd_soc_dapm_nc_pin(codec, "IN2LP:VXRN"); + snd_soc_dapm_nc_pin(codec, "IN2RP:VXRP"); + snd_soc_dapm_nc_pin(codec, "LINEOUT1N"); + snd_soc_dapm_nc_pin(codec, "LINEOUT1P"); + snd_soc_dapm_nc_pin(codec, "LINEOUT2N"); + snd_soc_dapm_nc_pin(codec, "LINEOUT2P"); + snd_soc_dapm_nc_pin(codec, "SPKOUTRN"); + snd_soc_dapm_nc_pin(codec, "SPKOUTRP"); + + snd_soc_dapm_sync(codec); + + /* Headset jack detection */ + ret = snd_soc_jack_new(&aquila, "Headset Jack", + SND_JACK_HEADSET | SND_JACK_MECHANICAL | SND_JACK_AVOUT, + &jack); + if (ret) + return ret; + + ret = snd_soc_jack_add_pins(&jack, ARRAY_SIZE(jack_pins), jack_pins); + if (ret) + return ret; + + ret = snd_soc_jack_add_gpios(&jack, ARRAY_SIZE(jack_gpios), jack_gpios); + if (ret) + return ret; + + return 0; +} + +static int aquila_hifi_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + unsigned int pll_out = 24000000; + int ret = 0; + + /* set the cpu DAI configuration */ + ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); + if (ret < 0) + return ret; + + /* set the cpu system clock */ + ret = snd_soc_dai_set_sysclk(cpu_dai, S3C64XX_CLKSRC_PCLK, + 0, SND_SOC_CLOCK_IN); + if (ret < 0) + return ret; + + /* set codec DAI configuration */ + ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); + if (ret < 0) + return ret; + + /* set the codec FLL */ + ret = snd_soc_dai_set_pll(codec_dai, WM8994_FLL1, 0, pll_out, + params_rate(params) * 256); + if (ret < 0) + return ret; + + /* set the codec system clock */ + ret = snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_FLL1, + params_rate(params) * 256, SND_SOC_CLOCK_IN); + if (ret < 0) + return ret; + + return 0; +} + +static struct snd_soc_ops aquila_hifi_ops = { + .hw_params = aquila_hifi_hw_params, +}; + +static int aquila_voice_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + unsigned int pll_out = 24000000; + int ret = 0; + + if (params_rate(params) != 8000) + return -EINVAL; + + /* set codec DAI configuration */ + ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_LEFT_J | + SND_SOC_DAIFMT_IB_IF | SND_SOC_DAIFMT_CBM_CFM); + if (ret < 0) + return ret; + + /* set the codec FLL */ + ret = snd_soc_dai_set_pll(codec_dai, WM8994_FLL2, 0, pll_out, + params_rate(params) * 256); + if (ret < 0) + return ret; + + /* set the codec system clock */ + ret = snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_FLL2, + params_rate(params) * 256, SND_SOC_CLOCK_IN); + if (ret < 0) + return ret; + + return 0; +} + +static struct snd_soc_dai_driver voice_dai = { + .name = "aquila-voice-dai", + .playback = { + .channels_min = 1, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000, + .formats = SNDRV_PCM_FMTBIT_S16_LE,}, + .capture = { + .channels_min = 1, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000, + .formats = SNDRV_PCM_FMTBIT_S16_LE,}, +}; + +static struct snd_soc_ops aquila_voice_ops = { + .hw_params = aquila_voice_hw_params, +}; + +static struct snd_soc_dai_link aquila_dai[] = { +{ + .name = "WM8994", + .stream_name = "WM8994 HiFi", + .cpu_dai_name = "s3c64xx-i2s-v4", + .codec_dai_name = "wm8994-hifi", + .platform_name = "s3c24xx-pcm-audio", + .codec_name = "wm8994-codec.0-0x1a", + .init = aquila_wm8994_init, + .ops = &aquila_hifi_ops, +}, { + .name = "WM8994 Voice", + .stream_name = "Voice", + .cpu_dai_name = "aquila-voice-dai", + .codec_dai_name = "wm8994-voice", + .platform_name = "s3c24xx-pcm-audio", + .codec_name = "wm8994-codec.0-0x1a", + .ops = &aquila_voice_ops, +}, +}; + +static struct snd_soc_card aquila = { + .name = "aquila", + .dai_link = aquila_dai, + .num_links = ARRAY_SIZE(aquila_dai), +}; + +static int __init aquila_init(void) +{ + int ret; + + if (!machine_is_aquila()) + return -ENODEV; + + aquila_snd_device = platform_device_alloc("soc-audio", -1); + if (!aquila_snd_device) + return -ENOMEM; + + /* register voice DAI here */ + ret = snd_soc_register_dai(&aquila_snd_device->dev, &voice_dai); + if (ret) + return ret; + + platform_set_drvdata(aquila_snd_device, &aquila); + ret = platform_device_add(aquila_snd_device); + + if (ret) + platform_device_put(aquila_snd_device); + + return ret; +} + +static void __exit aquila_exit(void) +{ + platform_device_unregister(aquila_snd_device); +} + +module_init(aquila_init); +module_exit(aquila_exit); + +/* Module information */ +MODULE_DESCRIPTION("ALSA SoC WM8994 Aquila(S5PC110)"); +MODULE_AUTHOR("Chanwoo Choi "); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/s3c24xx/s3c-i2s-v2.c b/sound/soc/s3c24xx/s3c-i2s-v2.c index f4fbc0e61733..b3866d5b19e9 100644 --- a/sound/soc/s3c24xx/s3c-i2s-v2.c +++ b/sound/soc/s3c24xx/s3c-i2s-v2.c @@ -750,7 +750,7 @@ int s3c_i2sv2_register_dai(struct device *dev, int id, drv->suspend = s3c2412_i2s_suspend; drv->resume = s3c2412_i2s_resume; - return snd_soc_register_dai(dev, id, drv); + return snd_soc_register_dai(dev, drv); } EXPORT_SYMBOL_GPL(s3c_i2sv2_register_dai); -- cgit v1.2.3 From f51582fd8d9b1196d58cd94c2b4b759cc1baf57a Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Thu, 22 Jul 2010 15:16:10 +0900 Subject: ASoC: multi-component - Add Goni sound driver This patch add sound support for the Goni board based on S5PV210. The Goni board is based on Samsung SoC(S5PV210) and include WM8994 codec over I2S to support sound. The kind of jack is below states : * SND_JACK_HEADPHONE * SND_JACK_HEADSET * SND_JACK_MECHANICAL : When TV-OUT cable is inserted on Goni board, the TV-OUT cable isn't connected to television. * SND_JACK_AVOUT : When TV-OUT cable is inserted on Goni board, the TV-OUT cable is connected to television. Signed-off-by: Chanwoo Choi Signed-off-by: Joonyoung Shim Signed-off-by: Kyungmin Park Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/s3c24xx/Kconfig | 9 ++ sound/soc/s3c24xx/Makefile | 2 + sound/soc/s3c24xx/goni_wm8994.c | 298 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 309 insertions(+) create mode 100644 sound/soc/s3c24xx/goni_wm8994.c (limited to 'sound') diff --git a/sound/soc/s3c24xx/Kconfig b/sound/soc/s3c24xx/Kconfig index c09b4021afe9..1cdc37bd58f4 100644 --- a/sound/soc/s3c24xx/Kconfig +++ b/sound/soc/s3c24xx/Kconfig @@ -140,3 +140,12 @@ config SND_S5PC110_SOC_AQUILA_WM8994 help Say Y if you want to add support for SoC audio on aquila with the WM8994. + +config SND_S5PV210_SOC_GONI_WM8994 + tristate "SoC I2S Audio support for GONI - WM8994" + depends on SND_S3C24XX_SOC && MACH_GONI + select SND_S3C64XX_SOC_I2S_V4 + select SND_SOC_WM8994 + help + Say Y if you want to add support for SoC audio on goni + with the WM8994. diff --git a/sound/soc/s3c24xx/Makefile b/sound/soc/s3c24xx/Makefile index 02dd12c714f6..47ed6d70b90b 100644 --- a/sound/soc/s3c24xx/Makefile +++ b/sound/soc/s3c24xx/Makefile @@ -31,6 +31,7 @@ snd-soc-smdk64xx-wm8580-objs := smdk64xx_wm8580.o snd-soc-smdk-wm9713-objs := smdk_wm9713.o snd-soc-s3c64xx-smartq-wm8987-objs := smartq_wm8987.o snd-soc-aquila-wm8994-objs := aquila_wm8994.o +snd-soc-goni-wm8994-objs := goni_wm8994.o obj-$(CONFIG_SND_S3C24XX_SOC_JIVE_WM8750) += snd-soc-jive-wm8750.o obj-$(CONFIG_SND_S3C24XX_SOC_NEO1973_WM8753) += snd-soc-neo1973-wm8753.o @@ -45,3 +46,4 @@ obj-$(CONFIG_SND_S3C64XX_SOC_WM8580) += snd-soc-smdk64xx-wm8580.o obj-$(CONFIG_SND_SOC_SMDK_WM9713) += snd-soc-smdk-wm9713.o obj-$(CONFIG_SND_S3C64XX_SOC_SMARTQ) += snd-soc-s3c64xx-smartq-wm8987.o obj-$(CONFIG_SND_S5PC110_SOC_AQUILA_WM8994) += snd-soc-aquila-wm8994.o +obj-$(CONFIG_SND_S5PV210_SOC_GONI_WM8994) += snd-soc-goni-wm8994.o diff --git a/sound/soc/s3c24xx/goni_wm8994.c b/sound/soc/s3c24xx/goni_wm8994.c new file mode 100644 index 000000000000..694f702cc8e2 --- /dev/null +++ b/sound/soc/s3c24xx/goni_wm8994.c @@ -0,0 +1,298 @@ +/* + * goni_wm8994.c + * + * Copyright (C) 2010 Samsung Electronics Co.Ltd + * Author: Chanwoo Choi + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "../codecs/wm8994.h" +#include "s3c-dma.h" +#include "s3c64xx-i2s.h" + +static struct snd_soc_card goni; +static struct platform_device *goni_snd_device; + +/* 3.5 pie jack */ +static struct snd_soc_jack jack; + +/* 3.5 pie jack detection DAPM pins */ +static struct snd_soc_jack_pin jack_pins[] = { + { + .pin = "Headset Mic", + .mask = SND_JACK_MICROPHONE, + }, { + .pin = "Headset Stereophone", + .mask = SND_JACK_HEADPHONE | SND_JACK_MECHANICAL | + SND_JACK_AVOUT, + }, +}; + +/* 3.5 pie jack detection gpios */ +static struct snd_soc_jack_gpio jack_gpios[] = { + { + .gpio = S5PV210_GPH0(6), + .name = "DET_3.5", + .report = SND_JACK_HEADSET | SND_JACK_MECHANICAL | + SND_JACK_AVOUT, + .debounce_time = 200, + }, +}; + +static const struct snd_soc_dapm_widget goni_dapm_widgets[] = { + SND_SOC_DAPM_SPK("Ext Left Spk", NULL), + SND_SOC_DAPM_SPK("Ext Right Spk", NULL), + SND_SOC_DAPM_SPK("Ext Rcv", NULL), + SND_SOC_DAPM_HP("Headset Stereophone", NULL), + SND_SOC_DAPM_MIC("Headset Mic", NULL), + SND_SOC_DAPM_MIC("Main Mic", NULL), + SND_SOC_DAPM_MIC("2nd Mic", NULL), + SND_SOC_DAPM_LINE("Radio In", NULL), +}; + +static const struct snd_soc_dapm_route goni_dapm_routes[] = { + {"Ext Left Spk", NULL, "SPKOUTLP"}, + {"Ext Left Spk", NULL, "SPKOUTLN"}, + + {"Ext Right Spk", NULL, "SPKOUTRP"}, + {"Ext Right Spk", NULL, "SPKOUTRN"}, + + {"Ext Rcv", NULL, "HPOUT2N"}, + {"Ext Rcv", NULL, "HPOUT2P"}, + + {"Headset Stereophone", NULL, "HPOUT1L"}, + {"Headset Stereophone", NULL, "HPOUT1R"}, + + {"IN1RN", NULL, "Headset Mic"}, + {"IN1RP", NULL, "Headset Mic"}, + + {"IN1RN", NULL, "2nd Mic"}, + {"IN1RP", NULL, "2nd Mic"}, + + {"IN1LN", NULL, "Main Mic"}, + {"IN1LP", NULL, "Main Mic"}, + + {"IN2LN", NULL, "Radio In"}, + {"IN2RN", NULL, "Radio In"}, +}; + +static int goni_wm8994_init(struct snd_soc_pcm_runtime *rtd) +{ + struct snd_soc_codec *codec = rtd->codec; + int ret; + + /* add goni specific widgets */ + snd_soc_dapm_new_controls(codec, goni_dapm_widgets, + ARRAY_SIZE(goni_dapm_widgets)); + + /* set up goni specific audio routes */ + snd_soc_dapm_add_routes(codec, goni_dapm_routes, + ARRAY_SIZE(goni_dapm_routes)); + + /* set endpoints to not connected */ + snd_soc_dapm_nc_pin(codec, "IN2LP:VXRN"); + snd_soc_dapm_nc_pin(codec, "IN2RP:VXRP"); + snd_soc_dapm_nc_pin(codec, "LINEOUT1N"); + snd_soc_dapm_nc_pin(codec, "LINEOUT1P"); + snd_soc_dapm_nc_pin(codec, "LINEOUT2N"); + snd_soc_dapm_nc_pin(codec, "LINEOUT2P"); + + snd_soc_dapm_sync(codec); + + /* Headset jack detection */ + ret = snd_soc_jack_new(&goni, "Headset Jack", + SND_JACK_HEADSET | SND_JACK_MECHANICAL | SND_JACK_AVOUT, + &jack); + if (ret) + return ret; + + ret = snd_soc_jack_add_pins(&jack, ARRAY_SIZE(jack_pins), jack_pins); + if (ret) + return ret; + + ret = snd_soc_jack_add_gpios(&jack, ARRAY_SIZE(jack_gpios), jack_gpios); + if (ret) + return ret; + + return 0; +} + +static int goni_hifi_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + unsigned int pll_out = 24000000; + int ret = 0; + + /* set the cpu DAI configuration */ + ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); + if (ret < 0) + return ret; + + /* set the cpu system clock */ + ret = snd_soc_dai_set_sysclk(cpu_dai, S3C64XX_CLKSRC_PCLK, + 0, SND_SOC_CLOCK_IN); + if (ret < 0) + return ret; + + /* set codec DAI configuration */ + ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); + if (ret < 0) + return ret; + + /* set the codec FLL */ + ret = snd_soc_dai_set_pll(codec_dai, WM8994_FLL1, 0, pll_out, + params_rate(params) * 256); + if (ret < 0) + return ret; + + /* set the codec system clock */ + ret = snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_FLL1, + params_rate(params) * 256, SND_SOC_CLOCK_IN); + if (ret < 0) + return ret; + + return 0; +} + +static struct snd_soc_ops goni_hifi_ops = { + .hw_params = goni_hifi_hw_params, +}; + +static int goni_voice_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + unsigned int pll_out = 24000000; + int ret = 0; + + if (params_rate(params) != 8000) + return -EINVAL; + + /* set codec DAI configuration */ + ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_LEFT_J | + SND_SOC_DAIFMT_IB_IF | SND_SOC_DAIFMT_CBM_CFM); + if (ret < 0) + return ret; + + /* set the codec FLL */ + ret = snd_soc_dai_set_pll(codec_dai, WM8994_FLL2, 0, pll_out, + params_rate(params) * 256); + if (ret < 0) + return ret; + + /* set the codec system clock */ + ret = snd_soc_dai_set_sysclk(codec_dai, WM8994_SYSCLK_FLL2, + params_rate(params) * 256, SND_SOC_CLOCK_IN); + if (ret < 0) + return ret; + + return 0; +} + +static struct snd_soc_dai_driver voice_dai = { + .name = "goni-voice-dai", + .id = 0, + .playback = { + .channels_min = 1, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000, + .formats = SNDRV_PCM_FMTBIT_S16_LE,}, + .capture = { + .channels_min = 1, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000, + .formats = SNDRV_PCM_FMTBIT_S16_LE,}, +}; + +static struct snd_soc_ops goni_voice_ops = { + .hw_params = goni_voice_hw_params, +}; + +static struct snd_soc_dai_link goni_dai[] = { +{ + .name = "WM8994", + .stream_name = "WM8994 HiFi", + .cpu_dai_name = "s3c64xx-i2s-v4", + .codec_dai_name = "wm8994-hifi", + .platform_name = "s3c24xx-pcm-audio", + .codec_name = "wm8994-codec.0-0x1a", + .init = goni_wm8994_init, + .ops = &goni_hifi_ops, +}, { + .name = "WM8994 Voice", + .stream_name = "Voice", + .cpu_dai_name = "goni-voice-dai", + .codec_dai_name = "wm8994-voice", + .platform_name = "s3c24xx-pcm-audio", + .codec_name = "wm8994-codec.0-0x1a", + .ops = &goni_voice_ops, +}, +}; + +static struct snd_soc_card goni = { + .name = "goni", + .dai_link = goni_dai, + .num_links = ARRAY_SIZE(goni_dai), +}; + +static int __init goni_init(void) +{ + int ret; + + if (!machine_is_goni()) + return -ENODEV; + + goni_snd_device = platform_device_alloc("soc-audio", -1); + if (!goni_snd_device) + return -ENOMEM; + + /* register voice DAI here */ + ret = snd_soc_register_dai(&goni_snd_device->dev, &voice_dai); + if (ret) + return ret; + + platform_set_drvdata(goni_snd_device, &goni); + ret = platform_device_add(goni_snd_device); + + if (ret) + platform_device_put(goni_snd_device); + + return ret; +} + +static void __exit goni_exit(void) +{ + platform_device_unregister(goni_snd_device); +} + +module_init(goni_init); +module_exit(goni_exit); + +/* Module information */ +MODULE_DESCRIPTION("ALSA SoC WM8994 GONI(S5PV210)"); +MODULE_AUTHOR("Chanwoo Choi "); +MODULE_LICENSE("GPL"); -- cgit v1.2.3 From 6e6f66226f0092a39526f8d6f02ebb447d995be2 Mon Sep 17 00:00:00 2001 From: Timur Tabi Date: Thu, 22 Jul 2010 11:33:30 -0500 Subject: powerpc: rename immap_86xx.h to fsl_guts.h, and add 85xx support The immap_86xx.h header file only defines one data structure: the "global utilities" register set found on Freescale PowerPC SOCs. Rename this file to fsl_guts.h to reflect its true purpose, and extend it to cover the "GUTS" register set on 85xx chips. Signed-off-by: Timur Tabi Acked-by: Mark Brown Acked-by: Kumar Gala Signed-off-by: Liam Girdwood --- sound/soc/fsl/fsl_ssi.c | 2 -- sound/soc/fsl/mpc8610_hpcd.c | 10 +++++----- 2 files changed, 5 insertions(+), 7 deletions(-) (limited to 'sound') diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index 64f65910a7d7..51b089f9751c 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c @@ -24,8 +24,6 @@ #include #include -#include - #include "fsl_ssi.h" /** diff --git a/sound/soc/fsl/mpc8610_hpcd.c b/sound/soc/fsl/mpc8610_hpcd.c index 5ba823213abe..38339c158ed9 100644 --- a/sound/soc/fsl/mpc8610_hpcd.c +++ b/sound/soc/fsl/mpc8610_hpcd.c @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include "fsl_dma.h" #include "fsl_ssi.h" @@ -57,9 +57,9 @@ static int mpc8610_hpcd_machine_probe(struct platform_device *sound_device) struct snd_soc_card *card = platform_get_drvdata(sound_device); struct mpc8610_hpcd_data *machine_data = container_of(card, struct mpc8610_hpcd_data, card); - struct ccsr_guts __iomem *guts; + struct ccsr_guts_86xx __iomem *guts; - guts = ioremap(guts_phys, sizeof(struct ccsr_guts)); + guts = ioremap(guts_phys, sizeof(struct ccsr_guts_86xx)); if (!guts) { dev_err(card->dev, "could not map global utilities\n"); return -ENOMEM; @@ -142,9 +142,9 @@ static int mpc8610_hpcd_machine_remove(struct platform_device *sound_device) struct snd_soc_card *card = platform_get_drvdata(sound_device); struct mpc8610_hpcd_data *machine_data = container_of(card, struct mpc8610_hpcd_data, card); - struct ccsr_guts __iomem *guts; + struct ccsr_guts_86xx __iomem *guts; - guts = ioremap(guts_phys, sizeof(struct ccsr_guts)); + guts = ioremap(guts_phys, sizeof(struct ccsr_guts_86xx)); if (!guts) { dev_err(card->dev, "could not map global utilities\n"); return -ENOMEM; -- cgit v1.2.3 From 1a3c5a491af6756dbba6ee166a9dee72bb414ba8 Mon Sep 17 00:00:00 2001 From: Timur Tabi Date: Mon, 2 Aug 2010 12:44:36 -0500 Subject: asoc/multi-component: fsl: add support for 36-bit physical addresses Update the DMA driver used by the Freescale MPC8610 HPCD audio driver to support 36-bit physical addresses, for both DMA buffers and the SSI registers. The DMA driver calls snd_dma_alloc_pages() to allocate the DMA buffers for playback and capture. This function is just a front-end for dma_alloc_coherent(). Currently, dma_alloc_coherent() only allocates buffers in low memory (it ignores GFP_HIGHMEM), so we never actually get a DMA buffer with a real 36-bit physical address. Signed-off-by: Timur Tabi Signed-off-by: Liam Girdwood --- sound/soc/fsl/fsl_dma.c | 77 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 26 deletions(-) (limited to 'sound') diff --git a/sound/soc/fsl/fsl_dma.c b/sound/soc/fsl/fsl_dma.c index d09e1941b1fa..4450f9d845c6 100644 --- a/sound/soc/fsl/fsl_dma.c +++ b/sound/soc/fsl/fsl_dma.c @@ -175,13 +175,23 @@ static void fsl_dma_update_pointers(struct fsl_dma_private *dma_private) struct fsl_dma_link_descriptor *link = &dma_private->link[dma_private->current_link]; - /* Update our link descriptors to point to the next period */ - if (dma_private->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - link->source_addr = - cpu_to_be32(dma_private->dma_buf_next); - else - link->dest_addr = - cpu_to_be32(dma_private->dma_buf_next); + /* Update our link descriptors to point to the next period. On a 36-bit + * system, we also need to update the ESAD bits. We also set (keep) the + * snoop bits. See the comments in fsl_dma_hw_params() about snooping. + */ + if (dma_private->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + link->source_addr = cpu_to_be32(dma_private->dma_buf_next); +#ifdef CONFIG_PHYS_64BIT + link->source_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP | + upper_32_bits(dma_private->dma_buf_next)); +#endif + } else { + link->dest_addr = cpu_to_be32(dma_private->dma_buf_next); +#ifdef CONFIG_PHYS_64BIT + link->dest_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP | + upper_32_bits(dma_private->dma_buf_next)); +#endif + } /* Update our variables for next time */ dma_private->dma_buf_next += dma_private->period_size; @@ -273,11 +283,19 @@ static irqreturn_t fsl_dma_isr(int irq, void *dev_id) * This function is called when the codec driver calls snd_soc_new_pcms(), * once for each .dai_link in the machine driver's snd_soc_card * structure. + * + * snd_dma_alloc_pages() is just a front-end to dma_alloc_coherent(), which + * (currently) always allocates the DMA buffer in lowmem, even if GFP_HIGHMEM + * is specified. Therefore, any DMA buffers we allocate will always be in low + * memory, but we support for 36-bit physical addresses anyway. + * + * Regardless of where the memory is actually allocated, since the device can + * technically DMA to any 36-bit address, we do need to set the DMA mask to 36. */ static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai, struct snd_pcm *pcm) { - static u64 fsl_dma_dmamask = DMA_BIT_MASK(32); + static u64 fsl_dma_dmamask = DMA_BIT_MASK(36); int ret; if (!card->dev->dma_mask) @@ -609,12 +627,7 @@ static int fsl_dma_hw_params(struct snd_pcm_substream *substream, link->count = cpu_to_be32(period_size); - /* Even though the DMA controller supports 36-bit addressing, - * for simplicity we allow only 32-bit addresses for the audio - * buffer itself. This was enforced in fsl_dma_new() with the - * DMA mask. - * - * The snoop bit tells the DMA controller whether it should tell + /* The snoop bit tells the DMA controller whether it should tell * the ECM to snoop during a read or write to an address. For * audio, we use DMA to transfer data between memory and an I/O * device (the SSI's STX0 or SRX0 register). Snooping is only @@ -629,20 +642,24 @@ static int fsl_dma_hw_params(struct snd_pcm_substream *substream, * flush out the data for the previous period. So if you * increased period_bytes_min to a large enough size, you might * get more performance by not snooping, and you'll still be - * okay. + * okay. You'll need to update fsl_dma_update_pointers() also. */ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { link->source_addr = cpu_to_be32(temp_addr); - link->source_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP); + link->source_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP | + upper_32_bits(temp_addr)); link->dest_addr = cpu_to_be32(ssi_sxx_phys); - link->dest_attr = cpu_to_be32(CCSR_DMA_ATR_NOSNOOP); + link->dest_attr = cpu_to_be32(CCSR_DMA_ATR_NOSNOOP | + upper_32_bits(ssi_sxx_phys)); } else { link->source_addr = cpu_to_be32(ssi_sxx_phys); - link->source_attr = cpu_to_be32(CCSR_DMA_ATR_NOSNOOP); + link->source_attr = cpu_to_be32(CCSR_DMA_ATR_NOSNOOP | + upper_32_bits(ssi_sxx_phys)); link->dest_addr = cpu_to_be32(temp_addr); - link->dest_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP); + link->dest_attr = cpu_to_be32(CCSR_DMA_ATR_SNOOP | + upper_32_bits(temp_addr)); } temp_addr += period_size; @@ -673,10 +690,23 @@ static snd_pcm_uframes_t fsl_dma_pointer(struct snd_pcm_substream *substream) dma_addr_t position; snd_pcm_uframes_t frames; - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + /* Obtain the current DMA pointer, but don't read the ESAD bits if we + * only have 32-bit DMA addresses. This function is typically called + * in interrupt context, so we need to optimize it. + */ + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { position = in_be32(&dma_channel->sar); - else +#ifdef CONFIG_PHYS_64BIT + position |= (u64)(in_be32(&dma_channel->satr) & + CCSR_DMA_ATR_ESAD_MASK) << 32; +#endif + } else { position = in_be32(&dma_channel->dar); +#ifdef CONFIG_PHYS_64BIT + position |= (u64)(in_be32(&dma_channel->datr) & + CCSR_DMA_ATR_ESAD_MASK) << 32; +#endif + } /* * When capture is started, the SSI immediately starts to fill its FIFO. @@ -936,11 +966,6 @@ static void __exit fsl_soc_dma_exit(void) of_unregister_platform_driver(&fsl_soc_dma_driver); } -/* We want the DMA driver to be initialized before the SSI driver, so that - * when the SSI driver calls fsl_soc_dma_dai_from_node(), the DMA driver - * will already have been probed. The easiest way to do that is to make the - * __init function called via arch_initcall(). - */ module_init(fsl_soc_dma_init); module_exit(fsl_soc_dma_exit); -- cgit v1.2.3 From 87a0632b29410bab5c1783d7eb979c8d942d4209 Mon Sep 17 00:00:00 2001 From: Timur Tabi Date: Tue, 3 Aug 2010 17:55:28 -0500 Subject: asoc/multi-component: fsl: fix exit and error paths in DMA and SSI drivers The error handling code in the OF probe function of the SSI driver is not freeing all resources correctly. Since the machine driver no longer calls the DMA driver to provide information about the SSI, we don't need to keep a list of DMA objects any more. In addition, the fsl_soc_dma_remove() function is incorrectly removing *all* DMA objects when it should only remove one. Signed-off-by: Timur Tabi Signed-off-by: Liam Girdwood --- sound/soc/fsl/fsl_dma.c | 23 +++++++---------------- sound/soc/fsl/fsl_ssi.c | 29 ++++++++++++++++------------- 2 files changed, 23 insertions(+), 29 deletions(-) (limited to 'sound') diff --git a/sound/soc/fsl/fsl_dma.c b/sound/soc/fsl/fsl_dma.c index 4450f9d845c6..57774cb91ae3 100644 --- a/sound/soc/fsl/fsl_dma.c +++ b/sound/soc/fsl/fsl_dma.c @@ -57,7 +57,6 @@ SNDRV_PCM_RATE_CONTINUOUS) struct dma_object { - struct list_head list; struct snd_soc_platform_driver dai; dma_addr_t ssi_stx_phys; dma_addr_t ssi_srx_phys; @@ -825,9 +824,6 @@ static void fsl_dma_free_dma_buffers(struct snd_pcm *pcm) } } -/* List of DMA nodes that we've probed */ -static LIST_HEAD(dma_list); - /** * find_ssi_node -- returns the SSI node that points to his DMA channel node * @@ -915,25 +911,20 @@ static int __devinit fsl_soc_dma_probe(struct of_device *of_dev, dma->channel = of_iomap(np, 0); dma->irq = irq_of_parse_and_map(np, 0); - list_add(&dma->list, &dma_list); + + dev_set_drvdata(&of_dev->dev, dma); return 0; } static int __devexit fsl_soc_dma_remove(struct of_device *of_dev) { - struct list_head *n, *ptr; - struct dma_object *dma; + struct dma_object *dma = dev_get_drvdata(&of_dev->dev); - list_for_each_safe(ptr, n, &dma_list) { - dma = list_entry(ptr, struct dma_object, list); - list_del_init(ptr); - - snd_soc_unregister_platform(&of_dev->dev); - iounmap(dma->channel); - irq_dispose_mapping(dma->irq); - kfree(dma); - } + snd_soc_unregister_platform(&of_dev->dev); + iounmap(dma->channel); + irq_dispose_mapping(dma->irq); + kfree(dma); return 0; } diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index 51b089f9751c..00e3e625b52a 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c @@ -619,7 +619,7 @@ static int __devinit fsl_ssi_probe(struct of_device *of_dev, { struct fsl_ssi_private *ssi_private; int ret = 0; - struct device_attribute *dev_attr; + struct device_attribute *dev_attr = NULL; struct device_node *np = of_dev->dev.of_node; const char *p, *sprop; struct resource res; @@ -681,18 +681,16 @@ static int __devinit fsl_ssi_probe(struct of_device *of_dev, if (ret) { dev_err(&of_dev->dev, "could not create sysfs %s file\n", ssi_private->dev_attr.attr.name); - kfree(ssi_private); - return ret; + goto error; } /* Register with ASoC */ dev_set_drvdata(&of_dev->dev, ssi_private); ret = snd_soc_register_dai(&of_dev->dev, &ssi_private->cpu_dai_drv); - if (ret != 0) { + if (ret) { dev_err(&of_dev->dev, "failed to register DAI: %d\n", ret); - kfree(ssi_private); - return ret; + goto error; } /* Trigger the machine driver's probe function. The platform driver @@ -713,18 +711,23 @@ static int __devinit fsl_ssi_probe(struct of_device *of_dev, if (IS_ERR(ssi_private->pdev)) { ret = PTR_ERR(ssi_private->pdev); dev_err(&of_dev->dev, "failed to register platform: %d\n", ret); - kfree(ssi_private); - return ret; + goto error; } return 0; + +error: + snd_soc_unregister_dai(&of_dev->dev); + dev_set_drvdata(&of_dev->dev, NULL); + if (dev_attr) + device_remove_file(&of_dev->dev, dev_attr); + irq_dispose_mapping(ssi_private->irq); + iounmap(ssi_private->ssi); + kfree(ssi_private); + + return ret; } -/** - * fsl_ssi_destroy_dai: destroy the snd_soc_dai object - * - * This function undoes the operations of fsl_ssi_probe() - */ static int fsl_ssi_remove(struct of_device *of_dev) { struct fsl_ssi_private *ssi_private = dev_get_drvdata(&of_dev->dev); -- cgit v1.2.3 From ff71334a46844d0ae6ff0055c549790bcd27bb10 Mon Sep 17 00:00:00 2001 From: Timur Tabi Date: Wed, 4 Aug 2010 17:51:08 -0500 Subject: asoc/multi-component: fsl: add support for disabled SSI nodes Add support for adding "status = disabled" to an SSI node to incidate that it is not wired on the board. This replaces the not-so-intuitive previous method of omitting a codec-handle property. Signed-off-by: Timur Tabi Acked-by: Kumar Gala Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/fsl/fsl_ssi.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index 00e3e625b52a..7939c337ed9d 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c @@ -625,12 +625,19 @@ static int __devinit fsl_ssi_probe(struct of_device *of_dev, struct resource res; char name[64]; - /* We are only interested in SSIs with a codec phandle in them, so let's - * make sure this SSI has one. + /* SSIs that are not connected on the board should have a + * status = "disabled" + * property in their device tree nodes. */ - if (!of_get_property(np, "codec-handle", NULL)) + if (!of_device_is_available(np)) return -ENODEV; + /* Check for a codec-handle property. */ + if (!of_get_property(np, "codec-handle", NULL)) { + dev_err(&of_dev->dev, "missing codec-handle property\n"); + return -ENODEV; + } + /* We only support the SSI in "I2S Slave" mode */ sprop = of_get_property(np, "fsl,mode", NULL); if (!sprop || strcmp(sprop, "i2s-slave")) { -- cgit v1.2.3 From 26e277d7151abcef8efa1e6f1f0d1420d4ed17c6 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Thu, 12 Aug 2010 10:57:04 +0100 Subject: ASoC: Remove version display from WM8510 driver Signed-off-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/wm8510.c | 4 ---- 1 file changed, 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8510.c b/sound/soc/codecs/wm8510.c index dbfa05d2cb92..1c623de4a4cd 100644 --- a/sound/soc/codecs/wm8510.c +++ b/sound/soc/codecs/wm8510.c @@ -29,8 +29,6 @@ #include "wm8510.h" -#define WM8510_VERSION "0.6" - /* * wm8510 register cache * We can't read the WM8510 register space when we are @@ -563,8 +561,6 @@ static int wm8510_probe(struct snd_soc_codec *codec) struct wm8510_priv *wm8510 = snd_soc_codec_get_drvdata(codec); int ret; - pr_info("WM8510 Audio Codec %s", WM8510_VERSION); - codec->control_data = wm8510->control_data; ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8510->control_type); if (ret < 0) { -- cgit v1.2.3 From af3751a0bfe4d461e0567961dc06448f2128e26f Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Thu, 12 Aug 2010 11:04:14 +0100 Subject: ASoC: Remove unneeded control_data management from Wolfson drivers Now soc-cache.c can figure out the I2C and SPI control data from the device for the CODEC we don't need to manually assign it in drivers. Signed-off-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/wm8510.c | 4 ---- sound/soc/codecs/wm8523.c | 3 --- sound/soc/codecs/wm8580.c | 3 --- sound/soc/codecs/wm8711.c | 4 ---- sound/soc/codecs/wm8728.c | 4 ---- sound/soc/codecs/wm8731.c | 4 ---- sound/soc/codecs/wm8741.c | 3 --- sound/soc/codecs/wm8750.c | 4 ---- sound/soc/codecs/wm8753.c | 6 +----- sound/soc/codecs/wm8776.c | 4 ---- sound/soc/codecs/wm8900.c | 4 ---- sound/soc/codecs/wm8903.c | 3 --- sound/soc/codecs/wm8955.c | 3 --- sound/soc/codecs/wm8961.c | 3 --- sound/soc/codecs/wm8971.c | 3 --- sound/soc/codecs/wm8974.c | 3 --- sound/soc/codecs/wm8988.c | 4 ---- sound/soc/codecs/wm8990.c | 4 ---- sound/soc/codecs/wm8993.c | 3 --- 19 files changed, 1 insertion(+), 68 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8510.c b/sound/soc/codecs/wm8510.c index 1c623de4a4cd..d00da2001a12 100644 --- a/sound/soc/codecs/wm8510.c +++ b/sound/soc/codecs/wm8510.c @@ -60,7 +60,6 @@ static const u16 wm8510_reg[WM8510_CACHEREGNUM] = { /* codec private data */ struct wm8510_priv { enum snd_soc_control_type control_type; - void *control_data; }; static const char *wm8510_companding[] = { "Off", "NC", "u-law", "A-law" }; @@ -561,7 +560,6 @@ static int wm8510_probe(struct snd_soc_codec *codec) struct wm8510_priv *wm8510 = snd_soc_codec_get_drvdata(codec); int ret; - codec->control_data = wm8510->control_data; ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8510->control_type); if (ret < 0) { printk(KERN_ERR "wm8510: failed to set cache I/O: %d\n", ret); @@ -611,7 +609,6 @@ static int __devinit wm8510_spi_probe(struct spi_device *spi) if (wm8510 == NULL) return -ENOMEM; - wm8510->control_data = spi; wm8510->control_type = SND_SOC_SPI; spi_set_drvdata(spi, wm8510); @@ -651,7 +648,6 @@ static __devinit int wm8510_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8510); - wm8510->control_data = i2c; wm8510->control_type = SND_SOC_I2C; ret = snd_soc_register_codec(&i2c->dev, diff --git a/sound/soc/codecs/wm8523.c b/sound/soc/codecs/wm8523.c index 58d411b6faaf..712ef7c76f90 100644 --- a/sound/soc/codecs/wm8523.c +++ b/sound/soc/codecs/wm8523.c @@ -41,7 +41,6 @@ static const char *wm8523_supply_names[WM8523_NUM_SUPPLIES] = { /* codec private data */ struct wm8523_priv { enum snd_soc_control_type control_type; - void *control_data; u16 reg_cache[WM8523_REGISTER_COUNT]; struct regulator_bulk_data supplies[WM8523_NUM_SUPPLIES]; unsigned int sysclk; @@ -419,7 +418,6 @@ static int wm8523_probe(struct snd_soc_codec *codec) int ret, i; codec->hw_write = (hw_write_t)i2c_master_send; - codec->control_data = wm8523->control_data; wm8523->rate_constraint.list = &wm8523->rate_constraint_list[0]; wm8523->rate_constraint.count = ARRAY_SIZE(wm8523->rate_constraint_list); @@ -528,7 +526,6 @@ static __devinit int wm8523_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8523); - wm8523->control_data = i2c; wm8523->control_type = SND_SOC_I2C; ret = snd_soc_register_codec(&i2c->dev, diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c index cae58941a32f..39ad46c41e8a 100644 --- a/sound/soc/codecs/wm8580.c +++ b/sound/soc/codecs/wm8580.c @@ -200,7 +200,6 @@ static const char *wm8580_supply_names[WM8580_NUM_SUPPLIES] = { /* codec private data */ struct wm8580_priv { enum snd_soc_control_type control_type; - void *control_data; struct regulator_bulk_data supplies[WM8580_NUM_SUPPLIES]; u16 reg_cache[WM8580_MAX_REGISTER + 1]; struct pll_state a; @@ -778,7 +777,6 @@ static int wm8580_probe(struct snd_soc_codec *codec) struct wm8580_priv *wm8580 = snd_soc_codec_get_drvdata(codec); int ret = 0,i; - codec->control_data = wm8580->control_data; ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8580->control_type); if (ret < 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); @@ -858,7 +856,6 @@ static int wm8580_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8580); - wm8580->control_data = i2c; wm8580->control_type = SND_SOC_I2C; ret = snd_soc_register_codec(&i2c->dev, diff --git a/sound/soc/codecs/wm8711.c b/sound/soc/codecs/wm8711.c index 8d942b3b111f..f8d9c60e7fad 100644 --- a/sound/soc/codecs/wm8711.c +++ b/sound/soc/codecs/wm8711.c @@ -34,7 +34,6 @@ /* codec private data */ struct wm8711_priv { enum snd_soc_control_type bus_type; - void *control_data; u16 reg_cache[WM8711_CACHEREGNUM]; unsigned int sysclk; }; @@ -378,7 +377,6 @@ static int wm8711_probe(struct snd_soc_codec *codec) struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec); int ret, reg; - codec->control_data = wm8711->control_data; ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8711->bus_type); if (ret < 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); @@ -436,7 +434,6 @@ static int __devinit wm8711_spi_probe(struct spi_device *spi) return -ENOMEM; spi_set_drvdata(spi, wm8711); - wm8711->control_data = spi; wm8711->bus_type = SND_SOC_SPI; ret = snd_soc_register_codec(&spi->dev, @@ -476,7 +473,6 @@ static __devinit int wm8711_i2c_probe(struct i2c_client *client, return -ENOMEM; i2c_set_clientdata(client, wm8711); - wm8711->control_data = client; wm8711->bus_type = SND_SOC_I2C; ret = snd_soc_register_codec(&client->dev, diff --git a/sound/soc/codecs/wm8728.c b/sound/soc/codecs/wm8728.c index ae2292444783..5e5a1625194c 100644 --- a/sound/soc/codecs/wm8728.c +++ b/sound/soc/codecs/wm8728.c @@ -45,7 +45,6 @@ static const u16 wm8728_reg_defaults[] = { /* codec private data */ struct wm8728_priv { enum snd_soc_control_type control_type; - void *control_data; }; static const DECLARE_TLV_DB_SCALE(wm8728_tlv, -12750, 50, 1); @@ -244,7 +243,6 @@ static int wm8728_probe(struct snd_soc_codec *codec) struct wm8728_priv *wm8728 = snd_soc_codec_get_drvdata(codec); int ret; - codec->control_data = wm8728->control_data; ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8728->control_type); if (ret < 0) { printk(KERN_ERR "wm8728: failed to configure cache I/O: %d\n", @@ -289,7 +287,6 @@ static int __devinit wm8728_spi_probe(struct spi_device *spi) if (wm8728 == NULL) return -ENOMEM; - wm8728->control_data = spi; wm8728->control_type = SND_SOC_SPI; spi_set_drvdata(spi, wm8728); @@ -330,7 +327,6 @@ static __devinit int wm8728_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8728); - wm8728->control_data = i2c; wm8728->control_type = SND_SOC_I2C; ret = snd_soc_register_codec(&i2c->dev, diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c index 7da360ee1fee..19844fc8cb1d 100644 --- a/sound/soc/codecs/wm8731.c +++ b/sound/soc/codecs/wm8731.c @@ -43,7 +43,6 @@ static const char *wm8731_supply_names[WM8731_NUM_SUPPLIES] = { /* codec private data */ struct wm8731_priv { enum snd_soc_control_type control_type; - void *control_data; struct regulator_bulk_data supplies[WM8731_NUM_SUPPLIES]; u16 reg_cache[WM8731_CACHEREGNUM]; unsigned int sysclk; @@ -463,7 +462,6 @@ static int wm8731_probe(struct snd_soc_codec *codec) int ret = 0, i; codec->bias_level = SND_SOC_BIAS_OFF, - codec->control_data = wm8731->control_data; ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8731->control_type); if (ret < 0) { @@ -557,7 +555,6 @@ static int __devinit wm8731_spi_probe(struct spi_device *spi) if (wm8731 == NULL) return -ENOMEM; - wm8731->control_data = spi; wm8731->control_type = SND_SOC_SPI; spi_set_drvdata(spi, wm8731); @@ -598,7 +595,6 @@ static __devinit int wm8731_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8731); - wm8731->control_data = i2c; wm8731->control_type = SND_SOC_I2C; ret = snd_soc_register_codec(&i2c->dev, diff --git a/sound/soc/codecs/wm8741.c b/sound/soc/codecs/wm8741.c index 0c6d59e4d226..782fe539662b 100644 --- a/sound/soc/codecs/wm8741.c +++ b/sound/soc/codecs/wm8741.c @@ -41,7 +41,6 @@ static const char *wm8741_supply_names[WM8741_NUM_SUPPLIES] = { /* codec private data */ struct wm8741_priv { enum snd_soc_control_type control_type; - void *control_data; u16 reg_cache[WM8741_REGISTER_COUNT]; struct regulator_bulk_data supplies[WM8741_NUM_SUPPLIES]; unsigned int sysclk; @@ -347,7 +346,6 @@ static int wm8741_probe(struct snd_soc_codec *codec) struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec); int ret = 0; - codec->control_data = wm8741->control_data; ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8741->control_type); if (ret != 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); @@ -415,7 +413,6 @@ static int wm8741_i2c_probe(struct i2c_client *i2c, } i2c_set_clientdata(i2c, wm8741); - wm8741->control_data = i2c; wm8741->control_type = SND_SOC_I2C; ret = snd_soc_register_codec(&i2c->dev, diff --git a/sound/soc/codecs/wm8750.c b/sound/soc/codecs/wm8750.c index 89863a5bc830..92d4b2aef93b 100644 --- a/sound/soc/codecs/wm8750.c +++ b/sound/soc/codecs/wm8750.c @@ -53,7 +53,6 @@ static const u16 wm8750_reg[] = { struct wm8750_priv { unsigned int sysclk; enum snd_soc_control_type control_type; - void *control_data; u16 reg_cache[ARRAY_SIZE(wm8750_reg)]; }; @@ -697,7 +696,6 @@ static int wm8750_probe(struct snd_soc_codec *codec) struct wm8750_priv *wm8750 = snd_soc_codec_get_drvdata(codec); int reg, ret; - codec->control_data = wm8750->control_data; ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8750->control_type); if (ret < 0) { printk(KERN_ERR "wm8750: failed to set cache I/O: %d\n", ret); @@ -764,7 +762,6 @@ static int __devinit wm8750_spi_probe(struct spi_device *spi) if (wm8750 == NULL) return -ENOMEM; - wm8750->control_data = spi; wm8750->control_type = SND_SOC_SPI; spi_set_drvdata(spi, wm8750); @@ -805,7 +802,6 @@ static __devinit int wm8750_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8750); - wm8750->control_data = i2c; wm8750->control_type = SND_SOC_I2C; ret = snd_soc_register_codec(&i2c->dev, diff --git a/sound/soc/codecs/wm8753.c b/sound/soc/codecs/wm8753.c index 976e408b3616..484423248c26 100644 --- a/sound/soc/codecs/wm8753.c +++ b/sound/soc/codecs/wm8753.c @@ -86,7 +86,6 @@ static const u16 wm8753_reg[] = { /* codec private data */ struct wm8753_priv { enum snd_soc_control_type control_type; - void *control_data; unsigned int sysclk; unsigned int pcmclk; u16 reg_cache[ARRAY_SIZE(wm8753_reg)]; @@ -1551,8 +1550,7 @@ static int wm8753_probe(struct snd_soc_codec *codec) struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); int ret = 0, reg; - codec->bias_level = SND_SOC_BIAS_OFF, - codec->control_data = wm8753->control_data; + codec->bias_level = SND_SOC_BIAS_OFF; INIT_DELAYED_WORK(&codec->delayed_work, wm8753_work); ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8753->control_type); @@ -1637,7 +1635,6 @@ static int __devinit wm8753_spi_probe(struct spi_device *spi) if (wm8753 == NULL) return -ENOMEM; - wm8753->control_data = spi; wm8753->control_type = SND_SOC_SPI; spi_set_drvdata(spi, wm8753); @@ -1678,7 +1675,6 @@ static __devinit int wm8753_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8753); - wm8753->control_data = i2c; wm8753->control_type = SND_SOC_I2C; ret = snd_soc_register_codec(&i2c->dev, diff --git a/sound/soc/codecs/wm8776.c b/sound/soc/codecs/wm8776.c index 51a2d265d40e..053030679c1a 100644 --- a/sound/soc/codecs/wm8776.c +++ b/sound/soc/codecs/wm8776.c @@ -34,7 +34,6 @@ /* codec private data */ struct wm8776_priv { enum snd_soc_control_type control_type; - void *control_data; u16 reg_cache[WM8776_CACHEREGNUM]; int sysclk[2]; }; @@ -415,7 +414,6 @@ static int wm8776_probe(struct snd_soc_codec *codec) struct wm8776_priv *wm8776 = snd_soc_codec_get_drvdata(codec); int ret = 0; - codec->control_data = wm8776->control_data; ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8776->control_type); if (ret < 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); @@ -472,7 +470,6 @@ static int __devinit wm8776_spi_probe(struct spi_device *spi) if (wm8776 == NULL) return -ENOMEM; - wm8776->control_data = spi; wm8776->control_type = SND_SOC_SPI; spi_set_drvdata(spi, wm8776); @@ -513,7 +510,6 @@ static __devinit int wm8776_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8776); - wm8776->control_data = i2c; wm8776->control_type = SND_SOC_I2C; ret = snd_soc_register_codec(&i2c->dev, diff --git a/sound/soc/codecs/wm8900.c b/sound/soc/codecs/wm8900.c index 33c3b57f3f66..1378aab5ca75 100644 --- a/sound/soc/codecs/wm8900.c +++ b/sound/soc/codecs/wm8900.c @@ -140,7 +140,6 @@ struct wm8900_priv { enum snd_soc_control_type control_type; - void *control_data; u16 reg_cache[WM8900_MAXREG]; u32 fll_in; /* FLL input frequency */ @@ -1189,7 +1188,6 @@ static int wm8900_probe(struct snd_soc_codec *codec) struct wm8900_priv *wm8900 = snd_soc_codec_get_drvdata(codec); int ret = 0, reg; - codec->control_data = wm8900->control_data; ret = snd_soc_codec_set_cache_io(codec, 8, 16, wm8900->control_type); if (ret != 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); @@ -1273,7 +1271,6 @@ static int __devinit wm8900_spi_probe(struct spi_device *spi) if (wm8900 == NULL) return -ENOMEM; - wm8900->control_data = spi; wm8900->control_type = SND_SOC_SPI; spi_set_drvdata(spi, wm8900); @@ -1314,7 +1311,6 @@ static __devinit int wm8900_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8900); - wm8900->control_data = i2c; wm8900->control_type = SND_SOC_I2C; ret = snd_soc_register_codec(&i2c->dev, diff --git a/sound/soc/codecs/wm8903.c b/sound/soc/codecs/wm8903.c index f5d73ed72cbd..622b60238a82 100644 --- a/sound/soc/codecs/wm8903.c +++ b/sound/soc/codecs/wm8903.c @@ -217,7 +217,6 @@ struct wm8903_priv { u16 reg_cache[ARRAY_SIZE(wm8903_reg_defaults)]; int sysclk; - struct i2c_client *control_data; int irq; /* Reference counts */ @@ -1639,7 +1638,6 @@ static int wm8903_probe(struct snd_soc_codec *codec) u16 val; init_completion(&wm8903->wseq); - codec->control_data = wm8903->control_data; ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C); if (ret != 0) { @@ -1779,7 +1777,6 @@ static __devinit int wm8903_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8903); - wm8903->control_data = i2c; wm8903->irq = i2c->irq; ret = snd_soc_register_codec(&i2c->dev, diff --git a/sound/soc/codecs/wm8955.c b/sound/soc/codecs/wm8955.c index a5a9f8ef5771..f89ad6c9a80b 100644 --- a/sound/soc/codecs/wm8955.c +++ b/sound/soc/codecs/wm8955.c @@ -41,7 +41,6 @@ static const char *wm8955_supply_names[WM8955_NUM_SUPPLIES] = { /* codec private data */ struct wm8955_priv { enum snd_soc_control_type control_type; - void *control_data; u16 reg_cache[WM8955_MAX_REGISTER + 1]; @@ -904,7 +903,6 @@ static int wm8955_probe(struct snd_soc_codec *codec) struct wm8955_pdata *pdata = dev_get_platdata(codec->dev); int ret, i; - codec->control_data = wm8955->control_data; ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8955->control_type); if (ret != 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); @@ -1004,7 +1002,6 @@ static __devinit int wm8955_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8955); - wm8955->control_data = i2c; ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm8955, &wm8955_dai, 1); diff --git a/sound/soc/codecs/wm8961.c b/sound/soc/codecs/wm8961.c index 5ebe2c04e5cf..fa36a62972f8 100644 --- a/sound/soc/codecs/wm8961.c +++ b/sound/soc/codecs/wm8961.c @@ -289,7 +289,6 @@ static u16 wm8961_reg_defaults[] = { struct wm8961_priv { enum snd_soc_control_type control_type; - void *control_data; int sysclk; u16 reg_cache[WM8961_MAX_REGISTER]; }; @@ -964,7 +963,6 @@ static int wm8961_probe(struct snd_soc_codec *codec) int ret = 0; u16 reg; - codec->control_data = wm8961->control_data; ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C); if (ret != 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); @@ -1096,7 +1094,6 @@ static __devinit int wm8961_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8961); - wm8961->control_data = i2c; ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm8961, &wm8961_dai, 1); diff --git a/sound/soc/codecs/wm8971.c b/sound/soc/codecs/wm8971.c index ad2692afbb31..1d460735c4d3 100644 --- a/sound/soc/codecs/wm8971.c +++ b/sound/soc/codecs/wm8971.c @@ -39,7 +39,6 @@ static struct workqueue_struct *wm8971_workq = NULL; /* codec private data */ struct wm8971_priv { enum snd_soc_control_type control_type; - void *control_data; unsigned int sysclk; }; @@ -642,7 +641,6 @@ static int wm8971_probe(struct snd_soc_codec *codec) pr_info("WM8971 Audio Codec %s", WM8971_VERSION); - codec->control_data = wm8971->control_data; ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8971->control_type); if (ret < 0) { printk(KERN_ERR "wm8971: failed to set cache I/O: %d\n", ret); @@ -725,7 +723,6 @@ static __devinit int wm8971_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8971); - wm8971->control_data = i2c; ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm8971, &wm8971_dai, 1); diff --git a/sound/soc/codecs/wm8974.c b/sound/soc/codecs/wm8974.c index 52f631c62e29..e61728b7339f 100644 --- a/sound/soc/codecs/wm8974.c +++ b/sound/soc/codecs/wm8974.c @@ -52,7 +52,6 @@ static const u16 wm8974_reg[WM8974_CACHEREGNUM] = { struct wm8974_priv { enum snd_soc_control_type control_type; - void *control_data; u16 reg_cache[WM8974_CACHEREGNUM]; }; @@ -611,7 +610,6 @@ static int wm8974_probe(struct snd_soc_codec *codec) struct wm8974_priv *wm8974 = snd_soc_codec_get_drvdata(codec); int ret = 0; - codec->control_data = wm8974->control_data; ret = snd_soc_codec_set_cache_io(codec, 7, 9, SND_SOC_I2C); if (ret < 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); @@ -662,7 +660,6 @@ static __devinit int wm8974_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8974); - wm8974->control_data = i2c; ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm8974, &wm8974_dai, 1); diff --git a/sound/soc/codecs/wm8988.c b/sound/soc/codecs/wm8988.c index ecbffcea71db..d070a58e4f8e 100644 --- a/sound/soc/codecs/wm8988.c +++ b/sound/soc/codecs/wm8988.c @@ -53,7 +53,6 @@ static const u16 wm8988_reg[] = { struct wm8988_priv { unsigned int sysclk; enum snd_soc_control_type control_type; - void *control_data; struct snd_pcm_hw_constraint_list *sysclk_constraints; u16 reg_cache[WM8988_NUM_REG]; }; @@ -763,7 +762,6 @@ static int wm8988_probe(struct snd_soc_codec *codec) int ret = 0; u16 reg; - codec->control_data = wm8988->control_data; ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8988->control_type); if (ret < 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); @@ -826,7 +824,6 @@ static int __devinit wm8988_spi_probe(struct spi_device *spi) if (wm8988 == NULL) return -ENOMEM; - wm8988->control_data = spi; wm8988->control_type = SND_SOC_SPI; spi_set_drvdata(spi, wm8988); @@ -867,7 +864,6 @@ static __devinit int wm8988_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8988); - wm8988->control_data = i2c; wm8988->control_type = SND_SOC_I2C; ret = snd_soc_register_codec(&i2c->dev, diff --git a/sound/soc/codecs/wm8990.c b/sound/soc/codecs/wm8990.c index b25243382966..0ffecbd1e33b 100644 --- a/sound/soc/codecs/wm8990.c +++ b/sound/soc/codecs/wm8990.c @@ -33,7 +33,6 @@ /* codec private data */ struct wm8990_priv { enum snd_soc_control_type control_type; - void *control_data; unsigned int sysclk; unsigned int pcmclk; }; @@ -1343,11 +1342,9 @@ static int wm8990_resume(struct snd_soc_codec *codec) */ static int wm8990_probe(struct snd_soc_codec *codec) { - struct wm8990_priv *wm8990 = snd_soc_codec_get_drvdata(codec); int ret; u16 reg; - codec->control_data = wm8990->control_data; ret = snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_I2C); if (ret < 0) { printk(KERN_ERR "wm8990: failed to set cache I/O: %d\n", ret); @@ -1410,7 +1407,6 @@ static __devinit int wm8990_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8990); - wm8990->control_data = i2c; ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm8990, &wm8990_dai, 1); diff --git a/sound/soc/codecs/wm8993.c b/sound/soc/codecs/wm8993.c index 1d9e1837a2df..a3fd6b935804 100644 --- a/sound/soc/codecs/wm8993.c +++ b/sound/soc/codecs/wm8993.c @@ -230,7 +230,6 @@ struct wm8993_priv { struct regulator_bulk_data supplies[WM8993_NUM_SUPPLIES]; struct wm8993_platform_data pdata; enum snd_soc_control_type control_type; - void *control_data; int master; int sysclk_source; int tdm_slots; @@ -1425,7 +1424,6 @@ static int wm8993_probe(struct snd_soc_codec *codec) struct wm8993_priv *wm8993 = snd_soc_codec_get_drvdata(codec); int ret, i, val; - codec->control_data = wm8993->control_data; wm8993->hubs_data.hp_startup_mode = 1; wm8993->hubs_data.dcs_codes = -2; @@ -1606,7 +1604,6 @@ static __devinit int wm8993_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, wm8993); - wm8993->control_data = i2c; ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm8993, &wm8993_dai, 1); -- cgit v1.2.3 From 38445af3bc0658615fd9a724fbcb67148eac2cd3 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Thu, 12 Aug 2010 10:57:05 +0100 Subject: ASoC: Remove version display from WM8971 driver Signed-off-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/wm8971.c | 4 ---- 1 file changed, 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8971.c b/sound/soc/codecs/wm8971.c index 1d460735c4d3..63f6dbf5d070 100644 --- a/sound/soc/codecs/wm8971.c +++ b/sound/soc/codecs/wm8971.c @@ -30,8 +30,6 @@ #include "wm8971.h" -#define WM8971_VERSION "0.9" - #define WM8971_REG_COUNT 43 static struct workqueue_struct *wm8971_workq = NULL; @@ -639,8 +637,6 @@ static int wm8971_probe(struct snd_soc_codec *codec) int ret = 0; u16 reg; - pr_info("WM8971 Audio Codec %s", WM8971_VERSION); - ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8971->control_type); if (ret < 0) { printk(KERN_ERR "wm8971: failed to set cache I/O: %d\n", ret); -- cgit v1.2.3 From 960d0697919aef453273e3a0ccc87daf52d808ac Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Thu, 12 Aug 2010 11:02:19 +0100 Subject: ASoC: Add MODULE_ALIAS to Samsung DAI drivers Signed-off-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/s3c24xx/s3c-ac97.c | 1 + sound/soc/s3c24xx/s3c-dma.c | 1 + sound/soc/s3c24xx/s3c-pcm.c | 1 + sound/soc/s3c24xx/s3c2412-i2s.c | 1 + sound/soc/s3c24xx/s3c24xx-i2s.c | 1 + sound/soc/s3c24xx/s3c64xx-i2s-v4.c | 1 + sound/soc/s3c24xx/s3c64xx-i2s.c | 1 + 7 files changed, 7 insertions(+) (limited to 'sound') diff --git a/sound/soc/s3c24xx/s3c-ac97.c b/sound/soc/s3c24xx/s3c-ac97.c index 86f4a9b4a869..26f4ed90a0ee 100644 --- a/sound/soc/s3c24xx/s3c-ac97.c +++ b/sound/soc/s3c24xx/s3c-ac97.c @@ -513,3 +513,4 @@ module_exit(s3c_ac97_exit); MODULE_AUTHOR("Jaswinder Singh, "); MODULE_DESCRIPTION("AC97 driver for the Samsung SoC"); MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:s3c-ac97"); diff --git a/sound/soc/s3c24xx/s3c-dma.c b/sound/soc/s3c24xx/s3c-dma.c index 9f91b2d51454..54bff83c98b4 100644 --- a/sound/soc/s3c24xx/s3c-dma.c +++ b/sound/soc/s3c24xx/s3c-dma.c @@ -500,3 +500,4 @@ module_exit(snd_s3c24xx_pcm_exit); MODULE_AUTHOR("Ben Dooks, "); MODULE_DESCRIPTION("Samsung S3C Audio DMA module"); MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:s3c24xx-pcm-audio"); diff --git a/sound/soc/s3c24xx/s3c-pcm.c b/sound/soc/s3c24xx/s3c-pcm.c index 653ffa270915..6174e26e433e 100644 --- a/sound/soc/s3c24xx/s3c-pcm.c +++ b/sound/soc/s3c24xx/s3c-pcm.c @@ -543,3 +543,4 @@ module_exit(s3c_pcm_exit); MODULE_AUTHOR("Jaswinder Singh, "); MODULE_DESCRIPTION("S3C PCM Controller Driver"); MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:samsung-pcm-audio"); diff --git a/sound/soc/s3c24xx/s3c2412-i2s.c b/sound/soc/s3c24xx/s3c2412-i2s.c index acd00962ac36..4a861cfa52c5 100644 --- a/sound/soc/s3c24xx/s3c2412-i2s.c +++ b/sound/soc/s3c24xx/s3c2412-i2s.c @@ -209,3 +209,4 @@ module_exit(s3c2412_i2s_exit); MODULE_AUTHOR("Ben Dooks, "); MODULE_DESCRIPTION("S3C2412 I2S SoC Interface"); MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:s3c2412-iis"); diff --git a/sound/soc/s3c24xx/s3c24xx-i2s.c b/sound/soc/s3c24xx/s3c24xx-i2s.c index 1d0bade10d3d..e060daaa458f 100644 --- a/sound/soc/s3c24xx/s3c24xx-i2s.c +++ b/sound/soc/s3c24xx/s3c24xx-i2s.c @@ -516,3 +516,4 @@ module_exit(s3c24xx_i2s_exit); MODULE_AUTHOR("Ben Dooks, "); MODULE_DESCRIPTION("s3c24xx I2S SoC Interface"); MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:s3c24xx-iis"); diff --git a/sound/soc/s3c24xx/s3c64xx-i2s-v4.c b/sound/soc/s3c24xx/s3c64xx-i2s-v4.c index 7cab4fcf1f12..a13415a85a45 100644 --- a/sound/soc/s3c24xx/s3c64xx-i2s-v4.c +++ b/sound/soc/s3c24xx/s3c64xx-i2s-v4.c @@ -216,3 +216,4 @@ module_exit(s3c64xx_i2sv4_exit); MODULE_AUTHOR("Jaswinder Singh, "); MODULE_DESCRIPTION("S3C64XX I2Sv4 SoC Interface"); MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:s3c64xx-iis-v4"); diff --git a/sound/soc/s3c24xx/s3c64xx-i2s.c b/sound/soc/s3c24xx/s3c64xx-i2s.c index a1d0b2566416..ae7acb6c4f1d 100644 --- a/sound/soc/s3c24xx/s3c64xx-i2s.c +++ b/sound/soc/s3c24xx/s3c64xx-i2s.c @@ -239,3 +239,4 @@ module_exit(s3c64xx_i2s_exit); MODULE_AUTHOR("Ben Dooks, "); MODULE_DESCRIPTION("S3C64XX I2S SoC Interface"); MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:s3c64xx-iis"); -- cgit v1.2.3 From a6d14342dc46f0ef94cccf323fd9481de84b458f Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Thu, 12 Aug 2010 10:59:15 +0100 Subject: ASoC: Automatically determine control_data for soc-cache users Since the provision of a struct device for the CODEC is now mandatory we can use container_of() to locate the struct i2c_client and struct spi_device for relevant devices, removing the need to manually set it in each driver. A further patch will automate selection of the control type based on the bus_type of the struct device, further reducing the amount of driver code required. Signed-off-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/soc-cache.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'sound') diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c index 83cd8ed944bf..b856177ea281 100644 --- a/sound/soc/soc-cache.c +++ b/sound/soc/soc-cache.c @@ -584,11 +584,19 @@ int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec, #endif if (io_types[i].i2c_read) codec->hw_read = io_types[i].i2c_read; + + codec->control_data = container_of(codec->dev, + struct i2c_client, + dev); break; case SND_SOC_SPI: if (io_types[i].spi_write) codec->hw_write = io_types[i].spi_write; + + codec->control_data = container_of(codec->dev, + struct spi_device, + dev); break; } -- cgit v1.2.3 From 5dcba5d6741d4533e0ef696507f93f2a4c738efb Mon Sep 17 00:00:00 2001 From: Peter Ujfalusi Date: Thu, 12 Aug 2010 09:29:52 +0300 Subject: ASoC: multi-component: TWL4030: Restore registers on removal Add back the register restore call, when the codec driver is removed. This does not affect normal operation, but it is usefull when debugging audio through the twl4030 class codecs. Signed-off-by: Peter Ujfalusi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/twl4030.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'sound') diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index 898430f44f9d..c7ee1a4c9d99 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -2258,6 +2258,8 @@ static int twl4030_soc_probe(struct snd_soc_codec *codec) static int twl4030_soc_remove(struct snd_soc_codec *codec) { + /* Reset registers to their chip default before leaving */ + twl4030_reset_registers(codec); twl4030_set_bias_level(codec, SND_SOC_BIAS_OFF); return 0; } -- cgit v1.2.3 From 54d8d0aeb96e677c129918b391b9e74d48e65294 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Thu, 12 Aug 2010 15:02:11 +0100 Subject: ASoC: Update WM8962 to build with multi-component No notable changes, currently build tested only. Signed-off-by: Mark Brown --- sound/soc/codecs/wm8962.c | 168 +++++++++++++--------------------------------- sound/soc/codecs/wm8962.h | 3 - 2 files changed, 47 insertions(+), 124 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index ea8940e80263..58ba2d3ca533 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c @@ -34,9 +34,6 @@ #include "wm8962.h" -static struct snd_soc_codec *wm8962_codec; -struct snd_soc_codec_device soc_codec_dev_wm8962; - #define WM8962_NUM_SUPPLIES 8 static const char *wm8962_supply_names[WM8962_NUM_SUPPLIES] = { "DCVDD", @@ -51,7 +48,8 @@ static const char *wm8962_supply_names[WM8962_NUM_SUPPLIES] = { /* codec private data */ struct wm8962_priv { - struct snd_soc_codec codec; + struct snd_soc_codec *codec; + u16 reg_cache[WM8962_MAX_REGISTER + 1]; int sysclk; @@ -85,7 +83,7 @@ static int wm8962_regulator_event_##n(struct notifier_block *nb, \ struct wm8962_priv *wm8962 = container_of(nb, struct wm8962_priv, \ disable_nb[n]); \ if (event & REGULATOR_EVENT_DISABLE) { \ - wm8962->codec.cache_sync = 1; \ + wm8962->codec->cache_sync = 1; \ } \ return 0; \ } @@ -107,7 +105,7 @@ static int wm8962_volatile_register(unsigned int reg) return 0; } -static int wm8962_readable(unsigned int reg) +static int wm8962_readable_register(unsigned int reg) { if (wm8962_reg_access[reg].read) return 1; @@ -150,7 +148,8 @@ static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); - u16 *reg_cache = codec->reg_cache; + struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); + u16 *reg_cache = wm8962->reg_cache; int ret; /* Apply the update (if any) */ @@ -178,7 +177,8 @@ static int wm8962_put_spk_sw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); - u16 *reg_cache = codec->reg_cache; + struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); + u16 *reg_cache = wm8962->reg_cache; int ret; /* Apply the update (if any) */ @@ -486,7 +486,8 @@ static int out_pga_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { struct snd_soc_codec *codec = w->codec; - u16 *reg_cache = codec->reg_cache; + struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); + u16 *reg_cache = wm8962->reg_cache; int reg; switch (w->shift) { @@ -1071,8 +1072,7 @@ static int wm8962_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_device *socdev = rtd->socdev; - struct snd_soc_codec *codec = socdev->card->codec; + struct snd_soc_codec *codec = rtd->codec; struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); int rate = params_rate(params); int i; @@ -1441,8 +1441,8 @@ static struct snd_soc_dai_ops wm8962_dai_ops = { .digital_mute = wm8962_mute, }; -struct snd_soc_dai wm8962_dai = { - .name = "WM8962", +static struct snd_soc_dai_driver wm8962_dai = { + .name = "wm8962", .playback = { .stream_name = "Playback", .channels_min = 2, @@ -1460,52 +1460,10 @@ struct snd_soc_dai wm8962_dai = { .ops = &wm8962_dai_ops, .symmetric_rates = 1, }; -EXPORT_SYMBOL_GPL(wm8962_dai); - -static int wm8962_probe(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec; - int ret = 0; - - if (wm8962_codec == NULL) { - dev_err(&pdev->dev, "Codec device not registered\n"); - return -ENODEV; - } - - socdev->card->codec = wm8962_codec; - codec = wm8962_codec; - - /* register pcms */ - ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); - if (ret < 0) { - dev_err(codec->dev, "failed to create pcms: %d\n", ret); - goto pcm_err; - } - - wm8962_add_widgets(codec); - - return ret; - -pcm_err: - return ret; -} - -static int wm8962_remove(struct platform_device *pdev) -{ - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - - snd_soc_free_pcms(socdev); - snd_soc_dapm_free(socdev); - - return 0; -} #ifdef CONFIG_PM -static int wm8962_resume(struct platform_device *pdev) +static int wm8962_resume(struct snd_soc_codec *codec) { - struct snd_soc_device *socdev = platform_get_drvdata(pdev); - struct snd_soc_codec *codec = socdev->card->codec; struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); u16 *reg_cache = codec->reg_cache; int i; @@ -1529,13 +1487,6 @@ static int wm8962_resume(struct platform_device *pdev) #define wm8962_resume NULL #endif -struct snd_soc_codec_device soc_codec_dev_wm8962 = { - .probe = wm8962_probe, - .remove = wm8962_remove, - .resume = wm8962_resume, -}; -EXPORT_SYMBOL_GPL(soc_codec_dev_wm8962); - #if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE) static int beep_rates[] = { 500, 1000, 2000, 4000, @@ -1545,7 +1496,7 @@ static void wm8962_beep_work(struct work_struct *work) { struct wm8962_priv *wm8962 = container_of(work, struct wm8962_priv, beep_work); - struct snd_soc_codec *codec = &wm8962->codec; + struct snd_soc_codec *codec = wm8962->codec; int i; int reg = 0; int best = 0; @@ -1676,40 +1627,19 @@ static void wm8962_free_beep(struct snd_soc_codec *codec) } #endif -static int wm8962_register(struct wm8962_priv *wm8962, - enum snd_soc_control_type control) +static int wm8962_probe(struct snd_soc_codec *codec) { int ret; - struct snd_soc_codec *codec = &wm8962->codec; + struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); struct wm8962_pdata *pdata = dev_get_platdata(codec->dev); int i; - if (wm8962_codec) { - dev_err(codec->dev, "Another WM8962 is registered\n"); - return -EINVAL; - } + wm8962->codec = codec; - mutex_init(&codec->mutex); - INIT_LIST_HEAD(&codec->dapm_widgets); - INIT_LIST_HEAD(&codec->dapm_paths); - - snd_soc_codec_set_drvdata(codec, wm8962); - codec->name = "WM8962"; - codec->owner = THIS_MODULE; - codec->bias_level = SND_SOC_BIAS_OFF; - codec->set_bias_level = wm8962_set_bias_level; - codec->dai = &wm8962_dai; - codec->num_dai = 1; - codec->reg_cache_size = WM8962_MAX_REGISTER; - codec->reg_cache = &wm8962->reg_cache; - codec->volatile_register = wm8962_volatile_register; codec->cache_sync = 1; codec->idle_bias_off = 1; - codec->readable_register = wm8962_readable; - memcpy(codec->reg_cache, wm8962_reg, sizeof(wm8962_reg)); - - ret = snd_soc_codec_set_cache_io(codec, 16, 16, control); + ret = snd_soc_codec_set_cache_io(codec, 16, 16, SND_SOC_I2C); if (ret != 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); goto err; @@ -1814,22 +1744,9 @@ static int wm8962_register(struct wm8962_priv *wm8962, wm8962->reg_cache[WM8962_HPOUTL_VOLUME] |= WM8962_HPOUT_VU; wm8962->reg_cache[WM8962_HPOUTR_VOLUME] |= WM8962_HPOUT_VU; - wm8962_dai.dev = codec->dev; - - wm8962_codec = codec; - - ret = snd_soc_register_codec(codec); - if (ret != 0) { - dev_err(codec->dev, "Failed to register codec: %d\n", ret); - return ret; - } - - ret = snd_soc_register_dai(&wm8962_dai); - if (ret != 0) { - dev_err(codec->dev, "Failed to register DAI: %d\n", ret); - snd_soc_unregister_codec(codec); - return ret; - } + snd_soc_add_controls(codec, wm8962_snd_controls, + ARRAY_SIZE(wm8962_snd_controls)); + wm8962_add_widgets(codec); wm8962_init_beep(codec); @@ -1844,48 +1761,57 @@ err: return ret; } -static void wm8962_unregister(struct wm8962_priv *wm8962) +static int wm8962_remove(struct snd_soc_codec *codec) { + struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); int i; - wm8962_free_beep(&wm8962->codec); - wm8962_set_bias_level(&wm8962->codec, SND_SOC_BIAS_OFF); + wm8962_free_beep(codec); for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++) regulator_unregister_notifier(wm8962->supplies[i].consumer, &wm8962->disable_nb[i]); regulator_bulk_free(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); - snd_soc_unregister_dai(&wm8962_dai); - snd_soc_unregister_codec(&wm8962->codec); - kfree(wm8962); - wm8962_codec = NULL; + + return 0; } +static struct snd_soc_codec_driver soc_codec_dev_wm8962 = { + .probe = wm8962_probe, + .remove = wm8962_remove, + .resume = wm8962_resume, + .set_bias_level = wm8962_set_bias_level, + .reg_cache_size = WM8962_MAX_REGISTER, + .reg_word_size = sizeof(u16), + .reg_cache_default = wm8962_reg, + .volatile_register = wm8962_volatile_register, + .readable_register = wm8962_readable_register, +}; + #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) static __devinit int wm8962_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct wm8962_priv *wm8962; - struct snd_soc_codec *codec; + int ret; wm8962 = kzalloc(sizeof(struct wm8962_priv), GFP_KERNEL); if (wm8962 == NULL) return -ENOMEM; - codec = &wm8962->codec; - codec->hw_write = (hw_write_t)i2c_master_send; - i2c_set_clientdata(i2c, wm8962); - codec->control_data = i2c; - codec->dev = &i2c->dev; + ret = snd_soc_register_codec(&i2c->dev, + &soc_codec_dev_wm8962, &wm8962_dai, 1); + if (ret < 0) + kfree(wm8962); - return wm8962_register(wm8962, SND_SOC_I2C); + return ret; } static __devexit int wm8962_i2c_remove(struct i2c_client *client) { - struct wm8962_priv *wm8962 = i2c_get_clientdata(client); - wm8962_unregister(wm8962); + snd_soc_unregister_codec(&client->dev); + kfree(i2c_get_clientdata(client)); return 0; } diff --git a/sound/soc/codecs/wm8962.h b/sound/soc/codecs/wm8962.h index bc0b1876174c..6145399acb16 100644 --- a/sound/soc/codecs/wm8962.h +++ b/sound/soc/codecs/wm8962.h @@ -15,9 +15,6 @@ #include -extern struct snd_soc_dai wm8962_dai; -extern struct snd_soc_codec_device soc_codec_dev_wm8962; - #define WM8962_SYSCLK_MCLK 1 #define WM8962_SYSCLK_FLL 2 #define WM8962_SYSCLK_PLL3 3 -- cgit v1.2.3 From 48bd3472d6512c74257706f7c38ad10a7117bac7 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Thu, 12 Aug 2010 15:02:36 +0100 Subject: ASoC: Staticise WM8727 codec driver structure Nothing should be referencing this any more. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8727.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8727.c b/sound/soc/codecs/wm8727.c index 6a40080ba701..748808285119 100644 --- a/sound/soc/codecs/wm8727.c +++ b/sound/soc/codecs/wm8727.c @@ -43,7 +43,7 @@ static struct snd_soc_dai_driver wm8727_dai = { }, }; -struct snd_soc_codec_driver soc_codec_dev_wm8727; +static struct snd_soc_codec_driver soc_codec_dev_wm8727; static __devinit int wm8727_probe(struct platform_device *pdev) { -- cgit v1.2.3 From 381ac990db3f4fdfbe91e3a636cab03edf293b9c Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Thu, 12 Aug 2010 15:09:55 +0100 Subject: ASoC: Remove unused driver data from WM8961 probe Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8961.c | 1 - 1 file changed, 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8961.c b/sound/soc/codecs/wm8961.c index fa36a62972f8..bfc6578ed060 100644 --- a/sound/soc/codecs/wm8961.c +++ b/sound/soc/codecs/wm8961.c @@ -959,7 +959,6 @@ static struct snd_soc_dai_driver wm8961_dai = { static int wm8961_probe(struct snd_soc_codec *codec) { - struct wm8961_priv *wm8961 = snd_soc_codec_get_drvdata(codec); int ret = 0; u16 reg; -- cgit v1.2.3 From bbbe33900d1f3c4402148ccb85234a741a6606a3 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Fri, 13 Aug 2010 08:45:23 +0200 Subject: ALSA: hda - Restrict PCM parameters per ELD information over HDMI When a device is plugged over HDMI, it passes some information in ELD including the supported PCM parameters like formats, rates, channels. This patch adds the check to PCM open callback of HDMI streams so that only valid parameters the device supports are used. When no device is plugged, the parameters the codec supports are used; it's mostly all parameters the hardware can work. This is for apps that are started before device plugging and do probing (e.g. a sound daemon), so that at least, probing would work even before the device plugging. Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_eld.c | 49 +++++++++++++++++++++++++++++++++++++++++ sound/pci/hda/hda_local.h | 2 ++ sound/pci/hda/patch_hdmi.c | 42 +++++++++++++++++++++++++++++++++++ sound/pci/hda/patch_intelhdmi.c | 1 + sound/pci/hda/patch_nvhdmi.c | 4 +--- 5 files changed, 95 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c index d8da18a9e98b..803b298f7411 100644 --- a/sound/pci/hda/hda_eld.c +++ b/sound/pci/hda/hda_eld.c @@ -596,4 +596,53 @@ void snd_hda_eld_proc_free(struct hda_codec *codec, struct hdmi_eld *eld) } EXPORT_SYMBOL_HDA(snd_hda_eld_proc_free); +/* update PCM info based on ELD */ +void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm, + struct hda_pcm_stream *codec_pars) +{ + int i; + + pcm->rates = 0; + pcm->formats = 0; + pcm->maxbps = 0; + pcm->channels_min = -1; + pcm->channels_max = 0; + for (i = 0; i < eld->sad_count; i++) { + struct cea_sad *a = &eld->sad[i]; + pcm->rates |= a->rates; + if (a->channels < pcm->channels_min) + pcm->channels_min = a->channels; + if (a->channels > pcm->channels_max) + pcm->channels_max = a->channels; + if (a->format == AUDIO_CODING_TYPE_LPCM) { + if (a->sample_bits & AC_SUPPCM_BITS_16) { + pcm->formats |= SNDRV_PCM_FMTBIT_S16_LE; + if (pcm->maxbps < 16) + pcm->maxbps = 16; + } + if (a->sample_bits & AC_SUPPCM_BITS_20) { + pcm->formats |= SNDRV_PCM_FMTBIT_S32_LE; + if (pcm->maxbps < 20) + pcm->maxbps = 20; + } + if (a->sample_bits & AC_SUPPCM_BITS_24) { + pcm->formats |= SNDRV_PCM_FMTBIT_S32_LE; + if (pcm->maxbps < 24) + pcm->maxbps = 24; + } + } + } + + if (!codec_pars) + return; + + /* restrict the parameters by the values the codec provides */ + pcm->rates &= codec_pars->rates; + pcm->formats &= codec_pars->formats; + pcm->channels_min = max(pcm->channels_min, codec_pars->channels_min); + pcm->channels_max = min(pcm->channels_max, codec_pars->channels_max); + pcm->maxbps = min(pcm->maxbps, codec_pars->maxbps); +} +EXPORT_SYMBOL_HDA(hdmi_eld_update_pcm_info); + #endif /* CONFIG_PROC_FS */ diff --git a/sound/pci/hda/hda_local.h b/sound/pci/hda/hda_local.h index 7a97f126f6f7..28ab4aead48f 100644 --- a/sound/pci/hda/hda_local.h +++ b/sound/pci/hda/hda_local.h @@ -604,6 +604,8 @@ struct hdmi_eld { int snd_hdmi_get_eld_size(struct hda_codec *codec, hda_nid_t nid); int snd_hdmi_get_eld(struct hdmi_eld *, struct hda_codec *, hda_nid_t); void snd_hdmi_show_eld(struct hdmi_eld *eld); +void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm, + struct hda_pcm_stream *codec_pars); #ifdef CONFIG_PROC_FS int snd_hda_eld_proc_new(struct hda_codec *codec, struct hdmi_eld *eld, diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 522e0748ee99..2bc0f07cf33f 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c @@ -46,6 +46,7 @@ struct hdmi_spec { * export one pcm per pipe */ struct hda_pcm pcm_rec[MAX_HDMI_CVTS]; + struct hda_pcm_stream codec_pcm_pars[MAX_HDMI_CVTS]; /* * nvhdmi specific @@ -765,6 +766,47 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid, return 0; } +/* + * HDA PCM callbacks + */ +static int hdmi_pcm_open(struct hda_pcm_stream *hinfo, + struct hda_codec *codec, + struct snd_pcm_substream *substream) +{ + struct hdmi_spec *spec = codec->spec; + struct hdmi_eld *eld; + struct hda_pcm_stream *codec_pars; + unsigned int idx; + + for (idx = 0; idx < spec->num_cvts; idx++) + if (hinfo->nid == spec->cvt[idx]) + break; + if (snd_BUG_ON(idx >= spec->num_cvts) || + snd_BUG_ON(idx >= spec->num_pins)) + return -EINVAL; + + /* save the PCM info the codec provides */ + codec_pars = &spec->codec_pcm_pars[idx]; + if (!codec_pars->rates) + *codec_pars = *hinfo; + + eld = &spec->sink_eld[idx]; + if (eld->sad_count > 0) { + hdmi_eld_update_pcm_info(eld, hinfo, codec_pars); + if (hinfo->channels_min > hinfo->channels_max || + !hinfo->rates || !hinfo->formats) + return -ENODEV; + } else { + /* fallback to the codec default */ + hinfo->channels_min = codec_pars->channels_min; + hinfo->channels_max = codec_pars->channels_max; + hinfo->rates = codec_pars->rates; + hinfo->formats = codec_pars->formats; + hinfo->maxbps = codec_pars->maxbps; + } + return 0; +} + /* * HDA/HDMI auto parsing */ diff --git a/sound/pci/hda/patch_intelhdmi.c b/sound/pci/hda/patch_intelhdmi.c index 5972d5e7d01f..d382d3c81c0f 100644 --- a/sound/pci/hda/patch_intelhdmi.c +++ b/sound/pci/hda/patch_intelhdmi.c @@ -80,6 +80,7 @@ static struct hda_pcm_stream intel_hdmi_pcm_playback = { .substreams = 1, .channels_min = 2, .ops = { + .open = hdmi_pcm_open, .prepare = intel_hdmi_playback_pcm_prepare, .cleanup = intel_hdmi_playback_pcm_cleanup, }, diff --git a/sound/pci/hda/patch_nvhdmi.c b/sound/pci/hda/patch_nvhdmi.c index 77e2b4028b9f..f636870dc718 100644 --- a/sound/pci/hda/patch_nvhdmi.c +++ b/sound/pci/hda/patch_nvhdmi.c @@ -347,10 +347,8 @@ static int nvhdmi_dig_playback_pcm_prepare_2ch(struct hda_pcm_stream *hinfo, static struct hda_pcm_stream nvhdmi_pcm_digital_playback_8ch_89 = { .substreams = 1, .channels_min = 2, - .rates = SUPPORTED_RATES, - .maxbps = SUPPORTED_MAXBPS, - .formats = SUPPORTED_FORMATS, .ops = { + .open = hdmi_pcm_open, .prepare = nvhdmi_dig_playback_pcm_prepare_8ch_89, .cleanup = nvhdmi_playback_pcm_cleanup, }, -- cgit v1.2.3 From f0cea79724f03ee55e7b5933b6a6f6a3fd177710 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Fri, 13 Aug 2010 11:56:53 +0200 Subject: ALSA: hda - Fix dynamic ADC change working again The commit eb541337b7a43822fce7d0c9d967ee149b2d9a96 ALSA: hda - Make converter setups sticky changes the semantics of snd_hda_codec_cleanup_stream() not to clean up the stream at that moment but delay the action. This broke the codes expecting that the clean-up is done immediately, such as dynamic ADC changes in some codec drivers. This patch fixes the issue by introducing a lower helper, __snd_hda_codec_cleanup_stream(), to allow the immediate clean up. The original snd_hda_codec_cleanup_stream() is kept as is now. Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_codec.c | 26 ++++++++++++++++++-------- sound/pci/hda/hda_codec.h | 5 ++++- sound/pci/hda/patch_cirrus.c | 2 +- sound/pci/hda/patch_conexant.c | 2 +- sound/pci/hda/patch_realtek.c | 2 +- 5 files changed, 25 insertions(+), 12 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 720a81d711e3..dd8fb86c842b 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -1261,12 +1261,17 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, } EXPORT_SYMBOL_HDA(snd_hda_codec_setup_stream); +static void really_cleanup_stream(struct hda_codec *codec, + struct hda_cvt_setup *q); + /** - * snd_hda_codec_cleanup_stream - clean up the codec for closing + * __snd_hda_codec_cleanup_stream - clean up the codec for closing * @codec: the CODEC to clean up * @nid: the NID to clean up + * @do_now: really clean up the stream instead of clearing the active flag */ -void snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid) +void __snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid, + int do_now) { struct hda_cvt_setup *p; @@ -1274,14 +1279,19 @@ void snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid) return; snd_printdd("hda_codec_cleanup_stream: NID=0x%x\n", nid); - /* here we just clear the active flag; actual clean-ups will be done - * in purify_inactive_streams() - */ p = get_hda_cvt_setup(codec, nid); - if (p) - p->active = 0; + if (p) { + /* here we just clear the active flag when do_now isn't set; + * actual clean-ups will be done later in + * purify_inactive_streams() called from snd_hda_codec_prpapre() + */ + if (do_now) + really_cleanup_stream(codec, p); + else + p->active = 0; + } } -EXPORT_SYMBOL_HDA(snd_hda_codec_cleanup_stream); +EXPORT_SYMBOL_HDA(__snd_hda_codec_cleanup_stream); static void really_cleanup_stream(struct hda_codec *codec, struct hda_cvt_setup *q) diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 3f7a479881e5..4303353feda9 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h @@ -963,7 +963,10 @@ void snd_hda_codec_cleanup(struct hda_codec *codec, void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, u32 stream_tag, int channel_id, int format); -void snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid); +void __snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid, + int do_now); +#define snd_hda_codec_cleanup_stream(codec, nid) \ + __snd_hda_codec_cleanup_stream(codec, nid, 0) unsigned int snd_hda_calc_stream_format(unsigned int rate, unsigned int channels, unsigned int format, diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index 350ee8ac4153..4ef5efaaaef1 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c @@ -656,7 +656,7 @@ static int change_cur_input(struct hda_codec *codec, unsigned int idx, return 0; if (spec->cur_adc && spec->cur_adc != spec->adc_nid[idx]) { /* stream is running, let's swap the current ADC */ - snd_hda_codec_cleanup_stream(codec, spec->cur_adc); + __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1); spec->cur_adc = spec->adc_nid[idx]; snd_hda_codec_setup_stream(codec, spec->cur_adc, spec->cur_adc_stream_tag, 0, diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index f7e234e5ee96..31b5d9eeba68 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -1733,7 +1733,7 @@ static void cxt5051_portc_automic(struct hda_codec *codec) new_adc = spec->adc_nids[spec->cur_adc_idx]; if (spec->cur_adc && spec->cur_adc != new_adc) { /* stream is running, let's swap the current ADC */ - snd_hda_codec_cleanup_stream(codec, spec->cur_adc); + __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1); spec->cur_adc = new_adc; snd_hda_codec_setup_stream(codec, new_adc, spec->cur_adc_stream_tag, 0, diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 55d6e5b6bb7d..2cd1ae809e46 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -1037,7 +1037,7 @@ static void alc_dual_mic_adc_auto_switch(struct hda_codec *codec) new_adc = spec->adc_nids[spec->cur_adc_idx]; if (spec->cur_adc && spec->cur_adc != new_adc) { /* stream is running, let's swap the current ADC */ - snd_hda_codec_cleanup_stream(codec, spec->cur_adc); + __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1); spec->cur_adc = new_adc; snd_hda_codec_setup_stream(codec, new_adc, spec->cur_adc_stream_tag, 0, -- cgit v1.2.3 From 495311927ffbe3604e915aeafdf03325e9925b9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Herman?= Date: Wed, 11 Aug 2010 13:08:06 +0200 Subject: ALSA: ISA: New Aztech Sound Galaxy driver This is a new driver for Aztech Sound Galaxy ISA soundcards based on the AZT1605 and AZT2316 chipsets. It's constructed as two seperate drivers for either chipset generated from the same source file, with (very) minimal ifdeffery. The drivers check the SB DSP version to decide if they are being loaded for the right chip. AZT1605 returns 2.1 by default and AZT2316 3.1. This isn't full-proof as the DSP version can actually be set through software but it's close enough -- as far as I've been able to see, the DSP version can not be stored in the EEPROM and the cards will therefore startup with the defaults. This distinction could (with the same success rate) also be used to decide which chip we're looking at at runtime meaning a single, merged driver is also an option but I feel it's actually nicer this way. A merged driver would have to postpone translating the passed in resource values to the card configuration until it knew which one it was looking at and would need to postpone erring out on mpu_irq=10 for azt1605 and mpu_irq=3 for azt2316. The drivers have been tested on various cards. For snd-azt1605: FCC-ID I38-MMSN811: Aztech Sound Galaxy Nova 16 Extra FCC-ID I38-MMSN822: Aztech Sound Galaxy Pro 16 II and for snd-azt2316: FCC-ID I38-MMSN824: Aztech Sound Galaxy Pro 16 AB FCC-ID I38-MMSN826: Trust Sound Expert DeLuxe Wave 32 (05201) FCC-ID I38-MMSN830: Trust Sound Expert DeLuxe 16+ (05202) FCC-ID I38-MMSN837: Packard Bell ISA Soundcard 030069 FCC-ID I38-MMSN846: Trust Sound Expert DeLuxe 16-3D (06300) FCC-ID I38-MMSN847: Trust Sound Expert DeLuxe Wave 32-3D (06301) FCC-ID I38-MMSN852: Aztech Sound Galaxy Waverider Pro 32-3D 826 and 846 were also marketed directly by Aztech and then known as: FCC-ID I38-MMSN826: Aztech Sound Galaxy Waverider 32+ FCC-ID I38-MMSN846: Aztech Sound Galaxy Nova 16 Extra II-3D Together, these cover the AZT1605 and AT2316A, AZT2316R and AZT2316-S chipsets. All cards work fully -- full-duplex PCM, MIDI and FM. Full duplex is a little flaky on some. I38-MSN811 tends to not work in full-duplex but sometimes does with the highest success rate being achieved when you first start the capture and then a playback instead of the other way around (it's a CS4231-KL codec). The cards with an AD1845XP codec (my I38-MMSN826 and one of my I38-MMSN830s) are also somewhat duplex-challenged. Sometimes full-duplex works, sometimes not and this varies from try to try. This seems likely to be a timing problem somewhere inside wss-lib. I38-MMSN826 has an additional "ICS2115 WaveFront" wavetable synth onboard that isn't supported yet. The wavetable synths on I38-MMSN847 and I38-MMSN852 are wired directly to the standard MPU-401 UART and the AUX1 input on the codec and work without problem. CD-ROM audio on the cards is routed to the codec "Line" input, Line-In to its Aux input, and FM/Wavetable to its AUX1 input. I did not rename the controls due to the capture source enumeration: I see that capture-source overrides are hardcoded in wss-lib and this is just too ugly to live. Versus the old snd-sgalaxy driver these drivers add support for the models without a configuration EEPROM (which are common), full-duplex, MPU-401 UART and OPL3. In the future they might grow support for that ICS2115 WaveFront synth on 826 and an hwdep interface to write to the EEPROM on the models that have one. Signed-off-by: Rene Herman Signed-off-by: Takashi Iwai --- sound/isa/Kconfig | 26 ++ sound/isa/Makefile | 2 +- sound/isa/galaxy/Makefile | 10 + sound/isa/galaxy/azt1605.c | 91 +++++++ sound/isa/galaxy/azt2316.c | 111 ++++++++ sound/isa/galaxy/galaxy.c | 652 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 891 insertions(+), 1 deletion(-) create mode 100644 sound/isa/galaxy/Makefile create mode 100644 sound/isa/galaxy/azt1605.c create mode 100644 sound/isa/galaxy/azt2316.c create mode 100644 sound/isa/galaxy/galaxy.c (limited to 'sound') diff --git a/sound/isa/Kconfig b/sound/isa/Kconfig index c6990c680796..f9aa13d8dacc 100644 --- a/sound/isa/Kconfig +++ b/sound/isa/Kconfig @@ -77,6 +77,32 @@ config SND_ALS100 To compile this driver as a module, choose M here: the module will be called snd-als100. +config SND_AZT1605 + tristate "Aztech AZT1605 Driver" + depends on SND + select SND_WSS_LIB + select SND_MPU401_UART + select SND_OPL3_LIB + help + Say Y here to include support for Aztech Sound Galaxy cards + based on the AZT1605 chipset. + + To compile this driver as a module, choose M here: the module + will be called snd-azt1605. + +config SND_AZT2316 + tristate "Aztech AZT2316 Driver" + depends on SND + select SND_WSS_LIB + select SND_MPU401_UART + select SND_OPL3_LIB + help + Say Y here to include support for Aztech Sound Galaxy cards + based on the AZT2316 chipset. + + To compile this driver as a module, choose M here: the module + will be called snd-azt2316. + config SND_AZT2320 tristate "Aztech Systems AZT2320" depends on PNP diff --git a/sound/isa/Makefile b/sound/isa/Makefile index c73d30c4f462..d2bd8f536dd8 100644 --- a/sound/isa/Makefile +++ b/sound/isa/Makefile @@ -24,5 +24,5 @@ obj-$(CONFIG_SND_SC6000) += snd-sc6000.o obj-$(CONFIG_SND_SGALAXY) += snd-sgalaxy.o obj-$(CONFIG_SND_SSCAPE) += snd-sscape.o -obj-$(CONFIG_SND) += ad1816a/ ad1848/ cs423x/ es1688/ gus/ msnd/ opti9xx/ \ +obj-$(CONFIG_SND) += ad1816a/ ad1848/ cs423x/ es1688/ galaxy/ gus/ msnd/ opti9xx/ \ sb/ wavefront/ wss/ diff --git a/sound/isa/galaxy/Makefile b/sound/isa/galaxy/Makefile new file mode 100644 index 000000000000..e307066d4315 --- /dev/null +++ b/sound/isa/galaxy/Makefile @@ -0,0 +1,10 @@ +# +# Makefile for ALSA +# Copyright (c) 2001 by Jaroslav Kysela +# + +snd-azt1605-objs := azt1605.o +snd-azt2316-objs := azt2316.o + +obj-$(CONFIG_SND_AZT1605) += snd-azt1605.o +obj-$(CONFIG_SND_AZT2316) += snd-azt2316.o diff --git a/sound/isa/galaxy/azt1605.c b/sound/isa/galaxy/azt1605.c new file mode 100644 index 000000000000..9a97643cb713 --- /dev/null +++ b/sound/isa/galaxy/azt1605.c @@ -0,0 +1,91 @@ +/* + * Aztech AZT1605 Driver + * Copyright (C) 2007,2010 Rene Herman + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#define AZT1605 + +#define CRD_NAME "Aztech AZT1605" +#define DRV_NAME "AZT1605" +#define DEV_NAME "azt1605" + +#define GALAXY_DSP_MAJOR 2 +#define GALAXY_DSP_MINOR 1 + +#define GALAXY_CONFIG_SIZE 3 + +/* + * 24-bit config register + */ + +#define GALAXY_CONFIG_SBA_220 (0 << 0) +#define GALAXY_CONFIG_SBA_240 (1 << 0) +#define GALAXY_CONFIG_SBA_260 (2 << 0) +#define GALAXY_CONFIG_SBA_280 (3 << 0) +#define GALAXY_CONFIG_SBA_MASK GALAXY_CONFIG_SBA_280 + +#define GALAXY_CONFIG_MPUA_300 (0 << 2) +#define GALAXY_CONFIG_MPUA_330 (1 << 2) + +#define GALAXY_CONFIG_MPU_ENABLE (1 << 3) + +#define GALAXY_CONFIG_GAME_ENABLE (1 << 4) + +#define GALAXY_CONFIG_CD_PANASONIC (1 << 5) +#define GALAXY_CONFIG_CD_MITSUMI (1 << 6) +#define GALAXY_CONFIG_CD_MASK (\ + GALAXY_CONFIG_CD_PANASONIC | GALAXY_CONFIG_CD_MITSUMI) + +#define GALAXY_CONFIG_UNUSED (1 << 7) +#define GALAXY_CONFIG_UNUSED_MASK GALAXY_CONFIG_UNUSED + +#define GALAXY_CONFIG_SBIRQ_2 (1 << 8) +#define GALAXY_CONFIG_SBIRQ_3 (1 << 9) +#define GALAXY_CONFIG_SBIRQ_5 (1 << 10) +#define GALAXY_CONFIG_SBIRQ_7 (1 << 11) + +#define GALAXY_CONFIG_MPUIRQ_2 (1 << 12) +#define GALAXY_CONFIG_MPUIRQ_3 (1 << 13) +#define GALAXY_CONFIG_MPUIRQ_5 (1 << 14) +#define GALAXY_CONFIG_MPUIRQ_7 (1 << 15) + +#define GALAXY_CONFIG_WSSA_530 (0 << 16) +#define GALAXY_CONFIG_WSSA_604 (1 << 16) +#define GALAXY_CONFIG_WSSA_E80 (2 << 16) +#define GALAXY_CONFIG_WSSA_F40 (3 << 16) + +#define GALAXY_CONFIG_WSS_ENABLE (1 << 18) + +#define GALAXY_CONFIG_CDIRQ_11 (1 << 19) +#define GALAXY_CONFIG_CDIRQ_12 (1 << 20) +#define GALAXY_CONFIG_CDIRQ_15 (1 << 21) +#define GALAXY_CONFIG_CDIRQ_MASK (\ + GALAXY_CONFIG_CDIRQ_11 | GALAXY_CONFIG_CDIRQ_12 |\ + GALAXY_CONFIG_CDIRQ_15) + +#define GALAXY_CONFIG_CDDMA_DISABLE (0 << 22) +#define GALAXY_CONFIG_CDDMA_0 (1 << 22) +#define GALAXY_CONFIG_CDDMA_1 (2 << 22) +#define GALAXY_CONFIG_CDDMA_3 (3 << 22) +#define GALAXY_CONFIG_CDDMA_MASK GALAXY_CONFIG_CDDMA_3 + +#define GALAXY_CONFIG_MASK (\ + GALAXY_CONFIG_SBA_MASK | GALAXY_CONFIG_CD_MASK |\ + GALAXY_CONFIG_UNUSED_MASK | GALAXY_CONFIG_CDIRQ_MASK |\ + GALAXY_CONFIG_CDDMA_MASK) + +#include "galaxy.c" diff --git a/sound/isa/galaxy/azt2316.c b/sound/isa/galaxy/azt2316.c new file mode 100644 index 000000000000..189441141df6 --- /dev/null +++ b/sound/isa/galaxy/azt2316.c @@ -0,0 +1,111 @@ +/* + * Aztech AZT2316 Driver + * Copyright (C) 2007,2010 Rene Herman + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#define AZT2316 + +#define CRD_NAME "Aztech AZT2316" +#define DRV_NAME "AZT2316" +#define DEV_NAME "azt2316" + +#define GALAXY_DSP_MAJOR 3 +#define GALAXY_DSP_MINOR 1 + +#define GALAXY_CONFIG_SIZE 4 + +/* + * 32-bit config register + */ + +#define GALAXY_CONFIG_SBA_220 (0 << 0) +#define GALAXY_CONFIG_SBA_240 (1 << 0) +#define GALAXY_CONFIG_SBA_260 (2 << 0) +#define GALAXY_CONFIG_SBA_280 (3 << 0) +#define GALAXY_CONFIG_SBA_MASK GALAXY_CONFIG_SBA_280 + +#define GALAXY_CONFIG_SBIRQ_2 (1 << 2) +#define GALAXY_CONFIG_SBIRQ_5 (1 << 3) +#define GALAXY_CONFIG_SBIRQ_7 (1 << 4) +#define GALAXY_CONFIG_SBIRQ_10 (1 << 5) + +#define GALAXY_CONFIG_SBDMA_DISABLE (0 << 6) +#define GALAXY_CONFIG_SBDMA_0 (1 << 6) +#define GALAXY_CONFIG_SBDMA_1 (2 << 6) +#define GALAXY_CONFIG_SBDMA_3 (3 << 6) + +#define GALAXY_CONFIG_WSSA_530 (0 << 8) +#define GALAXY_CONFIG_WSSA_604 (1 << 8) +#define GALAXY_CONFIG_WSSA_E80 (2 << 8) +#define GALAXY_CONFIG_WSSA_F40 (3 << 8) + +#define GALAXY_CONFIG_WSS_ENABLE (1 << 10) + +#define GALAXY_CONFIG_GAME_ENABLE (1 << 11) + +#define GALAXY_CONFIG_MPUA_300 (0 << 12) +#define GALAXY_CONFIG_MPUA_330 (1 << 12) + +#define GALAXY_CONFIG_MPU_ENABLE (1 << 13) + +#define GALAXY_CONFIG_CDA_310 (0 << 14) +#define GALAXY_CONFIG_CDA_320 (1 << 14) +#define GALAXY_CONFIG_CDA_340 (2 << 14) +#define GALAXY_CONFIG_CDA_350 (3 << 14) +#define GALAXY_CONFIG_CDA_MASK GALAXY_CONFIG_CDA_350 + +#define GALAXY_CONFIG_CD_DISABLE (0 << 16) +#define GALAXY_CONFIG_CD_PANASONIC (1 << 16) +#define GALAXY_CONFIG_CD_SONY (2 << 16) +#define GALAXY_CONFIG_CD_MITSUMI (3 << 16) +#define GALAXY_CONFIG_CD_AZTECH (4 << 16) +#define GALAXY_CONFIG_CD_UNUSED_5 (5 << 16) +#define GALAXY_CONFIG_CD_UNUSED_6 (6 << 16) +#define GALAXY_CONFIG_CD_UNUSED_7 (7 << 16) +#define GALAXY_CONFIG_CD_MASK GALAXY_CONFIG_CD_UNUSED_7 + +#define GALAXY_CONFIG_CDDMA8_DISABLE (0 << 20) +#define GALAXY_CONFIG_CDDMA8_0 (1 << 20) +#define GALAXY_CONFIG_CDDMA8_1 (2 << 20) +#define GALAXY_CONFIG_CDDMA8_3 (3 << 20) +#define GALAXY_CONFIG_CDDMA8_MASK GALAXY_CONFIG_CDDMA8_3 + +#define GALAXY_CONFIG_CDDMA16_DISABLE (0 << 22) +#define GALAXY_CONFIG_CDDMA16_5 (1 << 22) +#define GALAXY_CONFIG_CDDMA16_6 (2 << 22) +#define GALAXY_CONFIG_CDDMA16_7 (3 << 22) +#define GALAXY_CONFIG_CDDMA16_MASK GALAXY_CONFIG_CDDMA16_7 + +#define GALAXY_CONFIG_MPUIRQ_2 (1 << 24) +#define GALAXY_CONFIG_MPUIRQ_5 (1 << 25) +#define GALAXY_CONFIG_MPUIRQ_7 (1 << 26) +#define GALAXY_CONFIG_MPUIRQ_10 (1 << 27) + +#define GALAXY_CONFIG_CDIRQ_5 (1 << 28) +#define GALAXY_CONFIG_CDIRQ_11 (1 << 29) +#define GALAXY_CONFIG_CDIRQ_12 (1 << 30) +#define GALAXY_CONFIG_CDIRQ_15 (1 << 31) +#define GALAXY_CONFIG_CDIRQ_MASK (\ + GALAXY_CONFIG_CDIRQ_5 | GALAXY_CONFIG_CDIRQ_11 |\ + GALAXY_CONFIG_CDIRQ_12 | GALAXY_CONFIG_CDIRQ_15) + +#define GALAXY_CONFIG_MASK (\ + GALAXY_CONFIG_SBA_MASK | GALAXY_CONFIG_CDA_MASK |\ + GALAXY_CONFIG_CD_MASK | GALAXY_CONFIG_CDDMA16_MASK |\ + GALAXY_CONFIG_CDDMA8_MASK | GALAXY_CONFIG_CDIRQ_MASK) + +#include "galaxy.c" diff --git a/sound/isa/galaxy/galaxy.c b/sound/isa/galaxy/galaxy.c new file mode 100644 index 000000000000..ee54df082b9c --- /dev/null +++ b/sound/isa/galaxy/galaxy.c @@ -0,0 +1,652 @@ +/* + * Aztech AZT1605/AZT2316 Driver + * Copyright (C) 2007,2010 Rene Herman + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_DESCRIPTION(CRD_NAME); +MODULE_AUTHOR("Rene Herman"); +MODULE_LICENSE("GPL"); + +static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; +static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; +static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; + +module_param_array(index, int, NULL, 0444); +MODULE_PARM_DESC(index, "Index value for " CRD_NAME " soundcard."); +module_param_array(id, charp, NULL, 0444); +MODULE_PARM_DESC(id, "ID string for " CRD_NAME " soundcard."); +module_param_array(enable, bool, NULL, 0444); +MODULE_PARM_DESC(enable, "Enable " CRD_NAME " soundcard."); + +static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; +static long wss_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; +static long mpu_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; +static long fm_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; +static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; +static int mpu_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; +static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; +static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; + +module_param_array(port, long, NULL, 0444); +MODULE_PARM_DESC(port, "Port # for " CRD_NAME " driver."); +module_param_array(wss_port, long, NULL, 0444); +MODULE_PARM_DESC(wss_port, "WSS port # for " CRD_NAME " driver."); +module_param_array(mpu_port, long, NULL, 0444); +MODULE_PARM_DESC(mpu_port, "MPU-401 port # for " CRD_NAME " driver."); +module_param_array(fm_port, long, NULL, 0444); +MODULE_PARM_DESC(fm_port, "FM port # for " CRD_NAME " driver."); +module_param_array(irq, int, NULL, 0444); +MODULE_PARM_DESC(irq, "IRQ # for " CRD_NAME " driver."); +module_param_array(mpu_irq, int, NULL, 0444); +MODULE_PARM_DESC(mpu_irq, "MPU-401 IRQ # for " CRD_NAME " driver."); +module_param_array(dma1, int, NULL, 0444); +MODULE_PARM_DESC(dma1, "Playback DMA # for " CRD_NAME " driver."); +module_param_array(dma2, int, NULL, 0444); +MODULE_PARM_DESC(dma2, "Capture DMA # for " CRD_NAME " driver."); + +/* + * Generic SB DSP support routines + */ + +#define DSP_PORT_RESET 0x6 +#define DSP_PORT_READ 0xa +#define DSP_PORT_COMMAND 0xc +#define DSP_PORT_STATUS 0xc +#define DSP_PORT_DATA_AVAIL 0xe + +#define DSP_SIGNATURE 0xaa + +#define DSP_COMMAND_GET_VERSION 0xe1 + +static int __devinit dsp_get_byte(void __iomem *port, u8 *val) +{ + int loops = 1000; + + while (!(ioread8(port + DSP_PORT_DATA_AVAIL) & 0x80)) { + if (!loops--) + return -EIO; + cpu_relax(); + } + *val = ioread8(port + DSP_PORT_READ); + return 0; +} + +static int __devinit dsp_reset(void __iomem *port) +{ + u8 val; + + iowrite8(1, port + DSP_PORT_RESET); + udelay(10); + iowrite8(0, port + DSP_PORT_RESET); + + if (dsp_get_byte(port, &val) < 0 || val != DSP_SIGNATURE) + return -ENODEV; + + return 0; +} + +static int __devinit dsp_command(void __iomem *port, u8 cmd) +{ + int loops = 1000; + + while (ioread8(port + DSP_PORT_STATUS) & 0x80) { + if (!loops--) + return -EIO; + cpu_relax(); + } + iowrite8(cmd, port + DSP_PORT_COMMAND); + return 0; +} + +static int __devinit dsp_get_version(void __iomem *port, u8 *major, u8 *minor) +{ + int err; + + err = dsp_command(port, DSP_COMMAND_GET_VERSION); + if (err < 0) + return err; + + err = dsp_get_byte(port, major); + if (err < 0) + return err; + + err = dsp_get_byte(port, minor); + if (err < 0) + return err; + + return 0; +} + +/* + * Generic WSS support routines + */ + +#define WSS_CONFIG_DMA_0 (1 << 0) +#define WSS_CONFIG_DMA_1 (2 << 0) +#define WSS_CONFIG_DMA_3 (3 << 0) +#define WSS_CONFIG_DUPLEX (1 << 2) +#define WSS_CONFIG_IRQ_7 (1 << 3) +#define WSS_CONFIG_IRQ_9 (2 << 3) +#define WSS_CONFIG_IRQ_10 (3 << 3) +#define WSS_CONFIG_IRQ_11 (4 << 3) + +#define WSS_PORT_CONFIG 0 +#define WSS_PORT_SIGNATURE 3 + +#define WSS_SIGNATURE 4 + +static int __devinit wss_detect(void __iomem *wss_port) +{ + if ((ioread8(wss_port + WSS_PORT_SIGNATURE) & 0x3f) != WSS_SIGNATURE) + return -ENODEV; + + return 0; +} + +static void wss_set_config(void __iomem *wss_port, u8 wss_config) +{ + iowrite8(wss_config, wss_port + WSS_PORT_CONFIG); +} + +/* + * Aztech Sound Galaxy specifics + */ + +#define GALAXY_PORT_CONFIG 1024 +#define CONFIG_PORT_SET 4 + +#define DSP_COMMAND_GALAXY_8 8 +#define GALAXY_COMMAND_GET_TYPE 5 + +#define DSP_COMMAND_GALAXY_9 9 +#define GALAXY_COMMAND_WSSMODE 0 +#define GALAXY_COMMAND_SB8MODE 1 + +#define GALAXY_MODE_WSS GALAXY_COMMAND_WSSMODE +#define GALAXY_MODE_SB8 GALAXY_COMMAND_SB8MODE + +struct snd_galaxy { + void __iomem *port; + void __iomem *config_port; + void __iomem *wss_port; + u32 config; + struct resource *res_port; + struct resource *res_config_port; + struct resource *res_wss_port; +}; + +static u32 config[SNDRV_CARDS]; +static u8 wss_config[SNDRV_CARDS]; + +static int __devinit snd_galaxy_match(struct device *dev, unsigned int n) +{ + if (!enable[n]) + return 0; + + switch (port[n]) { + case SNDRV_AUTO_PORT: + dev_err(dev, "please specify port\n"); + return 0; + case 0x220: + config[n] |= GALAXY_CONFIG_SBA_220; + break; + case 0x240: + config[n] |= GALAXY_CONFIG_SBA_240; + break; + case 0x260: + config[n] |= GALAXY_CONFIG_SBA_260; + break; + case 0x280: + config[n] |= GALAXY_CONFIG_SBA_280; + break; + default: + dev_err(dev, "invalid port %#lx\n", port[n]); + return 0; + } + + switch (wss_port[n]) { + case SNDRV_AUTO_PORT: + dev_err(dev, "please specify wss_port\n"); + return 0; + case 0x530: + config[n] |= GALAXY_CONFIG_WSS_ENABLE | GALAXY_CONFIG_WSSA_530; + break; + case 0x604: + config[n] |= GALAXY_CONFIG_WSS_ENABLE | GALAXY_CONFIG_WSSA_604; + break; + case 0xe80: + config[n] |= GALAXY_CONFIG_WSS_ENABLE | GALAXY_CONFIG_WSSA_E80; + break; + case 0xf40: + config[n] |= GALAXY_CONFIG_WSS_ENABLE | GALAXY_CONFIG_WSSA_F40; + break; + default: + dev_err(dev, "invalid WSS port %#lx\n", wss_port[n]); + return 0; + } + + switch (irq[n]) { + case SNDRV_AUTO_IRQ: + dev_err(dev, "please specify irq\n"); + return 0; + case 7: + wss_config[n] |= WSS_CONFIG_IRQ_7; + break; + case 2: + irq[n] = 9; + case 9: + wss_config[n] |= WSS_CONFIG_IRQ_9; + break; + case 10: + wss_config[n] |= WSS_CONFIG_IRQ_10; + break; + case 11: + wss_config[n] |= WSS_CONFIG_IRQ_11; + break; + default: + dev_err(dev, "invalid IRQ %d\n", irq[n]); + return 0; + } + + switch (dma1[n]) { + case SNDRV_AUTO_DMA: + dev_err(dev, "please specify dma1\n"); + return 0; + case 0: + wss_config[n] |= WSS_CONFIG_DMA_0; + break; + case 1: + wss_config[n] |= WSS_CONFIG_DMA_1; + break; + case 3: + wss_config[n] |= WSS_CONFIG_DMA_3; + break; + default: + dev_err(dev, "invalid playback DMA %d\n", dma1[n]); + return 0; + } + + if (dma2[n] == SNDRV_AUTO_DMA || dma2[n] == dma1[n]) { + dma2[n] = -1; + goto mpu; + } + + wss_config[n] |= WSS_CONFIG_DUPLEX; + switch (dma2[n]) { + case 0: + break; + case 1: + if (dma1[n] == 0) + break; + default: + dev_err(dev, "invalid capture DMA %d\n", dma2[n]); + return 0; + } + +mpu: + switch (mpu_port[n]) { + case SNDRV_AUTO_PORT: + dev_warn(dev, "mpu_port not specified; not using MPU-401\n"); + mpu_port[n] = -1; + goto fm; + case 0x300: + config[n] |= GALAXY_CONFIG_MPU_ENABLE | GALAXY_CONFIG_MPUA_300; + break; + case 0x330: + config[n] |= GALAXY_CONFIG_MPU_ENABLE | GALAXY_CONFIG_MPUA_330; + break; + default: + dev_err(dev, "invalid MPU port %#lx\n", mpu_port[n]); + return 0; + } + + switch (mpu_irq[n]) { + case SNDRV_AUTO_IRQ: + dev_warn(dev, "mpu_irq not specified: using polling mode\n"); + mpu_irq[n] = -1; + break; + case 2: + mpu_irq[n] = 9; + case 9: + config[n] |= GALAXY_CONFIG_MPUIRQ_2; + break; +#ifdef AZT1605 + case 3: + config[n] |= GALAXY_CONFIG_MPUIRQ_3; + break; +#endif + case 5: + config[n] |= GALAXY_CONFIG_MPUIRQ_5; + break; + case 7: + config[n] |= GALAXY_CONFIG_MPUIRQ_7; + break; +#ifdef AZT2316 + case 10: + config[n] |= GALAXY_CONFIG_MPUIRQ_10; + break; +#endif + default: + dev_err(dev, "invalid MPU IRQ %d\n", mpu_irq[n]); + return 0; + } + + if (mpu_irq[n] == irq[n]) { + dev_err(dev, "cannot share IRQ between WSS and MPU-401\n"); + return 0; + } + +fm: + switch (fm_port[n]) { + case SNDRV_AUTO_PORT: + dev_warn(dev, "fm_port not specified: not using OPL3\n"); + fm_port[n] = -1; + break; + case 0x388: + break; + default: + dev_err(dev, "illegal FM port %#lx\n", fm_port[n]); + return 0; + } + + config[n] |= GALAXY_CONFIG_GAME_ENABLE; + return 1; +} + +static int __devinit galaxy_init(struct snd_galaxy *galaxy, u8 *type) +{ + u8 major; + u8 minor; + int err; + + err = dsp_reset(galaxy->port); + if (err < 0) + return err; + + err = dsp_get_version(galaxy->port, &major, &minor); + if (err < 0) + return err; + + if (major != GALAXY_DSP_MAJOR || minor != GALAXY_DSP_MINOR) + return -ENODEV; + + err = dsp_command(galaxy->port, DSP_COMMAND_GALAXY_8); + if (err < 0) + return err; + + err = dsp_command(galaxy->port, GALAXY_COMMAND_GET_TYPE); + if (err < 0) + return err; + + err = dsp_get_byte(galaxy->port, type); + if (err < 0) + return err; + + return 0; +} + +static int __devinit galaxy_set_mode(struct snd_galaxy *galaxy, u8 mode) +{ + int err; + + err = dsp_command(galaxy->port, DSP_COMMAND_GALAXY_9); + if (err < 0) + return err; + + err = dsp_command(galaxy->port, mode); + if (err < 0) + return err; + +#ifdef AZT1605 + /* + * Needed for MPU IRQ on AZT1605, but AZT2316 loses WSS again + */ + err = dsp_reset(galaxy->port); + if (err < 0) + return err; +#endif + + return 0; +} + +static void galaxy_set_config(struct snd_galaxy *galaxy, u32 config) +{ + u8 tmp = ioread8(galaxy->config_port + CONFIG_PORT_SET); + int i; + + iowrite8(tmp | 0x80, galaxy->config_port + CONFIG_PORT_SET); + for (i = 0; i < GALAXY_CONFIG_SIZE; i++) { + iowrite8(config, galaxy->config_port + i); + config >>= 8; + } + iowrite8(tmp & 0x7f, galaxy->config_port + CONFIG_PORT_SET); + msleep(10); +} + +static void __devinit galaxy_config(struct snd_galaxy *galaxy, u32 config) +{ + int i; + + for (i = GALAXY_CONFIG_SIZE; i; i--) { + u8 tmp = ioread8(galaxy->config_port + i - 1); + galaxy->config = (galaxy->config << 8) | tmp; + } + config |= galaxy->config & GALAXY_CONFIG_MASK; + galaxy_set_config(galaxy, config); +} + +static int __devinit galaxy_wss_config(struct snd_galaxy *galaxy, u8 wss_config) +{ + int err; + + err = wss_detect(galaxy->wss_port); + if (err < 0) + return err; + + wss_set_config(galaxy->wss_port, wss_config); + + err = galaxy_set_mode(galaxy, GALAXY_MODE_WSS); + if (err < 0) + return err; + + return 0; +} + +static void snd_galaxy_free(struct snd_card *card) +{ + struct snd_galaxy *galaxy = card->private_data; + + if (galaxy->wss_port) { + wss_set_config(galaxy->wss_port, 0); + ioport_unmap(galaxy->wss_port); + release_and_free_resource(galaxy->res_wss_port); + } + if (galaxy->config_port) { + galaxy_set_config(galaxy, galaxy->config); + ioport_unmap(galaxy->config_port); + release_and_free_resource(galaxy->res_config_port); + } + if (galaxy->port) { + ioport_unmap(galaxy->port); + release_and_free_resource(galaxy->res_port); + } +} + +static int __devinit snd_galaxy_probe(struct device *dev, unsigned int n) +{ + struct snd_galaxy *galaxy; + struct snd_wss *chip; + struct snd_card *card; + u8 type; + int err; + + err = snd_card_create(index[n], id[n], THIS_MODULE, sizeof *galaxy, + &card); + if (err < 0) + return err; + + snd_card_set_dev(card, dev); + + card->private_free = snd_galaxy_free; + galaxy = card->private_data; + + galaxy->res_port = request_region(port[n], 16, DRV_NAME); + if (!galaxy->res_port) { + dev_err(dev, "could not grab ports %#lx-%#lx\n", port[n], + port[n] + 15); + err = -EBUSY; + goto error; + } + galaxy->port = ioport_map(port[n], 16); + + err = galaxy_init(galaxy, &type); + if (err < 0) { + dev_err(dev, "did not find a Sound Galaxy at %#lx\n", port[n]); + goto error; + } + dev_info(dev, "Sound Galaxy (type %d) found at %#lx\n", type, port[n]); + + galaxy->res_config_port = request_region(port[n] + GALAXY_PORT_CONFIG, + 16, DRV_NAME); + if (!galaxy->res_config_port) { + dev_err(dev, "could not grab ports %#lx-%#lx\n", + port[n] + GALAXY_PORT_CONFIG, + port[n] + GALAXY_PORT_CONFIG + 15); + err = -EBUSY; + goto error; + } + galaxy->config_port = ioport_map(port[n] + GALAXY_PORT_CONFIG, 16); + + galaxy_config(galaxy, config[n]); + + galaxy->res_wss_port = request_region(wss_port[n], 4, DRV_NAME); + if (!galaxy->res_wss_port) { + dev_err(dev, "could not grab ports %#lx-%#lx\n", wss_port[n], + wss_port[n] + 3); + err = -EBUSY; + goto error; + } + galaxy->wss_port = ioport_map(wss_port[n], 4); + + err = galaxy_wss_config(galaxy, wss_config[n]); + if (err < 0) { + dev_err(dev, "could not configure WSS\n"); + goto error; + } + + strcpy(card->driver, DRV_NAME); + strcpy(card->shortname, DRV_NAME); + sprintf(card->longname, "%s at %#lx/%#lx, irq %d, dma %d/%d", + card->shortname, port[n], wss_port[n], irq[n], dma1[n], + dma2[n]); + + err = snd_wss_create(card, wss_port[n] + 4, -1, irq[n], dma1[n], + dma2[n], WSS_HW_DETECT, 0, &chip); + if (err < 0) + goto error; + + err = snd_wss_pcm(chip, 0, NULL); + if (err < 0) + goto error; + + err = snd_wss_mixer(chip); + if (err < 0) + goto error; + + err = snd_wss_timer(chip, 0, NULL); + if (err < 0) + goto error; + + if (mpu_port[n] >= 0) { + err = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, + mpu_port[n], 0, mpu_irq[n], + IRQF_DISABLED, NULL); + if (err < 0) + goto error; + } + + if (fm_port[n] >= 0) { + struct snd_opl3 *opl3; + + err = snd_opl3_create(card, fm_port[n], fm_port[n] + 2, + OPL3_HW_AUTO, 0, &opl3); + if (err < 0) { + dev_err(dev, "no OPL device at %#lx\n", fm_port[n]); + goto error; + } + err = snd_opl3_timer_new(opl3, 1, 2); + if (err < 0) + goto error; + + err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); + if (err < 0) + goto error; + } + + err = snd_card_register(card); + if (err < 0) + goto error; + + dev_set_drvdata(dev, card); + return 0; + +error: + snd_card_free(card); + return err; +} + +static int __devexit snd_galaxy_remove(struct device *dev, unsigned int n) +{ + snd_card_free(dev_get_drvdata(dev)); + dev_set_drvdata(dev, NULL); + return 0; +} + +static struct isa_driver snd_galaxy_driver = { + .match = snd_galaxy_match, + .probe = snd_galaxy_probe, + .remove = __devexit_p(snd_galaxy_remove), + + .driver = { + .name = DEV_NAME + } +}; + +static int __init alsa_card_galaxy_init(void) +{ + return isa_register_driver(&snd_galaxy_driver, SNDRV_CARDS); +} + +static void __exit alsa_card_galaxy_exit(void) +{ + isa_unregister_driver(&snd_galaxy_driver); +} + +module_init(alsa_card_galaxy_init); +module_exit(alsa_card_galaxy_exit); -- cgit v1.2.3 From cbaa9f60d5d5c3af10f94e0d49789d5b82341a4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Herman?= Date: Fri, 13 Aug 2010 10:43:48 +0200 Subject: ALSA: ISA: Remove snd-sgalaxy Its hardware is handled more fully by the new azt1605/azt2316 drivers. Signed-off-by: Rene Herman Signed-off-by: Takashi Iwai --- sound/isa/Kconfig | 10 -- sound/isa/Makefile | 2 - sound/isa/sgalaxy.c | 369 ---------------------------------------------------- 3 files changed, 381 deletions(-) delete mode 100644 sound/isa/sgalaxy.c (limited to 'sound') diff --git a/sound/isa/Kconfig b/sound/isa/Kconfig index f9aa13d8dacc..52064cfa91f3 100644 --- a/sound/isa/Kconfig +++ b/sound/isa/Kconfig @@ -377,16 +377,6 @@ config SND_SB16_CSP coprocessor can do variable tasks like various compression and decompression algorithms. -config SND_SGALAXY - tristate "Aztech Sound Galaxy" - select SND_WSS_LIB - help - Say Y here to include support for Aztech Sound Galaxy - soundcards. - - To compile this driver as a module, choose M here: the module - will be called snd-sgalaxy. - config SND_SSCAPE tristate "Ensoniq SoundScape driver" select SND_MPU401_UART diff --git a/sound/isa/Makefile b/sound/isa/Makefile index d2bd8f536dd8..8d781e419e2e 100644 --- a/sound/isa/Makefile +++ b/sound/isa/Makefile @@ -10,7 +10,6 @@ snd-cmi8330-objs := cmi8330.o snd-es18xx-objs := es18xx.o snd-opl3sa2-objs := opl3sa2.o snd-sc6000-objs := sc6000.o -snd-sgalaxy-objs := sgalaxy.o snd-sscape-objs := sscape.o # Toplevel Module Dependency @@ -21,7 +20,6 @@ obj-$(CONFIG_SND_CMI8330) += snd-cmi8330.o obj-$(CONFIG_SND_ES18XX) += snd-es18xx.o obj-$(CONFIG_SND_OPL3SA2) += snd-opl3sa2.o obj-$(CONFIG_SND_SC6000) += snd-sc6000.o -obj-$(CONFIG_SND_SGALAXY) += snd-sgalaxy.o obj-$(CONFIG_SND_SSCAPE) += snd-sscape.o obj-$(CONFIG_SND) += ad1816a/ ad1848/ cs423x/ es1688/ galaxy/ gus/ msnd/ opti9xx/ \ diff --git a/sound/isa/sgalaxy.c b/sound/isa/sgalaxy.c deleted file mode 100644 index 6fe27b9d9440..000000000000 --- a/sound/isa/sgalaxy.c +++ /dev/null @@ -1,369 +0,0 @@ -/* - * Driver for Aztech Sound Galaxy cards - * Copyright (c) by Christopher Butler -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define SNDRV_LEGACY_FIND_FREE_IRQ -#define SNDRV_LEGACY_FIND_FREE_DMA -#include - -MODULE_AUTHOR("Christopher Butler "); -MODULE_DESCRIPTION("Aztech Sound Galaxy"); -MODULE_LICENSE("GPL"); -MODULE_SUPPORTED_DEVICE("{{Aztech Systems,Sound Galaxy}}"); - -static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ -static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ -static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE; /* Enable this card */ -static long sbport[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0x220,0x240 */ -static long wssport[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* 0x530,0xe80,0xf40,0x604 */ -static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* 7,9,10,11 */ -static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 0,1,3 */ - -module_param_array(index, int, NULL, 0444); -MODULE_PARM_DESC(index, "Index value for Sound Galaxy soundcard."); -module_param_array(id, charp, NULL, 0444); -MODULE_PARM_DESC(id, "ID string for Sound Galaxy soundcard."); -module_param_array(sbport, long, NULL, 0444); -MODULE_PARM_DESC(sbport, "Port # for Sound Galaxy SB driver."); -module_param_array(wssport, long, NULL, 0444); -MODULE_PARM_DESC(wssport, "Port # for Sound Galaxy WSS driver."); -module_param_array(irq, int, NULL, 0444); -MODULE_PARM_DESC(irq, "IRQ # for Sound Galaxy driver."); -module_param_array(dma1, int, NULL, 0444); -MODULE_PARM_DESC(dma1, "DMA1 # for Sound Galaxy driver."); - -#define SGALAXY_AUXC_LEFT 18 -#define SGALAXY_AUXC_RIGHT 19 - -#define PFX "sgalaxy: " - -/* - - */ - -#define AD1848P1( port, x ) ( port + c_d_c_AD1848##x ) - -/* from lowlevel/sb/sb.c - to avoid having to allocate a struct snd_sb for the */ -/* short time we actually need it.. */ - -static int snd_sgalaxy_sbdsp_reset(unsigned long port) -{ - int i; - - outb(1, SBP1(port, RESET)); - udelay(10); - outb(0, SBP1(port, RESET)); - udelay(30); - for (i = 0; i < 1000 && !(inb(SBP1(port, DATA_AVAIL)) & 0x80); i++); - if (inb(SBP1(port, READ)) != 0xaa) { - snd_printd("sb_reset: failed at 0x%lx!!!\n", port); - return -ENODEV; - } - return 0; -} - -static int __devinit snd_sgalaxy_sbdsp_command(unsigned long port, - unsigned char val) -{ - int i; - - for (i = 10000; i; i--) - if ((inb(SBP1(port, STATUS)) & 0x80) == 0) { - outb(val, SBP1(port, COMMAND)); - return 1; - } - - return 0; -} - -static irqreturn_t snd_sgalaxy_dummy_interrupt(int irq, void *dev_id) -{ - return IRQ_NONE; -} - -static int __devinit snd_sgalaxy_setup_wss(unsigned long port, int irq, int dma) -{ - static int interrupt_bits[] = {-1, -1, -1, -1, -1, -1, -1, 0x08, -1, - 0x10, 0x18, 0x20, -1, -1, -1, -1}; - static int dma_bits[] = {1, 2, 0, 3}; - int tmp, tmp1; - - if ((tmp = inb(port + 3)) == 0xff) - { - snd_printdd("I/O address dead (0x%lx)\n", port); - return 0; - } -#if 0 - snd_printdd("WSS signature = 0x%x\n", tmp); -#endif - - if ((tmp & 0x3f) != 0x04 && - (tmp & 0x3f) != 0x0f && - (tmp & 0x3f) != 0x00) { - snd_printdd("No WSS signature detected on port 0x%lx\n", - port + 3); - return 0; - } - -#if 0 - snd_printdd(PFX "setting up IRQ/DMA for WSS\n"); -#endif - - /* initialize IRQ for WSS codec */ - tmp = interrupt_bits[irq % 16]; - if (tmp < 0) - return -EINVAL; - - if (request_irq(irq, snd_sgalaxy_dummy_interrupt, IRQF_DISABLED, "sgalaxy", NULL)) { - snd_printk(KERN_ERR "sgalaxy: can't grab irq %d\n", irq); - return -EIO; - } - - outb(tmp | 0x40, port); - tmp1 = dma_bits[dma % 4]; - outb(tmp | tmp1, port); - - free_irq(irq, NULL); - - return 0; -} - -static int __devinit snd_sgalaxy_detect(int dev, int irq, int dma) -{ -#if 0 - snd_printdd(PFX "switching to WSS mode\n"); -#endif - - /* switch to WSS mode */ - snd_sgalaxy_sbdsp_reset(sbport[dev]); - - snd_sgalaxy_sbdsp_command(sbport[dev], 9); - snd_sgalaxy_sbdsp_command(sbport[dev], 0); - - udelay(400); - return snd_sgalaxy_setup_wss(wssport[dev], irq, dma); -} - -static struct snd_kcontrol_new snd_sgalaxy_controls[] = { -WSS_DOUBLE("Aux Playback Switch", 0, - SGALAXY_AUXC_LEFT, SGALAXY_AUXC_RIGHT, 7, 7, 1, 1), -WSS_DOUBLE("Aux Playback Volume", 0, - SGALAXY_AUXC_LEFT, SGALAXY_AUXC_RIGHT, 0, 0, 31, 0) -}; - -static int __devinit snd_sgalaxy_mixer(struct snd_wss *chip) -{ - struct snd_card *card = chip->card; - struct snd_ctl_elem_id id1, id2; - unsigned int idx; - int err; - - memset(&id1, 0, sizeof(id1)); - memset(&id2, 0, sizeof(id2)); - id1.iface = id2.iface = SNDRV_CTL_ELEM_IFACE_MIXER; - /* reassign AUX0 to LINE */ - strcpy(id1.name, "Aux Playback Switch"); - strcpy(id2.name, "Line Playback Switch"); - if ((err = snd_ctl_rename_id(card, &id1, &id2)) < 0) - return err; - strcpy(id1.name, "Aux Playback Volume"); - strcpy(id2.name, "Line Playback Volume"); - if ((err = snd_ctl_rename_id(card, &id1, &id2)) < 0) - return err; - /* reassign AUX1 to FM */ - strcpy(id1.name, "Aux Playback Switch"); id1.index = 1; - strcpy(id2.name, "FM Playback Switch"); - if ((err = snd_ctl_rename_id(card, &id1, &id2)) < 0) - return err; - strcpy(id1.name, "Aux Playback Volume"); - strcpy(id2.name, "FM Playback Volume"); - if ((err = snd_ctl_rename_id(card, &id1, &id2)) < 0) - return err; - /* build AUX2 input */ - for (idx = 0; idx < ARRAY_SIZE(snd_sgalaxy_controls); idx++) { - err = snd_ctl_add(card, - snd_ctl_new1(&snd_sgalaxy_controls[idx], chip)); - if (err < 0) - return err; - } - return 0; -} - -static int __devinit snd_sgalaxy_match(struct device *devptr, unsigned int dev) -{ - if (!enable[dev]) - return 0; - if (sbport[dev] == SNDRV_AUTO_PORT) { - snd_printk(KERN_ERR PFX "specify SB port\n"); - return 0; - } - if (wssport[dev] == SNDRV_AUTO_PORT) { - snd_printk(KERN_ERR PFX "specify WSS port\n"); - return 0; - } - return 1; -} - -static int __devinit snd_sgalaxy_probe(struct device *devptr, unsigned int dev) -{ - static int possible_irqs[] = {7, 9, 10, 11, -1}; - static int possible_dmas[] = {1, 3, 0, -1}; - int err, xirq, xdma1; - struct snd_card *card; - struct snd_wss *chip; - - err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); - if (err < 0) - return err; - - xirq = irq[dev]; - if (xirq == SNDRV_AUTO_IRQ) { - if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) { - snd_printk(KERN_ERR PFX "unable to find a free IRQ\n"); - err = -EBUSY; - goto _err; - } - } - xdma1 = dma1[dev]; - if (xdma1 == SNDRV_AUTO_DMA) { - if ((xdma1 = snd_legacy_find_free_dma(possible_dmas)) < 0) { - snd_printk(KERN_ERR PFX "unable to find a free DMA\n"); - err = -EBUSY; - goto _err; - } - } - - if ((err = snd_sgalaxy_detect(dev, xirq, xdma1)) < 0) - goto _err; - - err = snd_wss_create(card, wssport[dev] + 4, -1, - xirq, xdma1, -1, - WSS_HW_DETECT, 0, &chip); - if (err < 0) - goto _err; - card->private_data = chip; - - err = snd_wss_pcm(chip, 0, NULL); - if (err < 0) { - snd_printdd(PFX "error creating new WSS PCM device\n"); - goto _err; - } - err = snd_wss_mixer(chip); - if (err < 0) { - snd_printdd(PFX "error creating new WSS mixer\n"); - goto _err; - } - if ((err = snd_sgalaxy_mixer(chip)) < 0) { - snd_printdd(PFX "the mixer rewrite failed\n"); - goto _err; - } - - strcpy(card->driver, "Sound Galaxy"); - strcpy(card->shortname, "Sound Galaxy"); - sprintf(card->longname, "Sound Galaxy at 0x%lx, irq %d, dma %d", - wssport[dev], xirq, xdma1); - - snd_card_set_dev(card, devptr); - - if ((err = snd_card_register(card)) < 0) - goto _err; - - dev_set_drvdata(devptr, card); - return 0; - - _err: - snd_card_free(card); - return err; -} - -static int __devexit snd_sgalaxy_remove(struct device *devptr, unsigned int dev) -{ - snd_card_free(dev_get_drvdata(devptr)); - dev_set_drvdata(devptr, NULL); - return 0; -} - -#ifdef CONFIG_PM -static int snd_sgalaxy_suspend(struct device *pdev, unsigned int n, - pm_message_t state) -{ - struct snd_card *card = dev_get_drvdata(pdev); - struct snd_wss *chip = card->private_data; - - snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); - chip->suspend(chip); - return 0; -} - -static int snd_sgalaxy_resume(struct device *pdev, unsigned int n) -{ - struct snd_card *card = dev_get_drvdata(pdev); - struct snd_wss *chip = card->private_data; - - chip->resume(chip); - snd_wss_out(chip, SGALAXY_AUXC_LEFT, chip->image[SGALAXY_AUXC_LEFT]); - snd_wss_out(chip, SGALAXY_AUXC_RIGHT, chip->image[SGALAXY_AUXC_RIGHT]); - - snd_power_change_state(card, SNDRV_CTL_POWER_D0); - return 0; -} -#endif - -#define DEV_NAME "sgalaxy" - -static struct isa_driver snd_sgalaxy_driver = { - .match = snd_sgalaxy_match, - .probe = snd_sgalaxy_probe, - .remove = __devexit_p(snd_sgalaxy_remove), -#ifdef CONFIG_PM - .suspend = snd_sgalaxy_suspend, - .resume = snd_sgalaxy_resume, -#endif - .driver = { - .name = DEV_NAME - }, -}; - -static int __init alsa_card_sgalaxy_init(void) -{ - return isa_register_driver(&snd_sgalaxy_driver, SNDRV_CARDS); -} - -static void __exit alsa_card_sgalaxy_exit(void) -{ - isa_unregister_driver(&snd_sgalaxy_driver); -} - -module_init(alsa_card_sgalaxy_init) -module_exit(alsa_card_sgalaxy_exit) -- cgit v1.2.3 From 0c17b393942e4363061b61ca58f4d35a01b41ab3 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Wed, 11 Aug 2010 18:03:54 +0100 Subject: ASoC: Optimise DSP performance for WM8994 Change the chip defaults to optimise performance of some of the DSP functionality. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8994.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index a87046a96f2a..2dc9daa95bed 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -3082,10 +3082,11 @@ static int wm8994_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_STANDBY: if (codec->bias_level == SND_SOC_BIAS_OFF) { - /* Tweak DC servo configuration for improved - * performance. */ + /* Tweak DC servo and DSP configuration for + * improved performance. */ snd_soc_write(codec, 0x102, 0x3); snd_soc_write(codec, 0x56, 0x3); + snd_soc_write(codec, 0x817, 0); snd_soc_write(codec, 0x102, 0); /* Discharge LINEOUT1 & 2 */ -- cgit v1.2.3 From b6b056911af54b40a996fdb751d441158d8078b6 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 13 Aug 2010 12:58:20 +0100 Subject: ASoC: Only tweak WM8994 chip configuration on devices up to rev D Any subsequent revisions will have these configuration changes applied by default. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8994.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 2dc9daa95bed..522249d5c2b4 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -95,6 +95,7 @@ struct wm8994_priv { struct wm8994_micdet micdet[2]; + int revision; struct wm8994_pdata *pdata; }; @@ -3070,6 +3071,8 @@ static int wm8994_set_dai_sysclk(struct snd_soc_dai *dai, static int wm8994_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) { + struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); + switch (level) { case SND_SOC_BIAS_ON: break; @@ -3084,10 +3087,14 @@ static int wm8994_set_bias_level(struct snd_soc_codec *codec, if (codec->bias_level == SND_SOC_BIAS_OFF) { /* Tweak DC servo and DSP configuration for * improved performance. */ - snd_soc_write(codec, 0x102, 0x3); - snd_soc_write(codec, 0x56, 0x3); - snd_soc_write(codec, 0x817, 0); - snd_soc_write(codec, 0x102, 0); + if (wm8994->revision < 4) { + /* Tweak DC servo and DSP configuration for + * improved performance. */ + snd_soc_write(codec, 0x102, 0x3); + snd_soc_write(codec, 0x56, 0x3); + snd_soc_write(codec, 0x817, 0); + snd_soc_write(codec, 0x102, 0); + } /* Discharge LINEOUT1 & 2 */ snd_soc_update_bits(codec, WM8994_ANTIPOP_1, @@ -3920,7 +3927,6 @@ static int wm8994_codec_probe(struct platform_device *pdev) struct wm8994_priv *wm8994; struct snd_soc_codec *codec; int i; - u16 rev; if (wm8994_codec) { dev_err(&pdev->dev, "Another WM8994 is registered\n"); @@ -3974,8 +3980,8 @@ static int wm8994_codec_probe(struct platform_device *pdev) wm8994->reg_cache[i] = 0; /* Set revision-specific configuration */ - rev = snd_soc_read(codec, WM8994_CHIP_REVISION); - switch (rev) { + wm8994->revision = snd_soc_read(codec, WM8994_CHIP_REVISION); + switch (wm8994->revision) { case 2: case 3: wm8994->hubs.dcs_codes = -5; -- cgit v1.2.3 From 4f4e8f69895c8696a4bcc751817d4b186023ac44 Mon Sep 17 00:00:00 2001 From: Paul Zimmerman Date: Fri, 13 Aug 2010 12:42:07 -0700 Subject: ALSA: usb: USB3 SuperSpeed sound support This is V2 of the patch, after feedback from Clemens and Daniel. This patch adds SuperSpeed support to the USB drivers under sound/. It adds tests for USB_SPEED_SUPER to the appropriate places that check for the USB speed. This patch has been tested with our SS USB3 device emulating a set of Yamaha speakers and a Logitech microphone, but with the descriptors modified to add USB3 support. It has also been tested with the real speakers and microphone, to make sure that USB2 devices still work. Signed-off-by: Paul Zimmerman Cc: Clemens Ladisch Cc: Daniel Mack Cc: Greg Kroah-Hartman Signed-off-by: Takashi Iwai --- sound/usb/card.c | 31 +++++++++++++++++++++++-------- sound/usb/helper.c | 17 +++++++++++------ sound/usb/midi.c | 9 ++++++++- sound/usb/pcm.c | 4 ++-- sound/usb/proc.c | 2 +- sound/usb/urb.c | 2 +- 6 files changed, 46 insertions(+), 19 deletions(-) (limited to 'sound') diff --git a/sound/usb/card.c b/sound/usb/card.c index 9feb00c831a0..498a2d8fa4bb 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c @@ -299,9 +299,13 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx, *rchip = NULL; - if (snd_usb_get_speed(dev) != USB_SPEED_LOW && - snd_usb_get_speed(dev) != USB_SPEED_FULL && - snd_usb_get_speed(dev) != USB_SPEED_HIGH) { + switch (snd_usb_get_speed(dev)) { + case USB_SPEED_LOW: + case USB_SPEED_FULL: + case USB_SPEED_HIGH: + case USB_SPEED_SUPER: + break; + default: snd_printk(KERN_ERR "unknown device speed %d\n", snd_usb_get_speed(dev)); return -ENXIO; } @@ -377,11 +381,22 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx, if (len < sizeof(card->longname)) usb_make_path(dev, card->longname + len, sizeof(card->longname) - len); - strlcat(card->longname, - snd_usb_get_speed(dev) == USB_SPEED_LOW ? ", low speed" : - snd_usb_get_speed(dev) == USB_SPEED_FULL ? ", full speed" : - ", high speed", - sizeof(card->longname)); + switch (snd_usb_get_speed(dev)) { + case USB_SPEED_LOW: + strlcat(card->longname, ", low speed", sizeof(card->longname)); + break; + case USB_SPEED_FULL: + strlcat(card->longname, ", full speed", sizeof(card->longname)); + break; + case USB_SPEED_HIGH: + strlcat(card->longname, ", high speed", sizeof(card->longname)); + break; + case USB_SPEED_SUPER: + strlcat(card->longname, ", super speed", sizeof(card->longname)); + break; + default: + break; + } snd_usb_audio_create_proc(chip); diff --git a/sound/usb/helper.c b/sound/usb/helper.c index d48d6f8f6ac9..f280c1903c25 100644 --- a/sound/usb/helper.c +++ b/sound/usb/helper.c @@ -103,11 +103,16 @@ int snd_usb_ctl_msg(struct usb_device *dev, unsigned int pipe, __u8 request, unsigned char snd_usb_parse_datainterval(struct snd_usb_audio *chip, struct usb_host_interface *alts) { - if (snd_usb_get_speed(chip->dev) == USB_SPEED_HIGH && - get_endpoint(alts, 0)->bInterval >= 1 && - get_endpoint(alts, 0)->bInterval <= 4) - return get_endpoint(alts, 0)->bInterval - 1; - else - return 0; + switch (snd_usb_get_speed(chip->dev)) { + case USB_SPEED_HIGH: + case USB_SPEED_SUPER: + if (get_endpoint(alts, 0)->bInterval >= 1 && + get_endpoint(alts, 0)->bInterval <= 4) + return get_endpoint(alts, 0)->bInterval - 1; + break; + default: + break; + } + return 0; } diff --git a/sound/usb/midi.c b/sound/usb/midi.c index b9c2bc65f51a..156cd0716c42 100644 --- a/sound/usb/midi.c +++ b/sound/usb/midi.c @@ -834,7 +834,14 @@ static void snd_usbmidi_us122l_output(struct snd_usb_midi_out_endpoint *ep, if (!ep->ports[0].active) return; - count = snd_usb_get_speed(ep->umidi->dev) == USB_SPEED_HIGH ? 1 : 2; + switch (snd_usb_get_speed(ep->umidi->dev)) { + case USB_SPEED_HIGH: + case USB_SPEED_SUPER: + count = 1; + break; + default: + count = 2; + } count = snd_rawmidi_transmit(ep->ports[0].substream, urb->transfer_buffer, count); diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index 456829882f40..ebd09acd186e 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -467,7 +467,7 @@ static int hw_check_valid_format(struct snd_usb_substream *subs, return 0; } /* check whether the period time is >= the data packet interval */ - if (snd_usb_get_speed(subs->dev) == USB_SPEED_HIGH) { + if (snd_usb_get_speed(subs->dev) != USB_SPEED_FULL) { ptime = 125 * (1 << fp->datainterval); if (ptime > pt->max || (ptime == pt->max && pt->openmax)) { hwc_debug(" > check: ptime %u > max %u\n", ptime, pt->max); @@ -735,7 +735,7 @@ static int setup_hw_info(struct snd_pcm_runtime *runtime, struct snd_usb_substre } param_period_time_if_needed = SNDRV_PCM_HW_PARAM_PERIOD_TIME; - if (snd_usb_get_speed(subs->dev) != USB_SPEED_HIGH) + if (snd_usb_get_speed(subs->dev) == USB_SPEED_FULL) /* full speed devices have fixed data packet interval */ ptmin = 1000; if (ptmin == 1000) diff --git a/sound/usb/proc.c b/sound/usb/proc.c index f5e3f356b95f..3c650ab3c91d 100644 --- a/sound/usb/proc.c +++ b/sound/usb/proc.c @@ -107,7 +107,7 @@ static void proc_dump_substream_formats(struct snd_usb_substream *subs, struct s } snd_iprintf(buffer, "\n"); } - if (snd_usb_get_speed(subs->dev) == USB_SPEED_HIGH) + if (snd_usb_get_speed(subs->dev) != USB_SPEED_FULL) snd_iprintf(buffer, " Data packet interval: %d us\n", 125 * (1 << fp->datainterval)); // snd_iprintf(buffer, " Max Packet Size = %d\n", fp->maxpacksize); diff --git a/sound/usb/urb.c b/sound/usb/urb.c index de607d4411ac..8deeaad10f10 100644 --- a/sound/usb/urb.c +++ b/sound/usb/urb.c @@ -244,7 +244,7 @@ int snd_usb_init_substream_urbs(struct snd_usb_substream *subs, else subs->curpacksize = maxsize; - if (snd_usb_get_speed(subs->dev) == USB_SPEED_HIGH) + if (snd_usb_get_speed(subs->dev) != USB_SPEED_FULL) packs_per_ms = 8 >> subs->datainterval; else packs_per_ms = 1; -- cgit v1.2.3 From 38d7b08f374b640b00d350ac2d12ffed5d723423 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Sat, 14 Aug 2010 19:29:53 +0200 Subject: ALSA: sound/usb/format: silence uninitialized variable warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gcc complains that ret might be used uninitialized: sound/usb/format.c: In function ‘snd_usb_parse_audio_format’: sound/usb/format.c:354: warning: ‘ret’ may be used uninitialized in this function sound/usb/format.c:354: note: ‘ret’ was declared here sound/usb/format.c:414: warning: ‘ret’ may be used uninitialized in this function sound/usb/format.c:414: note: ‘ret’ was declared here I suppose it could be uninitialized if there is ever a UAC_VERSION_3 released. Anyway this patch is worthwhile if only to silence the gcc warning. Signed-off-by: Dan Carpenter Acked-by: Daniel Mack Signed-off-by: Takashi Iwai --- sound/usb/format.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'sound') diff --git a/sound/usb/format.c b/sound/usb/format.c index 4387f54d73db..3a1375459c06 100644 --- a/sound/usb/format.c +++ b/sound/usb/format.c @@ -392,6 +392,10 @@ static int parse_audio_format_i(struct snd_usb_audio *chip, /* fp->channels is already set in this case */ ret = parse_audio_format_rates_v2(chip, fp); break; + default: + snd_printk(KERN_ERR "%d:%u:%d : invalid protocol version %d\n", + chip->dev->devnum, fp->iface, fp->altsetting, protocol); + return -EINVAL; } if (fp->channels < 1) { @@ -452,6 +456,10 @@ static int parse_audio_format_ii(struct snd_usb_audio *chip, ret = parse_audio_format_rates_v2(chip, fp); break; } + default: + snd_printk(KERN_ERR "%d:%u:%d : invalid protocol version %d\n", + chip->dev->devnum, fp->iface, fp->altsetting, protocol); + return -EINVAL; } return ret; -- cgit v1.2.3 From 13cb61f8c261ca6a218f83f4ee9c3bd5cfc223a5 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Thu, 12 Aug 2010 15:44:04 +0100 Subject: ASoC: Set up debugfs only once per CODEC Since the debugfs directory is current per CODEC we should only init it when the CODEC is initialised, otherwise we end up with errors being generated when an attempt is made to add duplicate debugfs entries. Since most of this stuff is actually for the card we should refactor but this can come later. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/soc-core.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index a004876a39a9..ac0fa228c7b3 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -1323,6 +1323,9 @@ static int soc_probe_dai_link(struct snd_soc_card *card, int num) return ret; } } + + soc_init_codec_debugfs(codec); + /* mark codec as probed and add to card codec list */ codec->probed = 1; list_add(&codec->card_list, &card->codec_dev_list); @@ -1400,8 +1403,6 @@ static int soc_probe_dai_link(struct snd_soc_card *card, int num) if (ret < 0) printk(KERN_WARNING "asoc: failed to add codec sysfs files\n"); - soc_init_codec_debugfs(codec); - /* create the pcm */ ret = soc_new_pcm(rtd, num); if (ret < 0) { -- cgit v1.2.3 From 6ba6c9c3414b95c3ed50d529fb0efa744ed45761 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Thu, 12 Aug 2010 15:49:52 +0100 Subject: ASoC: Remove redundant device name from debugfs directory Since the core now includes deduplication in the name of CODEC devices there's no need to add extra for the debugfs directory name. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/soc-core.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) (limited to 'sound') diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index ac0fa228c7b3..cea0fe488623 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -234,16 +234,7 @@ static const struct file_operations codec_reg_fops = { static void soc_init_codec_debugfs(struct snd_soc_codec *codec) { - char codec_root[128]; - - if (codec->dev) - snprintf(codec_root, sizeof(codec_root), - "%s.%s", codec->name, dev_name(codec->dev)); - else - snprintf(codec_root, sizeof(codec_root), - "%s", codec->name); - - codec->debugfs_codec_root = debugfs_create_dir(codec_root, + codec->debugfs_codec_root = debugfs_create_dir(codec->name , debugfs_root); if (!codec->debugfs_codec_root) { printk(KERN_WARNING -- cgit v1.2.3 From 10e2f11326e0a263f0336686454be67efb2b56dc Mon Sep 17 00:00:00 2001 From: Ian Lartey Date: Fri, 13 Aug 2010 17:02:13 +0100 Subject: ASoC: multi-component: Fix reference to moved header file, which was unused anyway. Removed #include of pxa2xx-pcm.h Signed-off-by: Ian Lartey Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/pxa/pxa2xx-i2s.c | 1 - 1 file changed, 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/pxa/pxa2xx-i2s.c b/sound/soc/pxa/pxa2xx-i2s.c index 3b473b200a8f..d1b2ca69fd30 100644 --- a/sound/soc/pxa/pxa2xx-i2s.c +++ b/sound/soc/pxa/pxa2xx-i2s.c @@ -27,7 +27,6 @@ #include #include -#include "pxa2xx-pcm.h" #include "pxa2xx-i2s.h" /* -- cgit v1.2.3 From dd99a4524bd9f82358e9a20a44c5e784baa4e702 Mon Sep 17 00:00:00 2001 From: Haojian Zhuang Date: Fri, 13 Aug 2010 21:55:27 +0800 Subject: ASoC: fix pxa2xx-pcm.h path Since pxa2xx-pcm.h is removed from sound/soc/pxa, we need to update the path in related files. Signed-off-by: Haojian Zhuang Tested-by: Ian Lartey Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/pxa/pxa-ssp.c | 2 +- sound/soc/pxa/pxa2xx-pcm.c | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c index 99d80e85621c..c4f480d67a50 100644 --- a/sound/soc/pxa/pxa-ssp.c +++ b/sound/soc/pxa/pxa-ssp.c @@ -35,7 +35,7 @@ #include #include -#include "pxa2xx-pcm.h" +#include "../../arm/pxa2xx-pcm.h" #include "pxa-ssp.h" /* diff --git a/sound/soc/pxa/pxa2xx-pcm.c b/sound/soc/pxa/pxa2xx-pcm.c index 5127044acfec..02fb66416ddc 100644 --- a/sound/soc/pxa/pxa2xx-pcm.c +++ b/sound/soc/pxa/pxa2xx-pcm.c @@ -16,7 +16,6 @@ #include #include -#include "pxa2xx-pcm.h" #include "../../arm/pxa2xx-pcm.h" static int pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream, -- cgit v1.2.3 From f5d1e5ed58dc0178e1678db63156772999379d49 Mon Sep 17 00:00:00 2001 From: Haojian Zhuang Date: Fri, 13 Aug 2010 21:55:35 +0800 Subject: ASoC: update setting for pxa ssp slave mode SCFR bit is required to be always set if pxa ssp is in slave mode. This bit indicates clock input to SSPSCLK is only active during data transfers. Signed-off-by: Haojian Zhuang Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/pxa/pxa-ssp.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'sound') diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c index c4f480d67a50..8dfbcda956ff 100644 --- a/sound/soc/pxa/pxa-ssp.c +++ b/sound/soc/pxa/pxa-ssp.c @@ -462,9 +462,7 @@ static int pxa_ssp_set_dai_fmt(struct snd_soc_dai *cpu_dai, { struct ssp_priv *priv = snd_soc_dai_get_drvdata(cpu_dai); struct ssp_device *ssp = priv->ssp; - u32 sscr0; - u32 sscr1; - u32 sspsp; + u32 sscr0, sscr1, sspsp, scfr; /* check if we need to change anything at all */ if (priv->dai_fmt == fmt) @@ -479,16 +477,16 @@ static int pxa_ssp_set_dai_fmt(struct snd_soc_dai *cpu_dai, /* reset port settings */ sscr0 = pxa_ssp_read_reg(ssp, SSCR0) & - (SSCR0_ECS | SSCR0_NCS | SSCR0_MOD | SSCR0_ACS); + ~(SSCR0_ECS | SSCR0_NCS | SSCR0_MOD | SSCR0_ACS); sscr1 = SSCR1_RxTresh(8) | SSCR1_TxTresh(7); sspsp = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: - sscr1 |= SSCR1_SCLKDIR | SSCR1_SFRMDIR; + sscr1 |= SSCR1_SCLKDIR | SSCR1_SFRMDIR | SSCR1_SCFR; break; case SND_SOC_DAIFMT_CBM_CFS: - sscr1 |= SSCR1_SCLKDIR; + sscr1 |= SSCR1_SCLKDIR | SSCR1_SCFR; break; case SND_SOC_DAIFMT_CBS_CFS: break; @@ -534,6 +532,17 @@ static int pxa_ssp_set_dai_fmt(struct snd_soc_dai *cpu_dai, pxa_ssp_write_reg(ssp, SSCR1, sscr1); pxa_ssp_write_reg(ssp, SSPSP, sspsp); + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBM_CFM: + case SND_SOC_DAIFMT_CBM_CFS: + scfr = pxa_ssp_read_reg(ssp, SSCR1) | SSCR1_SCFR; + pxa_ssp_write_reg(ssp, SSCR1, scfr); + + while (pxa_ssp_read_reg(ssp, SSSR) & SSSR_BSY) + cpu_relax(); + break; + } + dump_registers(ssp); /* Since we are configuring the timings for the format by hand @@ -583,10 +592,8 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream, /* clear selected SSP bits */ sscr0 = pxa_ssp_read_reg(ssp, SSCR0) & ~(SSCR0_DSS | SSCR0_EDSS); - pxa_ssp_write_reg(ssp, SSCR0, sscr0); /* bit size */ - sscr0 = pxa_ssp_read_reg(ssp, SSCR0); switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: #ifdef CONFIG_PXA3xx -- cgit v1.2.3 From eaae183f4b3f25522cd13ebf30162c1cb863b1f1 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 13 Aug 2010 19:26:28 +0100 Subject: ASoC: Add a bit of resource unwinding in the S3C IISv4 driver There's much more needed but this'll get us started. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/s3c24xx/s3c64xx-i2s-v4.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'sound') diff --git a/sound/soc/s3c24xx/s3c64xx-i2s-v4.c b/sound/soc/s3c24xx/s3c64xx-i2s-v4.c index a13415a85a45..a9628472ebfe 100644 --- a/sound/soc/s3c24xx/s3c64xx-i2s-v4.c +++ b/sound/soc/s3c24xx/s3c64xx-i2s-v4.c @@ -187,7 +187,18 @@ err: static __devexit int s3c64xx_i2sv4_dev_remove(struct platform_device *pdev) { + struct s3c_i2sv2_info *i2s = &s3c64xx_i2sv4; + struct resource *res; + snd_soc_unregister_dai(&pdev->dev); + clk_put(i2s->iis_cclk); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (res) + release_mem_region(res->start, resource_size(res)); + else + dev_warn(&pdev->dev, "Unable to get I2S SFR address\n"); + return 0; } -- cgit v1.2.3 From e231cab0a4b5844ae13a9584433ca3b9b204629e Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 13 Aug 2010 17:57:28 +0100 Subject: ASoC: Convert WM8580 hw_params to use snd_soc_update_bits() All the cool kids are using snd_soc_update_bits() these days. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8580.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c index b1a80e5ff8b5..4f414199d76d 100644 --- a/sound/soc/codecs/wm8580.c +++ b/sound/soc/codecs/wm8580.c @@ -485,9 +485,8 @@ static int wm8580_paif_hw_params(struct snd_pcm_substream *substream, { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_codec *codec = rtd->codec; - u16 paifb = snd_soc_read(codec, WM8580_PAIF3 + dai->driver->id); + u16 paifb = 0; - paifb &= ~WM8580_AIF_LENGTH_MASK; /* bit size */ switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: @@ -505,7 +504,8 @@ static int wm8580_paif_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_write(codec, WM8580_PAIF3 + dai->driver->id, paifb); + snd_soc_update_bits(codec, WM8580_PAIF3 + dai->driver->id, + WM8580_AIF_LENGTH_MASK, paifb); return 0; } -- cgit v1.2.3 From 8ef339df25ed424e7430fd411a52840c6af368c6 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 13 Aug 2010 18:09:52 +0100 Subject: ASoC: Remove unused rate selection bitmasks from WM8580 In the case of the BCLK rate the defines are at best misleading anyway. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8580.c | 12 ------------ 1 file changed, 12 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c index 4f414199d76d..9964f02f84e2 100644 --- a/sound/soc/codecs/wm8580.c +++ b/sound/soc/codecs/wm8580.c @@ -112,19 +112,7 @@ /* AIF control 1 (registers 9h-bh) */ #define WM8580_AIF_RATE_MASK 0x7 -#define WM8580_AIF_RATE_128 0x0 -#define WM8580_AIF_RATE_192 0x1 -#define WM8580_AIF_RATE_256 0x2 -#define WM8580_AIF_RATE_384 0x3 -#define WM8580_AIF_RATE_512 0x4 -#define WM8580_AIF_RATE_768 0x5 -#define WM8580_AIF_RATE_1152 0x6 - #define WM8580_AIF_BCLKSEL_MASK 0x18 -#define WM8580_AIF_BCLKSEL_64 0x00 -#define WM8580_AIF_BCLKSEL_128 0x08 -#define WM8580_AIF_BCLKSEL_256 0x10 -#define WM8580_AIF_BCLKSEL_SYSCLK 0x18 #define WM8580_AIF_MS 0x20 -- cgit v1.2.3 From c5607d8e7a4c30d2ff62b8eefe3f977d5c71d2fe Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 13 Aug 2010 19:05:04 +0100 Subject: ASoC: Automatically calculate clock ratio for WM8580 Implement set_sysclk() and then rather than assuming 256fs use the supplied value to calculate and configure the clock ratio for the currently used sample rate. As a side effect we also end up implementing clock selection for the ADC path. In order to avoid confusion remove the existing set_clkdiv() based configuration of the clock source for the DAC and update the SMDK64xx driver (which is the only in-tree user of the CODEC). Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8580.c | 101 ++++++++++++++++++++++++++++-------- sound/soc/codecs/wm8580.h | 14 ++--- sound/soc/s3c24xx/smdk64xx_wm8580.c | 9 ++-- 3 files changed, 90 insertions(+), 34 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c index 9964f02f84e2..7942f917d31e 100644 --- a/sound/soc/codecs/wm8580.c +++ b/sound/soc/codecs/wm8580.c @@ -192,6 +192,7 @@ struct wm8580_priv { u16 reg_cache[WM8580_MAX_REGISTER + 1]; struct pll_state a; struct pll_state b; + int sysclk[2]; }; static const DECLARE_TLV_DB_SCALE(dac_tlv, -12750, 50, 1); @@ -464,6 +465,10 @@ static int wm8580_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, return 0; } +static const int wm8580_sysclk_ratios[] = { + 128, 192, 256, 384, 512, 768, 1152, +}; + /* * Set PCM DAI bit size and sample rate. */ @@ -473,7 +478,10 @@ static int wm8580_paif_hw_params(struct snd_pcm_substream *substream, { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_codec *codec = rtd->codec; + struct wm8580_priv *wm8580 = snd_soc_codec_get_drvdata(codec); + u16 paifa = 0; u16 paifb = 0; + int i, ratio; /* bit size */ switch (params_format(params)) { @@ -492,6 +500,22 @@ static int wm8580_paif_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } + /* Look up the SYSCLK ratio; accept only exact matches */ + ratio = wm8580->sysclk[dai->id] / params_rate(params); + for (i = 0; i < ARRAY_SIZE(wm8580_sysclk_ratios); i++) + if (ratio == wm8580_sysclk_ratios[i]) + break; + if (i == ARRAY_SIZE(wm8580_sysclk_ratios)) { + dev_err(codec->dev, "Invalid clock ratio %d/%d\n", + wm8580->sysclk[dai->id], params_rate(params)); + return -EINVAL; + } + paifa |= i; + dev_dbg(codec->dev, "Running at %dfs with %dHz clock\n", + wm8580_sysclk_ratios[i], wm8580->sysclk[dai->driver->id]); + + snd_soc_update_bits(codec, WM8580_PAIF1 + dai->driver->id, + WM8580_AIF_RATE_MASK, paifa); snd_soc_update_bits(codec, WM8580_PAIF3 + dai->driver->id, WM8580_AIF_LENGTH_MASK, paifb); return 0; @@ -501,9 +525,11 @@ static int wm8580_set_paif_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { struct snd_soc_codec *codec = codec_dai->codec; + struct wm8580_priv *wm8580 = snd_soc_codec_get_drvdata(codec); unsigned int aifa; unsigned int aifb; int can_invert_lrclk; + int sysclk; aifa = snd_soc_read(codec, WM8580_PAIF1 + codec_dai->driver->id); aifb = snd_soc_read(codec, WM8580_PAIF3 + codec_dai->driver->id); @@ -572,6 +598,8 @@ static int wm8580_set_paif_dai_fmt(struct snd_soc_dai *codec_dai, return -EINVAL; } + sysclk = wm8580->sysclk[codec_dai->driver->id]; + snd_soc_write(codec, WM8580_PAIF1 + codec_dai->driver->id, aifa); snd_soc_write(codec, WM8580_PAIF3 + codec_dai->driver->id, aifb); @@ -611,28 +639,6 @@ static int wm8580_set_dai_clkdiv(struct snd_soc_dai *codec_dai, snd_soc_write(codec, WM8580_PLLB4, reg); break; - case WM8580_DAC_CLKSEL: - reg = snd_soc_read(codec, WM8580_CLKSEL); - reg &= ~WM8580_CLKSEL_DAC_CLKSEL_MASK; - - switch (div) { - case WM8580_CLKSRC_MCLK: - break; - - case WM8580_CLKSRC_PLLA: - reg |= WM8580_CLKSEL_DAC_CLKSEL_PLLA; - break; - - case WM8580_CLKSRC_PLLB: - reg |= WM8580_CLKSEL_DAC_CLKSEL_PLLB; - break; - - default: - return -EINVAL; - } - snd_soc_write(codec, WM8580_CLKSEL, reg); - break; - case WM8580_CLKOUTSRC: reg = snd_soc_read(codec, WM8580_PLLB4); reg &= ~WM8580_PLLB4_CLKOUTSRC_MASK; @@ -666,6 +672,55 @@ static int wm8580_set_dai_clkdiv(struct snd_soc_dai *codec_dai, return 0; } +static int wm8580_set_sysclk(struct snd_soc_dai *dai, int clk_id, + unsigned int freq, int dir) +{ + struct snd_soc_codec *codec = dai->codec; + struct wm8580_priv *wm8580 = snd_soc_codec_get_drvdata(codec); + int sel, sel_mask, sel_shift; + + switch (dai->driver->id) { + case WM8580_DAI_PAIFTX: + sel_mask = 0x3; + sel_shift = 0; + break; + + case WM8580_DAI_PAIFRX: + sel_mask = 0xc; + sel_shift = 2; + break; + + default: + BUG_ON("Unknown DAI driver ID\n"); + return -EINVAL; + } + + switch (clk_id) { + case WM8580_CLKSRC_ADCMCLK: + if (dai->id != WM8580_DAI_PAIFTX) + return -EINVAL; + sel = 0 << sel_shift; + break; + case WM8580_CLKSRC_PLLA: + sel = 1 << sel_shift; + break; + case WM8580_CLKSRC_PLLB: + sel = 2 << sel_shift; + break; + case WM8580_CLKSRC_MCLK: + sel = 3 << sel_shift; + break; + default: + dev_err(codec->dev, "Unknown clock %d\n", clk_id); + return -EINVAL; + } + + /* We really should validate PLL settings but not yet */ + wm8580->sysclk[dai->id] = freq; + + return snd_soc_update_bits(codec, WM8580_CLKSEL, sel, sel_mask); +} + static int wm8580_digital_mute(struct snd_soc_dai *codec_dai, int mute) { struct snd_soc_codec *codec = codec_dai->codec; @@ -719,6 +774,7 @@ static int wm8580_set_bias_level(struct snd_soc_codec *codec, SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) static struct snd_soc_dai_ops wm8580_dai_ops_playback = { + .set_sysclk = wm8580_set_sysclk, .hw_params = wm8580_paif_hw_params, .set_fmt = wm8580_set_paif_dai_fmt, .set_clkdiv = wm8580_set_dai_clkdiv, @@ -727,6 +783,7 @@ static struct snd_soc_dai_ops wm8580_dai_ops_playback = { }; static struct snd_soc_dai_ops wm8580_dai_ops_capture = { + .set_sysclk = wm8580_set_sysclk, .hw_params = wm8580_paif_hw_params, .set_fmt = wm8580_set_paif_dai_fmt, .set_clkdiv = wm8580_set_dai_clkdiv, diff --git a/sound/soc/codecs/wm8580.h b/sound/soc/codecs/wm8580.h index 8328ef667593..1d34656d0dcb 100644 --- a/sound/soc/codecs/wm8580.h +++ b/sound/soc/codecs/wm8580.h @@ -19,14 +19,14 @@ #define WM8580_PLLB 2 #define WM8580_MCLK 1 -#define WM8580_DAC_CLKSEL 2 -#define WM8580_CLKOUTSRC 3 +#define WM8580_CLKOUTSRC 2 -#define WM8580_CLKSRC_MCLK 1 -#define WM8580_CLKSRC_PLLA 2 -#define WM8580_CLKSRC_PLLB 3 -#define WM8580_CLKSRC_OSC 4 -#define WM8580_CLKSRC_NONE 5 +#define WM8580_CLKSRC_MCLK 1 +#define WM8580_CLKSRC_PLLA 2 +#define WM8580_CLKSRC_PLLB 3 +#define WM8580_CLKSRC_OSC 4 +#define WM8580_CLKSRC_NONE 5 +#define WM8580_CLKSRC_ADCMCLK 6 #define WM8580_DAI_PAIFRX 0 #define WM8580_DAI_PAIFTX 1 diff --git a/sound/soc/s3c24xx/smdk64xx_wm8580.c b/sound/soc/s3c24xx/smdk64xx_wm8580.c index 5c21e26da075..91367f7bfec3 100644 --- a/sound/soc/s3c24xx/smdk64xx_wm8580.c +++ b/sound/soc/s3c24xx/smdk64xx_wm8580.c @@ -113,14 +113,13 @@ static int smdk64xx_hw_params(struct snd_pcm_substream *substream, if (ret < 0) return ret; - /* Explicitly set WM8580-DAC to source from MCLK */ - ret = snd_soc_dai_set_clkdiv(codec_dai, WM8580_DAC_CLKSEL, - WM8580_CLKSRC_MCLK); + ret = snd_soc_dai_set_pll(codec_dai, WM8580_PLLA, 0, + SMDK64XX_WM8580_FREQ, pll_out); if (ret < 0) return ret; - ret = snd_soc_dai_set_pll(codec_dai, WM8580_PLLA, 0, - SMDK64XX_WM8580_FREQ, pll_out); + ret = snd_soc_dai_set_sysclk(codec_dai, WM8580_CLKSRC_PLLA, + pll_out, SND_SOC_CLOCK_IN); if (ret < 0) return ret; -- cgit v1.2.3 From ba2772edbe1f03a695029ca82844615fe41d28fc Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 13 Aug 2010 19:36:56 +0100 Subject: ASoC: Implement BCLK rate selection for WM8580 Drive a minimal supported number of clocks required for the current bit format in master mode. In slave mode this setting has no effect. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8580.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c index 7942f917d31e..b6b2d6f8cba9 100644 --- a/sound/soc/codecs/wm8580.c +++ b/sound/soc/codecs/wm8580.c @@ -486,14 +486,18 @@ static int wm8580_paif_hw_params(struct snd_pcm_substream *substream, /* bit size */ switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: + paifa |= 0x8; break; case SNDRV_PCM_FORMAT_S20_3LE: + paifa |= 0x10; paifb |= WM8580_AIF_LENGTH_20; break; case SNDRV_PCM_FORMAT_S24_LE: + paifa |= 0x10; paifb |= WM8580_AIF_LENGTH_24; break; case SNDRV_PCM_FORMAT_S32_LE: + paifa |= 0x10; paifb |= WM8580_AIF_LENGTH_24; break; default: @@ -515,7 +519,8 @@ static int wm8580_paif_hw_params(struct snd_pcm_substream *substream, wm8580_sysclk_ratios[i], wm8580->sysclk[dai->driver->id]); snd_soc_update_bits(codec, WM8580_PAIF1 + dai->driver->id, - WM8580_AIF_RATE_MASK, paifa); + WM8580_AIF_RATE_MASK | WM8580_AIF_BCLKSEL_MASK, + paifa); snd_soc_update_bits(codec, WM8580_PAIF3 + dai->driver->id, WM8580_AIF_LENGTH_MASK, paifb); return 0; -- cgit v1.2.3 From dacfe9f277f765dcebc7b34588d3af4a687ea2f3 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 13 Aug 2010 20:01:32 +0100 Subject: ASoC: Fix inverted WM8580 capture mute control Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8580.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c index b6b2d6f8cba9..834cf141ea2f 100644 --- a/sound/soc/codecs/wm8580.c +++ b/sound/soc/codecs/wm8580.c @@ -262,7 +262,7 @@ SOC_SINGLE("DAC1 Switch", WM8580_DAC_CONTROL5, 0, 1, 0), SOC_SINGLE("DAC2 Switch", WM8580_DAC_CONTROL5, 1, 1, 0), SOC_SINGLE("DAC3 Switch", WM8580_DAC_CONTROL5, 2, 1, 0), -SOC_DOUBLE("Capture Switch", WM8580_ADC_CONTROL1, 0, 1, 1, 0), +SOC_DOUBLE("Capture Switch", WM8580_ADC_CONTROL1, 0, 1, 1, 1), SOC_SINGLE("Capture High-Pass Filter Switch", WM8580_ADC_CONTROL1, 4, 1, 0), }; -- cgit v1.2.3 From 6bfb6aa91f61f2a7c526a6353c8c50676ca528da Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 13 Aug 2010 20:08:55 +0100 Subject: ASoC: Automatically manage WM8580 DAC OSR The DAC OSR should be selected based on the sample clock ratio. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8580.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c index 834cf141ea2f..d66db4bf11e4 100644 --- a/sound/soc/codecs/wm8580.c +++ b/sound/soc/codecs/wm8580.c @@ -94,6 +94,8 @@ #define WM8580_MAX_REGISTER 0x35 +#define WM8580_DACOSR 0x40 + /* PLLB4 (register 7h) */ #define WM8580_PLLB4_MCLKOUTSRC_MASK 0x60 #define WM8580_PLLB4_MCLKOUTSRC_PLLA 0x20 @@ -481,7 +483,7 @@ static int wm8580_paif_hw_params(struct snd_pcm_substream *substream, struct wm8580_priv *wm8580 = snd_soc_codec_get_drvdata(codec); u16 paifa = 0; u16 paifb = 0; - int i, ratio; + int i, ratio, osr; /* bit size */ switch (params_format(params)) { @@ -518,6 +520,22 @@ static int wm8580_paif_hw_params(struct snd_pcm_substream *substream, dev_dbg(codec->dev, "Running at %dfs with %dHz clock\n", wm8580_sysclk_ratios[i], wm8580->sysclk[dai->driver->id]); + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + switch (ratio) { + case 128: + case 192: + osr = WM8580_DACOSR; + dev_dbg(codec->dev, "Selecting 64x OSR\n"); + break; + default: + osr = 0; + dev_dbg(codec->dev, "Selecting 128x OSR\n"); + break; + } + + snd_soc_update_bits(codec, WM8580_PAIF3, WM8580_DACOSR, osr); + } + snd_soc_update_bits(codec, WM8580_PAIF1 + dai->driver->id, WM8580_AIF_RATE_MASK | WM8580_AIF_BCLKSEL_MASK, paifa); -- cgit v1.2.3 From a5ba6beb839cfa288960c92cd2668a2601c24dda Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 16 Aug 2010 08:08:48 +0200 Subject: ALSA: riptide - Fix detection / load of firmware files The detection and loading of firmeware on riptide driver has been broken due to rewrite of some codes, checking the presense wrongly. This patch fixes the logic again. Reference: kernel bug 16596 https://bugzilla.kernel.org/show_bug.cgi?id=16596 Cc: Signed-off-by: Takashi Iwai --- sound/pci/riptide/riptide.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'sound') diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c index f64fb7d988cb..ad5202efd7a9 100644 --- a/sound/pci/riptide/riptide.c +++ b/sound/pci/riptide/riptide.c @@ -1224,15 +1224,14 @@ static int try_to_load_firmware(struct cmdif *cif, struct snd_riptide *chip) firmware.firmware.ASIC, firmware.firmware.CODEC, firmware.firmware.AUXDSP, firmware.firmware.PROG); + if (!chip) + return 1; + for (i = 0; i < FIRMWARE_VERSIONS; i++) { if (!memcmp(&firmware_versions[i], &firmware, sizeof(firmware))) - break; - } - if (i >= FIRMWARE_VERSIONS) - return 0; /* no match */ + return 1; /* OK */ - if (!chip) - return 1; /* OK */ + } snd_printdd("Writing Firmware\n"); if (!chip->fw_entry) { -- cgit v1.2.3 From c3e68fad88143fd1fe8fe640207fb19c0f087dbc Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 16 Aug 2010 10:15:57 +0200 Subject: ALSA: hda - Add quirk for Dell Vostro 1220 model=dell-vostro is needed for Dell Vostro 1220 with Coexnat 5067. Reference: Novell bnc#631066 https://bugzilla.novell.com/show_bug.cgi?id=631066 Cc: Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_conexant.c | 1 + 1 file changed, 1 insertion(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 31b5d9eeba68..c424952a734e 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -3049,6 +3049,7 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { SND_PCI_QUIRK(0x1028, 0x02f5, "Dell", CXT5066_DELL_LAPTOP), SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), + SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTO), SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), -- cgit v1.2.3 From b2c1e07b81a126e5846dfc3d36f559d861df59f4 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Mon, 16 Aug 2010 11:46:57 +0100 Subject: ASoC: Remove DSP mode support for WM8776 This is not supported by current hardware revisions. Signed-off-by: Mark Brown Acked-by: Liam Girdwood Cc: stable@kernel.org --- sound/soc/codecs/wm8776.c | 7 ------- 1 file changed, 7 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8776.c b/sound/soc/codecs/wm8776.c index 4e212ed62ea6..f8154e661524 100644 --- a/sound/soc/codecs/wm8776.c +++ b/sound/soc/codecs/wm8776.c @@ -178,13 +178,6 @@ static int wm8776_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) case SND_SOC_DAIFMT_LEFT_J: iface |= 0x0001; break; - /* FIXME: CHECK A/B */ - case SND_SOC_DAIFMT_DSP_A: - iface |= 0x0003; - break; - case SND_SOC_DAIFMT_DSP_B: - iface |= 0x0007; - break; default: return -EINVAL; } -- cgit v1.2.3 From c25edef8dcdd9c193a8457e0cdf53197fd4523e8 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Mon, 16 Aug 2010 19:26:41 +0100 Subject: ASoC: Fix WM8580 CLKSEL mask selection The RX and TX directions were inverted. Reported-by: Seungwhan Youn Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8580.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c index af4517ed2964..42a6699662ee 100644 --- a/sound/soc/codecs/wm8580.c +++ b/sound/soc/codecs/wm8580.c @@ -703,12 +703,12 @@ static int wm8580_set_sysclk(struct snd_soc_dai *dai, int clk_id, int sel, sel_mask, sel_shift; switch (dai->driver->id) { - case WM8580_DAI_PAIFTX: + case WM8580_DAI_PAIFRX: sel_mask = 0x3; sel_shift = 0; break; - case WM8580_DAI_PAIFRX: + case WM8580_DAI_PAIFTX: sel_mask = 0xc; sel_shift = 2; break; -- cgit v1.2.3 From f538281c2b0b0e58a8059ba2accfe91f941d4f8a Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Mon, 16 Aug 2010 19:27:05 +0100 Subject: ASoC: Fix argument ordering for snd_soc_update_bits() in WM8580 Reported-by: Seungwhan Youn Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8580.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c index 42a6699662ee..910c62a3f594 100644 --- a/sound/soc/codecs/wm8580.c +++ b/sound/soc/codecs/wm8580.c @@ -741,7 +741,7 @@ static int wm8580_set_sysclk(struct snd_soc_dai *dai, int clk_id, /* We really should validate PLL settings but not yet */ wm8580->sysclk[dai->id] = freq; - return snd_soc_update_bits(codec, WM8580_CLKSEL, sel, sel_mask); + return snd_soc_update_bits(codec, WM8580_CLKSEL, sel_mask, sel); } static int wm8580_digital_mute(struct snd_soc_dai *codec_dai, int mute) -- cgit v1.2.3 From c69aefabe004d24e6eedf83b6f253647f77dfc43 Mon Sep 17 00:00:00 2001 From: Kailang Yang Date: Tue, 17 Aug 2010 10:39:22 +0200 Subject: ALSA: hda - Fix ALC680 base model capture - Fix capture mixer elements for ALC680 base model - Support auto change ADC for recording from MIC - Cancel capture source assigned in auto mode. Signed-off-by: Kailang Yang Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 176 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 144 insertions(+), 32 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 2cd1ae809e46..a4dd04524e43 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -19030,6 +19030,7 @@ static int patch_alc888(struct hda_codec *codec) /* * ALC680 support */ +#define ALC680_DIGIN_NID ALC880_DIGIN_NID #define ALC680_DIGOUT_NID ALC880_DIGOUT_NID #define alc680_modes alc260_modes @@ -19044,23 +19045,93 @@ static hda_nid_t alc680_adc_nids[3] = { 0x07, 0x08, 0x09 }; +/* + * Analog capture ADC cgange + */ +static int alc680_capture_pcm_prepare(struct hda_pcm_stream *hinfo, + struct hda_codec *codec, + unsigned int stream_tag, + unsigned int format, + struct snd_pcm_substream *substream) +{ + struct alc_spec *spec = codec->spec; + struct auto_pin_cfg *cfg = &spec->autocfg; + unsigned int pre_mic, pre_line; + + pre_mic = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_MIC]); + pre_line = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_LINE]); + + spec->cur_adc_stream_tag = stream_tag; + spec->cur_adc_format = format; + + if (pre_mic || pre_line) { + if (pre_mic) + snd_hda_codec_setup_stream(codec, 0x08, stream_tag, 0, + format); + else + snd_hda_codec_setup_stream(codec, 0x09, stream_tag, 0, + format); + } else + snd_hda_codec_setup_stream(codec, 0x07, stream_tag, 0, format); + return 0; +} + +static int alc680_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, + struct hda_codec *codec, + struct snd_pcm_substream *substream) +{ + snd_hda_codec_cleanup_stream(codec, 0x07); + snd_hda_codec_cleanup_stream(codec, 0x08); + snd_hda_codec_cleanup_stream(codec, 0x09); + return 0; +} + +static struct hda_pcm_stream alc680_pcm_analog_auto_capture = { + .substreams = 1, /* can be overridden */ + .channels_min = 2, + .channels_max = 2, + /* NID is set in alc_build_pcms */ + .ops = { + .prepare = alc680_capture_pcm_prepare, + .cleanup = alc680_capture_pcm_cleanup + }, +}; + static struct snd_kcontrol_new alc680_base_mixer[] = { /* output mixer control */ HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT), HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT), + HDA_CODEC_VOLUME("Int Mic Boost", 0x12, 0, HDA_INPUT), HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), + HDA_CODEC_VOLUME("Line In Boost", 0x19, 0, HDA_INPUT), { } }; -static struct snd_kcontrol_new alc680_capture_mixer[] = { - HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT), - HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT), - HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT), - HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT), - HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x09, 0x0, HDA_INPUT), - HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x09, 0x0, HDA_INPUT), +static struct hda_bind_ctls alc680_bind_cap_vol = { + .ops = &snd_hda_bind_vol, + .values = { + HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT), + HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), + HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), + 0 + }, +}; + +static struct hda_bind_ctls alc680_bind_cap_switch = { + .ops = &snd_hda_bind_sw, + .values = { + HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT), + HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), + HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), + 0 + }, +}; + +static struct snd_kcontrol_new alc680_master_capture_mixer[] = { + HDA_BIND_VOL("Capture Volume", &alc680_bind_cap_vol), + HDA_BIND_SW("Capture Switch", &alc680_bind_cap_switch), { } /* end */ }; @@ -19068,25 +19139,73 @@ static struct snd_kcontrol_new alc680_capture_mixer[] = { * generic initialization of ADC, input mixers and output mixers */ static struct hda_verb alc680_init_verbs[] = { - /* Unmute DAC0-1 and set vol = 0 */ - {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, - {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, - {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, + {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, + {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, - {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, - {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, + {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, + {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, + {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, + {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, + {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, + {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + + {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, + {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, + { } }; +/* toggle speaker-output according to the hp-jack state */ +static void alc680_base_setup(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + + spec->autocfg.hp_pins[0] = 0x16; + spec->autocfg.speaker_pins[0] = 0x14; + spec->autocfg.speaker_pins[1] = 0x15; + spec->autocfg.input_pins[AUTO_PIN_MIC] = 0x18; + spec->autocfg.input_pins[AUTO_PIN_LINE] = 0x19; +} + +static void alc680_rec_autoswitch(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + struct auto_pin_cfg *cfg = &spec->autocfg; + unsigned int present; + hda_nid_t new_adc; + + present = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_MIC]); + + new_adc = present ? 0x8 : 0x7; + __snd_hda_codec_cleanup_stream(codec, !present ? 0x8 : 0x7, 1); + snd_hda_codec_setup_stream(codec, new_adc, + spec->cur_adc_stream_tag, 0, + spec->cur_adc_format); + +} + +static void alc680_unsol_event(struct hda_codec *codec, + unsigned int res) +{ + if ((res >> 26) == ALC880_HP_EVENT) + alc_automute_amp(codec); + if ((res >> 26) == ALC880_MIC_EVENT) + alc680_rec_autoswitch(codec); +} + +static void alc680_inithook(struct hda_codec *codec) +{ + alc_automute_amp(codec); + alc680_rec_autoswitch(codec); +} + /* create input playback/capture controls for the given pin */ static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid, const char *ctlname, int idx) @@ -19197,13 +19316,7 @@ static void alc680_auto_init_hp_out(struct hda_codec *codec) #define alc680_pcm_analog_capture alc880_pcm_analog_capture #define alc680_pcm_analog_alt_capture alc880_pcm_analog_alt_capture #define alc680_pcm_digital_playback alc880_pcm_digital_playback - -static struct hda_input_mux alc680_capture_source = { - .num_items = 1, - .items = { - { "Mic", 0x0 }, - }, -}; +#define alc680_pcm_digital_capture alc880_pcm_digital_capture /* * BIOS auto configuration @@ -19218,6 +19331,7 @@ static int alc680_parse_auto_config(struct hda_codec *codec) alc680_ignore); if (err < 0) return err; + if (!spec->autocfg.line_outs) { if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) { spec->multiout.max_channels = 2; @@ -19239,8 +19353,6 @@ static int alc680_parse_auto_config(struct hda_codec *codec) add_mixer(spec, spec->kctls.list); add_verb(spec, alc680_init_verbs); - spec->num_mux_defs = 1; - spec->input_mux = &alc680_capture_source; err = alc_auto_add_mic_boost(codec); if (err < 0) @@ -19279,17 +19391,17 @@ static struct snd_pci_quirk alc680_cfg_tbl[] = { static struct alc_config_preset alc680_presets[] = { [ALC680_BASE] = { .mixers = { alc680_base_mixer }, - .cap_mixer = alc680_capture_mixer, + .cap_mixer = alc680_master_capture_mixer, .init_verbs = { alc680_init_verbs }, .num_dacs = ARRAY_SIZE(alc680_dac_nids), .dac_nids = alc680_dac_nids, - .num_adc_nids = ARRAY_SIZE(alc680_adc_nids), - .adc_nids = alc680_adc_nids, - .hp_nid = 0x04, .dig_out_nid = ALC680_DIGOUT_NID, .num_channel_mode = ARRAY_SIZE(alc680_modes), .channel_mode = alc680_modes, - .input_mux = &alc680_capture_source, + .unsol_event = alc680_unsol_event, + .setup = alc680_base_setup, + .init_hook = alc680_inithook, + }, }; @@ -19333,9 +19445,9 @@ static int patch_alc680(struct hda_codec *codec) setup_preset(codec, &alc680_presets[board_config]); spec->stream_analog_playback = &alc680_pcm_analog_playback; - spec->stream_analog_capture = &alc680_pcm_analog_capture; - spec->stream_analog_alt_capture = &alc680_pcm_analog_alt_capture; + spec->stream_analog_capture = &alc680_pcm_analog_auto_capture; spec->stream_digital_playback = &alc680_pcm_digital_playback; + spec->stream_digital_capture = &alc680_pcm_digital_capture; if (!spec->adc_nids) { spec->adc_nids = alc680_adc_nids; -- cgit v1.2.3 From 366624ba7a2a03160cd5343ba109105758d45ff9 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Mon, 16 Aug 2010 20:06:26 +0100 Subject: ASoC: Remove unused WM8974 private data Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8974.c | 1 - 1 file changed, 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8974.c b/sound/soc/codecs/wm8974.c index e61728b7339f..b4363f6d19b3 100644 --- a/sound/soc/codecs/wm8974.c +++ b/sound/soc/codecs/wm8974.c @@ -607,7 +607,6 @@ static int wm8974_resume(struct snd_soc_codec *codec) static int wm8974_probe(struct snd_soc_codec *codec) { - struct wm8974_priv *wm8974 = snd_soc_codec_get_drvdata(codec); int ret = 0; ret = snd_soc_codec_set_cache_io(codec, 7, 9, SND_SOC_I2C); -- cgit v1.2.3 From 3ca2ecd9200a8ef5b548e9c40253d75982c54886 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sun, 15 Aug 2010 17:48:47 +0200 Subject: ASoC: Multi-component: JZ4740: QI_LB60 board fixes This patch contains two small fixes for the sound board driver for the qi_lb60 introduced by the multi-component patches: * Remove unnecessary includes: Those includes where only used to get the definitions for the DAI devices and are thus not needed anymore. * Fix a typo. Signed-off-By: Lars-Peter Clausen Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/jz4740/qi_lb60.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'sound') diff --git a/sound/soc/jz4740/qi_lb60.c b/sound/soc/jz4740/qi_lb60.c index 78dabebe8fd0..ef1a99e6a3bd 100644 --- a/sound/soc/jz4740/qi_lb60.c +++ b/sound/soc/jz4740/qi_lb60.c @@ -22,11 +22,6 @@ #include #include -#include "../codecs/jz4740.h" -#include "jz4740-pcm.h" -#include "jz4740-i2s.h" - - #define QI_LB60_SND_GPIO JZ_GPIO_PORTB(29) #define QI_LB60_AMP_GPIO JZ_GPIO_PORTD(4) @@ -86,7 +81,7 @@ static struct snd_soc_dai_link qi_lb60_dai = { .name = "jz4740", .stream_name = "jz4740", .cpu_dai_name = "jz4740-i2s", - .platform_name = "jz4740-pmc-audio", + .platform_name = "jz4740-pcm-audio", .codec_dai_name = "jz4740-hifi", .codec_name = "jz4740-codec", .init = qi_lb60_codec_init, -- cgit v1.2.3 From 1593d7dd8c7b939e31b9d637307b26ada3e3c514 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Tue, 17 Aug 2010 23:35:31 +0100 Subject: ASoC: Fix a few more PXA build errors Dead pxa2xx-pcm.h includes and a missing , Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/pxa/corgi.c | 1 - sound/soc/pxa/em-x270.c | 1 - sound/soc/pxa/poodle.c | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/soc/pxa/corgi.c b/sound/soc/pxa/corgi.c index 11c6a495f970..555689cf6727 100644 --- a/sound/soc/pxa/corgi.c +++ b/sound/soc/pxa/corgi.c @@ -30,7 +30,6 @@ #include #include "../codecs/wm8731.h" -#include "pxa2xx-pcm.h" #include "pxa2xx-i2s.h" #define CORGI_HP 0 diff --git a/sound/soc/pxa/em-x270.c b/sound/soc/pxa/em-x270.c index 7046128b2a4c..eadf9d351a04 100644 --- a/sound/soc/pxa/em-x270.c +++ b/sound/soc/pxa/em-x270.c @@ -32,7 +32,6 @@ #include #include "../codecs/wm9712.h" -#include "pxa2xx-pcm.h" #include "pxa2xx-ac97.h" static struct snd_soc_dai_link em_x270_dai[] = { diff --git a/sound/soc/pxa/poodle.c b/sound/soc/pxa/poodle.c index 3ba5a962ecb8..add0e1c25bc8 100644 --- a/sound/soc/pxa/poodle.c +++ b/sound/soc/pxa/poodle.c @@ -267,7 +267,7 @@ static struct snd_soc_dai_link poodle_dai = { .name = "WM8731", .stream_name = "WM8731", .cpu_dai_name = "pxa-i2s", - .codec_dai_name = "wm8731-hifi" + .codec_dai_name = "wm8731-hifi", .platform_name = "pxa-pcm-audio", .codec_name = "wm8731-codec.0-001a", .init = poodle_wm8731_init, -- cgit v1.2.3 From 4c3f9d5fcb46d769f4a52a044fead863419c1d58 Mon Sep 17 00:00:00 2001 From: Liam Girdwood Date: Wed, 18 Aug 2010 00:25:12 +0100 Subject: ASoC: core - fix build warning on x86_64 Output size_t type as a "%Zu" to avoid warnings. Signed-off-by: Liam Girdwood --- sound/soc/soc-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 3d480eb3555f..7093c1787128 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -2916,7 +2916,7 @@ int snd_soc_register_dais(struct device *dev, struct snd_soc_dai *dai; int i, ret = 0; - dev_dbg(dev, "dai register %s #%d\n", dev_name(dev), count); + dev_dbg(dev, "dai register %s #%Zu\n", dev_name(dev), count); for (i = 0; i < count; i++) { -- cgit v1.2.3 From 720ffa4cf3f6b76c27737a9d57bd0e6cc6af1fba Mon Sep 17 00:00:00 2001 From: Liam Girdwood Date: Wed, 18 Aug 2010 00:30:30 +0100 Subject: ASoC: core - fix build warning on x86_64 Output size_t type as a "%Zu" to avoid warnings. Signed-off-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/soc-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 3d480eb3555f..7093c1787128 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -2916,7 +2916,7 @@ int snd_soc_register_dais(struct device *dev, struct snd_soc_dai *dai; int i, ret = 0; - dev_dbg(dev, "dai register %s #%d\n", dev_name(dev), count); + dev_dbg(dev, "dai register %s #%Zu\n", dev_name(dev), count); for (i = 0; i < count; i++) { -- cgit v1.2.3 From 56385a12d9bb9e173751f74b6c430742018cafc0 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 18 Aug 2010 14:08:17 +0200 Subject: ALSA: emu10k1 - delay the PCM interrupts (add pcm_irq_delay parameter) With some hardware combinations, the PCM interrupts are acknowledged before the period boundary from the emu10k1 chip. The midlevel PCM code gets confused and the playback stream is interrupted. It seems that the interrupt processing shift by 2 samples is enough to fix this issue. This default value does not harm other, non-affected hardware. More information: Kernel bugzilla bug#16300 [A copmile warning fixed by tiwai] Signed-off-by: Jaroslav Kysela Cc: Signed-off-by: Takashi Iwai --- sound/core/pcm_native.c | 4 ++++ sound/pci/emu10k1/emu10k1.c | 4 ++++ sound/pci/emu10k1/emupcm.c | 30 ++++++++++++++++++++++++++---- sound/pci/emu10k1/memory.c | 4 +++- 4 files changed, 37 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index a3b2a6479246..134fc6c2e08d 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -978,6 +978,10 @@ static int snd_pcm_do_pause(struct snd_pcm_substream *substream, int push) { if (substream->runtime->trigger_master != substream) return 0; + /* some drivers might use hw_ptr to recover from the pause - + update the hw_ptr now */ + if (push) + snd_pcm_update_hw_ptr(substream); /* The jiffies check in snd_pcm_update_hw_ptr*() is done by * a delta betwen the current jiffies, this gives a large enough * delta, effectively to skip the check once. diff --git a/sound/pci/emu10k1/emu10k1.c b/sound/pci/emu10k1/emu10k1.c index 4203782d7cb7..aff8387c45cf 100644 --- a/sound/pci/emu10k1/emu10k1.c +++ b/sound/pci/emu10k1/emu10k1.c @@ -52,6 +52,7 @@ static int max_synth_voices[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 64}; static int max_buffer_size[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 128}; static int enable_ir[SNDRV_CARDS]; static uint subsystem[SNDRV_CARDS]; /* Force card subsystem model */ +static uint delay_pcm_irq[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2}; module_param_array(index, int, NULL, 0444); MODULE_PARM_DESC(index, "Index value for the EMU10K1 soundcard."); @@ -73,6 +74,8 @@ module_param_array(enable_ir, bool, NULL, 0444); MODULE_PARM_DESC(enable_ir, "Enable IR."); module_param_array(subsystem, uint, NULL, 0444); MODULE_PARM_DESC(subsystem, "Force card subsystem model."); +module_param_array(delay_pcm_irq, uint, NULL, 0444); +MODULE_PARM_DESC(delay_pcm_irq, "Delay PCM interrupt by specified number of samples (default 0)."); /* * Class 0401: 1102:0008 (rev 00) Subsystem: 1102:1001 -> Audigy2 Value Model:SB0400 */ @@ -127,6 +130,7 @@ static int __devinit snd_card_emu10k1_probe(struct pci_dev *pci, &emu)) < 0) goto error; card->private_data = emu; + emu->delay_pcm_irq = delay_pcm_irq[dev] & 0x1f; if ((err = snd_emu10k1_pcm(emu, 0, NULL)) < 0) goto error; if ((err = snd_emu10k1_pcm_mic(emu, 1, NULL)) < 0) diff --git a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c index 55b83ef73c63..622bace148e3 100644 --- a/sound/pci/emu10k1/emupcm.c +++ b/sound/pci/emu10k1/emupcm.c @@ -332,7 +332,7 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu, evoice->epcm->ccca_start_addr = start_addr + ccis; if (extra) { start_addr += ccis; - end_addr += ccis; + end_addr += ccis + emu->delay_pcm_irq; } if (stereo && !extra) { snd_emu10k1_ptr_write(emu, CPF, voice, CPF_STEREO_MASK); @@ -360,7 +360,9 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu, /* Assumption that PT is already 0 so no harm overwriting */ snd_emu10k1_ptr_write(emu, PTRX, voice, (send_amount[0] << 8) | send_amount[1]); snd_emu10k1_ptr_write(emu, DSL, voice, end_addr | (send_amount[3] << 24)); - snd_emu10k1_ptr_write(emu, PSST, voice, start_addr | (send_amount[2] << 24)); + snd_emu10k1_ptr_write(emu, PSST, voice, + (start_addr + (extra ? emu->delay_pcm_irq : 0)) | + (send_amount[2] << 24)); if (emu->card_capabilities->emu_model) pitch_target = PITCH_48000; /* Disable interpolators on emu1010 card */ else @@ -732,6 +734,23 @@ static void snd_emu10k1_playback_stop_voice(struct snd_emu10k1 *emu, struct snd_ snd_emu10k1_ptr_write(emu, IP, voice, 0); } +static inline void snd_emu10k1_playback_mangle_extra(struct snd_emu10k1 *emu, + struct snd_emu10k1_pcm *epcm, + struct snd_pcm_substream *substream, + struct snd_pcm_runtime *runtime) +{ + unsigned int ptr, period_pos; + + /* try to sychronize the current position for the interrupt + source voice */ + period_pos = runtime->status->hw_ptr - runtime->hw_ptr_interrupt; + period_pos %= runtime->period_size; + ptr = snd_emu10k1_ptr_read(emu, CCCA, epcm->extra->number); + ptr &= ~0x00ffffff; + ptr |= epcm->ccca_start_addr + period_pos; + snd_emu10k1_ptr_write(emu, CCCA, epcm->extra->number, ptr); +} + static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream, int cmd) { @@ -753,6 +772,8 @@ static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream, /* follow thru */ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: case SNDRV_PCM_TRIGGER_RESUME: + if (cmd == SNDRV_PCM_TRIGGER_PAUSE_RELEASE) + snd_emu10k1_playback_mangle_extra(emu, epcm, substream, runtime); mix = &emu->pcm_mixer[substream->number]; snd_emu10k1_playback_prepare_voice(emu, epcm->voices[0], 1, 0, mix); snd_emu10k1_playback_prepare_voice(emu, epcm->voices[1], 0, 0, mix); @@ -869,8 +890,9 @@ static snd_pcm_uframes_t snd_emu10k1_playback_pointer(struct snd_pcm_substream * #endif /* printk(KERN_DEBUG - "ptr = 0x%x, buffer_size = 0x%x, period_size = 0x%x\n", - ptr, runtime->buffer_size, runtime->period_size); + "ptr = 0x%lx, buffer_size = 0x%lx, period_size = 0x%lx\n", + (long)ptr, (long)runtime->buffer_size, + (long)runtime->period_size); */ return ptr; } diff --git a/sound/pci/emu10k1/memory.c b/sound/pci/emu10k1/memory.c index ffb1ddb8dc28..957a311514c8 100644 --- a/sound/pci/emu10k1/memory.c +++ b/sound/pci/emu10k1/memory.c @@ -310,8 +310,10 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst if (snd_BUG_ON(!hdr)) return NULL; + idx = runtime->period_size >= runtime->buffer_size ? + (emu->delay_pcm_irq * 2) : 0; mutex_lock(&hdr->block_mutex); - blk = search_empty(emu, runtime->dma_bytes); + blk = search_empty(emu, runtime->dma_bytes + idx); if (blk == NULL) { mutex_unlock(&hdr->block_mutex); return NULL; -- cgit v1.2.3 From bd76af0f87f7a1815b311bde269a3f18305b3169 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 18 Aug 2010 14:16:54 +0200 Subject: ALSA: pcm midlevel code - add time check for double interrupt acknowledge The current code in pcm_lib.c do all checks using only the position in the ring buffer. Unfortunately, where the interrupts gets delayed or merged into one, we need another timing source to check when the buffer size boundary overlaps to avoid the wrong updating of the ring buffer pointers. This code uses jiffies to check the right time window without any performance impact. Signed-off-by: Jaroslav Kysela Signed-off-by: Takashi Iwai --- sound/core/pcm_lib.c | 14 +++++++++----- sound/core/pcm_native.c | 2 ++ 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index e23e0e7ab26f..a1707cca9c66 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c @@ -334,11 +334,15 @@ static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream, /* delta = "expected next hw_ptr" for in_interrupt != 0 */ delta = runtime->hw_ptr_interrupt + runtime->period_size; if (delta > new_hw_ptr) { - hw_base += runtime->buffer_size; - if (hw_base >= runtime->boundary) - hw_base = 0; - new_hw_ptr = hw_base + pos; - goto __delta; + /* check for double acknowledged interrupts */ + hdelta = jiffies - runtime->hw_ptr_jiffies; + if (hdelta > runtime->hw_ptr_buffer_jiffies/2) { + hw_base += runtime->buffer_size; + if (hw_base >= runtime->boundary) + hw_base = 0; + new_hw_ptr = hw_base + pos; + goto __delta; + } } } /* new_hw_ptr might be lower than old_hw_ptr in case when */ diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 134fc6c2e08d..e2e73895db12 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -864,6 +864,8 @@ static void snd_pcm_post_start(struct snd_pcm_substream *substream, int state) struct snd_pcm_runtime *runtime = substream->runtime; snd_pcm_trigger_tstamp(substream); runtime->hw_ptr_jiffies = jiffies; + runtime->hw_ptr_buffer_jiffies = (runtime->buffer_size * HZ) / + runtime->rate; runtime->status->state = state; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && runtime->silence_size > 0) -- cgit v1.2.3 From e77125105bbfe71f325466cdf9a16e496c96ac7a Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Tue, 17 Aug 2010 23:40:24 +0100 Subject: ASoC: Support non-crystal master clocks for WM8731 Instead of unconditionally enabling the crystal oscillator on the WM8731 only enable it when explicitly selected via set_sysclk(), allowing machine drivers to specify that they drive a clock into MCLK alone. This avoids any conflicts between the oscillator and the external MCLK source and saves power for systems which do not need the oscillator. This should also deliver a small power saving on systems using the crystal since the oscillator will only be enabled when the ADC or DAC is active. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/atmel/sam9g20_wm8731.c | 2 +- sound/soc/au1x/db1200.c | 2 +- sound/soc/codecs/wm8731.c | 31 +++++++++++++++++++++++++++++-- sound/soc/codecs/wm8731.h | 4 +++- sound/soc/pxa/corgi.c | 2 +- sound/soc/pxa/poodle.c | 2 +- 6 files changed, 36 insertions(+), 7 deletions(-) (limited to 'sound') diff --git a/sound/soc/atmel/sam9g20_wm8731.c b/sound/soc/atmel/sam9g20_wm8731.c index 66a6f1879689..8399ac46cb33 100644 --- a/sound/soc/atmel/sam9g20_wm8731.c +++ b/sound/soc/atmel/sam9g20_wm8731.c @@ -146,7 +146,7 @@ static int at91sam9g20ek_wm8731_init(struct snd_soc_pcm_runtime *rtd) "at91sam9g20ek_wm8731 " ": at91sam9g20ek_wm8731_init() called\n"); - ret = snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK, + ret = snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL, MCLK_RATE, SND_SOC_CLOCK_IN); if (ret < 0) { printk(KERN_ERR "Failed to set WM8731 SYSCLK: %d\n", ret); diff --git a/sound/soc/au1x/db1200.c b/sound/soc/au1x/db1200.c index 8780c90107fc..d8dc8225576a 100644 --- a/sound/soc/au1x/db1200.c +++ b/sound/soc/au1x/db1200.c @@ -49,7 +49,7 @@ static int db1200_i2s_startup(struct snd_pcm_substream *substream) int ret; /* WM8731 has its own 12MHz crystal */ - snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK, + snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL, 12000000, SND_SOC_CLOCK_IN); /* codec is bitclock and lrclk master */ diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c index 19844fc8cb1d..56f540838745 100644 --- a/sound/soc/codecs/wm8731.c +++ b/sound/soc/codecs/wm8731.c @@ -46,6 +46,7 @@ struct wm8731_priv { struct regulator_bulk_data supplies[WM8731_NUM_SUPPLIES]; u16 reg_cache[WM8731_CACHEREGNUM]; unsigned int sysclk; + int sysclk_type; }; @@ -110,6 +111,7 @@ static const struct snd_kcontrol_new wm8731_input_mux_controls = SOC_DAPM_ENUM("Input Select", wm8731_enum[0]); static const struct snd_soc_dapm_widget wm8731_dapm_widgets[] = { +SND_SOC_DAPM_SUPPLY("OSC", WM8731_PWR, 5, 1, NULL, 0), SND_SOC_DAPM_MIXER("Output Mixer", WM8731_PWR, 4, 1, &wm8731_output_mixer_controls[0], ARRAY_SIZE(wm8731_output_mixer_controls)), @@ -127,7 +129,18 @@ SND_SOC_DAPM_INPUT("RLINEIN"), SND_SOC_DAPM_INPUT("LLINEIN"), }; +static int wm8731_check_osc(struct snd_soc_dapm_widget *source, + struct snd_soc_dapm_widget *sink) +{ + struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(source->codec); + + return wm8731->sysclk_type == WM8731_SYSCLK_MCLK; +} + static const struct snd_soc_dapm_route intercon[] = { + {"DAC", NULL, "OSC", wm8731_check_osc}, + {"ADC", NULL, "OSC", wm8731_check_osc}, + /* output mixer */ {"Output Mixer", "Line Bypass Switch", "Line Input"}, {"Output Mixer", "HiFi Playback Switch", "DAC"}, @@ -285,6 +298,15 @@ static int wm8731_set_dai_sysclk(struct snd_soc_dai *codec_dai, struct snd_soc_codec *codec = codec_dai->codec; struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec); + switch (clk_id) { + case WM8731_SYSCLK_XTAL: + case WM8731_SYSCLK_MCLK: + wm8731->sysclk_type = clk_id; + break; + default: + return -EINVAL; + } + switch (freq) { case 11289600: case 12000000: @@ -292,9 +314,14 @@ static int wm8731_set_dai_sysclk(struct snd_soc_dai *codec_dai, case 16934400: case 18432000: wm8731->sysclk = freq; - return 0; + break; + default: + return -EINVAL; } - return -EINVAL; + + snd_soc_dapm_sync(codec); + + return 0; } diff --git a/sound/soc/codecs/wm8731.h b/sound/soc/codecs/wm8731.h index 73a70e206ba9..e9c0c76ab73b 100644 --- a/sound/soc/codecs/wm8731.h +++ b/sound/soc/codecs/wm8731.h @@ -31,7 +31,9 @@ #define WM8731_CACHEREGNUM 10 -#define WM8731_SYSCLK 0 +#define WM8731_SYSCLK_XTAL 1 +#define WM8731_SYSCLK_MCLK 2 + #define WM8731_DAI 0 #endif diff --git a/sound/soc/pxa/corgi.c b/sound/soc/pxa/corgi.c index 555689cf6727..97e9423615c9 100644 --- a/sound/soc/pxa/corgi.c +++ b/sound/soc/pxa/corgi.c @@ -149,7 +149,7 @@ static int corgi_hw_params(struct snd_pcm_substream *substream, return ret; /* set the codec system clock for DAC and ADC */ - ret = snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK, clk, + ret = snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL, clk, SND_SOC_CLOCK_IN); if (ret < 0) return ret; diff --git a/sound/soc/pxa/poodle.c b/sound/soc/pxa/poodle.c index add0e1c25bc8..fa752f6ec37d 100644 --- a/sound/soc/pxa/poodle.c +++ b/sound/soc/pxa/poodle.c @@ -128,7 +128,7 @@ static int poodle_hw_params(struct snd_pcm_substream *substream, return ret; /* set the codec system clock for DAC and ADC */ - ret = snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK, clk, + ret = snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL, clk, SND_SOC_CLOCK_IN); if (ret < 0) return ret; -- cgit v1.2.3 From dad965f07be946726c6153cf578d089ea991f41e Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Wed, 18 Aug 2010 16:25:59 +0100 Subject: ASoC: Fix device name for AT91SAM9G20-EK devices A couple of typos in the multi-component conversion. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/atmel/sam9g20_wm8731.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/atmel/sam9g20_wm8731.c b/sound/soc/atmel/sam9g20_wm8731.c index 8399ac46cb33..cf029a89ef76 100644 --- a/sound/soc/atmel/sam9g20_wm8731.c +++ b/sound/soc/atmel/sam9g20_wm8731.c @@ -183,8 +183,8 @@ static struct snd_soc_dai_link at91sam9g20ek_dai = { .cpu_dai_name = "atmel-ssc-dai.0", .codec_dai_name = "wm8731-hifi", .init = at91sam9g20ek_wm8731_init, - .platform_name = "atmel_pcm-audio", - .codec_name = "wm8731-codec.0-001a", + .platform_name = "atmel-pcm-audio", + .codec_name = "wm8731-codec.0-001b", .ops = &at91sam9g20ek_ops, }; -- cgit v1.2.3 From abfa4eae0bd2723859931631771ac275f97cada4 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Wed, 18 Aug 2010 16:29:37 +0100 Subject: ASoC: Add simplfied device registration for Atmel SSC devices Since the SSC is already being registered as a device under arch and the DMA and SSC hardware are pretty much the same provide a simplified device registration function for the Atmel SSC which will add the ASoC-specific devices within the ASoC code, parenting the SSC device off the actual SSC device. Also use it in the sam9g20-ek driver. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/atmel/atmel_ssc_dai.c | 57 +++++++++++++++++++++++++++++++++++++--- sound/soc/atmel/atmel_ssc_dai.h | 2 ++ sound/soc/atmel/sam9g20_wm8731.c | 6 +++++ 3 files changed, 62 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c index eabf66af12cd..5d230cee3fa7 100644 --- a/sound/soc/atmel/atmel_ssc_dai.c +++ b/sound/soc/atmel/atmel_ssc_dai.c @@ -789,13 +789,14 @@ static struct snd_soc_dai_driver atmel_ssc_dai[NUM_SSC_DEVICES] = { static __devinit int asoc_ssc_probe(struct platform_device *pdev) { - return snd_soc_register_dais(&pdev->dev, atmel_ssc_dai, - ARRAY_SIZE(atmel_ssc_dai)); + BUG_ON(pdev->id < 0); + BUG_ON(pdev->id >= ARRAY_SIZE(atmel_ssc_dai)); + return snd_soc_register_dai(&pdev->dev, &atmel_ssc_dai[pdev->id]); } static int __devexit asoc_ssc_remove(struct platform_device *pdev) { - snd_soc_unregister_dais(&pdev->dev, ARRAY_SIZE(atmel_ssc_dai)); + snd_soc_unregister_dai(&pdev->dev); return 0; } @@ -809,6 +810,56 @@ static struct platform_driver asoc_ssc_driver = { .remove = __devexit_p(asoc_ssc_remove), }; +/** + * atmel_ssc_set_audio - Allocate the specified SSC for audio use. + */ +int atmel_ssc_set_audio(int ssc_id) +{ + struct ssc_device *ssc; + static struct platform_device *dma_pdev; + struct platform_device *ssc_pdev; + int ret; + + if (ssc_id < 0 || ssc_id >= ARRAY_SIZE(atmel_ssc_dai)) + return -EINVAL; + + /* Allocate a dummy device for DMA if we don't have one already */ + if (!dma_pdev) { + dma_pdev = platform_device_alloc("atmel-pcm-audio", -1); + if (!dma_pdev) + return -ENOMEM; + + ret = platform_device_add(dma_pdev); + if (ret < 0) { + platform_device_put(dma_pdev); + dma_pdev = NULL; + return ret; + } + } + + ssc_pdev = platform_device_alloc("atmel-ssc-dai", ssc_id); + if (!ssc_pdev) { + ssc_free(ssc); + return -ENOMEM; + } + + /* If we can grab the SSC briefly to parent the DAI device off it */ + ssc = ssc_request(ssc_id); + if (IS_ERR(ssc)) + pr_warn("Unable to parent ASoC SSC DAI on SSC: %ld\n", + PTR_ERR(ssc)); + else + ssc_pdev->dev.parent = &(ssc->pdev->dev); + ssc_free(ssc); + + ret = platform_device_add(ssc_pdev); + if (ret < 0) + platform_device_put(ssc_pdev); + + return ret; +} +EXPORT_SYMBOL_GPL(atmel_ssc_set_audio); + static int __init snd_atmel_ssc_init(void) { return platform_driver_register(&asoc_ssc_driver); diff --git a/sound/soc/atmel/atmel_ssc_dai.h b/sound/soc/atmel/atmel_ssc_dai.h index 392a46953112..5d4f0f9b4d9a 100644 --- a/sound/soc/atmel/atmel_ssc_dai.h +++ b/sound/soc/atmel/atmel_ssc_dai.h @@ -117,4 +117,6 @@ struct atmel_ssc_info { struct atmel_ssc_state ssc_state; }; +int atmel_ssc_set_audio(int ssc); + #endif /* _AT91_SSC_DAI_H */ diff --git a/sound/soc/atmel/sam9g20_wm8731.c b/sound/soc/atmel/sam9g20_wm8731.c index cf029a89ef76..293569dfd0ed 100644 --- a/sound/soc/atmel/sam9g20_wm8731.c +++ b/sound/soc/atmel/sam9g20_wm8731.c @@ -205,6 +205,12 @@ static int __init at91sam9g20ek_init(void) if (!(machine_is_at91sam9g20ek() || machine_is_at91sam9g20ek_2mmc())) return -ENODEV; + ret = atmel_ssc_set_audio(0); + if (ret != 0) { + pr_err("Failed to set SSC 0 for audio: %d\n", ret); + return ret; + } + /* * Codec MCLK is supplied by PCK0 - set it up. */ -- cgit v1.2.3 From f213f4b51777408c12bf6b890a9bcae385f7698f Mon Sep 17 00:00:00 2001 From: Haojian Zhuang Date: Thu, 19 Aug 2010 00:35:25 +0800 Subject: ASoC: add 88pm860x codec driver Add 88PM860x codec driver. 88PM860x codec supports two interfaces. And it also supports headset/mic/hook/short detection. Signed-off-by: Haojian Zhuang Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/88pm860x-codec.c | 1486 +++++++++++++++++++++++++++++++++++++ sound/soc/codecs/88pm860x-codec.h | 97 +++ sound/soc/codecs/Kconfig | 4 + sound/soc/codecs/Makefile | 2 + 4 files changed, 1589 insertions(+) create mode 100644 sound/soc/codecs/88pm860x-codec.c create mode 100644 sound/soc/codecs/88pm860x-codec.h (limited to 'sound') diff --git a/sound/soc/codecs/88pm860x-codec.c b/sound/soc/codecs/88pm860x-codec.c new file mode 100644 index 000000000000..01d19e9f53f9 --- /dev/null +++ b/sound/soc/codecs/88pm860x-codec.c @@ -0,0 +1,1486 @@ +/* + * 88pm860x-codec.c -- 88PM860x ALSA SoC Audio Driver + * + * Copyright 2010 Marvell International Ltd. + * Author: Haojian Zhuang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "88pm860x-codec.h" + +#define MAX_NAME_LEN 20 +#define REG_CACHE_SIZE 0x40 +#define REG_CACHE_BASE 0xb0 + +/* Status Register 1 (0x01) */ +#define REG_STATUS_1 0x01 +#define MIC_STATUS (1 << 7) +#define HOOK_STATUS (1 << 6) +#define HEADSET_STATUS (1 << 5) + +/* Mic Detection Register (0x37) */ +#define REG_MIC_DET 0x37 +#define CONTINUOUS_POLLING (3 << 1) +#define EN_MIC_DET (1 << 0) +#define MICDET_MASK 0x07 + +/* Headset Detection Register (0x38) */ +#define REG_HS_DET 0x38 +#define EN_HS_DET (1 << 0) + +/* Misc2 Register (0x42) */ +#define REG_MISC2 0x42 +#define AUDIO_PLL (1 << 5) +#define AUDIO_SECTION_RESET (1 << 4) +#define AUDIO_SECTION_ON (1 << 3) + +/* PCM Interface Register 2 (0xb1) */ +#define PCM_INF2_BCLK (1 << 6) /* Bit clock polarity */ +#define PCM_INF2_FS (1 << 5) /* Frame Sync polarity */ +#define PCM_INF2_MASTER (1 << 4) /* Master / Slave */ +#define PCM_INF2_18WL (1 << 3) /* 18 / 16 bits */ +#define PCM_GENERAL_I2S 0 +#define PCM_EXACT_I2S 1 +#define PCM_LEFT_I2S 2 +#define PCM_RIGHT_I2S 3 +#define PCM_SHORT_FS 4 +#define PCM_LONG_FS 5 +#define PCM_MODE_MASK 7 + +/* I2S Interface Register 4 (0xbe) */ +#define I2S_EQU_BYP (1 << 6) + +/* DAC Offset Register (0xcb) */ +#define DAC_MUTE (1 << 7) +#define MUTE_LEFT (1 << 6) +#define MUTE_RIGHT (1 << 2) + +/* ADC Analog Register 1 (0xd0) */ +#define REG_ADC_ANA_1 0xd0 +#define MIC1BIAS_MASK 0x60 + +/* Earpiece/Speaker Control Register 2 (0xda) */ +#define REG_EAR2 0xda +#define RSYNC_CHANGE (1 << 2) + +/* Audio Supplies Register 2 (0xdc) */ +#define REG_SUPPLIES2 0xdc +#define LDO15_READY (1 << 4) +#define LDO15_EN (1 << 3) +#define CPUMP_READY (1 << 2) +#define CPUMP_EN (1 << 1) +#define AUDIO_EN (1 << 0) +#define SUPPLY_MASK (LDO15_EN | CPUMP_EN | AUDIO_EN) + +/* Audio Enable Register 1 (0xdd) */ +#define ADC_MOD_RIGHT (1 << 1) +#define ADC_MOD_LEFT (1 << 0) + +/* Audio Enable Register 2 (0xde) */ +#define ADC_LEFT (1 << 5) +#define ADC_RIGHT (1 << 4) + +/* DAC Enable Register 2 (0xe1) */ +#define DAC_LEFT (1 << 5) +#define DAC_RIGHT (1 << 4) +#define MODULATOR (1 << 3) + +/* Shorts Register (0xeb) */ +#define REG_SHORTS 0xeb +#define CLR_SHORT_LO2 (1 << 7) +#define SHORT_LO2 (1 << 6) +#define CLR_SHORT_LO1 (1 << 5) +#define SHORT_LO1 (1 << 4) +#define CLR_SHORT_HS2 (1 << 3) +#define SHORT_HS2 (1 << 2) +#define CLR_SHORT_HS1 (1 << 1) +#define SHORT_HS1 (1 << 0) + +/* + * This widget should be just after DAC & PGA in DAPM power-on sequence and + * before DAC & PGA in DAPM power-off sequence. + */ +#define PM860X_DAPM_OUTPUT(wname, wevent) \ +{ .id = snd_soc_dapm_pga, .name = wname, .reg = SND_SOC_NOPM, \ + .shift = 0, .invert = 0, .kcontrols = NULL, \ + .num_kcontrols = 0, .event = wevent, \ + .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD, } + +struct pm860x_det { + struct snd_soc_jack *hp_jack; + struct snd_soc_jack *mic_jack; + int hp_det; + int mic_det; + int hook_det; + int hs_shrt; + int lo_shrt; +}; + +struct pm860x_priv { + unsigned int sysclk; + unsigned int pcmclk; + unsigned int dir; + unsigned int filter; + struct snd_soc_codec *codec; + struct i2c_client *i2c; + struct pm860x_chip *chip; + struct pm860x_det det; + + int irq[4]; + unsigned char name[4][MAX_NAME_LEN]; + unsigned char reg_cache[REG_CACHE_SIZE]; +}; + +/* -9450dB to 0dB in 150dB steps ( mute instead of -9450dB) */ +static const DECLARE_TLV_DB_SCALE(dpga_tlv, -9450, 150, 1); + +/* -9dB to 0db in 3dB steps */ +static const DECLARE_TLV_DB_SCALE(adc_tlv, -900, 300, 0); + +/* {-23, -17, -13.5, -11, -9, -6, -3, 0}dB */ +static const unsigned int mic_tlv[] = { + TLV_DB_RANGE_HEAD(5), + 0, 0, TLV_DB_SCALE_ITEM(-2300, 0, 0), + 1, 1, TLV_DB_SCALE_ITEM(-1700, 0, 0), + 2, 2, TLV_DB_SCALE_ITEM(-1350, 0, 0), + 3, 3, TLV_DB_SCALE_ITEM(-1100, 0, 0), + 4, 7, TLV_DB_SCALE_ITEM(-900, 300, 0), +}; + +/* {0, 0, 0, -6, 0, 6, 12, 18}dB */ +static const unsigned int aux_tlv[] = { + TLV_DB_RANGE_HEAD(2), + 0, 2, TLV_DB_SCALE_ITEM(0, 0, 0), + 3, 7, TLV_DB_SCALE_ITEM(-600, 600, 0), +}; + +/* {-16, -13, -10, -7, -5.2, -3,3, -2.2, 0}dB, mute instead of -16dB */ +static const unsigned int out_tlv[] = { + TLV_DB_RANGE_HEAD(4), + 0, 3, TLV_DB_SCALE_ITEM(-1600, 300, 1), + 4, 4, TLV_DB_SCALE_ITEM(-520, 0, 0), + 5, 5, TLV_DB_SCALE_ITEM(-330, 0, 0), + 6, 7, TLV_DB_SCALE_ITEM(-220, 220, 0), +}; + +static const unsigned int st_tlv[] = { + TLV_DB_RANGE_HEAD(8), + 0, 1, TLV_DB_SCALE_ITEM(-12041, 602, 0), + 2, 3, TLV_DB_SCALE_ITEM(-11087, 250, 0), + 4, 5, TLV_DB_SCALE_ITEM(-10643, 158, 0), + 6, 7, TLV_DB_SCALE_ITEM(-10351, 116, 0), + 8, 9, TLV_DB_SCALE_ITEM(-10133, 92, 0), + 10, 13, TLV_DB_SCALE_ITEM(-9958, 70, 0), + 14, 17, TLV_DB_SCALE_ITEM(-9689, 53, 0), + 18, 271, TLV_DB_SCALE_ITEM(-9484, 37, 0), +}; + +/* Sidetone Gain = M * 2^(-5-N) */ +struct st_gain { + unsigned int db; + unsigned int m; + unsigned int n; +}; + +static struct st_gain st_table[] = { + {-12041, 1, 15}, {-11439, 1, 14}, {-11087, 3, 15}, {-10837, 1, 13}, + {-10643, 5, 15}, {-10485, 3, 14}, {-10351, 7, 15}, {-10235, 1, 12}, + {-10133, 9, 15}, {-10041, 5, 14}, { -9958, 11, 15}, { -9883, 3, 13}, + { -9813, 13, 15}, { -9749, 7, 14}, { -9689, 15, 15}, { -9633, 1, 11}, + { -9580, 17, 15}, { -9531, 9, 14}, { -9484, 19, 15}, { -9439, 5, 13}, + { -9397, 21, 15}, { -9356, 11, 14}, { -9318, 23, 15}, { -9281, 3, 12}, + { -9245, 25, 15}, { -9211, 13, 14}, { -9178, 27, 15}, { -9147, 7, 13}, + { -9116, 29, 15}, { -9087, 15, 14}, { -9058, 31, 15}, { -9031, 1, 10}, + { -8978, 17, 14}, { -8929, 9, 13}, { -8882, 19, 14}, { -8837, 5, 12}, + { -8795, 21, 14}, { -8754, 11, 13}, { -8716, 23, 14}, { -8679, 3, 11}, + { -8643, 25, 14}, { -8609, 13, 13}, { -8576, 27, 14}, { -8545, 7, 12}, + { -8514, 29, 14}, { -8485, 15, 13}, { -8456, 31, 14}, { -8429, 1, 9}, + { -8376, 17, 13}, { -8327, 9, 12}, { -8280, 19, 13}, { -8235, 5, 11}, + { -8193, 21, 13}, { -8152, 11, 12}, { -8114, 23, 13}, { -8077, 3, 10}, + { -8041, 25, 13}, { -8007, 13, 12}, { -7974, 27, 13}, { -7943, 7, 11}, + { -7912, 29, 13}, { -7883, 15, 12}, { -7854, 31, 13}, { -7827, 1, 8}, + { -7774, 17, 12}, { -7724, 9, 11}, { -7678, 19, 12}, { -7633, 5, 10}, + { -7591, 21, 12}, { -7550, 11, 11}, { -7512, 23, 12}, { -7475, 3, 9}, + { -7439, 25, 12}, { -7405, 13, 11}, { -7372, 27, 12}, { -7341, 7, 10}, + { -7310, 29, 12}, { -7281, 15, 11}, { -7252, 31, 12}, { -7225, 1, 7}, + { -7172, 17, 11}, { -7122, 9, 10}, { -7075, 19, 11}, { -7031, 5, 9}, + { -6989, 21, 11}, { -6948, 11, 10}, { -6910, 23, 11}, { -6873, 3, 8}, + { -6837, 25, 11}, { -6803, 13, 10}, { -6770, 27, 11}, { -6739, 7, 9}, + { -6708, 29, 11}, { -6679, 15, 10}, { -6650, 31, 11}, { -6623, 1, 6}, + { -6570, 17, 10}, { -6520, 9, 9}, { -6473, 19, 10}, { -6429, 5, 8}, + { -6386, 21, 10}, { -6346, 11, 9}, { -6307, 23, 10}, { -6270, 3, 7}, + { -6235, 25, 10}, { -6201, 13, 9}, { -6168, 27, 10}, { -6137, 7, 8}, + { -6106, 29, 10}, { -6077, 15, 9}, { -6048, 31, 10}, { -6021, 1, 5}, + { -5968, 17, 9}, { -5918, 9, 8}, { -5871, 19, 9}, { -5827, 5, 7}, + { -5784, 21, 9}, { -5744, 11, 8}, { -5705, 23, 9}, { -5668, 3, 6}, + { -5633, 25, 9}, { -5599, 13, 8}, { -5566, 27, 9}, { -5535, 7, 7}, + { -5504, 29, 9}, { -5475, 15, 8}, { -5446, 31, 9}, { -5419, 1, 4}, + { -5366, 17, 8}, { -5316, 9, 7}, { -5269, 19, 8}, { -5225, 5, 6}, + { -5182, 21, 8}, { -5142, 11, 7}, { -5103, 23, 8}, { -5066, 3, 5}, + { -5031, 25, 8}, { -4997, 13, 7}, { -4964, 27, 8}, { -4932, 7, 6}, + { -4902, 29, 8}, { -4873, 15, 7}, { -4844, 31, 8}, { -4816, 1, 3}, + { -4764, 17, 7}, { -4714, 9, 6}, { -4667, 19, 7}, { -4623, 5, 5}, + { -4580, 21, 7}, { -4540, 11, 6}, { -4501, 23, 7}, { -4464, 3, 4}, + { -4429, 25, 7}, { -4395, 13, 6}, { -4362, 27, 7}, { -4330, 7, 5}, + { -4300, 29, 7}, { -4270, 15, 6}, { -4242, 31, 7}, { -4214, 1, 2}, + { -4162, 17, 6}, { -4112, 9, 5}, { -4065, 19, 6}, { -4021, 5, 4}, + { -3978, 21, 6}, { -3938, 11, 5}, { -3899, 23, 6}, { -3862, 3, 3}, + { -3827, 25, 6}, { -3793, 13, 5}, { -3760, 27, 6}, { -3728, 7, 4}, + { -3698, 29, 6}, { -3668, 15, 5}, { -3640, 31, 6}, { -3612, 1, 1}, + { -3560, 17, 5}, { -3510, 9, 4}, { -3463, 19, 5}, { -3419, 5, 3}, + { -3376, 21, 5}, { -3336, 11, 4}, { -3297, 23, 5}, { -3260, 3, 2}, + { -3225, 25, 5}, { -3191, 13, 4}, { -3158, 27, 5}, { -3126, 7, 3}, + { -3096, 29, 5}, { -3066, 15, 4}, { -3038, 31, 5}, { -3010, 1, 0}, + { -2958, 17, 4}, { -2908, 9, 3}, { -2861, 19, 4}, { -2816, 5, 2}, + { -2774, 21, 4}, { -2734, 11, 3}, { -2695, 23, 4}, { -2658, 3, 1}, + { -2623, 25, 4}, { -2589, 13, 3}, { -2556, 27, 4}, { -2524, 7, 2}, + { -2494, 29, 4}, { -2464, 15, 3}, { -2436, 31, 4}, { -2408, 2, 0}, + { -2356, 17, 3}, { -2306, 9, 2}, { -2259, 19, 3}, { -2214, 5, 1}, + { -2172, 21, 3}, { -2132, 11, 2}, { -2093, 23, 3}, { -2056, 3, 0}, + { -2021, 25, 3}, { -1987, 13, 2}, { -1954, 27, 3}, { -1922, 7, 1}, + { -1892, 29, 3}, { -1862, 15, 2}, { -1834, 31, 3}, { -1806, 4, 0}, + { -1754, 17, 2}, { -1704, 9, 1}, { -1657, 19, 2}, { -1612, 5, 0}, + { -1570, 21, 2}, { -1530, 11, 1}, { -1491, 23, 2}, { -1454, 6, 0}, + { -1419, 25, 2}, { -1384, 13, 1}, { -1352, 27, 2}, { -1320, 7, 0}, + { -1290, 29, 2}, { -1260, 15, 1}, { -1232, 31, 2}, { -1204, 8, 0}, + { -1151, 17, 1}, { -1102, 9, 0}, { -1055, 19, 1}, { -1010, 10, 0}, + { -968, 21, 1}, { -928, 11, 0}, { -889, 23, 1}, { -852, 12, 0}, + { -816, 25, 1}, { -782, 13, 0}, { -750, 27, 1}, { -718, 14, 0}, + { -688, 29, 1}, { -658, 15, 0}, { -630, 31, 1}, { -602, 16, 0}, + { -549, 17, 0}, { -500, 18, 0}, { -453, 19, 0}, { -408, 20, 0}, + { -366, 21, 0}, { -325, 22, 0}, { -287, 23, 0}, { -250, 24, 0}, + { -214, 25, 0}, { -180, 26, 0}, { -148, 27, 0}, { -116, 28, 0}, + { -86, 29, 0}, { -56, 30, 0}, { -28, 31, 0}, { 0, 0, 0}, +}; + +static int pm860x_volatile(unsigned int reg) +{ + BUG_ON(reg >= REG_CACHE_SIZE); + + switch (reg) { + case PM860X_AUDIO_SUPPLIES_2: + return 1; + } + + return 0; +} + +static unsigned int pm860x_read_reg_cache(struct snd_soc_codec *codec, + unsigned int reg) +{ + unsigned char *cache = codec->reg_cache; + + BUG_ON(reg >= REG_CACHE_SIZE); + + if (pm860x_volatile(reg)) + return cache[reg]; + + reg += REG_CACHE_BASE; + + return pm860x_reg_read(codec->control_data, reg); +} + +static int pm860x_write_reg_cache(struct snd_soc_codec *codec, + unsigned int reg, unsigned int value) +{ + unsigned char *cache = codec->reg_cache; + + BUG_ON(reg >= REG_CACHE_SIZE); + + if (!pm860x_volatile(reg)) + cache[reg] = (unsigned char)value; + + reg += REG_CACHE_BASE; + + return pm860x_reg_write(codec->control_data, reg, value); +} + +static int snd_soc_get_volsw_2r_st(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + unsigned int reg = mc->reg; + unsigned int reg2 = mc->rreg; + int val[2], val2[2], i; + + val[0] = snd_soc_read(codec, reg) & 0x3f; + val[1] = (snd_soc_read(codec, PM860X_SIDETONE_SHIFT) >> 4) & 0xf; + val2[0] = snd_soc_read(codec, reg2) & 0x3f; + val2[1] = (snd_soc_read(codec, PM860X_SIDETONE_SHIFT)) & 0xf; + + for (i = 0; i < ARRAY_SIZE(st_table); i++) { + if ((st_table[i].m == val[0]) && (st_table[i].n == val[1])) + ucontrol->value.integer.value[0] = i; + if ((st_table[i].m == val2[0]) && (st_table[i].n == val2[1])) + ucontrol->value.integer.value[1] = i; + } + return 0; +} + +static int snd_soc_put_volsw_2r_st(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + unsigned int reg = mc->reg; + unsigned int reg2 = mc->rreg; + int err; + unsigned int val, val2; + + val = ucontrol->value.integer.value[0]; + val2 = ucontrol->value.integer.value[1]; + + err = snd_soc_update_bits(codec, reg, 0x3f, st_table[val].m); + if (err < 0) + return err; + err = snd_soc_update_bits(codec, PM860X_SIDETONE_SHIFT, 0xf0, + st_table[val].n << 4); + if (err < 0) + return err; + + err = snd_soc_update_bits(codec, reg2, 0x3f, st_table[val2].m); + if (err < 0) + return err; + err = snd_soc_update_bits(codec, PM860X_SIDETONE_SHIFT, 0x0f, + st_table[val2].n); + return err; +} + +static int snd_soc_get_volsw_2r_out(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + unsigned int reg = mc->reg; + unsigned int reg2 = mc->rreg; + unsigned int shift = mc->shift; + int max = mc->max, val, val2; + unsigned int mask = (1 << fls(max)) - 1; + + val = snd_soc_read(codec, reg) >> shift; + val2 = snd_soc_read(codec, reg2) >> shift; + ucontrol->value.integer.value[0] = (max - val) & mask; + ucontrol->value.integer.value[1] = (max - val2) & mask; + + return 0; +} + +static int snd_soc_put_volsw_2r_out(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + unsigned int reg = mc->reg; + unsigned int reg2 = mc->rreg; + unsigned int shift = mc->shift; + int max = mc->max; + unsigned int mask = (1 << fls(max)) - 1; + int err; + unsigned int val, val2, val_mask; + + val_mask = mask << shift; + val = ((max - ucontrol->value.integer.value[0]) & mask); + val2 = ((max - ucontrol->value.integer.value[1]) & mask); + + val = val << shift; + val2 = val2 << shift; + + err = snd_soc_update_bits(codec, reg, val_mask, val); + if (err < 0) + return err; + + err = snd_soc_update_bits(codec, reg2, val_mask, val2); + return err; +} + +/* DAPM Widget Events */ +/* + * A lot registers are belong to RSYNC domain. It requires enabling RSYNC bit + * after updating these registers. Otherwise, these updated registers won't + * be effective. + */ +static int pm860x_rsync_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = w->codec; + + /* + * In order to avoid current on the load, mute power-on and power-off + * should be transients. + * Unmute by DAC_MUTE. It should be unmuted when DAPM sequence is + * finished. + */ + snd_soc_update_bits(codec, PM860X_DAC_OFFSET, DAC_MUTE, 0); + snd_soc_update_bits(codec, PM860X_EAR_CTRL_2, + RSYNC_CHANGE, RSYNC_CHANGE); + return 0; +} + +static int pm860x_dac_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = w->codec; + unsigned int dac = 0; + int data; + + if (!strcmp(w->name, "Left DAC")) + dac = DAC_LEFT; + if (!strcmp(w->name, "Right DAC")) + dac = DAC_RIGHT; + switch (event) { + case SND_SOC_DAPM_PRE_PMU: + if (dac) { + /* Auto mute in power-on sequence. */ + dac |= MODULATOR; + snd_soc_update_bits(codec, PM860X_DAC_OFFSET, + DAC_MUTE, DAC_MUTE); + snd_soc_update_bits(codec, PM860X_EAR_CTRL_2, + RSYNC_CHANGE, RSYNC_CHANGE); + /* update dac */ + snd_soc_update_bits(codec, PM860X_DAC_EN_2, + dac, dac); + } + break; + case SND_SOC_DAPM_PRE_PMD: + if (dac) { + /* Auto mute in power-off sequence. */ + snd_soc_update_bits(codec, PM860X_DAC_OFFSET, + DAC_MUTE, DAC_MUTE); + snd_soc_update_bits(codec, PM860X_EAR_CTRL_2, + RSYNC_CHANGE, RSYNC_CHANGE); + /* update dac */ + data = snd_soc_read(codec, PM860X_DAC_EN_2); + data &= ~dac; + if (!(data & (DAC_LEFT | DAC_RIGHT))) + data &= ~MODULATOR; + snd_soc_write(codec, PM860X_DAC_EN_2, data); + } + break; + } + return 0; +} + +static const char *pm860x_opamp_texts[] = {"-50%", "-25%", "0%", "75%"}; + +static const char *pm860x_pa_texts[] = {"-33%", "0%", "33%", "66%"}; + +static const struct soc_enum pm860x_hs1_opamp_enum = + SOC_ENUM_SINGLE(PM860X_HS1_CTRL, 5, 4, pm860x_opamp_texts); + +static const struct soc_enum pm860x_hs2_opamp_enum = + SOC_ENUM_SINGLE(PM860X_HS2_CTRL, 5, 4, pm860x_opamp_texts); + +static const struct soc_enum pm860x_hs1_pa_enum = + SOC_ENUM_SINGLE(PM860X_HS1_CTRL, 3, 4, pm860x_pa_texts); + +static const struct soc_enum pm860x_hs2_pa_enum = + SOC_ENUM_SINGLE(PM860X_HS2_CTRL, 3, 4, pm860x_pa_texts); + +static const struct soc_enum pm860x_lo1_opamp_enum = + SOC_ENUM_SINGLE(PM860X_LO1_CTRL, 5, 4, pm860x_opamp_texts); + +static const struct soc_enum pm860x_lo2_opamp_enum = + SOC_ENUM_SINGLE(PM860X_LO2_CTRL, 5, 4, pm860x_opamp_texts); + +static const struct soc_enum pm860x_lo1_pa_enum = + SOC_ENUM_SINGLE(PM860X_LO1_CTRL, 3, 4, pm860x_pa_texts); + +static const struct soc_enum pm860x_lo2_pa_enum = + SOC_ENUM_SINGLE(PM860X_LO2_CTRL, 3, 4, pm860x_pa_texts); + +static const struct soc_enum pm860x_spk_pa_enum = + SOC_ENUM_SINGLE(PM860X_EAR_CTRL_1, 5, 4, pm860x_pa_texts); + +static const struct soc_enum pm860x_ear_pa_enum = + SOC_ENUM_SINGLE(PM860X_EAR_CTRL_2, 0, 4, pm860x_pa_texts); + +static const struct soc_enum pm860x_spk_ear_opamp_enum = + SOC_ENUM_SINGLE(PM860X_EAR_CTRL_1, 3, 4, pm860x_opamp_texts); + +static const struct snd_kcontrol_new pm860x_snd_controls[] = { + SOC_DOUBLE_R_TLV("ADC Capture Volume", PM860X_ADC_ANA_2, + PM860X_ADC_ANA_3, 6, 3, 0, adc_tlv), + SOC_DOUBLE_TLV("AUX Capture Volume", PM860X_ADC_ANA_3, 0, 3, 7, 0, + aux_tlv), + SOC_SINGLE_TLV("MIC1 Capture Volume", PM860X_ADC_ANA_2, 0, 7, 0, + mic_tlv), + SOC_SINGLE_TLV("MIC3 Capture Volume", PM860X_ADC_ANA_2, 3, 7, 0, + mic_tlv), + SOC_DOUBLE_R_EXT_TLV("Sidetone Volume", PM860X_SIDETONE_L_GAIN, + PM860X_SIDETONE_R_GAIN, 0, ARRAY_SIZE(st_table)-1, + 0, snd_soc_get_volsw_2r_st, + snd_soc_put_volsw_2r_st, st_tlv), + SOC_SINGLE_TLV("Speaker Playback Volume", PM860X_EAR_CTRL_1, + 0, 7, 0, out_tlv), + SOC_DOUBLE_R_TLV("Line Playback Volume", PM860X_LO1_CTRL, + PM860X_LO2_CTRL, 0, 7, 0, out_tlv), + SOC_DOUBLE_R_TLV("Headset Playback Volume", PM860X_HS1_CTRL, + PM860X_HS2_CTRL, 0, 7, 0, out_tlv), + SOC_DOUBLE_R_EXT_TLV("Hifi Left Playback Volume", + PM860X_HIFIL_GAIN_LEFT, + PM860X_HIFIL_GAIN_RIGHT, 0, 63, 0, + snd_soc_get_volsw_2r_out, + snd_soc_put_volsw_2r_out, dpga_tlv), + SOC_DOUBLE_R_EXT_TLV("Hifi Right Playback Volume", + PM860X_HIFIR_GAIN_LEFT, + PM860X_HIFIR_GAIN_RIGHT, 0, 63, 0, + snd_soc_get_volsw_2r_out, + snd_soc_put_volsw_2r_out, dpga_tlv), + SOC_DOUBLE_R_EXT_TLV("Lofi Playback Volume", PM860X_LOFI_GAIN_LEFT, + PM860X_LOFI_GAIN_RIGHT, 0, 63, 0, + snd_soc_get_volsw_2r_out, + snd_soc_put_volsw_2r_out, dpga_tlv), + SOC_ENUM("Headset1 Operational Amplifier Current", + pm860x_hs1_opamp_enum), + SOC_ENUM("Headset2 Operational Amplifier Current", + pm860x_hs2_opamp_enum), + SOC_ENUM("Headset1 Amplifier Current", pm860x_hs1_pa_enum), + SOC_ENUM("Headset2 Amplifier Current", pm860x_hs2_pa_enum), + SOC_ENUM("Lineout1 Operational Amplifier Current", + pm860x_lo1_opamp_enum), + SOC_ENUM("Lineout2 Operational Amplifier Current", + pm860x_lo2_opamp_enum), + SOC_ENUM("Lineout1 Amplifier Current", pm860x_lo1_pa_enum), + SOC_ENUM("Lineout2 Amplifier Current", pm860x_lo2_pa_enum), + SOC_ENUM("Speaker Operational Amplifier Current", + pm860x_spk_ear_opamp_enum), + SOC_ENUM("Speaker Amplifier Current", pm860x_spk_pa_enum), + SOC_ENUM("Earpiece Amplifier Current", pm860x_ear_pa_enum), +}; + +/* + * DAPM Controls + */ + +/* PCM Switch / PCM Interface */ +static const struct snd_kcontrol_new pcm_switch_controls = + SOC_DAPM_SINGLE("Switch", PM860X_ADC_EN_2, 0, 1, 0); + +/* AUX1 Switch */ +static const struct snd_kcontrol_new aux1_switch_controls = + SOC_DAPM_SINGLE("Switch", PM860X_ANA_TO_ANA, 4, 1, 0); + +/* AUX2 Switch */ +static const struct snd_kcontrol_new aux2_switch_controls = + SOC_DAPM_SINGLE("Switch", PM860X_ANA_TO_ANA, 5, 1, 0); + +/* Left Ex. PA Switch */ +static const struct snd_kcontrol_new lepa_switch_controls = + SOC_DAPM_SINGLE("Switch", PM860X_DAC_EN_2, 2, 1, 0); + +/* Right Ex. PA Switch */ +static const struct snd_kcontrol_new repa_switch_controls = + SOC_DAPM_SINGLE("Switch", PM860X_DAC_EN_2, 1, 1, 0); + +/* PCM Mux / Mux7 */ +static const char *aif1_text[] = { + "PCM L", "PCM R", +}; + +static const struct soc_enum aif1_enum = + SOC_ENUM_SINGLE(PM860X_PCM_IFACE_3, 6, 2, aif1_text); + +static const struct snd_kcontrol_new aif1_mux = + SOC_DAPM_ENUM("PCM Mux", aif1_enum); + +/* I2S Mux / Mux9 */ +static const char *i2s_din_text[] = { + "DIN", "DIN1", +}; + +static const struct soc_enum i2s_din_enum = + SOC_ENUM_SINGLE(PM860X_I2S_IFACE_3, 1, 2, i2s_din_text); + +static const struct snd_kcontrol_new i2s_din_mux = + SOC_DAPM_ENUM("I2S DIN Mux", i2s_din_enum); + +/* I2S Mic Mux / Mux8 */ +static const char *i2s_mic_text[] = { + "Ex PA", "ADC", +}; + +static const struct soc_enum i2s_mic_enum = + SOC_ENUM_SINGLE(PM860X_I2S_IFACE_3, 4, 2, i2s_mic_text); + +static const struct snd_kcontrol_new i2s_mic_mux = + SOC_DAPM_ENUM("I2S Mic Mux", i2s_mic_enum); + +/* ADCL Mux / Mux2 */ +static const char *adcl_text[] = { + "ADCR", "ADCL", +}; + +static const struct soc_enum adcl_enum = + SOC_ENUM_SINGLE(PM860X_PCM_IFACE_3, 4, 2, adcl_text); + +static const struct snd_kcontrol_new adcl_mux = + SOC_DAPM_ENUM("ADC Left Mux", adcl_enum); + +/* ADCR Mux / Mux3 */ +static const char *adcr_text[] = { + "ADCL", "ADCR", +}; + +static const struct soc_enum adcr_enum = + SOC_ENUM_SINGLE(PM860X_PCM_IFACE_3, 2, 2, adcr_text); + +static const struct snd_kcontrol_new adcr_mux = + SOC_DAPM_ENUM("ADC Right Mux", adcr_enum); + +/* ADCR EC Mux / Mux6 */ +static const char *adcr_ec_text[] = { + "ADCR", "EC", +}; + +static const struct soc_enum adcr_ec_enum = + SOC_ENUM_SINGLE(PM860X_ADC_EN_2, 3, 2, adcr_ec_text); + +static const struct snd_kcontrol_new adcr_ec_mux = + SOC_DAPM_ENUM("ADCR EC Mux", adcr_ec_enum); + +/* EC Mux / Mux4 */ +static const char *ec_text[] = { + "Left", "Right", "Left + Right", +}; + +static const struct soc_enum ec_enum = + SOC_ENUM_SINGLE(PM860X_EC_PATH, 1, 3, ec_text); + +static const struct snd_kcontrol_new ec_mux = + SOC_DAPM_ENUM("EC Mux", ec_enum); + +static const char *dac_text[] = { + "No input", "Right", "Left", "No input", +}; + +/* DAC Headset 1 Mux / Mux10 */ +static const struct soc_enum dac_hs1_enum = + SOC_ENUM_SINGLE(PM860X_ANA_INPUT_SEL_1, 0, 4, dac_text); + +static const struct snd_kcontrol_new dac_hs1_mux = + SOC_DAPM_ENUM("DAC HS1 Mux", dac_hs1_enum); + +/* DAC Headset 2 Mux / Mux11 */ +static const struct soc_enum dac_hs2_enum = + SOC_ENUM_SINGLE(PM860X_ANA_INPUT_SEL_1, 2, 4, dac_text); + +static const struct snd_kcontrol_new dac_hs2_mux = + SOC_DAPM_ENUM("DAC HS2 Mux", dac_hs2_enum); + +/* DAC Lineout 1 Mux / Mux12 */ +static const struct soc_enum dac_lo1_enum = + SOC_ENUM_SINGLE(PM860X_ANA_INPUT_SEL_1, 4, 4, dac_text); + +static const struct snd_kcontrol_new dac_lo1_mux = + SOC_DAPM_ENUM("DAC LO1 Mux", dac_lo1_enum); + +/* DAC Lineout 2 Mux / Mux13 */ +static const struct soc_enum dac_lo2_enum = + SOC_ENUM_SINGLE(PM860X_ANA_INPUT_SEL_1, 6, 4, dac_text); + +static const struct snd_kcontrol_new dac_lo2_mux = + SOC_DAPM_ENUM("DAC LO2 Mux", dac_lo2_enum); + +/* DAC Spearker Earphone Mux / Mux14 */ +static const struct soc_enum dac_spk_ear_enum = + SOC_ENUM_SINGLE(PM860X_ANA_INPUT_SEL_2, 0, 4, dac_text); + +static const struct snd_kcontrol_new dac_spk_ear_mux = + SOC_DAPM_ENUM("DAC SP Mux", dac_spk_ear_enum); + +/* Headset 1 Mux / Mux15 */ +static const char *in_text[] = { + "Digital", "Analog", +}; + +static const struct soc_enum hs1_enum = + SOC_ENUM_SINGLE(PM860X_ANA_TO_ANA, 0, 2, in_text); + +static const struct snd_kcontrol_new hs1_mux = + SOC_DAPM_ENUM("Headset1 Mux", hs1_enum); + +/* Headset 2 Mux / Mux16 */ +static const struct soc_enum hs2_enum = + SOC_ENUM_SINGLE(PM860X_ANA_TO_ANA, 1, 2, in_text); + +static const struct snd_kcontrol_new hs2_mux = + SOC_DAPM_ENUM("Headset2 Mux", hs2_enum); + +/* Lineout 1 Mux / Mux17 */ +static const struct soc_enum lo1_enum = + SOC_ENUM_SINGLE(PM860X_ANA_TO_ANA, 2, 2, in_text); + +static const struct snd_kcontrol_new lo1_mux = + SOC_DAPM_ENUM("Lineout1 Mux", lo1_enum); + +/* Lineout 2 Mux / Mux18 */ +static const struct soc_enum lo2_enum = + SOC_ENUM_SINGLE(PM860X_ANA_TO_ANA, 3, 2, in_text); + +static const struct snd_kcontrol_new lo2_mux = + SOC_DAPM_ENUM("Lineout2 Mux", lo2_enum); + +/* Speaker Earpiece Demux */ +static const char *spk_text[] = { + "Earpiece", "Speaker", +}; + +static const struct soc_enum spk_enum = + SOC_ENUM_SINGLE(PM860X_ANA_TO_ANA, 6, 2, spk_text); + +static const struct snd_kcontrol_new spk_demux = + SOC_DAPM_ENUM("Speaker Earpiece Demux", spk_enum); + +/* MIC Mux / Mux1 */ +static const char *mic_text[] = { + "Mic 1", "Mic 2", +}; + +static const struct soc_enum mic_enum = + SOC_ENUM_SINGLE(PM860X_ADC_ANA_4, 4, 2, mic_text); + +static const struct snd_kcontrol_new mic_mux = + SOC_DAPM_ENUM("MIC Mux", mic_enum); + +static const struct snd_soc_dapm_widget pm860x_dapm_widgets[] = { + SND_SOC_DAPM_AIF_IN("PCM SDI", "PCM Playback", 0, + PM860X_ADC_EN_2, 0, 0), + SND_SOC_DAPM_AIF_OUT("PCM SDO", "PCM Capture", 0, + PM860X_PCM_IFACE_3, 1, 1), + + + SND_SOC_DAPM_AIF_IN("I2S DIN", "I2S Playback", 0, + PM860X_DAC_EN_2, 0, 0), + SND_SOC_DAPM_AIF_IN("I2S DIN1", "I2S Playback", 0, + PM860X_DAC_EN_2, 0, 0), + SND_SOC_DAPM_AIF_OUT("I2S DOUT", "I2S Capture", 0, + PM860X_I2S_IFACE_3, 5, 1), + SND_SOC_DAPM_MUX("I2S Mic Mux", SND_SOC_NOPM, 0, 0, &i2s_mic_mux), + SND_SOC_DAPM_MUX("ADC Left Mux", SND_SOC_NOPM, 0, 0, &adcl_mux), + SND_SOC_DAPM_MUX("ADC Right Mux", SND_SOC_NOPM, 0, 0, &adcr_mux), + SND_SOC_DAPM_MUX("EC Mux", SND_SOC_NOPM, 0, 0, &ec_mux), + SND_SOC_DAPM_MUX("ADCR EC Mux", SND_SOC_NOPM, 0, 0, &adcr_ec_mux), + SND_SOC_DAPM_SWITCH("Left EPA", SND_SOC_NOPM, 0, 0, + &lepa_switch_controls), + SND_SOC_DAPM_SWITCH("Right EPA", SND_SOC_NOPM, 0, 0, + &repa_switch_controls), + + SND_SOC_DAPM_REG(snd_soc_dapm_supply, "Left ADC MOD", PM860X_ADC_EN_1, + 0, 1, 1, 0), + SND_SOC_DAPM_REG(snd_soc_dapm_supply, "Right ADC MOD", PM860X_ADC_EN_1, + 1, 1, 1, 0), + SND_SOC_DAPM_ADC("Left ADC", NULL, PM860X_ADC_EN_2, 5, 0), + SND_SOC_DAPM_ADC("Right ADC", NULL, PM860X_ADC_EN_2, 4, 0), + + SND_SOC_DAPM_SWITCH("AUX1 Switch", SND_SOC_NOPM, 0, 0, + &aux1_switch_controls), + SND_SOC_DAPM_SWITCH("AUX2 Switch", SND_SOC_NOPM, 0, 0, + &aux2_switch_controls), + + SND_SOC_DAPM_MUX("MIC Mux", SND_SOC_NOPM, 0, 0, &mic_mux), + SND_SOC_DAPM_MICBIAS("Mic1 Bias", PM860X_ADC_ANA_1, 2, 0), + SND_SOC_DAPM_MICBIAS("Mic3 Bias", PM860X_ADC_ANA_1, 7, 0), + SND_SOC_DAPM_PGA("MIC1 Volume", PM860X_ADC_EN_1, 2, 0, NULL, 0), + SND_SOC_DAPM_PGA("MIC3 Volume", PM860X_ADC_EN_1, 3, 0, NULL, 0), + SND_SOC_DAPM_PGA("AUX1 Volume", PM860X_ADC_EN_1, 4, 0, NULL, 0), + SND_SOC_DAPM_PGA("AUX2 Volume", PM860X_ADC_EN_1, 5, 0, NULL, 0), + SND_SOC_DAPM_PGA("Sidetone PGA", PM860X_ADC_EN_2, 1, 0, NULL, 0), + SND_SOC_DAPM_PGA("Lofi PGA", PM860X_ADC_EN_2, 2, 0, NULL, 0), + + SND_SOC_DAPM_INPUT("AUX1"), + SND_SOC_DAPM_INPUT("AUX2"), + SND_SOC_DAPM_INPUT("MIC1P"), + SND_SOC_DAPM_INPUT("MIC1N"), + SND_SOC_DAPM_INPUT("MIC2P"), + SND_SOC_DAPM_INPUT("MIC2N"), + SND_SOC_DAPM_INPUT("MIC3P"), + SND_SOC_DAPM_INPUT("MIC3N"), + + SND_SOC_DAPM_DAC_E("Left DAC", NULL, SND_SOC_NOPM, 0, 0, + pm860x_dac_event, + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), + SND_SOC_DAPM_DAC_E("Right DAC", NULL, SND_SOC_NOPM, 0, 0, + pm860x_dac_event, + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), + + SND_SOC_DAPM_MUX("I2S DIN Mux", SND_SOC_NOPM, 0, 0, &i2s_din_mux), + SND_SOC_DAPM_MUX("DAC HS1 Mux", SND_SOC_NOPM, 0, 0, &dac_hs1_mux), + SND_SOC_DAPM_MUX("DAC HS2 Mux", SND_SOC_NOPM, 0, 0, &dac_hs2_mux), + SND_SOC_DAPM_MUX("DAC LO1 Mux", SND_SOC_NOPM, 0, 0, &dac_lo1_mux), + SND_SOC_DAPM_MUX("DAC LO2 Mux", SND_SOC_NOPM, 0, 0, &dac_lo2_mux), + SND_SOC_DAPM_MUX("DAC SP Mux", SND_SOC_NOPM, 0, 0, &dac_spk_ear_mux), + SND_SOC_DAPM_MUX("Headset1 Mux", SND_SOC_NOPM, 0, 0, &hs1_mux), + SND_SOC_DAPM_MUX("Headset2 Mux", SND_SOC_NOPM, 0, 0, &hs2_mux), + SND_SOC_DAPM_MUX("Lineout1 Mux", SND_SOC_NOPM, 0, 0, &lo1_mux), + SND_SOC_DAPM_MUX("Lineout2 Mux", SND_SOC_NOPM, 0, 0, &lo2_mux), + SND_SOC_DAPM_MUX("Speaker Earpiece Demux", SND_SOC_NOPM, 0, 0, + &spk_demux), + + + SND_SOC_DAPM_PGA("Headset1 PGA", PM860X_DAC_EN_1, 0, 0, NULL, 0), + SND_SOC_DAPM_PGA("Headset2 PGA", PM860X_DAC_EN_1, 1, 0, NULL, 0), + SND_SOC_DAPM_OUTPUT("HS1"), + SND_SOC_DAPM_OUTPUT("HS2"), + SND_SOC_DAPM_PGA("Lineout1 PGA", PM860X_DAC_EN_1, 2, 0, NULL, 0), + SND_SOC_DAPM_PGA("Lineout2 PGA", PM860X_DAC_EN_1, 3, 0, NULL, 0), + SND_SOC_DAPM_OUTPUT("LINEOUT1"), + SND_SOC_DAPM_OUTPUT("LINEOUT2"), + SND_SOC_DAPM_PGA("Earpiece PGA", PM860X_DAC_EN_1, 4, 0, NULL, 0), + SND_SOC_DAPM_OUTPUT("EARP"), + SND_SOC_DAPM_OUTPUT("EARN"), + SND_SOC_DAPM_PGA("Speaker PGA", PM860X_DAC_EN_1, 5, 0, NULL, 0), + SND_SOC_DAPM_OUTPUT("LSP"), + SND_SOC_DAPM_OUTPUT("LSN"), + SND_SOC_DAPM_REG(snd_soc_dapm_supply, "VCODEC", PM860X_AUDIO_SUPPLIES_2, + 0, SUPPLY_MASK, SUPPLY_MASK, 0), + + PM860X_DAPM_OUTPUT("RSYNC", pm860x_rsync_event), +}; + +static const struct snd_soc_dapm_route audio_map[] = { + /* supply */ + {"Left DAC", NULL, "VCODEC"}, + {"Right DAC", NULL, "VCODEC"}, + {"Left ADC", NULL, "VCODEC"}, + {"Right ADC", NULL, "VCODEC"}, + {"Left ADC", NULL, "Left ADC MOD"}, + {"Right ADC", NULL, "Right ADC MOD"}, + + /* PCM/AIF1 Inputs */ + {"PCM SDO", NULL, "ADC Left Mux"}, + {"PCM SDO", NULL, "ADCR EC Mux"}, + + /* PCM/AFI2 Outputs */ + {"Lofi PGA", NULL, "PCM SDI"}, + {"Lofi PGA", NULL, "Sidetone PGA"}, + {"Left DAC", NULL, "Lofi PGA"}, + {"Right DAC", NULL, "Lofi PGA"}, + + /* I2S/AIF2 Inputs */ + {"MIC Mux", "Mic 1", "MIC1P"}, + {"MIC Mux", "Mic 1", "MIC1N"}, + {"MIC Mux", "Mic 2", "MIC2P"}, + {"MIC Mux", "Mic 2", "MIC2N"}, + {"MIC1 Volume", NULL, "MIC Mux"}, + {"MIC3 Volume", NULL, "MIC3P"}, + {"MIC3 Volume", NULL, "MIC3N"}, + {"Left ADC", NULL, "MIC1 Volume"}, + {"Right ADC", NULL, "MIC3 Volume"}, + {"ADC Left Mux", "ADCR", "Right ADC"}, + {"ADC Left Mux", "ADCL", "Left ADC"}, + {"ADC Right Mux", "ADCL", "Left ADC"}, + {"ADC Right Mux", "ADCR", "Right ADC"}, + {"Left EPA", "Switch", "Left DAC"}, + {"Right EPA", "Switch", "Right DAC"}, + {"EC Mux", "Left", "Left DAC"}, + {"EC Mux", "Right", "Right DAC"}, + {"EC Mux", "Left + Right", "Left DAC"}, + {"EC Mux", "Left + Right", "Right DAC"}, + {"ADCR EC Mux", "ADCR", "ADC Right Mux"}, + {"ADCR EC Mux", "EC", "EC Mux"}, + {"I2S Mic Mux", "Ex PA", "Left EPA"}, + {"I2S Mic Mux", "Ex PA", "Right EPA"}, + {"I2S Mic Mux", "ADC", "ADC Left Mux"}, + {"I2S Mic Mux", "ADC", "ADCR EC Mux"}, + {"I2S DOUT", NULL, "I2S Mic Mux"}, + + /* I2S/AIF2 Outputs */ + {"I2S DIN Mux", "DIN", "I2S DIN"}, + {"I2S DIN Mux", "DIN1", "I2S DIN1"}, + {"Left DAC", NULL, "I2S DIN Mux"}, + {"Right DAC", NULL, "I2S DIN Mux"}, + {"DAC HS1 Mux", "Left", "Left DAC"}, + {"DAC HS1 Mux", "Right", "Right DAC"}, + {"DAC HS2 Mux", "Left", "Left DAC"}, + {"DAC HS2 Mux", "Right", "Right DAC"}, + {"DAC LO1 Mux", "Left", "Left DAC"}, + {"DAC LO1 Mux", "Right", "Right DAC"}, + {"DAC LO2 Mux", "Left", "Left DAC"}, + {"DAC LO2 Mux", "Right", "Right DAC"}, + {"Headset1 Mux", "Digital", "DAC HS1 Mux"}, + {"Headset2 Mux", "Digital", "DAC HS2 Mux"}, + {"Lineout1 Mux", "Digital", "DAC LO1 Mux"}, + {"Lineout2 Mux", "Digital", "DAC LO2 Mux"}, + {"Headset1 PGA", NULL, "Headset1 Mux"}, + {"Headset2 PGA", NULL, "Headset2 Mux"}, + {"Lineout1 PGA", NULL, "Lineout1 Mux"}, + {"Lineout2 PGA", NULL, "Lineout2 Mux"}, + {"DAC SP Mux", "Left", "Left DAC"}, + {"DAC SP Mux", "Right", "Right DAC"}, + {"Speaker Earpiece Demux", "Speaker", "DAC SP Mux"}, + {"Speaker PGA", NULL, "Speaker Earpiece Demux"}, + {"Earpiece PGA", NULL, "Speaker Earpiece Demux"}, + + {"RSYNC", NULL, "Headset1 PGA"}, + {"RSYNC", NULL, "Headset2 PGA"}, + {"RSYNC", NULL, "Lineout1 PGA"}, + {"RSYNC", NULL, "Lineout2 PGA"}, + {"RSYNC", NULL, "Speaker PGA"}, + {"RSYNC", NULL, "Speaker PGA"}, + {"RSYNC", NULL, "Earpiece PGA"}, + {"RSYNC", NULL, "Earpiece PGA"}, + + {"HS1", NULL, "RSYNC"}, + {"HS2", NULL, "RSYNC"}, + {"LINEOUT1", NULL, "RSYNC"}, + {"LINEOUT2", NULL, "RSYNC"}, + {"LSP", NULL, "RSYNC"}, + {"LSN", NULL, "RSYNC"}, + {"EARP", NULL, "RSYNC"}, + {"EARN", NULL, "RSYNC"}, +}; + +/* + * Use MUTE_LEFT & MUTE_RIGHT to implement digital mute. + * These bits can also be used to mute. + */ +static int pm860x_digital_mute(struct snd_soc_dai *codec_dai, int mute) +{ + struct snd_soc_codec *codec = codec_dai->codec; + int data = 0, mask = MUTE_LEFT | MUTE_RIGHT; + + if (mute) + data = mask; + snd_soc_update_bits(codec, PM860X_DAC_OFFSET, mask, data); + snd_soc_update_bits(codec, PM860X_EAR_CTRL_2, + RSYNC_CHANGE, RSYNC_CHANGE); + return 0; +} + +static int pm860x_pcm_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; + unsigned char inf = 0, mask = 0; + + /* bit size */ + switch (params_format(params)) { + case SNDRV_PCM_FORMAT_S16_LE: + inf &= ~PCM_INF2_18WL; + break; + case SNDRV_PCM_FORMAT_S18_3LE: + inf |= PCM_INF2_18WL; + break; + default: + return -EINVAL; + } + mask |= PCM_INF2_18WL; + snd_soc_update_bits(codec, PM860X_PCM_IFACE_2, mask, inf); + + /* sample rate */ + switch (params_rate(params)) { + case 8000: + inf = 0; + break; + case 16000: + inf = 3; + break; + case 32000: + inf = 6; + break; + case 48000: + inf = 8; + break; + default: + return -EINVAL; + } + snd_soc_update_bits(codec, PM860X_PCM_RATE, 0x0f, inf); + + return 0; +} + +static int pm860x_pcm_set_dai_fmt(struct snd_soc_dai *codec_dai, + unsigned int fmt) +{ + struct snd_soc_codec *codec = codec_dai->codec; + struct pm860x_priv *pm860x = snd_soc_codec_get_drvdata(codec); + unsigned char inf = 0, mask = 0; + int ret = -EINVAL; + + mask |= PCM_INF2_BCLK | PCM_INF2_FS | PCM_INF2_MASTER; + + /* set master/slave audio interface */ + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBM_CFM: + case SND_SOC_DAIFMT_CBM_CFS: + if (pm860x->dir == PM860X_CLK_DIR_OUT) { + inf |= PCM_INF2_MASTER; + ret = 0; + } + break; + case SND_SOC_DAIFMT_CBS_CFS: + if (pm860x->dir == PM860X_CLK_DIR_IN) { + inf &= ~PCM_INF2_MASTER; + ret = 0; + } + break; + } + + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_I2S: + inf |= PCM_EXACT_I2S; + ret = 0; + break; + } + mask |= PCM_MODE_MASK; + if (ret) + return ret; + snd_soc_update_bits(codec, PM860X_PCM_IFACE_2, mask, inf); + return 0; +} + +static int pm860x_set_dai_sysclk(struct snd_soc_dai *codec_dai, + int clk_id, unsigned int freq, int dir) +{ + struct snd_soc_codec *codec = codec_dai->codec; + struct pm860x_priv *pm860x = snd_soc_codec_get_drvdata(codec); + + if (dir == PM860X_CLK_DIR_OUT) + pm860x->dir = PM860X_CLK_DIR_OUT; + else { + pm860x->dir = PM860X_CLK_DIR_IN; + return -EINVAL; + } + + return 0; +} + +static int pm860x_i2s_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; + unsigned char inf; + + /* bit size */ + switch (params_format(params)) { + case SNDRV_PCM_FORMAT_S16_LE: + inf = 0; + break; + case SNDRV_PCM_FORMAT_S18_3LE: + inf = PCM_INF2_18WL; + break; + default: + return -EINVAL; + } + snd_soc_update_bits(codec, PM860X_I2S_IFACE_2, PCM_INF2_18WL, inf); + + /* sample rate */ + switch (params_rate(params)) { + case 8000: + inf = 0; + break; + case 11025: + inf = 1; + break; + case 16000: + inf = 3; + break; + case 22050: + inf = 4; + break; + case 32000: + inf = 6; + break; + case 44100: + inf = 7; + break; + case 48000: + inf = 8; + break; + default: + return -EINVAL; + } + snd_soc_update_bits(codec, PM860X_I2S_IFACE_4, 0xf, inf); + + return 0; +} + +static int pm860x_i2s_set_dai_fmt(struct snd_soc_dai *codec_dai, + unsigned int fmt) +{ + struct snd_soc_codec *codec = codec_dai->codec; + struct pm860x_priv *pm860x = snd_soc_codec_get_drvdata(codec); + unsigned char inf = 0, mask = 0; + + mask |= PCM_INF2_BCLK | PCM_INF2_FS | PCM_INF2_MASTER; + + /* set master/slave audio interface */ + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBM_CFM: + if (pm860x->dir == PM860X_CLK_DIR_OUT) + inf |= PCM_INF2_MASTER; + else + return -EINVAL; + break; + case SND_SOC_DAIFMT_CBS_CFS: + if (pm860x->dir == PM860X_CLK_DIR_IN) + inf &= ~PCM_INF2_MASTER; + else + return -EINVAL; + break; + default: + return -EINVAL; + } + + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_I2S: + inf |= PCM_EXACT_I2S; + break; + default: + return -EINVAL; + } + mask |= PCM_MODE_MASK; + snd_soc_update_bits(codec, PM860X_I2S_IFACE_2, mask, inf); + return 0; +} + +static int pm860x_set_bias_level(struct snd_soc_codec *codec, + enum snd_soc_bias_level level) +{ + int data; + + switch (level) { + case SND_SOC_BIAS_ON: + break; + + case SND_SOC_BIAS_PREPARE: + break; + + case SND_SOC_BIAS_STANDBY: + if (codec->bias_level == SND_SOC_BIAS_OFF) { + /* Enable Audio PLL & Audio section */ + data = AUDIO_PLL | AUDIO_SECTION_RESET + | AUDIO_SECTION_ON; + pm860x_reg_write(codec->control_data, REG_MISC2, data); + } + break; + + case SND_SOC_BIAS_OFF: + data = AUDIO_PLL | AUDIO_SECTION_RESET | AUDIO_SECTION_ON; + pm860x_set_bits(codec->control_data, REG_MISC2, data, 0); + break; + } + codec->bias_level = level; + return 0; +} + +static struct snd_soc_dai_ops pm860x_pcm_dai_ops = { + .digital_mute = pm860x_digital_mute, + .hw_params = pm860x_pcm_hw_params, + .set_fmt = pm860x_pcm_set_dai_fmt, + .set_sysclk = pm860x_set_dai_sysclk, +}; + +static struct snd_soc_dai_ops pm860x_i2s_dai_ops = { + .digital_mute = pm860x_digital_mute, + .hw_params = pm860x_i2s_hw_params, + .set_fmt = pm860x_i2s_set_dai_fmt, + .set_sysclk = pm860x_set_dai_sysclk, +}; + +#define PM860X_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | \ + SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000) + +static struct snd_soc_dai_driver pm860x_dai[] = { + { + /* DAI PCM */ + .name = "88pm860x-pcm", + .id = 1, + .playback = { + .stream_name = "PCM Playback", + .channels_min = 2, + .channels_max = 2, + .rates = PM860X_RATES, + .formats = SNDRV_PCM_FORMAT_S16_LE | \ + SNDRV_PCM_FORMAT_S18_3LE, + }, + .capture = { + .stream_name = "PCM Capture", + .channels_min = 2, + .channels_max = 2, + .rates = PM860X_RATES, + .formats = SNDRV_PCM_FORMAT_S16_LE | \ + SNDRV_PCM_FORMAT_S18_3LE, + }, + .ops = &pm860x_pcm_dai_ops, + }, { + /* DAI I2S */ + .name = "88pm860x-i2s", + .id = 2, + .playback = { + .stream_name = "I2S Playback", + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = SNDRV_PCM_FORMAT_S16_LE | \ + SNDRV_PCM_FORMAT_S18_3LE, + }, + .capture = { + .stream_name = "I2S Capture", + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = SNDRV_PCM_FORMAT_S16_LE | \ + SNDRV_PCM_FORMAT_S18_3LE, + }, + .ops = &pm860x_i2s_dai_ops, + }, +}; + +static irqreturn_t pm860x_codec_handler(int irq, void *data) +{ + struct pm860x_priv *pm860x = data; + int status, shrt, report = 0, mic_report = 0; + int mask; + + status = pm860x_reg_read(pm860x->i2c, REG_STATUS_1); + shrt = pm860x_reg_read(pm860x->i2c, REG_SHORTS); + mask = pm860x->det.hs_shrt | pm860x->det.hook_det | pm860x->det.lo_shrt + | pm860x->det.hp_det; + + if ((pm860x->det.hp_det & SND_JACK_HEADPHONE) + && (status & HEADSET_STATUS)) + report |= SND_JACK_HEADPHONE; + + if ((pm860x->det.mic_det & SND_JACK_MICROPHONE) + && (status & MIC_STATUS)) + mic_report |= SND_JACK_MICROPHONE; + + if (pm860x->det.hs_shrt && (shrt & (SHORT_HS1 | SHORT_HS2))) + report |= pm860x->det.hs_shrt; + + if (pm860x->det.hook_det && (status & HOOK_STATUS)) + report |= pm860x->det.hook_det; + + if (pm860x->det.lo_shrt && (shrt & (SHORT_LO1 | SHORT_LO2))) + report |= pm860x->det.lo_shrt; + + if (report) + snd_soc_jack_report(pm860x->det.hp_jack, report, mask); + if (mic_report) + snd_soc_jack_report(pm860x->det.mic_jack, SND_JACK_MICROPHONE, + SND_JACK_MICROPHONE); + + dev_dbg(pm860x->codec->dev, "headphone report:0x%x, mask:%x\n", + report, mask); + dev_dbg(pm860x->codec->dev, "microphone report:0x%x\n", mic_report); + return IRQ_HANDLED; +} + +int pm860x_hs_jack_detect(struct snd_soc_codec *codec, + struct snd_soc_jack *jack, + int det, int hook, int hs_shrt, int lo_shrt) +{ + struct pm860x_priv *pm860x = snd_soc_codec_get_drvdata(codec); + int data; + + pm860x->det.hp_jack = jack; + pm860x->det.hp_det = det; + pm860x->det.hook_det = hook; + pm860x->det.hs_shrt = hs_shrt; + pm860x->det.lo_shrt = lo_shrt; + + if (det & SND_JACK_HEADPHONE) + pm860x_set_bits(codec->control_data, REG_HS_DET, + EN_HS_DET, EN_HS_DET); + /* headset short detect */ + if (hs_shrt) { + data = CLR_SHORT_HS2 | CLR_SHORT_HS1; + pm860x_set_bits(codec->control_data, REG_SHORTS, data, data); + } + /* Lineout short detect */ + if (lo_shrt) { + data = CLR_SHORT_LO2 | CLR_SHORT_LO1; + pm860x_set_bits(codec->control_data, REG_SHORTS, data, data); + } + + /* sync status */ + pm860x_codec_handler(0, pm860x); + return 0; +} +EXPORT_SYMBOL_GPL(pm860x_hs_jack_detect); + +int pm860x_mic_jack_detect(struct snd_soc_codec *codec, + struct snd_soc_jack *jack, int det) +{ + struct pm860x_priv *pm860x = snd_soc_codec_get_drvdata(codec); + + pm860x->det.mic_jack = jack; + pm860x->det.mic_det = det; + + if (det & SND_JACK_MICROPHONE) + pm860x_set_bits(codec->control_data, REG_MIC_DET, + MICDET_MASK, MICDET_MASK); + + /* sync status */ + pm860x_codec_handler(0, pm860x); + return 0; +} +EXPORT_SYMBOL_GPL(pm860x_mic_jack_detect); + +static int pm860x_probe(struct snd_soc_codec *codec) +{ + struct pm860x_priv *pm860x = snd_soc_codec_get_drvdata(codec); + int i, ret; + + pm860x->codec = codec; + + codec->control_data = pm860x->i2c; + + for (i = 0; i < 4; i++) { + ret = request_threaded_irq(pm860x->irq[i], NULL, + pm860x_codec_handler, IRQF_ONESHOT, + pm860x->name[i], pm860x); + if (ret < 0) { + dev_err(codec->dev, "Failed to request IRQ!\n"); + goto out_irq; + } + } + + pm860x_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + + ret = pm860x_bulk_read(codec->control_data, REG_CACHE_BASE, + REG_CACHE_SIZE, codec->reg_cache); + if (ret < 0) { + dev_err(codec->dev, "Failed to fill register cache: %d\n", + ret); + goto out_codec; + } + + snd_soc_add_controls(codec, pm860x_snd_controls, + ARRAY_SIZE(pm860x_snd_controls)); + snd_soc_dapm_new_controls(codec, pm860x_dapm_widgets, + ARRAY_SIZE(pm860x_dapm_widgets)); + snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map)); + return 0; + +out_codec: + i = 3; +out_irq: + for (; i >= 0; i--) + free_irq(pm860x->irq[i], pm860x); + return -EINVAL; +} + +static int pm860x_remove(struct snd_soc_codec *codec) +{ + struct pm860x_priv *pm860x = snd_soc_codec_get_drvdata(codec); + int i; + + for (i = 3; i >= 0; i--) + free_irq(pm860x->irq[i], pm860x); + pm860x_set_bias_level(codec, SND_SOC_BIAS_OFF); + return 0; +} + +static struct snd_soc_codec_driver soc_codec_dev_pm860x = { + .probe = pm860x_probe, + .remove = pm860x_remove, + .read = pm860x_read_reg_cache, + .write = pm860x_write_reg_cache, + .reg_cache_size = REG_CACHE_SIZE, + .reg_word_size = sizeof(u8), + .set_bias_level = pm860x_set_bias_level, +}; + +static int __devinit pm860x_codec_probe(struct platform_device *pdev) +{ + struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent); + struct pm860x_priv *pm860x; + struct resource *res; + int i, ret; + + pm860x = kzalloc(sizeof(struct pm860x_priv), GFP_KERNEL); + if (pm860x == NULL) + return -ENOMEM; + + pm860x->chip = chip; + pm860x->i2c = (chip->id == CHIP_PM8607) ? chip->client + : chip->companion; + platform_set_drvdata(pdev, pm860x); + + for (i = 0; i < 4; i++) { + res = platform_get_resource(pdev, IORESOURCE_IRQ, i); + if (!res) { + dev_err(&pdev->dev, "Failed to get IRQ resources\n"); + goto out; + } + pm860x->irq[i] = res->start + chip->irq_base; + strncpy(pm860x->name[i], res->name, MAX_NAME_LEN); + } + + ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_pm860x, + pm860x_dai, ARRAY_SIZE(pm860x_dai)); + if (ret) { + dev_err(&pdev->dev, "Failed to register codec\n"); + goto out; + } + return ret; + +out: + platform_set_drvdata(pdev, NULL); + kfree(pm860x); + return -EINVAL; +} + +static int __devexit pm860x_codec_remove(struct platform_device *pdev) +{ + struct pm860x_priv *pm860x = platform_get_drvdata(pdev); + + snd_soc_unregister_codec(&pdev->dev); + platform_set_drvdata(pdev, NULL); + kfree(pm860x); + return 0; +} + +static struct platform_driver pm860x_codec_driver = { + .driver = { + .name = "88pm860x-codec", + .owner = THIS_MODULE, + }, + .probe = pm860x_codec_probe, + .remove = __devexit_p(pm860x_codec_remove), +}; + +static __init int pm860x_init(void) +{ + return platform_driver_register(&pm860x_codec_driver); +} +module_init(pm860x_init); + +static __exit void pm860x_exit(void) +{ + platform_driver_unregister(&pm860x_codec_driver); +} +module_exit(pm860x_exit); + +MODULE_DESCRIPTION("ASoC 88PM860x driver"); +MODULE_AUTHOR("Haojian Zhuang "); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:88pm860x-codec"); + diff --git a/sound/soc/codecs/88pm860x-codec.h b/sound/soc/codecs/88pm860x-codec.h new file mode 100644 index 000000000000..3364ba4a3607 --- /dev/null +++ b/sound/soc/codecs/88pm860x-codec.h @@ -0,0 +1,97 @@ +/* + * 88pm860x-codec.h -- 88PM860x ALSA SoC Audio Driver + * + * Copyright 2010 Marvell International Ltd. + * Haojian Zhuang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __88PM860X_H +#define __88PM860X_H + +/* The offset of these registers are 0xb0 */ +#define PM860X_PCM_IFACE_1 0x00 +#define PM860X_PCM_IFACE_2 0x01 +#define PM860X_PCM_IFACE_3 0x02 +#define PM860X_PCM_RATE 0x03 +#define PM860X_EC_PATH 0x04 +#define PM860X_SIDETONE_L_GAIN 0x05 +#define PM860X_SIDETONE_R_GAIN 0x06 +#define PM860X_SIDETONE_SHIFT 0x07 +#define PM860X_ADC_OFFSET_1 0x08 +#define PM860X_ADC_OFFSET_2 0x09 +#define PM860X_DMIC_DELAY 0x0a + +#define PM860X_I2S_IFACE_1 0x0b +#define PM860X_I2S_IFACE_2 0x0c +#define PM860X_I2S_IFACE_3 0x0d +#define PM860X_I2S_IFACE_4 0x0e +#define PM860X_EQUALIZER_N0_1 0x0f +#define PM860X_EQUALIZER_N0_2 0x10 +#define PM860X_EQUALIZER_N1_1 0x11 +#define PM860X_EQUALIZER_N1_2 0x12 +#define PM860X_EQUALIZER_D1_1 0x13 +#define PM860X_EQUALIZER_D1_2 0x14 +#define PM860X_LOFI_GAIN_LEFT 0x15 +#define PM860X_LOFI_GAIN_RIGHT 0x16 +#define PM860X_HIFIL_GAIN_LEFT 0x17 +#define PM860X_HIFIL_GAIN_RIGHT 0x18 +#define PM860X_HIFIR_GAIN_LEFT 0x19 +#define PM860X_HIFIR_GAIN_RIGHT 0x1a +#define PM860X_DAC_OFFSET 0x1b +#define PM860X_OFFSET_LEFT_1 0x1c +#define PM860X_OFFSET_LEFT_2 0x1d +#define PM860X_OFFSET_RIGHT_1 0x1e +#define PM860X_OFFSET_RIGHT_2 0x1f +#define PM860X_ADC_ANA_1 0x20 +#define PM860X_ADC_ANA_2 0x21 +#define PM860X_ADC_ANA_3 0x22 +#define PM860X_ADC_ANA_4 0x23 +#define PM860X_ANA_TO_ANA 0x24 +#define PM860X_HS1_CTRL 0x25 +#define PM860X_HS2_CTRL 0x26 +#define PM860X_LO1_CTRL 0x27 +#define PM860X_LO2_CTRL 0x28 +#define PM860X_EAR_CTRL_1 0x29 +#define PM860X_EAR_CTRL_2 0x2a +#define PM860X_AUDIO_SUPPLIES_1 0x2b +#define PM860X_AUDIO_SUPPLIES_2 0x2c +#define PM860X_ADC_EN_1 0x2d +#define PM860X_ADC_EN_2 0x2e +#define PM860X_DAC_EN_1 0x2f +#define PM860X_DAC_EN_2 0x31 +#define PM860X_AUDIO_CAL_1 0x32 +#define PM860X_AUDIO_CAL_2 0x33 +#define PM860X_AUDIO_CAL_3 0x34 +#define PM860X_AUDIO_CAL_4 0x35 +#define PM860X_AUDIO_CAL_5 0x36 +#define PM860X_ANA_INPUT_SEL_1 0x37 +#define PM860X_ANA_INPUT_SEL_2 0x38 + +#define PM860X_PCM_IFACE_4 0x39 +#define PM860X_I2S_IFACE_5 0x3a + +#define PM860X_SHORTS 0x3b +#define PM860X_PLL_ADJ_1 0x3c +#define PM860X_PLL_ADJ_2 0x3d + +/* bits definition */ +#define PM860X_CLK_DIR_IN 0 +#define PM860X_CLK_DIR_OUT 1 + +#define PM860X_DET_HEADSET (1 << 0) +#define PM860X_DET_MIC (1 << 1) +#define PM860X_DET_HOOK (1 << 2) +#define PM860X_SHORT_HEADSET (1 << 3) +#define PM860X_SHORT_LINEOUT (1 << 4) +#define PM860X_DET_MASK 0x1F + +extern int pm860x_hs_jack_detect(struct snd_soc_codec *, struct snd_soc_jack *, + int, int, int, int); +extern int pm860x_mic_jack_detect(struct snd_soc_codec *, struct snd_soc_jack *, + int); + +#endif /* __88PM860X_H */ diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index bfdd92b78fb6..a3cfc184ee50 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -10,6 +10,7 @@ config SND_SOC_I2C_AND_SPI config SND_SOC_ALL_CODECS tristate "Build all ASoC CODEC drivers" + select SND_SOC_88PM860X if MFD_88PM860X select SND_SOC_L3 select SND_SOC_AC97_CODEC if SND_SOC_AC97_BUS select SND_SOC_AD1836 if SPI_MASTER @@ -85,6 +86,9 @@ config SND_SOC_ALL_CODECS If unsure select "N". +config SND_SOC_88PM860X + tristate + config SND_SOC_WM_HUBS tristate default y if SND_SOC_WM8993=y || SND_SOC_WM8994=y diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index 9c3c39fd99ad..b9c43582c5bd 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile @@ -1,3 +1,4 @@ +snd-soc-88pm860x-objs := 88pm860x-codec.o snd-soc-ac97-objs := ac97.o snd-soc-ad1836-objs := ad1836.o snd-soc-ad193x-objs := ad193x.o @@ -67,6 +68,7 @@ snd-soc-tpa6130a2-objs := tpa6130a2.o snd-soc-wm2000-objs := wm2000.o snd-soc-wm9090-objs := wm9090.o +obj-$(CONFIG_SND_SOC_88PM860X) += snd-soc-88pm860x.o obj-$(CONFIG_SND_SOC_AC97_CODEC) += snd-soc-ac97.o obj-$(CONFIG_SND_SOC_AD1836) += snd-soc-ad1836.o obj-$(CONFIG_SND_SOC_AD193X) += snd-soc-ad193x.o -- cgit v1.2.3 From b0547a70db38ee851a32306ee2e1e43a1e0d28ea Mon Sep 17 00:00:00 2001 From: Haojian Zhuang Date: Thu, 19 Aug 2010 00:36:00 +0800 Subject: ASoC: add tavorevb3 machine driver for 88pm860x Signed-off-by: Haojian Zhuang Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/pxa/Kconfig | 9 +++ sound/soc/pxa/Makefile | 2 + sound/soc/pxa/tavorevb3.c | 200 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 211 insertions(+) create mode 100644 sound/soc/pxa/tavorevb3.c (limited to 'sound') diff --git a/sound/soc/pxa/Kconfig b/sound/soc/pxa/Kconfig index e30c8325f35e..04ddc7bcae61 100644 --- a/sound/soc/pxa/Kconfig +++ b/sound/soc/pxa/Kconfig @@ -117,6 +117,15 @@ config SND_PXA2XX_SOC_PALM27X Say Y if you want to add support for SoC audio on Palm T|X, T5, E2 or LifeDrive handheld computer. +config SND_SOC_TAVOREVB3 + tristate "SoC Audio support for Marvell Tavor EVB3" + depends on SND_PXA2XX_SOC && MACH_TAVOREVB3 + select SND_PXA_SOC_SSP + select SND_SOC_88PM860X + help + Say Y if you want to add support for SoC audio on the + Marvell Saarb reference platform. + config SND_SOC_ZYLONITE tristate "SoC Audio support for Marvell Zylonite" depends on SND_PXA2XX_SOC && MACH_ZYLONITE diff --git a/sound/soc/pxa/Makefile b/sound/soc/pxa/Makefile index caa03d8f4789..315941fe1abd 100644 --- a/sound/soc/pxa/Makefile +++ b/sound/soc/pxa/Makefile @@ -19,6 +19,7 @@ snd-soc-e800-objs := e800_wm9712.o snd-soc-spitz-objs := spitz.o snd-soc-em-x270-objs := em-x270.o snd-soc-palm27x-objs := palm27x.o +snd-soc-tavorevb3-objs := tavorevb3.o snd-soc-zylonite-objs := zylonite.o snd-soc-magician-objs := magician.o snd-soc-mioa701-objs := mioa701_wm9713.o @@ -38,6 +39,7 @@ obj-$(CONFIG_SND_PXA2XX_SOC_PALM27X) += snd-soc-palm27x.o obj-$(CONFIG_SND_PXA2XX_SOC_MAGICIAN) += snd-soc-magician.o obj-$(CONFIG_SND_PXA2XX_SOC_MIOA701) += snd-soc-mioa701.o obj-$(CONFIG_SND_PXA2XX_SOC_Z2) += snd-soc-z2.o +obj-$(CONFIG_SND_SOC_TAVOREVB3) += snd-soc-tavorevb3.o obj-$(CONFIG_SND_SOC_ZYLONITE) += snd-soc-zylonite.o obj-$(CONFIG_SND_PXA2XX_SOC_IMOTE2) += snd-soc-imote2.o obj-$(CONFIG_SND_SOC_RAUMFELD) += snd-soc-raumfeld.o diff --git a/sound/soc/pxa/tavorevb3.c b/sound/soc/pxa/tavorevb3.c new file mode 100644 index 000000000000..248c283fc4df --- /dev/null +++ b/sound/soc/pxa/tavorevb3.c @@ -0,0 +1,200 @@ +/* + * tavorevb3.c -- SoC audio for Tavor EVB3 + * + * Copyright (C) 2010 Marvell International Ltd. + * Haojian Zhuang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "../codecs/88pm860x-codec.h" +#include "pxa-ssp.h" + +static int evb3_pm860x_init(struct snd_soc_pcm_runtime *rtd); + +static struct platform_device *evb3_snd_device; + +static struct snd_soc_jack hs_jack, mic_jack; + +static struct snd_soc_jack_pin hs_jack_pins[] = { + { .pin = "Headset Stereophone", .mask = SND_JACK_HEADPHONE, }, +}; + +static struct snd_soc_jack_pin mic_jack_pins[] = { + { .pin = "Headset Mic 2", .mask = SND_JACK_MICROPHONE, }, +}; + +/* tavorevb3 machine dapm widgets */ +static const struct snd_soc_dapm_widget evb3_dapm_widgets[] = { + SND_SOC_DAPM_HP("Headset Stereophone", NULL), + SND_SOC_DAPM_LINE("Lineout Out 1", NULL), + SND_SOC_DAPM_LINE("Lineout Out 2", NULL), + SND_SOC_DAPM_SPK("Ext Speaker", NULL), + SND_SOC_DAPM_MIC("Ext Mic 1", NULL), + SND_SOC_DAPM_MIC("Headset Mic 2", NULL), + SND_SOC_DAPM_MIC("Ext Mic 3", NULL), +}; + +/* tavorevb3 machine audio map */ +static const struct snd_soc_dapm_route audio_map[] = { + {"Headset Stereophone", NULL, "HS1"}, + {"Headset Stereophone", NULL, "HS2"}, + + {"Ext Speaker", NULL, "LSP"}, + {"Ext Speaker", NULL, "LSN"}, + + {"Lineout Out 1", NULL, "LINEOUT1"}, + {"Lineout Out 2", NULL, "LINEOUT2"}, + + {"MIC1P", NULL, "Mic1 Bias"}, + {"MIC1N", NULL, "Mic1 Bias"}, + {"Mic1 Bias", NULL, "Ext Mic 1"}, + + {"MIC2P", NULL, "Mic1 Bias"}, + {"MIC2N", NULL, "Mic1 Bias"}, + {"Mic1 Bias", NULL, "Headset Mic 2"}, + + {"MIC3P", NULL, "Mic3 Bias"}, + {"MIC3N", NULL, "Mic3 Bias"}, + {"Mic3 Bias", NULL, "Ext Mic 3"}, +}; + +static int evb3_i2s_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + int width = snd_pcm_format_physical_width(params_format(params)); + int ret; + + ret = snd_soc_dai_set_sysclk(cpu_dai, PXA_SSP_CLK_NET_PLL, 0, + PM860X_CLK_DIR_OUT); + if (ret < 0) + return ret; + + ret = snd_soc_dai_set_sysclk(codec_dai, 0, 0, PM860X_CLK_DIR_OUT); + if (ret < 0) + return ret; + + ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); + if (ret < 0) + return ret; + + ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); + if (ret < 0) + return ret; + + ret = snd_soc_dai_set_tdm_slot(cpu_dai, 3, 3, 2, width); + return ret; +} + +static struct snd_soc_ops evb3_i2s_ops = { + .hw_params = evb3_i2s_hw_params, +}; + +static struct snd_soc_dai_link evb3_dai[] = { + { + .name = "88PM860x I2S", + .stream_name = "I2S Audio", + .cpu_dai_name = "pxa-ssp-dai.1", + .codec_dai_name = "88pm860x-i2s", + .platform_name = "pxa-pcm-audio", + .codec_name = "88pm860x-codec", + .init = evb3_pm860x_init, + .ops = &evb3_i2s_ops, + }, +}; + +static struct snd_soc_card snd_soc_card_evb3 = { + .name = "Tavor EVB3", + .dai_link = evb3_dai, + .num_links = ARRAY_SIZE(evb3_dai), +}; + +static int evb3_pm860x_init(struct snd_soc_pcm_runtime *rtd) +{ + struct snd_soc_codec *codec = rtd->codec; + int ret; + + snd_soc_dapm_new_controls(codec, evb3_dapm_widgets, + ARRAY_SIZE(evb3_dapm_widgets)); + snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map)); + + /* connected pins */ + snd_soc_dapm_enable_pin(codec, "Ext Speaker"); + snd_soc_dapm_enable_pin(codec, "Ext Mic 1"); + snd_soc_dapm_enable_pin(codec, "Ext Mic 3"); + snd_soc_dapm_disable_pin(codec, "Headset Mic 2"); + snd_soc_dapm_disable_pin(codec, "Headset Stereophone"); + + ret = snd_soc_dapm_sync(codec); + if (ret) + return ret; + + /* Headset jack detection */ + snd_soc_jack_new(codec, "Headphone Jack", SND_JACK_HEADPHONE + | SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2, + &hs_jack); + snd_soc_jack_add_pins(&hs_jack, ARRAY_SIZE(hs_jack_pins), + hs_jack_pins); + snd_soc_jack_new(codec, "Microphone Jack", SND_JACK_MICROPHONE, + &mic_jack); + snd_soc_jack_add_pins(&mic_jack, ARRAY_SIZE(mic_jack_pins), + mic_jack_pins); + + /* headphone, microphone detection & headset short detection */ + pm860x_hs_jack_detect(codec, &hs_jack, SND_JACK_HEADPHONE, + SND_JACK_BTN_0, SND_JACK_BTN_1, SND_JACK_BTN_2); + pm860x_mic_jack_detect(codec, &hs_jack, SND_JACK_MICROPHONE); + return 0; +} + +static int __init tavorevb3_init(void) +{ + int ret; + + if (!machine_is_tavorevb3()) + return -ENODEV; + evb3_snd_device = platform_device_alloc("soc-audio", -1); + if (!evb3_snd_device) + return -ENOMEM; + + platform_set_drvdata(evb3_snd_device, &snd_soc_card_evb3); + + ret = platform_device_add(evb3_snd_device); + if (ret) + platform_device_put(evb3_snd_device); + + return ret; +} + +static void __exit tavorevb3_exit(void) +{ + platform_device_unregister(evb3_snd_device); +} + +module_init(tavorevb3_init); +module_exit(tavorevb3_exit); + +MODULE_AUTHOR("Haojian Zhuang "); +MODULE_DESCRIPTION("ALSA SoC 88PM860x Tavor EVB3"); +MODULE_LICENSE("GPL"); -- cgit v1.2.3 From b6905d0b1652efddb96cefdb3c8552cac8d98ed2 Mon Sep 17 00:00:00 2001 From: Haojian Zhuang Date: Thu, 19 Aug 2010 00:36:30 +0800 Subject: ASoC: add saarb machine driver for 88pm860x 88PM860x codec is used in Marvell saarb development board. 88PM860x codec is used as master mode for SSP communication. Only I2S format is supported. Signed-off-by: Haojian Zhuang Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/pxa/Kconfig | 9 +++ sound/soc/pxa/Makefile | 2 + sound/soc/pxa/saarb.c | 200 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 211 insertions(+) create mode 100644 sound/soc/pxa/saarb.c (limited to 'sound') diff --git a/sound/soc/pxa/Kconfig b/sound/soc/pxa/Kconfig index 04ddc7bcae61..37f191bbfdd9 100644 --- a/sound/soc/pxa/Kconfig +++ b/sound/soc/pxa/Kconfig @@ -117,6 +117,15 @@ config SND_PXA2XX_SOC_PALM27X Say Y if you want to add support for SoC audio on Palm T|X, T5, E2 or LifeDrive handheld computer. +config SND_SOC_SAARB + tristate "SoC Audio support for Marvell Saarb" + depends on SND_PXA2XX_SOC && MACH_SAARB + select SND_PXA_SOC_SSP + select SND_SOC_88PM860X + help + Say Y if you want to add support for SoC audio on the + Marvell Saarb reference platform. + config SND_SOC_TAVOREVB3 tristate "SoC Audio support for Marvell Tavor EVB3" depends on SND_PXA2XX_SOC && MACH_TAVOREVB3 diff --git a/sound/soc/pxa/Makefile b/sound/soc/pxa/Makefile index 315941fe1abd..07660165ec8d 100644 --- a/sound/soc/pxa/Makefile +++ b/sound/soc/pxa/Makefile @@ -19,6 +19,7 @@ snd-soc-e800-objs := e800_wm9712.o snd-soc-spitz-objs := spitz.o snd-soc-em-x270-objs := em-x270.o snd-soc-palm27x-objs := palm27x.o +snd-soc-saarb-objs := saarb.o snd-soc-tavorevb3-objs := tavorevb3.o snd-soc-zylonite-objs := zylonite.o snd-soc-magician-objs := magician.o @@ -39,6 +40,7 @@ obj-$(CONFIG_SND_PXA2XX_SOC_PALM27X) += snd-soc-palm27x.o obj-$(CONFIG_SND_PXA2XX_SOC_MAGICIAN) += snd-soc-magician.o obj-$(CONFIG_SND_PXA2XX_SOC_MIOA701) += snd-soc-mioa701.o obj-$(CONFIG_SND_PXA2XX_SOC_Z2) += snd-soc-z2.o +obj-$(CONFIG_SND_SOC_SAARB) += snd-soc-saarb.o obj-$(CONFIG_SND_SOC_TAVOREVB3) += snd-soc-tavorevb3.o obj-$(CONFIG_SND_SOC_ZYLONITE) += snd-soc-zylonite.o obj-$(CONFIG_SND_PXA2XX_SOC_IMOTE2) += snd-soc-imote2.o diff --git a/sound/soc/pxa/saarb.c b/sound/soc/pxa/saarb.c new file mode 100644 index 000000000000..d63cb474b4e1 --- /dev/null +++ b/sound/soc/pxa/saarb.c @@ -0,0 +1,200 @@ +/* + * saarb.c -- SoC audio for saarb + * + * Copyright (C) 2010 Marvell International Ltd. + * Haojian Zhuang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "../codecs/88pm860x-codec.h" +#include "pxa-ssp.h" + +static int saarb_pm860x_init(struct snd_soc_pcm_runtime *rtd); + +static struct platform_device *saarb_snd_device; + +static struct snd_soc_jack hs_jack, mic_jack; + +static struct snd_soc_jack_pin hs_jack_pins[] = { + { .pin = "Headset Stereophone", .mask = SND_JACK_HEADPHONE, }, +}; + +static struct snd_soc_jack_pin mic_jack_pins[] = { + { .pin = "Headset Mic 2", .mask = SND_JACK_MICROPHONE, }, +}; + +/* saarb machine dapm widgets */ +static const struct snd_soc_dapm_widget saarb_dapm_widgets[] = { + SND_SOC_DAPM_HP("Headphone Stereophone", NULL), + SND_SOC_DAPM_LINE("Lineout Out 1", NULL), + SND_SOC_DAPM_LINE("Lineout Out 2", NULL), + SND_SOC_DAPM_SPK("Ext Speaker", NULL), + SND_SOC_DAPM_MIC("Ext Mic 1", NULL), + SND_SOC_DAPM_MIC("Headset Mic", NULL), + SND_SOC_DAPM_MIC("Ext Mic 3", NULL), +}; + +/* saarb machine audio map */ +static const struct snd_soc_dapm_route audio_map[] = { + {"Headset Stereophone", NULL, "HS1"}, + {"Headset Stereophone", NULL, "HS2"}, + + {"Ext Speaker", NULL, "LSP"}, + {"Ext Speaker", NULL, "LSN"}, + + {"Lineout Out 1", NULL, "LINEOUT1"}, + {"Lineout Out 2", NULL, "LINEOUT2"}, + + {"MIC1P", NULL, "Mic1 Bias"}, + {"MIC1N", NULL, "Mic1 Bias"}, + {"Mic1 Bias", NULL, "Ext Mic 1"}, + + {"MIC2P", NULL, "Mic1 Bias"}, + {"MIC2N", NULL, "Mic1 Bias"}, + {"Mic1 Bias", NULL, "Headset Mic 2"}, + + {"MIC3P", NULL, "Mic3 Bias"}, + {"MIC3N", NULL, "Mic3 Bias"}, + {"Mic3 Bias", NULL, "Ext Mic 3"}, +}; + +static int saarb_i2s_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + int width = snd_pcm_format_physical_width(params_format(params)); + int ret; + + ret = snd_soc_dai_set_sysclk(cpu_dai, PXA_SSP_CLK_NET_PLL, 0, + PM860X_CLK_DIR_OUT); + if (ret < 0) + return ret; + + ret = snd_soc_dai_set_sysclk(codec_dai, 0, 0, PM860X_CLK_DIR_OUT); + if (ret < 0) + return ret; + + ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); + if (ret < 0) + return ret; + ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); + if (ret < 0) + return ret; + + ret = snd_soc_dai_set_tdm_slot(cpu_dai, 3, 3, 2, width); + + return ret; +} + +static struct snd_soc_ops saarb_i2s_ops = { + .hw_params = saarb_i2s_hw_params, +}; + +static struct snd_soc_dai_link saarb_dai[] = { + { + .name = "88PM860x I2S", + .stream_name = "I2S Audio", + .cpu_dai_name = "pxa-ssp-dai.1", + .codec_dai_name = "88pm860x-i2s", + .platform_name = "pxa-pcm-audio", + .codec_name = "88pm860x-codec", + .init = saarb_pm860x_init, + .ops = &saarb_i2s_ops, + }, +}; + +static struct snd_soc_card snd_soc_card_saarb = { + .name = "Saarb", + .dai_link = saarb_dai, + .num_links = ARRAY_SIZE(saarb_dai), +}; + +static int saarb_pm860x_init(struct snd_soc_pcm_runtime *rtd) +{ + struct snd_soc_codec *codec = rtd->codec; + int ret; + + snd_soc_dapm_new_controls(codec, saarb_dapm_widgets, + ARRAY_SIZE(saarb_dapm_widgets)); + snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map)); + + /* connected pins */ + snd_soc_dapm_enable_pin(codec, "Ext Speaker"); + snd_soc_dapm_enable_pin(codec, "Ext Mic 1"); + snd_soc_dapm_enable_pin(codec, "Ext Mic 3"); + snd_soc_dapm_disable_pin(codec, "Headset Mic 2"); + snd_soc_dapm_disable_pin(codec, "Headset Stereophone"); + + ret = snd_soc_dapm_sync(codec); + if (ret) + return ret; + + /* Headset jack detection */ + snd_soc_jack_new(codec, "Headphone Jack", SND_JACK_HEADPHONE + | SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2, + &hs_jack); + snd_soc_jack_add_pins(&hs_jack, ARRAY_SIZE(hs_jack_pins), + hs_jack_pins); + snd_soc_jack_new(codec, "Microphone Jack", SND_JACK_MICROPHONE, + &mic_jack); + snd_soc_jack_add_pins(&mic_jack, ARRAY_SIZE(mic_jack_pins), + mic_jack_pins); + + /* headphone, microphone detection & headset short detection */ + pm860x_hs_jack_detect(codec, &hs_jack, SND_JACK_HEADPHONE, + SND_JACK_BTN_0, SND_JACK_BTN_1, SND_JACK_BTN_2); + pm860x_mic_jack_detect(codec, &hs_jack, SND_JACK_MICROPHONE); + return 0; +} + +static int __init saarb_init(void) +{ + int ret; + + if (!machine_is_saarb()) + return -ENODEV; + saarb_snd_device = platform_device_alloc("soc-audio", -1); + if (!saarb_snd_device) + return -ENOMEM; + + platform_set_drvdata(saarb_snd_device, &snd_soc_card_saarb); + + ret = platform_device_add(saarb_snd_device); + if (ret) + platform_device_put(saarb_snd_device); + + return ret; +} + +static void __exit saarb_exit(void) +{ + platform_device_unregister(saarb_snd_device); +} + +module_init(saarb_init); +module_exit(saarb_exit); + +MODULE_AUTHOR("Haojian Zhuang "); +MODULE_DESCRIPTION("ALSA SoC 88PM860x Saarb"); +MODULE_LICENSE("GPL"); -- cgit v1.2.3 From 8e9d869028f3ce13631af5ef41910ad8d8e6c246 Mon Sep 17 00:00:00 2001 From: Timur Tabi Date: Fri, 6 Aug 2010 12:16:12 -0500 Subject: asoc/multi-component: fsl: add support for variable SSI FIFO depth Add code that programs the DMA and SSI controllers differently based on the FIFO depth of the SSI. The SSI devices on the MPC8610 and the P1022 are identical in every way except one: the transmit and receive FIFO depth. On the MPC8610, the depth is eight. On the P1022, it's fifteen. The device tree nodes for the SSI include a "fsl,fifo-depth" property that specifies the FIFO depth. Signed-off-by: Timur Tabi Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/fsl/fsl_dma.c | 67 +++++++++++++++++++++++++++++++++++++------------ sound/soc/fsl/fsl_ssi.c | 25 +++++++++++++++--- 2 files changed, 73 insertions(+), 19 deletions(-) (limited to 'sound') diff --git a/sound/soc/fsl/fsl_dma.c b/sound/soc/fsl/fsl_dma.c index 57774cb91ae3..dfe1cb94a70f 100644 --- a/sound/soc/fsl/fsl_dma.c +++ b/sound/soc/fsl/fsl_dma.c @@ -60,6 +60,7 @@ struct dma_object { struct snd_soc_platform_driver dai; dma_addr_t ssi_stx_phys; dma_addr_t ssi_srx_phys; + unsigned int ssi_fifo_depth; struct ccsr_dma_channel __iomem *channel; unsigned int irq; bool assigned; @@ -99,6 +100,7 @@ struct fsl_dma_private { unsigned int irq; struct snd_pcm_substream *substream; dma_addr_t ssi_sxx_phys; + unsigned int ssi_fifo_depth; dma_addr_t ld_buf_phys; unsigned int current_link; dma_addr_t dma_buf_phys; @@ -431,6 +433,7 @@ static int fsl_dma_open(struct snd_pcm_substream *substream) else dma_private->ssi_sxx_phys = dma->ssi_srx_phys; + dma_private->ssi_fifo_depth = dma->ssi_fifo_depth; dma_private->dma_channel = dma->channel; dma_private->irq = dma->irq; dma_private->substream = substream; @@ -544,11 +547,11 @@ static int fsl_dma_hw_params(struct snd_pcm_substream *substream, struct device *dev = rtd->platform->dev; /* Number of bits per sample */ - unsigned int sample_size = + unsigned int sample_bits = snd_pcm_format_physical_width(params_format(hw_params)); /* Number of bytes per frame */ - unsigned int frame_size = 2 * (sample_size / 8); + unsigned int sample_bytes = sample_bits / 8; /* Bus address of SSI STX register */ dma_addr_t ssi_sxx_phys = dma_private->ssi_sxx_phys; @@ -588,7 +591,7 @@ static int fsl_dma_hw_params(struct snd_pcm_substream *substream, * that offset here. While we're at it, also tell the DMA controller * how much data to transfer per sample. */ - switch (sample_size) { + switch (sample_bits) { case 8: mr |= CCSR_DMA_MR_DAHTS_1 | CCSR_DMA_MR_SAHTS_1; ssi_sxx_phys += 3; @@ -602,22 +605,42 @@ static int fsl_dma_hw_params(struct snd_pcm_substream *substream, break; default: /* We should never get here */ - dev_err(dev, "unsupported sample size %u\n", sample_size); + dev_err(dev, "unsupported sample size %u\n", sample_bits); return -EINVAL; } /* - * BWC should always be a multiple of the frame size. BWC determines - * how many bytes are sent/received before the DMA controller checks the - * SSI to see if it needs to stop. For playback, the transmit FIFO can - * hold three frames, so we want to send two frames at a time. For - * capture, the receive FIFO is triggered when it contains one frame, so - * we want to receive one frame at a time. + * BWC determines how many bytes are sent/received before the DMA + * controller checks the SSI to see if it needs to stop. BWC should + * always be a multiple of the frame size, so that we always transmit + * whole frames. Each frame occupies two slots in the FIFO. The + * parameter for CCSR_DMA_MR_BWC() is rounded down the next power of two + * (MR[BWC] can only represent even powers of two). + * + * To simplify the process, we set BWC to the largest value that is + * less than or equal to the FIFO watermark. For playback, this ensures + * that we transfer the maximum amount without overrunning the FIFO. + * For capture, this ensures that we transfer the maximum amount without + * underrunning the FIFO. + * + * f = SSI FIFO depth + * w = SSI watermark value (which equals f - 2) + * b = DMA bandwidth count (in bytes) + * s = sample size (in bytes, which equals frame_size * 2) + * + * For playback, we never transmit more than the transmit FIFO + * watermark, otherwise we might write more data than the FIFO can hold. + * The watermark is equal to the FIFO depth minus two. + * + * For capture, two equations must hold: + * w > f - (b / s) + * w >= b / s + * + * So, b > 2 * s, but b must also be <= s * w. To simplify, we set + * b = s * w, which is equal to + * (dma_private->ssi_fifo_depth - 2) * sample_bytes. */ - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - mr |= CCSR_DMA_MR_BWC(2 * frame_size); - else - mr |= CCSR_DMA_MR_BWC(frame_size); + mr |= CCSR_DMA_MR_BWC((dma_private->ssi_fifo_depth - 2) * sample_bytes); out_be32(&dma_channel->mr, mr); @@ -871,6 +894,7 @@ static int __devinit fsl_soc_dma_probe(struct of_device *of_dev, struct device_node *np = of_dev->dev.of_node; struct device_node *ssi_np; struct resource res; + const uint32_t *iprop; int ret; /* Find the SSI node that points to us. */ @@ -881,15 +905,17 @@ static int __devinit fsl_soc_dma_probe(struct of_device *of_dev, } ret = of_address_to_resource(ssi_np, 0, &res); - of_node_put(ssi_np); if (ret) { - dev_err(&of_dev->dev, "could not determine device resources\n"); + dev_err(&of_dev->dev, "could not determine resources for %s\n", + ssi_np->full_name); + of_node_put(ssi_np); return ret; } dma = kzalloc(sizeof(*dma) + strlen(np->full_name), GFP_KERNEL); if (!dma) { dev_err(&of_dev->dev, "could not allocate dma object\n"); + of_node_put(ssi_np); return -ENOMEM; } @@ -902,6 +928,15 @@ static int __devinit fsl_soc_dma_probe(struct of_device *of_dev, dma->ssi_stx_phys = res.start + offsetof(struct ccsr_ssi, stx0); dma->ssi_srx_phys = res.start + offsetof(struct ccsr_ssi, srx0); + iprop = of_get_property(ssi_np, "fsl,fifo-depth", NULL); + if (iprop) + dma->ssi_fifo_depth = *iprop; + else + /* Older 8610 DTs didn't have the fifo-depth property */ + dma->ssi_fifo_depth = 8; + + of_node_put(ssi_np); + ret = snd_soc_register_platform(&of_dev->dev, &dma->dai); if (ret) { dev_err(&of_dev->dev, "could not register platform\n"); diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index 7939c337ed9d..d1c855ade8fb 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c @@ -93,6 +93,7 @@ struct fsl_ssi_private { unsigned int playback; unsigned int capture; int asynchronous; + unsigned int fifo_depth; struct snd_soc_dai_driver cpu_dai_drv; struct device_attribute dev_attr; struct platform_device *pdev; @@ -337,11 +338,20 @@ static int fsl_ssi_startup(struct snd_pcm_substream *substream, /* * Set the watermark for transmit FIFI 0 and receive FIFO 0. We - * don't use FIFO 1. Since the SSI only supports stereo, the - * watermark should never be an odd number. + * don't use FIFO 1. We program the transmit water to signal a + * DMA transfer if there are only two (or fewer) elements left + * in the FIFO. Two elements equals one frame (left channel, + * right channel). This value, however, depends on the depth of + * the transmit buffer. + * + * We program the receive FIFO to notify us if at least two + * elements (one frame) have been written to the FIFO. We could + * make this value larger (and maybe we should), but this way + * data will be written to memory as soon as it's available. */ out_be32(&ssi->sfcsr, - CCSR_SSI_SFCSR_TFWM0(6) | CCSR_SSI_SFCSR_RFWM0(2)); + CCSR_SSI_SFCSR_TFWM0(ssi_private->fifo_depth - 2) | + CCSR_SSI_SFCSR_RFWM0(ssi_private->fifo_depth - 2)); /* * We keep the SSI disabled because if we enable it, then the @@ -622,6 +632,7 @@ static int __devinit fsl_ssi_probe(struct of_device *of_dev, struct device_attribute *dev_attr = NULL; struct device_node *np = of_dev->dev.of_node; const char *p, *sprop; + const uint32_t *iprop; struct resource res; char name[64]; @@ -678,6 +689,14 @@ static int __devinit fsl_ssi_probe(struct of_device *of_dev, else ssi_private->cpu_dai_drv.symmetric_rates = 1; + /* Determine the FIFO depth. */ + iprop = of_get_property(np, "fsl,fifo-depth", NULL); + if (iprop) + ssi_private->fifo_depth = *iprop; + else + /* Older 8610 DTs didn't have the fifo-depth property */ + ssi_private->fifo_depth = 8; + /* Initialize the the device_attribute structure */ dev_attr = &ssi_private->dev_attr; dev_attr->attr.name = "statistics"; -- cgit v1.2.3 From 4d8ec5f3b65dd64fa785192dc7ab2807916a05b2 Mon Sep 17 00:00:00 2001 From: Charles Chin Date: Thu, 19 Aug 2010 08:06:16 +0200 Subject: ALSA: hda - Add support for IDT 92HD89XX codecs Just added new codec ids. These are almost compatible with existing ones. Signed-off-by: Charles Chin Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_sigmatel.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index f3f861bd1bf8..95148e58026c 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -6303,6 +6303,21 @@ static struct hda_codec_preset snd_hda_preset_sigmatel[] = { { .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx }, { .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx }, { .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx }, + { .id = 0x111d76c0, .name = "92HD89C3", .patch = patch_stac92hd73xx }, + { .id = 0x111d76c1, .name = "92HD89C2", .patch = patch_stac92hd73xx }, + { .id = 0x111d76c2, .name = "92HD89C1", .patch = patch_stac92hd73xx }, + { .id = 0x111d76c3, .name = "92HD89B3", .patch = patch_stac92hd73xx }, + { .id = 0x111d76c4, .name = "92HD89B2", .patch = patch_stac92hd73xx }, + { .id = 0x111d76c5, .name = "92HD89B1", .patch = patch_stac92hd73xx }, + { .id = 0x111d76c6, .name = "92HD89E3", .patch = patch_stac92hd73xx }, + { .id = 0x111d76c7, .name = "92HD89E2", .patch = patch_stac92hd73xx }, + { .id = 0x111d76c8, .name = "92HD89E1", .patch = patch_stac92hd73xx }, + { .id = 0x111d76c9, .name = "92HD89D3", .patch = patch_stac92hd73xx }, + { .id = 0x111d76ca, .name = "92HD89D2", .patch = patch_stac92hd73xx }, + { .id = 0x111d76cb, .name = "92HD89D1", .patch = patch_stac92hd73xx }, + { .id = 0x111d76cc, .name = "92HD89F3", .patch = patch_stac92hd73xx }, + { .id = 0x111d76cd, .name = "92HD89F2", .patch = patch_stac92hd73xx }, + { .id = 0x111d76ce, .name = "92HD89F1", .patch = patch_stac92hd73xx }, {} /* terminator */ }; -- cgit v1.2.3 From 274714f55c023c683a6b2deedfb2209a9457f4ec Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Thu, 19 Aug 2010 08:11:53 +0200 Subject: ALSA: hda - Fix build error with CONFIG_PROC_FS=n hdmi_eld_update_pcm_info() must be always compiled in. Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_eld.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c index 803b298f7411..26c3ade73583 100644 --- a/sound/pci/hda/hda_eld.c +++ b/sound/pci/hda/hda_eld.c @@ -596,6 +596,8 @@ void snd_hda_eld_proc_free(struct hda_codec *codec, struct hdmi_eld *eld) } EXPORT_SYMBOL_HDA(snd_hda_eld_proc_free); +#endif /* CONFIG_PROC_FS */ + /* update PCM info based on ELD */ void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm, struct hda_pcm_stream *codec_pars) @@ -644,5 +646,3 @@ void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm, pcm->maxbps = min(pcm->maxbps, codec_pars->maxbps); } EXPORT_SYMBOL_HDA(hdmi_eld_update_pcm_info); - -#endif /* CONFIG_PROC_FS */ -- cgit v1.2.3 From 9c77b846ec8b4e0c7107dd7f820172462dc84a61 Mon Sep 17 00:00:00 2001 From: Daniel T Chen Date: Wed, 18 Aug 2010 19:33:43 -0400 Subject: ALSA: intel8x0: Mute External Amplifier by default for ThinkPad X31 BugLink: https://bugs.launchpad.net/bugs/619439 This ThinkPad model needs External Amplifier muted for audible playback, so set the inv_eapd quirk for it. Reported-and-tested-by: Dennis Bell Cc: Signed-off-by: Daniel T Chen Signed-off-by: Takashi Iwai --- sound/pci/intel8x0.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'sound') diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index 6433e65c9507..467749249576 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c @@ -1774,6 +1774,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { .name = "HP/Compaq nx7010", .type = AC97_TUNE_MUTE_LED }, + { + .subvendor = 0x1014, + .subdevice = 0x0534, + .name = "ThinkPad X31", + .type = AC97_TUNE_INV_EAPD + }, { .subvendor = 0x1014, .subdevice = 0x1f00, -- cgit v1.2.3 From d7d28bc29f4ea7c2d23ed002a9973c64a92bcdb8 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 18 Aug 2010 14:16:54 +0200 Subject: ALSA: pcm midlevel code - add time check for double interrupt acknowledge The current code in pcm_lib.c do all checks using only the position in the ring buffer. Unfortunately, where the interrupts gets delayed or merged into one, we need another timing source to check when the buffer size boundary overlaps to avoid the wrong updating of the ring buffer pointers. This code uses jiffies to check the right time window without any performance impact. Signed-off-by: Jaroslav Kysela --- sound/core/pcm_lib.c | 14 +++++++++----- sound/core/pcm_native.c | 2 ++ 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index e9d98be190c5..d6ecca27bb68 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c @@ -329,11 +329,15 @@ static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream, /* delta = "expected next hw_ptr" for in_interrupt != 0 */ delta = runtime->hw_ptr_interrupt + runtime->period_size; if (delta > new_hw_ptr) { - hw_base += runtime->buffer_size; - if (hw_base >= runtime->boundary) - hw_base = 0; - new_hw_ptr = hw_base + pos; - goto __delta; + /* check for double acknowledged interrupts */ + hdelta = jiffies - runtime->hw_ptr_jiffies; + if (hdelta > runtime->hw_ptr_buffer_jiffies/2) { + hw_base += runtime->buffer_size; + if (hw_base >= runtime->boundary) + hw_base = 0; + new_hw_ptr = hw_base + pos; + goto __delta; + } } } /* new_hw_ptr might be lower than old_hw_ptr in case when */ diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 303ac04ff6e4..2d2e1b65ee9a 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -867,6 +867,8 @@ static void snd_pcm_post_start(struct snd_pcm_substream *substream, int state) struct snd_pcm_runtime *runtime = substream->runtime; snd_pcm_trigger_tstamp(substream); runtime->hw_ptr_jiffies = jiffies; + runtime->hw_ptr_buffer_jiffies = (runtime->buffer_size * HZ) / + runtime->rate; runtime->status->state = state; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && runtime->silence_size > 0) -- cgit v1.2.3 From 140176159597ea1f23dcccb47b5c38fdf7c7faa8 Mon Sep 17 00:00:00 2001 From: Randolph Chung Date: Thu, 19 Aug 2010 12:06:17 +0100 Subject: ASoC: Configure symmetric rates for tlv320aic3x The tlv320aic3x codec driver only supports symmetric rates for capture/ playback. Set the flag in the DAI accordingly. Signed-off-by: Randolph Chung Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/tlv320aic3x.c | 1 + 1 file changed, 1 insertion(+) (limited to 'sound') diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index 43fd9c171742..867bf1fb1825 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c @@ -1117,6 +1117,7 @@ static struct snd_soc_dai_driver aic3x_dai = { .rates = AIC3X_RATES, .formats = AIC3X_FORMATS,}, .ops = &aic3x_dai_ops, + .symmetric_rates = 1, }; static int aic3x_suspend(struct snd_soc_codec *codec, pm_message_t state) -- cgit v1.2.3 From 5394637a246f4709e6f9c62b6af2356f49ef46a7 Mon Sep 17 00:00:00 2001 From: Janusz Krzysztofik Date: Thu, 19 Aug 2010 15:15:50 +0200 Subject: ASoC: Use a more adequate name for the CX20442 codec DAI In the process of unification of codec DAI names while implementing multi-component, the CX20442 codec DAI has been renamed to "cx20442-hifi". This new name seems not adequate for a 8kHz voice codec. Use a better name, "cx20442-voice", as suggested by Liam Girdwood. Signed-off-by: Janusz Krzysztofik Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/cx20442.c | 2 +- sound/soc/omap/ams-delta.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/cx20442.c b/sound/soc/codecs/cx20442.c index cf4323dbf9c4..e8d27c8f9ba3 100644 --- a/sound/soc/codecs/cx20442.c +++ b/sound/soc/codecs/cx20442.c @@ -318,7 +318,7 @@ EXPORT_SYMBOL_GPL(v253_ops); */ static struct snd_soc_dai_driver cx20442_dai = { - .name = "cx20442-hifi", + .name = "cx20442-voice", .playback = { .stream_name = "Playback", .channels_min = 1, diff --git a/sound/soc/omap/ams-delta.c b/sound/soc/omap/ams-delta.c index 9d88efa06e3c..438146addbb8 100644 --- a/sound/soc/omap/ams-delta.c +++ b/sound/soc/omap/ams-delta.c @@ -584,7 +584,7 @@ static struct snd_soc_dai_link ams_delta_dai_link = { .name = "CX20442", .stream_name = "CX20442", .cpu_dai_name ="omap-mcbsp-dai.0", - .codec_dai_name = "cx20442-hifi", + .codec_dai_name = "cx20442-voice", .init = ams_delta_cx20442_init, .platform_name = "omap-pcm-audio", .codec_name = "cx20442-codec", -- cgit v1.2.3 From 4f34760787c3751a3146f0eecdc79c3e97b94962 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Fri, 20 Aug 2010 09:41:59 +0200 Subject: ALSA: hda - Fix conflict of sticky PCM parameter in HDMI codecs Intel and Nvidia HDMI codec drivers have own implementations of sticky PCM parameters. Now HD-audio core part already has it, thus both setups conflict. The fix is simply remove the part in patch_intelhdmi.c and patch_nvhdmi.c and simply call snd_hda_codec_setup_stream() as usual. Reported-and-tested-by: Stephen Warren Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_hdmi.c | 21 +-------------------- sound/pci/hda/patch_intelhdmi.c | 8 -------- sound/pci/hda/patch_nvhdmi.c | 8 -------- 3 files changed, 1 insertion(+), 36 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 2bc0f07cf33f..afd6022a96a7 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c @@ -707,8 +707,6 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid, u32 stream_tag, int format) { struct hdmi_spec *spec = codec->spec; - int tag; - int fmt; int pinctl; int new_pinctl = 0; int i; @@ -745,24 +743,7 @@ static int hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid, return -EINVAL; } - tag = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0) >> 4; - fmt = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_STREAM_FORMAT, 0); - - snd_printdd("hdmi_setup_stream: " - "NID=0x%x, %sstream=0x%x, %sformat=0x%x\n", - nid, - tag == stream_tag ? "" : "new-", - stream_tag, - fmt == format ? "" : "new-", - format); - - if (tag != stream_tag) - snd_hda_codec_write(codec, nid, 0, - AC_VERB_SET_CHANNEL_STREAMID, - stream_tag << 4); - if (fmt != format) - snd_hda_codec_write(codec, nid, 0, - AC_VERB_SET_STREAM_FORMAT, format); + snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format); return 0; } diff --git a/sound/pci/hda/patch_intelhdmi.c b/sound/pci/hda/patch_intelhdmi.c index d382d3c81c0f..36a9b83a6174 100644 --- a/sound/pci/hda/patch_intelhdmi.c +++ b/sound/pci/hda/patch_intelhdmi.c @@ -69,20 +69,12 @@ static int intel_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo, return hdmi_setup_stream(codec, hinfo->nid, stream_tag, format); } -static int intel_hdmi_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, - struct hda_codec *codec, - struct snd_pcm_substream *substream) -{ - return 0; -} - static struct hda_pcm_stream intel_hdmi_pcm_playback = { .substreams = 1, .channels_min = 2, .ops = { .open = hdmi_pcm_open, .prepare = intel_hdmi_playback_pcm_prepare, - .cleanup = intel_hdmi_playback_pcm_cleanup, }, }; diff --git a/sound/pci/hda/patch_nvhdmi.c b/sound/pci/hda/patch_nvhdmi.c index f636870dc718..69b950d527c3 100644 --- a/sound/pci/hda/patch_nvhdmi.c +++ b/sound/pci/hda/patch_nvhdmi.c @@ -326,13 +326,6 @@ static int nvhdmi_dig_playback_pcm_prepare_8ch(struct hda_pcm_stream *hinfo, return 0; } -static int nvhdmi_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, - struct hda_codec *codec, - struct snd_pcm_substream *substream) -{ - return 0; -} - static int nvhdmi_dig_playback_pcm_prepare_2ch(struct hda_pcm_stream *hinfo, struct hda_codec *codec, unsigned int stream_tag, @@ -350,7 +343,6 @@ static struct hda_pcm_stream nvhdmi_pcm_digital_playback_8ch_89 = { .ops = { .open = hdmi_pcm_open, .prepare = nvhdmi_dig_playback_pcm_prepare_8ch_89, - .cleanup = nvhdmi_playback_pcm_cleanup, }, }; -- cgit v1.2.3 From 3f50ac6a0ec80a83a1a033fe5004fb319ad72db7 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Fri, 20 Aug 2010 09:44:36 +0200 Subject: ALSA: hda - Fix stream and channel-ids codec-bus wide The new sticky PCM parameter introduced the delayed clean-ups of stream- and channel-id tags. In the current implementation, this check (adding dirty flag) and actual clean-ups are done only for the codec chip. However, with HD-audio architecture, multiple codecs can be on a single bus, and the controller assign stream- and channel-ids in the bus-wide. In this patch, the stream-id and channel-id are checked over all codecs connected to the corresponding bus. Together with it, the mutex is moved to struct hda_bus, as this becomes also bus-wide. Reported-and-tested-by: Stephen Warren Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_codec.c | 33 ++++++++++++++++++++------------- sound/pci/hda/hda_codec.h | 2 +- 2 files changed, 21 insertions(+), 14 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index dd8fb86c842b..3827092cc1d2 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -589,6 +589,7 @@ int /*__devinit*/ snd_hda_bus_new(struct snd_card *card, bus->ops = temp->ops; mutex_init(&bus->cmd_mutex); + mutex_init(&bus->prepare_mutex); INIT_LIST_HEAD(&bus->codec_list); snprintf(bus->workq_name, sizeof(bus->workq_name), @@ -1068,7 +1069,6 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, codec->addr = codec_addr; mutex_init(&codec->spdif_mutex); mutex_init(&codec->control_mutex); - mutex_init(&codec->prepare_mutex); init_hda_cache(&codec->amp_cache, sizeof(struct hda_amp_info)); init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head)); snd_array_init(&codec->mixers, sizeof(struct hda_nid_item), 32); @@ -1213,6 +1213,7 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, u32 stream_tag, int channel_id, int format) { + struct hda_codec *c; struct hda_cvt_setup *p; unsigned int oldval, newval; int i; @@ -1253,10 +1254,12 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, p->dirty = 0; /* make other inactive cvts with the same stream-tag dirty */ - for (i = 0; i < codec->cvt_setups.used; i++) { - p = snd_array_elem(&codec->cvt_setups, i); - if (!p->active && p->stream_tag == stream_tag) - p->dirty = 1; + list_for_each_entry(c, &codec->bus->codec_list, list) { + for (i = 0; i < c->cvt_setups.used; i++) { + p = snd_array_elem(&c->cvt_setups, i); + if (!p->active && p->stream_tag == stream_tag) + p->dirty = 1; + } } } EXPORT_SYMBOL_HDA(snd_hda_codec_setup_stream); @@ -1306,12 +1309,16 @@ static void really_cleanup_stream(struct hda_codec *codec, /* clean up the all conflicting obsolete streams */ static void purify_inactive_streams(struct hda_codec *codec) { + struct hda_codec *c; int i; - for (i = 0; i < codec->cvt_setups.used; i++) { - struct hda_cvt_setup *p = snd_array_elem(&codec->cvt_setups, i); - if (p->dirty) - really_cleanup_stream(codec, p); + list_for_each_entry(c, &codec->bus->codec_list, list) { + for (i = 0; i < c->cvt_setups.used; i++) { + struct hda_cvt_setup *p; + p = snd_array_elem(&c->cvt_setups, i); + if (p->dirty) + really_cleanup_stream(c, p); + } } } @@ -3502,11 +3509,11 @@ int snd_hda_codec_prepare(struct hda_codec *codec, struct snd_pcm_substream *substream) { int ret; - mutex_lock(&codec->prepare_mutex); + mutex_lock(&codec->bus->prepare_mutex); ret = hinfo->ops.prepare(hinfo, codec, stream, format, substream); if (ret >= 0) purify_inactive_streams(codec); - mutex_unlock(&codec->prepare_mutex); + mutex_unlock(&codec->bus->prepare_mutex); return ret; } EXPORT_SYMBOL_HDA(snd_hda_codec_prepare); @@ -3515,9 +3522,9 @@ void snd_hda_codec_cleanup(struct hda_codec *codec, struct hda_pcm_stream *hinfo, struct snd_pcm_substream *substream) { - mutex_lock(&codec->prepare_mutex); + mutex_lock(&codec->bus->prepare_mutex); hinfo->ops.cleanup(hinfo, codec, substream); - mutex_unlock(&codec->prepare_mutex); + mutex_unlock(&codec->bus->prepare_mutex); } EXPORT_SYMBOL_HDA(snd_hda_codec_cleanup); diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 4303353feda9..62c702240108 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h @@ -648,6 +648,7 @@ struct hda_bus { struct hda_codec *caddr_tbl[HDA_MAX_CODEC_ADDRESS + 1]; struct mutex cmd_mutex; + struct mutex prepare_mutex; /* unsolicited event queue */ struct hda_bus_unsolicited *unsol; @@ -826,7 +827,6 @@ struct hda_codec { struct mutex spdif_mutex; struct mutex control_mutex; - struct mutex prepare_mutex; unsigned int spdif_status; /* IEC958 status bits */ unsigned short spdif_ctls; /* SPDIF control bits */ unsigned int spdif_in_enable; /* SPDIF input enable? */ -- cgit v1.2.3 From b67696b40f2e7f890d017db3c6805ff90cb392b6 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Thu, 19 Aug 2010 14:40:25 +0800 Subject: ASoC: e740_wm9705 - free gpio in e740_exit() In e740_init(), we call gpio_request() for GPIO_E740_MIC_ON, GPIO_E740_AMP_ON and GPIO_E740_WM9705_nAVDD2. We should free the these gpio accordingly in e740_exit(). Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/pxa/e740_wm9705.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'sound') diff --git a/sound/soc/pxa/e740_wm9705.c b/sound/soc/pxa/e740_wm9705.c index f614607b2055..c82cedb602fd 100644 --- a/sound/soc/pxa/e740_wm9705.c +++ b/sound/soc/pxa/e740_wm9705.c @@ -198,6 +198,9 @@ free_mic_amp_gpio: static void __exit e740_exit(void) { platform_device_unregister(e740_snd_device); + gpio_free(GPIO_E740_WM9705_nAVDD2); + gpio_free(GPIO_E740_AMP_ON); + gpio_free(GPIO_E740_MIC_ON); } module_init(e740_init); -- cgit v1.2.3 From c04019d450a885a095a2ca38fcd5db8d57cd2718 Mon Sep 17 00:00:00 2001 From: Timur Tabi Date: Thu, 19 Aug 2010 16:43:42 -0500 Subject: ASoC: add support for separate codec DAIs to the fsl_dma driver Some codecs have separate DAIs for playback and capture, so the DMA driver should allocate a DMA buffer only for the streams that are valid when the driver is opened. Signed-off-by: Timur Tabi Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/fsl/fsl_dma.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) (limited to 'sound') diff --git a/sound/soc/fsl/fsl_dma.c b/sound/soc/fsl/fsl_dma.c index 57774cb91ae3..5a6f56d63756 100644 --- a/sound/soc/fsl/fsl_dma.c +++ b/sound/soc/fsl/fsl_dma.c @@ -303,21 +303,29 @@ static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai, if (!card->dev->coherent_dma_mask) card->dev->coherent_dma_mask = fsl_dma_dmamask; - ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev, - fsl_dma_hardware.buffer_bytes_max, - &pcm->streams[0].substream->dma_buffer); - if (ret) { - dev_err(card->dev, "can't allocate playback dma buffer\n"); - return ret; + /* Some codecs have separate DAIs for playback and capture, so we + * should allocate a DMA buffer only for the streams that are valid. + */ + + if (dai->driver->playback.channels_min) { + ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev, + fsl_dma_hardware.buffer_bytes_max, + &pcm->streams[0].substream->dma_buffer); + if (ret) { + dev_err(card->dev, "can't alloc playback dma buffer\n"); + return ret; + } } - ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev, - fsl_dma_hardware.buffer_bytes_max, - &pcm->streams[1].substream->dma_buffer); - if (ret) { - snd_dma_free_pages(&pcm->streams[0].substream->dma_buffer); - dev_err(card->dev, "can't allocate capture dma buffer\n"); - return ret; + if (dai->driver->capture.channels_min) { + ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev, + fsl_dma_hardware.buffer_bytes_max, + &pcm->streams[1].substream->dma_buffer); + if (ret) { + snd_dma_free_pages(&pcm->streams[0].substream->dma_buffer); + dev_err(card->dev, "can't alloc capture dma buffer\n"); + return ret; + } } return 0; -- cgit v1.2.3 From 6184f105aa75009e6d380b59316305079a44a6ee Mon Sep 17 00:00:00 2001 From: Randolph Chung Date: Fri, 20 Aug 2010 12:47:53 +0800 Subject: ASoC: Add support for tlv320aic3007 to tlv320aic3x codec. This patch adds support for the tlv320aic3007 codec to the tlv320aic3x driver. The tlv320aic3007 is similar to the aic31, but has an additional class-D speaker amp. The speaker amp control register overlaps with the mono output register of other codecs in this family, so we add logic to identify the actual codec being registered to set things up accordingly. Signed-off-by: Randolph Chung Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/tlv320aic3x.c | 79 ++++++++++++++++++++++++++++++++++++------ sound/soc/codecs/tlv320aic3x.h | 2 ++ 2 files changed, 71 insertions(+), 10 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index 867bf1fb1825..c07465720cdb 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c @@ -12,11 +12,11 @@ * * Notes: * The AIC3X is a driver for a low power stereo audio - * codecs aic31, aic32, aic33. + * codecs aic31, aic32, aic33, aic3007. * * It supports full aic33 codec functionality. - * The compatibility with aic32, aic31 is as follows: - * aic32 | aic31 + * The compatibility with aic32, aic31 and aic3007 is as follows: + * aic32/aic3007 | aic31 * --------------------------------------- * MONO_LOUT -> N/A | MONO_LOUT -> N/A * | IN1L -> LINE1L @@ -70,6 +70,10 @@ struct aic3x_priv { unsigned int sysclk; int master; int gpio_reset; +#define AIC3X_MODEL_3X 0 +#define AIC3X_MODEL_33 1 +#define AIC3X_MODEL_3007 2 + u16 model; }; /* @@ -361,6 +365,14 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = { SOC_ENUM("ADC HPF Cut-off", aic3x_enum[ADC_HPF_ENUM]), }; +/* + * Class-D amplifier gain. From 0 to 18 dB in 6 dB steps + */ +static DECLARE_TLV_DB_SCALE(classd_amp_tlv, 0, 600, 0); + +static const struct snd_kcontrol_new aic3x_classd_amp_gain_ctrl = + SOC_DOUBLE_TLV("Class-D Amplifier Gain", CLASSD_CTRL, 6, 4, 3, 0, classd_amp_tlv); + /* Left DAC Mux */ static const struct snd_kcontrol_new aic3x_left_dac_mux_controls = SOC_DAPM_ENUM("Route", aic3x_enum[LDAC_ENUM]); @@ -589,6 +601,15 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = { SND_SOC_DAPM_INPUT("LINE2R"), }; +static const struct snd_soc_dapm_widget aic3007_dapm_widgets[] = { + /* Class-D outputs */ + SND_SOC_DAPM_PGA("Left Class-D Out", CLASSD_CTRL, 3, 0, NULL, 0), + SND_SOC_DAPM_PGA("Right Class-D Out", CLASSD_CTRL, 2, 0, NULL, 0), + + SND_SOC_DAPM_OUTPUT("SPOP"), + SND_SOC_DAPM_OUTPUT("SPOM"), +}; + static const struct snd_soc_dapm_route intercon[] = { /* Left Output */ {"Left DAC Mux", "DAC_L1", "Left DAC"}, @@ -759,14 +780,30 @@ static const struct snd_soc_dapm_route intercon[] = { {"GPIO1 dmic modclk", NULL, "DMic Rate 32"}, }; +static const struct snd_soc_dapm_route intercon_3007[] = { + /* Class-D outputs */ + {"Left Class-D Out", NULL, "Left Line Out"}, + {"Right Class-D Out", NULL, "Left Line Out"}, + {"SPOP", NULL, "Left Class-D Out"}, + {"SPOM", NULL, "Right Class-D Out"}, +}; + static int aic3x_add_widgets(struct snd_soc_codec *codec) { + struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); + snd_soc_dapm_new_controls(codec, aic3x_dapm_widgets, ARRAY_SIZE(aic3x_dapm_widgets)); /* set up audio path interconnects */ snd_soc_dapm_add_routes(codec, intercon, ARRAY_SIZE(intercon)); + if (aic3x->model == AIC3X_MODEL_3007) { + snd_soc_dapm_new_controls(codec, aic3007_dapm_widgets, + ARRAY_SIZE(aic3007_dapm_widgets)); + snd_soc_dapm_add_routes(codec, intercon_3007, ARRAY_SIZE(intercon_3007)); + } + return 0; } @@ -1151,6 +1188,7 @@ static int aic3x_resume(struct snd_soc_codec *codec) */ static int aic3x_init(struct snd_soc_codec *codec) { + struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); int reg; aic3x_write(codec, AIC3X_PAGE_SELECT, PAGE0_SELECT); @@ -1219,6 +1257,17 @@ static int aic3x_init(struct snd_soc_codec *codec) aic3x_write(codec, LINE2L_2_MONOLOPM_VOL, DEFAULT_VOL); aic3x_write(codec, LINE2R_2_MONOLOPM_VOL, DEFAULT_VOL); + if (aic3x->model == AIC3X_MODEL_3007) { + /* Class-D speaker driver init; datasheet p. 46 */ + aic3x_write(codec, AIC3X_PAGE_SELECT, 0x0D); + aic3x_write(codec, 0xD, 0x0D); + aic3x_write(codec, 0x8, 0x5C); + aic3x_write(codec, 0x8, 0x5D); + aic3x_write(codec, 0x8, 0x5C); + aic3x_write(codec, AIC3X_PAGE_SELECT, 0x00); + aic3x_write(codec, CLASSD_CTRL, 0); + } + /* off, with power on */ aic3x_set_bias_level(codec, SND_SOC_BIAS_STANDBY); @@ -1244,6 +1293,8 @@ static int aic3x_probe(struct snd_soc_codec *codec) snd_soc_add_controls(codec, aic3x_snd_controls, ARRAY_SIZE(aic3x_snd_controls)); + if (aic3x->model == AIC3X_MODEL_3007) + snd_soc_add_controls(codec, &aic3x_classd_amp_gain_ctrl, 1); aic3x_add_widgets(codec); @@ -1275,6 +1326,14 @@ static struct snd_soc_codec_driver soc_codec_dev_aic3x = { * 0x18, 0x19, 0x1A, 0x1B */ +static const struct i2c_device_id aic3x_i2c_id[] = { + [AIC3X_MODEL_3X] = { "tlv320aic3x", 0 }, + [AIC3X_MODEL_33] = { "tlv320aic33", 0 }, + [AIC3X_MODEL_3007] = { "tlv320aic3007", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, aic3x_i2c_id); + /* * If the i2c layer weren't so broken, we could pass this kind of data * around @@ -1286,6 +1345,7 @@ static int aic3x_i2c_probe(struct i2c_client *i2c, struct aic3x_setup_data *setup = pdata->setup; struct aic3x_priv *aic3x; int ret, i; + const struct i2c_device_id *tbl; aic3x = kzalloc(sizeof(struct aic3x_priv), GFP_KERNEL); if (aic3x == NULL) { @@ -1306,6 +1366,12 @@ static int aic3x_i2c_probe(struct i2c_client *i2c, gpio_direction_output(aic3x->gpio_reset, 0); } + for (tbl = aic3x_i2c_id; tbl->name[0]; tbl++) { + if (!strcmp(tbl->name, id->name)) + break; + } + aic3x->model = tbl - aic3x_i2c_id; + for (i = 0; i < ARRAY_SIZE(aic3x->supplies); i++) aic3x->supplies[i].supply = aic3x_supply_names[i]; @@ -1360,13 +1426,6 @@ static int aic3x_i2c_remove(struct i2c_client *client) return 0; } -static const struct i2c_device_id aic3x_i2c_id[] = { - { "tlv320aic3x", 0 }, - { "tlv320aic33", 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, aic3x_i2c_id); - /* machine i2c codec control layer */ static struct i2c_driver aic3x_i2c_driver = { .driver = { diff --git a/sound/soc/codecs/tlv320aic3x.h b/sound/soc/codecs/tlv320aic3x.h index f6e3d9b42daf..98e44395b662 100644 --- a/sound/soc/codecs/tlv320aic3x.h +++ b/sound/soc/codecs/tlv320aic3x.h @@ -111,6 +111,8 @@ #define DACL1_2_MONOLOPM_VOL 75 #define DACR1_2_MONOLOPM_VOL 78 #define MONOLOPM_CTRL 79 +/* Class-D speaker driver on tlv320aic3007 */ +#define CLASSD_CTRL 73 /* Line Output Plus/Minus control registers */ #define LINE2L_2_LLOPM_VOL 80 #define LINE2L_2_RLOPM_VOL 87 -- cgit v1.2.3 From b9c1261db46a4afdaebf08233d1c1e47f2d93979 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Fri, 20 Aug 2010 13:23:36 +0800 Subject: ASoC: remove include of pxa2xx-pcm.h in pxa2xx-ac97.c Fix reference to moved header file, which was unused anyway. This change fixes below build error: CC sound/soc/pxa/pxa2xx-ac97.o sound/soc/pxa/pxa2xx-ac97.c:27:24: error: pxa2xx-pcm.h: No such file or directory make[3]: *** [sound/soc/pxa/pxa2xx-ac97.o] Error 1 make[2]: *** [sound/soc/pxa] Error 2 make[1]: *** [sound/soc] Error 2 make: *** [sound] Error 2 Signed-off-by: Axel Lin Signed-off-by: Haojian Zhuang Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/pxa/pxa2xx-ac97.c | 1 - 1 file changed, 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/pxa/pxa2xx-ac97.c b/sound/soc/pxa/pxa2xx-ac97.c index 9c2bafa112ad..ac51c6d25c42 100644 --- a/sound/soc/pxa/pxa2xx-ac97.c +++ b/sound/soc/pxa/pxa2xx-ac97.c @@ -24,7 +24,6 @@ #include #include -#include "pxa2xx-pcm.h" #include "pxa2xx-ac97.h" static void pxa2xx_ac97_warm_reset(struct snd_ac97 *ac97) -- cgit v1.2.3 From 27ef3744f85bbbd00175ce7e9ac46b52089ee83c Mon Sep 17 00:00:00 2001 From: Timur Tabi Date: Thu, 19 Aug 2010 17:11:40 -0500 Subject: ASoC: add support for the Freescale P1022 DS reference board The Freescale P1022 is a dual-core e500-based SOC with multimedia capabilities, specifically the same SSI audio controller on the MPC8610. The P1022 DS reference board includes a P1022 and a Wolfson Microelectronics WM8776 codec. Signed-off-by: Timur Tabi Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/fsl/Kconfig | 24 +- sound/soc/fsl/Makefile | 8 +- sound/soc/fsl/p1022_ds.c | 590 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 614 insertions(+), 8 deletions(-) create mode 100644 sound/soc/fsl/p1022_ds.c (limited to 'sound') diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig index 981868700388..d754d34d68a6 100644 --- a/sound/soc/fsl/Kconfig +++ b/sound/soc/fsl/Kconfig @@ -1,24 +1,36 @@ config SND_MPC52xx_DMA tristate -# ASoC platform support for the Freescale MPC8610 SOC. This compiles drivers -# for the SSI and the Elo DMA controller. You will still need to select -# a platform driver and a codec driver. -config SND_SOC_MPC8610 +# ASoC platform support for the Freescale PowerPC SOCs that have an SSI and +# an Elo DMA controller, such as the MPC8610 and P1022. You will still need to +# select a platform driver and a codec driver. +config SND_SOC_POWERPC_SSI tristate - depends on MPC8610 + depends on FSL_SOC config SND_SOC_MPC8610_HPCD tristate "ALSA SoC support for the Freescale MPC8610 HPCD board" # I2C is necessary for the CS4270 driver depends on MPC8610_HPCD && I2C - select SND_SOC_MPC8610 + select SND_SOC_POWERPC_SSI select SND_SOC_CS4270 select SND_SOC_CS4270_VD33_ERRATA default y if MPC8610_HPCD help Say Y if you want to enable audio on the Freescale MPC8610 HPCD. +config SND_SOC_P1022_DS + tristate "ALSA SoC support for the Freescale P1022 DS board" + # I2C is necessary for the WM8776 driver + depends on P1022_DS && I2C + select SND_SOC_POWERPC_SSI + select SND_SOC_WM8776 + default y if P1022_DS + help + Say Y if you want to enable audio on the Freescale P1022 DS board. + This will also include the Wolfson Microelectronics WM8776 codec + driver. + config SND_SOC_MPC5200_I2S tristate "Freescale MPC5200 PSC in I2S mode driver" depends on PPC_MPC52xx && PPC_BESTCOMM diff --git a/sound/soc/fsl/Makefile b/sound/soc/fsl/Makefile index 7e472a53fcd3..b4a38c0ac58c 100644 --- a/sound/soc/fsl/Makefile +++ b/sound/soc/fsl/Makefile @@ -2,10 +2,14 @@ snd-soc-mpc8610-hpcd-objs := mpc8610_hpcd.o obj-$(CONFIG_SND_SOC_MPC8610_HPCD) += snd-soc-mpc8610-hpcd.o -# MPC8610 Platform Support +# P1022 DS Machine Support +snd-soc-p1022-ds-objs := p1022_ds.o +obj-$(CONFIG_SND_SOC_P1022_DS) += snd-soc-p1022-ds.o + +# Freescale PowerPC SSI/DMA Platform Support snd-soc-fsl-ssi-objs := fsl_ssi.o snd-soc-fsl-dma-objs := fsl_dma.o -obj-$(CONFIG_SND_SOC_MPC8610) += snd-soc-fsl-ssi.o snd-soc-fsl-dma.o +obj-$(CONFIG_SND_SOC_POWERPC_SSI) += snd-soc-fsl-ssi.o snd-soc-fsl-dma.o # MPC5200 Platform Support obj-$(CONFIG_SND_MPC52xx_DMA) += mpc5200_dma.o diff --git a/sound/soc/fsl/p1022_ds.c b/sound/soc/fsl/p1022_ds.c new file mode 100644 index 000000000000..f8176e8e1adf --- /dev/null +++ b/sound/soc/fsl/p1022_ds.c @@ -0,0 +1,590 @@ +/** + * Freescale P1022DS ALSA SoC Machine driver + * + * Author: Timur Tabi + * + * Copyright 2010 Freescale Semiconductor, Inc. + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + */ + +#include +#include +#include +#include +#include +#include + +#include "fsl_dma.h" +#include "fsl_ssi.h" + +/* P1022-specific PMUXCR and DMUXCR bit definitions */ + +#define CCSR_GUTS_PMUXCR_UART0_I2C1_MASK 0x0001c000 +#define CCSR_GUTS_PMUXCR_UART0_I2C1_UART0_SSI 0x00010000 +#define CCSR_GUTS_PMUXCR_UART0_I2C1_SSI 0x00018000 + +#define CCSR_GUTS_PMUXCR_SSI_DMA_TDM_MASK 0x00000c00 +#define CCSR_GUTS_PMUXCR_SSI_DMA_TDM_SSI 0x00000000 + +#define CCSR_GUTS_DMUXCR_PAD 1 /* DMA controller/channel set to pad */ +#define CCSR_GUTS_DMUXCR_SSI 2 /* DMA controller/channel set to SSI */ + +/* + * Set the DMACR register in the GUTS + * + * The DMACR register determines the source of initiated transfers for each + * channel on each DMA controller. Rather than have a bunch of repetitive + * macros for the bit patterns, we just have a function that calculates + * them. + * + * guts: Pointer to GUTS structure + * co: The DMA controller (0 or 1) + * ch: The channel on the DMA controller (0, 1, 2, or 3) + * device: The device to set as the target (CCSR_GUTS_DMUXCR_xxx) + */ +static inline void guts_set_dmuxcr(struct ccsr_guts_85xx __iomem *guts, + unsigned int co, unsigned int ch, unsigned int device) +{ + unsigned int shift = 16 + (8 * (1 - co) + 2 * (3 - ch)); + + clrsetbits_be32(&guts->dmuxcr, 3 << shift, device << shift); +} + +/* There's only one global utilities register */ +static phys_addr_t guts_phys; + +#define DAI_NAME_SIZE 32 + +/** + * machine_data: machine-specific ASoC device data + * + * This structure contains data for a single sound platform device on an + * P1022 DS. Some of the data is taken from the device tree. + */ +struct machine_data { + struct snd_soc_dai_link dai[2]; + struct snd_soc_card card; + unsigned int dai_format; + unsigned int codec_clk_direction; + unsigned int cpu_clk_direction; + unsigned int clk_frequency; + unsigned int ssi_id; /* 0 = SSI1, 1 = SSI2, etc */ + unsigned int dma_id[2]; /* 0 = DMA1, 1 = DMA2, etc */ + unsigned int dma_channel_id[2]; /* 0 = ch 0, 1 = ch 1, etc*/ + char codec_name[DAI_NAME_SIZE]; + char platform_name[2][DAI_NAME_SIZE]; /* One for each DMA channel */ +}; + +/** + * p1022_ds_machine_probe: initialize the board + * + * This function is used to initialize the board-specific hardware. + * + * Here we program the DMACR and PMUXCR registers. + */ +static int p1022_ds_machine_probe(struct platform_device *sound_device) +{ + struct snd_soc_card *card = platform_get_drvdata(sound_device); + struct machine_data *mdata = + container_of(card, struct machine_data, card); + struct ccsr_guts_85xx __iomem *guts; + + guts = ioremap(guts_phys, sizeof(struct ccsr_guts_85xx)); + if (!guts) { + dev_err(card->dev, "could not map global utilities\n"); + return -ENOMEM; + } + + /* Enable SSI Tx signal */ + clrsetbits_be32(&guts->pmuxcr, CCSR_GUTS_PMUXCR_UART0_I2C1_MASK, + CCSR_GUTS_PMUXCR_UART0_I2C1_UART0_SSI); + + /* Enable SSI Rx signal */ + clrsetbits_be32(&guts->pmuxcr, CCSR_GUTS_PMUXCR_SSI_DMA_TDM_MASK, + CCSR_GUTS_PMUXCR_SSI_DMA_TDM_SSI); + + /* Enable DMA Channel for SSI */ + guts_set_dmuxcr(guts, mdata->dma_id[0], mdata->dma_channel_id[0], + CCSR_GUTS_DMUXCR_SSI); + + guts_set_dmuxcr(guts, mdata->dma_id[1], mdata->dma_channel_id[1], + CCSR_GUTS_DMUXCR_SSI); + + iounmap(guts); + + return 0; +} + +/** + * p1022_ds_startup: program the board with various hardware parameters + * + * This function takes board-specific information, like clock frequencies + * and serial data formats, and passes that information to the codec and + * transport drivers. + */ +static int p1022_ds_startup(struct snd_pcm_substream *substream) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct machine_data *mdata = + container_of(rtd->card, struct machine_data, card); + struct device *dev = rtd->card->dev; + int ret = 0; + + /* Tell the codec driver what the serial protocol is. */ + ret = snd_soc_dai_set_fmt(rtd->codec_dai, mdata->dai_format); + if (ret < 0) { + dev_err(dev, "could not set codec driver audio format\n"); + return ret; + } + + /* + * Tell the codec driver what the MCLK frequency is, and whether it's + * a slave or master. + */ + ret = snd_soc_dai_set_sysclk(rtd->codec_dai, 0, mdata->clk_frequency, + mdata->codec_clk_direction); + if (ret < 0) { + dev_err(dev, "could not set codec driver clock params\n"); + return ret; + } + + return 0; +} + +/** + * p1022_ds_machine_remove: Remove the sound device + * + * This function is called to remove the sound device for one SSI. We + * de-program the DMACR and PMUXCR register. + */ +static int p1022_ds_machine_remove(struct platform_device *sound_device) +{ + struct snd_soc_card *card = platform_get_drvdata(sound_device); + struct machine_data *mdata = + container_of(card, struct machine_data, card); + struct ccsr_guts_85xx __iomem *guts; + + guts = ioremap(guts_phys, sizeof(struct ccsr_guts_85xx)); + if (!guts) { + dev_err(card->dev, "could not map global utilities\n"); + return -ENOMEM; + } + + /* Restore the signal routing */ + clrbits32(&guts->pmuxcr, CCSR_GUTS_PMUXCR_UART0_I2C1_MASK); + clrbits32(&guts->pmuxcr, CCSR_GUTS_PMUXCR_SSI_DMA_TDM_MASK); + guts_set_dmuxcr(guts, mdata->dma_id[0], mdata->dma_channel_id[0], 0); + guts_set_dmuxcr(guts, mdata->dma_id[1], mdata->dma_channel_id[1], 0); + + iounmap(guts); + + return 0; +} + +/** + * p1022_ds_ops: ASoC machine driver operations + */ +static struct snd_soc_ops p1022_ds_ops = { + .startup = p1022_ds_startup, +}; + +/** + * get_node_by_phandle_name - get a node by its phandle name + * + * This function takes a node, the name of a property in that node, and a + * compatible string. Assuming the property is a phandle to another node, + * it returns that node, (optionally) if that node is compatible. + * + * If the property is not a phandle, or the node it points to is not compatible + * with the specific string, then NULL is returned. + */ +static struct device_node *get_node_by_phandle_name(struct device_node *np, + const char *name, const char *compatible) +{ + np = of_parse_phandle(np, name, 0); + if (!np) + return NULL; + + if (!of_device_is_compatible(np, compatible)) { + of_node_put(np); + return NULL; + } + + return np; +} + +/** + * get_parent_cell_index -- return the cell-index of the parent of a node + * + * Return the value of the cell-index property of the parent of the given + * node. This is used for DMA channel nodes that need to know the DMA ID + * of the controller they are on. + */ +static int get_parent_cell_index(struct device_node *np) +{ + struct device_node *parent = of_get_parent(np); + const u32 *iprop; + int ret = -1; + + if (!parent) + return -1; + + iprop = of_get_property(parent, "cell-index", NULL); + if (iprop) + ret = *iprop; + + of_node_put(parent); + + return ret; +} + +/** + * codec_node_dev_name - determine the dev_name for a codec node + * + * This function determines the dev_name for an I2C node. This is the name + * that would be returned by dev_name() if this device_node were part of a + * 'struct device' It's ugly and hackish, but it works. + * + * The dev_name for such devices include the bus number and I2C address. For + * example, "cs4270-codec.0-004f". + */ +static int codec_node_dev_name(struct device_node *np, char *buf, size_t len) +{ + const u32 *iprop; + int bus, addr; + char temp[DAI_NAME_SIZE]; + + of_modalias_node(np, temp, DAI_NAME_SIZE); + + iprop = of_get_property(np, "reg", NULL); + if (!iprop) + return -EINVAL; + + addr = *iprop; + + bus = get_parent_cell_index(np); + if (bus < 0) + return bus; + + snprintf(buf, len, "%s-codec.%u-%04x", temp, bus, addr); + + return 0; +} + +static int get_dma_channel(struct device_node *ssi_np, + const char *compatible, + struct snd_soc_dai_link *dai, + unsigned int *dma_channel_id, + unsigned int *dma_id) +{ + struct resource res; + struct device_node *dma_channel_np; + const u32 *iprop; + int ret; + + dma_channel_np = get_node_by_phandle_name(ssi_np, compatible, + "fsl,ssi-dma-channel"); + if (!dma_channel_np) + return -EINVAL; + + /* Determine the dev_name for the device_node. This code mimics the + * behavior of of_device_make_bus_id(). We need this because ASoC uses + * the dev_name() of the device to match the platform (DMA) device with + * the CPU (SSI) device. It's all ugly and hackish, but it works (for + * now). + * + * dai->platform name should already point to an allocated buffer. + */ + ret = of_address_to_resource(dma_channel_np, 0, &res); + if (ret) + return ret; + snprintf((char *)dai->platform_name, DAI_NAME_SIZE, "%llx.%s", + (unsigned long long) res.start, dma_channel_np->name); + + iprop = of_get_property(dma_channel_np, "cell-index", NULL); + if (!iprop) { + of_node_put(dma_channel_np); + return -EINVAL; + } + + *dma_channel_id = *iprop; + *dma_id = get_parent_cell_index(dma_channel_np); + of_node_put(dma_channel_np); + + return 0; +} + +/** + * p1022_ds_probe: platform probe function for the machine driver + * + * Although this is a machine driver, the SSI node is the "master" node with + * respect to audio hardware connections. Therefore, we create a new ASoC + * device for each new SSI node that has a codec attached. + */ +static int p1022_ds_probe(struct platform_device *pdev) +{ + struct device *dev = pdev->dev.parent; + /* ssi_pdev is the platform device for the SSI node that probed us */ + struct platform_device *ssi_pdev = + container_of(dev, struct platform_device, dev); + struct device_node *np = ssi_pdev->dev.of_node; + struct device_node *codec_np = NULL; + struct platform_device *sound_device = NULL; + struct machine_data *mdata; + int ret = -ENODEV; + const char *sprop; + const u32 *iprop; + + /* Find the codec node for this SSI. */ + codec_np = of_parse_phandle(np, "codec-handle", 0); + if (!codec_np) { + dev_err(dev, "could not find codec node\n"); + return -EINVAL; + } + + mdata = kzalloc(sizeof(struct machine_data), GFP_KERNEL); + if (!mdata) + return -ENOMEM; + + mdata->dai[0].cpu_dai_name = dev_name(&ssi_pdev->dev); + mdata->dai[0].ops = &p1022_ds_ops; + + /* Determine the codec name, it will be used as the codec DAI name */ + ret = codec_node_dev_name(codec_np, mdata->codec_name, DAI_NAME_SIZE); + if (ret) { + dev_err(&pdev->dev, "invalid codec node %s\n", + codec_np->full_name); + ret = -EINVAL; + goto error; + } + mdata->dai[0].codec_name = mdata->codec_name; + + /* We register two DAIs per SSI, one for playback and the other for + * capture. We support codecs that have separate DAIs for both playback + * and capture. + */ + memcpy(&mdata->dai[1], &mdata->dai[0], sizeof(struct snd_soc_dai_link)); + + /* The DAI names from the codec (snd_soc_dai_driver.name) */ + mdata->dai[0].codec_dai_name = "wm8776-hifi-playback"; + mdata->dai[1].codec_dai_name = "wm8776-hifi-capture"; + + /* Get the device ID */ + iprop = of_get_property(np, "cell-index", NULL); + if (!iprop) { + dev_err(&pdev->dev, "cell-index property not found\n"); + ret = -EINVAL; + goto error; + } + mdata->ssi_id = *iprop; + + /* Get the serial format and clock direction. */ + sprop = of_get_property(np, "fsl,mode", NULL); + if (!sprop) { + dev_err(&pdev->dev, "fsl,mode property not found\n"); + ret = -EINVAL; + goto error; + } + + if (strcasecmp(sprop, "i2s-slave") == 0) { + mdata->dai_format = SND_SOC_DAIFMT_I2S; + mdata->codec_clk_direction = SND_SOC_CLOCK_OUT; + mdata->cpu_clk_direction = SND_SOC_CLOCK_IN; + + /* In i2s-slave mode, the codec has its own clock source, so we + * need to get the frequency from the device tree and pass it to + * the codec driver. + */ + iprop = of_get_property(codec_np, "clock-frequency", NULL); + if (!iprop || !*iprop) { + dev_err(&pdev->dev, "codec bus-frequency " + "property is missing or invalid\n"); + ret = -EINVAL; + goto error; + } + mdata->clk_frequency = *iprop; + } else if (strcasecmp(sprop, "i2s-master") == 0) { + mdata->dai_format = SND_SOC_DAIFMT_I2S; + mdata->codec_clk_direction = SND_SOC_CLOCK_IN; + mdata->cpu_clk_direction = SND_SOC_CLOCK_OUT; + } else if (strcasecmp(sprop, "lj-slave") == 0) { + mdata->dai_format = SND_SOC_DAIFMT_LEFT_J; + mdata->codec_clk_direction = SND_SOC_CLOCK_OUT; + mdata->cpu_clk_direction = SND_SOC_CLOCK_IN; + } else if (strcasecmp(sprop, "lj-master") == 0) { + mdata->dai_format = SND_SOC_DAIFMT_LEFT_J; + mdata->codec_clk_direction = SND_SOC_CLOCK_IN; + mdata->cpu_clk_direction = SND_SOC_CLOCK_OUT; + } else if (strcasecmp(sprop, "rj-slave") == 0) { + mdata->dai_format = SND_SOC_DAIFMT_RIGHT_J; + mdata->codec_clk_direction = SND_SOC_CLOCK_OUT; + mdata->cpu_clk_direction = SND_SOC_CLOCK_IN; + } else if (strcasecmp(sprop, "rj-master") == 0) { + mdata->dai_format = SND_SOC_DAIFMT_RIGHT_J; + mdata->codec_clk_direction = SND_SOC_CLOCK_IN; + mdata->cpu_clk_direction = SND_SOC_CLOCK_OUT; + } else if (strcasecmp(sprop, "ac97-slave") == 0) { + mdata->dai_format = SND_SOC_DAIFMT_AC97; + mdata->codec_clk_direction = SND_SOC_CLOCK_OUT; + mdata->cpu_clk_direction = SND_SOC_CLOCK_IN; + } else if (strcasecmp(sprop, "ac97-master") == 0) { + mdata->dai_format = SND_SOC_DAIFMT_AC97; + mdata->codec_clk_direction = SND_SOC_CLOCK_IN; + mdata->cpu_clk_direction = SND_SOC_CLOCK_OUT; + } else { + dev_err(&pdev->dev, + "unrecognized fsl,mode property '%s'\n", sprop); + ret = -EINVAL; + goto error; + } + + if (!mdata->clk_frequency) { + dev_err(&pdev->dev, "unknown clock frequency\n"); + ret = -EINVAL; + goto error; + } + + /* Find the playback DMA channel to use. */ + mdata->dai[0].platform_name = mdata->platform_name[0]; + ret = get_dma_channel(np, "fsl,playback-dma", &mdata->dai[0], + &mdata->dma_channel_id[0], + &mdata->dma_id[0]); + if (ret) { + dev_err(&pdev->dev, "missing/invalid playback DMA phandle\n"); + goto error; + } + + /* Find the capture DMA channel to use. */ + mdata->dai[1].platform_name = mdata->platform_name[1]; + ret = get_dma_channel(np, "fsl,capture-dma", &mdata->dai[1], + &mdata->dma_channel_id[1], + &mdata->dma_id[1]); + if (ret) { + dev_err(&pdev->dev, "missing/invalid capture DMA phandle\n"); + goto error; + } + + /* Initialize our DAI data structure. */ + mdata->dai[0].stream_name = "playback"; + mdata->dai[1].stream_name = "capture"; + mdata->dai[0].name = mdata->dai[0].stream_name; + mdata->dai[1].name = mdata->dai[1].stream_name; + + mdata->card.probe = p1022_ds_machine_probe; + mdata->card.remove = p1022_ds_machine_remove; + mdata->card.name = pdev->name; /* The platform driver name */ + mdata->card.num_links = 2; + mdata->card.dai_link = mdata->dai; + + /* Allocate a new audio platform device structure */ + sound_device = platform_device_alloc("soc-audio", -1); + if (!sound_device) { + dev_err(&pdev->dev, "platform device alloc failed\n"); + ret = -ENOMEM; + goto error; + } + + /* Associate the card data with the sound device */ + platform_set_drvdata(sound_device, &mdata->card); + + /* Register with ASoC */ + ret = platform_device_add(sound_device); + if (ret) { + dev_err(&pdev->dev, "platform device add failed\n"); + goto error; + } + + of_node_put(codec_np); + + return 0; + +error: + of_node_put(codec_np); + + if (sound_device) + platform_device_unregister(sound_device); + + kfree(mdata); + + return ret; +} + +/** + * p1022_ds_remove: remove the platform device + * + * This function is called when the platform device is removed. + */ +static int __devexit p1022_ds_remove(struct platform_device *pdev) +{ + struct platform_device *sound_device = dev_get_drvdata(&pdev->dev); + struct snd_soc_card *card = platform_get_drvdata(sound_device); + struct machine_data *mdata = + container_of(card, struct machine_data, card); + + platform_device_unregister(sound_device); + + kfree(mdata); + sound_device->dev.platform_data = NULL; + + dev_set_drvdata(&pdev->dev, NULL); + + return 0; +} + +static struct platform_driver p1022_ds_driver = { + .probe = p1022_ds_probe, + .remove = __devexit_p(p1022_ds_remove), + .driver = { + /* The name must match the 'model' property in the device tree, + * in lowercase letters, but only the part after that last + * comma. This is because some model properties have a "fsl," + * prefix. + */ + .name = "snd-soc-p1022", + .owner = THIS_MODULE, + }, +}; + +/** + * p1022_ds_init: machine driver initialization. + * + * This function is called when this module is loaded. + */ +static int __init p1022_ds_init(void) +{ + struct device_node *guts_np; + struct resource res; + + pr_info("Freescale P1022 DS ALSA SoC machine driver\n"); + + /* Get the physical address of the global utilities registers */ + guts_np = of_find_compatible_node(NULL, NULL, "fsl,p1022-guts"); + if (of_address_to_resource(guts_np, 0, &res)) { + pr_err("p1022-ds: missing/invalid global utilities node\n"); + return -EINVAL; + } + guts_phys = res.start; + of_node_put(guts_np); + + return platform_driver_register(&p1022_ds_driver); +} + +/** + * p1022_ds_exit: machine driver exit + * + * This function is called when this driver is unloaded. + */ +static void __exit p1022_ds_exit(void) +{ + platform_driver_unregister(&p1022_ds_driver); +} + +module_init(p1022_ds_init); +module_exit(p1022_ds_exit); + +MODULE_AUTHOR("Timur Tabi "); +MODULE_DESCRIPTION("Freescale P1022 DS ALSA SoC machine driver"); +MODULE_LICENSE("GPL v2"); -- cgit v1.2.3 From 3fabe089ad8b8f238bc9de3e7586ae8d2a81f57c Mon Sep 17 00:00:00 2001 From: "Matti J. Aaltonen" Date: Fri, 20 Aug 2010 12:32:46 +0300 Subject: ASoC: TI WL1273 FM Radio Codec. This is an ALSA codec for the Texas Instruments WL1273 FM Radio. Signed-off-by: Matti J. Aaltonen Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/wl1273.c | 525 ++++++++++++++++++++++++++++++++++++++++++++++ sound/soc/codecs/wl1273.h | 101 +++++++++ 2 files changed, 626 insertions(+) create mode 100644 sound/soc/codecs/wl1273.c create mode 100644 sound/soc/codecs/wl1273.h (limited to 'sound') diff --git a/sound/soc/codecs/wl1273.c b/sound/soc/codecs/wl1273.c new file mode 100644 index 000000000000..0cd590970883 --- /dev/null +++ b/sound/soc/codecs/wl1273.c @@ -0,0 +1,525 @@ +/* + * ALSA SoC WL1273 codec driver + * + * Author: Matti Aaltonen, + * + * Copyright: (C) 2010 Nokia Corporation + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "wl1273.h" + +enum wl1273_mode { WL1273_MODE_BT, WL1273_MODE_FM_RX, WL1273_MODE_FM_TX }; + +/* codec private data */ +struct wl1273_priv { + enum wl1273_mode mode; + struct wl1273_core *core; + unsigned int channels; +}; + +static int snd_wl1273_fm_set_i2s_mode(struct wl1273_core *core, + int rate, int width) +{ + struct device *dev = &core->i2c_dev->dev; + int r = 0; + u16 mode; + + dev_dbg(dev, "rate: %d\n", rate); + dev_dbg(dev, "width: %d\n", width); + + mutex_lock(&core->lock); + + mode = core->i2s_mode & ~WL1273_IS2_WIDTH & ~WL1273_IS2_RATE; + + switch (rate) { + case 48000: + mode |= WL1273_IS2_RATE_48K; + break; + case 44100: + mode |= WL1273_IS2_RATE_44_1K; + break; + case 32000: + mode |= WL1273_IS2_RATE_32K; + break; + case 22050: + mode |= WL1273_IS2_RATE_22_05K; + break; + case 16000: + mode |= WL1273_IS2_RATE_16K; + break; + case 12000: + mode |= WL1273_IS2_RATE_12K; + break; + case 11025: + mode |= WL1273_IS2_RATE_11_025; + break; + case 8000: + mode |= WL1273_IS2_RATE_8K; + break; + default: + dev_err(dev, "Sampling rate: %d not supported\n", rate); + r = -EINVAL; + goto out; + } + + switch (width) { + case 16: + mode |= WL1273_IS2_WIDTH_32; + break; + case 20: + mode |= WL1273_IS2_WIDTH_40; + break; + case 24: + mode |= WL1273_IS2_WIDTH_48; + break; + case 25: + mode |= WL1273_IS2_WIDTH_50; + break; + case 30: + mode |= WL1273_IS2_WIDTH_60; + break; + case 32: + mode |= WL1273_IS2_WIDTH_64; + break; + case 40: + mode |= WL1273_IS2_WIDTH_80; + break; + case 48: + mode |= WL1273_IS2_WIDTH_96; + break; + case 64: + mode |= WL1273_IS2_WIDTH_128; + break; + default: + dev_err(dev, "Data width: %d not supported\n", width); + r = -EINVAL; + goto out; + } + + dev_dbg(dev, "WL1273_I2S_DEF_MODE: 0x%04x\n", WL1273_I2S_DEF_MODE); + dev_dbg(dev, "core->i2s_mode: 0x%04x\n", core->i2s_mode); + dev_dbg(dev, "mode: 0x%04x\n", mode); + + if (core->i2s_mode != mode) { + r = wl1273_fm_write_cmd(core, WL1273_I2S_MODE_CONFIG_SET, mode); + if (r) + goto out; + + core->i2s_mode = mode; + r = wl1273_fm_write_cmd(core, WL1273_AUDIO_ENABLE, + WL1273_AUDIO_ENABLE_I2S); + if (r) + goto out; + } +out: + mutex_unlock(&core->lock); + + return r; +} + +static int snd_wl1273_fm_set_channel_number(struct wl1273_core *core, + int channel_number) +{ + struct i2c_client *client = core->i2c_dev; + struct device *dev = &client->dev; + int r = 0; + + dev_dbg(dev, "%s\n", __func__); + + mutex_lock(&core->lock); + + if (core->channel_number == channel_number) + goto out; + + if (channel_number == 1 && core->mode == WL1273_MODE_RX) + r = wl1273_fm_write_cmd(core, WL1273_MOST_MODE_SET, + WL1273_RX_MONO); + else if (channel_number == 1 && core->mode == WL1273_MODE_TX) + r = wl1273_fm_write_cmd(core, WL1273_MONO_SET, + WL1273_TX_MONO); + else if (channel_number == 2 && core->mode == WL1273_MODE_RX) + r = wl1273_fm_write_cmd(core, WL1273_MOST_MODE_SET, + WL1273_RX_STEREO); + else if (channel_number == 2 && core->mode == WL1273_MODE_TX) + r = wl1273_fm_write_cmd(core, WL1273_MONO_SET, + WL1273_TX_STEREO); + else + r = -EINVAL; +out: + mutex_unlock(&core->lock); + + return r; +} + +static int snd_wl1273_get_audio_route(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + + ucontrol->value.integer.value[0] = wl1273->mode; + + return 0; +} + +static const char *wl1273_audio_route[] = { "Bt", "FmRx", "FmTx" }; + +static int snd_wl1273_set_audio_route(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + + /* Do not allow changes while stream is running */ + if (codec->active) + return -EPERM; + + if (ucontrol->value.integer.value[0] < 0 || + ucontrol->value.integer.value[0] >= ARRAY_SIZE(wl1273_audio_route)) + return -EINVAL; + + wl1273->mode = ucontrol->value.integer.value[0]; + + return 1; +} + +static const struct soc_enum wl1273_enum = + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(wl1273_audio_route), wl1273_audio_route); + +static int snd_wl1273_fm_audio_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + + dev_dbg(codec->dev, "%s: enter.\n", __func__); + + ucontrol->value.integer.value[0] = wl1273->core->audio_mode; + + return 0; +} + +static int snd_wl1273_fm_audio_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + int val, r = 0; + + dev_dbg(codec->dev, "%s: enter.\n", __func__); + + val = ucontrol->value.integer.value[0]; + if (wl1273->core->audio_mode == val) + return 0; + + r = wl1273_fm_set_audio(wl1273->core, val); + if (r < 0) + return r; + + return 1; +} + +static const char *wl1273_audio_strings[] = { "Digital", "Analog" }; + +static const struct soc_enum wl1273_audio_enum = + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(wl1273_audio_strings), + wl1273_audio_strings); + +static int snd_wl1273_fm_volume_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + + dev_dbg(codec->dev, "%s: enter.\n", __func__); + + ucontrol->value.integer.value[0] = wl1273->core->volume; + + return 0; +} + +static int snd_wl1273_fm_volume_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + int r; + + dev_dbg(codec->dev, "%s: enter.\n", __func__); + + r = wl1273_fm_set_volume(wl1273->core, + ucontrol->value.integer.value[0]); + if (r) + return r; + + return 1; +} + +static const struct snd_kcontrol_new wl1273_controls[] = { + SOC_ENUM_EXT("Codec Mode", wl1273_enum, + snd_wl1273_get_audio_route, snd_wl1273_set_audio_route), + SOC_ENUM_EXT("Audio Switch", wl1273_audio_enum, + snd_wl1273_fm_audio_get, snd_wl1273_fm_audio_put), + SOC_SINGLE_EXT("Volume", 0, 0, WL1273_MAX_VOLUME, 0, + snd_wl1273_fm_volume_get, snd_wl1273_fm_volume_put), +}; + +static int wl1273_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_codec *codec = rtd->codec; + struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + + switch (wl1273->mode) { + case WL1273_MODE_BT: + snd_pcm_hw_constraint_minmax(substream->runtime, + SNDRV_PCM_HW_PARAM_RATE, + 8000, 8000); + snd_pcm_hw_constraint_minmax(substream->runtime, + SNDRV_PCM_HW_PARAM_CHANNELS, 1, 1); + break; + case WL1273_MODE_FM_RX: + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + pr_err("Cannot play in RX mode.\n"); + return -EINVAL; + } + break; + case WL1273_MODE_FM_TX: + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { + pr_err("Cannot capture in TX mode.\n"); + return -EINVAL; + } + break; + default: + return -EINVAL; + break; + } + + return 0; +} + +static int wl1273_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(rtd->codec); + struct wl1273_core *core = wl1273->core; + unsigned int rate, width, r; + + if (params_format(params) != SNDRV_PCM_FORMAT_S16_LE) { + pr_err("Only SNDRV_PCM_FORMAT_S16_LE supported.\n"); + return -EINVAL; + } + + rate = params_rate(params); + width = hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS)->min; + + if (wl1273->mode == WL1273_MODE_BT) { + if (rate != 8000) { + pr_err("Rate %d not supported.\n", params_rate(params)); + return -EINVAL; + } + + if (params_channels(params) != 1) { + pr_err("Only mono supported.\n"); + return -EINVAL; + } + + return 0; + } + + if (wl1273->mode == WL1273_MODE_FM_TX && + substream->stream == SNDRV_PCM_STREAM_CAPTURE) { + pr_err("Only playback supported with TX.\n"); + return -EINVAL; + } + + if (wl1273->mode == WL1273_MODE_FM_RX && + substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + pr_err("Only capture supported with RX.\n"); + return -EINVAL; + } + + if (wl1273->mode != WL1273_MODE_FM_RX && + wl1273->mode != WL1273_MODE_FM_TX) { + pr_err("Unexpected mode: %d.\n", wl1273->mode); + return -EINVAL; + } + + r = snd_wl1273_fm_set_i2s_mode(core, rate, width); + if (r) + return r; + + wl1273->channels = params_channels(params); + r = snd_wl1273_fm_set_channel_number(core, wl1273->channels); + if (r) + return r; + + return 0; +} + +static struct snd_soc_dai_ops wl1273_dai_ops = { + .startup = wl1273_startup, + .hw_params = wl1273_hw_params, +}; + +static struct snd_soc_dai_driver wl1273_dai = { + .name = "wl1273-fm", + .playback = { + .stream_name = "Playback", + .channels_min = 1, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = SNDRV_PCM_FMTBIT_S16_LE}, + .capture = { + .stream_name = "Capture", + .channels_min = 1, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = SNDRV_PCM_FMTBIT_S16_LE}, + .ops = &wl1273_dai_ops, +}; + +/* Audio interface format for the soc_card driver */ +int wl1273_get_format(struct snd_soc_codec *codec, unsigned int *fmt) +{ + struct wl1273_priv *wl1273; + + if (codec == NULL || fmt == NULL) + return -EINVAL; + + wl1273 = snd_soc_codec_get_drvdata(codec); + + switch (wl1273->mode) { + case WL1273_MODE_FM_RX: + case WL1273_MODE_FM_TX: + *fmt = SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBM_CFM; + + break; + case WL1273_MODE_BT: + *fmt = SND_SOC_DAIFMT_DSP_A | + SND_SOC_DAIFMT_IB_NF | + SND_SOC_DAIFMT_CBM_CFM; + + break; + default: + return -EINVAL; + } + + return 0; +} +EXPORT_SYMBOL_GPL(wl1273_get_format); + +static int wl1273_probe(struct snd_soc_codec *codec) +{ + struct wl1273_core **core = codec->dev->platform_data; + struct wl1273_priv *wl1273; + int r; + + dev_dbg(codec->dev, "%s.\n", __func__); + + if (!core) { + dev_err(codec->dev, "Platform data is missing.\n"); + return -EINVAL; + } + + wl1273 = kzalloc(sizeof(struct wl1273_priv), GFP_KERNEL); + if (wl1273 == NULL) { + dev_err(codec->dev, "Cannot allocate memory.\n"); + return -ENOMEM; + } + + wl1273->mode = WL1273_MODE_BT; + wl1273->core = *core; + + snd_soc_codec_set_drvdata(codec, wl1273); + mutex_init(&codec->mutex); + + r = snd_soc_add_controls(codec, wl1273_controls, + ARRAY_SIZE(wl1273_controls)); + if (r) + kfree(wl1273); + + return r; +} + +static int wl1273_remove(struct snd_soc_codec *codec) +{ + struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + + dev_dbg(codec->dev, "%s\n", __func__); + kfree(wl1273); + + return 0; +} + +static struct snd_soc_codec_driver soc_codec_dev_wl1273 = { + .probe = wl1273_probe, + .remove = wl1273_remove, +}; + +static int __devinit wl1273_platform_probe(struct platform_device *pdev) +{ + return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wl1273, + &wl1273_dai, 1); +} + +static int __devexit wl1273_platform_remove(struct platform_device *pdev) +{ + snd_soc_unregister_codec(&pdev->dev); + return 0; +} + +MODULE_ALIAS("platform:wl1273-codec"); + +static struct platform_driver wl1273_platform_driver = { + .driver = { + .name = "wl1273-codec", + .owner = THIS_MODULE, + }, + .probe = wl1273_platform_probe, + .remove = __devexit_p(wl1273_platform_remove), +}; + +static int __init wl1273_init(void) +{ + return platform_driver_register(&wl1273_platform_driver); +} +module_init(wl1273_init); + +static void __exit wl1273_exit(void) +{ + platform_driver_unregister(&wl1273_platform_driver); +} +module_exit(wl1273_exit); + +MODULE_AUTHOR("Matti Aaltonen "); +MODULE_DESCRIPTION("ASoC WL1273 codec driver"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/wl1273.h b/sound/soc/codecs/wl1273.h new file mode 100644 index 000000000000..14ed027fdcfc --- /dev/null +++ b/sound/soc/codecs/wl1273.h @@ -0,0 +1,101 @@ +/* + * sound/soc/codec/wl1273.h + * + * ALSA SoC WL1273 codec driver + * + * Copyright (C) Nokia Corporation + * Author: Matti Aaltonen + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef __WL1273_CODEC_H__ +#define __WL1273_CODEC_H__ + +/* I2S protocol, left channel first, data width 16 bits */ +#define WL1273_PCM_DEF_MODE 0x00 + +/* Rx */ +#define WL1273_AUDIO_ENABLE_I2S (1 << 0) +#define WL1273_AUDIO_ENABLE_ANALOG (1 << 1) + +/* Tx */ +#define WL1273_AUDIO_IO_SET_ANALOG 0 +#define WL1273_AUDIO_IO_SET_I2S 1 + +#define WL1273_POWER_SET_OFF 0 +#define WL1273_POWER_SET_FM (1 << 0) +#define WL1273_POWER_SET_RDS (1 << 1) +#define WL1273_POWER_SET_RETENTION (1 << 4) + +#define WL1273_PUPD_SET_OFF 0x00 +#define WL1273_PUPD_SET_ON 0x01 +#define WL1273_PUPD_SET_RETENTION 0x10 + +/* I2S mode */ +#define WL1273_IS2_WIDTH_32 0x0 +#define WL1273_IS2_WIDTH_40 0x1 +#define WL1273_IS2_WIDTH_22_23 0x2 +#define WL1273_IS2_WIDTH_23_22 0x3 +#define WL1273_IS2_WIDTH_48 0x4 +#define WL1273_IS2_WIDTH_50 0x5 +#define WL1273_IS2_WIDTH_60 0x6 +#define WL1273_IS2_WIDTH_64 0x7 +#define WL1273_IS2_WIDTH_80 0x8 +#define WL1273_IS2_WIDTH_96 0x9 +#define WL1273_IS2_WIDTH_128 0xa +#define WL1273_IS2_WIDTH 0xf + +#define WL1273_IS2_FORMAT_STD (0x0 << 4) +#define WL1273_IS2_FORMAT_LEFT (0x1 << 4) +#define WL1273_IS2_FORMAT_RIGHT (0x2 << 4) +#define WL1273_IS2_FORMAT_USER (0x3 << 4) + +#define WL1273_IS2_MASTER (0x0 << 6) +#define WL1273_IS2_SLAVEW (0x1 << 6) + +#define WL1273_IS2_TRI_AFTER_SENDING (0x0 << 7) +#define WL1273_IS2_TRI_ALWAYS_ACTIVE (0x1 << 7) + +#define WL1273_IS2_SDOWS_RR (0x0 << 8) +#define WL1273_IS2_SDOWS_RF (0x1 << 8) +#define WL1273_IS2_SDOWS_FR (0x2 << 8) +#define WL1273_IS2_SDOWS_FF (0x3 << 8) + +#define WL1273_IS2_TRI_OPT (0x0 << 10) +#define WL1273_IS2_TRI_ALWAYS (0x1 << 10) + +#define WL1273_IS2_RATE_48K (0x0 << 12) +#define WL1273_IS2_RATE_44_1K (0x1 << 12) +#define WL1273_IS2_RATE_32K (0x2 << 12) +#define WL1273_IS2_RATE_22_05K (0x4 << 12) +#define WL1273_IS2_RATE_16K (0x5 << 12) +#define WL1273_IS2_RATE_12K (0x8 << 12) +#define WL1273_IS2_RATE_11_025 (0x9 << 12) +#define WL1273_IS2_RATE_8K (0xa << 12) +#define WL1273_IS2_RATE (0xf << 12) + +#define WL1273_I2S_DEF_MODE (WL1273_IS2_WIDTH_32 | \ + WL1273_IS2_FORMAT_STD | \ + WL1273_IS2_MASTER | \ + WL1273_IS2_TRI_AFTER_SENDING | \ + WL1273_IS2_SDOWS_RR | \ + WL1273_IS2_TRI_OPT | \ + WL1273_IS2_RATE_48K) + +int wl1273_get_format(struct snd_soc_codec *codec, unsigned int *fmt); + +#endif /* End of __WL1273_CODEC_H__ */ -- cgit v1.2.3 From 26b01ccdc8ded270a1a65721b99acacf0c44e088 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Wed, 18 Aug 2010 20:20:55 +0100 Subject: ASoC: Don't call DAI registration for CODECs with no DAI Otherwise we generate worrying (but benign) warnings for amps. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/soc-core.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'sound') diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 7093c1787128..65352c7d4b7f 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -3122,10 +3122,12 @@ int snd_soc_register_codec(struct device *dev, fixup_codec_formats(&dai_drv[i].capture); } - /* register DAIs */ - ret = snd_soc_register_dais(dev, dai_drv, num_dai); - if (ret < 0) + /* register any DAIs */ + if (num_dai) { + ret = snd_soc_register_dais(dev, dai_drv, num_dai); + if (ret < 0) goto error; + } mutex_lock(&client_mutex); list_add(&codec->list, &codec_list); @@ -3164,8 +3166,9 @@ void snd_soc_unregister_codec(struct device *dev) return; found: - for (i = 0; i < codec->num_dai; i++) - snd_soc_unregister_dai(dev); + if (codec->num_dai) + for (i = 0; i < codec->num_dai; i++) + snd_soc_unregister_dai(dev); mutex_lock(&client_mutex); list_del(&codec->list); -- cgit v1.2.3 From 38fec7272bc033b75a0eb8976c56c2024d371b7d Mon Sep 17 00:00:00 2001 From: Timur Tabi Date: Thu, 19 Aug 2010 15:26:58 -0500 Subject: ASoC: mpc8610: replace of_device with platform_device 'struct of_device' no longer exists, and its functionality has been merged into platform_device. Update the MPC8610 HPCD audio drivers (fsl_ssi, fsl_dma, and mpc8610_hpcd) accordingly. Also add a #include for slab.h, which is now needed for kmalloc and kfree. Signed-off-by: Timur Tabi Signed-off-by: Mark Brown --- sound/soc/fsl/fsl_dma.c | 23 ++++++++++++----------- sound/soc/fsl/fsl_ssi.c | 42 +++++++++++++++++++++--------------------- sound/soc/fsl/mpc8610_hpcd.c | 10 ++++++---- 3 files changed, 39 insertions(+), 36 deletions(-) (limited to 'sound') diff --git a/sound/soc/fsl/fsl_dma.c b/sound/soc/fsl/fsl_dma.c index f039e8db0765..4cf98c03af22 100644 --- a/sound/soc/fsl/fsl_dma.c +++ b/sound/soc/fsl/fsl_dma.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -895,11 +896,11 @@ static struct snd_pcm_ops fsl_dma_ops = { .pointer = fsl_dma_pointer, }; -static int __devinit fsl_soc_dma_probe(struct of_device *of_dev, +static int __devinit fsl_soc_dma_probe(struct platform_device *pdev, const struct of_device_id *match) { struct dma_object *dma; - struct device_node *np = of_dev->dev.of_node; + struct device_node *np = pdev->dev.of_node; struct device_node *ssi_np; struct resource res; const uint32_t *iprop; @@ -908,13 +909,13 @@ static int __devinit fsl_soc_dma_probe(struct of_device *of_dev, /* Find the SSI node that points to us. */ ssi_np = find_ssi_node(np); if (!ssi_np) { - dev_err(&of_dev->dev, "cannot find parent SSI node\n"); + dev_err(&pdev->dev, "cannot find parent SSI node\n"); return -ENODEV; } ret = of_address_to_resource(ssi_np, 0, &res); if (ret) { - dev_err(&of_dev->dev, "could not determine resources for %s\n", + dev_err(&pdev->dev, "could not determine resources for %s\n", ssi_np->full_name); of_node_put(ssi_np); return ret; @@ -922,7 +923,7 @@ static int __devinit fsl_soc_dma_probe(struct of_device *of_dev, dma = kzalloc(sizeof(*dma) + strlen(np->full_name), GFP_KERNEL); if (!dma) { - dev_err(&of_dev->dev, "could not allocate dma object\n"); + dev_err(&pdev->dev, "could not allocate dma object\n"); of_node_put(ssi_np); return -ENOMEM; } @@ -945,9 +946,9 @@ static int __devinit fsl_soc_dma_probe(struct of_device *of_dev, of_node_put(ssi_np); - ret = snd_soc_register_platform(&of_dev->dev, &dma->dai); + ret = snd_soc_register_platform(&pdev->dev, &dma->dai); if (ret) { - dev_err(&of_dev->dev, "could not register platform\n"); + dev_err(&pdev->dev, "could not register platform\n"); kfree(dma); return ret; } @@ -955,16 +956,16 @@ static int __devinit fsl_soc_dma_probe(struct of_device *of_dev, dma->channel = of_iomap(np, 0); dma->irq = irq_of_parse_and_map(np, 0); - dev_set_drvdata(&of_dev->dev, dma); + dev_set_drvdata(&pdev->dev, dma); return 0; } -static int __devexit fsl_soc_dma_remove(struct of_device *of_dev) +static int __devexit fsl_soc_dma_remove(struct platform_device *pdev) { - struct dma_object *dma = dev_get_drvdata(&of_dev->dev); + struct dma_object *dma = dev_get_drvdata(&pdev->dev); - snd_soc_unregister_platform(&of_dev->dev); + snd_soc_unregister_platform(&pdev->dev); iounmap(dma->channel); irq_dispose_mapping(dma->irq); kfree(dma); diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index d1c855ade8fb..4cc167a7aeb8 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c @@ -624,13 +624,13 @@ static void make_lowercase(char *s) } } -static int __devinit fsl_ssi_probe(struct of_device *of_dev, +static int __devinit fsl_ssi_probe(struct platform_device *pdev, const struct of_device_id *match) { struct fsl_ssi_private *ssi_private; int ret = 0; struct device_attribute *dev_attr = NULL; - struct device_node *np = of_dev->dev.of_node; + struct device_node *np = pdev->dev.of_node; const char *p, *sprop; const uint32_t *iprop; struct resource res; @@ -645,14 +645,14 @@ static int __devinit fsl_ssi_probe(struct of_device *of_dev, /* Check for a codec-handle property. */ if (!of_get_property(np, "codec-handle", NULL)) { - dev_err(&of_dev->dev, "missing codec-handle property\n"); + dev_err(&pdev->dev, "missing codec-handle property\n"); return -ENODEV; } /* We only support the SSI in "I2S Slave" mode */ sprop = of_get_property(np, "fsl,mode", NULL); if (!sprop || strcmp(sprop, "i2s-slave")) { - dev_notice(&of_dev->dev, "mode %s is unsupported\n", sprop); + dev_notice(&pdev->dev, "mode %s is unsupported\n", sprop); return -ENODEV; } @@ -661,7 +661,7 @@ static int __devinit fsl_ssi_probe(struct of_device *of_dev, ssi_private = kzalloc(sizeof(struct fsl_ssi_private) + strlen(p), GFP_KERNEL); if (!ssi_private) { - dev_err(&of_dev->dev, "could not allocate DAI object\n"); + dev_err(&pdev->dev, "could not allocate DAI object\n"); return -ENOMEM; } @@ -675,7 +675,7 @@ static int __devinit fsl_ssi_probe(struct of_device *of_dev, /* Get the addresses and IRQ */ ret = of_address_to_resource(np, 0, &res); if (ret) { - dev_err(&of_dev->dev, "could not determine device resources\n"); + dev_err(&pdev->dev, "could not determine device resources\n"); kfree(ssi_private); return ret; } @@ -703,19 +703,19 @@ static int __devinit fsl_ssi_probe(struct of_device *of_dev, dev_attr->attr.mode = S_IRUGO; dev_attr->show = fsl_sysfs_ssi_show; - ret = device_create_file(&of_dev->dev, dev_attr); + ret = device_create_file(&pdev->dev, dev_attr); if (ret) { - dev_err(&of_dev->dev, "could not create sysfs %s file\n", + dev_err(&pdev->dev, "could not create sysfs %s file\n", ssi_private->dev_attr.attr.name); goto error; } /* Register with ASoC */ - dev_set_drvdata(&of_dev->dev, ssi_private); + dev_set_drvdata(&pdev->dev, ssi_private); - ret = snd_soc_register_dai(&of_dev->dev, &ssi_private->cpu_dai_drv); + ret = snd_soc_register_dai(&pdev->dev, &ssi_private->cpu_dai_drv); if (ret) { - dev_err(&of_dev->dev, "failed to register DAI: %d\n", ret); + dev_err(&pdev->dev, "failed to register DAI: %d\n", ret); goto error; } @@ -733,20 +733,20 @@ static int __devinit fsl_ssi_probe(struct of_device *of_dev, make_lowercase(name); ssi_private->pdev = - platform_device_register_data(&of_dev->dev, name, 0, NULL, 0); + platform_device_register_data(&pdev->dev, name, 0, NULL, 0); if (IS_ERR(ssi_private->pdev)) { ret = PTR_ERR(ssi_private->pdev); - dev_err(&of_dev->dev, "failed to register platform: %d\n", ret); + dev_err(&pdev->dev, "failed to register platform: %d\n", ret); goto error; } return 0; error: - snd_soc_unregister_dai(&of_dev->dev); - dev_set_drvdata(&of_dev->dev, NULL); + snd_soc_unregister_dai(&pdev->dev); + dev_set_drvdata(&pdev->dev, NULL); if (dev_attr) - device_remove_file(&of_dev->dev, dev_attr); + device_remove_file(&pdev->dev, dev_attr); irq_dispose_mapping(ssi_private->irq); iounmap(ssi_private->ssi); kfree(ssi_private); @@ -754,16 +754,16 @@ error: return ret; } -static int fsl_ssi_remove(struct of_device *of_dev) +static int fsl_ssi_remove(struct platform_device *pdev) { - struct fsl_ssi_private *ssi_private = dev_get_drvdata(&of_dev->dev); + struct fsl_ssi_private *ssi_private = dev_get_drvdata(&pdev->dev); platform_device_unregister(ssi_private->pdev); - snd_soc_unregister_dai(&of_dev->dev); - device_remove_file(&of_dev->dev, &ssi_private->dev_attr); + snd_soc_unregister_dai(&pdev->dev); + device_remove_file(&pdev->dev, &ssi_private->dev_attr); kfree(ssi_private); - dev_set_drvdata(&of_dev->dev, NULL); + dev_set_drvdata(&pdev->dev, NULL); return 0; } diff --git a/sound/soc/fsl/mpc8610_hpcd.c b/sound/soc/fsl/mpc8610_hpcd.c index 38339c158ed9..0d7dcf1e4863 100644 --- a/sound/soc/fsl/mpc8610_hpcd.c +++ b/sound/soc/fsl/mpc8610_hpcd.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -323,9 +324,10 @@ static int get_dma_channel(struct device_node *ssi_np, static int mpc8610_hpcd_probe(struct platform_device *pdev) { struct device *dev = pdev->dev.parent; - /* of_dev is the OF device for the SSI node that probed us */ - struct of_device *of_dev = container_of(dev, struct of_device, dev); - struct device_node *np = of_dev->dev.of_node; + /* ssi_pdev is the platform device for the SSI node that probed us */ + struct platform_device *ssi_pdev = + container_of(dev, struct platform_device, dev); + struct device_node *np = ssi_pdev->dev.of_node; struct device_node *codec_np = NULL; struct platform_device *sound_device = NULL; struct mpc8610_hpcd_data *machine_data; @@ -348,7 +350,7 @@ static int mpc8610_hpcd_probe(struct platform_device *pdev) if (!machine_data) return -ENOMEM; - machine_data->dai[0].cpu_dai_name = dev_name(&of_dev->dev); + machine_data->dai[0].cpu_dai_name = dev_name(&ssi_pdev->dev); machine_data->dai[0].ops = &mpc8610_hpcd_ops; /* Determine the codec name, it will be used as the codec DAI name */ -- cgit v1.2.3 From 23b224d9d42a111ce451e4300304415a0ba5da75 Mon Sep 17 00:00:00 2001 From: Garnet MacPhee Date: Sat, 21 Aug 2010 14:37:34 -0600 Subject: ALSA: ice1712: Add support for Edirol DA-2496 This device is similar to the M-Audio Delta 1010LT in that it uses the AK4524VF ADC/DAC, but it does not use the CS8427 for SPDIF. The SPDIF appears to be set up correctly, but I am not able to test it as I do not have any devices that use it. This patch makes the ADC/DAC's and the hardware mixer visible to apps such as alsamixer and envy24control. Signed-off-by: Garnet MacPhee Signed-off-by: Takashi Iwai --- sound/pci/ice1712/delta.c | 10 ++++++++++ sound/pci/ice1712/delta.h | 4 +++- 2 files changed, 13 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/ice1712/delta.c b/sound/pci/ice1712/delta.c index d216362626d0..712c1710f9a2 100644 --- a/sound/pci/ice1712/delta.c +++ b/sound/pci/ice1712/delta.c @@ -563,6 +563,7 @@ static int __devinit snd_ice1712_delta_init(struct snd_ice1712 *ice) case ICE1712_SUBDEVICE_DELTA1010E: case ICE1712_SUBDEVICE_DELTA1010LT: case ICE1712_SUBDEVICE_MEDIASTATION: + case ICE1712_SUBDEVICE_EDIROLDA2496: ice->num_total_dacs = 8; ice->num_total_adcs = 8; break; @@ -635,6 +636,7 @@ static int __devinit snd_ice1712_delta_init(struct snd_ice1712 *ice) err = snd_ice1712_akm4xxx_init(ak, &akm_delta410, &akm_delta410_priv, ice); break; case ICE1712_SUBDEVICE_DELTA1010LT: + case ICE1712_SUBDEVICE_EDIROLDA2496: err = snd_ice1712_akm4xxx_init(ak, &akm_delta1010lt, &akm_delta1010lt_priv, ice); break; case ICE1712_SUBDEVICE_DELTA66: @@ -734,6 +736,7 @@ static int __devinit snd_ice1712_delta_add_controls(struct snd_ice1712 *ice) case ICE1712_SUBDEVICE_DELTA66: case ICE1712_SUBDEVICE_VX442: case ICE1712_SUBDEVICE_DELTA66E: + case ICE1712_SUBDEVICE_EDIROLDA2496: err = snd_ice1712_akm4xxx_build_controls(ice); if (err < 0) return err; @@ -813,5 +816,12 @@ struct snd_ice1712_card_info snd_ice1712_delta_cards[] __devinitdata = { .chip_init = snd_ice1712_delta_init, .build_controls = snd_ice1712_delta_add_controls, }, + { + .subvendor = ICE1712_SUBDEVICE_EDIROLDA2496, + .name = "Edirol DA2496", + .model = "da2496", + .chip_init = snd_ice1712_delta_init, + .build_controls = snd_ice1712_delta_add_controls, + }, { } /* terminator */ }; diff --git a/sound/pci/ice1712/delta.h b/sound/pci/ice1712/delta.h index f7f14df81f26..1a0ac6cd6501 100644 --- a/sound/pci/ice1712/delta.h +++ b/sound/pci/ice1712/delta.h @@ -34,7 +34,8 @@ "{MidiMan M Audio,Delta 410},"\ "{MidiMan M Audio,Audiophile 24/96},"\ "{Digigram,VX442},"\ - "{Lionstracs,Mediastation}," + "{Lionstracs,Mediastation},"\ + "{Edirol,DA2496}," #define ICE1712_SUBDEVICE_DELTA1010 0x121430d6 #define ICE1712_SUBDEVICE_DELTA1010E 0xff1430d6 @@ -47,6 +48,7 @@ #define ICE1712_SUBDEVICE_DELTA1010LT 0x12143bd6 #define ICE1712_SUBDEVICE_VX442 0x12143cd6 #define ICE1712_SUBDEVICE_MEDIASTATION 0x694c0100 +#define ICE1712_SUBDEVICE_EDIROLDA2496 0xce164010 /* entry point */ extern struct snd_ice1712_card_info snd_ice1712_delta_cards[]; -- cgit v1.2.3 From 6f0ef6ea1d11ef242de584e345355b0de756fcb2 Mon Sep 17 00:00:00 2001 From: Jerone Young Date: Mon, 23 Aug 2010 08:34:36 +0200 Subject: ALSA: hda - Add support for Lenovo S10-3t This patch adds quirk for the Lenovo S10-3t so the headphone & microphone jacks will now work. Signed-off-by: Jerone Young Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_conexant.c | 1 + 1 file changed, 1 insertion(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index c424952a734e..5cdb80edbd7f 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -3059,6 +3059,7 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { SND_PCI_QUIRK(0x17aa, 0x21b4, "Thinkpad Edge", CXT5066_IDEAPAD), SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G series", CXT5066_IDEAPAD), + SND_PCI_QUIRK(0x17aa, 0x390a, "Lenovo S10-3t", CXT5066_IDEAPAD), SND_PCI_QUIRK(0x17aa, 0x3938, "Lenovo G series (AMD)", CXT5066_IDEAPAD), SND_PCI_QUIRK(0x17aa, 0x3a0d, "ideapad", CXT5066_IDEAPAD), {} -- cgit v1.2.3 From 37b47656baa3e4e78d539db2531a75590652327b Mon Sep 17 00:00:00 2001 From: Jarkko Nikula Date: Mon, 23 Aug 2010 10:38:40 +0300 Subject: ASoC: Fix tlv320aic3x GPIO initialization aic3x_init does a soft reset first and thus TLV320AIC3x GPIO setup must be done after doing the basic init. Before multi-component the init was done at i2c probe time and GPIO setup at soc probe time. Signed-off-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/tlv320aic3x.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index 43fd9c171742..0b80e242a66d 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c @@ -1231,6 +1231,8 @@ static int aic3x_probe(struct snd_soc_codec *codec) codec->hw_write = (hw_write_t) i2c_master_send; codec->control_data = aic3x->control_data; + aic3x_init(codec); + if (aic3x->setup) { /* setup GPIO functions */ aic3x_write(codec, AIC3X_GPIO1_REG, @@ -1239,8 +1241,6 @@ static int aic3x_probe(struct snd_soc_codec *codec) (aic3x->setup->gpio_func[1] & 0xf) << 4); } - aic3x_init(codec); - snd_soc_add_controls(codec, aic3x_snd_controls, ARRAY_SIZE(aic3x_snd_controls)); -- cgit v1.2.3 From 4fff7a5ccc00832039ae1c5138f9030079b6604d Mon Sep 17 00:00:00 2001 From: Jarkko Nikula Date: Mon, 23 Aug 2010 10:36:41 +0300 Subject: ASoC: omap: rx51: Use gpio_set_value_cansleep for speaker amp control Speaker amplifier is controlled by TWL4030 GPIO which may sleep. Therefore use gpio_set_value_cansleep to get rid of runtime warning that is introduced after the commit 9c4ba94 and to get a stack trace if ever executing this code in atomic context. Signed-off-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/omap/rx51.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/omap/rx51.c b/sound/soc/omap/rx51.c index d1d8098923ce..04b5723bf89b 100644 --- a/sound/soc/omap/rx51.c +++ b/sound/soc/omap/rx51.c @@ -146,9 +146,9 @@ static int rx51_spk_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { if (SND_SOC_DAPM_EVENT_ON(event)) - gpio_set_value(RX51_SPEAKER_AMP_TWL_GPIO, 1); + gpio_set_value_cansleep(RX51_SPEAKER_AMP_TWL_GPIO, 1); else - gpio_set_value(RX51_SPEAKER_AMP_TWL_GPIO, 0); + gpio_set_value_cansleep(RX51_SPEAKER_AMP_TWL_GPIO, 0); return 0; } -- cgit v1.2.3 From 7d83d2138390d499fccfde5c4975c66503d80704 Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Mon, 23 Aug 2010 10:54:43 +0100 Subject: ASoC: Log WM8994 separate ADC LRCLKs every time we configure This makes it that little bit easier to spot the diagnostics in the logs. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/wm8994.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 76a066e908ed..e03072cade7b 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -3316,20 +3316,24 @@ static int wm8994_hw_params(struct snd_pcm_substream *substream, bclk_reg = WM8994_AIF1_BCLK; rate_reg = WM8994_AIF1_RATE; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || - wm8994->lrclk_shared[0]) + wm8994->lrclk_shared[0]) { lrclk_reg = WM8994_AIF1DAC_LRCLK; - else + } else { lrclk_reg = WM8994_AIF1ADC_LRCLK; + dev_dbg(codec->dev, "AIF1 using split LRCLK\n"); + } break; case 2: aif1_reg = WM8994_AIF2_CONTROL_1; bclk_reg = WM8994_AIF2_BCLK; rate_reg = WM8994_AIF2_RATE; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || - wm8994->lrclk_shared[1]) + wm8994->lrclk_shared[1]) { lrclk_reg = WM8994_AIF2DAC_LRCLK; - else + } else { lrclk_reg = WM8994_AIF2ADC_LRCLK; + dev_dbg(codec->dev, "AIF2 using split LRCLK\n"); + } break; default: return -EINVAL; -- cgit v1.2.3 From 49d7ad9d8a5546d96061f08de1fb30241140849c Mon Sep 17 00:00:00 2001 From: Mark Brown Date: Fri, 20 Aug 2010 17:24:51 +0100 Subject: ASoC: Add build infrastructure for WL1273 The Makefile and Kconfig updates for WL1273 appear to have been mising from the patch posted, add them. Signed-off-by: Mark Brown Acked-by: Liam Girdwood --- sound/soc/codecs/Kconfig | 4 ++++ sound/soc/codecs/Makefile | 2 ++ 2 files changed, 6 insertions(+) (limited to 'sound') diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index a3cfc184ee50..155c1276d1a1 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -41,6 +41,7 @@ config SND_SOC_ALL_CODECS select SND_SOC_TWL6040 if TWL4030_CORE select SND_SOC_UDA134X select SND_SOC_UDA1380 if I2C + select SND_SOC_WL1273 if WL1273_CORE select SND_SOC_WM2000 if I2C select SND_SOC_WM8350 if MFD_WM8350 select SND_SOC_WM8400 if MFD_WM8400 @@ -193,6 +194,9 @@ config SND_SOC_UDA134X config SND_SOC_UDA1380 tristate +config SND_SOC_WL1273 + tristate + config SND_SOC_WM8350 tristate diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index b9c43582c5bd..10d468e4a1ed 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile @@ -27,6 +27,7 @@ snd-soc-twl4030-objs := twl4030.o snd-soc-twl6040-objs := twl6040.o snd-soc-uda134x-objs := uda134x.o snd-soc-uda1380-objs := uda1380.o +snd-soc-wl1273-objs := wl1273.o snd-soc-wm8350-objs := wm8350.o snd-soc-wm8400-objs := wm8400.o snd-soc-wm8510-objs := wm8510.o @@ -98,6 +99,7 @@ obj-$(CONFIG_SND_SOC_TWL4030) += snd-soc-twl4030.o obj-$(CONFIG_SND_SOC_TWL6040) += snd-soc-twl6040.o obj-$(CONFIG_SND_SOC_UDA134X) += snd-soc-uda134x.o obj-$(CONFIG_SND_SOC_UDA1380) += snd-soc-uda1380.o +obj-$(CONFIG_SND_SOC_WL1273) += snd-soc-wl1273.o obj-$(CONFIG_SND_SOC_WM8350) += snd-soc-wm8350.o obj-$(CONFIG_SND_SOC_WM8400) += snd-soc-wm8400.o obj-$(CONFIG_SND_SOC_WM8510) += snd-soc-wm8510.o -- cgit v1.2.3 From 70bf043b137aa9ff2711b16532774465e07a8f47 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Mon, 23 Aug 2010 08:54:02 +0200 Subject: ASoC: i.MX ssi: use SSI_STCCR in synchronous mode In synchronous mode the SSI_SRCCR values are ignored. Instead SSI_STCCR must be used for both receiving and transmitting. Signed-off-by: Sascha Hauer Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/imx/imx-ssi.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'sound') diff --git a/sound/soc/imx/imx-ssi.c b/sound/soc/imx/imx-ssi.c index a11daa1e905b..c81da05a4f11 100644 --- a/sound/soc/imx/imx-ssi.c +++ b/sound/soc/imx/imx-ssi.c @@ -254,6 +254,9 @@ static int imx_ssi_hw_params(struct snd_pcm_substream *substream, dma_data = &ssi->dma_params_rx; } + if (ssi->flags & IMX_SSI_SYN) + reg = SSI_STCCR; + snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data); sccr = readl(ssi->base + reg) & ~SSI_STCCR_WL_MASK; -- cgit v1.2.3 From a2a0086d4b812dd5d44af84c43d6c6ba089e8210 Mon Sep 17 00:00:00 2001 From: Ian Lartey Date: Fri, 20 Aug 2010 17:18:43 +0100 Subject: ASoC: pxa2xx-i2s is the proper name of the I2S DAI, not pxa-i2s. Signed-off-by: Ian Lartey Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/pxa/imote2.c | 2 +- sound/soc/pxa/magician.c | 2 +- sound/soc/pxa/poodle.c | 2 +- sound/soc/pxa/z2.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/soc/pxa/imote2.c b/sound/soc/pxa/imote2.c index 03765fc5ac74..154fc6f23438 100644 --- a/sound/soc/pxa/imote2.c +++ b/sound/soc/pxa/imote2.c @@ -63,7 +63,7 @@ static struct snd_soc_ops imote2_asoc_ops = { static struct snd_soc_dai_link imote2_dai = { .name = "WM8940", .stream_name = "WM8940", - .cpu_dai_name = "pxa-i2s", + .cpu_dai_name = "pxa2xx-i2s", .codec_dai_name = "wm8940-hifi", .platform_name = "pxa-pcm-audio", .codec_name = "wm8940-codec.0-0034", diff --git a/sound/soc/pxa/magician.c b/sound/soc/pxa/magician.c index 608bc3dd835f..b8207ced4072 100644 --- a/sound/soc/pxa/magician.c +++ b/sound/soc/pxa/magician.c @@ -437,7 +437,7 @@ static struct snd_soc_dai_link magician_dai[] = { { .name = "uda1380", .stream_name = "UDA1380 Capture", - .cpu_dai_name = "pxa-i2s", + .cpu_dai_name = "pxa2xx-i2s", .codec_dai_name = "uda1380-hifi-capture", .platform_name = "pxa-pcm-audio", .codec_name = "uda1380-codec.0-0018", diff --git a/sound/soc/pxa/poodle.c b/sound/soc/pxa/poodle.c index fa752f6ec37d..af84ee9c5e11 100644 --- a/sound/soc/pxa/poodle.c +++ b/sound/soc/pxa/poodle.c @@ -266,7 +266,7 @@ static int poodle_wm8731_init(struct snd_soc_pcm_runtime *rtd) static struct snd_soc_dai_link poodle_dai = { .name = "WM8731", .stream_name = "WM8731", - .cpu_dai_name = "pxa-i2s", + .cpu_dai_name = "pxa2xx-i2s", .codec_dai_name = "wm8731-hifi", .platform_name = "pxa-pcm-audio", .codec_name = "wm8731-codec.0-001a", diff --git a/sound/soc/pxa/z2.c b/sound/soc/pxa/z2.c index 704f74b56ab6..4cc841b44182 100644 --- a/sound/soc/pxa/z2.c +++ b/sound/soc/pxa/z2.c @@ -189,7 +189,7 @@ static struct snd_soc_ops z2_ops = { static struct snd_soc_dai_link z2_dai = { .name = "wm8750", .stream_name = "WM8750", - .cpu_dai_name = "pxa-i2s", + .cpu_dai_name = "pxa2xx-i2s", .codec_dai_name = "wm8750-hifi", .platform_name = "pxa-pcm-audio", .codec_name = "wm8750-codec.0-001a", -- cgit v1.2.3 From 30e2d36885b3c989f58f9f87c27b4afed3683d6f Mon Sep 17 00:00:00 2001 From: Ian Lartey Date: Fri, 20 Aug 2010 17:18:44 +0100 Subject: ASoC: Make codec dai naming for WM8741 consistent Signed-off-by: Ian Lartey Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/wm8741.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8741.c b/sound/soc/codecs/wm8741.c index 782fe539662b..fdd24da89a1e 100644 --- a/sound/soc/codecs/wm8741.c +++ b/sound/soc/codecs/wm8741.c @@ -311,7 +311,7 @@ static struct snd_soc_dai_ops wm8741_dai_ops = { }; static struct snd_soc_dai_driver wm8741_dai = { - .name = "WM8741", + .name = "wm8741", .playback = { .stream_name = "Playback", .channels_min = 2, /* Mono modes not yet supported */ -- cgit v1.2.3 From 72fba57931c703ad71849b2521226c9bcb7d6688 Mon Sep 17 00:00:00 2001 From: Ian Lartey Date: Fri, 20 Aug 2010 17:18:45 +0100 Subject: ASoC: Enable autoloading of pxa2xx CPU I2S driver with module alias Signed-off-by: Ian Lartey Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/pxa/pxa2xx-i2s.c | 1 + 1 file changed, 1 insertion(+) (limited to 'sound') diff --git a/sound/soc/pxa/pxa2xx-i2s.c b/sound/soc/pxa/pxa2xx-i2s.c index d1b2ca69fd30..11be5952a506 100644 --- a/sound/soc/pxa/pxa2xx-i2s.c +++ b/sound/soc/pxa/pxa2xx-i2s.c @@ -398,3 +398,4 @@ module_exit(pxa2xx_i2s_exit); MODULE_AUTHOR("Liam Girdwood, lrg@slimlogic.co.uk"); MODULE_DESCRIPTION("pxa2xx I2S SoC Interface"); MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:pxa2xx-i2s"); -- cgit v1.2.3 From 014a27553a804c24a213d11aee30470b0a83f341 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Wed, 25 Aug 2010 16:59:11 +0800 Subject: ASoC: pxa-ssp: fix a memory leak in pxa_ssp_remove() The "priv" allocated in pxa_ssp_probe() should be kfreed in pxa_ssp_remove(). Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/pxa/pxa-ssp.c | 1 + 1 file changed, 1 insertion(+) (limited to 'sound') diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c index 8dfbcda956ff..b439eee462cb 100644 --- a/sound/soc/pxa/pxa-ssp.c +++ b/sound/soc/pxa/pxa-ssp.c @@ -758,6 +758,7 @@ static int pxa_ssp_remove(struct snd_soc_dai *dai) struct ssp_priv *priv = snd_soc_dai_get_drvdata(dai); pxa_ssp_free(priv->ssp); + kfree(priv); return 0; } -- cgit v1.2.3 From dbbcbc073ad3132bfbc410b11546b2fb4bdf2568 Mon Sep 17 00:00:00 2001 From: David Henningsson Date: Mon, 23 Aug 2010 08:14:35 +0200 Subject: ALSA: hda - Add Sony VAIO quirk for ALC269 The attached patch enables playback on a Sony VAIO machine. BugLink: http://launchpad.net/bugs/618271 Signed-off-by: David Henningsson Cc: Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index a4dd04524e43..627bf9963368 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -14467,6 +14467,7 @@ static const struct alc_fixup alc269_fixups[] = { static struct snd_pci_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), + SND_PCI_QUIRK(0x104d, 0x9077, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), {} }; -- cgit v1.2.3 From 708fafb3c54039caa5dadc8e9d2dfd999f88f190 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Fri, 27 Aug 2010 10:34:27 +0800 Subject: ASoC: soc-core: fix debugfs_pop_time file permissions I think this is a typo, debugfs_pop_time should not be executable. Signed-off-by: Axel Lin Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/soc-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 844ae8221a3a..acc91daa1c55 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -251,7 +251,7 @@ static void soc_init_codec_debugfs(struct snd_soc_codec *codec) printk(KERN_WARNING "ASoC: Failed to create codec register debugfs file\n"); - codec->debugfs_pop_time = debugfs_create_u32("dapm_pop_time", 0744, + codec->debugfs_pop_time = debugfs_create_u32("dapm_pop_time", 0644, codec->debugfs_codec_root, &codec->pop_time); if (!codec->debugfs_pop_time) -- cgit v1.2.3 From 3fe4a5ee9c312b7652cc92715ee30d3760b83e5b Mon Sep 17 00:00:00 2001 From: Ian Lartey Date: Fri, 27 Aug 2010 15:26:27 +0100 Subject: ASoC: Complete supported clock ratios and rate constraints for wm8741 Signed-off-by: Ian Lartey Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/wm8741.c | 175 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 124 insertions(+), 51 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/wm8741.c b/sound/soc/codecs/wm8741.c index fdd24da89a1e..c8e7a264bbae 100644 --- a/sound/soc/codecs/wm8741.c +++ b/sound/soc/codecs/wm8741.c @@ -36,7 +36,7 @@ static const char *wm8741_supply_names[WM8741_NUM_SUPPLIES] = { "DVDD", }; -#define WM8741_NUM_RATES 4 +#define WM8741_NUM_RATES 6 /* codec private data */ struct wm8741_priv { @@ -44,8 +44,7 @@ struct wm8741_priv { u16 reg_cache[WM8741_REGISTER_COUNT]; struct regulator_bulk_data supplies[WM8741_NUM_SUPPLIES]; unsigned int sysclk; - unsigned int rate_constraint_list[WM8741_NUM_RATES]; - struct snd_pcm_hw_constraint_list rate_constraint; + struct snd_pcm_hw_constraint_list *sysclk_constraints; }; static const u16 wm8741_reg_defaults[WM8741_REGISTER_COUNT] = { @@ -108,10 +107,84 @@ static struct { int value; int ratio; } lrclk_ratios[WM8741_NUM_RATES] = { - { 1, 256 }, - { 2, 384 }, - { 3, 512 }, - { 4, 768 }, + { 1, 128 }, + { 2, 192 }, + { 3, 256 }, + { 4, 384 }, + { 5, 512 }, + { 6, 768 }, +}; + +static unsigned int rates_11289[] = { + 44100, 88235, +}; + +static struct snd_pcm_hw_constraint_list constraints_11289 = { + .count = ARRAY_SIZE(rates_11289), + .list = rates_11289, +}; + +static unsigned int rates_12288[] = { + 32000, 48000, 96000, +}; + +static struct snd_pcm_hw_constraint_list constraints_12288 = { + .count = ARRAY_SIZE(rates_12288), + .list = rates_12288, +}; + +static unsigned int rates_16384[] = { + 32000, +}; + +static struct snd_pcm_hw_constraint_list constraints_16384 = { + .count = ARRAY_SIZE(rates_16384), + .list = rates_16384, +}; + +static unsigned int rates_16934[] = { + 44100, 88235, +}; + +static struct snd_pcm_hw_constraint_list constraints_16934 = { + .count = ARRAY_SIZE(rates_16934), + .list = rates_16934, +}; + +static unsigned int rates_18432[] = { + 48000, 96000, +}; + +static struct snd_pcm_hw_constraint_list constraints_18432 = { + .count = ARRAY_SIZE(rates_18432), + .list = rates_18432, +}; + +static unsigned int rates_22579[] = { + 44100, 88235, 1764000 +}; + +static struct snd_pcm_hw_constraint_list constraints_22579 = { + .count = ARRAY_SIZE(rates_22579), + .list = rates_22579, +}; + +static unsigned int rates_24576[] = { + 32000, 48000, 96000, 192000 +}; + +static struct snd_pcm_hw_constraint_list constraints_24576 = { + .count = ARRAY_SIZE(rates_24576), + .list = rates_24576, +}; + +static unsigned int rates_36864[] = { + 48000, 96000, 19200 +}; + +static struct snd_pcm_hw_constraint_list constraints_36864 = { + .count = ARRAY_SIZE(rates_36864), + .list = rates_36864, }; @@ -132,7 +205,7 @@ static int wm8741_startup(struct snd_pcm_substream *substream, snd_pcm_hw_constraint_list(substream->runtime, 0, SNDRV_PCM_HW_PARAM_RATE, - &wm8741->rate_constraint); + wm8741->sysclk_constraints); return 0; } @@ -192,47 +265,52 @@ static int wm8741_set_dai_sysclk(struct snd_soc_dai *codec_dai, { struct snd_soc_codec *codec = codec_dai->codec; struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec); - unsigned int val; - int i; dev_dbg(codec->dev, "wm8741_set_dai_sysclk info: freq=%dHz\n", freq); - wm8741->sysclk = freq; - - wm8741->rate_constraint.count = 0; - - for (i = 0; i < ARRAY_SIZE(lrclk_ratios); i++) { - dev_dbg(codec->dev, "index = %d, ratio = %d, freq = %d", - i, lrclk_ratios[i].ratio, freq); - - val = freq / lrclk_ratios[i].ratio; - /* Check that it's a standard rate since core can't - * cope with others and having the odd rates confuses - * constraint matching. - */ - switch (val) { - case 32000: - case 44100: - case 48000: - case 64000: - case 88200: - case 96000: - dev_dbg(codec->dev, "Supported sample rate: %dHz\n", - val); - wm8741->rate_constraint_list[i] = val; - wm8741->rate_constraint.count++; - break; - default: - dev_dbg(codec->dev, "Skipping sample rate: %dHz\n", - val); - } + switch (freq) { + case 11289600: + wm8741->sysclk_constraints = &constraints_11289; + wm8741->sysclk = freq; + return 0; + + case 12288000: + wm8741->sysclk_constraints = &constraints_12288; + wm8741->sysclk = freq; + return 0; + + case 16384000: + wm8741->sysclk_constraints = &constraints_16384; + wm8741->sysclk = freq; + return 0; + + case 16934400: + wm8741->sysclk_constraints = &constraints_16934; + wm8741->sysclk = freq; + return 0; + + case 18432000: + wm8741->sysclk_constraints = &constraints_18432; + wm8741->sysclk = freq; + return 0; + + case 22579200: + case 33868800: + wm8741->sysclk_constraints = &constraints_22579; + wm8741->sysclk = freq; + return 0; + + case 24576000: + wm8741->sysclk_constraints = &constraints_24576; + wm8741->sysclk = freq; + return 0; + + case 36864000: + wm8741->sysclk_constraints = &constraints_36864; + wm8741->sysclk = freq; + return 0; } - - /* Need at least one supported rate... */ - if (wm8741->rate_constraint.count == 0) - return -EINVAL; - - return 0; + return -EINVAL; } static int wm8741_set_dai_fmt(struct snd_soc_dai *codec_dai, @@ -391,10 +469,6 @@ static int wm8741_i2c_probe(struct i2c_client *i2c, if (wm8741 == NULL) return -ENOMEM; - wm8741->rate_constraint.list = &wm8741->rate_constraint_list[0]; - wm8741->rate_constraint.count = - ARRAY_SIZE(wm8741->rate_constraint_list); - for (i = 0; i < ARRAY_SIZE(wm8741->supplies); i++) wm8741->supplies[i].supply = wm8741_supply_names[i]; @@ -464,9 +538,8 @@ static int __init wm8741_modinit(void) #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) ret = i2c_add_driver(&wm8741_i2c_driver); - if (ret != 0) { + if (ret != 0) pr_err("Failed to register WM8741 I2C driver: %d\n", ret); - } #endif return ret; -- cgit v1.2.3 From 0bb5f267af41c39af895faee3abe2d9ab8c562e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Tue, 24 Aug 2010 15:09:41 +0200 Subject: ASoC: ad1980: remove unneeded function declaration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Uwe Kleine-König Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/ad1980.c | 5 ----- 1 file changed, 5 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/ad1980.c b/sound/soc/codecs/ad1980.c index 81a444049936..2b9331a59c71 100644 --- a/sound/soc/codecs/ad1980.c +++ b/sound/soc/codecs/ad1980.c @@ -33,11 +33,6 @@ #include "ad1980.h" -static unsigned int ac97_read(struct snd_soc_codec *codec, - unsigned int reg); -static int ac97_write(struct snd_soc_codec *codec, - unsigned int reg, unsigned int val); - /* * AD1980 register cache */ -- cgit v1.2.3 From 60f1deb595c08687a96157a6a3ce08ef34142362 Mon Sep 17 00:00:00 2001 From: Eliot Blennerhassett Date: Sat, 28 Aug 2010 19:52:24 +1200 Subject: ALSA: asihpi - Return hw error directly from oustream_write. If hw error is ignored, status is updated with invalid info. Signed-off-by: Eliot Blennerhassett Signed-off-by: Takashi Iwai --- sound/pci/asihpi/hpi6205.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/pci/asihpi/hpi6205.c b/sound/pci/asihpi/hpi6205.c index 3b4413448226..22c5fc625533 100644 --- a/sound/pci/asihpi/hpi6205.c +++ b/sound/pci/asihpi/hpi6205.c @@ -941,8 +941,7 @@ static void outstream_host_buffer_free(struct hpi_adapter_obj *pao, } -static u32 outstream_get_space_available(struct hpi_hostbuffer_status - *status) +static u32 outstream_get_space_available(struct hpi_hostbuffer_status *status) { return status->size_in_bytes - (status->host_index - status->dSP_index); @@ -987,6 +986,10 @@ static void outstream_write(struct hpi_adapter_obj *pao, /* write it */ phm->function = HPI_OSTREAM_WRITE; hw_message(pao, phm, phr); + + if (phr->error) + return; + /* update status information that the DSP would typically * update (and will update next time the DSP * buffer update task reads data from the host BBM buffer) -- cgit v1.2.3 From 3182c8a72b31414e043184a97b0d5d3c0d590168 Mon Sep 17 00:00:00 2001 From: Akinobu Mita Date: Sat, 28 Aug 2010 13:25:33 +0900 Subject: sound: oss: fix uninitialized spinlock The spinlock lock in sound_timer.c is used without initialization. Signed-off-by: Akinobu Mita Signed-off-by: Takashi Iwai --- sound/oss/sound_timer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/oss/sound_timer.c b/sound/oss/sound_timer.c index f0f0c19fbff7..48cda6c4c257 100644 --- a/sound/oss/sound_timer.c +++ b/sound/oss/sound_timer.c @@ -26,7 +26,7 @@ static unsigned long prev_event_time; static volatile unsigned long usecs_per_tmr; /* Length of the current interval */ static struct sound_lowlev_timer *tmr; -static spinlock_t lock; +static DEFINE_SPINLOCK(lock); static unsigned long tmr2ticks(int tmr_value) { -- cgit v1.2.3 From f9bc02974d931cb424cd1979526ce9c208122bd2 Mon Sep 17 00:00:00 2001 From: Jarkko Nikula Date: Fri, 27 Aug 2010 16:56:47 +0300 Subject: ASoC: tlv320aic3x: Fix remaining output pin switch names Bit 3 in output pin_CTRL register mutes the whole output pin not just the route from DAC so remove misleading DAC from control name. Currently only "Line[L | R] Playback Switch" were correct. Signed-off-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/tlv320aic3x.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index efae8b53fd64..6e4ed79d5eb9 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c @@ -314,7 +314,7 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = { SOC_DOUBLE_R_TLV("Mono DAC Playback Volume", DACL1_2_MONOLOPM_VOL, DACR1_2_MONOLOPM_VOL, 0, 118, 1, output_stage_tlv), - SOC_SINGLE("Mono DAC Playback Switch", MONOLOPM_CTRL, 3, 0x01, 0), + SOC_SINGLE("Mono Playback Switch", MONOLOPM_CTRL, 3, 0x01, 0), SOC_DOUBLE_R_TLV("Mono PGA Bypass Playback Volume", PGAL_2_MONOLOPM_VOL, PGAR_2_MONOLOPM_VOL, 0, 118, 1, output_stage_tlv), @@ -325,7 +325,7 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = { SOC_DOUBLE_R_TLV("HP DAC Playback Volume", DACL1_2_HPLOUT_VOL, DACR1_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv), - SOC_DOUBLE_R("HP DAC Playback Switch", HPLOUT_CTRL, HPROUT_CTRL, 3, + SOC_DOUBLE_R("HP Playback Switch", HPLOUT_CTRL, HPROUT_CTRL, 3, 0x01, 0), SOC_DOUBLE_R_TLV("HP Right PGA Bypass Playback Volume", PGAR_2_HPLOUT_VOL, PGAR_2_HPROUT_VOL, @@ -341,7 +341,7 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = { SOC_DOUBLE_R_TLV("HPCOM DAC Playback Volume", DACL1_2_HPLCOM_VOL, DACR1_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv), - SOC_DOUBLE_R("HPCOM DAC Playback Switch", HPLCOM_CTRL, HPRCOM_CTRL, 3, + SOC_DOUBLE_R("HPCOM Playback Switch", HPLCOM_CTRL, HPRCOM_CTRL, 3, 0x01, 0), SOC_SINGLE_TLV("HPLCOM PGA Bypass Playback Volume", PGAL_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv), -- cgit v1.2.3 From b2eaac203a04362e9ccae7ba36aef0a9f2486547 Mon Sep 17 00:00:00 2001 From: Jarkko Nikula Date: Fri, 27 Aug 2010 16:56:48 +0300 Subject: ASoC: tlv320aic3x: Sort output pin control registers in header file Each output pin has 7 consecutive control registers in tlv320aic3x register map. First 6 of them control the signal mixing and one is for output level and power control. Sort these registers as they are sorted clearly in hardware, it makes also definitions more readable and easier to pinpoint missing register definitions. Signed-off-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/tlv320aic3x.h | 47 ++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 22 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/tlv320aic3x.h b/sound/soc/codecs/tlv320aic3x.h index 98e44395b662..20d8cac2637c 100644 --- a/sound/soc/codecs/tlv320aic3x.h +++ b/sound/soc/codecs/tlv320aic3x.h @@ -81,52 +81,55 @@ /* DAC Digital control registers */ #define LDAC_VOL 43 #define RDAC_VOL 44 -/* High Power Output control registers */ +/* Left High Power Output control registers */ #define LINE2L_2_HPLOUT_VOL 45 -#define LINE2R_2_HPROUT_VOL 62 #define PGAL_2_HPLOUT_VOL 46 -#define PGAL_2_HPROUT_VOL 60 -#define PGAR_2_HPLOUT_VOL 49 -#define PGAR_2_HPROUT_VOL 63 #define DACL1_2_HPLOUT_VOL 47 -#define DACR1_2_HPROUT_VOL 64 +#define PGAR_2_HPLOUT_VOL 49 #define HPLOUT_CTRL 51 -#define HPROUT_CTRL 65 -/* High Power COM control registers */ +/* Left High Power COM control registers */ #define LINE2L_2_HPLCOM_VOL 52 -#define LINE2R_2_HPRCOM_VOL 69 #define PGAL_2_HPLCOM_VOL 53 +#define DACL1_2_HPLCOM_VOL 54 #define PGAR_2_HPLCOM_VOL 56 +#define HPLCOM_CTRL 58 +/* Right High Power Output control registers */ +#define PGAL_2_HPROUT_VOL 60 +#define LINE2R_2_HPROUT_VOL 62 +#define PGAR_2_HPROUT_VOL 63 +#define DACR1_2_HPROUT_VOL 64 +#define HPROUT_CTRL 65 +/* Right High Power COM control registers */ #define PGAL_2_HPRCOM_VOL 67 +#define LINE2R_2_HPRCOM_VOL 69 #define PGAR_2_HPRCOM_VOL 70 -#define DACL1_2_HPLCOM_VOL 54 #define DACR1_2_HPRCOM_VOL 71 -#define HPLCOM_CTRL 58 #define HPRCOM_CTRL 72 /* Mono Line Output Plus/Minus control registers */ #define LINE2L_2_MONOLOPM_VOL 73 -#define LINE2R_2_MONOLOPM_VOL 76 #define PGAL_2_MONOLOPM_VOL 74 -#define PGAR_2_MONOLOPM_VOL 77 #define DACL1_2_MONOLOPM_VOL 75 +#define LINE2R_2_MONOLOPM_VOL 76 +#define PGAR_2_MONOLOPM_VOL 77 #define DACR1_2_MONOLOPM_VOL 78 #define MONOLOPM_CTRL 79 /* Class-D speaker driver on tlv320aic3007 */ #define CLASSD_CTRL 73 -/* Line Output Plus/Minus control registers */ +/* Left Line Output Plus/Minus control registers */ #define LINE2L_2_LLOPM_VOL 80 -#define LINE2L_2_RLOPM_VOL 87 -#define LINE2R_2_LLOPM_VOL 83 -#define LINE2R_2_RLOPM_VOL 90 #define PGAL_2_LLOPM_VOL 81 -#define PGAL_2_RLOPM_VOL 88 -#define PGAR_2_LLOPM_VOL 84 -#define PGAR_2_RLOPM_VOL 91 #define DACL1_2_LLOPM_VOL 82 -#define DACL1_2_RLOPM_VOL 89 -#define DACR1_2_RLOPM_VOL 92 +#define LINE2R_2_LLOPM_VOL 83 +#define PGAR_2_LLOPM_VOL 84 #define DACR1_2_LLOPM_VOL 85 #define LLOPM_CTRL 86 +/* Right Line Output Plus/Minus control registers */ +#define LINE2L_2_RLOPM_VOL 87 +#define PGAL_2_RLOPM_VOL 88 +#define DACL1_2_RLOPM_VOL 89 +#define LINE2R_2_RLOPM_VOL 90 +#define PGAR_2_RLOPM_VOL 91 +#define DACR1_2_RLOPM_VOL 92 #define RLOPM_CTRL 93 /* GPIO/IRQ registers */ #define AIC3X_STICKY_IRQ_FLAGS_REG 96 -- cgit v1.2.3 From c3b79e05b4d9ab2e7c3ba281261ea87ab5b71a92 Mon Sep 17 00:00:00 2001 From: Jarkko Nikula Date: Fri, 27 Aug 2010 16:56:49 +0300 Subject: ASoC: tlv320aic3x: Reimplement output mixers It turned out that the output mixers and their routes were misdefined: They are not mixing output pins to internal signals but opposite. This has worked for direct left-to-left and right-to-right routes since for those there are complete routes. For swapped left-to-right and right-to-left routes this is not working since there are no routes defined between them. Another consequence is that those misdefined mixers are incorrectly routed to several output pins leading unnecessary pin powerings even if there is no route active to them. Fix these by reimplementing the output mixers and routes as they are in hardware. For completeness add also a few missing links between internal signals and outputs. Signed-off-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/tlv320aic3x.c | 394 +++++++++++++++++++---------------------- sound/soc/codecs/tlv320aic3x.h | 8 + 2 files changed, 195 insertions(+), 207 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index 6e4ed79d5eb9..0a3b98c097bb 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c @@ -389,22 +389,74 @@ SOC_DAPM_ENUM("Route", aic3x_enum[LHPCOM_ENUM]); static const struct snd_kcontrol_new aic3x_right_hpcom_mux_controls = SOC_DAPM_ENUM("Route", aic3x_enum[RHPCOM_ENUM]); -/* Left DAC_L1 Mixer */ -static const struct snd_kcontrol_new aic3x_left_dac_mixer_controls[] = { - SOC_DAPM_SINGLE("LineL Switch", DACL1_2_LLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("LineR Switch", DACL1_2_RLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("Mono Switch", DACL1_2_MONOLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HP Switch", DACL1_2_HPLOUT_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HPCOM Switch", DACL1_2_HPLCOM_VOL, 7, 1, 0), +/* Left Line Mixer */ +static const struct snd_kcontrol_new aic3x_left_line_mixer_controls[] = { + SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_LLOPM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_LLOPM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_LLOPM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_LLOPM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_LLOPM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_LLOPM_VOL, 7, 1, 0), }; -/* Right DAC_R1 Mixer */ -static const struct snd_kcontrol_new aic3x_right_dac_mixer_controls[] = { - SOC_DAPM_SINGLE("LineL Switch", DACR1_2_LLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("LineR Switch", DACR1_2_RLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("Mono Switch", DACR1_2_MONOLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HP Switch", DACR1_2_HPROUT_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HPCOM Switch", DACR1_2_HPRCOM_VOL, 7, 1, 0), +/* Right Line Mixer */ +static const struct snd_kcontrol_new aic3x_right_line_mixer_controls[] = { + SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_RLOPM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_RLOPM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_RLOPM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_RLOPM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_RLOPM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_RLOPM_VOL, 7, 1, 0), +}; + +/* Mono Mixer */ +static const struct snd_kcontrol_new aic3x_mono_mixer_controls[] = { + SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_MONOLOPM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_MONOLOPM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_MONOLOPM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_MONOLOPM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_MONOLOPM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_MONOLOPM_VOL, 7, 1, 0), +}; + +/* Left HP Mixer */ +static const struct snd_kcontrol_new aic3x_left_hp_mixer_controls[] = { + SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLOUT_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPLOUT_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPLOUT_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLOUT_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPLOUT_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPLOUT_VOL, 7, 1, 0), +}; + +/* Right HP Mixer */ +static const struct snd_kcontrol_new aic3x_right_hp_mixer_controls[] = { + SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPROUT_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPROUT_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPROUT_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPROUT_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPROUT_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPROUT_VOL, 7, 1, 0), +}; + +/* Left HPCOM Mixer */ +static const struct snd_kcontrol_new aic3x_left_hpcom_mixer_controls[] = { + SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLCOM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPLCOM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPLCOM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLCOM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPLCOM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPLCOM_VOL, 7, 1, 0), +}; + +/* Right HPCOM Mixer */ +static const struct snd_kcontrol_new aic3x_right_hpcom_mixer_controls[] = { + SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPRCOM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPRCOM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPRCOM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPRCOM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPRCOM_VOL, 7, 1, 0), + SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPRCOM_VOL, 7, 1, 0), }; /* Left PGA Mixer */ @@ -441,54 +493,11 @@ SOC_DAPM_ENUM("Route", aic3x_enum[LINE2L_ENUM]); static const struct snd_kcontrol_new aic3x_right_line2_mux_controls = SOC_DAPM_ENUM("Route", aic3x_enum[LINE2R_ENUM]); -/* Left PGA Bypass Mixer */ -static const struct snd_kcontrol_new aic3x_left_pga_bp_mixer_controls[] = { - SOC_DAPM_SINGLE("LineL Switch", PGAL_2_LLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("LineR Switch", PGAL_2_RLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("Mono Switch", PGAL_2_MONOLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HPL Switch", PGAL_2_HPLOUT_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HPR Switch", PGAL_2_HPROUT_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HPLCOM Switch", PGAL_2_HPLCOM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HPRCOM Switch", PGAL_2_HPRCOM_VOL, 7, 1, 0), -}; - -/* Right PGA Bypass Mixer */ -static const struct snd_kcontrol_new aic3x_right_pga_bp_mixer_controls[] = { - SOC_DAPM_SINGLE("LineL Switch", PGAR_2_LLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("LineR Switch", PGAR_2_RLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("Mono Switch", PGAR_2_MONOLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HPL Switch", PGAR_2_HPLOUT_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HPR Switch", PGAR_2_HPROUT_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HPLCOM Switch", PGAR_2_HPLCOM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HPRCOM Switch", PGAR_2_HPRCOM_VOL, 7, 1, 0), -}; - -/* Left Line2 Bypass Mixer */ -static const struct snd_kcontrol_new aic3x_left_line2_bp_mixer_controls[] = { - SOC_DAPM_SINGLE("LineL Switch", LINE2L_2_LLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("LineR Switch", LINE2L_2_RLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("Mono Switch", LINE2L_2_MONOLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HP Switch", LINE2L_2_HPLOUT_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HPLCOM Switch", LINE2L_2_HPLCOM_VOL, 7, 1, 0), -}; - -/* Right Line2 Bypass Mixer */ -static const struct snd_kcontrol_new aic3x_right_line2_bp_mixer_controls[] = { - SOC_DAPM_SINGLE("LineL Switch", LINE2R_2_LLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("LineR Switch", LINE2R_2_RLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("Mono Switch", LINE2R_2_MONOLOPM_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HP Switch", LINE2R_2_HPROUT_VOL, 7, 1, 0), - SOC_DAPM_SINGLE("HPRCOM Switch", LINE2R_2_HPRCOM_VOL, 7, 1, 0), -}; - static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = { /* Left DAC to Left Outputs */ SND_SOC_DAPM_DAC("Left DAC", "Left Playback", DAC_PWR, 7, 0), SND_SOC_DAPM_MUX("Left DAC Mux", SND_SOC_NOPM, 0, 0, &aic3x_left_dac_mux_controls), - SND_SOC_DAPM_MIXER("Left DAC_L1 Mixer", SND_SOC_NOPM, 0, 0, - &aic3x_left_dac_mixer_controls[0], - ARRAY_SIZE(aic3x_left_dac_mixer_controls)), SND_SOC_DAPM_MUX("Left HPCOM Mux", SND_SOC_NOPM, 0, 0, &aic3x_left_hpcom_mux_controls), SND_SOC_DAPM_PGA("Left Line Out", LLOPM_CTRL, 0, 0, NULL, 0), @@ -499,9 +508,6 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = { SND_SOC_DAPM_DAC("Right DAC", "Right Playback", DAC_PWR, 6, 0), SND_SOC_DAPM_MUX("Right DAC Mux", SND_SOC_NOPM, 0, 0, &aic3x_right_dac_mux_controls), - SND_SOC_DAPM_MIXER("Right DAC_R1 Mixer", SND_SOC_NOPM, 0, 0, - &aic3x_right_dac_mixer_controls[0], - ARRAY_SIZE(aic3x_right_dac_mixer_controls)), SND_SOC_DAPM_MUX("Right HPCOM Mux", SND_SOC_NOPM, 0, 0, &aic3x_right_hpcom_mux_controls), SND_SOC_DAPM_PGA("Right Line Out", RLOPM_CTRL, 0, 0, NULL, 0), @@ -565,25 +571,28 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = { SND_SOC_DAPM_REG(snd_soc_dapm_micbias, "Mic Bias AVDD", MICBIAS_CTRL, 6, 3, 3, 0), - /* Left PGA to Left Output bypass */ - SND_SOC_DAPM_MIXER("Left PGA Bypass Mixer", SND_SOC_NOPM, 0, 0, - &aic3x_left_pga_bp_mixer_controls[0], - ARRAY_SIZE(aic3x_left_pga_bp_mixer_controls)), - - /* Right PGA to Right Output bypass */ - SND_SOC_DAPM_MIXER("Right PGA Bypass Mixer", SND_SOC_NOPM, 0, 0, - &aic3x_right_pga_bp_mixer_controls[0], - ARRAY_SIZE(aic3x_right_pga_bp_mixer_controls)), - - /* Left Line2 to Left Output bypass */ - SND_SOC_DAPM_MIXER("Left Line2 Bypass Mixer", SND_SOC_NOPM, 0, 0, - &aic3x_left_line2_bp_mixer_controls[0], - ARRAY_SIZE(aic3x_left_line2_bp_mixer_controls)), - - /* Right Line2 to Right Output bypass */ - SND_SOC_DAPM_MIXER("Right Line2 Bypass Mixer", SND_SOC_NOPM, 0, 0, - &aic3x_right_line2_bp_mixer_controls[0], - ARRAY_SIZE(aic3x_right_line2_bp_mixer_controls)), + /* Output mixers */ + SND_SOC_DAPM_MIXER("Left Line Mixer", SND_SOC_NOPM, 0, 0, + &aic3x_left_line_mixer_controls[0], + ARRAY_SIZE(aic3x_left_line_mixer_controls)), + SND_SOC_DAPM_MIXER("Right Line Mixer", SND_SOC_NOPM, 0, 0, + &aic3x_right_line_mixer_controls[0], + ARRAY_SIZE(aic3x_right_line_mixer_controls)), + SND_SOC_DAPM_MIXER("Mono Mixer", SND_SOC_NOPM, 0, 0, + &aic3x_mono_mixer_controls[0], + ARRAY_SIZE(aic3x_mono_mixer_controls)), + SND_SOC_DAPM_MIXER("Left HP Mixer", SND_SOC_NOPM, 0, 0, + &aic3x_left_hp_mixer_controls[0], + ARRAY_SIZE(aic3x_left_hp_mixer_controls)), + SND_SOC_DAPM_MIXER("Right HP Mixer", SND_SOC_NOPM, 0, 0, + &aic3x_right_hp_mixer_controls[0], + ARRAY_SIZE(aic3x_right_hp_mixer_controls)), + SND_SOC_DAPM_MIXER("Left HPCOM Mixer", SND_SOC_NOPM, 0, 0, + &aic3x_left_hpcom_mixer_controls[0], + ARRAY_SIZE(aic3x_left_hpcom_mixer_controls)), + SND_SOC_DAPM_MIXER("Right HPCOM Mixer", SND_SOC_NOPM, 0, 0, + &aic3x_right_hpcom_mixer_controls[0], + ARRAY_SIZE(aic3x_right_hpcom_mixer_controls)), SND_SOC_DAPM_OUTPUT("LLOUT"), SND_SOC_DAPM_OUTPUT("RLOUT"), @@ -611,66 +620,6 @@ static const struct snd_soc_dapm_widget aic3007_dapm_widgets[] = { }; static const struct snd_soc_dapm_route intercon[] = { - /* Left Output */ - {"Left DAC Mux", "DAC_L1", "Left DAC"}, - {"Left DAC Mux", "DAC_L2", "Left DAC"}, - {"Left DAC Mux", "DAC_L3", "Left DAC"}, - - {"Left DAC_L1 Mixer", "LineL Switch", "Left DAC Mux"}, - {"Left DAC_L1 Mixer", "LineR Switch", "Left DAC Mux"}, - {"Left DAC_L1 Mixer", "Mono Switch", "Left DAC Mux"}, - {"Left DAC_L1 Mixer", "HP Switch", "Left DAC Mux"}, - {"Left DAC_L1 Mixer", "HPCOM Switch", "Left DAC Mux"}, - {"Left Line Out", NULL, "Left DAC Mux"}, - {"Left HP Out", NULL, "Left DAC Mux"}, - - {"Left HPCOM Mux", "differential of HPLOUT", "Left DAC_L1 Mixer"}, - {"Left HPCOM Mux", "constant VCM", "Left DAC_L1 Mixer"}, - {"Left HPCOM Mux", "single-ended", "Left DAC_L1 Mixer"}, - - {"Left Line Out", NULL, "Left DAC_L1 Mixer"}, - {"Mono Out", NULL, "Left DAC_L1 Mixer"}, - {"Left HP Out", NULL, "Left DAC_L1 Mixer"}, - {"Left HP Com", NULL, "Left HPCOM Mux"}, - - {"LLOUT", NULL, "Left Line Out"}, - {"LLOUT", NULL, "Left Line Out"}, - {"HPLOUT", NULL, "Left HP Out"}, - {"HPLCOM", NULL, "Left HP Com"}, - - /* Right Output */ - {"Right DAC Mux", "DAC_R1", "Right DAC"}, - {"Right DAC Mux", "DAC_R2", "Right DAC"}, - {"Right DAC Mux", "DAC_R3", "Right DAC"}, - - {"Right DAC_R1 Mixer", "LineL Switch", "Right DAC Mux"}, - {"Right DAC_R1 Mixer", "LineR Switch", "Right DAC Mux"}, - {"Right DAC_R1 Mixer", "Mono Switch", "Right DAC Mux"}, - {"Right DAC_R1 Mixer", "HP Switch", "Right DAC Mux"}, - {"Right DAC_R1 Mixer", "HPCOM Switch", "Right DAC Mux"}, - {"Right Line Out", NULL, "Right DAC Mux"}, - {"Right HP Out", NULL, "Right DAC Mux"}, - - {"Right HPCOM Mux", "differential of HPROUT", "Right DAC_R1 Mixer"}, - {"Right HPCOM Mux", "constant VCM", "Right DAC_R1 Mixer"}, - {"Right HPCOM Mux", "single-ended", "Right DAC_R1 Mixer"}, - {"Right HPCOM Mux", "differential of HPLCOM", "Right DAC_R1 Mixer"}, - {"Right HPCOM Mux", "external feedback", "Right DAC_R1 Mixer"}, - - {"Right Line Out", NULL, "Right DAC_R1 Mixer"}, - {"Mono Out", NULL, "Right DAC_R1 Mixer"}, - {"Right HP Out", NULL, "Right DAC_R1 Mixer"}, - {"Right HP Com", NULL, "Right HPCOM Mux"}, - - {"RLOUT", NULL, "Right Line Out"}, - {"RLOUT", NULL, "Right Line Out"}, - {"HPROUT", NULL, "Right HP Out"}, - {"HPRCOM", NULL, "Right HP Com"}, - - /* Mono Output */ - {"MONO_LOUT", NULL, "Mono Out"}, - {"MONO_LOUT", NULL, "Mono Out"}, - /* Left Input */ {"Left Line1L Mux", "single-ended", "LINE1L"}, {"Left Line1L Mux", "differential", "LINE1L"}, @@ -703,74 +652,6 @@ static const struct snd_soc_dapm_route intercon[] = { {"Right ADC", NULL, "Right PGA Mixer"}, {"Right ADC", NULL, "GPIO1 dmic modclk"}, - /* Left PGA Bypass */ - {"Left PGA Bypass Mixer", "LineL Switch", "Left PGA Mixer"}, - {"Left PGA Bypass Mixer", "LineR Switch", "Left PGA Mixer"}, - {"Left PGA Bypass Mixer", "Mono Switch", "Left PGA Mixer"}, - {"Left PGA Bypass Mixer", "HPL Switch", "Left PGA Mixer"}, - {"Left PGA Bypass Mixer", "HPR Switch", "Left PGA Mixer"}, - {"Left PGA Bypass Mixer", "HPLCOM Switch", "Left PGA Mixer"}, - {"Left PGA Bypass Mixer", "HPRCOM Switch", "Left PGA Mixer"}, - - {"Left HPCOM Mux", "differential of HPLOUT", "Left PGA Bypass Mixer"}, - {"Left HPCOM Mux", "constant VCM", "Left PGA Bypass Mixer"}, - {"Left HPCOM Mux", "single-ended", "Left PGA Bypass Mixer"}, - - {"Left Line Out", NULL, "Left PGA Bypass Mixer"}, - {"Mono Out", NULL, "Left PGA Bypass Mixer"}, - {"Left HP Out", NULL, "Left PGA Bypass Mixer"}, - - /* Right PGA Bypass */ - {"Right PGA Bypass Mixer", "LineL Switch", "Right PGA Mixer"}, - {"Right PGA Bypass Mixer", "LineR Switch", "Right PGA Mixer"}, - {"Right PGA Bypass Mixer", "Mono Switch", "Right PGA Mixer"}, - {"Right PGA Bypass Mixer", "HPL Switch", "Right PGA Mixer"}, - {"Right PGA Bypass Mixer", "HPR Switch", "Right PGA Mixer"}, - {"Right PGA Bypass Mixer", "HPLCOM Switch", "Right PGA Mixer"}, - {"Right PGA Bypass Mixer", "HPRCOM Switch", "Right PGA Mixer"}, - - {"Right HPCOM Mux", "differential of HPROUT", "Right PGA Bypass Mixer"}, - {"Right HPCOM Mux", "constant VCM", "Right PGA Bypass Mixer"}, - {"Right HPCOM Mux", "single-ended", "Right PGA Bypass Mixer"}, - {"Right HPCOM Mux", "differential of HPLCOM", "Right PGA Bypass Mixer"}, - {"Right HPCOM Mux", "external feedback", "Right PGA Bypass Mixer"}, - - {"Right Line Out", NULL, "Right PGA Bypass Mixer"}, - {"Mono Out", NULL, "Right PGA Bypass Mixer"}, - {"Right HP Out", NULL, "Right PGA Bypass Mixer"}, - - /* Left Line2 Bypass */ - {"Left Line2 Bypass Mixer", "LineL Switch", "Left Line2L Mux"}, - {"Left Line2 Bypass Mixer", "LineR Switch", "Left Line2L Mux"}, - {"Left Line2 Bypass Mixer", "Mono Switch", "Left Line2L Mux"}, - {"Left Line2 Bypass Mixer", "HP Switch", "Left Line2L Mux"}, - {"Left Line2 Bypass Mixer", "HPLCOM Switch", "Left Line2L Mux"}, - - {"Left HPCOM Mux", "differential of HPLOUT", "Left Line2 Bypass Mixer"}, - {"Left HPCOM Mux", "constant VCM", "Left Line2 Bypass Mixer"}, - {"Left HPCOM Mux", "single-ended", "Left Line2 Bypass Mixer"}, - - {"Left Line Out", NULL, "Left Line2 Bypass Mixer"}, - {"Mono Out", NULL, "Left Line2 Bypass Mixer"}, - {"Left HP Out", NULL, "Left Line2 Bypass Mixer"}, - - /* Right Line2 Bypass */ - {"Right Line2 Bypass Mixer", "LineL Switch", "Right Line2R Mux"}, - {"Right Line2 Bypass Mixer", "LineR Switch", "Right Line2R Mux"}, - {"Right Line2 Bypass Mixer", "Mono Switch", "Right Line2R Mux"}, - {"Right Line2 Bypass Mixer", "HP Switch", "Right Line2R Mux"}, - {"Right Line2 Bypass Mixer", "HPRCOM Switch", "Right Line2R Mux"}, - - {"Right HPCOM Mux", "differential of HPROUT", "Right Line2 Bypass Mixer"}, - {"Right HPCOM Mux", "constant VCM", "Right Line2 Bypass Mixer"}, - {"Right HPCOM Mux", "single-ended", "Right Line2 Bypass Mixer"}, - {"Right HPCOM Mux", "differential of HPLCOM", "Right Line2 Bypass Mixer"}, - {"Right HPCOM Mux", "external feedback", "Right Line2 Bypass Mixer"}, - - {"Right Line Out", NULL, "Right Line2 Bypass Mixer"}, - {"Mono Out", NULL, "Right Line2 Bypass Mixer"}, - {"Right HP Out", NULL, "Right Line2 Bypass Mixer"}, - /* * Logical path between digital mic enable and GPIO1 modulator clock * output function @@ -778,6 +659,105 @@ static const struct snd_soc_dapm_route intercon[] = { {"GPIO1 dmic modclk", NULL, "DMic Rate 128"}, {"GPIO1 dmic modclk", NULL, "DMic Rate 64"}, {"GPIO1 dmic modclk", NULL, "DMic Rate 32"}, + + /* Left DAC Output */ + {"Left DAC Mux", "DAC_L1", "Left DAC"}, + {"Left DAC Mux", "DAC_L2", "Left DAC"}, + {"Left DAC Mux", "DAC_L3", "Left DAC"}, + + /* Right DAC Output */ + {"Right DAC Mux", "DAC_R1", "Right DAC"}, + {"Right DAC Mux", "DAC_R2", "Right DAC"}, + {"Right DAC Mux", "DAC_R3", "Right DAC"}, + + /* Left Line Output */ + {"Left Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, + {"Left Line Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, + {"Left Line Mixer", "DACL1 Switch", "Left DAC Mux"}, + {"Left Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, + {"Left Line Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, + {"Left Line Mixer", "DACR1 Switch", "Right DAC Mux"}, + + {"Left Line Out", NULL, "Left Line Mixer"}, + {"Left Line Out", NULL, "Left DAC Mux"}, + {"LLOUT", NULL, "Left Line Out"}, + + /* Right Line Output */ + {"Right Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, + {"Right Line Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, + {"Right Line Mixer", "DACL1 Switch", "Left DAC Mux"}, + {"Right Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, + {"Right Line Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, + {"Right Line Mixer", "DACR1 Switch", "Right DAC Mux"}, + + {"Right Line Out", NULL, "Right Line Mixer"}, + {"Right Line Out", NULL, "Right DAC Mux"}, + {"RLOUT", NULL, "Right Line Out"}, + + /* Mono Output */ + {"Mono Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, + {"Mono Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, + {"Mono Mixer", "DACL1 Switch", "Left DAC Mux"}, + {"Mono Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, + {"Mono Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, + {"Mono Mixer", "DACR1 Switch", "Right DAC Mux"}, + + {"Mono Out", NULL, "Mono Mixer"}, + {"MONO_LOUT", NULL, "Mono Out"}, + + /* Left HP Output */ + {"Left HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, + {"Left HP Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, + {"Left HP Mixer", "DACL1 Switch", "Left DAC Mux"}, + {"Left HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, + {"Left HP Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, + {"Left HP Mixer", "DACR1 Switch", "Right DAC Mux"}, + + {"Left HP Out", NULL, "Left HP Mixer"}, + {"Left HP Out", NULL, "Left DAC Mux"}, + {"HPLOUT", NULL, "Left HP Out"}, + + /* Right HP Output */ + {"Right HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, + {"Right HP Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, + {"Right HP Mixer", "DACL1 Switch", "Left DAC Mux"}, + {"Right HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, + {"Right HP Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, + {"Right HP Mixer", "DACR1 Switch", "Right DAC Mux"}, + + {"Right HP Out", NULL, "Right HP Mixer"}, + {"Right HP Out", NULL, "Right DAC Mux"}, + {"HPROUT", NULL, "Right HP Out"}, + + /* Left HPCOM Output */ + {"Left HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, + {"Left HPCOM Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, + {"Left HPCOM Mixer", "DACL1 Switch", "Left DAC Mux"}, + {"Left HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, + {"Left HPCOM Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, + {"Left HPCOM Mixer", "DACR1 Switch", "Right DAC Mux"}, + + {"Left HPCOM Mux", "differential of HPLOUT", "Left HP Mixer"}, + {"Left HPCOM Mux", "constant VCM", "Left HPCOM Mixer"}, + {"Left HPCOM Mux", "single-ended", "Left HPCOM Mixer"}, + {"Left HP Com", NULL, "Left HPCOM Mux"}, + {"HPLCOM", NULL, "Left HP Com"}, + + /* Right HPCOM Output */ + {"Right HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, + {"Right HPCOM Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, + {"Right HPCOM Mixer", "DACL1 Switch", "Left DAC Mux"}, + {"Right HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, + {"Right HPCOM Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, + {"Right HPCOM Mixer", "DACR1 Switch", "Right DAC Mux"}, + + {"Right HPCOM Mux", "differential of HPROUT", "Right HP Mixer"}, + {"Right HPCOM Mux", "constant VCM", "Right HPCOM Mixer"}, + {"Right HPCOM Mux", "single-ended", "Right HPCOM Mixer"}, + {"Right HPCOM Mux", "differential of HPLCOM", "Left HPCOM Mixer"}, + {"Right HPCOM Mux", "external feedback", "Right HPCOM Mixer"}, + {"Right HP Com", NULL, "Right HPCOM Mux"}, + {"HPRCOM", NULL, "Right HP Com"}, }; static const struct snd_soc_dapm_route intercon_3007[] = { diff --git a/sound/soc/codecs/tlv320aic3x.h b/sound/soc/codecs/tlv320aic3x.h index 20d8cac2637c..06a19784b162 100644 --- a/sound/soc/codecs/tlv320aic3x.h +++ b/sound/soc/codecs/tlv320aic3x.h @@ -85,22 +85,30 @@ #define LINE2L_2_HPLOUT_VOL 45 #define PGAL_2_HPLOUT_VOL 46 #define DACL1_2_HPLOUT_VOL 47 +#define LINE2R_2_HPLOUT_VOL 48 #define PGAR_2_HPLOUT_VOL 49 +#define DACR1_2_HPLOUT_VOL 50 #define HPLOUT_CTRL 51 /* Left High Power COM control registers */ #define LINE2L_2_HPLCOM_VOL 52 #define PGAL_2_HPLCOM_VOL 53 #define DACL1_2_HPLCOM_VOL 54 +#define LINE2R_2_HPLCOM_VOL 55 #define PGAR_2_HPLCOM_VOL 56 +#define DACR1_2_HPLCOM_VOL 57 #define HPLCOM_CTRL 58 /* Right High Power Output control registers */ +#define LINE2L_2_HPROUT_VOL 59 #define PGAL_2_HPROUT_VOL 60 +#define DACL1_2_HPROUT_VOL 61 #define LINE2R_2_HPROUT_VOL 62 #define PGAR_2_HPROUT_VOL 63 #define DACR1_2_HPROUT_VOL 64 #define HPROUT_CTRL 65 /* Right High Power COM control registers */ +#define LINE2L_2_HPRCOM_VOL 66 #define PGAL_2_HPRCOM_VOL 67 +#define DACL1_2_HPRCOM_VOL 68 #define LINE2R_2_HPRCOM_VOL 69 #define PGAR_2_HPRCOM_VOL 70 #define DACR1_2_HPRCOM_VOL 71 -- cgit v1.2.3 From 098b1718230466b48f2027eb26cdc921760ae5da Mon Sep 17 00:00:00 2001 From: Jarkko Nikula Date: Fri, 27 Aug 2010 16:56:50 +0300 Subject: ASoC: tlv320aic3x: Sanitize output controls Currently output controls are not uniform. Some routes are adjusted by mono controls that don't match to associated mixer switch, many routes are not covered at all and stereo controls have following variants: - L-to-L & R-to-R - R-to-L & R-to-R - L-to-L & R-to-L This patch attempts to fix these issues. First, for the convenience, only direct L-to-L, R-to-R and [L | R]-to-Mono routes are controlled by the stereo controls. This logic is also used with the output pin mute controls so all of them except mono output are controlled by stereo switches. Then rest of the swapped L-to-R and R-to-L routes are controlled by the mono controls that map to mixer switches with a same name. Mixers can then associate these switches and volumes together. Signed-off-by: Jarkko Nikula Acked-by: Mark Brown Signed-off-by: Liam Girdwood --- sound/soc/codecs/tlv320aic3x.c | 114 +++++++++++++++++++++++++++-------------- 1 file changed, 76 insertions(+), 38 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index 0a3b98c097bb..8577c50d8d22 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c @@ -292,64 +292,102 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = { SOC_DOUBLE_R_TLV("PCM Playback Volume", LDAC_VOL, RDAC_VOL, 0, 0x7f, 1, dac_tlv), + /* + * Output controls that map to output mixer switches. Note these are + * only for swapped L-to-R and R-to-L routes. See below stereo controls + * for direct L-to-L and R-to-R routes. + */ + SOC_SINGLE_TLV("Left Line Mixer Line2R Bypass Volume", + LINE2R_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv), + SOC_SINGLE_TLV("Left Line Mixer PGAR Bypass Volume", + PGAR_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv), + SOC_SINGLE_TLV("Left Line Mixer DACR1 Playback Volume", + DACR1_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv), + + SOC_SINGLE_TLV("Right Line Mixer Line2L Bypass Volume", + LINE2L_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv), + SOC_SINGLE_TLV("Right Line Mixer PGAL Bypass Volume", + PGAL_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv), + SOC_SINGLE_TLV("Right Line Mixer DACL1 Playback Volume", + DACL1_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv), + + SOC_SINGLE_TLV("Left HP Mixer Line2R Bypass Volume", + LINE2R_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv), + SOC_SINGLE_TLV("Left HP Mixer PGAR Bypass Volume", + PGAR_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv), + SOC_SINGLE_TLV("Left HP Mixer DACR1 Playback Volume", + DACR1_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv), + + SOC_SINGLE_TLV("Right HP Mixer Line2L Bypass Volume", + LINE2L_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv), + SOC_SINGLE_TLV("Right HP Mixer PGAL Bypass Volume", + PGAL_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv), + SOC_SINGLE_TLV("Right HP Mixer DACL1 Playback Volume", + DACL1_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv), + + SOC_SINGLE_TLV("Left HPCOM Mixer Line2R Bypass Volume", + LINE2R_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv), + SOC_SINGLE_TLV("Left HPCOM Mixer PGAR Bypass Volume", + PGAR_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv), + SOC_SINGLE_TLV("Left HPCOM Mixer DACR1 Playback Volume", + DACR1_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv), + + SOC_SINGLE_TLV("Right HPCOM Mixer Line2L Bypass Volume", + LINE2L_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv), + SOC_SINGLE_TLV("Right HPCOM Mixer PGAL Bypass Volume", + PGAL_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv), + SOC_SINGLE_TLV("Right HPCOM Mixer DACL1 Playback Volume", + DACL1_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv), + + /* Stereo output controls for direct L-to-L and R-to-R routes */ + SOC_DOUBLE_R_TLV("Line Line2 Bypass Volume", + LINE2L_2_LLOPM_VOL, LINE2R_2_RLOPM_VOL, + 0, 118, 1, output_stage_tlv), + SOC_DOUBLE_R_TLV("Line PGA Bypass Volume", + PGAL_2_LLOPM_VOL, PGAR_2_RLOPM_VOL, + 0, 118, 1, output_stage_tlv), SOC_DOUBLE_R_TLV("Line DAC Playback Volume", DACL1_2_LLOPM_VOL, DACR1_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv), - SOC_SINGLE("LineL Playback Switch", LLOPM_CTRL, 3, 0x01, 0), - SOC_SINGLE("LineR Playback Switch", RLOPM_CTRL, 3, 0x01, 0), - SOC_DOUBLE_R_TLV("LineL DAC Playback Volume", - DACL1_2_LLOPM_VOL, DACR1_2_LLOPM_VOL, - 0, 118, 1, output_stage_tlv), - SOC_SINGLE_TLV("LineL Left PGA Bypass Playback Volume", - PGAL_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv), - SOC_SINGLE_TLV("LineR Right PGA Bypass Playback Volume", - PGAR_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv), - SOC_DOUBLE_R_TLV("LineL Line2 Bypass Playback Volume", - LINE2L_2_LLOPM_VOL, LINE2R_2_LLOPM_VOL, + + SOC_DOUBLE_R_TLV("Mono Line2 Bypass Volume", + LINE2L_2_MONOLOPM_VOL, LINE2R_2_MONOLOPM_VOL, 0, 118, 1, output_stage_tlv), - SOC_DOUBLE_R_TLV("LineR Line2 Bypass Playback Volume", - LINE2L_2_RLOPM_VOL, LINE2R_2_RLOPM_VOL, + SOC_DOUBLE_R_TLV("Mono PGA Bypass Volume", + PGAL_2_MONOLOPM_VOL, PGAR_2_MONOLOPM_VOL, 0, 118, 1, output_stage_tlv), - SOC_DOUBLE_R_TLV("Mono DAC Playback Volume", DACL1_2_MONOLOPM_VOL, DACR1_2_MONOLOPM_VOL, 0, 118, 1, output_stage_tlv), - SOC_SINGLE("Mono Playback Switch", MONOLOPM_CTRL, 3, 0x01, 0), - SOC_DOUBLE_R_TLV("Mono PGA Bypass Playback Volume", - PGAL_2_MONOLOPM_VOL, PGAR_2_MONOLOPM_VOL, + + SOC_DOUBLE_R_TLV("HP Line2 Bypass Volume", + LINE2L_2_HPLOUT_VOL, LINE2R_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv), - SOC_DOUBLE_R_TLV("Mono Line2 Bypass Playback Volume", - LINE2L_2_MONOLOPM_VOL, LINE2R_2_MONOLOPM_VOL, + SOC_DOUBLE_R_TLV("HP PGA Bypass Volume", + PGAL_2_HPLOUT_VOL, PGAR_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv), - SOC_DOUBLE_R_TLV("HP DAC Playback Volume", DACL1_2_HPLOUT_VOL, DACR1_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv), - SOC_DOUBLE_R("HP Playback Switch", HPLOUT_CTRL, HPROUT_CTRL, 3, - 0x01, 0), - SOC_DOUBLE_R_TLV("HP Right PGA Bypass Playback Volume", - PGAR_2_HPLOUT_VOL, PGAR_2_HPROUT_VOL, + + SOC_DOUBLE_R_TLV("HPCOM Line2 Bypass Volume", + LINE2L_2_HPLCOM_VOL, LINE2R_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv), - SOC_SINGLE_TLV("HPL PGA Bypass Playback Volume", - PGAL_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv), - SOC_SINGLE_TLV("HPR PGA Bypass Playback Volume", - PGAL_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv), - SOC_DOUBLE_R_TLV("HP Line2 Bypass Playback Volume", - LINE2L_2_HPLOUT_VOL, LINE2R_2_HPROUT_VOL, + SOC_DOUBLE_R_TLV("HPCOM PGA Bypass Volume", + PGAL_2_HPLCOM_VOL, PGAR_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv), - SOC_DOUBLE_R_TLV("HPCOM DAC Playback Volume", DACL1_2_HPLCOM_VOL, DACR1_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv), + + /* Output pin mute controls */ + SOC_DOUBLE_R("Line Playback Switch", LLOPM_CTRL, RLOPM_CTRL, 3, + 0x01, 0), + SOC_SINGLE("Mono Playback Switch", MONOLOPM_CTRL, 3, 0x01, 0), + SOC_DOUBLE_R("HP Playback Switch", HPLOUT_CTRL, HPROUT_CTRL, 3, + 0x01, 0), SOC_DOUBLE_R("HPCOM Playback Switch", HPLCOM_CTRL, HPRCOM_CTRL, 3, 0x01, 0), - SOC_SINGLE_TLV("HPLCOM PGA Bypass Playback Volume", - PGAL_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv), - SOC_SINGLE_TLV("HPRCOM PGA Bypass Playback Volume", - PGAL_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv), - SOC_DOUBLE_R_TLV("HPCOM Line2 Bypass Playback Volume", - LINE2L_2_HPLCOM_VOL, LINE2R_2_HPRCOM_VOL, - 0, 118, 1, output_stage_tlv), /* * Note: enable Automatic input Gain Controller with care. It can -- cgit v1.2.3 From 7a28826ac73d31a379d93785d8fbd24ab492b0bd Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Fri, 27 Aug 2010 22:02:15 +0200 Subject: ALSA: pcm: add more format names There were some new formats added in commit 15c0cee6c809 "ALSA: pcm: Define G723 3-bit and 5-bit formats". That commit increased SNDRV_PCM_FORMAT_LAST as well. My concern is that there are a couple places which do: for (i = 0; i < SNDRV_PCM_FORMAT_LAST; i++) { if (dummy->pcm_hw.formats & (1ULL << i)) snd_iprintf(buffer, " %s", snd_pcm_format_name(i)); } I haven't tested these but it looks like if "i" were equal to SNDRV_PCM_FORMAT_G723_24 or higher then we might read past the end of the array. Signed-off-by: Dan Carpenter Signed-off-by: Takashi Iwai --- sound/core/pcm.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'sound') diff --git a/sound/core/pcm.c b/sound/core/pcm.c index cbe815dfbdc8..204af48c5cc1 100644 --- a/sound/core/pcm.c +++ b/sound/core/pcm.c @@ -203,10 +203,16 @@ static char *snd_pcm_format_names[] = { FORMAT(S18_3BE), FORMAT(U18_3LE), FORMAT(U18_3BE), + FORMAT(G723_24), + FORMAT(G723_24_1B), + FORMAT(G723_40), + FORMAT(G723_40_1B), }; const char *snd_pcm_format_name(snd_pcm_format_t format) { + if (format >= ARRAY_SIZE(snd_pcm_format_names)) + return "Unknown"; return snd_pcm_format_names[format]; } EXPORT_SYMBOL_GPL(snd_pcm_format_name); -- cgit v1.2.3 From 73413b120d5d6eb6c98451bbc19acf43e0e300ae Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 30 Aug 2010 09:39:57 +0200 Subject: ALSA: hda - embed alc_fixup contents into struct definitions Instead of defining each content as a separate struct, put all into the definition of struct alc_fixup arrays so that reader doesn't go back to see the definition again. Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 70 ++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 41 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 627bf9963368..50e0c82fd994 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -6799,14 +6799,12 @@ enum { PINFIX_HP_DC5750, }; -static struct alc_pincfg alc260_hp_dc5750_pinfix[] = { - { 0x11, 0x90130110 }, /* speaker */ - { } -}; - static const struct alc_fixup alc260_fixups[] = { [PINFIX_HP_DC5750] = { - .pins = alc260_hp_dc5750_pinfix + .pins = (const struct alc_pincfg[]) { + { 0x11, 0x90130110 }, /* speaker */ + { } + } }, }; @@ -10452,24 +10450,20 @@ enum { PINFIX_PB_M5210, }; -static struct alc_pincfg alc882_abit_aw9d_pinfix[] = { - { 0x15, 0x01080104 }, /* side */ - { 0x16, 0x01011012 }, /* rear */ - { 0x17, 0x01016011 }, /* clfe */ - { } -}; - -static const struct hda_verb pb_m5210_verbs[] = { - { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, - {} -}; - static const struct alc_fixup alc882_fixups[] = { [PINFIX_ABIT_AW9D_MAX] = { - .pins = alc882_abit_aw9d_pinfix + .pins = (const struct alc_pincfg[]) { + { 0x15, 0x01080104 }, /* side */ + { 0x16, 0x01011012 }, /* rear */ + { 0x17, 0x01016011 }, /* clfe */ + { } + } }, [PINFIX_PB_M5210] = { - .verbs = pb_m5210_verbs + .verbs = (const struct hda_verb[]) { + { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, + {} + } }, }; @@ -14454,14 +14448,12 @@ enum { ALC269_FIXUP_SONY_VAIO, }; -static const struct hda_verb alc269_sony_vaio_fixup_verbs[] = { - {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD}, - {} -}; - static const struct alc_fixup alc269_fixups[] = { [ALC269_FIXUP_SONY_VAIO] = { - .verbs = alc269_sony_vaio_fixup_verbs + .verbs = (const struct hda_verb[]) { + {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD}, + {} + } }, }; @@ -15819,15 +15811,13 @@ enum { PINFIX_FSC_AMILO_PI1505, }; -static struct alc_pincfg alc861_fsc_amilo_pi1505_pinfix[] = { - { 0x0b, 0x0221101f }, /* HP */ - { 0x0f, 0x90170310 }, /* speaker */ - { } -}; - static const struct alc_fixup alc861_fixups[] = { [PINFIX_FSC_AMILO_PI1505] = { - .pins = alc861_fsc_amilo_pi1505_pinfix + .pins = (const struct alc_pincfg[]) { + { 0x0b, 0x0221101f }, /* HP */ + { 0x0f, 0x90170310 }, /* speaker */ + { } + } }, }; @@ -16794,16 +16784,14 @@ enum { }; /* reset GPIO1 */ -static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = { - {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, - {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, - {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, - { } -}; - static const struct alc_fixup alc861vd_fixups[] = { [ALC660VD_FIX_ASUS_GPIO1] = { - .verbs = alc660vd_fix_asus_gpio1_verbs, + .verbs = (const struct hda_verb[]) { + {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, + {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, + {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, + { } + } }, }; -- cgit v1.2.3 From f3268512c3a5dea587cfe875b8bca98d9e164cd9 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 30 Aug 2010 11:00:19 +0200 Subject: ALSA: hda - Refactor input-pin parser for VIA codecs patch_via.c has redundant codes for parsing the input-pins. Although they are pretty similar, but all implemented in different functions just because of hard-coded ids and slight incompatibilities. This patch refactors the codes to use the common helper function, resulting in the reduction of many lines. Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_via.c | 390 +++++++--------------------------------------- 1 file changed, 60 insertions(+), 330 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index ae3acb2b42d1..41861388f43a 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c @@ -2413,51 +2413,53 @@ static int vt1708_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) } /* create playback/capture controls for input pins */ -static int vt1708_auto_create_analog_input_ctls(struct via_spec *spec, - const struct auto_pin_cfg *cfg) +static int vt_auto_create_analog_input_ctls(struct via_spec *spec, + const struct auto_pin_cfg *cfg, + hda_nid_t cap_nid, + hda_nid_t pin_idxs[], int num_idxs) { - static char *labels[] = { - "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux", NULL - }; struct hda_input_mux *imux = &spec->private_imux[0]; - int i, err, idx = 0; + int i, err, idx; /* for internal loopback recording select */ - imux->items[imux->num_items].label = "Stereo Mixer"; - imux->items[imux->num_items].index = idx; - imux->num_items++; + for (idx = 0; idx < num_idxs; idx++) { + if (pin_idxs[idx] == 0xff) { + imux->items[imux->num_items].label = "Stereo Mixer"; + imux->items[imux->num_items].index = idx; + imux->num_items++; + break; + } + } for (i = 0; i < AUTO_PIN_LAST; i++) { if (!cfg->input_pins[i]) continue; - switch (cfg->input_pins[i]) { - case 0x1d: /* Mic */ - idx = 2; - break; - - case 0x1e: /* Line In */ - idx = 3; - break; - - case 0x21: /* Front Mic */ - idx = 4; - break; - - case 0x24: /* CD */ - idx = 1; - break; - } - err = via_new_analog_input(spec, labels[i], idx, 0x17); + for (idx = 0; idx < num_idxs; idx++) + if (pin_idxs[idx] == cfg->input_pins[i]) + break; + if (idx >= num_idxs) + continue; + err = via_new_analog_input(spec, auto_pin_cfg_labels[i], + idx, cap_nid); if (err < 0) return err; - imux->items[imux->num_items].label = labels[i]; + imux->items[imux->num_items].label = auto_pin_cfg_labels[i]; imux->items[imux->num_items].index = idx; imux->num_items++; } return 0; } +/* create playback/capture controls for input pins */ +static int vt1708_auto_create_analog_input_ctls(struct via_spec *spec, + const struct auto_pin_cfg *cfg) +{ + static hda_nid_t pin_idxs[] = { 0xff, 0x24, 0x1d, 0x1e, 0x21 }; + return vt_auto_create_analog_input_ctls(spec, cfg, 0x17, pin_idxs, + ARRAY_SIZE(pin_idxs)); +} + #ifdef CONFIG_SND_HDA_POWER_SAVE static struct hda_amp_list vt1708_loopbacks[] = { { 0x17, HDA_INPUT, 1 }, @@ -3024,46 +3026,9 @@ static int vt1709_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) static int vt1709_auto_create_analog_input_ctls(struct via_spec *spec, const struct auto_pin_cfg *cfg) { - static char *labels[] = { - "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux", NULL - }; - struct hda_input_mux *imux = &spec->private_imux[0]; - int i, err, idx = 0; - - /* for internal loopback recording select */ - imux->items[imux->num_items].label = "Stereo Mixer"; - imux->items[imux->num_items].index = idx; - imux->num_items++; - - for (i = 0; i < AUTO_PIN_LAST; i++) { - if (!cfg->input_pins[i]) - continue; - - switch (cfg->input_pins[i]) { - case 0x1d: /* Mic */ - idx = 2; - break; - - case 0x1e: /* Line In */ - idx = 3; - break; - - case 0x21: /* Front Mic */ - idx = 4; - break; - - case 0x23: /* CD */ - idx = 1; - break; - } - err = via_new_analog_input(spec, labels[i], idx, 0x18); - if (err < 0) - return err; - imux->items[imux->num_items].label = labels[i]; - imux->items[imux->num_items].index = idx; - imux->num_items++; - } - return 0; + static hda_nid_t pin_idxs[] = { 0xff, 0x23, 0x1d, 0x1e, 0x21 }; + return vt_auto_create_analog_input_ctls(spec, cfg, 0x18, pin_idxs, + ARRAY_SIZE(pin_idxs)); } static int vt1709_parse_auto_config(struct hda_codec *codec) @@ -3591,46 +3556,9 @@ static int vt1708B_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) static int vt1708B_auto_create_analog_input_ctls(struct via_spec *spec, const struct auto_pin_cfg *cfg) { - static char *labels[] = { - "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux", NULL - }; - struct hda_input_mux *imux = &spec->private_imux[0]; - int i, err, idx = 0; - - /* for internal loopback recording select */ - imux->items[imux->num_items].label = "Stereo Mixer"; - imux->items[imux->num_items].index = idx; - imux->num_items++; - - for (i = 0; i < AUTO_PIN_LAST; i++) { - if (!cfg->input_pins[i]) - continue; - - switch (cfg->input_pins[i]) { - case 0x1a: /* Mic */ - idx = 2; - break; - - case 0x1b: /* Line In */ - idx = 3; - break; - - case 0x1e: /* Front Mic */ - idx = 4; - break; - - case 0x1f: /* CD */ - idx = 1; - break; - } - err = via_new_analog_input(spec, labels[i], idx, 0x16); - if (err < 0) - return err; - imux->items[imux->num_items].label = labels[i]; - imux->items[imux->num_items].index = idx; - imux->num_items++; - } - return 0; + static hda_nid_t pin_idxs[] = { 0xff, 0x1f, 0x1a, 0x1b, 0x1e }; + return vt_auto_create_analog_input_ctls(spec, cfg, 0x16, pin_idxs, + ARRAY_SIZE(pin_idxs)); } static int vt1708B_parse_auto_config(struct hda_codec *codec) @@ -4064,46 +3992,9 @@ static int vt1708S_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) static int vt1708S_auto_create_analog_input_ctls(struct via_spec *spec, const struct auto_pin_cfg *cfg) { - static char *labels[] = { - "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux", NULL - }; - struct hda_input_mux *imux = &spec->private_imux[0]; - int i, err, idx = 0; - - /* for internal loopback recording select */ - imux->items[imux->num_items].label = "Stereo Mixer"; - imux->items[imux->num_items].index = 5; - imux->num_items++; - - for (i = 0; i < AUTO_PIN_LAST; i++) { - if (!cfg->input_pins[i]) - continue; - - switch (cfg->input_pins[i]) { - case 0x1a: /* Mic */ - idx = 2; - break; - - case 0x1b: /* Line In */ - idx = 3; - break; - - case 0x1e: /* Front Mic */ - idx = 4; - break; - - case 0x1f: /* CD */ - idx = 1; - break; - } - err = via_new_analog_input(spec, labels[i], idx, 0x16); - if (err < 0) - return err; - imux->items[imux->num_items].label = labels[i]; - imux->items[imux->num_items].index = idx-1; - imux->num_items++; - } - return 0; + static hda_nid_t pin_idxs[] = { 0x1f, 0x1a, 0x1b, 0x1e, 0, 0xff }; + return vt_auto_create_analog_input_ctls(spec, cfg, 0x16, pin_idxs, + ARRAY_SIZE(pin_idxs)); } /* fill out digital output widgets; one for master and one for slave outputs */ @@ -4457,42 +4348,9 @@ static int vt1702_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) static int vt1702_auto_create_analog_input_ctls(struct via_spec *spec, const struct auto_pin_cfg *cfg) { - static char *labels[] = { - "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux", NULL - }; - struct hda_input_mux *imux = &spec->private_imux[0]; - int i, err, idx = 0; - - /* for internal loopback recording select */ - imux->items[imux->num_items].label = "Stereo Mixer"; - imux->items[imux->num_items].index = 3; - imux->num_items++; - - for (i = 0; i < AUTO_PIN_LAST; i++) { - if (!cfg->input_pins[i]) - continue; - - switch (cfg->input_pins[i]) { - case 0x14: /* Mic */ - idx = 1; - break; - - case 0x15: /* Line In */ - idx = 2; - break; - - case 0x18: /* Front Mic */ - idx = 3; - break; - } - err = via_new_analog_input(spec, labels[i], idx, 0x1A); - if (err < 0) - return err; - imux->items[imux->num_items].label = labels[i]; - imux->items[imux->num_items].index = idx-1; - imux->num_items++; - } - return 0; + static hda_nid_t pin_idxs[] = { 0x14, 0x15, 0x18, 0xff }; + return vt_auto_create_analog_input_ctls(spec, cfg, 0x1a, pin_idxs, + ARRAY_SIZE(pin_idxs)); } static int vt1702_parse_auto_config(struct hda_codec *codec) @@ -4875,46 +4733,9 @@ static int vt1718S_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) static int vt1718S_auto_create_analog_input_ctls(struct via_spec *spec, const struct auto_pin_cfg *cfg) { - static char *labels[] = { - "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux", NULL - }; - struct hda_input_mux *imux = &spec->private_imux[0]; - int i, err, idx = 0; - - /* for internal loopback recording select */ - imux->items[imux->num_items].label = "Stereo Mixer"; - imux->items[imux->num_items].index = 5; - imux->num_items++; - - for (i = 0; i < AUTO_PIN_LAST; i++) { - if (!cfg->input_pins[i]) - continue; - - switch (cfg->input_pins[i]) { - case 0x2b: /* Mic */ - idx = 1; - break; - - case 0x2a: /* Line In */ - idx = 2; - break; - - case 0x29: /* Front Mic */ - idx = 3; - break; - - case 0x2c: /* CD */ - idx = 0; - break; - } - err = via_new_analog_input(spec, labels[i], idx, 0x21); - if (err < 0) - return err; - imux->items[imux->num_items].label = labels[i]; - imux->items[imux->num_items].index = idx; - imux->num_items++; - } - return 0; + static hda_nid_t pin_idxs[] = { 0x2c, 0x2b, 0x2a, 0x29, 0, 0xff }; + return vt_auto_create_analog_input_ctls(spec, cfg, 0x21, pin_idxs, + ARRAY_SIZE(pin_idxs)); } static int vt1718S_parse_auto_config(struct hda_codec *codec) @@ -5374,46 +5195,9 @@ static int vt1716S_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) static int vt1716S_auto_create_analog_input_ctls(struct via_spec *spec, const struct auto_pin_cfg *cfg) { - static char *labels[] = { - "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux", NULL - }; - struct hda_input_mux *imux = &spec->private_imux[0]; - int i, err, idx = 0; - - /* for internal loopback recording select */ - imux->items[imux->num_items].label = "Stereo Mixer"; - imux->items[imux->num_items].index = 5; - imux->num_items++; - - for (i = 0; i < AUTO_PIN_LAST; i++) { - if (!cfg->input_pins[i]) - continue; - - switch (cfg->input_pins[i]) { - case 0x1a: /* Mic */ - idx = 2; - break; - - case 0x1b: /* Line In */ - idx = 3; - break; - - case 0x1e: /* Front Mic */ - idx = 4; - break; - - case 0x1f: /* CD */ - idx = 1; - break; - } - err = via_new_analog_input(spec, labels[i], idx, 0x16); - if (err < 0) - return err; - imux->items[imux->num_items].label = labels[i]; - imux->items[imux->num_items].index = idx-1; - imux->num_items++; - } - return 0; + static hda_nid_t pin_idxs[] = { 0x1f, 0x1a, 0x1b, 0x1e, 0, 0xff }; + return vt_auto_create_analog_input_ctls(spec, cfg, 0x16, pin_idxs, + ARRAY_SIZE(pin_idxs)); } static int vt1716S_parse_auto_config(struct hda_codec *codec) @@ -5720,47 +5504,19 @@ static int vt2002P_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) static int vt2002P_auto_create_analog_input_ctls(struct via_spec *spec, const struct auto_pin_cfg *cfg) { - static char *labels[] = { - "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux", NULL - }; struct hda_input_mux *imux = &spec->private_imux[0]; - int i, err, idx = 0; - - for (i = 0; i < AUTO_PIN_LAST; i++) { - if (!cfg->input_pins[i]) - continue; - - switch (cfg->input_pins[i]) { - case 0x2b: /* Mic */ - idx = 0; - break; - - case 0x2a: /* Line In */ - idx = 1; - break; - - case 0x29: /* Front Mic */ - idx = 2; - break; - } - err = via_new_analog_input(spec, labels[i], idx, 0x21); - if (err < 0) - return err; - imux->items[imux->num_items].label = labels[i]; - imux->items[imux->num_items].index = idx; - imux->num_items++; - } + static hda_nid_t pin_idxs[] = { 0x2b, 0x2a, 0x29, 0xff }; + int err; + err = vt_auto_create_analog_input_ctls(spec, cfg, 0x21, pin_idxs, + ARRAY_SIZE(pin_idxs)); + if (err < 0) + return err; /* build volume/mute control of loopback */ err = via_new_analog_input(spec, "Stereo Mixer", 3, 0x21); if (err < 0) return err; - /* for internal loopback recording select */ - imux->items[imux->num_items].label = "Stereo Mixer"; - imux->items[imux->num_items].index = 3; - imux->num_items++; - /* for digital mic select */ imux->items[imux->num_items].label = "Digital Mic"; imux->items[imux->num_items].index = 4; @@ -6070,46 +5826,20 @@ static int vt1812_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) static int vt1812_auto_create_analog_input_ctls(struct via_spec *spec, const struct auto_pin_cfg *cfg) { - static char *labels[] = { - "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux", NULL - }; struct hda_input_mux *imux = &spec->private_imux[0]; - int i, err, idx = 0; - - for (i = 0; i < AUTO_PIN_LAST; i++) { - if (!cfg->input_pins[i]) - continue; - - switch (cfg->input_pins[i]) { - case 0x2b: /* Mic */ - idx = 0; - break; + static hda_nid_t pin_idxs[] = { 0x2b, 0x2a, 0x29, 0, 0, 0xff }; + int err; - case 0x2a: /* Line In */ - idx = 1; - break; + err = vt_auto_create_analog_input_ctls(spec, cfg, 0x21, pin_idxs, + ARRAY_SIZE(pin_idxs)); + if (err < 0) + return err; - case 0x29: /* Front Mic */ - idx = 2; - break; - } - err = via_new_analog_input(spec, labels[i], idx, 0x21); - if (err < 0) - return err; - imux->items[imux->num_items].label = labels[i]; - imux->items[imux->num_items].index = idx; - imux->num_items++; - } /* build volume/mute control of loopback */ err = via_new_analog_input(spec, "Stereo Mixer", 5, 0x21); if (err < 0) return err; - /* for internal loopback recording select */ - imux->items[imux->num_items].label = "Stereo Mixer"; - imux->items[imux->num_items].index = 5; - imux->num_items++; - /* for digital mic select */ imux->items[imux->num_items].label = "Digital Mic"; imux->items[imux->num_items].index = 6; -- cgit v1.2.3 From 75e0eb24ee3ec3549c2e53707dcc87e5f7a2c791 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 30 Aug 2010 12:56:55 +0200 Subject: ALSA: hda - Add inputs[] to auto_pin_cfg struct Added the new fields to contain all input-pins to struct auto_pin_cfg. Unlike the existing input_pins[], this array contains all input pins even if the multiple pins are assigned for a single role (i.e. two front mics). The former input_pins[] still remains for a while, but will be removed in near future. Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_codec.c | 40 +++++++++++++++++++++++++++++----------- sound/pci/hda/hda_local.h | 12 +++++++++++- 2 files changed, 40 insertions(+), 12 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 3827092cc1d2..280a739c2a99 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -4372,6 +4372,17 @@ static void sort_pins_by_sequence(hda_nid_t *pins, short *sequences, } +/* add the found input-pin to the cfg->inputs[] table */ +static void add_auto_cfg_input_pin(struct auto_pin_cfg *cfg, hda_nid_t nid, + int type) +{ + if (cfg->num_inputs < AUTO_CFG_MAX_INS) { + cfg->inputs[cfg->num_inputs].pin = nid; + cfg->inputs[cfg->num_inputs].type = type; + cfg->num_inputs++; + } +} + /* * Parse all pin widgets and store the useful pin nids to cfg * @@ -4398,6 +4409,7 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec, short sequences_line_out[ARRAY_SIZE(cfg->line_out_pins)]; short sequences_speaker[ARRAY_SIZE(cfg->speaker_pins)]; short sequences_hp[ARRAY_SIZE(cfg->hp_pins)]; + int i; memset(cfg, 0, sizeof(*cfg)); @@ -4482,19 +4494,26 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec, cfg->input_pins[preferred] = nid; else if (!cfg->input_pins[alt]) cfg->input_pins[alt] = nid; + add_auto_cfg_input_pin(cfg, nid, preferred); break; } - case AC_JACK_LINE_IN: + case AC_JACK_LINE_IN: { + int type; if (loc == AC_JACK_LOC_FRONT) - cfg->input_pins[AUTO_PIN_FRONT_LINE] = nid; + type = AUTO_PIN_FRONT_LINE; else - cfg->input_pins[AUTO_PIN_LINE] = nid; + type = AUTO_PIN_LINE; + cfg->input_pins[type] = nid; + add_auto_cfg_input_pin(cfg, nid, type); break; + } case AC_JACK_CD: cfg->input_pins[AUTO_PIN_CD] = nid; + add_auto_cfg_input_pin(cfg, nid, AUTO_PIN_CD); break; case AC_JACK_AUX: cfg->input_pins[AUTO_PIN_AUX] = nid; + add_auto_cfg_input_pin(cfg, nid, AUTO_PIN_AUX); break; case AC_JACK_SPDIF_OUT: case AC_JACK_DIG_OTHER_OUT: @@ -4621,14 +4640,13 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec, if (cfg->dig_outs) snd_printd(" dig-out=0x%x/0x%x\n", cfg->dig_out_pins[0], cfg->dig_out_pins[1]); - snd_printd(" inputs: mic=0x%x, fmic=0x%x, line=0x%x, fline=0x%x," - " cd=0x%x, aux=0x%x\n", - cfg->input_pins[AUTO_PIN_MIC], - cfg->input_pins[AUTO_PIN_FRONT_MIC], - cfg->input_pins[AUTO_PIN_LINE], - cfg->input_pins[AUTO_PIN_FRONT_LINE], - cfg->input_pins[AUTO_PIN_CD], - cfg->input_pins[AUTO_PIN_AUX]); + snd_printd(" inputs:"); + for (i = 0; i < cfg->num_inputs; i++) { + snd_printdd(" %s=0x%x", + auto_pin_cfg_labels[cfg->inputs[i].type], + cfg->inputs[i].pin); + } + snd_printd("\n"); if (cfg->dig_in_pin) snd_printd(" dig-in=0x%x\n", cfg->dig_in_pin); diff --git a/sound/pci/hda/hda_local.h b/sound/pci/hda/hda_local.h index 28ab4aead48f..44c909445ba2 100644 --- a/sound/pci/hda/hda_local.h +++ b/sound/pci/hda/hda_local.h @@ -383,6 +383,14 @@ enum { extern const char *auto_pin_cfg_labels[AUTO_PIN_LAST]; #define AUTO_CFG_MAX_OUTS 5 +#define AUTO_CFG_MAX_INS 8 + +struct auto_pin_cfg_item { + hda_nid_t pin; + int type; +}; + +struct auto_pin_cfg; struct auto_pin_cfg { int line_outs; @@ -393,7 +401,9 @@ struct auto_pin_cfg { int hp_outs; int line_out_type; /* AUTO_PIN_XXX_OUT */ hda_nid_t hp_pins[AUTO_CFG_MAX_OUTS]; - hda_nid_t input_pins[AUTO_PIN_LAST]; + hda_nid_t input_pins[AUTO_PIN_LAST]; /* old config; to be deprecated */ + int num_inputs; + struct auto_pin_cfg_item inputs[AUTO_CFG_MAX_INS]; int dig_outs; hda_nid_t dig_out_pins[2]; hda_nid_t dig_in_pin; -- cgit v1.2.3 From d7b1ae9d8851bd247590cf7ab53248a2dac0419f Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 30 Aug 2010 13:00:16 +0200 Subject: ALSA: hda - Add snd_hda_get_input_pin_label() helper function Added snd_hda_get_input_pin_label() helper function to return the string that can be used for control or capture-source ids. Signed-off-by: Takashi Iwai --- sound/pci/hda/hda_codec.c | 25 ++++++++++++++++++++++++- sound/pci/hda/hda_local.h | 2 ++ 2 files changed, 26 insertions(+), 1 deletion(-) (limited to 'sound') diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 280a739c2a99..72334b7f60e5 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -4654,12 +4654,35 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec, } EXPORT_SYMBOL_HDA(snd_hda_parse_pin_def_config); -/* labels for input pins */ +/* labels for input pins - for obsoleted config stuff */ const char *auto_pin_cfg_labels[AUTO_PIN_LAST] = { "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux" }; EXPORT_SYMBOL_HDA(auto_pin_cfg_labels); +static const char *input_labels[AUTO_PIN_LAST][4] = { + { "Mic", "Mic 2", "Mic 3", "Mic 4" }, + { "Front Mic", "Front Mic 2", "Front Mic 3", "Front Mic 4" }, + { "Line", "Line 2", "Line 3", "Line 4" }, + { "Front Line", "Front Line 2", "Front Line 3", "Front Line 4" }, + { "CD", "CD 2", "CD 3", "CD 4" }, + { "Aux", "Aux 2", "Aux 3", "Aux 4" }, +}; + +const char *snd_hda_get_input_pin_label(const struct auto_pin_cfg *cfg, + int input) +{ + int type = cfg->inputs[input].type; + int idx; + + for (idx = 0; idx < 3 && --input >= 0; idx++) { + if (type != cfg->inputs[input].type) + break; + } + return input_labels[type][idx]; +} +EXPORT_SYMBOL_HDA(snd_hda_get_input_pin_label); + #ifdef CONFIG_PM /* diff --git a/sound/pci/hda/hda_local.h b/sound/pci/hda/hda_local.h index 44c909445ba2..fb561748adb8 100644 --- a/sound/pci/hda/hda_local.h +++ b/sound/pci/hda/hda_local.h @@ -391,6 +391,8 @@ struct auto_pin_cfg_item { }; struct auto_pin_cfg; +const char *snd_hda_get_input_pin_label(const struct auto_pin_cfg *cfg, + int input); struct auto_pin_cfg { int line_outs; -- cgit v1.2.3 From 9e042e71325eeda03636aedfde6f2d27d6332188 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 30 Aug 2010 13:04:44 +0200 Subject: ALSA: hda - Use new inputs[] field to parse input-pins for AD codecs Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_analog.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index b697fd2a6f8b..3409d315f507 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c @@ -2880,7 +2880,7 @@ static int ad1988_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin, /* create input playback/capture controls for the given pin */ static int new_analog_input(struct ad198x_spec *spec, hda_nid_t pin, - const char *ctlname, int boost) + const char *ctlname, int ctlidx, int boost) { char name[32]; int err, idx; @@ -2913,16 +2913,23 @@ static int ad1988_auto_create_analog_input_ctls(struct ad198x_spec *spec, const struct auto_pin_cfg *cfg) { struct hda_input_mux *imux = &spec->private_imux; - int i, err; + int i, err, type, type_idx = 0; - for (i = 0; i < AUTO_PIN_LAST; i++) { - err = new_analog_input(spec, cfg->input_pins[i], - auto_pin_cfg_labels[i], - i <= AUTO_PIN_FRONT_MIC); + for (i = 0; i < cfg->num_inputs; i++) { + type = cfg->inputs[i].type; + if (i > 0 && type != cfg->inputs[i - 1].type) + type_idx++; + else + type_idx = 0; + err = new_analog_input(spec, cfg->inputs[i].pin, + auto_pin_cfg_labels[type], type_idx, + type <= AUTO_PIN_FRONT_MIC); if (err < 0) return err; - imux->items[imux->num_items].label = auto_pin_cfg_labels[i]; - imux->items[imux->num_items].index = ad1988_pin_to_adc_idx(cfg->input_pins[i]); + imux->items[imux->num_items].label = + snd_hda_get_input_pin_label(cfg, i); + imux->items[imux->num_items].index = + ad1988_pin_to_adc_idx(cfg->inputs[i].pin); imux->num_items++; } imux->items[imux->num_items].label = "Mix"; @@ -2994,12 +3001,11 @@ static void ad1988_auto_init_extra_out(struct hda_codec *codec) static void ad1988_auto_init_analog_input(struct hda_codec *codec) { struct ad198x_spec *spec = codec->spec; + const struct auto_pin_cfg *cfg = &spec->autocfg; int i, idx; - for (i = 0; i < AUTO_PIN_LAST; i++) { - hda_nid_t nid = spec->autocfg.input_pins[i]; - if (! nid) - continue; + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t nid = cfg->inputs[i].pin; switch (nid) { case 0x15: /* port-C */ snd_hda_codec_write(codec, 0x33, 0, AC_VERB_SET_CONNECT_SEL, 0x0); -- cgit v1.2.3 From fa4968a8b231816d161583e604a9f972e5713f17 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 30 Aug 2010 13:05:08 +0200 Subject: ALSA: hda - Use new inputs[] field to parse input-pins for CA-IBG codecs Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_ca0110.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_ca0110.c b/sound/pci/hda/patch_ca0110.c index af478019088e..42b3fb4cafc4 100644 --- a/sound/pci/hda/patch_ca0110.c +++ b/sound/pci/hda/patch_ca0110.c @@ -468,13 +468,14 @@ static void parse_input(struct hda_codec *codec) spec->dig_in = nid; continue; } - for (j = 0; j < AUTO_PIN_LAST; j++) - if (cfg->input_pins[j] == pin) + for (j = 0; j < cfg->num_inputs; j++) + if (cfg->inputs[j].pin == pin) break; - if (j >= AUTO_PIN_LAST) + if (j >= cfg->num_inputs) continue; spec->input_pins[n] = pin; - spec->input_labels[n] = auto_pin_cfg_labels[j]; + spec->input_labels[n] = + auto_pin_cfg_labels[cfg->inputs[j].type]; spec->adcs[n] = nid; n++; } -- cgit v1.2.3 From c1e0bb92174dd16ffba5be0e4e5fbd366f61ff7f Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 30 Aug 2010 13:05:30 +0200 Subject: ALSA: hda - Use new inputs[] field to parse input-pins for CirrusLogic codecs Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_cirrus.c | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index 4ef5efaaaef1..ee1aea7296eb 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c @@ -329,7 +329,7 @@ static int is_ext_mic(struct hda_codec *codec, unsigned int idx) { struct cs_spec *spec = codec->spec; struct auto_pin_cfg *cfg = &spec->autocfg; - hda_nid_t pin = cfg->input_pins[idx]; + hda_nid_t pin = cfg->inputs[idx].pin; unsigned int val = snd_hda_query_pin_caps(codec, pin); if (!(val & AC_PINCAP_PRES_DETECT)) return 0; @@ -424,10 +424,8 @@ static int parse_input(struct hda_codec *codec) struct auto_pin_cfg *cfg = &spec->autocfg; int i; - for (i = 0; i < AUTO_PIN_LAST; i++) { - hda_nid_t pin = cfg->input_pins[i]; - if (!pin) - continue; + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t pin = cfg->inputs[i].pin; spec->input_idx[spec->num_inputs] = i; spec->capsrc_idx[i] = spec->num_inputs++; spec->cur_input = i; @@ -438,16 +436,17 @@ static int parse_input(struct hda_codec *codec) /* check whether the automatic mic switch is available */ if (spec->num_inputs == 2 && - spec->adc_nid[AUTO_PIN_MIC] && spec->adc_nid[AUTO_PIN_FRONT_MIC]) { - if (is_ext_mic(codec, cfg->input_pins[AUTO_PIN_FRONT_MIC])) { - if (!is_ext_mic(codec, cfg->input_pins[AUTO_PIN_MIC])) { + cfg->inputs[0].type <= AUTO_PIN_FRONT_MIC && + cfg->inputs[1].type == AUTO_PIN_FRONT_MIC) { + if (is_ext_mic(codec, cfg->inputs[0].pin)) { + if (!is_ext_mic(codec, cfg->inputs[1].pin)) { spec->mic_detect = 1; - spec->automic_idx = AUTO_PIN_FRONT_MIC; + spec->automic_idx = 0; } } else { - if (is_ext_mic(codec, cfg->input_pins[AUTO_PIN_MIC])) { + if (is_ext_mic(codec, cfg->inputs[1].pin)) { spec->mic_detect = 1; - spec->automic_idx = AUTO_PIN_MIC; + spec->automic_idx = 1; } } } @@ -853,15 +852,12 @@ static void cs_automic(struct hda_codec *codec) hda_nid_t nid; unsigned int present; - nid = cfg->input_pins[spec->automic_idx]; + nid = cfg->inputs[spec->automic_idx].pin; present = snd_hda_jack_detect(codec, nid); if (present) change_cur_input(codec, spec->automic_idx, 0); - else { - unsigned int imic = (spec->automic_idx == AUTO_PIN_MIC) ? - AUTO_PIN_FRONT_MIC : AUTO_PIN_MIC; - change_cur_input(codec, imic, 0); - } + else + change_cur_input(codec, !spec->automic_idx, 0); } /* @@ -918,14 +914,14 @@ static void init_input(struct hda_codec *codec) unsigned int coef; int i; - for (i = 0; i < AUTO_PIN_LAST; i++) { + for (i = 0; i < cfg->num_inputs; i++) { unsigned int ctl; - hda_nid_t pin = cfg->input_pins[i]; - if (!pin || !spec->adc_nid[i]) + hda_nid_t pin = cfg->inputs[i].pin; + if (!spec->adc_nid[i]) continue; /* set appropriate pin control and mute first */ ctl = PIN_IN; - if (i <= AUTO_PIN_FRONT_MIC) { + if (cfg->inputs[i].type <= AUTO_PIN_FRONT_MIC) { unsigned int caps = snd_hda_query_pin_caps(codec, pin); caps >>= AC_PINCAP_VREF_SHIFT; if (caps & AC_PINCAP_VREF_80) -- cgit v1.2.3 From 66ceeb6bc2809bef0cfa18b1e22ddad5fc9b58b0 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 30 Aug 2010 13:05:52 +0200 Subject: ALSA: hda - Use new inputs[] field to parse input-pins for Realtek codecs Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_realtek.c | 208 ++++++++++++++++++++++-------------------- 1 file changed, 110 insertions(+), 98 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 50e0c82fd994..3e0f4816aed7 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -1265,16 +1265,14 @@ static void alc_init_auto_mic(struct hda_codec *codec) int i; /* there must be only two mic inputs exclusively */ - for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++) - if (cfg->input_pins[i]) + for (i = 0; i < cfg->num_inputs; i++) + if (cfg->inputs[i].type >= AUTO_PIN_LINE) return; fixed = ext = 0; - for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) { - hda_nid_t nid = cfg->input_pins[i]; + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t nid = cfg->inputs[i].pin; unsigned int defcfg; - if (!nid) - return; defcfg = snd_hda_codec_get_pincfg(codec, nid); switch (get_defcfg_connect(defcfg)) { case AC_JACK_PORT_FIXED: @@ -4719,7 +4717,7 @@ static struct snd_kcontrol_new alc880_control_templates[] = { /* add dynamic controls */ static int add_control(struct alc_spec *spec, int type, const char *name, - unsigned long val) + int cidx, unsigned long val) { struct snd_kcontrol_new *knew; @@ -4731,6 +4729,7 @@ static int add_control(struct alc_spec *spec, int type, const char *name, knew->name = kstrdup(name, GFP_KERNEL); if (!knew->name) return -ENOMEM; + knew->index = cidx; if (get_amp_nid_(val)) knew->subdevice = HDA_SUBDEV_AMP_FLAG; knew->private_value = val; @@ -4739,17 +4738,21 @@ static int add_control(struct alc_spec *spec, int type, const char *name, static int add_control_with_pfx(struct alc_spec *spec, int type, const char *pfx, const char *dir, - const char *sfx, unsigned long val) + const char *sfx, int cidx, unsigned long val) { char name[32]; snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx); - return add_control(spec, type, name, val); + return add_control(spec, type, name, cidx, val); } -#define add_pb_vol_ctrl(spec, type, pfx, val) \ - add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val) -#define add_pb_sw_ctrl(spec, type, pfx, val) \ - add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val) +#define add_pb_vol_ctrl(spec, type, pfx, val) \ + add_control_with_pfx(spec, type, pfx, "Playback", "Volume", 0, val) +#define add_pb_sw_ctrl(spec, type, pfx, val) \ + add_control_with_pfx(spec, type, pfx, "Playback", "Switch", 0, val) +#define __add_pb_vol_ctrl(spec, type, pfx, cidx, val) \ + add_control_with_pfx(spec, type, pfx, "Playback", "Volume", cidx, val) +#define __add_pb_sw_ctrl(spec, type, pfx, cidx, val) \ + add_control_with_pfx(spec, type, pfx, "Playback", "Switch", cidx, val) #define alc880_is_fixed_pin(nid) ((nid) >= 0x14 && (nid) <= 0x17) #define alc880_fixed_pin_idx(nid) ((nid) - 0x14) @@ -4902,16 +4905,16 @@ static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin, /* create input playback/capture controls for the given pin */ static int new_analog_input(struct alc_spec *spec, hda_nid_t pin, - const char *ctlname, + const char *ctlname, int ctlidx, int idx, hda_nid_t mix_nid) { int err; - err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname, + err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname, ctlidx, HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT)); if (err < 0) return err; - err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname, + err = __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname, ctlidx, HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT)); if (err < 0) return err; @@ -4932,21 +4935,26 @@ static int alc_auto_create_input_ctls(struct hda_codec *codec, { struct alc_spec *spec = codec->spec; struct hda_input_mux *imux = &spec->private_imux[0]; - int i, err, idx; + int i, err, idx, type, type_idx = 0; - for (i = 0; i < AUTO_PIN_LAST; i++) { + for (i = 0; i < cfg->num_inputs; i++) { hda_nid_t pin; - pin = cfg->input_pins[i]; + pin = cfg->inputs[i].pin; if (!alc_is_input_pin(codec, pin)) continue; + type = cfg->inputs[i].type; + if (i > 0 && type == cfg->inputs[i - 1].type) + type_idx++; + else + type_idx = 0; if (mixer) { idx = get_connection_index(codec, mixer, pin); if (idx >= 0) { err = new_analog_input(spec, pin, - auto_pin_cfg_labels[i], - idx, mixer); + auto_pin_cfg_labels[type], + type_idx, idx, mixer); if (err < 0) return err; } @@ -4959,7 +4967,7 @@ static int alc_auto_create_input_ctls(struct hda_codec *codec, idx = get_connection_index(codec, cap2, pin); if (idx >= 0) { imux->items[imux->num_items].label = - auto_pin_cfg_labels[i]; + snd_hda_get_input_pin_label(cfg, i); imux->items[imux->num_items].index = idx; imux->num_items++; } @@ -5034,10 +5042,11 @@ static void alc880_auto_init_extra_out(struct hda_codec *codec) static void alc880_auto_init_analog_input(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; + struct auto_pin_cfg *cfg = &spec->autocfg; int i; - for (i = 0; i < AUTO_PIN_LAST; i++) { - hda_nid_t nid = spec->autocfg.input_pins[i]; + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t nid = cfg->inputs[i].pin; if (alc_is_input_pin(codec, nid)) { alc_set_input_pin(codec, nid, i); if (nid != ALC880_PIN_CD_NID && @@ -5204,19 +5213,13 @@ static int init_capsrc_for_pin(struct hda_codec *codec, hda_nid_t pin) static void fixup_single_adc(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; - hda_nid_t pin = 0; + struct auto_pin_cfg *cfg = &spec->autocfg; int i; /* search for the input pin; there must be only one */ - for (i = 0; i < AUTO_PIN_LAST; i++) { - if (spec->autocfg.input_pins[i]) { - pin = spec->autocfg.input_pins[i]; - break; - } - } - if (!pin) + if (cfg->num_inputs != 1) return; - i = init_capsrc_for_pin(codec, pin); + i = init_capsrc_for_pin(codec, cfg->inputs[0].pin); if (i >= 0) { /* use only this ADC */ if (spec->capsrc_nids) @@ -5269,6 +5272,7 @@ static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids, int num_nids) { struct alc_spec *spec = codec->spec; + struct auto_pin_cfg *cfg = &spec->autocfg; int n; hda_nid_t fallback_adc = 0, fallback_cap = 0; @@ -5294,10 +5298,8 @@ static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids, fallback_adc = adc; fallback_cap = cap; } - for (i = 0; i < AUTO_PIN_LAST; i++) { - hda_nid_t nid = spec->autocfg.input_pins[i]; - if (!nid) - continue; + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t nid = cfg->inputs[i].pin; for (j = 0; j < nconns; j++) { if (conn[j] == nid) break; @@ -5305,7 +5307,7 @@ static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids, if (j >= nconns) break; } - if (i >= AUTO_PIN_LAST) { + if (i >= cfg->num_inputs) { int num_adcs = spec->num_adc_nids; spec->private_adc_nids[num_adcs] = adc; spec->private_capsrc_nids[num_adcs] = cap; @@ -6672,10 +6674,11 @@ static void alc260_auto_init_multi_out(struct hda_codec *codec) static void alc260_auto_init_analog_input(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; + struct auto_pin_cfg *cfg = &spec->autocfg; int i; - for (i = 0; i < AUTO_PIN_LAST; i++) { - hda_nid_t nid = spec->autocfg.input_pins[i]; + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t nid = cfg->inputs[i].pin; if (nid >= 0x12) { alc_set_input_pin(codec, nid, i); if (nid != ALC260_PIN_CD_NID && @@ -10538,12 +10541,11 @@ static void alc882_auto_init_hp_out(struct hda_codec *codec) static void alc882_auto_init_analog_input(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; + struct auto_pin_cfg *cfg = &spec->autocfg; int i; - for (i = 0; i < AUTO_PIN_LAST; i++) { - hda_nid_t nid = spec->autocfg.input_pins[i]; - if (!nid) - continue; + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t nid = cfg->inputs[i].pin; alc_set_input_pin(codec, nid, i); if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP) snd_hda_codec_write(codec, nid, 0, @@ -10606,24 +10608,23 @@ static void alc882_auto_init_input_src(struct hda_codec *codec) static int alc_auto_add_mic_boost(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; - int err; + struct auto_pin_cfg *cfg = &spec->autocfg; + int i, err; hda_nid_t nid; - nid = spec->autocfg.input_pins[AUTO_PIN_MIC]; - if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) { - err = add_control(spec, ALC_CTL_WIDGET_VOL, - "Mic Boost", - HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT)); - if (err < 0) - return err; - } - nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC]; - if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) { - err = add_control(spec, ALC_CTL_WIDGET_VOL, - "Front Mic Boost", + for (i = 0; i < cfg->num_inputs; i++) { + if (cfg->inputs[i].type > AUTO_PIN_FRONT_MIC) + break; + nid = cfg->inputs[i].pin; + if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) { + char label[32]; + snprintf(label, sizeof(label), "%s Boost", + snd_hda_get_input_pin_label(cfg, i)); + err = add_control(spec, ALC_CTL_WIDGET_VOL, label, 0, HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT)); - if (err < 0) - return err; + if (err < 0) + return err; + } } return 0; } @@ -15577,10 +15578,11 @@ static void alc861_auto_init_hp_out(struct hda_codec *codec) static void alc861_auto_init_analog_input(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; + struct auto_pin_cfg *cfg = &spec->autocfg; int i; - for (i = 0; i < AUTO_PIN_LAST; i++) { - hda_nid_t nid = spec->autocfg.input_pins[i]; + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t nid = cfg->inputs[i].pin; if (nid >= 0x0c && nid <= 0x11) alc_set_input_pin(codec, nid, i); } @@ -16569,10 +16571,11 @@ static void alc861vd_auto_init_hp_out(struct hda_codec *codec) static void alc861vd_auto_init_analog_input(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; + struct auto_pin_cfg *cfg = &spec->autocfg; int i; - for (i = 0; i < AUTO_PIN_LAST; i++) { - hda_nid_t nid = spec->autocfg.input_pins[i]; + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t nid = cfg->inputs[i].pin; if (alc_is_input_pin(codec, nid)) { alc_set_input_pin(codec, nid, i); if (nid != ALC861VD_PIN_CD_NID && @@ -18805,10 +18808,11 @@ static void alc662_auto_init_hp_out(struct hda_codec *codec) static void alc662_auto_init_analog_input(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; + struct auto_pin_cfg *cfg = &spec->autocfg; int i; - for (i = 0; i < AUTO_PIN_LAST; i++) { - hda_nid_t nid = spec->autocfg.input_pins[i]; + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t nid = cfg->inputs[i].pin; if (alc_is_input_pin(codec, nid)) { alc_set_input_pin(codec, nid, i); if (nid != ALC662_PIN_CD_NID && @@ -19037,6 +19041,39 @@ static hda_nid_t alc680_adc_nids[3] = { /* * Analog capture ADC cgange */ +static void alc680_rec_autoswitch(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + struct auto_pin_cfg *cfg = &spec->autocfg; + int pin_found = 0; + int type_found = AUTO_PIN_LAST; + hda_nid_t nid; + int i; + + for (i = 0; i < cfg->num_inputs; i++) { + nid = cfg->inputs[i].pin; + if (!(snd_hda_query_pin_caps(codec, nid) & + AC_PINCAP_PRES_DETECT)) + continue; + if (snd_hda_jack_detect(codec, nid)) { + if (cfg->inputs[i].type < type_found) { + type_found = cfg->inputs[i].type; + pin_found = nid; + } + } + } + + nid = 0x07; + if (pin_found) + snd_hda_get_connections(codec, pin_found, &nid, 1); + + if (nid != spec->cur_adc) + __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1); + spec->cur_adc = nid; + snd_hda_codec_setup_stream(codec, nid, spec->cur_adc_stream_tag, 0, + spec->cur_adc_format); +} + static int alc680_capture_pcm_prepare(struct hda_pcm_stream *hinfo, struct hda_codec *codec, unsigned int stream_tag, @@ -19044,24 +19081,12 @@ static int alc680_capture_pcm_prepare(struct hda_pcm_stream *hinfo, struct snd_pcm_substream *substream) { struct alc_spec *spec = codec->spec; - struct auto_pin_cfg *cfg = &spec->autocfg; - unsigned int pre_mic, pre_line; - - pre_mic = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_MIC]); - pre_line = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_LINE]); + spec->cur_adc = 0x07; spec->cur_adc_stream_tag = stream_tag; spec->cur_adc_format = format; - if (pre_mic || pre_line) { - if (pre_mic) - snd_hda_codec_setup_stream(codec, 0x08, stream_tag, 0, - format); - else - snd_hda_codec_setup_stream(codec, 0x09, stream_tag, 0, - format); - } else - snd_hda_codec_setup_stream(codec, 0x07, stream_tag, 0, format); + alc680_rec_autoswitch(codec); return 0; } @@ -19147,6 +19172,7 @@ static struct hda_verb alc680_init_verbs[] = { {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, + {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, { } }; @@ -19159,25 +19185,11 @@ static void alc680_base_setup(struct hda_codec *codec) spec->autocfg.hp_pins[0] = 0x16; spec->autocfg.speaker_pins[0] = 0x14; spec->autocfg.speaker_pins[1] = 0x15; - spec->autocfg.input_pins[AUTO_PIN_MIC] = 0x18; - spec->autocfg.input_pins[AUTO_PIN_LINE] = 0x19; -} - -static void alc680_rec_autoswitch(struct hda_codec *codec) -{ - struct alc_spec *spec = codec->spec; - struct auto_pin_cfg *cfg = &spec->autocfg; - unsigned int present; - hda_nid_t new_adc; - - present = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_MIC]); - - new_adc = present ? 0x8 : 0x7; - __snd_hda_codec_cleanup_stream(codec, !present ? 0x8 : 0x7, 1); - snd_hda_codec_setup_stream(codec, new_adc, - spec->cur_adc_stream_tag, 0, - spec->cur_adc_format); - + spec->autocfg.num_inputs = 2; + spec->autocfg.inputs[0].pin = 0x18; + spec->autocfg.inputs[0].type = AUTO_PIN_MIC; + spec->autocfg.inputs[1].pin = 0x19; + spec->autocfg.inputs[1].type = AUTO_PIN_LINE; } static void alc680_unsol_event(struct hda_codec *codec, -- cgit v1.2.3 From eea7dc932bfa802ad0377755ea821f416f4f8623 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 30 Aug 2010 13:06:15 +0200 Subject: ALSA: hda - Use new inputs[] field to parse input-pins for STAC/IDT codecs Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_sigmatel.c | 183 +++++++++++++++++++++-------------------- 1 file changed, 96 insertions(+), 87 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 95148e58026c..d226edd1e143 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -1180,14 +1180,11 @@ static int stac92xx_build_controls(struct hda_codec *codec) if (err < 0) return err; } - for (i = 0; i < AUTO_PIN_LAST; i++) { - nid = cfg->input_pins[i]; - if (nid) { - err = stac92xx_add_jack(codec, nid, - SND_JACK_MICROPHONE); - if (err < 0) - return err; - } + for (i = 0; i < cfg->num_inputs; i++) { + nid = cfg->inputs[i].pin; + err = stac92xx_add_jack(codec, nid, SND_JACK_MICROPHONE); + if (err < 0) + return err; } return 0; @@ -2821,41 +2818,55 @@ static hda_nid_t check_line_out_switch(struct hda_codec *codec) struct auto_pin_cfg *cfg = &spec->autocfg; hda_nid_t nid; unsigned int pincap; + int i; if (cfg->line_out_type != AUTO_PIN_LINE_OUT) return 0; - nid = cfg->input_pins[AUTO_PIN_LINE]; - pincap = snd_hda_query_pin_caps(codec, nid); - if (pincap & AC_PINCAP_OUT) - return nid; + for (i = 0; i < cfg->num_inputs; i++) { + if (cfg->inputs[i].type == AUTO_PIN_LINE) { + nid = cfg->inputs[i].pin; + pincap = snd_hda_query_pin_caps(codec, nid); + if (pincap & AC_PINCAP_OUT) + return nid; + } + } return 0; } +static hda_nid_t get_unassigned_dac(struct hda_codec *codec, hda_nid_t nid); + /* check whether the mic-input can be used as line-out */ -static hda_nid_t check_mic_out_switch(struct hda_codec *codec) +static hda_nid_t check_mic_out_switch(struct hda_codec *codec, hda_nid_t *dac) { struct sigmatel_spec *spec = codec->spec; struct auto_pin_cfg *cfg = &spec->autocfg; unsigned int def_conf, pincap; - unsigned int mic_pin; + int i, mic_type; + *dac = 0; if (cfg->line_out_type != AUTO_PIN_LINE_OUT) return 0; - mic_pin = AUTO_PIN_MIC; - for (;;) { - hda_nid_t nid = cfg->input_pins[mic_pin]; + mic_type = AUTO_PIN_MIC; + again: + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t nid = cfg->inputs[i].pin; + if (cfg->inputs[i].type != mic_type) + continue; def_conf = snd_hda_codec_get_pincfg(codec, nid); /* some laptops have an internal analog microphone * which can't be used as a output */ if (get_defcfg_connect(def_conf) != AC_JACK_PORT_FIXED) { pincap = snd_hda_query_pin_caps(codec, nid); - if (pincap & AC_PINCAP_OUT) - return nid; + if (pincap & AC_PINCAP_OUT) { + *dac = get_unassigned_dac(codec, nid); + if (*dac) + return nid; + } } - if (mic_pin == AUTO_PIN_MIC) - mic_pin = AUTO_PIN_FRONT_MIC; - else - break; + } + if (mic_type == AUTO_PIN_MIC) { + mic_type = AUTO_PIN_FRONT_MIC; + goto again; } return 0; } @@ -3002,17 +3013,14 @@ static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec) } } /* add mic as output */ - nid = check_mic_out_switch(codec); - if (nid) { - dac = get_unassigned_dac(codec, nid); - if (dac) { - snd_printdd("STAC: Add mic-in 0x%x as output %d\n", - nid, cfg->line_outs); - cfg->line_out_pins[cfg->line_outs] = nid; - cfg->line_outs++; - spec->mic_switch = nid; - add_spec_dacs(spec, dac); - } + nid = check_mic_out_switch(codec, &dac); + if (nid && dac) { + snd_printdd("STAC: Add mic-in 0x%x as output %d\n", + nid, cfg->line_outs); + cfg->line_out_pins[cfg->line_outs] = nid; + cfg->line_outs++; + spec->mic_switch = nid; + add_spec_dacs(spec, dac); } snd_printd("stac92xx: dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n", @@ -3202,13 +3210,13 @@ static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec, return err; } - for (idx = AUTO_PIN_MIC; idx <= AUTO_PIN_FRONT_LINE; idx++) { - nid = cfg->input_pins[idx]; - if (nid) { - err = stac92xx_add_jack_mode_control(codec, nid, idx); - if (err < 0) - return err; - } + for (idx = 0; idx < cfg->num_inputs; idx++) { + if (cfg->inputs[idx].type > AUTO_PIN_FRONT_LINE) + break; + nid = cfg->inputs[idx].pin; + err = stac92xx_add_jack_mode_control(codec, nid, idx); + if (err < 0) + return err; } return 0; @@ -3415,7 +3423,7 @@ static int get_connection_index(struct hda_codec *codec, hda_nid_t mux, /* create a volume assigned to the given pin (only if supported) */ /* return 1 if the volume control is created */ static int create_elem_capture_vol(struct hda_codec *codec, hda_nid_t nid, - const char *label, int direction) + const char *label, int idx, int direction) { unsigned int caps, nums; char name[32]; @@ -3432,8 +3440,8 @@ static int create_elem_capture_vol(struct hda_codec *codec, hda_nid_t nid, if (!nums) return 0; snprintf(name, sizeof(name), "%s Capture Volume", label); - err = stac92xx_add_control(codec->spec, STAC_CTL_WIDGET_VOL, name, - HDA_COMPOSE_AMP_VAL(nid, 3, 0, direction)); + err = stac92xx_add_control_idx(codec->spec, STAC_CTL_WIDGET_VOL, idx, name, + HDA_COMPOSE_AMP_VAL(nid, 3, 0, direction)); if (err < 0) return err; return 1; @@ -3485,11 +3493,11 @@ static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec, else label = stac92xx_dmic_labels[dimux->num_items]; - err = create_elem_capture_vol(codec, nid, label, HDA_INPUT); + err = create_elem_capture_vol(codec, nid, label, 0, HDA_INPUT); if (err < 0) return err; if (!err) { - err = create_elem_capture_vol(codec, nid, label, + err = create_elem_capture_vol(codec, nid, label, 0, HDA_OUTPUT); if (err < 0) return err; @@ -3540,10 +3548,11 @@ static int set_mic_route(struct hda_codec *codec, int i; mic->pin = pin; - for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) - if (pin == cfg->input_pins[i]) + for (i = 0; i < cfg->num_inputs; i++) { + if (pin == cfg->inputs[i].pin) break; - if (i <= AUTO_PIN_FRONT_MIC) { + } + if (i < cfg->num_inputs && cfg->inputs[i].type <= AUTO_PIN_FRONT_MIC) { /* analog pin */ i = get_connection_index(codec, spec->mux_nids[0], pin); if (i < 0) @@ -3577,13 +3586,13 @@ static int stac_check_auto_mic(struct hda_codec *codec) hda_nid_t fixed, ext; int i; - for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++) { - if (cfg->input_pins[i]) + for (i = 0; i < cfg->num_inputs; i++) { + if (cfg->inputs[i].type >= AUTO_PIN_LINE) return 0; /* must be exclusively mics */ } fixed = ext = 0; - for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) - if (check_mic_pin(codec, cfg->input_pins[i], &fixed, &ext)) + for (i = 0; i < cfg->num_inputs; i++) + if (check_mic_pin(codec, cfg->inputs[i].pin, &fixed, &ext)) return 0; for (i = 0; i < spec->num_dmics; i++) if (check_mic_pin(codec, spec->dmic_nids[i], &fixed, &ext)) @@ -3603,14 +3612,12 @@ static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const { struct sigmatel_spec *spec = codec->spec; struct hda_input_mux *imux = &spec->private_imux; - int i, j; + int i, j, type_idx = 0; - for (i = 0; i < AUTO_PIN_LAST; i++) { - hda_nid_t nid = cfg->input_pins[i]; + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t nid = cfg->inputs[i].pin; int index, err; - if (!nid) - continue; index = -1; for (j = 0; j < spec->num_muxes; j++) { index = get_connection_index(codec, spec->mux_nids[j], @@ -3621,13 +3628,18 @@ static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const if (index < 0) continue; + if (i > 0 && cfg->inputs[i].type == cfg->inputs[i - 1].type) + type_idx++; + else + type_idx = 0; err = create_elem_capture_vol(codec, nid, - auto_pin_cfg_labels[i], + auto_pin_cfg_labels[i], type_idx, HDA_INPUT); if (err < 0) return err; - imux->items[imux->num_items].label = auto_pin_cfg_labels[i]; + imux->items[imux->num_items].label = + snd_hda_get_input_pin_label(cfg, i); imux->items[imux->num_items].index = index; imux->num_items++; } @@ -4304,37 +4316,34 @@ static int stac92xx_init(struct hda_codec *codec) if (enable_pin_detect(codec, spec->ext_mic.pin, STAC_MIC_EVENT)) stac_issue_unsol_event(codec, spec->ext_mic.pin); } - for (i = 0; i < AUTO_PIN_LAST; i++) { - hda_nid_t nid = cfg->input_pins[i]; - if (nid) { - unsigned int pinctl, conf; - if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC) { - /* for mic pins, force to initialize */ - pinctl = stac92xx_get_default_vref(codec, nid); + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t nid = cfg->inputs[i].pin; + int type = cfg->inputs[i].type; + unsigned int pinctl, conf; + if (type == AUTO_PIN_MIC || type == AUTO_PIN_FRONT_MIC) { + /* for mic pins, force to initialize */ + pinctl = stac92xx_get_default_vref(codec, nid); + pinctl |= AC_PINCTL_IN_EN; + stac92xx_auto_set_pinctl(codec, nid, pinctl); + } else { + pinctl = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_PIN_WIDGET_CONTROL, 0); + /* if PINCTL already set then skip */ + /* Also, if both INPUT and OUTPUT are set, + * it must be a BIOS bug; need to override, too + */ + if (!(pinctl & AC_PINCTL_IN_EN) || + (pinctl & AC_PINCTL_OUT_EN)) { + pinctl &= ~AC_PINCTL_OUT_EN; pinctl |= AC_PINCTL_IN_EN; stac92xx_auto_set_pinctl(codec, nid, pinctl); - } else { - pinctl = snd_hda_codec_read(codec, nid, 0, - AC_VERB_GET_PIN_WIDGET_CONTROL, 0); - /* if PINCTL already set then skip */ - /* Also, if both INPUT and OUTPUT are set, - * it must be a BIOS bug; need to override, too - */ - if (!(pinctl & AC_PINCTL_IN_EN) || - (pinctl & AC_PINCTL_OUT_EN)) { - pinctl &= ~AC_PINCTL_OUT_EN; - pinctl |= AC_PINCTL_IN_EN; - stac92xx_auto_set_pinctl(codec, nid, - pinctl); - } - } - conf = snd_hda_codec_get_pincfg(codec, nid); - if (get_defcfg_connect(conf) != AC_JACK_PORT_FIXED) { - if (enable_pin_detect(codec, nid, - STAC_INSERT_EVENT)) - stac_issue_unsol_event(codec, nid); } } + conf = snd_hda_codec_get_pincfg(codec, nid); + if (get_defcfg_connect(conf) != AC_JACK_PORT_FIXED) { + if (enable_pin_detect(codec, nid, STAC_INSERT_EVENT)) + stac_issue_unsol_event(codec, nid); + } } for (i = 0; i < spec->num_dmics; i++) stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i], -- cgit v1.2.3 From 7b315bb4980448250c80a7464c256b54d546cb26 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Mon, 30 Aug 2010 13:06:30 +0200 Subject: ALSA: hda - Use new inputs[] field to parse input-pins for VIA codecs Signed-off-by: Takashi Iwai --- sound/pci/hda/patch_via.c | 144 +++++++++++++++++++++++----------------------- 1 file changed, 73 insertions(+), 71 deletions(-) (limited to 'sound') diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 41861388f43a..93b86adbce63 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c @@ -444,8 +444,8 @@ static hda_nid_t vt1812_adc_nids[2] = { /* add dynamic controls */ -static int via_add_control(struct via_spec *spec, int type, const char *name, - unsigned long val) +static int __via_add_control(struct via_spec *spec, int type, const char *name, + int idx, unsigned long val) { struct snd_kcontrol_new *knew; @@ -463,6 +463,9 @@ static int via_add_control(struct via_spec *spec, int type, const char *name, return 0; } +#define via_add_control(spec, type, name, val) \ + __via_add_control(spec, type, name, 0, val) + static struct snd_kcontrol_new *via_clone_control(struct via_spec *spec, struct snd_kcontrol_new *tmpl) { @@ -494,18 +497,18 @@ static void via_free_kctls(struct hda_codec *codec) /* create input playback/capture controls for the given pin */ static int via_new_analog_input(struct via_spec *spec, const char *ctlname, - int idx, int mix_nid) + int type_idx, int idx, int mix_nid) { char name[32]; int err; sprintf(name, "%s Playback Volume", ctlname); - err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name, + err = __via_add_control(spec, VIA_CTL_WIDGET_VOL, name, type_idx, HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT)); if (err < 0) return err; sprintf(name, "%s Playback Switch", ctlname); - err = via_add_control(spec, VIA_CTL_WIDGET_ANALOG_MUTE, name, + err = __via_add_control(spec, VIA_CTL_WIDGET_ANALOG_MUTE, name, type_idx, HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT)); if (err < 0) return err; @@ -557,14 +560,12 @@ static int is_smart51_pins(struct via_spec *spec, hda_nid_t pin); static void via_auto_init_analog_input(struct hda_codec *codec) { struct via_spec *spec = codec->spec; + const struct auto_pin_cfg *cfg = &spec->autocfg; unsigned int ctl; int i; - for (i = 0; i < AUTO_PIN_LAST; i++) { - hda_nid_t nid = spec->autocfg.input_pins[i]; - if (!nid) - continue; - + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t nid = cfg->inputs[i].pin; if (spec->smart51_enabled && is_smart51_pins(spec, nid)) ctl = PIN_OUT; else if (i <= AUTO_PIN_FRONT_MIC) @@ -1322,15 +1323,14 @@ static void mute_aa_path(struct hda_codec *codec, int mute) } static int is_smart51_pins(struct via_spec *spec, hda_nid_t pin) { - int res = 0; - int index; - for (index = AUTO_PIN_MIC; index < AUTO_PIN_FRONT_LINE; index++) { - if (pin == spec->autocfg.input_pins[index]) { - res = 1; - break; - } + const struct auto_pin_cfg *cfg = &spec->autocfg; + int i; + + for (i = 0; i < cfg->num_inputs; i++) { + if (pin == cfg->inputs[i].pin) + return cfg->inputs[i].type < AUTO_PIN_FRONT_LINE; } - return res; + return 0; } static int via_smart51_info(struct snd_kcontrol *kcontrol, @@ -1348,25 +1348,21 @@ static int via_smart51_get(struct snd_kcontrol *kcontrol, { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct via_spec *spec = codec->spec; - int index[] = { AUTO_PIN_MIC, AUTO_PIN_FRONT_MIC, AUTO_PIN_LINE }; + const struct auto_pin_cfg *cfg = &spec->autocfg; int on = 1; int i; - for (i = 0; i < ARRAY_SIZE(index); i++) { - hda_nid_t nid = spec->autocfg.input_pins[index[i]]; - if (nid) { - int ctl = - snd_hda_codec_read(codec, nid, 0, - AC_VERB_GET_PIN_WIDGET_CONTROL, - 0); - if (i == AUTO_PIN_FRONT_MIC - && spec->hp_independent_mode - && spec->codec_type != VT1718S) - continue; /* ignore FMic for independent HP */ - if (ctl & AC_PINCTL_IN_EN - && !(ctl & AC_PINCTL_OUT_EN)) - on = 0; - } + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t nid = cfg->inputs[i].pin; + int ctl = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_PIN_WIDGET_CONTROL, 0); + if (cfg->inputs[i].type >= AUTO_PIN_FRONT_LINE) + continue; + if (cfg->inputs[i].type == AUTO_PIN_FRONT_MIC && + spec->hp_independent_mode && spec->codec_type != VT1718S) + continue; /* ignore FMic for independent HP */ + if ((ctl & AC_PINCTL_IN_EN) && !(ctl & AC_PINCTL_OUT_EN)) + on = 0; } *ucontrol->value.integer.value = on; return 0; @@ -1377,36 +1373,38 @@ static int via_smart51_put(struct snd_kcontrol *kcontrol, { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct via_spec *spec = codec->spec; + const struct auto_pin_cfg *cfg = &spec->autocfg; int out_in = *ucontrol->value.integer.value ? AC_PINCTL_OUT_EN : AC_PINCTL_IN_EN; - int index[] = { AUTO_PIN_MIC, AUTO_PIN_FRONT_MIC, AUTO_PIN_LINE }; int i; - for (i = 0; i < ARRAY_SIZE(index); i++) { - hda_nid_t nid = spec->autocfg.input_pins[index[i]]; - if (i == AUTO_PIN_FRONT_MIC - && spec->hp_independent_mode - && spec->codec_type != VT1718S) + for (i = 0; i < cfg->num_inputs; i++) { + hda_nid_t nid = cfg->inputs[i].pin; + unsigned int parm; + + if (cfg->inputs[i].type >= AUTO_PIN_FRONT_LINE) + continue; + if (cfg->inputs[i].type == AUTO_PIN_FRONT_MIC && + spec->hp_independent_mode && spec->codec_type != VT1718S) continue; /* don't retask FMic for independent HP */ - if (nid) { - unsigned int parm = snd_hda_codec_read( - codec, nid, 0, - AC_VERB_GET_PIN_WIDGET_CONTROL, 0); - parm &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN); - parm |= out_in; - snd_hda_codec_write(codec, nid, 0, - AC_VERB_SET_PIN_WIDGET_CONTROL, - parm); - if (out_in == AC_PINCTL_OUT_EN) { - mute_aa_path(codec, 1); - notify_aa_path_ctls(codec); - } - if (spec->codec_type == VT1718S) - snd_hda_codec_amp_stereo( + + parm = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_PIN_WIDGET_CONTROL, 0); + parm &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN); + parm |= out_in; + snd_hda_codec_write(codec, nid, 0, + AC_VERB_SET_PIN_WIDGET_CONTROL, + parm); + if (out_in == AC_PINCTL_OUT_EN) { + mute_aa_path(codec, 1); + notify_aa_path_ctls(codec); + } + if (spec->codec_type == VT1718S) { + snd_hda_codec_amp_stereo( codec, nid, HDA_OUTPUT, 0, HDA_AMP_MUTE, HDA_AMP_UNMUTE); } - if (i == AUTO_PIN_FRONT_MIC) { + if (cfg->inputs[i].type == AUTO_PIN_FRONT_MIC) { if (spec->codec_type == VT1708S || spec->codec_type == VT1716S) { /* input = index 1 (AOW3) */ @@ -1442,7 +1440,7 @@ static struct snd_kcontrol_new via_smart51_mixer[2] = { static int via_smart51_build(struct via_spec *spec) { struct snd_kcontrol_new *knew; - int index[] = { AUTO_PIN_MIC, AUTO_PIN_FRONT_MIC, AUTO_PIN_LINE }; + const struct auto_pin_cfg *cfg = &spec->autocfg; hda_nid_t nid; int i; @@ -1450,13 +1448,14 @@ static int via_smart51_build(struct via_spec *spec) if (knew == NULL) return -ENOMEM; - for (i = 0; i < ARRAY_SIZE(index); i++) { - nid = spec->autocfg.input_pins[index[i]]; - if (nid) { + for (i = 0; i < cfg->num_inputs; i++) { + nid = cfg->inputs[i].pin; + if (cfg->inputs[i].type < AUTO_PIN_FRONT_LINE) { knew = via_clone_control(spec, &via_smart51_mixer[1]); if (knew == NULL) return -ENOMEM; knew->subdevice = nid; + break; } } @@ -2419,7 +2418,7 @@ static int vt_auto_create_analog_input_ctls(struct via_spec *spec, hda_nid_t pin_idxs[], int num_idxs) { struct hda_input_mux *imux = &spec->private_imux[0]; - int i, err, idx; + int i, err, idx, type, type_idx = 0; /* for internal loopback recording select */ for (idx = 0; idx < num_idxs; idx++) { @@ -2431,20 +2430,23 @@ static int vt_auto_create_analog_input_ctls(struct via_spec *spec, } } - for (i = 0; i < AUTO_PIN_LAST; i++) { - if (!cfg->input_pins[i]) - continue; - + for (i = 0; i < cfg->num_inputs; i++) { + type = cfg->inputs[i].type; for (idx = 0; idx < num_idxs; idx++) - if (pin_idxs[idx] == cfg->input_pins[i]) + if (pin_idxs[idx] == cfg->inputs[i].pin) break; if (idx >= num_idxs) continue; - err = via_new_analog_input(spec, auto_pin_cfg_labels[i], - idx, cap_nid); + if (i > 0 && type == cfg->inputs[i - 1].type) + type_idx++; + else + type_idx = 0; + err = via_new_analog_input(spec, auto_pin_cfg_labels[type], + type_idx, idx, cap_nid); if (err < 0) return err; - imux->items[imux->num_items].label = auto_pin_cfg_labels[i]; + imux->items[imux->num_items].label = + snd_hda_get_input_pin_label(cfg, i); imux->items[imux->num_items].index = idx; imux->num_items++; } @@ -5513,7 +5515,7 @@ static int vt2002P_auto_create_analog_input_ctls(struct via_spec *spec, if (err < 0) return err; /* build volume/mute control of loopback */ - err = via_new_analog_input(spec, "Stereo Mixer", 3, 0x21); + err = via_new_analog_input(spec, "Stereo Mixer", 0, 3, 0x21); if (err < 0) return err; @@ -5836,7 +5838,7 @@ static int vt1812_auto_create_analog_input_ctls(struct via_spec *spec, return err; /* build volume/mute control of loopback */ - err = via_new_analog_input(spec, "Stereo Mixer", 5, 0x21); + err = via_new_analog_input(spec, "Stereo Mixer", 0, 5, 0x21); if (err < 0) return err; -- cgit v1.2.3 From ffc4fdbbe1b4be79e98340ebcd5a0ade6f5de318 Mon Sep 17 00:00:00 2001 From: Manuel Lauss Date: Thu, 26 Aug 2010 14:53:51 +0200 Subject: ASoC: fix au1x platform This patch fixes up the au1x audio platform after the multi-component merge: - compile fixes and updates to get DB1200 platform audio working again, - removal of global variables in AC97/I2S/DMA(PCM) modules. The AC97 part is limited to one instance only for now due to issues with getting at driver data in the soc_ac97_ops. Signed-off-by: Manuel Lauss Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/au1x/db1200.c | 16 ++++----- sound/soc/au1x/dbdma2.c | 82 +++++++++++++++-------------------------------- sound/soc/au1x/psc-ac97.c | 59 ++++++++++++++++++++-------------- sound/soc/au1x/psc-i2s.c | 42 ++++++++---------------- sound/soc/au1x/psc.h | 7 ++-- 5 files changed, 85 insertions(+), 121 deletions(-) (limited to 'sound') diff --git a/sound/soc/au1x/db1200.c b/sound/soc/au1x/db1200.c index d8dc8225576a..b62fcd33e586 100644 --- a/sound/soc/au1x/db1200.c +++ b/sound/soc/au1x/db1200.c @@ -27,10 +27,10 @@ static struct snd_soc_dai_link db1200_ac97_dai = { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai_name = "au1xpsc-ac97", .codec_dai_name = "ac97-hifi", - .platform_name = "au1xpsc-pcm-audio", - .codec_name = "ac97-codec", + .cpu_dai_name = "au1xpsc_ac97.1", + .platform_name = "au1xpsc-pcm.1", + .codec_name = "ac97-codec.1", }; static struct snd_soc_card db1200_ac97_machine = { @@ -75,10 +75,10 @@ static struct snd_soc_ops db1200_i2s_wm8731_ops = { static struct snd_soc_dai_link db1200_i2s_dai = { .name = "WM8731", .stream_name = "WM8731 PCM", - .cpu_dai_name = "au1xpsc", - .codec_dai_name = "wm8731-hifi" - .platform_name = "au1xpsc-pcm-audio", - .codec_name = "wm8731-codec.0-001a", + .codec_dai_name = "wm8731-hifi", + .cpu_dai_name = "au1xpsc_i2s.1", + .platform_name = "au1xpsc-pcm.1", + .codec_name = "wm8731-codec.0-001b", .ops = &db1200_i2s_wm8731_ops, }; @@ -97,7 +97,7 @@ static int __init db1200_audio_load(void) int ret; ret = -ENOMEM; - db1200_asoc_dev = platform_device_alloc("soc-audio", -1); + db1200_asoc_dev = platform_device_alloc("soc-audio", 1); /* PSC1 */ if (!db1200_asoc_dev) goto out; diff --git a/sound/soc/au1x/dbdma2.c b/sound/soc/au1x/dbdma2.c index 00fdb9cbfc2d..10fdd2854e58 100644 --- a/sound/soc/au1x/dbdma2.c +++ b/sound/soc/au1x/dbdma2.c @@ -10,9 +10,6 @@ * * DMA glue for Au1x-PSC audio. * - * NOTE: all of these drivers can only work with a SINGLE instance - * of a PSC. Multiple independent audio devices are impossible - * with ASoC v1. */ @@ -61,9 +58,6 @@ struct au1xpsc_audio_dmadata { int msbits; }; -/* instance data. There can be only one, MacLeod!!!! */ -static struct au1xpsc_audio_dmadata *au1xpsc_audio_pcmdma[2]; - /* * These settings are somewhat okay, at least on my machine audio plays * almost skip-free. Especially the 64kB buffer seems to help a LOT. @@ -199,6 +193,14 @@ out: return 0; } +static inline struct au1xpsc_audio_dmadata *to_dmadata(struct snd_pcm_substream *ss) +{ + struct snd_soc_pcm_runtime *rtd = ss->private_data; + struct au1xpsc_audio_dmadata *pcd = + snd_soc_platform_get_drvdata(rtd->platform); + return &pcd[SUBSTREAM_TYPE(ss)]; +} + static int au1xpsc_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { @@ -211,7 +213,7 @@ static int au1xpsc_pcm_hw_params(struct snd_pcm_substream *substream, goto out; stype = SUBSTREAM_TYPE(substream); - pcd = au1xpsc_audio_pcmdma[stype]; + pcd = to_dmadata(substream); DBG("runtime->dma_area = 0x%08lx dma_addr_t = 0x%08lx dma_size = %d " "runtime->min_align %d\n", @@ -249,8 +251,7 @@ static int au1xpsc_pcm_hw_free(struct snd_pcm_substream *substream) static int au1xpsc_pcm_prepare(struct snd_pcm_substream *substream) { - struct au1xpsc_audio_dmadata *pcd = - au1xpsc_audio_pcmdma[SUBSTREAM_TYPE(substream)]; + struct au1xpsc_audio_dmadata *pcd = to_dmadata(substream); au1xxx_dbdma_reset(pcd->ddma_chan); @@ -267,7 +268,7 @@ static int au1xpsc_pcm_prepare(struct snd_pcm_substream *substream) static int au1xpsc_pcm_trigger(struct snd_pcm_substream *substream, int cmd) { - u32 c = au1xpsc_audio_pcmdma[SUBSTREAM_TYPE(substream)]->ddma_chan; + u32 c = to_dmadata(substream)->ddma_chan; switch (cmd) { case SNDRV_PCM_TRIGGER_START: @@ -287,8 +288,7 @@ static int au1xpsc_pcm_trigger(struct snd_pcm_substream *substream, int cmd) static snd_pcm_uframes_t au1xpsc_pcm_pointer(struct snd_pcm_substream *substream) { - return bytes_to_frames(substream->runtime, - au1xpsc_audio_pcmdma[SUBSTREAM_TYPE(substream)]->pos); + return bytes_to_frames(substream->runtime, to_dmadata(substream)->pos); } static int au1xpsc_pcm_open(struct snd_pcm_substream *substream) @@ -299,7 +299,7 @@ static int au1xpsc_pcm_open(struct snd_pcm_substream *substream) static int au1xpsc_pcm_close(struct snd_pcm_substream *substream) { - au1x_pcm_dbdma_free(au1xpsc_audio_pcmdma[SUBSTREAM_TYPE(substream)]); + au1x_pcm_dbdma_free(to_dmadata(substream)); return 0; } @@ -329,35 +329,21 @@ static int au1xpsc_pcm_new(struct snd_card *card, return 0; } -static int au1xpsc_pcm_probe(struct snd_soc_platform *platform) -{ - if (!au1xpsc_audio_pcmdma[PCM_TX] || !au1xpsc_audio_pcmdma[PCM_RX]) - return -ENODEV; - - return 0; -} - /* au1xpsc audio platform */ struct snd_soc_platform_driver au1xpsc_soc_platform = { - .probe = au1xpsc_pcm_probe, .ops = &au1xpsc_pcm_ops, .pcm_new = au1xpsc_pcm_new, .pcm_free = au1xpsc_pcm_free_dma_buffers, }; -EXPORT_SYMBOL_GPL(au1xpsc_soc_platform); static int __devinit au1xpsc_pcm_drvprobe(struct platform_device *pdev) { + struct au1xpsc_audio_dmadata *dmadata; struct resource *r; int ret; - if (au1xpsc_audio_pcmdma[PCM_TX] || au1xpsc_audio_pcmdma[PCM_RX]) - return -EBUSY; - - /* TX DMA */ - au1xpsc_audio_pcmdma[PCM_TX] - = kzalloc(sizeof(struct au1xpsc_audio_dmadata), GFP_KERNEL); - if (!au1xpsc_audio_pcmdma[PCM_TX]) + dmadata = kzalloc(2 * sizeof(struct au1xpsc_audio_dmadata), GFP_KERNEL); + if (!dmadata) return -ENOMEM; r = platform_get_resource(pdev, IORESOURCE_DMA, 0); @@ -365,54 +351,40 @@ static int __devinit au1xpsc_pcm_drvprobe(struct platform_device *pdev) ret = -ENODEV; goto out1; } - (au1xpsc_audio_pcmdma[PCM_TX])->ddma_id = r->start; + dmadata[PCM_TX].ddma_id = r->start; /* RX DMA */ - au1xpsc_audio_pcmdma[PCM_RX] - = kzalloc(sizeof(struct au1xpsc_audio_dmadata), GFP_KERNEL); - if (!au1xpsc_audio_pcmdma[PCM_RX]) - return -ENOMEM; - r = platform_get_resource(pdev, IORESOURCE_DMA, 1); if (!r) { ret = -ENODEV; - goto out2; + goto out1; } - (au1xpsc_audio_pcmdma[PCM_RX])->ddma_id = r->start; + dmadata[PCM_RX].ddma_id = r->start; + + platform_set_drvdata(pdev, dmadata); ret = snd_soc_register_platform(&pdev->dev, &au1xpsc_soc_platform); if (!ret) return ret; -out2: - kfree(au1xpsc_audio_pcmdma[PCM_RX]); - au1xpsc_audio_pcmdma[PCM_RX] = NULL; out1: - kfree(au1xpsc_audio_pcmdma[PCM_TX]); - au1xpsc_audio_pcmdma[PCM_TX] = NULL; + kfree(dmadata); return ret; } static int __devexit au1xpsc_pcm_drvremove(struct platform_device *pdev) { - int i; + struct au1xpsc_audio_dmadata *dmadata = platform_get_drvdata(pdev); snd_soc_unregister_platform(&pdev->dev); - - for (i = 0; i < 2; i++) { - if (au1xpsc_audio_pcmdma[i]) { - au1x_pcm_dbdma_free(au1xpsc_audio_pcmdma[i]); - kfree(au1xpsc_audio_pcmdma[i]); - au1xpsc_audio_pcmdma[i] = NULL; - } - } + kfree(dmadata); return 0; } static struct platform_driver au1xpsc_pcm_driver = { .driver = { - .name = "au1xpsc-pcm-audio", + .name = "au1xpsc-pcm", .owner = THIS_MODULE, }, .probe = au1xpsc_pcm_drvprobe, @@ -421,8 +393,6 @@ static struct platform_driver au1xpsc_pcm_driver = { static int __init au1xpsc_audio_dbdma_load(void) { - au1xpsc_audio_pcmdma[PCM_TX] = NULL; - au1xpsc_audio_pcmdma[PCM_RX] = NULL; return platform_driver_register(&au1xpsc_pcm_driver); } @@ -460,7 +430,7 @@ struct platform_device *au1xpsc_pcm_add(struct platform_device *pdev) res[1].start = res[1].end = id[1]; res[0].flags = res[1].flags = IORESOURCE_DMA; - pd = platform_device_alloc("au1xpsc-pcm", -1); + pd = platform_device_alloc("au1xpsc-pcm", pdev->id); if (!pd) goto out; diff --git a/sound/soc/au1x/psc-ac97.c b/sound/soc/au1x/psc-ac97.c index 6a9516cbe424..d0db66f24a00 100644 --- a/sound/soc/au1x/psc-ac97.c +++ b/sound/soc/au1x/psc-ac97.c @@ -10,9 +10,6 @@ * * Au1xxx-PSC AC97 glue. * - * NOTE: all of these drivers can only work with a SINGLE instance - * of a PSC. Multiple independent audio devices are impossible - * with ASoC v1. */ #include @@ -56,12 +53,29 @@ /* instance data. There can be only one, MacLeod!!!! */ static struct au1xpsc_audio_data *au1xpsc_ac97_workdata; +#if 0 + +/* this could theoretically work, but ac97->bus->card->private_data can be NULL + * when snd_ac97_mixer() is called; I don't know if the rest further down the + * chain are always valid either. + */ +static inline struct au1xpsc_audio_data *ac97_to_pscdata(struct snd_ac97 *x) +{ + struct snd_soc_card *c = x->bus->card->private_data; + return snd_soc_dai_get_drvdata(c->rtd->cpu_dai); +} + +#else + +#define ac97_to_pscdata(x) au1xpsc_ac97_workdata + +#endif + /* AC97 controller reads codec register */ static unsigned short au1xpsc_ac97_read(struct snd_ac97 *ac97, unsigned short reg) { - /* FIXME */ - struct au1xpsc_audio_data *pscdata = au1xpsc_ac97_workdata; + struct au1xpsc_audio_data *pscdata = ac97_to_pscdata(ac97); unsigned short retry, tmo; unsigned long data; @@ -102,8 +116,7 @@ static unsigned short au1xpsc_ac97_read(struct snd_ac97 *ac97, static void au1xpsc_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short val) { - /* FIXME */ - struct au1xpsc_audio_data *pscdata = au1xpsc_ac97_workdata; + struct au1xpsc_audio_data *pscdata = ac97_to_pscdata(ac97); unsigned int tmo, retry; au_writel(PSC_AC97EVNT_CD, AC97_EVNT(pscdata)); @@ -134,8 +147,7 @@ static void au1xpsc_ac97_write(struct snd_ac97 *ac97, unsigned short reg, /* AC97 controller asserts a warm reset */ static void au1xpsc_ac97_warm_reset(struct snd_ac97 *ac97) { - /* FIXME */ - struct au1xpsc_audio_data *pscdata = au1xpsc_ac97_workdata; + struct au1xpsc_audio_data *pscdata = ac97_to_pscdata(ac97); au_writel(PSC_AC97RST_SNC, AC97_RST(pscdata)); au_sync(); @@ -146,8 +158,7 @@ static void au1xpsc_ac97_warm_reset(struct snd_ac97 *ac97) static void au1xpsc_ac97_cold_reset(struct snd_ac97 *ac97) { - /* FIXME */ - struct au1xpsc_audio_data *pscdata = au1xpsc_ac97_workdata; + struct au1xpsc_audio_data *pscdata = ac97_to_pscdata(ac97); int i; /* disable PSC during cold reset */ @@ -202,8 +213,7 @@ static int au1xpsc_ac97_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - /* FIXME */ - struct au1xpsc_audio_data *pscdata = au1xpsc_ac97_workdata; + struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); unsigned long r, ro, stat; int chans, t, stype = SUBSTREAM_TYPE(substream); @@ -283,8 +293,7 @@ out: static int au1xpsc_ac97_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { - /* FIXME */ - struct au1xpsc_audio_data *pscdata = au1xpsc_ac97_workdata; + struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); int ret, stype = SUBSTREAM_TYPE(substream); ret = 0; @@ -325,7 +334,7 @@ static struct snd_soc_dai_ops au1xpsc_ac97_dai_ops = { .hw_params = au1xpsc_ac97_hw_params, }; -struct snd_soc_dai_driver au1xpsc_ac97_dai = { +static const struct snd_soc_dai_driver au1xpsc_ac97_dai_template = { .ac97_control = 1, .probe = au1xpsc_ac97_probe, .playback = { @@ -342,7 +351,6 @@ struct snd_soc_dai_driver au1xpsc_ac97_dai = { }, .ops = &au1xpsc_ac97_dai_ops, }; -EXPORT_SYMBOL_GPL(au1xpsc_ac97_dai); static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) { @@ -351,9 +359,6 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) unsigned long sel; struct au1xpsc_audio_data *wd; - if (au1xpsc_ac97_workdata) - return -EBUSY; - wd = kzalloc(sizeof(struct au1xpsc_audio_data), GFP_KERNEL); if (!wd) return -ENOMEM; @@ -387,14 +392,20 @@ static int __devinit au1xpsc_ac97_drvprobe(struct platform_device *pdev) au_writel(PSC_SEL_PS_AC97MODE | sel, PSC_SEL(wd)); au_sync(); - ret = snd_soc_register_dai(&pdev->dev, &au1xpsc_ac97_dai); + /* name the DAI like this device instance ("au1xpsc-ac97.PSCINDEX") */ + memcpy(&wd->dai_drv, &au1xpsc_ac97_dai_template, + sizeof(struct snd_soc_dai_driver)); + wd->dai_drv.name = dev_name(&pdev->dev); + + platform_set_drvdata(pdev, wd); + + ret = snd_soc_register_dai(&pdev->dev, &wd->dai_drv); if (ret) goto out1; wd->dmapd = au1xpsc_pcm_add(pdev); if (wd->dmapd) { - platform_set_drvdata(pdev, wd); - au1xpsc_ac97_workdata = wd; /* MDEV */ + au1xpsc_ac97_workdata = wd; return 0; } @@ -477,7 +488,7 @@ static struct dev_pm_ops au1xpscac97_pmops = { static struct platform_driver au1xpsc_ac97_driver = { .driver = { - .name = "au1xpsc-ac97", + .name = "au1xpsc_ac97", .owner = THIS_MODULE, .pm = AU1XPSCAC97_PMOPS, }, diff --git a/sound/soc/au1x/psc-i2s.c b/sound/soc/au1x/psc-i2s.c index 94e560a8756d..fca091276320 100644 --- a/sound/soc/au1x/psc-i2s.c +++ b/sound/soc/au1x/psc-i2s.c @@ -10,9 +10,6 @@ * * Au1xxx-PSC I2S glue. * - * NOTE: all of these drivers can only work with a SINGLE instance - * of a PSC. Multiple independent audio devices are impossible - * with ASoC v1. * NOTE: so far only PSC slave mode (bit- and frameclock) is supported. */ @@ -54,13 +51,10 @@ ((stype) == PCM_TX ? PSC_I2SPCR_TC : PSC_I2SPCR_RC) -/* instance data. There can be only one, MacLeod!!!! */ -static struct au1xpsc_audio_data *au1xpsc_i2s_workdata; - static int au1xpsc_i2s_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { - struct au1xpsc_audio_data *pscdata = au1xpsc_i2s_workdata; + struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(cpu_dai); unsigned long ct; int ret; @@ -120,7 +114,7 @@ static int au1xpsc_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct au1xpsc_audio_data *pscdata = au1xpsc_i2s_workdata; + struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); int cfgbits; unsigned long stat; @@ -245,7 +239,7 @@ static int au1xpsc_i2s_stop(struct au1xpsc_audio_data *pscdata, int stype) static int au1xpsc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { - struct au1xpsc_audio_data *pscdata = au1xpsc_i2s_workdata; + struct au1xpsc_audio_data *pscdata = snd_soc_dai_get_drvdata(dai); int ret, stype = SUBSTREAM_TYPE(substream); switch (cmd) { @@ -263,19 +257,13 @@ static int au1xpsc_i2s_trigger(struct snd_pcm_substream *substream, int cmd, return ret; } -static int au1xpsc_i2s_probe(struct snd_soc_dai *dai) -{ - return au1xpsc_i2s_workdata ? 0 : -ENODEV; -} - static struct snd_soc_dai_ops au1xpsc_i2s_dai_ops = { .trigger = au1xpsc_i2s_trigger, .hw_params = au1xpsc_i2s_hw_params, .set_fmt = au1xpsc_i2s_set_fmt, }; -static struct snd_soc_dai_driver au1xpsc_i2s_dai = { - .probe = au1xpsc_i2s_probe, +static const struct snd_soc_dai_driver au1xpsc_i2s_dai_template = { .playback = { .rates = AU1XPSC_I2S_RATES, .formats = AU1XPSC_I2S_FMTS, @@ -298,9 +286,6 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev) int ret; struct au1xpsc_audio_data *wd; - if (au1xpsc_i2s_workdata) - return -EBUSY; - wd = kzalloc(sizeof(struct au1xpsc_audio_data), GFP_KERNEL); if (!wd) return -ENOMEM; @@ -337,17 +322,21 @@ static int __devinit au1xpsc_i2s_drvprobe(struct platform_device *pdev) * time out. */ - ret = snd_soc_register_dai(&pdev->dev, &au1xpsc_i2s_dai); + /* name the DAI like this device instance ("au1xpsc-i2s.PSCINDEX") */ + memcpy(&wd->dai_drv, &au1xpsc_i2s_dai_template, + sizeof(struct snd_soc_dai_driver)); + wd->dai_drv.name = dev_name(&pdev->dev); + + platform_set_drvdata(pdev, wd); + + ret = snd_soc_register_dai(&pdev->dev, &wd->dai_drv); if (ret) goto out1; /* finally add the DMA device for this PSC */ wd->dmapd = au1xpsc_pcm_add(pdev); - if (wd->dmapd) { - platform_set_drvdata(pdev, wd); - au1xpsc_i2s_workdata = wd; + if (wd->dmapd) return 0; - } snd_soc_unregister_dai(&pdev->dev); out1: @@ -376,8 +365,6 @@ static int __devexit au1xpsc_i2s_drvremove(struct platform_device *pdev) release_mem_region(r->start, resource_size(r)); kfree(wd); - au1xpsc_i2s_workdata = NULL; /* MDEV */ - return 0; } @@ -427,7 +414,7 @@ static struct dev_pm_ops au1xpsci2s_pmops = { static struct platform_driver au1xpsc_i2s_driver = { .driver = { - .name = "au1xpsc", + .name = "au1xpsc_i2s", .owner = THIS_MODULE, .pm = AU1XPSCI2S_PMOPS, }, @@ -437,7 +424,6 @@ static struct platform_driver au1xpsc_i2s_driver = { static int __init au1xpsc_i2s_load(void) { - au1xpsc_i2s_workdata = NULL; return platform_driver_register(&au1xpsc_i2s_driver); } diff --git a/sound/soc/au1x/psc.h b/sound/soc/au1x/psc.h index f281443fd52f..b30eadd422a7 100644 --- a/sound/soc/au1x/psc.h +++ b/sound/soc/au1x/psc.h @@ -8,16 +8,11 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * - * NOTE: all of these drivers can only work with a SINGLE instance - * of a PSC. Multiple independent audio devices are impossible - * with ASoC v1. */ #ifndef _AU1X_PCM_H #define _AU1X_PCM_H -extern struct snd_ac97_bus_ops soc_ac97_ops; - /* DBDMA helpers */ extern struct platform_device *au1xpsc_pcm_add(struct platform_device *pdev); extern void au1xpsc_pcm_destroy(struct platform_device *dmapd); @@ -28,6 +23,8 @@ struct au1xpsc_audio_data { unsigned long cfg; unsigned long rate; + struct snd_soc_dai_driver dai_drv; + unsigned long pm[2]; struct mutex lock; struct platform_device *dmapd; -- cgit v1.2.3 From 8614d310a2ba78cfc73ab12da112c3115801f94e Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Mon, 30 Aug 2010 11:28:07 +0300 Subject: ASoC: uda1380: make driver more powersave-friendly Disable some codec modules in standby mode, completely disable codec in off mode to save some power. Fix suspend/resume: mark mixer regs as dirty on resume to restore mixer values, otherwise driver produces no sound (master is muted by default). Signed-off-by: Vasily Khoruzhick Acked-by: Marek Vasut Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/uda1380.c | 145 ++++++++++++++++++++++++++++++++------------- 1 file changed, 105 insertions(+), 40 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/uda1380.c b/sound/soc/codecs/uda1380.c index 1a51c816e542..488f8010e405 100644 --- a/sound/soc/codecs/uda1380.c +++ b/sound/soc/codecs/uda1380.c @@ -39,6 +39,7 @@ struct uda1380_priv { u16 reg_cache[UDA1380_CACHEREGNUM]; unsigned int dac_clk; struct work_struct work; + void *control_data; }; /* @@ -129,7 +130,46 @@ static int uda1380_write(struct snd_soc_codec *codec, unsigned int reg, return -EIO; } -#define uda1380_reset(c) uda1380_write(c, UDA1380_RESET, 0) +static void uda1380_sync_cache(struct snd_soc_codec *codec) +{ + int reg; + u8 data[3]; + u16 *cache = codec->reg_cache; + + /* Sync reg_cache with the hardware */ + for (reg = 0; reg < UDA1380_MVOL; reg++) { + data[0] = reg; + data[1] = (cache[reg] & 0xff00) >> 8; + data[2] = cache[reg] & 0x00ff; + if (codec->hw_write(codec->control_data, data, 3) != 3) + dev_err(codec->dev, "%s: write to reg 0x%x failed\n", + __func__, reg); + } +} + +static int uda1380_reset(struct snd_soc_codec *codec) +{ + struct uda1380_platform_data *pdata = codec->dev->platform_data; + + if (gpio_is_valid(pdata->gpio_reset)) { + gpio_set_value(pdata->gpio_reset, 1); + mdelay(1); + gpio_set_value(pdata->gpio_reset, 0); + } else { + u8 data[3]; + + data[0] = UDA1380_RESET; + data[1] = 0; + data[2] = 0; + + if (codec->hw_write(codec->control_data, data, 3) != 3) { + dev_err(codec->dev, "%s: failed\n", __func__); + return -EIO; + } + } + + return 0; +} static void uda1380_flush_work(struct work_struct *work) { @@ -560,18 +600,40 @@ static int uda1380_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) { int pm = uda1380_read_reg_cache(codec, UDA1380_PM); + int reg; + struct uda1380_platform_data *pdata = codec->dev->platform_data; + + if (codec->bias_level == level) + return 0; switch (level) { case SND_SOC_BIAS_ON: case SND_SOC_BIAS_PREPARE: + /* ADC, DAC on */ uda1380_write(codec, UDA1380_PM, R02_PON_BIAS | pm); break; case SND_SOC_BIAS_STANDBY: - uda1380_write(codec, UDA1380_PM, R02_PON_BIAS); - break; - case SND_SOC_BIAS_OFF: + if (codec->bias_level == SND_SOC_BIAS_OFF) { + if (gpio_is_valid(pdata->gpio_power)) { + gpio_set_value(pdata->gpio_power, 1); + uda1380_reset(codec); + } + + uda1380_sync_cache(codec); + } uda1380_write(codec, UDA1380_PM, 0x0); break; + case SND_SOC_BIAS_OFF: + if (!gpio_is_valid(pdata->gpio_power)) + break; + + gpio_set_value(pdata->gpio_power, 0); + + /* Mark mixer regs cache dirty to sync them with + * codec regs on power on. + */ + for (reg = UDA1380_MVOL; reg < UDA1380_CACHEREGNUM; reg++) + set_bit(reg - 0x10, &uda1380_cache_dirty); } codec->bias_level = level; return 0; @@ -651,16 +713,6 @@ static int uda1380_suspend(struct snd_soc_codec *codec, pm_message_t state) static int uda1380_resume(struct snd_soc_codec *codec) { - int i; - u8 data[2]; - u16 *cache = codec->reg_cache; - - /* Sync reg_cache with the hardware */ - for (i = 0; i < ARRAY_SIZE(uda1380_reg); i++) { - data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001); - data[1] = cache[i] & 0x00ff; - codec->hw_write(codec->control_data, data, 2); - } uda1380_set_bias_level(codec, SND_SOC_BIAS_STANDBY); return 0; } @@ -671,29 +723,36 @@ static int uda1380_probe(struct snd_soc_codec *codec) struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec); int ret; + uda1380->codec = codec; + codec->hw_write = (hw_write_t)i2c_master_send; + codec->control_data = uda1380->control_data; - if (!pdata || !pdata->gpio_power || !pdata->gpio_reset) + if (!pdata) return -EINVAL; - ret = gpio_request(pdata->gpio_power, "uda1380 power"); - if (ret) - return ret; - ret = gpio_request(pdata->gpio_reset, "uda1380 reset"); - if (ret) - goto err_gpio; - - gpio_direction_output(pdata->gpio_power, 1); - - /* we may need to have the clock running here - pH5 */ - gpio_direction_output(pdata->gpio_reset, 1); - udelay(5); - gpio_set_value(pdata->gpio_reset, 0); + if (gpio_is_valid(pdata->gpio_reset)) { + ret = gpio_request(pdata->gpio_reset, "uda1380 reset"); + if (ret) + goto err_out; + ret = gpio_direction_output(pdata->gpio_reset, 0); + if (ret) + goto err_gpio_reset_conf; + } - ret = uda1380_reset(codec); - if (ret < 0) { - dev_err(codec->dev, "Failed to issue reset\n"); - goto err_reset; + if (gpio_is_valid(pdata->gpio_power)) { + ret = gpio_request(pdata->gpio_power, "uda1380 power"); + if (ret) + goto err_gpio; + ret = gpio_direction_output(pdata->gpio_power, 0); + if (ret) + goto err_gpio_power_conf; + } else { + ret = uda1380_reset(codec); + if (ret) { + dev_err(codec->dev, "Failed to issue reset\n"); + goto err_reset; + } } INIT_WORK(&uda1380->work, uda1380_flush_work); @@ -703,10 +762,11 @@ static int uda1380_probe(struct snd_soc_codec *codec) /* set clock input */ switch (pdata->dac_clk) { case UDA1380_DAC_CLK_SYSCLK: - uda1380_write(codec, UDA1380_CLK, 0); + uda1380_write_reg_cache(codec, UDA1380_CLK, 0); break; case UDA1380_DAC_CLK_WSPLL: - uda1380_write(codec, UDA1380_CLK, R00_DAC_CLK); + uda1380_write_reg_cache(codec, UDA1380_CLK, + R00_DAC_CLK); break; } @@ -717,10 +777,15 @@ static int uda1380_probe(struct snd_soc_codec *codec) return 0; err_reset: - gpio_set_value(pdata->gpio_power, 0); - gpio_free(pdata->gpio_reset); +err_gpio_power_conf: + if (gpio_is_valid(pdata->gpio_power)) + gpio_free(pdata->gpio_power); + +err_gpio_reset_conf: err_gpio: - gpio_free(pdata->gpio_power); + if (gpio_is_valid(pdata->gpio_reset)) + gpio_free(pdata->gpio_reset); +err_out: return ret; } @@ -731,7 +796,6 @@ static int uda1380_remove(struct snd_soc_codec *codec) uda1380_set_bias_level(codec, SND_SOC_BIAS_OFF); - gpio_set_value(pdata->gpio_power, 0); gpio_free(pdata->gpio_reset); gpio_free(pdata->gpio_power); @@ -743,8 +807,8 @@ static struct snd_soc_codec_driver soc_codec_dev_uda1380 = { .remove = uda1380_remove, .suspend = uda1380_suspend, .resume = uda1380_resume, - .read = uda1380_read_reg_cache, - .write = uda1380_write, + .read = uda1380_read_reg_cache, + .write = uda1380_write, .set_bias_level = uda1380_set_bias_level, .reg_cache_size = ARRAY_SIZE(uda1380_reg), .reg_word_size = sizeof(u16), @@ -764,6 +828,7 @@ static __devinit int uda1380_i2c_probe(struct i2c_client *i2c, return -ENOMEM; i2c_set_clientdata(i2c, uda1380); + uda1380->control_data = i2c; ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_uda1380, uda1380_dai, ARRAY_SIZE(uda1380_dai)); -- cgit v1.2.3 From 81d97802834acb908722636ff774b0f50cbf6131 Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Mon, 30 Aug 2010 11:28:08 +0300 Subject: ASoC: Add HP iPAQ RX1950 support Signed-off-by: Vasily Khoruzhick Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/s3c24xx/Kconfig | 8 + sound/soc/s3c24xx/Makefile | 2 + sound/soc/s3c24xx/rx1950_uda1380.c | 335 +++++++++++++++++++++++++++++++++++++ 3 files changed, 345 insertions(+) create mode 100644 sound/soc/s3c24xx/rx1950_uda1380.c (limited to 'sound') diff --git a/sound/soc/s3c24xx/Kconfig b/sound/soc/s3c24xx/Kconfig index 1cdc37bd58f4..7d8235de549e 100644 --- a/sound/soc/s3c24xx/Kconfig +++ b/sound/soc/s3c24xx/Kconfig @@ -118,6 +118,14 @@ config SND_S3C24XX_SOC_SIMTEC_HERMES select SND_SOC_TLV320AIC3X select SND_S3C24XX_SOC_SIMTEC +config SND_S3C24XX_SOC_RX1950_UDA1380 + tristate "Audio support for the HP iPAQ RX1950" + depends on SND_S3C24XX_SOC && MACH_RX1950 + select SND_S3C24XX_SOC_I2S + select SND_SOC_UDA1380 + help + This driver provides audio support for HP iPAQ RX1950 PDA. + config SND_SOC_SMDK_WM9713 tristate "SoC AC97 Audio support for SMDK with WM9713" depends on SND_S3C24XX_SOC && (MACH_SMDK6410 || MACH_SMDKC100 || MACH_SMDKV210 || MACH_SMDKC110) diff --git a/sound/soc/s3c24xx/Makefile b/sound/soc/s3c24xx/Makefile index 47ed6d70b90b..dd412a9e88c3 100644 --- a/sound/soc/s3c24xx/Makefile +++ b/sound/soc/s3c24xx/Makefile @@ -27,6 +27,7 @@ snd-soc-s3c24xx-uda134x-objs := s3c24xx_uda134x.o snd-soc-s3c24xx-simtec-objs := s3c24xx_simtec.o snd-soc-s3c24xx-simtec-hermes-objs := s3c24xx_simtec_hermes.o snd-soc-s3c24xx-simtec-tlv320aic23-objs := s3c24xx_simtec_tlv320aic23.o +snd-soc-rx1950-uda1380-objs := rx1950_uda1380.o snd-soc-smdk64xx-wm8580-objs := smdk64xx_wm8580.o snd-soc-smdk-wm9713-objs := smdk_wm9713.o snd-soc-s3c64xx-smartq-wm8987-objs := smartq_wm8987.o @@ -42,6 +43,7 @@ obj-$(CONFIG_SND_S3C24XX_SOC_S3C24XX_UDA134X) += snd-soc-s3c24xx-uda134x.o obj-$(CONFIG_SND_S3C24XX_SOC_SIMTEC) += snd-soc-s3c24xx-simtec.o obj-$(CONFIG_SND_S3C24XX_SOC_SIMTEC_HERMES) += snd-soc-s3c24xx-simtec-hermes.o obj-$(CONFIG_SND_S3C24XX_SOC_SIMTEC_TLV320AIC23) += snd-soc-s3c24xx-simtec-tlv320aic23.o +obj-$(CONFIG_SND_S3C24XX_SOC_RX1950_UDA1380) += snd-soc-rx1950-uda1380.o obj-$(CONFIG_SND_S3C64XX_SOC_WM8580) += snd-soc-smdk64xx-wm8580.o obj-$(CONFIG_SND_SOC_SMDK_WM9713) += snd-soc-smdk-wm9713.o obj-$(CONFIG_SND_S3C64XX_SOC_SMARTQ) += snd-soc-s3c64xx-smartq-wm8987.o diff --git a/sound/soc/s3c24xx/rx1950_uda1380.c b/sound/soc/s3c24xx/rx1950_uda1380.c new file mode 100644 index 000000000000..2a16113231fd --- /dev/null +++ b/sound/soc/s3c24xx/rx1950_uda1380.c @@ -0,0 +1,335 @@ +/* + * rx1950.c -- ALSA Soc Audio Layer + * + * Copyright (c) 2010 Vasily Khoruzhick + * + * Based on smdk2440.c and magician.c + * + * Authors: Graeme Gregory graeme.gregory@wolfsonmicro.com + * Philipp Zabel + * Denis Grigoriev + * Vasily Khoruzhick + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include "s3c-dma.h" +#include "s3c24xx-i2s.h" +#include "../codecs/uda1380.h" + +static int rx1950_uda1380_init(struct snd_soc_pcm_runtime *rtd); +static int rx1950_startup(struct snd_pcm_substream *substream); +static int rx1950_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params); +static int rx1950_spk_power(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event); + +static unsigned int rates[] = { + 16000, + 44100, + 48000, + 88200, +}; + +static struct snd_pcm_hw_constraint_list hw_rates = { + .count = ARRAY_SIZE(rates), + .list = rates, + .mask = 0, +}; + +static struct snd_soc_jack hp_jack; + +static struct snd_soc_jack_pin hp_jack_pins[] = { + { + .pin = "Headphone Jack", + .mask = SND_JACK_HEADPHONE, + }, + { + .pin = "Speaker", + .mask = SND_JACK_HEADPHONE, + .invert = 1, + }, +}; + +static struct snd_soc_jack_gpio hp_jack_gpios[] = { + [0] = { + .gpio = S3C2410_GPG(12), + .name = "hp-gpio", + .report = SND_JACK_HEADPHONE, + .invert = 1, + .debounce_time = 200, + }, +}; + +static struct snd_soc_ops rx1950_ops = { + .startup = rx1950_startup, + .hw_params = rx1950_hw_params, +}; + +/* s3c24xx digital audio interface glue - connects codec <--> CPU */ +static struct snd_soc_dai_link rx1950_uda1380_dai[] = { + { + .name = "uda1380", + .stream_name = "UDA1380 Duplex", + .cpu_dai_name = "s3c24xx-iis", + .codec_dai_name = "uda1380-hifi", + .init = rx1950_uda1380_init, + .platform_name = "s3c24xx-pcm-audio", + .codec_name = "uda1380-codec.0-001a", + .ops = &rx1950_ops, + }, +}; + +static struct snd_soc_card rx1950_asoc = { + .name = "rx1950", + .dai_link = rx1950_uda1380_dai, + .num_links = ARRAY_SIZE(rx1950_uda1380_dai), +}; + +/* rx1950 machine dapm widgets */ +static const struct snd_soc_dapm_widget uda1380_dapm_widgets[] = { + SND_SOC_DAPM_HP("Headphone Jack", NULL), + SND_SOC_DAPM_MIC("Mic Jack", NULL), + SND_SOC_DAPM_SPK("Speaker", rx1950_spk_power), +}; + +/* rx1950 machine audio_map */ +static const struct snd_soc_dapm_route audio_map[] = { + /* headphone connected to VOUTLHP, VOUTRHP */ + {"Headphone Jack", NULL, "VOUTLHP"}, + {"Headphone Jack", NULL, "VOUTRHP"}, + + /* ext speaker connected to VOUTL, VOUTR */ + {"Speaker", NULL, "VOUTL"}, + {"Speaker", NULL, "VOUTR"}, + + /* mic is connected to VINM */ + {"VINM", NULL, "Mic Jack"}, +}; + +static struct platform_device *s3c24xx_snd_device; +static struct clk *xtal; + +static int rx1950_startup(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + + runtime->hw.rate_min = hw_rates.list[0]; + runtime->hw.rate_max = hw_rates.list[hw_rates.count - 1]; + runtime->hw.rates = SNDRV_PCM_RATE_KNOT; + + return snd_pcm_hw_constraint_list(runtime, 0, + SNDRV_PCM_HW_PARAM_RATE, + &hw_rates); +} + +static int rx1950_spk_power(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + if (SND_SOC_DAPM_EVENT_ON(event)) + gpio_set_value(S3C2410_GPA(1), 1); + else + gpio_set_value(S3C2410_GPA(1), 0); + + return 0; +} + +static int rx1950_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + int div; + int ret; + unsigned int rate = params_rate(params); + int clk_source, fs_mode; + + switch (rate) { + case 16000: + case 48000: + clk_source = S3C24XX_CLKSRC_PCLK; + fs_mode = S3C2410_IISMOD_384FS; + div = s3c24xx_i2s_get_clockrate() / (384 * rate); + if (s3c24xx_i2s_get_clockrate() % (384 * rate) > (182 * rate)) + div++; + break; + case 44100: + case 88200: + clk_source = S3C24XX_CLKSRC_MPLL; + fs_mode = S3C2410_IISMOD_256FS; + div = clk_get_rate(xtal) / (256 * rate); + if (clk_get_rate(xtal) % (256 * rate) > (128 * rate)) + div++; + break; + default: + printk(KERN_ERR "%s: rate %d is not supported\n", + __func__, rate); + return -EINVAL; + } + + /* set codec DAI configuration */ + ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS); + if (ret < 0) + return ret; + + /* set cpu DAI configuration */ + ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS); + if (ret < 0) + return ret; + + /* select clock source */ + ret = snd_soc_dai_set_sysclk(cpu_dai, clk_source, rate, + SND_SOC_CLOCK_OUT); + if (ret < 0) + return ret; + + /* set MCLK division for sample rate */ + ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C24XX_DIV_MCLK, + S3C2410_IISMOD_384FS); + if (ret < 0) + return ret; + + /* set BCLK division for sample rate */ + ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C24XX_DIV_BCLK, + S3C2410_IISMOD_32FS); + if (ret < 0) + return ret; + + /* set prescaler division for sample rate */ + ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C24XX_DIV_PRESCALER, + S3C24XX_PRESCALE(div, div)); + if (ret < 0) + return ret; + + return 0; +} + +static int rx1950_uda1380_init(struct snd_soc_pcm_runtime *rtd) +{ + struct snd_soc_codec *codec = rtd->codec; + int err; + + /* Add rx1950 specific widgets */ + err = snd_soc_dapm_new_controls(codec, uda1380_dapm_widgets, + ARRAY_SIZE(uda1380_dapm_widgets)); + + if (err) + return err; + + /* Set up rx1950 specific audio path audio_mapnects */ + err = snd_soc_dapm_add_routes(codec, audio_map, + ARRAY_SIZE(audio_map)); + + if (err) + return err; + + snd_soc_dapm_enable_pin(codec, "Headphone Jack"); + snd_soc_dapm_enable_pin(codec, "Speaker"); + + snd_soc_dapm_sync(codec); + + snd_soc_jack_new(codec, "Headphone Jack", SND_JACK_HEADPHONE, + &hp_jack); + + snd_soc_jack_add_pins(&hp_jack, ARRAY_SIZE(hp_jack_pins), + hp_jack_pins); + + snd_soc_jack_add_gpios(&hp_jack, ARRAY_SIZE(hp_jack_gpios), + hp_jack_gpios); + + return 0; +} + +static int __init rx1950_init(void) +{ + int ret; + + /* configure some gpios */ + ret = gpio_request(S3C2410_GPA(1), "speaker-power"); + if (ret) + goto err_gpio; + + ret = gpio_direction_output(S3C2410_GPA(1), 0); + if (ret) + goto err_gpio_conf; + + s3c24xx_snd_device = platform_device_alloc("soc-audio", -1); + if (!s3c24xx_snd_device) { + ret = -ENOMEM; + goto err_plat_alloc; + } + + platform_set_drvdata(s3c24xx_snd_device, &rx1950_asoc); + ret = platform_device_add(s3c24xx_snd_device); + + if (ret) { + platform_device_put(s3c24xx_snd_device); + goto err_plat_add; + } + + xtal = clk_get(&s3c24xx_snd_device->dev, "xtal"); + + if (IS_ERR(xtal)) { + ret = PTR_ERR(xtal); + platform_device_unregister(s3c24xx_snd_device); + goto err_clk; + } + + return 0; + +err_clk: +err_plat_add: +err_plat_alloc: +err_gpio_conf: + gpio_free(S3C2410_GPA(1)); + +err_gpio: + return ret; +} + +static void __exit rx1950_exit(void) +{ + platform_device_unregister(s3c24xx_snd_device); + snd_soc_jack_free_gpios(&hp_jack, ARRAY_SIZE(hp_jack_gpios), + hp_jack_gpios); + clk_put(xtal); + gpio_free(S3C2410_GPA(1)); +} + +module_init(rx1950_init); +module_exit(rx1950_exit); + +/* Module information */ +MODULE_AUTHOR("Vasily Khoruzhick"); +MODULE_DESCRIPTION("ALSA SoC RX1950"); +MODULE_LICENSE("GPL"); -- cgit v1.2.3 From 2c280320f22153f7035a76ee0948f5577c5482b5 Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Mon, 30 Aug 2010 20:47:19 +0900 Subject: ASoC: fsi-ak4642/fsi-da7210: modify dai link settings for card detect This patch modify dai link - platform_name: sh_fsi/sh_fsi2 are used for FSI driver - codec_name: ak4642/ak4643 are used for ak4642 driver This is quick hack. I should modify it more wisely in future Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/sh/fsi-ak4642.c | 7 ++++++- sound/soc/sh/fsi-da7210.c | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/sh/fsi-ak4642.c b/sound/soc/sh/fsi-ak4642.c index 9e107a9c4010..53836ca11d3b 100644 --- a/sound/soc/sh/fsi-ak4642.c +++ b/sound/soc/sh/fsi-ak4642.c @@ -31,8 +31,13 @@ static struct snd_soc_dai_link fsi_dai_link = { .stream_name = "AK4642", .cpu_dai_name = "fsia-dai", /* fsi A */ .codec_dai_name = "ak4642-hifi", - .platform_name = "fsi-pcm-audio", +#ifdef CONFIG_MACH_AP4EVB + .platform_name = "sh_fsi2.0", + .codec_name = "ak4642-codec.0-0013", +#else + .platform_name = "sh_fsi.0", .codec_name = "ak4642-codec.0-0012", +#endif .init = fsi_ak4642_dai_init, .ops = NULL, }; diff --git a/sound/soc/sh/fsi-da7210.c b/sound/soc/sh/fsi-da7210.c index 4f9298f45215..b5270156c817 100644 --- a/sound/soc/sh/fsi-da7210.c +++ b/sound/soc/sh/fsi-da7210.c @@ -27,7 +27,7 @@ static struct snd_soc_dai_link fsi_da7210_dai = { .stream_name = "DA7210", .cpu_dai_name = "fsib-dai", /* FSI B */ .codec_dai_name = "da7210-hifi", - .platform_name = "fsi-pcm-audio", + .platform_name = "sh_fsi.0", .codec_name = "da7210-codec.0-001a", .init = fsi_da7210_init, }; -- cgit v1.2.3 From c88e7b93a80bd46899c4cb09a9b2d52bb04d79bd Mon Sep 17 00:00:00 2001 From: "Arnaud Patard (Rtp)" Date: Mon, 30 Aug 2010 16:00:05 +0200 Subject: ASoC: OpenRD Client : Fix naming breakage due to multicomponent support multicomponent support added/changed some device name but added some typos, breaking existing OpenRD Client support. Signed-off-by: Arnaud Patard Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/codecs/cs42l51.c | 2 +- sound/soc/kirkwood/kirkwood-openrd.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/soc/codecs/cs42l51.c b/sound/soc/codecs/cs42l51.c index 8a25743870c2..39fbcff20258 100644 --- a/sound/soc/codecs/cs42l51.c +++ b/sound/soc/codecs/cs42l51.c @@ -622,7 +622,7 @@ MODULE_DEVICE_TABLE(i2c, cs42l51_id); static struct i2c_driver cs42l51_i2c_driver = { .driver = { - .name = "cs42L51-codec", + .name = "cs42l51-codec", .owner = THIS_MODULE, }, .id_table = cs42l51_id, diff --git a/sound/soc/kirkwood/kirkwood-openrd.c b/sound/soc/kirkwood/kirkwood-openrd.c index cc1a1e277edf..2cf76dfd0355 100644 --- a/sound/soc/kirkwood/kirkwood-openrd.c +++ b/sound/soc/kirkwood/kirkwood-openrd.c @@ -66,7 +66,7 @@ static struct snd_soc_dai_link openrd_client_dai[] = { .stream_name = "CS42L51 HiFi", .cpu_dai_name = "kirkwood-i2s", .platform_name = "kirkwood-pcm-audio", - .codec_dai_name = "cs42l51_hifi", + .codec_dai_name = "cs42l51-hifi", .codec_name = "cs42l51-codec.0-004a", .ops = &openrd_client_ops, }, -- cgit v1.2.3 From 41a686eedfcec74f5facd487835deff8fb5cef60 Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Tue, 31 Aug 2010 14:46:53 +0900 Subject: ASoC: fsi-codec: Add FSI - HDMI support Signed-off-by: Kuninori Morimoto Acked-by: Liam Girdwood Signed-off-by: Mark Brown --- sound/soc/sh/Kconfig | 7 ++++++ sound/soc/sh/Makefile | 2 ++ sound/soc/sh/fsi-hdmi.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 sound/soc/sh/fsi-hdmi.c (limited to 'sound') diff --git a/sound/soc/sh/Kconfig b/sound/soc/sh/Kconfig index 52d7e8ed9c1f..6b224d21e51b 100644 --- a/sound/soc/sh/Kconfig +++ b/sound/soc/sh/Kconfig @@ -62,6 +62,13 @@ config SND_FSI_DA7210 This option enables generic sound support for the FSI - DA7210 unit +config SND_FSI_HDMI + bool "FSI-HDMI sound support" + depends on SND_SOC_SH4_FSI && FB_SH_MOBILE_HDMI + help + This option enables generic sound support for the + FSI - HDMI unit + config SND_SIU_MIGOR tristate "SIU sound support on Migo-R" depends on SH_MIGOR diff --git a/sound/soc/sh/Makefile b/sound/soc/sh/Makefile index 8a5a19293bda..94476d4c0fd5 100644 --- a/sound/soc/sh/Makefile +++ b/sound/soc/sh/Makefile @@ -16,9 +16,11 @@ obj-$(CONFIG_SND_SOC_SH4_SIU) += snd-soc-siu.o snd-soc-sh7760-ac97-objs := sh7760-ac97.o snd-soc-fsi-ak4642-objs := fsi-ak4642.o snd-soc-fsi-da7210-objs := fsi-da7210.o +snd-soc-fsi-hdmi-objs := fsi-hdmi.o snd-soc-migor-objs := migor.o obj-$(CONFIG_SND_SH7760_AC97) += snd-soc-sh7760-ac97.o obj-$(CONFIG_SND_FSI_AK4642) += snd-soc-fsi-ak4642.o obj-$(CONFIG_SND_FSI_DA7210) += snd-soc-fsi-da7210.o +obj-$(CONFIG_SND_FSI_HDMI) += snd-soc-fsi-hdmi.o obj-$(CONFIG_SND_SIU_MIGOR) += snd-soc-migor.o diff --git a/sound/soc/sh/fsi-hdmi.c b/sound/soc/sh/fsi-hdmi.c new file mode 100644 index 000000000000..950e3e0c971d --- /dev/null +++ b/sound/soc/sh/fsi-hdmi.c @@ -0,0 +1,61 @@ +/* + * FSI - HDMI sound support + * + * Copyright (C) 2010 Renesas Solutions Corp. + * Kuninori Morimoto + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include +#include +#include