diff options
author | Masahiro Yamada <yamada.m@jp.panasonic.com> | 2014-10-07 14:51:31 +0900 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2014-10-22 10:32:17 -0600 |
commit | f887cb6d86012a79147cc67d512782644426dd9a (patch) | |
tree | e1a884b95798ec4f5924c10eadd5a466f974d5a2 | |
parent | b1799fcbdc9d5bd7c7eb85f70f256d81b3af0bfe (diff) | |
download | u-boot-imx-f887cb6d86012a79147cc67d512782644426dd9a.zip u-boot-imx-f887cb6d86012a79147cc67d512782644426dd9a.tar.gz u-boot-imx-f887cb6d86012a79147cc67d512782644426dd9a.tar.bz2 |
dm: add of_match_ptr() macro
The driver model supports two ways for passing device parameters;
Device Tree and platform_data (board file).
Each driver should generally support both of them because some
popular IPs are used on various platforms.
Assume the following scenario:
- The driver Foo is used on SoC Bar and SoC Baz
- The SoC Bar uses Device Tree control (CONFIG_OF_CONTROL=y)
- The SoC Baz does not support Device Tree; uses a board file
In this situation, the device driver Foo should work with/without
the device tree control. The driver should have .of_match and
.ofdata_to_platdata members for SoC Bar, while they are meaningless
for SoC Baz; therefore those device-tree control code should go
inside #ifdef CONFIG_OF_CONTROL.
The driver code will be like this:
#ifdef CONFIG_OF_CONTROL
static const struct udevice_id foo_of_match = {
{ .compatible = "foo_driver" },
{},
}
static int foo_ofdata_to_platdata(struct udevice *dev)
{
...
}
#endif
U_BOOT_DRIVER(foo_driver) = {
...
.of_match = of_match_ptr(foo_of_match),
.ofdata_to_platdata = of_match_ptr(foo_ofdata_to_platdata),
...
}
This idea has been borrowed from Linux.
(In Linux, this macro is defined in include/linux/of.h)
Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
Acked-by: Simon Glass <sjg@chromium.org>
-rw-r--r-- | include/dm/device.h | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/include/dm/device.h b/include/dm/device.h index c8a4072..e08d496 100644 --- a/include/dm/device.h +++ b/include/dm/device.h @@ -96,6 +96,12 @@ struct udevice_id { ulong data; }; +#ifdef CONFIG_OF_CONTROL +#define of_match_ptr(_ptr) (_ptr) +#else +#define of_match_ptr(_ptr) NULL +#endif /* CONFIG_OF_CONTROL */ + /** * struct driver - A driver for a feature or peripheral * |