Lines Matching refs:data

271 wbcir_select_bank(struct wbcir_data *data, enum wbcir_bank bank)  in wbcir_select_bank()  argument
273 outb(bank, data->sbase + WBCIR_REG_SP3_BSR); in wbcir_select_bank()
277 wbcir_set_irqmask(struct wbcir_data *data, u8 irqmask) in wbcir_set_irqmask() argument
279 if (data->irqmask == irqmask) in wbcir_set_irqmask()
282 wbcir_select_bank(data, WBCIR_BANK_0); in wbcir_set_irqmask()
283 outb(irqmask, data->sbase + WBCIR_REG_SP3_IER); in wbcir_set_irqmask()
284 data->irqmask = irqmask; in wbcir_set_irqmask()
290 struct wbcir_data *data = container_of(led_cdev, in wbcir_led_brightness_get() local
294 if (inb(data->ebase + WBCIR_REG_ECEIR_CTS) & WBCIR_LED_ENABLE) in wbcir_led_brightness_get()
304 struct wbcir_data *data = container_of(led_cdev, in wbcir_led_brightness_set() local
308 wbcir_set_bits(data->ebase + WBCIR_REG_ECEIR_CTS, in wbcir_led_brightness_set()
339 wbcir_carrier_report(struct wbcir_data *data) in wbcir_carrier_report() argument
341 unsigned counter = inb(data->ebase + WBCIR_REG_ECEIR_CNT_LO) | in wbcir_carrier_report()
342 inb(data->ebase + WBCIR_REG_ECEIR_CNT_HI) << 8; in wbcir_carrier_report()
349 data->pulse_duration); in wbcir_carrier_report()
351 ir_raw_event_store(data->dev, &ev); in wbcir_carrier_report()
355 data->pulse_duration = 0; in wbcir_carrier_report()
356 wbcir_set_bits(data->ebase + WBCIR_REG_ECEIR_CCTL, WBCIR_CNTR_R, in wbcir_carrier_report()
358 wbcir_set_bits(data->ebase + WBCIR_REG_ECEIR_CCTL, WBCIR_CNTR_EN, in wbcir_carrier_report()
365 struct wbcir_data *data = dev->priv; in wbcir_idle_rx() local
367 if (!idle && data->rxstate == WBCIR_RXSTATE_INACTIVE) in wbcir_idle_rx()
368 data->rxstate = WBCIR_RXSTATE_ACTIVE; in wbcir_idle_rx()
370 if (idle && data->rxstate != WBCIR_RXSTATE_INACTIVE) { in wbcir_idle_rx()
371 data->rxstate = WBCIR_RXSTATE_INACTIVE; in wbcir_idle_rx()
373 if (data->carrier_report_enabled) in wbcir_idle_rx()
374 wbcir_carrier_report(data); in wbcir_idle_rx()
377 outb(WBCIR_RX_DISABLE, data->sbase + WBCIR_REG_SP3_ASCR); in wbcir_idle_rx()
382 wbcir_irq_rx(struct wbcir_data *data, struct pnp_dev *device) in wbcir_irq_rx() argument
389 while (inb(data->sbase + WBCIR_REG_SP3_LSR) & WBCIR_RX_AVAIL) { in wbcir_irq_rx()
390 irdata = inb(data->sbase + WBCIR_REG_SP3_RXDATA); in wbcir_irq_rx()
391 if (data->rxstate == WBCIR_RXSTATE_ERROR) in wbcir_irq_rx()
395 (data->carrier_report_enabled ? 2 : 10); in wbcir_irq_rx()
400 data->pulse_duration += duration; in wbcir_irq_rx()
402 ir_raw_event_store_with_filter(data->dev, &rawir); in wbcir_irq_rx()
405 ir_raw_event_handle(data->dev); in wbcir_irq_rx()
409 wbcir_irq_tx(struct wbcir_data *data) in wbcir_irq_tx() argument
416 if (!data->txbuf) in wbcir_irq_tx()
419 switch (data->txstate) { in wbcir_irq_tx()
440 for (used = 0; used < space && data->txoff != data->txlen; used++) { in wbcir_irq_tx()
441 if (data->txbuf[data->txoff] == 0) { in wbcir_irq_tx()
442 data->txoff++; in wbcir_irq_tx()
445 byte = min((u32)0x80, data->txbuf[data->txoff]); in wbcir_irq_tx()
446 data->txbuf[data->txoff] -= byte; in wbcir_irq_tx()
448 byte |= (data->txoff % 2 ? 0x80 : 0x00); /* pulse/space */ in wbcir_irq_tx()
452 while (data->txbuf[data->txoff] == 0 && data->txoff != data->txlen) in wbcir_irq_tx()
453 data->txoff++; in wbcir_irq_tx()
457 if (data->txstate == WBCIR_TXSTATE_ERROR) in wbcir_irq_tx()
459 outb(WBCIR_TX_UNDERRUN, data->sbase + WBCIR_REG_SP3_ASCR); in wbcir_irq_tx()
460 wbcir_set_irqmask(data, WBCIR_IRQ_RX | WBCIR_IRQ_ERR); in wbcir_irq_tx()
461 kfree(data->txbuf); in wbcir_irq_tx()
462 data->txbuf = NULL; in wbcir_irq_tx()
463 data->txstate = WBCIR_TXSTATE_INACTIVE; in wbcir_irq_tx()
464 } else if (data->txoff == data->txlen) { in wbcir_irq_tx()
466 outsb(data->sbase + WBCIR_REG_SP3_TXDATA, bytes, used - 1); in wbcir_irq_tx()
467 outb(WBCIR_TX_EOT, data->sbase + WBCIR_REG_SP3_ASCR); in wbcir_irq_tx()
468 outb(bytes[used - 1], data->sbase + WBCIR_REG_SP3_TXDATA); in wbcir_irq_tx()
469 wbcir_set_irqmask(data, WBCIR_IRQ_RX | WBCIR_IRQ_ERR | in wbcir_irq_tx()
473 outsb(data->sbase + WBCIR_REG_SP3_RXDATA, bytes, used); in wbcir_irq_tx()
474 if (data->txstate == WBCIR_TXSTATE_INACTIVE) { in wbcir_irq_tx()
475 wbcir_set_irqmask(data, WBCIR_IRQ_RX | WBCIR_IRQ_ERR | in wbcir_irq_tx()
477 data->txstate = WBCIR_TXSTATE_ACTIVE; in wbcir_irq_tx()
486 struct wbcir_data *data = pnp_get_drvdata(device); in wbcir_irq_handler() local
490 spin_lock_irqsave(&data->spinlock, flags); in wbcir_irq_handler()
491 wbcir_select_bank(data, WBCIR_BANK_0); in wbcir_irq_handler()
492 status = inb(data->sbase + WBCIR_REG_SP3_EIR); in wbcir_irq_handler()
493 status &= data->irqmask; in wbcir_irq_handler()
496 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_irq_handler()
502 if (inb(data->sbase + WBCIR_REG_SP3_LSR) & WBCIR_RX_OVERRUN) { in wbcir_irq_handler()
503 data->rxstate = WBCIR_RXSTATE_ERROR; in wbcir_irq_handler()
504 ir_raw_event_reset(data->dev); in wbcir_irq_handler()
508 if (inb(data->sbase + WBCIR_REG_SP3_ASCR) & WBCIR_TX_UNDERRUN) in wbcir_irq_handler()
509 data->txstate = WBCIR_TXSTATE_ERROR; in wbcir_irq_handler()
513 wbcir_irq_rx(data, device); in wbcir_irq_handler()
516 wbcir_irq_tx(data); in wbcir_irq_handler()
518 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_irq_handler()
531 struct wbcir_data *data = dev->priv; in wbcir_set_carrier_report() local
534 spin_lock_irqsave(&data->spinlock, flags); in wbcir_set_carrier_report()
536 if (data->carrier_report_enabled == enable) { in wbcir_set_carrier_report()
537 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_set_carrier_report()
541 data->pulse_duration = 0; in wbcir_set_carrier_report()
542 wbcir_set_bits(data->ebase + WBCIR_REG_ECEIR_CCTL, WBCIR_CNTR_R, in wbcir_set_carrier_report()
545 if (enable && data->dev->idle) in wbcir_set_carrier_report()
546 wbcir_set_bits(data->ebase + WBCIR_REG_ECEIR_CCTL, in wbcir_set_carrier_report()
550 wbcir_select_bank(data, WBCIR_BANK_2); in wbcir_set_carrier_report()
551 data->dev->rx_resolution = US_TO_NS(enable ? 2 : 10); in wbcir_set_carrier_report()
552 outb(enable ? 0x03 : 0x0f, data->sbase + WBCIR_REG_SP3_BGDL); in wbcir_set_carrier_report()
553 outb(0x00, data->sbase + WBCIR_REG_SP3_BGDH); in wbcir_set_carrier_report()
556 wbcir_select_bank(data, WBCIR_BANK_7); in wbcir_set_carrier_report()
557 wbcir_set_bits(data->sbase + WBCIR_REG_SP3_RCCFG, in wbcir_set_carrier_report()
560 data->carrier_report_enabled = enable; in wbcir_set_carrier_report()
561 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_set_carrier_report()
569 struct wbcir_data *data = dev->priv; in wbcir_txcarrier() local
595 spin_lock_irqsave(&data->spinlock, flags); in wbcir_txcarrier()
596 if (data->txstate != WBCIR_TXSTATE_INACTIVE) { in wbcir_txcarrier()
597 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_txcarrier()
601 if (data->txcarrier != freq) { in wbcir_txcarrier()
602 wbcir_select_bank(data, WBCIR_BANK_7); in wbcir_txcarrier()
603 wbcir_set_bits(data->sbase + WBCIR_REG_SP3_IRTXMC, val, 0x1F); in wbcir_txcarrier()
604 data->txcarrier = freq; in wbcir_txcarrier()
607 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_txcarrier()
614 struct wbcir_data *data = dev->priv; in wbcir_txmask() local
636 spin_lock_irqsave(&data->spinlock, flags); in wbcir_txmask()
637 if (data->txstate != WBCIR_TXSTATE_INACTIVE) { in wbcir_txmask()
638 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_txmask()
642 if (data->txmask != mask) { in wbcir_txmask()
643 wbcir_set_bits(data->ebase + WBCIR_REG_ECEIR_CTS, val, 0x0c); in wbcir_txmask()
644 data->txmask = mask; in wbcir_txmask()
647 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_txmask()
654 struct wbcir_data *data = dev->priv; in wbcir_tx() local
668 spin_lock_irqsave(&data->spinlock, flags); in wbcir_tx()
669 if (data->txstate != WBCIR_TXSTATE_INACTIVE) { in wbcir_tx()
670 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_tx()
676 data->txbuf = buf; in wbcir_tx()
677 data->txlen = count; in wbcir_tx()
678 data->txoff = 0; in wbcir_tx()
679 wbcir_irq_tx(data); in wbcir_tx()
682 spin_unlock_irqrestore(&data->spinlock, flags); in wbcir_tx()
696 struct wbcir_data *data = pnp_get_drvdata(device); in wbcir_shutdown() local
837 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_INDEX, in wbcir_shutdown()
840 outsb(data->wbase + WBCIR_REG_WCEIR_DATA, match, 11); in wbcir_shutdown()
841 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_INDEX, in wbcir_shutdown()
844 outsb(data->wbase + WBCIR_REG_WCEIR_DATA, mask, 11); in wbcir_shutdown()
847 outb(rc6_csl, data->wbase + WBCIR_REG_WCEIR_CSL); in wbcir_shutdown()
850 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_STS, 0x17, 0x17); in wbcir_shutdown()
853 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_EV_EN, 0x01, 0x07); in wbcir_shutdown()
856 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_CTL, 0x01, 0x01); in wbcir_shutdown()
860 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_EV_EN, 0x00, 0x07); in wbcir_shutdown()
863 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_CTL, 0x00, 0x01); in wbcir_shutdown()
872 wbcir_set_irqmask(data, WBCIR_IRQ_NONE); in wbcir_shutdown()
873 disable_irq(data->irq); in wbcir_shutdown()
879 struct wbcir_data *data = pnp_get_drvdata(device); in wbcir_suspend() local
880 led_classdev_suspend(&data->led); in wbcir_suspend()
886 wbcir_init_hw(struct wbcir_data *data) in wbcir_init_hw() argument
891 wbcir_set_irqmask(data, WBCIR_IRQ_NONE); in wbcir_init_hw()
897 outb(tmp, data->wbase + WBCIR_REG_WCEIR_CTL); in wbcir_init_hw()
900 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_STS, 0x17, 0x17); in wbcir_init_hw()
903 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_EV_EN, 0x00, 0x07); in wbcir_init_hw()
906 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_CFG1, 0x4A, 0x7F); in wbcir_init_hw()
910 outb(WBCIR_IRTX_INV, data->ebase + WBCIR_REG_ECEIR_CCTL); in wbcir_init_hw()
912 outb(0x00, data->ebase + WBCIR_REG_ECEIR_CCTL); in wbcir_init_hw()
918 outb(0x10, data->ebase + WBCIR_REG_ECEIR_CTS); in wbcir_init_hw()
919 data->txmask = 0x1; in wbcir_init_hw()
922 wbcir_select_bank(data, WBCIR_BANK_2); in wbcir_init_hw()
923 outb(WBCIR_EXT_ENABLE, data->sbase + WBCIR_REG_SP3_EXCR1); in wbcir_init_hw()
937 outb(0x30, data->sbase + WBCIR_REG_SP3_EXCR2); in wbcir_init_hw()
940 outb(0x0f, data->sbase + WBCIR_REG_SP3_BGDL); in wbcir_init_hw()
941 outb(0x00, data->sbase + WBCIR_REG_SP3_BGDH); in wbcir_init_hw()
944 wbcir_select_bank(data, WBCIR_BANK_0); in wbcir_init_hw()
945 outb(0xC0, data->sbase + WBCIR_REG_SP3_MCR); in wbcir_init_hw()
946 inb(data->sbase + WBCIR_REG_SP3_LSR); /* Clear LSR */ in wbcir_init_hw()
947 inb(data->sbase + WBCIR_REG_SP3_MSR); /* Clear MSR */ in wbcir_init_hw()
950 wbcir_select_bank(data, WBCIR_BANK_7); in wbcir_init_hw()
951 outb(0x90, data->sbase + WBCIR_REG_SP3_RCCFG); in wbcir_init_hw()
954 wbcir_select_bank(data, WBCIR_BANK_4); in wbcir_init_hw()
955 outb(0x00, data->sbase + WBCIR_REG_SP3_IRCR1); in wbcir_init_hw()
958 wbcir_select_bank(data, WBCIR_BANK_5); in wbcir_init_hw()
959 outb(txandrx ? 0x03 : 0x02, data->sbase + WBCIR_REG_SP3_IRCR2); in wbcir_init_hw()
962 wbcir_select_bank(data, WBCIR_BANK_6); in wbcir_init_hw()
963 outb(0x20, data->sbase + WBCIR_REG_SP3_IRCR3); in wbcir_init_hw()
966 wbcir_select_bank(data, WBCIR_BANK_7); in wbcir_init_hw()
967 outb(0xF2, data->sbase + WBCIR_REG_SP3_IRRXDC); in wbcir_init_hw()
970 outb(0x69, data->sbase + WBCIR_REG_SP3_IRTXMC); in wbcir_init_hw()
971 data->txcarrier = 36000; in wbcir_init_hw()
975 outb(0x10, data->sbase + WBCIR_REG_SP3_IRCFG4); in wbcir_init_hw()
977 outb(0x00, data->sbase + WBCIR_REG_SP3_IRCFG4); in wbcir_init_hw()
980 wbcir_select_bank(data, WBCIR_BANK_0); in wbcir_init_hw()
981 outb(0x97, data->sbase + WBCIR_REG_SP3_FCR); in wbcir_init_hw()
984 outb(0xE0, data->sbase + WBCIR_REG_SP3_ASCR); in wbcir_init_hw()
987 data->rxstate = WBCIR_RXSTATE_INACTIVE; in wbcir_init_hw()
988 ir_raw_event_reset(data->dev); in wbcir_init_hw()
989 ir_raw_event_set_idle(data->dev, true); in wbcir_init_hw()
992 if (data->txstate == WBCIR_TXSTATE_ACTIVE) { in wbcir_init_hw()
993 kfree(data->txbuf); in wbcir_init_hw()
994 data->txbuf = NULL; in wbcir_init_hw()
995 data->txstate = WBCIR_TXSTATE_INACTIVE; in wbcir_init_hw()
999 wbcir_set_irqmask(data, WBCIR_IRQ_RX | WBCIR_IRQ_ERR); in wbcir_init_hw()
1005 struct wbcir_data *data = pnp_get_drvdata(device); in wbcir_resume() local
1007 wbcir_init_hw(data); in wbcir_resume()
1008 enable_irq(data->irq); in wbcir_resume()
1009 led_classdev_resume(&data->led); in wbcir_resume()
1018 struct wbcir_data *data; in wbcir_probe() local
1028 data = kzalloc(sizeof(*data), GFP_KERNEL); in wbcir_probe()
1029 if (!data) { in wbcir_probe()
1034 pnp_set_drvdata(device, data); in wbcir_probe()
1036 spin_lock_init(&data->spinlock); in wbcir_probe()
1037 data->ebase = pnp_port_start(device, 0); in wbcir_probe()
1038 data->wbase = pnp_port_start(device, 1); in wbcir_probe()
1039 data->sbase = pnp_port_start(device, 2); in wbcir_probe()
1040 data->irq = pnp_irq(device, 0); in wbcir_probe()
1042 if (data->wbase == 0 || data->ebase == 0 || in wbcir_probe()
1043 data->sbase == 0 || data->irq == 0) { in wbcir_probe()
1051 data->wbase, data->ebase, data->sbase, data->irq); in wbcir_probe()
1053 data->led.name = "cir::activity"; in wbcir_probe()
1054 data->led.default_trigger = "rc-feedback"; in wbcir_probe()
1055 data->led.brightness_set = wbcir_led_brightness_set; in wbcir_probe()
1056 data->led.brightness_get = wbcir_led_brightness_get; in wbcir_probe()
1057 err = led_classdev_register(&device->dev, &data->led); in wbcir_probe()
1061 data->dev = rc_allocate_device(); in wbcir_probe()
1062 if (!data->dev) { in wbcir_probe()
1067 data->dev->driver_type = RC_DRIVER_IR_RAW; in wbcir_probe()
1068 data->dev->driver_name = DRVNAME; in wbcir_probe()
1069 data->dev->input_name = WBCIR_NAME; in wbcir_probe()
1070 data->dev->input_phys = "wbcir/cir0"; in wbcir_probe()
1071 data->dev->input_id.bustype = BUS_HOST; in wbcir_probe()
1072 data->dev->input_id.vendor = PCI_VENDOR_ID_WINBOND; in wbcir_probe()
1073 data->dev->input_id.product = WBCIR_ID_FAMILY; in wbcir_probe()
1074 data->dev->input_id.version = WBCIR_ID_CHIP; in wbcir_probe()
1075 data->dev->map_name = RC_MAP_RC6_MCE; in wbcir_probe()
1076 data->dev->s_idle = wbcir_idle_rx; in wbcir_probe()
1077 data->dev->s_carrier_report = wbcir_set_carrier_report; in wbcir_probe()
1078 data->dev->s_tx_mask = wbcir_txmask; in wbcir_probe()
1079 data->dev->s_tx_carrier = wbcir_txcarrier; in wbcir_probe()
1080 data->dev->tx_ir = wbcir_tx; in wbcir_probe()
1081 data->dev->priv = data; in wbcir_probe()
1082 data->dev->dev.parent = &device->dev; in wbcir_probe()
1083 data->dev->timeout = MS_TO_NS(100); in wbcir_probe()
1084 data->dev->rx_resolution = US_TO_NS(2); in wbcir_probe()
1085 data->dev->allowed_protocols = RC_BIT_ALL; in wbcir_probe()
1087 err = rc_register_device(data->dev); in wbcir_probe()
1091 if (!request_region(data->wbase, WAKEUP_IOMEM_LEN, DRVNAME)) { in wbcir_probe()
1093 data->wbase, data->wbase + WAKEUP_IOMEM_LEN - 1); in wbcir_probe()
1098 if (!request_region(data->ebase, EHFUNC_IOMEM_LEN, DRVNAME)) { in wbcir_probe()
1100 data->ebase, data->ebase + EHFUNC_IOMEM_LEN - 1); in wbcir_probe()
1105 if (!request_region(data->sbase, SP_IOMEM_LEN, DRVNAME)) { in wbcir_probe()
1107 data->sbase, data->sbase + SP_IOMEM_LEN - 1); in wbcir_probe()
1112 err = request_irq(data->irq, wbcir_irq_handler, in wbcir_probe()
1115 dev_err(dev, "Failed to claim IRQ %u\n", data->irq); in wbcir_probe()
1122 wbcir_init_hw(data); in wbcir_probe()
1127 release_region(data->sbase, SP_IOMEM_LEN); in wbcir_probe()
1129 release_region(data->ebase, EHFUNC_IOMEM_LEN); in wbcir_probe()
1131 release_region(data->wbase, WAKEUP_IOMEM_LEN); in wbcir_probe()
1133 rc_unregister_device(data->dev); in wbcir_probe()
1134 data->dev = NULL; in wbcir_probe()
1136 rc_free_device(data->dev); in wbcir_probe()
1138 led_classdev_unregister(&data->led); in wbcir_probe()
1140 kfree(data); in wbcir_probe()
1149 struct wbcir_data *data = pnp_get_drvdata(device); in wbcir_remove() local
1152 wbcir_set_irqmask(data, WBCIR_IRQ_NONE); in wbcir_remove()
1153 free_irq(data->irq, device); in wbcir_remove()
1156 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_STS, 0x17, 0x17); in wbcir_remove()
1159 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_CTL, 0x00, 0x01); in wbcir_remove()
1162 wbcir_set_bits(data->wbase + WBCIR_REG_WCEIR_EV_EN, 0x00, 0x07); in wbcir_remove()
1164 rc_unregister_device(data->dev); in wbcir_remove()
1166 led_classdev_unregister(&data->led); in wbcir_remove()
1169 wbcir_led_brightness_set(&data->led, LED_OFF); in wbcir_remove()
1171 release_region(data->wbase, WAKEUP_IOMEM_LEN); in wbcir_remove()
1172 release_region(data->ebase, EHFUNC_IOMEM_LEN); in wbcir_remove()
1173 release_region(data->sbase, SP_IOMEM_LEN); in wbcir_remove()
1175 kfree(data); in wbcir_remove()