Commit 78183f3f authored by Paul Walmsley's avatar Paul Walmsley

omap_hwmod: use a null structure record to terminate omap_hwmod_addr_space arrays

Previously, struct omap_hwmod_addr_space arrays were unterminated; and
users of these arrays used the ARRAY_SIZE() macro to determine the
length of the array.  However, ARRAY_SIZE() only works when the array
is in the same scope as the macro user.

So far this hasn't been a problem.  However, to reduce duplicated
data, a subsequent patch will move common data to a separate, shared
file.  When this is done, ARRAY_SIZE() will no longer be usable.

This patch removes ARRAY_SIZE() usage for struct omap_hwmod_addr_space
arrays and uses a null structure member as the array terminator
instead.
Signed-off-by: default avatarPaul Walmsley <paul@pwsan.com>



parent ecba3287
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
* omap_hwmod implementation for OMAP2/3/4 * omap_hwmod implementation for OMAP2/3/4
* *
* Copyright (C) 2009-2011 Nokia Corporation * Copyright (C) 2009-2011 Nokia Corporation
* Copyright (C) 2011 Texas Instruments, Inc.
* *
* Paul Walmsley, Benoît Cousson, Kevin Hilman * Paul Walmsley, Benoît Cousson, Kevin Hilman
* *
...@@ -677,6 +678,29 @@ static void _disable_optional_clocks(struct omap_hwmod *oh) ...@@ -677,6 +678,29 @@ static void _disable_optional_clocks(struct omap_hwmod *oh)
} }
} }
/**
* _count_ocp_if_addr_spaces - count the number of address space entries for @oh
* @oh: struct omap_hwmod *oh
*
* Count and return the number of address space ranges associated with
* the hwmod @oh. Used to allocate struct resource data. Returns 0
* if @oh is NULL.
*/
static int _count_ocp_if_addr_spaces(struct omap_hwmod_ocp_if *os)
{
struct omap_hwmod_addr_space *mem;
int i = 0;
if (!os || !os->addr)
return 0;
do {
mem = &os->addr[i++];
} while (mem->pa_start != mem->pa_end);
return i;
}
/** /**
* _find_mpu_port_index - find hwmod OCP slave port ID intended for MPU use * _find_mpu_port_index - find hwmod OCP slave port ID intended for MPU use
* @oh: struct omap_hwmod * * @oh: struct omap_hwmod *
...@@ -722,8 +746,7 @@ static void __iomem * __init _find_mpu_rt_base(struct omap_hwmod *oh, u8 index) ...@@ -722,8 +746,7 @@ static void __iomem * __init _find_mpu_rt_base(struct omap_hwmod *oh, u8 index)
{ {
struct omap_hwmod_ocp_if *os; struct omap_hwmod_ocp_if *os;
struct omap_hwmod_addr_space *mem; struct omap_hwmod_addr_space *mem;
int i; int i = 0, found = 0;
int found = 0;
void __iomem *va_start; void __iomem *va_start;
if (!oh || oh->slaves_cnt == 0) if (!oh || oh->slaves_cnt == 0)
...@@ -731,12 +754,14 @@ static void __iomem * __init _find_mpu_rt_base(struct omap_hwmod *oh, u8 index) ...@@ -731,12 +754,14 @@ static void __iomem * __init _find_mpu_rt_base(struct omap_hwmod *oh, u8 index)
os = oh->slaves[index]; os = oh->slaves[index];
for (i = 0, mem = os->addr; i < os->addr_cnt; i++, mem++) { if (!os->addr)
if (mem->flags & ADDR_TYPE_RT) { return NULL;
do {
mem = &os->addr[i++];
if (mem->flags & ADDR_TYPE_RT)
found = 1; found = 1;
break; } while (!found && mem->pa_start != mem->pa_end);
}
}
if (found) { if (found) {
va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start); va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start);
...@@ -1942,7 +1967,7 @@ int omap_hwmod_count_resources(struct omap_hwmod *oh) ...@@ -1942,7 +1967,7 @@ int omap_hwmod_count_resources(struct omap_hwmod *oh)
ret = oh->mpu_irqs_cnt + oh->sdma_reqs_cnt; ret = oh->mpu_irqs_cnt + oh->sdma_reqs_cnt;
for (i = 0; i < oh->slaves_cnt; i++) for (i = 0; i < oh->slaves_cnt; i++)
ret += oh->slaves[i]->addr_cnt; ret += _count_ocp_if_addr_spaces(oh->slaves[i]);
return ret; return ret;
} }
...@@ -1982,10 +2007,12 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res) ...@@ -1982,10 +2007,12 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res)
for (i = 0; i < oh->slaves_cnt; i++) { for (i = 0; i < oh->slaves_cnt; i++) {
struct omap_hwmod_ocp_if *os; struct omap_hwmod_ocp_if *os;
int addr_cnt;
os = oh->slaves[i]; os = oh->slaves[i];
addr_cnt = _count_ocp_if_addr_spaces(os);
for (j = 0; j < os->addr_cnt; j++) { for (j = 0; j < addr_cnt; j++) {
(res + r)->name = (os->addr + j)->name; (res + r)->name = (os->addr + j)->name;
(res + r)->start = (os->addr + j)->pa_start; (res + r)->start = (os->addr + j)->pa_start;
(res + r)->end = (os->addr + j)->pa_end; (res + r)->end = (os->addr + j)->pa_end;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -220,7 +220,6 @@ struct omap_hwmod_addr_space { ...@@ -220,7 +220,6 @@ struct omap_hwmod_addr_space {
* @clk: interface clock: OMAP clock name * @clk: interface clock: OMAP clock name
* @_clk: pointer to the interface struct clk (filled in at runtime) * @_clk: pointer to the interface struct clk (filled in at runtime)
* @fw: interface firewall data * @fw: interface firewall data
* @addr_cnt: ARRAY_SIZE(@addr)
* @width: OCP data width * @width: OCP data width
* @user: initiators using this interface (see OCP_USER_* macros above) * @user: initiators using this interface (see OCP_USER_* macros above)
* @flags: OCP interface flags (see OCPIF_* macros above) * @flags: OCP interface flags (see OCPIF_* macros above)
...@@ -239,7 +238,6 @@ struct omap_hwmod_ocp_if { ...@@ -239,7 +238,6 @@ struct omap_hwmod_ocp_if {
union { union {
struct omap_hwmod_omap2_firewall omap2; struct omap_hwmod_omap2_firewall omap2;
} fw; } fw;
u8 addr_cnt;
u8 width; u8 width;
u8 user; u8 user;
u8 flags; u8 flags;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment