162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * @File	ctatc.h
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * @Brief
862306a36Sopenharmony_ci * This file contains the definition of the device resource management object.
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * @Author	Liu Chun
1162306a36Sopenharmony_ci * @Date 	Mar 28 2008
1262306a36Sopenharmony_ci */
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#ifndef CTATC_H
1562306a36Sopenharmony_ci#define CTATC_H
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#include <linux/types.h>
1862306a36Sopenharmony_ci#include <linux/mutex.h>
1962306a36Sopenharmony_ci#include <linux/pci.h>
2062306a36Sopenharmony_ci#include <linux/timer.h>
2162306a36Sopenharmony_ci#include <sound/core.h>
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#include "ctvmem.h"
2462306a36Sopenharmony_ci#include "cthardware.h"
2562306a36Sopenharmony_ci#include "ctresource.h"
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cienum CTALSADEVS {		/* Types of alsa devices */
2862306a36Sopenharmony_ci	FRONT,
2962306a36Sopenharmony_ci	SURROUND,
3062306a36Sopenharmony_ci	CLFE,
3162306a36Sopenharmony_ci	SIDE,
3262306a36Sopenharmony_ci	IEC958,
3362306a36Sopenharmony_ci	MIXER,
3462306a36Sopenharmony_ci	NUM_CTALSADEVS		/* This should always be the last */
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistruct ct_atc_chip_sub_details {
3862306a36Sopenharmony_ci	u16 subsys;
3962306a36Sopenharmony_ci	const char *nm_model;
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistruct ct_atc_chip_details {
4362306a36Sopenharmony_ci	u16 vendor;
4462306a36Sopenharmony_ci	u16 device;
4562306a36Sopenharmony_ci	const struct ct_atc_chip_sub_details *sub_details;
4662306a36Sopenharmony_ci	const char *nm_card;
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistruct ct_atc;
5062306a36Sopenharmony_cistruct ct_timer;
5162306a36Sopenharmony_cistruct ct_timer_instance;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci/* alsa pcm stream descriptor */
5462306a36Sopenharmony_cistruct ct_atc_pcm {
5562306a36Sopenharmony_ci	struct snd_pcm_substream *substream;
5662306a36Sopenharmony_ci	void (*interrupt)(struct ct_atc_pcm *apcm);
5762306a36Sopenharmony_ci	struct ct_timer_instance *timer;
5862306a36Sopenharmony_ci	unsigned int started:1;
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	/* Only mono and interleaved modes are supported now. */
6162306a36Sopenharmony_ci	struct ct_vm_block *vm_block;
6262306a36Sopenharmony_ci	void *src;		/* SRC for interacting with host memory */
6362306a36Sopenharmony_ci	void **srccs;		/* SRCs for sample rate conversion */
6462306a36Sopenharmony_ci	void **srcimps;		/* SRC Input Mappers */
6562306a36Sopenharmony_ci	void **amixers;		/* AMIXERs for routing converted data */
6662306a36Sopenharmony_ci	void *mono;		/* A SUM resource for mixing chs to one */
6762306a36Sopenharmony_ci	unsigned char n_srcc;	/* Number of converting SRCs */
6862306a36Sopenharmony_ci	unsigned char n_srcimp;	/* Number of SRC Input Mappers */
6962306a36Sopenharmony_ci	unsigned char n_amixer;	/* Number of AMIXERs */
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci/* Chip resource management object */
7362306a36Sopenharmony_cistruct ct_atc {
7462306a36Sopenharmony_ci	struct pci_dev *pci;
7562306a36Sopenharmony_ci	struct snd_card *card;
7662306a36Sopenharmony_ci	unsigned int rsr; /* reference sample rate in Hz */
7762306a36Sopenharmony_ci	unsigned int msr; /* master sample rate in rsr */
7862306a36Sopenharmony_ci	unsigned int pll_rate; /* current rate of Phase Lock Loop */
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	int chip_type;
8162306a36Sopenharmony_ci	int model;
8262306a36Sopenharmony_ci	const char *chip_name;
8362306a36Sopenharmony_ci	const char *model_name;
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	struct ct_vm *vm; /* device virtual memory manager for this card */
8662306a36Sopenharmony_ci	int (*map_audio_buffer)(struct ct_atc *atc, struct ct_atc_pcm *apcm);
8762306a36Sopenharmony_ci	void (*unmap_audio_buffer)(struct ct_atc *atc, struct ct_atc_pcm *apcm);
8862306a36Sopenharmony_ci	unsigned long (*get_ptp_phys)(struct ct_atc *atc, int index);
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	struct mutex atc_mutex;
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	int (*pcm_playback_prepare)(struct ct_atc *atc,
9362306a36Sopenharmony_ci				    struct ct_atc_pcm *apcm);
9462306a36Sopenharmony_ci	int (*pcm_playback_start)(struct ct_atc *atc, struct ct_atc_pcm *apcm);
9562306a36Sopenharmony_ci	int (*pcm_playback_stop)(struct ct_atc *atc, struct ct_atc_pcm *apcm);
9662306a36Sopenharmony_ci	int (*pcm_playback_position)(struct ct_atc *atc,
9762306a36Sopenharmony_ci				     struct ct_atc_pcm *apcm);
9862306a36Sopenharmony_ci	int (*spdif_passthru_playback_prepare)(struct ct_atc *atc,
9962306a36Sopenharmony_ci					       struct ct_atc_pcm *apcm);
10062306a36Sopenharmony_ci	int (*pcm_capture_prepare)(struct ct_atc *atc, struct ct_atc_pcm *apcm);
10162306a36Sopenharmony_ci	int (*pcm_capture_start)(struct ct_atc *atc, struct ct_atc_pcm *apcm);
10262306a36Sopenharmony_ci	int (*pcm_capture_stop)(struct ct_atc *atc, struct ct_atc_pcm *apcm);
10362306a36Sopenharmony_ci	int (*pcm_capture_position)(struct ct_atc *atc,
10462306a36Sopenharmony_ci				    struct ct_atc_pcm *apcm);
10562306a36Sopenharmony_ci	int (*pcm_release_resources)(struct ct_atc *atc,
10662306a36Sopenharmony_ci				     struct ct_atc_pcm *apcm);
10762306a36Sopenharmony_ci	int (*select_line_in)(struct ct_atc *atc);
10862306a36Sopenharmony_ci	int (*select_mic_in)(struct ct_atc *atc);
10962306a36Sopenharmony_ci	int (*select_digit_io)(struct ct_atc *atc);
11062306a36Sopenharmony_ci	int (*line_front_unmute)(struct ct_atc *atc, unsigned char state);
11162306a36Sopenharmony_ci	int (*line_surround_unmute)(struct ct_atc *atc, unsigned char state);
11262306a36Sopenharmony_ci	int (*line_clfe_unmute)(struct ct_atc *atc, unsigned char state);
11362306a36Sopenharmony_ci	int (*line_rear_unmute)(struct ct_atc *atc, unsigned char state);
11462306a36Sopenharmony_ci	int (*line_in_unmute)(struct ct_atc *atc, unsigned char state);
11562306a36Sopenharmony_ci	int (*mic_unmute)(struct ct_atc *atc, unsigned char state);
11662306a36Sopenharmony_ci	int (*spdif_out_unmute)(struct ct_atc *atc, unsigned char state);
11762306a36Sopenharmony_ci	int (*spdif_in_unmute)(struct ct_atc *atc, unsigned char state);
11862306a36Sopenharmony_ci	int (*spdif_out_get_status)(struct ct_atc *atc, unsigned int *status);
11962306a36Sopenharmony_ci	int (*spdif_out_set_status)(struct ct_atc *atc, unsigned int status);
12062306a36Sopenharmony_ci	int (*spdif_out_passthru)(struct ct_atc *atc, unsigned char state);
12162306a36Sopenharmony_ci	struct capabilities (*capabilities)(struct ct_atc *atc);
12262306a36Sopenharmony_ci	int (*output_switch_get)(struct ct_atc *atc);
12362306a36Sopenharmony_ci	int (*output_switch_put)(struct ct_atc *atc, int position);
12462306a36Sopenharmony_ci	int (*mic_source_switch_get)(struct ct_atc *atc);
12562306a36Sopenharmony_ci	int (*mic_source_switch_put)(struct ct_atc *atc, int position);
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	/* Don't touch! Used for internal object. */
12862306a36Sopenharmony_ci	void *rsc_mgrs[NUM_RSCTYP]; /* chip resource managers */
12962306a36Sopenharmony_ci	void *mixer;		/* internal mixer object */
13062306a36Sopenharmony_ci	struct hw *hw;		/* chip specific hardware access object */
13162306a36Sopenharmony_ci	void **daios;		/* digital audio io resources */
13262306a36Sopenharmony_ci	void **pcm;		/* SUMs for collecting all pcm stream */
13362306a36Sopenharmony_ci	void **srcs;		/* Sample Rate Converters for input signal */
13462306a36Sopenharmony_ci	void **srcimps;		/* input mappers for SRCs */
13562306a36Sopenharmony_ci	unsigned char n_daio;
13662306a36Sopenharmony_ci	unsigned char n_src;
13762306a36Sopenharmony_ci	unsigned char n_srcimp;
13862306a36Sopenharmony_ci	unsigned char n_pcm;
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	struct ct_timer *timer;
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ci#ifdef CONFIG_PM_SLEEP
14362306a36Sopenharmony_ci	int (*suspend)(struct ct_atc *atc);
14462306a36Sopenharmony_ci	int (*resume)(struct ct_atc *atc);
14562306a36Sopenharmony_ci#define NUM_PCMS (NUM_CTALSADEVS - 1)
14662306a36Sopenharmony_ci	struct snd_pcm *pcms[NUM_PCMS];
14762306a36Sopenharmony_ci#endif
14862306a36Sopenharmony_ci};
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ciint ct_atc_create(struct snd_card *card, struct pci_dev *pci,
15262306a36Sopenharmony_ci		  unsigned int rsr, unsigned int msr, int chip_type,
15362306a36Sopenharmony_ci		  unsigned int subsysid, struct ct_atc **ratc);
15462306a36Sopenharmony_ciint ct_atc_create_alsa_devs(struct ct_atc *atc);
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci#endif /* CTATC_H */
157