Skip to content

Commit

Permalink
soc/tegra: fuse: Set up in early initcall
Browse files Browse the repository at this point in the history
Rather than rely on explicit initialization order called from SoC setup
code, use a plain initcall and rely on initcall ordering to take care of
dependencies.

This driver exposes some functionality (querying the chip ID) needed at
very early stages of the boot process. An early initcall is good enough
provided that some of the dependencies are deferred to later stages. To
make sure any abuses are easily caught, output a warning message if the
chip ID is queried while it can't be read yet.

Signed-off-by: Thierry Reding <[email protected]>
  • Loading branch information
thierryreding committed Jul 17, 2014
1 parent c090e11 commit 24fa5af
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 6 deletions.
1 change: 0 additions & 1 deletion arch/arm/mach-tegra/tegra.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ u32 tegra_uart_config[3] = {
static void __init tegra_init_early(void)
{
of_register_trusted_foundations();
tegra_init_fuse();
tegra_cpu_reset_handler_init();
tegra_powergate_init();
}
Expand Down
11 changes: 9 additions & 2 deletions drivers/soc/tegra/fuse/fuse-tegra.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <linux/of_address.h>
#include <linux/io.h>

#include <soc/tegra/common.h>
#include <soc/tegra/fuse.h>

#include "fuse.h"
Expand Down Expand Up @@ -125,11 +126,14 @@ int tegra_fuse_create_sysfs(struct device *dev, int size,
return device_create_bin_file(dev, &fuse_bin_attr);
}

void __init tegra_init_fuse(void)
static int __init tegra_init_fuse(void)
{
struct device_node *np;
void __iomem *car_base;

if (!soc_is_tegra())
return 0;

tegra_init_apbmisc();

np = of_find_matching_node(NULL, car_match);
Expand All @@ -139,7 +143,7 @@ void __init tegra_init_fuse(void)
iounmap(car_base);
} else {
pr_err("Could not enable fuse clk. ioremap tegra car failed.\n");
return;
return -ENXIO;
}

if (tegra_get_chip_id() == TEGRA20)
Expand All @@ -153,4 +157,7 @@ void __init tegra_init_fuse(void)
tegra_sku_info.core_process_id);
pr_debug("Tegra CPU Speedo ID %d, Soc Speedo ID %d\n",
tegra_sku_info.cpu_speedo_id, tegra_sku_info.soc_speedo_id);

return 0;
}
early_initcall(tegra_init_fuse);
7 changes: 5 additions & 2 deletions drivers/soc/tegra/fuse/tegra-apbmisc.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,12 @@ u32 tegra_read_chipid(void)

u8 tegra_get_chip_id(void)
{
u32 id = tegra_read_chipid();
if (!apbmisc_base) {
WARN(1, "Tegra Chip ID not yet available\n");
return 0;
}

return (id >> 8) & 0xff;
return (tegra_read_chipid() >> 8) & 0xff;
}

u32 tegra_read_straps(void)
Expand Down
1 change: 0 additions & 1 deletion include/soc/tegra/fuse.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ struct tegra_sku_info {

u32 tegra_read_straps(void);
u32 tegra_read_chipid(void);
void tegra_init_fuse(void);
int tegra_fuse_readl(unsigned long offset, u32 *value);

extern struct tegra_sku_info tegra_sku_info;
Expand Down

0 comments on commit 24fa5af

Please sign in to comment.