timer-uclass: relocate ops pointers for CONFIG_NEEDS_MANUAL_RELOC
Relocate timer_ops pointers when CONFIG_NEEDS_MANUAL_RELOC is enabled. The (gd->flags & GD_FLG_RELOC) check was added to make sure the reloc_done logic works for drivers that use DM_FLAG_PRE_RELOC. Signed-off-by: Ovidiu Panait <ovpanait@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org> Link: https://lore.kernel.org/r/20221012053656.1492457-2-ovpanait@gmail.com Signed-off-by: Michal Simek <michal.simek@amd.com>
This commit is contained in:
parent
1e766a04c7
commit
8272d4cb89
@ -18,6 +18,7 @@
|
|||||||
#include <init.h>
|
#include <init.h>
|
||||||
#include <timer.h>
|
#include <timer.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
|
#include <relocate.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
@ -50,6 +51,19 @@ unsigned long notrace timer_get_rate(struct udevice *dev)
|
|||||||
|
|
||||||
static int timer_pre_probe(struct udevice *dev)
|
static int timer_pre_probe(struct udevice *dev)
|
||||||
{
|
{
|
||||||
|
if (IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC) &&
|
||||||
|
(gd->flags & GD_FLG_RELOC)) {
|
||||||
|
struct timer_ops *ops = timer_get_ops(dev);
|
||||||
|
static int reloc_done;
|
||||||
|
|
||||||
|
if (!reloc_done) {
|
||||||
|
if (ops->get_count)
|
||||||
|
MANUAL_RELOC(ops->get_count);
|
||||||
|
|
||||||
|
reloc_done++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (CONFIG_IS_ENABLED(OF_REAL)) {
|
if (CONFIG_IS_ENABLED(OF_REAL)) {
|
||||||
struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev);
|
struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev);
|
||||||
struct clk timer_clk;
|
struct clk timer_clk;
|
||||||
|
Loading…
Reference in New Issue
Block a user