linux/sound/pci/lx6464es/lx_core.h
<<
>>
Prefs
   1/* -*- linux-c -*- *
   2 *
   3 * ALSA driver for the digigram lx6464es interface
   4 * low-level interface
   5 *
   6 * Copyright (c) 2009 Tim Blechmann <tim@klingt.org>
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; see the file COPYING.  If not, write to
  20 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  21 * Boston, MA 02111-1307, USA.
  22 *
  23 */
  24
  25#ifndef LX_CORE_H
  26#define LX_CORE_H
  27
  28#include <linux/interrupt.h>
  29
  30#include "lx_defs.h"
  31
  32#define REG_CRM_NUMBER          12
  33
  34struct lx6464es;
  35
  36/* low-level register access */
  37
  38/* dsp register access */
  39enum {
  40        eReg_BASE,
  41        eReg_CSM,
  42        eReg_CRM1,
  43        eReg_CRM2,
  44        eReg_CRM3,
  45        eReg_CRM4,
  46        eReg_CRM5,
  47        eReg_CRM6,
  48        eReg_CRM7,
  49        eReg_CRM8,
  50        eReg_CRM9,
  51        eReg_CRM10,
  52        eReg_CRM11,
  53        eReg_CRM12,
  54
  55        eReg_ICR,
  56        eReg_CVR,
  57        eReg_ISR,
  58        eReg_RXHTXH,
  59        eReg_RXMTXM,
  60        eReg_RHLTXL,
  61        eReg_RESETDSP,
  62
  63        eReg_CSUF,
  64        eReg_CSES,
  65        eReg_CRESMSB,
  66        eReg_CRESLSB,
  67        eReg_ADMACESMSB,
  68        eReg_ADMACESLSB,
  69        eReg_CONFES,
  70
  71        eMaxPortLx
  72};
  73
  74unsigned long lx_dsp_reg_read(struct lx6464es *chip, int port);
  75void lx_dsp_reg_write(struct lx6464es *chip, int port, unsigned data);
  76
  77/* plx register access */
  78enum {
  79    ePLX_PCICR,
  80
  81    ePLX_MBOX0,
  82    ePLX_MBOX1,
  83    ePLX_MBOX2,
  84    ePLX_MBOX3,
  85    ePLX_MBOX4,
  86    ePLX_MBOX5,
  87    ePLX_MBOX6,
  88    ePLX_MBOX7,
  89
  90    ePLX_L2PCIDB,
  91    ePLX_IRQCS,
  92    ePLX_CHIPSC,
  93
  94    eMaxPort
  95};
  96
  97unsigned long lx_plx_reg_read(struct lx6464es *chip, int port);
  98void lx_plx_reg_write(struct lx6464es *chip, int port, u32 data);
  99
 100/* rhm */
 101struct lx_rmh {
 102        u16     cmd_len;        /* length of the command to send (WORDs) */
 103        u16     stat_len;       /* length of the status received (WORDs) */
 104        u16     dsp_stat;       /* status type, RMP_SSIZE_XXX */
 105        u16     cmd_idx;        /* index of the command */
 106        u32     cmd[REG_CRM_NUMBER];
 107        u32     stat[REG_CRM_NUMBER];
 108};
 109
 110
 111/* low-level dsp access */
 112int lx_dsp_get_version(struct lx6464es *chip, u32 *rdsp_version);
 113int lx_dsp_get_clock_frequency(struct lx6464es *chip, u32 *rfreq);
 114int lx_dsp_set_granularity(struct lx6464es *chip, u32 gran);
 115int lx_dsp_read_async_events(struct lx6464es *chip, u32 *data);
 116int lx_dsp_get_mac(struct lx6464es *chip);
 117
 118
 119/* low-level pipe handling */
 120int lx_pipe_allocate(struct lx6464es *chip, u32 pipe, int is_capture,
 121                     int channels);
 122int lx_pipe_release(struct lx6464es *chip, u32 pipe, int is_capture);
 123int lx_pipe_sample_count(struct lx6464es *chip, u32 pipe, int is_capture,
 124                         u64 *rsample_count);
 125int lx_pipe_state(struct lx6464es *chip, u32 pipe, int is_capture, u16 *rstate);
 126int lx_pipe_stop(struct lx6464es *chip, u32 pipe, int is_capture);
 127int lx_pipe_start(struct lx6464es *chip, u32 pipe, int is_capture);
 128int lx_pipe_pause(struct lx6464es *chip, u32 pipe, int is_capture);
 129
 130int lx_pipe_wait_for_start(struct lx6464es *chip, u32 pipe, int is_capture);
 131int lx_pipe_wait_for_idle(struct lx6464es *chip, u32 pipe, int is_capture);
 132
 133/* low-level stream handling */
 134int lx_stream_set_format(struct lx6464es *chip, struct snd_pcm_runtime *runtime,
 135                         u32 pipe, int is_capture);
 136int lx_stream_state(struct lx6464es *chip, u32 pipe, int is_capture,
 137                    int *rstate);
 138int lx_stream_sample_position(struct lx6464es *chip, u32 pipe, int is_capture,
 139                              u64 *r_bytepos);
 140
 141int lx_stream_set_state(struct lx6464es *chip, u32 pipe,
 142                        int is_capture, enum stream_state_t state);
 143
 144static inline int lx_stream_start(struct lx6464es *chip, u32 pipe,
 145                                  int is_capture)
 146{
 147        snd_printdd("->lx_stream_start\n");
 148        return lx_stream_set_state(chip, pipe, is_capture, SSTATE_RUN);
 149}
 150
 151static inline int lx_stream_pause(struct lx6464es *chip, u32 pipe,
 152                                  int is_capture)
 153{
 154        snd_printdd("->lx_stream_pause\n");
 155        return lx_stream_set_state(chip, pipe, is_capture, SSTATE_PAUSE);
 156}
 157
 158static inline int lx_stream_stop(struct lx6464es *chip, u32 pipe,
 159                                 int is_capture)
 160{
 161        snd_printdd("->lx_stream_stop\n");
 162        return lx_stream_set_state(chip, pipe, is_capture, SSTATE_STOP);
 163}
 164
 165/* low-level buffer handling */
 166int lx_buffer_ask(struct lx6464es *chip, u32 pipe, int is_capture,
 167                  u32 *r_needed, u32 *r_freed, u32 *size_array);
 168int lx_buffer_give(struct lx6464es *chip, u32 pipe, int is_capture,
 169                   u32 buffer_size, u32 buf_address_lo, u32 buf_address_hi,
 170                   u32 *r_buffer_index);
 171int lx_buffer_free(struct lx6464es *chip, u32 pipe, int is_capture,
 172                   u32 *r_buffer_size);
 173int lx_buffer_cancel(struct lx6464es *chip, u32 pipe, int is_capture,
 174                     u32 buffer_index);
 175
 176/* low-level gain/peak handling */
 177int lx_level_unmute(struct lx6464es *chip, int is_capture, int unmute);
 178int lx_level_peaks(struct lx6464es *chip, int is_capture, int channels,
 179                   u32 *r_levels);
 180
 181
 182/* interrupt handling */
 183irqreturn_t lx_interrupt(int irq, void *dev_id);
 184irqreturn_t lx_threaded_irq(int irq, void *dev_id);
 185void lx_irq_enable(struct lx6464es *chip);
 186void lx_irq_disable(struct lx6464es *chip);
 187
 188
 189/* Stream Format Header Defines (for LIN and IEEE754) */
 190#define HEADER_FMT_BASE         HEADER_FMT_BASE_LIN
 191#define HEADER_FMT_BASE_LIN     0xFED00000
 192#define HEADER_FMT_BASE_FLOAT   0xFAD00000
 193#define HEADER_FMT_MONO         0x00000080 /* bit 23 in header_lo. WARNING: old
 194                                            * bit 22 is ignored in float
 195                                            * format */
 196#define HEADER_FMT_INTEL        0x00008000
 197#define HEADER_FMT_16BITS       0x00002000
 198#define HEADER_FMT_24BITS       0x00004000
 199#define HEADER_FMT_UPTO11       0x00000200 /* frequency is less or equ. to 11k.
 200                                            * */
 201#define HEADER_FMT_UPTO32       0x00000100 /* frequency is over 11k and less
 202                                            * then 32k.*/
 203
 204
 205#define BIT_FMP_HEADER          23
 206#define BIT_FMP_SD              22
 207#define BIT_FMP_MULTICHANNEL    19
 208
 209#define START_STATE             1
 210#define PAUSE_STATE             0
 211
 212
 213
 214
 215
 216/* from PcxAll_e.h */
 217/* Start/Pause condition for pipes (PCXStartPipe, PCXPausePipe) */
 218#define START_PAUSE_IMMEDIATE           0
 219#define START_PAUSE_ON_SYNCHRO          1
 220#define START_PAUSE_ON_TIME_CODE        2
 221
 222
 223/* Pipe / Stream state */
 224#define START_STATE             1
 225#define PAUSE_STATE             0
 226
 227static inline void unpack_pointer(dma_addr_t ptr, u32 *r_low, u32 *r_high)
 228{
 229        *r_low = (u32)(ptr & 0xffffffff);
 230#if BITS_PER_LONG == 32
 231        *r_high = 0;
 232#else
 233        *r_high = (u32)((u64)ptr>>32);
 234#endif
 235}
 236
 237#endif /* LX_CORE_H */
 238