diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/bus/omap_l3_noc.c | 31 | ||||
-rw-r--r-- | drivers/bus/omap_l3_noc.h | 11 |
2 files changed, 39 insertions, 3 deletions
diff --git a/drivers/bus/omap_l3_noc.c b/drivers/bus/omap_l3_noc.c index 343f002a06f7..7743e86e88b1 100644 --- a/drivers/bus/omap_l3_noc.c +++ b/drivers/bus/omap_l3_noc.c | |||
@@ -75,10 +75,41 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3) | |||
75 | if (err_reg) { | 75 | if (err_reg) { |
76 | /* Identify the source from control status register */ | 76 | /* Identify the source from control status register */ |
77 | err_src = __ffs(err_reg); | 77 | err_src = __ffs(err_reg); |
78 | |||
79 | /* We DONOT expect err_src to go out of bounds */ | ||
80 | BUG_ON(err_src > MAX_CLKDM_TARGETS); | ||
81 | |||
78 | l3_targ_inst = &l3_targ[i][err_src]; | 82 | l3_targ_inst = &l3_targ[i][err_src]; |
79 | target_name = l3_targ_inst->name; | 83 | target_name = l3_targ_inst->name; |
80 | l3_targ_base = base + l3_targ_inst->offset; | 84 | l3_targ_base = base + l3_targ_inst->offset; |
81 | 85 | ||
86 | /* | ||
87 | * If we do not know of a register offset to decode | ||
88 | * and clear, then mask. | ||
89 | */ | ||
90 | if (target_name == L3_TARGET_NOT_SUPPORTED) { | ||
91 | u32 mask_val; | ||
92 | void __iomem *mask_reg; | ||
93 | |||
94 | /* | ||
95 | * Certain plaforms may have "undocumented" | ||
96 | * status pending on boot.. So dont generate | ||
97 | * a severe warning here. | ||
98 | */ | ||
99 | dev_err(l3->dev, | ||
100 | "L3 %s error: target %d mod:%d %s\n", | ||
101 | inttype ? "debug" : "application", | ||
102 | err_src, i, "(unclearable)"); | ||
103 | |||
104 | mask_reg = base + l3_flagmux[i] + | ||
105 | L3_FLAGMUX_MASK0 + (inttype << 3); | ||
106 | mask_val = readl_relaxed(mask_reg); | ||
107 | mask_val &= ~(1 << err_src); | ||
108 | writel_relaxed(mask_val, mask_reg); | ||
109 | |||
110 | break; | ||
111 | } | ||
112 | |||
82 | /* Read the stderrlog_main_source from clk domain */ | 113 | /* Read the stderrlog_main_source from clk domain */ |
83 | l3_targ_stderr = l3_targ_base + L3_TARG_STDERRLOG_MAIN; | 114 | l3_targ_stderr = l3_targ_base + L3_TARG_STDERRLOG_MAIN; |
84 | l3_targ_slvofslsb = l3_targ_base + | 115 | l3_targ_slvofslsb = l3_targ_base + |
diff --git a/drivers/bus/omap_l3_noc.h b/drivers/bus/omap_l3_noc.h index ae2878464efa..66caeceaf123 100644 --- a/drivers/bus/omap_l3_noc.h +++ b/drivers/bus/omap_l3_noc.h | |||
@@ -30,6 +30,11 @@ | |||
30 | #define L3_TARG_STDERRLOG_SLVOFSLSB 0x5c | 30 | #define L3_TARG_STDERRLOG_SLVOFSLSB 0x5c |
31 | #define L3_TARG_STDERRLOG_MSTADDR 0x68 | 31 | #define L3_TARG_STDERRLOG_MSTADDR 0x68 |
32 | #define L3_FLAGMUX_REGERR0 0xc | 32 | #define L3_FLAGMUX_REGERR0 0xc |
33 | #define L3_FLAGMUX_MASK0 0x8 | ||
34 | |||
35 | #define L3_TARGET_NOT_SUPPORTED NULL | ||
36 | |||
37 | #define MAX_CLKDM_TARGETS 31 | ||
33 | 38 | ||
34 | #define NUM_OF_L3_MASTERS (sizeof(l3_masters)/sizeof(l3_masters[0])) | 39 | #define NUM_OF_L3_MASTERS (sizeof(l3_masters)/sizeof(l3_masters[0])) |
35 | 40 | ||
@@ -61,7 +66,7 @@ static u32 l3_flagmux[L3_MODULES] = { | |||
61 | 0X0200 | 66 | 0X0200 |
62 | }; | 67 | }; |
63 | 68 | ||
64 | static struct l3_target_data l3_target_inst_data_clk1[] = { | 69 | static struct l3_target_data l3_target_inst_data_clk1[MAX_CLKDM_TARGETS] = { |
65 | {0x100, "DMM1",}, | 70 | {0x100, "DMM1",}, |
66 | {0x200, "DMM2",}, | 71 | {0x200, "DMM2",}, |
67 | {0x300, "ABE",}, | 72 | {0x300, "ABE",}, |
@@ -71,7 +76,7 @@ static struct l3_target_data l3_target_inst_data_clk1[] = { | |||
71 | {0x900, "L4WAKEUP",}, | 76 | {0x900, "L4WAKEUP",}, |
72 | }; | 77 | }; |
73 | 78 | ||
74 | static struct l3_target_data l3_target_inst_data_clk2[] = { | 79 | static struct l3_target_data l3_target_inst_data_clk2[MAX_CLKDM_TARGETS] = { |
75 | {0x500, "CORTEXM3",}, | 80 | {0x500, "CORTEXM3",}, |
76 | {0x300, "DSS",}, | 81 | {0x300, "DSS",}, |
77 | {0x100, "GPMC",}, | 82 | {0x100, "GPMC",}, |
@@ -95,7 +100,7 @@ static struct l3_target_data l3_target_inst_data_clk2[] = { | |||
95 | {0x1700, "LLI",}, | 100 | {0x1700, "LLI",}, |
96 | }; | 101 | }; |
97 | 102 | ||
98 | static struct l3_target_data l3_target_inst_data_clk3[] = { | 103 | static struct l3_target_data l3_target_inst_data_clk3[MAX_CLKDM_TARGETS] = { |
99 | {0x0100, "EMUSS",}, | 104 | {0x0100, "EMUSS",}, |
100 | {0x0300, "DEBUG SOURCE",}, | 105 | {0x0300, "DEBUG SOURCE",}, |
101 | {0x0, "HOST CLK3",}, | 106 | {0x0, "HOST CLK3",}, |