2 * helper functions for HDMI models (Xonar HDAV1.3)
4 * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
7 * This driver is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License, version 2.
10 * This driver is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this driver; if not, see <http://www.gnu.org/licenses/>.
19 #include <linux/pci.h>
20 #include <linux/delay.h>
21 #include <sound/asoundef.h>
22 #include <sound/control.h>
23 #include <sound/core.h>
24 #include <sound/pcm.h>
25 #include <sound/pcm_params.h>
26 #include <sound/tlv.h>
29 static void hdmi_write_command(struct oxygen
*chip
, u8 command
,
30 unsigned int count
, const u8
*params
)
35 oxygen_write_uart(chip
, 0xfb);
36 oxygen_write_uart(chip
, 0xef);
37 oxygen_write_uart(chip
, command
);
38 oxygen_write_uart(chip
, count
);
39 for (i
= 0; i
< count
; ++i
)
40 oxygen_write_uart(chip
, params
[i
]);
41 checksum
= 0xfb + 0xef + command
+ count
;
42 for (i
= 0; i
< count
; ++i
)
43 checksum
+= params
[i
];
44 oxygen_write_uart(chip
, checksum
);
47 static void xonar_hdmi_init_commands(struct oxygen
*chip
,
48 struct xonar_hdmi
*hdmi
)
52 oxygen_reset_uart(chip
);
54 hdmi_write_command(chip
, 0x61, 1, ¶m
);
56 hdmi_write_command(chip
, 0x74, 1, ¶m
);
57 hdmi_write_command(chip
, 0x54, 5, hdmi
->params
);
60 void xonar_hdmi_init(struct oxygen
*chip
, struct xonar_hdmi
*hdmi
)
62 hdmi
->params
[1] = IEC958_AES3_CON_FS_48000
;
64 xonar_hdmi_init_commands(chip
, hdmi
);
67 void xonar_hdmi_cleanup(struct oxygen
*chip
)
71 hdmi_write_command(chip
, 0x74, 1, ¶m
);
74 void xonar_hdmi_resume(struct oxygen
*chip
, struct xonar_hdmi
*hdmi
)
76 xonar_hdmi_init_commands(chip
, hdmi
);
79 void xonar_hdmi_pcm_hardware_filter(unsigned int channel
,
80 struct snd_pcm_hardware
*hardware
)
82 if (channel
== PCM_MULTICH
) {
83 hardware
->rates
= SNDRV_PCM_RATE_44100
|
84 SNDRV_PCM_RATE_48000
|
85 SNDRV_PCM_RATE_96000
|
86 SNDRV_PCM_RATE_192000
;
87 hardware
->rate_min
= 44100;
91 void xonar_set_hdmi_params(struct oxygen
*chip
, struct xonar_hdmi
*hdmi
,
92 struct snd_pcm_hw_params
*params
)
94 hdmi
->params
[0] = 0; /* 1 = non-audio */
95 switch (params_rate(params
)) {
97 hdmi
->params
[1] = IEC958_AES3_CON_FS_44100
;
100 hdmi
->params
[1] = IEC958_AES3_CON_FS_48000
;
103 hdmi
->params
[1] = IEC958_AES3_CON_FS_96000
;
106 hdmi
->params
[1] = IEC958_AES3_CON_FS_192000
;
109 hdmi
->params
[2] = params_channels(params
) / 2 - 1;
110 if (params_format(params
) == SNDRV_PCM_FORMAT_S16_LE
)
113 hdmi
->params
[3] = 0xc0;
114 hdmi
->params
[4] = 1; /* ? */
115 hdmi_write_command(chip
, 0x54, 5, hdmi
->params
);
118 void xonar_hdmi_uart_input(struct oxygen
*chip
)
120 if (chip
->uart_input_count
>= 2 &&
121 chip
->uart_input
[chip
->uart_input_count
- 2] == 'O' &&
122 chip
->uart_input
[chip
->uart_input_count
- 1] == 'K') {
123 printk(KERN_DEBUG
"message from HDMI chip received:\n");
124 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET
,
125 chip
->uart_input
, chip
->uart_input_count
);
126 chip
->uart_input_count
= 0;