Commit 015b70bd authored by Jonathan Marek's avatar Jonathan Marek Committed by Alexandre Belloni
Browse files

rtc: pm8xxx: implement qcom,no-alarm flag for non-HLOS owned alarm



Qualcomm x1e80100 firmware sets the ownership of the RTC alarm to ADSP.
Thus writing to RTC alarm registers and receiving alarm interrupts is not
possible.

Add a qcom,no-alarm flag to support RTC on this platform.

Signed-off-by: default avatarJonathan Marek <jonathan@marek.ca>
Link: https://lore.kernel.org/r/20241015004945.3676-2-jonathan@marek.ca


[ johan: drop no_alarm flag and restructure probe() ]
Tested-by: default avatarJens Glathe <jens.glathe@oldschoolsolutions.biz>
Tested-by: default avatarSteev Klimaszewski <steev@kali.org>
Tested-by: default avatarJoel Stanley <joel@jms.id.au>
Tested-by: Sebastian Reichel <sre@kernel.org> # Lenovo T14s Gen6
Signed-off-by: default avatarJohan Hovold <johan+linaro@kernel.org>
Link: https://lore.kernel.org/r/20250219134118.31017-5-johan+linaro@kernel.org


Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
parent e853658d
Loading
Loading
Loading
Loading
+20 −14
Original line number Diff line number Diff line
@@ -606,9 +606,11 @@ static int pm8xxx_rtc_probe(struct platform_device *pdev)
	if (!rtc_dd->regmap)
		return -ENXIO;

	if (!of_property_read_bool(pdev->dev.of_node, "qcom,no-alarm")) {
		rtc_dd->alarm_irq = platform_get_irq(pdev, 0);
		if (rtc_dd->alarm_irq < 0)
			return -ENXIO;
	}

	rtc_dd->allow_set_time = of_property_read_bool(pdev->dev.of_node,
						      "allow-set-time");
@@ -624,8 +626,6 @@ static int pm8xxx_rtc_probe(struct platform_device *pdev)

	platform_set_drvdata(pdev, rtc_dd);

	devm_device_init_wakeup(&pdev->dev);

	rtc_dd->rtc = devm_rtc_allocate_device(&pdev->dev);
	if (IS_ERR(rtc_dd->rtc))
		return PTR_ERR(rtc_dd->rtc);
@@ -633,6 +633,7 @@ static int pm8xxx_rtc_probe(struct platform_device *pdev)
	rtc_dd->rtc->ops = &pm8xxx_rtc_ops;
	rtc_dd->rtc->range_max = U32_MAX;

	if (rtc_dd->alarm_irq) {
		rc = devm_request_any_context_irq(&pdev->dev, rtc_dd->alarm_irq,
						  pm8xxx_alarm_trigger,
						  IRQF_TRIGGER_RISING,
@@ -644,6 +645,11 @@ static int pm8xxx_rtc_probe(struct platform_device *pdev)
		if (rc)
			return rc;

		devm_device_init_wakeup(&pdev->dev);
	} else {
		clear_bit(RTC_FEATURE_ALARM, rtc_dd->rtc->features);
	}

	return devm_rtc_register_device(rtc_dd->rtc);
}