[PATCH v1 00/10] Fix sound on ASUS Transformers
- add quirk for headset detection used by some T30 devices (ASUS Transformers, LG Optimus 4X HD and Vu); - add RT5631 and MAX9808x machine drivers - add Fortemedia FM34NE DSP driver used by ASUS Transformers and mandatory for correct sound work - bind everything into working configuration
David Heidelberg (1): dt-bindings: sound: nvidia,tegra-audio: add RT5631 CODEC
Svyatoslav Ryhel (9): dt-bindings: sound: nvidia,tegra-audio-common: add new property sound: soc: jack: allow multiple interrupt per gpio ASoC: tegra: Support RT5631 by machine driver dt-bindings: sound: nvidia,tegra-audio: add MAX9808x CODEC ASoC: tegra: Support MAX9808x by machine driver ARM: tegra: transformers: update bindings of sound graph dt-bindings: dsp: add Fortemedia FM34 DSP staging: dsp: add support for Fortemedia FM34NE DSP ARM: tegra: transformers: bind FM34NE DSP on supported devices
.../bindings/dsp/fortemedia,dsp.yaml | 95 ++ .../sound/nvidia,tegra-audio-common.yaml | 4 + .../sound/nvidia,tegra-audio-max9808x.yaml | 93 ++ .../sound/nvidia,tegra-audio-rt5631.yaml | 88 ++ arch/arm/boot/dts/tegra20-asus-tf101.dts | 22 +- arch/arm/boot/dts/tegra30-asus-tf201.dts | 46 + arch/arm/boot/dts/tegra30-asus-tf300t.dts | 34 +- arch/arm/boot/dts/tegra30-asus-tf300tg.dts | 36 + arch/arm/boot/dts/tegra30-asus-tf700t.dts | 36 + .../dts/tegra30-asus-transformer-common.dtsi | 9 +- .../arm/boot/dts/tegra30-pegatron-chagall.dts | 29 +- drivers/staging/Kconfig | 2 + drivers/staging/Makefile | 1 + drivers/staging/dsp/Kconfig | 7 + drivers/staging/dsp/Makefile | 2 + drivers/staging/dsp/dsp-fm34ne.c | 364 ++++++++ drivers/staging/dsp/dsp-fm34ne.h | 845 ++++++++++++++++++ sound/soc/soc-jack.c | 1 + sound/soc/tegra/Kconfig | 18 + sound/soc/tegra/tegra_asoc_machine.c | 120 ++- 20 files changed, 1837 insertions(+), 15 deletions(-) create mode 100644 Documentation/devicetree/bindings/dsp/fortemedia,dsp.yaml create mode 100644 Documentation/devicetree/bindings/sound/nvidia,tegra-audio-max9808x.yaml create mode 100644 Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5631.yaml create mode 100644 drivers/staging/dsp/Kconfig create mode 100644 drivers/staging/dsp/Makefile create mode 100644 drivers/staging/dsp/dsp-fm34ne.c create mode 100644 drivers/staging/dsp/dsp-fm34ne.h
Add nvidia,coupled-mic-hp-det property to use Mic detect GPIO only if HP GPIO is in active state.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com --- .../devicetree/bindings/sound/nvidia,tegra-audio-common.yaml | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-common.yaml b/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-common.yaml index 82801b4f46dd..7c1e9895ce85 100644 --- a/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-common.yaml +++ b/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-common.yaml @@ -80,4 +80,8 @@ properties: type: boolean description: The Mic Jack represents state of the headset microphone pin
+ nvidia,coupled-mic-hp-det: + type: boolean + description: The Mic detect GPIO is viable only if HP detect GPIO is active + additionalProperties: true
On Tue, 21 Feb 2023 20:32:02 +0200, Svyatoslav Ryhel wrote:
Add nvidia,coupled-mic-hp-det property to use Mic detect GPIO only if HP GPIO is in active state.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com
.../devicetree/bindings/sound/nvidia,tegra-audio-common.yaml | 4 ++++ 1 file changed, 4 insertions(+)
Acked-by: Rob Herring robh@kernel.org
This feature is required for coupled hp-mic quirk used by some Nvidia Tegra 3 based devices work properly.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com --- sound/soc/soc-jack.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/sound/soc/soc-jack.c b/sound/soc/soc-jack.c index fcece5ca38c6..f951acb2ce36 100644 --- a/sound/soc/soc-jack.c +++ b/sound/soc/soc-jack.c @@ -367,6 +367,7 @@ int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
ret = request_any_context_irq(gpiod_to_irq(gpios[i].desc), gpio_handler, + IRQF_SHARED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, gpios[i].name,
On Tue, Feb 21, 2023 at 08:32:03PM +0200, Svyatoslav Ryhel wrote:
This feature is required for coupled hp-mic quirk used by some Nvidia Tegra 3 based devices work properly.
Please submit this separately, there's no meaningful dependency on the rest of the series.
Please submit patches using subject lines reflecting the style for the subsystem, this makes it easier for people to identify relevant patches. Look at what existing commits in the area you're changing are doing and make sure your subject lines visually resemble what they're doing. There's no need to resubmit to fix this alone.
ср, 22 лют. 2023 р. о 00:08 Mark Brown broonie@kernel.org пише:
On Tue, Feb 21, 2023 at 08:32:03PM +0200, Svyatoslav Ryhel wrote:
This feature is required for coupled hp-mic quirk used by some Nvidia Tegra 3 based devices work properly.
Please submit this separately, there's no meaningful dependency on the rest of the series.
RT5631 by machine driver commit contains a coupled hp-mic quirk which requires this commit to work properly. In v2 RT5631 machine driver bringup and coupled hp-mic quirk may be split into separate commits.
Please submit patches using subject lines reflecting the style for the subsystem, this makes it easier for people to identify relevant patches. Look at what existing commits in the area you're changing are doing and make sure your subject lines visually resemble what they're doing. There's no need to resubmit to fix this alone.
On Wed, Feb 22, 2023 at 09:53:28AM +0200, Svyatoslav Ryhel wrote:
ср, 22 лют. 2023 р. о 00:08 Mark Brown broonie@kernel.org пише:
On Tue, Feb 21, 2023 at 08:32:03PM +0200, Svyatoslav Ryhel wrote:
This feature is required for coupled hp-mic quirk used by some Nvidia Tegra 3 based devices work properly.
Please submit this separately, there's no meaningful dependency on the rest of the series.
RT5631 by machine driver commit contains a coupled hp-mic quirk which requires this commit to work properly. In v2 RT5631 machine driver bringup and coupled hp-mic quirk may be split into separate commits.
This is needed to get the machine driver to work at runtime but that doesn't block getting this merged, and there's no build time dependency in the other direction either.
From: David Heidelberg david@ixit.cz
Add dt-binding for RT5631 CODEC.
Signed-off-by: David Heidelberg david@ixit.cz --- .../sound/nvidia,tegra-audio-rt5631.yaml | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5631.yaml
diff --git a/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5631.yaml b/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5631.yaml new file mode 100644 index 000000000000..b347f34c47f2 --- /dev/null +++ b/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5631.yaml @@ -0,0 +1,88 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/sound/nvidia,tegra-audio-rt5631.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: NVIDIA Tegra audio complex with RT5631 CODEC + +maintainers: + - Jon Hunter jonathanh@nvidia.com + - Thierry Reding thierry.reding@gmail.com + +allOf: + - $ref: nvidia,tegra-audio-common.yaml# + +properties: + compatible: + items: + - pattern: '^[a-z0-9]+,tegra-audio-rt5631(-[a-z0-9]+)+$' + - const: nvidia,tegra-audio-rt5631 + + nvidia,audio-routing: + $ref: /schemas/types.yaml#/definitions/non-unique-string-array + description: | + A list of the connections between audio components. + Each entry is a pair of strings, the first being the connection's sink, + the second being the connection's source. Valid names for sources and + sinks are the pins (documented in the binding document), + and the jacks on the board. + minItems: 2 + items: + enum: + # Board Connectors + - "Int Spk" + - "Headphone Jack" + - "Mic Jack" + - "Int Mic" + + # CODEC Pins + - MIC1 + - MIC2 + - AXIL + - AXIR + - MONOIN_RXN + - MONOIN_RXP + - DMIC + - MIC Bias1 + - MIC Bias2 + - MONO_IN + - AUXO1 + - AUXO2 + - SPOL + - SPOR + - HPOL + - HPOR + - MONO + +required: + - nvidia,i2s-controller + +unevaluatedProperties: false + +examples: + - | + #include <dt-bindings/clock/tegra30-car.h> + #include <dt-bindings/soc/tegra-pmc.h> + sound { + compatible = "asus,tegra-audio-rt5631-tf700t", + "nvidia,tegra-audio-rt5631"; + nvidia,model = "Asus Transformer Infinity TF700T RT5631"; + + nvidia,audio-routing = + "Headphone Jack", "HPOL", + "Headphone Jack", "HPOR", + "Int Spk", "SPOL", + "Int Spk", "SPOR", + "MIC1", "MIC Bias1", + "MIC Bias1", "Mic Jack", + "DMIC", "Int Mic"; + + nvidia,i2s-controller = <&tegra_i2s1>; + nvidia,audio-codec = <&rt5631>; + + clocks = <&tegra_car TEGRA30_CLK_PLL_A>, + <&tegra_car TEGRA30_CLK_PLL_A_OUT0>, + <&tegra_pmc TEGRA_PMC_CLK_OUT_1>; + clock-names = "pll_a", "pll_a_out0", "mclk"; + };
On Tue, Feb 21, 2023 at 08:32:04PM +0200, Svyatoslav Ryhel wrote:
From: David Heidelberg david@ixit.cz
Add dt-binding for RT5631 CODEC.
Signed-off-by: David Heidelberg david@ixit.cz
Your S-o-b is needed here as well.
.../sound/nvidia,tegra-audio-rt5631.yaml | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5631.yaml
diff --git a/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5631.yaml b/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5631.yaml new file mode 100644 index 000000000000..b347f34c47f2 --- /dev/null +++ b/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5631.yaml @@ -0,0 +1,88 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/sound/nvidia,tegra-audio-rt5631.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml#
+title: NVIDIA Tegra audio complex with RT5631 CODEC
+maintainers:
- Jon Hunter jonathanh@nvidia.com
- Thierry Reding thierry.reding@gmail.com
+allOf:
- $ref: nvidia,tegra-audio-common.yaml#
+properties:
- compatible:
- items:
- pattern: '^[a-z0-9]+,tegra-audio-rt5631(-[a-z0-9]+)+$'
- const: nvidia,tegra-audio-rt5631
- nvidia,audio-routing:
- $ref: /schemas/types.yaml#/definitions/non-unique-string-array
- description: |
A list of the connections between audio components.
Each entry is a pair of strings, the first being the connection's sink,
the second being the connection's source. Valid names for sources and
sinks are the pins (documented in the binding document),
and the jacks on the board.
- minItems: 2
- items:
enum:
# Board Connectors
- "Int Spk"
- "Headphone Jack"
- "Mic Jack"
- "Int Mic"
# CODEC Pins
- MIC1
- MIC2
- AXIL
- AXIR
- MONOIN_RXN
- MONOIN_RXP
- DMIC
- MIC Bias1
- MIC Bias2
- MONO_IN
- AUXO1
- AUXO2
- SPOL
- SPOR
- HPOL
- HPOR
- MONO
+required:
- nvidia,i2s-controller
+unevaluatedProperties: false
+examples:
- |
- #include <dt-bindings/clock/tegra30-car.h>
- #include <dt-bindings/soc/tegra-pmc.h>
- sound {
compatible = "asus,tegra-audio-rt5631-tf700t",
"nvidia,tegra-audio-rt5631";
nvidia,model = "Asus Transformer Infinity TF700T RT5631";
nvidia,audio-routing =
"Headphone Jack", "HPOL",
"Headphone Jack", "HPOR",
"Int Spk", "SPOL",
"Int Spk", "SPOR",
"MIC1", "MIC Bias1",
"MIC Bias1", "Mic Jack",
"DMIC", "Int Mic";
nvidia,i2s-controller = <&tegra_i2s1>;
nvidia,audio-codec = <&rt5631>;
clocks = <&tegra_car TEGRA30_CLK_PLL_A>,
<&tegra_car TEGRA30_CLK_PLL_A_OUT0>,
<&tegra_pmc TEGRA_PMC_CLK_OUT_1>;
clock-names = "pll_a", "pll_a_out0", "mclk";
- };
-- 2.37.2
On 21/02/2023 19:32, Svyatoslav Ryhel wrote:
From: David Heidelberg david@ixit.cz
Add dt-binding for RT5631 CODEC.
Signed-off-by: David Heidelberg david@ixit.cz
.../sound/nvidia,tegra-audio-rt5631.yaml | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5631.yaml
diff --git a/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5631.yaml b/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5631.yaml new file mode 100644 index 000000000000..b347f34c47f2 --- /dev/null +++ b/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5631.yaml @@ -0,0 +1,88 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/sound/nvidia,tegra-audio-rt5631.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml#
+title: NVIDIA Tegra audio complex with RT5631 CODEC
+maintainers:
- Jon Hunter jonathanh@nvidia.com
- Thierry Reding thierry.reding@gmail.com
+allOf:
- $ref: nvidia,tegra-audio-common.yaml#
+properties:
- compatible:
- items:
- pattern: '^[a-z0-9]+,tegra-audio-rt5631(-[a-z0-9]+)+$'
- const: nvidia,tegra-audio-rt5631
- nvidia,audio-routing:
- $ref: /schemas/types.yaml#/definitions/non-unique-string-array
- description: |
A list of the connections between audio components.
Each entry is a pair of strings, the first being the connection's sink,
the second being the connection's source. Valid names for sources and
sinks are the pins (documented in the binding document),
and the jacks on the board.
- minItems: 2
- items:
enum:
# Board Connectors
- "Int Spk"
- "Headphone Jack"
- "Mic Jack"
- "Int Mic"
# CODEC Pins
- MIC1
- MIC2
- AXIL
- AXIR
- MONOIN_RXN
- MONOIN_RXP
- DMIC
- MIC Bias1
- MIC Bias2
- MONO_IN
- AUXO1
- AUXO2
- SPOL
- SPOR
- HPOL
- HPOR
- MONO
+required:
- nvidia,i2s-controller
By convention we always require compatible (and your common schema does not require it, I think). The same for your other patches.
Best regards, Krzysztof
Add Realtek ALC5631/RT5631 codec support to the Tegra ASoC machine driver. The RT5631 codec is found on devices like ASUS Transformer TF201, TF700T and other Tegra-based Android tablets.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com Signed-off-by: Ion Agorria ion@agorria.com --- sound/soc/tegra/Kconfig | 9 ++++ sound/soc/tegra/tegra_asoc_machine.c | 74 ++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+)
diff --git a/sound/soc/tegra/Kconfig b/sound/soc/tegra/Kconfig index b6712a3d1fa1..ff905e5dcd86 100644 --- a/sound/soc/tegra/Kconfig +++ b/sound/soc/tegra/Kconfig @@ -189,6 +189,15 @@ config SND_SOC_TEGRA_AUDIO_GRAPH_CARD config SND_SOC_TEGRA_MACHINE_DRV tristate
+config SND_SOC_TEGRA_RT5631 + tristate "SoC Audio support for Tegra boards using an RT5631 codec" + depends on SND_SOC_TEGRA && I2C && GPIOLIB + select SND_SOC_TEGRA_MACHINE_DRV + select SND_SOC_RT5631 + help + Say Y or M here if you want to add support for SoC audio on Tegra + boards using the RT5631 codec, such as Transformer. + config SND_SOC_TEGRA_RT5640 tristate "SoC Audio support for Tegra boards using an RT5640 codec" depends on I2C && GPIOLIB diff --git a/sound/soc/tegra/tegra_asoc_machine.c b/sound/soc/tegra/tegra_asoc_machine.c index 78faa8bcae27..607800ec07a6 100644 --- a/sound/soc/tegra/tegra_asoc_machine.c +++ b/sound/soc/tegra/tegra_asoc_machine.c @@ -51,6 +51,17 @@ static struct snd_soc_jack_gpio tegra_machine_headset_jack_gpio = { };
/* Mic Jack */ +static int headset_check(void *data) +{ + struct tegra_machine *machine = (struct tegra_machine *)data; + + /* Detect mic insertion only if 3.5 jack is in */ + if (gpiod_get_value_cansleep(machine->gpiod_hp_det) && + gpiod_get_value_cansleep(machine->gpiod_mic_det)) + return SND_JACK_MICROPHONE; + + return 0; +}
static struct snd_soc_jack tegra_machine_mic_jack;
@@ -183,8 +194,15 @@ int tegra_asoc_machine_init(struct snd_soc_pcm_runtime *rtd) return err; }
+ tegra_machine_mic_jack_gpio.data = machine; tegra_machine_mic_jack_gpio.desc = machine->gpiod_mic_det;
+ if (of_property_read_bool(card->dev->of_node, + "nvidia,coupled-mic-hp-det")) { + tegra_machine_mic_jack_gpio.desc = machine->gpiod_hp_det; + tegra_machine_mic_jack_gpio.jack_status_check = headset_check; + }; + err = snd_soc_jack_add_gpios(&tegra_machine_mic_jack, 1, &tegra_machine_mic_jack_gpio); if (err) @@ -238,6 +256,27 @@ static unsigned int tegra_machine_mclk_rate_12mhz(unsigned int srate) return mclk; }
+static unsigned int tegra_machine_mclk_rate_6mhz(unsigned int srate) +{ + unsigned int mclk; + + switch (srate) { + case 64000: + case 88200: + case 96000: + mclk = 128 * srate; + break; + default: + mclk = 256 * srate; + break; + } + /* FIXME: Codec only requires >= 3MHz if OSR==0 */ + while (mclk < 6000000) + mclk *= 2; + + return mclk; +} + static int tegra_machine_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { @@ -865,6 +904,40 @@ static const struct tegra_asoc_data tegra_rt5632_data = { .add_headset_jack = true, };
+/* RT5631 machine */ + +SND_SOC_DAILINK_DEFS(rt5631_hifi, + DAILINK_COMP_ARRAY(COMP_EMPTY()), + DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "rt5631-hifi")), + DAILINK_COMP_ARRAY(COMP_EMPTY())); + +static struct snd_soc_dai_link tegra_rt5631_dai = { + .name = "RT5631", + .stream_name = "RT5631 PCM", + .init = tegra_asoc_machine_init, + .dai_fmt = SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBS_CFS, + SND_SOC_DAILINK_REG(rt5631_hifi), +}; + +static struct snd_soc_card snd_soc_tegra_rt5631 = { + .components = "codec:rt5631", + .dai_link = &tegra_rt5631_dai, + .num_links = 1, + .fully_routed = true, +}; + +static const struct tegra_asoc_data tegra_rt5631_data = { + .mclk_rate = tegra_machine_mclk_rate_6mhz, + .card = &snd_soc_tegra_rt5631, + .add_common_dapm_widgets = true, + .add_common_controls = true, + .add_common_snd_ops = true, + .add_mic_jack = true, + .add_hp_jack = true, +}; + static const struct of_device_id tegra_machine_of_match[] = { { .compatible = "nvidia,tegra-audio-trimslice", .data = &tegra_trimslice_data }, { .compatible = "nvidia,tegra-audio-max98090", .data = &tegra_max98090_data }, @@ -874,6 +947,7 @@ static const struct of_device_id tegra_machine_of_match[] = { { .compatible = "nvidia,tegra-audio-rt5677", .data = &tegra_rt5677_data }, { .compatible = "nvidia,tegra-audio-rt5640", .data = &tegra_rt5640_data }, { .compatible = "nvidia,tegra-audio-alc5632", .data = &tegra_rt5632_data }, + { .compatible = "nvidia,tegra-audio-rt5631", .data = &tegra_rt5631_data }, {}, }; MODULE_DEVICE_TABLE(of, tegra_machine_of_match);
On Tue, Feb 21, 2023 at 08:32:05PM +0200, Svyatoslav Ryhel wrote:
diff --git a/sound/soc/tegra/tegra_asoc_machine.c b/sound/soc/tegra/tegra_asoc_machine.c index 78faa8bcae27..607800ec07a6 100644 --- a/sound/soc/tegra/tegra_asoc_machine.c +++ b/sound/soc/tegra/tegra_asoc_machine.c @@ -51,6 +51,17 @@ static struct snd_soc_jack_gpio tegra_machine_headset_jack_gpio = { };
/* Mic Jack */
This comment doesn't make sense now. It was never super useful, though. Just delete it.
+static int headset_check(void *data) +{
- struct tegra_machine *machine = (struct tegra_machine *)data;
- /* Detect mic insertion only if 3.5 jack is in */
- if (gpiod_get_value_cansleep(machine->gpiod_hp_det) &&
gpiod_get_value_cansleep(machine->gpiod_mic_det))
return SND_JACK_MICROPHONE;
- return 0;
+}
static struct snd_soc_jack tegra_machine_mic_jack;
@@ -183,8 +194,15 @@ int tegra_asoc_machine_init(struct snd_soc_pcm_runtime *rtd)
regards, dan carpenter
вт, 21 лют. 2023 р. о 21:32 Dan Carpenter error27@gmail.com пише:
On Tue, Feb 21, 2023 at 08:32:05PM +0200, Svyatoslav Ryhel wrote:
diff --git a/sound/soc/tegra/tegra_asoc_machine.c b/sound/soc/tegra/tegra_asoc_machine.c index 78faa8bcae27..607800ec07a6 100644 --- a/sound/soc/tegra/tegra_asoc_machine.c +++ b/sound/soc/tegra/tegra_asoc_machine.c @@ -51,6 +51,17 @@ static struct snd_soc_jack_gpio tegra_machine_headset_jack_gpio = { };
/* Mic Jack */
This comment doesn't make sense now. It was never super useful, though. Just delete it.
It does. Headset is Mic Jack + Headphones combined. headset_check function performs check for a Mic Jack component in plugged Jack 3.5
+static int headset_check(void *data) +{
struct tegra_machine *machine = (struct tegra_machine *)data;
/* Detect mic insertion only if 3.5 jack is in */
if (gpiod_get_value_cansleep(machine->gpiod_hp_det) &&
gpiod_get_value_cansleep(machine->gpiod_mic_det))
return SND_JACK_MICROPHONE;
return 0;
+}
static struct snd_soc_jack tegra_machine_mic_jack;
@@ -183,8 +194,15 @@ int tegra_asoc_machine_init(struct snd_soc_pcm_runtime *rtd)
regards, dan carpenter
On Wed, Feb 22, 2023 at 09:55:52AM +0200, Svyatoslav Ryhel wrote:
вт, 21 лют. 2023 р. о 21:32 Dan Carpenter error27@gmail.com пише:
On Tue, Feb 21, 2023 at 08:32:05PM +0200, Svyatoslav Ryhel wrote:
diff --git a/sound/soc/tegra/tegra_asoc_machine.c b/sound/soc/tegra/tegra_asoc_machine.c index 78faa8bcae27..607800ec07a6 100644 --- a/sound/soc/tegra/tegra_asoc_machine.c +++ b/sound/soc/tegra/tegra_asoc_machine.c @@ -51,6 +51,17 @@ static struct snd_soc_jack_gpio tegra_machine_headset_jack_gpio = { };
/* Mic Jack */
This comment doesn't make sense now. It was never super useful, though. Just delete it.
It does. Headset is Mic Jack + Headphones combined. headset_check function performs check for a Mic Jack component in plugged Jack 3.5
I feel if we need to discuess what a comment means or if it even means anything then that's a useless comment by definition.
regards, dan carpenter
On Wed, Feb 22, 2023 at 04:28:09PM +0300, Dan Carpenter wrote:
On Wed, Feb 22, 2023 at 09:55:52AM +0200, Svyatoslav Ryhel wrote:
вт, 21 лют. 2023 р. о 21:32 Dan Carpenter error27@gmail.com пише:
/* Mic Jack */
This comment doesn't make sense now. It was never super useful, though. Just delete it.
It does. Headset is Mic Jack + Headphones combined. headset_check function performs check for a Mic Jack component in plugged Jack 3.5
I feel if we need to discuess what a comment means or if it even means anything then that's a useless comment by definition.
If the device doesn't have a distinct mic jack then it's not ideal to talk about there being one (as opposed to the microphone on the headset jack).
On Tue, Feb 21, 2023 at 08:32:05PM +0200, Svyatoslav Ryhel wrote:
Add Realtek ALC5631/RT5631 codec support to the Tegra ASoC machine driver. The RT5631 codec is found on devices like ASUS Transformer TF201, TF700T and other Tegra-based Android tablets.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com Signed-off-by: Ion Agorria ion@agorria.com
Your signoff should be last if you're the one sending this.
+static unsigned int tegra_machine_mclk_rate_6mhz(unsigned int srate) +{
- unsigned int mclk;
- switch (srate) {
- case 64000:
- case 88200:
- case 96000:
mclk = 128 * srate;
break;
- default:
mclk = 256 * srate;
break;
- }
- /* FIXME: Codec only requires >= 3MHz if OSR==0 */
- while (mclk < 6000000)
mclk *= 2;
It feels like this is complicated enough and looks like the clocking is flexible enough that it might be easier to just have a table of values or otherwise enumerate standard rates, seeing the code I feel like I need to worry about what happens if we pick a clock rate over 6MHz (the loop could give a value over that), and it's not clear why we have the switch statement rather than just starting at a multiple of 128 and looping an extra time.
I suspect there's going to be no meaningful downside for having the clock held at over 3MHz on a tablet form factor, the usual issue would be power consumption but between the larger battery size you tend to have on a tablet and the power draw of the screen if that's on it's likely to be into the noise practially speaking.
ср, 22 лют. 2023 р. о 00:23 Mark Brown broonie@kernel.org пише:
On Tue, Feb 21, 2023 at 08:32:05PM +0200, Svyatoslav Ryhel wrote:
Add Realtek ALC5631/RT5631 codec support to the Tegra ASoC machine driver. The RT5631 codec is found on devices like ASUS Transformer TF201, TF700T and other Tegra-based Android tablets.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com Signed-off-by: Ion Agorria ion@agorria.com
Your signoff should be last if you're the one sending this.
Thanks
+static unsigned int tegra_machine_mclk_rate_6mhz(unsigned int srate) +{
unsigned int mclk;
switch (srate) {
case 64000:
case 88200:
case 96000:
mclk = 128 * srate;
break;
default:
mclk = 256 * srate;
break;
}
/* FIXME: Codec only requires >= 3MHz if OSR==0 */
while (mclk < 6000000)
mclk *= 2;
It feels like this is complicated enough and looks like the clocking is flexible enough that it might be easier to just have a table of values or otherwise enumerate standard rates, seeing the code I feel like I need to worry about what happens if we pick a clock rate over 6MHz (the loop could give a value over that), and it's not clear why we have the switch statement rather than just starting at a multiple of 128 and looping an extra time.
I suspect there's going to be no meaningful downside for having the clock held at over 3MHz on a tablet form factor, the usual issue would be power consumption but between the larger battery size you tend to have on a tablet and the power draw of the screen if that's on it's likely to be into the noise practially speaking.
This is how downstream handled mclk rate for RT5631.
On Wed, Feb 22, 2023 at 10:00:58AM +0200, Svyatoslav Ryhel wrote:
ср, 22 лют. 2023 р. о 00:23 Mark Brown broonie@kernel.org пише:
It feels like this is complicated enough and looks like the clocking is flexible enough that it might be easier to just have a table of values or otherwise enumerate standard rates, seeing the code I feel like I need to worry about what happens if we pick a clock rate over 6MHz (the loop could give a value over that), and it's not clear why we have the switch statement rather than just starting at a multiple of 128 and looping an extra time.
I suspect there's going to be no meaningful downside for having the clock held at over 3MHz on a tablet form factor, the usual issue would be power consumption but between the larger battery size you tend to have on a tablet and the power draw of the screen if that's on it's likely to be into the noise practially speaking.
This is how downstream handled mclk rate for RT5631.
That doesn't mean it shouldn't be fixed or improved.
Add dt-binding for MAX9808x CODEC.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com --- .../sound/nvidia,tegra-audio-max9808x.yaml | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 Documentation/devicetree/bindings/sound/nvidia,tegra-audio-max9808x.yaml
diff --git a/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-max9808x.yaml b/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-max9808x.yaml new file mode 100644 index 000000000000..256ca4ad081e --- /dev/null +++ b/Documentation/devicetree/bindings/sound/nvidia,tegra-audio-max9808x.yaml @@ -0,0 +1,93 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/sound/nvidia,tegra-audio-max9808x.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: NVIDIA Tegra audio complex with MAX9808x CODEC + +maintainers: + - Jon Hunter jonathanh@nvidia.com + - Thierry Reding thierry.reding@gmail.com + +allOf: + - $ref: nvidia,tegra-audio-common.yaml# + +properties: + compatible: + oneOf: + - items: + - pattern: '^[a-z0-9]+,tegra-audio-max98088(-[a-z0-9]+)+$' + - const: nvidia,tegra-audio-max98088 + - items: + - pattern: '^[a-z0-9]+,tegra-audio-max98089(-[a-z0-9]+)+$' + - const: nvidia,tegra-audio-max98089 + + nvidia,audio-routing: + $ref: /schemas/types.yaml#/definitions/non-unique-string-array + description: | + A list of the connections between audio components. + Each entry is a pair of strings, the first being the connection's sink, + the second being the connection's source. Valid names for sources and + sinks are the pins (documented in the binding document), + and the jacks on the board. + minItems: 2 + items: + enum: + # Board Connectors + - "Int Spk" + - "Headphone Jack" + - "Earpiece" + - "Headset Mic" + - "Internal Mic 1" + - "Internal Mic 2" + + # CODEC Pins + - HPL + - HPR + - SPKL + - SPKR + - RECL + - RECR + - INA1 + - INA2 + - INB1 + - INB2 + - MIC1 + - MIC2 + - MICBIAS + +required: + - nvidia,i2s-controller + +unevaluatedProperties: false + +examples: + - | + #include <dt-bindings/clock/tegra30-car.h> + #include <dt-bindings/soc/tegra-pmc.h> + sound { + compatible = "lge,tegra-audio-max98089-p895", + "nvidia,tegra-audio-max98089"; + nvidia,model = "LG Optimus Vu MAX98089"; + + nvidia,audio-routing = + "Headphone Jack", "HPL", + "Headphone Jack", "HPR", + "Int Spk", "SPKL", + "Int Spk", "SPKR", + "Earpiece", "RECL", + "Earpiece", "RECR", + "INA1", "Headset Mic", + "MIC1", "MICBIAS", + "MICBIAS", "Internal Mic 1", + "MIC2", "Internal Mic 2"; + + nvidia,i2s-controller = <&tegra_i2s0>; + nvidia,audio-codec = <&codec>; + + clocks = <&tegra_car TEGRA30_CLK_PLL_A>, + <&tegra_car TEGRA30_CLK_PLL_A_OUT0>, + <&tegra_pmc TEGRA_PMC_CLK_OUT_1>; + clock-names = "pll_a", "pll_a_out0", "mclk"; + };
On Tue, 21 Feb 2023 20:32:06 +0200, Svyatoslav Ryhel wrote:
Add dt-binding for MAX9808x CODEC.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com
.../sound/nvidia,tegra-audio-max9808x.yaml | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 Documentation/devicetree/bindings/sound/nvidia,tegra-audio-max9808x.yaml
Reviewed-by: Rob Herring robh@kernel.org
Add Maxim MAX9808x codec support to the Tegra ASoC machine driver. This codec is found on LG T30 devices like Optimus 4X HD and Optimus Vu.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com --- sound/soc/tegra/Kconfig | 9 ++++++ sound/soc/tegra/tegra_asoc_machine.c | 46 +++++++++++++++++++++++++--- 2 files changed, 51 insertions(+), 4 deletions(-)
diff --git a/sound/soc/tegra/Kconfig b/sound/soc/tegra/Kconfig index ff905e5dcd86..950f490b8d54 100644 --- a/sound/soc/tegra/Kconfig +++ b/sound/soc/tegra/Kconfig @@ -263,6 +263,15 @@ config SND_SOC_TEGRA_MAX98090 Say Y or M here if you want to add support for SoC audio on Tegra boards using the MAX98090 codec, such as Venice2.
+config SND_SOC_TEGRA_MAX98088 + tristate "SoC Audio support for Tegra boards using a MAX9808x codec" + depends on I2C && GPIOLIB + select SND_SOC_TEGRA_MACHINE_DRV + select SND_SOC_MAX98088 + help + Say Y or M here if you want to add support for SoC audio on Tegra + boards using the MAX98088 codec, such as LG X3. + config SND_SOC_TEGRA_RT5677 tristate "SoC Audio support for Tegra boards using a RT5677 codec" depends on I2C && GPIOLIB diff --git a/sound/soc/tegra/tegra_asoc_machine.c b/sound/soc/tegra/tegra_asoc_machine.c index 607800ec07a6..fa0627ea20d7 100644 --- a/sound/soc/tegra/tegra_asoc_machine.c +++ b/sound/soc/tegra/tegra_asoc_machine.c @@ -86,11 +86,11 @@ static int tegra_machine_event(struct snd_soc_dapm_widget *w, gpiod_set_value_cansleep(machine->gpiod_spkr_en, SND_SOC_DAPM_EVENT_ON(event));
- if (!strcmp(w->name, "Mic Jack")) + if (!strcmp(w->name, "Mic Jack") || !strcmp(w->name, "Headset Mic")) gpiod_set_value_cansleep(machine->gpiod_ext_mic_en, SND_SOC_DAPM_EVENT_ON(event));
- if (!strcmp(w->name, "Int Mic")) + if (!strcmp(w->name, "Int Mic") || !strcmp(w->name, "Internal Mic 2")) gpiod_set_value_cansleep(machine->gpiod_int_mic_en, SND_SOC_DAPM_EVENT_ON(event));
@@ -108,11 +108,12 @@ static const struct snd_soc_dapm_widget tegra_machine_dapm_widgets[] = { SND_SOC_DAPM_HP("Headphones", NULL), SND_SOC_DAPM_SPK("Speakers", tegra_machine_event), SND_SOC_DAPM_SPK("Int Spk", tegra_machine_event), + SND_SOC_DAPM_SPK("Earpiece", NULL), SND_SOC_DAPM_MIC("Int Mic", tegra_machine_event), SND_SOC_DAPM_MIC("Mic Jack", tegra_machine_event), SND_SOC_DAPM_MIC("Internal Mic 1", NULL), - SND_SOC_DAPM_MIC("Internal Mic 2", NULL), - SND_SOC_DAPM_MIC("Headset Mic", NULL), + SND_SOC_DAPM_MIC("Internal Mic 2", tegra_machine_event), + SND_SOC_DAPM_MIC("Headset Mic", tegra_machine_event), SND_SOC_DAPM_MIC("Digital Mic", NULL), SND_SOC_DAPM_MIC("Mic", NULL), SND_SOC_DAPM_LINE("Line In Jack", NULL), @@ -123,6 +124,7 @@ static const struct snd_soc_dapm_widget tegra_machine_dapm_widgets[] = { static const struct snd_kcontrol_new tegra_machine_controls[] = { SOC_DAPM_PIN_SWITCH("Speakers"), SOC_DAPM_PIN_SWITCH("Int Spk"), + SOC_DAPM_PIN_SWITCH("Earpiece"), SOC_DAPM_PIN_SWITCH("Int Mic"), SOC_DAPM_PIN_SWITCH("Headset Mic"), SOC_DAPM_PIN_SWITCH("Internal Mic 1"), @@ -713,6 +715,40 @@ static const struct tegra_asoc_data tegra_max98090_data = { .add_hp_jack = true, };
+/* MAX98088 machine */ + +SND_SOC_DAILINK_DEFS(max98088_hifi, + DAILINK_COMP_ARRAY(COMP_EMPTY()), + DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "HiFi")), + DAILINK_COMP_ARRAY(COMP_EMPTY())); + +static struct snd_soc_dai_link tegra_max98088_dai = { + .name = "MAX98088", + .stream_name = "MAX98088 PCM", + .init = tegra_asoc_machine_init, + .dai_fmt = SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBS_CFS, + SND_SOC_DAILINK_REG(max98088_hifi), +}; + +static struct snd_soc_card snd_soc_tegra_max98088 = { + .components = "codec:max98088", + .dai_link = &tegra_max98088_dai, + .num_links = 1, + .fully_routed = true, +}; + +static const struct tegra_asoc_data tegra_max98088_data = { + .mclk_rate = tegra_machine_mclk_rate_12mhz, + .card = &snd_soc_tegra_max98088, + .add_common_dapm_widgets = true, + .add_common_controls = true, + .add_common_snd_ops = true, + .add_mic_jack = true, + .add_hp_jack = true, +}; + /* SGTL5000 machine */
SND_SOC_DAILINK_DEFS(sgtl5000_hifi, @@ -941,6 +977,8 @@ static const struct tegra_asoc_data tegra_rt5631_data = { static const struct of_device_id tegra_machine_of_match[] = { { .compatible = "nvidia,tegra-audio-trimslice", .data = &tegra_trimslice_data }, { .compatible = "nvidia,tegra-audio-max98090", .data = &tegra_max98090_data }, + { .compatible = "nvidia,tegra-audio-max98088", .data = &tegra_max98088_data }, + { .compatible = "nvidia,tegra-audio-max98089", .data = &tegra_max98088_data }, { .compatible = "nvidia,tegra-audio-sgtl5000", .data = &tegra_sgtl5000_data }, { .compatible = "nvidia,tegra-audio-wm9712", .data = &tegra_wm9712_data }, { .compatible = "nvidia,tegra-audio-wm8753", .data = &tegra_wm8753_data },
- fix headset detection in common device tree; - diverge control and detect elements for mic; - use GPIO mic detection on wm8903 devices;
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com --- arch/arm/boot/dts/tegra20-asus-tf101.dts | 8 +++++--- arch/arm/boot/dts/tegra30-asus-tf201.dts | 17 +++++++++++++++++ arch/arm/boot/dts/tegra30-asus-tf300t.dts | 5 ++--- arch/arm/boot/dts/tegra30-asus-tf300tg.dts | 17 +++++++++++++++++ arch/arm/boot/dts/tegra30-asus-tf700t.dts | 17 +++++++++++++++++ .../dts/tegra30-asus-transformer-common.dtsi | 9 +++++---- arch/arm/boot/dts/tegra30-pegatron-chagall.dts | 2 +- 7 files changed, 64 insertions(+), 11 deletions(-)
diff --git a/arch/arm/boot/dts/tegra20-asus-tf101.dts b/arch/arm/boot/dts/tegra20-asus-tf101.dts index c39ddb462ad0..8d0613567e82 100644 --- a/arch/arm/boot/dts/tegra20-asus-tf101.dts +++ b/arch/arm/boot/dts/tegra20-asus-tf101.dts @@ -1179,15 +1179,17 @@ sound { "Int Spk", "RON", "Int Spk", "LOP", "Int Spk", "LON", - "Mic Jack", "MICBIAS", - "IN1L", "Mic Jack"; + "IN1L", "Headset Mic", + "IN2L", "Headset Mic", + "DMICDAT", "Int Mic";
nvidia,i2s-controller = <&tegra_i2s1>; nvidia,audio-codec = <&wm8903>;
nvidia,spkr-en-gpios = <&wm8903 2 GPIO_ACTIVE_HIGH>; nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_LOW>; - nvidia,headset; + nvidia,mic-det-gpios = <&gpio TEGRA_GPIO(X, 1) GPIO_ACTIVE_HIGH>; + nvidia,coupled-mic-hp-det;
clocks = <&tegra_car TEGRA20_CLK_PLL_A>, <&tegra_car TEGRA20_CLK_PLL_A_OUT0>, diff --git a/arch/arm/boot/dts/tegra30-asus-tf201.dts b/arch/arm/boot/dts/tegra30-asus-tf201.dts index 315c6dc068c5..47865deeb88a 100644 --- a/arch/arm/boot/dts/tegra30-asus-tf201.dts +++ b/arch/arm/boot/dts/tegra30-asus-tf201.dts @@ -605,6 +605,23 @@ haptic-feedback { enable-gpios = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_HIGH>; vcc-supply = <&vdd_3v3_sys>; }; + + sound { + compatible = "asus,tegra-audio-rt5631-tf201", + "nvidia,tegra-audio-rt5631"; + nvidia,model = "Asus Transformer Prime TF201 RT5631"; + + nvidia,audio-routing = + "Headphone Jack", "HPOL", + "Headphone Jack", "HPOR", + "Int Spk", "SPOL", + "Int Spk", "SPOR", + "MIC1", "MIC Bias1", + "MIC Bias1", "Headset Mic", + "DMIC", "Int Mic"; + + nvidia,audio-codec = <&rt5631>; + }; };
&emc_icc_dvfs_opp_table { diff --git a/arch/arm/boot/dts/tegra30-asus-tf300t.dts b/arch/arm/boot/dts/tegra30-asus-tf300t.dts index f47434871a5c..78f78cca337a 100644 --- a/arch/arm/boot/dts/tegra30-asus-tf300t.dts +++ b/arch/arm/boot/dts/tegra30-asus-tf300t.dts @@ -1011,13 +1011,12 @@ sound { "Int Spk", "RON", "Int Spk", "LOP", "Int Spk", "LON", - "IN1L", "Mic Jack", - "IN2L", "Mic Jack", + "IN1L", "Headset Mic", + "IN2L", "Headset Mic", "DMICDAT", "Int Mic";
nvidia,audio-codec = <&wm8903>; nvidia,spkr-en-gpios = <&wm8903 2 GPIO_ACTIVE_HIGH>; - nvidia,headset; }; };
diff --git a/arch/arm/boot/dts/tegra30-asus-tf300tg.dts b/arch/arm/boot/dts/tegra30-asus-tf300tg.dts index 96345f821c3d..82c51e177a70 100644 --- a/arch/arm/boot/dts/tegra30-asus-tf300tg.dts +++ b/arch/arm/boot/dts/tegra30-asus-tf300tg.dts @@ -1072,6 +1072,23 @@ timing-667000000 { display-panel { compatible = "innolux,g101ice-l01"; }; + + sound { + compatible = "asus,tegra-audio-rt5631-tf300tg", + "nvidia,tegra-audio-rt5631"; + nvidia,model = "Asus Transformer Pad TF300TG RT5631"; + + nvidia,audio-routing = + "Headphone Jack", "HPOL", + "Headphone Jack", "HPOR", + "Int Spk", "SPOL", + "Int Spk", "SPOR", + "MIC1", "MIC Bias1", + "MIC Bias1", "Headset Mic", + "DMIC", "Int Mic"; + + nvidia,audio-codec = <&rt5631>; + }; };
&emc_icc_dvfs_opp_table { diff --git a/arch/arm/boot/dts/tegra30-asus-tf700t.dts b/arch/arm/boot/dts/tegra30-asus-tf700t.dts index 1a331dec3cfe..766225ebdeab 100644 --- a/arch/arm/boot/dts/tegra30-asus-tf700t.dts +++ b/arch/arm/boot/dts/tegra30-asus-tf700t.dts @@ -812,6 +812,23 @@ vdd_1v2_mipi: regulator-mipi { enable-active-high; vin-supply = <&vdd_3v3_sys>; }; + + sound { + compatible = "asus,tegra-audio-rt5631-tf700t", + "nvidia,tegra-audio-rt5631"; + nvidia,model = "Asus Transformer Infinity TF700T RT5631"; + + nvidia,audio-routing = + "Headphone Jack", "HPOL", + "Headphone Jack", "HPOR", + "Int Spk", "SPOL", + "Int Spk", "SPOR", + "MIC1", "MIC Bias1", + "MIC Bias1", "Headset Mic", + "DMIC", "Int Mic"; + + nvidia,audio-codec = <&rt5631>; + }; };
&emc_icc_dvfs_opp_table { diff --git a/arch/arm/boot/dts/tegra30-asus-transformer-common.dtsi b/arch/arm/boot/dts/tegra30-asus-transformer-common.dtsi index 08ea9cb32d0e..42dae0f4759e 100644 --- a/arch/arm/boot/dts/tegra30-asus-transformer-common.dtsi +++ b/arch/arm/boot/dts/tegra30-asus-transformer-common.dtsi @@ -550,7 +550,7 @@ spi1_mosi_px4 { nvidia,enable-input = <TEGRA_PIN_ENABLE>; };
- spi2_cs1_n_pw2 { + hp_detect { nvidia,pins = "spi2_cs1_n_pw2"; nvidia,function = "spi2"; nvidia,pull = <TEGRA_PIN_PULL_UP>; @@ -558,10 +558,10 @@ spi2_cs1_n_pw2 { nvidia,enable-input = <TEGRA_PIN_ENABLE>; };
- spi2_sck_px2 { + mic_detect { nvidia,pins = "spi2_sck_px2"; nvidia,function = "spi2"; - nvidia,pull = <TEGRA_PIN_PULL_NONE>; + nvidia,pull = <TEGRA_PIN_PULL_UP>; nvidia,tristate = <TEGRA_PIN_DISABLE>; nvidia,enable-input = <TEGRA_PIN_ENABLE>; }; @@ -1674,7 +1674,8 @@ sound { nvidia,i2s-controller = <&tegra_i2s1>;
nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_LOW>; - nvidia,hp-mute-gpios = <&gpio TEGRA_GPIO(X, 2) GPIO_ACTIVE_LOW>; + nvidia,mic-det-gpios = <&gpio TEGRA_GPIO(X, 2) GPIO_ACTIVE_LOW>; + nvidia,coupled-mic-hp-det;
clocks = <&tegra_car TEGRA30_CLK_PLL_A>, <&tegra_car TEGRA30_CLK_PLL_A_OUT0>, diff --git a/arch/arm/boot/dts/tegra30-pegatron-chagall.dts b/arch/arm/boot/dts/tegra30-pegatron-chagall.dts index d9408a90653a..6e24b095713b 100644 --- a/arch/arm/boot/dts/tegra30-pegatron-chagall.dts +++ b/arch/arm/boot/dts/tegra30-pegatron-chagall.dts @@ -2731,7 +2731,7 @@ sound { "Int Spk", "RON", "Int Spk", "LOP", "Int Spk", "LON", - "IN1R", "Mic Jack", + "IN1R", "Headset Mic", "DMICDAT", "Int Mic";
nvidia,i2s-controller = <&tegra_i2s1>;
On Tue, Feb 21, 2023 at 08:32:08PM +0200, Svyatoslav Ryhel wrote:
- fix headset detection in common device tree;
At least this should probably be split out as a separate change so it can be backported as a fix.
- diverge control and detect elements for mic;
- use GPIO mic detection on wm8903 devices;
ср, 22 лют. 2023 р. о 00:27 Mark Brown broonie@kernel.org пише:
On Tue, Feb 21, 2023 at 08:32:08PM +0200, Svyatoslav Ryhel wrote:
- fix headset detection in common device tree;
At least this should probably be split out as a separate change so it can be backported as a fix.
It should not be backported anywhere.
- diverge control and detect elements for mic;
- use GPIO mic detection on wm8903 devices;
On Wed, Feb 22, 2023 at 10:02:09AM +0200, Svyatoslav Ryhel wrote:
ср, 22 лют. 2023 р. о 00:27 Mark Brown broonie@kernel.org пише:
On Tue, Feb 21, 2023 at 08:32:08PM +0200, Svyatoslav Ryhel wrote:
- fix headset detection in common device tree;
At least this should probably be split out as a separate change so it can be backported as a fix.
It should not be backported anywhere.
That's non-obvious. There's certainly changes in here that just look like bug fixes to the existing DT, like the corrections to the DAPM routing.
Add dt-binding for Fortemedia FM34NE DSP.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com --- .../bindings/dsp/fortemedia,dsp.yaml | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 Documentation/devicetree/bindings/dsp/fortemedia,dsp.yaml
diff --git a/Documentation/devicetree/bindings/dsp/fortemedia,dsp.yaml b/Documentation/devicetree/bindings/dsp/fortemedia,dsp.yaml new file mode 100644 index 000000000000..78f30969d9bf --- /dev/null +++ b/Documentation/devicetree/bindings/dsp/fortemedia,dsp.yaml @@ -0,0 +1,95 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/dsp/fortemedia,dsp.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Fortemedia DSP core + +maintainers: + - Svyatoslav Ryhel clamor95@gmail.com + +description: | + Asus Transformer T20/T30 tablet family contains a DSP core + used for advanced noise cancellation. + +properties: + compatible: + items: + - enum: + - asus,tf101-dsp + - asus,tf201-dsp + - asus,tf300t-dsp + - asus,tf700t-dsp + - pegatron,chagall-dsp + + - const: fortemedia,fm34 + + reg: + maxItems: 1 + + bypass-gpios: + maxItems: 1 + + reset-gpios: + maxItems: 1 + + vdd-supply: true + + clocks: + maxItems: 1 + + clock-names: + items: + - const: mclk + + assigned-clocks: + maxItems: 1 + + assigned-clock-parents: + maxItems: 1 + + assigned-clock-rates: + maxItems: 1 + +required: + - compatible + - reg + - vdd-supply + +additionalProperties: false + +examples: + - | + #include <dt-bindings/clock/tegra30-car.h> + #include <dt-bindings/soc/tegra-pmc.h> + + i2c { + #address-cells = <1>; + #size-cells = <0>; + + dsp@60 { + compatible = "asus,tf201-dsp", "fortemedia,fm34"; + reg = <0x60>; + + bypass-gpios = <&gpio 222 0>; + reset-gpios = <&gpio 115 1>; + + vdd-supply = <&vdd_1v8_dsp>; + + clocks = <&tegra_pmc TEGRA_PMC_CLK_OUT_1>; + clock-names = "mclk"; + + assigned-clocks = <&tegra_pmc TEGRA_PMC_CLK_OUT_1>; + assigned-clock-parents = <&tegra_car TEGRA30_CLK_EXTERN1>; + }; + }; + + vdd_1v8_dsp: regulator-dsp { + compatible = "regulator-fixed"; + regulator-name = "vdd_1v8_dsp"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + gpio = <&gpio 165 0>; + enable-active-high; + };
On Tue, Feb 21, 2023 at 08:32:09PM +0200, Svyatoslav Ryhel wrote:
Add dt-binding for Fortemedia FM34NE DSP.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com
.../bindings/dsp/fortemedia,dsp.yaml | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 Documentation/devicetree/bindings/dsp/fortemedia,dsp.yaml
diff --git a/Documentation/devicetree/bindings/dsp/fortemedia,dsp.yaml b/Documentation/devicetree/bindings/dsp/fortemedia,dsp.yaml new file mode 100644 index 000000000000..78f30969d9bf --- /dev/null +++ b/Documentation/devicetree/bindings/dsp/fortemedia,dsp.yaml @@ -0,0 +1,95 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/dsp/fortemedia,dsp.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml#
+title: Fortemedia DSP core
+maintainers:
- Svyatoslav Ryhel clamor95@gmail.com
+description: |
Don't need '|'
- Asus Transformer T20/T30 tablet family contains a DSP core
- used for advanced noise cancellation.
+properties:
- compatible:
- items:
- enum:
- asus,tf101-dsp
- asus,tf201-dsp
- asus,tf300t-dsp
- asus,tf700t-dsp
- pegatron,chagall-dsp
Drop blank line.
- const: fortemedia,fm34
- reg:
- maxItems: 1
- bypass-gpios:
Needs a description what this is.
- maxItems: 1
- reset-gpios:
- maxItems: 1
- vdd-supply: true
- clocks:
- maxItems: 1
- clock-names:
- items:
- const: mclk
- assigned-clocks:
- maxItems: 1
- assigned-clock-parents:
- maxItems: 1
- assigned-clock-rates:
- maxItems: 1
+required:
- compatible
- reg
- vdd-supply
+additionalProperties: false
+examples:
- |
- #include <dt-bindings/clock/tegra30-car.h>
- #include <dt-bindings/soc/tegra-pmc.h>
- i2c {
#address-cells = <1>;
#size-cells = <0>;
dsp@60 {
compatible = "asus,tf201-dsp", "fortemedia,fm34";
reg = <0x60>;
bypass-gpios = <&gpio 222 0>;
reset-gpios = <&gpio 115 1>;
vdd-supply = <&vdd_1v8_dsp>;
clocks = <&tegra_pmc TEGRA_PMC_CLK_OUT_1>;
clock-names = "mclk";
assigned-clocks = <&tegra_pmc TEGRA_PMC_CLK_OUT_1>;
assigned-clock-parents = <&tegra_car TEGRA30_CLK_EXTERN1>;
};
- };
- vdd_1v8_dsp: regulator-dsp {
compatible = "regulator-fixed";
regulator-name = "vdd_1v8_dsp";
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
gpio = <&gpio 165 0>;
enable-active-high;
- };
Drop this node. No need to show providers in consumer examples.
Rob
FM34NE is digital sound processing chip used for active noise suppression mainly on ASUS Transformers.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com --- drivers/staging/Kconfig | 2 + drivers/staging/Makefile | 1 + drivers/staging/dsp/Kconfig | 7 + drivers/staging/dsp/Makefile | 2 + drivers/staging/dsp/dsp-fm34ne.c | 364 +++++++++++++ drivers/staging/dsp/dsp-fm34ne.h | 845 +++++++++++++++++++++++++++++++ 6 files changed, 1221 insertions(+) create mode 100644 drivers/staging/dsp/Kconfig create mode 100644 drivers/staging/dsp/Makefile create mode 100644 drivers/staging/dsp/dsp-fm34ne.c create mode 100644 drivers/staging/dsp/dsp-fm34ne.h
diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index 5cfabd5376cc..cd22b7f36b08 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig @@ -80,4 +80,6 @@ source "drivers/staging/qlge/Kconfig"
source "drivers/staging/vme_user/Kconfig"
+source "drivers/staging/dsp/Kconfig" + endif # STAGING diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index f8c3aa9c2418..a7250a0b5fca 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -2,6 +2,7 @@ # Makefile for staging directory
obj-y += media/ +obj-y += dsp/ obj-$(CONFIG_PRISM2_USB) += wlan-ng/ obj-$(CONFIG_FB_OLPC_DCON) += olpc_dcon/ obj-$(CONFIG_RTL8192U) += rtl8192u/ diff --git a/drivers/staging/dsp/Kconfig b/drivers/staging/dsp/Kconfig new file mode 100644 index 000000000000..d295ea063ad5 --- /dev/null +++ b/drivers/staging/dsp/Kconfig @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0 +config DSP_FM34NE + tristate "DSP FM34NE driver" + depends on I2C && GPIOLIB + help + Say Y or M here if you want to add support for Fortemedia FM34NE + DSP mainly used on ASUS T20/T30 Transformers. diff --git a/drivers/staging/dsp/Makefile b/drivers/staging/dsp/Makefile new file mode 100644 index 000000000000..e60ba3c88e08 --- /dev/null +++ b/drivers/staging/dsp/Makefile @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_DSP_FM34NE) += dsp-fm34ne.o diff --git a/drivers/staging/dsp/dsp-fm34ne.c b/drivers/staging/dsp/dsp-fm34ne.c new file mode 100644 index 000000000000..93a464a7bb4b --- /dev/null +++ b/drivers/staging/dsp/dsp-fm34ne.c @@ -0,0 +1,364 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Fortemedia FM34NE DSP driver + */ + +#include <linux/clk.h> +#include <linux/clk/tegra.h> +#include <linux/delay.h> +#include <linux/gpio/consumer.h> +#include <linux/i2c.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_gpio.h> +#include <linux/of_device.h> +#include <linux/regulator/consumer.h> + +#include "dsp-fm34ne.h" + +#define FM34NE_I2C_CHECK 0xC0 +#define FM34NE_MAX_RETRY 5 + +enum state { + FM34NE_BYPASS, + FM34NE_NS_ENABLE, + FM34NE_NS_DISABLE, + FM34NE_MAX, +}; + +struct fm34ne_dsp_data { + struct i2c_client *client; + + struct gpio_desc *bypass_gpio; + struct gpio_desc *reset_gpio; + + struct clk *dap_mclk; + struct regulator *vdd_supply; + + const struct fm34ne_dsp_devdata *data; +}; + +static int fm34ne_dsp_write_config(struct i2c_client *client, + const u8 *config, size_t size) +{ + int ret, i; + + for (i = 0; i < FM34NE_MAX_RETRY; i++) { + ret = i2c_master_send(client, config, size); + if (ret > 0) + return 0; + + usleep_range(5000, 6000); + } + + return ret; +} + +static int fm34ne_dsp_set_config(struct fm34ne_dsp_data *fm34, int state) +{ + struct device *dev = &fm34->client->dev; + + const u8 *enable_ns_parameter = fm34->data->enable_noise_suppression; + int enable_ns_length = fm34->data->enable_ns_length; + + const u8 *disable_ns_parameter = fm34->data->disable_noise_suppression; + int disable_ns_length = fm34->data->disable_ns_length; + + int ret; + + gpiod_set_value_cansleep(fm34->bypass_gpio, 1); + msleep(20); + + switch (state) { + case FM34NE_NS_ENABLE: + ret = fm34ne_dsp_write_config(fm34->client, enable_parameter, + sizeof(enable_parameter)); + if (ret < 0) { + dev_err(dev, "failed to set DSP enable with %d\n", ret); + goto exit; + } + + ret = fm34ne_dsp_write_config(fm34->client, enable_ns_parameter, + enable_ns_length); + if (ret < 0) { + dev_err(dev, "failed to enable DSP noise suppression with %d\n", ret); + goto exit; + } + + dev_info(dev, "noise suppression enable DSP parameter written\n"); + break; + + case FM34NE_NS_DISABLE: + ret = fm34ne_dsp_write_config(fm34->client, enable_parameter, + sizeof(enable_parameter)); + if (ret < 0) { + dev_err(dev, "failed to set DSP enable with %d\n", ret); + goto exit; + } + + ret = fm34ne_dsp_write_config(fm34->client, disable_ns_parameter, + disable_ns_length); + if (ret < 0) { + dev_err(dev, "failed to disable DSP noise suppression with %d\n", ret); + goto exit; + } + + dev_info(dev, "noise suppression disable DSP parameter written\n"); + break; + + case FM34NE_BYPASS: + default: + ret = fm34ne_dsp_write_config(fm34->client, bypass_parameter, + sizeof(bypass_parameter)); + if (ret < 0) { + dev_err(dev, "failed to set DSP bypass with %d\n", ret); + goto exit; + } + + dev_info(dev, "bypass DSP parameter written\n"); + break; + } + +exit: + gpiod_set_value_cansleep(fm34->bypass_gpio, 0); + + return ret; +} + +static int fm34ne_dsp_set_hw(struct fm34ne_dsp_data *fm34) +{ + struct device *dev = &fm34->client->dev; + int ret; + + ret = clk_prepare_enable(fm34->dap_mclk); + if (ret) { + dev_err(dev, "failed to enable the DSP MCLK: %d\n", ret); + return ret; + } + + ret = regulator_enable(fm34->vdd_supply); + if (ret < 0) { + dev_err(dev, "failed to enable vdd power supply\n"); + return ret; + } + + return 0; +} + +static void fm34ne_dsp_reset(struct fm34ne_dsp_data *fm34) +{ + gpiod_set_value_cansleep(fm34->reset_gpio, 1); + msleep(20); + + gpiod_set_value_cansleep(fm34->reset_gpio, 0); + msleep(100); +} + +static int fm34ne_dsp_init_chip(struct fm34ne_dsp_data *fm34) +{ + const u8 *input_parameter = fm34->data->input_parameter; + int input_parameter_length = fm34->data->input_parameter_length; + int ret; + + ret = fm34ne_dsp_set_hw(fm34); + if (ret) + return ret; + + fm34ne_dsp_reset(fm34); + + gpiod_set_value_cansleep(fm34->bypass_gpio, 1); + msleep(20); + + ret = i2c_smbus_write_byte(fm34->client, FM34NE_I2C_CHECK); + if (ret < 0) { + dev_info(&fm34->client->dev, "initial write failed\n"); + msleep(50); + + fm34ne_dsp_reset(fm34); + gpiod_set_value_cansleep(fm34->bypass_gpio, 0); + + return ret; + } + + ret = fm34ne_dsp_write_config(fm34->client, input_parameter, + input_parameter_length); + if (ret < 0) + return -EINVAL; + + msleep(100); + gpiod_set_value_cansleep(fm34->bypass_gpio, 0); + + dev_info(&fm34->client->dev, "%s detected\n", fm34->data->model); + + /* Constantly set DSP to bypass mode for now */ + ret = fm34ne_dsp_set_config(fm34, FM34NE_BYPASS); + if (ret) + return ret; + + return 0; +} + +static int fm34ne_dsp_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct device *dev = &client->dev; + struct fm34ne_dsp_data *fm34; + int ret; + + fm34 = devm_kzalloc(dev, sizeof(*fm34), GFP_KERNEL); + if (!fm34) + return -ENOMEM; + + i2c_set_clientdata(client, fm34); + fm34->client = client; + + fm34->dap_mclk = devm_clk_get_optional(dev, "mclk"); + if (IS_ERR(fm34->dap_mclk)) + return dev_err_probe(dev, PTR_ERR(fm34->dap_mclk), + "can't retrieve DSP MCLK\n"); + + fm34->vdd_supply = devm_regulator_get(dev, "vdd"); + if (IS_ERR(fm34->vdd_supply)) + return dev_err_probe(dev, PTR_ERR(fm34->vdd_supply), + "failed to get vdd regulator\n"); + + fm34->reset_gpio = devm_gpiod_get_optional(dev, "reset", + GPIOD_OUT_LOW); + if (IS_ERR(fm34->reset_gpio)) + return dev_err_probe(dev, PTR_ERR(fm34->reset_gpio), + "failed to get reset GPIO\n"); + + /* + * Bypass gpio is used to set audio into bypass mode + * in relation to dsp to be able to program it. Once + * programming is done, bypass gpio has to be set to + * low to return dsp into audio processing. + */ + fm34->bypass_gpio = devm_gpiod_get_optional(dev, "bypass", + GPIOD_OUT_LOW); + if (IS_ERR(fm34->bypass_gpio)) + return dev_err_probe(dev, PTR_ERR(fm34->bypass_gpio), + "failed to get bypass GPIO\n"); + + fm34->data = of_device_get_match_data(dev); + if (!fm34->data) + return -ENODEV; + + ret = fm34ne_dsp_init_chip(fm34); + if (ret) + return dev_err_probe(dev, ret, + "failed to init DSP chip\n"); + + return 0; +} + +static int fm34ne_dsp_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct fm34ne_dsp_data *fm34 = i2c_get_clientdata(client); + + gpiod_set_value_cansleep(fm34->bypass_gpio, 0); + + regulator_disable(fm34->vdd_supply); + + clk_disable_unprepare(fm34->dap_mclk); + + return 0; +} + +static int fm34ne_dsp_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct fm34ne_dsp_data *fm34 = i2c_get_clientdata(client); + int ret; + + ret = fm34ne_dsp_init_chip(fm34); + if (ret) + dev_err(&client->dev, "failed to re-init DSP chip with %d\n", ret); + + return 0; +} + +static DEFINE_SIMPLE_DEV_PM_OPS(fm34ne_dsp_pm_ops, + fm34ne_dsp_suspend, fm34ne_dsp_resume); + +static const struct fm34ne_dsp_devdata tf101_dsp_data = { + .model = "ASUS Eee Pad Trnasformer TF101", + .input_parameter = TF101_input_parameter, + .input_parameter_length = sizeof(TF101_input_parameter), + .enable_noise_suppression = TF101_enable_NS, + .enable_ns_length = sizeof(TF101_enable_NS), + .disable_noise_suppression = TF101_disable_NS, + .disable_ns_length = sizeof(TF101_disable_NS), +}; + +static const struct fm34ne_dsp_devdata tf201_dsp_data = { + .model = "ASUS Transformer Prime TF201", + .input_parameter = TF201_input_parameter, + .input_parameter_length = sizeof(TF201_input_parameter), + .enable_noise_suppression = TF201_enable_NS, + .enable_ns_length = sizeof(TF201_enable_NS), + .disable_noise_suppression = TF201_disable_NS, + .disable_ns_length = sizeof(TF201_disable_NS), +}; + +static const struct fm34ne_dsp_devdata tf300t_dsp_data = { + .model = "ASUS Transformer PAD TF300T", + .input_parameter = TF300T_input_parameter, + .input_parameter_length = sizeof(TF300T_input_parameter), + .enable_noise_suppression = TF201_enable_NS, + .enable_ns_length = sizeof(TF201_enable_NS), + .disable_noise_suppression = TF201_disable_NS, + .disable_ns_length = sizeof(TF201_disable_NS), +}; + +static const struct fm34ne_dsp_devdata tf700t_dsp_data = { + .model = "ASUS Transformer Infinity TF700T", + .input_parameter = TF700T_input_parameter, + .input_parameter_length = sizeof(TF700T_input_parameter), + .enable_noise_suppression = TF700T_enable_NS, + .enable_ns_length = sizeof(TF700T_enable_NS), + .disable_noise_suppression = TF700T_disable_NS, + .disable_ns_length = sizeof(TF700T_disable_NS), +}; + +static const struct fm34ne_dsp_devdata chagall_dsp_data = { + .model = "Pegatron Chagall", + .input_parameter = TF300T_input_parameter, + .input_parameter_length = sizeof(TF300T_input_parameter), + .enable_noise_suppression = TF201_enable_NS, + .enable_ns_length = sizeof(TF201_enable_NS), + .disable_noise_suppression = TF201_disable_NS, + .disable_ns_length = sizeof(TF201_disable_NS), +}; + +static const struct of_device_id fm34ne_dsp_match[] = { + { .compatible = "asus,tf101-dsp", .data = &tf101_dsp_data }, + { .compatible = "asus,tf201-dsp", .data = &tf201_dsp_data }, + { .compatible = "asus,tf300t-dsp", .data = &tf300t_dsp_data }, + { .compatible = "asus,tf700t-dsp", .data = &tf700t_dsp_data }, + { .compatible = "pegatron,chagall-dsp", .data = &chagall_dsp_data }, + { } +}; +MODULE_DEVICE_TABLE(of, fm34ne_dsp_match); + +static const struct i2c_device_id fm34ne_dsp_id[] = { + { "dsp_fm34ne", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, fm34ne_dsp_id); + +static struct i2c_driver fm34ne_dsp_driver = { + .driver = { + .name = "fm34ne-dsp", + .pm = pm_sleep_ptr(&fm34ne_dsp_pm_ops), + .of_match_table = fm34ne_dsp_match, + }, + .probe = fm34ne_dsp_probe, + .id_table = fm34ne_dsp_id, +}; +module_i2c_driver(fm34ne_dsp_driver); + +MODULE_AUTHOR("Svyatoslav Ryhel clamor95@gmail.com"); +MODULE_DESCRIPTION("Fortemedia FM34NE DSP driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/staging/dsp/dsp-fm34ne.h b/drivers/staging/dsp/dsp-fm34ne.h new file mode 100644 index 000000000000..428ac33dd310 --- /dev/null +++ b/drivers/staging/dsp/dsp-fm34ne.h @@ -0,0 +1,845 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#ifndef __DSP_FM34NE_H__ +#define __DSP_FM34NE_H__ + +struct fm34ne_dsp_devdata { + const char *model; + + const u8 *input_parameter; + int input_parameter_length; + + const u8 *enable_noise_suppression; + int enable_ns_length; + + const u8 *disable_noise_suppression; + int disable_ns_length; +}; + +/* Common section */ +static const u8 bypass_parameter[] = { + 0xC0, + 0xFC, 0xF3, 0x3B, 0x23, 0x00, 0x00, 0x04 +}; + +static const u8 enable_parameter[] = { + 0xC0, + 0xFC, 0xF3, 0x3B, 0x23, 0x00, 0x00, 0x00 +}; + +/* TF201 section */ +static const u8 TF201_input_parameter[] = { + 0xC0, + 0xFC, 0xF3, 0x68, 0x64, 0x04, + 0xFC, 0xF3, 0x0D, 0x10, 0x00, 0x90, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x01, 0x82, 0x30, 0x50, + 0xFC, 0xF3, 0x0D, 0x10, 0x02, 0x27, 0x90, 0x9F, + 0xFC, 0xF3, 0x0D, 0x10, 0x03, 0x19, 0x00, 0xA0, + 0xFC, 0xF3, 0x0D, 0x10, 0x04, 0x1C, 0x5A, 0xAF, + 0xFC, 0xF3, 0x0D, 0x10, 0x05, 0x90, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x06, 0x80, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x07, 0x1C, 0x5A, 0xAF, + 0xFC, 0xF3, 0x0D, 0x10, 0x08, 0x90, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x09, 0x19, 0x01, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x0A, 0x27, 0x90, 0x5F, + 0xFC, 0xF3, 0x0D, 0x10, 0x0B, 0x19, 0x01, 0x10, + 0xFC, 0xF3, 0x0D, 0x10, 0x0C, 0x1C, 0x58, 0xEF, + 0xFC, 0xF3, 0x0D, 0x10, 0x0D, 0x90, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x0E, 0x80, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x0F, 0x1C, 0x58, 0xEF, + 0xFC, 0xF3, 0x0D, 0x10, 0x10, 0x90, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x11, 0x82, 0x2D, 0x20, + 0xFC, 0xF3, 0x0D, 0x10, 0x12, 0x27, 0x98, 0x5F, + 0xFC, 0xF3, 0x0D, 0x10, 0x13, 0x19, 0x01, 0x80, + 0xFC, 0xF3, 0x0D, 0x10, 0x14, 0x80, 0x50, 0x5A, + 0xFC, 0xF3, 0x0D, 0x10, 0x15, 0x90, 0x50, 0x3A, + 0xFC, 0xF3, 0x0D, 0x10, 0x16, 0x80, 0x50, 0x6F, + 0xFC, 0xF3, 0x0D, 0x10, 0x17, 0x90, 0x50, 0x4F, + 0xFC, 0xF3, 0x0D, 0x10, 0x18, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x19, 0x19, 0x00, 0x6F, + 0xFC, 0xF3, 0x0D, 0x10, 0x1A, 0x80, 0x00, 0xAC, + 0xFC, 0xF3, 0x0D, 0x10, 0x1B, 0x26, 0x7C, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x1C, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x1D, 0x19, 0x1D, 0x82, + 0xFC, 0xF3, 0x0D, 0x10, 0x1E, 0x19, 0x1C, 0xEF, + 0xFC, 0xF3, 0x0D, 0x10, 0x1F, 0x80, 0x53, 0x9A, + 0xFC, 0xF3, 0x0D, 0x10, 0x20, 0x93, 0xE2, 0xAA, + 0xFC, 0xF3, 0x0D, 0x10, 0x21, 0x80, 0x4F, 0xBA, + 0xFC, 0xF3, 0x0D, 0x10, 0x22, 0x22, 0x7A, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x23, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x24, 0x18, 0x2F, 0xD0, + 0xFC, 0xF3, 0x0D, 0x10, 0x25, 0x94, 0x4F, 0xB6, + 0xFC, 0xF3, 0x0D, 0x10, 0x26, 0x80, 0x4F, 0x6A, + 0xFC, 0xF3, 0x0D, 0x10, 0x27, 0x26, 0x7A, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x28, 0x18, 0x2F, 0x80, + 0xFC, 0xF3, 0x0D, 0x10, 0x29, 0x18, 0x2B, 0xCF, + 0xFC, 0xF3, 0x0D, 0x10, 0x2A, 0x95, 0x62, 0x06, + 0xFC, 0xF3, 0x0D, 0x10, 0x2B, 0x95, 0x61, 0x46, + 0xFC, 0xF3, 0x0D, 0x10, 0x2C, 0x40, 0xFA, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x2D, 0x40, 0xE5, 0xB0, + 0xFC, 0xF3, 0x0D, 0x10, 0x2E, 0x82, 0x30, 0x14, + 0xFC, 0xF3, 0x0D, 0x10, 0x2F, 0x27, 0x00, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x30, 0x22, 0x78, 0x00, + 0xFC, 0xF3, 0x0D, 0x10, 0x31, 0x83, 0xFD, 0x44, + 0xFC, 0xF3, 0x0D, 0x10, 0x32, 0x26, 0xE2, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x33, 0x19, 0x03, 0x90, + 0xFC, 0xF3, 0x0D, 0x10, 0x34, 0x93, 0xFD, 0x4A, + 0xFC, 0xF3, 0x0D, 0x10, 0x35, 0x83, 0xFD, 0x5A, + 0xFC, 0xF3, 0x0D, 0x10, 0x36, 0x23, 0xA2, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x37, 0x93, 0xFD, 0x5A, + 0xFC, 0xF3, 0x0D, 0x10, 0x38, 0x00, 0x00, 0x00, + 0xFC, 0xF3, 0x0D, 0x10, 0x39, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x3A, 0x18, 0x3F, 0x7F, + 0xFC, 0xF3, 0x0D, 0x10, 0x3B, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x3C, 0x19, 0x6C, 0xA4, + 0xFC, 0xF3, 0x0D, 0x10, 0x3D, 0x19, 0x66, 0x7F, + 0xFC, 0xF3, 0x0D, 0x10, 0x3E, 0x80, 0x79, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x3F, 0x82, 0x2D, 0x2F, + 0xFC, 0xF3, 0x0D, 0x10, 0x40, 0x27, 0x97, 0x9F, + 0xFC, 0xF3, 0x0D, 0x10, 0x41, 0x19, 0x04, 0x40, + 0xFC, 0xF3, 0x0D, 0x10, 0x42, 0x94, 0x7B, 0xD6, + 0xFC, 0xF3, 0x0D, 0x10, 0x43, 0x80, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x44, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x45, 0x18, 0x48, 0xDF, + 0xFC, 0xF3, 0x0D, 0x10, 0x46, 0x38, 0x00, 0x87, + 0xFC, 0xF3, 0x0D, 0x10, 0x47, 0x09, 0x00, 0x1B, + 0xFC, 0xF3, 0x0D, 0x10, 0x48, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x49, 0x18, 0x2D, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4A, 0x18, 0x21, 0x5F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4B, 0x88, 0x4F, 0x47, + 0xFC, 0xF3, 0x0D, 0x10, 0x4C, 0x82, 0x2A, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x4D, 0x22, 0x62, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4E, 0x26, 0x62, 0x7F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4F, 0x19, 0x05, 0x25, + 0xFC, 0xF3, 0x0D, 0x10, 0x50, 0x3B, 0xFF, 0xC7, + 0xFC, 0xF3, 0x0D, 0x10, 0x51, 0x19, 0x05, 0x3F, + 0xFC, 0xF3, 0x0D, 0x10, 0x52, 0x0D, 0x01, 0xA6, + 0xFC, 0xF3, 0x0D, 0x10, 0x53, 0x92, 0x2A, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x54, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x55, 0x18, 0x23, 0x2F, + 0xFC, 0xF3, 0x0D, 0x10, 0x56, 0x96, 0x2A, 0xA1, + 0xFC, 0xF3, 0x0D, 0x10, 0x57, 0x96, 0x2A, 0xB0, + 0xFC, 0xF3, 0x0D, 0x10, 0x58, 0x9A, 0x2A, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x59, 0x9A, 0x2A, 0xD7, + 0xFC, 0xF3, 0x0D, 0x10, 0x5A, 0x96, 0x2A, 0xE8, + 0xFC, 0xF3, 0x0D, 0x10, 0x5B, 0x38, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x5C, 0x83, 0xFF, 0xAA, + 0xFC, 0xF3, 0x0D, 0x10, 0x5D, 0x3B, 0x20, 0x02, + 0xFC, 0xF3, 0x0D, 0x10, 0x5E, 0x36, 0x2B, 0x01, + 0xFC, 0xF3, 0x0D, 0x10, 0x5F, 0x36, 0x2B, 0x60, + 0xFC, 0xF3, 0x0D, 0x10, 0x60, 0x1C, 0x72, 0x2F, + 0xFC, 0xF3, 0x0D, 0x10, 0x61, 0x93, 0xFF, 0x9A, + 0xFC, 0xF3, 0x0D, 0x10, 0x62, 0x93, 0xFF, 0xAA, + 0xFC, 0xF3, 0x0D, 0x10, 0x63, 0x86, 0x2A, 0xA1, + 0xFC, 0xF3, 0x0D, 0x10, 0x64, 0x86, 0x2A, 0xB0, + 0xFC, 0xF3, 0x0D, 0x10, 0x65, 0x8A, 0x2A, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x66, 0x8A, 0x2A, 0xD7, + 0xFC, 0xF3, 0x0D, 0x10, 0x67, 0x86, 0x2A, 0xE8, + 0xFC, 0xF3, 0x0D, 0x10, 0x68, 0x0D, 0x08, 0x28, + 0xFC, 0xF3, 0x0D, 0x10, 0x69, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x6A, 0x18, 0x24, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x6B, 0x83, 0xFC, 0xFA, + 0xFC, 0xF3, 0x0D, 0x10, 0x6C, 0x23, 0x8A, 0xBF, + 0xFC, 0xF3, 0x0D, 0x10, 0x6D, 0x82, 0x2D, 0x2F, + 0xFC, 0xF3, 0x0D, 0x10, 0x6E, 0x27, 0x97, 0xDF, + 0xFC, 0xF3, 0x0D, 0x10, 0x6F, 0x23, 0xAA, 0x91, + 0xFC, 0xF3, 0x0D, 0x10, 0x70, 0x93, 0xFC, 0xFA, + 0xFC, 0xF3, 0x0D, 0x10, 0x71, 0x83, 0x80, 0x30, + 0xFC, 0xF3, 0x0D, 0x10, 0x72, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x73, 0x18, 0x3E, 0x9F, + 0xFC, 0xF3, 0x0D, 0x10, 0x74, 0x80, 0x7A, 0x4A, + 0xFC, 0xF3, 0x0D, 0x10, 0x75, 0x19, 0x07, 0xE2, + 0xFC, 0xF3, 0x0D, 0x10, 0x76, 0x23, 0x3E, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x77, 0x0D, 0x00, 0xEA, + 0xFC, 0xF3, 0x0D, 0x10, 0x78, 0x80, 0x7B, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x79, 0x38, 0x7E, 0x02, + 0xFC, 0xF3, 0x0D, 0x10, 0x7A, 0x1C, 0x76, 0x9F, + 0xFC, 0xF3, 0x0D, 0x10, 0x7B, 0x90, 0x7B, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x7C, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x7D, 0x19, 0x75, 0xCF, + 0xFC, 0xF3, 0x0D, 0x10, 0x7E, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x7F, 0x19, 0x75, 0x9F, + 0xFC, 0xF3, 0x68, 0x64, 0x00, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA0, 0x91, 0xCB, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB0, 0x50, 0x1A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA1, 0x82, 0xF3, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB1, 0x02, 0xF5, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA2, 0x82, 0xB5, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB2, 0x50, 0x1F, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA3, 0x83, 0xF4, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB3, 0x50, 0x2A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA4, 0x96, 0x66, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB4, 0x50, 0x3B, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA5, 0x82, 0xCC, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB5, 0x50, 0x46, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA6, 0xC2, 0xCC, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB6, 0x50, 0x46, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA7, 0xC2, 0x10, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB7, 0x50, 0x4A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA8, 0x82, 0x10, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB8, 0x50, 0x4A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA9, 0x82, 0x31, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB9, 0x50, 0x4B, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAA, 0xC2, 0x31, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBA, 0x50, 0x4B, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAB, 0x82, 0x3F, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBB, 0x50, 0x56, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAC, 0xC2, 0x3F, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBC, 0x50, 0x56, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAD, 0x83, 0xE8, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBD, 0x50, 0x6B, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAE, 0x97, 0x58, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBE, 0x50, 0x74, + 0xFC, 0xF3, 0x3B, 0x22, 0xF8, 0x80, 0x05, + 0xFC, 0xF3, 0x3B, 0x22, 0xC8, 0x00, 0x29, + 0xFC, 0xF3, 0x3B, 0x22, 0xEE, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x22, 0xF9, 0x08, 0x5F, + 0xFC, 0xF3, 0x3B, 0x22, 0xFA, 0x24, 0x81, + 0xFC, 0xF3, 0x3B, 0x23, 0x05, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x01, 0x00, 0x02, + 0xFC, 0xF3, 0x3B, 0x23, 0x07, 0xF0, 0xF0, + 0xFC, 0xF3, 0x3B, 0x23, 0x09, 0x08, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x0D, 0x01, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x0C, 0x08, 0x00, + 0xFC, 0xF3, 0x3B, 0x22, 0xF2, 0x00, 0x44, + 0xFC, 0xF3, 0x3B, 0x22, 0xF6, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x22, 0xC6, 0x00, 0x06, + 0xFC, 0xF3, 0x3B, 0x22, 0xC7, 0x00, 0x08, + 0xFC, 0xF3, 0x3B, 0x22, 0xD2, 0x8A, 0x94, + 0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x01, + 0xFC, 0xF3, 0x3B, 0x23, 0x00, 0x00, 0x04, + 0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x23, 0x10, + 0xFC, 0xF3, 0x3B, 0x23, 0x2F, 0x01, 0x10, + 0xFC, 0xF3, 0x3B, 0x23, 0x39, 0x00, 0x06, + 0xFC, 0xF3, 0x3B, 0x23, 0xCF, 0x01, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0xD0, 0x06, 0x20, + 0xFC, 0xF3, 0x3B, 0x23, 0xD5, 0x3C, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x6E, 0x20, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x33, 0x02, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0xB3, 0x00, 0x0A, + 0xFC, 0xF3, 0x3B, 0x23, 0xB4, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x70, 0x40, 0x00, + 0xFC, 0xF3, 0x3B, 0x3F, 0xD2, 0x00, 0x32, + 0xFC, 0xF3, 0x3B, 0x22, 0xFB, 0x00, 0x00 +}; + +static const u8 TF201_enable_NS[] = { + 0xC0, + 0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x01, + 0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x23, 0x01 +}; + +static const u8 TF201_disable_NS[] = { + 0xC0, + 0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x00, 0x10 +}; + +/* TF700T section */ +static const u8 TF700T_input_parameter[] = { + 0xC0, + 0xFC, 0xF3, 0x68, 0x64, 0x04, + 0xFC, 0xF3, 0x0D, 0x10, 0x00, 0x90, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x01, 0x82, 0x30, 0x50, + 0xFC, 0xF3, 0x0D, 0x10, 0x02, 0x27, 0x90, 0x9F, + 0xFC, 0xF3, 0x0D, 0x10, 0x03, 0x19, 0x00, 0xA0, + 0xFC, 0xF3, 0x0D, 0x10, 0x04, 0x1C, 0x5A, 0xAF, + 0xFC, 0xF3, 0x0D, 0x10, 0x05, 0x90, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x06, 0x80, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x07, 0x1C, 0x5A, 0xAF, + 0xFC, 0xF3, 0x0D, 0x10, 0x08, 0x90, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x09, 0x19, 0x01, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x0A, 0x27, 0x90, 0x5F, + 0xFC, 0xF3, 0x0D, 0x10, 0x0B, 0x19, 0x01, 0x10, + 0xFC, 0xF3, 0x0D, 0x10, 0x0C, 0x1C, 0x58, 0xEF, + 0xFC, 0xF3, 0x0D, 0x10, 0x0D, 0x90, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x0E, 0x80, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x0F, 0x1C, 0x58, 0xEF, + 0xFC, 0xF3, 0x0D, 0x10, 0x10, 0x90, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x11, 0x82, 0x2D, 0x20, + 0xFC, 0xF3, 0x0D, 0x10, 0x12, 0x27, 0x98, 0x5F, + 0xFC, 0xF3, 0x0D, 0x10, 0x13, 0x19, 0x01, 0x80, + 0xFC, 0xF3, 0x0D, 0x10, 0x14, 0x80, 0x50, 0x5A, + 0xFC, 0xF3, 0x0D, 0x10, 0x15, 0x90, 0x50, 0x3A, + 0xFC, 0xF3, 0x0D, 0x10, 0x16, 0x80, 0x50, 0x6F, + 0xFC, 0xF3, 0x0D, 0x10, 0x17, 0x90, 0x50, 0x4F, + 0xFC, 0xF3, 0x0D, 0x10, 0x18, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x19, 0x19, 0x00, 0x6F, + 0xFC, 0xF3, 0x0D, 0x10, 0x1A, 0x80, 0x00, 0xAC, + 0xFC, 0xF3, 0x0D, 0x10, 0x1B, 0x26, 0x7C, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x1C, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x1D, 0x19, 0x1D, 0x82, + 0xFC, 0xF3, 0x0D, 0x10, 0x1E, 0x19, 0x1C, 0xEF, + 0xFC, 0xF3, 0x0D, 0x10, 0x1F, 0x80, 0x53, 0x9A, + 0xFC, 0xF3, 0x0D, 0x10, 0x20, 0x93, 0xE2, 0xAA, + 0xFC, 0xF3, 0x0D, 0x10, 0x21, 0x80, 0x4F, 0xBA, + 0xFC, 0xF3, 0x0D, 0x10, 0x22, 0x22, 0x7A, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x23, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x24, 0x18, 0x2F, 0xD0, + 0xFC, 0xF3, 0x0D, 0x10, 0x25, 0x94, 0x4F, 0xB6, + 0xFC, 0xF3, 0x0D, 0x10, 0x26, 0x80, 0x4F, 0x6A, + 0xFC, 0xF3, 0x0D, 0x10, 0x27, 0x26, 0x7A, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x28, 0x18, 0x2F, 0x80, + 0xFC, 0xF3, 0x0D, 0x10, 0x29, 0x18, 0x2B, 0xCF, + 0xFC, 0xF3, 0x0D, 0x10, 0x2A, 0x95, 0x62, 0x06, + 0xFC, 0xF3, 0x0D, 0x10, 0x2B, 0x95, 0x61, 0x46, + 0xFC, 0xF3, 0x0D, 0x10, 0x2C, 0x40, 0xFA, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x2D, 0x40, 0xE5, 0xB0, + 0xFC, 0xF3, 0x0D, 0x10, 0x2E, 0x82, 0x30, 0x14, + 0xFC, 0xF3, 0x0D, 0x10, 0x2F, 0x27, 0x00, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x30, 0x22, 0x78, 0x00, + 0xFC, 0xF3, 0x0D, 0x10, 0x31, 0x83, 0xFD, 0x44, + 0xFC, 0xF3, 0x0D, 0x10, 0x32, 0x26, 0xE2, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x33, 0x19, 0x03, 0x90, + 0xFC, 0xF3, 0x0D, 0x10, 0x34, 0x93, 0xFD, 0x4A, + 0xFC, 0xF3, 0x0D, 0x10, 0x35, 0x83, 0xFD, 0x5A, + 0xFC, 0xF3, 0x0D, 0x10, 0x36, 0x23, 0xA2, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x37, 0x93, 0xFD, 0x5A, + 0xFC, 0xF3, 0x0D, 0x10, 0x38, 0x00, 0x00, 0x00, + 0xFC, 0xF3, 0x0D, 0x10, 0x39, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x3A, 0x18, 0x3F, 0x7F, + 0xFC, 0xF3, 0x0D, 0x10, 0x3B, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x3C, 0x19, 0x6C, 0xA4, + 0xFC, 0xF3, 0x0D, 0x10, 0x3D, 0x19, 0x66, 0x7F, + 0xFC, 0xF3, 0x0D, 0x10, 0x3E, 0x80, 0x79, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x3F, 0x82, 0x2D, 0x2F, + 0xFC, 0xF3, 0x0D, 0x10, 0x40, 0x27, 0x97, 0x9F, + 0xFC, 0xF3, 0x0D, 0x10, 0x41, 0x19, 0x04, 0x40, + 0xFC, 0xF3, 0x0D, 0x10, 0x42, 0x94, 0x7B, 0xD6, + 0xFC, 0xF3, 0x0D, 0x10, 0x43, 0x80, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x44, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x45, 0x18, 0x48, 0xDF, + 0xFC, 0xF3, 0x0D, 0x10, 0x46, 0x38, 0x00, 0x87, + 0xFC, 0xF3, 0x0D, 0x10, 0x47, 0x09, 0x00, 0x1B, + 0xFC, 0xF3, 0x0D, 0x10, 0x48, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x49, 0x18, 0x2D, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4A, 0x18, 0x21, 0x5F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4B, 0x88, 0x4F, 0x47, + 0xFC, 0xF3, 0x0D, 0x10, 0x4C, 0x82, 0x2A, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x4D, 0x22, 0x62, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4E, 0x26, 0x62, 0x7F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4F, 0x19, 0x05, 0x25, + 0xFC, 0xF3, 0x0D, 0x10, 0x50, 0x3B, 0xFF, 0xC7, + 0xFC, 0xF3, 0x0D, 0x10, 0x51, 0x19, 0x05, 0x3F, + 0xFC, 0xF3, 0x0D, 0x10, 0x52, 0x0D, 0x01, 0xA6, + 0xFC, 0xF3, 0x0D, 0x10, 0x53, 0x92, 0x2A, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x54, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x55, 0x18, 0x23, 0x2F, + 0xFC, 0xF3, 0x0D, 0x10, 0x56, 0x96, 0x2A, 0xA1, + 0xFC, 0xF3, 0x0D, 0x10, 0x57, 0x96, 0x2A, 0xB0, + 0xFC, 0xF3, 0x0D, 0x10, 0x58, 0x9A, 0x2A, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x59, 0x9A, 0x2A, 0xD7, + 0xFC, 0xF3, 0x0D, 0x10, 0x5A, 0x96, 0x2A, 0xE8, + 0xFC, 0xF3, 0x0D, 0x10, 0x5B, 0x38, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x5C, 0x83, 0xFF, 0xAA, + 0xFC, 0xF3, 0x0D, 0x10, 0x5D, 0x3B, 0x20, 0x02, + 0xFC, 0xF3, 0x0D, 0x10, 0x5E, 0x36, 0x2B, 0x01, + 0xFC, 0xF3, 0x0D, 0x10, 0x5F, 0x36, 0x2B, 0x60, + 0xFC, 0xF3, 0x0D, 0x10, 0x60, 0x1C, 0x72, 0x2F, + 0xFC, 0xF3, 0x0D, 0x10, 0x61, 0x93, 0xFF, 0x9A, + 0xFC, 0xF3, 0x0D, 0x10, 0x62, 0x93, 0xFF, 0xAA, + 0xFC, 0xF3, 0x0D, 0x10, 0x63, 0x86, 0x2A, 0xA1, + 0xFC, 0xF3, 0x0D, 0x10, 0x64, 0x86, 0x2A, 0xB0, + 0xFC, 0xF3, 0x0D, 0x10, 0x65, 0x8A, 0x2A, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x66, 0x8A, 0x2A, 0xD7, + 0xFC, 0xF3, 0x0D, 0x10, 0x67, 0x86, 0x2A, 0xE8, + 0xFC, 0xF3, 0x0D, 0x10, 0x68, 0x0D, 0x08, 0x28, + 0xFC, 0xF3, 0x0D, 0x10, 0x69, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x6A, 0x18, 0x24, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x6B, 0x83, 0xFC, 0xFA, + 0xFC, 0xF3, 0x0D, 0x10, 0x6C, 0x23, 0x8A, 0xBF, + 0xFC, 0xF3, 0x0D, 0x10, 0x6D, 0x82, 0x2D, 0x2F, + 0xFC, 0xF3, 0x0D, 0x10, 0x6E, 0x27, 0x97, 0xDF, + 0xFC, 0xF3, 0x0D, 0x10, 0x6F, 0x23, 0xAA, 0x91, + 0xFC, 0xF3, 0x0D, 0x10, 0x70, 0x93, 0xFC, 0xFA, + 0xFC, 0xF3, 0x0D, 0x10, 0x71, 0x83, 0x80, 0x30, + 0xFC, 0xF3, 0x0D, 0x10, 0x72, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x73, 0x18, 0x3E, 0x9F, + 0xFC, 0xF3, 0x0D, 0x10, 0x74, 0x80, 0x7A, 0x4A, + 0xFC, 0xF3, 0x0D, 0x10, 0x75, 0x19, 0x07, 0xE2, + 0xFC, 0xF3, 0x0D, 0x10, 0x76, 0x23, 0x3E, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x77, 0x0D, 0x00, 0xEA, + 0xFC, 0xF3, 0x0D, 0x10, 0x78, 0x80, 0x7B, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x79, 0x38, 0x7E, 0x02, + 0xFC, 0xF3, 0x0D, 0x10, 0x7A, 0x1C, 0x76, 0x9F, + 0xFC, 0xF3, 0x0D, 0x10, 0x7B, 0x90, 0x7B, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x7C, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x7D, 0x19, 0x75, 0xCF, + 0xFC, 0xF3, 0x0D, 0x10, 0x7E, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x7F, 0x19, 0x75, 0x9F, + 0xFC, 0xF3, 0x68, 0x64, 0x00, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA0, 0x91, 0xCB, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB0, 0x50, 0x1A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA1, 0x82, 0xF3, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB1, 0x02, 0xF5, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA2, 0x82, 0xB5, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB2, 0x50, 0x1F, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA3, 0x83, 0xF4, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB3, 0x50, 0x2A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA4, 0x96, 0x66, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB4, 0x50, 0x3B, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA5, 0x82, 0xCC, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB5, 0x50, 0x46, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA6, 0xC2, 0xCC, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB6, 0x50, 0x46, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA7, 0xC2, 0x10, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB7, 0x50, 0x4A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA8, 0x82, 0x10, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB8, 0x50, 0x4A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA9, 0x82, 0x31, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB9, 0x50, 0x4B, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAA, 0xC2, 0x31, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBA, 0x50, 0x4B, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAB, 0x82, 0x3F, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBB, 0x50, 0x56, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAC, 0xC2, 0x3F, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBC, 0x50, 0x56, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAD, 0x83, 0xE8, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBD, 0x50, 0x6B, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAE, 0x97, 0x58, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBE, 0x50, 0x74, + 0xFC, 0xF3, 0x3B, 0x22, 0xF8, 0x80, 0x05, + 0xFC, 0xF3, 0x3B, 0x22, 0xC8, 0x00, 0x29, + 0xFC, 0xF3, 0x3B, 0x22, 0xEE, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x22, 0xF9, 0x08, 0x5F, + 0xFC, 0xF3, 0x3B, 0x22, 0xFA, 0x24, 0x81, + 0xFC, 0xF3, 0x3B, 0x23, 0x05, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x01, 0x00, 0x02, + 0xFC, 0xF3, 0x3B, 0x23, 0x07, 0xF0, 0xF0, + 0xFC, 0xF3, 0x3B, 0x23, 0x09, 0x08, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x0D, 0x01, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x0C, 0x0E, 0x20, + 0xFC, 0xF3, 0x3B, 0x22, 0xF2, 0x00, 0x44, + 0xFC, 0xF3, 0x3B, 0x22, 0xF6, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x22, 0xC6, 0x00, 0x06, + 0xFC, 0xF3, 0x3B, 0x22, 0xC7, 0x00, 0x08, + 0xFC, 0xF3, 0x3B, 0x22, 0xD2, 0x8A, 0x94, + 0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x01, + 0xFC, 0xF3, 0x3B, 0x23, 0x00, 0x00, 0x04, + 0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x23, 0x10, + 0xFC, 0xF3, 0x3B, 0x23, 0x2F, 0x01, 0x10, + 0xFC, 0xF3, 0x3B, 0x23, 0x39, 0x00, 0x06, + 0xFC, 0xF3, 0x3B, 0x23, 0xCF, 0x01, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0xD0, 0x06, 0x20, + 0xFC, 0xF3, 0x3B, 0x23, 0xD5, 0x3C, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x6E, 0x20, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x33, 0x02, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0xB3, 0x00, 0x0A, + 0xFC, 0xF3, 0x3B, 0x23, 0xB4, 0x00, 0x02, + 0xFC, 0xF3, 0x3B, 0x23, 0x70, 0x40, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x91, 0x40, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x92, 0x40, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x93, 0x40, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x94, 0x40, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x95, 0x40, 0x00, + 0xFC, 0xF3, 0x3B, 0x3F, 0xD2, 0x00, 0x32, + 0xFC, 0xF3, 0x3B, 0x22, 0xFB, 0x00, 0x00 +}; + +static const u8 TF700T_enable_NS[] = { + 0xC0, + 0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x01, + 0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x23, 0x01, + 0xFC, 0xF3, 0x3B, 0x23, 0x0C, 0x08, 0x00 +}; + +static const u8 TF700T_disable_NS[] = { + 0xC0, + 0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x00, 0x10, + 0xFC, 0xF3, 0x3B, 0x23, 0x0C, 0x15, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x6E, 0x7F, 0xFF, + 0xFC, 0xF3, 0x3B, 0x23, 0xCF, 0x02, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0xD0, 0x02, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0xD5, 0x10, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x00, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x22, 0xFB, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x84, 0x00, 0x03 +}; + +/* TF300T section */ +static const u8 TF300T_input_parameter[] = { + 0xC0, + 0xFC, 0xF3, 0x68, 0x64, 0x04, + 0xFC, 0xF3, 0x0D, 0x10, 0x00, 0x90, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x01, 0x82, 0x30, 0x50, + 0xFC, 0xF3, 0x0D, 0x10, 0x02, 0x27, 0x90, 0x9F, + 0xFC, 0xF3, 0x0D, 0x10, 0x03, 0x19, 0x00, 0xA0, + 0xFC, 0xF3, 0x0D, 0x10, 0x04, 0x1C, 0x5A, 0xAF, + 0xFC, 0xF3, 0x0D, 0x10, 0x05, 0x90, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x06, 0x80, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x07, 0x1C, 0x5A, 0xAF, + 0xFC, 0xF3, 0x0D, 0x10, 0x08, 0x90, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x09, 0x19, 0x01, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x0A, 0x27, 0x90, 0x5F, + 0xFC, 0xF3, 0x0D, 0x10, 0x0B, 0x19, 0x01, 0x10, + 0xFC, 0xF3, 0x0D, 0x10, 0x0C, 0x1C, 0x58, 0xEF, + 0xFC, 0xF3, 0x0D, 0x10, 0x0D, 0x90, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x0E, 0x80, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x0F, 0x1C, 0x58, 0xEF, + 0xFC, 0xF3, 0x0D, 0x10, 0x10, 0x90, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x11, 0x82, 0x2D, 0x20, + 0xFC, 0xF3, 0x0D, 0x10, 0x12, 0x27, 0x98, 0x5F, + 0xFC, 0xF3, 0x0D, 0x10, 0x13, 0x19, 0x01, 0x80, + 0xFC, 0xF3, 0x0D, 0x10, 0x14, 0x80, 0x50, 0x5A, + 0xFC, 0xF3, 0x0D, 0x10, 0x15, 0x90, 0x50, 0x3A, + 0xFC, 0xF3, 0x0D, 0x10, 0x16, 0x80, 0x50, 0x6F, + 0xFC, 0xF3, 0x0D, 0x10, 0x17, 0x90, 0x50, 0x4F, + 0xFC, 0xF3, 0x0D, 0x10, 0x18, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x19, 0x19, 0x00, 0x6F, + 0xFC, 0xF3, 0x0D, 0x10, 0x1A, 0x80, 0x00, 0xAC, + 0xFC, 0xF3, 0x0D, 0x10, 0x1B, 0x26, 0x7C, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x1C, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x1D, 0x19, 0x1D, 0x82, + 0xFC, 0xF3, 0x0D, 0x10, 0x1E, 0x19, 0x1C, 0xEF, + 0xFC, 0xF3, 0x0D, 0x10, 0x1F, 0x80, 0x53, 0x9A, + 0xFC, 0xF3, 0x0D, 0x10, 0x20, 0x93, 0xE2, 0xAA, + 0xFC, 0xF3, 0x0D, 0x10, 0x21, 0x80, 0x4F, 0xBA, + 0xFC, 0xF3, 0x0D, 0x10, 0x22, 0x22, 0x7A, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x23, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x24, 0x18, 0x2F, 0xD0, + 0xFC, 0xF3, 0x0D, 0x10, 0x25, 0x94, 0x4F, 0xB6, + 0xFC, 0xF3, 0x0D, 0x10, 0x26, 0x80, 0x4F, 0x6A, + 0xFC, 0xF3, 0x0D, 0x10, 0x27, 0x26, 0x7A, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x28, 0x18, 0x2F, 0x80, + 0xFC, 0xF3, 0x0D, 0x10, 0x29, 0x18, 0x2B, 0xCF, + 0xFC, 0xF3, 0x0D, 0x10, 0x2A, 0x95, 0x62, 0x06, + 0xFC, 0xF3, 0x0D, 0x10, 0x2B, 0x95, 0x61, 0x46, + 0xFC, 0xF3, 0x0D, 0x10, 0x2C, 0x40, 0xFA, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x2D, 0x40, 0xE5, 0xB0, + 0xFC, 0xF3, 0x0D, 0x10, 0x2E, 0x82, 0x30, 0x14, + 0xFC, 0xF3, 0x0D, 0x10, 0x2F, 0x27, 0x00, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x30, 0x22, 0x78, 0x00, + 0xFC, 0xF3, 0x0D, 0x10, 0x31, 0x83, 0xFD, 0x44, + 0xFC, 0xF3, 0x0D, 0x10, 0x32, 0x26, 0xE2, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x33, 0x19, 0x03, 0x90, + 0xFC, 0xF3, 0x0D, 0x10, 0x34, 0x93, 0xFD, 0x4A, + 0xFC, 0xF3, 0x0D, 0x10, 0x35, 0x83, 0xFD, 0x5A, + 0xFC, 0xF3, 0x0D, 0x10, 0x36, 0x23, 0xA2, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x37, 0x93, 0xFD, 0x5A, + 0xFC, 0xF3, 0x0D, 0x10, 0x38, 0x00, 0x00, 0x00, + 0xFC, 0xF3, 0x0D, 0x10, 0x39, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x3A, 0x18, 0x3F, 0x7F, + 0xFC, 0xF3, 0x0D, 0x10, 0x3B, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x3C, 0x19, 0x6C, 0xA4, + 0xFC, 0xF3, 0x0D, 0x10, 0x3D, 0x19, 0x66, 0x7F, + 0xFC, 0xF3, 0x0D, 0x10, 0x3E, 0x80, 0x79, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x3F, 0x82, 0x2D, 0x2F, + 0xFC, 0xF3, 0x0D, 0x10, 0x40, 0x27, 0x97, 0x9F, + 0xFC, 0xF3, 0x0D, 0x10, 0x41, 0x19, 0x04, 0x40, + 0xFC, 0xF3, 0x0D, 0x10, 0x42, 0x94, 0x7B, 0xD6, + 0xFC, 0xF3, 0x0D, 0x10, 0x43, 0x80, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x44, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x45, 0x18, 0x48, 0xDF, + 0xFC, 0xF3, 0x0D, 0x10, 0x46, 0x38, 0x00, 0x87, + 0xFC, 0xF3, 0x0D, 0x10, 0x47, 0x09, 0x00, 0x1B, + 0xFC, 0xF3, 0x0D, 0x10, 0x48, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x49, 0x18, 0x2D, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4A, 0x18, 0x21, 0x5F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4B, 0x88, 0x4F, 0x47, + 0xFC, 0xF3, 0x0D, 0x10, 0x4C, 0x82, 0x2A, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x4D, 0x22, 0x62, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4E, 0x26, 0x62, 0x7F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4F, 0x19, 0x05, 0x25, + 0xFC, 0xF3, 0x0D, 0x10, 0x50, 0x3B, 0xFF, 0xC7, + 0xFC, 0xF3, 0x0D, 0x10, 0x51, 0x19, 0x05, 0x3F, + 0xFC, 0xF3, 0x0D, 0x10, 0x52, 0x0D, 0x01, 0xA6, + 0xFC, 0xF3, 0x0D, 0x10, 0x53, 0x92, 0x2A, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x54, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x55, 0x18, 0x23, 0x2F, + 0xFC, 0xF3, 0x0D, 0x10, 0x56, 0x96, 0x2A, 0xA1, + 0xFC, 0xF3, 0x0D, 0x10, 0x57, 0x96, 0x2A, 0xB0, + 0xFC, 0xF3, 0x0D, 0x10, 0x58, 0x9A, 0x2A, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x59, 0x9A, 0x2A, 0xD7, + 0xFC, 0xF3, 0x0D, 0x10, 0x5A, 0x96, 0x2A, 0xE8, + 0xFC, 0xF3, 0x0D, 0x10, 0x5B, 0x38, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x5C, 0x83, 0xFF, 0xAA, + 0xFC, 0xF3, 0x0D, 0x10, 0x5D, 0x3B, 0x20, 0x02, + 0xFC, 0xF3, 0x0D, 0x10, 0x5E, 0x36, 0x2B, 0x01, + 0xFC, 0xF3, 0x0D, 0x10, 0x5F, 0x36, 0x2B, 0x60, + 0xFC, 0xF3, 0x0D, 0x10, 0x60, 0x1C, 0x72, 0x2F, + 0xFC, 0xF3, 0x0D, 0x10, 0x61, 0x93, 0xFF, 0x9A, + 0xFC, 0xF3, 0x0D, 0x10, 0x62, 0x93, 0xFF, 0xAA, + 0xFC, 0xF3, 0x0D, 0x10, 0x63, 0x86, 0x2A, 0xA1, + 0xFC, 0xF3, 0x0D, 0x10, 0x64, 0x86, 0x2A, 0xB0, + 0xFC, 0xF3, 0x0D, 0x10, 0x65, 0x8A, 0x2A, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x66, 0x8A, 0x2A, 0xD7, + 0xFC, 0xF3, 0x0D, 0x10, 0x67, 0x86, 0x2A, 0xE8, + 0xFC, 0xF3, 0x0D, 0x10, 0x68, 0x0D, 0x08, 0x28, + 0xFC, 0xF3, 0x0D, 0x10, 0x69, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x6A, 0x18, 0x24, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x6B, 0x83, 0xFC, 0xFA, + 0xFC, 0xF3, 0x0D, 0x10, 0x6C, 0x23, 0x8A, 0xBF, + 0xFC, 0xF3, 0x0D, 0x10, 0x6D, 0x82, 0x2D, 0x2F, + 0xFC, 0xF3, 0x0D, 0x10, 0x6E, 0x27, 0x97, 0xDF, + 0xFC, 0xF3, 0x0D, 0x10, 0x6F, 0x23, 0xAA, 0x91, + 0xFC, 0xF3, 0x0D, 0x10, 0x70, 0x93, 0xFC, 0xFA, + 0xFC, 0xF3, 0x0D, 0x10, 0x71, 0x83, 0x80, 0x30, + 0xFC, 0xF3, 0x0D, 0x10, 0x72, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x73, 0x18, 0x3E, 0x9F, + 0xFC, 0xF3, 0x0D, 0x10, 0x74, 0x80, 0x7A, 0x4A, + 0xFC, 0xF3, 0x0D, 0x10, 0x75, 0x19, 0x07, 0xE2, + 0xFC, 0xF3, 0x0D, 0x10, 0x76, 0x23, 0x3E, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x77, 0x0D, 0x00, 0xEA, + 0xFC, 0xF3, 0x0D, 0x10, 0x78, 0x80, 0x7B, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x79, 0x38, 0x7E, 0x02, + 0xFC, 0xF3, 0x0D, 0x10, 0x7A, 0x1C, 0x76, 0x9F, + 0xFC, 0xF3, 0x0D, 0x10, 0x7B, 0x90, 0x7B, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x7C, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x7D, 0x19, 0x75, 0xCF, + 0xFC, 0xF3, 0x0D, 0x10, 0x7E, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x7F, 0x19, 0x75, 0x9F, + 0xFC, 0xF3, 0x68, 0x64, 0x00, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA0, 0x91, 0xCB, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB0, 0x50, 0x1A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA1, 0x82, 0xF3, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB1, 0x02, 0xF5, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA2, 0x82, 0xB5, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB2, 0x50, 0x1F, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA3, 0x83, 0xF4, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB3, 0x50, 0x2A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA4, 0x96, 0x66, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB4, 0x50, 0x3B, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA5, 0x82, 0xCC, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB5, 0x50, 0x46, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA6, 0xC2, 0xCC, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB6, 0x50, 0x46, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA7, 0xC2, 0x10, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB7, 0x50, 0x4A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA8, 0x82, 0x10, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB8, 0x50, 0x4A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA9, 0x82, 0x31, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB9, 0x50, 0x4B, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAA, 0xC2, 0x31, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBA, 0x50, 0x4B, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAB, 0x82, 0x3F, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBB, 0x50, 0x56, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAC, 0xC2, 0x3F, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBC, 0x50, 0x56, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAD, 0x83, 0xE8, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBD, 0x50, 0x6B, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAE, 0x97, 0x58, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBE, 0x50, 0x74, + 0xFC, 0xF3, 0x3B, 0x22, 0xF8, 0x80, 0x05, + 0xFC, 0xF3, 0x3B, 0x22, 0xC8, 0x00, 0x29, + 0xFC, 0xF3, 0x3B, 0x22, 0xEE, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x22, 0xF9, 0x08, 0x5F, + 0xFC, 0xF3, 0x3B, 0x22, 0xFA, 0x24, 0x81, + 0xFC, 0xF3, 0x3B, 0x23, 0x05, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x01, 0x00, 0x02, + 0xFC, 0xF3, 0x3B, 0x23, 0x07, 0xF0, 0xF0, + 0xFC, 0xF3, 0x3B, 0x23, 0x09, 0x08, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x0D, 0x01, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x0C, 0x0E, 0x20, + 0xFC, 0xF3, 0x3B, 0x22, 0xF2, 0x00, 0x44, + 0xFC, 0xF3, 0x3B, 0x22, 0xF6, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x22, 0xC6, 0x00, 0x06, + 0xFC, 0xF3, 0x3B, 0x22, 0xC7, 0x00, 0x08, + 0xFC, 0xF3, 0x3B, 0x22, 0xD2, 0x8A, 0x94, + 0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x01, + 0xFC, 0xF3, 0x3B, 0x23, 0x00, 0x00, 0x04, + 0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x23, 0x10, + 0xFC, 0xF3, 0x3B, 0x23, 0x2F, 0x01, 0x10, + 0xFC, 0xF3, 0x3B, 0x23, 0x39, 0x00, 0x06, + 0xFC, 0xF3, 0x3B, 0x23, 0xCF, 0x01, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0xD0, 0x06, 0x20, + 0xFC, 0xF3, 0x3B, 0x23, 0xD5, 0x3C, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x6E, 0x20, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x33, 0x02, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0xB3, 0x00, 0x0A, + 0xFC, 0xF3, 0x3B, 0x23, 0xB4, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x70, 0x40, 0x00, + 0xFC, 0xF3, 0x3B, 0x3F, 0xD2, 0x00, 0x32, + 0xFC, 0xF3, 0x3B, 0x22, 0xFB, 0x00, 0x00 +}; + +/* TF101 section */ +static const u8 TF101_input_parameter[] = { + 0xC0, + 0xFC, 0xF3, 0x68, 0x64, 0x04, + 0xFC, 0xF3, 0x0D, 0x10, 0x00, 0x90, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x01, 0x82, 0x30, 0x50, + 0xFC, 0xF3, 0x0D, 0x10, 0x02, 0x27, 0x90, 0x9F, + 0xFC, 0xF3, 0x0D, 0x10, 0x03, 0x19, 0x00, 0xA0, + 0xFC, 0xF3, 0x0D, 0x10, 0x04, 0x1C, 0x5A, 0xAF, + 0xFC, 0xF3, 0x0D, 0x10, 0x05, 0x90, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x06, 0x80, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x07, 0x1C, 0x5A, 0xAF, + 0xFC, 0xF3, 0x0D, 0x10, 0x08, 0x90, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x09, 0x19, 0x01, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x0A, 0x27, 0x90, 0x5F, + 0xFC, 0xF3, 0x0D, 0x10, 0x0B, 0x19, 0x01, 0x10, + 0xFC, 0xF3, 0x0D, 0x10, 0x0C, 0x1C, 0x58, 0xEF, + 0xFC, 0xF3, 0x0D, 0x10, 0x0D, 0x90, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x0E, 0x80, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x0F, 0x1C, 0x58, 0xEF, + 0xFC, 0xF3, 0x0D, 0x10, 0x10, 0x90, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x11, 0x82, 0x2D, 0x20, + 0xFC, 0xF3, 0x0D, 0x10, 0x12, 0x27, 0x98, 0x5F, + 0xFC, 0xF3, 0x0D, 0x10, 0x13, 0x19, 0x01, 0x80, + 0xFC, 0xF3, 0x0D, 0x10, 0x14, 0x80, 0x50, 0x5A, + 0xFC, 0xF3, 0x0D, 0x10, 0x15, 0x90, 0x50, 0x3A, + 0xFC, 0xF3, 0x0D, 0x10, 0x16, 0x80, 0x50, 0x6F, + 0xFC, 0xF3, 0x0D, 0x10, 0x17, 0x90, 0x50, 0x4F, + 0xFC, 0xF3, 0x0D, 0x10, 0x18, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x19, 0x19, 0x00, 0x6F, + 0xFC, 0xF3, 0x0D, 0x10, 0x1A, 0x80, 0x00, 0xAC, + 0xFC, 0xF3, 0x0D, 0x10, 0x1B, 0x26, 0x7C, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x1C, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x1D, 0x19, 0x1D, 0x82, + 0xFC, 0xF3, 0x0D, 0x10, 0x1E, 0x19, 0x1C, 0xEF, + 0xFC, 0xF3, 0x0D, 0x10, 0x1F, 0x80, 0x53, 0x9A, + 0xFC, 0xF3, 0x0D, 0x10, 0x20, 0x93, 0xE2, 0xAA, + 0xFC, 0xF3, 0x0D, 0x10, 0x21, 0x80, 0x4F, 0xBA, + 0xFC, 0xF3, 0x0D, 0x10, 0x22, 0x22, 0x7A, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x23, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x24, 0x18, 0x2F, 0xD0, + 0xFC, 0xF3, 0x0D, 0x10, 0x25, 0x94, 0x4F, 0xB6, + 0xFC, 0xF3, 0x0D, 0x10, 0x26, 0x80, 0x4F, 0x6A, + 0xFC, 0xF3, 0x0D, 0x10, 0x27, 0x26, 0x7A, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x28, 0x18, 0x2F, 0x80, + 0xFC, 0xF3, 0x0D, 0x10, 0x29, 0x18, 0x2B, 0xCF, + 0xFC, 0xF3, 0x0D, 0x10, 0x2A, 0x95, 0x62, 0x06, + 0xFC, 0xF3, 0x0D, 0x10, 0x2B, 0x95, 0x61, 0x46, + 0xFC, 0xF3, 0x0D, 0x10, 0x2C, 0x40, 0xFA, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x2D, 0x40, 0xE5, 0xB0, + 0xFC, 0xF3, 0x0D, 0x10, 0x2E, 0x82, 0x30, 0x14, + 0xFC, 0xF3, 0x0D, 0x10, 0x2F, 0x27, 0x00, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x30, 0x22, 0x78, 0x00, + 0xFC, 0xF3, 0x0D, 0x10, 0x31, 0x83, 0xFD, 0x44, + 0xFC, 0xF3, 0x0D, 0x10, 0x32, 0x26, 0xE2, 0x0F, + 0xFC, 0xF3, 0x0D, 0x10, 0x33, 0x19, 0x03, 0x90, + 0xFC, 0xF3, 0x0D, 0x10, 0x34, 0x93, 0xFD, 0x4A, + 0xFC, 0xF3, 0x0D, 0x10, 0x35, 0x83, 0xFD, 0x5A, + 0xFC, 0xF3, 0x0D, 0x10, 0x36, 0x23, 0xA2, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x37, 0x93, 0xFD, 0x5A, + 0xFC, 0xF3, 0x0D, 0x10, 0x38, 0x00, 0x00, 0x00, + 0xFC, 0xF3, 0x0D, 0x10, 0x39, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x3A, 0x18, 0x3F, 0x7F, + 0xFC, 0xF3, 0x0D, 0x10, 0x3B, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x3C, 0x19, 0x6C, 0xA4, + 0xFC, 0xF3, 0x0D, 0x10, 0x3D, 0x19, 0x66, 0x7F, + 0xFC, 0xF3, 0x0D, 0x10, 0x3E, 0x80, 0x79, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x3F, 0x82, 0x2D, 0x2F, + 0xFC, 0xF3, 0x0D, 0x10, 0x40, 0x27, 0x97, 0x9F, + 0xFC, 0xF3, 0x0D, 0x10, 0x41, 0x19, 0x04, 0x40, + 0xFC, 0xF3, 0x0D, 0x10, 0x42, 0x94, 0x7B, 0xD6, + 0xFC, 0xF3, 0x0D, 0x10, 0x43, 0x80, 0x00, 0x1A, + 0xFC, 0xF3, 0x0D, 0x10, 0x44, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x45, 0x18, 0x48, 0xDF, + 0xFC, 0xF3, 0x0D, 0x10, 0x46, 0x38, 0x00, 0x87, + 0xFC, 0xF3, 0x0D, 0x10, 0x47, 0x09, 0x00, 0x1B, + 0xFC, 0xF3, 0x0D, 0x10, 0x48, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x49, 0x18, 0x2D, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4A, 0x18, 0x21, 0x5F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4B, 0x88, 0x4F, 0x47, + 0xFC, 0xF3, 0x0D, 0x10, 0x4C, 0x82, 0x2A, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x4D, 0x22, 0x62, 0x1F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4E, 0x26, 0x62, 0x7F, + 0xFC, 0xF3, 0x0D, 0x10, 0x4F, 0x19, 0x05, 0x25, + 0xFC, 0xF3, 0x0D, 0x10, 0x50, 0x3B, 0xFF, 0xC7, + 0xFC, 0xF3, 0x0D, 0x10, 0x51, 0x19, 0x05, 0x3F, + 0xFC, 0xF3, 0x0D, 0x10, 0x52, 0x0D, 0x01, 0xA6, + 0xFC, 0xF3, 0x0D, 0x10, 0x53, 0x92, 0x2A, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x54, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x55, 0x18, 0x23, 0x2F, + 0xFC, 0xF3, 0x0D, 0x10, 0x56, 0x96, 0x2A, 0xA1, + 0xFC, 0xF3, 0x0D, 0x10, 0x57, 0x96, 0x2A, 0xB0, + 0xFC, 0xF3, 0x0D, 0x10, 0x58, 0x9A, 0x2A, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x59, 0x9A, 0x2A, 0xD7, + 0xFC, 0xF3, 0x0D, 0x10, 0x5A, 0x96, 0x2A, 0xE8, + 0xFC, 0xF3, 0x0D, 0x10, 0x5B, 0x38, 0x00, 0x0A, + 0xFC, 0xF3, 0x0D, 0x10, 0x5C, 0x83, 0xFF, 0xAA, + 0xFC, 0xF3, 0x0D, 0x10, 0x5D, 0x3B, 0x20, 0x02, + 0xFC, 0xF3, 0x0D, 0x10, 0x5E, 0x36, 0x2B, 0x01, + 0xFC, 0xF3, 0x0D, 0x10, 0x5F, 0x36, 0x2B, 0x60, + 0xFC, 0xF3, 0x0D, 0x10, 0x60, 0x1C, 0x72, 0x2F, + 0xFC, 0xF3, 0x0D, 0x10, 0x61, 0x93, 0xFF, 0x9A, + 0xFC, 0xF3, 0x0D, 0x10, 0x62, 0x93, 0xFF, 0xAA, + 0xFC, 0xF3, 0x0D, 0x10, 0x63, 0x86, 0x2A, 0xA1, + 0xFC, 0xF3, 0x0D, 0x10, 0x64, 0x86, 0x2A, 0xB0, + 0xFC, 0xF3, 0x0D, 0x10, 0x65, 0x8A, 0x2A, 0xCA, + 0xFC, 0xF3, 0x0D, 0x10, 0x66, 0x8A, 0x2A, 0xD7, + 0xFC, 0xF3, 0x0D, 0x10, 0x67, 0x86, 0x2A, 0xE8, + 0xFC, 0xF3, 0x0D, 0x10, 0x68, 0x0D, 0x08, 0x28, + 0xFC, 0xF3, 0x0D, 0x10, 0x69, 0x34, 0x00, 0x0E, + 0xFC, 0xF3, 0x0D, 0x10, 0x6A, 0x18, 0x24, 0x0F, + 0xFC, 0xF3, 0x68, 0x64, 0x00, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA0, 0x90, 0x05, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB0, 0x50, 0x00, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA1, 0x91, 0xCB, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB1, 0x50, 0x1A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA2, 0x82, 0xF3, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB2, 0x02, 0xF5, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA3, 0x82, 0xB5, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB3, 0x50, 0x1F, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA4, 0x83, 0xF4, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB4, 0x50, 0x2A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA5, 0x96, 0x66, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB5, 0x50, 0x3B, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA6, 0x84, 0x8C, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB6, 0x50, 0x3E, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA7, 0xC4, 0x8C, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB7, 0x50, 0x3E, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA8, 0x82, 0xCC, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB8, 0x50, 0x46, + 0xFC, 0xF3, 0x3B, 0x3F, 0xA9, 0xC2, 0xCC, + 0xFC, 0xF3, 0x3B, 0x3F, 0xB9, 0x50, 0x46, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAA, 0xC2, 0x10, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBA, 0x50, 0x4A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAB, 0x82, 0x10, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBB, 0x50, 0x4A, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAC, 0x82, 0x31, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBC, 0x50, 0x4B, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAD, 0xC2, 0x31, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBD, 0x50, 0x4B, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAE, 0x82, 0x3F, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBE, 0x50, 0x56, + 0xFC, 0xF3, 0x3B, 0x3F, 0xAF, 0xC2, 0x3F, + 0xFC, 0xF3, 0x3B, 0x3F, 0xBF, 0x50, 0x56, + 0xFC, 0xF3, 0x3B, 0x22, 0xF8, 0x80, 0x05, + 0xFC, 0xF3, 0x3B, 0x22, 0xC8, 0x00, 0x09, + 0xFC, 0xF3, 0x3B, 0x22, 0xEE, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x22, 0xF9, 0x08, 0x5F, + 0xFC, 0xF3, 0x3B, 0x22, 0xFA, 0x24, 0x81, + 0xFC, 0xF3, 0x3B, 0x23, 0x05, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x01, 0x00, 0x01, + 0xFC, 0xF3, 0x3B, 0x23, 0x07, 0xF0, 0xF0, + 0xFC, 0xF3, 0x3B, 0x23, 0x09, 0x08, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x0D, 0x01, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x0C, 0x0E, 0x20, + 0xFC, 0xF3, 0x3B, 0x22, 0xF2, 0x00, 0x44, + 0xFC, 0xF3, 0x3B, 0x22, 0xF6, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x22, 0xC6, 0x00, 0x31, + 0xFC, 0xF3, 0x3B, 0x22, 0xC7, 0x00, 0x50, + 0xFC, 0xF3, 0x3B, 0x22, 0xD2, 0x82, 0x94, + 0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x01, + 0xFC, 0xF3, 0x3B, 0x23, 0x00, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x23, 0x10, + 0xFC, 0xF3, 0x3B, 0x23, 0x2F, 0x01, 0x10, + 0xFC, 0xF3, 0x3B, 0x23, 0x39, 0x00, 0x06, + 0xFC, 0xF3, 0x3B, 0x23, 0xCF, 0x01, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0xD0, 0x06, 0x20, + 0xFC, 0xF3, 0x3B, 0x23, 0xD5, 0x3C, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x6E, 0x20, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x33, 0x02, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0xB3, 0x00, 0x0A, + 0xFC, 0xF3, 0x3B, 0x23, 0xB4, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x70, 0x40, 0x00, + 0xFC, 0xF3, 0x3B, 0x3F, 0xD2, 0x00, 0x32, + 0xFC, 0xF3, 0x3B, 0x22, 0xFB, 0x00, 0x00 +}; + +static const u8 TF101_enable_NS[] = { + 0xC0, + 0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x01, + 0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x23, 0x10 +}; + +static const u8 TF101_disable_NS[] = { + 0xC0, + 0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x00, + 0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x00, 0x10 +}; + +#endif
On Tue, Feb 21, 2023 at 08:32:10PM +0200, Svyatoslav Ryhel wrote:
FM34NE is digital sound processing chip used for active noise suppression mainly on ASUS Transformers.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com
drivers/staging/Kconfig | 2 + drivers/staging/Makefile | 1 + drivers/staging/dsp/Kconfig | 7 + drivers/staging/dsp/Makefile | 2 + drivers/staging/dsp/dsp-fm34ne.c | 364 +++++++++++++ drivers/staging/dsp/dsp-fm34ne.h | 845 +++++++++++++++++++++++++++++++ 6 files changed, 1221 insertions(+) create mode 100644 drivers/staging/dsp/Kconfig create mode 100644 drivers/staging/dsp/Makefile create mode 100644 drivers/staging/dsp/dsp-fm34ne.c create mode 100644 drivers/staging/dsp/dsp-fm34ne.h
Sorry, but why is this going into drivers/staging/ at all? What is needed to be done to get this out of staging? Why not do that work right now? At the least, we need a TODO file in the directory that lists what needs to be done and who is responsible for it.
But again, just do the work now, it's faster and simpler to do it before you submit it instead of waiting until after it is merged.
Also, no need for a .h file when you only have one .c file. Just put them all together into one file please.
thanks,
greg k-h
вт, 21 лют. 2023 р. о 21:27 Greg Kroah-Hartman gregkh@linuxfoundation.org пише:
On Tue, Feb 21, 2023 at 08:32:10PM +0200, Svyatoslav Ryhel wrote:
FM34NE is digital sound processing chip used for active noise suppression mainly on ASUS Transformers.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com
drivers/staging/Kconfig | 2 + drivers/staging/Makefile | 1 + drivers/staging/dsp/Kconfig | 7 + drivers/staging/dsp/Makefile | 2 + drivers/staging/dsp/dsp-fm34ne.c | 364 +++++++++++++ drivers/staging/dsp/dsp-fm34ne.h | 845 +++++++++++++++++++++++++++++++ 6 files changed, 1221 insertions(+) create mode 100644 drivers/staging/dsp/Kconfig create mode 100644 drivers/staging/dsp/Makefile create mode 100644 drivers/staging/dsp/dsp-fm34ne.c create mode 100644 drivers/staging/dsp/dsp-fm34ne.h
Sorry, but why is this going into drivers/staging/ at all? What is needed to be done to get this out of staging? Why not do that work right now? At the least, we need a TODO file in the directory that lists what needs to be done and who is responsible for it.
Because this driver sets up fm34 and switches it to bypass mode allowing sound to work on the device. There is no dsp framework in kernel which could be called to operate dsp from the actual sound codec. (If there is, I would be glad if you show me). Fm34 must be active only on DMIC use, all other cases require it to be in bypass.
But again, just do the work now, it's faster and simpler to do it before you submit it instead of waiting until after it is merged.
Also, no need for a .h file when you only have one .c file. Just put them all together into one file please.
I understand, but the header contains sets of configuration sequences. Including those into .c will make it barely readable.
thanks,
greg k-h
On Wed, Feb 22, 2023 at 10:19:47AM +0200, Svyatoslav Ryhel wrote:
вт, 21 лют. 2023 р. о 21:27 Greg Kroah-Hartman gregkh@linuxfoundation.org пише:
On Tue, Feb 21, 2023 at 08:32:10PM +0200, Svyatoslav Ryhel wrote:
FM34NE is digital sound processing chip used for active noise suppression mainly on ASUS Transformers.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com
drivers/staging/Kconfig | 2 + drivers/staging/Makefile | 1 + drivers/staging/dsp/Kconfig | 7 + drivers/staging/dsp/Makefile | 2 + drivers/staging/dsp/dsp-fm34ne.c | 364 +++++++++++++ drivers/staging/dsp/dsp-fm34ne.h | 845 +++++++++++++++++++++++++++++++ 6 files changed, 1221 insertions(+) create mode 100644 drivers/staging/dsp/Kconfig create mode 100644 drivers/staging/dsp/Makefile create mode 100644 drivers/staging/dsp/dsp-fm34ne.c create mode 100644 drivers/staging/dsp/dsp-fm34ne.h
Sorry, but why is this going into drivers/staging/ at all? What is needed to be done to get this out of staging? Why not do that work right now? At the least, we need a TODO file in the directory that lists what needs to be done and who is responsible for it.
Because this driver sets up fm34 and switches it to bypass mode allowing sound to work on the device. There is no dsp framework in kernel which could be called to operate dsp from the actual sound codec. (If there is, I would be glad if you show me). Fm34 must be active only on DMIC use, all other cases require it to be in bypass.
That does not explain at all why this needs to go into drivers/staging/ and not the normal portion of the kernel. Why this specific location? What is wrong with it that requires it to go here?
In other words, you need to document _WHY_ it must go here as it is not obvious at all.
thanks,
greg k-h
22 лютого 2023 р. 11:21:02 GMT+02:00, Greg Kroah-Hartman gregkh@linuxfoundation.org написав(-ла):
On Wed, Feb 22, 2023 at 10:19:47AM +0200, Svyatoslav Ryhel wrote:
вт, 21 лют. 2023 р. о 21:27 Greg Kroah-Hartman gregkh@linuxfoundation.org пише:
On Tue, Feb 21, 2023 at 08:32:10PM +0200, Svyatoslav Ryhel wrote:
FM34NE is digital sound processing chip used for active noise suppression mainly on ASUS Transformers.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com
drivers/staging/Kconfig | 2 + drivers/staging/Makefile | 1 + drivers/staging/dsp/Kconfig | 7 + drivers/staging/dsp/Makefile | 2 + drivers/staging/dsp/dsp-fm34ne.c | 364 +++++++++++++ drivers/staging/dsp/dsp-fm34ne.h | 845 +++++++++++++++++++++++++++++++ 6 files changed, 1221 insertions(+) create mode 100644 drivers/staging/dsp/Kconfig create mode 100644 drivers/staging/dsp/Makefile create mode 100644 drivers/staging/dsp/dsp-fm34ne.c create mode 100644 drivers/staging/dsp/dsp-fm34ne.h
Sorry, but why is this going into drivers/staging/ at all? What is needed to be done to get this out of staging? Why not do that work right now? At the least, we need a TODO file in the directory that lists what needs to be done and who is responsible for it.
Because this driver sets up fm34 and switches it to bypass mode allowing sound to work on the device. There is no dsp framework in kernel which could be called to operate dsp from the actual sound codec. (If there is, I would be glad if you show me). Fm34 must be active only on DMIC use, all other cases require it to be in bypass.
That does not explain at all why this needs to go into drivers/staging/ and not the normal portion of the kernel. Why this specific location? What is wrong with it that requires it to go here?
It is not fully functional and does not perform its main function (noise cancellation) because it has to be called only for DMIC. Same time it is essential to be set so that audio could work on device.
Once there is such a framework in kernel, which allows to control dsp from, I assume, asoc machine driver, this driver can be moved wherever it should be. Currently I can not tell where it should be since I haven't seen dsp drivers like this in kernel.
In other words, you need to document _WHY_ it must go here as it is not obvious at all.
thanks,
greg k-h
On Wed, Feb 22, 2023 at 11:39:59AM +0200, Святослав Ригель wrote:
22 лютого 2023 р. 11:21:02 GMT+02:00, Greg Kroah-Hartman gregkh@linuxfoundation.org написав(-ла):
On Wed, Feb 22, 2023 at 10:19:47AM +0200, Svyatoslav Ryhel wrote:
вт, 21 лют. 2023 р. о 21:27 Greg Kroah-Hartman gregkh@linuxfoundation.org пише:
On Tue, Feb 21, 2023 at 08:32:10PM +0200, Svyatoslav Ryhel wrote:
FM34NE is digital sound processing chip used for active noise suppression mainly on ASUS Transformers.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com
drivers/staging/Kconfig | 2 + drivers/staging/Makefile | 1 + drivers/staging/dsp/Kconfig | 7 + drivers/staging/dsp/Makefile | 2 + drivers/staging/dsp/dsp-fm34ne.c | 364 +++++++++++++ drivers/staging/dsp/dsp-fm34ne.h | 845 +++++++++++++++++++++++++++++++ 6 files changed, 1221 insertions(+) create mode 100644 drivers/staging/dsp/Kconfig create mode 100644 drivers/staging/dsp/Makefile create mode 100644 drivers/staging/dsp/dsp-fm34ne.c create mode 100644 drivers/staging/dsp/dsp-fm34ne.h
Sorry, but why is this going into drivers/staging/ at all? What is needed to be done to get this out of staging? Why not do that work right now? At the least, we need a TODO file in the directory that lists what needs to be done and who is responsible for it.
Because this driver sets up fm34 and switches it to bypass mode allowing sound to work on the device. There is no dsp framework in kernel which could be called to operate dsp from the actual sound codec. (If there is, I would be glad if you show me). Fm34 must be active only on DMIC use, all other cases require it to be in bypass.
That does not explain at all why this needs to go into drivers/staging/ and not the normal portion of the kernel. Why this specific location? What is wrong with it that requires it to go here?
It is not fully functional and does not perform its main function (noise cancellation) because it has to be called only for DMIC. Same time it is essential to be set so that audio could work on device.
But why does that mean it should go to drivers/staging/? That's not what staging is for (broken code).
Once there is such a framework in kernel, which allows to control dsp from, I assume, asoc machine driver, this driver can be moved wherever it should be. Currently I can not tell where it should be since I haven't seen dsp drivers like this in kernel.
Then work to create that, don't dump stuff in drivers/staging/ for no valid reason.
thanks,
greg k-h
On Wed, Feb 22, 2023 at 10:19:47AM +0200, Svyatoslav Ryhel wrote:
Because this driver sets up fm34 and switches it to bypass mode allowing sound to work on the device. There is no dsp framework in kernel which could be called to operate dsp from the actual sound codec. (If there is, I would be glad
if you show me). Fm34 must be active only on DMIC use, all other cases require it to be in bypass.
Sure there is, like I said in my other reply it looks like an aux device.
On Tue, Feb 21, 2023 at 08:32:10PM +0200, Svyatoslav Ryhel wrote:
+static int fm34ne_dsp_set_config(struct fm34ne_dsp_data *fm34, int state) +{
- struct device *dev = &fm34->client->dev;
- const u8 *enable_ns_parameter = fm34->data->enable_noise_suppression;
- int enable_ns_length = fm34->data->enable_ns_length;
- const u8 *disable_ns_parameter = fm34->data->disable_noise_suppression;
- int disable_ns_length = fm34->data->disable_ns_length;
- int ret;
- gpiod_set_value_cansleep(fm34->bypass_gpio, 1);
- msleep(20);
- switch (state) {
- case FM34NE_NS_ENABLE:
ret = fm34ne_dsp_write_config(fm34->client, enable_parameter,
sizeof(enable_parameter));
if (ret < 0) {
dev_err(dev, "failed to set DSP enable with %d\n", ret);
goto exit;
}
ret = fm34ne_dsp_write_config(fm34->client, enable_ns_parameter,
enable_ns_length);
if (ret < 0) {
dev_err(dev, "failed to enable DSP noise suppression with %d\n", ret);
goto exit;
}
dev_info(dev, "noise suppression enable DSP parameter written\n");
Delete this type of debug code.
break;
- case FM34NE_NS_DISABLE:
ret = fm34ne_dsp_write_config(fm34->client, enable_parameter,
sizeof(enable_parameter));
if (ret < 0) {
dev_err(dev, "failed to set DSP enable with %d\n", ret);
goto exit;
}
ret = fm34ne_dsp_write_config(fm34->client, disable_ns_parameter,
disable_ns_length);
if (ret < 0) {
dev_err(dev, "failed to disable DSP noise suppression with %d\n", ret);
goto exit;
}
dev_info(dev, "noise suppression disable DSP parameter written\n");
Same etc.
break;
- case FM34NE_BYPASS:
- default:
ret = fm34ne_dsp_write_config(fm34->client, bypass_parameter,
sizeof(bypass_parameter));
if (ret < 0) {
dev_err(dev, "failed to set DSP bypass with %d\n", ret);
goto exit;
}
dev_info(dev, "bypass DSP parameter written\n");
break;
- }
+exit:
- gpiod_set_value_cansleep(fm34->bypass_gpio, 0);
- return ret;
+}
+static int fm34ne_dsp_set_hw(struct fm34ne_dsp_data *fm34) +{
- struct device *dev = &fm34->client->dev;
- int ret;
- ret = clk_prepare_enable(fm34->dap_mclk);
- if (ret) {
dev_err(dev, "failed to enable the DSP MCLK: %d\n", ret);
return ret;
- }
- ret = regulator_enable(fm34->vdd_supply);
- if (ret < 0) {
dev_err(dev, "failed to enable vdd power supply\n");
clk_disable_unprepare(fm34->dap_mclk);
return ret;
- }
- return 0;
+}
+static void fm34ne_dsp_reset(struct fm34ne_dsp_data *fm34) +{
- gpiod_set_value_cansleep(fm34->reset_gpio, 1);
- msleep(20);
- gpiod_set_value_cansleep(fm34->reset_gpio, 0);
- msleep(100);
+}
+static int fm34ne_dsp_init_chip(struct fm34ne_dsp_data *fm34) +{
- const u8 *input_parameter = fm34->data->input_parameter;
- int input_parameter_length = fm34->data->input_parameter_length;
- int ret;
- ret = fm34ne_dsp_set_hw(fm34);
- if (ret)
return ret;
- fm34ne_dsp_reset(fm34);
- gpiod_set_value_cansleep(fm34->bypass_gpio, 1);
- msleep(20);
- ret = i2c_smbus_write_byte(fm34->client, FM34NE_I2C_CHECK);
- if (ret < 0) {
dev_info(&fm34->client->dev, "initial write failed\n");
dev_warn()?
msleep(50);
fm34ne_dsp_reset(fm34);
gpiod_set_value_cansleep(fm34->bypass_gpio, 0);
return ret;
- }
- ret = fm34ne_dsp_write_config(fm34->client, input_parameter,
input_parameter_length);
- if (ret < 0)
return -EINVAL;
Why not propagate the error code from fm34ne_dsp_write_config()?
- msleep(100);
- gpiod_set_value_cansleep(fm34->bypass_gpio, 0);
- dev_info(&fm34->client->dev, "%s detected\n", fm34->data->model);
- /* Constantly set DSP to bypass mode for now */
- ret = fm34ne_dsp_set_config(fm34, FM34NE_BYPASS);
- if (ret)
return ret;
- return 0;
+}
regards, dan carpenter
вт, 21 лют. 2023 р. о 21:39 Dan Carpenter error27@gmail.com пише:
On Tue, Feb 21, 2023 at 08:32:10PM +0200, Svyatoslav Ryhel wrote:
+static int fm34ne_dsp_set_config(struct fm34ne_dsp_data *fm34, int state) +{
struct device *dev = &fm34->client->dev;
const u8 *enable_ns_parameter = fm34->data->enable_noise_suppression;
int enable_ns_length = fm34->data->enable_ns_length;
const u8 *disable_ns_parameter = fm34->data->disable_noise_suppression;
int disable_ns_length = fm34->data->disable_ns_length;
int ret;
gpiod_set_value_cansleep(fm34->bypass_gpio, 1);
msleep(20);
switch (state) {
case FM34NE_NS_ENABLE:
ret = fm34ne_dsp_write_config(fm34->client, enable_parameter,
sizeof(enable_parameter));
if (ret < 0) {
dev_err(dev, "failed to set DSP enable with %d\n", ret);
goto exit;
}
ret = fm34ne_dsp_write_config(fm34->client, enable_ns_parameter,
enable_ns_length);
if (ret < 0) {
dev_err(dev, "failed to enable DSP noise suppression with %d\n", ret);
goto exit;
}
dev_info(dev, "noise suppression enable DSP parameter written\n");
Delete this type of debug code.
break;
case FM34NE_NS_DISABLE:
ret = fm34ne_dsp_write_config(fm34->client, enable_parameter,
sizeof(enable_parameter));
if (ret < 0) {
dev_err(dev, "failed to set DSP enable with %d\n", ret);
goto exit;
}
ret = fm34ne_dsp_write_config(fm34->client, disable_ns_parameter,
disable_ns_length);
if (ret < 0) {
dev_err(dev, "failed to disable DSP noise suppression with %d\n", ret);
goto exit;
}
dev_info(dev, "noise suppression disable DSP parameter written\n");
Same etc.
break;
case FM34NE_BYPASS:
default:
ret = fm34ne_dsp_write_config(fm34->client, bypass_parameter,
sizeof(bypass_parameter));
if (ret < 0) {
dev_err(dev, "failed to set DSP bypass with %d\n", ret);
goto exit;
}
dev_info(dev, "bypass DSP parameter written\n");
break;
}
+exit:
gpiod_set_value_cansleep(fm34->bypass_gpio, 0);
return ret;
+}
+static int fm34ne_dsp_set_hw(struct fm34ne_dsp_data *fm34) +{
struct device *dev = &fm34->client->dev;
int ret;
ret = clk_prepare_enable(fm34->dap_mclk);
if (ret) {
dev_err(dev, "failed to enable the DSP MCLK: %d\n", ret);
return ret;
}
ret = regulator_enable(fm34->vdd_supply);
if (ret < 0) {
dev_err(dev, "failed to enable vdd power supply\n");
clk_disable_unprepare(fm34->dap_mclk);
No, dap_mclk has to be on, else there will be no sound on the device.
return ret;
}
return 0;
+}
+static void fm34ne_dsp_reset(struct fm34ne_dsp_data *fm34) +{
gpiod_set_value_cansleep(fm34->reset_gpio, 1);
msleep(20);
gpiod_set_value_cansleep(fm34->reset_gpio, 0);
msleep(100);
+}
+static int fm34ne_dsp_init_chip(struct fm34ne_dsp_data *fm34) +{
const u8 *input_parameter = fm34->data->input_parameter;
int input_parameter_length = fm34->data->input_parameter_length;
int ret;
ret = fm34ne_dsp_set_hw(fm34);
if (ret)
return ret;
fm34ne_dsp_reset(fm34);
gpiod_set_value_cansleep(fm34->bypass_gpio, 1);
msleep(20);
ret = i2c_smbus_write_byte(fm34->client, FM34NE_I2C_CHECK);
if (ret < 0) {
dev_info(&fm34->client->dev, "initial write failed\n");
dev_warn()?
msleep(50);
fm34ne_dsp_reset(fm34);
gpiod_set_value_cansleep(fm34->bypass_gpio, 0);
return ret;
}
ret = fm34ne_dsp_write_config(fm34->client, input_parameter,
input_parameter_length);
if (ret < 0)
return -EINVAL;
Why not propagate the error code from fm34ne_dsp_write_config()?
msleep(100);
gpiod_set_value_cansleep(fm34->bypass_gpio, 0);
dev_info(&fm34->client->dev, "%s detected\n", fm34->data->model);
/* Constantly set DSP to bypass mode for now */
ret = fm34ne_dsp_set_config(fm34, FM34NE_BYPASS);
if (ret)
return ret;
return 0;
+}
regards, dan carpenter
All other notes are reasonable. Thanks
Best regards, Svyatoslav R.
On Wed, Feb 22, 2023 at 10:06:23AM +0200, Svyatoslav Ryhel wrote:
+static int fm34ne_dsp_set_hw(struct fm34ne_dsp_data *fm34) +{
struct device *dev = &fm34->client->dev;
int ret;
ret = clk_prepare_enable(fm34->dap_mclk);
if (ret) {
dev_err(dev, "failed to enable the DSP MCLK: %d\n", ret);
return ret;
}
ret = regulator_enable(fm34->vdd_supply);
if (ret < 0) {
dev_err(dev, "failed to enable vdd power supply\n");
clk_disable_unprepare(fm34->dap_mclk);
No, dap_mclk has to be on, else there will be no sound on the device.
If regulator_enable(fm34->vdd_supply); fails then the probe() is going to fail so the sound isn't going to work anyway. (I have a static checker warning for missing calls to clk_disable_unprepare(), so it's important for me to find out if we are deliberately not cleaning up).
return ret;
}
return 0;
+}
regards, dan carpenter
On Tue, Feb 21, 2023 at 08:32:10PM +0200, Svyatoslav Ryhel wrote:
FM34NE is digital sound processing chip used for active noise suppression mainly on ASUS Transformers.
This looks like it should be fairly straightforward to support within ASoC without too much work, and since it's in the audio path it should probably be referenced from the sound card it'll end up having an ABI impact on the card. Take a look at wm9090 for a moderately complex example of an analogue only device (which this appears to be in terms of system integration).
ср, 22 лют. 2023 р. о 00:41 Mark Brown broonie@kernel.org пише:
On Tue, Feb 21, 2023 at 08:32:10PM +0200, Svyatoslav Ryhel wrote:
FM34NE is digital sound processing chip used for active noise suppression mainly on ASUS Transformers.
This looks like it should be fairly straightforward to support within ASoC without too much work, and since it's in the audio path it should probably be referenced from the sound card it'll end up having an ABI impact on the card. Take a look at wm9090
wm9090 is a sound codec, like rt5631 or wm8903 while fm34 is NOT a sound codec. It is sound processing device which must be active only when DMIC is used. In all other cases it has to be bypassed. At the same time, it has to be set up because else there will be no sound on the actual device. In the current state the driver sets up DSP and sets in constant bypass mode.
for a moderately complex example of an analogue only device (which this appears to be in terms of system integration).
On Wed, Feb 22, 2023 at 10:14:02AM +0200, Svyatoslav Ryhel wrote:
ср, 22 лют. 2023 р. о 00:41 Mark Brown broonie@kernel.org пише:
On Tue, Feb 21, 2023 at 08:32:10PM +0200, Svyatoslav Ryhel wrote:
FM34NE is digital sound processing chip used for active noise suppression mainly on ASUS Transformers.
This looks like it should be fairly straightforward to support within ASoC without too much work, and since it's in the audio path it should probably be referenced from the sound card it'll end up having an ABI impact on the card. Take a look at wm9090
wm9090 is a sound codec, like rt5631 or wm8903 while fm34 is NOT a sound codec. It is sound processing device which must be active only
The WM9090 is not a CODEC, it is an analog amplifier with no digital inputs or outputs. That is exactly the same from a system integration point of view, it takes an audio stream in and routes it to an output with some processing.
when DMIC is used. In all other cases it has to be bypassed. At the same time, it has to be set up because else there will be no sound on the actual device.
DAPM can sort all that out for you.
On 21.02.2023 20:32, Svyatoslav Ryhel wrote:
EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
FM34NE is digital sound processing chip used for active noise suppression mainly on ASUS Transformers.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com
drivers/staging/Kconfig | 2 + drivers/staging/Makefile | 1 + drivers/staging/dsp/Kconfig | 7 + drivers/staging/dsp/Makefile | 2 + drivers/staging/dsp/dsp-fm34ne.c | 364 +++++++++++++ drivers/staging/dsp/dsp-fm34ne.h | 845 +++++++++++++++++++++++++++++++ 6 files changed, 1221 insertions(+) create mode 100644 drivers/staging/dsp/Kconfig create mode 100644 drivers/staging/dsp/Makefile create mode 100644 drivers/staging/dsp/dsp-fm34ne.c create mode 100644 drivers/staging/dsp/dsp-fm34ne.h
diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index 5cfabd5376cc..cd22b7f36b08 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig @@ -80,4 +80,6 @@ source "drivers/staging/qlge/Kconfig"
source "drivers/staging/vme_user/Kconfig"
+source "drivers/staging/dsp/Kconfig"
endif # STAGING diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index f8c3aa9c2418..a7250a0b5fca 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -2,6 +2,7 @@ # Makefile for staging directory
obj-y += media/ +obj-y += dsp/ obj-$(CONFIG_PRISM2_USB) += wlan-ng/ obj-$(CONFIG_FB_OLPC_DCON) += olpc_dcon/ obj-$(CONFIG_RTL8192U) += rtl8192u/ diff --git a/drivers/staging/dsp/Kconfig b/drivers/staging/dsp/Kconfig new file mode 100644 index 000000000000..d295ea063ad5 --- /dev/null +++ b/drivers/staging/dsp/Kconfig @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0 +config DSP_FM34NE
tristate "DSP FM34NE driver"
depends on I2C && GPIOLIB
help
Say Y or M here if you want to add support for Fortemedia FM34NE
DSP mainly used on ASUS T20/T30 Transformers.
diff --git a/drivers/staging/dsp/Makefile b/drivers/staging/dsp/Makefile new file mode 100644 index 000000000000..e60ba3c88e08 --- /dev/null +++ b/drivers/staging/dsp/Makefile @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_DSP_FM34NE) += dsp-fm34ne.o diff --git a/drivers/staging/dsp/dsp-fm34ne.c b/drivers/staging/dsp/dsp-fm34ne.c new file mode 100644 index 000000000000..93a464a7bb4b --- /dev/null +++ b/drivers/staging/dsp/dsp-fm34ne.c @@ -0,0 +1,364 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/*
- Fortemedia FM34NE DSP driver
- */
+#include <linux/clk.h> +#include <linux/clk/tegra.h> +#include <linux/delay.h> +#include <linux/gpio/consumer.h> +#include <linux/i2c.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_gpio.h> +#include <linux/of_device.h> +#include <linux/regulator/consumer.h>
+#include "dsp-fm34ne.h"
+#define FM34NE_I2C_CHECK 0xC0 +#define FM34NE_MAX_RETRY 5
+enum state {
FM34NE_BYPASS,
FM34NE_NS_ENABLE,
FM34NE_NS_DISABLE,
FM34NE_MAX,
+};
+struct fm34ne_dsp_data {
struct i2c_client *client;
struct gpio_desc *bypass_gpio;
struct gpio_desc *reset_gpio;
struct clk *dap_mclk;
struct regulator *vdd_supply;
const struct fm34ne_dsp_devdata *data;
+};
+static int fm34ne_dsp_write_config(struct i2c_client *client,
const u8 *config, size_t size)
+{
int ret, i;
for (i = 0; i < FM34NE_MAX_RETRY; i++) {
ret = i2c_master_send(client, config, size);
if (ret > 0)
return 0;
usleep_range(5000, 6000);
}
return ret;
+}
+static int fm34ne_dsp_set_config(struct fm34ne_dsp_data *fm34, int state) +{
struct device *dev = &fm34->client->dev;
const u8 *enable_ns_parameter = fm34->data->enable_noise_suppression;
int enable_ns_length = fm34->data->enable_ns_length;
const u8 *disable_ns_parameter = fm34->data->disable_noise_suppression;
int disable_ns_length = fm34->data->disable_ns_length;
int ret;
gpiod_set_value_cansleep(fm34->bypass_gpio, 1);
msleep(20);
switch (state) {
case FM34NE_NS_ENABLE:
ret = fm34ne_dsp_write_config(fm34->client, enable_parameter,
sizeof(enable_parameter));
if (ret < 0) {
dev_err(dev, "failed to set DSP enable with %d\n", ret);
goto exit;
}
ret = fm34ne_dsp_write_config(fm34->client, enable_ns_parameter,
enable_ns_length);
if (ret < 0) {
dev_err(dev, "failed to enable DSP noise suppression with %d\n", ret);
goto exit;
}
dev_info(dev, "noise suppression enable DSP parameter written\n");
break;
case FM34NE_NS_DISABLE:
ret = fm34ne_dsp_write_config(fm34->client, enable_parameter,
sizeof(enable_parameter));
if (ret < 0) {
dev_err(dev, "failed to set DSP enable with %d\n", ret);
goto exit;
}
ret = fm34ne_dsp_write_config(fm34->client, disable_ns_parameter,
disable_ns_length);
if (ret < 0) {
dev_err(dev, "failed to disable DSP noise suppression with %d\n", ret);
goto exit;
}
dev_info(dev, "noise suppression disable DSP parameter written\n");
break;
case FM34NE_BYPASS:
default:
ret = fm34ne_dsp_write_config(fm34->client, bypass_parameter,
sizeof(bypass_parameter));
if (ret < 0) {
dev_err(dev, "failed to set DSP bypass with %d\n", ret);
goto exit;
}
dev_info(dev, "bypass DSP parameter written\n");
break;
}
+exit:
gpiod_set_value_cansleep(fm34->bypass_gpio, 0);
return ret;
+}
+static int fm34ne_dsp_set_hw(struct fm34ne_dsp_data *fm34) +{
struct device *dev = &fm34->client->dev;
int ret;
ret = clk_prepare_enable(fm34->dap_mclk);
if (ret) {
dev_err(dev, "failed to enable the DSP MCLK: %d\n", ret);
return ret;
}
ret = regulator_enable(fm34->vdd_supply);
if (ret < 0) {
dev_err(dev, "failed to enable vdd power supply\n");
return ret;
}
return 0;
+}
+static void fm34ne_dsp_reset(struct fm34ne_dsp_data *fm34) +{
gpiod_set_value_cansleep(fm34->reset_gpio, 1);
msleep(20);
gpiod_set_value_cansleep(fm34->reset_gpio, 0);
msleep(100);
+}
+static int fm34ne_dsp_init_chip(struct fm34ne_dsp_data *fm34) +{
const u8 *input_parameter = fm34->data->input_parameter;
int input_parameter_length = fm34->data->input_parameter_length;
int ret;
ret = fm34ne_dsp_set_hw(fm34);
if (ret)
return ret;
fm34ne_dsp_reset(fm34);
gpiod_set_value_cansleep(fm34->bypass_gpio, 1);
msleep(20);
ret = i2c_smbus_write_byte(fm34->client, FM34NE_I2C_CHECK);
if (ret < 0) {
dev_info(&fm34->client->dev, "initial write failed\n");
msleep(50);
fm34ne_dsp_reset(fm34);
gpiod_set_value_cansleep(fm34->bypass_gpio, 0);
return ret;
}
ret = fm34ne_dsp_write_config(fm34->client, input_parameter,
input_parameter_length);
if (ret < 0)
return -EINVAL;
msleep(100);
gpiod_set_value_cansleep(fm34->bypass_gpio, 0);
dev_info(&fm34->client->dev, "%s detected\n", fm34->data->model);
/* Constantly set DSP to bypass mode for now */
ret = fm34ne_dsp_set_config(fm34, FM34NE_BYPASS);
if (ret)
return ret;
return 0;
You can directly return ret; or: return fm34ne_dsp_set_config();
+}
+static int fm34ne_dsp_probe(struct i2c_client *client,
const struct i2c_device_id *id)
+{
struct device *dev = &client->dev;
struct fm34ne_dsp_data *fm34;
int ret;
fm34 = devm_kzalloc(dev, sizeof(*fm34), GFP_KERNEL);
if (!fm34)
return -ENOMEM;
i2c_set_clientdata(client, fm34);
fm34->client = client;
fm34->dap_mclk = devm_clk_get_optional(dev, "mclk");
if (IS_ERR(fm34->dap_mclk))
return dev_err_probe(dev, PTR_ERR(fm34->dap_mclk),
"can't retrieve DSP MCLK\n");
fm34->vdd_supply = devm_regulator_get(dev, "vdd");
if (IS_ERR(fm34->vdd_supply))
return dev_err_probe(dev, PTR_ERR(fm34->vdd_supply),
"failed to get vdd regulator\n");
fm34->reset_gpio = devm_gpiod_get_optional(dev, "reset",
GPIOD_OUT_LOW);
if (IS_ERR(fm34->reset_gpio))
return dev_err_probe(dev, PTR_ERR(fm34->reset_gpio),
"failed to get reset GPIO\n");
/*
* Bypass gpio is used to set audio into bypass mode
* in relation to dsp to be able to program it. Once
* programming is done, bypass gpio has to be set to
* low to return dsp into audio processing.
*/
fm34->bypass_gpio = devm_gpiod_get_optional(dev, "bypass",
GPIOD_OUT_LOW);
if (IS_ERR(fm34->bypass_gpio))
return dev_err_probe(dev, PTR_ERR(fm34->bypass_gpio),
"failed to get bypass GPIO\n");
fm34->data = of_device_get_match_data(dev);
if (!fm34->data)
return -ENODEV;
ret = fm34ne_dsp_init_chip(fm34);
if (ret)
return dev_err_probe(dev, ret,
"failed to init DSP chip\n");
return 0;
+}
+static int fm34ne_dsp_suspend(struct device *dev) +{
struct i2c_client *client = to_i2c_client(dev);
struct fm34ne_dsp_data *fm34 = i2c_get_clientdata(client);
gpiod_set_value_cansleep(fm34->bypass_gpio, 0);
regulator_disable(fm34->vdd_supply);
clk_disable_unprepare(fm34->dap_mclk);
return 0;
+}
+static int fm34ne_dsp_resume(struct device *dev) +{
struct i2c_client *client = to_i2c_client(dev);
struct fm34ne_dsp_data *fm34 = i2c_get_clientdata(client);
int ret;
ret = fm34ne_dsp_init_chip(fm34);
if (ret)
dev_err(&client->dev, "failed to re-init DSP chip with %d\n", ret);
return 0;
+}
+static DEFINE_SIMPLE_DEV_PM_OPS(fm34ne_dsp_pm_ops,
fm34ne_dsp_suspend, fm34ne_dsp_resume);
+static const struct fm34ne_dsp_devdata tf101_dsp_data = {
.model = "ASUS Eee Pad Trnasformer TF101",
.input_parameter = TF101_input_parameter,
.input_parameter_length = sizeof(TF101_input_parameter),
.enable_noise_suppression = TF101_enable_NS,
.enable_ns_length = sizeof(TF101_enable_NS),
.disable_noise_suppression = TF101_disable_NS,
.disable_ns_length = sizeof(TF101_disable_NS),
+};
+static const struct fm34ne_dsp_devdata tf201_dsp_data = {
.model = "ASUS Transformer Prime TF201",
.input_parameter = TF201_input_parameter,
.input_parameter_length = sizeof(TF201_input_parameter),
.enable_noise_suppression = TF201_enable_NS,
.enable_ns_length = sizeof(TF201_enable_NS),
.disable_noise_suppression = TF201_disable_NS,
.disable_ns_length = sizeof(TF201_disable_NS),
+};
+static const struct fm34ne_dsp_devdata tf300t_dsp_data = {
.model = "ASUS Transformer PAD TF300T",
.input_parameter = TF300T_input_parameter,
.input_parameter_length = sizeof(TF300T_input_parameter),
.enable_noise_suppression = TF201_enable_NS,
.enable_ns_length = sizeof(TF201_enable_NS),
.disable_noise_suppression = TF201_disable_NS,
.disable_ns_length = sizeof(TF201_disable_NS),
+};
+static const struct fm34ne_dsp_devdata tf700t_dsp_data = {
.model = "ASUS Transformer Infinity TF700T",
.input_parameter = TF700T_input_parameter,
.input_parameter_length = sizeof(TF700T_input_parameter),
.enable_noise_suppression = TF700T_enable_NS,
.enable_ns_length = sizeof(TF700T_enable_NS),
.disable_noise_suppression = TF700T_disable_NS,
.disable_ns_length = sizeof(TF700T_disable_NS),
+};
+static const struct fm34ne_dsp_devdata chagall_dsp_data = {
.model = "Pegatron Chagall",
.input_parameter = TF300T_input_parameter,
.input_parameter_length = sizeof(TF300T_input_parameter),
.enable_noise_suppression = TF201_enable_NS,
.enable_ns_length = sizeof(TF201_enable_NS),
.disable_noise_suppression = TF201_disable_NS,
.disable_ns_length = sizeof(TF201_disable_NS),
+};
+static const struct of_device_id fm34ne_dsp_match[] = {
{ .compatible = "asus,tf101-dsp", .data = &tf101_dsp_data },
{ .compatible = "asus,tf201-dsp", .data = &tf201_dsp_data },
{ .compatible = "asus,tf300t-dsp", .data = &tf300t_dsp_data },
{ .compatible = "asus,tf700t-dsp", .data = &tf700t_dsp_data },
{ .compatible = "pegatron,chagall-dsp", .data = &chagall_dsp_data },
{ }
+}; +MODULE_DEVICE_TABLE(of, fm34ne_dsp_match);
+static const struct i2c_device_id fm34ne_dsp_id[] = {
{ "dsp_fm34ne", 0 },
{ }
+}; +MODULE_DEVICE_TABLE(i2c, fm34ne_dsp_id);
+static struct i2c_driver fm34ne_dsp_driver = {
.driver = {
.name = "fm34ne-dsp",
.pm = pm_sleep_ptr(&fm34ne_dsp_pm_ops),
.of_match_table = fm34ne_dsp_match,
},
.probe = fm34ne_dsp_probe,
.id_table = fm34ne_dsp_id,
+}; +module_i2c_driver(fm34ne_dsp_driver);
+MODULE_AUTHOR("Svyatoslav Ryhel clamor95@gmail.com"); +MODULE_DESCRIPTION("Fortemedia FM34NE DSP driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/staging/dsp/dsp-fm34ne.h b/drivers/staging/dsp/dsp-fm34ne.h new file mode 100644 index 000000000000..428ac33dd310 --- /dev/null +++ b/drivers/staging/dsp/dsp-fm34ne.h @@ -0,0 +1,845 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */
+#ifndef __DSP_FM34NE_H__ +#define __DSP_FM34NE_H__
+struct fm34ne_dsp_devdata {
const char *model;
const u8 *input_parameter;
int input_parameter_length;
const u8 *enable_noise_suppression;
int enable_ns_length;
const u8 *disable_noise_suppression;
int disable_ns_length;
+};
+/* Common section */ +static const u8 bypass_parameter[] = {
0xC0,
0xFC, 0xF3, 0x3B, 0x23, 0x00, 0x00, 0x04
+};
+static const u8 enable_parameter[] = {
0xC0,
0xFC, 0xF3, 0x3B, 0x23, 0x00, 0x00, 0x00
+};
+/* TF201 section */ +static const u8 TF201_input_parameter[] = {
0xC0,
0xFC, 0xF3, 0x68, 0x64, 0x04,
0xFC, 0xF3, 0x0D, 0x10, 0x00, 0x90, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x01, 0x82, 0x30, 0x50,
0xFC, 0xF3, 0x0D, 0x10, 0x02, 0x27, 0x90, 0x9F,
0xFC, 0xF3, 0x0D, 0x10, 0x03, 0x19, 0x00, 0xA0,
0xFC, 0xF3, 0x0D, 0x10, 0x04, 0x1C, 0x5A, 0xAF,
0xFC, 0xF3, 0x0D, 0x10, 0x05, 0x90, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x06, 0x80, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x07, 0x1C, 0x5A, 0xAF,
0xFC, 0xF3, 0x0D, 0x10, 0x08, 0x90, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x09, 0x19, 0x01, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x0A, 0x27, 0x90, 0x5F,
0xFC, 0xF3, 0x0D, 0x10, 0x0B, 0x19, 0x01, 0x10,
0xFC, 0xF3, 0x0D, 0x10, 0x0C, 0x1C, 0x58, 0xEF,
0xFC, 0xF3, 0x0D, 0x10, 0x0D, 0x90, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x0E, 0x80, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x0F, 0x1C, 0x58, 0xEF,
0xFC, 0xF3, 0x0D, 0x10, 0x10, 0x90, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x11, 0x82, 0x2D, 0x20,
0xFC, 0xF3, 0x0D, 0x10, 0x12, 0x27, 0x98, 0x5F,
0xFC, 0xF3, 0x0D, 0x10, 0x13, 0x19, 0x01, 0x80,
0xFC, 0xF3, 0x0D, 0x10, 0x14, 0x80, 0x50, 0x5A,
0xFC, 0xF3, 0x0D, 0x10, 0x15, 0x90, 0x50, 0x3A,
0xFC, 0xF3, 0x0D, 0x10, 0x16, 0x80, 0x50, 0x6F,
0xFC, 0xF3, 0x0D, 0x10, 0x17, 0x90, 0x50, 0x4F,
0xFC, 0xF3, 0x0D, 0x10, 0x18, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x19, 0x19, 0x00, 0x6F,
0xFC, 0xF3, 0x0D, 0x10, 0x1A, 0x80, 0x00, 0xAC,
0xFC, 0xF3, 0x0D, 0x10, 0x1B, 0x26, 0x7C, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x1C, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x1D, 0x19, 0x1D, 0x82,
0xFC, 0xF3, 0x0D, 0x10, 0x1E, 0x19, 0x1C, 0xEF,
0xFC, 0xF3, 0x0D, 0x10, 0x1F, 0x80, 0x53, 0x9A,
0xFC, 0xF3, 0x0D, 0x10, 0x20, 0x93, 0xE2, 0xAA,
0xFC, 0xF3, 0x0D, 0x10, 0x21, 0x80, 0x4F, 0xBA,
0xFC, 0xF3, 0x0D, 0x10, 0x22, 0x22, 0x7A, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x23, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x24, 0x18, 0x2F, 0xD0,
0xFC, 0xF3, 0x0D, 0x10, 0x25, 0x94, 0x4F, 0xB6,
0xFC, 0xF3, 0x0D, 0x10, 0x26, 0x80, 0x4F, 0x6A,
0xFC, 0xF3, 0x0D, 0x10, 0x27, 0x26, 0x7A, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x28, 0x18, 0x2F, 0x80,
0xFC, 0xF3, 0x0D, 0x10, 0x29, 0x18, 0x2B, 0xCF,
0xFC, 0xF3, 0x0D, 0x10, 0x2A, 0x95, 0x62, 0x06,
0xFC, 0xF3, 0x0D, 0x10, 0x2B, 0x95, 0x61, 0x46,
0xFC, 0xF3, 0x0D, 0x10, 0x2C, 0x40, 0xFA, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x2D, 0x40, 0xE5, 0xB0,
0xFC, 0xF3, 0x0D, 0x10, 0x2E, 0x82, 0x30, 0x14,
0xFC, 0xF3, 0x0D, 0x10, 0x2F, 0x27, 0x00, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x30, 0x22, 0x78, 0x00,
0xFC, 0xF3, 0x0D, 0x10, 0x31, 0x83, 0xFD, 0x44,
0xFC, 0xF3, 0x0D, 0x10, 0x32, 0x26, 0xE2, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x33, 0x19, 0x03, 0x90,
0xFC, 0xF3, 0x0D, 0x10, 0x34, 0x93, 0xFD, 0x4A,
0xFC, 0xF3, 0x0D, 0x10, 0x35, 0x83, 0xFD, 0x5A,
0xFC, 0xF3, 0x0D, 0x10, 0x36, 0x23, 0xA2, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x37, 0x93, 0xFD, 0x5A,
0xFC, 0xF3, 0x0D, 0x10, 0x38, 0x00, 0x00, 0x00,
0xFC, 0xF3, 0x0D, 0x10, 0x39, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x3A, 0x18, 0x3F, 0x7F,
0xFC, 0xF3, 0x0D, 0x10, 0x3B, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x3C, 0x19, 0x6C, 0xA4,
0xFC, 0xF3, 0x0D, 0x10, 0x3D, 0x19, 0x66, 0x7F,
0xFC, 0xF3, 0x0D, 0x10, 0x3E, 0x80, 0x79, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x3F, 0x82, 0x2D, 0x2F,
0xFC, 0xF3, 0x0D, 0x10, 0x40, 0x27, 0x97, 0x9F,
0xFC, 0xF3, 0x0D, 0x10, 0x41, 0x19, 0x04, 0x40,
0xFC, 0xF3, 0x0D, 0x10, 0x42, 0x94, 0x7B, 0xD6,
0xFC, 0xF3, 0x0D, 0x10, 0x43, 0x80, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x44, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x45, 0x18, 0x48, 0xDF,
0xFC, 0xF3, 0x0D, 0x10, 0x46, 0x38, 0x00, 0x87,
0xFC, 0xF3, 0x0D, 0x10, 0x47, 0x09, 0x00, 0x1B,
0xFC, 0xF3, 0x0D, 0x10, 0x48, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x49, 0x18, 0x2D, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x4A, 0x18, 0x21, 0x5F,
0xFC, 0xF3, 0x0D, 0x10, 0x4B, 0x88, 0x4F, 0x47,
0xFC, 0xF3, 0x0D, 0x10, 0x4C, 0x82, 0x2A, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x4D, 0x22, 0x62, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x4E, 0x26, 0x62, 0x7F,
0xFC, 0xF3, 0x0D, 0x10, 0x4F, 0x19, 0x05, 0x25,
0xFC, 0xF3, 0x0D, 0x10, 0x50, 0x3B, 0xFF, 0xC7,
0xFC, 0xF3, 0x0D, 0x10, 0x51, 0x19, 0x05, 0x3F,
0xFC, 0xF3, 0x0D, 0x10, 0x52, 0x0D, 0x01, 0xA6,
0xFC, 0xF3, 0x0D, 0x10, 0x53, 0x92, 0x2A, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x54, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x55, 0x18, 0x23, 0x2F,
0xFC, 0xF3, 0x0D, 0x10, 0x56, 0x96, 0x2A, 0xA1,
0xFC, 0xF3, 0x0D, 0x10, 0x57, 0x96, 0x2A, 0xB0,
0xFC, 0xF3, 0x0D, 0x10, 0x58, 0x9A, 0x2A, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x59, 0x9A, 0x2A, 0xD7,
0xFC, 0xF3, 0x0D, 0x10, 0x5A, 0x96, 0x2A, 0xE8,
0xFC, 0xF3, 0x0D, 0x10, 0x5B, 0x38, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x5C, 0x83, 0xFF, 0xAA,
0xFC, 0xF3, 0x0D, 0x10, 0x5D, 0x3B, 0x20, 0x02,
0xFC, 0xF3, 0x0D, 0x10, 0x5E, 0x36, 0x2B, 0x01,
0xFC, 0xF3, 0x0D, 0x10, 0x5F, 0x36, 0x2B, 0x60,
0xFC, 0xF3, 0x0D, 0x10, 0x60, 0x1C, 0x72, 0x2F,
0xFC, 0xF3, 0x0D, 0x10, 0x61, 0x93, 0xFF, 0x9A,
0xFC, 0xF3, 0x0D, 0x10, 0x62, 0x93, 0xFF, 0xAA,
0xFC, 0xF3, 0x0D, 0x10, 0x63, 0x86, 0x2A, 0xA1,
0xFC, 0xF3, 0x0D, 0x10, 0x64, 0x86, 0x2A, 0xB0,
0xFC, 0xF3, 0x0D, 0x10, 0x65, 0x8A, 0x2A, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x66, 0x8A, 0x2A, 0xD7,
0xFC, 0xF3, 0x0D, 0x10, 0x67, 0x86, 0x2A, 0xE8,
0xFC, 0xF3, 0x0D, 0x10, 0x68, 0x0D, 0x08, 0x28,
0xFC, 0xF3, 0x0D, 0x10, 0x69, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x6A, 0x18, 0x24, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x6B, 0x83, 0xFC, 0xFA,
0xFC, 0xF3, 0x0D, 0x10, 0x6C, 0x23, 0x8A, 0xBF,
0xFC, 0xF3, 0x0D, 0x10, 0x6D, 0x82, 0x2D, 0x2F,
0xFC, 0xF3, 0x0D, 0x10, 0x6E, 0x27, 0x97, 0xDF,
0xFC, 0xF3, 0x0D, 0x10, 0x6F, 0x23, 0xAA, 0x91,
0xFC, 0xF3, 0x0D, 0x10, 0x70, 0x93, 0xFC, 0xFA,
0xFC, 0xF3, 0x0D, 0x10, 0x71, 0x83, 0x80, 0x30,
0xFC, 0xF3, 0x0D, 0x10, 0x72, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x73, 0x18, 0x3E, 0x9F,
0xFC, 0xF3, 0x0D, 0x10, 0x74, 0x80, 0x7A, 0x4A,
0xFC, 0xF3, 0x0D, 0x10, 0x75, 0x19, 0x07, 0xE2,
0xFC, 0xF3, 0x0D, 0x10, 0x76, 0x23, 0x3E, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x77, 0x0D, 0x00, 0xEA,
0xFC, 0xF3, 0x0D, 0x10, 0x78, 0x80, 0x7B, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x79, 0x38, 0x7E, 0x02,
0xFC, 0xF3, 0x0D, 0x10, 0x7A, 0x1C, 0x76, 0x9F,
0xFC, 0xF3, 0x0D, 0x10, 0x7B, 0x90, 0x7B, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x7C, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x7D, 0x19, 0x75, 0xCF,
0xFC, 0xF3, 0x0D, 0x10, 0x7E, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x7F, 0x19, 0x75, 0x9F,
0xFC, 0xF3, 0x68, 0x64, 0x00,
0xFC, 0xF3, 0x3B, 0x3F, 0xA0, 0x91, 0xCB,
0xFC, 0xF3, 0x3B, 0x3F, 0xB0, 0x50, 0x1A,
0xFC, 0xF3, 0x3B, 0x3F, 0xA1, 0x82, 0xF3,
0xFC, 0xF3, 0x3B, 0x3F, 0xB1, 0x02, 0xF5,
0xFC, 0xF3, 0x3B, 0x3F, 0xA2, 0x82, 0xB5,
0xFC, 0xF3, 0x3B, 0x3F, 0xB2, 0x50, 0x1F,
0xFC, 0xF3, 0x3B, 0x3F, 0xA3, 0x83, 0xF4,
0xFC, 0xF3, 0x3B, 0x3F, 0xB3, 0x50, 0x2A,
0xFC, 0xF3, 0x3B, 0x3F, 0xA4, 0x96, 0x66,
0xFC, 0xF3, 0x3B, 0x3F, 0xB4, 0x50, 0x3B,
0xFC, 0xF3, 0x3B, 0x3F, 0xA5, 0x82, 0xCC,
0xFC, 0xF3, 0x3B, 0x3F, 0xB5, 0x50, 0x46,
0xFC, 0xF3, 0x3B, 0x3F, 0xA6, 0xC2, 0xCC,
0xFC, 0xF3, 0x3B, 0x3F, 0xB6, 0x50, 0x46,
0xFC, 0xF3, 0x3B, 0x3F, 0xA7, 0xC2, 0x10,
0xFC, 0xF3, 0x3B, 0x3F, 0xB7, 0x50, 0x4A,
0xFC, 0xF3, 0x3B, 0x3F, 0xA8, 0x82, 0x10,
0xFC, 0xF3, 0x3B, 0x3F, 0xB8, 0x50, 0x4A,
0xFC, 0xF3, 0x3B, 0x3F, 0xA9, 0x82, 0x31,
0xFC, 0xF3, 0x3B, 0x3F, 0xB9, 0x50, 0x4B,
0xFC, 0xF3, 0x3B, 0x3F, 0xAA, 0xC2, 0x31,
0xFC, 0xF3, 0x3B, 0x3F, 0xBA, 0x50, 0x4B,
0xFC, 0xF3, 0x3B, 0x3F, 0xAB, 0x82, 0x3F,
0xFC, 0xF3, 0x3B, 0x3F, 0xBB, 0x50, 0x56,
0xFC, 0xF3, 0x3B, 0x3F, 0xAC, 0xC2, 0x3F,
0xFC, 0xF3, 0x3B, 0x3F, 0xBC, 0x50, 0x56,
0xFC, 0xF3, 0x3B, 0x3F, 0xAD, 0x83, 0xE8,
0xFC, 0xF3, 0x3B, 0x3F, 0xBD, 0x50, 0x6B,
0xFC, 0xF3, 0x3B, 0x3F, 0xAE, 0x97, 0x58,
0xFC, 0xF3, 0x3B, 0x3F, 0xBE, 0x50, 0x74,
0xFC, 0xF3, 0x3B, 0x22, 0xF8, 0x80, 0x05,
0xFC, 0xF3, 0x3B, 0x22, 0xC8, 0x00, 0x29,
0xFC, 0xF3, 0x3B, 0x22, 0xEE, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x22, 0xF9, 0x08, 0x5F,
0xFC, 0xF3, 0x3B, 0x22, 0xFA, 0x24, 0x81,
0xFC, 0xF3, 0x3B, 0x23, 0x05, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x01, 0x00, 0x02,
0xFC, 0xF3, 0x3B, 0x23, 0x07, 0xF0, 0xF0,
0xFC, 0xF3, 0x3B, 0x23, 0x09, 0x08, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x0D, 0x01, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x0C, 0x08, 0x00,
0xFC, 0xF3, 0x3B, 0x22, 0xF2, 0x00, 0x44,
0xFC, 0xF3, 0x3B, 0x22, 0xF6, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x22, 0xC6, 0x00, 0x06,
0xFC, 0xF3, 0x3B, 0x22, 0xC7, 0x00, 0x08,
0xFC, 0xF3, 0x3B, 0x22, 0xD2, 0x8A, 0x94,
0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x01,
0xFC, 0xF3, 0x3B, 0x23, 0x00, 0x00, 0x04,
0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x23, 0x10,
0xFC, 0xF3, 0x3B, 0x23, 0x2F, 0x01, 0x10,
0xFC, 0xF3, 0x3B, 0x23, 0x39, 0x00, 0x06,
0xFC, 0xF3, 0x3B, 0x23, 0xCF, 0x01, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0xD0, 0x06, 0x20,
0xFC, 0xF3, 0x3B, 0x23, 0xD5, 0x3C, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x6E, 0x20, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x33, 0x02, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0xB3, 0x00, 0x0A,
0xFC, 0xF3, 0x3B, 0x23, 0xB4, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x70, 0x40, 0x00,
0xFC, 0xF3, 0x3B, 0x3F, 0xD2, 0x00, 0x32,
0xFC, 0xF3, 0x3B, 0x22, 0xFB, 0x00, 0x00
+};
+static const u8 TF201_enable_NS[] = {
0xC0,
0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x01,
0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x23, 0x01
+};
+static const u8 TF201_disable_NS[] = {
0xC0,
0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x00, 0x10
+};
+/* TF700T section */ +static const u8 TF700T_input_parameter[] = {
0xC0,
0xFC, 0xF3, 0x68, 0x64, 0x04,
0xFC, 0xF3, 0x0D, 0x10, 0x00, 0x90, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x01, 0x82, 0x30, 0x50,
0xFC, 0xF3, 0x0D, 0x10, 0x02, 0x27, 0x90, 0x9F,
0xFC, 0xF3, 0x0D, 0x10, 0x03, 0x19, 0x00, 0xA0,
0xFC, 0xF3, 0x0D, 0x10, 0x04, 0x1C, 0x5A, 0xAF,
0xFC, 0xF3, 0x0D, 0x10, 0x05, 0x90, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x06, 0x80, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x07, 0x1C, 0x5A, 0xAF,
0xFC, 0xF3, 0x0D, 0x10, 0x08, 0x90, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x09, 0x19, 0x01, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x0A, 0x27, 0x90, 0x5F,
0xFC, 0xF3, 0x0D, 0x10, 0x0B, 0x19, 0x01, 0x10,
0xFC, 0xF3, 0x0D, 0x10, 0x0C, 0x1C, 0x58, 0xEF,
0xFC, 0xF3, 0x0D, 0x10, 0x0D, 0x90, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x0E, 0x80, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x0F, 0x1C, 0x58, 0xEF,
0xFC, 0xF3, 0x0D, 0x10, 0x10, 0x90, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x11, 0x82, 0x2D, 0x20,
0xFC, 0xF3, 0x0D, 0x10, 0x12, 0x27, 0x98, 0x5F,
0xFC, 0xF3, 0x0D, 0x10, 0x13, 0x19, 0x01, 0x80,
0xFC, 0xF3, 0x0D, 0x10, 0x14, 0x80, 0x50, 0x5A,
0xFC, 0xF3, 0x0D, 0x10, 0x15, 0x90, 0x50, 0x3A,
0xFC, 0xF3, 0x0D, 0x10, 0x16, 0x80, 0x50, 0x6F,
0xFC, 0xF3, 0x0D, 0x10, 0x17, 0x90, 0x50, 0x4F,
0xFC, 0xF3, 0x0D, 0x10, 0x18, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x19, 0x19, 0x00, 0x6F,
0xFC, 0xF3, 0x0D, 0x10, 0x1A, 0x80, 0x00, 0xAC,
0xFC, 0xF3, 0x0D, 0x10, 0x1B, 0x26, 0x7C, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x1C, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x1D, 0x19, 0x1D, 0x82,
0xFC, 0xF3, 0x0D, 0x10, 0x1E, 0x19, 0x1C, 0xEF,
0xFC, 0xF3, 0x0D, 0x10, 0x1F, 0x80, 0x53, 0x9A,
0xFC, 0xF3, 0x0D, 0x10, 0x20, 0x93, 0xE2, 0xAA,
0xFC, 0xF3, 0x0D, 0x10, 0x21, 0x80, 0x4F, 0xBA,
0xFC, 0xF3, 0x0D, 0x10, 0x22, 0x22, 0x7A, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x23, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x24, 0x18, 0x2F, 0xD0,
0xFC, 0xF3, 0x0D, 0x10, 0x25, 0x94, 0x4F, 0xB6,
0xFC, 0xF3, 0x0D, 0x10, 0x26, 0x80, 0x4F, 0x6A,
0xFC, 0xF3, 0x0D, 0x10, 0x27, 0x26, 0x7A, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x28, 0x18, 0x2F, 0x80,
0xFC, 0xF3, 0x0D, 0x10, 0x29, 0x18, 0x2B, 0xCF,
0xFC, 0xF3, 0x0D, 0x10, 0x2A, 0x95, 0x62, 0x06,
0xFC, 0xF3, 0x0D, 0x10, 0x2B, 0x95, 0x61, 0x46,
0xFC, 0xF3, 0x0D, 0x10, 0x2C, 0x40, 0xFA, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x2D, 0x40, 0xE5, 0xB0,
0xFC, 0xF3, 0x0D, 0x10, 0x2E, 0x82, 0x30, 0x14,
0xFC, 0xF3, 0x0D, 0x10, 0x2F, 0x27, 0x00, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x30, 0x22, 0x78, 0x00,
0xFC, 0xF3, 0x0D, 0x10, 0x31, 0x83, 0xFD, 0x44,
0xFC, 0xF3, 0x0D, 0x10, 0x32, 0x26, 0xE2, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x33, 0x19, 0x03, 0x90,
0xFC, 0xF3, 0x0D, 0x10, 0x34, 0x93, 0xFD, 0x4A,
0xFC, 0xF3, 0x0D, 0x10, 0x35, 0x83, 0xFD, 0x5A,
0xFC, 0xF3, 0x0D, 0x10, 0x36, 0x23, 0xA2, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x37, 0x93, 0xFD, 0x5A,
0xFC, 0xF3, 0x0D, 0x10, 0x38, 0x00, 0x00, 0x00,
0xFC, 0xF3, 0x0D, 0x10, 0x39, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x3A, 0x18, 0x3F, 0x7F,
0xFC, 0xF3, 0x0D, 0x10, 0x3B, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x3C, 0x19, 0x6C, 0xA4,
0xFC, 0xF3, 0x0D, 0x10, 0x3D, 0x19, 0x66, 0x7F,
0xFC, 0xF3, 0x0D, 0x10, 0x3E, 0x80, 0x79, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x3F, 0x82, 0x2D, 0x2F,
0xFC, 0xF3, 0x0D, 0x10, 0x40, 0x27, 0x97, 0x9F,
0xFC, 0xF3, 0x0D, 0x10, 0x41, 0x19, 0x04, 0x40,
0xFC, 0xF3, 0x0D, 0x10, 0x42, 0x94, 0x7B, 0xD6,
0xFC, 0xF3, 0x0D, 0x10, 0x43, 0x80, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x44, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x45, 0x18, 0x48, 0xDF,
0xFC, 0xF3, 0x0D, 0x10, 0x46, 0x38, 0x00, 0x87,
0xFC, 0xF3, 0x0D, 0x10, 0x47, 0x09, 0x00, 0x1B,
0xFC, 0xF3, 0x0D, 0x10, 0x48, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x49, 0x18, 0x2D, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x4A, 0x18, 0x21, 0x5F,
0xFC, 0xF3, 0x0D, 0x10, 0x4B, 0x88, 0x4F, 0x47,
0xFC, 0xF3, 0x0D, 0x10, 0x4C, 0x82, 0x2A, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x4D, 0x22, 0x62, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x4E, 0x26, 0x62, 0x7F,
0xFC, 0xF3, 0x0D, 0x10, 0x4F, 0x19, 0x05, 0x25,
0xFC, 0xF3, 0x0D, 0x10, 0x50, 0x3B, 0xFF, 0xC7,
0xFC, 0xF3, 0x0D, 0x10, 0x51, 0x19, 0x05, 0x3F,
0xFC, 0xF3, 0x0D, 0x10, 0x52, 0x0D, 0x01, 0xA6,
0xFC, 0xF3, 0x0D, 0x10, 0x53, 0x92, 0x2A, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x54, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x55, 0x18, 0x23, 0x2F,
0xFC, 0xF3, 0x0D, 0x10, 0x56, 0x96, 0x2A, 0xA1,
0xFC, 0xF3, 0x0D, 0x10, 0x57, 0x96, 0x2A, 0xB0,
0xFC, 0xF3, 0x0D, 0x10, 0x58, 0x9A, 0x2A, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x59, 0x9A, 0x2A, 0xD7,
0xFC, 0xF3, 0x0D, 0x10, 0x5A, 0x96, 0x2A, 0xE8,
0xFC, 0xF3, 0x0D, 0x10, 0x5B, 0x38, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x5C, 0x83, 0xFF, 0xAA,
0xFC, 0xF3, 0x0D, 0x10, 0x5D, 0x3B, 0x20, 0x02,
0xFC, 0xF3, 0x0D, 0x10, 0x5E, 0x36, 0x2B, 0x01,
0xFC, 0xF3, 0x0D, 0x10, 0x5F, 0x36, 0x2B, 0x60,
0xFC, 0xF3, 0x0D, 0x10, 0x60, 0x1C, 0x72, 0x2F,
0xFC, 0xF3, 0x0D, 0x10, 0x61, 0x93, 0xFF, 0x9A,
0xFC, 0xF3, 0x0D, 0x10, 0x62, 0x93, 0xFF, 0xAA,
0xFC, 0xF3, 0x0D, 0x10, 0x63, 0x86, 0x2A, 0xA1,
0xFC, 0xF3, 0x0D, 0x10, 0x64, 0x86, 0x2A, 0xB0,
0xFC, 0xF3, 0x0D, 0x10, 0x65, 0x8A, 0x2A, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x66, 0x8A, 0x2A, 0xD7,
0xFC, 0xF3, 0x0D, 0x10, 0x67, 0x86, 0x2A, 0xE8,
0xFC, 0xF3, 0x0D, 0x10, 0x68, 0x0D, 0x08, 0x28,
0xFC, 0xF3, 0x0D, 0x10, 0x69, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x6A, 0x18, 0x24, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x6B, 0x83, 0xFC, 0xFA,
0xFC, 0xF3, 0x0D, 0x10, 0x6C, 0x23, 0x8A, 0xBF,
0xFC, 0xF3, 0x0D, 0x10, 0x6D, 0x82, 0x2D, 0x2F,
0xFC, 0xF3, 0x0D, 0x10, 0x6E, 0x27, 0x97, 0xDF,
0xFC, 0xF3, 0x0D, 0x10, 0x6F, 0x23, 0xAA, 0x91,
0xFC, 0xF3, 0x0D, 0x10, 0x70, 0x93, 0xFC, 0xFA,
0xFC, 0xF3, 0x0D, 0x10, 0x71, 0x83, 0x80, 0x30,
0xFC, 0xF3, 0x0D, 0x10, 0x72, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x73, 0x18, 0x3E, 0x9F,
0xFC, 0xF3, 0x0D, 0x10, 0x74, 0x80, 0x7A, 0x4A,
0xFC, 0xF3, 0x0D, 0x10, 0x75, 0x19, 0x07, 0xE2,
0xFC, 0xF3, 0x0D, 0x10, 0x76, 0x23, 0x3E, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x77, 0x0D, 0x00, 0xEA,
0xFC, 0xF3, 0x0D, 0x10, 0x78, 0x80, 0x7B, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x79, 0x38, 0x7E, 0x02,
0xFC, 0xF3, 0x0D, 0x10, 0x7A, 0x1C, 0x76, 0x9F,
0xFC, 0xF3, 0x0D, 0x10, 0x7B, 0x90, 0x7B, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x7C, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x7D, 0x19, 0x75, 0xCF,
0xFC, 0xF3, 0x0D, 0x10, 0x7E, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x7F, 0x19, 0x75, 0x9F,
0xFC, 0xF3, 0x68, 0x64, 0x00,
0xFC, 0xF3, 0x3B, 0x3F, 0xA0, 0x91, 0xCB,
0xFC, 0xF3, 0x3B, 0x3F, 0xB0, 0x50, 0x1A,
0xFC, 0xF3, 0x3B, 0x3F, 0xA1, 0x82, 0xF3,
0xFC, 0xF3, 0x3B, 0x3F, 0xB1, 0x02, 0xF5,
0xFC, 0xF3, 0x3B, 0x3F, 0xA2, 0x82, 0xB5,
0xFC, 0xF3, 0x3B, 0x3F, 0xB2, 0x50, 0x1F,
0xFC, 0xF3, 0x3B, 0x3F, 0xA3, 0x83, 0xF4,
0xFC, 0xF3, 0x3B, 0x3F, 0xB3, 0x50, 0x2A,
0xFC, 0xF3, 0x3B, 0x3F, 0xA4, 0x96, 0x66,
0xFC, 0xF3, 0x3B, 0x3F, 0xB4, 0x50, 0x3B,
0xFC, 0xF3, 0x3B, 0x3F, 0xA5, 0x82, 0xCC,
0xFC, 0xF3, 0x3B, 0x3F, 0xB5, 0x50, 0x46,
0xFC, 0xF3, 0x3B, 0x3F, 0xA6, 0xC2, 0xCC,
0xFC, 0xF3, 0x3B, 0x3F, 0xB6, 0x50, 0x46,
0xFC, 0xF3, 0x3B, 0x3F, 0xA7, 0xC2, 0x10,
0xFC, 0xF3, 0x3B, 0x3F, 0xB7, 0x50, 0x4A,
0xFC, 0xF3, 0x3B, 0x3F, 0xA8, 0x82, 0x10,
0xFC, 0xF3, 0x3B, 0x3F, 0xB8, 0x50, 0x4A,
0xFC, 0xF3, 0x3B, 0x3F, 0xA9, 0x82, 0x31,
0xFC, 0xF3, 0x3B, 0x3F, 0xB9, 0x50, 0x4B,
0xFC, 0xF3, 0x3B, 0x3F, 0xAA, 0xC2, 0x31,
0xFC, 0xF3, 0x3B, 0x3F, 0xBA, 0x50, 0x4B,
0xFC, 0xF3, 0x3B, 0x3F, 0xAB, 0x82, 0x3F,
0xFC, 0xF3, 0x3B, 0x3F, 0xBB, 0x50, 0x56,
0xFC, 0xF3, 0x3B, 0x3F, 0xAC, 0xC2, 0x3F,
0xFC, 0xF3, 0x3B, 0x3F, 0xBC, 0x50, 0x56,
0xFC, 0xF3, 0x3B, 0x3F, 0xAD, 0x83, 0xE8,
0xFC, 0xF3, 0x3B, 0x3F, 0xBD, 0x50, 0x6B,
0xFC, 0xF3, 0x3B, 0x3F, 0xAE, 0x97, 0x58,
0xFC, 0xF3, 0x3B, 0x3F, 0xBE, 0x50, 0x74,
0xFC, 0xF3, 0x3B, 0x22, 0xF8, 0x80, 0x05,
0xFC, 0xF3, 0x3B, 0x22, 0xC8, 0x00, 0x29,
0xFC, 0xF3, 0x3B, 0x22, 0xEE, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x22, 0xF9, 0x08, 0x5F,
0xFC, 0xF3, 0x3B, 0x22, 0xFA, 0x24, 0x81,
0xFC, 0xF3, 0x3B, 0x23, 0x05, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x01, 0x00, 0x02,
0xFC, 0xF3, 0x3B, 0x23, 0x07, 0xF0, 0xF0,
0xFC, 0xF3, 0x3B, 0x23, 0x09, 0x08, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x0D, 0x01, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x0C, 0x0E, 0x20,
0xFC, 0xF3, 0x3B, 0x22, 0xF2, 0x00, 0x44,
0xFC, 0xF3, 0x3B, 0x22, 0xF6, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x22, 0xC6, 0x00, 0x06,
0xFC, 0xF3, 0x3B, 0x22, 0xC7, 0x00, 0x08,
0xFC, 0xF3, 0x3B, 0x22, 0xD2, 0x8A, 0x94,
0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x01,
0xFC, 0xF3, 0x3B, 0x23, 0x00, 0x00, 0x04,
0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x23, 0x10,
0xFC, 0xF3, 0x3B, 0x23, 0x2F, 0x01, 0x10,
0xFC, 0xF3, 0x3B, 0x23, 0x39, 0x00, 0x06,
0xFC, 0xF3, 0x3B, 0x23, 0xCF, 0x01, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0xD0, 0x06, 0x20,
0xFC, 0xF3, 0x3B, 0x23, 0xD5, 0x3C, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x6E, 0x20, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x33, 0x02, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0xB3, 0x00, 0x0A,
0xFC, 0xF3, 0x3B, 0x23, 0xB4, 0x00, 0x02,
0xFC, 0xF3, 0x3B, 0x23, 0x70, 0x40, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x91, 0x40, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x92, 0x40, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x93, 0x40, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x94, 0x40, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x95, 0x40, 0x00,
0xFC, 0xF3, 0x3B, 0x3F, 0xD2, 0x00, 0x32,
0xFC, 0xF3, 0x3B, 0x22, 0xFB, 0x00, 0x00
+};
+static const u8 TF700T_enable_NS[] = {
0xC0,
0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x01,
0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x23, 0x01,
0xFC, 0xF3, 0x3B, 0x23, 0x0C, 0x08, 0x00
+};
+static const u8 TF700T_disable_NS[] = {
0xC0,
0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x00, 0x10,
0xFC, 0xF3, 0x3B, 0x23, 0x0C, 0x15, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x6E, 0x7F, 0xFF,
0xFC, 0xF3, 0x3B, 0x23, 0xCF, 0x02, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0xD0, 0x02, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0xD5, 0x10, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x00, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x22, 0xFB, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x84, 0x00, 0x03
+};
+/* TF300T section */ +static const u8 TF300T_input_parameter[] = {
0xC0,
0xFC, 0xF3, 0x68, 0x64, 0x04,
0xFC, 0xF3, 0x0D, 0x10, 0x00, 0x90, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x01, 0x82, 0x30, 0x50,
0xFC, 0xF3, 0x0D, 0x10, 0x02, 0x27, 0x90, 0x9F,
0xFC, 0xF3, 0x0D, 0x10, 0x03, 0x19, 0x00, 0xA0,
0xFC, 0xF3, 0x0D, 0x10, 0x04, 0x1C, 0x5A, 0xAF,
0xFC, 0xF3, 0x0D, 0x10, 0x05, 0x90, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x06, 0x80, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x07, 0x1C, 0x5A, 0xAF,
0xFC, 0xF3, 0x0D, 0x10, 0x08, 0x90, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x09, 0x19, 0x01, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x0A, 0x27, 0x90, 0x5F,
0xFC, 0xF3, 0x0D, 0x10, 0x0B, 0x19, 0x01, 0x10,
0xFC, 0xF3, 0x0D, 0x10, 0x0C, 0x1C, 0x58, 0xEF,
0xFC, 0xF3, 0x0D, 0x10, 0x0D, 0x90, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x0E, 0x80, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x0F, 0x1C, 0x58, 0xEF,
0xFC, 0xF3, 0x0D, 0x10, 0x10, 0x90, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x11, 0x82, 0x2D, 0x20,
0xFC, 0xF3, 0x0D, 0x10, 0x12, 0x27, 0x98, 0x5F,
0xFC, 0xF3, 0x0D, 0x10, 0x13, 0x19, 0x01, 0x80,
0xFC, 0xF3, 0x0D, 0x10, 0x14, 0x80, 0x50, 0x5A,
0xFC, 0xF3, 0x0D, 0x10, 0x15, 0x90, 0x50, 0x3A,
0xFC, 0xF3, 0x0D, 0x10, 0x16, 0x80, 0x50, 0x6F,
0xFC, 0xF3, 0x0D, 0x10, 0x17, 0x90, 0x50, 0x4F,
0xFC, 0xF3, 0x0D, 0x10, 0x18, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x19, 0x19, 0x00, 0x6F,
0xFC, 0xF3, 0x0D, 0x10, 0x1A, 0x80, 0x00, 0xAC,
0xFC, 0xF3, 0x0D, 0x10, 0x1B, 0x26, 0x7C, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x1C, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x1D, 0x19, 0x1D, 0x82,
0xFC, 0xF3, 0x0D, 0x10, 0x1E, 0x19, 0x1C, 0xEF,
0xFC, 0xF3, 0x0D, 0x10, 0x1F, 0x80, 0x53, 0x9A,
0xFC, 0xF3, 0x0D, 0x10, 0x20, 0x93, 0xE2, 0xAA,
0xFC, 0xF3, 0x0D, 0x10, 0x21, 0x80, 0x4F, 0xBA,
0xFC, 0xF3, 0x0D, 0x10, 0x22, 0x22, 0x7A, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x23, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x24, 0x18, 0x2F, 0xD0,
0xFC, 0xF3, 0x0D, 0x10, 0x25, 0x94, 0x4F, 0xB6,
0xFC, 0xF3, 0x0D, 0x10, 0x26, 0x80, 0x4F, 0x6A,
0xFC, 0xF3, 0x0D, 0x10, 0x27, 0x26, 0x7A, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x28, 0x18, 0x2F, 0x80,
0xFC, 0xF3, 0x0D, 0x10, 0x29, 0x18, 0x2B, 0xCF,
0xFC, 0xF3, 0x0D, 0x10, 0x2A, 0x95, 0x62, 0x06,
0xFC, 0xF3, 0x0D, 0x10, 0x2B, 0x95, 0x61, 0x46,
0xFC, 0xF3, 0x0D, 0x10, 0x2C, 0x40, 0xFA, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x2D, 0x40, 0xE5, 0xB0,
0xFC, 0xF3, 0x0D, 0x10, 0x2E, 0x82, 0x30, 0x14,
0xFC, 0xF3, 0x0D, 0x10, 0x2F, 0x27, 0x00, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x30, 0x22, 0x78, 0x00,
0xFC, 0xF3, 0x0D, 0x10, 0x31, 0x83, 0xFD, 0x44,
0xFC, 0xF3, 0x0D, 0x10, 0x32, 0x26, 0xE2, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x33, 0x19, 0x03, 0x90,
0xFC, 0xF3, 0x0D, 0x10, 0x34, 0x93, 0xFD, 0x4A,
0xFC, 0xF3, 0x0D, 0x10, 0x35, 0x83, 0xFD, 0x5A,
0xFC, 0xF3, 0x0D, 0x10, 0x36, 0x23, 0xA2, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x37, 0x93, 0xFD, 0x5A,
0xFC, 0xF3, 0x0D, 0x10, 0x38, 0x00, 0x00, 0x00,
0xFC, 0xF3, 0x0D, 0x10, 0x39, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x3A, 0x18, 0x3F, 0x7F,
0xFC, 0xF3, 0x0D, 0x10, 0x3B, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x3C, 0x19, 0x6C, 0xA4,
0xFC, 0xF3, 0x0D, 0x10, 0x3D, 0x19, 0x66, 0x7F,
0xFC, 0xF3, 0x0D, 0x10, 0x3E, 0x80, 0x79, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x3F, 0x82, 0x2D, 0x2F,
0xFC, 0xF3, 0x0D, 0x10, 0x40, 0x27, 0x97, 0x9F,
0xFC, 0xF3, 0x0D, 0x10, 0x41, 0x19, 0x04, 0x40,
0xFC, 0xF3, 0x0D, 0x10, 0x42, 0x94, 0x7B, 0xD6,
0xFC, 0xF3, 0x0D, 0x10, 0x43, 0x80, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x44, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x45, 0x18, 0x48, 0xDF,
0xFC, 0xF3, 0x0D, 0x10, 0x46, 0x38, 0x00, 0x87,
0xFC, 0xF3, 0x0D, 0x10, 0x47, 0x09, 0x00, 0x1B,
0xFC, 0xF3, 0x0D, 0x10, 0x48, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x49, 0x18, 0x2D, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x4A, 0x18, 0x21, 0x5F,
0xFC, 0xF3, 0x0D, 0x10, 0x4B, 0x88, 0x4F, 0x47,
0xFC, 0xF3, 0x0D, 0x10, 0x4C, 0x82, 0x2A, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x4D, 0x22, 0x62, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x4E, 0x26, 0x62, 0x7F,
0xFC, 0xF3, 0x0D, 0x10, 0x4F, 0x19, 0x05, 0x25,
0xFC, 0xF3, 0x0D, 0x10, 0x50, 0x3B, 0xFF, 0xC7,
0xFC, 0xF3, 0x0D, 0x10, 0x51, 0x19, 0x05, 0x3F,
0xFC, 0xF3, 0x0D, 0x10, 0x52, 0x0D, 0x01, 0xA6,
0xFC, 0xF3, 0x0D, 0x10, 0x53, 0x92, 0x2A, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x54, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x55, 0x18, 0x23, 0x2F,
0xFC, 0xF3, 0x0D, 0x10, 0x56, 0x96, 0x2A, 0xA1,
0xFC, 0xF3, 0x0D, 0x10, 0x57, 0x96, 0x2A, 0xB0,
0xFC, 0xF3, 0x0D, 0x10, 0x58, 0x9A, 0x2A, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x59, 0x9A, 0x2A, 0xD7,
0xFC, 0xF3, 0x0D, 0x10, 0x5A, 0x96, 0x2A, 0xE8,
0xFC, 0xF3, 0x0D, 0x10, 0x5B, 0x38, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x5C, 0x83, 0xFF, 0xAA,
0xFC, 0xF3, 0x0D, 0x10, 0x5D, 0x3B, 0x20, 0x02,
0xFC, 0xF3, 0x0D, 0x10, 0x5E, 0x36, 0x2B, 0x01,
0xFC, 0xF3, 0x0D, 0x10, 0x5F, 0x36, 0x2B, 0x60,
0xFC, 0xF3, 0x0D, 0x10, 0x60, 0x1C, 0x72, 0x2F,
0xFC, 0xF3, 0x0D, 0x10, 0x61, 0x93, 0xFF, 0x9A,
0xFC, 0xF3, 0x0D, 0x10, 0x62, 0x93, 0xFF, 0xAA,
0xFC, 0xF3, 0x0D, 0x10, 0x63, 0x86, 0x2A, 0xA1,
0xFC, 0xF3, 0x0D, 0x10, 0x64, 0x86, 0x2A, 0xB0,
0xFC, 0xF3, 0x0D, 0x10, 0x65, 0x8A, 0x2A, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x66, 0x8A, 0x2A, 0xD7,
0xFC, 0xF3, 0x0D, 0x10, 0x67, 0x86, 0x2A, 0xE8,
0xFC, 0xF3, 0x0D, 0x10, 0x68, 0x0D, 0x08, 0x28,
0xFC, 0xF3, 0x0D, 0x10, 0x69, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x6A, 0x18, 0x24, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x6B, 0x83, 0xFC, 0xFA,
0xFC, 0xF3, 0x0D, 0x10, 0x6C, 0x23, 0x8A, 0xBF,
0xFC, 0xF3, 0x0D, 0x10, 0x6D, 0x82, 0x2D, 0x2F,
0xFC, 0xF3, 0x0D, 0x10, 0x6E, 0x27, 0x97, 0xDF,
0xFC, 0xF3, 0x0D, 0x10, 0x6F, 0x23, 0xAA, 0x91,
0xFC, 0xF3, 0x0D, 0x10, 0x70, 0x93, 0xFC, 0xFA,
0xFC, 0xF3, 0x0D, 0x10, 0x71, 0x83, 0x80, 0x30,
0xFC, 0xF3, 0x0D, 0x10, 0x72, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x73, 0x18, 0x3E, 0x9F,
0xFC, 0xF3, 0x0D, 0x10, 0x74, 0x80, 0x7A, 0x4A,
0xFC, 0xF3, 0x0D, 0x10, 0x75, 0x19, 0x07, 0xE2,
0xFC, 0xF3, 0x0D, 0x10, 0x76, 0x23, 0x3E, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x77, 0x0D, 0x00, 0xEA,
0xFC, 0xF3, 0x0D, 0x10, 0x78, 0x80, 0x7B, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x79, 0x38, 0x7E, 0x02,
0xFC, 0xF3, 0x0D, 0x10, 0x7A, 0x1C, 0x76, 0x9F,
0xFC, 0xF3, 0x0D, 0x10, 0x7B, 0x90, 0x7B, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x7C, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x7D, 0x19, 0x75, 0xCF,
0xFC, 0xF3, 0x0D, 0x10, 0x7E, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x7F, 0x19, 0x75, 0x9F,
0xFC, 0xF3, 0x68, 0x64, 0x00,
0xFC, 0xF3, 0x3B, 0x3F, 0xA0, 0x91, 0xCB,
0xFC, 0xF3, 0x3B, 0x3F, 0xB0, 0x50, 0x1A,
0xFC, 0xF3, 0x3B, 0x3F, 0xA1, 0x82, 0xF3,
0xFC, 0xF3, 0x3B, 0x3F, 0xB1, 0x02, 0xF5,
0xFC, 0xF3, 0x3B, 0x3F, 0xA2, 0x82, 0xB5,
0xFC, 0xF3, 0x3B, 0x3F, 0xB2, 0x50, 0x1F,
0xFC, 0xF3, 0x3B, 0x3F, 0xA3, 0x83, 0xF4,
0xFC, 0xF3, 0x3B, 0x3F, 0xB3, 0x50, 0x2A,
0xFC, 0xF3, 0x3B, 0x3F, 0xA4, 0x96, 0x66,
0xFC, 0xF3, 0x3B, 0x3F, 0xB4, 0x50, 0x3B,
0xFC, 0xF3, 0x3B, 0x3F, 0xA5, 0x82, 0xCC,
0xFC, 0xF3, 0x3B, 0x3F, 0xB5, 0x50, 0x46,
0xFC, 0xF3, 0x3B, 0x3F, 0xA6, 0xC2, 0xCC,
0xFC, 0xF3, 0x3B, 0x3F, 0xB6, 0x50, 0x46,
0xFC, 0xF3, 0x3B, 0x3F, 0xA7, 0xC2, 0x10,
0xFC, 0xF3, 0x3B, 0x3F, 0xB7, 0x50, 0x4A,
0xFC, 0xF3, 0x3B, 0x3F, 0xA8, 0x82, 0x10,
0xFC, 0xF3, 0x3B, 0x3F, 0xB8, 0x50, 0x4A,
0xFC, 0xF3, 0x3B, 0x3F, 0xA9, 0x82, 0x31,
0xFC, 0xF3, 0x3B, 0x3F, 0xB9, 0x50, 0x4B,
0xFC, 0xF3, 0x3B, 0x3F, 0xAA, 0xC2, 0x31,
0xFC, 0xF3, 0x3B, 0x3F, 0xBA, 0x50, 0x4B,
0xFC, 0xF3, 0x3B, 0x3F, 0xAB, 0x82, 0x3F,
0xFC, 0xF3, 0x3B, 0x3F, 0xBB, 0x50, 0x56,
0xFC, 0xF3, 0x3B, 0x3F, 0xAC, 0xC2, 0x3F,
0xFC, 0xF3, 0x3B, 0x3F, 0xBC, 0x50, 0x56,
0xFC, 0xF3, 0x3B, 0x3F, 0xAD, 0x83, 0xE8,
0xFC, 0xF3, 0x3B, 0x3F, 0xBD, 0x50, 0x6B,
0xFC, 0xF3, 0x3B, 0x3F, 0xAE, 0x97, 0x58,
0xFC, 0xF3, 0x3B, 0x3F, 0xBE, 0x50, 0x74,
0xFC, 0xF3, 0x3B, 0x22, 0xF8, 0x80, 0x05,
0xFC, 0xF3, 0x3B, 0x22, 0xC8, 0x00, 0x29,
0xFC, 0xF3, 0x3B, 0x22, 0xEE, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x22, 0xF9, 0x08, 0x5F,
0xFC, 0xF3, 0x3B, 0x22, 0xFA, 0x24, 0x81,
0xFC, 0xF3, 0x3B, 0x23, 0x05, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x01, 0x00, 0x02,
0xFC, 0xF3, 0x3B, 0x23, 0x07, 0xF0, 0xF0,
0xFC, 0xF3, 0x3B, 0x23, 0x09, 0x08, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x0D, 0x01, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x0C, 0x0E, 0x20,
0xFC, 0xF3, 0x3B, 0x22, 0xF2, 0x00, 0x44,
0xFC, 0xF3, 0x3B, 0x22, 0xF6, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x22, 0xC6, 0x00, 0x06,
0xFC, 0xF3, 0x3B, 0x22, 0xC7, 0x00, 0x08,
0xFC, 0xF3, 0x3B, 0x22, 0xD2, 0x8A, 0x94,
0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x01,
0xFC, 0xF3, 0x3B, 0x23, 0x00, 0x00, 0x04,
0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x23, 0x10,
0xFC, 0xF3, 0x3B, 0x23, 0x2F, 0x01, 0x10,
0xFC, 0xF3, 0x3B, 0x23, 0x39, 0x00, 0x06,
0xFC, 0xF3, 0x3B, 0x23, 0xCF, 0x01, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0xD0, 0x06, 0x20,
0xFC, 0xF3, 0x3B, 0x23, 0xD5, 0x3C, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x6E, 0x20, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x33, 0x02, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0xB3, 0x00, 0x0A,
0xFC, 0xF3, 0x3B, 0x23, 0xB4, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x70, 0x40, 0x00,
0xFC, 0xF3, 0x3B, 0x3F, 0xD2, 0x00, 0x32,
0xFC, 0xF3, 0x3B, 0x22, 0xFB, 0x00, 0x00
+};
+/* TF101 section */ +static const u8 TF101_input_parameter[] = {
0xC0,
0xFC, 0xF3, 0x68, 0x64, 0x04,
0xFC, 0xF3, 0x0D, 0x10, 0x00, 0x90, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x01, 0x82, 0x30, 0x50,
0xFC, 0xF3, 0x0D, 0x10, 0x02, 0x27, 0x90, 0x9F,
0xFC, 0xF3, 0x0D, 0x10, 0x03, 0x19, 0x00, 0xA0,
0xFC, 0xF3, 0x0D, 0x10, 0x04, 0x1C, 0x5A, 0xAF,
0xFC, 0xF3, 0x0D, 0x10, 0x05, 0x90, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x06, 0x80, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x07, 0x1C, 0x5A, 0xAF,
0xFC, 0xF3, 0x0D, 0x10, 0x08, 0x90, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x09, 0x19, 0x01, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x0A, 0x27, 0x90, 0x5F,
0xFC, 0xF3, 0x0D, 0x10, 0x0B, 0x19, 0x01, 0x10,
0xFC, 0xF3, 0x0D, 0x10, 0x0C, 0x1C, 0x58, 0xEF,
0xFC, 0xF3, 0x0D, 0x10, 0x0D, 0x90, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x0E, 0x80, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x0F, 0x1C, 0x58, 0xEF,
0xFC, 0xF3, 0x0D, 0x10, 0x10, 0x90, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x11, 0x82, 0x2D, 0x20,
0xFC, 0xF3, 0x0D, 0x10, 0x12, 0x27, 0x98, 0x5F,
0xFC, 0xF3, 0x0D, 0x10, 0x13, 0x19, 0x01, 0x80,
0xFC, 0xF3, 0x0D, 0x10, 0x14, 0x80, 0x50, 0x5A,
0xFC, 0xF3, 0x0D, 0x10, 0x15, 0x90, 0x50, 0x3A,
0xFC, 0xF3, 0x0D, 0x10, 0x16, 0x80, 0x50, 0x6F,
0xFC, 0xF3, 0x0D, 0x10, 0x17, 0x90, 0x50, 0x4F,
0xFC, 0xF3, 0x0D, 0x10, 0x18, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x19, 0x19, 0x00, 0x6F,
0xFC, 0xF3, 0x0D, 0x10, 0x1A, 0x80, 0x00, 0xAC,
0xFC, 0xF3, 0x0D, 0x10, 0x1B, 0x26, 0x7C, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x1C, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x1D, 0x19, 0x1D, 0x82,
0xFC, 0xF3, 0x0D, 0x10, 0x1E, 0x19, 0x1C, 0xEF,
0xFC, 0xF3, 0x0D, 0x10, 0x1F, 0x80, 0x53, 0x9A,
0xFC, 0xF3, 0x0D, 0x10, 0x20, 0x93, 0xE2, 0xAA,
0xFC, 0xF3, 0x0D, 0x10, 0x21, 0x80, 0x4F, 0xBA,
0xFC, 0xF3, 0x0D, 0x10, 0x22, 0x22, 0x7A, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x23, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x24, 0x18, 0x2F, 0xD0,
0xFC, 0xF3, 0x0D, 0x10, 0x25, 0x94, 0x4F, 0xB6,
0xFC, 0xF3, 0x0D, 0x10, 0x26, 0x80, 0x4F, 0x6A,
0xFC, 0xF3, 0x0D, 0x10, 0x27, 0x26, 0x7A, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x28, 0x18, 0x2F, 0x80,
0xFC, 0xF3, 0x0D, 0x10, 0x29, 0x18, 0x2B, 0xCF,
0xFC, 0xF3, 0x0D, 0x10, 0x2A, 0x95, 0x62, 0x06,
0xFC, 0xF3, 0x0D, 0x10, 0x2B, 0x95, 0x61, 0x46,
0xFC, 0xF3, 0x0D, 0x10, 0x2C, 0x40, 0xFA, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x2D, 0x40, 0xE5, 0xB0,
0xFC, 0xF3, 0x0D, 0x10, 0x2E, 0x82, 0x30, 0x14,
0xFC, 0xF3, 0x0D, 0x10, 0x2F, 0x27, 0x00, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x30, 0x22, 0x78, 0x00,
0xFC, 0xF3, 0x0D, 0x10, 0x31, 0x83, 0xFD, 0x44,
0xFC, 0xF3, 0x0D, 0x10, 0x32, 0x26, 0xE2, 0x0F,
0xFC, 0xF3, 0x0D, 0x10, 0x33, 0x19, 0x03, 0x90,
0xFC, 0xF3, 0x0D, 0x10, 0x34, 0x93, 0xFD, 0x4A,
0xFC, 0xF3, 0x0D, 0x10, 0x35, 0x83, 0xFD, 0x5A,
0xFC, 0xF3, 0x0D, 0x10, 0x36, 0x23, 0xA2, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x37, 0x93, 0xFD, 0x5A,
0xFC, 0xF3, 0x0D, 0x10, 0x38, 0x00, 0x00, 0x00,
0xFC, 0xF3, 0x0D, 0x10, 0x39, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x3A, 0x18, 0x3F, 0x7F,
0xFC, 0xF3, 0x0D, 0x10, 0x3B, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x3C, 0x19, 0x6C, 0xA4,
0xFC, 0xF3, 0x0D, 0x10, 0x3D, 0x19, 0x66, 0x7F,
0xFC, 0xF3, 0x0D, 0x10, 0x3E, 0x80, 0x79, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x3F, 0x82, 0x2D, 0x2F,
0xFC, 0xF3, 0x0D, 0x10, 0x40, 0x27, 0x97, 0x9F,
0xFC, 0xF3, 0x0D, 0x10, 0x41, 0x19, 0x04, 0x40,
0xFC, 0xF3, 0x0D, 0x10, 0x42, 0x94, 0x7B, 0xD6,
0xFC, 0xF3, 0x0D, 0x10, 0x43, 0x80, 0x00, 0x1A,
0xFC, 0xF3, 0x0D, 0x10, 0x44, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x45, 0x18, 0x48, 0xDF,
0xFC, 0xF3, 0x0D, 0x10, 0x46, 0x38, 0x00, 0x87,
0xFC, 0xF3, 0x0D, 0x10, 0x47, 0x09, 0x00, 0x1B,
0xFC, 0xF3, 0x0D, 0x10, 0x48, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x49, 0x18, 0x2D, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x4A, 0x18, 0x21, 0x5F,
0xFC, 0xF3, 0x0D, 0x10, 0x4B, 0x88, 0x4F, 0x47,
0xFC, 0xF3, 0x0D, 0x10, 0x4C, 0x82, 0x2A, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x4D, 0x22, 0x62, 0x1F,
0xFC, 0xF3, 0x0D, 0x10, 0x4E, 0x26, 0x62, 0x7F,
0xFC, 0xF3, 0x0D, 0x10, 0x4F, 0x19, 0x05, 0x25,
0xFC, 0xF3, 0x0D, 0x10, 0x50, 0x3B, 0xFF, 0xC7,
0xFC, 0xF3, 0x0D, 0x10, 0x51, 0x19, 0x05, 0x3F,
0xFC, 0xF3, 0x0D, 0x10, 0x52, 0x0D, 0x01, 0xA6,
0xFC, 0xF3, 0x0D, 0x10, 0x53, 0x92, 0x2A, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x54, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x55, 0x18, 0x23, 0x2F,
0xFC, 0xF3, 0x0D, 0x10, 0x56, 0x96, 0x2A, 0xA1,
0xFC, 0xF3, 0x0D, 0x10, 0x57, 0x96, 0x2A, 0xB0,
0xFC, 0xF3, 0x0D, 0x10, 0x58, 0x9A, 0x2A, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x59, 0x9A, 0x2A, 0xD7,
0xFC, 0xF3, 0x0D, 0x10, 0x5A, 0x96, 0x2A, 0xE8,
0xFC, 0xF3, 0x0D, 0x10, 0x5B, 0x38, 0x00, 0x0A,
0xFC, 0xF3, 0x0D, 0x10, 0x5C, 0x83, 0xFF, 0xAA,
0xFC, 0xF3, 0x0D, 0x10, 0x5D, 0x3B, 0x20, 0x02,
0xFC, 0xF3, 0x0D, 0x10, 0x5E, 0x36, 0x2B, 0x01,
0xFC, 0xF3, 0x0D, 0x10, 0x5F, 0x36, 0x2B, 0x60,
0xFC, 0xF3, 0x0D, 0x10, 0x60, 0x1C, 0x72, 0x2F,
0xFC, 0xF3, 0x0D, 0x10, 0x61, 0x93, 0xFF, 0x9A,
0xFC, 0xF3, 0x0D, 0x10, 0x62, 0x93, 0xFF, 0xAA,
0xFC, 0xF3, 0x0D, 0x10, 0x63, 0x86, 0x2A, 0xA1,
0xFC, 0xF3, 0x0D, 0x10, 0x64, 0x86, 0x2A, 0xB0,
0xFC, 0xF3, 0x0D, 0x10, 0x65, 0x8A, 0x2A, 0xCA,
0xFC, 0xF3, 0x0D, 0x10, 0x66, 0x8A, 0x2A, 0xD7,
0xFC, 0xF3, 0x0D, 0x10, 0x67, 0x86, 0x2A, 0xE8,
0xFC, 0xF3, 0x0D, 0x10, 0x68, 0x0D, 0x08, 0x28,
0xFC, 0xF3, 0x0D, 0x10, 0x69, 0x34, 0x00, 0x0E,
0xFC, 0xF3, 0x0D, 0x10, 0x6A, 0x18, 0x24, 0x0F,
0xFC, 0xF3, 0x68, 0x64, 0x00,
0xFC, 0xF3, 0x3B, 0x3F, 0xA0, 0x90, 0x05,
0xFC, 0xF3, 0x3B, 0x3F, 0xB0, 0x50, 0x00,
0xFC, 0xF3, 0x3B, 0x3F, 0xA1, 0x91, 0xCB,
0xFC, 0xF3, 0x3B, 0x3F, 0xB1, 0x50, 0x1A,
0xFC, 0xF3, 0x3B, 0x3F, 0xA2, 0x82, 0xF3,
0xFC, 0xF3, 0x3B, 0x3F, 0xB2, 0x02, 0xF5,
0xFC, 0xF3, 0x3B, 0x3F, 0xA3, 0x82, 0xB5,
0xFC, 0xF3, 0x3B, 0x3F, 0xB3, 0x50, 0x1F,
0xFC, 0xF3, 0x3B, 0x3F, 0xA4, 0x83, 0xF4,
0xFC, 0xF3, 0x3B, 0x3F, 0xB4, 0x50, 0x2A,
0xFC, 0xF3, 0x3B, 0x3F, 0xA5, 0x96, 0x66,
0xFC, 0xF3, 0x3B, 0x3F, 0xB5, 0x50, 0x3B,
0xFC, 0xF3, 0x3B, 0x3F, 0xA6, 0x84, 0x8C,
0xFC, 0xF3, 0x3B, 0x3F, 0xB6, 0x50, 0x3E,
0xFC, 0xF3, 0x3B, 0x3F, 0xA7, 0xC4, 0x8C,
0xFC, 0xF3, 0x3B, 0x3F, 0xB7, 0x50, 0x3E,
0xFC, 0xF3, 0x3B, 0x3F, 0xA8, 0x82, 0xCC,
0xFC, 0xF3, 0x3B, 0x3F, 0xB8, 0x50, 0x46,
0xFC, 0xF3, 0x3B, 0x3F, 0xA9, 0xC2, 0xCC,
0xFC, 0xF3, 0x3B, 0x3F, 0xB9, 0x50, 0x46,
0xFC, 0xF3, 0x3B, 0x3F, 0xAA, 0xC2, 0x10,
0xFC, 0xF3, 0x3B, 0x3F, 0xBA, 0x50, 0x4A,
0xFC, 0xF3, 0x3B, 0x3F, 0xAB, 0x82, 0x10,
0xFC, 0xF3, 0x3B, 0x3F, 0xBB, 0x50, 0x4A,
0xFC, 0xF3, 0x3B, 0x3F, 0xAC, 0x82, 0x31,
0xFC, 0xF3, 0x3B, 0x3F, 0xBC, 0x50, 0x4B,
0xFC, 0xF3, 0x3B, 0x3F, 0xAD, 0xC2, 0x31,
0xFC, 0xF3, 0x3B, 0x3F, 0xBD, 0x50, 0x4B,
0xFC, 0xF3, 0x3B, 0x3F, 0xAE, 0x82, 0x3F,
0xFC, 0xF3, 0x3B, 0x3F, 0xBE, 0x50, 0x56,
0xFC, 0xF3, 0x3B, 0x3F, 0xAF, 0xC2, 0x3F,
0xFC, 0xF3, 0x3B, 0x3F, 0xBF, 0x50, 0x56,
0xFC, 0xF3, 0x3B, 0x22, 0xF8, 0x80, 0x05,
0xFC, 0xF3, 0x3B, 0x22, 0xC8, 0x00, 0x09,
0xFC, 0xF3, 0x3B, 0x22, 0xEE, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x22, 0xF9, 0x08, 0x5F,
0xFC, 0xF3, 0x3B, 0x22, 0xFA, 0x24, 0x81,
0xFC, 0xF3, 0x3B, 0x23, 0x05, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x01, 0x00, 0x01,
0xFC, 0xF3, 0x3B, 0x23, 0x07, 0xF0, 0xF0,
0xFC, 0xF3, 0x3B, 0x23, 0x09, 0x08, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x0D, 0x01, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x0C, 0x0E, 0x20,
0xFC, 0xF3, 0x3B, 0x22, 0xF2, 0x00, 0x44,
0xFC, 0xF3, 0x3B, 0x22, 0xF6, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x22, 0xC6, 0x00, 0x31,
0xFC, 0xF3, 0x3B, 0x22, 0xC7, 0x00, 0x50,
0xFC, 0xF3, 0x3B, 0x22, 0xD2, 0x82, 0x94,
0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x01,
0xFC, 0xF3, 0x3B, 0x23, 0x00, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x23, 0x10,
0xFC, 0xF3, 0x3B, 0x23, 0x2F, 0x01, 0x10,
0xFC, 0xF3, 0x3B, 0x23, 0x39, 0x00, 0x06,
0xFC, 0xF3, 0x3B, 0x23, 0xCF, 0x01, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0xD0, 0x06, 0x20,
0xFC, 0xF3, 0x3B, 0x23, 0xD5, 0x3C, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x6E, 0x20, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x33, 0x02, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0xB3, 0x00, 0x0A,
0xFC, 0xF3, 0x3B, 0x23, 0xB4, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x70, 0x40, 0x00,
0xFC, 0xF3, 0x3B, 0x3F, 0xD2, 0x00, 0x32,
0xFC, 0xF3, 0x3B, 0x22, 0xFB, 0x00, 0x00
+};
+static const u8 TF101_enable_NS[] = {
0xC0,
0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x01,
0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x23, 0x10
+};
+static const u8 TF101_disable_NS[] = {
0xC0,
0xFC, 0xF3, 0x3B, 0x23, 0x03, 0x00, 0x00,
0xFC, 0xF3, 0x3B, 0x23, 0x04, 0x00, 0x10
+};
+#endif
2.37.2
FM34NE is mandatory for correct sound work on ASUS Transformers.
Signed-off-by: Svyatoslav Ryhel clamor95@gmail.com --- arch/arm/boot/dts/tegra20-asus-tf101.dts | 14 +++++++++ arch/arm/boot/dts/tegra30-asus-tf201.dts | 29 +++++++++++++++++++ arch/arm/boot/dts/tegra30-asus-tf300t.dts | 29 +++++++++++++++++++ arch/arm/boot/dts/tegra30-asus-tf300tg.dts | 19 ++++++++++++ arch/arm/boot/dts/tegra30-asus-tf700t.dts | 19 ++++++++++++ .../arm/boot/dts/tegra30-pegatron-chagall.dts | 27 +++++++++++++++++ 6 files changed, 137 insertions(+)
diff --git a/arch/arm/boot/dts/tegra20-asus-tf101.dts b/arch/arm/boot/dts/tegra20-asus-tf101.dts index 8d0613567e82..8a51a4c53014 100644 --- a/arch/arm/boot/dts/tegra20-asus-tf101.dts +++ b/arch/arm/boot/dts/tegra20-asus-tf101.dts @@ -493,6 +493,20 @@ i2c@7000c000 { status = "okay"; clock-frequency = <400000>;
+ /* Fortemedia FM34NE voice processor */ + dsp@60 { + compatible = "asus,tf101-dsp", "fortemedia,fm34"; + reg = <0x60>; + + bypass-gpios = <&gpio TEGRA_GPIO(H, 3) GPIO_ACTIVE_HIGH>; + reset-gpios = <&gpio TEGRA_GPIO(H, 2) GPIO_ACTIVE_LOW>; + + vdd-supply = <&vdd_1v8_sys>; + + clocks = <&tegra_car TEGRA20_CLK_CDEV1>; + clock-names = "mclk"; + }; + /* Aichi AMI306 digital compass */ magnetometer@e { compatible = "asahi-kasei,ak8974"; diff --git a/arch/arm/boot/dts/tegra30-asus-tf201.dts b/arch/arm/boot/dts/tegra30-asus-tf201.dts index 47865deeb88a..e214fc23609e 100644 --- a/arch/arm/boot/dts/tegra30-asus-tf201.dts +++ b/arch/arm/boot/dts/tegra30-asus-tf201.dts @@ -60,6 +60,25 @@ bluetooth { }; };
+ i2c@7000c000 { + /* Fortemedia FM34NE voice processor */ + dsp@60 { + compatible = "asus,tf201-dsp", "fortemedia,fm34"; + reg = <0x60>; + + bypass-gpios = <&gpio TEGRA_GPIO(BB, 6) GPIO_ACTIVE_HIGH>; + reset-gpios = <&gpio TEGRA_GPIO(O, 3) GPIO_ACTIVE_LOW>; + + vdd-supply = <&vdd_1v8_dsp>; + + clocks = <&tegra_pmc TEGRA_PMC_CLK_OUT_1>; + clock-names = "mclk"; + + assigned-clocks = <&tegra_pmc TEGRA_PMC_CLK_OUT_1>; + assigned-clock-parents = <&tegra_car TEGRA30_CLK_EXTERN1>; + }; + }; + i2c@7000c400 { /* Atmel MXT768E touchscreen */ touchscreen@4d { @@ -606,6 +625,16 @@ haptic-feedback { vcc-supply = <&vdd_3v3_sys>; };
+ vdd_1v8_dsp: regulator-dsp { + compatible = "regulator-fixed"; + regulator-name = "vdd_1v8_dsp"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + gpio = <&gpio TEGRA_GPIO(U, 5) GPIO_ACTIVE_HIGH>; + enable-active-high; + vin-supply = <&vdd_1v8_vio>; + }; + sound { compatible = "asus,tegra-audio-rt5631-tf201", "nvidia,tegra-audio-rt5631"; diff --git a/arch/arm/boot/dts/tegra30-asus-tf300t.dts b/arch/arm/boot/dts/tegra30-asus-tf300t.dts index 78f78cca337a..2dcf0e1f6ca2 100644 --- a/arch/arm/boot/dts/tegra30-asus-tf300t.dts +++ b/arch/arm/boot/dts/tegra30-asus-tf300t.dts @@ -68,6 +68,25 @@ bluetooth { }; };
+ i2c@7000c000 { + /* Fortemedia FM34NE voice processor */ + dsp@60 { + compatible = "asus,tf300t-dsp", "fortemedia,fm34"; + reg = <0x60>; + + bypass-gpios = <&gpio TEGRA_GPIO(BB, 6) GPIO_ACTIVE_HIGH>; + reset-gpios = <&gpio TEGRA_GPIO(O, 3) GPIO_ACTIVE_LOW>; + + vdd-supply = <&vdd_1v8_dsp>; + + clocks = <&tegra_pmc TEGRA_PMC_CLK_OUT_1>; + clock-names = "mclk"; + + assigned-clocks = <&tegra_pmc TEGRA_PMC_CLK_OUT_1>; + assigned-clock-parents = <&tegra_car TEGRA30_CLK_EXTERN1>; + }; + }; + i2c@7000c400 { /* Elantech EKTH1036 touchscreen */ touchscreen@10 { @@ -999,6 +1018,16 @@ display-panel { compatible = "innolux,g101ice-l01"; };
+ vdd_1v8_dsp: regulator-dsp { + compatible = "regulator-fixed"; + regulator-name = "vdd_1v8_dsp"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + gpio = <&gpio TEGRA_GPIO(P, 3) GPIO_ACTIVE_HIGH>; + enable-active-high; + vin-supply = <&vdd_1v8_vio>; + }; + sound { compatible = "asus,tegra-audio-wm8903-tf300t", "nvidia,tegra-audio-wm8903"; diff --git a/arch/arm/boot/dts/tegra30-asus-tf300tg.dts b/arch/arm/boot/dts/tegra30-asus-tf300tg.dts index 82c51e177a70..7f23021611a4 100644 --- a/arch/arm/boot/dts/tegra30-asus-tf300tg.dts +++ b/arch/arm/boot/dts/tegra30-asus-tf300tg.dts @@ -164,6 +164,25 @@ bluetooth { }; };
+ i2c@7000c000 { + /* Fortemedia FM34NE voice processor */ + dsp@60 { + compatible = "asus,tf300t-dsp", "fortemedia,fm34"; + reg = <0x60>; + + bypass-gpios = <&gpio TEGRA_GPIO(BB, 6) GPIO_ACTIVE_HIGH>; + reset-gpios = <&gpio TEGRA_GPIO(O, 3) GPIO_ACTIVE_LOW>; + + vdd-supply = <&vdd_1v8_vio>; + + clocks = <&tegra_pmc TEGRA_PMC_CLK_OUT_1>; + clock-names = "mclk"; + + assigned-clocks = <&tegra_pmc TEGRA_PMC_CLK_OUT_1>; + assigned-clock-parents = <&tegra_car TEGRA30_CLK_EXTERN1>; + }; + }; + i2c@7000c400 { /* Elantech EKTH1036 touchscreen */ touchscreen@10 { diff --git a/arch/arm/boot/dts/tegra30-asus-tf700t.dts b/arch/arm/boot/dts/tegra30-asus-tf700t.dts index 766225ebdeab..bbb33119780e 100644 --- a/arch/arm/boot/dts/tegra30-asus-tf700t.dts +++ b/arch/arm/boot/dts/tegra30-asus-tf700t.dts @@ -85,6 +85,25 @@ bluetooth { }; };
+ i2c@7000c000 { + /* Fortemedia FM34NE voice processor */ + dsp@60 { + compatible = "asus,tf700t-dsp", "fortemedia,fm34"; + reg = <0x60>; + + bypass-gpios = <&gpio TEGRA_GPIO(BB, 6) GPIO_ACTIVE_HIGH>; + reset-gpios = <&gpio TEGRA_GPIO(O, 3) GPIO_ACTIVE_LOW>; + + vdd-supply = <&vdd_1v8_vio>; + + clocks = <&tegra_pmc TEGRA_PMC_CLK_OUT_1>; + clock-names = "mclk"; + + assigned-clocks = <&tegra_pmc TEGRA_PMC_CLK_OUT_1>; + assigned-clock-parents = <&tegra_car TEGRA30_CLK_EXTERN1>; + }; + }; + i2c@7000c400 { /* Elantech ELAN-3024-7053 or 5184N FPC-1 REV: 2/3 touchscreen */ touchscreen@10 { diff --git a/arch/arm/boot/dts/tegra30-pegatron-chagall.dts b/arch/arm/boot/dts/tegra30-pegatron-chagall.dts index 6e24b095713b..007ba3f3e95e 100644 --- a/arch/arm/boot/dts/tegra30-pegatron-chagall.dts +++ b/arch/arm/boot/dts/tegra30-pegatron-chagall.dts @@ -1145,6 +1145,23 @@ lcd_ddc: i2c@7000c000 { status = "okay"; clock-frequency = <400000>;
+ /* Fortemedia FM34NE voice processor */ + dsp@60 { + compatible = "pegatron,chagall-dsp", "fortemedia,fm34"; + reg = <0x60>; + + bypass-gpios = <&gpio TEGRA_GPIO(N, 3) GPIO_ACTIVE_HIGH>; + reset-gpios = <&gpio TEGRA_GPIO(N, 0) GPIO_ACTIVE_LOW>; + + vdd-supply = <&vdd_1v8_dsp>; + + clocks = <&tegra_pmc TEGRA_PMC_CLK_OUT_1>; + clock-names = "mclk"; + + assigned-clocks = <&tegra_pmc TEGRA_PMC_CLK_OUT_1>; + assigned-clock-parents = <&tegra_car TEGRA30_CLK_EXTERN1>; + }; + /* Wolfson Microelectronics WM8903 audio codec */ wm8903: audio-codec@1a { compatible = "wlf,wm8903"; @@ -1500,6 +1517,16 @@ vdd_vbus_usb3: regulator-usb3 { vin-supply = <&vdd_5v0_sys>; };
+ vdd_1v8_dsp: regulator-dsp { + compatible = "regulator-fixed"; + regulator-name = "vdd_1v8_dsp"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + gpio = <&gpio TEGRA_GPIO(N, 1) GPIO_ACTIVE_HIGH>; + enable-active-high; + vin-supply = <&vdd_1v8_vio>; + }; + pmc@7000e400 { status = "okay"; nvidia,invert-interrupt;
On Tue, 21 Feb 2023 20:32:01 +0200, Svyatoslav Ryhel wrote:
- add quirk for headset detection used by some T30 devices (ASUS Transformers, LG Optimus 4X HD and Vu);
- add RT5631 and MAX9808x machine drivers
- add Fortemedia FM34NE DSP driver used by ASUS Transformers and mandatory for correct sound work
- bind everything into working configuration
[...]
Applied to
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next
Thanks!
[02/10] sound: soc: jack: allow multiple interrupt per gpio commit: a2d4051b0bd6dffcd736888ae89a550d6f60b060
All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying to this mail.
Thanks, Mark
participants (8)
-
Claudiu.Beznea@microchip.com
-
Dan Carpenter
-
Greg Kroah-Hartman
-
Krzysztof Kozlowski
-
Mark Brown
-
Rob Herring
-
Svyatoslav Ryhel
-
Святослав Ригель