/*
 * Line6 Linux USB driver - 0.9.0
 *
 * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
 *
 *	This program is free software; you can redistribute it and/or
 *	modify it under the terms of the GNU General Public License as
 *	published by the Free Software Foundation, version 2.
 *
 */

#ifndef POD_H
#define POD_H


#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/usb.h>
#include <linux/wait.h>

#include <sound/core.h>

#include "driver.h"
#include "dumprequest.h"


/*
	PODxt Live interfaces
*/
#define PODXTLIVE_INTERFACE_POD    0
#define PODXTLIVE_INTERFACE_VARIAX 1

/*
	Locate name in binary program dump
*/
#define	POD_NAME_OFFSET 0
#define	POD_NAME_LENGTH 16

/*
	Other constants
*/
#define POD_CONTROL_SIZE 0x80
#define POD_BUFSIZE_DUMPREQ 7
#define POD_STARTUP_DELAY 3000

/**
	Data structure for values that need to be requested explicitly.
	This is the case for system and tuner settings.
*/
struct ValueWait {
	int value;
	wait_queue_head_t wait;
};

/**
	Binary PODxt Pro program dump
*/
struct pod_program {
	/**
		Header information (including program name).
	*/
	unsigned char header[0x20];

	/**
		Program parameters.
	*/
	unsigned char control[POD_CONTROL_SIZE];
};

struct usb_line6_pod {
	/**
		Generic Line6 USB data.
	*/
	struct usb_line6 line6;

	/**
		Dump request structure.
	*/
	struct line6_dump_request dumpreq;

	/**
		Current program number.
	*/
	unsigned char channel_num;

	/**
		Current program settings.
	*/
	struct pod_program prog_data;

	/**
		Buffer for data retrieved from or to be stored on PODxt Pro.
	*/
	struct pod_program prog_data_buf;

	/**
		Tuner mute mode.
	*/
	struct ValueWait tuner_mute;

	/**
		Tuner base frequency (typically 440Hz).
	*/
	struct ValueWait tuner_freq;

	/**
		Note received from tuner.
	*/
	struct ValueWait tuner_note;

	/**
		Pitch value received from tuner.
	*/
	struct ValueWait tuner_pitch;

	/**
		Instrument monitor level.
	*/
	struct ValueWait monitor_level;

	/**
		Audio routing mode.
		0: send processed guitar
		1: send clean guitar
		2: send clean guitar re-amp playback
		3: send re-amp playback
	*/
	struct ValueWait routing;

	/**
		Wait for audio clipping event.
	*/
	struct ValueWait clipping;

	/**
		Timer for device initializaton.
	*/
	struct timer_list startup_timer;

	/**
		Work handler for device initializaton.
	*/
	struct work_struct startup_work;

	/**
		Current progress in startup procedure.
	*/
	int startup_progress;

	/**
		Dirty flags for access to parameter data.
	*/
	unsigned long param_dirty[POD_CONTROL_SIZE / sizeof(unsigned long)];

	/**
		Some atomic flags.
	*/
	unsigned long atomic_flags;

	/**
		Serial number of device.
	*/
	int serial_number;

	/**
		Firmware version (x 100).
	*/
	int firmware_version;

	/**
		Device ID.
	*/
	int device_id;

	/**
		Flag to indicate modification of current program settings.
	*/
	char dirty;

	/**
		Flag to enable MIDI postprocessing.
	*/
	char midi_postprocess;
};


extern void line6_pod_disconnect(struct usb_interface *interface);
extern int line6_pod_init(struct usb_interface *interface, struct usb_line6_pod *pod);
extern void line6_pod_midi_postprocess(struct usb_line6_pod *pod,
				       unsigned char *data, int length);
extern void line6_pod_process_message(struct usb_line6_pod *pod);
extern void line6_pod_transmit_parameter(struct usb_line6_pod *pod, int param,
					 int value);


#endif
