Lines Matching refs:cobalt
97 static void cobalt_set_interrupt(struct cobalt *cobalt, bool enable) in cobalt_set_interrupt() argument
114 if (cobalt->have_hsma_rx) in cobalt_set_interrupt()
119 if (cobalt->have_hsma_tx) in cobalt_set_interrupt()
124 cobalt_write_bar1(cobalt, COBALT_SYS_STAT_EDGE, 0xffffffff); in cobalt_set_interrupt()
127 cobalt_write_bar1(cobalt, COBALT_SYS_STAT_MASK, irqs); in cobalt_set_interrupt()
130 cobalt_write_bar1(cobalt, COBALT_SYS_STAT_MASK, 0); in cobalt_set_interrupt()
136 struct cobalt *cobalt = to_cobalt(sd->v4l2_dev); in cobalt_get_sd_nr() local
140 if (sd == cobalt->streams[i].sd) in cobalt_get_sd_nr()
149 struct cobalt *cobalt = to_cobalt(sd->v4l2_dev); in cobalt_notify() local
151 struct cobalt_stream *s = &cobalt->streams[sd_nr]; in cobalt_notify()
159 cobalt_s_bit_sysctrl(cobalt, in cobalt_notify()
196 void cobalt_pcie_status_show(struct cobalt *cobalt) in cobalt_pcie_status_show() argument
198 struct pci_dev *pci_dev = cobalt->pci_dev; in cobalt_pcie_status_show()
199 struct pci_dev *pci_bus_dev = cobalt->pci_dev->bus->self; in cobalt_pcie_status_show()
247 static unsigned pcie_link_get_lanes(struct cobalt *cobalt) in pcie_link_get_lanes() argument
249 struct pci_dev *pci_dev = cobalt->pci_dev; in pcie_link_get_lanes()
260 static unsigned pcie_bus_link_get_lanes(struct cobalt *cobalt) in pcie_bus_link_get_lanes() argument
262 struct pci_dev *pci_dev = cobalt->pci_dev->bus->self; in pcie_bus_link_get_lanes()
273 static void msi_config_show(struct cobalt *cobalt, struct pci_dev *pci_dev) in msi_config_show() argument
295 static void cobalt_pci_iounmap(struct cobalt *cobalt, struct pci_dev *pci_dev) in cobalt_pci_iounmap() argument
297 if (cobalt->bar0) { in cobalt_pci_iounmap()
298 pci_iounmap(pci_dev, cobalt->bar0); in cobalt_pci_iounmap()
299 cobalt->bar0 = NULL; in cobalt_pci_iounmap()
301 if (cobalt->bar1) { in cobalt_pci_iounmap()
302 pci_iounmap(pci_dev, cobalt->bar1); in cobalt_pci_iounmap()
303 cobalt->bar1 = NULL; in cobalt_pci_iounmap()
307 static void cobalt_free_msi(struct cobalt *cobalt, struct pci_dev *pci_dev) in cobalt_free_msi() argument
309 free_irq(pci_dev->irq, (void *)cobalt); in cobalt_free_msi()
311 if (cobalt->msi_enabled) in cobalt_free_msi()
315 static int cobalt_setup_pci(struct cobalt *cobalt, struct pci_dev *pci_dev, in cobalt_setup_pci() argument
329 pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &cobalt->card_rev); in cobalt_setup_pci()
330 pci_read_config_word(pci_dev, PCI_DEVICE_ID, &cobalt->device_id); in cobalt_setup_pci()
332 switch (cobalt->device_id) { in cobalt_setup_pci()
341 if (pcie_link_get_lanes(cobalt) != 8) { in cobalt_setup_pci()
343 pcie_link_get_lanes(cobalt)); in cobalt_setup_pci()
344 if (pcie_bus_link_get_lanes(cobalt) < 8) in cobalt_setup_pci()
346 pcie_bus_link_get_lanes(cobalt)); in cobalt_setup_pci()
347 if (pcie_link_get_lanes(cobalt) != pcie_bus_link_get_lanes(cobalt)) { in cobalt_setup_pci()
368 cobalt_pcie_status_show(cobalt); in cobalt_setup_pci()
370 cobalt->bar0 = pci_iomap(pci_dev, 0, 0); in cobalt_setup_pci()
371 cobalt->bar1 = pci_iomap(pci_dev, 1, 0); in cobalt_setup_pci()
372 if (cobalt->bar1 == NULL) { in cobalt_setup_pci()
373 cobalt->bar1 = pci_iomap(pci_dev, 2, 0); in cobalt_setup_pci()
376 if (!cobalt->bar0 || !cobalt->bar1) { in cobalt_setup_pci()
382 ctrl = cobalt_read_bar1(cobalt, COBALT_SYS_CTRL_BASE); in cobalt_setup_pci()
383 cobalt_write_bar1(cobalt, COBALT_SYS_CTRL_BASE, ctrl & ~0xf00); in cobalt_setup_pci()
387 cobalt_set_interrupt(cobalt, false); in cobalt_setup_pci()
391 cobalt->msi_enabled = false; in cobalt_setup_pci()
395 msi_config_show(cobalt, pci_dev); in cobalt_setup_pci()
396 cobalt->msi_enabled = true; in cobalt_setup_pci()
400 cobalt->v4l2_dev.name, (void *)cobalt)) { in cobalt_setup_pci()
406 omni_sg_dma_init(cobalt); in cobalt_setup_pci()
413 cobalt_pci_iounmap(cobalt, pci_dev); in cobalt_setup_pci()
417 pci_disable_device(cobalt->pci_dev); in cobalt_setup_pci()
421 static int cobalt_hdl_info_get(struct cobalt *cobalt) in cobalt_hdl_info_get() argument
426 cobalt->hdl_info[i] = in cobalt_hdl_info_get()
427 ioread8(cobalt->bar1 + COBALT_HDL_INFO_BASE + i); in cobalt_hdl_info_get()
428 cobalt->hdl_info[COBALT_HDL_INFO_SIZE - 1] = '\0'; in cobalt_hdl_info_get()
429 if (strstr(cobalt->hdl_info, COBALT_HDL_SEARCH_STR)) in cobalt_hdl_info_get()
435 static void cobalt_stream_struct_init(struct cobalt *cobalt) in cobalt_stream_struct_init() argument
440 struct cobalt_stream *s = &cobalt->streams[i]; in cobalt_stream_struct_init()
442 s->cobalt = cobalt; in cobalt_stream_struct_init()
453 s->dma_channel = i + cobalt->first_fifo_channel; in cobalt_stream_struct_init()
488 static int cobalt_subdevs_init(struct cobalt *cobalt) in cobalt_subdevs_init() argument
511 struct cobalt_stream *s = cobalt->streams; in cobalt_subdevs_init()
529 s[i].i2c_adap = &cobalt->i2c_adap[i]; in cobalt_subdevs_init()
532 cobalt_s_bit_sysctrl(cobalt, in cobalt_subdevs_init()
534 s[i].sd = v4l2_i2c_new_subdev_board(&cobalt->v4l2_dev, in cobalt_subdevs_init()
554 cobalt_s_bit_sysctrl(cobalt, in cobalt_subdevs_init()
557 cobalt_s_bit_sysctrl(cobalt, in cobalt_subdevs_init()
561 cobalt->streams[i + COBALT_AUDIO_IN_STREAM].is_dummy = false; in cobalt_subdevs_init()
566 static int cobalt_subdevs_hsma_init(struct cobalt *cobalt) in cobalt_subdevs_hsma_init() argument
620 struct cobalt_stream *s = &cobalt->streams[COBALT_HSMA_IN_NODE]; in cobalt_subdevs_hsma_init()
622 s->i2c_adap = &cobalt->i2c_adap[COBALT_NUM_ADAPTERS - 1]; in cobalt_subdevs_hsma_init()
625 cobalt_s_bit_sysctrl(cobalt, COBALT_SYS_CTRL_NRESET_TO_HDMI_BIT(4), 1); in cobalt_subdevs_hsma_init()
627 s->sd = v4l2_i2c_new_subdev_board(&cobalt->v4l2_dev, in cobalt_subdevs_hsma_init()
638 cobalt->have_hsma_rx = true; in cobalt_subdevs_hsma_init()
641 cobalt->streams[4 + COBALT_AUDIO_IN_STREAM].is_dummy = false; in cobalt_subdevs_hsma_init()
643 cobalt_s_bit_sysctrl(cobalt, in cobalt_subdevs_hsma_init()
646 cobalt_s_bit_sysctrl(cobalt, in cobalt_subdevs_hsma_init()
651 cobalt_s_bit_sysctrl(cobalt, COBALT_SYS_CTRL_NRESET_TO_HDMI_BIT(4), 0); in cobalt_subdevs_hsma_init()
652 cobalt_s_bit_sysctrl(cobalt, COBALT_SYS_CTRL_PWRDN0_TO_HSMA_TX_BIT, 0); in cobalt_subdevs_hsma_init()
654 s->i2c_adap = &cobalt->i2c_adap[COBALT_NUM_ADAPTERS - 1]; in cobalt_subdevs_hsma_init()
655 s->sd = v4l2_i2c_new_subdev_board(&cobalt->v4l2_dev, in cobalt_subdevs_hsma_init()
659 cobalt_s_bit_sysctrl(cobalt, in cobalt_subdevs_hsma_init()
661 cobalt_s_bit_sysctrl(cobalt, in cobalt_subdevs_hsma_init()
663 cobalt_s_bit_sysctrl(cobalt, in cobalt_subdevs_hsma_init()
665 cobalt->have_hsma_tx = true; in cobalt_subdevs_hsma_init()
672 cobalt->streams[COBALT_AUDIO_OUT_STREAM].is_dummy = false; in cobalt_subdevs_hsma_init()
681 struct cobalt *cobalt; in cobalt_probe() local
688 cobalt = kzalloc(sizeof(struct cobalt), GFP_ATOMIC); in cobalt_probe()
689 if (cobalt == NULL) in cobalt_probe()
691 cobalt->pci_dev = pci_dev; in cobalt_probe()
692 cobalt->instance = i; in cobalt_probe()
694 cobalt->alloc_ctx = vb2_dma_sg_init_ctx(&pci_dev->dev); in cobalt_probe()
695 if (IS_ERR(cobalt->alloc_ctx)) { in cobalt_probe()
696 kfree(cobalt); in cobalt_probe()
700 retval = v4l2_device_register(&pci_dev->dev, &cobalt->v4l2_dev); in cobalt_probe()
703 cobalt->instance); in cobalt_probe()
704 vb2_dma_sg_cleanup_ctx(cobalt->alloc_ctx); in cobalt_probe()
705 kfree(cobalt); in cobalt_probe()
708 snprintf(cobalt->v4l2_dev.name, sizeof(cobalt->v4l2_dev.name), in cobalt_probe()
709 "cobalt-%d", cobalt->instance); in cobalt_probe()
710 cobalt->v4l2_dev.notify = cobalt_notify; in cobalt_probe()
711 cobalt_info("Initializing card %d\n", cobalt->instance); in cobalt_probe()
713 cobalt->irq_work_queues = in cobalt_probe()
714 create_singlethread_workqueue(cobalt->v4l2_dev.name); in cobalt_probe()
715 if (cobalt->irq_work_queues == NULL) { in cobalt_probe()
721 INIT_WORK(&cobalt->irq_work_queue, cobalt_irq_work_handler); in cobalt_probe()
724 retval = cobalt_setup_pci(cobalt, pci_dev, pci_id); in cobalt_probe()
729 if (cobalt_hdl_info_get(cobalt)) in cobalt_probe()
732 cobalt_info("%s", cobalt->hdl_info); in cobalt_probe()
734 retval = cobalt_i2c_init(cobalt); in cobalt_probe()
738 cobalt_stream_struct_init(cobalt); in cobalt_probe()
740 retval = cobalt_subdevs_init(cobalt); in cobalt_probe()
744 if (!(cobalt_read_bar1(cobalt, COBALT_SYS_STAT_BASE) & in cobalt_probe()
746 retval = cobalt_subdevs_hsma_init(cobalt); in cobalt_probe()
751 retval = v4l2_device_register_subdev_nodes(&cobalt->v4l2_dev); in cobalt_probe()
754 retval = cobalt_nodes_register(cobalt); in cobalt_probe()
759 cobalt_set_interrupt(cobalt, true); in cobalt_probe()
760 v4l2_device_call_all(&cobalt->v4l2_dev, 0, core, in cobalt_probe()
765 cobalt_flash_probe(cobalt); in cobalt_probe()
770 cobalt_i2c_exit(cobalt); in cobalt_probe()
771 cobalt_s_bit_sysctrl(cobalt, COBALT_SYS_CTRL_HSMA_TX_ENABLE_BIT, 0); in cobalt_probe()
773 cobalt_free_msi(cobalt, pci_dev); in cobalt_probe()
774 cobalt_pci_iounmap(cobalt, pci_dev); in cobalt_probe()
775 pci_release_regions(cobalt->pci_dev); in cobalt_probe()
776 pci_disable_device(cobalt->pci_dev); in cobalt_probe()
778 destroy_workqueue(cobalt->irq_work_queues); in cobalt_probe()
784 v4l2_device_unregister(&cobalt->v4l2_dev); in cobalt_probe()
785 vb2_dma_sg_cleanup_ctx(cobalt->alloc_ctx); in cobalt_probe()
786 kfree(cobalt); in cobalt_probe()
793 struct cobalt *cobalt = to_cobalt(v4l2_dev); in cobalt_remove() local
796 cobalt_flash_remove(cobalt); in cobalt_remove()
797 cobalt_set_interrupt(cobalt, false); in cobalt_remove()
798 flush_workqueue(cobalt->irq_work_queues); in cobalt_remove()
799 cobalt_nodes_unregister(cobalt); in cobalt_remove()
801 struct v4l2_subdev *sd = cobalt->streams[i].sd; in cobalt_remove()
810 cobalt_i2c_exit(cobalt); in cobalt_remove()
811 cobalt_free_msi(cobalt, pci_dev); in cobalt_remove()
812 cobalt_s_bit_sysctrl(cobalt, COBALT_SYS_CTRL_HSMA_TX_ENABLE_BIT, 0); in cobalt_remove()
813 cobalt_pci_iounmap(cobalt, pci_dev); in cobalt_remove()
814 pci_release_regions(cobalt->pci_dev); in cobalt_remove()
815 pci_disable_device(cobalt->pci_dev); in cobalt_remove()
816 destroy_workqueue(cobalt->irq_work_queues); in cobalt_remove()
821 vb2_dma_sg_cleanup_ctx(cobalt->alloc_ctx); in cobalt_remove()
822 kfree(cobalt); in cobalt_remove()