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