Lines Matching defs:teedev
47 struct tee_context *teedev_open(struct tee_device *teedev)
52 if (!tee_device_get(teedev))
62 ctx->teedev = teedev;
63 rc = teedev->desc->ops->open(ctx);
70 tee_device_put(teedev);
89 ctx->teedev->desc->ops->release(ctx);
103 struct tee_device *teedev = ctx->teedev;
106 tee_device_put(teedev);
276 ctx->teedev->desc->ops->get_version(ctx->teedev, &vers);
278 if (ctx->teedev->desc->flags & TEE_DESC_PRIVILEGED)
477 if (!ctx->teedev->desc->ops->open_session)
512 rc = ctx->teedev->desc->ops->open_session(ctx, &arg, params);
529 if (rc && have_session && ctx->teedev->desc->ops->close_session)
530 ctx->teedev->desc->ops->close_session(ctx, arg.session);
555 if (!ctx->teedev->desc->ops->invoke_func)
583 rc = ctx->teedev->desc->ops->invoke_func(ctx, &arg, params);
610 if (!ctx->teedev->desc->ops->cancel_req)
616 return ctx->teedev->desc->ops->cancel_req(ctx, arg.cancel_id,
626 if (!ctx->teedev->desc->ops->close_session)
632 return ctx->teedev->desc->ops->close_session(ctx, arg.session);
689 if (!ctx->teedev->desc->ops->supp_recv)
714 rc = ctx->teedev->desc->ops->supp_recv(ctx, &func, &num_params, params);
787 if (!ctx->teedev->desc->ops->supp_send)
813 rc = ctx->teedev->desc->ops->supp_send(ctx, ret, num_params, params);
858 struct tee_device *teedev = container_of(dev, struct tee_device, dev);
861 clear_bit(teedev->id, dev_mask);
863 mutex_destroy(&teedev->mutex);
864 idr_destroy(&teedev->idr);
865 kfree(teedev);
885 struct tee_device *teedev;
895 teedev = kzalloc(sizeof(*teedev), GFP_KERNEL);
896 if (!teedev) {
909 teedev->id = find_next_zero_bit(dev_mask, max_id, offs);
910 if (teedev->id < max_id)
911 set_bit(teedev->id, dev_mask);
914 if (teedev->id >= max_id) {
919 snprintf(teedev->name, sizeof(teedev->name), "tee%s%d",
921 teedev->id - offs);
923 teedev->dev.class = &tee_class;
924 teedev->dev.release = tee_release_device;
925 teedev->dev.parent = dev;
927 teedev->dev.devt = MKDEV(MAJOR(tee_devt), teedev->id);
929 rc = dev_set_name(&teedev->dev, "%s", teedev->name);
935 cdev_init(&teedev->cdev, &tee_fops);
936 teedev->cdev.owner = teedesc->owner;
938 dev_set_drvdata(&teedev->dev, driver_data);
939 device_initialize(&teedev->dev);
942 teedev->num_users = 1;
943 init_completion(&teedev->c_no_users);
944 mutex_init(&teedev->mutex);
945 idr_init(&teedev->idr);
947 teedev->desc = teedesc;
948 teedev->pool = pool;
950 return teedev;
952 unregister_chrdev_region(teedev->dev.devt, 1);
956 if (teedev && teedev->id < TEE_NUM_DEVICES) {
958 clear_bit(teedev->id, dev_mask);
961 kfree(teedev);
966 void tee_device_set_dev_groups(struct tee_device *teedev,
969 teedev->dev.groups = dev_groups;
976 struct tee_device *teedev = container_of(dev, struct tee_device, dev);
979 teedev->desc->ops->get_version(teedev, &vers);
998 * @teedev: Device to register
1000 * tee_device_unregister() need to be called to remove the @teedev if
1005 int tee_device_register(struct tee_device *teedev)
1009 if (teedev->flags & TEE_DEVICE_FLAG_REGISTERED) {
1010 dev_err(&teedev->dev, "attempt to register twice\n");
1014 rc = cdev_device_add(&teedev->cdev, &teedev->dev);
1016 dev_err(&teedev->dev,
1018 teedev->name, MAJOR(teedev->dev.devt),
1019 MINOR(teedev->dev.devt), rc);
1023 teedev->flags |= TEE_DEVICE_FLAG_REGISTERED;
1028 void tee_device_put(struct tee_device *teedev)
1030 mutex_lock(&teedev->mutex);
1032 if (!WARN_ON(!teedev->desc)) {
1033 teedev->num_users--;
1034 if (!teedev->num_users) {
1035 teedev->desc = NULL;
1036 complete(&teedev->c_no_users);
1039 mutex_unlock(&teedev->mutex);
1042 bool tee_device_get(struct tee_device *teedev)
1044 mutex_lock(&teedev->mutex);
1045 if (!teedev->desc) {
1046 mutex_unlock(&teedev->mutex);
1049 teedev->num_users++;
1050 mutex_unlock(&teedev->mutex);
1056 * @teedev: Device to unregister
1058 * This function should be called to remove the @teedev even if
1060 * @teedev is NULL.
1062 void tee_device_unregister(struct tee_device *teedev)
1064 if (!teedev)
1067 if (teedev->flags & TEE_DEVICE_FLAG_REGISTERED)
1068 cdev_device_del(&teedev->cdev, &teedev->dev);
1070 tee_device_put(teedev);
1071 wait_for_completion(&teedev->c_no_users);
1074 * No need to take a mutex any longer now since teedev->desc was
1075 * set to NULL before teedev->c_no_users was completed.
1078 teedev->pool = NULL;
1080 put_device(&teedev->dev);
1086 * @teedev: Device containing the driver_data pointer
1089 void *tee_get_drvdata(struct tee_device *teedev)
1091 return dev_get_drvdata(&teedev->dev);
1104 struct tee_device *teedev = container_of(dev, struct tee_device, dev);
1106 teedev->desc->ops->get_version(teedev, match_data->vers);
1123 dev = &start->teedev->dev;
1162 ctx->teedev->desc->ops->get_version(ctx->teedev, vers);
1170 if (!ctx->teedev->desc->ops->open_session)
1172 return ctx->teedev->desc->ops->open_session(ctx, arg, param);
1178 if (!ctx->teedev->desc->ops->close_session)
1180 return ctx->teedev->desc->ops->close_session(ctx, session);
1186 if (!ctx->teedev->desc->ops->system_session)
1188 return ctx->teedev->desc->ops->system_session(ctx, session);
1196 if (!ctx->teedev->desc->ops->invoke_func)
1198 return ctx->teedev->desc->ops->invoke_func(ctx, arg, param);
1205 if (!ctx->teedev->desc->ops->cancel_req)
1207 return ctx->teedev->desc->ops->cancel_req(ctx, arg->cancel_id,