1 // SPDX-License-Identifier: GPL-2.0
3 * Device driver for the PMU in Apple PowerBooks and PowerMacs.
5 * The VIA (versatile interface adapter) interfaces to the PMU,
6 * a 6805 microprocessor core whose primary function is to control
7 * battery charging and system power on the PowerBook 3400 and 2400.
8 * The PMU also controls the ADB (Apple Desktop Bus) which connects
9 * to the keyboard and mouse, as well as the non-volatile RAM
10 * and the RTC (real time clock) chip.
12 * Copyright (C) 1998 Paul Mackerras and Fabio Riccardi.
13 * Copyright (C) 2001-2002 Benjamin Herrenschmidt
14 * Copyright (C) 2006-2007 Johannes Berg
16 * THIS DRIVER IS BECOMING A TOTAL MESS !
17 * - Cleanup atomically disabling reply to PMU events after
18 * a sleep or a freq. switch
21 #include <linux/stdarg.h>
22 #include <linux/mutex.h>
23 #include <linux/types.h>
24 #include <linux/errno.h>
25 #include <linux/kernel.h>
26 #include <linux/delay.h>
27 #include <linux/sched/signal.h>
28 #include <linux/miscdevice.h>
29 #include <linux/blkdev.h>
30 #include <linux/pci.h>
31 #include <linux/slab.h>
32 #include <linux/poll.h>
33 #include <linux/adb.h>
34 #include <linux/pmu.h>
35 #include <linux/cuda.h>
36 #include <linux/module.h>
37 #include <linux/spinlock.h>
39 #include <linux/proc_fs.h>
40 #include <linux/seq_file.h>
41 #include <linux/init.h>
42 #include <linux/interrupt.h>
43 #include <linux/device.h>
44 #include <linux/syscore_ops.h>
45 #include <linux/freezer.h>
46 #include <linux/syscalls.h>
47 #include <linux/suspend.h>
48 #include <linux/cpu.h>
49 #include <linux/compat.h>
50 #include <linux/of_address.h>
51 #include <linux/of_irq.h>
52 #include <linux/uaccess.h>
53 #include <linux/pgtable.h>
54 #include <asm/machdep.h>
56 #include <asm/sections.h>
58 #ifdef CONFIG_PPC_PMAC
59 #include <asm/pmac_feature.h>
60 #include <asm/pmac_pfunc.h>
61 #include <asm/pmac_low_i2c.h>
62 #include <asm/mmu_context.h>
63 #include <asm/cputable.h>
65 #include <asm/backlight.h>
67 #include <asm/macintosh.h>
68 #include <asm/macints.h>
69 #include <asm/mac_via.h>
72 #include "via-pmu-event.h"
74 /* Some compile options */
77 /* How many iterations between battery polls */
78 #define BATTERY_POLLING_COUNT 2
80 static DEFINE_MUTEX(pmu_info_proc_mutex);
82 /* VIA registers - spaced 0x200 bytes apart */
83 #define RS 0x200 /* skip between registers */
84 #define B 0 /* B-side data */
85 #define A RS /* A-side data */
86 #define DIRB (2*RS) /* B-side direction (1=output) */
87 #define DIRA (3*RS) /* A-side direction (1=output) */
88 #define T1CL (4*RS) /* Timer 1 ctr/latch (low 8 bits) */
89 #define T1CH (5*RS) /* Timer 1 counter (high 8 bits) */
90 #define T1LL (6*RS) /* Timer 1 latch (low 8 bits) */
91 #define T1LH (7*RS) /* Timer 1 latch (high 8 bits) */
92 #define T2CL (8*RS) /* Timer 2 ctr/latch (low 8 bits) */
93 #define T2CH (9*RS) /* Timer 2 counter (high 8 bits) */
94 #define SR (10*RS) /* Shift register */
95 #define ACR (11*RS) /* Auxiliary control register */
96 #define PCR (12*RS) /* Peripheral control register */
97 #define IFR (13*RS) /* Interrupt flag register */
98 #define IER (14*RS) /* Interrupt enable register */
99 #define ANH (15*RS) /* A-side data, no handshake */
101 /* Bits in B data register: both active low */
102 #ifdef CONFIG_PPC_PMAC
103 #define TACK 0x08 /* Transfer acknowledge (input) */
104 #define TREQ 0x10 /* Transfer request (output) */
111 #define SR_CTRL 0x1c /* Shift register control bits */
112 #define SR_EXT 0x0c /* Shift on external clock */
113 #define SR_OUT 0x10 /* Shift out if 1 */
115 /* Bits in IFR and IER */
116 #define IER_SET 0x80 /* set bits in IER */
117 #define IER_CLR 0 /* clear bits in IER */
118 #define SR_INT 0x04 /* Shift register full/empty */
120 #define CB1_INT 0x10 /* transition on CB1 input */
122 static volatile enum pmu_state {
132 static volatile enum int_data_state {
137 } int_data_state[2] = { int_data_empty, int_data_empty };
139 static struct adb_request *current_req;
140 static struct adb_request *last_req;
141 static struct adb_request *req_awaiting_reply;
142 static unsigned char interrupt_data[2][32];
143 static int interrupt_data_len[2];
144 static int int_data_last;
145 static unsigned char *reply_ptr;
146 static int data_index;
148 static volatile int adb_int_pending;
149 static volatile int disable_poll;
150 static int pmu_kind = PMU_UNKNOWN;
151 static int pmu_fully_inited;
152 static int pmu_has_adb;
153 #ifdef CONFIG_PPC_PMAC
154 static volatile unsigned char __iomem *via1;
155 static volatile unsigned char __iomem *via2;
156 static struct device_node *vias;
157 static struct device_node *gpio_node;
159 static unsigned char __iomem *gpio_reg;
160 static int gpio_irq = 0;
161 static int gpio_irq_enabled = -1;
162 static volatile int pmu_suspended;
163 static DEFINE_SPINLOCK(pmu_lock);
164 static u8 pmu_intr_mask;
165 static int pmu_version;
166 static int drop_interrupts;
167 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
168 static int option_lid_wakeup = 1;
169 #endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
170 static unsigned long async_req_locks;
172 #define NUM_IRQ_STATS 13
173 static unsigned int pmu_irq_stats[NUM_IRQ_STATS];
175 static struct proc_dir_entry *proc_pmu_root;
176 static struct proc_dir_entry *proc_pmu_info;
177 static struct proc_dir_entry *proc_pmu_irqstats;
178 static struct proc_dir_entry *proc_pmu_options;
179 static int option_server_mode;
181 int pmu_battery_count;
182 static int pmu_cur_battery;
183 unsigned int pmu_power_flags = PMU_PWR_AC_PRESENT;
184 struct pmu_battery_info pmu_batteries[PMU_MAX_BATTERIES];
185 static int query_batt_timer = BATTERY_POLLING_COUNT;
186 static struct adb_request batt_req;
187 static struct proc_dir_entry *proc_pmu_batt[PMU_MAX_BATTERIES];
192 static int adb_dev_map;
193 static int pmu_adb_flags;
195 static int pmu_probe(void);
196 static int pmu_init(void);
197 static int pmu_send_request(struct adb_request *req, int sync);
198 static int pmu_adb_autopoll(int devs);
199 static int pmu_adb_reset_bus(void);
200 #endif /* CONFIG_ADB */
202 static int init_pmu(void);
203 static void pmu_start(void);
204 static irqreturn_t via_pmu_interrupt(int irq, void *arg);
205 static irqreturn_t gpio1_interrupt(int irq, void *arg);
206 #ifdef CONFIG_PROC_FS
207 static int pmu_info_proc_show(struct seq_file *m, void *v);
208 static int pmu_irqstats_proc_show(struct seq_file *m, void *v);
209 static int pmu_battery_proc_show(struct seq_file *m, void *v);
211 static void pmu_pass_intr(unsigned char *data, int len);
212 static const struct proc_ops pmu_options_proc_ops;
215 const struct adb_driver via_pmu_driver = {
219 .send_request = pmu_send_request,
220 .autopoll = pmu_adb_autopoll,
221 .poll = pmu_poll_adb,
222 .reset_bus = pmu_adb_reset_bus,
224 #endif /* CONFIG_ADB */
226 extern void low_sleep_handler(void);
227 extern void enable_kernel_altivec(void);
228 extern void enable_kernel_fp(void);
231 int pmu_polled_request(struct adb_request *req);
232 void pmu_blink(int n);
236 * This table indicates for each PMU opcode:
237 * - the number of data bytes to be sent with the command, or -1
238 * if a length byte should be sent,
239 * - the number of response bytes which the PMU will return, or
240 * -1 if it will send a length byte.
242 static const s8 pmu_data_len[256][2] = {
243 /* 0 1 2 3 4 5 6 7 */
244 /*00*/ {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
245 /*08*/ {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
246 /*10*/ { 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
247 /*18*/ { 0, 1},{ 0, 1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{ 0, 0},
248 /*20*/ {-1, 0},{ 0, 0},{ 2, 0},{ 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},
249 /*28*/ { 0,-1},{ 0,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{ 0,-1},
250 /*30*/ { 4, 0},{20, 0},{-1, 0},{ 3, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
251 /*38*/ { 0, 4},{ 0,20},{ 2,-1},{ 2, 1},{ 3,-1},{-1,-1},{-1,-1},{ 4, 0},
252 /*40*/ { 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
253 /*48*/ { 0, 1},{ 0, 1},{-1,-1},{ 1, 0},{ 1, 0},{-1,-1},{-1,-1},{-1,-1},
254 /*50*/ { 1, 0},{ 0, 0},{ 2, 0},{ 2, 0},{-1, 0},{ 1, 0},{ 3, 0},{ 1, 0},
255 /*58*/ { 0, 1},{ 1, 0},{ 0, 2},{ 0, 2},{ 0,-1},{-1,-1},{-1,-1},{-1,-1},
256 /*60*/ { 2, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
257 /*68*/ { 0, 3},{ 0, 3},{ 0, 2},{ 0, 8},{ 0,-1},{ 0,-1},{-1,-1},{-1,-1},
258 /*70*/ { 1, 0},{ 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
259 /*78*/ { 0,-1},{ 0,-1},{-1,-1},{-1,-1},{-1,-1},{ 5, 1},{ 4, 1},{ 4, 1},
260 /*80*/ { 4, 0},{-1, 0},{ 0, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
261 /*88*/ { 0, 5},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
262 /*90*/ { 1, 0},{ 2, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
263 /*98*/ { 0, 1},{ 0, 1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
264 /*a0*/ { 2, 0},{ 2, 0},{ 2, 0},{ 4, 0},{-1, 0},{ 0, 0},{-1, 0},{-1, 0},
265 /*a8*/ { 1, 1},{ 1, 0},{ 3, 0},{ 2, 0},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
266 /*b0*/ {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
267 /*b8*/ {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
268 /*c0*/ {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
269 /*c8*/ {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
270 /*d0*/ { 0, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
271 /*d8*/ { 1, 1},{ 1, 1},{-1,-1},{-1,-1},{ 0, 1},{ 0,-1},{-1,-1},{-1,-1},
272 /*e0*/ {-1, 0},{ 4, 0},{ 0, 1},{-1, 0},{-1, 0},{ 4, 0},{-1, 0},{-1, 0},
273 /*e8*/ { 3,-1},{-1,-1},{ 0, 1},{-1,-1},{ 0,-1},{-1,-1},{-1,-1},{ 0, 0},
274 /*f0*/ {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
275 /*f8*/ {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
278 static char *pbook_type[] = {
280 "PowerBook 2400/3400/3500(G3)",
281 "PowerBook G3 Series",
286 int __init find_via_pmu(void)
288 #ifdef CONFIG_PPC_PMAC
292 if (pmu_state != uninitialized)
294 vias = of_find_node_by_name(NULL, "via-pmu");
298 reg = of_get_property(vias, "reg", NULL);
300 printk(KERN_ERR "via-pmu: No \"reg\" property !\n");
303 taddr = of_translate_address(vias, reg);
304 if (taddr == OF_BAD_ADDR) {
305 printk(KERN_ERR "via-pmu: Can't translate address !\n");
311 pmu_intr_mask = PMU_INT_PCEJECT |
316 if (of_node_name_eq(vias->parent, "ohare") ||
317 of_device_is_compatible(vias->parent, "ohare"))
318 pmu_kind = PMU_OHARE_BASED;
319 else if (of_device_is_compatible(vias->parent, "paddington"))
320 pmu_kind = PMU_PADDINGTON_BASED;
321 else if (of_device_is_compatible(vias->parent, "heathrow"))
322 pmu_kind = PMU_HEATHROW_BASED;
323 else if (of_device_is_compatible(vias->parent, "Keylargo")
324 || of_device_is_compatible(vias->parent, "K2-Keylargo")) {
325 struct device_node *gpiop;
326 struct device_node *adbp;
327 u64 gaddr = OF_BAD_ADDR;
329 pmu_kind = PMU_KEYLARGO_BASED;
330 adbp = of_find_node_by_type(NULL, "adb");
331 pmu_has_adb = (adbp != NULL);
333 pmu_intr_mask = PMU_INT_PCEJECT |
339 gpiop = of_find_node_by_name(NULL, "gpio");
341 reg = of_get_property(gpiop, "reg", NULL);
343 gaddr = of_translate_address(gpiop, reg);
344 if (gaddr != OF_BAD_ADDR)
345 gpio_reg = ioremap(gaddr, 0x10);
348 if (gpio_reg == NULL) {
349 printk(KERN_ERR "via-pmu: Can't find GPIO reg !\n");
353 pmu_kind = PMU_UNKNOWN;
355 via1 = via2 = ioremap(taddr, 0x2000);
357 printk(KERN_ERR "via-pmu: Can't map address !\n");
361 out_8(&via1[IER], IER_CLR | 0x7f); /* disable all intrs */
362 out_8(&via1[IFR], 0x7f); /* clear IFR */
369 sys_ctrler = SYS_CTRLER_PMU;
382 pmu_state = uninitialized;
385 if (macintosh_config->adb_type != MAC_ADB_PB2)
388 pmu_kind = PMU_UNKNOWN;
392 pmu_intr_mask = PMU_INT_PCEJECT |
400 pmu_state = uninitialized;
405 #endif /* !CONFIG_PPC_PMAC */
409 static int pmu_probe(void)
411 return pmu_state == uninitialized ? -ENODEV : 0;
414 static int pmu_init(void)
416 return pmu_state == uninitialized ? -ENODEV : 0;
418 #endif /* CONFIG_ADB */
421 * We can't wait until pmu_init gets called, that happens too late.
422 * It happens after IDE and SCSI initialization, which can take a few
423 * seconds, and by that time the PMU could have given up on us and
425 * Thus this is called with arch_initcall rather than device_initcall.
427 static int __init via_pmu_start(void)
429 unsigned int __maybe_unused irq;
431 if (pmu_state == uninitialized)
434 batt_req.complete = 1;
436 #ifdef CONFIG_PPC_PMAC
437 irq = irq_of_parse_and_map(vias, 0);
439 printk(KERN_ERR "via-pmu: can't map interrupt\n");
442 /* We set IRQF_NO_SUSPEND because we don't want the interrupt
443 * to be disabled between the 2 passes of driver suspend, we
444 * control our own disabling for that one
446 if (request_irq(irq, via_pmu_interrupt, IRQF_NO_SUSPEND,
447 "VIA-PMU", (void *)0)) {
448 printk(KERN_ERR "via-pmu: can't request irq %d\n", irq);
452 if (pmu_kind == PMU_KEYLARGO_BASED) {
453 gpio_node = of_find_node_by_name(NULL, "extint-gpio1");
454 if (gpio_node == NULL)
455 gpio_node = of_find_node_by_name(NULL,
458 gpio_irq = irq_of_parse_and_map(gpio_node, 0);
461 if (request_irq(gpio_irq, gpio1_interrupt,
462 IRQF_NO_SUSPEND, "GPIO1 ADB",
464 printk(KERN_ERR "pmu: can't get irq %d"
465 " (GPIO1)\n", gpio_irq);
467 gpio_irq_enabled = 1;
471 /* Enable interrupts */
472 out_8(&via1[IER], IER_SET | SR_INT | CB1_INT);
474 if (request_irq(IRQ_MAC_ADB_SR, via_pmu_interrupt, IRQF_NO_SUSPEND,
475 "VIA-PMU-SR", NULL)) {
476 pr_err("%s: couldn't get SR irq\n", __func__);
479 if (request_irq(IRQ_MAC_ADB_CL, via_pmu_interrupt, IRQF_NO_SUSPEND,
480 "VIA-PMU-CL", NULL)) {
481 pr_err("%s: couldn't get CL irq\n", __func__);
482 free_irq(IRQ_MAC_ADB_SR, NULL);
485 #endif /* !CONFIG_PPC_PMAC */
487 pmu_fully_inited = 1;
489 /* Make sure PMU settle down before continuing. This is _very_ important
490 * since the IDE probe may shut interrupts down for quite a bit of time. If
491 * a PMU communication is pending while this happens, the PMU may timeout
492 * Not that on Core99 machines, the PMU keeps sending us environement
493 * messages, we should find a way to either fix IDE or make it call
494 * pmu_suspend() before masking interrupts. This can also happens while
495 * scolling with some fbdevs.
499 } while (pmu_state != idle);
504 arch_initcall(via_pmu_start);
507 * This has to be done after pci_init, which is a subsys_initcall.
509 static int __init via_pmu_dev_init(void)
511 if (pmu_state == uninitialized)
514 #ifdef CONFIG_PMAC_BACKLIGHT
515 /* Initialize backlight */
516 pmu_backlight_init();
520 if (of_machine_is_compatible("AAPL,3400/2400") ||
521 of_machine_is_compatible("AAPL,3500")) {
522 int mb = pmac_call_feature(PMAC_FTR_GET_MB_INFO,
523 NULL, PMAC_MB_INFO_MODEL, 0);
524 pmu_battery_count = 1;
525 if (mb == PMAC_TYPE_COMET)
526 pmu_batteries[0].flags |= PMU_BATT_TYPE_COMET;
528 pmu_batteries[0].flags |= PMU_BATT_TYPE_HOOPER;
529 } else if (of_machine_is_compatible("AAPL,PowerBook1998") ||
530 of_machine_is_compatible("PowerBook1,1")) {
531 pmu_battery_count = 2;
532 pmu_batteries[0].flags |= PMU_BATT_TYPE_SMART;
533 pmu_batteries[1].flags |= PMU_BATT_TYPE_SMART;
535 struct device_node* prim =
536 of_find_node_by_name(NULL, "power-mgt");
537 const u32 *prim_info = NULL;
539 prim_info = of_get_property(prim, "prim-info", NULL);
541 /* Other stuffs here yet unknown */
542 pmu_battery_count = (prim_info[6] >> 16) & 0xff;
543 pmu_batteries[0].flags |= PMU_BATT_TYPE_SMART;
544 if (pmu_battery_count > 1)
545 pmu_batteries[1].flags |= PMU_BATT_TYPE_SMART;
549 #endif /* CONFIG_PPC32 */
551 /* Create /proc/pmu */
552 proc_pmu_root = proc_mkdir("pmu", NULL);
556 for (i=0; i<pmu_battery_count; i++) {
558 sprintf(title, "battery_%ld", i);
559 proc_pmu_batt[i] = proc_create_single_data(title, 0,
560 proc_pmu_root, pmu_battery_proc_show,
564 proc_pmu_info = proc_create_single("info", 0, proc_pmu_root,
566 proc_pmu_irqstats = proc_create_single("interrupts", 0,
567 proc_pmu_root, pmu_irqstats_proc_show);
568 proc_pmu_options = proc_create("options", 0600, proc_pmu_root,
569 &pmu_options_proc_ops);
574 device_initcall(via_pmu_dev_init);
580 struct adb_request req;
582 /* Negate TREQ. Set TACK to input and TREQ to output. */
583 out_8(&via2[B], in_8(&via2[B]) | TREQ);
584 out_8(&via2[DIRB], (in_8(&via2[DIRB]) | TREQ) & ~TACK);
586 pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, pmu_intr_mask);
588 while (!req.complete) {
590 printk(KERN_ERR "init_pmu: no response from PMU\n");
597 /* ack all pending interrupts */
599 interrupt_data[0][0] = 1;
600 while (interrupt_data[0][0] || pmu_state != idle) {
602 printk(KERN_ERR "init_pmu: timed out acking intrs\n");
605 if (pmu_state == idle)
607 via_pmu_interrupt(0, NULL);
611 /* Tell PMU we are ready. */
612 if (pmu_kind == PMU_KEYLARGO_BASED) {
613 pmu_request(&req, NULL, 2, PMU_SYSTEM_READY, 2);
614 while (!req.complete)
618 /* Read PMU version */
619 pmu_request(&req, NULL, 1, PMU_GET_VERSION);
620 pmu_wait_complete(&req);
621 if (req.reply_len > 0)
622 pmu_version = req.reply[0];
624 /* Read server mode setting */
625 if (pmu_kind == PMU_KEYLARGO_BASED) {
626 pmu_request(&req, NULL, 2, PMU_POWER_EVENTS,
627 PMU_PWR_GET_POWERUP_EVENTS);
628 pmu_wait_complete(&req);
629 if (req.reply_len == 2) {
630 if (req.reply[1] & PMU_PWR_WAKEUP_AC_INSERT)
631 option_server_mode = 1;
632 printk(KERN_INFO "via-pmu: Server Mode is %s\n",
633 option_server_mode ? "enabled" : "disabled");
637 printk(KERN_INFO "PMU driver v%d initialized for %s, firmware: %02x\n",
638 PMU_DRIVER_VERSION, pbook_type[pmu_kind], pmu_version);
649 static void pmu_set_server_mode(int server_mode)
651 struct adb_request req;
653 if (pmu_kind != PMU_KEYLARGO_BASED)
656 option_server_mode = server_mode;
657 pmu_request(&req, NULL, 2, PMU_POWER_EVENTS, PMU_PWR_GET_POWERUP_EVENTS);
658 pmu_wait_complete(&req);
659 if (req.reply_len < 2)
662 pmu_request(&req, NULL, 4, PMU_POWER_EVENTS,
663 PMU_PWR_SET_POWERUP_EVENTS,
664 req.reply[0], PMU_PWR_WAKEUP_AC_INSERT);
666 pmu_request(&req, NULL, 4, PMU_POWER_EVENTS,
667 PMU_PWR_CLR_POWERUP_EVENTS,
668 req.reply[0], PMU_PWR_WAKEUP_AC_INSERT);
669 pmu_wait_complete(&req);
672 /* This new version of the code for 2400/3400/3500 powerbooks
673 * is inspired from the implementation in gkrellm-pmu
676 done_battery_state_ohare(struct adb_request* req)
678 #ifdef CONFIG_PPC_PMAC
681 * 0x01 : AC indicator
683 * 0x04 : battery exist
686 * 0x20 : full charged
687 * 0x40 : pcharge reset
688 * 0x80 : battery exist
690 * [1][2] : battery voltage
691 * [3] : CPU temperature
692 * [4] : battery temperature
697 unsigned int bat_flags = PMU_BATT_TYPE_HOOPER;
698 long pcharge, charge, vb, vmax, lmax;
699 long vmax_charging, vmax_charged;
700 long amperage, voltage, time, max;
701 int mb = pmac_call_feature(PMAC_FTR_GET_MB_INFO,
702 NULL, PMAC_MB_INFO_MODEL, 0);
704 if (req->reply[0] & 0x01)
705 pmu_power_flags |= PMU_PWR_AC_PRESENT;
707 pmu_power_flags &= ~PMU_PWR_AC_PRESENT;
709 if (mb == PMAC_TYPE_COMET) {
720 /* If battery installed */
721 if (req->reply[0] & 0x04) {
722 bat_flags |= PMU_BATT_PRESENT;
723 if (req->reply[0] & 0x02)
724 bat_flags |= PMU_BATT_CHARGING;
725 vb = (req->reply[1] << 8) | req->reply[2];
726 voltage = (vb * 265 + 72665) / 10;
727 amperage = req->reply[5];
728 if ((req->reply[0] & 0x01) == 0) {
730 vb += ((amperage - 200) * 15)/100;
731 } else if (req->reply[0] & 0x02) {
732 vb = (vb * 97) / 100;
733 vmax = vmax_charging;
735 charge = (100 * vb) / vmax;
736 if (req->reply[0] & 0x40) {
737 pcharge = (req->reply[6] << 8) + req->reply[7];
741 pcharge = 100 - pcharge / lmax;
742 if (pcharge < charge)
746 time = (charge * 16440) / amperage;
750 amperage = -amperage;
752 charge = max = amperage = voltage = time = 0;
754 pmu_batteries[pmu_cur_battery].flags = bat_flags;
755 pmu_batteries[pmu_cur_battery].charge = charge;
756 pmu_batteries[pmu_cur_battery].max_charge = max;
757 pmu_batteries[pmu_cur_battery].amperage = amperage;
758 pmu_batteries[pmu_cur_battery].voltage = voltage;
759 pmu_batteries[pmu_cur_battery].time_remaining = time;
760 #endif /* CONFIG_PPC_PMAC */
762 clear_bit(0, &async_req_locks);
766 done_battery_state_smart(struct adb_request* req)
769 * [0] : format of this structure (known: 3,4,5)
782 * [4][5] : max charge
787 unsigned int bat_flags = PMU_BATT_TYPE_SMART;
789 unsigned int capa, max, voltage;
791 if (req->reply[1] & 0x01)
792 pmu_power_flags |= PMU_PWR_AC_PRESENT;
794 pmu_power_flags &= ~PMU_PWR_AC_PRESENT;
797 capa = max = amperage = voltage = 0;
799 if (req->reply[1] & 0x04) {
800 bat_flags |= PMU_BATT_PRESENT;
801 switch(req->reply[0]) {
803 case 4: capa = req->reply[2];
805 amperage = *((signed char *)&req->reply[4]);
806 voltage = req->reply[5];
808 case 5: capa = (req->reply[2] << 8) | req->reply[3];
809 max = (req->reply[4] << 8) | req->reply[5];
810 amperage = *((signed short *)&req->reply[6]);
811 voltage = (req->reply[8] << 8) | req->reply[9];
814 pr_warn("pmu.c: unrecognized battery info, "
815 "len: %d, %4ph\n", req->reply_len,
821 if ((req->reply[1] & 0x01) && (amperage > 0))
822 bat_flags |= PMU_BATT_CHARGING;
824 pmu_batteries[pmu_cur_battery].flags = bat_flags;
825 pmu_batteries[pmu_cur_battery].charge = capa;
826 pmu_batteries[pmu_cur_battery].max_charge = max;
827 pmu_batteries[pmu_cur_battery].amperage = amperage;
828 pmu_batteries[pmu_cur_battery].voltage = voltage;
830 if ((req->reply[1] & 0x01) && (amperage > 0))
831 pmu_batteries[pmu_cur_battery].time_remaining
832 = ((max-capa) * 3600) / amperage;
834 pmu_batteries[pmu_cur_battery].time_remaining
835 = (capa * 3600) / (-amperage);
837 pmu_batteries[pmu_cur_battery].time_remaining = 0;
839 pmu_cur_battery = (pmu_cur_battery + 1) % pmu_battery_count;
841 clear_bit(0, &async_req_locks);
845 query_battery_state(void)
847 if (test_and_set_bit(0, &async_req_locks))
849 if (pmu_kind == PMU_OHARE_BASED)
850 pmu_request(&batt_req, done_battery_state_ohare,
851 1, PMU_BATTERY_STATE);
853 pmu_request(&batt_req, done_battery_state_smart,
854 2, PMU_SMART_BATTERY_STATE, pmu_cur_battery+1);
857 #ifdef CONFIG_PROC_FS
858 static int pmu_info_proc_show(struct seq_file *m, void *v)
860 seq_printf(m, "PMU driver version : %d\n", PMU_DRIVER_VERSION);
861 seq_printf(m, "PMU firmware version : %02x\n", pmu_version);
862 seq_printf(m, "AC Power : %d\n",
863 ((pmu_power_flags & PMU_PWR_AC_PRESENT) != 0) || pmu_battery_count == 0);
864 seq_printf(m, "Battery count : %d\n", pmu_battery_count);
869 static int pmu_irqstats_proc_show(struct seq_file *m, void *v)
872 static const char *irq_names[NUM_IRQ_STATS] = {
873 "Unknown interrupt (type 0)",
874 "Unknown interrupt (type 1)",
875 "PC-Card eject button",
876 "Sound/Brightness button",
878 "Battery state change",
879 "Environment interrupt",
881 "Ghost interrupt (zero len)",
882 "Empty interrupt (empty mask)",
884 "Total CB1 triggered events",
885 "Total GPIO1 triggered events",
888 for (i = 0; i < NUM_IRQ_STATS; i++) {
889 seq_printf(m, " %2u: %10u (%s)\n",
890 i, pmu_irq_stats[i], irq_names[i]);
895 static int pmu_battery_proc_show(struct seq_file *m, void *v)
897 long batnum = (long)m->private;
900 seq_printf(m, "flags : %08x\n", pmu_batteries[batnum].flags);
901 seq_printf(m, "charge : %d\n", pmu_batteries[batnum].charge);
902 seq_printf(m, "max_charge : %d\n", pmu_batteries[batnum].max_charge);
903 seq_printf(m, "current : %d\n", pmu_batteries[batnum].amperage);
904 seq_printf(m, "voltage : %d\n", pmu_batteries[batnum].voltage);
905 seq_printf(m, "time rem. : %d\n", pmu_batteries[batnum].time_remaining);
909 static int pmu_options_proc_show(struct seq_file *m, void *v)
911 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
912 if (pmu_kind == PMU_KEYLARGO_BASED &&
913 pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0)
914 seq_printf(m, "lid_wakeup=%d\n", option_lid_wakeup);
916 if (pmu_kind == PMU_KEYLARGO_BASED)
917 seq_printf(m, "server_mode=%d\n", option_server_mode);
922 static int pmu_options_proc_open(struct inode *inode, struct file *file)
924 return single_open(file, pmu_options_proc_show, NULL);
927 static ssize_t pmu_options_proc_write(struct file *file,
928 const char __user *buffer, size_t count, loff_t *pos)
932 size_t fcount = count;
938 if (copy_from_user(tmp, buffer, count))
946 while(*val && (*val != '=')) {
956 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
957 if (pmu_kind == PMU_KEYLARGO_BASED &&
958 pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0)
959 if (!strcmp(label, "lid_wakeup"))
960 option_lid_wakeup = ((*val) == '1');
962 if (pmu_kind == PMU_KEYLARGO_BASED && !strcmp(label, "server_mode")) {
964 new_value = ((*val) == '1');
965 if (new_value != option_server_mode)
966 pmu_set_server_mode(new_value);
971 static const struct proc_ops pmu_options_proc_ops = {
972 .proc_open = pmu_options_proc_open,
973 .proc_read = seq_read,
974 .proc_lseek = seq_lseek,
975 .proc_release = single_release,
976 .proc_write = pmu_options_proc_write,
981 /* Send an ADB command */
982 static int pmu_send_request(struct adb_request *req, int sync)
986 if (pmu_state == uninitialized || !pmu_fully_inited) {
993 switch (req->data[0]) {
995 for (i = 0; i < req->nbytes - 1; ++i)
996 req->data[i] = req->data[i+1];
998 if (pmu_data_len[req->data[0]][1] != 0) {
999 req->reply[0] = ADB_RET_OK;
1003 ret = pmu_queue_request(req);
1006 switch (req->data[1]) {
1008 if (req->nbytes != 2)
1010 req->data[0] = PMU_READ_RTC;
1013 req->reply[0] = CUDA_PACKET;
1015 req->reply[2] = CUDA_GET_TIME;
1016 ret = pmu_queue_request(req);
1019 if (req->nbytes != 6)
1021 req->data[0] = PMU_SET_RTC;
1023 for (i = 1; i <= 4; ++i)
1024 req->data[i] = req->data[i+1];
1026 req->reply[0] = CUDA_PACKET;
1028 req->reply[2] = CUDA_SET_TIME;
1029 ret = pmu_queue_request(req);
1036 for (i = req->nbytes - 1; i > 1; --i)
1037 req->data[i+2] = req->data[i];
1038 req->data[3] = req->nbytes - 2;
1039 req->data[2] = pmu_adb_flags;
1040 /*req->data[1] = req->data[1];*/
1041 req->data[0] = PMU_ADB_CMD;
1043 req->reply_expected = 1;
1045 ret = pmu_queue_request(req);
1054 while (!req->complete)
1060 /* Enable/disable autopolling */
1061 static int __pmu_adb_autopoll(int devs)
1063 struct adb_request req;
1066 pmu_request(&req, NULL, 5, PMU_ADB_CMD, 0, 0x86,
1067 adb_dev_map >> 8, adb_dev_map);
1070 pmu_request(&req, NULL, 1, PMU_ADB_POLL_OFF);
1073 while (!req.complete)
1078 static int pmu_adb_autopoll(int devs)
1080 if (pmu_state == uninitialized || !pmu_fully_inited || !pmu_has_adb)
1084 return __pmu_adb_autopoll(devs);
1087 /* Reset the ADB bus */
1088 static int pmu_adb_reset_bus(void)
1090 struct adb_request req;
1091 int save_autopoll = adb_dev_map;
1093 if (pmu_state == uninitialized || !pmu_fully_inited || !pmu_has_adb)
1096 /* anyone got a better idea?? */
1097 __pmu_adb_autopoll(0);
1101 req.data[0] = PMU_ADB_CMD;
1102 req.data[1] = ADB_BUSRESET;
1107 req.reply_expected = 1;
1108 if (pmu_queue_request(&req) != 0) {
1109 printk(KERN_ERR "pmu_adb_reset_bus: pmu_queue_request failed\n");
1112 pmu_wait_complete(&req);
1114 if (save_autopoll != 0)
1115 __pmu_adb_autopoll(save_autopoll);
1119 #endif /* CONFIG_ADB */
1121 /* Construct and send a pmu request */
1123 pmu_request(struct adb_request *req, void (*done)(struct adb_request *),
1129 if (pmu_state == uninitialized)
1132 if (nbytes < 0 || nbytes > 32) {
1133 printk(KERN_ERR "pmu_request: bad nbytes (%d)\n", nbytes);
1137 req->nbytes = nbytes;
1139 va_start(list, nbytes);
1140 for (i = 0; i < nbytes; ++i)
1141 req->data[i] = va_arg(list, int);
1144 req->reply_expected = 0;
1145 return pmu_queue_request(req);
1149 pmu_queue_request(struct adb_request *req)
1151 unsigned long flags;
1154 if (pmu_state == uninitialized) {
1158 if (req->nbytes <= 0) {
1162 nsend = pmu_data_len[req->data[0]][0];
1163 if (nsend >= 0 && req->nbytes != nsend + 1) {
1172 spin_lock_irqsave(&pmu_lock, flags);
1174 last_req->next = req;
1179 if (pmu_state == idle)
1182 spin_unlock_irqrestore(&pmu_lock, flags);
1190 /* Sightly increased the delay, I had one occurrence of the message
1194 while ((in_8(&via2[B]) & TACK) == 0) {
1195 if (--timeout < 0) {
1196 printk(KERN_ERR "PMU not responding (!ack)\n");
1203 /* New PMU seems to be very sensitive to those timings, so we make sure
1204 * PCI is flushed immediately */
1208 out_8(&via1[ACR], in_8(&via1[ACR]) | SR_OUT | SR_EXT);
1209 out_8(&via1[SR], x);
1210 out_8(&via2[B], in_8(&via2[B]) & ~TREQ); /* assert TREQ */
1211 (void)in_8(&via2[B]);
1217 out_8(&via1[ACR], (in_8(&via1[ACR]) & ~SR_OUT) | SR_EXT);
1218 in_8(&via1[SR]); /* resets SR */
1219 out_8(&via2[B], in_8(&via2[B]) & ~TREQ);
1220 (void)in_8(&via2[B]);
1224 pmu_done(struct adb_request *req)
1226 void (*done)(struct adb_request *) = req->done;
1229 /* Here, we assume that if the request has a done member, the
1230 * struct request will survive to setting req->complete to 1
1239 struct adb_request *req;
1241 /* assert pmu_state == idle */
1242 /* get the packet to send */
1244 if (!req || pmu_state != idle
1245 || (/*req->reply_expected && */req_awaiting_reply))
1248 pmu_state = sending;
1250 data_len = pmu_data_len[req->data[0]][0];
1252 /* Sounds safer to make sure ACK is high before writing. This helped
1253 * kill a problem with ADB and some iBooks
1256 /* set the shift register to shift out and send a byte */
1257 send_byte(req->data[0]);
1263 if (pmu_state == uninitialized)
1267 via_pmu_interrupt(0, NULL);
1273 if (pmu_state == uninitialized)
1277 /* Kicks ADB read when PMU is suspended */
1278 adb_int_pending = 1;
1280 via_pmu_interrupt(0, NULL);
1281 } while (pmu_suspended && (adb_int_pending || pmu_state != idle
1282 || req_awaiting_reply));
1286 pmu_wait_complete(struct adb_request *req)
1288 if (pmu_state == uninitialized)
1290 while((pmu_state != idle && pmu_state != locked) || !req->complete)
1291 via_pmu_interrupt(0, NULL);
1294 /* This function loops until the PMU is idle and prevents it from
1295 * anwsering to ADB interrupts. pmu_request can still be called.
1296 * This is done to avoid spurrious shutdowns when we know we'll have
1297 * interrupts switched off for a long time
1302 unsigned long flags;
1304 if (pmu_state == uninitialized)
1307 spin_lock_irqsave(&pmu_lock, flags);
1309 if (pmu_suspended > 1) {
1310 spin_unlock_irqrestore(&pmu_lock, flags);
1315 spin_unlock_irqrestore(&pmu_lock, flags);
1316 if (req_awaiting_reply)
1317 adb_int_pending = 1;
1318 via_pmu_interrupt(0, NULL);
1319 spin_lock_irqsave(&pmu_lock, flags);
1320 if (!adb_int_pending && pmu_state == idle && !req_awaiting_reply) {
1322 disable_irq_nosync(gpio_irq);
1323 out_8(&via1[IER], CB1_INT | IER_CLR);
1324 spin_unlock_irqrestore(&pmu_lock, flags);
1333 unsigned long flags;
1335 if (pmu_state == uninitialized || pmu_suspended < 1)
1338 spin_lock_irqsave(&pmu_lock, flags);
1340 if (pmu_suspended > 0) {
1341 spin_unlock_irqrestore(&pmu_lock, flags);
1344 adb_int_pending = 1;
1346 enable_irq(gpio_irq);
1347 out_8(&via1[IER], CB1_INT | IER_SET);
1348 spin_unlock_irqrestore(&pmu_lock, flags);
1352 /* Interrupt data could be the result data from an ADB cmd */
1354 pmu_handle_data(unsigned char *data, int len)
1361 if (drop_interrupts || len < 1) {
1362 adb_int_pending = 0;
1367 /* Get PMU interrupt mask */
1370 /* Record zero interrupts for stats */
1374 /* Hack to deal with ADB autopoll flag */
1375 if (ints & PMU_INT_ADB)
1376 ints &= ~(PMU_INT_ADB_AUTO | PMU_INT_AUTO_SRQ_POLL);
1380 if (i > pmu_irq_stats[10])
1381 pmu_irq_stats[10] = i;
1386 idx = ffs(ints) - 1;
1389 pmu_irq_stats[idx]++;
1391 /* Note: for some reason, we get an interrupt with len=1,
1392 * data[0]==0 after each normal ADB interrupt, at least
1393 * on the Pismo. Still investigating... --BenH
1397 if ((data[0] & PMU_INT_ADB_AUTO) == 0) {
1398 struct adb_request *req = req_awaiting_reply;
1400 printk(KERN_ERR "PMU: extra ADB reply\n");
1403 req_awaiting_reply = NULL;
1407 memcpy(req->reply, data + 1, len - 1);
1408 req->reply_len = len - 1;
1413 if (len == 4 && data[1] == 0x2c) {
1414 extern int xmon_wants_key, xmon_adb_keycode;
1415 if (xmon_wants_key) {
1416 xmon_adb_keycode = data[2];
1420 #endif /* CONFIG_XMON */
1423 * XXX On the [23]400 the PMU gives us an up
1424 * event for keycodes 0x74 or 0x75 when the PC
1425 * card eject buttons are released, so we
1426 * ignore those events.
1428 if (!(pmu_kind == PMU_OHARE_BASED && len == 4
1429 && data[1] == 0x2c && data[3] == 0xff
1430 && (data[2] & ~1) == 0xf4))
1431 adb_input(data+1, len-1, 1);
1432 #endif /* CONFIG_ADB */
1436 /* Sound/brightness button pressed */
1437 case PMU_INT_SNDBRT:
1438 #ifdef CONFIG_PMAC_BACKLIGHT
1440 pmac_backlight_set_legacy_brightness_pmu(data[1] >> 4);
1444 /* Tick interrupt */
1446 /* Environment or tick interrupt, query batteries */
1447 if (pmu_battery_count) {
1448 if ((--query_batt_timer) == 0) {
1449 query_battery_state();
1450 query_batt_timer = BATTERY_POLLING_COUNT;
1455 case PMU_INT_ENVIRONMENT:
1456 if (pmu_battery_count)
1457 query_battery_state();
1458 pmu_pass_intr(data, len);
1459 /* len == 6 is probably a bad check. But how do I
1460 * know what PMU versions send what events here? */
1461 if (IS_ENABLED(CONFIG_ADB_PMU_EVENT) && len == 6) {
1462 via_pmu_event(PMU_EVT_POWER, !!(data[1]&8));
1463 via_pmu_event(PMU_EVT_LID, data[1]&1);
1468 pmu_pass_intr(data, len);
1473 static struct adb_request*
1476 struct adb_request *req;
1479 if (in_8(&via2[B]) & TREQ) {
1480 printk(KERN_ERR "PMU: spurious SR intr (%x)\n", in_8(&via2[B]));
1483 /* The ack may not yet be low when we get the interrupt */
1484 while ((in_8(&via2[B]) & TACK) != 0)
1487 /* if reading grab the byte, and reset the interrupt */
1488 if (pmu_state == reading || pmu_state == reading_intr)
1489 bite = in_8(&via1[SR]);
1491 /* reset TREQ and wait for TACK to go high */
1492 out_8(&via2[B], in_8(&via2[B]) | TREQ);
1495 switch (pmu_state) {
1499 data_len = req->nbytes - 1;
1500 send_byte(data_len);
1503 if (data_index <= data_len) {
1504 send_byte(req->data[data_index++]);
1508 data_len = pmu_data_len[req->data[0]][1];
1509 if (data_len == 0) {
1511 current_req = req->next;
1512 if (req->reply_expected)
1513 req_awaiting_reply = req;
1517 pmu_state = reading;
1519 reply_ptr = req->reply + req->reply_len;
1527 pmu_state = reading_intr;
1528 reply_ptr = interrupt_data[int_data_last];
1530 if (gpio_irq >= 0 && !gpio_irq_enabled) {
1531 enable_irq(gpio_irq);
1532 gpio_irq_enabled = 1;
1538 if (data_len == -1) {
1541 printk(KERN_ERR "PMU: bad reply len %d\n", bite);
1542 } else if (data_index < 32) {
1543 reply_ptr[data_index++] = bite;
1545 if (data_index < data_len) {
1550 if (pmu_state == reading_intr) {
1552 int_data_state[int_data_last] = int_data_ready;
1553 interrupt_data_len[int_data_last] = data_len;
1557 * For PMU sleep and freq change requests, we lock the
1558 * PMU until it's explicitly unlocked. This avoids any
1559 * spurrious event polling getting in
1561 current_req = req->next;
1562 req->reply_len += data_index;
1563 if (req->data[0] == PMU_SLEEP || req->data[0] == PMU_CPU_SPEED)
1572 printk(KERN_ERR "via_pmu_interrupt: unknown state %d?\n",
1579 via_pmu_interrupt(int irq, void *arg)
1581 unsigned long flags;
1585 struct adb_request *req = NULL;
1588 /* This is a bit brutal, we can probably do better */
1589 spin_lock_irqsave(&pmu_lock, flags);
1593 /* On 68k Macs, VIA interrupts are dispatched individually.
1594 * Unless we are polling, the relevant IRQ flag has already
1598 if (IS_ENABLED(CONFIG_PPC_PMAC) || !irq) {
1599 intr = in_8(&via1[IFR]) & (SR_INT | CB1_INT);
1600 out_8(&via1[IFR], intr);
1602 #ifndef CONFIG_PPC_PMAC
1604 case IRQ_MAC_ADB_CL:
1607 case IRQ_MAC_ADB_SR:
1615 if (++nloop > 1000) {
1616 printk(KERN_DEBUG "PMU: stuck in intr loop, "
1617 "intr=%x, ier=%x pmu_state=%d\n",
1618 intr, in_8(&via1[IER]), pmu_state);
1621 if (intr & CB1_INT) {
1622 adb_int_pending = 1;
1623 pmu_irq_stats[11]++;
1625 if (intr & SR_INT) {
1626 req = pmu_sr_intr();
1630 #ifndef CONFIG_PPC_PMAC
1636 if (pmu_state == idle) {
1637 if (adb_int_pending) {
1638 if (int_data_state[0] == int_data_empty)
1640 else if (int_data_state[1] == int_data_empty)
1645 int_data_state[int_data_last] = int_data_fill;
1646 /* Sounds safer to make sure ACK is high before writing.
1647 * This helped kill a problem with ADB and some iBooks
1650 send_byte(PMU_INT_ACK);
1651 adb_int_pending = 0;
1652 } else if (current_req)
1656 /* Mark the oldest buffer for flushing */
1657 if (int_data_state[!int_data_last] == int_data_ready) {
1658 int_data_state[!int_data_last] = int_data_flush;
1659 int_data = !int_data_last;
1660 } else if (int_data_state[int_data_last] == int_data_ready) {
1661 int_data_state[int_data_last] = int_data_flush;
1662 int_data = int_data_last;
1665 spin_unlock_irqrestore(&pmu_lock, flags);
1667 /* Deal with completed PMU requests outside of the lock */
1673 /* Deal with interrupt datas outside of the lock */
1674 if (int_data >= 0) {
1675 pmu_handle_data(interrupt_data[int_data], interrupt_data_len[int_data]);
1676 spin_lock_irqsave(&pmu_lock, flags);
1678 int_data_state[int_data] = int_data_empty;
1683 return IRQ_RETVAL(handled);
1689 unsigned long flags;
1691 spin_lock_irqsave(&pmu_lock, flags);
1692 if (pmu_state == locked)
1694 adb_int_pending = 1;
1695 spin_unlock_irqrestore(&pmu_lock, flags);
1699 static __maybe_unused irqreturn_t
1700 gpio1_interrupt(int irq, void *arg)
1702 unsigned long flags;
1704 if ((in_8(gpio_reg + 0x9) & 0x02) == 0) {
1705 spin_lock_irqsave(&pmu_lock, flags);
1706 if (gpio_irq_enabled > 0) {
1707 disable_irq_nosync(gpio_irq);
1708 gpio_irq_enabled = 0;
1710 pmu_irq_stats[12]++;
1711 adb_int_pending = 1;
1712 spin_unlock_irqrestore(&pmu_lock, flags);
1713 via_pmu_interrupt(0, NULL);
1720 pmu_enable_irled(int on)
1722 struct adb_request req;
1724 if (pmu_state == uninitialized)
1726 if (pmu_kind == PMU_KEYLARGO_BASED)
1729 pmu_request(&req, NULL, 2, PMU_POWER_CTRL, PMU_POW_IRLED |
1730 (on ? PMU_POW_ON : PMU_POW_OFF));
1731 pmu_wait_complete(&req);
1734 /* Offset between Unix time (1970-based) and Mac time (1904-based) */
1735 #define RTC_OFFSET 2082844800
1737 time64_t pmu_get_time(void)
1739 struct adb_request req;
1742 if (pmu_request(&req, NULL, 1, PMU_READ_RTC) < 0)
1744 pmu_wait_complete(&req);
1745 if (req.reply_len != 4)
1746 pr_err("%s: got %d byte reply\n", __func__, req.reply_len);
1747 now = (req.reply[0] << 24) + (req.reply[1] << 16) +
1748 (req.reply[2] << 8) + req.reply[3];
1749 return (time64_t)now - RTC_OFFSET;
1752 int pmu_set_rtc_time(struct rtc_time *tm)
1755 struct adb_request req;
1757 now = lower_32_bits(rtc_tm_to_time64(tm) + RTC_OFFSET);
1758 if (pmu_request(&req, NULL, 5, PMU_SET_RTC,
1759 now >> 24, now >> 16, now >> 8, now) < 0)
1761 pmu_wait_complete(&req);
1762 if (req.reply_len != 0)
1763 pr_err("%s: got %d byte reply\n", __func__, req.reply_len);
1770 struct adb_request req;
1772 if (pmu_state == uninitialized)
1775 local_irq_disable();
1777 drop_interrupts = 1;
1779 if (pmu_kind != PMU_KEYLARGO_BASED) {
1780 pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, PMU_INT_ADB |
1782 while(!req.complete)
1786 pmu_request(&req, NULL, 1, PMU_RESET);
1787 pmu_wait_complete(&req);
1795 struct adb_request req;
1797 if (pmu_state == uninitialized)
1800 local_irq_disable();
1802 drop_interrupts = 1;
1804 if (pmu_kind != PMU_KEYLARGO_BASED) {
1805 pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, PMU_INT_ADB |
1807 pmu_wait_complete(&req);
1809 /* Disable server mode on shutdown or we'll just
1812 pmu_set_server_mode(0);
1815 pmu_request(&req, NULL, 5, PMU_SHUTDOWN,
1816 'M', 'A', 'T', 'T');
1817 pmu_wait_complete(&req);
1825 return pmu_state != uninitialized;
1828 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
1830 * Put the powerbook to sleep.
1833 static u32 save_via[8];
1834 static int __fake_sleep;
1837 save_via_state(void)
1839 save_via[0] = in_8(&via1[ANH]);
1840 save_via[1] = in_8(&via1[DIRA]);
1841 save_via[2] = in_8(&via1[B]);
1842 save_via[3] = in_8(&via1[DIRB]);
1843 save_via[4] = in_8(&via1[PCR]);
1844 save_via[5] = in_8(&via1[ACR]);
1845 save_via[6] = in_8(&via1[T1CL]);
1846 save_via[7] = in_8(&via1[T1CH]);
1849 restore_via_state(void)
1851 out_8(&via1[ANH], save_via[0]);
1852 out_8(&via1[DIRA], save_via[1]);
1853 out_8(&via1[B], save_via[2]);
1854 out_8(&via1[DIRB], save_via[3]);
1855 out_8(&via1[PCR], save_via[4]);
1856 out_8(&via1[ACR], save_via[5]);
1857 out_8(&via1[T1CL], save_via[6]);
1858 out_8(&via1[T1CH], save_via[7]);
1859 out_8(&via1[IER], IER_CLR | 0x7f); /* disable all intrs */
1860 out_8(&via1[IFR], 0x7f); /* clear IFR */
1861 out_8(&via1[IER], IER_SET | SR_INT | CB1_INT);
1864 #define GRACKLE_PM (1<<7)
1865 #define GRACKLE_DOZE (1<<5)
1866 #define GRACKLE_NAP (1<<4)
1867 #define GRACKLE_SLEEP (1<<3)
1869 static int powerbook_sleep_grackle(void)
1871 unsigned long save_l2cr;
1872 unsigned short pmcr1;
1873 struct adb_request req;
1874 struct pci_dev *grackle;
1876 grackle = pci_get_domain_bus_and_slot(0, 0, 0);
1880 /* Turn off various things. Darwin does some retry tests here... */
1881 pmu_request(&req, NULL, 2, PMU_POWER_CTRL0, PMU_POW0_OFF|PMU_POW0_HARD_DRIVE);
1882 pmu_wait_complete(&req);
1883 pmu_request(&req, NULL, 2, PMU_POWER_CTRL,
1884 PMU_POW_OFF|PMU_POW_BACKLIGHT|PMU_POW_IRLED|PMU_POW_MEDIABAY);
1885 pmu_wait_complete(&req);
1887 /* For 750, save backside cache setting and disable it */
1888 save_l2cr = _get_L2CR(); /* (returns -1 if not available) */
1890 if (!__fake_sleep) {
1891 /* Ask the PMU to put us to sleep */
1892 pmu_request(&req, NULL, 5, PMU_SLEEP, 'M', 'A', 'T', 'T');
1893 pmu_wait_complete(&req);
1896 /* The VIA is supposed not to be restored correctly*/
1898 /* We shut down some HW */
1899 pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,1);
1901 pci_read_config_word(grackle, 0x70, &pmcr1);
1902 /* Apparently, MacOS uses NAP mode for Grackle ??? */
1903 pmcr1 &= ~(GRACKLE_DOZE|GRACKLE_SLEEP);
1904 pmcr1 |= GRACKLE_PM|GRACKLE_NAP;
1905 pci_write_config_word(grackle, 0x70, pmcr1);
1907 /* Call low-level ASM sleep handler */
1911 low_sleep_handler();
1913 /* We're awake again, stop grackle PM */
1914 pci_read_config_word(grackle, 0x70, &pmcr1);
1915 pmcr1 &= ~(GRACKLE_PM|GRACKLE_DOZE|GRACKLE_SLEEP|GRACKLE_NAP);
1916 pci_write_config_word(grackle, 0x70, pmcr1);
1918 pci_dev_put(grackle);
1920 /* Make sure the PMU is idle */
1921 pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,0);
1922 restore_via_state();
1924 /* Restore L2 cache */
1925 if (save_l2cr != 0xffffffff && (save_l2cr & L2CR_L2E) != 0)
1926 _set_L2CR(save_l2cr);
1928 /* Restore userland MMU context */
1929 switch_mmu_context(NULL, current->active_mm, NULL);
1931 /* Power things up */
1933 pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, pmu_intr_mask);
1934 pmu_wait_complete(&req);
1935 pmu_request(&req, NULL, 2, PMU_POWER_CTRL0,
1936 PMU_POW0_ON|PMU_POW0_HARD_DRIVE);
1937 pmu_wait_complete(&req);
1938 pmu_request(&req, NULL, 2, PMU_POWER_CTRL,
1939 PMU_POW_ON|PMU_POW_BACKLIGHT|PMU_POW_CHARGER|PMU_POW_IRLED|PMU_POW_MEDIABAY);
1940 pmu_wait_complete(&req);
1946 powerbook_sleep_Core99(void)
1948 unsigned long save_l2cr;
1949 unsigned long save_l3cr;
1950 struct adb_request req;
1952 if (pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) < 0) {
1953 printk(KERN_ERR "Sleep mode not supported on this machine\n");
1957 if (num_online_cpus() > 1 || cpu_is_offline(0))
1960 /* Stop environment and ADB interrupts */
1961 pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, 0);
1962 pmu_wait_complete(&req);
1964 /* Tell PMU what events will wake us up */
1965 pmu_request(&req, NULL, 4, PMU_POWER_EVENTS, PMU_PWR_CLR_WAKEUP_EVENTS,
1967 pmu_wait_complete(&req);
1968 pmu_request(&req, NULL, 4, PMU_POWER_EVENTS, PMU_PWR_SET_WAKEUP_EVENTS,
1969 0, PMU_PWR_WAKEUP_KEY |
1970 (option_lid_wakeup ? PMU_PWR_WAKEUP_LID_OPEN : 0));
1971 pmu_wait_complete(&req);
1973 /* Save the state of the L2 and L3 caches */
1974 save_l3cr = _get_L3CR(); /* (returns -1 if not available) */
1975 save_l2cr = _get_L2CR(); /* (returns -1 if not available) */
1977 if (!__fake_sleep) {
1978 /* Ask the PMU to put us to sleep */
1979 pmu_request(&req, NULL, 5, PMU_SLEEP, 'M', 'A', 'T', 'T');
1980 pmu_wait_complete(&req);
1983 /* The VIA is supposed not to be restored correctly*/
1986 /* Shut down various ASICs. There's a chance that we can no longer
1987 * talk to the PMU after this, so I moved it to _after_ sending the
1988 * sleep command to it. Still need to be checked.
1990 pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 1);
1992 /* Call low-level ASM sleep handler */
1996 low_sleep_handler();
1998 /* Restore Apple core ASICs state */
1999 pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 0);
2002 restore_via_state();
2004 /* tweak LPJ before cpufreq is there */
2005 loops_per_jiffy *= 2;
2008 pmac_call_early_video_resume();
2010 /* Restore L2 cache */
2011 if (save_l2cr != 0xffffffff && (save_l2cr & L2CR_L2E) != 0)
2012 _set_L2CR(save_l2cr);
2013 /* Restore L3 cache */
2014 if (save_l3cr != 0xffffffff && (save_l3cr & L3CR_L3E) != 0)
2015 _set_L3CR(save_l3cr);
2017 /* Restore userland MMU context */
2018 switch_mmu_context(NULL, current->active_mm, NULL);
2020 /* Tell PMU we are ready */
2022 pmu_request(&req, NULL, 2, PMU_SYSTEM_READY, 2);
2023 pmu_wait_complete(&req);
2024 pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, pmu_intr_mask);
2025 pmu_wait_complete(&req);
2027 /* Restore LPJ, cpufreq will adjust the cpu frequency */
2028 loops_per_jiffy /= 2;
2033 #define PB3400_MEM_CTRL 0xf8000000
2034 #define PB3400_MEM_CTRL_SLEEP 0x70
2036 static void __iomem *pb3400_mem_ctrl;
2038 static void powerbook_sleep_init_3400(void)
2040 /* map in the memory controller registers */
2041 pb3400_mem_ctrl = ioremap(PB3400_MEM_CTRL, 0x100);
2042 if (pb3400_mem_ctrl == NULL)
2043 printk(KERN_WARNING "ioremap failed: sleep won't be possible");
2046 static int powerbook_sleep_3400(void)
2051 struct adb_request sleep_req;
2052 unsigned int __iomem *mem_ctrl_sleep;
2054 if (pb3400_mem_ctrl == NULL)
2056 mem_ctrl_sleep = pb3400_mem_ctrl + PB3400_MEM_CTRL_SLEEP;
2058 /* Set the memory controller to keep the memory refreshed
2059 while we're asleep */
2060 for (i = 0x403f; i >= 0x4000; --i) {
2061 out_be32(mem_ctrl_sleep, i);
2063 x = (in_be32(mem_ctrl_sleep) >> 16) & 0x3ff;
2069 /* Ask the PMU to put us to sleep */
2070 pmu_request(&sleep_req, NULL, 5, PMU_SLEEP, 'M', 'A', 'T', 'T');
2071 pmu_wait_complete(&sleep_req);
2074 pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 1);
2078 /* Put the CPU into sleep mode */
2079 hid0 = mfspr(SPRN_HID0);
2080 hid0 = (hid0 & ~(HID0_NAP | HID0_DOZE)) | HID0_SLEEP;
2081 mtspr(SPRN_HID0, hid0);
2083 msr = mfmsr() | MSR_POW;
2089 local_irq_disable();
2091 /* OK, we're awake again, start restoring things */
2092 out_be32(mem_ctrl_sleep, 0x3f);
2093 pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 0);
2098 #endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
2101 * Support for /dev/pmu device
2103 #define RB_SIZE 0x10
2104 struct pmu_private {
2105 struct list_head list;
2110 unsigned char data[16];
2112 wait_queue_head_t wait;
2114 #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
2115 int backlight_locker;
2119 static LIST_HEAD(all_pmu_pvt);
2120 static DEFINE_SPINLOCK(all_pvt_lock);
2123 pmu_pass_intr(unsigned char *data, int len)
2125 struct pmu_private *pp;
2126 struct list_head *list;
2128 unsigned long flags;
2130 if (len > sizeof(pp->rb_buf[0].data))
2131 len = sizeof(pp->rb_buf[0].data);
2132 spin_lock_irqsave(&all_pvt_lock, flags);
2133 for (list = &all_pmu_pvt; (list = list->next) != &all_pmu_pvt; ) {
2134 pp = list_entry(list, struct pmu_private, list);
2135 spin_lock(&pp->lock);
2139 if (i != pp->rb_get) {
2140 struct rb_entry *rp = &pp->rb_buf[pp->rb_put];
2142 memcpy(rp->data, data, len);
2144 wake_up_interruptible(&pp->wait);
2146 spin_unlock(&pp->lock);
2148 spin_unlock_irqrestore(&all_pvt_lock, flags);
2152 pmu_open(struct inode *inode, struct file *file)
2154 struct pmu_private *pp;
2155 unsigned long flags;
2157 pp = kmalloc(sizeof(struct pmu_private), GFP_KERNEL);
2160 pp->rb_get = pp->rb_put = 0;
2161 spin_lock_init(&pp->lock);
2162 init_waitqueue_head(&pp->wait);
2163 mutex_lock(&pmu_info_proc_mutex);
2164 spin_lock_irqsave(&all_pvt_lock, flags);
2165 #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
2166 pp->backlight_locker = 0;
2168 list_add(&pp->list, &all_pmu_pvt);
2169 spin_unlock_irqrestore(&all_pvt_lock, flags);
2170 file->private_data = pp;
2171 mutex_unlock(&pmu_info_proc_mutex);
2176 pmu_read(struct file *file, char __user *buf,
2177 size_t count, loff_t *ppos)
2179 struct pmu_private *pp = file->private_data;
2180 DECLARE_WAITQUEUE(wait, current);
2181 unsigned long flags;
2184 if (count < 1 || !pp)
2187 spin_lock_irqsave(&pp->lock, flags);
2188 add_wait_queue(&pp->wait, &wait);
2189 set_current_state(TASK_INTERRUPTIBLE);
2193 if (pp->rb_get != pp->rb_put) {
2195 struct rb_entry *rp = &pp->rb_buf[i];
2197 spin_unlock_irqrestore(&pp->lock, flags);
2200 if (ret > 0 && copy_to_user(buf, rp->data, ret))
2204 spin_lock_irqsave(&pp->lock, flags);
2209 if (file->f_flags & O_NONBLOCK)
2212 if (signal_pending(current))
2214 spin_unlock_irqrestore(&pp->lock, flags);
2216 spin_lock_irqsave(&pp->lock, flags);
2218 __set_current_state(TASK_RUNNING);
2219 remove_wait_queue(&pp->wait, &wait);
2220 spin_unlock_irqrestore(&pp->lock, flags);
2226 pmu_write(struct file *file, const char __user *buf,
2227 size_t count, loff_t *ppos)
2233 pmu_fpoll(struct file *filp, poll_table *wait)
2235 struct pmu_private *pp = filp->private_data;
2237 unsigned long flags;
2241 poll_wait(filp, &pp->wait, wait);
2242 spin_lock_irqsave(&pp->lock, flags);
2243 if (pp->rb_get != pp->rb_put)
2245 spin_unlock_irqrestore(&pp->lock, flags);
2250 pmu_release(struct inode *inode, struct file *file)
2252 struct pmu_private *pp = file->private_data;
2253 unsigned long flags;
2256 file->private_data = NULL;
2257 spin_lock_irqsave(&all_pvt_lock, flags);
2258 list_del(&pp->list);
2259 spin_unlock_irqrestore(&all_pvt_lock, flags);
2261 #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
2262 if (pp->backlight_locker)
2263 pmac_backlight_enable();
2271 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
2272 static void pmac_suspend_disable_irqs(void)
2274 /* Call platform functions marked "on sleep" */
2275 pmac_pfunc_i2c_suspend();
2276 pmac_pfunc_base_suspend();
2279 static int powerbook_sleep(suspend_state_t state)
2283 /* Wait for completion of async requests */
2284 while (!batt_req.complete)
2287 /* Giveup the lazy FPU & vec so we don't have to back them
2288 * up from the low level code
2292 #ifdef CONFIG_ALTIVEC
2293 if (cpu_has_feature(CPU_FTR_ALTIVEC))
2294 enable_kernel_altivec();
2295 #endif /* CONFIG_ALTIVEC */
2298 case PMU_OHARE_BASED:
2299 error = powerbook_sleep_3400();
2301 case PMU_HEATHROW_BASED:
2302 case PMU_PADDINGTON_BASED:
2303 error = powerbook_sleep_grackle();
2305 case PMU_KEYLARGO_BASED:
2306 error = powerbook_sleep_Core99();
2320 static void pmac_suspend_enable_irqs(void)
2322 /* Force a poll of ADB interrupts */
2323 adb_int_pending = 1;
2324 via_pmu_interrupt(0, NULL);
2328 /* Call platform functions marked "on wake" */
2329 pmac_pfunc_base_resume();
2330 pmac_pfunc_i2c_resume();
2333 static int pmu_sleep_valid(suspend_state_t state)
2335 return state == PM_SUSPEND_MEM
2336 && (pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, -1) >= 0);
2339 static const struct platform_suspend_ops pmu_pm_ops = {
2340 .enter = powerbook_sleep,
2341 .valid = pmu_sleep_valid,
2344 static int register_pmu_pm_ops(void)
2346 if (pmu_kind == PMU_OHARE_BASED)
2347 powerbook_sleep_init_3400();
2348 ppc_md.suspend_disable_irqs = pmac_suspend_disable_irqs;
2349 ppc_md.suspend_enable_irqs = pmac_suspend_enable_irqs;
2350 suspend_set_ops(&pmu_pm_ops);
2355 device_initcall(register_pmu_pm_ops);
2358 static int pmu_ioctl(struct file *filp,
2359 u_int cmd, u_long arg)
2361 __u32 __user *argp = (__u32 __user *)arg;
2362 int error = -EINVAL;
2365 #ifdef CONFIG_PPC_PMAC
2367 if (!capable(CAP_SYS_ADMIN))
2369 return pm_suspend(PM_SUSPEND_MEM);
2370 case PMU_IOC_CAN_SLEEP:
2371 if (pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, -1) < 0)
2372 return put_user(0, argp);
2374 return put_user(1, argp);
2377 #ifdef CONFIG_PMAC_BACKLIGHT_LEGACY
2378 /* Compatibility ioctl's for backlight */
2379 case PMU_IOC_GET_BACKLIGHT:
2383 brightness = pmac_backlight_get_legacy_brightness();
2387 return put_user(brightness, argp);
2390 case PMU_IOC_SET_BACKLIGHT:
2394 error = get_user(brightness, argp);
2398 return pmac_backlight_set_legacy_brightness(brightness);
2400 #ifdef CONFIG_INPUT_ADBHID
2401 case PMU_IOC_GRAB_BACKLIGHT: {
2402 struct pmu_private *pp = filp->private_data;
2404 if (pp->backlight_locker)
2407 pp->backlight_locker = 1;
2408 pmac_backlight_disable();
2412 #endif /* CONFIG_INPUT_ADBHID */
2413 #endif /* CONFIG_PMAC_BACKLIGHT_LEGACY */
2415 case PMU_IOC_GET_MODEL:
2416 return put_user(pmu_kind, argp);
2417 case PMU_IOC_HAS_ADB:
2418 return put_user(pmu_has_adb, argp);
2423 static long pmu_unlocked_ioctl(struct file *filp,
2424 u_int cmd, u_long arg)
2428 mutex_lock(&pmu_info_proc_mutex);
2429 ret = pmu_ioctl(filp, cmd, arg);
2430 mutex_unlock(&pmu_info_proc_mutex);
2435 #ifdef CONFIG_COMPAT
2436 #define PMU_IOC_GET_BACKLIGHT32 _IOR('B', 1, compat_size_t)
2437 #define PMU_IOC_SET_BACKLIGHT32 _IOW('B', 2, compat_size_t)
2438 #define PMU_IOC_GET_MODEL32 _IOR('B', 3, compat_size_t)
2439 #define PMU_IOC_HAS_ADB32 _IOR('B', 4, compat_size_t)
2440 #define PMU_IOC_CAN_SLEEP32 _IOR('B', 5, compat_size_t)
2441 #define PMU_IOC_GRAB_BACKLIGHT32 _IOR('B', 6, compat_size_t)
2443 static long compat_pmu_ioctl (struct file *filp, u_int cmd, u_long arg)
2448 case PMU_IOC_GET_BACKLIGHT32:
2449 cmd = PMU_IOC_GET_BACKLIGHT;
2451 case PMU_IOC_SET_BACKLIGHT32:
2452 cmd = PMU_IOC_SET_BACKLIGHT;
2454 case PMU_IOC_GET_MODEL32:
2455 cmd = PMU_IOC_GET_MODEL;
2457 case PMU_IOC_HAS_ADB32:
2458 cmd = PMU_IOC_HAS_ADB;
2460 case PMU_IOC_CAN_SLEEP32:
2461 cmd = PMU_IOC_CAN_SLEEP;
2463 case PMU_IOC_GRAB_BACKLIGHT32:
2464 cmd = PMU_IOC_GRAB_BACKLIGHT;
2467 return -ENOIOCTLCMD;
2469 return pmu_unlocked_ioctl(filp, cmd, (unsigned long)compat_ptr(arg));
2473 static const struct file_operations pmu_device_fops = {
2477 .unlocked_ioctl = pmu_unlocked_ioctl,
2478 #ifdef CONFIG_COMPAT
2479 .compat_ioctl = compat_pmu_ioctl,
2482 .release = pmu_release,
2483 .llseek = noop_llseek,
2486 static struct miscdevice pmu_device = {
2487 PMU_MINOR, "pmu", &pmu_device_fops
2490 static int pmu_device_init(void)
2492 if (pmu_state == uninitialized)
2494 if (misc_register(&pmu_device) < 0)
2495 printk(KERN_ERR "via-pmu: cannot register misc device.\n");
2498 device_initcall(pmu_device_init);
2503 polled_handshake(void)
2505 via2[B] &= ~TREQ; eieio();
2506 while ((via2[B] & TACK) != 0)
2508 via2[B] |= TREQ; eieio();
2509 while ((via2[B] & TACK) == 0)
2514 polled_send_byte(int x)
2516 via1[ACR] |= SR_OUT | SR_EXT; eieio();
2517 via1[SR] = x; eieio();
2522 polled_recv_byte(void)
2526 via1[ACR] = (via1[ACR] & ~SR_OUT) | SR_EXT; eieio();
2527 x = via1[SR]; eieio();
2529 x = via1[SR]; eieio();
2534 pmu_polled_request(struct adb_request *req)
2536 unsigned long flags;
2541 l = pmu_data_len[c][0];
2542 if (l >= 0 && req->nbytes != l + 1)
2545 local_irq_save(flags);
2546 while (pmu_state != idle)
2549 while ((via2[B] & TACK) == 0)
2551 polled_send_byte(c);
2553 l = req->nbytes - 1;
2554 polled_send_byte(l);
2556 for (i = 1; i <= l; ++i)
2557 polled_send_byte(req->data[i]);
2559 l = pmu_data_len[c][1];
2561 l = polled_recv_byte();
2562 for (i = 0; i < l; ++i)
2563 req->reply[i + req->reply_len] = polled_recv_byte();
2568 local_irq_restore(flags);
2572 /* N.B. This doesn't work on the 3400 */
2573 void pmu_blink(int n)
2575 struct adb_request req;
2577 memset(&req, 0, sizeof(req));
2579 for (; n > 0; --n) {
2586 req.reply[0] = ADB_RET_OK;
2588 req.reply_expected = 0;
2589 pmu_polled_request(&req);
2597 req.reply[0] = ADB_RET_OK;
2599 req.reply_expected = 0;
2600 pmu_polled_request(&req);
2605 #endif /* DEBUG_SLEEP */
2607 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
2608 int pmu_sys_suspended;
2610 static int pmu_syscore_suspend(void)
2612 /* Suspend PMU event interrupts */
2614 pmu_sys_suspended = 1;
2616 #ifdef CONFIG_PMAC_BACKLIGHT
2617 /* Tell backlight code not to muck around with the chip anymore */
2618 pmu_backlight_set_sleep(1);
2624 static void pmu_syscore_resume(void)
2626 struct adb_request req;
2628 if (!pmu_sys_suspended)
2631 /* Tell PMU we are ready */
2632 pmu_request(&req, NULL, 2, PMU_SYSTEM_READY, 2);
2633 pmu_wait_complete(&req);
2635 #ifdef CONFIG_PMAC_BACKLIGHT
2636 /* Tell backlight code it can use the chip again */
2637 pmu_backlight_set_sleep(0);
2639 /* Resume PMU event interrupts */
2641 pmu_sys_suspended = 0;
2644 static struct syscore_ops pmu_syscore_ops = {
2645 .suspend = pmu_syscore_suspend,
2646 .resume = pmu_syscore_resume,
2649 static int pmu_syscore_register(void)
2651 register_syscore_ops(&pmu_syscore_ops);
2655 subsys_initcall(pmu_syscore_register);
2656 #endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
2658 EXPORT_SYMBOL(pmu_request);
2659 EXPORT_SYMBOL(pmu_queue_request);
2660 EXPORT_SYMBOL(pmu_poll);
2661 EXPORT_SYMBOL(pmu_poll_adb);
2662 EXPORT_SYMBOL(pmu_wait_complete);
2663 EXPORT_SYMBOL(pmu_suspend);
2664 EXPORT_SYMBOL(pmu_resume);
2665 EXPORT_SYMBOL(pmu_unlock);
2666 #if defined(CONFIG_PPC32)
2667 EXPORT_SYMBOL(pmu_enable_irled);
2668 EXPORT_SYMBOL(pmu_battery_count);
2669 EXPORT_SYMBOL(pmu_batteries);
2670 EXPORT_SYMBOL(pmu_power_flags);
2671 #endif /* CONFIG_SUSPEND && CONFIG_PPC32 */