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
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 <asm/machdep.h>
55 #include <asm/pgtable.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>
63 #include <asm/mmu_context.h>
64 #include <asm/cputable.h>
66 #include <asm/backlight.h>
68 #include <asm/macintosh.h>
69 #include <asm/macints.h>
70 #include <asm/mac_via.h>
73 #include "via-pmu-event.h"
75 /* Some compile options */
78 /* Misc minor number allocated for /dev/pmu */
81 /* How many iterations between battery polls */
82 #define BATTERY_POLLING_COUNT 2
84 static DEFINE_MUTEX(pmu_info_proc_mutex
);
86 /* VIA registers - spaced 0x200 bytes apart */
87 #define RS 0x200 /* skip between registers */
88 #define B 0 /* B-side data */
89 #define A RS /* A-side data */
90 #define DIRB (2*RS) /* B-side direction (1=output) */
91 #define DIRA (3*RS) /* A-side direction (1=output) */
92 #define T1CL (4*RS) /* Timer 1 ctr/latch (low 8 bits) */
93 #define T1CH (5*RS) /* Timer 1 counter (high 8 bits) */
94 #define T1LL (6*RS) /* Timer 1 latch (low 8 bits) */
95 #define T1LH (7*RS) /* Timer 1 latch (high 8 bits) */
96 #define T2CL (8*RS) /* Timer 2 ctr/latch (low 8 bits) */
97 #define T2CH (9*RS) /* Timer 2 counter (high 8 bits) */
98 #define SR (10*RS) /* Shift register */
99 #define ACR (11*RS) /* Auxiliary control register */
100 #define PCR (12*RS) /* Peripheral control register */
101 #define IFR (13*RS) /* Interrupt flag register */
102 #define IER (14*RS) /* Interrupt enable register */
103 #define ANH (15*RS) /* A-side data, no handshake */
105 /* Bits in B data register: both active low */
106 #ifdef CONFIG_PPC_PMAC
107 #define TACK 0x08 /* Transfer acknowledge (input) */
108 #define TREQ 0x10 /* Transfer request (output) */
115 #define SR_CTRL 0x1c /* Shift register control bits */
116 #define SR_EXT 0x0c /* Shift on external clock */
117 #define SR_OUT 0x10 /* Shift out if 1 */
119 /* Bits in IFR and IER */
120 #define IER_SET 0x80 /* set bits in IER */
121 #define IER_CLR 0 /* clear bits in IER */
122 #define SR_INT 0x04 /* Shift register full/empty */
124 #define CB1_INT 0x10 /* transition on CB1 input */
126 static volatile enum pmu_state
{
136 static volatile enum int_data_state
{
141 } int_data_state
[2] = { int_data_empty
, int_data_empty
};
143 static struct adb_request
*current_req
;
144 static struct adb_request
*last_req
;
145 static struct adb_request
*req_awaiting_reply
;
146 static unsigned char interrupt_data
[2][32];
147 static int interrupt_data_len
[2];
148 static int int_data_last
;
149 static unsigned char *reply_ptr
;
150 static int data_index
;
152 static volatile int adb_int_pending
;
153 static volatile int disable_poll
;
154 static int pmu_kind
= PMU_UNKNOWN
;
155 static int pmu_fully_inited
;
156 static int pmu_has_adb
;
157 #ifdef CONFIG_PPC_PMAC
158 static volatile unsigned char __iomem
*via1
;
159 static volatile unsigned char __iomem
*via2
;
160 static struct device_node
*vias
;
161 static struct device_node
*gpio_node
;
163 static unsigned char __iomem
*gpio_reg
;
164 static int gpio_irq
= 0;
165 static int gpio_irq_enabled
= -1;
166 static volatile int pmu_suspended
;
167 static spinlock_t pmu_lock
;
168 static u8 pmu_intr_mask
;
169 static int pmu_version
;
170 static int drop_interrupts
;
171 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
172 static int option_lid_wakeup
= 1;
173 #endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
174 static unsigned long async_req_locks
;
176 #define NUM_IRQ_STATS 13
177 static unsigned int pmu_irq_stats
[NUM_IRQ_STATS
];
179 static struct proc_dir_entry
*proc_pmu_root
;
180 static struct proc_dir_entry
*proc_pmu_info
;
181 static struct proc_dir_entry
*proc_pmu_irqstats
;
182 static struct proc_dir_entry
*proc_pmu_options
;
183 static int option_server_mode
;
185 int pmu_battery_count
;
187 unsigned int pmu_power_flags
= PMU_PWR_AC_PRESENT
;
188 struct pmu_battery_info pmu_batteries
[PMU_MAX_BATTERIES
];
189 static int query_batt_timer
= BATTERY_POLLING_COUNT
;
190 static struct adb_request batt_req
;
191 static struct proc_dir_entry
*proc_pmu_batt
[PMU_MAX_BATTERIES
];
197 static int adb_dev_map
;
198 static int pmu_adb_flags
;
200 static int pmu_probe(void);
201 static int pmu_init(void);
202 static int pmu_send_request(struct adb_request
*req
, int sync
);
203 static int pmu_adb_autopoll(int devs
);
204 static int pmu_adb_reset_bus(void);
205 #endif /* CONFIG_ADB */
207 static int init_pmu(void);
208 static void pmu_start(void);
209 static irqreturn_t
via_pmu_interrupt(int irq
, void *arg
);
210 static irqreturn_t
gpio1_interrupt(int irq
, void *arg
);
211 static int pmu_info_proc_show(struct seq_file
*m
, void *v
);
212 static int pmu_irqstats_proc_show(struct seq_file
*m
, void *v
);
213 static int pmu_battery_proc_show(struct seq_file
*m
, void *v
);
214 static void pmu_pass_intr(unsigned char *data
, int len
);
215 static const struct file_operations pmu_options_proc_fops
;
218 const struct adb_driver via_pmu_driver
= {
222 .send_request
= pmu_send_request
,
223 .autopoll
= pmu_adb_autopoll
,
224 .poll
= pmu_poll_adb
,
225 .reset_bus
= pmu_adb_reset_bus
,
227 #endif /* CONFIG_ADB */
229 extern void low_sleep_handler(void);
230 extern void enable_kernel_altivec(void);
231 extern void enable_kernel_fp(void);
234 int pmu_polled_request(struct adb_request
*req
);
235 void pmu_blink(int n
);
239 * This table indicates for each PMU opcode:
240 * - the number of data bytes to be sent with the command, or -1
241 * if a length byte should be sent,
242 * - the number of response bytes which the PMU will return, or
243 * -1 if it will send a length byte.
245 static const s8 pmu_data_len
[256][2] = {
246 /* 0 1 2 3 4 5 6 7 */
247 /*00*/ {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
248 /*08*/ {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
249 /*10*/ { 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
250 /*18*/ { 0, 1},{ 0, 1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{ 0, 0},
251 /*20*/ {-1, 0},{ 0, 0},{ 2, 0},{ 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},
252 /*28*/ { 0,-1},{ 0,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{ 0,-1},
253 /*30*/ { 4, 0},{20, 0},{-1, 0},{ 3, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
254 /*38*/ { 0, 4},{ 0,20},{ 2,-1},{ 2, 1},{ 3,-1},{-1,-1},{-1,-1},{ 4, 0},
255 /*40*/ { 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
256 /*48*/ { 0, 1},{ 0, 1},{-1,-1},{ 1, 0},{ 1, 0},{-1,-1},{-1,-1},{-1,-1},
257 /*50*/ { 1, 0},{ 0, 0},{ 2, 0},{ 2, 0},{-1, 0},{ 1, 0},{ 3, 0},{ 1, 0},
258 /*58*/ { 0, 1},{ 1, 0},{ 0, 2},{ 0, 2},{ 0,-1},{-1,-1},{-1,-1},{-1,-1},
259 /*60*/ { 2, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
260 /*68*/ { 0, 3},{ 0, 3},{ 0, 2},{ 0, 8},{ 0,-1},{ 0,-1},{-1,-1},{-1,-1},
261 /*70*/ { 1, 0},{ 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
262 /*78*/ { 0,-1},{ 0,-1},{-1,-1},{-1,-1},{-1,-1},{ 5, 1},{ 4, 1},{ 4, 1},
263 /*80*/ { 4, 0},{-1, 0},{ 0, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
264 /*88*/ { 0, 5},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
265 /*90*/ { 1, 0},{ 2, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
266 /*98*/ { 0, 1},{ 0, 1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
267 /*a0*/ { 2, 0},{ 2, 0},{ 2, 0},{ 4, 0},{-1, 0},{ 0, 0},{-1, 0},{-1, 0},
268 /*a8*/ { 1, 1},{ 1, 0},{ 3, 0},{ 2, 0},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
269 /*b0*/ {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
270 /*b8*/ {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
271 /*c0*/ {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
272 /*c8*/ {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
273 /*d0*/ { 0, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
274 /*d8*/ { 1, 1},{ 1, 1},{-1,-1},{-1,-1},{ 0, 1},{ 0,-1},{-1,-1},{-1,-1},
275 /*e0*/ {-1, 0},{ 4, 0},{ 0, 1},{-1, 0},{-1, 0},{ 4, 0},{-1, 0},{-1, 0},
276 /*e8*/ { 3,-1},{-1,-1},{ 0, 1},{-1,-1},{ 0,-1},{-1,-1},{-1,-1},{ 0, 0},
277 /*f0*/ {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
278 /*f8*/ {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
281 static char *pbook_type
[] = {
283 "PowerBook 2400/3400/3500(G3)",
284 "PowerBook G3 Series",
289 int __init
find_via_pmu(void)
291 #ifdef CONFIG_PPC_PMAC
295 if (pmu_state
!= uninitialized
)
297 vias
= of_find_node_by_name(NULL
, "via-pmu");
301 reg
= of_get_property(vias
, "reg", NULL
);
303 printk(KERN_ERR
"via-pmu: No \"reg\" property !\n");
306 taddr
= of_translate_address(vias
, reg
);
307 if (taddr
== OF_BAD_ADDR
) {
308 printk(KERN_ERR
"via-pmu: Can't translate address !\n");
312 spin_lock_init(&pmu_lock
);
316 pmu_intr_mask
= PMU_INT_PCEJECT
|
321 if (of_node_name_eq(vias
->parent
, "ohare") ||
322 of_device_is_compatible(vias
->parent
, "ohare"))
323 pmu_kind
= PMU_OHARE_BASED
;
324 else if (of_device_is_compatible(vias
->parent
, "paddington"))
325 pmu_kind
= PMU_PADDINGTON_BASED
;
326 else if (of_device_is_compatible(vias
->parent
, "heathrow"))
327 pmu_kind
= PMU_HEATHROW_BASED
;
328 else if (of_device_is_compatible(vias
->parent
, "Keylargo")
329 || of_device_is_compatible(vias
->parent
, "K2-Keylargo")) {
330 struct device_node
*gpiop
;
331 struct device_node
*adbp
;
332 u64 gaddr
= OF_BAD_ADDR
;
334 pmu_kind
= PMU_KEYLARGO_BASED
;
335 adbp
= of_find_node_by_type(NULL
, "adb");
336 pmu_has_adb
= (adbp
!= NULL
);
338 pmu_intr_mask
= PMU_INT_PCEJECT
|
344 gpiop
= of_find_node_by_name(NULL
, "gpio");
346 reg
= of_get_property(gpiop
, "reg", NULL
);
348 gaddr
= of_translate_address(gpiop
, reg
);
349 if (gaddr
!= OF_BAD_ADDR
)
350 gpio_reg
= ioremap(gaddr
, 0x10);
353 if (gpio_reg
== NULL
) {
354 printk(KERN_ERR
"via-pmu: Can't find GPIO reg !\n");
358 pmu_kind
= PMU_UNKNOWN
;
360 via1
= via2
= ioremap(taddr
, 0x2000);
362 printk(KERN_ERR
"via-pmu: Can't map address !\n");
366 out_8(&via1
[IER
], IER_CLR
| 0x7f); /* disable all intrs */
367 out_8(&via1
[IFR
], 0x7f); /* clear IFR */
374 sys_ctrler
= SYS_CTRLER_PMU
;
387 pmu_state
= uninitialized
;
390 if (macintosh_config
->adb_type
!= MAC_ADB_PB2
)
393 pmu_kind
= PMU_UNKNOWN
;
395 spin_lock_init(&pmu_lock
);
399 pmu_intr_mask
= PMU_INT_PCEJECT
|
407 pmu_state
= uninitialized
;
412 #endif /* !CONFIG_PPC_PMAC */
416 static int pmu_probe(void)
418 return pmu_state
== uninitialized
? -ENODEV
: 0;
421 static int pmu_init(void)
423 return pmu_state
== uninitialized
? -ENODEV
: 0;
425 #endif /* CONFIG_ADB */
428 * We can't wait until pmu_init gets called, that happens too late.
429 * It happens after IDE and SCSI initialization, which can take a few
430 * seconds, and by that time the PMU could have given up on us and
432 * Thus this is called with arch_initcall rather than device_initcall.
434 static int __init
via_pmu_start(void)
436 unsigned int __maybe_unused irq
;
438 if (pmu_state
== uninitialized
)
441 batt_req
.complete
= 1;
443 #ifdef CONFIG_PPC_PMAC
444 irq
= irq_of_parse_and_map(vias
, 0);
446 printk(KERN_ERR
"via-pmu: can't map interrupt\n");
449 /* We set IRQF_NO_SUSPEND because we don't want the interrupt
450 * to be disabled between the 2 passes of driver suspend, we
451 * control our own disabling for that one
453 if (request_irq(irq
, via_pmu_interrupt
, IRQF_NO_SUSPEND
,
454 "VIA-PMU", (void *)0)) {
455 printk(KERN_ERR
"via-pmu: can't request irq %d\n", irq
);
459 if (pmu_kind
== PMU_KEYLARGO_BASED
) {
460 gpio_node
= of_find_node_by_name(NULL
, "extint-gpio1");
461 if (gpio_node
== NULL
)
462 gpio_node
= of_find_node_by_name(NULL
,
465 gpio_irq
= irq_of_parse_and_map(gpio_node
, 0);
468 if (request_irq(gpio_irq
, gpio1_interrupt
,
469 IRQF_NO_SUSPEND
, "GPIO1 ADB",
471 printk(KERN_ERR
"pmu: can't get irq %d"
472 " (GPIO1)\n", gpio_irq
);
474 gpio_irq_enabled
= 1;
478 /* Enable interrupts */
479 out_8(&via1
[IER
], IER_SET
| SR_INT
| CB1_INT
);
481 if (request_irq(IRQ_MAC_ADB_SR
, via_pmu_interrupt
, IRQF_NO_SUSPEND
,
482 "VIA-PMU-SR", NULL
)) {
483 pr_err("%s: couldn't get SR irq\n", __func__
);
486 if (request_irq(IRQ_MAC_ADB_CL
, via_pmu_interrupt
, IRQF_NO_SUSPEND
,
487 "VIA-PMU-CL", NULL
)) {
488 pr_err("%s: couldn't get CL irq\n", __func__
);
489 free_irq(IRQ_MAC_ADB_SR
, NULL
);
492 #endif /* !CONFIG_PPC_PMAC */
494 pmu_fully_inited
= 1;
496 /* Make sure PMU settle down before continuing. This is _very_ important
497 * since the IDE probe may shut interrupts down for quite a bit of time. If
498 * a PMU communication is pending while this happens, the PMU may timeout
499 * Not that on Core99 machines, the PMU keeps sending us environement
500 * messages, we should find a way to either fix IDE or make it call
501 * pmu_suspend() before masking interrupts. This can also happens while
502 * scolling with some fbdevs.
506 } while (pmu_state
!= idle
);
511 arch_initcall(via_pmu_start
);
514 * This has to be done after pci_init, which is a subsys_initcall.
516 static int __init
via_pmu_dev_init(void)
518 if (pmu_state
== uninitialized
)
521 #ifdef CONFIG_PMAC_BACKLIGHT
522 /* Initialize backlight */
523 pmu_backlight_init();
527 if (of_machine_is_compatible("AAPL,3400/2400") ||
528 of_machine_is_compatible("AAPL,3500")) {
529 int mb
= pmac_call_feature(PMAC_FTR_GET_MB_INFO
,
530 NULL
, PMAC_MB_INFO_MODEL
, 0);
531 pmu_battery_count
= 1;
532 if (mb
== PMAC_TYPE_COMET
)
533 pmu_batteries
[0].flags
|= PMU_BATT_TYPE_COMET
;
535 pmu_batteries
[0].flags
|= PMU_BATT_TYPE_HOOPER
;
536 } else if (of_machine_is_compatible("AAPL,PowerBook1998") ||
537 of_machine_is_compatible("PowerBook1,1")) {
538 pmu_battery_count
= 2;
539 pmu_batteries
[0].flags
|= PMU_BATT_TYPE_SMART
;
540 pmu_batteries
[1].flags
|= PMU_BATT_TYPE_SMART
;
542 struct device_node
* prim
=
543 of_find_node_by_name(NULL
, "power-mgt");
544 const u32
*prim_info
= NULL
;
546 prim_info
= of_get_property(prim
, "prim-info", NULL
);
548 /* Other stuffs here yet unknown */
549 pmu_battery_count
= (prim_info
[6] >> 16) & 0xff;
550 pmu_batteries
[0].flags
|= PMU_BATT_TYPE_SMART
;
551 if (pmu_battery_count
> 1)
552 pmu_batteries
[1].flags
|= PMU_BATT_TYPE_SMART
;
556 #endif /* CONFIG_PPC32 */
558 /* Create /proc/pmu */
559 proc_pmu_root
= proc_mkdir("pmu", NULL
);
563 for (i
=0; i
<pmu_battery_count
; i
++) {
565 sprintf(title
, "battery_%ld", i
);
566 proc_pmu_batt
[i
] = proc_create_single_data(title
, 0,
567 proc_pmu_root
, pmu_battery_proc_show
,
571 proc_pmu_info
= proc_create_single("info", 0, proc_pmu_root
,
573 proc_pmu_irqstats
= proc_create_single("interrupts", 0,
574 proc_pmu_root
, pmu_irqstats_proc_show
);
575 proc_pmu_options
= proc_create("options", 0600, proc_pmu_root
,
576 &pmu_options_proc_fops
);
581 device_initcall(via_pmu_dev_init
);
587 struct adb_request req
;
589 /* Negate TREQ. Set TACK to input and TREQ to output. */
590 out_8(&via2
[B
], in_8(&via2
[B
]) | TREQ
);
591 out_8(&via2
[DIRB
], (in_8(&via2
[DIRB
]) | TREQ
) & ~TACK
);
593 pmu_request(&req
, NULL
, 2, PMU_SET_INTR_MASK
, pmu_intr_mask
);
595 while (!req
.complete
) {
597 printk(KERN_ERR
"init_pmu: no response from PMU\n");
604 /* ack all pending interrupts */
606 interrupt_data
[0][0] = 1;
607 while (interrupt_data
[0][0] || pmu_state
!= idle
) {
609 printk(KERN_ERR
"init_pmu: timed out acking intrs\n");
612 if (pmu_state
== idle
)
614 via_pmu_interrupt(0, NULL
);
618 /* Tell PMU we are ready. */
619 if (pmu_kind
== PMU_KEYLARGO_BASED
) {
620 pmu_request(&req
, NULL
, 2, PMU_SYSTEM_READY
, 2);
621 while (!req
.complete
)
625 /* Read PMU version */
626 pmu_request(&req
, NULL
, 1, PMU_GET_VERSION
);
627 pmu_wait_complete(&req
);
628 if (req
.reply_len
> 0)
629 pmu_version
= req
.reply
[0];
631 /* Read server mode setting */
632 if (pmu_kind
== PMU_KEYLARGO_BASED
) {
633 pmu_request(&req
, NULL
, 2, PMU_POWER_EVENTS
,
634 PMU_PWR_GET_POWERUP_EVENTS
);
635 pmu_wait_complete(&req
);
636 if (req
.reply_len
== 2) {
637 if (req
.reply
[1] & PMU_PWR_WAKEUP_AC_INSERT
)
638 option_server_mode
= 1;
639 printk(KERN_INFO
"via-pmu: Server Mode is %s\n",
640 option_server_mode
? "enabled" : "disabled");
644 printk(KERN_INFO
"PMU driver v%d initialized for %s, firmware: %02x\n",
645 PMU_DRIVER_VERSION
, pbook_type
[pmu_kind
], pmu_version
);
656 static void pmu_set_server_mode(int server_mode
)
658 struct adb_request req
;
660 if (pmu_kind
!= PMU_KEYLARGO_BASED
)
663 option_server_mode
= server_mode
;
664 pmu_request(&req
, NULL
, 2, PMU_POWER_EVENTS
, PMU_PWR_GET_POWERUP_EVENTS
);
665 pmu_wait_complete(&req
);
666 if (req
.reply_len
< 2)
669 pmu_request(&req
, NULL
, 4, PMU_POWER_EVENTS
,
670 PMU_PWR_SET_POWERUP_EVENTS
,
671 req
.reply
[0], PMU_PWR_WAKEUP_AC_INSERT
);
673 pmu_request(&req
, NULL
, 4, PMU_POWER_EVENTS
,
674 PMU_PWR_CLR_POWERUP_EVENTS
,
675 req
.reply
[0], PMU_PWR_WAKEUP_AC_INSERT
);
676 pmu_wait_complete(&req
);
679 /* This new version of the code for 2400/3400/3500 powerbooks
680 * is inspired from the implementation in gkrellm-pmu
683 done_battery_state_ohare(struct adb_request
* req
)
685 #ifdef CONFIG_PPC_PMAC
688 * 0x01 : AC indicator
690 * 0x04 : battery exist
693 * 0x20 : full charged
694 * 0x40 : pcharge reset
695 * 0x80 : battery exist
697 * [1][2] : battery voltage
698 * [3] : CPU temperature
699 * [4] : battery temperature
704 unsigned int bat_flags
= PMU_BATT_TYPE_HOOPER
;
705 long pcharge
, charge
, vb
, vmax
, lmax
;
706 long vmax_charging
, vmax_charged
;
707 long amperage
, voltage
, time
, max
;
708 int mb
= pmac_call_feature(PMAC_FTR_GET_MB_INFO
,
709 NULL
, PMAC_MB_INFO_MODEL
, 0);
711 if (req
->reply
[0] & 0x01)
712 pmu_power_flags
|= PMU_PWR_AC_PRESENT
;
714 pmu_power_flags
&= ~PMU_PWR_AC_PRESENT
;
716 if (mb
== PMAC_TYPE_COMET
) {
727 /* If battery installed */
728 if (req
->reply
[0] & 0x04) {
729 bat_flags
|= PMU_BATT_PRESENT
;
730 if (req
->reply
[0] & 0x02)
731 bat_flags
|= PMU_BATT_CHARGING
;
732 vb
= (req
->reply
[1] << 8) | req
->reply
[2];
733 voltage
= (vb
* 265 + 72665) / 10;
734 amperage
= req
->reply
[5];
735 if ((req
->reply
[0] & 0x01) == 0) {
737 vb
+= ((amperage
- 200) * 15)/100;
738 } else if (req
->reply
[0] & 0x02) {
739 vb
= (vb
* 97) / 100;
740 vmax
= vmax_charging
;
742 charge
= (100 * vb
) / vmax
;
743 if (req
->reply
[0] & 0x40) {
744 pcharge
= (req
->reply
[6] << 8) + req
->reply
[7];
748 pcharge
= 100 - pcharge
/ lmax
;
749 if (pcharge
< charge
)
753 time
= (charge
* 16440) / amperage
;
757 amperage
= -amperage
;
759 charge
= max
= amperage
= voltage
= time
= 0;
761 pmu_batteries
[pmu_cur_battery
].flags
= bat_flags
;
762 pmu_batteries
[pmu_cur_battery
].charge
= charge
;
763 pmu_batteries
[pmu_cur_battery
].max_charge
= max
;
764 pmu_batteries
[pmu_cur_battery
].amperage
= amperage
;
765 pmu_batteries
[pmu_cur_battery
].voltage
= voltage
;
766 pmu_batteries
[pmu_cur_battery
].time_remaining
= time
;
767 #endif /* CONFIG_PPC_PMAC */
769 clear_bit(0, &async_req_locks
);
773 done_battery_state_smart(struct adb_request
* req
)
776 * [0] : format of this structure (known: 3,4,5)
789 * [4][5] : max charge
794 unsigned int bat_flags
= PMU_BATT_TYPE_SMART
;
796 unsigned int capa
, max
, voltage
;
798 if (req
->reply
[1] & 0x01)
799 pmu_power_flags
|= PMU_PWR_AC_PRESENT
;
801 pmu_power_flags
&= ~PMU_PWR_AC_PRESENT
;
804 capa
= max
= amperage
= voltage
= 0;
806 if (req
->reply
[1] & 0x04) {
807 bat_flags
|= PMU_BATT_PRESENT
;
808 switch(req
->reply
[0]) {
810 case 4: capa
= req
->reply
[2];
812 amperage
= *((signed char *)&req
->reply
[4]);
813 voltage
= req
->reply
[5];
815 case 5: capa
= (req
->reply
[2] << 8) | req
->reply
[3];
816 max
= (req
->reply
[4] << 8) | req
->reply
[5];
817 amperage
= *((signed short *)&req
->reply
[6]);
818 voltage
= (req
->reply
[8] << 8) | req
->reply
[9];
821 pr_warn("pmu.c: unrecognized battery info, "
822 "len: %d, %4ph\n", req
->reply_len
,
828 if ((req
->reply
[1] & 0x01) && (amperage
> 0))
829 bat_flags
|= PMU_BATT_CHARGING
;
831 pmu_batteries
[pmu_cur_battery
].flags
= bat_flags
;
832 pmu_batteries
[pmu_cur_battery
].charge
= capa
;
833 pmu_batteries
[pmu_cur_battery
].max_charge
= max
;
834 pmu_batteries
[pmu_cur_battery
].amperage
= amperage
;
835 pmu_batteries
[pmu_cur_battery
].voltage
= voltage
;
837 if ((req
->reply
[1] & 0x01) && (amperage
> 0))
838 pmu_batteries
[pmu_cur_battery
].time_remaining
839 = ((max
-capa
) * 3600) / amperage
;
841 pmu_batteries
[pmu_cur_battery
].time_remaining
842 = (capa
* 3600) / (-amperage
);
844 pmu_batteries
[pmu_cur_battery
].time_remaining
= 0;
846 pmu_cur_battery
= (pmu_cur_battery
+ 1) % pmu_battery_count
;
848 clear_bit(0, &async_req_locks
);
852 query_battery_state(void)
854 if (test_and_set_bit(0, &async_req_locks
))
856 if (pmu_kind
== PMU_OHARE_BASED
)
857 pmu_request(&batt_req
, done_battery_state_ohare
,
858 1, PMU_BATTERY_STATE
);
860 pmu_request(&batt_req
, done_battery_state_smart
,
861 2, PMU_SMART_BATTERY_STATE
, pmu_cur_battery
+1);
864 static int pmu_info_proc_show(struct seq_file
*m
, void *v
)
866 seq_printf(m
, "PMU driver version : %d\n", PMU_DRIVER_VERSION
);
867 seq_printf(m
, "PMU firmware version : %02x\n", pmu_version
);
868 seq_printf(m
, "AC Power : %d\n",
869 ((pmu_power_flags
& PMU_PWR_AC_PRESENT
) != 0) || pmu_battery_count
== 0);
870 seq_printf(m
, "Battery count : %d\n", pmu_battery_count
);
875 static int pmu_irqstats_proc_show(struct seq_file
*m
, void *v
)
878 static const char *irq_names
[NUM_IRQ_STATS
] = {
879 "Unknown interrupt (type 0)",
880 "Unknown interrupt (type 1)",
881 "PC-Card eject button",
882 "Sound/Brightness button",
884 "Battery state change",
885 "Environment interrupt",
887 "Ghost interrupt (zero len)",
888 "Empty interrupt (empty mask)",
890 "Total CB1 triggered events",
891 "Total GPIO1 triggered events",
894 for (i
= 0; i
< NUM_IRQ_STATS
; i
++) {
895 seq_printf(m
, " %2u: %10u (%s)\n",
896 i
, pmu_irq_stats
[i
], irq_names
[i
]);
901 static int pmu_battery_proc_show(struct seq_file
*m
, void *v
)
903 long batnum
= (long)m
->private;
906 seq_printf(m
, "flags : %08x\n", pmu_batteries
[batnum
].flags
);
907 seq_printf(m
, "charge : %d\n", pmu_batteries
[batnum
].charge
);
908 seq_printf(m
, "max_charge : %d\n", pmu_batteries
[batnum
].max_charge
);
909 seq_printf(m
, "current : %d\n", pmu_batteries
[batnum
].amperage
);
910 seq_printf(m
, "voltage : %d\n", pmu_batteries
[batnum
].voltage
);
911 seq_printf(m
, "time rem. : %d\n", pmu_batteries
[batnum
].time_remaining
);
915 static int pmu_options_proc_show(struct seq_file
*m
, void *v
)
917 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
918 if (pmu_kind
== PMU_KEYLARGO_BASED
&&
919 pmac_call_feature(PMAC_FTR_SLEEP_STATE
,NULL
,0,-1) >= 0)
920 seq_printf(m
, "lid_wakeup=%d\n", option_lid_wakeup
);
922 if (pmu_kind
== PMU_KEYLARGO_BASED
)
923 seq_printf(m
, "server_mode=%d\n", option_server_mode
);
928 static int pmu_options_proc_open(struct inode
*inode
, struct file
*file
)
930 return single_open(file
, pmu_options_proc_show
, NULL
);
933 static ssize_t
pmu_options_proc_write(struct file
*file
,
934 const char __user
*buffer
, size_t count
, loff_t
*pos
)
938 size_t fcount
= count
;
944 if (copy_from_user(tmp
, buffer
, count
))
952 while(*val
&& (*val
!= '=')) {
962 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
963 if (pmu_kind
== PMU_KEYLARGO_BASED
&&
964 pmac_call_feature(PMAC_FTR_SLEEP_STATE
,NULL
,0,-1) >= 0)
965 if (!strcmp(label
, "lid_wakeup"))
966 option_lid_wakeup
= ((*val
) == '1');
968 if (pmu_kind
== PMU_KEYLARGO_BASED
&& !strcmp(label
, "server_mode")) {
970 new_value
= ((*val
) == '1');
971 if (new_value
!= option_server_mode
)
972 pmu_set_server_mode(new_value
);
977 static const struct file_operations pmu_options_proc_fops
= {
978 .owner
= THIS_MODULE
,
979 .open
= pmu_options_proc_open
,
982 .release
= single_release
,
983 .write
= pmu_options_proc_write
,
987 /* Send an ADB command */
988 static int pmu_send_request(struct adb_request
*req
, int sync
)
992 if (pmu_state
== uninitialized
|| !pmu_fully_inited
) {
999 switch (req
->data
[0]) {
1001 for (i
= 0; i
< req
->nbytes
- 1; ++i
)
1002 req
->data
[i
] = req
->data
[i
+1];
1004 if (pmu_data_len
[req
->data
[0]][1] != 0) {
1005 req
->reply
[0] = ADB_RET_OK
;
1009 ret
= pmu_queue_request(req
);
1012 switch (req
->data
[1]) {
1014 if (req
->nbytes
!= 2)
1016 req
->data
[0] = PMU_READ_RTC
;
1019 req
->reply
[0] = CUDA_PACKET
;
1021 req
->reply
[2] = CUDA_GET_TIME
;
1022 ret
= pmu_queue_request(req
);
1025 if (req
->nbytes
!= 6)
1027 req
->data
[0] = PMU_SET_RTC
;
1029 for (i
= 1; i
<= 4; ++i
)
1030 req
->data
[i
] = req
->data
[i
+1];
1032 req
->reply
[0] = CUDA_PACKET
;
1034 req
->reply
[2] = CUDA_SET_TIME
;
1035 ret
= pmu_queue_request(req
);
1042 for (i
= req
->nbytes
- 1; i
> 1; --i
)
1043 req
->data
[i
+2] = req
->data
[i
];
1044 req
->data
[3] = req
->nbytes
- 2;
1045 req
->data
[2] = pmu_adb_flags
;
1046 /*req->data[1] = req->data[1];*/
1047 req
->data
[0] = PMU_ADB_CMD
;
1049 req
->reply_expected
= 1;
1051 ret
= pmu_queue_request(req
);
1060 while (!req
->complete
)
1066 /* Enable/disable autopolling */
1067 static int __pmu_adb_autopoll(int devs
)
1069 struct adb_request req
;
1072 pmu_request(&req
, NULL
, 5, PMU_ADB_CMD
, 0, 0x86,
1073 adb_dev_map
>> 8, adb_dev_map
);
1076 pmu_request(&req
, NULL
, 1, PMU_ADB_POLL_OFF
);
1079 while (!req
.complete
)
1084 static int pmu_adb_autopoll(int devs
)
1086 if (pmu_state
== uninitialized
|| !pmu_fully_inited
|| !pmu_has_adb
)
1090 return __pmu_adb_autopoll(devs
);
1093 /* Reset the ADB bus */
1094 static int pmu_adb_reset_bus(void)
1096 struct adb_request req
;
1097 int save_autopoll
= adb_dev_map
;
1099 if (pmu_state
== uninitialized
|| !pmu_fully_inited
|| !pmu_has_adb
)
1102 /* anyone got a better idea?? */
1103 __pmu_adb_autopoll(0);
1107 req
.data
[0] = PMU_ADB_CMD
;
1108 req
.data
[1] = ADB_BUSRESET
;
1113 req
.reply_expected
= 1;
1114 if (pmu_queue_request(&req
) != 0) {
1115 printk(KERN_ERR
"pmu_adb_reset_bus: pmu_queue_request failed\n");
1118 pmu_wait_complete(&req
);
1120 if (save_autopoll
!= 0)
1121 __pmu_adb_autopoll(save_autopoll
);
1125 #endif /* CONFIG_ADB */
1127 /* Construct and send a pmu request */
1129 pmu_request(struct adb_request
*req
, void (*done
)(struct adb_request
*),
1135 if (pmu_state
== uninitialized
)
1138 if (nbytes
< 0 || nbytes
> 32) {
1139 printk(KERN_ERR
"pmu_request: bad nbytes (%d)\n", nbytes
);
1143 req
->nbytes
= nbytes
;
1145 va_start(list
, nbytes
);
1146 for (i
= 0; i
< nbytes
; ++i
)
1147 req
->data
[i
] = va_arg(list
, int);
1150 req
->reply_expected
= 0;
1151 return pmu_queue_request(req
);
1155 pmu_queue_request(struct adb_request
*req
)
1157 unsigned long flags
;
1160 if (pmu_state
== uninitialized
) {
1164 if (req
->nbytes
<= 0) {
1168 nsend
= pmu_data_len
[req
->data
[0]][0];
1169 if (nsend
>= 0 && req
->nbytes
!= nsend
+ 1) {
1178 spin_lock_irqsave(&pmu_lock
, flags
);
1180 last_req
->next
= req
;
1185 if (pmu_state
== idle
)
1188 spin_unlock_irqrestore(&pmu_lock
, flags
);
1196 /* Sightly increased the delay, I had one occurrence of the message
1200 while ((in_8(&via2
[B
]) & TACK
) == 0) {
1201 if (--timeout
< 0) {
1202 printk(KERN_ERR
"PMU not responding (!ack)\n");
1209 /* New PMU seems to be very sensitive to those timings, so we make sure
1210 * PCI is flushed immediately */
1214 out_8(&via1
[ACR
], in_8(&via1
[ACR
]) | SR_OUT
| SR_EXT
);
1215 out_8(&via1
[SR
], x
);
1216 out_8(&via2
[B
], in_8(&via2
[B
]) & ~TREQ
); /* assert TREQ */
1217 (void)in_8(&via2
[B
]);
1223 out_8(&via1
[ACR
], (in_8(&via1
[ACR
]) & ~SR_OUT
) | SR_EXT
);
1224 in_8(&via1
[SR
]); /* resets SR */
1225 out_8(&via2
[B
], in_8(&via2
[B
]) & ~TREQ
);
1226 (void)in_8(&via2
[B
]);
1230 pmu_done(struct adb_request
*req
)
1232 void (*done
)(struct adb_request
*) = req
->done
;
1235 /* Here, we assume that if the request has a done member, the
1236 * struct request will survive to setting req->complete to 1
1245 struct adb_request
*req
;
1247 /* assert pmu_state == idle */
1248 /* get the packet to send */
1250 if (!req
|| pmu_state
!= idle
1251 || (/*req->reply_expected && */req_awaiting_reply
))
1254 pmu_state
= sending
;
1256 data_len
= pmu_data_len
[req
->data
[0]][0];
1258 /* Sounds safer to make sure ACK is high before writing. This helped
1259 * kill a problem with ADB and some iBooks
1262 /* set the shift register to shift out and send a byte */
1263 send_byte(req
->data
[0]);
1269 if (pmu_state
== uninitialized
)
1273 via_pmu_interrupt(0, NULL
);
1279 if (pmu_state
== uninitialized
)
1283 /* Kicks ADB read when PMU is suspended */
1284 adb_int_pending
= 1;
1286 via_pmu_interrupt(0, NULL
);
1287 } while (pmu_suspended
&& (adb_int_pending
|| pmu_state
!= idle
1288 || req_awaiting_reply
));
1292 pmu_wait_complete(struct adb_request
*req
)
1294 if (pmu_state
== uninitialized
)
1296 while((pmu_state
!= idle
&& pmu_state
!= locked
) || !req
->complete
)
1297 via_pmu_interrupt(0, NULL
);
1300 /* This function loops until the PMU is idle and prevents it from
1301 * anwsering to ADB interrupts. pmu_request can still be called.
1302 * This is done to avoid spurrious shutdowns when we know we'll have
1303 * interrupts switched off for a long time
1308 unsigned long flags
;
1310 if (pmu_state
== uninitialized
)
1313 spin_lock_irqsave(&pmu_lock
, flags
);
1315 if (pmu_suspended
> 1) {
1316 spin_unlock_irqrestore(&pmu_lock
, flags
);
1321 spin_unlock_irqrestore(&pmu_lock
, flags
);
1322 if (req_awaiting_reply
)
1323 adb_int_pending
= 1;
1324 via_pmu_interrupt(0, NULL
);
1325 spin_lock_irqsave(&pmu_lock
, flags
);
1326 if (!adb_int_pending
&& pmu_state
== idle
&& !req_awaiting_reply
) {
1328 disable_irq_nosync(gpio_irq
);
1329 out_8(&via1
[IER
], CB1_INT
| IER_CLR
);
1330 spin_unlock_irqrestore(&pmu_lock
, flags
);
1339 unsigned long flags
;
1341 if (pmu_state
== uninitialized
|| pmu_suspended
< 1)
1344 spin_lock_irqsave(&pmu_lock
, flags
);
1346 if (pmu_suspended
> 0) {
1347 spin_unlock_irqrestore(&pmu_lock
, flags
);
1350 adb_int_pending
= 1;
1352 enable_irq(gpio_irq
);
1353 out_8(&via1
[IER
], CB1_INT
| IER_SET
);
1354 spin_unlock_irqrestore(&pmu_lock
, flags
);
1358 /* Interrupt data could be the result data from an ADB cmd */
1360 pmu_handle_data(unsigned char *data
, int len
)
1367 if (drop_interrupts
|| len
< 1) {
1368 adb_int_pending
= 0;
1373 /* Get PMU interrupt mask */
1376 /* Record zero interrupts for stats */
1380 /* Hack to deal with ADB autopoll flag */
1381 if (ints
& PMU_INT_ADB
)
1382 ints
&= ~(PMU_INT_ADB_AUTO
| PMU_INT_AUTO_SRQ_POLL
);
1386 if (i
> pmu_irq_stats
[10])
1387 pmu_irq_stats
[10] = i
;
1392 idx
= ffs(ints
) - 1;
1395 pmu_irq_stats
[idx
]++;
1397 /* Note: for some reason, we get an interrupt with len=1,
1398 * data[0]==0 after each normal ADB interrupt, at least
1399 * on the Pismo. Still investigating... --BenH
1403 if ((data
[0] & PMU_INT_ADB_AUTO
) == 0) {
1404 struct adb_request
*req
= req_awaiting_reply
;
1406 printk(KERN_ERR
"PMU: extra ADB reply\n");
1409 req_awaiting_reply
= NULL
;
1413 memcpy(req
->reply
, data
+ 1, len
- 1);
1414 req
->reply_len
= len
- 1;
1419 if (len
== 4 && data
[1] == 0x2c) {
1420 extern int xmon_wants_key
, xmon_adb_keycode
;
1421 if (xmon_wants_key
) {
1422 xmon_adb_keycode
= data
[2];
1426 #endif /* CONFIG_XMON */
1429 * XXX On the [23]400 the PMU gives us an up
1430 * event for keycodes 0x74 or 0x75 when the PC
1431 * card eject buttons are released, so we
1432 * ignore those events.
1434 if (!(pmu_kind
== PMU_OHARE_BASED
&& len
== 4
1435 && data
[1] == 0x2c && data
[3] == 0xff
1436 && (data
[2] & ~1) == 0xf4))
1437 adb_input(data
+1, len
-1, 1);
1438 #endif /* CONFIG_ADB */
1442 /* Sound/brightness button pressed */
1443 case PMU_INT_SNDBRT
:
1444 #ifdef CONFIG_PMAC_BACKLIGHT
1446 pmac_backlight_set_legacy_brightness_pmu(data
[1] >> 4);
1450 /* Tick interrupt */
1452 /* Environment or tick interrupt, query batteries */
1453 if (pmu_battery_count
) {
1454 if ((--query_batt_timer
) == 0) {
1455 query_battery_state();
1456 query_batt_timer
= BATTERY_POLLING_COUNT
;
1461 case PMU_INT_ENVIRONMENT
:
1462 if (pmu_battery_count
)
1463 query_battery_state();
1464 pmu_pass_intr(data
, len
);
1465 /* len == 6 is probably a bad check. But how do I
1466 * know what PMU versions send what events here? */
1468 via_pmu_event(PMU_EVT_POWER
, !!(data
[1]&8));
1469 via_pmu_event(PMU_EVT_LID
, data
[1]&1);
1474 pmu_pass_intr(data
, len
);
1479 static struct adb_request
*
1482 struct adb_request
*req
;
1485 if (in_8(&via2
[B
]) & TREQ
) {
1486 printk(KERN_ERR
"PMU: spurious SR intr (%x)\n", in_8(&via2
[B
]));
1489 /* The ack may not yet be low when we get the interrupt */
1490 while ((in_8(&via2
[B
]) & TACK
) != 0)
1493 /* if reading grab the byte, and reset the interrupt */
1494 if (pmu_state
== reading
|| pmu_state
== reading_intr
)
1495 bite
= in_8(&via1
[SR
]);
1497 /* reset TREQ and wait for TACK to go high */
1498 out_8(&via2
[B
], in_8(&via2
[B
]) | TREQ
);
1501 switch (pmu_state
) {
1505 data_len
= req
->nbytes
- 1;
1506 send_byte(data_len
);
1509 if (data_index
<= data_len
) {
1510 send_byte(req
->data
[data_index
++]);
1514 data_len
= pmu_data_len
[req
->data
[0]][1];
1515 if (data_len
== 0) {
1517 current_req
= req
->next
;
1518 if (req
->reply_expected
)
1519 req_awaiting_reply
= req
;
1523 pmu_state
= reading
;
1525 reply_ptr
= req
->reply
+ req
->reply_len
;
1533 pmu_state
= reading_intr
;
1534 reply_ptr
= interrupt_data
[int_data_last
];
1536 if (gpio_irq
>= 0 && !gpio_irq_enabled
) {
1537 enable_irq(gpio_irq
);
1538 gpio_irq_enabled
= 1;
1544 if (data_len
== -1) {
1547 printk(KERN_ERR
"PMU: bad reply len %d\n", bite
);
1548 } else if (data_index
< 32) {
1549 reply_ptr
[data_index
++] = bite
;
1551 if (data_index
< data_len
) {
1556 if (pmu_state
== reading_intr
) {
1558 int_data_state
[int_data_last
] = int_data_ready
;
1559 interrupt_data_len
[int_data_last
] = data_len
;
1563 * For PMU sleep and freq change requests, we lock the
1564 * PMU until it's explicitly unlocked. This avoids any
1565 * spurrious event polling getting in
1567 current_req
= req
->next
;
1568 req
->reply_len
+= data_index
;
1569 if (req
->data
[0] == PMU_SLEEP
|| req
->data
[0] == PMU_CPU_SPEED
)
1578 printk(KERN_ERR
"via_pmu_interrupt: unknown state %d?\n",
1585 via_pmu_interrupt(int irq
, void *arg
)
1587 unsigned long flags
;
1591 struct adb_request
*req
= NULL
;
1594 /* This is a bit brutal, we can probably do better */
1595 spin_lock_irqsave(&pmu_lock
, flags
);
1599 /* On 68k Macs, VIA interrupts are dispatched individually.
1600 * Unless we are polling, the relevant IRQ flag has already
1604 if (IS_ENABLED(CONFIG_PPC_PMAC
) || !irq
) {
1605 intr
= in_8(&via1
[IFR
]) & (SR_INT
| CB1_INT
);
1606 out_8(&via1
[IFR
], intr
);
1608 #ifndef CONFIG_PPC_PMAC
1610 case IRQ_MAC_ADB_CL
:
1613 case IRQ_MAC_ADB_SR
:
1621 if (++nloop
> 1000) {
1622 printk(KERN_DEBUG
"PMU: stuck in intr loop, "
1623 "intr=%x, ier=%x pmu_state=%d\n",
1624 intr
, in_8(&via1
[IER
]), pmu_state
);
1627 if (intr
& CB1_INT
) {
1628 adb_int_pending
= 1;
1629 pmu_irq_stats
[11]++;
1631 if (intr
& SR_INT
) {
1632 req
= pmu_sr_intr();
1636 #ifndef CONFIG_PPC_PMAC
1642 if (pmu_state
== idle
) {
1643 if (adb_int_pending
) {
1644 if (int_data_state
[0] == int_data_empty
)
1646 else if (int_data_state
[1] == int_data_empty
)
1651 int_data_state
[int_data_last
] = int_data_fill
;
1652 /* Sounds safer to make sure ACK is high before writing.
1653 * This helped kill a problem with ADB and some iBooks
1656 send_byte(PMU_INT_ACK
);
1657 adb_int_pending
= 0;
1658 } else if (current_req
)
1662 /* Mark the oldest buffer for flushing */
1663 if (int_data_state
[!int_data_last
] == int_data_ready
) {
1664 int_data_state
[!int_data_last
] = int_data_flush
;
1665 int_data
= !int_data_last
;
1666 } else if (int_data_state
[int_data_last
] == int_data_ready
) {
1667 int_data_state
[int_data_last
] = int_data_flush
;
1668 int_data
= int_data_last
;
1671 spin_unlock_irqrestore(&pmu_lock
, flags
);
1673 /* Deal with completed PMU requests outside of the lock */
1679 /* Deal with interrupt datas outside of the lock */
1680 if (int_data
>= 0) {
1681 pmu_handle_data(interrupt_data
[int_data
], interrupt_data_len
[int_data
]);
1682 spin_lock_irqsave(&pmu_lock
, flags
);
1684 int_data_state
[int_data
] = int_data_empty
;
1689 return IRQ_RETVAL(handled
);
1695 unsigned long flags
;
1697 spin_lock_irqsave(&pmu_lock
, flags
);
1698 if (pmu_state
== locked
)
1700 adb_int_pending
= 1;
1701 spin_unlock_irqrestore(&pmu_lock
, flags
);
1705 static __maybe_unused irqreturn_t
1706 gpio1_interrupt(int irq
, void *arg
)
1708 unsigned long flags
;
1710 if ((in_8(gpio_reg
+ 0x9) & 0x02) == 0) {
1711 spin_lock_irqsave(&pmu_lock
, flags
);
1712 if (gpio_irq_enabled
> 0) {
1713 disable_irq_nosync(gpio_irq
);
1714 gpio_irq_enabled
= 0;
1716 pmu_irq_stats
[12]++;
1717 adb_int_pending
= 1;
1718 spin_unlock_irqrestore(&pmu_lock
, flags
);
1719 via_pmu_interrupt(0, NULL
);
1726 pmu_enable_irled(int on
)
1728 struct adb_request req
;
1730 if (pmu_state
== uninitialized
)
1732 if (pmu_kind
== PMU_KEYLARGO_BASED
)
1735 pmu_request(&req
, NULL
, 2, PMU_POWER_CTRL
, PMU_POW_IRLED
|
1736 (on
? PMU_POW_ON
: PMU_POW_OFF
));
1737 pmu_wait_complete(&req
);
1740 /* Offset between Unix time (1970-based) and Mac time (1904-based) */
1741 #define RTC_OFFSET 2082844800
1743 time64_t
pmu_get_time(void)
1745 struct adb_request req
;
1748 if (pmu_request(&req
, NULL
, 1, PMU_READ_RTC
) < 0)
1750 pmu_wait_complete(&req
);
1751 if (req
.reply_len
!= 4)
1752 pr_err("%s: got %d byte reply\n", __func__
, req
.reply_len
);
1753 now
= (req
.reply
[0] << 24) + (req
.reply
[1] << 16) +
1754 (req
.reply
[2] << 8) + req
.reply
[3];
1755 return (time64_t
)now
- RTC_OFFSET
;
1758 int pmu_set_rtc_time(struct rtc_time
*tm
)
1761 struct adb_request req
;
1763 now
= lower_32_bits(rtc_tm_to_time64(tm
) + RTC_OFFSET
);
1764 if (pmu_request(&req
, NULL
, 5, PMU_SET_RTC
,
1765 now
>> 24, now
>> 16, now
>> 8, now
) < 0)
1767 pmu_wait_complete(&req
);
1768 if (req
.reply_len
!= 0)
1769 pr_err("%s: got %d byte reply\n", __func__
, req
.reply_len
);
1776 struct adb_request req
;
1778 if (pmu_state
== uninitialized
)
1781 local_irq_disable();
1783 drop_interrupts
= 1;
1785 if (pmu_kind
!= PMU_KEYLARGO_BASED
) {
1786 pmu_request(&req
, NULL
, 2, PMU_SET_INTR_MASK
, PMU_INT_ADB
|
1788 while(!req
.complete
)
1792 pmu_request(&req
, NULL
, 1, PMU_RESET
);
1793 pmu_wait_complete(&req
);
1801 struct adb_request req
;
1803 if (pmu_state
== uninitialized
)
1806 local_irq_disable();
1808 drop_interrupts
= 1;
1810 if (pmu_kind
!= PMU_KEYLARGO_BASED
) {
1811 pmu_request(&req
, NULL
, 2, PMU_SET_INTR_MASK
, PMU_INT_ADB
|
1813 pmu_wait_complete(&req
);
1815 /* Disable server mode on shutdown or we'll just
1818 pmu_set_server_mode(0);
1821 pmu_request(&req
, NULL
, 5, PMU_SHUTDOWN
,
1822 'M', 'A', 'T', 'T');
1823 pmu_wait_complete(&req
);
1831 return pmu_state
!= uninitialized
;
1834 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
1836 * Put the powerbook to sleep.
1839 static u32 save_via
[8];
1842 save_via_state(void)
1844 save_via
[0] = in_8(&via1
[ANH
]);
1845 save_via
[1] = in_8(&via1
[DIRA
]);
1846 save_via
[2] = in_8(&via1
[B
]);
1847 save_via
[3] = in_8(&via1
[DIRB
]);
1848 save_via
[4] = in_8(&via1
[PCR
]);
1849 save_via
[5] = in_8(&via1
[ACR
]);
1850 save_via
[6] = in_8(&via1
[T1CL
]);
1851 save_via
[7] = in_8(&via1
[T1CH
]);
1854 restore_via_state(void)
1856 out_8(&via1
[ANH
], save_via
[0]);
1857 out_8(&via1
[DIRA
], save_via
[1]);
1858 out_8(&via1
[B
], save_via
[2]);
1859 out_8(&via1
[DIRB
], save_via
[3]);
1860 out_8(&via1
[PCR
], save_via
[4]);
1861 out_8(&via1
[ACR
], save_via
[5]);
1862 out_8(&via1
[T1CL
], save_via
[6]);
1863 out_8(&via1
[T1CH
], save_via
[7]);
1864 out_8(&via1
[IER
], IER_CLR
| 0x7f); /* disable all intrs */
1865 out_8(&via1
[IFR
], 0x7f); /* clear IFR */
1866 out_8(&via1
[IER
], IER_SET
| SR_INT
| CB1_INT
);
1869 #define GRACKLE_PM (1<<7)
1870 #define GRACKLE_DOZE (1<<5)
1871 #define GRACKLE_NAP (1<<4)
1872 #define GRACKLE_SLEEP (1<<3)
1874 static int powerbook_sleep_grackle(void)
1876 unsigned long save_l2cr
;
1877 unsigned short pmcr1
;
1878 struct adb_request req
;
1879 struct pci_dev
*grackle
;
1881 grackle
= pci_get_domain_bus_and_slot(0, 0, 0);
1885 /* Turn off various things. Darwin does some retry tests here... */
1886 pmu_request(&req
, NULL
, 2, PMU_POWER_CTRL0
, PMU_POW0_OFF
|PMU_POW0_HARD_DRIVE
);
1887 pmu_wait_complete(&req
);
1888 pmu_request(&req
, NULL
, 2, PMU_POWER_CTRL
,
1889 PMU_POW_OFF
|PMU_POW_BACKLIGHT
|PMU_POW_IRLED
|PMU_POW_MEDIABAY
);
1890 pmu_wait_complete(&req
);
1892 /* For 750, save backside cache setting and disable it */
1893 save_l2cr
= _get_L2CR(); /* (returns -1 if not available) */
1895 if (!__fake_sleep
) {
1896 /* Ask the PMU to put us to sleep */
1897 pmu_request(&req
, NULL
, 5, PMU_SLEEP
, 'M', 'A', 'T', 'T');
1898 pmu_wait_complete(&req
);
1901 /* The VIA is supposed not to be restored correctly*/
1903 /* We shut down some HW */
1904 pmac_call_feature(PMAC_FTR_SLEEP_STATE
,NULL
,0,1);
1906 pci_read_config_word(grackle
, 0x70, &pmcr1
);
1907 /* Apparently, MacOS uses NAP mode for Grackle ??? */
1908 pmcr1
&= ~(GRACKLE_DOZE
|GRACKLE_SLEEP
);
1909 pmcr1
|= GRACKLE_PM
|GRACKLE_NAP
;
1910 pci_write_config_word(grackle
, 0x70, pmcr1
);
1912 /* Call low-level ASM sleep handler */
1916 low_sleep_handler();
1918 /* We're awake again, stop grackle PM */
1919 pci_read_config_word(grackle
, 0x70, &pmcr1
);
1920 pmcr1
&= ~(GRACKLE_PM
|GRACKLE_DOZE
|GRACKLE_SLEEP
|GRACKLE_NAP
);
1921 pci_write_config_word(grackle
, 0x70, pmcr1
);
1923 pci_dev_put(grackle
);
1925 /* Make sure the PMU is idle */
1926 pmac_call_feature(PMAC_FTR_SLEEP_STATE
,NULL
,0,0);
1927 restore_via_state();
1929 /* Restore L2 cache */
1930 if (save_l2cr
!= 0xffffffff && (save_l2cr
& L2CR_L2E
) != 0)
1931 _set_L2CR(save_l2cr
);
1933 /* Restore userland MMU context */
1934 switch_mmu_context(NULL
, current
->active_mm
, NULL
);
1936 /* Power things up */
1938 pmu_request(&req
, NULL
, 2, PMU_SET_INTR_MASK
, pmu_intr_mask
);
1939 pmu_wait_complete(&req
);
1940 pmu_request(&req
, NULL
, 2, PMU_POWER_CTRL0
,
1941 PMU_POW0_ON
|PMU_POW0_HARD_DRIVE
);
1942 pmu_wait_complete(&req
);
1943 pmu_request(&req
, NULL
, 2, PMU_POWER_CTRL
,
1944 PMU_POW_ON
|PMU_POW_BACKLIGHT
|PMU_POW_CHARGER
|PMU_POW_IRLED
|PMU_POW_MEDIABAY
);
1945 pmu_wait_complete(&req
);
1951 powerbook_sleep_Core99(void)
1953 unsigned long save_l2cr
;
1954 unsigned long save_l3cr
;
1955 struct adb_request req
;
1957 if (pmac_call_feature(PMAC_FTR_SLEEP_STATE
,NULL
,0,-1) < 0) {
1958 printk(KERN_ERR
"Sleep mode not supported on this machine\n");
1962 if (num_online_cpus() > 1 || cpu_is_offline(0))
1965 /* Stop environment and ADB interrupts */
1966 pmu_request(&req
, NULL
, 2, PMU_SET_INTR_MASK
, 0);
1967 pmu_wait_complete(&req
);
1969 /* Tell PMU what events will wake us up */
1970 pmu_request(&req
, NULL
, 4, PMU_POWER_EVENTS
, PMU_PWR_CLR_WAKEUP_EVENTS
,
1972 pmu_wait_complete(&req
);
1973 pmu_request(&req
, NULL
, 4, PMU_POWER_EVENTS
, PMU_PWR_SET_WAKEUP_EVENTS
,
1974 0, PMU_PWR_WAKEUP_KEY
|
1975 (option_lid_wakeup
? PMU_PWR_WAKEUP_LID_OPEN
: 0));
1976 pmu_wait_complete(&req
);
1978 /* Save the state of the L2 and L3 caches */
1979 save_l3cr
= _get_L3CR(); /* (returns -1 if not available) */
1980 save_l2cr
= _get_L2CR(); /* (returns -1 if not available) */
1982 if (!__fake_sleep
) {
1983 /* Ask the PMU to put us to sleep */
1984 pmu_request(&req
, NULL
, 5, PMU_SLEEP
, 'M', 'A', 'T', 'T');
1985 pmu_wait_complete(&req
);
1988 /* The VIA is supposed not to be restored correctly*/
1991 /* Shut down various ASICs. There's a chance that we can no longer
1992 * talk to the PMU after this, so I moved it to _after_ sending the
1993 * sleep command to it. Still need to be checked.
1995 pmac_call_feature(PMAC_FTR_SLEEP_STATE
, NULL
, 0, 1);
1997 /* Call low-level ASM sleep handler */
2001 low_sleep_handler();
2003 /* Restore Apple core ASICs state */
2004 pmac_call_feature(PMAC_FTR_SLEEP_STATE
, NULL
, 0, 0);
2007 restore_via_state();
2009 /* tweak LPJ before cpufreq is there */
2010 loops_per_jiffy
*= 2;
2013 pmac_call_early_video_resume();
2015 /* Restore L2 cache */
2016 if (save_l2cr
!= 0xffffffff && (save_l2cr
& L2CR_L2E
) != 0)
2017 _set_L2CR(save_l2cr
);
2018 /* Restore L3 cache */
2019 if (save_l3cr
!= 0xffffffff && (save_l3cr
& L3CR_L3E
) != 0)
2020 _set_L3CR(save_l3cr
);
2022 /* Restore userland MMU context */
2023 switch_mmu_context(NULL
, current
->active_mm
, NULL
);
2025 /* Tell PMU we are ready */
2027 pmu_request(&req
, NULL
, 2, PMU_SYSTEM_READY
, 2);
2028 pmu_wait_complete(&req
);
2029 pmu_request(&req
, NULL
, 2, PMU_SET_INTR_MASK
, pmu_intr_mask
);
2030 pmu_wait_complete(&req
);
2032 /* Restore LPJ, cpufreq will adjust the cpu frequency */
2033 loops_per_jiffy
/= 2;
2038 #define PB3400_MEM_CTRL 0xf8000000
2039 #define PB3400_MEM_CTRL_SLEEP 0x70
2041 static void __iomem
*pb3400_mem_ctrl
;
2043 static void powerbook_sleep_init_3400(void)
2045 /* map in the memory controller registers */
2046 pb3400_mem_ctrl
= ioremap(PB3400_MEM_CTRL
, 0x100);
2047 if (pb3400_mem_ctrl
== NULL
)
2048 printk(KERN_WARNING
"ioremap failed: sleep won't be possible");
2051 static int powerbook_sleep_3400(void)
2056 struct adb_request sleep_req
;
2057 unsigned int __iomem
*mem_ctrl_sleep
;
2059 if (pb3400_mem_ctrl
== NULL
)
2061 mem_ctrl_sleep
= pb3400_mem_ctrl
+ PB3400_MEM_CTRL_SLEEP
;
2063 /* Set the memory controller to keep the memory refreshed
2064 while we're asleep */
2065 for (i
= 0x403f; i
>= 0x4000; --i
) {
2066 out_be32(mem_ctrl_sleep
, i
);
2068 x
= (in_be32(mem_ctrl_sleep
) >> 16) & 0x3ff;
2074 /* Ask the PMU to put us to sleep */
2075 pmu_request(&sleep_req
, NULL
, 5, PMU_SLEEP
, 'M', 'A', 'T', 'T');
2076 pmu_wait_complete(&sleep_req
);
2079 pmac_call_feature(PMAC_FTR_SLEEP_STATE
, NULL
, 0, 1);
2083 /* Put the CPU into sleep mode */
2084 hid0
= mfspr(SPRN_HID0
);
2085 hid0
= (hid0
& ~(HID0_NAP
| HID0_DOZE
)) | HID0_SLEEP
;
2086 mtspr(SPRN_HID0
, hid0
);
2088 msr
= mfmsr() | MSR_POW
;
2094 local_irq_disable();
2096 /* OK, we're awake again, start restoring things */
2097 out_be32(mem_ctrl_sleep
, 0x3f);
2098 pmac_call_feature(PMAC_FTR_SLEEP_STATE
, NULL
, 0, 0);
2103 #endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
2106 * Support for /dev/pmu device
2108 #define RB_SIZE 0x10
2109 struct pmu_private
{
2110 struct list_head list
;
2115 unsigned char data
[16];
2117 wait_queue_head_t wait
;
2119 #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
2120 int backlight_locker
;
2124 static LIST_HEAD(all_pmu_pvt
);
2125 static DEFINE_SPINLOCK(all_pvt_lock
);
2128 pmu_pass_intr(unsigned char *data
, int len
)
2130 struct pmu_private
*pp
;
2131 struct list_head
*list
;
2133 unsigned long flags
;
2135 if (len
> sizeof(pp
->rb_buf
[0].data
))
2136 len
= sizeof(pp
->rb_buf
[0].data
);
2137 spin_lock_irqsave(&all_pvt_lock
, flags
);
2138 for (list
= &all_pmu_pvt
; (list
= list
->next
) != &all_pmu_pvt
; ) {
2139 pp
= list_entry(list
, struct pmu_private
, list
);
2140 spin_lock(&pp
->lock
);
2144 if (i
!= pp
->rb_get
) {
2145 struct rb_entry
*rp
= &pp
->rb_buf
[pp
->rb_put
];
2147 memcpy(rp
->data
, data
, len
);
2149 wake_up_interruptible(&pp
->wait
);
2151 spin_unlock(&pp
->lock
);
2153 spin_unlock_irqrestore(&all_pvt_lock
, flags
);
2157 pmu_open(struct inode
*inode
, struct file
*file
)
2159 struct pmu_private
*pp
;
2160 unsigned long flags
;
2162 pp
= kmalloc(sizeof(struct pmu_private
), GFP_KERNEL
);
2165 pp
->rb_get
= pp
->rb_put
= 0;
2166 spin_lock_init(&pp
->lock
);
2167 init_waitqueue_head(&pp
->wait
);
2168 mutex_lock(&pmu_info_proc_mutex
);
2169 spin_lock_irqsave(&all_pvt_lock
, flags
);
2170 #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
2171 pp
->backlight_locker
= 0;
2173 list_add(&pp
->list
, &all_pmu_pvt
);
2174 spin_unlock_irqrestore(&all_pvt_lock
, flags
);
2175 file
->private_data
= pp
;
2176 mutex_unlock(&pmu_info_proc_mutex
);
2181 pmu_read(struct file
*file
, char __user
*buf
,
2182 size_t count
, loff_t
*ppos
)
2184 struct pmu_private
*pp
= file
->private_data
;
2185 DECLARE_WAITQUEUE(wait
, current
);
2186 unsigned long flags
;
2189 if (count
< 1 || !pp
)
2191 if (!access_ok(buf
, count
))
2194 spin_lock_irqsave(&pp
->lock
, flags
);
2195 add_wait_queue(&pp
->wait
, &wait
);
2196 set_current_state(TASK_INTERRUPTIBLE
);
2200 if (pp
->rb_get
!= pp
->rb_put
) {
2202 struct rb_entry
*rp
= &pp
->rb_buf
[i
];
2204 spin_unlock_irqrestore(&pp
->lock
, flags
);
2207 if (ret
> 0 && copy_to_user(buf
, rp
->data
, ret
))
2211 spin_lock_irqsave(&pp
->lock
, flags
);
2216 if (file
->f_flags
& O_NONBLOCK
)
2219 if (signal_pending(current
))
2221 spin_unlock_irqrestore(&pp
->lock
, flags
);
2223 spin_lock_irqsave(&pp
->lock
, flags
);
2225 __set_current_state(TASK_RUNNING
);
2226 remove_wait_queue(&pp
->wait
, &wait
);
2227 spin_unlock_irqrestore(&pp
->lock
, flags
);
2233 pmu_write(struct file
*file
, const char __user
*buf
,
2234 size_t count
, loff_t
*ppos
)
2240 pmu_fpoll(struct file
*filp
, poll_table
*wait
)
2242 struct pmu_private
*pp
= filp
->private_data
;
2244 unsigned long flags
;
2248 poll_wait(filp
, &pp
->wait
, wait
);
2249 spin_lock_irqsave(&pp
->lock
, flags
);
2250 if (pp
->rb_get
!= pp
->rb_put
)
2252 spin_unlock_irqrestore(&pp
->lock
, flags
);
2257 pmu_release(struct inode
*inode
, struct file
*file
)
2259 struct pmu_private
*pp
= file
->private_data
;
2260 unsigned long flags
;
2263 file
->private_data
= NULL
;
2264 spin_lock_irqsave(&all_pvt_lock
, flags
);
2265 list_del(&pp
->list
);
2266 spin_unlock_irqrestore(&all_pvt_lock
, flags
);
2268 #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
2269 if (pp
->backlight_locker
)
2270 pmac_backlight_enable();
2278 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
2279 static void pmac_suspend_disable_irqs(void)
2281 /* Call platform functions marked "on sleep" */
2282 pmac_pfunc_i2c_suspend();
2283 pmac_pfunc_base_suspend();
2286 static int powerbook_sleep(suspend_state_t state
)
2290 /* Wait for completion of async requests */
2291 while (!batt_req
.complete
)
2294 /* Giveup the lazy FPU & vec so we don't have to back them
2295 * up from the low level code
2299 #ifdef CONFIG_ALTIVEC
2300 if (cpu_has_feature(CPU_FTR_ALTIVEC
))
2301 enable_kernel_altivec();
2302 #endif /* CONFIG_ALTIVEC */
2305 case PMU_OHARE_BASED
:
2306 error
= powerbook_sleep_3400();
2308 case PMU_HEATHROW_BASED
:
2309 case PMU_PADDINGTON_BASED
:
2310 error
= powerbook_sleep_grackle();
2312 case PMU_KEYLARGO_BASED
:
2313 error
= powerbook_sleep_Core99();
2327 static void pmac_suspend_enable_irqs(void)
2329 /* Force a poll of ADB interrupts */
2330 adb_int_pending
= 1;
2331 via_pmu_interrupt(0, NULL
);
2335 /* Call platform functions marked "on wake" */
2336 pmac_pfunc_base_resume();
2337 pmac_pfunc_i2c_resume();
2340 static int pmu_sleep_valid(suspend_state_t state
)
2342 return state
== PM_SUSPEND_MEM
2343 && (pmac_call_feature(PMAC_FTR_SLEEP_STATE
, NULL
, 0, -1) >= 0);
2346 static const struct platform_suspend_ops pmu_pm_ops
= {
2347 .enter
= powerbook_sleep
,
2348 .valid
= pmu_sleep_valid
,
2351 static int register_pmu_pm_ops(void)
2353 if (pmu_kind
== PMU_OHARE_BASED
)
2354 powerbook_sleep_init_3400();
2355 ppc_md
.suspend_disable_irqs
= pmac_suspend_disable_irqs
;
2356 ppc_md
.suspend_enable_irqs
= pmac_suspend_enable_irqs
;
2357 suspend_set_ops(&pmu_pm_ops
);
2362 device_initcall(register_pmu_pm_ops
);
2365 static int pmu_ioctl(struct file
*filp
,
2366 u_int cmd
, u_long arg
)
2368 __u32 __user
*argp
= (__u32 __user
*)arg
;
2369 int error
= -EINVAL
;
2372 #ifdef CONFIG_PPC_PMAC
2374 if (!capable(CAP_SYS_ADMIN
))
2376 return pm_suspend(PM_SUSPEND_MEM
);
2377 case PMU_IOC_CAN_SLEEP
:
2378 if (pmac_call_feature(PMAC_FTR_SLEEP_STATE
, NULL
, 0, -1) < 0)
2379 return put_user(0, argp
);
2381 return put_user(1, argp
);
2384 #ifdef CONFIG_PMAC_BACKLIGHT_LEGACY
2385 /* Compatibility ioctl's for backlight */
2386 case PMU_IOC_GET_BACKLIGHT
:
2390 brightness
= pmac_backlight_get_legacy_brightness();
2394 return put_user(brightness
, argp
);
2397 case PMU_IOC_SET_BACKLIGHT
:
2401 error
= get_user(brightness
, argp
);
2405 return pmac_backlight_set_legacy_brightness(brightness
);
2407 #ifdef CONFIG_INPUT_ADBHID
2408 case PMU_IOC_GRAB_BACKLIGHT
: {
2409 struct pmu_private
*pp
= filp
->private_data
;
2411 if (pp
->backlight_locker
)
2414 pp
->backlight_locker
= 1;
2415 pmac_backlight_disable();
2419 #endif /* CONFIG_INPUT_ADBHID */
2420 #endif /* CONFIG_PMAC_BACKLIGHT_LEGACY */
2422 case PMU_IOC_GET_MODEL
:
2423 return put_user(pmu_kind
, argp
);
2424 case PMU_IOC_HAS_ADB
:
2425 return put_user(pmu_has_adb
, argp
);
2430 static long pmu_unlocked_ioctl(struct file
*filp
,
2431 u_int cmd
, u_long arg
)
2435 mutex_lock(&pmu_info_proc_mutex
);
2436 ret
= pmu_ioctl(filp
, cmd
, arg
);
2437 mutex_unlock(&pmu_info_proc_mutex
);
2442 #ifdef CONFIG_COMPAT
2443 #define PMU_IOC_GET_BACKLIGHT32 _IOR('B', 1, compat_size_t)
2444 #define PMU_IOC_SET_BACKLIGHT32 _IOW('B', 2, compat_size_t)
2445 #define PMU_IOC_GET_MODEL32 _IOR('B', 3, compat_size_t)
2446 #define PMU_IOC_HAS_ADB32 _IOR('B', 4, compat_size_t)
2447 #define PMU_IOC_CAN_SLEEP32 _IOR('B', 5, compat_size_t)
2448 #define PMU_IOC_GRAB_BACKLIGHT32 _IOR('B', 6, compat_size_t)
2450 static long compat_pmu_ioctl (struct file
*filp
, u_int cmd
, u_long arg
)
2455 case PMU_IOC_GET_BACKLIGHT32
:
2456 cmd
= PMU_IOC_GET_BACKLIGHT
;
2458 case PMU_IOC_SET_BACKLIGHT32
:
2459 cmd
= PMU_IOC_SET_BACKLIGHT
;
2461 case PMU_IOC_GET_MODEL32
:
2462 cmd
= PMU_IOC_GET_MODEL
;
2464 case PMU_IOC_HAS_ADB32
:
2465 cmd
= PMU_IOC_HAS_ADB
;
2467 case PMU_IOC_CAN_SLEEP32
:
2468 cmd
= PMU_IOC_CAN_SLEEP
;
2470 case PMU_IOC_GRAB_BACKLIGHT32
:
2471 cmd
= PMU_IOC_GRAB_BACKLIGHT
;
2474 return -ENOIOCTLCMD
;
2476 return pmu_unlocked_ioctl(filp
, cmd
, (unsigned long)compat_ptr(arg
));
2480 static const struct file_operations pmu_device_fops
= {
2484 .unlocked_ioctl
= pmu_unlocked_ioctl
,
2485 #ifdef CONFIG_COMPAT
2486 .compat_ioctl
= compat_pmu_ioctl
,
2489 .release
= pmu_release
,
2490 .llseek
= noop_llseek
,
2493 static struct miscdevice pmu_device
= {
2494 PMU_MINOR
, "pmu", &pmu_device_fops
2497 static int pmu_device_init(void)
2499 if (pmu_state
== uninitialized
)
2501 if (misc_register(&pmu_device
) < 0)
2502 printk(KERN_ERR
"via-pmu: cannot register misc device.\n");
2505 device_initcall(pmu_device_init
);
2510 polled_handshake(void)
2512 via2
[B
] &= ~TREQ
; eieio();
2513 while ((via2
[B
] & TACK
) != 0)
2515 via2
[B
] |= TREQ
; eieio();
2516 while ((via2
[B
] & TACK
) == 0)
2521 polled_send_byte(int x
)
2523 via1
[ACR
] |= SR_OUT
| SR_EXT
; eieio();
2524 via1
[SR
] = x
; eieio();
2529 polled_recv_byte(void)
2533 via1
[ACR
] = (via1
[ACR
] & ~SR_OUT
) | SR_EXT
; eieio();
2534 x
= via1
[SR
]; eieio();
2536 x
= via1
[SR
]; eieio();
2541 pmu_polled_request(struct adb_request
*req
)
2543 unsigned long flags
;
2548 l
= pmu_data_len
[c
][0];
2549 if (l
>= 0 && req
->nbytes
!= l
+ 1)
2552 local_irq_save(flags
);
2553 while (pmu_state
!= idle
)
2556 while ((via2
[B
] & TACK
) == 0)
2558 polled_send_byte(c
);
2560 l
= req
->nbytes
- 1;
2561 polled_send_byte(l
);
2563 for (i
= 1; i
<= l
; ++i
)
2564 polled_send_byte(req
->data
[i
]);
2566 l
= pmu_data_len
[c
][1];
2568 l
= polled_recv_byte();
2569 for (i
= 0; i
< l
; ++i
)
2570 req
->reply
[i
+ req
->reply_len
] = polled_recv_byte();
2575 local_irq_restore(flags
);
2579 /* N.B. This doesn't work on the 3400 */
2580 void pmu_blink(int n
)
2582 struct adb_request req
;
2584 memset(&req
, 0, sizeof(req
));
2586 for (; n
> 0; --n
) {
2593 req
.reply
[0] = ADB_RET_OK
;
2595 req
.reply_expected
= 0;
2596 pmu_polled_request(&req
);
2604 req
.reply
[0] = ADB_RET_OK
;
2606 req
.reply_expected
= 0;
2607 pmu_polled_request(&req
);
2612 #endif /* DEBUG_SLEEP */
2614 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
2615 int pmu_sys_suspended
;
2617 static int pmu_syscore_suspend(void)
2619 /* Suspend PMU event interrupts */
2621 pmu_sys_suspended
= 1;
2623 #ifdef CONFIG_PMAC_BACKLIGHT
2624 /* Tell backlight code not to muck around with the chip anymore */
2625 pmu_backlight_set_sleep(1);
2631 static void pmu_syscore_resume(void)
2633 struct adb_request req
;
2635 if (!pmu_sys_suspended
)
2638 /* Tell PMU we are ready */
2639 pmu_request(&req
, NULL
, 2, PMU_SYSTEM_READY
, 2);
2640 pmu_wait_complete(&req
);
2642 #ifdef CONFIG_PMAC_BACKLIGHT
2643 /* Tell backlight code it can use the chip again */
2644 pmu_backlight_set_sleep(0);
2646 /* Resume PMU event interrupts */
2648 pmu_sys_suspended
= 0;
2651 static struct syscore_ops pmu_syscore_ops
= {
2652 .suspend
= pmu_syscore_suspend
,
2653 .resume
= pmu_syscore_resume
,
2656 static int pmu_syscore_register(void)
2658 register_syscore_ops(&pmu_syscore_ops
);
2662 subsys_initcall(pmu_syscore_register
);
2663 #endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
2665 EXPORT_SYMBOL(pmu_request
);
2666 EXPORT_SYMBOL(pmu_queue_request
);
2667 EXPORT_SYMBOL(pmu_poll
);
2668 EXPORT_SYMBOL(pmu_poll_adb
);
2669 EXPORT_SYMBOL(pmu_wait_complete
);
2670 EXPORT_SYMBOL(pmu_suspend
);
2671 EXPORT_SYMBOL(pmu_resume
);
2672 EXPORT_SYMBOL(pmu_unlock
);
2673 #if defined(CONFIG_PPC32)
2674 EXPORT_SYMBOL(pmu_enable_irled
);
2675 EXPORT_SYMBOL(pmu_battery_count
);
2676 EXPORT_SYMBOL(pmu_batteries
);
2677 EXPORT_SYMBOL(pmu_power_flags
);
2678 #endif /* CONFIG_SUSPEND && CONFIG_PPC32 */