Lines Matching full:data
62 /* CEIR Wake-Up Registers, relative to data->wbase */
69 #define WBCIR_REG_WCEIR_DATA 0x09 /* CEIR Receiver Data */
74 /* CEIR Enhanced Functionality Registers, relative to data->ebase */
81 /* SP3 Banked Registers, relative to data->sbase */
84 #define WBCIR_REG_SP3_RXDATA 0x00 /* FIFO RX data (r) */
85 #define WBCIR_REG_SP3_TXDATA 0x00 /* FIFO TX data (w) */
124 /* RX data bit for WBCIR_REG_SP3_IER and WBCIR_REG_SP3_EIR */
126 /* TX data low bit for WBCIR_REG_SP3_IER and WBCIR_REG_SP3_EIR */
130 /* TX data empty bit for WBCEIR_REG_SP3_IER and WBCIR_REG_SP3_EIR */
134 /* RX data available bit for WBCIR_REG_SP3_LSR */
136 /* RX data overrun error bit for WBCIR_REG_SP3_LSR */
142 /* TX data underrun error bit for WBCIR_REG_SP3_ASCR */
196 /* Per-device data */
267 wbcir_select_bank(struct wbcir_data *data, enum wbcir_bank bank) in wbcir_select_bank() argument
269 outb(bank, data->sbase + WBCIR_REG_SP3_BSR); in wbcir_select_bank()
273 wbcir_set_irqmask(struct wbcir_data *data, u8 irqmask) in wbcir_set_irqmask() argument
275 if (data->irqmask == irqmask) in wbcir_set_irqmask()
278 wbcir_select_bank(data, WBCIR_BANK_0); in wbcir_set_irqmask()
279 outb(irqmask, data->sbase + WBCIR_REG_SP3_IER); in wbcir_set_irqmask()
280 data->irqmask = irqmask; in wbcir_set_irqmask()
286 struct wbcir_data *data = container_of(led_cdev, in wbcir_led_brightness_get() local
290 if (inb(data->ebase + WBCIR_REG_ECEIR_CTS) & WBCIR_LED_ENABLE) in wbcir_led_brightness_get()
300 struct wbcir_data *data = container_of(led_cdev, in wbcir_led_brightness_set() local
304 wbcir_set_bits(data->ebase + WBCIR_REG_ECEIR_CTS, in wbcir_led_brightness_set()
337 struct wbcir_data *data = dev->priv; in wbcir_idle_rx() local
339 if (!idle && data->rxstate == WBCIR_RXSTATE_INACTIVE) { in wbcir_idle_rx()
340 data->rxstate = WBCIR_RXSTATE_ACTIVE; in wbcir_idle_rx()
341 led_trigger_event(data->rxtrigger, LED_FULL); in wbcir_idle_rx()
344 if (idle && data->rxstate != WBCIR_RXSTATE_INACTIVE) in wbcir_idle_rx()
346 outb(WBCIR_RX_DISABLE, data->sbase + WBCIR_REG_SP3_ASCR); in wbcir_idle_rx()
350 wbcir_irq_rx(struct wbcir_data *data, struct pnp_dev *device) in wbcir_irq_rx() argument
356 while (inb(data->sbase + WBCIR_REG_SP3_LSR) & WBCIR_RX_AVAIL) { in wbcir_irq_rx()
357 irdata = inb(data->sbase + WBCIR_REG_SP3_RXDATA); in wbcir_irq_rx()
358 if (data->rxstate == WBCIR_RXSTATE_ERROR) in wbcir_irq_rx()
362 ir_raw_event_store_with_filter(data->dev, &rawir); in wbcir_irq_rx()
366 if (data->dev->idle) { in wbcir_irq_rx()
367 led_trigger_event(data->rxtrigger, LED_OFF); in wbcir_irq_rx()
368 data->rxstate = WBCIR_RXSTATE_INACTIVE; in wbcir_irq_rx()
371 ir_raw_event_handle(data->dev); in wbcir_irq_rx()
375 wbcir_irq_tx(struct wbcir_data *data) in wbcir_irq_tx() argument
382 if (!data->txbuf) in wbcir_irq_tx()
385 switch (data->txstate) { in wbcir_irq_tx()
389 led_trigger_event(data->txtrigger, LED_FULL); in wbcir_irq_tx()
403 * TX data is run-length coded in bytes: YXXXXXXX in wbcir_irq_tx()
407 for (used = 0; used < space && data->txoff != data->txlen; used++) { in wbcir_irq_tx()
408 if (data->txbuf[data->txoff] == 0) { in wbcir_irq_tx()
409 data->txoff++; in wbcir_irq_tx()
412 byte = min((u32)0x80, data->txbuf[data->txoff]); in wbcir_irq_tx()
413 data->txbuf[data->txoff] -= byte; in wbcir_irq_tx()
415 byte |= (data->txoff % 2 ? 0x80 : 0x00); /* pulse/space */ in wbcir_irq_tx()
419 while (data->txbuf[data->txoff] == 0 && data->txoff != data->txlen) in wbcir_irq_tx()
420 data->txoff++; in wbcir_irq_tx()
424 if (data->txstate == WBCIR_TXSTATE_ERROR) in wbcir_irq_tx()
426 outb(WBCIR_TX_UNDERRUN, data->sbase + WBCIR_REG_SP3_ASCR); in wbcir_irq_tx()
428 data->txstate = WBCIR_TXSTATE_DONE; in wbcir_irq_tx()
429 wbcir_set_irqmask(data, WBCIR_IRQ_RX | WBCIR_IRQ_ERR); in wbcir_irq_tx()
430 led_trigger_event(data->txtrigger, LED_OFF); in wbcir_irq_tx()
431 wake_up(&data->txwaitq); in wbcir_irq_tx()
432 } else if (data->txoff == data->txlen) { in wbcir_irq_tx()
434 outsb(data->sbase + WBCIR_REG_SP3_TXDATA, bytes, used - 1); in wbcir_irq_tx()
435 outb(WBCIR_TX_EOT, data->sbase + WBCIR_REG_SP3_ASCR); in wbcir_irq_tx()
436 outb(bytes[used - 1], data->sbase + WBCIR_REG_SP3_TXDATA); in wbcir_irq_tx()
437 wbcir_set_irqmask(data, WBCIR_IRQ_RX | WBCIR_IRQ_ERR | in wbcir_irq_tx()
440 /* More data to follow... */ in wbcir_irq_tx()
441 outsb(data->sbase + WBCIR_REG_SP3_RXDATA, bytes, used); in wbcir_irq_tx()
442 if (data->txstate == WBCIR_TXSTATE_INACTIVE) { in wbcir_irq_tx()
443 wbcir_set_irqmask(data, WBCIR_IRQ_RX | WBCIR_IRQ_ERR | in wbcir_irq_tx()
445 data->txstate = WBCIR_TXSTATE_ACTIVE; in wbcir_irq_tx()
454 struct wbcir_data *data = pnp_get_drvdata(device); in wbcir_irq_handler() local
458 spin_lock_irqsave(&data->spinlock, flags); in wbcir_irq_handler()
459 wbcir_select_bank(data, WBCIR_BANK_0); in wbcir_irq_handler()
460 status = inb(data->sbase + WBCIR_REG_SP3_EIR); in wbcir_irq_handler()
461 status &= data->irqmask; in wbcir_irq_handler()
464 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_irq_handler()
470 if (inb(data->sbase + WBCIR_REG_SP3_LSR) & WBCIR_RX_OVERRUN) { in wbcir_irq_handler()
471 data->rxstate = WBCIR_RXSTATE_ERROR; in wbcir_irq_handler()
472 ir_raw_event_reset(data->dev); in wbcir_irq_handler()
476 if (inb(data->sbase + WBCIR_REG_SP3_ASCR) & WBCIR_TX_UNDERRUN) in wbcir_irq_handler()
477 data->txstate = WBCIR_TXSTATE_ERROR; in wbcir_irq_handler()
481 wbcir_irq_rx(data, device); in wbcir_irq_handler()
484 wbcir_irq_tx(data); in wbcir_irq_handler()
486 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_irq_handler()
499 struct wbcir_data *data = dev->priv; in wbcir_txcarrier() local
525 spin_lock_irqsave(&data->spinlock, flags); in wbcir_txcarrier()
526 if (data->txstate != WBCIR_TXSTATE_INACTIVE) { in wbcir_txcarrier()
527 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_txcarrier()
531 if (data->txcarrier != freq) { in wbcir_txcarrier()
532 wbcir_select_bank(data, WBCIR_BANK_7); in wbcir_txcarrier()
533 wbcir_set_bits(data->sbase + WBCIR_REG_SP3_IRTXMC, val, 0x1F); in wbcir_txcarrier()
534 data->txcarrier = freq; in wbcir_txcarrier()
537 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_txcarrier()
544 struct wbcir_data *data = dev->priv; in wbcir_txmask() local
566 spin_lock_irqsave(&data->spinlock, flags); in wbcir_txmask()
567 if (data->txstate != WBCIR_TXSTATE_INACTIVE) { in wbcir_txmask()
568 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_txmask()
572 if (data->txmask != mask) { in wbcir_txmask()
573 wbcir_set_bits(data->ebase + WBCIR_REG_ECEIR_CTS, val, 0x0c); in wbcir_txmask()
574 data->txmask = mask; in wbcir_txmask()
577 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_txmask()
584 struct wbcir_data *data = dev->priv; in wbcir_tx() local
589 spin_lock_irqsave(&data->spinlock, flags); in wbcir_tx()
590 if (data->txstate != WBCIR_TXSTATE_INACTIVE) { in wbcir_tx()
591 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_tx()
600 data->txbuf = buf; in wbcir_tx()
601 data->txlen = count; in wbcir_tx()
602 data->txoff = 0; in wbcir_tx()
603 wbcir_irq_tx(data); in wbcir_tx()
606 while (data->txstate == WBCIR_TXSTATE_ACTIVE) { in wbcir_tx()
607 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_tx()
608 wait_event(data->txwaitq, data->txstate != WBCIR_TXSTATE_ACTIVE); in wbcir_tx()
609 spin_lock_irqsave(&data->spinlock, flags); in wbcir_tx()
613 if (data->txstate == WBCIR_TXSTATE_ERROR) in wbcir_tx()
615 data->txstate = WBCIR_TXSTATE_INACTIVE; in wbcir_tx()
616 data->txbuf = NULL; in wbcir_tx()
617 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_tx()
632 struct wbcir_data *data = pnp_get_drvdata(device); in wbcir_shutdown() local
773 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_INDEX, in wbcir_shutdown()
776 outsb(data->wbase + WBCIR_REG_WCEIR_DATA, match, 11); in wbcir_shutdown()
777 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_INDEX, in wbcir_shutdown()
780 outsb(data->wbase + WBCIR_REG_WCEIR_DATA, mask, 11); in wbcir_shutdown()
783 outb(rc6_csl, data->wbase + WBCIR_REG_WCEIR_CSL); in wbcir_shutdown()
786 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_STS, 0x17, 0x17); in wbcir_shutdown()
789 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_EV_EN, 0x01, 0x07); in wbcir_shutdown()
792 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_CTL, 0x01, 0x01); in wbcir_shutdown()
796 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_EV_EN, 0x00, 0x07); in wbcir_shutdown()
799 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_CTL, 0x00, 0x01); in wbcir_shutdown()
808 wbcir_set_irqmask(data, WBCIR_IRQ_NONE); in wbcir_shutdown()
809 disable_irq(data->irq); in wbcir_shutdown()
812 led_trigger_event(data->rxtrigger, LED_OFF); in wbcir_shutdown()
813 led_trigger_event(data->txtrigger, LED_OFF); in wbcir_shutdown()
824 wbcir_init_hw(struct wbcir_data *data) in wbcir_init_hw() argument
829 wbcir_set_irqmask(data, WBCIR_IRQ_NONE); in wbcir_init_hw()
835 outb(tmp, data->wbase + WBCIR_REG_WCEIR_CTL); in wbcir_init_hw()
838 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_STS, 0x17, 0x17); in wbcir_init_hw()
841 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_EV_EN, 0x00, 0x07); in wbcir_init_hw()
844 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_CFG1, 0x4A, 0x7F); in wbcir_init_hw()
848 outb(0x04, data->ebase + WBCIR_REG_ECEIR_CCTL); in wbcir_init_hw()
850 outb(0x00, data->ebase + WBCIR_REG_ECEIR_CCTL); in wbcir_init_hw()
856 outb(0x10, data->ebase + WBCIR_REG_ECEIR_CTS); in wbcir_init_hw()
857 data->txmask = 0x1; in wbcir_init_hw()
860 wbcir_select_bank(data, WBCIR_BANK_2); in wbcir_init_hw()
861 outb(WBCIR_EXT_ENABLE, data->sbase + WBCIR_REG_SP3_EXCR1); in wbcir_init_hw()
864 * Configure baud generator, IR data will be sampled at in wbcir_init_hw()
875 outb(0x30, data->sbase + WBCIR_REG_SP3_EXCR2); in wbcir_init_hw()
878 outb(0x0F, data->sbase + WBCIR_REG_SP3_BGDL); in wbcir_init_hw()
879 outb(0x00, data->sbase + WBCIR_REG_SP3_BGDH); in wbcir_init_hw()
882 wbcir_select_bank(data, WBCIR_BANK_0); in wbcir_init_hw()
883 outb(0xC0, data->sbase + WBCIR_REG_SP3_MCR); in wbcir_init_hw()
884 inb(data->sbase + WBCIR_REG_SP3_LSR); /* Clear LSR */ in wbcir_init_hw()
885 inb(data->sbase + WBCIR_REG_SP3_MSR); /* Clear MSR */ in wbcir_init_hw()
888 wbcir_select_bank(data, WBCIR_BANK_7); in wbcir_init_hw()
889 outb(0x90, data->sbase + WBCIR_REG_SP3_RCCFG); in wbcir_init_hw()
892 wbcir_select_bank(data, WBCIR_BANK_4); in wbcir_init_hw()
893 outb(0x00, data->sbase + WBCIR_REG_SP3_IRCR1); in wbcir_init_hw()
896 wbcir_select_bank(data, WBCIR_BANK_5); in wbcir_init_hw()
897 outb(txandrx ? 0x03 : 0x02, data->sbase + WBCIR_REG_SP3_IRCR2); in wbcir_init_hw()
900 wbcir_select_bank(data, WBCIR_BANK_6); in wbcir_init_hw()
901 outb(0x20, data->sbase + WBCIR_REG_SP3_IRCR3); in wbcir_init_hw()
904 wbcir_select_bank(data, WBCIR_BANK_7); in wbcir_init_hw()
905 outb(0xF2, data->sbase + WBCIR_REG_SP3_IRRXDC); in wbcir_init_hw()
908 outb(0x69, data->sbase + WBCIR_REG_SP3_IRTXMC); in wbcir_init_hw()
909 data->txcarrier = 36000; in wbcir_init_hw()
913 outb(0x10, data->sbase + WBCIR_REG_SP3_IRCFG4); in wbcir_init_hw()
915 outb(0x00, data->sbase + WBCIR_REG_SP3_IRCFG4); in wbcir_init_hw()
918 wbcir_select_bank(data, WBCIR_BANK_0); in wbcir_init_hw()
919 outb(0x97, data->sbase + WBCIR_REG_SP3_FCR); in wbcir_init_hw()
922 outb(0xE0, data->sbase + WBCIR_REG_SP3_ASCR); in wbcir_init_hw()
925 data->rxstate = WBCIR_RXSTATE_INACTIVE; in wbcir_init_hw()
926 data->rxev.duration = 0; in wbcir_init_hw()
927 ir_raw_event_reset(data->dev); in wbcir_init_hw()
928 ir_raw_event_handle(data->dev); in wbcir_init_hw()
934 if (data->txstate == WBCIR_TXSTATE_ACTIVE) { in wbcir_init_hw()
935 data->txstate = WBCIR_TXSTATE_ERROR; in wbcir_init_hw()
936 wake_up(&data->txwaitq); in wbcir_init_hw()
940 wbcir_set_irqmask(data, WBCIR_IRQ_RX | WBCIR_IRQ_ERR); in wbcir_init_hw()
946 struct wbcir_data *data = pnp_get_drvdata(device); in wbcir_resume() local
948 wbcir_init_hw(data); in wbcir_resume()
949 enable_irq(data->irq); in wbcir_resume()
958 struct wbcir_data *data; in wbcir_probe() local
968 data = kzalloc(sizeof(*data), GFP_KERNEL); in wbcir_probe()
969 if (!data) { in wbcir_probe()
974 pnp_set_drvdata(device, data); in wbcir_probe()
976 spin_lock_init(&data->spinlock); in wbcir_probe()
977 init_waitqueue_head(&data->txwaitq); in wbcir_probe()
978 data->ebase = pnp_port_start(device, 0); in wbcir_probe()
979 data->wbase = pnp_port_start(device, 1); in wbcir_probe()
980 data->sbase = pnp_port_start(device, 2); in wbcir_probe()
981 data->irq = pnp_irq(device, 0); in wbcir_probe()
983 if (data->wbase == 0 || data->ebase == 0 || in wbcir_probe()
984 data->sbase == 0 || data->irq == 0) { in wbcir_probe()
992 data->wbase, data->ebase, data->sbase, data->irq); in wbcir_probe()
994 if (!request_region(data->wbase, WAKEUP_IOMEM_LEN, DRVNAME)) { in wbcir_probe()
996 data->wbase, data->wbase + WAKEUP_IOMEM_LEN - 1); in wbcir_probe()
1001 if (!request_region(data->ebase, EHFUNC_IOMEM_LEN, DRVNAME)) { in wbcir_probe()
1003 data->ebase, data->ebase + EHFUNC_IOMEM_LEN - 1); in wbcir_probe()
1008 if (!request_region(data->sbase, SP_IOMEM_LEN, DRVNAME)) { in wbcir_probe()
1010 data->sbase, data->sbase + SP_IOMEM_LEN - 1); in wbcir_probe()
1015 err = request_irq(data->irq, wbcir_irq_handler, in wbcir_probe()
1018 dev_err(dev, "Failed to claim IRQ %u\n", data->irq); in wbcir_probe()
1023 led_trigger_register_simple("cir-tx", &data->txtrigger); in wbcir_probe()
1024 if (!data->txtrigger) { in wbcir_probe()
1029 led_trigger_register_simple("cir-rx", &data->rxtrigger); in wbcir_probe()
1030 if (!data->rxtrigger) { in wbcir_probe()
1035 data->led.name = "cir::activity"; in wbcir_probe()
1036 data->led.default_trigger = "cir-rx"; in wbcir_probe()
1037 data->led.brightness_set = wbcir_led_brightness_set; in wbcir_probe()
1038 data->led.brightness_get = wbcir_led_brightness_get; in wbcir_probe()
1039 err = led_classdev_register(&device->dev, &data->led); in wbcir_probe()
1043 data->dev = rc_allocate_device(); in wbcir_probe()
1044 if (!data->dev) { in wbcir_probe()
1049 data->dev->driver_name = WBCIR_NAME; in wbcir_probe()
1050 data->dev->input_name = WBCIR_NAME; in wbcir_probe()
1051 data->dev->input_phys = "wbcir/cir0"; in wbcir_probe()
1052 data->dev->input_id.bustype = BUS_HOST; in wbcir_probe()
1053 data->dev->input_id.vendor = PCI_VENDOR_ID_WINBOND; in wbcir_probe()
1054 data->dev->input_id.product = WBCIR_ID_FAMILY; in wbcir_probe()
1055 data->dev->input_id.version = WBCIR_ID_CHIP; in wbcir_probe()
1056 data->dev->map_name = RC_MAP_RC6_MCE; in wbcir_probe()
1057 data->dev->s_idle = wbcir_idle_rx; in wbcir_probe()
1058 data->dev->s_tx_mask = wbcir_txmask; in wbcir_probe()
1059 data->dev->s_tx_carrier = wbcir_txcarrier; in wbcir_probe()
1060 data->dev->tx_ir = wbcir_tx; in wbcir_probe()
1061 data->dev->priv = data; in wbcir_probe()
1062 data->dev->dev.parent = &device->dev; in wbcir_probe()
1064 err = rc_register_device(data->dev); in wbcir_probe()
1070 wbcir_init_hw(data); in wbcir_probe()
1075 rc_free_device(data->dev); in wbcir_probe()
1077 led_classdev_unregister(&data->led); in wbcir_probe()
1079 led_trigger_unregister_simple(data->rxtrigger); in wbcir_probe()
1081 led_trigger_unregister_simple(data->txtrigger); in wbcir_probe()
1083 free_irq(data->irq, device); in wbcir_probe()
1085 release_region(data->sbase, SP_IOMEM_LEN); in wbcir_probe()
1087 release_region(data->ebase, EHFUNC_IOMEM_LEN); in wbcir_probe()
1089 release_region(data->wbase, WAKEUP_IOMEM_LEN); in wbcir_probe()
1091 kfree(data); in wbcir_probe()
1100 struct wbcir_data *data = pnp_get_drvdata(device); in wbcir_remove() local
1103 wbcir_set_irqmask(data, WBCIR_IRQ_NONE); in wbcir_remove()
1104 free_irq(data->irq, device); in wbcir_remove()
1107 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_STS, 0x17, 0x17); in wbcir_remove()
1110 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_CTL, 0x00, 0x01); in wbcir_remove()
1113 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_EV_EN, 0x00, 0x07); in wbcir_remove()
1115 rc_unregister_device(data->dev); in wbcir_remove()
1117 led_trigger_unregister_simple(data->rxtrigger); in wbcir_remove()
1118 led_trigger_unregister_simple(data->txtrigger); in wbcir_remove()
1119 led_classdev_unregister(&data->led); in wbcir_remove()
1121 /* This is ok since &data->led isn't actually used */ in wbcir_remove()
1122 wbcir_led_brightness_set(&data->led, LED_OFF); in wbcir_remove()
1124 release_region(data->wbase, WAKEUP_IOMEM_LEN); in wbcir_remove()
1125 release_region(data->ebase, EHFUNC_IOMEM_LEN); in wbcir_remove()
1126 release_region(data->sbase, SP_IOMEM_LEN); in wbcir_remove()
1128 kfree(data); in wbcir_remove()