linux/include/sound/mpu401.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2#ifndef __SOUND_MPU401_H
   3#define __SOUND_MPU401_H
   4
   5/*
   6 *  Header file for MPU-401 and compatible cards
   7 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
   8 */
   9
  10#include <sound/rawmidi.h>
  11#include <linux/interrupt.h>
  12
  13#define MPU401_HW_MPU401                1       /* native MPU401 */
  14#define MPU401_HW_SB                    2       /* SoundBlaster MPU-401 UART */
  15#define MPU401_HW_ES1688                3       /* AudioDrive ES1688 MPU-401 UART */
  16#define MPU401_HW_OPL3SA2               4       /* Yamaha OPL3-SA2 */
  17#define MPU401_HW_SONICVIBES            5       /* S3 SonicVibes */
  18#define MPU401_HW_CS4232                6       /* CS4232 */
  19#define MPU401_HW_ES18XX                7       /* AudioDrive ES18XX MPU-401 UART */
  20#define MPU401_HW_FM801                 8       /* ForteMedia FM801 */
  21#define MPU401_HW_TRID4DWAVE            9       /* Trident 4DWave */
  22#define MPU401_HW_AZT2320               10      /* Aztech AZT2320 */
  23#define MPU401_HW_ALS100                11      /* Avance Logic ALS100 */
  24#define MPU401_HW_ICE1712               12      /* Envy24 */
  25#define MPU401_HW_VIA686A               13      /* VIA 82C686A */
  26#define MPU401_HW_YMFPCI                14      /* YMF DS-XG PCI */
  27#define MPU401_HW_CMIPCI                15      /* CMIPCI MPU-401 UART */
  28#define MPU401_HW_ALS4000               16      /* Avance Logic ALS4000 */
  29#define MPU401_HW_INTEL8X0              17      /* Intel8x0 driver */
  30#define MPU401_HW_PC98II                18      /* Roland PC98II */
  31#define MPU401_HW_AUREAL                19      /* Aureal Vortex */
  32
  33#define MPU401_INFO_INPUT       (1 << 0)        /* input stream */
  34#define MPU401_INFO_OUTPUT      (1 << 1)        /* output stream */
  35#define MPU401_INFO_INTEGRATED  (1 << 2)        /* integrated h/w port */
  36#define MPU401_INFO_MMIO        (1 << 3)        /* MMIO access */
  37#define MPU401_INFO_TX_IRQ      (1 << 4)        /* independent TX irq */
  38#define MPU401_INFO_IRQ_HOOK    (1 << 5)        /* mpu401 irq handler is called
  39                                                   from driver irq handler */
  40#define MPU401_INFO_NO_ACK      (1 << 6)        /* No ACK cmd needed */
  41#define MPU401_INFO_USE_TIMER   (1 << 15)       /* internal */
  42
  43#define MPU401_MODE_BIT_INPUT           0
  44#define MPU401_MODE_BIT_OUTPUT          1
  45#define MPU401_MODE_BIT_INPUT_TRIGGER   2
  46#define MPU401_MODE_BIT_OUTPUT_TRIGGER  3
  47
  48#define MPU401_MODE_INPUT               (1<<MPU401_MODE_BIT_INPUT)
  49#define MPU401_MODE_OUTPUT              (1<<MPU401_MODE_BIT_OUTPUT)
  50#define MPU401_MODE_INPUT_TRIGGER       (1<<MPU401_MODE_BIT_INPUT_TRIGGER)
  51#define MPU401_MODE_OUTPUT_TRIGGER      (1<<MPU401_MODE_BIT_OUTPUT_TRIGGER)
  52
  53#define MPU401_MODE_INPUT_TIMER         (1<<0)
  54#define MPU401_MODE_OUTPUT_TIMER        (1<<1)
  55
  56struct snd_mpu401 {
  57        struct snd_rawmidi *rmidi;
  58
  59        unsigned short hardware;        /* MPU401_HW_XXXX */
  60        unsigned int info_flags;        /* MPU401_INFO_XXX */
  61        unsigned long port;             /* base port of MPU-401 chip */
  62        unsigned long cport;            /* port + 1 (usually) */
  63        struct resource *res;           /* port resource */
  64        int irq;                        /* IRQ number of MPU-401 chip */
  65
  66        unsigned long mode;             /* MPU401_MODE_XXXX */
  67        int timer_invoked;
  68
  69        int (*open_input) (struct snd_mpu401 * mpu);
  70        void (*close_input) (struct snd_mpu401 * mpu);
  71        int (*open_output) (struct snd_mpu401 * mpu);
  72        void (*close_output) (struct snd_mpu401 * mpu);
  73        void *private_data;
  74
  75        struct snd_rawmidi_substream *substream_input;
  76        struct snd_rawmidi_substream *substream_output;
  77
  78        spinlock_t input_lock;
  79        spinlock_t output_lock;
  80        spinlock_t timer_lock;
  81        
  82        struct timer_list timer;
  83
  84        void (*write) (struct snd_mpu401 * mpu, unsigned char data, unsigned long addr);
  85        unsigned char (*read) (struct snd_mpu401 *mpu, unsigned long addr);
  86};
  87
  88/* I/O ports */
  89
  90#define MPU401C(mpu) (mpu)->cport
  91#define MPU401D(mpu) (mpu)->port
  92
  93/*
  94 * control register bits
  95 */
  96/* read MPU401C() */
  97#define MPU401_RX_EMPTY         0x80
  98#define MPU401_TX_FULL          0x40
  99
 100/* write MPU401C() */
 101#define MPU401_RESET            0xff
 102#define MPU401_ENTER_UART       0x3f
 103
 104/* read MPU401D() */
 105#define MPU401_ACK              0xfe
 106
 107
 108/*
 109
 110 */
 111
 112irqreturn_t snd_mpu401_uart_interrupt(int irq, void *dev_id);
 113irqreturn_t snd_mpu401_uart_interrupt_tx(int irq, void *dev_id);
 114
 115int snd_mpu401_uart_new(struct snd_card *card,
 116                        int device,
 117                        unsigned short hardware,
 118                        unsigned long port,
 119                        unsigned int info_flags,
 120                        int irq,
 121                        struct snd_rawmidi ** rrawmidi);
 122
 123#endif /* __SOUND_MPU401_H */
 124