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

soc: qcom: ocmem: make iface clock optional

Some platforms such as msm8226 do not have an iface clk. Since clk_bulk
APIs don't offer to a way to treat some clocks as optional simply add
core_clk and iface_clk members to our drvdata.

Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Signed-off-by: Luca Weiss <luca@z3ntu.xyz>
Link: https://lore.kernel.org/r/20230506-msm8226-ocmem-v3-3-79da95a2581f@z3ntu.xyz
Signed-off-by: Bjorn Andersson <andersson@kernel.org>

authored by

Luca Weiss and committed by
Bjorn Andersson
a7e12e7b 7a2fcba1

+24 -18
+24 -18
drivers/soc/qcom/ocmem.c
··· 54 54 const struct ocmem_config *config; 55 55 struct resource *memory; 56 56 void __iomem *mmio; 57 + struct clk *core_clk; 58 + struct clk *iface_clk; 57 59 unsigned int num_ports; 58 60 unsigned int num_macros; 59 61 bool interleaved; ··· 96 94 #define OCMEM_PSGSC_CTL_MACRO1_MODE(val) FIELD_PREP(0x00000070, (val)) 97 95 #define OCMEM_PSGSC_CTL_MACRO2_MODE(val) FIELD_PREP(0x00000700, (val)) 98 96 #define OCMEM_PSGSC_CTL_MACRO3_MODE(val) FIELD_PREP(0x00007000, (val)) 99 - 100 - #define OCMEM_CLK_CORE_IDX 0 101 - static struct clk_bulk_data ocmem_clks[] = { 102 - { 103 - .id = "core", 104 - }, 105 - { 106 - .id = "iface", 107 - }, 108 - }; 109 97 110 98 static inline void ocmem_write(struct ocmem *ocmem, u32 reg, u32 data) 111 99 { ··· 312 320 ocmem->dev = dev; 313 321 ocmem->config = device_get_match_data(dev); 314 322 315 - ret = devm_clk_bulk_get(dev, ARRAY_SIZE(ocmem_clks), ocmem_clks); 316 - if (ret) 317 - return dev_err_probe(dev, ret, "Unable to get clocks\n"); 323 + ocmem->core_clk = devm_clk_get(dev, "core"); 324 + if (IS_ERR(ocmem->core_clk)) 325 + return dev_err_probe(dev, PTR_ERR(ocmem->core_clk), 326 + "Unable to get core clock\n"); 327 + 328 + ocmem->iface_clk = devm_clk_get_optional(dev, "iface"); 329 + if (IS_ERR(ocmem->iface_clk)) 330 + return dev_err_probe(dev, PTR_ERR(ocmem->iface_clk), 331 + "Unable to get iface clock\n"); 318 332 319 333 ocmem->mmio = devm_platform_ioremap_resource_byname(pdev, "ctrl"); 320 334 if (IS_ERR(ocmem->mmio)) ··· 335 337 } 336 338 337 339 /* The core clock is synchronous with graphics */ 338 - WARN_ON(clk_set_rate(ocmem_clks[OCMEM_CLK_CORE_IDX].clk, 1000) < 0); 340 + WARN_ON(clk_set_rate(ocmem->core_clk, 1000) < 0); 339 341 340 - ret = clk_bulk_prepare_enable(ARRAY_SIZE(ocmem_clks), ocmem_clks); 342 + ret = clk_prepare_enable(ocmem->core_clk); 341 343 if (ret) 342 - return dev_err_probe(ocmem->dev, ret, "Failed to enable clocks\n"); 344 + return dev_err_probe(ocmem->dev, ret, "Failed to enable core clock\n"); 345 + 346 + ret = clk_prepare_enable(ocmem->iface_clk); 347 + if (ret) 348 + return dev_err_probe(ocmem->dev, ret, "Failed to enable iface clock\n"); 343 349 344 350 if (qcom_scm_restore_sec_cfg_available()) { 345 351 dev_dbg(dev, "configuring scm\n"); ··· 408 406 return 0; 409 407 410 408 err_clk_disable: 411 - clk_bulk_disable_unprepare(ARRAY_SIZE(ocmem_clks), ocmem_clks); 409 + clk_disable_unprepare(ocmem->core_clk); 410 + clk_disable_unprepare(ocmem->iface_clk); 412 411 return ret; 413 412 } 414 413 415 414 static int ocmem_dev_remove(struct platform_device *pdev) 416 415 { 417 - clk_bulk_disable_unprepare(ARRAY_SIZE(ocmem_clks), ocmem_clks); 416 + struct ocmem *ocmem = platform_get_drvdata(pdev); 417 + 418 + clk_disable_unprepare(ocmem->core_clk); 419 + clk_disable_unprepare(ocmem->iface_clk); 418 420 419 421 return 0; 420 422 }