/*
 * Purpose: Low level routines for AC97 based Envy24HT boards (mainly Envy24-PT).
 */
/*
 * This file is part of Open Sound System
 *
 * Copyright (C) 4Front Technologies 1996-2008.
 *
 * This software is released under the BSD license.
 * See the COPYING file included in the main directory of this source
 * distribution for the license terms and conditions
 */


#include "oss_envy24ht_cfg.h"

#include "spdif.h"
#include "envy24ht.h"

#define AKM_ADDRESS 0x10
#if 0
# define PRT_STATUS(v) outb(v&0xff, 0x378)
#else
# define PRT_STATUS(v)
#endif

#if 0
static unsigned char
i2c_read (envy24ht_devc * devc, unsigned char addr, unsigned char pos)
{
  int i;
  unsigned char data;
  oss_native_word flags;

  MUTEX_ENTER_IRQDISABLE (devc->low_mutex, flags);
  OUTB (devc->osdev, pos, devc->ccs_base + 0x11);	/* Offset */
  OUTB (devc->osdev, addr << 1, devc->ccs_base + 0x10);	/* Read address  */

  for (i = 0; i < 2000; i++)
    {
      unsigned char status = INB (devc->osdev, devc->ccs_base + 0x13);
      if (!(status & 1))
	break;

    }

  oss_udelay (1);
  data = INB (devc->osdev, devc->ccs_base + 0x12);
  MUTEX_EXIT_IRQRESTORE (devc->low_mutex, flags);

  return data;
}

static void
i2c_write (envy24ht_devc * devc, unsigned char addr, unsigned char pos,
	   unsigned char data)
{
  int i;
  oss_native_word flags;

  MUTEX_ENTER_IRQDISABLE (devc->low_mutex, flags);
  OUTB (devc->osdev, pos, devc->ccs_base + 0x11);	/* Offset */
  OUTB (devc->osdev, data, devc->ccs_base + 0x12);	/* Data */
  OUTB (devc->osdev, (addr << 1) | 1, devc->ccs_base + 0x10);	/* Write address  */

  for (i = 0; i < 2000; i++)
    {
      unsigned char status = INB (devc->osdev, devc->ccs_base + 0x13);
      if (!(status & 1))
	break;

    }
  MUTEX_EXIT_IRQRESTORE (devc->low_mutex, flags);
}
#endif

/*ARGSUSED*/ 
static void
init_cs8415a (envy24ht_devc * devc)
{
}

/*ARGSUSED*/ 
static void
init_wm8728 (envy24ht_devc * devc)
{

#if 0
  printk ("Regs=");
  for (i = 0; i < 0x18; i++)
    {
      PRT_STATUS (2);
      printk ("%02x ", i2c_read (devc, addr, i));
      PRT_STATUS (0);
    }
  printk ("\n");
#endif
}

static void
ac97_card_init (envy24ht_devc * devc)
{

  PRT_STATUS (0);
  PRT_STATUS (0x01);
  PRT_STATUS (0);

  OUTW (devc->osdev, 0x000f, devc->ccs_base + 0x14);	/* GPIO */

  oss_udelay (1000);

  devc->recsrc = 0;
  init_cs8415a (devc);
  init_wm8728 (devc);
}

/*ARGSUSED*/ 
static int
ac97_mixer_init (envy24ht_devc * devc, int dev, int group)
{
  return 0;
}

#if 0
static int
ac97_private1 (envy24ht_devc * devc, int value)
{
  i2c_write (devc, AKM_ADDRESS, (value >> 8) & 0xff, value & 0xff);
  return 0;
}
#endif

envy24ht_auxdrv_t envy24ht_ac97_auxdrv = {
  ac97_card_init,
  ac97_mixer_init
};
