/*
 * This file is part of the coreboot project.
 *
 * Copyright (C) 2011-2012 The Chromium OS Authors. All rights reserved.
 *
 * This program 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; version 2 of the License.
 *
 * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

/*
 * The mainboard must define a PNOT method to handle power
 * state notifications and Notify CPU device objects to
 * re-evaluate their _PPC and _CST tables.
 */

Device (EC0)
{
	Name (_HID, EISAID ("PNP0C09"))
	Name (_UID, 1)
	Name (_GPE, EC_SCI)	// GPE for Runtime SCI

	OperationRegion (ERAM, EmbeddedControl, 0x00, 0xff)
	Field (ERAM, ByteAcc, Lock, Preserve)
	{
		// EC Name Space Configuration
		Offset(0x00),
		, 1,            // Reserved                              ; 00h.0
		LCDS, 1,        // 1= BACKLIGHT ON , 0= BACKLIGHT OFF    ; 00h.1
			, 6,        // Reserved                              ; 00h.2 ~ 00h.6
		HTBN, 8,        // HOTKEY_BUTTON_NUMBER                  ; 01h For ABO Hot Key Function
		HTBT, 8,        // HOTKEY_BUTTON_TYPE                    ; 02h For ABO Hot Key Function
		LMEN, 1,        // Launch Manager enable .(1=Enable )    ; 03h.0, Lauanch manage
		, 7,            // Reserved                              ; 03h.1 ~ 03h.7
		ADAP, 2,        // Adaptor Type                          ; 04h.0 ~ 1
		                // 0x00 = default(65w)
		                // 0x01 = 65w
		                // 0x02 = 90w
		                // 0x03 = 120w
		, 6,            // Reserved                             ; 04h.2 ~ 04h.7
		Offset(0x08),   // Project Common Name space definition ; 08h - 2Ch
		Offset(0x2D),
		DSPM, 1,        // Display Mode.(0=dGPU, 1=iGPU )       ; 2Dh.0
		Offset(0x2E),
		EFP1, 4,        // Turbo Off P-State                    ; 2Eh.3-0
		Offset(0x40),   // ABO Common Name space definition     ; 2F - 5Ch
		Offset(0x5D),
		ENIB, 16,       // Ext_NameSpace_Index                  ; 5Dh
		                // Ext_NameSpace_Bank                   ; 5Eh
		ENDD, 8,        // Ext_NameSpace_Data                   ; 5Fh
		Offset(0x60),
		SMPR, 8,        // SMBus protocol register              ; 60h
		SMST, 8,        // SMBus status register                ; 61h
		SMAD, 8,        // SMBus address register               ; 62h
		SMCM, 8,        // SMBus command register               ; 63h
		SMD0, 0x100,    // SMBus data regs (32)                 ; 64h - 83h
		BCNT, 8,        // SMBus Block Count                    ; 84h
		SMAA, 24,       // SMBus Alarm Address                  ; 85h - 87h
		Offset(0x90),
		BMFN, 72,       // Battery Manufacture name             ; 90h - 98h
		BATD, 56,       // Battery Device name                  ; 99h - 9fh
		Offset(0xA1),
		, 1,            // Reserve                              ; A1h.0
		VIDO, 1,        // Video Out Button (1=Pressed)         ; A1h.1
		TOUP, 1,        // Touch Pad Button (0=On, 1=Off)       ; A1h.2
		Offset(0xA2),
		ODTS, 8,        // OS Shutdown Temp2 (DTS)              ; A2h
		Offset(0xA3),
		OSTY, 3,        // OSTYPE :   000- XP                   ; A3h.0-2
		                //            001- Vista
		                //            010- Linux
		                //            011- Win7
		, 4,            // Reserve                              ; A3h.3-6
		ADPT, 1,        // AC Adapter (0=OffLine, 1=OnLine)     ; A3h.7
		Offset(0xA4),
		PWAK, 1,        // PME Wake Enable(0=Disable, 1=Enable) ; A4h.0
		MWAK, 1,        // Modem Wake Enable(0/1=Disable/Enable); A4h.1
		LWAK, 1,        // LAN Wake Enable (0=Disable, 1=Enable); A4h.2
		RWAK, 1,        // RTC Wake Enable(0=DIsable,1=Enable)  ; A4h.3
		WWAK, 1,        // WLAN wake Enable (0=Disable,1=Enable); A4h.4
		UWAK, 1,        // USB WAKE(0=Disable, 1=Enable)        ; A4h.5
		KWAK, 1,        // Keyboard WAKE(0=Disable,1=Enable)    ; A4h.6
		TWAK, 1,        // TouchPad WAKE(0=Disable,1=Enable)    ; A4h.7
		Offset(0xA5),
		CCAC, 1,        // Charge Current (1=AC OFF)            ; A5h.0
		AOAC, 1,        // Adapter OVP (1=AC OFF)               ; A5h.1
		BLAC, 1,        // Batt learning (1=AC OFF)             ; A5h.2
		PSRC, 1,        // Command (1=AC OFF)                   ; A5h.3
		BOAC, 1,        // Batt OVP (1=AC OFF)                  ; A5h.4
		LCAC, 1,        // Leak Current (1=AC OFF)              ; A5h.5
		AAAC, 1,        // Air Adapter (1=AC OFF)               ; A5h.6
		ACAC, 1,        // AC Off (1=AC OFF)                    ; A5h.7
		Offset(0xA6),
		S3ST, 1,        // System entry S3 State                : A6.0
		S3RM, 1,        // System resume from S3 State          : A6.1
		S4ST, 1,        // System entry S4 State                : A6.2
		S4RM, 1,        // System resume from S4 State          : A6.3
		S5ST, 1,        // System entry S4 State                : A6.4
		S5RM, 1,        // System resume from S4 State          : A6.5
		, 2,            // Reserve                              ; A6h.6-7
		Offset(0xA7),
		OSTT, 8,        // OS Throttling Temp                   ; A7h
		OSST, 8,        // OS Shutdown Temp                     ; A8h
		THLT, 8,        // Throttling Temp                      ; A9h
		TCNL, 8,        // Tcontrol Temp                        ; AAh
		MODE, 1,        // Mode(0=Local, 1=Remote)              ; ABh.0
		, 2,            // Reserve                              ; ABh.1-2
		INIT, 1,        // INITOK(0/1=Controlled by OS/EC)      ; ABh.3
		FAN1, 1,        // FAN1 Active                          ; ABh.4
		FAN2, 1,        // FAN2 Active                          ; ABh.5
		FANT, 1,        // FAN Speed Time OK                    ; ABh.6
		SKNM, 1,        // Skin Mode (0/1=Skin Address 90/92)   ; ABh.7
		SDTM, 8,        // Shutdown Thermal Temperature         ; ACh
		FSSN, 4,        // Fan Speed Step Number                ; ADh.0-3
		                // 00 : Fan Off
		                // 01 : Fan On Speed 1
		                // 10 : Fan On Speed 2
		                // 11 : Fan On Speed 3
		FANU, 4,        // Machine Fan's number                 ; ADh.4-7
		PCVL, 4,        // Throttling Level                     ; AEh.0-3
		                // 0000 : Nothing
		                // 0001 : Clock throttling 12.5%
		                // 0010 : Clock throttling 25%
		                // 0011 : Clock throttling 37.5%
		                // 0100 : Clock throttling 50%
		, 2,            // Reserved                             ; AEh.4-5
		SWTO, 1,        // SW Throttling (1=Active)             ; AEh.6
		TTHR, 1,        // HW (THRM#) Throttling (1=Active)     ; AEh.7
		TTHM, 1,        // TS_THERMAL(1:Throttling for thermal) ; AFh.0
		THTL, 1,        // THROTTLING(1:Ctrl H/W throtting act) ; AFh.1
		, 2,            // Reserved                             ; AFh.2-3
		NPST, 4,        // Number of P-State level              ; AFh.4-7
		CTMP, 8,        // Current CPU Temperature              ; B0h
		CTML, 8,        // CPU local temperature                ; B1h
		SKTA, 8,        // Skin Temperature A                   ; B2h
		SKTB, 8,        // GPU Temperature                      ; B3h
		SKTC, 8,        // Skin Temperature C                   ; B4h
		, 8,            // Reserved                             ; B5h
		NTMP, 8,        // North Bridge Diode Temp              ; B6h
		Offset(0xB7),
		, 1,            // Reserved                             ; B7h.0
		SKEY, 1,        // Security key event                   ; B7h.1
		DIGM, 1,        // Digital Mode (1=Selected)            ; B7h.2
		CDLE, 1,        // CD lock mode enable                  ; B7h.3
		, 4,            // Reserved                             ; B7h.4-7
		, 1,            // Reserved                             ; B8h.0
		LIDF, 1,        // LID flag (1=Closed, 0=Opened)        ; B8h.1
		PMEE, 1,        // PME event (0=off, 1=On)              ; B8h.2
		PWBE, 1,        // Power button event (0=off, 1=On)     ; B8h.3
		RNGE, 1,        // Ring in event (0=off, 1=On)          ; B8h.4
		BTWE, 1,        // Bluetooth wake event (0=off, 1=On)   ; B8h.5
		, 2,            // Reserved                             ; B8h.6-7
		Offset(0xB9),
		BRTS, 8,        // Brightness Value                     ; B9h
		S35M, 1,        // S3.5 HotKey test mode                ; BAh.0
		S35S, 1,        // S3.5 function status                 ; BAh.1
		, 2,            // Reserved                             ; BAh.2-3
		FFEN, 1,        // IRST support bit (1= Support)        ; BAh.4
		FFST, 1,        // IRST status flag                     ; BAh.5
		, 2,            // Reserved                             ; BAh.6-7
		WLAT, 1,        // Wireless LAN (0=Inactive, 1=Active)  ; BBh.0
		BTAT, 1,        // BlueTooth (0=Inactive, 1=Active)     ; BBh.1
		WLEX, 1,        // Wireless LAN (0=Not Exist, 1=Exist)  ; BBh.2
		BTEX, 1,        // BlueTooth (0=Not Exist, 1=Exist)     ; BBh.3
		KLSW, 1,        // Kill Switch (0=Off, 1=On)            ; BBh.4
		WLOK, 1,        // Wireless LAN Initialize OK           ; BBh.5
		AT3G, 1,        // 3G (0=non-active, 1=active)          ; BBh.6
		EX3G, 1,        // 3G (0=Not Exist, 1=Exist)            ; BBh.7
		PJID, 8,        // Project ID                           ; BCh
		CPUJ, 3,        // CPU Type                             ; BDh.0-2
		                // 00, Tj85,
		                // 01, Tj90,
		                // 02, Tj100,
		                // 03, Tj105,
		                // 04 - 07, Reserved
		CPNM, 3,        // CPU Core number                      ; BDh.3-5
		                // 00, Single Core
		                // 01, Dual Core
		                // 02, Quad Core
		                // 03 - 07, Reserved
		GATY, 2,        // VGA Type                             ; BDh.6-7
		                // 00, UMA
		                // 01. Discrete
		                // 02 - 03, Reserved
		Offset(0xBE),
		BOL0, 1,        // Batt0 (0=OffLine, 1=OnLine)          ; BEh.0
		BOL1, 1,        // Batt1 (0=OffLine, 1=OnLine)          ; BEh.1
		, 2,            // Reserved                             ; BEh.2-3
		BCC0, 1,        // Batt0 be charging (1=Charging)       ; BEh.4
		BCC1, 1,        // Batt1 be charging (1=Charging)       ; BEh.5
		, 2,            // Reserved                             ; BEh.6-7
		BPU0, 1,        // Batt0 (1=PowerUp)                    ; BFh.0
		BPU1, 1,        // Batt1 (1=PowerUp)                    ; BFh.1
		, 2,            // Reserved                             ; BFh.2-3
		BOS0, 1,        // Batt0 (1=OnSMBUS)                    ; BFh.4
		BOS1, 1,        // Batt1 (1=OnSMBUS)                    ; BFh.5
		, 2,            // Reserved                             ; BFh.6-7
		Offset(0xC0),
		BTY0, 1,        // Batt Type (0=NiMh, 1=LiIon)          ; C0h.0
		BAM0, 1,        // Battery mode (0=mA, 1=mW)            ; C0h.1
		BAL0, 1,        // Low Battery                          ; C0h.2
		, 1,            // Reserved                             ; C0h.3
		BMF0, 3,        // Battery Manufacturer                 ; C0h.4-6
		                // 001 : Sanyo
		                // 010 : Sony
		                // 100 : Pansonic
		                // 101 : CPT
		, 1,            // Reserved                             ; C0h.7
		BST0, 8,        // Battery Status                       ; C1h
                        // Bit0 : Discharging
                        // Bit1 : Charging
                        // Bit2 : Discharg and Critical Low
		                // Bit3-7 : Reserved
		BRC0, 16,       // Batt Remaining Capacity              ; C2h, C3h
		BSN0, 16,       // Batt Serial Number                   ; C4h, C5h
		BPV0, 16,       // Batt Present Voltage                 ; C6h, C7h
		BDV0, 16,       // Batt Design Voltage                  ; C8h, C9h
		BDC0, 16,       // Batt Design Capacity                 ; CAh, CBh
		BFC0, 16,       // Batt Last Full Charge Capacity       ; CCh, CDh
		GAU0, 8,        // Batt Gasgauge                        ; CEh
		CYC0, 8,        // Batt Cycle Counter                   ; CFh
		BPC0, 16,       // Batt Current                         ; D0h, D1h
		BAC0, 16,       // Batt Average Current                 ; D2h, D3h
		BTW0, 8,        // Batt Comsuption                      ; D4h
		BVL0, 8,        // Batt Battery Volt                    ; D5h
		BTM0, 8,        // Batt Battery Temp                    ; D6h
		BAT0, 8,        // Batt Average Temp (Degree C)         ; D7h
		BCG0, 16,       // Batt charge current                  ; D8h, D9h
		BCT0, 8,        // Batt Current Temp Semple counter     ; DAh
		BCI0, 8,        // BATT CMD Index for read BATT(SMB)    ; DBh
		BCM0, 8,        // Count up to Communicate BATT         ; DCh
		BOT0, 8,        // Count up if BATT over Temp           ; DDh
		BSSB, 16,       // BATT Battery Status SMB              ; DEh, DFh
		BOV0, 8,        // BATT Over Voltage Count              ; E0h
		BCF0, 8,        // BATT Communication Fail Counter      ; E1h
		BAD0, 8,        // Battery Voltage of ADC               ; E2h
		BCV1, 16,       // Cell Voltage 1 (mV)                  ; E3h, E4h
		BCV2, 16,       // Cell Voltage 2 (mV)                  ; E5h, E6h
		BCV3, 16,       // Cell Voltage 3 (mV)                  ; E7h, E8h
		BCV4, 16,       // Cell Voltage 4 (mV)                  ; E9h, EAh
		Offset(0xF4),
		BMD0, 16,       // Manufacture Date                     ; F4h, F5h
		                // Batt Day	                            ; BIT[4:0] (Day)
		                // Batt Month                           ; BIT[9:5] (Month)
		                // Batt Year                            ; BIT[15:10] (Year)
		BACV, 16,       // Charging Voltage                     ; F6h, F7h
		BDN0, 8,        // Battery Cell Number                  ; F8h
		, 8             // Last byte for Reserved.
	}

	Method (_CRS, 0, NotSerialized)
	{
		Name (ECMD, ResourceTemplate()
		{
			IO (Decode16, 0x62, 0x62, 0, 1)
			IO (Decode16, 0x66, 0x66, 0, 1)
		})
		Return (ECMD)
	}

	Method (_REG, 2, NotSerialized)
	{
		// Initialize AC power state
		Store (ADPT, \PWRS)

		// Initialize LID switch state
		Store (GP15, \LIDS)

		// Force a read of CPU temperature
		Store (CTML, Local0)
	}


/*
 * EC Query Responses
 *
 * DTS temperature update    10h
 * Decrease brightness event 11h
 * Increase brightness event 12h
 * Cover lid open            15h
 * Cover lid close           16h
 * External device plugged   17h
 * External device removed   18h
 * Bluetooth wake up event   19h
 * Scr expand event          1Bh
 * Display toggle            1Ch
 * CPU  fast/slow event      1Dh
 * Battery in critical low   22h
 * Battery in low state      23h
 * Battery pack plug in      25h
 * Docking in                2Ah
 * Undock                    2Bh
 * Power button pressed      32h
 * AC plug in                37h
 * AC removed                38h
 * Modem ring in             3Ah
 * PME signal active         3Eh
 * Hotkey make Function      45h
 * Hotkey break Function     46h
 */

	// AC Power Connected
	Method (_Q37, 0, NotSerialized)
	{
		Store (One, \PWRS)
		Notify (AC, 0x80)
		Notify (BATX, 0x80)
		// TODO ADD CPU power profile
		\PNOT ()
	}

	// AC Power Removed
	Method (_Q38, 0, NotSerialized)
	{
		Store (Zero, \PWRS)
		Notify (AC, 0x80)
		Notify (BATX, 0x80)
		// TODO ADD CPU power profile
		\PNOT ()
	}

	// Battery at critical low state
	Method (_Q22, 0, NotSerialized)
	{
		Notify (BATX, 0x80)
	}

	// Battery insert
	Method(_Q25, 0, NotSerialized)
	{
		Notify(BATX, 0x81)
		Notify(BATX, 0x80)
	}

	// Commuation Device Disable/Enable Event
	Method(_Q60, 0, NotSerialized)
	{
		IF(WLEX) //if Wlan exist
		{
			//TODO Store(WLAT, LANE)
		}
	}

	#include "ac.asl"
	#include "battery.asl"
}
