ADV7511 support I2S or SPDIF as audio input interfaces. This commit enable support for SPDIF.
Signed-off-by: Bogdan Togorean bogdan.togorean@analog.com --- drivers/gpu/drm/bridge/adv7511/adv7511_audio.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c b/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c index a428185be2c1..96be7b005c50 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c @@ -119,6 +119,8 @@ int adv7511_hdmi_hw_params(struct device *dev, void *data, audio_source = ADV7511_AUDIO_SOURCE_I2S; i2s_format = ADV7511_I2S_FORMAT_LEFT_J; break; + case HDMI_SPDIF: + audio_source = ADV7511_AUDIO_SOURCE_SPDIF; default: return -EINVAL; } @@ -175,11 +177,21 @@ static int audio_startup(struct device *dev, void *data) /* use Audio infoframe updated info */ regmap_update_bits(adv7511->regmap, ADV7511_REG_GC(1), BIT(5), 0); + /* enable SPDIF receiver */ + if (adv7511->audio_source == ADV7511_AUDIO_SOURCE_SPDIF) + regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CONFIG, + BIT(7), BIT(7)); + return 0; }
static void audio_shutdown(struct device *dev, void *data) { + struct adv7511 *adv7511 = dev_get_drvdata(dev); + + if (adv7511->audio_source == ADV7511_AUDIO_SOURCE_SPDIF) + regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CONFIG, + BIT(7), 0); }
static int adv7511_hdmi_i2s_get_dai_id(struct snd_soc_component *component, @@ -213,6 +225,7 @@ static const struct hdmi_codec_pdata codec_data = { .ops = &adv7511_codec_ops, .max_i2s_channels = 2, .i2s = 1, + .spdif = 1, };
int adv7511_audio_init(struct device *dev, struct adv7511 *adv7511)
Hi Bogdan,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on linus/master] [cannot apply to v5.4-rc1 next-20191004] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system. BTW, we also suggest to use '--base' option to specify the base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Bogdan-Togorean/drm-bridge-adv7511-... config: xtensa-allyesconfig (attached as .config) compiler: xtensa-linux-gcc (GCC) 7.4.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree GCC_VERSION=7.4.0 make.cross ARCH=xtensa
If you fix the issue, kindly add following tag Reported-by: kbuild test robot lkp@intel.com
All warnings (new ones prefixed by >>):
drivers/gpu/drm/bridge/adv7511/adv7511_audio.c: In function 'adv7511_hdmi_hw_params':
drivers/gpu/drm/bridge/adv7511/adv7511_audio.c:123:16: warning: this statement may fall through [-Wimplicit-fallthrough=]
audio_source = ADV7511_AUDIO_SOURCE_SPDIF; drivers/gpu/drm/bridge/adv7511/adv7511_audio.c:124:2: note: here default: ^~~~~~~
vim +123 drivers/gpu/drm/bridge/adv7511/adv7511_audio.c
55 56 int adv7511_hdmi_hw_params(struct device *dev, void *data, 57 struct hdmi_codec_daifmt *fmt, 58 struct hdmi_codec_params *hparms) 59 { 60 struct adv7511 *adv7511 = dev_get_drvdata(dev); 61 unsigned int audio_source, i2s_format = 0; 62 unsigned int invert_clock; 63 unsigned int rate; 64 unsigned int len; 65 66 switch (hparms->sample_rate) { 67 case 32000: 68 rate = ADV7511_SAMPLE_FREQ_32000; 69 break; 70 case 44100: 71 rate = ADV7511_SAMPLE_FREQ_44100; 72 break; 73 case 48000: 74 rate = ADV7511_SAMPLE_FREQ_48000; 75 break; 76 case 88200: 77 rate = ADV7511_SAMPLE_FREQ_88200; 78 break; 79 case 96000: 80 rate = ADV7511_SAMPLE_FREQ_96000; 81 break; 82 case 176400: 83 rate = ADV7511_SAMPLE_FREQ_176400; 84 break; 85 case 192000: 86 rate = ADV7511_SAMPLE_FREQ_192000; 87 break; 88 default: 89 return -EINVAL; 90 } 91 92 switch (hparms->sample_width) { 93 case 16: 94 len = ADV7511_I2S_SAMPLE_LEN_16; 95 break; 96 case 18: 97 len = ADV7511_I2S_SAMPLE_LEN_18; 98 break; 99 case 20: 100 len = ADV7511_I2S_SAMPLE_LEN_20; 101 break; 102 case 24: 103 len = ADV7511_I2S_SAMPLE_LEN_24; 104 break; 105 default: 106 return -EINVAL; 107 } 108 109 switch (fmt->fmt) { 110 case HDMI_I2S: 111 audio_source = ADV7511_AUDIO_SOURCE_I2S; 112 i2s_format = ADV7511_I2S_FORMAT_I2S; 113 break; 114 case HDMI_RIGHT_J: 115 audio_source = ADV7511_AUDIO_SOURCE_I2S; 116 i2s_format = ADV7511_I2S_FORMAT_RIGHT_J; 117 break; 118 case HDMI_LEFT_J: 119 audio_source = ADV7511_AUDIO_SOURCE_I2S; 120 i2s_format = ADV7511_I2S_FORMAT_LEFT_J; 121 break; 122 case HDMI_SPDIF:
123 audio_source = ADV7511_AUDIO_SOURCE_SPDIF;
124 default: 125 return -EINVAL; 126 } 127 128 invert_clock = fmt->bit_clk_inv; 129 130 regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_SOURCE, 0x70, 131 audio_source << 4); 132 regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CONFIG, BIT(6), 133 invert_clock << 6); 134 regmap_update_bits(adv7511->regmap, ADV7511_REG_I2S_CONFIG, 0x03, 135 i2s_format); 136 137 adv7511->audio_source = audio_source; 138 139 adv7511->f_audio = hparms->sample_rate; 140 141 adv7511_update_cts_n(adv7511); 142 143 regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CFG3, 144 ADV7511_AUDIO_CFG3_LEN_MASK, len); 145 regmap_update_bits(adv7511->regmap, ADV7511_REG_I2C_FREQ_ID_CFG, 146 ADV7511_I2C_FREQ_ID_CFG_RATE_MASK, rate << 4); 147 regmap_write(adv7511->regmap, 0x73, 0x1); 148 149 return 0; 150 } 151
--- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
dri-devel@lists.freedesktop.org