Lines Matching refs:rpm
18 #include <dt-bindings/mfd/qcom-rpm.h>
58 #define RPM_STATUS_REG(rpm, i) ((rpm)->status_regs + (i) * 4)
59 #define RPM_CTRL_REG(rpm, i) ((rpm)->ctrl_regs + (i) * 4)
60 #define RPM_REQ_REG(rpm, i) ((rpm)->req_regs + (i) * 4)
436 { .compatible = "qcom,rpm-apq8064", .data = &apq8064_template },
437 { .compatible = "qcom,rpm-msm8660", .data = &msm8660_template },
438 { .compatible = "qcom,rpm-msm8960", .data = &msm8960_template },
439 { .compatible = "qcom,rpm-ipq8064", .data = &ipq806x_template },
440 { .compatible = "qcom,rpm-mdm9615", .data = &mdm9615_template },
445 int qcom_rpm_write(struct qcom_rpm *rpm,
451 const struct qcom_rpm_data *data = rpm->data;
464 mutex_lock(&rpm->lock);
467 writel_relaxed(buf[i], RPM_REQ_REG(rpm, res->target_id + i));
470 for (i = 0; i < rpm->data->req_sel_size; i++) {
472 RPM_CTRL_REG(rpm, rpm->data->req_sel_off + i));
475 writel_relaxed(BIT(state), RPM_CTRL_REG(rpm, rpm->data->req_ctx_off));
477 reinit_completion(&rpm->ack);
478 regmap_write(rpm->ipc_regmap, rpm->ipc_offset, BIT(rpm->ipc_bit));
480 left = wait_for_completion_timeout(&rpm->ack, RPM_REQUEST_TIMEOUT);
483 else if (rpm->ack_status & RPM_REJECTED)
486 mutex_unlock(&rpm->lock);
494 struct qcom_rpm *rpm = dev;
498 ack = readl_relaxed(RPM_CTRL_REG(rpm, rpm->data->ack_ctx_off));
499 for (i = 0; i < rpm->data->ack_sel_size; i++)
501 RPM_CTRL_REG(rpm, rpm->data->ack_sel_off + i));
502 writel(0, RPM_CTRL_REG(rpm, rpm->data->ack_ctx_off));
505 dev_warn(rpm->dev, "ignoring notification!\n");
507 rpm->ack_status = ack;
508 complete(&rpm->ack);
516 struct qcom_rpm *rpm = dev;
518 regmap_write(rpm->ipc_regmap, rpm->ipc_offset, BIT(rpm->ipc_bit));
519 dev_err(rpm->dev, "RPM triggered fatal error\n");
533 struct qcom_rpm *rpm;
540 rpm = devm_kzalloc(&pdev->dev, sizeof(*rpm), GFP_KERNEL);
541 if (!rpm)
544 rpm->dev = &pdev->dev;
545 mutex_init(&rpm->lock);
546 init_completion(&rpm->ack);
549 rpm->ramclk = devm_clk_get_enabled(&pdev->dev, "ram");
550 if (IS_ERR(rpm->ramclk)) {
551 ret = PTR_ERR(rpm->ramclk);
558 rpm->ramclk = NULL;
576 rpm->data = match->data;
578 rpm->status_regs = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
579 if (IS_ERR(rpm->status_regs))
580 return PTR_ERR(rpm->status_regs);
581 rpm->ctrl_regs = rpm->status_regs + 0x400;
582 rpm->req_regs = rpm->status_regs + 0x600;
590 rpm->ipc_regmap = syscon_node_to_regmap(syscon_np);
592 if (IS_ERR(rpm->ipc_regmap))
593 return PTR_ERR(rpm->ipc_regmap);
596 &rpm->ipc_offset);
603 &rpm->ipc_bit);
609 dev_set_drvdata(&pdev->dev, rpm);
611 fw_version[0] = readl(RPM_STATUS_REG(rpm, 0));
612 fw_version[1] = readl(RPM_STATUS_REG(rpm, 1));
613 fw_version[2] = readl(RPM_STATUS_REG(rpm, 2));
614 if (fw_version[0] != rpm->data->version) {
620 rpm->data->version);
624 writel(fw_version[0], RPM_CTRL_REG(rpm, 0));
625 writel(fw_version[1], RPM_CTRL_REG(rpm, 1));
626 writel(fw_version[2], RPM_CTRL_REG(rpm, 2));
637 rpm);
652 rpm);
663 rpm);