Skip to content

Commit

Permalink
ARM: vexpress: move HBI check to sysreg driver
Browse files Browse the repository at this point in the history
The last reason for static memory mapping is the HBI (board
identification number) check early in the machine code.

Moving the check to the sysreg driver makes it possible to
completely remove the early mapping and init functions.

Signed-off-by: Pawel Moll <[email protected]>
Acked-by: Lee Jones <[email protected]>
  • Loading branch information
pawelmoll committed May 15, 2014
1 parent d2606f8 commit 6b2c31c
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 69 deletions.
49 changes: 0 additions & 49 deletions arch/arm/mach-vexpress/v2m.c
Original file line number Diff line number Diff line change
Expand Up @@ -370,53 +370,6 @@ MACHINE_START(VEXPRESS, "ARM-Versatile Express")
.init_machine = v2m_init,
MACHINE_END

static struct map_desc v2m_rs1_io_desc __initdata = {
.virtual = V2M_PERIPH,
.pfn = __phys_to_pfn(0x1c000000),
.length = SZ_2M,
.type = MT_DEVICE,
};

static int __init v2m_dt_scan_memory_map(unsigned long node, const char *uname,
int depth, void *data)
{
const char **map = data;

if (strcmp(uname, "motherboard") != 0)
return 0;

*map = of_get_flat_dt_prop(node, "arm,v2m-memory-map", NULL);

return 1;
}

void __init v2m_dt_map_io(void)
{
const char *map = NULL;

of_scan_flat_dt(v2m_dt_scan_memory_map, &map);

if (map && strcmp(map, "rs1") == 0)
iotable_init(&v2m_rs1_io_desc, 1);
else
iotable_init(v2m_io_desc, ARRAY_SIZE(v2m_io_desc));
}

void __init v2m_dt_init_early(void)
{
u32 dt_hbi;

/* Confirm board type against DT property, if available */
if (of_property_read_u32(of_allnodes, "arm,hbi", &dt_hbi) == 0) {
u32 hbi = vexpress_get_hbi(VEXPRESS_SITE_MASTER);

if (WARN_ON(dt_hbi != hbi))
pr_warning("vexpress: DT HBI (%x) is not matching "
"hardware (%x)!\n", dt_hbi, hbi);
}
}


static void __init v2m_dt_init(void)
{
l2x0_of_init(0x00400000, 0xfe0fffff);
Expand All @@ -432,7 +385,5 @@ DT_MACHINE_START(VEXPRESS_DT, "ARM-Versatile Express")
.dt_compat = v2m_dt_match,
.smp = smp_ops(vexpress_smp_dt_ops),
.smp_init = smp_init_ops(vexpress_smp_init_ops),
.map_io = v2m_dt_map_io,
.init_early = v2m_dt_init_early,
.init_machine = v2m_dt_init,
MACHINE_END
30 changes: 11 additions & 19 deletions drivers/mfd/vexpress-sysreg.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@
#define SYS_CFGSTAT 0x0a8

#define SYS_HBI_MASK 0xfff
#define SYS_ID_HBI_SHIFT 16
#define SYS_PROCIDx_HBI_SHIFT 0

#define SYS_MCI_CARDIN (1 << 0)
Expand Down Expand Up @@ -99,24 +98,6 @@ u32 vexpress_get_procid(int site)
SYS_PROCID0 : SYS_PROCID1));
}

u32 vexpress_get_hbi(int site)
{
u32 id;

switch (site) {
case VEXPRESS_SITE_MB:
id = readl(vexpress_sysreg_base() + SYS_ID);
return (id >> SYS_ID_HBI_SHIFT) & SYS_HBI_MASK;
case VEXPRESS_SITE_MASTER:
case VEXPRESS_SITE_DB1:
case VEXPRESS_SITE_DB2:
id = vexpress_get_procid(site);
return (id >> SYS_PROCIDx_HBI_SHIFT) & SYS_HBI_MASK;
}

return ~0;
}

void __iomem *vexpress_get_24mhz_clock_base(void)
{
return vexpress_sysreg_base() + SYS_24MHZ;
Expand Down Expand Up @@ -229,6 +210,7 @@ static int vexpress_sysreg_probe(struct platform_device *pdev)
struct resource *mem;
void __iomem *base;
struct bgpio_chip *mmc_gpio_chip;
u32 dt_hbi;

mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!mem)
Expand All @@ -240,6 +222,16 @@ static int vexpress_sysreg_probe(struct platform_device *pdev)

vexpress_config_set_master(vexpress_sysreg_get_master());

/* Confirm board type against DT property, if available */
if (of_property_read_u32(of_allnodes, "arm,hbi", &dt_hbi) == 0) {
u32 id = vexpress_get_procid(VEXPRESS_SITE_MASTER);
u32 hbi = (id >> SYS_PROCIDx_HBI_SHIFT) & SYS_HBI_MASK;

if (WARN_ON(dt_hbi != hbi))
dev_warn(&pdev->dev, "DT HBI (%x) is not matching hardware (%x)!\n",
dt_hbi, hbi);
}

/*
* Duplicated SYS_MCI pseudo-GPIO controller for compatibility with
* older trees using sysreg node for MMC control lines.
Expand Down
1 change: 0 additions & 1 deletion include/linux/vexpress.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ struct regmap *devm_regmap_init_vexpress_config(struct device *dev);

unsigned int vexpress_get_mci_cardin(struct device *dev);
u32 vexpress_get_procid(int site);
u32 vexpress_get_hbi(int site);
void *vexpress_get_24mhz_clock_base(void);
void vexpress_flags_set(u32 data);

Expand Down

0 comments on commit 6b2c31c

Please sign in to comment.