Lines Matching refs:sbefifo

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