aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVenkata Narendra Kumar Gutta <vnkgutta@codeaurora.org>2018-09-12 14:06:33 -0400
committerAndy Gross <andy.gross@linaro.org>2018-09-13 16:53:58 -0400
commitc081f3060fab316fcf103967a24e502d58488849 (patch)
tree8e6e4f2dc4426a126ec08ed2880186a7883af7a1
parent7f9c136216c745099f36a4e0c3b2e63eedeb442f (diff)
soc: qcom: Add support to register LLCC EDAC driver
Cache error reporting controller detects and reports single and double bit errors on Last Level Cache Controller (LLCC) cache. Add required support to register LLCC EDAC driver as platform driver, from LLCC driver. Signed-off-by: Venkata Narendra Kumar Gutta <vnkgutta@codeaurora.org> Reviewed-by: Evan Green <evgreen@chromium.org> Signed-off-by: Andy Gross <andy.gross@linaro.org>
-rw-r--r--drivers/soc/qcom/llcc-slice.c18
-rw-r--r--include/linux/soc/qcom/llcc-qcom.h2
2 files changed, 18 insertions, 2 deletions
diff --git a/drivers/soc/qcom/llcc-slice.c b/drivers/soc/qcom/llcc-slice.c
index 08e3d388e153..d78926742510 100644
--- a/drivers/soc/qcom/llcc-slice.c
+++ b/drivers/soc/qcom/llcc-slice.c
@@ -225,7 +225,7 @@ static int qcom_llcc_cfg_program(struct platform_device *pdev)
225 u32 attr0_val; 225 u32 attr0_val;
226 u32 max_cap_cacheline; 226 u32 max_cap_cacheline;
227 u32 sz; 227 u32 sz;
228 int ret; 228 int ret = 0;
229 const struct llcc_slice_config *llcc_table; 229 const struct llcc_slice_config *llcc_table;
230 struct llcc_slice_desc desc; 230 struct llcc_slice_desc desc;
231 231
@@ -283,6 +283,7 @@ int qcom_llcc_probe(struct platform_device *pdev,
283 struct resource *llcc_banks_res, *llcc_bcast_res; 283 struct resource *llcc_banks_res, *llcc_bcast_res;
284 void __iomem *llcc_banks_base, *llcc_bcast_base; 284 void __iomem *llcc_banks_base, *llcc_bcast_base;
285 int ret, i; 285 int ret, i;
286 struct platform_device *llcc_edac;
286 287
287 drv_data = devm_kzalloc(dev, sizeof(*drv_data), GFP_KERNEL); 288 drv_data = devm_kzalloc(dev, sizeof(*drv_data), GFP_KERNEL);
288 if (!drv_data) 289 if (!drv_data)
@@ -342,7 +343,20 @@ int qcom_llcc_probe(struct platform_device *pdev,
342 mutex_init(&drv_data->lock); 343 mutex_init(&drv_data->lock);
343 platform_set_drvdata(pdev, drv_data); 344 platform_set_drvdata(pdev, drv_data);
344 345
345 return qcom_llcc_cfg_program(pdev); 346 ret = qcom_llcc_cfg_program(pdev);
347 if (ret)
348 return ret;
349
350 drv_data->ecc_irq = platform_get_irq(pdev, 0);
351 if (drv_data->ecc_irq >= 0) {
352 llcc_edac = platform_device_register_data(&pdev->dev,
353 "qcom_llcc_edac", -1, drv_data,
354 sizeof(*drv_data));
355 if (IS_ERR(llcc_edac))
356 dev_err(dev, "Failed to register llcc edac driver\n");
357 }
358
359 return ret;
346} 360}
347EXPORT_SYMBOL_GPL(qcom_llcc_probe); 361EXPORT_SYMBOL_GPL(qcom_llcc_probe);
348 362
diff --git a/include/linux/soc/qcom/llcc-qcom.h b/include/linux/soc/qcom/llcc-qcom.h
index c681e795b587..2e4b34d2617e 100644
--- a/include/linux/soc/qcom/llcc-qcom.h
+++ b/include/linux/soc/qcom/llcc-qcom.h
@@ -78,6 +78,7 @@ struct llcc_slice_config {
78 * @num_banks: Number of llcc banks 78 * @num_banks: Number of llcc banks
79 * @bitmap: Bit map to track the active slice ids 79 * @bitmap: Bit map to track the active slice ids
80 * @offsets: Pointer to the bank offsets array 80 * @offsets: Pointer to the bank offsets array
81 * @ecc_irq: interrupt for llcc cache error detection and reporting
81 */ 82 */
82struct llcc_drv_data { 83struct llcc_drv_data {
83 struct regmap *regmap; 84 struct regmap *regmap;
@@ -89,6 +90,7 @@ struct llcc_drv_data {
89 u32 num_banks; 90 u32 num_banks;
90 unsigned long *bitmap; 91 unsigned long *bitmap;
91 u32 *offsets; 92 u32 *offsets;
93 int ecc_irq;
92}; 94};
93 95
94#if IS_ENABLED(CONFIG_QCOM_LLCC) 96#if IS_ENABLED(CONFIG_QCOM_LLCC)