~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/pci/oxygen/xonar_hdmi.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-only
  2 /*
  3  * helper functions for HDMI models (Xonar HDAV1.3/HDAV1.3 Slim)
  4  *
  5  * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
  6  */
  7 
  8 #include <linux/pci.h>
  9 #include <linux/delay.h>
 10 #include <sound/asoundef.h>
 11 #include <sound/control.h>
 12 #include <sound/core.h>
 13 #include <sound/pcm.h>
 14 #include <sound/pcm_params.h>
 15 #include <sound/tlv.h>
 16 #include "xonar.h"
 17 
 18 static void hdmi_write_command(struct oxygen *chip, u8 command,
 19                                unsigned int count, const u8 *params)
 20 {
 21         unsigned int i;
 22         u8 checksum;
 23 
 24         oxygen_write_uart(chip, 0xfb);
 25         oxygen_write_uart(chip, 0xef);
 26         oxygen_write_uart(chip, command);
 27         oxygen_write_uart(chip, count);
 28         for (i = 0; i < count; ++i)
 29                 oxygen_write_uart(chip, params[i]);
 30         checksum = 0xfb + 0xef + command + count;
 31         for (i = 0; i < count; ++i)
 32                 checksum += params[i];
 33         oxygen_write_uart(chip, checksum);
 34 }
 35 
 36 static void xonar_hdmi_init_commands(struct oxygen *chip,
 37                                      struct xonar_hdmi *hdmi)
 38 {
 39         u8 param;
 40 
 41         oxygen_reset_uart(chip);
 42         param = 0;
 43         hdmi_write_command(chip, 0x61, 1, &param);
 44         param = 1;
 45         hdmi_write_command(chip, 0x74, 1, &param);
 46         hdmi_write_command(chip, 0x54, 5, hdmi->params);
 47 }
 48 
 49 void xonar_hdmi_init(struct oxygen *chip, struct xonar_hdmi *hdmi)
 50 {
 51         hdmi->params[1] = IEC958_AES3_CON_FS_48000;
 52         hdmi->params[4] = 1;
 53         xonar_hdmi_init_commands(chip, hdmi);
 54 }
 55 
 56 void xonar_hdmi_cleanup(struct oxygen *chip)
 57 {
 58         u8 param = 0;
 59 
 60         hdmi_write_command(chip, 0x74, 1, &param);
 61 }
 62 
 63 void xonar_hdmi_resume(struct oxygen *chip, struct xonar_hdmi *hdmi)
 64 {
 65         xonar_hdmi_init_commands(chip, hdmi);
 66 }
 67 
 68 void xonar_hdmi_pcm_hardware_filter(unsigned int channel,
 69                                     struct snd_pcm_hardware *hardware)
 70 {
 71         if (channel == PCM_MULTICH) {
 72                 hardware->rates = SNDRV_PCM_RATE_44100 |
 73                                   SNDRV_PCM_RATE_48000 |
 74                                   SNDRV_PCM_RATE_96000 |
 75                                   SNDRV_PCM_RATE_192000;
 76                 hardware->rate_min = 44100;
 77         }
 78 }
 79 
 80 void xonar_set_hdmi_params(struct oxygen *chip, struct xonar_hdmi *hdmi,
 81                            struct snd_pcm_hw_params *params)
 82 {
 83         hdmi->params[0] = 0; /* 1 = non-audio */
 84         switch (params_rate(params)) {
 85         case 44100:
 86                 hdmi->params[1] = IEC958_AES3_CON_FS_44100;
 87                 break;
 88         case 48000:
 89                 hdmi->params[1] = IEC958_AES3_CON_FS_48000;
 90                 break;
 91         default: /* 96000 */
 92                 hdmi->params[1] = IEC958_AES3_CON_FS_96000;
 93                 break;
 94         case 192000:
 95                 hdmi->params[1] = IEC958_AES3_CON_FS_192000;
 96                 break;
 97         }
 98         hdmi->params[2] = params_channels(params) / 2 - 1;
 99         if (params_format(params) == SNDRV_PCM_FORMAT_S16_LE)
100                 hdmi->params[3] = 0;
101         else
102                 hdmi->params[3] = 0xc0;
103         hdmi->params[4] = 1; /* ? */
104         hdmi_write_command(chip, 0x54, 5, hdmi->params);
105 }
106 
107 void xonar_hdmi_uart_input(struct oxygen *chip)
108 {
109         if (chip->uart_input_count >= 2 &&
110             chip->uart_input[chip->uart_input_count - 2] == 'O' &&
111             chip->uart_input[chip->uart_input_count - 1] == 'K') {
112                 dev_dbg(chip->card->dev, "message from HDMI chip received:\n");
113                 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET,
114                                      chip->uart_input, chip->uart_input_count);
115                 chip->uart_input_count = 0;
116         }
117 }
118 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php