dahdi-linux/drivers/dahdi/voicebus/vpmoct.h
Russ Meyerriecks f2c0bcd0f2 wcte12xp, wctdm24xxp: Load VPMOCT032 firmware in background.
The firmware load has been moved into a workqueue to prevent the module load
from blocking for the duration of the firmware upload. This could be up to 40
seconds. Driver prevents configuration until firmware load is finished and
is_initialized() returns true.

Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
Signed-off-by: Shaun Ruffell <sruffell@digium.com>

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@9998 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2011-06-28 22:29:00 +00:00

111 lines
2.7 KiB
C

/*
* VPMOCT Driver.
*
* Written by Russ Meyerriecks <rmeyerriecks@digium.com>
*
* Copyright (C) 2010-2011 Digium, Inc.
*
* All rights reserved.
*
*/
/*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2 as published by the
* Free Software Foundation. See the LICENSE file included with
* this program for more details.
*/
#ifndef _VPMOCT_H
#define _VPMOCT_H
#include <linux/list.h>
#include <linux/pci.h>
#include <linux/timer.h>
#include "dahdi/kernel.h"
#include <stdbool.h>
#define VPMOCT_FIRM_HEADER_LEN 32
#define VPMOCT_BOOT_RAM_LEN 128
#define VPMOCT_FLASH_BUF_SECTIONS 4
#define VPMOCT_MAX_CHUNK 7
/* Bootloader commands */
#define VPMOCT_BOOT_FLASH_ERASE 0x01
#define VPMOCT_BOOT_FLASH_COPY 0x02
#define VPMOCT_BOOT_IMAGE_VALIDATE 0x06
#define VPMOCT_BOOT_REBOOT 0x07
#define VPMOCT_BOOT_DECRYPT 0x08
#define VPMOCT_BOOT_FLASHLOAD 0x10
/* Dual use registers */
#define VPMOCT_IDENT 0x00
#define VPMOCT_MAJOR 0x0a
#define VPMOCT_MINOR 0x0b
#define VPMOCT_SERIAL 0x90
#define VPMOCT_SERIAL_SIZE 32
/* Bootloader registers */
#define VPMOCT_BOOT_ERROR 0x0c
#define VPMOCT_BOOT_STATUS 0x10
#define VPMOCT_BOOT_CMD 0x11
#define VPMOCT_BOOT_LEN 0x14
#define VPMOCT_BOOT_ADDRESS1 0x18
#define VPMOCT_BOOT_ADDRESS2 0x1c
#define VPMOCT_BOOT_RAM 0x20
enum vpmoct_mode { UNKNOWN = 0, APPLICATION, BOOTLOADER };
struct vpmoct {
struct list_head pending_list;
struct list_head active_list;
spinlock_t list_lock;
struct mutex mutex;
enum vpmoct_mode mode;
struct device *dev;
u32 companding;
u32 echo;
unsigned int preecho_enabled:1;
unsigned int echo_update_active:1;
unsigned int companding_update_active:1;
u8 preecho_timeslot;
u8 preecho_buf[8];
u8 major;
u8 minor;
};
struct vpmoct_cmd {
struct list_head node;
u8 address;
u8 data[VPMOCT_MAX_CHUNK];
u8 command;
u8 chunksize;
u8 txident;
struct completion complete;
};
static inline bool is_vpmoct_cmd_read(const struct vpmoct_cmd *cmd)
{
return (0x60 == (cmd->command & 0xf0));
}
struct vpmoct *vpmoct_alloc(void);
void vpmoct_free(struct vpmoct *vpm);
typedef void (*load_complete_func_t)(struct device *dev, bool operational);
int vpmoct_init(struct vpmoct *vpm, load_complete_func_t load_complete);
int vpmoct_echocan_create(struct vpmoct *vpm,
int channo,
int companding);
void vpmoct_echocan_free(struct vpmoct *vpm,
int channo);
int vpmoct_preecho_enable(struct vpmoct *vpm, int channo);
int vpmoct_preecho_disable(struct vpmoct *vpm, int channo);
#endif