162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _LINUX_OLPC_EC_H 362306a36Sopenharmony_ci#define _LINUX_OLPC_EC_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/bits.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci/* XO-1 EC commands */ 862306a36Sopenharmony_ci#define EC_FIRMWARE_REV 0x08 962306a36Sopenharmony_ci#define EC_WRITE_SCI_MASK 0x1b 1062306a36Sopenharmony_ci#define EC_WAKE_UP_WLAN 0x24 1162306a36Sopenharmony_ci#define EC_WLAN_LEAVE_RESET 0x25 1262306a36Sopenharmony_ci#define EC_DCON_POWER_MODE 0x26 1362306a36Sopenharmony_ci#define EC_READ_EB_MODE 0x2a 1462306a36Sopenharmony_ci#define EC_SET_SCI_INHIBIT 0x32 1562306a36Sopenharmony_ci#define EC_SET_SCI_INHIBIT_RELEASE 0x34 1662306a36Sopenharmony_ci#define EC_WLAN_ENTER_RESET 0x35 1762306a36Sopenharmony_ci#define EC_WRITE_EXT_SCI_MASK 0x38 1862306a36Sopenharmony_ci#define EC_SCI_QUERY 0x84 1962306a36Sopenharmony_ci#define EC_EXT_SCI_QUERY 0x85 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci/* SCI source values */ 2262306a36Sopenharmony_ci#define EC_SCI_SRC_GAME BIT(0) 2362306a36Sopenharmony_ci#define EC_SCI_SRC_BATTERY BIT(1) 2462306a36Sopenharmony_ci#define EC_SCI_SRC_BATSOC BIT(2) 2562306a36Sopenharmony_ci#define EC_SCI_SRC_BATERR BIT(3) 2662306a36Sopenharmony_ci#define EC_SCI_SRC_EBOOK BIT(4) /* XO-1 only */ 2762306a36Sopenharmony_ci#define EC_SCI_SRC_WLAN BIT(5) /* XO-1 only */ 2862306a36Sopenharmony_ci#define EC_SCI_SRC_ACPWR BIT(6) 2962306a36Sopenharmony_ci#define EC_SCI_SRC_BATCRIT BIT(7) 3062306a36Sopenharmony_ci#define EC_SCI_SRC_GPWAKE BIT(8) /* XO-1.5 only */ 3162306a36Sopenharmony_ci#define EC_SCI_SRC_ALL GENMASK(8, 0) 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistruct platform_device; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistruct olpc_ec_driver { 3662306a36Sopenharmony_ci int (*suspend)(struct platform_device *); 3762306a36Sopenharmony_ci int (*resume)(struct platform_device *); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci int (*ec_cmd)(u8, u8 *, size_t, u8 *, size_t, void *); 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci bool wakeup_available; 4262306a36Sopenharmony_ci}; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#ifdef CONFIG_OLPC_EC 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ciextern void olpc_ec_driver_register(struct olpc_ec_driver *drv, void *arg); 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ciextern int olpc_ec_cmd(u8 cmd, u8 *inbuf, size_t inlen, u8 *outbuf, 4962306a36Sopenharmony_ci size_t outlen); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ciextern void olpc_ec_wakeup_set(u16 value); 5262306a36Sopenharmony_ciextern void olpc_ec_wakeup_clear(u16 value); 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ciextern int olpc_ec_mask_write(u16 bits); 5562306a36Sopenharmony_ciextern int olpc_ec_sci_query(u16 *sci_value); 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ciextern bool olpc_ec_wakeup_available(void); 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ciasmlinkage int xo1_do_sleep(u8 sleep_state); 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#else 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistatic inline int olpc_ec_cmd(u8 cmd, u8 *inbuf, size_t inlen, u8 *outbuf, 6462306a36Sopenharmony_ci size_t outlen) { return -ENODEV; } 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistatic inline void olpc_ec_wakeup_set(u16 value) { } 6762306a36Sopenharmony_cistatic inline void olpc_ec_wakeup_clear(u16 value) { } 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cistatic inline bool olpc_ec_wakeup_available(void) 7062306a36Sopenharmony_ci{ 7162306a36Sopenharmony_ci return false; 7262306a36Sopenharmony_ci} 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#endif /* CONFIG_OLPC_EC */ 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci#endif /* _LINUX_OLPC_EC_H */ 77