summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2003-03-22 05:34:14 -0800
committerLinus Torvalds <torvalds@home.transmeta.com>2003-03-22 05:34:14 -0800
commit1e06dcf9b3b4376e922e8a4fbf347e170ff935e5 (patch)
treecf53ebcc89016bb67a271b0eeb0d8e47ed751002
parentb1e1650679a287e246b030fa399acbd97455d2f4 (diff)
[PATCH] update via-pmu driver
This patch forward-ports various fixes to the driver for the PMU (power manager unit) on powermacs and powerbooks from 2.4, and in particular, some improvements to the battery charge calculations. From Ben Herrenschmidt.
-rw-r--r--drivers/macintosh/via-pmu.c393
1 files changed, 141 insertions, 252 deletions
diff --git a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c
index f73a5b1eea29..29e6a55bc17d 100644
--- a/drivers/macintosh/via-pmu.c
+++ b/drivers/macintosh/via-pmu.c
@@ -33,6 +33,7 @@
#include <linux/pm.h>
#include <linux/proc_fs.h>
#include <linux/init.h>
+#include <linux/interrupt.h>
#include <asm/prom.h>
#include <asm/machdep.h>
#include <asm/io.h>
@@ -343,10 +344,6 @@ find_via_pmu()
} else
pmu_kind = PMU_UNKNOWN;
-#ifdef CONFIG_PMAC_PBOOK
- if (pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0)
- can_sleep = 1;
-#endif /* CONFIG_PMAC_PBOOK */
via = (volatile unsigned char *) ioremap(vias->addrs->address, 0x2000);
out_8(&via[IER], IER_CLR | 0x7f); /* disable all intrs */
@@ -405,6 +402,8 @@ static int __init via_pmu_start(void)
bright_req_3.complete = 1;
#ifdef CONFIG_PMAC_PBOOK
batt_req.complete = 1;
+ if (pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0)
+ can_sleep = 1;
#endif
if (request_irq(vias->intrs[0].line, via_pmu_interrupt, 0, "VIA-PMU",
@@ -457,12 +456,20 @@ static int __init via_pmu_dev_init(void)
#ifdef CONFIG_PMAC_PBOOK
if (machine_is_compatible("AAPL,3400/2400") ||
- machine_is_compatible("AAPL,3500"))
+ machine_is_compatible("AAPL,3500")) {
+ int mb = pmac_call_feature(PMAC_FTR_GET_MB_INFO,
+ NULL, PMAC_MB_INFO_MODEL, 0);
pmu_battery_count = 1;
- else if (machine_is_compatible("AAPL,PowerBook1998") ||
- machine_is_compatible("PowerBook1,1"))
+ if (mb == PMAC_TYPE_COMET)
+ pmu_batteries[0].flags |= PMU_BATT_TYPE_COMET;
+ else
+ pmu_batteries[0].flags |= PMU_BATT_TYPE_HOOPER;
+ } else if (machine_is_compatible("AAPL,PowerBook1998") ||
+ machine_is_compatible("PowerBook1,1")) {
pmu_battery_count = 2;
- else {
+ pmu_batteries[0].flags |= PMU_BATT_TYPE_SMART;
+ pmu_batteries[1].flags |= PMU_BATT_TYPE_SMART;
+ } else {
struct device_node* prim = find_devices("power-mgt");
u32 *prim_info = NULL;
if (prim)
@@ -470,6 +477,9 @@ static int __init via_pmu_dev_init(void)
if (prim_info) {
/* Other stuffs here yet unknown */
pmu_battery_count = (prim_info[6] >> 16) & 0xff;
+ pmu_batteries[0].flags |= PMU_BATT_TYPE_SMART;
+ if (pmu_battery_count > 1)
+ pmu_batteries[1].flags |= PMU_BATT_TYPE_SMART;
}
}
#endif /* CONFIG_PMAC_PBOOK */
@@ -550,156 +560,30 @@ init_pmu()
return 1;
}
-int
+int __pmac
pmu_get_model(void)
{
return pmu_kind;
}
-#ifdef CONFIG_PMAC_PBOOK
-
-/*
- * WARNING ! This code probably needs some debugging... -- BenH.
- */
-#ifdef NEW_OHARE_CODE
-static void __pmac
-done_battery_state_ohare(struct adb_request* req)
+static inline void wakeup_decrementer(void)
{
- unsigned int bat_flags = 0;
- int current = 0;
- unsigned int capa, max, voltage, time;
- int lrange[] = { 0, 275, 850, 1680, 2325,
- 2765, 3160, 3500, 3830, 4115,
- 4360, 4585, 4795, 4990, 5170,
- 5340, 5510, 5710, 5930, 6150,
- 6370, 6500
- };
-
- if (req->reply[0] & 0x01)
- pmu_power_flags |= PMU_PWR_AC_PRESENT;
- else
- pmu_power_flags &= ~PMU_PWR_AC_PRESENT;
+ set_dec(tb_ticks_per_jiffy);
+ /* No currently-supported powerbook has a 601,
+ * so use get_tbl, not native
+ */
+ last_jiffy_stamp(0) = tb_last_stamp = get_tbl();
+}
- if (req->reply[0] & 0x04) {
- int vb, i, j, k, charge, pcharge;
- bat_flags |= PMU_BATT_PRESENT;
- vb = (req->reply[1] << 8) | req->reply[2];
- voltage = ((vb * 2650) + 726650)/100;
- vb *= 100;
- current = req->reply[5];
- if ((req->reply[0] & 0x01) == 0 && (current > 200))
- vb += (current - 200) * 15;
- else if (req->reply[0] & 0x02)
- vb = (vb - 2000);
- i = (33000 - vb) / 10;
- j = i - (i % 100);
- k = j/100;
- if (k <= 0)
- charge = 0;
- else if (k >= 21)
- charge = 650000;
- else
- charge = (lrange[k + 1] - lrange[k]) * (i - j) + (lrange[k] * 100);
- charge = (1000 - charge / 650) / 10;
- if (req->reply[0] & 0x40) {
- pcharge = (req->reply[6] << 8) + req->reply[7];
- if (pcharge > 6500)
- pcharge = 6500;
- pcharge *= 100;
- pcharge = (1000 - pcharge / 650) / 10;
- if (pcharge < charge)
- charge = pcharge;
- }
- capa = charge;
- max = 100;
- time = (charge * 16440) / current;
- current = -current;
-
- } else
- capa = max = current = voltage = time = 0;
- if (req->reply[0] & 0x02)
- bat_flags |= PMU_BATT_CHARGING;
+#ifdef CONFIG_PMAC_PBOOK
- pmu_batteries[pmu_cur_battery].flags = bat_flags;
- pmu_batteries[pmu_cur_battery].charge = capa;
- pmu_batteries[pmu_cur_battery].max_charge = max;
- pmu_batteries[pmu_cur_battery].current = current;
- pmu_batteries[pmu_cur_battery].voltage = voltage;
- pmu_batteries[pmu_cur_battery].time_remaining = time;
-}
-#else /* NEW_OHARE_CODE */
+/* This new version of the code for 2400/3400/3500 powerbooks
+ * is inspired from the implementation in gkrellm-pmu
+ */
static void __pmac
done_battery_state_ohare(struct adb_request* req)
{
- unsigned int bat_flags = 0;
- int current = 0;
- unsigned int capa, max, voltage, time;
- int lrange[] = { 0, 275, 850, 1680, 2325,
- 2765, 3160, 3500, 3830, 4115,
- 4360, 4585, 4795, 4990, 5170,
- 5340, 5510, 5710, 5930, 6150,
- 6370, 6500
- };
-
- if (req->reply[0] & 0x01)
- pmu_power_flags |= PMU_PWR_AC_PRESENT;
- else
- pmu_power_flags &= ~PMU_PWR_AC_PRESENT;
-
- if (req->reply[0] & 0x04) {
- int vb, i, j, charge, pcharge;
- bat_flags |= PMU_BATT_PRESENT;
- vb = (req->reply[1] << 8) | req->reply[2];
- voltage = ((vb * 2650) + 726650)/100;
- current = *((signed char *)&req->reply[5]);
- if ((req->reply[0] & 0x01) == 0 && (current > 200))
- vb += (current - 200) * 15;
- else if (req->reply[0] & 0x02)
- vb = (vb - 10) * 100;
- i = (33000 - vb) / 10;
- j = i - (i % 100);
- if (j <= 0)
- charge = 0;
- else if (j >= 21)
- charge = 650000;
- else
- charge = (lrange[j + 1] - lrange[j]) * (i - j) + (lrange[j] * 100);
- charge = (1000 - charge / 650) / 10;
- if (req->reply[0] & 0x40) {
- pcharge = (req->reply[6] << 8) + req->reply[7];
- if (pcharge > 6500)
- pcharge = 6500;
- pcharge *= 100;
- pcharge = (1000 - pcharge / 650) / 10;
- if (pcharge < charge)
- charge = pcharge;
- }
- capa = charge;
- max = 100;
- time = (charge * 274) / current;
- current = -current;
-
- } else
- capa = max = current = voltage = time = 0;
-
- if ((req->reply[0] & 0x02) && (current > 0))
- bat_flags |= PMU_BATT_CHARGING;
- if (req->reply[0] & 0x04) /* CHECK THIS ONE */
- bat_flags |= PMU_BATT_PRESENT;
-
- pmu_batteries[pmu_cur_battery].flags = bat_flags;
- pmu_batteries[pmu_cur_battery].charge = capa;
- pmu_batteries[pmu_cur_battery].max_charge = max;
- pmu_batteries[pmu_cur_battery].current = current;
- pmu_batteries[pmu_cur_battery].voltage = voltage;
- pmu_batteries[pmu_cur_battery].time_remaining = time;
-}
-#endif /* NEW_OHARE_CODE */
-
- static void __pmac
-done_battery_state_comet(struct adb_request* req)
-{
/* format:
* [0] : flags
* 0x01 : AC indicator
@@ -718,57 +602,62 @@ done_battery_state_comet(struct adb_request* req)
* [6][7] : pcharge
* --tkoba
*/
+ unsigned int bat_flags = PMU_BATT_TYPE_HOOPER;
+ long pcharge, charge, vb, vmax, lmax;
+ long vmax_charging, vmax_charged;
+ long current, voltage, time, max;
+ int mb = pmac_call_feature(PMAC_FTR_GET_MB_INFO,
+ NULL, PMAC_MB_INFO_MODEL, 0);
- unsigned int bat_flags = 0;
- int current = 0;
- unsigned int max = 100;
- unsigned int charge, voltage, time;
- int lrange[] = { 0, 600, 750, 900, 1000, 1080,
- 1180, 1250, 1300, 1340, 1360,
- 1390, 1420, 1440, 1470, 1490,
- 1520, 1550, 1580, 1610, 1650,
- 1700
- };
-
if (req->reply[0] & 0x01)
pmu_power_flags |= PMU_PWR_AC_PRESENT;
else
pmu_power_flags &= ~PMU_PWR_AC_PRESENT;
+
+ if (mb == PMAC_TYPE_COMET) {
+ vmax_charged = 189;
+ vmax_charging = 213;
+ lmax = 6500;
+ } else {
+ vmax_charged = 330;
+ vmax_charging = 330;
+ lmax = 6500;
+ }
+ vmax = vmax_charged;
- if (req->reply[0] & 0x04) { /* battery exist */
- int vb, i;
+ /* If battery installed */
+ if (req->reply[0] & 0x04) {
bat_flags |= PMU_BATT_PRESENT;
+ if (req->reply[0] & 0x02)
+ bat_flags |= PMU_BATT_CHARGING;
vb = (req->reply[1] << 8) | req->reply[2];
- voltage = ((vb * 2650) + 726650)/100;
- vb *= 10;
+ voltage = (vb * 265 + 72665) / 10;
current = req->reply[5];
- if ((req->reply[0] & 0x01) == 0 && (current > 200))
- vb += ((current - 200) * 3); /* vb = 500<->1800 */
- else if (req->reply[0] & 0x02)
- vb = ((vb - 800) * 1700/13)/100; /* in charging vb = 1300<->2130 */
-
- if (req->reply[0] & 0x20) { /* full charged */
- charge = max;
- } else {
- if (lrange[21] < vb)
- charge = max;
- else {
- if (vb < lrange[1])
- charge = 0;
- else {
- for (i=21; vb < lrange[i]; --i);
- charge = (i * 100)/21;
- }
- }
- if (charge > max) charge = max;
+ if ((req->reply[0] & 0x01) == 0) {
+ if (current > 200)
+ vb += ((current - 200) * 15)/100;
+ } else if (req->reply[0] & 0x02) {
+ vb = (vb * 97) / 100;
+ vmax = vmax_charging;
+ }
+ charge = (100 * vb) / vmax;
+ if (req->reply[0] & 0x40) {
+ pcharge = (req->reply[6] << 8) + req->reply[7];
+ if (pcharge > lmax)
+ pcharge = lmax;
+ pcharge *= 100;
+ pcharge = 100 - pcharge / lmax;
+ if (pcharge < charge)
+ charge = pcharge;
}
- time = (charge * 72);
+ if (current > 0)
+ time = (charge * 16440) / current;
+ else
+ time = 0;
+ max = 100;
current = -current;
} else
- max = current = voltage = time = 0;
-
- if (req->reply[0] & 0x02)
- bat_flags |= PMU_BATT_CHARGING;
+ charge = max = current = voltage = time = 0;
pmu_batteries[pmu_cur_battery].flags = bat_flags;
pmu_batteries[pmu_cur_battery].charge = charge;
@@ -800,7 +689,7 @@ done_battery_state_smart(struct adb_request* req)
* [8][9] : voltage
*/
- unsigned int bat_flags = 0;
+ unsigned int bat_flags = PMU_BATT_TYPE_SMART;
int current;
unsigned int capa, max, voltage;
@@ -858,24 +747,17 @@ query_battery_state(void)
{
if (!batt_req.complete)
return;
- if (pmu_kind == PMU_OHARE_BASED) {
- int mb = pmac_call_feature(PMAC_FTR_GET_MB_INFO,
- NULL, PMAC_MB_INFO_MODEL, 0);
-
- if (mb == PMAC_TYPE_COMET)
- pmu_request(&batt_req, done_battery_state_comet,
- 1, PMU_BATTERY_STATE);
- else
- pmu_request(&batt_req, done_battery_state_ohare,
- 1, PMU_BATTERY_STATE);
- } else
+ if (pmu_kind == PMU_OHARE_BASED)
+ pmu_request(&batt_req, done_battery_state_ohare,
+ 1, PMU_BATTERY_STATE);
+ else
pmu_request(&batt_req, done_battery_state_smart,
2, PMU_SMART_BATTERY_STATE, pmu_cur_battery+1);
}
#endif /* CONFIG_PMAC_PBOOK */
-static int
+static int __pmac
proc_get_info(char *page, char **start, off_t off,
int count, int *eof, void *data)
{
@@ -893,7 +775,7 @@ proc_get_info(char *page, char **start, off_t off,
}
#ifdef CONFIG_PMAC_PBOOK
-static int
+static int __pmac
proc_get_batt(char *page, char **start, off_t off,
int count, int *eof, void *data)
{
@@ -918,7 +800,7 @@ proc_get_batt(char *page, char **start, off_t off,
}
#endif /* CONFIG_PMAC_PBOOK */
-static int
+static int __pmac
proc_read_options(char *page, char **start, off_t off,
int count, int *eof, void *data)
{
@@ -932,7 +814,7 @@ proc_read_options(char *page, char **start, off_t off,
return p - page;
}
-static int
+static int __pmac
proc_write_options(struct file *file, const char *buffer,
unsigned long count, void *data)
{
@@ -972,7 +854,7 @@ proc_write_options(struct file *file, const char *buffer,
#ifdef CONFIG_ADB
/* Send an ADB command */
-static int __openfirmware
+static int __pmac
pmu_send_request(struct adb_request *req, int sync)
{
int i, ret;
@@ -1052,7 +934,7 @@ pmu_send_request(struct adb_request *req, int sync)
}
/* Enable/disable autopolling */
-static int __openfirmware
+static int __pmac
pmu_adb_autopoll(int devs)
{
struct adb_request req;
@@ -1075,7 +957,7 @@ pmu_adb_autopoll(int devs)
}
/* Reset the ADB bus */
-static int __openfirmware
+static int __pmac
pmu_adb_reset_bus(void)
{
struct adb_request req;
@@ -1137,7 +1019,7 @@ pmu_request(struct adb_request *req, void (*done)(struct adb_request *),
return pmu_queue_request(req);
}
-int __openfirmware
+int __pmac
pmu_queue_request(struct adb_request *req)
{
unsigned long flags;
@@ -1229,7 +1111,7 @@ pmu_done(struct adb_request *req)
(*done)(req);
}
-static void __openfirmware
+static void __pmac
pmu_start()
{
struct adb_request *req;
@@ -1342,7 +1224,7 @@ pmu_resume(void)
}
/* Interrupt data could be the result data from an ADB cmd */
-static void __openfirmware
+static void __pmac
pmu_handle_data(unsigned char *data, int len, struct pt_regs *regs)
{
asleep = 0;
@@ -1417,7 +1299,7 @@ pmu_handle_data(unsigned char *data, int len, struct pt_regs *regs)
}
}
-static struct adb_request* __openfirmware
+static struct adb_request* __pmac
pmu_sr_intr(struct pt_regs *regs)
{
struct adb_request *req;
@@ -1511,7 +1393,7 @@ pmu_sr_intr(struct pt_regs *regs)
return NULL;
}
-static void __openfirmware
+static void __pmac
via_pmu_interrupt(int irq, void *arg, struct pt_regs *regs)
{
unsigned long flags;
@@ -1561,10 +1443,10 @@ recheck:
wait_for_ack();
send_byte(PMU_INT_ACK);
adb_int_pending = 0;
-no_free_slot:
} else if (current_req)
pmu_start();
}
+no_free_slot:
/* Mark the oldest buffer for flushing */
if (int_data_state[!int_data_last] == int_data_ready) {
int_data_state[!int_data_last] = int_data_flush;
@@ -1593,7 +1475,7 @@ no_free_slot:
}
}
-static void __openfirmware
+static void __pmac
gpio1_interrupt(int irq, void *arg, struct pt_regs *regs)
{
if ((in_8(gpio_reg + 0x9) & 0x02) == 0) {
@@ -1603,7 +1485,7 @@ gpio1_interrupt(int irq, void *arg, struct pt_regs *regs)
}
#ifdef CONFIG_PMAC_BACKLIGHT
-static int backlight_to_bright[] = {
+static int backlight_to_bright[] __pmacdata = {
0x7f, 0x46, 0x42, 0x3e, 0x3a, 0x36, 0x32, 0x2e,
0x2a, 0x26, 0x22, 0x1e, 0x1a, 0x16, 0x12, 0x0e
};
@@ -1649,7 +1531,7 @@ pmu_set_backlight_level(int level, void* data)
}
#endif /* CONFIG_PMAC_BACKLIGHT */
-void __openfirmware
+void __pmac
pmu_enable_irled(int on)
{
struct adb_request req;
@@ -1665,7 +1547,7 @@ pmu_enable_irled(int on)
pmu_poll();
}
-void __openfirmware
+void __pmac
pmu_restart(void)
{
struct adb_request req;
@@ -1688,7 +1570,7 @@ pmu_restart(void)
;
}
-void __openfirmware
+void __pmac
pmu_shutdown(void)
{
struct adb_request req;
@@ -1723,7 +1605,7 @@ pmu_present(void)
static LIST_HEAD(sleep_notifiers);
#ifdef CONFIG_PM
-static int
+static int __pmac
generic_notify_sleep(struct pmu_sleep_notifier *self, int when)
{
switch (when) {
@@ -1765,7 +1647,7 @@ pmu_unregister_sleep_notifier(struct pmu_sleep_notifier* n)
}
/* Sleep is broadcast last-to-first */
-static int
+static int __pmac
broadcast_sleep(int when, int fallback)
{
int ret = PBOOK_SLEEP_OK;
@@ -1790,7 +1672,7 @@ broadcast_sleep(int when, int fallback)
}
/* Wake is broadcast first-to-last */
-static int
+static int __pmac
broadcast_wake(void)
{
int ret = PBOOK_SLEEP_OK;
@@ -1821,7 +1703,7 @@ static struct pci_save {
} *pbook_pci_saves;
static int pbook_npci_saves;
-static void __openfirmware
+static void __pmac
pbook_alloc_pci_save(void)
{
int npci;
@@ -1838,7 +1720,7 @@ pbook_alloc_pci_save(void)
pbook_npci_saves = npci;
}
-static void __openfirmware
+static void __pmac
pbook_free_pci_save(void)
{
if (pbook_pci_saves == NULL)
@@ -1848,7 +1730,7 @@ pbook_free_pci_save(void)
pbook_npci_saves = 0;
}
-static void __openfirmware
+static void __pmac
pbook_pci_save(void)
{
struct pci_save *ps = pbook_pci_saves;
@@ -1879,7 +1761,7 @@ pbook_pci_save(void)
* during boot, it will be in the pci dev list. If it's disabled at this point
* (and it will probably be), then you can't access it's config space.
*/
-static void __openfirmware
+static void __pmac
pbook_pci_restore(void)
{
u16 cmd;
@@ -1927,7 +1809,7 @@ pbook_pci_restore(void)
#ifdef DEBUG_SLEEP
/* N.B. This doesn't work on the 3400 */
-void
+void __pmac
pmu_blink(int n)
{
struct adb_request req;
@@ -1966,8 +1848,10 @@ pmu_blink(int n)
* Put the powerbook to sleep.
*/
-static u32 save_via[8];
-static void save_via_state(void)
+static u32 save_via[8] __pmacdata;
+
+static void __pmac
+save_via_state(void)
{
save_via[0] = in_8(&via[ANH]);
save_via[1] = in_8(&via[DIRA]);
@@ -1978,7 +1862,8 @@ static void save_via_state(void)
save_via[6] = in_8(&via[T1CL]);
save_via[7] = in_8(&via[T1CH]);
}
-static void restore_via_state(void)
+static void __pmac
+restore_via_state(void)
{
out_8(&via[ANH], save_via[0]);
out_8(&via[DIRA], save_via[1]);
@@ -1993,15 +1878,6 @@ static void restore_via_state(void)
out_8(&via[IER], IER_SET | SR_INT | CB1_INT);
}
-static inline void wakeup_decrementer(void)
-{
- set_dec(tb_ticks_per_jiffy);
- /* No currently-supported powerbook has a 601,
- * so use get_tbl, not native
- */
- last_jiffy_stamp(0) = tb_last_stamp = get_tbl();
-}
-
extern int sys_sync(void);
#define GRACKLE_PM (1<<7)
@@ -2009,7 +1885,8 @@ extern int sys_sync(void);
#define GRACKLE_NAP (1<<4)
#define GRACKLE_SLEEP (1<<3)
-int __openfirmware powerbook_sleep_G3(void)
+int __pmac
+powerbook_sleep_G3(void)
{
unsigned long save_l2cr;
unsigned short pmcr1;
@@ -2152,7 +2029,8 @@ int __openfirmware powerbook_sleep_G3(void)
return 0;
}
-int __openfirmware powerbook_sleep_Core99(void)
+static int __pmac
+powerbook_sleep_Core99(void)
{
unsigned long save_l2cr;
unsigned long save_l3cr;
@@ -2322,7 +2200,8 @@ int __openfirmware powerbook_sleep_Core99(void)
#define PB3400_MEM_CTRL 0xf8000000
#define PB3400_MEM_CTRL_SLEEP 0x70
-int __openfirmware powerbook_sleep_3400(void)
+static int __pmac
+powerbook_sleep_3400(void)
{
int ret, i, x;
unsigned int hid0;
@@ -2463,9 +2342,10 @@ struct pmu_private {
};
static LIST_HEAD(all_pmu_pvt);
-static spinlock_t all_pvt_lock = SPIN_LOCK_UNLOCKED;
+static spinlock_t all_pvt_lock __pmacdata = SPIN_LOCK_UNLOCKED;
-static void pmu_pass_intr(unsigned char *data, int len)
+static void __pmac
+pmu_pass_intr(unsigned char *data, int len)
{
struct pmu_private *pp;
struct list_head *list;
@@ -2493,7 +2373,8 @@ static void pmu_pass_intr(unsigned char *data, int len)
spin_unlock_irqrestore(&all_pvt_lock, flags);
}
-static int __openfirmware pmu_open(struct inode *inode, struct file *file)
+static int __pmac
+pmu_open(struct inode *inode, struct file *file)
{
struct pmu_private *pp;
unsigned long flags;
@@ -2514,7 +2395,8 @@ static int __openfirmware pmu_open(struct inode *inode, struct file *file)
return 0;
}
-static ssize_t __openfirmware pmu_read(struct file *file, char *buf,
+static ssize_t __pmac
+pmu_read(struct file *file, char *buf,
size_t count, loff_t *ppos)
{
struct pmu_private *pp = file->private_data;
@@ -2566,13 +2448,15 @@ static ssize_t __openfirmware pmu_read(struct file *file, char *buf,
return ret;
}
-static ssize_t __openfirmware pmu_write(struct file *file, const char *buf,
+static ssize_t __pmac
+pmu_write(struct file *file, const char *buf,
size_t count, loff_t *ppos)
{
return 0;
}
-static unsigned int pmu_fpoll(struct file *filp, poll_table *wait)
+static unsigned int __pmac
+pmu_fpoll(struct file *filp, poll_table *wait)
{
struct pmu_private *pp = filp->private_data;
unsigned int mask = 0;
@@ -2588,7 +2472,8 @@ static unsigned int pmu_fpoll(struct file *filp, poll_table *wait)
return mask;
}
-static int pmu_release(struct inode *inode, struct file *file)
+static int __pmac
+pmu_release(struct inode *inode, struct file *file)
{
struct pmu_private *pp = file->private_data;
unsigned long flags;
@@ -2613,7 +2498,8 @@ static int pmu_release(struct inode *inode, struct file *file)
}
/* Note: removed __openfirmware here since it causes link errors */
-static int pmu_ioctl(struct inode * inode, struct file *filp,
+static int __pmac
+pmu_ioctl(struct inode * inode, struct file *filp,
u_int cmd, u_long arg)
{
struct pmu_private *pp = filp->private_data;
@@ -2687,7 +2573,7 @@ static int pmu_ioctl(struct inode * inode, struct file *filp,
return -EINVAL;
}
-static struct file_operations pmu_device_fops = {
+static struct file_operations pmu_device_fops __pmacdata = {
.read = pmu_read,
.write = pmu_write,
.poll = pmu_fpoll,
@@ -2696,7 +2582,7 @@ static struct file_operations pmu_device_fops = {
.release = pmu_release,
};
-static struct miscdevice pmu_device = {
+static struct miscdevice pmu_device __pmacdata = {
PMU_MINOR, "pmu", &pmu_device_fops
};
@@ -2710,7 +2596,8 @@ void pmu_device_init(void)
#endif /* CONFIG_PMAC_PBOOK */
#ifdef DEBUG_SLEEP
-static inline void polled_handshake(volatile unsigned char *via)
+static inline void __pmac
+polled_handshake(volatile unsigned char *via)
{
via[B] &= ~TREQ; eieio();
while ((via[B] & TACK) != 0)
@@ -2720,14 +2607,16 @@ static inline void polled_handshake(volatile unsigned char *via)
;
}
-static inline void polled_send_byte(volatile unsigned char *via, int x)
+static inline void __pmac
+polled_send_byte(volatile unsigned char *via, int x)
{
via[ACR] |= SR_OUT | SR_EXT; eieio();
via[SR] = x; eieio();
polled_handshake(via);
}
-static inline int polled_recv_byte(volatile unsigned char *via)
+static inline int __pmac
+polled_recv_byte(volatile unsigned char *via)
{
int x;
@@ -2738,7 +2627,7 @@ static inline int polled_recv_byte(volatile unsigned char *via)
return x;
}
-int
+int __pmac
pmu_polled_request(struct adb_request *req)
{
unsigned long flags;