via-pmu.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:70k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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