Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 47 additions & 3 deletions sound/soc/codecs/tac5xx2-sdw.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@ struct tac5xx2_prv {
struct device *dev;
bool hw_init;
bool first_hw_init_done;
bool support_spk;
bool support_dmic;
u32 part_id;
u32 rev_id;
struct snd_soc_jack *hs_jack;
Expand Down Expand Up @@ -1168,6 +1170,28 @@ static int tac_interrupt_callback(struct sdw_slave *slave,
return 0;
}

static struct snd_soc_dai_driver tac5272_dai_driver[] = {
{
.name = "tac5xx2-aif3",
.id = TAC5XX2_UAJ,
.playback = {
.stream_name = "DP4 UAJ Speaker Playback",
.channels_min = 1,
.channels_max = 2,
.rates = TAC5XX2_DEVICE_RATES,
.formats = TAC5XX2_DEVICE_FORMATS,
},
.capture = {
.stream_name = "DP7 UAJ Mic Capture",
.channels_min = 1,
.channels_max = 2,
.rates = TAC5XX2_DEVICE_RATES,
.formats = TAC5XX2_DEVICE_FORMATS,
},
.ops = &tac_dai_ops,
},
};

static struct snd_soc_dai_driver tac5572_dai_driver[] = {
{
.name = "tac5xx2-aif1",
Expand Down Expand Up @@ -1409,8 +1433,16 @@ static const struct snd_soc_component_driver soc_codec_driver_tacdevice = {
.endianness = 1,
};

static const struct snd_soc_component_driver soc_codec_driver_tac5272 = {
.probe = tac_component_probe,
.remove = tac_component_remove,
.idle_bias_on = 0,
.endianness = 1,
};

static s32 tac_init(struct tac5xx2_prv *tac_dev)
{
const struct snd_soc_component_driver *template;
struct snd_soc_component_driver *component_driver;
struct snd_soc_dai_driver *dai_drv;
int num_dais;
Expand All @@ -1419,21 +1451,30 @@ static s32 tac_init(struct tac5xx2_prv *tac_dev)
dev_set_drvdata(tac_dev->dev, tac_dev);

switch (tac_dev->part_id) {
case 0x5272:
dai_drv = tac5272_dai_driver;
num_dais = ARRAY_SIZE(tac5272_dai_driver);
template = &soc_codec_driver_tac5272;
break;
case 0x5572:
dai_drv = tac5572_dai_driver;
num_dais = ARRAY_SIZE(tac5572_dai_driver);
template = &soc_codec_driver_tacdevice;
break;
case 0x5672:
dai_drv = tac5672_dai_driver;
num_dais = ARRAY_SIZE(tac5672_dai_driver);
template = &soc_codec_driver_tacdevice;
break;
case 0x5682:
dai_drv = tac5682_dai_driver;
num_dais = ARRAY_SIZE(tac5682_dai_driver);
template = &soc_codec_driver_tacdevice;
break;
case 0x2883:
dai_drv = tas2883_dai_driver;
num_dais = ARRAY_SIZE(tas2883_dai_driver);
template = &soc_codec_driver_tacdevice;
break;
default:
dev_err(tac_dev->dev, "Unsupported device: 0x%x\n",
Expand All @@ -1446,7 +1487,7 @@ static s32 tac_init(struct tac5xx2_prv *tac_dev)
if (!component_driver)
return -ENOMEM;

memcpy(component_driver, &soc_codec_driver_tacdevice, sizeof(*component_driver));
memcpy(component_driver, template, sizeof(*component_driver));
if (tac_has_uaj_support(tac_dev))
component_driver->set_jack = tac5xx2_set_jack;

Expand Down Expand Up @@ -1756,7 +1797,7 @@ static int tac_io_init(struct device *dev, struct sdw_slave *slave, bool first)
}
}

if (tac_dev->sa_func_data) {
if (tac_dev->sa_func_data && tac_dev->support_spk) {
ret = sdca_regmap_write_init(dev, tac_dev->regmap,
tac_dev->sa_func_data);
if (ret) {
Expand All @@ -1775,7 +1816,7 @@ static int tac_io_init(struct device *dev, struct sdw_slave *slave, bool first)
}
}

if (tac_dev->sm_func_data) {
if (tac_dev->sm_func_data && tac_dev->support_dmic) {
ret = sdca_regmap_write_init(dev, tac_dev->regmap,
tac_dev->sm_func_data);
if (ret) {
Expand Down Expand Up @@ -1995,6 +2036,8 @@ static s32 tac_sdw_probe(struct sdw_slave *peripheral,
tac_dev->first_hw_init_done = false;
tac_dev->part_id = id->part_id;
tac_dev->rev_id = 0x0;
tac_dev->support_spk = (id->part_id != 0x5272);
tac_dev->support_dmic = (id->part_id != 0x5272);
dev_set_drvdata(dev, tac_dev);

regmap = devm_regmap_init_sdw_mbq_cfg(&peripheral->dev, peripheral,
Expand Down Expand Up @@ -2045,6 +2088,7 @@ static void tac_sdw_remove(struct sdw_slave *peripheral)
}

static const struct sdw_device_id tac_sdw_id[] = {
SDW_SLAVE_ENTRY(0x0102, 0x5272, 0),
SDW_SLAVE_ENTRY(0x0102, 0x5572, 0),
SDW_SLAVE_ENTRY(0x0102, 0x5672, 0),
SDW_SLAVE_ENTRY(0x0102, 0x5682, 0),
Expand Down
21 changes: 21 additions & 0 deletions sound/soc/sdw_utils/soc_sdw_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,27 @@ static const struct snd_kcontrol_new rt700_controls[] = {
};

struct asoc_sdw_codec_info codec_info_list[] = {
{
.vendor_id = 0x0102,
.part_id = 0x5272,
.name_prefix = "tac5272",
.dais = {
{
/* UAJ only - no speaker or DMIC */
.direction = {true, true},
.dai_name = "tac5xx2-aif3",
.component_name = "tac5272",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

component_name is currently for the amp only. But it is harmless to add it.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, I realized this during the ucm2 file creation.

.dai_type = SOC_SDW_DAI_TYPE_JACK,
.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
.controls = generic_jack_controls,
.num_controls = ARRAY_SIZE(generic_jack_controls),
.widgets = generic_jack_widgets,
.num_widgets = ARRAY_SIZE(generic_jack_widgets),
.rtd_init = asoc_sdw_ti_sdca_jack_rtd_init,
},
},
.dai_num = 1,
},
{
.vendor_id = 0x0102,
.part_id = 0x5572,
Expand Down
Loading