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