#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/io.h>

#include <asm/delay.h>

#include <asm/arch/ipaq.h>
#include <asm/arch/h4000-gpio.h>
//#include <linux/h3600_keyboard.h>
#include <asm/hardware/ipaq-asic3.h>

#define IPAQ_ASIC3_VIRT              H3900_ASIC3_VIRT

// Already defined in <asm/hardware/ipaq-asic3.h>
#define _IPAQ_ASIC3_LED_0_Base	0x700 // (Charger LED)
#define _IPAQ_ASIC3_LED_1_Base	0x800 // (Green LED used to make Amber on charge end)
//#define _IPAQ_ASIC3_LED_2_Base	0x900
//#define _IPAQ_ASIC3_LED_3_Base	0x500 
//#define _IPAQ_ASIC3_LED_4_Base	0x600 

static int h4000_led_init(void)
{

  int duty_time = 10;
  int cycle_time = 20;

  printk("%s: Initializing leds...\n", __FUNCTION__);

//  printk("%s: iPAQ ASIC3 Phisical Address...\n", __FUNCTION__, IPAQ_ASIC3_PHYS);

  printk("%s: iPAQ ASIC3 Virtual Address: %08x\n\n", __FUNCTION__, IPAQ_ASIC3_VIRT);


  // LED CRASH?
/*
  printk("%s: iPAQ ASIC3 Virtual ??? Address: %08x\n\n", __FUNCTION__, IPAQ_ASIC3_LED_TimeBase(IPAQ_ASIC3_VIRT,2) );
  IPAQ_ASIC3_LED_TimeBase(IPAQ_ASIC3_VIRT,2) = 0x6 | LEDTBS_BLINK;
  IPAQ_ASIC3_LED_PeriodTime(IPAQ_ASIC3_VIRT,2) = cycle_time;
  IPAQ_ASIC3_LED_DutyTime(IPAQ_ASIC3_VIRT,2) = 0;
  udelay(1);
  IPAQ_ASIC3_LED_DutyTime(IPAQ_ASIC3_VIRT,2) = duty_time;
*/

//                                                                
//  IPAQ_ASIC3_LED_1_TimeBase(IPAQ_ASIC3_VIRT) = 0x6 | LEDTBS_BLINK;
//  IPAQ_ASIC3_LED_1_PeriodTime(IPAQ_ASIC3_VIRT) = cycle_time;
//  IPAQ_ASIC3_LED_1_DutyTime(IPAQ_ASIC3_VIRT) = 0;
 
  // LED RED
/*  printk("%s: iPAQ ASIC3 Virtual RED Address: %08x\n\n", __FUNCTION__, IPAQ_ASIC3_LED_0_TimeBase(IPAQ_ASIC3_VIRT) );
  IPAQ_ASIC3_LED_0_TimeBase(IPAQ_ASIC3_VIRT) = 0x6 | LEDTBS_BLINK;
  IPAQ_ASIC3_LED_0_PeriodTime(IPAQ_ASIC3_VIRT) = cycle_time;
  IPAQ_ASIC3_LED_0_DutyTime(IPAQ_ASIC3_VIRT) = 0;
  udelay(1);
  IPAQ_ASIC3_LED_0_DutyTime(IPAQ_ASIC3_VIRT) = duty_time;
                                                                
  IPAQ_ASIC3_LED_1_TimeBase(IPAQ_ASIC3_VIRT) = 0x6 | LEDTBS_BLINK;
  IPAQ_ASIC3_LED_1_PeriodTime(IPAQ_ASIC3_VIRT) = cycle_time;
  IPAQ_ASIC3_LED_1_DutyTime(IPAQ_ASIC3_VIRT) = 0;
*/

  // GREEN LED
  IPAQ_ASIC3_LED_1_TimeBase(IPAQ_ASIC3_VIRT) = 0x6 | LEDTBS_BLINK;
  IPAQ_ASIC3_LED_1_PeriodTime(IPAQ_ASIC3_VIRT) = cycle_time;
  IPAQ_ASIC3_LED_1_DutyTime(IPAQ_ASIC3_VIRT) = 0;
  udelay(1);
  IPAQ_ASIC3_LED_1_DutyTime(IPAQ_ASIC3_VIRT) = duty_time;
                                                                           
  IPAQ_ASIC3_LED_0_TimeBase(IPAQ_ASIC3_VIRT) = 0x6 | LEDTBS_BLINK;
  IPAQ_ASIC3_LED_0_PeriodTime(IPAQ_ASIC3_VIRT) = cycle_time;
  IPAQ_ASIC3_LED_0_DutyTime(IPAQ_ASIC3_VIRT) = 0;
		
					    
  // YELLOW LED
/*  IPAQ_ASIC3_LED_1_TimeBase(IPAQ_ASIC3_VIRT) = 0x6 | LEDTBS_BLINK;
  IPAQ_ASIC3_LED_1_PeriodTime(IPAQ_ASIC3_VIRT) = cycle_time;
  IPAQ_ASIC3_LED_1_DutyTime(IPAQ_ASIC3_VIRT) = 0;
                                                                                                                            
  IPAQ_ASIC3_LED_0_TimeBase(IPAQ_ASIC3_VIRT) = 0x6 | LEDTBS_BLINK;
  IPAQ_ASIC3_LED_0_PeriodTime(IPAQ_ASIC3_VIRT) = cycle_time;
  IPAQ_ASIC3_LED_0_DutyTime(IPAQ_ASIC3_VIRT) = 0;
								                                                                                                                            
  udelay(1);
  IPAQ_ASIC3_LED_1_DutyTime(IPAQ_ASIC3_VIRT) = duty_time;
  IPAQ_ASIC3_LED_0_DutyTime(IPAQ_ASIC3_VIRT) = duty_time;
*/														
							    

  return 0;
}

static void h4000_led_exit(void)
{
  printk("%s: Exiting leds...\n", __FUNCTION__);
  // LED OFF
  IPAQ_ASIC3_LED_0_TimeBase(IPAQ_ASIC3_VIRT) = 0x6 | LEDTBS_BLINK;
  IPAQ_ASIC3_LED_0_PeriodTime(IPAQ_ASIC3_VIRT) = 1;
  IPAQ_ASIC3_LED_0_DutyTime(IPAQ_ASIC3_VIRT) = 0;
                                                                
  IPAQ_ASIC3_LED_1_TimeBase(IPAQ_ASIC3_VIRT) = 0x6 | LEDTBS_BLINK;
  IPAQ_ASIC3_LED_1_PeriodTime(IPAQ_ASIC3_VIRT) = 1;
  IPAQ_ASIC3_LED_1_DutyTime(IPAQ_ASIC3_VIRT) = 0;
}

module_init(h4000_led_init);
module_exit(h4000_led_exit);

MODULE_AUTHOR(" ");
MODULE_DESCRIPTION(" ");
MODULE_LICENSE("Dual BSD/GPL");

