#include <rtl_conf.h>

#if DEVICE_SA1100_SERIAL
#include <arch/serial.h>
#include <rtl_posixio.h>
#include <rtl_devices.h>
#include <rtl_sync.h>

#if CONFIG_ARM_SA1100
#include <asm/arch/SA-1100.h>
#endif
#if CONFIG_ARM_SA1100
#include <asm/arch/pxa-regs.h>
#endif


//////////////////////////////////
//// POSIX TERMINAL FUNCTIONS ////
//////////////////////////////////

// RT_TTY_MAJOR defines the major number used by this device
#define RT_TTY_MAJOR 21

static void output_byte_serial(char byte)
{
   //wait for room in the fifo.
   unsigned long s;   
   rtl_no_interrupts(s);
   while((SERIAL_UTSR0 & UTSR0_TX_HALF_EMPTY) == 0);

   SERIAL_UTDR = byte;
   rtl_restore_interrupts(s);
};

static void output_string_serial(char *ptr) 
{
 while (*ptr) {
   output_byte_serial(*ptr);
   ptr++;
 };
 output_byte_serial(10);
 output_byte_serial(13);
 
};



static ssize_t tty_read (struct rtl_file *file, char *buffer, size_t size, 
		         loff_t *s){
  return size;
}


static ssize_t tty_write (struct rtl_file *file, const char *buffer, 
		          size_t size, loff_t *s){
  
  output_string_serial(buffer);
  
  return (ssize_t) 0;  
}

static int tty_open (struct rtl_file *file){
  return 0;
}

static int tty_release (struct rtl_file *file){
  return 0;
}

static struct rtl_file_operations rtl_tty_fops = {
  NULL,
  tty_read,
  tty_write,
  NULL,
  NULL,
  tty_open,
  tty_release
};

/////////////////////////////////////////////////////

int init_sa1100_serial(void){

  if (rtl_register_chrdev (SA1100_SERIAL_MAJOR, "sa1100_serial", &rtl_tty_fops)) {
//    return -EIO;
      return -5;
  }
  return 0;
}

void cleanup_sa1100_serial(void){
  rtl_unregister_chrdev(SA1100_SERIAL_MAJOR, "sa1100_serial");
}
#endif
