Lines Matching +full:partial +full:- +full:fpga +full:- +full:config

26  *     (c) Copyright 2007-2008 Xilinx Inc.
36 * This is the code behind /dev/icap* -- it allows a user-space
64 * user-space application code that uses this device. The simplest
69 * Note that unless foo.bit is an appropriately constructed partial
71 * currently programmed in the FPGA.
218 * hwicap_command_desync - Send a DESYNC command to the ICAP port.
235 buffer[index++] = hwicap_type_1_write(drvdata->config_regs->CMD) | 1; in hwicap_command_desync()
244 return drvdata->config->set_configuration(drvdata, in hwicap_command_desync()
249 * hwicap_get_configuration_register - Query a configuration register.
281 status = drvdata->config->set_configuration(drvdata, in hwicap_get_configuration_register()
287 status = drvdata->config->get_status(drvdata); in hwicap_get_configuration_register()
289 return -EIO; in hwicap_get_configuration_register()
300 status = drvdata->config->set_configuration(drvdata, in hwicap_get_configuration_register()
308 status = drvdata->config->get_configuration(drvdata, reg_data, 1); in hwicap_get_configuration_register()
320 dev_dbg(drvdata->dev, "initializing\n"); in hwicap_initialize_hwicap()
325 dev_dbg(drvdata->dev, "Reset...\n"); in hwicap_initialize_hwicap()
326 drvdata->config->reset(drvdata); in hwicap_initialize_hwicap()
328 dev_dbg(drvdata->dev, "Desync...\n"); in hwicap_initialize_hwicap()
337 dev_dbg(drvdata->dev, "Reading IDCODE...\n"); in hwicap_initialize_hwicap()
339 drvdata, drvdata->config_regs->IDCODE, &idcode); in hwicap_initialize_hwicap()
340 dev_dbg(drvdata->dev, "IDCODE = %x\n", idcode); in hwicap_initialize_hwicap()
344 dev_dbg(drvdata->dev, "Desync...\n"); in hwicap_initialize_hwicap()
355 struct hwicap_drvdata *drvdata = file->private_data; in hwicap_read()
362 status = mutex_lock_interruptible(&drvdata->sem); in hwicap_read()
366 if (drvdata->read_buffer_in_use) { in hwicap_read()
371 (count < drvdata->read_buffer_in_use) ? count : in hwicap_read()
372 drvdata->read_buffer_in_use; in hwicap_read()
375 if (copy_to_user(buf, drvdata->read_buffer, bytes_to_read)) { in hwicap_read()
376 status = -EFAULT; in hwicap_read()
379 drvdata->read_buffer_in_use -= bytes_to_read; in hwicap_read()
380 memmove(drvdata->read_buffer, in hwicap_read()
381 drvdata->read_buffer + bytes_to_read, in hwicap_read()
382 4 - bytes_to_read); in hwicap_read()
387 status = -ENOMEM; in hwicap_read()
410 status = drvdata->config->get_configuration(drvdata, in hwicap_read()
422 status = -EFAULT; in hwicap_read()
425 memcpy(drvdata->read_buffer, in hwicap_read()
428 drvdata->read_buffer_in_use = bytes_remaining; in hwicap_read()
433 mutex_unlock(&drvdata->sem); in hwicap_read()
441 struct hwicap_drvdata *drvdata = file->private_data; in hwicap_write()
448 status = mutex_lock_interruptible(&drvdata->sem); in hwicap_write()
452 left += drvdata->write_buffer_in_use; in hwicap_write()
462 status = -ENOMEM; in hwicap_write()
475 if (drvdata->write_buffer_in_use) { in hwicap_write()
476 memcpy(kbuf, drvdata->write_buffer, in hwicap_write()
477 drvdata->write_buffer_in_use); in hwicap_write()
479 (((char *)kbuf) + drvdata->write_buffer_in_use), in hwicap_write()
481 len - (drvdata->write_buffer_in_use))) { in hwicap_write()
483 status = -EFAULT; in hwicap_write()
489 status = -EFAULT; in hwicap_write()
494 status = drvdata->config->set_configuration(drvdata, in hwicap_write()
499 status = -EFAULT; in hwicap_write()
502 if (drvdata->write_buffer_in_use) { in hwicap_write()
503 len -= drvdata->write_buffer_in_use; in hwicap_write()
504 left -= drvdata->write_buffer_in_use; in hwicap_write()
505 drvdata->write_buffer_in_use = 0; in hwicap_write()
508 left -= len; in hwicap_write()
511 if (!copy_from_user(drvdata->write_buffer, in hwicap_write()
513 drvdata->write_buffer_in_use = left; in hwicap_write()
522 mutex_unlock(&drvdata->sem); in hwicap_write()
532 drvdata = container_of(inode->i_cdev, struct hwicap_drvdata, cdev); in hwicap_open()
534 status = mutex_lock_interruptible(&drvdata->sem); in hwicap_open()
538 if (drvdata->is_open) { in hwicap_open()
539 status = -EBUSY; in hwicap_open()
545 dev_err(drvdata->dev, "Failed to open file"); in hwicap_open()
549 file->private_data = drvdata; in hwicap_open()
550 drvdata->write_buffer_in_use = 0; in hwicap_open()
551 drvdata->read_buffer_in_use = 0; in hwicap_open()
552 drvdata->is_open = 1; in hwicap_open()
555 mutex_unlock(&drvdata->sem); in hwicap_open()
563 struct hwicap_drvdata *drvdata = file->private_data; in hwicap_release()
567 mutex_lock(&drvdata->sem); in hwicap_release()
569 if (drvdata->write_buffer_in_use) { in hwicap_release()
571 for (i = drvdata->write_buffer_in_use; i < 4; i++) in hwicap_release()
572 drvdata->write_buffer[i] = 0; in hwicap_release()
574 status = drvdata->config->set_configuration(drvdata, in hwicap_release()
575 (u32 *) drvdata->write_buffer, 1); in hwicap_release()
585 drvdata->is_open = 0; in hwicap_release()
586 mutex_unlock(&drvdata->sem); in hwicap_release()
600 const struct hwicap_driver_config *config, in hwicap_setup() argument
605 struct device *dev = &pdev->dev; in hwicap_setup()
620 return -EINVAL; in hwicap_setup()
626 return -EBUSY; in hwicap_setup()
636 retval = -ENOMEM; in hwicap_setup()
641 drvdata->base_address = devm_platform_ioremap_resource(pdev, 0); in hwicap_setup()
642 if (IS_ERR(drvdata->base_address)) { in hwicap_setup()
643 retval = PTR_ERR(drvdata->base_address); in hwicap_setup()
647 drvdata->devt = devt; in hwicap_setup()
648 drvdata->dev = dev; in hwicap_setup()
649 drvdata->config = config; in hwicap_setup()
650 drvdata->config_regs = config_regs; in hwicap_setup()
652 mutex_init(&drvdata->sem); in hwicap_setup()
653 drvdata->is_open = 0; in hwicap_setup()
655 cdev_init(&drvdata->cdev, &hwicap_fops); in hwicap_setup()
656 drvdata->cdev.owner = THIS_MODULE; in hwicap_setup()
657 retval = cdev_add(&drvdata->cdev, devt, 1); in hwicap_setup()
691 const struct hwicap_driver_config *config; in hwicap_drv_probe() local
693 int id = -1; in hwicap_drv_probe()
695 config = device_get_match_data(&pdev->dev); in hwicap_drv_probe()
697 of_property_read_u32(pdev->dev.of_node, "port-number", &id); in hwicap_drv_probe()
703 if (!of_property_read_string(pdev->dev.of_node, "xlnx,family", &family)) { in hwicap_drv_probe()
713 return hwicap_setup(pdev, id, config, regs); in hwicap_drv_probe()
718 struct device *dev = &pdev->dev; in hwicap_drv_remove()
723 device_destroy(&icap_class, drvdata->devt); in hwicap_drv_remove()
724 cdev_del(&drvdata->cdev); in hwicap_drv_remove()
727 probed_devices[MINOR(dev->devt)-XHWICAP_MINOR] = 0; in hwicap_drv_remove()
733 { .compatible = "xlnx,opb-hwicap-1.00.b", .data = &buffer_icap_config},
734 { .compatible = "xlnx,xps-hwicap-1.00.a", .data = &fifo_icap_config},