Lines Matching refs:hp_sdc

111 static hp_i8042_sdc	hp_sdc;	/* All driver state is kept in here. */  variable
119 write_lock_irqsave(&hp_sdc.ibf_lock, flags); in hp_sdc_status_in8()
120 status = sdc_readb(hp_sdc.status_io); in hp_sdc_status_in8()
122 hp_sdc.ibf = 0; in hp_sdc_status_in8()
123 write_unlock_irqrestore(&hp_sdc.ibf_lock, flags); in hp_sdc_status_in8()
130 return sdc_readb(hp_sdc.data_io); in hp_sdc_data_in8()
137 write_lock_irqsave(&hp_sdc.ibf_lock, flags); in hp_sdc_status_out8()
138 hp_sdc.ibf = 1; in hp_sdc_status_out8()
140 hp_sdc.wi = 0xff; in hp_sdc_status_out8()
141 sdc_writeb(val, hp_sdc.status_io); in hp_sdc_status_out8()
142 write_unlock_irqrestore(&hp_sdc.ibf_lock, flags); in hp_sdc_status_out8()
149 write_lock_irqsave(&hp_sdc.ibf_lock, flags); in hp_sdc_data_out8()
150 hp_sdc.ibf = 1; in hp_sdc_data_out8()
151 sdc_writeb(val, hp_sdc.data_io); in hp_sdc_data_out8()
152 write_unlock_irqrestore(&hp_sdc.ibf_lock, flags); in hp_sdc_data_out8()
164 lock = &hp_sdc.ibf_lock; in hp_sdc_spin_ibf()
167 if (!hp_sdc.ibf) { in hp_sdc_spin_ibf()
173 while (sdc_readb(hp_sdc.status_io) & HP_SDC_STATUS_IBF) in hp_sdc_spin_ibf()
175 hp_sdc.ibf = 0; in hp_sdc_spin_ibf()
185 read_lock(&hp_sdc.rtq_lock); in hp_sdc_take()
186 if (hp_sdc.rcurr < 0) { in hp_sdc_take()
187 read_unlock(&hp_sdc.rtq_lock); in hp_sdc_take()
190 curr = hp_sdc.tq[hp_sdc.rcurr]; in hp_sdc_take()
191 read_unlock(&hp_sdc.rtq_lock); in hp_sdc_take()
195 hp_sdc.rqty -= 2; in hp_sdc_take()
196 do_gettimeofday(&hp_sdc.rtv); in hp_sdc_take()
198 if (hp_sdc.rqty <= 0) { in hp_sdc_take()
211 write_lock(&hp_sdc.rtq_lock); in hp_sdc_take()
212 hp_sdc.rcurr = -1; in hp_sdc_take()
213 hp_sdc.rqty = 0; in hp_sdc_take()
214 write_unlock(&hp_sdc.rtq_lock); in hp_sdc_take()
215 tasklet_schedule(&hp_sdc.task); in hp_sdc_take()
238 read_lock(&hp_sdc.hook_lock); in hp_sdc_isr()
239 if (hp_sdc.timer != NULL) in hp_sdc_isr()
240 hp_sdc.timer(irq, dev_id, status, data); in hp_sdc_isr()
241 read_unlock(&hp_sdc.hook_lock); in hp_sdc_isr()
250 read_lock(&hp_sdc.hook_lock); in hp_sdc_isr()
251 if (hp_sdc.hil != NULL) in hp_sdc_isr()
252 hp_sdc.hil(irq, dev_id, status, data); in hp_sdc_isr()
253 read_unlock(&hp_sdc.hook_lock); in hp_sdc_isr()
257 read_lock(&hp_sdc.hook_lock); in hp_sdc_isr()
258 if (hp_sdc.pup != NULL) in hp_sdc_isr()
259 hp_sdc.pup(irq, dev_id, status, data); in hp_sdc_isr()
262 read_unlock(&hp_sdc.hook_lock); in hp_sdc_isr()
266 read_lock(&hp_sdc.hook_lock); in hp_sdc_isr()
267 if (hp_sdc.cooked != NULL) in hp_sdc_isr()
268 hp_sdc.cooked(irq, dev_id, status, data); in hp_sdc_isr()
269 read_unlock(&hp_sdc.hook_lock); in hp_sdc_isr()
286 read_lock(&hp_sdc.hook_lock); in hp_sdc_nmisr()
287 if (hp_sdc.timer != NULL) in hp_sdc_nmisr()
288 hp_sdc.timer(irq, dev_id, status, 0); in hp_sdc_nmisr()
289 read_unlock(&hp_sdc.hook_lock); in hp_sdc_nmisr()
306 write_lock_irq(&hp_sdc.rtq_lock); in hp_sdc_tasklet()
308 if (hp_sdc.rcurr >= 0) { in hp_sdc_tasklet()
312 if (tv.tv_sec > hp_sdc.rtv.tv_sec) in hp_sdc_tasklet()
315 if (tv.tv_usec - hp_sdc.rtv.tv_usec > HP_SDC_MAX_REG_DELAY) { in hp_sdc_tasklet()
319 curr = hp_sdc.tq[hp_sdc.rcurr]; in hp_sdc_tasklet()
325 (int)(tv.tv_usec - hp_sdc.rtv.tv_usec)); in hp_sdc_tasklet()
326 curr->idx += hp_sdc.rqty; in hp_sdc_tasklet()
327 hp_sdc.rqty = 0; in hp_sdc_tasklet()
344 hp_sdc.rcurr = -1; in hp_sdc_tasklet()
347 write_unlock_irq(&hp_sdc.rtq_lock); in hp_sdc_tasklet()
359 write_lock(&hp_sdc.lock); in hp_sdc_put()
363 if (hp_sdc.ibf) { in hp_sdc_put()
365 if (hp_sdc.ibf) in hp_sdc_put()
371 if (hp_sdc.wcurr < 0) in hp_sdc_put()
372 hp_sdc.wcurr = 0; in hp_sdc_put()
373 read_lock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
374 if (hp_sdc.rcurr == hp_sdc.wcurr) in hp_sdc_put()
375 hp_sdc.wcurr++; in hp_sdc_put()
376 read_unlock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
377 if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) in hp_sdc_put()
378 hp_sdc.wcurr = 0; in hp_sdc_put()
379 curridx = hp_sdc.wcurr; in hp_sdc_put()
381 if (hp_sdc.tq[curridx] != NULL) in hp_sdc_put()
384 while (++curridx != hp_sdc.wcurr) { in hp_sdc_put()
389 read_lock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
390 if (hp_sdc.rcurr == curridx) { in hp_sdc_put()
391 read_unlock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
394 read_unlock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
395 if (hp_sdc.tq[curridx] != NULL) in hp_sdc_put()
398 if (curridx == hp_sdc.wcurr) { /* There's nothing queued to do. */ in hp_sdc_put()
401 hp_sdc.wcurr = curridx; in hp_sdc_put()
406 if (hp_sdc.set_im) { in hp_sdc_put()
407 hp_sdc_status_out8(hp_sdc.im | HP_SDC_CMD_SET_IM); in hp_sdc_put()
408 hp_sdc.set_im = 0; in hp_sdc_put()
412 if (hp_sdc.wcurr == -1) in hp_sdc_put()
415 curr = hp_sdc.tq[curridx]; in hp_sdc_put()
419 hp_sdc.tq[curridx] = NULL; in hp_sdc_put()
421 hp_sdc.wcurr++; in hp_sdc_put()
422 if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) in hp_sdc_put()
423 hp_sdc.wcurr = 0; in hp_sdc_put()
433 hp_sdc.tq[curridx] = NULL; in hp_sdc_put()
435 hp_sdc.wcurr++; in hp_sdc_put()
436 if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) in hp_sdc_put()
437 hp_sdc.wcurr = 0; in hp_sdc_put()
489 w7[0] = (mask & 1) ? curr->seq[++idx] : hp_sdc.r7[0]; in hp_sdc_put()
490 w7[1] = (mask & 2) ? curr->seq[++idx] : hp_sdc.r7[1]; in hp_sdc_put()
491 w7[2] = (mask & 4) ? curr->seq[++idx] : hp_sdc.r7[2]; in hp_sdc_put()
492 w7[3] = (mask & 8) ? curr->seq[++idx] : hp_sdc.r7[3]; in hp_sdc_put()
494 if (hp_sdc.wi > 0x73 || hp_sdc.wi < 0x70 || in hp_sdc_put()
495 w7[hp_sdc.wi - 0x70] == hp_sdc.r7[hp_sdc.wi - 0x70]) { in hp_sdc_put()
499 while (i < 4 && w7[i] == hp_sdc.r7[i]) in hp_sdc_put()
504 hp_sdc.wi = 0x70 + i; in hp_sdc_put()
517 hp_sdc_data_out8(w7[hp_sdc.wi - 0x70]); in hp_sdc_put()
518 hp_sdc.r7[hp_sdc.wi - 0x70] = w7[hp_sdc.wi - 0x70]; in hp_sdc_put()
519 hp_sdc.wi++; /* write index register autoincrements */ in hp_sdc_put()
523 while ((i < 4) && w7[i] == hp_sdc.r7[i]) in hp_sdc_put()
536 read_lock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
537 if (hp_sdc.rcurr >= 0) { in hp_sdc_put()
538 read_unlock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
541 read_unlock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
553 hp_sdc.rqty = curr->seq[curr->idx]; in hp_sdc_put()
554 do_gettimeofday(&hp_sdc.rtv); in hp_sdc_put()
557 write_lock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
558 hp_sdc.rcurr = curridx; in hp_sdc_put()
559 write_unlock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
576 hp_sdc.tq[curridx] = NULL; in hp_sdc_put()
582 hp_sdc.wcurr++; in hp_sdc_put()
583 if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) in hp_sdc_put()
584 hp_sdc.wcurr = 0; in hp_sdc_put()
589 if (!hp_sdc.ibf && limit++ < 20) in hp_sdc_put()
593 if (hp_sdc.wcurr >= 0) in hp_sdc_put()
594 tasklet_schedule(&hp_sdc.task); in hp_sdc_put()
595 write_unlock(&hp_sdc.lock); in hp_sdc_put()
612 if (hp_sdc.tq[i] == this) in __hp_sdc_enqueue_transaction()
620 if (hp_sdc.tq[i] == NULL) { in __hp_sdc_enqueue_transaction()
621 hp_sdc.tq[i] = this; in __hp_sdc_enqueue_transaction()
622 tasklet_schedule(&hp_sdc.task); in __hp_sdc_enqueue_transaction()
638 write_lock_irqsave(&hp_sdc.lock, flags); in hp_sdc_enqueue_transaction()
640 write_unlock_irqrestore(&hp_sdc.lock,flags); in hp_sdc_enqueue_transaction()
650 write_lock_irqsave(&hp_sdc.lock, flags); in hp_sdc_dequeue_transaction()
655 if (hp_sdc.tq[i] == this) in hp_sdc_dequeue_transaction()
656 hp_sdc.tq[i] = NULL; in hp_sdc_dequeue_transaction()
658 write_unlock_irqrestore(&hp_sdc.lock, flags); in hp_sdc_dequeue_transaction()
667 if (callback == NULL || hp_sdc.dev == NULL) in hp_sdc_request_timer_irq()
670 write_lock_irq(&hp_sdc.hook_lock); in hp_sdc_request_timer_irq()
671 if (hp_sdc.timer != NULL) { in hp_sdc_request_timer_irq()
672 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_request_timer_irq()
676 hp_sdc.timer = callback; in hp_sdc_request_timer_irq()
678 hp_sdc.im &= ~HP_SDC_IM_FH; in hp_sdc_request_timer_irq()
679 hp_sdc.im &= ~HP_SDC_IM_PT; in hp_sdc_request_timer_irq()
680 hp_sdc.im &= ~HP_SDC_IM_TIMERS; in hp_sdc_request_timer_irq()
681 hp_sdc.set_im = 1; in hp_sdc_request_timer_irq()
682 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_request_timer_irq()
684 tasklet_schedule(&hp_sdc.task); in hp_sdc_request_timer_irq()
691 if (callback == NULL || hp_sdc.dev == NULL) in hp_sdc_request_hil_irq()
694 write_lock_irq(&hp_sdc.hook_lock); in hp_sdc_request_hil_irq()
695 if (hp_sdc.hil != NULL) { in hp_sdc_request_hil_irq()
696 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_request_hil_irq()
700 hp_sdc.hil = callback; in hp_sdc_request_hil_irq()
701 hp_sdc.im &= ~(HP_SDC_IM_HIL | HP_SDC_IM_RESET); in hp_sdc_request_hil_irq()
702 hp_sdc.set_im = 1; in hp_sdc_request_hil_irq()
703 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_request_hil_irq()
705 tasklet_schedule(&hp_sdc.task); in hp_sdc_request_hil_irq()
712 if (callback == NULL || hp_sdc.dev == NULL) in hp_sdc_request_cooked_irq()
715 write_lock_irq(&hp_sdc.hook_lock); in hp_sdc_request_cooked_irq()
716 if (hp_sdc.cooked != NULL) { in hp_sdc_request_cooked_irq()
717 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_request_cooked_irq()
722 hp_sdc.cooked = callback; in hp_sdc_request_cooked_irq()
723 hp_sdc.im &= ~(HP_SDC_IM_HIL | HP_SDC_IM_RESET); in hp_sdc_request_cooked_irq()
724 hp_sdc.set_im = 1; in hp_sdc_request_cooked_irq()
725 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_request_cooked_irq()
727 tasklet_schedule(&hp_sdc.task); in hp_sdc_request_cooked_irq()
734 write_lock_irq(&hp_sdc.hook_lock); in hp_sdc_release_timer_irq()
735 if ((callback != hp_sdc.timer) || in hp_sdc_release_timer_irq()
736 (hp_sdc.timer == NULL)) { in hp_sdc_release_timer_irq()
737 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_release_timer_irq()
742 hp_sdc.timer = NULL; in hp_sdc_release_timer_irq()
743 hp_sdc.im |= HP_SDC_IM_TIMERS; in hp_sdc_release_timer_irq()
744 hp_sdc.im |= HP_SDC_IM_FH; in hp_sdc_release_timer_irq()
745 hp_sdc.im |= HP_SDC_IM_PT; in hp_sdc_release_timer_irq()
746 hp_sdc.set_im = 1; in hp_sdc_release_timer_irq()
747 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_release_timer_irq()
748 tasklet_schedule(&hp_sdc.task); in hp_sdc_release_timer_irq()
755 write_lock_irq(&hp_sdc.hook_lock); in hp_sdc_release_hil_irq()
756 if ((callback != hp_sdc.hil) || in hp_sdc_release_hil_irq()
757 (hp_sdc.hil == NULL)) { in hp_sdc_release_hil_irq()
758 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_release_hil_irq()
762 hp_sdc.hil = NULL; in hp_sdc_release_hil_irq()
764 if(hp_sdc.cooked == NULL) { in hp_sdc_release_hil_irq()
765 hp_sdc.im |= (HP_SDC_IM_HIL | HP_SDC_IM_RESET); in hp_sdc_release_hil_irq()
766 hp_sdc.set_im = 1; in hp_sdc_release_hil_irq()
768 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_release_hil_irq()
769 tasklet_schedule(&hp_sdc.task); in hp_sdc_release_hil_irq()
776 write_lock_irq(&hp_sdc.hook_lock); in hp_sdc_release_cooked_irq()
777 if ((callback != hp_sdc.cooked) || in hp_sdc_release_cooked_irq()
778 (hp_sdc.cooked == NULL)) { in hp_sdc_release_cooked_irq()
779 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_release_cooked_irq()
783 hp_sdc.cooked = NULL; in hp_sdc_release_cooked_irq()
785 if(hp_sdc.hil == NULL) { in hp_sdc_release_cooked_irq()
786 hp_sdc.im |= (HP_SDC_IM_HIL | HP_SDC_IM_RESET); in hp_sdc_release_cooked_irq()
787 hp_sdc.set_im = 1; in hp_sdc_release_cooked_irq()
789 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_release_cooked_irq()
790 tasklet_schedule(&hp_sdc.task); in hp_sdc_release_cooked_irq()
799 tasklet_schedule(&hp_sdc.task); in hp_sdc_kicker()
801 mod_timer(&hp_sdc.kicker, jiffies + HZ); in hp_sdc_kicker()
838 rwlock_init(&hp_sdc.lock); in hp_sdc_init()
839 rwlock_init(&hp_sdc.ibf_lock); in hp_sdc_init()
840 rwlock_init(&hp_sdc.rtq_lock); in hp_sdc_init()
841 rwlock_init(&hp_sdc.hook_lock); in hp_sdc_init()
843 hp_sdc.timer = NULL; in hp_sdc_init()
844 hp_sdc.hil = NULL; in hp_sdc_init()
845 hp_sdc.pup = NULL; in hp_sdc_init()
846 hp_sdc.cooked = NULL; in hp_sdc_init()
847 hp_sdc.im = HP_SDC_IM_MASK; /* Mask maskable irqs */ in hp_sdc_init()
848 hp_sdc.set_im = 1; in hp_sdc_init()
849 hp_sdc.wi = 0xff; in hp_sdc_init()
850 hp_sdc.r7[0] = 0xff; in hp_sdc_init()
851 hp_sdc.r7[1] = 0xff; in hp_sdc_init()
852 hp_sdc.r7[2] = 0xff; in hp_sdc_init()
853 hp_sdc.r7[3] = 0xff; in hp_sdc_init()
854 hp_sdc.ibf = 1; in hp_sdc_init()
856 memset(&hp_sdc.tq, 0, sizeof(hp_sdc.tq)); in hp_sdc_init()
858 hp_sdc.wcurr = -1; in hp_sdc_init()
859 hp_sdc.rcurr = -1; in hp_sdc_init()
860 hp_sdc.rqty = 0; in hp_sdc_init()
862 hp_sdc.dev_err = -ENODEV; in hp_sdc_init()
865 if (!hp_sdc.base_io) in hp_sdc_init()
869 if (!hp_sdc.irq) in hp_sdc_init()
872 hp_sdc.dev_err = -EBUSY; in hp_sdc_init()
876 if (request_region(hp_sdc.data_io, 2, hp_sdc_driver.name)) in hp_sdc_init()
881 if (request_irq(hp_sdc.irq, &hp_sdc_isr, IRQF_SHARED, in hp_sdc_init()
882 "HP SDC", &hp_sdc)) in hp_sdc_init()
886 if (request_irq(hp_sdc.nmi, &hp_sdc_nmisr, IRQF_SHARED, in hp_sdc_init()
887 "HP SDC NMI", &hp_sdc)) in hp_sdc_init()
891 (void *)hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi); in hp_sdc_init()
896 tasklet_init(&hp_sdc.task, hp_sdc_tasklet, 0); in hp_sdc_init()
912 init_timer(&hp_sdc.kicker); in hp_sdc_init()
913 hp_sdc.kicker.expires = jiffies + HZ; in hp_sdc_init()
914 hp_sdc.kicker.function = &hp_sdc_kicker; in hp_sdc_init()
915 add_timer(&hp_sdc.kicker); in hp_sdc_init()
917 hp_sdc.dev_err = 0; in hp_sdc_init()
920 free_irq(hp_sdc.irq, &hp_sdc); in hp_sdc_init()
922 release_region(hp_sdc.data_io, 2); in hp_sdc_init()
925 errstr, (void *)hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi); in hp_sdc_init()
926 hp_sdc.dev = NULL; in hp_sdc_init()
928 return hp_sdc.dev_err; in hp_sdc_init()
944 if (hp_sdc.dev != NULL) in hp_sdc_init_hppa()
947 hp_sdc.dev = d; in hp_sdc_init_hppa()
948 hp_sdc.irq = d->irq; in hp_sdc_init_hppa()
949 hp_sdc.nmi = d->aux_irq; in hp_sdc_init_hppa()
950 hp_sdc.base_io = d->hpa.start; in hp_sdc_init_hppa()
951 hp_sdc.data_io = d->hpa.start + 0x800; in hp_sdc_init_hppa()
952 hp_sdc.status_io = d->hpa.start + 0x801; in hp_sdc_init_hppa()
971 if (!hp_sdc.dev) in hp_sdc_exit()
974 write_lock_irq(&hp_sdc.lock); in hp_sdc_exit()
978 sdc_writeb(HP_SDC_CMD_SET_IM | HP_SDC_IM_MASK, hp_sdc.status_io); in hp_sdc_exit()
983 free_irq(hp_sdc.nmi, &hp_sdc); in hp_sdc_exit()
984 free_irq(hp_sdc.irq, &hp_sdc); in hp_sdc_exit()
985 write_unlock_irq(&hp_sdc.lock); in hp_sdc_exit()
987 del_timer_sync(&hp_sdc.kicker); in hp_sdc_exit()
989 tasklet_kill(&hp_sdc.task); in hp_sdc_exit()
1013 hp_sdc.dev = NULL; in hp_sdc_register()
1014 hp_sdc.dev_err = 0; in hp_sdc_register()
1024 hp_sdc.irq = 1; in hp_sdc_register()
1025 hp_sdc.nmi = 7; in hp_sdc_register()
1026 hp_sdc.base_io = (unsigned long) 0xf0428000; in hp_sdc_register()
1027 hp_sdc.data_io = (unsigned long) hp_sdc.base_io + 1; in hp_sdc_register()
1028 hp_sdc.status_io = (unsigned long) hp_sdc.base_io + 3; in hp_sdc_register()
1031 if (!get_user(i, (unsigned char *)hp_sdc.data_io)) in hp_sdc_register()
1032 hp_sdc.dev = (void *)1; in hp_sdc_register()
1034 hp_sdc.dev_err = hp_sdc_init(); in hp_sdc_register()
1036 if (hp_sdc.dev == NULL) { in hp_sdc_register()
1038 return hp_sdc.dev_err; in hp_sdc_register()
1066 hp_sdc.r11 = tq_init_seq[4]; in hp_sdc_register()
1067 if (hp_sdc.r11 & HP_SDC_CFG_NEW) { in hp_sdc_register()
1081 hp_sdc.r7e = tq_init_seq[4]; in hp_sdc_register()
1082 HP_SDC_XTD_REV_STRINGS(hp_sdc.r7e & HP_SDC_XTD_REV, str) in hp_sdc_register()
1084 if (hp_sdc.r7e & HP_SDC_XTD_BEEPER) in hp_sdc_register()
1086 if (hp_sdc.r7e & HP_SDC_XTD_BBRTC) in hp_sdc_register()
1104 (hp_sdc.r11 & HP_SDC_CFG_REV) ? "3300" : "2564/3087"); in hp_sdc_register()