Lines Matching defs:cobalt

3  *  cobalt driver initialization and card probing
19 #include "cobalt-driver.h"
20 #include "cobalt-irq.h"
21 #include "cobalt-i2c.h"
22 #include "cobalt-v4l2.h"
23 #include "cobalt-flash.h"
24 #include "cobalt-alsa.h"
25 #include "cobalt-omnitek.h"
48 MODULE_DESCRIPTION("cobalt driver");
87 static void cobalt_set_interrupt(struct cobalt *cobalt, bool enable)
104 if (cobalt->have_hsma_rx)
109 if (cobalt->have_hsma_tx)
114 cobalt_write_bar1(cobalt, COBALT_SYS_STAT_EDGE, 0xffffffff);
117 cobalt_write_bar1(cobalt, COBALT_SYS_STAT_MASK, irqs);
120 cobalt_write_bar1(cobalt, COBALT_SYS_STAT_MASK, 0);
126 struct cobalt *cobalt = to_cobalt(sd->v4l2_dev);
130 if (sd == cobalt->streams[i].sd)
139 struct cobalt *cobalt = to_cobalt(sd->v4l2_dev);
141 struct cobalt_stream *s = &cobalt->streams[sd_nr];
149 cobalt_s_bit_sysctrl(cobalt,
186 void cobalt_pcie_status_show(struct cobalt *cobalt)
188 struct pci_dev *pci_dev = cobalt->pci_dev;
189 struct pci_dev *pci_bus_dev = cobalt->pci_dev->bus->self;
235 static unsigned pcie_link_get_lanes(struct cobalt *cobalt)
237 struct pci_dev *pci_dev = cobalt->pci_dev;
246 static unsigned pcie_bus_link_get_lanes(struct cobalt *cobalt)
248 struct pci_dev *pci_dev = cobalt->pci_dev->bus->self;
257 static void msi_config_show(struct cobalt *cobalt, struct pci_dev *pci_dev)
279 static void cobalt_pci_iounmap(struct cobalt *cobalt, struct pci_dev *pci_dev)
281 if (cobalt->bar0) {
282 pci_iounmap(pci_dev, cobalt->bar0);
283 cobalt->bar0 = NULL;
285 if (cobalt->bar1) {
286 pci_iounmap(pci_dev, cobalt->bar1);
287 cobalt->bar1 = NULL;
291 static void cobalt_free_msi(struct cobalt *cobalt, struct pci_dev *pci_dev)
293 free_irq(pci_dev->irq, (void *)cobalt);
297 static int cobalt_setup_pci(struct cobalt *cobalt, struct pci_dev *pci_dev,
311 pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &cobalt->card_rev);
312 pci_read_config_word(pci_dev, PCI_DEVICE_ID, &cobalt->device_id);
314 switch (cobalt->device_id) {
323 if (pcie_link_get_lanes(cobalt) != 8) {
325 pcie_link_get_lanes(cobalt));
326 if (pcie_bus_link_get_lanes(cobalt) < 8)
328 pcie_bus_link_get_lanes(cobalt));
329 if (pcie_link_get_lanes(cobalt) != pcie_bus_link_get_lanes(cobalt)) {
344 ret = pci_request_regions(pci_dev, "cobalt");
350 cobalt_pcie_status_show(cobalt);
352 cobalt->bar0 = pci_iomap(pci_dev, 0, 0);
353 cobalt->bar1 = pci_iomap(pci_dev, 1, 0);
354 if (cobalt->bar1 == NULL) {
355 cobalt->bar1 = pci_iomap(pci_dev, 2, 0);
358 if (!cobalt->bar0 || !cobalt->bar1) {
364 ctrl = cobalt_read_bar1(cobalt, COBALT_SYS_CTRL_BASE);
365 cobalt_write_bar1(cobalt, COBALT_SYS_CTRL_BASE, ctrl & ~0xf00);
369 cobalt_set_interrupt(cobalt, false);
376 msi_config_show(cobalt, pci_dev);
380 cobalt->v4l2_dev.name, (void *)cobalt)) {
386 omni_sg_dma_init(cobalt);
393 cobalt_pci_iounmap(cobalt, pci_dev);
397 pci_disable_device(cobalt->pci_dev);
401 static int cobalt_hdl_info_get(struct cobalt *cobalt)
406 cobalt->hdl_info[i] =
407 ioread8(cobalt->bar1 + COBALT_HDL_INFO_BASE + i);
408 cobalt->hdl_info[COBALT_HDL_INFO_SIZE - 1] = '\0';
409 if (strstr(cobalt->hdl_info, COBALT_HDL_SEARCH_STR))
415 static void cobalt_stream_struct_init(struct cobalt *cobalt)
420 struct cobalt_stream *s = &cobalt->streams[i];
422 s->cobalt = cobalt;
433 s->dma_channel = i + cobalt->first_fifo_channel;
468 static int cobalt_subdevs_init(struct cobalt *cobalt)
490 struct cobalt_stream *s = cobalt->streams;
508 s[i].i2c_adap = &cobalt->i2c_adap[i];
511 cobalt_s_bit_sysctrl(cobalt,
513 s[i].sd = v4l2_i2c_new_subdev_board(&cobalt->v4l2_dev,
533 cobalt_s_bit_sysctrl(cobalt,
536 cobalt_s_bit_sysctrl(cobalt,
540 cobalt->streams[i + COBALT_AUDIO_IN_STREAM].is_dummy = false;
545 static int cobalt_subdevs_hsma_init(struct cobalt *cobalt)
598 struct cobalt_stream *s = &cobalt->streams[COBALT_HSMA_IN_NODE];
600 s->i2c_adap = &cobalt->i2c_adap[COBALT_NUM_ADAPTERS - 1];
603 cobalt_s_bit_sysctrl(cobalt, COBALT_SYS_CTRL_NRESET_TO_HDMI_BIT(4), 1);
605 s->sd = v4l2_i2c_new_subdev_board(&cobalt->v4l2_dev,
616 cobalt->have_hsma_rx = true;
619 cobalt->streams[4 + COBALT_AUDIO_IN_STREAM].is_dummy = false;
621 cobalt_s_bit_sysctrl(cobalt,
624 cobalt_s_bit_sysctrl(cobalt,
629 cobalt_s_bit_sysctrl(cobalt, COBALT_SYS_CTRL_NRESET_TO_HDMI_BIT(4), 0);
630 cobalt_s_bit_sysctrl(cobalt, COBALT_SYS_CTRL_PWRDN0_TO_HSMA_TX_BIT, 0);
632 s->i2c_adap = &cobalt->i2c_adap[COBALT_NUM_ADAPTERS - 1];
633 s->sd = v4l2_i2c_new_subdev_board(&cobalt->v4l2_dev,
637 cobalt_s_bit_sysctrl(cobalt,
639 cobalt_s_bit_sysctrl(cobalt,
641 cobalt_s_bit_sysctrl(cobalt,
643 cobalt->have_hsma_tx = true;
650 cobalt->streams[COBALT_AUDIO_OUT_STREAM].is_dummy = false;
659 struct cobalt *cobalt;
666 cobalt = kzalloc(sizeof(struct cobalt), GFP_KERNEL);
667 if (cobalt == NULL)
669 cobalt->pci_dev = pci_dev;
670 cobalt->instance = i;
671 mutex_init(&cobalt->pci_lock);
673 retval = v4l2_device_register(&pci_dev->dev, &cobalt->v4l2_dev);
675 pr_err("cobalt: v4l2_device_register of card %d failed\n",
676 cobalt->instance);
677 kfree(cobalt);
680 snprintf(cobalt->v4l2_dev.name, sizeof(cobalt->v4l2_dev.name),
681 "cobalt-%d", cobalt->instance);
682 cobalt->v4l2_dev.notify = cobalt_notify;
683 cobalt_info("Initializing card %d\n", cobalt->instance);
685 cobalt->irq_work_queues =
686 create_singlethread_workqueue(cobalt->v4l2_dev.name);
687 if (cobalt->irq_work_queues == NULL) {
693 INIT_WORK(&cobalt->irq_work_queue, cobalt_irq_work_handler);
696 retval = cobalt_setup_pci(cobalt, pci_dev, pci_id);
701 if (cobalt_hdl_info_get(cobalt))
704 cobalt_info("%s", cobalt->hdl_info);
706 retval = cobalt_i2c_init(cobalt);
710 cobalt_stream_struct_init(cobalt);
712 retval = cobalt_subdevs_init(cobalt);
716 if (!(cobalt_read_bar1(cobalt, COBALT_SYS_STAT_BASE) &
718 retval = cobalt_subdevs_hsma_init(cobalt);
723 retval = cobalt_nodes_register(cobalt);
728 cobalt_set_interrupt(cobalt, true);
729 v4l2_device_call_all(&cobalt->v4l2_dev, 0, core,
732 cobalt_info("Initialized cobalt card\n");
734 cobalt_flash_probe(cobalt);
739 cobalt_i2c_exit(cobalt);
740 cobalt_s_bit_sysctrl(cobalt, COBALT_SYS_CTRL_HSMA_TX_ENABLE_BIT, 0);
742 cobalt_free_msi(cobalt, pci_dev);
743 cobalt_pci_iounmap(cobalt, pci_dev);
744 pci_release_regions(cobalt->pci_dev);
745 pci_disable_device(cobalt->pci_dev);
747 destroy_workqueue(cobalt->irq_work_queues);
751 v4l2_device_unregister(&cobalt->v4l2_dev);
752 kfree(cobalt);
759 struct cobalt *cobalt = to_cobalt(v4l2_dev);
762 cobalt_flash_remove(cobalt);
763 cobalt_set_interrupt(cobalt, false);
764 flush_workqueue(cobalt->irq_work_queues);
765 cobalt_nodes_unregister(cobalt);
767 struct v4l2_subdev *sd = cobalt->streams[i].sd;
776 cobalt_i2c_exit(cobalt);
777 cobalt_free_msi(cobalt, pci_dev);
778 cobalt_s_bit_sysctrl(cobalt, COBALT_SYS_CTRL_HSMA_TX_ENABLE_BIT, 0);
779 cobalt_pci_iounmap(cobalt, pci_dev);
780 pci_release_regions(cobalt->pci_dev);
781 pci_disable_device(cobalt->pci_dev);
782 destroy_workqueue(cobalt->irq_work_queues);
784 cobalt_info("removed cobalt card\n");
787 kfree(cobalt);
792 .name = "cobalt",