Lines Matching +full:msm8976 +full:- +full:ramp +full:- +full:controller
1 // SPDX-License-Identifier: GPL-2.0
3 * Qualcomm Ramp Controller driver
32 * struct qcom_ramp_controller_desc - SoC specific parameters
36 * @cfg_ramp_en: Ramp Controller enable sequence
37 * @cfg_ramp_dis: Ramp Controller disable sequence
60 * struct qcom_ramp_controller - Main driver structure
70 * rc_wait_for_update() - Wait for Ramp Controller root update
77 const struct qcom_ramp_controller_desc *d = qrc->desc; in rc_wait_for_update()
78 struct regmap *r = qrc->regmap; in rc_wait_for_update()
82 ret = regmap_set_bits(r, d->cmd_reg, RC_ROOT_EN); in rc_wait_for_update()
86 return regmap_read_poll_timeout(r, d->cmd_reg, val, !(val & RC_UPDATE_EN), in rc_wait_for_update()
91 * rc_set_cfg_update() - Ramp Controller configuration update
99 const struct qcom_ramp_controller_desc *d = qrc->desc; in rc_set_cfg_update()
100 struct regmap *r = qrc->regmap; in rc_set_cfg_update()
104 /* The ack bit is between bits 16-31 of RC_REG_CFG_UPDATE */ in rc_set_cfg_update()
108 ret = regmap_set_bits(r, d->cmd_reg + RC_REG_CFG_UPDATE, ce); in rc_set_cfg_update()
113 ret = regmap_set_bits(r, d->cmd_reg + RC_REG_CFG_UPDATE, RC_CFG_UPDATE_EN); in rc_set_cfg_update()
118 ret = regmap_read_poll_timeout(r, d->cmd_reg + RC_REG_CFG_UPDATE, val, in rc_set_cfg_update()
126 * to do that manually in order to leave the ramp controller in a in rc_set_cfg_update()
129 ret = regmap_write(r, d->cmd_reg + RC_REG_CFG_UPDATE, 0); in rc_set_cfg_update()
134 return regmap_read_poll_timeout(r, d->cmd_reg + RC_REG_CFG_UPDATE, in rc_set_cfg_update()
140 * rc_write_cfg - Send configuration sequence
155 /* Check if, and wait until the ramp controller is ready */ in rc_write_cfg()
161 ret = regmap_multi_reg_write(qrc->regmap, seq, nsids); in rc_write_cfg()
167 ret = rc_set_cfg_update(qrc, (u8)ce - i); in rc_write_cfg()
176 * rc_ramp_ctrl_enable() - Enable Ramp up/down Control
183 const struct qcom_ramp_controller_desc *d = qrc->desc; in rc_ramp_ctrl_enable()
186 for (i = 0; i < d->num_ramp_en; i++) { in rc_ramp_ctrl_enable()
187 ret = rc_write_cfg(qrc, &d->cfg_ramp_en[i], RC_DCVS_CFG_SID, 1); in rc_ramp_ctrl_enable()
196 * qcom_ramp_controller_start() - Initialize and start the ramp controller
199 * The Ramp Controller needs to be initialized by programming the relevant
200 * registers with SoC-specific configuration: once programming is done,
207 const struct qcom_ramp_controller_desc *d = qrc->desc; in qcom_ramp_controller_start()
211 ret = rc_write_cfg(qrc, d->cfg_lmh_sid, RC_LMH_SID, d->num_lmh_sids); in qcom_ramp_controller_start()
215 ret = rc_write_cfg(qrc, d->cfg_dfs_sid, RC_DFS_SID, d->num_dfs_sids); in qcom_ramp_controller_start()
219 ret = rc_write_cfg(qrc, d->cfg_link_sid, RC_LINK_SID, d->num_link_sids); in qcom_ramp_controller_start()
223 /* Everything is ready! Enable the ramp up/down control */ in qcom_ramp_controller_start()
294 qrc = devm_kmalloc(&pdev->dev, sizeof(*qrc), GFP_KERNEL); in qcom_ramp_controller_probe()
296 return -ENOMEM; in qcom_ramp_controller_probe()
298 qrc->desc = device_get_match_data(&pdev->dev); in qcom_ramp_controller_probe()
299 if (!qrc->desc) in qcom_ramp_controller_probe()
300 return -EINVAL; in qcom_ramp_controller_probe()
302 qrc->regmap = devm_regmap_init_mmio(&pdev->dev, base, &qrc_regmap_config); in qcom_ramp_controller_probe()
303 if (IS_ERR(qrc->regmap)) in qcom_ramp_controller_probe()
304 return PTR_ERR(qrc->regmap); in qcom_ramp_controller_probe()
316 ret = rc_write_cfg(qrc, qrc->desc->cfg_ramp_dis, in qcom_ramp_controller_remove()
317 RC_DCVS_CFG_SID, qrc->desc->num_ramp_dis); in qcom_ramp_controller_remove()
319 dev_err(&pdev->dev, "Failed to send disable sequence\n"); in qcom_ramp_controller_remove()
323 { .compatible = "qcom,msm8976-ramp-controller", .data = &msm8976_rc_cfg },
330 .name = "qcom-ramp-controller",
345 MODULE_DESCRIPTION("Qualcomm Ramp Controller driver");