Загрузка данных
Надо протянуть установку выбора 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);
}
}