Lines Matching refs:drvdata
229 static int hwicap_command_desync(struct hwicap_drvdata *drvdata) in hwicap_command_desync() argument
237 buffer[index++] = hwicap_type_1_write(drvdata->config_regs->CMD) | 1; in hwicap_command_desync()
246 return drvdata->config->set_configuration(drvdata, in hwicap_command_desync()
261 static int hwicap_get_configuration_register(struct hwicap_drvdata *drvdata, in hwicap_get_configuration_register() argument
281 status = drvdata->config->set_configuration(drvdata, in hwicap_get_configuration_register()
287 status = drvdata->config->get_status(drvdata); 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()
315 static int hwicap_initialize_hwicap(struct hwicap_drvdata *drvdata) in hwicap_initialize_hwicap() argument
320 dev_dbg(drvdata->dev, "initializing\n"); in hwicap_initialize_hwicap()
324 dev_dbg(drvdata->dev, "Reset...\n"); in hwicap_initialize_hwicap()
325 drvdata->config->reset(drvdata); in hwicap_initialize_hwicap()
327 dev_dbg(drvdata->dev, "Desync...\n"); in hwicap_initialize_hwicap()
328 status = hwicap_command_desync(drvdata); in hwicap_initialize_hwicap()
336 dev_dbg(drvdata->dev, "Reading IDCODE...\n"); in hwicap_initialize_hwicap()
338 drvdata, drvdata->config_regs->IDCODE, &idcode); in hwicap_initialize_hwicap()
339 dev_dbg(drvdata->dev, "IDCODE = %x\n", idcode); in hwicap_initialize_hwicap()
343 dev_dbg(drvdata->dev, "Desync...\n"); in hwicap_initialize_hwicap()
344 status = hwicap_command_desync(drvdata); in hwicap_initialize_hwicap()
354 struct hwicap_drvdata *drvdata = file->private_data; in hwicap_read() local
361 status = mutex_lock_interruptible(&drvdata->sem); in hwicap_read()
365 if (drvdata->read_buffer_in_use) { in hwicap_read()
370 (count < drvdata->read_buffer_in_use) ? count : in hwicap_read()
371 drvdata->read_buffer_in_use; in hwicap_read()
374 if (copy_to_user(buf, drvdata->read_buffer, bytes_to_read)) { in hwicap_read()
378 drvdata->read_buffer_in_use -= bytes_to_read; in hwicap_read()
379 memmove(drvdata->read_buffer, in hwicap_read()
380 drvdata->read_buffer + bytes_to_read, in hwicap_read()
409 status = drvdata->config->get_configuration(drvdata, in hwicap_read()
424 memcpy(drvdata->read_buffer, in hwicap_read()
427 drvdata->read_buffer_in_use = bytes_remaining; in hwicap_read()
432 mutex_unlock(&drvdata->sem); in hwicap_read()
440 struct hwicap_drvdata *drvdata = file->private_data; in hwicap_write() local
447 status = mutex_lock_interruptible(&drvdata->sem); in hwicap_write()
451 left += drvdata->write_buffer_in_use; in hwicap_write()
474 if (drvdata->write_buffer_in_use) { in hwicap_write()
475 memcpy(kbuf, drvdata->write_buffer, in hwicap_write()
476 drvdata->write_buffer_in_use); in hwicap_write()
478 (((char *)kbuf) + drvdata->write_buffer_in_use), in hwicap_write()
480 len - (drvdata->write_buffer_in_use))) { in hwicap_write()
493 status = drvdata->config->set_configuration(drvdata, in hwicap_write()
501 if (drvdata->write_buffer_in_use) { in hwicap_write()
502 len -= drvdata->write_buffer_in_use; in hwicap_write()
503 left -= drvdata->write_buffer_in_use; in hwicap_write()
504 drvdata->write_buffer_in_use = 0; in hwicap_write()
510 if (!copy_from_user(drvdata->write_buffer, in hwicap_write()
512 drvdata->write_buffer_in_use = left; in hwicap_write()
521 mutex_unlock(&drvdata->sem); in hwicap_write()
527 struct hwicap_drvdata *drvdata; in hwicap_open() local
531 drvdata = container_of(inode->i_cdev, struct hwicap_drvdata, cdev); in hwicap_open()
533 status = mutex_lock_interruptible(&drvdata->sem); in hwicap_open()
537 if (drvdata->is_open) { in hwicap_open()
542 status = hwicap_initialize_hwicap(drvdata); in hwicap_open()
544 dev_err(drvdata->dev, "Failed to open file"); in hwicap_open()
548 file->private_data = drvdata; in hwicap_open()
549 drvdata->write_buffer_in_use = 0; in hwicap_open()
550 drvdata->read_buffer_in_use = 0; in hwicap_open()
551 drvdata->is_open = 1; in hwicap_open()
554 mutex_unlock(&drvdata->sem); in hwicap_open()
562 struct hwicap_drvdata *drvdata = file->private_data; in hwicap_release() local
566 mutex_lock(&drvdata->sem); in hwicap_release()
568 if (drvdata->write_buffer_in_use) { in hwicap_release()
570 for (i = drvdata->write_buffer_in_use; i < 4; i++) in hwicap_release()
571 drvdata->write_buffer[i] = 0; in hwicap_release()
573 status = drvdata->config->set_configuration(drvdata, in hwicap_release()
574 (u32 *) drvdata->write_buffer, 1); in hwicap_release()
579 status = hwicap_command_desync(drvdata); in hwicap_release()
584 drvdata->is_open = 0; in hwicap_release()
585 mutex_unlock(&drvdata->sem); in hwicap_release()
604 struct hwicap_drvdata *drvdata = NULL; in hwicap_setup() local
633 drvdata = kzalloc(sizeof(struct hwicap_drvdata), GFP_KERNEL); in hwicap_setup()
634 if (!drvdata) { in hwicap_setup()
639 dev_set_drvdata(dev, (void *)drvdata); in hwicap_setup()
647 drvdata->mem_start = regs_res->start; in hwicap_setup()
648 drvdata->mem_end = regs_res->end; in hwicap_setup()
649 drvdata->mem_size = resource_size(regs_res); in hwicap_setup()
651 if (!request_mem_region(drvdata->mem_start, in hwicap_setup()
652 drvdata->mem_size, DRIVER_NAME)) { in hwicap_setup()
659 drvdata->devt = devt; in hwicap_setup()
660 drvdata->dev = dev; in hwicap_setup()
661 drvdata->base_address = ioremap(drvdata->mem_start, drvdata->mem_size); in hwicap_setup()
662 if (!drvdata->base_address) { in hwicap_setup()
668 drvdata->config = config; in hwicap_setup()
669 drvdata->config_regs = config_regs; in hwicap_setup()
671 mutex_init(&drvdata->sem); in hwicap_setup()
672 drvdata->is_open = 0; in hwicap_setup()
675 (unsigned long long) drvdata->mem_start, in hwicap_setup()
676 drvdata->base_address, in hwicap_setup()
677 (unsigned long long) drvdata->mem_size); in hwicap_setup()
679 cdev_init(&drvdata->cdev, &hwicap_fops); in hwicap_setup()
680 drvdata->cdev.owner = THIS_MODULE; in hwicap_setup()
681 retval = cdev_add(&drvdata->cdev, devt, 1); in hwicap_setup()
691 iounmap(drvdata->base_address); in hwicap_setup()
694 release_mem_region(regs_res->start, drvdata->mem_size); in hwicap_setup()
697 kfree(drvdata); in hwicap_setup()
723 struct hwicap_drvdata *drvdata; in hwicap_remove() local
725 drvdata = dev_get_drvdata(dev); in hwicap_remove()
727 if (!drvdata) in hwicap_remove()
730 device_destroy(icap_class, drvdata->devt); in hwicap_remove()
731 cdev_del(&drvdata->cdev); in hwicap_remove()
732 iounmap(drvdata->base_address); in hwicap_remove()
733 release_mem_region(drvdata->mem_start, drvdata->mem_size); in hwicap_remove()
734 kfree(drvdata); in hwicap_remove()