162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/* -*- linux-c -*- *
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * ALSA driver for the digigram lx6464es interface
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (c) 2009 Tim Blechmann <tim@klingt.org>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef LX6464ES_H
1062306a36Sopenharmony_ci#define LX6464ES_H
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/spinlock.h>
1362306a36Sopenharmony_ci#include <linux/atomic.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <sound/core.h>
1662306a36Sopenharmony_ci#include <sound/pcm.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include "lx_core.h"
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define LXP "LX6464ES: "
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cienum {
2362306a36Sopenharmony_ci    ES_cmd_free         = 0,    /* no command executing */
2462306a36Sopenharmony_ci    ES_cmd_processing   = 1,	/* execution of a read/write command */
2562306a36Sopenharmony_ci    ES_read_pending     = 2,    /* a asynchron read command is pending */
2662306a36Sopenharmony_ci    ES_read_finishing   = 3,    /* a read command has finished waiting (set by
2762306a36Sopenharmony_ci				 * Interrupt or CancelIrp) */
2862306a36Sopenharmony_ci};
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cienum lx_stream_status {
3162306a36Sopenharmony_ci	LX_STREAM_STATUS_FREE,
3262306a36Sopenharmony_ci/* 	LX_STREAM_STATUS_OPEN, */
3362306a36Sopenharmony_ci	LX_STREAM_STATUS_SCHEDULE_RUN,
3462306a36Sopenharmony_ci/* 	LX_STREAM_STATUS_STARTED, */
3562306a36Sopenharmony_ci	LX_STREAM_STATUS_RUNNING,
3662306a36Sopenharmony_ci	LX_STREAM_STATUS_SCHEDULE_STOP,
3762306a36Sopenharmony_ci/* 	LX_STREAM_STATUS_STOPPED, */
3862306a36Sopenharmony_ci/* 	LX_STREAM_STATUS_PAUSED */
3962306a36Sopenharmony_ci};
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistruct lx_stream {
4362306a36Sopenharmony_ci	struct snd_pcm_substream  *stream;
4462306a36Sopenharmony_ci	snd_pcm_uframes_t          frame_pos;
4562306a36Sopenharmony_ci	enum lx_stream_status      status; /* free, open, running, draining
4662306a36Sopenharmony_ci					    * pause */
4762306a36Sopenharmony_ci	unsigned int               is_capture:1;
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistruct lx6464es {
5262306a36Sopenharmony_ci	struct snd_card        *card;
5362306a36Sopenharmony_ci	struct pci_dev         *pci;
5462306a36Sopenharmony_ci	int			irq;
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	u8			mac_address[6];
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	struct mutex		lock;        /* interrupt lock */
5962306a36Sopenharmony_ci	struct mutex            setup_mutex; /* mutex used in hw_params, open
6062306a36Sopenharmony_ci					      * and close */
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	/* ports */
6362306a36Sopenharmony_ci	unsigned long		port_plx;	   /* io port (size=256) */
6462306a36Sopenharmony_ci	void __iomem           *port_plx_remapped; /* remapped plx port */
6562306a36Sopenharmony_ci	void __iomem           *port_dsp_bar;      /* memory port (32-bit,
6662306a36Sopenharmony_ci						    * non-prefetchable,
6762306a36Sopenharmony_ci						    * size=8K) */
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	/* messaging */
7062306a36Sopenharmony_ci	struct mutex		msg_lock;          /* message lock */
7162306a36Sopenharmony_ci	struct lx_rmh           rmh;
7262306a36Sopenharmony_ci	u32			irqsrc;
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	/* configuration */
7562306a36Sopenharmony_ci	uint			freq_ratio : 2;
7662306a36Sopenharmony_ci	uint                    playback_mute : 1;
7762306a36Sopenharmony_ci	uint                    hardware_running[2];
7862306a36Sopenharmony_ci	u32                     board_sample_rate; /* sample rate read from
7962306a36Sopenharmony_ci						    * board */
8062306a36Sopenharmony_ci	u16                     pcm_granularity;   /* board blocksize */
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	/* dma */
8362306a36Sopenharmony_ci	struct snd_dma_buffer   capture_dma_buf;
8462306a36Sopenharmony_ci	struct snd_dma_buffer   playback_dma_buf;
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	/* pcm */
8762306a36Sopenharmony_ci	struct snd_pcm         *pcm;
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	/* streams */
9062306a36Sopenharmony_ci	struct lx_stream        capture_stream;
9162306a36Sopenharmony_ci	struct lx_stream        playback_stream;
9262306a36Sopenharmony_ci};
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci#endif /* LX6464ES_H */
96