1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2016 NVIDIA Corporation
6 #include <linux/reset-controller.h>
8 #include <soc/tegra/bpmp.h>
9 #include <soc/tegra/bpmp-abi.h>
11 static struct tegra_bpmp
*to_tegra_bpmp(struct reset_controller_dev
*rstc
)
13 return container_of(rstc
, struct tegra_bpmp
, rstc
);
16 static int tegra_bpmp_reset_common(struct reset_controller_dev
*rstc
,
17 enum mrq_reset_commands command
,
20 struct tegra_bpmp
*bpmp
= to_tegra_bpmp(rstc
);
21 struct mrq_reset_request request
;
22 struct tegra_bpmp_message msg
;
25 memset(&request
, 0, sizeof(request
));
26 request
.cmd
= command
;
27 request
.reset_id
= id
;
29 memset(&msg
, 0, sizeof(msg
));
31 msg
.tx
.data
= &request
;
32 msg
.tx
.size
= sizeof(request
);
34 err
= tegra_bpmp_transfer(bpmp
, &msg
);
43 static int tegra_bpmp_reset_module(struct reset_controller_dev
*rstc
,
46 return tegra_bpmp_reset_common(rstc
, CMD_RESET_MODULE
, id
);
49 static int tegra_bpmp_reset_assert(struct reset_controller_dev
*rstc
,
52 return tegra_bpmp_reset_common(rstc
, CMD_RESET_ASSERT
, id
);
55 static int tegra_bpmp_reset_deassert(struct reset_controller_dev
*rstc
,
58 return tegra_bpmp_reset_common(rstc
, CMD_RESET_DEASSERT
, id
);
61 static const struct reset_control_ops tegra_bpmp_reset_ops
= {
62 .reset
= tegra_bpmp_reset_module
,
63 .assert = tegra_bpmp_reset_assert
,
64 .deassert
= tegra_bpmp_reset_deassert
,
67 int tegra_bpmp_init_resets(struct tegra_bpmp
*bpmp
)
69 bpmp
->rstc
.ops
= &tegra_bpmp_reset_ops
;
70 bpmp
->rstc
.owner
= THIS_MODULE
;
71 bpmp
->rstc
.of_node
= bpmp
->dev
->of_node
;
72 bpmp
->rstc
.nr_resets
= bpmp
->soc
->num_resets
;
74 return devm_reset_controller_register(bpmp
->dev
, &bpmp
->rstc
);