2023-02-21 18:32:31

by Svyatoslav Ryhel

[permalink] [raw]
Subject: [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

--
2.37.2



2023-02-21 18:32:35

by Svyatoslav Ryhel

[permalink] [raw]
Subject: [PATCH v1 01/10] dt-bindings: sound: nvidia,tegra-audio-common: add new property

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 <[email protected]>
---
.../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
--
2.37.2


2023-02-21 18:32:38

by Svyatoslav Ryhel

[permalink] [raw]
Subject: [PATCH v1 02/10] sound: soc: jack: allow multiple interrupt per gpio

This feature is required for coupled hp-mic quirk used
by some Nvidia Tegra 3 based devices work properly.

Signed-off-by: Svyatoslav Ryhel <[email protected]>
---
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,
--
2.37.2


2023-02-21 18:32:40

by Svyatoslav Ryhel

[permalink] [raw]
Subject: [PATCH v1 03/10] dt-bindings: sound: nvidia,tegra-audio: add RT5631 CODEC

From: David Heidelberg <[email protected]>

Add dt-binding for RT5631 CODEC.

Signed-off-by: David Heidelberg <[email protected]>
---
.../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 <[email protected]>
+ - Thierry Reding <[email protected]>
+
+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


2023-02-21 18:32:46

by Svyatoslav Ryhel

[permalink] [raw]
Subject: [PATCH v1 04/10] ASoC: tegra: Support RT5631 by machine driver

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 <[email protected]>
Signed-off-by: Ion Agorria <[email protected]>
---
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);
--
2.37.2


2023-02-21 18:32:49

by Svyatoslav Ryhel

[permalink] [raw]
Subject: [PATCH v1 05/10] dt-bindings: sound: nvidia,tegra-audio: add MAX9808x CODEC

Add dt-binding for MAX9808x CODEC.

Signed-off-by: Svyatoslav Ryhel <[email protected]>
---
.../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 <[email protected]>
+ - Thierry Reding <[email protected]>
+
+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";
+ };
--
2.37.2


2023-02-21 18:32:53

by Svyatoslav Ryhel

[permalink] [raw]
Subject: [PATCH v1 06/10] ASoC: tegra: Support MAX9808x by machine driver

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 <[email protected]>
---
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 },
--
2.37.2


2023-02-21 18:32:56

by Svyatoslav Ryhel

[permalink] [raw]
Subject: [PATCH v1 07/10] ARM: tegra: transformers: update bindings of sound graph

- 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 <[email protected]>
---
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>;
--
2.37.2


2023-02-21 18:33:05

by Svyatoslav Ryhel

[permalink] [raw]
Subject: [PATCH v1 08/10] dt-bindings: dsp: add Fortemedia FM34 DSP

Add dt-binding for Fortemedia FM34NE DSP.

Signed-off-by: Svyatoslav Ryhel <[email protected]>
---
.../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 <[email protected]>
+
+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;
+ };
--
2.37.2


2023-02-21 18:33:08

by Svyatoslav Ryhel

[permalink] [raw]
Subject: [PATCH v1 10/10] ARM: tegra: transformers: bind FM34NE DSP on supported devices

FM34NE is mandatory for correct sound work on ASUS Transformers.

Signed-off-by: Svyatoslav Ryhel <[email protected]>
---
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;
--
2.37.2


2023-02-21 18:33:11

by Svyatoslav Ryhel

[permalink] [raw]
Subject: [PATCH v1 09/10] staging: dsp: add support for Fortemedia FM34NE DSP

FM34NE is digital sound processing chip used for active
noise suppression mainly on ASUS Transformers.

Signed-off-by: Svyatoslav Ryhel <[email protected]>
---
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 <[email protected]>");
+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


2023-02-21 19:27:54

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: [PATCH v1 09/10] staging: dsp: add support for Fortemedia FM34NE DSP

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 <[email protected]>
> ---
> 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

2023-02-21 19:33:01

by Dan Carpenter

[permalink] [raw]
Subject: Re: [PATCH v1 04/10] ASoC: tegra: Support RT5631 by machine driver

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

2023-02-21 19:39:12

by Dan Carpenter

[permalink] [raw]
Subject: Re: [PATCH v1 09/10] staging: dsp: add support for Fortemedia FM34NE DSP

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

2023-02-21 22:08:36

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH v1 02/10] sound: soc: jack: allow multiple interrupt per gpio

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.


Attachments:
(No filename) (600.00 B)
signature.asc (488.00 B)
Download all attachments

2023-02-21 22:23:22

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH v1 04/10] ASoC: tegra: Support RT5631 by machine driver

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 <[email protected]>
> Signed-off-by: Ion Agorria <[email protected]>

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.


Attachments:
(No filename) (1.53 kB)
signature.asc (488.00 B)
Download all attachments

2023-02-21 22:27:10

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH v1 07/10] ARM: tegra: transformers: update bindings of sound graph

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;


