diff options
-rw-r--r-- | drivers/soc/qcom/llcc-slice.c | 55 | ||||
-rw-r--r-- | include/linux/soc/qcom/llcc-qcom.h | 4 |
2 files changed, 35 insertions, 24 deletions
diff --git a/drivers/soc/qcom/llcc-slice.c b/drivers/soc/qcom/llcc-slice.c index 54063a31132f..08e3d388e153 100644 --- a/drivers/soc/qcom/llcc-slice.c +++ b/drivers/soc/qcom/llcc-slice.c | |||
@@ -106,22 +106,24 @@ static int llcc_update_act_ctrl(u32 sid, | |||
106 | u32 slice_status; | 106 | u32 slice_status; |
107 | int ret; | 107 | int ret; |
108 | 108 | ||
109 | act_ctrl_reg = drv_data->bcast_off + LLCC_TRP_ACT_CTRLn(sid); | 109 | act_ctrl_reg = LLCC_TRP_ACT_CTRLn(sid); |
110 | status_reg = drv_data->bcast_off + LLCC_TRP_STATUSn(sid); | 110 | status_reg = LLCC_TRP_STATUSn(sid); |
111 | 111 | ||
112 | /* Set the ACTIVE trigger */ | 112 | /* Set the ACTIVE trigger */ |
113 | act_ctrl_reg_val |= ACT_CTRL_ACT_TRIG; | 113 | act_ctrl_reg_val |= ACT_CTRL_ACT_TRIG; |
114 | ret = regmap_write(drv_data->regmap, act_ctrl_reg, act_ctrl_reg_val); | 114 | ret = regmap_write(drv_data->bcast_regmap, act_ctrl_reg, |
115 | act_ctrl_reg_val); | ||
115 | if (ret) | 116 | if (ret) |
116 | return ret; | 117 | return ret; |
117 | 118 | ||
118 | /* Clear the ACTIVE trigger */ | 119 | /* Clear the ACTIVE trigger */ |
119 | act_ctrl_reg_val &= ~ACT_CTRL_ACT_TRIG; | 120 | act_ctrl_reg_val &= ~ACT_CTRL_ACT_TRIG; |
120 | ret = regmap_write(drv_data->regmap, act_ctrl_reg, act_ctrl_reg_val); | 121 | ret = regmap_write(drv_data->bcast_regmap, act_ctrl_reg, |
122 | act_ctrl_reg_val); | ||
121 | if (ret) | 123 | if (ret) |
122 | return ret; | 124 | return ret; |
123 | 125 | ||
124 | ret = regmap_read_poll_timeout(drv_data->regmap, status_reg, | 126 | ret = regmap_read_poll_timeout(drv_data->bcast_regmap, status_reg, |
125 | slice_status, !(slice_status & status), | 127 | slice_status, !(slice_status & status), |
126 | 0, LLCC_STATUS_READ_DELAY); | 128 | 0, LLCC_STATUS_READ_DELAY); |
127 | return ret; | 129 | return ret; |
@@ -226,16 +228,13 @@ static int qcom_llcc_cfg_program(struct platform_device *pdev) | |||
226 | int ret; | 228 | int ret; |
227 | const struct llcc_slice_config *llcc_table; | 229 | const struct llcc_slice_config *llcc_table; |
228 | struct llcc_slice_desc desc; | 230 | struct llcc_slice_desc desc; |
229 | u32 bcast_off = drv_data->bcast_off; | ||
230 | 231 | ||
231 | sz = drv_data->cfg_size; | 232 | sz = drv_data->cfg_size; |
232 | llcc_table = drv_data->cfg; | 233 | llcc_table = drv_data->cfg; |
233 | 234 | ||
234 | for (i = 0; i < sz; i++) { | 235 | for (i = 0; i < sz; i++) { |
235 | attr1_cfg = bcast_off + | 236 | attr1_cfg = LLCC_TRP_ATTR1_CFGn(llcc_table[i].slice_id); |
236 | LLCC_TRP_ATTR1_CFGn(llcc_table[i].slice_id); | 237 | attr0_cfg = LLCC_TRP_ATTR0_CFGn(llcc_table[i].slice_id); |
237 | attr0_cfg = bcast_off + | ||
238 | LLCC_TRP_ATTR0_CFGn(llcc_table[i].slice_id); | ||
239 | 238 | ||
240 | attr1_val = llcc_table[i].cache_mode; | 239 | attr1_val = llcc_table[i].cache_mode; |
241 | attr1_val |= llcc_table[i].probe_target_ways << | 240 | attr1_val |= llcc_table[i].probe_target_ways << |
@@ -260,10 +259,12 @@ static int qcom_llcc_cfg_program(struct platform_device *pdev) | |||
260 | attr0_val = llcc_table[i].res_ways & ATTR0_RES_WAYS_MASK; | 259 | attr0_val = llcc_table[i].res_ways & ATTR0_RES_WAYS_MASK; |
261 | attr0_val |= llcc_table[i].bonus_ways << ATTR0_BONUS_WAYS_SHIFT; | 260 | attr0_val |= llcc_table[i].bonus_ways << ATTR0_BONUS_WAYS_SHIFT; |
262 | 261 | ||
263 | ret = regmap_write(drv_data->regmap, attr1_cfg, attr1_val); | 262 | ret = regmap_write(drv_data->bcast_regmap, attr1_cfg, |
263 | attr1_val); | ||
264 | if (ret) | 264 | if (ret) |
265 | return ret; | 265 | return ret; |
266 | ret = regmap_write(drv_data->regmap, attr0_cfg, attr0_val); | 266 | ret = regmap_write(drv_data->bcast_regmap, attr0_cfg, |
267 | attr0_val); | ||
267 | if (ret) | 268 | if (ret) |
268 | return ret; | 269 | return ret; |
269 | if (llcc_table[i].activate_on_init) { | 270 | if (llcc_table[i].activate_on_init) { |
@@ -279,24 +280,36 @@ int qcom_llcc_probe(struct platform_device *pdev, | |||
279 | { | 280 | { |
280 | u32 num_banks; | 281 | u32 num_banks; |
281 | struct device *dev = &pdev->dev; | 282 | struct device *dev = &pdev->dev; |
282 | struct resource *res; | 283 | struct resource *llcc_banks_res, *llcc_bcast_res; |
283 | void __iomem *base; | 284 | void __iomem *llcc_banks_base, *llcc_bcast_base; |
284 | int ret, i; | 285 | int ret, i; |
285 | 286 | ||
286 | drv_data = devm_kzalloc(dev, sizeof(*drv_data), GFP_KERNEL); | 287 | drv_data = devm_kzalloc(dev, sizeof(*drv_data), GFP_KERNEL); |
287 | if (!drv_data) | 288 | if (!drv_data) |
288 | return -ENOMEM; | 289 | return -ENOMEM; |
289 | 290 | ||
290 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 291 | llcc_banks_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, |
291 | base = devm_ioremap_resource(&pdev->dev, res); | 292 | "llcc_base"); |
292 | if (IS_ERR(base)) | 293 | llcc_banks_base = devm_ioremap_resource(&pdev->dev, llcc_banks_res); |
293 | return PTR_ERR(base); | 294 | if (IS_ERR(llcc_banks_base)) |
295 | return PTR_ERR(llcc_banks_base); | ||
294 | 296 | ||
295 | drv_data->regmap = devm_regmap_init_mmio(dev, base, | 297 | drv_data->regmap = devm_regmap_init_mmio(dev, llcc_banks_base, |
296 | &llcc_regmap_config); | 298 | &llcc_regmap_config); |
297 | if (IS_ERR(drv_data->regmap)) | 299 | if (IS_ERR(drv_data->regmap)) |
298 | return PTR_ERR(drv_data->regmap); | 300 | return PTR_ERR(drv_data->regmap); |
299 | 301 | ||
302 | llcc_bcast_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, | ||
303 | "llcc_broadcast_base"); | ||
304 | llcc_bcast_base = devm_ioremap_resource(&pdev->dev, llcc_bcast_res); | ||
305 | if (IS_ERR(llcc_bcast_base)) | ||
306 | return PTR_ERR(llcc_bcast_base); | ||
307 | |||
308 | drv_data->bcast_regmap = devm_regmap_init_mmio(dev, llcc_bcast_base, | ||
309 | &llcc_regmap_config); | ||
310 | if (IS_ERR(drv_data->bcast_regmap)) | ||
311 | return PTR_ERR(drv_data->bcast_regmap); | ||
312 | |||
300 | ret = regmap_read(drv_data->regmap, LLCC_COMMON_STATUS0, | 313 | ret = regmap_read(drv_data->regmap, LLCC_COMMON_STATUS0, |
301 | &num_banks); | 314 | &num_banks); |
302 | if (ret) | 315 | if (ret) |
@@ -318,8 +331,6 @@ int qcom_llcc_probe(struct platform_device *pdev, | |||
318 | for (i = 0; i < num_banks; i++) | 331 | for (i = 0; i < num_banks; i++) |
319 | drv_data->offsets[i] = i * BANK_OFFSET_STRIDE; | 332 | drv_data->offsets[i] = i * BANK_OFFSET_STRIDE; |
320 | 333 | ||
321 | drv_data->bcast_off = num_banks * BANK_OFFSET_STRIDE; | ||
322 | |||
323 | drv_data->bitmap = devm_kcalloc(dev, | 334 | drv_data->bitmap = devm_kcalloc(dev, |
324 | BITS_TO_LONGS(drv_data->max_slices), sizeof(unsigned long), | 335 | BITS_TO_LONGS(drv_data->max_slices), sizeof(unsigned long), |
325 | GFP_KERNEL); | 336 | GFP_KERNEL); |
diff --git a/include/linux/soc/qcom/llcc-qcom.h b/include/linux/soc/qcom/llcc-qcom.h index 7e3b9c605ab2..c681e795b587 100644 --- a/include/linux/soc/qcom/llcc-qcom.h +++ b/include/linux/soc/qcom/llcc-qcom.h | |||
@@ -70,22 +70,22 @@ struct llcc_slice_config { | |||
70 | /** | 70 | /** |
71 | * llcc_drv_data - Data associated with the llcc driver | 71 | * llcc_drv_data - Data associated with the llcc driver |
72 | * @regmap: regmap associated with the llcc device | 72 | * @regmap: regmap associated with the llcc device |
73 | * @bcast_regmap: regmap associated with llcc broadcast offset | ||
73 | * @cfg: pointer to the data structure for slice configuration | 74 | * @cfg: pointer to the data structure for slice configuration |
74 | * @lock: mutex associated with each slice | 75 | * @lock: mutex associated with each slice |
75 | * @cfg_size: size of the config data table | 76 | * @cfg_size: size of the config data table |
76 | * @max_slices: max slices as read from device tree | 77 | * @max_slices: max slices as read from device tree |
77 | * @bcast_off: Offset of the broadcast bank | ||
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 | */ | 81 | */ |
82 | struct llcc_drv_data { | 82 | struct llcc_drv_data { |
83 | struct regmap *regmap; | 83 | struct regmap *regmap; |
84 | struct regmap *bcast_regmap; | ||
84 | const struct llcc_slice_config *cfg; | 85 | const struct llcc_slice_config *cfg; |
85 | struct mutex lock; | 86 | struct mutex lock; |
86 | u32 cfg_size; | 87 | u32 cfg_size; |
87 | u32 max_slices; | 88 | u32 max_slices; |
88 | u32 bcast_off; | ||
89 | u32 num_banks; | 89 | u32 num_banks; |
90 | unsigned long *bitmap; | 90 | unsigned long *bitmap; |
91 | u32 *offsets; | 91 | u32 *offsets; |