]>
git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/mailbox/mailbox-uclass.c
2 * Copyright (c) 2016, NVIDIA CORPORATION.
4 * SPDX-License-Identifier: GPL-2.0
10 #include <mailbox-uclass.h>
12 DECLARE_GLOBAL_DATA_PTR
;
14 static inline struct mbox_ops
*mbox_dev_ops(struct udevice
*dev
)
16 return (struct mbox_ops
*)dev
->driver
->ops
;
19 static int mbox_of_xlate_default(struct mbox_chan
*chan
,
20 struct ofnode_phandle_args
*args
)
22 debug("%s(chan=%p)\n", __func__
, chan
);
24 if (args
->args_count
!= 1) {
25 debug("Invaild args_count: %d\n", args
->args_count
);
29 chan
->id
= args
->args
[0];
34 int mbox_get_by_index(struct udevice
*dev
, int index
, struct mbox_chan
*chan
)
36 struct ofnode_phandle_args args
;
38 struct udevice
*dev_mbox
;
41 debug("%s(dev=%p, index=%d, chan=%p)\n", __func__
, dev
, index
, chan
);
43 ret
= dev_read_phandle_with_args(dev
, "mboxes", "#mbox-cells", 0, index
,
46 debug("%s: dev_read_phandle_with_args failed: %d\n", __func__
,
51 ret
= uclass_get_device_by_ofnode(UCLASS_MAILBOX
, args
.node
, &dev_mbox
);
53 debug("%s: uclass_get_device_by_of_offset failed: %d\n",
57 ops
= mbox_dev_ops(dev_mbox
);
61 ret
= ops
->of_xlate(chan
, &args
);
63 ret
= mbox_of_xlate_default(chan
, &args
);
65 debug("of_xlate() failed: %d\n", ret
);
69 ret
= ops
->request(chan
);
71 debug("ops->request() failed: %d\n", ret
);
78 int mbox_get_by_name(struct udevice
*dev
, const char *name
,
79 struct mbox_chan
*chan
)
83 debug("%s(dev=%p, name=%s, chan=%p)\n", __func__
, dev
, name
, chan
);
85 index
= dev_read_stringlist_search(dev
, "mbox-names", name
);
87 debug("fdt_stringlist_search() failed: %d\n", index
);
91 return mbox_get_by_index(dev
, index
, chan
);
94 int mbox_free(struct mbox_chan
*chan
)
96 struct mbox_ops
*ops
= mbox_dev_ops(chan
->dev
);
98 debug("%s(chan=%p)\n", __func__
, chan
);
100 return ops
->free(chan
);
103 int mbox_send(struct mbox_chan
*chan
, const void *data
)
105 struct mbox_ops
*ops
= mbox_dev_ops(chan
->dev
);
107 debug("%s(chan=%p, data=%p)\n", __func__
, chan
, data
);
109 return ops
->send(chan
, data
);
112 int mbox_recv(struct mbox_chan
*chan
, void *data
, ulong timeout_us
)
114 struct mbox_ops
*ops
= mbox_dev_ops(chan
->dev
);
118 debug("%s(chan=%p, data=%p, timeout_us=%ld)\n", __func__
, chan
, data
,
121 start_time
= timer_get_us();
123 * Account for partial us ticks, but if timeout_us is 0, ensure we
124 * still don't wait at all.
130 ret
= ops
->recv(chan
, data
);
133 if ((timer_get_us() - start_time
) >= timeout_us
)
138 UCLASS_DRIVER(mailbox
) = {
139 .id
= UCLASS_MAILBOX
,