162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  Copyright 10/16/2005 Tilman Kranz <tilde@tk-sls.de>
462306a36Sopenharmony_ci *  Creative Audio MIDI, for the CA0106 Driver
562306a36Sopenharmony_ci *  Version: 0.0.1
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci *  Changelog:
862306a36Sopenharmony_ci *    See ca_midi.c
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/spinlock.h>
1262306a36Sopenharmony_ci#include <sound/rawmidi.h>
1362306a36Sopenharmony_ci#include <sound/mpu401.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define CA_MIDI_MODE_INPUT	MPU401_MODE_INPUT
1662306a36Sopenharmony_ci#define CA_MIDI_MODE_OUTPUT	MPU401_MODE_OUTPUT
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistruct snd_ca_midi {
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	struct snd_rawmidi *rmidi;
2162306a36Sopenharmony_ci	struct snd_rawmidi_substream *substream_input;
2262306a36Sopenharmony_ci	struct snd_rawmidi_substream *substream_output;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	void *dev_id;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	spinlock_t input_lock;
2762306a36Sopenharmony_ci	spinlock_t output_lock;
2862306a36Sopenharmony_ci	spinlock_t open_lock;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	unsigned int channel;
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	unsigned int midi_mode;
3362306a36Sopenharmony_ci	int port;
3462306a36Sopenharmony_ci	int tx_enable, rx_enable;
3562306a36Sopenharmony_ci	int ipr_tx, ipr_rx;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	int input_avail, output_ready;
3862306a36Sopenharmony_ci	int ack, reset, enter_uart;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	void (*interrupt)(struct snd_ca_midi *midi, unsigned int status);
4162306a36Sopenharmony_ci	void (*interrupt_enable)(struct snd_ca_midi *midi, int intr);
4262306a36Sopenharmony_ci	void (*interrupt_disable)(struct snd_ca_midi *midi, int intr);
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	unsigned char (*read)(struct snd_ca_midi *midi, int idx);
4562306a36Sopenharmony_ci	void (*write)(struct snd_ca_midi *midi, int data, int idx);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	/* get info from dev_id */
4862306a36Sopenharmony_ci	struct snd_card *(*get_dev_id_card)(void *dev_id);
4962306a36Sopenharmony_ci	int (*get_dev_id_port)(void *dev_id);
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ciint ca_midi_init(void *card, struct snd_ca_midi *midi, int device, char *name);
53