1 /*-
2  * Copyright (c) 2006 Michael Lorenz
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
15  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
16  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
18  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24  * POSSIBILITY OF SUCH DAMAGE.
25  */
26 
27 #include <sys/cdefs.h>
28 __KERNEL_RCSID(0, "$NetBSD: pmuvar.h,v 1.11 2020/04/16 23:29:52 rin Exp $");
29 
30 #ifndef PMUVAR_H
31 #define PMUVAR_H
32 
33 /* PMU commands */
34 #define PMU_POWER_CTRL0                 0x10      /* control power of some devices */
35 #define PMU_POWER_CTRL                  0x11      /* control power of some devices */
36 
37 #define PMU_POWER_OFF                   0x7e      /* Turn Power off */
38 #define PMU_RESET_CPU                   0xd0      /* Reset CPU */
39 
40 #define PMU_SET_RTC           0x30      /* Set realtime clock */
41 #define PMU_READ_RTC                    0x38      /* Read realtime clock */
42 
43 #define PMU_WRITE_PRAM                  0x32      /* Write PRAM */
44 #define PMU_READ_PRAM                   0x3a      /* Read PRAM */
45 
46 #define PMU_WRITE_NVRAM                 0x33      /* Write NVRAM */
47 #define PMU_READ_NVRAM                  0x3b      /* Read NVRAM */
48 
49 #define PMU_EJECT_PCMCIA      0x4c      /* Eject PCMCIA slot */
50 
51 #define PMU_SET_BRIGHTNESS    0x41      /* Set backlight brightness */
52 #define PMU_READ_BRIGHTNESS   0xd9      /* Read brightness button position */
53 
54 #define PMU_POWER_EVENTS        0x8f    /* Send power-event commands to PMU */
55 #define PMU_SYSTEM_READY        0xdf    /* tell PMU we are awake */
56 
57 #define PMU_BATTERY_STATE     0x6b      /* Read old battery state */
58 #define PMU_SMART_BATTERY_STATE         0x6f      /* Read battery state */
59 
60 #define PMU_ADB_CMD           0x20      /* Send ADB packet */
61 #define PMU_ADB_POLL_OFF      0x21      /* Disable ADB auto-poll */
62 #define PMU_SET_VOL           0x40      /* Set volume button position */
63 #define PMU_GET_VOL           0x48      /* Get volume button position */
64 #define PMU_SET_IMASK                   0x70      /* Set interrupt mask */
65 #define PMU_INT_ACK           0x78      /* Read interrupt bits */
66 #define PMU_CPU_SPEED                   0x7d      /* Control CPU speed on some models */
67 #define PMU_SLEEP             0x7f      /* Put CPU to sleep */
68 #define PMU_SET_POLL_MASK     0x86      /*
69                                                    * 16bit mask enables autopolling per
70                                                    * device
71                                                    */
72 #define PMU_I2C_CMD           0x9a      /* i2c commands */
73 #define PMU_GET_LID_STATE     0xdc      /* Report lid state */
74 #define PMU_GET_VERSION                 0xea      /* Identify thyself */
75 #define PMU_SET_LED           0xee      /* control system LED */
76 
77 /* Bits in PMU interrupt and interrupt mask bytes */
78 #define PMU_INT_ADB_AUTO      0x04      /* ADB autopoll, when PMU_INT_ADB */
79 #define PMU_INT_PCEJECT                 0x04      /* PC-card eject buttons */
80 #define PMU_INT_SNDBRT                  0x08      /* sound/brightness up/down buttons */
81 #define PMU_INT_ADB           0x10      /* ADB autopoll or reply data */
82 #define PMU_INT_BATTERY                 0x20
83 #define PMU_INT_ENVIRONMENT   0x40
84 #define PMU_INT_TICK                    0x80      /* 1-second tick interrupt */
85 
86 /* Bits to use with the PMU_POWER_CTRL0 command */
87 #define PMU_POW0_ON           0x80      /* OR this to power ON the device */
88 #define PMU_POW0_OFF                    0x00      /* leave bit 7 to 0 to power it OFF */
89 #define PMU_POW0_HARD_DRIVE   0x04      /* wallstreet/lombard? */
90 #define PMU_POW0_MODEM                  0x08      /* pismo, maybe others */
91 
92 /* Bits to use with the PMU_POWER_CTRL command */
93 #define PMU_POW_ON            0x80      /* OR this to power ON the device */
94 #define PMU_POW_OFF           0x00      /* leave bit 7 to 0 to power it OFF */
95 #define PMU_POW_BACKLIGHT     0x01      /* backlight power */
96 #define PMU_POW_CHARGER                 0x02      /* battery charger power */
97 #define PMU_POW_IRLED                   0x04      /* IR led power (on wallstreet) */
98 #define PMU_POW_MEDIABAY      0x08      /* media bay power (wallstreet/lombard ?) */
99 
100 /* Bits from PMU_GET_LID_STATE or PMU_INT_ENVIRONMENT on core99 */
101 #define PMU_ENV_LID_CLOSED    0x01      /* The lid is closed */
102 #define PMU_ENV_POWER_BUTTON  0x08      /* power button on ADB-less Macs */
103 
104 /* PMU PMU_POWER_EVENTS commands */
105 enum {
106           PMU_PWR_GET_POWERUP_EVENTS      = 0x00,
107           PMU_PWR_SET_POWERUP_EVENTS      = 0x01,
108           PMU_PWR_CLR_POWERUP_EVENTS      = 0x02,
109           PMU_PWR_GET_WAKEUP_EVENTS       = 0x03,
110           PMU_PWR_SET_WAKEUP_EVENTS       = 0x04,
111           PMU_PWR_CLR_WAKEUP_EVENTS       = 0x05,
112 };
113 
114 /* PMU Power Information */
115 
116 #define PMU_PWR_AC_PRESENT    (1 << 0)
117 #define PMU_PWR_BATT_CHARGING (1 << 1)
118 #define PMU_PWR_BATT_PRESENT  (1 << 2)
119 #define PMU_PWR_BATT_FULL     (1 << 5)
120 #define PMU_PWR_PCHARGE_RESET (1 << 6)
121 #define PMU_PWR_BATT_EXIST    (1 << 7)
122 
123 
124 /* I2C related definitions */
125 #define PMU_I2C_MODE_SIMPLE   0
126 #define PMU_I2C_MODE_STDSUB   1
127 #define PMU_I2C_MODE_COMBINED 2
128 
129 #define PMU_I2C_BUS_STATUS    0
130 #define PMU_I2C_BUS_SYSCLK    1
131 #define PMU_I2C_BUS_POWER     2
132 
133 #define PMU_I2C_STATUS_OK     0
134 #define PMU_I2C_STATUS_DATAREAD         1
135 #define PMU_I2C_STATUS_BUSY   0xfe
136 
137 /* Power events wakeup bits */
138 enum {
139           PMU_PWR_WAKEUP_KEY            = 0x01, /* Wake on key press */
140           PMU_PWR_WAKEUP_AC_INSERT      = 0x02, /* Wake on AC adapter plug */
141           PMU_PWR_WAKEUP_AC_CHANGE      = 0x04,
142           PMU_PWR_WAKEUP_LID_OPEN                 = 0x08,
143           PMU_PWR_WAKEUP_RING           = 0x10,
144 };
145 
146 struct pmu_ops {
147           void *cookie;
148           int (*do_command)(void *, int, int, uint8_t *, int, uint8_t *);
149           void (*register_callback)(void *, void (*)(void *), void *);
150 };
151 
152 void pmu_poweroff(void);
153 void pmu_restart(void);
154 void pmu_modem(int);
155 
156 #endif /* PMUVAR_H */
157