18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci//
38c2ecf20Sopenharmony_ci// Copyright (c) 2019 BayLibre, SAS.
48c2ecf20Sopenharmony_ci// Author: Jerome Brunet <jbrunet@baylibre.com>
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include <linux/bitfield.h>
78c2ecf20Sopenharmony_ci#include <linux/clk.h>
88c2ecf20Sopenharmony_ci#include <linux/module.h>
98c2ecf20Sopenharmony_ci#include <sound/pcm_params.h>
108c2ecf20Sopenharmony_ci#include <linux/regmap.h>
118c2ecf20Sopenharmony_ci#include <linux/reset.h>
128c2ecf20Sopenharmony_ci#include <sound/soc.h>
138c2ecf20Sopenharmony_ci#include <sound/soc-dai.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include <dt-bindings/sound/meson-g12a-tohdmitx.h>
168c2ecf20Sopenharmony_ci#include "meson-codec-glue.h"
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#define G12A_TOHDMITX_DRV_NAME "g12a-tohdmitx"
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#define TOHDMITX_CTRL0			0x0
218c2ecf20Sopenharmony_ci#define  CTRL0_ENABLE_SHIFT		31
228c2ecf20Sopenharmony_ci#define  CTRL0_I2S_DAT_SEL_SHIFT	12
238c2ecf20Sopenharmony_ci#define  CTRL0_I2S_DAT_SEL		(0x3 << CTRL0_I2S_DAT_SEL_SHIFT)
248c2ecf20Sopenharmony_ci#define  CTRL0_I2S_LRCLK_SEL		GENMASK(9, 8)
258c2ecf20Sopenharmony_ci#define  CTRL0_I2S_BLK_CAP_INV		BIT(7)
268c2ecf20Sopenharmony_ci#define  CTRL0_I2S_BCLK_O_INV		BIT(6)
278c2ecf20Sopenharmony_ci#define  CTRL0_I2S_BCLK_SEL		GENMASK(5, 4)
288c2ecf20Sopenharmony_ci#define  CTRL0_SPDIF_CLK_CAP_INV	BIT(3)
298c2ecf20Sopenharmony_ci#define  CTRL0_SPDIF_CLK_O_INV		BIT(2)
308c2ecf20Sopenharmony_ci#define  CTRL0_SPDIF_SEL_SHIFT		1
318c2ecf20Sopenharmony_ci#define  CTRL0_SPDIF_SEL		(0x1 << CTRL0_SPDIF_SEL_SHIFT)
328c2ecf20Sopenharmony_ci#define  CTRL0_SPDIF_CLK_SEL		BIT(0)
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cistatic const char * const g12a_tohdmitx_i2s_mux_texts[] = {
358c2ecf20Sopenharmony_ci	"I2S A", "I2S B", "I2S C",
368c2ecf20Sopenharmony_ci};
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cistatic int g12a_tohdmitx_i2s_mux_put_enum(struct snd_kcontrol *kcontrol,
398c2ecf20Sopenharmony_ci				   struct snd_ctl_elem_value *ucontrol)
408c2ecf20Sopenharmony_ci{
418c2ecf20Sopenharmony_ci	struct snd_soc_component *component =
428c2ecf20Sopenharmony_ci		snd_soc_dapm_kcontrol_component(kcontrol);
438c2ecf20Sopenharmony_ci	struct snd_soc_dapm_context *dapm =
448c2ecf20Sopenharmony_ci		snd_soc_dapm_kcontrol_dapm(kcontrol);
458c2ecf20Sopenharmony_ci	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
468c2ecf20Sopenharmony_ci	unsigned int mux, changed;
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci	if (ucontrol->value.enumerated.item[0] >= e->items)
498c2ecf20Sopenharmony_ci		return -EINVAL;
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci	mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]);
528c2ecf20Sopenharmony_ci	changed = snd_soc_component_test_bits(component, e->reg,
538c2ecf20Sopenharmony_ci					      CTRL0_I2S_DAT_SEL,
548c2ecf20Sopenharmony_ci					      FIELD_PREP(CTRL0_I2S_DAT_SEL,
558c2ecf20Sopenharmony_ci							 mux));
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci	if (!changed)
588c2ecf20Sopenharmony_ci		return 0;
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci	/* Force disconnect of the mux while updating */
618c2ecf20Sopenharmony_ci	snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	snd_soc_component_update_bits(component, e->reg,
648c2ecf20Sopenharmony_ci				      CTRL0_I2S_DAT_SEL |
658c2ecf20Sopenharmony_ci				      CTRL0_I2S_LRCLK_SEL |
668c2ecf20Sopenharmony_ci				      CTRL0_I2S_BCLK_SEL,
678c2ecf20Sopenharmony_ci				      FIELD_PREP(CTRL0_I2S_DAT_SEL, mux) |
688c2ecf20Sopenharmony_ci				      FIELD_PREP(CTRL0_I2S_LRCLK_SEL, mux) |
698c2ecf20Sopenharmony_ci				      FIELD_PREP(CTRL0_I2S_BCLK_SEL, mux));
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci	snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL);
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci	return 1;
748c2ecf20Sopenharmony_ci}
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(g12a_tohdmitx_i2s_mux_enum, TOHDMITX_CTRL0,
778c2ecf20Sopenharmony_ci			    CTRL0_I2S_DAT_SEL_SHIFT,
788c2ecf20Sopenharmony_ci			    g12a_tohdmitx_i2s_mux_texts);
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new g12a_tohdmitx_i2s_mux =
818c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM_EXT("I2S Source", g12a_tohdmitx_i2s_mux_enum,
828c2ecf20Sopenharmony_ci			  snd_soc_dapm_get_enum_double,
838c2ecf20Sopenharmony_ci			  g12a_tohdmitx_i2s_mux_put_enum);
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_cistatic const char * const g12a_tohdmitx_spdif_mux_texts[] = {
868c2ecf20Sopenharmony_ci	"SPDIF A", "SPDIF B",
878c2ecf20Sopenharmony_ci};
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_cistatic int g12a_tohdmitx_spdif_mux_put_enum(struct snd_kcontrol *kcontrol,
908c2ecf20Sopenharmony_ci					    struct snd_ctl_elem_value *ucontrol)
918c2ecf20Sopenharmony_ci{
928c2ecf20Sopenharmony_ci	struct snd_soc_component *component =
938c2ecf20Sopenharmony_ci		snd_soc_dapm_kcontrol_component(kcontrol);
948c2ecf20Sopenharmony_ci	struct snd_soc_dapm_context *dapm =
958c2ecf20Sopenharmony_ci		snd_soc_dapm_kcontrol_dapm(kcontrol);
968c2ecf20Sopenharmony_ci	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
978c2ecf20Sopenharmony_ci	unsigned int mux, changed;
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ci	if (ucontrol->value.enumerated.item[0] >= e->items)
1008c2ecf20Sopenharmony_ci		return -EINVAL;
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]);
1038c2ecf20Sopenharmony_ci	changed = snd_soc_component_test_bits(component, TOHDMITX_CTRL0,
1048c2ecf20Sopenharmony_ci					      CTRL0_SPDIF_SEL,
1058c2ecf20Sopenharmony_ci					      FIELD_PREP(CTRL0_SPDIF_SEL, mux));
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ci	if (!changed)
1088c2ecf20Sopenharmony_ci		return 0;
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci	/* Force disconnect of the mux while updating */
1118c2ecf20Sopenharmony_ci	snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci	snd_soc_component_update_bits(component, TOHDMITX_CTRL0,
1148c2ecf20Sopenharmony_ci				      CTRL0_SPDIF_SEL |
1158c2ecf20Sopenharmony_ci				      CTRL0_SPDIF_CLK_SEL,
1168c2ecf20Sopenharmony_ci				      FIELD_PREP(CTRL0_SPDIF_SEL, mux) |
1178c2ecf20Sopenharmony_ci				      FIELD_PREP(CTRL0_SPDIF_CLK_SEL, mux));
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci	snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL);
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci	return 1;
1228c2ecf20Sopenharmony_ci}
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(g12a_tohdmitx_spdif_mux_enum, TOHDMITX_CTRL0,
1258c2ecf20Sopenharmony_ci			    CTRL0_SPDIF_SEL_SHIFT,
1268c2ecf20Sopenharmony_ci			    g12a_tohdmitx_spdif_mux_texts);
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new g12a_tohdmitx_spdif_mux =
1298c2ecf20Sopenharmony_ci	SOC_DAPM_ENUM_EXT("SPDIF Source", g12a_tohdmitx_spdif_mux_enum,
1308c2ecf20Sopenharmony_ci			  snd_soc_dapm_get_enum_double,
1318c2ecf20Sopenharmony_ci			  g12a_tohdmitx_spdif_mux_put_enum);
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new g12a_tohdmitx_out_enable =
1348c2ecf20Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("Switch", TOHDMITX_CTRL0,
1358c2ecf20Sopenharmony_ci				    CTRL0_ENABLE_SHIFT, 1, 0);
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_cistatic const struct snd_soc_dapm_widget g12a_tohdmitx_widgets[] = {
1388c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("I2S SRC", SND_SOC_NOPM, 0, 0,
1398c2ecf20Sopenharmony_ci			 &g12a_tohdmitx_i2s_mux),
1408c2ecf20Sopenharmony_ci	SND_SOC_DAPM_SWITCH("I2S OUT EN", SND_SOC_NOPM, 0, 0,
1418c2ecf20Sopenharmony_ci			    &g12a_tohdmitx_out_enable),
1428c2ecf20Sopenharmony_ci	SND_SOC_DAPM_MUX("SPDIF SRC", SND_SOC_NOPM, 0, 0,
1438c2ecf20Sopenharmony_ci			 &g12a_tohdmitx_spdif_mux),
1448c2ecf20Sopenharmony_ci	SND_SOC_DAPM_SWITCH("SPDIF OUT EN", SND_SOC_NOPM, 0, 0,
1458c2ecf20Sopenharmony_ci			    &g12a_tohdmitx_out_enable),
1468c2ecf20Sopenharmony_ci};
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_cistatic const struct snd_soc_dai_ops g12a_tohdmitx_input_ops = {
1498c2ecf20Sopenharmony_ci	.hw_params	= meson_codec_glue_input_hw_params,
1508c2ecf20Sopenharmony_ci	.set_fmt	= meson_codec_glue_input_set_fmt,
1518c2ecf20Sopenharmony_ci};
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_cistatic const struct snd_soc_dai_ops g12a_tohdmitx_output_ops = {
1548c2ecf20Sopenharmony_ci	.startup	= meson_codec_glue_output_startup,
1558c2ecf20Sopenharmony_ci};
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ci#define TOHDMITX_SPDIF_FORMATS					\
1588c2ecf20Sopenharmony_ci	(SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |	\
1598c2ecf20Sopenharmony_ci	 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE)
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ci#define TOHDMITX_I2S_FORMATS					\
1628c2ecf20Sopenharmony_ci	(SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |	\
1638c2ecf20Sopenharmony_ci	 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE |	\
1648c2ecf20Sopenharmony_ci	 SNDRV_PCM_FMTBIT_S32_LE)
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ci#define TOHDMITX_STREAM(xname, xsuffix, xfmt, xchmax)		\
1678c2ecf20Sopenharmony_ci{								\
1688c2ecf20Sopenharmony_ci	.stream_name	= xname " " xsuffix,			\
1698c2ecf20Sopenharmony_ci	.channels_min	= 1,					\
1708c2ecf20Sopenharmony_ci	.channels_max	= (xchmax),				\
1718c2ecf20Sopenharmony_ci	.rate_min       = 8000,					\
1728c2ecf20Sopenharmony_ci	.rate_max	= 192000,				\
1738c2ecf20Sopenharmony_ci	.formats	= (xfmt),				\
1748c2ecf20Sopenharmony_ci}
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_ci#define TOHDMITX_IN(xname, xid, xfmt, xchmax) {				\
1778c2ecf20Sopenharmony_ci	.name = xname,							\
1788c2ecf20Sopenharmony_ci	.id = (xid),							\
1798c2ecf20Sopenharmony_ci	.playback = TOHDMITX_STREAM(xname, "Playback", xfmt, xchmax),	\
1808c2ecf20Sopenharmony_ci	.ops = &g12a_tohdmitx_input_ops,				\
1818c2ecf20Sopenharmony_ci	.probe = meson_codec_glue_input_dai_probe,			\
1828c2ecf20Sopenharmony_ci	.remove = meson_codec_glue_input_dai_remove,			\
1838c2ecf20Sopenharmony_ci}
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_ci#define TOHDMITX_OUT(xname, xid, xfmt, xchmax) {			\
1868c2ecf20Sopenharmony_ci	.name = xname,							\
1878c2ecf20Sopenharmony_ci	.id = (xid),							\
1888c2ecf20Sopenharmony_ci	.capture = TOHDMITX_STREAM(xname, "Capture", xfmt, xchmax),	\
1898c2ecf20Sopenharmony_ci	.ops = &g12a_tohdmitx_output_ops,				\
1908c2ecf20Sopenharmony_ci}
1918c2ecf20Sopenharmony_ci
1928c2ecf20Sopenharmony_cistatic struct snd_soc_dai_driver g12a_tohdmitx_dai_drv[] = {
1938c2ecf20Sopenharmony_ci	TOHDMITX_IN("I2S IN A", TOHDMITX_I2S_IN_A,
1948c2ecf20Sopenharmony_ci		    TOHDMITX_I2S_FORMATS, 8),
1958c2ecf20Sopenharmony_ci	TOHDMITX_IN("I2S IN B", TOHDMITX_I2S_IN_B,
1968c2ecf20Sopenharmony_ci		    TOHDMITX_I2S_FORMATS, 8),
1978c2ecf20Sopenharmony_ci	TOHDMITX_IN("I2S IN C", TOHDMITX_I2S_IN_C,
1988c2ecf20Sopenharmony_ci		    TOHDMITX_I2S_FORMATS, 8),
1998c2ecf20Sopenharmony_ci	TOHDMITX_OUT("I2S OUT", TOHDMITX_I2S_OUT,
2008c2ecf20Sopenharmony_ci		     TOHDMITX_I2S_FORMATS, 8),
2018c2ecf20Sopenharmony_ci	TOHDMITX_IN("SPDIF IN A", TOHDMITX_SPDIF_IN_A,
2028c2ecf20Sopenharmony_ci		    TOHDMITX_SPDIF_FORMATS, 2),
2038c2ecf20Sopenharmony_ci	TOHDMITX_IN("SPDIF IN B", TOHDMITX_SPDIF_IN_B,
2048c2ecf20Sopenharmony_ci		    TOHDMITX_SPDIF_FORMATS, 2),
2058c2ecf20Sopenharmony_ci	TOHDMITX_OUT("SPDIF OUT", TOHDMITX_SPDIF_OUT,
2068c2ecf20Sopenharmony_ci		     TOHDMITX_SPDIF_FORMATS, 2),
2078c2ecf20Sopenharmony_ci};
2088c2ecf20Sopenharmony_ci
2098c2ecf20Sopenharmony_cistatic int g12a_tohdmi_component_probe(struct snd_soc_component *c)
2108c2ecf20Sopenharmony_ci{
2118c2ecf20Sopenharmony_ci	/* Initialize the static clock parameters */
2128c2ecf20Sopenharmony_ci	return snd_soc_component_write(c, TOHDMITX_CTRL0,
2138c2ecf20Sopenharmony_ci		     CTRL0_I2S_BLK_CAP_INV | CTRL0_SPDIF_CLK_CAP_INV);
2148c2ecf20Sopenharmony_ci}
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_cistatic const struct snd_soc_dapm_route g12a_tohdmitx_routes[] = {
2178c2ecf20Sopenharmony_ci	{ "I2S SRC", "I2S A", "I2S IN A Playback" },
2188c2ecf20Sopenharmony_ci	{ "I2S SRC", "I2S B", "I2S IN B Playback" },
2198c2ecf20Sopenharmony_ci	{ "I2S SRC", "I2S C", "I2S IN C Playback" },
2208c2ecf20Sopenharmony_ci	{ "I2S OUT EN", "Switch", "I2S SRC" },
2218c2ecf20Sopenharmony_ci	{ "I2S OUT Capture", NULL, "I2S OUT EN" },
2228c2ecf20Sopenharmony_ci	{ "SPDIF SRC", "SPDIF A", "SPDIF IN A Playback" },
2238c2ecf20Sopenharmony_ci	{ "SPDIF SRC", "SPDIF B", "SPDIF IN B Playback" },
2248c2ecf20Sopenharmony_ci	{ "SPDIF OUT EN", "Switch", "SPDIF SRC" },
2258c2ecf20Sopenharmony_ci	{ "SPDIF OUT Capture", NULL, "SPDIF OUT EN" },
2268c2ecf20Sopenharmony_ci};
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_cistatic const struct snd_soc_component_driver g12a_tohdmitx_component_drv = {
2298c2ecf20Sopenharmony_ci	.probe			= g12a_tohdmi_component_probe,
2308c2ecf20Sopenharmony_ci	.dapm_widgets		= g12a_tohdmitx_widgets,
2318c2ecf20Sopenharmony_ci	.num_dapm_widgets	= ARRAY_SIZE(g12a_tohdmitx_widgets),
2328c2ecf20Sopenharmony_ci	.dapm_routes		= g12a_tohdmitx_routes,
2338c2ecf20Sopenharmony_ci	.num_dapm_routes	= ARRAY_SIZE(g12a_tohdmitx_routes),
2348c2ecf20Sopenharmony_ci	.endianness		= 1,
2358c2ecf20Sopenharmony_ci	.non_legacy_dai_naming	= 1,
2368c2ecf20Sopenharmony_ci};
2378c2ecf20Sopenharmony_ci
2388c2ecf20Sopenharmony_cistatic const struct regmap_config g12a_tohdmitx_regmap_cfg = {
2398c2ecf20Sopenharmony_ci	.reg_bits	= 32,
2408c2ecf20Sopenharmony_ci	.val_bits	= 32,
2418c2ecf20Sopenharmony_ci	.reg_stride	= 4,
2428c2ecf20Sopenharmony_ci};
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_cistatic const struct of_device_id g12a_tohdmitx_of_match[] = {
2458c2ecf20Sopenharmony_ci	{ .compatible = "amlogic,g12a-tohdmitx", },
2468c2ecf20Sopenharmony_ci	{}
2478c2ecf20Sopenharmony_ci};
2488c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(of, g12a_tohdmitx_of_match);
2498c2ecf20Sopenharmony_ci
2508c2ecf20Sopenharmony_cistatic int g12a_tohdmitx_probe(struct platform_device *pdev)
2518c2ecf20Sopenharmony_ci{
2528c2ecf20Sopenharmony_ci	struct device *dev = &pdev->dev;
2538c2ecf20Sopenharmony_ci	void __iomem *regs;
2548c2ecf20Sopenharmony_ci	struct regmap *map;
2558c2ecf20Sopenharmony_ci	int ret;
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_ci	ret = device_reset(dev);
2588c2ecf20Sopenharmony_ci	if (ret)
2598c2ecf20Sopenharmony_ci		return ret;
2608c2ecf20Sopenharmony_ci
2618c2ecf20Sopenharmony_ci	regs = devm_platform_ioremap_resource(pdev, 0);
2628c2ecf20Sopenharmony_ci	if (IS_ERR(regs))
2638c2ecf20Sopenharmony_ci		return PTR_ERR(regs);
2648c2ecf20Sopenharmony_ci
2658c2ecf20Sopenharmony_ci	map = devm_regmap_init_mmio(dev, regs, &g12a_tohdmitx_regmap_cfg);
2668c2ecf20Sopenharmony_ci	if (IS_ERR(map)) {
2678c2ecf20Sopenharmony_ci		dev_err(dev, "failed to init regmap: %ld\n",
2688c2ecf20Sopenharmony_ci			PTR_ERR(map));
2698c2ecf20Sopenharmony_ci		return PTR_ERR(map);
2708c2ecf20Sopenharmony_ci	}
2718c2ecf20Sopenharmony_ci
2728c2ecf20Sopenharmony_ci	return devm_snd_soc_register_component(dev,
2738c2ecf20Sopenharmony_ci			&g12a_tohdmitx_component_drv, g12a_tohdmitx_dai_drv,
2748c2ecf20Sopenharmony_ci			ARRAY_SIZE(g12a_tohdmitx_dai_drv));
2758c2ecf20Sopenharmony_ci}
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_cistatic struct platform_driver g12a_tohdmitx_pdrv = {
2788c2ecf20Sopenharmony_ci	.driver = {
2798c2ecf20Sopenharmony_ci		.name = G12A_TOHDMITX_DRV_NAME,
2808c2ecf20Sopenharmony_ci		.of_match_table = g12a_tohdmitx_of_match,
2818c2ecf20Sopenharmony_ci	},
2828c2ecf20Sopenharmony_ci	.probe = g12a_tohdmitx_probe,
2838c2ecf20Sopenharmony_ci};
2848c2ecf20Sopenharmony_cimodule_platform_driver(g12a_tohdmitx_pdrv);
2858c2ecf20Sopenharmony_ci
2868c2ecf20Sopenharmony_ciMODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
2878c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Amlogic G12a To HDMI Tx Control Codec Driver");
2888c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2");
289