1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2392a325cSAndres Salomon #ifndef _LINUX_OLPC_EC_H
3392a325cSAndres Salomon #define _LINUX_OLPC_EC_H
4392a325cSAndres Salomon
58097548fSLubomir Rintel #include <linux/bits.h>
68097548fSLubomir Rintel
7392a325cSAndres Salomon /* XO-1 EC commands */
8392a325cSAndres Salomon #define EC_FIRMWARE_REV 0x08
9392a325cSAndres Salomon #define EC_WRITE_SCI_MASK 0x1b
10392a325cSAndres Salomon #define EC_WAKE_UP_WLAN 0x24
11392a325cSAndres Salomon #define EC_WLAN_LEAVE_RESET 0x25
1298d4f93cSJens Frederich #define EC_DCON_POWER_MODE 0x26
13392a325cSAndres Salomon #define EC_READ_EB_MODE 0x2a
14392a325cSAndres Salomon #define EC_SET_SCI_INHIBIT 0x32
15392a325cSAndres Salomon #define EC_SET_SCI_INHIBIT_RELEASE 0x34
16392a325cSAndres Salomon #define EC_WLAN_ENTER_RESET 0x35
17392a325cSAndres Salomon #define EC_WRITE_EXT_SCI_MASK 0x38
18392a325cSAndres Salomon #define EC_SCI_QUERY 0x84
19392a325cSAndres Salomon #define EC_EXT_SCI_QUERY 0x85
20392a325cSAndres Salomon
21ec9964b4SLubomir Rintel /* SCI source values */
228097548fSLubomir Rintel #define EC_SCI_SRC_GAME BIT(0)
238097548fSLubomir Rintel #define EC_SCI_SRC_BATTERY BIT(1)
248097548fSLubomir Rintel #define EC_SCI_SRC_BATSOC BIT(2)
258097548fSLubomir Rintel #define EC_SCI_SRC_BATERR BIT(3)
268097548fSLubomir Rintel #define EC_SCI_SRC_EBOOK BIT(4) /* XO-1 only */
278097548fSLubomir Rintel #define EC_SCI_SRC_WLAN BIT(5) /* XO-1 only */
288097548fSLubomir Rintel #define EC_SCI_SRC_ACPWR BIT(6)
298097548fSLubomir Rintel #define EC_SCI_SRC_BATCRIT BIT(7)
308097548fSLubomir Rintel #define EC_SCI_SRC_GPWAKE BIT(8) /* XO-1.5 only */
318097548fSLubomir Rintel #define EC_SCI_SRC_ALL GENMASK(8, 0)
32ec9964b4SLubomir Rintel
33ac250415SAndres Salomon struct platform_device;
34ac250415SAndres Salomon
353d26c20bSAndres Salomon struct olpc_ec_driver {
36ac250415SAndres Salomon int (*suspend)(struct platform_device *);
37ac250415SAndres Salomon int (*resume)(struct platform_device *);
38ac250415SAndres Salomon
393d26c20bSAndres Salomon int (*ec_cmd)(u8, u8 *, size_t, u8 *, size_t, void *);
40ec9964b4SLubomir Rintel
41ec9964b4SLubomir Rintel bool wakeup_available;
423d26c20bSAndres Salomon };
433d26c20bSAndres Salomon
440c3d931bSLubomir Rintel #ifdef CONFIG_OLPC_EC
45392a325cSAndres Salomon
463d26c20bSAndres Salomon extern void olpc_ec_driver_register(struct olpc_ec_driver *drv, void *arg);
473d26c20bSAndres Salomon
48392a325cSAndres Salomon extern int olpc_ec_cmd(u8 cmd, u8 *inbuf, size_t inlen, u8 *outbuf,
49392a325cSAndres Salomon size_t outlen);
50392a325cSAndres Salomon
51ec9964b4SLubomir Rintel extern void olpc_ec_wakeup_set(u16 value);
52ec9964b4SLubomir Rintel extern void olpc_ec_wakeup_clear(u16 value);
53ec9964b4SLubomir Rintel
54ec9964b4SLubomir Rintel extern int olpc_ec_mask_write(u16 bits);
55ec9964b4SLubomir Rintel extern int olpc_ec_sci_query(u16 *sci_value);
56ec9964b4SLubomir Rintel
57ec9964b4SLubomir Rintel extern bool olpc_ec_wakeup_available(void);
58ec9964b4SLubomir Rintel
59*454a3487SArnd Bergmann asmlinkage int xo1_do_sleep(u8 sleep_state);
60*454a3487SArnd Bergmann
61392a325cSAndres Salomon #else
62392a325cSAndres Salomon
olpc_ec_cmd(u8 cmd,u8 * inbuf,size_t inlen,u8 * outbuf,size_t outlen)63392a325cSAndres Salomon static inline int olpc_ec_cmd(u8 cmd, u8 *inbuf, size_t inlen, u8 *outbuf,
64392a325cSAndres Salomon size_t outlen) { return -ENODEV; }
65392a325cSAndres Salomon
olpc_ec_wakeup_set(u16 value)66ec9964b4SLubomir Rintel static inline void olpc_ec_wakeup_set(u16 value) { }
olpc_ec_wakeup_clear(u16 value)67ec9964b4SLubomir Rintel static inline void olpc_ec_wakeup_clear(u16 value) { }
68ec9964b4SLubomir Rintel
olpc_ec_wakeup_available(void)69ec9964b4SLubomir Rintel static inline bool olpc_ec_wakeup_available(void)
70ec9964b4SLubomir Rintel {
71ec9964b4SLubomir Rintel return false;
72ec9964b4SLubomir Rintel }
73ec9964b4SLubomir Rintel
740c3d931bSLubomir Rintel #endif /* CONFIG_OLPC_EC */
75392a325cSAndres Salomon
76392a325cSAndres Salomon #endif /* _LINUX_OLPC_EC_H */
77