157 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.4 *5 * @File ctatc.h6 *7 * @Brief8 * This file contains the definition of the device resource management object.9 *10 * @Author Liu Chun11 * @Date Mar 28 200812 */13 14#ifndef CTATC_H15#define CTATC_H16 17#include <linux/types.h>18#include <linux/mutex.h>19#include <linux/pci.h>20#include <linux/timer.h>21#include <sound/core.h>22 23#include "ctvmem.h"24#include "cthardware.h"25#include "ctresource.h"26 27enum CTALSADEVS { /* Types of alsa devices */28 FRONT,29 SURROUND,30 CLFE,31 SIDE,32 IEC958,33 MIXER,34 NUM_CTALSADEVS /* This should always be the last */35};36 37struct ct_atc_chip_sub_details {38 u16 subsys;39 const char *nm_model;40};41 42struct ct_atc_chip_details {43 u16 vendor;44 u16 device;45 const struct ct_atc_chip_sub_details *sub_details;46 const char *nm_card;47};48 49struct ct_atc;50struct ct_timer;51struct ct_timer_instance;52 53/* alsa pcm stream descriptor */54struct ct_atc_pcm {55 struct snd_pcm_substream *substream;56 void (*interrupt)(struct ct_atc_pcm *apcm);57 struct ct_timer_instance *timer;58 unsigned int started:1;59 60 /* Only mono and interleaved modes are supported now. */61 struct ct_vm_block *vm_block;62 void *src; /* SRC for interacting with host memory */63 void **srccs; /* SRCs for sample rate conversion */64 void **srcimps; /* SRC Input Mappers */65 void **amixers; /* AMIXERs for routing converted data */66 void *mono; /* A SUM resource for mixing chs to one */67 unsigned char n_srcc; /* Number of converting SRCs */68 unsigned char n_srcimp; /* Number of SRC Input Mappers */69 unsigned char n_amixer; /* Number of AMIXERs */70};71 72/* Chip resource management object */73struct ct_atc {74 struct pci_dev *pci;75 struct snd_card *card;76 unsigned int rsr; /* reference sample rate in Hz */77 unsigned int msr; /* master sample rate in rsr */78 unsigned int pll_rate; /* current rate of Phase Lock Loop */79 80 int chip_type;81 int model;82 const char *chip_name;83 const char *model_name;84 85 struct ct_vm *vm; /* device virtual memory manager for this card */86 int (*map_audio_buffer)(struct ct_atc *atc, struct ct_atc_pcm *apcm);87 void (*unmap_audio_buffer)(struct ct_atc *atc, struct ct_atc_pcm *apcm);88 unsigned long (*get_ptp_phys)(struct ct_atc *atc, int index);89 90 struct mutex atc_mutex;91 92 int (*pcm_playback_prepare)(struct ct_atc *atc,93 struct ct_atc_pcm *apcm);94 int (*pcm_playback_start)(struct ct_atc *atc, struct ct_atc_pcm *apcm);95 int (*pcm_playback_stop)(struct ct_atc *atc, struct ct_atc_pcm *apcm);96 int (*pcm_playback_position)(struct ct_atc *atc,97 struct ct_atc_pcm *apcm);98 int (*spdif_passthru_playback_prepare)(struct ct_atc *atc,99 struct ct_atc_pcm *apcm);100 int (*pcm_capture_prepare)(struct ct_atc *atc, struct ct_atc_pcm *apcm);101 int (*pcm_capture_start)(struct ct_atc *atc, struct ct_atc_pcm *apcm);102 int (*pcm_capture_stop)(struct ct_atc *atc, struct ct_atc_pcm *apcm);103 int (*pcm_capture_position)(struct ct_atc *atc,104 struct ct_atc_pcm *apcm);105 int (*pcm_release_resources)(struct ct_atc *atc,106 struct ct_atc_pcm *apcm);107 int (*select_line_in)(struct ct_atc *atc);108 int (*select_mic_in)(struct ct_atc *atc);109 int (*select_digit_io)(struct ct_atc *atc);110 int (*line_front_unmute)(struct ct_atc *atc, unsigned char state);111 int (*line_surround_unmute)(struct ct_atc *atc, unsigned char state);112 int (*line_clfe_unmute)(struct ct_atc *atc, unsigned char state);113 int (*line_rear_unmute)(struct ct_atc *atc, unsigned char state);114 int (*line_in_unmute)(struct ct_atc *atc, unsigned char state);115 int (*mic_unmute)(struct ct_atc *atc, unsigned char state);116 int (*spdif_out_unmute)(struct ct_atc *atc, unsigned char state);117 int (*spdif_in_unmute)(struct ct_atc *atc, unsigned char state);118 int (*spdif_out_get_status)(struct ct_atc *atc, unsigned int *status);119 int (*spdif_out_set_status)(struct ct_atc *atc, unsigned int status);120 int (*spdif_out_passthru)(struct ct_atc *atc, unsigned char state);121 struct capabilities (*capabilities)(struct ct_atc *atc);122 int (*output_switch_get)(struct ct_atc *atc);123 int (*output_switch_put)(struct ct_atc *atc, int position);124 int (*mic_source_switch_get)(struct ct_atc *atc);125 int (*mic_source_switch_put)(struct ct_atc *atc, int position);126 127 /* Don't touch! Used for internal object. */128 void *rsc_mgrs[NUM_RSCTYP]; /* chip resource managers */129 void *mixer; /* internal mixer object */130 struct hw *hw; /* chip specific hardware access object */131 void **daios; /* digital audio io resources */132 void **pcm; /* SUMs for collecting all pcm stream */133 void **srcs; /* Sample Rate Converters for input signal */134 void **srcimps; /* input mappers for SRCs */135 unsigned char n_daio;136 unsigned char n_src;137 unsigned char n_srcimp;138 unsigned char n_pcm;139 140 struct ct_timer *timer;141 142#ifdef CONFIG_PM_SLEEP143 int (*suspend)(struct ct_atc *atc);144 int (*resume)(struct ct_atc *atc);145#define NUM_PCMS (NUM_CTALSADEVS - 1)146 struct snd_pcm *pcms[NUM_PCMS];147#endif148};149 150 151int ct_atc_create(struct snd_card *card, struct pci_dev *pci,152 unsigned int rsr, unsigned int msr, int chip_type,153 unsigned int subsysid, struct ct_atc **ratc);154int ct_atc_create_alsa_devs(struct ct_atc *atc);155 156#endif /* CTATC_H */157