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