lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1414495589-8579-8-git-send-email-qais.yousef@imgtec.com>
Date:	Tue, 28 Oct 2014 11:26:25 +0000
From:	Qais Yousef <qais.yousef@...tec.com>
To:	<linux-kernel@...r.kernel.org>
CC:	Qais Yousef <qais.yousef@...tec.com>,
	Arnd Bergmann <arnd@...db.de>,
	"Greg Kroah-Hartman" <gregkh@...uxfoundation.org>,
	<alsa-devel@...a-project.org>
Subject: [PATCH 07/11] drivers: char: axd: add cmd interfce helper functions

AXD has a lot of registers. These files contain helper functions to
access these registers in a readable way.

Signed-off-by: Qais Yousef <qais.yousef@...tec.com>
Cc: Arnd Bergmann <arnd@...db.de>
Cc: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
Cc: <alsa-devel@...a-project.org>
---
 drivers/char/axd/axd_cmds_codec_internal.c |   58 +
 drivers/char/axd/axd_cmds_codec_internal.h |   28 +
 drivers/char/axd/axd_cmds_config.c         | 1194 ++++++++++
 drivers/char/axd/axd_cmds_decoder_config.c | 1806 ++++++++++++++++
 drivers/char/axd/axd_cmds_encoder_config.c |  519 +++++
 drivers/char/axd/axd_cmds_info.c           | 1409 ++++++++++++
 drivers/char/axd/axd_cmds_internal.c       | 3237 ++++++++++++++++++++++++++++
 drivers/char/axd/axd_cmds_internal.h       |  306 +++
 8 files changed, 8557 insertions(+)
 create mode 100644 drivers/char/axd/axd_cmds_codec_internal.c
 create mode 100644 drivers/char/axd/axd_cmds_codec_internal.h
 create mode 100644 drivers/char/axd/axd_cmds_config.c
 create mode 100644 drivers/char/axd/axd_cmds_decoder_config.c
 create mode 100644 drivers/char/axd/axd_cmds_encoder_config.c
 create mode 100644 drivers/char/axd/axd_cmds_info.c
 create mode 100644 drivers/char/axd/axd_cmds_internal.c
 create mode 100644 drivers/char/axd/axd_cmds_internal.h

