Lines Matching refs:priv
80 static int fpga_dma_init(struct fpga_dev *priv, int nr_pages) in fpga_dma_init() argument
85 priv->vaddr = vmalloc_32(nr_pages << PAGE_SHIFT); in fpga_dma_init()
86 if (NULL == priv->vaddr) { in fpga_dma_init()
92 (unsigned long)priv->vaddr, in fpga_dma_init()
95 memset(priv->vaddr, 0, nr_pages << PAGE_SHIFT); in fpga_dma_init()
96 priv->nr_pages = nr_pages; in fpga_dma_init()
98 priv->sglist = vzalloc(priv->nr_pages * sizeof(*priv->sglist)); in fpga_dma_init()
99 if (NULL == priv->sglist) in fpga_dma_init()
102 sg_init_table(priv->sglist, priv->nr_pages); in fpga_dma_init()
103 for (i = 0; i < priv->nr_pages; i++) { in fpga_dma_init()
104 pg = vmalloc_to_page(priv->vaddr + i * PAGE_SIZE); in fpga_dma_init()
107 sg_set_page(&priv->sglist[i], pg, PAGE_SIZE, 0); in fpga_dma_init()
112 vfree(priv->sglist); in fpga_dma_init()
113 priv->sglist = NULL; in fpga_dma_init()
115 vfree(priv->vaddr); in fpga_dma_init()
116 priv->vaddr = NULL; in fpga_dma_init()
120 static int fpga_dma_map(struct fpga_dev *priv) in fpga_dma_map() argument
122 priv->sglen = dma_map_sg(priv->dev, priv->sglist, in fpga_dma_map()
123 priv->nr_pages, DMA_TO_DEVICE); in fpga_dma_map()
125 if (0 == priv->sglen) { in fpga_dma_map()
132 static int fpga_dma_unmap(struct fpga_dev *priv) in fpga_dma_unmap() argument
134 if (!priv->sglen) in fpga_dma_unmap()
137 dma_unmap_sg(priv->dev, priv->sglist, priv->sglen, DMA_TO_DEVICE); in fpga_dma_unmap()
138 priv->sglen = 0; in fpga_dma_unmap()
152 static void fpga_drop_firmware_data(struct fpga_dev *priv) in fpga_drop_firmware_data() argument
154 vfree(priv->sglist); in fpga_drop_firmware_data()
155 vfree(priv->vaddr); in fpga_drop_firmware_data()
156 priv->buf_allocated = false; in fpga_drop_firmware_data()
157 priv->bytes = 0; in fpga_drop_firmware_data()
166 struct fpga_dev *priv = container_of(ref, struct fpga_dev, ref); in fpga_dev_remove() local
169 fpga_drop_firmware_data(priv); in fpga_dev_remove()
171 mutex_destroy(&priv->lock); in fpga_dev_remove()
172 kfree(priv); in fpga_dev_remove()
239 static void fpga_programmer_enable(struct fpga_dev *priv, bool dma) in fpga_programmer_enable() argument
244 iowrite32be(val, priv->regs + FPGA_CONFIG_CONTROL); in fpga_programmer_enable()
247 static void fpga_programmer_disable(struct fpga_dev *priv) in fpga_programmer_disable() argument
249 iowrite32be(0x0, priv->regs + FPGA_CONFIG_CONTROL); in fpga_programmer_disable()
252 static void fpga_dump_registers(struct fpga_dev *priv) in fpga_dump_registers() argument
257 if (priv->status == 0) in fpga_dump_registers()
261 control = ioread32be(priv->regs + FPGA_CONFIG_CONTROL); in fpga_dump_registers()
262 status = ioread32be(priv->regs + FPGA_CONFIG_STATUS); in fpga_dump_registers()
263 size = ioread32be(priv->regs + FPGA_CONFIG_FIFO_SIZE); in fpga_dump_registers()
264 used = ioread32be(priv->regs + FPGA_CONFIG_FIFO_USED); in fpga_dump_registers()
265 total = ioread32be(priv->regs + FPGA_CONFIG_TOTAL_BYTE_COUNT); in fpga_dump_registers()
266 curr = ioread32be(priv->regs + FPGA_CONFIG_CUR_BYTE_COUNT); in fpga_dump_registers()
268 dev_err(priv->dev, "Configuration failed, dumping status registers\n"); in fpga_dump_registers()
269 dev_err(priv->dev, "Control: 0x%.8x\n", control); in fpga_dump_registers()
270 dev_err(priv->dev, "Status: 0x%.8x\n", status); in fpga_dump_registers()
271 dev_err(priv->dev, "FIFO Size: 0x%.8x\n", size); in fpga_dump_registers()
272 dev_err(priv->dev, "FIFO Used: 0x%.8x\n", used); in fpga_dump_registers()
273 dev_err(priv->dev, "FIFO Total: 0x%.8x\n", total); in fpga_dump_registers()
274 dev_err(priv->dev, "FIFO Curr: 0x%.8x\n", curr); in fpga_dump_registers()
293 static bool fpga_power_good(struct fpga_dev *priv) in fpga_power_good() argument
297 val = ioread8(priv->regs + CTL_PWR_STATUS); in fpga_power_good()
307 static void fpga_disable_power_supplies(struct fpga_dev *priv) in fpga_disable_power_supplies() argument
312 iowrite8(0x0, priv->regs + CTL_PWR_CONTROL); in fpga_disable_power_supplies()
332 val = ioread8(priv->regs + CTL_PWR_STATUS); in fpga_disable_power_supplies()
339 val = ioread8(priv->regs + CTL_PWR_STATUS); in fpga_disable_power_supplies()
341 dev_err(priv->dev, "power disable failed: " in fpga_disable_power_supplies()
346 dev_err(priv->dev, "power disable failed: " in fpga_disable_power_supplies()
360 static int fpga_enable_power_supplies(struct fpga_dev *priv) in fpga_enable_power_supplies() argument
364 if (fpga_power_good(priv)) { in fpga_enable_power_supplies()
365 dev_dbg(priv->dev, "power was already good\n"); in fpga_enable_power_supplies()
369 iowrite8(PWR_CONTROL_ENABLE, priv->regs + CTL_PWR_CONTROL); in fpga_enable_power_supplies()
371 if (fpga_power_good(priv)) in fpga_enable_power_supplies()
377 return fpga_power_good(priv) ? 0 : -ETIMEDOUT; in fpga_enable_power_supplies()
383 static bool fpga_power_enabled(struct fpga_dev *priv) in fpga_power_enabled() argument
387 val = ioread8(priv->regs + CTL_PWR_CONTROL); in fpga_power_enabled()
397 static bool fpga_running(struct fpga_dev *priv) in fpga_running() argument
399 if (!fpga_power_good(priv)) in fpga_running()
403 return ioread32be(priv->regs + FPGA_CONFIG_STATUS) & (1 << 18); in fpga_running()
418 static int fpga_program_block(struct fpga_dev *priv, void *buf, size_t count) in fpga_program_block() argument
421 int size = fpga_fifo_size(priv->regs); in fpga_program_block()
436 fpga_fifo_write(priv->regs, data[i]); in fpga_program_block()
445 if (fpga_fifo_empty(priv->regs)) { in fpga_program_block()
448 dev_dbg(priv->dev, "Fifo not empty\n"); in fpga_program_block()
452 if (fpga_config_error(priv->regs)) { in fpga_program_block()
453 dev_err(priv->dev, "Error detected\n"); in fpga_program_block()
458 dev_err(priv->dev, "Fifo drain timeout\n"); in fpga_program_block()
479 static noinline int fpga_program_cpu(struct fpga_dev *priv) in fpga_program_cpu() argument
485 fpga_programmer_disable(priv); in fpga_program_cpu()
488 fpga_set_byte_count(priv->regs, priv->bytes); in fpga_program_cpu()
489 dev_dbg(priv->dev, "total byte count %u bytes\n", priv->bytes); in fpga_program_cpu()
492 fpga_programmer_enable(priv, false); in fpga_program_cpu()
493 dev_dbg(priv->dev, "enabled the controller\n"); in fpga_program_cpu()
496 ret = fpga_program_block(priv, priv->vaddr, priv->bytes); in fpga_program_cpu()
501 timeout = wait_for_completion_timeout(&priv->completion, 2 * HZ); in fpga_program_cpu()
503 dev_err(priv->dev, "Timed out waiting for completion\n"); in fpga_program_cpu()
509 ret = priv->status; in fpga_program_cpu()
512 fpga_programmer_disable(priv); in fpga_program_cpu()
530 static noinline int fpga_program_dma(struct fpga_dev *priv) in fpga_program_dma() argument
532 struct dma_chan *chan = priv->chan; in fpga_program_dma()
543 fpga_programmer_disable(priv); in fpga_program_dma()
546 num_pages = DIV_ROUND_UP(priv->bytes, FIFO_MAX_LEN); in fpga_program_dma()
549 dev_err(priv->dev, "Unable to allocate dst scatterlist\n"); in fpga_program_dma()
564 avail = priv->bytes; in fpga_program_dma()
574 ret = fpga_dma_map(priv); in fpga_program_dma()
576 dev_err(priv->dev, "Unable to map buffer for DMA\n"); in fpga_program_dma()
587 config.dst_maxburst = fpga_fifo_size(priv->regs) / 2 / 4; in fpga_program_dma()
590 dev_err(priv->dev, "DMA slave configuration failed\n"); in fpga_program_dma()
596 dev_err(priv->dev, "DMA external control setup failed\n"); in fpga_program_dma()
603 priv->sglist, priv->sglen, 0); in fpga_program_dma()
605 dev_err(priv->dev, "Unable to prep DMA transaction\n"); in fpga_program_dma()
612 dev_err(priv->dev, "Unable to submit DMA transaction\n"); in fpga_program_dma()
620 fpga_set_byte_count(priv->regs, priv->bytes); in fpga_program_dma()
621 dev_dbg(priv->dev, "total byte count %u bytes\n", priv->bytes); in fpga_program_dma()
624 fpga_programmer_enable(priv, true); in fpga_program_dma()
625 dev_dbg(priv->dev, "enabled the controller\n"); in fpga_program_dma()
628 timeout = wait_for_completion_timeout(&priv->completion, 2 * HZ); in fpga_program_dma()
630 dev_err(priv->dev, "Timed out waiting for completion\n"); in fpga_program_dma()
636 ret = priv->status; in fpga_program_dma()
639 fpga_programmer_disable(priv); in fpga_program_dma()
641 fpga_dma_unmap(priv); in fpga_program_dma()
654 struct fpga_dev *priv = dev_id; in fpga_irq() local
657 priv->status = fpga_config_error(priv->regs) ? -EIO : 0; in fpga_irq()
658 dev_dbg(priv->dev, "INTERRUPT status %d\n", priv->status); in fpga_irq()
659 fpga_dump_registers(priv); in fpga_irq()
662 fpga_programmer_disable(priv); in fpga_irq()
665 complete(&priv->completion); in fpga_irq()
680 static int fpga_do_stop(struct fpga_dev *priv) in fpga_do_stop() argument
689 iowrite32be(val, priv->regs + FPGA_CONFIG_CONTROL); in fpga_do_stop()
690 iowrite32be(0x0, priv->regs + FPGA_CONFIG_CONTROL); in fpga_do_stop()
695 static noinline int fpga_do_program(struct fpga_dev *priv) in fpga_do_program() argument
699 if (priv->bytes != priv->fw_size) { in fpga_do_program()
700 dev_err(priv->dev, "Incorrect bitfile size: got %zu bytes, " in fpga_do_program()
702 priv->bytes, priv->fw_size); in fpga_do_program()
706 if (!fpga_power_enabled(priv)) { in fpga_do_program()
707 dev_err(priv->dev, "Power not enabled\n"); in fpga_do_program()
711 if (!fpga_power_good(priv)) { in fpga_do_program()
712 dev_err(priv->dev, "Power not good\n"); in fpga_do_program()
720 ret = fpga_program_dma(priv); in fpga_do_program()
724 dev_warn(priv->dev, "Falling back to CPU programming\n"); in fpga_do_program()
725 ret = fpga_program_cpu(priv); in fpga_do_program()
729 dev_err(priv->dev, "Unable to program FPGA's\n"); in fpga_do_program()
734 fpga_drop_firmware_data(priv); in fpga_do_program()
736 dev_dbg(priv->dev, "FPGA programming successful\n"); in fpga_do_program()
753 struct fpga_dev *priv = container_of(filp->private_data, in fpga_open() local
759 ret = mutex_lock_interruptible(&priv->lock); in fpga_open()
763 filp->private_data = priv; in fpga_open()
764 kref_get(&priv->ref); in fpga_open()
768 priv->bytes = 0; in fpga_open()
771 if (priv->buf_allocated) in fpga_open()
775 nr_pages = DIV_ROUND_UP(priv->fw_size, PAGE_SIZE); in fpga_open()
776 ret = fpga_dma_init(priv, nr_pages); in fpga_open()
778 dev_err(priv->dev, "unable to allocate data buffer\n"); in fpga_open()
779 mutex_unlock(&priv->lock); in fpga_open()
780 kref_put(&priv->ref, fpga_dev_remove); in fpga_open()
784 priv->buf_allocated = true; in fpga_open()
790 struct fpga_dev *priv = filp->private_data; in fpga_release() local
792 mutex_unlock(&priv->lock); in fpga_release()
793 kref_put(&priv->ref, fpga_dev_remove); in fpga_release()
800 struct fpga_dev *priv = filp->private_data; in fpga_write() local
803 if (priv->bytes >= priv->fw_size) in fpga_write()
806 count = min_t(size_t, priv->fw_size - priv->bytes, count); in fpga_write()
807 if (copy_from_user(priv->vaddr + priv->bytes, buf, count)) in fpga_write()
810 priv->bytes += count; in fpga_write()
817 struct fpga_dev *priv = filp->private_data; in fpga_read() local
819 priv->vaddr, priv->bytes); in fpga_read()
824 struct fpga_dev *priv = filp->private_data; in fpga_llseek() local
830 return fixed_size_llseek(filp, offset, origin, priv->fw_size); in fpga_llseek()
848 struct fpga_dev *priv = dev_get_drvdata(dev); in pfail_show() local
851 val = ioread8(priv->regs + CTL_PWR_FAIL); in pfail_show()
858 struct fpga_dev *priv = dev_get_drvdata(dev); in pgood_show() local
859 return snprintf(buf, PAGE_SIZE, "%d\n", fpga_power_good(priv)); in pgood_show()
865 struct fpga_dev *priv = dev_get_drvdata(dev); in penable_show() local
866 return snprintf(buf, PAGE_SIZE, "%d\n", fpga_power_enabled(priv)); in penable_show()
872 struct fpga_dev *priv = dev_get_drvdata(dev); in penable_store() local
881 ret = fpga_enable_power_supplies(priv); in penable_store()
885 fpga_do_stop(priv); in penable_store()
886 fpga_disable_power_supplies(priv); in penable_store()
895 struct fpga_dev *priv = dev_get_drvdata(dev); in program_show() local
896 return snprintf(buf, PAGE_SIZE, "%d\n", fpga_running(priv)); in program_show()
902 struct fpga_dev *priv = dev_get_drvdata(dev); in program_store() local
911 if (mutex_lock_interruptible(&priv->lock)) in program_store()
915 ret = val ? fpga_do_program(priv) : fpga_do_stop(priv); in program_store()
923 mutex_unlock(&priv->lock); in program_store()
967 struct fpga_dev *priv = platform_get_drvdata(op); in fpga_of_remove() local
968 struct device *this_device = priv->miscdev.this_device; in fpga_of_remove()
971 misc_deregister(&priv->miscdev); in fpga_of_remove()
973 free_irq(priv->irq, priv); in fpga_of_remove()
974 irq_dispose_mapping(priv->irq); in fpga_of_remove()
977 fpga_disable_power_supplies(priv); in fpga_of_remove()
980 iounmap(priv->immr); in fpga_of_remove()
981 iounmap(priv->regs); in fpga_of_remove()
983 dma_release_channel(priv->chan); in fpga_of_remove()
986 kref_put(&priv->ref, fpga_dev_remove); in fpga_of_remove()
997 struct fpga_dev *priv; in fpga_of_probe() local
1003 priv = kzalloc(sizeof(*priv), GFP_KERNEL); in fpga_of_probe()
1004 if (!priv) { in fpga_of_probe()
1011 priv->miscdev.minor = MISC_DYNAMIC_MINOR; in fpga_of_probe()
1012 priv->miscdev.name = drv_name; in fpga_of_probe()
1013 priv->miscdev.fops = &fpga_fops; in fpga_of_probe()
1015 kref_init(&priv->ref); in fpga_of_probe()
1017 platform_set_drvdata(op, priv); in fpga_of_probe()
1018 priv->dev = &op->dev; in fpga_of_probe()
1019 mutex_init(&priv->lock); in fpga_of_probe()
1020 init_completion(&priv->completion); in fpga_of_probe()
1022 dev_set_drvdata(priv->dev, priv); in fpga_of_probe()
1029 priv->chan = dma_request_channel(mask, dma_filter, NULL); in fpga_of_probe()
1030 if (!priv->chan) { in fpga_of_probe()
1037 priv->regs = of_iomap(of_node, 0); in fpga_of_probe()
1038 if (!priv->regs) { in fpga_of_probe()
1045 priv->immr = ioremap(get_immrbase(), 0x100000); in fpga_of_probe()
1046 if (!priv->immr) { in fpga_of_probe()
1060 if ((ioread32be(priv->immr + 0x114) & 0xE00) != 0xE00) { in fpga_of_probe()
1076 ver = ioread8(priv->regs + CTL_CPLD_VERSION); in fpga_of_probe()
1084 ver = ioread32be(priv->regs + SYS_REG_VERSION); in fpga_of_probe()
1085 priv->fw_size = (ver & (1 << 18)) ? FW_SIZE_EP2S130 : FW_SIZE_EP2S90; in fpga_of_probe()
1088 priv->irq = irq_of_parse_and_map(of_node, 0); in fpga_of_probe()
1089 if (priv->irq == NO_IRQ) { in fpga_of_probe()
1096 ret = request_irq(priv->irq, fpga_irq, IRQF_SHARED, drv_name, priv); in fpga_of_probe()
1098 dev_err(&op->dev, "Unable to request IRQ %d\n", priv->irq); in fpga_of_probe()
1104 fpga_do_stop(priv); in fpga_of_probe()
1107 ret = misc_register(&priv->miscdev); in fpga_of_probe()
1114 this_device = priv->miscdev.this_device; in fpga_of_probe()
1115 dev_set_drvdata(this_device, priv); in fpga_of_probe()
1122 dev_info(priv->dev, "CARMA FPGA Programmer: %s rev%s with %s FPGAs\n", in fpga_of_probe()
1130 misc_deregister(&priv->miscdev); in fpga_of_probe()
1132 free_irq(priv->irq, priv); in fpga_of_probe()
1134 irq_dispose_mapping(priv->irq); in fpga_of_probe()
1136 iounmap(priv->immr); in fpga_of_probe()
1138 iounmap(priv->regs); in fpga_of_probe()
1140 dma_release_channel(priv->chan); in fpga_of_probe()
1142 kref_put(&priv->ref, fpga_dev_remove); in fpga_of_probe()