@@ -57,6 +57,7 @@ struct rk_i2s_dev {
5757 int xfer_mode ; /* 0: i2s, 1: pcm */
5858 const struct rk_i2s_pins * pins ;
5959 unsigned int bclk_fs ;
60+ bool bcm2835_compat_mode ;
6061};
6162
6263/* txctrl/rxctrl lock */
@@ -339,23 +340,27 @@ static int rockchip_i2s_hw_params(struct snd_pcm_substream *substream,
339340 return - EINVAL ;
340341 }
341342
342- switch (params_channels (params )) {
343- case 8 :
344- val |= I2S_CHN_8 ;
345- break ;
346- case 6 :
347- val |= I2S_CHN_6 ;
348- break ;
349- case 4 :
350- val |= I2S_CHN_4 ;
351- break ;
352- case 2 :
343+ if (i2s -> bcm2835_compat_mode ) {
353344 val |= I2S_CHN_2 ;
354- break ;
355- default :
356- dev_err (i2s -> dev , "invalid channel: %d\n" ,
357- params_channels (params ));
358- return - EINVAL ;
345+ } else {
346+ switch (params_channels (params )) {
347+ case 8 :
348+ val |= I2S_CHN_8 ;
349+ break ;
350+ case 6 :
351+ val |= I2S_CHN_6 ;
352+ break ;
353+ case 4 :
354+ val |= I2S_CHN_4 ;
355+ break ;
356+ case 2 :
357+ val |= I2S_CHN_2 ;
358+ break ;
359+ default :
360+ dev_err (i2s -> dev , "invalid channel: %d\n" ,
361+ params_channels (params ));
362+ return - EINVAL ;
363+ }
359364 }
360365
361366 if (substream -> stream == SNDRV_PCM_STREAM_CAPTURE )
@@ -692,6 +697,14 @@ static int rockchip_i2s_probe(struct platform_device *pdev)
692697 i2s -> bclk_fs = val ;
693698 }
694699
700+ // If enabled, the behaviour of the rockchip I2S will more closely
701+ // resemble that of the BCM 2835 I2S controlller (as used in the
702+ // raspberry pi). This can be usuful to achieve compatibility with
703+ // Raspberry Pi Audio HATs.
704+ i2s -> bcm2835_compat_mode =
705+ of_property_read_bool (node ,
706+ "rockchip,bcm2835_compatibility_mode" );
707+
695708 ret = devm_snd_soc_register_component (& pdev -> dev ,
696709 & rockchip_i2s_component ,
697710 soc_dai , 1 );
0 commit comments