1*c8754c7dSAlexander Sverdlin // SPDX-License-Identifier: GPL-2.0 2*c8754c7dSAlexander Sverdlin /* 3*c8754c7dSAlexander Sverdlin * Driver for Sophgo CV1800 series SoC RTC subsystem 4*c8754c7dSAlexander Sverdlin * 5*c8754c7dSAlexander Sverdlin * The RTC module comprises a 32kHz oscillator, Power-on-Reset (PoR) sub-module, 6*c8754c7dSAlexander Sverdlin * HW state machine to control chip power-on, power-off and reset. Furthermore, 7*c8754c7dSAlexander Sverdlin * the 8051 subsystem is located within RTCSYS including associated SRAM block. 8*c8754c7dSAlexander Sverdlin * 9*c8754c7dSAlexander Sverdlin * Copyright (C) 2025 Alexander Sverdlin <alexander.sverdlin@gmail.com> 10*c8754c7dSAlexander Sverdlin * 11*c8754c7dSAlexander Sverdlin */ 12*c8754c7dSAlexander Sverdlin 13*c8754c7dSAlexander Sverdlin #include <linux/mfd/core.h> 14*c8754c7dSAlexander Sverdlin #include <linux/module.h> 15*c8754c7dSAlexander Sverdlin #include <linux/of.h> 16*c8754c7dSAlexander Sverdlin #include <linux/property.h> 17*c8754c7dSAlexander Sverdlin 18*c8754c7dSAlexander Sverdlin static struct resource cv1800_rtcsys_irq_resources[] = { 19*c8754c7dSAlexander Sverdlin DEFINE_RES_IRQ_NAMED(0, "alarm"), 20*c8754c7dSAlexander Sverdlin }; 21*c8754c7dSAlexander Sverdlin 22*c8754c7dSAlexander Sverdlin static const struct mfd_cell cv1800_rtcsys_subdev[] = { 23*c8754c7dSAlexander Sverdlin { 24*c8754c7dSAlexander Sverdlin .name = "cv1800b-rtc", 25*c8754c7dSAlexander Sverdlin .num_resources = 1, 26*c8754c7dSAlexander Sverdlin .resources = &cv1800_rtcsys_irq_resources[0], 27*c8754c7dSAlexander Sverdlin }, 28*c8754c7dSAlexander Sverdlin }; 29*c8754c7dSAlexander Sverdlin 30*c8754c7dSAlexander Sverdlin static int cv1800_rtcsys_probe(struct platform_device *pdev) 31*c8754c7dSAlexander Sverdlin { 32*c8754c7dSAlexander Sverdlin int irq; 33*c8754c7dSAlexander Sverdlin 34*c8754c7dSAlexander Sverdlin irq = platform_get_irq_byname(pdev, "alarm"); 35*c8754c7dSAlexander Sverdlin if (irq < 0) 36*c8754c7dSAlexander Sverdlin return irq; 37*c8754c7dSAlexander Sverdlin cv1800_rtcsys_irq_resources[0].start = irq; 38*c8754c7dSAlexander Sverdlin cv1800_rtcsys_irq_resources[0].end = irq; 39*c8754c7dSAlexander Sverdlin 40*c8754c7dSAlexander Sverdlin return devm_mfd_add_devices(&pdev->dev, PLATFORM_DEVID_AUTO, 41*c8754c7dSAlexander Sverdlin cv1800_rtcsys_subdev, 42*c8754c7dSAlexander Sverdlin ARRAY_SIZE(cv1800_rtcsys_subdev), 43*c8754c7dSAlexander Sverdlin NULL, 0, NULL); 44*c8754c7dSAlexander Sverdlin } 45*c8754c7dSAlexander Sverdlin 46*c8754c7dSAlexander Sverdlin static const struct of_device_id cv1800_rtcsys_of_match[] = { 47*c8754c7dSAlexander Sverdlin { .compatible = "sophgo,cv1800b-rtc" }, 48*c8754c7dSAlexander Sverdlin { /* sentinel */ } 49*c8754c7dSAlexander Sverdlin }; 50*c8754c7dSAlexander Sverdlin MODULE_DEVICE_TABLE(of, cv1800_rtcsys_of_match); 51*c8754c7dSAlexander Sverdlin 52*c8754c7dSAlexander Sverdlin static struct platform_driver cv1800_rtcsys_mfd = { 53*c8754c7dSAlexander Sverdlin .probe = cv1800_rtcsys_probe, 54*c8754c7dSAlexander Sverdlin .driver = { 55*c8754c7dSAlexander Sverdlin .name = "cv1800_rtcsys", 56*c8754c7dSAlexander Sverdlin .of_match_table = cv1800_rtcsys_of_match, 57*c8754c7dSAlexander Sverdlin }, 58*c8754c7dSAlexander Sverdlin }; 59*c8754c7dSAlexander Sverdlin module_platform_driver(cv1800_rtcsys_mfd); 60*c8754c7dSAlexander Sverdlin 61*c8754c7dSAlexander Sverdlin MODULE_AUTHOR("Alexander Sverdlin <alexander.sverdlin@gmail.com>"); 62*c8754c7dSAlexander Sverdlin MODULE_DESCRIPTION("Sophgo CV1800 series SoC RTC subsystem driver"); 63*c8754c7dSAlexander Sverdlin MODULE_LICENSE("GPL"); 64