Lines Matching +full:ssc +full:- +full:block +full:- +full:bus

1 // SPDX-License-Identifier: GPL-2.0-only
68 ret = clk_prepare_enable(data->xo_clk); in qcom_ssc_block_bus_init()
74 ret = clk_prepare_enable(data->aggre2_clk); in qcom_ssc_block_bus_init()
80 ret = clk_prepare_enable(data->gcc_im_sleep_clk); in qcom_ssc_block_bus_init()
90 reg32_clear_bits(data->reg_mpm_sscaon_config0, in qcom_ssc_block_bus_init()
93 reg32_clear_bits(data->reg_mpm_sscaon_config1, BIT(31)); in qcom_ssc_block_bus_init()
95 ret = clk_prepare_enable(data->aggre2_north_clk); in qcom_ssc_block_bus_init()
101 ret = reset_control_deassert(data->ssc_reset); in qcom_ssc_block_bus_init()
107 ret = reset_control_deassert(data->ssc_bcr); in qcom_ssc_block_bus_init()
113 regmap_write(data->halt_map, data->ssc_axi_halt + AXI_HALTREQ_REG, 0); in qcom_ssc_block_bus_init()
115 ret = clk_prepare_enable(data->ssc_xo_clk); in qcom_ssc_block_bus_init()
121 ret = clk_prepare_enable(data->ssc_ahbs_clk); in qcom_ssc_block_bus_init()
130 clk_disable(data->ssc_xo_clk); in qcom_ssc_block_bus_init()
133 regmap_write(data->halt_map, data->ssc_axi_halt + AXI_HALTREQ_REG, 1); in qcom_ssc_block_bus_init()
135 reset_control_assert(data->ssc_bcr); in qcom_ssc_block_bus_init()
138 reset_control_assert(data->ssc_reset); in qcom_ssc_block_bus_init()
141 clk_disable(data->aggre2_north_clk); in qcom_ssc_block_bus_init()
144 reg32_set_bits(data->reg_mpm_sscaon_config0, BIT(4) | BIT(5)); in qcom_ssc_block_bus_init()
145 reg32_set_bits(data->reg_mpm_sscaon_config1, BIT(31)); in qcom_ssc_block_bus_init()
147 clk_disable(data->gcc_im_sleep_clk); in qcom_ssc_block_bus_init()
150 clk_disable(data->aggre2_clk); in qcom_ssc_block_bus_init()
153 clk_disable(data->xo_clk); in qcom_ssc_block_bus_init()
165 clk_disable(data->ssc_xo_clk); in qcom_ssc_block_bus_deinit()
166 clk_disable(data->ssc_ahbs_clk); in qcom_ssc_block_bus_deinit()
168 ret = reset_control_assert(data->ssc_bcr); in qcom_ssc_block_bus_deinit()
172 regmap_write(data->halt_map, data->ssc_axi_halt + AXI_HALTREQ_REG, 1); in qcom_ssc_block_bus_deinit()
174 reg32_set_bits(data->reg_mpm_sscaon_config1, BIT(31)); in qcom_ssc_block_bus_deinit()
175 reg32_set_bits(data->reg_mpm_sscaon_config0, BIT(4) | BIT(5)); in qcom_ssc_block_bus_deinit()
177 ret = reset_control_assert(data->ssc_reset); in qcom_ssc_block_bus_deinit()
181 clk_disable(data->gcc_im_sleep_clk); in qcom_ssc_block_bus_deinit()
183 clk_disable(data->aggre2_north_clk); in qcom_ssc_block_bus_deinit()
185 clk_disable(data->aggre2_clk); in qcom_ssc_block_bus_deinit()
186 clk_disable(data->xo_clk); in qcom_ssc_block_bus_deinit()
198 ret = PTR_ERR(pds[i]) ? : -ENODATA; in qcom_ssc_block_bus_pds_attach()
206 for (i--; i >= 0; i--) in qcom_ssc_block_bus_pds_attach()
235 for (i--; i >= 0; i--) { in qcom_ssc_block_bus_pds_enable()
256 struct device_node *np = pdev->dev.of_node; in qcom_ssc_block_bus_probe()
261 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in qcom_ssc_block_bus_probe()
263 return -ENOMEM; in qcom_ssc_block_bus_probe()
269 data->reg_mpm_sscaon_config0 = devm_ioremap_resource(&pdev->dev, res); in qcom_ssc_block_bus_probe()
270 if (IS_ERR(data->reg_mpm_sscaon_config0)) in qcom_ssc_block_bus_probe()
271 return dev_err_probe(&pdev->dev, PTR_ERR(data->reg_mpm_sscaon_config0), in qcom_ssc_block_bus_probe()
275 data->reg_mpm_sscaon_config1 = devm_ioremap_resource(&pdev->dev, res); in qcom_ssc_block_bus_probe()
276 if (IS_ERR(data->reg_mpm_sscaon_config1)) in qcom_ssc_block_bus_probe()
277 return dev_err_probe(&pdev->dev, PTR_ERR(data->reg_mpm_sscaon_config1), in qcom_ssc_block_bus_probe()
281 data->ssc_bcr = devm_reset_control_get_exclusive(&pdev->dev, "ssc_bcr"); in qcom_ssc_block_bus_probe()
282 if (IS_ERR(data->ssc_bcr)) in qcom_ssc_block_bus_probe()
283 return dev_err_probe(&pdev->dev, PTR_ERR(data->ssc_bcr), in qcom_ssc_block_bus_probe()
286 data->ssc_reset = devm_reset_control_get_exclusive(&pdev->dev, "ssc_reset"); in qcom_ssc_block_bus_probe()
287 if (IS_ERR(data->ssc_reset)) in qcom_ssc_block_bus_probe()
288 return dev_err_probe(&pdev->dev, PTR_ERR(data->ssc_reset), in qcom_ssc_block_bus_probe()
292 data->xo_clk = devm_clk_get(&pdev->dev, "xo"); in qcom_ssc_block_bus_probe()
293 if (IS_ERR(data->xo_clk)) in qcom_ssc_block_bus_probe()
294 return dev_err_probe(&pdev->dev, PTR_ERR(data->xo_clk), in qcom_ssc_block_bus_probe()
297 data->aggre2_clk = devm_clk_get(&pdev->dev, "aggre2"); in qcom_ssc_block_bus_probe()
298 if (IS_ERR(data->aggre2_clk)) in qcom_ssc_block_bus_probe()
299 return dev_err_probe(&pdev->dev, PTR_ERR(data->aggre2_clk), in qcom_ssc_block_bus_probe()
302 data->gcc_im_sleep_clk = devm_clk_get(&pdev->dev, "gcc_im_sleep"); in qcom_ssc_block_bus_probe()
303 if (IS_ERR(data->gcc_im_sleep_clk)) in qcom_ssc_block_bus_probe()
304 return dev_err_probe(&pdev->dev, PTR_ERR(data->gcc_im_sleep_clk), in qcom_ssc_block_bus_probe()
307 data->aggre2_north_clk = devm_clk_get(&pdev->dev, "aggre2_north"); in qcom_ssc_block_bus_probe()
308 if (IS_ERR(data->aggre2_north_clk)) in qcom_ssc_block_bus_probe()
309 return dev_err_probe(&pdev->dev, PTR_ERR(data->aggre2_north_clk), in qcom_ssc_block_bus_probe()
312 data->ssc_xo_clk = devm_clk_get(&pdev->dev, "ssc_xo"); in qcom_ssc_block_bus_probe()
313 if (IS_ERR(data->ssc_xo_clk)) in qcom_ssc_block_bus_probe()
314 return dev_err_probe(&pdev->dev, PTR_ERR(data->ssc_xo_clk), in qcom_ssc_block_bus_probe()
317 data->ssc_ahbs_clk = devm_clk_get(&pdev->dev, "ssc_ahbs"); in qcom_ssc_block_bus_probe()
318 if (IS_ERR(data->ssc_ahbs_clk)) in qcom_ssc_block_bus_probe()
319 return dev_err_probe(&pdev->dev, PTR_ERR(data->ssc_ahbs_clk), in qcom_ssc_block_bus_probe()
322 ret = of_parse_phandle_with_fixed_args(pdev->dev.of_node, "qcom,halt-regs", 1, 0, in qcom_ssc_block_bus_probe()
325 return dev_err_probe(&pdev->dev, ret, "Failed to parse qcom,halt-regs\n"); in qcom_ssc_block_bus_probe()
327 data->halt_map = syscon_node_to_regmap(halt_args.np); in qcom_ssc_block_bus_probe()
329 if (IS_ERR(data->halt_map)) in qcom_ssc_block_bus_probe()
330 return PTR_ERR(data->halt_map); in qcom_ssc_block_bus_probe()
332 data->ssc_axi_halt = halt_args.args[0]; in qcom_ssc_block_bus_probe()
335 data->pd_names = qcom_ssc_block_pd_names; in qcom_ssc_block_bus_probe()
336 data->num_pds = ARRAY_SIZE(qcom_ssc_block_pd_names); in qcom_ssc_block_bus_probe()
338 ret = qcom_ssc_block_bus_pds_attach(&pdev->dev, data->pds, data->pd_names, data->num_pds); in qcom_ssc_block_bus_probe()
340 return dev_err_probe(&pdev->dev, ret, "error when attaching power domains\n"); in qcom_ssc_block_bus_probe()
342 ret = qcom_ssc_block_bus_pds_enable(data->pds, data->num_pds); in qcom_ssc_block_bus_probe()
344 dev_err_probe(&pdev->dev, ret, "error when enabling power domains\n"); in qcom_ssc_block_bus_probe()
348 qcom_ssc_block_bus_init(&pdev->dev); in qcom_ssc_block_bus_probe()
350 of_platform_populate(np, NULL, NULL, &pdev->dev); in qcom_ssc_block_bus_probe()
355 qcom_ssc_block_bus_pds_detach(&pdev->dev, data->pds, data->num_pds); in qcom_ssc_block_bus_probe()
364 qcom_ssc_block_bus_deinit(&pdev->dev); in qcom_ssc_block_bus_remove()
366 qcom_ssc_block_bus_pds_disable(data->pds, data->num_pds); in qcom_ssc_block_bus_remove()
367 qcom_ssc_block_bus_pds_detach(&pdev->dev, data->pds, data->num_pds); in qcom_ssc_block_bus_remove()
368 pm_runtime_disable(&pdev->dev); in qcom_ssc_block_bus_remove()
369 pm_clk_destroy(&pdev->dev); in qcom_ssc_block_bus_remove()
373 { .compatible = "qcom,ssc-block-bus", },
382 .name = "qcom-ssc-block-bus",
389 MODULE_DESCRIPTION("A driver for handling the init sequence needed for accessing the SSC block on (…