Lines Matching +full:30 +full:- +full:35

1 // SPDX-License-Identifier: GPL-2.0-only
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)
66 #define RPM_NOTIFICATION BIT(30)
75 [QCOM_RPM_DAYTONA_FABRIC_CLK] = { 30, 14, 11, 1 },
80 [QCOM_RPM_APPS_FABRIC_HALT] = { 35, 19, 18, 1 },
87 [QCOM_RPM_SYS_FABRIC_ARB] = { 59, 26, 25, 30 },
91 [QCOM_RPM_MM_FABRIC_ARB] = { 95, 30, 29, 21 },
92 [QCOM_RPM_PM8921_SMPS1] = { 116, 31, 30, 2 },
94 [QCOM_RPM_PM8921_SMPS3] = { 120, 35, 32, 2 },
97 [QCOM_RPM_PM8921_SMPS6] = { 126, 41, 35, 2 },
166 [QCOM_RPM_APPS_FABRIC_CLK] = { 35, 15, 8, 1 },
180 [QCOM_RPM_SYS_FABRIC_MODE] = { 65, 30, 23, 3 },
185 [QCOM_RPM_PM8901_SMPS0] = { 134, 37, 30, 2 },
190 [QCOM_RPM_PM8901_LDO0] = { 144, 47, 35, 2 },
257 [QCOM_RPM_DAYTONA_FABRIC_CLK] = { 30, 14, 11, 1 },
262 [QCOM_RPM_APPS_FABRIC_HALT] = { 35, 19, 18, 1 },
273 [QCOM_RPM_MM_FABRIC_ARB] = { 94, 30, 29, 23 },
274 [QCOM_RPM_PM8921_SMPS1] = { 117, 31, 30, 2 },
276 [QCOM_RPM_PM8921_SMPS3] = { 121, 35, 32, 2 },
279 [QCOM_RPM_PM8921_SMPS6] = { 127, 41, 35, 2 },
345 [QCOM_RPM_DAYTONA_FABRIC_CLK] = { 30, 14, 11, 1 },
350 [QCOM_RPM_APPS_FABRIC_HALT] = { 35, 19, 18, 2 },
357 [QCOM_RPM_SYS_FABRIC_ARB] = { 59, 26, 25, 30 },
361 [QCOM_RPM_MM_FABRIC_ARB] = { 95, 30, 29, 2 },
364 [QCOM_RPM_HDMI_SWITCH] = { 211, 35, 33, 1 },
391 [QCOM_RPM_EBI1_CLK] = { 30, 14, 16, 1 },
396 [QCOM_RPM_PM8018_SMPS1] = { 64, 19, 30, 2 },
401 [QCOM_RPM_PM8018_LDO1] = { 74, 29, 35, 2 },
404 [QCOM_RPM_PM8018_LDO4] = { 80, 35, 38, 2 },
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 },
451 const struct qcom_rpm_data *data = rpm->data; in qcom_rpm_write()
457 if (WARN_ON(resource < 0 || resource >= data->n_resources)) in qcom_rpm_write()
458 return -EINVAL; in qcom_rpm_write()
460 res = &data->resource_table[resource]; in qcom_rpm_write()
461 if (WARN_ON(res->size != count)) in qcom_rpm_write()
462 return -EINVAL; in qcom_rpm_write()
464 mutex_lock(&rpm->lock); in qcom_rpm_write()
466 for (i = 0; i < res->size; i++) in qcom_rpm_write()
467 writel_relaxed(buf[i], RPM_REQ_REG(rpm, res->target_id + i)); in qcom_rpm_write()
469 bitmap_set((unsigned long *)sel_mask, res->select_id, 1); in qcom_rpm_write()
470 for (i = 0; i < rpm->data->req_sel_size; i++) { in qcom_rpm_write()
472 RPM_CTRL_REG(rpm, rpm->data->req_sel_off + i)); in qcom_rpm_write()
475 writel_relaxed(BIT(state), RPM_CTRL_REG(rpm, rpm->data->req_ctx_off)); in qcom_rpm_write()
477 reinit_completion(&rpm->ack); in qcom_rpm_write()
478 regmap_write(rpm->ipc_regmap, rpm->ipc_offset, BIT(rpm->ipc_bit)); in qcom_rpm_write()
480 left = wait_for_completion_timeout(&rpm->ack, RPM_REQUEST_TIMEOUT); in qcom_rpm_write()
482 ret = -ETIMEDOUT; in qcom_rpm_write()
483 else if (rpm->ack_status & RPM_REJECTED) in qcom_rpm_write()
484 ret = -EIO; in qcom_rpm_write()
486 mutex_unlock(&rpm->lock); in qcom_rpm_write()
498 ack = readl_relaxed(RPM_CTRL_REG(rpm, rpm->data->ack_ctx_off)); in qcom_rpm_ack_interrupt()
499 for (i = 0; i < rpm->data->ack_sel_size; i++) in qcom_rpm_ack_interrupt()
501 RPM_CTRL_REG(rpm, rpm->data->ack_sel_off + i)); in qcom_rpm_ack_interrupt()
502 writel(0, RPM_CTRL_REG(rpm, rpm->data->ack_ctx_off)); in qcom_rpm_ack_interrupt()
505 dev_warn(rpm->dev, "ignoring notification!\n"); in qcom_rpm_ack_interrupt()
507 rpm->ack_status = ack; in qcom_rpm_ack_interrupt()
508 complete(&rpm->ack); in qcom_rpm_ack_interrupt()
518 regmap_write(rpm->ipc_regmap, rpm->ipc_offset, BIT(rpm->ipc_bit)); in qcom_rpm_err_interrupt()
519 dev_err(rpm->dev, "RPM triggered fatal error\n"); in qcom_rpm_err_interrupt()
540 rpm = devm_kzalloc(&pdev->dev, sizeof(*rpm), GFP_KERNEL); in qcom_rpm_probe()
542 return -ENOMEM; in qcom_rpm_probe()
544 rpm->dev = &pdev->dev; in qcom_rpm_probe()
545 mutex_init(&rpm->lock); in qcom_rpm_probe()
546 init_completion(&rpm->ack); in qcom_rpm_probe()
549 rpm->ramclk = devm_clk_get_enabled(&pdev->dev, "ram"); in qcom_rpm_probe()
550 if (IS_ERR(rpm->ramclk)) { in qcom_rpm_probe()
551 ret = PTR_ERR(rpm->ramclk); in qcom_rpm_probe()
552 if (ret == -EPROBE_DEFER) in qcom_rpm_probe()
558 rpm->ramclk = NULL; in qcom_rpm_probe()
573 match = of_match_device(qcom_rpm_of_match, &pdev->dev); in qcom_rpm_probe()
575 return -ENODEV; in qcom_rpm_probe()
576 rpm->data = match->data; in qcom_rpm_probe()
578 rpm->status_regs = devm_platform_get_and_ioremap_resource(pdev, 0, NULL); in qcom_rpm_probe()
579 if (IS_ERR(rpm->status_regs)) in qcom_rpm_probe()
580 return PTR_ERR(rpm->status_regs); in qcom_rpm_probe()
581 rpm->ctrl_regs = rpm->status_regs + 0x400; in qcom_rpm_probe()
582 rpm->req_regs = rpm->status_regs + 0x600; in qcom_rpm_probe()
584 syscon_np = of_parse_phandle(pdev->dev.of_node, "qcom,ipc", 0); in qcom_rpm_probe()
586 dev_err(&pdev->dev, "no qcom,ipc node\n"); in qcom_rpm_probe()
587 return -ENODEV; in qcom_rpm_probe()
590 rpm->ipc_regmap = syscon_node_to_regmap(syscon_np); in qcom_rpm_probe()
592 if (IS_ERR(rpm->ipc_regmap)) in qcom_rpm_probe()
593 return PTR_ERR(rpm->ipc_regmap); in qcom_rpm_probe()
595 ret = of_property_read_u32_index(pdev->dev.of_node, "qcom,ipc", 1, in qcom_rpm_probe()
596 &rpm->ipc_offset); in qcom_rpm_probe()
598 dev_err(&pdev->dev, "no offset in qcom,ipc\n"); in qcom_rpm_probe()
599 return -EINVAL; in qcom_rpm_probe()
602 ret = of_property_read_u32_index(pdev->dev.of_node, "qcom,ipc", 2, in qcom_rpm_probe()
603 &rpm->ipc_bit); in qcom_rpm_probe()
605 dev_err(&pdev->dev, "no bit in qcom,ipc\n"); in qcom_rpm_probe()
606 return -EINVAL; in qcom_rpm_probe()
609 dev_set_drvdata(&pdev->dev, rpm); in qcom_rpm_probe()
614 if (fw_version[0] != rpm->data->version) { in qcom_rpm_probe()
615 dev_err(&pdev->dev, in qcom_rpm_probe()
620 rpm->data->version); in qcom_rpm_probe()
621 return -EFAULT; in qcom_rpm_probe()
628 dev_info(&pdev->dev, "RPM firmware %u.%u.%u\n", fw_version[0], in qcom_rpm_probe()
632 ret = devm_request_irq(&pdev->dev, in qcom_rpm_probe()
639 dev_err(&pdev->dev, "failed to request ack interrupt\n"); in qcom_rpm_probe()
645 dev_warn(&pdev->dev, "failed to mark ack irq as wakeup\n"); in qcom_rpm_probe()
647 ret = devm_request_irq(&pdev->dev, in qcom_rpm_probe()
654 dev_err(&pdev->dev, "failed to request err interrupt\n"); in qcom_rpm_probe()
658 ret = devm_request_irq(&pdev->dev, in qcom_rpm_probe()
665 dev_err(&pdev->dev, "failed to request wakeup interrupt\n"); in qcom_rpm_probe()
671 dev_warn(&pdev->dev, "failed to mark wakeup irq as wakeup\n"); in qcom_rpm_probe()
673 return devm_of_platform_populate(&pdev->dev); in qcom_rpm_probe()