Lines Matching defs:sbefifo
19 #include <linux/fsi-sbefifo.h>
42 #define DEVICE_NAME "sbefifo"
119 struct sbefifo {
135 struct sbefifo *sbefifo;
149 struct sbefifo *sbefifo = container_of(dev, struct sbefifo, dev);
151 return sysfs_emit(buf, "%d\n", sbefifo->timed_out ? 1 : 0);
228 pr_debug("sbefifo: cmd %04x, response too small: %zd\n",
264 static int sbefifo_regr(struct sbefifo *sbefifo, int reg, u32 *word)
269 rc = fsi_device_read(sbefifo->fsi_dev, reg, &raw_word,
279 static int sbefifo_regw(struct sbefifo *sbefifo, int reg, u32 word)
283 return fsi_device_write(sbefifo->fsi_dev, reg, &raw_word,
287 static int sbefifo_check_sbe_state(struct sbefifo *sbefifo)
293 rc = fsi_slave_read(sbefifo->fsi_dev->slave, CFAM_GP_MBOX_SBM_ADDR,
322 sbefifo->async_ffdc = true;
328 static int sbefifo_down_read(struct sbefifo *sbefifo, __be32 *word)
330 return fsi_device_read(sbefifo->fsi_dev, SBEFIFO_DOWN, word,
334 static int sbefifo_up_write(struct sbefifo *sbefifo, __be32 word)
336 return fsi_device_write(sbefifo->fsi_dev, SBEFIFO_UP, &word,
340 static int sbefifo_request_reset(struct sbefifo *sbefifo)
342 struct device *dev = &sbefifo->fsi_dev->dev;
350 sbefifo->broken = true;
353 rc = sbefifo_regw(sbefifo, SBEFIFO_UP | SBEFIFO_REQ_RESET, 1);
362 rc = sbefifo_regr(sbefifo, SBEFIFO_UP | SBEFIFO_STS, &status);
371 sbefifo->broken = false;
382 static int sbefifo_cleanup_hw(struct sbefifo *sbefifo)
384 struct device *dev = &sbefifo->fsi_dev->dev;
389 rc = sbefifo_check_sbe_state(sbefifo);
396 if (sbefifo->broken)
399 rc = sbefifo_regr(sbefifo, SBEFIFO_UP | SBEFIFO_STS, &up_status);
404 sbefifo->broken = true;
408 rc = sbefifo_regr(sbefifo, SBEFIFO_DOWN | SBEFIFO_STS, &down_status);
413 sbefifo->broken = true;
420 rc = sbefifo_regw(sbefifo, SBEFIFO_DOWN, SBEFIFO_PERFORM_RESET);
422 sbefifo->broken = true;
426 sbefifo->broken = false;
447 return sbefifo_request_reset(sbefifo);
450 static int sbefifo_wait(struct sbefifo *sbefifo, bool up,
453 struct device *dev = &sbefifo->fsi_dev->dev;
466 rc = sbefifo_regr(sbefifo, addr, &sts);
480 sysfs_notify(&sbefifo->dev.kobj, NULL, dev_attr_timeout.attr.name);
481 sbefifo->timed_out = true;
488 sbefifo->timed_out = false;
494 static int sbefifo_send_command(struct sbefifo *sbefifo,
497 struct device *dev = &sbefifo->fsi_dev->dev;
510 rc = sbefifo_wait(sbefifo, true, &status, timeout);
513 timeout = msecs_to_jiffies(sbefifo->timeout_in_cmd_ms);
523 rc = sbefifo_up_write(sbefifo, *(command++));
535 rc = sbefifo_wait(sbefifo, true, &status, timeout);
541 rc = sbefifo_regw(sbefifo, SBEFIFO_UP | SBEFIFO_EOT_RAISE, 0);
547 static int sbefifo_read_response(struct sbefifo *sbefifo, struct iov_iter *response)
549 struct device *dev = &sbefifo->fsi_dev->dev;
559 timeout = msecs_to_jiffies(sbefifo->timeout_start_rsp_ms);
562 rc = sbefifo_wait(sbefifo, false, &status, timeout);
578 rc = sbefifo_down_read(sbefifo, &data);
594 sbefifo->broken = true;
598 rc = sbefifo_regw(sbefifo,
608 sbefifo->broken = true;
633 static int sbefifo_do_command(struct sbefifo *sbefifo,
638 int rc = sbefifo_send_command(sbefifo, command, cmd_len);
643 return sbefifo_read_response(sbefifo, response);
646 static void sbefifo_collect_async_ffdc(struct sbefifo *sbefifo)
648 struct device *dev = &sbefifo->fsi_dev->dev;
656 sbefifo->async_ffdc = false;
667 rc = sbefifo_do_command(sbefifo, cmd, 2, &ffdc_iter);
687 static int __sbefifo_submit(struct sbefifo *sbefifo,
691 struct device *dev = &sbefifo->fsi_dev->dev;
694 if (sbefifo->dead)
704 rc = sbefifo_cleanup_hw(sbefifo);
709 if (sbefifo->async_ffdc)
710 sbefifo_collect_async_ffdc(sbefifo);
712 rc = sbefifo_do_command(sbefifo, command, cmd_len, response);
721 sbefifo_request_reset(sbefifo);
729 * @dev: The sbefifo device
741 struct sbefifo *sbefifo;
749 sbefifo = dev_get_drvdata(dev);
750 if (!sbefifo)
752 if (WARN_ON_ONCE(sbefifo->magic != SBEFIFO_MAGIC))
764 rc = mutex_lock_interruptible(&sbefifo->lock);
767 rc = __sbefifo_submit(sbefifo, command, cmd_len, &resp_iter);
768 mutex_unlock(&sbefifo->lock);
792 struct sbefifo *sbefifo = container_of(inode->i_cdev, struct sbefifo, cdev);
800 user->sbefifo = sbefifo;
817 struct sbefifo *sbefifo;
825 sbefifo = user->sbefifo;
848 rc = mutex_lock_interruptible(&sbefifo->lock);
851 sbefifo->timeout_in_cmd_ms = user->cmd_timeout_ms;
852 sbefifo->timeout_start_rsp_ms = user->read_timeout_ms;
853 rc = __sbefifo_submit(sbefifo, user->pending_cmd, cmd_len, &resp_iter);
854 sbefifo->timeout_start_rsp_ms = SBEFIFO_TIMEOUT_START_RSP;
855 sbefifo->timeout_in_cmd_ms = SBEFIFO_TIMEOUT_IN_CMD;
856 mutex_unlock(&sbefifo->lock);
872 struct sbefifo *sbefifo;
877 sbefifo = user->sbefifo;
909 rc = mutex_lock_interruptible(&sbefifo->lock);
912 rc = sbefifo_request_reset(user->sbefifo);
913 mutex_unlock(&sbefifo->lock);
947 struct device *dev = &user->sbefifo->dev;
966 struct device *dev = &user->sbefifo->dev;
1015 struct sbefifo *sbefifo = container_of(dev, struct sbefifo, dev);
1017 put_device(&sbefifo->fsi_dev->dev);
1018 kfree(sbefifo);
1028 struct sbefifo *sbefifo;
1034 dev_dbg(dev, "Found sbefifo device\n");
1036 sbefifo = kzalloc(sizeof(*sbefifo), GFP_KERNEL);
1037 if (!sbefifo)
1042 kfree(sbefifo);
1046 sbefifo->magic = SBEFIFO_MAGIC;
1047 sbefifo->fsi_dev = fsi_dev;
1048 dev_set_drvdata(dev, sbefifo);
1049 mutex_init(&sbefifo->lock);
1050 sbefifo->timeout_in_cmd_ms = SBEFIFO_TIMEOUT_IN_CMD;
1051 sbefifo->timeout_start_rsp_ms = SBEFIFO_TIMEOUT_START_RSP;
1054 sbefifo->dev.type = &fsi_cdev_type;
1055 sbefifo->dev.parent = dev;
1056 sbefifo->dev.release = sbefifo_free;
1057 device_initialize(&sbefifo->dev);
1060 rc = fsi_get_new_minor(fsi_dev, fsi_dev_sbefifo, &sbefifo->dev.devt, &didx);
1064 dev_set_name(&sbefifo->dev, "sbefifo%d", didx);
1065 cdev_init(&sbefifo->cdev, &sbefifo_fops);
1066 rc = cdev_device_add(&sbefifo->cdev, &sbefifo->dev);
1069 rc, dev_name(&sbefifo->dev));
1076 dev_name(&sbefifo->dev), child_idx++);
1083 device_create_file(&sbefifo->dev, &dev_attr_timeout);
1087 fsi_free_minor(sbefifo->dev.devt);
1089 put_device(&sbefifo->dev);
1106 struct sbefifo *sbefifo = dev_get_drvdata(dev);
1108 dev_dbg(dev, "Removing sbefifo device...\n");
1110 device_remove_file(&sbefifo->dev, &dev_attr_timeout);
1112 mutex_lock(&sbefifo->lock);
1113 sbefifo->dead = true;
1114 mutex_unlock(&sbefifo->lock);
1116 cdev_device_del(&sbefifo->cdev, &sbefifo->dev);
1117 fsi_free_minor(sbefifo->dev.devt);
1119 put_device(&sbefifo->dev);