Attachments:
(No filename) (310.00 B)
signature.asc (488.00 B)
Download all attachments

2023-02-21 22:41:58

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH v1 09/10] staging: dsp: add support for Fortemedia FM34NE DSP

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).


Attachments:
(No filename) (547.00 B)
signature.asc (488.00 B)
Download all attachments

2023-02-22 07:53:49

by Svyatoslav Ryhel

[permalink] [raw]
Subject: Re: [PATCH v1 02/10] sound: soc: jack: allow multiple interrupt per gpio

ср, 22 лют. 2023 р. о 00:08 Mark Brown <[email protected]> пише:
>
> 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.

2023-02-22 07:56:19

by Svyatoslav Ryhel

[permalink] [raw]
Subject: Re: [PATCH v1 04/10] ASoC: tegra: Support RT5631 by machine driver

вт, 21 лют. 2023 р. о 21:32 Dan Carpenter <[email protected]> пише:
>
> 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

2023-02-22 08:01:17

by Svyatoslav Ryhel

[permalink] [raw]
Subject: Re: [PATCH v1 04/10] ASoC: tegra: Support RT5631 by machine driver

ср, 22 лют. 2023 р. о 00:23 Mark Brown <[email protected]> пише:
>
> 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 <[email protected]>
> > Signed-off-by: Ion Agorria <[email protected]>
>
> 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.

2023-02-22 08:02:35

by Svyatoslav Ryhel

[permalink] [raw]
Subject: Re: [PATCH v1 07/10] ARM: tegra: transformers: update bindings of sound graph

ср, 22 лют. 2023 р. о 00:27 Mark Brown <[email protected]> пише:
>
> 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;

2023-02-22 08:06:41

by Svyatoslav Ryhel

[permalink] [raw]
Subject: Re: [PATCH v1 09/10] staging: dsp: add support for Fortemedia FM34NE DSP

вт, 21 лют. 2023 р. о 21:39 Dan Carpenter <[email protected]> пише:
>
> 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.

2023-02-22 08:14:23

by Svyatoslav Ryhel

[permalink] [raw]
Subject: Re: [PATCH v1 09/10] staging: dsp: add support for Fortemedia FM34NE DSP

ср, 22 лют. 2023 р. о 00:41 Mark Brown <[email protected]> пише:
>
> 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).

2023-02-22 08:20:04

by Svyatoslav Ryhel

[permalink] [raw]
Subject: Re: [PATCH v1 09/10] staging: dsp: add support for Fortemedia FM34NE DSP

вт, 21 лют. 2023 р. о 21:27 Greg Kroah-Hartman
<[email protected]> пише:
>
> 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 <[email protected]>
> > ---
> > 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

2023-02-22 09:21:12

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: [PATCH v1 09/10] staging: dsp: add support for Fortemedia FM34NE DSP

On Wed, Feb 22, 2023 at 10:19:47AM +0200, Svyatoslav Ryhel wrote:
> вт, 21 лют. 2023 р. о 21:27 Greg Kroah-Hartman
> <[email protected]> пише:
> >
> > 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 <[email protected]>
> > > ---
> > > 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

2023-02-22 09:44:01

by Svyatoslav Ryhel

[permalink] [raw]
Subject: Re: [PATCH v1 09/10] staging: dsp: add support for Fortemedia FM34NE DSP



22 лютого 2023 р. 11:21:02 GMT+02:00, Greg Kroah-Hartman <[email protected]> написав(-ла):
>On Wed, Feb 22, 2023 at 10:19:47AM +0200, Svyatoslav Ryhel wrote:
>> вт, 21 лют. 2023 р. о 21:27 Greg Kroah-Hartman
>> <[email protected]> пише:
>> >
>> > 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 <[email protected]>
>> > > ---
>> > > 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

2023-02-22 11:15:33

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: [PATCH v1 09/10] staging: dsp: add support for Fortemedia FM34NE DSP

On Wed, Feb 22, 2023 at 11:39:59AM +0200, Святослав Ригель wrote:
>
>
> 22 лютого 2023 р. 11:21:02 GMT+02:00, Greg Kroah-Hartman <[email protected]> написав(-ла):
> >On Wed, Feb 22, 2023 at 10:19:47AM +0200, Svyatoslav Ryhel wrote:
> >> вт, 21 лют. 2023 р. о 21:27 Greg Kroah-Hartman
> >> <[email protected]> пише:
> >> >
> >> > 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 <[email protected]>
> >> > > ---
> >> > > 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

2023-02-22 12:18:37

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH v1 02/10] sound: soc: jack: allow multiple interrupt per gpio

On Wed, Feb 22, 2023 at 09:53:28AM +0200, Svyatoslav Ryhel wrote:
> ср, 22 лют. 2023 р. о 00:08 Mark Brown <[email protected]> пише:

> > 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.


Attachments:
(No filename) (821.00 B)
signature.asc (488.00 B)
Download all attachments

