/*
 * Copyright 2012, Google Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *    * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *    * Redistributions in binary form must reproduce the above
 *      copyright notice, this list of conditions and the following
 *      disclaimer in the documentation and/or other materials provided
 *      with the distribution.
 *    * Neither the name of Google Inc. nor the names of its
 *      contributors may be used to endorse or promote products derived
 *      from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef MOSYS_LIB_ACPI_H__
#define MOSYS_LIB_ACPI_H__

/* Chrome OS ACPI stuff */
#define CHROMEOS_ACPI_PATH	"/sys/devices/platform/chromeos_acpi/"
#define CHROMEOS_HWID_MAXLEN	256
#define CHROMEOS_FRID_MAXLEN	256

/* Registers from ACPI 4.0 spec */
#define ACPI_EC_SC	0x66		/* ACPI command/status port */
#define ACPI_EC_DATA	0x62		/* ACPI data port */

/* bits 2 and 7 are ignored in ACPI 4.0 spec */
#define ACPI_EC_OBF	(1 << 0)	/* output buffer full */
#define ACPI_EC_IBF   	(1 << 1)	/* input buffer full */
#define ACPI_EC_CMD	(1 << 3)	/* byte in data reg is command byte */
#define ACPI_EC_BURST	(1 << 4)	/* EC in burst mode */
#define ACPI_EC_SCI_EVT	(1 << 5)	/* SCI event pending */
#define ACPI_EC_SMI_EVT	(1 << 6)	/* SMI event pending */

#define ACPI_RD_EC	0x80		/* read byte from EC address space */
#define ACPI_WR_EC	0x81		/* write a byte to EC address space */
#define ACPI_BE_EC	0x82		/* burst enable */
#define ACPI_BD_EC	0x83		/* burst disable */
#define ACPI_QR_EC	0x84		/* query EC */

/* forward declarations */
struct platform_intf;
struct sensor;
struct sensor_reading;

/*
 * acpi_get_frid - retrieve FRID and store in a newly allocated buffer
 *
 * @buf:	buffer to store hardware ID in
 *
 * returns length of hardware id to indicate success
 * returns <0 to indicate error
 */
extern int acpi_get_frid(char **buf);

/*
 * acpi_read_temp - read ACPI thermal_zone temperature
 *
 * @intf:	platform interface
 * @sensor:	sensor struct
 * @reading:	location to store reading
 *
 * returns 0 to indicate success
 * returns <0 to indicate failure
 */
extern int acpi_read_temp(struct platform_intf *intf, struct sensor *sensor,
                          struct sensor_reading *reading);

#endif /* MOSYS_LIB_ACPI_H__ */
