Lines Matching refs:qcdev

123 static int quicki2c_get_acpi_resources(struct quicki2c_device *qcdev)  in quicki2c_get_acpi_resources()  argument
125 struct acpi_device *adev = ACPI_COMPANION(qcdev->dev); in quicki2c_get_acpi_resources()
132 dev_err(qcdev->dev, "Invalid acpi device pointer\n"); in quicki2c_get_acpi_resources()
136 qcdev->acpi_dev = adev; in quicki2c_get_acpi_resources()
146 qcdev->hid_desc_addr = (u16)hid_desc_addr; in quicki2c_get_acpi_resources()
152 &qcdev->active_ltr_val); in quicki2c_get_acpi_resources()
160 &qcdev->low_power_ltr_val); in quicki2c_get_acpi_resources()
172 qcdev->i2c_slave_addr = i2c_param.device_address; in quicki2c_get_acpi_resources()
181 qcdev->i2c_speed_mode = THC_I2C_STANDARD; in quicki2c_get_acpi_resources()
182 qcdev->i2c_clock_hcnt = i2c_config.SMHX; in quicki2c_get_acpi_resources()
183 qcdev->i2c_clock_lcnt = i2c_config.SMLX; in quicki2c_get_acpi_resources()
186 qcdev->i2c_speed_mode = THC_I2C_FAST_AND_PLUS; in quicki2c_get_acpi_resources()
187 qcdev->i2c_clock_hcnt = i2c_config.FMHX; in quicki2c_get_acpi_resources()
188 qcdev->i2c_clock_lcnt = i2c_config.FMLX; in quicki2c_get_acpi_resources()
191 qcdev->i2c_speed_mode = THC_I2C_FAST_AND_PLUS; in quicki2c_get_acpi_resources()
192 qcdev->i2c_clock_hcnt = i2c_config.FPHX; in quicki2c_get_acpi_resources()
193 qcdev->i2c_clock_lcnt = i2c_config.FPLX; in quicki2c_get_acpi_resources()
196 qcdev->i2c_speed_mode = THC_I2C_HIGH_SPEED; in quicki2c_get_acpi_resources()
197 qcdev->i2c_clock_hcnt = i2c_config.HMHX; in quicki2c_get_acpi_resources()
198 qcdev->i2c_clock_lcnt = i2c_config.HMLX; in quicki2c_get_acpi_resources()
215 struct quicki2c_device *qcdev = dev_id; in quicki2c_irq_quick_handler() local
217 if (qcdev->state == QUICKI2C_DISABLED) in quicki2c_irq_quick_handler()
221 thc_interrupt_enable(qcdev->thc_hw, false); in quicki2c_irq_quick_handler()
236 static int try_recover(struct quicki2c_device *qcdev) in try_recover() argument
240 thc_dma_unconfigure(qcdev->thc_hw); in try_recover()
242 ret = thc_dma_configure(qcdev->thc_hw); in try_recover()
244 dev_err(qcdev->dev, "Reconfig DMA failed\n"); in try_recover()
251 static int handle_input_report(struct quicki2c_device *qcdev) in handle_input_report() argument
253 struct hidi2c_report_packet *pkt = (struct hidi2c_report_packet *)qcdev->input_buf; in handle_input_report()
259 ret = thc_rxdma_read(qcdev->thc_hw, THC_RXDMA2, in handle_input_report()
266 if (qcdev->state == QUICKI2C_RESETING) { in handle_input_report()
267 qcdev->reset_ack = true; in handle_input_report()
268 wake_up(&qcdev->reset_ack_wq); in handle_input_report()
270 qcdev->state = QUICKI2C_RESETED; in handle_input_report()
272 dev_warn(qcdev->dev, "unexpected DIR happen\n"); in handle_input_report()
279 if (qcdev->state != QUICKI2C_ENABLED) in handle_input_report()
282 quicki2c_hid_send_report(qcdev, pkt->data, in handle_input_report()
298 struct quicki2c_device *qcdev = dev_id; in quicki2c_irq_thread_handler() local
303 if (qcdev->state == QUICKI2C_DISABLED) in quicki2c_irq_thread_handler()
306 ret = pm_runtime_resume_and_get(qcdev->dev); in quicki2c_irq_thread_handler()
310 int_mask = thc_interrupt_handler(qcdev->thc_hw); in quicki2c_irq_thread_handler()
319 err_recover = handle_input_report(qcdev); in quicki2c_irq_thread_handler()
325 thc_interrupt_enable(qcdev->thc_hw, true); in quicki2c_irq_thread_handler()
328 if (try_recover(qcdev)) in quicki2c_irq_thread_handler()
329 qcdev->state = QUICKI2C_DISABLED; in quicki2c_irq_thread_handler()
331 pm_runtime_mark_last_busy(qcdev->dev); in quicki2c_irq_thread_handler()
332 pm_runtime_put_autosuspend(qcdev->dev); in quicki2c_irq_thread_handler()
355 struct quicki2c_device *qcdev; in quicki2c_dev_init() local
358 qcdev = devm_kzalloc(dev, sizeof(struct quicki2c_device), GFP_KERNEL); in quicki2c_dev_init()
359 if (!qcdev) in quicki2c_dev_init()
362 qcdev->pdev = pdev; in quicki2c_dev_init()
363 qcdev->dev = dev; in quicki2c_dev_init()
364 qcdev->mem_addr = mem_addr; in quicki2c_dev_init()
365 qcdev->state = QUICKI2C_DISABLED; in quicki2c_dev_init()
366 qcdev->ddata = ddata; in quicki2c_dev_init()
368 init_waitqueue_head(&qcdev->reset_ack_wq); in quicki2c_dev_init()
371 qcdev->thc_hw = thc_dev_init(qcdev->dev, qcdev->mem_addr); in quicki2c_dev_init()
372 if (IS_ERR(qcdev->thc_hw)) { in quicki2c_dev_init()
373 ret = PTR_ERR(qcdev->thc_hw); in quicki2c_dev_init()
378 ret = quicki2c_get_acpi_resources(qcdev); in quicki2c_dev_init()
384 ret = thc_interrupt_quiesce(qcdev->thc_hw, true); in quicki2c_dev_init()
388 ret = thc_port_select(qcdev->thc_hw, THC_PORT_TYPE_I2C); in quicki2c_dev_init()
394 ret = thc_i2c_subip_init(qcdev->thc_hw, qcdev->i2c_slave_addr, in quicki2c_dev_init()
395 qcdev->i2c_speed_mode, in quicki2c_dev_init()
396 qcdev->i2c_clock_hcnt, in quicki2c_dev_init()
397 qcdev->i2c_clock_lcnt); in quicki2c_dev_init()
401 thc_int_trigger_type_select(qcdev->thc_hw, false); in quicki2c_dev_init()
403 thc_interrupt_config(qcdev->thc_hw); in quicki2c_dev_init()
405 thc_interrupt_enable(qcdev->thc_hw, true); in quicki2c_dev_init()
407 thc_wot_config(qcdev->thc_hw, &quicki2c_gpios[0]); in quicki2c_dev_init()
409 qcdev->state = QUICKI2C_INITED; in quicki2c_dev_init()
411 return qcdev; in quicki2c_dev_init()
420 static void quicki2c_dev_deinit(struct quicki2c_device *qcdev) in quicki2c_dev_deinit() argument
422 thc_interrupt_enable(qcdev->thc_hw, false); in quicki2c_dev_deinit()
423 thc_ltr_unconfig(qcdev->thc_hw); in quicki2c_dev_deinit()
424 thc_wot_unconfig(qcdev->thc_hw); in quicki2c_dev_deinit()
426 qcdev->state = QUICKI2C_DISABLED; in quicki2c_dev_deinit()
436 static void quicki2c_dma_adv_enable(struct quicki2c_device *qcdev) in quicki2c_dma_adv_enable() argument
443 if (qcdev->ddata->max_detect_size >= in quicki2c_dma_adv_enable()
444 le16_to_cpu(qcdev->dev_desc.max_input_len)) { in quicki2c_dma_adv_enable()
445 thc_i2c_set_rx_max_size(qcdev->thc_hw, in quicki2c_dma_adv_enable()
446 le16_to_cpu(qcdev->dev_desc.max_input_len)); in quicki2c_dma_adv_enable()
447 thc_i2c_rx_max_size_enable(qcdev->thc_hw, true); in quicki2c_dma_adv_enable()
451 if (qcdev->ddata->interrupt_delay) { in quicki2c_dma_adv_enable()
452 thc_i2c_set_rx_int_delay(qcdev->thc_hw, in quicki2c_dma_adv_enable()
453 qcdev->ddata->interrupt_delay); in quicki2c_dma_adv_enable()
454 thc_i2c_rx_int_delay_enable(qcdev->thc_hw, true); in quicki2c_dma_adv_enable()
464 static void quicki2c_dma_adv_disable(struct quicki2c_device *qcdev) in quicki2c_dma_adv_disable() argument
466 if (qcdev->ddata->max_detect_size) in quicki2c_dma_adv_disable()
467 thc_i2c_rx_max_size_enable(qcdev->thc_hw, false); in quicki2c_dma_adv_disable()
469 if (qcdev->ddata->interrupt_delay) in quicki2c_dma_adv_disable()
470 thc_i2c_rx_int_delay_enable(qcdev->thc_hw, false); in quicki2c_dma_adv_disable()
482 static int quicki2c_dma_init(struct quicki2c_device *qcdev) in quicki2c_dma_init() argument
487 swdma_max_len = max(le16_to_cpu(qcdev->dev_desc.max_input_len), in quicki2c_dma_init()
488 le16_to_cpu(qcdev->dev_desc.report_desc_len)); in quicki2c_dma_init()
490 ret = thc_dma_set_max_packet_sizes(qcdev->thc_hw, 0, in quicki2c_dma_init()
491 le16_to_cpu(qcdev->dev_desc.max_input_len), in quicki2c_dma_init()
492 le16_to_cpu(qcdev->dev_desc.max_output_len), in quicki2c_dma_init()
497 ret = thc_dma_allocate(qcdev->thc_hw); in quicki2c_dma_init()
499 dev_err(qcdev->dev, "Allocate THC DMA buffer failed, ret = %d\n", ret); in quicki2c_dma_init()
504 ret = thc_dma_configure(qcdev->thc_hw); in quicki2c_dma_init()
506 dev_err(qcdev->dev, "Configure THC DMA failed, ret = %d\n", ret); in quicki2c_dma_init()
507 thc_dma_unconfigure(qcdev->thc_hw); in quicki2c_dma_init()
508 thc_dma_release(qcdev->thc_hw); in quicki2c_dma_init()
512 if (qcdev->ddata) in quicki2c_dma_init()
513 quicki2c_dma_adv_enable(qcdev); in quicki2c_dma_init()
525 static void quicki2c_dma_deinit(struct quicki2c_device *qcdev) in quicki2c_dma_deinit() argument
527 thc_dma_unconfigure(qcdev->thc_hw); in quicki2c_dma_deinit()
528 thc_dma_release(qcdev->thc_hw); in quicki2c_dma_deinit()
530 if (qcdev->ddata) in quicki2c_dma_deinit()
531 quicki2c_dma_adv_disable(qcdev); in quicki2c_dma_deinit()
549 static int quicki2c_alloc_report_buf(struct quicki2c_device *qcdev) in quicki2c_alloc_report_buf() argument
553 qcdev->report_descriptor = devm_kzalloc(qcdev->dev, in quicki2c_alloc_report_buf()
554 le16_to_cpu(qcdev->dev_desc.report_desc_len), in quicki2c_alloc_report_buf()
556 if (!qcdev->report_descriptor) in quicki2c_alloc_report_buf()
563 max_report_len = max(le16_to_cpu(qcdev->dev_desc.max_input_len), SZ_4K); in quicki2c_alloc_report_buf()
565 qcdev->input_buf = devm_kzalloc(qcdev->dev, max_report_len, GFP_KERNEL); in quicki2c_alloc_report_buf()
566 if (!qcdev->input_buf) in quicki2c_alloc_report_buf()
569 if (!le16_to_cpu(qcdev->dev_desc.max_output_len)) in quicki2c_alloc_report_buf()
570 qcdev->dev_desc.max_output_len = cpu_to_le16(SZ_4K); in quicki2c_alloc_report_buf()
572 max_report_len = max(le16_to_cpu(qcdev->dev_desc.max_output_len), in quicki2c_alloc_report_buf()
575 qcdev->report_buf = devm_kzalloc(qcdev->dev, max_report_len, GFP_KERNEL); in quicki2c_alloc_report_buf()
576 if (!qcdev->report_buf) in quicki2c_alloc_report_buf()
579 qcdev->report_len = max_report_len; in quicki2c_alloc_report_buf()
606 struct quicki2c_device *qcdev; in quicki2c_probe() local
643 qcdev = quicki2c_dev_init(pdev, mem_addr, ddata); in quicki2c_probe()
644 if (IS_ERR(qcdev)) { in quicki2c_probe()
646 ret = PTR_ERR(qcdev); in quicki2c_probe()
650 pci_set_drvdata(pdev, qcdev); in quicki2c_probe()
656 qcdev); in quicki2c_probe()
663 ret = quicki2c_get_device_descriptor(qcdev); in quicki2c_probe()
669 ret = quicki2c_alloc_report_buf(qcdev); in quicki2c_probe()
675 ret = quicki2c_dma_init(qcdev); in quicki2c_probe()
681 ret = thc_interrupt_quiesce(qcdev->thc_hw, false); in quicki2c_probe()
685 ret = quicki2c_set_power(qcdev, HIDI2C_ON); in quicki2c_probe()
691 ret = quicki2c_reset(qcdev); in quicki2c_probe()
697 ret = quicki2c_get_report_descriptor(qcdev); in quicki2c_probe()
703 ret = quicki2c_hid_probe(qcdev); in quicki2c_probe()
709 qcdev->state = QUICKI2C_ENABLED; in quicki2c_probe()
712 pm_runtime_use_autosuspend(qcdev->dev); in quicki2c_probe()
713 pm_runtime_set_autosuspend_delay(qcdev->dev, DEFAULT_AUTO_SUSPEND_DELAY_MS); in quicki2c_probe()
714 pm_runtime_mark_last_busy(qcdev->dev); in quicki2c_probe()
715 pm_runtime_put_noidle(qcdev->dev); in quicki2c_probe()
716 pm_runtime_put_autosuspend(qcdev->dev); in quicki2c_probe()
723 quicki2c_dma_deinit(qcdev); in quicki2c_probe()
725 quicki2c_dev_deinit(qcdev); in quicki2c_probe()
741 struct quicki2c_device *qcdev; in quicki2c_remove() local
743 qcdev = pci_get_drvdata(pdev); in quicki2c_remove()
744 if (!qcdev) in quicki2c_remove()
747 quicki2c_hid_remove(qcdev); in quicki2c_remove()
748 quicki2c_dma_deinit(qcdev); in quicki2c_remove()
750 pm_runtime_get_noresume(qcdev->dev); in quicki2c_remove()
752 quicki2c_dev_deinit(qcdev); in quicki2c_remove()
766 struct quicki2c_device *qcdev; in quicki2c_shutdown() local
768 qcdev = pci_get_drvdata(pdev); in quicki2c_shutdown()
769 if (!qcdev) in quicki2c_shutdown()
773 quicki2c_dma_deinit(qcdev); in quicki2c_shutdown()
775 quicki2c_dev_deinit(qcdev); in quicki2c_shutdown()
781 struct quicki2c_device *qcdev; in quicki2c_suspend() local
784 qcdev = pci_get_drvdata(pdev); in quicki2c_suspend()
785 if (!qcdev) in quicki2c_suspend()
792 ret = thc_i2c_subip_regs_save(qcdev->thc_hw); in quicki2c_suspend()
796 ret = thc_interrupt_quiesce(qcdev->thc_hw, true); in quicki2c_suspend()
800 thc_interrupt_enable(qcdev->thc_hw, false); in quicki2c_suspend()
802 thc_dma_unconfigure(qcdev->thc_hw); in quicki2c_suspend()
810 struct quicki2c_device *qcdev; in quicki2c_resume() local
813 qcdev = pci_get_drvdata(pdev); in quicki2c_resume()
814 if (!qcdev) in quicki2c_resume()
817 ret = thc_port_select(qcdev->thc_hw, THC_PORT_TYPE_I2C); in quicki2c_resume()
821 ret = thc_i2c_subip_regs_restore(qcdev->thc_hw); in quicki2c_resume()
825 thc_interrupt_config(qcdev->thc_hw); in quicki2c_resume()
827 thc_interrupt_enable(qcdev->thc_hw, true); in quicki2c_resume()
829 ret = thc_dma_configure(qcdev->thc_hw); in quicki2c_resume()
833 ret = thc_interrupt_quiesce(qcdev->thc_hw, false); in quicki2c_resume()
843 struct quicki2c_device *qcdev; in quicki2c_freeze() local
846 qcdev = pci_get_drvdata(pdev); in quicki2c_freeze()
847 if (!qcdev) in quicki2c_freeze()
850 ret = thc_interrupt_quiesce(qcdev->thc_hw, true); in quicki2c_freeze()
854 thc_interrupt_enable(qcdev->thc_hw, false); in quicki2c_freeze()
856 thc_dma_unconfigure(qcdev->thc_hw); in quicki2c_freeze()
864 struct quicki2c_device *qcdev; in quicki2c_thaw() local
867 qcdev = pci_get_drvdata(pdev); in quicki2c_thaw()
868 if (!qcdev) in quicki2c_thaw()
871 ret = thc_dma_configure(qcdev->thc_hw); in quicki2c_thaw()
875 thc_interrupt_enable(qcdev->thc_hw, true); in quicki2c_thaw()
877 ret = thc_interrupt_quiesce(qcdev->thc_hw, false); in quicki2c_thaw()
887 struct quicki2c_device *qcdev; in quicki2c_poweroff() local
890 qcdev = pci_get_drvdata(pdev); in quicki2c_poweroff()
891 if (!qcdev) in quicki2c_poweroff()
894 ret = thc_interrupt_quiesce(qcdev->thc_hw, true); in quicki2c_poweroff()
898 thc_interrupt_enable(qcdev->thc_hw, false); in quicki2c_poweroff()
900 thc_ltr_unconfig(qcdev->thc_hw); in quicki2c_poweroff()
902 quicki2c_dma_deinit(qcdev); in quicki2c_poweroff()
910 struct quicki2c_device *qcdev; in quicki2c_restore() local
913 qcdev = pci_get_drvdata(pdev); in quicki2c_restore()
914 if (!qcdev) in quicki2c_restore()
918 ret = thc_port_select(qcdev->thc_hw, THC_PORT_TYPE_I2C); in quicki2c_restore()
922 ret = thc_i2c_subip_init(qcdev->thc_hw, qcdev->i2c_slave_addr, in quicki2c_restore()
923 qcdev->i2c_speed_mode, in quicki2c_restore()
924 qcdev->i2c_clock_hcnt, in quicki2c_restore()
925 qcdev->i2c_clock_lcnt); in quicki2c_restore()
929 thc_interrupt_config(qcdev->thc_hw); in quicki2c_restore()
931 thc_interrupt_enable(qcdev->thc_hw, true); in quicki2c_restore()
933 ret = thc_interrupt_quiesce(qcdev->thc_hw, false); in quicki2c_restore()
937 ret = thc_dma_configure(qcdev->thc_hw); in quicki2c_restore()
941 thc_ltr_config(qcdev->thc_hw, in quicki2c_restore()
942 qcdev->active_ltr_val, in quicki2c_restore()
943 qcdev->low_power_ltr_val); in quicki2c_restore()
945 thc_change_ltr_mode(qcdev->thc_hw, THC_LTR_MODE_ACTIVE); in quicki2c_restore()
953 struct quicki2c_device *qcdev; in quicki2c_runtime_suspend() local
955 qcdev = pci_get_drvdata(pdev); in quicki2c_runtime_suspend()
956 if (!qcdev) in quicki2c_runtime_suspend()
959 thc_change_ltr_mode(qcdev->thc_hw, THC_LTR_MODE_LP); in quicki2c_runtime_suspend()
969 struct quicki2c_device *qcdev; in quicki2c_runtime_resume() local
971 qcdev = pci_get_drvdata(pdev); in quicki2c_runtime_resume()
972 if (!qcdev) in quicki2c_runtime_resume()
975 thc_change_ltr_mode(qcdev->thc_hw, THC_LTR_MODE_ACTIVE); in quicki2c_runtime_resume()