[U-Boot] [PATCH v1 1/3] drivers: reset: Handle gracefully NULL pointers
Jean-Jacques Hiblot
jjhiblot at ti.com
Mon Sep 30 14:24:47 UTC 2019
Prepare the way for a managed reset API by handling NULL pointers without
crashing nor failing.
Signed-off-by: Jean-Jacques Hiblot <jjhiblot at ti.com>
---
drivers/reset/reset-uclass.c | 30 +++++++++++++++++-------------
1 file changed, 17 insertions(+), 13 deletions(-)
diff --git a/drivers/reset/reset-uclass.c b/drivers/reset/reset-uclass.c
index ee1a423ffb..1cfcc8b367 100644
--- a/drivers/reset/reset-uclass.c
+++ b/drivers/reset/reset-uclass.c
@@ -9,9 +9,12 @@
#include <reset.h>
#include <reset-uclass.h>
-static inline struct reset_ops *reset_dev_ops(struct udevice *dev)
+struct reset_ops nop_reset_ops = {
+};
+
+static inline struct reset_ops *reset_dev_ops(struct reset_ctl *r)
{
- return (struct reset_ops *)dev->driver->ops;
+ return r ? (struct reset_ops *)r->dev->driver->ops : &nop_reset_ops;
}
static int reset_of_xlate_default(struct reset_ctl *reset_ctl,
@@ -50,9 +53,10 @@ static int reset_get_by_index_tail(int ret, ofnode node,
debug("%s %d\n", ofnode_get_name(args->node), args->args[0]);
return ret;
}
- ops = reset_dev_ops(dev_reset);
reset_ctl->dev = dev_reset;
+ ops = reset_dev_ops(reset_ctl);
+
if (ops->of_xlate)
ret = ops->of_xlate(reset_ctl, args);
else
@@ -151,29 +155,29 @@ int reset_get_by_name(struct udevice *dev, const char *name,
int reset_request(struct reset_ctl *reset_ctl)
{
- struct reset_ops *ops = reset_dev_ops(reset_ctl->dev);
+ struct reset_ops *ops = reset_dev_ops(reset_ctl);
debug("%s(reset_ctl=%p)\n", __func__, reset_ctl);
- return ops->request(reset_ctl);
+ return ops->request ? ops->request(reset_ctl) : 0;
}
int reset_free(struct reset_ctl *reset_ctl)
{
- struct reset_ops *ops = reset_dev_ops(reset_ctl->dev);
+ struct reset_ops *ops = reset_dev_ops(reset_ctl);
debug("%s(reset_ctl=%p)\n", __func__, reset_ctl);
- return ops->free(reset_ctl);
+ return ops->free ? ops->free(reset_ctl) : 0;
}
int reset_assert(struct reset_ctl *reset_ctl)
{
- struct reset_ops *ops = reset_dev_ops(reset_ctl->dev);
+ struct reset_ops *ops = reset_dev_ops(reset_ctl);
debug("%s(reset_ctl=%p)\n", __func__, reset_ctl);
- return ops->rst_assert(reset_ctl);
+ return ops->rst_assert ? ops->rst_assert(reset_ctl) : 0;
}
int reset_assert_bulk(struct reset_ctl_bulk *bulk)
@@ -191,11 +195,11 @@ int reset_assert_bulk(struct reset_ctl_bulk *bulk)
int reset_deassert(struct reset_ctl *reset_ctl)
{
- struct reset_ops *ops = reset_dev_ops(reset_ctl->dev);
+ struct reset_ops *ops = reset_dev_ops(reset_ctl);
debug("%s(reset_ctl=%p)\n", __func__, reset_ctl);
- return ops->rst_deassert(reset_ctl);
+ return ops->rst_deassert ? ops->rst_deassert(reset_ctl) : 0;
}
int reset_deassert_bulk(struct reset_ctl_bulk *bulk)
@@ -213,11 +217,11 @@ int reset_deassert_bulk(struct reset_ctl_bulk *bulk)
int reset_status(struct reset_ctl *reset_ctl)
{
- struct reset_ops *ops = reset_dev_ops(reset_ctl->dev);
+ struct reset_ops *ops = reset_dev_ops(reset_ctl);
debug("%s(reset_ctl=%p)\n", __func__, reset_ctl);
- return ops->rst_status(reset_ctl);
+ return ops->rst_status ? ops->rst_status(reset_ctl) : 0;
}
int reset_release_all(struct reset_ctl *reset_ctl, int count)
--
2.17.1
More information about the U-Boot
mailing list