mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-28 21:02:43 +01:00
soc/tegra: fuse: Add tegra_acpi_init_apbmisc()
In preparation to ACPI support in Tegra fuse driver add function tegra_acpi_init_apbmisc() to initialize tegra-apbmisc driver. Also, document the reason of calling tegra_init_apbmisc() at early init. Note that function tegra_acpi_init_apbmisc() is not placed in the __init section, because it will be called during probe. Signed-off-by: Kartik <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
This commit is contained in:
1 parent
f0139d6666
commit
7b0c505eb3
2 files changed
+73
No files matched your search
@@ -69,6 +69,7 @@ struct tegra_fuse {
|
||||
|
||||
void tegra_init_revision(void);
|
||||
void tegra_init_apbmisc(void);
|
||||
void tegra_acpi_init_apbmisc(void);
|
||||
|
||||
u32 __init tegra_fuse_read_spare(unsigned int spare);
|
||||
u32 __init tegra_fuse_read_early(unsigned int offset);
|
||||
|
||||
@@ -3,9 +3,11 @@
|
||||
* Copyright (c) 2014-2023, NVIDIA CORPORATION. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
|
||||
@@ -180,6 +182,12 @@ static void tegra_init_apbmisc_resources(struct resource *apbmisc,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* tegra_init_apbmisc - Initializes Tegra APBMISC and Strapping registers.
|
||||
*
|
||||
* This is called during early init as some of the old 32-bit ARM code needs
|
||||
* information from the APBMISC registers very early during boot.
|
||||
*/
|
||||
void __init tegra_init_apbmisc(void)
|
||||
{
|
||||
struct resource apbmisc, straps;
|
||||
@@ -244,3 +252,67 @@ void __init tegra_init_apbmisc(void)
|
||||
put:
|
||||
of_node_put(np);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static const struct acpi_device_id apbmisc_acpi_match[] = {
|
||||
{ "NVDA2010" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
void tegra_acpi_init_apbmisc(void)
|
||||
{
|
||||
struct resource *resources[2] = { NULL };
|
||||
struct resource_entry *rentry;
|
||||
struct acpi_device *adev = NULL;
|
||||
struct list_head resource_list;
|
||||
int rcount = 0;
|
||||
int ret;
|
||||
|
||||
adev = acpi_dev_get_first_match_dev(apbmisc_acpi_match[0].id, NULL, -1);
|
||||
if (!adev)
|
||||
return;
|
||||
|
||||
INIT_LIST_HEAD(&resource_list);
|
||||
|
||||
ret = acpi_dev_get_memory_resources(adev, &resource_list);
|
||||
if (ret < 0) {
|
||||
pr_err("failed to get APBMISC memory resources");
|
||||
goto out_put_acpi_dev;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get required memory resources.
|
||||
*
|
||||
* resources[0]: apbmisc.
|
||||
* resources[1]: straps.
|
||||
*/
|
||||
resource_list_for_each_entry(rentry, &resource_list) {
|
||||
if (rcount >= ARRAY_SIZE(resources))
|
||||
break;
|
||||
|
||||
resources[rcount++] = rentry->res;
|
||||
}
|
||||
|
||||
if (!resources[0]) {
|
||||
pr_err("failed to get APBMISC registers\n");
|
||||
goto out_free_resource_list;
|
||||
}
|
||||
|
||||
if (!resources[1]) {
|
||||
pr_err("failed to get strapping options registers\n");
|
||||
goto out_free_resource_list;
|
||||
}
|
||||
|
||||
tegra_init_apbmisc_resources(resources[0], resources[1]);
|
||||
|
||||
out_free_resource_list:
|
||||
acpi_dev_free_resource_list(&resource_list);
|
||||
|
||||
out_put_acpi_dev:
|
||||
acpi_dev_put(adev);
|
||||
}
|
||||
#else
|
||||
void tegra_acpi_init_apbmisc(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
Reference in new issue
Block a user