/****************************************************************************

   Copyright Echo Digital Audio Corporation (c) 1998 - 2004
   All rights reserved
   www.echoaudio.com

   This file is part of Echo Digital Audio's generic driver library.

   Echo Digital Audio's generic driver library 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.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330, Boston,
   MA  02111-1307, USA.

   *************************************************************************

 Translation from C++ and adaptation for use in ALSA-Driver
 were made by Giuliano Pochini <pochini@shiny.it>

****************************************************************************/

static int load_asic(struct echoaudio *chip);
static int dsp_set_digital_mode(struct echoaudio *chip, u8 mode);
static int set_digital_mode(struct echoaudio *chip, u8 mode);
static int check_asic_status(struct echoaudio *chip);
static int set_sample_rate(struct echoaudio *chip, u32 rate);
static int set_input_clock(struct echoaudio *chip, u16 clock);
static int set_professional_spdif(struct echoaudio *chip, char prof);
static int set_phantom_power(struct echoaudio *chip, char on);
static int write_control_reg(struct echoaudio *chip, u32 ctl, u32 frq,
			     char force);

#include <linux/interrupt.h>

static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
{
	int err;

	local_irq_enable();
	if (snd_BUG_ON((subdevice_id & 0xfff0) != ECHO3G))
		return -ENODEV;

	if ((err = init_dsp_comm_page(chip))) {
		dev_err(chip->card->dev,
			"init_hw - could not initialize DSP comm page\n");
		return err;
	}

	chip->comm_page->e3g_frq_register =
		cpu_to_le32((E3G_MAGIC_NUMBER / 48000) - 2);
	chip->device_id = device_id;
	chip->subdevice_id = subdevice_id;
	chip->bad_board = true;
	chip->has_midi = true;
	chip->dsp_code_to_load = FW_ECHO3G_DSP;

	/* Load the DSP code and the ASIC on the PCI card and get
	what type of external box is attached */
	err = load_firmware(chip);

	if (err < 0) {
		return err;
	} else if (err == E3G_GINA3G_BOX_TYPE) {
		chip->input_clock_types =	ECHO_CLOCK_BIT_INTERNAL |
						ECHO_CLOCK_BIT_SPDIF |
						ECHO_CLOCK_BIT_ADAT;
		chip->card_name = "Gina3G";
		chip->px_digital_out = chip->bx_digital_out = 6;
		chip->px_analog_in = chip->bx_analog_in = 14;
		chip->px_digital_in = chip->bx_digital_in = 16;
		chip->px_num = chip->bx_num = 24;
		chip->has_phantom_power = true;
		chip->hasnt_input_nominal_level = true;
	} else if (err == E3G_LAYLA3G_BOX_TYPE) {
		chip->input_clock_types =	ECHO_CLOCK_BIT_INTERNAL |
						ECHO_CLOCK_BIT_SPDIF |
						ECHO_CLOCK_BIT_ADAT |
						ECHO_CLOCK_BIT_WORD;
		chip->card_name = "Layla3G";
		chip->px_digital_out = chip->bx_digital_out = 8;
		chip->px_analog_in = chip->bx_analog_in = 16;
		chip->px_digital_in = chip->bx_digital_in = 24;
		chip->px_num = chip->bx_num = 32;
	} else {
		return -ENODEV;
	}

	chip->digital_modes =	ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA |
				ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL |
				ECHOCAPS_HAS_DIGITAL_MODE_ADAT;

	return err;
}



static int set_mixer_defaults(struct echoaudio *chip)
{
	chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
	chip->professional_spdif = false;
	chip->non_audio_spdif = false;
	chip->bad_board = false;
	chip->phantom_power = false;
	return init_line_levels(chip);
}



static int set_phantom_power(struct echoaudio *chip, char on)
{
	u32 control_reg = le32_to_cpu(chip->comm_page->control_register);

	if (on)
		control_reg |= E3G_PHANTOM_POWER;
	else
		control_reg &= ~E3G_PHANTOM_POWER;

	chip->phantom_power = on;
	return write_control_reg(chip, control_reg,
				 le32_to_cpu(chip->comm_page->e3g_frq_register),
				 0);
}
