Lines Matching +full:misc +full:- +full:latch

1 // SPDX-License-Identifier: GPL-2.0
9 * to the keyboard and mouse, as well as the non-volatile RAM
13 * Copyright (C) 2001-2002 Benjamin Herrenschmidt
14 * Copyright (C) 2006-2007 Johannes Berg
17 * - Cleanup atomically disabling reply to PMU events after
73 #include "via-pmu-event.h"
83 /* VIA registers - spaced 0x200 bytes apart */
85 #define B 0 /* B-side data */
86 #define A RS /* A-side data */
87 #define DIRB (2*RS) /* B-side direction (1=output) */
88 #define DIRA (3*RS) /* A-side direction (1=output) */
89 #define T1CL (4*RS) /* Timer 1 ctr/latch (low 8 bits) */
91 #define T1LL (6*RS) /* Timer 1 latch (low 8 bits) */
92 #define T1LH (7*RS) /* Timer 1 latch (high 8 bits) */
93 #define T2CL (8*RS) /* Timer 2 ctr/latch (low 8 bits) */
100 #define ANH (15*RS) /* A-side data, no handshake */
162 static int gpio_irq_enabled = -1;
237 * - the number of data bytes to be sent with the command, or -1
239 * - the number of response bytes which the PMU will return, or
240 * -1 if it will send a length byte.
244 /*00*/ {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
245 /*08*/ {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
246 /*10*/ { 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
247 /*18*/ { 0, 1},{ 0, 1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{ 0, 0},
248 /*20*/ {-1, 0},{ 0, 0},{ 2, 0},{ 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},
249 /*28*/ { 0,-1},{ 0,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{ 0,-1},
250 /*30*/ { 4, 0},{20, 0},{-1, 0},{ 3, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
251 /*38*/ { 0, 4},{ 0,20},{ 2,-1},{ 2, 1},{ 3,-1},{-1,-1},{-1,-1},{ 4, 0},
252 /*40*/ { 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
253 /*48*/ { 0, 1},{ 0, 1},{-1,-1},{ 1, 0},{ 1, 0},{-1,-1},{-1,-1},{-1,-1},
254 /*50*/ { 1, 0},{ 0, 0},{ 2, 0},{ 2, 0},{-1, 0},{ 1, 0},{ 3, 0},{ 1, 0},
255 /*58*/ { 0, 1},{ 1, 0},{ 0, 2},{ 0, 2},{ 0,-1},{-1,-1},{-1,-1},{-1,-1},
256 /*60*/ { 2, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
257 /*68*/ { 0, 3},{ 0, 3},{ 0, 2},{ 0, 8},{ 0,-1},{ 0,-1},{-1,-1},{-1,-1},
258 /*70*/ { 1, 0},{ 1, 0},{ 1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
259 /*78*/ { 0,-1},{ 0,-1},{-1,-1},{-1,-1},{-1,-1},{ 5, 1},{ 4, 1},{ 4, 1},
260 /*80*/ { 4, 0},{-1, 0},{ 0, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
261 /*88*/ { 0, 5},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
262 /*90*/ { 1, 0},{ 2, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
263 /*98*/ { 0, 1},{ 0, 1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
264 /*a0*/ { 2, 0},{ 2, 0},{ 2, 0},{ 4, 0},{-1, 0},{ 0, 0},{-1, 0},{-1, 0},
265 /*a8*/ { 1, 1},{ 1, 0},{ 3, 0},{ 2, 0},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
266 /*b0*/ {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
267 /*b8*/ {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
268 /*c0*/ {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
269 /*c8*/ {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
270 /*d0*/ { 0, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
271 /*d8*/ { 1, 1},{ 1, 1},{-1,-1},{-1,-1},{ 0, 1},{ 0,-1},{-1,-1},{-1,-1},
272 /*e0*/ {-1, 0},{ 4, 0},{ 0, 1},{-1, 0},{-1, 0},{ 4, 0},{-1, 0},{-1, 0},
273 /*e8*/ { 3,-1},{-1,-1},{ 0, 1},{-1,-1},{ 0,-1},{-1,-1},{-1,-1},{ 0, 0},
274 /*f0*/ {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},
275 /*f8*/ {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
294 vias = of_find_node_by_name(NULL, "via-pmu"); in find_via_pmu()
300 printk(KERN_ERR "via-pmu: No \"reg\" property !\n"); in find_via_pmu()
305 printk(KERN_ERR "via-pmu: Can't translate address !\n"); in find_via_pmu()
318 if (of_node_name_eq(vias->parent, "ohare") || in find_via_pmu()
319 of_device_is_compatible(vias->parent, "ohare")) in find_via_pmu()
321 else if (of_device_is_compatible(vias->parent, "paddington")) in find_via_pmu()
323 else if (of_device_is_compatible(vias->parent, "heathrow")) in find_via_pmu()
325 else if (of_device_is_compatible(vias->parent, "Keylargo") in find_via_pmu()
326 || of_device_is_compatible(vias->parent, "K2-Keylargo")) { in find_via_pmu()
351 printk(KERN_ERR "via-pmu: Can't find GPIO reg !\n"); in find_via_pmu()
359 printk(KERN_ERR "via-pmu: Can't map address !\n"); in find_via_pmu()
387 if (macintosh_config->adb_type != MAC_ADB_PB2) in find_via_pmu()
415 return pmu_state == uninitialized ? -ENODEV : 0; in pmu_probe()
420 return pmu_state == uninitialized ? -ENODEV : 0; in pmu_init()
436 return -ENODEV; in via_pmu_start()
443 printk(KERN_ERR "via-pmu: can't map interrupt\n"); in via_pmu_start()
444 return -ENODEV; in via_pmu_start()
451 "VIA-PMU", (void *)0)) { in via_pmu_start()
452 printk(KERN_ERR "via-pmu: can't request irq %d\n", irq); in via_pmu_start()
453 return -ENODEV; in via_pmu_start()
457 gpio_node = of_find_node_by_name(NULL, "extint-gpio1"); in via_pmu_start()
460 "pmu-interrupt"); in via_pmu_start()
479 "VIA-PMU-SR", NULL)) { in via_pmu_start()
481 return -ENODEV; in via_pmu_start()
484 "VIA-PMU-CL", NULL)) { in via_pmu_start()
487 return -ENODEV; in via_pmu_start()
516 return -ENODEV; in via_pmu_dev_init()
540 of_find_node_by_name(NULL, "power-mgt"); in via_pmu_dev_init()
543 prim_info = of_get_property(prim, "prim-info", NULL); in via_pmu_dev_init()
593 if (--timeout < 0) { in init_pmu()
605 if (--timeout < 0) { in init_pmu()
636 printk(KERN_INFO "via-pmu: Server Mode is %s\n", in init_pmu()
677 * is inspired from the implementation in gkrellm-pmu
699 * --tkoba in done_battery_state_ohare()
708 if (req->reply[0] & 0x01) in done_battery_state_ohare()
725 if (req->reply[0] & 0x04) { in done_battery_state_ohare()
727 if (req->reply[0] & 0x02) in done_battery_state_ohare()
729 vb = (req->reply[1] << 8) | req->reply[2]; in done_battery_state_ohare()
731 amperage = req->reply[5]; in done_battery_state_ohare()
732 if ((req->reply[0] & 0x01) == 0) { in done_battery_state_ohare()
734 vb += ((amperage - 200) * 15)/100; in done_battery_state_ohare()
735 } else if (req->reply[0] & 0x02) { in done_battery_state_ohare()
740 if (req->reply[0] & 0x40) { in done_battery_state_ohare()
741 pcharge = (req->reply[6] << 8) + req->reply[7]; in done_battery_state_ohare()
745 pcharge = 100 - pcharge / lmax; in done_battery_state_ohare()
754 amperage = -amperage; in done_battery_state_ohare()
795 if (req->reply[1] & 0x01) in done_battery_state_smart()
803 if (req->reply[1] & 0x04) { in done_battery_state_smart()
805 switch(req->reply[0]) { in done_battery_state_smart()
807 case 4: capa = req->reply[2]; in done_battery_state_smart()
808 max = req->reply[3]; in done_battery_state_smart()
809 amperage = *((signed char *)&req->reply[4]); in done_battery_state_smart()
810 voltage = req->reply[5]; in done_battery_state_smart()
812 case 5: capa = (req->reply[2] << 8) | req->reply[3]; in done_battery_state_smart()
813 max = (req->reply[4] << 8) | req->reply[5]; in done_battery_state_smart()
814 amperage = *((signed short *)&req->reply[6]); in done_battery_state_smart()
815 voltage = (req->reply[8] << 8) | req->reply[9]; in done_battery_state_smart()
819 "len: %d, %4ph\n", req->reply_len, in done_battery_state_smart()
820 req->reply); in done_battery_state_smart()
825 if ((req->reply[1] & 0x01) && (amperage > 0)) in done_battery_state_smart()
834 if ((req->reply[1] & 0x01) && (amperage > 0)) in done_battery_state_smart()
836 = ((max-capa) * 3600) / amperage; in done_battery_state_smart()
839 = (capa * 3600) / (-amperage); in done_battery_state_smart()
878 "PC-Card eject button", in pmu_irqstats_proc_show()
900 long batnum = (long)m->private; in pmu_battery_proc_show()
916 pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0) in pmu_options_proc_show()
938 return -EINVAL; in pmu_options_proc_write()
942 return -EFAULT; in pmu_options_proc_write()
955 return -EINVAL; in pmu_options_proc_write()
961 pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0) in pmu_options_proc_write()
989 req->complete = 1; in pmu_send_request()
990 return -ENXIO; in pmu_send_request()
993 ret = -EINVAL; in pmu_send_request()
995 switch (req->data[0]) { in pmu_send_request()
997 for (i = 0; i < req->nbytes - 1; ++i) in pmu_send_request()
998 req->data[i] = req->data[i+1]; in pmu_send_request()
999 --req->nbytes; in pmu_send_request()
1000 if (pmu_data_len[req->data[0]][1] != 0) { in pmu_send_request()
1001 req->reply[0] = ADB_RET_OK; in pmu_send_request()
1002 req->reply_len = 1; in pmu_send_request()
1004 req->reply_len = 0; in pmu_send_request()
1008 switch (req->data[1]) { in pmu_send_request()
1010 if (req->nbytes != 2) in pmu_send_request()
1012 req->data[0] = PMU_READ_RTC; in pmu_send_request()
1013 req->nbytes = 1; in pmu_send_request()
1014 req->reply_len = 3; in pmu_send_request()
1015 req->reply[0] = CUDA_PACKET; in pmu_send_request()
1016 req->reply[1] = 0; in pmu_send_request()
1017 req->reply[2] = CUDA_GET_TIME; in pmu_send_request()
1021 if (req->nbytes != 6) in pmu_send_request()
1023 req->data[0] = PMU_SET_RTC; in pmu_send_request()
1024 req->nbytes = 5; in pmu_send_request()
1026 req->data[i] = req->data[i+1]; in pmu_send_request()
1027 req->reply_len = 3; in pmu_send_request()
1028 req->reply[0] = CUDA_PACKET; in pmu_send_request()
1029 req->reply[1] = 0; in pmu_send_request()
1030 req->reply[2] = CUDA_SET_TIME; in pmu_send_request()
1037 return -ENXIO; in pmu_send_request()
1038 for (i = req->nbytes - 1; i > 1; --i) in pmu_send_request()
1039 req->data[i+2] = req->data[i]; in pmu_send_request()
1040 req->data[3] = req->nbytes - 2; in pmu_send_request()
1041 req->data[2] = pmu_adb_flags; in pmu_send_request()
1042 /*req->data[1] = req->data[1];*/ in pmu_send_request()
1043 req->data[0] = PMU_ADB_CMD; in pmu_send_request()
1044 req->nbytes += 2; in pmu_send_request()
1045 req->reply_expected = 1; in pmu_send_request()
1046 req->reply_len = 0; in pmu_send_request()
1051 req->complete = 1; in pmu_send_request()
1056 while (!req->complete) in pmu_send_request()
1083 return -ENXIO; in pmu_adb_autopoll()
1096 return -ENXIO; in pmu_adb_reset_bus()
1112 return -EIO; in pmu_adb_reset_bus()
1132 return -ENXIO; in pmu_request()
1136 req->complete = 1; in pmu_request()
1137 return -EINVAL; in pmu_request()
1139 req->nbytes = nbytes; in pmu_request()
1140 req->done = done; in pmu_request()
1143 req->data[i] = va_arg(list, int); in pmu_request()
1145 req->reply_len = 0; in pmu_request()
1146 req->reply_expected = 0; in pmu_request()
1157 req->complete = 1; in pmu_queue_request()
1158 return -ENXIO; in pmu_queue_request()
1160 if (req->nbytes <= 0) { in pmu_queue_request()
1161 req->complete = 1; in pmu_queue_request()
1164 nsend = pmu_data_len[req->data[0]][0]; in pmu_queue_request()
1165 if (nsend >= 0 && req->nbytes != nsend + 1) { in pmu_queue_request()
1166 req->complete = 1; in pmu_queue_request()
1167 return -EINVAL; in pmu_queue_request()
1170 req->next = NULL; in pmu_queue_request()
1171 req->sent = 0; in pmu_queue_request()
1172 req->complete = 0; in pmu_queue_request()
1176 last_req->next = req; in pmu_queue_request()
1197 if (--timeout < 0) { in wait_for_ack()
1228 void (*done)(struct adb_request *) = req->done; in pmu_done()
1230 req->complete = 1; in pmu_done()
1232 * struct request will survive to setting req->complete to 1 in pmu_done()
1247 || (/*req->reply_expected && */req_awaiting_reply)) in pmu_start()
1252 data_len = pmu_data_len[req->data[0]][0]; in pmu_start()
1259 send_byte(req->data[0]); in pmu_start()
1292 while((pmu_state != idle && pmu_state != locked) || !req->complete) in pmu_wait_complete()
1341 pmu_suspended--; in pmu_resume()
1388 idx = ffs(ints) - 1; in pmu_handle_data()
1395 * on the Pismo. Still investigating... --BenH in pmu_handle_data()
1407 req->reply_len = 0; in pmu_handle_data()
1409 memcpy(req->reply, data + 1, len - 1); in pmu_handle_data()
1410 req->reply_len = len - 1; in pmu_handle_data()
1433 adb_input(data+1, len-1, 1); in pmu_handle_data()
1450 if ((--query_batt_timer) == 0) { in pmu_handle_data()
1501 data_len = req->nbytes - 1; in pmu_sr_intr()
1506 send_byte(req->data[data_index++]); in pmu_sr_intr()
1509 req->sent = 1; in pmu_sr_intr()
1510 data_len = pmu_data_len[req->data[0]][1]; in pmu_sr_intr()
1513 current_req = req->next; in pmu_sr_intr()
1514 if (req->reply_expected) in pmu_sr_intr()
1521 reply_ptr = req->reply + req->reply_len; in pmu_sr_intr()
1528 data_len = -1; in pmu_sr_intr()
1540 if (data_len == -1) { in pmu_sr_intr()
1563 current_req = req->next; in pmu_sr_intr()
1564 req->reply_len += data_index; in pmu_sr_intr()
1565 if (req->data[0] == PMU_SLEEP || req->data[0] == PMU_CPU_SPEED) in pmu_sr_intr()
1586 int int_data = -1; in via_pmu_interrupt()
1666 --disable_poll; in via_pmu_interrupt()
1681 int_data = -1; in via_pmu_interrupt()
1736 /* Offset between Unix time (1970-based) and Mac time (1904-based) */
1751 return (time64_t)now - RTC_OFFSET; in pmu_get_time()
1762 return -ENXIO; in pmu_set_rtc_time()
1879 return -ENODEV; in powerbook_sleep_grackle()
1889 save_l2cr = _get_L2CR(); /* (returns -1 if not available) */ in powerbook_sleep_grackle()
1908 /* Call low-level ASM sleep handler */ in powerbook_sleep_grackle()
1930 switch_mmu_context(NULL, current->active_mm, NULL); in powerbook_sleep_grackle()
1953 if (pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) < 0) { in powerbook_sleep_Core99()
1955 return -ENOSYS; in powerbook_sleep_Core99()
1959 return -EAGAIN; in powerbook_sleep_Core99()
1975 save_l3cr = _get_L3CR(); /* (returns -1 if not available) */ in powerbook_sleep_Core99()
1976 save_l2cr = _get_L2CR(); /* (returns -1 if not available) */ in powerbook_sleep_Core99()
1993 /* Call low-level ASM sleep handler */ in powerbook_sleep_Core99()
2019 switch_mmu_context(NULL, current->active_mm, NULL); in powerbook_sleep_Core99()
2056 return -ENOMEM; in powerbook_sleep_3400()
2061 for (i = 0x403f; i >= 0x4000; --i) { in powerbook_sleep_3400()
2131 if (len > sizeof(pp->rb_buf[0].data)) in pmu_pass_intr()
2132 len = sizeof(pp->rb_buf[0].data); in pmu_pass_intr()
2134 for (list = &all_pmu_pvt; (list = list->next) != &all_pmu_pvt; ) { in pmu_pass_intr()
2136 spin_lock(&pp->lock); in pmu_pass_intr()
2137 i = pp->rb_put + 1; in pmu_pass_intr()
2140 if (i != pp->rb_get) { in pmu_pass_intr()
2141 struct rb_entry *rp = &pp->rb_buf[pp->rb_put]; in pmu_pass_intr()
2142 rp->len = len; in pmu_pass_intr()
2143 memcpy(rp->data, data, len); in pmu_pass_intr()
2144 pp->rb_put = i; in pmu_pass_intr()
2145 wake_up_interruptible(&pp->wait); in pmu_pass_intr()
2147 spin_unlock(&pp->lock); in pmu_pass_intr()
2160 return -ENOMEM; in pmu_open()
2161 pp->rb_get = pp->rb_put = 0; in pmu_open()
2162 spin_lock_init(&pp->lock); in pmu_open()
2163 init_waitqueue_head(&pp->wait); in pmu_open()
2167 pp->backlight_locker = 0; in pmu_open()
2169 list_add(&pp->list, &all_pmu_pvt); in pmu_open()
2171 file->private_data = pp; in pmu_open()
2180 struct pmu_private *pp = file->private_data; in pmu_read()
2186 return -EINVAL; in pmu_read()
2188 spin_lock_irqsave(&pp->lock, flags); in pmu_read()
2189 add_wait_queue(&pp->wait, &wait); in pmu_read()
2193 ret = -EAGAIN; in pmu_read()
2194 if (pp->rb_get != pp->rb_put) { in pmu_read()
2195 int i = pp->rb_get; in pmu_read()
2196 struct rb_entry *rp = &pp->rb_buf[i]; in pmu_read()
2197 ret = rp->len; in pmu_read()
2198 spin_unlock_irqrestore(&pp->lock, flags); in pmu_read()
2201 if (ret > 0 && copy_to_user(buf, rp->data, ret)) in pmu_read()
2202 ret = -EFAULT; in pmu_read()
2205 spin_lock_irqsave(&pp->lock, flags); in pmu_read()
2206 pp->rb_get = i; in pmu_read()
2210 if (file->f_flags & O_NONBLOCK) in pmu_read()
2212 ret = -ERESTARTSYS; in pmu_read()
2215 spin_unlock_irqrestore(&pp->lock, flags); in pmu_read()
2217 spin_lock_irqsave(&pp->lock, flags); in pmu_read()
2220 remove_wait_queue(&pp->wait, &wait); in pmu_read()
2221 spin_unlock_irqrestore(&pp->lock, flags); in pmu_read()
2236 struct pmu_private *pp = filp->private_data; in pmu_fpoll()
2242 poll_wait(filp, &pp->wait, wait); in pmu_fpoll()
2243 spin_lock_irqsave(&pp->lock, flags); in pmu_fpoll()
2244 if (pp->rb_get != pp->rb_put) in pmu_fpoll()
2246 spin_unlock_irqrestore(&pp->lock, flags); in pmu_fpoll()
2253 struct pmu_private *pp = file->private_data; in pmu_release()
2257 file->private_data = NULL; in pmu_release()
2259 list_del(&pp->list); in pmu_release()
2263 if (pp->backlight_locker) in pmu_release()
2310 return -ENOSYS; in powerbook_sleep()
2337 && (pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, -1) >= 0); in pmu_sleep_valid()
2363 int error = -EINVAL; in pmu_ioctl()
2369 return -EACCES; in pmu_ioctl()
2372 if (pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, -1) < 0) in pmu_ioctl()
2403 struct pmu_private *pp = filp->private_data; in pmu_ioctl()
2405 if (pp->backlight_locker) in pmu_ioctl()
2408 pp->backlight_locker = 1; in pmu_ioctl()
2468 return -ENOIOCTLCMD; in compat_pmu_ioctl()
2496 printk(KERN_ERR "via-pmu: cannot register misc device.\n"); in pmu_device_init()
2540 req->complete = 1; in pmu_polled_request()
2541 c = req->data[0]; in pmu_polled_request()
2543 if (l >= 0 && req->nbytes != l + 1) in pmu_polled_request()
2544 return -EINVAL; in pmu_polled_request()
2554 l = req->nbytes - 1; in pmu_polled_request()
2558 polled_send_byte(req->data[i]); in pmu_polled_request()
2564 req->reply[i + req->reply_len] = polled_recv_byte(); in pmu_polled_request()
2566 if (req->done) in pmu_polled_request()
2567 (*req->done)(req); in pmu_polled_request()
2580 for (; n > 0; --n) { in pmu_blink()