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 hp_sdc.rtime = ktime_get(); 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()
311 if (ktime_after(now, ktime_add_us(hp_sdc.rtime, in hp_sdc_tasklet()
316 curr = hp_sdc.tq[hp_sdc.rcurr]; in hp_sdc_tasklet()
322 ktime_us_delta(now, hp_sdc.rtime)); in hp_sdc_tasklet()
323 curr->idx += hp_sdc.rqty; in hp_sdc_tasklet()
324 hp_sdc.rqty = 0; in hp_sdc_tasklet()
341 hp_sdc.rcurr = -1; in hp_sdc_tasklet()
344 write_unlock_irq(&hp_sdc.rtq_lock); in hp_sdc_tasklet()
356 write_lock(&hp_sdc.lock); in hp_sdc_put()
360 if (hp_sdc.ibf) { in hp_sdc_put()
362 if (hp_sdc.ibf) in hp_sdc_put()
368 if (hp_sdc.wcurr < 0) in hp_sdc_put()
369 hp_sdc.wcurr = 0; in hp_sdc_put()
370 read_lock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
371 if (hp_sdc.rcurr == hp_sdc.wcurr) in hp_sdc_put()
372 hp_sdc.wcurr++; in hp_sdc_put()
373 read_unlock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
374 if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) in hp_sdc_put()
375 hp_sdc.wcurr = 0; in hp_sdc_put()
376 curridx = hp_sdc.wcurr; in hp_sdc_put()
378 if (hp_sdc.tq[curridx] != NULL) in hp_sdc_put()
381 while (++curridx != hp_sdc.wcurr) { in hp_sdc_put()
386 read_lock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
387 if (hp_sdc.rcurr == curridx) { in hp_sdc_put()
388 read_unlock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
391 read_unlock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
392 if (hp_sdc.tq[curridx] != NULL) in hp_sdc_put()
395 if (curridx == hp_sdc.wcurr) { /* There's nothing queued to do. */ in hp_sdc_put()
398 hp_sdc.wcurr = curridx; in hp_sdc_put()
403 if (hp_sdc.set_im) { in hp_sdc_put()
404 hp_sdc_status_out8(hp_sdc.im | HP_SDC_CMD_SET_IM); in hp_sdc_put()
405 hp_sdc.set_im = 0; in hp_sdc_put()
409 if (hp_sdc.wcurr == -1) in hp_sdc_put()
412 curr = hp_sdc.tq[curridx]; in hp_sdc_put()
416 hp_sdc.tq[curridx] = NULL; in hp_sdc_put()
418 hp_sdc.wcurr++; in hp_sdc_put()
419 if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) in hp_sdc_put()
420 hp_sdc.wcurr = 0; in hp_sdc_put()
430 hp_sdc.tq[curridx] = NULL; in hp_sdc_put()
432 hp_sdc.wcurr++; in hp_sdc_put()
433 if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) in hp_sdc_put()
434 hp_sdc.wcurr = 0; in hp_sdc_put()
486 w7[0] = (mask & 1) ? curr->seq[++idx] : hp_sdc.r7[0]; in hp_sdc_put()
487 w7[1] = (mask & 2) ? curr->seq[++idx] : hp_sdc.r7[1]; in hp_sdc_put()
488 w7[2] = (mask & 4) ? curr->seq[++idx] : hp_sdc.r7[2]; in hp_sdc_put()
489 w7[3] = (mask & 8) ? curr->seq[++idx] : hp_sdc.r7[3]; in hp_sdc_put()
491 if (hp_sdc.wi > 0x73 || hp_sdc.wi < 0x70 || in hp_sdc_put()
492 w7[hp_sdc.wi - 0x70] == hp_sdc.r7[hp_sdc.wi - 0x70]) { in hp_sdc_put()
496 while (i < 4 && w7[i] == hp_sdc.r7[i]) in hp_sdc_put()
501 hp_sdc.wi = 0x70 + i; in hp_sdc_put()
514 hp_sdc_data_out8(w7[hp_sdc.wi - 0x70]); in hp_sdc_put()
515 hp_sdc.r7[hp_sdc.wi - 0x70] = w7[hp_sdc.wi - 0x70]; in hp_sdc_put()
516 hp_sdc.wi++; /* write index register autoincrements */ in hp_sdc_put()
520 while ((i < 4) && w7[i] == hp_sdc.r7[i]) in hp_sdc_put()
533 read_lock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
534 if (hp_sdc.rcurr >= 0) { in hp_sdc_put()
535 read_unlock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
538 read_unlock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
550 hp_sdc.rqty = curr->seq[curr->idx]; in hp_sdc_put()
551 hp_sdc.rtime = ktime_get(); in hp_sdc_put()
554 write_lock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
555 hp_sdc.rcurr = curridx; in hp_sdc_put()
556 write_unlock_irq(&hp_sdc.rtq_lock); in hp_sdc_put()
573 hp_sdc.tq[curridx] = NULL; in hp_sdc_put()
579 hp_sdc.wcurr++; in hp_sdc_put()
580 if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) in hp_sdc_put()
581 hp_sdc.wcurr = 0; in hp_sdc_put()
586 if (!hp_sdc.ibf && limit++ < 20) in hp_sdc_put()
590 if (hp_sdc.wcurr >= 0) in hp_sdc_put()
591 tasklet_schedule(&hp_sdc.task); in hp_sdc_put()
592 write_unlock(&hp_sdc.lock); in hp_sdc_put()
609 if (hp_sdc.tq[i] == this) in __hp_sdc_enqueue_transaction()
617 if (hp_sdc.tq[i] == NULL) { in __hp_sdc_enqueue_transaction()
618 hp_sdc.tq[i] = this; in __hp_sdc_enqueue_transaction()
619 tasklet_schedule(&hp_sdc.task); in __hp_sdc_enqueue_transaction()
635 write_lock_irqsave(&hp_sdc.lock, flags); in hp_sdc_enqueue_transaction()
637 write_unlock_irqrestore(&hp_sdc.lock,flags); in hp_sdc_enqueue_transaction()
647 write_lock_irqsave(&hp_sdc.lock, flags); in hp_sdc_dequeue_transaction()
652 if (hp_sdc.tq[i] == this) in hp_sdc_dequeue_transaction()
653 hp_sdc.tq[i] = NULL; in hp_sdc_dequeue_transaction()
655 write_unlock_irqrestore(&hp_sdc.lock, flags); in hp_sdc_dequeue_transaction()
664 if (callback == NULL || hp_sdc.dev == NULL) in hp_sdc_request_timer_irq()
667 write_lock_irq(&hp_sdc.hook_lock); in hp_sdc_request_timer_irq()
668 if (hp_sdc.timer != NULL) { in hp_sdc_request_timer_irq()
669 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_request_timer_irq()
673 hp_sdc.timer = callback; in hp_sdc_request_timer_irq()
675 hp_sdc.im &= ~HP_SDC_IM_FH; in hp_sdc_request_timer_irq()
676 hp_sdc.im &= ~HP_SDC_IM_PT; in hp_sdc_request_timer_irq()
677 hp_sdc.im &= ~HP_SDC_IM_TIMERS; in hp_sdc_request_timer_irq()
678 hp_sdc.set_im = 1; in hp_sdc_request_timer_irq()
679 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_request_timer_irq()
681 tasklet_schedule(&hp_sdc.task); in hp_sdc_request_timer_irq()
688 if (callback == NULL || hp_sdc.dev == NULL) in hp_sdc_request_hil_irq()
691 write_lock_irq(&hp_sdc.hook_lock); in hp_sdc_request_hil_irq()
692 if (hp_sdc.hil != NULL) { in hp_sdc_request_hil_irq()
693 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_request_hil_irq()
697 hp_sdc.hil = callback; in hp_sdc_request_hil_irq()
698 hp_sdc.im &= ~(HP_SDC_IM_HIL | HP_SDC_IM_RESET); in hp_sdc_request_hil_irq()
699 hp_sdc.set_im = 1; in hp_sdc_request_hil_irq()
700 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_request_hil_irq()
702 tasklet_schedule(&hp_sdc.task); in hp_sdc_request_hil_irq()
709 if (callback == NULL || hp_sdc.dev == NULL) in hp_sdc_request_cooked_irq()
712 write_lock_irq(&hp_sdc.hook_lock); in hp_sdc_request_cooked_irq()
713 if (hp_sdc.cooked != NULL) { in hp_sdc_request_cooked_irq()
714 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_request_cooked_irq()
719 hp_sdc.cooked = callback; in hp_sdc_request_cooked_irq()
720 hp_sdc.im &= ~(HP_SDC_IM_HIL | HP_SDC_IM_RESET); in hp_sdc_request_cooked_irq()
721 hp_sdc.set_im = 1; in hp_sdc_request_cooked_irq()
722 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_request_cooked_irq()
724 tasklet_schedule(&hp_sdc.task); in hp_sdc_request_cooked_irq()
731 write_lock_irq(&hp_sdc.hook_lock); in hp_sdc_release_timer_irq()
732 if ((callback != hp_sdc.timer) || in hp_sdc_release_timer_irq()
733 (hp_sdc.timer == NULL)) { in hp_sdc_release_timer_irq()
734 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_release_timer_irq()
739 hp_sdc.timer = NULL; in hp_sdc_release_timer_irq()
740 hp_sdc.im |= HP_SDC_IM_TIMERS; in hp_sdc_release_timer_irq()
741 hp_sdc.im |= HP_SDC_IM_FH; in hp_sdc_release_timer_irq()
742 hp_sdc.im |= HP_SDC_IM_PT; in hp_sdc_release_timer_irq()
743 hp_sdc.set_im = 1; in hp_sdc_release_timer_irq()
744 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_release_timer_irq()
745 tasklet_schedule(&hp_sdc.task); in hp_sdc_release_timer_irq()
752 write_lock_irq(&hp_sdc.hook_lock); in hp_sdc_release_hil_irq()
753 if ((callback != hp_sdc.hil) || in hp_sdc_release_hil_irq()
754 (hp_sdc.hil == NULL)) { in hp_sdc_release_hil_irq()
755 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_release_hil_irq()
759 hp_sdc.hil = NULL; in hp_sdc_release_hil_irq()
761 if(hp_sdc.cooked == NULL) { in hp_sdc_release_hil_irq()
762 hp_sdc.im |= (HP_SDC_IM_HIL | HP_SDC_IM_RESET); in hp_sdc_release_hil_irq()
763 hp_sdc.set_im = 1; in hp_sdc_release_hil_irq()
765 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_release_hil_irq()
766 tasklet_schedule(&hp_sdc.task); in hp_sdc_release_hil_irq()
773 write_lock_irq(&hp_sdc.hook_lock); in hp_sdc_release_cooked_irq()
774 if ((callback != hp_sdc.cooked) || in hp_sdc_release_cooked_irq()
775 (hp_sdc.cooked == NULL)) { in hp_sdc_release_cooked_irq()
776 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_release_cooked_irq()
780 hp_sdc.cooked = NULL; in hp_sdc_release_cooked_irq()
782 if(hp_sdc.hil == NULL) { in hp_sdc_release_cooked_irq()
783 hp_sdc.im |= (HP_SDC_IM_HIL | HP_SDC_IM_RESET); in hp_sdc_release_cooked_irq()
784 hp_sdc.set_im = 1; in hp_sdc_release_cooked_irq()
786 write_unlock_irq(&hp_sdc.hook_lock); in hp_sdc_release_cooked_irq()
787 tasklet_schedule(&hp_sdc.task); in hp_sdc_release_cooked_irq()
796 tasklet_schedule(&hp_sdc.task); in hp_sdc_kicker()
798 mod_timer(&hp_sdc.kicker, jiffies + HZ); in hp_sdc_kicker()
835 rwlock_init(&hp_sdc.lock); in hp_sdc_init()
836 rwlock_init(&hp_sdc.ibf_lock); in hp_sdc_init()
837 rwlock_init(&hp_sdc.rtq_lock); in hp_sdc_init()
838 rwlock_init(&hp_sdc.hook_lock); in hp_sdc_init()
840 hp_sdc.timer = NULL; in hp_sdc_init()
841 hp_sdc.hil = NULL; in hp_sdc_init()
842 hp_sdc.pup = NULL; in hp_sdc_init()
843 hp_sdc.cooked = NULL; in hp_sdc_init()
844 hp_sdc.im = HP_SDC_IM_MASK; /* Mask maskable irqs */ in hp_sdc_init()
845 hp_sdc.set_im = 1; in hp_sdc_init()
846 hp_sdc.wi = 0xff; in hp_sdc_init()
847 hp_sdc.r7[0] = 0xff; in hp_sdc_init()
848 hp_sdc.r7[1] = 0xff; in hp_sdc_init()
849 hp_sdc.r7[2] = 0xff; in hp_sdc_init()
850 hp_sdc.r7[3] = 0xff; in hp_sdc_init()
851 hp_sdc.ibf = 1; in hp_sdc_init()
853 memset(&hp_sdc.tq, 0, sizeof(hp_sdc.tq)); in hp_sdc_init()
855 hp_sdc.wcurr = -1; in hp_sdc_init()
856 hp_sdc.rcurr = -1; in hp_sdc_init()
857 hp_sdc.rqty = 0; in hp_sdc_init()
859 hp_sdc.dev_err = -ENODEV; in hp_sdc_init()
862 if (!hp_sdc.base_io) in hp_sdc_init()
866 if (!hp_sdc.irq) in hp_sdc_init()
869 hp_sdc.dev_err = -EBUSY; in hp_sdc_init()
873 if (request_region(hp_sdc.data_io, 2, hp_sdc_driver.name)) in hp_sdc_init()
878 if (request_irq(hp_sdc.irq, &hp_sdc_isr, IRQF_SHARED, in hp_sdc_init()
879 "HP SDC", &hp_sdc)) in hp_sdc_init()
883 if (request_irq(hp_sdc.nmi, &hp_sdc_nmisr, IRQF_SHARED, in hp_sdc_init()
884 "HP SDC NMI", &hp_sdc)) in hp_sdc_init()
888 hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi); in hp_sdc_init()
893 tasklet_init(&hp_sdc.task, hp_sdc_tasklet, 0); in hp_sdc_init()
909 timer_setup(&hp_sdc.kicker, hp_sdc_kicker, 0); in hp_sdc_init()
910 hp_sdc.kicker.expires = jiffies + HZ; in hp_sdc_init()
911 add_timer(&hp_sdc.kicker); in hp_sdc_init()
913 hp_sdc.dev_err = 0; in hp_sdc_init()
916 free_irq(hp_sdc.irq, &hp_sdc); in hp_sdc_init()
918 release_region(hp_sdc.data_io, 2); in hp_sdc_init()
921 errstr, (void *)hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi); in hp_sdc_init()
922 hp_sdc.dev = NULL; in hp_sdc_init()
924 return hp_sdc.dev_err; in hp_sdc_init()
940 if (hp_sdc.dev != NULL) in hp_sdc_init_hppa()
943 hp_sdc.dev = d; in hp_sdc_init_hppa()
944 hp_sdc.irq = d->irq; in hp_sdc_init_hppa()
945 hp_sdc.nmi = d->aux_irq; in hp_sdc_init_hppa()
946 hp_sdc.base_io = d->hpa.start; in hp_sdc_init_hppa()
947 hp_sdc.data_io = d->hpa.start + 0x800; in hp_sdc_init_hppa()
948 hp_sdc.status_io = d->hpa.start + 0x801; in hp_sdc_init_hppa()
967 if (!hp_sdc.dev) in hp_sdc_exit()
970 write_lock_irq(&hp_sdc.lock); in hp_sdc_exit()
974 sdc_writeb(HP_SDC_CMD_SET_IM | HP_SDC_IM_MASK, hp_sdc.status_io); in hp_sdc_exit()
979 free_irq(hp_sdc.nmi, &hp_sdc); in hp_sdc_exit()
980 free_irq(hp_sdc.irq, &hp_sdc); in hp_sdc_exit()
981 write_unlock_irq(&hp_sdc.lock); in hp_sdc_exit()
983 del_timer_sync(&hp_sdc.kicker); in hp_sdc_exit()
985 tasklet_kill(&hp_sdc.task); in hp_sdc_exit()
1008 hp_sdc.dev = NULL; in hp_sdc_register()
1009 hp_sdc.dev_err = 0; in hp_sdc_register()
1019 hp_sdc.irq = 1; in hp_sdc_register()
1020 hp_sdc.nmi = 7; in hp_sdc_register()
1021 hp_sdc.base_io = (unsigned long) 0xf0428000; in hp_sdc_register()
1022 hp_sdc.data_io = (unsigned long) hp_sdc.base_io + 1; in hp_sdc_register()
1023 hp_sdc.status_io = (unsigned long) hp_sdc.base_io + 3; in hp_sdc_register()
1024 if (!copy_from_kernel_nofault(&i, (unsigned char *)hp_sdc.data_io, 1)) in hp_sdc_register()
1025 hp_sdc.dev = (void *)1; in hp_sdc_register()
1026 hp_sdc.dev_err = hp_sdc_init(); in hp_sdc_register()
1028 if (hp_sdc.dev == NULL) { in hp_sdc_register()
1030 return hp_sdc.dev_err; in hp_sdc_register()
1058 hp_sdc.r11 = tq_init_seq[4]; in hp_sdc_register()
1059 if (hp_sdc.r11 & HP_SDC_CFG_NEW) { in hp_sdc_register()
1073 hp_sdc.r7e = tq_init_seq[4]; in hp_sdc_register()
1074 HP_SDC_XTD_REV_STRINGS(hp_sdc.r7e & HP_SDC_XTD_REV, str) in hp_sdc_register()
1076 if (hp_sdc.r7e & HP_SDC_XTD_BEEPER) in hp_sdc_register()
1078 if (hp_sdc.r7e & HP_SDC_XTD_BBRTC) in hp_sdc_register()
1096 (hp_sdc.r11 & HP_SDC_CFG_REV) ? "3300" : "2564/3087"); in hp_sdc_register()