/*
 * Carsten Langgaard, carstenl@mips.com
 * Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
 *
 * ########################################################################
 *
 *  This program is free software; you can distribute it and/or modify it
 *  under the terms of the GNU General Public License (Version 2) as
 *  published by the Free Software Foundation.
 *
 *  This program is distributed in the hope 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.
 *
 * ########################################################################
 *
 * This is the interface to the remote debugger stub.
 *
 */

#include <linux/config.h>
#include <linux/serialP.h>
#include <linux/serial_reg.h>

#include <asm/serial.h>
#include <asm/io.h>
#include <asm/hp-lj/asic.h>


int putDebugChar(char c);
char getDebugChar(void);


///////////////////////  andros values ///////////////////////////////////////////////////////
#define SERIAL_REG(offset) (*((volatile unsigned int*)(HPSR_BASE_ADDR|offset)))

// Register set base address
#define HPSR_BASE_ADDR   0xbfe00000UL

// Transmit / Receive Data
#define HPSR_DATA_OFFSET    0x00020010UL
// Transmit control / status
#define HPSR_TX_STAT_OFFSET 0x0002000CUL
// Receive status
#define HPSR_RX_STAT_OFFSET 0x00020008UL

#define HPSR_TX_STAT_READY  0x8UL
#define HPSR_RX_DATA_AVAIL  0x4UL


///////////////////////  harmony values ///////////////////////////////////////////////////////
// Transmit / Receive Data
#define H_HPSR_DATA_TX       *((volatile unsigned int*)0xbff65014)
// Transmit / Receive Data
#define H_HPSR_DATA_RX       *((volatile unsigned int*)0xbff65018)
// Status
#define H_HPSR_STAT          *((volatile unsigned int*)0xbff65004)

// harmony serial status bits
#define H_SER_STAT_TX_EMPTY       0x04
#define H_SER_STAT_RX_EMPTY       0x10




int putDebugChar(char c)
{
	if (GetAsicId() == HarmonyAsic) {
		while (!( ( (H_HPSR_STAT) & H_SER_STAT_TX_EMPTY) != 0));

		H_HPSR_DATA_TX = (unsigned int) c;

	} else if (GetAsicId() == AndrosAsic) {
        	while (((SERIAL_REG(HPSR_TX_STAT_OFFSET) & HPSR_TX_STAT_READY) == 0))
             		;
        	SERIAL_REG(HPSR_DATA_OFFSET) = (unsigned int) c;
        } 
	return 1;
}

char getDebugChar(void)
{
	if (GetAsicId() == HarmonyAsic) {
		while (!(((H_HPSR_STAT) & H_SER_STAT_RX_EMPTY) == 0));

	        return H_HPSR_DATA_RX;
        
	} else if (GetAsicId() == AndrosAsic) {
        	while ((SERIAL_REG(HPSR_RX_STAT_OFFSET) & HPSR_RX_DATA_AVAIL) == 0)
              		;

        	return (SERIAL_REG(HPSR_DATA_OFFSET));

	}
}