[PATCH v2 2/2] sound: meson: g12a-toacodec: add support for SM1 TOACODEC

Jerome Brunet jbrunet at baylibre.com
Fri May 7 00:38:52 PDT 2021


On Wed 05 May 2021 at 09:27, Neil Armstrong <narmstrong at baylibre.com> wrote:

> On 05/05/2021 09:26, Neil Armstrong wrote:
>> This adds support for the TOACODEC found in Amlogic SM1 SoCs.
>> 
>> The bits are shifted for more selection of clock sources, so this only
>> maps the same support for G12A to the SM1 bits.
>> 
>> Signed-off-by: Neil Armstrong <narmstrong at baylibre.com>
>> ---
>>  sound/soc/meson/g12a-toacodec.c | 64 ++++++++++++++++++++++++++++++++-
>>  1 file changed, 63 insertions(+), 1 deletion(-)
>> 
>> diff --git a/sound/soc/meson/g12a-toacodec.c b/sound/soc/meson/g12a-toacodec.c
>> index 2084c9542c9c..5437ecba9c47 100644
>> --- a/sound/soc/meson/g12a-toacodec.c
>> +++ b/sound/soc/meson/g12a-toacodec.c
>> @@ -21,13 +21,22 @@
>>  
>>  #define TOACODEC_CTRL0			0x0
>>  #define  CTRL0_ENABLE_SHIFT		31
>> +#define  CTRL0_DAT_SEL_SM1_MSB		19
>> +#define  CTRL0_DAT_SEL_SM1_LSB		18
>>  #define  CTRL0_DAT_SEL_MSB		15
>>  #define  CTRL0_DAT_SEL_LSB		14
>> +#define  CTRL0_LANE_SEL_SM1		16
>>  #define  CTRL0_LANE_SEL			12
>> +#define  CTRL0_LRCLK_SEL_SM1_MSB	14
>> +#define  CTRL0_LRCLK_SEL_SM1_LSB	12
>>  #define  CTRL0_LRCLK_SEL_MSB		9
>>  #define  CTRL0_LRCLK_SEL_LSB		8
>> +#define  CTRL0_LRCLK_INV_SM1		BIT(10)
>> +#define  CTRL0_BLK_CAP_INV_SM1		BIT(9)
>>  #define  CTRL0_BLK_CAP_INV		BIT(7)
>> +#define  CTRL0_BCLK_O_INV_SM1		BIT(8)
>>  #define  CTRL0_BCLK_O_INV		BIT(6)
>> +#define  CTRL0_BCLK_SEL_SM1_MSB		6
>>  #define  CTRL0_BCLK_SEL_MSB		5
>>  #define  CTRL0_BCLK_SEL_LSB		4
>>  #define  CTRL0_MCLK_SEL			GENMASK(2, 0)
>> @@ -41,6 +50,7 @@ struct g12a_toacodec {
>>  };
>>  
>>  struct g12a_toacodec_match_data {
>> +	const struct snd_soc_component_driver *component_drv;
>>  	struct reg_field field_dat_sel;
>>  	struct reg_field field_lrclk_sel;
>>  	struct reg_field field_bclk_sel;
>> @@ -98,11 +108,20 @@ static SOC_ENUM_SINGLE_DECL(g12a_toacodec_mux_enum, TOACODEC_CTRL0,
>>  			    CTRL0_DAT_SEL_LSB,
>>  			    g12a_toacodec_mux_texts);
>>  
>> +static SOC_ENUM_SINGLE_DECL(sm1_toacodec_mux_enum, TOACODEC_CTRL0,
>> +			    CTRL0_DAT_SEL_SM1_LSB,
>> +			    g12a_toacodec_mux_texts);
>> +
>>  static const struct snd_kcontrol_new g12a_toacodec_mux =
>>  	SOC_DAPM_ENUM_EXT("Source", g12a_toacodec_mux_enum,
>>  			  snd_soc_dapm_get_enum_double,
>>  			  g12a_toacodec_mux_put_enum);
>>  
>> +static const struct snd_kcontrol_new sm1_toacodec_mux =
>> +	SOC_DAPM_ENUM_EXT("Source", sm1_toacodec_mux_enum,
>> +			  snd_soc_dapm_get_enum_double,
>> +			  g12a_toacodec_mux_put_enum);
>> +
>>  static const struct snd_kcontrol_new g12a_toacodec_out_enable =
>>  	SOC_DAPM_SINGLE_AUTODISABLE("Switch", TOACODEC_CTRL0,
>>  				    CTRL0_ENABLE_SHIFT, 1, 0);
>> @@ -114,6 +133,13 @@ static const struct snd_soc_dapm_widget g12a_toacodec_widgets[] = {
>>  			    &g12a_toacodec_out_enable),
>>  };
>>  
>> +static const struct snd_soc_dapm_widget sm1_toacodec_widgets[] = {
>> +	SND_SOC_DAPM_MUX("SRC", SND_SOC_NOPM, 0, 0,
>> +			 &sm1_toacodec_mux),
>> +	SND_SOC_DAPM_SWITCH("OUT EN", SND_SOC_NOPM, 0, 0,
>> +			    &g12a_toacodec_out_enable),
>> +};
>> +
>>  static int g12a_toacodec_input_hw_params(struct snd_pcm_substream *substream,
>>  					 struct snd_pcm_hw_params *params,
>>  					 struct snd_soc_dai *dai)
>> @@ -184,6 +210,13 @@ static int g12a_toacodec_component_probe(struct snd_soc_component *c)
>>  				       CTRL0_BLK_CAP_INV);
>>  }
>>  
>> +static int sm1_toacodec_component_probe(struct snd_soc_component *c)
>> +{
>> +	/* Initialize the static clock parameters */
>> +	return snd_soc_component_write(c, TOACODEC_CTRL0,
>> +				       CTRL0_BLK_CAP_INV_SM1);
>> +}
>> +
>>  static const struct snd_soc_dapm_route g12a_toacodec_routes[] = {
>>  	{ "SRC", "I2S A", "IN A Playback" },
>>  	{ "SRC", "I2S B", "IN B Playback" },
>> @@ -196,6 +229,10 @@ static const struct snd_kcontrol_new g12a_toacodec_controls[] = {
>>  	SOC_SINGLE("Lane Select", TOACODEC_CTRL0, CTRL0_LANE_SEL, 3, 0),
>>  };
>>  
>> +static const struct snd_kcontrol_new sm1_toacodec_controls[] = {
>> +	SOC_SINGLE("Lane Select", TOACODEC_CTRL0, CTRL0_LANE_SEL_SM1, 3, 0),
>> +};
>> +
>>  static const struct snd_soc_component_driver g12a_toacodec_component_drv = {
>>  	.probe			= g12a_toacodec_component_probe,
>>  	.controls		= g12a_toacodec_controls,
>> @@ -208,6 +245,18 @@ static const struct snd_soc_component_driver g12a_toacodec_component_drv = {
>>  	.non_legacy_dai_naming	= 1,
>>  };
>>  
>> +static const struct snd_soc_component_driver sm1_toacodec_component_drv = {
>> +	.probe			= sm1_toacodec_component_probe,
>> +	.controls		= sm1_toacodec_controls,
>> +	.num_controls		= ARRAY_SIZE(sm1_toacodec_controls),
>> +	.dapm_widgets		= sm1_toacodec_widgets,
>> +	.num_dapm_widgets	= ARRAY_SIZE(sm1_toacodec_widgets),
>> +	.dapm_routes		= g12a_toacodec_routes,
>> +	.num_dapm_routes	= ARRAY_SIZE(g12a_toacodec_routes),
>> +	.endianness		= 1,
>> +	.non_legacy_dai_naming	= 1,
>> +};
>> +
>>  static const struct regmap_config g12a_toacodec_regmap_cfg = {
>>  	.reg_bits	= 32,
>>  	.val_bits	= 32,
>> @@ -215,16 +264,29 @@ static const struct regmap_config g12a_toacodec_regmap_cfg = {
>>  };
>>  
>>  static const struct g12a_toacodec_match_data g12a_toacodec_match_data = {
>> +	.component_drv	= &g12a_toacodec_component_drv,
>>  	.field_dat_sel	= REG_FIELD(TOACODEC_CTRL0, CTRL0_DAT_SEL_LSB, CTRL0_DAT_SEL_MSB),
>>  	.field_lrclk_sel = REG_FIELD(TOACODEC_CTRL0, CTRL0_LRCLK_SEL_LSB, CTRL0_LRCLK_SEL_MSB),
>>  	.field_bclk_sel	= REG_FIELD(TOACODEC_CTRL0, CTRL0_BCLK_SEL_LSB, CTRL0_BCLK_SEL_MSB),
>>  };
>>  
>> +static const struct g12a_toacodec_match_data sm1_toacodec_match_data = {
>> +	.component_drv	= &sm1_toacodec_component_drv,
>> +	.field_dat_sel	= REG_FIELD(TOACODEC_CTRL0, CTRL0_DAT_SEL_SM1_LSB, CTRL0_DAT_SEL_SM1_MSB),
>> +	.field_lrclk_sel = REG_FIELD(TOACODEC_CTRL0, CTRL0_LRCLK_SEL_SM1_LSB,
>> +				     CTRL0_LRCLK_SEL_SM1_MSB),
>> +	.field_bclk_sel	= REG_FIELD(TOACODEC_CTRL0, CTRL0_BCLK_SEL_LSB, CTRL0_BCLK_SEL_SM1_MSB),
>> +};

If you make another round, the LSB/MSB defines don't really help
readability here (and in the other patch)

Feel free to put the values directly.

>> +
>>  static const struct of_device_id g12a_toacodec_of_match[] = {
>>  	{
>>  		.compatible = "amlogic,g12a-toacodec",
>>  		.data = &g12a_toacodec_match_data,
>>  	},
>> +	{
>> +		.compatible = "amlogic,sm1-toacodec",
>> +		.data = &sm1_toacodec_match_data,
>> +	},
>>  	{}
>>  };
>>  MODULE_DEVICE_TABLE(of, g12a_toacodec_of_match);
>> @@ -278,7 +340,7 @@ static int g12a_toacodec_probe(struct platform_device *pdev)
>>  		return PTR_ERR(priv->field_bclk_sel);
>>  
>>  	return devm_snd_soc_register_component(dev,
>> -			&g12a_toacodec_component_drv, g12a_toacodec_dai_drv,
>> +			data->component_drv, g12a_toacodec_dai_drv,
>>  			ARRAY_SIZE(g12a_toacodec_dai_drv));
>>  }
>>  
>> 
>
> Oops, spurious one, please ignore it.
>
> Neil




More information about the linux-amlogic mailing list