Загрузка данных


Надо протянуть установку выбора I2S/SPDIF в драйвер lt9611

static void lt9611_hdmi_tx_digital(struct lt9611 *lt9611, bool is_hdmi)
{
	if (is_hdmi)
		regmap_write(lt9611->regmap, 0x82d6, 0x8c);
	else
		regmap_write(lt9611->regmap, 0x82d6, 0x0c);
	regmap_write(lt9611->regmap, 0x82d7, 0x04); //I2S by default???
}

static void lt9611_calc_n(unsigned int fs, unsigned int *n)
{
	switch (fs) {
	case 32000:
	case 48000:
	case 96000:
	case 192000:
		*n = fs * 128 / 1000;
		break;
	case 44100:
	case 88200:
	case 176400:
		*n = fs * 128 / 900;
		break;
	}
}

static int lt9611_hdmi_hw_params(struct device *dev, void *data, struct hdmi_codec_daifmt *fmt,struct hdmi_codec_params *hparms)
{
	struct lt9611 *lt9611 = data;
	unsigned int rate;
	unsigned int len;
	unsigned int val;
	struct reg_sequence seq[] = {
	{ 0x8406, 0x08 },
	{ 0x8407, 0x10 },
	{ 0x840f, 0x2b },
	{ 0x8434, 0xd4 },
	{ 0x8435, 0x00 },
	{ 0x8436, 0x18 },
	{ 0x8437, 0x00 },
	};

	switch (hparms->sample_rate) {
	case 32000:
		rate = LT9611_SAMPLE_FREQ_32000;
		break;
	case 44100:
		rate = LT9611_SAMPLE_FREQ_44100;
		break;
	case 48000:
		rate = LT9611_SAMPLE_FREQ_48000;
		break;
	case 88200:
		rate = LT9611_SAMPLE_FREQ_88200;
		break;
	case 96000:
		rate = LT9611_SAMPLE_FREQ_96000;
		break;
	case 176400:
		rate = LT9611_SAMPLE_FREQ_176400;
		break;
	case 192000:
		rate = LT9611_SAMPLE_FREQ_192000;
		break;
	default:
		return -EINVAL;
	}
	switch (hparms->sample_width) {
	case 16:
		len = LT9611_I2S_SAMPLE_LEN_16;
		break;
	case 18:
		len = LT9611_I2S_SAMPLE_LEN_18;
		break;
	case 20:
		len = LT9611_I2S_SAMPLE_LEN_20;
		break;
	case 24:
		len = LT9611_I2S_SAMPLE_LEN_24;
		break;
	default:
		return -EINVAL;
	}
//Set sample rate and len;
	val = rate << 4 | len;
	seq[2].def = val;
	lt9611_calc_n(hparms->sample_rate, &val);
//Set N val
	seq[4].def = (val >> 16) & 0xF;
	seq[5].def = (val >> 8) & 0xFF;
	seq[6].def = val & 0xFF;
	regmap_multi_reg_write(lt9611->regmap, seq, ARRAY_SIZE(seq));
	return 0;
}

Вот часть китайского драйвера:
		if(lt9611_chip.audio_out==audio_i2s)
		{
		 	HDMI_WriteI2C_Byte(0xd7,0x04);
		}
		
		if(lt9611_chip.audio_out==audio_spdif)
		{
			HDMI_WriteI2C_Byte(0xd7,0x80); 
		}

void LT9611_Audio_Init(void) //sujin
{		
	if(lt9611_chip.audio_out==audio_i2s)
	{
		printk("Audio inut = I2S 2ch.\n");
		HDMI_WriteI2C_Byte(0xFF,0x82);
		HDMI_WriteI2C_Byte(0xd7,0x04);
		HDMI_WriteI2C_Byte(0xff,0x84);
		HDMI_WriteI2C_Byte(0x06,0x08);
		HDMI_WriteI2C_Byte(0x07,0x10);
		HDMI_WriteI2C_Byte(0x0f,0x2b);//48K sampling frequency
		HDMI_WriteI2C_Byte(0x34,0xd4);//CTS_N 20180823 0xd5: sclk = 32fs, 0xd4: sclk = 64fs
		HDMI_WriteI2C_Byte(0x35,0x00);// N value = 6144
		HDMI_WriteI2C_Byte(0x36,0x18);
		HDMI_WriteI2C_Byte(0x37,0x00); 
//		HDMI_WriteI2C_Byte(0x0f,0xab);//96K sampling frequency
//		HDMI_WriteI2C_Byte(0x34,0xd4);//CTS_N 20180823 0xd5: sclk = 32fs, 0xd4: sclk = 64fs
//      
//		HDMI_WriteI2C_Byte(0x35,0x00);// N value = 12288
//		HDMI_WriteI2C_Byte(0x36,0x30);
//		HDMI_WriteI2C_Byte(0x37,0x00); 
//		HDMI_WriteI2C_Byte(0x0f,0x0b);//44.1K sampling frequency
//		HDMI_WriteI2C_Byte(0x34,0xd4);//CTS_N 20180823 0xd5: sclk = 32fs, 0xd4: sclk = 64fs
//   
//		HDMI_WriteI2C_Byte(0x35,0x00);// N value = 6272
//		HDMI_WriteI2C_Byte(0x36,0x18);
//		HDMI_WriteI2C_Byte(0x37,0x80);
	}
	if(lt9611_chip.audio_out==audio_spdif)
	{
		printk("Audio inut = SPDIF.\n");
		HDMI_WriteI2C_Byte(0xFF,0x82);
		HDMI_WriteI2C_Byte(0xd7,0x80);
		HDMI_WriteI2C_Byte(0xff,0x84);
		HDMI_WriteI2C_Byte(0x06,0x0c);
		HDMI_WriteI2C_Byte(0x07,0x10);	
		HDMI_WriteI2C_Byte(0x34,0xd4); //CTS_N
		HDMI_WriteI2C_Byte(0x36,0x20);
	}
}