Lines Matching defs:sbefifo
19 #include <linux/fsi-sbefifo.h>
40 #define DEVICE_NAME "sbefifo"
117 struct sbefifo {
130 struct sbefifo *sbefifo;
213 pr_debug("sbefifo: cmd %04x, response too small: %zd\n",
249 static int sbefifo_regr(struct sbefifo *sbefifo, int reg, u32 *word)
254 rc = fsi_device_read(sbefifo->fsi_dev, reg, &raw_word,
264 static int sbefifo_regw(struct sbefifo *sbefifo, int reg, u32 word)
268 return fsi_device_write(sbefifo->fsi_dev, reg, &raw_word,
272 static int sbefifo_check_sbe_state(struct sbefifo *sbefifo)
278 rc = fsi_slave_read(sbefifo->fsi_dev->slave, CFAM_GP_MBOX_SBM_ADDR,
307 sbefifo->async_ffdc = true;
313 static int sbefifo_down_read(struct sbefifo *sbefifo, __be32 *word)
315 return fsi_device_read(sbefifo->fsi_dev, SBEFIFO_DOWN, word,
319 static int sbefifo_up_write(struct sbefifo *sbefifo, __be32 word)
321 return fsi_device_write(sbefifo->fsi_dev, SBEFIFO_UP, &word,
325 static int sbefifo_request_reset(struct sbefifo *sbefifo)
327 struct device *dev = &sbefifo->fsi_dev->dev;
335 sbefifo->broken = true;
338 rc = sbefifo_regw(sbefifo, SBEFIFO_UP | SBEFIFO_REQ_RESET, 1);
347 rc = sbefifo_regr(sbefifo, SBEFIFO_UP | SBEFIFO_STS, &status);
356 sbefifo->broken = false;
367 static int sbefifo_cleanup_hw(struct sbefifo *sbefifo)
369 struct device *dev = &sbefifo->fsi_dev->dev;
374 rc = sbefifo_check_sbe_state(sbefifo);
381 if (sbefifo->broken)
384 rc = sbefifo_regr(sbefifo, SBEFIFO_UP | SBEFIFO_STS, &up_status);
389 sbefifo->broken = true;
393 rc = sbefifo_regr(sbefifo, SBEFIFO_DOWN | SBEFIFO_STS, &down_status);
398 sbefifo->broken = true;
405 rc = sbefifo_regw(sbefifo, SBEFIFO_DOWN, SBEFIFO_PERFORM_RESET);
407 sbefifo->broken = true;
411 sbefifo->broken = false;
432 return sbefifo_request_reset(sbefifo);
435 static int sbefifo_wait(struct sbefifo *sbefifo, bool up,
438 struct device *dev = &sbefifo->fsi_dev->dev;
451 rc = sbefifo_regr(sbefifo, addr, &sts);
475 static int sbefifo_send_command(struct sbefifo *sbefifo,
478 struct device *dev = &sbefifo->fsi_dev->dev;
491 rc = sbefifo_wait(sbefifo, true, &status, timeout);
504 rc = sbefifo_up_write(sbefifo, *(command++));
516 rc = sbefifo_wait(sbefifo, true, &status, timeout);
522 rc = sbefifo_regw(sbefifo, SBEFIFO_UP | SBEFIFO_EOT_RAISE, 0);
528 static int sbefifo_read_response(struct sbefifo *sbefifo, struct iov_iter *response)
530 struct device *dev = &sbefifo->fsi_dev->dev;
543 rc = sbefifo_wait(sbefifo, false, &status, timeout);
557 rc = sbefifo_down_read(sbefifo, &data);
573 sbefifo->broken = true;
577 rc = sbefifo_regw(sbefifo,
587 sbefifo->broken = true;
612 static int sbefifo_do_command(struct sbefifo *sbefifo,
617 int rc = sbefifo_send_command(sbefifo, command, cmd_len);
622 return sbefifo_read_response(sbefifo, response);
625 static void sbefifo_collect_async_ffdc(struct sbefifo *sbefifo)
627 struct device *dev = &sbefifo->fsi_dev->dev;
635 sbefifo->async_ffdc = false;
646 rc = sbefifo_do_command(sbefifo, cmd, 2, &ffdc_iter);
666 static int __sbefifo_submit(struct sbefifo *sbefifo,
670 struct device *dev = &sbefifo->fsi_dev->dev;
673 if (sbefifo->dead)
683 rc = sbefifo_cleanup_hw(sbefifo);
688 if (sbefifo->async_ffdc)
689 sbefifo_collect_async_ffdc(sbefifo);
691 rc = sbefifo_do_command(sbefifo, command, cmd_len, response);
700 sbefifo_request_reset(sbefifo);
708 * @dev: The sbefifo device
720 struct sbefifo *sbefifo;
728 sbefifo = dev_get_drvdata(dev);
729 if (!sbefifo)
731 if (WARN_ON_ONCE(sbefifo->magic != SBEFIFO_MAGIC))
743 mutex_lock(&sbefifo->lock);
744 rc = __sbefifo_submit(sbefifo, command, cmd_len, &resp_iter);
745 mutex_unlock(&sbefifo->lock);
769 struct sbefifo *sbefifo = container_of(inode->i_cdev, struct sbefifo, cdev);
777 user->sbefifo = sbefifo;
792 struct sbefifo *sbefifo;
800 sbefifo = user->sbefifo;
823 mutex_lock(&sbefifo->lock);
824 rc = __sbefifo_submit(sbefifo, user->pending_cmd, cmd_len, &resp_iter);
825 mutex_unlock(&sbefifo->lock);
841 struct sbefifo *sbefifo;
846 sbefifo = user->sbefifo;
878 mutex_lock(&sbefifo->lock);
879 rc = sbefifo_request_reset(user->sbefifo);
880 mutex_unlock(&sbefifo->lock);
922 struct sbefifo *sbefifo = container_of(dev, struct sbefifo, dev);
924 put_device(&sbefifo->fsi_dev->dev);
925 kfree(sbefifo);
935 struct sbefifo *sbefifo;
941 dev_dbg(dev, "Found sbefifo device\n");
943 sbefifo = kzalloc(sizeof(*sbefifo), GFP_KERNEL);
944 if (!sbefifo)
949 kfree(sbefifo);
953 sbefifo->magic = SBEFIFO_MAGIC;
954 sbefifo->fsi_dev = fsi_dev;
955 dev_set_drvdata(dev, sbefifo);
956 mutex_init(&sbefifo->lock);
962 rc = sbefifo_cleanup_hw(sbefifo);
967 sbefifo->dev.type = &fsi_cdev_type;
968 sbefifo->dev.parent = dev;
969 sbefifo->dev.release = sbefifo_free;
970 device_initialize(&sbefifo->dev);
973 rc = fsi_get_new_minor(fsi_dev, fsi_dev_sbefifo, &sbefifo->dev.devt, &didx);
977 dev_set_name(&sbefifo->dev, "sbefifo%d", didx);
978 cdev_init(&sbefifo->cdev, &sbefifo_fops);
979 rc = cdev_device_add(&sbefifo->cdev, &sbefifo->dev);
982 rc, dev_name(&sbefifo->dev));
989 dev_name(&sbefifo->dev), child_idx++);
998 fsi_free_minor(sbefifo->dev.devt);
1000 put_device(&sbefifo->dev);
1017 struct sbefifo *sbefifo = dev_get_drvdata(dev);
1019 dev_dbg(dev, "Removing sbefifo device...\n");
1021 mutex_lock(&sbefifo->lock);
1022 sbefifo->dead = true;
1023 mutex_unlock(&sbefifo->lock);
1025 cdev_device_del(&sbefifo->cdev, &sbefifo->dev);
1026 fsi_free_minor(sbefifo->dev.devt);
1028 put_device(&sbefifo->dev);