18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  Copyright 10/16/2005 Tilman Kranz <tilde@tk-sls.de>
48c2ecf20Sopenharmony_ci *  Creative Audio MIDI, for the CA0106 Driver
58c2ecf20Sopenharmony_ci *  Version: 0.0.1
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci *  Changelog:
88c2ecf20Sopenharmony_ci *    See ca_midi.c
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include <linux/spinlock.h>
128c2ecf20Sopenharmony_ci#include <sound/rawmidi.h>
138c2ecf20Sopenharmony_ci#include <sound/mpu401.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#define CA_MIDI_MODE_INPUT	MPU401_MODE_INPUT
168c2ecf20Sopenharmony_ci#define CA_MIDI_MODE_OUTPUT	MPU401_MODE_OUTPUT
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_cistruct snd_ca_midi {
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci	struct snd_rawmidi *rmidi;
218c2ecf20Sopenharmony_ci	struct snd_rawmidi_substream *substream_input;
228c2ecf20Sopenharmony_ci	struct snd_rawmidi_substream *substream_output;
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	void *dev_id;
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci	spinlock_t input_lock;
278c2ecf20Sopenharmony_ci	spinlock_t output_lock;
288c2ecf20Sopenharmony_ci	spinlock_t open_lock;
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci	unsigned int channel;
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci	unsigned int midi_mode;
338c2ecf20Sopenharmony_ci	int port;
348c2ecf20Sopenharmony_ci	int tx_enable, rx_enable;
358c2ecf20Sopenharmony_ci	int ipr_tx, ipr_rx;
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	int input_avail, output_ready;
388c2ecf20Sopenharmony_ci	int ack, reset, enter_uart;
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci	void (*interrupt)(struct snd_ca_midi *midi, unsigned int status);
418c2ecf20Sopenharmony_ci	void (*interrupt_enable)(struct snd_ca_midi *midi, int intr);
428c2ecf20Sopenharmony_ci	void (*interrupt_disable)(struct snd_ca_midi *midi, int intr);
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	unsigned char (*read)(struct snd_ca_midi *midi, int idx);
458c2ecf20Sopenharmony_ci	void (*write)(struct snd_ca_midi *midi, int data, int idx);
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci	/* get info from dev_id */
488c2ecf20Sopenharmony_ci	struct snd_card *(*get_dev_id_card)(void *dev_id);
498c2ecf20Sopenharmony_ci	int (*get_dev_id_port)(void *dev_id);
508c2ecf20Sopenharmony_ci};
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ciint ca_midi_init(void *card, struct snd_ca_midi *midi, int device, char *name);
53