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
293 if (pmu_state != uninitialized)
295 vias = of_find_node_by_name(NULL, "via-pmu");
299 err = of_address_to_resource(vias, 0, &res);
301 printk(KERN_ERR "via-pmu: Error getting \"reg\" property !\n");
308 pmu_intr_mask = PMU_INT_PCEJECT |
313 if (of_node_name_eq(vias->parent, "ohare") ||
314 of_device_is_compatible(vias->parent, "ohare"))
315 pmu_kind = PMU_OHARE_BASED;
316 else if (of_device_is_compatible(vias->parent, "paddington"))
317 pmu_kind = PMU_PADDINGTON_BASED;
318 else if (of_device_is_compatible(vias->parent, "heathrow"))
319 pmu_kind = PMU_HEATHROW_BASED;
320 else if (of_device_is_compatible(vias->parent, "Keylargo")
321 || of_device_is_compatible(vias->parent, "K2-Keylargo")) {
322 struct device_node *gpiop;
323 struct device_node *adbp;
325 pmu_kind = PMU_KEYLARGO_BASED;
326 adbp = of_find_node_by_type(NULL, "adb");
327 pmu_has_adb = (adbp != NULL);
329 pmu_intr_mask = PMU_INT_PCEJECT |
335 gpiop = of_find_node_by_name(NULL, "gpio");
337 if (!of_address_to_resource(gpiop, 0, &res))
338 gpio_reg = ioremap(res.start, 0x10);
341 if (gpio_reg == NULL) {
342 printk(KERN_ERR "via-pmu: Can't find GPIO reg !\n");
346 pmu_kind = PMU_UNKNOWN;
348 via1 = via2 = ioremap(taddr, 0x2000);
350 printk(KERN_ERR "via-pmu: Can't map address !\n");
354 out_8(&via1[IER], IER_CLR | 0x7f); /* disable all intrs */
355 out_8(&via1[IFR], 0x7f); /* clear IFR */
362 sys_ctrler = SYS_CTRLER_PMU;
375 pmu_state = uninitialized;
378 if (macintosh_config->adb_type != MAC_ADB_PB2)
381 pmu_kind = PMU_UNKNOWN;
385 pmu_intr_mask = PMU_INT_PCEJECT |
393 pmu_state = uninitialized;
398 #endif /* !CONFIG_PPC_PMAC */
402 static int pmu_probe(void)
404 return pmu_state == uninitialized ? -ENODEV : 0;
407 static int pmu_init(void)
409 return pmu_state == uninitialized ? -ENODEV : 0;
411 #endif /* CONFIG_ADB */
414 * We can't wait until pmu_init gets called, that happens too late.
415 * It happens after IDE and SCSI initialization, which can take a few
416 * seconds, and by that time the PMU could have given up on us and
418 * Thus this is called with arch_initcall rather than device_initcall.
420 static int __init via_pmu_start(void)
422 unsigned int __maybe_unused irq;
424 if (pmu_state == uninitialized)
427 batt_req.complete = 1;
429 #ifdef CONFIG_PPC_PMAC
430 irq = irq_of_parse_and_map(vias, 0);
432 printk(KERN_ERR "via-pmu: can't map interrupt\n");
435 /* We set IRQF_NO_SUSPEND because we don't want the interrupt
436 * to be disabled between the 2 passes of driver suspend, we
437 * control our own disabling for that one
439 if (request_irq(irq, via_pmu_interrupt, IRQF_NO_SUSPEND,
440 "VIA-PMU", (void *)0)) {
441 printk(KERN_ERR "via-pmu: can't request irq %d\n", irq);
445 if (pmu_kind == PMU_KEYLARGO_BASED) {
446 gpio_node = of_find_node_by_name(NULL, "extint-gpio1");
447 if (gpio_node == NULL)
448 gpio_node = of_find_node_by_name(NULL,
451 gpio_irq = irq_of_parse_and_map(gpio_node, 0);
454 if (request_irq(gpio_irq, gpio1_interrupt,
455 IRQF_NO_SUSPEND, "GPIO1 ADB",
457 printk(KERN_ERR "pmu: can't get irq %d"
458 " (GPIO1)\n", gpio_irq);
460 gpio_irq_enabled = 1;
464 /* Enable interrupts */
465 out_8(&via1[IER], IER_SET | SR_INT | CB1_INT);
467 if (request_irq(IRQ_MAC_ADB_SR, via_pmu_interrupt, IRQF_NO_SUSPEND,
468 "VIA-PMU-SR", NULL)) {
469 pr_err("%s: couldn't get SR irq\n", __func__);
472 if (request_irq(IRQ_MAC_ADB_CL, via_pmu_interrupt, IRQF_NO_SUSPEND,
473 "VIA-PMU-CL", NULL)) {
474 pr_err("%s: couldn't get CL irq\n", __func__);
475 free_irq(IRQ_MAC_ADB_SR, NULL);
478 #endif /* !CONFIG_PPC_PMAC */
480 pmu_fully_inited = 1;
482 /* Make sure PMU settle down before continuing. This is _very_ important
483 * since the IDE probe may shut interrupts down for quite a bit of time. If
484 * a PMU communication is pending while this happens, the PMU may timeout
485 * Not that on Core99 machines, the PMU keeps sending us environement
486 * messages, we should find a way to either fix IDE or make it call
487 * pmu_suspend() before masking interrupts. This can also happens while
488 * scolling with some fbdevs.
492 } while (pmu_state != idle);
497 arch_initcall(via_pmu_start);
500 * This has to be done after pci_init, which is a subsys_initcall.
502 static int __init via_pmu_dev_init(void)
504 if (pmu_state == uninitialized)
507 #ifdef CONFIG_PMAC_BACKLIGHT
508 /* Initialize backlight */
509 pmu_backlight_init();
513 if (of_machine_is_compatible("AAPL,3400/2400") ||
514 of_machine_is_compatible("AAPL,3500")) {
515 int mb = pmac_call_feature(PMAC_FTR_GET_MB_INFO,
516 NULL, PMAC_MB_INFO_MODEL, 0);
517 pmu_battery_count = 1;
518 if (mb == PMAC_TYPE_COMET)
519 pmu_batteries[0].flags |= PMU_BATT_TYPE_COMET;
521 pmu_batteries[0].flags |= PMU_BATT_TYPE_HOOPER;
522 } else if (of_machine_is_compatible("AAPL,PowerBook1998") ||
523 of_machine_is_compatible("PowerBook1,1")) {
524 pmu_battery_count = 2;
525 pmu_batteries[0].flags |= PMU_BATT_TYPE_SMART;
526 pmu_batteries[1].flags |= PMU_BATT_TYPE_SMART;
528 struct device_node* prim =
529 of_find_node_by_name(NULL, "power-mgt");
530 const u32 *prim_info = NULL;
532 prim_info = of_get_property(prim, "prim-info", NULL);
534 /* Other stuffs here yet unknown */
535 pmu_battery_count = (prim_info[6] >> 16) & 0xff;
536 pmu_batteries[0].flags |= PMU_BATT_TYPE_SMART;
537 if (pmu_battery_count > 1)
538 pmu_batteries[1].flags |= PMU_BATT_TYPE_SMART;
542 #endif /* CONFIG_PPC32 */
544 /* Create /proc/pmu */
545 proc_pmu_root = proc_mkdir("pmu", NULL);
549 for (i=0; i<pmu_battery_count; i++) {
551 sprintf(title, "battery_%ld", i);
552 proc_pmu_batt[i] = proc_create_single_data(title, 0,
553 proc_pmu_root, pmu_battery_proc_show,
557 proc_pmu_info = proc_create_single("info", 0, proc_pmu_root,
559 proc_pmu_irqstats = proc_create_single("interrupts", 0,
560 proc_pmu_root, pmu_irqstats_proc_show);
561 proc_pmu_options = proc_create("options", 0600, proc_pmu_root,
562 &pmu_options_proc_ops);
567 device_initcall(via_pmu_dev_init);
573 struct adb_request req;
575 /* Negate TREQ. Set TACK to input and TREQ to output. */
576 out_8(&via2[B], in_8(&via2[B]) | TREQ);
577 out_8(&via2[DIRB], (in_8(&via2[DIRB]) | TREQ) & ~TACK);
579 pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, pmu_intr_mask);
581 while (!req.complete) {
583 printk(KERN_ERR "init_pmu: no response from PMU\n");
590 /* ack all pending interrupts */
592 interrupt_data[0][0] = 1;
593 while (interrupt_data[0][0] || pmu_state != idle) {
595 printk(KERN_ERR "init_pmu: timed out acking intrs\n");
598 if (pmu_state == idle)
600 via_pmu_interrupt(0, NULL);
604 /* Tell PMU we are ready. */
605 if (pmu_kind == PMU_KEYLARGO_BASED) {
606 pmu_request(&req, NULL, 2, PMU_SYSTEM_READY, 2);
607 while (!req.complete)
611 /* Read PMU version */
612 pmu_request(&req, NULL, 1, PMU_GET_VERSION);
613 pmu_wait_complete(&req);
614 if (req.reply_len > 0)
615 pmu_version = req.reply[0];
617 /* Read server mode setting */
618 if (pmu_kind == PMU_KEYLARGO_BASED) {
619 pmu_request(&req, NULL, 2, PMU_POWER_EVENTS,
620 PMU_PWR_GET_POWERUP_EVENTS);
621 pmu_wait_complete(&req);
622 if (req.reply_len == 2) {
623 if (req.reply[1] & PMU_PWR_WAKEUP_AC_INSERT)
624 option_server_mode = 1;
625 printk(KERN_INFO "via-pmu: Server Mode is %s\n",
626 option_server_mode ? "enabled" : "disabled");
630 printk(KERN_INFO "PMU driver v%d initialized for %s, firmware: %02x\n",
631 PMU_DRIVER_VERSION, pbook_type[pmu_kind], pmu_version);
642 static void pmu_set_server_mode(int server_mode)
644 struct adb_request req;
646 if (pmu_kind != PMU_KEYLARGO_BASED)
649 option_server_mode = server_mode;
650 pmu_request(&req, NULL, 2, PMU_POWER_EVENTS, PMU_PWR_GET_POWERUP_EVENTS);
651 pmu_wait_complete(&req);
652 if (req.reply_len < 2)
655 pmu_request(&req, NULL, 4, PMU_POWER_EVENTS,
656 PMU_PWR_SET_POWERUP_EVENTS,
657 req.reply[0], PMU_PWR_WAKEUP_AC_INSERT);
659 pmu_request(&req, NULL, 4, PMU_POWER_EVENTS,
660 PMU_PWR_CLR_POWERUP_EVENTS,
661 req.reply[0], PMU_PWR_WAKEUP_AC_INSERT);
662 pmu_wait_complete(&req);
665 /* This new version of the code for 2400/3400/3500 powerbooks
666 * is inspired from the implementation in gkrellm-pmu
669 done_battery_state_ohare(struct adb_request* req)
671 #ifdef CONFIG_PPC_PMAC
674 * 0x01 : AC indicator
676 * 0x04 : battery exist
679 * 0x20 : full charged
680 * 0x40 : pcharge reset
681 * 0x80 : battery exist
683 * [1][2] : battery voltage
684 * [3] : CPU temperature
685 * [4] : battery temperature
690 unsigned int bat_flags = PMU_BATT_TYPE_HOOPER;
691 long pcharge, charge, vb, vmax, lmax;
692 long vmax_charging, vmax_charged;
693 long amperage, voltage, time, max;
694 int mb = pmac_call_feature(PMAC_FTR_GET_MB_INFO,
695 NULL, PMAC_MB_INFO_MODEL, 0);
697 if (req->reply[0] & 0x01)
698 pmu_power_flags |= PMU_PWR_AC_PRESENT;
700 pmu_power_flags &= ~PMU_PWR_AC_PRESENT;
702 if (mb == PMAC_TYPE_COMET) {
713 /* If battery installed */
714 if (req->reply[0] & 0x04) {
715 bat_flags |= PMU_BATT_PRESENT;
716 if (req->reply[0] & 0x02)
717 bat_flags |= PMU_BATT_CHARGING;
718 vb = (req->reply[1] << 8) | req->reply[2];
719 voltage = (vb * 265 + 72665) / 10;
720 amperage = req->reply[5];
721 if ((req->reply[0] & 0x01) == 0) {
723 vb += ((amperage - 200) * 15)/100;
724 } else if (req->reply[0] & 0x02) {
725 vb = (vb * 97) / 100;
726 vmax = vmax_charging;
728 charge = (100 * vb) / vmax;
729 if (req->reply[0] & 0x40) {
730 pcharge = (req->reply[6] << 8) + req->reply[7];
734 pcharge = 100 - pcharge / lmax;
735 if (pcharge < charge)
739 time = (charge * 16440) / amperage;
743 amperage = -amperage;
745 charge = max = amperage = voltage = time = 0;
747 pmu_batteries[pmu_cur_battery].flags = bat_flags;
748 pmu_batteries[pmu_cur_battery].charge = charge;
749 pmu_batteries[pmu_cur_battery].max_charge = max;
750 pmu_batteries[pmu_cur_battery].amperage = amperage;
751 pmu_batteries[pmu_cur_battery].voltage = voltage;
752 pmu_batteries[pmu_cur_battery].time_remaining = time;
753 #endif /* CONFIG_PPC_PMAC */
755 clear_bit(0, &async_req_locks);
759 done_battery_state_smart(struct adb_request* req)
762 * [0] : format of this structure (known: 3,4,5)
775 * [4][5] : max charge
780 unsigned int bat_flags = PMU_BATT_TYPE_SMART;
782 unsigned int capa, max, voltage;
784 if (req->reply[1] & 0x01)
785 pmu_power_flags |= PMU_PWR_AC_PRESENT;
787 pmu_power_flags &= ~PMU_PWR_AC_PRESENT;
790 capa = max = amperage = voltage = 0;
792 if (req->reply[1] & 0x04) {
793 bat_flags |= PMU_BATT_PRESENT;
794 switch(req->reply[0]) {
796 case 4: capa = req->reply[2];
798 amperage = *((signed char *)&req->reply[4]);
799 voltage = req->reply[5];
801 case 5: capa = (req->reply[2] << 8) | req->reply[3];
802 max = (req->reply[4] << 8) | req->reply[5];
803 amperage = *((signed short *)&req->reply[6]);
804 voltage = (req->reply[8] << 8) | req->reply[9];
807 pr_warn("pmu.c: unrecognized battery info, "
808 "len: %d, %4ph\n", req->reply_len,
814 if ((req->reply[1] & 0x01) && (amperage > 0))
815 bat_flags |= PMU_BATT_CHARGING;
817 pmu_batteries[pmu_cur_battery].flags = bat_flags;
818 pmu_batteries[pmu_cur_battery].charge = capa;
819 pmu_batteries[pmu_cur_battery].max_charge = max;
820 pmu_batteries[pmu_cur_battery].amperage = amperage;
821 pmu_batteries[pmu_cur_battery].voltage = voltage;
823 if ((req->reply[1] & 0x01) && (amperage > 0))
824 pmu_batteries[pmu_cur_battery].time_remaining
825 = ((max-capa) * 3600) / amperage;
827 pmu_batteries[pmu_cur_battery].time_remaining
828 = (capa * 3600) / (-amperage);
830 pmu_batteries[pmu_cur_battery].time_remaining = 0;
832 pmu_cur_battery = (pmu_cur_battery + 1) % pmu_battery_count;
834 clear_bit(0, &async_req_locks);
838 query_battery_state(void)
840 if (test_and_set_bit(0, &async_req_locks))
842 if (pmu_kind == PMU_OHARE_BASED)
843 pmu_request(&batt_req, done_battery_state_ohare,
844 1, PMU_BATTERY_STATE);
846 pmu_request(&batt_req, done_battery_state_smart,
847 2, PMU_SMART_BATTERY_STATE, pmu_cur_battery+1);
850 #ifdef CONFIG_PROC_FS
851 static int pmu_info_proc_show(struct seq_file *m, void *v)
853 seq_printf(m, "PMU driver version : %d\n", PMU_DRIVER_VERSION);
854 seq_printf(m, "PMU firmware version : %02x\n", pmu_version);
855 seq_printf(m, "AC Power : %d\n",
856 ((pmu_power_flags & PMU_PWR_AC_PRESENT) != 0) || pmu_battery_count == 0);
857 seq_printf(m, "Battery count : %d\n", pmu_battery_count);
862 static int pmu_irqstats_proc_show(struct seq_file *m, void *v)
865 static const char *irq_names[NUM_IRQ_STATS] = {
866 "Unknown interrupt (type 0)",
867 "Unknown interrupt (type 1)",
868 "PC-Card eject button",
869 "Sound/Brightness button",
871 "Battery state change",
872 "Environment interrupt",
874 "Ghost interrupt (zero len)",
875 "Empty interrupt (empty mask)",
877 "Total CB1 triggered events",
878 "Total GPIO1 triggered events",
881 for (i = 0; i < NUM_IRQ_STATS; i++) {
882 seq_printf(m, " %2u: %10u (%s)\n",
883 i, pmu_irq_stats[i], irq_names[i]);
888 static int pmu_battery_proc_show(struct seq_file *m, void *v)
890 long batnum = (long)m->private;
893 seq_printf(m, "flags : %08x\n", pmu_batteries[batnum].flags);
894 seq_printf(m, "charge : %d\n", pmu_batteries[batnum].charge);
895 seq_printf(m, "max_charge : %d\n", pmu_batteries[batnum].max_charge);
896 seq_printf(m, "current : %d\n", pmu_batteries[batnum].amperage);
897 seq_printf(m, "voltage : %d\n", pmu_batteries[batnum].voltage);
898 seq_printf(m, "time rem. : %d\n", pmu_batteries[batnum].time_remaining);
902 static int pmu_options_proc_show(struct seq_file *m, void *v)
904 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
905 if (pmu_kind == PMU_KEYLARGO_BASED &&
906 pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0)
907 seq_printf(m, "lid_wakeup=%d\n", option_lid_wakeup);
909 if (pmu_kind == PMU_KEYLARGO_BASED)
910 seq_printf(m, "server_mode=%d\n", option_server_mode);
915 static int pmu_options_proc_open(struct inode *inode, struct file *file)
917 return single_open(file, pmu_options_proc_show, NULL);
920 static ssize_t pmu_options_proc_write(struct file *file,
921 const char __user *buffer, size_t count, loff_t *pos)
925 size_t fcount = count;
931 if (copy_from_user(tmp, buffer, count))
939 while(*val && (*val != '=')) {
949 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
950 if (pmu_kind == PMU_KEYLARGO_BASED &&
951 pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0)
952 if (!strcmp(label, "lid_wakeup"))
953 option_lid_wakeup = ((*val) == '1');
955 if (pmu_kind == PMU_KEYLARGO_BASED && !strcmp(label, "server_mode")) {
957 new_value = ((*val) == '1');
958 if (new_value != option_server_mode)
959 pmu_set_server_mode(new_value);
964 static const struct proc_ops pmu_options_proc_ops = {
965 .proc_open = pmu_options_proc_open,
966 .proc_read = seq_read,
967 .proc_lseek = seq_lseek,
968 .proc_release = single_release,
969 .proc_write = pmu_options_proc_write,
974 /* Send an ADB command */
975 static int pmu_send_request(struct adb_request *req, int sync)
979 if (pmu_state == uninitialized || !pmu_fully_inited) {
986 switch (req->data[0]) {
988 for (i = 0; i < req->nbytes - 1; ++i)
989 req->data[i] = req->data[i+1];
991 if (pmu_data_len[req->data[0]][1] != 0) {
992 req->reply[0] = ADB_RET_OK;
996 ret = pmu_queue_request(req);
999 switch (req->data[1]) {
1001 if (req->nbytes != 2)
1003 req->data[0] = PMU_READ_RTC;
1006 req->reply[0] = CUDA_PACKET;
1008 req->reply[2] = CUDA_GET_TIME;
1009 ret = pmu_queue_request(req);
1012 if (req->nbytes != 6)
1014 req->data[0] = PMU_SET_RTC;
1016 for (i = 1; i <= 4; ++i)
1017 req->data[i] = req->data[i+1];
1019 req->reply[0] = CUDA_PACKET;
1021 req->reply[2] = CUDA_SET_TIME;
1022 ret = pmu_queue_request(req);
1029 for (i = req->nbytes - 1; i > 1; --i)
1030 req->data[i+2] = req->data[i];
1031 req->data[3] = req->nbytes - 2;
1032 req->data[2] = pmu_adb_flags;
1033 /*req->data[1] = req->data[1];*/
1034 req->data[0] = PMU_ADB_CMD;
1036 req->reply_expected = 1;
1038 ret = pmu_queue_request(req);
1047 while (!req->complete)
1053 /* Enable/disable autopolling */
1054 static int __pmu_adb_autopoll(int devs)
1056 struct adb_request req;
1059 pmu_request(&req, NULL, 5, PMU_ADB_CMD, 0, 0x86,
1060 adb_dev_map >> 8, adb_dev_map);
1063 pmu_request(&req, NULL, 1, PMU_ADB_POLL_OFF);
1066 while (!req.complete)
1071 static int pmu_adb_autopoll(int devs)
1073 if (pmu_state == uninitialized || !pmu_fully_inited || !pmu_has_adb)
1077 return __pmu_adb_autopoll(devs);
1080 /* Reset the ADB bus */
1081 static int pmu_adb_reset_bus(void)
1083 struct adb_request req;
1084 int save_autopoll = adb_dev_map;
1086 if (pmu_state == uninitialized || !pmu_fully_inited || !pmu_has_adb)
1089 /* anyone got a better idea?? */
1090 __pmu_adb_autopoll(0);
1094 req.data[0] = PMU_ADB_CMD;
1095 req.data[1] = ADB_BUSRESET;
1100 req.reply_expected = 1;
1101 if (pmu_queue_request(&req) != 0) {
1102 printk(KERN_ERR "pmu_adb_reset_bus: pmu_queue_request failed\n");
1105 pmu_wait_complete(&req);
1107 if (save_autopoll != 0)
1108 __pmu_adb_autopoll(save_autopoll);
1112 #endif /* CONFIG_ADB */
1114 /* Construct and send a pmu request */
1116 pmu_request(struct adb_request *req, void (*done)(struct adb_request *),
1122 if (pmu_state == uninitialized)
1125 if (nbytes < 0 || nbytes > 32) {
1126 printk(KERN_ERR "pmu_request: bad nbytes (%d)\n", nbytes);
1130 req->nbytes = nbytes;
1132 va_start(list, nbytes);
1133 for (i = 0; i < nbytes; ++i)
1134 req->data[i] = va_arg(list, int);
1137 req->reply_expected = 0;
1138 return pmu_queue_request(req);
1142 pmu_queue_request(struct adb_request *req)
1144 unsigned long flags;
1147 if (pmu_state == uninitialized) {
1151 if (req->nbytes <= 0) {
1155 nsend = pmu_data_len[req->data[0]][0];
1156 if (nsend >= 0 && req->nbytes != nsend + 1) {
1165 spin_lock_irqsave(&pmu_lock, flags);
1167 last_req->next = req;
1172 if (pmu_state == idle)
1175 spin_unlock_irqrestore(&pmu_lock, flags);
1183 /* Sightly increased the delay, I had one occurrence of the message
1187 while ((in_8(&via2[B]) & TACK) == 0) {
1188 if (--timeout < 0) {
1189 printk(KERN_ERR "PMU not responding (!ack)\n");
1196 /* New PMU seems to be very sensitive to those timings, so we make sure
1197 * PCI is flushed immediately */
1201 out_8(&via1[ACR], in_8(&via1[ACR]) | SR_OUT | SR_EXT);
1202 out_8(&via1[SR], x);
1203 out_8(&via2[B], in_8(&via2[B]) & ~TREQ); /* assert TREQ */
1204 (void)in_8(&via2[B]);
1210 out_8(&via1[ACR], (in_8(&via1[ACR]) & ~SR_OUT) | SR_EXT);
1211 in_8(&via1[SR]); /* resets SR */
1212 out_8(&via2[B], in_8(&via2[B]) & ~TREQ);
1213 (void)in_8(&via2[B]);
1217 pmu_done(struct adb_request *req)
1219 void (*done)(struct adb_request *) = req->done;
1222 /* Here, we assume that if the request has a done member, the
1223 * struct request will survive to setting req->complete to 1
1232 struct adb_request *req;
1234 /* assert pmu_state == idle */
1235 /* get the packet to send */
1237 if (!req || pmu_state != idle
1238 || (/*req->reply_expected && */req_awaiting_reply))
1241 pmu_state = sending;
1243 data_len = pmu_data_len[req->data[0]][0];
1245 /* Sounds safer to make sure ACK is high before writing. This helped
1246 * kill a problem with ADB and some iBooks
1249 /* set the shift register to shift out and send a byte */
1250 send_byte(req->data[0]);
1256 if (pmu_state == uninitialized)
1260 via_pmu_interrupt(0, NULL);
1266 if (pmu_state == uninitialized)
1270 /* Kicks ADB read when PMU is suspended */
1271 adb_int_pending = 1;
1273 via_pmu_interrupt(0, NULL);
1274 } while (pmu_suspended && (adb_int_pending || pmu_state != idle
1275 || req_awaiting_reply));
1279 pmu_wait_complete(struct adb_request *req)
1281 if (pmu_state == uninitialized)
1283 while((pmu_state != idle && pmu_state != locked) || !req->complete)
1284 via_pmu_interrupt(0, NULL);
1287 /* This function loops until the PMU is idle and prevents it from
1288 * anwsering to ADB interrupts. pmu_request can still be called.
1289 * This is done to avoid spurrious shutdowns when we know we'll have
1290 * interrupts switched off for a long time
1295 unsigned long flags;
1297 if (pmu_state == uninitialized)
1300 spin_lock_irqsave(&pmu_lock, flags);
1302 if (pmu_suspended > 1) {
1303 spin_unlock_irqrestore(&pmu_lock, flags);
1308 spin_unlock_irqrestore(&pmu_lock, flags);
1309 if (req_awaiting_reply)
1310 adb_int_pending = 1;
1311 via_pmu_interrupt(0, NULL);
1312 spin_lock_irqsave(&pmu_lock, flags);
1313 if (!adb_int_pending && pmu_state == idle && !req_awaiting_reply) {
1315 disable_irq_nosync(gpio_irq);
1316 out_8(&via1[IER], CB1_INT | IER_CLR);
1317 spin_unlock_irqrestore(&pmu_lock, flags);
1326 unsigned long flags;
1328 if (pmu_state == uninitialized || pmu_suspended < 1)
1331 spin_lock_irqsave(&pmu_lock, flags);
1333 if (pmu_suspended > 0) {
1334 spin_unlock_irqrestore(&pmu_lock, flags);
1337 adb_int_pending = 1;
1339 enable_irq(gpio_irq);
1340 out_8(&via1[IER], CB1_INT | IER_SET);
1341 spin_unlock_irqrestore(&pmu_lock, flags);
1345 /* Interrupt data could be the result data from an ADB cmd */
1347 pmu_handle_data(unsigned char *data, int len)
1354 if (drop_interrupts || len < 1) {
1355 adb_int_pending = 0;
1360 /* Get PMU interrupt mask */
1363 /* Record zero interrupts for stats */
1367 /* Hack to deal with ADB autopoll flag */
1368 if (ints & PMU_INT_ADB)
1369 ints &= ~(PMU_INT_ADB_AUTO | PMU_INT_AUTO_SRQ_POLL);
1373 if (i > pmu_irq_stats[10])
1374 pmu_irq_stats[10] = i;
1379 idx = ffs(ints) - 1;
1382 pmu_irq_stats[idx]++;
1384 /* Note: for some reason, we get an interrupt with len=1,
1385 * data[0]==0 after each normal ADB interrupt, at least
1386 * on the Pismo. Still investigating... --BenH
1390 if ((data[0] & PMU_INT_ADB_AUTO) == 0) {
1391 struct adb_request *req = req_awaiting_reply;
1393 printk(KERN_ERR "PMU: extra ADB reply\n");
1396 req_awaiting_reply = NULL;
1400 memcpy(req->reply, data + 1, len - 1);
1401 req->reply_len = len - 1;
1406 if (len == 4 && data[1] == 0x2c) {
1407 extern int xmon_wants_key, xmon_adb_keycode;
1408 if (xmon_wants_key) {
1409 xmon_adb_keycode = data[2];
1413 #endif /* CONFIG_XMON */
1416 * XXX On the [23]400 the PMU gives us an up
1417 * event for keycodes 0x74 or 0x75 when the PC
1418 * card eject buttons are released, so we
1419 * ignore those events.
1421 if (!(pmu_kind == PMU_OHARE_BASED && len == 4
1422 && data[1] == 0x2c && data[3] == 0xff
1423 && (data[2] & ~1) == 0xf4))
1424 adb_input(data+1, len-1, 1);
1425 #endif /* CONFIG_ADB */
1429 /* Sound/brightness button pressed */
1430 case PMU_INT_SNDBRT:
1431 #ifdef CONFIG_PMAC_BACKLIGHT
1433 pmac_backlight_set_legacy_brightness_pmu(data[1] >> 4);
1437 /* Tick interrupt */
1439 /* Environment or tick interrupt, query batteries */
1440 if (pmu_battery_count) {
1441 if ((--query_batt_timer) == 0) {
1442 query_battery_state();
1443 query_batt_timer = BATTERY_POLLING_COUNT;
1448 case PMU_INT_ENVIRONMENT:
1449 if (pmu_battery_count)
1450 query_battery_state();
1451 pmu_pass_intr(data, len);
1452 /* len == 6 is probably a bad check. But how do I
1453 * know what PMU versions send what events here? */
1454 if (IS_ENABLED(CONFIG_ADB_PMU_EVENT) && len == 6) {
1455 via_pmu_event(PMU_EVT_POWER, !!(data[1]&8));
1456 via_pmu_event(PMU_EVT_LID, data[1]&1);
1461 pmu_pass_intr(data, len);
1466 static struct adb_request*
1469 struct adb_request *req;
1472 if (in_8(&via2[B]) & TREQ) {
1473 printk(KERN_ERR "PMU: spurious SR intr (%x)\n", in_8(&via2[B]));
1476 /* The ack may not yet be low when we get the interrupt */
1477 while ((in_8(&via2[B]) & TACK) != 0)
1480 /* if reading grab the byte, and reset the interrupt */
1481 if (pmu_state == reading || pmu_state == reading_intr)
1482 bite = in_8(&via1[SR]);
1484 /* reset TREQ and wait for TACK to go high */
1485 out_8(&via2[B], in_8(&via2[B]) | TREQ);
1488 switch (pmu_state) {
1492 data_len = req->nbytes - 1;
1493 send_byte(data_len);
1496 if (data_index <= data_len) {
1497 send_byte(req->data[data_index++]);
1501 data_len = pmu_data_len[req->data[0]][1];
1502 if (data_len == 0) {
1504 current_req = req->next;
1505 if (req->reply_expected)
1506 req_awaiting_reply = req;
1510 pmu_state = reading;
1512 reply_ptr = req->reply + req->reply_len;
1520 pmu_state = reading_intr;
1521 reply_ptr = interrupt_data[int_data_last];
1523 if (gpio_irq >= 0 && !gpio_irq_enabled) {
1524 enable_irq(gpio_irq);
1525 gpio_irq_enabled = 1;
1531 if (data_len == -1) {
1534 printk(KERN_ERR "PMU: bad reply len %d\n", bite);
1535 } else if (data_index < 32) {
1536 reply_ptr[data_index++] = bite;
1538 if (data_index < data_len) {
1543 if (pmu_state == reading_intr) {
1545 int_data_state[int_data_last] = int_data_ready;
1546 interrupt_data_len[int_data_last] = data_len;
1550 * For PMU sleep and freq change requests, we lock the
1551 * PMU until it's explicitly unlocked. This avoids any
1552 * spurrious event polling getting in
1554 current_req = req->next;
1555 req->reply_len += data_index;
1556 if (req->data[0] == PMU_SLEEP || req->data[0] == PMU_CPU_SPEED)
1565 printk(KERN_ERR "via_pmu_interrupt: unknown state %d?\n",
1572 via_pmu_interrupt(int irq, void *arg)
1574 unsigned long flags;
1578 struct adb_request *req = NULL;
1581 /* This is a bit brutal, we can probably do better */
1582 spin_lock_irqsave(&pmu_lock, flags);
1586 /* On 68k Macs, VIA interrupts are dispatched individually.
1587 * Unless we are polling, the relevant IRQ flag has already
1591 if (IS_ENABLED(CONFIG_PPC_PMAC) || !irq) {
1592 intr = in_8(&via1[IFR]) & (SR_INT | CB1_INT);
1593 out_8(&via1[IFR], intr);
1595 #ifndef CONFIG_PPC_PMAC
1597 case IRQ_MAC_ADB_CL:
1600 case IRQ_MAC_ADB_SR:
1608 if (++nloop > 1000) {
1609 printk(KERN_DEBUG "PMU: stuck in intr loop, "
1610 "intr=%x, ier=%x pmu_state=%d\n",
1611 intr, in_8(&via1[IER]), pmu_state);
1614 if (intr & CB1_INT) {
1615 adb_int_pending = 1;
1616 pmu_irq_stats[11]++;
1618 if (intr & SR_INT) {
1619 req = pmu_sr_intr();
1623 #ifndef CONFIG_PPC_PMAC
1629 if (pmu_state == idle) {
1630 if (adb_int_pending) {
1631 if (int_data_state[0] == int_data_empty)
1633 else if (int_data_state[1] == int_data_empty)
1638 int_data_state[int_data_last] = int_data_fill;
1639 /* Sounds safer to make sure ACK is high before writing.
1640 * This helped kill a problem with ADB and some iBooks
1643 send_byte(PMU_INT_ACK);
1644 adb_int_pending = 0;
1645 } else if (current_req)
1649 /* Mark the oldest buffer for flushing */
1650 if (int_data_state[!int_data_last] == int_data_ready) {
1651 int_data_state[!int_data_last] = int_data_flush;
1652 int_data = !int_data_last;
1653 } else if (int_data_state[int_data_last] == int_data_ready) {
1654 int_data_state[int_data_last] = int_data_flush;
1655 int_data = int_data_last;
1658 spin_unlock_irqrestore(&pmu_lock, flags);
1660 /* Deal with completed PMU requests outside of the lock */
1666 /* Deal with interrupt datas outside of the lock */
1667 if (int_data >= 0) {
1668 pmu_handle_data(interrupt_data[int_data], interrupt_data_len[int_data]);
1669 spin_lock_irqsave(&pmu_lock, flags);
1671 int_data_state[int_data] = int_data_empty;
1676 return IRQ_RETVAL(handled);
1682 unsigned long flags;
1684 spin_lock_irqsave(&pmu_lock, flags);
1685 if (pmu_state == locked)
1687 adb_int_pending = 1;
1688 spin_unlock_irqrestore(&pmu_lock, flags);
1692 static __maybe_unused irqreturn_t
1693 gpio1_interrupt(int irq, void *arg)
1695 unsigned long flags;
1697 if ((in_8(gpio_reg + 0x9) & 0x02) == 0) {
1698 spin_lock_irqsave(&pmu_lock, flags);
1699 if (gpio_irq_enabled > 0) {
1700 disable_irq_nosync(gpio_irq);
1701 gpio_irq_enabled = 0;
1703 pmu_irq_stats[12]++;
1704 adb_int_pending = 1;
1705 spin_unlock_irqrestore(&pmu_lock, flags);
1706 via_pmu_interrupt(0, NULL);
1713 pmu_enable_irled(int on)
1715 struct adb_request req;
1717 if (pmu_state == uninitialized)
1719 if (pmu_kind == PMU_KEYLARGO_BASED)
1722 pmu_request(&req, NULL, 2, PMU_POWER_CTRL, PMU_POW_IRLED |
1723 (on ? PMU_POW_ON : PMU_POW_OFF));
1724 pmu_wait_complete(&req);
1727 /* Offset between Unix time (1970-based) and Mac time (1904-based) */
1728 #define RTC_OFFSET 2082844800
1730 time64_t pmu_get_time(void)
1732 struct adb_request req;
1735 if (pmu_request(&req, NULL, 1, PMU_READ_RTC) < 0)
1737 pmu_wait_complete(&req);
1738 if (req.reply_len != 4)
1739 pr_err("%s: got %d byte reply\n", __func__, req.reply_len);
1740 now = (req.reply[0] << 24) + (req.reply[1] << 16) +
1741 (req.reply[2] << 8) + req.reply[3];
1742 return (time64_t)now - RTC_OFFSET;
1745 int pmu_set_rtc_time(struct rtc_time *tm)
1748 struct adb_request req;
1750 now = lower_32_bits(rtc_tm_to_time64(tm) + RTC_OFFSET);
1751 if (pmu_request(&req, NULL, 5, PMU_SET_RTC,
1752 now >> 24, now >> 16, now >> 8, now) < 0)
1754 pmu_wait_complete(&req);
1755 if (req.reply_len != 0)
1756 pr_err("%s: got %d byte reply\n", __func__, req.reply_len);
1763 struct adb_request req;
1765 if (pmu_state == uninitialized)
1768 local_irq_disable();
1770 drop_interrupts = 1;
1772 if (pmu_kind != PMU_KEYLARGO_BASED) {
1773 pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, PMU_INT_ADB |
1775 while(!req.complete)
1779 pmu_request(&req, NULL, 1, PMU_RESET);
1780 pmu_wait_complete(&req);
1788 struct adb_request req;
1790 if (pmu_state == uninitialized)
1793 local_irq_disable();
1795 drop_interrupts = 1;
1797 if (pmu_kind != PMU_KEYLARGO_BASED) {
1798 pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, PMU_INT_ADB |
1800 pmu_wait_complete(&req);
1802 /* Disable server mode on shutdown or we'll just
1805 pmu_set_server_mode(0);
1808 pmu_request(&req, NULL, 5, PMU_SHUTDOWN,
1809 'M', 'A', 'T', 'T');
1810 pmu_wait_complete(&req);
1818 return pmu_state != uninitialized;
1821 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
1823 * Put the powerbook to sleep.
1826 static u32 save_via[8];
1827 static int __fake_sleep;
1830 save_via_state(void)
1832 save_via[0] = in_8(&via1[ANH]);
1833 save_via[1] = in_8(&via1[DIRA]);
1834 save_via[2] = in_8(&via1[B]);
1835 save_via[3] = in_8(&via1[DIRB]);
1836 save_via[4] = in_8(&via1[PCR]);
1837 save_via[5] = in_8(&via1[ACR]);
1838 save_via[6] = in_8(&via1[T1CL]);
1839 save_via[7] = in_8(&via1[T1CH]);
1842 restore_via_state(void)
1844 out_8(&via1[ANH], save_via[0]);
1845 out_8(&via1[DIRA], save_via[1]);
1846 out_8(&via1[B], save_via[2]);
1847 out_8(&via1[DIRB], save_via[3]);
1848 out_8(&via1[PCR], save_via[4]);
1849 out_8(&via1[ACR], save_via[5]);
1850 out_8(&via1[T1CL], save_via[6]);
1851 out_8(&via1[T1CH], save_via[7]);
1852 out_8(&via1[IER], IER_CLR | 0x7f); /* disable all intrs */
1853 out_8(&via1[IFR], 0x7f); /* clear IFR */
1854 out_8(&via1[IER], IER_SET | SR_INT | CB1_INT);
1857 #define GRACKLE_PM (1<<7)
1858 #define GRACKLE_DOZE (1<<5)
1859 #define GRACKLE_NAP (1<<4)
1860 #define GRACKLE_SLEEP (1<<3)
1862 static int powerbook_sleep_grackle(void)
1864 unsigned long save_l2cr;
1865 unsigned short pmcr1;
1866 struct adb_request req;
1867 struct pci_dev *grackle;
1869 grackle = pci_get_domain_bus_and_slot(0, 0, 0);
1873 /* Turn off various things. Darwin does some retry tests here... */
1874 pmu_request(&req, NULL, 2, PMU_POWER_CTRL0, PMU_POW0_OFF|PMU_POW0_HARD_DRIVE);
1875 pmu_wait_complete(&req);
1876 pmu_request(&req, NULL, 2, PMU_POWER_CTRL,
1877 PMU_POW_OFF|PMU_POW_BACKLIGHT|PMU_POW_IRLED|PMU_POW_MEDIABAY);
1878 pmu_wait_complete(&req);
1880 /* For 750, save backside cache setting and disable it */
1881 save_l2cr = _get_L2CR(); /* (returns -1 if not available) */
1883 if (!__fake_sleep) {
1884 /* Ask the PMU to put us to sleep */
1885 pmu_request(&req, NULL, 5, PMU_SLEEP, 'M', 'A', 'T', 'T');
1886 pmu_wait_complete(&req);
1889 /* The VIA is supposed not to be restored correctly*/
1891 /* We shut down some HW */
1892 pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,1);
1894 pci_read_config_word(grackle, 0x70, &pmcr1);
1895 /* Apparently, MacOS uses NAP mode for Grackle ??? */
1896 pmcr1 &= ~(GRACKLE_DOZE|GRACKLE_SLEEP);
1897 pmcr1 |= GRACKLE_PM|GRACKLE_NAP;
1898 pci_write_config_word(grackle, 0x70, pmcr1);
1900 /* Call low-level ASM sleep handler */
1904 low_sleep_handler();
1906 /* We're awake again, stop grackle PM */
1907 pci_read_config_word(grackle, 0x70, &pmcr1);
1908 pmcr1 &= ~(GRACKLE_PM|GRACKLE_DOZE|GRACKLE_SLEEP|GRACKLE_NAP);
1909 pci_write_config_word(grackle, 0x70, pmcr1);
1911 pci_dev_put(grackle);
1913 /* Make sure the PMU is idle */
1914 pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,0);
1915 restore_via_state();
1917 /* Restore L2 cache */
1918 if (save_l2cr != 0xffffffff && (save_l2cr & L2CR_L2E) != 0)
1919 _set_L2CR(save_l2cr);
1921 /* Restore userland MMU context */
1922 switch_mmu_context(NULL, current->active_mm, NULL);
1924 /* Power things up */
1926 pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, pmu_intr_mask);
1927 pmu_wait_complete(&req);
1928 pmu_request(&req, NULL, 2, PMU_POWER_CTRL0,
1929 PMU_POW0_ON|PMU_POW0_HARD_DRIVE);
1930 pmu_wait_complete(&req);
1931 pmu_request(&req, NULL, 2, PMU_POWER_CTRL,
1932 PMU_POW_ON|PMU_POW_BACKLIGHT|PMU_POW_CHARGER|PMU_POW_IRLED|PMU_POW_MEDIABAY);
1933 pmu_wait_complete(&req);
1939 powerbook_sleep_Core99(void)
1941 unsigned long save_l2cr;
1942 unsigned long save_l3cr;
1943 struct adb_request req;
1945 if (pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) < 0) {
1946 printk(KERN_ERR "Sleep mode not supported on this machine\n");
1950 if (num_online_cpus() > 1 || cpu_is_offline(0))
1953 /* Stop environment and ADB interrupts */
1954 pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, 0);
1955 pmu_wait_complete(&req);
1957 /* Tell PMU what events will wake us up */
1958 pmu_request(&req, NULL, 4, PMU_POWER_EVENTS, PMU_PWR_CLR_WAKEUP_EVENTS,
1960 pmu_wait_complete(&req);
1961 pmu_request(&req, NULL, 4, PMU_POWER_EVENTS, PMU_PWR_SET_WAKEUP_EVENTS,
1962 0, PMU_PWR_WAKEUP_KEY |
1963 (option_lid_wakeup ? PMU_PWR_WAKEUP_LID_OPEN : 0));
1964 pmu_wait_complete(&req);
1966 /* Save the state of the L2 and L3 caches */
1967 save_l3cr = _get_L3CR(); /* (returns -1 if not available) */
1968 save_l2cr = _get_L2CR(); /* (returns -1 if not available) */
1970 if (!__fake_sleep) {
1971 /* Ask the PMU to put us to sleep */
1972 pmu_request(&req, NULL, 5, PMU_SLEEP, 'M', 'A', 'T', 'T');
1973 pmu_wait_complete(&req);
1976 /* The VIA is supposed not to be restored correctly*/
1979 /* Shut down various ASICs. There's a chance that we can no longer
1980 * talk to the PMU after this, so I moved it to _after_ sending the
1981 * sleep command to it. Still need to be checked.
1983 pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 1);
1985 /* Call low-level ASM sleep handler */
1989 low_sleep_handler();
1991 /* Restore Apple core ASICs state */
1992 pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 0);
1995 restore_via_state();
1997 /* tweak LPJ before cpufreq is there */
1998 loops_per_jiffy *= 2;
2001 pmac_call_early_video_resume();
2003 /* Restore L2 cache */
2004 if (save_l2cr != 0xffffffff && (save_l2cr & L2CR_L2E) != 0)
2005 _set_L2CR(save_l2cr);
2006 /* Restore L3 cache */
2007 if (save_l3cr != 0xffffffff && (save_l3cr & L3CR_L3E) != 0)
2008 _set_L3CR(save_l3cr);
2010 /* Restore userland MMU context */
2011 switch_mmu_context(NULL, current->active_mm, NULL);
2013 /* Tell PMU we are ready */
2015 pmu_request(&req, NULL, 2, PMU_SYSTEM_READY, 2);
2016 pmu_wait_complete(&req);
2017 pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, pmu_intr_mask);
2018 pmu_wait_complete(&req);
2020 /* Restore LPJ, cpufreq will adjust the cpu frequency */
2021 loops_per_jiffy /= 2;
2026 #define PB3400_MEM_CTRL 0xf8000000
2027 #define PB3400_MEM_CTRL_SLEEP 0x70
2029 static void __iomem *pb3400_mem_ctrl;
2031 static void powerbook_sleep_init_3400(void)
2033 /* map in the memory controller registers */
2034 pb3400_mem_ctrl = ioremap(PB3400_MEM_CTRL, 0x100);
2035 if (pb3400_mem_ctrl == NULL)
2036 printk(KERN_WARNING "ioremap failed: sleep won't be possible");
2039 static int powerbook_sleep_3400(void)
2044 struct adb_request sleep_req;
2045 unsigned int __iomem *mem_ctrl_sleep;
2047 if (pb3400_mem_ctrl == NULL)
2049 mem_ctrl_sleep = pb3400_mem_ctrl + PB3400_MEM_CTRL_SLEEP;
2051 /* Set the memory controller to keep the memory refreshed
2052 while we're asleep */
2053 for (i = 0x403f; i >= 0x4000; --i) {
2054 out_be32(mem_ctrl_sleep, i);
2056 x = (in_be32(mem_ctrl_sleep) >> 16) & 0x3ff;
2062 /* Ask the PMU to put us to sleep */
2063 pmu_request(&sleep_req, NULL, 5, PMU_SLEEP, 'M', 'A', 'T', 'T');
2064 pmu_wait_complete(&sleep_req);
2067 pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 1);
2071 /* Put the CPU into sleep mode */
2072 hid0 = mfspr(SPRN_HID0);
2073 hid0 = (hid0 & ~(HID0_NAP | HID0_DOZE)) | HID0_SLEEP;
2074 mtspr(SPRN_HID0, hid0);
2076 msr = mfmsr() | MSR_POW;
2082 local_irq_disable();
2084 /* OK, we're awake again, start restoring things */
2085 out_be32(mem_ctrl_sleep, 0x3f);
2086 pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 0);
2091 #endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
2094 * Support for /dev/pmu device
2096 #define RB_SIZE 0x10
2097 struct pmu_private {
2098 struct list_head list;
2103 unsigned char data[16];
2105 wait_queue_head_t wait;
2107 #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
2108 int backlight_locker;
2112 static LIST_HEAD(all_pmu_pvt);
2113 static DEFINE_SPINLOCK(all_pvt_lock);
2116 pmu_pass_intr(unsigned char *data, int len)
2118 struct pmu_private *pp;
2119 struct list_head *list;
2121 unsigned long flags;
2123 if (len > sizeof(pp->rb_buf[0].data))
2124 len = sizeof(pp->rb_buf[0].data);
2125 spin_lock_irqsave(&all_pvt_lock, flags);
2126 for (list = &all_pmu_pvt; (list = list->next) != &all_pmu_pvt; ) {
2127 pp = list_entry(list, struct pmu_private, list);
2128 spin_lock(&pp->lock);
2132 if (i != pp->rb_get) {
2133 struct rb_entry *rp = &pp->rb_buf[pp->rb_put];
2135 memcpy(rp->data, data, len);
2137 wake_up_interruptible(&pp->wait);
2139 spin_unlock(&pp->lock);
2141 spin_unlock_irqrestore(&all_pvt_lock, flags);
2145 pmu_open(struct inode *inode, struct file *file)
2147 struct pmu_private *pp;
2148 unsigned long flags;
2150 pp = kmalloc(sizeof(struct pmu_private), GFP_KERNEL);
2153 pp->rb_get = pp->rb_put = 0;
2154 spin_lock_init(&pp->lock);
2155 init_waitqueue_head(&pp->wait);
2156 mutex_lock(&pmu_info_proc_mutex);
2157 spin_lock_irqsave(&all_pvt_lock, flags);
2158 #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
2159 pp->backlight_locker = 0;
2161 list_add(&pp->list, &all_pmu_pvt);
2162 spin_unlock_irqrestore(&all_pvt_lock, flags);
2163 file->private_data = pp;
2164 mutex_unlock(&pmu_info_proc_mutex);
2169 pmu_read(struct file *file, char __user *buf,
2170 size_t count, loff_t *ppos)
2172 struct pmu_private *pp = file->private_data;
2173 DECLARE_WAITQUEUE(wait, current);
2174 unsigned long flags;
2177 if (count < 1 || !pp)
2180 spin_lock_irqsave(&pp->lock, flags);
2181 add_wait_queue(&pp->wait, &wait);
2182 set_current_state(TASK_INTERRUPTIBLE);
2186 if (pp->rb_get != pp->rb_put) {
2188 struct rb_entry *rp = &pp->rb_buf[i];
2190 spin_unlock_irqrestore(&pp->lock, flags);
2193 if (ret > 0 && copy_to_user(buf, rp->data, ret))
2197 spin_lock_irqsave(&pp->lock, flags);
2202 if (file->f_flags & O_NONBLOCK)
2205 if (signal_pending(current))
2207 spin_unlock_irqrestore(&pp->lock, flags);
2209 spin_lock_irqsave(&pp->lock, flags);
2211 __set_current_state(TASK_RUNNING);
2212 remove_wait_queue(&pp->wait, &wait);
2213 spin_unlock_irqrestore(&pp->lock, flags);
2219 pmu_write(struct file *file, const char __user *buf,
2220 size_t count, loff_t *ppos)
2226 pmu_fpoll(struct file *filp, poll_table *wait)
2228 struct pmu_private *pp = filp->private_data;
2230 unsigned long flags;
2234 poll_wait(filp, &pp->wait, wait);
2235 spin_lock_irqsave(&pp->lock, flags);
2236 if (pp->rb_get != pp->rb_put)
2238 spin_unlock_irqrestore(&pp->lock, flags);
2243 pmu_release(struct inode *inode, struct file *file)
2245 struct pmu_private *pp = file->private_data;
2246 unsigned long flags;
2249 file->private_data = NULL;
2250 spin_lock_irqsave(&all_pvt_lock, flags);
2251 list_del(&pp->list);
2252 spin_unlock_irqrestore(&all_pvt_lock, flags);
2254 #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
2255 if (pp->backlight_locker)
2256 pmac_backlight_enable();
2264 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
2265 static void pmac_suspend_disable_irqs(void)
2267 /* Call platform functions marked "on sleep" */
2268 pmac_pfunc_i2c_suspend();
2269 pmac_pfunc_base_suspend();
2272 static int powerbook_sleep(suspend_state_t state)
2276 /* Wait for completion of async requests */
2277 while (!batt_req.complete)
2280 /* Giveup the lazy FPU & vec so we don't have to back them
2281 * up from the low level code
2285 #ifdef CONFIG_ALTIVEC
2286 if (cpu_has_feature(CPU_FTR_ALTIVEC))
2287 enable_kernel_altivec();
2288 #endif /* CONFIG_ALTIVEC */
2291 case PMU_OHARE_BASED:
2292 error = powerbook_sleep_3400();
2294 case PMU_HEATHROW_BASED:
2295 case PMU_PADDINGTON_BASED:
2296 error = powerbook_sleep_grackle();
2298 case PMU_KEYLARGO_BASED:
2299 error = powerbook_sleep_Core99();
2313 static void pmac_suspend_enable_irqs(void)
2315 /* Force a poll of ADB interrupts */
2316 adb_int_pending = 1;
2317 via_pmu_interrupt(0, NULL);
2321 /* Call platform functions marked "on wake" */
2322 pmac_pfunc_base_resume();
2323 pmac_pfunc_i2c_resume();
2326 static int pmu_sleep_valid(suspend_state_t state)
2328 return state == PM_SUSPEND_MEM
2329 && (pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, -1) >= 0);
2332 static const struct platform_suspend_ops pmu_pm_ops = {
2333 .enter = powerbook_sleep,
2334 .valid = pmu_sleep_valid,
2337 static int register_pmu_pm_ops(void)
2339 if (pmu_kind == PMU_OHARE_BASED)
2340 powerbook_sleep_init_3400();
2341 ppc_md.suspend_disable_irqs = pmac_suspend_disable_irqs;
2342 ppc_md.suspend_enable_irqs = pmac_suspend_enable_irqs;
2343 suspend_set_ops(&pmu_pm_ops);
2348 device_initcall(register_pmu_pm_ops);
2351 static int pmu_ioctl(struct file *filp,
2352 u_int cmd, u_long arg)
2354 __u32 __user *argp = (__u32 __user *)arg;
2355 int error = -EINVAL;
2358 #ifdef CONFIG_PPC_PMAC
2360 if (!capable(CAP_SYS_ADMIN))
2362 return pm_suspend(PM_SUSPEND_MEM);
2363 case PMU_IOC_CAN_SLEEP:
2364 if (pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, -1) < 0)
2365 return put_user(0, argp);
2367 return put_user(1, argp);
2370 #ifdef CONFIG_PMAC_BACKLIGHT_LEGACY
2371 /* Compatibility ioctl's for backlight */
2372 case PMU_IOC_GET_BACKLIGHT:
2376 brightness = pmac_backlight_get_legacy_brightness();
2380 return put_user(brightness, argp);
2383 case PMU_IOC_SET_BACKLIGHT:
2387 error = get_user(brightness, argp);
2391 return pmac_backlight_set_legacy_brightness(brightness);
2393 #ifdef CONFIG_INPUT_ADBHID
2394 case PMU_IOC_GRAB_BACKLIGHT: {
2395 struct pmu_private *pp = filp->private_data;
2397 if (pp->backlight_locker)
2400 pp->backlight_locker = 1;
2401 pmac_backlight_disable();
2405 #endif /* CONFIG_INPUT_ADBHID */
2406 #endif /* CONFIG_PMAC_BACKLIGHT_LEGACY */
2408 case PMU_IOC_GET_MODEL:
2409 return put_user(pmu_kind, argp);
2410 case PMU_IOC_HAS_ADB:
2411 return put_user(pmu_has_adb, argp);
2416 static long pmu_unlocked_ioctl(struct file *filp,
2417 u_int cmd, u_long arg)
2421 mutex_lock(&pmu_info_proc_mutex);
2422 ret = pmu_ioctl(filp, cmd, arg);
2423 mutex_unlock(&pmu_info_proc_mutex);
2428 #ifdef CONFIG_COMPAT
2429 #define PMU_IOC_GET_BACKLIGHT32 _IOR('B', 1, compat_size_t)
2430 #define PMU_IOC_SET_BACKLIGHT32 _IOW('B', 2, compat_size_t)
2431 #define PMU_IOC_GET_MODEL32 _IOR('B', 3, compat_size_t)
2432 #define PMU_IOC_HAS_ADB32 _IOR('B', 4, compat_size_t)
2433 #define PMU_IOC_CAN_SLEEP32 _IOR('B', 5, compat_size_t)
2434 #define PMU_IOC_GRAB_BACKLIGHT32 _IOR('B', 6, compat_size_t)
2436 static long compat_pmu_ioctl (struct file *filp, u_int cmd, u_long arg)
2441 case PMU_IOC_GET_BACKLIGHT32:
2442 cmd = PMU_IOC_GET_BACKLIGHT;
2444 case PMU_IOC_SET_BACKLIGHT32:
2445 cmd = PMU_IOC_SET_BACKLIGHT;
2447 case PMU_IOC_GET_MODEL32:
2448 cmd = PMU_IOC_GET_MODEL;
2450 case PMU_IOC_HAS_ADB32:
2451 cmd = PMU_IOC_HAS_ADB;
2453 case PMU_IOC_CAN_SLEEP32:
2454 cmd = PMU_IOC_CAN_SLEEP;
2456 case PMU_IOC_GRAB_BACKLIGHT32:
2457 cmd = PMU_IOC_GRAB_BACKLIGHT;
2460 return -ENOIOCTLCMD;
2462 return pmu_unlocked_ioctl(filp, cmd, (unsigned long)compat_ptr(arg));
2466 static const struct file_operations pmu_device_fops = {
2470 .unlocked_ioctl = pmu_unlocked_ioctl,
2471 #ifdef CONFIG_COMPAT
2472 .compat_ioctl = compat_pmu_ioctl,
2475 .release = pmu_release,
2476 .llseek = noop_llseek,
2479 static struct miscdevice pmu_device = {
2480 PMU_MINOR, "pmu", &pmu_device_fops
2483 static int pmu_device_init(void)
2485 if (pmu_state == uninitialized)
2487 if (misc_register(&pmu_device) < 0)
2488 printk(KERN_ERR "via-pmu: cannot register misc device.\n");
2491 device_initcall(pmu_device_init);
2496 polled_handshake(void)
2498 via2[B] &= ~TREQ; eieio();
2499 while ((via2[B] & TACK) != 0)
2501 via2[B] |= TREQ; eieio();
2502 while ((via2[B] & TACK) == 0)
2507 polled_send_byte(int x)
2509 via1[ACR] |= SR_OUT | SR_EXT; eieio();
2510 via1[SR] = x; eieio();
2515 polled_recv_byte(void)
2519 via1[ACR] = (via1[ACR] & ~SR_OUT) | SR_EXT; eieio();
2520 x = via1[SR]; eieio();
2522 x = via1[SR]; eieio();
2527 pmu_polled_request(struct adb_request *req)
2529 unsigned long flags;
2534 l = pmu_data_len[c][0];
2535 if (l >= 0 && req->nbytes != l + 1)
2538 local_irq_save(flags);
2539 while (pmu_state != idle)
2542 while ((via2[B] & TACK) == 0)
2544 polled_send_byte(c);
2546 l = req->nbytes - 1;
2547 polled_send_byte(l);
2549 for (i = 1; i <= l; ++i)
2550 polled_send_byte(req->data[i]);
2552 l = pmu_data_len[c][1];
2554 l = polled_recv_byte();
2555 for (i = 0; i < l; ++i)
2556 req->reply[i + req->reply_len] = polled_recv_byte();
2561 local_irq_restore(flags);
2565 /* N.B. This doesn't work on the 3400 */
2566 void pmu_blink(int n)
2568 struct adb_request req;
2570 memset(&req, 0, sizeof(req));
2572 for (; n > 0; --n) {
2579 req.reply[0] = ADB_RET_OK;
2581 req.reply_expected = 0;
2582 pmu_polled_request(&req);
2590 req.reply[0] = ADB_RET_OK;
2592 req.reply_expected = 0;
2593 pmu_polled_request(&req);
2598 #endif /* DEBUG_SLEEP */
2600 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
2601 int pmu_sys_suspended;
2603 static int pmu_syscore_suspend(void)
2605 /* Suspend PMU event interrupts */
2607 pmu_sys_suspended = 1;
2609 #ifdef CONFIG_PMAC_BACKLIGHT
2610 /* Tell backlight code not to muck around with the chip anymore */
2611 pmu_backlight_set_sleep(1);
2617 static void pmu_syscore_resume(void)
2619 struct adb_request req;
2621 if (!pmu_sys_suspended)
2624 /* Tell PMU we are ready */
2625 pmu_request(&req, NULL, 2, PMU_SYSTEM_READY, 2);
2626 pmu_wait_complete(&req);
2628 #ifdef CONFIG_PMAC_BACKLIGHT
2629 /* Tell backlight code it can use the chip again */
2630 pmu_backlight_set_sleep(0);
2632 /* Resume PMU event interrupts */
2634 pmu_sys_suspended = 0;
2637 static struct syscore_ops pmu_syscore_ops = {
2638 .suspend = pmu_syscore_suspend,
2639 .resume = pmu_syscore_resume,
2642 static int pmu_syscore_register(void)
2644 register_syscore_ops(&pmu_syscore_ops);
2648 subsys_initcall(pmu_syscore_register);
2649 #endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
2651 EXPORT_SYMBOL(pmu_request);
2652 EXPORT_SYMBOL(pmu_queue_request);
2653 EXPORT_SYMBOL(pmu_poll);
2654 EXPORT_SYMBOL(pmu_poll_adb);
2655 EXPORT_SYMBOL(pmu_wait_complete);
2656 EXPORT_SYMBOL(pmu_suspend);
2657 EXPORT_SYMBOL(pmu_resume);
2658 EXPORT_SYMBOL(pmu_unlock);
2659 #if defined(CONFIG_PPC32)
2660 EXPORT_SYMBOL(pmu_enable_irled);
2661 EXPORT_SYMBOL(pmu_battery_count);
2662 EXPORT_SYMBOL(pmu_batteries);
2663 EXPORT_SYMBOL(pmu_power_flags);
2664 #endif /* CONFIG_SUSPEND && CONFIG_PPC32 */