]>
git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/reset/reset-uclass.c
2 * Copyright (c) 2016, NVIDIA CORPORATION.
4 * SPDX-License-Identifier: GPL-2.0
11 #include <reset-uclass.h>
13 DECLARE_GLOBAL_DATA_PTR
;
15 static inline struct reset_ops
*reset_dev_ops(struct udevice
*dev
)
17 return (struct reset_ops
*)dev
->driver
->ops
;
20 static int reset_of_xlate_default(struct reset_ctl
*reset_ctl
,
21 struct ofnode_phandle_args
*args
)
23 debug("%s(reset_ctl=%p)\n", __func__
, reset_ctl
);
25 if (args
->args_count
!= 1) {
26 debug("Invaild args_count: %d\n", args
->args_count
);
30 reset_ctl
->id
= args
->args
[0];
35 int reset_get_by_index(struct udevice
*dev
, int index
,
36 struct reset_ctl
*reset_ctl
)
38 struct ofnode_phandle_args args
;
40 struct udevice
*dev_reset
;
41 struct reset_ops
*ops
;
43 debug("%s(dev=%p, index=%d, reset_ctl=%p)\n", __func__
, dev
, index
,
45 reset_ctl
->dev
= NULL
;
47 ret
= dev_read_phandle_with_args(dev
, "resets", "#reset-cells", 0,
50 debug("%s: fdtdec_parse_phandle_with_args() failed: %d\n",
55 ret
= uclass_get_device_by_ofnode(UCLASS_RESET
, args
.node
,
58 debug("%s: uclass_get_device_by_ofnode() failed: %d\n",
60 debug("%s %d\n", ofnode_get_name(args
.node
), args
.args
[0]);
63 ops
= reset_dev_ops(dev_reset
);
65 reset_ctl
->dev
= dev_reset
;
67 ret
= ops
->of_xlate(reset_ctl
, &args
);
69 ret
= reset_of_xlate_default(reset_ctl
, &args
);
71 debug("of_xlate() failed: %d\n", ret
);
75 ret
= ops
->request(reset_ctl
);
77 debug("ops->request() failed: %d\n", ret
);
84 int reset_get_by_name(struct udevice
*dev
, const char *name
,
85 struct reset_ctl
*reset_ctl
)
89 debug("%s(dev=%p, name=%s, reset_ctl=%p)\n", __func__
, dev
, name
,
91 reset_ctl
->dev
= NULL
;
93 index
= dev_read_stringlist_search(dev
, "reset-names", name
);
95 debug("fdt_stringlist_search() failed: %d\n", index
);
99 return reset_get_by_index(dev
, index
, reset_ctl
);
102 int reset_request(struct reset_ctl
*reset_ctl
)
104 struct reset_ops
*ops
= reset_dev_ops(reset_ctl
->dev
);
106 debug("%s(reset_ctl=%p)\n", __func__
, reset_ctl
);
108 return ops
->request(reset_ctl
);
111 int reset_free(struct reset_ctl
*reset_ctl
)
113 struct reset_ops
*ops
= reset_dev_ops(reset_ctl
->dev
);
115 debug("%s(reset_ctl=%p)\n", __func__
, reset_ctl
);
117 return ops
->free(reset_ctl
);
120 int reset_assert(struct reset_ctl
*reset_ctl
)
122 struct reset_ops
*ops
= reset_dev_ops(reset_ctl
->dev
);
124 debug("%s(reset_ctl=%p)\n", __func__
, reset_ctl
);
126 return ops
->rst_assert(reset_ctl
);
129 int reset_deassert(struct reset_ctl
*reset_ctl
)
131 struct reset_ops
*ops
= reset_dev_ops(reset_ctl
->dev
);
133 debug("%s(reset_ctl=%p)\n", __func__
, reset_ctl
);
135 return ops
->rst_deassert(reset_ctl
);
138 int reset_release_all(struct reset_ctl
*reset_ctl
, int count
)
142 for (i
= 0; i
< count
; i
++) {
143 debug("%s(reset_ctl[%d]=%p)\n", __func__
, i
, &reset_ctl
[i
]);
145 /* check if reset has been previously requested */
146 if (!reset_ctl
[i
].dev
)
149 ret
= reset_assert(&reset_ctl
[i
]);
153 ret
= reset_free(&reset_ctl
[i
]);
161 UCLASS_DRIVER(reset
) = {