linux/drivers/macintosh/via-pmu.c
<<
>>
Prefs
   1/*
   2 * Device driver for the via-pmu on Apple Powermacs.
   3 *
   4 * The VIA (versatile interface adapter) interfaces to the PMU,
   5 * a 6805 microprocessor core whose primary function is to control
   6 * battery charging and system power on the PowerBook 3400 and 2400.
   7 * The PMU also controls the ADB (Apple Desktop Bus) which connects
   8 * to the keyboard and mouse, as well as the non-volatile RAM
   9 * and the RTC (real time clock) chip.
  10 *
  11 * Copyright (C) 1998 Paul Mackerras and Fabio Riccardi.
  12 * Copyright (C) 2001-2002 Benjamin Herrenschmidt
  13 * Copyright (C) 2006-2007 Johannes Berg
  14 *
  15 * THIS DRIVER IS BECOMING A TOTAL MESS !
  16 *  - Cleanup atomically disabling reply to PMU events after
  17 *    a sleep or a freq. switch
  18 *
  19 */
  20#include <stdarg.h>
  21#include <linux/smp_lock.h>
  22#include <linux/types.h>
  23#include <linux/errno.h>
  24#include <linux/kernel.h>
  25#include <linux/delay.h>
  26#include <linux/sched.h>
  27#include <linux/miscdevice.h>
  28#include <linux/blkdev.h>
  29#include <linux/pci.h>
  30#include <linux/slab.h>
  31#include <linux/poll.h>
  32#include <linux/adb.h>
  33#include <linux/pmu.h>
  34#include <linux/cuda.h>
  35#include <linux/module.h>
  36#include <linux/spinlock.h>
  37#include <linux/pm.h>
  38#include <linux/proc_fs.h>
  39#include <linux/init.h>
  40#include <linux/interrupt.h>
  41#include <linux/device.h>
  42#include <linux/sysdev.h>
  43#include <linux/freezer.h>
  44#include <linux/syscalls.h>
  45#include <linux/suspend.h>
  46#include <linux/cpu.h>
  47#include <asm/prom.h>
  48#include <asm/machdep.h>
  49#include <asm/io.h>
  50#include <asm/pgtable.h>
  51#include <asm/system.h>
  52#include <asm/sections.h>
  53#include <asm/irq.h>
  54#include <asm/pmac_feature.h>
  55#include <asm/pmac_pfunc.h>
  56#include <asm/pmac_low_i2c.h>
  57#include <asm/uaccess.h>
  58#include <asm/mmu_context.h>
  59#include <asm/cputable.h>
  60#include <asm/time.h>
  61#include <asm/backlight.h>
  62
  63#include "via-pmu-event.h"
  64
  65/* Some compile options */
  66#undef DEBUG_SLEEP
  67
  68/* Misc minor number allocated for /dev/pmu */
  69#define PMU_MINOR               154
  70
  71/* How many iterations between battery polls */
  72#define BATTERY_POLLING_COUNT   2
  73
  74static volatile unsigned char __iomem *via;
  75
  76/* VIA registers - spaced 0x200 bytes apart */
  77#define RS              0x200           /* skip between registers */
  78#define B               0               /* B-side data */
  79#define A               RS              /* A-side data */
  80#define DIRB            (2*RS)          /* B-side direction (1=output) */
  81#define DIRA            (3*RS)          /* A-side direction (1=output) */
  82#define T1CL            (4*RS)          /* Timer 1 ctr/latch (low 8 bits) */
  83#define T1CH            (5*RS)          /* Timer 1 counter (high 8 bits) */
  84#define T1LL            (6*RS)          /* Timer 1 latch (low 8 bits) */
  85#define T1LH            (7*RS)          /* Timer 1 latch (high 8 bits) */
  86#define T2CL            (8*RS)          /* Timer 2 ctr/latch (low 8 bits) */
  87#define T2CH            (9*RS)          /* Timer 2 counter (high 8 bits) */
  88#define SR              (10*RS)         /* Shift register */
  89#define ACR             (11*RS)         /* Auxiliary control register */
  90#define PCR             (12*RS)         /* Peripheral control register */
  91#define IFR             (13*RS)         /* Interrupt flag register */
  92#define IER             (14*RS)         /* Interrupt enable register */
  93#define ANH             (15*RS)         /* A-side data, no handshake */
  94
  95/* Bits in B data register: both active low */
  96#define TACK            0x08            /* Transfer acknowledge (input) */
  97#define TREQ            0x10            /* Transfer request (output) */
  98
  99/* Bits in ACR */
 100#define SR_CTRL         0x1c            /* Shift register control bits */
 101#define SR_EXT          0x0c            /* Shift on external clock */
 102#define SR_OUT          0x10            /* Shift out if 1 */
 103
 104/* Bits in IFR and IER */
 105#define IER_SET         0x80            /* set bits in IER */
 106#define IER_CLR         0               /* clear bits in IER */
 107#define SR_INT          0x04            /* Shift register full/empty */
 108#define CB2_INT         0x08
 109#define CB1_INT         0x10            /* transition on CB1 input */
 110
 111static volatile enum pmu_state {
 112        idle,
 113        sending,
 114        intack,
 115        reading,
 116        reading_intr,
 117        locked,
 118} pmu_state;
 119
 120static volatile enum int_data_state {
 121        int_data_empty,
 122        int_data_fill,
 123        int_data_ready,
 124        int_data_flush
 125} int_data_state[2] = { int_data_empty, int_data_empty };
 126
 127static struct adb_request *current_req;
 128static struct adb_request *last_req;
 129static struct adb_request *req_awaiting_reply;
 130static unsigned char interrupt_data[2][32];
 131static int interrupt_data_len[2];
 132static int int_data_last;
 133static unsigned char *reply_ptr;
 134static int data_index;
 135static int data_len;
 136static volatile int adb_int_pending;
 137static volatile int disable_poll;
 138static struct device_node *vias;
 139static int pmu_kind = PMU_UNKNOWN;
 140static int pmu_fully_inited;
 141static int pmu_has_adb;
 142static struct device_node *gpio_node;
 143static unsigned char __iomem *gpio_reg;
 144static int gpio_irq = NO_IRQ;
 145static int gpio_irq_enabled = -1;
 146static volatile int pmu_suspended;
 147static spinlock_t pmu_lock;
 148static u8 pmu_intr_mask;
 149static int pmu_version;
 150static int drop_interrupts;
 151#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
 152static int option_lid_wakeup = 1;
 153#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
 154static unsigned long async_req_locks;
 155static unsigned int pmu_irq_stats[11];
 156
 157static struct proc_dir_entry *proc_pmu_root;
 158static struct proc_dir_entry *proc_pmu_info;
 159static struct proc_dir_entry *proc_pmu_irqstats;
 160static struct proc_dir_entry *proc_pmu_options;
 161static int option_server_mode;
 162
 163int pmu_battery_count;
 164int pmu_cur_battery;
 165unsigned int pmu_power_flags = PMU_PWR_AC_PRESENT;
 166struct pmu_battery_info pmu_batteries[PMU_MAX_BATTERIES];
 167static int query_batt_timer = BATTERY_POLLING_COUNT;
 168static struct adb_request batt_req;
 169static struct proc_dir_entry *proc_pmu_batt[PMU_MAX_BATTERIES];
 170
 171int __fake_sleep;
 172int asleep;
 173
 174#ifdef CONFIG_ADB
 175static int adb_dev_map;
 176static int pmu_adb_flags;
 177
 178static int pmu_probe(void);
 179static int pmu_init(void);
 180static int pmu_send_request(struct adb_request *req, int sync);
 181static int pmu_adb_autopoll(int devs);
 182static int pmu_adb_reset_bus(void);
 183#endif /* CONFIG_ADB */
 184
 185static int init_pmu(void);
 186static void pmu_start(void);
 187static irqreturn_t via_pmu_interrupt(int irq, void *arg);
 188static irqreturn_t gpio1_interrupt(int irq, void *arg);
 189static int proc_get_info(char *page, char **start, off_t off,
 190                          int count, int *eof, void *data);
 191static int proc_get_irqstats(char *page, char **start, off_t off,
 192                          int count, int *eof, void *data);
 193static void pmu_pass_intr(unsigned char *data, int len);
 194static int proc_get_batt(char *page, char **start, off_t off,
 195                        int count, int *eof, void *data);
 196static int proc_read_options(char *page, char **start, off_t off,
 197                        int count, int *eof, void *data);
 198static int proc_write_options(struct file *file, const char __user *buffer,
 199                        unsigned long count, void *data);
 200
 201#ifdef CONFIG_ADB
 202struct adb_driver via_pmu_driver = {
 203        "PMU",
 204        pmu_probe,
 205        pmu_init,
 206        pmu_send_request,
 207        pmu_adb_autopoll,
 208        pmu_poll_adb,
 209        pmu_adb_reset_bus
 210};
 211#endif /* CONFIG_ADB */
 212
 213extern void low_sleep_handler(void);
 214extern void enable_kernel_altivec(void);
 215extern void enable_kernel_fp(void);
 216
 217#ifdef DEBUG_SLEEP
 218int pmu_polled_request(struct adb_request *req);
 219void pmu_blink(int n);
 220#endif
 221
 222/*
 223 * This table indicates for each PMU opcode:
 224 * - the number of data bytes to be sent with the command, or -1
 225 *   if a length byte should be sent,
 226 * - the number of response bytes which the PMU will return, or
 227 *   -1 if it will send a length byte.
 228 */
 229static const s8 pmu_data_len[256][2] = {
 230/*         0       1       2       3       4       5       6       7  */
 231/*00*/  {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
 232/*08*/  {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
 233/*10*/  { 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
 234/*18*/  { 0, 1},{ 0, 1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{ 0, 0},
 235/*20*/  {-1, 0},{ 0, 0},{ 2, 0},{ 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},
 236/*28*/  { 0,-1},{ 0,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{ 0,-1},
 237/*30*/  { 4, 0},{20, 0},{-1, 0},{ 3, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
 238/*38*/  { 0, 4},{ 0,20},{ 2,-1},{ 2, 1},{ 3,-1},{-1,-1},{-1,-1},{ 4, 0},
 239/*40*/  { 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
 240/*48*/  { 0, 1},{ 0, 1},{-1,-1},{ 1, 0},{ 1, 0},{-1,-1},{-1,-1},{-1,-1},
 241/*50*/  { 1, 0},{ 0, 0},{ 2, 0},{ 2, 0},{-1, 0},{ 1, 0},{ 3, 0},{ 1, 0},
 242/*58*/  { 0, 1},{ 1, 0},{ 0, 2},{ 0, 2},{ 0,-1},{-1,-1},{-1,-1},{-1,-1},
 243/*60*/  { 2, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
 244/*68*/  { 0, 3},{ 0, 3},{ 0, 2},{ 0, 8},{ 0,-1},{ 0,-1},{-1,-1},{-1,-1},
 245/*70*/  { 1, 0},{ 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
 246/*78*/  { 0,-1},{ 0,-1},{-1,-1},{-1,-1},{-1,-1},{ 5, 1},{ 4, 1},{ 4, 1},
 247/*80*/  { 4, 0},{-1, 0},{ 0, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
 248/*88*/  { 0, 5},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
 249/*90*/  { 1, 0},{ 2, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
 250/*98*/  { 0, 1},{ 0, 1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
 251/*a0*/  { 2, 0},{ 2, 0},{ 2, 0},{ 4, 0},{-1, 0},{ 0, 0},{-1, 0},{-1, 0},
 252/*a8*/  { 1, 1},{ 1, 0},{ 3, 0},{ 2, 0},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
 253/*b0*/  {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
 254/*b8*/  {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
 255/*c0*/  {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
 256/*c8*/  {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
 257/*d0*/  { 0, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
 258/*d8*/  { 1, 1},{ 1, 1},{-1,-1},{-1,-1},{ 0, 1},{ 0,-1},{-1,-1},{-1,-1},
 259/*e0*/  {-1, 0},{ 4, 0},{ 0, 1},{-1, 0},{-1, 0},{ 4, 0},{-1, 0},{-1, 0},
 260/*e8*/  { 3,-1},{-1,-1},{ 0, 1},{-1,-1},{ 0,-1},{-1,-1},{-1,-1},{ 0, 0},
 261/*f0*/  {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
 262/*f8*/  {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
 263};
 264
 265static char *pbook_type[] = {
 266        "Unknown PowerBook",
 267        "PowerBook 2400/3400/3500(G3)",
 268        "PowerBook G3 Series",
 269        "1999 PowerBook G3",
 270        "Core99"
 271};
 272
 273int __init find_via_pmu(void)
 274{
 275        u64 taddr;
 276        const u32 *reg;
 277
 278        if (via != 0)
 279                return 1;
 280        vias = of_find_node_by_name(NULL, "via-pmu");
 281        if (vias == NULL)
 282                return 0;
 283
 284        reg = of_get_property(vias, "reg", NULL);
 285        if (reg == NULL) {
 286                printk(KERN_ERR "via-pmu: No \"reg\" property !\n");
 287                goto fail;
 288        }
 289        taddr = of_translate_address(vias, reg);
 290        if (taddr == OF_BAD_ADDR) {
 291                printk(KERN_ERR "via-pmu: Can't translate address !\n");
 292                goto fail;
 293        }
 294
 295        spin_lock_init(&pmu_lock);
 296
 297        pmu_has_adb = 1;
 298
 299        pmu_intr_mask = PMU_INT_PCEJECT |
 300                        PMU_INT_SNDBRT |
 301                        PMU_INT_ADB |
 302                        PMU_INT_TICK;
 303        
 304        if (vias->parent->name && ((strcmp(vias->parent->name, "ohare") == 0)
 305            || of_device_is_compatible(vias->parent, "ohare")))
 306                pmu_kind = PMU_OHARE_BASED;
 307        else if (of_device_is_compatible(vias->parent, "paddington"))
 308                pmu_kind = PMU_PADDINGTON_BASED;
 309        else if (of_device_is_compatible(vias->parent, "heathrow"))
 310                pmu_kind = PMU_HEATHROW_BASED;
 311        else if (of_device_is_compatible(vias->parent, "Keylargo")
 312                 || of_device_is_compatible(vias->parent, "K2-Keylargo")) {
 313                struct device_node *gpiop;
 314                struct device_node *adbp;
 315                u64 gaddr = OF_BAD_ADDR;
 316
 317                pmu_kind = PMU_KEYLARGO_BASED;
 318                adbp = of_find_node_by_type(NULL, "adb");
 319                pmu_has_adb = (adbp != NULL);
 320                of_node_put(adbp);
 321                pmu_intr_mask = PMU_INT_PCEJECT |
 322                                PMU_INT_SNDBRT |
 323                                PMU_INT_ADB |
 324                                PMU_INT_TICK |
 325                                PMU_INT_ENVIRONMENT;
 326                
 327                gpiop = of_find_node_by_name(NULL, "gpio");
 328                if (gpiop) {
 329                        reg = of_get_property(gpiop, "reg", NULL);
 330                        if (reg)
 331                                gaddr = of_translate_address(gpiop, reg);
 332                        if (gaddr != OF_BAD_ADDR)
 333                                gpio_reg = ioremap(gaddr, 0x10);
 334                }
 335                if (gpio_reg == NULL) {
 336                        printk(KERN_ERR "via-pmu: Can't find GPIO reg !\n");
 337                        goto fail_gpio;
 338                }
 339        } else
 340                pmu_kind = PMU_UNKNOWN;
 341
 342        via = ioremap(taddr, 0x2000);
 343        if (via == NULL) {
 344                printk(KERN_ERR "via-pmu: Can't map address !\n");
 345                goto fail;
 346        }
 347        
 348        out_8(&via[IER], IER_CLR | 0x7f);       /* disable all intrs */
 349        out_8(&via[IFR], 0x7f);                 /* clear IFR */
 350
 351        pmu_state = idle;
 352
 353        if (!init_pmu()) {
 354                via = NULL;
 355                return 0;
 356        }
 357
 358        printk(KERN_INFO "PMU driver v%d initialized for %s, firmware: %02x\n",
 359               PMU_DRIVER_VERSION, pbook_type[pmu_kind], pmu_version);
 360               
 361        sys_ctrler = SYS_CTRLER_PMU;
 362        
 363        return 1;
 364 fail:
 365        of_node_put(vias);
 366        iounmap(gpio_reg);
 367        gpio_reg = NULL;
 368 fail_gpio:
 369        vias = NULL;
 370        return 0;
 371}
 372
 373#ifdef CONFIG_ADB
 374static int pmu_probe(void)
 375{
 376        return vias == NULL? -ENODEV: 0;
 377}
 378
 379static int __init pmu_init(void)
 380{
 381        if (vias == NULL)
 382                return -ENODEV;
 383        return 0;
 384}
 385#endif /* CONFIG_ADB */
 386
 387/*
 388 * We can't wait until pmu_init gets called, that happens too late.
 389 * It happens after IDE and SCSI initialization, which can take a few
 390 * seconds, and by that time the PMU could have given up on us and
 391 * turned us off.
 392 * Thus this is called with arch_initcall rather than device_initcall.
 393 */
 394static int __init via_pmu_start(void)
 395{
 396        unsigned int irq;
 397
 398        if (vias == NULL)
 399                return -ENODEV;
 400
 401        batt_req.complete = 1;
 402
 403        irq = irq_of_parse_and_map(vias, 0);
 404        if (irq == NO_IRQ) {
 405                printk(KERN_ERR "via-pmu: can't map interrupt\n");
 406                return -ENODEV;
 407        }
 408        /* We set IRQF_TIMER because we don't want the interrupt to be disabled
 409         * between the 2 passes of driver suspend, we control our own disabling
 410         * for that one
 411         */
 412        if (request_irq(irq, via_pmu_interrupt, IRQF_TIMER, "VIA-PMU", (void *)0)) {
 413                printk(KERN_ERR "via-pmu: can't request irq %d\n", irq);
 414                return -ENODEV;
 415        }
 416
 417        if (pmu_kind == PMU_KEYLARGO_BASED) {
 418                gpio_node = of_find_node_by_name(NULL, "extint-gpio1");
 419                if (gpio_node == NULL)
 420                        gpio_node = of_find_node_by_name(NULL,
 421                                                         "pmu-interrupt");
 422                if (gpio_node)
 423                        gpio_irq = irq_of_parse_and_map(gpio_node, 0);
 424
 425                if (gpio_irq != NO_IRQ) {
 426                        if (request_irq(gpio_irq, gpio1_interrupt, IRQF_TIMER,
 427                                        "GPIO1 ADB", (void *)0))
 428                                printk(KERN_ERR "pmu: can't get irq %d"
 429                                       " (GPIO1)\n", gpio_irq);
 430                        else
 431                                gpio_irq_enabled = 1;
 432                }
 433        }
 434
 435        /* Enable interrupts */
 436        out_8(&via[IER], IER_SET | SR_INT | CB1_INT);
 437
 438        pmu_fully_inited = 1;
 439
 440        /* Make sure PMU settle down before continuing. This is _very_ important
 441         * since the IDE probe may shut interrupts down for quite a bit of time. If
 442         * a PMU communication is pending while this happens, the PMU may timeout
 443         * Not that on Core99 machines, the PMU keeps sending us environement
 444         * messages, we should find a way to either fix IDE or make it call
 445         * pmu_suspend() before masking interrupts. This can also happens while
 446         * scolling with some fbdevs.
 447         */
 448        do {
 449                pmu_poll();
 450        } while (pmu_state != idle);
 451
 452        return 0;
 453}
 454
 455arch_initcall(via_pmu_start);
 456
 457/*
 458 * This has to be done after pci_init, which is a subsys_initcall.
 459 */
 460static int __init via_pmu_dev_init(void)
 461{
 462        if (vias == NULL)
 463                return -ENODEV;
 464
 465#ifdef CONFIG_PMAC_BACKLIGHT
 466        /* Initialize backlight */
 467        pmu_backlight_init();
 468#endif
 469
 470#ifdef CONFIG_PPC32
 471        if (machine_is_compatible("AAPL,3400/2400") ||
 472                machine_is_compatible("AAPL,3500")) {
 473                int mb = pmac_call_feature(PMAC_FTR_GET_MB_INFO,
 474                        NULL, PMAC_MB_INFO_MODEL, 0);
 475                pmu_battery_count = 1;
 476                if (mb == PMAC_TYPE_COMET)
 477                        pmu_batteries[0].flags |= PMU_BATT_TYPE_COMET;
 478                else
 479                        pmu_batteries[0].flags |= PMU_BATT_TYPE_HOOPER;
 480        } else if (machine_is_compatible("AAPL,PowerBook1998") ||
 481                machine_is_compatible("PowerBook1,1")) {
 482                pmu_battery_count = 2;
 483                pmu_batteries[0].flags |= PMU_BATT_TYPE_SMART;
 484                pmu_batteries[1].flags |= PMU_BATT_TYPE_SMART;
 485        } else {
 486                struct device_node* prim =
 487                        of_find_node_by_name(NULL, "power-mgt");
 488                const u32 *prim_info = NULL;
 489                if (prim)
 490                        prim_info = of_get_property(prim, "prim-info", NULL);
 491                if (prim_info) {
 492                        /* Other stuffs here yet unknown */
 493                        pmu_battery_count = (prim_info[6] >> 16) & 0xff;
 494                        pmu_batteries[0].flags |= PMU_BATT_TYPE_SMART;
 495                        if (pmu_battery_count > 1)
 496                                pmu_batteries[1].flags |= PMU_BATT_TYPE_SMART;
 497                }
 498                of_node_put(prim);
 499        }
 500#endif /* CONFIG_PPC32 */
 501
 502        /* Create /proc/pmu */
 503        proc_pmu_root = proc_mkdir("pmu", NULL);
 504        if (proc_pmu_root) {
 505                long i;
 506
 507                for (i=0; i<pmu_battery_count; i++) {
 508                        char title[16];
 509                        sprintf(title, "battery_%ld", i);
 510                        proc_pmu_batt[i] = create_proc_read_entry(title, 0, proc_pmu_root,
 511                                                proc_get_batt, (void *)i);
 512                }
 513
 514                proc_pmu_info = create_proc_read_entry("info", 0, proc_pmu_root,
 515                                        proc_get_info, NULL);
 516                proc_pmu_irqstats = create_proc_read_entry("interrupts", 0, proc_pmu_root,
 517                                        proc_get_irqstats, NULL);
 518                proc_pmu_options = create_proc_entry("options", 0600, proc_pmu_root);
 519                if (proc_pmu_options) {
 520                        proc_pmu_options->read_proc = proc_read_options;
 521                        proc_pmu_options->write_proc = proc_write_options;
 522                }
 523        }
 524        return 0;
 525}
 526
 527device_initcall(via_pmu_dev_init);
 528
 529static int
 530init_pmu(void)
 531{
 532        int timeout;
 533        struct adb_request req;
 534
 535        out_8(&via[B], via[B] | TREQ);                  /* negate TREQ */
 536        out_8(&via[DIRB], (via[DIRB] | TREQ) & ~TACK);  /* TACK in, TREQ out */
 537
 538        pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, pmu_intr_mask);
 539        timeout =  100000;
 540        while (!req.complete) {
 541                if (--timeout < 0) {
 542                        printk(KERN_ERR "init_pmu: no response from PMU\n");
 543                        return 0;
 544                }
 545                udelay(10);
 546                pmu_poll();
 547        }
 548
 549        /* ack all pending interrupts */
 550        timeout = 100000;
 551        interrupt_data[0][0] = 1;
 552        while (interrupt_data[0][0] || pmu_state != idle) {
 553                if (--timeout < 0) {
 554                        printk(KERN_ERR "init_pmu: timed out acking intrs\n");
 555                        return 0;
 556                }
 557                if (pmu_state == idle)
 558                        adb_int_pending = 1;
 559                via_pmu_interrupt(0, NULL);
 560                udelay(10);
 561        }
 562
 563        /* Tell PMU we are ready.  */
 564        if (pmu_kind == PMU_KEYLARGO_BASED) {
 565                pmu_request(&req, NULL, 2, PMU_SYSTEM_READY, 2);
 566                while (!req.complete)
 567                        pmu_poll();
 568        }
 569
 570        /* Read PMU version */
 571        pmu_request(&req, NULL, 1, PMU_GET_VERSION);
 572        pmu_wait_complete(&req);
 573        if (req.reply_len > 0)
 574                pmu_version = req.reply[0];
 575        
 576        /* Read server mode setting */
 577        if (pmu_kind == PMU_KEYLARGO_BASED) {
 578                pmu_request(&req, NULL, 2, PMU_POWER_EVENTS,
 579                            PMU_PWR_GET_POWERUP_EVENTS);
 580                pmu_wait_complete(&req);
 581                if (req.reply_len == 2) {
 582                        if (req.reply[1] & PMU_PWR_WAKEUP_AC_INSERT)
 583                                option_server_mode = 1;
 584                        printk(KERN_INFO "via-pmu: Server Mode is %s\n",
 585                               option_server_mode ? "enabled" : "disabled");
 586                }
 587        }
 588        return 1;
 589}
 590
 591int
 592pmu_get_model(void)
 593{
 594        return pmu_kind;
 595}
 596
 597static void pmu_set_server_mode(int server_mode)
 598{
 599        struct adb_request req;
 600
 601        if (pmu_kind != PMU_KEYLARGO_BASED)
 602                return;
 603
 604        option_server_mode = server_mode;
 605        pmu_request(&req, NULL, 2, PMU_POWER_EVENTS, PMU_PWR_GET_POWERUP_EVENTS);
 606        pmu_wait_complete(&req);
 607        if (req.reply_len < 2)
 608                return;
 609        if (server_mode)
 610                pmu_request(&req, NULL, 4, PMU_POWER_EVENTS,
 611                            PMU_PWR_SET_POWERUP_EVENTS,
 612                            req.reply[0], PMU_PWR_WAKEUP_AC_INSERT); 
 613        else
 614                pmu_request(&req, NULL, 4, PMU_POWER_EVENTS,
 615                            PMU_PWR_CLR_POWERUP_EVENTS,
 616                            req.reply[0], PMU_PWR_WAKEUP_AC_INSERT); 
 617        pmu_wait_complete(&req);
 618}
 619
 620/* This new version of the code for 2400/3400/3500 powerbooks
 621 * is inspired from the implementation in gkrellm-pmu
 622 */
 623static void
 624done_battery_state_ohare(struct adb_request* req)
 625{
 626        /* format:
 627         *  [0]    :  flags
 628         *    0x01 :  AC indicator
 629         *    0x02 :  charging
 630         *    0x04 :  battery exist
 631         *    0x08 :  
 632         *    0x10 :  
 633         *    0x20 :  full charged
 634         *    0x40 :  pcharge reset
 635         *    0x80 :  battery exist
 636         *
 637         *  [1][2] :  battery voltage
 638         *  [3]    :  CPU temperature
 639         *  [4]    :  battery temperature
 640         *  [5]    :  current
 641         *  [6][7] :  pcharge
 642         *              --tkoba
 643         */
 644        unsigned int bat_flags = PMU_BATT_TYPE_HOOPER;
 645        long pcharge, charge, vb, vmax, lmax;
 646        long vmax_charging, vmax_charged;
 647        long amperage, voltage, time, max;
 648        int mb = pmac_call_feature(PMAC_FTR_GET_MB_INFO,
 649                        NULL, PMAC_MB_INFO_MODEL, 0);
 650
 651        if (req->reply[0] & 0x01)
 652                pmu_power_flags |= PMU_PWR_AC_PRESENT;
 653        else
 654                pmu_power_flags &= ~PMU_PWR_AC_PRESENT;
 655        
 656        if (mb == PMAC_TYPE_COMET) {
 657                vmax_charged = 189;
 658                vmax_charging = 213;
 659                lmax = 6500;
 660        } else {
 661                vmax_charged = 330;
 662                vmax_charging = 330;
 663                lmax = 6500;
 664        }
 665        vmax = vmax_charged;
 666
 667        /* If battery installed */
 668        if (req->reply[0] & 0x04) {
 669                bat_flags |= PMU_BATT_PRESENT;
 670                if (req->reply[0] & 0x02)
 671                        bat_flags |= PMU_BATT_CHARGING;
 672                vb = (req->reply[1] << 8) | req->reply[2];
 673                voltage = (vb * 265 + 72665) / 10;
 674                amperage = req->reply[5];
 675                if ((req->reply[0] & 0x01) == 0) {
 676                        if (amperage > 200)
 677                                vb += ((amperage - 200) * 15)/100;
 678                } else if (req->reply[0] & 0x02) {
 679                        vb = (vb * 97) / 100;
 680                        vmax = vmax_charging;
 681                }
 682                charge = (100 * vb) / vmax;
 683                if (req->reply[0] & 0x40) {
 684                        pcharge = (req->reply[6] << 8) + req->reply[7];
 685                        if (pcharge > lmax)
 686                                pcharge = lmax;
 687                        pcharge *= 100;
 688                        pcharge = 100 - pcharge / lmax;
 689                        if (pcharge < charge)
 690                                charge = pcharge;
 691                }
 692                if (amperage > 0)
 693                        time = (charge * 16440) / amperage;
 694                else
 695                        time = 0;
 696                max = 100;
 697                amperage = -amperage;
 698        } else
 699                charge = max = amperage = voltage = time = 0;
 700
 701        pmu_batteries[pmu_cur_battery].flags = bat_flags;
 702        pmu_batteries[pmu_cur_battery].charge = charge;
 703        pmu_batteries[pmu_cur_battery].max_charge = max;
 704        pmu_batteries[pmu_cur_battery].amperage = amperage;
 705        pmu_batteries[pmu_cur_battery].voltage = voltage;
 706        pmu_batteries[pmu_cur_battery].time_remaining = time;
 707
 708        clear_bit(0, &async_req_locks);
 709}
 710
 711static void
 712done_battery_state_smart(struct adb_request* req)
 713{
 714        /* format:
 715         *  [0] : format of this structure (known: 3,4,5)
 716         *  [1] : flags
 717         *  
 718         *  format 3 & 4:
 719         *  
 720         *  [2] : charge
 721         *  [3] : max charge
 722         *  [4] : current
 723         *  [5] : voltage
 724         *  
 725         *  format 5:
 726         *  
 727         *  [2][3] : charge
 728         *  [4][5] : max charge
 729         *  [6][7] : current
 730         *  [8][9] : voltage
 731         */
 732         
 733        unsigned int bat_flags = PMU_BATT_TYPE_SMART;
 734        int amperage;
 735        unsigned int capa, max, voltage;
 736        
 737        if (req->reply[1] & 0x01)
 738                pmu_power_flags |= PMU_PWR_AC_PRESENT;
 739        else
 740                pmu_power_flags &= ~PMU_PWR_AC_PRESENT;
 741
 742
 743        capa = max = amperage = voltage = 0;
 744        
 745        if (req->reply[1] & 0x04) {
 746                bat_flags |= PMU_BATT_PRESENT;
 747                switch(req->reply[0]) {
 748                        case 3:
 749                        case 4: capa = req->reply[2];
 750                                max = req->reply[3];
 751                                amperage = *((signed char *)&req->reply[4]);
 752                                voltage = req->reply[5];
 753                                break;
 754                        case 5: capa = (req->reply[2] << 8) | req->reply[3];
 755                                max = (req->reply[4] << 8) | req->reply[5];
 756                                amperage = *((signed short *)&req->reply[6]);
 757                                voltage = (req->reply[8] << 8) | req->reply[9];
 758                                break;
 759                        default:
 760                                printk(KERN_WARNING "pmu.c : unrecognized battery info, len: %d, %02x %02x %02x %02x\n",
 761                                        req->reply_len, req->reply[0], req->reply[1], req->reply[2], req->reply[3]);
 762                                break;
 763                }
 764        }
 765
 766        if ((req->reply[1] & 0x01) && (amperage > 0))
 767                bat_flags |= PMU_BATT_CHARGING;
 768
 769        pmu_batteries[pmu_cur_battery].flags = bat_flags;
 770        pmu_batteries[pmu_cur_battery].charge = capa;
 771        pmu_batteries[pmu_cur_battery].max_charge = max;
 772        pmu_batteries[pmu_cur_battery].amperage = amperage;
 773        pmu_batteries[pmu_cur_battery].voltage = voltage;
 774        if (amperage) {
 775                if ((req->reply[1] & 0x01) && (amperage > 0))
 776                        pmu_batteries[pmu_cur_battery].time_remaining
 777                                = ((max-capa) * 3600) / amperage;
 778                else
 779                        pmu_batteries[pmu_cur_battery].time_remaining
 780                                = (capa * 3600) / (-amperage);
 781        } else
 782                pmu_batteries[pmu_cur_battery].time_remaining = 0;
 783
 784        pmu_cur_battery = (pmu_cur_battery + 1) % pmu_battery_count;
 785
 786        clear_bit(0, &async_req_locks);
 787}
 788
 789static void
 790query_battery_state(void)
 791{
 792        if (test_and_set_bit(0, &async_req_locks))
 793                return;
 794        if (pmu_kind == PMU_OHARE_BASED)
 795                pmu_request(&batt_req, done_battery_state_ohare,
 796                        1, PMU_BATTERY_STATE);
 797        else
 798                pmu_request(&batt_req, done_battery_state_smart,
 799                        2, PMU_SMART_BATTERY_STATE, pmu_cur_battery+1);
 800}
 801
 802static int
 803proc_get_info(char *page, char **start, off_t off,
 804                int count, int *eof, void *data)
 805{
 806        char* p = page;
 807
 808        p += sprintf(p, "PMU driver version     : %d\n", PMU_DRIVER_VERSION);
 809        p += sprintf(p, "PMU firmware version   : %02x\n", pmu_version);
 810        p += sprintf(p, "AC Power               : %d\n",
 811                ((pmu_power_flags & PMU_PWR_AC_PRESENT) != 0) || pmu_battery_count == 0);
 812        p += sprintf(p, "Battery count          : %d\n", pmu_battery_count);
 813
 814        return p - page;
 815}
 816
 817static int
 818proc_get_irqstats(char *page, char **start, off_t off,
 819                  int count, int *eof, void *data)
 820{
 821        int i;
 822        char* p = page;
 823        static const char *irq_names[] = {
 824                "Total CB1 triggered events",
 825                "Total GPIO1 triggered events",
 826                "PC-Card eject button",
 827                "Sound/Brightness button",
 828                "ADB message",
 829                "Battery state change",
 830                "Environment interrupt",
 831                "Tick timer",
 832                "Ghost interrupt (zero len)",
 833                "Empty interrupt (empty mask)",
 834                "Max irqs in a row"
 835        };
 836
 837        for (i=0; i<11; i++) {
 838                p += sprintf(p, " %2u: %10u (%s)\n",
 839                             i, pmu_irq_stats[i], irq_names[i]);
 840        }
 841        return p - page;
 842}
 843
 844static int
 845proc_get_batt(char *page, char **start, off_t off,
 846                int count, int *eof, void *data)
 847{
 848        long batnum = (long)data;
 849        char *p = page;
 850        
 851        p += sprintf(p, "\n");
 852        p += sprintf(p, "flags      : %08x\n",
 853                pmu_batteries[batnum].flags);
 854        p += sprintf(p, "charge     : %d\n",
 855                pmu_batteries[batnum].charge);
 856        p += sprintf(p, "max_charge : %d\n",
 857                pmu_batteries[batnum].max_charge);
 858        p += sprintf(p, "current    : %d\n",
 859                pmu_batteries[batnum].amperage);
 860        p += sprintf(p, "voltage    : %d\n",
 861                pmu_batteries[batnum].voltage);
 862        p += sprintf(p, "time rem.  : %d\n",
 863                pmu_batteries[batnum].time_remaining);
 864
 865        return p - page;
 866}
 867
 868static int
 869proc_read_options(char *page, char **start, off_t off,
 870                        int count, int *eof, void *data)
 871{
 872        char *p = page;
 873
 874#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
 875        if (pmu_kind == PMU_KEYLARGO_BASED &&
 876            pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0)
 877                p += sprintf(p, "lid_wakeup=%d\n", option_lid_wakeup);
 878#endif
 879        if (pmu_kind == PMU_KEYLARGO_BASED)
 880                p += sprintf(p, "server_mode=%d\n", option_server_mode);
 881
 882        return p - page;
 883}
 884                        
 885static int
 886proc_write_options(struct file *file, const char __user *buffer,
 887                        unsigned long count, void *data)
 888{
 889        char tmp[33];
 890        char *label, *val;
 891        unsigned long fcount = count;
 892        
 893        if (!count)
 894                return -EINVAL;
 895        if (count > 32)
 896                count = 32;
 897        if (copy_from_user(tmp, buffer, count))
 898                return -EFAULT;
 899        tmp[count] = 0;
 900
 901        label = tmp;
 902        while(*label == ' ')
 903                label++;
 904        val = label;
 905        while(*val && (*val != '=')) {
 906                if (*val == ' ')
 907                        *val = 0;
 908                val++;
 909        }
 910        if ((*val) == 0)
 911                return -EINVAL;
 912        *(val++) = 0;
 913        while(*val == ' ')
 914                val++;
 915#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
 916        if (pmu_kind == PMU_KEYLARGO_BASED &&
 917            pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0)
 918                if (!strcmp(label, "lid_wakeup"))
 919                        option_lid_wakeup = ((*val) == '1');
 920#endif
 921        if (pmu_kind == PMU_KEYLARGO_BASED && !strcmp(label, "server_mode")) {
 922                int new_value;
 923                new_value = ((*val) == '1');
 924                if (new_value != option_server_mode)
 925                        pmu_set_server_mode(new_value);
 926        }
 927        return fcount;
 928}
 929
 930#ifdef CONFIG_ADB
 931/* Send an ADB command */
 932static int pmu_send_request(struct adb_request *req, int sync)
 933{
 934        int i, ret;
 935
 936        if ((vias == NULL) || (!pmu_fully_inited)) {
 937                req->complete = 1;
 938                return -ENXIO;
 939        }
 940
 941        ret = -EINVAL;
 942
 943        switch (req->data[0]) {
 944        case PMU_PACKET:
 945                for (i = 0; i < req->nbytes - 1; ++i)
 946                        req->data[i] = req->data[i+1];
 947                --req->nbytes;
 948                if (pmu_data_len[req->data[0]][1] != 0) {
 949                        req->reply[0] = ADB_RET_OK;
 950                        req->reply_len = 1;
 951                } else
 952                        req->reply_len = 0;
 953                ret = pmu_queue_request(req);
 954                break;
 955        case CUDA_PACKET:
 956                switch (req->data[1]) {
 957                case CUDA_GET_TIME:
 958                        if (req->nbytes != 2)
 959                                break;
 960                        req->data[0] = PMU_READ_RTC;
 961                        req->nbytes = 1;
 962                        req->reply_len = 3;
 963                        req->reply[0] = CUDA_PACKET;
 964                        req->reply[1] = 0;
 965                        req->reply[2] = CUDA_GET_TIME;
 966                        ret = pmu_queue_request(req);
 967                        break;
 968                case CUDA_SET_TIME:
 969                        if (req->nbytes != 6)
 970                                break;
 971                        req->data[0] = PMU_SET_RTC;
 972                        req->nbytes = 5;
 973                        for (i = 1; i <= 4; ++i)
 974                                req->data[i] = req->data[i+1];
 975                        req->reply_len = 3;
 976                        req->reply[0] = CUDA_PACKET;
 977                        req->reply[1] = 0;
 978                        req->reply[2] = CUDA_SET_TIME;
 979                        ret = pmu_queue_request(req);
 980                        break;
 981                }
 982                break;
 983        case ADB_PACKET:
 984                if (!pmu_has_adb)
 985                        return -ENXIO;
 986                for (i = req->nbytes - 1; i > 1; --i)
 987                        req->data[i+2] = req->data[i];
 988                req->data[3] = req->nbytes - 2;
 989                req->data[2] = pmu_adb_flags;
 990                /*req->data[1] = req->data[1];*/
 991                req->data[0] = PMU_ADB_CMD;
 992                req->nbytes += 2;
 993                req->reply_expected = 1;
 994                req->reply_len = 0;
 995                ret = pmu_queue_request(req);
 996                break;
 997        }
 998        if (ret) {
 999                req->complete = 1;
1000                return ret;
1001        }
1002
1003        if (sync)
1004                while (!req->complete)
1005                        pmu_poll();
1006
1007        return 0;
1008}
1009
1010/* Enable/disable autopolling */
1011static int __pmu_adb_autopoll(int devs)
1012{
1013        struct adb_request req;
1014
1015        if (devs) {
1016                pmu_request(&req, NULL, 5, PMU_ADB_CMD, 0, 0x86,
1017                            adb_dev_map >> 8, adb_dev_map);
1018                pmu_adb_flags = 2;
1019        } else {
1020                pmu_request(&req, NULL, 1, PMU_ADB_POLL_OFF);
1021                pmu_adb_flags = 0;
1022        }
1023        while (!req.complete)
1024                pmu_poll();
1025        return 0;
1026}
1027
1028static int pmu_adb_autopoll(int devs)
1029{
1030        if ((vias == NULL) || (!pmu_fully_inited) || !pmu_has_adb)
1031                return -ENXIO;
1032
1033        adb_dev_map = devs;
1034        return __pmu_adb_autopoll(devs);
1035}
1036
1037/* Reset the ADB bus */
1038static int pmu_adb_reset_bus(void)
1039{
1040        struct adb_request req;
1041        int save_autopoll = adb_dev_map;
1042
1043        if ((vias == NULL) || (!pmu_fully_inited) || !pmu_has_adb)
1044                return -ENXIO;
1045
1046        /* anyone got a better idea?? */
1047        __pmu_adb_autopoll(0);
1048
1049        req.nbytes = 4;
1050        req.done = NULL;
1051        req.data[0] = PMU_ADB_CMD;
1052        req.data[1] = ADB_BUSRESET;
1053        req.data[2] = 0;
1054        req.data[3] = 0;
1055        req.data[4] = 0;
1056        req.reply_len = 0;
1057        req.reply_expected = 1;
1058        if (pmu_queue_request(&req) != 0) {
1059                printk(KERN_ERR "pmu_adb_reset_bus: pmu_queue_request failed\n");
1060                return -EIO;
1061        }
1062        pmu_wait_complete(&req);
1063
1064        if (save_autopoll != 0)
1065                __pmu_adb_autopoll(save_autopoll);
1066
1067        return 0;
1068}
1069#endif /* CONFIG_ADB */
1070
1071/* Construct and send a pmu request */
1072int
1073pmu_request(struct adb_request *req, void (*done)(struct adb_request *),
1074            int nbytes, ...)
1075{
1076        va_list list;
1077        int i;
1078
1079        if (vias == NULL)
1080                return -ENXIO;
1081
1082        if (nbytes < 0 || nbytes > 32) {
1083                printk(KERN_ERR "pmu_request: bad nbytes (%d)\n", nbytes);
1084                req->complete = 1;
1085                return -EINVAL;
1086        }
1087        req->nbytes = nbytes;
1088        req->done = done;
1089        va_start(list, nbytes);
1090        for (i = 0; i < nbytes; ++i)
1091                req->data[i] = va_arg(list, int);
1092        va_end(list);
1093        req->reply_len = 0;
1094        req->reply_expected = 0;
1095        return pmu_queue_request(req);
1096}
1097
1098int
1099pmu_queue_request(struct adb_request *req)
1100{
1101        unsigned long flags;
1102        int nsend;
1103
1104        if (via == NULL) {
1105                req->complete = 1;
1106                return -ENXIO;
1107        }
1108        if (req->nbytes <= 0) {
1109                req->complete = 1;
1110                return 0;
1111        }
1112        nsend = pmu_data_len[req->data[0]][0];
1113        if (nsend >= 0 && req->nbytes != nsend + 1) {
1114                req->complete = 1;
1115                return -EINVAL;
1116        }
1117
1118        req->next = NULL;
1119        req->sent = 0;
1120        req->complete = 0;
1121
1122        spin_lock_irqsave(&pmu_lock, flags);
1123        if (current_req != 0) {
1124                last_req->next = req;
1125                last_req = req;
1126        } else {
1127                current_req = req;
1128                last_req = req;
1129                if (pmu_state == idle)
1130                        pmu_start();
1131        }
1132        spin_unlock_irqrestore(&pmu_lock, flags);
1133
1134        return 0;
1135}
1136
1137static inline void
1138wait_for_ack(void)
1139{
1140        /* Sightly increased the delay, I had one occurrence of the message
1141         * reported
1142         */
1143        int timeout = 4000;
1144        while ((in_8(&via[B]) & TACK) == 0) {
1145                if (--timeout < 0) {
1146                        printk(KERN_ERR "PMU not responding (!ack)\n");
1147                        return;
1148                }
1149                udelay(10);
1150        }
1151}
1152
1153/* New PMU seems to be very sensitive to those timings, so we make sure
1154 * PCI is flushed immediately */
1155static inline void
1156send_byte(int x)
1157{
1158        volatile unsigned char __iomem *v = via;
1159
1160        out_8(&v[ACR], in_8(&v[ACR]) | SR_OUT | SR_EXT);
1161        out_8(&v[SR], x);
1162        out_8(&v[B], in_8(&v[B]) & ~TREQ);              /* assert TREQ */
1163        (void)in_8(&v[B]);
1164}
1165
1166static inline void
1167recv_byte(void)
1168{
1169        volatile unsigned char __iomem *v = via;
1170
1171        out_8(&v[ACR], (in_8(&v[ACR]) & ~SR_OUT) | SR_EXT);
1172        in_8(&v[SR]);           /* resets SR */
1173        out_8(&v[B], in_8(&v[B]) & ~TREQ);
1174        (void)in_8(&v[B]);
1175}
1176
1177static inline void
1178pmu_done(struct adb_request *req)
1179{
1180        void (*done)(struct adb_request *) = req->done;
1181        mb();
1182        req->complete = 1;
1183        /* Here, we assume that if the request has a done member, the
1184         * struct request will survive to setting req->complete to 1
1185         */
1186        if (done)
1187                (*done)(req);
1188}
1189
1190static void
1191pmu_start(void)
1192{
1193        struct adb_request *req;
1194
1195        /* assert pmu_state == idle */
1196        /* get the packet to send */
1197        req = current_req;
1198        if (req == 0 || pmu_state != idle
1199            || (/*req->reply_expected && */req_awaiting_reply))
1200                return;
1201
1202        pmu_state = sending;
1203        data_index = 1;
1204        data_len = pmu_data_len[req->data[0]][0];
1205
1206        /* Sounds safer to make sure ACK is high before writing. This helped
1207         * kill a problem with ADB and some iBooks
1208         */
1209        wait_for_ack();
1210        /* set the shift register to shift out and send a byte */
1211        send_byte(req->data[0]);
1212}
1213
1214void
1215pmu_poll(void)
1216{
1217        if (!via)
1218                return;
1219        if (disable_poll)
1220                return;
1221        via_pmu_interrupt(0, NULL);
1222}
1223
1224void
1225pmu_poll_adb(void)
1226{
1227        if (!via)
1228                return;
1229        if (disable_poll)
1230                return;
1231        /* Kicks ADB read when PMU is suspended */
1232        adb_int_pending = 1;
1233        do {
1234                via_pmu_interrupt(0, NULL);
1235        } while (pmu_suspended && (adb_int_pending || pmu_state != idle
1236                || req_awaiting_reply));
1237}
1238
1239void
1240pmu_wait_complete(struct adb_request *req)
1241{
1242        if (!via)
1243                return;
1244        while((pmu_state != idle && pmu_state != locked) || !req->complete)
1245                via_pmu_interrupt(0, NULL);
1246}
1247
1248/* This function loops until the PMU is idle and prevents it from
1249 * anwsering to ADB interrupts. pmu_request can still be called.
1250 * This is done to avoid spurrious shutdowns when we know we'll have
1251 * interrupts switched off for a long time
1252 */
1253void
1254pmu_suspend(void)
1255{
1256        unsigned long flags;
1257
1258        if (!via)
1259                return;
1260        
1261        spin_lock_irqsave(&pmu_lock, flags);
1262        pmu_suspended++;
1263        if (pmu_suspended > 1) {
1264                spin_unlock_irqrestore(&pmu_lock, flags);
1265                return;
1266        }
1267
1268        do {
1269                spin_unlock_irqrestore(&pmu_lock, flags);
1270                if (req_awaiting_reply)
1271                        adb_int_pending = 1;
1272                via_pmu_interrupt(0, NULL);
1273                spin_lock_irqsave(&pmu_lock, flags);
1274                if (!adb_int_pending && pmu_state == idle && !req_awaiting_reply) {
1275                        if (gpio_irq >= 0)
1276                                disable_irq_nosync(gpio_irq);
1277                        out_8(&via[IER], CB1_INT | IER_CLR);
1278                        spin_unlock_irqrestore(&pmu_lock, flags);
1279                        break;
1280                }
1281        } while (1);
1282}
1283
1284void
1285pmu_resume(void)
1286{
1287        unsigned long flags;
1288
1289        if (!via || (pmu_suspended < 1))
1290                return;
1291
1292        spin_lock_irqsave(&pmu_lock, flags);
1293        pmu_suspended--;
1294        if (pmu_suspended > 0) {
1295                spin_unlock_irqrestore(&pmu_lock, flags);
1296                return;
1297        }
1298        adb_int_pending = 1;
1299        if (gpio_irq >= 0)
1300                enable_irq(gpio_irq);
1301        out_8(&via[IER], CB1_INT | IER_SET);
1302        spin_unlock_irqrestore(&pmu_lock, flags);
1303        pmu_poll();
1304}
1305
1306/* Interrupt data could be the result data from an ADB cmd */
1307static void
1308pmu_handle_data(unsigned char *data, int len)
1309{
1310        unsigned char ints, pirq;
1311        int i = 0;
1312
1313        asleep = 0;
1314        if (drop_interrupts || len < 1) {
1315                adb_int_pending = 0;
1316                pmu_irq_stats[8]++;
1317                return;
1318        }
1319
1320        /* Get PMU interrupt mask */
1321        ints = data[0];
1322
1323        /* Record zero interrupts for stats */
1324        if (ints == 0)
1325                pmu_irq_stats[9]++;
1326
1327        /* Hack to deal with ADB autopoll flag */
1328        if (ints & PMU_INT_ADB)
1329                ints &= ~(PMU_INT_ADB_AUTO | PMU_INT_AUTO_SRQ_POLL);
1330
1331next:
1332
1333        if (ints == 0) {
1334                if (i > pmu_irq_stats[10])
1335                        pmu_irq_stats[10] = i;
1336                return;
1337        }
1338
1339        for (pirq = 0; pirq < 8; pirq++)
1340                if (ints & (1 << pirq))
1341                        break;
1342        pmu_irq_stats[pirq]++;
1343        i++;
1344        ints &= ~(1 << pirq);
1345
1346        /* Note: for some reason, we get an interrupt with len=1,
1347         * data[0]==0 after each normal ADB interrupt, at least
1348         * on the Pismo. Still investigating...  --BenH
1349         */
1350        if ((1 << pirq) & PMU_INT_ADB) {
1351                if ((data[0] & PMU_INT_ADB_AUTO) == 0) {
1352                        struct adb_request *req = req_awaiting_reply;
1353                        if (req == 0) {
1354                                printk(KERN_ERR "PMU: extra ADB reply\n");
1355                                return;
1356                        }
1357                        req_awaiting_reply = NULL;
1358                        if (len <= 2)
1359                                req->reply_len = 0;
1360                        else {
1361                                memcpy(req->reply, data + 1, len - 1);
1362                                req->reply_len = len - 1;
1363                        }
1364                        pmu_done(req);
1365                } else {
1366                        if (len == 4 && data[1] == 0x2c) {
1367                                extern int xmon_wants_key, xmon_adb_keycode;
1368                                if (xmon_wants_key) {
1369                                        xmon_adb_keycode = data[2];
1370                                        return;
1371                                }
1372                        }
1373#ifdef CONFIG_ADB
1374                        /*
1375                         * XXX On the [23]400 the PMU gives us an up
1376                         * event for keycodes 0x74 or 0x75 when the PC
1377                         * card eject buttons are released, so we
1378                         * ignore those events.
1379                         */
1380                        if (!(pmu_kind == PMU_OHARE_BASED && len == 4
1381                              && data[1] == 0x2c && data[3] == 0xff
1382                              && (data[2] & ~1) == 0xf4))
1383                                adb_input(data+1, len-1, 1);
1384#endif /* CONFIG_ADB */         
1385                }
1386        }
1387        /* Sound/brightness button pressed */
1388        else if ((1 << pirq) & PMU_INT_SNDBRT) {
1389#ifdef CONFIG_PMAC_BACKLIGHT
1390                if (len == 3)
1391                        pmac_backlight_set_legacy_brightness_pmu(data[1] >> 4);
1392#endif
1393        }
1394        /* Tick interrupt */
1395        else if ((1 << pirq) & PMU_INT_TICK) {
1396                /* Environement or tick interrupt, query batteries */
1397                if (pmu_battery_count) {
1398                        if ((--query_batt_timer) == 0) {
1399                                query_battery_state();
1400                                query_batt_timer = BATTERY_POLLING_COUNT;
1401                        }
1402                }
1403        }
1404        else if ((1 << pirq) & PMU_INT_ENVIRONMENT) {
1405                if (pmu_battery_count)
1406                        query_battery_state();
1407                pmu_pass_intr(data, len);
1408                /* len == 6 is probably a bad check. But how do I
1409                 * know what PMU versions send what events here? */
1410                if (len == 6) {
1411                        via_pmu_event(PMU_EVT_POWER, !!(data[1]&8));
1412                        via_pmu_event(PMU_EVT_LID, data[1]&1);
1413                }
1414        } else {
1415               pmu_pass_intr(data, len);
1416        }
1417        goto next;
1418}
1419
1420static struct adb_request*
1421pmu_sr_intr(void)
1422{
1423        struct adb_request *req;
1424        int bite = 0;
1425
1426        if (via[B] & TREQ) {
1427                printk(KERN_ERR "PMU: spurious SR intr (%x)\n", via[B]);
1428                out_8(&via[IFR], SR_INT);
1429                return NULL;
1430        }
1431        /* The ack may not yet be low when we get the interrupt */
1432        while ((in_8(&via[B]) & TACK) != 0)
1433                        ;
1434
1435        /* if reading grab the byte, and reset the interrupt */
1436        if (pmu_state == reading || pmu_state == reading_intr)
1437                bite = in_8(&via[SR]);
1438
1439        /* reset TREQ and wait for TACK to go high */
1440        out_8(&via[B], in_8(&via[B]) | TREQ);
1441        wait_for_ack();
1442
1443        switch (pmu_state) {
1444        case sending:
1445                req = current_req;
1446                if (data_len < 0) {
1447                        data_len = req->nbytes - 1;
1448                        send_byte(data_len);
1449                        break;
1450                }
1451                if (data_index <= data_len) {
1452                        send_byte(req->data[data_index++]);
1453                        break;
1454                }
1455                req->sent = 1;
1456                data_len = pmu_data_len[req->data[0]][1];
1457                if (data_len == 0) {
1458                        pmu_state = idle;
1459                        current_req = req->next;
1460                        if (req->reply_expected)
1461                                req_awaiting_reply = req;
1462                        else
1463                                return req;
1464                } else {
1465                        pmu_state = reading;
1466                        data_index = 0;
1467                        reply_ptr = req->reply + req->reply_len;
1468                        recv_byte();
1469                }
1470                break;
1471
1472        case intack:
1473                data_index = 0;
1474                data_len = -1;
1475                pmu_state = reading_intr;
1476                reply_ptr = interrupt_data[int_data_last];
1477                recv_byte();
1478                if (gpio_irq >= 0 && !gpio_irq_enabled) {
1479                        enable_irq(gpio_irq);
1480                        gpio_irq_enabled = 1;
1481                }
1482                break;
1483
1484        case reading:
1485        case reading_intr:
1486                if (data_len == -1) {
1487                        data_len = bite;
1488                        if (bite > 32)
1489                                printk(KERN_ERR "PMU: bad reply len %d\n", bite);
1490                } else if (data_index < 32) {
1491                        reply_ptr[data_index++] = bite;
1492                }
1493                if (data_index < data_len) {
1494                        recv_byte();
1495                        break;
1496                }
1497
1498                if (pmu_state == reading_intr) {
1499                        pmu_state = idle;
1500                        int_data_state[int_data_last] = int_data_ready;
1501                        interrupt_data_len[int_data_last] = data_len;
1502                } else {
1503                        req = current_req;
1504                        /* 
1505                         * For PMU sleep and freq change requests, we lock the
1506                         * PMU until it's explicitly unlocked. This avoids any
1507                         * spurrious event polling getting in
1508                         */
1509                        current_req = req->next;
1510                        req->reply_len += data_index;
1511                        if (req->data[0] == PMU_SLEEP || req->data[0] == PMU_CPU_SPEED)
1512                                pmu_state = locked;
1513                        else
1514                                pmu_state = idle;
1515                        return req;
1516                }
1517                break;
1518
1519        default:
1520                printk(KERN_ERR "via_pmu_interrupt: unknown state %d?\n",
1521                       pmu_state);
1522        }
1523        return NULL;
1524}
1525
1526static irqreturn_t
1527via_pmu_interrupt(int irq, void *arg)
1528{
1529        unsigned long flags;
1530        int intr;
1531        int nloop = 0;
1532        int int_data = -1;
1533        struct adb_request *req = NULL;
1534        int handled = 0;
1535
1536        /* This is a bit brutal, we can probably do better */
1537        spin_lock_irqsave(&pmu_lock, flags);
1538        ++disable_poll;
1539        
1540        for (;;) {
1541                intr = in_8(&via[IFR]) & (SR_INT | CB1_INT);
1542                if (intr == 0)
1543                        break;
1544                handled = 1;
1545                if (++nloop > 1000) {
1546                        printk(KERN_DEBUG "PMU: stuck in intr loop, "
1547                               "intr=%x, ier=%x pmu_state=%d\n",
1548                               intr, in_8(&via[IER]), pmu_state);
1549                        break;
1550                }
1551                out_8(&via[IFR], intr);
1552                if (intr & CB1_INT) {
1553                        adb_int_pending = 1;
1554                        pmu_irq_stats[0]++;
1555                }
1556                if (intr & SR_INT) {
1557                        req = pmu_sr_intr();
1558                        if (req)
1559                                break;
1560                }
1561        }
1562
1563recheck:
1564        if (pmu_state == idle) {
1565                if (adb_int_pending) {
1566                        if (int_data_state[0] == int_data_empty)
1567                                int_data_last = 0;
1568                        else if (int_data_state[1] == int_data_empty)
1569                                int_data_last = 1;
1570                        else
1571                                goto no_free_slot;
1572                        pmu_state = intack;
1573                        int_data_state[int_data_last] = int_data_fill;
1574                        /* Sounds safer to make sure ACK is high before writing.
1575                         * This helped kill a problem with ADB and some iBooks
1576                         */
1577                        wait_for_ack();
1578                        send_byte(PMU_INT_ACK);
1579                        adb_int_pending = 0;
1580                } else if (current_req)
1581                        pmu_start();
1582        }
1583no_free_slot:                   
1584        /* Mark the oldest buffer for flushing */
1585        if (int_data_state[!int_data_last] == int_data_ready) {
1586                int_data_state[!int_data_last] = int_data_flush;
1587                int_data = !int_data_last;
1588        } else if (int_data_state[int_data_last] == int_data_ready) {
1589                int_data_state[int_data_last] = int_data_flush;
1590                int_data = int_data_last;
1591        }
1592        --disable_poll;
1593        spin_unlock_irqrestore(&pmu_lock, flags);
1594
1595        /* Deal with completed PMU requests outside of the lock */
1596        if (req) {
1597                pmu_done(req);
1598                req = NULL;
1599        }
1600                
1601        /* Deal with interrupt datas outside of the lock */
1602        if (int_data >= 0) {
1603                pmu_handle_data(interrupt_data[int_data], interrupt_data_len[int_data]);
1604                spin_lock_irqsave(&pmu_lock, flags);
1605                ++disable_poll;
1606                int_data_state[int_data] = int_data_empty;
1607                int_data = -1;
1608                goto recheck;
1609        }
1610
1611        return IRQ_RETVAL(handled);
1612}
1613
1614void
1615pmu_unlock(void)
1616{
1617        unsigned long flags;
1618
1619        spin_lock_irqsave(&pmu_lock, flags);
1620        if (pmu_state == locked)
1621                pmu_state = idle;
1622        adb_int_pending = 1;
1623        spin_unlock_irqrestore(&pmu_lock, flags);
1624}
1625
1626
1627static irqreturn_t
1628gpio1_interrupt(int irq, void *arg)
1629{
1630        unsigned long flags;
1631
1632        if ((in_8(gpio_reg + 0x9) & 0x02) == 0) {
1633                spin_lock_irqsave(&pmu_lock, flags);
1634                if (gpio_irq_enabled > 0) {
1635                        disable_irq_nosync(gpio_irq);
1636                        gpio_irq_enabled = 0;
1637                }
1638                pmu_irq_stats[1]++;
1639                adb_int_pending = 1;
1640                spin_unlock_irqrestore(&pmu_lock, flags);
1641                via_pmu_interrupt(0, NULL);
1642                return IRQ_HANDLED;
1643        }
1644        return IRQ_NONE;
1645}
1646
1647void
1648pmu_enable_irled(int on)
1649{
1650        struct adb_request req;
1651
1652        if (vias == NULL)
1653                return ;
1654        if (pmu_kind == PMU_KEYLARGO_BASED)
1655                return ;
1656
1657        pmu_request(&req, NULL, 2, PMU_POWER_CTRL, PMU_POW_IRLED |
1658            (on ? PMU_POW_ON : PMU_POW_OFF));
1659        pmu_wait_complete(&req);
1660}
1661
1662void
1663pmu_restart(void)
1664{
1665        struct adb_request req;
1666
1667        if (via == NULL)
1668                return;
1669
1670        local_irq_disable();
1671
1672        drop_interrupts = 1;
1673        
1674        if (pmu_kind != PMU_KEYLARGO_BASED) {
1675                pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, PMU_INT_ADB |
1676                                                PMU_INT_TICK );
1677                while(!req.complete)
1678                        pmu_poll();
1679        }
1680
1681        pmu_request(&req, NULL, 1, PMU_RESET);
1682        pmu_wait_complete(&req);
1683        for (;;)
1684                ;
1685}
1686
1687void
1688pmu_shutdown(void)
1689{
1690        struct adb_request req;
1691
1692        if (via == NULL)
1693                return;
1694
1695        local_irq_disable();
1696
1697        drop_interrupts = 1;
1698
1699        if (pmu_kind != PMU_KEYLARGO_BASED) {
1700                pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, PMU_INT_ADB |
1701                                                PMU_INT_TICK );
1702                pmu_wait_complete(&req);
1703        } else {
1704                /* Disable server mode on shutdown or we'll just
1705                 * wake up again
1706                 */
1707                pmu_set_server_mode(0);
1708        }
1709
1710        pmu_request(&req, NULL, 5, PMU_SHUTDOWN,
1711                    'M', 'A', 'T', 'T');
1712        pmu_wait_complete(&req);
1713        for (;;)
1714                ;
1715}
1716
1717int
1718pmu_present(void)
1719{
1720        return via != 0;
1721}
1722
1723#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
1724/*
1725 * Put the powerbook to sleep.
1726 */
1727 
1728static u32 save_via[8];
1729
1730static void
1731save_via_state(void)
1732{
1733        save_via[0] = in_8(&via[ANH]);
1734        save_via[1] = in_8(&via[DIRA]);
1735        save_via[2] = in_8(&via[B]);
1736        save_via[3] = in_8(&via[DIRB]);
1737        save_via[4] = in_8(&via[PCR]);
1738        save_via[5] = in_8(&via[ACR]);
1739        save_via[6] = in_8(&via[T1CL]);
1740        save_via[7] = in_8(&via[T1CH]);
1741}
1742static void
1743restore_via_state(void)
1744{
1745        out_8(&via[ANH], save_via[0]);
1746        out_8(&via[DIRA], save_via[1]);
1747        out_8(&via[B], save_via[2]);
1748        out_8(&via[DIRB], save_via[3]);
1749        out_8(&via[PCR], save_via[4]);
1750        out_8(&via[ACR], save_via[5]);
1751        out_8(&via[T1CL], save_via[6]);
1752        out_8(&via[T1CH], save_via[7]);
1753        out_8(&via[IER], IER_CLR | 0x7f);       /* disable all intrs */
1754        out_8(&via[IFR], 0x7f);                         /* clear IFR */
1755        out_8(&via[IER], IER_SET | SR_INT | CB1_INT);
1756}
1757
1758#define GRACKLE_PM      (1<<7)
1759#define GRACKLE_DOZE    (1<<5)
1760#define GRACKLE_NAP     (1<<4)
1761#define GRACKLE_SLEEP   (1<<3)
1762
1763static int powerbook_sleep_grackle(void)
1764{
1765        unsigned long save_l2cr;
1766        unsigned short pmcr1;
1767        struct adb_request req;
1768        struct pci_dev *grackle;
1769
1770        grackle = pci_get_bus_and_slot(0, 0);
1771        if (!grackle)
1772                return -ENODEV;
1773
1774        /* Turn off various things. Darwin does some retry tests here... */
1775        pmu_request(&req, NULL, 2, PMU_POWER_CTRL0, PMU_POW0_OFF|PMU_POW0_HARD_DRIVE);
1776        pmu_wait_complete(&req);
1777        pmu_request(&req, NULL, 2, PMU_POWER_CTRL,
1778                PMU_POW_OFF|PMU_POW_BACKLIGHT|PMU_POW_IRLED|PMU_POW_MEDIABAY);
1779        pmu_wait_complete(&req);
1780
1781        /* For 750, save backside cache setting and disable it */
1782        save_l2cr = _get_L2CR();        /* (returns -1 if not available) */
1783
1784        if (!__fake_sleep) {
1785                /* Ask the PMU to put us to sleep */
1786                pmu_request(&req, NULL, 5, PMU_SLEEP, 'M', 'A', 'T', 'T');
1787                pmu_wait_complete(&req);
1788        }
1789
1790        /* The VIA is supposed not to be restored correctly*/
1791        save_via_state();
1792        /* We shut down some HW */
1793        pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,1);
1794
1795        pci_read_config_word(grackle, 0x70, &pmcr1);
1796        /* Apparently, MacOS uses NAP mode for Grackle ??? */
1797        pmcr1 &= ~(GRACKLE_DOZE|GRACKLE_SLEEP); 
1798        pmcr1 |= GRACKLE_PM|GRACKLE_NAP;
1799        pci_write_config_word(grackle, 0x70, pmcr1);
1800
1801        /* Call low-level ASM sleep handler */
1802        if (__fake_sleep)
1803                mdelay(5000);
1804        else
1805                low_sleep_handler();
1806
1807        /* We're awake again, stop grackle PM */
1808        pci_read_config_word(grackle, 0x70, &pmcr1);
1809        pmcr1 &= ~(GRACKLE_PM|GRACKLE_DOZE|GRACKLE_SLEEP|GRACKLE_NAP); 
1810        pci_write_config_word(grackle, 0x70, pmcr1);
1811
1812        pci_dev_put(grackle);
1813
1814        /* Make sure the PMU is idle */
1815        pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,0);
1816        restore_via_state();
1817        
1818        /* Restore L2 cache */
1819        if (save_l2cr != 0xffffffff && (save_l2cr & L2CR_L2E) != 0)
1820                _set_L2CR(save_l2cr);
1821        
1822        /* Restore userland MMU context */
1823        switch_mmu_context(NULL, current->active_mm);
1824
1825        /* Power things up */
1826        pmu_unlock();
1827        pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, pmu_intr_mask);
1828        pmu_wait_complete(&req);
1829        pmu_request(&req, NULL, 2, PMU_POWER_CTRL0,
1830                        PMU_POW0_ON|PMU_POW0_HARD_DRIVE);
1831        pmu_wait_complete(&req);
1832        pmu_request(&req, NULL, 2, PMU_POWER_CTRL,
1833                        PMU_POW_ON|PMU_POW_BACKLIGHT|PMU_POW_CHARGER|PMU_POW_IRLED|PMU_POW_MEDIABAY);
1834        pmu_wait_complete(&req);
1835
1836        return 0;
1837}
1838
1839static int
1840powerbook_sleep_Core99(void)
1841{
1842        unsigned long save_l2cr;
1843        unsigned long save_l3cr;
1844        struct adb_request req;
1845        
1846        if (pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) < 0) {
1847                printk(KERN_ERR "Sleep mode not supported on this machine\n");
1848                return -ENOSYS;
1849        }
1850
1851        if (num_online_cpus() > 1 || cpu_is_offline(0))
1852                return -EAGAIN;
1853
1854        /* Stop environment and ADB interrupts */
1855        pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, 0);
1856        pmu_wait_complete(&req);
1857
1858        /* Tell PMU what events will wake us up */
1859        pmu_request(&req, NULL, 4, PMU_POWER_EVENTS, PMU_PWR_CLR_WAKEUP_EVENTS,
1860                0xff, 0xff);
1861        pmu_wait_complete(&req);
1862        pmu_request(&req, NULL, 4, PMU_POWER_EVENTS, PMU_PWR_SET_WAKEUP_EVENTS,
1863                0, PMU_PWR_WAKEUP_KEY |
1864                (option_lid_wakeup ? PMU_PWR_WAKEUP_LID_OPEN : 0));
1865        pmu_wait_complete(&req);
1866
1867        /* Save the state of the L2 and L3 caches */
1868        save_l3cr = _get_L3CR();        /* (returns -1 if not available) */
1869        save_l2cr = _get_L2CR();        /* (returns -1 if not available) */
1870
1871        if (!__fake_sleep) {
1872                /* Ask the PMU to put us to sleep */
1873                pmu_request(&req, NULL, 5, PMU_SLEEP, 'M', 'A', 'T', 'T');
1874                pmu_wait_complete(&req);
1875        }
1876
1877        /* The VIA is supposed not to be restored correctly*/
1878        save_via_state();
1879
1880        /* Shut down various ASICs. There's a chance that we can no longer
1881         * talk to the PMU after this, so I moved it to _after_ sending the
1882         * sleep command to it. Still need to be checked.
1883         */
1884        pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 1);
1885
1886        /* Call low-level ASM sleep handler */
1887        if (__fake_sleep)
1888                mdelay(5000);
1889        else
1890                low_sleep_handler();
1891
1892        /* Restore Apple core ASICs state */
1893        pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 0);
1894
1895        /* Restore VIA */
1896        restore_via_state();
1897
1898        /* tweak LPJ before cpufreq is there */
1899        loops_per_jiffy *= 2;
1900
1901        /* Restore video */
1902        pmac_call_early_video_resume();
1903
1904        /* Restore L2 cache */
1905        if (save_l2cr != 0xffffffff && (save_l2cr & L2CR_L2E) != 0)
1906                _set_L2CR(save_l2cr);
1907        /* Restore L3 cache */
1908        if (save_l3cr != 0xffffffff && (save_l3cr & L3CR_L3E) != 0)
1909                _set_L3CR(save_l3cr);
1910        
1911        /* Restore userland MMU context */
1912        switch_mmu_context(NULL, current->active_mm);
1913
1914        /* Tell PMU we are ready */
1915        pmu_unlock();
1916        pmu_request(&req, NULL, 2, PMU_SYSTEM_READY, 2);
1917        pmu_wait_complete(&req);
1918        pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, pmu_intr_mask);
1919        pmu_wait_complete(&req);
1920
1921        /* Restore LPJ, cpufreq will adjust the cpu frequency */
1922        loops_per_jiffy /= 2;
1923
1924        return 0;
1925}
1926
1927#define PB3400_MEM_CTRL         0xf8000000
1928#define PB3400_MEM_CTRL_SLEEP   0x70
1929
1930static void __iomem *pb3400_mem_ctrl;
1931
1932static void powerbook_sleep_init_3400(void)
1933{
1934        /* map in the memory controller registers */
1935        pb3400_mem_ctrl = ioremap(PB3400_MEM_CTRL, 0x100);
1936        if (pb3400_mem_ctrl == NULL)
1937                printk(KERN_WARNING "ioremap failed: sleep won't be possible");
1938}
1939
1940static int powerbook_sleep_3400(void)
1941{
1942        int i, x;
1943        unsigned int hid0;
1944        unsigned long msr;
1945        struct adb_request sleep_req;
1946        unsigned int __iomem *mem_ctrl_sleep;
1947
1948        if (pb3400_mem_ctrl == NULL)
1949                return -ENOMEM;
1950        mem_ctrl_sleep = pb3400_mem_ctrl + PB3400_MEM_CTRL_SLEEP;
1951
1952        /* Set the memory controller to keep the memory refreshed
1953           while we're asleep */
1954        for (i = 0x403f; i >= 0x4000; --i) {
1955                out_be32(mem_ctrl_sleep, i);
1956                do {
1957                        x = (in_be32(mem_ctrl_sleep) >> 16) & 0x3ff;
1958                } while (x == 0);
1959                if (x >= 0x100)
1960                        break;
1961        }
1962
1963        /* Ask the PMU to put us to sleep */
1964        pmu_request(&sleep_req, NULL, 5, PMU_SLEEP, 'M', 'A', 'T', 'T');
1965        pmu_wait_complete(&sleep_req);
1966        pmu_unlock();
1967
1968        pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 1);
1969
1970        asleep = 1;
1971
1972        /* Put the CPU into sleep mode */
1973        hid0 = mfspr(SPRN_HID0);
1974        hid0 = (hid0 & ~(HID0_NAP | HID0_DOZE)) | HID0_SLEEP;
1975        mtspr(SPRN_HID0, hid0);
1976        local_irq_enable();
1977        msr = mfmsr() | MSR_POW;
1978        while (asleep) {
1979                mb();
1980                mtmsr(msr);
1981                isync();
1982        }
1983        local_irq_disable();
1984
1985        /* OK, we're awake again, start restoring things */
1986        out_be32(mem_ctrl_sleep, 0x3f);
1987        pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 0);
1988
1989        return 0;
1990}
1991
1992#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
1993
1994/*
1995 * Support for /dev/pmu device
1996 */
1997#define RB_SIZE         0x10
1998struct pmu_private {
1999        struct list_head list;
2000        int     rb_get;
2001        int     rb_put;
2002        struct rb_entry {
2003                unsigned short len;
2004                unsigned char data[16];
2005        }       rb_buf[RB_SIZE];
2006        wait_queue_head_t wait;
2007        spinlock_t lock;
2008#if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
2009        int     backlight_locker;
2010#endif
2011};
2012
2013static LIST_HEAD(all_pmu_pvt);
2014static DEFINE_SPINLOCK(all_pvt_lock);
2015
2016static void
2017pmu_pass_intr(unsigned char *data, int len)
2018{
2019        struct pmu_private *pp;
2020        struct list_head *list;
2021        int i;
2022        unsigned long flags;
2023
2024        if (len > sizeof(pp->rb_buf[0].data))
2025                len = sizeof(pp->rb_buf[0].data);
2026        spin_lock_irqsave(&all_pvt_lock, flags);
2027        for (list = &all_pmu_pvt; (list = list->next) != &all_pmu_pvt; ) {
2028                pp = list_entry(list, struct pmu_private, list);
2029                spin_lock(&pp->lock);
2030                i = pp->rb_put + 1;
2031                if (i >= RB_SIZE)
2032                        i = 0;
2033                if (i != pp->rb_get) {
2034                        struct rb_entry *rp = &pp->rb_buf[pp->rb_put];
2035                        rp->len = len;
2036                        memcpy(rp->data, data, len);
2037                        pp->rb_put = i;
2038                        wake_up_interruptible(&pp->wait);
2039                }
2040                spin_unlock(&pp->lock);
2041        }
2042        spin_unlock_irqrestore(&all_pvt_lock, flags);
2043}
2044
2045static int
2046pmu_open(struct inode *inode, struct file *file)
2047{
2048        struct pmu_private *pp;
2049        unsigned long flags;
2050
2051        pp = kmalloc(sizeof(struct pmu_private), GFP_KERNEL);
2052        if (pp == 0)
2053                return -ENOMEM;
2054        pp->rb_get = pp->rb_put = 0;
2055        spin_lock_init(&pp->lock);
2056        init_waitqueue_head(&pp->wait);
2057        lock_kernel();
2058        spin_lock_irqsave(&all_pvt_lock, flags);
2059#if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
2060        pp->backlight_locker = 0;
2061#endif
2062        list_add(&pp->list, &all_pmu_pvt);
2063        spin_unlock_irqrestore(&all_pvt_lock, flags);
2064        file->private_data = pp;
2065        unlock_kernel();
2066        return 0;
2067}
2068
2069static ssize_t 
2070pmu_read(struct file *file, char __user *buf,
2071                        size_t count, loff_t *ppos)
2072{
2073        struct pmu_private *pp = file->private_data;
2074        DECLARE_WAITQUEUE(wait, current);
2075        unsigned long flags;
2076        int ret = 0;
2077
2078        if (count < 1 || pp == 0)
2079                return -EINVAL;
2080        if (!access_ok(VERIFY_WRITE, buf, count))
2081                return -EFAULT;
2082
2083        spin_lock_irqsave(&pp->lock, flags);
2084        add_wait_queue(&pp->wait, &wait);
2085        current->state = TASK_INTERRUPTIBLE;
2086
2087        for (;;) {
2088                ret = -EAGAIN;
2089                if (pp->rb_get != pp->rb_put) {
2090                        int i = pp->rb_get;
2091                        struct rb_entry *rp = &pp->rb_buf[i];
2092                        ret = rp->len;
2093                        spin_unlock_irqrestore(&pp->lock, flags);
2094                        if (ret > count)
2095                                ret = count;
2096                        if (ret > 0 && copy_to_user(buf, rp->data, ret))
2097                                ret = -EFAULT;
2098                        if (++i >= RB_SIZE)
2099                                i = 0;
2100                        spin_lock_irqsave(&pp->lock, flags);
2101                        pp->rb_get = i;
2102                }
2103                if (ret >= 0)
2104                        break;
2105                if (file->f_flags & O_NONBLOCK)
2106                        break;
2107                ret = -ERESTARTSYS;
2108                if (signal_pending(current))
2109                        break;
2110                spin_unlock_irqrestore(&pp->lock, flags);
2111                schedule();
2112                spin_lock_irqsave(&pp->lock, flags);
2113        }
2114        current->state = TASK_RUNNING;
2115        remove_wait_queue(&pp->wait, &wait);
2116        spin_unlock_irqrestore(&pp->lock, flags);
2117        
2118        return ret;
2119}
2120
2121static ssize_t
2122pmu_write(struct file *file, const char __user *buf,
2123                         size_t count, loff_t *ppos)
2124{
2125        return 0;
2126}
2127
2128static unsigned int
2129pmu_fpoll(struct file *filp, poll_table *wait)
2130{
2131        struct pmu_private *pp = filp->private_data;
2132        unsigned int mask = 0;
2133        unsigned long flags;
2134        
2135        if (pp == 0)
2136                return 0;
2137        poll_wait(filp, &pp->wait, wait);
2138        spin_lock_irqsave(&pp->lock, flags);
2139        if (pp->rb_get != pp->rb_put)
2140                mask |= POLLIN;
2141        spin_unlock_irqrestore(&pp->lock, flags);
2142        return mask;
2143}
2144
2145static int
2146pmu_release(struct inode *inode, struct file *file)
2147{
2148        struct pmu_private *pp = file->private_data;
2149        unsigned long flags;
2150
2151        if (pp != 0) {
2152                file->private_data = NULL;
2153                spin_lock_irqsave(&all_pvt_lock, flags);
2154                list_del(&pp->list);
2155                spin_unlock_irqrestore(&all_pvt_lock, flags);
2156
2157#if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
2158                if (pp->backlight_locker)
2159                        pmac_backlight_enable();
2160#endif
2161
2162                kfree(pp);
2163        }
2164        return 0;
2165}
2166
2167#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
2168static void pmac_suspend_disable_irqs(void)
2169{
2170        /* Call platform functions marked "on sleep" */
2171        pmac_pfunc_i2c_suspend();
2172        pmac_pfunc_base_suspend();
2173}
2174
2175static int powerbook_sleep(suspend_state_t state)
2176{
2177        int error = 0;
2178
2179        /* Wait for completion of async requests */
2180        while (!batt_req.complete)
2181                pmu_poll();
2182
2183        /* Giveup the lazy FPU & vec so we don't have to back them
2184         * up from the low level code
2185         */
2186        enable_kernel_fp();
2187
2188#ifdef CONFIG_ALTIVEC
2189        if (cpu_has_feature(CPU_FTR_ALTIVEC))
2190                enable_kernel_altivec();
2191#endif /* CONFIG_ALTIVEC */
2192
2193        switch (pmu_kind) {
2194        case PMU_OHARE_BASED:
2195                error = powerbook_sleep_3400();
2196                break;
2197        case PMU_HEATHROW_BASED:
2198        case PMU_PADDINGTON_BASED:
2199                error = powerbook_sleep_grackle();
2200                break;
2201        case PMU_KEYLARGO_BASED:
2202                error = powerbook_sleep_Core99();
2203                break;
2204        default:
2205                return -ENOSYS;
2206        }
2207
2208        if (error)
2209                return error;
2210
2211        mdelay(100);
2212
2213        return 0;
2214}
2215
2216static void pmac_suspend_enable_irqs(void)
2217{
2218        /* Force a poll of ADB interrupts */
2219        adb_int_pending = 1;
2220        via_pmu_interrupt(0, NULL);
2221
2222        mdelay(10);
2223
2224        /* Call platform functions marked "on wake" */
2225        pmac_pfunc_base_resume();
2226        pmac_pfunc_i2c_resume();
2227}
2228
2229static int pmu_sleep_valid(suspend_state_t state)
2230{
2231        return state == PM_SUSPEND_MEM
2232                && (pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, -1) >= 0);
2233}
2234
2235static struct platform_suspend_ops pmu_pm_ops = {
2236        .enter = powerbook_sleep,
2237        .valid = pmu_sleep_valid,
2238};
2239
2240static int register_pmu_pm_ops(void)
2241{
2242        if (pmu_kind == PMU_OHARE_BASED)
2243                powerbook_sleep_init_3400();
2244        ppc_md.suspend_disable_irqs = pmac_suspend_disable_irqs;
2245        ppc_md.suspend_enable_irqs = pmac_suspend_enable_irqs;
2246        suspend_set_ops(&pmu_pm_ops);
2247
2248        return 0;
2249}
2250
2251device_initcall(register_pmu_pm_ops);
2252#endif
2253
2254static int
2255pmu_ioctl(struct inode * inode, struct file *filp,
2256                     u_int cmd, u_long arg)
2257{
2258        __u32 __user *argp = (__u32 __user *)arg;
2259        int error = -EINVAL;
2260
2261        switch (cmd) {
2262        case PMU_IOC_SLEEP:
2263                if (!capable(CAP_SYS_ADMIN))
2264                        return -EACCES;
2265                return pm_suspend(PM_SUSPEND_MEM);
2266        case PMU_IOC_CAN_SLEEP:
2267                if (pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, -1) < 0)
2268                        return put_user(0, argp);
2269                else
2270                        return put_user(1, argp);
2271
2272#ifdef CONFIG_PMAC_BACKLIGHT_LEGACY
2273        /* Compatibility ioctl's for backlight */
2274        case PMU_IOC_GET_BACKLIGHT:
2275        {
2276                int brightness;
2277
2278                brightness = pmac_backlight_get_legacy_brightness();
2279                if (brightness < 0)
2280                        return brightness;
2281                else
2282                        return put_user(brightness, argp);
2283
2284        }
2285        case PMU_IOC_SET_BACKLIGHT:
2286        {
2287                int brightness;
2288
2289                error = get_user(brightness, argp);
2290                if (error)
2291                        return error;
2292
2293                return pmac_backlight_set_legacy_brightness(brightness);
2294        }
2295#ifdef CONFIG_INPUT_ADBHID
2296        case PMU_IOC_GRAB_BACKLIGHT: {
2297                struct pmu_private *pp = filp->private_data;
2298
2299                if (pp->backlight_locker)
2300                        return 0;
2301
2302                pp->backlight_locker = 1;
2303                pmac_backlight_disable();
2304
2305                return 0;
2306        }
2307#endif /* CONFIG_INPUT_ADBHID */
2308#endif /* CONFIG_PMAC_BACKLIGHT_LEGACY */
2309
2310        case PMU_IOC_GET_MODEL:
2311                return put_user(pmu_kind, argp);
2312        case PMU_IOC_HAS_ADB:
2313                return put_user(pmu_has_adb, argp);
2314        }
2315        return error;
2316}
2317
2318static const struct file_operations pmu_device_fops = {
2319        .read           = pmu_read,
2320        .write          = pmu_write,
2321        .poll           = pmu_fpoll,
2322        .ioctl          = pmu_ioctl,
2323        .open           = pmu_open,
2324        .release        = pmu_release,
2325};
2326
2327static struct miscdevice pmu_device = {
2328        PMU_MINOR, "pmu", &pmu_device_fops
2329};
2330
2331static int pmu_device_init(void)
2332{
2333        if (!via)
2334                return 0;
2335        if (misc_register(&pmu_device) < 0)
2336                printk(KERN_ERR "via-pmu: cannot register misc device.\n");
2337        return 0;
2338}
2339device_initcall(pmu_device_init);
2340
2341
2342#ifdef DEBUG_SLEEP
2343static inline void 
2344polled_handshake(volatile unsigned char __iomem *via)
2345{
2346        via[B] &= ~TREQ; eieio();
2347        while ((via[B] & TACK) != 0)
2348                ;
2349        via[B] |= TREQ; eieio();
2350        while ((via[B] & TACK) == 0)
2351                ;
2352}
2353
2354static inline void 
2355polled_send_byte(volatile unsigned char __iomem *via, int x)
2356{
2357        via[ACR] |= SR_OUT | SR_EXT; eieio();
2358        via[SR] = x; eieio();
2359        polled_handshake(via);
2360}
2361
2362static inline int
2363polled_recv_byte(volatile unsigned char __iomem *via)
2364{
2365        int x;
2366
2367        via[ACR] = (via[ACR] & ~SR_OUT) | SR_EXT; eieio();
2368        x = via[SR]; eieio();
2369        polled_handshake(via);
2370        x = via[SR]; eieio();
2371        return x;
2372}
2373
2374int
2375pmu_polled_request(struct adb_request *req)
2376{
2377        unsigned long flags;
2378        int i, l, c;
2379        volatile unsigned char __iomem *v = via;
2380
2381        req->complete = 1;
2382        c = req->data[0];
2383        l = pmu_data_len[c][0];
2384        if (l >= 0 && req->nbytes != l + 1)
2385                return -EINVAL;
2386
2387        local_irq_save(flags);
2388        while (pmu_state != idle)
2389                pmu_poll();
2390
2391        while ((via[B] & TACK) == 0)
2392                ;
2393        polled_send_byte(v, c);
2394        if (l < 0) {
2395                l = req->nbytes - 1;
2396                polled_send_byte(v, l);
2397        }
2398        for (i = 1; i <= l; ++i)
2399                polled_send_byte(v, req->data[i]);
2400
2401        l = pmu_data_len[c][1];
2402        if (l < 0)
2403                l = polled_recv_byte(v);
2404        for (i = 0; i < l; ++i)
2405                req->reply[i + req->reply_len] = polled_recv_byte(v);
2406
2407        if (req->done)
2408                (*req->done)(req);
2409
2410        local_irq_restore(flags);
2411        return 0;
2412}
2413
2414/* N.B. This doesn't work on the 3400 */
2415void pmu_blink(int n)
2416{
2417        struct adb_request req;
2418
2419        memset(&req, 0, sizeof(req));
2420
2421        for (; n > 0; --n) {
2422                req.nbytes = 4;
2423                req.done = NULL;
2424                req.data[0] = 0xee;
2425                req.data[1] = 4;
2426                req.data[2] = 0;
2427                req.data[3] = 1;
2428                req.reply[0] = ADB_RET_OK;
2429                req.reply_len = 1;
2430                req.reply_expected = 0;
2431                pmu_polled_request(&req);
2432                mdelay(50);
2433                req.nbytes = 4;
2434                req.done = NULL;
2435                req.data[0] = 0xee;
2436                req.data[1] = 4;
2437                req.data[2] = 0;
2438                req.data[3] = 0;
2439                req.reply[0] = ADB_RET_OK;
2440                req.reply_len = 1;
2441                req.reply_expected = 0;
2442                pmu_polled_request(&req);
2443                mdelay(50);
2444        }
2445        mdelay(50);
2446}
2447#endif /* DEBUG_SLEEP */
2448
2449#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
2450int pmu_sys_suspended;
2451
2452static int pmu_sys_suspend(struct sys_device *sysdev, pm_message_t state)
2453{
2454        if (state.event != PM_EVENT_SUSPEND || pmu_sys_suspended)
2455                return 0;
2456
2457        /* Suspend PMU event interrupts */\
2458        pmu_suspend();
2459        pmu_sys_suspended = 1;
2460
2461#ifdef CONFIG_PMAC_BACKLIGHT
2462        /* Tell backlight code not to muck around with the chip anymore */
2463        pmu_backlight_set_sleep(1);
2464#endif
2465
2466        return 0;
2467}
2468
2469static int pmu_sys_resume(struct sys_device *sysdev)
2470{
2471        struct adb_request req;
2472
2473        if (!pmu_sys_suspended)
2474                return 0;
2475
2476        /* Tell PMU we are ready */
2477        pmu_request(&req, NULL, 2, PMU_SYSTEM_READY, 2);
2478        pmu_wait_complete(&req);
2479
2480#ifdef CONFIG_PMAC_BACKLIGHT
2481        /* Tell backlight code it can use the chip again */
2482        pmu_backlight_set_sleep(0);
2483#endif
2484        /* Resume PMU event interrupts */
2485        pmu_resume();
2486        pmu_sys_suspended = 0;
2487
2488        return 0;
2489}
2490
2491#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
2492
2493static struct sysdev_class pmu_sysclass = {
2494        .name = "pmu",
2495};
2496
2497static struct sys_device device_pmu = {
2498        .cls            = &pmu_sysclass,
2499};
2500
2501static struct sysdev_driver driver_pmu = {
2502#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
2503        .suspend        = &pmu_sys_suspend,
2504        .resume         = &pmu_sys_resume,
2505#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
2506};
2507
2508static int __init init_pmu_sysfs(void)
2509{
2510        int rc;
2511
2512        rc = sysdev_class_register(&pmu_sysclass);
2513        if (rc) {
2514                printk(KERN_ERR "Failed registering PMU sys class\n");
2515                return -ENODEV;
2516        }
2517        rc = sysdev_register(&device_pmu);
2518        if (rc) {
2519                printk(KERN_ERR "Failed registering PMU sys device\n");
2520                return -ENODEV;
2521        }
2522        rc = sysdev_driver_register(&pmu_sysclass, &driver_pmu);
2523        if (rc) {
2524                printk(KERN_ERR "Failed registering PMU sys driver\n");
2525                return -ENODEV;
2526        }
2527        return 0;
2528}
2529
2530subsys_initcall(init_pmu_sysfs);
2531
2532EXPORT_SYMBOL(pmu_request);
2533EXPORT_SYMBOL(pmu_queue_request);
2534EXPORT_SYMBOL(pmu_poll);
2535EXPORT_SYMBOL(pmu_poll_adb);
2536EXPORT_SYMBOL(pmu_wait_complete);
2537EXPORT_SYMBOL(pmu_suspend);
2538EXPORT_SYMBOL(pmu_resume);
2539EXPORT_SYMBOL(pmu_unlock);
2540#if defined(CONFIG_PPC32)
2541EXPORT_SYMBOL(pmu_enable_irled);
2542EXPORT_SYMBOL(pmu_battery_count);
2543EXPORT_SYMBOL(pmu_batteries);
2544EXPORT_SYMBOL(pmu_power_flags);
2545#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
2546
2547