diff --git a/drivers/char/axd/axd_cmds_codec_internal.c b/drivers/char/axd/axd_cmds_codec_internal.c
new file mode 100644
index 000000000000..ba3ed9453faa
--- /dev/null
+++ b/drivers/char/axd/axd_cmds_codec_internal.c
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2011-2014 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.
+ *
+ * Common functionality required by the codec config files.
+ */
+#include "axd_cmds.h"
+#include "axd_cmds_codec_internal.h"
+
+void str_append(char *dest, const char *src)
+{
+	int len = strlen(dest);
+
+	dest += len;
+	strcpy(dest, src);
+}
+
+void print_timeout_msg(char *config)
+{
+	strcpy(config, "Read Timeout\n\0");
+}
+
+/* Common decoder/encoder option parse functions */
+
+void parse_pcm_samplerate(unsigned int samplerate, char *config)
+{
+	sprintf(config, "samplerate = %u\n", samplerate);
+}
+void parse_pcm_channels(unsigned int channels, char *config)
+{
+	sprintf(config, "channels = %u\n", channels);
+}
+void parse_pcm_bitspersample(unsigned int bitspersample, char *config)
+{
+	sprintf(config, "bitspersample = %u\n", bitspersample);
+}
+void parse_pcm_justification(unsigned int justification, char *config)
+{
+#define PCM_JUSTIFICATION_LEFT_STR	"Left"
+#define PCM_JUSTIFICATION_RIGHT_STR	"Right"
+	const char *str;
+
+	switch (justification) {
+	case 0:
+		str = PCM_JUSTIFICATION_LEFT_STR;
+		break;
+	case 1:
+		str = PCM_JUSTIFICATION_RIGHT_STR;
+		break;
+	default:
+		return;
+	}
+	sprintf(config, "justification = %s\n", str);
+}
diff --git a/drivers/char/axd/axd_cmds_codec_internal.h b/drivers/char/axd/axd_cmds_codec_internal.h
new file mode 100644
index 000000000000..4ade17c210de
--- /dev/null
+++ b/drivers/char/axd/axd_cmds_codec_internal.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2011-2014 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.
+ *
+ * Common functionality required by the codec config files.
+ */
+#ifndef AXD_CMDS_CODEC_INTERNAL_H_
+#define AXD_CMDS_CODEC_INTERNAL_H_
+
+void str_append(char *dest, const char *src);
+
+void print_timeout_msg(char *config);
+
+/* Common option parse functions */
+#define PCM_SAMPLERATE_PARAM		"samplerate"
+#define PCM_CHANNELS_PARAM		"channels"
+#define PCM_BITSPERSAMPLE_PARAM		"bitspersample"
+#define PCM_JUSTIFICATION_PARAM		"justification"
+void parse_pcm_samplerate(unsigned int samplerate, char *config);
+void parse_pcm_channels(unsigned int channels, char *config);
+void parse_pcm_bitspersample(unsigned int bitspersample, char *config);
+void parse_pcm_justification(unsigned int justification, char *config);
+
+#endif
diff --git a/drivers/char/axd/axd_cmds_config.c b/drivers/char/axd/axd_cmds_config.c
new file mode 100644
index 000000000000..2d9e470e225f
--- /dev/null
+++ b/drivers/char/axd/axd_cmds_config.c
@@ -0,0 +1,1194 @@
+/*
+ * Copyright (C) 2011-2014 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.
+ *
+ * AXD Commands API - Configuration functions.
+ */
+#include "axd_cmds.h"
+#include "axd_cmds_internal.h"
+
+
+/*
+ * Enable/Disable Mixer EQ.
+ * @pipe: pipe number.
+ * @enable:
+ *	Enable	= !0
+ *	Disable	= 0
+ */
+void axd_cmd_mixer_set_eqenabled(struct axd_cmd *cmd, unsigned int pipe,
+								int enable)
+{
+	unsigned int reg = AXD_REG_EQ_CTRL_GAIN;
+	unsigned int control;
+
+	if (axd_read_reg(cmd, reg, &control))
+		return;
+
+	if (enable)
+		control |= AXD_EQCTRL_ENABLE_BITS;
+	else
+		control &= ~AXD_EQCTRL_ENABLE_BITS;
+	axd_write_reg(cmd, reg, control);
+}
+
+/*
+ * Set the Master gain of the EQ of the Mixer
+ * @pipe: pipe number.
+ * @gain: 0-99 gain value
+ */
+void axd_cmd_mixer_set_eqmastergain(struct axd_cmd *cmd, unsigned int pipe,
+								int gain)
+{
+	unsigned int reg = AXD_REG_EQ_CTRL_GAIN;
+	unsigned int control;
+
+	if (unlikely(gain > 99 || gain < 0))
+		return;
+
+	if (axd_read_reg(cmd, reg, &control))
+		return;
+
+	gain = (gain << AXD_EQCTRL_GAIN_SHIFT) & AXD_EQCTRL_GAIN_BITS;
+	control &= ~AXD_EQCTRL_GAIN_BITS;
+	control |= gain;
+	axd_write_reg(cmd, reg, control);
+}
+
+/*
+ * Set the gain of the EQ Band0 of the Mixer
+ * @pipe: pipe number.
+ * @gain: Signed 8 bit 2'compliment gain value.
+ */
+void axd_cmd_mixer_set_eqband0gain(struct axd_cmd *cmd, unsigned int pipe,
+								int gain)
+{
+	gain = (gain << AXD_EQBANDX_GAIN_SHIFT) & AXD_EQBANDX_GAIN_BITS;
+	axd_write_reg(cmd, AXD_REG_EQ_BAND0, gain);
+}
+
+/*
+ * Set the gain of the EQ Band1 of the Mixer
+ * @pipe: pipe number.
+ * @gain: Signed 8 bit 2'compliment gain value.
+ */
+void axd_cmd_mixer_set_eqband1gain(struct axd_cmd *cmd, unsigned int pipe,
+								int gain)
+{
+	gain = (gain << AXD_EQBANDX_GAIN_SHIFT) & AXD_EQBANDX_GAIN_BITS;
+	axd_write_reg(cmd, AXD_REG_EQ_BAND1, gain);
+}
+
+/*
+ * Set the gain of the EQ Band2 of Mixer
+ * @pipe: pipe number.
+ * @gain: Signed 8 bit 2'compliment gain value.
+ */
+void axd_cmd_mixer_set_eqband2gain(struct axd_cmd *cmd, unsigned int pipe,
+								int gain)
+{
+	gain = (gain << AXD_EQBANDX_GAIN_SHIFT) & AXD_EQBANDX_GAIN_BITS;
+	axd_write_reg(cmd, AXD_REG_EQ_BAND2, gain);
+}
+
+/*
+ * Set the gain of the EQ Band3 of the Mixer
+ * @pipe: pipe number.
+ * @gain: Signed 8 bit 2'compliment gain value.
+ */
+void axd_cmd_mixer_set_eqband3gain(struct axd_cmd *cmd, unsigned int pipe,
+								int gain)
+{
+	gain = (gain << AXD_EQBANDX_GAIN_SHIFT) & AXD_EQBANDX_GAIN_BITS;
+	axd_write_reg(cmd, AXD_REG_EQ_BAND3, gain);
+}
+
+/*
+ * Set the gain of the EQ Band4 of the Mixer
+ * @pipe: pipe number.
+ * @gain: Signed 8 bit 2'compliment gain value.
+ */
+void axd_cmd_mixer_set_eqband4gain(struct axd_cmd *cmd, unsigned int pipe,
+								int gain)
+{
+	gain = (gain << AXD_EQBANDX_GAIN_SHIFT) & AXD_EQBANDX_GAIN_BITS;
+	axd_write_reg(cmd, AXD_REG_EQ_BAND4, gain);
+}
+
+/*
+ * Select Mixer's Mux output
+ * @pipe: pipe number.
+ * @mux:
+ *	Mix	= 0
+ *	Input 0	= 1
+ *	Input 1	= 2
+ *	Input 2	= 3
+ *	Input 3	= 4
+ */
+void axd_cmd_mixer_set_mux(struct axd_cmd *cmd, unsigned int pipe,
+								int mux)
+{
+	unsigned int reg = axd_get_mixer_mux_reg(cmd, pipe);
+
+	if (unlikely(mux > 4 || mux < 0))
+		return;
+	axd_write_reg(cmd, reg, mux);
+}
+
+/*
+ * Enable/Disable input.
+ * @pipe: pipe number.
+ * @enable:
+ *	Enable	= !0
+ *	Disable	= 0
+ */
+int axd_cmd_input_set_enabled(struct axd_cmd *cmd, unsigned int pipe,
+								int enable)
+{
+	unsigned int reg = axd_get_input_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return -1;
+
+	if (axd_read_reg(cmd, reg, &control))
+		return -1;
+
+	if (enable)
+		control |= AXD_INCTRL_ENABLE_BITS;
+	else
+		control &= ~AXD_INCTRL_ENABLE_BITS;
+	if (axd_write_reg(cmd, reg, control))
+		return -1;
+	return 0;
+}
+
+/*
+ * Set the source of the input pipe.
+ * @pipe: pipe number.
+ * @source:
+ *	Pipe	= 0
+ *	Aux	= 1
+ */
+void axd_cmd_input_set_source(struct axd_cmd *cmd, unsigned int pipe,
+								int source)
+{
+	unsigned int reg = axd_get_input_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg || source > 1 || source < 0))
+		return;
+	if (axd_read_reg(cmd, reg, &control))
+		return;
+	source = (source << AXD_INCTRL_SOURCE_SHIFT) & AXD_INCTRL_SOURCE_BITS;
+	control &= ~AXD_INCTRL_SOURCE_BITS;
+	control |= source;
+	axd_write_reg(cmd, reg, control);
+}
+
+/*
+ * Set the codec of the input pipe.
+ * @pipe: pipe number.
+ * @codec:
+ *	PCM Pass Through	= 0
+ *	MPEG (2/3)		= 1
+ *	Dolby AC3		= 2
+ *	AAC			= 3
+ *	Ogg Vorbis		= 4
+ *	FLAC			= 5
+ *	Cook			= 6
+ *	WMA			= 7
+ *	DDPlus			= 8
+ *	DTS			= 9   Unsupported
+ *	DTS-HD			= 10  Unsupported
+ *	ALAC			= 11
+ *	SBC			= 13
+ */
+void axd_cmd_input_set_codec(struct axd_cmd *cmd, unsigned int pipe,
+								int codec)
+{
+	unsigned int reg = axd_get_input_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg || codec > 13 || codec < 0 ||
+						codec == 9 || codec == 10))
+		return;
+	if (axd_read_reg(cmd, reg, &control))
+		return;
+	codec = (codec << AXD_INCTRL_CODEC_SHIFT) & AXD_INCTRL_CODEC_BITS;
+	control &= ~AXD_INCTRL_CODEC_BITS;
+	control |= codec;
+	axd_write_reg(cmd, reg, control);
+}
+
+/*
+ * Set the gain of the input pipe.
+ * @pipe: pipe number.
+ * @gain: Signed 32 bit 2'compliment gain value.
+ *	Gain Cut or Boost in 0.25dB increment. ie: 4 = 1dB.
+ */
+void axd_cmd_input_set_gain(struct axd_cmd *cmd, unsigned int pipe,
+								int gain)
+{
+	unsigned int reg = axd_get_input_gain_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return;
+	axd_write_reg(cmd, reg, gain);
+}
+
+/*
+ * Mute/Unmute the input pipe.
+ * @pipe: pipe number.
+ * @mute:  0	= OFF
+ *	  !0	= ON
+ */
+void axd_cmd_input_set_mute(struct axd_cmd *cmd, unsigned int pipe,
+								int mute)
+{
+	unsigned int reg = axd_get_input_mute_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return;
+	axd_write_reg(cmd, reg, mute);
+}
+
+/*
+ * Set the upmix of the input pipe.
+ * @pipe: pipe number.
+ * @upmix:
+ *	Pass through		= 0
+ *	Simple 5.1		= 1
+ *	Dolby Pro Logic 2	= 2
+ */
+void axd_cmd_input_set_upmix(struct axd_cmd *cmd, unsigned int pipe,
+								int upmix)
+{
+	unsigned int reg = axd_get_input_upmix_reg(cmd, pipe);
+
+	if (unlikely(!reg || upmix > 2 || upmix < 0))
+		return;
+	axd_write_reg(cmd, reg, upmix);
+}
+
+/* Set the buffer occupancy value of @pipe. */
+void axd_cmd_input_set_buffer_occupancy(struct axd_cmd *cmd, unsigned int pipe,
+								unsigned int bo)
+{
+	unsigned int reg = axd_get_input_buffer_occupancy_reg(cmd, pipe);
+
+	axd_write_reg(cmd, reg, bo);
+}
+
+/*
+ * Enable/Disable output.
+ * @pipe: pipe number.
+ * @enable:
+ *	Enable	= !0
+ *	Disable	= 0
+ */
+int axd_cmd_output_set_enabled(struct axd_cmd *cmd, unsigned int pipe,
+								int enable)
+{
+	unsigned int reg = axd_get_output_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return -1;
+	if (axd_read_reg(cmd, reg, &control))
+		return -1;
+	if (enable)
+		control |= AXD_OUTCTRL_ENABLE_BITS;
+	else
+		control &= ~AXD_OUTCTRL_ENABLE_BITS;
+	if (axd_write_reg(cmd, reg, control))
+		return -1;
+	return 0;
+}
+
+/*
+ * Set the codec of the output pipe.
+ * @pipe: pipe number.
+ * @codec:
+ *	PCM Pass Through	=  0
+ *	MPEG (2/3)		=  1 Unsupported
+ *	Dolby AC3		=  2 Unsupported
+ *	AAC			=  3 Unsupported
+ *	Ogg Vorbis		=  4 Unsupported
+ *	FLAC			=  5
+ *	Cook			=  6 Unsupported
+ *	WMA			=  7 Unsupported
+ *	DDPlus			=  8 Unsupported
+ *	DTS			=  9 Unsupported
+ *	DTS-HD			= 10 Unsupported
+ *	ALAC			= 11
+ *	SBC			= 13 Unsupported
+ */
+void axd_cmd_output_set_codec(struct axd_cmd *cmd, unsigned int pipe,
+								int codec)
+{
+	unsigned int reg = axd_get_output_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg || !(codec == 0 || codec == 5 || codec == 11)))
+		return;
+	if (axd_read_reg(cmd, reg, &control))
+		return;
+	codec = (codec << AXD_OUTCTRL_CODEC_SHIFT) & AXD_OUTCTRL_CODEC_BITS;
+	control &= ~AXD_OUTCTRL_CODEC_BITS;
+	control |= codec;
+	axd_write_reg(cmd, reg, control);
+}
+
+/*
+ * Set the sink of the output pipe.
+ * @pipe: pipe number.
+ * @source:
+ *	Pipe	= 0
+ */
+void axd_cmd_output_set_sink(struct axd_cmd *cmd, unsigned int pipe,
+								int sink)
+{
+	unsigned int reg = axd_get_output_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg || (sink < 0 && sink > 3)))
+		return;
+	if (axd_read_reg(cmd, reg, &control))
+		return;
+	sink = (sink << AXD_OUTCTRL_SINK_SHIFT) & AXD_OUTCTRL_SINK_BITS;
+	control &= ~AXD_OUTCTRL_SINK_BITS;
+	control |= sink;
+	axd_write_reg(cmd, reg, control);
+}
+
+/*
+ * Set the downmix of the output pipe.
+ * @pipe: pipe number.
+ * @downmix:
+ *	Pass through	= 0
+ *	5.1		= 1
+ *	2.0		= 2
+ */
+void axd_cmd_output_set_downmix(struct axd_cmd *cmd, unsigned int pipe,
+								int downmix)
+{
+	unsigned int reg = axd_get_output_downmix_reg(cmd, pipe);
+
+	if (unlikely(!reg || downmix > 2 || downmix < 0))
+		return;
+	axd_write_reg(cmd, reg, downmix);
+}
+
+/*
+ * Enable/Disable output EQ.
+ * @pipe: pipe number.
+ * @enable:
+ *	Enable	= !0
+ *	Disable	= 0
+ */
+void axd_cmd_output_set_eqenabled(struct axd_cmd *cmd, unsigned int pipe,
+								int enable)
+{
+	unsigned int reg = axd_get_output_eqcontrol_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return;
+	if (axd_read_reg(cmd, reg, &control))
+		return;
+
+	if (enable)
+		control |= AXD_EQCTRL_ENABLE_BITS;
+	else
+		control &= ~AXD_EQCTRL_ENABLE_BITS;
+	axd_write_reg(cmd, reg, control);
+}
+
+/*
+ * Set the Master gain of the EQ of output pipe.
+ * @pipe: pipe number.
+ * @gain: 0-99 gain value
+ */
+void axd_cmd_output_set_eqmastergain(struct axd_cmd *cmd, unsigned int pipe,
+								int gain)
+{
+	unsigned int reg = axd_get_output_eqcontrol_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg || gain > 99 || gain < 0))
+		return;
+	if (axd_read_reg(cmd, reg, &control))
+		return;
+
+	gain = (gain << AXD_EQCTRL_GAIN_SHIFT) & AXD_EQCTRL_GAIN_BITS;
+	control &= ~AXD_EQCTRL_GAIN_BITS;
+	control |= gain;
+	axd_write_reg(cmd, reg, control);
+}
+
+/*
+ * Set the gain of the EQ Band0 of output pipe.
+ * @pipe: pipe number.
+ * @gain: Signed 8 bit 2'compliment gain value.
+ */
+void axd_cmd_output_set_eqband0gain(struct axd_cmd *cmd, unsigned int pipe,
+								int gain)
+{
+	unsigned int reg = axd_get_output_eqband0_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return;
+	gain = (gain << AXD_EQBANDX_GAIN_SHIFT) & AXD_EQBANDX_GAIN_BITS;
+	axd_write_reg(cmd, reg, gain);
+}
+
+/*
+ * Set the gain of the EQ Band1 of output pipe.
+ * @pipe: pipe number.
+ * @gain: Signed 8 bit 2'compliment gain value.
+ */
+void axd_cmd_output_set_eqband1gain(struct axd_cmd *cmd, unsigned int pipe,
+								int gain)
+{
+	unsigned int reg = axd_get_output_eqband1_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return;
+	gain = (gain << AXD_EQBANDX_GAIN_SHIFT) & AXD_EQBANDX_GAIN_BITS;
+	axd_write_reg(cmd, reg, gain);
+}
+
+/*
+ * Set the gain of the EQ Band2 of output pipe.
+ * @pipe: pipe number.
+ * @gain: Signed 8 bit 2'compliment gain value.
+ */
+void axd_cmd_output_set_eqband2gain(struct axd_cmd *cmd, unsigned int pipe,
+								int gain)
+{
+	unsigned int reg = axd_get_output_eqband2_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return;
+	gain = (gain << AXD_EQBANDX_GAIN_SHIFT) & AXD_EQBANDX_GAIN_BITS;
+	axd_write_reg(cmd, reg, gain);
+}
+
+/*
+ * Set the gain of the EQ Band3 of output pipe.
+ * @pipe: pipe number.
+ * @gain: Signed 8 bit 2'compliment gain value.
+ */
+void axd_cmd_output_set_eqband3gain(struct axd_cmd *cmd, unsigned int pipe,
+								int gain)
+{
+	unsigned int reg = axd_get_output_eqband3_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return;
+	gain = (gain << AXD_EQBANDX_GAIN_SHIFT) & AXD_EQBANDX_GAIN_BITS;
+	axd_write_reg(cmd, reg, gain);
+}
+
+/*
+ * Set the gain of the EQ Band4 of output pipe.
+ * @pipe: pipe number.
+ * @gain: Signed 8 bit 2'compliment gain value.
+ */
+void axd_cmd_output_set_eqband4gain(struct axd_cmd *cmd, unsigned int pipe,
+								int gain)
+{
+	unsigned int reg = axd_get_output_eqband4_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return;
+	gain = (gain << AXD_EQBANDX_GAIN_SHIFT) & AXD_EQBANDX_GAIN_BITS;
+	axd_write_reg(cmd, reg, gain);
+}
+
+/* DCPP */
+
+int axd_cmd_output_set_dcpp_enabled(struct axd_cmd *cmd, unsigned int pipe,
+								int enable)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	reg = axd_get_output_dcpp_control_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+	if (axd_read_reg(cmd, reg, &control))
+		return -1;
+
+	if (enable)
+		control |= AXD_DCPP_CTRL_ENABLE_BITS;
+	else
+		control &= ~AXD_DCPP_CTRL_ENABLE_BITS;
+
+	return axd_write_reg_buf(cmd, reg, control);
+}
+
+int axd_cmd_output_set_dcpp_mode(struct axd_cmd *cmd, unsigned int pipe,
+							unsigned int mode)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	reg = axd_get_output_dcpp_control_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+	if (axd_read_reg(cmd, reg, &control))
+		return -1;
+
+	/* Conditionally mask in mode bit */
+	control ^= ((control ^ (mode << AXD_DCPP_CTRL_MODE_SHIFT))
+						& AXD_DCPP_CTRL_MODE_BITS);
+
+	return axd_write_reg_buf(cmd, reg, control);
+}
+
+int axd_cmd_output_set_dcpp_eq_mode(struct axd_cmd *cmd, unsigned int pipe,
+							unsigned int mode)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	reg = axd_get_output_dcpp_control_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+	if (axd_read_reg(cmd, reg, &control))
+		return -1;
+
+	/* Conditionally mask in mode bit */
+	control ^= ((control ^ (mode << AXD_DCPP_CTRL_EQ_MODE_SHIFT))
+						& AXD_DCPP_CTRL_EQ_MODE_BITS);
+
+	return axd_write_reg_buf(cmd, reg, control);
+}
+
+int axd_cmd_output_set_dcpp_channel_delay_samples(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_delay_samples_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_eq_output_volume(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_eq_output_volume_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_eq_passthrough_gain(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_eq_passthrough_gain_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_eq_inverse_passthrough_gain(
+					struct axd_cmd *cmd, unsigned int pipe,
+					unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_eq_inverse_passthrough_gain_reg(cmd,
+									pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_bass_shelf_shift(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_bass_shelf_shift_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_bass_shelf_a0(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_bass_shelf_a0_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_bass_shelf_a1(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_bass_shelf_a1_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_bass_shelf_a2(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_bass_shelf_a2_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_bass_shelf_b0(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_bass_shelf_b0_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_bass_shelf_b1(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_bass_shelf_b1_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_treble_shelf_shift(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_treble_shelf_shift_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_treble_shelf_a0(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_treble_shelf_a0_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_treble_shelf_a1(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_treble_shelf_a1_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_treble_shelf_a2(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_treble_shelf_a2_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_treble_shelf_b0(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_treble_shelf_b0_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_treble_shelf_b1(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_treble_shelf_b1_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_eq_gain(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int channel,
+					unsigned int band, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_gain_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_eq_a0(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int channel,
+					unsigned int band, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_a0_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_eq_a1(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int channel,
+					unsigned int band, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_a1_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_eq_a2(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int channel,
+					unsigned int band, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_a2_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_eq_b0(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int channel,
+					unsigned int band, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_b0_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_eq_b1(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int channel,
+					unsigned int band, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_b1_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_channel_eq_shift(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int channel,
+					unsigned int band, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_shift_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_enabled(struct axd_cmd *cmd,
+						unsigned int pipe, int enable)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	reg = axd_get_output_dcpp_control_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+	if (axd_read_reg(cmd, reg, &control))
+		return -1;
+
+	if (enable)
+		control |= AXD_DCPP_CTRL_SUBBAND_ENABLE_BITS;
+	else
+		control &= ~AXD_DCPP_CTRL_SUBBAND_ENABLE_BITS;
+
+	return axd_write_reg_buf(cmd, reg, enable);
+}
+
+int axd_cmd_output_set_dcpp_subband_delay_samples(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+
+	reg = axd_get_output_dcpp_channel_delay_samples_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_input_channel_mask(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int data)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	reg = axd_get_output_dcpp_control_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+	if (axd_read_reg(cmd, reg, &control))
+		return -1;
+
+	control &= ~AXD_DCPP_CTRL_SUBBAND_CHANNEL_MASK_BITS;
+	control |= data << AXD_DCPP_CTRL_SUBBAND_CHANNEL_MASK_SHIFT;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_eq_output_volume(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+
+	reg = axd_get_output_dcpp_channel_eq_output_volume_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_eq_passthrough_gain(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+
+	reg = axd_get_output_dcpp_channel_eq_passthrough_gain_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_eq_inverse_passthrough_gain(
+		struct axd_cmd *cmd, unsigned int pipe, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+
+	reg = axd_get_output_dcpp_channel_eq_inverse_passthrough_gain_reg(cmd,
+									pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_low_pass_filter_a0(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int data)
+{
+	unsigned int reg;
+
+	reg = axd_get_output_dcpp_subband_low_pass_filter_a0_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_low_pass_filter_a1(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int data)
+{
+	unsigned int reg;
+
+	reg = axd_get_output_dcpp_subband_low_pass_filter_a1_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_low_pass_filter_a2(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int data)
+{
+	unsigned int reg;
+
+	reg = axd_get_output_dcpp_subband_low_pass_filter_a2_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_low_pass_filter_b0(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int data)
+{
+	unsigned int reg;
+
+	reg = axd_get_output_dcpp_subband_low_pass_filter_b0_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_low_pass_filter_b1(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int data)
+{
+	unsigned int reg;
+
+	reg = axd_get_output_dcpp_subband_low_pass_filter_b1_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_eq_gain(struct axd_cmd *cmd,
+			unsigned int pipe, unsigned int band, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_gain_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_eq_a0(struct axd_cmd *cmd,
+			unsigned int pipe, unsigned int band, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_a0_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_eq_a1(struct axd_cmd *cmd,
+			unsigned int pipe, unsigned int band, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_a1_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_eq_a2(struct axd_cmd *cmd,
+			unsigned int pipe, unsigned int band, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_a2_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_eq_b0(struct axd_cmd *cmd,
+			unsigned int pipe, unsigned int band, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_b0_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_eq_b1(struct axd_cmd *cmd,
+			unsigned int pipe, unsigned int band, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_b1_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
+
+int axd_cmd_output_set_dcpp_subband_eq_shift(struct axd_cmd *cmd,
+			unsigned int pipe, unsigned int band, unsigned int data)
+{
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_shift_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return -1;
+
+	return axd_write_reg_buf(cmd, reg, data);
+}
diff --git a/drivers/char/axd/axd_cmds_decoder_config.c b/drivers/char/axd/axd_cmds_decoder_config.c
new file mode 100644
index 000000000000..4609b11bfcef
--- /dev/null
+++ b/drivers/char/axd/axd_cmds_decoder_config.c
@@ -0,0 +1,1806 @@
+/*
+ * Copyright (C) 2011-2014 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.
+ *
+ * AXD Commands API - Decoder Configuration functions
+ */
+#include "axd_cmds.h"
+#include "axd_cmds_codec_internal.h"
+#include "axd_cmds_internal.h"
+#include "axd_sysfs.h"
+
+/** PCM PASSTHROUGH (input) Config **/
+static void get_pcm_config(struct axd_cmd *cmd, unsigned int pipe,
+								char *config)
+{
+	unsigned int reg;
+	unsigned int data;
+	char str[32];
+
+	reg = axd_get_decoder_pcm_samplerate_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+
+	parse_pcm_samplerate(data, config);
+
+	reg = axd_get_decoder_pcm_channels_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_pcm_channels(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_pcm_bitspersample_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_pcm_bitspersample(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_pcm_justification_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_pcm_justification(data, str);
+	str_append(config, str);
+}
+
+static void set_pcm_config(struct axd_cmd *cmd, unsigned int pipe,
+							const char *config)
+{
+	unsigned int reg;
+	int data;
+
+	if (CMP_PARAM(config, PCM_SAMPLERATE_PARAM)) {
+		data = PARAM_VALUE(config, PCM_SAMPLERATE_PARAM);
+		switch (data) {
+		case 16000:
+		case 32000:
+		case 44100:
+		case 48000:
+		case 64000:
+		case 96000:
+			break;
+		default:
+			return;
+		}
+		reg = axd_get_decoder_pcm_samplerate_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, PCM_CHANNELS_PARAM)) {
+		data = PARAM_VALUE(config, PCM_CHANNELS_PARAM);
+		if (unlikely(data > 8 || data < 0))
+			return;
+		reg = axd_get_decoder_pcm_channels_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, PCM_BITSPERSAMPLE_PARAM)) {
+		data = PARAM_VALUE(config, PCM_BITSPERSAMPLE_PARAM);
+		switch (data) {
+		case 8:
+		case 16:
+		case 24:
+		case 32:
+			break;
+		default:
+			return;
+		}
+		reg = axd_get_decoder_pcm_bitspersample_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, PCM_JUSTIFICATION_PARAM)) {
+		data = PARAM_VALUE(config, PCM_JUSTIFICATION_PARAM);
+		if (unlikely(data > 1 || data < 0))
+			return;
+		reg = axd_get_decoder_pcm_justification_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	}
+}
+
+/** MPEG (2/3) Config **/
+static void parse_mpeg_numchannels(unsigned int numchannels, char *config)
+{
+	sprintf(config, "numchannels = %u\n", numchannels);
+}
+static void parse_mpeg_mlchannel(unsigned int mlchannel, char *config)
+{
+	sprintf(config, "mlchannel = %u\n", mlchannel);
+}
+static void get_mpeg_config(struct axd_cmd *cmd, unsigned int pipe,
+								char *config)
+{
+	unsigned int reg;
+	unsigned int data;
+	char str[32];
+
+	reg = axd_get_decoder_mpeg_numchannels_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_mpeg_numchannels(data, config);
+
+	reg = axd_get_decoder_mpeg_mlchannel_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_mpeg_mlchannel(data, str);
+	str_append(config, str);
+}
+
+static void set_mpeg_config(struct axd_cmd *cmd, unsigned int pipe,
+							const char *config)
+{
+#define MPEG_NUMCHANNELS_PARAM		"numchannels"
+#define MPEG_MLCHANNEL_PARAM		"mlchannel"
+	unsigned int reg;
+	int data;
+
+	if (CMP_PARAM(config, MPEG_NUMCHANNELS_PARAM)) {
+		data = PARAM_VALUE(config, MPEG_NUMCHANNELS_PARAM);
+		if (unlikely(data > 0xFF || data < 0))
+			return;
+		reg = axd_get_decoder_mpeg_numchannels_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, MPEG_MLCHANNEL_PARAM)) {
+		data = PARAM_VALUE(config, MPEG_MLCHANNEL_PARAM);
+		if (unlikely(data > 0xFF || data < 0))
+			return;
+		reg = axd_get_decoder_mpeg_mlchannel_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	}
+}
+
+/** Dolby AC3 Config **/
+static void parse_ac3_channels(unsigned int channels, char *config)
+{
+	sprintf(config, "channels = %u\n", channels);
+}
+
+static void
+parse_ac3_channel_order(unsigned int channels, char *config, size_t sz)
+{
+	static const char * const channel[] = {
+		"Left           (0)",
+		"Right          (1)",
+		"Centre         (2)",
+		"Left Surround  (3)",
+		"Right Surround (4)",
+		"L.F.E.         (5)"
+	};
+
+	snprintf(config, sz, "channel-order:\n"
+			"%s = %s\n"
+			"%s = %s\n"
+			"%s = %s\n"
+			"%s = %s\n"
+			"%s = %s\n"
+			"%s = %s\n",
+			channel[0],
+			channel[channels & 0xF],
+			channel[1],
+			channel[(channels >> 4) & 0xF],
+			channel[2],
+			channel[(channels >> 8) & 0xF],
+			channel[3],
+			channel[(channels >> 12) & 0xF],
+			channel[4],
+			channel[(channels >> 16) & 0xF],
+			channel[5],
+			channel[(channels >> 20) & 0xF]
+	);
+
+}
+
+static void parse_ac3_mode(unsigned int mode, char *config)
+{
+	static const char * const modestr[] = {
+		"0 = Dual Mono Mode",
+		"1 = C (1/0)",
+		"2 = L,R (2/0)",
+		"3 = L,C,R (3/0)",
+		"4 = L,R,S (2/1)",
+		"5 = L,C,R,S (3/1)",
+		"6 = L,R,SL,SR,(2/2)",
+		"7 = L,C,R,SL,SR,(3/2)"
+	};
+	static const char * const compmodestr[] = { "Line", "RF"};
+
+	sprintf(config, "mode = %s\n"
+			"compmode = %s\n",
+			modestr[mode&0xf],
+			compmodestr[mode >> 31]);
+}
+
+static void get_ac3_config(struct axd_cmd *cmd, unsigned int pipe,
+								char *config)
+{
+#undef BUFF_SIZE
+#define BUFF_SIZE 64
+
+	unsigned int reg;
+	unsigned int data;
+	char str[BUFF_SIZE];
+
+	reg = axd_get_decoder_ac3_channels_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_ac3_channels(data, config);
+
+	reg = axd_get_decoder_ac3_channel_order_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_ac3_channel_order(data, str, BUFF_SIZE);
+	str_append(config, str);
+
+	reg = axd_get_decoder_ac3_mode_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_ac3_mode(data, str);
+	str_append(config, str);
+}
+
+static void set_ac3_config(struct axd_cmd *cmd, unsigned int pipe,
+							const char *config)
+{
+#define AC3_CHANNELS_PARAM		"channels"
+#define AC3_CHANNEL_ORDER_PARAM		"channel-order"
+#define AC3_MODE_PARAM			"mode"
+#define AC3_COMPMODE_PARAM		"compmode"
+	unsigned int reg;
+	int data, temp[6];
+
+	if (CMP_PARAM(config, AC3_CHANNELS_PARAM)) {
+		data = PARAM_VALUE(config, AC3_CHANNELS_PARAM);
+		if (unlikely(data > 6 || data < 0))
+			return;
+		reg = axd_get_decoder_ac3_channels_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, AC3_CHANNEL_ORDER_PARAM)) {
+		sscanf(config, "channel-order=%d,%d,%d,%d,%d,%d",
+				&temp[0], &temp[1], &temp[2],
+				&temp[3], &temp[4], &temp[5]);
+		data =  ((temp[0] & 0xF) <<  0)	|
+			((temp[1] & 0xF) <<  4)	|
+			((temp[2] & 0xF) <<  8) |
+			((temp[3] & 0xF) << 12) |
+			((temp[4] & 0xF) << 16) |
+			((temp[5] & 0xF) << 20);
+		reg = axd_get_decoder_ac3_channel_order_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, AC3_MODE_PARAM)) {
+		temp[0] = PARAM_VALUE(config, AC3_MODE_PARAM);
+		if (unlikely(temp[0] > 7 || temp[0] < 0))
+			return;
+		reg = axd_get_decoder_ac3_mode_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &data))
+			return;
+		data &= ~0xF;
+		data |= temp[0] & 0xF;
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, AC3_COMPMODE_PARAM)) {
+		temp[0] = PARAM_VALUE(config, AC3_COMPMODE_PARAM);
+		if (unlikely(temp[0] > 1 || temp[0] < 0))
+			return;
+		reg = axd_get_decoder_ac3_mode_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &data))
+			return;
+		data &= ~0x80000000;
+		data |= (temp[0] & 0x1) << 31;
+		axd_write_reg(cmd, reg, data);
+	} }
+
+/** AAC Config **/
+static void parse_aac_version(unsigned int version, char *config)
+{
+#define AAC_VERSION_0_STR		"AAC Low Complexity"
+#define AAC_VERSION_1_STR		"MPEG4 LC"
+#define AAC_VERSION_2_STR		"MPEG4 HE"
+#define AAC_VERSION_3_STR		"MPEG4 DABPLUS"
+	const char *str;
+
+	switch (version) {
+	case 0:
+		str = AAC_VERSION_0_STR;
+		break;
+	case 1:
+		str = AAC_VERSION_1_STR;
+		break;
+	case 2:
+		str = AAC_VERSION_2_STR;
+		break;
+	case 3:
+		str = AAC_VERSION_3_STR;
+		break;
+	default:
+		return;
+	}
+	sprintf(config, "version = %s\n", str);
+}
+static void parse_aac_channels(unsigned int channels, char *config)
+{
+	sprintf(config, "channels = %u\n", channels);
+}
+static void parse_aac_profile(unsigned int profile, char *config)
+{
+#define AAC_PROFILE_0_STR		"Main Profile (MP)"
+#define AAC_PROFILE_1_STR		"Low Complexity (LC)"
+#define AAC_PROFILE_2_STR		"Scalable Sample Rate (SSR)"
+	const char *str;
+
+	switch (profile) {
+	case 0:
+		str = AAC_PROFILE_0_STR;
+		break;
+	case 1:
+		str = AAC_PROFILE_1_STR;
+		break;
+	case 2:
+		str = AAC_PROFILE_2_STR;
+		break;
+	default:
+		str = "Unknown";
+	}
+	sprintf(config, "profile = %s\n", str);
+}
+static void parse_aac_streamtype(unsigned int streamtype, char *config)
+{
+#define AAC_STREAMTYPE_0_STR		"Auto Detect"
+#define AAC_STREAMTYPE_1_STR		"ADTS"
+#define AAC_STREAMTYPE_2_STR		"ADIF"
+#define AAC_STREAMTYPE_3_STR		"RAW"
+	const char *str;
+
+	switch (streamtype) {
+	case 0:
+		str = AAC_STREAMTYPE_0_STR;
+		break;
+	case 1:
+		str = AAC_STREAMTYPE_1_STR;
+		break;
+	case 2:
+		str = AAC_STREAMTYPE_2_STR;
+		break;
+	case 3:
+		str = AAC_STREAMTYPE_3_STR;
+		break;
+	default:
+		str = "Unknown";
+	}
+	sprintf(config, "streamtype = %s\n", str);
+}
+
+static void parse_aac_samplerate(unsigned int samplerate, char *config)
+{
+	sprintf(config, "samplerate = %u\n", samplerate);
+}
+
+static void get_aac_config(struct axd_cmd *cmd, unsigned int pipe,
+								char *config)
+{
+	unsigned int reg;
+	unsigned int data;
+	char str[32];
+
+	reg = axd_get_decoder_aac_version_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_aac_version(data, config);
+
+	reg = axd_get_decoder_aac_channels_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_aac_channels(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_aac_profile_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_aac_profile(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_aac_streamtype_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_aac_streamtype(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_aac_samplerate_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_aac_samplerate(data, str);
+	str_append(config, str);
+}
+
+static void set_aac_config(struct axd_cmd *cmd, unsigned int pipe,
+							const char *config)
+{
+#define AAC_VERSION_PARAM		"version"
+#define AAC_CHANNELS_PARAM		"channels"
+#define AAC_PROFILE_PARAM		"profile"
+#define AAC_STREAMTYPE_PARAM		"streamtype"
+#define AAC_SAMPLERATE_PARAM		"samplerate"
+	unsigned int reg;
+	int data;
+
+	if (CMP_PARAM(config, AAC_VERSION_PARAM)) {
+		data = PARAM_VALUE(config, AAC_VERSION_PARAM);
+		if (unlikely(data > 3 || data < 0))
+			return;
+		reg = axd_get_decoder_aac_version_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, AAC_CHANNELS_PARAM)) {
+		data = PARAM_VALUE(config, AAC_CHANNELS_PARAM);
+		reg = axd_get_decoder_aac_channels_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, AAC_PROFILE_PARAM)) {
+		data = PARAM_VALUE(config, AAC_PROFILE_PARAM);
+		if (unlikely(data > 2 || data < 0))
+			return;
+		reg = axd_get_decoder_aac_profile_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, AAC_STREAMTYPE_PARAM)) {
+		data = PARAM_VALUE(config, AAC_STREAMTYPE_PARAM);
+		if (unlikely(data > 3 || data < 0))
+			return;
+		reg = axd_get_decoder_aac_streamtype_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, AAC_SAMPLERATE_PARAM)) {
+		data = PARAM_VALUE(config, AAC_SAMPLERATE_PARAM);
+		if (unlikely(data <= 0))
+			return;
+		reg = axd_get_decoder_aac_samplerate_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	}
+}
+
+/** Ogg Vorbis Config **/
+static void get_ogg_config(struct axd_cmd *cmd, unsigned int pipe,
+								char *config)
+{
+	strcpy(config, "Ogg Vorbis Config not supported\n");
+}
+
+static void set_ogg_config(struct axd_cmd *cmd, unsigned int pipe,
+							const char *config)
+{
+}
+
+/** FLAC Config **/
+static void parse_flac_channels(unsigned int channels, char *config)
+{
+	sprintf(config, "channels = %u\n", channels);
+}
+static void parse_flac_samplerate(unsigned int samplerate, char *config)
+{
+	sprintf(config, "samplerate = %u\n", samplerate);
+}
+static void parse_flac_bitspersample(unsigned int bitspersample, char *config)
+{
+	sprintf(config, "bitspersample = %u\n", bitspersample);
+}
+static void parse_flac_md5checking(unsigned int md5checking, char *config)
+{
+	sprintf(config, "md5checking = %u\n", md5checking);
+}
+static void get_flac_config(struct axd_cmd *cmd, unsigned int pipe,
+								char *config)
+{
+	unsigned int reg;
+	unsigned int data;
+	char str[32];
+
+	reg = axd_get_decoder_flac_channels_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_channels(data, config);
+
+	reg = axd_get_decoder_flac_samplerate_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_samplerate(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_flac_bitspersample_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_bitspersample(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_flac_md5checking_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_md5checking(data, str);
+	str_append(config, str);
+}
+
+static void set_flac_config(struct axd_cmd *cmd, unsigned int pipe,
+							const char *config)
+{
+#define FLAC_CHANNELS_PARAM		"channels"
+#define FLAC_SAMPLERATE_PARAM		"samplerate"
+#define FLAC_BITSPERSAMPLE_PARAM	"bitspersample"
+#define FLAC_MD5CHECKING_PARAM		"md5checking"
+	unsigned int reg;
+	int data;
+
+	if (CMP_PARAM(config, FLAC_CHANNELS_PARAM)) {
+		data = PARAM_VALUE(config, FLAC_CHANNELS_PARAM);
+		if (unlikely(data > 0x7 || data < 0))
+			return;
+		reg = axd_get_decoder_flac_channels_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, FLAC_SAMPLERATE_PARAM)) {
+		data = PARAM_VALUE(config, FLAC_SAMPLERATE_PARAM);
+		if (unlikely(data > 0xFFFFF || data < 0))
+			return;
+		reg = axd_get_decoder_flac_samplerate_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, FLAC_BITSPERSAMPLE_PARAM)) {
+		data = PARAM_VALUE(config, FLAC_BITSPERSAMPLE_PARAM);
+		if (unlikely(data > 0x3F || data < 0))
+			return;
+		reg = axd_get_decoder_flac_bitspersample_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, FLAC_MD5CHECKING_PARAM)) {
+		data = PARAM_VALUE(config, FLAC_MD5CHECKING_PARAM);
+		if (unlikely(data > 1 || data < 0))
+			return;
+		reg = axd_get_decoder_flac_md5checking_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	}
+}
+
+/** Cook Config **/
+static void parse_cook_flavour(unsigned int flavour, char *config)
+{
+	sprintf(config, "flavour = %d\n", flavour);
+}
+static void get_cook_config(struct axd_cmd *cmd, unsigned int pipe,
+								char *config)
+{
+	unsigned int reg;
+	unsigned int data;
+
+	reg = axd_get_decoder_cook_flavour_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_cook_flavour(data, config);
+}
+
+static void set_cook_config(struct axd_cmd *cmd, unsigned int pipe,
+							const char *config)
+{
+#define COOK_FLAVOUR_PARAM		"flavour"
+	unsigned int reg;
+	int data;
+
+	if (CMP_PARAM(config, COOK_FLAVOUR_PARAM)) {
+		data = PARAM_VALUE(config, COOK_FLAVOUR_PARAM);
+		if (unlikely(data > 29 || data < 0))
+			return;
+		reg = axd_get_decoder_cook_flavour_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	}
+}
+
+/** WMA Config **/
+static void parse_wma_playeropt(unsigned int playeropt, char *config)
+{
+	sprintf(config, "playeropt = 0x%04X\n", playeropt);
+}
+static void parse_wma_drcsetting(unsigned int drcsetting, char *config)
+{
+	sprintf(config, "drcsetting = %u\n", drcsetting);
+}
+static void parse_wma_peakampref(unsigned int peakampref, char *config)
+{
+	sprintf(config, "peakampref = %u\n", peakampref);
+}
+static void parse_wma_rmsampref(unsigned int rmsampref, char *config)
+{
+	sprintf(config, "rmsampref = %u\n", rmsampref);
+}
+static void parse_wma_peakamptarget(unsigned int peakamptarget, char *config)
+{
+	sprintf(config, "peakamptarget = %u\n", peakamptarget);
+}
+static void parse_wma_rmsamptarget(unsigned int rmsamptarget, char *config)
+{
+	sprintf(config, "rmsamptarget = %u\n", rmsamptarget);
+}
+static void parse_wma_pcmvalidbitspersample(unsigned int pcmvalidbitspersample,
+								char *config)
+{
+	sprintf(config, "pcmvalidbitspersample = %u\n", pcmvalidbitspersample);
+}
+static void parse_wma_pcmcontainersize(unsigned int pcmcontainersize,
+								char *config)
+{
+	sprintf(config, "pcmcontainersize = %u\n", pcmcontainersize);
+}
+static void parse_wma_wmaformattag(unsigned int wmaformattag, char *config)
+{
+#define WMAFORMATTAG_0x160_STR		"std V1"
+#define WMAFORMATTAG_0x161_STR		"std V2"
+#define WMAFORMATTAG_0x162_STR		"Pro"
+#define WMAFORMATTAG_0x163_STR		"Lossless"
+	char *str;
+
+	switch (wmaformattag) {
+	case 0x160:
+		str = WMAFORMATTAG_0x160_STR;
+		break;
+	case 0x161:
+		str = WMAFORMATTAG_0x161_STR;
+		break;
+	case 0x162:
+		str = WMAFORMATTAG_0x162_STR;
+		break;
+	case 0x163:
+		str = WMAFORMATTAG_0x163_STR;
+		break;
+	default:
+		return;
+
+	}
+	sprintf(config, "wmaformattag = %s\n", str);
+}
+static void parse_wma_wmanumchannels(unsigned int wmanumchannels, char *config)
+{
+	sprintf(config, "wmanumchannels = %u\n", wmanumchannels);
+}
+static void parse_wma_wmasamplespersec(unsigned int wmasamplespersec,
+								char *config)
+{
+	sprintf(config, "wmasamplespersec = %u\n", wmasamplespersec);
+}
+static void parse_wma_wmaaveragebytespersec(unsigned int wmaaveragebytespersec,
+								char *config)
+{
+	sprintf(config, "wmaaveragebytespersec = %u\n", wmaaveragebytespersec);
+}
+static void parse_wma_wmablockalign(unsigned int wmablockalign, char *config)
+{
+	sprintf(config, "wmablockalign = %u\n", wmablockalign);
+}
+static void parse_wma_wmavalidbitspersample(unsigned int wmavalidbitspersample,
+								char *config)
+{
+	sprintf(config, "wmavalidbitspersample = %u\n", wmavalidbitspersample);
+}
+static void parse_wma_wmachannelmask(unsigned int wmachannelmask, char *config)
+{
+	sprintf(config, "wmachannelmask = %u\n", wmachannelmask);
+}
+static void parse_wma_wmaencodeoptions(unsigned int wmaencodeoptions,
+								char *config)
+{
+	sprintf(config, "wmaencodeoptions = 0x%04X\n", wmaencodeoptions);
+}
+static void get_wma_config(struct axd_cmd *cmd, unsigned int pipe,
+								char *config)
+{
+	unsigned int reg;
+	unsigned int data;
+	char str[32];
+
+	reg = axd_get_decoder_wma_playeropt_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_playeropt(data, config);
+
+	reg = axd_get_decoder_wma_drcsetting_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_drcsetting(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_wma_peakampref_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_peakampref(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_wma_rmsampref_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_rmsampref(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_wma_peakamptarget_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_peakamptarget(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_wma_rmsamptarget_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_rmsamptarget(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_wma_pcmvalidbitspersample_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_pcmvalidbitspersample(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_wma_pcmcontainersize_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_pcmcontainersize(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_wma_wmaformattag_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_wmaformattag(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_wma_wmanumchannels_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_wmanumchannels(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_wma_wmasamplespersec_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_wmasamplespersec(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_wma_wmaaveragebytespersec_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_wmaaveragebytespersec(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_wma_wmablockalign_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_wmablockalign(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_wma_wmavalidbitspersample_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_wmavalidbitspersample(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_wma_wmachannelmask_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_wmachannelmask(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_wma_wmaencodeoptions_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_wma_wmaencodeoptions(data, str);
+	str_append(config, str);
+}
+
+static void set_wma_config(struct axd_cmd *cmd, unsigned int pipe,
+							const char *config)
+{
+#define WMA_PLAYEROPT_PARAM		"playeropt"
+#define WMA_DRCSETTING_PARAM		"drcsetting"
+#define WMA_PEAKAMPREF_PARAM		"peakampref"
+#define WMA_RMSAMPREF_PARAM		"rmsampref"
+#define WMA_PEAKAMPTARGET_PARAM		"peakamptarget"
+#define WMA_RMSAMPTARGET_PARAM		"rmsamptarget"
+#define WMA_PCMVALIDBITSPERSAMPLE_PARAM	"pcmvalidbitspersample"
+#define WMA_PCMCONTAINERSIZE_PARAM	"pcmcontainersize"
+#define WMA_WMAFORMATTAG_PARAM		"wmaformattag"
+#define WMA_WMANUMCHANNELS_PARAM	"wmanumchannels"
+#define WMA_WMASAMPLESPERSEC_PARAM	"wmasamplespersec"
+#define WMA_WMAAVERAGEBYTESPERSEC_PARAM	"wmaaveragebytespersec"
+#define WMA_WMABLOCKALIGN_PARAM		"wmablockalign"
+#define WMA_WMAVALIDBITSPERSAMPLE_PARAM	"wmavalidbitspersample"
+#define WMA_WMACHANNELMASK_PARAM	"wmachannelmask"
+#define WMA_WMAENCODEOPTIONS_PARAM	"wmaencodeoptions"
+	unsigned int reg;
+	int data;
+
+	if (CMP_PARAM(config, WMA_PLAYEROPT_PARAM)) {
+		data = PARAM_VALUE(config, WMA_PLAYEROPT_PARAM);
+		if (unlikely(data > 0xFFFF || data < 0))
+			return;
+		reg = axd_get_decoder_wma_playeropt_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, WMA_DRCSETTING_PARAM)) {
+		data = PARAM_VALUE(config, WMA_DRCSETTING_PARAM);
+		if (unlikely(data > 0xFFFFF || data < 0))
+			return;
+		reg = axd_get_decoder_wma_drcsetting_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, WMA_PEAKAMPREF_PARAM)) {
+		data = PARAM_VALUE(config, WMA_PEAKAMPREF_PARAM);
+		reg = axd_get_decoder_wma_peakampref_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, WMA_RMSAMPREF_PARAM)) {
+		data = PARAM_VALUE(config, WMA_RMSAMPREF_PARAM);
+		reg = axd_get_decoder_wma_rmsampref_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, WMA_PEAKAMPTARGET_PARAM)) {
+		data = PARAM_VALUE(config, WMA_PEAKAMPTARGET_PARAM);
+		reg = axd_get_decoder_wma_peakamptarget_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, WMA_RMSAMPTARGET_PARAM)) {
+		data = PARAM_VALUE(config, WMA_RMSAMPTARGET_PARAM);
+		reg = axd_get_decoder_wma_rmsamptarget_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, WMA_PCMVALIDBITSPERSAMPLE_PARAM)) {
+		data = PARAM_VALUE(config, WMA_PCMVALIDBITSPERSAMPLE_PARAM);
+		reg = axd_get_decoder_wma_pcmvalidbitspersample_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, WMA_PCMCONTAINERSIZE_PARAM)) {
+		data = PARAM_VALUE(config, WMA_PCMCONTAINERSIZE_PARAM);
+		reg = axd_get_decoder_wma_pcmcontainersize_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, WMA_WMAFORMATTAG_PARAM)) {
+		data = PARAM_VALUE(config, WMA_WMAFORMATTAG_PARAM);
+		if (unlikely(data > 0xFFFFF || data < 0))
+			return;
+		reg = axd_get_decoder_wma_wmaformattag_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, WMA_WMANUMCHANNELS_PARAM)) {
+		data = PARAM_VALUE(config, WMA_WMANUMCHANNELS_PARAM);
+		if (unlikely(data > 0xFFFFF || data < 0))
+			return;
+		reg = axd_get_decoder_wma_wmanumchannels_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, WMA_WMASAMPLESPERSEC_PARAM)) {
+		data = PARAM_VALUE(config, WMA_WMASAMPLESPERSEC_PARAM);
+		reg = axd_get_decoder_wma_wmasamplespersec_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, WMA_WMAAVERAGEBYTESPERSEC_PARAM)) {
+		data = PARAM_VALUE(config, WMA_WMAAVERAGEBYTESPERSEC_PARAM);
+		reg = axd_get_decoder_wma_wmaaveragebytespersec_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, WMA_WMABLOCKALIGN_PARAM)) {
+		data = PARAM_VALUE(config, WMA_WMABLOCKALIGN_PARAM);
+		if (unlikely(data > 0xFFFFF || data < 0))
+			return;
+		reg = axd_get_decoder_wma_wmablockalign_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, WMA_WMAVALIDBITSPERSAMPLE_PARAM)) {
+		data = PARAM_VALUE(config, WMA_WMAVALIDBITSPERSAMPLE_PARAM);
+		if (unlikely(data > 0xFFFFF || data < 0))
+			return;
+		reg = axd_get_decoder_wma_wmavalidbitspersample_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, WMA_WMACHANNELMASK_PARAM)) {
+		data = PARAM_VALUE(config, WMA_WMACHANNELMASK_PARAM);
+		reg = axd_get_decoder_wma_wmachannelmask_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, WMA_WMAENCODEOPTIONS_PARAM)) {
+		data = PARAM_VALUE(config, WMA_WMAENCODEOPTIONS_PARAM);
+		if (unlikely(data > 0xFFFFF || data < 0))
+			return;
+		reg = axd_get_decoder_wma_wmaencodeoptions_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	}
+}
+
+
+
+/** DDplus Config **/
+
+static void parse_ddplus_config(unsigned int configreg, char *config)
+{
+	static const char * const dectype[] = {
+		"0 = Reserved",
+		"1 = DCV(5.1)",
+		"2 = DEC7.1"
+	};
+	static const char * const output[] = {"0 = PCM", "1 = AC3"};
+
+	sprintf(config,	"DecoderType = %s\n"
+			"Output = %s\n"
+			"OutNChans = %d\n",
+			dectype[configreg & 0x3],
+			output[(configreg & 0x10) >> 4],
+			(configreg >> 8) & 0xFF
+	);
+}
+
+static void
+parse_ddplus_channel_order(unsigned int channels, char *config, size_t sz)
+{
+	static const char * const channel[] = {
+		"Front Left      (0)",
+		"Centre          (1)",
+		"Front Right     (2)",
+		"Left Surround   (3)",
+		"Right Surround  (4)",
+		"L.F.E.          (5)",
+		"Surround Back L (6)",
+		"Surround Back R (7)"
+	};
+
+	snprintf(config, sz, "channel-order:\n"
+			"%s = %s\n"
+			"%s = %s\n"
+			"%s = %s\n"
+			"%s = %s\n"
+			"%s = %s\n"
+			"%s = %s\n"
+			"%s = %s\n"
+			"%s = %s\n",
+			channel[0],
+			channel[channels & 0xF],
+			channel[1],
+			channel[(channels >> 4) & 0xF],
+			channel[2],
+			channel[(channels >> 8) & 0xF],
+			channel[3],
+			channel[(channels >> 12) & 0xF],
+			channel[4],
+			channel[(channels >> 16) & 0xF],
+			channel[5],
+			channel[(channels >> 20) & 0xF],
+			channel[6],
+			channel[(channels >> 24) & 0xF],
+			channel[7],
+			channel[(channels >> 28) & 0xF]
+	);
+}
+
+static void get_ddplus_config(struct axd_cmd *cmd, unsigned int pipe,
+								char *config)
+{
+#undef BUFF_SIZE
+#define BUFF_SIZE 512
+	unsigned int reg;
+	unsigned int data;
+	char str[BUFF_SIZE];
+
+	reg = axd_get_decoder_ddplus_config_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_ddplus_config(data, config);
+
+	reg = axd_get_decoder_ddplus_channel_order_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_ddplus_channel_order(data, str, BUFF_SIZE);
+	str_append(config, str);
+
+}
+
+static void set_ddplus_config(struct axd_cmd *cmd, unsigned int pipe,
+							const char *config)
+{
+#define DDP_DECTYPE_PARAM		"DecoderType"
+#define DDP_OUTPUT_PARAM		"Output"
+#define DDP_CHANNEL_ORDER_PARAM		"channel-order"
+#define DDP_OUTNCHANS_PARAM		"OutNChans"
+
+	unsigned int reg;
+	int data, temp[8];
+
+	if (CMP_PARAM(config, DDP_DECTYPE_PARAM)) {
+		temp[0] = PARAM_VALUE(config, DDP_DECTYPE_PARAM);
+		if (unlikely(temp[0] > 2 || temp[0] < 0))
+			return;
+		reg = axd_get_decoder_ddplus_config_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &data))
+			return;
+		data &= ~0x3;
+		data |= temp[0] & 0x3;
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, DDP_OUTPUT_PARAM)) {
+		temp[0] = PARAM_VALUE(config, DDP_OUTPUT_PARAM);
+		if (unlikely(temp[0] > 1 || temp[0] < 0))
+			return;
+		reg = axd_get_decoder_ddplus_config_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &data))
+			return;
+
+		data &= ~0x10;
+		data |= (temp[0] << 4) & 0x10;
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, DDP_CHANNEL_ORDER_PARAM)) {
+		sscanf(config, "channel-order=%d,%d,%d,%d,%d,%d,%d,%d",
+				&temp[0], &temp[1], &temp[2], &temp[3],
+				&temp[4], &temp[5], &temp[6], &temp[7]);
+		data =  ((temp[0] & 0xF) <<  0)	|
+			((temp[1] & 0xF) <<  4) |
+			((temp[2] & 0xF) <<  8) |
+			((temp[3] & 0xF) << 12) |
+			((temp[4] & 0xF) << 16) |
+			((temp[5] & 0xF) << 20) |
+			((temp[6] & 0xF) << 24) |
+			((temp[7] & 0xF) << 28);
+		reg = axd_get_decoder_ddplus_channel_order_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, DDP_OUTNCHANS_PARAM)) {
+		temp[0] = PARAM_VALUE(config, DDP_OUTNCHANS_PARAM);
+		if (unlikely(temp[0] > 8 || temp[0] < 0))
+			return;
+		reg = axd_get_decoder_ddplus_config_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &data))
+			return;
+		data &= ~0xFF00;
+		data |= (temp[0] << 8);
+		axd_write_reg(cmd, reg, data);
+	}
+}
+
+/** ALAC Config **/
+static void parse_alac_channels(uint8_t numchannels, char *config)
+{
+	sprintf(config, "channels = %u\n", numchannels);
+}
+static void parse_alac_depth(uint8_t bitdepth, char *config)
+{
+	sprintf(config, "depth = %u\n", bitdepth);
+}
+static void parse_alac_samplerate(uint32_t samplerate, char *config)
+{
+	sprintf(config, "samplerate = %u\n", samplerate);
+}
+static void parse_alac_framelength(uint32_t framelength, char *config)
+{
+	sprintf(config, "framelength = %u\n", framelength);
+}
+static void parse_alac_maxframebytes(uint32_t maxframebytes, char *config)
+{
+	sprintf(config, "maxframebytes = %u\n", maxframebytes);
+}
+static void parse_alac_avgbitrate(uint32_t avgbitrate, char *config)
+{
+	sprintf(config, "avgbitrate = %u\n", avgbitrate);
+}
+static void get_alac_config(struct axd_cmd *cmd,
+					unsigned int pipe, char *config)
+{
+	unsigned int reg;
+	unsigned int data;
+	char str[32];
+
+	reg = axd_get_decoder_alac_channels_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_alac_channels(data, config);
+
+	reg = axd_get_decoder_alac_depth_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_alac_depth(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_alac_samplerate_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_alac_samplerate(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_alac_framelength_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_alac_framelength(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_alac_maxframebytes_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_alac_maxframebytes(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_alac_avgbitrate_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_alac_avgbitrate(data, str);
+	str_append(config, str);
+}
+static void set_alac_config(struct axd_cmd *cmd, unsigned int pipe,
+							const char *config)
+{
+#define ALAC_CHANNELS_PARAM		"channels"
+#define ALAC_DEPTH_PARAM		"depth"
+#define ALAC_SAMPLERATE_PARAM		"samplerate"
+#define ALAC_FRAMELENGTH_PARAM		"framelength"
+#define ALAC_MAXFRAMEBYTES_PARAM	"maxframebytes"
+#define ALAC_AVGBITRATE_PARAM		"avgbitrate"
+
+	unsigned int reg;
+	int data;
+
+	if (CMP_PARAM(config, ALAC_CHANNELS_PARAM)) {
+		data = PARAM_VALUE(config, ALAC_CHANNELS_PARAM);
+		switch (data) {
+		case 1:
+		case 2:
+			/* TSTODO Add multichannel support if we can. */
+			break;
+		default:
+			return;
+		}
+		reg = axd_get_decoder_alac_channels_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, ALAC_DEPTH_PARAM)) {
+		data = PARAM_VALUE(config, ALAC_DEPTH_PARAM);
+		switch (data) {
+		case 16:
+		case 20: /* TSTODO test vectors for this */
+		case 24:
+		case 32:
+			break;
+		default:
+			return;
+		}
+		reg = axd_get_decoder_alac_depth_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, ALAC_SAMPLERATE_PARAM)) {
+		data = PARAM_VALUE(config, ALAC_SAMPLERATE_PARAM);
+		reg = axd_get_decoder_alac_samplerate_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, ALAC_FRAMELENGTH_PARAM)) {
+		data = PARAM_VALUE(config, ALAC_FRAMELENGTH_PARAM);
+		/* TSTODO sanitize */
+		reg = axd_get_decoder_alac_framelength_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, ALAC_MAXFRAMEBYTES_PARAM)) {
+		data = PARAM_VALUE(config, ALAC_MAXFRAMEBYTES_PARAM);
+		/* TSTODO sanitize */
+		reg = axd_get_decoder_alac_maxframebytes_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, ALAC_AVGBITRATE_PARAM)) {
+		data = PARAM_VALUE(config, ALAC_AVGBITRATE_PARAM);
+		/* TSTODO sanitize */
+		reg = axd_get_decoder_alac_avgbitrate_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	}
+}
+
+/** SBC Config **/
+static void parse_sbc_samplerate(uint8_t samplerate, char *config)
+{
+	sprintf(config, "samplerate = %u\n", samplerate);
+}
+static void parse_sbc_audiomode(uint8_t audiomode, char *config)
+{
+	sprintf(config, "audiomode = %u\n", audiomode);
+}
+static void parse_sbc_blocks(uint8_t blocks, char *config)
+{
+	sprintf(config, "blocks = %u\n", blocks);
+}
+static void parse_sbc_subbands(uint8_t subbands, char *config)
+{
+	sprintf(config, "subbands = %u\n", subbands);
+}
+static void parse_sbc_bitpool(uint8_t bitpool, char *config)
+{
+	sprintf(config, "bitpool = %u\n", bitpool);
+}
+static void parse_sbc_allocationmode(uint8_t allocationmode, char *config)
+{
+	sprintf(config, "allocationmode = %u\n", allocationmode);
+}
+static void get_sbc_config(struct axd_cmd *cmd, unsigned int pipe, char *config)
+{
+	unsigned int reg;
+	unsigned int data;
+	char str[32];
+
+	reg = axd_get_decoder_sbc_samplerate_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_sbc_samplerate(data, config);
+
+	reg = axd_get_decoder_sbc_audiomode_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_sbc_audiomode(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_sbc_blocks_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_sbc_blocks(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_sbc_subbands_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_sbc_subbands(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_sbc_bitpool_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_sbc_bitpool(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_sbc_allocationmode_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_sbc_allocationmode(data, str);
+	str_append(config, str);
+}
+
+/** MS11 Config **/
+static void parse_ms11_mode(uint32_t mode, char *config)
+{
+	static const char * const typestr[] = {
+		"DDC",
+		"DDT",
+		"External PCM"
+	};
+	int input_type = (mode >> 0) & 0x3;
+	int dual_input = (mode >> 2) & 0x1;
+	int dolby_volume_258 = (mode >> 3) & 0x1;
+	int ms10_mode = (mode >> 4) & 0x1;
+	int main_only = (mode >> 5) & 0x1;
+
+	sprintf(config, "input_type = %s\n"
+			"dual_input = %d\n"
+			"dolby_volume_258 = %d\n"
+			"ms10_mode = %d\n"
+			"main_only = %d\n",
+		typestr[input_type], dual_input, dolby_volume_258,
+		ms10_mode, main_only);
+}
+static void parse_ms11_common_config0(uint32_t common_config0, char *config)
+{
+	int drc_cut_fac_6ch = (common_config0 >> 0) & 0xFF;
+	int drc_boost_fac_6ch = (common_config0 >> 8) & 0xFF;
+	int drc_cut_fac_2ch = (common_config0 >> 16) & 0xFF;
+	int drc_boost_fac_2ch = (common_config0 >> 24) & 0xFF;
+
+	sprintf(config, "drc_cut_fac_6ch = %d\n"
+			"drc_boost_fac_6ch = %d\n"
+			"drc_cut_fac_2ch = %d\n"
+			"drc_boost_fac_2ch = %d\n",
+		drc_cut_fac_6ch, drc_boost_fac_6ch,
+		drc_cut_fac_2ch, drc_boost_fac_2ch);
+}
+static void parse_ms11_common_config1(uint32_t common_config1, char *config)
+{
+	int downmix_type = (common_config1 >> 0) & 0x3;
+	char *drc_mode = (common_config1 & 0x4) ? "RF mode" : "Line mode";
+	int dual_mono = (common_config1 >> 3) & 0x3;
+	int output_multichannel_enable = (common_config1 >> 5) & 0x1;
+	int associated_audio_mixing = (common_config1 >> 6) & 0x1;
+	int16_t user_balance_adjustment = (common_config1 >> 16) & 0xFFFF;
+
+	sprintf(config, "downmixtype = %d\n"
+			"drc_mode = %s\n"
+			"dual_mono = %d\n"
+			"output_multichannel_enable = %d\n"
+			"associated_audio_mixing = %d\n"
+			"user_balance_adjustment = %d\n",
+		downmix_type, drc_mode, dual_mono, output_multichannel_enable,
+		associated_audio_mixing, user_balance_adjustment);
+}
+static void parse_ms11_ddt_config0(uint32_t ddt_config0, char *config)
+{
+	int ddt_default_dialnorm = (ddt_config0 >> 0) & 0xFF;
+	int ddt_transport_format = (ddt_config0 >> 8) & 0xFF;
+	int ddt_mixing_mode = (ddt_config0 >> 16) & 0x1;
+
+	sprintf(config, "ddt_default_dialnorm = %d\n"
+			"ddt_transport_format = %d\n"
+			"ddt_mixing_mode = %d\n",
+		ddt_default_dialnorm, ddt_transport_format, ddt_mixing_mode);
+}
+static void parse_ms11_ddc_config0(uint32_t ddc_config0, char *config)
+{
+	int ddc_associated_substream = (ddc_config0 >> 0) & 0xFF;
+	int ddc_out_mode = (ddc_config0 >> 8) & 0xFF;
+	int ddc_out_lfe = (ddc_config0 >> 16) & 0x1;
+
+	sprintf(config, "ddc_associated_substream = %d\n"
+			"ddc_out_mode = %d\n"
+			"ddc_out_lfe = %d\n",
+		ddc_associated_substream, ddc_out_mode, ddc_out_lfe);
+}
+static void parse_ms11_ext_pcm_config0(uint32_t ext_pcm_config0, char *config)
+{
+	int ext_pcm_number_in_samples = (ext_pcm_config0 >> 0) & 0xFFFF;
+	int ext_pcm_audio_coding_mode = (ext_pcm_config0 >> 16) & 0x3;
+	int ext_pcm_lfe_present = (ext_pcm_config0 >> 18) & 0x1;
+	int ext_pcm_dsur_mode = (ext_pcm_config0 >> 19) & 0x1;
+
+	sprintf(config, "ext_pcm_number_in_samples = %d\n"
+			"ext_pcm_audio_coding_mode = %d\n"
+			"ext_pcm_lfe_present = %d\n"
+			"ext_pcm_dsur_mode = %d\n",
+		ext_pcm_number_in_samples, ext_pcm_audio_coding_mode,
+		ext_pcm_lfe_present, ext_pcm_dsur_mode);
+}
+static void get_ms11_config(struct axd_cmd *cmd,
+					unsigned int pipe, char *config)
+{
+	unsigned int reg;
+	unsigned int data;
+	unsigned int input_type;
+	char str[164];
+
+	reg = axd_get_decoder_ms11_mode_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_ms11_mode(data, config);
+
+	input_type = data & 0x3;
+
+	reg = axd_get_decoder_ms11_common_config0_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_ms11_common_config0(data, str);
+	str_append(config, str);
+
+	reg = axd_get_decoder_ms11_common_config1_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_ms11_common_config1(data, str);
+	str_append(config, str);
+
+	switch (input_type) {
+	case 0: /* DDC */
+		reg = axd_get_decoder_ms11_ddc_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &data)) {
+			print_timeout_msg(config);
+			return;
+		}
+		parse_ms11_ddc_config0(data, str);
+		str_append(config, str);
+		break;
+	case 1: /* DDT */
+		reg = axd_get_decoder_ms11_ddt_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &data)) {
+			print_timeout_msg(config);
+			return;
+		}
+		parse_ms11_ddt_config0(data, str);
+		str_append(config, str);
+		break;
+	case 2: /* EXTERNAL PCM */
+		reg = axd_get_decoder_ms11_ext_pcm_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &data)) {
+			print_timeout_msg(config);
+			return;
+		}
+		parse_ms11_ext_pcm_config0(data, str);
+		str_append(config, str);
+		break;
+	default:
+		return;
+	}
+}
+static void set_ms11_config(struct axd_cmd *cmd, unsigned int pipe,
+							const char *config)
+{
+#define MS11_INPUT_TYPE_PARAM			"input_type"
+#define MS11_DUAL_INPUT_PARAM			"dual_input"
+#define MS11_DOLBY_VOLUME_258_PARAM		"dolby_volume_258"
+#define MS11_MS10_MODE_PARAM			"ms10_mode"
+#define MS11_MAIN_ONLY_PARAM			"main_only"
+#define MS11_DRC_CUT_FAC_6CH_PARAM		"drc_cut_fac_6ch"
+#define MS11_DRC_BOOST_FAC_6CH_PARAM		"drc_boost_fac_6ch"
+#define MS11_DRC_CUT_FAC_2CH_PARAM		"drc_cut_fac_2ch"
+#define MS11_DRC_BOOST_FAC_2CH_PARAM		"drc_boost_fac_2ch"
+#define MS11_DOWNMIX_TYPE_PARAM			"downmix_type"
+#define MS11_DRC_MODE_PARAM			"drc_mode"
+#define MS11_DUAL_MONO_PARAM			"dual_mono"
+#define MS11_OUTPUT_MULTICHANNEL_ENABLE_PARAM	"output_multichannel_enable"
+#define MS11_ASSOCIATED_AUDIO_MIXING_PARAM	"associated_audio_mixing"
+#define MS11_USER_BALANCE_ADJUSTMENT_PARAM	"user_balance_adjustment"
+#define MS11_DDT_DEFAULT_DIALNORM_PARAM		"ddt_default_dialnorm"
+#define MS11_DDT_TRANSPORT_FORMAT_PARAM		"ddt_transport_format"
+#define MS11_DDT_MIXING_MODE_PARAM		"ddt_mixing_mode"
+#define MS11_DDC_ASSOCIATED_SUBSTREAM_PARAM	"ddc_associated_substream"
+#define MS11_DDC_OUT_MODE_PARAM			"ddc_out_mode"
+#define MS11_DDC_OUT_LFE_PARAM			"ddc_out_lfe"
+#define MS11_EXT_PCM_NUMBER_IN_SAMPLES_PARAM	"ext_pcm_number_in_samples"
+#define MS11_EXT_PCM_AUDIO_CODING_MODE_PARAM	"ext_pcm_audio_coding_mode"
+#define MS11_EXT_PCM_LFE_PRESENT_PARAM		"ext_pcm_lfe_present"
+#define MS11_EXT_PCM_DOLBY_SURROUND_MODE_PARAM	"ext_pcm_dsur_mode"
+
+	unsigned int reg;
+	int data;
+	int temp = 0;
+
+	if (CMP_PARAM(config, MS11_INPUT_TYPE_PARAM)) {
+		data = PARAM_VALUE(config, MS11_INPUT_TYPE_PARAM);
+		reg = axd_get_decoder_ms11_mode_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0x3 << 0);
+		temp |= (data & 0x3) << 0;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_DUAL_INPUT_PARAM)) {
+		data = PARAM_VALUE(config, MS11_DUAL_INPUT_PARAM);
+		reg = axd_get_decoder_ms11_mode_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0x1 << 2);
+		temp |= (!!data) << 2;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_DOLBY_VOLUME_258_PARAM)) {
+		data = PARAM_VALUE(config, MS11_DOLBY_VOLUME_258_PARAM);
+		reg = axd_get_decoder_ms11_mode_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0x1 << 3);
+		temp |= (!!data) << 3;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_MS10_MODE_PARAM)) {
+		data = PARAM_VALUE(config, MS11_MS10_MODE_PARAM);
+		reg = axd_get_decoder_ms11_mode_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0x1 << 4);
+		temp |= (!!data) << 4;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_MAIN_ONLY_PARAM)) {
+		data = PARAM_VALUE(config, MS11_MAIN_ONLY_PARAM);
+		reg = axd_get_decoder_ms11_mode_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0x1 << 5);
+		temp |= (!!data) << 5;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_DRC_CUT_FAC_6CH_PARAM)) {
+		data = PARAM_VALUE(config, MS11_DRC_CUT_FAC_6CH_PARAM);
+		reg = axd_get_decoder_ms11_common_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0xFF << 0);
+		temp |= (data & 0xFF) << 0;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_DRC_BOOST_FAC_6CH_PARAM)) {
+		data = PARAM_VALUE(config, MS11_DRC_BOOST_FAC_6CH_PARAM);
+		reg = axd_get_decoder_ms11_common_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0xFF << 8);
+		temp |= (data & 0xFF) << 8;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_DRC_CUT_FAC_2CH_PARAM)) {
+		data = PARAM_VALUE(config, MS11_DRC_CUT_FAC_2CH_PARAM);
+		reg = axd_get_decoder_ms11_common_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0xFF << 16);
+		temp |= (data & 0xFF) << 16;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_DRC_BOOST_FAC_2CH_PARAM)) {
+		data = PARAM_VALUE(config, MS11_DRC_BOOST_FAC_2CH_PARAM);
+		reg = axd_get_decoder_ms11_common_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0xFF << 24);
+		temp |= (data & 0xFF) << 24;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_DOWNMIX_TYPE_PARAM)) {
+		data = PARAM_VALUE(config, MS11_DOWNMIX_TYPE_PARAM);
+		reg = axd_get_decoder_ms11_common_config1_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0x3 << 0);
+		temp |= (data & 0x3) << 0;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_DRC_MODE_PARAM)) {
+		data = PARAM_VALUE(config, MS11_DRC_MODE_PARAM);
+		reg = axd_get_decoder_ms11_common_config1_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0x1 << 2);
+		temp |= (!!data) << 2;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_DUAL_MONO_PARAM)) {
+		data = PARAM_VALUE(config, MS11_DUAL_MONO_PARAM);
+		reg = axd_get_decoder_ms11_common_config1_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0x3 << 3);
+		temp |= (data & 0x3) << 3;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_OUTPUT_MULTICHANNEL_ENABLE_PARAM)) {
+		data = PARAM_VALUE(config,
+					MS11_OUTPUT_MULTICHANNEL_ENABLE_PARAM);
+		reg = axd_get_decoder_ms11_common_config1_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0x1 << 5);
+		temp |= (!!data) << 5;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_ASSOCIATED_AUDIO_MIXING_PARAM)) {
+		data = PARAM_VALUE(config, MS11_ASSOCIATED_AUDIO_MIXING_PARAM);
+		reg = axd_get_decoder_ms11_common_config1_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0x1 << 6);
+		temp |= (!!data) << 6;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_USER_BALANCE_ADJUSTMENT_PARAM)) {
+		data = PARAM_VALUE(config, MS11_USER_BALANCE_ADJUSTMENT_PARAM);
+		reg = axd_get_decoder_ms11_common_config1_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0xFFFF << 16);
+		temp |= (data & 0xFFFF) << 16;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_DDT_DEFAULT_DIALNORM_PARAM)) {
+		data = PARAM_VALUE(config, MS11_DDT_DEFAULT_DIALNORM_PARAM);
+		reg = axd_get_decoder_ms11_ddt_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0xFF << 0);
+		temp |= (data & 0xFF) << 0;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_DDT_TRANSPORT_FORMAT_PARAM)) {
+		data = PARAM_VALUE(config, MS11_DDT_TRANSPORT_FORMAT_PARAM);
+		reg = axd_get_decoder_ms11_ddt_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0xFF << 8);
+		temp |= (data & 0xFF) << 8;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_DDT_MIXING_MODE_PARAM)) {
+		data = PARAM_VALUE(config, MS11_DDT_MIXING_MODE_PARAM);
+		reg = axd_get_decoder_ms11_ddt_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0x1 << 16);
+		temp |= (!!data) << 16;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_DDC_ASSOCIATED_SUBSTREAM_PARAM)) {
+		data = PARAM_VALUE(config, MS11_DDC_ASSOCIATED_SUBSTREAM_PARAM);
+		reg = axd_get_decoder_ms11_ddc_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0xFF << 0);
+		temp |= (data & 0xFF) << 0;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_DDC_OUT_MODE_PARAM)) {
+		data = PARAM_VALUE(config, MS11_DDC_OUT_MODE_PARAM);
+		reg = axd_get_decoder_ms11_ddc_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0xFF << 8);
+		temp |= (data & 0xFF) << 8;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_DDC_OUT_LFE_PARAM)) {
+		data = PARAM_VALUE(config, MS11_DDC_OUT_LFE_PARAM);
+		reg = axd_get_decoder_ms11_ddc_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0x1 << 16);
+		temp |= (!!data) << 16;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_EXT_PCM_NUMBER_IN_SAMPLES_PARAM)) {
+		data = PARAM_VALUE(config,
+					MS11_EXT_PCM_NUMBER_IN_SAMPLES_PARAM);
+		reg = axd_get_decoder_ms11_ext_pcm_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0xFFFF << 0);
+		temp |= (data & 0xFFFF) << 0;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_EXT_PCM_AUDIO_CODING_MODE_PARAM)) {
+		data = PARAM_VALUE(config,
+					MS11_EXT_PCM_AUDIO_CODING_MODE_PARAM);
+		reg = axd_get_decoder_ms11_ext_pcm_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0x3 << 16);
+		temp |= (data & 0x3) << 16;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_EXT_PCM_LFE_PRESENT_PARAM)) {
+		data = PARAM_VALUE(config, MS11_EXT_PCM_LFE_PRESENT_PARAM);
+		reg = axd_get_decoder_ms11_ext_pcm_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0x1 << 18);
+		temp |= (!!data) << 18;
+		axd_write_reg(cmd, reg, temp);
+	} else if (CMP_PARAM(config, MS11_EXT_PCM_DOLBY_SURROUND_MODE_PARAM)) {
+		data = PARAM_VALUE(config,
+					MS11_EXT_PCM_DOLBY_SURROUND_MODE_PARAM);
+		reg = axd_get_decoder_ms11_ext_pcm_config0_reg(cmd, pipe);
+		if (axd_read_reg(cmd, reg, &temp))
+			return;
+		temp &= ~(0x1 << 19);
+		temp |= (!!data) << 19;
+		axd_write_reg(cmd, reg, temp);
+	}
+}
+
+void axd_cmd_input_get_decoder_config(struct axd_cmd *cmd, unsigned int pipe,
+								char *config)
+{
+	unsigned int codec = axd_get_input_codec_number(cmd, pipe);
+
+	switch (codec) {
+	case 0:
+		get_pcm_config(cmd, pipe, config);
+		return;
+	case 1:
+		get_mpeg_config(cmd, pipe, config);
+		return;
+	case 2:
+		get_ac3_config(cmd, pipe, config);
+		return;
+	case 3:
+		get_aac_config(cmd, pipe, config);
+		return;
+	case 4:
+		get_ogg_config(cmd, pipe, config);
+		return;
+	case 5:
+		get_flac_config(cmd, pipe, config);
+		return;
+	case 6:
+		get_cook_config(cmd, pipe, config);
+		return;
+	case 7:
+		get_wma_config(cmd, pipe, config);
+		return;
+	case 8:
+		get_ddplus_config(cmd, pipe, config);
+		return;
+	case 11:
+		get_alac_config(cmd, pipe, config);
+		return;
+	case 12:
+		get_ms11_config(cmd, pipe, config);
+		return;
+	case 13:
+		get_sbc_config(cmd, pipe, config);
+		return;
+	default:
+		*config = '\0';
+		return;
+	}
+}
+
+void axd_cmd_input_set_decoder_config(struct axd_cmd *cmd, unsigned int pipe,
+							const char *config)
+{
+	unsigned int codec = axd_get_input_codec_number(cmd, pipe);
+
+	switch (codec) {
+	default:
+	case 0:
+		set_pcm_config(cmd, pipe, config);
+		return;
+	case 1:
+		set_mpeg_config(cmd, pipe, config);
+		return;
+	case 2:
+		set_ac3_config(cmd, pipe, config);
+		return;
+	case 3:
+		set_aac_config(cmd, pipe, config);
+		return;
+	case 4:
+		set_ogg_config(cmd, pipe, config);
+		return;
+	case 5:
+		set_flac_config(cmd, pipe, config);
+		return;
+	case 6:
+		set_cook_config(cmd, pipe, config);
+		return;
+	case 7:
+		set_wma_config(cmd, pipe, config);
+		return;
+	case 8:
+		set_ddplus_config(cmd, pipe, config);
+		return;
+	case 11:
+		set_alac_config(cmd, pipe, config);
+		return;
+	case 12:
+		set_ms11_config(cmd, pipe, config);
+		return;
+	case 13:
+		/* No configuration needed; autoconfigured by stream */
+		return;
+	}
+}
diff --git a/drivers/char/axd/axd_cmds_encoder_config.c b/drivers/char/axd/axd_cmds_encoder_config.c
new file mode 100644
index 000000000000..04f8ca258f2f
--- /dev/null
+++ b/drivers/char/axd/axd_cmds_encoder_config.c
@@ -0,0 +1,519 @@
+/*
+ * Copyright (C) 2011-2014 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.
+ *
+ * AXD Commands API - Encoder Configuration functions
+ */
+#include "axd_cmds.h"
+#include "axd_cmds_internal.h"
+#include "axd_cmds_codec_internal.h"
+#include "axd_sysfs.h"
+
+static void set_pcm_config(struct axd_cmd *cmd,
+					unsigned int pipe, const char *config)
+{
+	unsigned int reg;
+	int data;
+
+	if (CMP_PARAM(config, PCM_BITSPERSAMPLE_PARAM)) {
+		data = PARAM_VALUE(config, PCM_BITSPERSAMPLE_PARAM);
+		switch (data) {
+		case 8:
+		case 16:
+		case 24:
+		case 32:
+			break;
+		default:
+			return;
+		}
+		reg = axd_get_encoder_pcm_bitspersample_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	}
+}
+
+static void get_pcm_config(struct axd_cmd *cmd, unsigned int pipe, char *config)
+{
+	unsigned int reg;
+	unsigned int data;
+
+	reg = axd_get_encoder_pcm_bitspersample_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_pcm_bitspersample(data, config);
+}
+
+/** FLAC Config **/
+static void parse_flac_channels(unsigned int channels, char *config)
+{
+	sprintf(config, "channels = %u\n", channels);
+}
+static void parse_flac_samplerate(unsigned int samplerate, char *config)
+{
+	sprintf(config, "samplerate = %u\n", samplerate);
+}
+static void parse_flac_bitspersample(unsigned int bitspersample, char *config)
+{
+	sprintf(config, "bitspersample = %u\n", bitspersample);
+}
+static void parse_flac_totalsamples(unsigned int totalsamples, char *config)
+{
+	sprintf(config, "totalsamples = %u\n", totalsamples);
+}
+static void parse_flac_blocksize(unsigned int blocksize, char *config)
+{
+	sprintf(config, "blocksize = %u\n", blocksize);
+}
+static void parse_flac_domidsidestereo(unsigned int domidsidestereo,
+								char *config)
+{
+	sprintf(config, "domidsidestereo = %u\n", domidsidestereo);
+}
+static void parse_flac_loosemidsidestereo(unsigned int loosemidsidestereo,
+								char *config)
+{
+	sprintf(config, "loosemidsidestereo = %u\n", loosemidsidestereo);
+}
+static void parse_flac_doexhaustivemodelsearch(
+			unsigned int doexhaustivemodelsearch, char *config)
+{
+	sprintf(config, "doexhaustivemodelsearch = %u\n",
+						doexhaustivemodelsearch);
+}
+static void parse_flac_minresidualpartitionorder(
+			unsigned int minresidualpartitionorder, char *config)
+{
+	sprintf(config, "minresidualpartitionorder = %u\n",
+						minresidualpartitionorder);
+}
+static void parse_flac_maxresidualpartitionorder(
+			unsigned int maxresidualpartitionorder, char *config)
+{
+	sprintf(config, "maxresidualpartitionorder = %u\n",
+						maxresidualpartitionorder);
+}
+static void parse_flac_framebytes(unsigned int framebytes, char *config)
+{
+	sprintf(config, "framebytes = %u\n", framebytes);
+}
+static void parse_flac_framecount(unsigned int framecount, char *config)
+{
+	sprintf(config, "framecount = %u\n", framecount);
+}
+static void parse_flac_samplecount(unsigned int samplecount, char *config)
+{
+	sprintf(config, "samplecount = %u\n", samplecount);
+}
+static void parse_flac_bytecount(unsigned int bytecount, char *config)
+{
+	sprintf(config, "bytecount = %u\n", bytecount);
+}
+static void get_flac_config(struct axd_cmd *cmd,
+					unsigned int pipe, char *config)
+{
+	unsigned int reg;
+	unsigned int data;
+	char str[32];
+
+	reg = axd_get_encoder_flac_channels_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_channels(data, config);
+
+	reg = axd_get_encoder_flac_samplerate_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_samplerate(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_flac_bitspersample_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_bitspersample(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_flac_totalsamples_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_totalsamples(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_flac_blocksize_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_blocksize(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_flac_domidsidestereo_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_domidsidestereo(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_flac_loosemidsidestereo_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_loosemidsidestereo(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_flac_doexhaustivemodelsearch_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_doexhaustivemodelsearch(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_flac_minresidualpartitionorder_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_minresidualpartitionorder(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_flac_maxresidualpartitionorder_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_maxresidualpartitionorder(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_flac_framebytes_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_framebytes(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_flac_framecount_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_framecount(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_flac_samplecount_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_samplecount(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_flac_bytecount_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_flac_bytecount(data, str);
+	str_append(config, str);
+}
+
+static void set_flac_config(struct axd_cmd *cmd, unsigned int pipe,
+							const char *config)
+{
+#define FLAC_CHANNELS_PARAM			"channels"
+#define FLAC_SAMPLERATE_PARAM			"samplerate"
+#define FLAC_BITSPERSAMPLE_PARAM		"bitspersample"
+#define FLAC_TOTALSAMPLES_PARAM			"totalsamples"
+#define FLAC_BLOCKSIZE_PARAM			"blocksize"
+#define FLAC_DOMIDSIDESTEREO_PARAM		"domidsidestereo"
+#define FLAC_LOOSEMIDSIDESTEREO_PARAM		"loosemidsidestereo"
+#define FLAC_DOEXHAUSTIVEMODELSEARCH_PARAM	"doexhaustivemodelsearch"
+#define FLAC_MINRESIDUALPARTITIONORDER_PARAM	"minresidualpartitionorder"
+#define FLAC_MAXRESIDUALPARTITIONORDER_PARAM	"maxresidualpartitionorder"
+#define FLAC_FRAMEBYTES_PARAM			"frameBytes"
+#define FLAC_FRAMECOUNT_PARAM			"frameCount"
+#define FLAC_SAMPLECOUNT_PARAM			"sampleCount"
+#define FLAC_BYTECOUNT_PARAM			"byteCount"
+	unsigned int reg;
+	int data;
+
+	if (CMP_PARAM(config, FLAC_CHANNELS_PARAM)) {
+		data = PARAM_VALUE(config, FLAC_CHANNELS_PARAM);
+		if (unlikely(data < 1 || data > 8))
+			return;
+		reg = axd_get_encoder_flac_channels_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, FLAC_SAMPLERATE_PARAM)) {
+		data = PARAM_VALUE(config, FLAC_SAMPLERATE_PARAM);
+		if (unlikely(data < 1 || data > 655350))
+			return;
+		reg = axd_get_encoder_flac_samplerate_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, FLAC_BITSPERSAMPLE_PARAM)) {
+		data = PARAM_VALUE(config, FLAC_BITSPERSAMPLE_PARAM);
+		if (unlikely(data < 8 || data > 24))
+			return;
+		reg = axd_get_encoder_flac_bitspersample_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, FLAC_TOTALSAMPLES_PARAM)) {
+		data = PARAM_VALUE(config, FLAC_TOTALSAMPLES_PARAM);
+		reg = axd_get_encoder_flac_totalsamples_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, FLAC_BLOCKSIZE_PARAM)) {
+		data = PARAM_VALUE(config, FLAC_BLOCKSIZE_PARAM);
+		if (unlikely(data != 4096))
+			return;
+		reg = axd_get_encoder_flac_blocksize_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, FLAC_DOMIDSIDESTEREO_PARAM)) {
+		data = PARAM_VALUE(config, FLAC_DOMIDSIDESTEREO_PARAM);
+		if (unlikely(data < 0 || data > 1))
+			return;
+		reg = axd_get_encoder_flac_domidsidestereo_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, FLAC_LOOSEMIDSIDESTEREO_PARAM)) {
+		data = PARAM_VALUE(config, FLAC_LOOSEMIDSIDESTEREO_PARAM);
+		if (unlikely(data < 0 || data > 1))
+			return;
+		reg = axd_get_encoder_flac_loosemidsidestereo_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, FLAC_DOEXHAUSTIVEMODELSEARCH_PARAM)) {
+		data = PARAM_VALUE(config, FLAC_DOEXHAUSTIVEMODELSEARCH_PARAM);
+		if (unlikely(data < 0 || data > 1))
+			return;
+		reg = axd_get_encoder_flac_doexhaustivemodelsearch_reg(cmd,
+									pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, FLAC_MINRESIDUALPARTITIONORDER_PARAM)) {
+		data = PARAM_VALUE(config,
+					FLAC_MINRESIDUALPARTITIONORDER_PARAM);
+		if (unlikely(data < 0 || data > 6)) /* Actual upper limit: 16 */
+			return;
+		reg = axd_get_encoder_flac_minresidualpartitionorder_reg(cmd,
+									pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, FLAC_MAXRESIDUALPARTITIONORDER_PARAM)) {
+		data = PARAM_VALUE(config,
+					FLAC_MAXRESIDUALPARTITIONORDER_PARAM);
+		if (unlikely(data < 0 || data > 6)) /* Actual upper limit: 16 */
+			return;
+		reg = axd_get_encoder_flac_maxresidualpartitionorder_reg(cmd,
+									pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, FLAC_FRAMEBYTES_PARAM)) {
+		/* Read-only */
+		return;
+	} else if (CMP_PARAM(config, FLAC_FRAMECOUNT_PARAM)) {
+		/* Read-only */
+		return;
+	} else if (CMP_PARAM(config, FLAC_SAMPLECOUNT_PARAM)) {
+		/* Read-only */
+		return;
+	} else if (CMP_PARAM(config, FLAC_BYTECOUNT_PARAM)) {
+		/* Read-only */
+		return;
+	}
+
+}
+
+/** ALAC Config **/
+static void parse_alac_channels(unsigned int channels, char *config)
+{
+	sprintf(config, "channels = %u\n", channels);
+}
+static void parse_alac_depth(unsigned int depth, char *config)
+{
+	sprintf(config, "depth = %u\n", depth);
+}
+static void parse_alac_samplerate(unsigned int samplerate, char *config)
+{
+	sprintf(config, "samplerate = %u\n", samplerate);
+}
+static void parse_alac_framelength(unsigned int framelength, char *config)
+{
+	sprintf(config, "framelength = %u\n", framelength);
+}
+static void parse_alac_maxframebytes(unsigned int maxframebytes, char *config)
+{
+	sprintf(config, "maxframebytes = %u\n", maxframebytes);
+}
+static void parse_alac_avgbitrate(unsigned int avgbitrate, char *config)
+{
+	sprintf(config, "avgbitrate = %u\n", avgbitrate);
+}
+static void parse_alac_fastmode(unsigned int fastmode, char *config)
+{
+	sprintf(config, "fastmode = %u\n", fastmode);
+}
+
+static void get_alac_config(struct axd_cmd *cmd,
+					unsigned int pipe, char *config)
+{
+	unsigned int reg;
+	unsigned int data;
+	char str[32];
+
+	reg = axd_get_encoder_alac_channels_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_alac_channels(data, config);
+
+	reg = axd_get_encoder_alac_depth_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_alac_depth(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_alac_samplerate_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_alac_samplerate(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_alac_framelength_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_alac_framelength(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_alac_maxframebytes_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_alac_maxframebytes(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_alac_avgbitrate_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_alac_avgbitrate(data, str);
+	str_append(config, str);
+
+	reg = axd_get_encoder_alac_fastmode_reg(cmd, pipe);
+	if (axd_read_reg(cmd, reg, &data)) {
+		print_timeout_msg(config);
+		return;
+	}
+	parse_alac_fastmode(data, str);
+	str_append(config, str);
+}
+
+static void set_alac_config(struct axd_cmd *cmd, unsigned int pipe,
+							const char *config)
+{
+#define ALAC_CHANNELS_PARAM			"channels"
+#define ALAC_DEPTH_PARAM			"depth"
+#define ALAC_SAMPLERATE_PARAM			"samplerate"
+#define ALAC_FRAMELENGTH_PARAM			"framelength"
+#define ALAC_MAXFRAMEBYTES_PARAM		"maxframebytes"
+#define ALAC_AVGBITRATE_PARAM			"avgbitrate"
+#define ALAC_FASTMODE_PARAM			"fastmode"
+	unsigned int reg;
+	int data;
+
+	if (CMP_PARAM(config, ALAC_CHANNELS_PARAM)) {
+		data = PARAM_VALUE(config, ALAC_CHANNELS_PARAM);
+		if (unlikely(data < 1 || data > 8))
+			return;
+		reg = axd_get_encoder_alac_channels_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, ALAC_DEPTH_PARAM)) {
+		data = PARAM_VALUE(config, ALAC_DEPTH_PARAM);
+		if (unlikely(data < 8 || data > 32))
+			return;
+		reg = axd_get_encoder_alac_depth_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, ALAC_SAMPLERATE_PARAM)) {
+		data = PARAM_VALUE(config, ALAC_SAMPLERATE_PARAM);
+		/* TSTODO validate */
+		reg = axd_get_encoder_alac_samplerate_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, ALAC_FRAMELENGTH_PARAM)) {
+		data = PARAM_VALUE(config, ALAC_FRAMELENGTH_PARAM);
+		/* TSTODO validate */
+		reg = axd_get_encoder_alac_framelength_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, ALAC_MAXFRAMEBYTES_PARAM)) {
+		data = PARAM_VALUE(config, ALAC_MAXFRAMEBYTES_PARAM);
+		/* TSTODO validate */
+		reg = axd_get_encoder_alac_maxframebytes_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, ALAC_AVGBITRATE_PARAM)) {
+		data = PARAM_VALUE(config, ALAC_AVGBITRATE_PARAM);
+		/* TSTODO validate */
+		reg = axd_get_encoder_alac_avgbitrate_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	} else if (CMP_PARAM(config, ALAC_FASTMODE_PARAM)) {
+		data = PARAM_VALUE(config, ALAC_FASTMODE_PARAM);
+		if (unlikely(data < 0 || data > 1))
+			return;
+		reg = axd_get_encoder_alac_fastmode_reg(cmd, pipe);
+		axd_write_reg(cmd, reg, data);
+	}
+}
+
+void axd_cmd_output_get_encoder_config(struct axd_cmd *cmd, unsigned int pipe,
+								char *config)
+{
+	unsigned int codec = axd_get_output_codec_number(cmd, pipe);
+
+	switch (codec) {
+	case 0:
+		get_pcm_config(cmd, pipe, config);
+		return;
+	case 5:
+		get_flac_config(cmd, pipe, config);
+		return;
+	case 11:
+		get_alac_config(cmd, pipe, config);
+		return;
+	default:
+		*config = '\0';
+		return;
+	}
+}
+
+void axd_cmd_output_set_encoder_config(struct axd_cmd *cmd, unsigned int pipe,
+							const char *config)
+{
+	unsigned int codec = axd_get_output_codec_number(cmd, pipe);
+
+	switch (codec) {
+	default:
+	case 0:
+		set_pcm_config(cmd, pipe, config);
+		return;
+	case 5:
+		set_flac_config(cmd, pipe, config);
+		return;
+	case 11:
+		set_alac_config(cmd, pipe, config);
+		return;
+	}
+}
diff --git a/drivers/char/axd/axd_cmds_info.c b/drivers/char/axd/axd_cmds_info.c
new file mode 100644
index 000000000000..befb3b5e2534
--- /dev/null
+++ b/drivers/char/axd/axd_cmds_info.c
@@ -0,0 +1,1409 @@
+/*
+ * Copyright (C) 2011-2014 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.
+ *
+ * AXD Commands API - Info functions.
+ */
+#include "axd_cmds.h"
+#include "axd_cmds_internal.h"
+
+/* static functions */
+/* Fills @source with the source as set in the bit map @bits */
+static void parse_source(unsigned int bits, char *source)
+{
+#define SOURCE_PIPE_STR		"pipe\n"
+#define SOURCE_AUX_STR		"aux\n"
+
+	switch (bits) {
+	case 0:
+		strcpy(source, SOURCE_PIPE_STR);
+		source += sizeof(SOURCE_PIPE_STR);
+		source--; /* terminating null */
+		break;
+	case 1:
+		strcpy(source, SOURCE_AUX_STR);
+		source += sizeof(SOURCE_AUX_STR);
+		source--; /* terminating null */
+		break;
+	default:
+		break;
+	}
+	*source = '\0';
+}
+
+/* Fills @sink with the sink as set in the bit map @bits */
+static void parse_sink(unsigned int bits, char *sink)
+{
+#define SINK_PIPE_STR		"pipe\n"
+#define SINK_I2S_STR		"i2s\n"
+
+	switch (bits) {
+	case 0:
+		strcpy(sink, SINK_PIPE_STR);
+		sink += sizeof(SINK_PIPE_STR);
+		sink--; /* terminating null */
+		break;
+	case 1:
+		strcpy(sink, SINK_I2S_STR);
+		sink += sizeof(SINK_I2S_STR);
+		sink--; /* terminating null */
+		break;
+	default:
+		break;
+	}
+	*sink = '\0';
+}
+
+/* Fills @codec with the list of codecs as set in the bit map @bits */
+static void parse_codec_by_bit(unsigned int bits, char *codecs)
+{
+#define CODEC_BIT0_MASK		(1 << 0)
+#define CODEC_BIT0_STR		"PCM Pass through\n"
+#define CODEC_BIT1_MASK		(1 << 1)
+#define CODEC_BIT1_STR		"MPEG (MP2/3)\n"
+#define CODEC_BIT2_MASK		(1 << 2)
+#define CODEC_BIT2_STR		"Dolby AC3\n"
+#define CODEC_BIT3_MASK		(1 << 3)
+#define CODEC_BIT3_STR		"AAC\n"
+#define CODEC_BIT4_MASK		(1 << 4)
+#define CODEC_BIT4_STR		"Ogg Vorbis\n"
+#define CODEC_BIT5_MASK		(1 << 5)
+#define CODEC_BIT5_STR		"FLAC\n"
+#define CODEC_BIT6_MASK		(1 << 6)
+#define CODEC_BIT6_STR		"Cook\n"
+#define CODEC_BIT7_MASK		(1 << 7)
+#define CODEC_BIT7_STR		"WMA\n"
+#define CODEC_BIT8_MASK		(1 << 8)
+#define CODEC_BIT8_STR		"Dolby Digital Plus\n"
+#define CODEC_BIT11_MASK	(1 << 11)
+#define CODEC_BIT11_STR		"ALAC\n"
+#define CODEC_BIT12_MASK	(1 << 12)
+#define CODEC_BIT12_STR		"MS11\n"
+#define CODEC_BIT13_MASK	(1 << 13)
+#define CODEC_BIT13_STR		"SBC\n"
+
+	if (bits & CODEC_BIT0_MASK) {
+		strcpy(codecs, CODEC_BIT0_STR);
+		codecs += sizeof(CODEC_BIT0_STR);
+		codecs--; /* terminating null */
+	}
+	if (bits & CODEC_BIT1_MASK) {
+		strcpy(codecs, CODEC_BIT1_STR);
+		codecs += sizeof(CODEC_BIT1_STR);
+		codecs--; /* terminating null */
+	}
+	if (bits & CODEC_BIT2_MASK) {
+		strcpy(codecs, CODEC_BIT2_STR);
+		codecs += sizeof(CODEC_BIT2_STR);
+		codecs--; /* terminating null */
+	}
+	if (bits & CODEC_BIT3_MASK) {
+		strcpy(codecs, CODEC_BIT3_STR);
+		codecs += sizeof(CODEC_BIT3_STR);
+		codecs--; /* terminating null */
+	}
+	if (bits & CODEC_BIT4_MASK) {
+		strcpy(codecs, CODEC_BIT4_STR);
+		codecs += sizeof(CODEC_BIT4_STR);
+		codecs--; /* terminating null */
+	}
+	if (bits & CODEC_BIT5_MASK) {
+		strcpy(codecs, CODEC_BIT5_STR);
+		codecs += sizeof(CODEC_BIT5_STR);
+		codecs--; /* terminating null */
+	}
+	if (bits & CODEC_BIT6_MASK) {
+		strcpy(codecs, CODEC_BIT6_STR);
+		codecs += sizeof(CODEC_BIT6_STR);
+		codecs--; /* terminating null */
+	}
+	if (bits & CODEC_BIT7_MASK) {
+		strcpy(codecs, CODEC_BIT7_STR);
+		codecs += sizeof(CODEC_BIT7_STR);
+		codecs--; /* terminating null */
+	}
+	if (bits & CODEC_BIT8_MASK) {
+		strcpy(codecs, CODEC_BIT8_STR);
+		codecs += sizeof(CODEC_BIT8_STR);
+		codecs--; /* terminating null */
+	}
+	if (bits & CODEC_BIT11_MASK) {
+		strcpy(codecs, CODEC_BIT11_STR);
+		codecs += sizeof(CODEC_BIT11_STR);
+		codecs--; /* terminating null */
+	}
+	if (bits & CODEC_BIT12_MASK) {
+		strcpy(codecs, CODEC_BIT12_STR);
+		codecs += sizeof(CODEC_BIT12_STR);
+		codecs--; /* terminating null */
+	}
+	if (bits & CODEC_BIT13_MASK) {
+		strcpy(codecs, CODEC_BIT13_STR);
+		codecs += sizeof(CODEC_BIT13_STR);
+		codecs--; /* terminating null */
+	}
+	*codecs = '\0';
+}
+
+/* Fills @codec with the codec corresponding to @codec_num */
+static void parse_codec_by_number(unsigned int codec_num, char *codecs)
+{
+	parse_codec_by_bit(1 << codec_num, codecs);
+}
+
+/* Fills @upmix by the current upmix setting */
+static void parse_upmix(unsigned int setting, char *upmix)
+{
+#define UPMIX_0_STR		"Pass through\n"
+#define UPMIX_1_STR		"Simple 5.1\n"
+#define UPMIX_2_STR		"Dolby Pro Logic 2\n"
+
+	switch (setting) {
+	case 0:
+		strcpy(upmix, UPMIX_0_STR);
+		upmix += sizeof(UPMIX_0_STR);
+		upmix--; /* terminating null */
+		break;
+	case 1:
+		strcpy(upmix, UPMIX_1_STR);
+		upmix += sizeof(UPMIX_1_STR);
+		upmix--; /* terminating null */
+		break;
+	case 2:
+		strcpy(upmix, UPMIX_2_STR);
+		upmix += sizeof(UPMIX_2_STR);
+		upmix--; /* terminating null */
+		break;
+	default:
+		break;
+	}
+	*upmix = '\0';
+}
+
+/* Fills @downmix by the current downmix setting */
+static void parse_downmix(unsigned int setting, char *downmix)
+{
+#define DOWNMIX_0_STR		"Pass through\n"
+#define DOWNMIX_1_STR		"5.1\n"
+#define DOWNMIX_2_STR		"2.0\n"
+
+	switch (setting) {
+	case 0:
+		strcpy(downmix, DOWNMIX_0_STR);
+		downmix += sizeof(DOWNMIX_0_STR);
+		downmix--; /* terminating null */
+		break;
+	case 1:
+		strcpy(downmix, DOWNMIX_1_STR);
+		downmix += sizeof(DOWNMIX_1_STR);
+		downmix--; /* terminating null */
+		break;
+	case 2:
+		strcpy(downmix, DOWNMIX_2_STR);
+		downmix += sizeof(DOWNMIX_2_STR);
+		downmix--; /* terminating null */
+		break;
+	default:
+		break;
+	}
+	*downmix = '\0';
+}
+
+/* Fills @mux by the current setting of mixer's output @pipe mux */
+static void parse_mux(unsigned int setting, char *mux)
+{
+#define MUX_0_STR		"mix\n"
+#define MUX_1_STR		"input 0\n"
+#define MUX_2_STR		"input 1\n"
+#define MUX_3_STR		"input 2\n"
+#define MUX_4_STR		"input 3\n"
+
+	switch (setting) {
+	case 0:
+		strcpy(mux, MUX_0_STR);
+		mux += sizeof(MUX_0_STR);
+		mux--; /* terminating null */
+		break;
+	case 1:
+		strcpy(mux, MUX_1_STR);
+		mux += sizeof(MUX_1_STR);
+		mux--; /* terminating null */
+		break;
+	case 2:
+		strcpy(mux, MUX_2_STR);
+		mux += sizeof(MUX_2_STR);
+		mux--; /* terminating null */
+		break;
+	case 3:
+		strcpy(mux, MUX_3_STR);
+		mux += sizeof(MUX_3_STR);
+		mux--; /* terminating null */
+		break;
+	case 4:
+		strcpy(mux, MUX_4_STR);
+		mux += sizeof(MUX_4_STR);
+		mux--; /* terminating null */
+		break;
+	default:
+		break;
+	}
+	*mux = '\0';
+}
+
+/* Info API */
+/* Sets the major and minor numbers of the currently running AXD firmware */
+void axd_cmd_get_version(struct axd_cmd *cmd,
+					int *major, int *minor, int *patch)
+{
+	unsigned int version;
+
+	axd_read_reg(cmd, AXD_REG_VERSION, &version);
+	if (unlikely(!major || !minor))
+		return;
+	*major = (version >> 22);		/* top 10 bits */
+	*minor = (version >> 12) & 0x3FF;	/* middle 10 bits */
+	*patch = version & 0xFFF;		/* bottom 12 bits */
+}
+
+/* Sets the number of supported in/out pipes */
+int axd_cmd_get_num_pipes(struct axd_cmd *cmd,
+				unsigned int *inpipes, unsigned int *outpipes)
+{
+	unsigned int config0;
+	int ret;
+
+	ret = axd_read_reg(cmd, AXD_REG_CONFIG0, &config0);
+	if (unlikely(!inpipes || !outpipes))
+		return -1;
+	if (ret)
+		return -1;
+	*inpipes = config0 >> 16;
+	*inpipes &= 0xFF;
+	*outpipes = config0 & 0xFF;
+	return 0;
+}
+
+/* Fills @codecs with a list of supported codecs */
+void axd_cmd_get_decoders(struct axd_cmd *cmd, char *codecs)
+{
+	unsigned int config1;
+
+	axd_read_reg(cmd, AXD_REG_CONFIG1, &config1);
+	if (unlikely(!codecs))
+		return;
+	parse_codec_by_bit(config1, codecs);
+}
+
+/* Fills @codecs with a list of supported codecs */
+void axd_cmd_get_encoders(struct axd_cmd *cmd, char *codecs)
+{
+	unsigned int config2;
+
+	axd_read_reg(cmd, AXD_REG_CONFIG2, &config2);
+	if (unlikely(!codecs))
+		return;
+	parse_codec_by_bit(config2, codecs);
+}
+
+/* Returns non-zero if Mix/Xbar is present. Zero otherwise. */
+int axd_cmd_xbar_present(struct axd_cmd *cmd)
+{
+	unsigned int temp;
+
+	axd_read_reg(cmd, AXD_REG_CONFIG3, &temp);
+	return temp & 0x1;
+}
+
+/* Returns non-zero if mixer EQ is enabled. Zero otherwise. */
+int axd_cmd_mixer_get_eqenabled(struct axd_cmd *cmd, unsigned int pipe)
+{
+	unsigned int control;
+
+	axd_read_reg(cmd, AXD_REG_EQ_CTRL_GAIN, &control);
+	return (control & AXD_EQCTRL_ENABLE_BITS) >> AXD_EQCTRL_ENABLE_SHIFT;
+}
+
+/* Sets @gain to the currently set output EQ Master gain value */
+void axd_cmd_mixer_get_eqmastergain(struct axd_cmd *cmd, unsigned int pipe,
+								int *gain)
+{
+	unsigned int control;
+
+	axd_read_reg(cmd, AXD_REG_EQ_CTRL_GAIN, &control);
+	*gain = (control & AXD_EQCTRL_GAIN_BITS) >> AXD_EQCTRL_GAIN_SHIFT;
+}
+
+/* Sets @gain to the currently set output EQ Band0 gain value */
+void axd_cmd_mixer_get_eqband0gain(struct axd_cmd *cmd, unsigned int pipe,
+								int *gain)
+{
+	unsigned int temp;
+
+	axd_read_reg(cmd, AXD_REG_EQ_BAND0, &temp);
+	*gain = ((int)temp & AXD_EQBANDX_GAIN_BITS) >> AXD_EQBANDX_GAIN_SHIFT;
+}
+
+/* Sets @gain to the currently set output EQ Band1 gain value */
+void axd_cmd_mixer_get_eqband1gain(struct axd_cmd *cmd, unsigned int pipe,
+								int *gain)
+{
+	unsigned int  temp;
+
+	axd_read_reg(cmd, AXD_REG_EQ_BAND1, &temp);
+	*gain = ((int)temp & AXD_EQBANDX_GAIN_BITS) >> AXD_EQBANDX_GAIN_SHIFT;
+}
+
+/* Sets @gain to the currently set output EQ Band2 gain value */
+void axd_cmd_mixer_get_eqband2gain(struct axd_cmd *cmd, unsigned int pipe,
+								int *gain)
+{
+	unsigned int  temp;
+
+	axd_read_reg(cmd, AXD_REG_EQ_BAND2, &temp);
+	*gain = ((int)temp & AXD_EQBANDX_GAIN_BITS) >> AXD_EQBANDX_GAIN_SHIFT;
+}
+
+/* Sets @gain to the currently set output EQ Band3 gain value */
+void axd_cmd_mixer_get_eqband3gain(struct axd_cmd *cmd, unsigned int pipe,
+								int *gain)
+{
+	unsigned int  temp;
+
+	axd_read_reg(cmd, AXD_REG_EQ_BAND3, &temp);
+	*gain = ((int)temp & AXD_EQBANDX_GAIN_BITS) >> AXD_EQBANDX_GAIN_SHIFT;
+}
+
+/* Sets @gain to the currently set output EQ Band4 gain value */
+void axd_cmd_mixer_get_eqband4gain(struct axd_cmd *cmd, unsigned int pipe,
+								int *gain)
+{
+	unsigned int  temp;
+
+	axd_read_reg(cmd, AXD_REG_EQ_BAND4, &temp);
+	*gain = ((int)temp & AXD_EQBANDX_GAIN_BITS) >> AXD_EQBANDX_GAIN_SHIFT;
+}
+
+/* Sets @mux to the currently selected mux output @pipe of mixer */
+void axd_cmd_mixer_get_mux(struct axd_cmd *cmd, unsigned int pipe,
+								char *mux)
+{
+	unsigned int reg = axd_get_mixer_mux_reg(cmd, pipe);
+	unsigned int setting;
+
+	if (unlikely(!reg || !mux))
+		return;
+	axd_read_reg(cmd, reg, &setting);
+	parse_mux(setting, mux);
+}
+
+/* Returns non-zero of input @pipe is enabled. Zero otherwise. */
+int axd_cmd_input_get_enabled(struct axd_cmd *cmd, unsigned int pipe)
+{
+	unsigned int reg = axd_get_input_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return (control & AXD_INCTRL_ENABLE_BITS) >> AXD_INCTRL_ENABLE_SHIFT;
+}
+
+/* Sets @source to the currently selected source of input @pipe */
+void axd_cmd_input_get_source(struct axd_cmd *cmd, unsigned int pipe,
+								char *source)
+{
+	unsigned int reg = axd_get_input_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg || !source))
+		return;
+	axd_read_reg(cmd, reg, &control);
+	control = (control & AXD_INCTRL_SOURCE_BITS) >> AXD_INCTRL_SOURCE_SHIFT;
+	parse_source(control, source);
+}
+
+/* Sets @codec to the currently selected codec of input @pipe */
+void axd_cmd_input_get_codec(struct axd_cmd *cmd, unsigned int pipe,
+								char *codec)
+{
+	unsigned int codec_num = axd_get_input_codec_number(cmd, pipe);
+
+	if (unlikely(!codec))
+		return;
+	parse_codec_by_number(codec_num, codec);
+}
+
+/* Sets @gain to the currently set input gain value */
+void axd_cmd_input_get_gain(struct axd_cmd *cmd, unsigned int pipe,
+								int *gain)
+{
+	unsigned int reg = axd_get_input_gain_reg(cmd, pipe);
+
+	if (unlikely(!reg || !gain))
+		return;
+	axd_read_reg(cmd, reg, gain);
+}
+
+/* Sets @gain to the currently set input gain value */
+void axd_cmd_input_get_mute(struct axd_cmd *cmd, unsigned int pipe,
+								int *muted)
+{
+	unsigned int reg = axd_get_input_gain_reg(cmd, pipe);
+
+	if (unlikely(!reg || !muted))
+		return;
+	axd_read_reg(cmd, reg, muted);
+}
+
+/* Sets @upmix to the currently selected upmix setting of input @pipe */
+void axd_cmd_input_get_upmix(struct axd_cmd *cmd, unsigned int pipe,
+								char *upmix)
+{
+	unsigned int reg = axd_get_input_upmix_reg(cmd, pipe);
+	unsigned int setting;
+
+	if (unlikely(!reg || !upmix))
+		return;
+	axd_read_reg(cmd, reg, &setting);
+	parse_upmix(setting, upmix);
+}
+
+/* Returns the buffer occupancy value of @pipe. */
+unsigned int axd_cmd_input_get_buffer_occupancy(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	unsigned int bo;
+	unsigned int reg = axd_get_input_buffer_occupancy_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &bo);
+	return bo;
+}
+
+/* Returns non-zero of output @pipe is enabled. Zero otherwise. */
+int axd_cmd_output_get_enabled(struct axd_cmd *cmd, unsigned int pipe)
+{
+	unsigned int reg = axd_get_output_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return (control & AXD_OUTCTRL_ENABLE_BITS) >> AXD_OUTCTRL_ENABLE_SHIFT;
+}
+
+/* Sets @codec to the currently selected codec of output @pipe */
+void axd_cmd_output_get_codec(struct axd_cmd *cmd, unsigned int pipe,
+								char *codec)
+{
+	unsigned int codec_num = axd_get_output_codec_number(cmd, pipe);
+
+	if (unlikely(!codec))
+		return;
+	parse_codec_by_number(codec_num, codec);
+}
+
+/* Sets @sink to the currently selected sink of output @pipe */
+void axd_cmd_output_get_sink(struct axd_cmd *cmd, unsigned int pipe,
+								char *sink)
+{
+	unsigned int reg = axd_get_output_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg || !sink))
+		return;
+	axd_read_reg(cmd, reg, &control);
+	control = (control & AXD_OUTCTRL_SINK_BITS) >> AXD_OUTCTRL_SINK_SHIFT;
+	parse_sink(control, sink);
+}
+
+/* Sets @downmix to the currently selected downmix setting of output @pipe */
+void axd_cmd_output_get_downmix(struct axd_cmd *cmd, unsigned int pipe,
+								char *downmix)
+{
+	unsigned int reg = axd_get_output_downmix_reg(cmd, pipe);
+	unsigned int setting;
+
+	if (unlikely(!reg || !downmix))
+		return;
+	axd_read_reg(cmd, reg, &setting);
+	parse_downmix(setting, downmix);
+}
+
+/* Returns non-zero of output @pipe EQ is enabled. Zero otherwise. */
+int axd_cmd_output_get_eqenabled(struct axd_cmd *cmd, unsigned int pipe)
+{
+	unsigned int reg = axd_get_output_eqcontrol_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return (control & AXD_EQCTRL_ENABLE_BITS) >> AXD_EQCTRL_ENABLE_SHIFT;
+}
+
+/* Sets @gain to the currently set output EQ Master gain value */
+void axd_cmd_output_get_eqmastergain(struct axd_cmd *cmd, unsigned int pipe,
+								int *gain)
+{
+	unsigned int reg = axd_get_output_eqcontrol_reg(cmd, pipe);
+	unsigned int temp;
+
+	if (unlikely(!reg || !gain))
+		return;
+	axd_read_reg(cmd, reg, &temp);
+	*gain = ((int)temp & AXD_EQCTRL_GAIN_BITS) >> AXD_EQCTRL_GAIN_SHIFT;
+}
+
+/* Sets @gain to the currently set output EQ Band0 gain value */
+void axd_cmd_output_get_eqband0gain(struct axd_cmd *cmd, unsigned int pipe,
+								int *gain)
+{
+	unsigned int reg = axd_get_output_eqband0_reg(cmd, pipe);
+	unsigned int temp;
+
+	if (unlikely(!reg || !gain))
+		return;
+	axd_read_reg(cmd, reg, &temp);
+	*gain = ((int)temp & AXD_EQBANDX_GAIN_BITS) >> AXD_EQBANDX_GAIN_SHIFT;
+}
+
+/* Sets @gain to the currently set output EQ Band1 gain value */
+void axd_cmd_output_get_eqband1gain(struct axd_cmd *cmd, unsigned int pipe,
+								int *gain)
+{
+	unsigned int reg = axd_get_output_eqband1_reg(cmd, pipe);
+	unsigned int temp;
+
+	if (unlikely(!reg || !gain))
+		return;
+	axd_read_reg(cmd, reg, &temp);
+	*gain = ((int)temp & AXD_EQBANDX_GAIN_BITS) >> AXD_EQBANDX_GAIN_SHIFT;
+}
+
+/* Sets @gain to the currently set output EQ Band2 gain value */
+void axd_cmd_output_get_eqband2gain(struct axd_cmd *cmd, unsigned int pipe,
+								int *gain)
+{
+	unsigned int reg = axd_get_output_eqband2_reg(cmd, pipe);
+	unsigned int temp;
+
+	if (unlikely(!reg || !gain))
+		return;
+	axd_read_reg(cmd, reg, &temp);
+	*gain = ((int)temp & AXD_EQBANDX_GAIN_BITS) >> AXD_EQBANDX_GAIN_SHIFT;
+}
+
+/* Sets @gain to the currently set output EQ Band3 gain value */
+void axd_cmd_output_get_eqband3gain(struct axd_cmd *cmd, unsigned int pipe,
+								int *gain)
+{
+	unsigned int reg = axd_get_output_eqband3_reg(cmd, pipe);
+	unsigned int temp;
+
+	if (unlikely(!reg || !gain))
+		return;
+	axd_read_reg(cmd, reg, &temp);
+	*gain = ((int)temp & AXD_EQBANDX_GAIN_BITS) >> AXD_EQBANDX_GAIN_SHIFT;
+}
+
+/* Sets @gain to the currently set output EQ Band4 gain value */
+void axd_cmd_output_get_eqband4gain(struct axd_cmd *cmd, unsigned int pipe,
+								int *gain)
+{
+	unsigned int reg = axd_get_output_eqband4_reg(cmd, pipe);
+	unsigned int temp;
+
+	if (unlikely(!reg || !gain))
+		return;
+	axd_read_reg(cmd, reg, &temp);
+	*gain = ((int)temp & AXD_EQBANDX_GAIN_BITS) >> AXD_EQBANDX_GAIN_SHIFT;
+}
+
+void axd_cmd_output_get_geq_power(struct axd_cmd *cmd, unsigned int pipe,
+							char *buf, int channel)
+{
+	u32 data[5];
+	int i;
+
+	if (channel < 4) {
+		for (i = 0; i < 5; i++) {
+			u32 reg = axd_get_output_eq_power_reg_ch0_3(cmd,
+								pipe, i);
+
+			if (unlikely(!reg))
+				return;
+
+			if (axd_read_reg(cmd, reg, &data[i]))
+				return;
+		}
+
+		sprintf(buf, "%d, %d, %d, %d, %d\n",
+				(data[0] >> (channel * 8)) & 0xFF,
+				(data[1] >> (channel * 8)) & 0xFF,
+				(data[2] >> (channel * 8)) & 0xFF,
+				(data[3] >> (channel * 8)) & 0xFF,
+				(data[3] >> (channel * 8)) & 0xFF);
+
+	} else {
+		for (i = 0; i < 5; i++) {
+			u32 reg = axd_get_output_eq_power_reg_ch4_7(cmd,
+								pipe, i);
+
+			if (unlikely(!reg))
+				return;
+
+			if (axd_read_reg(cmd, reg, &data[i]))
+				return;
+		}
+
+		sprintf(buf, "%d, %d, %d, %d, %d\n",
+				(data[0] >> (channel-4 * 8)) & 0xFF,
+				(data[1] >> (channel-4 * 8)) & 0xFF,
+				(data[2] >> (channel-4 * 8)) & 0xFF,
+				(data[3] >> (channel-4 * 8)) & 0xFF,
+				(data[4] >> (channel-4 * 8)) & 0xFF);
+	}
+}
+
+unsigned int axd_cmd_info_get_resampler_fin(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	unsigned int temp;
+	unsigned int reg = axd_get_resample_fin_reg(cmd, pipe);
+
+	axd_read_reg(cmd, reg, &temp);
+
+	return temp;
+}
+
+unsigned int axd_cmd_info_get_resampler_fout(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	unsigned int temp;
+	unsigned int reg = axd_get_resample_fout_reg(cmd, pipe);
+
+	axd_read_reg(cmd, reg, &temp);
+
+	return temp;
+}
+
+void axd_cmd_info_set_resampler_fout(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int fout)
+{
+	unsigned int reg = axd_get_resample_fout_reg(cmd, pipe);
+
+	axd_write_reg(cmd, reg, fout);
+}
+
+unsigned int axd_cmd_output_get_dcpp_enabled(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	unsigned int reg = axd_get_output_dcpp_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return (control & AXD_DCPP_CTRL_ENABLE_BITS) >>
+						AXD_DCPP_CTRL_ENABLE_SHIFT;
+}
+
+unsigned int axd_cmd_output_get_dcpp_mode(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	unsigned int reg = axd_get_output_dcpp_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return (control & AXD_DCPP_CTRL_MODE_BITS) >> AXD_DCPP_CTRL_MODE_SHIFT;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channels(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	unsigned int reg = axd_get_output_dcpp_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return (control & AXD_DCPP_CTRL_CHANNELS_BITS) >>
+						AXD_DCPP_CTRL_CHANNELS_SHIFT;
+}
+
+unsigned int axd_cmd_output_get_dcpp_eq_mode(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	unsigned int reg = axd_get_output_dcpp_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return (control & AXD_DCPP_CTRL_EQ_MODE_BITS) >>
+						AXD_DCPP_CTRL_EQ_MODE_SHIFT;
+}
+
+unsigned int axd_cmd_output_get_dcpp_eq_bands(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	unsigned int reg = axd_get_output_dcpp_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return (control & AXD_DCPP_CTRL_EQ_BANDS_BITS) >>
+						AXD_DCPP_CTRL_EQ_BANDS_SHIFT;
+}
+
+unsigned int axd_cmd_output_get_dcpp_max_delay_samples(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	unsigned int reg = axd_get_output_dcpp_max_delay_samples_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_delay_samples(struct axd_cmd *cmd,
+				unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_delay_samples_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_eq_output_volume(
+		struct axd_cmd *cmd, unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_eq_output_volume_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_eq_passthrough_gain(
+		struct axd_cmd *cmd, unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_eq_passthrough_gain_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_eq_inverse_passthrough_gain(
+		struct axd_cmd *cmd, unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_eq_inverse_passthrough_gain_reg(cmd,
+									pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_bass_shelf_shift(
+		struct axd_cmd *cmd, unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_bass_shelf_shift_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_bass_shelf_a0(struct axd_cmd *cmd,
+				unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_bass_shelf_a0_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_bass_shelf_a1(struct axd_cmd *cmd,
+				unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_bass_shelf_a1_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_bass_shelf_a2(struct axd_cmd *cmd,
+				unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_bass_shelf_a2_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_bass_shelf_b0(struct axd_cmd *cmd,
+				unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_bass_shelf_b0_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_bass_shelf_b1(struct axd_cmd *cmd,
+				unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_bass_shelf_b1_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_treble_shelf_shift(
+		struct axd_cmd *cmd, unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_treble_shelf_shift_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_treble_shelf_a0(
+		struct axd_cmd *cmd, unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_treble_shelf_a0_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_treble_shelf_a1(
+		struct axd_cmd *cmd, unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_treble_shelf_a1_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_treble_shelf_a2(
+		struct axd_cmd *cmd, unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_treble_shelf_a2_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_treble_shelf_b0(
+		struct axd_cmd *cmd, unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_treble_shelf_b0_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_treble_shelf_b1(
+		struct axd_cmd *cmd, unsigned int pipe, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+
+	reg = axd_get_output_dcpp_channel_treble_shelf_b1_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_eq_gain(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int band)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_gain_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_eq_a0(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int band)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_a0_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_eq_a1(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int band)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_a1_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_eq_a2(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int band)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_a2_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_eq_b0(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int band)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_b0_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_eq_b1(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int band)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_b1_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_channel_eq_shift(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int channel, unsigned int band)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, false, channel);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_shift_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_eq_bands(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	unsigned int reg = axd_get_output_dcpp_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return (control & AXD_DCPP_CTRL_SUBBAND_EQ_BANDS_BITS)
+				>> AXD_DCPP_CTRL_SUBBAND_EQ_BANDS_SHIFT;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_enabled(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	unsigned int reg = axd_get_output_dcpp_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return (control & AXD_DCPP_CTRL_SUBBAND_ENABLE_BITS)
+				>> AXD_DCPP_CTRL_SUBBAND_ENABLE_SHIFT;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_input_channel_mask(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	unsigned int reg = axd_get_output_dcpp_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return (control & AXD_DCPP_CTRL_SUBBAND_CHANNEL_MASK_BITS)
+				>> AXD_DCPP_CTRL_SUBBAND_CHANNEL_MASK_SHIFT;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_delay_samples(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+
+	reg = axd_get_output_dcpp_channel_delay_samples_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_eq_output_volume(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+
+	reg = axd_get_output_dcpp_channel_eq_output_volume_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_eq_passthrough_gain(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+
+	reg = axd_get_output_dcpp_channel_eq_passthrough_gain_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_eq_inverse_passthrough_gain(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+
+	reg = axd_get_output_dcpp_channel_eq_inverse_passthrough_gain_reg(cmd,
+									pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_eq_gain(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int band)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_gain_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_eq_a0(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int band)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_a0_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_eq_a1(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int band)
+{
+	unsigned int control;
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_a1_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_eq_a2(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int band)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_a2_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_eq_b0(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int band)
+{
+	unsigned int control;
+	unsigned int reg;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_b0_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_eq_b1(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int band)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_b1_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_eq_shift(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int band)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	axd_cmd_output_dcpp_select_channel(cmd, pipe, true, 0);
+	axd_cmd_output_dcpp_select_band(cmd, pipe, band);
+
+	reg = axd_get_output_dcpp_channel_eq_shift_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_low_pass_filter_a0(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	reg = axd_get_output_dcpp_subband_low_pass_filter_a0_reg(cmd, pipe);
+
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_low_pass_filter_a1(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	reg = axd_get_output_dcpp_subband_low_pass_filter_a1_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_low_pass_filter_a2(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	reg = axd_get_output_dcpp_subband_low_pass_filter_a2_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_low_pass_filter_b0(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	reg = axd_get_output_dcpp_subband_low_pass_filter_b0_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
+
+unsigned int axd_cmd_output_get_dcpp_subband_low_pass_filter_b1(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	unsigned int reg;
+	unsigned int control;
+
+	reg = axd_get_output_dcpp_subband_low_pass_filter_b1_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return 0;
+	axd_read_reg(cmd, reg, &control);
+	return control;
+}
diff --git a/drivers/char/axd/axd_cmds_internal.c b/drivers/char/axd/axd_cmds_internal.c
new file mode 100644
index 000000000000..1e23d1329193
--- /dev/null
+++ b/drivers/char/axd/axd_cmds_internal.c
@@ -0,0 +1,3237 @@
+/*
+ * Copyright (C) 2011-2014 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.
+ *
+ * Common functionality required by other axd_cmds_*.c files.
+ */
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/sched.h>
+
+#include "axd_cmds_internal.h"
+#include "axd_module.h"
+#include "axd_platform.h"
+
+#define WRONG_PIPE_STR		"Wrong pipe number: %d\n"
+#define WRONG_BAND_STR		"Wrong band number: %d\n"
+
+/*
+ * Send/Clear control kick.
+ *
+ * NOTE:
+ * Must acquire axd_platform_lock() before accessing kick and interrupt status
+ * registers as the AXD firmware might be accessing them at the same time.
+ */
+inline void axd_ctrl_kick(struct axd_memory_map __iomem *message)
+{
+	unsigned long flags;
+	unsigned int temp;
+
+	flags = axd_platform_lock();
+	temp = ioread32(&message->kick) | AXD_ANY_KICK_BIT | AXD_KICK_CTRL_BIT;
+	iowrite32(temp, &message->kick);
+	axd_platform_unlock(flags);
+	axd_platform_kick();
+}
+inline void axd_kick_status_clear(struct axd_memory_map __iomem *message)
+{
+	unsigned long flags;
+	unsigned int temp;
+
+	flags = axd_platform_lock();
+	temp = ioread32(&message->int_status) & ~AXD_INT_KICK_DONE;
+	iowrite32(temp, &message->int_status);
+	axd_platform_unlock(flags);
+}
+/*
+ * Wait until axd is ready again. Must be called while cm_lock is held.
+ */
+int axd_wait_ready(struct axd_memory_map __iomem *message)
+{
+#define BUSYWAIT_TIME		1
+#define BUSYWAIT_TIMEOUT	100
+	unsigned int timeout = 0;
+
+	while (ioread32(&message->control_command) != AXD_CTRL_CMD_READY) {
+		mdelay(BUSYWAIT_TIME);
+		timeout += BUSYWAIT_TIME;
+		if (timeout == BUSYWAIT_TIMEOUT)
+			return -1;
+	}
+	return 0;
+}
+
+/*
+ * Reads a register from the MemoryMapped register interface.
+ * @cmd: pointer to initialized struct axd_cmd.
+ * @reg: the register address to be accessed.
+ */
+int axd_read_reg(struct axd_cmd *cmd, unsigned int reg, unsigned int *data)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	struct axd_memory_map __iomem *message = cmd->message;
+	struct mutex *cm_lock = &cmd->cm_lock;
+	int ret;
+
+	mutex_lock(cm_lock);
+	if (axd_get_flag(&cmd->fw_stopped_flg)) {
+		mutex_unlock(cm_lock);
+		return -1;
+	}
+	axd_set_flag(&cmd->response_flg, 0);
+	iowrite32(AXD_CTRL_CMD_READ_REGISTER | reg, &message->control_command);
+	axd_ctrl_kick(message);
+	ret = wait_event_timeout(cmd->wait,
+			axd_get_flag(&cmd->response_flg) != 0, CMD_TIMEOUT);
+	*data = ioread32(&message->control_data);
+	mutex_unlock(cm_lock);
+	if (!ret) {
+		dev_warn(axd->dev, "failed to read reg 0x%04X\n", reg);
+		*data = 0;
+		return -1;
+	}
+	return 0;
+}
+
+/*
+ * Writes control data to the MemoryMapped control interface.
+ * We assume that cm_lock is held before this function is called.
+ * @cmd: pointer to initialized struct axd_cmd.
+ * @ctrl_command: the control command to write.
+ * @ctrl_data: the control value to write.
+ */
+int axd_write_ctrl(struct axd_cmd *cmd, unsigned int ctrl_command,
+						unsigned int ctrl_data)
+{
+	struct axd_memory_map __iomem *message = cmd->message;
+	int ret;
+
+	axd_set_flag(&cmd->response_flg, 0);
+	iowrite32(ctrl_data, &message->control_data);
+	iowrite32(ctrl_command, &message->control_command);
+	axd_ctrl_kick(message);
+	ret = wait_event_timeout(cmd->wait,
+			axd_get_flag(&cmd->response_flg) != 0, CMD_TIMEOUT);
+	return ret;
+}
+
+/*
+ * Writes value to a register int the MemoryMapped register interface.
+ * @cmd: pointer to initialized struct axd_cmd.
+ * @reg: the register address to be accessed.
+ * @value: the new value to write.
+ */
+int axd_write_reg(struct axd_cmd *cmd, unsigned int reg, unsigned int value)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	struct mutex *cm_lock = &cmd->cm_lock;
+	int ret;
+
+	mutex_lock(cm_lock);
+	if (axd_get_flag(&cmd->fw_stopped_flg)) {
+		mutex_unlock(cm_lock);
+		return -1;
+	}
+	ret = axd_write_ctrl(cmd, AXD_CTRL_CMD_WRITE_REGISTER | reg, value);
+	mutex_unlock(cm_lock);
+	if (!ret) {
+		dev_warn(axd->dev, "failed to write reg 0x%04X\n", reg);
+		return -1;
+	}
+
+	return 0;
+}
+
+int axd_write_reg_buf(struct axd_cmd *cmd, unsigned int reg, unsigned int value)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	struct mutex *cm_lock = &cmd->cm_lock;
+	struct axd_ctrlbuf_item __iomem *buf;
+	unsigned int ctrlbuf_ctrl = ioread32(&cmd->message->ctrlbuf_ctrl);
+	unsigned int ctrlbuf_size = ioread32(&cmd->message->ctrlbuf_size);
+	unsigned int temp;
+
+	if (!axd_get_flag(&cmd->ctrlbuf_active_flg)) {
+		/* If the ctrlbuf isn't active, fall back to simple reg write */
+		return axd_write_reg(cmd, reg, value);
+	}
+
+	mutex_lock(cm_lock);
+	if (axd_get_flag(&cmd->fw_stopped_flg)) {
+		mutex_unlock(cm_lock);
+		return -1;
+	}
+
+	if (ctrlbuf_ctrl >= ctrlbuf_size) {
+		mutex_unlock(cm_lock);
+		dev_err(axd->dev, "Could not write to ctrlbuf: full\n");
+		return -1;
+	}
+
+	buf = &cmd->message->ctrlbuf[ctrlbuf_ctrl];
+
+	iowrite32(AXD_CTRL_CMD_WRITE_REGISTER | reg, &buf->reg);
+	iowrite32(value, &buf->val);
+
+	temp = ioread32(&cmd->message->ctrlbuf_ctrl) + 1;
+	iowrite32(temp, &cmd->message->ctrlbuf_ctrl);
+
+	mutex_unlock(cm_lock);
+
+	return 0;
+}
+
+int axd_flush_reg_buf(struct axd_cmd *cmd)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	struct mutex *cm_lock = &cmd->cm_lock;
+	int ret;
+
+	mutex_lock(cm_lock);
+	if (axd_get_flag(&cmd->fw_stopped_flg)) {
+		mutex_unlock(cm_lock);
+		return -1;
+	}
+
+	if (ioread32(&cmd->message->ctrlbuf_ctrl) == 0) {
+		mutex_unlock(cm_lock);
+		dev_warn(axd->dev, "Tried to flush empty ctrlbuf\n");
+		return -1;
+	}
+
+	ret = axd_write_ctrl(cmd, AXD_CTRL_CMD_CTRLBUF_FLUSH, 0);
+	if (!ret) {
+		/* Drop buffer and ignore any response */
+		iowrite32(0, &cmd->message->ctrlbuf_ctrl);
+
+		mutex_unlock(cm_lock);
+		dev_err(axd->dev, "Could not write control command to flush buffer");
+		return -EIO;
+	}
+
+	/* Ignore any response */
+	iowrite32(0, &cmd->message->ctrlbuf_ctrl);
+
+	mutex_unlock(cm_lock);
+
+	return 0;
+}
+
+/* Returns the address of the correct mixer mux register for @pipe */
+unsigned int axd_get_mixer_mux_reg(struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_MUX0;
+		break;
+	case 1:
+		reg = AXD_REG_MUX1;
+		break;
+	case 2:
+		reg = AXD_REG_MUX2;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the number of the currently set input codec */
+unsigned int axd_get_input_codec_number(struct axd_cmd *cmd, unsigned int pipe)
+{
+	unsigned int reg = axd_get_input_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return -1;
+	axd_read_reg(cmd, reg, &control);
+	return (control & AXD_INCTRL_CODEC_BITS) >> AXD_INCTRL_CODEC_SHIFT;
+}
+
+/* Returns the address of the correct input control register for @pipe */
+unsigned int axd_get_input_control_reg(struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_INPUT0_CONTROL;
+		break;
+	case 1:
+		reg = AXD_REG_INPUT1_CONTROL;
+		break;
+	case 2:
+		reg = AXD_REG_INPUT2_CONTROL;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the correct input gain register for @pipe */
+unsigned int axd_get_input_gain_reg(struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_INPUT0_GAIN;
+		break;
+	case 1:
+		reg = AXD_REG_INPUT1_GAIN;
+		break;
+	case 2:
+		reg = AXD_REG_INPUT2_GAIN;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the correct input mute register for @pipe */
+unsigned int axd_get_input_mute_reg(struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_INPUT0_MUTE;
+		break;
+	case 1:
+		reg = AXD_REG_INPUT1_MUTE;
+		break;
+	case 2:
+		reg = AXD_REG_INPUT2_MUTE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the correct input UpMix register for @pipe */
+unsigned int axd_get_input_upmix_reg(struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_INPUT0_UPMIX;
+		break;
+	case 1:
+		reg = AXD_REG_INPUT1_UPMIX;
+		break;
+	case 2:
+		reg = AXD_REG_INPUT2_UPMIX;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the correct input bufer occupancy reg for @pipe */
+unsigned int axd_get_input_buffer_occupancy_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_INPUT0_BUFFER_OCCUPANCY;
+		break;
+	case 1:
+		reg = AXD_REG_INPUT1_BUFFER_OCCUPANCY;
+		break;
+	case 2:
+		reg = AXD_REG_INPUT2_BUFFER_OCCUPANCY;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the number of the currently set output codec */
+unsigned int axd_get_output_codec_number(struct axd_cmd *cmd, unsigned int pipe)
+{
+	unsigned int reg = axd_get_output_control_reg(cmd, pipe);
+	unsigned int control;
+
+	if (unlikely(!reg))
+		return -1;
+	axd_read_reg(cmd, reg, &control);
+	return (control & AXD_OUTCTRL_CODEC_BITS) >> AXD_OUTCTRL_CODEC_SHIFT;
+}
+
+/* Returns the address of the correct output control register for @pipe */
+unsigned int axd_get_output_control_reg(struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_CONTROL;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_CONTROL;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_CONTROL;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the correct output DownMix register for @pipe */
+unsigned int axd_get_output_downmix_reg(struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DOWNMIX;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DOWNMIX;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DOWNMIX;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/*
+ * Returns the address of the output EQ Ctrl / Master Gain register for
+ * @pipe
+ */
+unsigned int axd_get_output_eqcontrol_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_EQCTRL;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_EQCTRL;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_EQCTRL;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the output EQ Band0 register for @pipe*/
+unsigned int axd_get_output_eqband0_reg(struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_EQBAND0;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_EQBAND0;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_EQBAND0;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the output EQ Band1 register for @pipe*/
+unsigned int axd_get_output_eqband1_reg(struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_EQBAND1;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_EQBAND1;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_EQBAND1;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the output EQ Band2 register for @pipe*/
+unsigned int axd_get_output_eqband2_reg(struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_EQBAND2;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_EQBAND2;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_EQBAND2;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the output EQ Band3 register for @pipe*/
+unsigned int axd_get_output_eqband3_reg(struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_EQBAND3;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_EQBAND3;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_EQBAND3;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the output EQ Band4 register for @pipe*/
+unsigned int axd_get_output_eqband4_reg(struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_EQBAND4;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_EQBAND4;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_EQBAND4;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* DCPP */
+
+int axd_cmd_output_dcpp_select_channel(struct axd_cmd *cmd, unsigned int pipe,
+					bool subband, unsigned int channel)
+{
+	unsigned int reg;
+	unsigned int control;
+	int ret;
+
+	reg = axd_get_output_dcpp_channel_ctrl_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	/* Generate channel selector */
+	control = 0;
+
+	if (subband)
+		control = AXD_DCPP_CHANNEL_CTRL_SUBBAND_BITS;
+	else
+		control = channel << AXD_DCPP_CHANNEL_CTRL_CHANNEL_SHIFT;
+
+	/* Compare with last channel selector */
+	if (control == cmd->dcpp_channel_ctrl_cache[pipe]) {
+		ret = 0;
+	} else {
+		ret = axd_write_reg_buf(cmd, reg, control);
+		cmd->dcpp_channel_ctrl_cache[pipe] = control;
+	}
+
+	return ret;
+}
+
+int axd_cmd_output_dcpp_select_band(struct axd_cmd *cmd, unsigned int pipe,
+							unsigned int band)
+{
+	unsigned int reg;
+	unsigned int control;
+	int ret;
+
+	reg = axd_get_output_dcpp_band_ctrl_reg(cmd, pipe);
+	if (unlikely(!reg))
+		return -1;
+
+	/* Generate band selector */
+	control = band;
+
+	/* Compare with last band selector */
+	if (control == cmd->dcpp_band_ctrl_cache[pipe]) {
+		ret = 0;
+	} else {
+		ret = axd_write_reg_buf(cmd, reg, control);
+		cmd->dcpp_band_ctrl_cache[pipe] = control;
+	}
+
+	return ret;
+}
+
+unsigned int axd_get_output_dcpp_control_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CONTROL;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CONTROL;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CONTROL;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_max_delay_samples_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_MAX_DELAY_SAMPLES;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_MAX_DELAY_SAMPLES;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_MAX_DELAY_SAMPLES;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_ctrl_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg = 0;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_CONTROL;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_CONTROL;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_CONTROL;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_band_ctrl_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg = 0;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_BAND_CONTROL;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_BAND_CONTROL;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_BAND_CONTROL;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_delay_samples_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_DELAY_SAMPLES;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_DELAY_SAMPLES;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_DELAY_SAMPLES;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_eq_output_volume_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_EQ_OUTPUT_VOLUME;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_EQ_OUTPUT_VOLUME;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_EQ_OUTPUT_VOLUME;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_eq_passthrough_gain_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_EQ_PASSTHROUGH_GAIN;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_EQ_PASSTHROUGH_GAIN;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_EQ_PASSTHROUGH_GAIN;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_eq_inverse_passthrough_gain_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_EQ_INVERSE_PASSTHROUGH_GAIN;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_EQ_INVERSE_PASSTHROUGH_GAIN;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_EQ_INVERSE_PASSTHROUGH_GAIN;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_bass_shelf_shift_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_BASS_SHELF_SHIFT;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_BASS_SHELF_SHIFT;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_BASS_SHELF_SHIFT;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_bass_shelf_a0_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_BASS_SHELF_A0;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_BASS_SHELF_A0;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_BASS_SHELF_A0;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_bass_shelf_a1_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_BASS_SHELF_A1;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_BASS_SHELF_A1;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_BASS_SHELF_A1;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_bass_shelf_a2_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_BASS_SHELF_A2;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_BASS_SHELF_A2;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_BASS_SHELF_A2;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_bass_shelf_b0_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_BASS_SHELF_B0;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_BASS_SHELF_B0;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_BASS_SHELF_B0;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_bass_shelf_b1_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_BASS_SHELF_B1;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_BASS_SHELF_B1;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_BASS_SHELF_B1;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_treble_shelf_shift_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_TREBLE_SHELF_SHIFT;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_TREBLE_SHELF_SHIFT;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_TREBLE_SHELF_SHIFT;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_treble_shelf_a0_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_TREBLE_SHELF_A0;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_TREBLE_SHELF_A0;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_TREBLE_SHELF_A0;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_treble_shelf_a1_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_TREBLE_SHELF_A1;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_TREBLE_SHELF_A1;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_TREBLE_SHELF_A1;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_treble_shelf_a2_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_TREBLE_SHELF_A2;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_TREBLE_SHELF_A2;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_TREBLE_SHELF_A2;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_treble_shelf_b0_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_TREBLE_SHELF_B0;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_TREBLE_SHELF_B0;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_TREBLE_SHELF_B0;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_treble_shelf_b1_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_TREBLE_SHELF_B1;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_TREBLE_SHELF_B1;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_TREBLE_SHELF_B1;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_eq_gain_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_EQ_BAND_GAIN;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_EQ_BAND_GAIN;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_EQ_BAND_GAIN;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_eq_a0_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_EQ_BAND_A0;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_EQ_BAND_A0;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_EQ_BAND_A0;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_eq_a1_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_EQ_BAND_A1;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_EQ_BAND_A1;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_EQ_BAND_A1;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_eq_a2_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_EQ_BAND_A2;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_EQ_BAND_A2;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_EQ_BAND_A2;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_eq_b0_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_EQ_BAND_B0;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_EQ_BAND_B0;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_EQ_BAND_B0;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_eq_b1_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_EQ_BAND_B1;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_EQ_BAND_B1;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_EQ_BAND_B1;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_channel_eq_shift_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_CHANNEL_EQ_BAND_SHIFT;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_CHANNEL_EQ_BAND_SHIFT;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_CHANNEL_EQ_BAND_SHIFT;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_subband_low_pass_filter_a0_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg = 0;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_SUBBAND_LOW_PASS_FILTER_A0;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_SUBBAND_LOW_PASS_FILTER_A0;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_SUBBAND_LOW_PASS_FILTER_A0;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_subband_low_pass_filter_a1_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg = 0;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_SUBBAND_LOW_PASS_FILTER_A1;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_SUBBAND_LOW_PASS_FILTER_A1;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_SUBBAND_LOW_PASS_FILTER_A1;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_subband_low_pass_filter_a2_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg = 0;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_SUBBAND_LOW_PASS_FILTER_A2;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_SUBBAND_LOW_PASS_FILTER_A2;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_SUBBAND_LOW_PASS_FILTER_A2;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_subband_low_pass_filter_b0_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg = 0;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_SUBBAND_LOW_PASS_FILTER_B0;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_SUBBAND_LOW_PASS_FILTER_B0;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_SUBBAND_LOW_PASS_FILTER_B0;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_dcpp_subband_low_pass_filter_b1_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg = 0;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_OUTPUT0_DCPP_SUBBAND_LOW_PASS_FILTER_B1;
+		break;
+	case 1:
+		reg = AXD_REG_OUTPUT1_DCPP_SUBBAND_LOW_PASS_FILTER_B1;
+		break;
+	case 2:
+		reg = AXD_REG_OUTPUT2_DCPP_SUBBAND_LOW_PASS_FILTER_B1;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the aac version for decoder at @pipe*/
+unsigned int axd_get_decoder_aac_version_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_AAC_VERSION;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_AAC_VERSION;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_AAC_VERSION;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the aac pipes for decoder at @pipe*/
+unsigned int axd_get_decoder_aac_channels_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_AAC_CHANNELS;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_AAC_CHANNELS;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_AAC_CHANNELS;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the aac profile for decoder at @pipe*/
+unsigned int axd_get_decoder_aac_profile_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_AAC_PROFILE;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_AAC_PROFILE;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_AAC_PROFILE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the aac stream type for decoder at @pipe*/
+unsigned int axd_get_decoder_aac_streamtype_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_AAC_STREAM_TYPE;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_AAC_STREAM_TYPE;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_AAC_STREAM_TYPE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the aac stream type for decoder at @pipe*/
+unsigned int axd_get_decoder_aac_samplerate_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_AAC_SAMPLERATE;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_AAC_SAMPLERATE;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_AAC_SAMPLERATE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_decoder_ac3_channels_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_AC3_CHANNELS;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_AC3_CHANNELS;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_AC3_CHANNELS;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_decoder_ac3_channel_order_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_AC3_CHANNEL_ORDER;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_AC3_CHANNEL_ORDER;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_AC3_CHANNEL_ORDER;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_decoder_ac3_mode_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_AC3_MODE;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_AC3_MODE;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_AC3_MODE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the cook flavour for decoder at @pipe*/
+unsigned int axd_get_decoder_cook_flavour_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_COOK_FLAVOUR;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_COOK_FLAVOUR;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_COOK_FLAVOUR;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the flac pipes for decoder at @pipe*/
+unsigned int axd_get_decoder_flac_channels_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_FLAC_CHANNELS;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_FLAC_CHANNELS;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_FLAC_CHANNELS;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the flac sample rate for decoder at @pipe*/
+unsigned int axd_get_decoder_flac_samplerate_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_FLAC_SAMPLERATE;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_FLAC_SAMPLERATE;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_FLAC_SAMPLERATE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the flac bits per sample for decoder at @pipe*/
+unsigned int axd_get_decoder_flac_bitspersample_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_FLAC_BITS_PER_SAMPLE;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_FLAC_BITS_PER_SAMPLE;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_FLAC_BITS_PER_SAMPLE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the flac md5 checking for decoder at @pipe*/
+unsigned int axd_get_decoder_flac_md5checking_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_FLAC_MD5_CHECKING;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_FLAC_MD5_CHECKING;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_FLAC_MD5_CHECKING;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the mpeg num pipes for decoder at @pipe*/
+unsigned int axd_get_decoder_mpeg_numchannels_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_MPEG_CHANNELS;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_MPEG_CHANNELS;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_MPEG_CHANNELS;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the mpeg mlchannel for decoder at @pipe*/
+unsigned int axd_get_decoder_mpeg_mlchannel_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_MPEG_MLCHANNEL;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_MPEG_MLCHANNEL;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_MPEG_MLCHANNEL;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the wma player opt for decoder at @pipe*/
+unsigned int axd_get_decoder_wma_playeropt_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_PLAYER_OPT;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_WMA_PLAYER_OPT;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_WMA_PLAYER_OPT;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the wma player drc setting for decoder at @pipe*/
+unsigned int axd_get_decoder_wma_drcsetting_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_DRC_SETTING;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_WMA_DRC_SETTING;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_WMA_DRC_SETTING;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the wma player peak ref for decoder at @pipe*/
+unsigned int axd_get_decoder_wma_peakampref_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_PEAK_AMP_REF;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_WMA_PEAK_AMP_REF;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_WMA_PEAK_AMP_REF;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the wma player rms ref for decoder at @pipe*/
+unsigned int axd_get_decoder_wma_rmsampref_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_RMS_AMP_REF;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_WMA_RMS_AMP_REF;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_WMA_RMS_AMP_REF;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the wma player peak target for decoder at @pipe*/
+unsigned int axd_get_decoder_wma_peakamptarget_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_PEAK_AMP_TARGET;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_WMA_PEAK_AMP_TARGET;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_WMA_PEAK_AMP_TARGET;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the wma player rms target for decoder at @pipe*/
+unsigned int axd_get_decoder_wma_rmsamptarget_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_RMS_AMP_TARGET;
+		break;
+	case 1:
+		reg = AXD_REG_DEC2_WMA_RMS_AMP_TARGET;
+		break;
+	case 2:
+		reg = AXD_REG_DEC1_WMA_RMS_AMP_TARGET;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the wma pcm valid bits for decoder at @pipe*/
+unsigned int axd_get_decoder_wma_pcmvalidbitspersample_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_PCM_VAL_BITS_PER_SAMPLE;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_WMA_PCM_VAL_BITS_PER_SAMPLE;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_WMA_PCM_VAL_BITS_PER_SAMPLE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the wma pcm container size for decoder at @pipe*/
+unsigned int axd_get_decoder_wma_pcmcontainersize_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_PCM_CONTAINER_SIZE;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_WMA_PCM_CONTAINER_SIZE;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_WMA_PCM_CONTAINER_SIZE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the wma format tag for decoder at @pipe*/
+unsigned int axd_get_decoder_wma_wmaformattag_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_WMA_FORMAT_TAG;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_WMA_WMA_FORMAT_TAG;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_WMA_WMA_FORMAT_TAG;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the wma format num pipes for decoder at @pipe*/
+unsigned int axd_get_decoder_wma_wmanumchannels_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_WMA_CHANNELS;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_WMA_WMA_CHANNELS;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_WMA_WMA_CHANNELS;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the wma format sample/s for decoder at @pipe*/
+unsigned int axd_get_decoder_wma_wmasamplespersec_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_WMA_SAMPLES_PER_SEC;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_WMA_WMA_SAMPLES_PER_SEC;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_WMA_WMA_SAMPLES_PER_SEC;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/*
+ * Returns the address of the wma format average bytes per sample for decoder
+ * at @pipe
+ */
+unsigned int axd_get_decoder_wma_wmaaveragebytespersec_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_WMA_AVG_BYTES_PER_SEC;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_WMA_WMA_AVG_BYTES_PER_SEC;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_WMA_WMA_AVG_BYTES_PER_SEC;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the wma format block align for decoder at @pipe*/
+unsigned int axd_get_decoder_wma_wmablockalign_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_WMA_BLOCK_ALIGN;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_WMA_WMA_BLOCK_ALIGN;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_WMA_WMA_BLOCK_ALIGN;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the wma format valid bits for decoder at @pipe*/
+unsigned int axd_get_decoder_wma_wmavalidbitspersample_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_WMA_VAL_BITS_PER_SAMPLE;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_WMA_WMA_VAL_BITS_PER_SAMPLE;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_WMA_WMA_VAL_BITS_PER_SAMPLE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the wma format pipe mask for decoder at @pipe*/
+unsigned int axd_get_decoder_wma_wmachannelmask_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_WMA_CHANNEL_MASK;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_WMA_WMA_CHANNEL_MASK;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_WMA_WMA_CHANNEL_MASK;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the wma format encode options for decoder at @pipe*/
+unsigned int axd_get_decoder_wma_wmaencodeoptions_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_WMA_WMA_ENCODE_OPTS;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_WMA_WMA_ENCODE_OPTS;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_WMA_WMA_ENCODE_OPTS;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the pcm samplerate reg for decoder at @pipe*/
+unsigned int axd_get_decoder_pcm_samplerate_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_PCMIN0_SAMPLE_RATE;
+		break;
+	case 1:
+		reg = AXD_REG_PCMIN1_SAMPLE_RATE;
+		break;
+	case 2:
+		reg = AXD_REG_PCMIN2_SAMPLE_RATE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the pcm channels reg for decoder at @pipe*/
+unsigned int axd_get_decoder_pcm_channels_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_PCMIN0_CHANNELS;
+		break;
+	case 1:
+		reg = AXD_REG_PCMIN1_CHANNELS;
+		break;
+	case 2:
+		reg = AXD_REG_PCMIN2_CHANNELS;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the pcm bitspersample reg for decoder at @pipe*/
+unsigned int axd_get_decoder_pcm_bitspersample_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_PCMIN0_BITS_PER_SAMPLE;
+		break;
+	case 1:
+		reg = AXD_REG_PCMIN1_BITS_PER_SAMPLE;
+		break;
+	case 2:
+		reg = AXD_REG_PCMIN2_BITS_PER_SAMPLE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+/* Returns the address of the pcm justification reg for decoder at @pipe*/
+unsigned int axd_get_decoder_pcm_justification_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_PCMIN0_JUSTIFICATION;
+		break;
+	case 1:
+		reg = AXD_REG_PCMIN1_JUSTIFICATION;
+		break;
+	case 2:
+		reg = AXD_REG_PCMIN2_JUSTIFICATION;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_decoder_ddplus_config_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_DDPLUS_CONFIG;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_DDPLUS_CONFIG;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_DDPLUS_CONFIG;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_decoder_ddplus_channel_order_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_DDPLUS_CHANNEL_ORDER;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_DDPLUS_CHANNEL_ORDER;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_DDPLUS_CHANNEL_ORDER;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_decoder_alac_channels_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_ALAC_CHANNELS;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_ALAC_CHANNELS;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_ALAC_CHANNELS;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_decoder_alac_depth_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_ALAC_DEPTH;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_ALAC_DEPTH;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_ALAC_DEPTH;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_decoder_alac_samplerate_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_ALAC_SAMPLE_RATE;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_ALAC_SAMPLE_RATE;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_ALAC_SAMPLE_RATE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_decoder_alac_framelength_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_ALAC_FRAME_LENGTH;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_ALAC_FRAME_LENGTH;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_ALAC_FRAME_LENGTH;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_decoder_alac_maxframebytes_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_ALAC_MAX_FRAME_BYTES;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_ALAC_MAX_FRAME_BYTES;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_ALAC_MAX_FRAME_BYTES;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_decoder_alac_avgbitrate_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_ALAC_AVG_BIT_RATE;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_ALAC_AVG_BIT_RATE;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_ALAC_AVG_BIT_RATE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_decoder_sbc_samplerate_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_SBC_SAMPLE_RATE;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_SBC_SAMPLE_RATE;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_SBC_SAMPLE_RATE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_decoder_sbc_audiomode_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_SBC_AUDIO_MODE;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_SBC_AUDIO_MODE;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_SBC_AUDIO_MODE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_decoder_sbc_blocks_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_SBC_BLOCKS;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_SBC_BLOCKS;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_SBC_BLOCKS;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_decoder_sbc_subbands_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_SBC_SUBBANDS;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_SBC_SUBBANDS;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_SBC_SUBBANDS;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_decoder_sbc_bitpool_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_SBC_BITPOOL;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_SBC_BITPOOL;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_SBC_BITPOOL;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_decoder_sbc_allocationmode_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_DEC0_SBC_ALLOCATION_MODE;
+		break;
+	case 1:
+		reg = AXD_REG_DEC1_SBC_ALLOCATION_MODE;
+		break;
+	case 2:
+		reg = AXD_REG_DEC2_SBC_ALLOCATION_MODE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+
+unsigned int axd_get_decoder_ms11_mode_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	return AXD_REG_MS11_MODE;
+}
+
+unsigned int axd_get_decoder_ms11_common_config0_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	return AXD_REG_MS11_COMMON_CONFIG0;
+}
+
+unsigned int axd_get_decoder_ms11_common_config1_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	return AXD_REG_MS11_COMMON_CONFIG1;
+}
+
+unsigned int axd_get_decoder_ms11_ddt_config0_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	return AXD_REG_MS11_DDT_CONFIG0;
+}
+
+unsigned int axd_get_decoder_ms11_ddc_config0_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	return AXD_REG_MS11_DDC_CONFIG0;
+}
+
+unsigned int axd_get_decoder_ms11_ext_pcm_config0_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	return AXD_REG_MS11_EXT_PCM_CONFIG0;
+}
+
+/* Returns the address of the pcm bitspersample reg for output at @pipe*/
+unsigned int axd_get_encoder_pcm_bitspersample_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_PCMOUT0_BITS_PER_SAMPLE;
+		break;
+	case 1:
+		reg = AXD_REG_PCMOUT1_BITS_PER_SAMPLE;
+		break;
+	case 2:
+		reg = AXD_REG_PCMOUT2_BITS_PER_SAMPLE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_encoder_flac_channels_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_FLAC_CHANNELS;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_FLAC_CHANNELS;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_FLAC_CHANNELS;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_flac_bitspersample_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_FLAC_BITS_PER_SAMPLE;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_FLAC_BITS_PER_SAMPLE;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_FLAC_BITS_PER_SAMPLE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_flac_samplerate_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_FLAC_SAMPLE_RATE;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_FLAC_SAMPLE_RATE;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_FLAC_SAMPLE_RATE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_flac_totalsamples_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_FLAC_TOTAL_SAMPLES;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_FLAC_TOTAL_SAMPLES;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_FLAC_TOTAL_SAMPLES;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_flac_domidsidestereo_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_FLAC_DO_MID_SIDE_STEREO;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_FLAC_DO_MID_SIDE_STEREO;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_FLAC_DO_MID_SIDE_STEREO;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_flac_loosemidsidestereo_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_FLAC_LOOSE_MID_SIDE_STEREO;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_FLAC_LOOSE_MID_SIDE_STEREO;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_FLAC_LOOSE_MID_SIDE_STEREO;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_flac_doexhaustivemodelsearch_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_FLAC_DO_EXHAUSTIVE_MODEL_SEARCH;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_FLAC_DO_EXHAUSTIVE_MODEL_SEARCH;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_FLAC_DO_EXHAUSTIVE_MODEL_SEARCH;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_flac_minresidualpartitionorder_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_FLAC_MIN_RESIDUAL_PARTITION_ORDER;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_FLAC_MIN_RESIDUAL_PARTITION_ORDER;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_FLAC_MIN_RESIDUAL_PARTITION_ORDER;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_flac_maxresidualpartitionorder_reg(
+					struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_FLAC_MAX_RESIDUAL_PARTITION_ORDER;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_FLAC_MAX_RESIDUAL_PARTITION_ORDER;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_FLAC_MAX_RESIDUAL_PARTITION_ORDER;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_flac_blocksize_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_FLAC_BLOCK_SIZE;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_FLAC_BLOCK_SIZE;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_FLAC_BLOCK_SIZE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_flac_bytecount_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_FLAC_BYTE_COUNT;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_FLAC_BYTE_COUNT;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_FLAC_BYTE_COUNT;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_flac_samplecount_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_FLAC_SAMPLE_COUNT;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_FLAC_SAMPLE_COUNT;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_FLAC_SAMPLE_COUNT;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_flac_framecount_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_FLAC_FRAME_COUNT;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_FLAC_FRAME_COUNT;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_FLAC_FRAME_COUNT;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_flac_framebytes_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_FLAC_FRAME_BYTES;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_FLAC_FRAME_BYTES;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_FLAC_FRAME_BYTES;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_encoder_alac_channels_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_ALAC_CHANNELS;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_ALAC_CHANNELS;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_ALAC_CHANNELS;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_alac_depth_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_ALAC_DEPTH;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_ALAC_DEPTH;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_ALAC_DEPTH;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_alac_samplerate_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_ALAC_SAMPLE_RATE;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_ALAC_SAMPLE_RATE;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_ALAC_SAMPLE_RATE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_alac_framelength_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_ALAC_FRAME_LENGTH;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_ALAC_FRAME_LENGTH;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_ALAC_FRAME_LENGTH;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_alac_maxframebytes_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_ALAC_MAX_FRAME_BYTES;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_ALAC_MAX_FRAME_BYTES;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_ALAC_MAX_FRAME_BYTES;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_alac_avgbitrate_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_ALAC_AVG_BIT_RATE;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_ALAC_AVG_BIT_RATE;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_ALAC_AVG_BIT_RATE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+unsigned int axd_get_encoder_alac_fastmode_reg(struct axd_cmd *cmd,
+							unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_ENC0_ALAC_FAST_MODE;
+		break;
+	case 1:
+		reg = AXD_REG_ENC1_ALAC_FAST_MODE;
+		break;
+	case 2:
+		reg = AXD_REG_ENC2_ALAC_FAST_MODE;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_eq_power_reg_ch0_3(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int band)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg = 0;
+
+	if (pipe == 0) {
+		switch (band) {
+		case 0:
+			reg = AXD_REG_EQ_OUT0_POWER_B0_C0_C3;
+			break;
+		case 1:
+			reg = AXD_REG_EQ_OUT0_POWER_B1_C0_C3;
+			break;
+		case 2:
+			reg = AXD_REG_EQ_OUT0_POWER_B2_C0_C3;
+			break;
+		case 3:
+			reg = AXD_REG_EQ_OUT0_POWER_B3_C0_C3;
+			break;
+		case 4:
+			reg = AXD_REG_EQ_OUT0_POWER_B4_C0_C3;
+			break;
+		default:
+			dev_err(axd->dev, WRONG_BAND_STR, band);
+			return 0;
+		}
+	} else if (pipe == 1) {
+		switch (band) {
+		case 0:
+			reg = AXD_REG_EQ_OUT1_POWER_B0_C0_C3;
+			break;
+		case 1:
+			reg = AXD_REG_EQ_OUT1_POWER_B1_C0_C3;
+			break;
+		case 2:
+			reg = AXD_REG_EQ_OUT1_POWER_B2_C0_C3;
+			break;
+		case 3:
+			reg = AXD_REG_EQ_OUT1_POWER_B3_C0_C3;
+			break;
+		case 4:
+			reg = AXD_REG_EQ_OUT1_POWER_B4_C0_C3;
+			break;
+		default:
+			dev_err(axd->dev, WRONG_BAND_STR, band);
+			return 0;
+		}
+	} else if (pipe == 2) {
+		switch (band) {
+		case 0:
+			reg = AXD_REG_EQ_OUT2_POWER_B0_C0_C3;
+			break;
+		case 1:
+			reg = AXD_REG_EQ_OUT2_POWER_B1_C0_C3;
+			break;
+		case 2:
+			reg = AXD_REG_EQ_OUT2_POWER_B2_C0_C3;
+			break;
+		case 3:
+			reg = AXD_REG_EQ_OUT2_POWER_B3_C0_C3;
+			break;
+		case 4:
+			reg = AXD_REG_EQ_OUT2_POWER_B4_C0_C3;
+			break;
+		default:
+			dev_err(axd->dev, WRONG_BAND_STR, band);
+			return 0;
+		}
+	}
+	return reg;
+}
+
+unsigned int axd_get_output_eq_power_reg_ch4_7(struct axd_cmd *cmd,
+		unsigned int pipe, unsigned int band)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg = 0;
+
+	if (pipe == 0) {
+		switch (band) {
+		case 0:
+			reg = AXD_REG_EQ_OUT0_POWER_B0_C4_C7;
+			break;
+		case 1:
+			reg = AXD_REG_EQ_OUT0_POWER_B1_C4_C7;
+			break;
+		case 2:
+			reg = AXD_REG_EQ_OUT0_POWER_B2_C4_C7;
+			break;
+		case 3:
+			reg = AXD_REG_EQ_OUT0_POWER_B3_C4_C7;
+			break;
+		case 4:
+			reg = AXD_REG_EQ_OUT0_POWER_B4_C4_C7;
+			break;
+		default:
+			dev_err(axd->dev, WRONG_BAND_STR, band);
+			return 0;
+		}
+	} else if (pipe == 1) {
+		switch (band) {
+		case 0:
+			reg = AXD_REG_EQ_OUT1_POWER_B0_C4_C7;
+			break;
+		case 1:
+			reg = AXD_REG_EQ_OUT1_POWER_B1_C4_C7;
+			break;
+		case 2:
+			reg = AXD_REG_EQ_OUT1_POWER_B2_C4_C7;
+			break;
+		case 3:
+			reg = AXD_REG_EQ_OUT1_POWER_B3_C4_C7;
+			break;
+		case 4:
+			reg = AXD_REG_EQ_OUT1_POWER_B4_C4_C7;
+			break;
+		default:
+			dev_err(axd->dev, WRONG_BAND_STR, band);
+			return 0;
+		}
+	} else if (pipe == 2) {
+		switch (band) {
+		case 0:
+			reg = AXD_REG_EQ_OUT2_POWER_B0_C4_C7;
+			break;
+		case 1:
+			reg = AXD_REG_EQ_OUT2_POWER_B1_C4_C7;
+			break;
+		case 2:
+			reg = AXD_REG_EQ_OUT2_POWER_B2_C4_C7;
+			break;
+		case 3:
+			reg = AXD_REG_EQ_OUT2_POWER_B3_C4_C7;
+			break;
+		case 4:
+			reg = AXD_REG_EQ_OUT2_POWER_B4_C4_C7;
+			break;
+		default:
+			dev_err(axd->dev, WRONG_BAND_STR, band);
+			return 0;
+		}
+	}
+	return reg;
+}
+
+unsigned int axd_get_resample_fin_reg(struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_RESAMPLER0_FIN;
+		break;
+	case 1:
+		reg = AXD_REG_RESAMPLER1_FIN;
+		break;
+	case 2:
+		reg = AXD_REG_RESAMPLER2_FIN;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
+
+unsigned int axd_get_resample_fout_reg(struct axd_cmd *cmd, unsigned int pipe)
+{
+	struct axd_dev *axd = container_of(cmd, struct axd_dev, cmd);
+	unsigned int reg;
+
+	switch (pipe) {
+	case 0:
+		reg = AXD_REG_RESAMPLER0_FOUT;
+		break;
+	case 1:
+		reg = AXD_REG_RESAMPLER1_FOUT;
+		break;
+	case 2:
+		reg = AXD_REG_RESAMPLER2_FOUT;
+		break;
+	default:
+		dev_err(axd->dev, WRONG_PIPE_STR, pipe);
+		return 0;
+	}
+	return reg;
+}
diff --git a/drivers/char/axd/axd_cmds_internal.h b/drivers/char/axd/axd_cmds_internal.h
new file mode 100644
index 000000000000..7fa90d0f44ab
--- /dev/null
+++ b/drivers/char/axd/axd_cmds_internal.h
@@ -0,0 +1,306 @@
+/*
+ * Copyright (C) 2011-2014 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.
+ *
+ * Common functionality required by other axd_cmds_*.c files.
+ */
+#ifndef AXD_CMDS_INTERNAL_H_
+#define AXD_CMDS_INTERNAL_H_
+
+#include <linux/io.h>
+
+#include "axd_cmds.h"
+
+#ifdef DEBUG_BUFFERS
+#define debugbuf		printk
+#else
+#define debugbuf(format, ...)
+#endif
+
+void axd_ctrl_kick(struct axd_memory_map __iomem *message);
+void axd_kick_status_clear(struct axd_memory_map __iomem *message);
+int axd_wait_ready(struct axd_memory_map __iomem *message);
+
+int axd_write_ctrl(struct axd_cmd *cmd, unsigned int ctrl_command,
+						unsigned int ctrl_data);
+
+int axd_read_reg(struct axd_cmd *cmd, unsigned int reg, unsigned int *data);
+int axd_write_reg(struct axd_cmd *cmd, unsigned int reg, unsigned int value);
+
+int axd_write_reg_buf(struct axd_cmd *cmd, unsigned int reg,
+							unsigned int value);
+
+unsigned int axd_get_mixer_mux_reg(struct axd_cmd *cmd, unsigned int pipe);
+
+unsigned int axd_get_input_codec_number(struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_input_control_reg(struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_input_gain_reg(struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_input_mute_reg(struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_input_upmix_reg(struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_input_buffer_occupancy_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_output_codec_number(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_control_reg(struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_downmix_reg(struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_eqcontrol_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_eqband0_reg(struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_eqband1_reg(struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_eqband2_reg(struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_eqband3_reg(struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_eqband4_reg(struct axd_cmd *cmd, unsigned int pipe);
+
+unsigned int axd_get_output_eq_power_reg_ch0_3(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int band);
+unsigned int axd_get_output_eq_power_reg_ch4_7(struct axd_cmd *cmd,
+					unsigned int pipe, unsigned int band);
+
+unsigned int axd_get_output_dcpp_control_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_max_delay_samples_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_ctrl_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_band_ctrl_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_delay_samples_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_eq_output_volume_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_eq_passthrough_gain_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_eq_inverse_passthrough_gain_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_bass_shelf_shift_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_bass_shelf_a0_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_bass_shelf_a1_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_bass_shelf_a2_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_bass_shelf_b0_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_bass_shelf_b1_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_treble_shelf_shift_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_treble_shelf_a0_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_treble_shelf_a1_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_treble_shelf_a2_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_treble_shelf_b0_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_treble_shelf_b1_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_eq_gain_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_eq_a0_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_eq_a1_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_eq_a2_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_eq_b0_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_eq_b1_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_channel_eq_shift_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_subband_input_select_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_output_dcpp_subband_low_pass_filter_a0_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_dcpp_subband_low_pass_filter_a1_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_dcpp_subband_low_pass_filter_a2_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_dcpp_subband_low_pass_filter_b0_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_output_dcpp_subband_low_pass_filter_b1_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+
+unsigned int axd_get_decoder_aac_version_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_aac_channels_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_aac_profile_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_aac_streamtype_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_aac_samplerate_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_decoder_ac3_channels_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_ac3_channel_order_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_ac3_mode_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_decoder_cook_flavour_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_decoder_flac_channels_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_flac_samplerate_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_flac_bitspersample_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_flac_md5checking_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_decoder_mpeg_numchannels_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_mpeg_mlchannel_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_decoder_wma_playeropt_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_wma_drcsetting_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_wma_peakampref_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_wma_rmsampref_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_wma_peakamptarget_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_wma_rmsamptarget_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_decoder_wma_pcmvalidbitspersample_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_wma_pcmcontainersize_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_decoder_wma_wmaformattag_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_wma_wmanumchannels_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_wma_wmasamplespersec_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_wma_wmaaveragebytespersec_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_wma_wmablockalign_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_wma_wmavalidbitspersample_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_wma_wmachannelmask_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_wma_wmaencodeoptions_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_pcm_samplerate_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_pcm_channels_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_pcm_bitspersample_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_pcm_justification_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_decoder_ddplus_config_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_ddplus_channel_order_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_decoder_alac_channels_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_alac_depth_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_alac_samplerate_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_alac_framelength_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_alac_maxframebytes_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_alac_avgbitrate_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_decoder_sbc_samplerate_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_sbc_audiomode_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_sbc_blocks_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_sbc_subbands_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_sbc_bitpool_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_sbc_allocationmode_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_decoder_ms11_mode_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_ms11_common_config0_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_ms11_common_config1_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_ms11_ddt_config0_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_ms11_ddc_config0_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_decoder_ms11_ext_pcm_config0_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_encoder_pcm_bitspersample_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_encoder_flac_channels_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_flac_bitspersample_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_flac_samplerate_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_flac_totalsamples_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_flac_domidsidestereo_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_flac_loosemidsidestereo_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_flac_doexhaustivemodelsearch_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_encoder_flac_minresidualpartitionorder_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_encoder_flac_maxresidualpartitionorder_reg(
+					struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_encoder_flac_blocksize_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_flac_bytecount_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_flac_samplecount_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_flac_framecount_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_flac_framebytes_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_encoder_alac_channels_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_alac_depth_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_alac_samplerate_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_alac_framelength_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_alac_maxframebytes_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_alac_avgbitrate_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+unsigned int axd_get_encoder_alac_fastmode_reg(struct axd_cmd *cmd,
+							unsigned int pipe);
+
+unsigned int axd_get_resample_fin_reg(struct axd_cmd *cmd, unsigned int pipe);
+unsigned int axd_get_resample_fout_reg(struct axd_cmd *cmd, unsigned int pipe);
+
+void axd_cmd_inpipe_init(struct axd_cmd *cmd, unsigned int pipe);
+void axd_cmd_outpipe_init(struct axd_cmd *cmd, unsigned int pipe);
+
+#endif /* AXD_CMDS_INTERNAL_H_ */
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