2023-02-22 12:20:24

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH v1 04/10] ASoC: tegra: Support RT5631 by machine driver

On Wed, Feb 22, 2023 at 10:00:58AM +0200, Svyatoslav Ryhel wrote:
> ср, 22 лют. 2023 р. о 00:23 Mark Brown <[email protected]> пише:

> > 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.


Attachments:
(No filename) (1.05 kB)
signature.asc (488.00 B)
Download all attachments

2023-02-22 12:21:31

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH v1 07/10] ARM: tegra: transformers: update bindings of sound graph

On Wed, Feb 22, 2023 at 10:02:09AM +0200, Svyatoslav Ryhel wrote:
> ср, 22 лют. 2023 р. о 00:27 Mark Brown <[email protected]> пише:
> > 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.


Attachments:
(No filename) (564.00 B)
signature.asc (488.00 B)
Download all attachments

2023-02-22 12:22:00

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH v1 09/10] staging: dsp: add support for Fortemedia FM34NE DSP

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.


Attachments:
(No filename) (488.00 B)
signature.asc (488.00 B)
Download all attachments

2023-02-22 12:36:47

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH v1 09/10] staging: dsp: add support for Fortemedia FM34NE DSP

On Wed, Feb 22, 2023 at 10:14:02AM +0200, Svyatoslav Ryhel wrote:
> ср, 22 лют. 2023 р. о 00:41 Mark Brown <[email protected]> пише:
> >
> > 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.


Attachments:
(No filename) (1.16 kB)
signature.asc (488.00 B)
Download all attachments

2023-02-22 13:28:27

by Dan Carpenter

[permalink] [raw]
Subject: Re: [PATCH v1 04/10] ASoC: tegra: Support RT5631 by machine driver

On Wed, Feb 22, 2023 at 09:55:52AM +0200, Svyatoslav Ryhel wrote:
> вт, 21 лют. 2023 р. о 21:32 Dan Carpenter <[email protected]> пише:
> >
> > 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


2023-02-22 13:33:06

by Dan Carpenter

[permalink] [raw]
Subject: Re: [PATCH v1 09/10] staging: dsp: add support for Fortemedia FM34NE DSP

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


2023-02-22 14:57:27

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH v1 04/10] ASoC: tegra: Support RT5631 by machine driver

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 <[email protected]> пише:

> > > > /* 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).


Attachments:
(No filename) (765.00 B)
signature.asc (488.00 B)
Download all attachments

2023-02-26 19:35:30

by Rob Herring (Arm)

[permalink] [raw]
Subject: Re: [PATCH v1 01/10] dt-bindings: sound: nvidia,tegra-audio-common: add new property


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 <[email protected]>
> ---
> .../devicetree/bindings/sound/nvidia,tegra-audio-common.yaml | 4 ++++
> 1 file changed, 4 insertions(+)
>

Acked-by: Rob Herring <[email protected]>


2023-02-26 19:37:29

by Rob Herring (Arm)

[permalink] [raw]
Subject: Re: [PATCH v1 03/10] dt-bindings: sound: nvidia,tegra-audio: add RT5631 CODEC

On Tue, Feb 21, 2023 at 08:32:04PM +0200, Svyatoslav Ryhel wrote:
> From: David Heidelberg <[email protected]>
>
> Add dt-binding for RT5631 CODEC.
>
> Signed-off-by: David Heidelberg <[email protected]>

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 <[email protected]>
> + - Thierry Reding <[email protected]>
> +
> +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
>

2023-02-26 19:39:06

by Rob Herring (Arm)

[permalink] [raw]
Subject: Re: [PATCH v1 05/10] dt-bindings: sound: nvidia,tegra-audio: add MAX9808x CODEC


On Tue, 21 Feb 2023 20:32:06 +0200, Svyatoslav Ryhel wrote:
> Add dt-binding for MAX9808x CODEC.
>
> Signed-off-by: Svyatoslav Ryhel <[email protected]>
> ---
> .../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 <[email protected]>


2023-02-26 19:43:01

by Rob Herring (Arm)

[permalink] [raw]
Subject: Re: [PATCH v1 08/10] dt-bindings: dsp: add Fortemedia FM34 DSP

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 <[email protected]>
> ---
> .../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 <[email protected]>
> +
> +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

2023-02-28 08:15:21

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH v1 03/10] dt-bindings: sound: nvidia,tegra-audio: add RT5631 CODEC

On 21/02/2023 19:32, Svyatoslav Ryhel wrote:
> From: David Heidelberg <[email protected]>
>
> Add dt-binding for RT5631 CODEC.
>
> Signed-off-by: David Heidelberg <[email protected]>
> ---
> .../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 <[email protected]>
> + - Thierry Reding <[email protected]>
> +
> +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


2023-03-06 13:32:06

by Mark Brown

[permalink] [raw]
Subject: Re: (subset) [PATCH v1 00/10] Fix sound on ASUS Transformers

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