Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'ib-mfd-soc-samsung-6.11' into ibs-for-mfd-merged

+71 -25
+48
drivers/mfd/syscon.c
··· 192 192 return syscon->regmap; 193 193 } 194 194 195 + /** 196 + * of_syscon_register_regmap() - Register regmap for specified device node 197 + * @np: Device tree node 198 + * @regmap: Pointer to regmap object 199 + * 200 + * Register an externally created regmap object with syscon for the specified 201 + * device tree node. This regmap will then be returned to client drivers using 202 + * the syscon_regmap_lookup_by_phandle() API. 203 + * 204 + * Return: 0 on success, negative error code on failure. 205 + */ 206 + int of_syscon_register_regmap(struct device_node *np, struct regmap *regmap) 207 + { 208 + struct syscon *entry, *syscon = NULL; 209 + int ret; 210 + 211 + if (!np || !regmap) 212 + return -EINVAL; 213 + 214 + syscon = kzalloc(sizeof(*syscon), GFP_KERNEL); 215 + if (!syscon) 216 + return -ENOMEM; 217 + 218 + /* check if syscon entry already exists */ 219 + spin_lock(&syscon_list_slock); 220 + 221 + list_for_each_entry(entry, &syscon_list, list) 222 + if (entry->np == np) { 223 + ret = -EEXIST; 224 + goto err_unlock; 225 + } 226 + 227 + syscon->regmap = regmap; 228 + syscon->np = np; 229 + 230 + /* register the regmap in syscon list */ 231 + list_add_tail(&syscon->list, &syscon_list); 232 + spin_unlock(&syscon_list_slock); 233 + 234 + return 0; 235 + 236 + err_unlock: 237 + spin_unlock(&syscon_list_slock); 238 + kfree(syscon); 239 + return ret; 240 + } 241 + EXPORT_SYMBOL_GPL(of_syscon_register_regmap); 242 + 195 243 struct regmap *device_node_to_regmap(struct device_node *np) 196 244 { 197 245 return device_node_get_regmap(np, false);
+15 -25
drivers/soc/samsung/exynos-pmu.c
··· 204 204 .reg_update_bits = tensor_sec_update_bits, 205 205 }; 206 206 207 - static const struct regmap_config regmap_mmiocfg = { 208 - .name = "pmu_regs", 209 - .reg_bits = 32, 210 - .reg_stride = 4, 211 - .val_bits = 32, 212 - .fast_io = true, 213 - .use_single_read = true, 214 - .use_single_write = true, 215 - }; 216 - 217 207 static const struct exynos_pmu_data gs101_pmu_data = { 218 208 .pmu_secure = true 219 209 }; ··· 280 290 struct regmap *exynos_get_pmu_regmap_by_phandle(struct device_node *np, 281 291 const char *propname) 282 292 { 283 - struct exynos_pmu_context *ctx; 284 293 struct device_node *pmu_np; 285 294 struct device *dev; 286 295 ··· 305 316 if (!dev) 306 317 return ERR_PTR(-EPROBE_DEFER); 307 318 308 - ctx = dev_get_drvdata(dev); 309 - 310 - return ctx->pmureg; 319 + return syscon_node_to_regmap(pmu_np); 311 320 } 312 321 EXPORT_SYMBOL_GPL(exynos_get_pmu_regmap_by_phandle); 313 322 ··· 342 355 regmap = devm_regmap_init(dev, NULL, 343 356 (void *)(uintptr_t)res->start, 344 357 &pmu_regmcfg); 345 - } else { 346 - /* All other SoCs use a MMIO regmap */ 347 - pmu_regmcfg = regmap_mmiocfg; 348 - pmu_regmcfg.max_register = resource_size(res) - 349 - pmu_regmcfg.reg_stride; 350 - regmap = devm_regmap_init_mmio(dev, pmu_base_addr, 351 - &pmu_regmcfg); 352 - } 353 358 354 - if (IS_ERR(regmap)) 355 - return dev_err_probe(&pdev->dev, PTR_ERR(regmap), 356 - "regmap init failed\n"); 359 + if (IS_ERR(regmap)) 360 + return dev_err_probe(&pdev->dev, PTR_ERR(regmap), 361 + "regmap init failed\n"); 362 + 363 + ret = of_syscon_register_regmap(dev->of_node, regmap); 364 + if (ret) 365 + return ret; 366 + } else { 367 + /* let syscon create mmio regmap */ 368 + regmap = syscon_node_to_regmap(dev->of_node); 369 + if (IS_ERR(regmap)) 370 + return dev_err_probe(&pdev->dev, PTR_ERR(regmap), 371 + "syscon_node_to_regmap failed\n"); 372 + } 357 373 358 374 pmu_context->pmureg = regmap; 359 375 pmu_context->dev = dev;
+8
include/linux/mfd/syscon.h
··· 28 28 unsigned int *out_args); 29 29 struct regmap *syscon_regmap_lookup_by_phandle_optional(struct device_node *np, 30 30 const char *property); 31 + int of_syscon_register_regmap(struct device_node *np, 32 + struct regmap *regmap); 31 33 #else 32 34 static inline struct regmap *device_node_to_regmap(struct device_node *np) 33 35 { ··· 67 65 const char *property) 68 66 { 69 67 return NULL; 68 + } 69 + 70 + static inline int of_syscon_register_regmap(struct device_node *np, 71 + struct regmap *regmap) 72 + { 73 + return -EOPNOTSUPP; 70 74 } 71 75 72 76 #endif